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

View File

@@ -0,0 +1,142 @@
--[[
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.
]]
AutoTrigger = { CPos.New(51, 47), CPos.New(52, 47), CPos.New(53, 47), CPos.New(54, 47) }
GDIHeliTrigger = { CPos.New(27, 55), CPos.New(27, 56), CPos.New(28, 56), CPos.New(28, 57), CPos.New(28, 58), CPos.New(28, 59)}
NodUnits = { "e1", "e1", "e3", "e3" }
AutoUnits = { "e1", "e1", "e3" }
KillsUntilReinforcements = 12
HeliDelay = { 83, 137, 211 }
GDIReinforcements = { "e2", "e2", "e2", "e2", "e2" }
GDIReinforcementsWaypoints = { GDIReinforcementsEntry.Location, GDIReinforcementsWP1.Location }
GDIReinforcementsLeft = 3
NodHelis =
{
{ delay = DateTime.Seconds(HeliDelay[1]), entry = { NodHeliEntry.Location, NodHeliLZ1.Location }, types = { "e1", "e1", "e3" } },
{ delay = DateTime.Seconds(HeliDelay[2]), entry = { NodHeliEntry.Location, NodHeliLZ2.Location }, types = { "e1", "e1", "e1", "e1" } },
{ delay = DateTime.Seconds(HeliDelay[3]), entry = { NodHeliEntry.Location, NodHeliLZ3.Location }, types = { "e1", "e1", "e3" } }
}
Kills = 0
NodUnitKilled = function()
Kills = Kills + 1
if Kills == KillsUntilReinforcements then
GDI.MarkCompletedObjective(ReinforcementsObjective)
SendGDIReinforcements()
end
end
SendHeli = function(heli)
local units = Reinforcements.ReinforceWithTransport(Nod, "tran", heli.types, heli.entry, { heli.entry[1] })
Utils.Do(units[2], function(actor)
IdleHunt(actor)
Trigger.OnKilled(actor, NodUnitKilled)
end)
Trigger.AfterDelay(heli.delay, function() SendHeli(heli) end)
end
SendGDIReinforcements = function()
Media.PlaySpeechNotification(GDI, "Reinforce")
Reinforcements.ReinforceWithTransport(GDI, "apc", GDIReinforcements, GDIReinforcementsWaypoints, nil, function(apc, team)
table.insert(team, apc)
Trigger.OnAllKilled(team, function()
if GDIReinforcementsLeft > 0 then
GDIReinforcementsLeft = GDIReinforcementsLeft - 1
Trigger.AfterDelay(DateTime.Seconds(5), function()
Media.DisplayMessage(UserInterface.GetFluentMessage("apcs-left", { ["apcs"] = GDIReinforcementsLeft }), UserInterface.GetFluentMessage("battlefield-control"))
SendGDIReinforcements()
end)
end
end)
end)
end
BuildNod = function()
local after = function(team)
Utils.Do(team, function(actor)
Trigger.OnIdle(actor, actor.Hunt)
Trigger.OnKilled(actor, NodUnitKilled)
end)
Trigger.OnAllKilled(team, BuildNod)
end
ProduceUnits(Nod, HandOfNod, nil, function() return NodUnits end, after)
end
BuildAuto = function()
local after = function(team)
Utils.Do(team, function(actor)
Trigger.OnIdle(actor, actor.Hunt)
Trigger.OnKilled(actor, NodUnitKilled)
end)
end
local delay = function() return DateTime.Seconds(5) end
ProduceUnits(Nod, HandOfNod, delay, function() return AutoUnits end, after)
end
Tick = function()
Nod.Cash = 1000
if (GDIReinforcementsLeft == 0 or not GDI.IsObjectiveCompleted(ReinforcementsObjective)) and GDI.HasNoRequiredUnits() then
GDI.MarkFailedObjective(GDIObjective)
end
end
SetupWorld = function()
Utils.Do(Nod.GetGroundAttackers(), function(unit)
Trigger.OnKilled(unit, NodUnitKilled)
end)
Hunter1.Hunt()
Hunter2.Hunt()
Trigger.OnRemovedFromWorld(crate, function() GDI.MarkCompletedObjective(GDIObjective) end)
end
WorldLoaded = function()
GDI = Player.GetPlayer("GDI")
Nod = Player.GetPlayer("Nod")
SetupWorld()
InitObjectives(GDI)
GDIObjective = AddPrimaryObjective(GDI, "retrieve-rods")
local eliminateReinforcements = UserInterface.GetFluentMessage("eliminate-reinforcements", { ["kills"] = KillsUntilReinforcements })
ReinforcementsObjective = AddSecondaryObjective(GDI, eliminateReinforcements)
BuildNod()
Utils.Do(NodHelis, function(heli)
Trigger.AfterDelay(heli.delay, function() SendHeli(heli) end)
end)
Trigger.OnEnteredFootprint(AutoTrigger, function(a, id)
if not AutoTriggered and a.Owner == GDI then
AutoTriggered = true
Trigger.RemoveFootprintTrigger(id)
BuildAuto()
end
end)
Trigger.OnEnteredFootprint(GDIHeliTrigger, function(a, id)
if not GDIHeliTriggered and a.Owner == GDI then
GDIHeliTriggered = true
Trigger.RemoveFootprintTrigger(id)
Reinforcements.ReinforceWithTransport(GDI, "tran", nil, { GDIHeliEntry.Location, GDIHeliLZ.Location })
end
end)
Camera.Position = Actor56.CenterPosition
end

Binary file not shown.

View File

@@ -0,0 +1,9 @@
## rules.yaml
briefing =
Nod has captured classified GDI property.
You must find and retrieve the stolen equipment.
It is being transported in a shipping crate.
Use the new APC to safely transport infantry through Nod forces.

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

View File

@@ -0,0 +1,455 @@
MapFormat: 12
RequiresMod: cnc
Title: 04a: Get the Rods back
Author: Westwood Studios
Tileset: TEMPERAT
MapSize: 64,64
Bounds: 7,24,51,36
Visibility: MissionSelector
Categories: Campaign
LockPreview: True
Players:
PlayerReference@Nod:
Name: Nod
Faction: nod
Color: FE1100
Allies: Nod
Enemies: GDI
Bot: campaign
PlayerReference@GDI:
Name: GDI
Playable: True
AllowBots: False
Required: True
LockFaction: True
Faction: gdi
LockColor: True
Color: F5D378
LockSpawn: True
LockTeam: True
Allies: GDI
Enemies: Nod
PlayerReference@Neutral:
Name: Neutral
OwnsWorld: True
NonCombatant: True
Faction: gdi
Actors:
Actor0: cycl
Location: 26,59
Owner: Neutral
Actor1: cycl
Location: 25,59
Owner: Neutral
Actor2: cycl
Location: 24,59
Owner: Neutral
Actor3: cycl
Location: 26,58
Owner: Neutral
Actor4: cycl
Location: 24,58
Owner: Neutral
Actor5: t11
Location: 37,43
Owner: Neutral
Actor6: t11
Location: 24,43
Owner: Neutral
Actor7: t08
Location: 46,26
Owner: Neutral
Actor9: t17
Location: 42,24
Owner: Neutral
Actor10: tc02
Location: 50,28
Owner: Neutral
Actor12: tc01
Location: 17,48
Owner: Neutral
Actor13: tc04
Location: 14,47
Owner: Neutral
Actor14: tc02
Location: 15,56
Owner: Neutral
Actor15: tc03
Location: 13,56
Owner: Neutral
Actor16: tc05
Location: 32,24
Owner: Neutral
Actor17: tc05
Location: 16,46
Owner: Neutral
Actor18: tc05
Location: 12,36
Owner: Neutral
Actor19: tc04
Location: 15,41
Owner: Neutral
Actor20: tc04
Location: 24,41
Owner: Neutral
Actor21: tc04
Location: 33,39
Owner: Neutral
Actor22: tc04
Location: 44,34
Owner: Neutral
Actor23: tc04
Location: 36,24
Owner: Neutral
Actor24: tc04
Location: 23,35
Owner: Neutral
Actor25: tc03
Location: 47,35
Owner: Neutral
Actor26: tc02
Location: 49,35
Owner: Neutral
Actor27: tc04
Location: 40,25
Owner: Neutral
Actor28: tc01
Location: 37,25
Owner: Neutral
Actor29: t01
Location: 11,29
Owner: Neutral
Actor30: t08
Location: 14,27
Owner: Neutral
Actor31: t08
Location: 22,35
Owner: Neutral
Actor32: t07
Location: 25,34
Owner: Neutral
Actor33: t07
Location: 21,27
Owner: Neutral
Actor34: t08
Location: 27,31
Owner: Neutral
Actor35: t06
Location: 26,31
Owner: Neutral
Actor36: t06
Location: 23,24
Owner: Neutral
Actor38: t07
Location: 12,35
Owner: Neutral
Actor39: t05
Location: 13,42
Owner: Neutral
Actor40: tc01
Location: 14,57
Owner: Neutral
Actor41: t11
Location: 14,34
Owner: Neutral
Actor42: t01
Location: 36,39
Owner: Neutral
Actor43: t08
Location: 34,45
Owner: Neutral
Actor44: t07
Location: 33,44
Owner: Neutral
Actor45: t06
Location: 32,44
Owner: Neutral
Actor46: tc03
Location: 7,25
Owner: Neutral
Actor47: t11
Location: 11,24
Owner: Neutral
Actor48: tc02
Location: 35,38
Owner: Neutral
Actor49: tc03
Location: 33,38
Owner: Neutral
Actor50: hq
Location: 29,57
Owner: Nod
Actor51: nuke
Location: 28,54
Owner: Nod
Actor54: bggy
Location: 55,53
Owner: Nod
Facing: 128
Actor55: bggy
Location: 38,43
Owner: Nod
Facing: 256
Actor56: jeep
Location: 13,53
Owner: GDI
Actor58: bggy
Location: 31,57
Owner: Nod
Facing: 128
Actor59: apc
Location: 14,53
Owner: GDI
Actor60: apc
Location: 12,53
Owner: GDI
Actor61: bggy
Location: 26,27
Owner: Nod
Facing: 640
Actor62: bggy
Location: 51,27
Owner: Nod
Facing: 640
Actor63: ltnk
Location: 44,53
Owner: Nod
Facing: 768
Actor64: e3
Location: 45,36
Owner: Nod
SubCell: 1
Actor65: e3
Location: 40,25
Owner: Nod
SubCell: 0
Actor66: e3
Location: 36,41
Owner: Nod
Facing: 640
SubCell: 0
Actor67: e3
Location: 39,42
Owner: Nod
Facing: 640
SubCell: 3
Actor68: e3
Location: 12,24
Owner: Nod
Facing: 384
SubCell: 4
Actor69: e3
Location: 37,43
Owner: Nod
Facing: 768
SubCell: 4
Actor70: e2
Location: 14,54
Owner: GDI
SubCell: 3
Actor710: e1
Location: 12,54
Owner: GDI
SubCell: 5
Actor71: e1
Location: 12,54
Owner: GDI
SubCell: 1
Actor72: e1
Location: 12,54
Owner: GDI
SubCell: 3
Actor73: e1
Location: 15,41
Owner: Nod
Facing: 384
SubCell: 4
Actor74: e1
Location: 24,35
Owner: Nod
Facing: 896
SubCell: 4
Actor75: e1
Location: 36,29
Owner: Nod
Facing: 768
SubCell: 1
Actor76: e1
Location: 28,27
Owner: Nod
Facing: 512
SubCell: 4
Actor77: e1
Location: 32,30
Owner: Nod
Facing: 896
SubCell: 0
Actor78: e1
Location: 33,44
Owner: Nod
Facing: 768
SubCell: 4
Actor79: e1
Location: 45,36
Owner: Nod
Facing: 640
SubCell: 2
Actor80: e3
Location: 52,44
Owner: Nod
SubCell: 2
Actor81: e3
Location: 52,43
Owner: Nod
SubCell: 0
Actor82: e3
Location: 52,44
Owner: Nod
SubCell: 1
Actor83: e1
Location: 13,27
Owner: Nod
Facing: 512
SubCell: 2
Actor84: e1
Location: 13,36
Owner: Nod
Facing: 256
SubCell: 3
Actor85: e1
Location: 11,29
Owner: Nod
Facing: 256
SubCell: 4
Actor860: e2
Location: 14,54
Owner: GDI
SubCell: 5
Actor86: e2
Location: 14,54
Owner: GDI
SubCell: 2
Actor87: e2
Location: 14,54
Owner: GDI
SubCell: 1
Actor88: e2
Location: 14,54
Owner: GDI
SubCell: 4
Actor89: e1
Location: 12,54
Owner: GDI
SubCell: 2
Actor90: e1
Location: 12,54
Owner: GDI
SubCell: 4
Actor91: e3
Location: 55,41
Owner: Nod
Facing: 768
SubCell: 2
Actor92: e3
Location: 48,42
Owner: Nod
Facing: 256
SubCell: 2
Actor93: e1
Location: 50,26
Owner: Nod
Facing: 768
SubCell: 4
Actor94: e1
Location: 50,28
Owner: Nod
Facing: 768
SubCell: 0
Actor95: e1
Location: 52,26
Owner: Nod
Facing: 256
SubCell: 3
Actor96: e1
Location: 25,43
Owner: Nod
Facing: 128
SubCell: 4
Actor97: e1
Location: 25,26
Owner: Nod
Facing: 640
SubCell: 1
Actor98: e1
Location: 30,30
Owner: Nod
SubCell: 4
Actor99: e3
Location: 21,50
Owner: Nod
Facing: 768
SubCell: 1
Actor100: e3
Location: 25,53
Owner: Nod
Facing: 768
SubCell: 3
Actor101: moneycrate
Location: 56,23
Owner: Neutral
HandOfNod: hand
Location: 30,53
Owner: Nod
Hunter1: bggy
Location: 35,43
Owner: Nod
Facing: 768
Hunter2: bggy
Location: 32,43
Owner: Nod
Facing: 768
crate: CRATE.plain
Location: 25,58
Owner: Neutral
NodHeliEntry: waypoint
Location: 41,24
Owner: Neutral
NodHeliLZ1: waypoint
Location: 31,39
Owner: Neutral
NodHeliLZ2: waypoint
Location: 17,28
Owner: Neutral
NodHeliLZ3: waypoint
Location: 53,32
Owner: Neutral
GDIReinforcementsEntry: waypoint
Location: 7,50
Owner: Neutral
GDIReinforcementsWP1: waypoint
Location: 11,52
Owner: Neutral
GDIReinforcementsWP2: waypoint
Location: 11,51
Owner: Neutral
GDIHeliEntry: waypoint
Location: 34,59
Owner: Neutral
GDIHeliLZ: waypoint
Location: 27,58
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,16 @@
World:
LuaScript:
Scripts: campaign.lua, utils.lua, gdi04a.lua
MusicPlaylist:
StartingMusic: fist226m
MissionData:
Briefing: briefing
BackgroundVideo: bkground.vqa
BriefingVideo: gdi4b.vqa
StartVideo: nitejump.vqa
WinVideo: burdet1.vqa
LossVideo: gameover.vqa
Player:
PlayerResources:
DefaultCash: 0