Initial commit: OpenRA game engine
Fork from OpenRA/OpenRA with one-click launch script (start-ra.cmd) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
327
mods/ra/maps/allies-10b/allies10b.lua
Normal file
327
mods/ra/maps/allies-10b/allies10b.lua
Normal file
@@ -0,0 +1,327 @@
|
||||
--[[
|
||||
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.GetFluentMessage("flame-turret-deactivated"), UserInterface.GetFluentMessage("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.GetFluentMessage("nuclear-missile-deactivated"), UserInterface.GetFluentMessage("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.GetFluentMessage("nuclear-missile-deactivated"), UserInterface.GetFluentMessage("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.GetFluentMessage("nuclear-missile-deactivated"), UserInterface.GetFluentMessage("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.GetFluentMessage("nuclear-missile-deactivated"), UserInterface.GetFluentMessage("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.GetFluentMessage("reach-target-in", { ["time"] = Utils.FormatTime(Ticked) })
|
||||
UserInterface.SetMissionText(timer, USSR.Color)
|
||||
end
|
||||
Ticked = Ticked - 1
|
||||
elseif Ticked == 0 then
|
||||
FinishedTimer = UserInterface.GetFluentMessage("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
|
||||
Reference in New Issue
Block a user