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,2 @@
## rules.yaml
briefing = GDI is trying to relocate a village of sympathetic civilians. Intercept the convoy and destroy it. Ensure that no villagers survive — this will serve as a warning to any other natives who may oppose us.

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

View File

@@ -0,0 +1,482 @@
MapFormat: 12
RequiresMod: cnc
Title: 04a: Oum Hadjer
Author: Westwood Studios
Tileset: DESERT
MapSize: 64,64
Bounds: 7,17,52,44
Visibility: MissionSelector
Categories: Campaign
LockPreview: True
Players:
PlayerReference@GDI:
Name: GDI
Bot: campaign
Faction: gdi
Color: F5D378
Enemies: Nod
PlayerReference@Neutral:
Name: Neutral
OwnsWorld: True
NonCombatant: True
Faction: gdi
PlayerReference@Nod:
Name: Nod
AllowBots: False
Playable: True
Required: True
LockFaction: True
Faction: nod
LockColor: True
Color: FE1100
LockSpawn: True
LockTeam: True
Enemies: GDI
Actors:
Actor0: sbag
Location: 58,26
Owner: Neutral
Actor1: sbag
Location: 57,26
Owner: Neutral
Actor2: sbag
Location: 56,26
Owner: Neutral
Actor3: sbag
Location: 55,26
Owner: Neutral
Actor4: sbag
Location: 54,26
Owner: Neutral
Actor5: sbag
Location: 53,26
Owner: Neutral
Actor6: sbag
Location: 52,26
Owner: Neutral
Actor7: sbag
Location: 51,26
Owner: Neutral
Actor8: sbag
Location: 50,26
Owner: Neutral
Actor9: sbag
Location: 49,26
Owner: Neutral
Actor10: sbag
Location: 48,26
Owner: Neutral
Actor11: sbag
Location: 47,26
Owner: Neutral
Actor12: sbag
Location: 58,25
Owner: Neutral
Actor13: sbag
Location: 47,25
Owner: Neutral
Actor14: sbag
Location: 58,24
Owner: Neutral
Actor15: sbag
Location: 47,24
Owner: Neutral
Actor16: sbag
Location: 58,23
Owner: Neutral
Actor17: sbag
Location: 58,22
Owner: Neutral
Actor18: sbag
Location: 58,21
Owner: Neutral
Actor19: sbag
Location: 47,21
Owner: Neutral
Actor20: sbag
Location: 58,20
Owner: Neutral
Actor21: sbag
Location: 47,20
Owner: Neutral
Actor22: sbag
Location: 58,19
Owner: Neutral
Actor23: sbag
Location: 47,19
Owner: Neutral
Actor24: sbag
Location: 58,18
Owner: Neutral
Actor25: sbag
Location: 57,18
Owner: Neutral
Actor26: sbag
Location: 48,18
Owner: Neutral
Actor27: sbag
Location: 47,18
Owner: Neutral
Actor28: sbag
Location: 58,17
Owner: Neutral
Actor29: sbag
Location: 57,17
Owner: Neutral
Actor30: sbag
Location: 56,17
Owner: Neutral
Actor31: sbag
Location: 55,17
Owner: Neutral
Actor32: sbag
Location: 54,17
Owner: Neutral
Actor33: sbag
Location: 53,17
Owner: Neutral
Actor34: sbag
Location: 52,17
Owner: Neutral
Actor35: sbag
Location: 51,17
Owner: Neutral
Actor36: sbag
Location: 50,17
Owner: Neutral
Actor37: sbag
Location: 49,17
Owner: Neutral
Actor38: sbag
Location: 48,17
Owner: Neutral
Actor39: sbag
Location: 47,17
Owner: Neutral
Actor40: t18
Location: 47,50
Owner: Neutral
Actor41: t18
Location: 46,31
Owner: Neutral
Actor42: t08
Location: 39,26
Owner: Neutral
Actor43: t18
Location: 37,25
Owner: Neutral
Actor44: t18
Location: 27,28
Owner: Neutral
Actor45: t18
Location: 54,26
Owner: Neutral
Actor46: t18
Location: 49,18
Owner: Neutral
Actor47: t18
Location: 23,54
Owner: Neutral
Actor48: t18
Location: 34,40
Owner: Neutral
Actor49: t08
Location: 16,45
Owner: Neutral
Actor50: t08
Location: 14,53
Owner: Neutral
Actor52: t18
Location: 13,44
Owner: Neutral
Actor57: t18
Location: 36,49
Owner: Neutral
Actor58: t18
Location: 44,59
Owner: Neutral
Actor59: t18
Location: 11,37
Owner: Neutral
Actor60: t18
Location: 25,20
Owner: Neutral
Actor61: gtwr
Location: 46,21
Owner: GDI
Actor62: gtwr
Location: 46,24
Owner: GDI
Actor63: hosp
Location: 48,19
Owner: GDI
Actor64: pyle
Location: 50,20
Owner: GDI
Actor65: nuke
Location: 53,21
Owner: GDI
Actor66: nuke
Location: 52,23
Owner: GDI
Actor67: silo
Location: 56,24
Owner: GDI
Actor68: silo
Location: 55,22
Owner: GDI
Actor69: fact
Location: 53,18
Owner: GDI
Actor70: hq
Location: 56,19
Owner: GDI
Actor72: v36
Location: 12,54
Owner: Neutral
Actor73: v35
Location: 10,54
Owner: Neutral
Actor74: v34
Location: 11,53
Owner: Neutral
Actor75: v33
Location: 15,53
Owner: Neutral
Actor76: v32
Location: 12,53
Owner: Neutral
Actor77: v31
Location: 10,52
Owner: Neutral
Actor87: v23
Location: 9,59
Owner: Neutral
Jeep1: jeep
Location: 51,25
Owner: GDI
Jeep2: jeep
Location: 50,25
Owner: GDI
Actor94: jeep
Location: 39,48
Owner: GDI
Facing: 384
Actor110: e1
Location: 40,49
Owner: GDI
Facing: 896
SubCell: 0
Actor111: e2
Location: 38,50
Owner: GDI
Facing: 896
SubCell: 2
Actor112: e2
Location: 38,49
Owner: GDI
Facing: 512
SubCell: 0
Actor113: e2
Location: 35,40
Owner: GDI
SubCell: 0
Actor114: e2
Location: 35,40
Owner: GDI
SubCell: 1
waypoint27: waypoint
Location: 31,36
Owner: Neutral
waypoint25: waypoint
Location: 40,43
Owner: Neutral
waypoint26: waypoint
Location: 28,27
Owner: Neutral
waypoint11: waypoint
Location: 54,29
Owner: Neutral
waypoint10: waypoint
Location: 45,28
Owner: Neutral
GDIBase: waypoint
Location: 52,22
Owner: Neutral
waypoint8: waypoint
Location: 43,22
Owner: Neutral
waypoint7: waypoint
Location: 31,22
Owner: Neutral
waypoint6: waypoint
Location: 21,25
Owner: Neutral
waypoint5: waypoint
Location: 18,39
Owner: Neutral
waypoint4: waypoint
Location: 10,48
Owner: Neutral
waypoint3: waypoint
Location: 19,48
Owner: Neutral
waypoint2: waypoint
Location: 27,55
Owner: Neutral
waypoint1: waypoint
Location: 48,56
Owner: Neutral
waypoint0: waypoint
Location: 54,42
Owner: Neutral
Convoi: apc
Location: 24,53
Owner: GDI
CivBuilding1: v26
Location: 8,51
Owner: GDI
CivBuilding2: v30
Location: 17,46
Owner: GDI
CivBuilding3: v29
Location: 16,46
Owner: GDI
CivBuilding4: v28
Location: 15,45
Owner: GDI
CivBuilding5: v27
Location: 14,51
Owner: GDI
CivBuilding6: v27
Location: 13,51
Owner: GDI
CivBuilding7: v27
Location: 12,51
Owner: GDI
CivBuilding8: v26
Location: 14,46
Owner: GDI
CivBuilding9: v25
Location: 19,46
Owner: GDI
CivBuilding10: v24
Location: 8,47
Owner: GDI
CivBuilding11: v22
Location: 9,45
Owner: GDI
CivBuilding12: v22
Location: 18,52
Owner: GDI
CivBuilding13: v21
Location: 16,51
Owner: GDI
CivBuilding14: v20
Location: 8,45
Owner: GDI
Civilian1: c2
Location: 11,50
Owner: GDI
Facing: 896
SubCell: 0
Civilian2: c9
Location: 12,49
Owner: GDI
Facing: 896
SubCell: 2
Civilian3: c8
Location: 14,49
Owner: GDI
Facing: 256
SubCell: 3
Civilian4: c7
Location: 13,50
Owner: GDI
Facing: 896
SubCell: 0
Civilian5: c6
Location: 11,49
Owner: GDI
Facing: 128
SubCell: 0
Civilian6: c5
Location: 12,50
Owner: GDI
Facing: 896
SubCell: 2
Civilian7: c4
Location: 10,50
Owner: GDI
Facing: 128
SubCell: 1
Civilian8: c3
Location: 10,51
Owner: GDI
Facing: 128
SubCell: 1
Actor56: t18
Location: 19,51
Owner: Neutral
Actor55: t18
Location: 20,46
Owner: Neutral
Actor51: t08
Location: 13,46
Owner: Neutral
Actor53: t18
Location: 7,46
Owner: Neutral
Actor54: t18
Location: 11,51
Owner: Neutral
GDIGunner1: e1
Location: 41,50
Owner: GDI
Facing: 768
SubCell: 2
GDIGunner2: e1
Location: 39,50
Owner: GDI
SubCell: 0
GDIGunner3: e1
Location: 40,50
Owner: GDI
Facing: 256
SubCell: 0
EntryPointVehicle: waypoint
Location: 33,17
Owner: Neutral
RallyPointVehicle: waypoint
Location: 33,30
Owner: Neutral
EntryPointRocket: waypoint
Location: 35,17
Owner: Neutral
RallyPointRocket: waypoint
Location: 35,32
Owner: Neutral
EntryPointGunner: waypoint
Location: 31,17
Owner: Neutral
RallyPointGunner: waypoint
Location: 31,32
Owner: Neutral
CameraPoint: waypoint
Location: 32,22
Owner: Neutral
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,130 @@
--[[
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", "bike", "bike" }
NodUnitsRocket = { "e3", "e3", "e3", "e3", "e3", "e3" }
NodUnitsGunner = { "e1", "e1", "e1", "e1", "e1", "e1" }
Apc3Trigger = { CPos.New(28,58), CPos.New(27,58), CPos.New(28,57), CPos.New(27,57), CPos.New(28,56), CPos.New(27,56), CPos.New(28,55), CPos.New(27,55), CPos.New(28,54), CPos.New(27,54), CPos.New(28,53), CPos.New(27,53) }
NorthernBridgeTrigger = { CPos.New(13,41), CPos.New(14,41), CPos.New(15,41), CPos.New(14,42), CPos.New(15,42), CPos.New(16,42) }
SouthernBridgeTrigger = { CPos.New(26,54), CPos.New(25,54), CPos.New(24,54), CPos.New(25,53), CPos.New(24,53), CPos.New(23,53) }
Apc1Units = { "c2", "c3", "c4", "c5" }
Civilians = { Civilian1, Civilian2, Civilian3, Civilian4, Civilian5, Civilian6, Civilian7, Civilian8 }
TargetActors = { Civilian1, Civilian2, Civilian3, Civilian4, Civilian5, Civilian6, Civilian7, Civilian8, CivBuilding1, CivBuilding2, CivBuilding3, CivBuilding4, CivBuilding5, CivBuilding6, CivBuilding7, CivBuilding8, CivBuilding9, CivBuilding10, CivBuilding11, CivBuilding12, CivBuilding13, CivBuilding14 }
Apc2Trigger = { GDIGunner1, GDIGunner2, GDIGunner3 }
Apc1Waypoints = { waypoint0.Location, waypoint11.Location, waypoint10.Location, waypoint8.Location, GDIBase.Location }
Apc2Waypoints = { waypoint8, waypoint7, waypoint6, waypoint5, waypoint4 }
Apc3Waypoints = { waypoint3, waypoint2, waypoint1, waypoint0, waypoint11, waypoint10, waypoint8, GDIBase }
FlightRouteTop = { waypoint4, waypoint5, waypoint6, waypoint7, waypoint8, GDIBase }
FlightRouteBottom = { waypoint3, waypoint2, waypoint1, waypoint11, waypoint10, waypoint8, GDIBase }
Hummer1Waypoints = { waypoint8, waypoint7, waypoint6, waypoint5, waypoint4, waypoint3, waypoint2, waypoint1, waypoint0, waypoint11, waypoint10, waypoint8 }
WorldLoaded = function()
Nod = Player.GetPlayer("Nod")
GDI = Player.GetPlayer("GDI")
Trigger.AfterDelay(DateTime.Seconds(3), function()
local apc = Actor.Create("apc", true, { Owner = GDI, Location = Apc1Waypoints[1], Cargo = Apc1Units })
Utils.Do(Apc1Waypoints, function(waypoint)
apc.AttackMove(waypoint)
end)
Trigger.OnEnteredFootprint(Apc3Trigger, function(a, id)
if a.Owner == Nod then
MoveAndHunt({ apc }, Apc3Waypoints)
Trigger.RemoveFootprintTrigger(id)
end
end)
end)
Trigger.OnEnteredFootprint(NorthernBridgeTrigger, function(a, id)
if a.Owner == Nod then
if not CiviliansEvacuated then
CiviliansEvacuated = true
Utils.Do(Civilians, function(civ)
Utils.Do(FlightRouteBottom, function(waypoint)
civ.Move(waypoint.Location)
end)
Trigger.OnIdle(civ, function()
if civ.Location == GDIBase.Location then
Trigger.Clear(civ, "OnIdle")
else
civ.Move(GDIBase.Location)
end
end)
end)
end
Trigger.RemoveFootprintTrigger(id)
end
end)
Trigger.OnEnteredFootprint(SouthernBridgeTrigger, function(a, id)
if a.Owner == Nod then
if not CiviliansEvacuated then
CiviliansEvacuated = true
Utils.Do(Civilians, function(civ)
Utils.Do(FlightRouteTop, function(waypoint)
civ.Move(waypoint.Location)
end)
Trigger.OnIdle(civ, function()
if civ.Location == GDIBase.Location then
Trigger.Clear(civ, "OnIdle")
else
civ.Move(GDIBase.Location)
end
end)
end)
end
Trigger.RemoveFootprintTrigger(id)
end
end)
Trigger.OnDiscovered(Convoi, function()
MoveAndHunt({ Jeep1, Jeep2 }, Hummer1Waypoints)
end)
Trigger.OnAllRemovedFromWorld(Apc2Trigger, function()
MoveAndHunt({ Convoi }, Apc2Waypoints)
end)
Trigger.OnAllRemovedFromWorld(TargetActors, function()
Nod.MarkCompletedObjective(KillCivilians)
end)
InitObjectives(Nod)
KillCivilians = AddPrimaryObjective(Nod, "destroy-village-kill-civilians")
KillGDI = AddSecondaryObjective(Nod, "kill-gdi-units")
Camera.Position = CameraPoint.CenterPosition
Media.PlaySpeechNotification(Nod, "Reinforce")
Trigger.AfterDelay(DateTime.Seconds(1), function()
Reinforcements.ReinforceWithTransport(Nod, "tran", NodUnitsBuggy, { EntryPointVehicle.Location, RallyPointVehicle.Location }, { EntryPointVehicle.Location })
end)
Reinforcements.ReinforceWithTransport(Nod, "tran", NodUnitsRocket, { EntryPointRocket.Location, RallyPointRocket.Location }, { EntryPointRocket.Location })
Reinforcements.ReinforceWithTransport(Nod, "tran", NodUnitsGunner, { EntryPointGunner.Location, RallyPointGunner.Location }, { EntryPointGunner.Location })
end
Tick = function()
if DateTime.GameTime > 2 and Nod.HasNoRequiredUnits() then
Nod.MarkFailedObjective(KillCivilians)
end
if GDI.HasNoRequiredUnits() then
Nod.MarkCompletedObjective(KillGDI)
end
end

View File

@@ -0,0 +1,28 @@
World:
LuaScript:
Scripts: campaign.lua, utils.lua, nod04a.lua
MusicPlaylist:
StartingMusic: warfare
VictoryMusic: nod_win1
MissionData:
Briefing: briefing
BriefingVideo: nod4a.vqa
LossVideo: nodlose.vqa
Player:
EnemyWatcher:
PlayerResources:
DefaultCash: 0
^Vehicle:
AnnounceOnSeen:
^Tank:
AnnounceOnSeen:
TRAN:
RejectsOrders:
-Selectable:
RevealsShroud:
Range: 5c0
Interactable: