Further warhead streamlining.
This commit is contained in:
@@ -42,19 +42,27 @@ namespace OpenRA.GameRules
|
|||||||
: new Dictionary<string, float>();
|
: new Dictionary<string, float>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int DamageVersus(ActorInfo victim)
|
||||||
|
{
|
||||||
|
var armor = victim.Traits.GetOrDefault<ArmorInfo>();
|
||||||
|
if (armor == null || armor.Type == null)
|
||||||
|
return 100;
|
||||||
|
|
||||||
|
// TODO: Change versus definitions to integer percentages
|
||||||
|
float versus;
|
||||||
|
if (Versus.TryGetValue(armor.Type, out versus))
|
||||||
|
return (int)(versus * 100);
|
||||||
|
|
||||||
|
return 100;
|
||||||
|
}
|
||||||
|
|
||||||
public override int EffectivenessAgainst(ActorInfo ai)
|
public override int EffectivenessAgainst(ActorInfo ai)
|
||||||
{
|
{
|
||||||
var health = ai.Traits.GetOrDefault<HealthInfo>();
|
var health = ai.Traits.GetOrDefault<HealthInfo>();
|
||||||
if (health == null)
|
if (health == null)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
var armor = ai.Traits.GetOrDefault<ArmorInfo>();
|
return DamageVersus(ai);
|
||||||
if (armor == null || armor.Type == null)
|
|
||||||
return 100;
|
|
||||||
|
|
||||||
// TODO: Change versus definitions to integer percentages
|
|
||||||
float versus;
|
|
||||||
return Versus.TryGetValue(armor.Type, out versus) ? (int)(versus * 100) : 100;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void DoImpact(Target target, Actor firedBy, IEnumerable<int> damageModifiers)
|
public override void DoImpact(Target target, Actor firedBy, IEnumerable<int> damageModifiers)
|
||||||
@@ -66,7 +74,12 @@ namespace OpenRA.GameRules
|
|||||||
DoImpact(target.CenterPosition, firedBy, damageModifiers);
|
DoImpact(target.CenterPosition, firedBy, damageModifiers);
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract void DoImpact(Actor target, Actor firedBy, IEnumerable<int> damageModifiers);
|
|
||||||
public abstract void DoImpact(WPos pos, Actor firedBy, IEnumerable<int> damageModifiers);
|
public abstract void DoImpact(WPos pos, Actor firedBy, IEnumerable<int> damageModifiers);
|
||||||
|
|
||||||
|
public virtual void DoImpact(Actor victim, Actor firedBy, IEnumerable<int> damageModifiers)
|
||||||
|
{
|
||||||
|
var damage = Util.ApplyPercentageModifiers(Damage, damageModifiers.Append(DamageVersus(victim.Info)));
|
||||||
|
victim.InflictDamage(firedBy, damage, this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,36 +43,10 @@ namespace OpenRA.Mods.RA
|
|||||||
if (previousSpread.Range > 0)
|
if (previousSpread.Range > 0)
|
||||||
hitActors.Except(world.FindActorsInCircle(pos, previousSpread));
|
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
|
// TODO: Keep currentFactor as int from the start
|
||||||
var currentFactor = SpreadFactor[0];
|
foreach (var victim in hitActors)
|
||||||
var damage = GetDamageToInflict(victim, firedBy, damageModifiers.Append((int)(currentFactor * 100)));
|
DoImpact(victim, firedBy, damageModifiers.Append((int)(currentFactor * 100)));
|
||||||
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)));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,26 +36,13 @@ namespace OpenRA.Mods.RA
|
|||||||
|
|
||||||
public override void DoImpact(Actor victim, Actor firedBy, IEnumerable<int> damageModifiers)
|
public override void DoImpact(Actor victim, Actor firedBy, IEnumerable<int> damageModifiers)
|
||||||
{
|
{
|
||||||
if (IsValidAgainst(victim, firedBy))
|
var healthInfo = victim.Info.Traits.GetOrDefault<HealthInfo>();
|
||||||
{
|
|
||||||
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>();
|
|
||||||
if (healthInfo == null)
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,23 +33,5 @@ namespace OpenRA.Mods.RA
|
|||||||
foreach (var victim in world.ActorMap.GetUnitsAt(t))
|
foreach (var victim in world.ActorMap.GetUnitsAt(t))
|
||||||
DoImpact(victim, firedBy, damageModifiers);
|
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)));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,35 +30,21 @@ namespace OpenRA.Mods.RA
|
|||||||
|
|
||||||
foreach (var victim in hitActors)
|
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);
|
var distance = Math.Max(0, (victim.CenterPosition - pos).Length - healthInfo.Radius.Range);
|
||||||
victim.InflictDamage(firedBy, damage, this);
|
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 =
|
static readonly float[] falloff =
|
||||||
{
|
{
|
||||||
1f, 0.3678795f, 0.1353353f, 0.04978707f,
|
1f, 0.3678795f, 0.1353353f, 0.04978707f,
|
||||||
|
|||||||
Reference in New Issue
Block a user