Add bombers, fixes to Production Disruption

This commit is contained in:
JovialFeline
2024-07-19 15:30:37 -04:00
committed by Gustas
parent ff5b5149b3
commit c58621e036
3 changed files with 219 additions and 60 deletions

View File

@@ -26,12 +26,14 @@ Players:
Faction: england Faction: england
PlayerReference@BadGuy: PlayerReference@BadGuy:
Name: BadGuy Name: BadGuy
Bot: campaign
Faction: soviet Faction: soviet
Color: FF1400 Color: FF1400
Allies: USSR Allies: USSR
Enemies: Greece Enemies: Greece
PlayerReference@USSR: PlayerReference@USSR:
Name: USSR Name: USSR
Bot: campaign
Faction: soviet Faction: soviet
Color: FF1400 Color: FF1400
Allies: BadGuy Allies: BadGuy
@@ -410,7 +412,7 @@ Actors:
Actor120: apwr Actor120: apwr
Location: 71,41 Location: 71,41
Owner: USSR Owner: USSR
Actor121: fcom ForwardCommand: fcom
Location: 51,40 Location: 51,40
Owner: USSR Owner: USSR
Actor122: apwr Actor122: apwr
@@ -501,12 +503,12 @@ Actors:
Location: 67,76 Location: 67,76
Owner: BadGuy Owner: BadGuy
Facing: 380 Facing: 380
SubCell: 3 SubCell: 4
Actor148: e1 Actor148: e1
Location: 71,77 Location: 71,77
Owner: BadGuy Owner: BadGuy
Facing: 124 Facing: 124
SubCell: 4 SubCell: 5
Actor149: e1 Actor149: e1
Location: 74,76 Location: 74,76
Owner: BadGuy Owner: BadGuy
@@ -526,11 +528,11 @@ Actors:
Location: 76,62 Location: 76,62
Owner: USSR Owner: USSR
Facing: 380 Facing: 380
SubCell: 4 SubCell: 5
Actor153: e1 Actor153: e1
Location: 54,40 Location: 54,40
Owner: USSR Owner: USSR
SubCell: 3 SubCell: 4
Actor154: e1 Actor154: e1
Location: 69,40 Location: 69,40
Owner: USSR Owner: USSR
@@ -558,7 +560,7 @@ Actors:
Actor160: e2 Actor160: e2
Location: 71,39 Location: 71,39
Owner: USSR Owner: USSR
SubCell: 4 SubCell: 5
Rifle1: e1 Rifle1: e1
Location: 78,81 Location: 78,81
Owner: USSR Owner: USSR
@@ -566,30 +568,30 @@ Actors:
Rifle2: e1 Rifle2: e1
Location: 78,79 Location: 78,79
Owner: USSR Owner: USSR
SubCell: 3 SubCell: 4
Rifle3: e1 Rifle3: e1
Location: 77,80 Location: 77,80
Owner: USSR Owner: USSR
SubCell: 4 SubCell: 5
Rifle4: e1 Rifle4: e1
Location: 47,71 Location: 47,71
Owner: USSR Owner: USSR
SubCell: 4 SubCell: 5
Rifle5: e1 Rifle5: e1
Location: 49,71 Location: 49,71
Owner: USSR Owner: USSR
SubCell: 3 SubCell: 4
Rifle6: e1 Rifle6: e1
Location: 49,70 Location: 49,70
Owner: USSR Owner: USSR
SubCell: 3 SubCell: 4
DefaultCameraPosition: waypoint DefaultCameraPosition: waypoint
Location: 58,86 Location: 58,86
Owner: Neutral Owner: Neutral
TeslaCam: waypoint TeslaCam: waypoint
Location: 66,94 Location: 66,94
Owner: Neutral Owner: Neutral
LZ: waypoint SouthLZ: waypoint
Location: 54,85 Location: 54,85
Owner: Neutral Owner: Neutral
Beach1: waypoint Beach1: waypoint
@@ -644,8 +646,17 @@ Actors:
Location: 77,39 Location: 77,39
Owner: Neutral Owner: Neutral
V2: waypoint V2: waypoint
Location: 66,43 Location: 63,44
Owner: Neutral 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 Rules: ra|rules/campaign-rules.yaml, ra|rules/campaign-tooltips.yaml, ra|rules/campaign-palettes.yaml, rules.yaml

View File

@@ -6,6 +6,7 @@
the License, or (at your option) any later version. For more the License, or (at your option) any later version. For more
information, see COPYING. information, see COPYING.
]] ]]
FlameWallRevealed = false
TimerTicks = DateTime.Minutes(12) TimerTicks = DateTime.Minutes(12)
LSTType = "lst.reinforcement" LSTType = "lst.reinforcement"
RifleSquad1 = { Rifle1, Rifle2, Rifle3 } RifleSquad1 = { Rifle1, Rifle2, Rifle3 }
@@ -16,44 +17,45 @@ DemoEngiPath = { WaterEntry1.Location, Beach1.Location }
DemoEngiTeam = { "dtrk", "dtrk", "e6", "e6", "e6" } DemoEngiTeam = { "dtrk", "dtrk", "e6", "e6", "e6" }
SovietWaterEntry1 = { WaterEntry2.Location, Beach2.Location } SovietWaterEntry1 = { WaterEntry2.Location, Beach2.Location }
SovietWaterEntry2 = { WaterEntry2.Location, Beach3.Location } SovietWaterEntry2 = { WaterEntry2.Location, Beach3.Location }
SovietSquad = { "e1", "e1", "e1", "e4", "e4" } SovietSquad = { "e1", "e1", "e2", "e4", "e4" }
V2Squad = { "v2rl", "v2rl" } V2Squad = { "v2rl", "v2rl" }
SubEscapePath = { SubPath1, SubPath2, SubPath3 } SubEscapePath = { SubPath1, SubPath2, SubPath3 }
MissionStart = function() MissionStart = function()
LZCamera = Actor.Create("camera", true, { Owner = Greece, Location = LZ.Location })
Chalk1.TargetParatroopers(LZ.CenterPosition, Angle.New(740))
if Difficulty == "normal" then 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 })
Actor.Create("4tnk", true, { Owner = USSR, Facing = Angle.South, Location = Mammoth.Location + CVec.New(1,0) }) 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 }) 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 end
SpawnTemporaryCamera(SouthLZ.Location, DateTime.Seconds(15))
Chalk1.TargetParatroopers(SouthLZ.CenterPosition, Angle.New(740))
Trigger.AfterDelay(DateTime.Seconds(1), function() Trigger.AfterDelay(DateTime.Seconds(1), function()
Chalk2.TargetParatroopers(LZ.CenterPosition, Angle.New(780)) Chalk2.TargetParatroopers(SouthLZ.CenterPosition, Angle.New(780))
end) end)
Trigger.AfterDelay(DateTime.Seconds(5), function() Trigger.AfterDelay(DateTime.Seconds(5), function()
UnitsArrived = true UnitsArrived = true
TeslaCamera = Actor.Create("camera", true, { Owner = Greece, Location = TeslaCam.Location }) SpawnTemporaryCamera(TeslaCam.Location, DateTime.Seconds(10))
end) end)
Trigger.AfterDelay(DateTime.Seconds(10), function() Trigger.AfterDelay(DateTime.Seconds(10), function()
LZCamera.Destroy()
Utils.Do(RifleSquad1, function(actor) Utils.Do(RifleSquad1, function(actor)
if not actor.IsDead then if not actor.IsDead then
actor.AttackMove(LZ.Location) actor.AttackMove(SouthLZ.Location)
IdleHunt(actor) IdleHunt(actor)
end end
end) end)
end) end)
Trigger.AfterDelay(DateTime.Seconds(15), function() Trigger.AfterDelay(DateTime.Seconds(15), function()
TeslaCamera.Destroy()
Utils.Do(RifleSquad2, function(actor) Utils.Do(RifleSquad2, function(actor)
if not actor.IsDead then if not actor.IsDead then
actor.AttackMove(LZ.Location) actor.AttackMove(SouthLZ.Location)
IdleHunt(actor) IdleHunt(actor)
end end
end) end)
@@ -61,34 +63,91 @@ MissionStart = function()
end end
SetupTriggers = function() SetupTriggers = function()
Trigger.OnDamaged(SubPen, function() SetupFlameWall()
Utils.Do(Heavys, function(actor) SetupNorthBase()
if not actor.IsDead then
IdleHunt(actor)
end
end)
end)
Trigger.OnKilled(Church, function() Trigger.OnKilled(Church, function()
Actor.Create("healcrate", true, { Owner = Greece, Location = ChurchCrate.Location }) Actor.Create("healcrate", true, { Owner = Greece, Location = ChurchCrate.Location })
end) end)
Trigger.OnKilled(ObjectiveDome, function() Trigger.OnKilled(ObjectiveDome, function()
if not DomeCaptured == true then if not DomeCaptured then
Greece.MarkFailedObjective(CaptureDome) Greece.MarkFailedObjective(CaptureDome)
end end
end) end)
Trigger.OnAllKilled(FlameTowerWall, function() -- Avoid notifications unless part of the the northern base is captured.
DomeCam = Actor.Create("camera", true, { Owner = Greece, Location = RadarCam.Location }) Greece.PlayLowPowerNotification = false
Trigger.AfterDelay(DateTime.Seconds(5), function() local notifiers = Utils.Where(USSR.GetActors(), function(actor)
DomeCam.Destroy() return actor.HasProperty("StartBuildingRepairs")
end)
Utils.Do(notifiers, function(n)
Trigger.OnCapture(n, function()
Greece.PlayLowPowerNotification = true
end) end)
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() Trigger.OnKilledOrCaptured(SubPen, function()
Greece.MarkCompletedObjective(StopProduction) Greece.MarkCompletedObjective(StopProduction)
end) 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 end
PowerDown = false PowerDown = false
@@ -96,9 +155,13 @@ PowerDownTeslas = function()
if not PowerDown then if not PowerDown then
CaptureDome = AddSecondaryObjective(Greece, "capture-enemy-radar-dome") CaptureDome = AddSecondaryObjective(Greece, "capture-enemy-radar-dome")
Greece.MarkCompletedObjective(PowerDownTeslaCoils) Greece.MarkCompletedObjective(PowerDownTeslaCoils)
Media.PlaySpeechNotification(Greece, "ReinforcementsArrived") Media.PlaySoundNotification(Greece, "RadarDown")
PowerDown = true 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] local bridge = Utils.Where(Map.ActorsInWorld, function(actor) return actor.Type == "bridge1" end)[1]
if not bridge.IsDead then if not bridge.IsDead then
bridge.Kill() bridge.Kill()
@@ -117,34 +180,56 @@ PowerDownTeslas = function()
Trigger.OnCapture(ObjectiveDome, function() Trigger.OnCapture(ObjectiveDome, function()
DomeCaptured = true DomeCaptured = true
Greece.MarkCompletedObjective(CaptureDome) Greece.MarkCompletedObjective(CaptureDome)
SendChronos()
end)
FlameTowersCam = Actor.Create("camera", true, { Owner = Greece, Location = FlameCam.Location }) Trigger.AfterDelay(DateTime.Seconds(3), function()
Trigger.AfterDelay(DateTime.Seconds(10), function() SendChronos()
FlameTowersCam.Destroy() SendWaterSquads()
end) Actor.Create("camera", true, { Owner = Greece, Location = EasyCamera.Location })
end
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)
end) end)
Actor.Create("ctnk", true, { Owner = Greece, Location = ChronoSpawn1.Location }) if not FlameWallRevealed then
Actor.Create("ctnk", true, { Owner = Greece, Location = ChronoSpawn2.Location }) FlameWallRevealed = true
Actor.Create("ctnk", true, { Owner = Greece, Location = ChronoSpawn3.Location }) SpawnTemporaryCamera(FlameCam.Location, DateTime.Seconds(10))
Actor.Create("camera", true, { Owner = Greece, Location = EasyCamera.Location }) end
Media.PlaySound("chrono2.aud") 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()
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
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) end)
Trigger.AfterDelay(DateTime.Seconds(5), function() 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) Utils.Do(sovietWaterSquad2, function(a)
Trigger.OnAddedToWorld(a, function() Trigger.OnAddedToWorld(a, function()
a.AttackMove(FlameCam.Location) a.AttackMove(FlameCam.Location)
@@ -154,7 +239,7 @@ SendChronos = function()
end) end)
Trigger.AfterDelay(DateTime.Seconds(13), function() 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) Utils.Do(sovietWaterSquad2, function(a)
Trigger.OnAddedToWorld(a, function() Trigger.OnAddedToWorld(a, function()
a.AttackMove(FlameCam.Location) a.AttackMove(FlameCam.Location)
@@ -185,15 +270,47 @@ MissileSubEscape = function()
end) end)
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() FinishTimer = function()
local submarineEscapes = UserInterface.Translate("submarine-escapes")
for i = 0, 5 do for i = 0, 5 do
local c = TimerColor local c = TimerColor
if i % 2 == 0 then if i % 2 == 0 then
c = HSLColor.White c = HSLColor.White
end end
Trigger.AfterDelay(DateTime.Seconds(i), function() UserInterface.SetMissionText(SubmarineEscapes, c) end) Trigger.AfterDelay(DateTime.Seconds(i), function() UserInterface.SetMissionText(submarineEscapes, c) end)
end end
Trigger.AfterDelay(DateTime.Seconds(6), function() UserInterface.SetMissionText("") end) Trigger.AfterDelay(DateTime.Seconds(6), function() UserInterface.SetMissionText("") end)
end end
@@ -217,6 +334,7 @@ Tick = function()
end end
Ticked = Ticked - 1 Ticked = Ticked - 1
elseif Ticked == 0 and not TimerFinished then elseif Ticked == 0 and not TimerFinished then
FinishTimer()
MissileSubEscape() MissileSubEscape()
TimerFinished = true TimerFinished = true
end end
@@ -250,6 +368,7 @@ WorldLoaded = function()
TimerColor = USSR.Color TimerColor = USSR.Color
Chalk1 = Actor.Create("chalk1", false, { Owner = Greece }) Chalk1 = Actor.Create("chalk1", false, { Owner = Greece })
Chalk2 = Actor.Create("chalk2", false, { Owner = Greece }) Chalk2 = Actor.Create("chalk2", false, { Owner = Greece })
Chalk3 = Actor.Create("chalk3", false, { Owner = Greece })
MissionStart() MissionStart()
SetupTriggers() SetupTriggers()
end end

View File

@@ -5,6 +5,8 @@ World:
WinVideo: battle.vqa WinVideo: battle.vqa
LossVideo: slntsrvc.vqa LossVideo: slntsrvc.vqa
Briefing: The Soviets are beginning construction of a new class of submarine capable of launching sea-to-ground missiles. We don't have to tell you the amount of devestation these could cause.\n\nTake a small squad of troops and infiltrate their power grid. When it is down, additional reinforcements will be sent in. When ready, head north and destroy their Sub pen, preventing further construction of these subs.\n\nIf any are built, they must not be allowed to escape! Briefing: The Soviets are beginning construction of a new class of submarine capable of launching sea-to-ground missiles. We don't have to tell you the amount of devestation these could cause.\n\nTake a small squad of troops and infiltrate their power grid. When it is down, additional reinforcements will be sent in. When ready, head north and destroy their Sub pen, preventing further construction of these subs.\n\nIf any are built, they must not be allowed to escape!
StartGameNotification:
Notification: MissionTimerInitialised
ScriptLobbyDropdown@difficulty: ScriptLobbyDropdown@difficulty:
ID: difficulty ID: difficulty
Label: dropdown-difficulty.label Label: dropdown-difficulty.label
@@ -15,6 +17,16 @@ World:
hard: options-difficulty.hard hard: options-difficulty.hard
Default: normal Default: normal
powerproxy.chronoshift:
AlwaysVisible:
ChronoshiftPower:
Dimensions: 1, 1
Footprint: x
powerproxy.parabombs:
AirstrikePower:
DisplayBeacon: False
CHALK1: CHALK1:
ParatroopersPower: ParatroopersPower:
DisplayBeacon: False DisplayBeacon: False
@@ -27,6 +39,17 @@ CHALK2:
DropItems: E3, E3, E3, E3, MEDI DropItems: E3, E3, E3, E3, MEDI
AlwaysVisible: AlwaysVisible:
CHALK3:
ParatroopersPower:
DisplayBeacon: False
DropItems: E1, E1, E1, E1, E1, E1, E1, E1, E1, E1, E1, E1, E1, E1, E1, E1, E1, E1, E1, E1
SquadSize: 4
AlwaysVisible:
CTNK:
Chronoshiftable:
ChronoshiftSound:
LST.Reinforcement: LST.Reinforcement:
Inherits: LST Inherits: LST
RejectsOrders: RejectsOrders:
@@ -42,3 +65,9 @@ MSUB:
-Targetable@UNDERWATER: -Targetable@UNDERWATER:
Targetable: Targetable:
-RequiresCondition: -RequiresCondition:
TSLA:
ExternalCondition@NOACTORSONSELL:
Condition: no-actors-on-sell
SpawnActorsOnSell:
RequiresCondition: !no-actors-on-sell