From 98ac5a036f68ef1a29133d3b17eaed7c796b96cf Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Fri, 30 Jul 2010 01:22:41 +1200 Subject: [PATCH] Add an `Undamaged' damagestate to simplify things related to healing. --- OpenRA.Game/Traits/Health.cs | 13 +++++++++++-- OpenRA.Game/Traits/RepairableBuilding.cs | 2 +- OpenRA.Mods.RA/Activities/Repair.cs | 2 +- OpenRA.Mods.RA/Activities/RepairBuilding.cs | 2 +- OpenRA.Mods.RA/AttackBase.cs | 6 +----- OpenRA.Mods.RA/AutoHeal.cs | 6 +++--- OpenRA.Mods.RA/EngineerRepair.cs | 16 +++++----------- OpenRA.Mods.RA/Orders/RepairOrderGenerator.cs | 5 ++--- OpenRA.Mods.RA/Repairable.cs | 2 +- OpenRA.Mods.RA/RepairableNear.cs | 2 +- 10 files changed, 27 insertions(+), 29 deletions(-) diff --git a/OpenRA.Game/Traits/Health.cs b/OpenRA.Game/Traits/Health.cs index 6f254564b8..518fb4098b 100644 --- a/OpenRA.Game/Traits/Health.cs +++ b/OpenRA.Game/Traits/Health.cs @@ -26,7 +26,7 @@ namespace OpenRA.Traits public virtual object Create(ActorInitializer init) { return new Health(init, this); } } - public enum ExtendedDamageState { Normal, ThreeQuarter, Half, Quarter, Dead }; + public enum ExtendedDamageState { Undamaged, Normal, ThreeQuarter, Half, Quarter, Dead }; public class Health { @@ -78,7 +78,10 @@ namespace OpenRA.Traits if (hp < MaxHP * 0.75f) return ExtendedDamageState.ThreeQuarter; - + + if (hp == MaxHP) + return ExtendedDamageState.Undamaged; + return ExtendedDamageState.Normal; } } @@ -155,6 +158,12 @@ namespace OpenRA.Traits return (health == null) ? DamageState.Normal : health.DamageState; } + public static ExtendedDamageState GetExtendedDamageState(this Actor self) + { + var health = self.traits.GetOrDefault(); + return (health == null) ? ExtendedDamageState.Undamaged : health.ExtendedDamageState; + } + public static void InflictDamage(this Actor self, Actor attacker, int damage, WarheadInfo warhead) { var health = self.traits.GetOrDefault(); diff --git a/OpenRA.Game/Traits/RepairableBuilding.cs b/OpenRA.Game/Traits/RepairableBuilding.cs index c3db7e5eac..ea6736a59c 100644 --- a/OpenRA.Game/Traits/RepairableBuilding.cs +++ b/OpenRA.Game/Traits/RepairableBuilding.cs @@ -68,7 +68,7 @@ namespace OpenRA.Traits self.World.AddFrameEndTask(w => w.Add(new RepairIndicator(self))); self.InflictDamage(self, -hpToRepair, null); - if (Health.HP == Health.MaxHP) + if (Health.ExtendedDamageState == ExtendedDamageState.Undamaged) { isRepairing = false; return; diff --git a/OpenRA.Mods.RA/Activities/Repair.cs b/OpenRA.Mods.RA/Activities/Repair.cs index 4c3895bd81..ce1e615029 100644 --- a/OpenRA.Mods.RA/Activities/Repair.cs +++ b/OpenRA.Mods.RA/Activities/Repair.cs @@ -43,7 +43,7 @@ namespace OpenRA.Mods.RA.Activities } self.InflictDamage(self, -hpToRepair, null); - if (health.MaxHP == health.HP) + if (health.ExtendedDamageState == ExtendedDamageState.Undamaged) return NextActivity; if (host != null) diff --git a/OpenRA.Mods.RA/Activities/RepairBuilding.cs b/OpenRA.Mods.RA/Activities/RepairBuilding.cs index 95b07f1d99..d5d2400d69 100644 --- a/OpenRA.Mods.RA/Activities/RepairBuilding.cs +++ b/OpenRA.Mods.RA/Activities/RepairBuilding.cs @@ -24,7 +24,7 @@ namespace OpenRA.Mods.RA.Activities { if (target == null || target.IsDead()) return NextActivity; var health = target.traits.Get(); - if (health.HP == health.MaxHP) + if (health.ExtendedDamageState == ExtendedDamageState.Undamaged) return NextActivity; target.InflictDamage(self, -health.MaxHP, null); diff --git a/OpenRA.Mods.RA/AttackBase.cs b/OpenRA.Mods.RA/AttackBase.cs index 4ce8193d37..0ccedbfc7e 100755 --- a/OpenRA.Mods.RA/AttackBase.cs +++ b/OpenRA.Mods.RA/AttackBase.cs @@ -222,12 +222,8 @@ namespace OpenRA.Mods.RA // unless forced, only heal allies. if (self.Owner.Stances[underCursor.Owner] != Stance.Ally && !forceFire) return null; - // we can only heal actors with health - var health = underCursor.traits.GetOrDefault(); - if (health == null) return null; - // don't allow healing of fully-healed stuff! - if (health.HP >= health.MaxHP) return null; + if (underCursor.GetExtendedDamageState() == ExtendedDamageState.Undamaged) return null; } else { diff --git a/OpenRA.Mods.RA/AutoHeal.cs b/OpenRA.Mods.RA/AutoHeal.cs index 9a0e1defb5..8be135520a 100644 --- a/OpenRA.Mods.RA/AutoHeal.cs +++ b/OpenRA.Mods.RA/AutoHeal.cs @@ -38,8 +38,8 @@ namespace OpenRA.Mods.RA if ((attack.target.CenterLocation - self.Location).LengthSquared > range * range + 2) return true; // wandered off faster than we could follow - var health = attack.target.Actor.traits.GetOrDefault(); - if (attack.target.IsActor && health.HP == health.MaxHP) + if (attack.target.IsActor + && attack.target.Actor.GetExtendedDamageState() == ExtendedDamageState.Undamaged) return true; // fully healed return false; @@ -60,7 +60,7 @@ namespace OpenRA.Mods.RA return inRange .Where(a => a != self && self.Owner.Stances[ a.Owner ] == Stance.Ally) .Where(a => Combat.HasAnyValidWeapons(self, Target.FromActor(a))) - .Where(a => a.traits.Contains() && a.traits.Get().HPFraction < 1f) + .Where(a => a.traits.Contains() && a.GetExtendedDamageState() != ExtendedDamageState.Undamaged) .OrderBy(a => (a.Location - self.Location).LengthSquared) .FirstOrDefault(); } diff --git a/OpenRA.Mods.RA/EngineerRepair.cs b/OpenRA.Mods.RA/EngineerRepair.cs index e5ac591150..03a066255b 100644 --- a/OpenRA.Mods.RA/EngineerRepair.cs +++ b/OpenRA.Mods.RA/EngineerRepair.cs @@ -39,25 +39,19 @@ namespace OpenRA.Mods.RA { if (order.OrderString != "EngineerRepair") return null; if (order.TargetActor == null) return null; - var health = order.TargetActor.traits.GetOrDefault(); - if (health == null) return null; - return (health.HP == health.MaxHP) ? "goldwrench-blocked" : "goldwrench"; + return (order.TargetActor.GetExtendedDamageState() == ExtendedDamageState.Undamaged) ? "goldwrench-blocked" : "goldwrench"; } public string VoicePhraseForOrder(Actor self, Order order) { - var health = order.TargetActor.traits.GetOrDefault(); - if (health == null) return null; - return (order.OrderString == "EngineerRepair" - && health.HP < health.MaxHP) ? "Attack" : null; + return (order.OrderString == "EngineerRepair" + && order.TargetActor.GetExtendedDamageState() != ExtendedDamageState.Undamaged) ? "Attack" : null; } public void ResolveOrder(Actor self, Order order) { - var health = order.TargetActor.traits.GetOrDefault(); - if (health == null) return; - - if (order.OrderString == "EngineerRepair" && health.HP < health.MaxHP) + if (order.OrderString == "EngineerRepair" + && order.TargetActor.GetExtendedDamageState() != ExtendedDamageState.Undamaged) { if (self.Owner == self.World.LocalPlayer) self.World.AddFrameEndTask(w => diff --git a/OpenRA.Mods.RA/Orders/RepairOrderGenerator.cs b/OpenRA.Mods.RA/Orders/RepairOrderGenerator.cs index 100e40ed75..c38a720a0d 100755 --- a/OpenRA.Mods.RA/Orders/RepairOrderGenerator.cs +++ b/OpenRA.Mods.RA/Orders/RepairOrderGenerator.cs @@ -34,9 +34,8 @@ namespace OpenRA.Mods.RA.Orders if (underCursor == null) yield break; - var health = underCursor.traits.GetOrDefault(); - var repairable = health != null && underCursor.Info.Traits.Contains(); - if (repairable && health.HPFraction < 1f) + if (underCursor.Info.Traits.Contains() + && underCursor.GetExtendedDamageState() != ExtendedDamageState.Undamaged) yield return new Order("Repair", underCursor); } } diff --git a/OpenRA.Mods.RA/Repairable.cs b/OpenRA.Mods.RA/Repairable.cs index 1c41ca210d..b50f92d349 100644 --- a/OpenRA.Mods.RA/Repairable.cs +++ b/OpenRA.Mods.RA/Repairable.cs @@ -46,7 +46,7 @@ namespace OpenRA.Mods.RA bool CanRepair(Actor self) { var li = self.traits.GetOrDefault(); - return (Health.HPFraction < 1f || (li != null && !li.FullAmmo()) ); + return (Health.ExtendedDamageState != ExtendedDamageState.Undamaged || (li != null && !li.FullAmmo()) ); } public string CursorForOrder(Actor self, Order order) diff --git a/OpenRA.Mods.RA/RepairableNear.cs b/OpenRA.Mods.RA/RepairableNear.cs index 41cba62382..c49afce54d 100644 --- a/OpenRA.Mods.RA/RepairableNear.cs +++ b/OpenRA.Mods.RA/RepairableNear.cs @@ -31,7 +31,7 @@ namespace OpenRA.Mods.RA if (underCursor.Owner == self.Owner && self.Info.Traits.Get().Buildings.Contains( underCursor.Info.Name ) && - self.traits.Get().HPFraction < 1f) + self.GetExtendedDamageState() != ExtendedDamageState.Undamaged) return new Order("Enter", self, underCursor); return null;