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,5 @@
## rules.yaml
briefing =
A small village friendly to our cause has been increasingly harassed by GDI, and the Brotherhood wishes you to assist them in their efforts.
Seek out the enemy village and destroy it. The event will be disguised as a GDI attack.

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

View File

@@ -0,0 +1,541 @@
MapFormat: 12
RequiresMod: cnc
Title: 04b: Mao Civil War
Author: Westwood Studios
Tileset: DESERT
MapSize: 64,64
Bounds: 11,6,46,34
Visibility: MissionSelector
Categories: Campaign
LockPreview: True
Players:
PlayerReference@Neutral:
Name: Neutral
OwnsWorld: True
NonCombatant: True
Faction: gdi
PlayerReference@NodSupporter:
Name: NodSupporter
NonCombatant: True
Faction: nod
Bot: campaign
PlayerReference@GDI:
Name: GDI
Faction: gdi
Color: F5D378
Enemies: Nod
Bot: campaign
PlayerReference@Nod:
Name: Nod
Playable: True
AllowBots: False
Required: True
LockFaction: True
Faction: nod
LockColor: True
Color: FE1100
LockSpawn: True
LockTeam: True
Enemies: GDI
Actors:
Actor0: t08
Location: 34,20
Owner: Neutral
Actor1: t18
Location: 33,18
Owner: Neutral
Actor2: t18
Location: 33,9
Owner: Neutral
Actor3: t08
Location: 41,5
Owner: Neutral
Actor4: t18
Location: 42,15
Owner: Neutral
Actor5: t08
Location: 45,26
Owner: Neutral
Actor6: t08
Location: 56,29
Owner: Neutral
Actor7: t08
Location: 55,29
Owner: Neutral
Actor8: t08
Location: 51,26
Owner: Neutral
Actor9: t08
Location: 56,18
Owner: Neutral
Actor10: t08
Location: 52,16
Owner: Neutral
Actor11: t08
Location: 45,21
Owner: Neutral
Actor12: t08
Location: 38,19
Owner: Neutral
Actor13: t08
Location: 23,16
Owner: Neutral
Actor14: t08
Location: 14,22
Owner: Neutral
Actor15: t08
Location: 26,22
Owner: Neutral
Actor16: t08
Location: 21,26
Owner: Neutral
Actor17: t08
Location: 48,6
Owner: Neutral
Actor18: t08
Location: 15,19
Owner: Neutral
Actor19: t08
Location: 31,15
Owner: Neutral
Actor20: t18
Location: 49,34
Owner: Neutral
Actor21: t18
Location: 48,38
Owner: Neutral
Actor22: t18
Location: 42,35
Owner: Neutral
Actor23: t18
Location: 54,37
Owner: Neutral
Actor24: t08
Location: 51,35
Owner: Neutral
Actor25: t08
Location: 45,37
Owner: Neutral
Actor26: t08
Location: 47,33
Owner: Neutral
Actor27: t18
Location: 13,10
Owner: Neutral
Actor28: t18
Location: 20,7
Owner: Neutral
Actor30: t08
Location: 12,8
Owner: Neutral
Actor31: t08
Location: 23,9
Owner: Neutral
Actor32: v35
Location: 48,38
Owner: NodSupporter
Actor33: v34
Location: 46,33
Owner: NodSupporter
Actor35: v32
Location: 54,35
Owner: NodSupporter
Actor36: v30
Location: 48,32
Owner: NodSupporter
Actor37: v30
Location: 52,34
Owner: NodSupporter
Actor38: v31
Location: 52,35
Owner: NodSupporter
Actor39: v32
Location: 46,37
Owner: NodSupporter
Health: 73
Actor41: v34
Location: 49,38
Owner: NodSupporter
Actor42: v35
Location: 46,32
Owner: NodSupporter
Actor43: v36
Location: 48,37
Owner: NodSupporter
Actor44: v32
Location: 49,33
Owner: NodSupporter
Actor45: v34
Location: 50,34
Owner: NodSupporter
Actor46: v20
Location: 15,10
Owner: GDI
Actor47: v21
Location: 12,10
Owner: GDI
Actor48: v22
Location: 21,11
Owner: GDI
Actor49: v23
Location: 22,8
Owner: GDI
Actor50: v24
Location: 18,8
Owner: GDI
Actor51: v25
Location: 13,7
Owner: GDI
Actor52: v26
Location: 20,9
Owner: GDI
Actor53: v27
Location: 15,9
Owner: GDI
Actor54: v27
Location: 14,9
Owner: GDI
Actor55: v27
Location: 13,9
Owner: GDI
Actor56: v28
Location: 21,7
Owner: GDI
Actor57: v29
Location: 22,7
Owner: GDI
Actor58: v30
Location: 21,10
Owner: GDI
Actor59: v30
Location: 23,8
Owner: GDI
Actor61: jeep
Location: 15,23
Owner: GDI
Facing: 640
Actor62: jeep
Location: 36,6
Owner: GDI
Facing: 384
Actor65: mtnk
Location: 29,10
Owner: GDI
Facing: 256
Actor71: jeep
Location: 24,26
Owner: GDI
Facing: 384
Actor72: jeep
Location: 37,19
Owner: GDI
Facing: 128
Actor73: jeep
Location: 27,33
Owner: GDI
Facing: 384
Actor86: e1
Location: 43,15
Owner: GDI
Health: 88
Facing: 128
SubCell: 3
Actor99: e1
Location: 45,15
Owner: GDI
SubCell: 3
Actor100: e1
Location: 43,15
Owner: GDI
Health: 94
Facing: 128
SubCell: 4
Actor105: e1
Location: 46,14
Owner: GDI
SubCell: 2
Actor106: e1
Location: 18,29
Owner: GDI
Facing: 384
SubCell: 4
Actor107: e1
Location: 12,20
Owner: GDI
SubCell: 1
Actor108: e1
Location: 39,23
Owner: GDI
SubCell: 1
Actor119: e2
Location: 18,8
Owner: GDI
Facing: 512
SubCell: 3
Actor120: e2
Location: 16,10
Owner: GDI
Facing: 384
SubCell: 2
Actor121: e2
Location: 27,19
Owner: GDI
Facing: 512
SubCell: 1
Actor122: e2
Location: 25,34
Owner: GDI
SubCell: 4
Actor123: e1
Location: 13,13
Owner: GDI
Facing: 512
SubCell: 1
Actor124: e1
Location: 13,13
Owner: GDI
Facing: 512
SubCell: 2
Actor125: e2
Location: 13,13
Owner: GDI
Facing: 512
SubCell: 4
Actor126: e2
Location: 13,13
Owner: GDI
Facing: 512
SubCell: 3
Actor127: e2
Location: 29,18
Owner: GDI
Facing: 256
SubCell: 3
Actor128: e2
Location: 27,22
Owner: GDI
Facing: 256
SubCell: 1
Actor129: e2
Location: 36,10
Owner: GDI
Health: 38
Facing: 256
SubCell: 0
Actor131: e1
Location: 21,12
Owner: GDI
Facing: 512
SubCell: 4
Actor132: e1
Location: 22,12
Owner: GDI
Facing: 512
SubCell: 3
Actor29: t18
Location: 14,7
Owner: Neutral
waypoint27: waypoint
Location: 35,25
Owner: Neutral
waypoint26: waypoint
Location: 44,6
Owner: Neutral
waypoint9: waypoint
Location: 26,19
Owner: Neutral
waypoint8: waypoint
Location: 53,37
Owner: Neutral
waypoint7: waypoint
Location: 47,35
Owner: Neutral
waypoint6: waypoint
Location: 45,11
Owner: Neutral
waypoint5: waypoint
Location: 40,17
Owner: Neutral
waypoint4: waypoint
Location: 39,34
Owner: Neutral
waypoint3: waypoint
Location: 21,38
Owner: Neutral
waypoint2: waypoint
Location: 20,28
Owner: Neutral
waypoint1: waypoint
Location: 13,26
Owner: Neutral
waypoint0: waypoint
Location: 13,14
Owner: Neutral
Civilian1: v33
Location: 48,34
Owner: Neutral
Health: 62
Civilian2: v33
Location: 54,37
Owner: Neutral
Soldier1: e2
Location: 22,15
Owner: GDI
Facing: 384
SubCell: 2
Soldier2: e1
Location: 17,14
Owner: GDI
Facing: 384
SubCell: 4
Soldier3: e2
Location: 13,16
Owner: GDI
Facing: 384
SubCell: 1
GDICiv1: c9
Location: 20,12
Owner: GDI
SubCell: 3
GDICiv2: c4
Location: 18,7
Owner: GDI
SubCell: 0
GDICiv3: c9
Location: 19,12
Owner: GDI
SubCell: 1
GDICiv4: c8
Location: 16,8
Owner: GDI
SubCell: 3
GDICiv5: c7
Location: 17,9
Owner: GDI
SubCell: 1
GDICiv6: c6
Location: 24,13
Owner: GDI
SubCell: 2
GDICiv7: c5
Location: 20,7
Owner: GDI
SubCell: 4
GDICiv8: c4
Location: 14,12
Owner: GDI
SubCell: 1
GDICiv9: c3
Location: 15,10
Owner: GDI
SubCell: 2
GDICiv10: c2
Location: 14,10
Owner: GDI
SubCell: 1
GDICiv11: c1
Location: 17,7
Owner: GDI
SubCell: 2
GDICiv12: c1
Location: 20,10
Owner: GDI
SubCell: 1
GDICiv13: c1
Location: 20,11
Owner: GDI
SubCell: 3
UnitsEntryBuggy: waypoint
Location: 52,6
Owner: Neutral
UnitsRallyBuggy: waypoint
Location: 52,10
Owner: Neutral
UnitsEntryBikes: waypoint
Location: 50,6
Owner: Neutral
UnitsRallyBikes: waypoint
Location: 50,10
Owner: Neutral
UnitsEntryGunner: waypoint
Location: 54,6
Owner: Neutral
UnitsRallyGunner: waypoint
Location: 54,10
Owner: Neutral
UnitsEntryRocket: waypoint
Location: 56,12
Owner: Neutral
UnitsRallyRocket: waypoint
Location: 54,12
Owner: Neutral
NodCiv1: c8
Location: 46,36
Owner: NodSupporter
Facing: 512
SubCell: 2
NodCiv2: e3
Location: 48,36
Owner: NodSupporter
Facing: 768
SubCell: 4
NodCiv3: c4
Location: 52,38
Owner: NodSupporter
Facing: 768
SubCell: 1
NodCiv4: c3
Location: 45,35
Owner: NodSupporter
Facing: 128
SubCell: 4
NodCiv5: c1
Location: 51,36
Owner: NodSupporter
Facing: 896
SubCell: 2
NodCiv6: c2
Location: 45,34
Owner: NodSupporter
Facing: 0
SubCell: 1
NodCiv7: c4
Location: 54,36
Owner: NodSupporter
Facing: 640
SubCell: 0
NodCiv8: c5
Location: 50,37
Owner: NodSupporter
Facing: 384
SubCell: 2
NodCiv9: c9
Location: 47,34
Owner: NodSupporter
Facing: 768
SubCell: 2
Gciv1: e1
Location: 38,9
Owner: GDI
Facing: 512
SubCell: 0
Gciv2: e1
Location: 18,10
Owner: GDI
Facing: 640
SubCell: 2
Rules: cnc|rules/campaign-maprules.yaml, cnc|rules/campaign-tooltips.yaml, cnc|rules/campaign-palettes.yaml, rules.yaml
FluentMessages: cnc|fluent/lua.ftl, cnc|fluent/campaign.ftl, map.ftl

View File

@@ -0,0 +1,207 @@
--[[
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.
]]
NodUnitsBuggy = { "bggy", "bggy", "bggy", "bggy", "bggy" }
NodUnitsBikes = { "bike", "bike", "bike" }
NodUnitsGunner = { "e1", "e1", "e1", "e1", "e1", "e1" }
NodUnitsRocket = { "e3", "e3", "e3", "e3", "e3", "e3" }
Atk6Units = { "c1", "c2", "c3" }
Atk5Units = { "e1", "e1", "e2", "e2" }
Atk1Units = { "e1", "e1" }
JeepReinforcements = { "jeep" }
GDIUnits = { "e1", "e1", "e2" }
ApcUnits = { "e1", "e1", "e2", "e2" }
Spawnpoint = { waypoint0.Location }
Atk6WaypointsPart1 = { waypoint1.Location, waypoint2.Location, waypoint3.Location, waypoint4.Location }
Atk6WaypointsPart2 = { waypoint7.Location, waypoint8.Location, waypoint7.Location }
Atk5Waypoints = { waypoint0.Location, waypoint9.Location}
Atk3Waypoints = { waypoint0 }
Atk2Waypoints = { waypoint6 }
GcivWaypoints = { waypoint0, waypoint1, waypoint2, waypoint3, waypoint4 }
Atk1Waypoints = { waypoint0, waypoint1, waypoint2, waypoint3, waypoint4, waypoint5, waypoint6 }
Atk4Waypoints = { waypoint0, waypoint9 }
Atk6ActorTriggerActivator = { Civilian1, Civilian2 }
Atk5ActorTriggerActivator = { Soldier1, Soldier2, Soldier3, Actor105 }
WinActorTriggerActivator = { GDICiv1, GDICiv2, GDICiv3, GDICiv4, GDICiv5, GDICiv6, GDICiv7, GDICiv8, GDICiv9, GDICiv11, GDICiv12, GDICiv13 }
GcivActors = { Gciv1, Gciv2, GDICiv2, GDICiv9, GDICiv10, GDICiv11 }
Atk2CellTriggerActivator = { CPos.New(41,22), CPos.New(40,22), CPos.New(39,22), CPos.New(41,21), CPos.New(40,21), CPos.New(39,21) }
Atk3CellTriggerActivator = { CPos.New(18,18), CPos.New(17,18), CPos.New(16,18), CPos.New(15,18), CPos.New(14,18), CPos.New(13,18), CPos.New(12,18), CPos.New(11,18), CPos.New(24,17), CPos.New(23,17), CPos.New(22,17), CPos.New(21,17), CPos.New(20,17), CPos.New(19,17), CPos.New(17,17), CPos.New(16,17), CPos.New(15,17), CPos.New(14,17), CPos.New(13,17), CPos.New(12,17), CPos.New(11,17) }
Atk4CellTriggerActivator = { CPos.New(29,28), CPos.New(28,28), CPos.New(29,27), CPos.New(28,27), CPos.New(29,26), CPos.New(28,26), CPos.New(29,25), CPos.New(28,25), CPos.New(29,24), CPos.New(28,24), CPos.New(29,23), CPos.New(28,23), CPos.New(29,22), CPos.New(28,22) }
GcivCellTriggerActivator = { CPos.New(51,17), CPos.New(50,17), CPos.New(49,17), CPos.New(48,17), CPos.New(47,17), CPos.New(46,17), CPos.New(45,17), CPos.New(44,17), CPos.New(43,17), CPos.New(42,17), CPos.New(41,17), CPos.New(40,17), CPos.New(39,17), CPos.New(38,17), CPos.New(37,17), CPos.New(36,17), CPos.New(35,17), CPos.New(52,16), CPos.New(51,16), CPos.New(50,16), CPos.New(49,16), CPos.New(48,16), CPos.New(47,16), CPos.New(46,16), CPos.New(45,16), CPos.New(44,16), CPos.New(43,16), CPos.New(42,16), CPos.New(41,16), CPos.New(40,16), CPos.New(39,16), CPos.New(38,16), CPos.New(37,16), CPos.New(36,16), CPos.New(35,16) }
DelxCellTriggerActivator = { CPos.New(42,20), CPos.New(41,20), CPos.New(40,20), CPos.New(39,20), CPos.New(38,20) }
DelyCellTriggerActivator = { CPos.New(31,28), CPos.New(30,28), CPos.New(31,27), CPos.New(30,27), CPos.New(31,26), CPos.New(30,26), CPos.New(31,25), CPos.New(30,25), CPos.New(31,24), CPos.New(30,24) }
DelzCellTriggerActivator = { CPos.New(18,20), CPos.New(17,20), CPos.New(16,20), CPos.New(15,20), CPos.New(14,20), CPos.New(13,20), CPos.New(12,20), CPos.New(11,20), CPos.New(25,19), CPos.New(24,19), CPos.New(23,19), CPos.New(22,19), CPos.New(21,19), CPos.New(20,19), CPos.New(19,19), CPos.New(18,19), CPos.New(17,19), CPos.New(16,19), CPos.New(15,19), CPos.New(14,19), CPos.New(13,19), CPos.New(12,19), CPos.New(11,19), CPos.New(25,18), CPos.New(24,18), CPos.New(23,18), CPos.New(22,18), CPos.New(21,18), CPos.New(20,18), CPos.New(19,18) }
NodCiviliansActors = { NodCiv1, NodCiv2, NodCiv3, NodCiv4, NodCiv5, NodCiv6, NodCiv7, NodCiv8, NodCiv9 }
SendJeepReinforcements = function()
if not PreventJeepReinforcements then
local units = Reinforcements.Reinforce(GDI, JeepReinforcements, Spawnpoint, 15)
MoveAndHunt(units, Atk2Waypoints)
end
end
SendGDIReinforcements = function()
if not PreventGDIReinforcements then
local units = Reinforcements.Reinforce(GDI, GDIUnits, Spawnpoint, 15)
MoveAndHunt(units, Atk4Waypoints)
end
end
SendApcReinforcements = function()
if not PreventApcReinforcements then
Reinforcements.ReinforceWithTransport(GDI, "apc", ApcUnits, Atk5Waypoints, nil,
function(transport, cargo)
transport.UnloadPassengers()
Utils.Do(cargo, IdleHunt)
end, IdleHunt)
end
end
CreateCivilians = function()
Utils.Do(NodCiviliansActors, function(actor)
actor.Owner = Nod
end)
ProtectCivilians = AddPrimaryObjective(Nod, "protect-nod-supporters")
Trigger.OnAllKilled(NodCiviliansActors, function()
Nod.MarkFailedObjective(ProtectCivilians)
end)
Utils.Do(GcivActors, function(actor)
if not actor.IsDead then
actor.AttackMove(waypoint7.Location)
actor.AttackMove(waypoint8.Location)
IdleHunt(actor)
end
end)
end
WorldLoaded = function()
Nod = Player.GetPlayer("Nod")
NodSupporter = Player.GetPlayer("NodSupporter")
GDI = Player.GetPlayer("GDI")
InitObjectives(Nod)
Trigger.OnAnyKilled(Atk6ActorTriggerActivator, function()
Reinforcements.ReinforceWithTransport(GDI, "apc", Atk6Units, Atk6WaypointsPart1, Atk6WaypointsPart2,
function(_, cargo)
Utils.Do(cargo, IdleHunt)
end, IdleHunt)
end)
Utils.Do(Atk5ActorTriggerActivator, function(actor)
Trigger.OnDamaged(actor, function()
if Atk5TriggerSwitch then
return
end
Atk5TriggerSwitch = true
Reinforcements.ReinforceWithTransport(GDI, "apc", Atk5Units, Atk5Waypoints, nil,
function(transport, cargo)
transport.UnloadPassengers()
Utils.Do(cargo, IdleHunt)
end, IdleHunt)
end)
end)
Trigger.OnEnteredFootprint(Atk3CellTriggerActivator, function(a, id)
if a.Owner == Nod then
Trigger.RemoveFootprintTrigger(id)
for type, count in pairs({ ["e1"] = 3, ["e2"] = 2, ["mtnk"] = 1 }) do
MoveAndHunt(Utils.Take(count, GDI.GetActorsByType(type)), Atk3Waypoints)
end
end
end)
Trigger.OnEnteredFootprint(Atk2CellTriggerActivator, function(a, id)
if a.Owner == Nod then
MoveAndHunt(Utils.Take(1, GDI.GetActorsByType("jeep")), Atk2Waypoints)
Trigger.RemoveFootprintTrigger(id)
end
end)
Trigger.OnEnteredFootprint(GcivCellTriggerActivator, function(a, id)
if a.Owner == Nod then
MoveAndHunt(GcivActors, GcivWaypoints)
Trigger.RemoveFootprintTrigger(id)
end
end)
Trigger.OnEnteredFootprint(Atk4CellTriggerActivator, function(a, id)
if a.Owner == Nod then
for type, count in pairs({ ["e1"] = 2,["e2"] = 1 }) do
MoveAndHunt(Utils.Take(count, GDI.GetActorsByType(type)), Atk4Waypoints)
end
Trigger.RemoveFootprintTrigger(id)
end
end)
Trigger.AfterDelay(DateTime.Seconds(20), function()
local units = Reinforcements.Reinforce(GDI, Atk1Units, Spawnpoint, 15)
MoveAndHunt(units, Atk1Waypoints)
end)
Trigger.AfterDelay(DateTime.Seconds(50), SendJeepReinforcements)
Trigger.AfterDelay(DateTime.Minutes(1) + DateTime.Seconds(40), SendGDIReinforcements)
Trigger.AfterDelay(DateTime.Minutes(2) + DateTime.Seconds(30), SendApcReinforcements)
Trigger.OnEnteredFootprint(DelxCellTriggerActivator, function(a, id)
if a.Owner == Nod then
PreventJeepReinforcements = true
Trigger.RemoveFootprintTrigger(id)
end
end)
Trigger.OnEnteredFootprint(DelyCellTriggerActivator, function(a, id)
if a.Owner == Nod then
PreventGDIReinforcements = true
Trigger.RemoveFootprintTrigger(id)
end
end)
Trigger.OnEnteredFootprint(DelzCellTriggerActivator, function(a, id)
if a.Owner == Nod then
PreventApcReinforcements = true
Trigger.RemoveFootprintTrigger(id)
end
end)
Trigger.OnPlayerDiscovered(NodSupporter, CreateCivilians)
Trigger.OnAllKilled(WinActorTriggerActivator, function()
Nod.MarkCompletedObjective(KillGDI)
if ProtectCivilians then
Nod.MarkCompletedObjective(ProtectCivilians)
end
end)
KillGDI = AddPrimaryObjective(Nod, "kill-gdi-supporters")
Media.PlaySpeechNotification(Nod, "Reinforce")
Reinforcements.Reinforce(Nod, NodUnitsBuggy, { UnitsEntryBuggy.Location, UnitsRallyBuggy.Location }, 11)
Reinforcements.Reinforce(Nod, NodUnitsBikes, { UnitsEntryBikes.Location, UnitsRallyBikes.Location }, 15)
Reinforcements.Reinforce(Nod, NodUnitsGunner, { UnitsEntryGunner.Location, UnitsRallyGunner.Location }, 15)
Reinforcements.Reinforce(Nod, NodUnitsRocket, { UnitsEntryRocket.Location, UnitsRallyRocket.Location }, 15)
Camera.Position = waypoint6.CenterPosition
end
Tick = function()
if DateTime.GameTime > 2 and Nod.HasNoRequiredUnits() then
Nod.MarkFailedObjective(KillGDI)
end
end

View File

@@ -0,0 +1,129 @@
World:
LuaScript:
Scripts: campaign.lua, utils.lua, nod04b.lua
MusicPlaylist:
StartingMusic: valkyrie
VictoryMusic: nod_win1
MissionData:
Briefing: briefing
BriefingVideo: nod4b.vqa
StartVideo: retro.vqa
LossVideo: deskill.vqa
SmudgeLayer@SCORCH:
InitialSmudges:
37,24: sc6,0
36,18: sc6,0
Player:
EnemyWatcher:
PlayerResources:
DefaultCash: 0
^Palettes:
IndexedPlayerPalette:
PlayerIndex:
NodSupporter: 192, 164, 132, 155, 133, 197, 112, 12, 163, 132, 155, 133, 134, 197, 154, 198
IndexedPlayerPalette@units:
PlayerIndex:
NodSupporter: 192, 164, 132, 155, 133, 197, 112, 12, 163, 132, 155, 133, 134, 197, 154, 198
^Infantry:
AnnounceOnSeen:
^CivBuilding:
AnnounceOnSeen:
^CivBuildingHusk:
AnnounceOnSeen:
NUK2:
Buildable:
Prerequisites: ~disabled
GUN:
Buildable:
Prerequisites: ~disabled
CYCL:
Buildable:
Prerequisites: ~disabled
FIX:
Buildable:
Prerequisites: ~disabled
HPAD:
Buildable:
Prerequisites: ~disabled
OBLI:
Buildable:
Prerequisites: ~disabled
BRIK:
Buildable:
Prerequisites: ~disabled
TMPL:
Buildable:
Prerequisites: ~disabled
FTNK:
Buildable:
Prerequisites: ~disabled
STNK:
Buildable:
Prerequisites: ~disabled
ARTY:
Buildable:
Prerequisites: ~disabled
E5:
Buildable:
Prerequisites: ~disabled
RMBO:
Buildable:
Prerequisites: ~disabled
MLRS:
Buildable:
Prerequisites: ~disabled
MCV:
Buildable:
Prerequisites: ~disabled
SAM:
Buildable:
Prerequisites: ~disabled
AFLD:
Buildable:
Prerequisites: ~disabled
E4:
Buildable:
Prerequisites: ~disabled
SBAG:
Buildable:
Prerequisites: ~disabled
GTWR:
Buildable:
Prerequisites: ~disabled
WEAP:
Buildable:
Prerequisites: ~disabled
EYE:
Buildable:
Prerequisites: ~disabled
ATWR:
Buildable:
Prerequisites: ~disabled