Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove Hard, add events to Production Disruption #21400

Open
wants to merge 1 commit into
base: bleed
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
17 changes: 14 additions & 3 deletions mods/ra/maps/production-disruption/map.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,14 @@ Players:
Faction: england
PlayerReference@BadGuy:
Name: BadGuy
Bot: campaign
Faction: soviet
Color: FF1400
Allies: USSR
Enemies: Greece
PlayerReference@USSR:
Name: USSR
Bot: campaign
Faction: soviet
Color: FF1400
Allies: BadGuy
Expand Down Expand Up @@ -410,7 +412,7 @@ Actors:
Actor120: apwr
Location: 71,41
Owner: USSR
Actor121: fcom
ForwardCommand: fcom
Location: 51,40
Owner: USSR
Actor122: apwr
Expand Down Expand Up @@ -589,7 +591,7 @@ Actors:
TeslaCam: waypoint
Location: 66,94
Owner: Neutral
LZ: waypoint
SouthLZ: waypoint
Location: 54,85
Owner: Neutral
Beach1: waypoint
Expand Down Expand Up @@ -644,8 +646,17 @@ Actors:
Location: 77,39
Owner: Neutral
V2: waypoint
Location: 66,43
Location: 63,44
Owner: Neutral
NorthLZ: waypoint
Owner: Neutral
Location: 60,56
BomberTarget1: waypoint
Owner: Neutral
Location: 54,46
BomberTarget2: waypoint
Owner: Neutral
Location: 65,46

Rules: ra|rules/campaign-rules.yaml, ra|rules/campaign-tooltips.yaml, ra|rules/campaign-palettes.yaml, rules.yaml

Expand Down
207 changes: 163 additions & 44 deletions mods/ra/maps/production-disruption/production-disruption.lua
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
the License, or (at your option) any later version. For more
information, see COPYING.
]]
FlameWallRevealed = false
TimerTicks = DateTime.Minutes(12)
LSTType = "lst.reinforcement"
RifleSquad1 = { Rifle1, Rifle2, Rifle3 }
Expand All @@ -16,89 +17,151 @@ DemoEngiPath = { WaterEntry1.Location, Beach1.Location }
DemoEngiTeam = { "dtrk", "dtrk", "e6", "e6", "e6" }
SovietWaterEntry1 = { WaterEntry2.Location, Beach2.Location }
SovietWaterEntry2 = { WaterEntry2.Location, Beach3.Location }
SovietSquad = { "e1", "e1", "e1", "e4", "e4" }
SovietSquad = { "e1", "e1", "e2", "e4", "e4" }
V2Squad = { "v2rl", "v2rl" }
SubEscapePath = { SubPath1, SubPath2, SubPath3 }

MissionStart = function()
LZCamera = Actor.Create("camera", true, { Owner = Greece, Location = LZ.Location })
Chalk1.TargetParatroopers(LZ.CenterPosition, Angle.New(740))
if Difficulty == "normal" then
Actor.Create("tsla", true, { Owner = USSR, Location = EasyCamera.Location })
local northCoil = Actor.Create("tsla", true, { Owner = USSR, Location = EasyCamera.Location })
Actor.Create("4tnk", true, { Owner = USSR, Facing = Angle.South, Location = Mammoth.Location })
Actor.Create("4tnk", true, { Owner = USSR, Facing = Angle.South, Location = Mammoth.Location + CVec.New(1,0) })
Actor.Create("v2rl", true, { Owner = USSR, Facing = Angle.South, Location = V2.Location })
-- Avoid leaving infantry stranded on the island.
northCoil.GrantCondition("no-actors-on-sell")
end

SpawnTemporaryCamera(SouthLZ.Location, DateTime.Seconds(15))
Chalk1.TargetParatroopers(SouthLZ.CenterPosition, Angle.New(740))

Trigger.AfterDelay(DateTime.Seconds(1), function()
Chalk2.TargetParatroopers(LZ.CenterPosition, Angle.New(780))
Chalk2.TargetParatroopers(SouthLZ.CenterPosition, Angle.New(780))
end)

Trigger.AfterDelay(DateTime.Seconds(5), function()
UnitsArrived = true
TeslaCamera = Actor.Create("camera", true, { Owner = Greece, Location = TeslaCam.Location })
SpawnTemporaryCamera(TeslaCam.Location, DateTime.Seconds(10))
end)

Trigger.AfterDelay(DateTime.Seconds(10), function()
LZCamera.Destroy()
Utils.Do(RifleSquad1, function(actor)
if not actor.IsDead then
actor.AttackMove(LZ.Location)
actor.AttackMove(SouthLZ.Location)
IdleHunt(actor)
end
end)
end)

Trigger.AfterDelay(DateTime.Seconds(15), function()
TeslaCamera.Destroy()
Utils.Do(RifleSquad2, function(actor)
if not actor.IsDead then
actor.AttackMove(LZ.Location)
actor.AttackMove(SouthLZ.Location)
IdleHunt(actor)
end
end)
end)
end

SetupTriggers = function()
Trigger.OnDamaged(SubPen, function()
Utils.Do(Heavys, function(actor)
if not actor.IsDead then
IdleHunt(actor)
end
end)
end)
SetupFlameWall()
SetupNorthBase()

Trigger.OnKilled(Church, function()
Actor.Create("healcrate", true, { Owner = Greece, Location = ChurchCrate.Location })
end)

Trigger.OnKilled(ObjectiveDome, function()
if not DomeCaptured == true then
if not DomeCaptured then
Greece.MarkFailedObjective(CaptureDome)
end
end)

Trigger.OnAllKilled(FlameTowerWall, function()
DomeCam = Actor.Create("camera", true, { Owner = Greece, Location = RadarCam.Location })
Trigger.AfterDelay(DateTime.Seconds(5), function()
DomeCam.Destroy()
-- Avoid notifications unless part of the the northern base is captured.
Greece.PlayLowPowerNotification = false
local notifiers = Utils.Where(USSR.GetActors(), function(actor)
return actor.HasProperty("StartBuildingRepairs")
end)

Utils.Do(notifiers, function(n)
Trigger.OnCapture(n, function()
Greece.PlayLowPowerNotification = true
end)
end)
end

SetupFlameWall = function()
Trigger.OnAllKilled(FlameTowerWall, function()
SpawnTemporaryCamera(RadarCam.Location, DateTime.Seconds(5))
end)

-- Give some warning if they are not yet revealed by the power cut.
Trigger.OnEnteredProximityTrigger(FlameCam.CenterPosition, WDist.FromCells(8), function(actor, id)
if FlameWallRevealed then
Trigger.RemoveProximityTrigger(id)
return
end

if actor.Owner == Greece then
FlameWallRevealed = true
Trigger.RemoveProximityTrigger(id)
SpawnTemporaryCamera(FlameCam.Location, DateTime.Seconds(10))
end
end)
end

SetupNorthBase = function()
local bombsPrepared = false
local tanksAlerted = false

Trigger.OnKilledOrCaptured(SubPen, function()
Greece.MarkCompletedObjective(StopProduction)
end)

Trigger.OnDamaged(SubPen, function(_, attacker)
if tanksAlerted or attacker.Type == "badr.bomber" then
return
end

tanksAlerted = true
Utils.Do(Heavys, IdleHunt)
end)

Trigger.OnKilledOrCaptured(ForwardCommand, function()
StartFireSale()
-- The original mission used four waypoints (7-10) for drops.
-- For simplicity, a four-Badger team will target the middle.
Chalk3.TargetParatroopers(NorthLZ.CenterPosition, Angle.New(927))

Trigger.AfterDelay(DateTime.Seconds(2), function()
Media.PlaySpeechNotification(Greece, "ReinforcementsArrived")
end)

if not bombsPrepared then
bombsPrepared = true
BombNorthBase()
end
end)

Trigger.OnAllKilledOrCaptured(USSR.GetActorsByType("sam"), function()
if not bombsPrepared then
bombsPrepared = true
BombNorthBase()
end
end)
end

PowerDown = false
PowerDownTeslas = function()
if not PowerDown then
CaptureDome = AddSecondaryObjective(Greece, "capture-enemy-radar-dome")
Greece.MarkCompletedObjective(PowerDownTeslaCoils)
Media.PlaySpeechNotification(Greece, "ReinforcementsArrived")
Media.PlaySoundNotification(Greece, "RadarDown")
PowerDown = true

Trigger.AfterDelay(DateTime.Seconds(1), function()
Media.PlaySpeechNotification(Greece, "ReinforcementsArrived")
end)

local bridge = Utils.Where(Map.ActorsInWorld, function(actor) return actor.Type == "bridge1" end)[1]
if not bridge.IsDead then
bridge.Kill()
Expand All @@ -117,34 +180,56 @@ PowerDownTeslas = function()
Trigger.OnCapture(ObjectiveDome, function()
DomeCaptured = true
Greece.MarkCompletedObjective(CaptureDome)
SendChronos()
end)

FlameTowersCam = Actor.Create("camera", true, { Owner = Greece, Location = FlameCam.Location })
Trigger.AfterDelay(DateTime.Seconds(10), function()
FlameTowersCam.Destroy()
Trigger.AfterDelay(DateTime.Seconds(3), function()
SendChronos()
SendWaterSquads()
Actor.Create("camera", true, { Owner = Greece, Location = EasyCamera.Location })
end)
end)

if not FlameWallRevealed then
FlameWallRevealed = true
SpawnTemporaryCamera(FlameCam.Location, DateTime.Seconds(10))
end
end
end

BombNorthBase = function()
local proxy = Actor.Create("powerproxy.parabombs", false, { Owner = Greece })
proxy.TargetAirstrike(BomberTarget1.CenterPosition, Angle.New(970))
proxy.TargetAirstrike(BomberTarget2.CenterPosition, Angle.New(932))
proxy.Destroy()
end

SendChronos = function()
Trigger.AfterDelay(DateTime.Seconds(3), function()
local sovietWaterSquad1 = Reinforcements.ReinforceWithTransport(USSR, "lst", SovietSquad, { WaterEntry2.Location, Beach2.Location }, { WaterEntry2.Location })[2]
Utils.Do(sovietWaterSquad1, function(a)
Trigger.OnAddedToWorld(a, function()
IdleHunt(a)
end)
end)
local payload = { }
local proxy = Actor.Create("powerproxy.chronoshift", false, { Owner = Greece })
local spawns =
{
{ cell = ChronoSpawn2.Location, facing = Angle.NorthWest },
{ cell = ChronoSpawn1.Location, facing = Angle.NorthEast },
{ cell = ChronoSpawn3.Location, facing = Angle.South }
}

Utils.Do(spawns, function(spawn)
local tank = Actor.Create("ctnk", true, { Owner = Greece, Facing = spawn.facing })
payload[tank] = spawn.cell
end)

Media.PlaySound("chrono2.aud")
proxy.Chronoshift(payload)
proxy.Destroy()
end

Actor.Create("ctnk", true, { Owner = Greece, Location = ChronoSpawn1.Location })
Actor.Create("ctnk", true, { Owner = Greece, Location = ChronoSpawn2.Location })
Actor.Create("ctnk", true, { Owner = Greece, Location = ChronoSpawn3.Location })
Actor.Create("camera", true, { Owner = Greece, Location = EasyCamera.Location })
Media.PlaySound("chrono2.aud")
SendWaterSquads = function()
local sovietWaterSquad1 = Reinforcements.ReinforceWithTransport(USSR, LSTType, SovietSquad, { WaterEntry2.Location, Beach2.Location }, { WaterEntry2.Location })[2]
Utils.Do(sovietWaterSquad1, function(a)
Trigger.OnAddedToWorld(a, IdleHunt)
end)

Trigger.AfterDelay(DateTime.Seconds(5), function()
local sovietWaterSquad2 = Reinforcements.ReinforceWithTransport(USSR, "lst", SovietSquad, { WaterEntry2.Location, Beach3.Location }, { WaterEntry2.Location })[2]
local sovietWaterSquad2 = Reinforcements.ReinforceWithTransport(USSR, LSTType, SovietSquad, { WaterEntry2.Location, Beach3.Location }, { WaterEntry2.Location })[2]
Utils.Do(sovietWaterSquad2, function(a)
Trigger.OnAddedToWorld(a, function()
a.AttackMove(FlameCam.Location)
Expand All @@ -154,7 +239,7 @@ SendChronos = function()
end)

Trigger.AfterDelay(DateTime.Seconds(13), function()
local sovietWaterSquad2 = Reinforcements.ReinforceWithTransport(USSR, "lst", V2Squad, { WaterEntry2.Location, Beach2.Location }, { WaterEntry2.Location })[2]
local sovietWaterSquad2 = Reinforcements.ReinforceWithTransport(USSR, LSTType, V2Squad, { WaterEntry2.Location, Beach2.Location }, { WaterEntry2.Location })[2]
Utils.Do(sovietWaterSquad2, function(a)
Trigger.OnAddedToWorld(a, function()
a.AttackMove(FlameCam.Location)
Expand Down Expand Up @@ -185,15 +270,47 @@ MissileSubEscape = function()
end)
end

SubmarineEscapes = UserInterface.Translate("submarine-escapes")
StartFireSale = function()
local structures = Utils.Where(USSR.GetActors(), function(actor)
return actor.HasProperty("StartBuildingRepairs")
end)

if #structures == 0 then
return
end

SpawnTemporaryCamera(BomberTarget1.Location, DateTime.Seconds(5))
SpawnTemporaryCamera(BomberTarget2.Location, DateTime.Seconds(5))

Utils.Do(structures, function(building)
building.Sell()
end)

Trigger.OnAllRemovedFromWorld(structures, function()
Utils.Do(USSR.GetGroundAttackers(), IdleHunt)
end)
end

SpawnTemporaryCamera = function(location, duration)
local camera = Actor.Create("camera", true, { Owner = Greece, Location = location })

Trigger.AfterDelay(duration, function()
if camera.IsInWorld then
camera.Destroy()
end
end)
end

FinishTimer = function()
local submarineEscapes = UserInterface.Translate("submarine-escapes")

for i = 0, 5 do
local c = TimerColor
if i % 2 == 0 then
c = HSLColor.White
end

Trigger.AfterDelay(DateTime.Seconds(i), function() UserInterface.SetMissionText(SubmarineEscapes, c) end)
Trigger.AfterDelay(DateTime.Seconds(i), function() UserInterface.SetMissionText(submarineEscapes, c) end)
end
Trigger.AfterDelay(DateTime.Seconds(6), function() UserInterface.SetMissionText("") end)
end
Expand All @@ -217,6 +334,7 @@ Tick = function()
end
Ticked = Ticked - 1
elseif Ticked == 0 and not TimerFinished then
FinishTimer()
MissileSubEscape()
TimerFinished = true
end
Expand Down Expand Up @@ -250,6 +368,7 @@ WorldLoaded = function()
TimerColor = USSR.Color
Chalk1 = Actor.Create("chalk1", false, { Owner = Greece })
Chalk2 = Actor.Create("chalk2", false, { Owner = Greece })
Chalk3 = Actor.Create("chalk3", false, { Owner = Greece })
MissionStart()
SetupTriggers()
end