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 imported a Nuclear Detonator in an attempt to sway a few local political leaders. Infiltrate the base and steal the detonator. A chopper will be sent to meet you at a designated landing zone. Look for the landing flare once you have stolen the device.

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

View File

@@ -0,0 +1,470 @@
MapFormat: 12
RequiresMod: cnc
Title: 06c: Steal the Detonator
Author: Westwood Studios
Tileset: DESERT
MapSize: 64,64
Bounds: 15,16,44,42
Visibility: MissionSelector
Categories: Campaign
LockPreview: True
Players:
PlayerReference@GDI:
Name: GDI
Playable: False
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
Bot: campaign
Actors:
Actor0: brik
Location: 31,33
Owner: Neutral
Actor1: brik
Location: 30,33
Owner: Neutral
Actor2: brik
Location: 29,33
Owner: Neutral
Actor3: brik
Location: 28,33
Owner: Neutral
Actor4: brik
Location: 27,33
Owner: Neutral
Actor5: brik
Location: 26,33
Owner: Neutral
Actor6: brik
Location: 25,33
Owner: Neutral
Actor7: brik
Location: 21,33
Owner: Neutral
Actor8: brik
Location: 20,33
Owner: Neutral
Actor9: brik
Location: 19,33
Owner: Neutral
Actor10: brik
Location: 18,33
Owner: Neutral
Actor11: brik
Location: 17,33
Owner: Neutral
Actor12: brik
Location: 31,32
Owner: Neutral
Actor13: brik
Location: 26,32
Owner: Neutral
Actor14: brik
Location: 25,32
Owner: Neutral
Actor15: brik
Location: 21,32
Owner: Neutral
Actor16: brik
Location: 20,32
Owner: Neutral
Actor17: brik
Location: 17,32
Owner: Neutral
Actor18: brik
Location: 31,31
Owner: Neutral
Actor19: brik
Location: 18,31
Owner: Neutral
Actor20: brik
Location: 17,31
Owner: Neutral
Actor21: brik
Location: 31,30
Owner: Neutral
Actor22: brik
Location: 30,30
Owner: Neutral
Actor23: brik
Location: 18,30
Owner: Neutral
Actor24: brik
Location: 17,30
Owner: Neutral
Actor25: brik
Location: 31,29
Owner: Neutral
Actor26: brik
Location: 30,29
Owner: Neutral
Actor27: brik
Location: 31,24
Owner: Neutral
Actor28: brik
Location: 30,24
Owner: Neutral
Actor29: brik
Location: 31,23
Owner: Neutral
Actor30: brik
Location: 30,23
Owner: Neutral
Actor31: cycl
Location: 25,23
Owner: Neutral
Actor32: cycl
Location: 23,23
Owner: Neutral
Actor33: brik
Location: 31,22
Owner: Neutral
Actor34: cycl
Location: 25,22
Owner: Neutral
Actor35: cycl
Location: 23,22
Owner: Neutral
Actor36: brik
Location: 31,21
Owner: Neutral
Actor37: brik
Location: 30,21
Owner: Neutral
Actor38: cycl
Location: 25,21
Owner: Neutral
Actor39: cycl
Location: 24,21
Owner: Neutral
Actor40: cycl
Location: 23,21
Owner: Neutral
Actor41: brik
Location: 31,20
Owner: Neutral
Actor42: brik
Location: 30,20
Owner: Neutral
Actor43: t18
Location: 19,56
Owner: Neutral
Actor44: t08
Location: 33,29
Owner: Neutral
Actor45: t08
Location: 32,23
Owner: Neutral
Actor46: t18
Location: 31,30
Owner: Neutral
Actor47: t18
Location: 29,33
Owner: Neutral
Actor48: t18
Location: 18,20
Owner: Neutral
Actor49: t18
Location: 50,44
Owner: Neutral
Actor50: t18
Location: 34,36
Owner: Neutral
Actor51: rock5
Location: 35,42
Owner: Neutral
Actor52: rock4
Location: 46,41
Owner: Neutral
Actor53: rock6
Location: 38,34
Owner: Neutral
Actor54: t08
Location: 47,52
Owner: Neutral
Actor55: t08
Location: 34,46
Owner: Neutral
Actor56: t08
Location: 46,35
Owner: Neutral
Actor57: t18
Location: 19,51
Owner: Neutral
Actor59: proc
Location: 22,29
Owner: GDI
Actor60: v30
Location: 29,39
Owner: GDI
Actor61: v35
Location: 24,39
Owner: GDI
Actor62: v34
Location: 24,40
Owner: GDI
Actor63: v36
Location: 28,40
Owner: GDI
Actor64: v23
Location: 28,39
Owner: GDI
Actor65: gtwr
Location: 32,29
Owner: GDI
Actor66: nuke
Location: 20,29
Owner: GDI
Actor67: nuke
Location: 21,27
Owner: GDI
Actor68: hq
Location: 28,20
Owner: GDI
Actor69: gtwr
Location: 32,24
Owner: GDI
Actor72: jeep
Location: 37,40
Owner: GDI
Facing: 384
Actor73: jeep
Location: 47,18
Owner: GDI
Facing: 640
Actor74: mtnk
Location: 17,39
Owner: GDI
Actor75: mtnk
Location: 16,39
Owner: GDI
Actor76: mtnk
Location: 15,39
Owner: GDI
Actor83: mtnk
Location: 39,27
Owner: GDI
Facing: 384
Actor85: jeep
Location: 29,30
Owner: GDI
Facing: 896
Actor86: e3
Location: 35,36
Owner: GDI
SubCell: 0
Actor87: e1
Location: 35,36
Owner: GDI
SubCell: 4
Actor88: e1
Location: 35,36
Owner: GDI
SubCell: 3
Actor89: e1
Location: 49,22
Owner: GDI
Facing: 512
SubCell: 1
Actor92: e2
Location: 16,25
Owner: GDI
SubCell: 3
Actor93: e2
Location: 15,26
Owner: GDI
SubCell: 2
Actor96: e3
Location: 36,25
Owner: GDI
Facing: 384
SubCell: 2
Actor99: e1
Location: 30,26
Owner: GDI
Facing: 384
SubCell: 4
Actor100: e1
Location: 48,21
Owner: GDI
Facing: 640
SubCell: 4
Actor101: e3
Location: 51,42
Owner: GDI
Facing: 512
SubCell: 2
Actor102: e3
Location: 52,42
Owner: GDI
Facing: 512
SubCell: 2
Actor103: e1
Location: 40,30
Owner: GDI
Facing: 384
SubCell: 2
Actor104: e2
Location: 47,35
Owner: GDI
SubCell: 1
Actor105: e2
Location: 35,46
Owner: GDI
Facing: 512
SubCell: 1
Actor114: e2
Location: 43,29
Owner: GDI
SubCell: 4
Actor118: e3
Location: 41,29
Owner: GDI
SubCell: 0
Actor119: e2
Location: 27,31
Owner: GDI
SubCell: 1
Actor120: e2
Location: 23,24
Owner: GDI
Facing: 512
SubCell: 4
Actor121: e2
Location: 25,24
Owner: GDI
Facing: 512
SubCell: 3
Actor122: e2
Location: 27,31
Owner: GDI
SubCell: 2
waypoint27: waypoint
Location: 17,50
Owner: Neutral
waypoint26: waypoint
Location: 46,46
Owner: Neutral
waypoint25: waypoint
Location: 17,49
Owner: Neutral
waypoint10: waypoint
Location: 16,50
Owner: Neutral
waypoint7: waypoint
Location: 31,26
Owner: Neutral
waypoint6: waypoint
Location: 37,25
Owner: Neutral
waypoint5: waypoint
Location: 42,42
Owner: Neutral
waypoint4: waypoint
Location: 42,56
Owner: Neutral
waypoint3: waypoint
Location: 55,56
Owner: Neutral
waypoint2: waypoint
Location: 55,44
Owner: Neutral
waypoint1: waypoint
Location: 55,32
Owner: Neutral
waypoint0: waypoint
Location: 43,32
Owner: Neutral
UnitsEntryLeft: waypoint
Location: 56,57
Owner: Neutral
UnitsRallyLeft: waypoint
Location: 53,51
Owner: Neutral
UnitsEntryMiddle: waypoint
Location: 57,57
Owner: Neutral
UnitsRallyMiddle: waypoint
Location: 55,50
Owner: Neutral
UnitsEntryRight: waypoint
Location: 58,57
Owner: Neutral
UnitsRallyRight: waypoint
Location: 57,51
Owner: Neutral
ChnEntry: waypoint
Location: 41,57
Owner: Neutral
Atk2Actor1: e2
Location: 44,29
Owner: GDI
SubCell: 3
Atk2Actor2: e1
Location: 42,29
Owner: GDI
Facing: 384
SubCell: 2
Atk2Actor3: e3
Location: 41,29
Owner: GDI
SubCell: 2
Atk2Actor4: e1
Location: 40,30
Owner: GDI
Facing: 384
SubCell: 1
Atk2Actor5: e1
Location: 43,29
Owner: GDI
Facing: 384
SubCell: 1
Atk2Actor6: mtnk
Location: 42,30
Owner: GDI
Facing: 384
Detonator: CRATE.plain
Location: 24, 22
Owner: GDI
Factory: weap
Location: 20,24
Owner: GDI
Barracks: pyle
Location: 26,20
Owner: GDI
Yard: fact
Location: 20,21
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,139 @@
--[[
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.
]]
NodStartUnitsVehicle = { 'bggy', 'bggy', 'ltnk', 'ltnk', 'ltnk', 'bike', 'bike'}
NodStartUnitsRight = { 'e1', 'e1', 'e1', 'e1' }
NodStartUnitsMiddle = { 'e6', 'e6', 'e6', 'e6', 'e3', 'e3' }
NodStartUnitsLeft = { 'e4', 'e4', 'e4', 'e4' }
Win1CellTriggerActivator = { CPos.New(24,22) }
Win2CellTriggerActivator = { CPos.New(20,55), CPos.New(19,55), CPos.New(20,54), CPos.New(19,54), CPos.New(20,53), CPos.New(19,53), CPos.New(20,52), CPos.New(19,52) }
DzneCellTriggerActivator = { CPos.New(26,24), CPos.New(25,24), CPos.New(24,24), CPos.New(23,24), CPos.New(22,24), CPos.New(26,23), CPos.New(25,23), CPos.New(24,23), CPos.New(23,23), CPos.New(22,23), CPos.New(26,22), CPos.New(25,22), CPos.New(23,22), CPos.New(22,22), CPos.New(25,21), CPos.New(24,21), CPos.New(23,21), CPos.New(22,21), CPos.New(25,20), CPos.New(24,20), CPos.New(23,20), CPos.New(22,20) }
ChinCellTriggerActivator = { CPos.New(31,49), CPos.New(30,49), CPos.New(29,49), CPos.New(28,49), CPos.New(27,49), CPos.New(26,49), CPos.New(25,49), CPos.New(24,49), CPos.New(23,49), CPos.New(22,49), CPos.New(21,49), CPos.New(20,49), CPos.New(31,48), CPos.New(30,48), CPos.New(29,48), CPos.New(28,48), CPos.New(27,48), CPos.New(26,48), CPos.New(25,48), CPos.New(24,48), CPos.New(23,48), CPos.New(22,48), CPos.New(21,48), CPos.New(20,48), CPos.New(31,47), CPos.New(30,47), CPos.New(29,47), CPos.New(28,47), CPos.New(27,47), CPos.New(26,47), CPos.New(25,47), CPos.New(24,47), CPos.New(23,47), CPos.New(22,47), CPos.New(21,47), CPos.New(20,47) }
Atk2ActorTriggerActivator = { Atk2Actor1, Atk2Actor2, Atk2Actor3, Atk2Actor4, Atk2Actor5, Atk2Actor6 }
BuildingsToCapture = { Barracks, Factory, Yard }
Gdi1Units = { 'e1', 'e1', 'e1', 'e2', 'e2' }
Gdi2Units = { 'e1', 'e1', 'e3', 'e3', 'e3' }
Gdi3Units = { 'jeep', 'jeep', 'e3', 'e3' }
Gdi4Units = { 'mtnk', 'e2', 'e2', 'e2', 'e2' }
Gdi5Units = { 'e1', 'e2', 'e2', 'e3', 'e3' }
AllUnits = { Gdi1Units, Gdi2Units, Gdi3Units, Gdi4Units, Gdi5Units }
Grd1Waypoints = { waypoint0, waypoint1, waypoint2, waypoint3, waypoint4, waypoint5 }
ProductionDelay = DateTime.Minutes(5)
ProdTriggerFunction = function()
local units = AllUnits[DateTime.GameTime % #AllUnits + 1]
Utils.Do(units, function(unitType)
if (unitType == 'jeep' or unitType == 'mtnk') and not Factory.IsDead and Factory.Owner == GDI then
Factory.Build({ unitType })
elseif (unitType == 'e1' or unitType == 'e2' or unitType == 'e3') and not Barracks.IsDead and Barracks.Owner == GDI then
Barracks.Build({ unitType })
end
end)
Utils.Do(Utils.Take(5, GDI.GetGroundAttackers()), IdleHunt)
Trigger.AfterDelay(ProductionDelay, ProdTriggerFunction)
end
InsertNodUnits = function()
Camera.Position = UnitsRallyRight.CenterPosition
Media.PlaySpeechNotification(Nod, "Reinforce")
Reinforcements.Reinforce(Nod, NodStartUnitsVehicle, { UnitsEntryMiddle.Location, UnitsRallyMiddle.Location }, 30)
Reinforcements.Reinforce(Nod, NodStartUnitsMiddle, { UnitsEntryMiddle.Location, UnitsRallyMiddle.Location }, 15)
Reinforcements.Reinforce(Nod, NodStartUnitsLeft, { UnitsEntryLeft.Location, UnitsRallyLeft.Location }, 15)
Reinforcements.Reinforce(Nod, NodStartUnitsRight, { UnitsEntryRight.Location, UnitsRallyRight.Location }, 15)
end
WorldLoaded = function()
Nod = Player.GetPlayer("Nod")
GDI = Player.GetPlayer("GDI")
InitObjectives(Nod)
NodObjective1 = AddPrimaryObjective(Nod, "steal-nuclear-detonator")
CaptureObjective = AddSecondaryObjective(Nod, "capture-barracks-factory-conyard")
InsertNodUnits()
Trigger.AfterDelay(DateTime.Seconds(3), function()
for type, count in pairs({ ['e1'] = 2, ['e2'] = 3 }) do
MoveAndHunt(Utils.Take(count, GDI.GetActorsByType(type)), Grd1Waypoints)
end
end)
Trigger.OnAllKilled(Atk2ActorTriggerActivator, function()
for type, count in pairs({ ['e1'] = 2, ['e2'] = 3 , ['jeep'] = 1}) do
Utils.Do(Utils.Take(count, GDI.GetActorsByType(type)), IdleHunt)
end
end)
Trigger.OnEnteredFootprint(ChinCellTriggerActivator, function(a, id)
if a.Owner == Nod then
Media.PlaySpeechNotification(Nod, "Reinforce")
Reinforcements.ReinforceWithTransport(Nod, 'tran', nil, { ChnEntry.Location, waypoint10.Location }, nil, nil, nil)
Trigger.RemoveFootprintTrigger(id)
end
end)
Trigger.OnEnteredFootprint(DzneCellTriggerActivator, function(a, id)
if a.Owner == Nod then
Actor.Create('flare', true, { Owner = Nod, Location = waypoint10.Location })
Trigger.RemoveFootprintTrigger(id)
end
end)
Trigger.OnEnteredFootprint(Win1CellTriggerActivator, function(a, id)
if a.Owner == Nod then
EvacuateObjective = AddPrimaryObjective(Nod, "move-to-evacuation-point")
Nod.MarkCompletedObjective(NodObjective1)
Trigger.RemoveFootprintTrigger(id)
end
end)
Trigger.OnEnteredFootprint(Win2CellTriggerActivator, function(a, id)
if a.Owner == Nod and EvacuateObjective then
Nod.MarkCompletedObjective(EvacuateObjective)
Trigger.RemoveFootprintTrigger(id)
end
end)
Trigger.AfterDelay(ProductionDelay, ProdTriggerFunction)
Trigger.OnAnyKilled(BuildingsToCapture, function()
if not Nod.IsObjectiveCompleted(CaptureObjective) then
Nod.MarkFailedObjective(CaptureObjective)
end
end)
local captured = 0
Utils.Do(BuildingsToCapture, function(building)
Trigger.OnCapture(building, function()
captured = captured + 1
if captured == 3 then
Nod.MarkCompletedObjective(CaptureObjective)
end
end)
end)
end
Tick = function()
if DateTime.GameTime > 2 and Nod.HasNoRequiredUnits() then
Nod.MarkFailedObjective(StealDetonator)
if EvacuateObjective then
Nod.MarkFailedObjective(EvacuateObjective)
end
end
end

View File

@@ -0,0 +1,150 @@
World:
LuaScript:
Scripts: campaign.lua, utils.lua, nod06c.lua
MusicPlaylist:
StartingMusic: rout
VictoryMusic: nod_win1
MissionData:
Briefing: briefing
BriefingVideo: nod6.vqa
StartVideo: sundial.vqa
LossVideo: banner.vqa
SmudgeLayer@SCORCH:
InitialSmudges:
41,40: sc2,0
43,39: sc4,0
29,30: sc1,0
28,30: sc1,0
29,23: sc3,0
19,21: sc4,0
32,20: sc5,0
SmudgeLayer@CRATER:
InitialSmudges:
42,39: cr1,0
43,36: cr1,0
Player:
PlayerResources:
DefaultCash: 4000
^Bridge:
DamageMultiplier@INVULNERABLE:
Modifier: 0
E2:
Buildable:
Prerequisites: ~pyle
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
GTWR:
Buildable:
Prerequisites: ~disabled
ATWR:
Buildable:
Prerequisites: ~disabled
WEAP:
Buildable:
Prerequisites: ~disabled
EYE:
Buildable:
Prerequisites: ~disabled
E3:
Buildable:
Prerequisites: ~disabled
HARV:
Buildable:
Prerequisites: ~disabled
MTNK:
Buildable:
Prerequisites: ~disabled
HTNK:
Buildable:
Prerequisites: ~disabled
TRAN:
-Selectable:
Buildable:
Prerequisites: ~disabled
Interactable:
ORCA:
Buildable:
Prerequisites: ~disabled
MSAM:
Buildable:
Prerequisites: ~disabled
HELI:
Buildable:
Prerequisites: ~disabled
FLARE:
Tooltip:
ShowOwnerRow: false