From cefee4b1d2176a75aa4d0741e4d060e7869684c2 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Thu, 1 Apr 2010 18:24:42 +1300 Subject: [PATCH] guts of Combat is on the new model --- OpenRA.Game/Combat.cs | 61 ++++++++++++------------------- OpenRA.Game/Effects/Bullet.cs | 3 +- OpenRA.Game/Effects/Missile.cs | 4 +- OpenRA.Game/Effects/NukeLaunch.cs | 2 +- 4 files changed, 27 insertions(+), 43 deletions(-) diff --git a/OpenRA.Game/Combat.cs b/OpenRA.Game/Combat.cs index 93ef59f6aa..003a815161 100644 --- a/OpenRA.Game/Combat.cs +++ b/OpenRA.Game/Combat.cs @@ -29,56 +29,44 @@ namespace OpenRA { static class Combat /* some utility bits that are shared between various things */ { - public static void DoImpact(int2 loc, int2 visualLoc, - WeaponInfo weapon, ProjectileInfo projectile, WarheadInfo warhead, Actor firedBy) + static string GetImpactSound(WarheadInfo warhead, bool isWater) { - DoImpact(loc, visualLoc, weapon, projectile, warhead, firedBy, false); + if (isWater && warhead.WaterImpactSound != null) + return warhead.WaterImpactSound + ".aud"; + + if (warhead.ImpactSound != null) + return warhead.ImpactSound + ".aud"; + + return null; } - public static void DoImpact(int2 loc, int2 visualLoc, - WeaponInfo weapon, ProjectileInfo projectile, WarheadInfo warhead, Actor firedBy, bool nukeDamage) + public static void DoImpact(WarheadInfo warhead, ProjectileArgs args, int2 visualLocation) { - var world = firedBy.World; + var world = args.firedBy.World; + var targetTile = ((1f / Game.CellSize) * args.dest.ToFloat2()).ToInt2(); + var isWater = world.GetTerrainType(targetTile) == TerrainType.Water; - var targetTile = ((1f / Game.CellSize) * loc.ToFloat2()).ToInt2(); - - var isWater = (Game.world.GetTerrainType(targetTile) == TerrainType.Water); - if (warhead.Explosion != 0) world.AddFrameEndTask( - w => w.Add(new Explosion(w, visualLoc, warhead.Explosion, isWater))); + w => w.Add(new Explosion(w, visualLocation, warhead.Explosion, isWater))); - var impactSound = warhead.ImpactSound; - if (isWater && warhead.WaterImpactSound != null) - impactSound = warhead.WaterImpactSound; - if (impactSound != null) Sound.Play(impactSound + ".aud"); + Sound.Play(GetImpactSound(warhead, isWater)); if (!isWater) world.Map.AddSmudge(targetTile, warhead); if (warhead.Ore) world.WorldActor.traits.Get().Destroy(targetTile); - var firepowerModifier = firedBy.traits + var firepowerModifier = args.firedBy.traits .WithInterface() .Select(a => a.GetFirepowerModifier()) .Product(); - var maxSpread = GetMaximumSpread(weapon, warhead, firepowerModifier); - var hitActors = world.FindUnitsInCircle(loc, maxSpread); - - foreach (var victim in hitActors) - victim.InflictDamage(firedBy, - (int)GetDamageToInflict(victim, loc, weapon, warhead, firepowerModifier), warhead); + var maxSpread = warhead.Spread * (float)Math.Log(Math.Abs(warhead.Damage), 2); + var hitActors = world.FindUnitsInCircle(args.dest, maxSpread); - if (!nukeDamage) return; - foreach (var t in world.FindTilesInCircle(targetTile, warhead.SmudgeSize[0])) - { - var x = Util.CenterOfCell(t); - foreach (var unit in world.FindUnits(x, x)) - { - unit.InflictDamage(firedBy, - (int)(weapon.Damage * warhead.EffectivenessAgainst(unit.Info.Traits.Get().Armor)) / 4, warhead); - } - } + foreach (var victim in hitActors) + victim.InflictDamage(args.firedBy, + (int)GetDamageToInflict(victim, args, warhead, firepowerModifier), warhead); } static float GetMaximumSpread(WeaponInfo weapon, WarheadInfo warhead, float modifier) @@ -86,13 +74,10 @@ namespace OpenRA return (int)(warhead.Spread * Math.Log(Math.Abs(weapon.Damage * modifier), 2)); } - static float GetDamageToInflict(Actor target, int2 loc, WeaponInfo weapon, WarheadInfo warhead, float modifier) + static float GetDamageToInflict(Actor target, ProjectileArgs args, WarheadInfo warhead, float modifier) { - if (!WeaponValidForTarget(weapon, target)) - return 0f; - - var distance = (target.CenterLocation - loc).Length; - var rawDamage = weapon.Damage * modifier * (float)Math.Exp(-distance / warhead.Spread); + var distance = (target.CenterLocation - args.dest).Length; + var rawDamage = warhead.Damage * modifier * (float)Math.Exp(-distance / warhead.Spread); var multiplier = warhead.EffectivenessAgainst(target.Info.Traits.Get().Armor); return rawDamage * multiplier; } diff --git a/OpenRA.Game/Effects/Bullet.cs b/OpenRA.Game/Effects/Bullet.cs index a0d6851cc4..a88d7a87ef 100755 --- a/OpenRA.Game/Effects/Bullet.cs +++ b/OpenRA.Game/Effects/Bullet.cs @@ -81,8 +81,7 @@ namespace OpenRA.Effects if (t > TotalTime()) /* remove finished bullets */ { world.AddFrameEndTask(w => w.Remove(this)); - //Combat.DoImpact(Args.dest, VisualDest - new int2( 0, Args.destAltitude ), - // Weapon, Projectile, Warhead, FiredBy); + Combat.DoImpact(Args.weapon.Warheads[0], Args, VisualDest - new int2(0, Args.destAltitude)); } if (Info.Trail != null) diff --git a/OpenRA.Game/Effects/Missile.cs b/OpenRA.Game/Effects/Missile.cs index 5976666ee2..58cfbbbf27 100755 --- a/OpenRA.Game/Effects/Missile.cs +++ b/OpenRA.Game/Effects/Missile.cs @@ -117,8 +117,8 @@ namespace OpenRA.Effects { world.AddFrameEndTask(w => w.Remove(this)); - if (t > Projectile.Arm * 40) /* don't blow up in our launcher's face! */ - Combat.DoImpact(Pos.ToInt2(), Pos.ToInt2(), Weapon, Projectile, Warhead, FiredBy); + // if (t > Projectile.Arm * 40) /* don't blow up in our launcher's face! */ + // Combat.DoImpact(Pos.ToInt2(), Pos.ToInt2(), Weapon, Projectile, Warhead, FiredBy); return; } diff --git a/OpenRA.Game/Effects/NukeLaunch.cs b/OpenRA.Game/Effects/NukeLaunch.cs index 1c3d10ad3a..112022e9bd 100644 --- a/OpenRA.Game/Effects/NukeLaunch.cs +++ b/OpenRA.Game/Effects/NukeLaunch.cs @@ -83,7 +83,7 @@ namespace OpenRA.Effects { world.AddFrameEndTask(w => w.Remove(this)); var warhead = Rules.WarheadInfo[weapon.Warhead]; - Combat.DoImpact(pos.ToInt2(), pos.ToInt2(), weapon, Rules.ProjectileInfo[weapon.Projectile], warhead, silo, true); + //Combat.DoImpact(pos.ToInt2(), pos.ToInt2(), weapon, Rules.ProjectileInfo[weapon.Projectile], warhead, silo, true); world.WorldActor.traits.Get().AddEffect(20, pos, 5); }