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,191 @@
--[[
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.
]]
IslandSamSites = { SAM01, SAM02 }
NodBase = { PowerPlant1, PowerPlant2, PowerPlant3, PowerPlant4, PowerPlant5, Refinery, HandOfNod, Silo1, Silo2, Silo3, Silo4, ConYard, CommCenter }
FlameSquad = { FlameGuy1, FlameGuy2, FlameGuy3 }
FlameSquadRoute = { waypoint4.Location, waypoint12.Location, waypoint4.Location, waypoint6.Location }
FootPatrol1Squad = { MiniGunner1, MiniGunner2, RocketSoldier1 }
FootPatrol1Route =
{
waypoint4.Location,
waypoint12.Location,
waypoint13.Location,
waypoint3.Location,
waypoint2.Location,
waypoint7.Location,
waypoint6.Location
}
FootPatrol2Squad = { MiniGunner3, MiniGunner4 }
FootPatrol2Route =
{
waypoint14.Location,
waypoint16.Location
}
FootPatrol3Squad = { MiniGunner5, MiniGunner6 }
FootPatrol3Route =
{
waypoint15.Location,
waypoint17.Location
}
FootPatrol4Route =
{
waypoint4.Location,
waypoint5.Location
}
FootPatrol5Squad = { RocketSoldier2, RocketSoldier3, RocketSoldier4 }
FootPatrol5Route =
{
waypoint4.Location,
waypoint12.Location,
waypoint13.Location,
waypoint8.Location,
waypoint9.Location,
}
Buggy1Route =
{
waypoint6.Location,
waypoint7.Location,
waypoint2.Location,
waypoint8.Location,
waypoint9.Location,
waypoint8.Location,
waypoint2.Location,
waypoint7.Location
}
Buggy2Route =
{
waypoint6.Location,
waypoint10.Location,
waypoint11.Location,
waypoint10.Location
}
HuntTriggerActivator = { SAM03, SAM04, SAM05, SAM06, LightTank1, LightTank2, LightTank3, Buggy1, Buggy2, Turret1, Turret2 }
AttackCellTriggerActivator = { CPos.New(57,26), CPos.New(56,26), CPos.New(57,25), CPos.New(56,25), CPos.New(57,24), CPos.New(56,24), CPos.New(57,23), CPos.New(56,23), CPos.New(57,22), CPos.New(56,22), CPos.New(57,21), CPos.New(56,21) }
AttackUnits = { LightTank2, LightTank3 }
KillCounter = 0
WorldLoaded = function()
GDI = Player.GetPlayer("GDI")
Nod = Player.GetPlayer("Nod")
InitObjectives(GDI)
if Difficulty == "easy" then
CommandoType = "rmbo.easy"
KillCounterHuntThreshold = 30
elseif Difficulty == "hard" then
CommandoType = "rmbo.hard"
KillCounterHuntThreshold = 15
else
CommandoType = "rmbo"
KillCounterHuntThreshold = 20
end
DestroyObjective = AddPrimaryObjective(GDI, "destroy-nod-building")
Trigger.OnKilled(Airfield, function()
GDI.MarkCompletedObjective(DestroyObjective)
end)
Utils.Do(NodBase, function(structure)
Trigger.OnKilled(structure, function()
GDI.MarkCompletedObjective(DestroyObjective)
end)
end)
Trigger.OnAllKilled(IslandSamSites, function()
TransportFlare = Actor.Create('flare', true, { Owner = GDI, Location = Flare.Location })
Reinforcements.ReinforceWithTransport(GDI, 'tran', nil, { lstStart.Location, TransportRally.Location })
end)
Trigger.OnKilled(CivFleeTrigger, function()
if not Civilian.IsDead then
Civilian.Move(CivHideOut.Location)
end
end)
Trigger.OnKilled(AttackTrigger2, function()
Utils.Do(FlameSquad, function(unit)
if not unit.IsDead then
unit.Patrol(FlameSquadRoute, false)
end
end)
end)
Trigger.OnEnteredFootprint(AttackCellTriggerActivator, function(a, id)
if a.Owner == GDI then
Utils.Do(AttackUnits, function(unit)
if not unit.IsDead then
unit.AttackMove(waypoint10.Location)
end
end)
Trigger.RemoveFootprintTrigger(id)
end
end)
Utils.Do(HuntTriggerActivator, function(unit)
Trigger.OnDamaged(unit, function()
Utils.Do(Nod.GetGroundAttackers(), IdleHunt)
end)
end)
Trigger.AfterDelay(5, function()
Utils.Do(Nod.GetGroundAttackers(), function(unit)
Trigger.OnKilled(unit, function()
KillCounter = KillCounter + 1
if KillCounter >= KillCounterHuntThreshold then
Utils.Do(Nod.GetGroundAttackers(), IdleHunt)
end
end)
end)
end)
Utils.Do(FootPatrol1Squad, function(unit)
unit.Patrol(FootPatrol1Route, true)
end)
Utils.Do(FootPatrol2Squad, function(unit)
unit.Patrol(FootPatrol2Route, true, 50)
end)
Utils.Do(FootPatrol3Squad, function(unit)
unit.Patrol(FootPatrol3Route, true, 50)
end)
Utils.Do(FootPatrol5Squad, function(unit)
unit.Patrol(FootPatrol5Route, true, 50)
end)
AttackTrigger2.Patrol(FootPatrol4Route, true, 25)
LightTank1.Move(waypoint6.Location)
Buggy1.Patrol(Buggy1Route, true, 25)
Buggy2.Patrol(Buggy2Route, true, 25)
Camera.Position = UnitsRally.CenterPosition
Media.PlaySpeechNotification(GDI, "Reinforce")
ReinforceWithLandingCraft(GDI, { CommandoType }, lstStart.Location, lstEnd.Location, UnitsRally.Location)
end
Tick = function()
if DateTime.GameTime > DateTime.Seconds(5) and GDI.HasNoRequiredUnits() then
GDI.MarkFailedObjective(DestroyObjective)
end
end

BIN
mods/cnc/maps/gdi06/map.bin Normal file

Binary file not shown.

View File

@@ -0,0 +1,2 @@
## rules.yaml
briefing = Use a GDI Commando to infiltrate the Nod base. **** ** destroy the ******** to incapacitate the base. Get in, hit it, and get the **** out.

BIN
mods/cnc/maps/gdi06/map.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

1024
mods/cnc/maps/gdi06/map.yaml Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,2 @@
rain-ambient: Rain (ambient)
Hidden: true

Binary file not shown.

View File

@@ -0,0 +1,97 @@
World:
LuaScript:
Scripts: campaign.lua, utils.lua, gdi06.lua
MusicPlaylist:
BackgroundMusic: rain-ambient
StartingMusic: rain
WeatherOverlay:
ChangingWindLevel: true
InstantWindChanges: false
UseSquares: false
ScatterDirection: 0, 0
Gravity: 15, 25
SwingOffset: 0, 0
SwingSpeed: 0, 0
SwingAmplitude: 0, 0
ParticleColors: 304074, 28386C, 202C60, 182C54
LineTailAlphaValue: 150
ParticleSize: 1, 1
TintPostProcessEffect:
Red: 0.75
Green: 0.85
Blue: 1.5
Ambient: 0.45
MissionData:
Briefing: briefing
BriefingVideo: gdi6.vqa
StartVideo: nitejump.vqa
WinVideo: sabotage.vqa
LossVideo: gdilose.vqa
MapOptions:
ShortGameCheckboxLocked: True
ShortGameCheckboxEnabled: True
ScriptLobbyDropdown@difficulty:
ID: difficulty
Label: dropdown-difficulty.label
Description: dropdown-difficulty.description
Values:
easy: options-difficulty.easy
normal: options-difficulty.normal
hard: options-difficulty.hard
Default: normal
Player:
PlayerResources:
DefaultCash: 0
^Bridge:
DamageMultiplier@INVULNERABLE:
Modifier: 0
BRIDGEHUT:
-Targetable:
FLARE:
RevealsShroud:
Range: 5c0
SAM:
SpawnActorOnDeath:
Actor: e1
RMBO:
MustBeDestroyed:
RequiredForShortGame: true
AutoTarget:
EnableStances: false
InitialStance: ReturnFire
Health:
HP: 15000
RMBO.easy:
Inherits: RMBO
Health:
HP: 30000
ChangesHealth:
Step: 500
Delay: 10
StartIfBelow: 50
DamageCooldown: 200
RenderSprites:
Image: RMBO
RMBO.hard:
Inherits: RMBO
-AutoTarget:
-AutoTargetPriority@DEFAULT:
-AutoTargetPriority@ATTACKANYTHING:
-AttackMove:
RenderSprites:
Image: RMBO
E3.sticky:
Inherits: E3
AutoTarget:
AllowMovement: false
RenderSprites:
Image: E3