diff --git a/OpenRA.Mods.RA/Missions/Allies01Script.cs b/OpenRA.Mods.RA/Missions/Allies01Script.cs index d6c52cff07..9067cfba6d 100644 --- a/OpenRA.Mods.RA/Missions/Allies01Script.cs +++ b/OpenRA.Mods.RA/Missions/Allies01Script.cs @@ -8,7 +8,6 @@ */ #endregion -using System; using System.Collections.Generic; using System.Drawing; using System.Linq; @@ -201,14 +200,8 @@ namespace OpenRA.Mods.RA.Missions void SendAttackWave() { - foreach (var unit in world.Actors.Where( - a => a != world.WorldActor - && a.IsInWorld - && a.Owner == soviets - && !a.IsDead() - && a.IsIdle - && a.HasTrait() - && a.HasTrait())) + foreach (var unit in world.Actors.Where(a => a != world.WorldActor && a.IsInWorld && a.Owner == soviets && !a.IsDead() && a.IsIdle + && a.HasTrait() && a.HasTrait())) { Activity innerActivity; if (einstein != null) diff --git a/OpenRA.Mods.RA/Missions/Allies02Script.cs b/OpenRA.Mods.RA/Missions/Allies02Script.cs index e10f724f9d..0f46b7eafb 100644 --- a/OpenRA.Mods.RA/Missions/Allies02Script.cs +++ b/OpenRA.Mods.RA/Missions/Allies02Script.cs @@ -8,7 +8,6 @@ */ #endregion -using System; using System.Collections.Generic; using System.Drawing; using System.Linq; diff --git a/OpenRA.Mods.RA/Missions/Allies03Script.cs b/OpenRA.Mods.RA/Missions/Allies03Script.cs new file mode 100644 index 0000000000..577156c317 --- /dev/null +++ b/OpenRA.Mods.RA/Missions/Allies03Script.cs @@ -0,0 +1,275 @@ +#region Copyright & License Information +/* + * Copyright 2007-2012 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation. For more information, + * see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using OpenRA.FileFormats; +using OpenRA.Mods.RA.Activities; +using OpenRA.Mods.RA.Air; +using OpenRA.Mods.RA.Buildings; +using OpenRA.Mods.RA.Move; +using OpenRA.Network; +using OpenRA.Traits; +using OpenRA.Widgets; + +namespace OpenRA.Mods.RA.Missions +{ + class Allies03ScriptInfo : TraitInfo, Requires { } + + class Allies03Script : IHasObjectives, IWorldLoaded, ITick + { + public event ObjectivesUpdatedEventHandler OnObjectivesUpdated = notify => { }; + + public IEnumerable Objectives { get { return objectives.Values; } } + + Dictionary objectives = new Dictionary + { + { EvacuateID, new Objective(ObjectiveType.Primary, "Following the rescue of Einstein, the Allies are now being flanked from both sides. Evacuate {0} units before the remaining Allied forces in the area are wiped out.".F(UnitsEvacuatedThreshold), ObjectiveStatus.InProgress) }, + }; + + const int EvacuateID = 0; + const int UnitsEvacuatedThreshold = 100; + int unitsEvacuated; + InfoWidget evacuateWidget; + const string ShortEvacuateTemplate = "{0}/{1} units evacuated"; + + World world; + Player allies1; + Player allies2; + Player evacuees; + Player soviets; + + Actor exit1TopLeft; + Actor exit1TopRight; + Actor exit1BottomLeft; + Actor exit1BottomRight; + Actor exit1ExitPoint; + + Actor exit2TopLeft; + Actor exit2TopRight; + Actor exit2BottomLeft; + Actor exit2BottomRight; + Actor exit2ExitPoint; + + Actor sovietEntryPoint1; + Actor sovietEntryPoint2; + Actor sovietEntryPoint3; + Actor sovietEntryPoint4; + CPos[] sovietEntryPoints; + Actor sovietRallyPoint1; + Actor sovietRallyPoint2; + Actor sovietRallyPoint3; + Actor sovietRallyPoint4; + CPos[] sovietRallyPoints; + + static readonly string[] SovietVehicles = { "3tnk", "3tnk", "3tnk", "v2rl", "ftrk", "apc" }; + static readonly string[] SovietInfantry = { "e1", "e1", "e1", "e1", "e2", "e2", "e3", "e3", "e4", "e4" }; + + int attackAtFrame = 250; + int attackAtFrameIncrement = 250; + + Actor allies1EntryPoint; + Actor allies1MovePoint; + + Actor allies2EntryPoint; + Actor allies2MovePoint; + + const string McvName = "mcv"; + + void MissionFailed(string text) + { + if (allies1.WinState != WinState.Undefined) + { + return; + } + allies1.WinState = allies2.WinState = WinState.Lost; + foreach (var actor in world.Actors.Where(a => a.IsInWorld && (a.Owner == allies1 || a.Owner == allies2) && !a.IsDead())) + { + actor.Kill(actor); + } + Game.AddChatLine(Color.Red, "Mission failed", text); + Sound.Play("misnlst1.aud"); + } + + void MissionAccomplished(string text) + { + if (allies1.WinState != WinState.Undefined) + { + return; + } + allies1.WinState = allies2.WinState = WinState.Won; + Game.AddChatLine(Color.Blue, "Mission accomplished", text); + Sound.Play("misnwon1.aud"); + } + + public void Tick(Actor self) + { + if (allies1.WinState != WinState.Undefined) + { + return; + } + if (world.FrameNumber == 1) + { + SpawnAlliedUnits(); + evacuateWidget = new InfoWidget("", new float2(Game.viewport.Width * 0.35f, Game.viewport.Height * 0.9f)); + Ui.Root.AddChild(evacuateWidget); + UpdateUnitsEvacuated(); + } + if (world.FrameNumber == attackAtFrame) + { + SpawnSovietUnits(); + attackAtFrame += attackAtFrameIncrement; + attackAtFrameIncrement = Math.Max(attackAtFrameIncrement - 5, 100); + Game.Debug(attackAtFrame.ToString()); + Game.Debug(attackAtFrameIncrement.ToString()); + } + ManageSovietUnits(); + EvacuateAlliedUnits(exit1TopLeft.CenterLocation, exit1BottomRight.CenterLocation, exit1ExitPoint.Location); + EvacuateAlliedUnits(exit2TopLeft.CenterLocation, exit2BottomRight.CenterLocation, exit2ExitPoint.Location); + if (!world.Actors.Any(a => (a.Owner == allies1 || a.Owner == allies2) && a.IsInWorld && !a.IsDead() && ((a.HasTrait() && !a.HasTrait()) || a.HasTrait()))) + { + MissionFailed("The remaining Allied forces in the area have been wiped out."); + } + } + + void SpawnSovietUnits() + { + var route = world.SharedRandom.Next(sovietEntryPoints.Length); + var spawnPoint = sovietEntryPoints[route]; + var rallyPoint = sovietRallyPoints[route]; + var unit = world.CreateActor(SovietVehicles.Concat(SovietInfantry).Random(world.SharedRandom), new TypeDictionary { new LocationInit(spawnPoint), new OwnerInit(soviets) }); + unit.QueueActivity(new AttackMove.AttackMoveActivity(unit, new Move.Move(rallyPoint, 5))); + } + + void ManageSovietUnits() + { + var units = world.Actors.Where(u => u.IsInWorld && !u.IsDead() && u.IsIdle && u.HasTrait() && u.Owner == soviets); + foreach (var unit in units) + { + var enemyUnits = world.FindAliveCombatantActorsInCircle(unit.CenterLocation, 100) + .Where(u => (u.Owner == allies1 || u.Owner == allies2) && ((u.HasTrait() && !u.HasTrait()) || u.HasTrait())); + var targetEnemyUnit = enemyUnits.OrderBy(u => (unit.CenterLocation - u.CenterLocation).LengthSquared).FirstOrDefault(); + if (targetEnemyUnit != null) + { + unit.QueueActivity(new AttackMove.AttackMoveActivity(unit, new Move.Move(targetEnemyUnit.Location, 5))); + } + } + } + + void SpawnAlliedUnits() + { + var unit = world.CreateActor(McvName, new TypeDictionary + { + new LocationInit(allies1EntryPoint.Location), + new OwnerInit(allies1), + new FacingInit(Util.GetFacing(allies1MovePoint.Location - allies1EntryPoint.Location, 0)) + }); + unit.QueueActivity(new Move.Move(allies1MovePoint.Location)); + unit = world.CreateActor(McvName, new TypeDictionary + { + new LocationInit(allies2EntryPoint.Location), + new OwnerInit(allies2), + new FacingInit(Util.GetFacing(allies2MovePoint.Location - allies2EntryPoint.Location, 0)) + }); + unit.QueueActivity(new Move.Move(allies2MovePoint.Location)); + } + + void UpdateUnitsEvacuated() + { + evacuateWidget.Text = ShortEvacuateTemplate.F(unitsEvacuated, UnitsEvacuatedThreshold); + if (objectives[EvacuateID].Status == ObjectiveStatus.InProgress && unitsEvacuated >= UnitsEvacuatedThreshold) + { + objectives[EvacuateID].Status = ObjectiveStatus.Completed; + OnObjectivesUpdated(true); + MissionAccomplished("The remaining Allied forces in the area have evacuated."); + } + } + + void EvacuateAlliedUnits(PPos a, PPos b, CPos exit) + { + var units = world.FindAliveCombatantActorsInBox(a, b) + .Where(u => u.HasTrait() && !u.HasTrait() && (u.Owner == allies1 || u.Owner == allies2)); + foreach (var unit in units) + { + unit.CancelActivity(); + unit.ChangeOwner(evacuees); + unit.QueueActivity(new Move.Move(exit)); + unit.QueueActivity(new CallFunc(() => { unitsEvacuated++; UpdateUnitsEvacuated(); })); + unit.QueueActivity(new RemoveSelf()); + } + } + + public void WorldLoaded(World w) + { + world = w; + allies1 = w.Players.Single(p => p.InternalName == "Allies1"); + allies2 = w.Players.Single(p => p.InternalName == "Allies2"); + evacuees = w.Players.Single(p => p.InternalName == "Evacuees"); + soviets = w.Players.Single(p => p.InternalName == "Soviets"); + var actors = w.WorldActor.Trait().Actors; + exit1TopLeft = actors["Exit1TopLeft"]; + exit1TopRight = actors["Exit1TopRight"]; + exit1BottomLeft = actors["Exit1BottomLeft"]; + exit1BottomRight = actors["Exit1BottomRight"]; + exit1ExitPoint = actors["Exit1ExitPoint"]; + exit2TopLeft = actors["Exit2TopLeft"]; + exit2TopRight = actors["Exit2TopRight"]; + exit2BottomLeft = actors["Exit2BottomLeft"]; + exit2BottomRight = actors["Exit2BottomRight"]; + exit2ExitPoint = actors["Exit2ExitPoint"]; + allies1EntryPoint = actors["Allies1EntryPoint"]; + allies1MovePoint = actors["Allies1MovePoint"]; + allies2EntryPoint = actors["Allies2EntryPoint"]; + allies2MovePoint = actors["Allies2MovePoint"]; + sovietEntryPoint1 = actors["SovietEntryPoint1"]; + sovietEntryPoint2 = actors["SovietEntryPoint2"]; + sovietEntryPoint3 = actors["SovietEntryPoint3"]; + sovietEntryPoint4 = actors["SovietEntryPoint4"]; + sovietEntryPoints = new[] { sovietEntryPoint1, sovietEntryPoint2, sovietEntryPoint3, sovietEntryPoint4 }.Select(p => p.Location).ToArray(); + sovietRallyPoint1 = actors["SovietRallyPoint1"]; + sovietRallyPoint2 = actors["SovietRallyPoint2"]; + sovietRallyPoint3 = actors["SovietRallyPoint3"]; + sovietRallyPoint4 = actors["SovietRallyPoint4"]; + sovietRallyPoints = new[] { sovietRallyPoint1, sovietRallyPoint2, sovietRallyPoint3, sovietRallyPoint4 }.Select(p => p.Location).ToArray(); + if (w.LocalPlayer == null || w.LocalPlayer == allies1) + { + Game.MoveViewport(allies1EntryPoint.Location.ToFloat2()); + } + else + { + Game.MoveViewport(allies2EntryPoint.Location.ToFloat2()); + } + PlayMusic(); + OnObjectivesUpdated(false); + Game.ConnectionStateChanged += StopMusic; + } + + void PlayMusic() + { + if (!Rules.InstalledMusic.Any()) + { + return; + } + var track = Rules.InstalledMusic.Random(Game.CosmeticRandom); + Sound.PlayMusicThen(track.Value, PlayMusic); + } + + void StopMusic(OrderManager orderManager) + { + if (!orderManager.GameStarted) + { + Sound.StopMusic(); + Game.ConnectionStateChanged -= StopMusic; + } + } + } +} diff --git a/OpenRA.Mods.RA/Missions/CountdownTimer.cs b/OpenRA.Mods.RA/Missions/CountdownTimer.cs index 5da6165707..139ee83231 100644 --- a/OpenRA.Mods.RA/Missions/CountdownTimer.cs +++ b/OpenRA.Mods.RA/Missions/CountdownTimer.cs @@ -9,8 +9,6 @@ #endregion using System; -using System.Drawing; -using OpenRA.Widgets; namespace OpenRA.Mods.RA.Missions { @@ -68,29 +66,4 @@ namespace OpenRA.Mods.RA.Missions } } } - - public class CountdownTimerWidget : Widget - { - public CountdownTimer Timer { get; set; } - public string Format { get; set; } - public float2 Position { get; set; } - - public CountdownTimerWidget(CountdownTimer timer, string format, float2 position) - { - Timer = timer; - Format = format; - Position = position; - } - - public override void Draw() - { - if (!IsVisible()) - { - return; - } - var font = Game.Renderer.Fonts["Bold"]; - var text = Format.F(WidgetUtils.FormatTime(Timer.TicksLeft)); - font.DrawTextWithContrast(text, Position, Timer.TicksLeft <= 25 * 10 && Game.LocalTick % 50 < 25 ? Color.Red : Color.White, Color.Black, 1); - } - } } diff --git a/OpenRA.Mods.RA/Missions/MissionUtils.cs b/OpenRA.Mods.RA/Missions/MissionUtils.cs index 76e81d8fcc..3c0e7391cc 100644 --- a/OpenRA.Mods.RA/Missions/MissionUtils.cs +++ b/OpenRA.Mods.RA/Missions/MissionUtils.cs @@ -24,13 +24,18 @@ namespace OpenRA.Mods.RA.Missions public static IEnumerable FindAliveCombatantActorsInCircle(this World world, PPos location, int range) { return world.FindUnitsInCircle(location, Game.CellSize * range) - .Where(a => a.IsInWorld && a != world.WorldActor && !a.IsDead() && !a.Owner.NonCombatant); + .Where(u => u.IsInWorld && u != world.WorldActor && !u.IsDead() && !u.Owner.NonCombatant); + } + + public static IEnumerable FindAliveCombatantActorsInBox(this World world, PPos a, PPos b) + { + return world.FindUnits(a, b).Where(u => u.IsInWorld && u != world.WorldActor && !u.IsDead() && !u.Owner.NonCombatant); } public static IEnumerable FindAliveNonCombatantActorsInCircle(this World world, PPos location, int range) { return world.FindUnitsInCircle(location, Game.CellSize * range) - .Where(a => a.IsInWorld && a != world.WorldActor && !a.IsDead() && a.Owner.NonCombatant); + .Where(u => u.IsInWorld && u != world.WorldActor && !u.IsDead() && u.Owner.NonCombatant); } public static Actor ExtractUnitWithChinook(World world, Player owner, Actor unit, CPos entry, CPos lz, CPos exit) diff --git a/OpenRA.Mods.RA/Missions/MissionWidgets.cs b/OpenRA.Mods.RA/Missions/MissionWidgets.cs new file mode 100644 index 0000000000..54eb7fd705 --- /dev/null +++ b/OpenRA.Mods.RA/Missions/MissionWidgets.cs @@ -0,0 +1,62 @@ +#region Copyright & License Information +/* + * Copyright 2007-2012 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation. For more information, + * see COPYING. + */ +#endregion + +using System.Drawing; +using OpenRA.Widgets; + +namespace OpenRA.Mods.RA.Missions +{ + public class CountdownTimerWidget : Widget + { + public CountdownTimer Timer { get; set; } + public string Format { get; set; } + public float2 Position { get; set; } + + public CountdownTimerWidget(CountdownTimer timer, string format, float2 position) + { + Timer = timer; + Format = format; + Position = position; + } + + public override void Draw() + { + if (!IsVisible()) + { + return; + } + var font = Game.Renderer.Fonts["Bold"]; + var text = Format.F(WidgetUtils.FormatTime(Timer.TicksLeft)); + font.DrawTextWithContrast(text, Position, Timer.TicksLeft <= 25 * 10 && Game.LocalTick % 50 < 25 ? Color.Red : Color.White, Color.Black, 1); + } + } + + public class InfoWidget : Widget + { + public string Text { get; set; } + public float2 Position { get; set; } + + public InfoWidget(string text, float2 position) + { + Text = text; + Position = position; + } + + public override void Draw() + { + if (!IsVisible()) + { + return; + } + var font = Game.Renderer.Fonts["Bold"]; + font.DrawTextWithContrast(Text, Position, Color.White, Color.Black, 1); + } + } +} diff --git a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj index 6a336d29a1..0cba3df214 100644 --- a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj +++ b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj @@ -240,9 +240,11 @@ + + @@ -440,4 +442,4 @@ copy "$(TargetPath)" "$(SolutionDir)mods/ra/" cd "$(SolutionDir)" - + \ No newline at end of file diff --git a/mods/ra/maps/allies-03/map.bin b/mods/ra/maps/allies-03/map.bin new file mode 100644 index 0000000000..9cccf540f7 Binary files /dev/null and b/mods/ra/maps/allies-03/map.bin differ diff --git a/mods/ra/maps/allies-03/map.yaml b/mods/ra/maps/allies-03/map.yaml new file mode 100644 index 0000000000..e26c87b0b5 --- /dev/null +++ b/mods/ra/maps/allies-03/map.yaml @@ -0,0 +1,1197 @@ +Selectable: True + +MapFormat: 5 + +RequiresMod: ra + +Title: Allies 03 + +Description: Allies' third mission + +Author: Scott_NZ + +Tileset: SNOW + +MapSize: 192,96 + +Bounds: 16,16,160,64 + +UseAsShellmap: False + +Type: Mission + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Race: allies + PlayerReference@Allies1: + Name: Allies1 + Playable: True + AllowBots: False + LockRace: True + Race: allies + LockColor: True + ColorRamp: 153,240,130,10 + LockSpawn: True + LockTeam: True + Allies: Allies2,Evacuees + Enemies: Soviets + PlayerReference@Allies2: + Name: Allies2 + Playable: True + AllowBots: False + LockRace: True + Race: allies + LockColor: True + ColorRamp: 115,240,130,10 + LockSpawn: True + LockTeam: True + Allies: Allies1,Evacuees + Enemies: Soviets + PlayerReference@Evacuees: + Name: Evacuees + NonCombatant: True + Race: allies + ColorRamp: 80,240,130,10 + Allies: Allies1,Allies2 + Enemies: Soviets + PlayerReference@Soviets: + Name: Soviets + Race: soviet + ColorRamp: 0,255,128,10 + Enemies: Allies1,Allies2,Evacuees + +Actors: + Actor11: t05 + Location: 150,54 + Owner: Neutral + Actor12: t08 + Location: 163,57 + Owner: Neutral + Actor14: t14 + Location: 148,59 + Owner: Neutral + Actor25: t07 + Location: 142,77 + Owner: Neutral + Actor29: t07 + Location: 165,78 + Owner: Neutral + Actor21: mine + Location: 169,71 + Owner: Neutral + Actor23: t08 + Location: 124,40 + Owner: Neutral + Actor10: tc04 + Location: 43,67 + Owner: Neutral + Actor28: t02 + Location: 151,51 + Owner: Neutral + Actor34: t17 + Location: 148,52 + Owner: Neutral + Actor36: tc04 + Location: 172,46 + Owner: Neutral + Actor37: t02 + Location: 169,46 + Owner: Neutral + Actor39: t02 + Location: 148,45 + Owner: Neutral + Actor42: t10 + Location: 151,47 + Owner: Neutral + Actor9: tc04 + Location: 33,41 + Owner: Neutral + Actor52: t05 + Location: 163,47 + Owner: Neutral + Actor53: tc03 + Location: 138,53 + Owner: Neutral + Actor2: tc04 + Location: 53,43 + Owner: Neutral + Actor57: tc04 + Location: 43,19 + Owner: Neutral + Actor58: tc04 + Location: 56,18 + Owner: Neutral + Actor59: tc04 + Location: 69,28 + Owner: Neutral + Actor60: tc05 + Location: 63,19 + Owner: Neutral + Actor61: tc05 + Location: 48,19 + Owner: Neutral + Actor62: tc05 + Location: 37,18 + Owner: Neutral + Actor63: tc05 + Location: 78,14 + Owner: Neutral + Actor64: tc03 + Location: 70,19 + Owner: Neutral + Actor65: tc03 + Location: 55,26 + Owner: Neutral + Actor66: tc03 + Location: 45,24 + Owner: Neutral + Actor67: tc03 + Location: 38,23 + Owner: Neutral + Actor68: tc02 + Location: 39,21 + Owner: Neutral + Actor69: tc02 + Location: 42,16 + Owner: Neutral + Actor70: tc02 + Location: 50,16 + Owner: Neutral + Actor71: tc02 + Location: 51,22 + Owner: Neutral + Actor72: tc02 + Location: 64,29 + Owner: Neutral + Actor73: tc02 + Location: 67,24 + Owner: Neutral + Actor74: tc02 + Location: 74,17 + Owner: Neutral + Actor75: tc01 + Location: 61,16 + Owner: Neutral + Actor76: tc01 + Location: 57,22 + Owner: Neutral + Actor77: tc01 + Location: 48,23 + Owner: Neutral + Actor78: tc01 + Location: 38,26 + Owner: Neutral + Actor79: t05 + Location: 38,20 + Owner: Neutral + Actor80: t05 + Location: 42,17 + Owner: Neutral + Actor81: t05 + Location: 47,20 + Owner: Neutral + Actor82: t05 + Location: 53,25 + Owner: Neutral + Actor83: t05 + Location: 57,16 + Owner: Neutral + Actor84: t05 + Location: 56,22 + Owner: Neutral + Actor85: t05 + Location: 64,27 + Owner: Neutral + Actor86: t05 + Location: 70,22 + Owner: Neutral + Actor87: t05 + Location: 68,15 + Owner: Neutral + Actor88: t05 + Location: 81,18 + Owner: Neutral + Actor89: t16 + Location: 79,18 + Owner: Neutral + Actor90: t16 + Location: 68,16 + Owner: Neutral + Actor91: t16 + Location: 67,22 + Owner: Neutral + Actor92: t16 + Location: 53,16 + Owner: Neutral + Actor93: t16 + Location: 51,23 + Owner: Neutral + Actor94: t16 + Location: 47,16 + Owner: Neutral + Actor95: t16 + Location: 42,27 + Owner: Neutral + Actor96: t16 + Location: 38,16 + Owner: Neutral + Actor97: t16 + Location: 34,20 + Owner: Neutral + Actor98: t02 + Location: 54,19 + Owner: Neutral + Actor99: t02 + Location: 64,24 + Owner: Neutral + Actor100: t02 + Location: 48,26 + Owner: Neutral + Actor101: t02 + Location: 42,18 + Owner: Neutral + Actor102: t02 + Location: 37,16 + Owner: Neutral + Actor103: t06 + Location: 42,24 + Owner: Neutral + Actor104: t06 + Location: 45,21 + Owner: Neutral + Actor105: t06 + Location: 58,16 + Owner: Neutral + Actor106: t06 + Location: 59,28 + Owner: Neutral + Actor107: t06 + Location: 63,24 + Owner: Neutral + Actor108: t06 + Location: 67,29 + Owner: Neutral + Actor109: t10 + Location: 66,17 + Owner: Neutral + Actor110: t10 + Location: 65,28 + Owner: Neutral + Actor111: t10 + Location: 54,22 + Owner: Neutral + Actor112: t11 + Location: 40,23 + Owner: Neutral + Actor113: t11 + Location: 52,26 + Owner: Neutral + Actor114: t11 + Location: 69,20 + Owner: Neutral + Actor115: t12 + Location: 68,30 + Owner: Neutral + Actor116: t12 + Location: 60,20 + Owner: Neutral + Actor117: t17 + Location: 44,17 + Owner: Neutral + Actor118: t17 + Location: 36,19 + Owner: Neutral + Actor119: t08 + Location: 52,20 + Owner: Neutral + Actor120: t08 + Location: 70,27 + Owner: Neutral + Actor121: t08 + Location: 48,16 + Owner: Neutral + Actor123: tc03 + Location: 17,25 + Owner: Neutral + Exit1BottomRight: waypoint + Location: 25,50 + Owner: Neutral + Exit1BottomLeft: waypoint + Location: 16,50 + Owner: Neutral + Actor3: mine + Location: 167,70 + Owner: Neutral + Actor127: t05 + Location: 17,21 + Owner: Neutral + Exit1TopLeft: waypoint + Location: 16,44 + Owner: Neutral + Actor48: fenc + Location: 29,27 + Owner: Evacuees + Actor130: t02 + Location: 28,16 + Owner: Neutral + Actor131: t06 + Location: 48,32 + Owner: Neutral + Actor132: t02 + Location: 30,35 + Owner: Neutral + Actor133: t03 + Location: 28,34 + Owner: Neutral + Actor134: t17 + Location: 55,31 + Owner: Neutral + Actor135: t03 + Location: 60,37 + Owner: Neutral + Actor136: t11 + Location: 64,38 + Owner: Neutral + Actor137: t10 + Location: 65,33 + Owner: Neutral + Actor140: tc05 + Location: 163,42 + Owner: Neutral + Actor51: t01 + Location: 48,62 + Owner: Neutral + Actor142: t05 + Location: 175,43 + Owner: Neutral + Actor143: t02 + Location: 173,41 + Owner: Neutral + Actor20: mine + Location: 158,26 + Owner: Neutral + Actor147: t10 + Location: 139,41 + Owner: Neutral + Actor148: t13 + Location: 129,40 + Owner: Neutral + Actor149: t17 + Location: 134,47 + Owner: Neutral + Actor161: tc04 + Location: 150,77 + Owner: Neutral + Actor156: t05 + Location: 139,44 + Owner: Neutral + Actor150: t05 + Location: 146,37 + Owner: Neutral + Actor162: t06 + Location: 126,37 + Owner: Neutral + Actor178: t16 + Location: 137,77 + Owner: Neutral + Actor370: tc02 + Location: 25,65 + Owner: Neutral + Actor165: tc03 + Location: 154,78 + Owner: Neutral + Actor181: t13 + Location: 137,71 + Owner: Neutral + Actor182: t16 + Location: 135,57 + Owner: Neutral + Actor184: tc01 + Location: 124,38 + Owner: Neutral + Actor363: t12 + Location: 81,50 + Owner: Neutral + Actor345: t08 + Location: 90,23 + Owner: Neutral + Actor364: t12 + Location: 83,27 + Owner: Neutral + Actor346: t08 + Location: 107,28 + Owner: Neutral + Actor327: t07 + Location: 68,39 + Owner: Neutral + Actor298: t06 + Location: 72,50 + Owner: Neutral + Actor30: t01 + Location: 173,61 + Owner: Neutral + Actor233: tc01 + Location: 64,55 + Owner: Neutral + Actor326: t07 + Location: 69,57 + Owner: Neutral + Actor338: tc04 + Location: 28,76 + Owner: Neutral + Actor1: tc02 + Location: 95,73 + Owner: Neutral + Actor333: t07 + Location: 133,36 + Owner: Neutral + Actor238: t01 + Location: 111,60 + Owner: Neutral + Actor283: t05 + Location: 102,59 + Owner: Neutral + Actor287: t05 + Location: 70,47 + Owner: Neutral + Actor284: t05 + Location: 82,70 + Owner: Neutral + Actor369: tc02 + Location: 30,60 + Owner: Neutral + Actor289: t05 + Location: 71,33 + Owner: Neutral + Actor157: tc05 + Location: 23,39 + Owner: Neutral + Actor226: tc01 + Location: 98,24 + Owner: Neutral + Actor194: tc05 + Location: 103,62 + Owner: Neutral + Actor371: tc02 + Location: 37,77 + Owner: Neutral + Actor367: tc03 + Location: 35,71 + Owner: Neutral + Actor273: t03 + Location: 62,61 + Owner: Neutral + Actor302: t06 + Location: 71,73 + Owner: Neutral + Actor329: t07 + Location: 97,28 + Owner: Neutral + Actor331: t07 + Location: 124,48 + Owner: Neutral + Actor296: t05 + Location: 63,63 + Owner: Neutral + Actor155: tc04 + Location: 18,37 + Owner: Neutral + Actor279: t03 + Location: 72,32 + Owner: Neutral + Actor274: t03 + Location: 71,78 + Owner: Neutral + Actor280: t03 + Location: 121,19 + Owner: Neutral + Actor315: t06 + Location: 88,17 + Owner: Neutral + Actor312: t06 + Location: 110,24 + Owner: Neutral + Actor314: t06 + Location: 125,20 + Owner: Neutral + Actor307: t06 + Location: 119,50 + Owner: Neutral + Actor310: t06 + Location: 80,41 + Owner: Neutral + Actor323: t07 + Location: 113,76 + Owner: Neutral + Actor322: t07 + Location: 112,65 + Owner: Neutral + Actor321: t07 + Location: 93,59 + Owner: Neutral + Actor320: t07 + Location: 95,51 + Owner: Neutral + Actor303: t06 + Location: 101,69 + Owner: Neutral + Actor234: t01 + Location: 79,77 + Owner: Neutral + Actor354: t11 + Location: 73,71 + Owner: Neutral + Actor335: t07 + Location: 67,62 + Owner: Neutral + Actor365: tc04 + Location: 18,56 + Owner: Neutral + Actor196: t06 + Location: 129,52 + Owner: Neutral + Actor356: t11 + Location: 119,43 + Owner: Neutral + Actor360: t11 + Location: 122,76 + Owner: Neutral + Actor173: oilb + Location: 146,46 + Owner: Neutral + Actor187: tc04 + Location: 99,27 + Owner: Neutral + Actor186: tc04 + Location: 79,34 + Owner: Neutral + Actor203: tc05 + Location: 67,64 + Owner: Neutral + Actor172: barl + Location: 74,60 + Owner: Neutral + Actor295: t05 + Location: 89,54 + Owner: Neutral + Actor350: t10 + Location: 87,22 + Owner: Neutral + Actor299: t06 + Location: 104,50 + Owner: Neutral + Actor170: oilb + Location: 72,58 + Owner: Neutral + Actor291: t05 + Location: 91,33 + Owner: Neutral + Actor254: t02 + Location: 72,63 + Owner: Neutral + Actor43: t05 + Location: 58,62 + Owner: Neutral + Actor257: t02 + Location: 119,53 + Owner: Neutral + Actor8: e1 + Location: 26,46 + Owner: Evacuees + Actor264: t02 + Location: 127,17 + Owner: Neutral + Actor269: t03 + Location: 84,37 + Owner: Neutral + Actor256: t02 + Location: 106,42 + Owner: Neutral + Actor271: t03 + Location: 79,57 + Owner: Neutral + Actor352: t10 + Location: 88,57 + Owner: Neutral + SovietEntryPoint4: waypoint + Location: 115,16 + Owner: Neutral + Actor278: t03 + Location: 122,33 + Owner: Neutral + Actor221: tc01 + Location: 113,73 + Owner: Neutral + Actor224: tc01 + Location: 65,42 + Owner: Neutral + Actor267: t02 + Location: 123,62 + Owner: Neutral + Actor253: t02 + Location: 118,77 + Owner: Neutral + Actor220: tc01 + Location: 117,40 + Owner: Neutral + Actor218: tc01 + Location: 89,63 + Owner: Neutral + Actor158: tc01 + Location: 23,35 + Owner: Neutral + Actor160: t06 + Location: 21,40 + Owner: Neutral + Actor164: t16 + Location: 18,41 + Owner: Neutral + Actor163: t05 + Location: 20,35 + Owner: Neutral + Actor211: tc02 + Location: 75,74 + Owner: Neutral + Actor215: tc02 + Location: 71,38 + Owner: Neutral + Actor214: tc02 + Location: 79,47 + Owner: Neutral + Actor38: t15 + Location: 30,52 + Owner: Neutral + Actor44: t01 + Location: 55,56 + Owner: Neutral + Actor407: t13 + Location: 32,62 + Owner: Neutral + Actor139: t01 + Location: 111,35 + Owner: Neutral + Actor410: t15 + Location: 17,55 + Owner: Neutral + Actor141: t14 + Location: 36,56 + Owner: Neutral + Actor386: t07 + Location: 30,62 + Owner: Neutral + Actor240: t10 + Location: 149,75 + Owner: Neutral + Actor54: t01 + Location: 56,76 + Owner: Neutral + Actor391: t06 + Location: 25,75 + Owner: Neutral + Actor403: t01 + Location: 34,74 + Owner: Neutral + Actor402: t02 + Location: 21,65 + Owner: Neutral + Actor153: t14 + Location: 59,45 + Owner: Neutral + Actor375: tc01 + Location: 20,61 + Owner: Neutral + Actor712: t07 + Location: 170,34 + Owner: Neutral + Actor0: mine + Location: 160,27 + Owner: Neutral + Actor385: t07 + Location: 17,58 + Owner: Neutral + Actor401: t02 + Location: 30,74 + Owner: Neutral + Actor400: t05 + Location: 32,69 + Owner: Neutral + Actor382: t16 + Location: 27,60 + Owner: Neutral + Actor374: tc01 + Location: 34,68 + Owner: Neutral + Actor376: tc01 + Location: 16,65 + Owner: Neutral + Actor409: t15 + Location: 24,67 + Owner: Neutral + Actor405: t03 + Location: 24,58 + Owner: Neutral + Actor373: tc01 + Location: 25,68 + Owner: Neutral + Actor406: t13 + Location: 35,72 + Owner: Neutral + Actor55: t01 + Location: 37,37 + Owner: Neutral + Actor56: t01 + Location: 94,41 + Owner: Neutral + Actor760: t03 + Location: 175,27 + Owner: Neutral + Actor399: t05 + Location: 22,68 + Owner: Neutral + Actor408: t14 + Location: 20,59 + Owner: Neutral + Actor390: t07 + Location: 18,72 + Owner: Neutral + Actor18: mine + Location: 100,48 + Owner: Neutral + Actor767: t10 + Location: 158,15 + Owner: Neutral + Actor381: t16 + Location: 23,65 + Owner: Neutral + Actor775: t02 + Location: 171,15 + Owner: Neutral + Actor392: t06 + Location: 31,70 + Owner: Neutral + Actor366: tc03 + Location: 17,68 + Owner: Neutral + Actor368: tc03 + Location: 25,56 + Owner: Neutral + Actor780: t03 + Location: 79,39 + Owner: Neutral + Actor171: brl3 + Location: 74,59 + Owner: Neutral + Actor398: t05 + Location: 32,64 + Owner: Neutral + Actor796: t02 + Location: 154,40 + Owner: Neutral + Actor33: t05 + Location: 156,67 + Owner: Neutral + Actor383: t16 + Location: 22,52 + Owner: Neutral + Actor372: tc02 + Location: 20,77 + Owner: Neutral + Exit1TopRight: waypoint + Location: 25,44 + Owner: Neutral + Actor801: tc04 + Location: 129,74 + Owner: Neutral + Actor17: mine + Location: 99,46 + Owner: Neutral + Actor804: t13 + Location: 125,68 + Owner: Neutral + Actor248: t01 + Location: 67,47 + Owner: Neutral + Actor268: t03 + Location: 95,23 + Owner: Neutral + Actor812: tc03 + Location: 133,25 + Owner: Neutral + Actor818: t16 + Location: 138,15 + Owner: Neutral + Actor819: t16 + Location: 139,29 + Owner: Neutral + Actor820: t02 + Location: 147,16 + Owner: Neutral + Actor396: t05 + Location: 27,70 + Owner: Neutral + Actor387: t07 + Location: 22,63 + Owner: Neutral + Actor393: t06 + Location: 25,61 + Owner: Neutral + Actor32: t05 + Location: 42,40 + Owner: Neutral + Actor378: t16 + Location: 26,73 + Owner: Neutral + Actor31: t05 + Location: 53,51 + Owner: Neutral + Actor395: t06 + Location: 35,78 + Owner: Neutral + Actor826: t01 + Location: 136,15 + Owner: Neutral + Actor827: t01 + Location: 142,24 + Owner: Neutral + Actor829: t03 + Location: 146,15 + Owner: Neutral + Actor379: t16 + Location: 37,74 + Owner: Neutral + Actor411: t15 + Location: 31,77 + Owner: Neutral + Actor397: t05 + Location: 21,58 + Owner: Neutral + Actor394: t06 + Location: 18,52 + Owner: Neutral + Actor13: tc02 + Location: 38,61 + Owner: Neutral + Actor27: t05 + Location: 41,55 + Owner: Neutral + Actor377: t16 + Location: 16,78 + Owner: Neutral + Actor380: t16 + Location: 31,66 + Owner: Neutral + Actor845: t14 + Location: 136,21 + Owner: Neutral + Actor16: tc02 + Location: 52,39 + Owner: Neutral + Actor404: t03 + Location: 24,71 + Owner: Neutral + Actor389: t07 + Location: 25,71 + Owner: Neutral + Actor388: t07 + Location: 37,68 + Owner: Neutral + Actor412: t15 + Location: 28,73 + Owner: Neutral + Actor384: t07 + Location: 22,67 + Owner: Neutral + Actor26: t05 + Location: 45,72 + Owner: Neutral + Actor856: t16 + Location: 133,23 + Owner: Neutral + Actor15: tc04 + Location: 144,73 + Owner: Neutral + Actor861: t16 + Location: 128,62 + Owner: Neutral + Exit1ExitPoint: waypoint + Location: 16,47 + Owner: Neutral + Actor7: e1 + Location: 27,50 + Owner: Evacuees + Actor5: gun + Location: 28,51 + Owner: Evacuees + Actor6: gun + Location: 28,44 + Owner: Evacuees + Actor46: powr + Location: 30,20 + Owner: Evacuees + Actor47: tent + Location: 29,24 + Owner: Evacuees + Actor35: gun + Location: 29,29 + Owner: Evacuees + Actor24: gun + Location: 25,30 + Owner: Evacuees + Actor41: e1 + Location: 30,28 + Owner: Evacuees + Actor4: jeep + Location: 27,45 + Owner: Evacuees + Actor40: e1 + Location: 24,30 + Owner: Evacuees + Actor45: powr + Location: 32,20 + Owner: Evacuees + Actor49: fenc + Location: 28,27 + Owner: Evacuees + Actor50: fenc + Location: 27,27 + Owner: Evacuees + Actor122: fenc + Location: 30,27 + Owner: Evacuees + Actor124: fenc + Location: 31,27 + Owner: Evacuees + Actor125: fenc + Location: 32,27 + Owner: Evacuees + Actor126: fenc + Location: 32,25 + Owner: Evacuees + Actor128: fenc + Location: 32,26 + Owner: Evacuees + Actor129: fenc + Location: 33,25 + Owner: Evacuees + Actor145: fenc + Location: 34,25 + Owner: Evacuees + Actor146: fenc + Location: 35,25 + Owner: Evacuees + Allies1MovePoint: waypoint + Location: 149,24 + Owner: Neutral + Allies2MovePoint: waypoint + Location: 167,38 + Owner: Neutral + Allies1EntryPoint: waypoint + Location: 149,16 + Owner: Neutral + Allies2EntryPoint: waypoint + Location: 175,38 + Owner: Neutral + Actor19: e1 + Location: 147,27 + Owner: Soviets + Actor22: e1 + Location: 150,28 + Owner: Soviets + Actor138: e1 + Location: 163,36 + Owner: Soviets + Actor144: e1 + Location: 164,39 + Owner: Soviets + Actor151: e2 + Location: 148,27 + Owner: Soviets + Actor152: e2 + Location: 164,38 + Owner: Soviets + Exit2TopRight: waypoint + Location: 35,16 + Owner: Neutral + Exit2BottomLeft: waypoint + Location: 16,30 + Owner: Neutral + Exit2BottomRight: waypoint + Location: 35,30 + Owner: Neutral + Exit2TopLeft: waypoint + Location: 16,16 + Owner: Neutral + Exit2ExitPoint: waypoint + Location: 16,29 + Owner: Neutral + Actor174: oilb + Location: 143,46 + Owner: Neutral + Actor169: oilb + Location: 72,54 + Owner: Neutral + Actor175: brl3 + Location: 148,47 + Owner: Neutral + Actor176: barl + Location: 142,47 + Owner: Neutral + Actor177: brl3 + Location: 142,46 + Owner: Neutral + Actor179: barl + Location: 145,48 + Owner: Neutral + Actor180: barl + Location: 74,56 + Owner: Neutral + SovietEntryPoint3: waypoint + Location: 105,79 + Owner: Neutral + SovietEntryPoint2: waypoint + Location: 93,16 + Owner: Neutral + SovietEntryPoint1: waypoint + Location: 89,79 + Owner: Neutral + SovietRallyPoint2: waypoint + Location: 88,35 + Owner: Neutral + SovietRallyPoint1: waypoint + Location: 83,61 + Owner: Neutral + SovietRallyPoint3: waypoint + Location: 112,49 + Owner: Neutral + SovietRallyPoint4: waypoint + Location: 113,35 + Owner: Neutral + +Smudges: + +Rules: + Player: + -ConquestVictoryConditions: + World: + -CrateDrop: + -SpawnMPUnits: + -MPStartLocations: + Allies03Script: + MissionObjectivesPanel: + ObjectivesPanel: MISSION_OBJECTIVES + E7: + Buildable: + Owner: None + TRAN: + Buildable: + Owner: None + BARR: + Buildable: + Owner: None + MIG: + Buildable: + Owner: None + YAK: + Buildable: + Owner: None + HELI: + Buildable: + Owner: None + HIND: + Buildable: + Owner: None + SS: + Buildable: + Owner: None + MSUB: + Buildable: + Owner: None + DD: + Buildable: + Owner: None + CA: + Buildable: + Owner: None + PT: + Buildable: + Owner: None + MSLO: + Buildable: + Owner: None + GAP: + Buildable: + Owner: None + SPEN: + Buildable: + Owner: None + SYRD: + Buildable: + Owner: None + IRON: + Buildable: + Owner: None + PDOX: + Buildable: + Owner: None + TSLA: + Buildable: + Owner: None + AGUN: + Buildable: + Owner: None + FTUR: + Buildable: + Owner: None + SAM: + Buildable: + Owner: None + ATEK: + Buildable: + Owner: None + HPAD: + Buildable: + Owner: None + AFLD: + Buildable: + Owner: None + STEK: + Buildable: + Owner: None + 4TNK: + Buildable: + Owner: None + MCV: + Buildable: + Owner: None + APC: + Buildable: + Owner: None + MNLY.AP: + Buildable: + Owner: None + MNLY.AT: + Buildable: + Owner: None + TRUK: + Buildable: + Owner: None + TTNK: + Buildable: + Owner: None + FTRK: + Buildable: + Owner: None + CTNK: + Buildable: + Owner: None + +Sequences: + +Weapons: + +Voices: + +Notifications: