Merge pull request #9730 from r34ch/fake-structures-detonate

Fake structures detonate to mask health difference.
This commit is contained in:
atlimit8
2015-10-25 09:12:02 -05:00
4 changed files with 61 additions and 5 deletions

View File

@@ -18,7 +18,7 @@ using OpenRA.Traits;
namespace OpenRA.Mods.Common.Traits
{
[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.")]
public readonly string Weapon = "UnitExplode";
@@ -32,13 +32,16 @@ namespace OpenRA.Mods.Common.Traits
[Desc("Chance that this actor will explode at all.")]
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.")]
public readonly HashSet<string> DeathType = new HashSet<string>();
public WeaponInfo WeaponInfo { 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)
{
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;
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)
{
@@ -81,5 +90,14 @@ namespace OpenRA.Mods.Common.Traits
var useFullExplosion = self.World.SharedRandom.Next(100) <= info.LoadedChance;
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));
}
}
}

View File

@@ -237,7 +237,6 @@ V19.Husk:
WithIdleOverlay:
StartSequence: fire-start
Sequence: fire-loop
-Health:
-Selectable:
-Targetable:
-Demolishable:

View File

@@ -506,6 +506,9 @@
-GivesBuildableArea:
Health:
HP: 100
Explodes:
Weapon: Demolish
DamageThreshold: 90
RevealsShroud:
Range: 4c0
Fake:

View File

@@ -19,6 +19,10 @@ FACF:
Image: FACT
Valued:
Cost: 250
Health:
HP: 1500
Armor:
Type: Wood
WEAF:
Inherits: ^FakeBuilding
@@ -43,6 +47,10 @@ WEAF:
Sequence: build-top
Valued:
Cost: 200
Health:
HP: 1500
Armor:
Type: Wood
SYRF:
Inherits: ^FakeBuilding
@@ -68,6 +76,10 @@ SYRF:
Image: SYRD
Valued:
Cost: 100
Health:
HP: 1000
Armor:
Type: Light
EditorTilesetFilter:
ExcludeTilesets: INTERIOR
@@ -95,6 +107,10 @@ SPEF:
Image: SPEN
Valued:
Cost: 100
Health:
HP: 1000
Armor:
Type: Light
EditorTilesetFilter:
ExcludeTilesets: INTERIOR
@@ -119,6 +135,10 @@ DOMF:
Image: DOME
Valued:
Cost: 180
Health:
HP: 1000
Armor:
Type: Wood
RequiresPower:
DisabledOverlay:
@@ -143,6 +163,10 @@ ATEF:
Image: ATEK
Valued:
Cost: 150
Health:
HP: 400
Armor:
Type: Wood
RequiresPower:
DisabledOverlay:
@@ -169,6 +193,12 @@ PDOF:
HasMinibib: Yes
Valued:
Cost: 150
Health:
HP: 1000
Armor:
Type: Wood
Explodes:
DamageThreshold: 50
RequiresPower:
DisabledOverlay:
@@ -193,6 +223,12 @@ MSLF:
Image: MSLO
Valued:
Cost: 250
Health:
HP: 1000
Armor:
Type: Wood
Explodes:
DamageThreshold: 50
RequiresPower:
DisabledOverlay: