diff --git a/OpenRA.Mods.Common/Effects/Beacon.cs b/OpenRA.Mods.Common/Effects/Beacon.cs index dd849486d5..4f1de0ac5c 100644 --- a/OpenRA.Mods.Common/Effects/Beacon.cs +++ b/OpenRA.Mods.Common/Effects/Beacon.cs @@ -55,7 +55,7 @@ namespace OpenRA.Mods.Common.Effects } if (duration > 0) - owner.World.Add(new DelayedAction(duration, () => owner.World.Remove(this))); + owner.World.AddFrameEndTask(w => w.Add(new DelayedAction(duration, () => owner.World.Remove(this)))); } // Support power beacons are expected to clean themselves up diff --git a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj index 480cd2fdf8..0ca80cb6c1 100644 --- a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj +++ b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj @@ -245,6 +245,7 @@ + diff --git a/OpenRA.Mods.Common/Scripting/Global/UtilsGlobal.cs b/OpenRA.Mods.Common/Scripting/Global/UtilsGlobal.cs index 50ca3e5add..b5177936cc 100644 --- a/OpenRA.Mods.Common/Scripting/Global/UtilsGlobal.cs +++ b/OpenRA.Mods.Common/Scripting/Global/UtilsGlobal.cs @@ -93,6 +93,12 @@ namespace OpenRA.Mods.Common.Scripting return collection.Random(Context.World.SharedRandom).CopyReference(); } + [Desc("Returns the collection in a random order.")] + public LuaValue[] Shuffle(LuaValue[] collection) + { + return collection.Shuffle(Context.World.SharedRandom).ToArray(); + } + [Desc("Expands the given footprint one step along the coordinate axes, and (if requested) diagonals.")] public CPos[] ExpandFootprint(CPos[] footprint, bool allowDiagonal) { diff --git a/OpenRA.Mods.Common/Scripting/Properties/AirstrikeProperties.cs b/OpenRA.Mods.Common/Scripting/Properties/AirstrikeProperties.cs index ccd5159c12..d4d1c38faa 100644 --- a/OpenRA.Mods.Common/Scripting/Properties/AirstrikeProperties.cs +++ b/OpenRA.Mods.Common/Scripting/Properties/AirstrikeProperties.cs @@ -32,5 +32,14 @@ namespace OpenRA.Mods.Common.Scripting { ap.SendAirstrike(Self, target, randomize, facing); } + + [Desc("Activate the actor's Airstrike Power.")] + public void SendAirstrikeFrom(CPos from, CPos to) + { + var i = Self.World.Map.CenterOfCell(from); + var j = Self.World.Map.CenterOfCell(to); + + ap.SendAirstrike(Self, j, false, (i - j).Yaw.Facing); + } } } \ No newline at end of file diff --git a/OpenRA.Mods.Common/Scripting/Properties/MissionObjectiveProperties.cs b/OpenRA.Mods.Common/Scripting/Properties/MissionObjectiveProperties.cs index 521aa3b5f3..7ce1dde2b3 100644 --- a/OpenRA.Mods.Common/Scripting/Properties/MissionObjectiveProperties.cs +++ b/OpenRA.Mods.Common/Scripting/Properties/MissionObjectiveProperties.cs @@ -12,11 +12,12 @@ using Eluant; using OpenRA.Mods.Common.Traits; using OpenRA.Scripting; +using OpenRA.Traits; namespace OpenRA.Mods.Common.Scripting { [ScriptPropertyGroup("MissionObjectives")] - public class MissionObjectiveProperties : ScriptPlayerProperties + public class MissionObjectiveProperties : ScriptPlayerProperties, Requires { readonly MissionObjectives mo; diff --git a/OpenRA.Mods.Common/Scripting/Properties/PlayerStatsProperties.cs b/OpenRA.Mods.Common/Scripting/Properties/PlayerStatsProperties.cs new file mode 100644 index 0000000000..3e3b35e7f4 --- /dev/null +++ b/OpenRA.Mods.Common/Scripting/Properties/PlayerStatsProperties.cs @@ -0,0 +1,48 @@ +#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 Eluant; +using OpenRA.Mods.Common.Traits; +using OpenRA.Scripting; +using OpenRA.Traits; + +namespace OpenRA.Mods.Common.Scripting +{ + [ScriptPropertyGroup("Player")] + public class PlayerStatsProperties : ScriptPlayerProperties, Requires + { + readonly PlayerStatistics stats; + + public PlayerStatsProperties(ScriptContext context, Player player) + : base(context, player) + { + stats = player.PlayerActor.Trait(); + } + + [Desc("The combined value of units killed by this player.")] + public int KillsCost { get { return stats.KillsCost; } } + + [Desc("The combined value of all units lost by this player.")] + public int DeathsCost { get { return stats.DeathsCost; } } + + [Desc("The total number of units killed by this player.")] + public int UnitsKilled { get { return stats.UnitsKilled; } } + + [Desc("The total number of units lost by this player.")] + public int UnitsLost { get { return stats.UnitsDead; } } + + [Desc("The total number of buildings killed by this player.")] + public int BuildingsKilled { get { return stats.BuildingsKilled; } } + + [Desc("The total number of buildings lost by this player.")] + public int BuildingsLost { get { return stats.BuildingsDead; } } + } +} \ No newline at end of file diff --git a/OpenRA.Mods.Common/Traits/Player/MissionObjectives.cs b/OpenRA.Mods.Common/Traits/Player/MissionObjectives.cs index 074079546c..4def486404 100644 --- a/OpenRA.Mods.Common/Traits/Player/MissionObjectives.cs +++ b/OpenRA.Mods.Common/Traits/Player/MissionObjectives.cs @@ -214,8 +214,13 @@ namespace OpenRA.Mods.Common.Traits } if (Info.EarlyGameOver) + { foreach (var p in enemies) - p.PlayerActor.Trait().ForceDefeat(p); + { + p.WinState = WinState.Won; + p.World.OnPlayerWinStateChanged(p); + } + } } } else @@ -224,11 +229,13 @@ namespace OpenRA.Mods.Common.Traits player.World.OnPlayerWinStateChanged(player); if (Info.EarlyGameOver) + { foreach (var p in enemies) { p.WinState = WinState.Won; p.World.OnPlayerWinStateChanged(p); } + } } CheckIfGameIsOver(player); diff --git a/OpenRA.Mods.RA/Scripting/Properties/ParatroopersProperties.cs b/OpenRA.Mods.RA/Scripting/Properties/ParatroopersProperties.cs index d46605832c..62db33c119 100644 --- a/OpenRA.Mods.RA/Scripting/Properties/ParatroopersProperties.cs +++ b/OpenRA.Mods.RA/Scripting/Properties/ParatroopersProperties.cs @@ -32,5 +32,14 @@ namespace OpenRA.Mods.RA.Scripting { return pp.SendParatroopers(Self, target, randomize, facing); } + + [Desc("Activate the actor's Paratroopers Power. Returns the dropped units.")] + public Actor[] SendParatroopersFrom(CPos from, CPos to) + { + var i = Self.World.Map.CenterOfCell(from); + var j = Self.World.Map.CenterOfCell(to); + + return pp.SendParatroopers(Self, j, false, (i - j).Yaw.Facing); + } } } \ No newline at end of file diff --git a/OpenRA.sln b/OpenRA.sln index 19812fda1a..bc518274b1 100644 --- a/OpenRA.sln +++ b/OpenRA.sln @@ -71,6 +71,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Red Alert Lua scripts", "Re 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\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\soviet-01\soviet01.lua = mods\ra\maps\soviet-01\soviet01.lua mods\ra\maps\soviet-02a\soviet02a.lua = mods\ra\maps\soviet-02a\soviet02a.lua mods\ra\maps\soviet-02b\soviet02b.lua = mods\ra\maps\soviet-02b\soviet02b.lua diff --git a/mods/ra/maps/evacuation/evacuation.lua b/mods/ra/maps/evacuation/evacuation.lua new file mode 100644 index 0000000000..72634e0587 --- /dev/null +++ b/mods/ra/maps/evacuation/evacuation.lua @@ -0,0 +1,363 @@ +DeathThreshold = +{ + Easy = 200, + Normal = 100, +} + +TanyaType = "e7" +TanyaStance = "AttackAnything" +if Map.Difficulty ~= "Easy" then + TanyaType = "e7.noautotarget" + TanyaStance = "HoldFire" +end + +RepairTriggerThreshold = +{ + Easy = 50, + Normal = 75, +} + +Sams = { Sam1, Sam2, Sam3, Sam4 } +TownUnits = +{ + Einstein, Engineer, + TownUnit01, TownUnit02, TownUnit03, TownUnit04, TownUnit05, TownUnit06, TownUnit07, + TownUnit08, TownUnit09, TownUnit10, TownUnit11, TownUnit12, TownUnit13, TownUnit14, +} + +ParabombDelay = DateTime.Seconds(30) +ParatroopersDelay = DateTime.Minutes(5) +Paratroopers = +{ + { + proxy = "powerproxy.paras1", + entry = BadgerEntryPoint1.Location, + drop = BadgerDropPoint1.Location, + }, + { + proxy = "powerproxy.paras2", + entry = BadgerEntryPoint1.Location + CVec.New(3, 0), + drop = BadgerDropPoint2.Location, + }, + { + proxy = "powerproxy.paras2", + entry = BadgerEntryPoint1.Location + CVec.New(6, 0), + drop = BadgerDropPoint3.Location, + }, +} + +AttackGroup = { } +AttackGroupSize = 5 +SovietInfantry = { "e1", "e2", "e3" } +SovietVehiclesUpgradeDelay = DateTime.Minutes(4) +SovietVehicleType = "Normal" +SovietVehicles = +{ + Normal = { "3tnk" }, + Upgraded = { "3tnk", "v2rl" }, +} +ProductionInterval = +{ + Easy = DateTime.Seconds(10), + Normal = DateTime.Seconds(2), +} + +ReinforcementsDelay = DateTime.Minutes(16) +ReinforcementsUnits = { "2tnk", "2tnk", "2tnk", "2tnk", "2tnk", "2tnk", "1tnk", "1tnk", "jeep", "e1", + "e1", "e1", "e1", "e3", "e3", "mcv", "truk", "truk", "truk", "truk", "truk", "truk" } + +SpawnAlliedReinforcements = function() + if allies2.IsLocalPlayer then + UserInterface.SetMissionText("") + Media.PlaySpeechNotification(allies2, "AlliedReinforcementsArrived") + end + Reinforcements.Reinforce(allies2, ReinforcementsUnits, { ReinforcementsEntryPoint.Location, Allies2BasePoint.Location }) +end + +Yak = nil +YakAttack = function(yak) + local targets = Map.ActorsInCircle(YakAttackPoint.CenterPosition, WDist.FromCells(10), function(a) + return a.Owner == allies1 and not a.IsDead and a ~= Einstein and a ~= Tanya and a ~= Engineer + end) + + if (#targets > 0) then + yak.Attack(Utils.Random(targets)) + end + yak.Move(Map.ClosestEdgeCell(yak.Location)) + yak.Destroy() + Trigger.OnRemovedFromWorld(Yak, function() + Yak = nil + end) +end + +SovietTownAttack = function() + local units = Utils.Shuffle(Utils.Where(Map.ActorsWithTag("TownAttacker"), function(a) return not a.IsDead end)) + + Utils.Do(Utils.Take(5, units), function(unit) + unit.AttackMove(TownPoint.Location) + Trigger.OnIdle(unit, unit.Hunt) + end) +end + +SendParabombs = function() + local proxy = Actor.Create("powerproxy.parabombs", false, { Owner = soviets }) + proxy.SendAirstrikeFrom(BadgerEntryPoint2.Location, ParabombPoint1.Location) + proxy.SendAirstrikeFrom(BadgerEntryPoint2.Location + CVec.New(0, 3), ParabombPoint2.Location) + proxy.Destroy() +end + +SendParatroopers = function() + Utils.Do(Paratroopers, function(para) + local proxy = Actor.Create(para.proxy, false, { Owner = soviets }) + local units = proxy.SendParatroopersFrom(para.entry, para.drop) + proxy.Destroy() + + Utils.Do(units, function(unit) + Trigger.OnIdle(unit, function(a) + if a.IsInWorld then + a.Hunt() + end + end) + end) + end) +end + +SendAttackGroup = function() + if #AttackGroup < AttackGroupSize then + return + end + + Utils.Do(AttackGroup, function(unit) + if not unit.IsDead then + Trigger.OnIdle(unit, unit.Hunt) + end + end) + + AttackGroup = { } +end + +ProduceInfantry = function() + if SovietBarracks.IsDead or SovietBarracks.Owner ~= soviets then + return + end + + soviets.Build({ Utils.Random(SovietInfantry) }, function(units) + table.insert(AttackGroup, units[1]) + SendAttackGroup() + Trigger.AfterDelay(ProductionInterval[Map.Difficulty], ProduceInfantry) + end) +end + +ProduceVehicles = function() + if SovietWarFactory.IsDead or SovietWarFactory.Owner ~= soviets then + return + end + + soviets.Build({ Utils.Random(SovietVehicles[SovietVehicleType]) }, function(units) + table.insert(AttackGroup, units[1]) + SendAttackGroup() + Trigger.AfterDelay(ProductionInterval[Map.Difficulty], ProduceVehicles) + end) +end + +NumBaseBuildings = function() + local buildings = Map.ActorsInBox(AlliedBaseTopLeft.CenterPosition, AlliedBaseBottomRight.CenterPosition, function(a) + return not a.IsDead and a.Owner == allies2 and a.HasProperty("StartBuildingRepairs") + end) + + return #buildings +end + +Tick = function() + if DateTime.GameTime > 1 and DateTime.GameTime % 25 == 0 and NumBaseBuildings() == 0 then + allies2.MarkFailedObjective(objHoldPosition) + end + + if not allies2.IsObjectiveCompleted(objCutSovietPower) and soviets.PowerState ~= "Normal" then + allies2.MarkCompletedObjective(objCutSovietPower) + end + + if not allies2.IsObjectiveCompleted(objLimitLosses) and allies2.UnitsLost > DeathThreshold[Map.Difficulty] then + allies2.MarkFailedObjective(objLimitLosses) + end + + if allies2.IsLocalPlayer and DateTime.GameTime <= ReinforcementsDelay then + UserInterface.SetMissionText("Allied reinforcements arrive in " .. Utils.FormatTime(ReinforcementsDelay - DateTime.GameTime)) + else + UserInterface.SetMissionText("") + end +end + +SetupSoviets = function() + soviets.Cash = 1000 + + if Map.Difficulty == "Easy" then + Utils.Do(Sams, function(sam) + local camera = Actor.Create("Camera.SAM", true, { Owner = allies1, Location = sam.Location }) + Trigger.OnKilledOrCaptured(sam, function() + camera.Destroy() + end) + end) + end + + local buildings = Utils.Where(Map.ActorsInWorld, 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 * RepairTriggerThreshold[Map.Difficulty] / 100) then + building.StartBuildingRepairs() + end + end) + end) + + SovietBarracks.IsPrimaryBuilding = true + SovietBarracks.RallyPoint = SovietRallyPoint.Location + SovietWarFactory.IsPrimaryBuilding = true + SovietWarFactory.RallyPoint = SovietRallyPoint.Location + + Trigger.AfterDelay(SovietVehiclesUpgradeDelay, function() SovietVehicleType = "Upgraded" end) + Trigger.AfterDelay(0, function() + ProduceInfantry() + ProduceVehicles() + end) +end + +SetupTriggers = function() + Trigger.OnKilled(Tanya, function() + allies1.MarkFailedObjective(objTanyaMustSurvive) + end) + + Trigger.OnAllKilledOrCaptured(Sams, function() + allies1.MarkCompletedObjective(objDestroySamSites) + objExtractEinstein = allies1.AddPrimaryObjective("Wait for a helicopter at the LZ and extract Einstein.") + Actor.Create("flare", true, { Owner = allies1, Location = ExtractionLZ.Location + CVec.New(1, -1) }) + Beacon.New(allies1, ExtractionLZ.CenterPosition) + Media.PlaySpeechNotification(allies1, "SignalFlareNorth") + + ExtractionHeli = Reinforcements.ReinforceWithTransport(allies1, "tran", nil, { ExtractionLZEntryPoint.Location, ExtractionLZ.Location })[1] + Trigger.OnKilled(ExtractionHeli, function() + allies1.MarkFailedObjective(objExtractEinstein) + end) + Trigger.OnPassengerEntered(ExtractionHeli, function(heli, passenger) + if passenger == Einstein then + heli.Move(ExtractionLZEntryPoint.Location) + heli.Destroy() + Trigger.OnRemovedFromWorld(heli, function() + allies2.MarkCompletedObjective(objLimitLosses) + allies2.MarkCompletedObjective(objHoldPosition) + allies1.MarkCompletedObjective(objTanyaMustSurvive) + allies1.MarkCompletedObjective(objEinsteinSurvival) + allies1.MarkCompletedObjective(objExtractEinstein) + end) + end + end) + end) + + Trigger.OnEnteredProximityTrigger(TownPoint.CenterPosition, WDist.FromCells(15), function(actor, trigger) + if actor.Owner == allies1 then + ReassignActors(TownUnits, neutral, allies1) + Utils.Do(TownUnits, function(a) a.Stance = "Defend" end) + allies1.MarkCompletedObjective(objFindEinstein) + objEinsteinSurvival = allies1.AddPrimaryObjective("Keep Einstein alive at all costs.") + Trigger.OnKilled(Einstein, function() + allies1.MarkFailedObjective(objEinsteinSurvival) + end) + Trigger.RemoveProximityTrigger(trigger) + SovietTownAttack() + end + end) + + Trigger.OnEnteredProximityTrigger(YakAttackPoint.CenterPosition, WDist.FromCells(5), function(actor, trigger) + if not (Yak == nil or Yak.IsDead) or actor.Owner ~= allies1 then + return + end + + Yak = Reinforcements.Reinforce(soviets, { "yak" }, { YakEntryPoint.Location, YakAttackPoint.Location + CVec.New(0, -10) }, 0, YakAttack)[1] + end) + + Trigger.AfterDelay(ParabombDelay, SendParabombs) + Trigger.AfterDelay(ParatroopersDelay, SendParatroopers) + Trigger.AfterDelay(ReinforcementsDelay, SpawnAlliedReinforcements) +end + +SpawnTanya = function() + Tanya = Actor.Create(TanyaType, true, { Owner = allies1, Location = TanyaLocation.Location }) + Tanya.Stance = TanyaStance + + if Map.Difficulty ~= "Easy" and allies1.IsLocalPlayer then + Trigger.AfterDelay(DateTime.Seconds(2), function() + Media.DisplayMessage("According to the rules of engagement I need your explicit orders to fire, Commander!", "Tanya") + end) + end +end + +ReassignActors = function(actors, from, to) + Utils.Do(actors, function(a) + if a.Owner == from then + a.Owner = to + a.Stance = "Defend" + end + end) +end + +WorldLoaded = function() + neutral = Player.GetPlayer("Neutral") + + -- Allies is the pre-set owner of units that get assigned to either the second player, if any, or the first player otherwise. + allies = Player.GetPlayer("Allies") + + -- Allies1 is the player starting on the right, controlling Tanya + allies1 = Player.GetPlayer("Allies1") + + -- Allies2 is the player starting on the left, defending the base + allies2 = Player.GetPlayer("Allies2") + + soviets = Player.GetPlayer("Soviets") + + Utils.Do({ allies1, allies2 }, function(player) + if player and player.IsLocalPlayer then + Trigger.OnObjectiveAdded(player, function(p, id) + Media.DisplayMessage(p.GetObjectiveDescription(id), "New " .. string.lower(p.GetObjectiveType(id)) .. " 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) + + if not allies2 or allies2.IsLocalPlayer then + Camera.Position = Allies2BasePoint.CenterPosition + else + Camera.Position = ChinookHusk.CenterPosition + end + + if not allies2 then + allies2 = allies1 + end + + ReassignActors(Map.ActorsInWorld, allies, allies2) + SpawnTanya() + + objTanyaMustSurvive = allies1.AddPrimaryObjective("Tanya must survive.") + objFindEinstein = allies1.AddPrimaryObjective("Find Einstein's crashed helicopter.") + objDestroySamSites = allies1.AddPrimaryObjective("Destroy the SAM sites.") + + objHoldPosition = allies2.AddPrimaryObjective("Hold your position and protect the base.") + objLimitLosses = allies2.AddSecondaryObjective("Do not lose more than " .. DeathThreshold[Map.Difficulty] .. " units.") + objCutSovietPower = allies2.AddSecondaryObjective("Take out the Soviet power grid.") + + SetupTriggers() + SetupSoviets() +end \ No newline at end of file diff --git a/mods/ra/maps/evacuation/map.bin b/mods/ra/maps/evacuation/map.bin new file mode 100644 index 0000000000..45e732c549 Binary files /dev/null and b/mods/ra/maps/evacuation/map.bin differ diff --git a/mods/ra/maps/evacuation/map.png b/mods/ra/maps/evacuation/map.png new file mode 100644 index 0000000000..29bfd56141 Binary files /dev/null and b/mods/ra/maps/evacuation/map.png differ diff --git a/mods/ra/maps/evacuation/map.yaml b/mods/ra/maps/evacuation/map.yaml new file mode 100644 index 0000000000..480e45284a --- /dev/null +++ b/mods/ra/maps/evacuation/map.yaml @@ -0,0 +1,1757 @@ +MapFormat: 11 + +RequiresMod: ra + +Title: Evacuation + +Author: Scott_NZ + +Tileset: SNOW + +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@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 + NonCombatant: True + Color: 5CC1A3 + Allies: Allies1, Allies2 + Enemies: Soviets + PlayerReference@Soviets: + Name: Soviets + Faction: soviet + Color: FE1100 + Enemies: Allies1, Allies2, Allies + +Actors: + Actor1: v07 + Location: 71,91 + Owner: Neutral + Actor2: v04 + Location: 77,90 + Owner: Neutral + Actor3: v03 + Location: 66,90 + Owner: Neutral + Actor4: v02 + Location: 73,94 + Owner: Neutral + Actor5: v01 + Location: 77,94 + Owner: Neutral + Actor6: v07 + Location: 77,87 + Owner: Neutral + Actor7: v09 + Location: 61,95 + Owner: Neutral + Actor8: v08 + Location: 60,91 + Owner: Neutral + Actor15: t16 + Location: 60,104 + Owner: Neutral + Actor33: t06 + Location: 59,95 + Owner: Neutral + Actor11: wood + Location: 68,100 + Owner: Neutral + Actor12: v05 + Location: 72,87 + Owner: Neutral + Actor20: t05 + Location: 74,76 + Owner: Neutral + Actor10: tc03 + Location: 60,99 + Owner: Neutral + Actor16: wood + Location: 67,100 + Owner: Neutral + Actor17: wood + Location: 66,100 + Owner: Neutral + Actor18: wood + Location: 66,99 + Owner: Neutral + Actor19: wood + Location: 66,98 + Owner: Neutral + Actor29: wood + Location: 65,96 + Owner: Neutral + Actor13: t06 + Location: 65,82 + Owner: Neutral + Actor22: v08 + Location: 83,94 + Owner: Neutral + Actor23: v04 + Location: 64,93 + Owner: Neutral + Actor24: v04 + Location: 83,91 + Owner: Neutral + Actor25: tc04 + Location: 93,86 + Owner: Neutral + Actor26: v12 + Location: 79,91 + Owner: Neutral + Actor31: wood + Location: 63,96 + Owner: Neutral + Actor30: wood + Location: 64,96 + Owner: Neutral + Actor194: sbag + Location: 94,50 + Owner: Soviets + Actor27: wood + Location: 66,97 + Owner: Neutral + Actor14: tc05 + Location: 59,101 + Owner: Neutral + Actor28: wood + Location: 66,96 + Owner: Neutral + Actor9: t12 + Location: 59,98 + Owner: Neutral + Actor34: t14 + Location: 68,98 + Owner: Neutral + Actor35: t11 + Location: 71,89 + Owner: Neutral + Actor36: t15 + Location: 83,95 + Owner: Neutral + Actor115: fenc + Location: 100,99 + Owner: Soviets + Actor38: t14 + Location: 89,97 + Owner: Neutral + Actor39: t15 + Location: 84,108 + Owner: Neutral + Actor41: t01 + Location: 71,80 + Owner: Neutral + Actor43: t02 + Location: 79,102 + Owner: Neutral + Actor132: fenc + Location: 100,100 + Owner: Soviets + Actor45: tc04 + Location: 64,108 + Owner: Neutral + Actor46: tc01 + Location: 64,105 + Owner: Neutral + Actor47: t07 + Location: 77,107 + Owner: Neutral + Actor48: t05 + Location: 92,80 + Owner: Neutral + Actor49: t03 + Location: 87,88 + Owner: Neutral + Actor50: t06 + Location: 96,82 + Owner: Neutral + Actor669: fenc + Location: 95,79 + Owner: Soviets + Actor135: tc05 + Location: 106,109 + Owner: Neutral + Actor58: t06 + Location: 85,105 + Owner: Neutral + Actor125: e2 + Location: 99,86 + Owner: Soviets + Actor599: tc01 + Location: 70,32 + Owner: Neutral + Actor62: t12 + Location: 96,79 + Owner: Neutral + Actor66: t17 + Location: 85,71 + Owner: Neutral + Actor65: t14 + Location: 89,70 + Owner: Neutral + Actor87: t03 + Location: 69,34 + Owner: Neutral + Actor598: t08 + Location: 71,31 + Owner: Neutral + Actor154: e1 + Location: 105,95 + Owner: Soviets + Actor149: sbag + Location: 92,50 + Owner: Soviets + Actor99: e1 + Location: 82,72 + Owner: Soviets + Actor75: t06 + Location: 73,64 + Owner: Neutral + Actor76: t14 + Location: 71,71 + Owner: Neutral + Actor77: tc04 + Location: 93,96 + Owner: Neutral + Actor95: fenc + Location: 83,71 + Owner: Soviets + Actor642: t10 + Location: 66,29 + Owner: Neutral + Actor603: fenc + Location: 84,71 + Owner: Soviets + Actor85: medi + Location: 110,86 + Owner: Allies1 + Actor88: t07 + Location: 93,80 + Owner: Neutral + Actor469: e2 + Location: 97,20 + Owner: Soviets + Actor438: fenc + Location: 88,19 + Owner: Soviets + Actor56: e1 + Location: 78,74 + Owner: Soviets + Actor549: t16 + Location: 111,50 + Owner: Neutral + Actor242: fenc + Location: 88,50 + Owner: Soviets + Actor104: t10 + Location: 107,46 + Owner: Neutral + Actor163: e2 + Location: 109,96 + Owner: Soviets + Actor90: t02 + Location: 90,72 + Owner: Neutral + Actor106: fenc + Location: 111,94 + Owner: Soviets + Actor590: e1 + Location: 102,97 + Owner: Soviets + Actor64: e1 + Location: 96,93 + Owner: Soviets + Actor169: v2rl + Location: 53,20 + Owner: Soviets + Actor122: e1 + Location: 89,66 + Owner: Soviets + Actor137: t01 + Location: 111,92 + Owner: Neutral + Actor98: fenc + Location: 109,93 + Owner: Soviets + Actor105: fenc + Location: 110,94 + Owner: Soviets + Actor146: t16 + Location: 62,85 + Owner: Neutral + Actor159: brl3 + Location: 93,64 + Owner: Soviets + Actor160: tc05 + Location: 15,108 + Owner: Neutral + Actor155: t05 + Location: 110,40 + Owner: Neutral + Actor157: tc05 + Location: 91,36 + Owner: Neutral + Actor330: oilb + Location: 65,31 + Owner: Neutral + Actor114: fenc + Location: 100,98 + Owner: Soviets + Actor136: t15 + Location: 110,103 + Owner: Neutral + Actor226: fenc + Location: 97,39 + Owner: Soviets + Actor113: fenc + Location: 100,97 + Owner: Soviets + Actor110: fenc + Location: 98,97 + Owner: Soviets + Actor152: t01 + Location: 109,39 + Owner: Neutral + Actor439: fenc + Location: 88,18 + Owner: Soviets + Actor127: fenc + Location: 109,101 + Owner: Soviets + Actor153: t08 + Location: 108,58 + Owner: Neutral + Actor130: e1 + Location: 100,77 + Owner: Soviets + Actor118: fenc + Location: 109,102 + Owner: Soviets + Actor158: t07 + Location: 110,48 + Owner: Neutral + Actor126: t03 + Location: 107,79 + Owner: Neutral + Actor143: dome + Location: 102,74 + Owner: Soviets + Actor156: e1 + Location: 98,72 + Owner: Soviets + Actor142: e2 + Location: 101,69 + Owner: Soviets + Actor247: silo + Location: 39,33 + Owner: Soviets + Actor61: tc05 + Location: 87,109 + Owner: Neutral + Actor174: t06 + Location: 51,78 + Owner: Neutral + Actor711: e1 + Location: 74,36 + Owner: Soviets + Actor306: apwr + Location: 54,65 + Owner: Soviets + Actor134: tc03 + Location: 110,107 + Owner: Neutral + Actor215: tc01 + Location: 16,62 + Owner: Neutral + Actor188: t02 + Location: 55,24 + Owner: Neutral + Actor37: fenc + Location: 99,97 + Owner: Soviets + Actor195: tc03 + Location: 16,16 + Owner: Neutral + Actor196: t17 + Location: 21,15 + Owner: Neutral + Actor198: tc03 + Location: 18,106 + Owner: Neutral + Actor200: tc01 + Location: 19,110 + Owner: Neutral + Actor203: t11 + Location: 45,91 + Owner: Neutral + Actor356: proc + Location: 26,90 + Owner: Allies + FreeActor: False + Actor147: mine + Location: 20,98 + Owner: Neutral + Actor459: tc01 + Location: 41,99 + Owner: Neutral + Actor216: tc05 + Location: 23,45 + Owner: Neutral + Actor217: t07 + Location: 49,32 + Owner: Neutral + Actor218: t16 + Location: 55,34 + Owner: Neutral + Actor53: e1 + Location: 109,89 + Owner: Allies1 + Actor182: tc02 + Location: 53,35 + Owner: Neutral + Actor52: e1 + Location: 106,88 + Owner: Allies1 + Actor239: t06 + Location: 48,75 + Owner: Neutral + Actor292: ftur + Location: 36,56 + Owner: Soviets + Actor71: e1 + Location: 86,102 + Owner: Soviets + Actor44: t16 + Location: 87,105 + Owner: Neutral + Actor133: v04 + Location: 83,101 + Owner: Neutral + Actor259: tc01 + Location: 110,109 + Owner: Neutral + Actor140: t11 + Location: 110,82 + Owner: Neutral + Actor610: e2 + Location: 101,79 + Owner: Soviets + Actor109: fenc + Location: 111,95 + Owner: Soviets + Actor70: dog + Location: 87,99 + Owner: Soviets + Actor141: t13 + Location: 104,85 + Owner: Neutral + Actor236: 3tnk + Location: 91,45 + Owner: Soviets + Actor254: tc02 + Location: 89,34 + Owner: Neutral + Actor138: tc01 + Location: 104,82 + Owner: Neutral + Actor164: e1 + Location: 107,99 + Owner: Soviets + Actor442: e2 + Location: 91,19 + Owner: Soviets + Actor251: fenc + Location: 63,41 + Owner: Soviets + Actor199: t01 + Location: 108,49 + Owner: Neutral + Actor440: fenc + Location: 88,17 + Owner: Soviets + Actor222: fenc + Location: 94,63 + Owner: Soviets + Actor441: e1 + Location: 89,19 + Owner: Soviets + Actor287: fenc + Location: 93,63 + Owner: Soviets + Actor93: fenc + Location: 96,65 + Owner: Soviets + Actor223: e2 + Location: 94,64 + Owner: Soviets + Actor224: e2 + Location: 92,67 + Owner: Soviets + Actor437: fenc + Location: 98,21 + Owner: Soviets + Actor21: fenc + Location: 97,47 + Owner: Soviets + Actor227: fenc + Location: 96,39 + Owner: Soviets + Actor208: oilb + Location: 105,43 + Owner: Soviets + Actor231: fenc + Location: 94,38 + Owner: Soviets + Actor201: oilb + Location: 105,40 + Owner: Soviets + Actor210: powr + Location: 105,46 + Owner: Soviets + Actor78: barr + Location: 101,40 + Owner: Soviets + Actor151: fenc + Location: 97,45 + Owner: Soviets + Actor235: tc05 + Location: 106,51 + Owner: Neutral + Actor74: fenc + Location: 97,46 + Owner: Soviets + Actor234: tc03 + Location: 107,54 + Owner: Neutral + Actor219: fenc + Location: 97,41 + Owner: Soviets + Actor221: fenc + Location: 97,40 + Owner: Soviets + Actor228: fenc + Location: 95,39 + Owner: Soviets + Actor248: barl + Location: 100,41 + Owner: Soviets + Actor229: fenc + Location: 94,39 + Owner: Soviets + Actor245: e1 + Location: 101,43 + Owner: Soviets + Actor249: brl3 + Location: 100,40 + Owner: Soviets + Actor250: brl3 + Location: 101,39 + Owner: Soviets + Actor258: e2 + Location: 103,45 + Owner: Soviets + Actor443: e1 + Location: 97,105 + Owner: Soviets + Actor260: e1 + Location: 97,43 + Owner: Soviets + Actor108: e1 + Location: 99,47 + Owner: Soviets + Actor266: e1 + Location: 96,47 + Owner: Soviets + Actor279: brl3 + Location: 106,39 + Owner: Soviets + Actor280: barl + Location: 106,42 + Owner: Soviets + Actor331: e1 + Location: 36,88 + Owner: Soviets + Actor193: fenc + Location: 95,63 + Owner: Soviets + Actor192: fenc + Location: 95,64 + Owner: Soviets + Actor94: fenc + Location: 96,64 + Owner: Soviets + Actor640: tc04 + Location: 72,31 + Owner: Neutral + Actor641: t02 + Location: 71,29 + Owner: Neutral + Actor181: mine + Location: 109,76 + Owner: Neutral + Actor348: e3 + Location: 87,48 + Owner: Soviets + Actor244: fenc + Location: 86,50 + Owner: Soviets + Actor246: fenc + Location: 85,50 + Owner: Soviets + Actor243: fenc + Location: 87,50 + Owner: Soviets + Actor284: fenc + Location: 85,49 + Owner: Soviets + Actor366: e1 + Location: 88,51 + Owner: Soviets + Actor367: e1 + Location: 92,51 + Owner: Soviets + Actor368: e1 + Location: 91,49 + Owner: Soviets + Actor347: e3 + Location: 86,49 + Owner: Soviets + Actor370: e2 + Location: 94,49 + Owner: Soviets + Actor281: fenc + Location: 56,38 + Owner: Soviets + Actor376: e1 + Location: 107,89 + Owner: Allies1 + Actor377: e1 + Location: 108,89 + Owner: Allies1 + Actor378: e1 + Location: 110,88 + Owner: Allies1 + Actor327: t06 + Location: 37,73 + Owner: Neutral + Actor189: t13 + Location: 88,57 + Owner: Neutral + Actor328: t14 + Location: 26,57 + Owner: Neutral + Actor297: e1 + Location: 33,25 + Owner: Soviets + Actor124: mine + Location: 49,25 + Owner: Neutral + Actor112: e1 + Location: 98,87 + Owner: Soviets + Actor428: e1 + Location: 90,100 + Owner: Soviets + Actor298: e2 + Location: 33,23 + Owner: Soviets + Actor510: e1 + Location: 94,20 + Owner: Soviets + Actor508: e1 + Location: 79,19 + Owner: Soviets + Actor57: cycl + Location: 74,16 + Owner: Soviets + Actor511: sbag + Location: 96,19 + Owner: Soviets + Actor515: tc05 + Location: 108,17 + Owner: Neutral + Actor516: t13 + Location: 72,20 + Owner: Neutral + Actor121: cycl + Location: 75,23 + Owner: Soviets + Actor519: sbag + Location: 93,18 + Owner: Soviets + Actor489: apwr + Location: 76,19 + Owner: Soviets + Actor517: sbag + Location: 96,17 + Owner: Soviets + Actor520: sbag + Location: 93,19 + Owner: Soviets + Actor488: apwr + Location: 80,19 + Owner: Soviets + Actor116: cycl + Location: 74,20 + Owner: Soviets + Actor117: cycl + Location: 74,21 + Owner: Soviets + Actor107: oilb + Location: 68,29 + Owner: Neutral + Actor232: fenc + Location: 94,37 + Owner: Soviets + Actor102: spen + Location: 101,35 + Owner: Soviets + Actor487: apwr + Location: 80,16 + Owner: Soviets + Actor523: t17 + Location: 85,20 + Owner: Neutral + Actor522: t05 + Location: 90,16 + Owner: Neutral + Actor119: cycl + Location: 74,22 + Owner: Soviets + Actor120: cycl + Location: 74,23 + Owner: Soviets + Actor518: sbag + Location: 94,17 + Owner: Soviets + Actor521: sbag + Location: 93,17 + Owner: Soviets + Actor237: tc04 + Location: 99,53 + Owner: Neutral + Actor139: cycl + Location: 77,23 + Owner: Soviets + Actor123: cycl + Location: 76,23 + Owner: Soviets + Actor504: e2 + Location: 78,23 + Owner: Soviets + Actor505: e1 + Location: 84,18 + Owner: Soviets + Actor289: sbag + Location: 95,17 + Owner: Soviets + Actor512: sbag + Location: 96,18 + Owner: Soviets + Actor486: apwr + Location: 76,16 + Owner: Soviets + Actor514: tc03 + Location: 104,20 + Owner: Neutral + Actor307: apwr + Location: 54,59 + Owner: Soviets + Actor91: cycl + Location: 74,17 + Owner: Soviets + Actor103: cycl + Location: 74,18 + Owner: Soviets + Actor111: cycl + Location: 74,19 + Owner: Soviets + Actor413: e1 + Location: 104,38 + Owner: Soviets + Actor626: barl + Location: 80,72 + Owner: Soviets + Actor419: e1 + Location: 82,62 + Owner: Soviets + Actor150: sbag + Location: 93,50 + Owner: Soviets + Actor608: brl3 + Location: 81,72 + Owner: Soviets + Actor427: e1 + Location: 76,71 + Owner: Soviets + Actor429: e2 + Location: 78,70 + Owner: Soviets + Actor611: t05 + Location: 81,65 + Owner: Neutral + Actor336: fenc + Location: 90,20 + Owner: Soviets + Actor422: fenc + Location: 96,21 + Owner: Soviets + Actor335: fenc + Location: 89,20 + Owner: Soviets + Actor436: fenc + Location: 97,21 + Owner: Soviets + Actor421: fenc + Location: 91,20 + Owner: Soviets + Actor334: fenc + Location: 88,20 + Owner: Soviets + Actor295: e1 + Location: 28,25 + Owner: Soviets + Actor299: dog + Location: 31,23 + Owner: Soviets + Actor170: weap + Location: 23,103 + Owner: Allies + Actor460: t08 + Location: 40,110 + Owner: Neutral + Actor206: dome + Location: 35,99 + Owner: Allies + Actor204: apwr + Location: 37,107 + Owner: Allies + Actor92: powr + Location: 101,46 + Owner: Soviets + Actor84: fenc + Location: 110,93 + Owner: Soviets + Actor83: apwr + Location: 37,104 + Owner: Allies + Actor162: mine + Location: 20,91 + Owner: Neutral + Actor96: fenc + Location: 82,71 + Owner: Soviets + Actor97: fenc + Location: 111,66 + Owner: Soviets + Actor42: t07 + Location: 92,110 + Owner: Neutral + Actor558: v10 + Location: 64,90 + Owner: Neutral + Actor414: t13 + Location: 74,43 + Owner: Neutral + Actor361: silo + Location: 25,89 + Owner: Allies + Actor446: spen + Location: 58,17 + Owner: Soviets + Actor273: t13 + Location: 45,38 + Owner: Neutral + Actor253: gun + Location: 27,88 + Owner: Allies + Actor534: 1tnk + Location: 37,90 + Owner: Allies + Facing: 0 + Actor398: 1tnk + Location: 36,90 + Owner: Allies + Facing: 0 + Actor485: tc03 + Location: 41,101 + Owner: Neutral + Actor495: tc02 + Location: 40,102 + Owner: Neutral + Actor51: t13 + Location: 66,80 + Owner: Neutral + Actor873: brl3 + Location: 45,79 + Owner: Neutral + Actor171: tsla + Location: 41,56 + Owner: Soviets + Actor570: oilb + Location: 43,80 + Owner: Neutral + Actor263: dome + Location: 61,45 + Owner: Soviets + Actor584: tc04 + Location: 52,70 + Owner: Neutral + Actor586: tc01 + Location: 45,70 + Owner: Neutral + Actor587: t17 + Location: 31,84 + Owner: Neutral + Actor605: barl + Location: 91,68 + Owner: Soviets + Actor498: barl + Location: 94,65 + Owner: Soviets + Actor67: tc01 + Location: 97,65 + Owner: Neutral + Actor462: t02 + Location: 65,89 + Owner: Neutral + Actor529: fenc + Location: 107,102 + Owner: Soviets + Actor535: fenc + Location: 101,100 + Owner: Soviets + Actor211: e1 + Location: 105,107 + Owner: Soviets + Actor530: fenc + Location: 106,102 + Owner: Soviets + Actor128: fenc + Location: 108,102 + Owner: Soviets + Actor592: dog + Location: 108,97 + Owner: Soviets + Actor604: brl3 + Location: 90,67 + Owner: Soviets + Actor720: fenc + Location: 110,66 + Owner: Soviets + Actor556: e1 + Location: 110,89 + Owner: Allies1 + Actor600: barl + Location: 92,68 + Owner: Soviets + Actor647: fenc + Location: 84,72 + Owner: Soviets + Actor532: e1 + Location: 106,89 + Owner: Allies1 + Actor464: t05 + Location: 64,82 + Owner: Neutral + Actor463: tc04 + Location: 60,83 + Owner: Neutral + Actor609: e2 + Location: 99,79 + Owner: Soviets + Actor721: fenc + Location: 109,66 + Owner: Soviets + Actor606: brl3 + Location: 89,67 + Owner: Soviets + Actor144: t01 + Location: 98,107 + Owner: Neutral + Actor129: e1 + Location: 102,78 + Owner: Soviets + Actor283: apwr + Location: 51,58 + Owner: Soviets + Actor72: dog + Location: 81,71 + Owner: Soviets + Actor617: truk + Location: 104,43 + Owner: Soviets + Actor220: sbag + Location: 92,48 + Owner: Soviets + Actor275: fenc + Location: 64,44 + Owner: Soviets + Actor225: fenc + Location: 84,49 + Owner: Soviets + Actor597: t16 + Location: 82,67 + Owner: Neutral + Actor596: tc01 + Location: 83,65 + Owner: Neutral + Actor559: tc02 + Location: 84,66 + Owner: Neutral + Actor418: tc04 + Location: 81,68 + Owner: Neutral + Actor32: tc05 + Location: 83,67 + Owner: Neutral + Actor496: 3tnk + Location: 86,20 + Owner: Soviets + Actor646: fenc + Location: 84,70 + Owner: Soviets + Actor649: fenc + Location: 86,70 + Owner: Soviets + Actor648: fenc + Location: 85,70 + Owner: Soviets + Actor100: e1 + Location: 87,61 + Owner: Soviets + Actor339: e1 + Location: 80,59 + Owner: Soviets + Actor589: dog + Location: 80,57 + Owner: Soviets + Actor340: e1 + Location: 77,58 + Owner: Soviets + Actor55: wood + Location: 79,94 + Owner: Neutral + Actor168: wood + Location: 79,95 + Owner: Neutral + Actor172: wood + Location: 79,96 + Owner: Neutral + Actor324: t05 + Location: 64,63 + Owner: Neutral + Actor265: tsla + Location: 61,64 + Owner: Soviets + Actor257: proc + Location: 35,28 + Owner: Soviets + Actor325: t12 + Location: 48,52 + Owner: Neutral + Actor661: tc03 + Location: 54,16 + Owner: Neutral + Actor326: t17 + Location: 34,50 + Owner: Neutral + Actor667: tc04 + Location: 88,106 + Owner: Neutral + Actor668: t16 + Location: 80,106 + Owner: Neutral + Actor670: fenc + Location: 95,78 + Owner: Soviets + Actor671: fenc + Location: 94,78 + Owner: Soviets + Actor672: fenc + Location: 93,78 + Owner: Soviets + Actor69: e1 + Location: 90,102 + Owner: Soviets + Actor68: e2 + Location: 92,102 + Owner: Soviets + Actor63: e1 + Location: 92,104 + Owner: Soviets + Actor673: wood + Location: 82,97 + Owner: Neutral + Actor674: wood + Location: 81,97 + Owner: Neutral + Actor176: tsla + Location: 56,36 + Owner: Soviets + Actor681: wood + Location: 70,100 + Owner: Neutral + Actor680: wood + Location: 69,100 + Owner: Neutral + Actor308: apwr + Location: 54,62 + Owner: Soviets + Actor262: t06 + Location: 20,51 + Owner: Neutral + Actor676: wood + Location: 79,97 + Owner: Neutral + Actor185: ftur + Location: 42,62 + Owner: Soviets + Actor675: wood + Location: 80,97 + Owner: Neutral + Actor686: brl3 + Location: 82,73 + Owner: Soviets + Actor148: proc + Location: 40,36 + Owner: Soviets + Actor707: v18 + Location: 68,97 + Owner: Neutral + Actor612: t07 + Location: 80,67 + Owner: Neutral + Actor601: t11 + Location: 74,72 + Owner: Neutral + Actor627: t01 + Location: 84,59 + Owner: Neutral + Actor131: sbag + Location: 92,49 + Owner: Soviets + Actor264: t10 + Location: 17,45 + Owner: Neutral + Actor177: hpad + Location: 45,44 + Owner: Soviets + Actor179: tsla + Location: 25,52 + Owner: Soviets + Actor180: ftur + Location: 32,25 + Owner: Soviets + Actor700: tsla + Location: 55,17 + Owner: Soviets + Actor183: ftur + Location: 22,40 + Owner: Soviets + Actor708: v17 + Location: 69,97 + Owner: Neutral + Actor101: dog + Location: 98,74 + Owner: Soviets + Actor715: e2 + Location: 75,34 + Owner: Soviets + Actor0: silo + Location: 94,72 + Owner: Soviets + Actor602: fenc + Location: 99,80 + Owner: Soviets + Actor346: fenc + Location: 100,80 + Owner: Soviets + Actor166: fenc + Location: 101,80 + Owner: Soviets + Actor54: ftur + Location: 97,77 + Owner: Soviets + Actor725: fenc + Location: 75,74 + Owner: Soviets + Actor724: fenc + Location: 76,74 + Owner: Soviets + Actor726: fenc + Location: 74,74 + Owner: Soviets + Actor727: fenc + Location: 73,74 + Owner: Soviets + Actor728: fenc + Location: 72,74 + Owner: Soviets + Actor729: fenc + Location: 72,73 + Owner: Soviets + Actor730: fenc + Location: 72,72 + Owner: Soviets + Actor40: tran.husk1 + Location: 69,87 + Owner: Neutral + Actor333: brl3 + Location: 21,73 + Owner: Neutral + Actor145: mine + Location: 44,29 + Owner: Neutral + Actor270: e1 + Location: 31,87 + Owner: Soviets + Actor573: 2tnk + Location: 34,92 + Owner: Allies + Facing: 0 + Actor577: tc02 + Location: 81,87 + Owner: Neutral + Actor329: e1 + Location: 41,87 + Owner: Soviets + Actor574: 2tnk + Location: 35,92 + Owner: Allies + Facing: 0 + Actor578: v11 + Location: 64,84 + Owner: Neutral + Actor546: 1tnk + Location: 38,90 + Owner: Allies + Facing: 0 + Actor342: e1 + Location: 99,38 + Owner: Soviets + Actor286: e1 + Location: 104,67 + Owner: Soviets + Actor755: e1 + Location: 107,70 + Owner: Soviets + Actor756: e2 + Location: 107,67 + Owner: Soviets + Actor161: proc + Location: 108,69 + Owner: Soviets + Actor285: powr + Location: 102,68 + Owner: Soviets + Actor309: apwr + Location: 51,64 + Owner: Soviets + Actor316: fact + Location: 59,61 + Owner: Soviets + Actor323: t06 + Location: 29,43 + Owner: Neutral + Actor722: t14 + Location: 67,52 + Owner: Neutral + Actor763: tsla + Location: 79,24 + Owner: Soviets + Actor764: e1 + Location: 95,59 + Owner: Soviets + Actor765: e1 + Location: 98,56 + Owner: Soviets + Actor207: fenc + Location: 61,39 + Owner: Soviets + Actor767: dog + Location: 95,57 + Owner: Soviets + Actor766: e1 + Location: 93,56 + Owner: Soviets + Actor205: fenc + Location: 60,39 + Owner: Soviets + Actor187: afld + Location: 35,37 + Owner: Soviets + Actor213: v2rl + Location: 52,44 + Owner: Soviets + Actor272: t16 + Location: 26,30 + Owner: Neutral + Actor214: fenc + Location: 62,41 + Owner: Soviets + Actor233: tc01 + Location: 29,53 + Owner: Neutral + Actor212: fenc + Location: 61,41 + Owner: Soviets + Actor776: e1 + Location: 74,69 + Owner: Soviets + Actor230: tc03 + Location: 16,55 + Owner: Neutral + Actor167: fix + Location: 57,50 + Owner: Soviets + Actor802: t06 + Location: 22,64 + Owner: Neutral + Actor165: mine + Location: 40,24 + Owner: Neutral + Actor322: tsla + Location: 48,64 + Owner: Soviets + Actor255: gun + Location: 42,91 + Owner: Allies + Actor268: e1 + Location: 33,90 + Owner: Allies + Actor269: e1 + Location: 34,90 + Owner: Allies + Actor267: pbox + Location: 30,90 + Owner: Allies + Actor882: barl + Location: 46,81 + Owner: Neutral + Actor202: kenn + Location: 45,49 + Owner: Soviets + Actor184: fenc + Location: 59,39 + Owner: Soviets + Actor256: fenc + Location: 64,42 + Owner: Soviets + Actor240: silo + Location: 38,34 + Owner: Soviets + Actor173: ftur + Location: 66,44 + Owner: Soviets + Actor305: ftur + Location: 46,21 + Owner: Soviets + Actor261: tc01 + Location: 42,77 + Owner: Neutral + Actor778: t05 + Location: 48,78 + Owner: Neutral + Actor831: t15 + Location: 47,82 + Owner: Neutral + Actor865: t08 + Location: 24,110 + Owner: Neutral + Actor864: t01 + Location: 33,109 + Owner: Neutral + Actor862: t07 + Location: 41,71 + Owner: Neutral + Actor867: t01 + Location: 16,68 + Owner: Neutral + Actor883: barl + Location: 44,79 + Owner: Neutral + Actor905: v01 + Location: 20,74 + Owner: Neutral + Actor209: fenc + Location: 61,40 + Owner: Soviets + Actor276: fenc + Location: 65,44 + Owner: Soviets + Actor197: tsla + Location: 55,44 + Owner: Soviets + Actor277: fenc + Location: 57,39 + Owner: Soviets + Actor288: apwr + Location: 51,61 + Owner: Soviets + Actor278: fenc + Location: 56,39 + Owner: Soviets + Actor274: fenc + Location: 64,43 + Owner: Soviets + Actor252: fenc + Location: 64,41 + Owner: Soviets + Actor906: v03 + Location: 16,72 + Owner: Neutral + Actor175: fenc + Location: 58,39 + Owner: Soviets + Actor271: v2rl + Location: 29,33 + Owner: Soviets + Facing: 0 + Actor186: afld + Location: 53,40 + Owner: Soviets + Actor238: silo + Location: 39,34 + Owner: Soviets + Actor241: silo + Location: 38,33 + Owner: Soviets + Actor178: e3 + Location: 37,43 + Owner: Soviets + Actor190: e3 + Location: 35,35 + Owner: Soviets + Actor191: e3 + Location: 38,52 + Owner: Soviets + Actor337: e3 + Location: 37,53 + Owner: Soviets + Actor338: e3 + Location: 45,58 + Owner: Soviets + Actor341: e3 + Location: 54,50 + Owner: Soviets + Actor343: e3 + Location: 66,49 + Owner: Soviets + Actor344: e3 + Location: 62,60 + Owner: Soviets + Actor345: e2 + Location: 42,51 + Owner: Soviets + Actor349: e2 + Location: 55,55 + Owner: Soviets + Actor350: e2 + Location: 43,35 + Owner: Soviets + Actor351: dog + Location: 43,55 + Owner: Soviets + Actor352: dog + Location: 45,60 + Owner: Soviets + Actor353: dog + Location: 41,42 + Owner: Soviets + Actor354: dog + Location: 57,46 + Owner: Soviets + Actor355: dog + Location: 40,31 + Owner: Soviets + Actor357: 3tnk + Location: 43,59 + Owner: Soviets + Facing: 90 + Actor537: harv + Location: 25,94 + Owner: Allies + Facing: 96 + Actor358: 3tnk + Location: 38,55 + Owner: Soviets + Facing: 110 + Actor359: v2rl + Location: 44,53 + Owner: Soviets + Actor282: tent + Location: 40,94 + Owner: Allies + Actor290: pbox + Location: 39,92 + Owner: Allies + Actor1000: camera + Location: 1,1 + Owner: Soviets + ChinookHusk: tran.husk2 + Location: 108,87 + Owner: Neutral + Einstein: einstein + Location: 66,85 + Owner: Neutral + TanyaLocation: waypoint + Location: 106,86 + Owner: Allies1 + Engineer: e6 + Location: 68,86 + Owner: Neutral + Sam1: sam + Location: 105,97 + Owner: Soviets + Sam2: sam + Location: 91,65 + Owner: Soviets + Sam3: sam + Location: 94,18 + Owner: Soviets + Sam4: sam + Location: 31,37 + Owner: Soviets + Allies2BasePoint: waypoint + Location: 34,96 + Owner: Neutral + AlliedBaseBottomRight: waypoint + Location: 51,111 + Owner: Neutral + AlliedBaseTopLeft: waypoint + Location: 16,84 + Owner: Neutral + ReinforcementsEntryPoint: waypoint + Location: 31,111 + Owner: Neutral + ExtractionLZEntryPoint: waypoint + Location: 9,9 + Owner: Neutral + ExtractionLZ: waypoint + Location: 30,38 + Owner: Neutral + TanksEntryPoint: waypoint + Location: 16,86 + Owner: Neutral + SovietRallyPoint: waypoint + Location: 36,65 + Owner: Neutral + TownPoint: waypoint + Location: 70,89 + Owner: Neutral + SovietTownAttackPoint1: waypoint + Location: 72,110 + Owner: Neutral + SovietTownAttackPoint2: waypoint + Location: 86,78 + Owner: Neutral + BadgerEntryPoint1: waypoint + Location: 40,12 + Owner: Neutral + BadgerEntryPoint2: waypoint + Location: 119,77 + Owner: Neutral + BadgerDropPoint1: waypoint + Location: 19,96 + Owner: Neutral + BadgerDropPoint2: waypoint + Location: 34,106 + Owner: Neutral + BadgerDropPoint3: waypoint + Location: 26,100 + Owner: Neutral + ParabombPoint1: waypoint + Location: 39,105 + Owner: Neutral + ParabombPoint2: waypoint + Location: 39,108 + Owner: Neutral + YakEntryPoint: waypoint + Location: 99,10 + Owner: Neutral + YakAttackPoint: waypoint + Location: 78,62 + Owner: Neutral + FlamersEntryPoint: waypoint + Location: 16,74 + Owner: Neutral + SovietBarracks: barr + Location: 39,49 + Owner: Soviets + SovietWarFactory: weap + Location: 51,47 + Owner: Soviets + TownUnit01: e1 + Location: 67,88 + Owner: Neutral + TownUnit02: e1 + Location: 69,89 + Owner: Neutral + TownUnit03: e1 + Location: 69,93 + Owner: Neutral + TownUnit04: e1 + Location: 73,85 + Owner: Neutral + TownUnit05: e1 + Location: 71,86 + Owner: Neutral + TownUnit06: e1 + Location: 68,91 + Owner: Neutral + TownUnit07: e1 + Location: 73,88 + Owner: Neutral + TownUnit08: e1 + Location: 70,86 + Owner: Neutral + TownUnit09: e1 + Location: 69,84 + Owner: Neutral + TownUnit10: e1 + Location: 73,90 + Owner: Neutral + TownUnit11: e3 + Location: 66,89 + Owner: Neutral + TownUnit12: e3 + Location: 66,87 + Owner: Neutral + TownUnit13: e3 + Location: 64,88 + Owner: Neutral + TownUnit14: e1 + Location: 70,88 + Owner: Neutral + TownAttacker01: e1 + Location: 73,83 + Owner: Soviets + ScriptTags: TownAttacker + TownAttacker02: e1 + Location: 80,87 + Owner: Soviets + ScriptTags: TownAttacker + TownAttacker03: e2 + Location: 104,101 + Owner: Soviets + ScriptTags: TownAttacker + TownAttacker04: e2 + Location: 77,96 + Owner: Soviets + ScriptTags: TownAttacker + TownAttacker05: e1 + Location: 71,99 + Owner: Soviets + ScriptTags: TownAttacker + TownAttacker06: e1 + Location: 69,110 + Owner: Soviets + ScriptTags: TownAttacker + TownAttacker07: e1 + Location: 74,109 + Owner: Soviets + ScriptTags: TownAttacker + TownAttacker08: e1 + Location: 73,110 + Owner: Soviets + ScriptTags: TownAttacker + TownAttacker09: e1 + Location: 71,109 + Owner: Soviets + ScriptTags: TownAttacker + TownAttacker10: e2 + Location: 74,110 + Owner: Soviets + ScriptTags: TownAttacker + TownAttacker11: e2 + Location: 70,109 + Owner: Soviets + ScriptTags: TownAttacker + TownAttacker12: e2 + Location: 73,109 + Owner: Soviets + ScriptTags: TownAttacker + TownAttacker13: e1 + Location: 72,109 + Owner: Soviets + ScriptTags: TownAttacker + TownAttacker14: e1 + Location: 70,110 + Owner: Soviets + ScriptTags: TownAttacker + TownAttacker15: e1 + Location: 82,77 + Owner: Soviets + ScriptTags: TownAttacker + TownAttacker16: e1 + Location: 85,76 + Owner: Soviets + ScriptTags: TownAttacker + TownAttacker17: e1 + Location: 89,79 + Owner: Soviets + ScriptTags: TownAttacker + TownAttacker18: e1 + Location: 84,79 + Owner: Soviets + ScriptTags: TownAttacker + TownAttacker19: e1 + Location: 89,80 + Owner: Soviets + ScriptTags: TownAttacker + TownAttacker20: e2 + Location: 86,77 + Owner: Soviets + ScriptTags: TownAttacker + TownAttacker21: dog + Location: 87,79 + Owner: Soviets + ScriptTags: TownAttacker + TownAttacker22: 3tnk + Location: 84,77 + Owner: Soviets + ScriptTags: TownAttacker + TownAttacker23: e2 + Location: 74,92 + Owner: Soviets + ScriptTags: TownAttacker + +Rules: ra|rules/campaign-rules.yaml, ra|rules/campaign-tooltips.yaml, rules.yaml diff --git a/mods/ra/maps/evacuation/rules.yaml b/mods/ra/maps/evacuation/rules.yaml new file mode 100644 index 0000000000..c64b72e243 --- /dev/null +++ b/mods/ra/maps/evacuation/rules.yaml @@ -0,0 +1,217 @@ +Player: + MissionObjectives: + Cooperative: True + PlayerResources: + DefaultCash: 5000 + DeveloperMode: + Locked: True + +World: + MissionData: + Briefing: One of our outposts is under heavy attack by a nearby Soviet base. Einstein, Tanya and many of our forces have been evacuated via helicopters, but those were shot down on the other side of the river. Fortunately they survived the crash, but are now in enemy territory. Tanya and the rest of the surviving forces need to fight their way out of there. The air defenses must be eliminated before another Search & Rescue helicopter can arrive.\n\nMeanwhile, the forces remaining at the base need to fend off the Soviet attacks.\n + LuaScript: + Scripts: evacuation.lua + MapOptions: + TechLevelLocked: True + Difficulties: Easy, Normal + Difficulty: Normal + +^Tanks: + Demolishable: + +^Vehicles: + Demolishable: + +E1: + ScriptTags: + +E2: + ScriptTags: + +DOG: + ScriptTags: + +3TNK: + ScriptTags: + +TRAN.Husk1: + Burns: + Damage: 0 + +TRAN.Husk2: + Burns: + Damage: 0 + +E7: + Passenger: + Weight: 0 + Buildable: + Prerequisites: ~disabled + +EINSTEIN: + Passenger: + Weight: 0 + +V01: + SpawnActorOnDeath: + Actor: healcrate + +TRAN: + -Selectable: + Buildable: + Prerequisites: ~disabled + RevealsShroud: + Range: 0c0 + +2TNK: + Buildable: + Prerequisites: ~vehicles.allies + +MECH: + Buildable: + Prerequisites: ~disabled + +SPEN: + Buildable: + Prerequisites: ~disabled + +SYRD: + Buildable: + Prerequisites: ~disabled + +TSLA: + Buildable: + Prerequisites: ~disabled + +AGUN: + Buildable: + Prerequisites: ~disabled + +SAM: + Buildable: + Prerequisites: ~disabled + +ATEK: + Buildable: + Prerequisites: ~disabled + +HPAD: + Buildable: + Prerequisites: ~disabled + +AFLD: + Buildable: + Prerequisites: ~disabled + +STEK: + Buildable: + Prerequisites: ~disabled + +GAP: + Buildable: + Prerequisites: ~disabled + +PDOX: + Buildable: + Prerequisites: ~disabled + +IRON: + Buildable: + Prerequisites: ~disabled + +MSLO: + Buildable: + Prerequisites: ~disabled + +MIG: + Buildable: + Prerequisites: ~disabled + +HELI: + Buildable: + Prerequisites: ~disabled + +4TNK: + Buildable: + Prerequisites: ~disabled + +MCV: + Buildable: + Prerequisites: ~disabled + +ARTY: + Buildable: + Prerequisites: ~disabled + +APC: + Buildable: + Prerequisites: ~disabled + +MNLY.AP: + Buildable: + Prerequisites: ~disabled + +MNLY.AT: + Buildable: + Prerequisites: ~disabled + +TRUK: + Buildable: + Prerequisites: ~disabled + +FTRK: + Buildable: + Prerequisites: ~disabled + +MRJ: + Buildable: + Prerequisites: ~disabled + +MGG: + Buildable: + Prerequisites: ~disabled + +TTNK: + Buildable: + Prerequisites: ~disabled + +QTNK: + Buildable: + Prerequisites: ~disabled + +DTRK: + Buildable: + Prerequisites: ~disabled + +CTNK: + Buildable: + Prerequisites: ~disabled + +STNK: + Buildable: + Prerequisites: ~disabled + +MSUB: + Buildable: + Prerequisites: ~disabled + +CAMERA.Large: + Inherits: CAMERA + RevealsShroud: + Range: 1000c0 + +Camera.SAM: + Inherits: CAMERA + RevealsShroud: + Range: 2c0 + +powerproxy.paras1: + AlwaysVisible: + ParatroopersPower: + DropItems: E1,E1,E1,E2,3TNK + +powerproxy.paras2: + AlwaysVisible: + ParatroopersPower: + DropItems: E1,E1,E1,E2,E2 +