328 lines
11 KiB
Lua
328 lines
11 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.
|
|
]]
|
|
Engineers = { Engi1, Engi2, Engi3 }
|
|
TopLeftConsole = { CPos.New(49, 38), CPos.New(50, 38) }
|
|
BottomLeftConsole = { CPos.New(48, 93) }
|
|
TopRightConsole = { CPos.New(75, 40), CPos.New(76, 40) }
|
|
MiddleRightConsole = { CPos.New(81, 72), CPos.New(82, 72) }
|
|
TanyaFootprint = { CPos.New(71, 98), CPos.New(72, 98), CPos.New(73, 98), CPos.New(74, 98), CPos.New(87, 101), CPos.New(88, 101) }
|
|
GrenTeamFootprint = { CPos.New(53, 69), CPos.New(54, 69), CPos.New(55, 69) }
|
|
FlamerTeamFootprint = { CPos.New(74, 61), CPos.New(75, 61), CPos.New(76, 61) }
|
|
TimerTicks = DateTime.Minutes(26)
|
|
Scientists = { Scientist1, Scientist2, Scientist3, Scientist4, Scientist5, Scientist6, Scientist7, Scientist8, Scientist9, Scientist10 }
|
|
StartingRifles = { StartRifle1, StartRifle2, StartRifle3, StartRifle4, StartRifle5 }
|
|
AssaultTeamA = { AssaultTeamA1, AssaultTeamA2, AssaultTeamA3 }
|
|
AssaultTeamB = { AssaultTeamB1, AssaultTeamB2, AssaultTeamB3 }
|
|
AssaultTeamC = { AssaultTeamC1, AssaultTeamC2, AssaultTeamC3 }
|
|
PatrolSupport = { PatrolSupport1, PatrolSupport2, PatrolSupport3, PatrolSupport4, PatrolSupport5, PatrolSupport6 }
|
|
BarrelSquad = { BarrelSquad1, BarrelSquad2, BarrelSquad3, BarrelSquad4, BarrelSquad5 }
|
|
ScientistConsoles = { NWSilo1.Location, NWSilo2.Location, NESilo1.Location, NESilo2.Location, SESilo1.Location, SESilo2.Location, SWSilo1.Location, SWSilo2.Location }
|
|
ExplosionCheckTeam = { CheckTeam1, CheckTeam2, CheckTeam3, CheckTeam4, CheckTeam5 }
|
|
|
|
OpeningMoves = function()
|
|
Utils.Do(StartingRifles, function(a)
|
|
a.AttackMove(DefaultCameraPosition.Location)
|
|
end)
|
|
|
|
Utils.Do(Scientists, ScientistPatrol)
|
|
GroupPatrol(PatrolA, PatrolAPath, DateTime.Seconds(5))
|
|
GroupPatrol(PatrolB, PatrolBPath, DateTime.Seconds(5))
|
|
|
|
Trigger.OnKilled(StartRifle1, function()
|
|
Utils.Do(AssaultTeamA, function(a)
|
|
IdleHunt(a)
|
|
end)
|
|
end)
|
|
Trigger.OnKilled(StartRifle2, function()
|
|
Utils.Do(AssaultTeamB, function(b)
|
|
IdleHunt(b)
|
|
end)
|
|
end)
|
|
Trigger.OnKilled(StartRifle3, function()
|
|
Utils.Do(AssaultTeamC, function(c)
|
|
IdleHunt(c)
|
|
end)
|
|
end)
|
|
end
|
|
|
|
ScientistPatrol = function(scientist)
|
|
Trigger.OnIdle(scientist, function(sci)
|
|
sci.Move(Utils.Random(ScientistConsoles))
|
|
end)
|
|
end
|
|
|
|
PatrolA = { PatrolA1, PatrolA2, PatrolA3, PatrolA4 }
|
|
PatrolB = { PatrolB1, PatrolB2, PatrolB3, PatrolB4 }
|
|
PatrolAPath = { PatrolARally1.Location, PatrolARally2.Location, PatrolARally3.Location, PatrolARally4.Location }
|
|
PatrolBPath = { PatrolBRally1.Location, PatrolBRally2.Location, PatrolBRally3.Location, PatrolBRally4.Location }
|
|
|
|
GroupPatrol = function(units, waypoints, delay)
|
|
local i = 1
|
|
local stop = false
|
|
|
|
Utils.Do(units, function(unit)
|
|
Trigger.OnIdle(unit, function()
|
|
if stop then
|
|
return
|
|
end
|
|
|
|
if unit.Location == waypoints[i] then
|
|
local bool = Utils.All(units, function(actor) return actor.IsIdle end)
|
|
|
|
if bool then
|
|
stop = true
|
|
|
|
i = i + 1
|
|
if i > #waypoints then
|
|
i = 1
|
|
end
|
|
|
|
Trigger.AfterDelay(delay, function() stop = false end)
|
|
end
|
|
else
|
|
unit.AttackMove(waypoints[i])
|
|
end
|
|
end)
|
|
end)
|
|
end
|
|
|
|
MiscTriggers = function()
|
|
Trigger.OnAnyKilled(Scientists, function()
|
|
Greece.MarkFailedObjective(Paperclip)
|
|
end)
|
|
|
|
Trigger.OnEnteredProximityTrigger(FlameTowerConsole.CenterPosition, WDist.FromCells(1), function(actor, id)
|
|
if actor.Owner == Greece then
|
|
Trigger.RemoveProximityTrigger(id)
|
|
if not FlameTower.IsDead then
|
|
Media.PlaySoundNotification(Greece, "AlertBleep")
|
|
Media.DisplayMessage(UserInterface.Translate("flame-turret-deactivated"), UserInterface.Translate("console"))
|
|
FlameTower.Kill()
|
|
end
|
|
end
|
|
end)
|
|
|
|
Trigger.OnKilled(TankBarrel, function()
|
|
if not BarrelTank.IsDead then
|
|
BarrelTank.Kill()
|
|
end
|
|
end)
|
|
|
|
Trigger.OnKilled(CheckBarrel, function()
|
|
Utils.Do(ExplosionCheckTeam, function(a)
|
|
if not a.IsDead then
|
|
IdleHunt(a)
|
|
end
|
|
end)
|
|
end)
|
|
|
|
Trigger.OnKilled(SquadBarrel, function()
|
|
Utils.Do(BarrelSquad, function(b)
|
|
if not b.IsDead then
|
|
IdleHunt(b)
|
|
end
|
|
end)
|
|
end)
|
|
|
|
Trigger.OnAnyKilled(PatrolA, function()
|
|
Utils.Do(PatrolSupport, function(sup)
|
|
if not sup.IsDead then
|
|
IdleHunt(sup)
|
|
end
|
|
end)
|
|
end)
|
|
|
|
local grensTriggered
|
|
Trigger.OnEnteredFootprint(GrenTeamFootprint, function(actor, id)
|
|
if actor.Owner == Greece and not grensTriggered then
|
|
Trigger.RemoveFootprintTrigger(id)
|
|
grensTriggered = true
|
|
|
|
Trigger.AfterDelay(DateTime.Minutes(1), function()
|
|
local grens = Reinforcements.Reinforce(USSR, { "e2", "e2", "e2", "e2", "e2" }, { BunkerEntryWest.Location}, 0)
|
|
Utils.Do(grens, IdleHunt)
|
|
end)
|
|
end
|
|
end)
|
|
|
|
local flamersTriggered
|
|
Trigger.OnEnteredFootprint(FlamerTeamFootprint, function(actor, id)
|
|
if actor.Owner == Greece and not flamersTriggered then
|
|
Trigger.RemoveFootprintTrigger(id)
|
|
flamersTriggered = true
|
|
|
|
Trigger.AfterDelay(DateTime.Minutes(1), function()
|
|
local flamers = Reinforcements.Reinforce(USSR, { "e1", "e1", "e4", "e4", "e4" }, { BunkerEntryEast.Location}, 0)
|
|
Utils.Do(flamers, IdleHunt)
|
|
end)
|
|
end
|
|
end)
|
|
|
|
local dogsTriggered
|
|
Trigger.OnEnteredFootprint(TanyaFootprint, function(actor, id)
|
|
if actor.Type == "e7.noautotarget" and not dogsTriggered then
|
|
Trigger.RemoveFootprintTrigger(id)
|
|
dogsTriggered = true
|
|
|
|
local dogs = Reinforcements.Reinforce(USSR, { "dog", "dog", "dog", "dog", "dog" }, { BunkerEntryEast.Location}, 0)
|
|
Utils.Do(dogs, IdleHunt)
|
|
end
|
|
end)
|
|
end
|
|
|
|
TanyaSequence = function()
|
|
local tanyaTriggered
|
|
Trigger.OnEnteredFootprint(TanyaFootprint, function(actor, id)
|
|
if actor.Owner == Greece and not tanyaTriggered then
|
|
Trigger.RemoveFootprintTrigger(id)
|
|
tanyaTriggered = true
|
|
|
|
IdleHunt(TankRoomDog)
|
|
local tankCam = Actor.Create("camera", true, { Owner = Greece, Location = TankRoomCam.Location })
|
|
Media.PlaySoundNotification(Greece, "laugh")
|
|
Trigger.AfterDelay(DateTime.Seconds(1), function()
|
|
local victim1 = Reinforcements.Reinforce(USSR, { "e2" }, { TanyaEntry.Location, DiePoint1.Location })
|
|
Trigger.OnIdle(victim1[1], function(one)
|
|
Media.PlaySound("gun5.aud")
|
|
one.Kill("BulletDeath")
|
|
end)
|
|
end)
|
|
Trigger.AfterDelay(DateTime.Seconds(3), function()
|
|
local victim2 = Reinforcements.Reinforce(USSR, { "e2" }, { GrenEntry.Location, DiePoint2.Location })
|
|
Trigger.OnIdle(victim2[1], function(two)
|
|
two.Kill("BulletDeath")
|
|
Media.PlaySound("gun5.aud")
|
|
end)
|
|
end)
|
|
Trigger.AfterDelay(DateTime.Seconds(6), function()
|
|
local tanya = Reinforcements.Reinforce(Greece, { "e7.noautotarget" }, { TanyaEntry.Location, TankRoomCam.Location })
|
|
TanyaArrived = true
|
|
TanyaSurvive = AddPrimaryObjective(Greece, "tanya-survive")
|
|
Media.PlaySoundNotification(Greece, "lefty")
|
|
Trigger.OnKilled(tanya[1], function()
|
|
Greece.MarkFailedObjective(TanyaSurvive)
|
|
end)
|
|
end)
|
|
Trigger.AfterDelay(DateTime.Minutes(1), function()
|
|
tankCam.Destroy()
|
|
end)
|
|
end
|
|
end)
|
|
end
|
|
|
|
TanyaObjectiveCheck = function()
|
|
if TanyaArrived then
|
|
Greece.MarkCompletedObjective(TanyaSurvive)
|
|
end
|
|
end
|
|
|
|
DeactivateMissiles = function()
|
|
Trigger.OnAllKilled(Engineers, function()
|
|
Greece.MarkFailedObjective(StopNukes)
|
|
end)
|
|
|
|
Trigger.OnEnteredFootprint(TopLeftConsole, function(actor, id)
|
|
if actor.Type == "e6" and not TopLeftTriggered then
|
|
Trigger.RemoveFootprintTrigger(id)
|
|
TopLeftTriggered = true
|
|
Media.PlaySpeechNotification(Greece, "ControlCenterDeactivated")
|
|
Media.DisplayMessage(UserInterface.Translate("nuclear-missile-deactivated"), UserInterface.Translate("console"))
|
|
end
|
|
end)
|
|
|
|
Trigger.OnEnteredFootprint(BottomLeftConsole, function(actor, id)
|
|
if actor.Type == "e6" and not BottomLeftTriggered then
|
|
Trigger.RemoveFootprintTrigger(id)
|
|
BottomLeftTriggered = true
|
|
Media.PlaySpeechNotification(Greece, "ControlCenterDeactivated")
|
|
Media.DisplayMessage(UserInterface.Translate("nuclear-missile-deactivated"), UserInterface.Translate("console"))
|
|
end
|
|
end)
|
|
|
|
Trigger.OnEnteredFootprint(TopRightConsole, function(actor, id)
|
|
if actor.Type == "e6" and not TopRightTriggered then
|
|
Trigger.RemoveFootprintTrigger(id)
|
|
TopRightTriggered = true
|
|
Media.PlaySpeechNotification(Greece, "ControlCenterDeactivated")
|
|
Media.DisplayMessage(UserInterface.Translate("nuclear-missile-deactivated"), UserInterface.Translate("console"))
|
|
end
|
|
end)
|
|
|
|
Trigger.OnEnteredFootprint(MiddleRightConsole, function(actor, id)
|
|
if actor.Type == "e6" and not MiddleRightTriggered then
|
|
Trigger.RemoveFootprintTrigger(id)
|
|
MiddleRightTriggered = true
|
|
Media.PlaySpeechNotification(Greece, "ControlCenterDeactivated")
|
|
Media.DisplayMessage(UserInterface.Translate("nuclear-missile-deactivated"), UserInterface.Translate("console"))
|
|
end
|
|
end)
|
|
end
|
|
|
|
Ticked = TimerTicks
|
|
Tick = function()
|
|
if Greece.HasNoRequiredUnits() then
|
|
Greece.MarkFailedObjective(StopNukes)
|
|
end
|
|
|
|
if TopLeftTriggered and BottomLeftTriggered and TopRightTriggered and MiddleRightTriggered then
|
|
Greece.MarkCompletedObjective(StopNukes)
|
|
Greece.MarkCompletedObjective(Paperclip)
|
|
TanyaObjectiveCheck()
|
|
end
|
|
|
|
if Ticked > 0 then
|
|
if Ticked % DateTime.Seconds(1) == 0 then
|
|
local timer = UserInterface.Translate("reach-target-in", { ["time"] = Utils.FormatTime(Ticked) })
|
|
UserInterface.SetMissionText(timer, USSR.Color)
|
|
end
|
|
Ticked = Ticked - 1
|
|
elseif Ticked == 0 then
|
|
FinishedTimer = UserInterface.Translate("we-are-too-late")
|
|
UserInterface.SetMissionText(FinishedTimer, USSR.Color)
|
|
Greece.MarkFailedObjective(StopNukes)
|
|
end
|
|
end
|
|
|
|
WorldLoaded = function()
|
|
Greece = Player.GetPlayer("Greece")
|
|
USSR = Player.GetPlayer("USSR")
|
|
BadGuy = Player.GetPlayer("BadGuy")
|
|
|
|
InitObjectives(Greece)
|
|
|
|
KillGreece = USSR.AddObjective("")
|
|
StopNukes = AddPrimaryObjective(Greece, "get-engineers-to-consoles")
|
|
Paperclip = AddSecondaryObjective(Greece, "spare-the-scientists")
|
|
|
|
Trigger.AfterDelay(DateTime.Minutes(6), function()
|
|
Media.PlaySpeechNotification(Greece, "TwentyMinutesRemaining")
|
|
end)
|
|
Trigger.AfterDelay(DateTime.Minutes(16), function()
|
|
Media.PlaySpeechNotification(Greece, "TenMinutesRemaining")
|
|
end)
|
|
Trigger.AfterDelay(DateTime.Minutes(21), function()
|
|
Media.PlaySpeechNotification(Greece, "WarningFiveMinutesRemaining")
|
|
end)
|
|
Trigger.AfterDelay(DateTime.Minutes(23), function()
|
|
Media.PlaySpeechNotification(Greece, "WarningThreeMinutesRemaining")
|
|
end)
|
|
Trigger.AfterDelay(DateTime.Minutes(25), function()
|
|
Media.PlaySpeechNotification(Greece, "WarningOneMinuteRemaining")
|
|
end)
|
|
|
|
Camera.Position = DefaultCameraPosition.CenterPosition
|
|
Spy1.DisguiseAsType("e1", USSR)
|
|
Spy2.DisguiseAsType("e1", USSR)
|
|
TimerColor = USSR.Color
|
|
DeactivateMissiles()
|
|
TanyaSequence()
|
|
OpeningMoves()
|
|
MiscTriggers()
|
|
end
|