Convert weapon plumbing to use integer damage modifiers.

This commit is contained in:
Paul Chote
2014-08-17 17:33:50 +12:00
parent 8e8e02dae8
commit 57ba1b54b4
27 changed files with 75 additions and 75 deletions

View File

@@ -8,6 +8,7 @@
*/
#endregion
using System.Linq;
using OpenRA.GameRules;
using OpenRA.Traits;
@@ -54,7 +55,7 @@ namespace OpenRA.Mods.RA.Air
if (info.Explosion != null)
{
var weapon = self.World.Map.Rules.Weapons[info.Explosion.ToLowerInvariant()];
weapon.Impact(self.CenterPosition, self, 1f);
weapon.Impact(self.CenterPosition, self, Enumerable.Empty<int>());
}
self.Destroy();

View File

@@ -154,10 +154,8 @@ namespace OpenRA.Mods.RA
Weapon = Weapon,
Facing = legacyFacing,
// TODO: Convert to ints
FirepowerModifier = self.TraitsImplementing<IFirepowerModifier>()
.Select(a => a.GetFirepowerModifier() / 100f)
.Product(),
DamageModifiers = self.TraitsImplementing<IFirepowerModifier>()
.Select(a => a.GetFirepowerModifier()),
Source = muzzlePosition,
SourceActor = self,

View File

@@ -299,7 +299,7 @@ namespace OpenRA.Mods.RA
self.World.AddFrameEndTask(w =>
{
var weapon = saboteur.World.Map.Rules.Weapons[Info.DemolishWeapon.ToLowerInvariant()];
weapon.Impact(self.CenterPosition, saboteur, 1f);
weapon.Impact(self.CenterPosition, saboteur, Enumerable.Empty<int>());
self.World.WorldActor.Trait<ScreenShaker>().AddEffect(15, self.CenterPosition, 6);
self.Kill(saboteur);
});

View File

@@ -8,6 +8,7 @@
*/
#endregion
using System.Linq;
using OpenRA.GameRules;
using OpenRA.Traits;
@@ -30,7 +31,7 @@ namespace OpenRA.Mods.RA
public override void Activate(Actor collector)
{
var weapon = self.World.Map.Rules.Weapons[((ExplodeCrateActionInfo)info).Weapon.ToLowerInvariant()];
weapon.Impact(collector.CenterPosition, self, 1f);
weapon.Impact(collector.CenterPosition, self, Enumerable.Empty<int>());
base.Activate(collector);
}
}

View File

@@ -172,7 +172,7 @@ namespace OpenRA.Mods.RA.Effects
world.AddFrameEndTask(w => w.Remove(this));
args.Weapon.Impact(pos, args.SourceActor, args.FirepowerModifier);
args.Weapon.Impact(pos, args.SourceActor, args.DamageModifiers);
}
}
}

View File

@@ -56,7 +56,7 @@ namespace OpenRA.Mods.RA.Effects
{
pos += new WVec(0, 0, args.PassiveTarget.Z - pos.Z);
world.AddFrameEndTask(w => w.Remove(this));
args.Weapon.Impact(pos, args.SourceActor, args.FirepowerModifier);
args.Weapon.Impact(pos, args.SourceActor, args.DamageModifiers);
}
anim.Tick();

View File

@@ -69,7 +69,7 @@ namespace OpenRA.Mods.RA.Effects
if (hitanim != null)
hitanim.PlayThen("idle", () => animationComplete = true);
args.Weapon.Impact(target, args.SourceActor, args.FirepowerModifier);
args.Weapon.Impact(target, args.SourceActor, args.DamageModifiers);
doneDamage = true;
}

View File

@@ -180,7 +180,7 @@ namespace OpenRA.Mods.RA.Effects
if (ticks <= info.Arm)
return;
args.Weapon.Impact(pos, args.SourceActor, args.FirepowerModifier);
args.Weapon.Impact(pos, args.SourceActor, args.DamageModifiers);
}
public IEnumerable<IRenderable> Render(WorldRenderer wr)

View File

@@ -81,7 +81,7 @@ namespace OpenRA.Mods.RA.Effects
{
world.AddFrameEndTask(w => w.Remove(this));
var weapon = world.Map.Rules.Weapons[this.weapon.ToLowerInvariant()];
weapon.Impact(pos, firedBy.PlayerActor, 1f);
weapon.Impact(pos, firedBy.PlayerActor, Enumerable.Empty<int>());
world.WorldActor.Trait<ScreenShaker>().AddEffect(20, pos, 5);
foreach (var a in world.ActorsWithTrait<NukePaletteEffect>())

View File

@@ -47,7 +47,7 @@ namespace OpenRA.Mods.RA.Effects
if (!doneDamage)
{
var pos = Args.GuidedTarget.IsValidFor(Args.SourceActor) ? Args.GuidedTarget.CenterPosition : Args.PassiveTarget;
Args.Weapon.Impact(pos, Args.SourceActor, Args.FirepowerModifier);
Args.Weapon.Impact(pos, Args.SourceActor, Args.DamageModifiers);
doneDamage = true;
}
}

View File

@@ -51,7 +51,7 @@ namespace OpenRA.Mods.RA
if (weapon.Report != null && weapon.Report.Any())
Sound.Play(weapon.Report.Random(e.Attacker.World.SharedRandom), self.CenterPosition);
weapon.Impact(self.CenterPosition, e.Attacker, 1f);
weapon.Impact(self.CenterPosition, e.Attacker, Enumerable.Empty<int>());
}
}

View File

@@ -10,6 +10,7 @@
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using OpenRA.GameRules;
using OpenRA.Mods.RA.Activities;
using OpenRA.Mods.RA.Move;
@@ -71,7 +72,7 @@ namespace OpenRA.Mods.RA
if (info.ThumpDamageWeapon != null)
{
var weapon = self.World.Map.Rules.Weapons[info.ThumpDamageWeapon.ToLowerInvariant()];
weapon.Impact(self.CenterPosition, self, 1f);
weapon.Impact(self.CenterPosition, self, Enumerable.Empty<int>());
}
screenShaker.AddEffect(info.ThumpShakeTime, self.CenterPosition, info.ThumpShakeIntensity, info.ThumpShakeMultiplier);
tick = 0;
@@ -110,7 +111,7 @@ namespace OpenRA.Mods.RA
if (info.DetonationWeapon != null)
{
var weapon = self.World.Map.Rules.Weapons[info.DetonationWeapon.ToLowerInvariant()];
weapon.Impact(self.CenterPosition, self, 1f);
weapon.Impact(self.CenterPosition, self, Enumerable.Empty<int>());
}
self.Kill(self);
});

View File

@@ -25,7 +25,7 @@ namespace OpenRA.Mods.RA
[Desc("What factor to multiply the Damage by for this spread range.", "Each factor specified must have an associated Spread defined.")]
public readonly float[] SpreadFactor = { 1f };
public override void DoImpact(WPos pos, Actor firedBy, float firepowerModifier)
public override void DoImpact(WPos pos, Actor firedBy, IEnumerable<int> damageModifiers)
{
var world = firedBy.World;
@@ -44,33 +44,35 @@ namespace OpenRA.Mods.RA
hitActors.Except(world.FindActorsInCircle(pos, previousSpread));
foreach (var victim in hitActors)
{
if (IsValidAgainst(victim, firedBy))
{
var damage = GetDamageToInflict(victim, firedBy, firepowerModifier * currentFactor);
// 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, float firepowerModifier)
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 = (int)GetDamageToInflict(victim, firedBy, firepowerModifier * currentFactor);
var damage = GetDamageToInflict(victim, firedBy, damageModifiers.Append((int)(currentFactor * 100)));
victim.InflictDamage(firedBy, damage, this);
}
}
public int GetDamageToInflict(Actor target, Actor firedBy, float modifier)
public int GetDamageToInflict(Actor target, Actor firedBy, IEnumerable<int> damageModifiers)
{
var healthInfo = target.Info.Traits.GetOrDefault<HealthInfo>();
if (healthInfo == null)
return 0;
var rawDamage = (float)Damage;
return (int)(rawDamage * modifier * EffectivenessAgainst(target.Info));
return Util.ApplyPercentageModifiers(Damage, damageModifiers.Append(EffectivenessAgainst(target.Info)));
}
}
}

View File

@@ -74,7 +74,7 @@ namespace OpenRA.Mods.RA
return false;
}
public override void DoImpact(Target target, Actor firedBy, float firepowerModifier)
public override void DoImpact(Target target, Actor firedBy, IEnumerable<int> damageModifiers)
{
var pos = target.CenterPosition;
var world = firedBy.World;

View File

@@ -26,7 +26,7 @@ namespace OpenRA.Mods.RA
// TODO: Allow maximum resource splatter to be defined. (Per tile, and in total).
public override void DoImpact(Target target, Actor firedBy, float firepowerModifier)
public override void DoImpact(Target target, Actor firedBy, IEnumerable<int> damageModifiers)
{
if (string.IsNullOrEmpty(AddsResourceType))
return;

View File

@@ -23,7 +23,7 @@ namespace OpenRA.Mods.RA
// TODO: Allow maximum resource removal to be defined. (Per tile, and in total).
public override void DoImpact(Target target, Actor firedBy, float firepowerModifier)
public override void DoImpact(Target target, Actor firedBy, IEnumerable<int> damageModifiers)
{
var world = firedBy.World;
var targetTile = world.Map.CellContaining(target.CenterPosition);

View File

@@ -22,7 +22,7 @@ namespace OpenRA.Mods.RA
[Desc("Size of the area. Damage will be applied to this area.", "If two spreads are defined, the area of effect is a ring, where the second value is the inner radius.")]
public readonly WRange[] Spread = { new WRange(43), WRange.Zero };
public override void DoImpact(WPos pos, Actor firedBy, float firepowerModifier)
public override void DoImpact(WPos pos, Actor firedBy, IEnumerable<int> damageModifiers)
{
var world = firedBy.World;
var range = Spread[0];
@@ -31,14 +31,14 @@ namespace OpenRA.Mods.RA
hitActors.Except(world.FindActorsInCircle(pos, Spread[1]));
foreach (var victim in hitActors)
DoImpact(victim, firedBy, firepowerModifier);
DoImpact(victim, firedBy, damageModifiers);
}
public override void DoImpact(Actor victim, Actor firedBy, float firepowerModifier)
public override void DoImpact(Actor victim, Actor firedBy, IEnumerable<int> damageModifiers)
{
if (IsValidAgainst(victim, firedBy))
{
var damage = GetDamageToInflict(victim, firedBy, firepowerModifier);
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>();
@@ -49,15 +49,13 @@ namespace OpenRA.Mods.RA
}
}
public float GetDamageToInflict(Actor target, Actor firedBy, float modifier)
public float GetDamageToInflict(Actor target, Actor firedBy, IEnumerable<int> damageModifiers)
{
var healthInfo = target.Info.Traits.GetOrDefault<HealthInfo>();
if (healthInfo == null)
return 0;
var rawDamage = (float)Damage;
return rawDamage * modifier * EffectivenessAgainst(target.Info);
return Util.ApplyPercentageModifiers(Damage, damageModifiers.Append(EffectivenessAgainst(target.Info)));
}
}
}

View File

@@ -25,7 +25,7 @@ namespace OpenRA.Mods.RA
[Desc("Type of smudge to apply to terrain.")]
public readonly string[] SmudgeType = { };
public override void DoImpact(Target target, Actor firedBy, float firepowerModifier)
public override void DoImpact(Target target, Actor firedBy, IEnumerable<int> damageModifiers)
{
var world = firedBy.World;
var targetTile = world.Map.CellContaining(target.CenterPosition);

View File

@@ -22,7 +22,7 @@ namespace OpenRA.Mods.RA
[Desc("Size of the area. Damage will be applied to this area.")]
public readonly int[] Size = { 0, 0 };
public override void DoImpact(WPos pos, Actor firedBy, float firepowerModifier)
public override void DoImpact(WPos pos, Actor firedBy, IEnumerable<int> damageModifiers)
{
var world = firedBy.World;
var targetTile = world.Map.CellContaining(pos);
@@ -31,27 +31,25 @@ namespace OpenRA.Mods.RA
foreach (var t in affectedTiles)
foreach (var victim in world.ActorMap.GetUnitsAt(t))
DoImpact(victim, firedBy, firepowerModifier);
DoImpact(victim, firedBy, damageModifiers);
}
public override void DoImpact(Actor victim, Actor firedBy, float firepowerModifier)
public override void DoImpact(Actor victim, Actor firedBy, IEnumerable<int> damageModifiers)
{
if (IsValidAgainst(victim, firedBy))
{
var damage = GetDamageToInflict(victim, firedBy, firepowerModifier);
var damage = GetDamageToInflict(victim, firedBy, damageModifiers);
victim.InflictDamage(firedBy, damage, this);
}
}
public int GetDamageToInflict(Actor target, Actor firedBy, float modifier)
public int GetDamageToInflict(Actor target, Actor firedBy, IEnumerable<int> damageModifiers)
{
var healthInfo = target.Info.Traits.GetOrDefault<HealthInfo>();
if (healthInfo == null)
return 0;
var rawDamage = (float)Damage;
return (int)(rawDamage * modifier * EffectivenessAgainst(target.Info));
return Util.ApplyPercentageModifiers(Damage, damageModifiers.Append(EffectivenessAgainst(target.Info)));
}
}
}

View File

@@ -22,40 +22,41 @@ namespace OpenRA.Mods.RA
[Desc("For Normal DamageModel: Distance from the explosion center at which damage is 1/2.")]
public readonly WRange Spread = new WRange(43);
public override void DoImpact(WPos pos, Actor firedBy, float firepowerModifier)
public override void DoImpact(WPos pos, Actor firedBy, IEnumerable<int> damageModifiers)
{
var world = firedBy.World;
var maxSpread = new WRange((int)(Spread.Range * (float)Math.Log(Math.Abs(Damage), 2)));
var hitActors = world.FindActorsInCircle(pos, maxSpread);
foreach (var victim in hitActors)
{
if (IsValidAgainst(victim, firedBy))
{
var damage = (int)GetDamageToInflict(pos, victim, firedBy, firepowerModifier);
var damage = (int)GetDamageToInflict(pos, victim, firedBy, damageModifiers);
victim.InflictDamage(firedBy, damage, this);
}
}
}
public override void DoImpact(Actor victim, Actor firedBy, float firepowerModifier)
public override void DoImpact(Actor victim, Actor firedBy, IEnumerable<int> damageModifiers)
{
if (IsValidAgainst(victim, firedBy))
{
var damage = GetDamageToInflict(victim.CenterPosition, victim, firedBy, firepowerModifier);
var damage = GetDamageToInflict(victim.CenterPosition, victim, firedBy, damageModifiers);
victim.InflictDamage(firedBy, damage, this);
}
}
public int GetDamageToInflict(WPos pos, Actor target, Actor firedBy, float modifier)
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 = (float)GetDamageFalloff(distance * 1f / Spread.Range);
var rawDamage = (float)(falloff * Damage);
var falloff = (int)(100 * GetDamageFalloff(distance * 1f / Spread.Range));
return (int)(rawDamage * modifier * EffectivenessAgainst(target.Info));
return Util.ApplyPercentageModifiers(Damage, damageModifiers.Append(EffectivenessAgainst(target.Info), falloff));
}
static readonly float[] falloff =