From 1aebf27abda18df4934f11e8ec13f968a2b89dc5 Mon Sep 17 00:00:00 2001 From: ScottNZ Date: Sun, 10 Nov 2013 21:38:48 +1300 Subject: [PATCH] Create a new damage model for the MAD Tank. Fixes #4105 --- OpenRA.Game/GameRules/WeaponInfo.cs | 3 +-- OpenRA.Mods.RA/Combat.cs | 19 +++++++++++++++++-- mods/ra/weapons.yaml | 6 ++---- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/OpenRA.Game/GameRules/WeaponInfo.cs b/OpenRA.Game/GameRules/WeaponInfo.cs index f6dff5861a..be1f0b5e1f 100644 --- a/OpenRA.Game/GameRules/WeaponInfo.cs +++ b/OpenRA.Game/GameRules/WeaponInfo.cs @@ -47,8 +47,6 @@ namespace OpenRA.GameRules public readonly DamageModel DamageModel = DamageModel.Normal; [Desc("Whether we should prevent prone response for infantry.")] public readonly bool PreventProne = false; - [Desc("Whether to use the provided Damage value as a maximum health percentage.")] - public readonly bool ScaleDamageByTargetHealth = false; public float EffectivenessAgainst(ActorInfo ai) { @@ -83,6 +81,7 @@ namespace OpenRA.GameRules { Normal, // classic RA damage model: point actors, distance-based falloff PerCell, // like RA's "nuke damage" + HealthPercentage // for MAD Tank } public class ProjectileArgs diff --git a/OpenRA.Mods.RA/Combat.cs b/OpenRA.Mods.RA/Combat.cs index b327278fe5..7585a02bd6 100755 --- a/OpenRA.Mods.RA/Combat.cs +++ b/OpenRA.Mods.RA/Combat.cs @@ -122,6 +122,23 @@ namespace OpenRA.Mods.RA unit.InflictDamage(firedBy, damage, warhead); } } break; + + case DamageModel.HealthPercentage: + { + var range = new WRange(warhead.Size[0] * 1024); + var hitActors = world.FindActorsInCircle(pos, range); + + foreach (var victim in hitActors) + { + var damage = GetDamageToInflict(pos, victim, warhead, weapon, firepowerModifier, false); + if (damage != 0) // will be 0 if the target doesn't have HealthInfo + { + var healthInfo = victim.Info.Traits.Get(); + damage = (float)(damage / 100 * healthInfo.HP); + } + victim.InflictDamage(firedBy, (int)damage, warhead); + } + } break; } } @@ -174,8 +191,6 @@ namespace OpenRA.Mods.RA return 0; var rawDamage = (float)warhead.Damage; - if (warhead.ScaleDamageByTargetHealth) - rawDamage = (float)(rawDamage / 100 * healthInfo.HP); if (withFalloff) { var distance = (int)Math.Max(0, (target.CenterPosition - pos).Length * Game.CellSize / 1024 - healthInfo.Radius); diff --git a/mods/ra/weapons.yaml b/mods/ra/weapons.yaml index ef5f841e74..cd46ebfcfd 100644 --- a/mods/ra/weapons.yaml +++ b/mods/ra/weapons.yaml @@ -1331,9 +1331,8 @@ Mandible: MADTankThump: InvalidTargets: MADTank Warhead: - DamageModel: PerCell + DamageModel: HealthPercentage Damage: 1 - ScaleDamageByTargetHealth: True Versus: None: 0% Size: 7,6 @@ -1341,9 +1340,8 @@ MADTankThump: MADTankDetonate: InvalidTargets: MADTank Warhead: - DamageModel: PerCell + DamageModel: HealthPercentage Damage: 19 - ScaleDamageByTargetHealth: True Versus: None: 0% Size: 7,6