From 7d43ecc33f10ddc2c10f3b51221dac9c218a7a5b Mon Sep 17 00:00:00 2001 From: ScottNZ Date: Sun, 2 Mar 2014 18:47:24 +1300 Subject: [PATCH] Remove the temperate RA shellmap and port the desert shellmap to Lua. --- .../Missions/DefaultShellmapScript.cs | 72 - .../Missions/DesertShellmapScript.cs | 319 ---- OpenRA.Mods.RA/OpenRA.Mods.RA.csproj | 3 - OpenRA.Mods.RA/Scripting/LuaScriptEvents.cs | 15 +- .../Scripting/LuaScriptInterface.cs | 88 +- OpenRA.Mods.RA/Scripting/RASpecialPowers.cs | 30 - OpenRA.Mods.RA/SpawnMapActors.cs | 5 +- mods/common/lua/actor.lua | 17 +- mods/common/lua/map.lua | 14 +- mods/common/lua/production.lua | 8 + mods/common/lua/supportpowers.lua | 21 +- mods/common/lua/utils.lua | 8 + .../maps/desert-shellmap/desert-shellmap.lua | 154 ++ mods/ra/maps/desert-shellmap/map.bin | Bin 81925 -> 81925 bytes mods/ra/maps/desert-shellmap/map.yaml | 1072 +++++++------- mods/ra/maps/shellmap/map.bin | Bin 81925 -> 0 bytes mods/ra/maps/shellmap/map.yaml | 1309 ----------------- 17 files changed, 858 insertions(+), 2277 deletions(-) delete mode 100644 OpenRA.Mods.RA/Missions/DefaultShellmapScript.cs delete mode 100644 OpenRA.Mods.RA/Missions/DesertShellmapScript.cs delete mode 100644 OpenRA.Mods.RA/Scripting/RASpecialPowers.cs create mode 100644 mods/ra/maps/desert-shellmap/desert-shellmap.lua delete mode 100644 mods/ra/maps/shellmap/map.bin delete mode 100644 mods/ra/maps/shellmap/map.yaml diff --git a/OpenRA.Mods.RA/Missions/DefaultShellmapScript.cs b/OpenRA.Mods.RA/Missions/DefaultShellmapScript.cs deleted file mode 100644 index 9ce3ee9cef..0000000000 --- a/OpenRA.Mods.RA/Missions/DefaultShellmapScript.cs +++ /dev/null @@ -1,72 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2007-2011 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation. For more information, - * see COPYING. - */ -#endregion - -using System; -using System.Collections.Generic; -using OpenRA.FileFormats; -using OpenRA.Graphics; -using OpenRA.Mods.RA.Air; -using OpenRA.Traits; - -namespace OpenRA.Mods.RA -{ - class DefaultShellmapScriptInfo : TraitInfo { } - - class DefaultShellmapScript: IWorldLoaded, ITick - { - Dictionary Actors; - static WPos ViewportOrigin; - WorldRenderer worldRenderer; - - public void WorldLoaded(World w, WorldRenderer wr) - { - worldRenderer = wr; - var b = w.Map.Bounds; - ViewportOrigin = new CPos(b.Left + b.Width/2, b.Top + b.Height/2).CenterPosition; - worldRenderer.Viewport.Center(ViewportOrigin); - - Actors = w.WorldActor.Trait().Actors; - Sound.SoundVolumeModifier = 0.25f; - } - - int ticks = 0; - float speed = 4f; - public void Tick(Actor self) - { - var t = (ticks + 45) % (360f * speed) * (Math.PI / 180) * 1f / speed; - var offset = new float2(15360, 10240) * float2.FromAngle((float)t); - worldRenderer.Viewport.Center(ViewportOrigin + new WVec((int)offset.X, (int)offset.Y, 0)); - - if (ticks == 50) - { - Scripting.RASpecialPowers.Chronoshift(self.World, new List>() - { - Pair.New(Actors["ca1"], new CPos(96, 70)), - Pair.New(Actors["ca2"], new CPos(98, 72)) - }, Actors["pdox"], -1, false); - } - - if (ticks == 100) - Actors["mslo1"].Trait().Activate(Actors["mslo1"], new Order() { TargetLocation = new CPos(98, 52) }); - if (ticks == 140) - Actors["mslo2"].Trait().Activate(Actors["mslo2"], new Order() { TargetLocation = new CPos(95, 54) }); - if (ticks == 180) - Actors["mslo3"].Trait().Activate(Actors["mslo3"], new Order() { TargetLocation = new CPos(95, 49) }); - - if (ticks == 430) - { - Actors["mig1"].Trait().AttackTarget(Target.FromActor(Actors["greeceweap"]), false, true); - Actors["mig2"].Trait().AttackTarget(Target.FromActor(Actors["greeceweap"]), false, true); - } - - ticks++; - } - } -} diff --git a/OpenRA.Mods.RA/Missions/DesertShellmapScript.cs b/OpenRA.Mods.RA/Missions/DesertShellmapScript.cs deleted file mode 100644 index 31a1d2f2d5..0000000000 --- a/OpenRA.Mods.RA/Missions/DesertShellmapScript.cs +++ /dev/null @@ -1,319 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2007-2011 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 OpenRA.FileFormats; -using OpenRA.Graphics; -using OpenRA.Mods.RA.Activities; -using OpenRA.Mods.RA.Air; -using OpenRA.Mods.RA.Buildings; -using OpenRA.Mods.RA.Move; -using OpenRA.Mods.RA.Scripting; -using OpenRA.Traits; - -namespace OpenRA.Mods.RA.Missions -{ - class DesertShellmapScriptInfo : TraitInfo, Requires { } - - class DesertShellmapScript : ITick, IWorldLoaded - { - World world; - WorldRenderer worldRenderer; - Player allies; - Player soviets; - Player neutral; - - WPos[] viewportTargets; - WPos viewportTarget; - int viewportTargetNumber; - WPos viewportOrigin; - int mul; - int div = 400; - int waitTicks = 0; - - int nextCivilianMove = 1; - - Actor attackLocation; - Actor coastWP1; - Actor coastWP2; - int coastUnitsLeft; - static readonly string[] CoastUnits = { "e1", "e1", "e2", "e3", "e4" }; - - Actor paradrop1LZ; - Actor paradrop1Entry; - Actor paradrop2LZ; - Actor paradrop2Entry; - static readonly string[] ParadropUnits = { "e1", "e1", "e1", "e2", "e2" }; - - Actor offmapAttackerSpawn1; - Actor offmapAttackerSpawn2; - Actor offmapAttackerSpawn3; - Actor[] offmapAttackerSpawns; - static readonly string[] OffmapAttackers = { "ftrk", "apc", "ttnk", "1tnk" }; - static readonly string[] AttackerCargo = { "e1", "e2", "e3", "e4" }; - - static readonly string[] HeavyTanks = { "3tnk", "3tnk", "3tnk", "3tnk", "3tnk", "3tnk" }; - Actor heavyTankSpawn; - Actor heavyTankWP; - static readonly string[] MediumTanks = { "2tnk", "2tnk", "2tnk", "2tnk", "2tnk", "2tnk" }; - Actor mediumTankChronoSpawn; - - static readonly string[] ChinookCargo = { "e1", "e1", "e1", "e1", "e3", "e3" }; - - static readonly string[] InfantryProductionUnits = { "e1", "e3" }; - static readonly string[] VehicleProductionUnits = { "jeep", "1tnk", "2tnk", "arty" }; - Actor alliedBarracks; - Actor alliedWarFactory; - - Dictionary actors; - - Actor chronosphere; - Actor ironCurtain; - - CPos[] mig1Waypoints; - CPos[] mig2Waypoints; - - Actor chinook1Entry; - Actor chinook1LZ; - Actor chinook2Entry; - Actor chinook2LZ; - - public void Tick(Actor self) - { - if (world.FrameNumber % 100 == 0) - { - var actor = OffmapAttackers.Random(world.SharedRandom); - var spawn = offmapAttackerSpawns.Random(world.SharedRandom); - var u = world.CreateActor(actor, soviets, spawn.Location, Traits.Util.GetFacing(attackLocation.Location - spawn.Location, 0)); - var cargo = u.TraitOrDefault(); - if (cargo != null) - { - while (cargo.HasSpace(1)) - cargo.Load(u, world.CreateActor(false, AttackerCargo.Random(world.SharedRandom), soviets, null, null)); - } - u.QueueActivity(new AttackMove.AttackMoveActivity(u, new Move.Move(attackLocation.Location, 0))); - } - - if (world.FrameNumber % 25 == 0) - { - foreach (var actor in world.Actors.Where(a => a.IsInWorld && a.IsIdle && !a.IsDead() - && a.HasTrait() && a.HasTrait()).Except(actors.Values)) - MissionUtils.AttackNearestLandActor(true, actor, actor.Owner == soviets ? allies : soviets); - - MissionUtils.StartProduction(world, allies, "Infantry", InfantryProductionUnits.Random(world.SharedRandom)); - MissionUtils.StartProduction(world, allies, "Vehicle", VehicleProductionUnits.Random(world.SharedRandom)); - } - - if (world.FrameNumber % 20 == 0 && coastUnitsLeft-- > 0) - { - var u = world.CreateActor(CoastUnits.Random(world.SharedRandom), soviets, coastWP1.Location, null); - u.QueueActivity(new Move.Move(coastWP2.Location, 0)); - u.QueueActivity(new AttackMove.AttackMoveActivity(u, new Move.Move(attackLocation.Location, 0))); - } - - if (world.FrameNumber == nextCivilianMove) - { - var civilians = world.Actors.Where(a => !a.IsDead() && a.IsInWorld && a.Owner == neutral && a.HasTrait()); - if (civilians.Any()) - { - var civilian = civilians.Random(world.SharedRandom); - civilian.Trait().Nudge(civilian, civilian, true); - nextCivilianMove += world.SharedRandom.Next(1, 75); - } - } - - if (world.FrameNumber == 1) - { - MissionUtils.Paradrop(world, soviets, ParadropUnits, paradrop1Entry.Location, paradrop1LZ.Location); - MissionUtils.Paradrop(world, soviets, ParadropUnits, paradrop2Entry.Location, paradrop2LZ.Location); - } - - if (--waitTicks <= 0) - { - if (++mul <= div) - worldRenderer.Viewport.Center(WPos.Lerp(viewportOrigin, viewportTarget, mul, div)); - else - { - mul = 0; - viewportOrigin = viewportTarget; - viewportTarget = viewportTargets[(viewportTargetNumber = (viewportTargetNumber + 1) % viewportTargets.Length)]; - waitTicks = 100; - - if (viewportTargetNumber == 0) - { - coastUnitsLeft = 15; - SendChinookReinforcements(chinook1Entry.Location, chinook1LZ); - SendChinookReinforcements(chinook2Entry.Location, chinook2LZ); - } - if (viewportTargetNumber == 1) - { - MissionUtils.Paradrop(world, soviets, ParadropUnits, paradrop1Entry.Location, paradrop1LZ.Location); - MissionUtils.Paradrop(world, soviets, ParadropUnits, paradrop2Entry.Location, paradrop2LZ.Location); - } - if (viewportTargetNumber == 2) - { - AttackWithHeavyTanks(); - ChronoSpawnMediumTanks(); - } - if (viewportTargetNumber == 4) - { - FlyMigs(mig1Waypoints); - FlyMigs(mig2Waypoints); - } - } - } - - MissionUtils.CapOre(soviets); - } - - void AttackWithHeavyTanks() - { - foreach (var tank in HeavyTanks) - { - var u = world.CreateActor(tank, soviets, heavyTankSpawn.Location, Traits.Util.GetFacing(heavyTankWP.Location - heavyTankSpawn.Location, 0)); - u.QueueActivity(new AttackMove.AttackMoveActivity(u, new Move.Move(heavyTankWP.Location, 0))); - } - ironCurtain.Trait().Activate(ironCurtain, new Order { TargetLocation = heavyTankSpawn.Location }); - } - - void ChronoSpawnMediumTanks() - { - var chronoInfo = new List>(); - foreach (var tank in MediumTanks.Select((x, i) => new { x, i })) - { - var u = world.CreateActor(tank.x, allies, mediumTankChronoSpawn.Location, Traits.Util.GetFacing(heavyTankWP.Location - mediumTankChronoSpawn.Location, 0)); - chronoInfo.Add(Pair.New(u, new CPos(mediumTankChronoSpawn.Location.X + tank.i, mediumTankChronoSpawn.Location.Y))); - } - RASpecialPowers.Chronoshift(world, chronoInfo, chronosphere, -1, false); - foreach (var tank in chronoInfo) - tank.First.QueueActivity(new AttackMove.AttackMoveActivity(tank.First, new Move.Move(heavyTankSpawn.Location, 0))); - } - - void FlyMigs(CPos[] waypoints) - { - var m = world.CreateActor("mig", new TypeDictionary - { - new OwnerInit(soviets), - new LocationInit(waypoints[0]), - new FacingInit(Traits.Util.GetFacing(waypoints[1] - waypoints[0], 0)) - }); - foreach (var waypoint in waypoints) - m.QueueActivity(new Fly(m, Target.FromCell(waypoint))); - m.QueueActivity(new RemoveSelf()); - } - - void SendChinookReinforcements(CPos entry, Actor lz) - { - var chinook = world.CreateActor("tran", allies, entry, Traits.Util.GetFacing(lz.Location - entry, 0)); - var cargo = chinook.Trait(); - - while (cargo.HasSpace(1)) - cargo.Load(chinook, world.CreateActor(false, ChinookCargo.Random(world.SharedRandom), allies, null, null)); - - var exit = lz.Info.Traits.WithInterface().FirstOrDefault(); - var offset = (exit != null) ? exit.SpawnOffset : WVec.Zero; - - chinook.QueueActivity(new HeliFly(chinook, Target.FromPos(lz.CenterPosition + offset))); // no reservation of hpad but it's not needed - chinook.QueueActivity(new Turn(0)); - chinook.QueueActivity(new HeliLand(false)); - chinook.QueueActivity(new UnloadCargo(chinook, true)); - chinook.QueueActivity(new Wait(150)); - chinook.QueueActivity(new HeliFly(chinook, Target.FromCell(entry))); - chinook.QueueActivity(new RemoveSelf()); - } - - void InitializeAlliedFactories() - { - alliedBarracks.Trait().SetPrimaryProducer(alliedBarracks, true); - alliedWarFactory.Trait().SetPrimaryProducer(alliedWarFactory, true); - } - - public void WorldLoaded(World w, WorldRenderer wr) - { - world = w; - worldRenderer = wr; - allies = w.Players.Single(p => p.InternalName == "Allies"); - soviets = w.Players.Single(p => p.InternalName == "Soviets"); - neutral = w.Players.Single(p => p.InternalName == "Neutral"); - - actors = w.WorldActor.Trait().Actors; - - attackLocation = actors["AttackLocation"]; - coastWP1 = actors["CoastWP1"]; - coastWP2 = actors["CoastWP2"]; - - paradrop1LZ = actors["Paradrop1LZ"]; - paradrop1Entry = actors["Paradrop1Entry"]; - paradrop2LZ = actors["Paradrop2LZ"]; - paradrop2Entry = actors["Paradrop2Entry"]; - - var t1 = actors["ViewportTarget1"].CenterPosition; - var t2 = actors["ViewportTarget2"].CenterPosition; - var t3 = actors["ViewportTarget3"].CenterPosition; - var t4 = actors["ViewportTarget4"].CenterPosition; - var t5 = actors["ViewportTarget5"].CenterPosition; - viewportTargets = new[] { t1, t2, t3, t4, t5 }; - - offmapAttackerSpawn1 = actors["OffmapAttackerSpawn1"]; - offmapAttackerSpawn2 = actors["OffmapAttackerSpawn2"]; - offmapAttackerSpawn3 = actors["OffmapAttackerSpawn3"]; - offmapAttackerSpawns = new[] { offmapAttackerSpawn1, offmapAttackerSpawn2, offmapAttackerSpawn3 }; - - heavyTankSpawn = actors["HeavyTankSpawn"]; - heavyTankWP = actors["HeavyTankWP"]; - mediumTankChronoSpawn = actors["MediumTankChronoSpawn"]; - - chronosphere = actors["Chronosphere"]; - ironCurtain = actors["IronCurtain"]; - - mig1Waypoints = new[] { actors["Mig11"], actors["Mig12"], actors["Mig13"], actors["Mig14"] }.Select(a => a.Location).ToArray(); - mig2Waypoints = new[] { actors["Mig21"], actors["Mig22"], actors["Mig23"], actors["Mig24"] }.Select(a => a.Location).ToArray(); - - chinook1Entry = actors["Chinook1Entry"]; - chinook2Entry = actors["Chinook2Entry"]; - chinook1LZ = actors["Chinook1LZ"]; - chinook2LZ = actors["Chinook2LZ"]; - - alliedBarracks = actors["AlliedBarracks"]; - alliedWarFactory = actors["AlliedWarFactory"]; - - InitializeAlliedFactories(); - - foreach (var actor in actors.Values) - { - if (actor.Owner == allies && actor.HasTrait()) - actor.Trait().Stance = UnitStance.Defend; - - if (actor.IsInWorld && (actor.HasTrait() || actor.Owner == allies || (actor.Owner == soviets && actor.HasTrait()))) - actor.AddTrait(new Invulnerable()); - } - - viewportOrigin = viewportTargets[0]; - viewportTargetNumber = 1; - viewportTarget = viewportTargets[1]; - - wr.Viewport.Center(viewportOrigin); - Sound.SoundVolumeModifier = 0.1f; - } - } - - class DesertShellmapAutoUnloadInfo : TraitInfo, Requires { } - - class DesertShellmapAutoUnload : INotifyDamage - { - public void Damaged(Actor self, AttackInfo e) - { - var cargo = self.Trait(); - if (!cargo.IsEmpty(self) && !(self.GetCurrentActivity() is UnloadCargo)) - self.QueueActivity(false, new UnloadCargo(self, true)); - } - } -} diff --git a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj index 335d20d315..b48bbe9892 100644 --- a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj +++ b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj @@ -261,7 +261,6 @@ - @@ -272,7 +271,6 @@ - @@ -352,7 +350,6 @@ - diff --git a/OpenRA.Mods.RA/Scripting/LuaScriptEvents.cs b/OpenRA.Mods.RA/Scripting/LuaScriptEvents.cs index 40b2778583..b8edf9a657 100644 --- a/OpenRA.Mods.RA/Scripting/LuaScriptEvents.cs +++ b/OpenRA.Mods.RA/Scripting/LuaScriptEvents.cs @@ -15,13 +15,16 @@ namespace OpenRA.Mods.RA.Scripting { public class LuaScriptEventsInfo : TraitInfo { } - public class LuaScriptEvents : INotifyKilled, INotifyAddedToWorld, INotifyRemovedFromWorld, INotifyCapture, INotifyDamage + public class LuaScriptEvents : INotifyKilled, INotifyAddedToWorld, INotifyRemovedFromWorld, + INotifyCapture, INotifyDamage, INotifyIdle, INotifyProduction { public event Action OnKilled = (self, e) => { }; public event Action OnAddedToWorld = self => { }; public event Action OnRemovedFromWorld = self => { }; public event Action OnCaptured = (self, captor, oldOwner, newOwner) => { }; public event Action OnDamaged = (self, e) => { }; + public event Action OnIdle = self => { }; + public event Action OnProduced = (self, other, exit) => { }; public void Killed(Actor self, AttackInfo e) { @@ -47,5 +50,15 @@ namespace OpenRA.Mods.RA.Scripting { OnDamaged(self, e); } + + public void TickIdle(Actor self) + { + OnIdle(self); + } + + public void UnitProduced(Actor self, Actor other, CPos exit) + { + OnProduced(self, other, exit); + } } } diff --git a/OpenRA.Mods.RA/Scripting/LuaScriptInterface.cs b/OpenRA.Mods.RA/Scripting/LuaScriptInterface.cs index 10fab7b688..93150f1faa 100644 --- a/OpenRA.Mods.RA/Scripting/LuaScriptInterface.cs +++ b/OpenRA.Mods.RA/Scripting/LuaScriptInterface.cs @@ -35,7 +35,7 @@ namespace OpenRA.Mods.RA.Scripting public class LuaScriptInterface : IWorldLoaded, ITick { World world; - Dictionary mapActors; + SpawnMapActors sma; readonly LuaScriptContext context = new LuaScriptContext(); readonly LuaScriptInterfaceInfo info; @@ -47,7 +47,7 @@ namespace OpenRA.Mods.RA.Scripting public void WorldLoaded(World w, WorldRenderer wr) { world = w; - mapActors = world.WorldActor.Trait().Actors; + sma = world.WorldActor.Trait(); context.Lua["World"] = w; context.Lua["WorldRenderer"] = wr; @@ -75,7 +75,7 @@ namespace OpenRA.Mods.RA.Scripting void AddMapActorGlobals() { - foreach (var kv in mapActors) + foreach (var kv in sma.Actors) { if (context.Lua[kv.Key] != null) context.ShowErrorMessage("{0}: The global name '{1}' is reserved and may not be used by map actor {2}".F(GetType().Name, kv.Key, kv.Value), null); @@ -328,7 +328,19 @@ namespace OpenRA.Mods.RA.Scripting [LuaGlobal] public Actor GetNamedActor(string actorName) { - return mapActors[actorName]; + return sma.Actors[actorName]; + } + + [LuaGlobal] + public bool IsNamedActor(Actor actor) + { + return actor.ActorID <= sma.LastMapActorID && actor.ActorID > sma.LastMapActorID - sma.Actors.Count; + } + + [LuaGlobal] + public IEnumerable GetNamedActors() + { + return sma.Actors.Values; } [LuaGlobal] @@ -343,18 +355,28 @@ namespace OpenRA.Mods.RA.Scripting return world.FindActorsInCircle(location, radius).ToArray(); } + ClassicProductionQueue GetSharedQueueForCategory(Player player, string category) + { + return world.ActorsWithTrait() + .Where(a => a.Actor.Owner == player && a.Trait.Info.Type == category) + .Select(a => a.Trait).FirstOrDefault(); + } + + ClassicProductionQueue GetSharedQueueForUnit(Player player, string unit) + { + var ri = Rules.Info[unit]; + + var bi = ri.Traits.GetOrDefault(); + if (bi == null) + return null; + + return GetSharedQueueForCategory(player, bi.Queue); + } + [LuaGlobal] public void BuildWithSharedQueue(Player player, string unit, double amount) { - var ri = Rules.Info[unit]; - if (ri == null || !ri.Traits.Contains()) - return; - - var category = ri.Traits.Get().Queue; - - var queue = world.ActorsWithTrait() - .Where(a => a.Actor.Owner == player && a.Trait.Info.Type == category) - .Select(a => a.Trait).FirstOrDefault(); + var queue = GetSharedQueueForUnit(player, unit); if (queue != null) queue.ResolveOrder(queue.self, Order.StartProduction(queue.self, unit, (int)amount)); @@ -363,14 +385,38 @@ namespace OpenRA.Mods.RA.Scripting [LuaGlobal] public void BuildWithPerFactoryQueue(Actor factory, string unit, double amount) { - if (!factory.HasTrait()) - return; - var ri = Rules.Info[unit]; - if (ri == null || !ri.Traits.Contains()) + + var bi = ri.Traits.GetOrDefault(); + if (bi == null) return; - factory.Trait().ResolveOrder(factory, Order.StartProduction(factory, unit, (int)amount)); + var queue = factory.TraitOrDefault(); + + if (queue != null) + queue.ResolveOrder(factory, Order.StartProduction(factory, unit, (int)amount)); + } + + [LuaGlobal] + public bool SharedQueueIsBusy(Player player, string category) + { + var queue = GetSharedQueueForCategory(player, category); + + if (queue == null) + return true; + + return queue.CurrentItem() != null; + } + + [LuaGlobal] + public bool PerFactoryQueueIsBusy(Actor factory) + { + var queue = factory.TraitOrDefault(); + + if (queue == null) + return true; + + return queue.CurrentItem() != null; } [LuaGlobal] @@ -384,5 +430,11 @@ namespace OpenRA.Mods.RA.Scripting gt.GuardTarget(guard, Target.FromActor(target)); } } + + [LuaGlobal] + public IEnumerable ExpandFootprint(LuaTable cells, bool allowDiagonal) + { + return Util.ExpandFootprint(cells.Values.Cast(), allowDiagonal); + } } } diff --git a/OpenRA.Mods.RA/Scripting/RASpecialPowers.cs b/OpenRA.Mods.RA/Scripting/RASpecialPowers.cs deleted file mode 100644 index bd044cf7d8..0000000000 --- a/OpenRA.Mods.RA/Scripting/RASpecialPowers.cs +++ /dev/null @@ -1,30 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2007-2011 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 OpenRA.FileFormats; - -namespace OpenRA.Mods.RA.Scripting -{ - public class RASpecialPowers - { - public static void Chronoshift(World world, List> units, Actor chronosphere, int duration, bool killCargo) - { - foreach (var kv in units) - { - var target = kv.First; - var targetCell = kv.Second; - var cs = target.Trait(); - if (chronosphere.Owner.Shroud.IsExplored(targetCell) && cs.CanChronoshiftTo(target, targetCell)) - cs.Teleport(target, targetCell, duration, killCargo, chronosphere); - } - } - } -} diff --git a/OpenRA.Mods.RA/SpawnMapActors.cs b/OpenRA.Mods.RA/SpawnMapActors.cs index 5999564846..a44155c293 100644 --- a/OpenRA.Mods.RA/SpawnMapActors.cs +++ b/OpenRA.Mods.RA/SpawnMapActors.cs @@ -20,6 +20,7 @@ namespace OpenRA.Mods.RA public class SpawnMapActors : IWorldLoaded { public Dictionary Actors = new Dictionary(); + public uint LastMapActorID { get; private set; } public void WorldLoaded(World world, WorldRenderer wr) { @@ -32,7 +33,9 @@ namespace OpenRA.Mods.RA var initDict = actorReference.Value.InitDict; initDict.Add(new SkipMakeAnimsInit()); - Actors[actorReference.Key] = world.CreateActor(actorReference.Value.Type, initDict); + var actor = world.CreateActor(actorReference.Value.Type, initDict); + Actors[actorReference.Key] = actor; + LastMapActorID = actor.ActorID; } } } diff --git a/mods/common/lua/actor.lua b/mods/common/lua/actor.lua index a0aca22213..c8acc1dd06 100644 --- a/mods/common/lua/actor.lua +++ b/mods/common/lua/actor.lua @@ -76,7 +76,14 @@ Actor.FlyOffMap = function(actor) end Actor.Hunt = function(actor) - actor:QueueActivity(OpenRA.New("Hunt", { actor })) + if Actor.HasTrait(actor, "AttackBase") and Actor.HasTrait(actor, "IMove") then + actor:QueueActivity(OpenRA.New("Hunt", { actor })) + end +end + +Actor.CargoIsEmpty = function(actor) + local cargo = Actor.TraitOrDefault(actor, "Cargo") + return cargo == nil or cargo:IsEmpty(actor) end Actor.UnloadCargo = function(actor, unloadAll) @@ -163,6 +170,14 @@ Actor.OnCaptured = function(actor, eh) Actor.Trait(actor, "LuaScriptEvents").OnCaptured:Add(eh) end +Actor.OnIdle = function(actor, eh) + Actor.Trait(actor, "LuaScriptEvents").OnIdle:Add(eh) +end + +Actor.OnProduced = function(actor, eh) + Actor.Trait(actor, "LuaScriptEvents").OnProduced:Add(eh) +end + Actor.ActorsWithTrait = function(className) local ret = { } for item in Utils.Enumerate(Internal.ActorsWithTrait(className)) do diff --git a/mods/common/lua/map.lua b/mods/common/lua/map.lua index 48f4194540..e8f7fe66f2 100644 --- a/mods/common/lua/map.lua +++ b/mods/common/lua/map.lua @@ -12,10 +12,18 @@ Map.GetRandomEdgeCell = function() return Internal.GetRandomEdgeCell() end +Map.IsNamedActor = function(actor) + return Internal.IsNamedActor(actor) +end + Map.GetNamedActor = function(actorName) return Internal.GetNamedActor(actorName) end +Map.GetNamedActors = function() + return Internal.GetNamedActors() +end + Map.FindActorsInCircle = function(location, radius, func) local actors = Internal.FindActorsInCircle(location.CenterPosition, WRange.FromCells(radius)) return Utils.EnumerableWhere(actors, func) @@ -58,6 +66,10 @@ Map.FindIdleUnitsInBox = function(player, topLeft, bottomRight) return Map.FindActorsInBox(topLeft, bottomRight, function(a) return Map.__FilterByTraitAndIdle(a, player, "Mobile") end) end +Map.ExpandFootprint = function(cells, allowDiagonal) + return Utils.EnumerableToTable(Internal.ExpandFootprint(cells, allowDiagonal)) +end + CPos.New = function(x, y) return OpenRA.New("CPos", { { x, "Int32" }, { y, "Int32" } }) end @@ -90,4 +102,4 @@ end WRange.FromCells = function(cells) return WRange.New(cells * 1024) -end +end \ No newline at end of file diff --git a/mods/common/lua/production.lua b/mods/common/lua/production.lua index 9acef2b6c5..d03b129ef0 100644 --- a/mods/common/lua/production.lua +++ b/mods/common/lua/production.lua @@ -8,6 +8,14 @@ Production.BuildWithPerFactoryQueue = function(factory, unit, amount) Internal.BuildWithPerFactoryQueue(factory, unit, amount or 1) end +Production.SharedQueueIsBusy = function(player, category) + return Internal.SharedQueueIsBusy(player, category) +end + +Production.PerFactoryQueueIsBusy = function(factory) + return Internal.PerFactoryQueueIsBusy(factory) +end + Production.SetRallyPoint = function(factory, location) Actor.Trait(factory, "RallyPoint").rallyPoint = location.Location end diff --git a/mods/common/lua/supportpowers.lua b/mods/common/lua/supportpowers.lua index c899ddfa3b..971b49d9bb 100644 --- a/mods/common/lua/supportpowers.lua +++ b/mods/common/lua/supportpowers.lua @@ -2,8 +2,8 @@ SupportPowers = { } SupportPowers.Airstrike = function(owner, planeName, enterLocation, bombLocation) local facing = { Map.GetFacing(CPos.op_Subtraction(bombLocation, enterLocation), 0), "Int32" } - local altitude = { Rules.TraitInfo(planeName, "AircraftInfo").CruiseAltitude, "Int32" } - local plane = Actor.Create(planeName, { Location = enterLocation, Owner = owner, Facing = facing, Altitude = altitude }) + local center = WPos.op_Addition(enterLocation.CenterPosition, WVec.New(0, 0, Rules.InitialAltitude(planeName))) + local plane = Actor.Create(planeName, { Location = enterLocation, Owner = owner, Facing = facing, CenterPosition = center }) Actor.Trait(plane, "AttackBomber"):SetTarget(bombLocation.CenterPosition) Actor.Fly(plane, bombLocation.CenterPosition) Actor.FlyOffMap(plane) @@ -13,8 +13,8 @@ end SupportPowers.Paradrop = function(owner, planeName, passengerNames, enterLocation, dropLocation) local facing = { Map.GetFacing(CPos.op_Subtraction(dropLocation, enterLocation), 0), "Int32" } - local altitude = { Rules.TraitInfo(planeName, "AircraftInfo").CruiseAltitude, "Int32" } - local plane = Actor.Create(planeName, { Location = enterLocation, Owner = owner, Facing = facing, Altitude = altitude }) + local center = WPos.op_Addition(enterLocation.CenterPosition, WVec.New(0, 0, Rules.InitialAltitude(planeName))) + local plane = Actor.Create(planeName, { Location = enterLocation, Owner = owner, Facing = facing, CenterPosition = center }) Actor.FlyAttackCell(plane, dropLocation) Actor.Trait(plane, "ParaDrop"):SetLZ(dropLocation) local cargo = Actor.Trait(plane, "Cargo") @@ -25,4 +25,17 @@ SupportPowers.Paradrop = function(owner, planeName, passengerNames, enterLocatio cargo:Load(plane, passenger) end return plane, passengers +end + +SupportPowers.Chronoshift = function(unitLocationPairs, chronosphere, duration, killCargo) + duration = duration or -1 + killCargo = killCargo or true + Utils.Do(unitLocationPairs, function(pair) + local unit = pair[1] + local cell = pair[2] + local cs = Actor.TraitOrDefault(unit, "Chronoshiftable") + if cs ~= nil and cs:CanChronoshiftTo(unit, cell) then + cs:Teleport(unit, cell, duration, killCargo, chronosphere) + end + end) end \ No newline at end of file diff --git a/mods/common/lua/utils.lua b/mods/common/lua/utils.lua index 15c376da1c..03f3ef0031 100644 --- a/mods/common/lua/utils.lua +++ b/mods/common/lua/utils.lua @@ -28,6 +28,14 @@ Utils.EnumerableWhere = function(netEnumerable, func) return ret end +Utils.EnumerableToTable = function(netEnumerable, func) + local ret = { } + for item in Utils.Enumerate(netEnumerable) do + table.insert(ret, item) + end + return ret +end + Utils.Where = function(array, func) local ret = { } for i, item in ipairs(array) do diff --git a/mods/ra/maps/desert-shellmap/desert-shellmap.lua b/mods/ra/maps/desert-shellmap/desert-shellmap.lua new file mode 100644 index 0000000000..c91de275af --- /dev/null +++ b/mods/ra/maps/desert-shellmap/desert-shellmap.lua @@ -0,0 +1,154 @@ +local ants = OpenRA.GetRandomInteger(0, 51) == 0 + +if ants then + UnitTypes = { "ant", "ant", "ant" } + BeachUnitTypes = { "ant", "ant" } + ParadropUnitTypes = { "ant", "ant", "ant", "ant", "ant" } + ProducedUnitTypes = + { + { AlliedBarracks1, { "e1", "e3" } }, + { AlliedBarracks2, { "e1", "e3" } }, + { SovietBarracks1, { "ant" } }, + { SovietBarracks2, { "ant" } }, + { SovietBarracks3, { "ant" } }, + { AlliedWarFactory1, { "jeep", "1tnk", "2tnk", "arty", "ctnk" } }, + { SovietWarFactory1, { "3tnk", "4tnk", "v2rl", "ttnk", "apc" } } + } +else + UnitTypes = { "3tnk", "ftrk", "ttnk", "apc" } + BeachUnitTypes = { "e1", "e2", "e3", "e4", "e1", "e2", "e3", "e4", "e1", "e2", "e3", "e4", "e1", "e2", "e3", "e4" } + ParadropUnitTypes = { "e1", "e1", "e2", "e3", "e4" } + ProducedUnitTypes = + { + { AlliedBarracks1, { "e1", "e3" } }, + { AlliedBarracks2, { "e1", "e3" } }, + { SovietBarracks1, { "dog", "e1", "e2", "e3", "e4", "shok" } }, + { SovietBarracks2, { "dog", "e1", "e2", "e3", "e4", "shok" } }, + { SovietBarracks3, { "dog", "e1", "e2", "e3", "e4", "shok" } }, + { AlliedWarFactory1, { "jeep", "1tnk", "2tnk", "arty", "ctnk" } }, + { SovietWarFactory1, { "3tnk", "4tnk", "v2rl", "ttnk", "apc" } } + } +end +ParadropPlaneType = "badr" +ParadropWaypointCount = 8 + +SendSovietUnits = function(entryCell, unitTypes, interval) + local units = Reinforcements.Reinforce(soviets, unitTypes, entryCell, entryCell, interval) + local team = Team.New(units) + Team.AddEventHandler(team.OnAllKilled, function() + SendSovietUnits(entryCell, unitTypes, interval) + end) + Team.Do(team, function(a) + Actor.OnDamaged(a, function() + if not Actor.CargoIsEmpty(a) then + Actor.Stop(a) + Actor.UnloadCargo(a, true) + end + end) + Actor.OnIdle(a, function() Actor.AttackMove(a, AlliedTechnologyCenter.Location) end) + end) +end + +ShipAlliedUnits = function() + local transport, reinforcements = Reinforcements.Insert(allies, "lst", { "1tnk", "1tnk", "jeep", "2tnk", "2tnk" }, { LstEntry.Location, LstUnload.Location }, { LstEntry.Location }) + Utils.Do(reinforcements, function(a) Actor.OnIdle(a, Actor.Hunt) end) + OpenRA.RunAfterDelay(60 * 25, ShipAlliedUnits) +end + +ParadropSovietUnits = function() + local lz = Map.GetNamedActor("Paradrop" .. OpenRA.GetRandomInteger(1, ParadropWaypointCount - 1)).Location + local plane, passengers = SupportPowers.Paradrop(soviets, ParadropPlaneType, ParadropUnitTypes, Map.GetRandomEdgeCell(), lz) + Utils.Do(passengers, function(a) Actor.OnIdle(a, Actor.Hunt) end) + OpenRA.RunAfterDelay(35 * 25, ParadropSovietUnits) +end + +ProduceUnits = function() + Utils.Do(ProducedUnitTypes, function(t) + local factory = t[1] + if not Actor.IsDead(factory) and not Production.PerFactoryQueueIsBusy(factory) then + local unitType = t[2][OpenRA.GetRandomInteger(1, #t[2] + 1)] + Production.BuildWithPerFactoryQueue(factory, unitType) + end + end) + OpenRA.RunAfterDelay(15, ProduceUnits) +end + +SetupAlliedUnits = function() + for a in Utils.Enumerate(Map.GetNamedActors()) do + if Actor.Owner(a) == allies then + if Actor.HasTrait(a, "LuaScriptEvents") then + a:AddTrait(OpenRA.New("Invulnerable")) -- todo: replace + end + Actor.SetStance(a, "Defend") + end + end +end + +SetupFactories = function() + Utils.Do(ProducedUnitTypes, function(pair) + Actor.OnProduced(pair[1], function(self, other, ex) + Actor.Hunt(other) + Actor.OnDamaged(other, function() + if not Actor.CargoIsEmpty(other) then + Actor.Stop(other) + Actor.UnloadCargo(other, true) + end + end) + end) + end) +end + +ChronoshiftAlliedUnits = function() + local cells = Map.ExpandFootprint({ ChronoshiftLocation.Location }, false) + local units = { } + for i = 1, #cells do + local unit = Actor.Create("2tnk", { Owner = allies, Facing = { 0, "Int32" } }) + Actor.OnIdle(unit, Actor.Hunt) + table.insert(units, { unit, cells[i] }) + end + SupportPowers.Chronoshift(units, Chronosphere) + OpenRA.RunAfterDelay(60 * 25, ChronoshiftAlliedUnits) +end + +ticks = 0 +speed = 5 + +Tick = function() + ticks = ticks + 1 + + local t = (ticks + 45) % (360 * speed) * (math.pi / 180) / speed; + OpenRA.SetViewportCenterPosition(WPos.op_Addition(viewportOrigin, WVec.New(19200 * math.sin(t), 20480 * math.cos(t)))) + + if ticks % 150 == 0 then + Utils.Do(Actor.ActorsWithTrait("AttackBase"), function(a) + if Actor.IsIdle(a) and not Map.IsNamedActor(a) and not Actor.IsDead(a) and Actor.IsInWorld(a) and (Actor.Owner(a) == soviets or Actor.Owner(a) == allies) then + Actor.Hunt(a) + end + end) + end +end + +WorldLoaded = function() + allies = OpenRA.GetPlayer("Allies") + soviets = OpenRA.GetPlayer("Soviets") + + viewportOrigin = OpenRA.GetViewportCenterPosition() + + SetupAlliedUnits() + SetupFactories() + ProduceUnits() + ShipAlliedUnits() + ParadropSovietUnits() + OpenRA.RunAfterDelay(5 * 25, ChronoshiftAlliedUnits) + + OpenRA.GiveCash(allies, 1000000) + OpenRA.GiveCash(soviets, 1000000) + + SendSovietUnits(Entry1.Location, UnitTypes, 50) + SendSovietUnits(Entry2.Location, UnitTypes, 50) + SendSovietUnits(Entry3.Location, UnitTypes, 50) + SendSovietUnits(Entry4.Location, UnitTypes, 50) + SendSovietUnits(Entry5.Location, UnitTypes, 50) + SendSovietUnits(Entry6.Location, UnitTypes, 50) + SendSovietUnits(Entry7.Location, BeachUnitTypes, 15) +end \ No newline at end of file diff --git a/mods/ra/maps/desert-shellmap/map.bin b/mods/ra/maps/desert-shellmap/map.bin index 66f210f4cdbe3c28c95eb6d756b62ecd1206b109..e11ce7baa2a4c1bfc6e74254a879a077da3a8b36 100644 GIT binary patch literal 81925 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 ZTq1CZz$F5g2wWm?iNGZS|DzE2{{W}B1k3;c literal 81925 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 LR|x!nL*V}g<~H3a diff --git a/mods/ra/maps/desert-shellmap/map.yaml b/mods/ra/maps/desert-shellmap/map.yaml index e00b3c7f9c..df096a95d7 100644 --- a/mods/ra/maps/desert-shellmap/map.yaml +++ b/mods/ra/maps/desert-shellmap/map.yaml @@ -61,9 +61,9 @@ Actors: Actor4: rock4 Location: 25,45 Owner: Neutral - Actor6: rock2 - Location: 34,42 - Owner: Neutral + Actor307: brik + Location: 40,74 + Owner: Allies Actor5: rock6 Location: 34,45 Owner: Neutral @@ -73,11 +73,8 @@ Actors: Actor24: v22 Location: 31,52 Owner: Neutral - Actor9: tc01 - Location: 97,69 - Owner: Neutral Actor78: 2tnk - Location: 77,72 + Location: 77,68 Owner: Allies Facing: 0 Actor23: v23 @@ -89,12 +86,6 @@ Actors: Actor13: oilb Location: 60,46 Owner: Neutral - Actor14: oilb - Location: 67,51 - Owner: Neutral - Actor15: oilb - Location: 59,33 - Owner: Neutral Actor16: oilb Location: 41,46 Owner: Neutral @@ -122,8 +113,8 @@ Actors: Actor22: v29 Location: 26,49 Owner: Neutral - Actor25: barl - Location: 69,53 + Actor14: oilb + Location: 26,37 Owner: Neutral Actor26: barl Location: 63,35 @@ -134,70 +125,54 @@ Actors: Actor333: syrf Location: 67,95 Owner: Allies - Actor198: sbag - Location: 68,63 + Actor53: brik + Location: 70,63 Owner: Allies - Actor165: sbag - Location: 50,61 + Actor254: fenc + Location: 96,97 Owner: Allies - Actor177: sbag - Location: 53,59 + Actor90: brik + Location: 92,70 Owner: Allies - Actor167: sbag - Location: 51,61 + Actor252: fenc + Location: 95,97 Owner: Allies - Actor30: sbag - Location: 41,61 + Actor10: gun + Location: 64,63 Owner: Allies - Actor194: sbag - Location: 60,60 + Facing: 0 + Actor153: apwr + Location: 93,87 Owner: Allies - Actor160: brik - Location: 87,75 + Actor49: brik + Location: 71,63 Owner: Allies - Actor202: sbag - Location: 69,65 - Owner: Allies - Actor164: cycl - Location: 58,66 - Owner: Neutral - Actor29: sbag - Location: 41,62 + Actor33: gun + Location: 85,69 Owner: Allies + Facing: 0 Actor40: dome Location: 55,19 Owner: Soviets Actor41: brl3 Location: 56,43 Owner: Neutral - Actor180: sbag - Location: 57,59 + Actor71: brik + Location: 70,64 Owner: Allies - Actor38: brik - Location: 83,73 + Actor325: e3 + Location: 76,70 Owner: Allies - Actor230: cycl - Location: 55,66 - Owner: Neutral - Actor55: sbag - Location: 39,63 - Owner: Allies - Actor47: brik - Location: 74,73 - Owner: Allies - Actor32: sbag - Location: 36,68 - Owner: Allies - Actor39: gun - Location: 75,72 + Actor28: gun + Location: 74,67 Owner: Allies Facing: 0 Actor50: apwr Location: 51,14 Owner: Soviets - Actor153: apwr - Location: 87,84 - Owner: Allies + Entry1: waypoint + Location: 1,50 + Owner: Neutral Actor63: tsla Location: 48,31 Owner: Soviets @@ -228,17 +203,14 @@ Actors: Actor70: afld Location: 47,24 Owner: Soviets - Actor79: barr + SovietBarracks3: barr Location: 41,27 Owner: Soviets - Actor80: proc - Location: 37,20 - Owner: Soviets Actor81: rock7 Location: 53,19 Owner: Neutral - Actor201: sbag - Location: 69,64 + Actor48: brik + Location: 72,63 Owner: Allies Actor85: powr Location: 49,14 @@ -249,63 +221,49 @@ Actors: Actor52: powr Location: 54,14 Owner: Soviets - Actor205: sbag - Location: 35,70 + Actor74: brik + Location: 89,70 Owner: Allies Actor88: t08 Location: 87,47 Owner: Neutral - Actor181: sbag - Location: 58,59 + Actor65: brik + Location: 69,64 Owner: Allies - Actor219: sbag - Location: 40,64 + Actor303: mrj + Location: 61,60 Owner: Allies + Facing: 0 Actor87: tc01 Location: 92,50 Owner: Neutral - Actor86: mine - Location: 30,42 - Owner: Neutral - ViewportTarget1: waypoint - Location: 37,76 - Owner: Neutral - ViewportTarget2: waypoint - Location: 70,78 - Owner: Neutral - ViewportTarget3: waypoint - Location: 85,55 - Owner: Neutral - ViewportTarget4: waypoint - Location: 59,33 - Owner: Neutral - ViewportTarget5: waypoint - Location: 38,55 - Owner: Neutral - Actor203: sbag - Location: 35,68 + Actor306: brik + Location: 40,75 Owner: Allies + Actor163: tran.husk2 + Location: 14,55 + Owner: Allies + Actor15: oilb + Location: 56,33 + Owner: Neutral + Actor164: flare + Location: 14,56 + Owner: Neutral Actor62: apwr Location: 38,17 Owner: Soviets - Actor213: sbag - Location: 35,72 + Actor72: brik + Location: 87,70 Owner: Allies Actor253: arty Location: 44,68 Owner: Allies Facing: 0 - Actor192: sbag - Location: 59,59 - Owner: Allies - Actor200: sbag + Actor64: brik Location: 69,63 Owner: Allies - Actor204: sbag - Location: 35,69 - Owner: Allies - Actor175: sbag - Location: 52,60 + Actor47: brik + Location: 73,63 Owner: Allies Actor116: mine Location: 78,21 @@ -324,26 +282,17 @@ Actors: Actor97: rock2 Location: 12,75 Owner: Neutral - AttackLocation: waypoint - Location: 55,67 - Owner: Neutral - CoastWP1: waypoint - Location: 1,79 - Owner: Neutral - CoastWP2: waypoint - Location: 36,81 - Owner: Neutral - Actor206: sbag - Location: 35,71 + Actor73: brik + Location: 88,70 Owner: Allies - Actor214: sbag - Location: 36,72 + Actor51: brik + Location: 86,70 Owner: Allies - Actor216: sbag - Location: 37,73 + Actor176: brik + Location: 85,70 Owner: Allies - Actor215: sbag - Location: 37,72 + Actor175: brik + Location: 85,71 Owner: Allies Actor37: rock5 Location: 35,43 @@ -363,9 +312,6 @@ Actors: Actor101: apwr Location: 115,38 Owner: Soviets - Actor105: silo - Location: 35,21 - Owner: Soviets Actor110: fcom Location: 106,44 Owner: Soviets @@ -402,10 +348,10 @@ Actors: Actor117: fix Location: 106,34 Owner: Soviets - Actor118: weap + SovietWarFactory1: weap Location: 106,29 Owner: Soviets - Actor119: barr + SovietBarracks2: barr Location: 102,30 Owner: Soviets Actor136: v2rl @@ -493,36 +439,30 @@ Actors: Actor147: rock1 Location: 118,54 Owner: Neutral - Actor263: powr - Location: 52,74 + Actor167: powr + Location: 54,74 Owner: Allies - Actor148: pbox.e1 + Actor39: pbox.e1 Location: 70,89 Owner: Allies - Actor51: miss + AlliedTechnologyCenter: miss Location: 56,68 Owner: Neutral Actor152: 1tnk Location: 69,85 Owner: Allies Facing: 110 - Actor155: apwr - Location: 84,84 + Actor150: apwr + Location: 94,90 Owner: Allies - Paradrop1Entry: waypoint - Location: 63,30 - Owner: Neutral - Paradrop1LZ: waypoint - Location: 63,88 - Owner: Neutral - Actor149: pbox.e1 - Location: 67,84 + Actor35: pbox.e1 + Location: 68,85 Owner: Allies - Actor156: pbox.e1 - Location: 94,91 + Actor178: pbox.e1 + Location: 77,76 Owner: Allies - Actor49: brik - Location: 72,73 + Actor300: brik + Location: 48,77 Owner: Allies Actor186: 3tnk Location: 107,50 @@ -531,35 +471,16 @@ Actors: Actor174: tc01 Location: 98,37 Owner: Neutral - Actor159: fact - Location: 75,86 + Actor25: fact + Location: 86,84 Owner: Allies - Actor74: cycl - Location: 60,66 - Owner: Neutral - Actor71: cycl - Location: 54,69 - Owner: Neutral - Actor92: sbag - Location: 55,59 + Actor105: brik + Location: 94,70 Owner: Allies - Actor76: silo - Location: 83,81 + Actor154: silo + Location: 82,86 Owner: Allies - Actor120: cycl - Location: 59,66 - Owner: Neutral - Actor42: gun - Location: 84,72 - Owner: Allies - Facing: 0 - Actor65: cycl - Location: 54,68 - Owner: Neutral - Actor48: brik - Location: 73,73 - Owner: Allies - Actor169: barr + SovietBarracks1: barr Location: 109,48 Owner: Soviets Actor170: kenn @@ -571,26 +492,20 @@ Actors: Actor182: rock6 Location: 96,45 Owner: Neutral - Actor45: brik - Location: 75,73 - Owner: Allies Chronosphere: pdox Location: 78,91 Owner: Allies - Actor313: brik - Location: 56,79 + Actor298: brik + Location: 48,78 Owner: Allies - AlliedWarFactory: weap + AlliedWarFactory1: weap Location: 75,81 Owner: Allies - Actor178: pbox.e1 - Location: 101,81 + Actor156: pbox.e1 + Location: 52,71 Owner: Allies - Actor31: sbag - Location: 39,64 - Owner: Allies - Actor157: gap - Location: 81,92 + Actor343: brik + Location: 82,93 Owner: Allies Actor187: ftur Location: 104,47 @@ -598,11 +513,11 @@ Actors: Actor342: lst Location: 67,98 Owner: Allies - Actor90: sbag - Location: 54,59 + Actor86: brik + Location: 91,70 Owner: Allies - Actor326: brik - Location: 49,77 + Actor216: brik + Location: 57,80 Owner: Allies Actor188: ftur Location: 107,52 @@ -611,14 +526,11 @@ Actors: Location: 76,92 Owner: Allies Facing: 150 - Actor172: apwr - Location: 81,87 + Actor155: apwr + Location: 90,87 Owner: Allies - Actor89: atek - Location: 68,73 - Owner: Allies - Actor324: brik - Location: 47,77 + Actor213: brik + Location: 60,80 Owner: Allies Actor196: pt Location: 55,92 @@ -634,20 +546,14 @@ Actors: Location: 30,88 Owner: Allies Facing: 64 - Actor150: apwr - Location: 81,84 - Owner: Allies Actor199: e1 Location: 72,83 Owner: Allies - Actor171: cycl - Location: 56,66 - Owner: Neutral - Actor151: apwr - Location: 87,87 + Actor89: apwr + Location: 93,84 Owner: Allies - Actor173: apwr - Location: 84,87 + Actor161: powr + Location: 89,90 Owner: Allies Actor84: apwr Location: 38,9 @@ -673,32 +579,29 @@ Actors: Actor191: apwr Location: 26,9 Owner: Soviets - Actor179: sbag - Location: 56,59 + Actor120: brik + Location: 95,70 Owner: Allies - Actor161: sbag - Location: 37,68 + Actor9: brik + Location: 94,71 Owner: Allies - Actor168: sbag - Location: 51,60 + Actor80: brik + Location: 90,70 Owner: Allies - Actor195: sbag - Location: 67,63 + Actor251: fenc + Location: 94,97 Owner: Allies - Actor163: cycl - Location: 56,71 - Owner: Neutral - Actor176: sbag - Location: 53,60 + Actor92: brik + Location: 93,70 Owner: Allies - Actor325: brik - Location: 48,77 + Actor214: brik + Location: 59,80 Owner: Allies - Actor193: sbag - Location: 59,60 + Actor149: apwr + Location: 92,93 Owner: Allies - Actor207: tran.husk2 - Location: 43,80 + Actor38: brik + Location: 72,67 Owner: Allies Actor208: e7 Location: 39,81 @@ -714,108 +617,40 @@ Actors: Location: 41,82 Owner: Allies Facing: 90 - Actor212: flare - Location: 43,79 - Owner: Neutral - OffmapAttackerSpawn1: waypoint - Location: 10,1 - Owner: Neutral - OffmapAttackerSpawn2: waypoint - Location: 84,1 - Owner: Neutral - OffmapAttackerSpawn3: waypoint - Location: 1,50 - Owner: Neutral + Actor36: brik + Location: 72,66 + Owner: Allies + Actor228: mgg + Location: 49,63 + Owner: Allies + Facing: 0 Actor255: e1 Location: 67,76 Owner: Allies Actor77: e1 Location: 78,74 Owner: Allies - HeavyTankWP: waypoint - Location: 79,69 - Owner: Neutral - Actor220: apwr - Location: 116,80 - Owner: Allies Actor82: 2tnk - Location: 82,72 + Location: 82,69 Owner: Allies Facing: 0 - HeavyTankSpawn: waypoint - Location: 80,45 - Owner: Neutral - Actor166: cycl - Location: 57,66 - Owner: Neutral - MediumTankChronoSpawn: waypoint - Location: 80,65 - Owner: Neutral - Actor221: apwr - Location: 113,80 + Actor30: pbox.e1 + Location: 47,77 Owner: Allies - Actor64: cycl - Location: 54,67 - Owner: Neutral - Actor35: pbox.e1 - Location: 80,73 - Owner: Allies - Mig11: waypoint - Location: 94,1 - Owner: Neutral - Mig12: waypoint - Location: 68,33 - Owner: Neutral - Mig22: waypoint - Location: 70,35 - Owner: Neutral - Mig13: waypoint - Location: 41,38 - Owner: Neutral - Mig14: waypoint - Location: 1,26 - Owner: Neutral - Mig23: waypoint - Location: 41,40 - Owner: Neutral - Mig24: waypoint - Location: 1,28 - Owner: Neutral - Actor28: sbag - Location: 40,62 - Owner: Allies - Actor10: sbag - Location: 39,62 + Actor29: pbox.e1 + Location: 42,75 Owner: Allies Actor217: sbag Location: 43,67 Owner: Allies - Mig21: waypoint - Location: 96,3 - Owner: Neutral - Actor121: oilb - Location: 103,74 - Owner: Allies - Actor158: oilb - Location: 109,76 - Owner: Allies - Chinook1Entry: waypoint - Location: 44,126 - Owner: Neutral - Chinook2Entry: waypoint - Location: 47,126 - Owner: Neutral - Paradrop2LZ: waypoint - Location: 56,75 - Owner: Neutral - Paradrop2Entry: waypoint - Location: 56,22 + Actor158: mine + Location: 110,78 Owner: Neutral Actor299: e1 Location: 50,70 Owner: Allies - Actor312: brik - Location: 56,78 + Actor297: brik + Location: 49,78 Owner: Allies Actor234: sbag Location: 53,63 @@ -823,30 +658,18 @@ Actors: Actor223: sbag Location: 53,62 Owner: Allies - Actor227: sbag - Location: 60,61 + Actor151: apwr + Location: 91,90 Owner: Allies - Actor228: sbag - Location: 60,62 + Actor31: t08 + Location: 56,58 + Owner: Neutral + Actor311: brik + Location: 41,74 Owner: Allies - Actor229: sbag - Location: 67,64 + Actor302: brik + Location: 41,75 Owner: Allies - Actor154: cycl - Location: 55,71 - Owner: Neutral - Actor72: cycl - Location: 54,70 - Owner: Neutral - Actor73: cycl - Location: 54,71 - Owner: Neutral - Actor302: rock2 - Location: 70,61 - Owner: Neutral - Actor306: rock3 - Location: 25,66 - Owner: Neutral Actor295: jeep Location: 37,67 Owner: Allies @@ -855,8 +678,8 @@ Actors: Location: 58,65 Owner: Allies Facing: 192 - Actor314: brik - Location: 47,76 + Actor215: brik + Location: 58,80 Owner: Allies Actor233: 2tnk Location: 66,62 @@ -880,9 +703,6 @@ Actors: Actor245: sbag Location: 58,63 Owner: Allies - Actor235: cycl - Location: 54,66 - Owner: Neutral Actor249: arty Location: 57,63 Owner: Allies @@ -891,13 +711,10 @@ Actors: Location: 54,63 Owner: Allies Facing: 16 - Actor247: cycl - Location: 57,71 - Owner: Neutral Actor250: sbag Location: 44,67 Owner: Allies - AlliedBarracks: tent + AlliedBarracks2: tent Location: 50,66 Owner: Allies Actor66: gap @@ -906,23 +723,8 @@ Actors: Actor218: sbag Location: 43,68 Owner: Allies - Actor251: sbag - Location: 45,67 - Owner: Allies - Actor252: sbag - Location: 45,68 - Owner: Allies - Actor246: cycl - Location: 60,69 - Owner: Neutral - Actor231: cycl - Location: 60,67 - Owner: Neutral - Actor232: cycl - Location: 60,68 - Owner: Neutral - Actor328: apwr - Location: 122,77 + Actor229: fenc + Location: 93,97 Owner: Allies Actor264: v27 Location: 20,49 @@ -942,9 +744,9 @@ Actors: Actor269: v26 Location: 21,54 Owner: Neutral - Actor281: powr - Location: 54,74 - Owner: Allies + Entry2: waypoint + Location: 1,27 + Owner: Neutral Actor270: v28 Location: 18,49 Owner: Neutral @@ -978,7 +780,7 @@ Actors: Actor280: c10 Location: 23,55 Owner: Neutral - Actor184: tent + AlliedBarracks1: tent Location: 83,75 Owner: Allies Actor282: e1 @@ -996,20 +798,20 @@ Actors: Actor286: e1 Location: 39,67 Owner: Allies - Actor287: e3 + Actor287: brik Location: 50,62 Owner: Allies Actor288: e3 Location: 40,63 Owner: Allies - Actor289: e3 + Actor289: brik + Location: 60,60 + Owner: Allies + Actor291: brik Location: 59,61 Owner: Allies - Actor290: e3 - Location: 52,61 - Owner: Allies - Actor291: e3 - Location: 57,60 + Actor290: brik + Location: 60,61 Owner: Allies Actor292: e3 Location: 68,64 @@ -1017,11 +819,11 @@ Actors: Actor293: e3 Location: 36,69 Owner: Allies - Actor311: brik - Location: 50,77 + Actor219: brik + Location: 57,79 Owner: Allies - Chinook2LZ: hpad - Location: 47,71 + Actor45: brik + Location: 73,64 Owner: Allies Actor226: 2tnk Location: 62,60 @@ -1036,7 +838,7 @@ Actors: Owner: Allies Facing: 30 Actor236: jeep - Location: 46,62 + Location: 45,62 Owner: Allies Facing: 16 Actor238: 2tnk @@ -1044,139 +846,115 @@ Actors: Owner: Allies Facing: 40 Actor224: 2tnk - Location: 43,61 + Location: 41,62 Owner: Allies Facing: 0 Actor237: jeep Location: 63,63 Owner: Allies Facing: 0 - Actor303: hbox.e1 - Location: 60,72 - Owner: Allies Actor304: e1 Location: 57,72 Owner: Allies Actor305: e1 Location: 61,70 Owner: Allies - Actor301: rock5 - Location: 72,66 - Owner: Neutral + Actor43: brik + Location: 73,65 + Owner: Allies Actor294: e1 Location: 58,76 Owner: Allies - Chinook1LZ: hpad - Location: 44,71 + Actor34: brik + Location: 73,66 Owner: Allies - Actor310: brik - Location: 51,77 + Actor220: brik + Location: 57,78 Owner: Allies - Actor309: brik - Location: 52,77 + Actor222: brik + Location: 57,77 Owner: Allies - Actor307: brik - Location: 53,77 - Owner: Allies - Actor300: brik - Location: 54,77 - Owner: Allies - Actor298: brik - Location: 55,77 - Owner: Allies - Actor297: brik + Actor230: brik Location: 56,77 Owner: Allies - Actor315: sbag - Location: 38,73 + Actor231: brik + Location: 55,77 Owner: Allies - Actor316: sbag - Location: 39,73 + Actor232: brik + Location: 54,77 Owner: Allies - Actor317: sbag - Location: 40,73 + Actor246: brik + Location: 52,77 Owner: Allies - Actor318: sbag - Location: 40,74 + Actor160: brik + Location: 86,71 Owner: Allies - Actor319: sbag - Location: 40,75 + Actor179: brik + Location: 68,84 Owner: Allies - Actor320: sbag - Location: 41,75 + Actor180: brik + Location: 69,84 + Owner: Allies + Actor181: brik + Location: 69,83 + Owner: Allies + Actor192: brik + Location: 68,83 + Owner: Allies + Actor198: brik + Location: 68,82 Owner: Allies Actor321: e1 Location: 45,76 Owner: Allies - Actor222: powr + Actor165: powr Location: 50,74 Owner: Allies Actor257: arty - Location: 72,74 + Location: 72,68 Owner: Allies Facing: 0 - Actor33: brik - Location: 86,73 + Actor344: e1 + Location: 78,69 Owner: Allies - Actor43: brik - Location: 76,73 - Owner: Allies - Actor53: brik - Location: 71,73 + Actor301: brik + Location: 49,77 Owner: Allies Actor256: gap Location: 74,75 Owner: Allies - Actor44: t08 - Location: 37,71 - Owner: Neutral + Actor313: brik + Location: 37,70 + Owner: Allies Actor46: tc01 Location: 49,79 Owner: Neutral - Actor258: t08 - Location: 54,60 - Owner: Neutral + Actor258: brik + Location: 76,94 + Owner: Allies Actor259: rock6 Location: 53,81 Owner: Neutral Actor260: rock2 Location: 46,85 Owner: Neutral - Actor254: proc - Location: 84,81 + Actor32: proc + Location: 90,72 + Owner: Allies + Actor168: brik + Location: 95,71 Owner: Allies - Actor261: mine - Location: 104,90 - Owner: Neutral - Actor308: mine - Location: 111,89 - Owner: Neutral Actor322: oilb Location: 58,78 Owner: Allies - Actor323: oilb - Location: 109,68 - Owner: Allies - Actor327: apwr - Location: 119,80 - Owner: Allies - Actor262: apwr - Location: 119,77 - Owner: Allies + Actor121: mine + Location: 103,76 + Owner: Neutral Actor329: mine Location: 90,21 Owner: Neutral - Actor330: apwr - Location: 113,77 - Owner: Allies - Actor331: apwr - Location: 116,77 - Owner: Allies - Actor332: fix - Location: 69,80 - Owner: Allies - Actor34: brik - Location: 85,73 + Actor195: hpad + Location: 70,75 Owner: Allies Actor75: oilb Location: 4,126 @@ -1205,113 +983,316 @@ Actors: Actor341: dome Location: 63,73 Owner: Allies - Actor36: brik - Location: 84,73 + Actor166: wood + Location: 17,52 + Owner: Neutral + Actor281: brik + Location: 50,78 Owner: Allies - Actor343: brik - Location: 70,73 + Actor235: brik + Location: 53,77 Owner: Allies - Actor344: brik - Location: 70,72 + Actor200: brik + Location: 68,81 Owner: Allies - Actor345: brik - Location: 69,72 + Actor201: brik + Location: 67,81 Owner: Allies - Actor346: brik - Location: 68,72 + Actor202: brik + Location: 66,81 Owner: Allies - Actor347: brik - Location: 67,72 + Actor203: brik + Location: 65,81 Owner: Allies - Actor348: brik - Location: 67,71 + Actor204: brik + Location: 64,81 Owner: Allies - Actor349: brik - Location: 67,70 + Actor205: brik + Location: 63,81 Owner: Allies - Actor350: brik - Location: 67,69 + Actor148: apwr + Location: 95,93 Owner: Allies - Actor351: brik - Location: 67,68 + Actor324: e3 + Location: 73,68 Owner: Allies - Actor352: brik - Location: 76,74 + Actor206: brik + Location: 63,80 Owner: Allies - Actor353: brik - Location: 75,74 + Actor207: brik + Location: 62,80 Owner: Allies - Actor354: brik - Location: 83,74 + Actor263: brik + Location: 51,78 Owner: Allies - Actor355: brik - Location: 84,74 + Actor247: brik + Location: 51,77 Owner: Allies - Actor356: brik - Location: 66,68 - Owner: Allies - Actor357: brik - Location: 66,69 - Owner: Allies - Actor358: brik - Location: 57,79 - Owner: Allies - Actor359: brik - Location: 57,78 - Owner: Allies - Actor360: brik - Location: 48,76 + Actor212: brik + Location: 61,80 Owner: Allies Actor361: pbox.e1 Location: 71,96 Owner: Allies - Actor362: silo - Location: 82,82 + Actor55: silo + Location: 81,85 Owner: Allies - Actor363: silo - Location: 83,82 + Actor76: silo + Location: 81,86 Owner: Allies - Actor364: silo - Location: 82,81 + Actor159: silo + Location: 82,85 Owner: Allies Actor365: hpad Location: 64,78 Owner: Allies - Actor366: apwr - Location: 122,80 + Actor221: fenc + Location: 92,97 + Owner: Allies + Actor345: e1 + Location: 80,69 + Owner: Allies + Actor193: fix + Location: 69,70 + Owner: Allies + Actor42: pbox.e1 + Location: 67,70 + Owner: Allies + Actor262: fenc + Location: 97,97 + Owner: Allies + Actor309: fenc + Location: 98,97 + Owner: Allies + Actor310: fenc + Location: 98,96 + Owner: Allies + Entry7: waypoint + Location: 1,79 + Owner: Neutral + AttackDest: waypoint + Location: 55,69 + Owner: Neutral + Actor6: brik + Location: 73,67 + Owner: Allies + Actor312: brik + Location: 40,73 + Owner: Allies + Actor314: brik + Location: 37,69 + Owner: Allies + Actor319: brik + Location: 38,69 + Owner: Allies + Actor316: brik + Location: 38,73 + Owner: Allies + Actor315: brik + Location: 39,73 + Owner: Allies + Actor317: brik + Location: 37,73 + Owner: Allies + Actor318: brik + Location: 37,72 + Owner: Allies + Actor44: brik + Location: 37,71 + Owner: Allies + Actor320: brik + Location: 38,70 + Owner: Allies + Actor330: brik + Location: 79,94 + Owner: Allies + Actor328: brik + Location: 78,94 + Owner: Allies + Actor327: brik + Location: 77,94 + Owner: Allies + Actor331: brik + Location: 80,94 + Owner: Allies + Actor332: brik + Location: 80,93 + Owner: Allies + Actor157: brik + Location: 81,93 + Owner: Allies + Actor346: brik + Location: 75,94 + Owner: Allies + Actor347: brik + Location: 75,93 + Owner: Allies + Actor348: brik + Location: 75,92 + Owner: Allies + Actor349: brik + Location: 75,91 + Owner: Allies + Actor350: brik + Location: 75,90 + Owner: Allies + Actor351: brik + Location: 74,90 + Owner: Allies + Actor352: brik + Location: 73,90 + Owner: Allies + Actor353: brik + Location: 72,90 + Owner: Allies + Actor354: brik + Location: 72,89 + Owner: Allies + Actor355: brik + Location: 71,89 + Owner: Allies + Actor356: brik + Location: 72,88 + Owner: Allies + Actor357: brik + Location: 71,88 + Owner: Allies + Actor358: brik + Location: 82,92 + Owner: Allies + Actor359: brik + Location: 82,91 + Owner: Allies + Actor360: brik + Location: 82,90 + Owner: Allies + Actor362: brik + Location: 81,90 + Owner: Allies + Actor363: brik + Location: 81,91 + Owner: Allies + Actor364: gap + Location: 77,90 + Owner: Allies + Actor366: brik + Location: 59,60 Owner: Allies Actor367: brik - Location: 86,74 + Location: 58,60 Owner: Allies Actor368: brik - Location: 86,75 + Location: 57,60 Owner: Allies Actor369: brik - Location: 87,76 + Location: 56,60 Owner: Allies Actor370: brik - Location: 87,77 + Location: 55,60 Owner: Allies Actor371: brik - Location: 87,78 + Location: 54,60 Owner: Allies Actor372: brik - Location: 86,78 + Location: 53,60 Owner: Allies Actor373: brik - Location: 86,77 + Location: 52,60 Owner: Allies - Actor374: hpad - Location: 71,75 + Actor374: brik + Location: 52,61 Owner: Allies - Actor375: gun - Location: 51,72 + Actor375: brik + Location: 51,61 Owner: Allies - Facing: 48 - Actor376: gun - Location: 63,68 + Actor376: brik + Location: 50,61 Owner: Allies - Facing: 0 + Actor377: brik + Location: 49,61 + Owner: Allies + Actor378: brik + Location: 49,62 + Owner: Allies + Actor379: gun + Location: 37,68 + Owner: Allies + Actor380: gun + Location: 48,61 + Owner: Allies + Actor381: atek + Location: 76,87 + Owner: Allies + Actor194: powr + Location: 52,74 + Owner: Allies + Entry3: waypoint + Location: 10,1 + Owner: Neutral + Entry4: waypoint + Location: 84,1 + Owner: Neutral + Entry5: waypoint + Location: 126,27 + Owner: Neutral + Entry6: waypoint + Location: 46,1 + Owner: Neutral + Actor171: wood + Location: 17,53 + Owner: Neutral + Actor172: wood + Location: 17,54 + Owner: Neutral + Actor173: wood + Location: 17,55 + Owner: Neutral + Actor177: wood + Location: 17,56 + Owner: Neutral + LstEntry: waypoint + Location: 33,126 + Owner: Neutral + LstUnload: waypoint + Location: 60,93 + Owner: Neutral + Actor184: pbox.e1 + Location: 96,79 + Owner: Allies + Paradrop1: waypoint + Location: 70,50 + Owner: Neutral + Paradrop2: waypoint + Location: 39,50 + Owner: Neutral + Paradrop3: waypoint + Location: 81,60 + Owner: Neutral + Paradrop4: waypoint + Location: 28,64 + Owner: Neutral + Paradrop5: waypoint + Location: 63,89 + Owner: Neutral + Paradrop6: waypoint + Location: 22,77 + Owner: Neutral + Paradrop7: waypoint + Location: 64,69 + Owner: Neutral + Paradrop8: waypoint + Location: 80,78 + Owner: Neutral + ChronoshiftLocation: waypoint + Location: 80,65 + Owner: Neutral + Actor79: agun + Location: 70,65 + Owner: Allies + Actor118: agun + Location: 47,69 + Owner: Allies + Facing: 64 Smudges: @@ -1322,21 +1303,76 @@ Rules: -CrateSpawner: -SpawnMPUnits: -MPStartLocations: - DesertShellmapScript: + LuaScriptInterface: + LuaScripts: desert-shellmap.lua LoadWidgetAtGameStart: Widget: MAINMENU TRAN.Husk2: Burns: Damage: 0 - APC: - DesertShellmapAutoUnload: - MIG: - Plane: - Speed: 280 - BADR: - Invulnerable: MISS: Invulnerable: + APC: + Cargo: + InitialUnits: e1, e1, e2, e3, e4 + TENT: + ProductionQueue: + Type: Infantry + Group: Infantry + BuildSpeed: .4 + LowPowerSlowdown: 3 + BARR: + ProductionQueue: + Type: Infantry + Group: Infantry + BuildSpeed: .4 + LowPowerSlowdown: 3 + WEAP: + ProductionQueue: + Type: Vehicle + Group: Vehicle + BuildSpeed: .4 + LowPowerSlowdown: 3 + Ant: + Buildable: + Owner: soviet + Prerequisites: barr + Health: + HP: 200 + ^Vehicle: + GivesBounty: + Percentage: 0 + GainsExperience: + CostThreshold: + FirepowerModifier: + ArmorModifier: + SpeedModifier: + ^Tank: + GivesBounty: + Percentage: 0 + GainsExperience: + CostThreshold: + FirepowerModifier: + ArmorModifier: + SpeedModifier: + ^Infantry: + -Selectable: # short-term hack to make infantry not play die sounds until we fix RenderInfantry + GivesBounty: + Percentage: 0 + GainsExperience: + CostThreshold: + FirepowerModifier: + ArmorModifier: + SpeedModifier: + ^Ship: + GivesBounty: + Percentage: 0 + ^Plane: + GivesBounty: + Percentage: 0 + ^Building: + GivesBounty: + Percentage: 0 Sequences: diff --git a/mods/ra/maps/shellmap/map.bin b/mods/ra/maps/shellmap/map.bin deleted file mode 100644 index 99977abe5740c3c801d15d2589887e91e9cdf058..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81925 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