diff --git a/OpenRA.Game/Graphics/Animation.cs b/OpenRA.Game/Graphics/Animation.cs index ff8d3cd446..d851c20094 100644 --- a/OpenRA.Game/Graphics/Animation.cs +++ b/OpenRA.Game/Graphics/Animation.cs @@ -23,9 +23,12 @@ namespace OpenRA.Graphics int frame = 0; bool backwards = false; - bool tickAlways; + string name; + readonly int defaultTick = 40; // 25 fps == 40 ms + bool tickAlways; + public string Name { get { return name; } } readonly SequenceProvider sequenceProvider; @@ -66,6 +69,12 @@ namespace OpenRA.Graphics return Render(pos, WVec.Zero, 0, palette, 1f); } + public void Initialize(string sequenceName) + { + CurrentSequence = sequenceProvider.GetSequence(name, sequenceName); + tickAlways = true; + } + public void Play(string sequenceName) { PlayThen(sequenceName, null); @@ -149,7 +158,7 @@ namespace OpenRA.Graphics while (timeUntilNextFrame <= 0) { tickFunc(); - timeUntilNextFrame += CurrentSequence != null ? CurrentSequence.Tick : 40; // 25 fps == 40 ms + timeUntilNextFrame += CurrentSequence != null ? CurrentSequence.Tick : defaultTick; } } } diff --git a/OpenRA.Game/Network/UnitOrders.cs b/OpenRA.Game/Network/UnitOrders.cs index c32870654a..b8aa4b690d 100644 --- a/OpenRA.Game/Network/UnitOrders.cs +++ b/OpenRA.Game/Network/UnitOrders.cs @@ -1,6 +1,6 @@ #region Copyright & License Information /* - * Copyright 2007-2011 The OpenRA Developers (see AUTHORS) + * Copyright 2007-2014 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made * available to you under the terms of the GNU General Public License * as published by the Free Software Foundation. For more information, @@ -102,15 +102,15 @@ namespace OpenRA.Network var client = orderManager.LobbyInfo.ClientWithIndex(clientId); if (client != null) { - var pause = order.TargetString == "Pause"; - if (orderManager.world.Paused != pause && !world.LobbyInfo.IsSinglePlayer) + var pauseState = order.TargetString == "Pause" ? World.PauseState.Paused : World.PauseState.Active; + if (orderManager.world.Paused != pauseState && !world.LobbyInfo.IsSinglePlayer) { - var pausetext = "The game is {0} by {1}".F(pause ? "paused" : "un-paused", client.Name); + var pausetext = "The game is {0} by {1}.".F(pauseState == World.PauseState.Paused ? "paused" : "un-paused", client.Name); Game.AddChatLine(Color.White, "", pausetext); } - orderManager.world.Paused = pause; - orderManager.world.PredictedPaused = pause; + orderManager.world.Paused = pauseState; + orderManager.world.PredictedPaused = pauseState; } break; } diff --git a/OpenRA.Game/Traits/DebugPauseState.cs b/OpenRA.Game/Traits/DebugPauseState.cs index d7ec732273..bbaff35512 100644 --- a/OpenRA.Game/Traits/DebugPauseState.cs +++ b/OpenRA.Game/Traits/DebugPauseState.cs @@ -18,7 +18,7 @@ namespace OpenRA.Traits public class DebugPauseState : ISync { World world; - [Sync] public bool Paused { get { return world.Paused; } } + [Sync] public bool Paused { get { return world.Paused == World.PauseState.Paused; } } public DebugPauseState(World world) { this.world = world; } } } diff --git a/OpenRA.Game/Traits/Render/RenderSprites.cs b/OpenRA.Game/Traits/Render/RenderSprites.cs old mode 100755 new mode 100644 index 3faad9748d..e8c4fb93b5 --- a/OpenRA.Game/Traits/Render/RenderSprites.cs +++ b/OpenRA.Game/Traits/Render/RenderSprites.cs @@ -31,7 +31,7 @@ namespace OpenRA.Traits public virtual object Create(ActorInitializer init) { return new RenderSprites(init.self); } } - public class RenderSprites : IRender, ITick, INotifyOwnerChanged, INotifyEffectiveOwnerChanged + public class RenderSprites : IRender, ITickRender, INotifyOwnerChanged, INotifyEffectiveOwnerChanged { class AnimationWrapper { @@ -126,8 +126,11 @@ namespace OpenRA.Traits } } - public virtual void Tick(Actor self) + public virtual void TickRender(WorldRenderer wr, Actor self) { + if (wr.world.Paused == World.PauseState.Paused) + return; + foreach (var a in anims.Values) a.Animation.Animation.Tick(); } diff --git a/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs b/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs index f798ea70da..7dc0ac36ae 100644 --- a/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs +++ b/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs @@ -199,7 +199,7 @@ namespace OpenRA.Widgets var key = Hotkey.FromKeyInput(e); if (key == Game.Settings.Keys.PauseKey && World.LocalPlayer != null) // Disable pausing for spectators - World.SetPauseState(!World.Paused); + World.SetPauseState(World.Paused != World.PauseState.Paused); else if (key == Game.Settings.Keys.SelectAllUnitsKey) { var ownUnitsOnScreen = SelectActorsInBox(World, worldRenderer.Viewport.TopLeft, worldRenderer.Viewport.BottomRight, diff --git a/OpenRA.Game/World.cs b/OpenRA.Game/World.cs index 6d1aa45475..0d91c947b9 100644 --- a/OpenRA.Game/World.cs +++ b/OpenRA.Game/World.cs @@ -203,8 +203,9 @@ namespace OpenRA public event Action ActorAdded = _ => { }; public event Action ActorRemoved = _ => { }; - public bool Paused { get; internal set; } - public bool PredictedPaused { get; internal set; } + public enum PauseState { Active, Paused, Editor } + public PauseState Paused { get; internal set; } + public PauseState PredictedPaused { get; internal set; } public bool PauseStateLocked { get; set; } public bool IsShellmap = false; public int WorldTick { get; private set; } @@ -215,17 +216,17 @@ namespace OpenRA return; IssueOrder(Order.PauseGame(paused)); - PredictedPaused = paused; + PredictedPaused = paused ? PauseState.Paused : PauseState.Active;; } - public void SetLocalPauseState(bool paused) + public void SetLocalPauseState(PauseState paused) { Paused = PredictedPaused = paused; } public void Tick() { - if (!Paused && (!IsShellmap || Game.Settings.Game.ShowShellmap)) + if (Paused != PauseState.Paused && (!IsShellmap || Game.Settings.Game.ShowShellmap)) { WorldTick++; diff --git a/OpenRA.Mods.Cnc/Widgets/Logic/CncIngameChromeLogic.cs b/OpenRA.Mods.Cnc/Widgets/Logic/CncIngameChromeLogic.cs index d4c03a05d1..77dbdb11d3 100644 --- a/OpenRA.Mods.Cnc/Widgets/Logic/CncIngameChromeLogic.cs +++ b/OpenRA.Mods.Cnc/Widgets/Logic/CncIngameChromeLogic.cs @@ -41,7 +41,7 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic public void OptionsClicked() { - var cachedPause = world.PredictedPaused; + var cachedPause = world.PredictedPaused == World.PauseState.Paused; ingameRoot.IsVisible = () => false; if (world.LobbyInfo.IsSinglePlayer) diff --git a/OpenRA.Mods.RA/Activities/MakeAnimation.cs b/OpenRA.Mods.RA/Activities/MakeAnimation.cs deleted file mode 100644 index 2ebde3fc79..0000000000 --- a/OpenRA.Mods.RA/Activities/MakeAnimation.cs +++ /dev/null @@ -1,71 +0,0 @@ -#region Copyright & License Information -/* - * Copyright 2007-2011 The OpenRA Developers (see AUTHORS) - * This file is part of OpenRA, which is free software. It is made - * available to you under the terms of the GNU General Public License - * as published by the Free Software Foundation. For more information, - * see COPYING. - */ -#endregion - -using System; -using OpenRA.Mods.RA.Buildings; -using OpenRA.Mods.RA.Render; -using OpenRA.Traits; - -namespace OpenRA.Mods.RA.Activities -{ - class MakeAnimation : Activity - { - readonly bool Reversed; - readonly Action OnComplete; - RenderBuilding rb; - - public MakeAnimation(Actor self, Action onComplete) : this(self, false, onComplete) {} - public MakeAnimation(Actor self, bool reversed, Action onComplete) - { - Reversed = reversed; - OnComplete = onComplete; - } - - bool complete = false; - bool started = false; - - public override Activity Tick(Actor self) - { - if (self.IsDead()) - return NextActivity; - - if (started) - { - // Don't break the actor if someone has overriden the animation prematurely - if (rb.DefaultAnimation.CurrentSequence.Name != "make") - { - complete = true; - OnComplete(); - } - return complete ? NextActivity : this; - } - - started = true; - rb = self.Trait(); - if (Reversed) - { - // TODO: These don't belong here - var bi = self.Info.Traits.GetOrDefault(); - if (bi != null) - foreach (var s in bi.SellSounds) - Sound.PlayToPlayer(self.Owner, s, self.CenterPosition); - - rb.PlayCustomAnimBackwards(self, "make", () => { OnComplete(); complete = true;}); - } - else - rb.PlayCustomAnimThen(self, "make", () => { OnComplete(); complete = true;}); - - return this; - } - - // Cannot be cancelled - public override void Cancel(Actor self) { } - } -} diff --git a/OpenRA.Mods.RA/Activities/Transform.cs b/OpenRA.Mods.RA/Activities/Transform.cs index 47012b5454..4c83e96357 100644 --- a/OpenRA.Mods.RA/Activities/Transform.cs +++ b/OpenRA.Mods.RA/Activities/Transform.cs @@ -76,8 +76,8 @@ namespace OpenRA.Mods.RA.Activities init.Add(new RuntimeCargoInit(cargo.Passengers.ToArray())); var a = w.CreateActor(ToActor, init); - foreach (var nt in self.TraitsImplementing()) - nt.OnTransformed(a); + foreach (var nt in self.TraitsImplementing()) + nt.AfterTransform(a); if (selected) w.Selection.Add(w, a); diff --git a/OpenRA.Mods.RA/Attack/AttackGarrisoned.cs b/OpenRA.Mods.RA/Attack/AttackGarrisoned.cs index 123f1dc0b5..ce0bc91849 100644 --- a/OpenRA.Mods.RA/Attack/AttackGarrisoned.cs +++ b/OpenRA.Mods.RA/Attack/AttackGarrisoned.cs @@ -40,7 +40,7 @@ namespace OpenRA.Mods.RA public override object Create(ActorInitializer init) { return new AttackGarrisoned(init.self, this); } } - public class AttackGarrisoned : AttackFollow, INotifyPassengerEntered, INotifyPassengerExited, IRender + public class AttackGarrisoned : AttackFollow, INotifyPassengerEntered, INotifyPassengerExited, IRender, ITickRender { public readonly FirePort[] Ports; @@ -183,9 +183,10 @@ namespace OpenRA.Mods.RA yield return r; } - public override void Tick(Actor self) + public void TickRender(WorldRenderer wr, Actor self) { - base.Tick(self); + if (wr.world.Paused == World.PauseState.Paused) + return; // Take a copy so that Tick() can remove animations foreach (var m in muzzles.ToList()) diff --git a/OpenRA.Mods.RA/Buildings/Building.cs b/OpenRA.Mods.RA/Buildings/Building.cs index 0167f7b20f..a467b7c288 100644 --- a/OpenRA.Mods.RA/Buildings/Building.cs +++ b/OpenRA.Mods.RA/Buildings/Building.cs @@ -34,8 +34,9 @@ namespace OpenRA.Mods.RA.Buildings public readonly bool RequiresBaseProvider = false; public readonly bool AllowInvalidPlacement = false; - public readonly string[] BuildSounds = {"placbldg.aud", "build5.aud"}; - public readonly string[] SellSounds = {"cashturn.aud"}; + public readonly string[] BuildSounds = { "placbldg.aud", "build5.aud" }; + public readonly string[] SellSounds = { "cashturn.aud" }; + public readonly string[] UndeploySounds = { "cashturn.aud" }; public object Create(ActorInitializer init) { return new Building(init, this); } @@ -99,7 +100,7 @@ namespace OpenRA.Mods.RA.Buildings } } - public class Building : INotifyDamage, IOccupySpace, INotifyCapture, INotifyBuildComplete, INotifySold, ISync, ITechTreePrerequisite, INotifyAddedToWorld, INotifyRemovedFromWorld + public class Building : INotifyDamage, IOccupySpace, INotifyCapture, INotifyBuildComplete, INotifySold, INotifyTransform, ISync, ITechTreePrerequisite, INotifyAddedToWorld, INotifyRemovedFromWorld { public readonly BuildingInfo Info; public bool BuildComplete { get; private set; } @@ -185,7 +186,21 @@ namespace OpenRA.Mods.RA.Buildings Locked = false; } - public void Selling(Actor self) { BuildComplete = false; } + public void Selling(Actor self) + { + foreach (var s in Info.SellSounds) + Sound.PlayToPlayer(self.Owner, s, self.CenterPosition); + + BuildComplete = false; + } public void Sold(Actor self) { } + + public void BeforeTransform(Actor self) + { + foreach (var s in Info.UndeploySounds) + Sound.PlayToPlayer(self.Owner, s, self.CenterPosition); + } + public void OnTransform(Actor self) { } + public void AfterTransform(Actor self) { } } } diff --git a/OpenRA.Mods.RA/ChronoshiftPaletteEffect.cs b/OpenRA.Mods.RA/ChronoshiftPaletteEffect.cs index 9565e37892..19c99528e8 100644 --- a/OpenRA.Mods.RA/ChronoshiftPaletteEffect.cs +++ b/OpenRA.Mods.RA/ChronoshiftPaletteEffect.cs @@ -17,7 +17,7 @@ namespace OpenRA.Mods.RA { class ChronoshiftPaletteEffectInfo : TraitInfo { } - public class ChronoshiftPaletteEffect : IPaletteModifier, ITick + public class ChronoshiftPaletteEffect : IPaletteModifier, ITickRender { const int chronoEffectLength = 60; int remainingFrames; @@ -27,8 +27,11 @@ namespace OpenRA.Mods.RA remainingFrames = chronoEffectLength; } - public void Tick(Actor self) + public void TickRender(WorldRenderer wr, Actor self) { + if (wr.world.Paused == World.PauseState.Paused) + return; + if (remainingFrames > 0) remainingFrames--; } diff --git a/OpenRA.Mods.RA/CloakPaletteEffect.cs b/OpenRA.Mods.RA/CloakPaletteEffect.cs index d7da7419b6..306041e60d 100644 --- a/OpenRA.Mods.RA/CloakPaletteEffect.cs +++ b/OpenRA.Mods.RA/CloakPaletteEffect.cs @@ -1,6 +1,6 @@ #region Copyright & License Information /* - * Copyright 2007-2011 The OpenRA Developers (see AUTHORS) + * Copyright 2007-2014 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made * available to you under the terms of the GNU General Public License * as published by the Free Software Foundation. For more information, @@ -17,7 +17,7 @@ namespace OpenRA.Mods.RA { public class CloakPaletteEffectInfo : TraitInfo { } - public class CloakPaletteEffect : IPaletteModifier, ITick + public class CloakPaletteEffect : IPaletteModifier, ITickRender { float t = 0; string paletteName = "cloak"; @@ -41,8 +41,11 @@ namespace OpenRA.Mods.RA } } - public void Tick(Actor self) + public void TickRender(WorldRenderer wr, Actor self) { + if (wr.world.Paused == World.PauseState.Paused) + return; + t += 0.25f; if (t >= 256) t = 0; } diff --git a/OpenRA.Mods.RA/Console/PlayerCommands.cs b/OpenRA.Mods.RA/Console/PlayerCommands.cs index fd88f94912..4e19552236 100644 --- a/OpenRA.Mods.RA/Console/PlayerCommands.cs +++ b/OpenRA.Mods.RA/Console/PlayerCommands.cs @@ -37,7 +37,7 @@ namespace OpenRA.Mods.RA { case "pause": world.IssueOrder(new Order("PauseGame", null, false) - { TargetString = world.Paused ? "UnPause" : "Pause" }); + { TargetString = world.Paused == World.PauseState.Paused ? "UnPause" : "Pause" }); break; case "surrender": world.IssueOrder(new Order("Surrender", world.LocalPlayer.PlayerActor, false)); diff --git a/OpenRA.Mods.RA/Effects/Bullet.cs b/OpenRA.Mods.RA/Effects/Bullet.cs old mode 100755 new mode 100644 diff --git a/OpenRA.Mods.RA/Effects/InvulnEffect.cs b/OpenRA.Mods.RA/Effects/InvulnEffect.cs index dc26ac5b76..62e8ed7992 100644 --- a/OpenRA.Mods.RA/Effects/InvulnEffect.cs +++ b/OpenRA.Mods.RA/Effects/InvulnEffect.cs @@ -25,7 +25,7 @@ namespace OpenRA.Mods.RA.Effects this.b = a.Trait(); } - public void Tick( World world ) + public void Tick(World world) { if (a.IsDead() || b.GetDamageModifier(null, null) > 0) world.AddFrameEndTask(w => w.Remove(this)); diff --git a/OpenRA.Mods.RA/Effects/Missile.cs b/OpenRA.Mods.RA/Effects/Missile.cs old mode 100755 new mode 100644 diff --git a/OpenRA.Mods.RA/Effects/NukeLaunch.cs b/OpenRA.Mods.RA/Effects/NukeLaunch.cs old mode 100755 new mode 100644 diff --git a/OpenRA.Mods.RA/Effects/RepairIndicator.cs b/OpenRA.Mods.RA/Effects/RepairIndicator.cs old mode 100755 new mode 100644 diff --git a/OpenRA.Mods.RA/Effects/TeslaZap.cs b/OpenRA.Mods.RA/Effects/TeslaZap.cs index d26d947028..cfaefbefde 100644 --- a/OpenRA.Mods.RA/Effects/TeslaZap.cs +++ b/OpenRA.Mods.RA/Effects/TeslaZap.cs @@ -21,7 +21,7 @@ namespace OpenRA.Mods.RA.Effects public readonly string Palette = "effect"; public readonly int BrightZaps = 1; public readonly int DimZaps = 2; - public IEffect Create(ProjectileArgs args) { return new TeslaZap( this, args ); } + public IEffect Create(ProjectileArgs args) { return new TeslaZap(this, args); } } class TeslaZap : IEffect diff --git a/OpenRA.Mods.RA/LightPaletteRotator.cs b/OpenRA.Mods.RA/LightPaletteRotator.cs index 49033f0e48..0cfecfee7b 100644 --- a/OpenRA.Mods.RA/LightPaletteRotator.cs +++ b/OpenRA.Mods.RA/LightPaletteRotator.cs @@ -23,11 +23,14 @@ namespace OpenRA.Mods.RA public object Create(ActorInitializer init) { return new LightPaletteRotator(this); } } - class LightPaletteRotator : ITick, IPaletteModifier + class LightPaletteRotator : ITickRender, IPaletteModifier { float t = 0; - public void Tick(Actor self) + public void TickRender(WorldRenderer wr, Actor self) { + if (wr.world.Paused == World.PauseState.Paused) + return; + t += .5f; } diff --git a/OpenRA.Mods.RA/NukePaletteEffect.cs b/OpenRA.Mods.RA/NukePaletteEffect.cs index b028c06757..e1ddf805d5 100644 --- a/OpenRA.Mods.RA/NukePaletteEffect.cs +++ b/OpenRA.Mods.RA/NukePaletteEffect.cs @@ -17,7 +17,7 @@ namespace OpenRA.Mods.RA { class NukePaletteEffectInfo : TraitInfo { } - public class NukePaletteEffect : IPaletteModifier, ITick + public class NukePaletteEffect : IPaletteModifier, ITickRender { const int nukeEffectLength = 20; int remainingFrames; @@ -27,8 +27,11 @@ namespace OpenRA.Mods.RA remainingFrames = nukeEffectLength; } - public void Tick(Actor self) + public void TickRender(WorldRenderer wr, Actor self) { + if (wr.world.Paused == World.PauseState.Paused) + return; + if (remainingFrames > 0) remainingFrames--; } diff --git a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj index 0c161c64c9..a7c9bdafbe 100644 --- a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj +++ b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj @@ -100,7 +100,6 @@ - @@ -519,6 +518,7 @@ + diff --git a/OpenRA.Mods.RA/Orders/PlaceBuildingOrderGenerator.cs b/OpenRA.Mods.RA/Orders/PlaceBuildingOrderGenerator.cs index 59bf4aed1a..97d229d7d7 100644 --- a/OpenRA.Mods.RA/Orders/PlaceBuildingOrderGenerator.cs +++ b/OpenRA.Mods.RA/Orders/PlaceBuildingOrderGenerator.cs @@ -54,6 +54,9 @@ namespace OpenRA.Mods.RA.Orders IEnumerable InnerOrder(World world, CPos xy, MouseInput mi) { + if (world.Paused == World.PauseState.Paused) + yield break; + if (mi.Button == MouseButton.Left) { var topLeft = xy - FootprintUtils.AdjustForBuildingSize(BuildingInfo); diff --git a/OpenRA.Mods.RA/Player/ProductionQueue.cs b/OpenRA.Mods.RA/Player/ProductionQueue.cs index cfce76529f..b719c72862 100644 --- a/OpenRA.Mods.RA/Player/ProductionQueue.cs +++ b/OpenRA.Mods.RA/Player/ProductionQueue.cs @@ -140,7 +140,10 @@ namespace OpenRA.Mods.RA public void Killed(Actor killed, AttackInfo e) { if (killed == self) ClearQueue(); } public void Selling(Actor self) { } public void Sold(Actor self) { ClearQueue(); } + + public void BeforeTransform(Actor self) { } public void OnTransform(Actor self) { ClearQueue(); } + public void AfterTransform(Actor self) { } void CacheProduceables(Actor playerActor) { diff --git a/OpenRA.Mods.RA/Render/RenderBuilding.cs b/OpenRA.Mods.RA/Render/RenderBuilding.cs index 937589094a..e30569fbf5 100755 --- a/OpenRA.Mods.RA/Render/RenderBuilding.cs +++ b/OpenRA.Mods.RA/Render/RenderBuilding.cs @@ -19,7 +19,6 @@ namespace OpenRA.Mods.RA.Render { public class RenderBuildingInfo : RenderSimpleInfo, Requires, IPlaceBuildingDecoration { - public readonly bool HasMakeAnimation = true; public readonly bool PauseOnLowPower = false; public override object Create(ActorInitializer init) { return new RenderBuilding(init, this);} @@ -34,9 +33,11 @@ namespace OpenRA.Mods.RA.Render } } - public class RenderBuilding : RenderSimple, INotifyDamageStateChanged + public class RenderBuilding : RenderSimple, INotifyDamageStateChanged, INotifyBuildComplete { RenderBuildingInfo info; + bool buildComplete; + bool skipMakeAnimation; public RenderBuilding(ActorInitializer init, RenderBuildingInfo info) : this(init, info, () => 0) { } @@ -46,23 +47,32 @@ namespace OpenRA.Mods.RA.Render { var self = init.self; this.info = info; + skipMakeAnimation = init.Contains(); + + DefaultAnimation.Initialize(NormalizeSequence(self, "idle")); - // Work around a bogus crash - DefaultAnimation.PlayRepeating(NormalizeSequence(self, "idle")); self.Trait().SetAutodetectedFacings(DefaultAnimation.CurrentSequence.Facings); - - // Can't call Complete() directly from ctor because other traits haven't been inited yet - if (self.Info.Traits.Get().HasMakeAnimation && !init.Contains()) - self.QueueActivity(new MakeAnimation(self, () => Complete(self))); - else - self.QueueActivity(new CallFunc(() => Complete(self))); } - void Complete(Actor self) + public override void TickRender(WorldRenderer wr, Actor self) + { + if (wr.world.Paused == World.PauseState.Paused) + return; + + base.TickRender(wr, self); + + if (buildComplete) + return; + + buildComplete = true; + if (!self.HasTrait() || skipMakeAnimation) + foreach (var notify in self.TraitsImplementing()) + notify.BuildingComplete(self); + } + + public virtual void BuildingComplete(Actor self) { DefaultAnimation.PlayRepeating(NormalizeSequence(self, "idle")); - foreach (var x in self.TraitsImplementing()) - x.BuildingComplete(self); if (info.PauseOnLowPower) { diff --git a/OpenRA.Mods.RA/Render/RenderBuildingCharge.cs b/OpenRA.Mods.RA/Render/RenderBuildingCharge.cs index da4c4b0537..f39d6d6e86 100755 --- a/OpenRA.Mods.RA/Render/RenderBuildingCharge.cs +++ b/OpenRA.Mods.RA/Render/RenderBuildingCharge.cs @@ -10,6 +10,7 @@ namespace OpenRA.Mods.RA.Render { + [Desc("Used for tesla coil and obelisk.")] public class RenderBuildingChargeInfo : RenderBuildingInfo { [Desc("Sound to play when building charges.")] @@ -19,12 +20,11 @@ namespace OpenRA.Mods.RA.Render public override object Create(ActorInitializer init) { return new RenderBuildingCharge(init, this); } } - /* used for tesla and obelisk */ public class RenderBuildingCharge : RenderBuilding { RenderBuildingChargeInfo info; - public RenderBuildingCharge( ActorInitializer init, RenderBuildingChargeInfo info ) + public RenderBuildingCharge(ActorInitializer init, RenderBuildingChargeInfo info) : base(init, info) { this.info = info; @@ -33,8 +33,7 @@ namespace OpenRA.Mods.RA.Render public void PlayCharge(Actor self) { Sound.Play(info.ChargeAudio, self.CenterPosition); - DefaultAnimation.PlayThen(NormalizeSequence(self, info.ChargeSequence), - () => DefaultAnimation.PlayRepeating(NormalizeSequence(self, "idle"))); + PlayCustomAnim(self, info.ChargeSequence); } } } diff --git a/OpenRA.Mods.RA/Render/RenderBuildingSilo.cs b/OpenRA.Mods.RA/Render/RenderBuildingSilo.cs index b2413b55ae..7b2114e972 100644 --- a/OpenRA.Mods.RA/Render/RenderBuildingSilo.cs +++ b/OpenRA.Mods.RA/Render/RenderBuildingSilo.cs @@ -27,7 +27,7 @@ namespace OpenRA.Mods.RA.Render playerResources = init.self.Owner.PlayerActor.Trait(); } - public void BuildingComplete(Actor self) + public override void BuildingComplete(Actor self) { var animation = (self.GetDamageState() >= DamageState.Heavy) ? "damaged-idle" : "idle"; diff --git a/OpenRA.Mods.RA/Render/RenderBuildingWall.cs b/OpenRA.Mods.RA/Render/RenderBuildingWall.cs index da090cb2d6..62bf58e486 100644 --- a/OpenRA.Mods.RA/Render/RenderBuildingWall.cs +++ b/OpenRA.Mods.RA/Render/RenderBuildingWall.cs @@ -9,6 +9,7 @@ #endregion using System.Linq; +using OpenRA.Graphics; using OpenRA.Traits; namespace OpenRA.Mods.RA.Render @@ -21,7 +22,7 @@ namespace OpenRA.Mods.RA.Render public override object Create(ActorInitializer init) { return new RenderBuildingWall(init, this); } } - class RenderBuildingWall : RenderBuilding, INotifyBuildComplete, INotifyAddedToWorld, INotifyRemovedFromWorld + class RenderBuildingWall : RenderBuilding, INotifyAddedToWorld, INotifyRemovedFromWorld, ITick { readonly RenderBuildingWallInfo info; int adjacent = 0; @@ -33,9 +34,10 @@ namespace OpenRA.Mods.RA.Render this.info = info; } - public void BuildingComplete(Actor self) + public override void BuildingComplete(Actor self) { DefaultAnimation.PlayFetchIndex(info.Sequence, () => adjacent); + UpdateNeighbours(self); } public override void DamageStateChanged(Actor self, AttackInfo e) @@ -43,10 +45,16 @@ namespace OpenRA.Mods.RA.Render DefaultAnimation.PlayFetchIndex(NormalizeSequence(DefaultAnimation, e.DamageState, info.Sequence), () => adjacent); } - public override void Tick(Actor self) + public override void TickRender(WorldRenderer wr, Actor self) { - base.Tick(self); + if (wr.world.Paused == World.PauseState.Paused) + return; + base.TickRender(wr, self); + } + + public void Tick(Actor self) + { if (!dirty) return; diff --git a/OpenRA.Mods.RA/Render/RenderBuildingWarFactory.cs b/OpenRA.Mods.RA/Render/RenderBuildingWarFactory.cs index 029d14f98f..828fba2229 100755 --- a/OpenRA.Mods.RA/Render/RenderBuildingWarFactory.cs +++ b/OpenRA.Mods.RA/Render/RenderBuildingWarFactory.cs @@ -36,7 +36,7 @@ namespace OpenRA.Mods.RA.Render } } - class RenderBuildingWarFactory : RenderBuilding, INotifyBuildComplete, ITick, INotifyProduction, INotifySold, ISync + class RenderBuildingWarFactory : RenderBuilding, INotifyBuildComplete, ITickRender, INotifyProduction, INotifySold, ISync { Animation roof; [Sync] bool isOpen; @@ -55,16 +55,20 @@ namespace OpenRA.Mods.RA.Render () => !buildComplete, offset)); } - public void BuildingComplete( Actor self ) + public override void BuildingComplete(Actor self) { roof.Play(NormalizeSequence(self, self.GetDamageState() > DamageState.Heavy ? "damaged-idle-top" : "idle-top")); buildComplete = true; } - public override void Tick(Actor self) + public override void TickRender(WorldRenderer wr, Actor self) { - base.Tick(self); + if (wr.world.Paused == World.PauseState.Paused) + return; + + base.TickRender(wr, self); + if (isOpen && !self.World.ActorMap.GetUnitsAt(openExit).Any( a => a != self )) { isOpen = false; diff --git a/OpenRA.Mods.RA/Render/RenderDisguise.cs b/OpenRA.Mods.RA/Render/RenderDisguise.cs index 26277cf12e..a1d35fa16c 100644 --- a/OpenRA.Mods.RA/Render/RenderDisguise.cs +++ b/OpenRA.Mods.RA/Render/RenderDisguise.cs @@ -9,6 +9,7 @@ #endregion using OpenRA.Traits; +using OpenRA.Graphics; namespace OpenRA.Mods.RA.Render { @@ -31,8 +32,11 @@ namespace OpenRA.Mods.RA.Render intendedSprite = disguise.AsSprite; } - public override void Tick(Actor self) + public override void TickRender(WorldRenderer wr, Actor self) { + if (wr.world.Paused == World.PauseState.Paused) + return; + if (disguise.AsSprite != intendedSprite) { intendedSprite = disguise.AsSprite; @@ -40,7 +44,7 @@ namespace OpenRA.Mods.RA.Render UpdatePalette(); } - base.Tick(self); + base.TickRender(wr, self); } } } diff --git a/OpenRA.Mods.RA/Render/RenderHarvester.cs b/OpenRA.Mods.RA/Render/RenderHarvester.cs index cecbe613ba..9a048aa776 100644 --- a/OpenRA.Mods.RA/Render/RenderHarvester.cs +++ b/OpenRA.Mods.RA/Render/RenderHarvester.cs @@ -35,15 +35,18 @@ namespace OpenRA.Mods.RA.Render new Animation(self.World, image); } - public override void Tick(Actor self) + public override void TickRender(WorldRenderer wr, Actor self) { + if (wr.world.Paused == World.PauseState.Paused) + return; + var desiredState = harv.Fullness * (info.ImagesByFullness.Length - 1) / 100; var desiredImage = info.ImagesByFullness[desiredState]; if (DefaultAnimation.Name != desiredImage) DefaultAnimation.ChangeImage(desiredImage, "idle"); - base.Tick(self); + base.TickRender(wr, self); } public void Harvested(Actor self, ResourceType resource) diff --git a/OpenRA.Mods.RA/Render/RenderInfantry.cs b/OpenRA.Mods.RA/Render/RenderInfantry.cs index a3948dc3e5..835c81ce17 100644 --- a/OpenRA.Mods.RA/Render/RenderInfantry.cs +++ b/OpenRA.Mods.RA/Render/RenderInfantry.cs @@ -1,6 +1,6 @@ #region Copyright & License Information /* - * Copyright 2007-2013 The OpenRA Developers (see AUTHORS) + * Copyright 2007-2014 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made * available to you under the terms of the GNU General Public License * as published by the Free Software Foundation. For more information, @@ -8,6 +8,7 @@ */ #endregion +using OpenRA.Graphics; using OpenRA.Mods.RA.Effects; using OpenRA.Traits; @@ -79,9 +80,12 @@ namespace OpenRA.Mods.RA.Render Attacking(self, target); } - public override void Tick(Actor self) + public override void TickRender(WorldRenderer wr, Actor self) { - base.Tick(self); + if (wr.world.Paused == World.PauseState.Paused) + return; + + base.TickRender(wr, self); if ((State == AnimationState.Moving || dirty) && !move.IsMoving) { diff --git a/OpenRA.Mods.RA/Render/RenderInfantryPanic.cs b/OpenRA.Mods.RA/Render/RenderInfantryPanic.cs index 8d3e424ded..8a47624d43 100644 --- a/OpenRA.Mods.RA/Render/RenderInfantryPanic.cs +++ b/OpenRA.Mods.RA/Render/RenderInfantryPanic.cs @@ -1,6 +1,6 @@ #region Copyright & License Information /* - * Copyright 2007-2011 The OpenRA Developers (see AUTHORS) + * Copyright 2007-2014 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made * available to you under the terms of the GNU General Public License * as published by the Free Software Foundation. For more information, @@ -8,6 +8,7 @@ */ #endregion +using OpenRA.Graphics; using OpenRA.Traits; namespace OpenRA.Mods.RA.Render @@ -43,13 +44,16 @@ namespace OpenRA.Mods.RA.Render return base.AllowIdleAnimation(self) && !sc.Panicking; } - public override void Tick (Actor self) + public override void TickRender(WorldRenderer wr, Actor self) { + if (wr.world.Paused == World.PauseState.Paused) + return; + if (wasPanic != sc.Panicking) dirty = true; wasPanic = sc.Panicking; - base.Tick(self); + base.TickRender(wr, self); } } } diff --git a/OpenRA.Mods.RA/Render/RenderLandingCraft.cs b/OpenRA.Mods.RA/Render/RenderLandingCraft.cs index 100c5a4a3f..50b6e9b55d 100644 --- a/OpenRA.Mods.RA/Render/RenderLandingCraft.cs +++ b/OpenRA.Mods.RA/Render/RenderLandingCraft.cs @@ -9,6 +9,7 @@ #endregion using System.Linq; +using OpenRA.Graphics; using OpenRA.Traits; namespace OpenRA.Mods.RA.Render @@ -41,7 +42,7 @@ namespace OpenRA.Mods.RA.Render public bool ShouldBeOpen() { - if (self.CenterPosition.Z > 0 || move.IsMoving) + if (self.CenterPosition.Z > 0 || move.IsMoving || cargo.CurrentAdjacentCells == null) return false; return cargo.CurrentAdjacentCells.Any(c => self.World.Map.Contains(c) @@ -70,14 +71,17 @@ namespace OpenRA.Mods.RA.Render PlayCustomAnimBackwards(self, info.OpenAnim, null); } - public override void Tick(Actor self) + public override void TickRender(WorldRenderer wr, Actor self) { + if (wr.world.Paused == World.PauseState.Paused) + return; + if (ShouldBeOpen()) Open(); else Close(); - base.Tick(self); + base.TickRender(wr, self); } } } diff --git a/OpenRA.Mods.RA/Render/RenderUnitReload.cs b/OpenRA.Mods.RA/Render/RenderUnitReload.cs index fefa5b0fe1..b9c817fa81 100755 --- a/OpenRA.Mods.RA/Render/RenderUnitReload.cs +++ b/OpenRA.Mods.RA/Render/RenderUnitReload.cs @@ -9,6 +9,7 @@ #endregion using System.Linq; +using OpenRA.Graphics; using OpenRA.Traits; namespace OpenRA.Mods.RA.Render @@ -34,13 +35,16 @@ namespace OpenRA.Mods.RA.Render .Single(a => a.Info.Name == info.Armament); } - public override void Tick(Actor self) + public override void TickRender(WorldRenderer wr, Actor self) { + if (wr.world.Paused == World.PauseState.Paused) + return; + var sequence = (armament.IsReloading ? "empty-" : "") + (attack.IsAttacking ? "aim" : "idle"); if (sequence != DefaultAnimation.CurrentSequence.Name) DefaultAnimation.ReplaceAnim(sequence); - base.Tick(self); + base.TickRender(wr, self); } } } diff --git a/OpenRA.Mods.RA/Render/WithMakeAnimation.cs b/OpenRA.Mods.RA/Render/WithMakeAnimation.cs new file mode 100644 index 0000000000..dd8fd06b5d --- /dev/null +++ b/OpenRA.Mods.RA/Render/WithMakeAnimation.cs @@ -0,0 +1,67 @@ +#region Copyright & License Information +/* + * Copyright 2007-2014 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation. For more information, + * see COPYING. + */ +#endregion + +using System; +using System.Linq; +using OpenRA.Graphics; +using OpenRA.Mods.RA.Activities; +using OpenRA.Mods.RA.Buildings; +using OpenRA.Mods.RA.Render; +using OpenRA.Traits; + +namespace OpenRA.Mods.RA.Render +{ + public class WithMakeAnimationInfo : ITraitInfo, Requires + { + [Desc("Sequence name to use")] + public readonly string Sequence = "make"; + + public object Create(ActorInitializer init) { return new WithMakeAnimation(init, this); } + } + + public class WithMakeAnimation : ITickRender + { + WithMakeAnimationInfo info; + RenderBuilding building; + bool buildComplete; + + public WithMakeAnimation(ActorInitializer init, WithMakeAnimationInfo info) + { + building = init.self.Trait(); + this.info = info; + buildComplete = init.Contains(); + } + + public void TickRender(WorldRenderer wr, Actor self) + { + if (wr.world.Paused == World.PauseState.Paused) + return; + + if (self.IsDead() || buildComplete) + return; + + buildComplete = true; + + building.PlayCustomAnimThen(self, info.Sequence, () => + { + foreach (var notify in self.TraitsImplementing()) + notify.BuildingComplete(self); + }); + } + + public void Reverse(Actor self, Activity activity) + { + building.PlayCustomAnimBackwards(self, info.Sequence, () => { + building.PlayCustomAnim(self, info.Sequence); // avoids visual glitches as we wait for the actor to get destroyed + self.QueueActivity(activity); + }); + } + } +} diff --git a/OpenRA.Mods.RA/Render/WithMuzzleFlash.cs b/OpenRA.Mods.RA/Render/WithMuzzleFlash.cs index 0d6d785082..50984d7d1b 100644 --- a/OpenRA.Mods.RA/Render/WithMuzzleFlash.cs +++ b/OpenRA.Mods.RA/Render/WithMuzzleFlash.cs @@ -25,7 +25,7 @@ namespace OpenRA.Mods.RA.Render public object Create(ActorInitializer init) { return new WithMuzzleFlash(init.self, this); } } - class WithMuzzleFlash : INotifyAttack, IRender, ITick + class WithMuzzleFlash : INotifyAttack, IRender, ITickRender { Dictionary visible = new Dictionary(); Dictionary anims = new Dictionary(); @@ -95,8 +95,11 @@ namespace OpenRA.Mods.RA.Render } } - public void Tick(Actor self) + public void TickRender(WorldRenderer wr, Actor self) { + if (wr.world.Paused == World.PauseState.Paused) + return; + foreach (var a in anims.Values) a.Animation.Tick(); } diff --git a/OpenRA.Mods.RA/Sellable.cs b/OpenRA.Mods.RA/Sellable.cs index 738e1ce10c..77a04c7b2e 100644 --- a/OpenRA.Mods.RA/Sellable.cs +++ b/OpenRA.Mods.RA/Sellable.cs @@ -1,6 +1,6 @@ #region Copyright & License Information /* - * Copyright 2007-2011 The OpenRA Developers (see AUTHORS) + * Copyright 2007-2014 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made * available to you under the terms of the GNU General Public License * as published by the Free Software Foundation. For more information, @@ -34,15 +34,16 @@ namespace OpenRA.Mods.RA if (!self.Trait().Lock()) return; + self.CancelActivity(); + foreach (var ns in self.TraitsImplementing()) ns.Selling(self); - self.CancelActivity(); - - var rb = self.TraitOrDefault(); - if (rb != null && self.Info.Traits.Get().HasMakeAnimation) - self.QueueActivity(new MakeAnimation(self, true, () => rb.PlayCustomAnim(self, "make"))); - self.QueueActivity(new Sell()); + var makeAnimation = self.TraitOrDefault(); + if (makeAnimation != null) + makeAnimation.Reverse(self, new Sell()); + else + self.QueueActivity(new Sell()); } } } diff --git a/OpenRA.Mods.RA/TakeCover.cs b/OpenRA.Mods.RA/TakeCover.cs index 5e6fdc14c4..57f47e60b7 100644 --- a/OpenRA.Mods.RA/TakeCover.cs +++ b/OpenRA.Mods.RA/TakeCover.cs @@ -1,6 +1,6 @@ #region Copyright & License Information /* - * Copyright 2007-2011 The OpenRA Developers (see AUTHORS) + * Copyright 2007-2014 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made * available to you under the terms of the GNU General Public License * as published by the Free Software Foundation. For more information, @@ -9,6 +9,7 @@ #endregion using OpenRA.GameRules; +using OpenRA.Graphics; using OpenRA.Mods.RA.Render; using OpenRA.Traits; @@ -52,6 +53,7 @@ namespace OpenRA.Mods.RA public override void Tick(Actor self) { base.Tick(self); + if (IsProne && --remainingProneTime == 0) LocalOffset = WVec.Zero; } @@ -98,13 +100,17 @@ namespace OpenRA.Mods.RA return base.AllowIdleAnimation(self) && !tc.IsProne; } - public override void Tick(Actor self) + public override void TickRender(WorldRenderer wr, Actor self) { + if (wr.world.Paused == World.PauseState.Paused) + return; + if (wasProne != tc.IsProne) dirty = true; wasProne = tc.IsProne; - base.Tick(self); + + base.TickRender(wr, self); } } } diff --git a/OpenRA.Mods.RA/TraitsInterfaces.cs b/OpenRA.Mods.RA/TraitsInterfaces.cs index 0e166c14ff..3ec75b1301 100755 --- a/OpenRA.Mods.RA/TraitsInterfaces.cs +++ b/OpenRA.Mods.RA/TraitsInterfaces.cs @@ -1,6 +1,6 @@ #region Copyright & License Information /* - * Copyright 2007-2011 The OpenRA Developers (see AUTHORS) + * Copyright 2007-2014 The OpenRA Developers (see AUTHORS) * This file is part of OpenRA, which is free software. It is made * available to you under the terms of the GNU General Public License * as published by the Free Software Foundation. For more information, @@ -47,8 +47,7 @@ namespace OpenRA.Mods.RA } public interface INotifyParachuteLanded { void OnLanded(); } - public interface INotifyTransform { void OnTransform(Actor self); } - public interface INotifyTransformed { void OnTransformed(Actor toActor); } + public interface INotifyTransform { void BeforeTransform(Actor self); void OnTransform(Actor self); void AfterTransform(Actor toActor); } public interface INotifyAttack { void Attacking(Actor self, Target target, Armament a, Barrel barrel); } public interface INotifyChat { bool OnChat(string from, string message); } } diff --git a/OpenRA.Mods.RA/Transforms.cs b/OpenRA.Mods.RA/Transforms.cs index 34c7904aec..7ec82563ec 100644 --- a/OpenRA.Mods.RA/Transforms.cs +++ b/OpenRA.Mods.RA/Transforms.cs @@ -88,11 +88,15 @@ namespace OpenRA.Mods.RA if (self.HasTrait()) self.QueueActivity(new Turn(info.Facing)); - var rb = self.TraitOrDefault(); - if (rb != null && self.Info.Traits.Get().HasMakeAnimation) - self.QueueActivity(new MakeAnimation(self, true, () => rb.PlayCustomAnim(self, "make"))); + foreach (var nt in self.TraitsImplementing()) + nt.BeforeTransform(self); - self.QueueActivity(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, Race = race }; + var makeAnimation = self.TraitOrDefault(); + if (makeAnimation != null) + makeAnimation.Reverse(self, transform); + else + self.QueueActivity(transform); } public void ResolveOrder(Actor self, Order order) diff --git a/OpenRA.Mods.RA/WaterPaletteRotation.cs b/OpenRA.Mods.RA/WaterPaletteRotation.cs index 9437b64384..1eefcc87e2 100644 --- a/OpenRA.Mods.RA/WaterPaletteRotation.cs +++ b/OpenRA.Mods.RA/WaterPaletteRotation.cs @@ -23,7 +23,7 @@ namespace OpenRA.Mods.RA public object Create(ActorInitializer init) { return new WaterPaletteRotation(init.world, this); } } - class WaterPaletteRotation : ITick, IPaletteModifier + class WaterPaletteRotation : ITickRender, IPaletteModifier { float t = 0; @@ -36,7 +36,13 @@ namespace OpenRA.Mods.RA this.info = info; } - public void Tick(Actor self) { t += .25f; } + public void TickRender(WorldRenderer wr, Actor self) + { + if (wr.world.Paused == World.PauseState.Paused) + return; + + t += .25f; + } uint[] temp = new uint[7]; /* allocating this on the fly actually hurts our profile */ diff --git a/OpenRA.Mods.RA/Widgets/Logic/GameTimerLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/GameTimerLogic.cs index 8233b9eda7..c637d3e588 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/GameTimerLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/GameTimerLogic.cs @@ -27,12 +27,12 @@ namespace OpenRA.Mods.RA.Widgets.Logic { var startTick = Ui.LastTickTime; // Blink the status line - status.IsVisible = () => (world.Paused || world.Timestep != Game.Timestep) + status.IsVisible = () => (world.Paused == World.PauseState.Paused || world.Timestep != Game.Timestep) && (Ui.LastTickTime - startTick) / 1000 % 2 == 0; status.GetText = () => { - if (world.Paused || world.Timestep == 0) + if (world.Paused == World.PauseState.Paused || world.Timestep == 0) return "Paused"; if (world.Timestep == 1) diff --git a/OpenRA.Mods.RA/Widgets/Logic/IngameChromeLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/IngameChromeLogic.cs index 5bae5362b1..d356cb5e17 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/IngameChromeLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/IngameChromeLogic.cs @@ -57,7 +57,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic optionsBG.Visible ^= true; if (optionsBG.Visible) { - cachedPause = world.PredictedPaused; + cachedPause = world.PredictedPaused == World.PauseState.Paused; if (world.LobbyInfo.IsSinglePlayer) world.SetPauseState(true); diff --git a/OpenRA.Mods.RA/Widgets/SupportPowerBinWidget.cs b/OpenRA.Mods.RA/Widgets/SupportPowerBinWidget.cs old mode 100755 new mode 100644 diff --git a/OpenRA.Utility/UpgradeRules.cs b/OpenRA.Utility/UpgradeRules.cs index 12551fb493..e6c7964477 100644 --- a/OpenRA.Utility/UpgradeRules.cs +++ b/OpenRA.Utility/UpgradeRules.cs @@ -252,6 +252,20 @@ namespace OpenRA.Utility node.Key = "StoresResources"; } + // make animation is now it's own trait + if (engineVersion < 20140621) + { + if (depth == 1 && (node.Key.StartsWith("RenderBuilding"))) + node.Value.Nodes.RemoveAll(n => n.Key == "HasMakeAnimation"); + + if (node.Value.Nodes.Any(n => n.Key.StartsWith("RenderBuilding")) + && !node.Value.Nodes.Any(n => n.Key == "RenderBuildingWall") + && !node.Value.Nodes.Any(n => n.Key == "WithMakeAnimation")) + { + node.Value.Nodes.Add(new MiniYamlNode("WithMakeAnimation", new MiniYaml(""))); + } + } + // ParachuteAttachment was merged into Parachutable if (engineVersion < 20140701) { diff --git a/mods/cnc/rules/defaults.yaml b/mods/cnc/rules/defaults.yaml index 99853981c1..51c36dacc5 100644 --- a/mods/cnc/rules/defaults.yaml +++ b/mods/cnc/rules/defaults.yaml @@ -355,6 +355,7 @@ LuaScriptEvents: Demolishable: ScriptTriggers: + WithMakeAnimation: ^BaseBuilding: Inherits: ^Building @@ -395,6 +396,7 @@ StartsRevealed: true LuaScriptEvents: ScriptTriggers: + WithMakeAnimation: ^TechBuilding: Inherits: ^CivBuilding @@ -418,6 +420,7 @@ Palette: terrain EditorAppearance: UseTerrainPalette: true + WithMakeAnimation: ^CivFieldHusk: AppearsOnRadar: @@ -436,6 +439,7 @@ StartsRevealed: true LuaScriptEvents: ScriptTriggers: + WithMakeAnimation: ^Wall: AppearsOnRadar: @@ -456,7 +460,6 @@ LineBuildNode: Types: wall RenderBuildingWall: - HasMakeAnimation: false Palette: staticterrain GivesExperience: EditorAppearance: @@ -493,6 +496,7 @@ StartsRevealed: true LuaScriptEvents: ScriptTriggers: + WithMakeAnimation: ^TibTree: Tooltip: @@ -510,6 +514,7 @@ FrozenUnderFog: StartsRevealed: true LuaScriptEvents: + WithMakeAnimation: ^Rock: Tooltip: @@ -529,6 +534,7 @@ StartsRevealed: true LuaScriptEvents: ScriptTriggers: + WithMakeAnimation: ^Husk: Health: diff --git a/mods/cnc/rules/tech.yaml b/mods/cnc/rules/tech.yaml index 7d618558df..40a3843308 100644 --- a/mods/cnc/rules/tech.yaml +++ b/mods/cnc/rules/tech.yaml @@ -94,4 +94,5 @@ MISS: Cost: 2000 Bib: HasMinibib: Yes + WithMakeAnimation: diff --git a/mods/cnc/rules/trees.yaml b/mods/cnc/rules/trees.yaml index d1c9b72964..ce52e9aecc 100644 --- a/mods/cnc/rules/trees.yaml +++ b/mods/cnc/rules/trees.yaml @@ -67,19 +67,16 @@ T01: EditorTilesetFilter: ExcludeTilesets: DESERT - T02: Inherits: ^Tree EditorTilesetFilter: ExcludeTilesets: DESERT - T03: Inherits: ^Tree EditorTilesetFilter: ExcludeTilesets: DESERT - T04: Inherits: ^Tree @@ -88,19 +85,16 @@ T05: EditorTilesetFilter: ExcludeTilesets: DESERT - T06: Inherits: ^Tree EditorTilesetFilter: ExcludeTilesets: DESERT - T07: Inherits: ^Tree EditorTilesetFilter: ExcludeTilesets: DESERT - T08: Inherits: ^Tree Building: diff --git a/mods/d2k/rules/defaults.yaml b/mods/d2k/rules/defaults.yaml index 08863b5172..a9eaa8b4e5 100644 --- a/mods/d2k/rules/defaults.yaml +++ b/mods/d2k/rules/defaults.yaml @@ -280,4 +280,5 @@ Pieces: 3, 7 Range: 2c0, 5c0 ScriptTriggers: + WithMakeAnimation: diff --git a/mods/d2k/rules/misc.yaml b/mods/d2k/rules/misc.yaml index d7029ac83d..bef6076078 100644 --- a/mods/d2k/rules/misc.yaml +++ b/mods/d2k/rules/misc.yaml @@ -116,6 +116,7 @@ SPICEBLOOM: RadarColorFromTerrain: Terrain: Spice BodyOrientation: + WithMakeAnimation: CAMERA: Immobile: diff --git a/mods/d2k/rules/structures.yaml b/mods/d2k/rules/structures.yaml index dfb79f154d..a9a173bbe2 100644 --- a/mods/d2k/rules/structures.yaml +++ b/mods/d2k/rules/structures.yaml @@ -426,7 +426,6 @@ CONCRETEB: TargetableBuilding: TargetTypes: Ground RenderBuildingWall: - HasMakeAnimation: false Image: walla EditorAppearance: RelativeToTopLeft: yes @@ -476,7 +475,6 @@ WALL: RenderRangeCircle: -RenderBuilding: RenderBuildingWall: - HasMakeAnimation: false BodyOrientation: QuantizedFacings: 32 WithTurret: @@ -528,7 +526,6 @@ WALL: RenderRangeCircle: -RenderBuilding: RenderBuildingWall: - HasMakeAnimation: false BodyOrientation: QuantizedFacings: 32 WithTurret: @@ -720,7 +717,6 @@ PALACEC: Footprint: xxx xxx Dimensions: 3,2 RenderBuilding: - HasMakeAnimation: false HEAVYC: Inherits: ^HEAVY diff --git a/mods/ra/rules/defaults.yaml b/mods/ra/rules/defaults.yaml index 0f5d0eac3d..9b9ae2bf28 100644 --- a/mods/ra/rules/defaults.yaml +++ b/mods/ra/rules/defaults.yaml @@ -274,6 +274,7 @@ DamagedSound: kaboom1.aud DestroyedSound: kaboom22.aud RenderBuilding: + WithMakeAnimation: WithBuildingExplosion: RepairableBuilding: EngineerRepairable: @@ -324,7 +325,6 @@ TargetableBuilding: TargetTypes: Ground, DetonateAttack RenderBuildingWall: - HasMakeAnimation: false Palette: terrain GivesExperience: EditorAppearance: @@ -352,6 +352,7 @@ Name: Civilian Building ProximityCaptor: Types: CivilianBuilding + -WithMakeAnimation: -AcceptsSupplies: -GivesBuildableArea: -Sellable: diff --git a/mods/ts/rules/defaults.yaml b/mods/ts/rules/defaults.yaml index 5c65dcfac7..1b1ebddacd 100644 --- a/mods/ts/rules/defaults.yaml +++ b/mods/ts/rules/defaults.yaml @@ -40,6 +40,7 @@ LuaScriptEvents: Demolishable: ScriptTriggers: + WithMakeAnimation: ^Wall: AppearsOnRadar: @@ -65,7 +66,6 @@ TargetableBuilding: TargetTypes: Ground, C4 RenderBuildingWall: - HasMakeAnimation: no GivesExperience: EditorAppearance: RelativeToTopLeft: yes