diff --git a/OpenRA.Mods.RA/Missions/FortScript.cs b/OpenRA.Mods.RA/Missions/FortScript.cs new file mode 100644 index 0000000000..ae34207f98 --- /dev/null +++ b/OpenRA.Mods.RA/Missions/FortScript.cs @@ -0,0 +1,374 @@ +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 patrol1; + Actor patrol2; + Actor patrol3; + Actor patrol4; + World world; + + int WaveNumber = 0; + InfoWidget evacuateWidget; + 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" }; + const string tank = "3tnk"; + const string v2 = "v2rl"; + const string boss = "4tnk"; + + const int TimerTicks = 1; + + 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 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++) + { + 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 < 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(string[] squad, Player owner, CPos location, CPos move) + { + if (SpawnPatrol) + { + for (int i = 0; i < squad.Length; i++) + { + 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 SendBoss(string unit) + { + 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) + { + AttackNearestAlliedActor(actor); + } + } + + void Wave(string text) + { + Game.AddChatLine(Color.Cyan, "Wave Sequence", text); + } + + public void Tick(Actor self) + { + if (multi0.WinState != WinState.Undefined) return; + + if (world.FrameNumber == patrolAttackFrame) + { + patrolAttackFrame += patrolattackAtFrameIncrement; + patrolattackAtFrameIncrement = Math.Max(patrolattackAtFrameIncrement - 5, 100); + 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) + { + 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; + VehicleSquad = 4; + VehicleSquadCount = 2; + SendBoss(tank); + } + if (world.FrameNumber == 1500 * 11) + { + 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); + SendBoss(tank); + SendBoss(tank); + } + if (world.FrameNumber == 1500 * 14) + { + WaveNumber++; + Wave("Seven Initializing"); + UpdateWaveSequence(); + AttackSquad = 12; + VehicleSquad = 5; + VehicleSquadCount = 3; + SendBoss(v2); + } + if (world.FrameNumber == 1500 * 17) + { + 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); + SendBoss(v2); + SendBoss(tank); + SendBoss(v2); + } + if (world.FrameNumber == 1500 * 21) + { + WaveNumber++; + Wave("Nine Initializing"); + UpdateWaveSequence(); + AttackSquad = 14; + VehicleSquad = 6; + VehicleSquadCount = 4; + SendBoss(v2); + SendBoss(tank); + SendBoss(tank); + } + if (world.FrameNumber == 1500 * 25) + { + WaveNumber++; + Wave("Ten Initializing"); + UpdateWaveSequence(); + AttackSquad = 15; + AttackSquadCount = 6; + 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 * 30) + { + SpawnWave = false; + SpawnVehicles = false; + } + if (world.FrameNumber == 1500 * 31) + { + 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"]; + 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/OpenRA.Mods.RA/Missions/Survival02Script.cs b/OpenRA.Mods.RA/Missions/Survival02Script.cs new file mode 100644 index 0000000000..9036003048 --- /dev/null +++ b/OpenRA.Mods.RA/Missions/Survival02Script.cs @@ -0,0 +1,409 @@ +#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 sovietrally8; + CPos[] sovietrallypoints; + CPos[] newsovietrallypoints; + + Actor sovietparadrop1; + Actor sovietparadrop2; + Actor sovietparadrop3; + Actor sovietparadropEntry; + + Actor alliesbase; + Actor factory; + Actor barrack1; + + 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"]; + 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"]; + 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(); + 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 0000000000..f3a2b6011f Binary files /dev/null and b/mods/ra/maps/Fort-Lonestar/map.bin differ diff --git a/mods/ra/maps/Fort-Lonestar/map.yaml b/mods/ra/maps/Fort-Lonestar/map.yaml new file mode 100644 index 0000000000..2db891079e --- /dev/null +++ b/mods/ra/maps/Fort-Lonestar/map.yaml @@ -0,0 +1,1222 @@ +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 + 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 + 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 + Patrol3: waypoint + Location: 32,46 + Owner: Neutral + Patrol4: waypoint + Location: 46,32 + Owner: Neutral + Actor20: apwr + Location: 37,4 + Owner: Soviets + Patrol2: waypoint + Location: 17,32 + Owner: Neutral + Patrol1: waypoint + Location: 32,18 + 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 + Armor: + Type: Wood + Bib: + RevealsShroud: + Range: 3 + Capturable: + CapturableBar: + EngineerRepairable: + -MustBeDestroyed: + CashTrickler: + Period: 250 + Amount: 50 + BARR: + Buildable: + Owner: allies,soviet + Building: + Power: 0 + Health: + HP: 1000 + Production: + Produces: Defense,Infantry + -Sellable: + 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 + 3TNK: + Inherits: ^Tank + Buildable: + Queue: Vehicle + BuildPaletteOrder: 40 + Prerequisites: fix + Owner: soviet + Hotkey: h + Valued: + Cost: 1150 + Health: + HP: 700 + Armor: + Type: Heavy + Mobile: + Speed: 5 + Crushes: wall, atmine, crate, infantry + RevealsShroud: + Range: 7 + 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 + LeavesHusk: + HuskActor: 3TNK.Husk + Selectable: + Bounds: 30,30 + 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: 150 + SNIPER: + Inherits: ^Infantry + Valued: + Cost: 200 + Buildable: + Queue: Infantry + BuildPaletteOrder: 80 + Owner: soviet, allies + 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: + Queue: Infantry + BuildPaletteOrder: 60 + Prerequisites: barr,oilb + Owner: allies, soviet + Valued: + Cost: 300 + 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 + 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: + 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: + V2RL: + Inherits: ^Vehicle + Health: + HP: 100 + Armor: + Type: Light + Mobile: + Speed: 7 + RevealsShroud: + Range: 5 + Armament: + Weapon: SCUD + AttackFrontal: + RenderUnitReload: + AutoTarget: + Explodes: + Weapon: SCUD + EmptyWeapon: + 4TNK: + Inherits: ^Tank + Buildable: + Health: + HP: 2500 + Armor: + Type: Heavy + Mobile: + Speed: 4 + 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 + RenderUnit: + WithTurret: + AutoTarget: + Explodes: + Weapon: napalm + EmptyWeapon: napalm + LeavesHusk: + HuskActor: 4TNK.Husk + SelfHealing: + Step: 2 + Ticks: 1 + HealIfBelow: 40% + 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 + FallsToEarth: + Spins: no + Moves: yes + Explosion: UnitExplode + -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: 150 + Inaccuracy: 20 + Image: DRAGON + ROT: 10 + RangeLimit: 80 + Warhead: + Spread: 15 + Versus: + None: 125% + Wood: 110% + Light: 110% + Heavy: 100% + Concrete: 200% + Explosion: nuke + WaterExplosion: nuke + InfDeath: 3 + SmudgeType: Crater + Damage: 250 + VolkNapalm: + ROF: 40 + Range: 8 + 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: 80% + Wood: 100% + Light: 60% + Heavy: 75% + Concrete: 35% + Explosion: small_napalm + WaterExplosion: small_napalm + InfDeath: 5 + SmudgeType: Scorch + ImpactSound: firebl3 + 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: 7 + 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 + 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/Sahara.oramap b/mods/ra/maps/Sahara.oramap new file mode 100644 index 0000000000..c84223e755 Binary files /dev/null and b/mods/ra/maps/Sahara.oramap differ diff --git a/mods/ra/maps/Survival02/map.bin b/mods/ra/maps/Survival02/map.bin new file mode 100644 index 0000000000..13fdf929d5 Binary files /dev/null and b/mods/ra/maps/Survival02/map.bin differ diff --git a/mods/ra/maps/Survival02/map.yaml b/mods/ra/maps/Survival02/map.yaml new file mode 100644 index 0000000000..8a0364911d --- /dev/null +++ b/mods/ra/maps/Survival02/map.yaml @@ -0,0 +1,1134 @@ +Selectable: True + +MapFormat: 5 + +Title: Survival02 + +Description: Survive! + +Author: Nuke'm Bro. + +Tileset: SNOW + +MapSize: 80,80 + +Bounds: 2,2,76,76 + +UseAsShellmap: False + +Type: Campaign + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Race: allies + PlayerReference@Allies: + Name: Allies + Playable: True + AllowBots: False + LockRace: True + Race: allies + LockColor: True + ColorRamp: 115,240,130,10 + LockSpawn: True + LockTeam: True + Allies: Greece + Enemies: Soviets + PlayerReference@Soviets: + Name: Soviets + Race: soviet + ColorRamp: 0,255,128,10 + Enemies: Allies,Greece + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Race: allies + +Actors: + Actor0: tc05 + Location: 37,56 + Owner: Neutral + Actor1: tc02 + Location: 33,56 + Owner: Neutral + Actor2: t16 + Location: 37,59 + Owner: Neutral + Actor3: t10 + Location: 26,56 + Owner: Neutral + Actor4: tc04 + Location: 33,72 + Owner: Neutral + Actor5: tc01 + Location: 32,76 + Owner: Neutral + Actor98: fenc + Location: 56,68 + Owner: Soviets + Actor7: t05 + Location: 40,74 + Owner: Neutral + Actor8: tc04 + Location: 67,70 + Owner: Soviets + Actor9: tc02 + Location: 68,75 + Owner: Neutral + Actor6: fenc + Location: 55,68 + Owner: Soviets + Actor11: tc05 + Location: 73,63 + Owner: Neutral + Actor12: tc02 + Location: 70,67 + Owner: Neutral + Actor13: t07 + Location: 29,71 + Owner: Neutral + Actor14: tc01 + Location: 24,72 + Owner: Neutral + Actor15: t01 + Location: 29,66 + Owner: Neutral + Actor16: t05 + Location: 34,62 + Owner: Neutral + Actor17: tc01 + Location: 52,52 + Owner: Neutral + Actor18: tc02 + Location: 47,54 + Owner: Neutral + Actor19: tc02 + Location: 26,51 + Owner: Neutral + Actor20: t11 + Location: 42,54 + Owner: Neutral + Actor21: tc05 + Location: 75,16 + Owner: Neutral + Actor22: tc02 + Location: 70,16 + Owner: Neutral + Actor23: tc04 + Location: 69,13 + Owner: Soviets + Actor24: t02 + Location: 73,16 + Owner: Neutral + Actor25: t11 + Location: 76,12 + Owner: Neutral + Actor26: tc02 + Location: 55,2 + Owner: Neutral + Actor27: powr + Location: 73,3 + Owner: Soviets + Actor31: tc01 + Location: 47,25 + Owner: Neutral + Actor30: tc05 + Location: 28,25 + Owner: Neutral + Actor28: tc05 + Location: 58,2 + Owner: Soviets + Actor29: t16 + Location: 56,4 + Owner: Neutral + Actor32: tc04 + Location: 57,30 + Owner: Neutral + Actor33: t02 + Location: 56,28 + Owner: Neutral + Actor34: t06 + Location: 19,45 + Owner: Neutral + Actor35: t01 + Location: 20,49 + Owner: Neutral + Actor37: tc05 + Location: 22,47 + Owner: Neutral + Actor36: tc01 + Location: 22,45 + Owner: Neutral + Actor38: tc04 + Location: 53,14 + Owner: Neutral + Actor39: tc05 + Location: 54,16 + Owner: Neutral + Actor40: tc01 + Location: 56,14 + Owner: Neutral + Actor41: tc02 + Location: 52,17 + Owner: Neutral + Actor45: brik + Location: 5,17 + Owner: Soviets + Actor42: brik + Location: 4,17 + Owner: Soviets + Actor43: brik + Location: 4,18 + Owner: Soviets + Actor46: brik + Location: 6,18 + Owner: Soviets + Actor47: brik + Location: 7,18 + Owner: Soviets + Actor48: brik + Location: 8,18 + Owner: Soviets + Actor49: brik + Location: 9,18 + Owner: Soviets + Actor50: brik + Location: 10,18 + Owner: Soviets + Actor44: brik + Location: 5,18 + Owner: Soviets + Actor51: brik + Location: 11,18 + Owner: Soviets + Actor52: brik + Location: 12,18 + Owner: Soviets + Actor53: brik + Location: 13,17 + Owner: Soviets + Actor56: brik + Location: 13,18 + Owner: Soviets + Actor57: brik + Location: 14,18 + Owner: Soviets + Actor54: brik + Location: 14,17 + Owner: Soviets + Actor69: apwr + Location: 75,6 + Owner: Soviets + Actor73: tsla + Location: 16,12 + Owner: Soviets + Factory: weap + Location: 7,6 + Owner: Soviets + Actor67: barb + Location: 19,11 + Owner: Soviets + Actor86: fenc + Location: 65,68 + Owner: Soviets + Actor60: brik + Location: 22,10 + Owner: Soviets + Actor55: brik + Location: 21,10 + Owner: Soviets + Actor74: proc + Location: 13,5 + Owner: Soviets + Actor58: brik + Location: 21,11 + Owner: Soviets + Actor71: powr + Location: 5,13 + Owner: Soviets + barrack1: barr + Location: 18,7 + Owner: Soviets + Actor91: fenc + Location: 68,66 + Owner: Soviets + Actor81: tc03 + Location: 6,20 + Owner: Soviets + Actor80: tc05 + Location: 10,19 + Owner: Soviets + Actor78: brl3 + Location: 64,69 + Owner: Soviets + Actor82: tc04 + Location: 2,19 + Owner: Soviets + Actor85: fenc + Location: 64,68 + Owner: Soviets + Actor61: ftur + Location: 15,16 + Owner: Soviets + Actor65: ftur + Location: 20,12 + Owner: Soviets + Actor84: fenc + Location: 63,68 + Owner: Soviets + Actor62: barb + Location: 14,16 + Owner: Soviets + Actor122: fenc + Location: 46,45 + Owner: Neutral + Actor63: barb + Location: 14,15 + Owner: Soviets + Actor59: brik + Location: 22,11 + Owner: Soviets + Actor104: barb + Location: 19,12 + Owner: Soviets + Actor66: barb + Location: 20,11 + Owner: Soviets + Actor90: fenc + Location: 67,66 + Owner: Soviets + Actor99: fenc + Location: 55,70 + Owner: Soviets + Actor101: fenc + Location: 68,65 + Owner: Soviets + Actor89: fenc + Location: 67,67 + Owner: Soviets + Actor88: fenc + Location: 67,68 + Owner: Soviets + Actor87: fenc + Location: 66,68 + Owner: Soviets + Actor96: e1 + Location: 13,13 + Owner: Soviets + Facing: 160 + boom3: ftur + Location: 59,70 + Owner: Soviets + Actor92: fenc + Location: 55,69 + Owner: Soviets + Actor103: e4 + Location: 8,12 + Owner: Soviets + Facing: 160 + Actor102: 3tnk + Location: 14,11 + Owner: Soviets + Facing: 160 + boom1: apwr + Location: 56,72 + Owner: Soviets + Actor105: tc04 + Location: 23,29 + Owner: Soviets + Actor94: fenc + Location: 55,72 + Owner: Soviets + Actor108: t06 + Location: 24,32 + Owner: Soviets + Actor107: tc01 + Location: 27,30 + Owner: Soviets + Actor76: fenc + Location: 62,69 + Owner: Soviets + Actor75: fenc + Location: 62,68 + Owner: Soviets + boom2: barr + Location: 65,69 + Owner: Soviets + Actor95: fenc + Location: 56,69 + Owner: Soviets + Actor109: t01 + Location: 26,31 + Owner: Soviets + Actor110: tc05 + Location: 51,29 + Owner: Soviets + Actor111: tc04 + Location: 45,29 + Owner: Soviets + Actor112: tc05 + Location: 62,45 + Owner: Soviets + Actor113: t13 + Location: 71,27 + Owner: Soviets + Actor114: tc03 + Location: 74,21 + Owner: Soviets + Actor115: tc02 + Location: 38,2 + Owner: Soviets + Actor116: tc05 + Location: 40,8 + Owner: Soviets + Actor117: tc05 + Location: 4,41 + Owner: Soviets + Actor118: tc04 + Location: 2,43 + Owner: Soviets + Actor119: tc02 + Location: 5,44 + Owner: Soviets + Actor120: t07 + Location: 4,46 + Owner: Soviets + Actor121: fenc + Location: 46,44 + Owner: Neutral + Actor123: fenc + Location: 46,46 + Owner: Neutral + Actor124: fenc + Location: 45,46 + Owner: Neutral + Actor97: powr + Location: 32,43 + Owner: Allies + Health: 0.2 + Actor125: fenc + Location: 44,46 + Owner: Neutral + Actor72: dome + Location: 44,44 + Owner: Allies + Health: 0.3 + Actor127: fact + Location: 38,38 + Owner: Allies + Health: 0.4 + Actor128: powr + Location: 35,45 + Owner: Allies + Health: 0.4 + Actor129: powr + Location: 30,34 + Owner: Allies + Health: 0.3 + Actor130: weap + Location: 33,35 + Owner: Allies + Health: 0.3 + Actor131: tc01 + Location: 30,45 + Owner: Neutral + Actor132: tc04 + Location: 32,45 + Owner: Neutral + Actor133: tc02 + Location: 34,47 + Owner: Neutral + Actor134: agun + Location: 35,42 + Owner: Allies + Health: 0.4 + Actor135: gun + Location: 27,35 + Owner: Allies + Health: 0.4 + Actor136: gun + Location: 28,41 + Owner: Allies + Actor137: cycl + Location: 29,37 + Owner: Neutral + Actor138: cycl + Location: 29,38 + Owner: Neutral + Actor139: cycl + Location: 29,39 + Owner: Neutral + Actor140: pbox.e1 + Location: 28,38 + Owner: Allies + Health: 0.5 + Actor141: agun + Location: 32,31 + Owner: Allies + Health: 0.4 + Actor142: fenc + Location: 31,30 + Owner: Neutral + Actor143: fenc + Location: 32,30 + Owner: Neutral + Actor144: fenc + Location: 33,30 + Owner: Neutral + Actor145: fenc + Location: 34,31 + Owner: Neutral + Actor146: fenc + Location: 34,30 + Owner: Neutral + Actor147: tent + Location: 43,34 + Owner: Allies + Health: 0.3 + Actor148: fix + Location: 44,39 + Owner: Allies + Health: 0.2 + Actor149: cycl + Location: 48,37 + Owner: Neutral + Actor150: cycl + Location: 48,38 + Owner: Neutral + Actor151: cycl + Location: 48,39 + Owner: Neutral + Actor152: gun + Location: 49,38 + Owner: Allies + Health: 0.3 + Actor157: fenc + Location: 40,32 + Owner: Neutral + Actor156: fenc + Location: 40,33 + Owner: Neutral + Actor155: fenc + Location: 39,33 + Owner: Neutral + Actor154: fenc + Location: 38,33 + Owner: Neutral + Actor153: fenc + Location: 38,32 + Owner: Neutral + Actor158: gun + Location: 39,32 + Owner: Allies + Health: 0.3 + Actor159: powr + Location: 46,33 + Owner: Allies + Health: 0.3 + Actor160: fenc + Location: 45,32 + Owner: Neutral + Actor161: fenc + Location: 46,32 + Owner: Neutral + Actor162: fenc + Location: 47,32 + Owner: Neutral + Actor163: fenc + Location: 48,32 + Owner: Neutral + Actor164: fenc + Location: 48,33 + Owner: Neutral + Actor165: fenc + Location: 48,34 + Owner: Neutral + Actor166: agun + Location: 46,37 + Owner: Allies + Health: 0.5 + Actor167: e1 + Location: 35,33 + Owner: Allies + Facing: 64 + Actor168: e1 + Location: 43,32 + Owner: Allies + Actor169: e3 + Location: 42,42 + Owner: Allies + Actor170: e1 + Location: 33,40 + Owner: Allies + Actor171: jeep + Location: 38,35 + Owner: Allies + Actor172: 1tnk + Location: 30,41 + Owner: Allies + Actor173: 1tnk + Location: 47,41 + Owner: Allies + Actor174: 2tnk + Location: 37,46 + Owner: Allies + Facing: 160 + AlliesBase: waypoint + Location: 39,37 + Owner: Neutral + Actor64: barb + Location: 15,15 + Owner: Soviets + Actor177: fenc + Location: 55,71 + Owner: Soviets + Actor100: e2 + Location: 16,10 + Owner: Soviets + Facing: 160 + Actor180: fenc + Location: 53,72 + Owner: Soviets + Actor179: fenc + Location: 54,72 + Owner: Soviets + Actor181: fenc + Location: 53,73 + Owner: Soviets + Actor183: fenc + Location: 54,73 + Owner: Soviets + Actor176: t02 + Location: 43,16 + Owner: Neutral + Actor126: tc04 + Location: 29,15 + Owner: Neutral + Actor182: apwr + Location: 22,2 + Owner: Soviets + Actor77: v2rl + Location: 40,23 + Owner: Soviets + Actor223: e2 + Location: 37,43 + Owner: Soviets + Facing: 192 + Actor220: e1 + Location: 32,38 + Owner: Soviets + Facing: 192 + Actor222: e2 + Location: 40,35 + Owner: Soviets + Facing: 192 + Actor221: e1 + Location: 42,40 + Owner: Soviets + Facing: 192 + SovietEntry1: waypoint + Location: 77,45 + Owner: Neutral + SovietEntry2: waypoint + Location: 2,54 + Owner: Neutral + SovietRally: waypoint + Location: 11,10 + Owner: Neutral + SovietRally1: waypoint + Location: 61,72 + Owner: Neutral + SovietRally2: waypoint + Location: 55,61 + Owner: Neutral + SovietRally3: waypoint + Location: 22,18 + Owner: Neutral + SovietRally4: waypoint + Location: 40,18 + Owner: Neutral + SovietRally5: waypoint + Location: 14,36 + Owner: Neutral + SovietRally6: waypoint + Location: 65,39 + Owner: Neutral + SovietParaDrop1: waypoint + Location: 48,41 + Owner: Neutral + SovietParaDrop2: waypoint + Location: 26,38 + Owner: Neutral + SovietParaDrop3: waypoint + Location: 39,34 + Owner: Neutral + SovietParaDropEntry: waypoint + Location: 2,2 + Owner: Neutral + Actor70: mine + Location: 38,50 + Owner: Neutral + Actor68: 3tnk + Location: 61,70 + Owner: Soviets + Facing: 32 + Actor106: 3tnk + Location: 59,74 + Owner: Soviets + Facing: 224 + Actor175: e1 + Location: 63,72 + Owner: Soviets + Facing: 32 + Actor184: e2 + Location: 61,74 + Owner: Soviets + drum2: brl3 + Location: 60,75 + Owner: Soviets + Actor224: brl3 + Location: 59,75 + Owner: Soviets + Actor225: barl + Location: 58,75 + Owner: Soviets + Actor226: barl + Location: 61,75 + Owner: Soviets + Actor227: barl + Location: 62,70 + Owner: Soviets + drum1: brl3 + Location: 63,70 + Owner: Soviets + Actor229: barl + Location: 63,71 + Owner: Soviets + Actor230: fenc + Location: 67,65 + Owner: Soviets + Actor231: brl3 + Location: 62,74 + Owner: Soviets + Actor232: barl + Location: 62,75 + Owner: Soviets + Actor196: tsla + Location: 60,8 + Owner: Soviets + Actor235: barl + Location: 64,70 + Owner: Soviets + Actor233: proc + Location: 61,3 + Owner: Soviets + Actor236: fenc + Location: 61,2 + Owner: Soviets + Actor237: fenc + Location: 62,2 + Owner: Soviets + Actor238: fenc + Location: 63,2 + Owner: Soviets + Actor241: silo + Location: 64,5 + Owner: Soviets + Actor240: fenc + Location: 64,2 + Owner: Soviets + Actor239: silo + Location: 64,4 + Owner: Soviets + Actor242: powr + Location: 8,14 + Owner: Soviets + Actor243: fenc + Location: 64,3 + Owner: Soviets + Actor10: tc04 + Location: 75,73 + Owner: Neutral + Actor178: t16 + Location: 77,69 + Owner: Neutral + Actor192: tc02 + Location: 22,4 + Owner: Soviets + Actor193: tc01 + Location: 27,6 + Owner: Soviets + Actor194: powr + Location: 74,10 + Owner: Soviets + Actor195: barr + Location: 72,6 + Owner: Soviets + Actor93: tc03 + Location: 75,68 + Owner: Neutral + Actor248: mine + Location: 59,60 + Owner: Neutral + SovietRally7: waypoint + Location: 15,41 + Owner: Neutral + Actor249: tc02 + Location: 26,47 + Owner: Neutral + Actor250: t16 + Location: 24,45 + Owner: Neutral + Actor251: t06 + Location: 22,43 + Owner: Neutral + Actor252: t01 + Location: 24,43 + Owner: Neutral + Actor253: kenn + Location: 12,6 + Owner: Soviets + Actor254: fenc + Location: 10,5 + Owner: Soviets + Actor255: fenc + Location: 11,5 + Owner: Soviets + Actor256: fenc + Location: 12,5 + Owner: Soviets + Actor257: dog + Location: 11,14 + Owner: Soviets + Actor258: dog + Location: 18,10 + Owner: Soviets + Actor259: fenc + Location: 10,6 + Owner: Soviets + Actor260: dog + Location: 11,7 + Owner: Soviets + Actor191: tc04 + Location: 25,1 + Owner: Soviets + Actor79: tc05 + Location: 23,6 + Owner: Soviets + Actor190: apwr + Location: 25,4 + Owner: Soviets + Actor83: barl + Location: 63,69 + Owner: Soviets + FranceEntry: waypoint + Location: 66,77 + Owner: Neutral + FranceRally: waypoint + Location: 59,67 + Owner: Neutral + drum3: brl3 + Location: 58,71 + Owner: Soviets + Actor185: brl3 + Location: 56,71 + Owner: Soviets + Actor186: barl + Location: 58,70 + Owner: Soviets + Actor187: barl + Location: 58,72 + Owner: Soviets + Actor188: barl + Location: 57,71 + Owner: Soviets + Actor189: barl + Location: 59,71 + Owner: Soviets + FranceparaEntry1: waypoint + Location: 50,77 + Owner: Neutral + FranceparaEntry2: waypoint + Location: 56,77 + Owner: Neutral + FranceparaEntry3: waypoint + Location: 53,77 + Owner: Neutral + Actor197: barb + Location: 59,9 + Owner: Soviets + Actor198: barb + Location: 59,10 + Owner: Soviets + Actor199: barb + Location: 60,10 + Owner: Soviets + Actor200: barb + Location: 61,10 + Owner: Soviets + Actor201: barb + Location: 61,9 + Owner: Soviets + Actor202: ftur + Location: 56,8 + Owner: Soviets + Actor203: ftur + Location: 63,12 + Owner: Soviets + Actor209: fenc + Location: 74,7 + Owner: Soviets + Actor208: fenc + Location: 74,6 + Owner: Soviets + Actor207: fenc + Location: 74,5 + Owner: Soviets + Actor206: fenc + Location: 73,5 + Owner: Soviets + Actor205: fenc + Location: 72,5 + Owner: Soviets + Actor204: fenc + Location: 71,5 + Owner: Soviets + Actor210: fenc + Location: 74,8 + Owner: Soviets + Actor211: 3tnk + Location: 58,6 + Owner: Soviets + Facing: 160 + Actor212: 3tnk + Location: 65,10 + Owner: Soviets + Facing: 96 + Actor214: e1 + Location: 73,9 + Owner: Soviets + Facing: 96 + Actor215: e3 + Location: 76,4 + Owner: Soviets + Facing: 32 + Actor216: e4 + Location: 66,3 + Owner: Soviets + Facing: 96 + SovietEntry3: waypoint + Location: 71,2 + Owner: Neutral + Actor234: minv + Location: 16,17 + Owner: Soviets + Actor268: minv + Location: 16,19 + Owner: Soviets + Actor218: minv + Location: 62,13 + Owner: Soviets + Actor219: minv + Location: 57,9 + Owner: Soviets + Actor228: mine + Location: 37,14 + Owner: Neutral + Actor246: minv + Location: 56,11 + Owner: Soviets + Actor247: minv + Location: 58,11 + Owner: Soviets + Actor261: minv + Location: 58,13 + Owner: Soviets + Actor262: minv + Location: 60,12 + Owner: Soviets + Actor263: minv + Location: 60,14 + Owner: Soviets + Actor245: minv + Location: 20,13 + Owner: Soviets + Actor266: minv + Location: 19,16 + Owner: Soviets + Actor264: minv + Location: 20,15 + Owner: Soviets + Actor265: minv + Location: 18,17 + Owner: Soviets + Actor267: minv + Location: 22,13 + Owner: Soviets + Actor269: minv + Location: 19,14 + Owner: Soviets + Actor270: minv + Location: 17,16 + Owner: Soviets + SovietRally8: waypoint + Location: 59,19 + Owner: Neutral + +Smudges: + +Rules: + World: + -CrateDrop: + -SpawnMPUnits: + -MPStartLocations: + Survival02Script: + MissionObjectivesPanel: + ObjectivesPanel: MISSION_OBJECTIVES + TENT: + ProvidesCustomPrerequisite: + Prerequisite: barracks + ARTY: + Valued: + Cost: 1000 + GUN: + Valued: + Cost: 1000 + BARR: + ProvidesCustomPrerequisite: + Prerequisite: barracks + Buildable: + Owner: None + MEDI: + Buildable: + Prerequisites: barracks + SPY: + Buildable: + Prerequisites: barracks, dome + 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 + 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 + TTNK: + Buildable: + Owner: None + FTRK: + Buildable: + Owner: None + CTNK: + Buildable: + Owner: None + DOME: + Buildable: + Owner: None + BRIK: + Buildable: + Owner: None + CAMERA: + RevealsShroud: + Range: 7 + +Sequences: + +Weapons: + ParaBomb: + ROF: 5 + Range: 7 + Report: CHUTE1 + Projectile: GravityBomb + Image: BOMBLET + Warhead: + Spread: 15 + Versus: + None: 125% + Wood: 100% + Light: 60% + Concrete: 25% + Explosion: napalm + ImpactSound: firebl3 + WaterExplosion: napalm + InfDeath: 5 + SmudgeType: Crater + Damage: 350 + +Voices: + +Notifications: diff --git a/mods/ra/maps/suffrage.oramap b/mods/ra/maps/suffrage.oramap new file mode 100644 index 0000000000..6f91932925 Binary files /dev/null and b/mods/ra/maps/suffrage.oramap differ