diff --git a/OpenRA.Game/Traits/Building.cs b/OpenRA.Game/Traits/Building.cs index b659ee42ae..570462204f 100644 --- a/OpenRA.Game/Traits/Building.cs +++ b/OpenRA.Game/Traits/Building.cs @@ -38,7 +38,7 @@ namespace OpenRA.Traits public object Create(ActorInitializer init) { return new Building(init); } } - public class Building : INotifyDamage, IResolveOrder, IRenderModifier, IOccupySpace + public class Building : INotifyDamage, IResolveOrder, IOccupySpace { readonly Actor self; public readonly BuildingInfo Info; @@ -47,11 +47,6 @@ namespace OpenRA.Traits readonly PowerManager PlayerPower; - public bool Disabled - { - get { return self.TraitsImplementing().Any(t => t.Disabled); } - } - public Building(ActorInitializer init) { this.self = init.self; @@ -99,16 +94,6 @@ namespace OpenRA.Traits } } - public IEnumerable ModifyRender(Actor self, IEnumerable r) - { - foreach (var a in r) - { - yield return a; - if (Disabled) - yield return a.WithPalette("disabled"); - } - } - public int2 TopLeft { get { return topLeft; } diff --git a/OpenRA.Game/Traits/Player/PowerManager.cs b/OpenRA.Game/Traits/Player/PowerManager.cs index f8fc78eafb..e3bc100476 100644 --- a/OpenRA.Game/Traits/Player/PowerManager.cs +++ b/OpenRA.Game/Traits/Player/PowerManager.cs @@ -26,7 +26,6 @@ namespace OpenRA.Traits PowerManagerInfo Info; Player Player; - Dictionary> Overrides = new Dictionary>(); Dictionary PowerDrain = new Dictionary(); [Sync] int totalProvided; public int PowerProvided { get { return totalProvided; } } @@ -67,9 +66,6 @@ namespace OpenRA.Traits totalDrained = 0; foreach (var kv in PowerDrain) { - if (Overrides.Keys.Contains(kv.Key)) - continue; - var p = kv.Value; if (p > 0) totalProvided += p; @@ -106,46 +102,6 @@ namespace OpenRA.Traits } } - // Force power down for power-down button, spy, emp, etc - public void Disable(Actor a, string key) - { - Game.Debug("Disabled {0}.{1}",a.Info.Name,key); - - if (Overrides.ContainsKey(a)) - { - if (Overrides[a].Contains(key)) - return; - - Overrides[a].Add(key); - } - else - Overrides.Add(a, new List() { key }); - - UpdateTotals(); - } - - public void RemoveDisable(Actor a, string key) - { - Game.Debug("Enabled {0}.{1}",a.Info.Name, key); - - if (!Overrides.ContainsKey(a) || !Overrides[a].Contains(key)) - return; - - Overrides[a].Remove(key); - if (Overrides[a].Count == 0) - Overrides.Remove(a); - - UpdateTotals(); - } - - public bool IsPowered(Actor a) - { - if (Overrides.ContainsKey(a)) - return false; - - return PowerProvided >= PowerDrained; - } - public PowerState GetPowerState() { if (PowerProvided >= PowerDrained) return PowerState.Normal; diff --git a/OpenRA.Game/Traits/Player/ProductionQueue.cs b/OpenRA.Game/Traits/Player/ProductionQueue.cs index 3c6fa50ffb..570268e1bc 100644 --- a/OpenRA.Game/Traits/Player/ProductionQueue.cs +++ b/OpenRA.Game/Traits/Player/ProductionQueue.cs @@ -222,8 +222,7 @@ namespace OpenRA.Traits protected static bool IsDisabledBuilding(Actor a) { - var building = a.TraitOrDefault(); - return building != null && building.Disabled; + return a.TraitsImplementing().Any(d => d.Disabled); } protected virtual void BuildUnit( string name ) diff --git a/OpenRA.Game/Traits/ProvidesRadar.cs b/OpenRA.Game/Traits/ProvidesRadar.cs index 10f1336e7d..20b428f8fd 100644 --- a/OpenRA.Game/Traits/ProvidesRadar.cs +++ b/OpenRA.Game/Traits/ProvidesRadar.cs @@ -23,8 +23,8 @@ namespace OpenRA.Traits bool UpdateActive(Actor self) { // Check if powered - var b = self.Trait(); - if (b.Disabled) return false; + if (self.TraitsImplementing().Any(d => d.Disabled)) + return false; var isJammed = self.World.Queries.WithTrait().Any(a => self.Owner != a.Actor.Owner && (self.Location - a.Actor.Location).Length < a.Actor.Info.Traits.Get().Range); diff --git a/OpenRA.Game/Traits/SupportPower.cs b/OpenRA.Game/Traits/SupportPower.cs index a4ea6cb78f..a886d434f8 100644 --- a/OpenRA.Game/Traits/SupportPower.cs +++ b/OpenRA.Game/Traits/SupportPower.cs @@ -104,8 +104,7 @@ namespace OpenRA.Traits // Takes 0.3ms on pchote's machine -- calling it every tick for every active special power is retarded var buildings = TechTree.GatherBuildings(Owner); - - return effectivePrereq.All(a => buildings[a].Any(b => !b.Trait().Disabled)); + return effectivePrereq.All(a => buildings[a].Any(b => !b.TraitsImplementing().All(d => d.Disabled))); } public void FinishActivate() diff --git a/OpenRA.Mods.RA/AttackTurreted.cs b/OpenRA.Mods.RA/AttackTurreted.cs index a9a7469ba0..35a4c6f195 100644 --- a/OpenRA.Mods.RA/AttackTurreted.cs +++ b/OpenRA.Mods.RA/AttackTurreted.cs @@ -11,6 +11,7 @@ using System; using OpenRA.Mods.RA.Activities; using OpenRA.Traits; +using System.Linq; namespace OpenRA.Mods.RA { @@ -45,7 +46,7 @@ namespace OpenRA.Mods.RA protected override void QueueAttack( Actor self, Order order ) { - if (self.HasTrait() && self.Trait().Disabled) + if (self.TraitsImplementing().Any(d => d.Disabled)) return; const int RangeTolerance = 1; /* how far inside our maximum range we should try to sit */ diff --git a/OpenRA.Mods.RA/CanPowerDown.cs b/OpenRA.Mods.RA/CanPowerDown.cs index db37aa5f83..f6c0049929 100755 --- a/OpenRA.Mods.RA/CanPowerDown.cs +++ b/OpenRA.Mods.RA/CanPowerDown.cs @@ -17,15 +17,17 @@ namespace OpenRA.Mods.RA public object Create(ActorInitializer init) { return new CanPowerDown(init); } } - public class CanPowerDown : IResolveOrder + public class CanPowerDown : IResolveOrder, IDisable { [Sync] bool disabled = false; - + int normalPower = 0; readonly PowerManager PlayerPower; + public CanPowerDown(ActorInitializer init) { PlayerPower = init.self.Owner.PlayerActor.Trait(); + normalPower = init.self.Info.Traits.Get().Power; } public bool Disabled { get { return disabled; } } @@ -37,10 +39,7 @@ namespace OpenRA.Mods.RA var eva = self.World.WorldActor.Info.Traits.Get(); Sound.PlayToPlayer(self.Owner, disabled ? eva.EnablePower : eva.DisablePower); - if (disabled) - PlayerPower.Disable(self, "PowerDown"); - else - PlayerPower.RemoveDisable(self, "PowerDown"); + PlayerPower.UpdateActor(self, disabled ? 0 : normalPower); } } } diff --git a/OpenRA.Mods.RA/Render/RenderBuilding.cs b/OpenRA.Mods.RA/Render/RenderBuilding.cs index cd95ffd35a..1eb5463d56 100644 --- a/OpenRA.Mods.RA/Render/RenderBuilding.cs +++ b/OpenRA.Mods.RA/Render/RenderBuilding.cs @@ -36,7 +36,14 @@ namespace OpenRA.Mods.RA.Render public IEnumerable ModifyRender(Actor self, IEnumerable r) { - return r.Select(a => a.WithPos(a.Pos - Origin)); + var disabled = self.TraitsImplementing().Any(d => d.Disabled); + foreach (var a in r) + { + var ret = a.WithPos(a.Pos - Origin); + yield return ret; + if (disabled) + yield return ret.WithPalette("disabled").WithZOffset(-1); + } } public RenderBuilding( ActorInitializer init, Func baseFacing ) diff --git a/OpenRA.Mods.RA/RequiresPower.cs b/OpenRA.Mods.RA/RequiresPower.cs index c1b5c2499c..7f22060571 100644 --- a/OpenRA.Mods.RA/RequiresPower.cs +++ b/OpenRA.Mods.RA/RequiresPower.cs @@ -29,7 +29,7 @@ namespace OpenRA.Mods.RA public bool Disabled { - get { return power.IsPowered(self); } + get { return power.PowerProvided < power.PowerDrained; } } } }