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 =
Given our limited number of troops, you must make use of all available resources.
Find the abandoned GDI base in the area and bring it back online. Once operational, use GDI's own weapons against them.
Ensure that no GDI forces survive.

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

View File

@@ -0,0 +1,776 @@
MapFormat: 12
RequiresMod: cnc
Title: 08b: Battle for Zaire
Author: Westwood Studios
Tileset: DESERT
MapSize: 64,64
Bounds: 3,2,59,60
Visibility: MissionSelector
Categories: Campaign
LockPreview: True
Players:
PlayerReference@GDI:
Name: GDI
Faction: gdi
Color: F5D378
Allies: Outpost
Enemies: Nod
Bot: campaign
PlayerReference@Neutral:
Name: Neutral
OwnsWorld: True
NonCombatant: True
Faction: gdi
PlayerReference@Civilians:
Name: Civilians
NonCombatant: True
Faction: gdi
Enemies: Nod
Bot: campaign
PlayerReference@Outpost:
Name: Outpost
Faction: gdi
Color: F5D378
Allies: GDI
Enemies: Nod
Bot: campaign
PlayerReference@Nod:
Name: Nod
AllowBots: False
Playable: True
Required: True
LockFaction: True
Faction: nod
LockColor: True
Color: FE1100
LockSpawn: True
LockTeam: True
Enemies: GDI, Civilians
PlayerReference@NodBase:
Name: NodBase
NonCombatant: True
Faction: nod
Color: FE1100
Enemies: Nod
Bot: campaign
Actors:
Actor0: brik
Location: 27,56
Owner: GDI
Actor1: brik
Location: 26,56
Owner: GDI
Actor2: brik
Location: 25,56
Owner: GDI
Actor3: brik
Location: 24,56
Owner: GDI
Actor4: brik
Location: 23,56
Owner: GDI
Actor5: brik
Location: 22,56
Owner: GDI
Actor6: brik
Location: 21,56
Owner: GDI
Actor7: brik
Location: 20,56
Owner: GDI
Actor8: brik
Location: 19,56
Owner: GDI
Actor9: brik
Location: 18,56
Owner: GDI
Actor10: brik
Location: 17,56
Owner: GDI
Actor11: brik
Location: 16,56
Owner: GDI
Actor12: brik
Location: 15,56
Owner: GDI
Actor13: brik
Location: 14,56
Owner: GDI
Actor14: brik
Location: 13,56
Owner: GDI
Actor15: brik
Location: 12,56
Owner: GDI
Actor16: brik
Location: 11,56
Owner: GDI
Actor17: brik
Location: 10,56
Owner: GDI
Actor18: brik
Location: 9,56
Owner: GDI
Actor19: brik
Location: 8,56
Owner: GDI
Actor20: brik
Location: 7,56
Owner: GDI
Actor21: brik
Location: 6,56
Owner: GDI
Actor22: brik
Location: 5,56
Owner: GDI
Actor23: brik
Location: 4,56
Owner: GDI
Actor24: brik
Location: 3,56
Owner: GDI
Actor25: brik
Location: 27,55
Owner: GDI
Actor26: cycl
Location: 25,55
Owner: GDI
Actor27: cycl
Location: 24,55
Owner: GDI
Actor28: cycl
Location: 23,55
Owner: GDI
Actor29: brik
Location: 4,55
Owner: GDI
Actor30: brik
Location: 3,55
Owner: GDI
Actor31: brik
Location: 27,54
Owner: GDI
Actor32: cycl
Location: 25,54
Owner: GDI
Actor33: cycl
Location: 23,54
Owner: GDI
Actor34: brik
Location: 3,54
Owner: GDI
Actor35: brik
Location: 27,53
Owner: GDI
Actor36: brik
Location: 26,53
Owner: GDI
Actor37: cycl
Location: 25,53
Owner: GDI
Actor38: cycl
Location: 24,53
Owner: GDI
Actor39: cycl
Location: 23,53
Owner: GDI
Actor40: brik
Location: 3,53
Owner: GDI
Actor41: brik
Location: 27,52
Owner: GDI
Actor42: brik
Location: 26,52
Owner: GDI
Actor43: brik
Location: 3,52
Owner: GDI
Actor44: brik
Location: 3,51
Owner: GDI
Actor45: brik
Location: 27,50
Owner: GDI
Actor46: brik
Location: 26,50
Owner: GDI
Actor47: brik
Location: 3,50
Owner: GDI
Actor48: brik
Location: 27,49
Owner: GDI
Actor49: brik
Location: 26,49
Owner: GDI
Actor50: brik
Location: 3,49
Owner: GDI
Actor51: brik
Location: 27,48
Owner: GDI
Actor52: brik
Location: 18,48
Owner: GDI
Actor53: brik
Location: 17,48
Owner: GDI
Actor54: brik
Location: 13,48
Owner: GDI
Actor55: brik
Location: 12,48
Owner: GDI
Actor56: brik
Location: 4,48
Owner: GDI
Actor57: brik
Location: 3,48
Owner: GDI
Actor58: brik
Location: 27,47
Owner: GDI
Actor59: brik
Location: 26,47
Owner: GDI
Actor60: brik
Location: 25,47
Owner: GDI
Actor61: brik
Location: 24,47
Owner: GDI
Actor62: brik
Location: 23,47
Owner: GDI
Actor63: brik
Location: 22,47
Owner: GDI
Actor64: brik
Location: 21,47
Owner: GDI
Actor65: brik
Location: 20,47
Owner: GDI
Actor66: brik
Location: 19,47
Owner: GDI
Actor67: brik
Location: 18,47
Owner: GDI
Actor68: brik
Location: 17,47
Owner: GDI
Actor69: brik
Location: 13,47
Owner: GDI
Actor70: brik
Location: 12,47
Owner: GDI
Actor71: brik
Location: 11,47
Owner: GDI
Actor72: brik
Location: 10,47
Owner: GDI
Actor73: brik
Location: 9,47
Owner: GDI
Actor74: brik
Location: 8,47
Owner: GDI
Actor75: brik
Location: 7,47
Owner: GDI
Actor76: brik
Location: 6,47
Owner: GDI
Actor77: brik
Location: 5,47
Owner: GDI
Actor78: brik
Location: 4,47
Owner: GDI
Actor79: brik
Location: 3,47
Owner: GDI
Actor80: sbag
Location: 61,29
Owner: GDI
Actor81: sbag
Location: 61,28
Owner: GDI
Actor82: sbag
Location: 61,27
Owner: GDI
Actor83: sbag
Location: 61,26
Owner: GDI
Actor84: sbag
Location: 61,25
Owner: GDI
Actor85: sbag
Location: 61,24
Owner: GDI
Actor86: sbag
Location: 59,23
Owner: GDI
Actor87: sbag
Location: 58,23
Owner: GDI
Actor88: t18
Location: 15,16
Owner: Neutral
Actor89: t18
Location: 7,9
Owner: Neutral
Actor90: t08
Location: 22,31
Owner: Neutral
Actor91: t08
Location: 29,56
Owner: Neutral
Actor92: t08
Location: 45,52
Owner: Neutral
Actor93: t08
Location: 46,52
Owner: Neutral
Actor94: t08
Location: 57,39
Owner: Neutral
Actor95: t08
Location: 9,29
Owner: Neutral
Actor96: t08
Location: 40,16
Owner: Neutral
Actor97: t08
Location: 40,29
Owner: Neutral
Actor98: t08
Location: 10,29
Owner: Neutral
Actor99: rock5
Location: 22,18
Owner: Neutral
Actor100: t08
Location: 39,6
Owner: Neutral
Actor101: t08
Location: 40,6
Owner: Neutral
Actor102: t08
Location: 54,9
Owner: Neutral
Actor103: t08
Location: 59,15
Owner: Neutral
Actor104: t08
Location: 49,3
Owner: Neutral
Actor105: t18
Location: 13,23
Owner: Neutral
Actor106: t18
Location: 15,35
Owner: Neutral
Actor107: t18
Location: 26,45
Owner: Neutral
Actor108: t18
Location: 31,49
Owner: Neutral
Actor109: t18
Location: 54,35
Owner: Neutral
Actor110: t18
Location: 25,56
Owner: Neutral
Actor111: t18
Location: 11,43
Owner: Neutral
Actor112: t13.transformable
Location: 5,31
Owner: Neutral
Actor113: t13.transformable
Location: 58,47
Owner: Neutral
Actor142: mtnk
Location: 8,9
Owner: GDI
Facing: 256
Actor143: mtnk
Location: 27,34
Owner: GDI
Facing: 256
Actor144: mtnk
Location: 14,25
Owner: GDI
Facing: 384
Actor145: mtnk
Location: 47,3
Owner: GDI
Facing: 768
Actor148: jeep
Location: 56,33
Owner: GDI
Actor151: mtnk
Location: 16,32
Owner: GDI
Facing: 896
Actor152: mtnk
Location: 35,31
Owner: GDI
Facing: 896
Actor153: jeep
Location: 18,55
Owner: GDI
Actor154: jeep
Location: 19,55
Owner: GDI
Actor155: mtnk
Location: 21,55
Owner: GDI
Actor156: mtnk
Location: 22,55
Owner: GDI
Actor157: e2
Location: 16,16
Owner: GDI
SubCell: 3
Actor158: e2
Location: 15,16
Owner: GDI
SubCell: 4
Actor159: e2
Location: 50,3
Owner: GDI
Facing: 896
SubCell: 1
Actor160: e2
Location: 49,5
Owner: GDI
Facing: 768
SubCell: 2
Actor161: e1
Location: 48,6
Owner: GDI
Facing: 896
SubCell: 4
Actor162: e2
Location: 41,16
Owner: GDI
SubCell: 1
Actor163: e2
Location: 35,17
Owner: GDI
Facing: 896
SubCell: 2
Actor171: e1
Location: 45,5
Owner: GDI
Facing: 640
SubCell: 1
Actor172: e1
Location: 44,4
Owner: GDI
Facing: 640
SubCell: 1
Actor173: e1
Location: 45,4
Owner: GDI
Facing: 896
SubCell: 1
Actor176: e1
Location: 58,27
Owner: GDI
Facing: 896
SubCell: 4
Actor177: e1
Location: 52,22
Owner: GDI
Facing: 640
SubCell: 4
Actor178: e1
Location: 50,23
Owner: GDI
Facing: 896
SubCell: 3
Actor179: e2
Location: 59,30
Owner: GDI
SubCell: 4
Actor180: e2
Location: 49,24
Owner: GDI
Facing: 256
SubCell: 3
Actor181: e1
Location: 31,33
Owner: GDI
Facing: 128
SubCell: 2
Actor182: e3
Location: 54,35
Owner: GDI
SubCell: 4
Actor183: e3
Location: 55,35
Owner: GDI
Facing: 128
SubCell: 4
Actor184: e3
Location: 55,35
Owner: GDI
Facing: 896
SubCell: 0
Actor185: e3
Location: 47,32
Owner: GDI
Facing: 256
SubCell: 0
Actor186: e3
Location: 48,35
Owner: GDI
Facing: 128
SubCell: 1
Actor187: e3
Location: 43,26
Owner: GDI
Facing: 384
SubCell: 0
Actor188: e3
Location: 46,22
Owner: GDI
Facing: 256
SubCell: 3
Actor190: e2
Location: 31,33
Owner: GDI
Facing: 640
SubCell: 3
Actor191: e2
Location: 32,33
Owner: GDI
Facing: 128
SubCell: 0
waypoint27: waypoint
Location: 20,54
Owner: Neutral
waypoint26: waypoint
Location: 34,2
Owner: Neutral
waypoint25: waypoint
Location: 57,27
Owner: Neutral
waypoint18: waypoint
Location: 35,32
Owner: Neutral
waypoint17: waypoint
Location: 35,38
Owner: Neutral
waypoint16: waypoint
Location: 13,26
Owner: Neutral
waypoint15: waypoint
Location: 8,14
Owner: Neutral
waypoint14: waypoint
Location: 15,32
Owner: Neutral
waypoint13: waypoint
Location: 27,35
Owner: Neutral
waypoint12: waypoint
Location: 28,14
Owner: Neutral
waypoint11: waypoint
Location: 37,27
Owner: Neutral
waypoint10: waypoint
Location: 37,14
Owner: Neutral
waypoint9: waypoint
Location: 20,14
Owner: Neutral
waypoint8: waypoint
Location: 51,42
Owner: Neutral
waypoint7: waypoint
Location: 50,55
Owner: Neutral
waypoint6: waypoint
Location: 36,56
Owner: Neutral
waypoint5: waypoint
Location: 36,51
Owner: Neutral
waypoint4: waypoint
Location: 31,35
Owner: Neutral
waypoint3: waypoint
Location: 13,29
Owner: Neutral
waypoint2: waypoint
Location: 14,40
Owner: Neutral
waypoint1: waypoint
Location: 15,46
Owner: Neutral
waypoint0: waypoint
Location: 54,6
Owner: Neutral
AirstrikeTarget: waypoint
Owner: Neutral
Location: 57,4
AttackPath1: waypoint
Owner: Neutral
Location: 29,38
AttackPath2: waypoint
Owner: Neutral
Location: 50,49
AttackPath3: waypoint
Owner: Neutral
Location: 20,17
FlareExtraCamera: camera
Owner: Neutral
Location: 48,27
GDIBuilding1: atwr
Location: 11,48
Owner: GDI
GDIBuilding2: gtwr
Location: 31,49
Owner: GDI
GDIBuilding3: gtwr
Location: 13,46
Owner: GDI
GDIBuilding4: silo
Location: 7,43
Owner: GDI
GDIBuilding5: silo
Location: 5,45
Owner: GDI
GDIBuilding6: silo
Location: 5,43
Owner: GDI
GDIBuilding7: silo
Location: 3,43
Owner: GDI
GDIBuilding8: silo
Location: 3,45
Owner: GDI
GDIBuilding9: gtwr
Location: 17,46
Owner: GDI
GDIBuilding10: gtwr
Location: 31,52
Owner: GDI
GDIBuilding11: silo
Location: 7,45
Owner: GDI
GDIBuilding12: hpad
Location: 22,48
Owner: GDI
GDIBuilding13: hpad
Location: 24,48
Owner: GDI
GDICYard: fact
Location: 4,52
Owner: GDI
GDIHarv: harv
Location: 15,46
Owner: GDI
GDIHQ: hq
Location: 4,49
Owner: GDI
GDIProc: proc
Location: 19,48
Owner: GDI
FreeActor: False
GDIPyle: pyle
Location: 15,52
Owner: GDI
GDINuke1: nuke
Location: 9,53
Owner: GDI
GDINuke2: nuke
Location: 7,52
Owner: GDI
GDINuke3: nuke
Location: 11,53
Owner: GDI
GDINuke4: nuke
Location: 13,52
Owner: GDI
GDIOrca1: orca
Owner: GDI
Location: 17,52
Facing: 368
GDIOrca2: orca
Owner: GDI
Location: 12,52
Facing: 368
GDIWeap: weap
Location: 8,48
Owner: GDI
Gunboat1: boat
Location: 31,59
Owner: GDI
Facing: 768
Gunboat2: boat
Location: 25,60
Owner: GDI
Facing: 768
MoneyCrate: MoneyCrate
Owner: Neutral
Location: 24,54
NodCYard: fact.in
Location: 58,6
Owner: NodBase
Health: 39
NodHand: hand
Location: 58,3
Owner: NodBase
Health: 31
NodNuke: nuke
Location: 56,4
Owner: NodBase
Health: 41
OutpostCYard: factout.in
Location: 58,24
Owner: Outpost
OutpostHarv: harv
Location: 55,27
Owner: Outpost
Facing: 768
OutpostNuke: nukeout.in
Location: 59,27
Owner: Outpost
OutpostProc: procout.in
Location: 55,23
Owner: Outpost
FreeActor: False
ReinforcementsHelicopterSpawn: waypoint
Owner: Neutral
Location: 31,2
ReinforcementsHelicopterRally: waypoint
Owner: Neutral
Location: 38,4
Rules: cnc|rules/campaign-maprules.yaml, cnc|rules/campaign-tooltips.yaml, cnc|rules/campaign-palettes.yaml, rules.yaml
Weapons: weapons.yaml
FluentMessages: cnc|fluent/lua.ftl, cnc|fluent/campaign.ftl, map.ftl

View File

@@ -0,0 +1,187 @@
--[[
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.
]]
AttackPaths = { { AttackPath1 }, { AttackPath2 }, { AttackPath3 } }
GDIBase = { GDICYard, GDIPyle, GDIWeap, GDIHQ, GDINuke1, GDINuke2, GDINuke3, GDINuke4, GDIProc, GDIBuilding1, GDIBuilding2, GDIBuilding3, GDIBuilding4, GDIBuilding5, GDIBuilding6, GDIBuilding7, GDIBuilding8, GDIBuilding9, GDIBuilding10, GDIBuilding11, GDIBuilding12, GDIBuilding13 }
GDIOrcas = { GDIOrca1, GDIOrca2 }
InfantryAttackGroup = { }
InfantryGroupSize = 4
InfantryProductionCooldown = DateTime.Minutes(3)
InfantryProductionTypes = { "e1", "e1", "e2" }
HarvesterProductionType = { "harv" }
VehicleAttackGroup = { }
VehicleGroupSize = 4
VehicleProductionCooldown = DateTime.Minutes(4)
VehicleProductionTypes = { "jeep", "jeep", "mtnk", "mtnk", "mtnk" }
StartingCash = 4000
BaseProc = { type = "proc", pos = CPos.New(19, 48), cost = 1500 }
BaseNuke1 = { type = "nuke", pos = CPos.New(9, 53), cost = 500 }
BaseNuke2 = { type = "nuke", pos = CPos.New(7, 52), cost = 500 }
BaseNuke3 = { type = "nuke", pos = CPos.New(11, 53), cost = 500 }
BaseNuke4 = { type = "nuke", pos = CPos.New(13, 52), cost = 500 }
InfantryProduction = { type = "pyle", pos = CPos.New(15, 52), cost = 500 }
VehicleProduction = { type = "weap", pos = CPos.New(8, 48), cost = 2000 }
BaseBuildings = { BaseProc, BaseNuke1, BaseNuke2, BaseNuke3, BaseNuke4, InfantryProduction, VehicleProduction }
AutoGuard = function(guards)
Utils.Do(guards, function(guard)
Trigger.OnDamaged(guard, IdleHunt)
end)
end
BuildBuilding = function(building, cyard)
if CyardIsBuilding or GDI.Cash < building.cost then
Trigger.AfterDelay(DateTime.Seconds(10), function() BuildBuilding(building, cyard) end)
return
end
CyardIsBuilding = true
GDI.Cash = GDI.Cash - building.cost
Trigger.AfterDelay(Actor.BuildTime(building.type), function()
CyardIsBuilding = false
if cyard.IsDead or cyard.Owner ~= GDI then
GDI.Cash = GDI.Cash + building.cost
return
end
local actor = Actor.Create(building.type, true, { Owner = GDI, Location = building.pos })
if actor.Type == 'pyle' or actor.Type == 'hand' then
Trigger.AfterDelay(DateTime.Seconds(10), function() ProduceInfantry(actor) end)
elseif actor.Type == 'weap' or actor.Type == 'afld' then
Trigger.AfterDelay(DateTime.Seconds(10), function() ProduceVehicle(actor) end)
end
Trigger.OnKilled(actor, function()
BuildBuilding(building, cyard)
end)
RepairBuilding(GDI, actor, 0.75)
end)
end
CheckForHarvester = function()
local harv = GDI.GetActorsByType("harv")
return #harv > 0
end
GuardBase = function()
Utils.Do(GDIBase, function(building)
Trigger.OnDamaged(building, function()
Utils.Do(GDIOrcas, function(guard)
if not guard.IsDead and not building.IsDead then
guard.Stop()
guard.Guard(building)
end
end)
end)
end)
end
ProduceHarvester = function(building)
if not BuildingHarvester then
BuildingHarvester = true
building.Build(HarvesterProductionType, function()
BuildingHarvester = false
end)
end
end
ProduceInfantry = function(building)
if building.IsDead or building.Owner ~= GDI then
return
elseif not CheckForHarvester() then
Trigger.AfterDelay(DateTime.Seconds(10), function() ProduceInfantry(building) end)
return
end
local delay = Utils.RandomInteger(DateTime.Seconds(3), DateTime.Seconds(9))
local toBuild = { Utils.Random(InfantryProductionTypes) }
local Path = Utils.Random(AttackPaths)
building.Build(toBuild, function(unit)
InfantryAttackGroup[#InfantryAttackGroup + 1] = unit[1]
if #InfantryAttackGroup >= InfantryGroupSize then
MoveAndHunt(InfantryAttackGroup, Path)
InfantryAttackGroup = { }
Trigger.AfterDelay(InfantryProductionCooldown, function() ProduceInfantry(building) end)
else
Trigger.AfterDelay(delay, function() ProduceInfantry(building) end)
end
end)
end
ProduceVehicle = function(building)
if building.IsDead or building.Owner ~= GDI then
return
elseif not CheckForHarvester() then
ProduceHarvester(building)
Trigger.AfterDelay(DateTime.Seconds(10), function() ProduceVehicle(building) end)
return
end
local delay = Utils.RandomInteger(DateTime.Seconds(12), DateTime.Seconds(17))
local toBuild = { Utils.Random(VehicleProductionTypes) }
local Path = Utils.Random(AttackPaths)
building.Build(toBuild, function(unit)
VehicleAttackGroup[#VehicleAttackGroup + 1] = unit[1]
if #VehicleAttackGroup >= VehicleGroupSize then
MoveAndHunt(VehicleAttackGroup, Path)
VehicleAttackGroup = { }
Trigger.AfterDelay(VehicleProductionCooldown, function() ProduceVehicle(building) end)
else
Trigger.AfterDelay(delay, function() ProduceVehicle(building) end)
end
end)
end
StartAI = function()
RepairNamedActors(GDI, 0.75)
GDI.Cash = StartingCash
GuardBase()
end
Trigger.OnAllKilledOrCaptured(GDIBase, function()
Utils.Do(GDI.GetGroundAttackers(), IdleHunt)
end)
Trigger.OnKilled(GDIProc, function()
BuildBuilding(BaseProc, GDICYard)
end)
Trigger.OnKilled(GDINuke1, function()
BuildBuilding(BaseNuke1, GDICYard)
end)
Trigger.OnKilled(GDINuke2, function()
BuildBuilding(BaseNuke2, GDICYard)
end)
Trigger.OnKilled(GDINuke3, function()
BuildBuilding(BaseNuke3, GDICYard)
end)
Trigger.OnKilled(GDINuke4, function()
BuildBuilding(BaseNuke4, GDICYard)
end)
Trigger.OnKilled(GDIPyle, function()
BuildBuilding(InfantryProduction, GDICYard)
end)
Trigger.OnKilled(GDIWeap, function()
BuildBuilding(VehicleProduction, GDICYard)
end)

View File

@@ -0,0 +1,171 @@
--[[
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.
]]
WaypointGroup1 = { waypoint1, waypoint2, waypoint3, waypoint9, waypoint10 }
WaypointGroup2 = { waypoint5, waypoint6, waypoint7, waypoint8 }
WaypointGroup3 = { waypoint1, waypoint2, waypoint4, waypoint11 }
GDI1 = { units = { ['e2'] = 2, ['e3'] = 2 }, waypoints = WaypointGroup1, delay = 30 }
GDI2 = { units = { ['mtnk'] = 1 }, waypoints = WaypointGroup2, delay = 40 }
GDI3 = { units = { ['e1'] = 3, ['e2'] = 3 }, waypoints = WaypointGroup3, delay = 40 }
GDI4 = { units = { ['jeep'] = 2 }, waypoints = WaypointGroup2, delay = 20 }
Auto1 = { units = { ['e1'] = 3, ['e2'] = 1 }, waypoints = WaypointGroup2, delay = 30 }
Auto2 = { units = { ['e1'] = 2, ['e2'] = 1 }, waypoints = WaypointGroup3, delay = 40 }
Auto3 = { units = { ['e1'] = 2, ['e2'] = 2 }, waypoints = WaypointGroup1, delay = 30 }
Auto4 = { units = { ['mtnk'] = 1 }, waypoints = WaypointGroup1, delay = 30 }
Auto5 = { units = { ['mtnk'] = 1 }, waypoints = WaypointGroup3, delay = 40 }
Auto6 = { units = { ['jeep'] = 1 }, waypoints = WaypointGroup3, delay = 40 }
Auto7 = { units = { ['jeep'] = 1 }, waypoints = WaypointGroup1, delay = 50 }
AutoAttackWaves = { GDI1, GDI2, GDI3, GDI4, Auto1, Auto2, Auto3, Auto4, Auto5, Auto6, Auto7 }
NodBase = { NodCYard, NodNuke, NodHand }
Outpost = { OutpostCYard, OutpostProc }
IntroGuards = { Actor171, Actor172, Actor173, Actor145, Actor159, Actor160, Actor161 }
OutpostGuards = { Actor177, Actor178, Actor180, Actor187, Actor188, Actor185, Actor186, Actor184, Actor148, Actor179, Actor176, Actor183, Actor182 }
IntroReinforcements = { "e1", "e1", "e1", "e1", "e1", "e1", "e3", "e3", "e3", "e3" }
NodBaseTrigger = { CPos.New(52, 2), CPos.New(52, 3), CPos.New(52, 4), CPos.New(52, 5), CPos.New(52, 6), CPos.New(52, 7), CPos.New(52, 8) }
AirstrikeDelay = DateTime.Minutes(2) + DateTime.Seconds(30)
NodBaseCapture = function()
Nod.MarkCompletedObjective(LocateNodBase)
Utils.Do(NodBase, function(actor)
actor.Owner = Nod
end)
Trigger.AfterDelay(DateTime.Seconds(1), function()
Media.PlaySpeechNotification(Nod, "NewOptions")
end)
end
-- Provide Nod with a helicopter until the outpost got captured
SendHelicopter = function()
Trigger.AfterDelay(DateTime.Seconds(5), function()
if not Nod.IsObjectiveCompleted(CaptureGDIOutpost) then
Media.PlaySpeechNotification(Nod, "Reinforce")
local heli = Reinforcements.ReinforceWithTransport(Nod, "tran", nil, { ReinforcementsHelicopterSpawn.Location, waypoint0.Location })[1]
Trigger.OnKilled(heli, SendHelicopter)
end
end)
end
SendGDIAirstrike = function(hq, delay)
if not hq.IsDead and hq.Owner == GDI then
local target = GetAirstrikeTarget(Nod)
if target then
hq.TargetAirstrike(target, Angle.NorthEast + Angle.New(16))
Trigger.AfterDelay(delay, function() SendGDIAirstrike(hq, delay) end)
else
Trigger.AfterDelay(delay/4, function() SendGDIAirstrike(hq, delay) end)
end
end
end
SendWaves = function(counter, Waves)
if counter <= #Waves then
local team = Waves[counter]
for type, amount in pairs(team.units) do
MoveAndHunt(Utils.Take(amount, GDI.GetActorsByType(type)), team.waypoints)
end
Trigger.AfterDelay(DateTime.Seconds(team.delay), function() SendWaves(counter + 1, Waves) end)
end
end
Trigger.OnAllKilled(IntroGuards, function()
FlareCamera1 = Actor.Create("camera", true, { Owner = Nod, Location = waypoint25.Location })
FlareCamera2 = Actor.Create("camera", true, { Owner = Nod, Location = FlareExtraCamera.Location })
Flare = Actor.Create("flare", true, { Owner = Nod, Location = waypoint25.Location })
SendHelicopter()
Nod.MarkCompletedObjective(LocateNodBase)
NodBaseCapture()
end)
Trigger.OnAllKilledOrCaptured(Outpost, function()
if not Nod.IsObjectiveCompleted(CaptureGDIOutpost) then
Nod.MarkCompletedObjective(CaptureGDIOutpost)
Trigger.AfterDelay(DateTime.Minutes(1), function()
if not GDIHQ.IsDead and (not NodHand.IsDead or not NodNuke.IsDead) then
local airstrikeproxy = Actor.Create("airstrike.proxy", false, { Owner = GDI })
airstrikeproxy.TargetAirstrike(AirstrikeTarget.CenterPosition, Angle.NorthEast + Angle.New(16))
airstrikeproxy.Destroy()
end
end)
Trigger.AfterDelay(DateTime.Seconds(15), function()
Utils.Do(OutpostGuards, IdleHunt)
end)
Trigger.AfterDelay(DateTime.Minutes(1), function()
FlareCamera1.Destroy()
FlareCamera2.Destroy()
Flare.Destroy()
end)
Trigger.AfterDelay(DateTime.Minutes(1), function() SendWaves(1, AutoAttackWaves) end)
Trigger.AfterDelay(AirstrikeDelay, function() SendGDIAirstrike(GDIHQ, AirstrikeDelay) end)
Trigger.AfterDelay(DateTime.Minutes(2), function() ProduceInfantry(GDIPyle) end)
Trigger.AfterDelay(DateTime.Minutes(3), function() ProduceVehicle(GDIWeap) end)
end
end)
Trigger.OnCapture(OutpostCYard, function()
Trigger.AfterDelay(DateTime.Seconds(4), function()
Media.PlaySpeechNotification(Nod, "NewOptions")
end)
end)
Trigger.OnAnyKilled(Outpost, function()
if not Nod.IsObjectiveCompleted(CaptureGDIOutpost) then
Nod.MarkFailedObjective(CaptureGDIOutpost)
end
end)
Trigger.OnEnteredFootprint(NodBaseTrigger, function(a, id)
if not Nod.IsObjectiveCompleted(LocateNodBase) and a.Owner == Nod then
NodBaseCapture()
Trigger.RemoveFootprintTrigger(id)
end
end)
WorldLoaded = function()
Nod = Player.GetPlayer("Nod")
GDI = Player.GetPlayer("GDI")
Camera.Position = waypoint26.CenterPosition
Media.PlaySpeechNotification(Nod, "Reinforce")
Reinforcements.ReinforceWithTransport(Nod, "tran.in", IntroReinforcements, { ReinforcementsHelicopterSpawn.Location, ReinforcementsHelicopterRally.Location }, { ReinforcementsHelicopterSpawn.Location })
StartAI()
AutoGuard(GDI.GetGroundAttackers())
InitObjectives(Nod)
LocateNodBase = AddPrimaryObjective(Nod, "locate-nod-base")
CaptureGDIOutpost = AddPrimaryObjective(Nod, "capture-gdi-outpost")
NodObjective3 = AddPrimaryObjective(Nod, "eliminate-gdi-forces")
GDIObjective = AddPrimaryObjective(GDI, "")
end
Tick = function()
if DateTime.GameTime > 2 and Nod.HasNoRequiredUnits() then
GDI.MarkCompletedObjective(GDIObjective)
end
if DateTime.GameTime > 2 and GDI.HasNoRequiredUnits() then
Nod.MarkCompletedObjective(NodObjective3)
end
end

View File

@@ -0,0 +1,218 @@
World:
LuaScript:
Scripts: campaign.lua, utils.lua, nod08b.lua, nod08b-AI.lua
MusicPlaylist:
StartingMusic: linefire
VictoryMusic: nod_win1
MissionData:
Briefing: briefing
BackgroundVideo: tiberfx.vqa
BriefingVideo: nod8.vqa
LossVideo: flag.vqa
SmudgeLayer@SCORCH:
InitialSmudges:
44,57: sc2,0
40,56: sc1,0
50,55: sc5,0
45,55: sc3,0
61,43: sc2,0
58,42: sc6,0
61,41: sc4,0
55,41: sc1,0
59,39: sc5,0
53,39: sc5,0
60,9: sc4,0
58,9: sc6,0
57,8: sc2,0
54,6: sc3,0
60,5: sc2,0
55,5: sc4,0
61,4: sc6,0
55,4: sc6,0
57,3: sc1,0
SmudgeLayer@CRATER:
InitialSmudges:
42,56: cr1,0
49,55: cr1,0
51,52: cr1,0
41,52: cr1,0
60,43: cr1,0
59,41: cr1,0
55,40: cr1,0
49,40: cr1,0
53,36: cr1,0
55,6: cr1,0
54,5: cr1,0
Player:
PlayerResources:
DefaultCash: 0
CYCL:
Buildable:
Prerequisites: ~disabled
NUK2:
Buildable:
Prerequisites: ~disabled
HPAD:
Buildable:
Prerequisites: ~disabled
BRIK:
Buildable:
Prerequisites: ~disabled
EYE:
Buildable:
Prerequisites: ~disabled
GUN:
Buildable:
Prerequisites: ~disabled
OBLI:
Buildable:
Prerequisites: ~disabled
TMPL:
Buildable:
Prerequisites: ~disabled
E2:
Buildable:
Prerequisites: ~pyle
E4:
Buildable:
Prerequisites: ~hand
E5:
Buildable:
Prerequisites: ~disabled
E6:
-RepairsBridges:
HARV:
Harvester:
SearchFromProcRadius: 30
SearchFromHarvesterRadius: 30
HTNK:
Buildable:
Prerequisites: ~disabled
HQ:
AirstrikePower:
Prerequisites: gdi
SquadSize: 1
RMBO:
Buildable:
Prerequisites: ~disabled
MCV:
Buildable:
Prerequisites: ~disabled
FTNK:
Buildable:
Prerequisites: ~disabled
MLRS:
Buildable:
Prerequisites: ~disabled
MSAM:
Buildable:
Prerequisites: ~disabled
ATWR:
Buildable:
Prerequisites: ~disabled
HELI:
Buildable:
Prerequisites: ~disabled
SBAG:
Buildable:
Queue: Support.GDI, Support.Nod
GTWR:
Buildable:
Queue: Support.GDI
A10.IN:
Inherits: A10
RenderSprites:
Image: A10
Armament@BOMBS:
Weapon: Napalm.in
airstrike.proxy:
AirstrikePower:
UnitType: a10.in
BOAT:
Health:
HP: 150000
AutoTarget:
InitialStance: AttackAnything
RejectsOrders:
Except: Attack
RevealsShroud:
Range: 4c0
ValidRelationships: Enemy, Neutral, Ally
FACT.IN:
Inherits: FACT
RenderSprites:
Image: FACT
ProvidesPrerequisite:
Prerequisite: fact
CustomSellValue:
Value: 12825
FACTOUT.IN:
Inherits: FACT
RenderSprites:
Image: fact
ProvidesPrerequisite:
Prerequisite: fact
Capturable:
Types: building
NUKEOUT.IN:
Inherits: NUKE
RenderSprites:
Image: nuke
Buildable:
Prerequisites: ~disabled
ProvidesPrerequisite:
Prerequisite: anypower
Capturable:
Types: building
PROCOUT.IN:
Inherits: PROC
RenderSprites:
Image: proc
Buildable:
Prerequisites: ~disabled
ProvidesPrerequisite:
Prerequisite: proc
Capturable:
Types: building
TRAN.IN:
Inherits: TRAN
RejectsOrders:
-Selectable:
RenderSprites:
Image: TRAN
Buildable:
Prerequisites: ~disabled
Interactable:

View File

@@ -0,0 +1,7 @@
Napalm.IN:
Inherits: Napalm
Projectile: GravityBomb
Image: BOMBLET
Warhead@1Dam: SpreadDamage
Spread: 1000
Damage: 150000