diff --git a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj
index 6214752d43..bd692b3b31 100644
--- a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj
+++ b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj
@@ -215,6 +215,7 @@
+
diff --git a/OpenRA.Mods.RA/Scripting/Properties/AirstrikeProperties.cs b/OpenRA.Mods.RA/Scripting/Properties/AirstrikeProperties.cs
new file mode 100644
index 0000000000..90b4995756
--- /dev/null
+++ b/OpenRA.Mods.RA/Scripting/Properties/AirstrikeProperties.cs
@@ -0,0 +1,36 @@
+#region Copyright & License Information
+/*
+ * Copyright 2007-2015 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.Linq;
+using Eluant;
+using OpenRA.Mods.RA.Traits;
+using OpenRA.Scripting;
+using OpenRA.Traits;
+
+namespace OpenRA.Mods.RA.Scripting
+{
+ [ScriptGlobal("Air Support Powers")]
+ public class AirstrikeProperties : ScriptActorProperties, Requires
+ {
+ readonly AirstrikePower ap;
+
+ public AirstrikeProperties(ScriptContext context, Actor self)
+ : base(context, self)
+ {
+ ap = self.TraitsImplementing().First();
+ }
+
+ [Desc("Activate the actor's Airstrike Power.")]
+ public void SendAirstrike(WPos target, bool randomize = true, int facing = 0)
+ {
+ ap.SendAirstrike(Self, target, randomize, facing);
+ }
+ }
+}
\ No newline at end of file
diff --git a/OpenRA.Mods.RA/Scripting/Properties/TransportProperties.cs b/OpenRA.Mods.RA/Scripting/Properties/TransportProperties.cs
index a8ead8b424..069e1c7fac 100644
--- a/OpenRA.Mods.RA/Scripting/Properties/TransportProperties.cs
+++ b/OpenRA.Mods.RA/Scripting/Properties/TransportProperties.cs
@@ -11,6 +11,7 @@
using System.Linq;
using OpenRA.Mods.Common.Activities;
using OpenRA.Mods.Common.Traits;
+using OpenRA.Mods.RA.Traits;
using OpenRA.Scripting;
using OpenRA.Traits;
@@ -65,4 +66,22 @@ namespace OpenRA.Mods.RA.Scripting
Self.QueueActivity(new RemoveSelf());
}
}
+
+ [ScriptGlobal("Air Support Powers")]
+ public class ParatroopersProperties : ScriptActorProperties, Requires
+ {
+ readonly ParatroopersPower pp;
+
+ public ParatroopersProperties(ScriptContext context, Actor self)
+ : base(context, self)
+ {
+ pp = self.TraitsImplementing().First();
+ }
+
+ [Desc("Activate the actor's Paratroopers Power. Returns the dropped units.")]
+ public Actor[] SendParatroopers(WPos target, bool randomize = true, int facing = 0)
+ {
+ return pp.SendParatroopers(Self, target, randomize, facing);
+ }
+ }
}
\ No newline at end of file
diff --git a/OpenRA.Mods.RA/SupportPowers/AirstrikePower.cs b/OpenRA.Mods.RA/SupportPowers/AirstrikePower.cs
index 65711f1504..37fb741927 100644
--- a/OpenRA.Mods.RA/SupportPowers/AirstrikePower.cs
+++ b/OpenRA.Mods.RA/SupportPowers/AirstrikePower.cs
@@ -52,13 +52,20 @@ namespace OpenRA.Mods.RA.Traits
{
base.Activate(self, order, manager);
+ SendAirstrike(self, self.World.Map.CenterOfCell(order.TargetLocation));
+ }
+
+ public void SendAirstrike(Actor self, WPos target, bool randomize = true, int attackFacing = 0)
+ {
var info = Info as AirstrikePowerInfo;
- var attackFacing = Util.QuantizeFacing(self.World.SharedRandom.Next(256), info.QuantizedFacings) * (256 / info.QuantizedFacings);
- var attackRotation = WRot.FromFacing(attackFacing);
- var delta = new WVec(0, -1024, 0).Rotate(attackRotation);
+
+ if (randomize)
+ attackFacing = Util.QuantizeFacing(self.World.SharedRandom.Next(256), info.QuantizedFacings) * (256 / info.QuantizedFacings);
var altitude = self.World.Map.Rules.Actors[info.UnitType].Traits.Get().CruiseAltitude.Range;
- var target = self.World.Map.CenterOfCell(order.TargetLocation) + new WVec(0, 0, altitude);
+ var attackRotation = WRot.FromFacing(attackFacing);
+ var delta = new WVec(0, -1024, 0).Rotate(attackRotation);
+ target = target + new WVec(0, 0, altitude);
var startEdge = target - (self.World.Map.DistanceToEdge(target, -delta) + info.Cordon).Range * delta / 1024;
var finishEdge = target + (self.World.Map.DistanceToEdge(target, delta) + info.Cordon).Range * delta / 1024;
@@ -75,7 +82,7 @@ namespace OpenRA.Mods.RA.Traits
{
camera = w.CreateActor(info.CameraActor, new TypeDictionary
{
- new LocationInit(order.TargetLocation),
+ new LocationInit(self.World.Map.CellContaining(target)),
new OwnerInit(self.Owner),
});
});
@@ -149,6 +156,7 @@ namespace OpenRA.Mods.RA.Traits
attack.OnExitedAttackRange += onExitRange;
attack.OnRemovedFromWorld += onExitRange;
+ a.QueueActivity(new Fly(a, Target.FromPos(target + spawnOffset)));
a.QueueActivity(new Fly(a, Target.FromPos(finishEdge + spawnOffset)));
a.QueueActivity(new RemoveSelf());
aircraftInRange.Add(a, false);
@@ -160,8 +168,8 @@ namespace OpenRA.Mods.RA.Traits
var distance = (target - startEdge).HorizontalLength;
beacon = new Beacon(
- order.Player,
- self.World.Map.CenterOfCell(order.TargetLocation),
+ self.Owner,
+ target,
Info.BeaconPalettePrefix,
Info.BeaconPoster,
Info.BeaconPosterPalette,
diff --git a/OpenRA.Mods.RA/Traits/SupportPowers/ParatroopersPower.cs b/OpenRA.Mods.RA/Traits/SupportPowers/ParatroopersPower.cs
index 4e6540aed5..7951cf67e3 100644
--- a/OpenRA.Mods.RA/Traits/SupportPowers/ParatroopersPower.cs
+++ b/OpenRA.Mods.RA/Traits/SupportPowers/ParatroopersPower.cs
@@ -61,13 +61,22 @@ namespace OpenRA.Mods.RA.Traits
{
base.Activate(self, order, manager);
+ SendParatroopers(self, self.World.Map.CenterOfCell(order.TargetLocation));
+ }
+
+ public Actor[] SendParatroopers(Actor self, WPos target, bool randomize = true, int dropFacing = 0)
+ {
+ var units = new List();
+
var info = Info as ParatroopersPowerInfo;
- var dropFacing = Util.QuantizeFacing(self.World.SharedRandom.Next(256), info.QuantizedFacings) * (256 / info.QuantizedFacings);
- var dropRotation = WRot.FromFacing(dropFacing);
- var delta = new WVec(0, -1024, 0).Rotate(dropRotation);
+
+ if (randomize)
+ dropFacing = Util.QuantizeFacing(self.World.SharedRandom.Next(256), info.QuantizedFacings) * (256 / info.QuantizedFacings);
var altitude = self.World.Map.Rules.Actors[info.UnitType].Traits.Get().CruiseAltitude.Range;
- var target = self.World.Map.CenterOfCell(order.TargetLocation) + new WVec(0, 0, altitude);
+ var dropRotation = WRot.FromFacing(dropFacing);
+ var delta = new WVec(0, -1024, 0).Rotate(dropRotation);
+ target = target + new WVec(0, 0, altitude);
var startEdge = target - (self.World.Map.DistanceToEdge(target, -delta) + info.Cordon).Range * delta / 1024;
var finishEdge = target + (self.World.Map.DistanceToEdge(target, delta) + info.Cordon).Range * delta / 1024;
@@ -84,7 +93,7 @@ namespace OpenRA.Mods.RA.Traits
{
camera = w.CreateActor(info.CameraActor, new TypeDictionary
{
- new LocationInit(order.TargetLocation),
+ new LocationInit(self.World.Map.CellContaining(target)),
new OwnerInit(self.Owner),
});
});
@@ -128,6 +137,14 @@ namespace OpenRA.Mods.RA.Traits
}
};
+ foreach (var p in info.DropItems)
+ {
+ var unit = self.World.CreateActor(false, p.ToLowerInvariant(),
+ new TypeDictionary { new OwnerInit(self.Owner) });
+
+ units.Add(unit);
+ }
+
self.World.AddFrameEndTask(w =>
{
var notification = self.Owner.IsAlliedWith(self.World.RenderPlayer) ? Info.LaunchSound : Info.IncomingSound;
@@ -162,13 +179,13 @@ namespace OpenRA.Mods.RA.Traits
drop.OnRemovedFromWorld += onExitRange;
var cargo = a.Trait();
- var passengers = info.DropItems.Skip(added).Take(passengersPerPlane);
+ var passengers = units.Skip(added).Take(passengersPerPlane);
added += passengersPerPlane;
foreach (var p in passengers)
- cargo.Load(a, self.World.CreateActor(false, p.ToLowerInvariant(),
- new TypeDictionary { new OwnerInit(a.Owner) }));
+ cargo.Load(a, p);
+ a.QueueActivity(new Fly(a, Target.FromPos(target + spawnOffset)));
a.QueueActivity(new Fly(a, Target.FromPos(finishEdge + spawnOffset)));
a.QueueActivity(new RemoveSelf());
aircraftInRange.Add(a, false);
@@ -180,8 +197,8 @@ namespace OpenRA.Mods.RA.Traits
var distance = (target - startEdge).HorizontalLength;
beacon = new Beacon(
- order.Player,
- self.World.Map.CenterOfCell(order.TargetLocation),
+ self.Owner,
+ target,
Info.BeaconPalettePrefix,
Info.BeaconPoster,
Info.BeaconPosterPalette,
@@ -190,6 +207,8 @@ namespace OpenRA.Mods.RA.Traits
w.Add(beacon);
}
});
+
+ return units.ToArray();
}
}
}
diff --git a/mods/ra/maps/allies-03a/allies03a.lua b/mods/ra/maps/allies-03a/allies03a.lua
index 0d21906e41..2f9929bafb 100644
--- a/mods/ra/maps/allies-03a/allies03a.lua
+++ b/mods/ra/maps/allies-03a/allies03a.lua
@@ -1,6 +1,5 @@
ProductionUnits = { "e1", "e1", "e2" }
ProductionBuildings = { USSRBarracks1, USSRBarracks2 }
-ParatroopersReinforcements = { "e1", "e1", "e1", "e2", "e2" }
TransportReinforcements = { "e1", "e1", "e1", "e2", "e2" }
FirstUSSRBase = { USSRFlameTower1, USSRBarracks1, USSRPowerPlant1, USSRPowerPlant2, USSRConstructionYard1, USSRTechCenter, USSRBaseGuard1, USSRBaseGuard2, USSRBaseGuard3, USSRBaseGuard4, USSRBaseGuard5, USSRBaseGuard6, USSRBaseGuard7, USSRBaseGuard8 }
SecondUSSRBase = { USSRBarracks2, USSRKennel, USSRRadarDome, USSRBaseGuard10, USSRBaseGuard11, USSRBaseGuard12, USSRBaseGuard13, USSRBaseGuard14 }
@@ -59,14 +58,19 @@ SendAlliedUnits = function()
Trigger.OnKilled(Tanya, function() player.MarkFailedObjective(TanyaSurvive) end)
end
-SendUSSRParadrops = function(units, entry, dropzone)
- local plane = Actor.Create("badr", true, { Owner = ussr, Location = entry })
- Utils.Do(units, function(type)
- local unit = Actor.Create(type, false, { Owner = ussr })
- plane.LoadPassenger(unit)
+SendUSSRParadrops = function()
+ local powerproxy = Actor.Create("powerproxy.paratroopers", false, { Owner = ussr })
+ local unitsA = powerproxy.SendParatroopers(ParadropLZ.CenterPosition, false, 128 + 32)
+ local unitsB = powerproxy.SendParatroopers(ParadropLZ.CenterPosition, false, 128 - 32)
+
+ Utils.Do(unitsA, function(unit)
IdleHunt(unit)
end)
- plane.Paradrop(dropzone)
+ Utils.Do(unitsB, function(unit)
+ IdleHunt(unit)
+ end)
+
+ powerproxy.Destroy()
end
SendUSSRWaterTransport = function()
@@ -215,8 +219,7 @@ InitTriggers = function()
if a.Owner == player and not paradropsTriggered then
paradropsTriggered = true
Trigger.RemoveFootprintTrigger(id)
- SendUSSRParadrops(ParatroopersReinforcements, ParadropTransportEntry1.Location, ParadropLZ.Location)
- SendUSSRParadrops(ParatroopersReinforcements, ParadropTransportEntry2.Location, ParadropLZ.Location)
+ SendUSSRParadrops()
end
end)
Trigger.OnEnteredFootprint(ReinforcementsTriggerArea, function(a, id)
diff --git a/mods/ra/maps/allies-03a/map.yaml b/mods/ra/maps/allies-03a/map.yaml
index 1320705d45..72552473c8 100644
--- a/mods/ra/maps/allies-03a/map.yaml
+++ b/mods/ra/maps/allies-03a/map.yaml
@@ -1304,12 +1304,6 @@ Actors:
LargeCameraWaypoint: waypoint
Location: 71,65
Owner: Neutral
- ParadropTransportEntry1: waypoint
- Location: 66,38
- Owner: Neutral
- ParadropTransportEntry2: waypoint
- Location: 85,38
- Owner: Neutral
ParadropLZ: waypoint
Location: 73,57
Owner: Neutral
@@ -1378,6 +1372,9 @@ Rules:
^Crate:
Tooltip:
ShowOwnerRow: false
+ powerproxy.paratroopers:
+ ParatroopersPower:
+ DropItems: E1,E1,E1,E2,E2
HACKE6:
Inherits: E6
-RepairsBridges:
diff --git a/mods/ra/maps/desert-shellmap/desert-shellmap.lua b/mods/ra/maps/desert-shellmap/desert-shellmap.lua
index 0f16c9185a..34efded0f9 100644
--- a/mods/ra/maps/desert-shellmap/desert-shellmap.lua
+++ b/mods/ra/maps/desert-shellmap/desert-shellmap.lua
@@ -1,7 +1,7 @@
if DateTime.IsHalloween then
UnitTypes = { "ant", "ant", "ant" }
BeachUnitTypes = { "ant", "ant" }
- ParadropUnitTypes = { "zombie", "zombie", "zombie", "zombie", "zombie" }
+ ProxyType = "powerproxy.parazombies"
ProducedUnitTypes =
{
{ AlliedBarracks1, { "e1", "e3" } },
@@ -15,7 +15,7 @@ if DateTime.IsHalloween then
else
UnitTypes = { "3tnk", "ftrk", "ttnk", "apc" }
BeachUnitTypes = { "e1", "e2", "e3", "e4", "e1", "e2", "e3", "e4", "e1", "e2", "e3", "e4", "e1", "e2", "e3", "e4" }
- ParadropUnitTypes = { "e1", "e1", "e2", "e3", "e4" }
+ ProxyType = "powerproxy.paratroopers"
ProducedUnitTypes =
{
{ AlliedBarracks1, { "e1", "e3" } },
@@ -83,17 +83,13 @@ InsertAlliedChinookReinforcements = function(entry, hpad)
end
ParadropSovietUnits = function()
- local lz = Utils.Random(ParadropWaypoints).Location
- local start = Map.CenterOfCell(Map.RandomEdgeCell()) + WVec.New(0, 0, Actor.CruiseAltitude("badr"))
- local transport = Actor.Create("badr", true, { CenterPosition = start, Owner = soviets, Facing = (Map.CenterOfCell(lz) - start).Facing })
+ local lz = Utils.Random(ParadropWaypoints)
+ local units = powerproxy.SendParatroopers(lz.CenterPosition)
- Utils.Do(ParadropUnitTypes, function(type)
- local a = Actor.Create(type, false, { Owner = soviets })
+ Utils.Do(units, function(a)
BindActorTriggers(a)
- transport.LoadPassenger(a)
end)
- transport.Paradrop(lz)
Trigger.AfterDelay(DateTime.Seconds(35), ParadropSovietUnits)
end
@@ -139,7 +135,7 @@ speed = 5
Tick = function()
ticks = ticks + 1
-
+
local t = (ticks + 45) % (360 * speed) * (math.pi / 180) / speed;
Camera.Position = viewportOrigin + WVec.New(19200 * math.sin(t), 20480 * math.cos(t), 0)
end
@@ -154,6 +150,7 @@ WorldLoaded = function()
ShipAlliedUnits()
InsertAlliedChinookReinforcements(Chinook1Entry, HeliPad1)
InsertAlliedChinookReinforcements(Chinook2Entry, HeliPad2)
+ powerproxy = Actor.Create(ProxyType, false, { Owner = soviets })
ParadropSovietUnits()
Trigger.AfterDelay(DateTime.Seconds(5), ChronoshiftAlliedUnits)
Utils.Do(ProducedUnitTypes, ProduceUnits)
diff --git a/mods/ra/maps/desert-shellmap/map.yaml b/mods/ra/maps/desert-shellmap/map.yaml
index f5f376f650..dc307a8a5a 100644
--- a/mods/ra/maps/desert-shellmap/map.yaml
+++ b/mods/ra/maps/desert-shellmap/map.yaml
@@ -1331,6 +1331,15 @@ Rules:
HP: 200
E7:
-Selectable:
+ powerproxy.paratroopers:
+ ParatroopersPower:
+ DisplayBeacon: false
+ DropItems: E1,E1,E2,E3,E4
+ powerproxy.parazombies:
+ ParatroopersPower:
+ DropItems: ZOMBIE,ZOMBIE,ZOMBIE,ZOMBIE,ZOMBIE
+ QuantizedFacings: 8
+ DisplayBeacon: false
Sequences:
diff --git a/mods/ra/maps/intervention/intervention.lua b/mods/ra/maps/intervention/intervention.lua
index 03d7268292..ea1b620036 100644
--- a/mods/ra/maps/intervention/intervention.lua
+++ b/mods/ra/maps/intervention/intervention.lua
@@ -54,19 +54,16 @@ GroundPatrolUnits =
{ "apc", "apc", "ftrk" },
{ "3tnk", "3tnk" }
}
-Paratroopers = { "e1", "e1", "e1", "e3", "e3" }
ParadropSovietUnits = function()
- local start = BaseRaidEntrypoint.CenterPosition + WVec.New(0, 0, Actor.CruiseAltitude("badr"))
- local transport = Actor.Create("badr", true, { CenterPosition = start, Owner = soviets, Facing = (Map.CenterOfCell(MCVDeployLocation.Location) - start).Facing })
+ local powerproxy = Actor.Create("powerproxy.paratroopers", false, { Owner = soviets })
+ local units = powerproxy.SendParatroopers(MCVDeployLocation.CenterPosition, false, 256 - 53)
- Utils.Do(Paratroopers, function(type)
- local a = Actor.Create(type, false, { Owner = soviets })
- transport.LoadPassenger(a)
- Trigger.OnIdle(a, function(b) b.Hunt() end)
+ Utils.Do(units, function(a)
+ Trigger.OnIdle(a, a.Hunt)
end)
- transport.Paradrop(MCVDeployLocation.Location)
+ powerproxy.Destroy()
end
AirRaid = function(planeTypes, ingress, egress, target)
diff --git a/mods/ra/maps/survival01/map.yaml b/mods/ra/maps/survival01/map.yaml
index 5ba871360e..df6116f0c4 100644
--- a/mods/ra/maps/survival01/map.yaml
+++ b/mods/ra/maps/survival01/map.yaml
@@ -1248,6 +1248,9 @@ Rules:
GenericVisibility: Enemy, Ally, Neutral
GenericStancePrefix: false
ShowOwnerRow: false
+ powerproxy.paratroopers:
+ ParatroopersPower:
+ DropItems: E1,E1,E1,E2,E2
CAMERA.sam:
Inherits: CAMERA
RevealsShroud:
diff --git a/mods/ra/maps/survival01/survival01.lua b/mods/ra/maps/survival01/survival01.lua
index 8d85ebe831..3bf4fc7a89 100644
--- a/mods/ra/maps/survival01/survival01.lua
+++ b/mods/ra/maps/survival01/survival01.lua
@@ -44,13 +44,12 @@ 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 }
+ { 192 + 4, ParaDrop1},
+ { 192 - 4, ParaDrop2},
+ { 192 + 4, Alliesbase2},
+ { 192 - 4, Alliesbase1}
}
NavalTransportPassengers = { "e1", "e1", "e2", "e4", "e4" }
NavalReinforcementsWaypoints = { NavalWaypoint1, NavalWaypoint2, NavalWaypoint2, NavalWaypoint3 }
@@ -120,13 +119,11 @@ Tick = function()
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)
+ local units = powerproxy.SendParatroopers(table[2].CenterPosition, false, table[1])
+
+ Utils.Do(units, function(unit)
Trigger.OnIdle(unit, unit.Hunt)
end)
- plane.Paradrop(table[2])
end
SendSovietNavalReinforcements = function()
@@ -357,6 +354,7 @@ SetupSoviets = function()
Reinforcements.Reinforce(soviets, Squad1, { AlliesBaseGate1.Location, Alliesbase1.Location })
Reinforcements.Reinforce(soviets, Squad2, { AlliesBaseGate2.Location, Alliesbase2.Location })
+ powerproxy = Actor.Create("powerproxy.paratroopers", false, { Owner = soviets })
Trigger.AfterDelay(ParadropTicks, function()
SendSovietParadrops(ParadropWaypoints[1])
SendSovietParadrops(ParadropWaypoints[2])
diff --git a/mods/ra/maps/survival02/map.bin b/mods/ra/maps/survival02/map.bin
new file mode 100644
index 0000000000..5396f2cc8e
Binary files /dev/null and b/mods/ra/maps/survival02/map.bin differ
diff --git a/mods/ra/maps/survival02/map.png b/mods/ra/maps/survival02/map.png
new file mode 100644
index 0000000000..aaa1507d66
Binary files /dev/null and b/mods/ra/maps/survival02/map.png differ
diff --git a/mods/ra/maps/survival02/map.yaml b/mods/ra/maps/survival02/map.yaml
new file mode 100644
index 0000000000..84fff06d34
--- /dev/null
+++ b/mods/ra/maps/survival02/map.yaml
@@ -0,0 +1,1190 @@
+MapFormat: 7
+
+RequiresMod: ra
+
+Title: Survival 02
+
+Description: INCOMING REPORT:\n\nCommander! The Soviets have rendered us useless...\nReports indicate Soviet reinforcements are coming to finish us off... The situation looks bleak...\n
+
+Author: Nuke'm Bro.
+
+Tileset: SNOW
+
+MapSize: 80,80
+
+Bounds: 2,2,76,76
+
+Visibility: MissionSelector
+
+Type: Mission
+
+Videos:
+
+Options:
+ Crates: False
+ Fog: True
+ Shroud: True
+ AllyBuildRadius: False
+ FragileAlliances: False
+ StartingCash: 5000
+ ConfigurableStartingUnits: False
+ ShortGame: False
+
+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:
+ Actor0: tc05
+ Location: 37,56
+ Owner: Neutral
+ Actor1: tc02
+ Location: 33,56
+ Owner: Neutral
+ Actor2: t16
+ Location: 37,59
+ Owner: Neutral
+ Actor3: t10
+ Location: 26,56
+ Owner: Neutral
+ Actor4: tc04
+ Location: 33,72
+ Owner: Neutral
+ Actor5: tc01
+ Location: 32,76
+ Owner: Neutral
+ Actor98: fenc
+ Location: 56,68
+ Owner: Soviets
+ Actor7: t05
+ Location: 40,74
+ Owner: Neutral
+ Actor8: tc04
+ Location: 67,70
+ Owner: Neutral
+ Actor9: tc02
+ Location: 68,75
+ Owner: Neutral
+ Actor6: fenc
+ Location: 55,68
+ Owner: Soviets
+ Actor11: tc05
+ Location: 73,63
+ Owner: Neutral
+ Actor12: tc02
+ Location: 70,67
+ Owner: Neutral
+ Actor13: t07
+ Location: 29,71
+ Owner: Neutral
+ Actor14: tc01
+ Location: 24,72
+ Owner: Neutral
+ Actor15: t01
+ Location: 29,66
+ Owner: Neutral
+ Actor16: t05
+ Location: 34,62
+ Owner: Neutral
+ Actor17: tc01
+ Location: 52,52
+ Owner: Neutral
+ Actor18: tc02
+ Location: 47,54
+ Owner: Neutral
+ Actor19: tc02
+ Location: 26,51
+ Owner: Neutral
+ Actor20: t11
+ Location: 42,54
+ Owner: Neutral
+ Actor21: tc05
+ Location: 75,16
+ Owner: Neutral
+ Actor22: tc02
+ Location: 70,16
+ Owner: Neutral
+ Actor23: tc04
+ Location: 69,13
+ Owner: Neutral
+ Actor24: t02
+ Location: 73,16
+ Owner: Neutral
+ Actor25: t11
+ Location: 76,12
+ Owner: Neutral
+ Actor26: tc02
+ Location: 55,2
+ Owner: Neutral
+ Actor27: powr
+ Location: 73,3
+ Owner: Soviets
+ Actor31: tc01
+ Location: 47,25
+ Owner: Neutral
+ Actor30: tc05
+ Location: 28,25
+ Owner: Neutral
+ Actor28: tc05
+ Location: 58,2
+ Owner: Neutral
+ Actor29: t16
+ Location: 56,4
+ Owner: Neutral
+ Actor32: tc04
+ Location: 57,30
+ Owner: Neutral
+ Actor33: t02
+ Location: 56,28
+ Owner: Neutral
+ Actor34: t06
+ Location: 19,45
+ Owner: Neutral
+ Actor35: t01
+ Location: 20,49
+ Owner: Neutral
+ Actor37: tc05
+ Location: 22,47
+ Owner: Neutral
+ Actor36: tc01
+ Location: 22,45
+ Owner: Neutral
+ Actor38: tc04
+ Location: 53,14
+ Owner: Neutral
+ Actor39: tc05
+ Location: 54,16
+ Owner: Neutral
+ Actor40: tc01
+ Location: 56,14
+ Owner: Neutral
+ Actor41: tc02
+ Location: 52,17
+ Owner: Neutral
+ Actor45: brik
+ Location: 5,17
+ Owner: Soviets
+ Actor42: brik
+ Location: 4,17
+ Owner: Soviets
+ Actor43: brik
+ Location: 4,18
+ Owner: Soviets
+ Actor46: brik
+ Location: 6,18
+ Owner: Soviets
+ Actor47: brik
+ Location: 7,18
+ Owner: Soviets
+ Actor48: brik
+ Location: 8,18
+ Owner: Soviets
+ Actor49: brik
+ Location: 9,18
+ Owner: Soviets
+ Actor50: brik
+ Location: 10,18
+ Owner: Soviets
+ Actor44: brik
+ Location: 5,18
+ Owner: Soviets
+ Actor51: brik
+ Location: 11,18
+ Owner: Soviets
+ Actor52: brik
+ Location: 12,18
+ Owner: Soviets
+ Actor53: brik
+ Location: 13,17
+ Owner: Soviets
+ Actor56: brik
+ Location: 13,18
+ Owner: Soviets
+ Actor57: brik
+ Location: 14,18
+ Owner: Soviets
+ Actor54: brik
+ Location: 14,17
+ Owner: Soviets
+ Actor69: apwr
+ Location: 75,6
+ Owner: Soviets
+ Actor73: tsla
+ Location: 16,12
+ Owner: Soviets
+ Actor67: barb
+ Location: 19,11
+ Owner: Soviets
+ Actor86: fenc
+ Location: 65,68
+ Owner: Soviets
+ Actor60: brik
+ Location: 22,10
+ Owner: Soviets
+ Actor55: brik
+ Location: 21,10
+ Owner: Soviets
+ Actor58: brik
+ Location: 21,11
+ Owner: Soviets
+ Actor71: powr
+ Location: 5,13
+ Owner: Soviets
+ Actor91: fenc
+ Location: 68,66
+ Owner: Soviets
+ Actor81: tc03
+ Location: 6,20
+ Owner: Neutral
+ Actor80: tc05
+ Location: 10,19
+ Owner: Neutral
+ Actor78: brl3
+ Location: 64,69
+ Owner: Soviets
+ Actor82: tc04
+ Location: 2,19
+ Owner: Neutral
+ Actor85: fenc
+ Location: 64,68
+ Owner: Soviets
+ Actor61: ftur
+ Location: 15,16
+ Owner: Soviets
+ Actor65: ftur
+ Location: 20,12
+ Owner: Soviets
+ Actor84: fenc
+ Location: 63,68
+ Owner: Soviets
+ Actor62: barb
+ Location: 14,16
+ Owner: Soviets
+ Actor124: fenc
+ Location: 46,45
+ Owner: Allies
+ Actor63: barb
+ Location: 14,15
+ Owner: Soviets
+ Actor59: brik
+ Location: 22,11
+ Owner: Soviets
+ Actor104: barb
+ Location: 19,12
+ Owner: Soviets
+ Actor66: barb
+ Location: 20,11
+ Owner: Soviets
+ Actor90: fenc
+ Location: 67,66
+ Owner: Soviets
+ Actor99: fenc
+ Location: 55,70
+ Owner: Soviets
+ Actor101: fenc
+ Location: 68,65
+ Owner: Soviets
+ Actor89: fenc
+ Location: 67,67
+ Owner: Soviets
+ Actor88: fenc
+ Location: 67,68
+ Owner: Soviets
+ Actor87: fenc
+ Location: 66,68
+ Owner: Soviets
+ Actor96: e1
+ Location: 13,13
+ Owner: Soviets
+ Facing: 160
+ Actor92: fenc
+ Location: 55,69
+ Owner: Soviets
+ Actor103: e4
+ Location: 8,12
+ Owner: Soviets
+ Facing: 160
+ Actor102: 3tnk
+ Location: 14,11
+ Owner: Soviets
+ Facing: 160
+ Actor105: tc04
+ Location: 23,29
+ Owner: Neutral
+ Actor94: fenc
+ Location: 55,72
+ Owner: Soviets
+ Actor108: t06
+ Location: 24,32
+ Owner: Neutral
+ Actor107: tc01
+ Location: 27,30
+ Owner: Neutral
+ Actor76: fenc
+ Location: 62,69
+ Owner: Soviets
+ Actor75: fenc
+ Location: 62,68
+ Owner: Soviets
+ Actor95: fenc
+ Location: 56,69
+ Owner: Soviets
+ Actor109: t01
+ Location: 26,31
+ Owner: Neutral
+ Actor110: tc05
+ Location: 51,29
+ Owner: Neutral
+ Actor111: tc04
+ Location: 45,29
+ Owner: Neutral
+ Actor112: tc05
+ Location: 62,45
+ Owner: Neutral
+ Actor113: t13
+ Location: 71,27
+ Owner: Neutral
+ Actor114: tc03
+ Location: 74,21
+ Owner: Neutral
+ Actor115: tc02
+ Location: 38,2
+ Owner: Neutral
+ Actor116: tc05
+ Location: 40,8
+ Owner: Neutral
+ Actor117: tc05
+ Location: 4,41
+ Owner: Neutral
+ Actor118: tc04
+ Location: 2,43
+ Owner: Neutral
+ Actor119: tc02
+ Location: 5,44
+ Owner: Neutral
+ Actor120: t07
+ Location: 4,46
+ Owner: Neutral
+ Actor125: fenc
+ Location: 46,44
+ Owner: Allies
+ Actor123: fenc
+ Location: 46,46
+ Owner: Allies
+ Actor97: powr
+ Location: 32,43
+ Owner: Allies
+ Health: 0.2
+ Actor72: dome
+ Location: 44,44
+ Owner: Allies
+ Health: 0.3
+ Actor127: fact
+ Location: 38,38
+ Owner: Allies
+ Health: 0.4
+ Actor128: powr
+ Location: 35,45
+ Owner: Allies
+ Health: 0.4
+ Actor129: powr
+ Location: 30,34
+ Owner: Allies
+ Health: 0.3
+ Actor130: weap
+ Location: 33,35
+ Owner: Allies
+ Health: 0.3
+ Actor131: tc01
+ Location: 30,45
+ Owner: Neutral
+ Actor132: tc04
+ Location: 32,45
+ Owner: Neutral
+ Actor133: tc02
+ Location: 34,47
+ Owner: Neutral
+ Actor134: agun
+ Location: 35,42
+ Owner: Allies
+ Health: 0.4
+ Actor135: gun
+ Location: 27,35
+ Owner: Allies
+ Health: 0.4
+ Actor136: gun
+ Location: 28,41
+ Owner: Allies
+ Actor149: cycl
+ Location: 48,39
+ Owner: Allies
+ Actor139: cycl
+ Location: 48,38
+ Owner: Allies
+ Actor138: cycl
+ Location: 48,37
+ Owner: Allies
+ Actor140: pbox
+ Location: 28,38
+ Owner: Allies
+ Health: 0.5
+ Actor141: agun
+ Location: 32,31
+ Owner: Allies
+ Health: 0.4
+ Actor143: fenc
+ Location: 31,30
+ Owner: Allies
+ Actor142: fenc
+ Location: 32,30
+ Owner: Allies
+ Actor106: fenc
+ Location: 33,30
+ Owner: Allies
+ Actor144: fenc
+ Location: 34,31
+ Owner: Allies
+ Actor68: fenc
+ Location: 34,30
+ Owner: Allies
+ Actor147: tent
+ Location: 43,34
+ Owner: Allies
+ Health: 0.3
+ Actor148: fix
+ Location: 44,39
+ Owner: Allies
+ Health: 0.2
+ Actor137: cycl
+ Location: 29,39
+ Owner: Allies
+ Actor122: cycl
+ Location: 29,38
+ Owner: Allies
+ Actor121: cycl
+ Location: 29,37
+ Owner: Allies
+ Actor152: gun
+ Location: 49,38
+ Owner: Allies
+ Health: 0.3
+ Actor157: fenc
+ Location: 46,32
+ Owner: Allies
+ Actor160: fenc
+ Location: 47,32
+ Owner: Allies
+ Actor161: fenc
+ Location: 48,32
+ Owner: Allies
+ Actor162: fenc
+ Location: 48,33
+ Owner: Allies
+ Actor163: fenc
+ Location: 48,34
+ Owner: Allies
+ Actor158: gun
+ Location: 39,32
+ Owner: Allies
+ Health: 0.3
+ Actor159: powr
+ Location: 46,33
+ Owner: Allies
+ Health: 0.3
+ Actor145: fenc
+ Location: 40,32
+ Owner: Allies
+ Actor146: fenc
+ Location: 40,33
+ Owner: Allies
+ Actor153: fenc
+ Location: 39,33
+ Owner: Allies
+ Actor154: fenc
+ Location: 38,33
+ Owner: Allies
+ Actor155: fenc
+ Location: 38,32
+ Owner: Allies
+ Actor156: fenc
+ Location: 45,32
+ Owner: Allies
+ Actor166: agun
+ Location: 46,37
+ Owner: Allies
+ Health: 0.5
+ Actor167: e1
+ Location: 35,33
+ Owner: Allies
+ Facing: 64
+ Actor168: e1
+ Location: 43,32
+ Owner: Allies
+ Actor169: e3
+ Location: 42,42
+ Owner: Allies
+ Actor170: e1
+ Location: 33,40
+ Owner: Allies
+ Actor171: jeep
+ Location: 38,35
+ Owner: Allies
+ Actor172: 1tnk
+ Location: 30,41
+ Owner: Allies
+ Actor173: 1tnk
+ Location: 47,41
+ Owner: Allies
+ Actor174: 2tnk
+ Location: 37,46
+ Owner: Allies
+ Facing: 160
+ Actor64: barb
+ Location: 15,15
+ Owner: Soviets
+ Actor177: fenc
+ Location: 55,71
+ Owner: Soviets
+ Actor100: e2
+ Location: 16,10
+ Owner: Soviets
+ Facing: 160
+ Actor180: fenc
+ Location: 53,72
+ Owner: Soviets
+ Actor179: fenc
+ Location: 54,72
+ Owner: Soviets
+ Actor181: fenc
+ Location: 53,73
+ Owner: Soviets
+ Actor183: fenc
+ Location: 54,73
+ Owner: Soviets
+ Actor176: t02
+ Location: 43,16
+ Owner: Neutral
+ Actor126: tc04
+ Location: 29,15
+ Owner: Neutral
+ Actor182: apwr
+ Location: 22,2
+ Owner: Soviets
+ Actor77: v2rl
+ Location: 40,23
+ Owner: Soviets
+ Actor223: e2
+ Location: 37,43
+ Owner: Soviets
+ Facing: 192
+ Actor220: e1
+ Location: 32,38
+ Owner: Soviets
+ Facing: 192
+ Actor222: e2
+ Location: 40,35
+ Owner: Soviets
+ Facing: 192
+ Actor221: e1
+ Location: 42,40
+ Owner: Soviets
+ Facing: 192
+ Actor70: mine
+ Location: 38,50
+ Owner: Neutral
+ Actor175: e1
+ Location: 63,72
+ Owner: Soviets
+ Facing: 32
+ Actor184: e2
+ Location: 61,74
+ Owner: Soviets
+ Actor224: brl3
+ Location: 59,75
+ Owner: Soviets
+ Actor225: barl
+ Location: 58,75
+ Owner: Soviets
+ Actor226: barl
+ Location: 61,75
+ Owner: Soviets
+ Actor227: barl
+ Location: 62,70
+ Owner: Soviets
+ Actor229: barl
+ Location: 63,71
+ Owner: Soviets
+ Actor230: fenc
+ Location: 67,65
+ Owner: Soviets
+ Actor231: brl3
+ Location: 62,74
+ Owner: Soviets
+ Actor232: barl
+ Location: 62,75
+ Owner: Soviets
+ Actor196: tsla
+ Location: 60,8
+ Owner: Soviets
+ Actor235: barl
+ Location: 64,70
+ Owner: Soviets
+ Actor236: fenc
+ Location: 61,2
+ Owner: Soviets
+ Actor237: fenc
+ Location: 62,2
+ Owner: Soviets
+ Actor238: fenc
+ Location: 63,2
+ Owner: Soviets
+ Actor241: silo
+ Location: 64,5
+ Owner: Soviets
+ Actor240: fenc
+ Location: 64,2
+ Owner: Soviets
+ Actor239: silo
+ Location: 64,4
+ Owner: Soviets
+ Actor242: powr
+ Location: 8,14
+ Owner: Soviets
+ Actor243: fenc
+ Location: 64,3
+ Owner: Soviets
+ Actor10: tc04
+ Location: 75,73
+ Owner: Neutral
+ Actor178: t16
+ Location: 77,69
+ Owner: Neutral
+ Actor192: tc02
+ Location: 22,4
+ Owner: Neutral
+ Actor193: tc01
+ Location: 27,6
+ Owner: Neutral
+ Actor194: powr
+ Location: 74,10
+ Owner: Soviets
+ Actor195: barr
+ Location: 72,6
+ Owner: Soviets
+ Actor93: tc03
+ Location: 75,68
+ Owner: Neutral
+ Actor248: mine
+ Location: 59,60
+ Owner: Neutral
+ Actor249: tc02
+ Location: 26,47
+ Owner: Neutral
+ Actor250: t16
+ Location: 24,45
+ Owner: Neutral
+ Actor251: t06
+ Location: 22,43
+ Owner: Neutral
+ Actor252: t01
+ Location: 24,43
+ Owner: Neutral
+ Actor253: kenn
+ Location: 12,6
+ Owner: Soviets
+ Actor254: fenc
+ Location: 10,5
+ Owner: Soviets
+ Actor255: fenc
+ Location: 11,5
+ Owner: Soviets
+ Actor256: fenc
+ Location: 12,5
+ Owner: Soviets
+ Actor257: dog
+ Location: 11,14
+ Owner: Soviets
+ Actor258: dog
+ Location: 18,10
+ Owner: Soviets
+ Actor259: fenc
+ Location: 10,6
+ Owner: Soviets
+ Actor260: dog
+ Location: 11,7
+ Owner: Soviets
+ Actor191: tc04
+ Location: 25,1
+ Owner: Neutral
+ Actor79: tc05
+ Location: 23,6
+ Owner: Neutral
+ Actor190: apwr
+ Location: 25,4
+ Owner: Soviets
+ Actor83: barl
+ Location: 63,69
+ Owner: Soviets
+ Actor185: brl3
+ Location: 56,71
+ Owner: Soviets
+ Actor186: barl
+ Location: 58,70
+ Owner: Soviets
+ Actor187: barl
+ Location: 58,72
+ Owner: Soviets
+ Actor188: barl
+ Location: 57,71
+ Owner: Soviets
+ Actor189: barl
+ Location: 59,71
+ Owner: Soviets
+ Actor197: barb
+ Location: 59,9
+ Owner: Soviets
+ Actor198: barb
+ Location: 59,10
+ Owner: Soviets
+ Actor199: barb
+ Location: 60,10
+ Owner: Soviets
+ Actor200: barb
+ Location: 61,10
+ Owner: Soviets
+ Actor201: barb
+ Location: 61,9
+ Owner: Soviets
+ Actor202: ftur
+ Location: 56,8
+ Owner: Soviets
+ Actor203: ftur
+ Location: 63,12
+ Owner: Soviets
+ Actor209: fenc
+ Location: 74,7
+ Owner: Soviets
+ Actor208: fenc
+ Location: 74,6
+ Owner: Soviets
+ Actor207: fenc
+ Location: 74,5
+ Owner: Soviets
+ Actor206: fenc
+ Location: 73,5
+ Owner: Soviets
+ Actor205: fenc
+ Location: 72,5
+ Owner: Soviets
+ Actor204: fenc
+ Location: 71,5
+ Owner: Soviets
+ Actor210: fenc
+ Location: 74,8
+ Owner: Soviets
+ Actor211: 3tnk
+ Location: 58,6
+ Owner: Soviets
+ Facing: 160
+ Actor212: 3tnk
+ Location: 65,10
+ Owner: Soviets
+ Facing: 96
+ Actor214: e1
+ Location: 73,9
+ Owner: Soviets
+ Facing: 96
+ Actor215: e3
+ Location: 76,4
+ Owner: Soviets
+ Facing: 32
+ Actor216: e4
+ Location: 66,3
+ Owner: Soviets
+ Facing: 96
+ Actor234: minv
+ Location: 16,17
+ Owner: Soviets
+ Actor268: minv
+ Location: 16,19
+ Owner: Soviets
+ Actor218: minv
+ Location: 62,13
+ Owner: Soviets
+ Actor219: minv
+ Location: 57,9
+ Owner: Soviets
+ Actor228: mine
+ Location: 37,14
+ Owner: Neutral
+ Actor246: minv
+ Location: 56,11
+ Owner: Soviets
+ Actor247: minv
+ Location: 58,11
+ Owner: Soviets
+ Actor261: minv
+ Location: 58,13
+ Owner: Soviets
+ Actor262: minv
+ Location: 60,12
+ Owner: Soviets
+ Actor263: minv
+ Location: 60,14
+ Owner: Soviets
+ Actor245: minv
+ Location: 20,13
+ Owner: Soviets
+ Actor266: minv
+ Location: 19,16
+ Owner: Soviets
+ Actor264: minv
+ Location: 20,15
+ Owner: Soviets
+ Actor265: minv
+ Location: 18,17
+ Owner: Soviets
+ Actor267: minv
+ Location: 22,13
+ Owner: Soviets
+ Actor269: minv
+ Location: 19,14
+ Owner: Soviets
+ Actor270: minv
+ Location: 17,16
+ Owner: Soviets
+ Actor164: fenc
+ Location: 46,47
+ Owner: Allies
+ Actor165: fenc
+ Location: 45,47
+ Owner: Allies
+ Actor213: fenc
+ Location: 44,47
+ Owner: Allies
+ Actor233: proc
+ Location: 61,3
+ Owner: Soviets
+ FreeActor: False
+ Actor74: proc
+ Location: 13,5
+ Owner: Soviets
+ FreeActor: False
+ Harvester1: harv
+ Location: 61,6
+ Owner: Soviets
+ Facing: 128
+ Harvester2: harv
+ Location: 15,5
+ Owner: Soviets
+ Facing: 150
+ HarvGuard1: apc
+ Location: 68,7
+ Owner: Soviets
+ Facing: 100
+ HarvGuard2: 3tnk
+ Location: 69,8
+ Owner: Soviets
+ Facing: 127
+ HarvGuard3: 3tnk
+ Location: 67,8
+ Owner: Soviets
+ Facing: 96
+ drum1: brl3
+ Location: 63,70
+ Owner: Soviets
+ drum2: brl3
+ Location: 60,75
+ Owner: Soviets
+ drum3: brl3
+ Location: 58,71
+ Owner: Soviets
+ boom1: apwr
+ Location: 56,72
+ Owner: Soviets
+ boom2: barr
+ Location: 65,69
+ Owner: Soviets
+ boom3: ftur
+ Location: 59,70
+ Owner: Soviets
+ boom4: 3tnk
+ Location: 61,70
+ Owner: Soviets
+ Facing: 32
+ boom5: 3tnk
+ Location: 59,74
+ Owner: Soviets
+ Facing: 224
+ Factory: weap
+ Location: 7,6
+ Owner: Soviets
+ Barrack1: barr
+ Location: 18,7
+ Owner: Soviets
+ SovietEntry1: waypoint
+ Location: 77,45
+ Owner: Neutral
+ SovietEntry2: waypoint
+ Location: 2,54
+ Owner: Neutral
+ SovietEntry3: waypoint
+ Location: 71,2
+ Owner: Neutral
+ SovietRally: waypoint
+ Location: 11,10
+ Owner: Neutral
+ SovietRally1: waypoint
+ Location: 61,72
+ Owner: Neutral
+ SovietRally2: waypoint
+ Location: 55,61
+ Owner: Neutral
+ SovietRally3: waypoint
+ Location: 22,18
+ Owner: Neutral
+ SovietRally4: waypoint
+ Location: 40,18
+ Owner: Neutral
+ SovietRally5: waypoint
+ Location: 14,36
+ Owner: Neutral
+ SovietRally6: waypoint
+ Location: 65,39
+ Owner: Neutral
+ SovietRally7: waypoint
+ Location: 15,41
+ Owner: Neutral
+ SovietRally8: waypoint
+ Location: 59,19
+ Owner: Neutral
+ SovietParaDrop1: waypoint
+ Location: 48,41
+ Owner: Neutral
+ SovietParaDrop2: waypoint
+ Location: 26,38
+ Owner: Neutral
+ SovietParaDrop3: waypoint
+ Location: 39,34
+ Owner: Neutral
+ SovietParaDropEntry: waypoint
+ Location: 2,2
+ Owner: Neutral
+ FranceEntry: waypoint
+ Location: 66,77
+ Owner: Neutral
+ FranceRally: waypoint
+ Location: 59,67
+ Owner: Neutral
+ BrokenBridge1: waypoint
+ Location: 7,67
+ Owner: Neutral
+ ReinforcementsEntry1: waypoint
+ Location: 2,71
+ Owner: Neutral
+ ReinforcementsRally1: waypoint
+ Location: 10,62
+ Owner: Neutral
+ BrokenBridge2: waypoint
+ Location: 49,74
+ Owner: Neutral
+ ReinforcementsEntry2: waypoint
+ Location: 44,77
+ Owner: Neutral
+ ReinforcementsRally2: waypoint
+ Location: 49,70
+ Owner: Neutral
+ AlliesBase: waypoint
+ Location: 39,37
+ Owner: Neutral
+ Timer: MissionTimer
+ Location: 5,5
+ Owner: Soviets
+
+Smudges:
+
+Rules:
+ Player:
+ -ConquestVictoryConditions:
+ MissionObjectives:
+ EarlyGameOver: true
+ World:
+ -CrateDrop:
+ -SpawnMPUnits:
+ -MPStartLocations:
+ LuaScript:
+ Scripts: survival02.lua
+ ObjectivesPanel:
+ PanelName: MISSION_OBJECTIVES
+ ^Infantry:
+ Tooltip:
+ GenericVisibility: Enemy
+ ShowOwnerRow: false
+ ^Tank:
+ Tooltip:
+ GenericVisibility: Enemy
+ ShowOwnerRow: false
+ ^Vehicle:
+ 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
+ SovietSquad:
+ ParatroopersPower:
+ DropItems: E1,E1,E2,E4,E4
+ QuantizedFacings: 8
+ DisplayBeacon: false
+ SovietPlatoonUnits:
+ ParatroopersPower:
+ DropItems: E1,E1,E2,E4,E4,E1,E1,E2,E4,E4
+ QuantizedFacings: 8
+ DisplayBeacon: false
+ MissionTimer:
+ ParatroopersPower:
+ ChargeTime: 600
+ Description: Soviet reinforcements arrive in
+ DisplayTimer: True
+ MINV:
+ Mine:
+ AvoidFriendly: yes
+ CAMERA:
+ RevealsShroud:
+ Range: 7c0
+ ARTY:
+ Valued:
+ Cost: 1000
+ GUN:
+ Valued:
+ Cost: 1000
+ E7:
+ Buildable:
+ Prerequisites: ~disabled
+ SHOK:
+ 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
+ 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:
+ ParaBomb:
+ ROF: 5
+ Range: 7c0
+ Report: CHUTE1.AUD
+ Projectile: GravityBomb
+ Image: BOMBLET
+ Warhead@1Dam: SpreadDamage
+ Spread: 150
+ Damage: 3500
+ DeathType: 5
+ Versus:
+ None: 125
+ Wood: 100
+ Light: 60
+ Heavy: 50
+ Concrete: 25
+ Warhead@2Smu: LeaveSmudge
+ SmudgeType: Crater
+ Warhead@3Eff: CreateEffect
+ Explosion: napalm
+ ImpactSound: firebl3.aud
+ InvalidImpactTypes: Water
+ Warhead@4EffWater: CreateEffect
+ Explosion: napalm
+ ImpactSound: splash9.aud
+ ValidImpactTypes: Water
+
+Voices:
+
+Notifications:
+
+Translations:
diff --git a/mods/ra/maps/survival02/survival02.lua b/mods/ra/maps/survival02/survival02.lua
new file mode 100644
index 0000000000..e1a2f8a781
--- /dev/null
+++ b/mods/ra/maps/survival02/survival02.lua
@@ -0,0 +1,356 @@
+FrenchSquad = { "2tnk", "2tnk", "mcv" }
+
+TimerTicks = DateTime.Minutes(10)
+AttackTicks = DateTime.Seconds(52)
+AttackAtFrame = DateTime.Seconds(18)
+AttackAtFrameIncrement = DateTime.Seconds(18)
+Producing = true
+SpawningInfantry = true
+ProduceAtFrame = DateTime.Seconds(12)
+ProduceAtFrameIncrement = DateTime.Seconds(12)
+SovietGroupSize = 4
+SovietAttackGroupSize = 7
+
+InfantryGuards = { }
+HarvGuards = { HarvGuard1, HarvGuard2, HarvGuard3 }
+SovietPlatoonUnits = { "e1", "e1", "e2", "e4", "e4", "e1", "e1", "e2", "e4", "e4" }
+SovietTanks = { "3tnk", "3tnk", "3tnk" }
+SovietVehicles = { "3tnk", "3tnk", "v2rl" }
+SovietInfantry = { "e1", "e4", "e2" }
+SovietEntryPoints = { SovietEntry1, SovietEntry2, SovietEntry3 }
+SovietRallyPoints = { SovietRally2, SovietRally4, SovietRally5, SovietRally6 }
+NewSovietEntryPoints = { SovietParaDropEntry, SovietEntry3 }
+NewSovietRallyPoints = { SovietRally3, SovietRally4, SovietRally8 }
+
+ParaWaves =
+{
+ { AttackTicks, { "SovietSquad", SovietRally5 } },
+ { 0, { "SovietSquad", SovietRally6 } },
+ { AttackTicks * 2, { "SovietSquad", SovietParaDrop3 } },
+ { 0, { "SovietPlatoonUnits", SovietRally5 } },
+ { 0, { "SovietPlatoonUnits", SovietRally6 } },
+ { 0, { "SovietSquad", SovietRally2 } },
+ { AttackTicks * 2, { "SovietSquad", SovietParaDrop2 } },
+ { AttackTicks * 2, { "SovietSquad", SovietParaDrop1 } },
+ { AttackTicks * 3, { "SovietSquad", SovietParaDrop1 } }
+}
+
+IdleHunt = function(unit) Trigger.OnIdle(unit, unit.Hunt) end
+
+GuardHarvester = function(unit, attacker)
+ if not unit.IsDead then
+ unit.Stop()
+
+ local start = unit.Location
+ if attacker.Location then
+ unit.AttackMove(attacker.Location)
+ else
+ unit.Hunt()
+ end
+
+ Trigger.OnIdle(unit, function()
+ if unit.Location == start then
+ Trigger.ClearAll(unit)
+ else
+ unit.AttackMove(start)
+ end
+ end)
+ end
+end
+
+Tick = function()
+ if soviets.HasNoRequiredUnits() then
+ if DestroyObj then
+ allies.MarkCompletedObjective(DestroyObj)
+ else
+ DestroyObj = allies.AddPrimaryObjective("Destroy all Soviet forces in the area!")
+ allies.MarkCompletedObjective(DestroyObj)
+ end
+ end
+
+ if allies.HasNoRequiredUnits() then
+ soviets.MarkCompletedObjective(SovietObj)
+ end
+
+ if soviets.Resources > soviets.ResourceCapacity / 2 then
+ soviets.Resources = soviets.ResourceCapacity / 2
+ end
+
+ if DateTime.GameTime == ProduceAtFrame then
+ if SpawningInfantry then
+ ProduceAtFrame = ProduceAtFrame + ProduceAtFrameIncrement
+ ProduceAtFrameIncrement = ProduceAtFrameIncrement * 2 - 5
+ SpawnSovietInfantry()
+ end
+ end
+
+ if DateTime.GameTime == AttackAtFrame then
+ AttackAtFrame = AttackAtFrame + AttackAtFrameIncrement
+ AttackAtFrameIncrement = AttackAtFrameIncrement * 2 - 5
+ if Producing then
+ SpawnSovietVehicle(SovietEntryPoints, SovietRallyPoints)
+ else
+ SpawnSovietVehicle(NewSovietEntryPoints, NewSovietRallyPoints)
+ end
+ end
+
+ if DateTime.Minutes(5) == TimerTicks - DateTime.GameTime then
+ Media.PlaySpeechNotification(allies, "WarningFiveMinutesRemaining")
+ InitCountDown()
+ end
+end
+
+SendSovietParadrops = function(table)
+ local paraproxy = Actor.Create(table[1], false, { Owner = soviets })
+ units = paraproxy.SendParatroopers(table[2].CenterPosition)
+ Utils.Do(units, function(unit) IdleHunt(unit) end)
+ paraproxy.Destroy()
+end
+
+SpawnSovietInfantry = function()
+ soviets.Build({ Utils.Random(SovietInfantry) }, function(units)
+ IdleHunt(units[1])
+ end)
+end
+
+SpawnSovietVehicle = function(spawnpoints, rallypoints)
+ local route = Utils.RandomInteger(1, #spawnpoints + 1)
+ local rally = Utils.RandomInteger(1, #rallypoints + 1)
+ local unit = Reinforcements.Reinforce(soviets, { Utils.Random(SovietVehicles) }, { spawnpoints[route].Location, rallypoints[rally].Location })[1]
+ IdleHunt(unit)
+end
+
+SpawnAndAttack = function(types, entry)
+ local units = Reinforcements.Reinforce(soviets, types, { entry })
+ Utils.Do(units, function(unit)
+ IdleHunt(unit)
+ end)
+ return units
+end
+
+FrenchReinforcements = function()
+ Camera.Position = SovietRally1.CenterPosition
+ local camera = Actor.Create("camera", true, { Owner = allies, Location = SovietRally1.Location })
+
+ if drum1.IsDead or drum2.IsDead or drum3.IsDead then
+ Media.PlaySpeechNotification(allies, "AlliedReinforcementsArrived")
+ Reinforcements.Reinforce(allies, FrenchSquad, { FranceEntry.Location, FranceRally.Location })
+ Trigger.AfterDelay(DateTime.Seconds(3), function() camera.Destroy() end)
+ return
+ end
+
+ powerproxy = Actor.Create("powerproxy.parabombs", false, { Owner = allies })
+ powerproxy.SendAirstrike(drum1.CenterPosition, false, 256 - 28)
+ powerproxy.SendAirstrike(drum2.CenterPosition, false, 256 - 32)
+ powerproxy.SendAirstrike(drum3.CenterPosition, false, 256 - 36)
+ powerproxy.Destroy()
+
+ Trigger.AfterDelay(DateTime.Seconds(3), function()
+ Media.PlaySpeechNotification(allies, "AlliedReinforcementsArrived")
+ Reinforcements.Reinforce(allies, FrenchSquad, { FranceEntry.Location, FranceRally.Location })
+ Trigger.AfterDelay(DateTime.Seconds(3), function() camera.Destroy() end)
+ end)
+end
+
+FinalAttack = function()
+ local units1 = SpawnAndAttack(SovietTanks, SovietEntry1.Location)
+ local units2 = SpawnAndAttack(SovietTanks, SovietEntry1.Location)
+ local units3 = SpawnAndAttack(SovietTanks, SovietEntry2.Location)
+ local units4 = SpawnAndAttack(SovietPlatoonUnits, SovietEntry1.Location)
+ local units5 = SpawnAndAttack(SovietPlatoonUnits, SovietEntry2.Location)
+
+ local units = { }
+ local insert = function(table)
+ local count = #units
+ Utils.Do(table, function(unit)
+ units[count] = unit
+ count = count + 1
+ end)
+ end
+
+ insert(units1)
+ insert(units2)
+ insert(units3)
+ insert(units4)
+ insert(units5)
+
+ Trigger.OnAllKilled(units, function()
+ if not DestroyObj then
+ Media.DisplayMessage("Excellent work Commander! We have reinforced our position enough to initiate a counter-attack.", "Incoming Report")
+ DestroyObj = allies.AddPrimaryObjective("Destroy the remaining Soviet forces in the area!")
+ end
+ allies.MarkCompletedObjective(SurviveObj)
+ end)
+end
+
+wave = 1
+SendParadrops = function()
+ SendSovietParadrops(ParaWaves[wave][2])
+
+ wave = wave + 1
+ if wave > #ParaWaves then
+ Trigger.AfterDelay(AttackTicks, FrenchReinforcements)
+ else
+ Trigger.AfterDelay(ParaWaves[wave][1], SendParadrops)
+ end
+end
+
+SetupBridges = function()
+ local count = 0
+ local counter = function()
+ count = count + 1
+ if count == 2 then
+ allies.MarkCompletedObjective(RepairBridges)
+ end
+ end
+
+ Media.DisplayMessage("Commander! The Soviets destroyed the brigdes to disable our reinforcements. Repair them for additional reinforcements.", "Incoming Report")
+ RepairBridges = allies.AddSecondaryObjective("Repair the two southern brigdes.")
+
+ local bridgeA = Map.ActorsInCircle(BrokenBridge1.CenterPosition, WRange.FromCells(1), function(self) return self.Type == "bridge1" end)
+ local bridgeB = Map.ActorsInCircle(BrokenBridge2.CenterPosition, WRange.FromCells(1), function(self) return self.Type == "bridge1" end)
+
+ Utils.Do(bridgeA, function(bridge)
+ Trigger.OnDamaged(bridge, function()
+ Utils.Do(bridgeA, function(self) Trigger.ClearAll(self) end)
+ Media.PlaySpeechNotification(allies, "AlliedReinforcementsArrived")
+ Reinforcements.Reinforce(allies, { "1tnk", "2tnk", "2tnk" }, { ReinforcementsEntry1.Location, ReinforcementsRally1.Location })
+ counter()
+ end)
+ end)
+ Utils.Do(bridgeB, function(bridge)
+ Trigger.OnDamaged(bridge, function()
+ Utils.Do(bridgeB, function(self) Trigger.ClearAll(self) end)
+ Media.PlaySpeechNotification(allies, "AlliedReinforcementsArrived")
+ Reinforcements.Reinforce(allies, { "jeep", "1tnk", "1tnk" }, { ReinforcementsEntry2.Location, ReinforcementsRally2.Location })
+ counter()
+ end)
+ end)
+end
+
+InitCountDown = function()
+ Trigger.AfterDelay(DateTime.Minutes(1), function() Media.PlaySpeechNotification(allies, "WarningFourMinutesRemaining") end)
+ Trigger.AfterDelay(DateTime.Minutes(2), function() Media.PlaySpeechNotification(allies, "WarningThreeMinutesRemaining") end)
+ Trigger.AfterDelay(DateTime.Minutes(3), function() Media.PlaySpeechNotification(allies, "WarningTwoMinutesRemaining") end)
+ Trigger.AfterDelay(DateTime.Minutes(4), function() Media.PlaySpeechNotification(allies, "WarningOneMinuteRemaining") 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.")
+ SovietObj = soviets.AddPrimaryObjective("Eliminate all Allied forces.")
+
+ Trigger.AfterDelay(DateTime.Seconds(15), function()
+ SetupBridges()
+ end)
+
+ 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("We have destroyed the remaining Soviet presence!", "Incoming Report")
+ end)
+end
+
+InitMission = function()
+ Camera.Position = AlliesBase.CenterPosition
+
+ Trigger.AfterDelay(DateTime.Seconds(1), function() Media.PlaySpeechNotification(allies, "MissionTimerInitialised") end)
+
+ Trigger.AfterDelay(TimerTicks, function()
+ Media.DisplayMessage("The Soviet reinforcements are approaching!", "Incoming Report")
+ Media.PlaySpeechNotification(allies, "SovietReinforcementsArrived")
+ SpawnSovietVehicle(NewSovietEntryPoints, NewSovietRallyPoints)
+ FinalAttack()
+ Producing = false
+ Timer.Destroy()
+ end)
+
+ Trigger.AfterDelay(AttackTicks, SendParadrops)
+
+ Trigger.OnKilled(drum1, function() --Kill the remaining stuff from FrenchReinforcements
+ if not boom2.IsDead then boom2.Kill() end
+ if not boom4.IsDead then boom4.Kill() end
+ if not drum2.IsDead then drum2.Kill() end
+ if not drum3.IsDead then drum3.Kill() end
+ end)
+ Trigger.OnKilled(drum2, function()
+ if not boom1.IsDead then boom1.Kill() end
+ if not boom5.IsDead then boom5.Kill() end
+ Trigger.AfterDelay(DateTime.Seconds(1), function() if not drum1.IsDead then drum1.Kill() end end)
+ end)
+ Trigger.OnKilled(drum3, function()
+ if not boom1.IsDead then boom1.Kill() end
+ if not boom3.IsDead then boom3.Kill() end
+ Trigger.AfterDelay(DateTime.Seconds(1), function() if not drum1.IsDead then drum1.Kill() end end)
+ end)
+end
+
+SetupSoviets = function()
+ Barrack1.IsPrimaryBuilding = true
+ Barrack1.RallyPoint = SovietRally.Location
+ Trigger.OnKilledOrCaptured(Barrack1, function()
+ SpawningInfantry = false
+ end)
+
+ Harvester1.FindResources()
+ Trigger.OnDamaged(Harvester1, function(self, attacker)
+ Utils.Do(HarvGuards, function(unit)
+ GuardHarvester(unit, attacker)
+ end)
+ end)
+
+ Harvester2.FindResources()
+ Trigger.OnDamaged(Harvester2, function(self, attacker)
+ Utils.Do(InfantryGuards, function(unit) GuardHarvester(unit, attacker) end)
+
+ local toBuild = { }
+ for i = 1, 6, 1 do
+ toBuild[i] = Utils.Random(SovietInfantry)
+ end
+
+ soviets.Build(toBuild, function(units)
+ Utils.Do(units, function(unit)
+ InfantryGuards[#InfantryGuards + 1] = unit
+ GuardHarvester(unit, attacker)
+ end)
+ end)
+ 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 * 3/4 then
+ building.StartBuildingRepairs()
+ end
+ end)
+ end)
+
+ local units = Map.ActorsInBox(Map.TopLeft, Map.BottomRight, function(self) return self.Owner == soviets and self.HasProperty("AutoTarget") end)
+ Utils.Do(units, function(unit)
+ unit.Stance = "Defend"
+ end)
+ end)
+end
+
+WorldLoaded = function()
+
+ allies = Player.GetPlayer("Allies")
+ soviets = Player.GetPlayer("Soviets")
+
+ InitObjectives()
+ InitMission()
+ SetupSoviets()
+end
diff --git a/mods/ra/rules/misc.yaml b/mods/ra/rules/misc.yaml
index 3984bd1897..454463a981 100644
--- a/mods/ra/rules/misc.yaml
+++ b/mods/ra/rules/misc.yaml
@@ -329,6 +329,19 @@ powerproxy.sonarpulse:
EffectSequence: moveflsh
EffectPalette: moveflash
+powerproxy.paratroopers:
+ ParatroopersPower:
+ Icon: paratroopers
+ Description: Paratroopers
+ LongDesc: A Badger drops a squad of infantry\nanywhere on the map.
+ DropItems: E1,E1,E1,E3,E3
+ SelectTargetSound: slcttgt1.aud
+ AllowImpassableCells: false
+ QuantizedFacings: 8
+ CameraActor: camera.paradrop
+ DisplayBeacon: true
+ BeaconPoster: pinficon
+
mpspawn:
Immobile:
OccupiesSpace: false
diff --git a/mods/ra/rules/structures.yaml b/mods/ra/rules/structures.yaml
index 57ac362df8..875e40c599 100644
--- a/mods/ra/rules/structures.yaml
+++ b/mods/ra/rules/structures.yaml
@@ -1678,6 +1678,8 @@ BRIK:
CYCL:
Inherits: ^Wall
+ Tooltip:
+ Name: Chain-Link Barrier
Health:
HP: 100
Armor:
@@ -1691,6 +1693,8 @@ CYCL:
BARB:
Inherits: ^Wall
+ Tooltip:
+ Name: Barbed-Wire Fence
Health:
HP: 100
Armor:
@@ -1704,6 +1708,8 @@ BARB:
WOOD:
Inherits: ^Wall
+ Tooltip:
+ Name: Wooden Fence
Health:
HP: 100
Armor: