Merge pull request #6396 from reaperrr/with-deathanim

Added WithDeathAnimation
This commit is contained in:
Paul Chote
2014-09-14 10:37:07 +12:00
18 changed files with 369 additions and 202 deletions

View File

@@ -0,0 +1,74 @@
#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.Linq;
using OpenRA.Mods.RA.Move;
using OpenRA.Mods.RA.Render;
using OpenRA.Traits;
namespace OpenRA.Mods.RA
{
[Desc("This actor is crushable.")]
class CrushableInfo : ITraitInfo
{
[Desc("Sound to play when being crushed.")]
public readonly string CrushSound = null;
[Desc("Which crush classes does this actor belong to.")]
public readonly string[] CrushClasses = { "infantry" };
[Desc("Probability of mobile actors noticing and evading a crush attempt.")]
public readonly int WarnProbability = 75;
[Desc("Will friendly units just crush me instead of pathing around.")]
public readonly bool CrushedByFriendlies = false;
public object Create(ActorInitializer init) { return new Crushable(init.self, this); }
}
class Crushable : ICrushable
{
readonly Actor self;
readonly CrushableInfo info;
public Crushable(Actor self, CrushableInfo info)
{
this.self = self;
this.info = info;
}
public void WarnCrush(Actor crusher)
{
var mobile = self.TraitOrDefault<Mobile>();
if (mobile != null && self.World.SharedRandom.Next(100) <= info.WarnProbability)
mobile.Nudge(self, crusher, true);
}
public void OnCrush(Actor crusher)
{
Sound.Play(info.CrushSound, crusher.CenterPosition);
var wda = self.TraitOrDefault<WithDeathAnimation>();
if (wda != null)
{
var palette = wda.Info.DeathSequencePalette;
if (wda.Info.DeathPaletteIsPlayerPalette)
palette += self.Owner.InternalName;
wda.SpawnDeathAnimation(self, wda.Info.CrushedSequence, palette);
}
self.Kill(crusher);
}
public bool CrushableBy(string[] crushClasses, Player crushOwner)
{
if (!info.CrushedByFriendlies && crushOwner.IsAlliedWith(self.Owner))
return false;
return info.CrushClasses.Intersect(crushClasses).Any();
}
}
}

View File

@@ -1,61 +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.Linq;
using OpenRA.Mods.RA.Move;
using OpenRA.Mods.RA.Render;
using OpenRA.Traits;
namespace OpenRA.Mods.RA
{
class CrushableInfantryInfo : ITraitInfo, Requires<MobileInfo>, Requires<RenderInfantryInfo>
{
public readonly string CrushSound = null;
public readonly string CorpseSequence = "die-crushed";
public readonly string[] CrushClasses = { "infantry" };
public readonly int WarnProbability = 75;
public object Create(ActorInitializer init) { return new CrushableInfantry(init.self, this); }
}
class CrushableInfantry : ICrushable
{
readonly Actor self;
readonly CrushableInfantryInfo Info;
readonly RenderInfantry ri;
public CrushableInfantry(Actor self, CrushableInfantryInfo info)
{
this.self = self;
this.Info = info;
ri = self.Trait<RenderInfantry>();
}
public void WarnCrush(Actor crusher)
{
if (self.World.SharedRandom.Next(100) <= Info.WarnProbability)
self.Trait<Mobile>().Nudge(self, crusher, true);
}
public void OnCrush(Actor crusher)
{
Sound.Play(Info.CrushSound, crusher.CenterPosition);
ri.SpawnCorpse(self, Info.CorpseSequence);
self.Kill(crusher);
}
public bool CrushableBy(string[] crushClasses, Player crushOwner)
{
if (crushOwner.Stances[self.Owner] == Stance.Ally)
return false;
return Info.CrushClasses.Intersect(crushClasses).Any();
}
}
}

View File

@@ -209,7 +209,7 @@
<Compile Include="Crates\RevealMapCrateAction.cs" />
<Compile Include="Crates\SupportPowerCrateAction.cs" />
<Compile Include="CreateMPPlayers.cs" />
<Compile Include="CrushableInfantry.cs" />
<Compile Include="Crushable.cs" />
<Compile Include="DeathSounds.cs" />
<Compile Include="DemoTruck.cs" />
<Compile Include="DetectCloaked.cs" />
@@ -331,6 +331,7 @@
<Compile Include="Render\RenderUnit.cs" />
<Compile Include="Render\RenderUnitReload.cs" />
<Compile Include="Render\WithBuildingExplosion.cs" />
<Compile Include="Render\WithDeathAnimation.cs" />
<Compile Include="Render\WithMuzzleFlash.cs" />
<Compile Include="Render\RenderNameTag.cs" />
<Compile Include="Render\WithRotor.cs" />

View File

@@ -21,10 +21,8 @@ namespace OpenRA.Mods.RA.Render
{
public readonly int MinIdleWaitTicks = 30;
public readonly int MaxIdleWaitTicks = 110;
public readonly bool SpawnsCorpse = true;
public readonly string MoveAnimation = "run";
public readonly string AttackAnimation = "shoot";
public readonly string DeathAnimationPrefix = "die";
public readonly string[] IdleAnimations = { };
public readonly string[] StandAnimations = { "stand" };
@@ -48,7 +46,7 @@ namespace OpenRA.Mods.RA.Render
}
}
public class RenderInfantry : RenderSimple, INotifyAttack, INotifyKilled, INotifyIdle
public class RenderInfantry : RenderSimple, INotifyAttack, INotifyIdle
{
readonly RenderInfantryInfo info;
readonly IMove move;
@@ -151,29 +149,6 @@ namespace OpenRA.Mods.RA.Render
}
}
// TODO: Possibly move this into a separate trait
public void Killed(Actor self, AttackInfo e)
{
// Killed by some non-standard means
if (e.Warhead == null)
return;
if (info.SpawnsCorpse)
{
SpawnCorpse(self, info.DeathAnimationPrefix + (e.Warhead.DeathType));
}
}
public void SpawnCorpse(Actor self, string sequence)
{
self.World.AddFrameEndTask(w =>
{
if (!self.Destroyed)
w.Add(new Corpse(w, self.CenterPosition, GetImage(self),
sequence, info.PlayerPalette + self.Owner.InternalName));
});
}
enum AnimationState
{
Idle,

View File

@@ -0,0 +1,75 @@
#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.Linq;
using OpenRA.Mods.RA.Effects;
using OpenRA.Mods.RA.Render;
using OpenRA.Traits;
namespace OpenRA.Mods.RA.Render
{
[Desc("This actor has a death animation.")]
public class WithDeathAnimationInfo : ITraitInfo, Requires<RenderSimpleInfo>
{
[Desc("Sequence to play when this actor is killed by a warhead.")]
public readonly string DeathSequence = "die";
public readonly string DeathSequencePalette = "player";
[Desc("Custom death animation palette is a player palette BaseName")]
public readonly bool DeathPaletteIsPlayerPalette = true;
[Desc("Should DeathType-specific sequences be used (sequence name = DeathSequence + DeathType).")]
public readonly bool UseDeathTypeSuffix = true;
[Desc("Sequence to play when this actor is crushed.")]
public readonly string CrushedSequence = "die-crushed";
public readonly string CrushedSequencePalette = "effect";
[Desc("Custom crushed animation palette is a player palette BaseName")]
public readonly bool CrushedPaletteIsPlayerPalette = false;
public object Create(ActorInitializer init) { return new WithDeathAnimation(init.self, this); }
}
public class WithDeathAnimation : INotifyKilled
{
public readonly WithDeathAnimationInfo Info;
readonly RenderSimple renderSimple;
public WithDeathAnimation(Actor self, WithDeathAnimationInfo info)
{
Info = info;
renderSimple = self.Trait<RenderSimple>();
}
public void Killed(Actor self, AttackInfo e)
{
// Killed by some non-standard means. This includes being crushed
// by a vehicle (Actors with Crushable trait will spawn CrushedSequence instead).
if (e.Warhead == null)
return;
var sequence = Info.DeathSequence;
if (Info.UseDeathTypeSuffix)
sequence += e.Warhead.DeathType;
var palette = Info.DeathSequencePalette;
if (Info.DeathPaletteIsPlayerPalette)
palette += self.Owner.InternalName;
SpawnDeathAnimation(self, sequence, palette);
}
public void SpawnDeathAnimation(Actor self, string sequence, string palette)
{
self.World.AddFrameEndTask(w =>
{
if (!self.Destroyed)
w.Add(new Corpse(w, self.CenterPosition, renderSimple.GetImage(self), sequence, palette));
});
}
}
}

View File

@@ -477,11 +477,9 @@ namespace OpenRA.Utility
// InfDeath was renamed to DeathType
if (engineVersion < 20140830)
{
if (depth == 1 && parentKey.StartsWith("DeathSounds"))
{
if (depth == 2 && node.Key == "InfDeaths")
node.Key = "DeathTypes";
}
if (depth == 2 && parentKey.StartsWith("DeathSounds") && node.Key == "InfDeaths")
node.Key = "DeathTypes";
if (depth == 2 && parentKey == "SpawnsViceroid" && node.Key == "InfDeath")
node.Key = "DeathType";
@@ -527,6 +525,28 @@ namespace OpenRA.Utility
node.Key = "ValidTargets";
}
// Added WithDeathAnimation
if (engineVersion < 20140913)
{
var spawnsCorpseRemoval = node.Value.Nodes.FirstOrDefault(n => n.Key == "SpawnsCorpse");
if (depth == 0 && node.Value.Nodes.Any(n => n.Key.StartsWith("RenderInfantry")) && spawnsCorpseRemoval == null)
node.Value.Nodes.Add(new MiniYamlNode("WithDeathAnimation", new MiniYaml("")));
if (depth == 2 && node.Key == "SpawnsCorpse" && parentKey == "RenderInfantry")
node.Value.Nodes.Remove(spawnsCorpseRemoval);
// CrushableInfantry renamed to Crushable
if (depth == 1)
{
if (node.Key == "CrushableInfantry")
node.Key = "Crushable";
if (node.Key == "-CrushableInfantry")
node.Key = "-Crushable";
}
}
UpgradeActorRules(engineVersion, ref node.Value.Nodes, node, depth + 1);
}
}

View File

@@ -153,6 +153,7 @@
TakeCover:
SpeedModifier: 60
RenderInfantry:
WithDeathAnimation:
AttackMove:
Passenger:
CargoType: Infantry
@@ -164,7 +165,7 @@
ActorLostNotification:
SpawnViceroid:
Probability: 10
CrushableInfantry:
Crushable:
WarnProbability: 67
CrushSound: squish2.aud
CombatDebugOverlay:
@@ -197,7 +198,6 @@
Inherits: ^Infantry
-AutoTarget:
-TakeCover:
RenderInfantry:
AppearsOnRadar:
SelectionDecorations:
Selectable:
@@ -220,7 +220,7 @@
Notification: CivilianKilled
NotifyAll: true
ScaredyCat:
CrushableInfantry:
Crushable:
CrushSound: squish2.aud
^DINO:
@@ -257,6 +257,8 @@
GivesExperience:
RenderInfantry:
Palette: terrain
WithDeathAnimation:
UseDeathTypeSuffix: false
EditorAppearance:
UseTerrainPalette: true
BodyOrientation:

View File

@@ -228,6 +228,9 @@ STEG:
Description: A large, heavily built, herbivorous quadruped
Armament:
Weapon: tail
WithDeathAnimation:
DeathSequencePalette: terrain
DeathPaletteIsPlayerPalette: false
TREX:
Inherits: ^DINO

View File

@@ -13,22 +13,7 @@ steg:
Start: 80
Length: 12
Facings: 8
die1:
Start: 176
Length: 22
die2:
Start: 176
Length: 22
die3:
Start: 176
Length: 22
die4:
Start: 176
Length: 22
die5:
Start: 176
Length: 22
die6:
die:
Start: 176
Length: 22
icon: stegicnh
@@ -49,22 +34,7 @@ trex:
Start: 80
Length: 8
Facings: 8
die1:
Start: 144
Length: 40
die2:
Start: 144
Length: 40
die3:
Start: 144
Length: 40
die4:
Start: 144
Length: 40
die5:
Start: 144
Length: 40
die6:
die:
Start: 144
Length: 40
icon: trexicnh
@@ -85,22 +55,7 @@ tric:
Start: 80
Length: 12
Facings: 8
die1:
Start: 176
Length: 20
die2:
Start: 176
Length: 20
die3:
Start: 176
Length: 20
die4:
Start: 176
Length: 20
die5:
Start: 176
Length: 20
die6:
die:
Start: 176
Length: 20
icon: tricicnh
@@ -121,22 +76,7 @@ rapt:
Start: 80
Length: 8
Facings: 8
die1:
Start: 144
Length: 40
die2:
Start: 144
Length: 40
die3:
Start: 144
Length: 40
die4:
Start: 144
Length: 40
die5:
Start: 144
Length: 40
die6:
die:
Start: 144
Length: 40
icon: rapticnh

View File

@@ -171,6 +171,7 @@ e1:
Start: 16
Length: 4
Tick: 1600
ZOffset: -511
icon: e1icnh
Start: 0
@@ -260,6 +261,7 @@ e2:
Start: 16
Length: 4
Tick: 1600
ZOffset: -511
icon: e2icnh
Start: 0
@@ -349,6 +351,7 @@ e3:
Start: 16
Length: 4
Tick: 1600
ZOffset: -511
icon: e3icnh
Start: 0
@@ -438,6 +441,7 @@ e4:
Start: 16
Length: 4
Tick: 1600
ZOffset: -511
muzzle0: flame-n
Start: 0
Length: *
@@ -559,6 +563,7 @@ e5:
Start: 16
Length: 4
Tick: 1600
ZOffset: -511
muzzle0: chem-n
Start: 0
Length: *
@@ -672,6 +677,7 @@ e6:
Start: 16
Length: 4
Tick: 1600
ZOffset: -511
icon: e6icnh
Start: 0
@@ -765,5 +771,6 @@ rmbo:
Start: 16
Length: 4
Tick: 1600
ZOffset: -511
icon: rmboicnh
Start: 0

View File

@@ -172,6 +172,7 @@
TargetTypes: Ground
RenderInfantry:
TakeCover:
WithDeathAnimation:
AutoTarget:
AttackMove:
Passenger:
@@ -185,7 +186,7 @@
ProximityCaptor:
Types: Infantry
GivesBounty:
CrushableInfantry:
Crushable:
CrushSound: CRUSH1.WAV
RepairableNear:
Buildings: barra, barro

View File

@@ -139,6 +139,7 @@
TargetableUnit:
TargetTypes: Ground, Infantry, Disguise
RenderInfantry:
WithDeathAnimation:
AutoTarget:
AttackMove:
Passenger:
@@ -153,7 +154,7 @@
GivesBounty:
GpsDot:
String: Infantry
CrushableInfantry:
Crushable:
CrushSound: squishy2.aud
UpdatesPlayerStatistics:
CombatDebugOverlay:

View File

@@ -566,4 +566,6 @@ Ant:
AttackFrontal:
Armament:
Weapon: mandible
WithDeathAnimation:
UseDeathTypeSuffix: false

View File

@@ -64,6 +64,7 @@ e1:
Start: 0
Length: 6
Tick: 1600
ZOffset: -511
garrison-muzzle: minigun
Start: 0
Length: 6
@@ -136,6 +137,7 @@ sniper:
Start: 0
Length: 6
Tick: 1600
ZOffset: -511
garrison-muzzle: minigun
Start: 0
Length: 3
@@ -190,6 +192,7 @@ e3:
Start: 0
Length: 6
Tick: 1600
ZOffset: -511
prone-stand:
Start: 144
Length: 4
@@ -248,6 +251,7 @@ e6:
Start: 0
Length: 6
Tick: 1600
ZOffset: -511
prone-stand:
Start: 82
Length: 4
@@ -310,6 +314,7 @@ medi:
Start: 0
Length: 6
Tick: 1600
ZOffset: -511
prone-stand:
Start: 130
Length: 4
@@ -372,6 +377,7 @@ mech:
Start: 0
Length: 6
Tick: 1600
ZOffset: -511
prone-stand:
Start: 130
Length: 4
@@ -430,6 +436,7 @@ e2:
Start: 0
Length: 6
Tick: 1600
ZOffset: -511
prone-stand:
Start: 240
Length: 4
@@ -488,6 +495,7 @@ dog:
Start: 0
Length: 6
Tick: 1600
ZOffset: -511
shoot: dogbullt
Start: 0
Length: 4
@@ -541,6 +549,7 @@ spy:
Start: 0
Length: 6
Tick: 1600
ZOffset: -511
prone-stand:
Start: 144
Length: 4
@@ -591,6 +600,7 @@ thf:
Start: 0
Length: 6
Tick: 1600
ZOffset: -511
crawl:
Start: 72
Length: 4
@@ -632,6 +642,7 @@ hijacker:
Start: 0
Length: 6
Tick: 1600
ZOffset: -511
crawl: thf
Start: 72
Length: 4
@@ -685,6 +696,7 @@ e7:
Start: 0
Length: 6
Tick: 1600
ZOffset: -511
prone-stand:
Start: 128
Length: 4
@@ -752,6 +764,7 @@ e4:
Start: 0
Length: 6
Tick: 1600
ZOffset: -511
prone-stand:
Start: 208
Length: 4
@@ -826,6 +839,7 @@ gnrl:
Start: 0
Length: 6
Tick: 1600
ZOffset: -511
shok:
stand:
@@ -893,6 +907,7 @@ shok:
Start: 0
Length: 6
Tick: 1600
ZOffset: -511
icon: shokicon
Start: 0
@@ -937,6 +952,7 @@ c1:
Start: 0
Length: 6
Tick: 1600
ZOffset: -511
run:
Start: 56
Length: 6
@@ -984,6 +1000,7 @@ c2:
Start: 0
Length: 6
Tick: 1600
ZOffset: -511
run:
Start: 56
Length: 6
@@ -1031,6 +1048,7 @@ c3:
Start: 0
Length: 6
Tick: 1600
ZOffset: -511
run:
Start: 56
Length: 6
@@ -1079,6 +1097,7 @@ einstein:
Start: 0
Length: 6
Tick: 1600
ZOffset: -511
delphi:
stand:
@@ -1122,6 +1141,7 @@ delphi:
Start: 0
Length: 6
Tick: 1600
ZOffset: -511
chan:
stand:
@@ -1165,6 +1185,7 @@ chan:
Start: 0
Length: 6
Tick: 1600
ZOffset: -511
zombie:
stand:
@@ -1207,6 +1228,7 @@ zombie:
Start: 0
Length: 6
Tick: 1600
ZOffset: -511
icon: zombicon
Start: 0
@@ -1225,33 +1247,14 @@ ant:
Start: 72
Length: 4
Facings: 8
die1:
Start: 104
Length: 8
Tick: 300
die2:
Start: 104
Length: 8
Tick: 300
die3:
Start: 104
Length: 8
Tick: 300
die4:
Start: 104
Length: 8
Tick: 300
die5:
Start: 104
Length: 8
Tick: 300
die6:
die:
Start: 104
Length: 8
Tick: 300
die-crushed:
Start: 104
Length: 8
Tick: 300
Tick: 400
ZOffset: -511
icon: anticon
Start: 0
Start: 0

View File

@@ -108,6 +108,7 @@
TargetableUnit:
TargetTypes: Ground
RenderInfantry:
WithDeathAnimation:
AutoTarget:
AttackMove:
Passenger:
@@ -129,7 +130,7 @@
ProximityCaptor:
Types: Infantry
GivesBounty:
CrushableInfantry:
Crushable:
CrushSound: squish6.aud
PoisonedByTiberium:
SpawnViceroid:

View File

@@ -93,7 +93,7 @@ WEEDGUY:
Speed: 42
Health:
HP: 130
CrushableInfantry:
Crushable:
CrushSound: squishy2.aud
Armament:
Weapon: FireballLauncher
@@ -120,7 +120,7 @@ MEDIC:
Speed: 56
Health:
HP: 125
CrushableInfantry:
Crushable:
CrushSound: squishy2.aud
Armament:
Weapon: Heal
@@ -220,7 +220,7 @@ GHOST:
Armament:
Weapon: LtRail
LocalOffset: 85,0,384
CrushableInfantry:
Crushable:
CrushSound: squishy2.aud
AttackFrontal:
C4Demolition:
@@ -254,7 +254,7 @@ JUMPJET:
Range: 6c0
Armament:
Weapon: JumpCannon
-CrushableInfantry:
-Crushable:
AttackFrontal:
TakeCover:
RenderInfantry:
@@ -302,7 +302,7 @@ CYBORG:
Queue: Infantry
BuildPaletteOrder: 50
Owner: nod
-CrushableInfantry:
-Crushable:
Selectable:
Bounds: 14,30,0,-7
Voice: Cyborg
@@ -335,7 +335,7 @@ CYC2:
Queue: Infantry
BuildPaletteOrder: 50
Owner: nod
-CrushableInfantry:
-Crushable:
Selectable:
Bounds: 14,30,0,-7
Voice: CyborgCommando
@@ -595,7 +595,7 @@ VISSML:
Mobile:
Speed: 113
ROT: 16
-CrushableInfantry:
-Crushable:
Selectable:
Voice: Fiend
TargetableUnit:
@@ -625,7 +625,7 @@ VISLRG:
Mobile:
Speed: 113
ROT: 16
-CrushableInfantry:
-Crushable:
Selectable:
Voice: Fiend
TargetableUnit:

View File

@@ -509,7 +509,6 @@ MMCH:
RevealsShroud:
Range: 8c0
RenderInfantry:
SpawnsCorpse: false
Turreted:
ROT: 5
AttackTurreted:
@@ -581,7 +580,6 @@ SMECH:
Armament:
Weapon: AssaultCannon
RenderInfantry:
SpawnsCorpse: false
Selectable:
Voices: Mech
Bounds: 16, 32

View File

@@ -45,6 +45,12 @@ e1:
Start: 0
Length: *
Tick: 80
die-crushed:
Start: 159
Length: 5
ShadowStart: 451
Tick: 800
ZOffset: -511
shoot:
Start: 164
Length: 6
@@ -122,6 +128,12 @@ e2:
Start: 0
Length: *
Tick: 80
die-crushed:
Start: 159
Length: 5
ShadowStart: 451
Tick: 800
ZOffset: -511
shoot:
Start: 164
Length: 6
@@ -199,6 +211,12 @@ e3:
Start: 0
Length: *
Tick: 80
die-crushed:
Start: 159
Length: 5
ShadowStart: 451
Tick: 800
ZOffset: -511
shoot:
Start: 164
Length: 6
@@ -267,19 +285,19 @@ weedguy:
Facings: 8
Stride: 6
ShadowStart: 288
die2: weed
Start: 160
Length: 6
ShadowStart: 362
Tick: 80
die1: weed
Start: 149
Length: 11
ShadowStart: 351
Tick: 80
die2: weed
Start: 160
Length: 6
ShadowStart: 362
Tick: 80
die3: weed
Start: 166
Length: 10
Length: 11
ShadowStart: 368
Tick: 80
die4: weed
@@ -296,6 +314,11 @@ weedguy:
Start: 0
Length: *
Tick: 80
die-crushed: weed
Start: 174
Length: 3
ShadowStart: 376
Tick: 1000
icon: weaticon
Start: 0
@@ -347,6 +370,12 @@ medic:
Length: 15
ShadowStart: 455
Tick: 80
die-crushed:
Start: 159
Length: 5
ShadowStart: 451
Tick: 800
ZOffset: -511
shoot:
Start: 164
Length: 6
@@ -427,6 +456,12 @@ engineer:
Length: 15
ShadowStart: 441
Tick: 80
die-crushed:
Start: 159
Length: 5
ShadowStart: 451
Tick: 800
ZOffset: -511
standup-0:
Start: 260
Length: 2
@@ -493,6 +528,12 @@ umagon:
Length: 15
ShadowStart: 441
Tick: 80
die-crushed:
Start: 159
Length: 5
ShadowStart: 451
Tick: 800
ZOffset: -511
shoot:
Start: 164
Length: 6
@@ -571,6 +612,12 @@ ghost: # TODO unused GUNFIRE.SHP
Length: 15
ShadowStart: 441
Tick: 80
die-crushed:
Start: 159
Length: 5
ShadowStart: 451
Tick: 800
ZOffset: -511
shoot:
Start: 164
Length: 6
@@ -647,6 +694,12 @@ jumpjet: # TODO: ShadowStart:
Length: 15
ShadowStart: 887
Tick: 80
die-crushed:
Start: 159
Length: 5
ShadowStart: 451
Tick: 800
ZOffset: -511
shoot:
Start: 164
Length: 6
@@ -725,6 +778,12 @@ mhijack:
Length: 15
ShadowStart: 441
Tick: 80
die-crushed:
Start: 159
Length: 5
ShadowStart: 451
Tick: 800
ZOffset: -511
shoot:
Start: 164
Length: 6
@@ -803,6 +862,12 @@ chamspy:
Length: 15
ShadowStart: 441
Tick: 80
die-crushed:
Start: 159
Length: 5
ShadowStart: 451
Tick: 800
ZOffset: -511
shoot:
Start: 164
Length: 6
@@ -1036,6 +1101,12 @@ mutant:
Length: 15
ShadowStart: 441
Tick: 80
die-crushed:
Start: 159
Length: 5
ShadowStart: 451
Tick: 800
ZOffset: -511
shoot:
Start: 164
Length: 6
@@ -1114,6 +1185,12 @@ mwmn:
Length: 15
ShadowStart: 441
Tick: 80
die-crushed:
Start: 159
Length: 5
ShadowStart: 451
Tick: 800
ZOffset: -511
shoot:
Start: 164
Length: 6
@@ -1192,6 +1269,12 @@ mutant3: # TODO unused MGUN-N,MGUN-NE,MGUN-E,MGUN-SE,MGUN-S,MGUN-SW,MGUN-W,MGUN-
Length: 15
ShadowStart: 441
Tick: 80
die-crushed:
Start: 159
Length: 5
ShadowStart: 451
Tick: 800
ZOffset: -511
shoot:
Start: 164
Length: 6
@@ -1270,6 +1353,12 @@ tratos:
Length: 15
ShadowStart: 441
Tick: 80
die-crushed:
Start: 159
Length: 5
ShadowStart: 451
Tick: 800
ZOffset: -511
shoot:
Start: 164
Length: 6
@@ -1348,6 +1437,12 @@ oxanna:
Length: 15
ShadowStart: 441
Tick: 80
die-crushed:
Start: 159
Length: 5
ShadowStart: 451
Tick: 800
ZOffset: -511
shoot:
Start: 164
Length: 6
@@ -1426,6 +1521,12 @@ slav:
Length: 15
ShadowStart: 441
Tick: 80
die-crushed:
Start: 159
Length: 5
ShadowStart: 451
Tick: 800
ZOffset: -511
shoot:
Start: 164
Length: 6
@@ -1482,6 +1583,12 @@ doggie: # TODO: not sure what frame 88 and following is
Length: 10
ShadowStart: 218
Tick: 80
die-crushed:
Start: 105
Length: 4
ShadowStart: 224
Tick: 800
ZOffset: -511
shoot:
Start: 56
Length: 4
@@ -1566,6 +1673,12 @@ civ1:
Length: 15
ShadowStart: 441
Tick: 80
die-crushed:
Start: 159
Length: 5
ShadowStart: 451
Tick: 800
ZOffset: -511
die5: flameguy # TODO: walking animation unused
Start: 42
Length: 104
@@ -1622,6 +1735,12 @@ civ2:
Length: 15
ShadowStart: 441
Tick: 80
die-crushed:
Start: 159
Length: 5
ShadowStart: 451
Tick: 800
ZOffset: -511
die5: flameguy # TODO: walking animation unused
Start: 42
Length: 104
@@ -1678,6 +1797,12 @@ civ3:
Length: 15
ShadowStart: 441
Tick: 80
die-crushed:
Start: 159
Length: 5
ShadowStart: 451
Tick: 800
ZOffset: -511
die5: flameguy # TODO: walking animation unused
Start: 42
Length: 104