Further warhead streamlining.

This commit is contained in:
Paul Chote
2014-08-17 18:57:43 +12:00
parent 57ba1b54b4
commit 227a523878
5 changed files with 38 additions and 96 deletions

View File

@@ -43,36 +43,10 @@ namespace OpenRA.Mods.RA
if (previousSpread.Range > 0)
hitActors.Except(world.FindActorsInCircle(pos, previousSpread));
foreach (var victim in hitActors)
{
if (IsValidAgainst(victim, firedBy))
{
// TODO: Keep currentFactor as int from the start
var damage = GetDamageToInflict(victim, firedBy, damageModifiers.Append((int)(currentFactor * 100)));
victim.InflictDamage(firedBy, damage, this);
}
}
}
}
public override void DoImpact(Actor victim, Actor firedBy, IEnumerable<int> damageModifiers)
{
if (IsValidAgainst(victim, firedBy))
{
// TODO: Keep currentFactor as int from the start
var currentFactor = SpreadFactor[0];
var damage = GetDamageToInflict(victim, firedBy, damageModifiers.Append((int)(currentFactor * 100)));
victim.InflictDamage(firedBy, damage, this);
foreach (var victim in hitActors)
DoImpact(victim, firedBy, damageModifiers.Append((int)(currentFactor * 100)));
}
}
public int GetDamageToInflict(Actor target, Actor firedBy, IEnumerable<int> damageModifiers)
{
var healthInfo = target.Info.Traits.GetOrDefault<HealthInfo>();
if (healthInfo == null)
return 0;
return Util.ApplyPercentageModifiers(Damage, damageModifiers.Append(EffectivenessAgainst(target.Info)));
}
}
}

View File

@@ -36,26 +36,13 @@ namespace OpenRA.Mods.RA
public override void DoImpact(Actor victim, Actor firedBy, IEnumerable<int> damageModifiers)
{
if (IsValidAgainst(victim, firedBy))
{
var damage = GetDamageToInflict(victim, firedBy, damageModifiers);
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, this);
}
}
public float GetDamageToInflict(Actor target, Actor firedBy, IEnumerable<int> damageModifiers)
{
var healthInfo = target.Info.Traits.GetOrDefault<HealthInfo>();
var healthInfo = victim.Info.Traits.GetOrDefault<HealthInfo>();
if (healthInfo == null)
return 0;
return;
return Util.ApplyPercentageModifiers(Damage, damageModifiers.Append(EffectivenessAgainst(target.Info)));
// Damage is measured as a percentage of the target health
var damage = Util.ApplyPercentageModifiers(healthInfo.HP, damageModifiers.Append(Damage, DamageVersus(victim.Info)));
victim.InflictDamage(firedBy, damage, this);
}
}
}

View File

@@ -33,23 +33,5 @@ namespace OpenRA.Mods.RA
foreach (var victim in world.ActorMap.GetUnitsAt(t))
DoImpact(victim, firedBy, damageModifiers);
}
public override void DoImpact(Actor victim, Actor firedBy, IEnumerable<int> damageModifiers)
{
if (IsValidAgainst(victim, firedBy))
{
var damage = GetDamageToInflict(victim, firedBy, damageModifiers);
victim.InflictDamage(firedBy, damage, this);
}
}
public int GetDamageToInflict(Actor target, Actor firedBy, IEnumerable<int> damageModifiers)
{
var healthInfo = target.Info.Traits.GetOrDefault<HealthInfo>();
if (healthInfo == null)
return 0;
return Util.ApplyPercentageModifiers(Damage, damageModifiers.Append(EffectivenessAgainst(target.Info)));
}
}
}

View File

@@ -30,35 +30,21 @@ namespace OpenRA.Mods.RA
foreach (var victim in hitActors)
{
if (IsValidAgainst(victim, firedBy))
if (!IsValidAgainst(victim, firedBy))
continue;
var localModifiers = damageModifiers;
var healthInfo = victim.Info.Traits.GetOrDefault<HealthInfo>();
if (healthInfo != null)
{
var damage = (int)GetDamageToInflict(pos, victim, firedBy, damageModifiers);
victim.InflictDamage(firedBy, damage, this);
var distance = Math.Max(0, (victim.CenterPosition - pos).Length - healthInfo.Radius.Range);
localModifiers = localModifiers.Append((int)(100 * GetDamageFalloff(distance * 1f / Spread.Range)));
}
DoImpact(victim, firedBy, localModifiers);
}
}
public override void DoImpact(Actor victim, Actor firedBy, IEnumerable<int> damageModifiers)
{
if (IsValidAgainst(victim, firedBy))
{
var damage = GetDamageToInflict(victim.CenterPosition, victim, firedBy, damageModifiers);
victim.InflictDamage(firedBy, damage, this);
}
}
public int GetDamageToInflict(WPos pos, Actor target, Actor firedBy, IEnumerable<int> damageModifiers)
{
var healthInfo = target.Info.Traits.GetOrDefault<HealthInfo>();
if (healthInfo == null)
return 0;
var distance = Math.Max(0, (target.CenterPosition - pos).Length - healthInfo.Radius.Range);
var falloff = (int)(100 * GetDamageFalloff(distance * 1f / Spread.Range));
return Util.ApplyPercentageModifiers(Damage, damageModifiers.Append(EffectivenessAgainst(target.Info), falloff));
}
static readonly float[] falloff =
{
1f, 0.3678795f, 0.1353353f, 0.04978707f,