Files
OpenRA/mods/ra/maps/sarin-gas-2-down-under/downunder.lua
2021-05-22 23:29:42 +02:00

499 lines
16 KiB
Lua

--[[
Copyright 2007-2020 The OpenRA Developers (see AUTHORS)
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.
]]
TanyaFreed = false
TruckStolen = false
SovietImportantGuys = { Officer3, Officer2, Officer1, Scientist1, Scientist2 }
Camera1Towers = { FlameTower2, FlameTower3 }
TruckExit = { TruckDrive1, TruckDrive2 }
TruckEntry = { TruckDrive3.Location, TruckDrive4.Location, TruckDrive5.Location }
TruckType = { "truk" }
DogCrew = { DogCrew1, DogCrew2, DogCrew3 }
SarinVictims = { SarinVictim1, SarinVictim2, SarinVictim3, SarinVictim4, SarinVictim5, SarinVictim6, SarinVictim7, SarinVictim8, SarinVictim9, SarinVictim10, SarinVictim11, SarinVictim12, SarinVictim13 }
Camera2Team = { Camera2Rifle1, Camera2Rifle2, Camera2Rifle3, Camera2Gren1, Camera2Gren2 }
PrisonAlarm = { CPos.New(55,75), CPos.New(55,76), CPos.New(55,77), CPos.New(55,81), CPos.New(55,82), CPos.New(55,83), CPos.New(60,77), CPos.New(60,81), CPos.New(60,82), CPos.New(60,83) }
GuardDogs = { PrisonDog1, PrisonDog2, PrisonDog3, PrisonDog4 }
TanyaTowers = { FlameTowerTanya1, FlameTowerTanya2 }
ExecutionArea = { CPos.New(91, 70), CPos.New(92, 70), CPos.New(93, 70), CPos.New(94, 70) }
FiringSquad = { FiringSquad1, FiringSquad2, FiringSquad3, FiringSquad4, FiringSquad5, Officer2 }
DemoTeam = { DemoDog, DemoRifle1, DemoRifle2, DemoRifle3, DemoRifle4, DemoFlame }
DemoTruckPath = { DemoDrive1, DemoDrive2, DemoDrive3, DemoDrive4 }
WinTriggerArea = { CPos.New(111, 59), CPos.New(111, 60), CPos.New(111, 61), CPos.New(111, 62), CPos.New(111, 63), CPos.New(111, 64), CPos.New(111, 65) }
ObjectiveTriggers = function()
Trigger.OnEnteredFootprint(WinTriggerArea, function(a, id)
if not EscapeGoalTrigger and a.Owner == greece then
EscapeGoalTrigger = true
greece.MarkCompletedObjective(ExitBase)
if Map.LobbyOption("difficulty") == "hard" then
greece.MarkCompletedObjective(NoCasualties)
end
if not TanyaFreed then
greece.MarkFailedObjective(FreeTanya)
else
greece.MarkCompletedObjective(FreeTanya)
end
end
end)
Trigger.OnKilled(Tanya, function()
greece.MarkFailedObjective(FreeTanya)
end)
Trigger.OnAllKilled(TanyaTowers, function()
TanyaFreed = true
if not Tanya.IsDead then
Media.PlaySpeechNotification(greece, "TanyaRescued")
Tanya.Owner = greece
end
end)
Trigger.OnAllKilled(SovietImportantGuys, function()
greece.MarkCompletedObjective(KillVIPs)
end)
Trigger.OnInfiltrated(WarFactory2, function()
if not StealMammoth.IsDead or StealMammoth.Owner == ussr then
greece.MarkCompletedObjective(StealTank)
StealMammoth.Owner = greece
end
end)
end
ConsoleTriggers = function()
Trigger.OnEnteredProximityTrigger(Terminal1.CenterPosition, WDist.FromCells(1), function(actor, id)
if actor.Owner == greece then
Trigger.RemoveProximityTrigger(id)
if not FlameTower1.IsDead then
Media.DisplayMessage("Flame Turret deactivated", "Console")
FlameTower1.Kill()
end
end
end)
Trigger.OnEnteredProximityTrigger(Terminal2.CenterPosition, WDist.FromCells(1), function(actor, id)
if actor.Owner == greece then
Trigger.RemoveProximityTrigger(id)
if not FlameTower2.IsDead then
Media.DisplayMessage("Flame Turret deactivated", "Console")
FlameTower2.Kill()
end
end
end)
Trigger.OnEnteredProximityTrigger(Terminal3.CenterPosition, WDist.FromCells(1), function(actor, id)
if actor.Owner == greece then
Trigger.RemoveProximityTrigger(id)
if not FlameTower3.IsDead then
Media.DisplayMessage("Flame Turret deactivated", "Console")
FlameTower3.Kill()
end
end
end)
local gasActive
Trigger.OnEnteredProximityTrigger(Terminal4.CenterPosition, WDist.FromCells(1), function(actor, id)
if actor.Owner == greece and not gasActive then
Trigger.RemoveProximityTrigger(id)
gasActive = true
Media.DisplayMessage("Sarin Nerve Gas dispensers activated", "Console")
local KillCamera = Actor.Create("camera", true, { Owner = greece, Location = Sarin2.Location })
local flare1 = Actor.Create("flare", true, { Owner = england, Location = Sarin1.Location })
local flare2 = Actor.Create("flare", true, { Owner = england, Location = Sarin2.Location })
local flare3 = Actor.Create("flare", true, { Owner = england, Location = Sarin3.Location })
local flare4 = Actor.Create("flare", true, { Owner = england, Location = Sarin4.Location })
Trigger.AfterDelay(DateTime.Seconds(4), function()
Utils.Do(SarinVictims, function(actor)
if not actor.IsDead then
actor.Kill("ExplosionDeath")
end
end)
end)
Trigger.AfterDelay(DateTime.Seconds(20), function()
flare1.Destroy()
flare2.Destroy()
flare3.Destroy()
flare4.Destroy()
KillCamera.Destroy()
end)
end
end)
Trigger.OnEnteredProximityTrigger(Terminal5.CenterPosition, WDist.FromCells(1), function(actor, id)
if actor.Owner == greece then
Trigger.RemoveProximityTrigger(id)
if not BadCoil.IsDead then
Media.DisplayMessage("Tesla Coil deactivated", "Console")
BadCoil.Kill()
end
end
end)
local teslaActive
Trigger.OnEnteredProximityTrigger(Terminal6.CenterPosition, WDist.FromCells(1), function(actor, id)
if actor.Owner == greece and not teslaActive then
Trigger.RemoveProximityTrigger(id)
teslaActive = true
Media.DisplayMessage("Initialising Tesla Coil defence", "Console")
local tesla1 = Actor.Create("tsla", true, { Owner = turkey, Location = TurkeyCoil1.Location })
local tesla2 = Actor.Create("tsla", true, { Owner = turkey, Location = TurkeyCoil2.Location })
Trigger.AfterDelay(DateTime.Seconds(10), function()
if not tesla1.IsDead then
tesla1.Kill()
end
if not tesla2.IsDead then
tesla2.Kill()
end
end)
end
end)
Trigger.OnEnteredProximityTrigger(Terminal7.CenterPosition, WDist.FromCells(1), function(actor, id)
if actor.Owner == greece then
Trigger.RemoveProximityTrigger(id)
if not FlameTowerTanya1.IsDead then
Media.DisplayMessage("Flame Turret deactivated", "Console")
FlameTowerTanya1.Kill()
end
if not FlameTowerTanya2.IsDead then
Media.DisplayMessage("Flame Turret deactivated", "Console")
FlameTowerTanya2.Kill()
end
end
end)
Trigger.OnEnteredProximityTrigger(Terminal8.CenterPosition, WDist.FromCells(1), function(actor, id)
if actor.Owner == greece then
Trigger.RemoveProximityTrigger(id)
if not FlameTowerExit1.IsDead then
Media.DisplayMessage("Flame Turret deactivated", "Console")
FlameTowerExit1.Kill()
end
if not FlameTowerExit3.IsDead then
Media.DisplayMessage("Flame Turret deactivated", "Console")
FlameTowerExit3.Kill()
end
end
end)
end
CameraTriggers = function()
Trigger.AfterDelay(DateTime.Seconds(1), function()
local startCamera = Actor.Create("camera", true, { Owner = greece, Location = start.Location })
Trigger.AfterDelay(DateTime.Seconds(10), function()
startCamera.Destroy()
end)
end)
local cam1Triggered
Trigger.OnEnteredProximityTrigger(CameraTrigger1.CenterPosition, WDist.FromCells(8), function(actor, id)
if actor.Owner == greece and not cam1Triggered then
Trigger.RemoveProximityTrigger(id)
cam1Triggered = true
local camera1 = Actor.Create("camera", true, { Owner = greece, Location = CameraTrigger1.Location })
Trigger.OnAllKilled(Camera1Towers, function()
camera1.Destroy()
end)
end
end)
local cam2Triggered
Trigger.OnEnteredProximityTrigger(CameraTrigger2.CenterPosition, WDist.FromCells(8), function(actor, id)
if actor.Owner == greece and not cam2Triggered then
Trigger.RemoveProximityTrigger(id)
cam2Triggered = true
local camera2 = Actor.Create("camera", true, { Owner = greece, Location = CameraTrigger2.Location })
Utils.Do(Camera2Team, function(actor)
actor.AttackMove(CameraTrigger1.Location)
end)
Trigger.AfterDelay(DateTime.Seconds(10), function()
camera2.Destroy()
end)
end
end)
local cam3Triggered
Trigger.OnEnteredProximityTrigger(CameraTrigger3.CenterPosition, WDist.FromCells(8), function(actor, id)
if actor.Owner == greece and not cam3Triggered then
Trigger.RemoveProximityTrigger(id)
cam3Triggered = true
local camera3 = Actor.Create("camera", true, { Owner = greece, Location = CameraTrigger3.Location })
Actor.Create("apwr", true, { Owner = france, Location = PowerPlantSpawn1.Location })
Actor.Create("apwr", true, { Owner = germany, Location = PowerPlantSpawn2.Location })
if not Mammoth1.IsDead then
Mammoth1.AttackMove(MammothGo.Location)
end
Trigger.OnKilled(Mammoth1, function()
GoodCoil.Kill()
camera3.Destroy()
end)
end
end)
local cam4Triggered
Trigger.OnEnteredProximityTrigger(CameraTrigger4.CenterPosition, WDist.FromCells(9), function(actor, id)
if actor.Owner == greece and not cam4Triggered then
Trigger.RemoveProximityTrigger(id)
cam4Triggered = true
local camera4 = Actor.Create("camera", true, { Owner = greece, Location = CameraTrigger4.Location })
Trigger.OnKilled(Mammoth2, function()
camera4.Destroy()
end)
end
end)
local cam5Triggered
Trigger.OnEnteredProximityTrigger(CameraTrigger5.CenterPosition, WDist.FromCells(8), function(actor, id)
if actor.Owner == greece and not cam5Triggered then
Trigger.RemoveProximityTrigger(id)
cam5Triggered = true
local camera5 = Actor.Create("camera", true, { Owner = greece, Location = CameraTrigger5.Location })
Trigger.AfterDelay(DateTime.Seconds(10), function()
camera5.Destroy()
end)
end
end)
local cam6Triggered
Trigger.OnEnteredProximityTrigger(CameraTrigger6.CenterPosition, WDist.FromCells(11), function(actor, id)
if actor.Owner == greece and not cam6Triggered then
Trigger.RemoveProximityTrigger(id)
cam6Triggered = true
Actor.Create("camera", true, { Owner = greece, Location = CameraTrigger6.Location })
end
end)
local executionTriggered
Trigger.OnEnteredFootprint(ExecutionArea, function(actor, id)
if actor.Owner == greece and not executionTriggered then
Trigger.RemoveFootprintTrigger(id)
executionTriggered = true
local camera7 = Actor.Create("camera", true, { Owner = greece, Location = CameraTrigger7.Location })
Trigger.AfterDelay(DateTime.Seconds(25), function()
camera7.Destroy()
end)
ScientistExecution()
end
end)
end
TruckSteal = function()
Trigger.OnInfiltrated(WarFactory1, function()
if not TruckStolen and not StealTruck.IsDead then
TruckStolen = true
local truckSteal1 = Actor.Create("camera", true, { Owner = greece, Location = TruckDrive1.Location })
Trigger.AfterDelay(DateTime.Seconds(10), function()
truckSteal1.Destroy()
end)
Utils.Do(TruckExit, function(waypoint)
StealTruck.Move(waypoint.Location)
end)
end
end)
local trukDestroyed
Trigger.OnEnteredFootprint({ TruckDrive2.Location }, function(actor, id)
if actor.Type == "truk" and not trukDestroyed then
Trigger.RemoveFootprintTrigger(id)
trukDestroyed = true
actor.Destroy()
Trigger.AfterDelay(DateTime.Seconds(3), function()
SpyTruckDrive()
end)
end
end)
end
SpyTruckDrive = function()
StealTruck = Reinforcements.Reinforce(ussr, TruckType, TruckEntry)
local truckSteal2 = Actor.Create("camera", true, { Owner = greece, Location = TruckCamera.Location })
Trigger.AfterDelay(DateTime.Seconds(10), function()
truckSteal2.Destroy()
end)
local spyCreated
Trigger.OnEnteredFootprint({ TruckDrive5.Location }, function(actor, id)
if actor.Type == "truk" and not spyCreated then
Trigger.RemoveFootprintTrigger(id)
spyCreated = true
Spy = Actor.Create("spy", true, { Owner = greece, Location = TruckDrive5.Location })
Spy.DisguiseAsType("e1", ussr)
Spy.Move(SpyMove.Location)
local dogCrewCamera = Actor.Create("camera", true, { Owner = greece, Location = DoggyCam.Location })
Trigger.AfterDelay(DateTime.Seconds(10), function()
dogCrewCamera.Destroy()
end)
Utils.Do(DogCrew, function(actor)
if not actor.IsDead then
actor.AttackMove(DoggyMove.Location)
end
end)
end
end)
end
PrisonEscape = function()
local alarmed
Trigger.OnEnteredFootprint(PrisonAlarm, function(unit, id)
if alarmed then
return
end
alarmed = true
Trigger.RemoveFootprintTrigger(id)
Media.DisplayMessage("Warning, prisoners are attempting to escape!", "Intercom")
Media.PlaySoundNotification(greece, "AlertBuzzer")
Utils.Do(GuardDogs, IdleHunt)
end)
end
ScientistExecution = function()
Media.PlaySoundNotification(greece, "AlertBleep")
Media.DisplayMessage("The base is compromised. We have to hurry the execution!", "Soviet Officer")
Utils.Do(DemoTeam, function(actor)
actor.AttackMove(DemoDrive2.Location)
end)
Trigger.OnAllKilled(FiringSquad, function()
if not ScientistMan.IsDead then
ScientistRescued()
end
end)
Trigger.AfterDelay(DateTime.Seconds(7), function()
if not Officer2.IsDead then
Media.DisplayMessage("Prepare to Fire!", "Soviet Officer")
end
end)
Trigger.AfterDelay(DateTime.Seconds(15), function()
if not Officer2.IsDead then
Media.DisplayMessage("Fire!", "Soviet Officer")
end
Utils.Do(FiringSquad, function(actor)
if not actor.IsDead then
actor.Attack(ScientistMan, true, true)
end
end)
end)
end
ScientistRescued = function()
Media.DisplayMessage("Thanks for the rescue!", "Scientist")
Trigger.AfterDelay(DateTime.Seconds(5), function()
if not ScientistMan.IsDead and not DemoTruck.IsDead then
Media.DisplayMessage("The Soviets have an unstable nuclear device stored here. \n I need to move it out of the facility!", "Scientist")
DemoTruck.GrantCondition("mission")
ScientistMan.EnterTransport(DemoTruck)
end
end)
Trigger.OnRemovedFromWorld(ScientistMan, DemoTruckExit)
end
DemoTruckExit = function()
if ScientistMan.IsDead then
return
end
Media.DisplayMessage("I hope the exit is clear!", "Scientist")
Utils.Do(DemoTruckPath, function(waypoint)
DemoTruck.Move(waypoint.Location)
end)
local trukEscaped
Trigger.OnEnteredFootprint({ DemoDrive4.Location }, function(actor, id)
if actor.Type == "dtrk" and not trukEscaped then
Trigger.RemoveFootprintTrigger(id)
trukEscaped = true
actor.Destroy()
end
end)
end
AcceptableLosses = 0
Tick = function()
if greece.HasNoRequiredUnits() then
greece.MarkFailedObjective(ExitBase)
end
if Map.LobbyOption("difficulty") == "hard" and greece.UnitsLost > AcceptableLosses then
greece.MarkFailedObjective(NoCasualties)
end
end
WorldLoaded = function()
greece = Player.GetPlayer("Greece")
england = Player.GetPlayer("England")
turkey = Player.GetPlayer("Turkey")
ussr = Player.GetPlayer("USSR")
france = Player.GetPlayer("France")
germany = Player.GetPlayer("Germany")
Trigger.OnObjectiveAdded(greece, function(p, id)
Media.DisplayMessage(p.GetObjectiveDescription(id), "New " .. string.lower(p.GetObjectiveType(id)) .. " objective")
end)
ussrObj = ussr.AddObjective("Defeat the Allies.")
ExitBase = greece.AddObjective("Reach the eastern exit of the facility.")
FreeTanya = greece.AddObjective("Free Tanya and keep her alive.")
KillVIPs = greece.AddObjective("Kill all Soviet officers and scientists.", "Secondary", false)
StealTank = greece.AddObjective("Steal a Soviet mammoth tank.", "Secondary", false)
if Map.LobbyOption("difficulty") == "hard" then
NoCasualties = greece.AddPrimaryObjective("Do not lose a single soldier or civilian\nunder your command.")
end
Trigger.OnObjectiveCompleted(greece, function(p, id)
Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective completed")
end)
Trigger.OnObjectiveFailed(greece, function(p, id)
Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective failed")
end)
Trigger.OnPlayerLost(greece, function()
Media.PlaySpeechNotification(greece, "Lose")
end)
Trigger.OnPlayerWon(greece, function()
Media.PlaySpeechNotification(greece, "Win")
end)
StartSpy.DisguiseAsType("e1", ussr)
StartAttacker1.AttackMove(start.Location)
StartAttacker2.AttackMove(start.Location)
Camera.Position = start.CenterPosition
ObjectiveTriggers()
ConsoleTriggers()
CameraTriggers()
TruckSteal()
PrisonEscape()
end