From 0cdff00cb6f2d2eaf5b9b1cfe06f4826bed3f3ac Mon Sep 17 00:00:00 2001 From: Scott_NZ Date: Fri, 2 Nov 2012 20:38:53 +1300 Subject: [PATCH] First version of Allies 03 --- OpenRA.Mods.RA/Missions/Allies01Script.cs | 11 +- OpenRA.Mods.RA/Missions/Allies02Script.cs | 1 - OpenRA.Mods.RA/Missions/Allies03Script.cs | 275 +++++ OpenRA.Mods.RA/Missions/CountdownTimer.cs | 27 - OpenRA.Mods.RA/Missions/MissionUtils.cs | 9 +- OpenRA.Mods.RA/Missions/MissionWidgets.cs | 62 ++ OpenRA.Mods.RA/OpenRA.Mods.RA.csproj | 4 +- mods/ra/maps/allies-03/map.bin | Bin 0 -> 92165 bytes mods/ra/maps/allies-03/map.yaml | 1197 +++++++++++++++++++++ 9 files changed, 1546 insertions(+), 40 deletions(-) create mode 100644 OpenRA.Mods.RA/Missions/Allies03Script.cs create mode 100644 OpenRA.Mods.RA/Missions/MissionWidgets.cs create mode 100644 mods/ra/maps/allies-03/map.bin create mode 100644 mods/ra/maps/allies-03/map.yaml 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 0000000000000000000000000000000000000000..9cccf540f7fefafb2e706d2eebf525f373eb59fa GIT binary patch literal 92165 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 literal 0 HcmV?d00001 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: