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 =
The Smugglers at Sietch Tabr must be neutralized. Capture the Outpost where their families have taken shelter as insurance. The children's lives will assure the loyalties of their fathers. Use an Engineer to enter and capture the building.
The Smugglers' new partners, the Harkonnen, may attempt to intervene. Harkonnen firepower is great, but we have recently acquired tanks that may counter this.
Ensure our investment is used wisely.

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

View File

@@ -0,0 +1,522 @@
MapFormat: 12
RequiresMod: d2k
Title: Ordos 04
Author: Westwood Studios
Tileset: ARRAKIS
MapSize: 68,68
Bounds: 2,2,64,64
Visibility: MissionSelector
Categories: Campaign
LockPreview: True
Players:
PlayerReference@Neutral:
Name: Neutral
OwnsWorld: True
NonCombatant: True
Faction: Random
PlayerReference@Creeps:
Name: Creeps
NonCombatant: True
Faction: Random
Enemies: Ordos, Harkonnen, Smugglers
PlayerReference@Ordos:
Name: Ordos
Playable: True
LockFaction: True
Faction: ordos
LockColor: True
Color: 5A9473
Enemies: Harkonnen, Smugglers, Creeps
PlayerReference@Harkonnen:
Name: Harkonnen
LockFaction: True
Faction: harkonnen
LockColor: True
Color: D64A42
Allies: Smugglers
Enemies: Ordos, Creeps
Bot: campaign
PlayerReference@Smugglers:
Name: Smugglers
LockFaction: True
Faction: smuggler
LockColor: True
Color: 7B2910
Allies: Harkonnen
Enemies: Ordos, Creeps
Bot: campaign
Actors:
Actor0: wall
Location: 38,2
Owner: Harkonnen
Actor1: wall
Location: 42,2
Owner: Smugglers
HGunTurret1: medium_gun_turret
Location: 38,3
Owner: Harkonnen
Actor3: wall
Location: 42,3
Owner: Smugglers
SLightFactory: light_factory
Location: 44,3
Owner: Smugglers
Actor5: wall
Location: 42,4
Owner: Smugglers
Actor6: wall
Location: 42,5
Owner: Smugglers
Actor7: wall
Location: 42,6
Owner: Smugglers
Actor8: light_inf
Location: 43,6
Owner: Smugglers
HGunTurret2: medium_gun_turret
Location: 38,7
Owner: Harkonnen
Actor10: trooper
Location: 39,7
Owner: Harkonnen
Actor11: wall
Location: 42,7
Owner: Smugglers
Actor12: wall
Location: 46,7
Owner: Smugglers
Actor13: wall
Location: 47,7
Owner: Smugglers
Actor14: wall
Location: 48,7
Owner: Smugglers
Actor15: wall
Location: 49,7
Owner: Smugglers
Actor16: wall
Location: 50,7
Owner: Smugglers
Actor17: light_inf
Location: 51,7
Owner: Smugglers
Actor18: wall
Location: 38,8
Owner: Harkonnen
Actor19: wall
Location: 42,8
Owner: Smugglers
SPower1: wind_trap
Location: 44,8
Owner: Smugglers
Actor21: wall
Location: 46,8
Owner: Smugglers
SOutpost: outpost
Location: 47,8
Owner: Smugglers
Actor23: wall
Location: 50,8
Owner: Smugglers
Actor24: wall
Location: 38,9
Owner: Harkonnen
Actor25: combat_tank_h
Location: 39,9
Owner: Harkonnen
Actor26: wall
Location: 42,9
Owner: Smugglers
Actor27: wall
Location: 46,9
Owner: Smugglers
Actor28: wall
Location: 50,9
Owner: Smugglers
Actor29: wall
Location: 29,10
Owner: Harkonnen
Actor30: wall
Location: 30,10
Owner: Harkonnen
Actor31: wall
Location: 31,10
Owner: Harkonnen
Actor32: wall
Location: 32,10
Owner: Harkonnen
Actor33: wall
Location: 33,10
Owner: Harkonnen
Actor34: wall
Location: 34,10
Owner: Harkonnen
Actor35: wall
Location: 35,10
Owner: Harkonnen
Actor36: wall
Location: 36,10
Owner: Harkonnen
Actor37: wall
Location: 37,10
Owner: Harkonnen
Actor38: wall
Location: 38,10
Owner: Harkonnen
SGunTurret1: medium_gun_turret
Location: 42,10
Owner: Smugglers
Actor40: wall
Location: 43,10
Owner: Smugglers
Actor41: wall
Location: 46,10
Owner: Smugglers
Actor42: wall
Location: 50,10
Owner: Smugglers
Actor43: spicebloom.spawnpoint
Location: 61,10
Owner: Neutral
Actor44: wall
Location: 28,11
Owner: Harkonnen
Actor45: wall
Location: 29,11
Owner: Harkonnen
Actor46: harvester
Location: 40,11
Owner: Harkonnen
Actor47: wall
Location: 46,11
Owner: Smugglers
Actor48: wall
Location: 47,11
Owner: Smugglers
Actor49: wall
Location: 48,11
Owner: Smugglers
Actor50: wall
Location: 49,11
Owner: Smugglers
Actor51: wall
Location: 50,11
Owner: Smugglers
Actor52: wall
Location: 28,12
Owner: Harkonnen
Actor53: wall
Location: 27,13
Owner: Harkonnen
Actor54: wall
Location: 28,13
Owner: Harkonnen
HBarracks: barracks
Location: 29,13
Owner: Harkonnen
HHeavyFactory: heavy_factory
Location: 31,13
Owner: Harkonnen
HRefinery: refinery
Location: 35,13
Owner: Harkonnen
SGunTurret2: medium_gun_turret
Location: 42,13
Owner: Smugglers
Actor59: wall
Location: 43,13
Owner: Smugglers
SPower2: wind_trap
Location: 44,13
Owner: Smugglers
SHeavyFactory: heavy_factory
Location: 46,13
Owner: Smugglers
SPower3: wind_trap
Location: 49,13
Owner: Smugglers
SBarracks: barracks
Location: 52,13
Owner: Smugglers
Actor64: wall
Location: 42,14
Owner: Smugglers
Actor65: wall
Location: 42,15
Owner: Smugglers
Actor66: wall
Location: 42,16
Owner: Smugglers
Actor67: light_inf
Location: 43,16
Owner: Smugglers
Actor68: wall
Location: 42,17
Owner: Smugglers
Actor69: wall
Location: 43,17
Owner: Smugglers
Actor70: wall
Location: 44,17
Owner: Smugglers
Actor71: wall
Location: 45,17
Owner: Smugglers
Actor72: wall
Location: 46,17
Owner: Smugglers
Actor73: wall
Location: 47,17
Owner: Smugglers
Actor74: wall
Location: 48,17
Owner: Smugglers
HLightFactory: light_factory
Location: 39,18
Owner: Harkonnen
HConyard: construction_yard
Location: 44,18
Owner: Harkonnen
Actor83: spicebloom.spawnpoint
Location: 6,19
Owner: Neutral
Actor84: spicebloom.spawnpoint
Location: 18,20
Owner: Neutral
Actor85: wall
Location: 56,20
Owner: Smugglers
SGunTurret3: medium_gun_turret
Location: 57,20
Owner: Smugglers
HPower1: wind_trap
Location: 44,21
Owner: Harkonnen
HPower2: wind_trap
Location: 46,21
Owner: Harkonnen
SGunTurret4: medium_gun_turret
Location: 63,21
Owner: Smugglers
Actor90: wall
Location: 64,21
Owner: Smugglers
Actor91: wall
Location: 65,21
Owner: Smugglers
Actor92: spicebloom.spawnpoint
Location: 23,24
Owner: Neutral
HPower3: wind_trap
Location: 44,24
Owner: Harkonnen
HPower4: wind_trap
Location: 46,24
Owner: Harkonnen
Actor95: wall
Location: 46,29
Owner: Harkonnen
HGunTurret3: medium_gun_turret
Location: 47,29
Owner: Harkonnen
Actor97: wall
Location: 48,29
Owner: Harkonnen
Actor98: spicebloom.spawnpoint
Location: 53,30
Owner: Neutral
Actor99: combat_tank_h
Location: 14,31
Owner: Harkonnen
Actor100: wormspawner
Location: 2,32
Owner: Creeps
Actor101: wall
Location: 10,32
Owner: Harkonnen
HGunTurret4: medium_gun_turret
Location: 11,32
Owner: Harkonnen
Actor103: light_inf
Location: 12,32
Owner: Harkonnen
Actor104: light_inf
Location: 16,32
Owner: Harkonnen
Actor105: wall
Location: 10,33
Owner: Harkonnen
Actor106: wall
Location: 15,33
Owner: Harkonnen
Actor107: wall
Location: 10,34
Owner: Harkonnen
Actor108: wall
Location: 15,34
Owner: Harkonnen
Actor109: wall
Location: 16,34
Owner: Harkonnen
Actor110: wall
Location: 16,35
Owner: Harkonnen
Actor111: wall
Location: 16,36
Owner: Harkonnen
Actor112: wall
Location: 17,36
Owner: Harkonnen
Actor113: trike
Location: 37,39
Owner: Harkonnen
Actor114: trike
Location: 39,39
Owner: Harkonnen
Actor115: trike
Location: 41,39
Owner: Harkonnen
Actor116: spicebloom.spawnpoint
Location: 7,40
Owner: Neutral
Actor117: wall
Location: 37,40
Owner: Harkonnen
Actor118: wall
Location: 38,40
Owner: Harkonnen
Actor119: light_inf
Location: 42,40
Owner: Harkonnen
Actor120: wall
Location: 37,41
Owner: Harkonnen
Actor121: wall
Location: 42,41
Owner: Harkonnen
Actor122: wall
Location: 43,41
Owner: Harkonnen
Actor123: wall
Location: 37,42
Owner: Harkonnen
Actor124: wall
Location: 43,42
Owner: Harkonnen
Actor125: wall
Location: 43,43
Owner: Harkonnen
Actor126: spicebloom.spawnpoint
Location: 32,49
Owner: Neutral
Actor127: spicebloom.spawnpoint
Location: 59,54
Owner: Neutral
Actor128: spicebloom.spawnpoint
Location: 5,58
Owner: Neutral
Actor129: raider
Location: 64,58
Owner: Ordos
Actor130: light_inf
Location: 65,58
Owner: Ordos
Actor131: light_inf
Location: 63,59
Owner: Ordos
Actor132: light_inf
Location: 61,60
Owner: Ordos
Actor133: combat_tank_o
Location: 64,60
Owner: Ordos
Actor134: combat_tank_o
Location: 63,61
Owner: Ordos
Actor135: spicebloom.spawnpoint
Location: 26,62
Owner: Neutral
Actor136: raider
Location: 60,62
Owner: Ordos
OConyard: construction_yard
Location: 62,62
Owner: Ordos
Actor138: raider
Location: 60,63
Owner: Ordos
Actor139: light_inf
Location: 60,65
Owner: Ordos
HarkonnenRally1: waypoint
Owner: Neutral
Location: 11,33
HarkonnenEntry1: waypoint
Owner: Neutral
Location: 2,33
HarkonnenRally2: waypoint
Owner: Neutral
Location: 31,29
HarkonnenEntry2: waypoint
Owner: Neutral
Location: 31,2
HarkonnenRally3: waypoint
Owner: Neutral
Location: 44,32
HarkonnenEntry3: waypoint
Owner: Neutral
Location: 65,32
HarkonnenRally4: waypoint
Owner: Neutral
Location: 40,6
HarkonnenEntry4: waypoint
Owner: Neutral
Location: 40,2
SmugglerRally: waypoint
Owner: Neutral
Location: 53,12
SmugglerEntry: waypoint
Owner: Neutral
Location: 53,2
OrdosRally: waypoint
Owner: Neutral
Location: 37,59
OrdosEntry: waypoint
Owner: Neutral
Location: 37,65
Actor156: wall
Owner: Smugglers
Location: 50,20
Actor157: wall
Owner: Smugglers
Location: 49,20
Actor158: wall
Owner: Smugglers
Location: 51,20
Actor153: wind_trap
Owner: Smugglers
Location: 50,17
Actor150: wall
Owner: Smugglers
Location: 49,17
Actor151: wall
Owner: Smugglers
Location: 49,18
Actor152: wall
Owner: Smugglers
Location: 49,19
Rules: d2k|rules/campaign-rules.yaml, d2k|rules/campaign-tooltips.yaml, d2k|rules/campaign-palettes.yaml, rules.yaml
FluentMessages: d2k|fluent/lua.ftl, d2k|fluent/campaign.ftl, map.ftl

View File

@@ -0,0 +1,58 @@
--[[
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.
]]
AttackGroupSize =
{
easy = 6,
normal = 8,
hard = 10
}
AttackDelays =
{
easy = { DateTime.Seconds(4), DateTime.Seconds(7) },
normal = { DateTime.Seconds(2), DateTime.Seconds(5) },
hard = { DateTime.Seconds(1), DateTime.Seconds(3) }
}
EnemyInfantryTypes = { "light_inf", "light_inf", "light_inf", "trooper", "trooper" }
HarkonnenVehicleTypes = { "trike", "trike", "quad" }
HarkonnenTankType = { "combat_tank_h" }
SmugglerVehicleTypes = { "raider", "raider", "quad" }
SmugglerTankType = { "combat_tank_o" }
InitAIUnits = function(house)
LastHarvesterEaten[house] = true
IdlingUnits[house] = Reinforcements.Reinforce(house, InitialReinforcements[house.InternalName], InitialReinforcementsPaths[house.InternalName])
DefendAndRepairBase(house, Base[house.InternalName], 0.75, AttackGroupSize[Difficulty])
end
ActivateAI = function()
InitAIUnits(Harkonnen)
InitAIUnits(Smuggler)
local delay = function() return Utils.RandomInteger(AttackDelays[Difficulty][1], AttackDelays[Difficulty][2] + 1) end
local infantryToBuild = function() return { Utils.Random(EnemyInfantryTypes) } end
local hVehiclesToBuild = function() return { Utils.Random(HarkonnenVehicleTypes) } end
local hTanksToBuild = function() return HarkonnenTankType end
local sVehiclesToBuild = function() return { Utils.Random(SmugglerVehicleTypes) } end
local sTanksToBuild = function() return SmugglerTankType end
local attackTresholdSize = AttackGroupSize[Difficulty] * 2.5
ProduceUnits(Harkonnen, HBarracks, delay, infantryToBuild, AttackGroupSize[Difficulty], attackTresholdSize)
ProduceUnits(Harkonnen, HLightFactory, delay, hVehiclesToBuild, AttackGroupSize[Difficulty], attackTresholdSize)
ProduceUnits(Harkonnen, HHeavyFactory, delay, hTanksToBuild, AttackGroupSize[Difficulty], attackTresholdSize)
ProduceUnits(Smuggler, SBarracks, delay, infantryToBuild, AttackGroupSize[Difficulty], attackTresholdSize)
ProduceUnits(Smuggler, SLightFactory, delay, sVehiclesToBuild, AttackGroupSize[Difficulty], attackTresholdSize)
ProduceUnits(Smuggler, SHeavyFactory, delay, sTanksToBuild, AttackGroupSize[Difficulty], attackTresholdSize)
end

View File

@@ -0,0 +1,160 @@
--[[
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.
]]
Base =
{
Harkonnen = { HConyard, HRefinery, HHeavyFactory, HLightFactory, HGunTurret1, HGunTurret2, HGunTurret3, HGunTurret4, HBarracks, HPower1, HPower2, HPower3, HPower4 },
Smugglers = { SOutpost, SHeavyFactory, SLightFactory, SGunTurret1, SGunTurret2, SGunTurret3, SGunTurret4, SBarracks, SPower1, SPower2, SPower3 }
}
HarkonnenLightInfantryRushers =
{
easy = { "light_inf", "light_inf", "light_inf", "light_inf", "light_inf", "light_inf", "light_inf" },
normal = { "light_inf", "light_inf", "light_inf", "light_inf", "light_inf", "light_inf", "light_inf", "light_inf" },
hard = { "light_inf", "light_inf", "light_inf", "light_inf", "light_inf", "light_inf", "light_inf", "light_inf", "light_inf" }
}
HarkonnenAttackDelay =
{
easy = DateTime.Minutes(3) + DateTime.Seconds(30),
normal = DateTime.Minutes(2) + DateTime.Seconds(30),
hard = DateTime.Minutes(1) + DateTime.Seconds(30)
}
InitialReinforcements =
{
Harkonnen = { "combat_tank_h", "combat_tank_h", "trike", "quad" },
Smugglers = { "light_inf", "light_inf", "light_inf", "light_inf", "trooper", "trooper", "trooper" }
}
LightInfantryRushersPaths =
{
{ HarkonnenEntry1.Location, HarkonnenRally1.Location },
{ HarkonnenEntry2.Location, HarkonnenRally2.Location },
{ HarkonnenEntry3.Location, HarkonnenRally3.Location }
}
InitialReinforcementsPaths =
{
Harkonnen = { HarkonnenEntry4.Location, HarkonnenRally4.Location },
Smugglers = { SmugglerEntry.Location, SmugglerRally.Location }
}
OrdosReinforcements = { "light_inf", "light_inf", "light_inf", "light_inf" }
OrdosPath = { OrdosEntry.Location, OrdosRally.Location }
SendHarkonnen = function(path)
Trigger.AfterDelay(HarkonnenAttackDelay[Difficulty], function()
if Ordos.IsObjectiveCompleted(KillHarkonnen) then
return
end
local units = Reinforcements.ReinforceWithTransport(Harkonnen, "carryall.reinforce", HarkonnenLightInfantryRushers[Difficulty], path, { path[1] })[2]
Utils.Do(units, function(unit)
unit.AttackMove(HarkonnenAttackLocation)
IdleHunt(unit)
end)
end)
end
Hunt = function(house)
Trigger.OnAllKilledOrCaptured(Base[house.InternalName], function()
Utils.Do(house.GetGroundAttackers(), IdleHunt)
end)
end
CheckHarvester = function(house)
if DateTime.GameTime % DateTime.Seconds(10) == 0 and LastHarvesterEaten[house] then
local units = house.GetActorsByType("harvester")
if #units > 0 then
LastHarvesterEaten[house] = false
ProtectHarvester(units[1], house, AttackGroupSize[Difficulty])
end
end
end
AttackNotifier = 0
Tick = function()
if Ordos.HasNoRequiredUnits() then
Harkonnen.MarkCompletedObjective(KillOrdosH)
Smuggler.MarkCompletedObjective(KillOrdosS)
Smuggler.MarkCompletedObjective(DefendOutpost)
end
if Harkonnen.HasNoRequiredUnits() and not Ordos.IsObjectiveCompleted(KillHarkonnen) then
Media.DisplayMessage(UserInterface.GetFluentMessage("harkonnen-annihilated"), Mentat)
Ordos.MarkCompletedObjective(KillHarkonnen)
end
CheckHarvester(Harkonnen)
CheckHarvester(Smuggler)
AttackNotifier = AttackNotifier - 1
end
WorldLoaded = function()
Harkonnen = Player.GetPlayer("Harkonnen")
Smuggler = Player.GetPlayer("Smugglers")
Ordos = Player.GetPlayer("Ordos")
InitObjectives(Ordos)
KillOrdosH = AddPrimaryObjective(Harkonnen, "")
KillOrdosS = AddSecondaryObjective(Smuggler, "")
DefendOutpost = AddPrimaryObjective(Smuggler, "outpost-not-captured-destroyed")
CaptureOutpost = AddPrimaryObjective(Ordos, "capture-smuggler-outpost")
KillHarkonnen = AddSecondaryObjective(Ordos, "destroy-harkonnen")
Camera.Position = OConyard.CenterPosition
HarkonnenAttackLocation = OConyard.Location
Hunt(Harkonnen)
Hunt(Smuggler)
SendHarkonnen(LightInfantryRushersPaths[1])
SendHarkonnen(LightInfantryRushersPaths[2])
SendHarkonnen(LightInfantryRushersPaths[3])
Actor.Create("upgrade.barracks", true, { Owner = Harkonnen })
Actor.Create("upgrade.light", true, { Owner = Harkonnen })
Actor.Create("upgrade.barracks", true, { Owner = Smuggler })
Actor.Create("upgrade.light", true, { Owner = Smuggler })
Trigger.AfterDelay(0, ActivateAI)
Trigger.OnKilled(SOutpost, function()
Ordos.MarkFailedObjective(CaptureOutpost)
end)
Trigger.OnCapture(SOutpost, function()
Trigger.AfterDelay(DateTime.Seconds(2), function()
Ordos.MarkCompletedObjective(CaptureOutpost)
Smuggler.MarkFailedObjective(DefendOutpost)
end)
SOutpost.GrantCondition("modified")
end)
Trigger.OnDamaged(SOutpost, function(_, attacker)
if SOutpost.Owner ~= Smuggler or attacker.IsDead or attacker.Owner ~= Ordos then
return
end
if AttackNotifier <= 0 then
AttackNotifier = DateTime.Seconds(10)
Media.DisplayMessage(UserInterface.GetFluentMessage("do-not-destroy-outpost"), Mentat)
end
end)
Trigger.AfterDelay(HarkonnenAttackDelay[Difficulty] - DateTime.Seconds(5), function()
Media.PlaySpeechNotification(Ordos, "Reinforce")
Reinforcements.Reinforce(Ordos, OrdosReinforcements, OrdosPath)
end)
Trigger.AfterDelay(HarkonnenAttackDelay[Difficulty], function()
Media.DisplayMessage(UserInterface.GetFluentMessage("warning-large-force-approaching"), Mentat)
end)
end

View File

@@ -0,0 +1,73 @@
Player:
PlayerResources:
DefaultCash: 5000
World:
LuaScript:
Scripts: campaign.lua, utils.lua, ordos04.lua, ordos04-AI.lua
MissionData:
Briefing: briefing
BriefingVideo: O_BR04_E.VQA
MapOptions:
TechLevel: low
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: easy
carryall.reinforce:
Cargo:
MaxWeight: 10
concreteb:
Buildable:
Prerequisites: ~disabled
medium_gun_turret:
Buildable:
Prerequisites: ~disabled
outpost:
Buildable:
Prerequisites: barracks
ExternalCondition@lua:
Condition: modified
Tooltip:
RequiresCondition: !modified
Tooltip@Modified:
Name: actor-outpost-modified-name
RequiresCondition: modified
ShowOwnerRow: false
quad:
Buildable:
Prerequisites: upgrade.light
trooper:
Buildable:
Prerequisites: upgrade.barracks
engineer:
Buildable:
Prerequisites: upgrade.barracks
repair_pad:
Buildable:
Prerequisites: heavy_factory
mcv:
Buildable:
Prerequisites: repair_pad
upgrade.conyard:
Buildable:
Prerequisites: ~disabled
upgrade.heavy:
Buildable:
Prerequisites: ~disabled