Add Counterstrike mission Sarin Gas 2: Down Under

This commit is contained in:
Smittytron
2018-12-26 20:51:50 -06:00
committed by Oliver Brakmann
parent 3b926d71b5
commit 99987db5d9
6 changed files with 1888 additions and 0 deletions

View File

@@ -0,0 +1,453 @@
--[[
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

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,54 @@
World:
LuaScript:
Scripts: downunder.lua
MissionData:
Briefing: We've traced the convoy's route to this underground facility. We suspect that this is a hidden access to the Soviet's main Sarin plant.\n\nLead your troops through the tunnels and remove any opposition you may find. Be careful -- the Soviets are conducting all kinds of research in this facility, and we don't know what they may throw at you.\n\nUse spies to scout and infiltrate factories where they can steal vehicles.\n\nThe mission is complete when your forces reach the far exit of the facility.\n
WinVideo: spy.vqa
LossVideo: execute.vqa
ScriptLobbyDropdown@difficulty:
ID: difficulty
Label: Difficulty
Values:
normal: Normal
hard: Hard
Default: Normal
Player:
PlayerResources:
DefaultCash: 0
SPY:
RevealsShroud:
Range: 7c0
4TNK:
AutoTarget:
InitialStanceAI: Defend
TSLA:
Health:
HP: 300000
GNRL:
Tooltip:
Name: Officer
C5:
-Wanders:
C6:
-Wanders:
CHAN:
-Wanders:
DTRK:
Cargo:
Types: Infantry
MaxWeight: 1
RevealsShroud:
Range: 4c0
ValidStances: Neutral
RequiresCondition: mission
ExternalCondition@mission:
Condition: mission