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 =
A radical faction of our forces has stolen a biological weapon, threatening to use it on Allied emplacements. Since the weapon is highly unstable, it could destroy us all if released.
The facility must be destroyed, but the weapon must be neutralized first. Destroy the island's defenses, then use Volkov to assist our scientist in reaching the bio-research center. If either are killed before the weapon is neutralized, the mission is a failure.
Once the scientist completes his mission, destroy the base.

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

View File

@@ -0,0 +1,578 @@
MapFormat: 12
RequiresMod: ra
Title: Situation Critical
Author: Westwood Studios
Tileset: SNOW
MapSize: 128,128
Bounds: 30,33,65,60
Visibility: MissionSelector
Categories: Mission
LockPreview: True
Players:
PlayerReference@Neutral:
Name: Neutral
OwnsWorld: True
NonCombatant: True
Faction: england
PlayerReference@Ukraine:
Name: Ukraine
Faction: allies
Color: FF8800
PlayerReference@Turkey:
Name: Turkey
Faction: allies
Color: D2997D
Bot: campaign
Enemies: USSR
PlayerReference@USSR:
Name: USSR
AllowBots: False
Playable: True
Required: True
LockFaction: True
Faction: soviet
LockColor: True
Color: FE1100
LockSpawn: True
LockTeam: True
Enemies: Turkey
Actors:
Actor0: brik
Location: 56,54
Owner: Neutral
Actor1: brik
Location: 57,54
Owner: Neutral
Actor2: brik
Location: 58,54
Owner: Neutral
Actor3: brik
Location: 59,54
Owner: Neutral
Actor4: brik
Location: 60,54
Owner: Neutral
Actor5: brik
Location: 61,54
Owner: Neutral
Actor6: brik
Location: 62,54
Owner: Neutral
Actor7: brik
Location: 63,54
Owner: Neutral
Actor8: brik
Location: 56,55
Owner: Neutral
Actor9: brik
Location: 59,55
Owner: Neutral
Actor10: brik
Location: 60,55
Owner: Neutral
Actor11: brik
Location: 63,55
Owner: Neutral
Actor12: brik
Location: 56,56
Owner: Neutral
Actor13: brik
Location: 57,56
Owner: Neutral
Actor14: brik
Location: 58,56
Owner: Neutral
Actor15: brik
Location: 59,56
Owner: Neutral
Actor16: brik
Location: 60,56
Owner: Neutral
Actor17: brik
Location: 61,56
Owner: Neutral
Actor18: brik
Location: 62,56
Owner: Neutral
Actor19: brik
Location: 63,56
Owner: Neutral
Actor20: brik
Location: 56,57
Owner: Neutral
Actor21: brik
Location: 63,57
Owner: Neutral
Actor22: brik
Location: 56,58
Owner: Neutral
Actor23: brik
Location: 63,58
Owner: Neutral
Actor24: brik
Location: 56,59
Owner: Neutral
Actor25: brik
Location: 63,59
Owner: Neutral
Actor26: brik
Location: 56,60
Owner: Neutral
Actor27: brik
Location: 57,60
Owner: Neutral
Actor28: brik
Location: 62,60
Owner: Neutral
Actor29: brik
Location: 63,60
Owner: Neutral
Actor30: brik
Location: 56,61
Owner: Neutral
Actor31: brik
Location: 57,61
Owner: Neutral
Actor32: brik
Location: 62,61
Owner: Neutral
Actor33: brik
Location: 63,61
Owner: Neutral
Actor34: t01
Location: 83,83
Owner: Neutral
Actor35: tc04
Location: 39,47
Owner: Neutral
Actor36: tc04
Location: 72,55
Owner: Neutral
Actor37: tc05
Location: 70,67
Owner: Neutral
Actor38: tc02
Location: 59,86
Owner: Neutral
Actor39: tc04
Location: 58,71
Owner: Neutral
Actor40: tc03
Location: 59,73
Owner: Neutral
Actor41: tc01
Location: 48,66
Owner: Neutral
Actor42: t02
Location: 48,46
Owner: Neutral
Actor43: ice04
Location: 86,60
Owner: Neutral
Actor44: ice02
Location: 50,82
Owner: Neutral
Actor45: ice05
Location: 38,52
Owner: Neutral
Actor46: ice01
Location: 38,42
Owner: Neutral
Actor47: ice02
Location: 37,43
Owner: Neutral
Actor48: ice05
Location: 59,39
Owner: Neutral
Actor49: ice05
Location: 69,42
Owner: Neutral
Actor50: ice04
Location: 69,41
Owner: Neutral
Actor51: ice04
Location: 80,40
Owner: Neutral
Actor52: ice05
Location: 83,43
Owner: Neutral
Actor53: ice04
Location: 82,53
Owner: Neutral
Actor54: ice03
Location: 85,59
Owner: Neutral
Actor55: ice02
Location: 70,83
Owner: Neutral
Actor56: ice01
Location: 71,83
Owner: Neutral
Actor57: ice03
Location: 70,85
Owner: Neutral
Actor58: ice04
Location: 72,85
Owner: Neutral
Actor59: tc05
Location: 71,46
Owner: Neutral
Actor60: t13
Location: 69,74
Owner: Neutral
Actor61: tc03
Location: 89,58
Owner: Neutral
Actor62: t17
Location: 53,67
Owner: Neutral
Actor63: tc01
Location: 59,52
Owner: Neutral
Actor64: t13
Location: 48,55
Owner: Neutral
Actor65: t13
Location: 90,59
Owner: Neutral
Actor66: t15
Location: 80,49
Owner: Neutral
Actor67: tc04
Location: 81,82
Owner: Neutral
Actor68: tc05
Location: 80,84
Owner: Neutral
Actor69: tc03
Location: 83,85
Owner: Neutral
Actor70: t17
Location: 91,58
Owner: Neutral
Actor71: tsla
Location: 48,85
Owner: Turkey
Actor72: tsla
Location: 59,86
Owner: Turkey
Actor73: tsla
Location: 78,70
Owner: Turkey
Actor74: tsla
Location: 76,42
Owner: Turkey
Actor75: tsla
Location: 42,42
Owner: Turkey
Sam1: sam
Location: 67,75
Owner: Turkey
Sam2: sam
Location: 65,75
Owner: Turkey
Sam3: sam
Location: 66,76
Owner: Turkey
Sam4: sam
Location: 48,64
Owner: Turkey
Sam5: sam
Location: 50,64
Owner: Turkey
Sam6: sam
Location: 49,63
Owner: Turkey
Sam7: sam
Location: 48,51
Owner: Turkey
Sam8: sam
Location: 50,51
Owner: Turkey
Sam9: sam
Location: 49,50
Owner: Turkey
Sam10: sam
Location: 71,51
Owner: Turkey
Sam11: sam
Location: 73,51
Owner: Turkey
Sam12: sam
Location: 72,52
Owner: Turkey
BioLab: bio
Location: 59,57
Owner: Turkey
Silo1: mslo
Location: 57,55
Owner: Turkey
Silo2: mslo
Location: 61,55
Owner: Turkey
Actor91: tsla
Location: 42,67
Owner: Turkey
Actor92: powr
Location: 46,83
Owner: Turkey
Actor93: powr
Location: 44,83
Owner: Turkey
Actor94: powr
Location: 42,68
Owner: Turkey
Actor95: powr
Location: 43,71
Owner: Turkey
Actor96: powr
Location: 44,41
Owner: Turkey
Actor97: powr
Location: 42,43
Owner: Turkey
Actor98: powr
Location: 74,42
Owner: Turkey
Actor99: powr
Location: 77,42
Owner: Turkey
Actor100: powr
Location: 77,71
Owner: Turkey
Actor101: powr
Location: 77,67
Owner: Turkey
Actor102: powr
Location: 63,85
Owner: Turkey
Actor103: powr
Location: 65,85
Owner: Turkey
TeamOne1: e1
Location: 47,54
Owner: Turkey
Facing: 128
SubCell: 4
TeamOne2: e2
Location: 46,54
Owner: Turkey
SubCell: 0
TeamOne3: e1
Location: 47,55
Owner: Turkey
SubCell: 1
TeamTwo1: e1
Location: 51,71
Owner: Turkey
Facing: 128
SubCell: 5
TeamTwo2: e1
Location: 51,71
Owner: Turkey
Facing: 128
SubCell: 1
TeamTwo3: e2
Location: 50,70
Owner: Turkey
SubCell: 2
TeamThree1: e1
Location: 68,79
Owner: Turkey
Facing: 256
SubCell: 1
TeamThree2: e1
Location: 68,79
Owner: Turkey
Facing: 256
SubCell: 5
TeamThree3: e2
Location: 68,79
Owner: Turkey
Facing: 256
SubCell: 5
TeamFour1: e1
Location: 66,44
Owner: Turkey
Facing: 640
SubCell: 1
TeamFour2: e1
Location: 66,43
Owner: Turkey
Facing: 640
SubCell: 4
TeamFour3: e2
Location: 66,44
Owner: Turkey
Facing: 640
SubCell: 2
TeamFive1: e1
Location: 75,58
Owner: Turkey
Facing: 512
SubCell: 5
TeamFive2: e2
Location: 75,58
Owner: Turkey
Facing: 512
SubCell: 4
TeamFive3: e1
Location: 75,58
Owner: Turkey
Facing: 512
SubCell: 1
Shok1: shok
Location: 54,50
Owner: Turkey
Facing: 384
SubCell: 1
Shok2: shok
Location: 51,62
Owner: Turkey
SubCell: 0
Shok3: shok
Location: 63,68
Owner: Turkey
Facing: 384
SubCell: 1
Shok4: shok
Location: 69,52
Owner: Turkey
Facing: 640
SubCell: 0
Actor123: ss
Location: 35,34
Owner: USSR
Facing: 768
Actor124: ss
Location: 36,35
Owner: USSR
Facing: 768
Actor125: ss
Location: 35,36
Owner: USSR
Facing: 768
MSub1: msub
Location: 32,35
Owner: USSR
Facing: 768
MSub2: msub
Location: 31,36
Owner: USSR
Facing: 768
MSub3: msub
Location: 31,34
Owner: USSR
Facing: 768
MSub4: msub
Location: 30,35
Owner: USSR
Facing: 768
Actor129: ss
Location: 71,36
Owner: Turkey
Facing: 128
Actor130: ss
Location: 81,60
Owner: Turkey
Facing: 896
Actor131: ss
Location: 59,83
Owner: Turkey
Facing: 256
Actor132: ss
Location: 34,57
Owner: Turkey
Facing: 128
Actor133: ss
Location: 36,81
Owner: Turkey
Actor134: ss
Location: 74,87
Owner: Turkey
Facing: 896
Actor135: ss
Location: 91,39
Owner: Turkey
Facing: 384
Actor137: ss
Location: 34,35
Owner: USSR
Facing: 768
DefaultCameraPosition: waypoint
Location: 32,35
Owner: Neutral
LZ: waypoint
Location: 53,75
Owner: Neutral
LSTEntry: waypoint
Location: 54,92
Owner: Neutral
InnerPatrol1: waypoint
Location: 54,50
Owner: Neutral
InnerPatrol2: waypoint
Location: 68,50
Owner: Neutral
InnerPatrol3: waypoint
Location: 63,68
Owner: Neutral
InnerPatrol4: waypoint
Location: 51,62
Owner: Neutral
OuterPatrol1: waypoint
Location: 44,44
Owner: Neutral
OuterPatrol2: waypoint
Location: 64,42
Owner: Neutral
OuterPatrol3: waypoint
Location: 80,44
Owner: Neutral
OuterPatrol4: waypoint
Location: 75,56
Owner: Neutral
OuterPatrol5: waypoint
Location: 70,79
Owner: Neutral
OuterPatrol6: waypoint
Location: 48,71
Owner: Neutral
OuterPatrol7: waypoint
Location: 46,56
Owner: Neutral
TacticalNuke1: waypoint
Location: 60,56
Owner: Neutral
TacticalNuke2: waypoint
Location: 55,58
Owner: Neutral
TacticalNuke3: waypoint
Location: 57,61
Owner: Neutral
GasEntry: waypoint
Location: 60,57
Owner: Neutral
LaunchCameraMark: waypoint
Location: 59,57
Owner: Neutral
TacticalNukeCenter: waypoint
Location: 62,54
Owner: Neutral
Rules: ra|rules/campaign-rules.yaml, ra|rules/campaign-tooltips.yaml, ra|rules/campaign-palettes.yaml, rules.yaml
Weapons: weapons.yaml
FluentMessages: ra|fluent/lua.ftl, ra|fluent/campaign.ftl, map.ftl

View File

@@ -0,0 +1,119 @@
World:
LuaScript:
Scripts: campaign.lua, utils.lua, situation-critical.lua
MissionData:
WinVideo: flare.vqa
LossVideo: nukestok.vqa
Briefing: briefing
TimeLimitManager:
SkipTimerExpiredNotification: true
VOLK:
Inherits: GNRL
-AutoTarget:
-AutoTargetPriority@DEFAULT:
-AutoTargetPriority@ATTACKANYTHING:
AttackMove:
-AssaultMoveCondition:
Valued:
Cost: 1200
Tooltip:
Name: actor-volk-name
Health:
HP: 15000
Armor:
Type: Heavy
RevealsShroud:
Range: 6c0
Demolition:
Mobile:
Voice: Action
AttackFrontal:
Voice: Action
FacingTolerance: 0
AttackMove:
Voice: Action
Passenger:
Voice: Action
Guard:
Voice: Action
Voiced:
VoiceSet: GenericVoice
Armament:
Weapon: VolkovWeapon
RenderSprites:
Image: GNRL
LST.Reinforcement:
Inherits: LST
RejectsOrders:
-Buildable:
-Selectable:
RenderSprites:
Image: lst
Interactable:
Cargo:
BetweenUnloadDelay: 10
MSLO:
Power:
Amount: 0
-WithColoredOverlay@IDISABLE:
NukePower:
DisplayTimerRelationships: Neutral
ExternalCondition@NODEMO:
Condition: demolish-disabled
Demolishable:
RequiresCondition: !demolish-disabled
DamageMultiplier@NODEMO:
Modifier: 0
RequiresCondition: demolish-disabled
SAM:
-WithColoredOverlay@IDISABLE:
RevealsShroud:
Range: 2c0
RevealsShroud@GAPGEN:
Range: 2c0
BADR.Bomber:
Aircraft:
Speed: 373
Tooltip:
Name: actor-strategic-bomber-name
RenderSprites:
Image: U2
FLARE:
Tooltip:
Name: actor-gas-name
powerproxy.parabombs:
AirstrikePower:
DisplayBeacon: False
CAMERA.Bomber:
Inherits: CAMERA
RevealsShroud:
Range: 12c0
DELPHI:
Tooltip:
Name: actor-scientist-name
Infiltrates:
Types: ScientistInfiltrate
ExternalCondition:
Condition: can-be-targeted
Targetable:
RequiresCondition: can-be-targeted
BIO:
Targetable:
TargetTypes: GroundActor, Structure, C4, DetonateAttack, ScientistInfiltrate
ExternalCondition@NODEMO:
Condition: demolish-disabled
Demolishable:
RequiresCondition: !demolish-disabled
DamageMultiplier@NODEMO:
Modifier: 0
RequiresCondition: demolish-disabled

View File

@@ -0,0 +1,316 @@
--[[
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.
]]
local USSR = Player.GetPlayer("USSR")
local Turkey = Player.GetPlayer("Turkey")
local Ukraine = Player.GetPlayer("Ukraine")
local MissileSubs = { MSub1, MSub2, MSub3, MSub4 }
local VolkovEntryPath = { LSTEntry.Location, LZ.Location }
local VolkovAndFriend = { "delphi", "volk" }
local InsertionTransport = "lst.reinforcement"
local SamSites = { Sam1, Sam2, Sam3, Sam4, Sam5, Sam6, Sam7, Sam8, Sam9, Sam10, Sam11, Sam12 }
local PrimaryTargets = { BioLab, Silo1, Silo2 }
local Shocktroopers = { Shok1, Shok2, Shok3, Shok4 }
local GuardLab = AddPrimaryObjective(Turkey, "")
local KillPower = AddPrimaryObjective(USSR, "kill-power")
local InfiltrateLab = AddPrimaryObjective(USSR, "infiltrate-bio-weapons-lab-scientist")
local DestroyFacility = AddPrimaryObjective(USSR, "destroy-bio-weapons-lab-missile-silos")
local KillSams = AddSecondaryObjective(USSR, "destroy-all-sam-sites-strategic-bombers")
local VolkovSurvive = AddPrimaryObjective(USSR, "volkov-survive")
local LabInfiltrated = false
local VolkovArrived = false
local LaunchStarted = false
local BombersCalled = false
local LowPowerDuration = 0
local LowPowerThreshold = DateTime.Seconds(2)
local TimerTicks = DateTime.Minutes(8)
local TimerColor = Turkey.Color
---@type cpos[][]
local InnerPatrolPaths =
{
{ InnerPatrol2.Location, InnerPatrol3.Location, InnerPatrol4.Location, InnerPatrol1.Location },
{ InnerPatrol3.Location, InnerPatrol2.Location, InnerPatrol1.Location, InnerPatrol4.Location },
{ InnerPatrol4.Location, InnerPatrol1.Location, InnerPatrol2.Location, InnerPatrol3.Location },
{ InnerPatrol1.Location, InnerPatrol4.Location, InnerPatrol3.Location, InnerPatrol2.Location }
}
---@type actor[][]
local OuterPatrols =
{
{ TeamOne1, TeamOne2, TeamOne3 },
{ TeamTwo1, TeamTwo2, TeamTwo3 },
{ TeamThree1, TeamThree2, TeamThree3 },
{ TeamFour1, TeamFour2, TeamFour3 },
{ TeamFive1, TeamFive2, TeamFive3 }
}
---@type cpos[][]
local OuterPatrolPaths =
{
{ OuterPatrol1.Location, OuterPatrol2.Location, OuterPatrol3.Location, OuterPatrol4.Location, OuterPatrol5.Location, OuterPatrol6.Location, OuterPatrol7.Location },
{ OuterPatrol5.Location, OuterPatrol4.Location, OuterPatrol3.Location, OuterPatrol2.Location, OuterPatrol1.Location, OuterPatrol7.Location, OuterPatrol6.Location },
{ OuterPatrol6.Location, OuterPatrol7.Location, OuterPatrol1.Location, OuterPatrol2.Location, OuterPatrol3.Location, OuterPatrol4.Location, OuterPatrol5.Location },
{ OuterPatrol3.Location, OuterPatrol4.Location, OuterPatrol5.Location, OuterPatrol6.Location, OuterPatrol7.Location, OuterPatrol1.Location, OuterPatrol2.Location },
{ OuterPatrol3.Location, OuterPatrol2.Location, OuterPatrol1.Location, OuterPatrol7.Location, OuterPatrol6.Location, OuterPatrol5.Location, OuterPatrol4.Location }
}
local function IsVolkovNearBlast()
-- Within this radius, most normal infantry are left at 20% HP or less.
local cyborgsInDanger = Map.ActorsInCircle(TacticalNukeCenter.CenterPosition, WDist.FromCells(12), function(a)
return a.Type == "volk"
end)
return #cyborgsInDanger == 1
end
local function ClearCountdown()
UserInterface.SetMissionText("")
DateTime.TimeLimit = 0
TimerTicks = 0
end
---@param duration integer
local function SetRunText(duration)
local text = UserInterface.GetFluentMessage("run-for-it")
local seconds = math.floor(duration / DateTime.Seconds(1))
Media.PlaySoundNotification(USSR, "AlertBleep")
for i = 0, seconds - 1, 1 do
local color = Ukraine.Color
if i % 2 ~= 0 then
color = HSLColor.White
end
Trigger.AfterDelay(DateTime.Seconds(i), function() UserInterface.SetMissionText(text, color) end)
end
Trigger.AfterDelay(duration, function() UserInterface.SetMissionText("") end)
end
---@param units actor[]
---@param path cpos[]
---@param delay integer
local function GroupPatrol(units, path, delay)
local i = 1
local stop = false
Utils.Do(units, function(unit)
Trigger.OnIdle(unit, function()
if stop then
return
end
if unit.Location ~= path[i] then
unit.AttackMove(path[i])
return
end
local bool = Utils.All(units, function(actor) return actor.IsIdle or actor.IsDead end)
if bool then
stop = true
i = i + 1
if i > #path then
i = 1
end
Trigger.AfterDelay(delay, function() stop = false end)
end
end)
end)
end
local function StartPatrols()
for i = 1, 5 do
GroupPatrol(OuterPatrols[i], OuterPatrolPaths[i], DateTime.Seconds(3))
end
for i = 1, 4 do
Trigger.AfterDelay(DateTime.Seconds(3 * (i - 1)), function()
if Shocktroopers[i].IsDead then
return
end
Trigger.OnIdle(Shocktroopers[i], function()
Shocktroopers[i].Patrol(InnerPatrolPaths[i])
end)
end)
end
end
local function LaunchMissiles()
if LaunchStarted then
return
end
LaunchStarted = true
UserInterface.SetMissionText(UserInterface.GetFluentMessage("too-late"), USSR.Color)
Actor.Create("camera", true, { Owner = USSR, Location = LaunchCameraMark.Location })
-- Edge case that seems impossible in RA1.
if Silo1.IsDead and Silo2.IsDead and not BioLab.IsDead then
Actor.Create("flare", true, { Owner = Ukraine, Location = GasEntry.Location })
BioLab.GrantCondition("demolish-disabled")
return
end
Camera.Position = LaunchCameraMark.CenterPosition
local delay = 15
Utils.Do({ Silo1, Silo2 }, function(silo)
Trigger.AfterDelay(delay, function()
if silo.IsDead then
return
end
silo.ActivateNukePower(DefaultCameraPosition.Location)
end)
if not silo.IsDead then
silo.GrantCondition("demolish-disabled")
delay = delay + 15
end
end)
end
local function SendInBombers()
if LaunchStarted or not LabInfiltrated or not USSR.IsObjectiveCompleted(KillSams) then
return
end
BombersCalled = true
ClearCountdown()
local bombDelay = DateTime.Seconds(2)
Trigger.AfterDelay(DateTime.Seconds(1), function()
Actor.Create("camera.bomber", true, { Owner = USSR, Location = TacticalNukeCenter.Location })
end)
if IsVolkovNearBlast() then
bombDelay = DateTime.Seconds(8)
SetRunText(bombDelay + DateTime.Seconds(1))
end
Trigger.AfterDelay(bombDelay, function()
local proxy = Actor.Create("powerproxy.parabombs", false, { Owner = USSR })
proxy.TargetAirstrike(TacticalNuke1.CenterPosition, Angle.SouthWest)
proxy.TargetAirstrike(TacticalNuke2.CenterPosition, Angle.SouthWest)
proxy.TargetAirstrike(TacticalNuke3.CenterPosition, Angle.SouthWest)
proxy.Destroy()
end)
end
local function SendInVolkov()
if VolkovArrived or LowPowerDuration < LowPowerThreshold then
return
end
VolkovArrived = true
USSR.MarkCompletedObjective(KillPower)
Media.PlaySpeechNotification(USSR, "ReinforcementsArrived")
Beacon.New(USSR, LZ.CenterPosition, DateTime.Seconds(6))
local teamVolkov = Reinforcements.ReinforceWithTransport(USSR, InsertionTransport, VolkovAndFriend, VolkovEntryPath, { VolkovEntryPath[1] })[2]
local scientist, volkov = teamVolkov[1], teamVolkov[2]
Trigger.OnKilled(volkov, function()
USSR.MarkFailedObjective(VolkovSurvive)
end)
Trigger.OnAddedToWorld(volkov, function()
Media.DisplayMessage(UserInterface.GetFluentMessage("software-update-failed-manual-targets"), UserInterface.GetFluentMessage("volkov"))
end)
Trigger.OnAddedToWorld(scientist, function(b)
Trigger.OnKilled(b, function()
if not LabInfiltrated then
USSR.MarkFailedObjective(InfiltrateLab)
end
end)
Trigger.AfterDelay(DateTime.Seconds(5), function()
if not scientist.IsDead then
scientist.GrantCondition("can-be-targeted")
end
end)
end)
end
local function SetupStartTriggers()
Trigger.OnAllKilled(SamSites, function()
USSR.MarkCompletedObjective(KillSams)
SendInBombers()
end)
Trigger.OnInfiltrated(BioLab, function()
Media.DisplayMessage(UserInterface.GetFluentMessage("plans-stolen-erase-data"), UserInterface.GetFluentMessage("scientist"))
Trigger.AfterDelay(DateTime.Seconds(5), function()
USSR.MarkCompletedObjective(InfiltrateLab)
LabInfiltrated = true
SendInBombers()
end)
end)
Trigger.OnKilled(BioLab, function()
if not LabInfiltrated then
USSR.MarkFailedObjective(InfiltrateLab)
end
end)
Trigger.OnAllKilled(PrimaryTargets, function()
if LaunchStarted then
return
end
if not BombersCalled then
ClearCountdown()
end
USSR.MarkCompletedObjective(DestroyFacility)
Trigger.AfterDelay(DateTime.Seconds(2), function()
USSR.MarkCompletedObjective(VolkovSurvive)
end)
end)
Trigger.OnAllKilled(MissileSubs, function()
if not VolkovArrived then
USSR.MarkFailedObjective(KillPower)
end
end)
end
Tick = function()
if Turkey.PowerState ~= "Normal" then
LowPowerDuration = LowPowerDuration + 1
SendInVolkov()
else
LowPowerDuration = 0
end
if TimerTicks > 0 then
if (TimerTicks % DateTime.Seconds(1)) == 0 then
local text = UserInterface.GetFluentMessage("missiles-launch-in", { ["time"] = Utils.FormatTime(TimerTicks) })
UserInterface.SetMissionText(text, TimerColor)
end
TimerTicks = TimerTicks - 1
elseif TimerTicks == 0 and not BombersCalled and not USSR.IsObjectiveCompleted(DestroyFacility) then
Turkey.MarkCompletedObjective(GuardLab)
LaunchMissiles()
end
end
WorldLoaded = function()
InitObjectives(USSR)
StartPatrols()
SetupStartTriggers()
Camera.Position = DefaultCameraPosition.CenterPosition
DateTime.TimeLimit = TimerTicks
end

View File

@@ -0,0 +1,80 @@
VolkovWeapon:
Inherits: SilencedPPK
ReloadDelay: 25
Range: 6c0
Warhead@1Dam: SpreadDamage
Spread: 128
Versus:
None: 90
Wood: 75
Light: 60
Heavy: 25
Concrete: 0
DamageTypes: Prone50Percent, TriggerProne, FireDeath
Warhead@2Eff: CreateEffect
Explosions: piff
ValidTargets: Ground, GroundActor, Ship, Trees
Warhead@3EffWater: CreateEffect
Explosions: water_piff
ValidTargets: Water, Underwater
InvalidTargets: Ship, Structure, Bridge
ParaBomb:
ReloadDelay: 50
ValidTargets: Ground, Water, GroundActor, WaterActor, Underwater, AirborneActor, Trees
Warhead@1Dam_impact: SpreadDamage
Spread: 1c0
Damage: 15000
Falloff: 1000, 368, 135, 50, 18, 7, 0
ValidTargets: GroundActor, WaterActor, Underwater, AirborneActor, Trees
Versus:
Wood: 1000
Concrete: 25
DamageTypes: Prone50Percent, TriggerProne, FireDeath, Incendiary
Warhead@3Smu_impact: LeaveSmudge
SmudgeType: Scorch
ValidTargets: Ground, Infantry
Size: 1
Warhead@4Eff_impact: CreateEffect
Explosions: nuke
ImpactSounds: kaboom1.aud
ImpactActors: false
ValidTargets: Ground, Water, Air
Warhead@5Dam_areanuke1: SpreadDamage
Spread: 2c0
Damage: 6000
Falloff: 1000, 368, 135, 50, 18, 7, 0
Delay: 5
ValidTargets: GroundActor, WaterActor, Underwater, AirborneActor, Trees
Versus:
Wood: 1000
Concrete: 25
DamageTypes: Prone50Percent, TriggerProne, FireDeath, Incendiary
Warhead@7Smu_areanuke1: LeaveSmudge
SmudgeType: Scorch
ValidTargets: Ground, Infantry
Size: 2
Delay: 5
Warhead@8Eff_areanuke1: CreateEffect
ImpactSounds: kaboom22.aud
Delay: 5
ImpactActors: false
Warhead@9Dam_areanuke2: SpreadDamage
Spread: 3c0
Damage: 6000
Falloff: 1000, 368, 135, 50, 18, 7, 0
Delay: 10
ValidTargets: GroundActor, Trees, WaterActor, Underwater, AirborneActor
Versus:
Wood: 50
Tree: 200
Concrete: 25
DamageTypes: Prone50Percent, TriggerProne, FireDeath, Incendiary
Warhead@12Smu_areanuke2: LeaveSmudge
SmudgeType: Scorch
ValidTargets: Ground, Infantry
Size: 3
Delay: 10
Warhead@13FlashEffect: FlashEffect
Duration: 20
FlashType: Nuke