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

BIN
mods/cnc/maps/nod05/map.bin Normal file

Binary file not shown.

View File

@@ -0,0 +1,2 @@
## rules.yaml
briefing = Our brothers within GDI report that A-10 strike jets are set to be deployed here soon. New Surface to Air Missiles have been delivered to aid you. Use the SAMs to defend your base, then seek out the GDI base and destroy it.

BIN
mods/cnc/maps/nod05/map.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

View File

@@ -0,0 +1,380 @@
MapFormat: 12
RequiresMod: cnc
Title: 05: Warthog Hunt
Author: Westwood Studios
Tileset: DESERT
MapSize: 64,64
Bounds: 4,12,57,45
Visibility: MissionSelector
Categories: Campaign
LockPreview: True
Players:
PlayerReference@GDI:
Name: GDI
Faction: gdi
Color: F5D378
Allies: GDI
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@Nod:
Name: Nod
Playable: True
AllowBots: False
Required: True
LockFaction: True
Faction: nod
LockColor: True
Color: FE1100
LockSpawn: True
LockTeam: True
Allies: Nod
Enemies: GDI, Civilians
Actors:
Actor0: sbag
Location: 30,22
Owner: GDI
Actor1: sbag
Location: 29,22
Owner: GDI
Actor2: sbag
Location: 28,22
Owner: GDI
Actor3: sbag
Location: 23,22
Owner: GDI
Actor4: sbag
Location: 22,22
Owner: GDI
Actor5: sbag
Location: 21,22
Owner: GDI
Actor6: sbag
Location: 20,22
Owner: GDI
Actor7: sbag
Location: 19,22
Owner: GDI
Actor8: sbag
Location: 30,21
Owner: GDI
Actor9: sbag
Location: 19,21
Owner: GDI
Actor10: sbag
Location: 18,21
Owner: GDI
Actor11: sbag
Location: 30,20
Owner: GDI
Actor12: sbag
Location: 30,19
Owner: GDI
Actor13: sbag
Location: 30,18
Owner: GDI
Actor14: sbag
Location: 30,17
Owner: GDI
Actor15: sbag
Location: 16,15
Owner: GDI
Actor16: sbag
Location: 16,14
Owner: GDI
Actor17: sbag
Location: 28,13
Owner: GDI
Actor18: sbag
Location: 27,13
Owner: GDI
Actor19: sbag
Location: 26,13
Owner: GDI
Actor20: sbag
Location: 25,13
Owner: GDI
Actor21: sbag
Location: 24,13
Owner: GDI
Actor22: sbag
Location: 23,13
Owner: GDI
Actor23: sbag
Location: 22,13
Owner: GDI
Actor24: sbag
Location: 21,13
Owner: GDI
Actor25: sbag
Location: 20,13
Owner: GDI
Actor26: sbag
Location: 19,13
Owner: GDI
Actor27: sbag
Location: 18,13
Owner: GDI
Actor28: sbag
Location: 17,13
Owner: GDI
Actor29: sbag
Location: 16,13
Owner: GDI
Actor30: t18
Location: 52,25
Owner: Neutral
Actor31: t18
Location: 54,31
Owner: Neutral
Actor32: t18
Location: 17,39
Owner: Neutral
Actor33: t08
Location: 17,43
Owner: Neutral
Actor34: t08
Location: 23,37
Owner: Neutral
Actor35: t08
Location: 22,35
Owner: Neutral
Actor36: t08
Location: 15,37
Owner: Neutral
Actor37: rock2
Location: 8,50
Owner: Neutral
Actor38: rock5
Location: 18,49
Owner: Neutral
Actor39: t08
Location: 19,48
Owner: Neutral
Actor40: t08
Location: 21,52
Owner: Neutral
Actor42: t08
Location: 54,56
Owner: Neutral
Actor43: t08
Location: 31,49
Owner: Neutral
Actor44: t08
Location: 10,38
Owner: Neutral
Actor45: t08
Location: 6,41
Owner: Neutral
Actor46: t08
Location: 5,30
Owner: Neutral
Actor47: t08
Location: 10,16
Owner: Neutral
Actor48: t08
Location: 15,14
Owner: Neutral
Actor49: t08
Location: 19,23
Owner: Neutral
Actor50: t08
Location: 38,43
Owner: Neutral
Actor51: t18
Location: 47,21
Owner: Neutral
Actor52: t18
Location: 48,20
Owner: Neutral
Actor53: t18
Location: 30,21
Owner: Neutral
Actor65: v24
Location: 18,38
Owner: Civilians
Actor66: v32
Location: 19,41
Owner: Civilians
Actor67: v30
Location: 15,40
Owner: Civilians
Actor68: v29
Location: 17,40
Owner: Civilians
Actor69: v28
Location: 23,38
Owner: Civilians
Actor70: v27
Location: 23,36
Owner: Civilians
Actor71: v27
Location: 22,36
Owner: Civilians
Actor72: v26
Location: 16,37
Owner: Civilians
Actor82: mtnk
Location: 21,21
Owner: GDI
Actor83: mtnk
Location: 17,14
Owner: GDI
Actor84: jeep
Location: 29,21
Owner: GDI
Actor85: jeep
Location: 29,20
Owner: GDI
Actor86: e2
Location: 58,30
Owner: GDI
SubCell: 2
Actor87: e2
Location: 57,29
Owner: GDI
SubCell: 0
Actor88: e1
Location: 32,49
Owner: GDI
SubCell: 1
Actor89: e1
Location: 7,30
Owner: GDI
Facing: 512
SubCell: 3
Actor90: e2
Location: 6,30
Owner: GDI
Facing: 384
SubCell: 1
Actor91: e2
Location: 8,28
Owner: GDI
Facing: 640
SubCell: 3
Actor92: e2
Location: 39,43
Owner: GDI
SubCell: 1
waypoint27: waypoint
Location: 39,36
Owner: Neutral
waypoint26: waypoint
Location: 44,48
Owner: Neutral
waypoint12: waypoint
Location: 6,20
Owner: Neutral
waypoint11: waypoint
Location: 5,26
Owner: Neutral
waypoint10: waypoint
Location: 35,13
Owner: Neutral
waypoint9: waypoint
Location: 52,13
Owner: Neutral
waypoint8: waypoint
Location: 47,55
Owner: Neutral
waypoint7: waypoint
Location: 26,54
Owner: Neutral
waypoint6: waypoint
Location: 56,37
Owner: Neutral
waypoint5: waypoint
Location: 30,52
Owner: Neutral
waypoint4: waypoint
Location: 12,47
Owner: Neutral
waypoint3: waypoint
Location: 11,35
Owner: Neutral
waypoint2: waypoint
Location: 55,42
Owner: Neutral
waypoint1: waypoint
Location: 26,32
Owner: Neutral
waypoint0: waypoint
Location: 26,25
Owner: Neutral
UnitsEntry: waypoint
Location: 52,56
Owner: Neutral
UnitsRallyVehicle: waypoint
Location: 51,49
Owner: Neutral
UnitsRallyRocket: waypoint
Location: 49,49
Owner: Neutral
UnitsRallyGunner: waypoint
Location: 53,49
Owner: Neutral
UnitsRallyMCV: waypoint
Location: 51,52
Owner: Neutral
Tower1: gtwr
Location: 28,21
Owner: GDI
Tower2: gtwr
Location: 23,21
Owner: GDI
CommCenter: hq
Location: 21,14
Owner: GDI
Silo1: silo
Location: 16,20
Owner: GDI
Silo2: silo
Location: 16,18
Owner: GDI
Silo3: silo
Location: 16,16
Owner: GDI
Refinery: proc
Location: 18,17
Owner: GDI
Barracks: pyle
Location: 25,18
Owner: GDI
Plant1: nuk2
Location: 21,17
Owner: GDI
Plant2: nuke
Location: 23,17
Owner: GDI
Yard: fact
Location: 18,14
Owner: GDI
Factory: weap
Location: 26,14
Owner: GDI
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,202 @@
--[[
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.
]]
NodUnitsVehicle = { 'bike', 'bike', 'bggy', 'ltnk', 'bike', 'bike' }
NodUnitsRocket = { 'e1', 'e1', 'e1', 'e1' }
NodUnitsGunner = { 'e3', 'e3', 'e3', 'e3' }
GDIReinforceUnits = { 'e2', 'e2', 'e2', 'e2', 'e2' }
GDI1Units = { ['e1'] = 3, ['e2'] = 1 }
GDI2Units = { ['e1'] = 2, ['e2'] = 1 }
GDI3Units = { ['jeep'] = 1 }
GDI4Units = { ['mtnk'] = 1 }
GDI5Units = { ['e1'] = 1, ['e2'] = 2 }
GDI6Units = { ['e1'] = 3 }
GDI7Units = { ['e2'] = 2 }
GDI8Units = { ['e2'] = 5 }
AllUnits = { GDI1Units, GDI2Units, GDI3Units, GDI4Units, GDI5Units, GDI6Units, GDI7Units, GDI8Units }
AirstrikeDelay = DateTime.Minutes(1) + DateTime.Seconds(40)
SamSiteGoal = 3
DelyCellTriggerActivator = { CPos.New(29,30), CPos.New(28,30), CPos.New(27,30), CPos.New(26,30), CPos.New(25,30), CPos.New(24,30), CPos.New(23,30), CPos.New(22,30), CPos.New(21,30), CPos.New(29,29), CPos.New(28,29), CPos.New(27,29), CPos.New(26,29), CPos.New(25,29), CPos.New(24,29), CPos.New(23,29), CPos.New(22,29) }
DelzCellTriggerActivator = { CPos.New(29,27), CPos.New(28,27), CPos.New(27,27), CPos.New(26,27), CPos.New(25,27), CPos.New(24,27), CPos.New(29,26), CPos.New(28,26), CPos.New(27,26), CPos.New(26,26), CPos.New(25,26), CPos.New(24,26) }
Atk5CellTriggerActivator = { CPos.New(10,33), CPos.New(9,33), CPos.New(8,33), CPos.New(9,32), CPos.New(8,32), CPos.New(7,32), CPos.New(8,31), CPos.New(7,31), CPos.New(6,31) }
Atk1CellTriggerActivator = { CPos.New(10,33), CPos.New(9,33), CPos.New(8,33), CPos.New(9,32), CPos.New(8,32), CPos.New(7,32), CPos.New(8,31), CPos.New(7,31), CPos.New(6,31) }
GDI1Waypoints = { waypoint0, waypoint1, waypoint3, waypoint4 }
GDI2Waypoints = { waypoint0, waypoint1, waypoint3, waypoint4, waypoint5 }
GDI3Waypoints = { waypoint0, waypoint1, waypoint2 }
GDI5Waypoints = { waypoint0, waypoint1, waypoint3, waypoint1, waypoint6 }
GDI11Waypoints = { waypoint0, waypoint1, waypoint3, waypoint4, waypoint7, waypoint8 }
GDI12Waypoints = { waypoint0, waypoint1, waypoint3, waypoint11, waypoint12 }
AllWaypoints = { GDI1Waypoints, GDI2Waypoints, GDI3Waypoints, GDI5Waypoints, GDI11Waypoints, GDI12Waypoints }
PrimaryTargets = { Tower1, Tower2, CommCenter, Silo1, Silo2, Silo3, Refinery, Barracks, Plant1, Plant2, Yard, Factory }
SendGDIAirstrike = function()
if not CommCenter.IsDead and CommCenter.Owner == GDI then
local target = GetAirstrikeTarget(Nod)
if target then
CommCenter.TargetAirstrike(target, Angle.NorthEast + Angle.New(16))
Trigger.AfterDelay(AirstrikeDelay, SendGDIAirstrike)
else
Trigger.AfterDelay(AirstrikeDelay/4, SendGDIAirstrike)
end
end
end
SendGDI2Units = function()
if DontSendGDI2 then
return
end
for type, count in pairs(GDI2Units) do
MoveAndHunt(Utils.Take(count, GDI.GetActorsByType(type)), GDI2Waypoints)
end
end
SendGDI1Units = function()
if DontSendGDI1 then
return
end
for type, count in pairs(GDI1Units) do
MoveAndHunt(Utils.Take(count, GDI.GetActorsByType(type)), GDI1Waypoints)
end
end
AutoPatrol = function()
local units = AllUnits[DateTime.GameTime % #AllUnits + 1]
local waypoints = AllWaypoints[DateTime.GameTime % #AllWaypoints + 1]
for type, count in pairs(units) do
MoveAndHunt(Utils.Take(count, GDI.GetActorsByType(type)), waypoints)
end
Trigger.AfterDelay(DateTime.Seconds(45), AutoPatrol)
end
RebuildStartUnits = function()
local types = { "e1", "e2", "jeep", "mtnk" }
local factories = { Barracks, Barracks, Factory, Factory }
for i = 1, 4 do
Utils.Do(GDI.GetActorsByType(types[i]), function(actor)
RebuildUnit({ actor }, GDI, factories[i])
end)
end
end
WorldLoaded = function()
Nod = Player.GetPlayer("Nod")
GDI = Player.GetPlayer("GDI")
Camera.Position = UnitsEntry.CenterPosition
Media.PlaySpeechNotification(Nod, "Reinforce")
Reinforcements.Reinforce(Nod, NodUnitsVehicle, { UnitsEntry.Location, UnitsRallyVehicle.Location }, 1)
Reinforcements.Reinforce(Nod, NodUnitsRocket, { UnitsEntry.Location, UnitsRallyRocket.Location }, 50)
Reinforcements.Reinforce(Nod, NodUnitsGunner, { UnitsEntry.Location, UnitsRallyGunner.Location }, 50)
Trigger.AfterDelay(DateTime.Seconds(6), function()
Reinforcements.Reinforce(Nod, { 'mcv' }, { UnitsEntry.Location, UnitsRallyMCV.Location })
end)
InitObjectives(Nod)
local localBuildSAMs = UserInterface.GetFluentMessage("build-sams", { ["sams"] = SamSiteGoal })
BuildSAMObjective = AddPrimaryObjective(Nod, localBuildSAMs)
DestroyGDI = AddPrimaryObjective(Nod, "destroy-gdi-base")
GDIObjective = AddPrimaryObjective(GDI, "")
Trigger.AfterDelay(AirstrikeDelay, SendGDIAirstrike)
Trigger.AfterDelay(DateTime.Minutes(1) + DateTime.Seconds(30), SendGDI2Units)
Trigger.AfterDelay(DateTime.Minutes(2) + DateTime.Seconds(30), SendGDI1Units)
Trigger.OnEnteredFootprint(DelyCellTriggerActivator, function(a, id)
if a.Owner == Nod then
DontSendGDI2 = true
Trigger.RemoveFootprintTrigger(id)
end
end)
Trigger.OnEnteredFootprint(DelzCellTriggerActivator, function(a, id)
if a.Owner == Nod then
DontSendGDI1 = true
Trigger.RemoveFootprintTrigger(id)
end
end)
Trigger.OnEnteredFootprint(Atk5CellTriggerActivator, function(a, id)
if a.Owner == Nod then
MoveAndHunt(Utils.Take(1, GDI.GetActorsByType("mtnk")), GDI12Waypoints)
Trigger.RemoveFootprintTrigger(id)
end
end)
Trigger.AfterDelay(DateTime.Seconds(3), function()
MoveAndHunt(Utils.Take(2, GDI.GetActorsByType("jeep")), GDI5Waypoints)
end)
Trigger.AfterDelay(DateTime.Minutes(1) + DateTime.Seconds(10), function()
for type, count in pairs(GDI1Units) do
MoveAndHunt(Utils.Take(count, GDI.GetActorsByType(type)), GDI1Waypoints)
end
end)
Trigger.AfterDelay(DateTime.Minutes(3) + DateTime.Seconds(10), function()
for type, count in pairs(GDI2Units) do
MoveAndHunt(Utils.Take(count, GDI.GetActorsByType(type)), GDI2Waypoints)
end
end)
Trigger.AfterDelay(DateTime.Minutes(4) + DateTime.Seconds(40), function()
MoveAndHunt(Utils.Take(1, GDI.GetActorsByType("jeep")), GDI3Waypoints)
end)
Trigger.AfterDelay(DateTime.Minutes(2) + DateTime.Seconds(30), function()
MoveAndHunt(Utils.Take(1, GDI.GetActorsByType("mtnk")), GDI1Waypoints)
end)
Trigger.OnEnteredFootprint(Atk1CellTriggerActivator, function(a, id)
if a.Owner == Nod then
local cargo = Reinforcements.ReinforceWithTransport(GDI, "tran", GDIReinforceUnits, { waypoint9.Location, waypoint26.Location }, { waypoint9.Location })[2]
Utils.Do(cargo, IdleHunt)
Trigger.RemoveFootprintTrigger(id)
end
end)
Trigger.OnAllKilledOrCaptured(PrimaryTargets, function()
Nod.MarkCompletedObjective(DestroyGDI)
Utils.Do(GDI.GetGroundAttackers(), IdleHunt)
end)
Trigger.AfterDelay(0, RebuildStartUnits)
AutoPatrol()
end
Tick = function()
if DateTime.GameTime > 2 and Nod.HasNoRequiredUnits() then
GDI.MarkCompletedObjective(GDIObjective)
end
if not Nod.IsObjectiveCompleted(BuildSAMObjective) and CheckForSams(Nod) then
Nod.MarkCompletedObjective(BuildSAMObjective)
end
end
CheckForSams = function(Nod)
local sams = Nod.GetActorsByType("sam")
return #sams >= SamSiteGoal
end

View File

@@ -0,0 +1,135 @@
World:
LuaScript:
Scripts: campaign.lua, utils.lua, nod05.lua
MusicPlaylist:
StartingMusic: airstrik
VictoryMusic: nod_win1
MissionData:
Briefing: briefing
BackgroundVideo: sethpre.vqa
BriefingVideo: nod5.vqa
StartVideo: samsite.vqa
WinVideo: insites.vqa
LossVideo: flag.vqa
SmudgeLayer@CRATER:
InitialSmudges:
46,48: cr1,0
^Palettes:
IndexedPlayerPalette:
PlayerIndex:
Civilians: 192, 164, 132, 155, 133, 197, 112, 12, 163, 132, 155, 133, 134, 197, 154, 198
IndexedPlayerPalette@units:
PlayerIndex:
Civilians: 192, 164, 132, 155, 133, 197, 112, 12, 163, 132, 155, 133, 134, 197, 154, 198
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
E5:
Buildable:
Prerequisites: ~disabled
RMBO:
Buildable:
Prerequisites: ~disabled
MLRS:
Buildable:
Prerequisites: ~disabled
MCV:
Buildable:
Prerequisites: ~disabled
GTWR:
Buildable:
Prerequisites: ~disabled
WEAP:
Buildable:
Prerequisites: ~disabled
EYE:
Buildable:
Prerequisites: ~disabled
ATWR:
Buildable:
Prerequisites: ~disabled
HARV:
Buildable:
Prerequisites: ~disabled
Harvester:
SearchFromProcRadius: 24
SearchFromHarvesterRadius: 24
FTNK:
Buildable:
Prerequisites: ~disabled
STNK:
Buildable:
Prerequisites: ~disabled
ARTY:
Buildable:
Prerequisites: ~disabled
MTNK:
Buildable:
Prerequisites: ~disabled
HTNK:
Buildable:
Prerequisites: ~disabled
ORCA:
Buildable:
Prerequisites: ~disabled
MSAM:
Buildable:
Prerequisites: ~disabled
SBAG:
Buildable:
Queue: Support.GDI, Support.Nod
HQ:
AirstrikePower:
Prerequisites: gdi
SquadSize: 1
A10:
Targetable: