Merge pull request #6265 from pchote/warhead-intification

Warhead cleanups
This commit is contained in:
Matthias Mailänder
2014-08-23 09:31:41 +02:00
43 changed files with 1197 additions and 1281 deletions

View File

@@ -0,0 +1,86 @@
#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 abstract class DamageWarhead : Warhead
{
[Desc("How much (raw) damage to deal")]
public readonly int Damage = 0;
[Desc("Infantry death animation to use")]
public readonly string InfDeath = "1";
[Desc("Whether we should prevent prone response for infantry.")]
public readonly bool PreventProne = false;
[Desc("By what percentage should damage be modified against prone infantry.")]
public readonly int ProneModifier = 50;
[FieldLoader.LoadUsing("LoadVersus")]
[Desc("Damage percentage versus each armortype. 0% = can't target.")]
public readonly Dictionary<string, int> Versus;
public static object LoadVersus(MiniYaml yaml)
{
var nd = yaml.ToDictionary();
return nd.ContainsKey("Versus")
? nd["Versus"].ToDictionary(my => FieldLoader.GetValue<int>("(value)", my.Value))
: new Dictionary<string, int>();
}
public int DamageVersus(ActorInfo victim)
{
var armor = victim.Traits.GetOrDefault<ArmorInfo>();
if (armor != null && armor.Type != null)
{
int versus;
if (Versus.TryGetValue(armor.Type, out versus))
return versus;
}
return 100;
}
// TODO: This can be removed after the legacy and redundant 0% = not targetable
// assumption has been removed from the yaml definitions
public override bool CanTargetActor(ActorInfo victim, Actor firedBy)
{
var health = victim.Traits.GetOrDefault<HealthInfo>();
if (health == null)
return false;
return DamageVersus(victim) > 0;
}
public override void DoImpact(Target target, Actor firedBy, IEnumerable<int> damageModifiers)
{
// Used by traits that damage a single actor, rather than a position
if (target.Type == TargetType.Actor)
DoImpact(target.Actor, firedBy, damageModifiers);
else
DoImpact(target.CenterPosition, firedBy, 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);
}
}
}

View File

@@ -27,9 +27,7 @@ namespace OpenRA.GameRules
[Desc("Delay in ticks before applying the warhead effect.","0 = instant (old model).")]
public readonly int Delay = 0;
public abstract void DoImpact(Target target, Actor firedBy, float firepowerModifier);
public virtual float EffectivenessAgainst(ActorInfo ai) { return 0f; }
public abstract void DoImpact(Target target, Actor firedBy, IEnumerable<int> damageModifiers);
public bool IsValidAgainst(Target target, World world, Actor firedBy)
{
@@ -56,10 +54,13 @@ namespace OpenRA.GameRules
return false;
}
// TODO: This can be removed after the legacy and redundant 0% = not targetable
// assumption has been removed from the yaml definitions
public virtual bool CanTargetActor(ActorInfo victim, Actor firedBy) { return false; }
public bool IsValidAgainst(Actor victim, Actor firedBy)
{
// If this warhead is ineffective against the target, then it is not a valid target
if (EffectivenessAgainst(victim.Info) <= 0f)
if (!CanTargetActor(victim.Info, firedBy))
return false;
// A target type is valid if it is in the valid targets list, and not in the invalid targets list.
@@ -83,8 +84,7 @@ namespace OpenRA.GameRules
public bool IsValidAgainst(FrozenActor victim, Actor firedBy)
{
// If this warhead is ineffective against the target, then it is not a valid target
if (EffectivenessAgainst(victim.Info) <= 0f)
if (!CanTargetActor(victim.Info, firedBy))
return false;
// A target type is valid if it is in the valid targets list, and not in the invalid targets list.

View File

@@ -1,84 +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(Target target, Actor firedBy, float firepowerModifier)
{
// Used by traits that damage a single actor, rather than a position
if (target.Type == TargetType.Actor)
DoImpact(target.Actor, firedBy, firepowerModifier);
else
DoImpact(target.CenterPosition, firedBy, firepowerModifier);
}
public 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 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));
}
}
}

View File

@@ -1,59 +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 abstract class DamageWarhead : Warhead
{
[Desc("How much (raw) damage to deal")]
public readonly int Damage = 0;
[Desc("Infantry death animation to use")]
public readonly string InfDeath = "1";
[Desc("Whether we should prevent prone response for infantry.")]
public readonly bool PreventProne = false;
[Desc("By what percentage should damage be modified against prone infantry.")]
public readonly int ProneModifier = 50;
[FieldLoader.LoadUsing("LoadVersus")]
[Desc("Damage vs each armortype. 0% = can't target.")]
public readonly Dictionary<string, float> Versus;
public static object LoadVersus(MiniYaml yaml)
{
var nd = yaml.ToDictionary();
return nd.ContainsKey("Versus")
? nd["Versus"].ToDictionary(my => FieldLoader.GetValue<float>("(value)", my.Value))
: new Dictionary<string, float>();
}
public override float EffectivenessAgainst(ActorInfo ai)
{
var health = ai.Traits.GetOrDefault<HealthInfo>();
if (health == null)
return 0f;
var armor = ai.Traits.GetOrDefault<ArmorInfo>();
if (armor == null || armor.Type == null)
return 1f;
float versus;
return Versus.TryGetValue(armor.Type, out versus) ? versus : 1f;
}
}
}

View File

@@ -1,71 +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(Target target, Actor firedBy, float firepowerModifier)
{
// Used by traits that damage a single actor, rather than a position
if (target.Type == TargetType.Actor)
DoImpact(target.Actor, firedBy, firepowerModifier);
else
DoImpact(target.CenterPosition, firedBy, firepowerModifier);
}
public 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 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);
}
}
}

View File

@@ -1,65 +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(Target target, Actor firedBy, float firepowerModifier)
{
// Used by traits that damage a single actor, rather than a position
if (target.Type == TargetType.Actor)
DoImpact(target.Actor, firedBy, firepowerModifier);
else
DoImpact(target.CenterPosition, firedBy, firepowerModifier);
}
public 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 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));
}
}
}

View File

@@ -1,83 +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(Target target, Actor firedBy, float firepowerModifier)
{
// Used by traits that damage a single actor, rather than a position
if (target.Type == TargetType.Actor)
DoImpact(target.Actor, firedBy, firepowerModifier);
else
DoImpact(target.CenterPosition, firedBy, firepowerModifier);
}
public 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 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);
}
}
}

View File

@@ -19,7 +19,7 @@ namespace OpenRA.GameRules
public class ProjectileArgs
{
public WeaponInfo Weapon;
public float FirepowerModifier = 1.0f;
public IEnumerable<int> DamageModifiers;
public int Facing;
public WPos Source;
public Actor SourceActor;
@@ -144,13 +144,13 @@ namespace OpenRA.GameRules
return true;
}
public void Impact(WPos pos, Actor firedBy, float damageModifier)
public void Impact(WPos pos, Actor firedBy, IEnumerable<int> damageModifiers)
{
foreach (var wh in Warheads)
{
Action a;
a = () => wh.DoImpact(Target.FromPos(pos), firedBy, damageModifier);
a = () => wh.DoImpact(Target.FromPos(pos), firedBy, damageModifiers);
if (wh.Delay > 0)
firedBy.World.AddFrameEndTask(
w => w.Add(new DelayedAction(wh.Delay, a)));

View File

@@ -76,11 +76,6 @@
<ItemGroup>
<Compile Include="Actor.cs" />
<Compile Include="GameRules\Warhead.cs" />
<Compile Include="GameRules\Warheads\AbsoluteSpreadDamageWarhead.cs" />
<Compile Include="GameRules\Warheads\DamageWarhead.cs" />
<Compile Include="GameRules\Warheads\HealthPercentageDamageWarhead.cs" />
<Compile Include="GameRules\Warheads\PerCellDamageWarhead.cs" />
<Compile Include="GameRules\Warheads\SpreadDamageWarhead.cs" />
<Compile Include="Graphics\QuadRenderer.cs" />
<Compile Include="Download.cs" />
<Compile Include="Effects\DelayedAction.cs" />
@@ -247,6 +242,7 @@
<Compile Include="Graphics\SelectionBarsRenderable.cs" />
<Compile Include="Graphics\TargetLineRenderable.cs" />
<Compile Include="Graphics\UISpriteRenderable.cs" />
<Compile Include="GameRules\DamageWarhead.cs" />
</ItemGroup>
<ItemGroup>
<Compile Include="FileSystem\D2kSoundResources.cs" />

View File

@@ -9,6 +9,7 @@
#endregion
using System.Collections.Generic;
using System.Linq;
using OpenRA.Effects;
using OpenRA.GameRules;
using OpenRA.Graphics;
@@ -45,7 +46,7 @@ namespace OpenRA.Mods.Cnc.Effects
if (!impacted && weaponDelay-- <= 0)
{
var weapon = world.Map.Rules.Weapons[this.weapon.ToLowerInvariant()];
weapon.Impact(target.CenterPosition, firedBy.PlayerActor, 1f);
weapon.Impact(target.CenterPosition, firedBy.PlayerActor, Enumerable.Empty<int>());
impacted = true;
}
}

View File

@@ -43,7 +43,7 @@ namespace OpenRA.Mods.Cnc
if (!info.Resources.Contains(r.Info.Name)) return;
var weapon = self.World.Map.Rules.Weapons[info.Weapon.ToLowerInvariant()];
weapon.Impact(self.CenterPosition, self.World.WorldActor, 1f);
weapon.Impact(self.CenterPosition, self.World.WorldActor, Enumerable.Empty<int>());
poisonTicks = weapon.ReloadDelay;
}
}

View File

@@ -65,7 +65,7 @@ namespace OpenRA.Mods.D2k
if (health.HP <= damageThreshold || --damageTicks > 0)
return;
weapon.Impact(self.CenterPosition, self.World.WorldActor, 1f);
weapon.Impact(self.CenterPosition, self.World.WorldActor, Enumerable.Empty<int>());
damageTicks = weapon.ReloadDelay;
}
}

View File

@@ -49,10 +49,8 @@ namespace OpenRA.Mods.D2k
Weapon = wep,
Facing = self.World.SharedRandom.Next(-1, 255),
// TODO: Convert to ints
FirepowerModifier = self.TraitsImplementing<IFirepowerModifier>()
.Select(a => a.GetFirepowerModifier() / 100f)
.Product(),
DamageModifiers = self.TraitsImplementing<IFirepowerModifier>()
.Select(a => a.GetFirepowerModifier()),
Source = self.CenterPosition,
SourceActor = self,

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

@@ -562,6 +562,9 @@
<Compile Include="GainsStatUpgrades.cs" />
<Compile Include="Player\Extensions.cs" />
<Compile Include="ServerTraits\LobbySettingsNotification.cs" />
<Compile Include="Warheads\HealthPercentageDamageWarhead.cs" />
<Compile Include="Warheads\PerCellDamageWarhead.cs" />
<Compile Include="Warheads\SpreadDamageWarhead.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\OpenRA.Game\OpenRA.Game.csproj">

View File

@@ -34,11 +34,6 @@ namespace OpenRA.Mods.RA
[Desc("What impact types should this effect NOT apply to.", "Overrides ValidImpactTypes.")]
public readonly ImpactType InvalidImpactTypes = ImpactType.None;
public override void DoImpact(Target target, Actor firedBy, float firepowerModifier)
{
DoImpact(target.CenterPosition, firedBy, firepowerModifier);
}
public static ImpactType GetImpactType(World world, CPos cell, WPos pos)
{
var isAir = pos.Z > 0;
@@ -79,8 +74,9 @@ namespace OpenRA.Mods.RA
return false;
}
public void DoImpact(WPos pos, Actor firedBy, float firepowerModifier)
public override void DoImpact(Target target, Actor firedBy, IEnumerable<int> damageModifiers)
{
var pos = target.CenterPosition;
var world = firedBy.World;
var targetTile = world.Map.CellContaining(pos);
var isValid = IsValidImpact(pos, firedBy);

View File

@@ -26,18 +26,13 @@ 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)
{
DoImpact(target.CenterPosition, firedBy, firepowerModifier);
}
public void DoImpact(WPos pos, Actor firedBy, float firepowerModifier)
public override void DoImpact(Target target, Actor firedBy, IEnumerable<int> damageModifiers)
{
if (string.IsNullOrEmpty(AddsResourceType))
return;
var world = firedBy.World;
var targetTile = world.Map.CellContaining(pos);
var targetTile = world.Map.CellContaining(target.CenterPosition);
var resLayer = world.WorldActor.Trait<ResourceLayer>();
var minRange = (Size.Length > 1 && Size[1] > 0) ? Size[1] : 0;

View File

@@ -23,15 +23,10 @@ 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)
{
DoImpact(target.CenterPosition, firedBy, firepowerModifier);
}
public void DoImpact(WPos pos, Actor firedBy, float firepowerModifier)
public override void DoImpact(Target target, Actor firedBy, IEnumerable<int> damageModifiers)
{
var world = firedBy.World;
var targetTile = world.Map.CellContaining(pos);
var targetTile = world.Map.CellContaining(target.CenterPosition);
var resLayer = world.WorldActor.Trait<ResourceLayer>();
var minRange = (Size.Length > 1 && Size[1] > 0) ? Size[1] : 0;

View File

@@ -0,0 +1,48 @@
#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.GameRules;
using OpenRA.Traits;
namespace OpenRA.Mods.RA
{
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) };
public override void DoImpact(WPos pos, Actor firedBy, IEnumerable<int> damageModifiers)
{
var world = firedBy.World;
var range = Spread[0];
var hitActors = world.FindActorsInCircle(pos, range);
if (Spread.Length > 1 && Spread[1].Range > 0)
hitActors = hitActors.Except(world.FindActorsInCircle(pos, Spread[1]));
foreach (var victim in hitActors)
DoImpact(victim, firedBy, damageModifiers);
}
public override void DoImpact(Actor victim, Actor firedBy, IEnumerable<int> damageModifiers)
{
var healthInfo = victim.Info.Traits.GetOrDefault<HealthInfo>();
if (healthInfo == null)
return;
// 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

@@ -25,15 +25,10 @@ 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)
{
DoImpact(target.CenterPosition, firedBy, firepowerModifier);
}
public void DoImpact(WPos pos, Actor firedBy, float firepowerModifier)
public override void DoImpact(Target target, Actor firedBy, IEnumerable<int> damageModifiers)
{
var world = firedBy.World;
var targetTile = world.Map.CellContaining(pos);
var targetTile = world.Map.CellContaining(target.CenterPosition);
var smudgeLayers = world.WorldActor.TraitsImplementing<SmudgeLayer>().ToDictionary(x => x.Info.Type);
var minRange = (Size.Length > 1 && Size[1] > 0) ? Size[1] : 0;

View File

@@ -0,0 +1,37 @@
#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.GameRules;
using OpenRA.Traits;
namespace OpenRA.Mods.RA
{
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, IEnumerable<int> damageModifiers)
{
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, damageModifiers);
}
}
}

View File

@@ -0,0 +1,86 @@
#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.GameRules;
using OpenRA.Traits;
namespace OpenRA.Mods.RA
{
public class SpreadDamageWarhead : DamageWarhead
{
[Desc("Range between falloff steps.")]
public readonly WRange Spread = new WRange(43);
[Desc("Ranges at which each Falloff step is defined. Overrides Spread.")]
public WRange[] Range = null;
[Desc("Damage percentage at each range step")]
public readonly int[] Falloff = { 100, 37, 14, 5, 2, 1, 0 };
public void InitializeRange()
{
if (Range != null)
{
if (Range.Length != 1 && Range.Length != Falloff.Length)
throw new InvalidOperationException("Number of range values must be 1 or equal to the number of Falloff values.");
for (var i = 0; i < Range.Length - 1; i++)
if (Range[i] > Range[i + 1])
throw new InvalidOperationException("Range values must be specified in an increasing order.");
}
else
Range = Exts.MakeArray(Falloff.Length, i => i * Spread);
}
public override void DoImpact(WPos pos, Actor firedBy, IEnumerable<int> damageModifiers)
{
if (Range == null)
InitializeRange();
var world = firedBy.World;
var hitActors = world.FindActorsInCircle(pos, Range[Range.Length - 1]);
foreach (var victim in hitActors)
{
if (!IsValidAgainst(victim, firedBy))
continue;
var localModifiers = damageModifiers;
var healthInfo = victim.Info.Traits.GetOrDefault<HealthInfo>();
if (healthInfo != null)
{
var distance = Math.Max(0, (victim.CenterPosition - pos).Length - healthInfo.Radius.Range);
localModifiers = localModifiers.Append(GetDamageFalloff(distance));
}
DoImpact(victim, firedBy, localModifiers);
}
}
int GetDamageFalloff(int distance)
{
var inner = Range[0].Range;
for (var i = 1; i < Range.Length; i++)
{
var outer = Range[i].Range;
if (outer > distance)
return int2.Lerp(Falloff[i - 1], Falloff[i], distance - inner, outer - inner);
inner = outer;
}
return 0;
}
}
}

View File

@@ -29,7 +29,7 @@ namespace OpenRA.Utility
static void ConvertFloatArrayToPercentArray(ref string input)
{
input = string.Join(", ", input.Split(',')
.Select(s => ((int)(float.Parse(s) * 100)).ToString()));
.Select(s => ((int)Math.Round(FieldLoader.GetValue<float>("(float value)", s) * 100)).ToString()));
}
static void ConvertPxToRange(ref string input)
@@ -755,6 +755,13 @@ namespace OpenRA.Utility
}
}
if (engineVersion < 20140821)
{
// Converted versus definitions to integers
if (depth == 3 && parentKey == "Versus")
ConvertFloatArrayToPercentArray(ref node.Value.Value);
}
UpgradeWeaponRules(engineVersion, ref node.Value.Nodes, node, depth + 1);
}
}

View File

@@ -541,7 +541,7 @@ Weapons:
BoatMissile:
Warhead: SpreadDamage
Versus:
Heavy: 50%
Heavy: 50
Damage: 50
Voices:

View File

@@ -919,7 +919,7 @@ Weapons:
Rockets:
Warhead: SpreadDamage
Versus:
None: 20%
None: 20
Voices:

View File

@@ -26,13 +26,14 @@ HeliExplode:
UnitExplode:
Warhead@1Dam: SpreadDamage
Spread: 426
Damage: 500
Damage: 50
Falloff: 1000, 368, 135, 50, 18, 7, 0
InfDeath: 4
Versus:
None: 90%
Wood: 75%
Light: 60%
Heavy: 25%
None: 90
Wood: 75
Light: 60
Heavy: 25
Warhead@2Eff: CreateEffect
Explosion: poof
ImpactSound: xplobig6.aud
@@ -43,10 +44,10 @@ UnitExplodeSmall:
Damage: 40
InfDeath: 4
Versus:
None: 90%
Wood: 75%
Light: 60%
Heavy: 25%
None: 90
Wood: 75
Light: 60
Heavy: 25
Warhead@2Eff: CreateEffect
Explosion: big_frag
ImpactSound: xplobig4.aud
@@ -57,10 +58,10 @@ GrenadierExplode:
Damage: 10
InfDeath: 3
Versus:
None: 90%
Wood: 75%
Light: 60%
Heavy: 25%
None: 90
Wood: 75
Light: 60
Heavy: 25
Warhead@2Eff: CreateEffect
Explosion: poof
ImpactSound: xplosml2.aud
@@ -70,28 +71,30 @@ Atomic:
Report: nukemisl.aud
Warhead@1Dam_impact: SpreadDamage
Spread: 1c0
Damage: 1500
Damage: 150
Falloff: 1000, 368, 135, 50, 18, 7, 0
InfDeath: 5
ValidTargets: Ground, Air
Versus:
None: 100%
Wood: 100%
Light: 60%
Heavy: 50%
None: 100
Wood: 100
Light: 60
Heavy: 50
Warhead@2Eff_impact: CreateEffect
Explosion: 6
ImpactSound: nukexplo.aud
Warhead@3Dam_areanukea: SpreadDamage
Spread: 2c512
Damage: 1000
Damage: 100
Falloff: 1000, 368, 135, 50, 18, 7, 0
InfDeath: 5
Delay: 3
ValidTargets: Ground, Air
Versus:
None: 100%
Wood: 100%
Light: 60%
Heavy: 50%
None: 100
Wood: 100
Light: 60
Heavy: 50
Warhead@4Res_areanukea: DestroyResource
Size: 3
Delay: 3
@@ -104,15 +107,16 @@ Atomic:
Delay: 3
Warhead@7Dam_areanukeb: SpreadDamage
Spread: 3c768
Damage: 500
Damage: 50
Falloff: 1000, 368, 135, 50, 18, 7, 0
InfDeath: 5
Delay: 6
ValidTargets: Ground, Air
Versus:
None: 100%
Wood: 100%
Light: 60%
Heavy: 50%
None: 100
Wood: 100
Light: 60
Heavy: 50
Warhead@8Res_areanukeb: DestroyResource
Size: 4
Delay: 6
@@ -122,15 +126,16 @@ Atomic:
Delay: 6
Warhead@10Dam_areanukec: SpreadDamage
Spread: 5c0
Damage: 200
Damage: 20
Falloff: 1000, 368, 135, 50, 18, 7, 0
InfDeath: 5
Delay: 9
ValidTargets: Ground, Air
Versus:
None: 100%
Wood: 100%
Light: 60%
Heavy: 50%
None: 100
Wood: 100
Light: 60
Heavy: 50
Warhead@11Res_areanukec: DestroyResource
Size: 5
Delay: 9
@@ -143,7 +148,8 @@ IonCannon:
ValidTargets: Ground, Air
Warhead@1Dam_impact: SpreadDamage
Spread: 1c0
Damage: 1000
Damage: 100
Falloff: 1000, 368, 135, 50, 18, 7, 0
InfDeath: 5
ValidTargets: Ground, Air
Warhead@2Res_impact: DestroyResource
@@ -188,10 +194,10 @@ HighV:
Damage: 30
InfDeath: 2
Versus:
None: 100%
Wood: 50%
Light: 70%
Heavy: 35%
None: 100
Wood: 50
Light: 70
Heavy: 35
Warhead@2Eff: CreateEffect
Explosion: piffs
@@ -211,10 +217,10 @@ HeliAGGun:
InfDeath: 2
ValidTargets: Ground
Versus:
None: 100%
Wood: 50%
Light: 75%
Heavy: 25%
None: 100
Wood: 50
Light: 75
Heavy: 25
Warhead@2Eff: CreateEffect
Explosion: piffs
@@ -234,10 +240,10 @@ HeliAAGun:
InfDeath: 2
ValidTargets: Air
Versus:
None: 100%
Wood: 50%
Light: 50%
Heavy: 25%
None: 100
Wood: 50
Light: 50
Heavy: 25
Warhead@2Eff: CreateEffect
Explosion: piffs
@@ -254,10 +260,10 @@ Pistol:
InfDeath: 2
InvalidTargets: Wall
Versus:
None: 100%
Wood: 50%
Light: 50%
Heavy: 25%
None: 100
Wood: 50
Light: 50
Heavy: 25
Warhead@2Eff: CreateEffect
Explosion: piff
@@ -274,10 +280,10 @@ M16:
InfDeath: 2
InvalidTargets: Wall
Versus:
None: 100%
Wood: 25%
Light: 30%
Heavy: 10%
None: 100
Wood: 25
Light: 30
Heavy: 10
Warhead@2Eff: CreateEffect
Explosion: piff
@@ -302,11 +308,11 @@ Rockets:
InfDeath: 4
ValidTargets: Ground, Air
Versus:
None: 50%
Wood: 85%
Light: 100%
Heavy: 100%
Concrete: 25%
None: 50
Wood: 85
Light: 100
Heavy: 100
Concrete: 25
Warhead@2Smu: LeaveSmudge
SmudgeType: Crater
Warhead@3Eff: CreateEffect
@@ -336,11 +342,11 @@ BikeRockets:
InfDeath: 4
ValidTargets: Ground, Air
Versus:
None: 25%
Wood: 75%
Light: 100%
Heavy: 100%
Concrete: 50%
None: 25
Wood: 75
Light: 100
Heavy: 100
Concrete: 50
Warhead@2Smu: LeaveSmudge
SmudgeType: Crater
Warhead@3Eff: CreateEffect
@@ -370,10 +376,10 @@ OrcaAGMissiles:
InfDeath: 4
ValidTargets: Ground
Versus:
None: 50%
Wood: 100%
Light: 100%
Heavy: 75%
None: 50
Wood: 100
Light: 100
Heavy: 75
Warhead@2Smu: LeaveSmudge
SmudgeType: Crater
Warhead@3Eff: CreateEffect
@@ -403,8 +409,8 @@ OrcaAAMissiles:
InfDeath: 4
ValidTargets: Air
Versus:
Light: 75%
Heavy: 50%
Light: 75
Heavy: 50
Warhead@2Smu: LeaveSmudge
SmudgeType: Crater
Warhead@3Eff: CreateEffect
@@ -424,10 +430,10 @@ Flamethrower:
InfDeath: 5
InvalidTargets: Wall
Versus:
None: 100%
Wood: 100%
Light: 100%
Heavy: 20%
None: 100
Wood: 100
Light: 100
Heavy: 20
Warhead@2Smu: LeaveSmudge
SmudgeType: Scorch
Warhead@3Eff: CreateEffect
@@ -449,10 +455,10 @@ BigFlamer:
InfDeath: 5
InvalidTargets: Wall
Versus:
None: 100%
Wood: 100%
Light: 67%
Heavy: 25%
None: 100
Wood: 100
Light: 67
Heavy: 25
Warhead@2Smu: LeaveSmudge
SmudgeType: Scorch
Warhead@3Eff: CreateEffect
@@ -470,10 +476,10 @@ Chemspray:
Damage: 80
InfDeath: 6
Versus:
None: 100%
Wood: 35%
Light: 75%
Heavy: 50%
None: 100
Wood: 35
Light: 75
Heavy: 50
Warhead@2Smu: LeaveSmudge
SmudgeType: Scorch
Warhead@3Eff: CreateEffect
@@ -495,10 +501,10 @@ Grenade:
Damage: 50
InfDeath: 3
Versus:
None: 100%
Wood: 50%
Light: 75%
Heavy: 35%
None: 100
Wood: 50
Light: 75
Heavy: 35
Warhead@2Smu: LeaveSmudge
SmudgeType: Crater
Warhead@3Eff: CreateEffect
@@ -517,11 +523,11 @@ Grenade:
Damage: 25
InfDeath: 4
Versus:
None: 25%
Wood: 75%
Light: 100%
Heavy: 100%
Concrete: 50%
None: 25
Wood: 75
Light: 100
Heavy: 100
Concrete: 50
Warhead@2Smu: LeaveSmudge
SmudgeType: Crater
Warhead@3Eff: CreateEffect
@@ -540,10 +546,10 @@ Grenade:
Damage: 30
InfDeath: 4
Versus:
None: 30%
Wood: 75%
Light: 75%
Heavy: 100%
None: 30
Wood: 75
Light: 75
Heavy: 100
Warhead@2Smu: LeaveSmudge
SmudgeType: Crater
Warhead@3Eff: CreateEffect
@@ -562,11 +568,11 @@ Grenade:
Damage: 40
InfDeath: 4
Versus:
None: 25%
Wood: 100%
Light: 100%
Heavy: 100%
Concrete: 50%
None: 25
Wood: 100
Light: 100
Heavy: 100
Concrete: 50
Warhead@2Smu: LeaveSmudge
SmudgeType: Crater
Warhead@3Eff: CreateEffect
@@ -587,11 +593,11 @@ Grenade:
Damage: 40
InfDeath: 4
Versus:
None: 25%
Wood: 100%
Light: 100%
Heavy: 100%
Concrete: 100%
None: 25
Wood: 100
Light: 100
Heavy: 100
Concrete: 100
Warhead@2Smu: LeaveSmudge
SmudgeType: Crater
Warhead@3Eff: CreateEffect
@@ -610,10 +616,10 @@ TurretGun:
Damage: 40
InfDeath: 4
Versus:
None: 20%
Wood: 25%
Light: 100%
Heavy: 100%
None: 20
Wood: 25
Light: 100
Heavy: 100
Warhead@2Smu: LeaveSmudge
SmudgeType: Crater
Warhead@3Eff: CreateEffect
@@ -643,10 +649,10 @@ MammothMissiles:
InfDeath: 4
ValidTargets: Ground, Air
Versus:
None: 50%
Wood: 75%
Light: 100%
Heavy: 50%
None: 50
Wood: 75
Light: 100
Heavy: 50
Warhead@2Smu: LeaveSmudge
SmudgeType: Crater
Warhead@3Eff: CreateEffect
@@ -683,10 +689,10 @@ MammothMissiles:
InfDeath: 4
ValidTargets: Ground
Versus:
None: 35%
Wood: 60%
Light: 100%
Heavy: 50%
None: 35
Wood: 60
Light: 100
Heavy: 50
Warhead@2Smu: LeaveSmudge
SmudgeType: Crater
Warhead@3Eff: CreateEffect
@@ -716,10 +722,10 @@ MammothMissiles:
InfDeath: 4
ValidTargets: Ground, Air
Versus:
None: 25%
Wood: 75%
Light: 100%
Heavy: 90%
None: 25
Wood: 75
Light: 100
Heavy: 90
Warhead@2Smu: LeaveSmudge
SmudgeType: Crater
Warhead@3Eff: CreateEffect
@@ -743,10 +749,10 @@ ArtilleryShell:
Damage: 150
InfDeath: 3
Versus:
None: 100%
Wood: 80%
Light: 75%
Heavy: 50%
None: 100
Wood: 80
Light: 75
Heavy: 50
Warhead@2Smu: LeaveSmudge
SmudgeType: Crater
Warhead@3Eff: CreateEffect
@@ -767,11 +773,11 @@ MachineGun:
InfDeath: 2
InvalidTargets: Wall
Versus:
None: 100%
Wood: 20%
Light: 50%
Heavy: 20%
Concrete: 10%
None: 100
Wood: 20
Light: 50
Heavy: 20
Concrete: 10
Warhead@2Eff: CreateEffect
Explosion: piffs
@@ -796,10 +802,10 @@ BoatMissile:
Damage: 60
InfDeath: 3
Versus:
None: 90%
Wood: 75%
Light: 60%
Heavy: 25%
None: 90
Wood: 75
Light: 60
Heavy: 25
Warhead@2Smu: LeaveSmudge
SmudgeType: Crater
Warhead@3Eff: CreateEffect
@@ -832,10 +838,10 @@ TowerMissle:
InfDeath: 3
ValidTargets: Ground
Versus:
None: 50%
Wood: 25%
Light: 100%
Heavy: 100%
None: 50
Wood: 25
Light: 100
Heavy: 100
Warhead@2Smu: LeaveSmudge
SmudgeType: Crater
Warhead@3Eff: CreateEffect
@@ -855,10 +861,10 @@ Vulcan:
InfDeath: 2
ValidTargets: Ground, Water
Versus:
None: 100%
Wood: 25%
Light: 100%
Heavy: 35%
None: 100
Wood: 25
Light: 100
Heavy: 35
Warhead@2Eff: CreateEffect
Explosion: piffs
@@ -872,14 +878,15 @@ Napalm:
Image: BOMBLET
Warhead@1Dam: SpreadDamage
Spread: 341
Damage: 300
Damage: 30
Falloff: 1000, 368, 135, 50, 18, 7, 0
InfDeath: 5
ValidTargets: Ground, Water
Versus:
None: 100%
Wood: 100%
Light: 100%
Heavy: 80%
None: 100
Wood: 100
Light: 100
Heavy: 80
Warhead@2Smu: LeaveSmudge
SmudgeType: Scorch
Warhead@3Eff: CreateEffect
@@ -889,13 +896,14 @@ Napalm:
Napalm.Crate:
Warhead@1Dam: SpreadDamage
Spread: 170
Damage: 500
Damage: 50
Falloff: 1000, 368, 135, 50, 18, 7, 0
InfDeath: 5
Versus:
None: 90%
Wood: 100%
Light: 60%
Heavy: 25%
None: 90
Wood: 100
Light: 60
Heavy: 25
Warhead@2Smu: LeaveSmudge
SmudgeType: Scorch
Warhead@3Eff: CreateEffect
@@ -915,7 +923,7 @@ Laser:
Damage: 360
InfDeath: 5
Versus:
Wood: 50%
Wood: 50
Warhead@2Smu: LeaveSmudge
SmudgeType: Scorch
@@ -937,10 +945,10 @@ SAMMissile:
Spread: 682
ValidTargets: Air
Versus:
None: 100%
Wood: 100%
Light: 100%
Heavy: 75%
None: 100
Wood: 100
Light: 100
Heavy: 75
InfDeath: 4
Damage: 30
Warhead@2Smu: LeaveSmudge
@@ -968,10 +976,10 @@ HonestJohn:
Damage: 100
InfDeath: 3
Versus:
None: 90%
Wood: 75%
Light: 60%
Heavy: 25%
None: 90
Wood: 75
Light: 60
Heavy: 25
Warhead@2Smu: LeaveSmudge
SmudgeType: Crater
Warhead@3Eff: CreateEffect
@@ -992,10 +1000,10 @@ TiberiumExplosion:
Damage: 10
InfDeath: 3
Versus:
None: 90%
Wood: 75%
Light: 60%
Heavy: 25%
None: 90
Wood: 75
Light: 60
Heavy: 25
Warhead@2Res: CreateResource
AddsResourceType: Tiberium
Size: 1,1
@@ -1022,10 +1030,10 @@ APCGun:
Damage: 15
ValidTargets: Ground
Versus:
None: 50%
Wood: 50%
Light: 100%
Heavy: 50%
None: 50
Wood: 50
Light: 100
Heavy: 50
Warhead@2Eff: CreateEffect
Explosion: small_poof
@@ -1042,7 +1050,7 @@ APCGun.AA:
Damage: 25
ValidTargets: Air
Versus:
Heavy: 50%
Heavy: 50
Warhead@2Eff: CreateEffect
Explosion: small_frag
@@ -1065,10 +1073,10 @@ Patriot:
Spread: 682
ValidTargets: Air
Versus:
None: 100%
Wood: 100%
Light: 100%
Heavy: 75%
None: 100
Wood: 100
Light: 100
Heavy: 75
InfDeath: 4
Damage: 32
Warhead@2Smu: LeaveSmudge
@@ -1087,11 +1095,11 @@ Tail:
Damage: 180
InfDeath: 1
Versus:
None: 90%
Wood: 10%
Light: 30%
Heavy: 10%
Concrete: 10%
None: 90
Wood: 10
Light: 30
Heavy: 10
Concrete: 10
Horn:
ReloadDelay: 20
@@ -1103,11 +1111,11 @@ Horn:
Damage: 120
InfDeath: 1
Versus:
None: 90%
Wood: 10%
Light: 30%
Heavy: 10%
Concrete: 10%
None: 90
Wood: 10
Light: 30
Heavy: 10
Concrete: 10
Teeth:
ReloadDelay: 30
@@ -1119,11 +1127,11 @@ Teeth:
Damage: 180
InfDeath: 1
Versus:
None: 90%
Wood: 10%
Light: 30%
Heavy: 10%
Concrete: 10%
None: 90
Wood: 10
Light: 30
Heavy: 10
Concrete: 10
Claw:
ReloadDelay: 10
@@ -1135,11 +1143,11 @@ Claw:
Damage: 60
InfDeath: 1
Versus:
None: 90%
Wood: 10%
Light: 30%
Heavy: 10%
Concrete: 10%
None: 90
Wood: 10
Light: 30
Heavy: 10
Concrete: 10
Demolish:
Warhead@1Dam: SpreadDamage

View File

@@ -13,10 +13,10 @@ LMG:
Damage: 15
InfDeath: 2
Versus:
Wood: 25%
Light: 40%
Heavy: 10%
Concrete: 20%
Wood: 25
Light: 40
Heavy: 10
Concrete: 20
Warhead@2Eff: CreateEffect
Explosion: piffs
@@ -39,11 +39,11 @@ Bazooka:
InfDeath: 4
ValidTargets: Ground
Versus:
None: 10%
Wood: 75%
Light: 60%
Heavy: 90%
Concrete: 40%
None: 10
Wood: 75
Light: 60
Heavy: 90
Concrete: 40
Warhead@2Smu: LeaveSmudge
SmudgeType: SandCrater, RockCrater
Warhead@3Eff: CreateEffect
@@ -65,11 +65,11 @@ Sniper:
Damage: 60
InfDeath: 2
Versus:
None: 100%
Wood: 0%
Light: 1%
Heavy: 0%
Concrete: 0%
None: 100
Wood: 0
Light: 1
Heavy: 0
Concrete: 0
Vulcan:
ReloadDelay: 30
@@ -88,10 +88,10 @@ Vulcan:
InfDeath: 2
ValidTargets: Ground, Air
Versus:
Wood: 0%
Light: 60%
Heavy: 10%
Concrete: 0%
Wood: 0
Light: 60
Heavy: 10
Concrete: 0
Warhead@2Eff: CreateEffect
Explosion: piffs
@@ -114,11 +114,11 @@ Slung:
InfDeath: 4
ValidTargets: Ground
Versus:
None: 0%
Wood: 75%
Light: 40%
Heavy: 90%
Concrete: 50%
None: 0
Wood: 75
Light: 40
Heavy: 90
Concrete: 50
Warhead@2Eff: CreateEffect
Explosion: small_explosion
ImpactSound: EXPLLG5.WAV
@@ -140,10 +140,10 @@ HMG:
Damage: 30
InfDeath: 2
Versus:
Wood: 15%
Light: 45%
Heavy: 20%
Concrete: 20%
Wood: 15
Light: 45
Heavy: 20
Concrete: 20
Warhead@2Eff: CreateEffect
Explosion: piffs
@@ -164,10 +164,10 @@ HMGo:
Damage: 40
InfDeath: 2
Versus:
Wood: 15%
Light: 45%
Heavy: 25%
Concrete: 20%
Wood: 15
Light: 45
Heavy: 25
Concrete: 20
Warhead@2Eff: CreateEffect
Explosion: piffs
@@ -191,11 +191,11 @@ QuadRockets:
InfDeath: 4
ValidTargets: Ground, Air
Versus:
None: 35%
Wood: 45%
Light: 100%
Heavy: 100%
Concrete: 35%
None: 35
Wood: 45
Light: 100
Heavy: 100
Concrete: 35
Warhead@2Smu: LeaveSmudge
SmudgeType: SandCrater, RockCrater
Warhead@3Eff: CreateEffect
@@ -217,10 +217,10 @@ TurretGun:
Damage: 55
InfDeath: 4
Versus:
None: 50%
Wood: 75%
Light: 100%
Concrete: 65%
None: 50
Wood: 75
Light: 100
Concrete: 65
Warhead@2Smu: LeaveSmudge
SmudgeType: SandCrater, RockCrater
Warhead@3Eff: CreateEffect
@@ -251,11 +251,11 @@ TowerMissile:
InfDeath: 3
ValidTargets: Ground, Air
Versus:
None: 50%
Wood: 45%
Light: 100%
Heavy: 50%
Concrete: 35%
None: 50
Wood: 45
Light: 100
Heavy: 50
Concrete: 35
Warhead@2Smu: LeaveSmudge
SmudgeType: SandCrater, RockCrater
Warhead@3Eff: CreateEffect
@@ -275,10 +275,10 @@ TowerMissile:
Damage: 40
InfDeath: 4
Versus:
None: 50%
Wood: 50%
Light: 100%
Concrete: 50%
None: 50
Wood: 50
Light: 100
Concrete: 50
Warhead@2Smu: LeaveSmudge
SmudgeType: SandCrater, RockCrater
Warhead@3Eff: CreateEffect
@@ -298,10 +298,10 @@ TowerMissile:
Damage: 40
InfDeath: 4
Versus:
None: 50%
Wood: 50%
Light: 100%
Concrete: 50%
None: 50
Wood: 50
Light: 100
Concrete: 50
Warhead@2Smu: LeaveSmudge
SmudgeType: SandCrater, RockCrater
Warhead@3Eff: CreateEffect
@@ -320,11 +320,11 @@ DevBullet:
Damage: 100
InfDeath: 4
Versus:
None: 100%
Wood: 50%
Light: 100%
Heavy: 100%
Concrete: 80%
None: 100
Wood: 50
Light: 100
Heavy: 100
Concrete: 80
Warhead@2Smu: LeaveSmudge
SmudgeType: SandCrater, RockCrater
Warhead@3Eff: CreateEffect
@@ -354,11 +354,11 @@ DevBullet:
InfDeath: 4
ValidTargets: Ground
Versus:
None: 20%
Wood: 50%
Light: 100%
Heavy: 50%
Concrete: 80%
None: 20
Wood: 50
Light: 100
Heavy: 50
Concrete: 80
Warhead@2Smu: LeaveSmudge
SmudgeType: SandCrater, RockCrater
Warhead@3Eff: CreateEffect
@@ -383,9 +383,9 @@ FakeMissile:
Spread: 96
Damage: 10
Versus:
None: 0%
Wood: 0%
Concrete: 0%
None: 0
Wood: 0
Concrete: 0
Warhead@2Smu: LeaveSmudge
SmudgeType: SandCrater, RockCrater
Warhead@3Eff: CreateEffect
@@ -410,11 +410,11 @@ FakeMissile:
Damage: 100
InfDeath: 3
Versus:
None: 100%
Wood: 80%
Light: 75%
Heavy: 50%
Concrete: 100%
None: 100
Wood: 80
Light: 75
Heavy: 50
Concrete: 100
Warhead@2Smu: LeaveSmudge
SmudgeType: SandCrater, RockCrater
Warhead@3Eff: CreateEffect
@@ -435,10 +435,10 @@ Sound:
Damage: 150
InfDeath: 6
Versus:
None: 60%
Wood: 85%
Light: 80%
Concrete: 75%
None: 60
Wood: 85
Light: 80
Concrete: 75
ChainGun:
ReloadDelay: 10
@@ -453,10 +453,10 @@ ChainGun:
Damage: 20
InfDeath: 2
Versus:
Wood: 50%
Light: 60%
Heavy: 25%
Concrete: 25%
Wood: 50
Light: 60
Heavy: 25
Concrete: 25
Warhead@2Eff: CreateEffect
Explosion: piffs
@@ -471,10 +471,10 @@ Heal:
Damage: -50
InfDeath: 1
Versus:
Wood: 0%
Light: 0%
Heavy: 0%
Concrete: 0%
Wood: 0
Light: 0
Heavy: 0
Concrete: 0
WormJaw:
ReloadDelay: 10
@@ -484,8 +484,8 @@ WormJaw:
Spread: 160
Damage: 100
Versus:
Wood: 0%
Concrete: 0%
Wood: 0
Concrete: 0
ParaBomb:
ReloadDelay: 10
@@ -495,13 +495,14 @@ ParaBomb:
Image: BOMBS
Warhead@1Dam: SpreadDamage
Spread: 192
Damage: 500
Damage: 50
Falloff: 1000, 368, 135, 50, 18, 7, 0
InfDeath: 4
Versus:
None: 30%
Wood: 75%
Light: 75%
Concrete: 50%
None: 30
Wood: 75
Light: 75
Concrete: 50
Warhead@2Smu: LeaveSmudge
SmudgeType: Crater
Warhead@3Eff: CreateEffect
@@ -515,14 +516,15 @@ Napalm:
Image: BOMBS
Warhead@1Dam: SpreadDamage
Spread: 640
Damage: 300
Damage: 30
Falloff: 1000, 368, 135, 50, 18, 7, 0
InfDeath: 4
Versus:
None: 20%
Wood: 100%
Light: 30%
Heavy: 20%
Concrete: 70%
None: 20
Wood: 100
Light: 30
Heavy: 20
Concrete: 70
Warhead@2Smu: LeaveSmudge
SmudgeType: Crater
Warhead@3Eff: CreateEffect
@@ -544,14 +546,15 @@ Demolish:
Atomic:
Warhead@1Dam: SpreadDamage
Spread: 2c0
Damage: 1800
Damage: 180
Falloff: 1000, 368, 135, 50, 18, 7, 0
InfDeath: 5
Versus:
None: 100%
Wood: 100%
Light: 100%
Heavy: 50%
Concrete: 50%
None: 100
Wood: 100
Light: 100
Heavy: 50
Concrete: 50
Warhead@2Eff: CreateEffect
Explosion: nuke
ImpactSound: EXPLLG2.WAV
@@ -559,14 +562,15 @@ Atomic:
CrateNuke:
Warhead@1Dam: SpreadDamage
Spread: 1c576
Damage: 800
Damage: 80
Falloff: 1000, 368, 135, 50, 18, 7, 0
InfDeath: 5
Versus:
None: 20%
Wood: 75%
Light: 25%
Heavy: 25%
Concrete: 50%
None: 20
Wood: 75
Light: 25
Heavy: 25
Concrete: 50
Warhead@2Eff: CreateEffect
Explosion: nuke
ImpactSound: EXPLLG2.WAV
@@ -574,13 +578,14 @@ CrateNuke:
CrateExplosion:
Warhead@1Dam: SpreadDamage
Spread: 320
Damage: 400
Damage: 40
Falloff: 1000, 368, 135, 50, 18, 7, 0
InfDeath: 4
Versus:
None: 90%
Wood: 75%
Light: 60%
Heavy: 25%
None: 90
Wood: 75
Light: 60
Heavy: 25
Warhead@2Eff: CreateEffect
Explosion: building
ImpactSound: EXPLSML4.WAV
@@ -588,13 +593,14 @@ CrateExplosion:
UnitExplode:
Warhead@1Dam: SpreadDamage
Spread: 320
Damage: 500
Damage: 50
Falloff: 1000, 368, 135, 50, 18, 7, 0
InfDeath: 4
Versus:
None: 90%
Wood: 75%
Light: 60%
Heavy: 25%
None: 90
Wood: 75
Light: 60
Heavy: 25
Warhead@2Eff: CreateEffect
Explosion: building
ImpactSound: EXPLMD1.WAV
@@ -605,10 +611,10 @@ UnitExplodeSmall:
Damage: 60
InfDeath: 4
Versus:
None: 90%
Wood: 75%
Light: 60%
Heavy: 25%
None: 90
Wood: 75
Light: 60
Heavy: 25
Warhead@2Eff: CreateEffect
Explosion: self_destruct
ImpactSound: EXPLHG1.WAV, EXPLLG1.WAV, EXPLMD1.WAV, EXPLSML4.WAV
@@ -619,10 +625,10 @@ UnitExplodeTiny:
Damage: 30
InfDeath: 4
Versus:
None: 90%
Wood: 75%
Light: 60%
Heavy: 25%
None: 90
Wood: 75
Light: 60
Heavy: 25
Warhead@2Eff: CreateEffect
Explosion: med_explosion
ImpactSound: EXPLMD2.WAV, EXPLSML1.WAV, EXPLSML2.WAV, EXPLSML3.WAV
@@ -633,10 +639,10 @@ UnitExplodeScale:
Damage: 90
InfDeath: 4
Versus:
None: 90%
Wood: 75%
Light: 60%
Heavy: 25%
None: 90
Wood: 75
Light: 60
Heavy: 25
Warhead@2Eff: CreateEffect
Explosion: building
ImpactSound: EXPLLG2.WAV, EXPLLG3.WAV, EXPLLG5.WAV
@@ -656,10 +662,10 @@ Grenade:
Damage: 60
InfDeath: 3
Versus:
None: 50%
Wood: 100%
Light: 25%
Heavy: 5%
None: 50
Wood: 100
Light: 25
Heavy: 5
Warhead@2Smu: LeaveSmudge
SmudgeType: SandCrater
Warhead@3Eff: CreateEffect
@@ -686,10 +692,10 @@ Shrapnel:
Damage: 60
InfDeath: 3
Versus:
None: 50%
Wood: 100%
Light: 25%
Heavy: 5%
None: 50
Wood: 100
Light: 25
Heavy: 5
Warhead@2Smu: LeaveSmudge
SmudgeType: SandCrater
Warhead@3Eff: CreateEffect
@@ -702,10 +708,10 @@ SpiceExplosion:
Damage: 10
InfDeath: 3
Versus:
None: 90%
Wood: 75%
Light: 60%
Heavy: 25%
None: 90
Wood: 75
Light: 60
Heavy: 25
Warhead@2Res: CreateResource
AddsResourceType: Spice
Size: 2,2

View File

@@ -316,10 +316,10 @@ Weapons:
Warhead: SpreadDamage
Spread: 128
Versus:
None: 60%
Wood: 75%
Light: 60%
Heavy: 25%
None: 60
Wood: 75
Light: 60
Heavy: 25
InfDeath: 2
Damage: 250
Warhead@1Eff: CreateEffect
@@ -345,9 +345,9 @@ Weapons:
Warhead: SpreadDamage
Spread: 426
Versus:
None: 40%
Light: 30%
Heavy: 30%
None: 40
Light: 30
Heavy: 30
InfDeath: blownaway
Damage: 400
Warhead@1Eff: CreateEffect

View File

@@ -774,10 +774,10 @@ Weapons:
Warhead: SpreadDamage
Spread: 256
Versus:
None: 75%
Wood: 75%
Light: 75%
Concrete: 100%
None: 75
Wood: 75
Light: 75
Concrete: 100
InfDeath: 4
Damage: 150
Warhead@2Smu: LeaveSmudge
@@ -807,11 +807,11 @@ Weapons:
Spread: 640
ValidTargets: Ground, Air
Versus:
None: 125%
Wood: 110%
Light: 110%
Heavy: 100%
Concrete: 200%
None: 125
Wood: 110
Light: 110
Heavy: 100
Concrete: 200
InfDeath: 3
Damage: 250
Warhead@2Smu: LeaveSmudge
@@ -836,11 +836,11 @@ Weapons:
Spread: 341
ValidTargets: Ground
Versus:
None: 90%
Wood: 170%
Light: 100%
Heavy: 100%
Concrete: 100%
None: 90
Wood: 170
Light: 100
Heavy: 100
Concrete: 100
InfDeath: 4
Damage: 15
Warhead@2Smu: LeaveSmudge
@@ -858,10 +858,10 @@ Weapons:
Warhead: SpreadDamage
Spread: 426
Versus:
None: 125%
Wood: 100%
Light: 60%
Concrete: 25%
None: 125
Wood: 100
Light: 60
Concrete: 25
InfDeath: 5
Damage: 200
Warhead@2Smu: LeaveSmudge
@@ -887,11 +887,11 @@ Weapons:
Warhead: SpreadDamage
Spread: 426
Versus:
None: 80%
Wood: 100%
Light: 60%
Heavy: 75%
Concrete: 35%
None: 80
Wood: 100
Light: 60
Heavy: 75
Concrete: 35
InfDeath: 5
Damage: 10
Warhead@2Smu: LeaveSmudge
@@ -912,11 +912,11 @@ Weapons:
Spread: 213
ValidTargets: Air, Ground
Versus:
None: 35%
Wood: 30%
Light: 30%
Heavy: 40%
Concrete: 30%
None: 35
Wood: 30
Light: 30
Heavy: 40
Concrete: 30
Damage: 25
Warhead@2Smu: LeaveSmudge
SmudgeType: Scorch
@@ -940,10 +940,10 @@ Weapons:
Warhead: SpreadDamage
Spread: 853
Versus:
None: 100%
Wood: 90%
Light: 80%
Heavy: 70%
None: 100
Wood: 90
Light: 80
Heavy: 70
InfDeath: 3
Damage: 500
Warhead@2Smu: LeaveSmudge
@@ -962,10 +962,10 @@ Weapons:
Warhead: SpreadDamage
Spread: 128
Versus:
Wood: 0%
Light: 0%
Heavy: 50%
Concrete: 0%
Wood: 0
Light: 0
Heavy: 50
Concrete: 0
InfDeath: 2
Damage: 150
Warhead@2Eff: CreateEffect

View File

@@ -1080,10 +1080,10 @@ Weapons:
Damage: 250
Size: 4
Versus:
None: 90%
Light: 60%
Heavy: 25%
Concrete: 50%
None: 90
Light: 60
Heavy: 25
Concrete: 50
Delay: 12
InfDeath: 4
Warhead@areanuke2Smu: LeaveSmudge
@@ -1101,10 +1101,10 @@ Weapons:
Damage: 250
Size: 3
Versus:
None: 90%
Light: 60%
Heavy: 25%
Concrete: 50%
None: 90
Light: 60
Heavy: 25
Concrete: 50
Delay: 24
InfDeath: 4
Warhead@areanuke3Smu: LeaveSmudge
@@ -1121,10 +1121,10 @@ Weapons:
Warhead@areanuke4: PerCellDamage
Damage: 250
Versus:
None: 90%
Light: 60%
Heavy: 25%
Concrete: 50%
None: 90
Light: 60
Heavy: 25
Concrete: 50
Delay: 36
InfDeath: 4
Warhead@areanuke4Smu: LeaveSmudge

File diff suppressed because it is too large Load Diff

View File

@@ -1,13 +1,14 @@
UnitExplode:
Warhead@1Dam: SpreadDamage
Spread: 426
Damage: 500
Damage: 50
Falloff: 1000, 368, 135, 50, 18, 7, 0
InfDeath: 2
Versus:
None: 90%
Wood: 75%
Light: 60%
Heavy: 25%
None: 90
Wood: 75
Light: 60
Heavy: 25
Warhead@2Eff: CreateEffect
Explosion: large_twlt
ImpactSound: expnew09.aud
@@ -18,10 +19,10 @@ UnitExplodeSmall:
Damage: 40
InfDeath: 2
Versus:
None: 90%
Wood: 75%
Light: 60%
Heavy: 25%
None: 90
Wood: 75
Light: 60
Heavy: 25
Warhead@2Eff: CreateEffect
Explosion: medium_brnl
ImpactSound: expnew13.aud
@@ -38,10 +39,10 @@ Minigun:
InfDeath: 1
ProneModifier: 70
Versus:
Wood: 60%
Light: 40%
Heavy: 25%
Concrete: 10%
Wood: 60
Light: 40
Heavy: 25
Concrete: 10
Warhead@2Eff: CreateEffect
Explosion: piffs
InvalidImpactTypes: Water
@@ -65,11 +66,11 @@ Grenade:
InfDeath: 3
ProneModifier: 70
Versus:
None: 100%
Wood: 85%
Light: 70%
Heavy: 35%
Concrete: 28%
None: 100
Wood: 85
Light: 70
Heavy: 35
Concrete: 28
Warhead@2Eff: CreateEffect
Explosion: large_grey_explosion
ImpactSound: expnew13.aud
@@ -100,11 +101,11 @@ Bazooka:
InfDeath: 2
ValidTargets: Ground, Air
Versus:
None: 25%
Wood: 65%
Light: 75%
Heavy: 100%
Concrete: 60%
None: 25
Wood: 65
Light: 75
Heavy: 100
Concrete: 60
Warhead@2Eff: CreateEffect
Explosion: small_clsn
ImpactSound: expnew12.aud
@@ -139,11 +140,11 @@ MultiCluster:
InfDeath: 3
ValidTargets: Ground
Versus:
None: 25%
Wood: 65%
Light: 75%
Heavy: 100%
Concrete: 60%
None: 25
Wood: 65
Light: 75
Heavy: 100
Concrete: 60
Warhead@2Eff: CreateEffect
Explosion: large_explosion
ImpactSound: expnew09.aud
@@ -165,10 +166,10 @@ Heal:
InfDeath: 1
ProneModifier: 100
Versus:
Wood: 0%
Light: 0%
Heavy: 0%
Concrete: 0%
Wood: 0
Light: 0
Heavy: 0
Concrete: 0
Sniper:
ReloadDelay: 60
@@ -182,11 +183,11 @@ Sniper:
InfDeath: 1
ProneModifier: 100
Versus:
None: 100%
Wood: 0%
Light: 0%
Heavy: 0%
Concrete: 0%
None: 100
Wood: 0
Light: 0
Heavy: 0
Concrete: 0
M1Carbine:
ReloadDelay: 20
@@ -200,10 +201,10 @@ M1Carbine:
InfDeath: 1
ProneModifier: 70
Versus:
Wood: 60%
Light: 40%
Heavy: 25%
Concrete: 10%
Wood: 60
Light: 40
Heavy: 25
Concrete: 10
Warhead@2Eff: CreateEffect
Explosion: piffs
InvalidImpactTypes: Water
@@ -226,11 +227,11 @@ LtRail:
InfDeath: 2
ProneModifier: 100
Versus:
None: 100%
Wood: 130%
Light: 150%
Heavy: 110%
Concrete: 5%
None: 100
Wood: 130
Light: 150
Heavy: 110
Concrete: 5
CyCannon:
ReloadDelay: 50
@@ -249,11 +250,11 @@ CyCannon:
ProneModifier: 100
ValidTargets: Ground
Versus:
None: 100%
Wood: 65%
Light: 75%
Heavy: 50%
Concrete: 40%
None: 100
Wood: 65
Light: 75
Heavy: 50
Concrete: 40
Warhead@2Eff: CreateEffect
Explosion: large_bang
ImpactSound: expnew12.aud
@@ -276,10 +277,10 @@ Vulcan3:
InfDeath: 1
ProneModifier: 70
Versus:
Wood: 60%
Light: 40%
Heavy: 25%
Concrete: 10%
Wood: 60
Light: 40
Heavy: 25
Concrete: 10
Warhead@2Eff: CreateEffect
Explosion: piffs
InvalidImpactTypes: Water
@@ -300,11 +301,11 @@ Vulcan2:
InfDeath: 1
ProneModifier: 70
Versus:
None: 100%
Wood: 60%
Light: 40%
Heavy: 25%
Concrete: 10%
None: 100
Wood: 60
Light: 40
Heavy: 25
Concrete: 10
Warhead@2Eff: CreateEffect
Explosion: piffs
InvalidImpactTypes: Water
@@ -324,10 +325,10 @@ Vulcan:
InfDeath: 1
ProneModifier: 70
Versus:
Wood: 60%
Light: 40%
Heavy: 25%
Concrete: 10%
Wood: 60
Light: 40
Heavy: 25
Concrete: 10
Warhead@2Eff: CreateEffect
Explosion: piffs
InvalidImpactTypes: Water
@@ -352,10 +353,10 @@ FiendShard:
InfDeath: 1
ProneModifier: 100
Versus:
Wood: 60%
Light: 40%
Heavy: 25%
Concrete: 10%
Wood: 60
Light: 40
Heavy: 25
Concrete: 10
Warhead@3EffWater: CreateEffect
Explosion: small_watersplash
ImpactSound: ssplash3.aud
@@ -374,10 +375,10 @@ JumpCannon:
InfDeath: 1
ProneModifier: 70
Versus:
Wood: 60%
Light: 40%
Heavy: 25%
Concrete: 10%
Wood: 60
Light: 40
Heavy: 25
Concrete: 10
Warhead@2Eff: CreateEffect
Explosion: piffs
InvalidImpactTypes: Water
@@ -407,11 +408,11 @@ HoverMissile:
InfDeath: 2
ValidTargets: Ground, Air
Versus:
None: 25%
Wood: 65%
Light: 75%
Heavy: 100%
Concrete: 60%
None: 25
Wood: 65
Light: 75
Heavy: 100
Concrete: 60
Warhead@2Eff: CreateEffect
Explosion: small_clsn
ImpactSound: expnew12.aud
@@ -442,11 +443,11 @@ HoverMissile:
Damage: 50
InfDeath: 2
Versus:
None: 25%
Wood: 65%
Light: 75%
Heavy: 100%
Concrete: 60%
None: 25
Wood: 65
Light: 75
Heavy: 100
Concrete: 60
Warhead@2Eff: CreateEffect
Explosion: medium_clsn
ImpactSound: expnew14.aud
@@ -479,11 +480,11 @@ MammothTusk:
ProneModifier: 70
ValidTargets: Air
Versus:
None: 100%
Wood: 85%
Light: 70%
Heavy: 35%
Concrete: 28%
None: 100
Wood: 85
Light: 70
Heavy: 35
Concrete: 28
Warhead@2Eff: CreateEffect
Explosion: medium_bang
ImpactSound: expnew12.aud
@@ -505,11 +506,11 @@ Repair:
InfDeath: 1
ProneModifier: 100
Versus:
None: 0%
Wood: 0%
Light: 100%
Heavy: 100%
Concrete: 0%
None: 0
Wood: 0
Light: 100
Heavy: 100
Concrete: 0
SlimeAttack:
ReloadDelay: 80
@@ -523,10 +524,10 @@ SlimeAttack:
InfDeath: 2
ProneModifier: 100
Versus:
Wood: 25%
Light: 30%
Heavy: 10%
Concrete: 10%
Wood: 25
Light: 30
Heavy: 10
Concrete: 10
SuicideBomb:
ReloadDelay: 1
@@ -534,13 +535,14 @@ SuicideBomb:
Report: HUNTER2.AUD
Warhead@1Dam: SpreadDamage
Spread: 256
Damage: 11000
Damage: 110
Falloff: 10000, 3680, 1350, 500, 180, 70, 0
InfDeath: 5
Versus:
None: 90%
Light: 60%
Heavy: 25%
Concrete: 50%
None: 90
Light: 60
Heavy: 25
Concrete: 50
Warhead@2Res: DestroyResource
120mm:
@@ -554,11 +556,11 @@ SuicideBomb:
Damage: 70
InfDeath: 2
Versus:
None: 25%
Wood: 65%
Light: 75%
Heavy: 100%
Concrete: 60%
None: 25
Wood: 65
Light: 75
Heavy: 100
Concrete: 60
Warhead@2Eff: CreateEffect
Explosion: large_clsn
ImpactSound: expnew14.aud
@@ -583,11 +585,11 @@ MechRailgun:
InfDeath: 5
ProneModifier: 100
Versus:
None: 200%
Wood: 175%
Light: 160%
Heavy: 100%
Concrete: 25%
None: 200
Wood: 175
Light: 160
Heavy: 100
Concrete: 25
AssaultCannon:
ReloadDelay: 50
@@ -601,10 +603,10 @@ AssaultCannon:
InfDeath: 1
ProneModifier: 70
Versus:
Wood: 60%
Light: 40%
Heavy: 25%
Concrete: 10%
Wood: 60
Light: 40
Heavy: 25
Concrete: 10
Warhead@2Eff: CreateEffect
Explosion: piffs
InvalidImpactTypes: Water
@@ -635,11 +637,11 @@ BikeMissile:
InfDeath: 2
ValidTargets: Ground
Versus:
None: 25%
Wood: 65%
Light: 75%
Heavy: 100%
Concrete: 60%
None: 25
Wood: 65
Light: 75
Heavy: 100
Concrete: 60
Warhead@2Eff: CreateEffect
Explosion: small_clsn
ImpactSound: expnew12.aud
@@ -663,10 +665,10 @@ RaiderCannon:
InfDeath: 1
ProneModifier: 70
Versus:
Wood: 60%
Light: 40%
Heavy: 25%
Concrete: 10%
Wood: 60
Light: 40
Heavy: 25
Concrete: 10
Warhead@2Eff: CreateEffect
Explosion: piffs
InvalidImpactTypes: Water
@@ -690,11 +692,11 @@ FireballLauncher:
InfDeath: 5
ProneModifier: 100
Versus:
None: 600%
Wood: 148%
Light: 59%
Heavy: 6%
Concrete: 2%
None: 600
Wood: 148
Light: 59
Heavy: 6
Concrete: 2
SonicZap:
ReloadDelay: 120
@@ -710,8 +712,8 @@ SonicZap:
Damage: 100
InfDeath: 5
Versus:
Heavy: 80%
Concrete: 60%
Heavy: 80
Concrete: 60
Dragon:
ReloadDelay: 50
@@ -735,11 +737,11 @@ Dragon:
InfDeath: 2
ValidTargets: Ground, Air
Versus:
None: 25%
Wood: 65%
Light: 75%
Heavy: 100%
Concrete: 60%
None: 25
Wood: 65
Light: 75
Heavy: 100
Concrete: 60
Warhead@2Eff: CreateEffect
Explosion: small_clsn
ImpactSound: expnew12.aud
@@ -768,11 +770,11 @@ Dragon:
Damage: 36
InfDeath: 2
Versus:
None: 25%
Wood: 65%
Light: 75%
Heavy: 100%
Concrete: 60%
None: 25
Wood: 65
Light: 75
Heavy: 100
Concrete: 60
Warhead@2Eff: CreateEffect
Explosion: medium_clsn
ImpactSound: expnew14.aud
@@ -800,11 +802,11 @@ Dragon:
InfDeath: 3
ProneModifier: 100
Versus:
None: 100%
Wood: 85%
Light: 68%
Heavy: 35%
Concrete: 35%
None: 100
Wood: 85
Light: 68
Heavy: 35
Concrete: 35
Warhead@2Eff: CreateEffect
Explosion: large_explosion
ImpactSound: expnew06.aud
@@ -836,11 +838,11 @@ Hellfire:
InfDeath: 2
ValidTargets: Ground, Air
Versus:
None: 30%
Wood: 65%
Light: 150%
Heavy: 100%
Concrete: 30%
None: 30
Wood: 65
Light: 150
Heavy: 100
Concrete: 30
Warhead@2Eff: CreateEffect
Explosion: small_bang
ImpactSound: expnew12.aud
@@ -868,11 +870,11 @@ Bomb:
InfDeath: 3
ProneModifier: 100
Versus:
None: 200%
Wood: 90%
Light: 75%
Heavy: 32%
Concrete: 100%
None: 200
Wood: 90
Light: 75
Heavy: 32
Concrete: 100
Warhead@2Eff: CreateEffect
Explosion: large_explosion
ImpactSound: expnew09.aud
@@ -903,11 +905,11 @@ Proton:
InfDeath: 3
ValidTargets: Ground, Air
Versus:
None: 25%
Wood: 65%
Light: 75%
Heavy: 100%
Concrete: 60%
None: 25
Wood: 65
Light: 75
Heavy: 100
Concrete: 60
Warhead@2Eff: CreateEffect
Explosion: small_bang
ImpactSound: expnew12.aud
@@ -931,10 +933,10 @@ HarpyClaw:
ProneModifier: 70
ValidTargets: Ground, Air
Versus:
Wood: 60%
Light: 40%
Heavy: 25%
Concrete: 10%
Wood: 60
Light: 40
Heavy: 25
Concrete: 10
Warhead@2Eff: CreateEffect
Explosion: piffs
InvalidImpactTypes: Water
@@ -954,10 +956,10 @@ Pistola:
InfDeath: 1
ProneModifier: 70
Versus:
Wood: 60%
Light: 40%
Heavy: 25%
Concrete: 10%
Wood: 60
Light: 40
Heavy: 25
Concrete: 10
Warhead@2Eff: CreateEffect
Explosion: piff
InvalidImpactTypes: Water
@@ -985,7 +987,8 @@ IonCannon:
ValidTargets: Ground, Air
Warhead@1Dam_impact: SpreadDamage
Spread: 1c0
Damage: 1000
Damage: 100
Falloff: 1000, 368, 135, 50, 18, 7, 0
InfDeath: 5
ProneModifier: 100
ValidTargets: Ground, Air
@@ -1013,10 +1016,10 @@ VulcanTower:
Damage: 18
InfDeath: 1
Versus:
Wood: 60%
Light: 40%
Heavy: 25%
Concrete: 10%
Wood: 60
Light: 40
Heavy: 25
Concrete: 10
Warhead@2Eff: CreateEffect
Explosion: piffs
InvalidImpactTypes: Water
@@ -1041,11 +1044,11 @@ RPGTower:
InfDeath: 2
ProneModifier: 70
Versus:
None: 30%
Wood: 75%
Light: 90%
Heavy: 100%
Concrete: 70%
None: 30
Wood: 75
Light: 90
Heavy: 100
Concrete: 70
Warhead@2Eff: CreateEffect
Explosion: large_clsn
ImpactSound: expnew14.aud
@@ -1115,10 +1118,10 @@ TiberiumExplosion:
Damage: 10
InfDeath: 3
Versus:
None: 90%
Wood: 75%
Light: 60%
Heavy: 25%
None: 90
Wood: 75
Light: 60
Heavy: 25
Warhead@2Res: CreateResource
AddsResourceType: Tiberium
Size: 1,1