Files
OpenRA/mods/ra/maps/sarin-gas-2-down-under/downunder.lua
2019-03-28 13:14:35 +01:00

454 lines
16 KiB
Lua

--[[
Copyright 2007-2019 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
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, trigger1)
if actor.Owner == greece then
Trigger.RemoveProximityTrigger(trigger1)
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, trigger2)
if actor.Owner == greece then
Trigger.RemoveProximityTrigger(trigger2)
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, trigger3)
if actor.Owner == greece then
Trigger.RemoveProximityTrigger(trigger3)
if not FlameTower3.IsDead then
Media.DisplayMessage("Flame Turret deactivated", "Console")
FlameTower3.Kill()
end
end
end)
Trigger.OnEnteredProximityTrigger(Terminal4.CenterPosition, WDist.FromCells(1), function(actor, trigger4)
if actor.Owner == greece then
Trigger.RemoveProximityTrigger(trigger4)
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()
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, trigger5)
if actor.Owner == greece then
Trigger.RemoveProximityTrigger(trigger5)
if not BadCoil.IsDead then
Media.DisplayMessage("Tesla Coil deactivated", "Console")
BadCoil.Kill()
end
end
end)
Trigger.OnEnteredProximityTrigger(Terminal6.CenterPosition, WDist.FromCells(1), function(actor, trigger6)
if actor.Owner == greece then
Trigger.RemoveProximityTrigger(trigger6)
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, trigger7)
if actor.Owner == greece then
Trigger.RemoveProximityTrigger(trigger7)
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, trigger8)
if actor.Owner == greece then
Trigger.RemoveProximityTrigger(trigger8)
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)
Trigger.OnEnteredProximityTrigger(CameraTrigger1.CenterPosition, WDist.FromCells(8), function(actor, triggercam1)
if actor.Owner == greece then
Trigger.RemoveProximityTrigger(triggercam1)
local camera1 = Actor.Create("camera", true, { Owner = greece, Location = CameraTrigger1.Location })
Trigger.OnAllKilled(Camera1Towers, function()
camera1.Destroy()
end)
end
end)
Trigger.OnEnteredProximityTrigger(CameraTrigger2.CenterPosition, WDist.FromCells(8), function(actor, triggercam2)
if actor.Owner == greece then
Trigger.RemoveProximityTrigger(triggercam2)
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)
Trigger.OnEnteredProximityTrigger(CameraTrigger3.CenterPosition, WDist.FromCells(8), function(actor, triggercam3)
if actor.Owner == greece then
Trigger.RemoveProximityTrigger(triggercam3)
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)
Trigger.OnEnteredProximityTrigger(CameraTrigger4.CenterPosition, WDist.FromCells(9), function(actor, triggercam4)
if actor.Owner == greece then
Trigger.RemoveProximityTrigger(triggercam4)
local camera4 = Actor.Create("camera", true, { Owner = greece, Location = CameraTrigger4.Location })
Trigger.OnKilled(Mammoth2, function()
camera4.Destroy()
end)
end
end)
Trigger.OnEnteredProximityTrigger(CameraTrigger5.CenterPosition, WDist.FromCells(8), function(actor, triggercam5)
if actor.Owner == greece then
Trigger.RemoveProximityTrigger(triggercam5)
local camera5 = Actor.Create("camera", true, { Owner = greece, Location = CameraTrigger5.Location })
Trigger.AfterDelay(DateTime.Seconds(10), function()
camera5.Destroy()
end)
end
end)
Trigger.OnEnteredProximityTrigger(CameraTrigger6.CenterPosition, WDist.FromCells(11), function(actor, triggercam6)
if actor.Owner == greece then
Trigger.RemoveProximityTrigger(triggercam6)
Actor.Create("camera", true, { Owner = greece, Location = CameraTrigger6.Location })
end
end)
Trigger.OnEnteredFootprint(ExecutionArea, function(actor, triggercam7)
if actor.Owner == greece then
Trigger.RemoveFootprintTrigger(triggercam7)
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)
Trigger.OnEnteredFootprint({ TruckDrive2.Location }, function(actor, triggertruck1)
if actor.Type == "truk" then
Trigger.RemoveFootprintTrigger(triggertruck1)
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)
Trigger.OnEnteredFootprint({ TruckDrive5.Location }, function(actor, triggertruck2)
if actor.Type == "truk" then
local dogCrewCamera = Actor.Create("camera", true, { Owner = greece, Location = DoggyCam.Location })
Trigger.RemoveFootprintTrigger(triggertruck2)
Spy = Actor.Create("spy", true, { Owner = greece, Location = TruckDrive5.Location })
Spy.DisguiseAsType("e1", ussr)
Spy.Move(SpyMove.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
IdleHunt = function(actor) if not actor.IsDead then Trigger.OnIdle(actor, actor.Hunt) end end
PrisonEscape = function()
Trigger.OnEnteredFootprint(PrisonAlarm, function(unit, id)
Trigger.RemoveFootprintTrigger(id)
Media.DisplayMessage("Warning, prisoners are attempting to escape!", "Intercom")
Media.PlaySoundNotification(greece, "AlertBuzzer")
Utils.Do(GuardDogs, function(actor)
if not actor.IsDead then
IdleHunt(actor)
end
end)
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)
Trigger.OnEnteredFootprint({ DemoDrive4.Location }, function(actor, demotruckescape)
if actor.Type == "dtrk" then
Trigger.RemoveFootprintTrigger(demotruckescape)
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.AddPrimaryObjective("Defeat the Allies.")
ExitBase = greece.AddPrimaryObjective("Reach the eastern exit of the facility.")
FreeTanya = greece.AddPrimaryObjective("Free Tanya and keep her alive.")
KillVIPs = greece.AddSecondaryObjective("Kill all Soviet officers and scientists.")
StealTank = greece.AddSecondaryObjective("Steal a Soviet mammoth tank.")
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