387 lines
14 KiB
Lua
387 lines
14 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.
|
|
]]
|
|
if Difficulty == "easy" then
|
|
RemainingTime = DateTime.Minutes(7)
|
|
elseif Difficulty == "normal" then
|
|
RemainingTime = DateTime.Minutes(6)
|
|
elseif Difficulty == "hard" then
|
|
RemainingTime = DateTime.Minutes(5)
|
|
end
|
|
|
|
USSRReinforcements1 = { "dog", "dog", "dog", "dog", "dog" }
|
|
USSRReinforcements2 = { "e1", "e2", "e2" }
|
|
USSRReinforcementsFarm = { "e1", "e1", "e1", "e2", "e2" }
|
|
EnemyReinforcements1SpyHideout2 = { "e1", "e3" }
|
|
EnemyReinforcements2SpyHideout2 = { "e3", "e3" }
|
|
ExtractionHeliType = "tran"
|
|
ExtractionPath = { HelicopterSpawn.Location, HelicopterGoal.Location }
|
|
Farmers = { Farmer1, Farmer2, Farmer3 }
|
|
BarrierSoldiers = { BarrierSoldier1, BarrierSoldier2, BarrierSoldier3, BarrierSoldier4, BarrierSoldier5, BarrierSoldier6 }
|
|
RedBuildings = { RedBuilding1, RedBuilding2, RedBuilding3 }
|
|
BaseBuildings1 = { BaseBarrel1, BaseBarrel2, BaseBuilding1, BaseBuilding2 }
|
|
BaseBuildings2 = { BaseBuilding3, BaseBuilding4, BaseBuilding5, BaseBuilding6 }
|
|
|
|
SpyHideout1Trigger = { CPos.New(84, 45), CPos.New(85, 45), CPos.New(86, 45), CPos.New(87, 45), CPos.New(88, 45), CPos.New(89, 45), CPos.New(90, 45) }
|
|
SpyHideout2PathTrigger = { CPos.New(70, 61), CPos.New(70, 62), CPos.New(70, 63), CPos.New(70, 64), CPos.New(70, 65) }
|
|
SpyHideout2Trigger = { CPos.New(50, 63), CPos.New(50, 64), CPos.New(50, 65), CPos.New(50, 66), CPos.New(50, 67), CPos.New(50, 68), CPos.New(50, 69) }
|
|
SpyTransport1CheckpointTrigger = { CPos.New(31, 65) }
|
|
SpyTransport2CheckpointTrigger = { CPos.New(47, 51) }
|
|
Barrier1Trigger = { CPos.New(59,57), CPos.New(60,57), CPos.New(61,57), CPos.New(62,57), CPos.New(63,57), CPos.New(64,57), CPos.New(65,57), CPos.New(66,57), CPos.New(67,57), CPos.New(68,57) }
|
|
Barrier2Trigger = { CPos.New(63, 47), CPos.New(64, 47), CPos.New(65, 47), CPos.New(66, 47), CPos.New(67, 47), CPos.New(68, 47) }
|
|
SpyHideout3Trigger = { CPos.New(58, 45), CPos.New(58, 46), CPos.New(58, 47) }
|
|
RTrapTrigger = { CPos.New(46, 34), CPos.New(47, 35), CPos.New(48, 36), CPos.New(48, 37), CPos.New(48, 38), CPos.New(48, 39) }
|
|
SpyHideout4Trigger = { CPos.New(41, 34), CPos.New(41, 35), CPos.New(41, 36), CPos.New(41, 37), CPos.New(41, 38) }
|
|
|
|
IntroSequence = function()
|
|
TheSpy.DisguiseAsType("e1", USSR)
|
|
Actor.Create("camera", true, { Owner = USSR, Location = Playerbase.Location })
|
|
Actor.Create("camera", true, { Owner = USSR, Location = IntroCamera.Location })
|
|
Actor.Create("camera", true, { Owner = USSR, Location = FarmArea.Location })
|
|
if not TheSpy.IsDead then
|
|
TheSpy.Move(SpyWaypoint1.Location)
|
|
TheSpy.Move(SpyWaypoint2.Location)
|
|
end
|
|
Trigger.AfterDelay(DateTime.Seconds(1), function()
|
|
Media.PlaySoundNotification(USSR, "sking")
|
|
end)
|
|
Trigger.AfterDelay(DateTime.Seconds(2), function()
|
|
Media.PlaySpeechNotification(USSR, "ExplosiveChargePlaced")
|
|
end)
|
|
Trigger.AfterDelay(DateTime.Seconds(4), function()
|
|
if not RSoldier1.IsDead and not BaseBarrel1.IsDead then
|
|
RSoldier1.Attack(BaseBarrel1)
|
|
end
|
|
if not RSoldier2.IsDead and not BaseBarrel2.IsDead then
|
|
RSoldier2.Attack(BaseBarrel2)
|
|
end
|
|
end)
|
|
Trigger.AfterDelay(DateTime.Seconds(5), function()
|
|
Utils.Do(BaseBuildings1, function(actor)
|
|
if not actor.IsDead then
|
|
actor.Kill()
|
|
end
|
|
end)
|
|
end)
|
|
Trigger.AfterDelay(DateTime.Seconds(6), function()
|
|
Utils.Do(BaseBuildings2, function(actor)
|
|
if not actor.IsDead then
|
|
actor.Kill()
|
|
end
|
|
end)
|
|
if not RSoldier1.IsDead then
|
|
RSoldier1.Move(SpyWaypoint2.Location)
|
|
end
|
|
if not RSoldier2.IsDead then
|
|
RSoldier2.Move(SpyWaypoint2.Location)
|
|
end
|
|
end)
|
|
Trigger.AfterDelay(DateTime.Seconds(8), function()
|
|
Dogs = Reinforcements.Reinforce(USSR, USSRReinforcements1, { ReinforcementSpawn.Location, ReinforcementGoal.Location }, 0)
|
|
Media.PlaySpeechNotification(USSR, "ReinforcementsArrived")
|
|
TimerStarted = true
|
|
end)
|
|
Trigger.AfterDelay(DateTime.Seconds(9), function()
|
|
Media.PlaySoundNotification(USSR, "AlertBleep")
|
|
end)
|
|
Trigger.AfterDelay(DateTime.Seconds(10), function()
|
|
Media.PlaySpeechNotification(USSR, "TimerStarted")
|
|
end)
|
|
end
|
|
|
|
SendUSSRParadrops = function()
|
|
local paraproxy = Actor.Create("powerproxy.paratroopers", false, { Owner = USSR })
|
|
paraproxy.TargetParatroopers(ReinforcementDropOff.CenterPosition, Angle.North)
|
|
paraproxy.Destroy()
|
|
end
|
|
|
|
SpyFinalSequency = function()
|
|
if not SpyHideout4.IsDead then
|
|
SpyHideout4.UnloadPassengers()
|
|
Trigger.AfterDelay(DateTime.Seconds(1), function()
|
|
if not TheSpy.IsDead then
|
|
TheSpy.Move(SpyGoal.Location)
|
|
end
|
|
end)
|
|
end
|
|
end
|
|
|
|
SpyHelicopterEscape = function()
|
|
if not SpyHelicopterEscaped then
|
|
SpyHelicopterEscaped = true
|
|
SpyFinalSequency()
|
|
Actor.Create("camera", true, { Owner = USSR, Location = CameraFinalArea.Location })
|
|
ExtractionHeli = Reinforcements.ReinforceWithTransport(Greece, ExtractionHeliType, nil, ExtractionPath)[1]
|
|
local exitPos = CPos.New(ExtractionPath[1].X, ExtractionPath[2].Y)
|
|
Trigger.AfterDelay(DateTime.Seconds(5), function()
|
|
if not TheSpy.IsDead and not ExtractionHeli.IsDead then
|
|
TheSpy.EnterTransport(ExtractionHeli)
|
|
end
|
|
end)
|
|
Trigger.AfterDelay(DateTime.Seconds(7), function()
|
|
if not ExtractionHeli.IsDead then
|
|
ExtractionHeli.Move(HelicopterEscape.Location)
|
|
end
|
|
end)
|
|
Trigger.AfterDelay(DateTime.Seconds(12), function()
|
|
England.MarkCompletedObjective(AlliedObjective)
|
|
end)
|
|
end
|
|
end
|
|
|
|
Trigger.OnAllKilled(Farmers, function()
|
|
Reinforcements.Reinforce(USSR, USSRReinforcementsFarm, { FarmSpawn.Location, FarmArea.Location }, 0)
|
|
USSR.MarkCompletedObjective(SovietObjective2)
|
|
end)
|
|
|
|
Trigger.OnAllKilled(RedBuildings, function()
|
|
USSR.MarkCompletedObjective(SovietObjective3)
|
|
end)
|
|
|
|
Trigger.OnAnyKilled(BarrierSoldiers, function()
|
|
if Barrier1Triggered then
|
|
Utils.Do(BarrierSoldiers, function(actor)
|
|
if not actor.IsDead then
|
|
Trigger.OnIdle(actor, actor.Hunt)
|
|
end
|
|
end)
|
|
end
|
|
end)
|
|
|
|
Trigger.OnEnteredFootprint(SpyHideout1Trigger, function(a, id)
|
|
if not SpyHideout1Triggered and a.Owner == USSR then
|
|
SpyHideout1Triggered = true
|
|
Trigger.RemoveFootprintTrigger(id)
|
|
Actor.Create("camera", true, { Owner = USSR, Location = SpyHideout1.Location })
|
|
if not TheSpy.IsDead and not SpyHideout1.IsDead then
|
|
TheSpy.EnterTransport(SpyHideout1)
|
|
end
|
|
end
|
|
end)
|
|
|
|
Trigger.OnEnteredFootprint(SpyHideout2PathTrigger, function(a, id)
|
|
if not SpyHideout2PathTriggered and a.Owner == USSR then
|
|
SpyHideout2PathTriggered = true
|
|
Trigger.RemoveFootprintTrigger(id)
|
|
Actor.Create("camera", true, { Owner = USSR, Location = CameraSpyVillage.Location })
|
|
Actor.Create("camera", true, { Owner = USSR, Location = CameraVillage.Location })
|
|
if not TheSpy.IsDead and not SpyHideout2.IsDead then
|
|
TheSpy.EnterTransport(SpyHideout2)
|
|
end
|
|
end
|
|
end)
|
|
|
|
Trigger.OnEnteredFootprint(SpyHideout2Trigger, function(a, id)
|
|
if not SpyHideout2Triggered and a.Owner == USSR then
|
|
SpyHideout2Triggered = true
|
|
SpyGuards1 = Reinforcements.Reinforce(Greece, EnemyReinforcements1SpyHideout2, { EnemyReinforcements1.Location, EnemyReinforcements1Goal.Location }, 0)
|
|
SpyGuards2 = Reinforcements.Reinforce(Greece, EnemyReinforcements2SpyHideout2, { EnemyReinforcements2.Location, EnemyReinforcements2Goal.Location }, 0)
|
|
Utils.Do(SpyGuards1, function(actor)
|
|
if not actor.IsDead then
|
|
Trigger.OnIdle(actor, actor.Hunt)
|
|
end
|
|
end)
|
|
Utils.Do(SpyGuards2, function(actor)
|
|
if not actor.IsDead then
|
|
Trigger.OnIdle(actor, actor.Hunt)
|
|
end
|
|
end)
|
|
if not SpyHideout2.IsDead and not Transport.IsDead then
|
|
SpyHideout2.UnloadPassengers()
|
|
Transport.Move(TransportPath1Water.Location)
|
|
end
|
|
Trigger.AfterDelay(DateTime.Seconds(1), function()
|
|
if not TheSpy.IsDead then
|
|
TheSpy.Move(TransportPath1.Location)
|
|
TheSpy.EnterTransport(Transport)
|
|
end
|
|
end)
|
|
Trigger.AfterDelay(DateTime.Seconds(7), function()
|
|
SendUSSRParadrops()
|
|
Media.PlaySpeechNotification(USSR, "ReinforcementsArrived")
|
|
end)
|
|
end
|
|
end)
|
|
|
|
Trigger.OnEnteredFootprint(SpyTransport1CheckpointTrigger, function(a, id)
|
|
if not SpyTransport1CheckpointTriggered and a.Owner == England then
|
|
SpyTransport1CheckpointTriggered = true
|
|
Trigger.AfterDelay(DateTime.Seconds(2), function()
|
|
Actor.Create("camera", true, { Owner = USSR, Location = CameraWater1.Location })
|
|
Actor.Create("camera", true, { Owner = USSR, Location = CameraWater2.Location })
|
|
Actor.Create("camera", true, { Owner = USSR, Location = CameraWater3.Location })
|
|
Actor.Create("camera", true, { Owner = USSR, Location = CameraWater4.Location })
|
|
Actor.Create("camera", true, { Owner = USSR, Location = CameraWater5.Location })
|
|
Actor.Create("camera", true, { Owner = USSR, Location = CameraWater6.Location })
|
|
Actor.Create("camera", true, { Owner = USSR, Location = TransportPath2.Location })
|
|
if not Transport.IsDead then
|
|
Transport.Wait(25)
|
|
Transport.Move(TransportPath2Water.Location)
|
|
end
|
|
end)
|
|
end
|
|
end)
|
|
|
|
Trigger.OnEnteredFootprint(SpyTransport2CheckpointTrigger, function(a, id)
|
|
if not SpyTransport2CheckpointTriggered and a.Owner == Greece then
|
|
SpyTransport2CheckpointTriggered = true
|
|
Transport.UnloadPassengers()
|
|
Trigger.AfterDelay(DateTime.Seconds(1), function()
|
|
if not TheSpy.IsDead then
|
|
if not Hideout3Barrel.IsDead then
|
|
TheSpy.EnterTransport(SpyHideout3)
|
|
elseif not SpyHideout4.IsDead then
|
|
TheSpy.EnterTransport(SpyHideout4)
|
|
else
|
|
TheSpy.Move(SpyGoal.Location)
|
|
end
|
|
end
|
|
end)
|
|
end
|
|
end)
|
|
|
|
Trigger.OnEnteredFootprint(Barrier1Trigger, function(a, id)
|
|
if not Barrier1Triggered and a.Owner == USSR then
|
|
Barrier1Triggered = true
|
|
Actor.Create("camera", true, { Owner = USSR, Location = CameraBarrier.Location })
|
|
end
|
|
end)
|
|
|
|
Trigger.OnEnteredFootprint(Barrier2Trigger, function(a, id)
|
|
if not Barrier2Triggered and a.Owner == USSR then
|
|
Barrier2Triggered = true
|
|
Actor.Create("camera", true, { Owner = USSR, Location = CameraSpyHideout31.Location })
|
|
Actor.Create("camera", true, { Owner = USSR, Location = CameraSpyHideout32.Location })
|
|
Actor.Create("camera", true, { Owner = USSR, Location = CameraSpyHideout33.Location })
|
|
end
|
|
end)
|
|
|
|
Trigger.OnEnteredFootprint(SpyHideout3Trigger, function(a, id)
|
|
if not SpyHideout3Triggered and a.Owner == USSR then
|
|
SpyHideout3Triggered = true
|
|
if Difficulty ~= "hard" then
|
|
Reinforcements.Reinforce(USSR, USSRReinforcements2, { ReinforcementSpawn.Location, CameraSpyHideout33.Location }, 0)
|
|
Media.PlaySpeechNotification(USSR, "ReinforcementsArrived")
|
|
end
|
|
end
|
|
end)
|
|
|
|
Trigger.OnEnteredFootprint(RTrapTrigger, function(a, id)
|
|
if not RTrapTriggered and a.Owner == USSR then
|
|
RTrapTriggered = true
|
|
Actor.Create("camera", true, { Owner = USSR, Location = CameraFinalArea.Location })
|
|
if not RSoldier3.IsDead and not RSoldierTrap.IsDead then
|
|
RSoldier3.Attack(RSoldierTrap)
|
|
end
|
|
if not RSoldier4.IsDead and not RSoldierTrap.IsDead then
|
|
RSoldier4.Attack(RSoldierTrap)
|
|
end
|
|
end
|
|
end)
|
|
|
|
Trigger.OnEnteredFootprint(SpyHideout4Trigger, function(a, id)
|
|
if not SpyHideout4Triggered and a.Owner == USSR then
|
|
SpyHideout4Triggered = true
|
|
SpyFinalSequency()
|
|
Actor.Create("camera", true, { Owner = USSR, Location = HelicopterGoal.Location })
|
|
end
|
|
end)
|
|
|
|
Trigger.OnKilled(Hideout1Barrel, function()
|
|
if not Hideout1PBox.IsDead then
|
|
Hideout1PBox.Kill()
|
|
end
|
|
Trigger.AfterDelay(DateTime.Seconds(1), function()
|
|
if not SpyHideout1.IsDead then
|
|
SpyHideout1.UnloadPassengers()
|
|
end
|
|
end)
|
|
Trigger.AfterDelay(DateTime.Seconds(2), function()
|
|
if not TheSpy.IsDead then
|
|
TheSpy.Move(SpyWaypoint3.Location)
|
|
TheSpy.Move(SpyWaypoint4.Location)
|
|
end
|
|
end)
|
|
if not RSoldier1.IsDead then
|
|
RSoldier1.Move(RStandoff.Location)
|
|
end
|
|
if not RSoldier2.IsDead then
|
|
RSoldier2.Move(RStandoff.Location)
|
|
end
|
|
end)
|
|
|
|
Trigger.OnKilled(Hideout3Barrel, function()
|
|
if not SpyHideout3.IsDead then
|
|
SpyHideout3.UnloadPassengers()
|
|
end
|
|
Trigger.AfterDelay(DateTime.Seconds(1), function()
|
|
if not TheSpy.IsDead then
|
|
TheSpy.Move(SpyGoal.Location)
|
|
end
|
|
end)
|
|
Trigger.AfterDelay(DateTime.Seconds(7), function()
|
|
if not TheSpy.IsDead and not SpyHideout4.IsDead then
|
|
TheSpy.EnterTransport(SpyHideout4)
|
|
end
|
|
end)
|
|
end)
|
|
|
|
WorldLoaded = function()
|
|
USSR = Player.GetPlayer("USSR")
|
|
England = Player.GetPlayer("England")
|
|
Greece = Player.GetPlayer("Greece")
|
|
|
|
Camera.Position = Playerbase.CenterPosition
|
|
IntroSequence()
|
|
|
|
InitObjectives(USSR)
|
|
AlliedObjective = AddPrimaryObjective(England, "")
|
|
SovietObjective1 = AddPrimaryObjective(USSR, "kill-enemy-spy")
|
|
SovietObjective2 = AddSecondaryObjective(USSR, "clear-farm-reinforcements")
|
|
SovietObjective3 = AddSecondaryObjective(USSR, "scavenge-civilian-buildings")
|
|
end
|
|
|
|
Trigger.OnKilled(TheSpy, function()
|
|
USSR.MarkCompletedObjective(SovietObjective1)
|
|
end)
|
|
|
|
Tick = function()
|
|
Trigger.AfterDelay(DateTime.Seconds(12), function()
|
|
if USSR.HasNoRequiredUnits() then
|
|
England.MarkCompletedObjective(AlliedObjective)
|
|
end
|
|
end)
|
|
if not SpyHideout4.IsDead and SpyHideout4.HasPassengers then
|
|
SpyReachedHideout4 = true
|
|
end
|
|
if RemainingTime == DateTime.Minutes(5) and Difficulty ~= "hard" then
|
|
Media.PlaySpeechNotification(USSR, "WarningFiveMinutesRemaining")
|
|
elseif RemainingTime == DateTime.Minutes(4) then
|
|
Media.PlaySpeechNotification(USSR, "WarningFourMinutesRemaining")
|
|
elseif RemainingTime == DateTime.Minutes(3) then
|
|
Media.PlaySpeechNotification(USSR, "WarningThreeMinutesRemaining")
|
|
elseif RemainingTime == DateTime.Minutes(2) then
|
|
Media.PlaySpeechNotification(USSR, "WarningTwoMinutesRemaining")
|
|
elseif RemainingTime == DateTime.Minutes(1) then
|
|
Media.PlaySpeechNotification(USSR, "WarningOneMinuteRemaining")
|
|
end
|
|
if RemainingTime > 0 and TimerStarted then
|
|
if (RemainingTime % DateTime.Seconds(1)) == 0 then
|
|
Timer = UserInterface.GetFluentMessage("time-remaining", { ["time"] = Utils.FormatTime(RemainingTime) })
|
|
UserInterface.SetMissionText(Timer, USSR.Color)
|
|
end
|
|
RemainingTime = RemainingTime - 1
|
|
elseif RemainingTime == 0 and not SpyReachedHideout4 then
|
|
UserInterface.SetMissionText("")
|
|
England.MarkCompletedObjective(AlliedObjective)
|
|
elseif RemainingTime == 0 and SpyReachedHideout4 then
|
|
UserInterface.SetMissionText("")
|
|
SpyHelicopterEscape()
|
|
end
|
|
end
|