358 lines
15 KiB
Lua
358 lines
15 KiB
Lua
--[[
|
|
Copyright (c) The OpenRA Developers and Contributors
|
|
This file is part of OpenRA, which is free software. It is made
|
|
available to you under the terms of the GNU General Public License
|
|
as published by the Free Software Foundation, either version 3 of
|
|
the License, or (at your option) any later version. For more
|
|
information, see COPYING.
|
|
]]
|
|
-- Unit Groups Setup
|
|
SuperTeam = { "zkoi", "volk" }
|
|
PlayerTankDivision = { PlyrHvyTnk01, PlyrHvyTnk02, PlyrHvyTnk03, PlyrHvyTnk04, PlyrHvyTnk05, PlyrMthTnk01, PlyrMthTnk02, PlyrV2RL01, PlyrV2RL02, PlyrV2RL03, PlyrV2RL04 }
|
|
InitialHuntTeam = { InitialHuntUnit01, InitialHuntUnit02, InitialHuntUnit03, InitialHuntUnit04, InitialHuntUnit05, InitialHuntUnit06, InitialHuntUnit07, InitialHuntUnit08, InitialHuntUnit09 }
|
|
BarrelsShooter = { InitialRifleman01, InitialRifleman02 }
|
|
TownPeoples = { TownDude01, TownDude02, TownDude03, TownDude04, TownMedic01, TownMedic02, TownMedic03 }
|
|
CivTeam01 = { "c1", "c3", "c4" }
|
|
CivTeam02 = { "c4", "c5", "c6" }
|
|
InfGuardSquad01 = { InfGuardSquad01Unit01, InfGuardSquad01Unit02, InfGuardSquad01Unit03, InfGuardSquad01Unit04, InfGuardSquad01Unit05, MediumTankGuard01 }
|
|
InfGuardSquad02 = { InfGuardSquad02Unit01, InfGuardSquad02Unit02, InfGuardSquad02Unit03, RangerGuard02 }
|
|
InfGuardSquad03 = { InfGuardSquad03Unit01, InfGuardSquad03Unit02, InfGuardSquad03Unit03, InfGuardSquad03Unit04, InfGuardSquad03Unit05, RangerGuard04 }
|
|
TanyaSquad = { TanyaSquadUnit01, TanyaSquadUnit02, TanyaSquadUnit03, TanyaSquadUnit04, TanyaSquadUnit05, TanyaSquadUnit06, TanyaSquadTanya }
|
|
|
|
-- Building Group Setup
|
|
AlliedOreRef = { OreRefinery01, OreRefinery02 }
|
|
AlliedWarFact = { AlliedWarFact01, AlliedWarFact02 }
|
|
HeavyTurrets = { HTurret01, HTurret02, HTurret03 }
|
|
|
|
-- Area Triggers Setup
|
|
SuperTeamLandCell = { CPos.New(21, 82), CPos.New(20, 81), CPos.New(21, 81), CPos.New(22, 81), CPos.New(20, 82), CPos.New(22, 82), CPos.New(21, 83), CPos.New(20, 83), CPos.New(22, 83) }
|
|
CivTeam01Trigger = { CPos.New(21, 58), CPos.New(21, 59), CPos.New(21, 60), CPos.New(22, 60), CPos.New(23, 60), CPos.New(22, 61), CPos.New(23, 61), CPos.New(24, 60), CPos.New(25, 60), CPos.New(24, 59), CPos.New(24, 58), CPos.New(23, 58), CPos.New(22, 58) }
|
|
CivTeam02Trigger = { CPos.New(33, 62), CPos.New(33, 63), CPos.New(32, 62), CPos.New(32, 63), CPos.New(31, 62), CPos.New(31, 63), CPos.New(31, 61), CPos.New(31, 60), CPos.New(30, 62), CPos.New(30, 61), CPos.New(30, 60), CPos.New(32, 60), CPos.New(33, 60) }
|
|
MineSoldierTrigger = { CPos.New(32, 58), CPos.New(32, 59), CPos.New(33, 58), CPos.New(33, 59), CPos.New(31, 59), CPos.New(30, 59), CPos.New(29, 59), CPos.New(29, 58), CPos.New(28, 59), CPos.New(27, 59), CPos.New(26, 59), CPos.New(25, 59), CPos.New(27, 58), CPos.New(26, 58), CPos.New(25, 58), CPos.New(24, 58), CPos.New(23, 58), CPos.New(26, 57), CPos.New(24, 57), CPos.New(24, 56), CPos.New(24, 55), CPos.New(24, 54), CPos.New(23, 57), CPos.New(23, 56), CPos.New(23, 55), CPos.New(23, 54), CPos.New(22, 57) }
|
|
MineRevealTrigger = { CPos.New(30, 46), CPos.New(31, 46), CPos.New(32, 46), CPos.New(33, 46), CPos.New(34, 46), CPos.New(35, 46), CPos.New(36, 46), CPos.New(37, 46) }
|
|
ParaTrigger = { CPos.New(18, 34), CPos.New(19, 34), CPos.New(20, 34), CPos.New(21, 34), CPos.New(22, 34), CPos.New(23, 34), CPos.New(24, 34), CPos.New(25, 34), CPos.New(18, 35), CPos.New(19, 35), CPos.New(20, 35), CPos.New(21, 35), CPos.New(22, 35), CPos.New(23, 35), CPos.New(24, 35), CPos.New(25, 35) }
|
|
TanyaTrigger = { CPos.New(59, 43), CPos.New(60, 43), CPos.New(61, 43), CPos.New(62, 43), CPos.New(63, 43), CPos.New(64, 43), CPos.New(65, 43), CPos.New(66, 43), CPos.New(67, 43), CPos.New(68, 43), CPos.New(69, 43), CPos.New(59, 44), CPos.New(60, 44), CPos.New(61, 44), CPos.New(62, 44), CPos.New(63, 44), CPos.New(64, 44), CPos.New(65, 44), CPos.New(66, 44), CPos.New(67, 44), CPos.New(68, 44), CPos.New(69, 44) }
|
|
|
|
-- Mission Variables Setup
|
|
GreeceHarvestersAreDead = false
|
|
AlloyFacilityDestroyed = false
|
|
|
|
WorldLoaded = function()
|
|
|
|
--Players Setup
|
|
USSR = Player.GetPlayer("USSR")
|
|
Greece = Player.GetPlayer("Greece")
|
|
GoodGuy = Player.GetPlayer("GoodGuy")
|
|
Spain = Player.GetPlayer("Spain")
|
|
France = Player.GetPlayer("France")
|
|
|
|
Greece.Cash = 20000
|
|
|
|
Camera.Position = DefaultCameraPosition.CenterPosition
|
|
|
|
--AI Production Setup
|
|
ProduceArmor()
|
|
|
|
if Difficulty == "easy" then
|
|
Trigger.AfterDelay(DateTime.Minutes(10), ProduceNavyGuard)
|
|
elseif Difficulty == "normal" then
|
|
Trigger.AfterDelay(DateTime.Minutes(5), ProduceNavyGuard)
|
|
elseif Difficulty == "hard" then
|
|
ProduceNavyGuard()
|
|
end
|
|
|
|
--Objectives Setup
|
|
InitObjectives(USSR)
|
|
|
|
DestroyControlCenter = AddPrimaryObjective(USSR, "destroy-control-center")
|
|
KeepTanksAlive = AddPrimaryObjective(USSR, "tank-division-must-not-be-destroyed")
|
|
KeepVolkovAlive = AddPrimaryObjective(USSR, "volkov-survive")
|
|
KeepChitzkoiAlive = AddSecondaryObjective(USSR, "keep-chitzkoi-alive")
|
|
|
|
Trigger.OnKilled(ControlCenter, function()
|
|
Utils.Do(HeavyTurrets, function(struc)
|
|
if not struc.IsDead then struc.Kill() end
|
|
end)
|
|
USSR.MarkCompletedObjective(DestroyControlCenter)
|
|
DestroyAlloyFacility = AddPrimaryObjective(USSR, "destroy-alloy-facility")
|
|
Media.PlaySpeechNotification(USSR, "FirstObjectiveMet")
|
|
Media.DisplayMessage(UserInterface.Translate("heavy-turret-control-destroyed"))
|
|
end)
|
|
|
|
Trigger.OnKilled(AlloyFacility, function()
|
|
if not USSR.IsObjectiveCompleted(DestroyControlCenter) then --Prevent a crash if the player somehow manage to cheese the mission and destroy
|
|
USSR.MarkCompletedObjective(DestroyControlCenter) --the Alloy Facility without destroying the Control Center.
|
|
DestroyAlloyFacility = AddPrimaryObjective(USSR, "destroy-alloy-facility")
|
|
end
|
|
Trigger.AfterDelay(DateTime.Seconds(2), function()
|
|
USSR.MarkCompletedObjective(DestroyAlloyFacility)
|
|
USSR.MarkCompletedObjective(KeepTanksAlive)
|
|
USSR.MarkCompletedObjective(KeepVolkovAlive)
|
|
USSR.MarkCompletedObjective(KeepChitzkoiAlive)
|
|
end)
|
|
AlloyFacilityDestroyed = true
|
|
Media.PlaySpeechNotification(USSR, "SecondObjectiveMet")
|
|
end)
|
|
|
|
Trigger.OnAllKilled(PlayerTankDivision, function()
|
|
if not AlloyFacilityDestroyed then USSR.MarkFailedObjective(KeepTanksAlive) end
|
|
end)
|
|
|
|
Trigger.AfterDelay(0, function()
|
|
local AlliedBaseCamera = Actor.Create("camera", true, { Owner = USSR, Location = waypoint12.Location })
|
|
local SuperTeamCamera = Actor.Create("camera", true, { Owner = USSR, Location = DefaultCameraPosition.Location })
|
|
Trigger.AfterDelay(1, function()
|
|
if AlliedBaseCamera.IsInWorld then AlliedBaseCamera.Destroy() end
|
|
end)
|
|
Trigger.AfterDelay(DateTime.Seconds(20), function()
|
|
if SuperTeamCamera.IsInWorld then SuperTeamCamera.Destroy() end
|
|
end)
|
|
end)
|
|
|
|
--Super Team Setup
|
|
Trigger.AfterDelay(DateTime.Seconds(2), function()
|
|
local spawn = superteamspawn.CenterPosition + WVec.New(0, 0, Actor.CruiseAltitude("badr"))
|
|
local transport = Actor.Create("badr", true, { CenterPosition = spawn, Owner = USSR, Facing = (superteamdrop.CenterPosition - spawn).Facing, Health = 3 })
|
|
Utils.Do(SuperTeam, function(type)
|
|
local a = Actor.Create(type, false, { Owner = USSR })
|
|
transport.LoadPassenger(a)
|
|
if a.Type == "volk" then
|
|
VolkovIsDead(a)
|
|
end
|
|
if a.Type == "zkoi" then
|
|
ChitzkoiIsDead(a)
|
|
end
|
|
end)
|
|
Media.PlaySpeechNotification(USSR, "ReinforcementsArrived")
|
|
transport.Paradrop(CPos.New(21, 82))
|
|
end)
|
|
|
|
Trigger.OnEnteredFootprint(SuperTeamLandCell, function(unit, id)
|
|
if unit.Owner == USSR then
|
|
Trigger.RemoveFootprintTrigger(id)
|
|
Trigger.AfterDelay(DateTime.Seconds(2), function()
|
|
if not BarrelsShooter[1].IsDead then
|
|
BarrelsShooter[1].Attack(Barrel, true, true)
|
|
elseif not BarrelsShooter[2].IsDead then
|
|
BarrelsShooter[2].Attack(Barrel, true, true)
|
|
end
|
|
Utils.Do(InitialHuntTeam, function(actor)
|
|
if not actor.IsDead then
|
|
Trigger.OnIdle(actor, actor.Hunt)
|
|
end
|
|
end)
|
|
end)
|
|
end
|
|
end)
|
|
|
|
--Guards Squads Setup -- I used proximity triggers to make them hunt you down in order to mimic their behavior from the original mission
|
|
Trigger.OnEnteredProximityTrigger(RangerGuard01.CenterPosition, WDist.New(70 * 70), function(unit, id)
|
|
if not RangerGuard01.IsDead and unit.Owner == USSR then
|
|
Trigger.OnIdle(RangerGuard01, RangerGuard01.Hunt)
|
|
Trigger.RemoveProximityTrigger(id)
|
|
end
|
|
end)
|
|
|
|
Trigger.OnEnteredProximityTrigger(waypoint7.CenterPosition, WDist.FromCells(6), function(unit, id)
|
|
if unit.Owner == USSR then
|
|
Utils.Do(InfGuardSquad01, function(actor)
|
|
if not actor.IsDead then
|
|
Trigger.OnIdle(actor, actor.Hunt)
|
|
end
|
|
end)
|
|
Trigger.RemoveProximityTrigger(id)
|
|
end
|
|
end)
|
|
|
|
Trigger.OnEnteredProximityTrigger(InfGuardSquad02Unit01.CenterPosition, WDist.FromCells(6), function(unit, id)
|
|
if unit.Owner == USSR and (unit.Type == "volk" or unit.Type == "zkoi") then
|
|
Utils.Do(InfGuardSquad02, function(actor)
|
|
if not actor.IsDead then
|
|
Trigger.OnIdle(actor, actor.Hunt)
|
|
end
|
|
end)
|
|
Trigger.RemoveProximityTrigger(id)
|
|
end
|
|
end)
|
|
|
|
Trigger.OnEnteredProximityTrigger(InfGuardSquad03Unit05.CenterPosition, WDist.FromCells(8), function(unit, id)
|
|
if unit.Owner == USSR then
|
|
local HospitalCamera = Actor.Create("camera", true, { Owner = USSR, Location = waypoint13.Location })
|
|
Utils.Do(InfGuardSquad03, function(actor)
|
|
if not actor.IsDead then
|
|
Trigger.OnIdle(actor, actor.Hunt)
|
|
end
|
|
end)
|
|
if not SupplyTruck01.IsDead then
|
|
SupplyTruck01.Move(waypoint14.Location)
|
|
Trigger.AfterDelay(DateTime.Seconds(8), function()
|
|
if not SupplyTruck01.IsDead then
|
|
SupplyTruck01.Move(waypoint15.Location)
|
|
end
|
|
end)
|
|
end
|
|
Trigger.AfterDelay(DateTime.Seconds(15), function()
|
|
if HospitalCamera.IsInWorld then HospitalCamera.Destroy() end
|
|
end)
|
|
Trigger.RemoveProximityTrigger(id)
|
|
end
|
|
end)
|
|
|
|
Trigger.OnEnteredProximityTrigger(LightTankGuard02.CenterPosition, WDist.FromCells(8), function(unit, id)
|
|
if not LightTankGuard02.IsDead and unit.Owner == USSR and (unit.Type == "volk" or unit.Type == "zkoi") then
|
|
Trigger.OnIdle(LightTankGuard02, LightTankGuard02.Hunt)
|
|
Trigger.RemoveProximityTrigger(id)
|
|
end
|
|
end)
|
|
|
|
--Tanya Squad Setup
|
|
Trigger.OnEnteredFootprint(TanyaTrigger, function(unit, id)
|
|
if unit.Owner == USSR then
|
|
if not TanyaSquadTanya.IsDead then
|
|
local TanyaSquadCamera = Actor.Create("camera", true, { Owner = USSR, Location = waypoint85.Location })
|
|
Media.PlaySoundNotification(USSR, "rokroll")
|
|
Utils.Do(TanyaSquad, function(actor)
|
|
if not actor.IsDead then
|
|
Trigger.OnIdle(actor, actor.Hunt)
|
|
end
|
|
end)
|
|
Trigger.OnKilled(TanyaSquadTanya, function()
|
|
if TanyaSquadCamera.IsInWorld then
|
|
TanyaSquadCamera.Destroy()
|
|
end
|
|
end)
|
|
end
|
|
Trigger.RemoveFootprintTrigger(id)
|
|
end
|
|
end)
|
|
|
|
--Town Setup
|
|
Utils.Do(TownPeoples, function(actor)
|
|
Trigger.OnDamaged(actor, function()
|
|
if not TownMedic01.IsDead then
|
|
TownMedic01.Patrol({ waypoint5.Location, waypoint6.Location, waypoint7.Location }, true, 0)
|
|
end
|
|
if not TownMedic02.IsDead then
|
|
TownMedic02.Patrol({ waypoint8.Location, waypoint7.Location, waypoint5.Location, waypoint6.Location }, true, 0)
|
|
end
|
|
end)
|
|
end)
|
|
|
|
Trigger.OnEnteredFootprint(CivTeam01Trigger, function(unit, id)
|
|
if unit.Owner == USSR then
|
|
if not TownHouse03.IsDead then
|
|
local civ01 = Reinforcements.Reinforce(Spain, CivTeam01, { civteam01spawn.Location }, 0)
|
|
Utils.Do(civ01, function(actor)
|
|
if not actor.IsDead then
|
|
Trigger.OnIdle(actor, actor.Hunt)
|
|
end
|
|
end)
|
|
end
|
|
Trigger.RemoveFootprintTrigger(id)
|
|
end
|
|
end)
|
|
|
|
Trigger.OnEnteredFootprint(CivTeam02Trigger, function(unit, id)
|
|
if unit.Owner == USSR then
|
|
if not TownHouse04.IsDead then
|
|
local civ02 = Reinforcements.Reinforce(Spain, CivTeam02, { civteam02spawn.Location }, 0)
|
|
Utils.Do(civ02, function(actor)
|
|
if not actor.IsDead then
|
|
Trigger.OnIdle(actor, actor.Hunt)
|
|
end
|
|
end)
|
|
end
|
|
Trigger.RemoveFootprintTrigger(id)
|
|
end
|
|
end)
|
|
|
|
--Minefield Setup
|
|
Trigger.OnEnteredFootprint(MineSoldierTrigger, function(unit, id)
|
|
if unit.Owner == USSR then
|
|
local MineSoldierCamera1 = Actor.Create("camera", true, { Owner = USSR, Location = waypoint96.Location })
|
|
Trigger.AfterDelay(DateTime.Seconds(10), function()
|
|
if MineSoldierCamera1.IsInWorld then MineSoldierCamera1.Destroy() end
|
|
end)
|
|
if not MineSoldier01.IsDead then
|
|
MineSoldier01.Patrol({ waypoint91.Location, waypoint95.Location, waypoint76.Location, waypoint93.Location }, false, 0)
|
|
end
|
|
if not MineSoldier02.IsDead then
|
|
MineSoldier02.Patrol({ waypoint92.Location, waypoint91.Location, waypoint76.Location, waypoint93.Location }, false, 0)
|
|
end
|
|
if not MineSoldier03.IsDead then
|
|
MineSoldier03.Patrol({ waypoint91.Location, waypoint95.Location, waypoint76.Location, waypoint93.Location }, false, 0)
|
|
end
|
|
if not MineSoldier04.IsDead then
|
|
MineSoldier04.Patrol({ waypoint92.Location, waypoint95.Location, waypoint76.Location, waypoint93.Location }, false, 0)
|
|
end
|
|
if not MineSoldier05.IsDead then
|
|
MineSoldier05.Patrol({ waypoint90.Location, waypoint91.Location, waypoint95.Location, waypoint76.Location, waypoint93.Location }, false, 0)
|
|
end
|
|
if not MineSoldier06.IsDead then
|
|
MineSoldier06.Patrol({ waypoint92.Location, waypoint91.Location, waypoint93.Location }, false, 0)
|
|
end
|
|
Trigger.RemoveFootprintTrigger(id)
|
|
end
|
|
end)
|
|
|
|
Trigger.OnEnteredFootprint(MineRevealTrigger, function(unit, id)
|
|
if unit.Owner == GoodGuy then
|
|
local MineSoldierCamera2 = Actor.Create("camera", true, { Owner = USSR, Location = waypoint76.Location })
|
|
Trigger.AfterDelay(DateTime.Seconds(12), function()
|
|
if MineSoldierCamera2.IsInWorld then MineSoldierCamera2.Destroy() end
|
|
end)
|
|
Trigger.RemoveFootprintTrigger(id)
|
|
end
|
|
end)
|
|
|
|
--Paradrop Rifle Team Setup
|
|
Trigger.OnEnteredFootprint(ParaTrigger, function(unit, id)
|
|
if unit.Owner == USSR then
|
|
local powerproxy = Actor.Create("powerproxy.pararifles", true, { Owner = Greece })
|
|
local aircraft = powerproxy.TargetParatroopers(waypoint89.CenterPosition, Angle.South)
|
|
local prtcamera = Actor.Create("camera", true, { Owner = USSR, Location = waypoint89.Location })
|
|
Utils.Do(aircraft, function(a)
|
|
Trigger.OnPassengerExited(a, function(t, p)
|
|
IdleHunt(p)
|
|
end)
|
|
end)
|
|
Trigger.AfterDelay(DateTime.Seconds(10), function()
|
|
if prtcamera.IsInWorld then prtcamera.Destroy() end
|
|
end)
|
|
if Difficulty == "hard" and not RiflemanGuard01.IsDead then
|
|
Trigger.ClearAll(RiflemanGuard01)
|
|
ProduceInfantry() --Greece will start infantry production right away if the difficulty is set to hard
|
|
end
|
|
Trigger.RemoveFootprintTrigger(id)
|
|
end
|
|
end)
|
|
|
|
Trigger.OnKilled(RiflemanGuard01, function()
|
|
ProduceInfantry() --Greece will start infantry production once this unit is dead just like in the original mission
|
|
end)
|
|
|
|
Trigger.AfterDelay(DateTime.Seconds(1), function()
|
|
local GreeceHarvesters = Greece.GetActorsByType("harv")
|
|
Trigger.OnAllKilled(GreeceHarvesters, function()
|
|
GreeceHarvestersAreDead = true
|
|
end)
|
|
end)
|
|
|
|
end
|
|
|
|
VolkovIsDead = function(a)
|
|
Trigger.OnKilled(a, function()
|
|
USSR.MarkFailedObjective(KeepVolkovAlive)
|
|
end)
|
|
end
|
|
|
|
ChitzkoiIsDead = function(a)
|
|
Trigger.OnKilled(a, function()
|
|
USSR.MarkFailedObjective(KeepChitzkoiAlive)
|
|
Media.DisplayMessage(UserInterface.Translate("rebuild-chitzkoy"))
|
|
Trigger.AfterDelay(DateTime.Seconds(1), function()
|
|
Media.PlaySpeechNotification(USSR, "ObjectiveNotMet")
|
|
end)
|
|
end)
|
|
end
|