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,9 @@
## rules.yaml
briefing =
The Allied base in this region is proving to be problematic.
Your mission is to take it out, so that we can move forces through this area.
As long as they have communications they will be able to call upon heavy reinforcements.
Destroy their communications, and the Allies should be easy to remove.

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

View File

@@ -0,0 +1,603 @@
MapFormat: 12
RequiresMod: ra
Title: 04a: Behind the Lines
Author: Westwood Studios
Tileset: SNOW
MapSize: 128,128
Bounds: 38,45,72,46
Visibility: MissionSelector
Categories: Campaign
LockPreview: True
Players:
PlayerReference@Neutral:
Name: Neutral
OwnsWorld: True
NonCombatant: True
Faction: england
PlayerReference@Spain:
Name: Spain
Faction: england
Allies: Greece
Enemies: USSR
Bot: campaign
PlayerReference@Greece:
Name: Greece
Faction: allies
Color: E2E6F5
Allies: Spain
Enemies: USSR
Bot: campaign
PlayerReference@USSR:
Name: USSR
Playable: True
AllowBots: False
Required: True
LockFaction: True
Faction: soviet
LockColor: True
Color: FE1100
LockSpawn: True
LockTeam: True
Enemies: Greece, Spain
Actors:
Actor0: sbag
Location: 71,43
Owner: Neutral
Actor1: sbag
Location: 72,43
Owner: Neutral
Actor2: sbag
Location: 72,44
Owner: Neutral
Actor3: cycl
Location: 47,45
Owner: Neutral
Actor4: cycl
Location: 48,45
Owner: Neutral
Actor5: cycl
Location: 49,45
Owner: Neutral
Actor6: cycl
Location: 50,45
Owner: Neutral
Actor7: cycl
Location: 53,45
Owner: Neutral
Actor8: sbag
Location: 72,45
Owner: Neutral
Actor9: sbag
Location: 72,46
Owner: Neutral
Actor10: sbag
Location: 73,46
Owner: Neutral
Actor11: sbag
Location: 74,46
Owner: Neutral
Actor12: cycl
Location: 46,47
Owner: Neutral
Actor13: sbag
Location: 72,47
Owner: Neutral
Actor14: cycl
Location: 46,48
Owner: Neutral
Actor15: sbag
Location: 71,48
Owner: Neutral
Actor16: sbag
Location: 72,48
Owner: Neutral
Actor17: cycl
Location: 46,49
Owner: Neutral
Actor18: sbag
Location: 71,52
Owner: Neutral
Actor19: sbag
Location: 72,52
Owner: Neutral
Actor20: sbag
Location: 72,53
Owner: Neutral
Actor21: sbag
Location: 72,54
Owner: Neutral
Actor22: sbag
Location: 72,55
Owner: Neutral
Actor23: sbag
Location: 73,55
Owner: Neutral
Actor24: sbag
Location: 74,55
Owner: Neutral
Actor25: sbag
Location: 72,56
Owner: Neutral
Actor26: sbag
Location: 86,56
Owner: Neutral
Actor27: sbag
Location: 88,56
Owner: Neutral
Actor28: sbag
Location: 89,56
Owner: Neutral
Actor29: sbag
Location: 90,56
Owner: Neutral
Actor30: sbag
Location: 91,56
Owner: Neutral
Actor31: sbag
Location: 92,56
Owner: Neutral
Actor32: sbag
Location: 67,57
Owner: Neutral
Actor33: sbag
Location: 68,57
Owner: Neutral
Actor34: sbag
Location: 69,57
Owner: Neutral
Actor35: sbag
Location: 70,57
Owner: Neutral
Actor36: sbag
Location: 71,57
Owner: Neutral
Actor37: sbag
Location: 72,57
Owner: Neutral
Actor38: sbag
Location: 78,58
Owner: Neutral
Actor39: sbag
Location: 79,58
Owner: Neutral
Actor40: sbag
Location: 80,58
Owner: Neutral
Actor41: sbag
Location: 81,58
Owner: Neutral
Actor42: sbag
Location: 82,58
Owner: Neutral
Actor43: sbag
Location: 83,58
Owner: Neutral
Actor44: sbag
Location: 57,69
Owner: Neutral
Actor45: sbag
Location: 61,69
Owner: Neutral
Actor46: sbag
Location: 44,72
Owner: Neutral
Actor47: sbag
Location: 48,72
Owner: Neutral
Actor48: tc04
Location: 97,67
Owner: Neutral
Actor49: tc05
Location: 71,79
Owner: Neutral
Actor50: t10
Location: 100,59
Owner: Neutral
Actor51: t13
Location: 78,50
Owner: Neutral
Actor52: tc01
Location: 68,55
Owner: Neutral
Actor53: t08
Location: 73,47
Owner: Neutral
Actor57: t11
Location: 38,74
Owner: Neutral
Actor58: tc02
Location: 42,75
Owner: Neutral
Actor59: tc03
Location: 60,80
Owner: Neutral
Actor60: tc05
Location: 54,73
Owner: Neutral
Actor61: tc01
Location: 47,87
Owner: Neutral
Actor62: t16
Location: 56,79
Owner: Neutral
Actor63: tc04
Location: 79,70
Owner: Neutral
Actor64: tc01
Location: 108,73
Owner: Neutral
Actor65: t07
Location: 94,60
Owner: Neutral
Actor66: tc05
Location: 91,66
Owner: Neutral
Actor67: t17
Location: 82,64
Owner: Neutral
Actor71: t17
Location: 42,52
Owner: Neutral
Actor72: t01
Location: 53,81
Owner: Neutral
Actor73: tc01
Location: 99,77
Owner: Neutral
Actor74: mine
Location: 106,86
Owner: Neutral
Actor75: mine
Location: 70,87
Owner: Neutral
Actor76: tc04
Location: 39,46
Owner: Neutral
Actor77: tc05
Location: 45,61
Owner: Neutral
Actor78: tc02
Location: 41,48
Owner: Neutral
Actor79: tc04
Location: 98,45
Owner: Neutral
Actor80: t15
Location: 95,48
Owner: Neutral
Actor81: tc03
Location: 38,68
Owner: Neutral
Actor82: t08
Location: 38,67
Owner: Neutral
Actor83: t08
Location: 40,69
Owner: Neutral
Actor84: tc05
Location: 38,79
Owner: Neutral
Actor104: brl3
Location: 95,50
Owner: Greece
Actor105: barl
Location: 93,49
Owner: Greece
Actor106: brl3
Location: 94,50
Owner: Greece
Actor107: barl
Location: 93,50
Owner: Greece
Actor108: v19
Location: 92,48
Owner: Greece
Actor110: brl3
Location: 83,57
Owner: Greece
Actor111: barl
Location: 82,57
Owner: Greece
Actor112: barl
Location: 81,57
Owner: Greece
Actor113: brl3
Location: 88,55
Owner: Greece
Actor114: barl
Location: 87,55
Owner: Greece
Actor115: brl3
Location: 87,56
Owner: Greece
Actor116: brl3
Location: 57,46
Owner: Greece
Actor117: barl
Location: 57,47
Owner: Greece
Actor118: brl3
Location: 92,50
Owner: Greece
Actor119: barl
Location: 92,49
Owner: Greece
Actor120: barl
Location: 94,49
Owner: Greece
Actor133: 2tnk
Location: 69,54
Owner: Greece
Facing: 256
Actor136: 1tnk
Location: 59,68
Owner: Greece
Facing: 512
Actor137: 1tnk
Location: 46,71
Owner: Greece
Facing: 512
Actor139: jeep
Location: 57,54
Owner: Greece
Facing: 384
Actor140: 1tnk
Location: 62,46
Owner: Greece
Facing: 640
Actor141: 1tnk
Location: 60,57
Owner: Greece
Facing: 512
Actor142: 1tnk
Location: 54,57
Owner: Greece
Facing: 512
Actor143: 2tnk
Location: 92,53
Owner: Greece
Facing: 768
Actor144: 2tnk
Location: 92,55
Owner: Greece
Facing: 768
Actor145: 2tnk
Location: 86,58
Owner: Greece
Facing: 640
Actor146: jeep
Location: 89,60
Owner: Greece
Facing: 640
Actor151: 2tnk
Location: 40,55
Owner: Greece
Facing: 512
Actor152: 2tnk
Location: 44,55
Owner: Greece
Facing: 512
Actor154: 2tnk
Location: 67,64
Owner: Greece
Facing: 640
Actor155: 2tnk
Location: 69,63
Owner: Greece
Facing: 640
Actor159: mine
Location: 77,46
Owner: Neutral
RadarDome: dome
Location: 49,46
Owner: Greece
CYard: fact
Location: 58,45
Owner: Greece
Proc: proc
Location: 63,53
Owner: Greece
FreeActor: False
Silo1: silo
Location: 62,52
Owner: Greece
Silo2: silo
Location: 63,53
Owner: Greece
Silo3: silo
Location: 65,52
Owner: Greece
Silo4: silo
Location: 66,53
Owner: Greece
Barr: tent
Location: 50,52
Owner: Greece
Gun1: gun
Location: 87,57
Owner: Greece
Facing: 384
Gun2: gun
Location: 84,58
Owner: Greece
Facing: 384
Gun3: gun
Location: 53,48
Owner: Greece
Facing: 384
Gun4: gun
Location: 67,65
Owner: Greece
Facing: 384
Gun5: gun
Location: 70,63
Owner: Greece
Facing: 384
Pbox1: pbox
Location: 57,70
Owner: Greece
Pbox2: powr
Location: 51,45
Owner: Greece
Pbox3: pbox
Location: 61,70
Owner: Greece
Pbox4: pbox
Location: 67,63
Owner: Greece
Pbox5: pbox
Location: 44,73
Owner: Greece
Pbox6: pbox
Location: 48,73
Owner: Greece
village1: v11
Location: 57,80
Owner: Spain
village2: v03
Location: 49,77
Owner: Spain
Health: 75
village3: v02
Location: 43,77
Owner: Spain
village4: v01
Location: 40,75
Owner: Spain
village5: v05
Location: 55,76
Owner: Spain
Health: 39
Weap: weap
Location: 67,45
Owner: Greece
Gap1: gap
Location: 83,52
Owner: Greece
Gap2: gap
Location: 59,66
Owner: Greece
Powr1: powr
Location: 47,47
Owner: Greece
Powr2: powr
Location: 93,46
Owner: Greece
Powr3: powr
Location: 96,45
Owner: Greece
APwr: apwr
Location: 49,57
Owner: Greece
Fix1: fix
Location: 56,55
Owner: Greece
Tank1: 3tnk
Location: 88,87
Owner: USSR
Tank2: 3tnk
Location: 84,87
Owner: USSR
Tank3: 3tnk
Location: 87,86
Owner: USSR
Tank4: 3tnk
Location: 85,86
Owner: USSR
Tank5: v2rl
Location: 86,87
Owner: USSR
civ1: c6
Location: 53,80
Owner: Spain
Facing: 256
SubCell: 2
civ2: c7
Location: 58,79
Owner: Spain
SubCell: 3
civ3: c5
Location: 57,81
Owner: Spain
Facing: 256
SubCell: 3
Harvester: harv
Location: 76,47
Owner: Greece
Facing: 640
Runner1: jeep
Location: 88,83
Owner: Greece
Runner2: jeep
Location: 84,83
Owner: Greece
Facing: 256
GreeceCYard: waypoint
Location: 59,47
Owner: Neutral
BridgeEntrancePoint: waypoint
Location: 83,55
Owner: Neutral
SovietBasePoint: waypoint
Location: 86,88
Owner: Neutral
ToRadarPoint: waypoint
Location: 42,60
Owner: Neutral
InVillagePoint: waypoint
Location: 56,82
Owner: Neutral
NRoadPoint: waypoint
Location: 80,45
Owner: Neutral
SWRoadPoint: waypoint
Location: 38,90
Owner: Neutral
VillagePoint: waypoint
Location: 57,80
Owner: Neutral
CrossroadsNorthPoint: waypoint
Location: 80,49
Owner: Neutral
StartPoint: waypoint
Location: 86,90
Owner: Neutral
SovietBaseEntryPointW: waypoint
Location: 69,79
Owner: Neutral
NearRadarPoint: waypoint
Location: 43,47
Owner: Neutral
NERoadTurnPoint: waypoint
Location: 106,54
Owner: Neutral
CrossroadsEastPoint: waypoint
Location: 106,64
Owner: Neutral
VillageEntrancePoint: waypoint
Location: 59,75
Owner: Neutral
StartCamPoint: waypoint
Location: 86,87
Owner: Neutral
SovietBaseEntryPointNE: waypoint
Location: 96,77
Owner: Neutral
V2MovePoint: waypoint
Location: 84,83
Owner: Neutral
Rules: ra|rules/campaign-rules.yaml, ra|rules/campaign-tooltips.yaml, ra|rules/campaign-palettes.yaml, rules.yaml
FluentMessages: ra|fluent/lua.ftl, ra|fluent/campaign.ftl, map.ftl

View File

@@ -0,0 +1,92 @@
Player:
PlayerResources:
DefaultCash: 5000
World:
LuaScript:
Scripts: campaign.lua, utils.lua, soviet04a.lua, soviet04a-AI.lua, soviet04a-reinforcements_teams.lua
MissionData:
Briefing: briefing
BriefingVideo: soviet4.vqa
StartVideo: sovmcv.vqa
WinVideo: radrraid.vqa
LossVideo: allymorf.vqa
MapOptions:
TechLevel: medium
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
AFLD:
ParatroopersPower@paratroopers:
DropItems: E1,E1,E1,E2,E2
TSLA:
Buildable:
Prerequisites: ~disabled
SAM:
Buildable:
Prerequisites: ~disabled
HPAD:
Buildable:
Prerequisites: ~disabled
APWR:
Buildable:
Prerequisites: ~disabled
BRIK:
Buildable:
Prerequisites: ~disabled
E3:
Buildable:
Prerequisites: ~tent
E4:
Buildable:
Prerequisites: ~disabled
THF:
Buildable:
Prerequisites: ~disabled
SPY:
Buildable:
Prerequisites: ~disabled
MECH:
Buildable:
Prerequisites: ~disabled
MCV:
Buildable:
Prerequisites: ~disabled
FTRK:
Buildable:
Prerequisites: ~disabled
APC:
Buildable:
Prerequisites: ~disabled
AGUN:
Buildable:
Prerequisites: ~disabled
SPEN:
Buildable:
Prerequisites: ~disabled
SYRD:
Buildable:
Prerequisites: ~disabled

View File

@@ -0,0 +1,120 @@
--[[
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.
]]
IdlingUnits = function()
local lazyUnits = Greece.GetGroundAttackers()
Utils.Do(lazyUnits, function(unit)
Trigger.OnDamaged(unit, function()
Trigger.ClearAll(unit)
Trigger.AfterDelay(0, function() IdleHunt(unit) end)
end)
end)
end
BaseBarracks = { type = "tent", pos = CVec.New(-9, 6), cost = 400, exists = true }
BaseProc = { type = "proc", pos = CVec.New(4, 7), cost = 1400, exists = true }
BaseWeaponsFactory = { type = "weap", pos = CVec.New(8, -1), cost = 2000, exists = true }
BaseBuildings =
{
{ type = "powr", pos = CVec.New(0, 4), cost = 300 },
BaseBarracks,
BaseProc,
BaseWeaponsFactory
}
BuildBase = function()
for i,v in ipairs(BaseBuildings) do
if not v.exists then
BuildBuilding(v)
return
end
end
Trigger.AfterDelay(DateTime.Seconds(10), BuildBase)
end
BuildBuilding = function(building)
Trigger.AfterDelay(Actor.BuildTime(building.type), function()
if CYard.IsDead or CYard.Owner ~= Greece then
return
elseif Harvester.IsDead and Greece.Resources <= 299 then
return
end
local actor = Actor.Create(building.type, true, { Owner = Greece, Location = GreeceCYard.Location + building.pos })
Greece.Cash = Greece.Cash - building.cost
building.exists = true
Trigger.OnKilled(actor, function() building.exists = false end)
Trigger.OnDamaged(actor, function(building)
if building.Owner == Greece and building.Health < building.MaxHealth * 3/4 then
building.StartBuildingRepairs()
end
end)
Trigger.AfterDelay(DateTime.Seconds(10), BuildBase)
end)
end
ProduceInfantry = function()
if not BaseBarracks.exists then
return
elseif Harvester.IsDead and Greece.Resources <= 299 then
return
end
local delay = Utils.RandomInteger(DateTime.Seconds(3), DateTime.Seconds(9))
local toBuild = { Utils.Random(AlliedInfantryTypes) }
local Path = Utils.Random(AttackPaths)
Greece.Build(toBuild, function(unit)
InfAttack[#InfAttack + 1] = unit[1]
if #InfAttack >= 10 then
SendUnits(InfAttack, Path)
InfAttack = { }
Trigger.AfterDelay(DateTime.Minutes(2), ProduceInfantry)
else
Trigger.AfterDelay(delay, ProduceInfantry)
end
end)
end
ProduceArmor = function()
if not BaseWeaponsFactory.exists then
return
elseif Harvester.IsDead and Greece.Resources <= 599 then
return
end
local delay = Utils.RandomInteger(DateTime.Seconds(12), DateTime.Seconds(17))
local toBuild = { Utils.Random(AlliedArmorTypes) }
local Path = Utils.Random(AttackPaths)
Greece.Build(toBuild, function(unit)
ArmorAttack[#ArmorAttack + 1] = unit[1]
if #ArmorAttack >= 6 then
SendUnits(ArmorAttack, Path)
ArmorAttack = { }
Trigger.AfterDelay(DateTime.Minutes(3), ProduceArmor)
else
Trigger.AfterDelay(delay, ProduceArmor)
end
end)
end
SendUnits = function(units, waypoints)
Utils.Do(units, function(unit)
if not unit.IsDead then
Utils.Do(waypoints, function(waypoint)
unit.AttackMove(waypoint.Location)
end)
unit.Hunt()
end
end)
end

View File

@@ -0,0 +1,96 @@
--[[
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.
]]
Civs = { civ1, civ2, civ3 }
Village = { civ1, civ2, civ3, village1, village2, village5 }
SovietMCV = { "mcv" }
InfantryReinfGreece = { "e1", "e1", "e1", "e1", "e1" }
Avengers = { "jeep", "1tnk", "2tnk", "2tnk", "1tnk" }
Patrol1Group = { "jeep", "jeep", "2tnk", "2tnk" }
Patrol2Group = { "jeep", "1tnk", "1tnk", "1tnk" }
AlliedInfantryTypes = { "e1", "e3" }
AlliedArmorTypes = { "jeep", "jeep", "1tnk", "1tnk", "1tnk" }
InfAttack = { }
ArmorAttack = { }
SovietStartToBasePath = { StartPoint.Location, SovietBasePoint.Location }
InfReinfPath = { SWRoadPoint.Location, InVillagePoint.Location }
ArmorReinfPath = { NRoadPoint.Location, CrossroadsNorthPoint.Location }
Patrol1Path = { NearRadarPoint.Location, ToRadarPoint.Location, InVillagePoint.Location, ToRadarPoint.Location }
Patrol2Path = { BridgeEntrancePoint.Location, NERoadTurnPoint.Location, CrossroadsEastPoint.Location, BridgeEntrancePoint.Location }
VillageCamArea = { CPos.New(68, 75),CPos.New(68, 76),CPos.New(68, 77),CPos.New(68, 78),CPos.New(68, 79), CPos.New(68, 80), CPos.New(68, 81), CPos.New(68, 82) }
if Difficulty == "easy" then
ArmorReinfGreece = { "jeep", "1tnk", "1tnk" }
else
ArmorReinfGreece = { "jeep", "jeep", "1tnk", "1tnk", "1tnk" }
end
AttackPaths =
{
{ VillageEntrancePoint },
{ BridgeEntrancePoint, NERoadTurnPoint, CrossroadsEastPoint }
}
ReinfInf = function()
if RadarDome.IsDead or RadarDome.Owner ~= Greece then
return
end
Reinforcements.Reinforce(Greece, InfantryReinfGreece, InfReinfPath, 0, function(soldier)
soldier.Hunt()
end)
end
ReinfArmor = function()
if not RadarDome.IsDead and RadarDome.Owner == Greece then
RCheck = true
Reinforcements.Reinforce(Greece, ArmorReinfGreece, ArmorReinfPath, 0, function(soldier)
soldier.Hunt()
end)
end
end
BringPatrol1 = function()
if RadarDome.IsDead or RadarDome.Owner ~= Greece then
return
end
local units = Reinforcements.Reinforce(Greece, Patrol1Group, { SWRoadPoint.Location }, 0)
Utils.Do(units, function(patrols)
patrols.Patrol(Patrol1Path, true, 250)
end)
Trigger.OnAllKilled(units, function()
if Difficulty == "hard" then
Trigger.AfterDelay(DateTime.Minutes(4), BringPatrol1)
else
Trigger.AfterDelay(DateTime.Minutes(7), BringPatrol1)
end
end)
end
BringPatrol2 = function()
if RadarDome.IsDead or RadarDome.Owner ~= Greece then
return
end
local units = Reinforcements.Reinforce(Greece, Patrol2Group, { NRoadPoint.Location }, 0)
Utils.Do(units, function(patrols)
patrols.Patrol(Patrol2Path, true, 250)
end)
Trigger.OnAllKilled(units, function()
if Difficulty == "hard" then
Trigger.AfterDelay(DateTime.Minutes(4), BringPatrol2)
else
Trigger.AfterDelay(DateTime.Minutes(7), BringPatrol2)
end
end)
end

View File

@@ -0,0 +1,147 @@
--[[
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.
]]
RunInitialActivities = function()
Harvester.FindResources()
IdlingUnits()
Trigger.AfterDelay(10, function()
BringPatrol1()
BringPatrol2()
BuildBase()
end)
Utils.Do(Map.NamedActors, function(actor)
if actor.Owner == Greece and actor.HasProperty("StartBuildingRepairs") then
Trigger.OnDamaged(actor, function(building)
if building.Owner == Greece and building.Health < 3/4 * building.MaxHealth then
building.StartBuildingRepairs()
end
end)
end
end)
Reinforcements.Reinforce(USSR, SovietMCV, SovietStartToBasePath, 0, function(mcv)
mcv.Move(StartCamPoint.Location)
end)
Media.PlaySpeechNotification(USSR, "ReinforcementsArrived")
Trigger.OnKilled(Barr, function()
BaseBarracks.exists = false
end)
Trigger.OnKilled(Proc, function()
BaseProc.exists = false
end)
Trigger.OnKilled(Weap, function()
BaseWeaponsFactory.exists = false
end)
Trigger.OnEnteredFootprint(VillageCamArea, function(actor, id)
if actor.Owner == USSR then
Trigger.RemoveFootprintTrigger(id)
if not AllVillagersDead then
VillageCamera = Actor.Create("camera", true, { Owner = USSR, Location = VillagePoint.Location })
end
end
end)
Trigger.OnAllKilled(Village, function()
if VillageCamera then
VillageCamera.Destroy()
end
AllVillagersDead = true
end)
Trigger.OnAnyKilled(Civs, function()
Trigger.ClearAll(civ1)
Trigger.ClearAll(civ2)
Trigger.ClearAll(civ3)
local units = Reinforcements.Reinforce(Greece, Avengers, { SWRoadPoint.Location }, 0)
Utils.Do(units, function(unit)
unit.Hunt()
end)
end)
Runner1.Move(CrossroadsEastPoint.Location)
Runner2.Move(InVillagePoint.Location)
Tank5.Move(V2MovePoint.Location)
Trigger.AfterDelay(DateTime.Seconds(2), function()
Tank1.Stop()
Tank2.Stop()
Tank3.Stop()
Tank4.Stop()
Tank5.Stop()
Trigger.AfterDelay(1, function()
Tank1.Move(SovietBaseEntryPointNE.Location)
Tank2.Move(SovietBaseEntryPointW.Location)
Tank3.Move(SovietBaseEntryPointNE.Location)
Tank4.Move(SovietBaseEntryPointW.Location)
Tank5.Move(V2MovePoint.Location)
end)
end)
Trigger.AfterDelay(DateTime.Minutes(1), ProduceInfantry)
Trigger.AfterDelay(DateTime.Minutes(2), ProduceArmor)
if Difficulty == "hard" or Difficulty == "normal" then
Trigger.AfterDelay(DateTime.Seconds(15), ReinfInf)
end
Trigger.AfterDelay(DateTime.Minutes(1), ReinfInf)
Trigger.AfterDelay(DateTime.Minutes(3), ReinfInf)
Trigger.AfterDelay(DateTime.Minutes(2), ReinfArmor)
end
Tick = function()
if Greece.HasNoRequiredUnits() then
USSR.MarkCompletedObjective(KillAll)
USSR.MarkCompletedObjective(KillRadar)
end
if USSR.HasNoRequiredUnits() then
Greece.MarkCompletedObjective(BeatUSSR)
end
if Greece.Resources >= Greece.ResourceCapacity * 0.75 then
Greece.Cash = Greece.Cash + Greece.Resources - Greece.ResourceCapacity * 0.25
Greece.Resources = Greece.ResourceCapacity * 0.25
end
if RCheck then
RCheck = false
if Difficulty == "hard" then
Trigger.AfterDelay(DateTime.Seconds(150), ReinfArmor)
elseif Difficulty == "normal" then
Trigger.AfterDelay(DateTime.Minutes(5), ReinfArmor)
else
Trigger.AfterDelay(DateTime.Minutes(8), ReinfArmor)
end
end
end
WorldLoaded = function()
USSR = Player.GetPlayer("USSR")
Greece = Player.GetPlayer("Greece")
RunInitialActivities()
InitObjectives(USSR)
KillAll = AddPrimaryObjective(USSR, "defeat-allied-forces")
BeatUSSR = AddPrimaryObjective(Greece, "")
KillRadar = AddSecondaryObjective(USSR, "destroy-radar-dome-reinforcements")
Trigger.OnKilled(RadarDome, function()
USSR.MarkCompletedObjective(KillRadar)
Media.PlaySpeechNotification(USSR, "ObjectiveMet")
end)
Camera.Position = StartCamPoint.CenterPosition
end