Explodes trait has new 'DamageThreshold' property.

An actor will explode when its health is below the
defined percentage of its max health.
This commit is contained in:
DArcy Rush
2015-10-22 23:56:07 +01:00
parent b30fc2c725
commit c0850e44f4

View File

@@ -18,7 +18,7 @@ using OpenRA.Traits;
namespace OpenRA.Mods.Common.Traits namespace OpenRA.Mods.Common.Traits
{ {
[Desc("This actor explodes when killed.")] [Desc("This actor explodes when killed.")]
public class ExplodesInfo : ITraitInfo, IRulesetLoaded public class ExplodesInfo : ITraitInfo, IRulesetLoaded, Requires<HealthInfo>
{ {
[WeaponReference, FieldLoader.Require, Desc("Weapon to use for explosion if ammo/payload is loaded.")] [WeaponReference, FieldLoader.Require, Desc("Weapon to use for explosion if ammo/payload is loaded.")]
public readonly string Weapon = "UnitExplode"; public readonly string Weapon = "UnitExplode";
@@ -32,13 +32,16 @@ namespace OpenRA.Mods.Common.Traits
[Desc("Chance that this actor will explode at all.")] [Desc("Chance that this actor will explode at all.")]
public readonly int Chance = 100; public readonly int Chance = 100;
[Desc("Health level at which actor will explode.")]
public readonly int DamageThreshold = 0;
[Desc("DeathType(s) to apply upon explosion.")] [Desc("DeathType(s) to apply upon explosion.")]
public readonly HashSet<string> DeathType = new HashSet<string>(); public readonly HashSet<string> DeathType = new HashSet<string>();
public WeaponInfo WeaponInfo { get; private set; } public WeaponInfo WeaponInfo { get; private set; }
public WeaponInfo EmptyWeaponInfo { get; private set; } public WeaponInfo EmptyWeaponInfo { get; private set; }
public object Create(ActorInitializer init) { return new Explodes(this); } public object Create(ActorInitializer init) { return new Explodes(this, init.Self); }
public void RulesetLoaded(Ruleset rules, ActorInfo ai) public void RulesetLoaded(Ruleset rules, ActorInfo ai)
{ {
WeaponInfo = string.IsNullOrEmpty(Weapon) ? null : rules.Weapons[Weapon.ToLowerInvariant()]; WeaponInfo = string.IsNullOrEmpty(Weapon) ? null : rules.Weapons[Weapon.ToLowerInvariant()];
@@ -46,11 +49,17 @@ namespace OpenRA.Mods.Common.Traits
} }
} }
public class Explodes : INotifyKilled public class Explodes : INotifyKilled, INotifyDamage
{ {
readonly ExplodesInfo info; readonly ExplodesInfo info;
public Explodes(ExplodesInfo info) { this.info = info; } readonly Health health;
public Explodes(ExplodesInfo info, Actor self)
{
this.info = info;
health = self.Trait<Health>();
}
public void Killed(Actor self, AttackInfo e) public void Killed(Actor self, AttackInfo e)
{ {
@@ -81,5 +90,14 @@ namespace OpenRA.Mods.Common.Traits
var useFullExplosion = self.World.SharedRandom.Next(100) <= info.LoadedChance; var useFullExplosion = self.World.SharedRandom.Next(100) <= info.LoadedChance;
return (shouldExplode && useFullExplosion) ? info.WeaponInfo : info.EmptyWeaponInfo; return (shouldExplode && useFullExplosion) ? info.WeaponInfo : info.EmptyWeaponInfo;
} }
public void Damaged(Actor self, AttackInfo e)
{
if (info.DamageThreshold == 0)
return;
if (health.HP * 100 < info.DamageThreshold * health.MaxHP)
self.World.AddFrameEndTask(w => self.Kill(e.Attacker));
}
} }
} }