diff --git a/OpenRA.Editor/Form1.cs b/OpenRA.Editor/Form1.cs index 9e63ef1bee..c52f39e8e1 100644 --- a/OpenRA.Editor/Form1.cs +++ b/OpenRA.Editor/Form1.cs @@ -238,7 +238,9 @@ namespace OpenRA.Editor if (rsi != null && rsi.EditorPalette != null && rsi.EditorPalette.Contains("terrain")) templatePalette = palette; - var template = RenderUtils.RenderActor(info, tileset, templatePalette); + var race = Program.Rules.Actors["world"].Traits.WithInterface().First().Race; + var sequenceProvider = Program.Rules.Sequences[tileset.Id]; + var template = RenderUtils.RenderActor(info, sequenceProvider, tileset, templatePalette, race); var ibox = new PictureBox { Image = template.Bitmap, diff --git a/OpenRA.Editor/RenderUtils.cs b/OpenRA.Editor/RenderUtils.cs index 1111b4bd53..45b77c135a 100644 --- a/OpenRA.Editor/RenderUtils.cs +++ b/OpenRA.Editor/RenderUtils.cs @@ -46,9 +46,9 @@ namespace OpenRA.Editor return bitmap; } - public static ActorTemplate RenderActor(ActorInfo info, TileSet tileset, IPalette p) + public static ActorTemplate RenderActor(ActorInfo info, SequenceProvider sequenceProvider, TileSet tileset, IPalette p, string race) { - var image = info.Traits.Get().EditorImage(info); + var image = info.Traits.Get().EditorImage(info, sequenceProvider, race); using (var s = GlobalFileSystem.OpenWithExts(image, tileset.Extensions)) { var shp = new ShpTDSprite(s); diff --git a/OpenRA.Game/Graphics/SequenceProvider.cs b/OpenRA.Game/Graphics/SequenceProvider.cs index edc783e4c3..075d2cdd3e 100644 --- a/OpenRA.Game/Graphics/SequenceProvider.cs +++ b/OpenRA.Game/Graphics/SequenceProvider.cs @@ -42,6 +42,11 @@ namespace OpenRA.Graphics return seq; } + public bool HasSequence(string unitName) + { + return sequences.Value.ContainsKey(unitName); + } + public bool HasSequence(string unitName, string sequenceName) { UnitSequences unitSeq; diff --git a/OpenRA.Game/Map/ActorInitializer.cs b/OpenRA.Game/Map/ActorInitializer.cs index 5e88aec442..3e68491065 100755 --- a/OpenRA.Game/Map/ActorInitializer.cs +++ b/OpenRA.Game/Map/ActorInitializer.cs @@ -102,4 +102,14 @@ namespace OpenRA return world.Players.First(x => x.InternalName == PlayerName); } } + + // Allows maps / transformations to specify the race variant of an actor. + public class RaceInit : IActorInit + { + [FieldFromYamlKey] public readonly string Race; + + public RaceInit() { } + public RaceInit(string race) { Race = race; } + public string Value(World world) { return Race; } + } } diff --git a/OpenRA.Game/Player.cs b/OpenRA.Game/Player.cs index 85c22df9d8..3cb52d7f53 100644 --- a/OpenRA.Game/Player.cs +++ b/OpenRA.Game/Player.cs @@ -46,10 +46,10 @@ namespace OpenRA public Shroud Shroud; public World World { get; private set; } - static CountryInfo ChooseCountry(World world, string name) + static CountryInfo ChooseCountry(World world, string name, bool requireSelectable = true) { var selectableCountries = world.Map.Rules.Actors["world"].Traits - .WithInterface().Where(c => c.Selectable) + .WithInterface().Where(c => !requireSelectable || c.Selectable) .ToList(); return selectableCountries.FirstOrDefault(c => c.Race == name) @@ -82,7 +82,7 @@ namespace OpenRA Playable = pr.Playable; Spectating = pr.Spectating; botType = pr.Bot; - Country = ChooseCountry(world, pr.Race); + Country = ChooseCountry(world, pr.Race, false); } PlayerActor = world.CreateActor("Player", new TypeDictionary { new OwnerInit(this) }); diff --git a/OpenRA.Game/Traits/BodyOrientation.cs b/OpenRA.Game/Traits/BodyOrientation.cs index 2bf98ac4d9..98a33e87fb 100644 --- a/OpenRA.Game/Traits/BodyOrientation.cs +++ b/OpenRA.Game/Traits/BodyOrientation.cs @@ -40,7 +40,7 @@ namespace OpenRA.Traits return new WRot(WAngle.Zero, WAngle.Zero, WAngle.FromFacing(facing)); } - public object Create(ActorInitializer init) { return new BodyOrientation(init.Self, this); } + public object Create(ActorInitializer init) { return new BodyOrientation(init, this); } } public class BodyOrientation : IBodyOrientation @@ -50,9 +50,11 @@ namespace OpenRA.Traits [Sync] public int QuantizedFacings { get { return quantizedFacings.Value; } } - public BodyOrientation(Actor self, BodyOrientationInfo info) + public BodyOrientation(ActorInitializer init, BodyOrientationInfo info) { this.info = info; + var self = init.Self; + var race = init.Contains() ? init.Get() : self.Owner.Country.Race; quantizedFacings = Exts.Lazy(() => { @@ -64,7 +66,7 @@ namespace OpenRA.Traits if (qboi == null) throw new InvalidOperationException("Actor type '" + self.Info.Name + "' does not define a quantized body orientation."); - return qboi.QuantizedBodyFacings(self.World.Map.SequenceProvider, self.Info); + return qboi.QuantizedBodyFacings(self.Info, self.World.Map.SequenceProvider, race); }); } diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index 9edb9b8932..748de195d8 100644 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -289,7 +289,7 @@ namespace OpenRA.Traits WRot QuantizeOrientation(WRot orientation, int facings); } - public interface IQuantizeBodyOrientationInfo { int QuantizedBodyFacings(SequenceProvider sequenceProvider, ActorInfo ai); } + public interface IQuantizeBodyOrientationInfo { int QuantizedBodyFacings(ActorInfo ai, SequenceProvider sequenceProvider, string race); } public interface ITargetableInfo { @@ -334,6 +334,6 @@ namespace OpenRA.Traits public interface ILegacyEditorRenderInfo { string EditorPalette { get; } - string EditorImage(ActorInfo actor); + string EditorImage(ActorInfo actor, SequenceProvider sequenceProvider, string race); } } diff --git a/OpenRA.Mods.Cnc/Traits/Buildings/ProductionAirdrop.cs b/OpenRA.Mods.Cnc/Traits/Buildings/ProductionAirdrop.cs index 8740932aee..abdd00a0e9 100644 --- a/OpenRA.Mods.Cnc/Traits/Buildings/ProductionAirdrop.cs +++ b/OpenRA.Mods.Cnc/Traits/Buildings/ProductionAirdrop.cs @@ -27,13 +27,13 @@ namespace OpenRA.Mods.Cnc.Traits [Desc("Cargo aircraft used.")] [ActorReference] public readonly string ActorType = "c17"; - public override object Create(ActorInitializer init) { return new ProductionAirdrop(this, init.Self); } + public override object Create(ActorInitializer init) { return new ProductionAirdrop(init, this); } } class ProductionAirdrop : Production { - public ProductionAirdrop(ProductionAirdropInfo info, Actor self) - : base(info, self) { } + public ProductionAirdrop(ActorInitializer init, ProductionAirdropInfo info) + : base(init, info) { } public override bool Produce(Actor self, ActorInfo producee, string raceVariant) { diff --git a/OpenRA.Mods.Cnc/Traits/Render/RenderGunboat.cs b/OpenRA.Mods.Cnc/Traits/Render/RenderGunboat.cs index 37fbe9916f..2d57522e13 100644 --- a/OpenRA.Mods.Cnc/Traits/Render/RenderGunboat.cs +++ b/OpenRA.Mods.Cnc/Traits/Render/RenderGunboat.cs @@ -26,9 +26,9 @@ namespace OpenRA.Mods.Cnc.Traits public readonly string WakeLeftSequence = "wake-left"; public readonly string WakeRightSequence = "wake-right"; - public override object Create(ActorInitializer init) { return new RenderGunboat(init.Self, this); } + public override object Create(ActorInitializer init) { return new RenderGunboat(init, this); } - public int QuantizedBodyFacings(SequenceProvider sequenceProvider, ActorInfo ai) + public int QuantizedBodyFacings(ActorInfo ai, SequenceProvider sequenceProvider, string race) { return 2; } @@ -38,27 +38,27 @@ namespace OpenRA.Mods.Cnc.Traits { Animation left, right; - public RenderGunboat(Actor self, RenderGunboatInfo info) - : base(self) + public RenderGunboat(ActorInitializer init, RenderGunboatInfo info) + : base(init, info) { - var name = GetImage(self); - var facing = self.Trait(); - var turret = self.TraitsImplementing() + var name = GetImage(init.Self); + var facing = init.Self.Trait(); + var turret = init.Self.TraitsImplementing() .First(t => t.Name == info.Turret); - left = new Animation(self.World, name, () => turret.TurretFacing); + left = new Animation(init.World, name, () => turret.TurretFacing); left.Play(info.LeftSequence); Add(info.LeftSequence, new AnimationWithOffset(left, null, () => facing.Facing > 128, 0)); - right = new Animation(self.World, name, () => turret.TurretFacing); + right = new Animation(init.World, name, () => turret.TurretFacing); right.Play(info.RightSequence); Add(info.RightSequence, new AnimationWithOffset(right, null, () => facing.Facing <= 128, 0)); - var leftWake = new Animation(self.World, name); + var leftWake = new Animation(init.World, name); leftWake.PlayRepeating(info.WakeLeftSequence); Add(info.WakeLeftSequence, new AnimationWithOffset(leftWake, null, () => facing.Facing > 128, -87)); - var rightWake = new Animation(self.World, name); + var rightWake = new Animation(init.World, name); rightWake.PlayRepeating(info.WakeRightSequence); Add(info.WakeRightSequence, new AnimationWithOffset(rightWake, null, () => facing.Facing <= 128, -87)); } diff --git a/OpenRA.Mods.Common/Activities/Transform.cs b/OpenRA.Mods.Common/Activities/Transform.cs index cbe0e146e5..961ae74892 100644 --- a/OpenRA.Mods.Common/Activities/Transform.cs +++ b/OpenRA.Mods.Common/Activities/Transform.cs @@ -22,6 +22,7 @@ namespace OpenRA.Mods.Common.Activities public CVec Offset = CVec.Zero; public int Facing = 96; public string[] Sounds = { }; + public string Notification = null; public int ForceHealthPercentage = 0; public bool SkipMakeAnims = false; public string Race = null; @@ -51,6 +52,8 @@ namespace OpenRA.Mods.Common.Activities foreach (var s in Sounds) Sound.PlayToPlayer(self.Owner, s, self.CenterPosition); + Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech", Notification, self.Owner.Country.Race); + var init = new TypeDictionary { new LocationInit(self.Location + Offset), diff --git a/OpenRA.Mods.Common/Orders/PlaceBuildingOrderGenerator.cs b/OpenRA.Mods.Common/Orders/PlaceBuildingOrderGenerator.cs index b4571b498e..07e720662d 100644 --- a/OpenRA.Mods.Common/Orders/PlaceBuildingOrderGenerator.cs +++ b/OpenRA.Mods.Common/Orders/PlaceBuildingOrderGenerator.cs @@ -15,7 +15,6 @@ using OpenRA.Graphics; using OpenRA.Mods.Common.Graphics; using OpenRA.Mods.Common.Traits; using OpenRA.Primitives; -using OpenRA.Traits; namespace OpenRA.Mods.Common.Orders { @@ -24,10 +23,12 @@ namespace OpenRA.Mods.Common.Orders readonly Actor producer; readonly string building; readonly BuildingInfo buildingInfo; + readonly string race; + readonly Sprite buildOk; + readonly Sprite buildBlocked; IActorPreview[] preview; - Sprite buildOk, buildBlocked; - bool initialized = false; + bool initialized; public PlaceBuildingOrderGenerator(ProductionQueue queue, string name) { @@ -40,7 +41,12 @@ namespace OpenRA.Mods.Common.Orders var map = producer.World.Map; var tileset = producer.World.TileSet.Id.ToLowerInvariant(); - buildingInfo = map.Rules.Actors[building].Traits.Get(); + + var info = map.Rules.Actors[building]; + buildingInfo = info.Traits.Get(); + + var buildableInfo = info.Traits.Get(); + race = buildableInfo.ForceRace ?? queue.MostLikelyProducer().Trait.Race; buildOk = map.SequenceProvider.GetSequence("overlay", "build-valid-{0}".F(tileset)).GetSprite(0); buildBlocked = map.SequenceProvider.GetSequence("overlay", "build-invalid").GetSprite(0); @@ -122,7 +128,12 @@ namespace OpenRA.Mods.Common.Orders { if (!initialized) { - var init = new ActorPreviewInitializer(rules.Actors[building], producer.Owner, wr, new TypeDictionary()); + var td = new TypeDictionary() + { + new RaceInit(race) + }; + + var init = new ActorPreviewInitializer(rules.Actors[building], producer.Owner, wr, td); preview = rules.Actors[building].Traits.WithInterface() .SelectMany(rpi => rpi.RenderPreview(init)) .ToArray(); diff --git a/OpenRA.Mods.Common/Traits/Buildable.cs b/OpenRA.Mods.Common/Traits/Buildable.cs index 605c623254..cbb711bdc7 100644 --- a/OpenRA.Mods.Common/Traits/Buildable.cs +++ b/OpenRA.Mods.Common/Traits/Buildable.cs @@ -36,6 +36,9 @@ namespace OpenRA.Mods.Common.Traits [Desc("What the unit should start doing. Warning: If this is not a harvester", "it will break if you use FindResources.")] public readonly string InitialActivity = null; + [Desc("Force a specific race variant, overriding the race of the producing actor.")] + public readonly string ForceRace = null; + // TODO: UI fluff; doesn't belong here public readonly int BuildPaletteOrder = 9999; } diff --git a/OpenRA.Mods.Common/Traits/Player/ClassicProductionQueue.cs b/OpenRA.Mods.Common/Traits/Player/ClassicProductionQueue.cs index 4bb1068451..40907694ad 100644 --- a/OpenRA.Mods.Common/Traits/Player/ClassicProductionQueue.cs +++ b/OpenRA.Mods.Common/Traits/Player/ClassicProductionQueue.cs @@ -74,6 +74,16 @@ namespace OpenRA.Mods.Common.Traits return isActive ? base.BuildableItems() : NoItems; } + public override TraitPair MostLikelyProducer() + { + return self.World.ActorsWithTrait() + .Where(x => x.Actor.Owner == self.Owner + && x.Trait.Info.Produces.Contains(Info.Type)) + .OrderByDescending(x => x.Actor.IsPrimaryBuilding()) + .ThenByDescending(x => x.Actor.ActorID) + .FirstOrDefault(); + } + protected override bool BuildUnit(string name) { // Find a production structure to build this actor @@ -97,7 +107,7 @@ namespace OpenRA.Mods.Common.Traits foreach (var p in producers.Where(p => !p.Actor.IsDisabled())) { - if (p.Trait.Produce(p.Actor, ai, Race)) + if (p.Trait.Produce(p.Actor, ai, p.Trait.Race)) { FinishProduction(); return true; diff --git a/OpenRA.Mods.Common/Traits/Player/PlaceBuilding.cs b/OpenRA.Mods.Common/Traits/Player/PlaceBuilding.cs index eb3b359729..aa4c0c3a2e 100644 --- a/OpenRA.Mods.Common/Traits/Player/PlaceBuilding.cs +++ b/OpenRA.Mods.Common/Traits/Player/PlaceBuilding.cs @@ -38,8 +38,14 @@ namespace OpenRA.Mods.Common.Traits if (queue == null) return; + var producer = queue.MostLikelyProducer(); + var race = producer.Trait != null ? producer.Trait.Race : self.Owner.Country.Race; var buildingInfo = unit.Traits.Get(); + var buildableInfo = unit.Traits.GetOrDefault(); + if (buildableInfo != null && buildableInfo.ForceRace != null) + race = buildableInfo.ForceRace; + if (order.OrderString == "LineBuild") { var playSounds = true; @@ -49,7 +55,7 @@ namespace OpenRA.Mods.Common.Traits { new LocationInit(t), new OwnerInit(order.Player), - new RaceInit(queue.Race) + new RaceInit(race) }); if (playSounds) @@ -69,14 +75,16 @@ namespace OpenRA.Mods.Common.Traits { new LocationInit(order.TargetLocation), new OwnerInit(order.Player), - new RaceInit(queue.Race), + new RaceInit(race), }); foreach (var s in buildingInfo.BuildSounds) Sound.PlayToPlayer(order.Player, s, building.CenterPosition); } - PlayBuildAnim(self, unit); + if (producer.Actor != null) + foreach (var nbp in producer.Actor.TraitsImplementing()) + nbp.BuildingPlaced(producer.Actor); queue.FinishProduction(); @@ -84,9 +92,9 @@ namespace OpenRA.Mods.Common.Traits { // May be null if the build anywhere cheat is active // BuildingInfo.IsCloseEnoughToBase has already verified that this is a valid build location - var producer = buildingInfo.FindBaseProvider(w, self.Owner, order.TargetLocation); - if (producer != null) - producer.Trait().BeginCooldown(); + var provider = buildingInfo.FindBaseProvider(w, self.Owner, order.TargetLocation); + if (provider != null) + provider.Trait().BeginCooldown(); } if (GetNumBuildables(self.Owner) > prevItems) @@ -96,30 +104,11 @@ namespace OpenRA.Mods.Common.Traits } } - // finds a construction yard (or equivalent) and runs its "build" animation. - static void PlayBuildAnim(Actor self, ActorInfo unit) - { - var bi = unit.Traits.GetOrDefault(); - if (bi == null) - return; - - var producers = self.World.ActorsWithTrait() - .Where(x => x.Actor.Owner == self.Owner - && x.Actor.Info.Traits.Get().Produces.Intersect(bi.Queue).Any()) - .ToList(); - var producer = producers.Where(x => x.Actor.IsPrimaryBuilding()).Concat(producers) - .FirstOrDefault(); - - if (producer.Actor == null) - return; - - foreach (var nbp in producer.Actor.TraitsImplementing()) - nbp.BuildingPlaced(producer.Actor); - } - static int GetNumBuildables(Player p) { - if (p != p.World.LocalPlayer) return 0; // this only matters for local players. + // This only matters for local players. + if (p != p.World.LocalPlayer) + return 0; return p.World.ActorsWithTrait() .Where(a => a.Actor.Owner == p) diff --git a/OpenRA.Mods.Common/Traits/Player/ProductionQueue.cs b/OpenRA.Mods.Common/Traits/Player/ProductionQueue.cs index 4c335cfc97..56802e74df 100644 --- a/OpenRA.Mods.Common/Traits/Player/ProductionQueue.cs +++ b/OpenRA.Mods.Common/Traits/Player/ProductionQueue.cs @@ -79,7 +79,6 @@ namespace OpenRA.Mods.Common.Traits Dictionary produceable; List queue = new List(); - // A list of things we are currently building public Actor Actor { get { return self; } } [Sync] public int QueueLength { get { return queue.Count; } } @@ -361,6 +360,13 @@ namespace OpenRA.Mods.Common.Traits queue.Add(item); } + // Returns the actor/trait that is most likely (but not necessarily guaranteed) to produce something in this queue + public virtual TraitPair MostLikelyProducer() + { + var trait = self.TraitsImplementing().FirstOrDefault(p => p.Info.Produces.Contains(Info.Type)); + return new TraitPair { Actor = self, Trait = trait }; + } + // Builds a unit from the actor that holds this queue (1 queue per building) // Returns false if the unit can't be built protected virtual bool BuildUnit(string name) diff --git a/OpenRA.Mods.Common/Traits/Player/ProvidesCustomPrerequisite.cs b/OpenRA.Mods.Common/Traits/Player/ProvidesCustomPrerequisite.cs index 5c1c4b2758..ee601256e0 100644 --- a/OpenRA.Mods.Common/Traits/Player/ProvidesCustomPrerequisite.cs +++ b/OpenRA.Mods.Common/Traits/Player/ProvidesCustomPrerequisite.cs @@ -74,14 +74,4 @@ namespace OpenRA.Mods.Common.Traits enabled = owner.PlayerActor.Trait().HasPrerequisites(info.RequiresPrerequisites); } } - - // Allows maps / transformations to specify the race variant of an actor. - public class RaceInit : IActorInit - { - [FieldFromYamlKey] public readonly string Race; - - public RaceInit() { } - public RaceInit(string race) { Race = race; } - public string Value(World world) { return Race; } - } } diff --git a/OpenRA.Mods.Common/Traits/Production.cs b/OpenRA.Mods.Common/Traits/Production.cs index 2526322f7d..d143263bba 100644 --- a/OpenRA.Mods.Common/Traits/Production.cs +++ b/OpenRA.Mods.Common/Traits/Production.cs @@ -24,18 +24,21 @@ namespace OpenRA.Mods.Common.Traits [Desc("e.g. Infantry, Vehicles, Aircraft, Buildings")] public readonly string[] Produces = { }; - public virtual object Create(ActorInitializer init) { return new Production(this, init.Self); } + public virtual object Create(ActorInitializer init) { return new Production(init, this); } } public class Production { - Lazy rp; + readonly Lazy rp; public ProductionInfo Info; - public Production(ProductionInfo info, Actor self) + public string Race { get; private set; } + + public Production(ActorInitializer init, ProductionInfo info) { Info = info; - rp = Exts.Lazy(() => self.IsDead ? null : self.TraitOrDefault()); + rp = Exts.Lazy(() => init.Self.IsDead ? null : init.Self.TraitOrDefault()); + Race = init.Contains() ? init.Get() : init.Self.Owner.Country.Race; } public void DoProduction(Actor self, ActorInfo producee, ExitInfo exitinfo, string raceVariant) @@ -50,6 +53,10 @@ namespace OpenRA.Mods.Common.Traits var exitLocation = rp.Value != null ? rp.Value.Location : exit; var target = Target.FromCell(self.World, exitLocation); + var bi = producee.Traits.GetOrDefault(); + if (bi != null && bi.ForceRace != null) + raceVariant = bi.ForceRace; + self.World.AddFrameEndTask(w => { var td = new TypeDictionary @@ -86,7 +93,6 @@ namespace OpenRA.Mods.Common.Traits foreach (var notify in notifyOthers) notify.Trait.UnitProducedByOther(notify.Actor, self, newUnit); - var bi = newUnit.Info.Traits.GetOrDefault(); if (bi != null && bi.InitialActivity != null) newUnit.QueueActivity(Game.CreateObject(bi.InitialActivity)); diff --git a/OpenRA.Mods.Common/Traits/Render/RenderBuilding.cs b/OpenRA.Mods.Common/Traits/Render/RenderBuilding.cs index a5f80ac3c4..cbaf620683 100644 --- a/OpenRA.Mods.Common/Traits/Render/RenderBuilding.cs +++ b/OpenRA.Mods.Common/Traits/Render/RenderBuilding.cs @@ -41,7 +41,7 @@ namespace OpenRA.Mods.Common.Traits : this(init, info, () => 0) { } public RenderBuilding(ActorInitializer init, RenderBuildingInfo info, Func baseFacing) - : base(init.Self, baseFacing) + : base(init, info, baseFacing) { var self = init.Self; this.info = info; diff --git a/OpenRA.Mods.Common/Traits/Render/RenderEditorOnly.cs b/OpenRA.Mods.Common/Traits/Render/RenderEditorOnly.cs index 643a73e3e1..90184db62c 100644 --- a/OpenRA.Mods.Common/Traits/Render/RenderEditorOnly.cs +++ b/OpenRA.Mods.Common/Traits/Render/RenderEditorOnly.cs @@ -16,12 +16,13 @@ namespace OpenRA.Mods.Common.Traits [Desc("Invisible during games.")] class RenderEditorOnlyInfo : RenderSimpleInfo { - public override object Create(ActorInitializer init) { return new RenderEditorOnly(init.Self); } + public override object Create(ActorInitializer init) { return new RenderEditorOnly(init, this); } } class RenderEditorOnly : RenderSimple { - public RenderEditorOnly(Actor self) : base(self, () => 0) { } + public RenderEditorOnly(ActorInitializer init, RenderEditorOnlyInfo info) + : base(init, info, () => 0) { } public override IEnumerable Render(Actor self, WorldRenderer wr) { return SpriteRenderable.None; } } diff --git a/OpenRA.Mods.Common/Traits/Render/RenderFlare.cs b/OpenRA.Mods.Common/Traits/Render/RenderFlare.cs index 7c931dae8b..ca4b9f3de7 100644 --- a/OpenRA.Mods.Common/Traits/Render/RenderFlare.cs +++ b/OpenRA.Mods.Common/Traits/Render/RenderFlare.cs @@ -12,13 +12,13 @@ namespace OpenRA.Mods.Common.Traits { class RenderFlareInfo : RenderSimpleInfo { - public override object Create(ActorInitializer init) { return new RenderFlare(init.Self); } + public override object Create(ActorInitializer init) { return new RenderFlare(init, this); } } class RenderFlare : RenderSimple { - public RenderFlare(Actor self) - : base(self, () => 0) + public RenderFlare(ActorInitializer init, RenderFlareInfo info) + : base(init, info, () => 0) { DefaultAnimation.PlayThen("open", () => DefaultAnimation.PlayRepeating("idle")); } diff --git a/OpenRA.Mods.Common/Traits/Render/RenderHarvester.cs b/OpenRA.Mods.Common/Traits/Render/RenderHarvester.cs index 7cc6c85f49..5839f3baf9 100644 --- a/OpenRA.Mods.Common/Traits/Render/RenderHarvester.cs +++ b/OpenRA.Mods.Common/Traits/Render/RenderHarvester.cs @@ -17,7 +17,7 @@ namespace OpenRA.Mods.Common.Traits class RenderHarvesterInfo : RenderUnitInfo, Requires { public readonly string[] ImagesByFullness = { "harv" }; - public override object Create(ActorInitializer init) { return new RenderHarvester(init.Self, this); } + public override object Create(ActorInitializer init) { return new RenderHarvester(init, this); } } class RenderHarvester : RenderUnit, INotifyHarvesterAction @@ -25,15 +25,15 @@ namespace OpenRA.Mods.Common.Traits Harvester harv; RenderHarvesterInfo info; - public RenderHarvester(Actor self, RenderHarvesterInfo info) - : base(self) + public RenderHarvester(ActorInitializer init, RenderHarvesterInfo info) + : base(init, info) { this.info = info; - harv = self.Trait(); + harv = init.Self.Trait(); // HACK: Force images to be loaded up-front foreach (var image in info.ImagesByFullness) - new Animation(self.World, image); + new Animation(init.World, image); } public override void Tick(Actor self) diff --git a/OpenRA.Mods.Common/Traits/Render/RenderInfantry.cs b/OpenRA.Mods.Common/Traits/Render/RenderInfantry.cs index d4f2ac6f18..c1ee3ac157 100644 --- a/OpenRA.Mods.Common/Traits/Render/RenderInfantry.cs +++ b/OpenRA.Mods.Common/Traits/Render/RenderInfantry.cs @@ -25,7 +25,7 @@ namespace OpenRA.Mods.Common.Traits public readonly string[] IdleAnimations = { }; public readonly string[] StandAnimations = { "stand" }; - public override object Create(ActorInitializer init) { return new RenderInfantry(init.Self, this); } + public override object Create(ActorInitializer init) { return new RenderInfantry(init, this); } public override IEnumerable RenderPreviewSprites(ActorPreviewInitializer init, RenderSpritesInfo rs, string image, int facings, PaletteReference p) { @@ -39,9 +39,9 @@ namespace OpenRA.Mods.Common.Traits yield return new SpriteActorPreview(anim, WVec.Zero, 0, p, rs.Scale); } - public override int QuantizedBodyFacings(SequenceProvider sequenceProvider, ActorInfo ai) + public override int QuantizedBodyFacings(ActorInfo ai, SequenceProvider sequenceProvider, string race) { - return sequenceProvider.GetSequence(RenderSprites.GetImage(ai), StandAnimations.First()).Facings; + return sequenceProvider.GetSequence(GetImage(ai, sequenceProvider, race), StandAnimations.First()).Facings; } } @@ -58,14 +58,14 @@ namespace OpenRA.Mods.Common.Traits bool IsModifyingSequence { get { return rsm != null && rsm.IsModifyingSequence; } } bool wasModifying; - public RenderInfantry(Actor self, RenderInfantryInfo info) - : base(self, MakeFacingFunc(self)) + public RenderInfantry(ActorInitializer init, RenderInfantryInfo info) + : base(init, info, MakeFacingFunc(init.Self)) { this.info = info; - DefaultAnimation.PlayFetchIndex(NormalizeInfantrySequence(self, info.StandAnimations.Random(Game.CosmeticRandom)), () => 0); + DefaultAnimation.PlayFetchIndex(NormalizeInfantrySequence(init.Self, info.StandAnimations.Random(Game.CosmeticRandom)), () => 0); state = AnimationState.Waiting; - move = self.Trait(); - rsm = self.TraitOrDefault(); + move = init.Self.Trait(); + rsm = init.Self.TraitOrDefault(); } protected virtual string NormalizeInfantrySequence(Actor self, string baseSequence) diff --git a/OpenRA.Mods.Common/Traits/Render/RenderSimple.cs b/OpenRA.Mods.Common/Traits/Render/RenderSimple.cs index 72edba500c..36f876263d 100644 --- a/OpenRA.Mods.Common/Traits/Render/RenderSimple.cs +++ b/OpenRA.Mods.Common/Traits/Render/RenderSimple.cs @@ -18,7 +18,7 @@ namespace OpenRA.Mods.Common.Traits { public class RenderSimpleInfo : RenderSpritesInfo, IRenderActorPreviewSpritesInfo, IQuantizeBodyOrientationInfo, ILegacyEditorRenderInfo, Requires { - public override object Create(ActorInitializer init) { return new RenderSimple(init.Self); } + public override object Create(ActorInitializer init) { return new RenderSimple(init, this); } public virtual IEnumerable RenderPreviewSprites(ActorPreviewInitializer init, RenderSpritesInfo rs, string image, int facings, PaletteReference p) { @@ -30,30 +30,30 @@ namespace OpenRA.Mods.Common.Traits yield return new SpriteActorPreview(anim, WVec.Zero, 0, p, rs.Scale); } - public virtual int QuantizedBodyFacings(SequenceProvider sequenceProvider, ActorInfo ai) + public virtual int QuantizedBodyFacings(ActorInfo ai, SequenceProvider sequenceProvider, string race) { - return sequenceProvider.GetSequence(RenderSprites.GetImage(ai), "idle").Facings; + return sequenceProvider.GetSequence(GetImage(ai, sequenceProvider, race), "idle").Facings; } public string EditorPalette { get { return Palette; } } - public string EditorImage(ActorInfo actor) { return RenderSimple.GetImage(actor); } + public string EditorImage(ActorInfo actor, SequenceProvider sequenceProvider, string race) { return GetImage(actor, sequenceProvider, race); } } public class RenderSimple : RenderSprites, IAutoSelectionSize { public readonly Animation DefaultAnimation; - public RenderSimple(Actor self, Func baseFacing) - : base(self) + public RenderSimple(ActorInitializer init, RenderSimpleInfo info, Func baseFacing) + : base(init, info) { - DefaultAnimation = new Animation(self.World, GetImage(self), baseFacing); + DefaultAnimation = new Animation(init.World, GetImage(init.Self), baseFacing); Add("", DefaultAnimation); } - public RenderSimple(Actor self) - : this(self, MakeFacingFunc(self)) + public RenderSimple(ActorInitializer init, RenderSimpleInfo info) + : this(init, info, MakeFacingFunc(init.Self)) { - DefaultAnimation.PlayRepeating(NormalizeSequence(self, "idle")); + DefaultAnimation.PlayRepeating(NormalizeSequence(init.Self, "idle")); } public int2 SelectionSize(Actor self) { return AutoSelectionSize(self); } diff --git a/OpenRA.Mods.Common/Traits/Render/RenderSprites.cs b/OpenRA.Mods.Common/Traits/Render/RenderSprites.cs index 4e6d209df2..f6ea77600b 100644 --- a/OpenRA.Mods.Common/Traits/Render/RenderSprites.cs +++ b/OpenRA.Mods.Common/Traits/Render/RenderSprites.cs @@ -22,33 +22,62 @@ namespace OpenRA.Mods.Common.Traits public class RenderSpritesInfo : IRenderActorPreviewInfo, ITraitInfo { - [Desc("Defaults to the actor name.")] + [Desc("The sequence name that defines the actor sprites. Defaults to the actor name.")] public readonly string Image = null; + [FieldLoader.LoadUsing("LoadRaceImages")] + [Desc("A dictionary of race-specific image overrides.")] + public readonly Dictionary RaceImages = null; + [Desc("Custom palette name")] public readonly string Palette = null; + [Desc("Custom PlayerColorPalette: BaseName")] public readonly string PlayerPalette = "player"; + [Desc("Change the sprite image size.")] public readonly float Scale = 1f; - public virtual object Create(ActorInitializer init) { return new RenderSprites(init.Self); } + protected static object LoadRaceImages(MiniYaml y) + { + MiniYaml images; + + if (!y.ToDictionary().TryGetValue("RaceImages", out images)) + return null; + + return images.Nodes.ToDictionary(kv => kv.Key, kv => kv.Value.Value); + } + + public virtual object Create(ActorInitializer init) { return new RenderSprites(init, this); } public IEnumerable RenderPreview(ActorPreviewInitializer init) { var sequenceProvider = init.World.Map.SequenceProvider; - var image = RenderSprites.GetImage(init.Actor); - var palette = init.WorldRenderer.Palette(Palette ?? (init.Owner != null ? PlayerPalette + init.Owner.InternalName : null)); + var race = init.Contains() ? init.Get() : init.Owner.Country.Race; + var image = GetImage(init.Actor, sequenceProvider, race); + var palette = init.WorldRenderer.Palette(Palette ?? PlayerPalette + init.Owner.InternalName); var facings = 0; var body = init.Actor.Traits.GetOrDefault(); if (body != null) - facings = body.QuantizedFacings == -1 ? init.Actor.Traits.Get().QuantizedBodyFacings(sequenceProvider, init.Actor) : body.QuantizedFacings; + facings = body.QuantizedFacings == -1 ? init.Actor.Traits.Get().QuantizedBodyFacings(init.Actor, sequenceProvider, init.Owner.Country.Race) : body.QuantizedFacings; foreach (var spi in init.Actor.Traits.WithInterface()) foreach (var preview in spi.RenderPreviewSprites(init, this, image, facings, palette)) yield return preview; } + + public string GetImage(ActorInfo actor, SequenceProvider sequenceProvider, string race) + { + if (RaceImages != null) + { + string raceImage = null; + if (RaceImages.TryGetValue(race, out raceImage) && sequenceProvider.HasSequence(raceImage)) + return raceImage; + } + + return (Image ?? actor.Name).ToLowerInvariant(); + } } public class RenderSprites : IRender, ITick, INotifyOwnerChanged, INotifyEffectiveOwnerChanged @@ -88,9 +117,10 @@ namespace OpenRA.Mods.Common.Traits } } + readonly string race; readonly RenderSpritesInfo info; - string cachedImage = null; - Dictionary anims = new Dictionary(); + readonly Dictionary anims = new Dictionary(); + string cachedImage; public static Func MakeFacingFunc(Actor self) { @@ -99,15 +129,10 @@ namespace OpenRA.Mods.Common.Traits return () => facing.Facing; } - public RenderSprites(Actor self) + public RenderSprites(ActorInitializer init, RenderSpritesInfo info) { - info = self.Info.Traits.Get(); - } - - public static string GetImage(ActorInfo actor) - { - var info = actor.Traits.Get(); - return (info.Image ?? actor.Name).ToLowerInvariant(); + this.info = info; + race = init.Contains() ? init.Get() : init.Self.Owner.Country.Race; } public string GetImage(Actor self) @@ -115,7 +140,7 @@ namespace OpenRA.Mods.Common.Traits if (cachedImage != null) return cachedImage; - return cachedImage = GetImage(self.Info); + return cachedImage = info.GetImage(self.Info, self.World.Map.SequenceProvider, race); } protected void UpdatePalette() diff --git a/OpenRA.Mods.Common/Traits/Render/RenderUnit.cs b/OpenRA.Mods.Common/Traits/Render/RenderUnit.cs index f420a432bd..566db3806f 100644 --- a/OpenRA.Mods.Common/Traits/Render/RenderUnit.cs +++ b/OpenRA.Mods.Common/Traits/Render/RenderUnit.cs @@ -15,13 +15,13 @@ namespace OpenRA.Mods.Common.Traits { public class RenderUnitInfo : RenderSimpleInfo, Requires { - public override object Create(ActorInitializer init) { return new RenderUnit(init.Self); } + public override object Create(ActorInitializer init) { return new RenderUnit(init, this); } } public class RenderUnit : RenderSimple { - public RenderUnit(Actor self) - : base(self) { } + public RenderUnit(ActorInitializer init, RenderUnitInfo info) + : base(init, info) { } public void PlayCustomAnimation(Actor self, string newAnim, Action after) { diff --git a/OpenRA.Mods.Common/Traits/Transforms.cs b/OpenRA.Mods.Common/Traits/Transforms.cs index f30ed50368..79faf49afc 100644 --- a/OpenRA.Mods.Common/Traits/Transforms.cs +++ b/OpenRA.Mods.Common/Traits/Transforms.cs @@ -18,12 +18,27 @@ namespace OpenRA.Mods.Common.Traits [Desc("Actor becomes a specified actor type when this trait is triggered.")] public class TransformsInfo : ITraitInfo { - [ActorReference] public readonly string IntoActor = null; + [Desc("Actor to transform into."), ActorReference] + public readonly string IntoActor = null; + + [Desc("Offset to spawn the transformed actor relative to the current cell.")] public readonly CVec Offset = CVec.Zero; + + [Desc("Facing that the actor must face before transforming.")] public readonly int Facing = 96; + + [Desc("Sounds to play when transforming.")] public readonly string[] TransformSounds = { }; + + [Desc("Sounds to play when the transformation is blocked.")] public readonly string[] NoTransformSounds = { }; + [Desc("Notification to play when transforming.")] + public readonly string TransformNotification = null; + + [Desc("Notification to play when the transformation is blocked.")] + public readonly string NoTransformNotification = null; + public virtual object Create(ActorInitializer init) { return new Transforms(init, this); } } @@ -78,6 +93,8 @@ namespace OpenRA.Mods.Common.Traits foreach (var s in info.NoTransformSounds) Sound.PlayToPlayer(self.Owner, s); + Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech", info.NoTransformNotification, self.Owner.Country.Race); + return; } @@ -90,7 +107,15 @@ namespace OpenRA.Mods.Common.Traits foreach (var nt in self.TraitsImplementing()) nt.BeforeTransform(self); - var transform = new Transform(self, info.IntoActor) { Offset = info.Offset, Facing = info.Facing, Sounds = info.TransformSounds, Race = race }; + var transform = new Transform(self, info.IntoActor) + { + Offset = info.Offset, + Facing = info.Facing, + Sounds = info.TransformSounds, + Notification = info.TransformNotification, + Race = race + }; + var makeAnimation = self.TraitOrDefault(); if (makeAnimation != null) makeAnimation.Reverse(self, transform); diff --git a/OpenRA.Mods.Common/Widgets/ObserverProductionIconsWidget.cs b/OpenRA.Mods.Common/Widgets/ObserverProductionIconsWidget.cs index 1eff05759f..941ea90b37 100644 --- a/OpenRA.Mods.Common/Widgets/ObserverProductionIconsWidget.cs +++ b/OpenRA.Mods.Common/Widgets/ObserverProductionIconsWidget.cs @@ -67,11 +67,13 @@ namespace OpenRA.Mods.Common.Widgets if (current == null) continue; + var race = queue.Trait.Actor.Owner.Country.Race; var actor = queue.Trait.AllItems().FirstOrDefault(a => a.Name == current.Item); if (actor == null) continue; - var icon = new Animation(world, RenderSimple.GetImage(actor)); + var rsi = actor.Traits.Get(); + var icon = new Animation(world, rsi.GetImage(actor, world.Map.SequenceProvider, race)); icon.Play(actor.Traits.Get().Icon); var location = new float2(RenderBounds.Location) + new float2(queue.i * (IconWidth + IconSpacing), 0); WidgetUtils.DrawSHPCentered(icon.Image, location + 0.5f * iconSize, worldRenderer, 0.5f); diff --git a/OpenRA.Mods.Common/Widgets/ProductionPaletteWidget.cs b/OpenRA.Mods.Common/Widgets/ProductionPaletteWidget.cs index 162464df2f..f9ccf48e7b 100644 --- a/OpenRA.Mods.Common/Widgets/ProductionPaletteWidget.cs +++ b/OpenRA.Mods.Common/Widgets/ProductionPaletteWidget.cs @@ -252,7 +252,8 @@ namespace OpenRA.Mods.Common.Widgets public void RefreshIcons() { icons = new Dictionary(); - if (CurrentQueue == null) + var producer = CurrentQueue != null ? CurrentQueue.MostLikelyProducer() : default(TraitPair); + if (CurrentQueue == null || producer.Trait == null) { if (DisplayedIconCount != 0) { @@ -268,13 +269,16 @@ namespace OpenRA.Mods.Common.Widgets var ks = Game.Settings.Keys; var rb = RenderBounds; + var race = producer.Trait.Race; foreach (var item in AllBuildables.Skip(IconRowOffset * Columns).Take(MaxIconRowOffset * Columns)) { var x = DisplayedIconCount % Columns; var y = DisplayedIconCount / Columns; var rect = new Rectangle(rb.X + x * (IconSize.X + IconMargin.X), rb.Y + y * (IconSize.Y + IconMargin.Y), IconSize.X, IconSize.Y); - var icon = new Animation(World, RenderSimple.GetImage(item)); + + var rsi = item.Traits.Get(); + var icon = new Animation(World, rsi.GetImage(item, World.Map.SequenceProvider, race)); icon.Play(item.Traits.Get().Icon); var pi = new ProductionIcon() diff --git a/OpenRA.Mods.D2k/Traits/AutoCarryall.cs b/OpenRA.Mods.D2k/Traits/AutoCarryall.cs index ad273dfe14..7952689267 100644 --- a/OpenRA.Mods.D2k/Traits/AutoCarryall.cs +++ b/OpenRA.Mods.D2k/Traits/AutoCarryall.cs @@ -152,7 +152,8 @@ namespace OpenRA.Mods.D2k.Traits isCarrying = true; // Create a new animation for our carryable unit - anim = new Animation(self.World, RenderSprites.GetImage(carryable.Info), RenderSprites.MakeFacingFunc(self)); + var rs = carryable.Trait(); + anim = new Animation(self.World, rs.GetImage(carryable), RenderSprites.MakeFacingFunc(self)); anim.PlayRepeating("idle"); anim.IsDecoration = true; } diff --git a/OpenRA.Mods.D2k/UtilityCommands/D2kMapImporter.cs b/OpenRA.Mods.D2k/UtilityCommands/D2kMapImporter.cs index 61089da3a6..75517593d5 100644 --- a/OpenRA.Mods.D2k/UtilityCommands/D2kMapImporter.cs +++ b/OpenRA.Mods.D2k/UtilityCommands/D2kMapImporter.cs @@ -32,225 +32,225 @@ namespace OpenRA.Mods.D2k.UtilityCommands { 45, Pair.New("spicebloom", "Neutral") }, // Atreides: - { 4, Pair.New("WALLA", "Atreides") }, - { 5, Pair.New("PWRA", "Atreides") }, - { 8, Pair.New("CONYARDA", "Atreides") }, - { 11, Pair.New("BARRA", "Atreides") }, - { 14, Pair.New("REFA", "Atreides") }, - { 17, Pair.New("RADARA", "Atreides") }, - { 63, Pair.New("LIGHTA", "Atreides") }, - { 69, Pair.New("SILOA", "Atreides") }, - { 72, Pair.New("HEAVYA", "Atreides") }, - { 75, Pair.New("REPAIRA", "Atreides") }, - { 78, Pair.New("GUNTOWERA", "Atreides") }, - { 120, Pair.New("HIGHTECHA", "Atreides") }, - { 123, Pair.New("ROCKETTOWERA", "Atreides") }, - { 126, Pair.New("RESEARCHA", "Atreides") }, - { 129, Pair.New("STARPORTA", "Atreides") }, - { 132, Pair.New("PALACEA", "Atreides") }, - { 180, Pair.New("RIFLE", "Atreides") }, - { 181, Pair.New("BAZOOKA", "Atreides") }, - { 182, Pair.New("FREMEN", "Atreides") }, - { 183, Pair.New("SARDAUKAR", "Atreides") }, - { 184, Pair.New("ENGINEER", "Atreides") }, - { 185, Pair.New("HARVESTER", "Atreides") }, - { 186, Pair.New("MCVA", "Atreides") }, - { 187, Pair.New("TRIKE", "Atreides") }, - { 188, Pair.New("QUAD", "Atreides") }, - { 189, Pair.New("COMBATA", "Atreides") }, - { 190, Pair.New("MISSILETANK", "Atreides") }, - { 191, Pair.New("SIEGETANK", "Atreides") }, - { 192, Pair.New("CARRYALLA", "Atreides") }, - { 194, Pair.New("SONICTANK", "Atreides") }, + { 4, Pair.New("wall", "Atreides") }, + { 5, Pair.New("power", "Atreides") }, + { 8, Pair.New("conyard", "Atreides") }, + { 11, Pair.New("barracks", "Atreides") }, + { 14, Pair.New("refinery", "Atreides") }, + { 17, Pair.New("radar", "Atreides") }, + { 63, Pair.New("light", "Atreides") }, + { 69, Pair.New("silo", "Atreides") }, + { 72, Pair.New("heavy", "Atreides") }, + { 75, Pair.New("repair", "Atreides") }, + { 78, Pair.New("guntower", "Atreides") }, + { 120, Pair.New("hightech", "Atreides") }, + { 123, Pair.New("rockettower", "Atreides") }, + { 126, Pair.New("research", "Atreides") }, + { 129, Pair.New("starport", "Atreides") }, + { 132, Pair.New("palace", "Atreides") }, + { 180, Pair.New("rifle", "Atreides") }, + { 181, Pair.New("bazooka", "Atreides") }, + { 182, Pair.New("fremen", "Atreides") }, + { 183, Pair.New("sardaukar", "Atreides") }, + { 184, Pair.New("engineer", "Atreides") }, + { 185, Pair.New("harvester", "Atreides") }, + { 186, Pair.New("mcv", "Atreides") }, + { 187, Pair.New("trike", "Atreides") }, + { 188, Pair.New("quad", "Atreides") }, + { 189, Pair.New("combata", "Atreides") }, + { 190, Pair.New("missiletank", "Atreides") }, + { 191, Pair.New("siegetank", "Atreides") }, + { 192, Pair.New("carryall", "Atreides") }, + { 194, Pair.New("sonictank", "Atreides") }, // Harkonnen: - { 204, Pair.New("WALLH", "Harkonnen") }, - { 205, Pair.New("PWRH", "Harkonnen") }, - { 208, Pair.New("CONYARDH", "Harkonnen") }, - { 211, Pair.New("BARRH", "Harkonnen") }, - { 214, Pair.New("REFH", "Harkonnen") }, - { 217, Pair.New("RADARH", "Harkonnen") }, - { 263, Pair.New("LIGHTH", "Harkonnen") }, - { 269, Pair.New("SILOH", "Harkonnen") }, - { 272, Pair.New("HEAVYH", "Harkonnen") }, - { 275, Pair.New("REPAIRH", "Harkonnen") }, - { 278, Pair.New("GUNTOWERH", "Harkonnen") }, - { 320, Pair.New("HIGHTECHH", "Harkonnen") }, - { 323, Pair.New("ROCKETTOWERH", "Harkonnen") }, - { 326, Pair.New("RESEARCHH", "Harkonnen") }, - { 329, Pair.New("STARPORTH", "Harkonnen") }, - { 332, Pair.New("PALACEH", "Harkonnen") }, - { 360, Pair.New("RIFLE", "Harkonnen") }, - { 361, Pair.New("BAZOOKA", "Harkonnen") }, - { 362, Pair.New("FREMEN", "Harkonnen") }, - { 363, Pair.New("SARDAUKAR", "Harkonnen") }, - { 364, Pair.New("ENGINEER", "Harkonnen") }, - { 365, Pair.New("HARVESTER", "Harkonnen") }, - { 366, Pair.New("MCVH", "Harkonnen") }, - { 367, Pair.New("TRIKE", "Harkonnen") }, - { 368, Pair.New("QUAD", "Harkonnen") }, - { 369, Pair.New("COMBATH", "Harkonnen") }, - { 370, Pair.New("MISSILETANK", "Harkonnen") }, - { 371, Pair.New("SIEGETANK", "Harkonnen") }, - { 372, Pair.New("CARRYALLH", "Harkonnen") }, - { 374, Pair.New("DEVAST", "Harkonnen") }, + { 204, Pair.New("wall", "Harkonnen") }, + { 205, Pair.New("power", "Harkonnen") }, + { 208, Pair.New("conyard", "Harkonnen") }, + { 211, Pair.New("barracks", "Harkonnen") }, + { 214, Pair.New("refinery", "Harkonnen") }, + { 217, Pair.New("radar", "Harkonnen") }, + { 263, Pair.New("light", "Harkonnen") }, + { 269, Pair.New("silo", "Harkonnen") }, + { 272, Pair.New("heavy", "Harkonnen") }, + { 275, Pair.New("repair", "Harkonnen") }, + { 278, Pair.New("guntower", "Harkonnen") }, + { 320, Pair.New("hightech", "Harkonnen") }, + { 323, Pair.New("rockettower", "Harkonnen") }, + { 326, Pair.New("research", "Harkonnen") }, + { 329, Pair.New("starport", "Harkonnen") }, + { 332, Pair.New("palace", "Harkonnen") }, + { 360, Pair.New("rifle", "Harkonnen") }, + { 361, Pair.New("bazooka", "Harkonnen") }, + { 362, Pair.New("fremen", "Harkonnen") }, + { 363, Pair.New("sardaukar", "Harkonnen") }, + { 364, Pair.New("engineer", "Harkonnen") }, + { 365, Pair.New("harvester", "Harkonnen") }, + { 366, Pair.New("mcv", "Harkonnen") }, + { 367, Pair.New("trike", "Harkonnen") }, + { 368, Pair.New("quad", "Harkonnen") }, + { 369, Pair.New("combath", "Harkonnen") }, + { 370, Pair.New("missiletank", "Harkonnen") }, + { 371, Pair.New("siegetank", "Harkonnen") }, + { 372, Pair.New("carryall", "Harkonnen") }, + { 374, Pair.New("devast", "Harkonnen") }, // Ordos: - { 404, Pair.New("WALLO", "Ordos") }, - { 405, Pair.New("PWRO", "Ordos") }, - { 408, Pair.New("CONYARDO", "Ordos") }, - { 411, Pair.New("BARRO", "Ordos") }, - { 414, Pair.New("REFO", "Ordos") }, - { 417, Pair.New("RADARO", "Ordos") }, - { 463, Pair.New("LIGHTO", "Ordos") }, - { 469, Pair.New("SILOO", "Ordos") }, - { 472, Pair.New("HEAVYO", "Ordos") }, - { 475, Pair.New("REPAIRO", "Ordos") }, - { 478, Pair.New("GUNTOWERO", "Ordos") }, - { 520, Pair.New("HIGHTECHO", "Ordos") }, - { 523, Pair.New("ROCKETTOWERO", "Ordos") }, - { 526, Pair.New("RESEARCHO", "Ordos") }, - { 529, Pair.New("STARPORTO", "Ordos") }, - { 532, Pair.New("PALACEO", "Ordos") }, - { 560, Pair.New("RIFLE", "Ordos") }, - { 561, Pair.New("BAZOOKA", "Ordos") }, - { 562, Pair.New("SABOTEUR", "Ordos") }, - { 563, Pair.New("SARDAUKAR", "Ordos") }, - { 564, Pair.New("ENGINEER", "Ordos") }, - { 565, Pair.New("HARVESTER", "Ordos") }, - { 566, Pair.New("MCVO", "Ordos") }, - { 567, Pair.New("RAIDER", "Ordos") }, - { 568, Pair.New("QUAD", "Ordos") }, - { 569, Pair.New("COMBATO", "Ordos") }, - { 570, Pair.New("MISSILETANK", "Ordos") }, - { 571, Pair.New("SIEGETANK", "Ordos") }, - { 572, Pair.New("CARRYALLO", "Ordos") }, - { 574, Pair.New("DEVIATORTANK", "Ordos") }, + { 404, Pair.New("wall", "Ordos") }, + { 405, Pair.New("power", "Ordos") }, + { 408, Pair.New("conyard", "Ordos") }, + { 411, Pair.New("barracks", "Ordos") }, + { 414, Pair.New("refinery", "Ordos") }, + { 417, Pair.New("radar", "Ordos") }, + { 463, Pair.New("light", "Ordos") }, + { 469, Pair.New("silo", "Ordos") }, + { 472, Pair.New("heavy", "Ordos") }, + { 475, Pair.New("repair", "Ordos") }, + { 478, Pair.New("guntower", "Ordos") }, + { 520, Pair.New("hightech", "Ordos") }, + { 523, Pair.New("rockettower", "Ordos") }, + { 526, Pair.New("research", "Ordos") }, + { 529, Pair.New("starport", "Ordos") }, + { 532, Pair.New("palace", "Ordos") }, + { 560, Pair.New("rifle", "Ordos") }, + { 561, Pair.New("bazooka", "Ordos") }, + { 562, Pair.New("saboteur", "Ordos") }, + { 563, Pair.New("sardaukar", "Ordos") }, + { 564, Pair.New("engineer", "Ordos") }, + { 565, Pair.New("harvester", "Ordos") }, + { 566, Pair.New("mcv", "Ordos") }, + { 567, Pair.New("raider", "Ordos") }, + { 568, Pair.New("quad", "Ordos") }, + { 569, Pair.New("combato", "Ordos") }, + { 570, Pair.New("missiletank", "Ordos") }, + { 571, Pair.New("siegetank", "Ordos") }, + { 572, Pair.New("carryall", "Ordos") }, + { 574, Pair.New("deviatortank", "Ordos") }, // Corrino: - { 580, Pair.New("WALLH", "Corrino") }, - { 581, Pair.New("PWRH", "Corrino") }, - { 582, Pair.New("CONYARDC", "Corrino") }, - { 583, Pair.New("BARRH", "Corrino") }, - { 584, Pair.New("REFH", "Corrino") }, - { 585, Pair.New("RADARH", "Corrino") }, - { 587, Pair.New("LIGHTH", "Corrino") }, - { 588, Pair.New("PALACEC", "Corrino") }, - { 589, Pair.New("SILOH", "Corrino") }, - { 590, Pair.New("HEAVYC", "Corrino") }, - { 591, Pair.New("REPAIRH", "Corrino") }, - { 592, Pair.New("GUNTOWERH", "Corrino") }, - { 593, Pair.New("HIGHTECHH", "Corrino") }, - { 594, Pair.New("ROCKETTOWERH", "Corrino") }, - { 595, Pair.New("RESEARCHH", "Corrino") }, - { 596, Pair.New("STARPORTC", "Corrino") }, - { 597, Pair.New("SIETCH", "Corrino") }, - { 598, Pair.New("RIFLE", "Corrino") }, - { 599, Pair.New("BAZOOKA", "Corrino") }, - { 600, Pair.New("SARDAUKAR", "Corrino") }, - { 601, Pair.New("FREMEN", "Corrino") }, - { 602, Pair.New("ENGINEER", "Corrino") }, - { 603, Pair.New("HARVESTER", "Corrino") }, - { 604, Pair.New("MCVH", "Corrino") }, - { 605, Pair.New("TRIKE", "Corrino") }, - { 606, Pair.New("QUAD", "Corrino") }, - { 607, Pair.New("COMBATH", "Corrino") }, - { 608, Pair.New("MISSILETANK", "Corrino") }, - { 609, Pair.New("SIEGETANK", "Corrino") }, - { 610, Pair.New("CARRYALLH", "Corrino") }, + { 580, Pair.New("wall", "Corrino") }, + { 581, Pair.New("power", "Corrino") }, + { 582, Pair.New("conyard", "Corrino") }, + { 583, Pair.New("barracks", "Corrino") }, + { 584, Pair.New("refinery", "Corrino") }, + { 585, Pair.New("radar", "Corrino") }, + { 587, Pair.New("light", "Corrino") }, + { 588, Pair.New("palace", "Corrino") }, + { 589, Pair.New("silo", "Corrino") }, + { 590, Pair.New("heavy", "Corrino") }, + { 591, Pair.New("repair", "Corrino") }, + { 592, Pair.New("guntower", "Corrino") }, + { 593, Pair.New("hightech", "Corrino") }, + { 594, Pair.New("rockettower", "Corrino") }, + { 595, Pair.New("research", "Corrino") }, + { 596, Pair.New("starport", "Corrino") }, + { 597, Pair.New("sietch", "Corrino") }, + { 598, Pair.New("rifle", "Corrino") }, + { 599, Pair.New("bazooka", "Corrino") }, + { 600, Pair.New("sardaukar", "Corrino") }, + { 601, Pair.New("fremen", "Corrino") }, + { 602, Pair.New("engineer", "Corrino") }, + { 603, Pair.New("harvester", "Corrino") }, + { 604, Pair.New("mcv", "Corrino") }, + { 605, Pair.New("trike", "Corrino") }, + { 606, Pair.New("quad", "Corrino") }, + { 607, Pair.New("combath", "Corrino") }, + { 608, Pair.New("missiletank", "Corrino") }, + { 609, Pair.New("siegetank", "Corrino") }, + { 610, Pair.New("carryall", "Corrino") }, // Fremen: - { 620, Pair.New("WALLA", "Fremen") }, - { 621, Pair.New("PWRA", "Fremen") }, - { 622, Pair.New("CONYARDA", "Fremen") }, - { 623, Pair.New("BARRA", "Fremen") }, - { 624, Pair.New("REFA", "Fremen") }, - { 625, Pair.New("RADARA", "Fremen") }, - { 627, Pair.New("LIGHTA", "Fremen") }, - { 628, Pair.New("PALACEC", "Fremen") }, - { 629, Pair.New("SILOA", "Fremen") }, - { 630, Pair.New("HEAVYA", "Fremen") }, - { 631, Pair.New("REPAIRA", "Fremen") }, - { 632, Pair.New("GUNTOWERA", "Fremen") }, - { 633, Pair.New("HIGHTECHA", "Fremen") }, - { 634, Pair.New("ROCKETTOWERA", "Fremen") }, - { 635, Pair.New("RESEARCHA", "Fremen") }, - { 636, Pair.New("STARPORTA", "Fremen") }, - { 637, Pair.New("SIETCH", "Fremen") }, - { 638, Pair.New("RIFLE", "Fremen") }, - { 639, Pair.New("BAZOOKA", "Fremen") }, - { 640, Pair.New("FREMEN", "Fremen") }, - ////{ 641, Pair.New("", "Fremen") },// Fremen fremen non-stealth - { 642, Pair.New("ENGINEER", "Fremen") }, - { 643, Pair.New("HARVESTER", "Fremen") }, - { 644, Pair.New("MCVA", "Fremen") }, - { 645, Pair.New("TRIKE", "Fremen") }, - { 646, Pair.New("QUAD", "Fremen") }, - { 647, Pair.New("COMBATA", "Fremen") }, - { 648, Pair.New("MISSILETANK", "Fremen") }, - { 649, Pair.New("SIEGETANK", "Fremen") }, - { 650, Pair.New("CARRYALLA", "Fremen") }, - { 652, Pair.New("SONICTANK", "Fremen") }, + { 620, Pair.New("wall", "Fremen") }, + { 621, Pair.New("power", "Fremen") }, + { 622, Pair.New("conyard", "Fremen") }, + { 623, Pair.New("barracks", "Fremen") }, + { 624, Pair.New("refinery", "Fremen") }, + { 625, Pair.New("radar", "Fremen") }, + { 627, Pair.New("light", "Fremen") }, + { 628, Pair.New("palacec", "Fremen") }, + { 629, Pair.New("silo", "Fremen") }, + { 630, Pair.New("heavy", "Fremen") }, + { 631, Pair.New("repair", "Fremen") }, + { 632, Pair.New("guntower", "Fremen") }, + { 633, Pair.New("hightech", "Fremen") }, + { 634, Pair.New("rockettower", "Fremen") }, + { 635, Pair.New("research", "Fremen") }, + { 636, Pair.New("starport", "Fremen") }, + { 637, Pair.New("sietch", "Fremen") }, + { 638, Pair.New("rifle", "Fremen") }, + { 639, Pair.New("bazooka", "Fremen") }, + { 640, Pair.New("fremen", "Fremen") }, + ////{ 641, Pair.new("", "Fremen") },// Fremen fremen non-stealth + { 642, Pair.New("engineer", "Fremen") }, + { 643, Pair.New("harvester", "Fremen") }, + { 644, Pair.New("mcv", "Fremen") }, + { 645, Pair.New("trike", "Fremen") }, + { 646, Pair.New("quad", "Fremen") }, + { 647, Pair.New("combata", "Fremen") }, + { 648, Pair.New("missiletank", "Fremen") }, + { 649, Pair.New("siegetank", "Fremen") }, + { 650, Pair.New("carryall", "Fremen") }, + { 652, Pair.New("sonictank", "Fremen") }, // Smugglers: - { 660, Pair.New("WALLO", "Smugglers") }, - { 661, Pair.New("PWRO", "Smugglers") }, - { 662, Pair.New("CONYARDO", "Smugglers") }, - { 663, Pair.New("BARRO", "Smugglers") }, - { 664, Pair.New("REFO", "Smugglers") }, - { 666, Pair.New("RADARO", "Smugglers") }, - { 667, Pair.New("LIGHTO", "Smugglers") }, - { 668, Pair.New("SILOO", "Smugglers") }, - { 669, Pair.New("HEAVYO", "Smugglers") }, - { 670, Pair.New("REPAIRO", "Smugglers") }, - { 671, Pair.New("GUNTOWERO", "Smugglers") }, - { 672, Pair.New("HIGHTECHO", "Smugglers") }, - { 673, Pair.New("ROCKETTOWERO", "Smugglers") }, - { 674, Pair.New("RESEARCHO", "Smugglers") }, - { 675, Pair.New("STARPORTO", "Smugglers") }, - { 676, Pair.New("PALACEO", "Smugglers") }, - { 677, Pair.New("RIFLE", "Smugglers") }, - { 678, Pair.New("BAZOOKA", "Smugglers") }, - { 679, Pair.New("SABOTEUR", "Smugglers") }, - { 680, Pair.New("ENGINEER", "Smugglers") }, - { 681, Pair.New("HARVESTER", "Smugglers") }, - { 682, Pair.New("MCVO", "Smugglers") }, - { 683, Pair.New("TRIKE", "Smugglers") }, - { 684, Pair.New("QUAD", "Smugglers") }, - { 685, Pair.New("COMBATO", "Smugglers") }, - { 686, Pair.New("MISSILETANK", "Smugglers") }, - { 687, Pair.New("SIEGETANK", "Smugglers") }, - { 688, Pair.New("CARRYALLO", "Smugglers") }, + { 660, Pair.New("wall", "Smugglers") }, + { 661, Pair.New("power", "Smugglers") }, + { 662, Pair.New("conyard", "Smugglers") }, + { 663, Pair.New("barracks", "Smugglers") }, + { 664, Pair.New("refinery", "Smugglers") }, + { 666, Pair.New("radar", "Smugglers") }, + { 667, Pair.New("light", "Smugglers") }, + { 668, Pair.New("silo", "Smugglers") }, + { 669, Pair.New("heavy", "Smugglers") }, + { 670, Pair.New("repair", "Smugglers") }, + { 671, Pair.New("guntower", "Smugglers") }, + { 672, Pair.New("hightech", "Smugglers") }, + { 673, Pair.New("rockettower", "Smugglers") }, + { 674, Pair.New("research", "Smugglers") }, + { 675, Pair.New("starport", "Smugglers") }, + { 676, Pair.New("palace", "Smugglers") }, + { 677, Pair.New("rifle", "Smugglers") }, + { 678, Pair.New("bazooka", "Smugglers") }, + { 679, Pair.New("saboteur", "Smugglers") }, + { 680, Pair.New("engineer", "Smugglers") }, + { 681, Pair.New("harvester", "Smugglers") }, + { 682, Pair.New("mcv", "Smugglers") }, + { 683, Pair.New("trike", "Smugglers") }, + { 684, Pair.New("quad", "Smugglers") }, + { 685, Pair.New("combato", "Smugglers") }, + { 686, Pair.New("missiletank", "Smugglers") }, + { 687, Pair.New("siegetank", "Smugglers") }, + { 688, Pair.New("carryall", "Smugglers") }, // Mercenaries: - { 700, Pair.New("WALLO", "Mercenaries") }, - { 701, Pair.New("PWRO", "Mercenaries") }, - { 702, Pair.New("CONYARDO", "Mercenaries") }, - { 703, Pair.New("BARRO", "Mercenaries") }, - { 704, Pair.New("REFO", "Mercenaries") }, - { 705, Pair.New("RADARO", "Mercenaries") }, - { 707, Pair.New("LIGHTO", "Mercenaries") }, - { 708, Pair.New("SILOO", "Mercenaries") }, - { 709, Pair.New("HEAVYO", "Mercenaries") }, - { 710, Pair.New("REPAIRO", "Mercenaries") }, - { 711, Pair.New("GUNTOWERO", "Mercenaries") }, - { 712, Pair.New("HIGHTECHO", "Mercenaries") }, - { 713, Pair.New("ROCKETTOWERO", "Mercenaries") }, - { 714, Pair.New("RESEARCHO", "Mercenaries") }, - { 715, Pair.New("STARPORTO", "Mercenaries") }, - { 716, Pair.New("PALACEO", "Mercenaries") }, - { 717, Pair.New("RIFLE", "Mercenaries") }, - { 718, Pair.New("BAZOOKA", "Mercenaries") }, - { 719, Pair.New("SABOTEUR", "Mercenaries") }, - { 720, Pair.New("HARVESTER", "Mercenaries") }, - { 721, Pair.New("HARVESTER", "Mercenaries") }, - { 722, Pair.New("MCVO", "Mercenaries") }, - { 723, Pair.New("TRIKE", "Mercenaries") }, - { 724, Pair.New("QUAD", "Mercenaries") }, - { 725, Pair.New("COMBATO", "Mercenaries") }, - { 726, Pair.New("MISSILETANK", "Mercenaries") }, - { 727, Pair.New("SIEGETANK", "Mercenaries") }, - { 728, Pair.New("CARRYALLO", "Mercenaries") }, + { 700, Pair.New("wall", "Mercenaries") }, + { 701, Pair.New("power", "Mercenaries") }, + { 702, Pair.New("conyard", "Mercenaries") }, + { 703, Pair.New("barracks", "Mercenaries") }, + { 704, Pair.New("refinery", "Mercenaries") }, + { 705, Pair.New("radar", "Mercenaries") }, + { 707, Pair.New("light", "Mercenaries") }, + { 708, Pair.New("silo", "Mercenaries") }, + { 709, Pair.New("heavy", "Mercenaries") }, + { 710, Pair.New("repair", "Mercenaries") }, + { 711, Pair.New("guntower", "Mercenaries") }, + { 712, Pair.New("hightech", "Mercenaries") }, + { 713, Pair.New("rockettower", "Mercenaries") }, + { 714, Pair.New("research", "Mercenaries") }, + { 715, Pair.New("starport", "Mercenaries") }, + { 716, Pair.New("palace", "Mercenaries") }, + { 717, Pair.New("rifle", "Mercenaries") }, + { 718, Pair.New("bazooka", "Mercenaries") }, + { 719, Pair.New("saboteur", "Mercenaries") }, + { 720, Pair.New("harvester", "Mercenaries") }, + { 721, Pair.New("harvester", "Mercenaries") }, + { 722, Pair.New("mcv", "Mercenaries") }, + { 723, Pair.New("trike", "Mercenaries") }, + { 724, Pair.New("quad", "Mercenaries") }, + { 725, Pair.New("combato", "Mercenaries") }, + { 726, Pair.New("missiletank", "Mercenaries") }, + { 727, Pair.New("siegetank", "Mercenaries") }, + { 728, Pair.New("carryall", "Mercenaries") }, }; readonly Ruleset rules; diff --git a/OpenRA.Mods.RA/Traits/Buildings/ClonesProducedUnits.cs b/OpenRA.Mods.RA/Traits/Buildings/ClonesProducedUnits.cs index c083f7ca54..3dc1e0ba8d 100644 --- a/OpenRA.Mods.RA/Traits/Buildings/ClonesProducedUnits.cs +++ b/OpenRA.Mods.RA/Traits/Buildings/ClonesProducedUnits.cs @@ -21,18 +21,20 @@ namespace OpenRA.Mods.RA.Traits [Desc("Uses the \"Cloneable\" trait to determine whether or not we should clone a produced unit.")] public readonly string[] CloneableTypes = { }; - public object Create(ActorInitializer init) { return new ClonesProducedUnits(init.Self, this); } + public object Create(ActorInitializer init) { return new ClonesProducedUnits(init, this); } } public class ClonesProducedUnits : INotifyOtherProduction { readonly ClonesProducedUnitsInfo info; readonly Production production; + readonly string race; - public ClonesProducedUnits(Actor self, ClonesProducedUnitsInfo info) + public ClonesProducedUnits(ActorInitializer init, ClonesProducedUnitsInfo info) { this.info = info; - production = self.Trait(); + production = init.Self.Trait(); + race = init.Contains() ? init.Get() : init.Self.Owner.Country.Race; } public void UnitProducedByOther(Actor self, Actor producer, Actor produced) @@ -45,7 +47,7 @@ namespace OpenRA.Mods.RA.Traits if (ci == null || !info.CloneableTypes.Intersect(ci.Types).Any()) return; - production.Produce(self, produced.Info, self.Owner.Country.Race); + production.Produce(self, produced.Info, race); } } } diff --git a/OpenRA.Mods.RA/Traits/Render/RenderDisguise.cs b/OpenRA.Mods.RA/Traits/Render/RenderDisguise.cs index 7397855081..a0b36af8e2 100644 --- a/OpenRA.Mods.RA/Traits/Render/RenderDisguise.cs +++ b/OpenRA.Mods.RA/Traits/Render/RenderDisguise.cs @@ -15,7 +15,7 @@ namespace OpenRA.Mods.RA.Traits { class RenderDisguiseInfo : RenderInfantryInfo, Requires { - public override object Create(ActorInitializer init) { return new RenderDisguise(init.Self, this); } + public override object Create(ActorInitializer init) { return new RenderDisguise(init, this); } } class RenderDisguise : RenderInfantry @@ -24,11 +24,11 @@ namespace OpenRA.Mods.RA.Traits string intendedSprite; Disguise disguise; - public RenderDisguise(Actor self, RenderDisguiseInfo info) - : base(self, info) + public RenderDisguise(ActorInitializer init, RenderDisguiseInfo info) + : base(init, info) { this.info = info; - disguise = self.Trait(); + disguise = init.Self.Trait(); intendedSprite = disguise.AsSprite; } diff --git a/OpenRA.Mods.RA/Traits/Render/RenderLandingCraft.cs b/OpenRA.Mods.RA/Traits/Render/RenderLandingCraft.cs index 585b8d8adc..66814e8402 100644 --- a/OpenRA.Mods.RA/Traits/Render/RenderLandingCraft.cs +++ b/OpenRA.Mods.RA/Traits/Render/RenderLandingCraft.cs @@ -20,7 +20,7 @@ namespace OpenRA.Mods.RA.Traits public readonly string OpenAnim = "open"; public readonly string UnloadAnim = "unload"; - public override object Create(ActorInitializer init) { return new RenderLandingCraft(init.Self, this); } + public override object Create(ActorInitializer init) { return new RenderLandingCraft(init, this); } } public class RenderLandingCraft : RenderUnit @@ -31,11 +31,11 @@ namespace OpenRA.Mods.RA.Traits readonly IMove move; bool open; - public RenderLandingCraft(Actor self, RenderLandingCraftInfo info) - : base(self) + public RenderLandingCraft(ActorInitializer init, RenderLandingCraftInfo info) + : base(init, info) { this.info = info; - this.self = self; + self = init.Self; cargo = self.Trait(); move = self.Trait(); } diff --git a/OpenRA.Mods.RA/Traits/Render/RenderUnitReload.cs b/OpenRA.Mods.RA/Traits/Render/RenderUnitReload.cs index 9569eeee2e..be78d8c2b5 100644 --- a/OpenRA.Mods.RA/Traits/Render/RenderUnitReload.cs +++ b/OpenRA.Mods.RA/Traits/Render/RenderUnitReload.cs @@ -19,7 +19,7 @@ namespace OpenRA.Mods.RA.Traits [Desc("Armament name")] public readonly string Armament = "primary"; - public override object Create(ActorInitializer init) { return new RenderUnitReload(init.Self, this); } + public override object Create(ActorInitializer init) { return new RenderUnitReload(init, this); } } class RenderUnitReload : RenderUnit @@ -27,11 +27,11 @@ namespace OpenRA.Mods.RA.Traits readonly AttackBase attack; readonly Armament armament; - public RenderUnitReload(Actor self, RenderUnitReloadInfo info) - : base(self) + public RenderUnitReload(ActorInitializer init, RenderUnitReloadInfo info) + : base(init, info) { - attack = self.Trait(); - armament = self.TraitsImplementing() + attack = init.Self.Trait(); + armament = init.Self.TraitsImplementing() .Single(a => a.Info.Name == info.Armament); } diff --git a/OpenRA.Mods.TS/Traits/Render/RenderVoxels.cs b/OpenRA.Mods.TS/Traits/Render/RenderVoxels.cs index d60c9b6909..e3dccf5c21 100644 --- a/OpenRA.Mods.TS/Traits/Render/RenderVoxels.cs +++ b/OpenRA.Mods.TS/Traits/Render/RenderVoxels.cs @@ -46,8 +46,8 @@ namespace OpenRA.Mods.TS.Traits var body = init.Actor.Traits.Get(); var sequenceProvider = init.World.Map.SequenceProvider; var image = Image ?? init.Actor.Name; - var facings = body.QuantizedFacings == -1 ? init.Actor.Traits.Get().QuantizedBodyFacings(sequenceProvider, init.Actor) : body.QuantizedFacings; - var palette = init.WorldRenderer.Palette(Palette ?? (init.Owner != null ? PlayerPalette + init.Owner.InternalName : null)); + var facings = body.QuantizedFacings == -1 ? init.Actor.Traits.Get().QuantizedBodyFacings(init.Actor, sequenceProvider, init.Owner.Country.Race) : body.QuantizedFacings; + var palette = init.WorldRenderer.Palette(Palette ?? PlayerPalette + init.Owner.InternalName); var ifacing = init.Actor.Traits.GetOrDefault(); var facing = ifacing != null ? init.Contains() ? init.Get() : ifacing.GetInitialFacing() : 0; diff --git a/OpenRA.Mods.TS/Traits/Render/WithVoxelBody.cs b/OpenRA.Mods.TS/Traits/Render/WithVoxelBody.cs index 7850ef2ae8..3364d8cca2 100644 --- a/OpenRA.Mods.TS/Traits/Render/WithVoxelBody.cs +++ b/OpenRA.Mods.TS/Traits/Render/WithVoxelBody.cs @@ -34,7 +34,7 @@ namespace OpenRA.Mods.TS.Traits () => false, () => 0); } - public int QuantizedBodyFacings(SequenceProvider sequenceProvider, ActorInfo ai) { return 0; } + public int QuantizedBodyFacings(ActorInfo ai, SequenceProvider sequenceProvider, string race) { return 0; } } public class WithVoxelBody : IAutoSelectionSize diff --git a/OpenRA.Mods.TS/Traits/Render/WithVoxelUnloadBody.cs b/OpenRA.Mods.TS/Traits/Render/WithVoxelUnloadBody.cs index e25d8ded06..47239227cd 100644 --- a/OpenRA.Mods.TS/Traits/Render/WithVoxelUnloadBody.cs +++ b/OpenRA.Mods.TS/Traits/Render/WithVoxelUnloadBody.cs @@ -36,7 +36,7 @@ namespace OpenRA.Mods.TS.Traits () => false, () => 0); } - public int QuantizedBodyFacings(SequenceProvider sequenceProvider, ActorInfo ai) { return 0; } + public int QuantizedBodyFacings(ActorInfo ai, SequenceProvider sequenceProvider, string race) { return 0; } } public class WithVoxelUnloadBody : IAutoSelectionSize diff --git a/OpenRA.Mods.TS/Traits/Render/WithVoxelWalkerBody.cs b/OpenRA.Mods.TS/Traits/Render/WithVoxelWalkerBody.cs index d4862ffadb..f386512c99 100644 --- a/OpenRA.Mods.TS/Traits/Render/WithVoxelWalkerBody.cs +++ b/OpenRA.Mods.TS/Traits/Render/WithVoxelWalkerBody.cs @@ -20,7 +20,7 @@ namespace OpenRA.Mods.TS.Traits public readonly int TickRate = 5; public object Create(ActorInitializer init) { return new WithVoxelWalkerBody(init.Self, this); } - public int QuantizedBodyFacings(SequenceProvider sequenceProvider, ActorInfo ai) { return 0; } + public int QuantizedBodyFacings(ActorInfo ai, SequenceProvider sequenceProvider, string race) { return 0; } } public class WithVoxelWalkerBody : IAutoSelectionSize, ITick diff --git a/mods/cnc/rules/structures.yaml b/mods/cnc/rules/structures.yaml index 7f9c6489f0..ec1b7d2837 100644 --- a/mods/cnc/rules/structures.yaml +++ b/mods/cnc/rules/structures.yaml @@ -1,9 +1,5 @@ FACT: Inherits: ^BaseBuilding - Buildable: - Queue: Building.GDI, Building.Nod - BuildPaletteOrder: 1000 - Prerequisites: ~disabled Valued: Cost: 2000 Tooltip: @@ -20,7 +16,7 @@ FACT: Range: 10c0 Bib: Production: - Produces: Building.GDI, Buildings.Nod, Defence.GDI, Defence.Nod + Produces: Building.GDI, Building.Nod, Defence.GDI, Defence.Nod Transforms: IntoActor: mcv Offset: 1,1 @@ -77,6 +73,30 @@ FACT: Power: Amount: 0 +FACT.GDI: + Inherits: FACT + RenderBuilding: + Image: fact + Buildable: + Queue: Building.GDI, Building.Nod + BuildPaletteOrder: 1000 + Prerequisites: ~disabled + ForceRace: gdi + Tooltip: + Name: Construction Yard (GDI) + +FACT.NOD: + Inherits: FACT + RenderBuilding: + Image: fact + Buildable: + Queue: Building.GDI, Building.Nod + BuildPaletteOrder: 1000 + Prerequisites: ~disabled + ForceRace: nod + Tooltip: + Name: Construction Yard (Nod) + NUKE: Inherits: ^BaseBuilding Valued: diff --git a/mods/cnc/rules/vehicles.yaml b/mods/cnc/rules/vehicles.yaml index 26a9a9e4ca..9b66b860b8 100644 --- a/mods/cnc/rules/vehicles.yaml +++ b/mods/cnc/rules/vehicles.yaml @@ -25,7 +25,7 @@ MCV: Offset: -1,-1 Facing: 108 TransformSounds: constru2.aud, hvydoor1.aud - NoTransformSounds: deploy1.aud + NoTransformNotification: BuildingCannotPlaceAudio RenderUnit: MustBeDestroyed: RequiredForShortGame: true diff --git a/mods/d2k/audio/notifications.yaml b/mods/d2k/audio/notifications.yaml index 4fec334269..0a30b8e89e 100644 --- a/mods/d2k/audio/notifications.yaml +++ b/mods/d2k/audio/notifications.yaml @@ -35,6 +35,7 @@ Speech: WormAttack: WATTK EnemyUnitsApproaching: ENEMY UnitRepaired: GANEW + CannotDeploy: DPLOY Sounds: DefaultVariant: .WAV diff --git a/mods/d2k/maps/shellmap/map.yaml b/mods/d2k/maps/shellmap/map.yaml index c7609930df..47d72884ee 100644 --- a/mods/d2k/maps/shellmap/map.yaml +++ b/mods/d2k/maps/shellmap/map.yaml @@ -62,16 +62,16 @@ Actors: Actor29: concretea Location: 54,59 Owner: Neutral - Actor30: pwra + Actor30: power Location: 54,58 Owner: Atreides Actor31: concretea Location: 54,62 Owner: Neutral - Actor32: siloa + Actor32: silo Location: 54,62 Owner: Atreides - Actor33: guntowera + Actor33: guntower Location: 54,63 Owner: Atreides Actor34: siegetank @@ -87,13 +87,13 @@ Actors: Actor37: concreteb Location: 50,37 Owner: Neutral - Actor38: palacec + Actor38: palace Location: 50,37 Owner: Creeps - Actor39: barrh + Actor39: barracks Location: 48,37 Owner: Creeps - Actor40: rockettowerh + Actor40: rockettower Location: 46,39 Owner: Creeps Actor41: sardaukar @@ -108,9 +108,10 @@ Actors: Entry: waypoint Location: 80, 8 Owner: Neutral - AtreidesSpiceRefinery: refa + AtreidesSpiceRefinery: refinery Location: 57,58 Owner: Atreides + FreeActor: false Smudges: @@ -126,20 +127,15 @@ Rules: Maximum: 1 LuaScript: Scripts: shellmap.lua - REFA: - -FreeActor: - CARRYALLA: - -AutoCarryall: + carryall.scripted: Helicopter: - CruiseAltitude: 2048 - LandAltitude: 512 LandWhenIdle: True Cargo: Types: Vehicle WithCargo: DisplayTypes: Vehicle LocalOffset: 0,0,-256 - ROCKETTOWERH: + rockettower: Power: Amount: 100 diff --git a/mods/d2k/maps/shellmap/shellmap.lua b/mods/d2k/maps/shellmap/shellmap.lua index e096e1e0a4..8c8ae472c9 100644 --- a/mods/d2k/maps/shellmap/shellmap.lua +++ b/mods/d2k/maps/shellmap/shellmap.lua @@ -4,7 +4,7 @@ InitializeHarvester = function(harvester) end InsertHarvester = function() - local harvesters = Reinforcements.ReinforceWithTransport(atreides, "carryalla", { "harvester" }, + local harvesters = Reinforcements.ReinforceWithTransport(atreides, "carryall.scripted", { "harvester" }, { Entry.Location, AtreidesSpiceRefinery.Location + CVec.New(2, 3) }, { Entry.Location })[2] Utils.Do(harvesters, function(harvester) diff --git a/mods/d2k/mod.yaml b/mods/d2k/mod.yaml index a5429cc922..7e1fcd2fcf 100644 --- a/mods/d2k/mod.yaml +++ b/mods/d2k/mod.yaml @@ -30,14 +30,12 @@ Rules: ./mods/d2k/rules/world.yaml ./mods/d2k/rules/defaults.yaml ./mods/d2k/rules/vehicles.yaml + ./mods/d2k/rules/starport.yaml + ./mods/d2k/rules/husks.yaml ./mods/d2k/rules/structures.yaml ./mods/d2k/rules/aircraft.yaml ./mods/d2k/rules/infantry.yaml - ./mods/d2k/rules/atreides.yaml - ./mods/d2k/rules/harkonnen.yaml - ./mods/d2k/rules/ordos.yaml ./mods/d2k/rules/arrakis.yaml - ./mods/d2k/rules/corrino.yaml Sequences: ./mods/d2k/sequences/aircraft.yaml diff --git a/mods/d2k/rules/ai.yaml b/mods/d2k/rules/ai.yaml index d5f2893331..26e011c35e 100644 --- a/mods/d2k/rules/ai.yaml +++ b/mods/d2k/rules/ai.yaml @@ -3,84 +3,39 @@ Player: Name: Omnius UnitQueues: Infantry, Vehicle, Armor, Starport BuildingCommonNames: - ConstructionYard: conyarda,conyardh,conyardo - Refinery: refa,refh,refo - Power: pwra,pwrh,pwro - Barracks: barra,barrh,barro - VehiclesFactory: lighta,lighth,lighto,heavya,heavyh,heavyo - Production: lighta,lighth,lighto,heavya,heavyh,heavyo,barra,barrh,barro - Silo: siloa, siloh, siloo + ConstructionYard: conyard + Refinery: refinery + Power: power + VehiclesFactory: light, heavy, starport + Production: light, heavy, barracks, starport + Silo: silo UnitsCommonNames: - Mcv: mcva,mcvh,mcvo + Mcv: mcv BuildingLimits: - refa: 4 - refh: 4 - refo: 4 - barra: 1 - barrh: 1 - barro: 1 - lighta: 1 - lighth: 1 - lighto: 1 - heavya: 1 - heavyh: 1 - heavyo: 1 - researcha: 1 - researchh: 1 - researcho: 1 - repaira: 1 - repairh: 1 - repairo: 1 - radara: 1 - radaro: 1 - radarh: 1 - hightecha: 1 - hightechh: 1 - hightecho: 1 - palacea: 1 - palaceh: 1 - palaceo: 1 + refinery: 4 + barracks: 1 + light: 1 + heavy: 1 + research: 1 + repair: 1 + radar: 1 + hightech: 1 + palace: 1 BuildingFractions: - refa: 20.1% - refh: 20.1% - refo: 20.1% - barra: 0.1% - barrh: 0.1% - barro: 0.1% - lighta: 0.1% - lighth: 0.1% - lighto: 0.1% - heavya: 0.1% - heavyh: 0.1% - heavyo: 0.1% - radara: 0.1% - radaro: 0.1% - radarh: 0.1% - hightecha: 0.1% - hightechh: 0.1% - hightecho: 0.1% - starporta: 0.1% - starporth: 0.1% - starporto: 0.1% - researcha: 0.1% - researchh: 0.1% - researcho: 0.1% - repaira: 0.1% - repairh: 0.1% - repairo: 0.1% - guntowera: 8% - guntowerh: 8% - guntowero: 8% - rockettowera: 6% - rockettowerh: 6% - rockettowero: 6% - pwra: 10% - pwrh: 10% - pwro: 10% + refinery: 20.1% + barracks: 0.1% + light: 0.1% + heavy: 0.1% + radar: 0.1% + hightech: 0.1% + starport: 0.1% + research: 0.1% + repair: 0.1% + guntower: 8% + rockettower: 6% + power: 10% UnitsToBuild: - carryalla: 1% - carryallh: 1% - carryallo: 1% + carryall: 1% rifle: 6% bazooka: 5% medic: 1% @@ -165,84 +120,39 @@ Player: Name: Vidious UnitQueues: Infantry, Vehicle, Armor, Starport BuildingCommonNames: - ConstructionYard: conyarda,conyardh,conyardo - Refinery: refa,refh,refo - Power: pwra,pwrh,pwro - Barracks: barra,barrh,barro - VehiclesFactory: lighta,lighth,lighto,heavya,heavyh,heavyo - Production: lighta,lighth,lighto,heavya,heavyh,heavyo,barra,barrh,barro - Silo: siloa, siloh, siloo + ConstructionYard: conyard + Refinery: refinery + Power: power + VehiclesFactory: light, heavy, starport + Production: light, heavy, barracks, starport + Silo: silo UnitsCommonNames: - Mcv: mcva,mcvh,mcvo + Mcv: mcv BuildingLimits: - refa: 4 - refh: 4 - refo: 4 - barra: 1 - barrh: 1 - barro: 1 - lighta: 1 - lighth: 1 - lighto: 1 - heavya: 1 - heavyh: 1 - heavyo: 1 - researcha: 1 - researchh: 1 - researcho: 1 - repaira: 1 - repairh: 1 - repairo: 1 - radara: 1 - radaro: 1 - radarh: 1 - hightecha: 1 - hightechh: 1 - hightecho: 1 - palacea: 1 - palaceh: 1 - palaceo: 1 + refinery: 4 + barracks: 1 + light: 1 + heavy: 1 + research: 1 + repair: 1 + radar: 1 + hightech: 1 + palace: 1 BuildingFractions: - refa: 20.1% - refh: 20.1% - refo: 20.1% - barra: 0.1% - barrh: 0.1% - barro: 0.1% - lighta: 0.1% - lighth: 0.1% - lighto: 0.1% - heavya: 0.1% - heavyh: 0.1% - heavyo: 0.1% - radara: 0.1% - radaro: 0.1% - radarh: 0.1% - hightecha: 0.1% - hightechh: 0.1% - hightecho: 0.1% - repaira: 0.1% - repairh: 0.1% - repairo: 0.1% - starporta: 0.1% - starporth: 0.1% - starporto: 0.1% - palacea: 0.1% - palaceh: 0.1% - palaceo: 0.1% - guntowera: 5% - guntowerh: 5% - guntowero: 5% - rockettowera: 10% - rockettowerh: 10% - rockettowero: 10% - pwra: 12% - pwrh: 12% - pwro: 12% + refinery: 20.1% + barracks: 0.1% + light: 0.1% + heavy: 0.1% + radar: 0.1% + hightech: 0.1% + repair: 0.1% + starport: 0.1% + palace: 0.1% + guntower: 5% + rockettower: 10% + power: 12% UnitsToBuild: - carryalla: 1% - carryallh: 1% - carryallo: 1% + carryall: 1% rifle: 2% bazooka: 2% medic: 0.5% @@ -327,84 +237,39 @@ Player: Name: Gladius UnitQueues: Infantry, Vehicle, Armor, Starport BuildingCommonNames: - ConstructionYard: conyarda,conyardh,conyardo - Refinery: refa,refh,refo - Power: pwra,pwrh,pwro - Barracks: barra,barrh,barro - VehiclesFactory: lighta,lighth,lighto,heavya,heavyh,heavyo - Production: lighta,lighth,lighto,heavya,heavyh,heavyo,barra,barrh,barro - Silo: siloa, siloh, siloo + ConstructionYard: conyard + Refinery: refinery + Power: power + VehiclesFactory: light, heavy, starport + Production: light, heavy, barracks, starport + Silo: silo UnitsCommonNames: - Mcv: mcva,mcvh,mcvo + Mcv: mcv BuildingLimits: - refa: 4 - refh: 4 - refo: 4 - barra: 1 - barrh: 1 - barro: 1 - lighta: 1 - lighth: 1 - lighto: 1 - heavya: 1 - heavyh: 1 - heavyo: 1 - researcha: 1 - researchh: 1 - researcho: 1 - repaira: 1 - repairh: 1 - repairo: 1 - radara: 1 - radaro: 1 - radarh: 1 - hightecha: 1 - hightechh: 1 - hightecho: 1 - palacea: 1 - palaceh: 1 - palaceo: 1 + refinery: 4 + barracks: 1 + light: 1 + heavy: 1 + research: 1 + repair: 1 + radar: 1 + hightech: 1 + palace: 1 BuildingFractions: - refa: 20.1% - refh: 20.1% - refo: 20.1% - barra: 0.1% - barrh: 0.1% - barro: 0.1% - lighta: 0.1% - lighth: 0.1% - lighto: 0.1% - heavya: 0.1% - heavyh: 0.1% - heavyo: 0.1% - repaira: 0.1% - repairh: 0.1% - repairo: 0.1% - radara: 0.1% - radaro: 0.1% - radarh: 0.1% - hightecha: 0.1% - hightechh: 0.1% - hightecho: 0.1% - researcha: 0.1% - researchh: 0.1% - researcho: 0.1% - palacea: 0.1% - palaceh: 0.1% - palaceo: 0.1% - guntowera: 4% - guntowerh: 4% - guntowero: 4% - rockettowera: 12% - rockettowerh: 12% - rockettowero: 12% - pwra: 10% - pwrh: 10% - pwro: 10% + refinery: 20.1% + barracks: 0.1% + light: 0.1% + heavy: 0.1% + repair: 0.1% + radar: 0.1% + hightech: 0.1% + research: 0.1% + palace: 0.1% + guntower: 4% + rockettower: 12% + power: 10% UnitsToBuild: - carryalla: 1% - carryallh: 1% - carryallo: 1% + carryall: 1% rifle: 15% bazooka: 13% medic: 2% @@ -485,4 +350,3 @@ Player: Attractiveness: -10 TargetMetric: Value CheckRadius: 7c0 - diff --git a/mods/d2k/rules/aircraft.yaml b/mods/d2k/rules/aircraft.yaml index 188f5b0d7a..e3858bd7d7 100644 --- a/mods/d2k/rules/aircraft.yaml +++ b/mods/d2k/rules/aircraft.yaml @@ -1,46 +1,98 @@ -^CARRYALL: +carryall.scripted: Inherits: ^Helicopter Valued: Cost: 1200 Tooltip: Name: Carryall Description: Large winged, planet-bound ship\n Automatically lifts harvesters. - Buildable: - Queue: Aircraft - BuildPaletteOrder: 120 Health: HP: 250 Armor: Type: Light Helicopter: - CruiseAltitude: 2100 + CruiseAltitude: 2048 InitialFacing: 0 ROT: 4 Speed: 160 LandableTerrainTypes: Sand, Rock, Transition, Spice, Dune - RepairBuildings: repaira,repairo,repairh - RearmBuildings: starporta,starporto,starporth + RepairBuildings: repair + RearmBuildings: Repulsable: False - LandAltitude: 100 + LandAltitude: 512 LandWhenIdle: False + RenderUnit: + Image: carryall WithShadow: LeavesHusk: - HuskActor: CARRYALL.Husk + HuskActor: carryall.husk -Selectable: - AutoCarryall: -FRIGATE: +carryall: + Inherits: carryall.scripted + AutoCarryall: + Buildable: + Queue: Aircraft + BuildPaletteOrder: 120 + Helicopter: + CruiseAltitude: 2100 + LandAltitude: 100 + +carryall.infantry: + Inherits: ^Plane + ParaDrop: + DropRange: 5c0 + ChuteSound: + Health: + HP: 200 + Armor: + Type: Light + RevealsShroud: + Range: 12c0 + Plane: + ROT: 4 + Speed: 280 + RepairBuildings: repair + RearmBuildings: + Repulsable: False + RenderUnit: + Image: carryall + WithShadow: + Cargo: + MaxWeight: 5 + Types: Infantry + -Selectable: + -GainsExperience: + Tooltip: + Name: Carryall + LeavesHusk: + HuskActor: carryall.infantry.husk + RejectsOrders: + +carryall.husk: + Inherits: ^AircraftHusk + Tooltip: + Name: Carryall + Helicopter: + ROT: 4 + Speed: 210 + RepairBuildings: repair + RearmBuildings: + RenderUnit: + Image: carryall + WithShadow: + +frigate: + Inherits: ^Plane ParaDrop: DropRange: 1c0 - Inherits: ^Plane Tooltip: Name: Frigate Description: Supply spacecraft Plane: ROT: 5 Speed: 350 - RepairBuildings: repaira,repairo,repairh - RearmBuildings: starporta,starporto,starporth + RepairBuildings: repair + RearmBuildings: Repulsable: False Health: HP: 500 @@ -48,8 +100,6 @@ FRIGATE: -AppearsOnRadar: Armor: Type: Heavy - RenderUnit: - Image: frigate WithShadow: Cargo: MaxWeight: 20 @@ -60,7 +110,7 @@ FRIGATE: FlyAwayOnIdle: RejectsOrders: -ORNI: +orni: Inherits: ^Helicopter Valued: Cost: 1000 @@ -83,16 +133,16 @@ ORNI: InitialFacing: 20 ROT: 6 Speed: 280 - RepairBuildings: repaira,repairo,repairh - RearmBuildings: starporta,starporto,starporth + RepairBuildings: repair + RearmBuildings: RenderUnit: WithShadow: Selectable: Bounds: 38,32,0,0 LeavesHusk: - HuskActor: ORNI.Husk + HuskActor: orni.husk -ORNI.bomber: +orni.bomber: AttackBomber: Armament: Weapon: Napalm @@ -104,8 +154,8 @@ ORNI.bomber: Plane: ROT: 5 Speed: 350 - RepairBuildings: repaira,repairo,repairh - RearmBuildings: starporta,starporto,starporth + RepairBuildings: repair + RearmBuildings: Repulsable: False LimitedAmmo: Ammo: 5 @@ -117,111 +167,44 @@ ORNI.bomber: Tooltip: Name: Ornithopter LeavesHusk: - HuskActor: ORNI.bomber.Husk + HuskActor: orni.bomber.husk RejectsOrders: -CARRYALL.infantry: - ParaDrop: - DropRange: 5c0 - ChuteSound: - Inherits: ^Plane - Health: - HP: 200 - Armor: - Type: Light - RevealsShroud: - Range: 12c0 - Plane: - ROT: 4 - Speed: 280 - RepairBuildings: repaira,repairo,repairh - RearmBuildings: starporta,starporto,starporth - Repulsable: False - RenderUnit: - Image: carryall - WithShadow: - Cargo: - MaxWeight: 5 - Types: Infantry - -Selectable: - -GainsExperience: - Tooltip: - Name: Carryall - LeavesHusk: - HuskActor: CARRYALL.infantry.Husk - RejectsOrders: - -BADR: - Inherits: CARRYALL.infantry - ParaDrop: - DropRange: 4c0 - Tooltip: - Name: Crate Carryall - LeavesHusk: - HuskActor: BADR.Husk - -CARRYALL.Husk: - Inherits: ^AircraftHusk - Tooltip: - Name: Carryall - Helicopter: - ROT: 4 - Speed: 210 - RepairBuildings: repaira,repairo,repairh - RearmBuildings: starporta,starporto,starporth - RenderUnit: - Image: carryall - WithShadow: - -ORNI.Husk: +orni.husk: Inherits: ^AircraftHusk Tooltip: Name: Ornithopter Helicopter: ROT: 6 Speed: 280 - RepairBuildings: repaira,repairo,repairh - RearmBuildings: starporta,starporto,starporth + RepairBuildings: repair + RearmBuildings: RenderUnit: Image: orni WithShadow: -ORNI.bomber.Husk: +orni.bomber.husk: Inherits: ^AircraftHusk Tooltip: Name: Ornithopter Plane: ROT: 5 Speed: 350 - RepairBuildings: repaira,repairo,repairh - RearmBuildings: starporta,starporto,starporth + RepairBuildings: repair + RearmBuildings: RenderUnit: Image: orni WithShadow: -CARRYALL.infantry.Husk: +carryall.infantry.husk: Inherits: ^AircraftHusk Tooltip: Name: Carryall Plane: ROT: 4 Speed: 280 - RepairBuildings: repaira,repairo,repairh - RearmBuildings: starporta,starporto,starporth + RepairBuildings: repair + RearmBuildings: RenderUnit: Image: carryall WithShadow: - -BADR.Husk: - Inherits: ^AircraftHusk - Tooltip: - Name: Crate Carryall - Plane: - ROT: 4 - Speed: 280 - RepairBuildings: repaira,repairo,repairh - RearmBuildings: starporta,starporto,starporth - RenderUnit: - Image: carryall - WithShadow: - diff --git a/mods/d2k/rules/arrakis.yaml b/mods/d2k/rules/arrakis.yaml index ea6968d4cb..df6d534edb 100644 --- a/mods/d2k/rules/arrakis.yaml +++ b/mods/d2k/rules/arrakis.yaml @@ -1,4 +1,4 @@ -SPICEBLOOM: +spicebloom: RenderBuilding: Building: Footprint: x @@ -19,7 +19,7 @@ SPICEBLOOM: BodyOrientation: WithMakeAnimation: -SANDWORM: +sandworm: Tooltip: Name: Sandworm Description: Attracted by vibrations in the sand.\nWill eat units whole and has a large appetite. @@ -53,4 +53,25 @@ SANDWORM: IgnoresCloak: AnnounceOnSeen: Notification: WormSign - PingRadar: True \ No newline at end of file + PingRadar: True + +sietch: + Inherits: ^Building + Tooltip: + Name: Fremen Sietch + Building: + Footprint: xx xx + Dimensions: 2,2 + TerrainTypes: Cliff + Health: + HP: 400 + Armor: + Type: Concrete + RevealsShroud: + Range: 10c0 + -GivesBuildableArea: + -Sellable: + -ExternalCapturable: + -ExternalCapturableBar: + Power: + Amount: 0 \ No newline at end of file diff --git a/mods/d2k/rules/atreides.yaml b/mods/d2k/rules/atreides.yaml deleted file mode 100644 index 65503c77e3..0000000000 --- a/mods/d2k/rules/atreides.yaml +++ /dev/null @@ -1,282 +0,0 @@ -CONYARDA: - Inherits: ^CONYARD - -PWRA: - Inherits: ^POWER - Buildable: - Prerequisites: ~conyarda - -WALLA: - Inherits: ^WALL - Buildable: - Prerequisites: ~conyarda, barracks - -GUNTOWERA: - Inherits: ^GUNTOWER - Buildable: - Prerequisites: ~conyarda, barracks - -ROCKETTOWERA: - Inherits: ^ROCKETTOWER - Buildable: - Prerequisites: ~conyarda, radar - -REFA: - Inherits: ^REFINERY - Buildable: - Prerequisites: ~conyarda, power - -BARRA: - Inherits: ^BARRACKS - Buildable: - Prerequisites: ~conyarda, power - ProvidesCustomPrerequisite@MEDICS: - Prerequisite: medics - ProvidesCustomPrerequisite@BARRACKS: - Prerequisite: barracks - -REPAIRA: - Inherits: ^REPAIR - Buildable: - Prerequisites: ~conyarda, heavy - -RESEARCHA: - Inherits: ^RESEARCH - Buildable: - Prerequisites: ~conyarda, hightech - -HIGHTECHA: - Inherits: ^HIGHTECH - Buildable: - Prerequisites: ~conyarda, radar - -PALACEA: - Inherits: ^PALACE - Buildable: - Prerequisites: ~conyarda, research - AirstrikePower: - Icon: ornistrike - Prerequisites: ~techlevel.superweapons - Description: Air Strike - SquadSize: 3 - ChargeTime: 180 - LongDesc: Ornithopter drops a load of parachuted\nbombs on your target - UnitType: orni.bomber - SelectTargetSound: - DisplayBeacon: True - CameraActor: camera - CanPowerDown: - DisabledOverlay: - RequiresPower: - SupportPowerChargeBar: - -SILOA: - Inherits: ^SILO - Buildable: - Prerequisites: ~conyarda, refinery - -LIGHTA: - Inherits: ^LIGHT - Buildable: - Prerequisites: ~conyarda, refinery - ProvidesCustomPrerequisite@TRIKES: - Prerequisite: trikes - ProvidesCustomPrerequisite@LIGHT: - Prerequisite: light - -HEAVYA: - Inherits: ^HEAVY - Buildable: - Prerequisites: ~conyarda, refinery - -RADARA: - Inherits: ^RADAR - Buildable: - Prerequisites: ~conyarda, barracks - -STARPORTA: - Inherits: ^STARPORT - Buildable: - Prerequisites: ~conyarda, radar - -MCVA: - Inherits: ^MCV - Buildable: - Prerequisites: ~heavya, repair - Transforms: - Facing: 16 - IntoActor: conyarda - Offset: -1,-1 - NoTransformSounds: AI_DPLOY.AUD - RenderUnit: - Image: DMCV - -MCVA.starport: - Inherits: MCVA - Buildable: - Prerequisites: ~starporta, repair - Queue: Starport - Valued: - Cost: 2500 - -CARRYALLA: - Inherits: ^CARRYALL - RenderUnit: - Image: CARRYALL - Buildable: - Prerequisites: refinery, ~hightecha - -CARRYALLA.starport: - Inherits: CARRYALLA - Valued: - Cost: 1500 - Buildable: - Prerequisites: ~starporta - Queue: Starport - -COMBATA: - Inherits: ^COMBAT - Buildable: - Prerequisites: ~heavya - RevealsShroud: - Range: 8c0 - Turreted: - ROT: 6 - Armament: - Weapon: 90mma - Recoil: 128 - RecoilRecovery: 32 - LocalOffset: 256,0,0 - AttackTurreted: - RenderUnit: - Image: COMBATA - WithTurret: - LeavesHusk: - HuskActor: Combata.Husk - -COMBATA.Husk: - Inherits: ^COMBAT.Husk - RenderUnit: - Image: combata.destroyed - TransformOnCapture: - IntoActor: combata - -COMBATA.starport: - Inherits: COMBATA - Buildable: - Prerequisites: ~starporta - Queue: Starport - Valued: - Cost: 875 - -SONICTANK: - Inherits: ^Vehicle - Buildable: - Queue: Armor - BuildPaletteOrder: 100 - Prerequisites: ~heavya, research, ~techlevel.high - Valued: - Cost: 1250 - Tooltip: - Name: Sonic Tank - Description: Fires sonic shocks\n Strong vs Infantry, Vehicles\n Weak vs Artillery, Aircraft - Selectable: - Bounds: 30,30 - Health: - HP: 130 - Armor: - Type: Light - Mobile: - ROT: 3 - Speed: 74 - RevealsShroud: - Range: 6c0 - RenderUnit: - Image: SONICTANK - Armament: - Weapon: Sound - LocalOffset: 640,0,427 - AttackFrontal: - AutoTarget: - Explodes: - Weapon: UnitExplodeSmall - EmptyWeapon: UnitExplodeSmall - LeavesHusk: - HuskActor: Sonictank.Husk - AttractsWorms: - Intensity: 600 - -SONICTANK.Husk: - Inherits: ^Husk - RenderUnit: - Image: sonictank.destroyed - TransformOnCapture: - IntoActor: sonictank - -FREMEN: - Inherits: ^Infantry - Valued: - Cost: 800 - Tooltip: - Name: Fremen - Description: Elite sniper infantry unit\n Strong vs Infantry\n Weak vs Vehicles\n Special Ability: Invisibility - Buildable: - Queue: Infantry - BuildPaletteOrder: 85 - Prerequisites: ~barra, palace, ~techlevel.high - Selectable: - Bounds: 12,17,0,0 - Voice: FremenVoice - Mobile: - Speed: 53 - Health: - HP: 70 - Passenger: - RevealsShroud: - Range: 7c0 - AutoTarget: - ScanRadius: 7 - Armament@PRIMARY: - Weapon: Sniper - Armament@SECONDARY: - Weapon: Slung - AttackFrontal: - TakeCover: - Cloak: - InitialDelay: 250 - CloakDelay: 250 - CloakSound: STEALTH1.WAV - UncloakSound: STEALTH2.WAV - -MustBeDestroyed: - -GRENADIER: - Inherits: ^Infantry - Buildable: - Queue: Infantry - BuildPaletteOrder: 10 - Prerequisites: ~barra, ~techlevel.medium - Valued: - Cost: 160 - Tooltip: - Name: Grenadier - Description: Infantry armed with grenades. \n Strong vs Buildings, Infantry\n Weak vs Vehicles - Selectable: - Bounds: 12,17,0,0 - Health: - HP: 50 - Mobile: - Speed: 53 - Armament: - Weapon: Grenade - LocalOffset: 0,0,555 - FireDelay: 15 - AttackFrontal: - TakeCover: - RenderInfantry: - IdleAnimations: idle - Explodes: - Weapon: UnitExplodeSmall - Chance: 100 - AttractsWorms: - Intensity: 180 - diff --git a/mods/d2k/rules/corrino.yaml b/mods/d2k/rules/corrino.yaml deleted file mode 100644 index e356aa00af..0000000000 --- a/mods/d2k/rules/corrino.yaml +++ /dev/null @@ -1,18 +0,0 @@ -CONYARDC: - Inherits: ^CONYARD - -STARPORTC: - Inherits: ^STARPORT - -Buildable: - -PALACEC: - Inherits: ^PALACE - -Buildable: - Building: - Footprint: =x= xxx xxx - Dimensions: 3,3 - RenderBuilding: - -HEAVYC: - Inherits: ^HEAVY - -Buildable: diff --git a/mods/d2k/rules/defaults.yaml b/mods/d2k/rules/defaults.yaml index 76d648ac8f..82657a063c 100644 --- a/mods/d2k/rules/defaults.yaml +++ b/mods/d2k/rules/defaults.yaml @@ -28,7 +28,7 @@ Types: Vehicle GivesBounty: Repairable: - RepairBuildings: repaira,repairo,repairh + RepairBuildings: repair CombatDebugOverlay: Guard: Voice: Guard @@ -83,7 +83,7 @@ Types: Tank GivesBounty: Repairable: - RepairBuildings: repaira,repairo,repairh + RepairBuildings: repair CombatDebugOverlay: Guard: Voice: Guard @@ -135,6 +135,7 @@ ForceHealthPercentage: 25 DisabledOverlay: ScriptTriggers: + RenderUnit: ^TowerHusk: Health: @@ -271,6 +272,7 @@ UpgradeManager: AnnounceOnSeen: Notification: EnemyUnitsApproaching + RenderUnit: ^Helicopter: Inherits: ^Plane diff --git a/mods/d2k/rules/harkonnen.yaml b/mods/d2k/rules/harkonnen.yaml deleted file mode 100644 index 1345418b10..0000000000 --- a/mods/d2k/rules/harkonnen.yaml +++ /dev/null @@ -1,248 +0,0 @@ -CONYARDH: - Inherits: ^CONYARD - -PWRH: - Inherits: ^POWER - Buildable: - Prerequisites: ~conyardh - -WALLH: - Inherits: ^WALL - Buildable: - Prerequisites: ~conyardh, barracks - -GUNTOWERH: - Inherits: ^GUNTOWER - Buildable: - Prerequisites: ~conyardh, barracks - -ROCKETTOWERH: - Inherits: ^ROCKETTOWER - Buildable: - Prerequisites: ~conyardh, radar - -REFH: - Inherits: ^REFINERY - Buildable: - Prerequisites: ~conyardh, power - -BARRH: - Inherits: ^BARRACKS - Buildable: - Prerequisites: ~conyardh, power - -REPAIRH: - Inherits: ^REPAIR - Buildable: - Prerequisites: ~conyardh, heavy - -RESEARCHH: - Inherits: ^RESEARCH - Buildable: - Prerequisites: ~conyardh, hightech - -SILOH: - Inherits: ^SILO - Buildable: - Prerequisites: ~conyardh, refinery - -LIGHTH: - Inherits: ^LIGHT - Buildable: - Prerequisites: ~conyardh, refinery - ProvidesCustomPrerequisite@TRIKES: - Prerequisite: trikes - ProvidesCustomPrerequisite@LIGHT: - Prerequisite: light - -HEAVYH: - Inherits: ^HEAVY - Buildable: - Prerequisites: ~conyardh, refinery - -RADARH: - Inherits: ^RADAR - Buildable: - Prerequisites: ~conyardh, barracks - -STARPORTH: - Inherits: ^STARPORT - Buildable: - Prerequisites: ~conyardh, radar - -HIGHTECHH: - Inherits: ^HIGHTECH - Buildable: - Prerequisites: ~conyardh, radar - -PALACEH: - Inherits: ^PALACE - Buildable: - Prerequisites: ~conyardh, research - Tooltip: - Description: Provides elite infantry\n Special Ability: Death Hand Missile - NukePower: - Icon: deathhand - ChargeTime: 300 - Description: Death Hand - Prerequisites: ~techlevel.superweapons - LongDesc: Launches a nuclear missile at a target location - BeginChargeSound: HI_PREP.AUD - EndChargeSound: HI_DHRDY.AUD - SelectTargetSound: - LaunchSound: - IncomingSound: - MissileWeapon: atomic - SpawnOffset: -512,1c171,0 - DisplayBeacon: True - DisplayRadarPing: True - CameraActor: camera - CanPowerDown: - DisabledOverlay: - RequiresPower: - SupportPowerChargeBar: - -MCVH: - Inherits: ^MCV - Buildable: - Prerequisites: ~heavyh, repair - Transforms: - Facing: 16 - IntoActor: conyardh - Offset: -1,-1 - NoTransformSounds: HI_DPLOY.AUD - RenderUnit: - Image: DMCV - -MCVH.starport: - Inherits: MCVH - Buildable: - Prerequisites: ~starporth, repair - Queue: Starport - Valued: - Cost: 2500 - -CARRYALLH: - Inherits: ^CARRYALL - RenderUnit: - Image: CARRYALL - Buildable: - Prerequisites: refinery, ~hightechh - -CARRYALLH.starport: - Inherits: CARRYALLH - Valued: - Cost: 1500 - Buildable: - Prerequisites: ~starporth - Queue: Starport - -COMBATH: - Inherits: ^COMBAT - Buildable: - Prerequisites: ~heavyh - Mobile: - Speed: 53 - ROT: 4 - Turreted: - ROT: 5 - Health: - HP: 440 - RenderUnit: - Image: COMBATH - WithTurret: - LeavesHusk: - HuskActor: Combath.Husk - -COMBATH.Husk: - Inherits: ^COMBAT.Husk - RenderUnit: - Image: combath.destroyed - TransformOnCapture: - IntoActor: combath - -COMBATH.starport: - Inherits: COMBATH - Buildable: - Prerequisites: ~starporth - Queue: Starport - Valued: - Cost: 875 - -DEVAST: - Inherits: ^Tank - Buildable: - Queue: Armor - BuildPaletteOrder: 100 - Prerequisites: ~heavyh, research, ~techlevel.high - Valued: - Cost: 1200 - Tooltip: - Name: Devastator - Description: Super Heavy Tank\n Strong vs Tanks\n Weak vs Artillery, Aircraft - Health: - HP: 650 - Armor: - Type: Heavy - Mobile: - ROT: 3 - Speed: 42 - Crushes: crate, infantry - RevealsShroud: - Range: 7c0 - RenderUnit: - Armament: - Weapon: DevBullet - LocalOffset: 256,0,32 - MuzzleSequence: muzzle - AttackFrontal: - WithMuzzleFlash: - AutoTarget: - Explodes: - Weapon: UnitExplodeScale - EmptyWeapon: UnitExplodeScale - Selectable: - Bounds: 44,38,0,0 - LeavesHusk: - HuskActor: Devast.Husk - AttractsWorms: - Intensity: 700 - -DEVAST.Husk: - Inherits: ^Husk - Health: - HP: 125 - RenderUnit: - Image: devast.destroyed - TransformOnCapture: - IntoActor: devast - -SARDAUKAR: - Inherits: ^Infantry - Buildable: - Queue: Infantry - BuildPaletteOrder: 80 - Prerequisites: ~barrh, palace, ~techlevel.high - Valued: - Cost: 400 - Tooltip: - Name: Sardaukar - Description: Elite asssault infantry\n Strong vs Infantry, Vehicles\n Weak vs Artillery - Selectable: - Bounds: 12,17,0,0 - Voice: GenericVoice - Health: - HP: 100 - Mobile: - Speed: 42 - RevealsShroud: - Range: 6c0 - TakeCover: - Armament@PRIMARY: - Weapon: Vulcan - Armament@SECONDARY: - Weapon: Slung - AttackFrontal: - AttractsWorms: - Intensity: 180 - diff --git a/mods/d2k/rules/husks.yaml b/mods/d2k/rules/husks.yaml new file mode 100644 index 0000000000..2c0e877832 --- /dev/null +++ b/mods/d2k/rules/husks.yaml @@ -0,0 +1,68 @@ +mcv.husk: + Inherits: ^Husk + Health: + HP: 175 + Tooltip: + Name: Destroyed Mobile Construction Vehicle + +harvester.husk: + Inherits: ^Husk + Health: + HP: 150 + Tooltip: + Name: Destroyed Spice Harvester + TransformOnCapture: + IntoActor: harvester + +siegetank.husk: + Inherits: ^Husk + Tooltip: + ThrowsParticle@turret: + Anim: turret + TransformOnCapture: + IntoActor: siegetank + +missiletank.husk: + Inherits: ^Husk + RenderUnit: + TransformOnCapture: + IntoActor: missiletank + +sonictank.husk: + Inherits: ^Husk + TransformOnCapture: + IntoActor: sonictank + +devast.husk: + Inherits: ^Husk + Health: + HP: 125 + TransformOnCapture: + IntoActor: devast + +deviatortank.husk: + Inherits: ^Husk + TransformOnCapture: + IntoActor: deviatortank + +^combat.husk: + Inherits: ^Husk + Health: + HP: 100 + ThrowsParticle@turret: + Anim: turret + +combata.husk: + Inherits: ^combat.husk + TransformOnCapture: + IntoActor: combata + +combath.husk: + Inherits: ^combat.husk + TransformOnCapture: + IntoActor: combath + +combato.husk: + Inherits: ^combat.husk + TransformOnCapture: + IntoActor: combato diff --git a/mods/d2k/rules/infantry.yaml b/mods/d2k/rules/infantry.yaml index e5c5aae23d..24124ddaa8 100644 --- a/mods/d2k/rules/infantry.yaml +++ b/mods/d2k/rules/infantry.yaml @@ -1,9 +1,8 @@ -RIFLE: +rifle: Inherits: ^Infantry Buildable: Queue: Infantry BuildPaletteOrder: 10 - Prerequisites: ~barracks Valued: Cost: 100 Tooltip: @@ -22,12 +21,12 @@ RIFLE: AttractsWorms: Intensity: 120 -ENGINEER: +engineer: Inherits: ^Infantry Buildable: Queue: Infantry BuildPaletteOrder: 50 - Prerequisites: ~barracks, radar, ~techlevel.medium + Prerequisites: radar, ~techlevel.medium Valued: Cost: 500 Tooltip: @@ -51,12 +50,12 @@ ENGINEER: AttractsWorms: Intensity: 180 -BAZOOKA: +bazooka: Inherits: ^Infantry Buildable: Queue: Infantry BuildPaletteOrder: 20 - Prerequisites: ~barracks, radar, ~techlevel.medium + Prerequisites: radar, ~techlevel.medium Valued: Cost: 250 Tooltip: @@ -76,12 +75,12 @@ BAZOOKA: AttractsWorms: Intensity: 180 -MEDIC: +medic: Inherits: ^Infantry Buildable: Queue: Infantry BuildPaletteOrder: 60 - Prerequisites: ~medics, ~techlevel.high + Prerequisites: ~barracks.medics, ~techlevel.high Valued: Cost: 500 Tooltip: @@ -108,3 +107,124 @@ MEDIC: AttractsWorms: Intensity: 180 +fremen: + Inherits: ^Infantry + Valued: + Cost: 800 + Tooltip: + Name: Fremen + Description: Elite sniper infantry unit\n Strong vs Infantry\n Weak vs Vehicles\n Special Ability: Invisibility + Buildable: + Queue: Infantry + BuildPaletteOrder: 85 + Prerequisites: ~barracks.atreides, palace, ~techlevel.high + Selectable: + Bounds: 12,17,0,0 + Voice: FremenVoice + Mobile: + Speed: 53 + Health: + HP: 70 + Passenger: + RevealsShroud: + Range: 7c0 + AutoTarget: + ScanRadius: 7 + Armament@PRIMARY: + Weapon: Sniper + Armament@SECONDARY: + Weapon: Slung + AttackFrontal: + TakeCover: + Cloak: + InitialDelay: 250 + CloakDelay: 250 + CloakSound: STEALTH1.WAV + UncloakSound: STEALTH2.WAV + -MustBeDestroyed: + +grenadier: + Inherits: ^Infantry + Buildable: + Queue: Infantry + BuildPaletteOrder: 10 + Prerequisites: ~barracks.atreides, ~techlevel.medium + Valued: + Cost: 160 + Tooltip: + Name: Grenadier + Description: Infantry armed with grenades. \n Strong vs Buildings, Infantry\n Weak vs Vehicles + Selectable: + Bounds: 12,17,0,0 + Health: + HP: 50 + Mobile: + Speed: 53 + Armament: + Weapon: Grenade + LocalOffset: 0,0,555 + FireDelay: 15 + AttackFrontal: + TakeCover: + RenderInfantry: + IdleAnimations: idle + Explodes: + Weapon: UnitExplodeSmall + Chance: 100 + AttractsWorms: + Intensity: 180 + +sardaukar: + Inherits: ^Infantry + Buildable: + Queue: Infantry + BuildPaletteOrder: 80 + Prerequisites: ~barracks.harkonnen, palace, ~techlevel.high + Valued: + Cost: 400 + Tooltip: + Name: Sardaukar + Description: Elite asssault infantry\n Strong vs Infantry, Vehicles\n Weak vs Artillery + Selectable: + Bounds: 12,17,0,0 + Voice: GenericVoice + Health: + HP: 100 + Mobile: + Speed: 42 + RevealsShroud: + Range: 6c0 + TakeCover: + Armament@PRIMARY: + Weapon: Vulcan + Armament@SECONDARY: + Weapon: Slung + AttackFrontal: + AttractsWorms: + Intensity: 180 + +saboteur: + Inherits: ^Infantry + Buildable: + Queue: Infantry + BuildPaletteOrder: 100 + Prerequisites: ~barracks.ordos, palace, ~techlevel.high + Valued: + Cost: 800 + Tooltip: + Name: Saboteur + Description: Sneaky infantry, armed with explosives\n Strong vs Buildings\n Weak vs Everything\n Special Ability: destroy buildings + Selectable: + Voice: SaboteurVoice + Bounds: 12,17,0,0 + Health: + HP: 100 + Mobile: + Speed: 64 + RevealsShroud: + Range: 7c0 + C4Demolition: + C4Delay: 45 + -AutoTarget: + AttractsWorms: + Intensity: 120 diff --git a/mods/d2k/rules/misc.yaml b/mods/d2k/rules/misc.yaml index d878294ffa..edd1d6361e 100644 --- a/mods/d2k/rules/misc.yaml +++ b/mods/d2k/rules/misc.yaml @@ -1,4 +1,4 @@ -CRATE: +crate: Tooltip: Name: Crate Crate: @@ -98,21 +98,10 @@ CRATE: Units: deviatortank ValidRaces: ordos Prerequisites: techlevel.high, Research - GiveMcvCrateAction@Atreides: + GiveMcvCrateAction: SelectionShares: 0 NoBaseSelectionShares: 9001 - Units: mcva - ValidRaces: atreides - GiveMcvCrateAction@Harkonnen: - SelectionShares: 0 - NoBaseSelectionShares: 9001 - Units: mcvh - ValidRaces: harkonnen - GiveMcvCrateAction@Ordos: - SelectionShares: 0 - NoBaseSelectionShares: 9001 - Units: mcvo - ValidRaces: ordos + Units: mcv GrantUpgradeCrateAction@cloak: SelectionShares: 5 Effect: cloak @@ -141,14 +130,14 @@ waypoint: BodyOrientation: ^carryall.colorpicker: - Inherits: ^CARRYALL + Inherits: carryall RenderUnit: Image: carryall Palette: colorpicker Helicopter: InitialFacing: 104 -CAMERA: +camera: Immobile: OccupiesSpace: false Health: diff --git a/mods/d2k/rules/ordos.yaml b/mods/d2k/rules/ordos.yaml deleted file mode 100644 index 180742093a..0000000000 --- a/mods/d2k/rules/ordos.yaml +++ /dev/null @@ -1,290 +0,0 @@ -CONYARDO: - Inherits: ^CONYARD - -PWRO: - Inherits: ^POWER - Buildable: - Prerequisites: ~conyardo - -WALLO: - Inherits: ^WALL - Buildable: - Prerequisites: ~conyardo, barracks - -GUNTOWERO: - Inherits: ^GUNTOWER - Buildable: - Prerequisites: ~conyardo, barracks - -ROCKETTOWERO: - Inherits: ^ROCKETTOWER - Buildable: - Prerequisites: ~conyardo, radar - -REFO: - Inherits: ^REFINERY - Buildable: - Prerequisites: ~conyardo, power - -BARRO: - Inherits: ^BARRACKS - Buildable: - Prerequisites: ~conyardo, power - ProvidesCustomPrerequisite@MEDICS: - Prerequisite: medics - ProvidesCustomPrerequisite@BARRACKS: - Prerequisite: barracks - -REPAIRO: - Inherits: ^REPAIR - Buildable: - Prerequisites: ~conyardo, heavy - -RESEARCHO: - Inherits: ^RESEARCH - Buildable: - Prerequisites: ~conyardo, hightech - -SILOO: - Inherits: ^SILO - Buildable: - Prerequisites: ~conyardo, refinery - -LIGHTO: - Inherits: ^LIGHT - Buildable: - Prerequisites: ~conyardo, refinery - -HEAVYO: - Inherits: ^HEAVY - Buildable: - Prerequisites: ~conyardo, refinery - -RADARO: - Inherits: ^RADAR - Buildable: - Prerequisites: ~conyardo, barracks - -STARPORTO: - Inherits: ^STARPORT - Buildable: - Prerequisites: ~conyardo, radar - -HIGHTECHO: - Inherits: ^HIGHTECH - Buildable: - Prerequisites: ~conyardo, radar - -PALACEO: - Inherits: ^PALACE - Buildable: - Prerequisites: ~conyardo, research - AirstrikePower: - Icon: ornistrike - Prerequisites: ~techlevel.superweapons - SquadSize: 3 - Description: Air Strike - ChargeTime: 180 - LongDesc: Ornithopter drops a load of parachuted\nbombs on your target - UnitType: orni.bomber - SelectTargetSound: - DisplayBeacon: True - CameraActor: camera - CanPowerDown: - DisabledOverlay: - RequiresPower: - SupportPowerChargeBar: - -MCVO: - Inherits: ^MCV - Buildable: - Prerequisites: ~heavyo, repair - Transforms: - Facing: 16 - IntoActor: conyardo - Offset: -1,-1 - NoTransformSounds: OI_DPLOY.AUD - RenderUnit: - Image: DMCV - -MCVO.starport: - Inherits: MCVO - Buildable: - Prerequisites: ~starporto, repair - Queue: Starport - Valued: - Cost: 2500 - -COMBATO: - Inherits: ^COMBAT - Buildable: - Prerequisites: ~heavyo - RevealsShroud: - Range: 8c0 - Turreted: - ROT: 8 - Mobile: - Speed: 96 - ROT: 8 - Crushes: crate, infantry - RenderUnit: - Image: COMBATO - WithTurret: - LeavesHusk: - HuskActor: Combato.Husk - -COMBATO.Husk: - Inherits: ^COMBAT.Husk - RenderUnit: - Image: combato.destroyed - TransformOnCapture: - IntoActor: combato - -COMBATO.starport: - Inherits: COMBATO - Buildable: - Prerequisites: ~starporto - Queue: Starport - Valued: - Cost: 875 - -RAIDER: - Inherits: ^Vehicle - Buildable: - Queue: Vehicle - BuildPaletteOrder: 10 - Prerequisites: ~lighto - Valued: - Cost: 300 - Tooltip: - Name: Raider Trike - Description: Improved Scout\n Strong vs Infantry, Light Vehicles - Selectable: - Bounds: 24,24 - Health: - HP: 110 - Armor: - Type: Light - Mobile: - ROT: 10 - Speed: 149 - RevealsShroud: - Range: 7c0 - RenderUnit: - WithMuzzleFlash: - Armament: - Weapon: HMGo - LocalOffset: 256,0,128 - MuzzleSequence: muzzle - AttackFrontal: - AutoTarget: - Explodes: - Weapon: UnitExplodeTiny - EmptyWeapon: UnitExplodeTiny - AttractsWorms: - Intensity: 420 - -STEALTHRAIDER: - Inherits: RAIDER - Buildable: - Prerequisites: ~lighto, hightech, ~techlevel.medium - BuildPaletteOrder: 30 - Valued: - Cost: 400 - Tooltip: - Name: Stealth Raider Trike - Description: Invisible Raider Trike\n Strong vs Infantry, Light Vehicles - Cloak: - InitialDelay: 45 - CloakDelay: 90 - CloakSound: STEALTH1.WAV - UncloakSound: STEALTH2.WAV - AutoTarget: - InitialStance: HoldFire - -MustBeDestroyed: - -CARRYALLO: - Inherits: ^CARRYALL - RenderUnit: - Image: CARRYALL - Buildable: - Prerequisites: refinery, ~hightecho - -CARRYALLO.starport: - Inherits: CARRYALLO - Valued: - Cost: 1500 - Buildable: - Prerequisites: ~starporto - Queue: Starport - -DEVIATORTANK: - Inherits: ^Tank - Valued: - Cost: 1000 - Tooltip: - Name: Deviator - Description: Fires a warhead which changes\nthe allegiance of enemy vehicles - Buildable: - Queue: Armor - BuildPaletteOrder: 50 - Prerequisites: ~heavyo, research, ~techlevel.high - Mobile: - ROT: 3 - Speed: 64 - Health: - HP: 125 - Armor: - Type: Light - RevealsShroud: - Range: 5c0 - RenderUnit: - Armament: - Weapon: NerveGasMissile - LocalOffset: -299,0,85 - AttackFrontal: - AutoTarget: - InitialStance: Defend - Explodes: - Weapon: UnitExplodeSmall - EmptyWeapon: UnitExplodeSmall - Selectable: - Bounds: 30,30 - LeavesHusk: - HuskActor: Deviatortank.Husk - AttractsWorms: - Intensity: 600 - -DEVIATORTANK.Husk: - Inherits: ^Husk - RenderUnit: - Image: deviatortank.destroyed - TransformOnCapture: - IntoActor: deviatortank - -SABOTEUR: - Inherits: ^Infantry - Buildable: - Queue: Infantry - BuildPaletteOrder: 100 - Prerequisites: ~barro, palace, ~techlevel.high - Valued: - Cost: 800 - Tooltip: - Name: Saboteur - Description: Sneaky infantry, armed with explosives\n Strong vs Buildings\n Weak vs Everything\n Special Ability: destroy buildings - Selectable: - Voice: SaboteurVoice - Bounds: 12,17,0,0 - Health: - HP: 100 - Mobile: - Speed: 64 - RevealsShroud: - Range: 7c0 - C4Demolition: - C4Delay: 45 - -AutoTarget: - AttractsWorms: - Intensity: 120 - diff --git a/mods/d2k/rules/starport.yaml b/mods/d2k/rules/starport.yaml new file mode 100644 index 0000000000..6c0375813f --- /dev/null +++ b/mods/d2k/rules/starport.yaml @@ -0,0 +1,84 @@ +mcv.starport: + Inherits: mcv + Buildable: + Prerequisites: repair + Queue: Starport + Valued: + Cost: 2500 + RenderUnit: + Image: mcv + +harvester.starport: + Inherits: harvester + Buildable: + Queue: Starport + Valued: + Cost: 1500 + RenderUnit: + Image: harvester + +trike.starport: + Inherits: trike + Buildable: + Queue: Starport + Valued: + Cost: 315 + RenderUnit: + Image: trike + +quad.starport: + Inherits: quad + Buildable: + Queue: Starport + Valued: + Cost: 500 + RenderUnit: + Image: quad + +siegetank.starport: + Inherits: siegetank + Buildable: + Queue: Starport + Valued: + Cost: 1075 + RenderUnit: + Image: siegetank + +missiletank.starport: + Inherits: missiletank + Buildable: + Queue: Starport + Valued: + Cost: 1250 + RenderUnit: + Image: missiletank + +combata.starport: + Inherits: combata + Buildable: + Prerequisites: ~starport.atreides + Queue: Starport + Valued: + Cost: 875 + RenderUnit: + Image: combata + +combath.starport: + Inherits: combath + Buildable: + Prerequisites: ~starport.harkonnen + Queue: Starport + Valued: + Cost: 875 + RenderUnit: + Image: combath + +combato.starport: + Inherits: combato + Buildable: + Prerequisites: ~starport.ordos + Queue: Starport + Valued: + Cost: 875 + RenderUnit: + Image: combato diff --git a/mods/d2k/rules/structures.yaml b/mods/d2k/rules/structures.yaml index 5eead6333e..9d4ddb0b1d 100644 --- a/mods/d2k/rules/structures.yaml +++ b/mods/d2k/rules/structures.yaml @@ -1,4 +1,4 @@ -^CONCRETE: +^concrete: Building: Adjacent: 4 TerrainTypes: Rock @@ -13,32 +13,27 @@ RenderSprites: KillsSelf: RemoveInstead: true + Buildable: + Queue: Building + BuildPaletteOrder: 10 -CONCRETEA: - Inherits: ^CONCRETE +concretea: + Inherits: ^concrete Building: Footprint: xx xx Dimensions: 2,2 - Buildable: - Queue: Building - BuildPaletteOrder: 10 - Prerequisites: ~conyard Valued: Cost: 20 -CONCRETEB: - Inherits: ^CONCRETE +concreteb: + Inherits: ^concrete Building: Footprint: xxx xxx xxx Dimensions: 3,3 - Buildable: - Queue: Building - BuildPaletteOrder: 10 - Prerequisites: ~conyard Valued: Cost: 50 -^CONYARD: +conyard: Inherits: ^Building Building: Footprint: xxx xxx @@ -48,10 +43,6 @@ CONCRETEB: TerrainTypes: Rock Template: 88 Bib: - Buildable: - Queue: Building - BuildPaletteOrder: 1000 - Prerequisites: ~disabled Selectable: Bounds: 96,64 Health: @@ -70,17 +61,21 @@ CONCRETEB: Value: 2000 BaseBuilding: ProductionBar: - ProvidesCustomPrerequisite: - Prerequisite: conyard - WithBuildingPlacedOverlay: - Palette: d2k Power: Amount: 20 + RenderBuilding: + Image: conyard.harkonnen + RaceImages: + atreides: conyard.atreides + ordos: conyard.ordos + corrino: conyard.corrino + WithBuildingPlacedOverlay: + Palette: d2k + PrimaryBuilding: -^POWER: +power: Inherits: ^Building Buildable: - Prerequisites: ~conyard Queue: Building BuildPaletteOrder: 10 Selectable: @@ -100,18 +95,21 @@ CONCRETEB: Type: Wood RevealsShroud: Range: 4c0 - ProvidesCustomPrerequisite: - Prerequisite: power + RenderBuilding: + Image: power.harkonnen + RaceImages: + atreides: power.atreides + ordos: power.ordos WithIdleOverlay@ZAPS: Sequence: idle-zaps Power: Amount: 100 ScalePowerWithHealth: -^BARRACKS: +barracks: Inherits: ^Building Buildable: - Prerequisites: ~conyard, power + Prerequisites: power Queue: Building BuildPaletteOrder: 40 Selectable: @@ -143,15 +141,30 @@ CONCRETEB: Produces: Infantry PrimaryBuilding: ProductionBar: - ProvidesCustomPrerequisite: - Prerequisite: barracks + ProvidesCustomPrerequisite@atreides: + Prerequisite: barracks.atreides + Race: atreides + ProvidesCustomPrerequisite@ordos: + Prerequisite: barracks.ordos + Race: ordos + ProvidesCustomPrerequisite@harkonnen: + Prerequisite: barracks.harkonnen + Race: harkonnen + ProvidesCustomPrerequisite@medics: + Prerequisite: barracks.medics + Race: atreides, ordos Power: Amount: -20 + RenderBuilding: + Image: barracks.harkonnen + RaceImages: + atreides: barracks.atreides + ordos: barracks.ordos -^REFINERY: +refinery: Inherits: ^Building Buildable: - Prerequisites: ~conyard, ~power + Prerequisites: power Queue: Building BuildPaletteOrder: 20 Selectable: @@ -182,12 +195,16 @@ CONCRETEB: CustomSellValue: Value: 500 FreeActor: - Actor: HARVESTER + Actor: harvester InitialActivity: FindResources SpawnOffset: 2,1 Facing: 160 - ProvidesCustomPrerequisite: - Prerequisite: refinery + -RenderBuilding: + RenderBuildingWarFactory: + Image: refinery.harkonnen + RaceImages: + atreides: refinery.atreides + ordos: refinery.ordos WithDockingOverlay@SMOKE: Sequence: smoke Power: @@ -195,10 +212,10 @@ CONCRETEB: WithIdleOverlay@TOP: Sequence: idle-top -^SILO: +silo: Inherits: ^Building Buildable: - Prerequisites: ~conyard, refinery + Prerequisites: refinery Queue: Building BuildPaletteOrder: 30 Selectable: @@ -219,6 +236,10 @@ CONCRETEB: Range: 4c0 -RenderBuilding: RenderBuildingSilo: + Image: silo.harkonnen + RaceImages: + atreides: silo.atreides + ordos: silo.ordos StoresResources: PipColor: green PipCount: 5 @@ -229,10 +250,10 @@ CONCRETEB: MustBeDestroyed: RequiredForShortGame: false -^LIGHT: +light: Inherits: ^Building Buildable: - Prerequisites: ~conyard, refinery + Prerequisites: refinery Queue: Building BuildPaletteOrder: 70 Selectable: @@ -252,6 +273,11 @@ CONCRETEB: Type: Wood RevealsShroud: Range: 4c0 + RenderBuilding: + Image: light.harkonnen + RaceImages: + atreides: light.atreides + ordos: light.ordos RallyPoint: RallyPoint: 2,2 Exit@1: @@ -261,8 +287,18 @@ CONCRETEB: Produces: Vehicle PrimaryBuilding: ProductionBar: - ProvidesCustomPrerequisite: - Prerequisite: light + ProvidesCustomPrerequisite@atreides: + Prerequisite: light.atreides + Race: atreides + ProvidesCustomPrerequisite@ordos: + Prerequisite: light.ordos + Race: ordos + ProvidesCustomPrerequisite@harkonnen: + Prerequisite: light.harkonnen + Race: harkonnen + ProvidesCustomPrerequisite@TRIKES: + Prerequisite: light.regulartrikes + Race: atreides, harkonnen WithProductionOverlay@WELDING: Sequence: production-welding WithIdleOverlay@TOP: @@ -270,10 +306,10 @@ CONCRETEB: Power: Amount: -20 -^HEAVY: +heavy: Inherits: ^Building Buildable: - Prerequisites: ~conyard, refinery + Prerequisites: refinery Queue: Building BuildPaletteOrder: 100 Selectable: @@ -302,8 +338,21 @@ CONCRETEB: Produces: Armor PrimaryBuilding: ProductionBar: - ProvidesCustomPrerequisite: - Prerequisite: heavy + ProvidesCustomPrerequisite@atreides: + Prerequisite: heavy.atreides + Race: atreides + ProvidesCustomPrerequisite@ordos: + Prerequisite: heavy.ordos + Race: ordos + ProvidesCustomPrerequisite@harkonnen: + Prerequisite: heavy.harkonnen + Race: harkonnen + RenderBuilding: + Image: heavy.harkonnen + RaceImages: + atreides: heavy.atreides + ordos: heavy.ordos + corrino: heavy.corrino WithProductionOverlay@WELDING: Sequence: production-welding WithIdleOverlay@TOP: @@ -311,13 +360,13 @@ CONCRETEB: Power: Amount: -30 -^RADAR: +radar: Inherits: ^Building RequiresPower: CanPowerDown: DisabledOverlay: Buildable: - Prerequisites: ~conyard, barracks, ~techlevel.medium + Prerequisites: barracks, ~techlevel.medium Queue: Building BuildPaletteOrder: 50 Selectable: @@ -341,15 +390,18 @@ CONCRETEB: DetectCloaked: Range: 6 RenderDetectionCircle: - ProvidesCustomPrerequisite: - Prerequisite: radar + RenderBuilding: + Image: radar.harkonnen + RaceImages: + atreides: radar.atreides + ordos: radar.ordos WithIdleOverlay@DISH: Sequence: idle-dish PauseOnLowPower: yes Power: Amount: -40 -^STARPORT: +starport: Inherits: ^Building Valued: Cost: 2000 @@ -357,7 +409,7 @@ CONCRETEB: Name: Starport Description: Dropzone for quick reinforcements, at a price.\n Requires power to operate Buildable: - Prerequisites: ~conyard, radar, ~techlevel.high + Prerequisites: radar, ~techlevel.high Queue: Building BuildPaletteOrder: 80 Building: @@ -382,6 +434,12 @@ CONCRETEB: ProductionAirdrop: Produces: Starport ActorType: frigate + RenderBuilding: + Image: starport.harkonnen + RaceImages: + atreides: starport.atreides + ordos: starport.ordos + corrino: starport.corrino WithDeliveryOverlay: Palette: starportlights ProductionBar: @@ -389,15 +447,22 @@ CONCRETEB: RequiresPower: CanPowerDown: DisabledOverlay: - ProvidesCustomPrerequisite: - Prerequisite: starport + ProvidesCustomPrerequisite@atreides: + Prerequisite: starport.atreides + Race: atreides + ProvidesCustomPrerequisite@ordos: + Prerequisite: starport.ordos + Race: ordos + ProvidesCustomPrerequisite@harkonnen: + Prerequisite: starport.harkonnen + Race: harkonnen Power: Amount: -40 -^WALL: +wall: Buildable: Queue: Building - Prerequisites: ~conyard, barracks + Prerequisites: barracks BuildPaletteOrder: 60 SoundOnDamageTransition: DamagedSound: @@ -429,7 +494,6 @@ CONCRETEB: TargetableBuilding: TargetTypes: Ground RenderBuildingWall: - Image: walla EditorAppearance: RelativeToTopLeft: yes AutoTargetIgnore: @@ -444,16 +508,11 @@ CONCRETEB: Pieces: 3, 7 Range: 2c0, 5c0 -WALL: - Inherits: ^WALL - Buildable: - Prerequisites: ~disabled - -^GUNTOWER: +guntower: Inherits: ^Building Buildable: Queue: Building - Prerequisites: ~conyard, barracks + Prerequisites: barracks BuildPaletteOrder: 90 Valued: Cost: 650 @@ -504,11 +563,11 @@ WALL: MustBeDestroyed: RequiredForShortGame: false -^ROCKETTOWER: +rockettower: Inherits: ^Building Buildable: Queue: Building - Prerequisites: ~conyard, radar, ~techlevel.medium + Prerequisites: radar, ~techlevel.medium BuildPaletteOrder: 120 Valued: Cost: 850 @@ -559,11 +618,11 @@ WALL: MustBeDestroyed: RequiredForShortGame: false -^REPAIR: +repair: Inherits: ^Building Buildable: Queue: Building - Prerequisites: ~conyard, heavy, ~techlevel.medium + Prerequisites: heavy, ~techlevel.medium BuildPaletteOrder: 130 Valued: Cost: 500 @@ -586,17 +645,20 @@ WALL: FinishRepairingNotification: UnitRepaired RallyPoint: RallyPoint: 1,3 - ProvidesCustomPrerequisite: - Prerequisite: repair + RenderBuilding: + Image: repair.harkonnen + RaceImages: + atreides: repair.atreides + ordos: repair.ordos WithRepairOverlay: Palette: repairlights Power: Amount: -10 -^HIGHTECH: +hightech: Inherits: ^Building Buildable: - Prerequisites: ~conyard, radar, ~techlevel.medium + Prerequisites: radar, ~techlevel.medium Queue: Building BuildPaletteOrder: 110 Selectable: @@ -621,18 +683,21 @@ WALL: Type: Wood RevealsShroud: Range: 4c0 - ProvidesCustomPrerequisite: - Prerequisite: hightech + RenderBuilding: + Image: hightech.harkonnen + RaceImages: + atreides: hightech.atreides + ordos: hightech.ordos WithProductionOverlay@WELDING: Sequence: production-welding Power: Amount: -40 -^RESEARCH: +research: Inherits: ^Building Buildable: Queue: Building - Prerequisites: ~conyard, hightech, ~techlevel.high + Prerequisites: hightech, ~techlevel.high BuildPaletteOrder: 140 Selectable: Bounds: 96,64 @@ -662,17 +727,20 @@ WALL: Type: Wood RevealsShroud: Range: 4c0 - ProvidesCustomPrerequisite: - Prerequisite: research + RenderBuilding: + Image: research.harkonnen + RaceImages: + atreides: research.atreides + ordos: research.ordos WithIdleOverlay@LIGHTS: Sequence: idle-lights Power: Amount: -40 -^PALACE: +palace: Inherits: ^Building Buildable: - Prerequisites: ~conyard, research, ~techlevel.high + Prerequisites: research, ~techlevel.high Queue: Building BuildPaletteOrder: 150 Selectable: @@ -681,7 +749,7 @@ WALL: Cost: 2000 Tooltip: Name: Palace - Description: Unlocks elite infantry\n Special Ability: Ornithopter Strike + Description: Unlocks elite infantry and support powers Building: Footprint: xx= xxx =xx Dimensions: 3,3 @@ -693,72 +761,83 @@ WALL: Type: Wood RevealsShroud: Range: 8c0 + RenderBuilding: + Image: palace.harkonnen + RaceImages: + atreides: palace.atreides + ordos: palace.ordos + corrino: palace.corrino RenderDetectionCircle: DetectCloaked: Range: 4 - ProvidesCustomPrerequisite: - Prerequisite: palace Power: Amount: -50 + ProvidesCustomPrerequisite@airstrike: + Prerequisite: palace.airstrike + Race: atreides, ordos + ProvidesCustomPrerequisite@nuke: + Prerequisite: palace.nuke + Race: harkonnen + AirstrikePower: + Icon: ornistrike + Prerequisites: ~techlevel.superweapons, ~palace.airstrike + Description: Air Strike + ChargeTime: 180 + LongDesc: Ornithopter drops a load of parachuted\nbombs on your target + UnitType: orni.bomber + SelectTargetSound: + DisplayBeacon: True + CameraActor: camera + NukePower: + Icon: deathhand + Prerequisites: ~techlevel.superweapons, ~palace.nuke + ChargeTime: 300 + Description: Death Hand + LongDesc: Launches a nuclear missile at a target location + BeginChargeSound: HI_PREP.AUD + EndChargeSound: HI_DHRDY.AUD + SelectTargetSound: + LaunchSound: + IncomingSound: + MissileWeapon: atomic + SpawnOffset: -512,1c171,0 + DisplayBeacon: True + DisplayRadarPing: True + CameraActor: camera + CanPowerDown: + DisabledOverlay: + RequiresPower: + SupportPowerChargeBar: -SIETCH: - Inherits: ^Building - Tooltip: - Name: Fremen Sietch - Building: - Footprint: xx xx - Dimensions: 2,2 - TerrainTypes: Cliff - Health: - HP: 400 - Armor: - Type: Concrete - RevealsShroud: - Range: 10c0 - -GivesBuildableArea: - -Sellable: - -ExternalCapturable: - -ExternalCapturableBar: - Power: - Amount: 0 +conyard.atreides: + Inherits: conyard + Buildable: + Queue: Building + BuildPaletteOrder: 1000 + Prerequisites: ~disabled + ForceRace: atreides + RenderBuilding: + Image: conyard.atreides + -RaceImages: -CONYARD: - Tooltip: - Name: Construction Yard - -BARRACKS: - Tooltip: - Name: Barracks - -LIGHT: - Tooltip: - Name: Light Factory - -HEAVY: - Tooltip: - Name: Heavy Factory - -HIGHTECH: - Tooltip: - Name: High-Tech Facility - -REPAIR: - Tooltip: - Name: Repair Pad - -RESEARCH: - Tooltip: - Name: Ix Lab - -RADAR: - Tooltip: - Name: Outpost - -POWER: - Tooltip: - Name: Windtrap - -REFINERY: - Tooltip: - Name: Spice Refinery +conyard.harkonnen: + Inherits: conyard + Buildable: + Queue: Building + BuildPaletteOrder: 1000 + Prerequisites: ~disabled + ForceRace: harkonnen + RenderBuilding: + Image: conyard.harkonnen + -RaceImages: +conyard.ordos: + Inherits: conyard + Buildable: + Queue: Building + BuildPaletteOrder: 1000 + Prerequisites: ~disabled + ForceRace: ordos + RenderBuilding: + Image: conyard.ordos + -RaceImages: diff --git a/mods/d2k/rules/vehicles.yaml b/mods/d2k/rules/vehicles.yaml index 58b1c67755..861f167ab7 100644 --- a/mods/d2k/rules/vehicles.yaml +++ b/mods/d2k/rules/vehicles.yaml @@ -1,7 +1,7 @@ -^MCV: +mcv: Inherits: ^Vehicle Buildable: - Prerequisites: ~heavy, repair, ~techlevel.medium + Prerequisites: repair, ~techlevel.medium Queue: Armor BuildPaletteOrder: 110 Valued: @@ -28,26 +28,21 @@ Weapon: UnitExplodeScale EmptyWeapon: UnitExplodeScale Transforms: + Facing: 16 + IntoActor: conyard + Offset: -1,-1 TransformSounds: BUILD1.WAV + NoTransformNotification: CannotDeploy LeavesHusk: - HuskActor: MCV.Husk + HuskActor: mcv.husk AttractsWorms: Intensity: 700 -MCV.Husk: - Inherits: ^Husk - Health: - HP: 175 - Tooltip: - Name: Destroyed Mobile Construction Vehicle - RenderUnit: - Image: dmcv.destroyed - -HARVESTER: +harvester: Inherits: ^Vehicle Buildable: Queue: Armor - Prerequisites: ~heavy, refinery + Prerequisites: refinery BuildPaletteOrder: 10 InitialActivity: FindResources Valued: @@ -74,8 +69,6 @@ HARVESTER: Mobile: Speed: 64 Crushes: crate, infantry - RenderUnit: - Image: HARVESTER RevealsShroud: Range: 4c0 Explodes: @@ -87,31 +80,12 @@ HARVESTER: AttractsWorms: Intensity: 700 -HARVESTER.Husk: - Inherits: ^Husk - Health: - HP: 150 - Tooltip: - Name: Destroyed Spice Harvester - RenderUnit: - Image: harvester.destroyed - TransformOnCapture: - IntoActor: harvester - -HARVESTER.starport: - Inherits: HARVESTER - Buildable: - Prerequisites: ~starport - Queue: Starport - Valued: - Cost: 1500 - -TRIKE: +trike: Inherits: ^Vehicle Buildable: Queue: Vehicle BuildPaletteOrder: 10 - Prerequisites: ~trikes + Prerequisites: ~light.regulartrikes Valued: Cost: 250 Tooltip: @@ -142,21 +116,11 @@ TRIKE: AttractsWorms: Intensity: 420 -TRIKE.starport: - Inherits: TRIKE - Buildable: - Queue: Starport - Prerequisites: starport - Valued: - Cost: 315 - RenderUnit: - Image: TRIKE - -QUAD: +quad: Inherits: ^Vehicle Buildable: Queue: Vehicle - Prerequisites: ~light, radar, ~techlevel.medium + Prerequisites: radar, ~techlevel.medium BuildPaletteOrder: 20 Valued: Cost: 400 @@ -185,70 +149,11 @@ QUAD: AttractsWorms: Intensity: 470 -QUAD.starport: - Inherits: QUAD - Buildable: - Prerequisites: starport - Queue: Starport - Valued: - Cost: 500 - RenderUnit: - Image: QUAD - -^COMBAT: +siegetank: Inherits: ^Tank Buildable: Queue: Armor - BuildPaletteOrder: 40 - Valued: - Cost: 700 - Tooltip: - Name: Combat Tank - Description: Main Battle Tank\n Strong vs Tanks\n Weak vs Infantry, Aircraft\n \n Atreides: +Range\n Harkonnen: +Health\n Ordos: +Speed - Health: - HP: 350 - Armor: - Type: Heavy - Mobile: - Speed: 64 - ROT: 6 - Crushes: crate, infantry - RevealsShroud: - Range: 7c0 - Turreted: - ROT: 6 - RealignDelay: 0 - Armament: - Weapon: 90mm - Recoil: 128 - RecoilRecovery: 32 - LocalOffset: 256,0,0 - MuzzleSequence: muzzle - AttackTurreted: - WithMuzzleFlash: - RenderUnit: - WithTurret: - AutoTarget: - Explodes: - Weapon: UnitExplodeSmall - EmptyWeapon: UnitExplodeSmall - Selectable: - Bounds: 30,30 - AttractsWorms: - Intensity: 520 - -^COMBAT.Husk: - Inherits: ^Husk - Health: - HP: 100 - ThrowsParticle@turret: - Anim: turret - -SIEGETANK: - Inherits: ^Tank - Buildable: - Queue: Armor - Prerequisites: ~heavy, radar, ~techlevel.medium + Prerequisites: radar, ~techlevel.medium BuildPaletteOrder: 50 Valued: Cost: 850 @@ -287,29 +192,11 @@ SIEGETANK: Selectable: Bounds: 30,30 LeavesHusk: - HuskActor: Siegetank.Husk + HuskActor: siegetank.husk AttractsWorms: Intensity: 600 -SIEGETANK.Husk: - Inherits: ^Husk - Tooltip: - ThrowsParticle@turret: - Anim: turret - RenderUnit: - Image: siegetank.destroyed - TransformOnCapture: - IntoActor: siegetank - -SIEGETANK.starport: - Inherits: SIEGETANK - Buildable: - Prerequisites: starport - Queue: Starport - Valued: - Cost: 1075 - -MISSILETANK: +missiletank: Inherits: ^Tank Valued: Cost: 1000 @@ -318,7 +205,7 @@ MISSILETANK: Description: Rocket Artillery\n Strong vs Vehicles, Buildings\n Weak vs Infantry, Aircraft Buildable: Queue: Armor - Prerequisites: ~heavy, hightech, ~techlevel.high + Prerequisites: hightech, ~techlevel.high BuildPaletteOrder: 60 Mobile: Speed: 64 @@ -329,8 +216,6 @@ MISSILETANK: Type: Light RevealsShroud: Range: 9c0 - RenderUnit: - Image: MISSILETANK Armament: Weapon: 227mm LocalOffset: -213,128,171, -213,-256,171 @@ -344,22 +229,251 @@ MISSILETANK: Selectable: Bounds: 30,30 LeavesHusk: - HuskActor: Missiletank.Husk + HuskActor: missiletank.husk AttractsWorms: Intensity: 600 -MISSILETANK.Husk: - Inherits: ^Husk - RenderUnit: - Image: missiletank.destroyed - TransformOnCapture: - IntoActor: missiletank - -MISSILETANK.starport: - Inherits: MISSILETANK +sonictank: + Inherits: ^Vehicle Buildable: - Prerequisites: starport - Queue: Starport + Queue: Armor + BuildPaletteOrder: 100 + Prerequisites: ~heavy.atreides, research, ~techlevel.high Valued: Cost: 1250 + Tooltip: + Name: Sonic Tank + Description: Fires sonic shocks\n Strong vs Infantry, Vehicles\n Weak vs Artillery, Aircraft + Selectable: + Bounds: 30,30 + Health: + HP: 130 + Armor: + Type: Light + Mobile: + ROT: 3 + Speed: 74 + RevealsShroud: + Range: 6c0 + Armament: + Weapon: Sound + LocalOffset: 640,0,427 + AttackFrontal: + AutoTarget: + Explodes: + Weapon: UnitExplodeSmall + EmptyWeapon: UnitExplodeSmall + LeavesHusk: + HuskActor: sonictank.husk + AttractsWorms: + Intensity: 600 +devast: + Inherits: ^Tank + Buildable: + Queue: Armor + BuildPaletteOrder: 100 + Prerequisites: ~heavy.harkonnen, research, ~techlevel.high + Valued: + Cost: 1200 + Tooltip: + Name: Devastator + Description: Super Heavy Tank\n Strong vs Tanks\n Weak vs Artillery, Aircraft + Health: + HP: 650 + Armor: + Type: Heavy + Mobile: + ROT: 3 + Speed: 42 + Crushes: crate, infantry + RevealsShroud: + Range: 7c0 + RenderUnit: + Armament: + Weapon: DevBullet + LocalOffset: 256,0,32 + MuzzleSequence: muzzle + AttackFrontal: + WithMuzzleFlash: + AutoTarget: + Explodes: + Weapon: UnitExplodeScale + EmptyWeapon: UnitExplodeScale + Selectable: + Bounds: 44,38,0,0 + LeavesHusk: + HuskActor: devast.husk + AttractsWorms: + Intensity: 700 + +raider: + Inherits: ^Vehicle + Buildable: + Queue: Vehicle + BuildPaletteOrder: 10 + Prerequisites: ~light.ordos + Valued: + Cost: 300 + Tooltip: + Name: Raider Trike + Description: Improved Scout\n Strong vs Infantry, Light Vehicles + Selectable: + Bounds: 24,24 + Health: + HP: 110 + Armor: + Type: Light + Mobile: + ROT: 10 + Speed: 149 + RevealsShroud: + Range: 7c0 + WithMuzzleFlash: + Armament: + Weapon: HMGo + LocalOffset: 256,0,128 + MuzzleSequence: muzzle + AttackFrontal: + AutoTarget: + Explodes: + Weapon: UnitExplodeTiny + EmptyWeapon: UnitExplodeTiny + AttractsWorms: + Intensity: 420 + +stealthraider: + Inherits: raider + Buildable: + Prerequisites: ~light.ordos, hightech, ~techlevel.medium + BuildPaletteOrder: 30 + Valued: + Cost: 400 + Tooltip: + Name: Stealth Raider Trike + Description: Invisible Raider Trike\n Strong vs Infantry, Light Vehicles + Cloak: + InitialDelay: 45 + CloakDelay: 90 + CloakSound: STEALTH1.WAV + UncloakSound: STEALTH2.WAV + AutoTarget: + InitialStance: HoldFire + -MustBeDestroyed: + +deviatortank: + Inherits: ^Tank + Valued: + Cost: 1000 + Tooltip: + Name: Deviator + Description: Fires a warhead which changes\nthe allegiance of enemy vehicles + Buildable: + Queue: Armor + BuildPaletteOrder: 50 + Prerequisites: ~heavy.ordos, research, ~techlevel.high + Mobile: + ROT: 3 + Speed: 64 + Health: + HP: 125 + Armor: + Type: Light + RevealsShroud: + Range: 5c0 + RenderUnit: + Armament: + Weapon: NerveGasMissile + LocalOffset: -299,0,85 + AttackFrontal: + AutoTarget: + InitialStance: Defend + Explodes: + Weapon: UnitExplodeSmall + EmptyWeapon: UnitExplodeSmall + Selectable: + Bounds: 30,30 + LeavesHusk: + HuskActor: deviatortank.husk + AttractsWorms: + Intensity: 600 + +^combat: + Inherits: ^Tank + Buildable: + Queue: Armor + BuildPaletteOrder: 40 + Valued: + Cost: 700 + Tooltip: + Name: Combat Tank + Description: Main Battle Tank\n Strong vs Tanks\n Weak vs Infantry, Aircraft\n \n Atreides: +Range\n Harkonnen: +Health\n Ordos: +Speed + Health: + HP: 350 + Armor: + Type: Heavy + Mobile: + Speed: 64 + ROT: 6 + Crushes: crate, infantry + RevealsShroud: + Range: 8c0 + Turreted: + ROT: 6 + RealignDelay: 0 + Armament: + Weapon: 90mm + Recoil: 128 + RecoilRecovery: 32 + LocalOffset: 256,0,0 + MuzzleSequence: muzzle + AttackTurreted: + WithMuzzleFlash: + RenderUnit: + WithTurret: + AutoTarget: + Explodes: + Weapon: UnitExplodeSmall + EmptyWeapon: UnitExplodeSmall + Selectable: + Bounds: 30,30 + AttractsWorms: + Intensity: 520 + +combata: + Inherits: ^combat + Buildable: + Prerequisites: ~heavy.atreides + Armament: + Weapon: 90mma + LeavesHusk: + HuskActor: combata.husk + +combath: + Inherits: ^combat + Buildable: + Prerequisites: ~heavy.harkonnen + Mobile: + Speed: 53 + ROT: 4 + Turreted: + ROT: 5 + RevealsShroud: + Range: 7c0 + Health: + HP: 440 + LeavesHusk: + HuskActor: combath.husk + +combato: + Inherits: ^combat + Buildable: + Prerequisites: ~heavy.ordos + Turreted: + ROT: 8 + Mobile: + Speed: 96 + ROT: 8 + Crushes: crate, infantry + LeavesHusk: + HuskActor: combato.husk diff --git a/mods/d2k/rules/world.yaml b/mods/d2k/rules/world.yaml index ca8373fe51..fb2c37e5ee 100644 --- a/mods/d2k/rules/world.yaml +++ b/mods/d2k/rules/world.yaml @@ -103,6 +103,10 @@ World: Country@Ordos: Name: Ordos Race: ordos + Country@Corrino: + Name: Corrino + Race: corrino + Selectable: false DomainIndex: PathfinderDebugOverlay: TerrainGeometryOverlay: @@ -132,26 +136,16 @@ World: SpawnMapActors: CreateMPPlayers: MPStartLocations: - MPStartUnits@mcvatreides: + MPStartUnits@mcv: Class: none ClassName: MCV Only - Races: atreides - BaseActor: mcva - MPStartUnits@mcvharkonnen: - Class: none - Races: harkonnen - ClassName: MCV Only - BaseActor: mcvh - MPStartUnits@mcvordos: - Class: none - ClassName: MCV Only - Races: ordos - BaseActor: mcvo + BaseActor: mcv + Races: atreides, ordos, harkonnen MPStartUnits@lightatreides: Class: light ClassName: Light Support Races: atreides - BaseActor: mcva + BaseActor: mcv SupportActors: rifle, rifle, rifle, bazooka, grenadier, trike, quad InnerSupportRadius: 3 OuterSupportRadius: 5 @@ -159,7 +153,7 @@ World: Class: light ClassName: Light Support Races: harkonnen - BaseActor: mcvh + BaseActor: mcv SupportActors: rifle, rifle, rifle, bazooka, bazooka, trike, quad InnerSupportRadius: 3 OuterSupportRadius: 5 @@ -167,7 +161,7 @@ World: Class: light ClassName: Light Support Races: ordos - BaseActor: mcvo + BaseActor: mcv SupportActors: rifle, rifle, rifle, bazooka, engineer, raider, quad InnerSupportRadius: 3 OuterSupportRadius: 5 @@ -175,7 +169,7 @@ World: Class: heavy ClassName: Heavy Support Races: atreides - BaseActor: mcva + BaseActor: mcv SupportActors: rifle, rifle, rifle, bazooka, grenadier, trike, combata, missiletank InnerSupportRadius: 3 OuterSupportRadius: 5 @@ -183,7 +177,7 @@ World: Class: heavy ClassName: Heavy Support Races: harkonnen - BaseActor: mcvh + BaseActor: mcv SupportActors: rifle, rifle, rifle, bazooka, engineer, quad, combath, siegetank InnerSupportRadius: 3 OuterSupportRadius: 5 @@ -191,7 +185,7 @@ World: Class: heavy ClassName: Heavy Support Races: ordos - BaseActor: mcvo + BaseActor: mcv SupportActors: rifle, rifle, rifle, bazooka, engineer, raider, combato, missiletank InnerSupportRadius: 3 OuterSupportRadius: 5 diff --git a/mods/d2k/sequences/structures.yaml b/mods/d2k/sequences/structures.yaml index 3087603d94..eb101fd19b 100644 --- a/mods/d2k/sequences/structures.yaml +++ b/mods/d2k/sequences/structures.yaml @@ -8,7 +8,7 @@ concreteb: Start:4053 Offset: -30,-24 -walla: +wall: idle: DATA Frames: 2527, 2530, 2528, 2538, 2531, 2532, 2542, 2535, 2529, 2539, 2533, 2534, 2540, 2536, 2537, 2541 Length: 16 @@ -21,33 +21,7 @@ walla: Start: 4063 Offset: -30,-24 -wallh: - idle: DATA - Frames: 2687, 2690, 2688, 2698, 2691, 2692, 2702, 2695, 2689, 2699, 2693, 2694, 2700, 2696, 2697, 2701 - Length: 16 - Offset: -16,16 - damaged-idle: DATA - Frames: 2703, 2706, 2704, 2714, 2707, 2708, 2718, 2711, 2705, 2715, 2709, 2710, 2716, 2712, 2713, 2717 - Length: 16 - Offset: -16,16 - icon: DATA - Start: 4064 - Offset: -30,-24 - -wallo: - idle: DATA - Frames: 2847, 2850, 2848, 2858, 2851, 2852, 2862, 2855, 2849, 2859, 2853, 2854, 2860, 2856, 2857, 2861 - Length: 16 - Offset: -16,16 - damaged-idle: DATA - Frames: 2863, 2866, 2864, 2874, 2867, 2868, 2878, 2871, 2865, 2875, 2869, 2870, 2876, 2872, 2873, 2877 - Length: 16 - Offset: -16,16 - icon: DATA - Start: 4065 - Offset: -30,-24 - -guntowera: +guntower: idle: DATA Frames: 2573, 2576, 2574, 2584, 2577, 2578, 2588, 2581, 2575, 2585, 2579, 2580, 2586, 2582, 2583, 2587 Length: 16 @@ -70,53 +44,7 @@ guntowera: Start: 4069 Offset: -30,-24 -guntowerh: - idle: DATA - Frames: 2733, 2736, 2734, 2744, 2737, 2738, 2748, 2741, 2735, 2745, 2739, 2740, 2746, 2742, 2743, 2747 - Length: 16 - Offset: -24,16 - damaged-idle: DATA - Frames: 2781, 2784, 2782, 2792, 2785, 2786, 2796, 2789, 2783, 2793, 2787, 2788, 2794, 2790, 2791, 2795 - Length: 16 - Offset: -24,16 - turret: DATA - Start: 2749 - Facings: -32 - Offset: -24,16 - muzzle: DATA - Frames: 3839, 3839, 3840, 3840, 3841, 3841, 3842, 3842, 3843, 3843, 3844, 3844, 3845, 3845, 3846, 3846, 3847, 3847, 3848, 3848, 3849, 3849, 3850, 3850, 3851, 3851, 3852, 3852, 3853, 3853, 3854, 3854, 3855, 3855, 3856, 3856, 3857, 3857, 3858, 3858, 3859, 3859, 3860, 3860, 3861, 3861, 3862, 3862, 3863, 3863, 3864, 3864, 3865, 3865, 3866, 3866, 3867, 3867, 3868, 3868, 3869, 3869, 3870, 3870 - Facings: -32 - Length: 2 - Offset: 0,-12 - BlendMode: Additive - icon: DATA - Frames: 4070 - Offset: -30,-24 - -guntowero: - idle: DATA - Frames: 2893, 2896, 2894, 2904, 2897, 2898, 2908, 2901, 2895, 2905, 2899, 2900, 2906, 2902, 2903, 2907 - Length: 16 - Offset: -24,16 - damaged-idle: DATA - Frames: 2941, 2944, 2942, 2952, 2945, 2946, 2956, 2949, 2943, 2953, 2947, 2948, 2954, 2950, 2951, 2955 - Length: 16 - Offset: -24,16 - turret: DATA - Start: 2909 - Facings: -32 - Offset: -24,16 - muzzle: DATA - Frames: 3839, 3839, 3840, 3840, 3841, 3841, 3842, 3842, 3843, 3843, 3844, 3844, 3845, 3845, 3846, 3846, 3847, 3847, 3848, 3848, 3849, 3849, 3850, 3850, 3851, 3851, 3852, 3852, 3853, 3853, 3854, 3854, 3855, 3855, 3856, 3856, 3857, 3857, 3858, 3858, 3859, 3859, 3860, 3860, 3861, 3861, 3862, 3862, 3863, 3863, 3864, 3864, 3865, 3865, 3866, 3866, 3867, 3867, 3868, 3868, 3869, 3869, 3870, 3870 - Facings: -32 - Length: 2 - Offset: 0,-12 - BlendMode: Additive - icon: DATA - Start: 4071 - Offset: -30,-24 - -rockettowera: +rockettower: idle: DATA Frames: 2573, 2576, 2574, 2584, 2577, 2578, 2588, 2581, 2575, 2585, 2579, 2580, 2586, 2582, 2583, 2587 Length: 16 @@ -133,41 +61,7 @@ rockettowera: Start: 4075 Offset: -30,-24 -rockettowerh: - idle: DATA - Frames: 2733, 2736, 2734, 2744, 2737, 2738, 2748, 2741, 2735, 2745, 2739, 2740, 2746, 2742, 2743, 2747 - Length: 16 - Offset: -24,16 - damaged-idle: DATA - Frames: 2781, 2784, 2782, 2792, 2785, 2786, 2796, 2789, 2783, 2793, 2787, 2788, 2794, 2790, 2791, 2795 - Length: 16 - Offset: -24,16 - turret: DATA - Start: 2797 - Facings: -32 - Offset: -24,16 - icon: DATA - Start: 4076 - Offset: -30,-24 - -rockettowero: - idle: DATA - Frames: 2893, 2896, 2894, 2904, 2897, 2898, 2908, 2901, 2895, 2905, 2899, 2900, 2906, 2902, 2903, 2907 - Length: 16 - Offset: -24,16 - damaged-idle: DATA - Frames: 2941, 2944, 2942, 2952, 2945, 2946, 2956, 2949, 2943, 2953, 2947, 2948, 2954, 2950, 2951, 2955 - Length: 16 - Offset: -24,16 - turret: DATA - Start: 2957 - Facings: -32 - Offset: -24,16 - icon: DATA - Start: 4077 - Offset: -30,-24 - -conyarda: +conyard.atreides: idle: DATA Start: 2559 Offset: -48,64 @@ -205,7 +99,7 @@ conyarda: Start: 4046 Offset: -30,-24 -repaira: +repair.atreides: make: DATA Start: 4370 Length: 10 @@ -240,7 +134,7 @@ repaira: Start: 4096 Offset: -30,-24 -repairh: +repair.harkonnen: make: DATA Start: 4370 Length: 10 @@ -275,7 +169,7 @@ repairh: Start: 4097 Offset: -30,-24 -repairo: +repair.ordos: make: DATA Start: 4370 Length: 10 @@ -310,7 +204,7 @@ repairo: Start: 4098 Offset: -30,-24 -starporta: +starport.atreides: idle: DATA Start: 2671 ZOffset: -1c511 @@ -354,7 +248,7 @@ starporta: Start: 4092 Offset: -30,-24 -pwra: +power.atreides: idle: DATA Start: 2523 Offset: -32,64 @@ -392,7 +286,7 @@ pwra: Start: 4056 Offset: -30,-24 -barra: +barracks.atreides: idle: DATA Start: 2525 Offset: -32,64 @@ -420,7 +314,7 @@ barra: Start: 4059 Offset: -30,-24 -radara: +radar.atreides: idle: DATA Start: 2521 Offset: -48,80 @@ -452,7 +346,7 @@ radara: Start: 4072 Offset: -30,-24 -refa: +refinery.atreides: idle: DATA Start: 2561 Length: 1 @@ -493,7 +387,7 @@ refa: Tick: 200 BlendMode: Additive -siloa: +silo.atreides: idle: DATA Start: 2566 Length: 4 @@ -515,7 +409,7 @@ siloa: Start: 4084 Offset: -30,-24 -hightecha: +hightech.atreides: idle: DATA Start: 2564 Offset: -48,80 @@ -549,7 +443,7 @@ hightecha: Start: 4078 Offset: -30,-24 -researcha: +research.atreides: idle: DATA Start: 2669 Offset: -48,80 @@ -582,7 +476,7 @@ researcha: Start: 4099 Offset: -30,-24 -researchh: +research.harkonnen: idle: DATA Start: 2829 Offset: -48,80 @@ -615,7 +509,7 @@ researchh: Start: 4100 Offset: -30,-24 -researcho: +research.ordos: idle: DATA Start: 2989 Offset: -48,80 @@ -648,7 +542,7 @@ researcho: Start: 4101 Offset: -30,-24 -palacea: +palace.atreides: idle: DATA Start: 2676 Offset: -48,48 @@ -676,7 +570,7 @@ palacea: Start: 4102 Offset: -30,-24 -lighta: +light.atreides: idle: DATA Start: 2673 Length: 1 @@ -718,7 +612,7 @@ lighta: Start: 4081 Offset: -30,-24 -heavya: +heavy.atreides: idle: DATA Start: 2518 Length: 1 @@ -761,7 +655,7 @@ heavya: Start: 4087 Offset: -30,-24 -conyardh: +conyard.harkonnen: idle: DATA Start: 2719 Offset: -48,64 @@ -799,7 +693,7 @@ conyardh: Start: 4047 Offset: -30,-24 -starporth: +starport.harkonnen: idle: DATA Start: 2831 ZOffset: -1c511 @@ -843,7 +737,7 @@ starporth: Start: 4093 Offset: -30,-24 -pwrh: +power.harkonnen: idle: DATA Start: 2683 Offset: -32,64 @@ -881,7 +775,7 @@ pwrh: Start: 4057 Offset: -30,-24 -barrh: +barracks.harkonnen: idle: DATA Start: 2685 Offset: -32,64 @@ -909,7 +803,7 @@ barrh: Start: 4060 Offset: -30,-24 -radarh: +radar.harkonnen: idle: DATA Start: 2681 Offset: -48,80 @@ -941,7 +835,7 @@ radarh: Start: 4073 Offset: -30,-24 -refh: +refinery.harkonnen: idle: DATA Start: 2721 Length: 1 @@ -982,7 +876,7 @@ refh: Tick: 200 BlendMode: Additive -siloh: +silo.harkonnen: idle: DATA Start: 2726 Length: 4 @@ -1004,7 +898,7 @@ siloh: Start: 4085 Offset: -30,-24 -hightechh: +hightech.harkonnen: idle: DATA Start: 2724 Offset: -48,80 @@ -1038,7 +932,7 @@ hightechh: Start: 4079 Offset: -30,-24 -palaceh: +palace.harkonnen: idle: DATA Start: 2836 Offset: -48,48 @@ -1074,7 +968,7 @@ palaceh: Start: 4103 Offset: -30,-24 -lighth: +light.harkonnen: idle: DATA Start: 2833 Length: 1 @@ -1116,7 +1010,7 @@ lighth: Start: 4082 Offset: -30,-24 -heavyh: +heavy.harkonnen: idle: DATA Start: 2678 Length: 1 @@ -1159,7 +1053,7 @@ heavyh: Start: 4088 Offset: -30,-24 -conyardo: +conyard.ordos: idle: DATA Start: 2879 Offset: -48,64 @@ -1197,7 +1091,7 @@ conyardo: Start: 4048 Offset: -30,-24 -starporto: +starport.ordos: idle: DATA Start: 2991 Offset: -48,48 @@ -1241,7 +1135,7 @@ starporto: Start: 4094 Offset: -30,-24 -pwro: +power.ordos: idle: DATA Start: 2843 Length: 1 @@ -1280,7 +1174,7 @@ pwro: Start: 4058 Offset: -30,-24 -barro: +barracks.ordos: idle: DATA Start: 2845 Offset: -32,64 @@ -1308,7 +1202,7 @@ barro: Start: 4061 Offset: -30,-24 -radaro: +radar.ordos: idle: DATA Start: 2841 Offset: -48,80 @@ -1340,7 +1234,7 @@ radaro: Start: 4074 Offset: -30,-24 -refo: +refinery.ordos: idle: DATA Start: 2881 Length: 1 @@ -1381,7 +1275,7 @@ refo: Tick: 200 BlendMode: Additive -siloo: +silo.ordos: idle: DATA Start: 2886 Length: 4 @@ -1403,7 +1297,7 @@ siloo: Start: 4086 Offset: -30,-24 -hightecho: +hightech.ordos: idle: DATA Start: 2884 Offset: -48,80 @@ -1437,7 +1331,7 @@ hightecho: Start: 4080 Offset: -30,-24 -palaceo: +palace.ordos: idle: DATA Start: 2996 Offset: -48,48 @@ -1465,7 +1359,7 @@ palaceo: Start: 4104 Offset: -30,-24 -lighto: +light.ordos: idle: DATA Start: 2993 Length: 1 @@ -1507,7 +1401,7 @@ lighto: Start: 4083 Offset: -30,-24 -heavyo: +heavy.ordos: idle: DATA Start: 2838 Length: 1 @@ -1550,7 +1444,7 @@ heavyo: Start: 4089 Offset: -30,-24 -palacec: +palace.corrino: idle: DATA Start: 3004 Offset: -48,48 @@ -1577,7 +1471,7 @@ palacec: Offset: -48,48 Tick: 100 -starportc: +starport.corrino: idle: DATA Start: 2999 Offset: -48,48 @@ -1621,7 +1515,7 @@ starportc: Start: 4020 Offset: -30,-24 -heavyc: +heavy.corrino: idle: DATA Start: 3001 Length: 1 @@ -1664,44 +1558,6 @@ heavyc: Start: 4020 Offset: -30,-24 -conyardc: - idle: DATA - Start: 3006 - Offset: -48,64 - make: DATA - Start: 4109 - Length: 30 - Offset: -48,64 - crumble-overlay: DATA - Start: 4139 - Length: 12 - Offset: -48,64 - Tick: 200 - damaged-idle: DATA - Start: 3007 - Offset: -48,64 - crane-overlay: DATA - Start: 4478 - Length: 14 - Offset: -48,64 - Tick: 80 - damaged-crane-overlay: DATA - Start: 4478 - Length: 14 - Offset: -48,64 - Tick: 80 - bib: BLOXBASE - Frames: 611, 612, 613, 631, 632, 633 - Length: 6 - Offset: -16,-16 - bib-Concrete: BLOXBASE - Frames: 643, 644, 645, 663, 664, 665 - Length: 6 - Offset: -16,-16 - icon: DATA - Start: 4049 - Offset: -30,-24 - plates: # TODO: unused idle: DATA Start: 3008 diff --git a/mods/d2k/sequences/vehicles.yaml b/mods/d2k/sequences/vehicles.yaml index cb6c6e5981..2a2955bd38 100644 --- a/mods/d2k/sequences/vehicles.yaml +++ b/mods/d2k/sequences/vehicles.yaml @@ -1,4 +1,4 @@ -dmcv: +mcv: idle: DATA Start: 1795 Facings: -32 @@ -6,7 +6,7 @@ dmcv: Start: 4023 Offset: -30,-24 -dmcv.destroyed: +mcv.husk: idle: DATA Start: 1795 Facings: -32 @@ -32,7 +32,7 @@ harvester: Start: 4019 Offset: -30,-24 -harvester.destroyed: +harvester.husk: idle: DATA Start: 1699 Facings: -32 @@ -80,7 +80,7 @@ siegetank: Start: 4026 Offset: -30,-24 -siegetank.destroyed: +siegetank.husk: idle: DATA Start: 1763 Facings: -32 @@ -98,7 +98,7 @@ missiletank: Start: 4024 Offset: -30,-24 -missiletank.destroyed: +missiletank.husk: idle: DATA Start: 1603 Facings: -32 @@ -112,7 +112,7 @@ sonictank: Start: 4027 Offset: -30,-24 -sonictank.destroyed: +sonictank.husk: idle: DATA Start: 1827 Facings: -32 @@ -134,7 +134,7 @@ combata: Start: 4020 Offset: -30,-24 -combata.destroyed: +combata.husk: idle: DATA Start: 1731 Facings: -32 @@ -160,7 +160,7 @@ combath: Start: 4021 Offset: -30,-24 -combath.destroyed: +combath.husk: idle: DATA Start: 2051 Facings: -32 @@ -170,25 +170,6 @@ combath.destroyed: Facings: -32 ZOffset: -512 -devast: - idle: DATA - Start: 2083 - Facings: -32 - muzzle: DATA - Frames: 3807, 3807, 3808, 3808, 3809, 3809, 3810, 3810, 3810, 3811, 3811, 3812, 3812, 3813, 3813, 3814, 3814, 3815, 3816, 3816, 3817, 3817, 3818, 3819, 3819, 3820, 3820, 3821, 3821, 3822, 3822, 3823, 3823, 3824, 3824, 3825, 3825, 3826, 3826, 3827, 3827, 3828, 3828, 3829, 3829, 3830, 3830, 3831, 3831, 3832, 3832, 3832, 3833, 3833, 3834, 3834, 3835, 3835, 3836, 3836, 3837, 3837, 3838, 3838 - Facings: -32 - Length: 2 - BlendMode: Additive - icon: DATA - Start: 4028 - Offset: -30,-24 - -devast.destroyed: - idle: DATA - Start: 2083 - Facings: -32 - ZOffset: -512 - combato: idle: DATA Start: 2453 @@ -205,7 +186,7 @@ combato: Start: 4022 Offset: -30,-24 -combato.destroyed: +combato.husk: idle: DATA Start: 2453 Facings: -32 @@ -215,6 +196,25 @@ combato.destroyed: Facings: -32 ZOffset: -512 +devast: + idle: DATA + Start: 2083 + Facings: -32 + muzzle: DATA + Frames: 3807, 3807, 3808, 3808, 3809, 3809, 3810, 3810, 3810, 3811, 3811, 3812, 3812, 3813, 3813, 3814, 3814, 3815, 3816, 3816, 3817, 3817, 3818, 3819, 3819, 3820, 3820, 3821, 3821, 3822, 3822, 3823, 3823, 3824, 3824, 3825, 3825, 3826, 3826, 3827, 3827, 3828, 3828, 3829, 3829, 3830, 3830, 3831, 3831, 3832, 3832, 3832, 3833, 3833, 3834, 3834, 3835, 3835, 3836, 3836, 3837, 3837, 3838, 3838 + Facings: -32 + Length: 2 + BlendMode: Additive + icon: DATA + Start: 4028 + Offset: -30,-24 + +devast.husk: + idle: DATA + Start: 2083 + Facings: -32 + ZOffset: -512 + raider: idle: DATA Start: 2421 @@ -254,7 +254,7 @@ deviatortank: Start: 4025 Offset: -30,-24 -deviatortank.destroyed: +deviatortank.husk: idle: DATA Start: 2389 Facings: -32 diff --git a/mods/ra/rules/vehicles.yaml b/mods/ra/rules/vehicles.yaml index 51344d9fef..5f4132dc20 100644 --- a/mods/ra/rules/vehicles.yaml +++ b/mods/ra/rules/vehicles.yaml @@ -308,7 +308,7 @@ MCV: Offset: -1,-1 Facing: 96 TransformSounds: placbldg.aud, build5.aud - NoTransformSounds: nodeply1.aud + NoTransformNotification: BuildingCannotPlaceAudio RenderUnit: MustBeDestroyed: RequiredForShortGame: true