Initial commit: OpenRA game engine
Some checks failed
Continuous Integration / Linux (.NET 8.0) (push) Has been cancelled
Continuous Integration / Windows (.NET 8.0) (push) Has been cancelled

Fork from OpenRA/OpenRA with one-click launch script (start-ra.cmd)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
let5sne.win10
2026-01-10 21:46:54 +08:00
commit 9cf6ebb986
4065 changed files with 635973 additions and 0 deletions

Binary file not shown.

View File

@@ -0,0 +1,7 @@
## rules.yaml
briefing =
The Soviets are constructing a new class of submarine capable of launching sea-to-ground missiles. We don't need to tell you the devastation these could cause.
Take a small squad of troops and infiltrate their power grid. Once it's down, reinforcements will follow. Then, head north to destroy the sub pen and prevent further construction of these submarines.
If any are built, they must not escape!

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

@@ -0,0 +1,663 @@
MapFormat: 12
RequiresMod: ra
Title: Production Disruption
Author: Westwood Studios
Tileset: TEMPERAT
MapSize: 128,128
Bounds: 41,7,47,94
Visibility: MissionSelector
Categories: Mission
LockPreview: True
Players:
PlayerReference@Neutral:
Name: Neutral
OwnsWorld: True
NonCombatant: True
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
Enemies: Greece
PlayerReference@Greece:
Name: Greece
AllowBots: False
Playable: True
Required: True
LockFaction: True
Faction: allies
LockColor: True
Color: ABB7E4
LockSpawn: True
LockTeam: True
Enemies: USSR, BadGuy
Actors:
Actor0: brik
Location: 49,37
Owner: USSR
Actor1: brik
Location: 50,37
Owner: USSR
Actor2: brik
Location: 74,37
Owner: USSR
Actor3: brik
Location: 75,37
Owner: USSR
Actor4: brik
Location: 49,38
Owner: USSR
Actor5: brik
Location: 50,38
Owner: USSR
Actor6: brik
Location: 74,38
Owner: USSR
Actor7: brik
Location: 75,38
Owner: USSR
Actor8: brik
Location: 49,39
Owner: USSR
Actor9: brik
Location: 75,39
Owner: USSR
Actor10: brik
Location: 49,40
Owner: USSR
Actor11: brik
Location: 75,40
Owner: USSR
Actor12: brik
Location: 49,41
Owner: USSR
Actor13: brik
Location: 75,41
Owner: USSR
Actor14: brik
Location: 49,42
Owner: USSR
Actor15: brik
Location: 75,42
Owner: USSR
Actor16: brik
Location: 49,43
Owner: USSR
Actor17: brik
Location: 75,43
Owner: USSR
Actor18: brik
Location: 49,44
Owner: USSR
Actor19: brik
Location: 75,44
Owner: USSR
Actor20: brik
Location: 49,45
Owner: USSR
Actor21: brik
Location: 75,45
Owner: USSR
Actor22: brik
Location: 49,46
Owner: USSR
Actor23: brik
Location: 75,46
Owner: USSR
Actor24: brik
Location: 49,47
Owner: USSR
Actor25: brik
Location: 75,47
Owner: USSR
Actor26: brik
Location: 49,48
Owner: USSR
Actor27: brik
Location: 75,48
Owner: USSR
Actor28: brik
Location: 49,49
Owner: USSR
Actor29: brik
Location: 75,49
Owner: USSR
Actor30: brik
Location: 49,50
Owner: USSR
Actor31: brik
Location: 50,50
Owner: USSR
Actor32: brik
Location: 51,50
Owner: USSR
Actor33: brik
Location: 52,50
Owner: USSR
Actor34: brik
Location: 53,50
Owner: USSR
Actor35: brik
Location: 54,50
Owner: USSR
Actor36: brik
Location: 55,50
Owner: USSR
Actor37: brik
Location: 56,50
Owner: USSR
Actor38: brik
Location: 57,50
Owner: USSR
Actor39: brik
Location: 61,50
Owner: USSR
Actor40: brik
Location: 62,50
Owner: USSR
Actor41: brik
Location: 75,50
Owner: USSR
Actor42: brik
Location: 56,51
Owner: USSR
Actor43: brik
Location: 57,51
Owner: USSR
Actor44: brik
Location: 61,51
Owner: USSR
Actor45: brik
Location: 62,51
Owner: USSR
Actor46: brik
Location: 63,51
Owner: USSR
Actor47: brik
Location: 64,51
Owner: USSR
Actor48: brik
Location: 65,51
Owner: USSR
Actor49: brik
Location: 66,51
Owner: USSR
Actor50: brik
Location: 67,51
Owner: USSR
Actor51: brik
Location: 68,51
Owner: USSR
Actor52: brik
Location: 69,51
Owner: USSR
Actor53: brik
Location: 70,51
Owner: USSR
Actor54: brik
Location: 71,51
Owner: USSR
Actor55: brik
Location: 72,51
Owner: USSR
Actor56: brik
Location: 73,51
Owner: USSR
Actor57: brik
Location: 74,51
Owner: USSR
Actor58: brik
Location: 75,51
Owner: USSR
Actor60: brik
Location: 67,73
Owner: BadGuy
Actor61: brik
Location: 68,73
Owner: BadGuy
Actor62: brik
Location: 69,73
Owner: BadGuy
Actor63: brik
Location: 70,73
Owner: BadGuy
Actor64: brik
Location: 71,73
Owner: BadGuy
Actor65: brik
Location: 72,73
Owner: BadGuy
Actor66: brik
Location: 73,73
Owner: BadGuy
Actor67: brik
Location: 74,73
Owner: BadGuy
Actor68: brik
Location: 75,73
Owner: BadGuy
Actor69: brik
Location: 76,73
Owner: BadGuy
Actor70: brik
Location: 67,74
Owner: BadGuy
Actor71: brik
Location: 68,74
Owner: BadGuy
Actor72: brik
Location: 76,74
Owner: BadGuy
Actor73: brik
Location: 76,75
Owner: BadGuy
Actor74: brik
Location: 76,76
Owner: BadGuy
Actor75: brik
Location: 67,77
Owner: BadGuy
Actor76: brik
Location: 68,77
Owner: BadGuy
Actor77: brik
Location: 76,77
Owner: BadGuy
Actor78: brik
Location: 67,78
Owner: BadGuy
Actor79: brik
Location: 68,78
Owner: BadGuy
Actor80: brik
Location: 69,78
Owner: BadGuy
Actor81: brik
Location: 70,78
Owner: BadGuy
Actor82: brik
Location: 71,78
Owner: BadGuy
Actor83: brik
Location: 72,78
Owner: BadGuy
Actor84: brik
Location: 73,78
Owner: BadGuy
Actor85: brik
Location: 74,78
Owner: BadGuy
Actor86: brik
Location: 75,78
Owner: BadGuy
Actor87: brik
Location: 76,78
Owner: BadGuy
Actor88: t01
Location: 46,67
Owner: Neutral
Actor89: tc04
Location: 46,63
Owner: Neutral
Actor90: tc05
Location: 50,71
Owner: Neutral
Actor91: tc05
Location: 80,92
Owner: Neutral
Actor92: tc04
Location: 67,69
Owner: Neutral
Actor93: tc02
Location: 66,79
Owner: Neutral
Actor94: tc04
Location: 49,86
Owner: Neutral
Actor95: tc03
Location: 50,88
Owner: Neutral
Actor96: tc01
Location: 54,77
Owner: Neutral
Actor97: t17
Location: 64,73
Owner: Neutral
Actor98: t16
Location: 61,86
Owner: Neutral
Actor99: t15
Location: 57,89
Owner: Neutral
Actor100: t13
Location: 71,93
Owner: Neutral
Actor101: t14
Location: 80,84
Owner: Neutral
Actor102: tc04
Location: 47,58
Owner: Neutral
Actor103: tc05
Location: 78,57
Owner: Neutral
Actor104: tc03
Location: 79,60
Owner: Neutral
Actor105: tc02
Location: 49,59
Owner: Neutral
Actor106: tc03
Location: 45,46
Owner: Neutral
Actor107: tc04
Location: 53,50
Owner: Neutral
Actor108: tc05
Location: 78,37
Owner: Neutral
Actor109: tc02
Location: 75,51
Owner: Neutral
Actor110: tc01
Location: 71,58
Owner: Neutral
Actor111: tc02
Location: 80,68
Owner: Neutral
Actor112: tsla
Location: 70,94
Owner: BadGuy
SubPen: spen
Location: 67,37
Owner: BadGuy
Actor114: kenn
Location: 61,45
Owner: USSR
Actor115: barr
Location: 56,46
Owner: USSR
Actor116: apwr
Location: 53,44
Owner: USSR
Actor117: apwr
Location: 51,47
Owner: USSR
Actor118: apwr
Location: 62,47
Owner: USSR
Actor119: dome
Location: 70,47
Owner: USSR
Actor120: apwr
Location: 71,41
Owner: USSR
ForwardCommand: fcom
Location: 51,40
Owner: USSR
Actor122: apwr
Location: 73,74
Owner: BadGuy
Actor123: apwr
Location: 69,74
Owner: BadGuy
FlameTower1: ftur
Location: 62,66
Owner: USSR
FlameTower2: ftur
Location: 65,66
Owner: USSR
Actor126: ftur
Location: 57,52
Owner: USSR
Actor127: ftur
Location: 61,52
Owner: USSR
Actor128: sam
Location: 55,49
Owner: USSR
Actor129: sam
Location: 63,50
Owner: USSR
Actor130: tsla
Location: 63,92
Owner: BadGuy
Actor131: weap
Location: 66,45
Owner: USSR
ObjectiveDome: dome
Location: 77,61
Owner: BadGuy
Church: v01
Location: 51,58
Owner: USSR
Actor134: v02
Location: 49,60
Owner: USSR
Actor135: v03
Location: 53,61
Owner: USSR
Actor136: v05
Location: 50,63
Owner: USSR
Actor137: v06
Location: 55,64
Owner: USSR
Actor138: v07
Location: 51,65
Owner: USSR
Actor139: v08
Location: 47,63
Owner: USSR
Actor140: apwr
Location: 85,8
Owner: BadGuy
Heavy1: 3tnk
Location: 70,45
Owner: USSR
Facing: 380
Heavy2: 3tnk
Location: 58,45
Owner: USSR
Facing: 636
Actor143: e2
Location: 67,49
Owner: USSR
SubCell: 1
Actor144: dog
Location: 61,47
Owner: USSR
Facing: 380
SubCell: 2
Actor145: e1
Location: 68,59
Owner: USSR
Facing: 508
SubCell: 0
Actor146: e1
Location: 67,75
Owner: BadGuy
Facing: 124
SubCell: 1
Actor147: e1
Location: 67,76
Owner: BadGuy
Facing: 380
SubCell: 4
Actor148: e1
Location: 71,77
Owner: BadGuy
Facing: 124
SubCell: 5
Actor149: e1
Location: 74,76
Owner: BadGuy
Facing: 508
SubCell: 1
Actor150: e1
Location: 72,75
Owner: BadGuy
Facing: 380
SubCell: 0
Actor151: e1
Location: 77,64
Owner: USSR
Facing: 636
SubCell: 1
Actor152: e1
Location: 76,62
Owner: USSR
Facing: 380
SubCell: 5
Actor153: e1
Location: 54,40
Owner: USSR
SubCell: 4
Actor154: e1
Location: 69,40
Owner: USSR
SubCell: 0
Actor155: e1
Location: 68,43
Owner: USSR
SubCell: 1
Actor156: e1
Location: 61,49
Owner: USSR
SubCell: 1
Actor157: e1
Location: 51,44
Owner: USSR
SubCell: 1
Actor158: e2
Location: 54,48
Owner: USSR
SubCell: 0
Actor159: e2
Location: 60,44
Owner: USSR
SubCell: 2
Actor160: e2
Location: 71,39
Owner: USSR
SubCell: 5
Rifle1: e1
Location: 78,81
Owner: USSR
SubCell: 2
Rifle2: e1
Location: 78,79
Owner: USSR
SubCell: 4
Rifle3: e1
Location: 77,80
Owner: USSR
SubCell: 5
Rifle4: e1
Location: 47,71
Owner: USSR
SubCell: 5
Rifle5: e1
Location: 49,71
Owner: USSR
SubCell: 4
Rifle6: e1
Location: 49,70
Owner: USSR
SubCell: 4
DefaultCameraPosition: waypoint
Location: 58,86
Owner: Neutral
TeslaCam: waypoint
Location: 66,94
Owner: Neutral
SouthLZ: waypoint
Location: 54,85
Owner: Neutral
Beach1: waypoint
Location: 65,90
Owner: Neutral
WaterEntry1: waypoint
Location: 66,100
Owner: Neutral
FlameCam: waypoint
Location: 64,66
Owner: Neutral
RadarCam: waypoint
Location: 77,63
Owner: Neutral
ChurchCrate: waypoint
Location: 51,59
Owner: Neutral
ChronoSpawn1: waypoint
Location: 62,59
Owner: Neutral
ChronoSpawn2: waypoint
Location: 61,59
Owner: Neutral
ChronoSpawn3: waypoint
Location: 62,60
Owner: Neutral
Beach2: waypoint
Location: 83,59
Owner: Neutral
Beach3: waypoint
Location: 84,64
Owner: Neutral
WaterEntry2: waypoint
Location: 87,61
Owner: Neutral
EasyCamera: waypoint
Location: 62,36
Owner: Neutral
MissileSubSpawn: waypoint
Location: 66,38
Owner: Neutral
SubPath1: waypoint
Location: 66,33
Owner: Neutral
SubPath2: waypoint
Location: 63,28
Owner: Neutral
SubPath3: waypoint
Location: 63,13
Owner: Neutral
Mammoth: waypoint
Location: 77,39
Owner: Neutral
V2: waypoint
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
FluentMessages: ra|fluent/lua.ftl, ra|fluent/campaign.ftl, map.ftl

View File

@@ -0,0 +1,374 @@
--[[
Copyright (c) The OpenRA Developers and Contributors
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.
]]
FlameWallRevealed = false
TimerTicks = DateTime.Minutes(12)
LSTType = "lst.reinforcement"
RifleSquad1 = { Rifle1, Rifle2, Rifle3 }
RifleSquad2 = { Rifle4, Rifle5, Rifle6 }
Heavys = { Heavy1, Heavy2 }
FlameTowerWall = { FlameTower1, FlameTower2 }
DemoEngiPath = { WaterEntry1.Location, Beach1.Location }
DemoEngiTeam = { "dtrk", "dtrk", "e6", "e6", "e6" }
SovietWaterEntry1 = { WaterEntry2.Location, Beach2.Location }
SovietWaterEntry2 = { WaterEntry2.Location, Beach3.Location }
SovietSquad = { "e1", "e1", "e2", "e4", "e4" }
V2Squad = { "v2rl", "v2rl" }
SubEscapePath = { SubPath1, SubPath2, SubPath3 }
MissionStart = function()
if Difficulty == "normal" then
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(SouthLZ.CenterPosition, Angle.New(780))
end)
Trigger.AfterDelay(DateTime.Seconds(5), function()
UnitsArrived = true
SpawnTemporaryCamera(TeslaCam.Location, DateTime.Seconds(10))
end)
Trigger.AfterDelay(DateTime.Seconds(10), function()
Utils.Do(RifleSquad1, function(actor)
if not actor.IsDead then
actor.AttackMove(SouthLZ.Location)
IdleHunt(actor)
end
end)
end)
Trigger.AfterDelay(DateTime.Seconds(15), function()
Utils.Do(RifleSquad2, function(actor)
if not actor.IsDead then
actor.AttackMove(SouthLZ.Location)
IdleHunt(actor)
end
end)
end)
end
SetupTriggers = function()
SetupFlameWall()
SetupNorthBase()
Trigger.OnKilled(Church, function()
Actor.Create("healcrate", true, { Owner = Greece, Location = ChurchCrate.Location })
end)
Trigger.OnKilled(ObjectiveDome, function()
if not DomeCaptured then
Greece.MarkFailedObjective(CaptureDome)
end
end)
-- 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.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()
end
local demoEngis = Reinforcements.ReinforceWithTransport(Greece, LSTType, DemoEngiTeam, DemoEngiPath, { DemoEngiPath[1] })[2]
Trigger.OnAllRemovedFromWorld(Utils.Where(demoEngis, function(a) return a.Type == "e6" end), function()
if not DomeCaptured then
Greece.MarkFailedObjective(CaptureDome)
end
if not DomeCaptured and bridge.IsDead then
Greece.MarkFailedObjective(StopProduction)
end
end)
Trigger.OnCapture(ObjectiveDome, function()
DomeCaptured = true
Greece.MarkCompletedObjective(CaptureDome)
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()
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)
Trigger.AfterDelay(DateTime.Seconds(5), function()
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)
IdleHunt(a)
end)
end)
end)
Trigger.AfterDelay(DateTime.Seconds(13), function()
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)
IdleHunt(a)
end)
end)
end)
end
MissileSubEscape = function()
local missileSub = Actor.Create("msub", true, { Owner = USSR, Location = MissileSubSpawn.Location })
Actor.Create("camera", true, { Owner = Greece, Location = SubPath2.Location })
DestroySub = AddPrimaryObjective(Greece, "destroy-escaping-submarine")
Utils.Do(SubEscapePath, function(waypoint)
missileSub.Move(waypoint.Location)
end)
Trigger.OnEnteredFootprint({ SubPath3.Location }, function(a, id)
if a.Owner == USSR and a.Type == "msub" then
Trigger.RemoveFootprintTrigger(id)
USSR.MarkCompletedObjective(EscapeWithSub)
end
end)
Trigger.OnKilled(missileSub, function()
Greece.MarkCompletedObjective(DestroySub)
end)
end
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.GetFluentMessage("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)
end
Trigger.AfterDelay(DateTime.Seconds(6), function() UserInterface.SetMissionText("") end)
end
UnitsArrived = false
TimerFinished = false
Ticked = TimerTicks
Tick = function()
if BadGuy.PowerState ~= "Normal" then
PowerDownTeslas()
end
if Greece.HasNoRequiredUnits() and UnitsArrived then
USSR.MarkCompletedObjective(EscapeWithSub)
end
if Ticked > 0 then
if (Ticked % DateTime.Seconds(1)) == 0 then
Timer = UserInterface.GetFluentMessage("submarine-construction-complete-in", { ["time"] = Utils.FormatTime(Ticked) })
UserInterface.SetMissionText(Timer, TimerColor)
end
Ticked = Ticked - 1
elseif Ticked == 0 and not TimerFinished then
FinishTimer()
MissileSubEscape()
TimerFinished = true
end
end
WorldLoaded = function()
Greece = Player.GetPlayer("Greece")
USSR = Player.GetPlayer("USSR")
BadGuy = Player.GetPlayer("BadGuy")
EscapeWithSub = AddPrimaryObjective(USSR, "")
StopProduction = AddPrimaryObjective(Greece, "destroy-soviet-sub-pen")
PowerDownTeslaCoils = AddPrimaryObjective(Greece, "power-down-tesla-coils")
InitObjectives(Greece)
Trigger.AfterDelay(DateTime.Minutes(2), function()
Media.PlaySpeechNotification(Greece, "TenMinutesRemaining")
end)
Trigger.AfterDelay(DateTime.Minutes(7), function()
Media.PlaySpeechNotification(Greece, "WarningFiveMinutesRemaining")
end)
Trigger.AfterDelay(DateTime.Minutes(9), function()
Media.PlaySpeechNotification(Greece, "WarningThreeMinutesRemaining")
end)
Trigger.AfterDelay(DateTime.Minutes(11), function()
Media.PlaySpeechNotification(Greece, "WarningOneMinuteRemaining")
end)
Camera.Position = DefaultCameraPosition.CenterPosition
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

View File

@@ -0,0 +1,69 @@
World:
LuaScript:
Scripts: campaign.lua, utils.lua, production-disruption.lua
MissionData:
WinVideo: battle.vqa
LossVideo: slntsrvc.vqa
Briefing: briefing
StartGameNotification:
Notification: MissionTimerInitialised
ScriptLobbyDropdown@difficulty:
ID: difficulty
Label: dropdown-difficulty.label
Description: dropdown-difficulty.description
Values:
easy: options-difficulty.easy
normal: options-difficulty.normal
hard: options-difficulty.hard
Default: normal
powerproxy.chronoshift:
ChronoshiftPower:
Dimensions: 1, 1
Footprint: x
powerproxy.parabombs:
AirstrikePower:
DisplayBeacon: False
CHALK1:
ParatroopersPower:
DisplayBeacon: False
DropItems: E1, E1, E1, E1, E1
CHALK2:
ParatroopersPower:
DisplayBeacon: False
DropItems: E3, E3, E3, E3, MEDI
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
CTNK:
Chronoshiftable:
ChronoshiftSound:
LST.Reinforcement:
Inherits: LST
RejectsOrders:
-Buildable:
-Selectable:
RenderSprites:
Image: lst
Interactable:
MSUB:
-Cloak:
-GrantConditionOnDamageState@UNCLOAK:
-Targetable@UNDERWATER:
Targetable:
-RequiresCondition:
TSLA:
ExternalCondition@NOACTORSONSELL:
Condition: no-actors-on-sell
SpawnActorsOnSell:
RequiresCondition: !no-actors-on-sell