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 =
GDI has established a prison camp, where they are detaining some of the local political leaders.
Kane wishes to liberate these victims.
Destroy the GDI forces and capture the prison, do not destroy it.

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

View File

@@ -0,0 +1,480 @@
MapFormat: 12
RequiresMod: cnc
Title: 03b: Sudanese Prison Break
Author: Westwood Studios
Tileset: DESERT
MapSize: 64,64
Bounds: 13,16,42,34
Visibility: MissionSelector
Categories: Campaign
LockPreview: True
Players:
PlayerReference@Neutral:
Name: Neutral
OwnsWorld: True
NonCombatant: True
Faction: gdi
PlayerReference@GDI:
Name: GDI
Bot: campaign
Faction: gdi
Color: F5D378
Allies: GDI
Enemies: Nod
PlayerReference@Nod:
Name: Nod
AllowBots: False
Playable: True
Required: True
LockFaction: True
Faction: nod
LockColor: True
Color: FE1100
LockSpawn: True
LockTeam: True
Allies: Nod
Enemies: GDI
Actors:
Actor117: e1
Location: 41,21
Owner: GDI
Facing: 768
SubCell: 0
Actor118: e1
Location: 48,21
Owner: GDI
Facing: 768
SubCell: 4
Actor119: e2
Location: 27,25
Owner: GDI
Facing: 512
SubCell: 0
Actor120: e2
Location: 36,30
Owner: GDI
Facing: 256
SubCell: 4
Actor121: e2
Location: 41,39
Owner: GDI
Facing: 256
SubCell: 1
Actor122: e2
Location: 42,49
Owner: GDI
Facing: 128
SubCell: 0
Actor123: e2
Location: 43,26
Owner: GDI
Facing: 512
SubCell: 1
Actor111: e1
Location: 34,31
Owner: GDI
Facing: 384
SubCell: 4
Actor106: e1
Location: 40,22
Owner: GDI
Facing: 512
SubCell: 2
Actor107: e1
Location: 40,21
Owner: GDI
SubCell: 0
Actor108: e1
Location: 36,33
Owner: GDI
SubCell: 0
Actor109: e1
Location: 34,24
Owner: GDI
Facing: 384
SubCell: 3
Actor86: e1
Location: 51,21
Owner: GDI
Facing: 640
SubCell: 0
Actor87: e1
Location: 16,39
Owner: GDI
SubCell: 0
Actor88: e1
Location: 20,28
Owner: GDI
Facing: 512
SubCell: 2
Actor89: e1
Location: 19,21
Owner: GDI
SubCell: 1
Facing: 512
Actor90: e1
Location: 30,43
Owner: GDI
Facing: 384
SubCell: 1
Actor91: e1
Location: 30,43
Owner: GDI
Facing: 384
SubCell: 4
Actor92: e1
Location: 34,32
Owner: GDI
Facing: 512
SubCell: 4
Actor93: e1
Location: 23,35
Owner: GDI
SubCell: 0
Actor94: e1
Location: 17,32
Owner: GDI
Facing: 512
SubCell: 1
Actor95: e1
Location: 24,43
Owner: GDI
Facing: 384
SubCell: 0
Actor96: e1
Location: 15,37
Owner: GDI
Facing: 256
SubCell: 1
Actor97: e1
Location: 24,30
Owner: GDI
Facing: 256
SubCell: 3
Actor98: e1
Location: 35,27
Owner: GDI
SubCell: 2
Actor82: e1
Location: 25,43
Owner: GDI
Facing: 384
SubCell: 0
Actor0: sbag
Location: 30,22
Owner: Neutral
Actor1: sbag
Location: 29,22
Owner: Neutral
Actor2: sbag
Location: 28,22
Owner: Neutral
Actor3: sbag
Location: 30,21
Owner: Neutral
Actor4: sbag
Location: 17,21
Owner: Neutral
Actor5: sbag
Location: 16,21
Owner: Neutral
Actor6: sbag
Location: 14,21
Owner: Neutral
Actor7: sbag
Location: 13,21
Owner: Neutral
Actor8: sbag
Location: 30,20
Owner: Neutral
Actor9: sbag
Location: 17,20
Owner: Neutral
Actor10: sbag
Location: 13,20
Owner: Neutral
Actor11: sbag
Location: 30,19
Owner: Neutral
Actor12: sbag
Location: 17,19
Owner: Neutral
Actor13: sbag
Location: 13,19
Owner: Neutral
Actor14: sbag
Location: 30,18
Owner: Neutral
Actor15: sbag
Location: 17,18
Owner: Neutral
Actor16: sbag
Location: 13,18
Owner: Neutral
Actor17: sbag
Location: 30,17
Owner: Neutral
Actor18: sbag
Location: 17,17
Owner: Neutral
Actor19: sbag
Location: 13,17
Owner: Neutral
Actor20: sbag
Location: 30,16
Owner: Neutral
Actor21: sbag
Location: 29,16
Owner: Neutral
Actor22: sbag
Location: 28,16
Owner: Neutral
Actor23: sbag
Location: 27,16
Owner: Neutral
Actor24: sbag
Location: 26,16
Owner: Neutral
Actor25: sbag
Location: 25,16
Owner: Neutral
Actor26: sbag
Location: 24,16
Owner: Neutral
Actor27: sbag
Location: 23,16
Owner: Neutral
Actor28: sbag
Location: 22,16
Owner: Neutral
Actor29: sbag
Location: 21,16
Owner: Neutral
Actor30: sbag
Location: 20,16
Owner: Neutral
Actor31: sbag
Location: 19,16
Owner: Neutral
Actor32: sbag
Location: 18,16
Owner: Neutral
Actor33: sbag
Location: 17,16
Owner: Neutral
Actor34: sbag
Location: 16,16
Owner: Neutral
Actor35: sbag
Location: 15,16
Owner: Neutral
Actor36: sbag
Location: 14,16
Owner: Neutral
Actor37: sbag
Location: 13,16
Owner: Neutral
Actor38: t08
Location: 35,39
Owner: Neutral
Actor39: t18
Location: 33,38
Owner: Neutral
Actor40: t08
Location: 39,27
Owner: Neutral
Actor41: t08
Location: 47,24
Owner: Neutral
Actor42: t18
Location: 45,24
Owner: Neutral
Actor43: t08
Location: 35,33
Owner: Neutral
Actor44: t08
Location: 39,36
Owner: Neutral
Actor45: t08
Location: 39,21
Owner: Neutral
Actor46: t08
Location: 42,21
Owner: Neutral
Actor47: t08
Location: 27,31
Owner: Neutral
Actor48: t08
Location: 15,39
Owner: Neutral
Actor49: t18
Location: 15,42
Owner: Neutral
Actor50: t18
Location: 13,37
Owner: Neutral
Base4: silo
Location: 23,17
Owner: GDI
Base1: silo
Location: 18,17
Owner: GDI
Base3: pyle
Location: 23,19
Owner: GDI
Base5: nuke
Location: 25,17
Owner: GDI
Base6: fact
Location: 27,17
Owner: GDI
Base7: gtwr
Location: 18,23
Owner: GDI
Actor57: v20
Location: 13,38
Owner: Neutral
Actor58: v21
Location: 13,40
Owner: Neutral
Actor59: v22
Location: 18,40
Owner: Neutral
Actor60: v24
Location: 15,37
Owner: Neutral
Actor61: v25
Location: 17,41
Owner: Neutral
Actor62: v19
Location: 28,41
Owner: Neutral
Base2: proc
Location: 20,17
Owner: GDI
Actor65: v19
Location: 29,41
Owner: Neutral
Actor67: v19
Location: 30,42
Owner: Neutral
Actor68: v19
Location: 29,42
Owner: Neutral
Humvee1: jeep
Location: 28,21
Owner: GDI
Facing: 512
Actor73: jeep
Location: 35,30
Owner: GDI
Facing: 384
Actor74: jeep
Location: 32,36
Owner: GDI
Facing: 384
Humvee2: jeep
Location: 29,21
Owner: GDI
Facing: 512
Actor77: jeep
Location: 47,21
Owner: GDI
Facing: 640
Actor101: c1
Location: 16,36
Owner: Neutral
Facing: 768
SubCell: 4
Actor102: c3
Location: 17,40
Owner: Neutral
Facing: 896
SubCell: 2
Actor103: c5
Location: 16,40
Owner: Neutral
Facing: 896
SubCell: 1
Actor104: c6
Location: 14,36
Owner: Neutral
Health: 60
SubCell: 4
Actor105: c7
Location: 18,38
Owner: Neutral
Facing: 896
SubCell: 4
TechCenter: miss
Location: 14,17
Owner: GDI
McvEntry: waypoint
Location: 54,38
Owner: Neutral
McvDeploy: waypoint
Location: 52,36
Owner: Neutral
NodEntry: waypoint
Location: 54,40
Owner: Neutral
NodRallypoint: waypoint
Location: 50,42
Owner: Neutral
PlayerBase: waypoint
Location: 50,39
Owner: Neutral
WP9: waypoint
Location: 48,32
Owner: Neutral
WP8: waypoint
Location: 41,23
Owner: Neutral
WP7: waypoint
Location: 44,30
Owner: Neutral
WP6: waypoint
Location: 41,38
Owner: Neutral
WP5: waypoint
Location: 30,36
Owner: Neutral
WP4: waypoint
Location: 48,47
Owner: Neutral
WP3: waypoint
Location: 31,47
Owner: Neutral
WP2: waypoint
Location: 24,44
Owner: Neutral
WP1: waypoint
Location: 25,32
Owner: Neutral
WP0: waypoint
Location: 24,22
Owner: Neutral
CellTrigA: waypoint
Location: 43,28
Owner: Neutral
CellTrigB: waypoint
Location: 37,49
Owner: Neutral
GDIBarracksSpawn: waypoint
Location: 23,20
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,103 @@
--[[
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 = { "e1", "e1", "bggy", "bike", "e1", "e1", "bike", "bggy", "e1", "e1" }
Engineers = { "e6", "e6", "e6" }
FirstAttackWaveUnits = { "e1", "e1", "e2" }
SecondAttackWaveUnits = { "e1", "e1", "e1" }
ThirdAttackWaveUnits = { "e1", "e1", "e1", "e2" }
GDIBase = { Base1, Base2, Base3, Base4, Base5, Base6, Base7 }
Humvees = { Humvee1, Humvee2 }
HumveeFootprint = { CPos.New(22,26), CPos.New(23,26), CPos.New(24,26), CPos.New(34,25), CPos.New(35,25) }
SendAttackWave = function(units, action)
Reinforcements.Reinforce(GDI, units, { GDIBarracksSpawn.Location, WP0.Location, WP1.Location }, 15, action)
end
FirstAttackWave = function(soldier)
soldier.AttackMove(WP2.Location)
soldier.AttackMove(WP3.Location)
soldier.AttackMove(WP4.Location)
soldier.AttackMove(PlayerBase.Location)
end
SecondAttackWave = function(soldier)
soldier.AttackMove(WP5.Location)
soldier.AttackMove(WP6.Location)
soldier.AttackMove(WP7.Location)
soldier.AttackMove(WP9.Location)
soldier.AttackMove(PlayerBase.Location)
end
WorldLoaded = function()
Nod = Player.GetPlayer("Nod")
GDI = Player.GetPlayer("GDI")
InitObjectives(Nod)
CapturePrison = AddPrimaryObjective(Nod, "capture-prison")
DestroyGDI = AddSecondaryObjective(Nod, "destroy-gdi-forces")
Trigger.OnKilled(TechCenter, function()
Nod.MarkFailedObjective(CapturePrison)
end)
Trigger.OnCapture(TechCenter, function()
Trigger.AfterDelay(DateTime.Seconds(2), function()
Nod.MarkCompletedObjective(CapturePrison)
end)
end)
Media.PlaySpeechNotification(Nod, "Reinforce")
Reinforcements.Reinforce(Nod, { "mcv" }, { McvEntry.Location, McvDeploy.Location })
Reinforcements.Reinforce(Nod, NodUnits, { NodEntry.Location, NodRallypoint.Location })
Trigger.AfterDelay(DateTime.Seconds(15), function()
Media.PlaySpeechNotification(Nod, "Reinforce")
Reinforcements.Reinforce(Nod, Engineers, { McvEntry.Location, PlayerBase.Location })
end)
Trigger.AfterDelay(DateTime.Seconds(40), function() SendAttackWave(FirstAttackWaveUnits, FirstAttackWave) end)
Trigger.AfterDelay(DateTime.Seconds(80), function() SendAttackWave(SecondAttackWaveUnits, SecondAttackWave) end)
Trigger.AfterDelay(DateTime.Seconds(140), function() SendAttackWave(ThirdAttackWaveUnits, FirstAttackWave) end)
local humveeTriggered
Trigger.OnEnteredFootprint(HumveeFootprint, function(actor, id)
if actor.Owner == Nod and not humveeTriggered then
Trigger.RemoveFootprintTrigger(id)
humveeTriggered = true
Utils.Do(Humvees, function(a)
if not a.IsDead then
IdleHunt(a)
end
end)
end
end)
Trigger.OnAnyKilled(GDIBase, function()
if not BaseAttacked then
BaseAttacked = true
Utils.Do(GDI.GetGroundAttackers(), function(unit)
IdleHunt(unit)
end)
end
end)
end
Tick = function()
if DateTime.GameTime > 2 then
if Nod.HasNoRequiredUnits() then
Nod.MarkFailedObjective(CapturePrison)
end
if GDI.HasNoRequiredUnits() then
Nod.MarkCompletedObjective(DestroyGDI)
end
end
end

View File

@@ -0,0 +1,101 @@
World:
LuaScript:
Scripts: campaign.lua, utils.lua, nod03b.lua
MusicPlaylist:
StartingMusic: chrg226m
VictoryMusic: nod_win1
MissionData:
Briefing: briefing
BriefingVideo: nod3.vqa
StartVideo: dessweep.vqa
WinVideo: desflees.vqa
LossVideo: flag.vqa
Player:
PlayerResources:
DefaultCash: 4000
HQ:
AirstrikePower:
Prerequisites: ~disabled
Buildable:
Description: actor-hq-description
CYCL:
Buildable:
Prerequisites: ~disabled
NUK2:
Buildable:
Prerequisites: ~disabled
AFLD:
Buildable:
Prerequisites: ~disabled
HPAD:
Buildable:
Prerequisites: ~disabled
FIX:
Buildable:
Prerequisites: ~disabled
TMPL:
Buildable:
Prerequisites: ~disabled
GUN:
Buildable:
Prerequisites: ~disabled
SAM:
Buildable:
Prerequisites: ~disabled
OBLI:
Buildable:
Prerequisites: ~disabled
GTWR:
Buildable:
Prerequisites: ~disabled
SBAG:
Buildable:
Prerequisites: ~disabled
BRIK:
Buildable:
Prerequisites: ~disabled
WEAP:
Buildable:
Prerequisites: ~disabled
EYE:
Buildable:
Prerequisites: ~disabled
ATWR:
Buildable:
Prerequisites: ~disabled
E4:
Buildable:
Prerequisites: ~disabled
E5:
Buildable:
Prerequisites: ~disabled
RMBO:
Buildable:
Prerequisites: ~disabled
MISS:
Tooltip:
Name: actor-prison-name
CaptureManager:
Capturable:
Types: building