Move warheads into mod code.
This commit is contained in:
@@ -1,75 +0,0 @@
|
||||
#region Copyright & License Information
|
||||
/*
|
||||
* Copyright 2007-2014 The OpenRA Developers (see AUTHORS)
|
||||
* This file is part of OpenRA, which is free software. It is made
|
||||
* available to you under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation. For more information,
|
||||
* see COPYING.
|
||||
*/
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using OpenRA.Effects;
|
||||
using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA.GameRules
|
||||
{
|
||||
public class AbsoluteSpreadDamageWarhead : DamageWarhead
|
||||
{
|
||||
[Desc("Maximum spread of the associated SpreadFactor.")]
|
||||
public readonly WRange[] Spread = { new WRange(43) };
|
||||
|
||||
[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)
|
||||
{
|
||||
var world = firedBy.World;
|
||||
|
||||
for (var i = 0; i < Spread.Length; i++)
|
||||
{
|
||||
var currentSpread = Spread[i];
|
||||
var currentFactor = SpreadFactor[i];
|
||||
var previousSpread = WRange.Zero;
|
||||
if (i > 0)
|
||||
previousSpread = Spread[i - 1];
|
||||
if (currentFactor <= 0f)
|
||||
continue;
|
||||
|
||||
var hitActors = world.FindActorsInCircle(pos, currentSpread);
|
||||
if (previousSpread.Range > 0)
|
||||
hitActors.Except(world.FindActorsInCircle(pos, previousSpread));
|
||||
|
||||
foreach (var victim in hitActors)
|
||||
if (IsValidAgainst(victim, firedBy))
|
||||
{
|
||||
var damage = GetDamageToInflict(victim, firedBy, firepowerModifier * currentFactor);
|
||||
victim.InflictDamage(firedBy, damage, this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public override void DoImpact(Actor victim, Actor firedBy, float firepowerModifier)
|
||||
{
|
||||
if (IsValidAgainst(victim, firedBy))
|
||||
{
|
||||
var currentFactor = SpreadFactor[0];
|
||||
var damage = (int)GetDamageToInflict(victim, firedBy, firepowerModifier * currentFactor);
|
||||
victim.InflictDamage(firedBy, damage, this);
|
||||
}
|
||||
}
|
||||
|
||||
public int GetDamageToInflict(Actor target, Actor firedBy, float modifier)
|
||||
{
|
||||
var healthInfo = target.Info.Traits.GetOrDefault<HealthInfo>();
|
||||
if (healthInfo == null)
|
||||
return 0;
|
||||
|
||||
var rawDamage = (float)Damage;
|
||||
|
||||
return (int)(rawDamage * modifier * EffectivenessAgainst(target.Info));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,62 +0,0 @@
|
||||
#region Copyright & License Information
|
||||
/*
|
||||
* Copyright 2007-2014 The OpenRA Developers (see AUTHORS)
|
||||
* This file is part of OpenRA, which is free software. It is made
|
||||
* available to you under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation. For more information,
|
||||
* see COPYING.
|
||||
*/
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using OpenRA.Effects;
|
||||
using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA.GameRules
|
||||
{
|
||||
public class HealthPercentageDamageWarhead : DamageWarhead
|
||||
{
|
||||
[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)
|
||||
{
|
||||
var world = firedBy.World;
|
||||
var range = Spread[0];
|
||||
var hitActors = world.FindActorsInCircle(pos, range);
|
||||
if (Spread.Length > 1 && Spread[1].Range > 0)
|
||||
hitActors.Except(world.FindActorsInCircle(pos, Spread[1]));
|
||||
|
||||
foreach (var victim in hitActors)
|
||||
DoImpact(victim, firedBy, firepowerModifier);
|
||||
}
|
||||
|
||||
public override void DoImpact(Actor victim, Actor firedBy, float firepowerModifier)
|
||||
{
|
||||
if (IsValidAgainst(victim, firedBy))
|
||||
{
|
||||
var damage = GetDamageToInflict(victim, firedBy, firepowerModifier);
|
||||
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, float modifier)
|
||||
{
|
||||
var healthInfo = target.Info.Traits.GetOrDefault<HealthInfo>();
|
||||
if (healthInfo == null)
|
||||
return 0;
|
||||
|
||||
var rawDamage = (float)Damage;
|
||||
|
||||
return rawDamage * modifier * EffectivenessAgainst(target.Info);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,56 +0,0 @@
|
||||
#region Copyright & License Information
|
||||
/*
|
||||
* Copyright 2007-2014 The OpenRA Developers (see AUTHORS)
|
||||
* This file is part of OpenRA, which is free software. It is made
|
||||
* available to you under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation. For more information,
|
||||
* see COPYING.
|
||||
*/
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using OpenRA.Effects;
|
||||
using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA.GameRules
|
||||
{
|
||||
public class PerCellDamageWarhead : DamageWarhead
|
||||
{
|
||||
[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)
|
||||
{
|
||||
var world = firedBy.World;
|
||||
var targetTile = world.Map.CellContaining(pos);
|
||||
var minRange = (Size.Length > 1 && Size[1] > 0) ? Size[1] : 0;
|
||||
var affectedTiles = world.Map.FindTilesInAnnulus(targetTile, minRange, Size[0]);
|
||||
|
||||
foreach (var t in affectedTiles)
|
||||
foreach (var victim in world.ActorMap.GetUnitsAt(t))
|
||||
DoImpact(victim, firedBy, firepowerModifier);
|
||||
}
|
||||
|
||||
public override void DoImpact(Actor victim, Actor firedBy, float firepowerModifier)
|
||||
{
|
||||
if (IsValidAgainst(victim, firedBy))
|
||||
{
|
||||
var damage = GetDamageToInflict(victim, firedBy, firepowerModifier);
|
||||
victim.InflictDamage(firedBy, damage, this);
|
||||
}
|
||||
}
|
||||
|
||||
public int GetDamageToInflict(Actor target, Actor firedBy, float modifier)
|
||||
{
|
||||
var healthInfo = target.Info.Traits.GetOrDefault<HealthInfo>();
|
||||
if (healthInfo == null)
|
||||
return 0;
|
||||
|
||||
var rawDamage = (float)Damage;
|
||||
|
||||
return (int)(rawDamage * modifier * EffectivenessAgainst(target.Info));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,74 +0,0 @@
|
||||
#region Copyright & License Information
|
||||
/*
|
||||
* Copyright 2007-2014 The OpenRA Developers (see AUTHORS)
|
||||
* This file is part of OpenRA, which is free software. It is made
|
||||
* available to you under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation. For more information,
|
||||
* see COPYING.
|
||||
*/
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using OpenRA.Effects;
|
||||
using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA.GameRules
|
||||
{
|
||||
public class SpreadDamageWarhead : DamageWarhead
|
||||
{
|
||||
[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)
|
||||
{
|
||||
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);
|
||||
victim.InflictDamage(firedBy, damage, this);
|
||||
}
|
||||
}
|
||||
|
||||
public override void DoImpact(Actor victim, Actor firedBy, float firepowerModifier)
|
||||
{
|
||||
if (IsValidAgainst(victim, firedBy))
|
||||
{
|
||||
var damage = GetDamageToInflict(victim.CenterPosition, victim, firedBy, firepowerModifier);
|
||||
victim.InflictDamage(firedBy, damage, this);
|
||||
}
|
||||
}
|
||||
|
||||
public int GetDamageToInflict(WPos pos, Actor target, Actor firedBy, float modifier)
|
||||
{
|
||||
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);
|
||||
|
||||
return (int)(rawDamage * modifier * EffectivenessAgainst(target.Info));
|
||||
}
|
||||
|
||||
static readonly float[] falloff =
|
||||
{
|
||||
1f, 0.3678795f, 0.1353353f, 0.04978707f,
|
||||
0.01831564f, 0.006737947f, 0.002478752f, 0.000911882f
|
||||
};
|
||||
|
||||
static float GetDamageFalloff(float x)
|
||||
{
|
||||
var u = (int)x;
|
||||
if (u >= falloff.Length - 1) return 0;
|
||||
var t = x - u;
|
||||
return (falloff[u] * (1 - t)) + (falloff[u + 1] * t);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user