Merge pull request #4114 from ScottNZ/madtank

Fix MAD Tank damage model
This commit is contained in:
Paul Chote
2013-11-10 00:52:45 -08:00
3 changed files with 20 additions and 8 deletions

View File

@@ -47,8 +47,6 @@ namespace OpenRA.GameRules
public readonly DamageModel DamageModel = DamageModel.Normal; public readonly DamageModel DamageModel = DamageModel.Normal;
[Desc("Whether we should prevent prone response for infantry.")] [Desc("Whether we should prevent prone response for infantry.")]
public readonly bool PreventProne = false; 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) public float EffectivenessAgainst(ActorInfo ai)
{ {
@@ -83,6 +81,7 @@ namespace OpenRA.GameRules
{ {
Normal, // classic RA damage model: point actors, distance-based falloff Normal, // classic RA damage model: point actors, distance-based falloff
PerCell, // like RA's "nuke damage" PerCell, // like RA's "nuke damage"
HealthPercentage // for MAD Tank
} }
public class ProjectileArgs public class ProjectileArgs

View File

@@ -122,6 +122,23 @@ namespace OpenRA.Mods.RA
unit.InflictDamage(firedBy, damage, warhead); unit.InflictDamage(firedBy, damage, warhead);
} }
} break; } 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<HealthInfo>();
damage = (float)(damage / 100 * healthInfo.HP);
}
victim.InflictDamage(firedBy, (int)damage, warhead);
}
} break;
} }
} }
@@ -174,8 +191,6 @@ namespace OpenRA.Mods.RA
return 0; return 0;
var rawDamage = (float)warhead.Damage; var rawDamage = (float)warhead.Damage;
if (warhead.ScaleDamageByTargetHealth)
rawDamage = (float)(rawDamage / 100 * healthInfo.HP);
if (withFalloff) if (withFalloff)
{ {
var distance = (int)Math.Max(0, (target.CenterPosition - pos).Length * Game.CellSize / 1024 - healthInfo.Radius); var distance = (int)Math.Max(0, (target.CenterPosition - pos).Length * Game.CellSize / 1024 - healthInfo.Radius);

View File

@@ -1332,9 +1332,8 @@ Mandible:
MADTankThump: MADTankThump:
InvalidTargets: MADTank InvalidTargets: MADTank
Warhead: Warhead:
DamageModel: PerCell DamageModel: HealthPercentage
Damage: 1 Damage: 1
ScaleDamageByTargetHealth: True
Versus: Versus:
None: 0% None: 0%
Size: 7,6 Size: 7,6
@@ -1342,9 +1341,8 @@ MADTankThump:
MADTankDetonate: MADTankDetonate:
InvalidTargets: MADTank InvalidTargets: MADTank
Warhead: Warhead:
DamageModel: PerCell DamageModel: HealthPercentage
Damage: 19 Damage: 19
ScaleDamageByTargetHealth: True
Versus: Versus:
None: 0% None: 0%
Size: 7,6 Size: 7,6