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 has kept a stranglehold on Egypt for many years. Establish a forward attack base in the region. Begin by selecting your Mobile Construction Vehicle (MCV) and right-clicking on it to enable base construction. This area contains plenty of Tiberium, so establishing a base should be straightforward.

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

View File

@@ -0,0 +1,200 @@
MapFormat: 12
RequiresMod: cnc
Title: 02b: Invasion of Egypt
Author: Westwood Studios
Tileset: DESERT
MapSize: 64,64
Bounds: 27,34,36,26
Visibility: MissionSelector
Categories: Campaign
LockPreview: True
Players:
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
PlayerReference@Neutral:
Name: Neutral
OwnsWorld: True
NonCombatant: True
Faction: gdi
Actors:
Actor0: t08
Location: 30,52
Owner: Neutral
Actor1: t18
Location: 34,52
Owner: Neutral
Actor2: t08
Location: 57,47
Owner: Neutral
Actor3: t08
Location: 38,59
Owner: Neutral
Actor4: silo
Location: 33,40
Owner: GDI
Actor9: silo
Location: 32,42
Owner: GDI
Actor10: jeep
Location: 30,46
Owner: GDI
Facing: 512
Actor11: jeep
Location: 31,35
Owner: GDI
Facing: 256
Actor17: e1
Location: 34,56
Owner: GDI
SubCell: 3
Actor18: e1
Location: 43,35
Owner: GDI
SubCell: 3
Actor19: e1
Location: 43,36
Owner: GDI
SubCell: 3
Actor31: e1
Location: 47,53
Owner: GDI
SubCell: 4
Actor32: e1
Location: 49,54
Owner: GDI
Facing: 896
SubCell: 1
Actor35: e1
Location: 34,57
Owner: GDI
Facing: 256
SubCell: 1
waypoint27: waypoint
Location: 27,51
Owner: Neutral
waypoint26: waypoint
Location: 49,35
Owner: Neutral
waypoint10: waypoint
Location: 30,44
Owner: Neutral
waypoint9: waypoint
Location: 55,40
Owner: Neutral
waypoint8: waypoint
Location: 48,41
Owner: Neutral
waypoint7: waypoint
Location: 60,58
Owner: Neutral
waypoint6: waypoint
Location: 61,47
Owner: Neutral
waypoint5: waypoint
Location: 48,55
Owner: Neutral
waypoint4: waypoint
Location: 41,51
Owner: Neutral
waypoint3: waypoint
Location: 28,36
Owner: Neutral
waypoint2: waypoint
Location: 28,51
Owner: Neutral
waypoint1: waypoint
Location: 40,43
Owner: Neutral
waypoint0: waypoint
Location: 40,35
Owner: Neutral
Refinery: proc
Location: 30,38
Owner: GDI
Barracks: pyle
Location: 34,43
Owner: GDI
Powerplant: nuke
Location: 35,40
Owner: GDI
Yard: fact
Location: 33,37
Owner: GDI
Guard1: e1
Location: 42,39
Owner: GDI
Facing: 256
SubCell: 0
Guard2: e1
Location: 38,38
Owner: GDI
Facing: 256
SubCell: 2
Guard3: e1
Location: 35,49
Owner: GDI
Facing: 384
SubCell: 0
Guard4: e1
Location: 34,48
Owner: GDI
Facing: 384
SubCell: 3
Guard5: e1
Location: 39,40
Owner: GDI
Facing: 256
SubCell: 1
Guard6: e1
Location: 40,56
Owner: GDI
Facing: 384
SubCell: 4
Guard7: e1
Location: 38,54
Owner: GDI
Facing: 128
SubCell: 3
McvEntry: waypoint
Location: 62,43
Owner: Neutral
McvRally: waypoint
Location: 57,41
Owner: Neutral
UnitsEntry: waypoint
Location: 62,38
Owner: Neutral
UnitsRally: waypoint
Location: 56,38
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,117 @@
--[[
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.
]]
NodUnits = { "bggy", "e1", "e1", "e1", "e1", "e1", "bggy", "e1", "e1", "e1", "bggy" }
NodBaseBuildings = { "hand", "fact", "nuke" }
GDIBase = { Refinery, Barracks, Powerplant, Yard }
Guards = { Guard1, Guard2, Guard3, Guard4, Guard5, Guard6, Guard7 }
Atk1CellTriggerActivator = { CPos.New(45,37), CPos.New(44,37), CPos.New(45,36), CPos.New(44,36), CPos.New(45,35), CPos.New(44,35), CPos.New(45,34), CPos.New(44,34) }
Atk4CellTriggerActivator = { CPos.New(50,47), CPos.New(49,47), CPos.New(48,47), CPos.New(47,47), CPos.New(46,47), CPos.New(45,47), CPos.New(44,47), CPos.New(43,47), CPos.New(42,47), CPos.New(41,47), CPos.New(40,47), CPos.New(39,47), CPos.New(38,47), CPos.New(37,47), CPos.New(50,46), CPos.New(49,46), CPos.New(48,46), CPos.New(47,46), CPos.New(46,46), CPos.New(45,46), CPos.New(44,46), CPos.New(43,46), CPos.New(42,46), CPos.New(41,46), CPos.New(40,46), CPos.New(39,46), CPos.New(38,46) }
Atk1Waypoints = { waypoint2, waypoint4, waypoint5, waypoint6 }
Atk2Waypoints = { waypoint2, waypoint5, waypoint7, waypoint6 }
Atk3Waypoints = { waypoint2, waypoint4, waypoint5, waypoint9 }
Atk4Waypoints = { waypoint0, waypoint8, waypoint9 }
Pat1Waypoints = { waypoint0, waypoint1, waypoint2, waypoint3 }
GetAttackers = function(amount)
local units = GDI.GetActorsByType("e1")
if amount > #units then
return units
end
return Utils.Take(amount, units)
end
WorldLoaded = function()
Nod = Player.GetPlayer("Nod")
GDI = Player.GetPlayer("GDI")
InitObjectives(Nod)
BuildBaseObjective = AddPrimaryObjective(Nod, "build-base")
DestroyGDI = AddPrimaryObjective(Nod, "destroy-gdi-base")
GDIObjective = AddPrimaryObjective(GDI, "")
Utils.Do(Guards, function(actor)
Trigger.OnDamaged(actor, function()
if Atk3TriggerSwitch then
return
end
Atk3TriggerSwitch = true
MoveAndHunt(GetAttackers(4), Atk3Waypoints)
end)
end)
Trigger.OnAllRemovedFromWorld(GDIBase, function()
Utils.Do(GDI.GetGroundAttackers(), IdleHunt)
end)
Trigger.AfterDelay(DateTime.Seconds(40), function()
MoveAndHunt(GetAttackers(3), Atk2Waypoints)
end)
Trigger.AfterDelay(DateTime.Minutes(1) + DateTime.Seconds(15), function()
MoveAndHunt(GetAttackers(3), Atk2Waypoints)
end)
Trigger.AfterDelay(DateTime.Minutes(1) + DateTime.Seconds(20), function()
MoveAndHunt(GetAttackers(3), Atk3Waypoints)
end)
Trigger.AfterDelay(DateTime.Seconds(50), function()
MoveAndHunt(GetAttackers(3), Atk4Waypoints)
end)
Trigger.AfterDelay(DateTime.Seconds(30), function()
MoveAndHunt(GetAttackers(3), Pat1Waypoints)
end)
Trigger.OnEnteredFootprint(Atk1CellTriggerActivator, function(a, id)
if a.Owner == Nod then
MoveAndHunt(GetAttackers(5), Atk1Waypoints)
Trigger.RemoveFootprintTrigger(id)
end
end)
Trigger.OnEnteredFootprint(Atk4CellTriggerActivator, function(a, id)
if a.Owner == Nod then
MoveAndHunt(GetAttackers(3), Atk2Waypoints)
Trigger.RemoveFootprintTrigger(id)
end
end)
Trigger.AfterDelay(0, function()
Utils.Do(GDI.GetActorsByType("e1"), function(unit)
RebuildUnit({ unit }, GDI, Barracks)
end)
end)
Media.PlaySpeechNotification(Nod, "Reinforce")
Reinforcements.Reinforce(Nod, NodUnits, { UnitsEntry.Location, UnitsRally.Location }, 15)
Reinforcements.Reinforce(Nod, { "mcv" }, { McvEntry.Location, McvRally.Location })
end
Tick = function()
if GDI.HasNoRequiredUnits() then
Nod.MarkCompletedObjective(DestroyGDI)
end
if DateTime.GameTime > 2 and Nod.HasNoRequiredUnits() then
GDI.MarkCompletedObjective(GDIObjective)
end
if DateTime.GameTime % DateTime.Seconds(1) == 0 and not Nod.IsObjectiveCompleted(BuildBaseObjective) and CheckForBase(Nod, NodBaseBuildings) then
Nod.MarkCompletedObjective(BuildBaseObjective)
end
end

View File

@@ -0,0 +1,189 @@
Player:
PlayerResources:
DefaultCash: 4000
World:
LuaScript:
Scripts: campaign.lua, utils.lua, nod02b.lua
MusicPlaylist:
StartingMusic: ind2
VictoryMusic: nod_win1
MissionData:
Briefing: briefing
BriefingVideo: nod2.vqa
StartVideo: seige.vqa
WinVideo: airstrk.vqa
LossVideo: deskill.vqa
^Vehicle:
Tooltip:
GenericVisibility: Enemy
ShowOwnerRow: false
RenderSprites:
PlayerPalette: player-units
^Tank:
Tooltip:
GenericVisibility: Enemy
ShowOwnerRow: false
RenderSprites:
PlayerPalette: player-units
^Helicopter:
Tooltip:
GenericVisibility: Enemy
ShowOwnerRow: false
RenderSprites:
PlayerPalette: player-units
^Infantry:
Tooltip:
GenericVisibility: Enemy
ShowOwnerRow: false
RenderSprites:
PlayerPalette: player-units
^Plane:
Tooltip:
GenericVisibility: Enemy
ShowOwnerRow: false
^Ship:
Tooltip:
GenericVisibility: Enemy
ShowOwnerRow: false
^Building:
Tooltip:
GenericVisibility: Enemy
ShowOwnerRow: false
^Wall:
Tooltip:
ShowOwnerRow: false
^CommonHuskDefaults:
Tooltip:
GenericVisibility: Enemy, Ally, Neutral
GenericStancePrefix: false
ShowOwnerRow: false
RenderSprites:
PlayerPalette: player-units
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
RenderSprites:
PlayerPalette: player
MCV.Husk:
RenderSprites:
PlayerPalette: player
HARV:
RenderSprites:
PlayerPalette: player
HARV.Husk:
RenderSprites:
PlayerPalette: player
SAM:
Buildable:
Prerequisites: ~disabled
HQ:
Buildable:
Prerequisites: ~disabled
AFLD:
Buildable:
Prerequisites: ~disabled
E4:
Buildable:
Prerequisites: ~disabled
E3:
Buildable:
Prerequisites: ~disabled
E2:
Buildable:
Prerequisites: ~disabled
SBAG:
Buildable:
Prerequisites: ~disabled
GTWR:
Buildable:
Prerequisites: ~disabled
WEAP:
Buildable:
Prerequisites: ~disabled
EYE:
Buildable:
Prerequisites: ~disabled
ATWR:
Buildable:
Prerequisites: ~disabled