diff --git a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj
index e0d710e6e5..f7b5de4468 100644
--- a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj
+++ b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj
@@ -252,6 +252,7 @@
+
diff --git a/OpenRA.Mods.Common/Scripting/Properties/SellableProperties.cs b/OpenRA.Mods.Common/Scripting/Properties/SellableProperties.cs
new file mode 100644
index 0000000000..75b8630f7b
--- /dev/null
+++ b/OpenRA.Mods.Common/Scripting/Properties/SellableProperties.cs
@@ -0,0 +1,31 @@
+#region Copyright & License Information
+/*
+ * Copyright 2007-2016 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, either version 3 of
+ * the License, or (at your option) any later version. For more
+ * information, see COPYING.
+ */
+#endregion
+
+using OpenRA.Mods.Common.Traits;
+using OpenRA.Scripting;
+using OpenRA.Traits;
+
+namespace OpenRA.Mods.Common.Scripting
+{
+ [ScriptPropertyGroup("General")]
+ public class SellableProperties : ScriptActorProperties, Requires
+ {
+ public SellableProperties(ScriptContext context, Actor self)
+ : base(context, self) { }
+
+ [Desc("Start selling the actor.")]
+ public void Sell()
+ {
+ // PERF: No trait lookup cache in the constructor to avoid doing it for all buildings except just the ones getting sold.
+ Self.Trait().Sell(Self);
+ }
+ }
+}
diff --git a/OpenRA.Mods.Common/Scripting/ScriptTriggers.cs b/OpenRA.Mods.Common/Scripting/ScriptTriggers.cs
index ac820884b5..e9ed7be5f4 100644
--- a/OpenRA.Mods.Common/Scripting/ScriptTriggers.cs
+++ b/OpenRA.Mods.Common/Scripting/ScriptTriggers.cs
@@ -23,7 +23,7 @@ namespace OpenRA.Mods.Common.Scripting
OnIdle, OnDamaged, OnKilled, OnProduction, OnOtherProduction, OnPlayerWon, OnPlayerLost,
OnObjectiveAdded, OnObjectiveCompleted, OnObjectiveFailed, OnCapture, OnInfiltrated,
OnAddedToWorld, OnRemovedFromWorld, OnDiscovered, OnPlayerDiscovered,
- OnPassengerEntered, OnPassengerExited
+ OnPassengerEntered, OnPassengerExited, OnSelling, OnSold
}
[Desc("Allows map scripts to attach triggers to this actor via the Triggers global.")]
@@ -34,7 +34,7 @@ namespace OpenRA.Mods.Common.Scripting
public sealed class ScriptTriggers : INotifyIdle, INotifyDamage, INotifyKilled, INotifyProduction, INotifyOtherProduction,
INotifyObjectivesUpdated, INotifyCapture, INotifyInfiltrated, INotifyAddedToWorld, INotifyRemovedFromWorld, INotifyDiscovered, INotifyActorDisposing,
- INotifyPassengerEntered, INotifyPassengerExited
+ INotifyPassengerEntered, INotifyPassengerExited, INotifySold
{
readonly World world;
readonly Actor self;
@@ -364,6 +364,46 @@ namespace OpenRA.Mods.Common.Scripting
OnRemovedInternal(self);
}
+ void INotifySold.Selling(Actor self)
+ {
+ if (world.Disposing)
+ return;
+
+ // Run Lua callbacks
+ foreach (var f in Triggerables(Trigger.OnSelling))
+ {
+ try
+ {
+ f.Function.Call(f.Self).Dispose();
+ }
+ catch (Exception ex)
+ {
+ f.Context.FatalError(ex.Message);
+ return;
+ }
+ }
+ }
+
+ void INotifySold.Sold(Actor self)
+ {
+ if (world.Disposing)
+ return;
+
+ // Run Lua callbacks
+ foreach (var f in Triggerables(Trigger.OnSold))
+ {
+ try
+ {
+ f.Function.Call(f.Self).Dispose();
+ }
+ catch (Exception ex)
+ {
+ f.Context.FatalError(ex.Message);
+ return;
+ }
+ }
+ }
+
public void UnitProducedByOther(Actor self, Actor producee, Actor produced)
{
if (world.Disposing)
diff --git a/OpenRA.sln b/OpenRA.sln
index dddabd21dd..c28c02e405 100644
--- a/OpenRA.sln
+++ b/OpenRA.sln
@@ -73,6 +73,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Red Alert Lua scripts", "Re
mods\ra\maps\fort-lonestar\fort-lonestar-AI.lua = mods\ra\maps\fort-lonestar\fort-lonestar-AI.lua
mods\ra\maps\fort-lonestar\fort-lonestar.lua = mods\ra\maps\fort-lonestar\fort-lonestar.lua
mods\ra\maps\intervention\intervention.lua = mods\ra\maps\intervention\intervention.lua
+ mods\ra\maps\infiltration\infiltration.lua = mods\ra\maps\infiltration\infiltration.lua
mods\ra\maps\monster-tank-madness\monster-tank-madness.lua = mods\ra\maps\monster-tank-madness\monster-tank-madness.lua
mods\ra\maps\evacuation\evacuation.lua = mods\ra\maps\evacuation\evacuation.lua
mods\ra\maps\exodus\exodus.lua = mods\ra\maps\exodus\exodus.lua
diff --git a/mods/ra/maps/infiltration/infiltration.lua b/mods/ra/maps/infiltration/infiltration.lua
new file mode 100644
index 0000000000..c82b1c986e
--- /dev/null
+++ b/mods/ra/maps/infiltration/infiltration.lua
@@ -0,0 +1,383 @@
+Difficulty = Map.LobbyOption("difficulty")
+
+if Difficulty == "hard" then
+ TimerTicks = DateTime.Minutes(25)
+elseif Difficulty == "normal" then
+ TimerTicks = DateTime.Minutes(28)
+else
+ TimerTicks = DateTime.Minutes(31)
+end
+
+Announcements =
+{
+ { speech = "TwentyMinutesRemaining", delay = DateTime.Minutes(20) },
+ { speech = "TenMinutesRemaining", delay = DateTime.Minutes(10) },
+ { speech = "WarningFiveMinutesRemaining", delay = DateTime.Minutes(5) },
+ { speech = "WarningFourMinutesRemaining", delay = DateTime.Minutes(4) },
+ { speech = "WarningThreeMinutesRemaining", delay = DateTime.Minutes(3) },
+ { speech = "WarningTwoMinutesRemaining", delay = DateTime.Minutes(2) },
+ { speech = "WarningOneMinuteRemaining", delay = DateTime.Minutes(1) }
+}
+
+TownAttackers = { TownAttacker1, TownAttacker2, TownAttacker3, TownAttacker4, TownAttacker5, TownAttacker6, TownAttacker7 }
+
+PatrolPoints1 = { PatrolPoint11.Location, PatrolPoint12.Location, PatrolPoint13.Location, PatrolPoint14.Location, PatrolPoint15.Location }
+PatrolPoints2 = { PatrolPoint21.Location, PatrolPoint22.Location, PatrolPoint23.Location, PatrolPoint24.Location, PatrolPoint25.Location }
+PatrolPoints3 = { PatrolPoint31.Location, PatrolPoint32.Location, PatrolPoint33.Location, PatrolPoint34.Location }
+PatrolPoints4 = { PatrolPoint41.Location, PatrolPoint42.Location, PatrolPoint43.Location, PatrolPoint44.Location, PatrolPoint45.Location }
+
+Patrol1 = { "e1", "e1", "e1", "e1", "e1" }
+Patrol2 = { "e1", "dog.patrol", "dog.patrol" }
+Patrol3 = { "e1", "e1", "dog.patrol" }
+
+TransportType = "lst.unselectable.unloadonly"
+
+SecureLabFailed = function()
+ Utils.Do(humans, function(player)
+ if player then
+ player.MarkFailedObjective(secureLab)
+ end
+ end)
+end
+
+timerStarted = false
+StartTimer = function()
+ Utils.Do(humans, function(player)
+ if player.IsLocalPlayer then
+ TimerColor = player.Color
+ end
+ end)
+ CountDownTimerAnnouncements()
+ ticked = TimerTicks
+ timerStarted = true
+ Trigger.AfterDelay(DateTime.Seconds(3), function()
+ Utils.Do(humans, function(player)
+ Media.PlaySpeechNotification(player, "TimerStarted")
+ end)
+ end)
+end
+
+CountDownTimerAnnouncements = function()
+ for i = #Announcements, 1, -1 do
+ local delay = TimerTicks - Announcements[i].delay
+ Trigger.AfterDelay(delay, function()
+ if not labSecured then
+ Utils.Do(humans, function(player)
+ Media.PlaySpeechNotification(player, Announcements[i].speech)
+ end)
+ end
+ end)
+ end
+end
+
+reinforcementsHaveArrived = false
+LabInfiltrated = function()
+ Utils.Do(humans, function(player)
+ if player then
+ secureLab = player.AddPrimaryObjective("Eliminate all units guarding the lab.")
+ destroyBase = player.AddPrimaryObjective("Destroy the soviet installation.")
+ player.MarkCompletedObjective(infiltrateLab)
+ Trigger.ClearAll(Lab)
+ Trigger.AfterDelay(0, function()
+ Trigger.OnKilled(Lab, SecureLabFailed)
+ end)
+ end
+ end)
+
+ Camera.Position = ReinforcementsUnloadPoint.CenterPosition
+ local entryPath = { ReinforcementsEntryPoint.Location, ReinforcementsUnloadPoint.Location }
+ local exit = { ReinforcementsEntryPoint.Location }
+
+ mcvActors = { "mcv" }
+ if player2 then
+ mcvActors = { "mcv", "mcv" }
+ end
+
+ local reinforcements = Reinforcements.ReinforceWithTransport(allies, TransportType, mcvActors, entryPath, exit)
+ local mcvs = reinforcements[2]
+
+ Trigger.OnAddedToWorld(mcvs[1], function(mcvUnloaded)
+
+ -- Don't call this twice (because of the owner change)
+ if mcvUnloaded.Owner == player1 then
+ return
+ end
+
+ mcvUnloaded.Owner = player1
+ if not player2 then
+ player1.Cash = 5000
+ end
+ Media.PlaySpeechNotification(player, "AlliedReinforcementsSouth")
+ StartTimer()
+ HijackTruck.Destroy()
+ reinforcementsHaveArrived = true
+ end)
+
+ if player2 then
+ Trigger.OnAddedToWorld(mcvs[2], function(mcvUnloaded)
+
+ -- Don't call this twice (because of the owner change)
+ if mcvUnloaded.Owner == player2 then
+ return
+ end
+
+ mcvUnloaded.Owner = player2
+ player1.Cash = 2500
+ player2.Cash = 2500
+ end)
+ end
+
+ Utils.Do(humans, function(player)
+ for i = 0, 2 do
+ Trigger.AfterDelay(DateTime.Seconds(i), function()
+ Media.PlaySoundNotification(player, "AlertBuzzer")
+ end)
+ end
+ end)
+
+ local attackPoint = BridgeAttackPoint.CenterPosition
+ local radius = WDist.FromCells(5)
+ local bridge = Map.ActorsInCircle(attackPoint, radius, function(actor)
+ return actor.Type == "br3"
+ end)[1]
+ BridgeTank.Attack(bridge, true, true)
+end
+
+InfiltrateLabFailed = function()
+ Utils.Do(humans, function(player)
+ if player then
+ player.MarkFailedObjective(infiltrateLab)
+ end
+ end)
+end
+
+ChangeOwnerOnAddedToWorld = function(actor, newOwner)
+ Trigger.OnAddedToWorld(actor, function(unloadedActor)
+ unloadedActor.Owner = newOwner
+ Trigger.Clear(unloadedActor, "OnAddedToWorld")
+ end)
+end
+
+InsertSpies = function()
+ Utils.Do(humans, function(player)
+ if player then
+ infiltrateLab = player.AddPrimaryObjective("Get our spy into the laboratory undetected.")
+ end
+ end)
+
+ Trigger.OnKilled(Lab, function()
+ if not player1.IsObjectiveCompleted(infiltrateLab) then
+ InfiltrateLabFailed()
+ end
+ end)
+
+ -- The delay isn't purely cosmetic, but also prevents a System.InvalidOperationException
+ -- "Collection was modified after the enumerator was instantiated." in tick_activities
+ local infiltrationCount = 0
+ Trigger.OnInfiltrated(Lab, function()
+ infiltrationCount = infiltrationCount + 1
+
+ if (player2 and infiltrationCount == 2) or not player2 then
+ Trigger.AfterDelay(DateTime.Seconds(3), LabInfiltrated)
+ end
+ end)
+
+ spyActors = { "spy.strong" }
+ if player2 then
+ spyActors = { "spy.strong", "spy.strong" }
+ end
+
+ local entryPath = { SpyReinforcementsEntryPoint.Location, SpyReinforcementsUnloadPoint.Location }
+ local exit = { SpyReinforcementsExitPoint.Location }
+ local reinforcements = Reinforcements.ReinforceWithTransport(allies, TransportType, spyActors, entryPath, exit)
+
+ local transport = reinforcements[1]
+ Camera.Position = transport.CenterPosition
+
+ spies = reinforcements[2]
+ Trigger.OnAnyKilled(spies, InfiltrateLabFailed)
+
+ ChangeOwnerOnAddedToWorld(spies[1], player1)
+
+ if player2 then
+ ChangeOwnerOnAddedToWorld(spies[2], player2)
+ end
+end
+
+IdleHunt = function(unit)
+ Trigger.OnIdle(unit, unit.Hunt)
+end
+
+StopHunt = function(unit)
+ if not unit.IsDead then
+ Trigger.Clear(unit, "OnIdle")
+ end
+end
+
+AttackTown = function()
+ Utils.Do(TownAttackers, IdleHunt)
+
+ Trigger.OnRemovedFromWorld(Hospital, function()
+ Utils.Do(TownAttackers, StopHunt)
+ end)
+end
+
+CapOre = function(player)
+ if player.Resources > player.ResourceCapacity * 0.9 then
+ player.Resources = player.ResourceCapacity * 0.8
+ end
+end
+
+NewPatrol = function(actorType, start, waypoints)
+ local guard = Actor.Create(actorType, true, { Owner = soviets, Location = start })
+ guard.Patrol(waypoints, true, Utils.RandomInteger(50, 75))
+end
+
+SetupPatrols = function()
+ Utils.Do(Patrol1, function(patrol1) NewPatrol(patrol1, PatrolPoints1[1], PatrolPoints1) end)
+ Utils.Do(Patrol2, function(patrol2) NewPatrol(patrol2, PatrolPoints1[3], PatrolPoints1) end)
+ Utils.Do(Patrol2, function(patrol3) NewPatrol(patrol3, PatrolPoints3[1], PatrolPoints3) end)
+ Utils.Do(Patrol2, function(patrol4) NewPatrol(patrol4, PatrolPoints4[1], PatrolPoints4) end)
+
+ if Difficulty == "hard" then
+ Utils.Do(Patrol3, function(patrol5) NewPatrol(patrol5, PatrolPoints2[1], PatrolPoints2) end)
+ end
+
+ local checkpoint = { BaseGuardTruckPos.Location }
+ Trigger.OnEnteredFootprint(checkpoint, function(a, id)
+ Trigger.RemoveFootprintTrigger(id)
+ if not BaseGuard.IsDead then
+ BaseGuard.ScriptedMove(BaseGuardMovePos.Location)
+ end
+ end)
+end
+
+ticked = 0
+SecureLabTimer = function()
+ if not timerStarted or labSecured then
+ return
+ end
+
+ if ticked > 0 then
+ UserInterface.SetMissionText("Secure lab in: " .. Utils.FormatTime(ticked), TimerColor)
+ ticked = ticked - 1
+ elseif ticked <= 0 then
+ TimerColor = soviets.Color
+ UserInterface.SetMissionText("The Soviet research laboratory was not secured in time.", TimerColor)
+ SecureLabFailed()
+ end
+end
+
+SovietBaseMaintenanceSetup = function()
+ local sovietbuildings = Utils.Where(Map.NamedActors, function(a)
+ return a.Owner == soviets
+ and a.HasProperty("StartBuildingRepairs") and a.HasProperty("Sell")
+ end)
+
+ -- This includes killed, captured (actor is temporarily removed) and sold.
+ Trigger.OnAllRemovedFromWorld(sovietbuildings, function()
+ Utils.Do(humans, function(player)
+ player.MarkCompletedObjective(destroyBase)
+ end)
+ end)
+
+ Utils.Do(sovietbuildings, function(sovietbuilding)
+ Trigger.OnDamaged(sovietbuilding, function(building)
+ if building.Owner ~= soviets then
+ return
+ end
+ if building.Health < building.MaxHealth * 3/4 then
+ building.StartBuildingRepairs()
+ end
+ if building.Health < building.MaxHealth * 1/4 then
+ building.Sell()
+ end
+ end)
+ end)
+end
+
+CheckPlayerDefeat = function()
+ if not reinforcementsHaveArrived then
+ return
+ end
+
+ Utils.Do(humans, function(player)
+ if player.HasNoRequiredUnits() then
+ player.MarkFailedObjective(destroyBase)
+ end
+ end)
+end
+
+labSecured = false
+CheckLabSecured = function()
+ if not reinforcementsHaveArrived or labSecured then
+ return
+ end
+
+ if player1.HasNoRequiredUnits() or (player2 and player2.HasNoRequiredUnits()) then
+ Utils.Do(humans, function(player)
+ player.MarkFailedObjective(secureLab)
+ end)
+ end
+
+ local radius = WDist.FromCells(10)
+ local labGuards = Utils.Where(Map.ActorsInCircle(LabWaypoint.CenterPosition, radius), function(a)
+ return a.Owner == soviets and a.HasProperty("Move")
+ end)
+
+ if #labGuards < 1 then
+ labSecured = true
+ Utils.Do(humans, function(player)
+ player.MarkCompletedObjective(secureLab)
+ end)
+ UserInterface.SetMissionText("")
+ end
+end
+
+Tick = function()
+ CapOre(soviets)
+ SecureLabTimer()
+ CheckLabSecured()
+ CheckPlayerDefeat()
+end
+
+WorldLoaded = function()
+ allies = Player.GetPlayer("Allies")
+ neutral = Player.GetPlayer("Neutral")
+ creeps = Player.GetPlayer("Creeps")
+ soviets = Player.GetPlayer("Soviets")
+
+ player1 = Player.GetPlayer("Allies1")
+ player2 = Player.GetPlayer("Allies2")
+ humans = { player1, player2 }
+
+ Utils.Do(humans, function(player)
+ if player and player.IsLocalPlayer then
+ Trigger.OnObjectiveAdded(player, function(p, id)
+ local objectiveType = string.lower(p.GetObjectiveType(id))
+ Media.DisplayMessage(p.GetObjectiveDescription(id), "New " .. objectiveType .. " objective")
+ end)
+
+ Trigger.OnObjectiveCompleted(player, function(p, id)
+ Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective completed")
+ end)
+
+ Trigger.OnObjectiveFailed(player, function(p, id)
+ Media.DisplayMessage(p.GetObjectiveDescription(id), "Objective failed")
+ end)
+
+ Trigger.OnPlayerWon(player, function()
+ Media.PlaySpeechNotification(player, "MissionAccomplished")
+ end)
+
+ Trigger.OnPlayerLost(player, function()
+ Media.PlaySpeechNotification(player, "MissionFailed")
+ end)
+ end
+ end)
+
+ InsertSpies()
+ AttackTown()
+ SetupPatrols()
+ SovietBaseMaintenanceSetup()
+end
diff --git a/mods/ra/maps/infiltration/map.bin b/mods/ra/maps/infiltration/map.bin
new file mode 100644
index 0000000000..3fc82e3225
Binary files /dev/null and b/mods/ra/maps/infiltration/map.bin differ
diff --git a/mods/ra/maps/infiltration/map.png b/mods/ra/maps/infiltration/map.png
new file mode 100644
index 0000000000..29bfd56141
Binary files /dev/null and b/mods/ra/maps/infiltration/map.png differ
diff --git a/mods/ra/maps/infiltration/map.yaml b/mods/ra/maps/infiltration/map.yaml
new file mode 100644
index 0000000000..76956c26e7
--- /dev/null
+++ b/mods/ra/maps/infiltration/map.yaml
@@ -0,0 +1,1788 @@
+MapFormat: 11
+
+RequiresMod: ra
+
+Title: Infiltration
+
+Author: Scott_NZ
+
+Tileset: TEMPERAT
+
+MapSize: 128,128
+
+Bounds: 16,16,96,96
+
+Visibility: MissionSelector, Lobby
+
+Categories: Mission, Cooperative Mission
+
+Players:
+ PlayerReference@Neutral:
+ Name: Neutral
+ OwnsWorld: True
+ NonCombatant: True
+ Faction: allies
+ PlayerReference@Creeps:
+ Name: Creeps
+ NonCombatant: True
+ Faction: allies
+ Enemies: Soviets
+ PlayerReference@Allies1:
+ Name: Allies1
+ AllowBots: False
+ Playable: True
+ Required: True
+ LockFaction: True
+ Faction: allies
+ LockColor: True
+ Color: ABB7E4
+ LockSpawn: True
+ LockTeam: True
+ Allies: Allies2, Allies
+ Enemies: Soviets
+ PlayerReference@Allies2:
+ Name: Allies2
+ AllowBots: False
+ Playable: True
+ LockFaction: True
+ Faction: allies
+ LockColor: True
+ Color: A1EF8C
+ LockSpawn: True
+ LockTeam: True
+ Allies: Allies1, Allies
+ Enemies: Soviets
+ PlayerReference@Allies:
+ Name: Allies
+ Faction: allies
+ Color: 5CC1A3
+ Allies: Allies1, Allies2
+ Enemies: Soviets
+ PlayerReference@Soviets:
+ Name: Soviets
+ Faction: soviet
+ Color: FE1100
+ Enemies: Allies1, Allies2, Allies, Creeps
+
+Actors:
+ Actor2: v07
+ Location: 58,83
+ Owner: Creeps
+ Actor1: v05
+ Location: 54,89
+ Owner: Creeps
+ Actor56: t01
+ Location: 68,97
+ Owner: Neutral
+ Actor5: v03
+ Location: 66,84
+ Owner: Creeps
+ Actor25: t16
+ Location: 69,64
+ Owner: Neutral
+ Actor68: t08
+ Location: 65,93
+ Owner: Neutral
+ Actor26: tc04
+ Location: 69,61
+ Owner: Neutral
+ Actor27: t02
+ Location: 68,63
+ Owner: Neutral
+ Actor28: t07
+ Location: 67,78
+ Owner: Neutral
+ Actor30: t08
+ Location: 81,88
+ Owner: Neutral
+ Actor31: t14
+ Location: 84,88
+ Owner: Neutral
+ Actor33: t10
+ Location: 73,83
+ Owner: Neutral
+ Actor8: v07
+ Location: 66,95
+ Owner: Creeps
+ Actor0: v04
+ Location: 58,90
+ Owner: Creeps
+ Actor41: t12
+ Location: 73,69
+ Owner: Neutral
+ Actor44: t13
+ Location: 83,78
+ Owner: Neutral
+ Actor47: v01
+ Location: 70,84
+ Owner: Creeps
+ Actor10: v02
+ Location: 73,90
+ Owner: Creeps
+ Actor236: sbag
+ Location: 66,36
+ Owner: Soviets
+ Actor233: sbag
+ Location: 66,35
+ Owner: Soviets
+ Actor235: sbag
+ Location: 68,35
+ Owner: Soviets
+ Actor234: sbag
+ Location: 67,35
+ Owner: Soviets
+ Actor222: hpad
+ Location: 56,36
+ Owner: Soviets
+ Actor57: t07
+ Location: 74,64
+ Owner: Neutral
+ Actor49: tc02
+ Location: 63,79
+ Owner: Neutral
+ Actor48: t14
+ Location: 63,90
+ Owner: Neutral
+ Actor66: tc03
+ Location: 87,89
+ Owner: Neutral
+ Actor77: mine
+ Location: 96,85
+ Owner: Neutral
+ Actor78: tc04
+ Location: 103,78
+ Owner: Neutral
+ Actor80: t07
+ Location: 81,81
+ Owner: Neutral
+ Actor81: t06
+ Location: 111,82
+ Owner: Neutral
+ Actor82: t03
+ Location: 110,76
+ Owner: Neutral
+ Actor84: tc02
+ Location: 94,75
+ Owner: Neutral
+ Actor9: v01
+ Location: 64,94
+ Owner: Creeps
+ Actor53: powr
+ Location: 86,65
+ Owner: Soviets
+ Actor113: tc05
+ Location: 86,59
+ Owner: Neutral
+ Actor51: barr
+ Location: 93,70
+ Owner: Soviets
+ Lab: miss
+ Location: 34,30
+ Owner: Soviets
+ LabWaypoint: waypoint
+ Location: 34,30
+ Owner: Neutral
+ Actor45: brik
+ Location: 39,34
+ Owner: Soviets
+ Actor43: brik
+ Location: 39,33
+ Owner: Soviets
+ Actor42: brik
+ Location: 39,32
+ Owner: Soviets
+ Actor39: brik
+ Location: 39,31
+ Owner: Soviets
+ Actor38: brik
+ Location: 39,30
+ Owner: Soviets
+ Actor34: brik
+ Location: 38,28
+ Owner: Soviets
+ Actor36: brik
+ Location: 39,29
+ Owner: Soviets
+ Actor494: e4
+ Location: 98,38
+ Owner: Soviets
+ Actor495: e4
+ Location: 48,34
+ Owner: Soviets
+ Actor58: brik
+ Location: 32,28
+ Owner: Soviets
+ Actor35: brik
+ Location: 39,28
+ Owner: Soviets
+ Actor110: e1
+ Location: 33,28
+ Owner: Soviets
+ Actor60: apwr
+ Location: 44,46
+ Owner: Soviets
+ Actor22: brik
+ Location: 32,34
+ Owner: Soviets
+ Actor95: brik
+ Location: 32,29
+ Owner: Soviets
+ Actor97: brik
+ Location: 32,30
+ Owner: Soviets
+ Actor98: brik
+ Location: 32,31
+ Owner: Soviets
+ Actor100: brik
+ Location: 32,33
+ Owner: Soviets
+ Actor263: 3tnk
+ Location: 37,35
+ Owner: Soviets
+ Actor138: e2
+ Location: 39,37
+ Owner: Soviets
+ Actor99: brik
+ Location: 32,32
+ Owner: Soviets
+ Actor106: hpad
+ Location: 34,42
+ Owner: Soviets
+ Actor21: brik
+ Location: 33,34
+ Owner: Soviets
+ Actor14: brik
+ Location: 32,35
+ Owner: Soviets
+ Actor55: brik
+ Location: 32,26
+ Owner: Soviets
+ Actor40: apwr
+ Location: 44,43
+ Owner: Soviets
+ Actor69: barr
+ Location: 60,33
+ Owner: Soviets
+ Actor96: barr
+ Location: 107,36
+ Owner: Soviets
+ Actor94: barr
+ Location: 39,41
+ Owner: Soviets
+ Actor102: ftur
+ Location: 46,39
+ Owner: Soviets
+ Actor4: brik
+ Location: 38,34
+ Owner: Soviets
+ Actor121: e1
+ Location: 100,21
+ Owner: Soviets
+ Actor59: sam
+ Location: 47,60
+ Owner: Soviets
+ TurretFacing: 160
+ Actor61: apwr
+ Location: 45,49
+ Owner: Soviets
+ Actor62: apwr
+ Location: 46,52
+ Owner: Soviets
+ Actor29: brik
+ Location: 35,26
+ Owner: Soviets
+ Actor76: ftur
+ Location: 78,22
+ Owner: Soviets
+ Actor83: ftur
+ Location: 67,34
+ Owner: Soviets
+ Actor73: spen
+ Location: 31,82
+ Owner: Soviets
+ Actor37: dome
+ Location: 44,57
+ Owner: Soviets
+ Actor65: sam
+ Location: 50,37
+ Owner: Soviets
+ TurretFacing: 192
+ Actor70: spen
+ Location: 39,71
+ Owner: Soviets
+ Actor71: spen
+ Location: 25,68
+ Owner: Soviets
+ Actor64: sam
+ Location: 28,43
+ Owner: Soviets
+ TurretFacing: 48
+ Actor72: spen
+ Location: 23,76
+ Owner: Soviets
+ Actor67: fact
+ Location: 42,52
+ Owner: Soviets
+ Actor85: kenn
+ Location: 58,32
+ Owner: Soviets
+ Actor103: afld
+ Location: 34,51
+ Owner: Soviets
+ Actor20: fcom
+ Location: 39,50
+ Owner: Soviets
+ Actor18: afld
+ Location: 34,45
+ Owner: Soviets
+ Actor79: afld
+ Location: 34,47
+ Owner: Soviets
+ Actor74: ftur
+ Location: 31,36
+ Owner: Soviets
+ Actor32: brik
+ Location: 34,26
+ Owner: Soviets
+ Actor493: e4
+ Location: 102,24
+ Owner: Soviets
+ Actor274: e3
+ Location: 34,41
+ Owner: Soviets
+ Actor452: e4
+ Location: 34,32
+ Owner: Soviets
+ Actor112: fenc
+ Location: 96,39
+ Owner: Soviets
+ Actor15: brik
+ Location: 33,35
+ Owner: Soviets
+ Actor126: e1
+ Location: 109,22
+ Owner: Soviets
+ Actor107: hpad
+ Location: 36,42
+ Owner: Soviets
+ Actor129: kenn
+ Location: 110,37
+ Owner: Soviets
+ Actor108: stek
+ Location: 38,55
+ Owner: Soviets
+ Actor7: brik
+ Location: 38,35
+ Owner: Soviets
+ Actor46: brik
+ Location: 33,26
+ Owner: Soviets
+ Actor6: brik
+ Location: 39,35
+ Owner: Soviets
+ Actor117: fenc
+ Location: 98,39
+ Owner: Soviets
+ Actor116: fenc
+ Location: 97,39
+ Owner: Soviets
+ Actor111: fenc
+ Location: 95,37
+ Owner: Soviets
+ Actor16: fenc
+ Location: 95,38
+ Owner: Soviets
+ Actor13: fenc
+ Location: 95,39
+ Owner: Soviets
+ Actor120: e1
+ Location: 107,41
+ Owner: Soviets
+ Actor119: e1
+ Location: 99,41
+ Owner: Soviets
+ Actor279: dog
+ Location: 101,38
+ Owner: Soviets
+ Actor151: fenc
+ Location: 111,39
+ Owner: Soviets
+ Actor125: fenc
+ Location: 110,39
+ Owner: Soviets
+ Actor124: fenc
+ Location: 109,39
+ Owner: Soviets
+ Actor127: fenc
+ Location: 99,39
+ Owner: Soviets
+ Actor148: e1
+ Location: 92,20
+ Owner: Soviets
+ Actor128: ftur
+ Location: 42,61
+ Owner: Soviets
+ Actor93: afld
+ Location: 34,49
+ Owner: Soviets
+ Actor101: kenn
+ Location: 41,47
+ Owner: Soviets
+ Actor133: apwr
+ Location: 97,16
+ Owner: Soviets
+ Actor131: apwr
+ Location: 107,16
+ Owner: Soviets
+ Actor132: apwr
+ Location: 107,19
+ Owner: Soviets
+ Actor130: apwr
+ Location: 101,16
+ Owner: Soviets
+ Actor134: proc
+ Location: 106,30
+ Owner: Soviets
+ Actor135: fix
+ Location: 102,25
+ Owner: Soviets
+ Actor136: dome
+ Location: 107,25
+ Owner: Soviets
+ HijackFactory: weap
+ Location: 98,32
+ Owner: Soviets
+ Actor12: sam
+ Location: 34,27
+ Owner: Soviets
+ Actor297: v08
+ Location: 68,95
+ Owner: Creeps
+ Actor142: fenc
+ Location: 91,16
+ Owner: Soviets
+ Actor141: fenc
+ Location: 91,17
+ Owner: Soviets
+ Actor140: fenc
+ Location: 91,18
+ Owner: Soviets
+ Actor139: fenc
+ Location: 91,19
+ Owner: Soviets
+ Actor145: ftur
+ Location: 90,23
+ Owner: Soviets
+ Actor146: ftur
+ Location: 90,19
+ Owner: Soviets
+ Actor147: e1
+ Location: 92,23
+ Owner: Soviets
+ Actor118: ftur
+ Location: 99,40
+ Owner: Soviets
+ Actor149: fact
+ Location: 95,25
+ Owner: Soviets
+ Actor304: 3tnk
+ Location: 106,38
+ Owner: Soviets
+ Facing: 96
+ Actor488: t02
+ Location: 110,28
+ Owner: Neutral
+ Actor123: fenc
+ Location: 108,39
+ Owner: Soviets
+ Actor153: apwr
+ Location: 101,19
+ Owner: Soviets
+ Actor154: apwr
+ Location: 93,16
+ Owner: Soviets
+ Actor155: powr
+ Location: 45,41
+ Owner: Soviets
+ Actor156: apwr
+ Location: 47,55
+ Owner: Soviets
+ Actor157: tc02
+ Location: 27,46
+ Owner: Neutral
+ Actor158: t12
+ Location: 26,46
+ Owner: Neutral
+ Actor159: tc05
+ Location: 23,45
+ Owner: Neutral
+ Actor160: tc04
+ Location: 23,43
+ Owner: Neutral
+ Actor161: e1
+ Location: 22,42
+ Owner: Soviets
+ Actor162: t12
+ Location: 22,39
+ Owner: Neutral
+ Actor163: t03
+ Location: 24,36
+ Owner: Neutral
+ Actor164: t01
+ Location: 23,38
+ Owner: Neutral
+ Actor165: t15
+ Location: 23,36
+ Owner: Neutral
+ Actor166: tc05
+ Location: 22,33
+ Owner: Neutral
+ Actor167: t02
+ Location: 25,31
+ Owner: Neutral
+ Actor168: t03
+ Location: 26,26
+ Owner: Neutral
+ Actor169: tc04
+ Location: 28,19
+ Owner: Neutral
+ Actor170: t11
+ Location: 25,28
+ Owner: Neutral
+ Actor171: tc02
+ Location: 23,30
+ Owner: Neutral
+ Actor172: tc05
+ Location: 26,24
+ Owner: Neutral
+ Actor173: t01
+ Location: 28,21
+ Owner: Neutral
+ Actor174: t03
+ Location: 31,20
+ Owner: Neutral
+ Actor63: apwr
+ Location: 32,53
+ Owner: Soviets
+ Actor176: tc02
+ Location: 50,62
+ Owner: Neutral
+ Actor177: tc01
+ Location: 52,51
+ Owner: Neutral
+ Actor178: t17
+ Location: 51,44
+ Owner: Neutral
+ Actor179: t07
+ Location: 30,39
+ Owner: Neutral
+ Actor175: sam
+ Location: 30,58
+ Owner: Soviets
+ TurretFacing: 96
+ Actor181: t12
+ Location: 27,54
+ Owner: Neutral
+ Actor182: t08
+ Location: 28,56
+ Owner: Neutral
+ Actor183: t06
+ Location: 47,25
+ Owner: Neutral
+ Actor184: t05
+ Location: 41,26
+ Owner: Neutral
+ Actor185: tc02
+ Location: 43,22
+ Owner: Neutral
+ Actor186: tc05
+ Location: 49,20
+ Owner: Neutral
+ Actor187: t15
+ Location: 44,19
+ Owner: Neutral
+ Actor188: tc05
+ Location: 46,21
+ Owner: Neutral
+ Actor189: tc04
+ Location: 41,20
+ Owner: Neutral
+ Actor190: t03
+ Location: 37,20
+ Owner: Neutral
+ Actor191: tc04
+ Location: 54,38
+ Owner: Neutral
+ Actor192: tc05
+ Location: 59,38
+ Owner: Neutral
+ Actor193: tc02
+ Location: 49,45
+ Owner: Neutral
+ Actor194: t03
+ Location: 54,40
+ Owner: Neutral
+ Actor195: t03
+ Location: 35,72
+ Owner: Neutral
+ Actor196: tc01
+ Location: 30,71
+ Owner: Neutral
+ Actor197: t08
+ Location: 27,79
+ Owner: Neutral
+ Actor198: t15
+ Location: 52,57
+ Owner: Neutral
+ Actor199: tc01
+ Location: 49,34
+ Owner: Neutral
+ Actor200: t11
+ Location: 28,28
+ Owner: Neutral
+ Actor201: t07
+ Location: 38,64
+ Owner: Neutral
+ Actor202: t06
+ Location: 50,54
+ Owner: Neutral
+ Actor203: t12
+ Location: 60,31
+ Owner: Neutral
+ Actor204: tc02
+ Location: 74,16
+ Owner: Neutral
+ Actor205: t07
+ Location: 69,19
+ Owner: Neutral
+ Actor206: tc04
+ Location: 87,16
+ Owner: Neutral
+ Actor207: tc05
+ Location: 84,16
+ Owner: Neutral
+ Actor208: tc03
+ Location: 82,18
+ Owner: Neutral
+ Actor209: t16
+ Location: 84,18
+ Owner: Neutral
+ Actor210: tc02
+ Location: 82,15
+ Owner: Neutral
+ Actor211: t02
+ Location: 74,18
+ Owner: Neutral
+ Actor212: t01
+ Location: 92,29
+ Owner: Neutral
+ Actor213: t16
+ Location: 102,22
+ Owner: Neutral
+ Actor214: silo
+ Location: 109,29
+ Owner: Soviets
+ Actor215: t01
+ Location: 96,36
+ Owner: Neutral
+ Actor216: mine
+ Location: 103,57
+ Owner: Neutral
+ Actor218: fenc
+ Location: 81,65
+ Owner: Soviets
+ Actor219: fenc
+ Location: 81,66
+ Owner: Soviets
+ Actor220: fenc
+ Location: 81,67
+ Owner: Soviets
+ Actor221: 4tnk
+ Location: 39,46
+ Owner: Soviets
+ Facing: 0
+ Actor228: brik
+ Location: 102,34
+ Owner: Soviets
+ Actor514: brik
+ Location: 103,34
+ Owner: Soviets
+ Actor227: e1
+ Location: 98,28
+ Owner: Soviets
+ Actor226: fenc
+ Location: 95,35
+ Owner: Soviets
+ Actor225: fenc
+ Location: 95,36
+ Owner: Soviets
+ Actor224: 4tnk
+ Location: 103,30
+ Owner: Soviets
+ Actor144: 4tnk
+ Location: 42,58
+ Owner: Soviets
+ Actor52: hpad
+ Location: 83,65
+ Owner: Soviets
+ Actor387: powr
+ Location: 89,64
+ Owner: Soviets
+ Actor231: e1
+ Location: 104,40
+ Owner: Soviets
+ Actor238: sbag
+ Location: 65,37
+ Owner: Soviets
+ Actor237: sbag
+ Location: 66,37
+ Owner: Soviets
+ Actor229: v2rl
+ Location: 96,19
+ Owner: Soviets
+ Facing: 64
+ Actor137: e1
+ Location: 66,34
+ Owner: Soviets
+ Actor50: fenc
+ Location: 81,68
+ Owner: Soviets
+ Actor242: ftur
+ Location: 90,74
+ Owner: Soviets
+ Actor241: fenc
+ Location: 93,74
+ Owner: Soviets
+ Actor240: fenc
+ Location: 94,74
+ Owner: Soviets
+ Actor239: fenc
+ Location: 95,74
+ Owner: Soviets
+ Actor232: fenc
+ Location: 96,74
+ Owner: Soviets
+ Actor244: sbag
+ Location: 64,37
+ Owner: Soviets
+ Actor245: e3
+ Location: 67,36
+ Owner: Soviets
+ Actor246: e3
+ Location: 63,38
+ Owner: Soviets
+ Actor247: e1
+ Location: 69,34
+ Owner: Soviets
+ Actor248: e1
+ Location: 57,35
+ Owner: Soviets
+ Actor249: e1
+ Location: 59,33
+ Owner: Soviets
+ Actor250: e1
+ Location: 47,31
+ Owner: Soviets
+ Actor251: e1
+ Location: 42,38
+ Owner: Soviets
+ Actor252: e1
+ Location: 46,38
+ Owner: Soviets
+ Actor253: e1
+ Location: 49,27
+ Owner: Soviets
+ Actor254: e1
+ Location: 37,64
+ Owner: Soviets
+ Actor255: e1
+ Location: 32,63
+ Owner: Soviets
+ Actor256: e1
+ Location: 40,58
+ Owner: Soviets
+ Actor257: e1
+ Location: 44,61
+ Owner: Soviets
+ Actor322: v2rl
+ Location: 36,57
+ Owner: Soviets
+ Actor259: e1
+ Location: 43,48
+ Owner: Soviets
+ Actor260: e1
+ Location: 37,45
+ Owner: Soviets
+ Actor261: e1
+ Location: 31,40
+ Owner: Soviets
+ Actor262: e1
+ Location: 37,31
+ Owner: Soviets
+ Actor17: brik
+ Location: 37,28
+ Owner: Soviets
+ Actor264: v2rl
+ Location: 50,36
+ Owner: Soviets
+ Facing: 192
+ Actor266: 3tnk
+ Location: 88,70
+ Owner: Soviets
+ Actor268: dog
+ Location: 64,34
+ Owner: Soviets
+ Actor269: dog
+ Location: 44,38
+ Owner: Soviets
+ Actor180: apwr
+ Location: 31,59
+ Owner: Soviets
+ Actor270: dog
+ Location: 43,60
+ Owner: Soviets
+ Actor265: 3tnk
+ Location: 90,46
+ Owner: Soviets
+ Actor271: dog
+ Location: 37,40
+ Owner: Soviets
+ Actor122: fenc
+ Location: 107,39
+ Owner: Soviets
+ Actor152: ftur
+ Location: 107,40
+ Owner: Soviets
+ Actor275: tc02
+ Location: 74,48
+ Owner: Neutral
+ Actor276: t03
+ Location: 91,43
+ Owner: Neutral
+ Actor272: 3tnk
+ Location: 102,37
+ Owner: Soviets
+ Facing: 160
+ Actor280: t16
+ Location: 87,41
+ Owner: Neutral
+ Actor281: tc02
+ Location: 85,42
+ Owner: Neutral
+ Actor282: t02
+ Location: 85,48
+ Owner: Neutral
+ Actor283: t13
+ Location: 72,54
+ Owner: Neutral
+ Actor284: t03
+ Location: 84,56
+ Owner: Neutral
+ Actor285: tc02
+ Location: 109,52
+ Owner: Neutral
+ Actor286: t03
+ Location: 110,61
+ Owner: Neutral
+ Actor287: t07
+ Location: 100,62
+ Owner: Neutral
+ Actor288: t06
+ Location: 91,53
+ Owner: Neutral
+ Actor289: t13
+ Location: 81,47
+ Owner: Neutral
+ Actor290: t12
+ Location: 110,42
+ Owner: Neutral
+ Actor291: t02
+ Location: 102,49
+ Owner: Neutral
+ Actor292: tc04
+ Location: 87,38
+ Owner: Neutral
+ Actor293: t02
+ Location: 86,40
+ Owner: Neutral
+ Actor294: t11
+ Location: 89,42
+ Owner: Neutral
+ Actor295: t07
+ Location: 84,40
+ Owner: Neutral
+ PatrolPoint22: waypoint
+ Location: 92,49
+ Owner: Neutral
+ Actor515: wood
+ Location: 66,100
+ Owner: Neutral
+ Actor298: t01
+ Location: 90,61
+ Owner: Neutral
+ Actor299: t13
+ Location: 108,66
+ Owner: Neutral
+ Actor300: dog
+ Location: 41,49
+ Owner: Soviets
+ Actor338: ss
+ Location: 57,64
+ Owner: Soviets
+ Actor301: mine
+ Location: 101,55
+ Owner: Neutral
+ Actor337: ss
+ Location: 19,80
+ Owner: Soviets
+ Actor316: ss
+ Location: 32,92
+ Owner: Soviets
+ Actor336: ss
+ Location: 46,80
+ Owner: Soviets
+ Actor308: tc02
+ Location: 78,104
+ Owner: Neutral
+ Actor309: t15
+ Location: 72,101
+ Owner: Neutral
+ Actor310: oilb
+ Location: 77,17
+ Owner: Soviets
+ Actor307: tc02
+ Location: 82,97
+ Owner: Neutral
+ Actor311: oilb
+ Location: 32,76
+ Owner: Soviets
+ Actor114: c1
+ Location: 69,84
+ Owner: Creeps
+ Actor217: c3
+ Location: 63,96
+ Owner: Creeps
+ Actor54: c1
+ Location: 67,99
+ Owner: Creeps
+ Actor317: e2
+ Location: 106,26
+ Owner: Soviets
+ Actor318: e2
+ Location: 94,20
+ Owner: Soviets
+ Actor319: e3
+ Location: 97,29
+ Owner: Soviets
+ Actor320: e3
+ Location: 109,27
+ Owner: Soviets
+ Actor321: e3
+ Location: 48,36
+ Owner: Soviets
+ Actor267: dog
+ Location: 35,61
+ Owner: Soviets
+ Actor323: e3
+ Location: 30,43
+ Owner: Soviets
+ Actor324: e3
+ Location: 38,30
+ Owner: Soviets
+ Actor325: e2
+ Location: 32,36
+ Owner: Soviets
+ Actor326: e2
+ Location: 62,35
+ Owner: Soviets
+ Actor327: e2
+ Location: 37,48
+ Owner: Soviets
+ Actor329: e2
+ Location: 46,28
+ Owner: Soviets
+ Actor330: e2
+ Location: 35,67
+ Owner: Soviets
+ Actor331: e1
+ Location: 27,78
+ Owner: Soviets
+ Actor332: e2
+ Location: 29,79
+ Owner: Soviets
+ Actor333: e1
+ Location: 75,22
+ Owner: Soviets
+ Actor334: e2
+ Location: 101,29
+ Owner: Soviets
+ Actor335: e2
+ Location: 77,20
+ Owner: Soviets
+ SpyReinforcementsExitPoint: waypoint
+ Location: 48,111
+ Owner: Neutral
+ Actor305: ss
+ Location: 19,101
+ Owner: Soviets
+ Actor258: apwr
+ Location: 32,56
+ Owner: Soviets
+ Actor340: v09
+ Location: 72,86
+ Owner: Creeps
+ Actor339: e1
+ Location: 21,35
+ Owner: Soviets
+ Actor342: v05
+ Location: 68,88
+ Owner: Creeps
+ Actor341: e1
+ Location: 24,27
+ Owner: Soviets
+ Actor344: v08
+ Location: 65,99
+ Owner: Creeps
+ Actor345: v16
+ Location: 59,97
+ Owner: Neutral
+ Actor346: v18
+ Location: 60,97
+ Owner: Neutral
+ Actor347: v17
+ Location: 61,97
+ Owner: Neutral
+ Actor348: v06
+ Location: 60,96
+ Owner: Creeps
+ Actor349: v14
+ Location: 66,83
+ Owner: Neutral
+ Actor351: t11
+ Location: 62,100
+ Owner: Neutral
+ Actor352: tc04
+ Location: 55,94
+ Owner: Neutral
+ Actor353: tc03
+ Location: 56,96
+ Owner: Neutral
+ Actor354: t12
+ Location: 68,99
+ Owner: Neutral
+ Actor355: tc01
+ Location: 66,93
+ Owner: Neutral
+ Actor356: tc02
+ Location: 66,89
+ Owner: Neutral
+ Actor357: t10
+ Location: 60,88
+ Owner: Neutral
+ Actor358: t14
+ Location: 59,87
+ Owner: Neutral
+ Actor359: tc04
+ Location: 58,88
+ Owner: Neutral
+ Actor360: tc02
+ Location: 58,80
+ Owner: Neutral
+ Actor361: tc01
+ Location: 79,92
+ Owner: Neutral
+ Actor362: t07
+ Location: 77,89
+ Owner: Neutral
+ Actor363: t02
+ Location: 77,84
+ Owner: Neutral
+ Actor364: t01
+ Location: 73,91
+ Owner: Neutral
+ Actor273: v10
+ Location: 58,86
+ Owner: Creeps
+ Actor343: e1
+ Location: 28,49
+ Owner: Soviets
+ Actor367: e1
+ Location: 27,60
+ Owner: Soviets
+ Actor368: t02
+ Location: 75,92
+ Owner: Neutral
+ Actor369: tc03
+ Location: 75,84
+ Owner: Neutral
+ Actor370: t16
+ Location: 99,98
+ Owner: Neutral
+ Actor371: t02
+ Location: 110,92
+ Owner: Neutral
+ Actor372: t08
+ Location: 89,96
+ Owner: Neutral
+ Actor373: tc03
+ Location: 94,100
+ Owner: Neutral
+ Actor374: wood
+ Location: 67,100
+ Owner: Neutral
+ Actor375: e1
+ Location: 89,47
+ Owner: Soviets
+ Actor376: e1
+ Location: 91,46
+ Owner: Soviets
+ Actor377: dog
+ Location: 91,48
+ Owner: Soviets
+ Actor378: t10
+ Location: 81,74
+ Owner: Neutral
+ Actor379: tc02
+ Location: 100,75
+ Owner: Neutral
+ Actor380: tc05
+ Location: 99,72
+ Owner: Neutral
+ Actor381: tc04
+ Location: 103,74
+ Owner: Neutral
+ Actor382: tc03
+ Location: 104,72
+ Owner: Neutral
+ Actor383: tc02
+ Location: 109,65
+ Owner: Neutral
+ Actor384: t07
+ Location: 103,65
+ Owner: Neutral
+ Actor385: t06
+ Location: 91,64
+ Owner: Neutral
+ Actor386: t05
+ Location: 100,68
+ Owner: Neutral
+ Actor243: ftur
+ Location: 81,69
+ Owner: Soviets
+ Actor223: e3
+ Location: 39,53
+ Owner: Soviets
+ Actor278: ftur
+ Location: 37,58
+ Owner: Soviets
+ Actor391: ftur
+ Location: 94,66
+ Owner: Soviets
+ Actor392: e1
+ Location: 83,69
+ Owner: Soviets
+ Actor393: e1
+ Location: 90,76
+ Owner: Soviets
+ Actor394: e1
+ Location: 92,67
+ Owner: Soviets
+ Actor395: e2
+ Location: 88,67
+ Owner: Soviets
+ Actor396: e2
+ Location: 85,75
+ Owner: Soviets
+ Actor397: e1
+ Location: 96,72
+ Owner: Soviets
+ Actor398: e1
+ Location: 89,71
+ Owner: Soviets
+ Actor399: tsla
+ Location: 94,22
+ Owner: Soviets
+ Actor400: e1
+ Location: 49,66
+ Owner: Soviets
+ Actor402: ftur
+ Location: 26,40
+ Owner: Soviets
+ Actor328: v2rl
+ Location: 27,37
+ Owner: Soviets
+ Facing: 64
+ Actor366: powr
+ Location: 35,54
+ Owner: Soviets
+ Actor403: powr
+ Location: 56,31
+ Owner: Soviets
+ SpyReinforcementsEntryPoint: waypoint
+ Location: 16,107
+ Owner: Neutral
+ Actor404: ss
+ Location: 80,33
+ Owner: Soviets
+ Actor405: ss
+ Location: 65,47
+ Owner: Soviets
+ Actor406: ss
+ Location: 20,56
+ Owner: Soviets
+ Actor312: t17
+ Location: 88,100
+ Owner: Neutral
+ PatrolPoint13: waypoint
+ Location: 81,86
+ Owner: Neutral
+ PatrolPoint12: waypoint
+ Location: 74,78
+ Owner: Neutral
+ PatrolPoint11: waypoint
+ Location: 77,70
+ Owner: Neutral
+ PatrolPoint15: waypoint
+ Location: 88,73
+ Owner: Neutral
+ PatrolPoint14: waypoint
+ Location: 91,83
+ Owner: Neutral
+ PatrolPoint21: waypoint
+ Location: 105,45
+ Owner: Neutral
+ PatrolPoint23: waypoint
+ Location: 78,53
+ Owner: Neutral
+ PatrolPoint24: waypoint
+ Location: 92,56
+ Owner: Neutral
+ PatrolPoint25: waypoint
+ Location: 106,53
+ Owner: Neutral
+ Actor409: e1
+ Location: 76,59
+ Owner: Soviets
+ Actor410: v2rl
+ Location: 74,59
+ Owner: Soviets
+ Actor3: dog
+ Location: 74,52
+ Owner: Soviets
+ Actor416: dog
+ Location: 82,73
+ Owner: Soviets
+ Actor413: sbag
+ Location: 75,60
+ Owner: Soviets
+ Actor414: sbag
+ Location: 74,60
+ Owner: Soviets
+ Actor412: proc
+ Location: 84,68
+ Owner: Soviets
+ Actor472: brl3
+ Location: 77,101
+ Owner: Soviets
+ Actor417: sbag
+ Location: 73,60
+ Owner: Soviets
+ Actor296: kenn
+ Location: 90,68
+ Owner: Soviets
+ Actor303: e2
+ Location: 100,38
+ Owner: Soviets
+ Actor408: dog
+ Location: 108,42
+ Owner: Soviets
+ Actor418: dog
+ Location: 109,74
+ Owner: Soviets
+ Actor419: e1
+ Location: 108,75
+ Owner: Soviets
+ Actor420: e1
+ Location: 110,75
+ Owner: Soviets
+ Actor421: sbag
+ Location: 108,73
+ Owner: Soviets
+ Actor422: sbag
+ Location: 109,73
+ Owner: Soviets
+ Actor423: sbag
+ Location: 110,73
+ Owner: Soviets
+ Actor424: sbag
+ Location: 111,73
+ Owner: Soviets
+ PatrolPoint43: waypoint
+ Location: 109,51
+ Owner: Neutral
+ PatrolPoint42: waypoint
+ Location: 109,44
+ Owner: Neutral
+ PatrolPoint41: waypoint
+ Location: 102,41
+ Owner: Neutral
+ PatrolPoint45: waypoint
+ Location: 93,42
+ Owner: Neutral
+ PatrolPoint44: waypoint
+ Location: 96,53
+ Owner: Neutral
+ Actor425: dog
+ Location: 79,22
+ Owner: Soviets
+ Actor426: dog
+ Location: 93,19
+ Owner: Soviets
+ Actor427: dog
+ Location: 104,24
+ Owner: Soviets
+ HijackTruck: truk.hijackable
+ Location: 99,34
+ Owner: Soviets
+ Facing: 160
+ BaseGuard: e1
+ Location: 63,36
+ Owner: Soviets
+ Actor429: cycl
+ Location: 63,33
+ Owner: Soviets
+ Actor428: cycl
+ Location: 63,34
+ Owner: Soviets
+ Actor230: cycl
+ Location: 63,35
+ Owner: Soviets
+ Actor430: sbag
+ Location: 68,34
+ Owner: Soviets
+ Actor431: sbag
+ Location: 68,33
+ Owner: Soviets
+ Actor432: cycl
+ Location: 63,32
+ Owner: Soviets
+ Actor433: sbag
+ Location: 63,37
+ Owner: Soviets
+ BaseGuardMovePos: waypoint
+ Location: 62,37
+ Owner: Neutral
+ BaseGuardTruckPos: waypoint
+ Location: 64,36
+ Owner: Neutral
+ Actor411: e2
+ Location: 73,53
+ Owner: Soviets
+ Actor434: e1
+ Location: 94,54
+ Owner: Soviets
+ Actor435: dog
+ Location: 95,54
+ Owner: Soviets
+ Actor436: e1
+ Location: 82,44
+ Owner: Soviets
+ Actor437: e1
+ Location: 80,43
+ Owner: Soviets
+ Actor438: dog
+ Location: 81,43
+ Owner: Soviets
+ Actor439: e1
+ Location: 109,48
+ Owner: Soviets
+ Actor440: dog
+ Location: 108,48
+ Owner: Soviets
+ Actor441: 3tnk
+ Location: 108,47
+ Owner: Soviets
+ Actor442: brl3
+ Location: 82,65
+ Owner: Soviets
+ Actor443: brl3
+ Location: 82,66
+ Owner: Soviets
+ Actor444: barl
+ Location: 83,67
+ Owner: Soviets
+ Actor445: brl3
+ Location: 88,65
+ Owner: Soviets
+ Actor446: barl
+ Location: 89,66
+ Owner: Soviets
+ Actor447: barl
+ Location: 87,67
+ Owner: Soviets
+ Actor448: brl3
+ Location: 89,67
+ Owner: Soviets
+ Actor450: barl
+ Location: 109,28
+ Owner: Soviets
+ Actor449: brl3
+ Location: 107,27
+ Owner: Soviets
+ Actor454: e2
+ Location: 38,32
+ Owner: Soviets
+ Actor451: barl
+ Location: 108,29
+ Owner: Soviets
+ Actor453: brl3
+ Location: 38,31
+ Owner: Soviets
+ LabTruck: truk
+ Location: 36,32
+ Owner: Soviets
+ Actor455: silo
+ Location: 82,67
+ Owner: Soviets
+ Actor456: e1
+ Location: 85,66
+ Owner: Soviets
+ Actor457: t06
+ Location: 101,92
+ Owner: Neutral
+ Actor115: c2
+ Location: 56,89
+ Owner: Creeps
+ Actor459: e1
+ Location: 79,102
+ Owner: Soviets
+ Actor460: sbag
+ Location: 80,103
+ Owner: Soviets
+ Actor462: hpad
+ Location: 75,100
+ Owner: Soviets
+ Actor463: sbag
+ Location: 79,103
+ Owner: Soviets
+ Actor464: sbag
+ Location: 78,103
+ Owner: Soviets
+ Actor465: sbag
+ Location: 77,103
+ Owner: Soviets
+ Actor466: sbag
+ Location: 76,103
+ Owner: Soviets
+ Actor467: sbag
+ Location: 76,102
+ Owner: Soviets
+ Actor468: sbag
+ Location: 75,102
+ Owner: Soviets
+ Actor469: sbag
+ Location: 74,102
+ Owner: Soviets
+ Actor470: sbag
+ Location: 74,101
+ Owner: Soviets
+ Actor471: powr
+ Location: 79,98
+ Owner: Soviets
+ Actor415: sam
+ Location: 77,102
+ Owner: Soviets
+ TurretFacing: 128
+ Actor475: brl3
+ Location: 79,97
+ Owner: Soviets
+ Actor407: ftur
+ Location: 76,98
+ Owner: Soviets
+ Actor473: barl
+ Location: 78,98
+ Owner: Soviets
+ Actor461: e2
+ Location: 78,97
+ Owner: Soviets
+ Actor481: fenc
+ Location: 82,99
+ Owner: Soviets
+ Actor482: fenc
+ Location: 82,100
+ Owner: Soviets
+ Actor483: fenc
+ Location: 81,99
+ Owner: Soviets
+ Actor484: fenc
+ Location: 81,98
+ Owner: Soviets
+ ReinforcementsEntryPoint: waypoint
+ Location: 92,111
+ Owner: Neutral
+ ReinforcementsUnloadPoint: waypoint
+ Location: 92,103
+ Owner: Neutral
+ Actor474: mine
+ Location: 95,86
+ Owner: Neutral
+ Actor480: fenc
+ Location: 87,74
+ Owner: Soviets
+ Actor485: fenc
+ Location: 86,74
+ Owner: Soviets
+ Actor486: fenc
+ Location: 85,74
+ Owner: Soviets
+ Actor487: fenc
+ Location: 84,74
+ Owner: Soviets
+ Actor313: c3
+ Location: 65,86
+ Owner: Creeps
+ Actor314: c4
+ Location: 72,91
+ Owner: Creeps
+ Actor315: c4
+ Location: 58,92
+ Owner: Creeps
+ Actor458: c8
+ Location: 68,94
+ Owner: Creeps
+ Actor476: c9
+ Location: 59,98
+ Owner: Creeps
+ Actor477: c10
+ Location: 57,82
+ Owner: Creeps
+ Actor478: c7
+ Location: 69,89
+ Owner: Creeps
+ Actor479: c6
+ Location: 73,89
+ Owner: Creeps
+ Actor150: silo
+ Location: 109,31
+ Owner: Soviets
+ Actor489: silo
+ Location: 110,30
+ Owner: Soviets
+ Actor490: silo
+ Location: 108,30
+ Owner: Soviets
+ Actor306: e2
+ Location: 43,56
+ Owner: Soviets
+ Actor365: e3
+ Location: 40,54
+ Owner: Soviets
+ Actor388: e1
+ Location: 38,50
+ Owner: Soviets
+ Actor389: e1
+ Location: 48,58
+ Owner: Soviets
+ Actor390: e2
+ Location: 42,43
+ Owner: Soviets
+ Actor491: e1
+ Location: 42,41
+ Owner: Soviets
+ Actor492: e1
+ Location: 35,35
+ Owner: Soviets
+ BridgeTank: 3tnk
+ Location: 76,20
+ Owner: Soviets
+ BridgeAttackPoint: waypoint
+ Location: 74,25
+ Owner: Neutral
+ Actor19: brik
+ Location: 37,27
+ Owner: Soviets
+ Actor23: brik
+ Location: 37,26
+ Owner: Soviets
+ Actor24: brik
+ Location: 36,26
+ Owner: Soviets
+ Actor109: brik
+ Location: 32,27
+ Owner: Soviets
+ Actor496: e4
+ Location: 57,38
+ Owner: Soviets
+ Actor497: e4
+ Location: 38,60
+ Owner: Soviets
+ Actor498: apc
+ Location: 78,99
+ Owner: Soviets
+ Actor499: 3tnk
+ Location: 106,23
+ Owner: Soviets
+ Actor500: sbag
+ Location: 44,30
+ Owner: Soviets
+ Actor501: sbag
+ Location: 44,31
+ Owner: Soviets
+ Actor502: sbag
+ Location: 44,32
+ Owner: Soviets
+ Actor503: sbag
+ Location: 44,33
+ Owner: Soviets
+ Actor504: sbag
+ Location: 43,30
+ Owner: Soviets
+ Actor505: e1
+ Location: 43,32
+ Owner: Soviets
+ Actor506: e3
+ Location: 43,31
+ Owner: Soviets
+ Actor507: brik
+ Location: 104,36
+ Owner: Soviets
+ Actor508: brik
+ Location: 104,35
+ Owner: Soviets
+ Actor509: brik
+ Location: 104,34
+ Owner: Soviets
+ Actor510: brik
+ Location: 102,35
+ Owner: Soviets
+ Actor511: brik
+ Location: 102,36
+ Owner: Soviets
+ Actor512: brik
+ Location: 103,36
+ Owner: Soviets
+ Actor513: e1
+ Location: 110,34
+ Owner: Soviets
+ PatrolPoint31: waypoint
+ Location: 79,71
+ Owner: Neutral
+ PatrolPoint32: waypoint
+ Location: 78,46
+ Owner: Neutral
+ PatrolPoint33: waypoint
+ Location: 100,48
+ Owner: Neutral
+ PatrolPoint34: waypoint
+ Location: 92,70
+ Owner: Neutral
+ Actor516: wood
+ Location: 65,100
+ Owner: Neutral
+ Actor143: v11
+ Location: 72,95
+ Owner: Creeps
+ Actor517: wood
+ Location: 64,100
+ Owner: Neutral
+ Actor518: wood
+ Location: 63,100
+ Owner: Neutral
+ Actor519: wood
+ Location: 63,99
+ Owner: Neutral
+ Actor520: wood
+ Location: 63,98
+ Owner: Neutral
+ Actor521: v18
+ Location: 59,96
+ Owner: Neutral
+ TownAttacker6: e4
+ Location: 70,97
+ Owner: Soviets
+ TownAttacker4: e4
+ Location: 70,91
+ Owner: Soviets
+ TownAttacker1: e4
+ Location: 70,82
+ Owner: Soviets
+ TownAttacker2: e1
+ Location: 70,87
+ Owner: Soviets
+ TownAttacker5: e1
+ Location: 70,93
+ Owner: Soviets
+ TownAttacker3: 3tnk
+ Location: 74,87
+ Owner: Soviets
+ TownAttacker7: 3tnk
+ Location: 73,97
+ Owner: Soviets
+ SpyReinforcementsUnloadPoint: waypoint
+ Location: 52,94
+ Owner: Neutral
+ Actor522: ss
+ Location: 43,100
+ Owner: Soviets
+ Hospital: hosp
+ Location: 57,78
+ Owner: Creeps
+ Actor523: v02
+ Location: 56,87
+ Owner: Creeps
+ Actor524: v03
+ Location: 60,90
+ Owner: Creeps
+ Actor525: c1
+ Location: 55,90
+ Owner: Creeps
+ Actor526: c9
+ Location: 60,94
+ Owner: Creeps
+ Actor527: v11
+ Location: 59,94
+ Owner: Creeps
+ Actor528: brl3
+ Location: 60,95
+ Owner: Neutral
+ Actor529: barl
+ Location: 59,95
+ Owner: Neutral
+ Actor530: brl3
+ Location: 58,94
+ Owner: Neutral
+ Actor533: brl3
+ Location: 54,88
+ Owner: Neutral
+ Actor570: tsla
+ Owner: Soviets
+ Location: 103,35
+ Actor571: tsla
+ Owner: Soviets
+ Location: 71,34
+ Actor569: tsla
+ Owner: Soviets
+ Location: 37,66
+ Actor572: tsla
+ Owner: Soviets
+ Location: 31,62
+ Actor573: tsla
+ Owner: Soviets
+ Location: 28,81
+ Actor574: tsla
+ Owner: Soviets
+ Location: 49,26
+ Actor575: tsla
+ Owner: Soviets
+ Location: 49,33
+ Actor576: tsla
+ Owner: Soviets
+ Location: 40,38
+ Actor577: tsla
+ Owner: Soviets
+ Location: 31,43
+ Actor578: tsla
+ Owner: Soviets
+ Location: 43,50
+
+Rules: ra|rules/campaign-rules.yaml, ra|rules/campaign-tooltips.yaml, rules.yaml
diff --git a/mods/ra/maps/infiltration/rules.yaml b/mods/ra/maps/infiltration/rules.yaml
new file mode 100644
index 0000000000..47b0263077
--- /dev/null
+++ b/mods/ra/maps/infiltration/rules.yaml
@@ -0,0 +1,228 @@
+World:
+ GlobalLightingPaletteEffect@HAZE:
+ Red: 1
+ Green: 0.55
+ Blue: 0
+ MissionData:
+ Briefing: The Soviets are currently developing a new weapon system at a secret research laboratory. This is a reconnaissance mission. Do not engage until we know what we are up against and wait for reinforcements. Our civilian contacts reported a heavily guarded installation under ruthless command.
+ LuaScript:
+ Scripts: infiltration.lua
+ ScriptLobbyDropdown@difficulty:
+ ID: difficulty
+ Label: Difficulty
+ Values:
+ easy: Easy
+ normal: Normal
+ hard: Hard
+ Default: normal
+
+^Palettes:
+ FixedColorPalette@SovietTruk:
+ Base: player
+ Name: truk-soviets
+ RemapIndex: 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95
+ Color: FE1100
+
+MISS:
+ AutoTargetIgnore:
+ Targetable:
+ TargetTypes: Ground, C4, DetonateAttack, Structure, MissionObjective
+
+LST.Unselectable.UnloadOnly:
+ Inherits: LST
+ -Selectable:
+ RenderSprites:
+ Image: LST
+ Buildable:
+ Prerequisites: ~disabled
+ Cargo:
+ MaxWeight: 0
+ PipCount: 0
+ AutoTargetIgnore:
+
+SPY.Strong:
+ Inherits: SPY
+ Buildable:
+ Prerequisites: ~disabled
+ RenderSprites:
+ Image: SPY
+ Health:
+ HP: 100
+ RevealsShroud:
+ Range: 6c0
+ Infiltrates:
+ Types: MissionObjective
+ ExternalCaptures:
+ CaptureTypes: MissionObjective
+ EditorOnlyTooltip:
+ Description: RenderDebugState.OnOwnerChange will crash
+ -RenderDebugState:
+ Passenger:
+ GrantUpgrades: mobile
+
+DOG.Patrol:
+ Inherits: DOG
+ Buildable:
+ Prerequisites: ~disabled
+ Mobile:
+ Speed: 56
+ RenderSprites:
+ Image: DOG
+
+TRUK.Hijackable:
+ Inherits: TRUK
+ Buildable:
+ Prerequisites: ~disabled
+ Mobile:
+ UpgradeTypes: mobile
+ UpgradeMinEnabledLevel: 1
+ Cargo:
+ Types: Infantry
+ MaxWeight: 5
+ PipCount: 5
+ AutoTargetIgnore:
+ -Huntable:
+ ExternalCapturable:
+ Type: MissionObjective
+ CaptureCompleteTime: 1
+ -SupplyTruck:
+ RenderSprites:
+ Image: TRUK
+ Palette: truk-soviets
+ RevealsShroud:
+ Range: 6c0
+ Voiced:
+ VoiceSet: SpyVoice
+
+E7:
+ Buildable:
+ Prerequisites: ~disabled
+
+TRAN:
+ Buildable:
+ Prerequisites: ~disabled
+
+BARR:
+ Buildable:
+ Prerequisites: ~disabled
+
+MIG:
+ Buildable:
+ Prerequisites: ~disabled
+
+HELI:
+ Buildable:
+ Prerequisites: ~disabled
+
+SS:
+ Buildable:
+ Prerequisites: ~disabled
+ AutoTarget:
+ InitialStanceAI: Defend
+
+ARTY:
+ Buildable:
+ Prerequisites: ~disabled
+
+AGUN:
+ Buildable:
+ Prerequisites: ~disabled
+
+MSUB:
+ Buildable:
+ Prerequisites: ~disabled
+
+CA:
+ Buildable:
+ Prerequisites: ~disabled
+
+MSLO:
+ Buildable:
+ Prerequisites: ~disabled
+
+SPEN:
+ Buildable:
+ Prerequisites: ~disabled
+
+IRON:
+ Buildable:
+ Prerequisites: ~disabled
+
+PDOX:
+ Buildable:
+ Prerequisites: ~disabled
+
+TSLA:
+ Buildable:
+ Prerequisites: ~disabled
+
+FTUR:
+ Buildable:
+ Prerequisites: ~disabled
+
+SAM:
+ Buildable:
+ Prerequisites: ~disabled
+
+HPAD:
+ Buildable:
+ Prerequisites: ~disabled
+
+AFLD:
+ Buildable:
+ Prerequisites: ~disabled
+
+ATEK:
+ Buildable:
+ Prerequisites: ~disabled
+
+STEK:
+ Buildable:
+ Prerequisites: ~disabled
+
+4TNK:
+ Buildable:
+ Prerequisites: ~disabled
+
+MCV:
+ Buildable:
+ Prerequisites: ~disabled
+ EditorOnlyTooltip:
+ Description: RenderDebugState.OnOwnerChange will crash
+ -RenderDebugState:
+
+APC:
+ Buildable:
+ Prerequisites: ~disabled
+
+MNLY.AP:
+ Buildable:
+ Prerequisites: ~disabled
+
+MNLY.AT:
+ Buildable:
+ Prerequisites: ~disabled
+
+TTNK:
+ Buildable:
+ Prerequisites: ~disabled
+
+FTRK:
+ Buildable:
+ Prerequisites: ~disabled
+
+CTNK:
+ Buildable:
+ Prerequisites: ~disabled
+
+MGG:
+ Buildable:
+ Prerequisites: ~disabled
+
+MRJ:
+ Buildable:
+ Prerequisites: ~disabled
+
+GAP:
+ Buildable:
+ Prerequisites: ~disabled