From 130300074e90144686f2b05a3fc1e3873e8bae22 Mon Sep 17 00:00:00 2001 From: "Grant H." Date: Sat, 1 Jun 2013 19:09:27 -0500 Subject: [PATCH 1/7] Added New Missions Added New Single-player Survival Map - Survival02 Added New 4 Player Co-op Survival Minigame - Fort LoneStar --- OpenRA.Mods.RA/Missions/FortScript.cs | 409 +++++++ OpenRA.Mods.RA/Missions/Survival02Script.cs | 417 +++++++ mods/ra/maps/Fort-Lonestar/map.bin | Bin 0 -> 46085 bytes mods/ra/maps/Fort-Lonestar/map.yaml | 1110 ++++++++++++++++++ mods/ra/maps/Survival02/map.bin | Bin 0 -> 32005 bytes mods/ra/maps/Survival02/map.yaml | 1134 +++++++++++++++++++ 6 files changed, 3070 insertions(+) create mode 100644 OpenRA.Mods.RA/Missions/FortScript.cs create mode 100644 OpenRA.Mods.RA/Missions/Survival02Script.cs create mode 100644 mods/ra/maps/Fort-Lonestar/map.bin create mode 100644 mods/ra/maps/Fort-Lonestar/map.yaml create mode 100644 mods/ra/maps/Survival02/map.bin create mode 100644 mods/ra/maps/Survival02/map.yaml diff --git a/OpenRA.Mods.RA/Missions/FortScript.cs b/OpenRA.Mods.RA/Missions/FortScript.cs new file mode 100644 index 0000000000..9ed070dff6 --- /dev/null +++ b/OpenRA.Mods.RA/Missions/FortScript.cs @@ -0,0 +1,409 @@ +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System; +using OpenRA.FileFormats; +using OpenRA.Mods.RA.Activities; +using OpenRA.Mods.RA.Air; +using OpenRA.Mods.RA.Move; +using OpenRA.Network; +using OpenRA.Scripting; +using OpenRA.Traits; +using OpenRA.Widgets; +using OpenRA.Mods.RA.Buildings; +using OpenRA.Mods.RA.Effects; + +namespace OpenRA.Mods.RA.Missions +{ + class FortScriptInfo : TraitInfo, Requires { } + + class FortScript : IWorldLoaded, ITick + { + Player multi0; + Player soviets; + + Actor entry1; + Actor entry2; + Actor entry3; + Actor entry4; + Actor entry5; + Actor entry6; + Actor entry7; + Actor entry8; + CPos[] sovietEntryPoints; + Actor paradrop1; + Actor paradrop2; + Actor paradrop3; + Actor paradrop4; + + Actor baseA; + Actor baseB; + + World world; + + int WaveNumber = 0; + InfoWidget evacuateWidget; + const string ShortEvacuateTemplate = "Wave {0}"; + static readonly string[] PatrolA = { "e1", "e2", "e1" }; + static readonly string[] Infantry = { "e4", "e1", "e1", "e2", "e1", "e2" }; + static readonly string[] InfantryAdvanced = { "e4", "e1", "e1", "shok", "e1", "e2", "e4" }; + static readonly string[] Vehicles = { "arty", "ftrk", "ftrk", "jeep", "jeep", "jeep", "apc", "apc", }; + static readonly string[] Volkov = { "e8" }; + const string boss = "4tnk"; + const int TimerTicks = 1; + const int PatrolTicks = 1500; + + int AttackSquad = 6; + int AttackSquadCount = 1; + int VehicleSquad = 2; + int VehicleSquadCount = 1; + + int patrolAttackFrame; + int patrolattackAtFrameIncrement; + int WaveAttackFrame; + int WaveAttackAtFrameIncrement; + int VehicleAttackFrame; + int VehicleAttackAtFrameIncrement; + + void MissionAccomplished(string text) + { + MissionUtils.CoopMissionAccomplished(world, text, multi0); + } + + void AttackNearestAlliedActor(Actor self) + { + var enemies = world.Actors.Where(u => u.IsInWorld && !u.IsDead() && (u.Owner == multi0) + && ((u.HasTrait() && !u.HasTrait()))); + var targetEnemy = enemies.OrderBy(u => (self.CenterLocation - u.CenterLocation).LengthSquared).FirstOrDefault(); + if (targetEnemy != null) + { + self.QueueActivity(new AttackMove.AttackMoveActivity(self, new Attack(Target.FromActor(targetEnemy), 6))); + } + } + + void SendVehicles() + { + if (SpawnVehicles == true) + { + for (int i = 1; i <= VehicleSquadCount; i++) + { + var enemies = world.Actors.Where(u => u.IsInWorld && !u.IsDead() && (u.Owner == soviets) + && !u.HasTrait()); + var route = world.SharedRandom.Next(sovietEntryPoints.Length); + var spawnPoint = sovietEntryPoints[route]; + for (int r = 1; r <= VehicleSquad; r++) + { + var squad = world.CreateActor(Vehicles.Random(world.SharedRandom), + new TypeDictionary { new LocationInit(spawnPoint), new OwnerInit(soviets) }); + squad.QueueActivity(new AttackMove.AttackMoveActivity(squad, new Move.Move(paradrop1.Location, 3))); + } + } + } + } + + void SendWave() + { + if (SpawnWave == true) + { + for (int i = 1; i <= AttackSquadCount; i++) + { + var enemies = world.Actors.Where(u => u.IsInWorld && !u.IsDead() && (u.Owner == soviets) + && !u.HasTrait()); + var route = world.SharedRandom.Next(sovietEntryPoints.Length); + var spawnPoint = sovietEntryPoints[route]; + IEnumerable units; + if (world.FrameNumber >= 1500 * 10) + { + units = InfantryAdvanced; + } + else + { + units = Infantry; + } + for (int r = 1; r < AttackSquad; r++) + { + var squad = world.CreateActor(Infantry.Random(world.SharedRandom), + new TypeDictionary { new LocationInit(spawnPoint), new OwnerInit(soviets) }); + squad.QueueActivity(new AttackMove.AttackMoveActivity(squad, new Move.Move(paradrop1.Location, 3))); + var scatteredUnits = world.FindAliveCombatantActorsInCircle(Util.CenterOfCell(paradrop1.Location), 15) + .Where(unit => unit.IsIdle && unit.HasTrait() && unit.Owner == soviets); + foreach (var unit in scatteredUnits) + { + AttackNearestAlliedActor(unit); + } + } + } + } + } + + void SendPatrol() + { + if (SpawnPatrol == true) + { + for (int i = 0; i < PatrolA.Length; i++) + { + var inf = world.CreateActor(PatrolA.Random(world.SharedRandom), + new TypeDictionary { new LocationInit(paradrop1.Location + new CVec(0, -10)), new OwnerInit(soviets) }); + inf.QueueActivity(new AttackMove.AttackMoveActivity(inf, new Move.Move(paradrop1.Location + new CVec(0, 0)))); + var units = world.FindAliveCombatantActorsInCircle(Util.CenterOfCell(paradrop1.Location), 20) + .Where(u => u.Owner == soviets); + foreach (var unit in units) + { + AttackNearestAlliedActor(unit); + } + } + for (int i = 0; i < PatrolA.Length; i++) + { + var inf = world.CreateActor(PatrolA.Random(world.SharedRandom), + new TypeDictionary { new LocationInit(paradrop4.Location + new CVec(10, 0)), new OwnerInit(soviets) }); + inf.QueueActivity(new AttackMove.AttackMoveActivity(inf, new Move.Move(paradrop4.Location + new CVec(0, 0)))); + var units = world.FindAliveCombatantActorsInCircle(Util.CenterOfCell(paradrop1.Location), 20) + .Where(u => u.Owner == soviets); + foreach (var unit in units) + { + AttackNearestAlliedActor(unit); + } + } + for (int i = 0; i < PatrolA.Length; i++) + { + var inf = world.CreateActor(PatrolA.Random(world.SharedRandom), + new TypeDictionary { new LocationInit(paradrop3.Location + new CVec(0, 10)), new OwnerInit(soviets) }); + inf.QueueActivity(new AttackMove.AttackMoveActivity(inf, new Move.Move(paradrop3.Location + new CVec(0, 0)))); + var units = world.FindAliveCombatantActorsInCircle(Util.CenterOfCell(paradrop1.Location), 20) + .Where(u => u.Owner == soviets); + foreach (var unit in units) + { + AttackNearestAlliedActor(unit); + } + } + for (int i = 0; i < PatrolA.Length; i++) + { + var inf = world.CreateActor(PatrolA.Random(world.SharedRandom), + new TypeDictionary { new LocationInit(paradrop2.Location + new CVec(-10, 0)), new OwnerInit(soviets) }); + inf.QueueActivity(new AttackMove.AttackMoveActivity(inf, new Move.Move(paradrop2.Location + new CVec(0, 0)))); + var units = world.FindAliveCombatantActorsInCircle(Util.CenterOfCell(paradrop1.Location), 20) + .Where(u => u.Owner == soviets); + foreach (var unit in units) + { + AttackNearestAlliedActor(unit); + } + } + } + } + + void SendVolkov() + { + for (int i = 0; i < Volkov.Length; i++) + { + var route = world.SharedRandom.Next(sovietEntryPoints.Length); + var spawnPoint = sovietEntryPoints[route]; + var actor = world.CreateActor(Volkov[i], new TypeDictionary { new OwnerInit(soviets), new LocationInit(spawnPoint) }); + actor.QueueActivity(new Move.Move(paradrop1.Location + new CVec(4, -11))); + var scatteredUnits = world.FindAliveCombatantActorsInCircle(Util.CenterOfCell(paradrop1.Location + new CVec(4, -11)), 4) + .Where(unit => unit.IsIdle && unit.HasTrait() && unit.Owner == soviets); + foreach (var unit in scatteredUnits) + { + AttackNearestAlliedActor(unit); + } + } + } + + void Wave(string text) + { + Game.AddChatLine(Color.Cyan, "Wave Sequence", text); + } + + void FinalWave(string text) + { + Game.AddChatLine(Color.DarkRed, "Boss Wave Sequence Initializing", text); + } + + public void Tick(Actor self) + { + var unitsAndBuildings = world.Actors.Where(a => !a.IsDead() && a.IsInWorld && (a.HasTrait() && a.HasTrait())); + if (!unitsAndBuildings.Any(a => a.Owner == soviets)) + { + MissionAccomplished("You and your mates have survived the onslaught!"); + } + if (world.FrameNumber == patrolAttackFrame) + { + patrolAttackFrame += patrolattackAtFrameIncrement; + patrolattackAtFrameIncrement = Math.Max(patrolattackAtFrameIncrement - 5, 100); + SendPatrol(); + } + if (world.FrameNumber == WaveAttackFrame) + { + WaveAttackFrame += WaveAttackAtFrameIncrement; + WaveAttackAtFrameIncrement = Math.Max(WaveAttackAtFrameIncrement - 5, 100); + SendWave(); + } + if (world.FrameNumber == VehicleAttackFrame) + { + VehicleAttackFrame += VehicleAttackAtFrameIncrement; + VehicleAttackAtFrameIncrement = Math.Max(VehicleAttackAtFrameIncrement - 5, 100); + SendVehicles(); + } + if (world.FrameNumber == TimerTicks) + { + evacuateWidget = new InfoWidget(""); + Ui.Root.AddChild(evacuateWidget); + WaveNumber++; + Wave("One Initializing"); + UpdateWaveSequence(); + } + if (world.FrameNumber == 1500 * 2) + { + WaveNumber++; + Wave("Two Initializing"); + SpawnPatrol = false; + AttackSquad = 7; + AttackSquadCount = 2; + UpdateWaveSequence(); + MissionUtils.Parabomb(world, soviets, entry1.Location, paradrop1.Location); + MissionUtils.Parabomb(world, soviets, entry1.Location, paradrop1.Location + new CVec(0, -2)); + } + if (world.FrameNumber == 1500 * 4) + { + WaveNumber++; + Wave("Three Initializing"); + UpdateWaveSequence(); + AttackSquad = 8; + } + if (world.FrameNumber == 1500 * 6) + { + WaveNumber++; + Wave("Four Initializing"); + UpdateWaveSequence(); + AttackSquad = 9; + MissionUtils.Parabomb(world, soviets, entry1.Location, paradrop1.Location); + MissionUtils.Parabomb(world, soviets, entry2.Location, paradrop3.Location); + AttackSquadCount = 3; + VehicleSquad = 3; + } + if (world.FrameNumber == 1500 * 8) + { + WaveNumber++; + Wave("Five Initializing"); + UpdateWaveSequence(); + AttackSquad = 10; + SendVolkov(); + VehicleSquad = 4; + VehicleSquadCount = 2; + } + if (world.FrameNumber == 1500 * 10) + { + WaveNumber++; + Wave("Six Initializing"); + UpdateWaveSequence(); + AttackSquad = 11; + AttackSquadCount = 4; + MissionUtils.Parabomb(world, soviets, entry1.Location, paradrop1.Location); + MissionUtils.Parabomb(world, soviets, entry4.Location, paradrop1.Location); + MissionUtils.Parabomb(world, soviets, entry6.Location, paradrop3.Location); + MissionUtils.Parabomb(world, soviets, entry5.Location, paradrop3.Location); + } + if (world.FrameNumber == 1500 * 12) + { + WaveNumber++; + Wave("Seven Initializing"); + UpdateWaveSequence(); + AttackSquad = 12; + VehicleSquad = 5; + VehicleSquadCount = 3; + SendVolkov(); + } + if (world.FrameNumber == 1500 * 14) + { + SpawnVehicles = true; + WaveNumber++; + Wave("Eight Initializing"); + UpdateWaveSequence(); + AttackSquad = 13; + AttackSquadCount = 5; + MissionUtils.Parabomb(world, soviets, entry1.Location, paradrop1.Location); + MissionUtils.Parabomb(world, soviets, entry4.Location, paradrop1.Location); + MissionUtils.Parabomb(world, soviets, entry6.Location, paradrop3.Location); + MissionUtils.Parabomb(world, soviets, entry5.Location, paradrop3.Location); + MissionUtils.Parabomb(world, soviets, entry2.Location, paradrop2.Location); + MissionUtils.Parabomb(world, soviets, entry3.Location, paradrop2.Location); + } + if (world.FrameNumber == 1500 * 16) + { + WaveNumber++; + Wave("Nine Initializing"); + UpdateWaveSequence(); + AttackSquad = 14; + VehicleSquad = 6; + VehicleSquadCount = 4; + SendVolkov(); + } + if (world.FrameNumber == 1500 * 18) + { + WaveNumber++; + Wave("Ten Initializing"); + UpdateWaveSequence(); + AttackSquad = 15; + AttackSquadCount = 6; + MissionUtils.Parabomb(world, soviets, entry1.Location, paradrop1.Location + new CVec(0, -2)); + MissionUtils.Parabomb(world, soviets, entry2.Location, paradrop3.Location + new CVec(0, -2)); + MissionUtils.Parabomb(world, soviets, entry4.Location, paradrop2.Location + new CVec(0, -2)); + MissionUtils.Parabomb(world, soviets, entry5.Location, paradrop4.Location + new CVec(0, -2)); + MissionUtils.Parabomb(world, soviets, entry2.Location, paradrop1.Location + new CVec(0, 2)); + MissionUtils.Parabomb(world, soviets, entry4.Location, paradrop3.Location + new CVec(0, 2)); + MissionUtils.Parabomb(world, soviets, entry3.Location, paradrop2.Location + new CVec(0, 2)); + MissionUtils.Parabomb(world, soviets, entry5.Location, paradrop4.Location + new CVec(0, 2)); + } + if (world.FrameNumber == 1500 * 19) + { + SpawnWave = false; + SpawnVehicles = false; + } + if (world.FrameNumber == 1500 * 20) + { + MissionAccomplished("You and your mates have Survived the Onslaught!"); + } + } + + void UpdateWaveSequence() + { + evacuateWidget.Text = ShortEvacuateTemplate.F(WaveNumber); + } + + bool SpawnPatrol = true; + + bool SpawnWave = true; + + bool SpawnVehicles = true; + + public void WorldLoaded(World w) + { + world = w; + soviets = w.Players.Single(p => p.InternalName == "Soviets"); + multi0 = w.Players.Single(p => p.InternalName == "Multi0"); + patrolAttackFrame = 750; + patrolattackAtFrameIncrement = 750; + WaveAttackFrame = 500; + WaveAttackAtFrameIncrement = 500; + VehicleAttackFrame = 2000; + VehicleAttackAtFrameIncrement = 2000; + var actors = w.WorldActor.Trait().Actors; + entry1 = actors["Entry1"]; + entry2 = actors["Entry2"]; + entry3 = actors["Entry3"]; + entry4 = actors["Entry4"]; + entry5 = actors["Entry5"]; + entry6 = actors["Entry6"]; + entry7 = actors["Entry7"]; + entry8 = actors["Entry8"]; + sovietEntryPoints = new[] { entry1, entry2, entry3, entry4, entry5, entry6, entry7, entry8 }.Select(p => p.Location).ToArray(); + paradrop1 = actors["Paradrop1"]; + paradrop2 = actors["Paradrop2"]; + paradrop3 = actors["Paradrop3"]; + paradrop4 = actors["Paradrop4"]; + baseA = actors["BaseA"]; + baseB = actors["BaseB"]; + MissionUtils.PlayMissionMusic(); + Game.AddChatLine(Color.Cyan, "Mission", "Defend Fort LoneStar At All costs!"); + } + } +} diff --git a/OpenRA.Mods.RA/Missions/Survival02Script.cs b/OpenRA.Mods.RA/Missions/Survival02Script.cs new file mode 100644 index 0000000000..d24c476353 --- /dev/null +++ b/OpenRA.Mods.RA/Missions/Survival02Script.cs @@ -0,0 +1,417 @@ +#region Copyright & License Information +/* + * Copyright 2007-2013 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.Collections.Generic; +using System.Linq; +using System; +using System.Drawing; +using OpenRA.FileFormats; +using OpenRA.Mods.RA.Activities; +using OpenRA.Mods.RA.Move; +using OpenRA.Traits; +using OpenRA.Widgets; +using OpenRA.Mods.RA.Buildings; +using OpenRA.Mods.RA.Air; +using OpenRA.Scripting; + +namespace OpenRA.Mods.RA.Missions +{ + class Survival02ScriptInfo : TraitInfo, Requires { } + + class Survival02Script : IHasObjectives, IWorldLoaded, ITick + { + public event Action OnObjectivesUpdated = notify => { }; + + public IEnumerable Objectives { get { return objectives.Values; } } + + Dictionary objectives = new Dictionary + { + { maintainPresenceID, new Objective(ObjectiveType.Primary, maintainPresence, ObjectiveStatus.InProgress) }, + { destroySovietsID, new Objective(ObjectiveType.Primary, destroySoviets, ObjectiveStatus.Inactive) }, + }; + const int destroySovietsID = 0; + const string destroySoviets = "Excellent work Commander! We have reinforced our position enough to initiate a counter-attack. Destroy the remaining Soviet forces in the area!"; + const int maintainPresenceID = 1; + const string maintainPresence = "Commander! The Soviets have rendered us useless... Reports indicate Soviet reinforcements are coming to finish us off... the situation looks bleak..."; + + Player allies; + Player soviets; + + Actor sovietEntry1; + Actor sovietEntry2; + Actor sovietEntry3; + CPos[] sovietentrypoints; + CPos[] newsovietentrypoints; + + Actor sovietrally; + Actor sovietrally1; + Actor sovietrally2; + Actor sovietrally3; + Actor sovietrally4; + Actor sovietrally5; + Actor sovietrally6; + Actor sovietrally7; + Actor sovietrally8; + CPos[] sovietrallypoints; + CPos[] newsovietrallypoints; + + Actor sovietparadrop1; + Actor sovietparadrop2; + Actor sovietparadrop3; + Actor sovietparadropEntry; + + Actor alliesbase; + Actor factory; + Actor barrack1; + + Actor boom1; + Actor boom2; + Actor boom3; + Actor drum1; + Actor drum2; + Actor drum3; + Actor FranceEntry; + Actor FranceRally; + Actor FranceparaEntry1; + Actor FranceparaEntry2; + Actor FranceparaEntry3; + + + World world; + + CountdownTimer survivalTimer; + CountdownTimerWidget survivalTimerWidget; + + const int timerTicks = 1500 * 10; + const int attackTicks = 1500 * 1; + const int sovietAttackGroupSize = 7; + const int SovietGroupSize = 4; + + const string Camera = "Camera"; + const string InfantryQueueName = "Infantry"; + const string Flare = "flare"; + + static readonly string[] FrenchSquad = { "2tnk", "2tnk", "mcv" }; + static readonly string[] SovietInfantry = { "e1", "e4", "e2" }; + static readonly string[] SovietVehicles = { "3tnk", "3tnk", "v2rl" }; + static readonly string[] SovietTanks = { "3tnk", "3tnk", "3tnk" }; + static readonly string[] squad = { "e1", "e1", "e2", "e4", "e4" }; + static readonly string[] platoon = { "e1", "e1", "e2", "e4", "e4", "e1", "e1", "e2", "e4", "e4" }; + + int ProduceAtFrame; + int ProduceAtFrameIncrement; + int attackAtFrame; + int attackAtFrameIncrement; + + void MissionAccomplished(string text) + { + MissionUtils.CoopMissionAccomplished(world, text, allies); + } + + void MissionFailed(string text) + { + MissionUtils.CoopMissionFailed(world, text, allies); + } + + void Message(string text) + { + Game.AddChatLine(Color.Aqua, "Incoming Report", text); + } + + void SetSovietUnitsToDefensiveStance() + { + foreach (var actor in world.Actors.Where(a => a.IsInWorld && a.Owner == soviets && !a.IsDead() && a.HasTrait())) + actor.Trait().stance = UnitStance.Defend; + } + + Actor FirstUnshroudedOrDefault(IEnumerable actors, World world, int shroudRange) + { + return actors.FirstOrDefault(u => world.FindAliveCombatantActorsInCircle(u.CenterLocation, shroudRange).All(a => !a.HasTrait())); + } + + void AttackNearestAlliedActor(Actor self) + { + var enemies = world.Actors.Where(u => u.AppearsHostileTo(self) && (u.Owner == allies) + && ((u.HasTrait() && !u.HasTrait()) || u.HasTrait()) && u.IsInWorld && !u.IsDead()); + + var enemy = FirstUnshroudedOrDefault(enemies.OrderBy(u => (self.CenterLocation - u.CenterLocation).LengthSquared), world, 20); + if (enemy != null) + self.QueueActivity(new AttackMove.AttackMoveActivity(self, new Attack(Target.FromActor(enemy), 3))); + } + + void SpawnAndAttack(string[] squad, Player owner, CPos location) + { + for (int i = 0; i < squad.Length; i++) + { + var actor = world.CreateActor(squad[i], new TypeDictionary { new OwnerInit(owner), new LocationInit(location) }); + AttackNearestAlliedActor(actor); + } + } + + void SpawnFlare(Player owner, Actor location) + { + world.CreateActor(Flare, new TypeDictionary { new OwnerInit(owner), new LocationInit(location.Location) }); + } + + void FinalAttack() + { + SpawnAndAttack(SovietTanks, soviets, sovietEntry1.Location); + SpawnAndAttack(SovietTanks, soviets, sovietEntry1.Location); + SpawnAndAttack(SovietTanks, soviets, sovietEntry2.Location); + SpawnAndAttack(platoon, soviets, sovietEntry1.Location); + SpawnAndAttack(platoon, soviets, sovietEntry2.Location); + } + + void FrenchReinforcements() + { + Game.MoveViewport(sovietrally1.Location.ToFloat2()); + MissionUtils.Parabomb(world, allies, FranceparaEntry1.Location, drum3.Location); + MissionUtils.Parabomb(world, allies, FranceparaEntry3.Location, drum2.Location); + MissionUtils.Parabomb(world, allies, FranceparaEntry2.Location, drum1.Location); + for (int i = 0; i < FrenchSquad.Length; i++) + { + var actor = world.CreateActor(FrenchSquad[i], new TypeDictionary { new OwnerInit(allies), new LocationInit(FranceEntry.Location) }); + actor.QueueActivity(new Move.Move(FranceRally.Location)); + } + } + + public void Tick(Actor self) + { + if (allies.WinState != WinState.Undefined) + return; + + survivalTimer.Tick(); + if (allies != null) + { + ManageSovietUnits(); + } + + var unitsAndBuildings = world.Actors.Where(a => !a.IsDead() && a.IsInWorld && (a.HasTrait() || (a.HasTrait() && !a.HasTrait()))); + if (!unitsAndBuildings.Any(a => a.Owner == soviets)) + { + objectives[destroySovietsID].Status = ObjectiveStatus.Completed; + MissionAccomplished("We have destroyed the remaining Soviet presence!"); + } + + if (world.FrameNumber == ProduceAtFrame) + { + ProduceAtFrame += ProduceAtFrameIncrement; + ProduceAtFrameIncrement = Math.Max(ProduceAtFrameIncrement - 5, 100); + InitializeSovietFactories(barrack1, sovietrally.Location); + BuildSovietUnits(factory, barrack1); + } + if (world.FrameNumber == attackAtFrame) + { + attackAtFrame += attackAtFrameIncrement; + attackAtFrameIncrement = Math.Max(attackAtFrameIncrement - 5, 100); + ManageSovietVehicles(); + if (producing) + { + BuildSovietVehicles(sovietentrypoints, sovietrallypoints); + } + else + BuildSovietVehicles(newsovietentrypoints, newsovietrallypoints); + } + if (world.FrameNumber == attackTicks) + { + SpawnAndAttack(squad, soviets, sovietrally5.Location); + SpawnAndAttack(squad, soviets, sovietrally6.Location); + } + if (world.FrameNumber == attackTicks * 3) + { + SpawnFlare(soviets, sovietparadrop3); + MissionUtils.Paradrop(world, soviets, squad, sovietparadropEntry.Location, sovietparadrop3.Location); + SpawnAndAttack(squad, soviets, sovietrally2.Location); + SpawnAndAttack(platoon, soviets, sovietrally5.Location); + SpawnAndAttack(platoon, soviets, sovietrally6.Location); + } + if (world.FrameNumber == attackTicks * 5) + { + SpawnFlare(soviets, sovietparadrop2); + MissionUtils.Paradrop(world, soviets, squad, sovietparadropEntry.Location, sovietparadrop2.Location); + } + if (world.FrameNumber == attackTicks * 7) + { + SpawnFlare(soviets, sovietparadrop1); + MissionUtils.Paradrop(world, soviets, squad, sovietparadropEntry.Location, sovietparadrop1.Location); + } + if (world.FrameNumber == attackTicks * 10) + { + SpawnFlare(soviets, sovietparadrop1); + MissionUtils.Paradrop(world, soviets, squad, sovietparadropEntry.Location, sovietparadrop1.Location); + ManageSovietUnits(); + } + if (world.FrameNumber == attackTicks * 12) + { + Sound.Play("reinfor1.aud"); + FrenchReinforcements(); + } + } + + void StartCountDownTimer() + { + Sound.Play("timergo1.aud"); + survivalTimer = new CountdownTimer(timerTicks, CountDownTimerExpired, true); + survivalTimerWidget = new CountdownTimerWidget(survivalTimer, "Time Until Soviet Reinforcements Arrive: {0}"); + Ui.Root.AddChild(survivalTimerWidget); + } + + void CountDownTimerExpired(CountdownTimer countDownTimer) + { + survivalTimerWidget.Visible = false; + Message("The Soviet reinforcements are approuching!"); + BuildSovietVehicles(newsovietentrypoints, newsovietrallypoints); + FinalAttack(); + producing = false; + objectives[maintainPresenceID].Status = ObjectiveStatus.Completed; + objectives[destroySovietsID].Status = ObjectiveStatus.InProgress; + OnObjectivesUpdated(true); + } + + void InitializeSovietFactories(Actor tent, CPos rally) + { + if (tent.IsInWorld && !tent.IsDead()) + { + var sbrp = tent.Trait(); + sbrp.rallyPoint = rally; + sbrp.nearEnough = 6; + } + } + + void BuildSovietUnit(string category, string unit) + { + var queueTent = MissionUtils.FindQueues(world, soviets, category).FirstOrDefault(q => q.CurrentItem() == null); + if (queueTent == null) return; + queueTent.ResolveOrder(queueTent.self, Order.StartProduction(queueTent.self, unit, 1)); + } + + void BuildSovietUnits(Actor factory, Actor tent) + { + if (barrack1.IsInWorld && !barrack1.IsDead()) + { + BuildSovietUnit(InfantryQueueName, SovietInfantry.Random(world.SharedRandom)); + } + } + + void ManageSovietUnits() + { + var units = world.FindAliveCombatantActorsInCircle(sovietrally.CenterLocation, 3) + .Where(u => u.IsIdle && u.HasTrait() && u.HasTrait() && u.Owner == soviets); + if (units.Count() >= sovietAttackGroupSize) + { + foreach (var unit in units) + { + var route = world.SharedRandom.Next(sovietrallypoints.Length); + unit.QueueActivity(new Move.Move(sovietrally3.Location)); + unit.QueueActivity(new Wait(300)); + unit.QueueActivity(new Move.Move(sovietrallypoints[route])); + AttackNearestAlliedActor(unit); + } + } + } + + void BuildSovietVehicles(CPos[] spawnpoints, CPos[] rallypoints) + { + var route = world.SharedRandom.Next(spawnpoints.Length); + var spawnPoint = spawnpoints[route]; + var rally = world.SharedRandom.Next(rallypoints.Length); + var rallyPoint = rallypoints[rally]; + var unit = world.CreateActor(SovietVehicles.Random(world.SharedRandom), + new TypeDictionary + { + new LocationInit(spawnPoint), + new OwnerInit(soviets) + }); + unit.QueueActivity(new AttackMove.AttackMoveActivity(unit, new Move.Move(rallyPoint, 3))); + } + + void ManageSovietVehicles() + { + foreach (var rallyPoint in sovietrallypoints) + { + var units = world.FindAliveCombatantActorsInCircle(Util.CenterOfCell(rallyPoint), 10) + .Where(u => u.IsIdle && u.HasTrait() && u.HasTrait() && u.Owner == soviets); + if (units.Count() >= SovietGroupSize) + { + foreach (var unit in units) + AttackNearestAlliedActor(unit); + } + } + + var scatteredUnits = world.Actors.Where(u => u.IsInWorld && !u.IsDead() && u.HasTrait() && u.IsIdle && u.Owner == soviets) + .Except(world.WorldActor.Trait().Actors.Values) + .Except(sovietrallypoints.SelectMany(rp => world.FindAliveCombatantActorsInCircle(Util.CenterOfCell(rp), 10))); + + foreach (var unit in scatteredUnits) + AttackNearestAlliedActor(unit); + } + + bool producing = true; + + public void WorldLoaded(World w) + { + world = w; + allies = w.Players.SingleOrDefault(p => p.InternalName == "Allies"); + if (allies != null) + { + ProduceAtFrame = 300; + ProduceAtFrameIncrement = 300; + attackAtFrame = 450; + attackAtFrameIncrement = 450; + } + soviets = w.Players.Single(p => p.InternalName == "Soviets"); + var actors = w.WorldActor.Trait().Actors; + sovietEntry1 = actors["SovietEntry1"]; + sovietEntry2 = actors["SovietEntry2"]; + sovietEntry3 = actors["SovietEntry3"]; + sovietentrypoints = new[] { sovietEntry1, sovietEntry2, sovietEntry3 }.Select(p => p.Location).ToArray(); + sovietrally = actors["SovietRally"]; + sovietrally1 = actors["SovietRally1"]; + sovietrally2 = actors["SovietRally2"]; + sovietrally3 = actors["SovietRally3"]; + sovietrally4 = actors["SovietRally4"]; + sovietrally5 = actors["SovietRally5"]; + sovietrally6 = actors["SovietRally6"]; + sovietrally7 = actors["SovietRally7"]; + sovietrally8 = actors["SovietRally8"]; + sovietrallypoints = new[] { sovietrally2, sovietrally4, sovietrally5, sovietrally6 }.Select(p => p.Location).ToArray(); + alliesbase = actors["AlliesBase"]; + sovietparadropEntry = actors["SovietParaDropEntry"]; + sovietparadrop1 = actors["SovietParaDrop1"]; + sovietparadrop2 = actors["SovietParaDrop2"]; + sovietparadrop3 = actors["SovietParaDrop3"]; + barrack1 = actors["barrack1"]; + factory = actors["Factory"]; + boom1 = actors["boom1"]; + boom2 = actors["boom2"]; + boom3 = actors["boom3"]; + drum1 = actors["drum1"]; + drum2 = actors["drum2"]; + drum3 = actors["drum3"]; + FranceEntry = actors["FranceEntry"]; + FranceRally = actors["FranceRally"]; + FranceparaEntry1 = actors["FranceparaEntry1"]; + FranceparaEntry2 = actors["FranceparaEntry2"]; + FranceparaEntry3 = actors["FranceparaEntry3"]; + newsovietentrypoints = new[] { sovietparadropEntry, sovietEntry3 }.Select(p => p.Location).ToArray(); + newsovietrallypoints = new[] { sovietrally3, sovietrally4, sovietrally8 }.Select(p => p.Location).ToArray(); + Game.MoveViewport(alliesbase.Location.ToFloat2()); + StartCountDownTimer(); + SetSovietUnitsToDefensiveStance(); + var Camera1 = world.CreateActor(Camera, new TypeDictionary + { + new OwnerInit(allies), + new LocationInit(sovietrally1.Location), + }); + //MissionUtils.PlayMissionMusic(); + } + } + +} diff --git a/mods/ra/maps/Fort-Lonestar/map.bin b/mods/ra/maps/Fort-Lonestar/map.bin new file mode 100644 index 0000000000000000000000000000000000000000..f3a2b6011f71315df4b64140ca5c7835ef5e3ac8 GIT binary patch literal 46085 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 Zfh3Rwl0Xtj0!bhVB!MK51pe;?{tI~FfLH(k literal 0 HcmV?d00001 diff --git a/mods/ra/maps/Fort-Lonestar/map.yaml b/mods/ra/maps/Fort-Lonestar/map.yaml new file mode 100644 index 0000000000..75e8ede1ef --- /dev/null +++ b/mods/ra/maps/Fort-Lonestar/map.yaml @@ -0,0 +1,1110 @@ +Selectable: True + +MapFormat: 5 + +Title: Fort Lonestar + +Description: Survive 11 Waves with 4 mates. + +Author: Nuke'm Bro. + +Tileset: TEMPERAT + +MapSize: 96,96 + +Bounds: 8,8,48,48 + +UseAsShellmap: False + +Type: Minigame + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Race: allies + PlayerReference@Multi0: + Name: Multi0 + Playable: True + AllowBots: False + LockTeam: True + Allies: Multi1,Multi2,Multi3 + Enemies: Soviets + PlayerReference@Multi1: + Name: Multi1 + Playable: True + AllowBots: False + LockTeam: True + Allies: Multi0,Multi2,Multi3 + Enemies: Soviets + PlayerReference@Multi2: + Name: Multi2 + Playable: True + AllowBots: False + LockTeam: True + Allies: Multi0,Multi1,Multi3 + Enemies: Soviets + PlayerReference@Multi3: + Name: Multi3 + Playable: True + AllowBots: False + LockTeam: True + Allies: Multi0,Multi1,Multi2 + Enemies: Soviets + PlayerReference@Soviets: + Name: Soviets + Race: soviet + ColorRamp: 0,255,128,10 + Enemies: Multi0,Multi1,Multi2,Multi3 + +Actors: + Actor76: t11 + Location: 47,27 + Owner: Neutral + Actor47: t12 + Location: 55,24 + Owner: Neutral + Actor25: tc03 + Location: 54,49 + Owner: Neutral + Actor14: tc04 + Location: 24,7 + Owner: Neutral + Actor10: tc04 + Location: 38,53 + Owner: Neutral + Actor0: t14 + Location: 32,16 + Owner: Neutral + Actor75: tc04 + Location: 45,25 + Owner: Neutral + Actor72: tc01 + Location: 49,16 + Owner: Neutral + Actor58: t10 + Location: 22,54 + Owner: Neutral + Actor26: tc01 + Location: 54,41 + Owner: Neutral + Actor37: tc01 + Location: 54,21 + Owner: Neutral + Actor60: tc05 + Location: 7,16 + Owner: Neutral + Actor69: t17 + Location: 23,8 + Owner: Neutral + Actor4: tc04 + Location: 29,45 + Owner: Neutral + Actor6: t17 + Location: 33,43 + Owner: Neutral + Actor16: tc04 + Location: 53,16 + Owner: Neutral + Actor21: tc03 + Location: 8,14 + Owner: Neutral + Actor8: t14 + Location: 49,37 + Owner: Neutral + Actor29: tc01 + Location: 8,42 + Owner: Neutral + Actor49: t15 + Location: 54,47 + Owner: Neutral + Actor62: tc05 + Location: 6,43 + Owner: Neutral + Actor73: tc05 + Location: 16,34 + Owner: Neutral + Actor30: barr + Location: 36,26 + Owner: Multi0 + Actor84: brik + Location: 35,25 + Owner: Neutral + Actor32: tc01 + Location: 8,24 + Owner: Neutral + Actor59: tc05 + Location: 7,39 + Owner: Neutral + Actor5: tc01 + Location: 44,44 + Owner: Neutral + Actor67: brik + Location: 29,25 + Owner: Neutral + Actor41: brik + Location: 25,25 + Owner: Neutral + Actor56: brik + Location: 26,25 + Owner: Neutral + Actor85: brik + Location: 39,26 + Owner: Neutral + Actor81: brik + Location: 38,25 + Owner: Neutral + Actor65: brik + Location: 27,25 + Owner: Neutral + Actor66: brik + Location: 28,25 + Owner: Neutral + Actor51: t08 + Location: 55,46 + Owner: Neutral + Actor57: t12 + Location: 19,54 + Owner: Neutral + Actor54: t11 + Location: 26,54 + Owner: Neutral + Actor33: tc01 + Location: 21,7 + Owner: Neutral + Actor27: tc01 + Location: 42,54 + Owner: Neutral + Actor23: tc03 + Location: 16,54 + Owner: Neutral + Actor15: tc04 + Location: 38,8 + Owner: Neutral + Actor19: tc03 + Location: 18,7 + Owner: Neutral + Actor17: tc03 + Location: 54,26 + Owner: Neutral + Actor83: brik + Location: 36,25 + Owner: Neutral + Actor197: brik + Location: 39,37 + Owner: Neutral + Actor11: tc04 + Location: 20,53 + Owner: Neutral + Actor9: tc04 + Location: 53,37 + Owner: Neutral + Actor7: tc02 + Location: 44,36 + Owner: Neutral + Actor3: t15 + Location: 19,25 + Owner: Neutral + Actor1: t05 + Location: 29,16 + Owner: Neutral + Actor82: brik + Location: 37,25 + Owner: Neutral + Actor86: brik + Location: 39,27 + Owner: Neutral + Actor80: brik + Location: 39,25 + Owner: Neutral + Actor71: tc02 + Location: 15,40 + Owner: Neutral + Actor64: t06 + Location: 18,16 + Owner: Neutral + Actor63: t14 + Location: 8,22 + Owner: Neutral + Actor53: t08 + Location: 41,55 + Owner: Neutral + Actor61: tc05 + Location: 54,39 + Owner: Neutral + Actor48: t01 + Location: 54,23 + Owner: Neutral + Actor50: t17 + Location: 54,44 + Owner: Neutral + Actor36: tc01 + Location: 42,8 + Owner: Neutral + Actor52: t12 + Location: 44,53 + Owner: Neutral + Actor87: brik + Location: 39,28 + Owner: Neutral + Actor91: brik + Location: 37,39 + Owner: Neutral + Actor196: brik + Location: 39,38 + Owner: Neutral + Actor195: brik + Location: 39,39 + Owner: Neutral + Actor45: brik + Location: 25,28 + Owner: Neutral + Actor92: brik + Location: 39,29 + Owner: Neutral + Actor194: brik + Location: 38,39 + Owner: Neutral + Actor55: brik + Location: 25,39 + Owner: Neutral + Actor200: brik + Location: 28,39 + Owner: Neutral + Actor233: brik + Location: 29,39 + Owner: Neutral + Actor240: brik + Location: 39,35 + Owner: Neutral + Actor199: brik + Location: 27,39 + Owner: Neutral + Actor78: mpspawn + Location: 36,28 + Owner: Neutral + Actor28: tc01 + Location: 24,54 + Owner: Neutral + Actor22: tc03 + Location: 7,46 + Owner: Neutral + Actor24: tc03 + Location: 45,54 + Owner: Neutral + Actor18: tc03 + Location: 45,8 + Owner: Neutral + Actor12: tc04 + Location: 7,37 + Owner: Neutral + Actor13: tc04 + Location: 8,19 + Owner: Neutral + Actor2: tc04 + Location: 14,23 + Owner: Neutral + Actor74: t06 + Location: 19,36 + Owner: Neutral + Actor46: t11 + Location: 54,19 + Owner: Neutral + Actor42: t16 + Location: 53,19 + Owner: Neutral + Actor70: t16 + Location: 20,45 + Owner: Neutral + Actor68: tc05 + Location: 35,7 + Owner: Neutral + Actor239: brik + Location: 39,36 + Owner: Neutral + Actor89: brik + Location: 35,39 + Owner: Neutral + Actor90: brik + Location: 36,39 + Owner: Neutral + Actor40: oilb + Location: 32,30 + Owner: Multi0 + Actor237: brik + Location: 25,35 + Owner: Neutral + Actor236: brik + Location: 25,36 + Owner: Neutral + Actor235: brik + Location: 25,37 + Owner: Neutral + Actor234: brik + Location: 25,38 + Owner: Neutral + Actor44: brik + Location: 25,27 + Owner: Neutral + Actor43: brik + Location: 25,26 + Owner: Neutral + Actor198: brik + Location: 26,39 + Owner: Neutral + Actor88: brik + Location: 25,29 + Owner: Neutral + Entry1: waypoint + Location: 8,8 + Owner: Neutral + Entry2: waypoint + Location: 31,8 + Owner: Neutral + Entry3: waypoint + Location: 55,8 + Owner: Neutral + Entry4: waypoint + Location: 55,32 + Owner: Neutral + Entry5: waypoint + Location: 55,55 + Owner: Neutral + Entry6: waypoint + Location: 32,55 + Owner: Neutral + Entry7: waypoint + Location: 8,55 + Owner: Neutral + Entry8: waypoint + Location: 8,32 + Owner: Neutral + Paradrop1: waypoint + Location: 32,28 + Owner: Neutral + Paradrop2: waypoint + Location: 27,32 + Owner: Neutral + Paradrop3: waypoint + Location: 32,36 + Owner: Neutral + Paradrop4: waypoint + Location: 36,32 + Owner: Neutral + Rally1: waypoint + Location: 25,17 + Owner: Neutral + Rally2: waypoint + Location: 38,17 + Owner: Neutral + Rally3: waypoint + Location: 16,31 + Owner: Neutral + Rally4: waypoint + Location: 24,47 + Owner: Neutral + Rally5: waypoint + Location: 37,47 + Owner: Neutral + Rally6: waypoint + Location: 47,32 + Owner: Neutral + Actor20: apwr + Location: 37,4 + Owner: Soviets + BaseA: waypoint + Location: 24,24 + Owner: Neutral + BaseB: waypoint + Location: 40,40 + Owner: Neutral + Actor34: sniper + Location: 9,26 + Owner: Soviets + Actor35: sniper + Location: 10,21 + Owner: Soviets + Actor38: sniper + Location: 26,9 + Owner: Soviets + Actor39: sniper + Location: 40,10 + Owner: Soviets + Actor77: sniper + Location: 53,21 + Owner: Soviets + Actor79: sniper + Location: 54,25 + Owner: Soviets + Actor93: sniper + Location: 53,40 + Owner: Soviets + Actor94: sniper + Location: 54,43 + Owner: Soviets + Actor95: sniper + Location: 54,46 + Owner: Soviets + Actor96: sniper + Location: 43,53 + Owner: Soviets + Actor97: sniper + Location: 8,36 + Owner: Soviets + Actor98: sniper + Location: 28,55 + Owner: Soviets + Actor100: barr + Location: 27,26 + Owner: Multi3 + Actor99: barr + Location: 27,36 + Owner: Multi2 + Actor31: barr + Location: 36,36 + Owner: Multi1 + Actor101: oilb + Location: 32,32 + Owner: Multi1 + Actor102: oilb + Location: 30,32 + Owner: Multi2 + Actor103: oilb + Location: 30,30 + Owner: Multi3 + Actor104: mpspawn + Location: 27,28 + Owner: Neutral + Actor105: mpspawn + Location: 27,38 + Owner: Neutral + Actor106: mpspawn + Location: 36,38 + Owner: Neutral + +Smudges: + +Rules: + World: + CrateDrop: + Maximum: 1 + SpawnInterval: 100 + -SpawnMPUnits: + -MPStartLocations: + FortScript: + CRATE: + -LevelUpCrateAction: + -GiveMcvCrateAction: + -RevealMapCrateAction: + -HideMapCrateAction: + -ExplodeCrateAction@nuke: + -ExplodeCrateAction@boom: + -ExplodeCrateAction@fire: + -GiveUnitCrateAction@jeep: + -GiveUnitCrateAction@arty: + -GiveUnitCrateAction@v2rl: + -GiveUnitCrateAction@1tnk: + -GiveUnitCrateAction@2tnk: + -GiveUnitCrateAction@3tnk: + -GiveUnitCrateAction@4tnk: + SupportPowerCrateAction@parabombs: + SelectionShares: 30 + HealUnitsCrateAction: + SelectionShares: 30 + GiveCashCrateAction: + Amount: 400 + UseCashTick: yes + SelectionShares: 30 + GiveUnitCrateAction@e7: + Unit: e7 + SelectionShares: 10 + Player: + PlayerResources: + InitialCash: 50 + ClassicProductionQueue@Infantry: + Type: Infantry + BuildSpeed: 1 + LowPowerSlowdown: 3 + ClassicProductionQueue@Defense: + Type: Defense + BuildSpeed: .4 + LowPowerSlowdown: 3 + OILB: + Health: + HP: 3000 + BARR: + Buildable: + Owner: allies,soviet + Building: + Power: 0 + Health: + HP: 1000 + Production: + Produces: Defense,Infantry + FTUR: + Building: + Power: 0 + Owner: soviet + Valued: + Cost: 400 + PBOX: + Building: + Power: 0 + Owner: allies + Prerequisites: barr,oilb + Valued: + Cost: 400 + Health: + HP: 200 + Armor: + Type: Heavy + TransformOnPassenger@MEDI: + PassengerTypes: MEDI + OnEnter: pbox.MEDI + OnExit: pbox + SkipMakeAnims: true + PBOX.E1: + Buildable: + Queue: Defense + Prerequisites: barr + Owner: allies + PBOX.MEDI: + Inherits: PBOX + Tooltip: + Name: Pillbox (Medic) + RenderBuilding: + Image: PBOX + RenderRangeCircle: + AutoTarget: + AttackTurreted: + PrimaryWeapon: Heal + PrimaryLocalOffset: 0,-11,0,0,0 + HBOX.E1: + Inherits: HBOX + Buildable: + Queue: Defense + BuildPaletteOrder: 20 + Prerequisites: barr + Owner: None + HBOX: + Building: + Owner: None + GUN: + Buildable: + Queue: Defense + Prerequisites: barr + Owner: None + SAM: + Buildable: + Owner: None + SBAG: + Buildable: + Owner: None + MSLO: + Buildable: + Owner: None + GAP: + Buildable: + Owner: None + IRON: + Buildable: + Owner: None + PDOX: + Buildable: + Owner: None + SPEN: + Buildable: + Owner: allies + DOME: + Buildable: + Owner: allies + PROC: + Buildable: + Owner: allies + SILO: + Buildable: + Owner: allies + AGUN: + Buildable: + Owner: None + TSLA: + Buildable: + Owner: None + APWR: + Buildable: + Owner: allies + STEK: + Buildable: + Owner: allies + FIX: + Buildable: + Owner: allies + POWR: + Buildable: + Owner: allies + MIG: + Buildable: + Owner: allies + Prerequisites: barr,afld + Valued: + Cost: 2000 + YAK: + Buildable: + Owner: allies + Prerequisites: barr,afld + Valued: + Cost: 150 + TRAN: + Buildable: + Owner: allies + Prerequisites: barr,hpad + Valued: + Cost: 150 + HIND: + Buildable: + Owner: allies + Prerequisites: barr,hpad + Valued: + Cost: 200 + HELI: + Buildable: + Owner: allies + Prerequisites: barr,hpad + Valued: + Cost: 200 + HPAD: + Building: + Power: 0 + Buildable: + Owner: allies + Prerequisites: barr + Valued: + Cost: 200 + FENC: + Buildable: + Queue: Building + Owner: None + Prerequisites: barr + Valued: + Cost: 10 + AFLD: + Building: + Power: 0 + Buildable: + Owner: allies + Prerequisites: barr + Valued: + Cost: 200 + DOG: + Buildable: + Owner: soviet,allies + Prerequisites: barr,oilb + Valued: + Cost: 20 + E1: + Buildable: + Owner: soviet,allies + Prerequisites: barr,oilb + Valued: + Cost: 20 + E2: + Buildable: + Owner: soviet,allies + Prerequisites: barr,oilb + Valued: + Cost: 40 + Explodes: + Weapon: UnitExplodeSmall + Chance: 20 + E3: + Buildable: + Owner: soviet,allies + Prerequisites: barr,oilb + Valued: + Cost: 60 + E4: + Buildable: + Owner: soviet,allies + Prerequisites: barr,oilb + Valued: + Cost: 100 + E6: + Buildable: + Owner: soviet,allies + Prerequisites: barr + Valued: + Cost: 100 + E7: + Buildable: + Owner: soviet,allies + Prerequisites: barr,oilb + Valued: + Cost: 750 + E8: + Inherits: ^Infantry + Buildable: + Queue: Infantry + BuildPaletteOrder: 110 + Prerequisites: stek + Owner: None + Valued: + Cost: 1800 + Tooltip: + Name: Volkov + Description: Elite commando infantry, armed with \nmodular cannons and grenade launcher.\n Strong vs Vehicles, Infantry\n Weak vs Aircraft + Selectable: + Voice: VolkovVoice + Bounds: 12,17,0,-9 + Health: + HP: 200 + Armor: + Type: Heavy + Mobile: + Speed: 5 + RevealsShroud: + Range: 7 + Passenger: + PipType: Red + AttackFrontal: + PrimaryWeapon: VolkNapalm + Explodes: + Weapon: UnitExplodeSmall + Chance: 100 + TakeCover: + -RenderInfantry: + RenderInfantryProne: + IdleAnimations: idle1 + -CrushableInfantry: + MECH: + Buildable: + Owner: None + MEDI: + Buildable: + Owner: soviet,allies + Prerequisites: barr,oilb + Valued: + Cost: 100 + SHOK: + Buildable: + Owner: soviet,allies + Prerequisites: barr,oilb + Valued: + Cost: 120 + SNIPER: + Buildable: + Owner: allies,soviet + Prerequisites: barr,oilb + Valued: + Cost: 150 + SPY: + Inherits: ^Infantry + Buildable: + Queue: Infantry + BuildPaletteOrder: 60 + Prerequisites: barr,oilb + Owner: allies, soviets + Valued: + Cost: 300 + SpyToolTip: + Name: Spy + Description: Infiltrates enemy structures to gather \nintelligence. Exact effect depends on the \nbuilding infiltrated.\n Strong vs Nothing\n Weak vs Everything\n Special Ability: Disguised + Selectable: + Voice: SpyVoice + Bounds: 12,17,0,-9 + Health: + HP: 25 + Mobile: + Speed: 4 + RevealsShroud: + Range: 5 + Passenger: + PipType: Yellow + TakeCover: + Spy: + -AutoTarget: + AttackMove: + JustMove: true + -RenderInfantry: + RenderSpy: + IdleAnimations: idle1,idle2 + AttackFrontal: + PrimaryWeapon: SilencedPPK + ARTY: + Inherits: ^Tank + Buildable: + Queue: Vehicle + BuildPaletteOrder: 80 + Prerequisites: dome + Owner: allies + Valued: + Cost: 600 + Tooltip: + Name: Artillery + Description: Long-range artillery.\n Strong vs Infantry, Buildings\n Weak vs Tanks, Aircraft + Health: + HP: 75 + Armor: + Type: Light + Mobile: + ROT: 2 + Speed: 6 + RevealsShroud: + Range: 7 + AttackFrontal: + PrimaryWeapon: 155mm + SecondaryWeapon: 155mm + RenderUnit: + Explodes: + Weapon: UnitExplode + Chance: 50 + AutoTarget: + 4TNK: + Inherits: ^Tank + Buildable: + Queue: Vehicle + BuildPaletteOrder: 100 + Prerequisites: fix,stek + Owner: soviet + Valued: + Cost: 1800 + Tooltip: + Name: Mammoth Tank + Description: Big and slow tank, with anti-air capability.\n Strong vs Tanks, Aircraft\n Weak vs Infantry + Health: + HP: 5000 + Armor: + Type: Heavy + Mobile: + Speed: 4 + Crushes: wall, atmine, crate, infantry + RevealsShroud: + Range: 14 + Turreted: + ROT: 1 + AttackTurreted: + PrimaryWeapon: 120mm + SecondaryWeapon: MammothTusk + PrimaryLocalOffset: -4,-5,0,0,0, 4,-5,0,0,0 + SecondaryLocalOffset: -7,2,0,0,25, 7,2,0,0,-25 + PrimaryRecoil: 8 + PrimaryRecoilRecovery: 0.7 + SecondaryRecoil: 2 + RenderUnitTurreted: + AutoTarget: + Explodes: + Weapon: napalm + EmptyWeapon: napalm + LeavesHusk: + HuskActor: 4TNK.Husk + SelfHealing: + Step: 2 + Ticks: 1 + HealIfBelow: 80% + DamageCooldown: 150 + Selectable: + Bounds: 44,38,0,-4 + BRIK: + Inherits: ^Wall + Buildable: + Queue: Defense + BuildPaletteOrder: 1000 + Prerequisites: fact + Owner: None + Hotkey: w + Valued: + Cost: 100 + Health: + HP: 250 + Armor: + Type: Concrete + BADR.bomber: + CarpetBomb: + Range: 3 + Weapon: ParaBomb + Inherits: ^Plane + Health: + HP: 60 + Armor: + Type: Light + Plane: + ROT: 5 + Speed: 30 + LimitedAmmo: + Ammo: 30 + RenderUnit: + Image: mig + WithShadow: + IronCurtainable: + -Selectable: + -GainsExperience: + Tooltip: + Name: Badger + Contrail@1: + ContrailOffset: 11, -11 + Contrail@2: + ContrailOffset: -11, -11 + FallsToEarth: + Spins: no + Moves: yes + Explosion: UnitExplode + SmokeTrailWhenDamaged@0: + Offset: 11, -11 + Interval: 2 + SmokeTrailWhenDamaged@1: + Offset: -11, -11 + Interval: 2 + -EjectOnDeath: + -GpsDot: + +Sequences: + +Weapons: + 120mm: + ROF: 150 + Range: 10 + Report: CANNON1 + Burst: 6 + Projectile: Bullet + Speed: 12 + High: true + Inaccuracy: 40 + Image: 120MM + ContrailLength: 50 + Warhead: + Spread: 6 + Versus: + None: 75% + Wood: 75% + Light: 75% + Concrete: 100% + Explosion: self_destruct + WaterExplosion: self_destruct + InfDeath: 4 + SmudgeType: Crater + Damage: 150 + MammothTusk: + ROF: 300 + Range: 10 + Report: MISSILE6 + Burst: 2 + ValidTargets: Ground, Air + Projectile: Missile + Speed: 15 + Arm: 2 + High: true + Shadow: false + Proximity: true + Trail: smokey + ContrailLength: 10 + Inaccuracy: 20 + Image: DRAGON + ROT: 10 + RangeLimit: 80 + Warhead: + Spread: 12 + Versus: + None: 90% + Wood: 150% + Light: 150% + Heavy: 150% + Concrete: 200% + Explosion: nuke + WaterExplosion: nuke + InfDeath: 3 + SmudgeType: Crater + Damage: 250 + VolkNapalm: + ROF: 40 + Range: 7 + Report: volknapalm + ValidTargets: Ground + Burst: 6 + BurstDelay: 1 + Projectile: Bullet + Speed: 25 + Image: 120MM + Inaccuracy: 60 + Trail: smokey + ContrailLength: 2 + Warhead: + Spread: 8 + Versus: + None: 90% + Wood: 170% + Light: 100% + Heavy: 100% + Concrete: 100% + Explosion: small_explosion + WaterExplosion: small_explosion + InfDeath: 4 + SmudgeType: Scorch + ImpactSound: firebl3 + Damage: 15 + ParaBomb: + ROF: 5 + Range: 5 + Report: CHUTE1 + Projectile: GravityBomb + Image: BOMBLET + Warhead: + Spread: 10 + Versus: + None: 125% + Wood: 100% + Light: 60% + Concrete: 25% + Explosion: napalm + ImpactSound: firebl3 + WaterExplosion: napalm + InfDeath: 5 + SmudgeType: Crater + Damage: 200 + 155mm: + ROF: 10 + Range: 7.5 + Burst: 20 + MinRange: 3 + -Report: + Projectile: Bullet + Speed: 10 + Trail: fb4 + Image: fb3 + High: true + Angle: .1 + Inaccuracy: 40 + ContrailLength: 2 + Warhead: + Spread: 10 + Versus: + None: 100% + Wood: 100% + Light: 60% + Heavy: 25% + Concrete: 35% + Explosion: small_napalm + WaterExplosion: small_napalm + InfDeath: 5 + SmudgeType: Scorch + ImpactSound: firebl3 + Damage: 6 + SilencedPPK: + ROF: 80 + Range: 2.5 + Report: silppk + Projectile: Bullet + Speed: 100 + Warhead: + Spread: 3 + Versus: + Wood: 0% + Light: 0% + Heavy: 50% + Concrete: 0% + Explosion: piffs + InfDeath: 2 + Damage: 150 + +Voices: + +Notifications: diff --git a/mods/ra/maps/Survival02/map.bin b/mods/ra/maps/Survival02/map.bin new file mode 100644 index 0000000000000000000000000000000000000000..13fdf929d5a7d1a50321276a5b4c3d3ce7005169 GIT binary patch literal 32005 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 Date: Sun, 2 Jun 2013 18:54:53 -0500 Subject: [PATCH 2/7] Fort LoneStar Fixes/Changes Added: -Game-play Balance changes -Greater Difficulty -Added Boss(es) --- OpenRA.Mods.RA/Missions/FortScript.cs | 191 +++++++----------- mods/ra/maps/Fort-Lonestar/map.yaml | 277 ++++++++++++++++++-------- 2 files changed, 268 insertions(+), 200 deletions(-) diff --git a/OpenRA.Mods.RA/Missions/FortScript.cs b/OpenRA.Mods.RA/Missions/FortScript.cs index 9ed070dff6..0e310707ee 100644 --- a/OpenRA.Mods.RA/Missions/FortScript.cs +++ b/OpenRA.Mods.RA/Missions/FortScript.cs @@ -35,23 +35,23 @@ namespace OpenRA.Mods.RA.Missions Actor paradrop2; Actor paradrop3; Actor paradrop4; - - Actor baseA; - Actor baseB; - + Actor patrol1; + Actor patrol2; + Actor patrol3; + Actor patrol4; World world; int WaveNumber = 0; InfoWidget evacuateWidget; const string ShortEvacuateTemplate = "Wave {0}"; - static readonly string[] PatrolA = { "e1", "e2", "e1" }; + static readonly string[] Patrol = { "e1", "e2", "e1" }; static readonly string[] Infantry = { "e4", "e1", "e1", "e2", "e1", "e2" }; - static readonly string[] InfantryAdvanced = { "e4", "e1", "e1", "shok", "e1", "e2", "e4" }; - static readonly string[] Vehicles = { "arty", "ftrk", "ftrk", "jeep", "jeep", "jeep", "apc", "apc", }; - static readonly string[] Volkov = { "e8" }; + static readonly string[] Vehicles = { "arty", "ftrk", "ftrk", "apc", "apc", }; + const string tank = "3tnk"; + const string v2 = "v2rl"; const string boss = "4tnk"; + const int TimerTicks = 1; - const int PatrolTicks = 1500; int AttackSquad = 6; int AttackSquadCount = 1; @@ -87,14 +87,16 @@ namespace OpenRA.Mods.RA.Missions { for (int i = 1; i <= VehicleSquadCount; i++) { - var enemies = world.Actors.Where(u => u.IsInWorld && !u.IsDead() && (u.Owner == soviets) - && !u.HasTrait()); var route = world.SharedRandom.Next(sovietEntryPoints.Length); var spawnPoint = sovietEntryPoints[route]; for (int r = 1; r <= VehicleSquad; r++) { var squad = world.CreateActor(Vehicles.Random(world.SharedRandom), - new TypeDictionary { new LocationInit(spawnPoint), new OwnerInit(soviets) }); + new TypeDictionary + { + new LocationInit(spawnPoint), + new OwnerInit(soviets) + }); squad.QueueActivity(new AttackMove.AttackMoveActivity(squad, new Move.Move(paradrop1.Location, 3))); } } @@ -107,23 +109,18 @@ namespace OpenRA.Mods.RA.Missions { for (int i = 1; i <= AttackSquadCount; i++) { - var enemies = world.Actors.Where(u => u.IsInWorld && !u.IsDead() && (u.Owner == soviets) + world.Actors.Where(u => u.IsInWorld && !u.IsDead() && (u.Owner == soviets) && !u.HasTrait()); var route = world.SharedRandom.Next(sovietEntryPoints.Length); var spawnPoint = sovietEntryPoints[route]; - IEnumerable units; - if (world.FrameNumber >= 1500 * 10) - { - units = InfantryAdvanced; - } - else - { - units = Infantry; - } for (int r = 1; r < AttackSquad; r++) { var squad = world.CreateActor(Infantry.Random(world.SharedRandom), - new TypeDictionary { new LocationInit(spawnPoint), new OwnerInit(soviets) }); + new TypeDictionary + { + new LocationInit(spawnPoint), + new OwnerInit(soviets) + }); squad.QueueActivity(new AttackMove.AttackMoveActivity(squad, new Move.Move(paradrop1.Location, 3))); var scatteredUnits = world.FindAliveCombatantActorsInCircle(Util.CenterOfCell(paradrop1.Location), 15) .Where(unit => unit.IsIdle && unit.HasTrait() && unit.Owner == soviets); @@ -136,75 +133,35 @@ namespace OpenRA.Mods.RA.Missions } } - void SendPatrol() + void SendPatrol(string[] squad, Player owner, CPos location, CPos move) { - if (SpawnPatrol == true) + if (SpawnPatrol) { - for (int i = 0; i < PatrolA.Length; i++) + for (int i = 0; i < squad.Length; i++) { - var inf = world.CreateActor(PatrolA.Random(world.SharedRandom), - new TypeDictionary { new LocationInit(paradrop1.Location + new CVec(0, -10)), new OwnerInit(soviets) }); - inf.QueueActivity(new AttackMove.AttackMoveActivity(inf, new Move.Move(paradrop1.Location + new CVec(0, 0)))); - var units = world.FindAliveCombatantActorsInCircle(Util.CenterOfCell(paradrop1.Location), 20) - .Where(u => u.Owner == soviets); - foreach (var unit in units) - { - AttackNearestAlliedActor(unit); - } - } - for (int i = 0; i < PatrolA.Length; i++) - { - var inf = world.CreateActor(PatrolA.Random(world.SharedRandom), - new TypeDictionary { new LocationInit(paradrop4.Location + new CVec(10, 0)), new OwnerInit(soviets) }); - inf.QueueActivity(new AttackMove.AttackMoveActivity(inf, new Move.Move(paradrop4.Location + new CVec(0, 0)))); - var units = world.FindAliveCombatantActorsInCircle(Util.CenterOfCell(paradrop1.Location), 20) - .Where(u => u.Owner == soviets); - foreach (var unit in units) - { - AttackNearestAlliedActor(unit); - } - } - for (int i = 0; i < PatrolA.Length; i++) - { - var inf = world.CreateActor(PatrolA.Random(world.SharedRandom), - new TypeDictionary { new LocationInit(paradrop3.Location + new CVec(0, 10)), new OwnerInit(soviets) }); - inf.QueueActivity(new AttackMove.AttackMoveActivity(inf, new Move.Move(paradrop3.Location + new CVec(0, 0)))); - var units = world.FindAliveCombatantActorsInCircle(Util.CenterOfCell(paradrop1.Location), 20) - .Where(u => u.Owner == soviets); - foreach (var unit in units) - { - AttackNearestAlliedActor(unit); - } - } - for (int i = 0; i < PatrolA.Length; i++) - { - var inf = world.CreateActor(PatrolA.Random(world.SharedRandom), - new TypeDictionary { new LocationInit(paradrop2.Location + new CVec(-10, 0)), new OwnerInit(soviets) }); - inf.QueueActivity(new AttackMove.AttackMoveActivity(inf, new Move.Move(paradrop2.Location + new CVec(0, 0)))); - var units = world.FindAliveCombatantActorsInCircle(Util.CenterOfCell(paradrop1.Location), 20) - .Where(u => u.Owner == soviets); - foreach (var unit in units) - { - AttackNearestAlliedActor(unit); - } + var actor = world.CreateActor(squad[i], new TypeDictionary + { + new OwnerInit(owner), + new LocationInit(location) + }); + actor.QueueActivity(new AttackMove.AttackMoveActivity(actor, new Move.Move(move, 3))); + AttackNearestAlliedActor(actor); } } } - void SendVolkov() + void SendBoss(string unit) { - for (int i = 0; i < Volkov.Length; i++) + var route = world.SharedRandom.Next(sovietEntryPoints.Length); + var spawnPoint = sovietEntryPoints[route]; + var actor = world.CreateActor(unit, new TypeDictionary + { + new OwnerInit(soviets), + new LocationInit(spawnPoint) + }); + if (multi0 != null) { - var route = world.SharedRandom.Next(sovietEntryPoints.Length); - var spawnPoint = sovietEntryPoints[route]; - var actor = world.CreateActor(Volkov[i], new TypeDictionary { new OwnerInit(soviets), new LocationInit(spawnPoint) }); - actor.QueueActivity(new Move.Move(paradrop1.Location + new CVec(4, -11))); - var scatteredUnits = world.FindAliveCombatantActorsInCircle(Util.CenterOfCell(paradrop1.Location + new CVec(4, -11)), 4) - .Where(unit => unit.IsIdle && unit.HasTrait() && unit.Owner == soviets); - foreach (var unit in scatteredUnits) - { - AttackNearestAlliedActor(unit); - } + AttackNearestAlliedActor(actor); } } @@ -213,23 +170,16 @@ namespace OpenRA.Mods.RA.Missions Game.AddChatLine(Color.Cyan, "Wave Sequence", text); } - void FinalWave(string text) - { - Game.AddChatLine(Color.DarkRed, "Boss Wave Sequence Initializing", text); - } - public void Tick(Actor self) { - var unitsAndBuildings = world.Actors.Where(a => !a.IsDead() && a.IsInWorld && (a.HasTrait() && a.HasTrait())); - if (!unitsAndBuildings.Any(a => a.Owner == soviets)) - { - MissionAccomplished("You and your mates have survived the onslaught!"); - } if (world.FrameNumber == patrolAttackFrame) { patrolAttackFrame += patrolattackAtFrameIncrement; patrolattackAtFrameIncrement = Math.Max(patrolattackAtFrameIncrement - 5, 100); - SendPatrol(); + SendPatrol(Patrol, soviets, patrol1.Location, paradrop1.Location); + SendPatrol(Patrol, soviets, patrol2.Location, paradrop2.Location); + SendPatrol(Patrol, soviets, patrol3.Location, paradrop3.Location); + SendPatrol(Patrol, soviets, patrol4.Location, paradrop4.Location); } if (world.FrameNumber == WaveAttackFrame) { @@ -286,11 +236,11 @@ namespace OpenRA.Mods.RA.Missions Wave("Five Initializing"); UpdateWaveSequence(); AttackSquad = 10; - SendVolkov(); VehicleSquad = 4; VehicleSquadCount = 2; + SendBoss(tank); } - if (world.FrameNumber == 1500 * 10) + if (world.FrameNumber == 1500 * 11) { WaveNumber++; Wave("Six Initializing"); @@ -301,8 +251,10 @@ namespace OpenRA.Mods.RA.Missions MissionUtils.Parabomb(world, soviets, entry4.Location, paradrop1.Location); MissionUtils.Parabomb(world, soviets, entry6.Location, paradrop3.Location); MissionUtils.Parabomb(world, soviets, entry5.Location, paradrop3.Location); + SendBoss(tank); + SendBoss(tank); } - if (world.FrameNumber == 1500 * 12) + if (world.FrameNumber == 1500 * 14) { WaveNumber++; Wave("Seven Initializing"); @@ -310,9 +262,9 @@ namespace OpenRA.Mods.RA.Missions AttackSquad = 12; VehicleSquad = 5; VehicleSquadCount = 3; - SendVolkov(); + SendBoss(v2); } - if (world.FrameNumber == 1500 * 14) + if (world.FrameNumber == 1500 * 17) { SpawnVehicles = true; WaveNumber++; @@ -326,8 +278,11 @@ namespace OpenRA.Mods.RA.Missions MissionUtils.Parabomb(world, soviets, entry5.Location, paradrop3.Location); MissionUtils.Parabomb(world, soviets, entry2.Location, paradrop2.Location); MissionUtils.Parabomb(world, soviets, entry3.Location, paradrop2.Location); + SendBoss(v2); + SendBoss(tank); + SendBoss(v2); } - if (world.FrameNumber == 1500 * 16) + if (world.FrameNumber == 1500 * 21) { WaveNumber++; Wave("Nine Initializing"); @@ -335,30 +290,36 @@ namespace OpenRA.Mods.RA.Missions AttackSquad = 14; VehicleSquad = 6; VehicleSquadCount = 4; - SendVolkov(); + SendBoss(v2); + SendBoss(tank); + SendBoss(tank); } - if (world.FrameNumber == 1500 * 18) + if (world.FrameNumber == 1500 * 25) { WaveNumber++; Wave("Ten Initializing"); UpdateWaveSequence(); AttackSquad = 15; AttackSquadCount = 6; - MissionUtils.Parabomb(world, soviets, entry1.Location, paradrop1.Location + new CVec(0, -2)); - MissionUtils.Parabomb(world, soviets, entry2.Location, paradrop3.Location + new CVec(0, -2)); - MissionUtils.Parabomb(world, soviets, entry4.Location, paradrop2.Location + new CVec(0, -2)); - MissionUtils.Parabomb(world, soviets, entry5.Location, paradrop4.Location + new CVec(0, -2)); - MissionUtils.Parabomb(world, soviets, entry2.Location, paradrop1.Location + new CVec(0, 2)); - MissionUtils.Parabomb(world, soviets, entry4.Location, paradrop3.Location + new CVec(0, 2)); - MissionUtils.Parabomb(world, soviets, entry3.Location, paradrop2.Location + new CVec(0, 2)); - MissionUtils.Parabomb(world, soviets, entry5.Location, paradrop4.Location + new CVec(0, 2)); + for (int i = 0; i < 2; i++) + { + MissionUtils.Parabomb(world, soviets, entry1.Location, paradrop1.Location + new CVec(0, -2)); + MissionUtils.Parabomb(world, soviets, entry2.Location, paradrop3.Location + new CVec(0, -2)); + MissionUtils.Parabomb(world, soviets, entry4.Location, paradrop2.Location + new CVec(0, -2)); + MissionUtils.Parabomb(world, soviets, entry5.Location, paradrop4.Location + new CVec(0, -2)); + MissionUtils.Parabomb(world, soviets, entry2.Location, paradrop1.Location + new CVec(0, 2)); + MissionUtils.Parabomb(world, soviets, entry4.Location, paradrop3.Location + new CVec(0, 2)); + MissionUtils.Parabomb(world, soviets, entry3.Location, paradrop2.Location + new CVec(0, 2)); + MissionUtils.Parabomb(world, soviets, entry5.Location, paradrop4.Location + new CVec(0, 2)); + } + SendBoss(boss); } - if (world.FrameNumber == 1500 * 19) + if (world.FrameNumber == 1500 * 30) { SpawnWave = false; SpawnVehicles = false; } - if (world.FrameNumber == 1500 * 20) + if (world.FrameNumber == 1500 * 31) { MissionAccomplished("You and your mates have Survived the Onslaught!"); } @@ -400,8 +361,10 @@ namespace OpenRA.Mods.RA.Missions paradrop2 = actors["Paradrop2"]; paradrop3 = actors["Paradrop3"]; paradrop4 = actors["Paradrop4"]; - baseA = actors["BaseA"]; - baseB = actors["BaseB"]; + patrol1 = actors["Patrol1"]; + patrol2 = actors["Patrol2"]; + patrol3 = actors["Patrol3"]; + patrol4 = actors["Patrol4"]; MissionUtils.PlayMissionMusic(); Game.AddChatLine(Color.Cyan, "Mission", "Defend Fort LoneStar At All costs!"); } diff --git a/mods/ra/maps/Fort-Lonestar/map.yaml b/mods/ra/maps/Fort-Lonestar/map.yaml index 75e8ede1ef..f6fac8e0e6 100644 --- a/mods/ra/maps/Fort-Lonestar/map.yaml +++ b/mods/ra/maps/Fort-Lonestar/map.yaml @@ -55,7 +55,7 @@ Players: PlayerReference@Soviets: Name: Soviets Race: soviet - ColorRamp: 0,255,128,10 + ColorRamp: 0,255,128 Enemies: Multi0,Multi1,Multi2,Multi3 Actors: @@ -392,32 +392,20 @@ Actors: Paradrop4: waypoint Location: 36,32 Owner: Neutral - Rally1: waypoint - Location: 25,17 + Patrol3: waypoint + Location: 32,46 Owner: Neutral - Rally2: waypoint - Location: 38,17 - Owner: Neutral - Rally3: waypoint - Location: 16,31 - Owner: Neutral - Rally4: waypoint - Location: 24,47 - Owner: Neutral - Rally5: waypoint - Location: 37,47 - Owner: Neutral - Rally6: waypoint - Location: 47,32 + Patrol4: waypoint + Location: 46,32 Owner: Neutral Actor20: apwr Location: 37,4 Owner: Soviets - BaseA: waypoint - Location: 24,24 + Patrol2: waypoint + Location: 17,32 Owner: Neutral - BaseB: waypoint - Location: 40,40 + Patrol1: waypoint + Location: 32,18 Owner: Neutral Actor34: sniper Location: 9,26 @@ -741,41 +729,45 @@ Rules: Prerequisites: barr,oilb Valued: Cost: 750 - E8: - Inherits: ^Infantry + 3TNK: + Inherits: ^Tank Buildable: - Queue: Infantry - BuildPaletteOrder: 110 - Prerequisites: stek - Owner: None + Queue: Vehicle + BuildPaletteOrder: 40 + Prerequisites: fix + Owner: soviet + Hotkey: h Valued: - Cost: 1800 - Tooltip: - Name: Volkov - Description: Elite commando infantry, armed with \nmodular cannons and grenade launcher.\n Strong vs Vehicles, Infantry\n Weak vs Aircraft - Selectable: - Voice: VolkovVoice - Bounds: 12,17,0,-9 + Cost: 1150 + Health: - HP: 200 + HP: 700 Armor: Type: Heavy Mobile: Speed: 5 + Crushes: wall, atmine, crate, infantry RevealsShroud: Range: 7 - Passenger: - PipType: Red - AttackFrontal: - PrimaryWeapon: VolkNapalm + Turreted: + ROT: 5 + Armament: + Weapon: VolkNapalm + Recoil: 200 + RecoilRecovery: 38 + LocalOffset: 0,85,0, 0,-85,0 + AttackTurreted: + RenderUnit: + WithTurret: + AutoTarget: Explodes: Weapon: UnitExplodeSmall + EmptyWeapon: UnitExplodeSmall Chance: 100 - TakeCover: - -RenderInfantry: - RenderInfantryProne: - IdleAnimations: idle1 - -CrushableInfantry: + LeavesHusk: + HuskActor: 3TNK.Husk + Selectable: + Bounds: 30,30 MECH: Buildable: Owner: None @@ -789,14 +781,32 @@ Rules: Buildable: Owner: soviet,allies Prerequisites: barr,oilb - Valued: - Cost: 120 - SNIPER: - Buildable: - Owner: allies,soviet - Prerequisites: barr,oilb Valued: Cost: 150 + SNIPER: + Inherits: ^Infantry + Valued: + Cost: 300 + Buildable: + Queue: Infantry + BuildPaletteOrder: 80 + Owner: soviet + Prerequisites: barr,oilb + Hotkey: n + Selectable: + Bounds: 12,17,0,-6 + Mobile: + Speed: 4 + Health: + HP: 200 + Passenger: + PipType: Red + RevealsShroud: + Range: 6 + AutoTarget: + InitialStance: HoldFire + Armament: + Weapon: Sniper SPY: Inherits: ^Infantry Buildable: @@ -806,9 +816,6 @@ Rules: Owner: allies, soviets Valued: Cost: 300 - SpyToolTip: - Name: Spy - Description: Infiltrates enemy structures to gather \nintelligence. Exact effect depends on the \nbuilding infiltrated.\n Strong vs Nothing\n Weak vs Everything\n Special Ability: Disguised Selectable: Voice: SpyVoice Bounds: 12,17,0,-9 @@ -830,6 +837,56 @@ Rules: IdleAnimations: idle1,idle2 AttackFrontal: PrimaryWeapon: SilencedPPK + FTRK: + Inherits: ^Vehicle + Valued: + Cost: 600 + Health: + HP: 150 + Armor: + Type: Light + Mobile: + ROT: 10 + Speed: 9 + RevealsShroud: + Range: 4 + Turreted: + ROT: 5 + Offset: -298,0,298 + Armament: + Weapon: FLAK-23 + Recoil: 85 + AttackTurreted: + RenderUnit: + WithTurret: + AutoTarget: + Explodes: + Weapon: UnitExplodeSmall + EmptyWeapon: UnitExplodeSmall + Selectable: + Bounds: 28,28,0,0 + APC: + Inherits: ^Tank + Health: + HP: 400 + Armor: + Type: Heavy + Mobile: + Speed: 10 + RevealsShroud: + Range: 5 + Armament: + Weapon: M60mg + LocalOffset: 0,0,171 + AttackFrontal: + RenderUnit: + WithMuzzleFlash: + AutoTarget: + Cargo: + Types: Infantry + MaxWeight: 5 + PipCount: 5 + UnloadFacing: 220 ARTY: Inherits: ^Tank Buildable: @@ -859,25 +916,35 @@ Rules: Weapon: UnitExplode Chance: 50 AutoTarget: + V2RL: + Inherits: ^Vehicle + Valued: + Cost: 700 + Health: + HP: 150 + Armor: + Type: Light + Mobile: + Speed: 7 + RevealsShroud: + Range: 5 + Armament: + Weapon: SCUD + AttackFrontal: + RenderUnitReload: + AutoTarget: + Explodes: + Weapon: SCUD + EmptyWeapon: 4TNK: Inherits: ^Tank Buildable: - Queue: Vehicle - BuildPaletteOrder: 100 - Prerequisites: fix,stek - Owner: soviet - Valued: - Cost: 1800 - Tooltip: - Name: Mammoth Tank - Description: Big and slow tank, with anti-air capability.\n Strong vs Tanks, Aircraft\n Weak vs Infantry Health: - HP: 5000 + HP: 2500 Armor: Type: Heavy Mobile: Speed: 4 - Crushes: wall, atmine, crate, infantry RevealsShroud: Range: 14 Turreted: @@ -890,7 +957,8 @@ Rules: PrimaryRecoil: 8 PrimaryRecoilRecovery: 0.7 SecondaryRecoil: 2 - RenderUnitTurreted: + RenderUnit: + WithTurret: AutoTarget: Explodes: Weapon: napalm @@ -900,7 +968,7 @@ Rules: SelfHealing: Step: 2 Ticks: 1 - HealIfBelow: 80% + HealIfBelow: 40% DamageCooldown: 150 Selectable: Bounds: 44,38,0,-4 @@ -940,20 +1008,10 @@ Rules: -GainsExperience: Tooltip: Name: Badger - Contrail@1: - ContrailOffset: 11, -11 - Contrail@2: - ContrailOffset: -11, -11 FallsToEarth: Spins: no Moves: yes Explosion: UnitExplode - SmokeTrailWhenDamaged@0: - Offset: 11, -11 - Interval: 2 - SmokeTrailWhenDamaged@1: - Offset: -11, -11 - Interval: 2 -EjectOnDeath: -GpsDot: @@ -996,18 +1054,18 @@ Weapons: Shadow: false Proximity: true Trail: smokey - ContrailLength: 10 + ContrailLength: 150 Inaccuracy: 20 Image: DRAGON ROT: 10 RangeLimit: 80 Warhead: - Spread: 12 + Spread: 15 Versus: - None: 90% - Wood: 150% - Light: 150% - Heavy: 150% + None: 125% + Wood: 110% + Light: 110% + Heavy: 100% Concrete: 200% Explosion: nuke WaterExplosion: nuke @@ -1016,7 +1074,7 @@ Weapons: Damage: 250 VolkNapalm: ROF: 40 - Range: 7 + Range: 8 Report: volknapalm ValidTargets: Ground Burst: 6 @@ -1077,17 +1135,64 @@ Weapons: Warhead: Spread: 10 Versus: - None: 100% + None: 80% Wood: 100% Light: 60% - Heavy: 25% + Heavy: 75% Concrete: 35% Explosion: small_napalm WaterExplosion: small_napalm InfDeath: 5 SmudgeType: Scorch ImpactSound: firebl3 - Damage: 6 + Damage: 10 + FLAK-23: + ROF: 10 + Range: 8 + Report: AACANON3 + ValidTargets: Air,Ground + Projectile: Bullet + Speed: 100 + High: true + Warhead: + Spread: 5 + Versus: + None: 35% + Wood: 30% + Light: 30% + Heavy: 40% + Concrete: 30% + Explosion: med_explosion + Damage: 25 + SCUD: + ROF: 280 + Range: 10 + MinRange: 3 + Report: MISSILE1 + Projectile: Bullet + Speed: 10 + Arm: 10 + High: true + Shadow: false + Proximity: true + Trail: smokey + Inaccuracy: 10 + Image: V2 + Angle: .1 + Warhead: + Spread: 20 + Versus: + None: 100% + Wood: 90% + Light: 80% + Heavy: 70% + Explosion: nuke + WaterExplosion: large_splash + InfDeath: 3 + SmudgeType: Crater + Damage: 500 + ImpactSound: kaboom1 + WaterImpactSound: kaboom1 SilencedPPK: ROF: 80 Range: 2.5 From 9ed7d05ca7788ba70c5af7c65c7a1ae49aea2a78 Mon Sep 17 00:00:00 2001 From: "Grant H." Date: Sun, 2 Jun 2013 20:23:12 -0500 Subject: [PATCH 3/7] Added Sahara Map Added Sahara 4v4 map Good balanced ore and symmetrical --- mods/ra/maps/Sahara.oramap | Bin 0 -> 10294 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 mods/ra/maps/Sahara.oramap diff --git a/mods/ra/maps/Sahara.oramap b/mods/ra/maps/Sahara.oramap new file mode 100644 index 0000000000000000000000000000000000000000..5df4863d97b1971a27784b69e01d5ef43d6a50ee GIT binary patch literal 10294 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 z Date: Wed, 5 Jun 2013 01:57:08 -0500 Subject: [PATCH 4/7] Finished Fort LoneStar Finished Fort LoneStar + Added 2 new Desert maps: -Great Sahara -Suffrage --- OpenRA.Mods.RA/Missions/FortScript.cs | 10 ++++++- mods/ra/maps/Fort-Lonestar/map.yaml | 37 +++++++++++++++----------- mods/ra/maps/suffrage.oramap | Bin 0 -> 7437 bytes 3 files changed, 31 insertions(+), 16 deletions(-) create mode 100644 mods/ra/maps/suffrage.oramap diff --git a/OpenRA.Mods.RA/Missions/FortScript.cs b/OpenRA.Mods.RA/Missions/FortScript.cs index 0e310707ee..763135170d 100644 --- a/OpenRA.Mods.RA/Missions/FortScript.cs +++ b/OpenRA.Mods.RA/Missions/FortScript.cs @@ -20,6 +20,9 @@ namespace OpenRA.Mods.RA.Missions class FortScript : IWorldLoaded, ITick { Player multi0; + Player multi1; + Player multi2; + Player multi3; Player soviets; Actor entry1; @@ -46,7 +49,7 @@ namespace OpenRA.Mods.RA.Missions const string ShortEvacuateTemplate = "Wave {0}"; static readonly string[] Patrol = { "e1", "e2", "e1" }; static readonly string[] Infantry = { "e4", "e1", "e1", "e2", "e1", "e2" }; - static readonly string[] Vehicles = { "arty", "ftrk", "ftrk", "apc", "apc", }; + static readonly string[] Vehicles = { "arty", "ftrk", "ftrk", "apc", "apc" }; const string tank = "3tnk"; const string v2 = "v2rl"; const string boss = "4tnk"; @@ -172,6 +175,8 @@ namespace OpenRA.Mods.RA.Missions public void Tick(Actor self) { + if (multi0.WinState != WinState.Undefined) return; + if (world.FrameNumber == patrolAttackFrame) { patrolAttackFrame += patrolattackAtFrameIncrement; @@ -341,6 +346,9 @@ namespace OpenRA.Mods.RA.Missions world = w; soviets = w.Players.Single(p => p.InternalName == "Soviets"); multi0 = w.Players.Single(p => p.InternalName == "Multi0"); + multi1 = w.Players.SingleOrDefault(p => p.InternalName == "Multi1"); + multi2 = w.Players.SingleOrDefault(p => p.InternalName == "Multi2"); + multi3 = w.Players.SingleOrDefault(p => p.InternalName == "Multi3"); patrolAttackFrame = 750; patrolattackAtFrameIncrement = 750; WaveAttackFrame = 500; diff --git a/mods/ra/maps/Fort-Lonestar/map.yaml b/mods/ra/maps/Fort-Lonestar/map.yaml index f6fac8e0e6..2db891079e 100644 --- a/mods/ra/maps/Fort-Lonestar/map.yaml +++ b/mods/ra/maps/Fort-Lonestar/map.yaml @@ -314,9 +314,6 @@ Actors: Actor42: t16 Location: 53,19 Owner: Neutral - Actor70: t16 - Location: 20,45 - Owner: Neutral Actor68: tc05 Location: 35,7 Owner: Neutral @@ -521,6 +518,18 @@ Rules: OILB: Health: HP: 3000 + Armor: + Type: Wood + Bib: + RevealsShroud: + Range: 3 + Capturable: + CapturableBar: + EngineerRepairable: + -MustBeDestroyed: + CashTrickler: + Period: 250 + Amount: 50 BARR: Buildable: Owner: allies,soviet @@ -530,6 +539,7 @@ Rules: HP: 1000 Production: Produces: Defense,Infantry + -Sellable: FTUR: Building: Power: 0 @@ -739,7 +749,6 @@ Rules: Hotkey: h Valued: Cost: 1150 - Health: HP: 700 Armor: @@ -767,7 +776,7 @@ Rules: LeavesHusk: HuskActor: 3TNK.Husk Selectable: - Bounds: 30,30 + Bounds: 30,30 MECH: Buildable: Owner: None @@ -786,11 +795,11 @@ Rules: SNIPER: Inherits: ^Infantry Valued: - Cost: 300 + Cost: 200 Buildable: Queue: Infantry BuildPaletteOrder: 80 - Owner: soviet + Owner: soviet, allies Prerequisites: barr,oilb Hotkey: n Selectable: @@ -813,7 +822,7 @@ Rules: Queue: Infantry BuildPaletteOrder: 60 Prerequisites: barr,oilb - Owner: allies, soviets + Owner: allies, soviet Valued: Cost: 300 Selectable: @@ -843,7 +852,7 @@ Rules: Cost: 600 Health: HP: 150 - Armor: + Armor: Type: Light Mobile: ROT: 10 @@ -918,10 +927,8 @@ Rules: AutoTarget: V2RL: Inherits: ^Vehicle - Valued: - Cost: 700 Health: - HP: 150 + HP: 100 Armor: Type: Light Mobile: @@ -1156,7 +1163,7 @@ Weapons: High: true Warhead: Spread: 5 - Versus: + Versus: None: 35% Wood: 30% Light: 30% @@ -1166,7 +1173,7 @@ Weapons: Damage: 25 SCUD: ROF: 280 - Range: 10 + Range: 7 MinRange: 3 Report: MISSILE1 Projectile: Bullet @@ -1181,7 +1188,7 @@ Weapons: Angle: .1 Warhead: Spread: 20 - Versus: + Versus: None: 100% Wood: 90% Light: 80% diff --git a/mods/ra/maps/suffrage.oramap b/mods/ra/maps/suffrage.oramap new file mode 100644 index 0000000000000000000000000000000000000000..6f91932925f4398b2a02c84b7c4728401426b3ba GIT binary patch literal 7437 zcmZ{pWl$W~!}5Fog_4({#{WFWX~zTK_5 zcW>2p|2Wm%b)J@bt4>wFYKn+RL~w9$XmFJ{{gSKjbbHsNaB#@JaB!%9XC2I(+0AVn ze}7brr_fG{6JXew92htoA9Dm5ef91}KnE1J5D?Hc)Tldo4ErMt1Fd5WPSr8dzcrHB zfO&uxt8&V^7MK7~Rr?>B73Xdfb;7^EQy$tSXXRO&bC zcV;iUcw&4eqj#0Gq6JZ!ppCKZ%t2xHm&Ukcnalf6ZOMbe^1Qd4 znGNCbty@L6>XaHREz2s|7HU4(GTH-Og6{8Co-Q&b%1lPG2N~i?3^M{d37;vZeI=jd z6NEm}FbzV})T?OY61Eqm-KhMncd7-V^d-cps=3u+NSVoeFVr(hTf?+#czX_|@?cZI z%x|>@sa~8lQRQCO?UUW=N!-jF!9kBSiN&&I&b7a%iGIy78T7|3O|6QTA}dh9SMW=# zkCk+tit{Uv;pbVk+0mC#Jd80|@nDE{M+5X+9v9VoAb)+r>m;1;3Ll^l;_^RHEaVvW zmATe`u)y>@`F?VLU?$b+OYRVsIay6$gxx#A2}V63%WuWWq9|%3J&WGt787Ei4Q=Zg zJea*yL3D^};Mdc~`W0bkQTV-tFV08Du~BLq=b3fg-Gsnj{)K0IlJPO+Q1gokp)W

)84^>`#z-h2|b>Z*%b*n#V|VXIqk5i@1Qp` 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 literal 0 HcmV?d00001 From 980c44bf62d03ca44868f2b9d3fb5cb815607ef7 Mon Sep 17 00:00:00 2001 From: "Grant H." Date: Wed, 5 Jun 2013 02:13:41 -0500 Subject: [PATCH 5/7] Added Sahara Sahara 4v4 desert map. --- mods/ra/maps/Sahara.oramap | Bin 10294 -> 10296 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/mods/ra/maps/Sahara.oramap b/mods/ra/maps/Sahara.oramap index 5df4863d97b1971a27784b69e01d5ef43d6a50ee..c84223e755b42837fc53617f62be57ba52568212 100644 GIT binary patch delta 1272 zcmVo=3T zZT+gc8TS72;_~9P+r8+At(#VrjL$dC6sKPf-c8loeRhM3!_R;GxEY$=)b!nHQhXED zdK#L|)c&Y$yxTswb)&zlwr=+@B9Hge=YCjKSNkvi{qj5to;_bbzrH!z zux@?^RjY_qapXzA@9xG`#Rwxd{>8y}qklZEKl`=~607QkYe#?h#vi-DKJB}&dp}Nb z~GYqtrcYum<;1(DbLc53RsG}1tLK78~~2I9yw|Ivl%_2h=B={~*dnrY0H zu3dN6Z{zdx&ToTg@OSWjw&yKkH%P7Q*jrJ61*U3j{Pbdl+z(nTNo>}KjyuRGk;tLhs&toB#^ z#-)aBG~vho=7--M??li@sEm+AEfXvf{9nS>h~TSgs!dKHtHi1r`pp-eF$}55XqU`9 zAx10{D%gLusk3l#V(Vo@M-h<|2DoA(QP0e>%Y+RC&r%|Z(IAO+idSZsB^G6##UWz$gsR^!380X+k~EN zE))f!v`rWdw-%AMiCIbwV#?b@5CWwmkH?1m&?I0WBrP2R7$u4VC=|nXH}2f`F0(M4 zY$V|L0%sJ_25@poFL20CvA`)qGzz6!;AnqMr~sV)&CTLTk)39VQ-sxkvrBdc4&*`A zfonSdFBD>e7@C-wW0nGll^`8jEns+JW~+=M>qH5n;nas9nV?x$*Bn4OK)hV!7!u_)VMvy%2tvH*6PNg0Pm7Si zP+f#Le(kVj2)`An@*4y`qVpo87R9`Dxv>puKQcYONb-LCJ_ z{rkQ-4PW(B^RbBXYzhD%000000096P0E{dK47_2^0TEKZ2E1X; i0TEKZ2E1X;0Z>Z?1^@s600IC40FM9w0Fx&G0002Zcts%q delta 1264 zcmVd)M*ooS-2PRTT^^>Ve%RzUhfn^OUH*FLUxl4pKYC)hy53&j-W`dz z%|AqDHM2U)UiXLYVcg`Lac09`mc1YS<+y$FZA%+(^0%%XN#nccJ)z$8-RFZJr!4!c zbL`6zq@yn z>!yDn-nyD#u5BAXp6>td&`wS9WBd7@ZiC=YPQJLf@{f*QZYMWPP51GA*GywXa_hQ> zen+?0o!=21nK*dAN3>-`Tb_rON3{Grv?8Jv=b@Dmtvr7Zt%_*Xd1!S+tItDgB3kpm z)6UO-(0-TuFFoML?sK)Xx%%dX&x@EBIWKBnG<&fwyR4`F*sqQk#U}s4L-qdA*KY2y zm0@D;QGWQTX&uGOAg-6EDn{Cn|$c&Pi6_=cz+etQA_Pv zC6Tx$b?Sd&=^Vjqf#gltUPj^-RKE)1MXZfQ;+Dk4()Ef}21crwy|dKEGK*td2KS%n zUqN}E@Q*S~D~L!0m{&}c5bzS>C-#GRYytocc;CCSml- z>eO_>nS#kw+N9~0X_&9PI4w6xhC?g(v7DD?OTB+$1rG%+mN~0RreMUm2mlq^umX^$ zRUtW(Fhw{8@7@jfv1cW8Q&pu96_YSQDw{%>6@-ug0rQqCUIq|m3Y`9g%B$UK{5ADH%|2LB->#{@e0_2qe#}*QIX3P+XXSyWt6;>?XXD; zO00j{#;#J(a7nJJ^@+*Q07=29MI3JIBFTdR%knOmg2g98dGqA~EaXZ9k)gar)YHl} zi^G{Mc-(Ptj!T`I3aI~=*y=NL6v3(&I*4@0VV=r^<)~PD`v3cbQ)9^tb|#nOd3Sq zE3tYN0BOcyt|<%DBM@}CrexSPosVWkg8^j%K*m^TjOGc1q2>qyBBhgIC00r%5T#w| zr&=Wt)PW7G0j<+!D2y-(gyL(_NSz}z{3+P=bZUN}K?@^HkwTa?M43WVYY3h~*foEI zNFc)ehY_hcC>$vmq0$^0e|BkrfXQx5I)W=4Am%F^Ht~fZnSw2{N{vC3Bv`2`HEK}+ zR}dVS0Z*<X aY*0%D1^@s600IC40BZmM0JSFo0002idsl4$ From eb159afb64f2c090be84304c7fa70ac42a22e2f3 Mon Sep 17 00:00:00 2001 From: "Grant H." Date: Sat, 8 Jun 2013 18:39:59 -0500 Subject: [PATCH 6/7] Fixed Survival02 Few Changes --- OpenRA.Mods.RA/Missions/Survival02Script.cs | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/OpenRA.Mods.RA/Missions/Survival02Script.cs b/OpenRA.Mods.RA/Missions/Survival02Script.cs index d24c476353..9036003048 100644 --- a/OpenRA.Mods.RA/Missions/Survival02Script.cs +++ b/OpenRA.Mods.RA/Missions/Survival02Script.cs @@ -57,7 +57,6 @@ namespace OpenRA.Mods.RA.Missions Actor sovietrally4; Actor sovietrally5; Actor sovietrally6; - Actor sovietrally7; Actor sovietrally8; CPos[] sovietrallypoints; CPos[] newsovietrallypoints; @@ -71,9 +70,6 @@ namespace OpenRA.Mods.RA.Missions Actor factory; Actor barrack1; - Actor boom1; - Actor boom2; - Actor boom3; Actor drum1; Actor drum2; Actor drum3; @@ -379,7 +375,6 @@ namespace OpenRA.Mods.RA.Missions sovietrally4 = actors["SovietRally4"]; sovietrally5 = actors["SovietRally5"]; sovietrally6 = actors["SovietRally6"]; - sovietrally7 = actors["SovietRally7"]; sovietrally8 = actors["SovietRally8"]; sovietrallypoints = new[] { sovietrally2, sovietrally4, sovietrally5, sovietrally6 }.Select(p => p.Location).ToArray(); alliesbase = actors["AlliesBase"]; @@ -389,9 +384,6 @@ namespace OpenRA.Mods.RA.Missions sovietparadrop3 = actors["SovietParaDrop3"]; barrack1 = actors["barrack1"]; factory = actors["Factory"]; - boom1 = actors["boom1"]; - boom2 = actors["boom2"]; - boom3 = actors["boom3"]; drum1 = actors["drum1"]; drum2 = actors["drum2"]; drum3 = actors["drum3"]; @@ -405,12 +397,12 @@ namespace OpenRA.Mods.RA.Missions Game.MoveViewport(alliesbase.Location.ToFloat2()); StartCountDownTimer(); SetSovietUnitsToDefensiveStance(); - var Camera1 = world.CreateActor(Camera, new TypeDictionary + world.CreateActor(Camera, new TypeDictionary { new OwnerInit(allies), new LocationInit(sovietrally1.Location), }); - //MissionUtils.PlayMissionMusic(); + MissionUtils.PlayMissionMusic(); } } From 54439f8af8eecd202ac35573987663ff50580594 Mon Sep 17 00:00:00 2001 From: "Grant H." Date: Sat, 8 Jun 2013 18:46:32 -0500 Subject: [PATCH 7/7] Mission changes Mission changes --- OpenRA.Mods.RA/Missions/FortScript.cs | 6 ------ 1 file changed, 6 deletions(-) diff --git a/OpenRA.Mods.RA/Missions/FortScript.cs b/OpenRA.Mods.RA/Missions/FortScript.cs index 763135170d..ae34207f98 100644 --- a/OpenRA.Mods.RA/Missions/FortScript.cs +++ b/OpenRA.Mods.RA/Missions/FortScript.cs @@ -20,9 +20,6 @@ namespace OpenRA.Mods.RA.Missions class FortScript : IWorldLoaded, ITick { Player multi0; - Player multi1; - Player multi2; - Player multi3; Player soviets; Actor entry1; @@ -346,9 +343,6 @@ namespace OpenRA.Mods.RA.Missions world = w; soviets = w.Players.Single(p => p.InternalName == "Soviets"); multi0 = w.Players.Single(p => p.InternalName == "Multi0"); - multi1 = w.Players.SingleOrDefault(p => p.InternalName == "Multi1"); - multi2 = w.Players.SingleOrDefault(p => p.InternalName == "Multi2"); - multi3 = w.Players.SingleOrDefault(p => p.InternalName == "Multi3"); patrolAttackFrame = 750; patrolattackAtFrameIncrement = 750; WaveAttackFrame = 500;