diff --git a/OpenRA.Game/Traits/World/ActorMap.cs b/OpenRA.Game/Traits/World/ActorMap.cs
index fa6014a108..c259eb4b5f 100644
--- a/OpenRA.Game/Traits/World/ActorMap.cs
+++ b/OpenRA.Game/Traits/World/ActorMap.cs
@@ -137,11 +137,13 @@ namespace OpenRA.Traits
var entered = currentActors.Except(oldActors);
var exited = oldActors.Except(currentActors);
- foreach (var a in entered)
- onActorEntered(a);
+ if (onActorEntered != null)
+ foreach (var a in entered)
+ onActorEntered(a);
- foreach (var a in exited)
- onActorExited(a);
+ if (onActorExited != null)
+ foreach (var a in exited)
+ onActorExited(a);
Dirty = false;
}
diff --git a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj
index 30ee595c3d..0ac18fcaaf 100644
--- a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj
+++ b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj
@@ -408,6 +408,7 @@
+
diff --git a/OpenRA.Mods.RA/Scripting/Global/TriggerGlobal.cs b/OpenRA.Mods.RA/Scripting/Global/TriggerGlobal.cs
index e2c6c9838c..1c48768fa4 100644
--- a/OpenRA.Mods.RA/Scripting/Global/TriggerGlobal.cs
+++ b/OpenRA.Mods.RA/Scripting/Global/TriggerGlobal.cs
@@ -220,6 +220,68 @@ namespace OpenRA.Mods.RA.Scripting
GetScriptTriggers(a).RegisterCallback(Trigger.OnCapture, func, context);
}
+ [Desc("Call a function when this actor is killed or captured. " +
+ "The callback function will be called as func().")]
+ public void OnKilledOrCaptured(Actor a, LuaFunction func)
+ {
+ var called = false;
+
+ var copy = (LuaFunction)func.CopyReference();
+ Action OnKilledOrCaptured = m =>
+ {
+ try
+ {
+ if (called)
+ return;
+
+ copy.Call().Dispose();
+ copy.Dispose();
+ called = true;
+ }
+ catch (Exception e)
+ {
+ context.FatalError(e.Message);
+ }
+ };
+
+ GetScriptTriggers(a).OnCapturedInternal += OnKilledOrCaptured;
+ GetScriptTriggers(a).OnKilledInternal += OnKilledOrCaptured;
+ }
+
+ [Desc("Call a function when all of the actors in a group have been killed or captured. " +
+ "The callback function will be called as func().")]
+ public void OnAllKilledOrCaptured(Actor[] actors, LuaFunction func)
+ {
+ var group = actors.ToList();
+
+ var copy = (LuaFunction)func.CopyReference();
+ Action OnMemberKilledOrCaptured = m =>
+ {
+ try
+ {
+ if (!group.Contains(m))
+ return;
+
+ group.Remove(m);
+ if (!group.Any())
+ {
+ copy.Call().Dispose();
+ copy.Dispose();
+ }
+ }
+ catch (Exception e)
+ {
+ context.FatalError(e.Message);
+ }
+ };
+
+ foreach (var a in group)
+ {
+ GetScriptTriggers(a).OnCapturedInternal += OnMemberKilledOrCaptured;
+ GetScriptTriggers(a).OnKilledInternal += OnMemberKilledOrCaptured;
+ }
+ }
+
[Desc("Call a function when a ground-based actor enters this cell footprint." +
"Returns the trigger id for later removal using RemoveFootprintTrigger(int id)." +
"The callback function will be called as func(Actor a, int id).")]
@@ -278,6 +340,64 @@ namespace OpenRA.Mods.RA.Scripting
context.World.ActorMap.RemoveCellTrigger(id);
}
+ [Desc("Call a function when an actor enters this range." +
+ "Returns the trigger id for later removal using RemoveProximityTrigger(int id)." +
+ "The callback function will be called as func(Actor a, int id).")]
+ public int OnEnteredProximityTrigger(WPos pos, WRange range, LuaFunction func)
+ {
+ var triggerId = 0;
+ var onEntry = (LuaFunction)func.CopyReference();
+ Action invokeEntry = a =>
+ {
+ try
+ {
+ using (var luaActor = a.ToLuaValue(context))
+ using (var id = triggerId.ToLuaValue(context))
+ onEntry.Call(luaActor, id).Dispose();
+ }
+ catch (Exception e)
+ {
+ context.FatalError(e.Message);
+ }
+ };
+
+ triggerId = context.World.ActorMap.AddProximityTrigger(pos, range, invokeEntry, null);
+
+ return triggerId;
+ }
+
+ [Desc("Call a function when an actor leaves this range." +
+ "Returns the trigger id for later removal using RemoveProximityTrigger(int id)." +
+ "The callback function will be called as func(Actor a, int id).")]
+ public int OnExitedProximityTrigger(WPos pos, WRange range, LuaFunction func)
+ {
+ var triggerId = 0;
+ var onExit = (LuaFunction)func.CopyReference();
+ Action invokeExit = a =>
+ {
+ try
+ {
+ using (var luaActor = a.ToLuaValue(context))
+ using (var id = triggerId.ToLuaValue(context))
+ onExit.Call(luaActor, id).Dispose();
+ }
+ catch (Exception e)
+ {
+ context.FatalError(e.Message);
+ }
+ };
+
+ triggerId = context.World.ActorMap.AddProximityTrigger(pos, range, null, invokeExit);
+
+ return triggerId;
+ }
+
+ [Desc("Removes a previously created proximitry trigger.")]
+ public void RemoveProximityTrigger(int id)
+ {
+ context.World.ActorMap.RemoveProximityTrigger(id);
+ }
+
[Desc("Call a function when this actor is infiltrated. The callback function " +
"will be called as func(Actor self, Actor infiltrator).")]
public void OnInfiltrated(Actor a, LuaFunction func)
diff --git a/OpenRA.Mods.RA/Scripting/Properties/PowerProperties.cs b/OpenRA.Mods.RA/Scripting/Properties/PowerProperties.cs
new file mode 100644
index 0000000000..dd1fd455df
--- /dev/null
+++ b/OpenRA.Mods.RA/Scripting/Properties/PowerProperties.cs
@@ -0,0 +1,73 @@
+#region Copyright & License Information
+/*
+ * Copyright 2007-2014 The OpenRA Developers (see AUTHORS)
+ * 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. For more information,
+ * see COPYING.
+ */
+#endregion
+
+using System;
+using Eluant;
+using OpenRA.Mods.Common.Power;
+using OpenRA.Scripting;
+using OpenRA.Traits;
+
+namespace OpenRA.Mods.RA.Scripting
+{
+ [ScriptPropertyGroup("Power")]
+ public class PlayerPowerProperties : ScriptPlayerProperties, Requires
+ {
+ readonly PowerManager pm;
+
+ public PlayerPowerProperties(ScriptContext context, Player player)
+ : base(context, player)
+ {
+ pm = player.PlayerActor.Trait();
+ }
+
+ [Desc("Returns the total of the power the player has.")]
+ public int PowerProvided
+ {
+ get { return pm.PowerProvided; }
+ }
+
+ [Desc("Returns the power used by the player.")]
+ public int PowerDrained
+ {
+ get { return pm.PowerDrained; }
+ }
+
+ [Desc("Returns the player's power state " +
+ "(\"Normal\", \"Low\" or \"Critical\").")]
+ public string PowerState
+ {
+ get { return pm.PowerState.ToString(); }
+ }
+
+ [Desc("Triggers low power for the chosen amount of ticks.")]
+ public void TriggerPowerOutage(int ticks)
+ {
+ pm.TriggerPowerOutage(ticks);
+ }
+ }
+
+ [ScriptPropertyGroup("Power")]
+ public class ActorPowerProperties : ScriptActorProperties, Requires
+ {
+ readonly PowerInfo pi;
+
+ public ActorPowerProperties(ScriptContext context, Actor self)
+ : base(context, self)
+ {
+ pi = self.Info.Traits.GetOrDefault();
+ }
+
+ [Desc("Returns the power drained/provided by this actor.")]
+ public int Power
+ {
+ get { return pi.Amount; }
+ }
+ }
+}
\ No newline at end of file
diff --git a/OpenRA.Mods.RA/Scripting/ScriptTriggers.cs b/OpenRA.Mods.RA/Scripting/ScriptTriggers.cs
index ffbe4902b1..f2bcb6b922 100644
--- a/OpenRA.Mods.RA/Scripting/ScriptTriggers.cs
+++ b/OpenRA.Mods.RA/Scripting/ScriptTriggers.cs
@@ -32,6 +32,7 @@ namespace OpenRA.Mods.RA.Scripting
readonly World world;
public event Action OnKilledInternal = _ => { };
+ public event Action OnCapturedInternal = _ => { };
public event Action OnRemovedInternal = _ => { };
public event Action OnProducedInternal = (a, b) => { };
public event Action OnOtherProducedInternal = (a, b) => { };
@@ -236,6 +237,9 @@ namespace OpenRA.Mods.RA.Scripting
return;
}
}
+
+ // Run any internally bound callbacks
+ OnCapturedInternal(self);
}
public void Infiltrated(Actor self, Actor infiltrator)
diff --git a/OpenRA.Mods.RA/Widgets/Logic/MissionBrowserLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/MissionBrowserLogic.cs
index 2d15e169c4..46edd5bb62 100644
--- a/OpenRA.Mods.RA/Widgets/Logic/MissionBrowserLogic.cs
+++ b/OpenRA.Mods.RA/Widgets/Logic/MissionBrowserLogic.cs
@@ -27,6 +27,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
readonly ScrollPanelWidget descriptionPanel;
readonly LabelWidget description;
readonly SpriteFont descriptionFont;
+ readonly DropDownButtonWidget difficultyButton;
readonly ButtonWidget startVideoButton;
readonly ButtonWidget stopVideoButton;
readonly VqaPlayerWidget videoPlayer;
@@ -39,6 +40,8 @@ namespace OpenRA.Mods.RA.Widgets.Logic
bool showVideoPlayer;
+ string difficulty;
+
[ObjectCreator.UseCtor]
public MissionBrowserLogic(Widget widget, Action onStart, Action onExit)
{
@@ -67,6 +70,8 @@ namespace OpenRA.Mods.RA.Widgets.Logic
description = descriptionPanel.Get("MISSION_DESCRIPTION");
descriptionFont = Game.Renderer.Fonts[description.Font];
+ difficultyButton = widget.Get("DIFFICULTY_DROPDOWNBUTTON");
+
startVideoButton = widget.Get("START_VIDEO_BUTTON");
stopVideoButton = widget.Get("STOP_VIDEO_BUTTON");
stopVideoButton.IsVisible = () => showVideoPlayer;
@@ -176,6 +181,28 @@ namespace OpenRA.Mods.RA.Widgets.Logic
description.Bounds.Height = descriptionFont.Measure(text).Y;
descriptionPanel.ScrollToTop();
descriptionPanel.Layout.AdjustChildren();
+
+ difficultyButton.IsVisible = () => map.Options.Difficulties.Any();
+ if (!map.Options.Difficulties.Any())
+ return;
+
+ difficulty = map.Options.Difficulties.First();
+ difficultyButton.OnMouseDown = _ =>
+ {
+ var options = map.Options.Difficulties.Select(d => new DropDownOption
+ {
+ Title = d,
+ IsSelected = () => difficulty == d,
+ OnClick = () => difficulty = d
+ });
+ Func setupItem = (option, template) =>
+ {
+ var item = ScrollItemWidget.Setup(template, option.IsSelected, option.OnClick);
+ item.Get("LABEL").GetText = () => option.Title;
+ return item;
+ };
+ difficultyButton.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", options.Count() * 30, options, setupItem);
+ };
}
void StopVideo()
@@ -202,6 +229,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
Action lobbyReady = null;
lobbyReady = () =>
{
+ om.IssueOrder(Order.Command("difficulty {0}".F(difficulty)));
Game.LobbyInfoChanged -= lobbyReady;
onStart();
om.IssueOrder(Order.Command("state {0}".F(Session.ClientState.Ready)));
@@ -210,5 +238,12 @@ namespace OpenRA.Mods.RA.Widgets.Logic
om = Game.JoinServer(IPAddress.Loopback.ToString(), Game.CreateLocalServer(selectedMapPreview.Uid), "", false);
}
+
+ class DropDownOption
+ {
+ public string Title;
+ public Func IsSelected;
+ public Action OnClick;
+ }
}
}
diff --git a/OpenRA.sln b/OpenRA.sln
index 3cccb24b9b..36602c2f7a 100644
--- a/OpenRA.sln
+++ b/OpenRA.sln
@@ -49,6 +49,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Red Alert Lua scripts", "Re
mods\ra\maps\intervention\intervention.lua = mods\ra\maps\intervention\intervention.lua
mods\ra\maps\fort-lonestar\fort-lonestar.lua = mods\ra\maps\fort-lonestar\fort-lonestar.lua
mods\ra\maps\monster-tank-madness\monster-tank-madness.lua = mods\ra\maps\monster-tank-madness\monster-tank-madness.lua
+ mods\ra\maps\survival01\survival01.lua = mods\ra\maps\survival01\survival01.lua
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System Lua scripts", "System Lua scripts", "{A4D6AEA4-8009-4256-903B-8D227E50452B}"
diff --git a/mods/cnc/chrome/missionbrowser.yaml b/mods/cnc/chrome/missionbrowser.yaml
index c4e27df95b..992e2613d9 100644
--- a/mods/cnc/chrome/missionbrowser.yaml
+++ b/mods/cnc/chrome/missionbrowser.yaml
@@ -102,6 +102,13 @@ Container@MISSIONBROWSER_PANEL:
Height: 35
Text: Play
Font: Bold
+ DropDownButton@DIFFICULTY_DROPDOWNBUTTON:
+ X: PARENT_RIGHT - 290 - 150
+ Y: 376
+ Width: 140
+ Height: 35
+ Text: Difficulty
+ Font: Bold
Container@MISSION_BIN:
Children:
VqaPlayer@MISSION_VIDEO:
diff --git a/mods/ra/chrome/missionbrowser.yaml b/mods/ra/chrome/missionbrowser.yaml
index 65bfb17581..1200ec72d3 100644
--- a/mods/ra/chrome/missionbrowser.yaml
+++ b/mods/ra/chrome/missionbrowser.yaml
@@ -98,6 +98,13 @@ Background@MISSIONBROWSER_PANEL:
Text: Back
Font: Bold
Key: escape
+ DropDownButton@DIFFICULTY_DROPDOWNBUTTON:
+ X: PARENT_RIGHT - 140 - 130 - 150
+ Y: PARENT_BOTTOM - 45
+ Width: 140
+ Height: 25
+ Text: Difficulty
+ Font: Bold
Background@MISSION_BIN:
X: 20
Y: 50
diff --git a/mods/ra/maps/allies-02/allies02.lua b/mods/ra/maps/allies-02/allies02.lua
index ab0808283e..e4ab2a992a 100644
--- a/mods/ra/maps/allies-02/allies02.lua
+++ b/mods/ra/maps/allies-02/allies02.lua
@@ -115,6 +115,8 @@ WorldLoaded = function()
ukraine.AddPrimaryObjective("Destroy the convoy.")
end)
+ Trigger.AfterDelay(DateTime.Seconds(1), function() Media.PlaySpeechNotification(allies, "MissionTimerInitialised") end)
+
RunInitialActivities()
SendConstructionVehicleReinforcements()
diff --git a/mods/ra/maps/intervention/intervention.lua b/mods/ra/maps/intervention/intervention.lua
index 1c7d862900..192222c144 100644
--- a/mods/ra/maps/intervention/intervention.lua
+++ b/mods/ra/maps/intervention/intervention.lua
@@ -9,11 +9,21 @@ BeachheadTrigger =
CPos.New(137, 104), CPos.New(137, 105), CPos.New(137, 106), CPos.New(136, 106), CPos.New(136, 107)
}
-BaseRaidInterval = DateTime.Minutes(3)
-BaseFrontAttackInterval = DateTime.Minutes(3) + DateTime.Seconds(30)
-BaseRearAttackInterval = DateTime.Minutes(8)
-UBoatPatrolDelay = DateTime.Minutes(2) + DateTime.Seconds(30)
-BaseFrontAttackWpts = { PatrolWpt1.Location, BaseRaidWpt1.Location }
+Difficulty = Map.Difficulty
+
+if Difficulty == "Medium" then
+ BaseRaidInterval = DateTime.Minutes(3)
+ BaseFrontAttackInterval = DateTime.Minutes(3) + DateTime.Seconds(30)
+ BaseRearAttackInterval = DateTime.Minutes(8)
+ UBoatPatrolDelay = DateTime.Minutes(2) + DateTime.Seconds(30)
+ BaseFrontAttackWpts = { PatrolWpt1.Location, BaseRaidWpt1.Location }
+else
+ BaseRaidInterval = DateTime.Minutes(2)
+ BaseFrontAttackInterval = DateTime.Minutes(2) + DateTime.Seconds(30)
+ BaseRearAttackInterval = DateTime.Minutes(5)
+ UBoatPatrolDelay = DateTime.Minutes(2)
+ BaseFrontAttackWpts = { PatrolWpt1.Location }
+end
Village = { FarmHouse1, FarmHouse2, FarmHouse3, FarmHouse4, FarmHouse5, FarmHouse6, FarmHouse7, FarmHouse8, FarmHouse9, Church }
VillageRaidInterval = DateTime.Minutes(3)
@@ -224,7 +234,7 @@ WorldLoaded = function()
sovietObjective = soviets.AddPrimaryObjective("Destroy the village.")
villageObjective = player.AddPrimaryObjective("Save the village.")
- beachheadObjective = player.AddSecondaryObjective("Get your MCV to the main island.")
+ beachheadObjective = player.AddPrimaryObjective("Get your MCV to the main island.")
beachheadTrigger = false
Trigger.OnExitedFootprint(BeachheadTrigger, function(a, id)
@@ -234,6 +244,17 @@ WorldLoaded = function()
player.MarkCompletedObjective(beachheadObjective)
captureObjective = player.AddPrimaryObjective("Locate and capture the enemy's Air Force HQ.")
+
+ if AirForceHQ.IsDead then
+ player.MarkFailedObjective(captureObjective)
+ return
+ end
+ if AirForceHQ.Owner == player then
+ player.MarkCompletedObjective(captureObjective)
+ player.MarkCompletedObjective(villageObjective)
+ return
+ end
+
Trigger.OnCapture(AirForceHQ, function()
Trigger.AfterDelay(DateTime.Seconds(3), function()
player.MarkCompletedObjective(captureObjective)
@@ -242,6 +263,8 @@ WorldLoaded = function()
end)
Trigger.OnKilled(AirForceHQ, function() player.MarkFailedObjective(captureObjective) end)
+ Actor.Create("mainland", true, { Owner = player })
+
Trigger.AfterDelay(BaseFrontAttackInterval, function()
Build(BaseFrontAttackUnits, BaseFrontAttack)
ParadropSovietUnits()
diff --git a/mods/ra/maps/intervention/map.yaml b/mods/ra/maps/intervention/map.yaml
index 238a9a0c31..73252e6c76 100644
--- a/mods/ra/maps/intervention/map.yaml
+++ b/mods/ra/maps/intervention/map.yaml
@@ -2248,10 +2248,23 @@ Rules:
E6:
Buildable:
Prerequisites: ~disabled
- HPAD:
+ TENT:
+ Buildable:
+ Prerequisites: anypower, ~structures.allies, ~techlevel.infonly, mainland
+ DOME:
+ Buildable:
+ Prerequisites: proc, ~techlevel.medium, mainland
+ WEAP:
+ Buildable:
+ Prerequisites: proc, ~techlevel.low, mainland
ProvidesCustomPrerequisite:
Prerequisite: givefix
- WEAP:
+ MAINLAND:
+ Tooltip:
+ Name: Reach the mainland
+ ProvidesCustomPrerequisite:
+ Prerequisite: mainland
+ HPAD:
ProvidesCustomPrerequisite:
Prerequisite: givefix
FIX:
diff --git a/mods/ra/maps/survival01/map.bin b/mods/ra/maps/survival01/map.bin
new file mode 100644
index 0000000000..942e6c2de7
Binary files /dev/null and b/mods/ra/maps/survival01/map.bin differ
diff --git a/mods/ra/maps/survival01/map.png b/mods/ra/maps/survival01/map.png
new file mode 100644
index 0000000000..aaa1507d66
Binary files /dev/null and b/mods/ra/maps/survival01/map.png differ
diff --git a/mods/ra/maps/survival01/map.yaml b/mods/ra/maps/survival01/map.yaml
new file mode 100644
index 0000000000..a8f77c20d1
--- /dev/null
+++ b/mods/ra/maps/survival01/map.yaml
@@ -0,0 +1,1367 @@
+Selectable: False
+
+MapFormat: 6
+
+RequiresMod: ra
+
+Title: Survival 01
+
+Description: LANDCOM 66 HQS.\nTOP SECRET.\nTO: FIELD COMMANDER A34\n\nTHE SOVIETS STARTED HEAVY ATTACKS AT OUR POSITION.\n SURVIVE AND HOLD THE BASE UNTIL OUR FRENCH ALLIES ARRIVE.\n\nCONFIRMATION CODE 5593.\n\nTRANSMISSION ENDS.
+
+Author: Nuke'm Bro
+
+Tileset: TEMPERAT
+
+MapSize: 96,64
+
+Bounds: 4,4,88,56
+
+UseAsShellmap: False
+
+Type: Mission
+
+Options:
+ Crates: False
+ Fog: True
+ Shroud: True
+ AllyBuildRadius: False
+ FragileAlliances: False
+ StartingCash: 5000
+ ConfigurableStartingUnits: False
+ Difficulties: Easy, Medium, Hard
+
+Players:
+ PlayerReference@Neutral:
+ Name: Neutral
+ OwnsWorld: True
+ NonCombatant: True
+ Race: allies
+ PlayerReference@Allies:
+ Name: Allies
+ Playable: True
+ AllowBots: False
+ Required: True
+ LockRace: True
+ Race: allies
+ LockColor: True
+ ColorRamp: 115,240,130
+ LockSpawn: True
+ LockTeam: True
+ Enemies: Soviets
+ PlayerReference@Soviets:
+ Name: Soviets
+ Race: soviet
+ ColorRamp: 0,255,128
+ Enemies: Allies
+
+Actors:
+ Actor113: fenc
+ Location: 46,54
+ Owner: Allies
+ Actor115: fenc
+ Location: 46,55
+ Owner: Allies
+ Actor88: brik
+ Location: 48,54
+ Owner: Allies
+ Actor84: hpad
+ Location: 66,47
+ Owner: Allies
+ Actor5: brik
+ Location: 72,55
+ Owner: Allies
+ Actor4: brik
+ Location: 72,54
+ Owner: Allies
+ Actor6: brik
+ Location: 72,53
+ Owner: Allies
+ Actor77: brik
+ Location: 67,57
+ Owner: Allies
+ Actor8: brik
+ Location: 72,52
+ Owner: Allies
+ Actor9: brik
+ Location: 72,51
+ Owner: Allies
+ Actor13: brik
+ Location: 75,50
+ Owner: Allies
+ Actor12: brik
+ Location: 75,51
+ Owner: Allies
+ Actor11: brik
+ Location: 74,51
+ Owner: Allies
+ Actor10: brik
+ Location: 73,51
+ Owner: Allies
+ Actor14: brik
+ Location: 75,49
+ Owner: Allies
+ Actor15: brik
+ Location: 75,48
+ Owner: Allies
+ Actor16: brik
+ Location: 76,48
+ Owner: Allies
+ Actor17: brik
+ Location: 76,47
+ Owner: Allies
+ Actor18: brik
+ Location: 75,47
+ Owner: Allies
+ Actor19: brik
+ Location: 75,41
+ Owner: Allies
+ Actor20: brik
+ Location: 75,42
+ Owner: Allies
+ Actor21: brik
+ Location: 76,42
+ Owner: Allies
+ Actor22: brik
+ Location: 76,41
+ Owner: Allies
+ Actor23: brik
+ Location: 74,41
+ Owner: Allies
+ Actor24: brik
+ Location: 73,41
+ Owner: Allies
+ Actor25: brik
+ Location: 72,41
+ Owner: Allies
+ Actor26: brik
+ Location: 71,41
+ Owner: Allies
+ Actor27: brik
+ Location: 71,40
+ Owner: Allies
+ Actor28: brik
+ Location: 70,40
+ Owner: Allies
+ Actor29: brik
+ Location: 70,41
+ Owner: Allies
+ Actor30: brik
+ Location: 61,40
+ Owner: Allies
+ Actor31: brik
+ Location: 61,41
+ Owner: Allies
+ Actor83: hpad
+ Location: 57,48
+ Owner: Allies
+ Actor33: brik
+ Location: 60,40
+ Owner: Allies
+ Actor1: brik
+ Location: 57,56
+ Owner: Allies
+ Actor35: brik
+ Location: 59,40
+ Owner: Allies
+ Actor36: brik
+ Location: 58,40
+ Owner: Allies
+ Actor37: brik
+ Location: 57,40
+ Owner: Allies
+ Actor38: brik
+ Location: 57,41
+ Owner: Allies
+ Actor39: brik
+ Location: 56,41
+ Owner: Allies
+ Actor40: brik
+ Location: 55,41
+ Owner: Allies
+ Actor41: brik
+ Location: 54,41
+ Owner: Allies
+ Actor42: brik
+ Location: 53,41
+ Owner: Allies
+ Actor43: brik
+ Location: 53,42
+ Owner: Allies
+ Actor44: brik
+ Location: 52,42
+ Owner: Allies
+ Actor45: brik
+ Location: 51,42
+ Owner: Allies
+ Actor46: brik
+ Location: 50,42
+ Owner: Allies
+ Actor47: brik
+ Location: 49,42
+ Owner: Allies
+ Actor48: brik
+ Location: 48,42
+ Owner: Allies
+ Actor49: brik
+ Location: 48,43
+ Owner: Allies
+ Actor50: brik
+ Location: 49,43
+ Owner: Allies
+ Actor51: brik
+ Location: 48,52
+ Owner: Allies
+ Actor52: brik
+ Location: 48,51
+ Owner: Allies
+ Actor53: brik
+ Location: 48,50
+ Owner: Allies
+ Actor54: brik
+ Location: 48,49
+ Owner: Allies
+ Actor55: brik
+ Location: 48,48
+ Owner: Allies
+ Actor71: brik
+ Location: 64,56
+ Owner: Allies
+ Actor58: brik
+ Location: 46,47
+ Owner: Allies
+ Actor57: brik
+ Location: 46,48
+ Owner: Allies
+ Actor56: brik
+ Location: 47,48
+ Owner: Allies
+ Actor59: brik
+ Location: 47,47
+ Owner: Allies
+ Actor72: brik
+ Location: 64,57
+ Owner: Allies
+ Actor65: brik
+ Location: 51,57
+ Owner: Allies
+ Actor66: brik
+ Location: 50,57
+ Owner: Allies
+ Actor61: brik
+ Location: 55,57
+ Owner: Allies
+ Actor2: brik
+ Location: 57,57
+ Owner: Allies
+ Actor34: brik
+ Location: 56,57
+ Owner: Allies
+ Actor62: brik
+ Location: 54,57
+ Owner: Allies
+ Actor74: brik
+ Location: 63,56
+ Owner: Allies
+ Actor79: brik
+ Location: 65,57
+ Owner: Allies
+ Actor80: apwr
+ Location: 68,53
+ Owner: Allies
+ Actor81: powr
+ Location: 65,53
+ Owner: Allies
+ Actor63: brik
+ Location: 53,57
+ Owner: Allies
+ Actor64: brik
+ Location: 52,57
+ Owner: Allies
+ Actor68: brik
+ Location: 72,57
+ Owner: Allies
+ Actor73: brik
+ Location: 63,57
+ Owner: Allies
+ Actor69: brik
+ Location: 71,57
+ Owner: Allies
+ Actor76: brik
+ Location: 68,57
+ Owner: Allies
+ Actor78: brik
+ Location: 66,57
+ Owner: Allies
+ Actor75: brik
+ Location: 69,57
+ Owner: Allies
+ Actor70: brik
+ Location: 70,57
+ Owner: Allies
+ Actor7: brik
+ Location: 72,56
+ Owner: Allies
+ Actor60: brik
+ Location: 56,56
+ Owner: Allies
+ Actor 408: weap
+ Location: 53,46
+ Owner: Allies
+ Actor32: tent
+ Location: 62,47
+ Owner: Allies
+ Actor0: brik
+ Location: 48,53
+ Owner: Allies
+ Actor111: proc
+ Location: 43,55
+ Owner: Allies
+ Actor112: fenc
+ Location: 45,54
+ Owner: Allies
+ Actor116: fenc
+ Location: 46,56
+ Owner: Allies
+ Actor89: fenc
+ Location: 65,46
+ Owner: Allies
+ Actor90: fenc
+ Location: 66,46
+ Owner: Allies
+ Actor91: fenc
+ Location: 67,46
+ Owner: Allies
+ Actor92: fenc
+ Location: 68,46
+ Owner: Allies
+ Actor93: fenc
+ Location: 68,47
+ Owner: Allies
+ Actor94: fenc
+ Location: 68,48
+ Owner: Allies
+ Actor95: fenc
+ Location: 68,49
+ Owner: Allies
+ Actor96: fenc
+ Location: 57,47
+ Owner: Allies
+ Actor97: fenc
+ Location: 58,47
+ Owner: Allies
+ Actor98: fenc
+ Location: 59,47
+ Owner: Allies
+ Actor99: fenc
+ Location: 59,48
+ Owner: Allies
+ Actor100: fenc
+ Location: 59,49
+ Owner: Allies
+ Actor101: fix
+ Location: 50,52
+ Owner: Allies
+ Actor102: dome
+ Location: 55,53
+ Owner: Allies
+ Actor103: powr
+ Location: 58,41
+ Owner: Allies
+ Actor104: apwr
+ Location: 71,47
+ Owner: Allies
+ Actor105: fact
+ Location: 59,51
+ Owner: Allies
+ Actor106: powr
+ Location: 55,42
+ Owner: Allies
+ Actor107: gun
+ Location: 64,42
+ Owner: Allies
+ Actor108: pbox
+ Location: 67,42
+ Owner: Allies
+ Actor109: pbox
+ Location: 74,45
+ Owner: Allies
+ Actor110: gun
+ Location: 50,45
+ Owner: Allies
+ Actor114: fenc
+ Location: 44,54
+ Owner: Allies
+ Actor118: fenc
+ Location: 42,57
+ Owner: Allies
+ Actor117: fenc
+ Location: 46,57
+ Owner: Allies
+ Actor67: brik
+ Location: 49,57
+ Owner: Allies
+ Actor82: brik
+ Location: 48,57
+ Owner: Allies
+ Actor85: brik
+ Location: 48,56
+ Owner: Allies
+ Actor87: brik
+ Location: 48,55
+ Owner: Allies
+ Actor86: brik
+ Location: 49,56
+ Owner: Allies
+ Actor119: fenc
+ Location: 42,56
+ Owner: Allies
+ Actor120: mine
+ Location: 30,58
+ Owner: Neutral
+ Actor121: oilb
+ Location: 43,38
+ Owner: Neutral
+ Actor122: oilb
+ Location: 36,37
+ Owner: Neutral
+ Actor124: oilb
+ Location: 88,46
+ Owner: Allies
+ Actor123: oilb
+ Location: 80,46
+ Owner: Allies
+ Actor130: fenc
+ Location: 88,48
+ Owner: Neutral
+ Actor129: fenc
+ Location: 89,48
+ Owner: Neutral
+ Actor125: fenc
+ Location: 90,45
+ Owner: Neutral
+ Actor127: fenc
+ Location: 90,47
+ Owner: Neutral
+ Actor126: fenc
+ Location: 90,46
+ Owner: Neutral
+ Actor128: fenc
+ Location: 90,48
+ Owner: Neutral
+ Actor131: fenc
+ Location: 87,48
+ Owner: Neutral
+ Actor141: fenc
+ Location: 78,11
+ Owner: Neutral
+ Sam3: sam
+ Location: 76,11
+ Owner: Soviets
+ SovietAirfield1: afld.mission
+ Location: 86,5
+ Owner: Soviets
+ SovietAirfield2: afld.mission
+ Location: 80,6
+ Owner: Soviets
+ SovietAirfield3: afld.mission
+ Location: 75,5
+ Owner: Soviets
+ Actor160: fenc
+ Location: 77,4
+ Owner: Neutral
+ Actor159: fenc
+ Location: 76,4
+ Owner: Neutral
+ Actor162: fenc
+ Location: 74,4
+ Owner: Neutral
+ Actor161: fenc
+ Location: 78,4
+ Owner: Neutral
+ Actor136: fenc
+ Location: 75,11
+ Owner: Neutral
+ Actor137: fenc
+ Location: 75,10
+ Owner: Neutral
+ Actor138: fenc
+ Location: 76,10
+ Owner: Neutral
+ Actor139: fenc
+ Location: 77,10
+ Owner: Neutral
+ Actor140: fenc
+ Location: 78,10
+ Owner: Neutral
+ Actor143: barl
+ Location: 79,6
+ Owner: Soviets
+ Actor144: brl3
+ Location: 74,5
+ Owner: Soviets
+ Actor145: brl3
+ Location: 75,7
+ Owner: Soviets
+ Actor146: barl
+ Location: 74,6
+ Owner: Soviets
+ Actor147: barl
+ Location: 80,5
+ Owner: Soviets
+ Actor148: brl3
+ Location: 84,6
+ Owner: Soviets
+ Actor149: brl3
+ Location: 85,5
+ Owner: Soviets
+ Actor150: brl3
+ Location: 83,6
+ Owner: Soviets
+ Actor151: barl
+ Location: 84,5
+ Owner: Soviets
+ Actor142: brl3
+ Location: 79,5
+ Owner: Soviets
+ Actor152: barl
+ Location: 82,6
+ Owner: Soviets
+ Actor153: barl
+ Location: 84,7
+ Owner: Soviets
+ Actor154: barl
+ Location: 85,6
+ Owner: Soviets
+ Actor155: barl
+ Location: 89,5
+ Owner: Soviets
+ Actor171: fenc
+ Location: 87,4
+ Owner: Neutral
+ Actor172: fenc
+ Location: 88,4
+ Owner: Neutral
+ Actor156: brl3
+ Location: 90,5
+ Owner: Soviets
+ Actor170: fenc
+ Location: 86,4
+ Owner: Neutral
+ Actor169: fenc
+ Location: 85,4
+ Owner: Neutral
+ Actor158: fenc
+ Location: 75,4
+ Owner: Neutral
+ Actor168: fenc
+ Location: 84,4
+ Owner: Neutral
+ Actor157: barl
+ Location: 90,6
+ Owner: Soviets
+ Actor167: fenc
+ Location: 83,4
+ Owner: Neutral
+ Actor166: fenc
+ Location: 82,4
+ Owner: Neutral
+ Actor165: fenc
+ Location: 81,4
+ Owner: Neutral
+ Actor164: fenc
+ Location: 80,4
+ Owner: Neutral
+ Actor163: fenc
+ Location: 79,4
+ Owner: Neutral
+ Actor173: fenc
+ Location: 89,4
+ Owner: Neutral
+ Actor174: fenc
+ Location: 90,4
+ Owner: Neutral
+ Actor175: fenc
+ Location: 91,4
+ Owner: Neutral
+ Actor176: fenc
+ Location: 91,5
+ Owner: Neutral
+ Actor177: fenc
+ Location: 91,6
+ Owner: Neutral
+ Actor178: fenc
+ Location: 91,7
+ Owner: Neutral
+ Actor179: fenc
+ Location: 91,8
+ Owner: Neutral
+ Actor180: fenc
+ Location: 90,8
+ Owner: Neutral
+ Actor181: fenc
+ Location: 90,7
+ Owner: Neutral
+ Refinery: proc
+ Location: 81,11
+ Owner: Soviets
+ Actor187: t11
+ Location: 69,10
+ Owner: Neutral
+ Actor186: t16
+ Location: 58,6
+ Owner: Neutral
+ Actor185: tc04
+ Location: 57,8
+ Owner: Neutral
+ Actor184: mine
+ Location: 85,22
+ Owner: Neutral
+ Actor188: tc01
+ Location: 69,6
+ Owner: Neutral
+ Actor189: t12
+ Location: 62,13
+ Owner: Neutral
+ Actor193: fenc
+ Location: 75,16
+ Owner: Neutral
+ Actor194: fenc
+ Location: 75,15
+ Owner: Neutral
+ Actor191: fenc
+ Location: 74,15
+ Owner: Neutral
+ Actor192: fenc
+ Location: 74,16
+ Owner: Neutral
+ FlameTower3: ftur
+ Location: 78,17
+ Owner: Soviets
+ Actor190: fenc
+ Location: 74,14
+ Owner: Neutral
+ AdvancedPowerPlant3: apwr
+ Location: 88,12
+ Owner: Soviets
+ Silo1: silo
+ Location: 84,13
+ Owner: Soviets
+ Silo2: silo
+ Location: 84,12
+ Owner: Soviets
+ Actor199: e1
+ Location: 79,15
+ Owner: Soviets
+ Actor200: e2
+ Location: 81,17
+ Owner: Soviets
+ Actor201: v2rl
+ Location: 76,15
+ Owner: Soviets
+ Actor202: tc04
+ Location: 4,15
+ Owner: Neutral
+ Actor203: tc01
+ Location: 7,17
+ Owner: Neutral
+ Actor204: t15
+ Location: 9,16
+ Owner: Neutral
+ Actor205: tc05
+ Location: 4,26
+ Owner: Neutral
+ Actor206: tc02
+ Location: 5,24
+ Owner: Neutral
+ Actor207: tc04
+ Location: 7,25
+ Owner: Neutral
+ Actor208: tc03
+ Location: 40,21
+ Owner: Neutral
+ Sam1: sam
+ Location: 62,27
+ Owner: Soviets
+ Actor210: tc04
+ Location: 34,22
+ Owner: Neutral
+ Actor211: tc02
+ Location: 32,33
+ Owner: Neutral
+ Actor212: t16
+ Location: 35,33
+ Owner: Neutral
+ Actor213: t11
+ Location: 49,37
+ Owner: Neutral
+ Actor214: tc04
+ Location: 82,39
+ Owner: Neutral
+ Actor215: tc01
+ Location: 89,39
+ Owner: Neutral
+ Actor216: tc05
+ Location: 85,39
+ Owner: Neutral
+ Actor217: t16
+ Location: 80,41
+ Owner: Neutral
+ Actor218: fenc
+ Location: 79,48
+ Owner: Neutral
+ Actor219: fenc
+ Location: 80,48
+ Owner: Neutral
+ Actor220: fenc
+ Location: 81,48
+ Owner: Neutral
+ Actor221: fenc
+ Location: 82,48
+ Owner: Neutral
+ Actor222: fenc
+ Location: 82,47
+ Owner: Neutral
+ Actor223: tc02
+ Location: 21,41
+ Owner: Neutral
+ Actor224: tc04
+ Location: 35,43
+ Owner: Neutral
+ Actor225: tc02
+ Location: 38,44
+ Owner: Neutral
+ Actor226: t16
+ Location: 38,42
+ Owner: Neutral
+ Actor227: t13
+ Location: 44,33
+ Owner: Neutral
+ Actor228: t02
+ Location: 39,31
+ Owner: Neutral
+ Actor229: tc04
+ Location: 54,13
+ Owner: Neutral
+ Actor230: t07
+ Location: 47,12
+ Owner: Neutral
+ Actor235: brik
+ Location: 12,18
+ Owner: Neutral
+ Actor267: brik
+ Location: 33,17
+ Owner: Neutral
+ Actor237: brik
+ Location: 11,19
+ Owner: Neutral
+ Actor231: brik
+ Location: 11,16
+ Owner: Neutral
+ Actor238: brik
+ Location: 12,19
+ Owner: Neutral
+ Actor232: brik
+ Location: 11,17
+ Owner: Neutral
+ FlameTower1: ftur
+ Location: 23,16
+ Owner: Soviets
+ FlameTower2: ftur
+ Location: 29,13
+ Owner: Soviets
+ Actor307: v2rl
+ Location: 31,9
+ Owner: Soviets
+ Actor306: v2rl
+ Location: 31,18
+ Owner: Soviets
+ RadarDome: dome
+ Location: 14,16
+ Owner: Soviets
+ AdvancedPowerPlant1: apwr
+ Location: 24,5
+ Owner: Soviets
+ Actor234: brik
+ Location: 12,16
+ Owner: Neutral
+ Actor233: brik
+ Location: 12,17
+ Owner: Neutral
+ Actor236: brik
+ Location: 11,18
+ Owner: Neutral
+ Actor293: brik
+ Location: 25,4
+ Owner: Neutral
+ Actor291: brik
+ Location: 26,4
+ Owner: Neutral
+ Actor295: brik
+ Location: 23,4
+ Owner: Neutral
+ Actor294: brik
+ Location: 24,4
+ Owner: Neutral
+ Actor290: brik
+ Location: 27,4
+ Owner: Neutral
+ Actor289: brik
+ Location: 28,4
+ Owner: Neutral
+ Actor288: brik
+ Location: 29,4
+ Owner: Neutral
+ Actor287: brik
+ Location: 30,4
+ Owner: Neutral
+ Actor286: brik
+ Location: 31,4
+ Owner: Neutral
+ Actor285: brik
+ Location: 32,5
+ Owner: Neutral
+ Actor284: brik
+ Location: 32,4
+ Owner: Neutral
+ Actor283: brik
+ Location: 33,4
+ Owner: Neutral
+ Actor261: brik
+ Location: 29,19
+ Owner: Neutral
+ Actor262: brik
+ Location: 30,19
+ Owner: Neutral
+ Actor260: brik
+ Location: 28,19
+ Owner: Neutral
+ Actor265: brik
+ Location: 32,18
+ Owner: Neutral
+ Actor259: brik
+ Location: 27,19
+ Owner: Neutral
+ Sam2: sam
+ Location: 17,31
+ Owner: Soviets
+ Actor264: brik
+ Location: 32,19
+ Owner: Neutral
+ Actor246: brik
+ Location: 14,19
+ Owner: Neutral
+ Actor242: brik
+ Location: 13,19
+ Owner: Neutral
+ Actor263: brik
+ Location: 31,19
+ Owner: Neutral
+ Actor266: brik
+ Location: 33,18
+ Owner: Neutral
+ Actor247: brik
+ Location: 15,19
+ Owner: Neutral
+ Actor248: brik
+ Location: 16,19
+ Owner: Neutral
+ Actor249: brik
+ Location: 17,19
+ Owner: Neutral
+ Actor251: brik
+ Location: 19,19
+ Owner: Neutral
+ Actor250: brik
+ Location: 18,19
+ Owner: Neutral
+ Actor254: brik
+ Location: 19,18
+ Owner: Neutral
+ Actor253: brik
+ Location: 20,18
+ Owner: Neutral
+ Actor252: brik
+ Location: 20,19
+ Owner: Neutral
+ Actor281: brik
+ Location: 33,6
+ Owner: Neutral
+ Actor277: brik
+ Location: 33,9
+ Owner: Neutral
+ Actor276: brik
+ Location: 32,10
+ Owner: Neutral
+ Actor270: brik
+ Location: 33,15
+ Owner: Neutral
+ Actor278: brik
+ Location: 33,8
+ Owner: Neutral
+ Actor275: brik
+ Location: 33,10
+ Owner: Neutral
+ Actor274: brik
+ Location: 33,11
+ Owner: Neutral
+ Actor273: brik
+ Location: 32,15
+ Owner: Neutral
+ Actor271: brik
+ Location: 32,16
+ Owner: Neutral
+ Actor282: brik
+ Location: 33,5
+ Owner: Neutral
+ Actor272: brik
+ Location: 32,11
+ Owner: Neutral
+ Actor279: brik
+ Location: 33,7
+ Owner: Neutral
+ Actor269: brik
+ Location: 33,16
+ Owner: Neutral
+ Actor268: brik
+ Location: 33,19
+ Owner: Neutral
+ WarFactory: weap
+ Location: 22,12
+ Owner: Soviets
+ AdvancedPowerPlant2: apwr
+ Location: 16,13
+ Owner: Soviets
+ Actor258: brik
+ Location: 26,18
+ Owner: Neutral
+ Actor255: brik
+ Location: 25,18
+ Owner: Neutral
+ Actor256: brik
+ Location: 25,19
+ Owner: Neutral
+ Actor257: brik
+ Location: 26,19
+ Owner: Neutral
+ Actor309: e1
+ Location: 52,44
+ Owner: Allies
+ Barrack1: barr
+ Location: 28,7
+ Owner: Soviets
+ Actor305: v2rl
+ Location: 17,18
+ Owner: Soviets
+ Actor304: e3
+ Location: 17,17
+ Owner: Soviets
+ Actor303: e1
+ Location: 29,15
+ Owner: Soviets
+ Actor300: e1
+ Location: 25,16
+ Owner: Soviets
+ Actor301: e2
+ Location: 21,17
+ Owner: Soviets
+ Actor302: e3
+ Location: 28,10
+ Owner: Soviets
+ Sam4: sam
+ Location: 29,17
+ Owner: Soviets
+ Actor310: e1
+ Location: 50,47
+ Owner: Allies
+ Actor311: e1
+ Location: 62,43
+ Owner: Allies
+ Actor312: e1
+ Location: 64,44
+ Owner: Allies
+ Actor313: e3
+ Location: 66,44
+ Owner: Allies
+ Actor314: e1
+ Location: 69,43
+ Owner: Allies
+ Actor315: e1
+ Location: 73,43
+ Owner: Allies
+ Actor316: jeep
+ Location: 54,49
+ Owner: Allies
+ Actor317: 1tnk
+ Location: 69,45
+ Owner: Allies
+ Actor318: 1tnk
+ Location: 52,46
+ Owner: Allies
+ Actor296: tc02
+ Location: 73,32
+ Owner: Neutral
+ Actor298: tc01
+ Location: 77,34
+ Owner: Neutral
+ Actor299: tc04
+ Location: 83,35
+ Owner: Neutral
+ Actor308: tc01
+ Location: 86,35
+ Owner: Neutral
+ Actor319: t07
+ Location: 90,27
+ Owner: Neutral
+ Actor320: tc01
+ Location: 80,26
+ Owner: Neutral
+ Actor321: brik
+ Location: 60,41
+ Owner: Allies
+ Actor135: e1
+ Location: 63,39
+ Owner: Soviets
+ Actor209: e2
+ Location: 65,40
+ Owner: Soviets
+ Actor280: e1
+ Location: 68,40
+ Owner: Soviets
+ Actor292: e1
+ Location: 76,44
+ Owner: Soviets
+ Actor322: e2
+ Location: 78,46
+ Owner: Soviets
+ Actor323: e1
+ Location: 46,44
+ Owner: Soviets
+ Actor324: e3
+ Location: 45,46
+ Owner: Soviets
+ Actor325: e3
+ Location: 66,39
+ Owner: Soviets
+ Actor326: v2rl
+ Location: 61,37
+ Owner: Soviets
+ Actor327: brl3
+ Location: 79,47
+ Owner: Allies
+ Actor328: barl
+ Location: 79,46
+ Owner: Allies
+ Actor329: brl3
+ Location: 87,45
+ Owner: Allies
+ Actor330: barl
+ Location: 87,46
+ Owner: Allies
+ Actor331: barl
+ Location: 88,45
+ Owner: Allies
+ Actor332: oilb
+ Location: 74,53
+ Owner: Allies
+ Actor333: fenc
+ Location: 73,55
+ Owner: Allies
+ Actor334: fenc
+ Location: 74,55
+ Owner: Allies
+ Actor335: fenc
+ Location: 75,55
+ Owner: Allies
+ Actor336: fenc
+ Location: 75,52
+ Owner: Allies
+ Actor337: fenc
+ Location: 76,52
+ Owner: Allies
+ Actor338: fenc
+ Location: 74,52
+ Owner: Allies
+ Actor339: brl3
+ Location: 73,53
+ Owner: Allies
+ Actor340: barl
+ Location: 73,52
+ Owner: Allies
+ SubPen: spen
+ Location: 13,9
+ Owner: Soviets
+ Actor297: brik
+ Location: 22,4
+ Owner: Neutral
+ Actor341: brik
+ Location: 21,4
+ Owner: Neutral
+ Actor342: brik
+ Location: 21,5
+ Owner: Neutral
+ Actor343: brik
+ Location: 22,5
+ Owner: Neutral
+ Actor346: t15
+ Location: 57,24
+ Owner: Neutral
+ Actor1000: camera.large
+ Location: 1,1
+ Owner: Soviets
+ BadgerEntryPoint1: waypoint
+ Location: 1,54
+ Owner: Neutral
+ BadgerEntryPoint2: waypoint
+ Location: 1,47
+ Owner: Neutral
+ ParaDrop1: waypoint
+ Location: 54,51
+ Owner: Neutral
+ ParaDrop2: waypoint
+ Location: 67,51
+ Owner: Neutral
+ Alliesbase: waypoint
+ Location: 60,48
+ Owner: Neutral
+ Alliesbase1: waypoint
+ Location: 66,45
+ Owner: Neutral
+ Alliesbase2: waypoint
+ Location: 51,46
+ Owner: Neutral
+ Alliesbase3: waypoint
+ Location: 72,45
+ Owner: Neutral
+ AlliesEntryPoint: waypoint
+ Location: 60,59
+ Owner: Neutral
+ AlliesBaseGate1: waypoint
+ Location: 64,33
+ Owner: Neutral
+ AlliesBaseGate2: waypoint
+ Location: 42,42
+ Owner: Neutral
+ SovietEntryPoint1: waypoint
+ Location: 4,31
+ Owner: Neutral
+ SovietEntryPoint2: waypoint
+ Location: 4,21
+ Owner: Neutral
+ SovietEntryPoint3: waypoint
+ Location: 37,4
+ Owner: Neutral
+ SovietEntryPoint4: waypoint
+ Location: 65,4
+ Owner: Neutral
+ SovietEntryPoint5: waypoint
+ Location: 91,19
+ Owner: Neutral
+ SovietEntryPoint7: waypoint
+ Location: 91,43
+ Owner: Neutral
+ SovietRallyPoint1: waypoint
+ Location: 23,39
+ Owner: Neutral
+ SovietRallyPoint2: waypoint
+ Location: 23,21
+ Owner: Neutral
+ SovietRallyPoint3: waypoint
+ Location: 37,13
+ Owner: Neutral
+ SovietRallyPoint4: waypoint
+ Location: 65,13
+ Owner: Neutral
+ SovietRallyPoint5: waypoint
+ Location: 80,19
+ Owner: Neutral
+ SovietInfantryEntry1: waypoint
+ Location: 28,9
+ Owner: Neutral
+ SovietInfantryRally1: waypoint
+ Location: 23,26
+ Owner: Neutral
+ NavalEntryPoint: waypoint
+ Location: 4,59
+ Owner: Neutral
+ NavalWaypoint1: waypoint
+ Location: 41,48
+ Owner: Neutral
+ NavalWaypoint2: waypoint
+ Location: 26,54
+ Owner: Neutral
+ NavalWaypoint3: waypoint
+ Location: 42,53
+ Owner: Neutral
+ AirReinforcementsEntry1: waypoint
+ Location: 95,59
+ Owner: Neutral
+ AirReinforcementsEntry2: waypoint
+ Location: 63,26
+ Owner: Neutral
+ AirReinforcementsRally1: waypoint
+ Location: 88,63
+ Owner: Neutral
+ AirReinforcementsRally2: waypoint
+ Location: 17,31
+ Owner: Neutral
+ HiddenATEK: waypoint
+ Location: 58,61
+ Owner: Neutral
+
+Smudges:
+
+Rules:
+ Player:
+ -ConquestVictoryConditions:
+ MissionObjectives:
+ EarlyGameOver: true
+ World:
+ -CrateSpawner:
+ -SpawnMPUnits:
+ -MPStartLocations:
+ LuaScript:
+ Scripts: survival01.lua
+ ObjectivesPanel:
+ PanelName: MISSION_OBJECTIVES
+ ^Infantry:
+ MustBeDestroyed:
+ Tooltip:
+ GenericVisibility: Enemy
+ ShowOwnerRow: false
+ ^Tank:
+ MustBeDestroyed:
+ Tooltip:
+ GenericVisibility: Enemy
+ ShowOwnerRow: false
+ ^Vehicle:
+ MustBeDestroyed:
+ Tooltip:
+ GenericVisibility: Enemy
+ ShowOwnerRow: false
+ ^Building:
+ Tooltip:
+ GenericVisibility: Enemy
+ ShowOwnerRow: false
+ ^Wall:
+ Tooltip:
+ ShowOwnerRow: false
+ ^Husk:
+ Tooltip:
+ GenericVisibility: Enemy, Ally, Neutral
+ GenericStancePrefix: false
+ ShowOwnerRow: false
+ CAMERA.sam:
+ Inherits: CAMERA
+ RevealsShroud:
+ Range: 4c0
+ CAMERA.Large:
+ Inherits: CAMERA
+ RevealsShroud:
+ Range: 1000
+ ARTY:
+ Parachutable:
+ KilledOnImpassableTerrain: false
+ ParachuteSequence: parach
+ AFLD.mission:
+ Inherits: AFLD
+ -AirstrikePower:
+ -ParatroopersPower:
+ -SupportPowerChargeBar:
+ RenderBuilding:
+ Image: AFLD
+ ATEK.mission:
+ Inherits: ATEK
+ GpsPower:
+ ChargeTime: 0
+ Power:
+ Amount: 0
+ -Selectable:
+ -TargetableBuilding:
+ -GivesBuildableArea:
+ -Huntable:
+ RenderBuilding:
+ Image: ATEK
+ GUN:
+ Valued:
+ Cost: 1000
+ E7:
+ Buildable:
+ Prerequisites: ~disabled
+ SHOK:
+ Buildable:
+ Prerequisites: ~disabled
+ MIG:
+ Buildable:
+ Prerequisites: ~disabled
+ HELI:
+ Buildable:
+ Prerequisites: ~disabled
+ MSLO:
+ Buildable:
+ Prerequisites: ~disabled
+ GAP:
+ Buildable:
+ Prerequisites: ~disabled
+ SYRD:
+ Buildable:
+ Prerequisites: ~disabled
+ PDOX:
+ Buildable:
+ Prerequisites: ~disabled
+ AGUN:
+ Buildable:
+ Prerequisites: ~disabled
+ ATEK:
+ Buildable:
+ Prerequisites: ~disabled
+ 4TNK:
+ Buildable:
+ Prerequisites: ~disabled
+ MCV:
+ Buildable:
+ Prerequisites: ~disabled
+ MNLY.AP:
+ Buildable:
+ Prerequisites: ~disabled
+ MNLY.AT:
+ Buildable:
+ Prerequisites: ~disabled
+ TTNK:
+ Buildable:
+ Prerequisites: ~disabled
+ CTNK:
+ Buildable:
+ Prerequisites: ~disabled
+ DOME:
+ Buildable:
+ Prerequisites: ~disabled
+ BRIK:
+ Buildable:
+ Prerequisites: ~disabled
+ MRJ:
+ Buildable:
+ Prerequisites: ~disabled
+ MGG:
+ Buildable:
+ Prerequisites: ~disabled
+ STNK:
+ Buildable:
+ Prerequisites: ~disabled
+ QTNK:
+ Buildable:
+ Prerequisites: ~disabled
+ DTRK:
+ Buildable:
+ Prerequisites: ~disabled
+
+Sequences:
+
+VoxelSequences:
+
+Weapons:
+
+Voices:
+
+Notifications:
+
+Translations:
diff --git a/mods/ra/maps/survival01/survival01.lua b/mods/ra/maps/survival01/survival01.lua
new file mode 100644
index 0000000000..4eb867d4c2
--- /dev/null
+++ b/mods/ra/maps/survival01/survival01.lua
@@ -0,0 +1,392 @@
+Difficulty = Map.Difficulty
+
+if Difficulty == "Easy" then
+ AttackAtFrameIncrement = DateTime.Seconds(22)
+ AttackAtFrameIncrementInf = DateTime.Seconds(16)
+ TimerTicks = DateTime.Minutes(15)
+ IncrementTurningPoint = TimerTicks / 2
+ DamageModifier = 0.5
+ LongBowReinforcements = { "heli", "heli" }
+ ParadropArtillery = true
+elseif Difficulty == "Medium" then
+ AttackAtFrameIncrement = DateTime.Seconds(18)
+ AttackAtFrameIncrementInf = DateTime.Seconds(12)
+ TimerTicks = DateTime.Minutes(20)
+ IncrementTurningPoint = TimerTicks / 2
+ MoreParas = true
+ DamageModifier = 0.75
+ LongBowReinforcements = { "heli", "heli" }
+else --Difficulty == "Hard"
+ AttackAtFrameIncrement = DateTime.Seconds(14)
+ AttackAtFrameIncrementInf = DateTime.Seconds(8)
+ TimerTicks = DateTime.Minutes(25)
+ IncrementTurningPoint = DateTime.Minutes(10)
+ MoreParas = true
+ AttackAtFrameNaval = DateTime.Minutes(3) + DateTime.Seconds(45)
+ SpawnNavalUnits = true
+ DamageModifier = 1
+ LongBowReinforcements = { "heli" }
+end
+
+AlliedArtilleryParadrops = { "arty", "arty", "arty" }
+AlliedAirReinforcementsWaypoints =
+{
+ { AirReinforcementsEntry1.Location, AirReinforcementsEntry2.Location },
+ { AirReinforcementsRally1.Location, AirReinforcementsRally2.Location }
+}
+FrenchReinforcements = { "2tnk", "2tnk", "2tnk", "2tnk", "2tnk", "1tnk", "1tnk", "1tnk", "arty", "arty", "arty", "jeep", "jeep" }
+
+SpawningSovietUnits = true
+SpawningInfantry = true
+AttackAtFrameInf = DateTime.Seconds(12)
+AttackAtFrame = DateTime.Seconds(18)
+SovietAttackGroupSize = 5
+SovietInfantryGroupSize = 7
+FactoryClearRange = 10
+ParadropTicks = DateTime.Seconds(30)
+BadgerPassengers = { "e1", "e1", "e1", "e2", "e2" }
+ParadropWaypoints =
+{
+ { BadgerEntryPoint1.Location, ParaDrop1.Location },
+ { BadgerEntryPoint2.Location, ParaDrop2.Location },
+ { BadgerEntryPoint1.Location, Alliesbase2.Location },
+ { BadgerEntryPoint2.Location, Alliesbase1.Location }
+}
+NavalTransportPassengers = { "e1", "e1", "e2", "e4", "e4" }
+NavalReinforcementsWaypoints = { NavalWaypoint1, NavalWaypoint2, NavalWaypoint2, NavalWaypoint3 }
+Squad1 = { "e1", "e1" }
+Squad2 = { "e2", "e2" }
+SovietVehicles = { "3tnk", "3tnk", "3tnk", "3tnk", "3tnk", "3tnk", "v2rl", "v2rl", "ftrk", "ftrk", "ftrk", "apc", "apc" }
+SovietInfantry = { "e1", "e1", "e1", "e1", "e2", "e2", "e2", "e4", "e4", "e3" }
+SovietEntryPoints = { SovietEntryPoint1, SovietEntryPoint2, SovietEntryPoint3, SovietEntryPoint4, SovietEntryPoint5 }
+SovietRallyPoints = { SovietRallyPoint1, SovietRallyPoint2, SovietRallyPoint3, SovietRallyPoint4, SovietRallyPoint5 }
+SovietGateRallyPoints = { AlliesBaseGate2, AlliesBaseGate2, AlliesBaseGate1, AlliesBaseGate1, AlliesBaseGate1 }
+
+Airfields = { SovietAirfield1, SovietAirfield2, SovietAirfield3 }
+SovietBuildings = { Barrack1, SubPen, RadarDome, AdvancedPowerPlant1, AdvancedPowerPlant2, AdvancedPowerPlant3, WarFactory, Refinery, Silo1, Silo2, FlameTower1, FlameTower2, FlameTower3, Sam1, Sam2, Sam3, Sam4, SovietAirfield1, SovietAirfield2, SovietAirfield3 }
+
+IdleTrigger = function(units, dest)
+ Utils.Do(units, function(unit)
+ Trigger.OnIdle(unit, function()
+ local bool = Utils.All(units, function(unit) return unit.IsIdle end)
+ if bool then
+ Utils.Do(units, function(unit)
+ if not unit.IsDead then
+ Trigger.ClearAll(unit)
+ Trigger.AfterDelay(0, function()
+ if not unit.IsDead then
+ if dest then unit.AttackMove(dest, 3) end
+ Trigger.OnIdle(unit, unit.Hunt)
+ end
+ end)
+ end
+ end)
+ end
+ end)
+ Trigger.OnDamaged(unit, function()
+ Utils.Do(units, function(unit)
+ if not unit.IsDead then
+ Trigger.ClearAll(unit)
+ Trigger.AfterDelay(0, function()
+ if not unit.IsDead then Trigger.OnIdle(unit, unit.Hunt) end
+ end)
+ end
+ end)
+ end)
+ end)
+end
+
+Tick = function()
+ if KillObj and soviets.HasNoRequiredUnits() then
+ allies.MarkCompletedObjective(KillObj)
+ end
+
+ if allies.HasNoRequiredUnits() then
+ soviets.MarkCompletedObjective(SovietObj)
+ end
+
+ if soviets.Resources > soviets.ResourceCapacity / 2 then
+ soviets.Resources = soviets.ResourceCapacity / 2
+ end
+
+ if DateTime.Minutes(20) == TimerTicks - DateTime.GameTime then
+ Media.PlaySpeechNotification(allies, "TwentyMinutesRemaining")
+ elseif DateTime.Minutes(10) == TimerTicks - DateTime.GameTime then
+ Media.PlaySpeechNotification(allies, "TenMinutesRemaining")
+ elseif DateTime.Minutes(5) == TimerTicks - DateTime.GameTime then
+ Media.PlaySpeechNotification(allies, "WarningFiveMinutesRemaining")
+ InitTimer()
+ end
+end
+
+SendSovietParadrops = function(table)
+ local plane = Actor.Create("badr", true, { Owner = soviets, Location = table[1] })
+ Utils.Do(BadgerPassengers, function(type)
+ local unit = Actor.Create(type, false, { Owner = soviets })
+ plane.LoadPassenger(unit)
+ Trigger.OnIdle(unit, unit.Hunt)
+ end)
+ plane.Paradrop(table[2])
+end
+
+SendSovietNavalReinforcements = function()
+ if SpawnNavalUnits then
+ local entry = NavalEntryPoint.Location
+ local units = Reinforcements.ReinforceWithTransport(soviets, "lst", NavalTransportPassengers, { entry, Utils.Random(NavalReinforcementsWaypoints).Location }, { entry })[2]
+ Utils.Do(units, function(unit)
+ Trigger.OnIdle(unit, unit.Hunt)
+ end)
+
+ local delay = Utils.RandomInteger(AttackAtFrameNaval, AttackAtFrameNaval + DateTime.Minutes(2))
+
+ Trigger.AfterDelay(delay, SendSovietNavalReinforcements)
+ end
+end
+
+SpawnSovietInfantry = function()
+ local units = { }
+ for i = 0, SovietInfantryGroupSize - 1, 1 do
+ local type = Utils.Random(SovietInfantry)
+ units[i] = type
+ end
+
+ soviets.Build(units, function(soldiers)
+ Trigger.AfterDelay(25, function() IdleTrigger(soldiers) end)
+ end)
+end
+
+SpawnSovietUnits = function()
+ local units = { }
+ for i = 0, SovietAttackGroupSize - 1, 1 do
+ local type = Utils.Random(SovietVehicles)
+ units[i] = type
+ end
+
+ local route = Utils.RandomInteger(1, #SovietEntryPoints + 1)
+ local attackers = Reinforcements.Reinforce(soviets, units, { SovietEntryPoints[route].Location, SovietRallyPoints[route].Location })
+ Trigger.AfterDelay(25, function()
+ IdleTrigger(attackers, SovietGateRallyPoints[route].Location)
+ end)
+end
+
+SendInfantryWave = function()
+ if SpawningInfantry then
+ SpawnSovietInfantry()
+
+ if DateTime.GameTime < IncrementTurningPoint then
+ AttackAtFrameIncrementInf = AttackAtFrameIncrementInf + Utils.RandomInteger(DateTime.Seconds(2), DateTime.Seconds(3))
+ elseif not (AttackAtFrameIncrementInf <= DateTime.Seconds(4)) then
+ AttackAtFrameIncrementInf = AttackAtFrameIncrementInf - Utils.RandomInteger(DateTime.Seconds(2), DateTime.Seconds(3))
+ end
+
+ Trigger.AfterDelay(AttackAtFrameInf + AttackAtFrameIncrementInf, SendInfantryWave)
+ end
+end
+
+SendVehicleWave = function()
+ if SpawningSovietUnits then
+ SpawnSovietUnits()
+
+ if DateTime.GameTime < IncrementTurningPoint then
+ AttackAtFrameIncrement = AttackAtFrameIncrement + Utils.RandomInteger(DateTime.Seconds(4), DateTime.Seconds(6))
+ elseif not (AttackAtFrameIncrement <= DateTime.Seconds(4)) then
+ AttackAtFrameIncrement = AttackAtFrameIncrement - Utils.RandomInteger(DateTime.Seconds(4), DateTime.Seconds(6))
+ end
+
+ Trigger.AfterDelay(AttackAtFrame + AttackAtFrameIncrement, SendVehicleWave)
+ end
+end
+
+InitTimer = function()
+ Trigger.AfterDelay(DateTime.Minutes(1), function()
+ Media.PlaySpeechNotification(allies, "WarningFourMinutesRemaining")
+
+ Trigger.AfterDelay(ParadropTicks, function()
+ SendSovietParadrops(ParadropWaypoints[3])
+ SendSovietParadrops(ParadropWaypoints[2])
+ end)
+ Trigger.AfterDelay(ParadropTicks * 2, function()
+ SendSovietParadrops(ParadropWaypoints[4])
+ SendSovietParadrops(ParadropWaypoints[1])
+ end)
+ end)
+
+ Trigger.AfterDelay(DateTime.Minutes(2), function() Media.PlaySpeechNotification(allies, "WarningThreeMinutesRemaining") end)
+ Trigger.AfterDelay(DateTime.Minutes(3), function()
+ Media.PlaySpeechNotification(allies, "WarningTwoMinutesRemaining")
+
+ AttackAtFrameIncrement = DateTime.Seconds(4)
+ AttackAtFrameIncrementInf = DateTime.Seconds(4)
+ end)
+
+ Trigger.AfterDelay(DateTime.Minutes(4), function() Media.PlaySpeechNotification(allies, "WarningOneMinuteRemaining") end)
+ Trigger.AfterDelay(DateTime.Minutes(4) + DateTime.Seconds(45), function() Media.PlaySpeechNotification(allies, "AlliedForcesApproaching") end)
+ Trigger.AfterDelay(DateTime.Minutes(5), TimerExpired)
+end
+
+TimerExpired = function()
+ SpawningSovietUnits = false
+ SpawningInfantry = false
+ SpawnNavalUnits = false
+
+ Media.PlaySpeechNotification(allies, "AlliedReinforcementsArrived")
+ Reinforcements.Reinforce(allies, FrenchReinforcements, { SovietEntryPoint7.Location, Alliesbase.Location })
+
+ if DestroyObj then
+ KillObj = allies.AddPrimaryObjective("Take control of French reinforcements and\nkill all remaining soviet forces.")
+ else
+ DestroyObj = allies.AddPrimaryObjective("Take control of French reinforcements and\ndismantle the nearby Soviet base.")
+ end
+
+ allies.MarkCompletedObjective(SurviveObj)
+ if not allies.IsObjectiveCompleted(KillSams) then
+ allies.MarkFailedObjective(KillSams)
+ end
+end
+
+DropAlliedArtillery = function(table)
+ local plane = Actor.Create("badr", true, { Owner = allies, Location = table[1] })
+ Utils.Do(AlliedArtilleryParadrops, function(type)
+ local unit = Actor.Create(type, false, { Owner = allies })
+ plane.LoadPassenger(unit)
+ end)
+ plane.Paradrop(table[2])
+end
+
+SendLongBowReinforcements = function()
+ Media.PlaySpeechNotification(allies, "AlliedReinforcementsArrived")
+ Reinforcements.Reinforce(allies, LongBowReinforcements, AlliedAirReinforcementsWaypoints[1])
+ Reinforcements.Reinforce(allies, LongBowReinforcements, AlliedAirReinforcementsWaypoints[2])
+ if ParadropArtillery then
+ DropAlliedArtillery({ Utils.Random(AlliedAirReinforcementsWaypoints)[1], Alliesbase.Location })
+ end
+end
+
+InitObjectives = function()
+ Trigger.OnObjectiveAdded(allies, function(p, id)
+ Media.DisplayMessage(p.GetObjectiveDescription(id), "New " .. string.lower(p.GetObjectiveType(id)) .. " objective")
+ end)
+
+ SurviveObj = allies.AddPrimaryObjective("Enforce your position and hold-out the onslaught\nuntil reinforcements arrive.")
+ KillSams = allies.AddSecondaryObjective("Destroy the two SAM Sites before reinforcements\narrive.")
+ Media.DisplayMessage("The soviets are blocking our GPS. We need to investigate their new technology.")
+ CaptureAirfields = allies.AddSecondaryObjective("Capture and hold the soviet airbase\nin the north east.")
+ SovietObj = soviets.AddPrimaryObjective("Eliminate all Allied forces.")
+
+ Trigger.OnObjectiveCompleted(allies, function(p, id)
+ Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective completed")
+ end)
+ Trigger.OnObjectiveFailed(allies, function(p, id)
+ Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective failed")
+ end)
+
+ Trigger.OnPlayerLost(allies, function()
+ Media.PlaySpeechNotification(allies, "Lose")
+ end)
+ Trigger.OnPlayerWon(allies, function()
+ Media.PlaySpeechNotification(allies, "Win")
+ Media.DisplayMessage("The French forces have survived and dismantled the soviet presence in the area!")
+ end)
+end
+
+InitMission = function()
+ Camera.Position = Alliesbase.CenterPosition
+ camera1 = Actor.Create("camera.sam", true, { Owner = allies, Location = Sam1.Location })
+ camera2 = Actor.Create("camera.sam", true, { Owner = allies, Location = Sam2.Location })
+ Trigger.OnKilled(Sam1, function()
+ if camera1.IsInWorld then camera1.Destroy() end
+ end)
+ Trigger.OnKilled(Sam2, function()
+ if camera2.IsInWorld then camera2.Destroy() end
+ end)
+ Trigger.OnAllKilledOrCaptured({ Sam1, Sam2 }, function()
+ if not allies.IsObjectiveFailed(KillSams) then
+ allies.MarkCompletedObjective(KillSams)
+ SendLongBowReinforcements()
+ end
+ end)
+
+ local count = 0
+ Utils.Do(Airfields, function(field)
+ Trigger.OnCapture(field, function()
+ count = count + 1
+ if count == #Airfields then
+ allies.MarkCompletedObjective(CaptureAirfields)
+ local atek = Actor.Create("atek.mission", true, { Owner = allies, Location = HiddenATEK.Location })
+ Trigger.AfterDelay(DateTime.Seconds(5), atek.Destroy)
+ end
+ end)
+ Trigger.OnKilled(field, function()
+ allies.MarkFailedObjective(CaptureAirfields)
+ end)
+ end)
+
+ Trigger.OnAllKilledOrCaptured(SovietBuildings, function()
+ if DestroyObj then
+ if not soviets.HasNoRequiredUnits() then
+ KillObj = allies.AddPrimaryObjective("Kill all remaining soviet forces.")
+ end
+ allies.MarkCompletedObjective(DestroyObj)
+ else
+ DestroyObj = allies.AddPrimaryObjective("Dismantle the nearby Soviet base.")
+ allies.MarkCompletedObjective(DestroyObj)
+ end
+ end)
+
+ Trigger.AfterDelay(DateTime.Seconds(1), function() Media.PlaySpeechNotification(allies, "MissionTimerInitialised") end)
+end
+
+SetupSoviets = function()
+ Barrack1.IsPrimaryBuilding = true
+ Barrack1.RallyPoint = SovietInfantryRally1.Location
+ Trigger.OnKilledOrCaptured(Barrack1, function()
+ SpawningInfantry = false
+ end)
+
+ Trigger.AfterDelay(0, function()
+ local buildings = Map.ActorsInBox(Map.TopLeft, Map.BottomRight, function(self) return self.Owner == soviets and self.HasProperty("StartBuildingRepairs") end)
+ Utils.Do(buildings, function(actor)
+ Trigger.OnDamaged(actor, function(building)
+ if building.Owner == soviets and building.Health < building.MaxHealth * DamageModifier then
+ building.StartBuildingRepairs()
+ end
+ end)
+ end)
+ end)
+
+ Reinforcements.Reinforce(soviets, Squad1, { AlliesBaseGate1.Location, Alliesbase1.Location })
+ Reinforcements.Reinforce(soviets, Squad2, { AlliesBaseGate2.Location, Alliesbase2.Location })
+
+ Trigger.AfterDelay(ParadropTicks, function()
+ SendSovietParadrops(ParadropWaypoints[1])
+ SendSovietParadrops(ParadropWaypoints[2])
+ end)
+ Trigger.AfterDelay(ParadropTicks * 2, function()
+ SendSovietParadrops(ParadropWaypoints[3])
+ SendSovietParadrops(ParadropWaypoints[4])
+ end)
+
+ Trigger.AfterDelay(AttackAtFrame, SendVehicleWave)
+ Trigger.AfterDelay(AttackAtFrameInf, SendInfantryWave)
+
+ if MoreParas then
+ local delay = Utils.RandomInteger(TimerTicks/3, TimerTicks*2/3)
+ Trigger.AfterDelay(delay, function()
+ SendSovietParadrops(ParadropWaypoints[Utils.RandomInteger(1,3)])
+ SendSovietParadrops(ParadropWaypoints[Utils.RandomInteger(3,5)])
+ end)
+ end
+ if SpawnNavalUnits then
+ Trigger.AfterDelay(AttackAtFrameNaval, SendSovietNavalReinforcements)
+ end
+end
+
+WorldLoaded = function()
+
+ allies = Player.GetPlayer("Allies")
+ soviets = Player.GetPlayer("Soviets")
+
+ InitObjectives()
+ InitMission()
+ SetupSoviets()
+end
diff --git a/mods/ra/notifications.yaml b/mods/ra/notifications.yaml
index 7f470e7a85..b96f0f2863 100644
--- a/mods/ra/notifications.yaml
+++ b/mods/ra/notifications.yaml
@@ -47,6 +47,7 @@ Speech:
WarningFiveMinutesRemaining: 5minr
ControlCenterDeactivated: cntlded1
OperationControlTerminated: opterm1
+ MissionTimerInitialised: mtimein1
Sounds:
Notifications: