Actors particular to Hexen only

------------------------------------------------------------------------

//========== Spawns a flock of bats when activated.

IMPLEMENT_ACTOR (ABatSpawner, Hexen, 10225, 0)
	PROP_Flags (MF_NOSECTOR|MF_NOBLOCKMAP|MF_NOGRAVITY)
	PROP_RenderStyle (STYLE_None)
	PROP_SpawnState (S_SPAWNBATS1)
END_DEFAULTS

FState ABatSpawner::States[] =
{
#define S_SPAWNBATS1 0
	S_NORMAL1 (MAN1, 'A',	2, NULL			, &States[S_SPAWNBATS1+1]),
	S_NORMAL1 (MAN1, 'A',	2, A_BatSpawnInit	, &States[S_SPAWNBATS1+2]),
	S_NORMAL1 (MAN1, 'A',	2, A_BatSpawn		, &States[S_SPAWNBATS1+2]),

#define S_SPAWNBATS_OFF (S_SPAWNBATS1+3)
	S_NORMAL1 (MAN1, 'A',   -1, NULL		, NULL)
};

------------------------------------------------------------------------

//========== The Hexen bat is not a monster, but merely a decorative effect.

IMPLEMENT_ACTOR (ABat, Hexen, -1, 0)
	PROP_SpeedFixed (5)
	PROP_RadiusFixed (3)
	PROP_HeightFixed (3)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_MISSILE)
	PROP_Flags2 (MF2_NOTELEPORT|MF2_PASSMOBJ)
	PROP_SpawnState (S_BAT1)
	PROP_DeathState (S_BAT_DEATH)
END_DEFAULTS

FState ABat::States[] =
{
#define S_BAT1 0
	S_NORMAL1 (ABAT, 'A',	2, A_BatMove	, &States[S_BAT1+1]),
	S_NORMAL1 (ABAT, 'B',	2, A_BatMove	, &States[S_BAT1+2]),
	S_NORMAL1 (ABAT, 'C',	2, A_BatMove	, &States[S_BAT1]),

#define S_BAT_DEATH (S_BAT1+3)
	S_NORMAL1 (ABAT, 'A',	2, NULL		, NULL),
};

------------------------------------------------------------------------

//========== The dark bishops worshiping Korax

IMPLEMENT_ACTOR (ABishop, Hexen, 114, 19)
	PROP_SpawnHealth (130)
	PROP_RadiusFixed (22)
	PROP_HeightFixed (65)
	PROP_SpeedFixed (10)
	PROP_PainChance (110)
	PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_FLOAT|MF_NOGRAVITY|MF_NOBLOOD)
	PROP_Flags2 (MF2_PASSMOBJ|MF2_PUSHWALL|MF2_TELESTOMP)
	PROP_Flags3 (MF3_DONTOVERLAP)
	PROP_SpawnState (S_BISHOP_LOOK)
	PROP_SeeState (S_BISHOP_WALK)
	PROP_PainState (S_BISHOP_PAIN)
	PROP_MissileState (S_BISHOP_ATK)
	PROP_DeathState (S_BISHOP_DEATH)
	PROP_IDeathState (S_BISHOP_ICE)
	PROP_SeeSound ("BishopSight")
	PROP_AttackSound ("BishopAttack")
	PROP_PainSound ("BishopPain")
	PROP_DeathSound ("BishopDeath")
	PROP_ActiveSound ("BishopActive")
END_DEFAULTS

FState ABishop::States[] =
{
#define S_BISHOP_LOOK 0
	S_NORMAL1(BISH, 'A',   10, A_Look		, &States[S_BISHOP_LOOK+0]),

#define S_BISHOP_BLUR (S_BISHOP_LOOK+1)
	S_NORMAL1(BISH, 'A',    2, A_BishopDoBlur	, &States[S_BISHOP_BLUR+1]),
	S_NORMAL1(BISH, 'A',    4, A_BishopSpawnBlur	, &States[S_BISHOP_BLUR+1]),

#define S_BISHOP_WALK (S_BISHOP_BLUR+2)
	S_NORMAL1(BISH, 'A',    2, A_Chase		, &States[S_BISHOP_WALK+1]),
	S_NORMAL1(BISH, 'A',    2, A_BishopChase	, &States[S_BISHOP_WALK+2]),
	S_NORMAL1(BISH, 'A',    2, NULL			, &States[S_BISHOP_WALK+3]),
	S_NORMAL1(BISH, 'B',    2, A_BishopChase	, &States[S_BISHOP_WALK+4]),
	S_NORMAL1(BISH, 'B',    2, A_Chase		, &States[S_BISHOP_WALK+5]),
	S_NORMAL1(BISH, 'B',    2, A_BishopChase	, &States[S_BISHOP_WALK+6]),

#define S_BISHOP_DECIDE (S_BISHOP_WALK+6)
	S_NORMAL1(BISH, 'A',    1, A_BishopDecide	, &States[S_BISHOP_WALK+0]),

#define S_BISHOP_ATK (S_BISHOP_DECIDE+1)
	S_NORMAL1(BISH, 'A',    3, A_FaceTarget		, &States[S_BISHOP_ATK+1]),
	S_BRIGHT (BISH, 'D',    3, A_FaceTarget		, &States[S_BISHOP_ATK+2]),
	S_BRIGHT (BISH, 'E',    3, A_FaceTarget		, &States[S_BISHOP_ATK+3]),
	S_BRIGHT (BISH, 'F',    3, A_BishopAttack	, &States[S_BISHOP_ATK+4]),
	S_BRIGHT (BISH, 'F',    5, A_BishopAttack2	, &States[S_BISHOP_ATK+4]),

#define S_BISHOP_PAIN (S_BISHOP_ATK+5)
	S_NORMAL1(BISH, 'C',    6, A_Pain		, &States[S_BISHOP_PAIN+1]),
	S_NORMAL1(BISH, 'C',    6, A_BishopPainBlur	, &States[S_BISHOP_PAIN+2]),
	S_NORMAL1(BISH, 'C',    6, A_BishopPainBlur	, &States[S_BISHOP_PAIN+3]),
	S_NORMAL1(BISH, 'C',    6, A_BishopPainBlur	, &States[S_BISHOP_PAIN+4]),
	S_NORMAL1(BISH, 'C',    0, NULL			, &States[S_BISHOP_WALK+0]),

#define S_BISHOP_DEATH (S_BISHOP_PAIN+5)
	S_NORMAL1 (BISH, 'G',    6, NULL		, &States[S_BISHOP_DEATH+1]),
	S_BRIGHT (BISH, 'H',    6, A_Scream		, &States[S_BISHOP_DEATH+2]),
	S_BRIGHT (BISH, 'I',    5, A_NoBlocking		, &States[S_BISHOP_DEATH+3]),
	S_BRIGHT (BISH, 'J',    5, A_Explode		, &States[S_BISHOP_DEATH+4]),
	S_BRIGHT (BISH, 'K',    5, NULL			, &States[S_BISHOP_DEATH+5]),
	S_BRIGHT (BISH, 'L',    4, NULL			, &States[S_BISHOP_DEATH+6]),
	S_BRIGHT (BISH, 'M',    4, NULL			, &States[S_BISHOP_DEATH+7]),
	S_NORMAL1(BISH, 'N',    4, A_BishopPuff		, &States[S_BISHOP_DEATH+8]),
	S_NORMAL1(BISH, 'O',    4, A_QueueCorpse	, &States[S_BISHOP_DEATH+9]),
	S_NORMAL1(BISH, 'P',   -1, NULL			, NULL),

#define S_BISHOP_ICE (S_BISHOP_DEATH+10)
	S_NORMAL1(BISH, 'X',    5, A_FreezeDeath	, &States[S_BISHOP_ICE+1]),
	S_NORMAL1(BISH, 'X',    1, A_FreezeDeathChunks	, &States[S_BISHOP_ICE+1])
};

------------------------------------------------------------------------

//========== The cloud of smoke left behind after the dark bishop's death

IMPLEMENT_ACTOR (ABishopPuff, Hexen, -1, 0)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
	PROP_RenderStyle (STYLE_Translucent)
	PROP_Alpha (HX_SHADOW)
	PROP_SpawnState (0)
END_DEFAULTS

FState ABishopPuff::States[] =
{
	S_NORMAL1 (BISH, 'Q',    5, NULL, &States[1]),
	S_NORMAL1 (BISH, 'R',    5, NULL, &States[2]),
	S_NORMAL1 (BISH, 'S',    5, NULL, &States[3]),
	S_NORMAL1 (BISH, 'T',    5, NULL, &States[4]),
	S_NORMAL1 (BISH, 'U',    6, NULL, &States[5]),
	S_NORMAL1 (BISH, 'V',    6, NULL, &States[6]),
	S_NORMAL1 (BISH, 'W',    5, NULL, NULL)
};

------------------------------------------------------------------------

//========== The afterimage spawned by the dark bishop after he does a "quick step"

IMPLEMENT_ACTOR (ABishopBlur, Hexen, -1, 0)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
	PROP_RenderStyle (STYLE_Translucent)
	PROP_Alpha (HX_SHADOW)
	PROP_SpawnState (0)
END_DEFAULTS

FState ABishopBlur::States[] =
{
	S_NORMAL1 (BISH, 'A',   16, NULL		, &States[1]),
	S_NORMAL1 (BISH, 'A',    8, A_SetAltShadow	, NULL)
};

------------------------------------------------------------------------

//========== Dark bishop afterimage

IMPLEMENT_ACTOR (ABishopPainBlur, Hexen, -1, 0)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
	PROP_RenderStyle (STYLE_Translucent)
	PROP_Alpha (HX_SHADOW)
	PROP_SpawnState (0)
END_DEFAULTS

FState ABishopPainBlur::States[] =
{
	S_NORMAL1 (BISH, 'C',    8, NULL, NULL)
};

------------------------------------------------------------------------

//========== A weak projectile with minor seeking capabilities fired by the dark bishop that flies in a weaving pattern.

IMPLEMENT_ACTOR (ABishopFX, Hexen, -1, 0)
	PROP_RadiusFixed (10)
	PROP_HeightFixed (6)
	PROP_SpeedFixed (10)
	PROP_Damage (1)
	PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
	PROP_Flags2 (MF2_NOTELEPORT|MF2_SEEKERMISSILE)
	PROP_Flags4 (MF4_BLOODSPLATTER)
	PROP_SpawnState (S_BISHFX1)
	PROP_DeathState (S_BISHFXI1)
	PROP_DeathSound ("BishopMissileExplode")
END_DEFAULTS

FState ABishopFX::States[] =
{
#define S_BISHFX1 0
	S_BRIGHT (BPFX, 'A',    1, A_BishopMissileWeave	, &States[S_BISHFX1+1]),
	S_BRIGHT (BPFX, 'B',    1, A_BishopMissileWeave	, &States[S_BISHFX1+2]),
	S_BRIGHT (BPFX, 'A',    1, A_BishopMissileWeave	, &States[S_BISHFX1+3]),
	S_BRIGHT (BPFX, 'B',    1, A_BishopMissileWeave	, &States[S_BISHFX1+4]),
	S_BRIGHT (BPFX, 'B',    0, A_BishopMissileSeek	, &States[S_BISHFX1+0]),

#define S_BISHFXI1 (S_BISHFX1+5)
	S_BRIGHT (BPFX, 'C',    4, NULL			, &States[S_BISHFXI1+1]),
	S_BRIGHT (BPFX, 'D',    4, NULL			, &States[S_BISHFXI1+2]),
	S_BRIGHT (BPFX, 'E',    4, NULL			, &States[S_BISHFXI1+3]),
	S_BRIGHT (BPFX, 'F',    4, NULL			, &States[S_BISHFXI1+4]),
	S_BRIGHT (BPFX, 'G',    3, NULL			, &States[S_BISHFXI1+5]),
	S_BRIGHT (BPFX, 'H',    3, NULL			, NULL)
};

------------------------------------------------------------------------

//========== Disc of Repulsion artifact

IMPLEMENT_ACTOR (AArtiBlastRadius, Hexen, 10110, 74)
	PROP_Flags (MF_SPECIAL)
	PROP_Flags2 (MF2_FLOATBOB)
	PROP_SpawnState (0)
	PROP_PickupSound("misc/p_pkup")
END_DEFAULTS

FState AArtiBlastRadius::States[] =
{
	S_BRIGHT (BLST, 'A',	4, NULL, &States[1]),
	S_BRIGHT (BLST, 'B',	4, NULL, &States[2]),
	S_BRIGHT (BLST, 'C',	4, NULL, &States[3]),
	S_BRIGHT (BLST, 'D',	4, NULL, &States[4]),
	S_BRIGHT (BLST, 'E',	4, NULL, &States[5]),
	S_BRIGHT (BLST, 'F',	4, NULL, &States[6]),
	S_BRIGHT (BLST, 'G',	4, NULL, &States[7]),
	S_BRIGHT (BLST, 'H',	4, NULL, &States[0]),
};

------------------------------------------------------------------------

//========== The repulsion rings that are spawned on actors affected by a disc of repulsion.

IMPLEMENT_ACTOR (ABlastEffect, Any, -1, 0)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_NOCLIP)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_RenderStyle (STYLE_Translucent)
	PROP_Alpha (TRANSLUC66)
	PROP_SpawnState (0)
END_DEFAULTS

FState ABlastEffect::States[] =
{
	S_NORMAL1(RADE, 'A',    4, NULL, &States[1]),
	S_NORMAL1(RADE, 'B',    4, NULL, &States[2]),
	S_NORMAL1(RADE, 'C',    4, NULL, &States[3]),
	S_NORMAL1(RADE, 'D',    4, NULL, &States[4]),
	S_NORMAL1(RADE, 'E',    4, NULL, &States[5]),
	S_NORMAL1(RADE, 'F',    4, NULL, &States[6]),
	S_NORMAL1(RADE, 'G',    4, NULL, &States[7]),
	S_NORMAL1(RADE, 'H',    4, NULL, &States[8]),
	S_NORMAL1(RADE, 'I',    4, NULL, NULL)
};

------------------------------------------------------------------------

//========== Boost Armor Artifact (Dragonskin Bracers)

IMPLEMENT_ACTOR (AArtiBoostArmor, Hexen, 8041, 22)
	PROP_Flags (MF_SPECIAL)
	PROP_Flags2 (MF2_FLOATBOB)
	PROP_SpawnState (0)
	PROP_PickupSound("misc/p_pkup")
END_DEFAULTS

FState AArtiBoostArmor::States[] =
{
#define S_ARTI_ARMOR1 0
	S_BRIGHT (BRAC, 'A',	4, NULL, &States[1]),
	S_BRIGHT (BRAC, 'B',	4, NULL, &States[2]),
	S_BRIGHT (BRAC, 'C',	4, NULL, &States[3]),
	S_BRIGHT (BRAC, 'D',	4, NULL, &States[4]),
	S_BRIGHT (BRAC, 'E',	4, NULL, &States[5]),
	S_BRIGHT (BRAC, 'F',	4, NULL, &States[6]),
	S_BRIGHT (BRAC, 'G',	4, NULL, &States[7]),
	S_BRIGHT (BRAC, 'H',	4, NULL, &States[0]),
};

------------------------------------------------------------------------

//========== Centaurs are armored, vaguely leonine chimeras of men and horses

IMPLEMENT_ACTOR (ACentaur, Hexen, 107, 1)
	PROP_SpawnHealth (200)
	PROP_PainChance (135)
	PROP_SpeedFixed (13)
	PROP_HeightFixed (64)
	PROP_Mass (120)
	PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL)
	PROP_Flags2 (MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_TELESTOMP|MF2_PUSHWALL|MF2_MCROSS)
	PROP_SpawnState (S_CENTAUR_LOOK1)
	PROP_SeeState (S_CENTAUR_WALK1)
	PROP_PainState (S_CENTAUR_PAIN1)
	PROP_MeleeState (S_CENTAUR_ATK1)
	PROP_DeathState (S_CENTAUR_DEATH1)
	PROP_XDeathState (S_CENTAUR_DEATH_X1)
	PROP_IDeathState (S_CENTAUR_ICE1)
	PROP_SeeSound ("CentaurSight")
	PROP_AttackSound ("CentaurAttack")
	PROP_PainSound ("CentaurPain")
	PROP_DeathSound ("CentaurDeath")
	PROP_ActiveSound ("CentaurActive")
END_DEFAULTS

FState ACentaur::States[] =
{
#define S_CENTAUR_LOOK1 0
	S_NORMAL1 (CENT, 'A',   10, A_Look                  , &States[S_CENTAUR_LOOK1+1]),
	S_NORMAL1 (CENT, 'B',   10, A_Look                  , &States[S_CENTAUR_LOOK1]),

#define S_CENTAUR_WALK1 (S_CENTAUR_LOOK1+2)
	S_NORMAL1 (CENT, 'A',    4, A_Chase                 , &States[S_CENTAUR_WALK1+1]),
	S_NORMAL1 (CENT, 'B',    4, A_Chase                 , &States[S_CENTAUR_WALK1+2]),
	S_NORMAL1 (CENT, 'C',    4, A_Chase                 , &States[S_CENTAUR_WALK1+3]),
	S_NORMAL1 (CENT, 'D',    4, A_Chase                 , &States[S_CENTAUR_WALK1]),

#define S_CENTAUR_PAIN1 (S_CENTAUR_WALK1+4)
	S_NORMAL1 (CENT, 'G',    6, A_Pain                  , &States[S_CENTAUR_PAIN1+1]),
	S_NORMAL1 (CENT, 'G',    6, A_SetReflectiveInvulnerable, &States[S_CENTAUR_PAIN1+2]),
	S_NORMAL1 (CENT, 'E',   15, A_CentaurDefend         , &States[S_CENTAUR_PAIN1+3]),
	S_NORMAL1 (CENT, 'E',   15, A_CentaurDefend         , &States[S_CENTAUR_PAIN1+4]),
	S_NORMAL1 (CENT, 'E',   15, A_CentaurDefend         , &States[S_CENTAUR_PAIN1+5]),
	S_NORMAL1 (CENT, 'E',    1, A_UnSetReflectiveInvulnerable, &States[S_CENTAUR_WALK1]),

#define S_CENTAUR_ATK1 (S_CENTAUR_PAIN1+6)
	S_NORMAL1 (CENT, 'H',    5, A_FaceTarget            , &States[S_CENTAUR_ATK1+1]),
	S_NORMAL1 (CENT, 'I',    4, A_FaceTarget            , &States[S_CENTAUR_ATK1+2]),
	S_NORMAL1 (CENT, 'J',    7, A_CentaurAttack         , &States[S_CENTAUR_WALK1]),

#define S_CENTAUR_MISSILE1 (S_CENTAUR_ATK1+3)
	S_NORMAL1 (CENT, 'E',   10, A_FaceTarget            , &States[S_CENTAUR_MISSILE1+1]),
	S_BRIGHT  (CENT, 'F',    8, A_CentaurAttack2        , &States[S_CENTAUR_MISSILE1+2]),
	S_NORMAL1 (CENT, 'E',   10, A_FaceTarget            , &States[S_CENTAUR_MISSILE1+3]),
	S_BRIGHT  (CENT, 'F',    8, A_CentaurAttack2        , &States[S_CENTAUR_WALK1]),

#define S_CENTAUR_DEATH1 (S_CENTAUR_MISSILE1+4)
	S_NORMAL1 (CENT, 'K',    4, NULL                    , &States[S_CENTAUR_DEATH1+1]),
	S_NORMAL1 (CENT, 'L',    4, A_Scream                , &States[S_CENTAUR_DEATH1+2]),
	S_NORMAL1 (CENT, 'M',    4, NULL                    , &States[S_CENTAUR_DEATH1+3]),
	S_NORMAL1 (CENT, 'N',    4, NULL                    , &States[S_CENTAUR_DEATH1+4]),
	S_NORMAL1 (CENT, 'O',    4, A_NoBlocking            , &States[S_CENTAUR_DEATH1+5]),
	S_NORMAL1 (CENT, 'P',    4, NULL                    , &States[S_CENTAUR_DEATH1+6]),
	S_NORMAL1 (CENT, 'Q',    4, NULL                    , &States[S_CENTAUR_DEATH1+7]),
	S_NORMAL1 (CENT, 'R',    4, A_QueueCorpse           , &States[S_CENTAUR_DEATH1+8]),
	S_NORMAL1 (CENT, 'S',    4, NULL                    , &States[S_CENTAUR_DEATH1+9]),
	S_NORMAL1 (CENT, 'T',   -1, NULL                    , NULL),

#define S_CENTAUR_DEATH_X1 (S_CENTAUR_DEATH1+10)
	S_NORMAL1 (CTXD, 'A',    4, NULL                    , &States[S_CENTAUR_DEATH_X1+1]),
	S_NORMAL1 (CTXD, 'B',    4, A_NoBlocking            , &States[S_CENTAUR_DEATH_X1+2]),
	S_NORMAL1 (CTXD, 'C',    4, A_CentaurDropStuff      , &States[S_CENTAUR_DEATH_X1+3]),
	S_NORMAL1 (CTXD, 'D',    3, A_Scream                , &States[S_CENTAUR_DEATH_X1+4]),
	S_NORMAL1 (CTXD, 'E',    4, A_QueueCorpse           , &States[S_CENTAUR_DEATH_X1+5]),
	S_NORMAL1 (CTXD, 'F',    3, NULL                    , &States[S_CENTAUR_DEATH_X1+6]),
	S_NORMAL1 (CTXD, 'G',    4, NULL                    , &States[S_CENTAUR_DEATH_X1+7]),
	S_NORMAL1 (CTXD, 'H',    3, NULL                    , &States[S_CENTAUR_DEATH_X1+8]),
	S_NORMAL1 (CTXD, 'I',    4, NULL                    , &States[S_CENTAUR_DEATH_X1+9]),
	S_NORMAL1 (CTXD, 'J',    3, NULL                    , &States[S_CENTAUR_DEATH_X1+10]),
	S_NORMAL1 (CTXD, 'K',   -1, NULL                    , NULL),

#define S_CENTAUR_ICE1 (S_CENTAUR_DEATH_X1+11)
	S_NORMAL1 (CENT, 'U',    5, A_FreezeDeath           , &States[S_CENTAUR_ICE1+1]),
	S_NORMAL1 (CENT, 'U',    1, A_FreezeDeathChunks     , &States[S_CENTAUR_ICE1+1]),

};

------------------------------------------------------------------------

//========== Slaughtaurs are the elite caste of centaurs.

IMPLEMENT_STATELESS_ACTOR (ACentaurLeader, Hexen, 115, 2)
	PROP_SpawnHealth (250)
	PROP_PainChance (96)
	PROP_SpeedFixed (10)
	PROP_MissileState (S_CENTAUR_MISSILE1)
END_DEFAULTS

------------------------------------------------------------------------

//========== Ghostly centaurs spawned by Hexen's final boss, Korax.

IMPLEMENT_STATELESS_ACTOR (ACentaurMash, Hexen, -1, 103)
	PROP_FlagsSet (MF_NOBLOOD)
	PROP_Flags2Set (MF2_BLASTED)
	PROP_Flags2Clear (MF2_TELESTOMP)
	PROP_RenderStyle (STYLE_Translucent)
	PROP_Alpha (HX_ALTSHADOW)
	PROP_DeathState (~0)
	PROP_XDeathState (~0)
	PROP_IDeathState (~0)
END_DEFAULTS

------------------------------------------------------------------------

//========== The projectile fired by a Slaughtaur's shield.

IMPLEMENT_ACTOR (ACentaurFX, Hexen, -1, 0)
	PROP_SpeedFixed (20)
	PROP_Damage (4)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
	PROP_Flags2 (MF2_NOTELEPORT|MF2_IMPACT|MF2_PCROSS)
	PROP_Flags4 (MF4_BLOODSPLATTER)
	PROP_SpawnState (S_CENTAUR_FX1)
	PROP_DeathState (S_CENTAUR_FX_X1)
	PROP_DeathSound ("CentaurMissileExplode")
END_DEFAULTS

FState ACentaurFX::States[] =
{
#define S_CENTAUR_FX1 0
	S_BRIGHT (CTFX, 'A',   -1, NULL, NULL),

#define S_CENTAUR_FX_X1 (S_CENTAUR_FX1+1)
	S_BRIGHT (CTFX, 'B',    4, NULL, &States[S_CENTAUR_FX_X1+1]),
	S_BRIGHT (CTFX, 'C',    3, NULL, &States[S_CENTAUR_FX_X1+2]),
	S_BRIGHT (CTFX, 'D',    4, NULL, &States[S_CENTAUR_FX_X1+3]),
	S_BRIGHT (CTFX, 'E',    3, NULL, &States[S_CENTAUR_FX_X1+4]),
	S_BRIGHT (CTFX, 'F',    2, NULL, NULL),
};

------------------------------------------------------------------------

//========== A magic shield that gives reflective invulnerability and a ranged attack, spawned when a centaur or slaughtaur is gibbed.

IMPLEMENT_ACTOR (ACentaurShield, Hexen, -1, 0)
	PROP_Flags (MF_DROPOFF|MF_CORPSE)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_Flags4 (MF4_NONETSPAWN)
	PROP_SpawnState (S_CENTAUR_SHIELD1)
	PROP_DeathState (S_CENTAUR_SHIELD_X1)
END_DEFAULTS

FState ACentaurShield::States[] =
{
#define S_CENTAUR_SHIELD1 0
	S_NORMAL1 (CTDP, 'A',    3, A_CheckFloor	, &States[S_CENTAUR_SHIELD1+1]),
	S_NORMAL1 (CTDP, 'B',    3, A_CheckFloor	, &States[S_CENTAUR_SHIELD1+2]),
	S_NORMAL1 (CTDP, 'C',    3, A_CheckFloor	, &States[S_CENTAUR_SHIELD1+3]),
	S_NORMAL1 (CTDP, 'D',    3, A_CheckFloor	, &States[S_CENTAUR_SHIELD1+4]),
	S_NORMAL1 (CTDP, 'E',    3, A_CheckFloor	, &States[S_CENTAUR_SHIELD1+5]),
	S_NORMAL1 (CTDP, 'F',    3, A_CheckFloor	, &States[S_CENTAUR_SHIELD1+2]),

#define S_CENTAUR_SHIELD_X1 (S_CENTAUR_SHIELD1+6)
	S_NORMAL1 (CTDP, 'G',    4, NULL		, &States[S_CENTAUR_SHIELD_X1+1]),
	S_NORMAL1 (CTDP, 'H',    4, A_QueueCorpse	, &States[S_CENTAUR_SHIELD_X1+2]),
	S_NORMAL1 (CTDP, 'I',    4, NULL		, &States[S_CENTAUR_SHIELD_X1+3]),
	S_NORMAL1 (CTDP, 'J',   -1, NULL		, NULL),
};

------------------------------------------------------------------------

//========== A sword, spawned when a centaur or slaughtaur is gibbed.

IMPLEMENT_ACTOR (ACentaurSword, Hexen, -1, 0)
	PROP_Flags (MF_DROPOFF|MF_CORPSE)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_Flags4 (MF4_NONETSPAWN)
	PROP_SpawnState (S_CENTAUR_SWORD1)
	PROP_DeathState (S_CENTAUR_SWORD_X1)
END_DEFAULTS

FState ACentaurSword::States[] =
{
#define S_CENTAUR_SWORD1 0
	S_NORMAL1 (CTDP, 'K',    3, A_CheckFloor	, &States[S_CENTAUR_SWORD1+1]),
	S_NORMAL1 (CTDP, 'L',    3, A_CheckFloor	, &States[S_CENTAUR_SWORD1+2]),
	S_NORMAL1 (CTDP, 'M',    3, A_CheckFloor	, &States[S_CENTAUR_SWORD1+3]),
	S_NORMAL1 (CTDP, 'N',    3, A_CheckFloor	, &States[S_CENTAUR_SWORD1+4]),
	S_NORMAL1 (CTDP, 'O',    3, A_CheckFloor	, &States[S_CENTAUR_SWORD1+5]),
	S_NORMAL1 (CTDP, 'P',    3, A_CheckFloor	, &States[S_CENTAUR_SWORD1+6]),
	S_NORMAL1 (CTDP, 'Q',    3, A_CheckFloor	, &States[S_CENTAUR_SWORD1+2]),

#define S_CENTAUR_SWORD_X1 (S_CENTAUR_SWORD1+7)
	S_NORMAL1 (CTDP, 'R',    4, NULL		, &States[S_CENTAUR_SWORD_X1+1]),
	S_NORMAL1 (CTDP, 'S',    4, A_QueueCorpse	, &States[S_CENTAUR_SWORD_X1+2]),
	S_NORMAL1 (CTDP, 'T',   -1, NULL		, NULL),
};

------------------------------------------------------------------------

//========== Cleric Boss (Traductus): one of the three penultimate bosses of Hexen.

IMPLEMENT_ACTOR (AClericBoss, Hexen, 10101, 0)
	PROP_SpawnHealth (800)
	PROP_PainChance (50)
	PROP_SpeedFixed (25)
	PROP_RadiusFixed (16)
	PROP_HeightFixed (64)
	PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL)
	PROP_Flags2 (MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_TELESTOMP|MF2_PUSHWALL|MF2_MCROSS)
	PROP_Flags3 (MF3_DONTMORPH)
	PROP_SpawnState (S_CLERIC)
	PROP_SeeState (S_CLERIC_RUN1)
	PROP_PainState (S_CLERIC_PAIN)
	PROP_MeleeState (S_CLERIC_ATK1)
	PROP_MissileState (S_CLERIC_ATK1)
	PROP_DeathState (S_CLERIC_DIE1)
	PROP_XDeathState (S_CLERIC_XDIE1)
	PROP_BDeathState (S_CLERIC_BURN)
	PROP_IDeathState (S_CLERIC_ICE)
	PROP_PainSound ("PlayerClericPain")
	PROP_DeathSound ("PlayerClericCrazyDeath")
END_DEFAULTS

FState AClericBoss::States[] =
{
#define S_CLERIC 0
	S_NORMAL1 (CLER, 'A',	2, NULL			, &States[S_CLERIC+1]),
	S_NORMAL1 (CLER, 'A',	3, A_ClassBossHealth	, &States[S_CLERIC+2]),
	S_NORMAL1 (CLER, 'A',	5, A_Look		, &States[S_CLERIC+2]),

#define S_CLERIC_RUN1 (S_CLERIC+3)
	S_NORMAL1 (CLER, 'A',	4, A_FastChase		, &States[S_CLERIC_RUN1+1]),
	S_NORMAL1 (CLER, 'B',	4, A_FastChase		, &States[S_CLERIC_RUN1+2]),
	S_NORMAL1 (CLER, 'C',	4, A_FastChase		, &States[S_CLERIC_RUN1+3]),
	S_NORMAL1 (CLER, 'D',	4, A_FastChase		, &States[S_CLERIC_RUN1]),

#define S_CLERIC_PAIN (S_CLERIC_RUN1+4)
	S_NORMAL1 (CLER, 'H',	4, NULL			, &States[S_CLERIC_PAIN+1]),
	S_NORMAL1 (CLER, 'H',	4, A_Pain		, &States[S_CLERIC_RUN1]),

#define S_CLERIC_ATK1 (S_CLERIC_PAIN+2)
	S_NORMAL1 (CLER, 'E',	8, A_FaceTarget		, &States[S_CLERIC_ATK1+1]),
	S_NORMAL1 (CLER, 'F',	8, A_FaceTarget		, &States[S_CLERIC_ATK1+2]),
	S_NORMAL1 (CLER, 'G',   10, A_ClericAttack	, &States[S_CLERIC_RUN1]),

#define S_CLERIC_DIE1 (S_CLERIC_ATK1+3)
	S_NORMAL1 (CLER, 'I',	6, NULL			, &States[S_CLERIC_DIE1+1]),
	S_NORMAL1 (CLER, 'K',	6, A_Scream		, &States[S_CLERIC_DIE1+2]),
	S_NORMAL1 (CLER, 'L',	6, NULL			, &States[S_CLERIC_DIE1+3]),
	S_NORMAL1 (CLER, 'L',	6, NULL			, &States[S_CLERIC_DIE1+4]),
	S_NORMAL1 (CLER, 'M',	6, A_NoBlocking		, &States[S_CLERIC_DIE1+5]),
	S_NORMAL1 (CLER, 'N',	6, NULL			, &States[S_CLERIC_DIE1+6]),
	S_NORMAL1 (CLER, 'O',	6, NULL			, &States[S_CLERIC_DIE1+7]),
	S_NORMAL1 (CLER, 'P',	6, NULL			, &States[S_CLERIC_DIE1+8]),
	S_NORMAL1 (CLER, 'Q',   -1, NULL		, NULL),

#define S_CLERIC_XDIE1 (S_CLERIC_DIE1+9)
	S_NORMAL1 (CLER, 'R',	5, A_Scream		, &States[S_CLERIC_XDIE1+1]),
	S_NORMAL1 (CLER, 'S',	5, NULL			, &States[S_CLERIC_XDIE1+2]),
	S_NORMAL1 (CLER, 'T',	5, A_NoBlocking		, &States[S_CLERIC_XDIE1+3]),
	S_NORMAL1 (CLER, 'U',	5, NULL			, &States[S_CLERIC_XDIE1+4]),
	S_NORMAL1 (CLER, 'V',	5, NULL			, &States[S_CLERIC_XDIE1+5]),
	S_NORMAL1 (CLER, 'W',	5, NULL			, &States[S_CLERIC_XDIE1+6]),
	S_NORMAL1 (CLER, 'X',	5, NULL			, &States[S_CLERIC_XDIE1+7]),
	S_NORMAL1 (CLER, 'Y',	5, NULL			, &States[S_CLERIC_XDIE1+8]),
	S_NORMAL1 (CLER, 'Z',	5, NULL			, &States[S_CLERIC_XDIE1+9]),
	S_NORMAL1 (CLER, '[',   -1, NULL		, NULL),

#define S_CLERIC_ICE (S_CLERIC_XDIE1+10)
	S_NORMAL1 (CLER, '\\',	5, A_FreezeDeath	, &States[S_CLERIC_ICE+1]),
	S_NORMAL1 (CLER, '\\',	1, A_FreezeDeathChunks	, &States[S_CLERIC_ICE+1]),

#define S_CLERIC_BURN (S_CLERIC_ICE+2)
	S_BRIGHT (FDTH, 'C',	5, A_ClericBurnScream	, &States[S_CLERIC_BURN+1]),
	S_BRIGHT (FDTH, 'D',	4, NULL			, &States[S_CLERIC_BURN+2]),
	S_BRIGHT (FDTH, 'G',	5, NULL			, &States[S_CLERIC_BURN+3]),
	S_BRIGHT (FDTH, 'H',	4, A_Scream		, &States[S_CLERIC_BURN+4]),
	S_BRIGHT (FDTH, 'I',	5, NULL			, &States[S_CLERIC_BURN+5]),
	S_BRIGHT (FDTH, 'J',	4, NULL			, &States[S_CLERIC_BURN+6]),
	S_BRIGHT (FDTH, 'K',	5, NULL			, &States[S_CLERIC_BURN+7]),
	S_BRIGHT (FDTH, 'L',	4, NULL			, &States[S_CLERIC_BURN+8]),
	S_BRIGHT (FDTH, 'M',	5, NULL			, &States[S_CLERIC_BURN+9]),
	S_BRIGHT (FDTH, 'N',	4, NULL			, &States[S_CLERIC_BURN+10]),
	S_BRIGHT (FDTH, 'O',	5, NULL			, &States[S_CLERIC_BURN+11]),
	S_BRIGHT (FDTH, 'P',	4, NULL			, &States[S_CLERIC_BURN+12]),
	S_BRIGHT (FDTH, 'Q',	5, NULL			, &States[S_CLERIC_BURN+13]),
	S_BRIGHT (FDTH, 'R',	4, NULL			, &States[S_CLERIC_BURN+14]),
	S_BRIGHT (FDTH, 'S',	5, A_NoBlocking		, &States[S_CLERIC_BURN+15]),
	S_BRIGHT (FDTH, 'T',	4, NULL			, &States[S_CLERIC_BURN+16]),
	S_BRIGHT (FDTH, 'U',	5, NULL			, &States[S_CLERIC_BURN+17]),
	S_BRIGHT (FDTH, 'V',	4, NULL			, &States[S_CLERIC_BURN+18]),
	S_NORMAL1(ACLO, 'E',   35, A_CheckBurnGone	, &States[S_CLERIC_BURN+18]),
	S_NORMAL1(ACLO, 'E',	8, NULL			, NULL),
};

------------------------------------------------------------------------

//========== The Cleric's firestorm spell

IMPLEMENT_ACTOR (ACWeapFlame, Hexen, 8009, 0)
	PROP_Flags (MF_SPECIAL|MF_NOGRAVITY)
	PROP_SpawnState (S_CFLAME1)
END_DEFAULTS

FState ACWeapFlame::States[] =
{
#define S_CFLAME1 0
	S_BRIGHT (WCFM, 'A',	4, NULL			, &States[S_CFLAME1+1]),
	S_BRIGHT (WCFM, 'B',	4, NULL			, &States[S_CFLAME1+2]),
	S_BRIGHT (WCFM, 'C',	4, NULL			, &States[S_CFLAME1+3]),
	S_BRIGHT (WCFM, 'D',	4, NULL			, &States[S_CFLAME1+4]),
	S_BRIGHT (WCFM, 'E',	4, NULL			, &States[S_CFLAME1+5]),
	S_BRIGHT (WCFM, 'F',	4, NULL			, &States[S_CFLAME1+6]),
	S_BRIGHT (WCFM, 'G',	4, NULL			, &States[S_CFLAME1+7]),
	S_BRIGHT (WCFM, 'H',	4, NULL			, &States[S_CFLAME1]),

#define S_CFLAMEREADY (S_CFLAME1+8)
	S_NORMAL1(CFLM, 'A',	1, A_WeaponReady	, &States[S_CFLAMEREADY+1]),
	S_NORMAL1(CFLM, 'A',	1, A_WeaponReady	, &States[S_CFLAMEREADY+2]),
	S_NORMAL1(CFLM, 'A',	1, A_WeaponReady	, &States[S_CFLAMEREADY+3]),
	S_NORMAL1(CFLM, 'A',	1, A_WeaponReady	, &States[S_CFLAMEREADY+4]),
	S_NORMAL1(CFLM, 'B',	1, A_WeaponReady	, &States[S_CFLAMEREADY+5]),
	S_NORMAL1(CFLM, 'B',	1, A_WeaponReady	, &States[S_CFLAMEREADY+6]),
	S_NORMAL1(CFLM, 'B',	1, A_WeaponReady	, &States[S_CFLAMEREADY+7]),
	S_NORMAL1(CFLM, 'B',	1, A_WeaponReady	, &States[S_CFLAMEREADY+8]),
	S_NORMAL1(CFLM, 'C',	1, A_WeaponReady	, &States[S_CFLAMEREADY+9]),
	S_NORMAL1(CFLM, 'C',	1, A_WeaponReady	, &States[S_CFLAMEREADY+10]),
	S_NORMAL1(CFLM, 'C',	1, A_WeaponReady	, &States[S_CFLAMEREADY+11]),
	S_NORMAL1(CFLM, 'C',	1, A_WeaponReady	, &States[S_CFLAMEREADY]),

#define S_CFLAMEDOWN (S_CFLAMEREADY+12)
	S_NORMAL1(CFLM, 'A',	1, A_Lower		, &States[S_CFLAMEDOWN]),

#define S_CFLAMEUP (S_CFLAMEDOWN+1)
	S_NORMAL1(CFLM, 'A',	1, A_Raise		, &States[S_CFLAMEUP]),

#define S_CFLAMEATK (S_CFLAMEUP+1)
	S_NORMAL2 (CFLM, 'A',	2, NULL			, &States[S_CFLAMEATK+1], 0, 40),
	S_NORMAL2 (CFLM, 'D',	2, NULL			, &States[S_CFLAMEATK+2], 0, 50),
	S_NORMAL2 (CFLM, 'D',	2, NULL			, &States[S_CFLAMEATK+3], 0, 36),
	S_BRIGHT (CFLM, 'E',	4, NULL			, &States[S_CFLAMEATK+4]),
	S_BRIGHT (CFLM, 'F',	4, A_CFlameAttack	, &States[S_CFLAMEATK+5]),
	S_BRIGHT (CFLM, 'E',	4, NULL			, &States[S_CFLAMEATK+6]),
	S_NORMAL2 (CFLM, 'G',	2, NULL			, &States[S_CFLAMEATK+7], 0, 40),
	S_NORMAL1(CFLM, 'G',	2, NULL			, &States[S_CFLAMEREADY]),
};

FWeaponInfo ACWeapFlame::WeaponInfo =
{
	0,					// DWORD           flags;
	MANA_2,					// ammotype_t      ammo;
	4,					// int             ammouse;
	25,					// int             ammogive;
	&States[S_CFLAMEUP],			// FState          *upstate;
	&States[S_CFLAMEDOWN],			// FState          *downstate;
	&States[S_CFLAMEREADY],			// FState          *readystate;
	&States[S_CFLAMEATK],			// FState          *atkstate;
	&States[S_CFLAMEATK],			// FState          *holdatkstate;
	NULL,					// FState          *flashstate;
	NULL,					// const TypeInfo  *droptype;
	150,					// int             kickback;
	6*FRACUNIT,				// fixed_t         yadjust;
	NULL,					// const char      *upsound;
	NULL,					// const char      *readysound;
	ZDRUNTIME_CLASS(ACWeapFlame),		// TypeInfo        *type;      // type of actor that represents this weapon
	-1					// int             minammo;    // minimum ammo needed to switch to this weapon
};

------------------------------------------------------------------------

//========== Firestorm floor flame

IMPLEMENT_ACTOR (ACFlameFloor, Hexen, -1, 0)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
	PROP_RenderStyle (STYLE_Add)
	PROP_SpawnState (0)
END_DEFAULTS

FState ACFlameFloor::States[] =
{
	S_BRIGHT (CFFX, 'N',	5, NULL, &States[1]),
	S_BRIGHT (CFFX, 'O',	4, NULL, &States[2]),
	S_BRIGHT (CFFX, 'P',	3, NULL, NULL),
};

------------------------------------------------------------------------

//========== Firestorm puff

IMPLEMENT_ACTOR (AFlamePuff, Hexen, -1, 0)
	PROP_RadiusFixed (1)
	PROP_HeightFixed (1)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
	PROP_RenderStyle (STYLE_Add)
	PROP_SpawnState (0)
	PROP_SeeSound ("ClericFlameExplode")
	PROP_AttackSound ("ClericFlameExplode")
END_DEFAULTS

FState AFlamePuff::States[] =
{
	S_BRIGHT (CFFX, 'A',	3, NULL, &States[1]),
	S_BRIGHT (CFFX, 'B',	3, NULL, &States[2]),
	S_BRIGHT (CFFX, 'C',	3, NULL, &States[3]),
	S_BRIGHT (CFFX, 'D',	4, NULL, &States[4]),
	S_BRIGHT (CFFX, 'E',	3, NULL, &States[5]),
	S_BRIGHT (CFFX, 'F',	4, NULL, &States[6]),
	S_BRIGHT (CFFX, 'G',	3, NULL, &States[7]),
	S_BRIGHT (CFFX, 'H',	4, NULL, &States[8]),
	S_BRIGHT (CFFX, 'I',	3, NULL, &States[9]),
	S_BRIGHT (CFFX, 'J',	4, NULL, &States[10]),
	S_BRIGHT (CFFX, 'K',	3, NULL, &States[11]),
	S_BRIGHT (CFFX, 'L',	4, NULL, &States[12]),
	S_BRIGHT (CFFX, 'M',	3, NULL, NULL),
};

------------------------------------------------------------------------

//========== Firestorm puff 2

IMPLEMENT_ACTOR (AFlamePuff2, Hexen, -1, 0)
	PROP_RadiusFixed (1)
	PROP_HeightFixed (1)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
	PROP_RenderStyle (STYLE_Add)
	PROP_SpawnState (0)
	PROP_SeeSound ("ClericFlameExplode")
	PROP_AttackSound ("ClericFlameExplode")
END_DEFAULTS

FState AFlamePuff2::States[] =
{
	S_BRIGHT (CFFX, 'A',	3, NULL, &States[1]),
	S_BRIGHT (CFFX, 'B',	3, NULL, &States[2]),
	S_BRIGHT (CFFX, 'C',	3, NULL, &States[3]),
	S_BRIGHT (CFFX, 'D',	4, NULL, &States[4]),
	S_BRIGHT (CFFX, 'E',	3, NULL, &States[5]),
	S_BRIGHT (CFFX, 'F',	4, NULL, &States[6]),
	S_BRIGHT (CFFX, 'G',	3, NULL, &States[7]),
	S_BRIGHT (CFFX, 'H',	4, NULL, &States[8]),
	S_BRIGHT (CFFX, 'I',	3, NULL, &States[9]),
	S_BRIGHT (CFFX, 'C',	3, NULL, &States[10]),
	S_BRIGHT (CFFX, 'D',	4, NULL, &States[11]),
	S_BRIGHT (CFFX, 'E',	3, NULL, &States[12]),
	S_BRIGHT (CFFX, 'F',	4, NULL, &States[13]),
	S_BRIGHT (CFFX, 'G',	3, NULL, &States[14]),
	S_BRIGHT (CFFX, 'H',	4, NULL, &States[15]),
	S_BRIGHT (CFFX, 'I',	3, NULL, &States[16]),
	S_BRIGHT (CFFX, 'J',	4, NULL, &States[17]),
	S_BRIGHT (CFFX, 'K',	3, NULL, &States[18]),
	S_BRIGHT (CFFX, 'L',	4, NULL, &States[19]),
	S_BRIGHT (CFFX, 'M',	3, NULL, NULL),
};

------------------------------------------------------------------------

//========== Firestorm circle flame

IMPLEMENT_ACTOR (ACircleFlame, Hexen, -1, 0)
	PROP_RadiusFixed (6)
	PROP_Damage (2)
	PROP_DamageType (MOD_FIRE)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_RenderStyle (STYLE_Add)
	PROP_SpawnState (S_CIRCLE_FLAME1)
	PROP_DeathState (S_CIRCLE_FLAME_X1)
	PROP_DeathSound ("ClericFlameCircle")
END_DEFAULTS

FState ACircleFlame::States[] =
{
#define S_CIRCLE_FLAME1 0
	S_BRIGHT (CFCF, 'A',	4, NULL		    , &States[S_CIRCLE_FLAME1+1]),
	S_BRIGHT (CFCF, 'B',	2, A_CFlameRotate   , &States[S_CIRCLE_FLAME1+2]),
	S_BRIGHT (CFCF, 'C',	2, NULL		    , &States[S_CIRCLE_FLAME1+3]),
	S_BRIGHT (CFCF, 'D',	1, NULL		    , &States[S_CIRCLE_FLAME1+4]),
	S_BRIGHT (CFCF, 'E',	2, NULL		    , &States[S_CIRCLE_FLAME1+5]),
	S_BRIGHT (CFCF, 'F',	2, A_CFlameRotate   , &States[S_CIRCLE_FLAME1+6]),
	S_BRIGHT (CFCF, 'G',	1, NULL		    , &States[S_CIRCLE_FLAME1+7]),
	S_BRIGHT (CFCF, 'H',	2, NULL		    , &States[S_CIRCLE_FLAME1+8]),
	S_BRIGHT (CFCF, 'I',	2, NULL		    , &States[S_CIRCLE_FLAME1+9]),
	S_BRIGHT (CFCF, 'J',	1, A_CFlameRotate   , &States[S_CIRCLE_FLAME1+10]),
	S_BRIGHT (CFCF, 'K',	2, NULL		    , &States[S_CIRCLE_FLAME1+11]),
	S_BRIGHT (CFCF, 'L',	3, NULL		    , &States[S_CIRCLE_FLAME1+12]),
	S_BRIGHT (CFCF, 'M',	3, NULL		    , &States[S_CIRCLE_FLAME1+13]),
	S_BRIGHT (CFCF, 'N',	2, A_CFlameRotate   , &States[S_CIRCLE_FLAME1+14]),
	S_BRIGHT (CFCF, 'O',	3, NULL		    , &States[S_CIRCLE_FLAME1+15]),
	S_BRIGHT (CFCF, 'P',	2, NULL		    , NULL),

#define S_CIRCLE_FLAME_X1 (S_CIRCLE_FLAME1+16)
	S_BRIGHT (CFCF, 'Q',	3, NULL		    , &States[S_CIRCLE_FLAME_X1+1]),
	S_BRIGHT (CFCF, 'R',	3, NULL		    , &States[S_CIRCLE_FLAME_X1+2]),
	S_BRIGHT (CFCF, 'S',	3, A_Explode	    , &States[S_CIRCLE_FLAME_X1+3]),
	S_BRIGHT (CFCF, 'T',	3, NULL		    , &States[S_CIRCLE_FLAME_X1+4]),
	S_BRIGHT (CFCF, 'U',	3, NULL		    , &States[S_CIRCLE_FLAME_X1+5]),
	S_BRIGHT (CFCF, 'V',	3, NULL		    , &States[S_CIRCLE_FLAME_X1+6]),
	S_BRIGHT (CFCF, 'W',	3, NULL		    , &States[S_CIRCLE_FLAME_X1+7]),
	S_BRIGHT (CFCF, 'X',	3, NULL		    , &States[S_CIRCLE_FLAME_X1+8]),
	S_BRIGHT (CFCF, 'Y',	3, NULL		    , &States[S_CIRCLE_FLAME_X1+9]),
	S_BRIGHT (CFCF, 'Z',	3, NULL		    , NULL),
};

------------------------------------------------------------------------

//========== Firestom missile

IMPLEMENT_ACTOR (ACFlameMissile, Hexen, -1, 0)
	PROP_SpeedFixed (200)
	PROP_RadiusFixed (14)
	PROP_HeightFixed (8)
	PROP_Damage (8)
	PROP_DamageType (MOD_FIRE)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
	PROP_Flags2 (MF2_NOTELEPORT|MF2_IMPACT|MF2_PCROSS)
	PROP_RenderFlags (RF_INVISIBLE)
	PROP_RenderStyle (STYLE_Add)
	PROP_SpawnState (S_CFLAME_MISSILE1)
	PROP_DeathState (S_CFLAME_MISSILE_X)
END_DEFAULTS

FState ACFlameMissile::States[] =
{
#define S_CFLAME_MISSILE1 0
	S_BRIGHT (CFFX, 'A',	4, NULL			, &States[S_CFLAME_MISSILE1+1]),
	S_NORMAL1(CFFX, 'A',	1, A_CFlamePuff		, &AFlamePuff::States[0]),

#define S_CFLAME_MISSILE_X (S_CFLAME_MISSILE1+2)
	S_BRIGHT (CFFX, 'A',	1, A_CFlameMissile	, &AFlamePuff::States[0]),
};

------------------------------------------------------------------------

//========== One of three pieces of the Wraithverge (cleric's fourth weapon).

IMPLEMENT_ACTOR (ACWeaponPiece1, Hexen, 18, 33)
	PROP_Flags (MF_SPECIAL)
	PROP_Flags2 (MF2_FLOATBOB)
	PROP_SpawnState (0)
END_DEFAULTS

FState ACWeaponPiece1::States[] =
{
	S_BRIGHT (WCH1, 'A',   -1, NULL, NULL),
};

------------------------------------------------------------------------

//========== One of three pieces of the Wraithverge (cleric's fourth weapon).

IMPLEMENT_ACTOR (ACWeaponPiece2, Hexen, 19, 34)
	PROP_Flags (MF_SPECIAL)
	PROP_Flags2 (MF2_FLOATBOB)
	PROP_SpawnState (0)
END_DEFAULTS

FState ACWeaponPiece2::States[] =
{
	S_BRIGHT (WCH2, 'A',   -1, NULL, NULL),
};

------------------------------------------------------------------------

//========== One of three pieces of the Wraithverge (cleric's fourth weapon).

IMPLEMENT_ACTOR (ACWeaponPiece3, Hexen, 20, 35)
	PROP_Flags (MF_SPECIAL)
	PROP_Flags2 (MF2_FLOATBOB)
	PROP_SpawnState (0)
END_DEFAULTS

FState ACWeaponPiece3::States[] =
{
	S_BRIGHT (WCH3, 'A',   -1, NULL, NULL),
};

------------------------------------------------------------------------

//========== An actor that spawns the three pieces of the Wraithverge (cleric's fourth weapon). It gets spawned if weapon drop is on so that other players can pick up the dead player's weapon.

IMPLEMENT_ACTOR (AWraithvergeDrop, Hexen, -1, 0)
	PROP_SpawnState (0)
END_DEFAULTS

FState AWraithvergeDrop::States[] =
{
	S_NORMAL1(TNT1, 'A', 1, NULL, &States[1]),
	S_NORMAL1(TNT1, 'A', 1, A_DropWraithvergePieces, NULL)
};

------------------------------------------------------------------------

//========== Wraithverge: cleric's ultimate weapon

IMPLEMENT_ACTOR (ACWeapWraithverge, Hexen, -1, 0)
	PROP_Flags (MF_SPECIAL)
	PROP_SpawnState (0)
END_DEFAULTS

FState ACWeapWraithverge::States[] =
{
	// Dummy state, because the fourth weapon does not appear in a level directly.
	S_NORMAL1(TNT1, 'A',   -1, NULL		    , NULL),

#define S_CHOLYREADY 1
	S_NORMAL1(CHLY, 'A',	1, A_WeaponReady    , &States[S_CHOLYREADY]),

#define S_CHOLYDOWN (S_CHOLYREADY+1)
	S_NORMAL1(CHLY, 'A',	1, A_Lower	    , &States[S_CHOLYDOWN]),

#define S_CHOLYUP (S_CHOLYDOWN+1)
	S_NORMAL1(CHLY, 'A',	1, A_Raise	    , &States[S_CHOLYUP]),

#define S_CHOLYATK (S_CHOLYUP+1)
	S_BRIGHT2 (CHLY, 'A',	1, NULL		    , &States[S_CHOLYATK+1], 0, 40),
	S_BRIGHT2 (CHLY, 'B',	1, NULL		    , &States[S_CHOLYATK+2], 0, 40),
	S_BRIGHT2 (CHLY, 'C',	2, NULL		    , &States[S_CHOLYATK+3], 0, 43),
	S_BRIGHT2 (CHLY, 'D',	2, NULL		    , &States[S_CHOLYATK+4], 0, 43),
	S_BRIGHT2 (CHLY, 'E',	2, NULL		    , &States[S_CHOLYATK+5], 0, 45),
	S_BRIGHT2 (CHLY, 'F',	6, A_CHolyAttack    , &States[S_CHOLYATK+6], 0, 48),
	S_BRIGHT2 (CHLY, 'G',	2, A_CHolyPalette   , &States[S_CHOLYATK+7], 0, 40),
	S_BRIGHT2 (CHLY, 'G',	2, A_CHolyPalette   , &States[S_CHOLYATK+8], 0, 40),
	S_BRIGHT2 (CHLY, 'G',	2, A_CHolyPalette   , &States[S_CHOLYREADY], 0, 36)
};

FWeaponInfo ACWeapWraithverge::WeaponInfo =
{
	0,					// DWORD           flags;
	MANA_BOTH,				// ammotype_t      ammo;
	18,					// int             ammouse;
	0,					// int             ammogive;
	&States[S_CHOLYUP],			// FState          *upstate;
	&States[S_CHOLYDOWN],			// FState          *downstate;
	&States[S_CHOLYREADY],			// FState          *readystate;
	&States[S_CHOLYATK],			// FState          *atkstate;
	&States[S_CHOLYATK],			// FState          *holdatkstate;
	NULL,					// FState          *flashstate;
	NULL,					// const TypeInfo  *droptype;
	150,					// int             kickback;
	0,					// fixed_t         yadjust;
	NULL,					// const char      *upsound;
	NULL,					// const char      *readysound;
	ZDRUNTIME_CLASS(ACWeapWraithverge),	// TypeInfo    *type;    	// type of actor that represents this weapon
	-1					// int             minammo;	// minimum ammo needed to switch to this weapon
};

------------------------------------------------------------------------

//========== Wraithverge spirit ball

IMPLEMENT_ACTOR (AHolyMissile, Hexen, -1, 0)
	PROP_SpeedFixed (30)
	PROP_RadiusFixed (15)
	PROP_HeightFixed (8)
	PROP_Damage (4)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_SpawnState (0)
	PROP_DeathState (4)
END_DEFAULTS

FState AHolyMissile::States[] =
{
	S_BRIGHT (SPIR, 'P',	3, A_CHolySpawnPuff	, &States[1]),
	S_BRIGHT (SPIR, 'P',	3, A_CHolySpawnPuff	, &States[2]),
	S_BRIGHT (SPIR, 'P',	3, A_CHolySpawnPuff	, &States[3]),
	S_BRIGHT (SPIR, 'P',	3, A_CHolySpawnPuff	, &States[4]),
	S_BRIGHT (SPIR, 'P',	1, A_CHolyAttack2	, NULL),
};

------------------------------------------------------------------------

//========== Wraithverge spirit ball puff

IMPLEMENT_ACTOR (AHolyMissilePuff, Hexen, -1, 0)
	PROP_RadiusFixed (4)
	PROP_HeightFixed (8)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_Flags4 (MF4_NONETSPAWN)
	PROP_RenderStyle (STYLE_Translucent)
	PROP_Alpha (HX_ALTSHADOW)
	PROP_SpawnState (0)
END_DEFAULTS

FState AHolyMissilePuff::States[] =
{
	S_NORMAL1(SPIR, 'Q',	3, NULL, &States[1]),
	S_NORMAL1(SPIR, 'R',	3, NULL, &States[2]),
	S_NORMAL1(SPIR, 'S',	3, NULL, &States[3]),
	S_NORMAL1(SPIR, 'T',	3, NULL, &States[4]),
	S_NORMAL1(SPIR, 'U',	3, NULL, NULL),
};

------------------------------------------------------------------------

//========== Wraithverge spirit puff

IMPLEMENT_ACTOR (AHolyPuff, Hexen, -1, 0)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
	PROP_Flags4 (MF4_NONETSPAWN)
	PROP_RenderStyle (STYLE_Translucent)
	PROP_Alpha (HX_SHADOW)
	PROP_SpawnState (0)
END_DEFAULTS

FState AHolyPuff::States[] =
{
	S_NORMAL1(SPIR, 'K',	3, NULL, &States[1]),
	S_NORMAL1(SPIR, 'L',	3, NULL, &States[2]),
	S_NORMAL1(SPIR, 'M',	3, NULL, &States[3]),
	S_NORMAL1(SPIR, 'N',	3, NULL, &States[4]),
	S_NORMAL1(SPIR, 'O',	3, NULL, NULL),
};

------------------------------------------------------------------------

//========== Wraithverge spirit

IMPLEMENT_ACTOR (AHolySpirit, Hexen, -1, 0)
	PROP_SpawnHealth (105)
	PROP_SpeedFixed (12)
	PROP_RadiusFixed (10)
	PROP_HeightFixed (6)
	PROP_Damage (3)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
	PROP_Flags2 (MF2_NOTELEPORT|MF2_RIP|MF2_IMPACT|MF2_PCROSS|MF2_SEEKERMISSILE)
	PROP_Flags3 (MF3_FOILINVUL|MF3_SKYEXPLODE|MF3_NOEXPLODEFLOOR|MF3_CANBLAST)
	PROP_RenderStyle (STYLE_Translucent)
	PROP_Alpha (HX_ALTSHADOW)
	PROP_SpawnState (S_HOLY_FX1)
	PROP_DeathState (S_HOLY_FX_X1)
	PROP_DeathSound ("SpiritDie")
END_DEFAULTS

FState AHolySpirit::States[] =
{
#define S_HOLY_FX1 0
	S_NORMAL1(SPIR, 'A',	2, A_CHolySeek		, &States[S_HOLY_FX1+1]),
	S_NORMAL1(SPIR, 'A',	2, A_CHolySeek		, &States[S_HOLY_FX1+2]),
	S_NORMAL1(SPIR, 'B',	2, A_CHolySeek		, &States[S_HOLY_FX1+3]),
	S_NORMAL1(SPIR, 'B',	2, A_CHolyCheckScream	, &States[S_HOLY_FX1]),

#define S_HOLY_FX_X1 (S_HOLY_FX1+4)
	S_NORMAL1(SPIR, 'D',	4, NULL			, &States[S_HOLY_FX_X1+1]),
	S_NORMAL1(SPIR, 'E',	4, A_Scream		, &States[S_HOLY_FX_X1+2]),
	S_NORMAL1(SPIR, 'F',	4, NULL			, &States[S_HOLY_FX_X1+3]),
	S_NORMAL1(SPIR, 'G',	4, NULL			, &States[S_HOLY_FX_X1+4]),
	S_NORMAL1(SPIR, 'H',	4, NULL			, &States[S_HOLY_FX_X1+5]),
	S_NORMAL1(SPIR, 'I',	4, NULL			, NULL),
};

------------------------------------------------------------------------

//========== Wraithverge spirit tail

IMPLEMENT_ACTOR (AHolyTail, Hexen, -1, 0)
	PROP_RadiusFixed (1)
	PROP_HeightFixed (1)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_NOCLIP)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_RenderStyle (STYLE_Translucent)
	PROP_Alpha (HX_ALTSHADOW)
	PROP_SpawnState (0)
END_DEFAULTS

FState AHolyTail::States[] =
{
	S_NORMAL1(SPIR, 'C',	1, A_CHolyTail	, &States[0]),
	S_NORMAL1(SPIR, 'D',   -1, NULL		, NULL),
};

------------------------------------------------------------------------

//========== Wraithverge spirit trail

IMPLEMENT_STATELESS_ACTOR (AHolyTailTrail, Hexen, -1, 0)
	PROP_SpawnState (1)
END_DEFAULTS

------------------------------------------------------------------------

//========== Mace of contrition

IMPLEMENT_ACTOR (ACWeapMace, Hexen, -1, 0)
END_DEFAULTS

FState ACWeapMace::States[] =
{
#define S_CMACEREADY 0
	S_NORMAL1(CMCE, 'A',	1, A_WeaponReady    , &States[S_CMACEREADY]),

#define S_CMACEDOWN (S_CMACEREADY+1)
	S_NORMAL1(CMCE, 'A',	1, A_Lower	    , &States[S_CMACEDOWN]),

#define S_CMACEUP (S_CMACEDOWN+1)
	S_NORMAL1(CMCE, 'A',	1, A_Raise	    , &States[S_CMACEUP]),

#define S_CMACEATK (S_CMACEUP+1)
	S_NORMAL2 (CMCE, 'B',	2, NULL		    , &States[S_CMACEATK+1], 60, 20),
	S_NORMAL2 (CMCE, 'B',	1, NULL		    , &States[S_CMACEATK+2], 30, 33),
	S_NORMAL2 (CMCE, 'B',	2, NULL		    , &States[S_CMACEATK+3], 8, 45),
	S_NORMAL2 (CMCE, 'C',	1, NULL		    , &States[S_CMACEATK+4], 8, 45),
	S_NORMAL2 (CMCE, 'D',	1, NULL		    , &States[S_CMACEATK+5], 8, 45),
	S_NORMAL2 (CMCE, 'E',	1, NULL		    , &States[S_CMACEATK+6], 8, 45),
	S_NORMAL2 (CMCE, 'E',	1, A_CMaceAttack    , &States[S_CMACEATK+7], -11, 58),
	S_NORMAL2 (CMCE, 'F',	1, NULL		    , &States[S_CMACEATK+8], 8, 45),
	S_NORMAL2 (CMCE, 'F',	2, NULL		    , &States[S_CMACEATK+9], -8, 74),
	S_NORMAL2 (CMCE, 'F',	1, NULL		    , &States[S_CMACEATK+10], -20, 96),
	S_NORMAL2 (CMCE, 'F',	8, NULL		    , &States[S_CMACEATK+11], -33, 160),
	S_NORMAL2 (CMCE, 'A',	2, A_ReFire	    , &States[S_CMACEATK+12], 8, 75),
	S_NORMAL2 (CMCE, 'A',	1, NULL		    , &States[S_CMACEATK+13], 8, 65),
	S_NORMAL2 (CMCE, 'A',	2, NULL		    , &States[S_CMACEATK+14], 8, 60),
	S_NORMAL2 (CMCE, 'A',	1, NULL		    , &States[S_CMACEATK+15], 8, 55),
	S_NORMAL2 (CMCE, 'A',	2, NULL		    , &States[S_CMACEATK+16], 8, 50),
	S_NORMAL2 (CMCE, 'A',	1, NULL		    , &States[S_CMACEREADY], 8, 45),
};

FWeaponInfo ACWeapMace::WeaponInfo =
{
	0,				// DWORD           flags;
	MANA_NONE,			// ammotype_t      ammo;
	0,				// int             ammouse;
	0,				// int             ammogive;
	&States[S_CMACEUP],		// FState          *upstate;
	&States[S_CMACEDOWN],		// FState          *downstate;
	&States[S_CMACEREADY],		// FState          *readystate;
	&States[S_CMACEATK],		// FState          *atkstate;
	&States[S_CMACEATK],		// FState          *holdatkstate;
	NULL,				// FState          *flashstate;
	NULL,				// const TypeInfo  *droptype;
	150,				// int             kickback;
	-8*FRACUNIT,			// fixed_t         yadjust;
	NULL,				// const char      *upsound;
	NULL,				// const char      *readysound;
	ZDRUNTIME_CLASS(ACWeapMace),	// TypeInfo        *type;      // type of actor that represents this weapon
	-1				// int             minammo;    // minimum ammo needed to switch to this weapon
};

------------------------------------------------------------------------

//========== The Cleric is one of the three character classes available to Hexen players.

IMPLEMENT_ACTOR (AClericPlayer, Hexen, -1, 0)
	PROP_SpawnHealth (100)
	PROP_ReactionTime (0)
	PROP_PainChance (255)
	PROP_RadiusFixed (16)
	PROP_HeightFixed (64)
	PROP_SpeedFixed (1)
	PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_DROPOFF|MF_PICKUP|MF_NOTDMATCH|MF_FRIENDLY)
	PROP_Flags2 (MF2_WINDTHRUST|MF2_FLOORCLIP|MF2_SLIDE|MF2_PASSMOBJ|MF2_TELESTOMP|MF2_PUSHWALL)
	PROP_Flags3 (MF3_NOBLOCKMONST)
	PROP_Flags4 (MF4_NOSKIN)
	PROP_SpawnState (S_CPLAY)
	PROP_SeeState (S_CPLAY_RUN1)
	PROP_PainState (S_CPLAY_PAIN)
	PROP_MissileState (S_CPLAY_ATK1)
	PROP_DeathState (S_CPLAY_DIE1)
	PROP_XDeathState (S_CPLAY_XDIE1)
	PROP_BDeathState (S_PLAY_C_FDTH)
	PROP_IDeathState (S_CPLAY_ICE)
	PROP_PainSound ("PlayerClericPain")
END_DEFAULTS

FState AClericPlayer::States[] =
{
#define S_CPLAY 0
	S_NORMAL1(CLER, 'A',   -1, NULL		    , NULL),

#define S_CPLAY_RUN1 (S_CPLAY+1)
	S_NORMAL1(CLER, 'A',	4, NULL		    , &States[S_CPLAY_RUN1+1]),
	S_NORMAL1(CLER, 'B',	4, NULL		    , &States[S_CPLAY_RUN1+2]),
	S_NORMAL1(CLER, 'C',	4, NULL		    , &States[S_CPLAY_RUN1+3]),
	S_NORMAL1(CLER, 'D',	4, NULL		    , &States[S_CPLAY_RUN1]),

#define S_CPLAY_PAIN (S_CPLAY_RUN1+4)
	S_NORMAL1(CLER, 'H',	4, NULL		    , &States[S_CPLAY_PAIN+1]),
	S_NORMAL1(CLER, 'H',	4, A_Pain	    , &States[S_CPLAY]),

#define S_CPLAY_ATK1 (S_CPLAY_PAIN+2)
	S_NORMAL1(CLER, 'E',	6, NULL		    , &States[S_CPLAY_ATK1+1]),
	S_NORMAL1(CLER, 'F',	6, NULL		    , &States[S_CPLAY_ATK1+2]),
	S_NORMAL1(CLER, 'G',	6, NULL		    , &States[S_CPLAY]),

#define S_CPLAY_DIE1 (S_CPLAY_ATK1+3)
	S_NORMAL1(CLER, 'I',	6, NULL		    , &States[S_CPLAY_DIE1+1]),
	S_NORMAL1(CLER, 'K',	6, A_PlayerScream   , &States[S_CPLAY_DIE1+2]),
	S_NORMAL1(CLER, 'L',	6, NULL		    , &States[S_CPLAY_DIE1+3]),
	S_NORMAL1(CLER, 'L',	6, NULL		    , &States[S_CPLAY_DIE1+4]),
	S_NORMAL1(CLER, 'M',	6, A_NoBlocking	    , &States[S_CPLAY_DIE1+5]),
	S_NORMAL1(CLER, 'N',	6, NULL		    , &States[S_CPLAY_DIE1+6]),
	S_NORMAL1(CLER, 'O',	6, NULL		    , &States[S_CPLAY_DIE1+7]),
	S_NORMAL1(CLER, 'P',	6, NULL		    , &States[S_CPLAY_DIE1+8]),
	S_NORMAL1(CLER, 'Q',   -1, NULL/*A_AddPlayerCorpse*/, NULL),

#define S_CPLAY_XDIE1 (S_CPLAY_DIE1+9)
	S_NORMAL1(CLER, 'R',	5, A_PlayerScream   , &States[S_CPLAY_XDIE1+1]),
	S_NORMAL1(CLER, 'S',	5, NULL		    , &States[S_CPLAY_XDIE1+2]),
	S_NORMAL1(CLER, 'T',	5, A_NoBlocking	    , &States[S_CPLAY_XDIE1+3]),
	S_NORMAL1(CLER, 'U',	5, NULL		    , &States[S_CPLAY_XDIE1+4]),
	S_NORMAL1(CLER, 'V',	5, NULL		    , &States[S_CPLAY_XDIE1+5]),
	S_NORMAL1(CLER, 'W',	5, NULL		    , &States[S_CPLAY_XDIE1+6]),
	S_NORMAL1(CLER, 'X',	5, NULL		    , &States[S_CPLAY_XDIE1+7]),
	S_NORMAL1(CLER, 'Y',	5, NULL		    , &States[S_CPLAY_XDIE1+8]),
	S_NORMAL1(CLER, 'Z',	5, NULL		    , &States[S_CPLAY_XDIE1+9]),
	S_NORMAL1(CLER, '[',   -1, NULL/*A_AddPlayerCorpse*/, NULL),

#define S_CPLAY_ICE (S_CPLAY_XDIE1+10)
	S_NORMAL1(CLER, '\\',	5, A_FreezeDeath    , &States[S_CPLAY_ICE+1]),
	S_NORMAL1(CLER, '\\',	1, A_FreezeDeathChunks, &States[S_CPLAY_ICE+1]),

#define S_PLAY_C_FDTH (S_CPLAY_ICE+2)
	S_BRIGHT (FDTH, 'C',	5, NULL		    , &States[S_PLAY_C_FDTH+1]),
	S_BRIGHT (FDTH, 'D',	4, NULL		    , &States[S_PLAY_C_FDTH+2]),

#define S_PLAY_FDTH (S_PLAY_C_FDTH+2)
	S_BRIGHT (FDTH, 'G',	5, A_FireScream	    , &States[S_PLAY_FDTH+1]),
	S_BRIGHT (FDTH, 'H',	4, A_PlayerScream   , &States[S_PLAY_FDTH+2]),
	S_BRIGHT (FDTH, 'I',	5, NULL 	    , &States[S_PLAY_FDTH+3]),
	S_BRIGHT (FDTH, 'J',	4, NULL 	    , &States[S_PLAY_FDTH+4]),
	S_BRIGHT (FDTH, 'K',	5, NULL 	    , &States[S_PLAY_FDTH+5]),
	S_BRIGHT (FDTH, 'L',	4, NULL 	    , &States[S_PLAY_FDTH+6]),
	S_BRIGHT (FDTH, 'M',	5, NULL 	    , &States[S_PLAY_FDTH+7]),
	S_BRIGHT (FDTH, 'N',	4, NULL 	    , &States[S_PLAY_FDTH+8]),
	S_BRIGHT (FDTH, 'O',	5, NULL 	    , &States[S_PLAY_FDTH+9]),
	S_BRIGHT (FDTH, 'P',	4, NULL 	    , &States[S_PLAY_FDTH+10]),
	S_BRIGHT (FDTH, 'Q',	5, NULL 	    , &States[S_PLAY_FDTH+11]),
	S_BRIGHT (FDTH, 'R',	4, NULL 	    , &States[S_PLAY_FDTH+12]),
	S_BRIGHT (FDTH, 'S',	5, A_NoBlocking	    , &States[S_PLAY_FDTH+13]),
	S_BRIGHT (FDTH, 'T',	4, NULL 	    , &States[S_PLAY_FDTH+14]),
	S_BRIGHT (FDTH, 'U',	5, NULL 	    , &States[S_PLAY_FDTH+15]),
	S_BRIGHT (FDTH, 'V',	4, NULL 	    , &States[S_PLAY_FDTH+16]),
	S_NORMAL1(ACLO, 'E',   35, A_CheckBurnGone  , &States[S_PLAY_FDTH+16]),
	S_NORMAL1(ACLO, 'E',	8, NULL 	    , NULL),
};

------------------------------------------------------------------------

//========== Serpent Staff: the Cleric's second weapon

IMPLEMENT_ACTOR (ACWeapStaff, Hexen, 10, 32)
	PROP_Flags (MF_SPECIAL)
	PROP_SpawnState (S_CSTAFF)
END_DEFAULTS

FState ACWeapStaff::States[] =
{
#define S_CSTAFF 0
	S_NORMAL1(WCSS, 'A',   -1, NULL		    , NULL),

#define S_CSTAFFREADY (S_CSTAFF+1)
	S_NORMAL1(CSSF, 'C',	4, NULL		     , &States[S_CSTAFFREADY+1]),
	S_NORMAL1(CSSF, 'B',	3, A_CStaffInitBlink , &States[S_CSTAFFREADY+2]),
	S_NORMAL1(CSSF, 'A',	1, A_WeaponReady     , &States[S_CSTAFFREADY+3]),
	S_NORMAL1(CSSF, 'A',	1, A_WeaponReady     , &States[S_CSTAFFREADY+4]),
	S_NORMAL1(CSSF, 'A',	1, A_WeaponReady     , &States[S_CSTAFFREADY+5]),
	S_NORMAL1(CSSF, 'A',	1, A_WeaponReady     , &States[S_CSTAFFREADY+6]),
	S_NORMAL1(CSSF, 'A',	1, A_WeaponReady     , &States[S_CSTAFFREADY+7]),
	S_NORMAL1(CSSF, 'A',	1, A_WeaponReady     , &States[S_CSTAFFREADY+8]),
	S_NORMAL1(CSSF, 'A',	1, A_WeaponReady     , &States[S_CSTAFFREADY+9]),
	S_NORMAL1(CSSF, 'A',	1, A_CStaffCheckBlink, &States[S_CSTAFFREADY+2]),

#define S_CSTAFFBLINK (S_CSTAFFREADY+10)
	S_NORMAL1(CSSF, 'B',	1, A_WeaponReady     , &States[S_CSTAFFBLINK+1]),
	S_NORMAL1(CSSF, 'B',	1, A_WeaponReady     , &States[S_CSTAFFBLINK+2]),
	S_NORMAL1(CSSF, 'B',	1, A_WeaponReady     , &States[S_CSTAFFBLINK+3]),
	S_NORMAL1(CSSF, 'C',	1, A_WeaponReady     , &States[S_CSTAFFBLINK+4]),
	S_NORMAL1(CSSF, 'C',	1, A_WeaponReady     , &States[S_CSTAFFBLINK+5]),
	S_NORMAL1(CSSF, 'C',	1, A_WeaponReady     , &States[S_CSTAFFBLINK+6]),
	S_NORMAL1(CSSF, 'C',	1, A_WeaponReady     , &States[S_CSTAFFBLINK+7]),
	S_NORMAL1(CSSF, 'C',	1, A_WeaponReady     , &States[S_CSTAFFBLINK+8]),
	S_NORMAL1(CSSF, 'B',	1, A_WeaponReady     , &States[S_CSTAFFBLINK+9]),
	S_NORMAL1(CSSF, 'B',	1, A_WeaponReady     , &States[S_CSTAFFBLINK+10]),
	S_NORMAL1(CSSF, 'B',	1, A_WeaponReady     , &States[S_CSTAFFREADY+2]),

#define S_CSTAFFDOWN (S_CSTAFFBLINK+11)
	S_NORMAL1(CSSF, 'B',	3, NULL		     , &States[S_CSTAFFDOWN+1]),
	S_NORMAL1(CSSF, 'C',	4, NULL		     , &States[S_CSTAFFDOWN+2]),
	S_NORMAL1(CSSF, 'C',	1, A_Lower	     , &States[S_CSTAFFDOWN+2]),

#define S_CSTAFFUP (S_CSTAFFDOWN+3)
	S_NORMAL1(CSSF, 'C',	1, A_Raise	     , &States[S_CSTAFFUP]),

#define S_CSTAFFATK (S_CSTAFFUP+1)
	S_NORMAL2 (CSSF, 'A',	1, A_CStaffCheck     , &States[S_CSTAFFATK+1], 0, 45),
	S_NORMAL2 (CSSF, 'J',	1, A_CStaffAttack    , &States[S_CSTAFFATK+2], 0, 50),
	S_NORMAL2 (CSSF, 'J',	2, NULL		     , &States[S_CSTAFFATK+3], 0, 50),
	S_NORMAL2 (CSSF, 'J',	2, NULL		     , &States[S_CSTAFFATK+4], 0, 45),
	S_NORMAL2 (CSSF, 'A',	2, NULL		     , &States[S_CSTAFFATK+5], 0, 40),
	S_NORMAL2 (CSSF, 'A',	2, NULL		     , &States[S_CSTAFFREADY+2], 0, 36),

#define S_CSTAFFATK2 (S_CSTAFFATK+6)
	S_NORMAL2 (CSSF, 'K',   10, NULL	     , &States[S_CSTAFFREADY+2], 0, 36),
};

FWeaponInfo ACWeapStaff::WeaponInfo =
{
	0,				// DWORD           flags;
	MANA_1,				// ammotype_t      ammo;
	1,				// int             ammouse;
	25,				// int             ammogive;
	&States[S_CSTAFFUP],		// FState          *upstate;
	&States[S_CSTAFFDOWN],		// FState          *downstate;
	&States[S_CSTAFFREADY],		// FState          *readystate;
	&States[S_CSTAFFATK],		// FState          *atkstate;
	&States[S_CSTAFFATK],		// FState          *holdatkstate;
	NULL,				// FState          *flashstate;
	NULL,				// const TypeInfo  *droptype;
	150,				// int             kickback;
	6*FRACUNIT,			// fixed_t         yadjust;
	NULL,				// const char      *upsound;
	NULL,				// const char      *readysound;
	ZDRUNTIME_CLASS(ACWeapStaff),	// TypeInfo        *type;      // type of actor that represents this weapon
	-1				// int             minammo;    // minimum ammo needed to switch to this weapon
};

------------------------------------------------------------------------

//========== The projectile fired by the Serpent Staff.

IMPLEMENT_ACTOR (ACStaffMissile, Hexen, -1, 0)
	PROP_SpeedFixed (22)
	PROP_RadiusFixed (12)
	PROP_HeightFixed (10)
	PROP_Damage (5)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
	PROP_Flags2 (MF2_NOTELEPORT|MF2_IMPACT|MF2_PCROSS)
	PROP_RenderStyle (STYLE_Add)
	PROP_SpawnState (S_CSTAFF_MISSILE1)
	PROP_DeathState (S_CSTAFF_MISSILE_X1)
	PROP_DeathSound ("ClericCStaffExplode")
END_DEFAULTS

FState ACStaffMissile::States[] =
{
#define S_CSTAFF_MISSILE1 0
	S_BRIGHT (CSSF, 'D',	1, A_CStaffMissileSlither   , &States[S_CSTAFF_MISSILE1+1]),
	S_BRIGHT (CSSF, 'D',	1, A_CStaffMissileSlither   , &States[S_CSTAFF_MISSILE1+2]),
	S_BRIGHT (CSSF, 'E',	1, A_CStaffMissileSlither   , &States[S_CSTAFF_MISSILE1+3]),
	S_BRIGHT (CSSF, 'E',	1, A_CStaffMissileSlither   , &States[S_CSTAFF_MISSILE1]),

#define S_CSTAFF_MISSILE_X1 (S_CSTAFF_MISSILE1+4)
	S_BRIGHT (CSSF, 'F',	4, NULL			    , &States[S_CSTAFF_MISSILE_X1+1]),
	S_BRIGHT (CSSF, 'G',	4, NULL			    , &States[S_CSTAFF_MISSILE_X1+2]),
	S_BRIGHT (CSSF, 'H',	3, NULL			    , &States[S_CSTAFF_MISSILE_X1+3]),
	S_BRIGHT (CSSF, 'I',	3, NULL			    , NULL),
};

------------------------------------------------------------------------

//========== The puff of smoke spawned when the serpent staff is used on a target at close range.

IMPLEMENT_ACTOR (ACStaffPuff, Hexen, -1, 0)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
	PROP_Flags3 (MF3_PUFFONACTORS)
	PROP_Flags4 (MF4_NONETSPAWN)
	PROP_RenderStyle (STYLE_Translucent)
	PROP_Alpha (HX_SHADOW)
	PROP_SpawnState (0)
	PROP_SeeSound ("ClericCStaffHitThing")
END_DEFAULTS

FState ACStaffPuff::States[] =
{
	S_NORMAL1(FHFX, 'S',	4, NULL, &States[1]),
	S_NORMAL1(FHFX, 'T',	4, NULL, &States[2]),
	S_NORMAL1(FHFX, 'U',	4, NULL, &States[3]),
	S_NORMAL1(FHFX, 'V',	4, NULL, &States[4]),
	S_NORMAL1(FHFX, 'W',	4, NULL, NULL),
};

------------------------------------------------------------------------

//========== Demon, type 1 (green chaos serpent, like D'Sparil's)

IMPLEMENT_ACTOR (ADemon1, Hexen, 31, 3)
	PROP_SpawnHealth (250)
	PROP_PainChance (50)
	PROP_SpeedFixed (13)
	PROP_RadiusFixed (32)
	PROP_HeightFixed (64)
	PROP_Mass (220)
	PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL)
	PROP_Flags2 (MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_TELESTOMP|MF2_MCROSS)
	PROP_SpawnState (S_DEMN_LOOK1)
	PROP_SeeState (S_DEMN_CHASE1)
	PROP_PainState (S_DEMN_PAIN1)
	PROP_MeleeState (S_DEMN_ATK1_1)
	PROP_MissileState (S_DEMN_ATK2_1)
	PROP_DeathState (S_DEMN_DEATH1)
	PROP_XDeathState (S_DEMN_XDEATH1)
	PROP_IDeathState (S_DEMON_ICE1)
	PROP_SeeSound ("DemonSight")
	PROP_AttackSound ("DemonAttack")
	PROP_PainSound ("DemonPain")
	PROP_DeathSound ("DemonDeath")
	PROP_ActiveSound ("DemonActive")
END_DEFAULTS

FState ADemon1::States[] =
{
#define S_DEMN_LOOK1 0
	S_NORMAL1 (DEMN, 'A',   10, A_Look                   , &States[S_DEMN_LOOK1+1]),
	S_NORMAL1 (DEMN, 'A',   10, A_Look                   , &States[S_DEMN_LOOK1]),

#define S_DEMN_CHASE1 (S_DEMN_LOOK1+2)
	S_NORMAL1 (DEMN, 'A',    4, A_Chase                  , &States[S_DEMN_CHASE1+1]),
	S_NORMAL1 (DEMN, 'B',    4, A_Chase                  , &States[S_DEMN_CHASE1+2]),
	S_NORMAL1 (DEMN, 'C',    4, A_Chase                  , &States[S_DEMN_CHASE1+3]),
	S_NORMAL1 (DEMN, 'D',    4, A_Chase                  , &States[S_DEMN_CHASE1]),

#define S_DEMN_PAIN1 (S_DEMN_CHASE1+4)
	S_NORMAL1 (DEMN, 'E',    4, NULL                     , &States[S_DEMN_PAIN1+1]),
	S_NORMAL1 (DEMN, 'E',    4, A_Pain                   , &States[S_DEMN_CHASE1]),

#define S_DEMN_ATK1_1 (S_DEMN_PAIN1+2)
	S_NORMAL1 (DEMN, 'E',    6, A_FaceTarget             , &States[S_DEMN_ATK1_1+1]),
	S_NORMAL1 (DEMN, 'F',    8, A_FaceTarget             , &States[S_DEMN_ATK1_1+2]),
	S_NORMAL1 (DEMN, 'G',    6, A_DemonAttack1           , &States[S_DEMN_CHASE1]),

#define S_DEMN_ATK2_1 (S_DEMN_ATK1_1+3)
	S_NORMAL1 (DEMN, 'E',    5, A_FaceTarget             , &States[S_DEMN_ATK2_1+1]),
	S_NORMAL1 (DEMN, 'F',    6, A_FaceTarget             , &States[S_DEMN_ATK2_1+2]),
	S_NORMAL1 (DEMN, 'G',    5, A_DemonAttack2_1         , &States[S_DEMN_CHASE1]),

#define S_DEMN_DEATH1 (S_DEMN_ATK2_1+3)
	S_NORMAL1 (DEMN, 'H',    6, NULL                     , &States[S_DEMN_DEATH1+1]),
	S_NORMAL1 (DEMN, 'I',    6, NULL                     , &States[S_DEMN_DEATH1+2]),
	S_NORMAL1 (DEMN, 'J',    6, A_Scream                 , &States[S_DEMN_DEATH1+3]),
	S_NORMAL1 (DEMN, 'K',    6, A_NoBlocking             , &States[S_DEMN_DEATH1+4]),
	S_NORMAL1 (DEMN, 'L',    6, A_QueueCorpse            , &States[S_DEMN_DEATH1+5]),
	S_NORMAL1 (DEMN, 'M',    6, NULL                     , &States[S_DEMN_DEATH1+6]),
	S_NORMAL1 (DEMN, 'N',    6, NULL                     , &States[S_DEMN_DEATH1+7]),
	S_NORMAL1 (DEMN, 'O',    6, NULL                     , &States[S_DEMN_DEATH1+8]),
	S_NORMAL1 (DEMN, 'P',   -1, NULL                     , NULL),

#define S_DEMN_XDEATH1 (S_DEMN_DEATH1+9)
	S_NORMAL1 (DEMN, 'H',    6, NULL                     , &States[S_DEMN_XDEATH1+1]),
	S_NORMAL1 (DEMN, 'I',    6, A_DemonDeath             , &States[S_DEMN_XDEATH1+2]),
	S_NORMAL1 (DEMN, 'J',    6, A_Scream                 , &States[S_DEMN_XDEATH1+3]),
	S_NORMAL1 (DEMN, 'K',    6, A_NoBlocking             , &States[S_DEMN_XDEATH1+4]),
	S_NORMAL1 (DEMN, 'L',    6, A_QueueCorpse            , &States[S_DEMN_XDEATH1+5]),
	S_NORMAL1 (DEMN, 'M',    6, NULL                     , &States[S_DEMN_XDEATH1+6]),
	S_NORMAL1 (DEMN, 'N',    6, NULL                     , &States[S_DEMN_XDEATH1+7]),
	S_NORMAL1 (DEMN, 'O',    6, NULL                     , &States[S_DEMN_XDEATH1+8]),
	S_NORMAL1 (DEMN, 'P',   -1, NULL                     , NULL),

#define S_DEMON_ICE1 (S_DEMN_XDEATH1+9)
	S_NORMAL1 (DEMN, 'Q',    5, A_FreezeDeath            , &States[S_DEMON_ICE1+1]),
	S_NORMAL1 (DEMN, 'Q',    1, A_FreezeDeathChunks      , &States[S_DEMON_ICE1+1]),
};

------------------------------------------------------------------------

//========== Demon, type 1, mashed

IMPLEMENT_STATELESS_ACTOR (ADemon1Mash, Hexen, -1, 100)
	PROP_FlagsSet (MF_NOBLOOD)
	PROP_Flags2Set (MF2_BLASTED)
	PROP_Flags2Clear (MF2_TELESTOMP)
	PROP_RenderStyle (STYLE_Translucent)
	PROP_Alpha (HX_ALTSHADOW)
	PROP_DeathState (~0)
	PROP_XDeathState (~0)
	PROP_IDeathState (~0)
END_DEFAULTS

------------------------------------------------------------------------

//========== Demon chunk, base class

IMPLEMENT_STATELESS_ACTOR (ADemonChunk, Hexen, -1, 0)
	PROP_RadiusFixed (5)
	PROP_HeightFixed (5)
	PROP_Flags (MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE|MF_CORPSE)
	PROP_Flags2 (MF2_FLOORCLIP|MF2_NOTELEPORT)
END_DEFAULTS

------------------------------------------------------------------------

//========== Demon, type 1, chunk 1

IMPLEMENT_ACTOR (ADemon1Chunk1, Hexen, -1, 0)
	PROP_SpawnState (S_DEMONCHUNK1_1)
	PROP_DeathState (S_DEMONCHUNK1_4)
END_DEFAULTS

FState ADemon1Chunk1::States[] =
{
#define S_DEMONCHUNK1_1 0
	S_NORMAL1 (DEMA, 'A',    4, NULL           , &States[S_DEMONCHUNK1_1+1]),
	S_NORMAL1 (DEMA, 'A',   10, A_QueueCorpse  , &States[S_DEMONCHUNK1_1+2]),
	S_NORMAL1 (DEMA, 'A',   20, NULL           , &States[S_DEMONCHUNK1_1+2]),

#define S_DEMONCHUNK1_4 (S_DEMONCHUNK1_1+3)
	S_NORMAL1 (DEMA, 'A',   -1, NULL           , NULL),
};

------------------------------------------------------------------------

//========== Demon, type 1, chunk 2

IMPLEMENT_ACTOR (ADemon1Chunk2, Hexen, -1, 0)
	PROP_SpawnState (S_DEMONCHUNK2_1)
	PROP_DeathState (S_DEMONCHUNK2_4)
END_DEFAULTS

FState ADemon1Chunk2::States[] =
{
#define S_DEMONCHUNK2_1 0
	S_NORMAL1 (DEMB, 'A',    4, NULL         , &States[S_DEMONCHUNK2_1+1]),
	S_NORMAL1 (DEMB, 'A',   10, A_QueueCorpse, &States[S_DEMONCHUNK2_1+2]),
	S_NORMAL1 (DEMB, 'A',   20, NULL         , &States[S_DEMONCHUNK2_1+2]),

#define S_DEMONCHUNK2_4 (S_DEMONCHUNK2_1+3)
	S_NORMAL1 (DEMB, 'A',   -1, NULL         , NULL),
};

------------------------------------------------------------------------

//========== Demon, type 1, chunk 3

IMPLEMENT_ACTOR (ADemon1Chunk3, Hexen, -1, 0)
	PROP_SpawnState (S_DEMONCHUNK3_1)
	PROP_DeathState (S_DEMONCHUNK3_4)
END_DEFAULTS

FState ADemon1Chunk3::States[] =
{
#define S_DEMONCHUNK3_1 0
	S_NORMAL1 (DEMC, 'A',    4, NULL         , &States[S_DEMONCHUNK3_1+1]),
	S_NORMAL1 (DEMC, 'A',   10, A_QueueCorpse, &States[S_DEMONCHUNK3_1+2]),
	S_NORMAL1 (DEMC, 'A',   20, NULL         , &States[S_DEMONCHUNK3_1+2]),

#define S_DEMONCHUNK3_4 (S_DEMONCHUNK3_1+3)
	S_NORMAL1 (DEMC, 'A',   -1, NULL         , NULL),
};

------------------------------------------------------------------------

//========== Demon, type 1, chunk 4

IMPLEMENT_ACTOR (ADemon1Chunk4, Hexen, -1, 0)
	PROP_SpawnState (S_DEMONCHUNK4_1)
	PROP_DeathState (S_DEMONCHUNK4_4)
END_DEFAULTS

FState ADemon1Chunk4::States[] =
{
#define S_DEMONCHUNK4_1 0
	S_NORMAL1 (DEMD, 'A',    4, NULL         , &States[S_DEMONCHUNK4_1+1]),
	S_NORMAL1 (DEMD, 'A',   10, A_QueueCorpse, &States[S_DEMONCHUNK4_1+2]),
	S_NORMAL1 (DEMD, 'A',   20, NULL         , &States[S_DEMONCHUNK4_1+2]),

#define S_DEMONCHUNK4_4 (S_DEMONCHUNK4_1+3)
	S_NORMAL1 (DEMD, 'A',   -1, NULL         , NULL),
};

------------------------------------------------------------------------

//========== Demon, type 1, chunk 5

IMPLEMENT_ACTOR (ADemon1Chunk5, Hexen, -1, 0)
	PROP_SpawnState (S_DEMONCHUNK5_1)
	PROP_DeathState (S_DEMONCHUNK5_4)
END_DEFAULTS

FState ADemon1Chunk5::States[] =
{
#define S_DEMONCHUNK5_1 0
	S_NORMAL1 (DEME, 'A',    4, NULL         , &States[S_DEMONCHUNK5_1+1]),
	S_NORMAL1 (DEME, 'A',   10, A_QueueCorpse, &States[S_DEMONCHUNK5_1+2]),
	S_NORMAL1 (DEME, 'A',   20, NULL         , &States[S_DEMONCHUNK5_1+2]),

#define S_DEMONCHUNK5_4 (S_DEMONCHUNK5_1+3)
	S_NORMAL1 (DEME, 'A',   -1, NULL         , NULL),
};

------------------------------------------------------------------------

//========== Green chaos serpent projectile

IMPLEMENT_ACTOR (ADemon1FX1, Hexen, -1, 0)
	PROP_SpeedFixed (15)
	PROP_RadiusFixed (10)
	PROP_HeightFixed (6)
	PROP_Damage (5)
	PROP_DamageType (MOD_FIRE)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
	PROP_Flags2 (MF2_NOTELEPORT|MF2_IMPACT|MF2_PCROSS)
	PROP_Flags4 (MF4_BLOODSPLATTER)
	PROP_RenderStyle (STYLE_Add)
	PROP_SpawnState (S_DEMONFX_MOVE1)
	PROP_DeathState (S_DEMONFX_BOOM1)
	PROP_DeathSound ("DemonMissileExplode")
END_DEFAULTS

FState ADemon1FX1::States[] =
{
#define S_DEMONFX_MOVE1 0
	S_BRIGHT (DMFX, 'A',    4, NULL, &States[S_DEMONFX_MOVE1+1]),
	S_BRIGHT (DMFX, 'B',    4, NULL, &States[S_DEMONFX_MOVE1+2]),
	S_BRIGHT (DMFX, 'C',    4, NULL, &States[S_DEMONFX_MOVE1]),

#define S_DEMONFX_BOOM1 (S_DEMONFX_MOVE1+3)
	S_BRIGHT (DMFX, 'D',    4, NULL, &States[S_DEMONFX_BOOM1+1]),
	S_BRIGHT (DMFX, 'E',    4, NULL, &States[S_DEMONFX_BOOM1+2]),
	S_BRIGHT (DMFX, 'F',    3, NULL, &States[S_DEMONFX_BOOM1+3]),
	S_BRIGHT (DMFX, 'G',    3, NULL, &States[S_DEMONFX_BOOM1+4]),
	S_BRIGHT (DMFX, 'H',    3, NULL, NULL),
};

------------------------------------------------------------------------

//========== Demon, type 2 (brown chaos serpent)

IMPLEMENT_ACTOR (ADemon2, Hexen, 8080, 0)
	PROP_SpawnState (S_DEMN2_LOOK1)
	PROP_SeeState (S_DEMN2_CHASE1)
	PROP_PainState (S_DEMN2_PAIN1)
	PROP_MeleeState (S_DEMN2_ATK1_1)
	PROP_MissileState (S_DEMN2_ATK2_1)
	PROP_DeathState (S_DEMN2_DEATH1)
	PROP_XDeathState (S_DEMN2_XDEATH1)
END_DEFAULTS

FState ADemon2::States[] =
{
#define S_DEMN2_LOOK1 0
	S_NORMAL1 (DEM2, 'A',   10, A_Look                   , &States[S_DEMN2_LOOK1+1]),
	S_NORMAL1 (DEM2, 'A',   10, A_Look                   , &States[S_DEMN2_LOOK1]),

#define S_DEMN2_CHASE1 (S_DEMN2_LOOK1+2)
	S_NORMAL1 (DEM2, 'A',    4, A_Chase                  , &States[S_DEMN2_CHASE1+1]),
	S_NORMAL1 (DEM2, 'B',    4, A_Chase                  , &States[S_DEMN2_CHASE1+2]),
	S_NORMAL1 (DEM2, 'C',    4, A_Chase                  , &States[S_DEMN2_CHASE1+3]),
	S_NORMAL1 (DEM2, 'D',    4, A_Chase                  , &States[S_DEMN2_CHASE1]),

#define S_DEMN2_PAIN1 (S_DEMN2_CHASE1+4)
	S_NORMAL1 (DEM2, 'E',    4, NULL                     , &States[S_DEMN2_PAIN1+1]),
	S_NORMAL1 (DEM2, 'E',    4, A_Pain                   , &States[S_DEMN2_CHASE1]),

#define S_DEMN2_ATK1_1 (S_DEMN2_PAIN1+2)
	S_NORMAL1 (DEM2, 'E',    6, A_FaceTarget             , &States[S_DEMN2_ATK1_1+1]),
	S_NORMAL1 (DEM2, 'F',    8, A_FaceTarget             , &States[S_DEMN2_ATK1_1+2]),
	S_NORMAL1 (DEM2, 'G',    6, A_DemonAttack1           , &States[S_DEMN2_CHASE1]),

#define S_DEMN2_ATK2_1 (S_DEMN2_ATK1_1+3)
	S_NORMAL1 (DEM2, 'E',    5, A_FaceTarget             , &States[S_DEMN2_ATK2_1+1]),
	S_NORMAL1 (DEM2, 'F',    6, A_FaceTarget             , &States[S_DEMN2_ATK2_1+2]),
	S_NORMAL1 (DEM2, 'G',    5, A_DemonAttack2_2         , &States[S_DEMN2_CHASE1]),

#define S_DEMN2_DEATH1 (S_DEMN2_ATK2_1+3)
	S_NORMAL1 (DEM2, 'H',    6, NULL                     , &States[S_DEMN2_DEATH1+1]),
	S_NORMAL1 (DEM2, 'I',    6, NULL                     , &States[S_DEMN2_DEATH1+2]),
	S_NORMAL1 (DEM2, 'J',    6, A_Scream                 , &States[S_DEMN2_DEATH1+3]),
	S_NORMAL1 (DEM2, 'K',    6, A_NoBlocking             , &States[S_DEMN2_DEATH1+4]),
	S_NORMAL1 (DEM2, 'L',    6, A_QueueCorpse            , &States[S_DEMN2_DEATH1+5]),
	S_NORMAL1 (DEM2, 'M',    6, NULL                     , &States[S_DEMN2_DEATH1+6]),
	S_NORMAL1 (DEM2, 'N',    6, NULL                     , &States[S_DEMN2_DEATH1+7]),
	S_NORMAL1 (DEM2, 'O',    6, NULL                     , &States[S_DEMN2_DEATH1+8]),
	S_NORMAL1 (DEM2, 'P',   -1, NULL                     , NULL),

#define S_DEMN2_XDEATH1 (S_DEMN2_DEATH1+9)
	S_NORMAL1 (DEM2, 'H',    6, NULL                     , &States[S_DEMN2_XDEATH1+1]),
	S_NORMAL1 (DEM2, 'I',    6, A_Demon2Death            , &States[S_DEMN2_XDEATH1+2]),
	S_NORMAL1 (DEM2, 'J',    6, A_Scream                 , &States[S_DEMN2_XDEATH1+3]),
	S_NORMAL1 (DEM2, 'K',    6, A_NoBlocking             , &States[S_DEMN2_XDEATH1+4]),
	S_NORMAL1 (DEM2, 'L',    6, A_QueueCorpse            , &States[S_DEMN2_XDEATH1+5]),
	S_NORMAL1 (DEM2, 'M',    6, NULL                     , &States[S_DEMN2_XDEATH1+6]),
	S_NORMAL1 (DEM2, 'N',    6, NULL                     , &States[S_DEMN2_XDEATH1+7]),
	S_NORMAL1 (DEM2, 'O',    6, NULL                     , &States[S_DEMN2_XDEATH1+8]),
	S_NORMAL1 (DEM2, 'P',   -1, NULL                     , NULL),
};

------------------------------------------------------------------------

//========== Demon, type 2, mashed

IMPLEMENT_STATELESS_ACTOR (ADemon2Mash, Hexen, -1, 101)
	PROP_FlagsSet (MF_NOBLOOD)
	PROP_Flags2Set (MF2_BLASTED)
	PROP_Flags2Clear (MF2_TELESTOMP)
	PROP_RenderStyle (STYLE_Translucent)
	PROP_Alpha (HX_ALTSHADOW)
	PROP_DeathState (~0)
	PROP_XDeathState (~0)
	PROP_IDeathState (~0)
END_DEFAULTS

------------------------------------------------------------------------

//========== Demon, type 2, chunk 1

IMPLEMENT_ACTOR (ADemon2Chunk1, Hexen, -1, 0)
	PROP_SpawnState (S_DEMON2CHUNK1_1)
	PROP_DeathState (S_DEMON2CHUNK1_4)
END_DEFAULTS

FState ADemon2Chunk1::States[] =
{
#define S_DEMON2CHUNK1_1 0
	S_NORMAL1 (DMBA, 'A',    4, NULL         , &States[S_DEMON2CHUNK1_1+1]),
	S_NORMAL1 (DMBA, 'A',   10, A_QueueCorpse, &States[S_DEMON2CHUNK1_1+2]),
	S_NORMAL1 (DMBA, 'A',   20, NULL         , &States[S_DEMON2CHUNK1_1+2]),

#define S_DEMON2CHUNK1_4 (S_DEMON2CHUNK1_1+3)
	S_NORMAL1 (DMBA, 'A',   -1, NULL         , NULL),
};

------------------------------------------------------------------------

//========== Demon, type 2, chunk 2

IMPLEMENT_ACTOR (ADemon2Chunk2, Hexen, -1, 0)
	PROP_SpawnState (S_DEMON2CHUNK2_1)
	PROP_DeathState (S_DEMON2CHUNK2_4)
END_DEFAULTS

FState ADemon2Chunk2::States[] =
{
#define S_DEMON2CHUNK2_1 0
	S_NORMAL1 (DMBB, 'A',    4, NULL         , &States[S_DEMON2CHUNK2_1+1]),
	S_NORMAL1 (DMBB, 'A',   10, A_QueueCorpse, &States[S_DEMON2CHUNK2_1+2]),
	S_NORMAL1 (DMBB, 'A',   20, NULL         , &States[S_DEMON2CHUNK2_1+2]),

#define S_DEMON2CHUNK2_4 (S_DEMON2CHUNK2_1+3)
	S_NORMAL1 (DMBB, 'A',   -1, NULL         , NULL),
};

------------------------------------------------------------------------

//========== Demon, type 2, chunk 3

IMPLEMENT_ACTOR (ADemon2Chunk3, Hexen, -1, 0)
	PROP_SpawnState (S_DEMON2CHUNK3_1)
	PROP_DeathState (S_DEMON2CHUNK3_4)
END_DEFAULTS

FState ADemon2Chunk3::States[] =
{
#define S_DEMON2CHUNK3_1 0
	S_NORMAL1 (DMBC, 'A',    4, NULL         , &States[S_DEMON2CHUNK3_1+1]),
	S_NORMAL1 (DMBC, 'A',   10, A_QueueCorpse, &States[S_DEMON2CHUNK3_1+2]),
	S_NORMAL1 (DMBC, 'A',   20, NULL         , &States[S_DEMON2CHUNK3_1+2]),

#define S_DEMON2CHUNK3_4 (S_DEMON2CHUNK3_1+3)
	S_NORMAL1 (DMBC, 'A',   -1, NULL         , NULL),
};

------------------------------------------------------------------------

//========== Demon, type 2, chunk 4

IMPLEMENT_ACTOR (ADemon2Chunk4, Hexen, -1, 0)
	PROP_SpawnState (S_DEMON2CHUNK4_1)
	PROP_DeathState (S_DEMON2CHUNK4_4)
END_DEFAULTS

FState ADemon2Chunk4::States[] =
{
#define S_DEMON2CHUNK4_1 0
	S_NORMAL1 (DMBD, 'A',    4, NULL         , &States[S_DEMON2CHUNK4_1+1]),
	S_NORMAL1 (DMBD, 'A',   10, A_QueueCorpse, &States[S_DEMON2CHUNK4_1+2]),
	S_NORMAL1 (DMBD, 'A',   20, NULL         , &States[S_DEMON2CHUNK4_1+2]),

#define S_DEMON2CHUNK4_4 (S_DEMON2CHUNK4_1+3)
	S_NORMAL1 (DMBD, 'A',   -1, NULL         , NULL),
};

------------------------------------------------------------------------

//========== Demon, type 2, chunk 5

IMPLEMENT_ACTOR (ADemon2Chunk5, Hexen, -1, 0)
	PROP_SpawnState (S_DEMON2CHUNK5_1)
	PROP_DeathState (S_DEMON2CHUNK5_4)
END_DEFAULTS

FState ADemon2Chunk5::States[] =
{
#define S_DEMON2CHUNK5_1 0
	S_NORMAL1 (DMBE, 'A',    4, NULL, &States[S_DEMON2CHUNK5_1+1]),
	S_NORMAL1 (DMBE, 'A',   10, NULL, &States[S_DEMON2CHUNK5_1+2]),
	S_NORMAL1 (DMBE, 'A',   20, NULL, &States[S_DEMON2CHUNK5_1+2]),

#define S_DEMON2CHUNK5_4 (S_DEMON2CHUNK5_1+3)
	S_NORMAL1 (DMBE, 'A',   -1, NULL                     , NULL),
};

------------------------------------------------------------------------

//========== Brown chaos serpent projectile

IMPLEMENT_ACTOR (ADemon2FX1, Hexen, -1, 0)
	PROP_SpeedFixed (15)
	PROP_RadiusFixed (10)
	PROP_HeightFixed (6)
	PROP_Damage (5)
	PROP_DamageType (MOD_FIRE)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
	PROP_Flags2 (MF2_NOTELEPORT|MF2_IMPACT|MF2_PCROSS)
	PROP_Flags4 (MF4_BLOODSPLATTER)
	PROP_SpawnState (S_DEMON2FX_MOVE1)
	PROP_DeathState (S_DEMON2FX_BOOM1)
	PROP_DeathSound ("DemonMissileExplode")
END_DEFAULTS

FState ADemon2FX1::States[] =
{
#define S_DEMON2FX_MOVE1 0
	S_BRIGHT (D2FX, 'A',    4, NULL, &States[S_DEMON2FX_MOVE1+1]),
	S_BRIGHT (D2FX, 'B',    4, NULL, &States[S_DEMON2FX_MOVE1+2]),
	S_BRIGHT (D2FX, 'C',    4, NULL, &States[S_DEMON2FX_MOVE1+3]),
	S_BRIGHT (D2FX, 'D',    4, NULL, &States[S_DEMON2FX_MOVE1+4]),
	S_BRIGHT (D2FX, 'E',    4, NULL, &States[S_DEMON2FX_MOVE1+5]),
	S_BRIGHT (D2FX, 'F',    4, NULL, &States[S_DEMON2FX_MOVE1]),

#define S_DEMON2FX_BOOM1 (S_DEMON2FX_MOVE1+6)
	S_BRIGHT (D2FX, 'G',    4, NULL, &States[S_DEMON2FX_BOOM1+1]),
	S_BRIGHT (D2FX, 'H',    4, NULL, &States[S_DEMON2FX_BOOM1+2]),
	S_BRIGHT (D2FX, 'I',    4, NULL, &States[S_DEMON2FX_BOOM1+3]),
	S_BRIGHT (D2FX, 'J',    4, NULL, &States[S_DEMON2FX_BOOM1+4]),
	S_BRIGHT (D2FX, 'K',    3, NULL, &States[S_DEMON2FX_BOOM1+5]),
	S_BRIGHT (D2FX, 'L',    3, NULL, NULL),
};

------------------------------------------------------------------------

//========== The death wyvern is an undead dragon

IMPLEMENT_ACTOR (ADragon, Hexen, 254, 0)
	PROP_SpawnHealth (640)
	PROP_PainChance (128)
	PROP_SpeedFixed (10)
	PROP_HeightFixed (65)
	PROP_MassLong (0x7fffffff)
	PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_NOGRAVITY|MF_FLOAT|MF_NOBLOOD|MF_COUNTKILL)
	PROP_Flags2 (MF2_PASSMOBJ|MF2_BOSS)
	PROP_Flags3 (MF3_DONTMORPH)
	PROP_Flags4 (MF4_NOICEDEATH)
	PROP_SpawnState (S_DRAGON_LOOK1)
	PROP_SeeState (S_DRAGON_INIT)
	PROP_PainState (S_DRAGON_PAIN1)
	PROP_MissileState (S_DRAGON_ATK1)
	PROP_DeathState (S_DRAGON_DEATH1)
	PROP_SeeSound ("DragonSight")
	PROP_AttackSound ("DragonAttack")
	PROP_PainSound ("DragonPain")
	PROP_DeathSound ("DragonDeath")
	PROP_ActiveSound ("DragonActive")
END_DEFAULTS

FState ADragon::States[] =
{
#define S_DRAGON_LOOK1 0
	S_NORMAL1(DRAG, 'D',   10, A_Look		    , &States[S_DRAGON_LOOK1]),

#define S_DRAGON_INIT (S_DRAGON_LOOK1+1)
	S_NORMAL1(DRAG, 'C',	5, NULL			    , &States[S_DRAGON_INIT+1]),
	S_NORMAL1(DRAG, 'B',	5, NULL			    , &States[S_DRAGON_INIT+2]),
	S_NORMAL1(DRAG, 'A',	5, A_DragonInitFlight	    , &States[S_DRAGON_INIT+3]),
	S_NORMAL1(DRAG, 'B',	3, A_DragonFlap		    , &States[S_DRAGON_INIT+4]),
	S_NORMAL1(DRAG, 'B',	3, A_DragonFlight	    , &States[S_DRAGON_INIT+5]),
	S_NORMAL1(DRAG, 'C',	3, A_DragonFlight	    , &States[S_DRAGON_INIT+6]),
	S_NORMAL1(DRAG, 'C',	3, A_DragonFlight	    , &States[S_DRAGON_INIT+7]),
	S_NORMAL1(DRAG, 'D',	3, A_DragonFlight	    , &States[S_DRAGON_INIT+8]),
	S_NORMAL1(DRAG, 'D',	3, A_DragonFlight	    , &States[S_DRAGON_INIT+9]),
	S_NORMAL1(DRAG, 'C',	3, A_DragonFlight	    , &States[S_DRAGON_INIT+10]),
	S_NORMAL1(DRAG, 'C',	3, A_DragonFlight	    , &States[S_DRAGON_INIT+11]),
	S_NORMAL1(DRAG, 'B',	3, A_DragonFlight	    , &States[S_DRAGON_INIT+12]),
	S_NORMAL1(DRAG, 'B',	3, A_DragonFlight	    , &States[S_DRAGON_INIT+13]),
	S_NORMAL1(DRAG, 'A',	3, A_DragonFlight	    , &States[S_DRAGON_INIT+14]),
	S_NORMAL1(DRAG, 'A',	3, A_DragonFlight	    , &States[S_DRAGON_INIT+3]),

#define S_DRAGON_PAIN1 (S_DRAGON_INIT+15)
	S_NORMAL1(DRAG, 'F',   10, A_DragonPain		    , &States[S_DRAGON_INIT+3]),

#define S_DRAGON_ATK1 (S_DRAGON_PAIN1+1)
	S_NORMAL1(DRAG, 'E',	8, A_DragonAttack	    , &States[S_DRAGON_INIT+3]),

#define S_DRAGON_DEATH1 (S_DRAGON_ATK1+1)
	S_NORMAL1(DRAG, 'G',	5, A_Scream		    , &States[S_DRAGON_DEATH1+1]),
	S_NORMAL1(DRAG, 'H',	4, A_NoBlocking		    , &States[S_DRAGON_DEATH1+2]),
	S_NORMAL1(DRAG, 'I',	4, NULL			    , &States[S_DRAGON_DEATH1+3]),
	S_NORMAL1(DRAG, 'J',	4, A_DragonCheckCrash	    , &States[S_DRAGON_DEATH1+3]),

#define S_DRAGON_CRASH1 (S_DRAGON_DEATH1+4)
	S_NORMAL1(DRAG, 'K',	5, NULL			    , &States[S_DRAGON_CRASH1+1]),
	S_NORMAL1(DRAG, 'L',	5, NULL			    , &States[S_DRAGON_CRASH1+2]),
	S_NORMAL1(DRAG, 'M',   -1, NULL			    , NULL),

};

------------------------------------------------------------------------

//========== The fireball launched by the Death Wyvern

IMPLEMENT_ACTOR (ADragonFireball, Hexen, -1, 0)
	PROP_SpeedFixed (24)
	PROP_RadiusFixed (12)
	PROP_HeightFixed (10)
	PROP_Damage (6)
	PROP_DamageType (MOD_FIRE)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_RenderStyle (STYLE_Add)
	PROP_SpawnState (S_DRAGON_FX1_1)
	PROP_DeathState (S_DRAGON_FX1_X1)
	PROP_DeathSound ("DragonFireballExplode")
END_DEFAULTS

FState ADragonFireball::States[] =
{
#define S_DRAGON_FX1_1 0
	S_BRIGHT (DRFX, 'A',	4, NULL		, &States[S_DRAGON_FX1_1+1]),
	S_BRIGHT (DRFX, 'B',	4, NULL		, &States[S_DRAGON_FX1_1+2]),
	S_BRIGHT (DRFX, 'C',	4, NULL		, &States[S_DRAGON_FX1_1+3]),
	S_BRIGHT (DRFX, 'D',	4, NULL		, &States[S_DRAGON_FX1_1+4]),
	S_BRIGHT (DRFX, 'E',	4, NULL		, &States[S_DRAGON_FX1_1+5]),
	S_BRIGHT (DRFX, 'F',	4, NULL		, &States[S_DRAGON_FX1_1]),

#define S_DRAGON_FX1_X1 (S_DRAGON_FX1_1+6)
	S_BRIGHT (DRFX, 'G',	4, NULL		, &States[S_DRAGON_FX1_X1+1]),
	S_BRIGHT (DRFX, 'H',	4, NULL		, &States[S_DRAGON_FX1_X1+2]),
	S_BRIGHT (DRFX, 'I',	4, NULL		, &States[S_DRAGON_FX1_X1+3]),
	S_BRIGHT (DRFX, 'J',	4, A_DragonFX2	, &States[S_DRAGON_FX1_X1+4]),
	S_BRIGHT (DRFX, 'K',	3, NULL		, &States[S_DRAGON_FX1_X1+5]),
	S_BRIGHT (DRFX, 'L',	3, NULL		, NULL),
};

------------------------------------------------------------------------

//========== Dragon Fireball Secondary Explosion

IMPLEMENT_ACTOR (ADragonExplosion, Hexen, -1, 0)
	PROP_RadiusFixed (8)
	PROP_HeightFixed (8)
	PROP_DamageType (MOD_FIRE)
	PROP_Flags (MF_NOBLOCKMAP)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_RenderFlags (RF_INVISIBLE)
	PROP_RenderStyle (STYLE_Add)
	PROP_SpawnState (S_DRAGON_FX2_1)
	PROP_DeathSound ("DragonFireballExplode")
END_DEFAULTS

FState ADragonExplosion::States[] =
{
#define S_DRAGON_FX2_1 0
	S_BRIGHT (CFCF, 'Q',	1, NULL		    , &States[S_DRAGON_FX2_1+1]),
	S_BRIGHT (CFCF, 'Q',	4, A_UnHideThing    , &States[S_DRAGON_FX2_1+2]),
	S_BRIGHT (CFCF, 'R',	3, A_Scream	    , &States[S_DRAGON_FX2_1+3]),
	S_BRIGHT (CFCF, 'S',	4, NULL		    , &States[S_DRAGON_FX2_1+4]),
	S_BRIGHT (CFCF, 'T',	3, A_Explode	    , &States[S_DRAGON_FX2_1+5]),
	S_BRIGHT (CFCF, 'U',	4, NULL		    , &States[S_DRAGON_FX2_1+6]),
	S_BRIGHT (CFCF, 'V',	3, NULL		    , &States[S_DRAGON_FX2_1+7]),
	S_BRIGHT (CFCF, 'W',	4, NULL		    , &States[S_DRAGON_FX2_1+8]),
	S_BRIGHT (CFCF, 'X',	3, NULL		    , &States[S_DRAGON_FX2_1+9]),
	S_BRIGHT (CFCF, 'Y',	4, NULL		    , &States[S_DRAGON_FX2_1+10]),
	S_BRIGHT (CFCF, 'Z',	3, NULL		    , NULL),
};

------------------------------------------------------------------------

//========== Ettins are big, brawny, brown bicephalous beasties in Hexen

IMPLEMENT_ACTOR (AEttin, Hexen, 10030, 4)
	PROP_SpawnHealth (175)
	PROP_RadiusFixed (25)
	PROP_HeightFixed (68)
	PROP_Mass (175)
	PROP_SpeedFixed (13)
	PROP_Damage (3)
	PROP_PainChance (60)
	PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL)
	PROP_Flags2 (MF2_FLOORCLIP|MF2_PUSHWALL|MF2_MCROSS|MF2_TELESTOMP)
	PROP_SpawnState (S_ETTIN_LOOK)
	PROP_SeeState (S_ETTIN_CHASE)
	PROP_PainState (S_ETTIN_PAIN)
	PROP_MeleeState (S_ETTIN_ATK1)
	PROP_DeathState (S_ETTIN_DEATH1)
	PROP_XDeathState (S_ETTIN_DEATH2)
	PROP_IDeathState (S_ETTIN_ICE)
	PROP_SeeSound ("EttinSight")
	PROP_AttackSound ("EttinAttack")
	PROP_PainSound ("EttinPain")
	PROP_DeathSound ("EttinDeath")
	PROP_ActiveSound ("EttinActive")
END_DEFAULTS

FState AEttin::States[] =
{
#define S_ETTIN_LOOK 0
	S_NORMAL1 (ETTN, 'A',   10, A_Look             , &States[S_ETTIN_LOOK+1]),
	S_NORMAL1 (ETTN, 'A',   10, A_Look             , &States[S_ETTIN_LOOK+0]),

#define S_ETTIN_CHASE (S_ETTIN_LOOK+2)
	S_NORMAL1 (ETTN, 'A',    5, A_Chase            , &States[S_ETTIN_CHASE+1]),
	S_NORMAL1 (ETTN, 'B',    5, A_Chase            , &States[S_ETTIN_CHASE+2]),
	S_NORMAL1 (ETTN, 'C',    5, A_Chase            , &States[S_ETTIN_CHASE+3]),
	S_NORMAL1 (ETTN, 'D',    5, A_Chase            , &States[S_ETTIN_CHASE+0]),

#define S_ETTIN_PAIN (S_ETTIN_CHASE+4)
	S_NORMAL1 (ETTN, 'H',    7, A_Pain             , &States[S_ETTIN_CHASE+0]),

#define S_ETTIN_ATK1 (S_ETTIN_PAIN+1)
	S_NORMAL1 (ETTN, 'E',    6, A_FaceTarget       , &States[S_ETTIN_ATK1+1]),
	S_NORMAL1 (ETTN, 'F',    6, A_FaceTarget       , &States[S_ETTIN_ATK1+2]),
	S_NORMAL1 (ETTN, 'G',    8, A_EttinAttack      , &States[S_ETTIN_CHASE+0]),

#define S_ETTIN_DEATH1 (S_ETTIN_ATK1+3)
	S_NORMAL1 (ETTN, 'I',    4, NULL               , &States[S_ETTIN_DEATH1+1]),
	S_NORMAL1 (ETTN, 'J',    4, NULL               , &States[S_ETTIN_DEATH1+2]),
	S_NORMAL1 (ETTN, 'K',    4, A_Scream           , &States[S_ETTIN_DEATH1+3]),
	S_NORMAL1 (ETTN, 'L',    4, A_NoBlocking       , &States[S_ETTIN_DEATH1+4]),
	S_NORMAL1 (ETTN, 'M',    4, A_QueueCorpse      , &States[S_ETTIN_DEATH1+5]),
	S_NORMAL1 (ETTN, 'N',    4, NULL               , &States[S_ETTIN_DEATH1+6]),
	S_NORMAL1 (ETTN, 'O',    4, NULL               , &States[S_ETTIN_DEATH1+7]),
	S_NORMAL1 (ETTN, 'P',    4, NULL               , &States[S_ETTIN_DEATH1+8]),
	S_NORMAL1 (ETTN, 'Q',   -1, NULL               , NULL),

#define S_ETTIN_DEATH2 (S_ETTIN_DEATH1+9)
	S_NORMAL1 (ETTB, 'A',    4, NULL               , &States[S_ETTIN_DEATH2+1]),
	S_NORMAL1 (ETTB, 'B',    4, A_NoBlocking       , &States[S_ETTIN_DEATH2+2]),
	S_NORMAL1 (ETTB, 'C',    4, A_DropMace         , &States[S_ETTIN_DEATH2+3]),
	S_NORMAL1 (ETTB, 'D',    4, A_Scream           , &States[S_ETTIN_DEATH2+4]),
	S_NORMAL1 (ETTB, 'E',    4, A_QueueCorpse      , &States[S_ETTIN_DEATH2+5]),
	S_NORMAL1 (ETTB, 'F',    4, NULL               , &States[S_ETTIN_DEATH2+6]),
	S_NORMAL1 (ETTB, 'G',    4, NULL               , &States[S_ETTIN_DEATH2+7]),
	S_NORMAL1 (ETTB, 'H',    4, NULL               , &States[S_ETTIN_DEATH2+8]),
	S_NORMAL1 (ETTB, 'I',    4, NULL               , &States[S_ETTIN_DEATH2+9]),
	S_NORMAL1 (ETTB, 'J',    4, NULL               , &States[S_ETTIN_DEATH2+10]),
	S_NORMAL1 (ETTB, 'K',    4, NULL               , &States[S_ETTIN_DEATH2+11]),
	S_NORMAL1 (ETTB, 'L',   -1, NULL               , NULL),

#define S_ETTIN_ICE (S_ETTIN_DEATH2+12)
	S_NORMAL1 (ETTN, 'R',    5, A_FreezeDeath      , &States[S_ETTIN_ICE+1]),
	S_NORMAL1 (ETTN, 'R',    1, A_FreezeDeathChunks, &States[S_ETTIN_ICE+1])
};

------------------------------------------------------------------------

//========== This item is spawned and thrown away when an ettin is gibbed

IMPLEMENT_ACTOR (AEttinMace, Hexen, -1, 0)
	PROP_RadiusFixed (5)
	PROP_HeightFixed (5)
	PROP_Flags (MF_DROPOFF|MF_CORPSE)
	PROP_Flags2 (MF2_NOTELEPORT|MF2_FLOORCLIP)
	PROP_SpawnState (0)
	PROP_DeathState (4)
END_DEFAULTS

FState AEttinMace::States[] =
{
	S_NORMAL1 (ETTB, 'M',    5, A_CheckFloor , &States[1]),
	S_NORMAL1 (ETTB, 'N',    5, A_CheckFloor , &States[2]),
	S_NORMAL1 (ETTB, 'O',    5, A_CheckFloor , &States[3]),
	S_NORMAL1 (ETTB, 'P',    5, A_CheckFloor , &States[0]),
	S_NORMAL1 (ETTB, 'Q',    5, NULL         , &States[5]),
	S_NORMAL1 (ETTB, 'R',    5, A_QueueCorpse, &States[6]),
	S_NORMAL1 (ETTB, 'S',   -1, NULL         , NULL)
};

------------------------------------------------------------------------

//========== Ghostly ettins spawned by Hexen's final boss, Korax.

IMPLEMENT_STATELESS_ACTOR (AEttinMash, Hexen, -1, 102)
	PROP_FlagsSet (MF_NOBLOOD)
	PROP_Flags2Set (MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_MCROSS|MF2_PUSHWALL|MF2_BLASTED)
	PROP_RenderStyle (STYLE_Translucent)
	PROP_Alpha (HX_ALTSHADOW)
	PROP_DeathState (~0)
	PROP_XDeathState (~0)
	PROP_IDeathState (~0)
END_DEFAULTS

------------------------------------------------------------------------

//========== Timon's Axe (Fighter's first weapon)

IMPLEMENT_ACTOR (AFWeapAxe, Hexen, 8010, 27)
	PROP_Flags (MF_SPECIAL)
	PROP_SpawnState (S_AXE)
END_DEFAULTS

FState AFWeapAxe::States[] =
{
#define S_AXE 0
	S_NORMAL1(WFAX, 'A',   -1, NULL			, NULL),

#define S_FAXEREADY (S_AXE+1)
	S_NORMAL1(FAXE, 'A',	1, A_FAxeCheckReady	, &States[S_FAXEREADY]),

#define S_FAXEDOWN (S_FAXEREADY+1)
	S_NORMAL1(FAXE, 'A',	1, A_Lower		, &States[S_FAXEDOWN]),

#define S_FAXEUP (S_FAXEDOWN+1)
	S_NORMAL1(FAXE, 'A',	1, A_FAxeCheckUp	, &States[S_FAXEUP]),

#define S_FAXEATK (S_FAXEUP+1)
	S_NORMAL2 (FAXE, 'B',	4, A_FAxeCheckAtk	, &States[S_FAXEATK+1], 15, 32),
	S_NORMAL2 (FAXE, 'C',	3, NULL			, &States[S_FAXEATK+2], 15, 32),
	S_NORMAL2 (FAXE, 'D',	2, NULL			, &States[S_FAXEATK+3], 15, 32),
	S_NORMAL2 (FAXE, 'D',	1, A_FAxeAttack		, &States[S_FAXEATK+4], -5, 70),
	S_NORMAL2 (FAXE, 'D',	2, NULL			, &States[S_FAXEATK+5], -25, 90),
	S_NORMAL2 (FAXE, 'E',	1, NULL			, &States[S_FAXEATK+6], 15, 32),
	S_NORMAL2 (FAXE, 'E',	2, NULL			, &States[S_FAXEATK+7], 10, 54),
	S_NORMAL2 (FAXE, 'E',	7, NULL			, &States[S_FAXEATK+8], 10, 150),
	S_NORMAL2 (FAXE, 'A',	1, A_ReFire		, &States[S_FAXEATK+9], 0, 60),
	S_NORMAL2 (FAXE, 'A',	1, NULL			, &States[S_FAXEATK+10], 0, 52),
	S_NORMAL2 (FAXE, 'A',	1, NULL			, &States[S_FAXEATK+11], 0, 44),
	S_NORMAL2 (FAXE, 'A',	1, NULL			, &States[S_FAXEATK+12], 0, 36),
	S_NORMAL1 (FAXE, 'A',	1, NULL			, &States[S_FAXEREADY]),

#define S_FAXEREADY_G (S_FAXEATK+13)
	S_NORMAL1(FAXE, 'L',	1, A_FAxeCheckReadyG	, &States[S_FAXEREADY_G+1]),
	S_NORMAL1(FAXE, 'L',	1, A_FAxeCheckReadyG	, &States[S_FAXEREADY_G+2]),
	S_NORMAL1(FAXE, 'L',	1, A_FAxeCheckReadyG	, &States[S_FAXEREADY_G+3]),
	S_NORMAL1(FAXE, 'M',	1, A_FAxeCheckReadyG	, &States[S_FAXEREADY_G+4]),
	S_NORMAL1(FAXE, 'M',	1, A_FAxeCheckReadyG	, &States[S_FAXEREADY_G+5]),
	S_NORMAL1(FAXE, 'M',	1, A_FAxeCheckReadyG	, &States[S_FAXEREADY_G]),

#define S_FAXEDOWN_G (S_FAXEREADY_G+6)
	S_NORMAL1(FAXE, 'L',	1, A_Lower		, &States[S_FAXEDOWN_G]),

#define S_FAXEUP_G (S_FAXEDOWN_G+1)
	S_NORMAL1(FAXE, 'L',	1, A_FAxeCheckUpG	, &States[S_FAXEUP_G]),

#define S_FAXEATK_G (S_FAXEUP_G+1)
	S_NORMAL2 (FAXE, 'N',	4, NULL			, &States[S_FAXEATK_G+1], 15, 32),
	S_NORMAL2 (FAXE, 'O',	3, NULL			, &States[S_FAXEATK_G+2], 15, 32),
	S_NORMAL2 (FAXE, 'P',	2, NULL			, &States[S_FAXEATK_G+3], 15, 32),
	S_NORMAL2 (FAXE, 'P',	1, A_FAxeAttack		, &States[S_FAXEATK_G+4], -5, 70),
	S_NORMAL2 (FAXE, 'P',	2, NULL			, &States[S_FAXEATK_G+5], -25, 90),
	S_NORMAL2 (FAXE, 'Q',	1, NULL			, &States[S_FAXEATK_G+6], 15, 32),
	S_NORMAL2 (FAXE, 'Q',	2, NULL			, &States[S_FAXEATK_G+7], 10, 54),
	S_NORMAL2 (FAXE, 'Q',	7, NULL			, &States[S_FAXEATK_G+8], 10, 150),
	S_NORMAL2 (FAXE, 'A',	1, A_ReFire		, &States[S_FAXEATK_G+9], 0, 60),
	S_NORMAL2 (FAXE, 'A',	1, NULL			, &States[S_FAXEATK_G+10], 0, 52),
	S_NORMAL2 (FAXE, 'A',	1, NULL			, &States[S_FAXEATK_G+11], 0, 44),
	S_NORMAL2 (FAXE, 'A',	1, NULL			, &States[S_FAXEATK_G+12], 0, 36),
	S_NORMAL1 (FAXE, 'A',	1, NULL			, &States[S_FAXEREADY_G]),
};

FWeaponInfo AFWeapAxe::WeaponInfo =
{
	0,				// DWORD           flags;
	MANA_1,				// ammotype_t      ammo;
	0,				// int             ammouse;
	25,				// int             ammogive;
	&States[S_FAXEUP],		// FState          *upstate;
	&States[S_FAXEDOWN],		// FState          *downstate;
	&States[S_FAXEREADY],		// FState          *readystate;
	&States[S_FAXEATK],		// FState          *atkstate;
	&States[S_FAXEATK],		// FState          *holdatkstate;
	NULL,				// FState          *flashstate;
	NULL,				// const TypeInfo  *droptype;
	150,				// int             kickback;
	-12*FRACUNIT,			// fixed_t         yadjust;
	NULL,				// const char      *upsound;
	NULL,				// const char      *readysound;
	ZDRUNTIME_CLASS(AFWeapAxe),	// TypeInfo        *type;      // type of actor that represents this weapon
	-1				// int             minammo;    // minimum ammo needed to switch to this weapon
};

------------------------------------------------------------------------

//========== The smokey puff spawned on impact by the Timon's Axe in its "weak" form.

IMPLEMENT_ACTOR (AAxePuff, Hexen, -1, 0)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
	PROP_Flags3 (MF3_PUFFONACTORS)
	PROP_Flags4 (MF4_NONETSPAWN)
	PROP_RenderStyle (STYLE_Translucent)
	PROP_Alpha (HX_SHADOW)
	PROP_SpawnState (0)
	PROP_SeeSound ("FighterAxeHitThing")
	PROP_AttackSound ("FighterHammerHitWall")
	PROP_ActiveSound ("FighterHammerMiss")
END_DEFAULTS

FState AAxePuff::States[] =
{
	S_NORMAL1(FHFX, 'S',	4, NULL, &States[1]),
	S_NORMAL1(FHFX, 'T',	4, NULL, &States[2]),
	S_NORMAL1(FHFX, 'U',	4, NULL, &States[3]),
	S_NORMAL1(FHFX, 'V',	4, NULL, &States[4]),
	S_NORMAL1(FHFX, 'W',	4, NULL, NULL),
};

------------------------------------------------------------------------

//========== The glowing, electric-like puff spawned on impact by the Timon's Axe in its "powered" form.

IMPLEMENT_ACTOR (AAxePuffGlow, Hexen, -1, 0)
	PROP_Flags3 (MF3_PUFFONACTORS)
	PROP_Flags4 (MF4_NONETSPAWN)
	PROP_RenderStyle (STYLE_Add)
	PROP_Alpha (ZOPAQUE)
	PROP_SpawnState (0)
END_DEFAULTS

FState AAxePuffGlow::States[] =
{
	S_BRIGHT (FAXE, 'R',	4, NULL, &States[1]),
	S_BRIGHT (FAXE, 'S',	4, NULL, &States[2]),
	S_BRIGHT (FAXE, 'T',	4, NULL, &States[3]),
	S_BRIGHT (FAXE, 'U',	4, NULL, &States[4]),
	S_BRIGHT (FAXE, 'V',	4, NULL, &States[5]),
	S_BRIGHT (FAXE, 'W',	4, NULL, &States[6]),
	S_BRIGHT (FAXE, 'X',	4, NULL, NULL),
};

------------------------------------------------------------------------

//========== Blood splatter created when someone is hurt by Timon's axe.

IMPLEMENT_ACTOR (AAxeBlood, Hexen, -1, 0)
	PROP_RadiusFixed (2)
	PROP_HeightFixed (4)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF)
	PROP_Flags2 (MF2_NOTELEPORT|MF2_CANNOTPUSH)
	PROP_SpawnState (0)
	PROP_DeathState (5)
END_DEFAULTS

FState AAxeBlood::States[] =
{
	S_NORMAL1(FAXE, 'F',	3, NULL, &States[1]),
	S_NORMAL1(FAXE, 'G',	3, NULL, &States[2]),
	S_NORMAL1(FAXE, 'H',	3, NULL, &States[3]),
	S_NORMAL1(FAXE, 'I',	3, NULL, &States[4]),
	S_NORMAL1(FAXE, 'J',	3, NULL, &States[5]),
	S_NORMAL1(FAXE, 'K',	3, NULL, NULL),
};

------------------------------------------------------------------------

//========== Zedek is one of the three penultimate bosses of Hexen.

IMPLEMENT_ACTOR (AFighterBoss, Hexen, 10100, 0)
	PROP_SpawnHealth (800)
	PROP_PainChance (50)
	PROP_SpeedFixed (25)
	PROP_RadiusFixed (16)
	PROP_HeightFixed (64)
	PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL)
	PROP_Flags2 (MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_TELESTOMP|MF2_PUSHWALL|MF2_MCROSS)
	PROP_Flags3 (MF3_DONTMORPH)
	PROP_SpawnState (S_FIGHTER)
	PROP_SeeState (S_FIGHTER_RUN1)
	PROP_PainState (S_FIGHTER_PAIN)
	PROP_MeleeState (S_FIGHTER_ATK1)
	PROP_MissileState (S_FIGHTER_ATK1)
	PROP_DeathState (S_FIGHTER_DIE1)
	PROP_XDeathState (S_FIGHTER_XDIE1)
	PROP_IDeathState (S_FIGHTER_ICE)
	PROP_BDeathState (S_FIGHTER_BURN)
	PROP_PainSound ("PlayerFighterPain")
	PROP_DeathSound ("PlayerFighterCrazyDeath")
END_DEFAULTS

FState AFighterBoss::States[] =
{
#define S_FIGHTER 0
	S_NORMAL1(PLAY, 'A',	2, NULL			, &States[S_FIGHTER+1]),
	S_NORMAL1(PLAY, 'A',	3, A_ClassBossHealth	, &States[S_FIGHTER+2]),
	S_NORMAL1(PLAY, 'A',	5, A_Look		, &States[S_FIGHTER+2]),

#define S_FIGHTER_RUN1 (S_FIGHTER+3)
	S_NORMAL1(PLAY, 'A',	4, A_FastChase		, &States[S_FIGHTER_RUN1+1]),
	S_NORMAL1(PLAY, 'B',	4, A_FastChase		, &States[S_FIGHTER_RUN1+2]),
	S_NORMAL1(PLAY, 'C',	4, A_FastChase		, &States[S_FIGHTER_RUN1+3]),
	S_NORMAL1(PLAY, 'D',	4, A_FastChase		, &States[S_FIGHTER_RUN1]),

#define S_FIGHTER_PAIN (S_FIGHTER_RUN1+4)
	S_NORMAL1(PLAY, 'G',	4, NULL			, &States[S_FIGHTER_PAIN+1]),
	S_NORMAL1(PLAY, 'G',	4, A_Pain		, &States[S_FIGHTER_RUN1]),

#define S_FIGHTER_ATK1 (S_FIGHTER_PAIN+2)
	S_NORMAL1(PLAY, 'E',	8, A_FaceTarget		, &States[S_FIGHTER_ATK1+1]),
	S_NORMAL1(PLAY, 'F',	8, A_FighterAttack	, &States[S_FIGHTER_RUN1]),

#define S_FIGHTER_DIE1 (S_FIGHTER_ATK1+2)
	S_NORMAL1(PLAY, 'H',	6, NULL			, &States[S_FIGHTER_DIE1+1]),
	S_NORMAL1(PLAY, 'I',	6, A_Scream		, &States[S_FIGHTER_DIE1+2]),
	S_NORMAL1(PLAY, 'J',	6, NULL			, &States[S_FIGHTER_DIE1+3]),
	S_NORMAL1(PLAY, 'K',	6, NULL			, &States[S_FIGHTER_DIE1+4]),
	S_NORMAL1(PLAY, 'L',	6, A_NoBlocking		, &States[S_FIGHTER_DIE1+5]),
	S_NORMAL1(PLAY, 'M',	6, NULL			, &States[S_FIGHTER_DIE1+6]),
	S_NORMAL1(PLAY, 'N',   -1, NULL			, NULL),

#define S_FIGHTER_XDIE1 (S_FIGHTER_DIE1+7)
	S_NORMAL1(PLAY, 'O',	5, A_Scream		, &States[S_FIGHTER_XDIE1+1]),
	S_NORMAL1(PLAY, 'P',	5, A_SkullPop		, &States[S_FIGHTER_XDIE1+2]),
	S_NORMAL1(PLAY, 'R',	5, A_NoBlocking		, &States[S_FIGHTER_XDIE1+3]),
	S_NORMAL1(PLAY, 'S',	5, NULL			, &States[S_FIGHTER_XDIE1+4]),
	S_NORMAL1(PLAY, 'T',	5, NULL			, &States[S_FIGHTER_XDIE1+5]),
	S_NORMAL1(PLAY, 'U',	5, NULL			, &States[S_FIGHTER_XDIE1+6]),
	S_NORMAL1(PLAY, 'V',	5, NULL			, &States[S_FIGHTER_XDIE1+7]),
	S_NORMAL1(PLAY, 'W',   -1, NULL			, NULL),

#define S_FIGHTER_ICE (S_FIGHTER_XDIE1+8)
	S_NORMAL1(PLAY, 'X',	5, A_FreezeDeath	, &States[S_FIGHTER_ICE+1]),
	S_NORMAL1(PLAY, 'X',	1, A_FreezeDeathChunks	, &States[S_FIGHTER_ICE+1]),

#define S_FIGHTER_BURN (S_FIGHTER_ICE+2)
	S_BRIGHT (FDTH, 'A',	5, A_FighterBurnScream	, &States[S_FIGHTER_BURN+1]),
	S_BRIGHT (FDTH, 'B',	4, NULL			, &States[S_FIGHTER_BURN+2]),
	S_BRIGHT (FDTH, 'G',	5, NULL			, &States[S_FIGHTER_BURN+3]),
	S_BRIGHT (FDTH, 'H',	4, A_Scream		, &States[S_FIGHTER_BURN+4]),
	S_BRIGHT (FDTH, 'I',	5, NULL			, &States[S_FIGHTER_BURN+5]),
	S_BRIGHT (FDTH, 'J',	4, NULL			, &States[S_FIGHTER_BURN+6]),
	S_BRIGHT (FDTH, 'K',	5, NULL			, &States[S_FIGHTER_BURN+7]),
	S_BRIGHT (FDTH, 'L',	4, NULL			, &States[S_FIGHTER_BURN+8]),
	S_BRIGHT (FDTH, 'M',	5, NULL			, &States[S_FIGHTER_BURN+9]),
	S_BRIGHT (FDTH, 'N',	4, NULL			, &States[S_FIGHTER_BURN+10]),
	S_BRIGHT (FDTH, 'O',	5, NULL			, &States[S_FIGHTER_BURN+11]),
	S_BRIGHT (FDTH, 'P',	4, NULL			, &States[S_FIGHTER_BURN+12]),
	S_BRIGHT (FDTH, 'Q',	5, NULL			, &States[S_FIGHTER_BURN+13]),
	S_BRIGHT (FDTH, 'R',	4, NULL			, &States[S_FIGHTER_BURN+14]),
	S_BRIGHT (FDTH, 'S',	5, A_NoBlocking		, &States[S_FIGHTER_BURN+15]),
	S_BRIGHT (FDTH, 'T',	4, NULL			, &States[S_FIGHTER_BURN+16]),
	S_BRIGHT (FDTH, 'U',	5, NULL			, &States[S_FIGHTER_BURN+17]),
	S_BRIGHT (FDTH, 'V',	4, NULL			, &States[S_FIGHTER_BURN+18]),
	S_NORMAL1(ACLO, 'E',   35, A_CheckBurnGone	, &States[S_FIGHTER_BURN+18]),
	S_NORMAL1(ACLO, 'E',	8, NULL			, NULL),
};

------------------------------------------------------------------------

//========== Hammer of retribution (Fighter's third weapon)

IMPLEMENT_ACTOR (AFWeapHammer, Hexen, 123, 28)
	PROP_Flags (MF_SPECIAL)
	PROP_SpawnState (S_HAMM)
END_DEFAULTS

FState AFWeapHammer::States[] =
{
#define S_HAMM 0
	S_NORMAL1(WFHM, 'A',   -1, NULL		    , NULL),

#define S_FHAMMERREADY (S_HAMM+1)
	S_NORMAL1(FHMR, 'A',	1, A_WeaponReady    , &States[S_FHAMMERREADY]),

#define S_FHAMMERDOWN (S_FHAMMERREADY+1)
	S_NORMAL1(FHMR, 'A',	1, A_Lower	    , &States[S_FHAMMERDOWN]),

#define S_FHAMMERUP (S_FHAMMERDOWN+1)
	S_NORMAL1(FHMR, 'A',	1, A_Raise	    , &States[S_FHAMMERUP]),

#define S_FHAMMERATK (S_FHAMMERUP+1)
	S_NORMAL2 (FHMR, 'B',	6, NULL		    , &States[S_FHAMMERATK+1], 5, 0),
	S_NORMAL2 (FHMR, 'C',	3, A_FHammerAttack  , &States[S_FHAMMERATK+2], 5, 0),
	S_NORMAL2 (FHMR, 'D',	3, NULL		    , &States[S_FHAMMERATK+3], 5, 0),
	S_NORMAL2 (FHMR, 'E',	2, NULL		    , &States[S_FHAMMERATK+4], 5, 0),
	S_NORMAL2 (FHMR, 'E',   10, A_FHammerThrow  , &States[S_FHAMMERATK+5], 5, 150),
	S_NORMAL2 (FHMR, 'A',	1, NULL		    , &States[S_FHAMMERATK+6], 0, 60),
	S_NORMAL2 (FHMR, 'A',	1, NULL		    , &States[S_FHAMMERATK+7], 0, 55),
	S_NORMAL2 (FHMR, 'A',	1, NULL		    , &States[S_FHAMMERATK+8], 0, 50),
	S_NORMAL2 (FHMR, 'A',	1, NULL		    , &States[S_FHAMMERATK+9], 0, 45),
	S_NORMAL2 (FHMR, 'A',	1, NULL		    , &States[S_FHAMMERATK+10], 0, 40),
	S_NORMAL2 (FHMR, 'A',	1, NULL		    , &States[S_FHAMMERATK+11], 0, 35),
	S_NORMAL1 (FHMR, 'A',	1, NULL		    , &States[S_FHAMMERREADY]),
};

FWeaponInfo AFWeapHammer::WeaponInfo =
{
	0,				// DWORD           flags;
	MANA_2,				// ammotype_t      ammo;
	3,				// int             ammouse;
	25,				// int             ammogive;
	&States[S_FHAMMERUP],		// FState          *upstate;
	&States[S_FHAMMERDOWN],		// FState          *downstate;
	&States[S_FHAMMERREADY],	// FState          *readystate;
	&States[S_FHAMMERATK],		// FState          *atkstate;
	&States[S_FHAMMERATK],		// FState          *holdatkstate;
	NULL,				// FState          *flashstate;
	NULL,				// const TypeInfo  *droptype;
	150,				// int             kickback;
	-10*FRACUNIT,			// fixed_t         yadjust;
	NULL,				// const char      *upsound;
	NULL,				// const char      *readysound;
	ZDRUNTIME_CLASS(AFWeapHammer),	// TypeInfo        *type;      // type of actor that represents this weapon
	-1				// int             minammo;    // minimum ammo needed to switch to this weapon
};

------------------------------------------------------------------------

//========== The flaming hammer projectile fired by the Hammer of Retribution.

IMPLEMENT_ACTOR (AHammerMissile, Hexen, -1, 0)
	PROP_SpeedFixed (25)
	PROP_RadiusFixed (14)
	PROP_HeightFixed (20)
	PROP_Damage (10)
	PROP_DamageType (MOD_FIRE)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
	PROP_Flags2 (MF2_NOTELEPORT|MF2_IMPACT|MF2_PCROSS)
	PROP_SpawnState (S_HAMMER_MISSILE_1)
	PROP_DeathState (S_HAMMER_MISSILE_X1)
	PROP_DeathSound ("FighterHammerExplode")
END_DEFAULTS

FState AHammerMissile::States[] =
{
#define S_HAMMER_MISSILE_1 0
	S_BRIGHT (FHFX, 'A',	2, NULL		    , &States[S_HAMMER_MISSILE_1+1]),
	S_BRIGHT (FHFX, 'B',	2, A_HammerSound    , &States[S_HAMMER_MISSILE_1+2]),
	S_BRIGHT (FHFX, 'C',	2, NULL		    , &States[S_HAMMER_MISSILE_1+3]),
	S_BRIGHT (FHFX, 'D',	2, NULL		    , &States[S_HAMMER_MISSILE_1+4]),
	S_BRIGHT (FHFX, 'E',	2, NULL		    , &States[S_HAMMER_MISSILE_1+5]),
	S_BRIGHT (FHFX, 'F',	2, NULL		    , &States[S_HAMMER_MISSILE_1+6]),
	S_BRIGHT (FHFX, 'G',	2, NULL		    , &States[S_HAMMER_MISSILE_1+7]),
	S_BRIGHT (FHFX, 'H',	2, NULL		    , &States[S_HAMMER_MISSILE_1]),

#define S_HAMMER_MISSILE_X1 (S_HAMMER_MISSILE_1+8)
	S_BRIGHT (FHFX, 'I',	3, A_BeAdditive	    , &States[S_HAMMER_MISSILE_X1+1]),
	S_BRIGHT (FHFX, 'J',	3, NULL		    , &States[S_HAMMER_MISSILE_X1+2]),
	S_BRIGHT (FHFX, 'K',	3, A_Explode	    , &States[S_HAMMER_MISSILE_X1+3]),
	S_BRIGHT (FHFX, 'L',	3, NULL		    , &States[S_HAMMER_MISSILE_X1+4]),
	S_BRIGHT (FHFX, 'M',	3, NULL		    , &States[S_HAMMER_MISSILE_X1+5]),
	S_NORMAL1(FHFX, 'N',	3, NULL		    , &States[S_HAMMER_MISSILE_X1+6]),
	S_BRIGHT (FHFX, 'O',	3, NULL		    , &States[S_HAMMER_MISSILE_X1+7]),
	S_BRIGHT (FHFX, 'P',	3, NULL		    , &States[S_HAMMER_MISSILE_X1+8]),
	S_BRIGHT (FHFX, 'Q',	3, NULL		    , &States[S_HAMMER_MISSILE_X1+9]),
	S_BRIGHT (FHFX, 'R',	3, NULL		    , NULL),
};

------------------------------------------------------------------------

//========== The puff spawned by the Hammer of Retribution when hitting a hittable object or a wall. Also used by the Mace of Contrition.

IMPLEMENT_ACTOR (AHammerPuff, Hexen, -1, 0)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
	PROP_Flags3 (MF3_PUFFONACTORS)
	PROP_Flags4 (MF4_NONETSPAWN)
	PROP_RenderStyle (STYLE_Translucent)
	PROP_Alpha (HX_SHADOW)
	PROP_SpawnState (0)
	PROP_SeeSound ("FighterHammerHitThing")
	PROP_AttackSound ("FighterHammerHitWall")
	PROP_ActiveSound ("FighterHammerMiss")
END_DEFAULTS

FState AHammerPuff::States[] =
{
	S_NORMAL1 (FHFX, 'S',	4, NULL, &States[1]),
	S_NORMAL1 (FHFX, 'T',	4, NULL, &States[2]),
	S_NORMAL1 (FHFX, 'U',	4, NULL, &States[3]),
	S_NORMAL1 (FHFX, 'V',	4, NULL, &States[4]),
	S_NORMAL1 (FHFX, 'W',	4, NULL, NULL),
};

------------------------------------------------------------------------

//========== The Fighter is one of the three character classes available to Hexen players.

IMPLEMENT_ACTOR (AFighterPlayer, Hexen, -1, 0)
	PROP_SpawnHealth (100)
	PROP_RadiusFixed (16)
	PROP_HeightFixed (64)
	PROP_Mass (100)
	PROP_PainChance (255)
	PROP_SpeedFixed (1)
	PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_DROPOFF|MF_PICKUP|MF_NOTDMATCH|MF_FRIENDLY)
	PROP_Flags2 (MF2_WINDTHRUST|MF2_FLOORCLIP|MF2_SLIDE|MF2_PASSMOBJ|MF2_TELESTOMP|MF2_PUSHWALL)
	PROP_Flags3 (MF3_NOBLOCKMONST)
	PROP_Flags4 (MF4_NOSKIN)
	PROP_SpawnState (S_FPLAY)
	PROP_SeeState (S_FPLAY_RUN)
	PROP_PainState (S_FPLAY_PAIN)
	PROP_MissileState (S_FPLAY_ATK)
	PROP_DeathState (S_FPLAY_DIE)
	PROP_XDeathState (S_FPLAY_XDIE)
	PROP_BDeathState (S_PLAY_F_FDTH)
	PROP_IDeathState (S_FPLAY_ICE)
	PROP_PainSound ("PlayerFighterPain")
END_DEFAULTS

FState AFighterPlayer::States[] =
{
#define S_FPLAY 0
	S_NORMAL1(PLAY, 'A',   -1, NULL			, NULL),

#define S_FPLAY_RUN (S_FPLAY+1)
	S_NORMAL1(PLAY, 'A',	4, NULL			, &States[S_FPLAY_RUN+1]),
	S_NORMAL1(PLAY, 'B',	4, NULL			, &States[S_FPLAY_RUN+2]),
	S_NORMAL1(PLAY, 'C',	4, NULL			, &States[S_FPLAY_RUN+3]),
	S_NORMAL1(PLAY, 'D',	4, NULL			, &States[S_FPLAY_RUN+0]),

#define S_FPLAY_ATK (S_FPLAY_RUN+4)
	S_NORMAL1(PLAY, 'E',	8, NULL			, &States[S_FPLAY_ATK+1]),
	S_NORMAL1(PLAY, 'F',	8, NULL			, &States[S_FPLAY]),

#define S_FPLAY_PAIN (S_FPLAY_ATK+2)
	S_NORMAL1(PLAY, 'G',	4, NULL			, &States[S_FPLAY_PAIN+1]),
	S_NORMAL1(PLAY, 'G',	4, A_Pain		, &States[S_FPLAY]),

#define S_FPLAY_DIE (S_FPLAY_PAIN+2)
	S_NORMAL1(PLAY, 'H',	6, NULL 		, &States[S_FPLAY_DIE+1]),
	S_NORMAL1(PLAY, 'I',	6, A_PlayerScream	, &States[S_FPLAY_DIE+2]),
	S_NORMAL1(PLAY, 'J',	6, NULL			, &States[S_FPLAY_DIE+3]),
	S_NORMAL1(PLAY, 'K',	6, NULL			, &States[S_FPLAY_DIE+4]),
	S_NORMAL1(PLAY, 'L',	6, A_NoBlocking		, &States[S_FPLAY_DIE+5]),
	S_NORMAL1(PLAY, 'M',	6, NULL 		, &States[S_FPLAY_DIE+6]),
	S_NORMAL1(PLAY, 'N',   -1, NULL/*A_AddPlayerCorpse*/, NULL),

#define S_FPLAY_XDIE (S_FPLAY_DIE+7)
	S_NORMAL1(PLAY, 'O',	5, A_PlayerScream	, &States[S_FPLAY_XDIE+1]),
	S_NORMAL1(PLAY, 'P',	5, A_SkullPop		, &States[S_FPLAY_XDIE+2]),
	S_NORMAL1(PLAY, 'R',	5, A_NoBlocking		, &States[S_FPLAY_XDIE+3]),
	S_NORMAL1(PLAY, 'S',	5, NULL 		, &States[S_FPLAY_XDIE+4]),
	S_NORMAL1(PLAY, 'T',	5, NULL 		, &States[S_FPLAY_XDIE+5]),
	S_NORMAL1(PLAY, 'U',	5, NULL 		, &States[S_FPLAY_XDIE+6]),
	S_NORMAL1(PLAY, 'V',	5, NULL 		, &States[S_FPLAY_XDIE+7]),
	S_NORMAL1(PLAY, 'W',   -1, NULL/*A_AddPlayerCorpse*/, NULL),

#define S_FPLAY_ICE (S_FPLAY_XDIE+8)
	S_NORMAL1(PLAY, 'X',	5, A_FreezeDeath	, &States[S_FPLAY_ICE+1]),
	S_NORMAL1(PLAY, 'X',	1, A_FreezeDeathChunks	, &States[S_FPLAY_ICE+1]),

#define S_PLAY_FDTH (S_FPLAY_ICE+2)
	S_BRIGHT (FDTH, 'G',	5, A_FireScream		, &States[S_PLAY_FDTH+1]),
	S_BRIGHT (FDTH, 'H',	4, A_PlayerScream	, &States[S_PLAY_FDTH+2]),
	S_BRIGHT (FDTH, 'I',	5, NULL 		, &States[S_PLAY_FDTH+3]),
	S_BRIGHT (FDTH, 'J',	4, NULL 		, &States[S_PLAY_FDTH+4]),
	S_BRIGHT (FDTH, 'K',	5, NULL 		, &States[S_PLAY_FDTH+5]),
	S_BRIGHT (FDTH, 'L',	4, NULL 		, &States[S_PLAY_FDTH+6]),
	S_BRIGHT (FDTH, 'M',	5, NULL 		, &States[S_PLAY_FDTH+7]),
	S_BRIGHT (FDTH, 'N',	4, NULL 		, &States[S_PLAY_FDTH+8]),
	S_BRIGHT (FDTH, 'O',	5, NULL 		, &States[S_PLAY_FDTH+9]),
	S_BRIGHT (FDTH, 'P',	4, NULL 		, &States[S_PLAY_FDTH+10]),
	S_BRIGHT (FDTH, 'Q',	5, NULL 		, &States[S_PLAY_FDTH+11]),
	S_BRIGHT (FDTH, 'R',	4, NULL 		, &States[S_PLAY_FDTH+12]),
	S_BRIGHT (FDTH, 'S',	5, A_NoBlocking		, &States[S_PLAY_FDTH+13]),
	S_BRIGHT (FDTH, 'T',	4, NULL 		, &States[S_PLAY_FDTH+14]),
	S_BRIGHT (FDTH, 'U',	5, NULL 		, &States[S_PLAY_FDTH+15]),
	S_BRIGHT (FDTH, 'V',	4, NULL 		, &States[S_PLAY_FDTH+16]),
	S_NORMAL1(ACLO, 'E',   35, A_CheckBurnGone	, &States[S_PLAY_FDTH+16]),
	S_NORMAL1(ACLO, 'E',	8, NULL 		, NULL),

#define S_PLAY_F_FDTH (S_PLAY_FDTH+18)
	S_BRIGHT (FDTH, 'A',	5, NULL 		, &States[S_PLAY_F_FDTH+1]),
	S_BRIGHT (FDTH, 'B',	4, NULL 		, &States[S_PLAY_FDTH]),
};

------------------------------------------------------------------------

//========== The spiked gauntlets used by fighters.

IMPLEMENT_ACTOR (AFWeapFist, Hexen, -1, 0)
END_DEFAULTS

FState AFWeapFist::States[] =
{
#define S_PUNCHREADY 0
	S_NORMAL1(FPCH, 'A',	1, A_WeaponReady	, &States[S_PUNCHREADY]),

#define S_PUNCHDOWN (S_PUNCHREADY+1)
	S_NORMAL1(FPCH, 'A',	1, A_Lower		, &States[S_PUNCHDOWN]),

#define S_PUNCHUP (S_PUNCHDOWN+1)
	S_NORMAL1(FPCH, 'A',	1, A_Raise		, &States[S_PUNCHUP]),

#define S_PUNCHATK1 (S_PUNCHUP+1)
	S_NORMAL2(FPCH, 'B',	5, NULL 		, &States[S_PUNCHATK1+1], 5, 40),
	S_NORMAL2(FPCH, 'C',	4, NULL 		, &States[S_PUNCHATK1+2], 5, 40),
	S_NORMAL2(FPCH, 'D',	4, A_FPunchAttack	, &States[S_PUNCHATK1+3], 5, 40),
	S_NORMAL2(FPCH, 'C',	4, NULL 		, &States[S_PUNCHATK1+4], 5, 40),
	S_NORMAL2(FPCH, 'B',	5, A_ReFire 		, &States[S_PUNCHREADY], 5, 40),

#define S_PUNCHATK2 (S_PUNCHATK1+5)
	S_NORMAL2(FPCH, 'D',	4, NULL 		, &States[S_PUNCHATK2+1], 5, 40),
	S_NORMAL2(FPCH, 'E',	4, NULL 		, &States[S_PUNCHATK2+2], 5, 40),
	S_NORMAL2(FPCH, 'E',	1, NULL 		, &States[S_PUNCHATK2+3], 15, 50),
	S_NORMAL2(FPCH, 'E',	1, NULL 		, &States[S_PUNCHATK2+4], 25, 60),
	S_NORMAL2(FPCH, 'E',	1, NULL 		, &States[S_PUNCHATK2+5], 35, 70),
	S_NORMAL2(FPCH, 'E',	1, NULL 		, &States[S_PUNCHATK2+6], 45, 80),
	S_NORMAL2(FPCH, 'E',	1, NULL 		, &States[S_PUNCHATK2+7], 55, 90),
	S_NORMAL2(FPCH, 'E',	1, NULL 		, &States[S_PUNCHATK2+8], 65, 100),
	S_NORMAL2(FPCH, 'E',   10, NULL 		, &States[S_PUNCHREADY], 0, 150)
};

FWeaponInfo AFWeapFist::WeaponInfo =
{
	0,
	MANA_NONE,
	0,
	0,
	&States[S_PUNCHUP],
	&States[S_PUNCHDOWN],
	&States[S_PUNCHREADY],
	&States[S_PUNCHATK1],
	&States[S_PUNCHATK1],
	NULL,
	NULL,
	150,
	0,
	NULL,
	NULL,
	ZDRUNTIME_CLASS(AFWeapFist),
	-1
};

------------------------------------------------------------------------

//========== The puff spawned when the fighter's fist strikes a hittable object or wall.

IMPLEMENT_ACTOR (APunchPuff, Hexen, -1, 0)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
	PROP_Flags3 (MF3_PUFFONACTORS)
	PROP_Flags4 (MF4_NONETSPAWN)
	PROP_RenderStyle (STYLE_Translucent)
	PROP_Alpha (HX_SHADOW)
	PROP_SpawnState (0)
	PROP_SeeSound ("FighterPunchHitThing")
	PROP_AttackSound ("FighterPunchHitWall")
	PROP_ActiveSound ("FighterPunchMiss")
END_DEFAULTS

FState APunchPuff::States[] =
{
	S_NORMAL1(FHFX, 'S',	4, NULL, &States[1]),
	S_NORMAL1(FHFX, 'T',	4, NULL, &States[2]),
	S_NORMAL1(FHFX, 'U',	4, NULL, &States[3]),
	S_NORMAL1(FHFX, 'V',	4, NULL, &States[4]),
	S_NORMAL1(FHFX, 'W',	4, NULL, NULL)
};

------------------------------------------------------------------------

//========== One of three pieces of the Quietus (fighter's 4th weapon).

IMPLEMENT_ACTOR (AFWeaponPiece1, Hexen, 12, 29)
	PROP_Flags (MF_SPECIAL)
	PROP_Flags2 (MF2_FLOATBOB)
	PROP_SpawnState (0)
END_DEFAULTS

FState AFWeaponPiece1::States[] =
{
	S_BRIGHT (WFR1, 'A',   -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== One of three pieces of the Quietus (fighter's 4th weapon).

IMPLEMENT_ACTOR (AFWeaponPiece2, Hexen, 13, 30)
	PROP_Flags (MF_SPECIAL)
	PROP_Flags2 (MF2_FLOATBOB)
	PROP_SpawnState (0)
END_DEFAULTS

FState AFWeaponPiece2::States[] =
{
	S_BRIGHT (WFR2, 'A',   -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== One of three pieces of the Quietus (fighter's 4th weapon).

IMPLEMENT_ACTOR (AFWeaponPiece3, Hexen, 16, 31)
	PROP_Flags (MF_SPECIAL)
	PROP_Flags2 (MF2_FLOATBOB)
	PROP_SpawnState (0)
END_DEFAULTS

FState AFWeaponPiece3::States[] =
{
	S_BRIGHT (WFR3, 'A',   -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== An actor that spawns the three pieces of the fighter's 4th weapon (Quietus). It gets spawned if weapon drop is on so that other players can pick up the dead player's weapon.

FState AQuietusDrop::States[] =
{
	S_NORMAL1(TNT1, 'A', 1, NULL			, &States[1]),
	S_NORMAL1(TNT1, 'A', 1, A_DropQuietusPieces	, NULL)
};

IMPLEMENT_ACTOR (AQuietusDrop, Hexen, -1, 0)
	PROP_SpawnState (0)
END_DEFAULTS

------------------------------------------------------------------------

//========== The Fighter's final weapon, the Quietus is a very powerful sword that sends out a spread of green balls.

IMPLEMENT_ACTOR (AFWeapQuietus, Hexen, -1, 0)
	PROP_Flags (MF_SPECIAL)
	PROP_SpawnState (0)
END_DEFAULTS

FState AFWeapQuietus::States[] =
{
	// Dummy state, because the fourth weapon does not appear in a level directly.
	S_NORMAL1(TNT1, 'A',   -1, NULL		    , NULL),

#define S_FSWORDREADY (1)
	S_BRIGHT (FSRD, 'A',	1, A_WeaponReady    , &States[S_FSWORDREADY+1]),
	S_BRIGHT (FSRD, 'A',	1, A_WeaponReady    , &States[S_FSWORDREADY+2]),
	S_BRIGHT (FSRD, 'A',	1, A_WeaponReady    , &States[S_FSWORDREADY+3]),
	S_BRIGHT (FSRD, 'A',	1, A_WeaponReady    , &States[S_FSWORDREADY+4]),
	S_BRIGHT (FSRD, 'B',	1, A_WeaponReady    , &States[S_FSWORDREADY+5]),
	S_BRIGHT (FSRD, 'B',	1, A_WeaponReady    , &States[S_FSWORDREADY+6]),
	S_BRIGHT (FSRD, 'B',	1, A_WeaponReady    , &States[S_FSWORDREADY+7]),
	S_BRIGHT (FSRD, 'B',	1, A_WeaponReady    , &States[S_FSWORDREADY+8]),
	S_BRIGHT (FSRD, 'C',	1, A_WeaponReady    , &States[S_FSWORDREADY+9]),
	S_BRIGHT (FSRD, 'C',	1, A_WeaponReady    , &States[S_FSWORDREADY+10]),
	S_BRIGHT (FSRD, 'C',	1, A_WeaponReady    , &States[S_FSWORDREADY+11]),
	S_BRIGHT (FSRD, 'C',	1, A_WeaponReady    , &States[S_FSWORDREADY]),

#define S_FSWORDDOWN (S_FSWORDREADY+12)
	S_BRIGHT (FSRD, 'A',	1, A_Lower	    , &States[S_FSWORDDOWN]),

#define S_FSWORDUP (S_FSWORDDOWN+1)
	S_BRIGHT (FSRD, 'A',	1, A_Raise	    , &States[S_FSWORDUP]),

#define S_FSWORDATK (S_FSWORDUP+1)
	S_BRIGHT2 (FSRD, 'D',	3, NULL		    , &States[S_FSWORDATK+1], 5, 36),
	S_BRIGHT2 (FSRD, 'E',	3, NULL		    , &States[S_FSWORDATK+2], 5, 36),
	S_BRIGHT2 (FSRD, 'F',	2, NULL		    , &States[S_FSWORDATK+3], 5, 36),
	S_BRIGHT2 (FSRD, 'G',	3, A_FSwordAttack   , &States[S_FSWORDATK+4], 5, 36),
	S_BRIGHT2 (FSRD, 'H',	2, NULL		    , &States[S_FSWORDATK+5], 5, 36),
	S_BRIGHT2 (FSRD, 'I',	2, NULL		    , &States[S_FSWORDATK+6], 5, 36),
	S_BRIGHT2 (FSRD, 'I',  10, NULL		    , &States[S_FSWORDATK+7], 5, 150),
	S_BRIGHT2 (FSRD, 'A',	1, NULL		    , &States[S_FSWORDATK+8], 5, 60),
	S_BRIGHT2 (FSRD, 'B',	1, NULL		    , &States[S_FSWORDATK+9], 5, 55),
	S_BRIGHT2 (FSRD, 'C',	1, NULL		    , &States[S_FSWORDATK+10], 5, 50),
	S_BRIGHT2 (FSRD, 'A',	1, NULL		    , &States[S_FSWORDATK+11], 5, 45),
	S_BRIGHT2 (FSRD, 'B',	1, NULL		    , &States[S_FSWORDREADY], 5, 40),
};

FWeaponInfo AFWeapQuietus::WeaponInfo =
{
	0,				// DWORD           flags;
	MANA_BOTH,			// ammotype_t      ammo;
	14,				// int             ammouse;
	0,				// int             ammogive;
	&States[S_FSWORDUP],		// FState          *upstate;
	&States[S_FSWORDDOWN],		// FState          *downstate;
	&States[S_FSWORDREADY],		// FState          *readystate;
	&States[S_FSWORDATK],		// FState          *atkstate;
	&States[S_FSWORDATK],		// FState          *holdatkstate;
	NULL,				// FState          *flashstate;
	NULL,				// const TypeInfo  *droptype;
	150,				// int             kickback;
	4*FRACUNIT,			// fixed_t         yadjust;
	NULL,				// const char      *upsound;
	NULL,				// const char      *readysound;
	ZDRUNTIME_CLASS(AFWeapQuietus),	// TypeInfo        *type;      // type of actor that represents this weapon
	-1				// int             minammo;    // minimum ammo needed to switch to this weapon
};

------------------------------------------------------------------------

//========== The powerful green projectile fired by the Quietus.

IMPLEMENT_ACTOR (AFSwordMissile, Hexen, -1, 0)
	PROP_SpeedFixed (30)
	PROP_RadiusFixed (16)
	PROP_HeightFixed (8)
	PROP_Damage (8)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
	PROP_Flags2 (MF2_NOTELEPORT|MF2_IMPACT|MF2_PCROSS)
	PROP_RenderStyle (STYLE_Add)
	PROP_SpawnState (S_FSWORD_MISSILE1)
	PROP_DeathState (S_FSWORD_MISSILE_X1)
	PROP_DeathSound ("FighterSwordExplode")
END_DEFAULTS

FState AFSwordMissile::States[] =
{
#define S_FSWORD_MISSILE1 0
	S_BRIGHT (FSFX, 'A',	3, NULL		    , &States[S_FSWORD_MISSILE1+1]),
	S_BRIGHT (FSFX, 'B',	3, NULL		    , &States[S_FSWORD_MISSILE1+2]),
	S_BRIGHT (FSFX, 'C',	3, NULL		    , &States[S_FSWORD_MISSILE1]),

#define S_FSWORD_MISSILE_X1 (S_FSWORD_MISSILE1+3)
	S_BRIGHT (FSFX, 'D',	4, NULL		    , &States[S_FSWORD_MISSILE_X1+1]),
	S_BRIGHT (FSFX, 'E',	3, A_FSwordFlames   , &States[S_FSWORD_MISSILE_X1+2]),
	S_BRIGHT (FSFX, 'F',	4, A_Explode        , &States[S_FSWORD_MISSILE_X1+3]),
	S_BRIGHT (FSFX, 'G',	3, NULL		    , &States[S_FSWORD_MISSILE_X1+4]),
	S_BRIGHT (FSFX, 'H',	4, NULL		    , &States[S_FSWORD_MISSILE_X1+5]),
	S_BRIGHT (FSFX, 'I',	3, NULL		    , &States[S_FSWORD_MISSILE_X1+6]),
	S_BRIGHT (FSFX, 'J',	4, NULL		    , &States[S_FSWORD_MISSILE_X1+7]),
	S_BRIGHT (FSFX, 'K',	3, NULL		    , &States[S_FSWORD_MISSILE_X1+8]),
	S_BRIGHT (FSFX, 'L',	3, NULL		    , &States[S_FSWORD_MISSILE_X1+9]),
	S_BRIGHT (FSFX, 'M',	3, NULL		    , NULL),
};

------------------------------------------------------------------------

//========== The green flame spawned by the Quietus's projectile(s) on impact.

IMPLEMENT_ACTOR (AFSwordFlame, Hexen, -1, 0)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
	PROP_Flags4 (MF4_NONETSPAWN)
	PROP_RenderStyle (STYLE_Translucent)
	PROP_Alpha (HX_SHADOW)
	PROP_SpawnState (0)
END_DEFAULTS

FState AFSwordFlame::States[] =
{
	S_BRIGHT (FSFX, 'N',	3, NULL	    , &States[1]),
	S_BRIGHT (FSFX, 'O',	3, NULL	    , &States[2]),
	S_BRIGHT (FSFX, 'P',	3, NULL	    , &States[3]),
	S_BRIGHT (FSFX, 'Q',	3, NULL	    , &States[4]),
	S_BRIGHT (FSFX, 'R',	3, NULL	    , &States[5]),
	S_BRIGHT (FSFX, 'S',	3, NULL	    , &States[6]),
	S_BRIGHT (FSFX, 'T',	3, NULL	    , &States[7]),
	S_BRIGHT (FSFX, 'U',	3, NULL	    , &States[8]),
	S_BRIGHT (FSFX, 'V',	3, NULL	    , &States[9]),
	S_BRIGHT (FSFX, 'W',	3, NULL	    , NULL),
};

------------------------------------------------------------------------

//========== The afrit looks like a small black gargoyle wreathed in flames.

IMPLEMENT_ACTOR (AFireDemon, Hexen, 10060, 5)
	PROP_SpawnHealth (80)
	PROP_ReactionTime (8)
	PROP_PainChance (1)
	PROP_SpeedLong (13)
	PROP_RadiusFixed (20)
	PROP_HeightFixed (68)
	PROP_Mass (75)
	PROP_Damage (1)
	PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_DROPOFF|MF_NOGRAVITY|MF_FLOAT)
	PROP_Flags2 (MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_PUSHWALL|MF2_INVULNERABLE|MF2_MCROSS|MF2_TELESTOMP)
	PROP_SpawnState (S_FIRED_SPAWN1)
	PROP_SeeState (S_FIRED_LOOK1+3)
	PROP_PainState (S_FIRED_PAIN1)
	PROP_MissileState (S_FIRED_ATTACK1)
	PROP_CrashState (S_FIRED_XDEATH1)
	PROP_DeathState (S_FIRED_DEATH1)
	PROP_XDeathState (S_FIRED_XDEATH1)
	PROP_IDeathState (S_FIRED_ICE1)
	PROP_SeeSound ("FireDemonSpawn")
	PROP_PainSound ("FireDemonPain")
	PROP_DeathSound ("FireDemonDeath")
	PROP_ActiveSound ("FireDemonActive")
END_DEFAULTS

FState AFireDemon::States[] =
{
#define S_FIRED_SPAWN1 0
	S_BRIGHT (FDMN, 'X',    5, NULL                     , &States[S_FIRED_SPAWN1+1]),

#define S_FIRED_LOOK1 (S_FIRED_SPAWN1+1)
	S_BRIGHT (FDMN, 'E',   10, A_Look                   , &States[S_FIRED_LOOK1+1]),
	S_BRIGHT (FDMN, 'F',   10, A_Look                   , &States[S_FIRED_LOOK1+2]),
	S_BRIGHT (FDMN, 'G',   10, A_Look                   , &States[S_FIRED_LOOK1+0]),

	S_BRIGHT (FDMN, 'E',    8, NULL                     , &States[S_FIRED_LOOK1+4]),
	S_BRIGHT (FDMN, 'F',    6, NULL                     , &States[S_FIRED_LOOK1+5]),
	S_BRIGHT (FDMN, 'G',    5, NULL                     , &States[S_FIRED_LOOK1+6]),
	S_BRIGHT (FDMN, 'F',    8, NULL                     , &States[S_FIRED_LOOK1+7]),
	S_BRIGHT (FDMN, 'E',    6, NULL                     , &States[S_FIRED_LOOK1+8]),
	S_BRIGHT (FDMN, 'F',    7, A_FiredRocks             , &States[S_FIRED_LOOK1+9]),
	S_BRIGHT (FDMN, 'H',    5, NULL                     , &States[S_FIRED_LOOK1+10]),
	S_BRIGHT (FDMN, 'I',    5, NULL                     , &States[S_FIRED_LOOK1+11]),
	S_BRIGHT (FDMN, 'J',    5, A_UnSetInvulnerable      , &States[S_FIRED_LOOK1+12]),

#define S_FIRED_WALK1 (S_FIRED_LOOK1+12)
	S_BRIGHT (FDMN, 'A',    5, A_FiredChase             , &States[S_FIRED_WALK1+1]),
	S_BRIGHT (FDMN, 'B',    5, A_FiredChase             , &States[S_FIRED_WALK1+2]),
	S_BRIGHT (FDMN, 'C',    5, A_FiredChase             , &States[S_FIRED_WALK1+0]),

#define S_FIRED_PAIN1 (S_FIRED_WALK1+3)
	S_BRIGHT (FDMN, 'D',    6, A_Pain                   , &States[S_FIRED_WALK1]),

#define S_FIRED_ATTACK1 (S_FIRED_PAIN1+1)
	S_BRIGHT (FDMN, 'K',    3, A_FaceTarget             , &States[S_FIRED_ATTACK1+1]),
	S_BRIGHT (FDMN, 'K',    5, A_FiredAttack            , &States[S_FIRED_ATTACK1+2]),
	S_BRIGHT (FDMN, 'K',    5, A_FiredAttack            , &States[S_FIRED_ATTACK1+3]),
	S_BRIGHT (FDMN, 'K',    5, A_FiredAttack            , &States[S_FIRED_WALK1]),

#define S_FIRED_DEATH1 (S_FIRED_ATTACK1+4)
	S_BRIGHT (FDMN, 'D',    4, A_FaceTarget             , &States[S_FIRED_DEATH1+1]),
	S_BRIGHT (FDMN, 'L',    4, A_Scream                 , &States[S_FIRED_DEATH1+2]),
	S_BRIGHT (FDMN, 'L',    4, A_NoBlocking             , &States[S_FIRED_DEATH1+3]),
	S_BRIGHT (FDMN, 'L',  200, NULL                     , NULL),

#define S_FIRED_XDEATH1 (S_FIRED_DEATH1+4)
	S_NORMAL1 (FDMN, 'M',    5, A_FaceTarget             , &States[S_FIRED_XDEATH1+1]),
	S_NORMAL1 (FDMN, 'N',    5, A_NoBlocking             , &States[S_FIRED_XDEATH1+2]),
	S_NORMAL1 (FDMN, 'O',    5, A_FiredSplotch           , NULL),

#define S_FIRED_ICE1 (S_FIRED_XDEATH1+3)
	S_NORMAL1 (FDMN, 'R',    5, A_FreezeDeath            , &States[S_FIRED_ICE1+1]),
	S_NORMAL1 (FDMN, 'R',    1, A_FreezeDeathChunks      , &States[S_FIRED_ICE1+1])
};

------------------------------------------------------------------------

//========== A small lump of overcooked afrit meat, dropped along with the rest of the monster when it dies.

IMPLEMENT_ACTOR (AFireDemonSplotch1, Hexen, -1, 0)
	PROP_SpawnHealth (1000)
	PROP_ReactionTime (8)
	PROP_PainChance (0)
	PROP_SpeedLong (0)
	PROP_RadiusFixed (3)
	PROP_HeightFixed (16)
	PROP_Mass (100)
	PROP_Damage (0)
	PROP_Flags (MF_DROPOFF|MF_CORPSE)
	PROP_Flags2 (MF2_NOTELEPORT|MF2_FLOORCLIP)
	PROP_SpawnState (0)
END_DEFAULTS

FState AFireDemonSplotch1::States[] =
{
	S_NORMAL1 (FDMN, 'P',    3, NULL         , &States[1]),
	S_NORMAL1 (FDMN, 'P',    6, A_QueueCorpse, &States[2]),
	S_NORMAL1 (FDMN, 'Y',   -1, NULL         , NULL)
};

------------------------------------------------------------------------

//========== A small lump of overcooked afrit meat, dropped along with the rest of the monster when it dies.

IMPLEMENT_ACTOR (AFireDemonSplotch2, Hexen, -1, 0)
	PROP_SpawnState (0)
END_DEFAULTS

FState AFireDemonSplotch2::States[] =
{
	S_NORMAL1 (FDMN, 'Q',    3, NULL         , &States[1]),
	S_NORMAL1 (FDMN, 'Q',    6, A_QueueCorpse, &States[2]),
	S_NORMAL1 (FDMN, 'Z',   -1, NULL         , NULL)
};

------------------------------------------------------------------------

//========== A rock that can be created when an afrit unrolls from its protective ball.

IMPLEMENT_ACTOR (AFireDemonRock1, Hexen, -1, 0)
	PROP_SpawnHealth (1000)
	PROP_ReactionTime (8)
	PROP_PainChance (0)
	PROP_SpeedLong (0)
	PROP_RadiusFixed (3)
	PROP_HeightFixed (5)
	PROP_Mass (16)
	PROP_Damage (0)
	PROP_Flags (MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_SpawnState (S_FIRED_RDROP1)
	PROP_DeathState (S_FIRED_RDEAD1)
	PROP_XDeathState (S_FIRED_RDEAD1+1)
END_DEFAULTS

FState AFireDemonRock1::States[] =
{
#define S_FIRED_RDROP1 0
	S_NORMAL1 (FDMN, 'S',    4, NULL      , &States[S_FIRED_RDROP1]),

#define S_FIRED_RDEAD1 (S_FIRED_RDROP1+1)
	S_NORMAL1 (FDMN, 'S',    5, A_SmBounce, &States[S_FIRED_RDEAD1+1]),
	S_NORMAL1 (FDMN, 'S',  200, NULL      , NULL)
};

------------------------------------------------------------------------

//========== A rock that can be created when an afrit unrolls from its protective ball.

IMPLEMENT_ACTOR (AFireDemonRock2, Hexen, -1, 0)
	PROP_SpawnState (S_FIRED_RDROP2)
	PROP_DeathState (S_FIRED_RDEAD2)
	PROP_XDeathState (S_FIRED_RDEAD2+1)
END_DEFAULTS

FState AFireDemonRock2::States[] =
{
#define S_FIRED_RDROP2 0
	S_NORMAL1 (FDMN, 'T',    4, NULL      , &States[S_FIRED_RDROP2]),

#define S_FIRED_RDEAD2 (S_FIRED_RDROP2+1)
	S_NORMAL1 (FDMN, 'T',    5, A_SmBounce, &States[S_FIRED_RDEAD2+1]),
	S_NORMAL1 (FDMN, 'T',  200, NULL      , NULL)
};

------------------------------------------------------------------------

//========== A rock that can be created when an afrit unrolls from its protective ball.

IMPLEMENT_ACTOR (AFireDemonRock3, Hexen, -1, 0)
	PROP_SpawnState (S_FIRED_RDROP3)
	PROP_DeathState (S_FIRED_RDEAD3)
	PROP_XDeathState (S_FIRED_RDEAD3+1)
END_DEFAULTS

FState AFireDemonRock3::States[] =
{
#define S_FIRED_RDROP3 0
	S_NORMAL1 (FDMN, 'U',    4, NULL      , &States[S_FIRED_RDROP3]),

#define S_FIRED_RDEAD3 (S_FIRED_RDROP3+1)
	S_NORMAL1 (FDMN, 'U',    5, A_SmBounce, &States[S_FIRED_RDEAD3+1]),
	S_NORMAL1 (FDMN, 'U',  200, NULL      , NULL)
};

------------------------------------------------------------------------

//========== A rock that can be created when an afrit unrolls from its protective ball.

FState AFireDemonRock4::States[] =
{
#define S_FIRED_RDROP4 0
	S_NORMAL1 (FDMN, 'V',    4, NULL      , &States[S_FIRED_RDROP4]),

#define S_FIRED_RDEAD4 (S_FIRED_RDROP4+1)
	S_NORMAL1 (FDMN, 'V',    5, A_SmBounce, &States[S_FIRED_RDEAD4+1]),
	S_NORMAL1 (FDMN, 'V',  200, NULL      , NULL)
};

IMPLEMENT_ACTOR (AFireDemonRock4, Hexen, -1, 0)
	PROP_SpawnState (S_FIRED_RDROP4)
	PROP_DeathState (S_FIRED_RDEAD4)
	PROP_XDeathState (S_FIRED_RDEAD4+1)
END_DEFAULTS

------------------------------------------------------------------------

//========== A rock that can be created when an afrit unrolls from its protective ball.

IMPLEMENT_ACTOR (AFireDemonRock5, Hexen, -1, 0)
	PROP_SpawnState (S_FIRED_RDROP5)
	PROP_DeathState (S_FIRED_RDEAD5)
	PROP_XDeathState (S_FIRED_RDEAD5+1)
END_DEFAULTS

FState AFireDemonRock5::States[] =
{
#define S_FIRED_RDROP5 0
	S_NORMAL1 (FDMN, 'W',    4, NULL      , &States[S_FIRED_RDROP5]),

#define S_FIRED_RDEAD5 (S_FIRED_RDROP5+1)
	S_NORMAL1 (FDMN, 'W',    5, A_SmBounce, &States[S_FIRED_RDEAD5+1]),
	S_NORMAL1 (FDMN, 'W',  200, NULL      , NULL)
};

------------------------------------------------------------------------

//========== The yellow fireballs thrown by afrits.

IMPLEMENT_ACTOR (AFireDemonMissile, Hexen, -1, 0)
	PROP_SpawnHealth (1000)
	PROP_ReactionTime (8)
	PROP_PainChance (0)
	PROP_SpeedFixed (10)
	PROP_RadiusFixed (10)
	PROP_HeightFixed (6)
	PROP_Mass (15)
	PROP_Damage (1)
	PROP_DamageType (MOD_FIRE)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
	PROP_Flags2 (MF2_NOTELEPORT|MF2_IMPACT|MF2_PCROSS|MF2_FLOORCLIP)
	PROP_SpawnState (S_FIRED_FX6_1)
	PROP_DeathState (S_FIRED_FX6_2)
	PROP_DeathSound ("FireDemonMissileHit")
END_DEFAULTS

FState AFireDemonMissile::States[] =
{
#define S_FIRED_FX6_1 0
	S_BRIGHT (FDMB, 'A',    5, NULL, &States[S_FIRED_FX6_1]),

#define S_FIRED_FX6_2 (S_FIRED_FX6_1+1)
	S_BRIGHT (FDMB, 'B',    5, NULL, &States[S_FIRED_FX6_2+1]),
	S_BRIGHT (FDMB, 'C',    5, NULL, &States[S_FIRED_FX6_2+2]),
	S_BRIGHT (FDMB, 'D',    5, NULL, &States[S_FIRED_FX6_2+3]),
	S_BRIGHT (FDMB, 'E',    5, NULL, NULL)
};

------------------------------------------------------------------------

//========== Small temporary flame

IMPLEMENT_ACTOR (AFlameSmallTemp, Hexen, 10500, 96)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_RenderStyle (STYLE_Add)
	PROP_SpawnState (0)
END_DEFAULTS

FState AFlameSmallTemp::States[] =
{
	S_BRIGHT (FFSM, 'A',	3, NULL		    , &States[1]),
	S_BRIGHT (FFSM, 'B',	3, NULL		    , &States[2]),
	S_BRIGHT (FFSM, 'C',	2, A_FlameCheck	    , &States[3]),
	S_BRIGHT (FFSM, 'C',	2, NULL		    , &States[4]),
	S_BRIGHT (FFSM, 'D',	3, NULL		    , &States[5]),
	S_BRIGHT (FFSM, 'E',	3, A_FlameCheck	    , &States[0]),
};

------------------------------------------------------------------------

//========== Large temporary flame

IMPLEMENT_ACTOR (AFlameLargeTemp, Hexen, 10502, 98)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_RenderStyle (STYLE_Add)
	PROP_SpawnState (0)
END_DEFAULTS

FState AFlameLargeTemp::States[] =
{
	S_BRIGHT (FFLG, 'A',	4, NULL		    , &States[1]),
	S_BRIGHT (FFLG, 'B',	4, A_FlameCheck	    , &States[2]),
	S_BRIGHT (FFLG, 'C',	4, NULL		    , &States[3]),
	S_BRIGHT (FFLG, 'D',	4, A_FlameCheck	    , &States[4]),
	S_BRIGHT (FFLG, 'E',	4, NULL		    , &States[5]),
	S_BRIGHT (FFLG, 'F',	4, A_FlameCheck	    , &States[6]),
	S_BRIGHT (FFLG, 'G',	4, NULL		    , &States[7]),
	S_BRIGHT (FFLG, 'H',	4, A_FlameCheck	    , &States[8]),
	S_BRIGHT (FFLG, 'I',	4, NULL		    , &States[9]),
	S_BRIGHT (FFLG, 'J',	4, A_FlameCheck	    , &States[10]),
	S_BRIGHT (FFLG, 'K',	4, NULL		    , &States[11]),
	S_BRIGHT (FFLG, 'L',	4, A_FlameCheck	    , &States[12]),
	S_BRIGHT (FFLG, 'M',	4, NULL		    , &States[13]),
	S_BRIGHT (FFLG, 'N',	4, A_FlameCheck	    , &States[14]),
	S_BRIGHT (FFLG, 'O',	4, NULL		    , &States[15]),
	S_BRIGHT (FFLG, 'P',	4, A_FlameCheck	    , &States[4]),
};

------------------------------------------------------------------------

//========== Small flame (switchable decoration)

IMPLEMENT_ACTOR (AFlameSmall, Hexen, 10501, 97)
	PROP_Flags2 (MF2_NOTELEPORT|RF_INVISIBLE)
	PROP_RenderStyle (STYLE_Add)
	PROP_SpawnState (S_FLAME_SMALL1)
END_DEFAULTS

FState AFlameSmall::States[] =
{
#define S_FLAME_SMALL1 0
	S_BRIGHT (FFSM, 'A',	3, NULL		    , &States[S_FLAME_SMALL1+1]),
	S_BRIGHT (FFSM, 'A',	3, A_UnHideThing    , &States[S_FLAME_SMALL1+2]),
	S_BRIGHT (FFSM, 'A',	3, NULL		    , &States[S_FLAME_SMALL1+3]),
	S_BRIGHT (FFSM, 'B',	3, NULL		    , &States[S_FLAME_SMALL1+4]),
	S_BRIGHT (FFSM, 'C',	3, NULL		    , &States[S_FLAME_SMALL1+5]),
	S_BRIGHT (FFSM, 'D',	3, NULL		    , &States[S_FLAME_SMALL1+6]),
	S_BRIGHT (FFSM, 'E',	3, NULL		    , &States[S_FLAME_SMALL1+2]),

#define S_FLAME_SDORM1 (S_FLAME_SMALL1+7)
	S_NORMAL1(FFSM, 'A',	2, NULL		    , &States[S_FLAME_SDORM1+1]),
	S_NORMAL1(FFSM, 'B',	2, A_HideThing	    , &States[S_FLAME_SDORM1+2]),
	S_NORMAL1(FFSM, 'C',  200, NULL		    , &States[S_FLAME_SDORM1+2]),
};

------------------------------------------------------------------------

//========== Large flame (switchable decoration)

IMPLEMENT_ACTOR (AFlameLarge, Hexen, 10503, 99)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_RenderFlags (RF_INVISIBLE)
	PROP_RenderStyle (STYLE_Add)
	PROP_SpawnState (S_FLAME_LARGE1)
END_DEFAULTS

FState AFlameLarge::States[] =
{
#define S_FLAME_LARGE1 0
	S_BRIGHT (FFLG, 'A',	2, NULL		    , &States[S_FLAME_LARGE1+1]),
	S_BRIGHT (FFLG, 'A',	2, A_UnHideThing    , &States[S_FLAME_LARGE1+2]),
	S_BRIGHT (FFLG, 'A',	4, NULL		    , &States[S_FLAME_LARGE1+3]),
	S_BRIGHT (FFLG, 'B',	4, NULL		    , &States[S_FLAME_LARGE1+4]),
	S_BRIGHT (FFLG, 'C',	4, NULL		    , &States[S_FLAME_LARGE1+5]),
	S_BRIGHT (FFLG, 'D',	4, NULL		    , &States[S_FLAME_LARGE1+6]),
	S_BRIGHT (FFLG, 'E',	4, NULL		    , &States[S_FLAME_LARGE1+7]),
	S_BRIGHT (FFLG, 'F',	4, NULL		    , &States[S_FLAME_LARGE1+8]),
	S_BRIGHT (FFLG, 'G',	4, NULL		    , &States[S_FLAME_LARGE1+9]),
	S_BRIGHT (FFLG, 'H',	4, NULL		    , &States[S_FLAME_LARGE1+10]),
	S_BRIGHT (FFLG, 'I',	4, NULL		    , &States[S_FLAME_LARGE1+11]),
	S_BRIGHT (FFLG, 'J',	4, NULL		    , &States[S_FLAME_LARGE1+12]),
	S_BRIGHT (FFLG, 'K',	4, NULL		    , &States[S_FLAME_LARGE1+13]),
	S_BRIGHT (FFLG, 'L',	4, NULL		    , &States[S_FLAME_LARGE1+14]),
	S_BRIGHT (FFLG, 'M',	4, NULL		    , &States[S_FLAME_LARGE1+15]),
	S_BRIGHT (FFLG, 'N',	4, NULL		    , &States[S_FLAME_LARGE1+16]),
	S_BRIGHT (FFLG, 'O',	4, NULL		    , &States[S_FLAME_LARGE1+17]),
	S_BRIGHT (FFLG, 'P',	4, NULL		    , &States[S_FLAME_LARGE1+6]),

#define S_FLAME_LDORM1 (S_FLAME_LARGE1+18)
	S_NORMAL1(FFLG, 'D',	2, NULL		    , &States[S_FLAME_LDORM1+1]),
	S_NORMAL1(FFLG, 'C',	2, NULL		    , &States[S_FLAME_LDORM1+2]),
	S_NORMAL1(FFLG, 'B',	2, NULL		    , &States[S_FLAME_LDORM1+3]),
	S_NORMAL1(FFLG, 'A',	2, A_HideThing	    , &States[S_FLAME_LDORM1+4]),
	S_NORMAL1(FFLG, 'A',  200, NULL		    , &States[S_FLAME_LDORM1+4]),
};

------------------------------------------------------------------------

//========== Flechette used by clerics

IMPLEMENT_ACTOR (APoisonBag, Hexen, -1, 0)
	PROP_RadiusFixed (5)
	PROP_HeightFixed (5)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
	PROP_SpawnState (S_POISONBAG1)
END_DEFAULTS

FState APoisonBag::States[] =
{
#define S_POISONBAG1 0
	S_BRIGHT (PSBG, 'A',   18, NULL		    , &States[S_POISONBAG1+1]),
	S_BRIGHT (PSBG, 'B',	4, NULL		    , &States[S_POISONBAG1+2]),
	S_NORMAL1(PSBG, 'C',	3, NULL		    , &States[S_POISONBAG1+3]),
	S_NORMAL1(PSBG, 'C',	1, A_PoisonBagInit  , NULL),
};

------------------------------------------------------------------------

//========== Flechette used by mages

IMPLEMENT_ACTOR (AFireBomb, Hexen, -1, 0)
	PROP_DamageType (MOD_FIRE)
	PROP_Flags (MF_NOGRAVITY)
	PROP_Flags3 (MF3_FOILINVUL)
	PROP_RenderStyle (STYLE_Translucent)
	PROP_Alpha (HX_ALTSHADOW)
	PROP_SpawnState (S_FIREBOMB1)
	PROP_DeathSound ("FlechetteExplode")
END_DEFAULTS

FState AFireBomb::States[] =
{
#define S_FIREBOMB1 0
	S_NORMAL1(PSBG, 'A',   20, NULL		, &States[S_FIREBOMB1+1]),
	S_NORMAL1(PSBG, 'A',   10, NULL		, &States[S_FIREBOMB1+2]),
	S_NORMAL1(PSBG, 'A',   10, NULL		, &States[S_FIREBOMB1+3]),
	S_NORMAL1(PSBG, 'B',	4, NULL		, &States[S_FIREBOMB1+4]),
	S_NORMAL1(PSBG, 'C',	4, A_Scream	, &States[S_FIREBOMB1+5]),
	S_BRIGHT (XPL1, 'A',	4, A_Explode	, &States[S_FIREBOMB1+6]),
	S_BRIGHT (XPL1, 'B',	4, NULL		, &States[S_FIREBOMB1+7]),
	S_BRIGHT (XPL1, 'C',	4, NULL		, &States[S_FIREBOMB1+8]),
	S_BRIGHT (XPL1, 'D',	4, NULL		, &States[S_FIREBOMB1+9]),
	S_BRIGHT (XPL1, 'E',	4, NULL		, &States[S_FIREBOMB1+10]),
	S_BRIGHT (XPL1, 'F',	4, NULL		, NULL),
};

------------------------------------------------------------------------

//========== Flechette used by fighters

IMPLEMENT_ACTOR (AThrowingBomb, Hexen, -1, 0)
	PROP_SpawnHealth (48)
	PROP_SpeedFixed (12)
	PROP_RadiusFixed (8)
	PROP_HeightFixed (10)
	PROP_DamageType (MOD_FIRE)
	PROP_Flags (MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE)
	PROP_Flags2 (MF2_HEXENBOUNCE)
	PROP_SpawnState (S_THROWINGBOMB1)
	PROP_DeathState (S_THROWINGBOMB_X1)
	PROP_SeeSound ("FlechetteBounce")
	PROP_DeathSound ("FlechetteExplode")
END_DEFAULTS

FState AThrowingBomb::States[] =
{
#define S_THROWINGBOMB1 0
	S_NORMAL1(THRW, 'A',	4, A_CheckThrowBomb	, &States[S_THROWINGBOMB1+1]),
	S_NORMAL1(THRW, 'B',	3, A_CheckThrowBomb	, &States[S_THROWINGBOMB1+2]),
	S_NORMAL1(THRW, 'C',	3, A_CheckThrowBomb	, &States[S_THROWINGBOMB1+3]),
	S_NORMAL1(THRW, 'D',	3, A_CheckThrowBomb	, &States[S_THROWINGBOMB1+4]),
	S_NORMAL1(THRW, 'E',	3, A_CheckThrowBomb	, &States[S_THROWINGBOMB1+5]),
	S_NORMAL1(THRW, 'F',	3, A_CheckThrowBomb	, &States[S_THROWINGBOMB1]),

#define S_THROWINGBOMB7 (S_THROWINGBOMB1+6)
	S_NORMAL1(THRW, 'G',	6, A_CheckThrowBomb	, &States[S_THROWINGBOMB7+1]),
	S_NORMAL1(THRW, 'F',	4, A_CheckThrowBomb	, &States[S_THROWINGBOMB7+2]),
	S_NORMAL1(THRW, 'H',	6, A_CheckThrowBomb	, &States[S_THROWINGBOMB7+3]),
	S_NORMAL1(THRW, 'F',	4, A_CheckThrowBomb	, &States[S_THROWINGBOMB7+4]),
	S_NORMAL1(THRW, 'G',	6, A_CheckThrowBomb	, &States[S_THROWINGBOMB7+5]),
	S_NORMAL1(THRW, 'F',	3, A_CheckThrowBomb	, &States[S_THROWINGBOMB7+5]),

#define S_THROWINGBOMB_X1 (S_THROWINGBOMB7+6)
	S_BRIGHT (CFCF, 'Q',	4, A_NoGravity		, &States[S_THROWINGBOMB_X1+1]),
	S_BRIGHT (CFCF, 'R',	3, A_Scream		, &States[S_THROWINGBOMB_X1+2]),
	S_BRIGHT (CFCF, 'S',	4, A_Explode		, &States[S_THROWINGBOMB_X1+3]),
	S_BRIGHT (CFCF, 'T',	3, NULL			, &States[S_THROWINGBOMB_X1+4]),
	S_BRIGHT (CFCF, 'U',	4, NULL			, &States[S_THROWINGBOMB_X1+5]),
	S_BRIGHT (CFCF, 'W',	3, NULL			, &States[S_THROWINGBOMB_X1+6]),
	S_BRIGHT (CFCF, 'X',	4, NULL			, &States[S_THROWINGBOMB_X1+7]),
	S_BRIGHT (CFCF, 'Z',	3, NULL			, NULL),
};

------------------------------------------------------------------------

//========== Flechette: a collectible vial of green liquid which acts as a versatile support weapon for Hexen players.

IMPLEMENT_ACTOR (AArtiPoisonBag, Hexen, 8000, 72)
	PROP_Flags (MF_SPECIAL)
	PROP_Flags2 (MF2_FLOATBOB)
	PROP_SpawnState (0)
	PROP_PickupSound("misc/p_pkup")
END_DEFAULTS

FState AArtiPoisonBag::States[] =
{
	S_NORMAL1(PSBG, 'A',   -1, NULL, NULL),
};

------------------------------------------------------------------------

//========== The flechette as used by clerics (Poison cloud flechette)

IMPLEMENT_STATELESS_ACTOR (AArtiPoisonBag1, Hexen, -1, 0)
END_DEFAULTS

------------------------------------------------------------------------

//========== The flechette as used by mages (Time bomb flechette)

IMPLEMENT_STATELESS_ACTOR (AArtiPoisonBag2, Hexen, -1, 0)
END_DEFAULTS

------------------------------------------------------------------------

//========== The flechette as used fighters (Thrown grenade flechette)

IMPLEMENT_STATELESS_ACTOR (AArtiPoisonBag3, Hexen, -1, 0)
END_DEFAULTS

------------------------------------------------------------------------

//========== The cloud of poison gas that is created by a cleric's flechette or by the destruction of a poison mushroom.

IMPLEMENT_ACTOR (APoisonCloud, Hexen, -1, 0)
	PROP_Radius (20)
	PROP_Height (30)
	PROP_MassLong (0x7fffffff)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF)
	PROP_Flags2 (MF2_NODMGTHRUST)
	PROP_Flags3 (MF3_DONTSPLASH|MF3_FOILINVUL|MF3_CANBLAST)
	PROP_RenderStyle (STYLE_Translucent)
	PROP_Alpha (HX_SHADOW)
	PROP_SpawnState (S_POISONCLOUD1)
	PROP_DeathSound ("PoisonShroomDeath")
END_DEFAULTS

FState APoisonCloud::States[] =
{
#define S_POISONCLOUD1 0
	S_NORMAL1(PSBG, 'D',	1, NULL			, &States[S_POISONCLOUD1+1]),
	S_NORMAL1(PSBG, 'D',	1, A_Scream		, &States[S_POISONCLOUD1+2]),
	S_NORMAL1(PSBG, 'D',	2, A_PoisonBagDamage	, &States[S_POISONCLOUD1+3]),
	S_NORMAL1(PSBG, 'E',	2, A_PoisonBagDamage	, &States[S_POISONCLOUD1+4]),
	S_NORMAL1(PSBG, 'E',	2, A_PoisonBagDamage	, &States[S_POISONCLOUD1+5]),
	S_NORMAL1(PSBG, 'E',	2, A_PoisonBagDamage	, &States[S_POISONCLOUD1+6]),
	S_NORMAL1(PSBG, 'F',	2, A_PoisonBagDamage	, &States[S_POISONCLOUD1+7]),
	S_NORMAL1(PSBG, 'F',	2, A_PoisonBagDamage	, &States[S_POISONCLOUD1+8]),
	S_NORMAL1(PSBG, 'F',	2, A_PoisonBagDamage	, &States[S_POISONCLOUD1+9]),
	S_NORMAL1(PSBG, 'G',	2, A_PoisonBagDamage	, &States[S_POISONCLOUD1+10]),
	S_NORMAL1(PSBG, 'G',	2, A_PoisonBagDamage	, &States[S_POISONCLOUD1+11]),
	S_NORMAL1(PSBG, 'G',	2, A_PoisonBagDamage	, &States[S_POISONCLOUD1+12]),
	S_NORMAL1(PSBG, 'H',	2, A_PoisonBagDamage	, &States[S_POISONCLOUD1+13]),
	S_NORMAL1(PSBG, 'H',	2, A_PoisonBagDamage	, &States[S_POISONCLOUD1+14]),
	S_NORMAL1(PSBG, 'H',	2, A_PoisonBagDamage	, &States[S_POISONCLOUD1+15]),
	S_NORMAL1(PSBG, 'I',	2, A_PoisonBagDamage	, &States[S_POISONCLOUD1+16]),
	S_NORMAL1(PSBG, 'I',	1, A_PoisonBagDamage	, &States[S_POISONCLOUD1+17]),
	S_NORMAL1(PSBG, 'I',	1, A_PoisonBagCheck	, &States[S_POISONCLOUD1+3]),

#define S_POISONCLOUD_X1 (S_POISONCLOUD1+18)
	S_NORMAL1(PSBG, 'H',	7, NULL			, &States[S_POISONCLOUD_X1+1]),
	S_NORMAL1(PSBG, 'G',	7, NULL			, &States[S_POISONCLOUD_X1+2]),
	S_NORMAL1(PSBG, 'F',	6, NULL			, &States[S_POISONCLOUD_X1+3]),
	S_NORMAL1(PSBG, 'D',	6, NULL			, NULL)
};

------------------------------------------------------------------------

//========== A generator that creates small, medium and large patches of fog.

IMPLEMENT_ACTOR (AFogSpawner, Hexen, 10000, 0)
	PROP_Flags (MF_NOSECTOR|MF_NOBLOCKMAP)
	PROP_Flags2 (MF2_FLOATBOB)
	PROP_RenderFlags (RF_INVISIBLE)
	PROP_SpawnState (S_SPAWNFOG1)
END_DEFAULTS

FState AFogSpawner::States[] =
{
#define S_SPAWNFOG1 0
	S_NORMAL1(MAN1, 'A',   20, A_FogSpaw, &States[S_SPAWNFOG1]),
};

------------------------------------------------------------------------

//========== A small patch of fog generated by a FogSpawner actor.

IMPLEMENT_ACTOR (AFogPatchSmall, Hexen, 10001, 0)
	PROP_SpeedFixed (1)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_NOCLIP|MF_FLOAT)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_RenderStyle (STYLE_Translucent)
	PROP_Alpha (HX_SHADOW)
	PROP_SpawnState (S_FOGPATCHS1)
	PROP_DeathState (S_FOGPATCHS0)
END_DEFAULTS

FState AFogPatchSmall::States[] =
{
#define S_FOGPATCHS1 0
	S_NORMAL1(FOGS, 'A',	7, A_FogMove, &States[S_FOGPATCHS1+1]),
	S_NORMAL1(FOGS, 'B',	7, A_FogMove, &States[S_FOGPATCHS1+2]),
	S_NORMAL1(FOGS, 'C',	7, A_FogMove, &States[S_FOGPATCHS1+3]),
	S_NORMAL1(FOGS, 'D',	7, A_FogMove, &States[S_FOGPATCHS1+4]),
	S_NORMAL1(FOGS, 'E',	7, A_FogMove, &States[S_FOGPATCHS1]),

#define S_FOGPATCHS0 (S_FOGPATCHS1+5)
	S_NORMAL1(FOGS, 'E',	5, NULL	    , NULL),
};

------------------------------------------------------------------------

//========== A medium-sized patch of fog generated by a FogSpawner actor.

IMPLEMENT_ACTOR (AFogPatchMedium, Hexen, 10002, 0)
	PROP_SpeedFixed (1)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_NOCLIP|MF_FLOAT)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_RenderStyle (STYLE_Translucent)
	PROP_Alpha (HX_SHADOW)
	PROP_SpawnState (S_FOGPATCHM1)
	PROP_DeathState (S_FOGPATCHM0)
END_DEFAULTS

FState AFogPatchMedium::States[] =
{
#define S_FOGPATCHM1 0
	S_NORMAL1(FOGM, 'A',	7, A_FogMove	, &States[S_FOGPATCHM1+1]),
	S_NORMAL1(FOGM, 'B',	7, A_FogMove	, &States[S_FOGPATCHM1+2]),
	S_NORMAL1(FOGM, 'C',	7, A_FogMove	, &States[S_FOGPATCHM1+3]),
	S_NORMAL1(FOGM, 'D',	7, A_FogMove	, &States[S_FOGPATCHM1+4]),
	S_NORMAL1(FOGM, 'E',	7, A_FogMove	, &States[S_FOGPATCHM1]),

#define S_FOGPATCHM0 (S_FOGPATCHM1+5)
	S_NORMAL1(FOGS, 'A',	5, NULL		, &States[S_FOGPATCHM0+1]),
	S_NORMAL1(FOGS, 'B',	5, NULL		, &States[S_FOGPATCHM0+2]),
	S_NORMAL1(FOGS, 'C',	5, NULL		, &States[S_FOGPATCHM0+3]),
	S_NORMAL1(FOGS, 'D',	5, NULL		, &States[S_FOGPATCHM0+4]),
	S_NORMAL1(FOGS, 'E',	5, NULL		, &AFogPatchSmall::States[S_FOGPATCHS0]),
};

------------------------------------------------------------------------

//========== A large patch of fog generated by a FogSpawner actor.

IMPLEMENT_ACTOR (AFogPatchLarge, Hexen, 10003, 0)
	PROP_SpeedFixed (1)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_NOCLIP|MF_FLOAT)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_RenderStyle (STYLE_Translucent)
	PROP_Alpha (HX_SHADOW)
	PROP_SpawnState (S_FOGPATCHL1)
	PROP_DeathState (S_FOGPATCHL0)
END_DEFAULTS

FState AFogPatchLarge::States[] =
{
#define S_FOGPATCHL1 0
	S_NORMAL1(FOGL, 'A',	7, A_FogMove	, &States[S_FOGPATCHL1+1]),
	S_NORMAL1(FOGL, 'B',	7, A_FogMove	, &States[S_FOGPATCHL1+2]),
	S_NORMAL1(FOGL, 'C',	7, A_FogMove	, &States[S_FOGPATCHL1+3]),
	S_NORMAL1(FOGL, 'D',	7, A_FogMove	, &States[S_FOGPATCHL1+4]),
	S_NORMAL1(FOGL, 'E',	7, A_FogMove	, &States[S_FOGPATCHL1]),

#define S_FOGPATCHL0 (S_FOGPATCHL1+5)
	S_NORMAL1(FOGM, 'A',	4, NULL		, &States[S_FOGPATCHL0+1]),
	S_NORMAL1(FOGM, 'B',	4, NULL		, &States[S_FOGPATCHL0+2]),
	S_NORMAL1(FOGM, 'C',	4, NULL		, &States[S_FOGPATCHL0+3]),
	S_NORMAL1(FOGM, 'D',	4, NULL		, &States[S_FOGPATCHL0+4]),
	S_NORMAL1(FOGM, 'E',	4, NULL		, &AFogPatchMedium::States[S_FOGPATCHM0]),
};

------------------------------------------------------------------------

//========== Mystic Ambit Incant artifact

IMPLEMENT_ACTOR (AArtiHealingRadius, Hexen, 10120, 0)
	PROP_Flags (MF_SPECIAL)
	PROP_Flags2 (MF2_FLOATBOB)
	PROP_SpawnState (0)
	PROP_PickupSound("misc/p_pkup")
END_DEFAULTS

FState AArtiHealingRadius::States[] =
{
	S_BRIGHT (HRAD, 'A',	4, NULL, &States[1]),
	S_BRIGHT (HRAD, 'B',	4, NULL, &States[2]),
	S_BRIGHT (HRAD, 'C',	4, NULL, &States[3]),
	S_BRIGHT (HRAD, 'D',	4, NULL, &States[4]),
	S_BRIGHT (HRAD, 'E',	4, NULL, &States[5]),
	S_BRIGHT (HRAD, 'F',	4, NULL, &States[6]),
	S_BRIGHT (HRAD, 'G',	4, NULL, &States[7]),
	S_BRIGHT (HRAD, 'H',	4, NULL, &States[8]),
	S_BRIGHT (HRAD, 'I',	4, NULL, &States[9]),
	S_BRIGHT (HRAD, 'J',	4, NULL, &States[10]),
	S_BRIGHT (HRAD, 'K',	4, NULL, &States[11]),
	S_BRIGHT (HRAD, 'L',	4, NULL, &States[12]),
	S_BRIGHT (HRAD, 'M',	4, NULL, &States[13]),
	S_BRIGHT (HRAD, 'N',	4, NULL, &States[14]),
	S_BRIGHT (HRAD, 'O',	4, NULL, &States[15]),
	S_BRIGHT (HRAD, 'P',	4, NULL, &States[0]),
};

------------------------------------------------------------------------

//========== The Heresiarch him/itself

IMPLEMENT_ACTOR (AHeresiarch, Hexen, 10080, 0)
	PROP_SpawnHealth (5000)
	PROP_PainChance (10)
	PROP_SpeedFixed (16)
	PROP_RadiusFixed (40)
	PROP_HeightFixed (110)
	PROP_Mass (500)
	PROP_Damage (9)
	PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_NOBLOOD|MF_COUNTKILL)
	PROP_Flags2 (MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_BOSS|MF2_PUSHWALL|MF2_MCROSS)
	PROP_Flags3 (MF3_DONTMORPH)
	PROP_Flags4 (MF4_NOICEDEATH)
	PROP_SpawnState (S_SORC_SPAWN1)
	PROP_SeeState (S_SORC_WALK1)
	PROP_PainState (S_SORC_PAIN1)
	PROP_MissileState (S_SORC_ATK2_1)
	PROP_DeathState (S_SORC_DIE1)
	PROP_SeeSound ("SorcererSight")
	PROP_PainSound ("SorcererPain")
	PROP_DeathSound ("SorcererDeathScream")
	PROP_ActiveSound ("SorcererActive")
END_DEFAULTS

FState AHeresiarch::States[] =
{
#define S_SORC_SPAWN1 0
	S_NORMAL1(SORC, 'A',	3, NULL			, &States[S_SORC_SPAWN1+1]),
	S_NORMAL1(SORC, 'A',	2, A_SorcSpinBalls	, &States[S_SORC_SPAWN1+2]),
	S_NORMAL1(SORC, 'A',   10, A_Look		, &States[S_SORC_SPAWN1+2]),

#define S_SORC_WALK1 (S_SORC_SPAWN1+3)
	S_NORMAL1(SORC, 'A',	5, A_Chase		, &States[S_SORC_WALK1+1]),
	S_NORMAL1(SORC, 'B',	5, A_Chase		, &States[S_SORC_WALK1+2]),
	S_NORMAL1(SORC, 'C',	5, A_Chase		, &States[S_SORC_WALK1+3]),
	S_NORMAL1(SORC, 'D',	5, A_Chase		, &States[S_SORC_WALK1]),

#define S_SORC_PAIN1 (S_SORC_WALK1+4)
	S_NORMAL1(SORC, 'G',	8, NULL			, &States[S_SORC_PAIN1+1]),
	S_NORMAL1(SORC, 'G',	8, A_Pain		, &States[S_SORC_WALK1]),

#define S_SORC_ATK2_1 (S_SORC_PAIN1+2)
	S_BRIGHT (SORC, 'F',	6, A_FaceTarget		, &States[S_SORC_ATK2_1+1]),
	S_BRIGHT (SORC, 'F',	6, A_SpeedBalls		, &States[S_SORC_ATK2_1+2]),
	S_BRIGHT (SORC, 'F',	6, A_FaceTarget		, &States[S_SORC_ATK2_1+2]),

#define S_SORC_ATTACK1 (S_SORC_ATK2_1+3)
	S_BRIGHT (SORC, 'E',	6, NULL			, &States[S_SORC_ATTACK1+1]),
	S_BRIGHT (SORC, 'E',	6, A_SpawnFizzle	, &States[S_SORC_ATTACK1+2]),
	S_BRIGHT (SORC, 'E',	5, A_FaceTarget		, &States[S_SORC_ATTACK1+1]),
	S_BRIGHT (SORC, 'E',	2, NULL			, &States[S_SORC_ATTACK1+4]),
	S_BRIGHT (SORC, 'E',	2, A_SorcBossAttack	, &States[S_SORC_WALK1]),

#define S_SORC_DIE1 (S_SORC_ATTACK1+5)
	S_BRIGHT (SORC, 'H',	5, NULL			, &States[S_SORC_DIE1+1]),
	S_BRIGHT (SORC, 'I',	5, A_FaceTarget		, &States[S_SORC_DIE1+2]),
	S_BRIGHT (SORC, 'J',	5, A_Scream		, &States[S_SORC_DIE1+3]),
	S_BRIGHT (SORC, 'K',	5, NULL			, &States[S_SORC_DIE1+4]),
	S_BRIGHT (SORC, 'L',	5, NULL			, &States[S_SORC_DIE1+5]),
	S_BRIGHT (SORC, 'M',	5, NULL			, &States[S_SORC_DIE1+6]),
	S_BRIGHT (SORC, 'N',	5, NULL			, &States[S_SORC_DIE1+7]),
	S_BRIGHT (SORC, 'O',	5, NULL			, &States[S_SORC_DIE1+8]),
	S_BRIGHT (SORC, 'P',	5, NULL			, &States[S_SORC_DIE1+9]),
	S_BRIGHT (SORC, 'Q',	5, NULL			, &States[S_SORC_DIE1+10]),
	S_BRIGHT (SORC, 'R',	5, NULL			, &States[S_SORC_DIE1+11]),
	S_BRIGHT (SORC, 'S',	5, NULL			, &States[S_SORC_DIE1+12]),
	S_BRIGHT (SORC, 'T',	5, NULL			, &States[S_SORC_DIE1+13]),
	S_BRIGHT (SORC, 'U',	5, A_NoBlocking		, &States[S_SORC_DIE1+14]),
	S_BRIGHT (SORC, 'V',	5, NULL			, &States[S_SORC_DIE1+15]),
	S_BRIGHT (SORC, 'W',	5, NULL			, &States[S_SORC_DIE1+16]),
	S_BRIGHT (SORC, 'X',	5, NULL			, &States[S_SORC_DIE1+17]),
	S_BRIGHT (SORC, 'Y',	5, NULL			, &States[S_SORC_DIE1+18]),
	S_BRIGHT (SORC, 'Z',   -1, NULL			, NULL),
};

------------------------------------------------------------------------

//========== Base class for the balls flying around the Heresiarch's head

IMPLEMENT_STATELESS_ACTOR (ASorcBall, Hexen, -1, 0)
	PROP_SpeedFixed (10)
	PROP_RadiusFixed (5)
	PROP_HeightFixed (5)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_MISSILE)
	PROP_Flags2 (MF2_HEXENBOUNCE|MF2_NOTELEPORT)
	PROP_Flags3 (MF3_FULLVOLDEATH|MF3_CANBOUNCEWATER|MF3_NOWALLBOUNCESND)
	PROP_SeeSound ("SorcererBallBounce")
	PROP_DeathSound ("SorcererBigBallExplode")
END_DEFAULTS

------------------------------------------------------------------------

//========== First ball flying around the Heresiarch's head (purple) - fires projectiles

IMPLEMENT_ACTOR (ASorcBall1, Hexen, -1, 0)
	PROP_SpawnState (S_SORCBALL1_1)
	PROP_PainState (S_SORCBALL1_D1)
	PROP_DeathState (S_SORCBALL1_D5)
END_DEFAULTS

FState ASorcBall1::States[] =
{
#define S_SORCBALL1_1 0
	S_NORMAL1(SBMP, 'A',	2, A_SorcBallOrbit	, &States[S_SORCBALL1_1+1]),
	S_NORMAL1(SBMP, 'B',	2, A_SorcBallOrbit	, &States[S_SORCBALL1_1+2]),
	S_NORMAL1(SBMP, 'C',	2, A_SorcBallOrbit	, &States[S_SORCBALL1_1+3]),
	S_NORMAL1(SBMP, 'D',	2, A_SorcBallOrbit	, &States[S_SORCBALL1_1+4]),
	S_NORMAL1(SBMP, 'E',	2, A_SorcBallOrbit	, &States[S_SORCBALL1_1+5]),
	S_NORMAL1(SBMP, 'F',	2, A_SorcBallOrbit	, &States[S_SORCBALL1_1+6]),
	S_NORMAL1(SBMP, 'G',	2, A_SorcBallOrbit	, &States[S_SORCBALL1_1+7]),
	S_NORMAL1(SBMP, 'H',	2, A_SorcBallOrbit	, &States[S_SORCBALL1_1+8]),
	S_NORMAL1(SBMP, 'I',	2, A_SorcBallOrbit	, &States[S_SORCBALL1_1+9]),
	S_NORMAL1(SBMP, 'J',	2, A_SorcBallOrbit	, &States[S_SORCBALL1_1+10]),
	S_NORMAL1(SBMP, 'K',	2, A_SorcBallOrbit	, &States[S_SORCBALL1_1+11]),
	S_NORMAL1(SBMP, 'L',	2, A_SorcBallOrbit	, &States[S_SORCBALL1_1+12]),
	S_NORMAL1(SBMP, 'M',	2, A_SorcBallOrbit	, &States[S_SORCBALL1_1+13]),
	S_NORMAL1(SBMP, 'N',	2, A_SorcBallOrbit	, &States[S_SORCBALL1_1+14]),
	S_NORMAL1(SBMP, 'O',	2, A_SorcBallOrbit	, &States[S_SORCBALL1_1+15]),
	S_NORMAL1(SBMP, 'P',	2, A_SorcBallOrbit	, &States[S_SORCBALL1_1]),

#define S_SORCBALL1_D1 (S_SORCBALL1_1+16)
	S_NORMAL1(SBMP, 'A',	5, A_SorcBallPop	, &States[S_SORCBALL1_D1+1]),
	S_NORMAL1(SBMP, 'B',	2, A_BounceCheck	, &States[S_SORCBALL1_D1+1]),

#define S_SORCBALL1_D5 (S_SORCBALL1_D1+2)
	S_NORMAL1(SBS4, 'D',	5, A_Explode		, &States[S_SORCBALL1_D5+1]),
	S_NORMAL1(SBS4, 'E',	5, NULL			, &States[S_SORCBALL1_D5+2]),
	S_NORMAL1(SBS4, 'F',	6, NULL			, &States[S_SORCBALL1_D5+3]),
	S_NORMAL1(SBS4, 'G',	6, NULL			, &States[S_SORCBALL1_D5+4]),
	S_NORMAL1(SBS4, 'H',	6, NULL			, NULL),
};

------------------------------------------------------------------------

//========== Second ball flying around the Heresiarch's head (blue) - generates the shield

IMPLEMENT_ACTOR (ASorcBall2, Hexen, -1, 0)
	PROP_SpawnState (S_SORCBALL2_1)
	PROP_PainState (S_SORCBALL2_D1)
	PROP_DeathState (S_SORCBALL2_D5)
END_DEFAULTS

FState ASorcBall2::States[] =
{
#define S_SORCBALL2_1 0
	S_NORMAL1(SBMB, 'A',	2, A_SorcBallOrbit	, &States[S_SORCBALL2_1+1]),
	S_NORMAL1(SBMB, 'B',	2, A_SorcBallOrbit	, &States[S_SORCBALL2_1+2]),
	S_NORMAL1(SBMB, 'C',	2, A_SorcBallOrbit	, &States[S_SORCBALL2_1+3]),
	S_NORMAL1(SBMB, 'D',	2, A_SorcBallOrbit	, &States[S_SORCBALL2_1+4]),
	S_NORMAL1(SBMB, 'E',	2, A_SorcBallOrbit	, &States[S_SORCBALL2_1+5]),
	S_NORMAL1(SBMB, 'F',	2, A_SorcBallOrbit	, &States[S_SORCBALL2_1+6]),
	S_NORMAL1(SBMB, 'G',	2, A_SorcBallOrbit	, &States[S_SORCBALL2_1+7]),
	S_NORMAL1(SBMB, 'H',	2, A_SorcBallOrbit	, &States[S_SORCBALL2_1+8]),
	S_NORMAL1(SBMB, 'I',	2, A_SorcBallOrbit	, &States[S_SORCBALL2_1+9]),
	S_NORMAL1(SBMB, 'J',	2, A_SorcBallOrbit	, &States[S_SORCBALL2_1+10]),
	S_NORMAL1(SBMB, 'K',	2, A_SorcBallOrbit	, &States[S_SORCBALL2_1+11]),
	S_NORMAL1(SBMB, 'L',	2, A_SorcBallOrbit	, &States[S_SORCBALL2_1+12]),
	S_NORMAL1(SBMB, 'M',	2, A_SorcBallOrbit	, &States[S_SORCBALL2_1+13]),
	S_NORMAL1(SBMB, 'N',	2, A_SorcBallOrbit	, &States[S_SORCBALL2_1+14]),
	S_NORMAL1(SBMB, 'O',	2, A_SorcBallOrbit	, &States[S_SORCBALL2_1+15]),
	S_NORMAL1(SBMB, 'P',	2, A_SorcBallOrbit	, &States[S_SORCBALL2_1]),

#define S_SORCBALL2_D1 (S_SORCBALL2_1+16)
	S_NORMAL1(SBMB, 'A',	5, A_SorcBallPop	, &States[S_SORCBALL2_D1+1]),
	S_NORMAL1(SBMB, 'B',	2, A_BounceCheck	, &States[S_SORCBALL2_D1+1]),

#define S_SORCBALL2_D5 (S_SORCBALL2_D1+2)
	S_NORMAL1(SBS3, 'D',	5, A_Explode		, &States[S_SORCBALL2_D5+1]),
	S_NORMAL1(SBS3, 'E',	5, NULL			, &States[S_SORCBALL2_D5+2]),
	S_NORMAL1(SBS3, 'F',	6, NULL			, &States[S_SORCBALL2_D5+3]),
	S_NORMAL1(SBS3, 'G',	6, NULL			, &States[S_SORCBALL2_D5+4]),
	S_NORMAL1(SBS3, 'H',	6, NULL			, NULL),
};

------------------------------------------------------------------------

//========== Third ball flying around the Heresiarch's head (green) - summons Bishops

IMPLEMENT_ACTOR (ASorcBall3, Hexen, -1, 0)
	PROP_SpawnState (S_SORCBALL3_1)
	PROP_PainState (S_SORCBALL3_D1)
	PROP_DeathState (S_SORCBALL3_D5)
END_DEFAULTS

FState ASorcBall3::States[] =
{
#define S_SORCBALL3_1 0
	S_NORMAL1(SBMG, 'A',	2, A_SorcBallOrbit	, &States[S_SORCBALL3_1+1]),
	S_NORMAL1(SBMG, 'B',	2, A_SorcBallOrbit	, &States[S_SORCBALL3_1+2]),
	S_NORMAL1(SBMG, 'C',	2, A_SorcBallOrbit	, &States[S_SORCBALL3_1+3]),
	S_NORMAL1(SBMG, 'D',	2, A_SorcBallOrbit	, &States[S_SORCBALL3_1+4]),
	S_NORMAL1(SBMG, 'E',	2, A_SorcBallOrbit	, &States[S_SORCBALL3_1+5]),
	S_NORMAL1(SBMG, 'F',	2, A_SorcBallOrbit	, &States[S_SORCBALL3_1+6]),
	S_NORMAL1(SBMG, 'G',	2, A_SorcBallOrbit	, &States[S_SORCBALL3_1+7]),
	S_NORMAL1(SBMG, 'H',	2, A_SorcBallOrbit	, &States[S_SORCBALL3_1+8]),
	S_NORMAL1(SBMG, 'I',	2, A_SorcBallOrbit	, &States[S_SORCBALL3_1+9]),
	S_NORMAL1(SBMG, 'J',	2, A_SorcBallOrbit	, &States[S_SORCBALL3_1+10]),
	S_NORMAL1(SBMG, 'K',	2, A_SorcBallOrbit	, &States[S_SORCBALL3_1+11]),
	S_NORMAL1(SBMG, 'L',	2, A_SorcBallOrbit	, &States[S_SORCBALL3_1+12]),
	S_NORMAL1(SBMG, 'M',	2, A_SorcBallOrbit	, &States[S_SORCBALL3_1+13]),
	S_NORMAL1(SBMG, 'N',	2, A_SorcBallOrbit	, &States[S_SORCBALL3_1+14]),
	S_NORMAL1(SBMG, 'O',	2, A_SorcBallOrbit	, &States[S_SORCBALL3_1+15]),
	S_NORMAL1(SBMG, 'P',	2, A_SorcBallOrbit	, &States[S_SORCBALL3_1]),

#define S_SORCBALL3_D1 (S_SORCBALL3_1+16)
	S_NORMAL1(SBMG, 'A',	5, A_SorcBallPop	, &States[S_SORCBALL3_D1+1]),
	S_NORMAL1(SBMG, 'B',	2, A_BounceCheck	, &States[S_SORCBALL3_D1+1]),

#define S_SORCBALL3_D5 (S_SORCBALL3_D1+2)
	S_NORMAL1(SBS3, 'D',	5, A_Explode		, &States[S_SORCBALL3_D5+1]),
	S_NORMAL1(SBS3, 'E',	5, NULL			, &States[S_SORCBALL3_D5+2]),
	S_NORMAL1(SBS3, 'F',	6, NULL			, &States[S_SORCBALL3_D5+3]),
	S_NORMAL1(SBS3, 'G',	6, NULL			, &States[S_SORCBALL3_D5+4]),
	S_NORMAL1(SBS3, 'H',	6, NULL			, NULL),
};

------------------------------------------------------------------------

//========== Sorcerer spell 1 (The burning, bouncing head thing)

IMPLEMENT_ACTOR (ASorcFX1, Hexen, -1, 0)
	PROP_SpeedFixed (7)
	PROP_RadiusFixed (5)
	PROP_HeightFixed (5)
	PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE)
	PROP_Flags2 (MF2_HEXENBOUNCE|MF2_NOTELEPORT)
	PROP_Flags3 (MF3_FULLVOLDEATH|MF3_CANBOUNCEWATER|MF3_NOWALLBOUNCESND)
	PROP_SpawnState (S_SORCFX1_1)
	PROP_DeathState (S_SORCFX1_D1)
	PROP_XDeathState (S_SORCFX1_D1)
	PROP_SeeSound ("SorcererBallBounce")
	PROP_DeathSound ("SorcererHeadScream")
END_DEFAULTS

FState ASorcFX1::States[] =
{
#define S_SORCFX1_1 0
	S_BRIGHT (SBS1, 'A',	2, NULL		, &States[S_SORCFX1_1+1]),
	S_BRIGHT (SBS1, 'B',	3, A_SorcFX1Seek, &States[S_SORCFX1_1+2]),
	S_BRIGHT (SBS1, 'C',	3, A_SorcFX1Seek, &States[S_SORCFX1_1+3]),
	S_BRIGHT (SBS1, 'D',	3, A_SorcFX1Seek, &States[S_SORCFX1_1]),

#define S_SORCFX1_D1 (S_SORCFX1_1+4)
	S_BRIGHT (FHFX, 'S',	2, A_Explode	, &States[S_SORCFX1_D1+1]),
	S_BRIGHT (FHFX, 'S',	6, NULL		, &States[S_SORCFX1_D1+2]),
	S_BRIGHT (FHFX, 'S',	6, NULL		, NULL),
};

------------------------------------------------------------------------

//========== Sorcerer spell 2 (The visible part of the shield)

IMPLEMENT_ACTOR (ASorcFX2, Hexen, -1, 0)
	PROP_SpeedFixed (15)
	PROP_RadiusFixed (5)
	PROP_HeightFixed (5)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_SpawnState (S_SORCFX2_SPLIT1)
	PROP_DeathState (S_SORCFX2T1)
END_DEFAULTS

FState ASorcFX2::States[] =
{
#define S_SORCFX2_SPLIT1 0
	S_BRIGHT (SBS2, 'A',	3, A_SorcFX2Split	, &States[S_SORCFX2_SPLIT1]),

#define S_SORCFX2T1 (S_SORCFX2_SPLIT1+1)
	S_NORMAL1(SBS2, 'A',   10, NULL			, NULL),

#define S_SORCFX2_ORBIT1 (S_SORCFX2T1+1)
	S_BRIGHT (SBS2, 'A',	2, A_SorcFX2Orbit	, &States[S_SORCFX2_ORBIT1+1]),
	S_BRIGHT (SBS2, 'B',	2, A_SorcFX2Orbit	, &States[S_SORCFX2_ORBIT1+2]),
	S_BRIGHT (SBS2, 'C',	2, A_SorcFX2Orbit	, &States[S_SORCFX2_ORBIT1+3]),
	S_BRIGHT (SBS2, 'D',	2, A_SorcFX2Orbit	, &States[S_SORCFX2_ORBIT1+4]),
	S_BRIGHT (SBS2, 'E',	2, A_SorcFX2Orbit	, &States[S_SORCFX2_ORBIT1+5]),
	S_BRIGHT (SBS2, 'F',	2, A_SorcFX2Orbit	, &States[S_SORCFX2_ORBIT1+6]),
	S_BRIGHT (SBS2, 'G',	2, A_SorcFX2Orbit	, &States[S_SORCFX2_ORBIT1+7]),
	S_BRIGHT (SBS2, 'H',	2, A_SorcFX2Orbit	, &States[S_SORCFX2_ORBIT1+8]),
	S_BRIGHT (SBS2, 'I',	2, A_SorcFX2Orbit	, &States[S_SORCFX2_ORBIT1+9]),
	S_BRIGHT (SBS2, 'J',	2, A_SorcFX2Orbit	, &States[S_SORCFX2_ORBIT1+10]),
	S_BRIGHT (SBS2, 'K',	2, A_SorcFX2Orbit	, &States[S_SORCFX2_ORBIT1+11]),
	S_BRIGHT (SBS2, 'L',	2, A_SorcFX2Orbit	, &States[S_SORCFX2_ORBIT1+12]),
	S_BRIGHT (SBS2, 'M',	2, A_SorcFX2Orbit	, &States[S_SORCFX2_ORBIT1+13]),
	S_BRIGHT (SBS2, 'N',	2, A_SorcFX2Orbit	, &States[S_SORCFX2_ORBIT1+14]),
	S_BRIGHT (SBS2, 'O',	2, A_SorcFX2Orbit	, &States[S_SORCFX2_ORBIT1+15]),
	S_BRIGHT (SBS2, 'P',	2, A_SorcFX2Orbit	, &States[S_SORCFX2_ORBIT1]),
};

------------------------------------------------------------------------

//========== The translucent trail behind SorcFX2

IMPLEMENT_STATELESS_ACTOR (ASorcFX2T1, Hexen, -1, 0)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_RenderStyle (STYLE_Translucent)
	PROP_Alpha (HX_ALTSHADOW)
	PROP_SpawnState (S_SORCFX2T1)
END_DEFAULTS

------------------------------------------------------------------------

//========== Sorcerer spell 3 (The Bishop spawner)

IMPLEMENT_ACTOR (ASorcFX3, Hexen, -1, 0)
	PROP_SpeedFixed (15)
	PROP_RadiusFixed (22)
	PROP_HeightFixed (65)
	PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_SpawnState (S_SORCFX3_1)
	PROP_DeathState (S_BISHMORPH1)
	PROP_SeeSound ("SorcererBishopSpawn")
END_DEFAULTS

FState ASorcFX3::States[] =
{
#define S_SORCFX3_1 0
	S_BRIGHT (SBS3, 'A',	2, NULL			, &States[S_SORCFX3_1+1]),
	S_BRIGHT (SBS3, 'B',	2, NULL			, &States[S_SORCFX3_1+2]),
	S_BRIGHT (SBS3, 'C',	2, NULL			, &States[S_SORCFX3_1]),

#define S_BISHMORPH1 (S_SORCFX3_1+3)
	S_BRIGHT (SBS3, 'A',	4, NULL			, &States[S_BISHMORPH1+1]),
	S_NORMAL1(BISH, 'P',	4, A_SorcererBishopEntry, &States[S_BISHMORPH1+2]),
	S_NORMAL1(BISH, 'O',	4, NULL			, &States[S_BISHMORPH1+3]),
	S_NORMAL1(BISH, 'N',	4, NULL			, &States[S_BISHMORPH1+4]),
	S_NORMAL1(BISH, 'M',	3, NULL			, &States[S_BISHMORPH1+5]),
	S_NORMAL1(BISH, 'L',	3, NULL			, &States[S_BISHMORPH1+6]),
	S_NORMAL1(BISH, 'K',	3, NULL			, &States[S_BISHMORPH1+7]),
	S_NORMAL1(BISH, 'J',	3, NULL			, &States[S_BISHMORPH1+8]),
	S_NORMAL1(BISH, 'I',	3, NULL			, &States[S_BISHMORPH1+9]),
	S_NORMAL1(BISH, 'H',	3, NULL			, &States[S_BISHMORPH1+10]),
	S_NORMAL1(BISH, 'G',	3, A_SpawnBishop	, NULL),
};

------------------------------------------------------------------------

//========== The Bishop spawner's explosion animation

IMPLEMENT_ACTOR (ASorcFX3Explosion, Hexen, -1, 0)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_RenderStyle (STYLE_Translucent)
	PROP_Alpha (HX_ALTSHADOW)
	PROP_SpawnState (S_SORCFX3_EXP1)
END_DEFAULTS

FState ASorcFX3Explosion::States[] =
{
#define S_SORCFX3_EXP1 0
	S_NORMAL1(SBS3, 'D',	3, NULL, &States[S_SORCFX3_EXP1+1]),
	S_NORMAL1(SBS3, 'E',	3, NULL, &States[S_SORCFX3_EXP1+2]),
	S_NORMAL1(SBS3, 'F',	3, NULL, &States[S_SORCFX3_EXP1+3]),
	S_NORMAL1(SBS3, 'G',	3, NULL, &States[S_SORCFX3_EXP1+4]),
	S_NORMAL1(SBS3, 'H',	3, NULL, NULL),
};

------------------------------------------------------------------------

//========== Sorcerer spell 4 (The purple projectile)

IMPLEMENT_ACTOR (ASorcFX4, Hexen, -1, 0)
	PROP_SpeedFixed (12)
	PROP_RadiusFixed (10)
	PROP_HeightFixed (10)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_MISSILE)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_RenderStyle (STYLE_Add)
	PROP_SpawnState (S_SORCFX4_1)
	PROP_DeathState (S_SORCFX4_D1)
	PROP_DeathSound ("SorcererBallExplode")
END_DEFAULTS

FState ASorcFX4::States[] =
{
#define S_SORCFX4_1 0
	S_BRIGHT (SBS4, 'A',	2, A_SorcFX4Check	, &States[S_SORCFX4_1+1]),
	S_BRIGHT (SBS4, 'B',	2, A_SorcFX4Check	, &States[S_SORCFX4_1+2]),
	S_BRIGHT (SBS4, 'C',	2, A_SorcFX4Check	, &States[S_SORCFX4_1]),

#define S_SORCFX4_D1 (S_SORCFX4_1+3)
	S_BRIGHT (SBS4, 'D',	2, NULL			, &States[S_SORCFX4_D1+1]),
	S_BRIGHT (SBS4, 'E',	2, A_Explode		, &States[S_SORCFX4_D1+2]),
	S_BRIGHT (SBS4, 'F',	2, NULL			, &States[S_SORCFX4_D1+3]),
	S_BRIGHT (SBS4, 'G',	2, NULL			, &States[S_SORCFX4_D1+4]),
	S_BRIGHT (SBS4, 'H',	2, NULL			, NULL),
};

------------------------------------------------------------------------

//========== Spark that appears when shooting SorcFX4

IMPLEMENT_ACTOR (ASorcSpark1, Hexen, -1, 0)
	PROP_RadiusFixed (5)
	PROP_HeightFixed (5)
	PROP_Flags (MF_NOBLOCKMAP|MF_DROPOFF)
	PROP_Flags2 (MF2_LOGRAV|MF2_NOTELEPORT)
	PROP_RenderStyle (STYLE_Add)
	PROP_SpawnState (S_SORCSPARK1)
END_DEFAULTS

FState ASorcSpark1::States[] =
{
#define S_SORCSPARK1 0
	S_BRIGHT (SBFX, 'A',	4, NULL, &States[S_SORCSPARK1+1]),
	S_BRIGHT (SBFX, 'B',	4, NULL, &States[S_SORCSPARK1+2]),
	S_BRIGHT (SBFX, 'C',	4, NULL, &States[S_SORCSPARK1+3]),
	S_BRIGHT (SBFX, 'D',	4, NULL, &States[S_SORCSPARK1+4]),
	S_BRIGHT (SBFX, 'E',	4, NULL, &States[S_SORCSPARK1+5]),
	S_BRIGHT (SBFX, 'F',	4, NULL, &States[S_SORCSPARK1+6]),
	S_BRIGHT (SBFX, 'G',	4, NULL, NULL),
};

------------------------------------------------------------------------

//========== Mesh Armor

IMPLEMENT_ACTOR (AMeshArmor, Hexen, 8005, 68)
	PROP_Flags (MF_SPECIAL|MF_NOGRAVITY)
	PROP_SpawnState (0)
END_DEFAULTS

FState AMeshArmor::States[] =
{
	S_NORMAL1 (ARM1, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Falcon Shield

IMPLEMENT_ACTOR (AFalconShield, Hexen, 8006, 69)
	PROP_Flags (MF_SPECIAL|MF_NOGRAVITY)
	PROP_SpawnState (0)
END_DEFAULTS

FState AFalconShield::States[] =
{
	S_NORMAL1 (ARM2, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Platinum Helmet

IMPLEMENT_ACTOR (APlatinumHelm, Hexen, 8007, 70)
	PROP_Flags (MF_SPECIAL|MF_NOGRAVITY)
	PROP_SpawnState (0)
END_DEFAULTS

FState APlatinumHelm::States[] =
{
	S_NORMAL1 (ARM3, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Amulet of Warding

IMPLEMENT_ACTOR (AAmuletOfWarding, Hexen, 8008, 71)
	PROP_Flags (MF_SPECIAL|MF_NOGRAVITY)
	PROP_SpawnState (0)
END_DEFAULTS

FState AAmuletOfWarding::States[] =
{
	S_NORMAL1 (ARM4, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Steel key

IMPLEMENT_ACTOR (AKeySteel, Hexen, 8030, 85)
	PROP_RadiusFixed (8)
	PROP_HeightFixed (20)
	PROP_Flags (MF_SPECIAL|MF_NOTDMATCH)
	PROP_SpawnState (0)
END_DEFAULTS

FState AKeySteel::States[] = { S_NORMAL1 (KEY1, 'A', -1, NULL, NULL) };

------------------------------------------------------------------------

//========== Cave key

IMPLEMENT_ACTOR (AKeyCave, Hexen, 8031, 86)
	PROP_RadiusFixed (8)
	PROP_HeightFixed (20)
	PROP_Flags (MF_SPECIAL|MF_NOTDMATCH)
	PROP_SpawnState (0)
END_DEFAULTS

FState AKeyCave::States[] = { S_NORMAL1 (KEY2, 'A', -1, NULL, NULL) };

------------------------------------------------------------------------

//========== Axe key

IMPLEMENT_ACTOR (AKeyAxe, Hexen, 8032, 87)
	PROP_RadiusFixed (8)
	PROP_HeightFixed (20)
	PROP_Flags (MF_SPECIAL|MF_NOTDMATCH)
	PROP_SpawnState (0)
END_DEFAULTS

FState AKeyAxe::States[] = { S_NORMAL1 (KEY3, 'A', -1, NULL, NULL) };

------------------------------------------------------------------------

//========== Fire key

IMPLEMENT_ACTOR (AKeyFire, Hexen, 8033, 88)
	PROP_RadiusFixed (8)
	PROP_HeightFixed (20)
	PROP_Flags (MF_SPECIAL|MF_NOTDMATCH)
	PROP_SpawnState (0)
END_DEFAULTS

FState AKeyFire::States[] = { S_NORMAL1 (KEY4, 'A', -1, NULL, NULL) };

------------------------------------------------------------------------

//========== Emerald key

IMPLEMENT_ACTOR (AKeyEmerald, Hexen, 8034, 89)
	PROP_RadiusFixed (8)
	PROP_HeightFixed (20)
	PROP_Flags (MF_SPECIAL|MF_NOTDMATCH)
	PROP_SpawnState (0)
END_DEFAULTS

FState AKeyEmerald::States[] = { S_NORMAL1 (KEY5, 'A', -1, NULL, NULL) };

------------------------------------------------------------------------

//========== Dungeon key

IMPLEMENT_ACTOR (AKeyDungeon, Hexen, 8035, 90)
	PROP_RadiusFixed (8)
	PROP_HeightFixed (20)
	PROP_Flags (MF_SPECIAL|MF_NOTDMATCH)
	PROP_SpawnState (0)
END_DEFAULTS

FState AKeyDungeon::States[] = { S_NORMAL1 (KEY6, 'A', -1, NULL, NULL) };

------------------------------------------------------------------------

//========== Silver key

IMPLEMENT_ACTOR (AKeySilver, Hexen, 8036, 91)
	PROP_RadiusFixed (8)
	PROP_HeightFixed (20)
	PROP_Flags (MF_SPECIAL|MF_NOTDMATCH)
	PROP_SpawnState (0)
END_DEFAULTS

FState AKeySilver::States[] = { S_NORMAL1 (KEY7, 'A', -1, NULL, NULL) };

------------------------------------------------------------------------

//========== Rusted key

IMPLEMENT_ACTOR (AKeyRusted, Hexen, 8037, 92)
	PROP_RadiusFixed (8)
	PROP_HeightFixed (20)
	PROP_Flags (MF_SPECIAL|MF_NOTDMATCH)
	PROP_SpawnState (0)
END_DEFAULTS

FState AKeyRusted::States[] = { S_NORMAL1 (KEY8, 'A', -1, NULL, NULL) };

------------------------------------------------------------------------

//========== Horn key

IMPLEMENT_ACTOR (AKeyHorn, Hexen, 8038, 93)
	PROP_RadiusFixed (8)
	PROP_HeightFixed (20)
	PROP_Flags (MF_SPECIAL|MF_NOTDMATCH)
	PROP_SpawnState (0)
END_DEFAULTS

FState AKeyHorn::States[] = { S_NORMAL1 (KEY9, 'A', -1, NULL, NULL) };

------------------------------------------------------------------------

//========== Swamp key

IMPLEMENT_ACTOR (AKeySwamp, Hexen, 8039, 94)
	PROP_RadiusFixed (8)
	PROP_HeightFixed (20)
	PROP_Flags (MF_SPECIAL|MF_NOTDMATCH)
	PROP_SpawnState (0)
END_DEFAULTS

FState AKeySwamp::States[] = { S_NORMAL1 (KEYA, 'A', -1, NULL, NULL) };

------------------------------------------------------------------------

//========== Castle key

IMPLEMENT_ACTOR (AKeyCastle, Hexen, 8200, 0)
	PROP_RadiusFixed (8)
	PROP_HeightFixed (20)
	PROP_Flags (MF_SPECIAL|MF_NOTDMATCH)
	PROP_SpawnState (0)
END_DEFAULTS

FState AKeyCastle::States[] = { S_NORMAL1 (KEYB, 'A', -1, NULL, NULL) };

------------------------------------------------------------------------

//========== Winged Statue (no skull)

IMPLEMENT_ACTOR (AZWingedStatueNoSkull, Hexen, 9011, 0)
	PROP_RadiusFixed (10)
	PROP_HeightFixed (62)
	PROP_Flags (MF_SOLID)
	PROP_SpawnState (0)
	PROP_SeeState (0)
	PROP_MeleeState (1)
END_DEFAULTS

FState AZWingedStatueNoSkull::States[] =
{
	S_NORMAL1 (STWN, 'A', -1, NULL, NULL),
	S_NORMAL1 (STWN, 'B', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Gem pedestal

IMPLEMENT_ACTOR (AZGemPedestal, Hexen, 9012, 0)
	PROP_RadiusFixed (10)
	PROP_HeightFixed (40)
	PROP_Flags (MF_SOLID)
	PROP_SpawnState (0)
	PROP_SeeState (0)
	PROP_MeleeState (1)
END_DEFAULTS

FState AZGemPedestal::States[] =
{
	S_NORMAL1 (GMPD, 'A', -1, NULL, NULL),
	S_NORMAL1 (GMPD, 'B', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Tree (destructible)

IMPLEMENT_ACTOR (ATreeDestructible, Hexen, 8062, 0)
	PROP_SpawnHealth (70)
	PROP_RadiusFixed (15)
	PROP_HeightFixed (180)
	PROP_MassLong (INT_MAX)
	PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_NOBLOOD)
	PROP_SpawnState (S_ZTREEDESTRUCTIBLE)
	PROP_DeathState (S_ZTREEDES_D)
	PROP_BDeathState (S_ZTREEDES_X)
	PROP_PainSound ("TreeExplode")
	PROP_DeathSound ("TreeBreak")
END_DEFAULTS

FState ATreeDestructible::States[] =
{
#define S_ZTREEDESTRUCTIBLE 0
	S_NORMAL1 (TRDT, 'A',   -1, NULL	, NULL),

#define S_ZTREEDES_D (S_ZTREEDESTRUCTIBLE+1)
	S_NORMAL1 (TRDT, 'B',    5, NULL	, &States[S_ZTREEDES_D+1]),
	S_NORMAL1 (TRDT, 'C',    5, A_Scream	, &States[S_ZTREEDES_D+2]),
	S_NORMAL1 (TRDT, 'D',    5, NULL	, &States[S_ZTREEDES_D+3]),
	S_NORMAL1 (TRDT, 'E',    5, NULL	, &States[S_ZTREEDES_D+4]),
	S_NORMAL1 (TRDT, 'F',    5, NULL	, &States[S_ZTREEDES_D+5]),
	S_NORMAL1 (TRDT, 'G',   -1, NULL	, NULL),

#define S_ZTREEDES_X (S_ZTREEDES_D+6)
	S_BRIGHT  (TRDT, 'H',    5, A_Pain	, &States[S_ZTREEDES_X+1]),
	S_BRIGHT  (TRDT, 'I',    5, NULL	, &States[S_ZTREEDES_X+2]),
	S_BRIGHT  (TRDT, 'J',    5, NULL	, &States[S_ZTREEDES_X+3]),
	S_BRIGHT  (TRDT, 'K',    5, NULL	, &States[S_ZTREEDES_X+4]),
	S_BRIGHT  (TRDT, 'L',    5, NULL	, &States[S_ZTREEDES_X+5]),
	S_BRIGHT  (TRDT, 'M',    5, A_Explode	, &States[S_ZTREEDES_X+6]),
	S_BRIGHT  (TRDT, 'N',    5, NULL	, &States[S_ZTREEDES_X+7]),
	S_NORMAL1 (TRDT, 'O',    5, NULL	, &States[S_ZTREEDES_X+8]),
	S_NORMAL1 (TRDT, 'P',    5, NULL	, &States[S_ZTREEDES_X+9]),
	S_NORMAL1 (TRDT, 'Q',   -1, NULL	, NULL)
};

------------------------------------------------------------------------

//========== A pottery that can be broken.

IMPLEMENT_ACTOR (APottery1, Hexen, 104, 0)
	PROP_SpawnHealth (15)
	PROP_RadiusFixed (10)
	PROP_HeightFixed (32)
	PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_NOBLOOD|MF_DROPOFF)
	PROP_Flags2 (MF2_SLIDE|MF2_PUSHABLE|MF2_TELESTOMP|MF2_PASSMOBJ)
	PROP_SpawnState (S_ZPOTTERY)
	PROP_DeathState (S_ZPOTTERY_EXPLODE)
END_DEFAULTS

FState APottery1::States[] =
{
#define S_ZPOTTERY 0
	S_NORMAL1 (POT1, 'A',   -1, NULL            , NULL),

#define S_ZPOTTERY_EXPLODE (S_ZPOTTERY+1)
	S_NORMAL1 (POT1, 'A',    0, A_PotteryExplode, NULL)
};

------------------------------------------------------------------------

//========== A pottery that can be broken.

IMPLEMENT_ACTOR (APottery2, Hexen, 105, 0)
	PROP_HeightFixed (25)
	PROP_SpawnState (0)
END_DEFAULTS

FState APottery2::States[] =
{
	S_NORMAL1 (POT2, 'A',   -1, NULL, NULL),
};

------------------------------------------------------------------------

//========== A pottery that can be broken.

IMPLEMENT_ACTOR (APottery3, Hexen, 106, 0)
	PROP_HeightFixed (25)
	PROP_SpawnState (0)
END_DEFAULTS

FState APottery3::States[] =
{
	S_NORMAL1 (POT3, 'A',   -1, NULL, NULL),
};

------------------------------------------------------------------------

//========== A shattered pottery piece spawned when a pottery is smashed.

IMPLEMENT_ACTOR (APotteryBit, Hexen, -1, 0)
	PROP_RadiusFixed (5)
	PROP_HeightFixed (5)
	PROP_Flags (MF_MISSILE)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_SpawnState (S_POTTERYBIT)
	PROP_DeathState (S_POTTERYBIT_EX0)
END_DEFAULTS

FState APotteryBit::States[] =
{
#define S_POTTERYBIT 0
	S_NORMAL1 (PBIT, 'A',   -1, NULL		, NULL),
	S_NORMAL1 (PBIT, 'B',   -1, NULL		, NULL),
	S_NORMAL1 (PBIT, 'C',   -1, NULL		, NULL),
	S_NORMAL1 (PBIT, 'D',   -1, NULL		, NULL),
	S_NORMAL1 (PBIT, 'E',   -1, NULL		, NULL),

#define S_POTTERYBIT_EX0 (S_POTTERYBIT+5)
	S_NORMAL1 (PBIT, 'F',    0, A_PotteryChooseBit	, NULL),

#define S_POTTERYBIT_EX1 (S_POTTERYBIT_EX0+1)
	S_NORMAL1 (PBIT, 'F',  140, NULL		, &States[S_POTTERYBIT_EX0+1]),
	S_NORMAL1 (PBIT, 'F',    1, A_PotteryCheck	, NULL),

#define S_POTTERYBIT_EX2 (S_POTTERYBIT_EX1+2)
	S_NORMAL1 (PBIT, 'G',  140, NULL		, &States[S_POTTERYBIT_EX1+1]),
	S_NORMAL1 (PBIT, 'G',    1, A_PotteryCheck	, NULL),

#define S_POTTERYBIT_EX3 (S_POTTERYBIT_EX2+2)
	S_NORMAL1 (PBIT, 'H',  140, NULL		, &States[S_POTTERYBIT_EX2+1]),
	S_NORMAL1 (PBIT, 'H',    1, A_PotteryCheck	, NULL),

#define S_POTTERYBIT_EX4 (S_POTTERYBIT_EX3+2)
	S_NORMAL1 (PBIT, 'I',  140, NULL		, &States[S_POTTERYBIT_EX3+1]),
	S_NORMAL1 (PBIT, 'I',    1, A_PotteryCheck	, NULL),

#define S_POTTERYBIT_EX5 (S_POTTERYBIT_EX4+2)
	S_NORMAL1 (PBIT, 'J',  140, NULL		, &States[S_POTTERYBIT_EX4+1]),
	S_NORMAL1 (PBIT, 'J',    1, A_PotteryCheck	, NULL)
};

------------------------------------------------------------------------

//========== Blood pool

IMPLEMENT_ACTOR (ABloodPool, Hexen, 111, 0)
	PROP_Flags (MF_NOBLOCKMAP)
	PROP_SpawnState (0)
END_DEFAULTS

FState ABloodPool::States[] =
{
	S_NORMAL1 (BDPL, 'A',   -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== An emaciated hanging corpse, its legs broken and its ribcage torn out.

IMPLEMENT_ACTOR (AZCorpseLynchedNoHeart, Hexen, 109, 0)
	PROP_RadiusFixed (10)
	PROP_HeightFixed (100)
	PROP_Flags (MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY)
	PROP_SpawnState (0)
END_DEFAULTS

FState AZCorpseLynchedNoHeart::States[] =
{
	S_NORMAL1 (CPS5, 'A',  140, A_CorpseBloodDrip, &States[0])
};

------------------------------------------------------------------------

//========== A blood droplet from a hanging corpse.

IMPLEMENT_ACTOR (ACorpseBloodDrip, Hexen, -1, 0)
	PROP_RadiusFixed (1)
	PROP_HeightFixed (4)
	PROP_Flags (MF_MISSILE)
	PROP_Flags2 (MF2_LOGRAV)
	PROP_SpawnState (S_CORPSEBLOODDRIP)
	PROP_DeathState (S_CORPSEBLOODDRIP_X)
END_DEFAULTS

FState ACorpseBloodDrip::States[] =
{
#define S_CORPSEBLOODDRIP 0
	S_NORMAL1 (BDRP, 'A',   -1, NULL, NULL),

#define S_CORPSEBLOODDRIP_X (S_CORPSEBLOODDRIP+1)
	S_NORMAL1 (BDSH, 'A',    3, NULL, &States[S_CORPSEBLOODDRIP_X+1]),
	S_NORMAL1 (BDSH, 'B',    3, NULL, &States[S_CORPSEBLOODDRIP_X+2]),
	S_NORMAL1 (BDSH, 'C',    2, NULL, &States[S_CORPSEBLOODDRIP_X+3]),
	S_NORMAL1 (BDSH, 'D',    2, NULL, NULL)
};

------------------------------------------------------------------------

//========== A container actor for four different bits of an exploded sitting corpse.

IMPLEMENT_ACTOR (ACorpseBit, Hexen, -1, 0)
	PROP_RadiusFixed (5)
	PROP_HeightFixed (5)
	PROP_Flags (MF_NOBLOCKMAP)
	PROP_Flags2 (MF2_TELESTOMP)
	PROP_SpawnState (0)
END_DEFAULTS

FState ACorpseBit::States[] =
{
	S_NORMAL1 (CPB1, 'A',   -1, NULL, NULL),
	S_NORMAL1 (CPB2, 'A',   -1, NULL, NULL),
	S_NORMAL1 (CPB3, 'A',   -1, NULL, NULL),
	S_NORMAL1 (CPB4, 'A',   -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Sitting corpse, splatterable

IMPLEMENT_ACTOR (AZCorpseSitting, Hexen, 110, 0)
	PROP_SpawnHealth (30)
	PROP_RadiusFixed (15)
	PROP_HeightFixed (35)
	PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_NOBLOOD)
	PROP_SpawnState (0)
	PROP_DeathState (1)
	PROP_DeathSound ("FireDemonDeath")
END_DEFAULTS

FState AZCorpseSitting::States[] =
{
	S_NORMAL1 (CPS6, 'A',   -1, NULL           , NULL),
	S_NORMAL1 (CPS6, 'A',    1, A_CorpseExplode, NULL)
};

------------------------------------------------------------------------

//========== Leaf spawner

IMPLEMENT_ACTOR (ALeafSpawner, Hexen, 113, 0)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOSECTOR)
	PROP_RenderFlags (RF_INVISIBLE)
	PROP_SpawnState (0)
END_DEFAULTS

FState ALeafSpawner::States[] =
{
	S_NORMAL1 (MAN1, 'A',   20, A_LeafSpawn, &States[0])
};

------------------------------------------------------------------------

//========== Leaf

IMPLEMENT_ACTOR (ALeaf1, Hexen, -1, 0)
	PROP_RadiusFixed (2)
	PROP_HeightFixed (4)
	PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE)
	PROP_Flags2 (MF2_NOTELEPORT|MF2_LOGRAV)
	PROP_Flags3 (MF3_DONTSPLASH)
	PROP_Flags4 (MF4_NONETSPAWN)
	PROP_SpawnState (S_LEAF1)
	PROP_DeathState (S_LEAF_X)
END_DEFAULTS

FState ALeaf1::States[] =
{
#define S_LEAF1 0
	S_NORMAL1 (LEF1, 'A',    4, NULL	, &States[S_LEAF1+1]),
	S_NORMAL1 (LEF1, 'B',    4, NULL	, &States[S_LEAF1+2]),
	S_NORMAL1 (LEF1, 'C',    4, NULL	, &States[S_LEAF1+3]),
	S_NORMAL1 (LEF1, 'D',    4, A_LeafThrust, &States[S_LEAF1+4]),
	S_NORMAL1 (LEF1, 'E',    4, NULL	, &States[S_LEAF1+5]),
	S_NORMAL1 (LEF1, 'F',    4, NULL	, &States[S_LEAF1+6]),
	S_NORMAL1 (LEF1, 'G',    4, NULL	, &States[S_LEAF1+7]),
	S_NORMAL1 (LEF1, 'H',    4, A_LeafThrust, &States[S_LEAF1+8]),
	S_NORMAL1 (LEF1, 'I',    4, NULL	, &States[S_LEAF1+9]),
	S_NORMAL1 (LEF1, 'A',    4, NULL	, &States[S_LEAF1+10]),
	S_NORMAL1 (LEF1, 'B',    4, NULL	, &States[S_LEAF1+11]),
	S_NORMAL1 (LEF1, 'C',    4, A_LeafThrust, &States[S_LEAF1+12]),
	S_NORMAL1 (LEF1, 'D',    4, NULL	, &States[S_LEAF1+13]),
	S_NORMAL1 (LEF1, 'E',    4, NULL	, &States[S_LEAF1+14]),
	S_NORMAL1 (LEF1, 'F',    4, NULL	, &States[S_LEAF1+15]),
	S_NORMAL1 (LEF1, 'G',    4, A_LeafThrust, &States[S_LEAF1+16]),
	S_NORMAL1 (LEF1, 'H',    4, NULL	, &States[S_LEAF1+17]),
	S_NORMAL1 (LEF1, 'I',    4, NULL	, NULL),

#define S_LEAF_X (S_LEAF1+18)
	S_NORMAL1 (LEF3, 'D',   10, A_LeafCheck	, &States[S_LEAF_X+0])
};

------------------------------------------------------------------------

//========== Leaf

IMPLEMENT_ACTOR (ALeaf2, Hexen, -1, 0)
	PROP_SpawnState (S_LEAF2)
END_DEFAULTS

FState ALeaf2::States[] =
{
#define S_LEAF2 0
	S_NORMAL1 (LEF2, 'A',    4, NULL	, &States[S_LEAF2+1]),
	S_NORMAL1 (LEF2, 'B',    4, NULL	, &States[S_LEAF2+2]),
	S_NORMAL1 (LEF2, 'C',    4, NULL	, &States[S_LEAF2+3]),
	S_NORMAL1 (LEF2, 'D',    4, A_LeafThrust, &States[S_LEAF2+4]),
	S_NORMAL1 (LEF2, 'E',    4, NULL	, &States[S_LEAF2+5]),
	S_NORMAL1 (LEF2, 'F',    4, NULL	, &States[S_LEAF2+6]),
	S_NORMAL1 (LEF2, 'G',    4, NULL	, &States[S_LEAF2+7]),
	S_NORMAL1 (LEF2, 'H',    4, A_LeafThrust, &States[S_LEAF2+8]),
	S_NORMAL1 (LEF2, 'I',    4, NULL	, &States[S_LEAF2+9]),
	S_NORMAL1 (LEF2, 'A',    4, NULL	, &States[S_LEAF2+10]),
	S_NORMAL1 (LEF2, 'B',    4, NULL	, &States[S_LEAF2+11]),
	S_NORMAL1 (LEF2, 'C',    4, A_LeafThrust, &States[S_LEAF2+12]),
	S_NORMAL1 (LEF2, 'D',    4, NULL	, &States[S_LEAF2+13]),
	S_NORMAL1 (LEF2, 'E',    4, NULL	, &States[S_LEAF2+14]),
	S_NORMAL1 (LEF2, 'F',    4, NULL	, &States[S_LEAF2+15]),
	S_NORMAL1 (LEF2, 'G',    4, A_LeafThrust, &States[S_LEAF2+16]),
	S_NORMAL1 (LEF2, 'H',    4, NULL	, &States[S_LEAF2+17]),
	S_NORMAL1 (LEF2, 'I',    4, NULL	, NULL)
};

------------------------------------------------------------------------

//========== Twined torch

IMPLEMENT_ACTOR (AZTwinedTorch, Hexen, 116, 0)
	PROP_RadiusFixed (10)
	PROP_HeightFixed (64)
	PROP_Flags (MF_SOLID)
	PROP_SpawnState (S_ZTWINEDTORCH)
	PROP_SeeState (S_ZTWINEDTORCH)
	PROP_MeleeState (S_ZTWINEDTORCH_UNLIT)
END_DEFAULTS

FState AZTwinedTorch::States[] =
{
#define S_ZTWINEDTORCH 0
	S_BRIGHT (TWTR, 'A',    4, NULL, &States[S_ZTWINEDTORCH+1]),
	S_BRIGHT (TWTR, 'B',    4, NULL, &States[S_ZTWINEDTORCH+2]),
	S_BRIGHT (TWTR, 'C',    4, NULL, &States[S_ZTWINEDTORCH+3]),
	S_BRIGHT (TWTR, 'D',    4, NULL, &States[S_ZTWINEDTORCH+4]),
	S_BRIGHT (TWTR, 'E',    4, NULL, &States[S_ZTWINEDTORCH+5]),
	S_BRIGHT (TWTR, 'F',    4, NULL, &States[S_ZTWINEDTORCH+6]),
	S_BRIGHT (TWTR, 'G',    4, NULL, &States[S_ZTWINEDTORCH+7]),
	S_BRIGHT (TWTR, 'H',    4, NULL, &States[S_ZTWINEDTORCH+0]),

#define S_ZTWINEDTORCH_UNLIT (S_ZTWINEDTORCH+8)
	S_NORMAL1(TWTR, 'I',   -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Twined torch unlit

IMPLEMENT_STATELESS_ACTOR (AZTwinedTorchUnlit, Hexen, 117, 0)
	PROP_SpawnState (S_ZTWINEDTORCH_UNLIT)
END_DEFAULTS

------------------------------------------------------------------------

//========== Wall torch

IMPLEMENT_ACTOR (AZWallTorch, Hexen, 54, 0)
	PROP_RadiusFixed (6)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
	PROP_Flags4 (MF4_FIXMAPTHINGPOS)
	PROP_SpawnState (S_ZWALLTORCH)
	PROP_SeeState (S_ZWALLTORCH)
	PROP_MeleeState (S_ZWALLTORCH_U)
END_DEFAULTS

FState AZWallTorch::States[] =
{
#define S_ZWALLTORCH 0
	S_BRIGHT (WLTR, 'A',    5, NULL, &States[S_ZWALLTORCH+1]),
	S_BRIGHT (WLTR, 'B',    5, NULL, &States[S_ZWALLTORCH+2]),
	S_BRIGHT (WLTR, 'C',    5, NULL, &States[S_ZWALLTORCH+3]),
	S_BRIGHT (WLTR, 'D',    5, NULL, &States[S_ZWALLTORCH+4]),
	S_BRIGHT (WLTR, 'E',    5, NULL, &States[S_ZWALLTORCH+5]),
	S_BRIGHT (WLTR, 'F',    5, NULL, &States[S_ZWALLTORCH+6]),
	S_BRIGHT (WLTR, 'G',    5, NULL, &States[S_ZWALLTORCH+7]),
	S_BRIGHT (WLTR, 'H',    5, NULL, &States[S_ZWALLTORCH+0]),

#define S_ZWALLTORCH_U (S_ZWALLTORCH+8)
	S_NORMAL1(WLTR, 'I',   -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Wall torch unlit

IMPLEMENT_STATELESS_ACTOR (AZWallTorchUnlit, Hexen, 55, 0)
	PROP_SpawnState (S_ZWALLTORCH_U)
END_DEFAULTS

------------------------------------------------------------------------

//========== Small shrub

IMPLEMENT_ACTOR (AZShrub1, Hexen, 8101, 0)
	PROP_RadiusFixed (8)
	PROP_HeightFixed (24)
	PROP_MassLong (FIXED_MAX)
	PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_NOBLOOD)
	PROP_SpawnState (S_ZSHRUB1)
	PROP_MeleeState (S_ZSHRUB1_X)
	PROP_DeathState (S_ZSHRUB1_DIE)
	PROP_DeathSound ("TreeExplode")
END_DEFAULTS

FState AZShrub1::States[] =
{
#define S_ZSHRUB1 0
	S_NORMAL1 (SHB1, 'A',   -1, NULL	, NULL),

#define S_ZSHRUB1_DIE (S_ZSHRUB1+1)
	S_NORMAL1 (SHB1, 'A',    1, A_TreeDeath	, &States[S_ZSHRUB1+0]),

#define S_ZSHRUB1_X (S_ZSHRUB1_DIE+1)
	S_BRIGHT (SHB1, 'B',    7, NULL		, &States[S_ZSHRUB1_X+1]),
	S_BRIGHT (SHB1, 'C',    6, A_Scream	, &States[S_ZSHRUB1_X+2]),
	S_BRIGHT (SHB1, 'D',    5, NULL		, NULL)
};

------------------------------------------------------------------------

//========== Large shrub

IMPLEMENT_ACTOR (AZShrub2, Hexen, 8102, 0)
	PROP_RadiusFixed (16)
	PROP_HeightFixed (40)
	PROP_MassLong (FIXED_MAX)
	PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_NOBLOOD)
	PROP_SpawnState (S_ZSHRUB2)
	PROP_MeleeState (S_ZSHRUB2_X)
	PROP_DeathState (S_ZSHRUB2_DIE)
	PROP_DeathSound ("TreeExplode")
END_DEFAULTS

FState AZShrub2::States[] =
{
#define S_ZSHRUB2 0
	S_NORMAL1 (SHB2, 'A',   -1, NULL	, NULL),

#define S_ZSHRUB2_DIE (S_ZSHRUB2+1)
	S_NORMAL1 (SHB2, 'A',    1, A_TreeDeath	, &States[S_ZSHRUB2+1]),

#define S_ZSHRUB2_X (S_ZSHRUB2_DIE+1)
	S_BRIGHT (SHB2, 'B',    7, NULL		, &States[S_ZSHRUB2_X+1]),
	S_BRIGHT (SHB2, 'C',    6, A_Scream	, &States[S_ZSHRUB2_X+2]),
	S_BRIGHT (SHB2, 'D',    5, A_Explode	, &States[S_ZSHRUB2_X+3]),
	S_BRIGHT (SHB2, 'E',    5, NULL		, NULL)
};

------------------------------------------------------------------------

//========== A type of mushroom that is poisonous; when destroyed, it releases a green poison cloud.

IMPLEMENT_ACTOR (AZPoisonShroom, Hexen, 8104, 0)
	PROP_RadiusFixed (6)
	PROP_HeightFixed (20)
	PROP_PainChance (255)
	PROP_Flags (MF_SHOOTABLE|MF_SOLID|MF_NOBLOOD)
	PROP_SpawnState (S_ZPOISONSHROOM)
	PROP_PainState (S_ZPOISONSHROOM_P)
	PROP_DeathState (S_ZPOISONSHROOM_X)
	PROP_PainSound ("PoisonShroomPain")
	PROP_DeathSound ("PoisonShroomDeath")
END_DEFAULTS

FState AZPoisonShroom::States[] =
{
#define S_ZPOISONSHROOM_P 0
	S_NORMAL1 (SHRM, 'A',    6, NULL             , &States[S_ZPOISONSHROOM_P+1]),
	S_NORMAL1 (SHRM, 'B',    8, A_Pain           , &States[S_ZPOISONSHROOM_P+2]),//<-- Intentional state

#define S_ZPOISONSHROOM (S_ZPOISONSHROOM_P+2)
	S_NORMAL1 (SHRM, 'A',    5, A_PoisonShroom   , &States[S_ZPOISONSHROOM_P+1]),

#define S_ZPOISONSHROOM_X (S_ZPOISONSHROOM+1)
	S_NORMAL1 (SHRM, 'C',    5, NULL             , &States[S_ZPOISONSHROOM_X+1]),
	S_NORMAL1 (SHRM, 'D',    5, NULL             , &States[S_ZPOISONSHROOM_X+2]),
	S_NORMAL1 (SHRM, 'E',    5, A_PoisonBagInit  , &States[S_ZPOISONSHROOM_X+3]),
	S_NORMAL1 (SHRM, 'F',   -1, NULL             , NULL)
};

------------------------------------------------------------------------

//========== Minotaur brazier

IMPLEMENT_ACTOR (AZFireBull, Hexen, 8042, 0)
	PROP_RadiusFixed (20)
	PROP_HeightFixed (80)
	PROP_Flags (MF_SOLID)
	PROP_SpawnState (S_ZFIREBULL)
	PROP_SeeState (S_ZFIREBULL_BIRTH)
	PROP_MeleeState (S_ZFIREBULL_U)
END_DEFAULTS

FState AZFireBull::States[] =
{
#define S_ZFIREBULL 0
	S_BRIGHT (FBUL, 'A',    4, NULL, &States[S_ZFIREBULL+1]),
	S_BRIGHT (FBUL, 'B',    4, NULL, &States[S_ZFIREBULL+2]),
	S_BRIGHT (FBUL, 'C',    4, NULL, &States[S_ZFIREBULL+3]),
	S_BRIGHT (FBUL, 'D',    4, NULL, &States[S_ZFIREBULL+4]),
	S_BRIGHT (FBUL, 'E',    4, NULL, &States[S_ZFIREBULL+5]),
	S_BRIGHT (FBUL, 'F',    4, NULL, &States[S_ZFIREBULL+6]),
	S_BRIGHT (FBUL, 'G',    4, NULL, &States[S_ZFIREBULL+0]),

#define S_ZFIREBULL_U (S_ZFIREBULL+7)
	S_NORMAL1(FBUL, 'H',   -1, NULL, NULL),

#define S_ZFIREBULL_DEATH (S_ZFIREBULL_U+1)
	S_BRIGHT (FBUL, 'J',    4, NULL, &States[S_ZFIREBULL_DEATH+1]),
	S_BRIGHT (FBUL, 'I',    4, NULL, &States[S_ZFIREBULL_U]),

#define S_ZFIREBULL_BIRTH (S_ZFIREBULL_DEATH+2)
	S_BRIGHT (FBUL, 'I',    4, NULL, &States[S_ZFIREBULL_BIRTH+1]),
	S_BRIGHT (FBUL, 'J',    4, NULL, &States[S_ZFIREBULL+0])
};

------------------------------------------------------------------------

//========== Minotaur brazier unlit

IMPLEMENT_STATELESS_ACTOR (AZFireBullUnlit, Hexen, 8043, 0)
	PROP_SpawnState (S_ZFIREBULL_U)
END_DEFAULTS

------------------------------------------------------------------------

//========== A knight's suit of armor on display. It can be smashed, causing it to spawn ZArmorChunk pieces upon its destruction as well as optionally containing a hidden item.

IMPLEMENT_ACTOR (AZSuitOfArmor, Hexen, 8064, 0)
	PROP_SpawnHealth (60)
	PROP_RadiusFixed (16)
	PROP_HeightFixed (72)
	PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_NOBLOOD)
	PROP_SpawnState (0)
	PROP_DeathState (1)
	PROP_DeathSound ("SuitofArmorBreak")
END_DEFAULTS

FState AZSuitOfArmor::States[] =
{
	S_NORMAL1 (SUIT, 'A',   -1, NULL	, NULL),
	S_NORMAL1 (SUIT, 'A',    1, A_SoAExplode, NULL)
};

------------------------------------------------------------------------

//========== An armor piece that is spawned when a suit of armor is smashed.

IMPLEMENT_ACTOR (AZArmorChunk, Hexen, -1, 0)
	PROP_RadiusFixed (4)
	PROP_HeightFixed (8)
	PROP_SpawnState (0)
END_DEFAULTS

FState AZArmorChunk::States[] =
{
	S_NORMAL1 (SUIT, 'B',   -1, NULL                     , NULL),
	S_NORMAL1 (SUIT, 'C',   -1, NULL                     , NULL),
	S_NORMAL1 (SUIT, 'D',   -1, NULL                     , NULL),
	S_NORMAL1 (SUIT, 'E',   -1, NULL                     , NULL),
	S_NORMAL1 (SUIT, 'F',   -1, NULL                     , NULL),
	S_NORMAL1 (SUIT, 'G',   -1, NULL                     , NULL),
	S_NORMAL1 (SUIT, 'H',   -1, NULL                     , NULL),
	S_NORMAL1 (SUIT, 'I',   -1, NULL                     , NULL),
	S_NORMAL1 (SUIT, 'J',   -1, NULL                     , NULL),
	S_NORMAL1 (SUIT, 'K',   -1, NULL                     , NULL)
};

------------------------------------------------------------------------

//========== Bell

IMPLEMENT_ACTOR (AZBell, Hexen, 8065, 0)
	PROP_SpawnHealth (5)
	PROP_RadiusFixed (56)
	PROP_HeightFixed (120)
	PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_NOBLOOD|MF_NOGRAVITY|MF_SPAWNCEILING)
	PROP_SpawnState (S_ZBELL)
	PROP_DeathState (S_ZBELL_X)
	PROP_DeathSound ("BellRing")
END_DEFAULTS

FState AZBell::States[] =
{
#define S_ZBELL 0
	S_NORMAL1 (BBLL, 'F',   -1, NULL                     , NULL),

#define S_ZBELL_X (S_ZBELL+1)
	S_NORMAL1 (BBLL, 'A',    4, A_BellReset1, &States[S_ZBELL_X+1]),
	S_NORMAL1 (BBLL, 'B',    4, NULL	, &States[S_ZBELL_X+2]),
	S_NORMAL1 (BBLL, 'C',    4, NULL	, &States[S_ZBELL_X+3]),
	S_NORMAL1 (BBLL, 'D',    5, A_Scream	, &States[S_ZBELL_X+4]),
	S_NORMAL1 (BBLL, 'C',    4, NULL	, &States[S_ZBELL_X+5]),
	S_NORMAL1 (BBLL, 'B',    4, NULL	, &States[S_ZBELL_X+6]),
	S_NORMAL1 (BBLL, 'A',    3, NULL	, &States[S_ZBELL_X+7]),
	S_NORMAL1 (BBLL, 'E',    4, NULL	, &States[S_ZBELL_X+8]),
	S_NORMAL1 (BBLL, 'F',    5, NULL	, &States[S_ZBELL_X+9]),
	S_NORMAL1 (BBLL, 'G',    6, A_Scream	, &States[S_ZBELL_X+10]),
	S_NORMAL1 (BBLL, 'F',    5, NULL	, &States[S_ZBELL_X+11]),
	S_NORMAL1 (BBLL, 'E',    4, NULL	, &States[S_ZBELL_X+12]),
	S_NORMAL1 (BBLL, 'A',    4, NULL	, &States[S_ZBELL_X+13]),
	S_NORMAL1 (BBLL, 'B',    5, NULL	, &States[S_ZBELL_X+14]),
	S_NORMAL1 (BBLL, 'C',    5, NULL	, &States[S_ZBELL_X+15]),
	S_NORMAL1 (BBLL, 'D',    6, A_Scream	, &States[S_ZBELL_X+16]),
	S_NORMAL1 (BBLL, 'C',    5, NULL	, &States[S_ZBELL_X+17]),
	S_NORMAL1 (BBLL, 'B',    5, NULL	, &States[S_ZBELL_X+18]),
	S_NORMAL1 (BBLL, 'A',    4, NULL	, &States[S_ZBELL_X+19]),
	S_NORMAL1 (BBLL, 'E',    5, NULL	, &States[S_ZBELL_X+20]),
	S_NORMAL1 (BBLL, 'F',    5, NULL	, &States[S_ZBELL_X+21]),
	S_NORMAL1 (BBLL, 'G',    7, A_Scream	, &States[S_ZBELL_X+22]),
	S_NORMAL1 (BBLL, 'F',    5, NULL	, &States[S_ZBELL_X+23]),
	S_NORMAL1 (BBLL, 'E',    5, NULL	, &States[S_ZBELL_X+24]),
	S_NORMAL1 (BBLL, 'A',    5, NULL	, &States[S_ZBELL_X+25]),
	S_NORMAL1 (BBLL, 'B',    6, NULL	, &States[S_ZBELL_X+26]),
	S_NORMAL1 (BBLL, 'C',    6, NULL	, &States[S_ZBELL_X+27]),
	S_NORMAL1 (BBLL, 'D',    7, A_Scream	, &States[S_ZBELL_X+28]),
	S_NORMAL1 (BBLL, 'C',    6, NULL	, &States[S_ZBELL_X+29]),
	S_NORMAL1 (BBLL, 'B',    6, NULL	, &States[S_ZBELL_X+30]),
	S_NORMAL1 (BBLL, 'A',    5, NULL	, &States[S_ZBELL_X+31]),
	S_NORMAL1 (BBLL, 'E',    6, NULL	, &States[S_ZBELL_X+32]),
	S_NORMAL1 (BBLL, 'F',    6, NULL	, &States[S_ZBELL_X+33]),
	S_NORMAL1 (BBLL, 'G',    7, A_Scream	, &States[S_ZBELL_X+34]),
	S_NORMAL1 (BBLL, 'F',    6, NULL	, &States[S_ZBELL_X+35]),
	S_NORMAL1 (BBLL, 'E',    6, NULL	, &States[S_ZBELL_X+36]),
	S_NORMAL1 (BBLL, 'A',    6, NULL	, &States[S_ZBELL_X+37]),
	S_NORMAL1 (BBLL, 'B',    6, NULL	, &States[S_ZBELL_X+38]),
	S_NORMAL1 (BBLL, 'C',    6, NULL	, &States[S_ZBELL_X+39]),
	S_NORMAL1 (BBLL, 'B',    7, NULL	, &States[S_ZBELL_X+40]),
	S_NORMAL1 (BBLL, 'A',    8, NULL	, &States[S_ZBELL_X+41]),
	S_NORMAL1 (BBLL, 'E',   12, NULL	, &States[S_ZBELL_X+42]),
	S_NORMAL1 (BBLL, 'A',   10, NULL	, &States[S_ZBELL_X+43]),
	S_NORMAL1 (BBLL, 'B',   12, NULL	, &States[S_ZBELL_X+44]),
	S_NORMAL1 (BBLL, 'A',   12, NULL	, &States[S_ZBELL_X+45]),
	S_NORMAL1 (BBLL, 'E',   14, NULL	, &States[S_ZBELL_X+46]),
	S_NORMAL1 (BBLL, 'A',    1, A_BellReset2, &States[S_ZBELL])
};

------------------------------------------------------------------------

//========== Spruce ("Christmas") Tree

IMPLEMENT_ACTOR (AZXmasTree, Hexen, 8068, 0)
	PROP_SpawnHealth (20)
	PROP_RadiusFixed (11)
	PROP_HeightFixed (130)
	PROP_MassLong (0x7fffffff)
	PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_NOBLOOD)
	PROP_Flags4 (MF4_NOICEDEATH)
	PROP_SpawnState (S_ZXMAS_TREE)
	PROP_MeleeState (S_ZXMAS_TREE_X)
	PROP_DeathState (S_ZXMAS_TREE_DIE)
	PROP_DeathSound ("TreeExplode")
END_DEFAULTS

FState AZXmasTree::States[] =
{
#define S_ZXMAS_TREE 0
	S_NORMAL1 (XMAS, 'A',   -1, NULL	, NULL),

#define S_ZXMAS_TREE_DIE (S_ZXMAS_TREE+1)
	S_NORMAL1 (XMAS, 'A',    4, A_TreeDeath	, &States[S_ZXMAS_TREE]),

#define S_ZXMAS_TREE_X (S_ZXMAS_TREE_DIE+1)
	S_BRIGHT  (XMAS, 'B',    6, NULL	, &States[S_ZXMAS_TREE_X+1]),
	S_BRIGHT  (XMAS, 'C',    6, A_Scream	, &States[S_ZXMAS_TREE_X+2]),
	S_BRIGHT  (XMAS, 'D',    5, NULL	, &States[S_ZXMAS_TREE_X+3]),
	S_BRIGHT  (XMAS, 'E',    5, A_Explode	, &States[S_ZXMAS_TREE_X+4]),
	S_BRIGHT  (XMAS, 'F',    5, NULL	, &States[S_ZXMAS_TREE_X+5]),
	S_BRIGHT  (XMAS, 'G',    4, NULL	, &States[S_ZXMAS_TREE_X+6]),
	S_NORMAL1 (XMAS, 'H',    5, NULL	, &States[S_ZXMAS_TREE_X+7]),
	S_NORMAL1 (XMAS, 'I',    4, A_NoBlocking, &States[S_ZXMAS_TREE_X+8]),
	S_NORMAL1 (XMAS, 'J',    4, NULL	, &States[S_ZXMAS_TREE_X+9]),
	S_NORMAL1 (XMAS, 'K',   -1, NULL	, NULL)
};

------------------------------------------------------------------------

//========== Cauldron

IMPLEMENT_ACTOR (AZCauldron, Hexen, 8069, 0)
	PROP_RadiusFixed (12)
	PROP_HeightFixed (26)
	PROP_Flags (MF_SOLID)
	PROP_SpawnState (S_ZCAULDRON)
	PROP_SeeState (S_ZCAULDRON)
	PROP_MeleeState (S_ZCAULDRON_U)
END_DEFAULTS

FState AZCauldron::States[] =
{
#define S_ZCAULDRON 0
	S_BRIGHT  (CDRN, 'B',    4, NULL, &States[S_ZCAULDRON+1]),
	S_BRIGHT  (CDRN, 'C',    4, NULL, &States[S_ZCAULDRON+2]),
	S_BRIGHT  (CDRN, 'D',    4, NULL, &States[S_ZCAULDRON+3]),
	S_BRIGHT  (CDRN, 'E',    4, NULL, &States[S_ZCAULDRON+4]),
	S_BRIGHT  (CDRN, 'F',    4, NULL, &States[S_ZCAULDRON+5]),
	S_BRIGHT  (CDRN, 'G',    4, NULL, &States[S_ZCAULDRON+6]),
	S_BRIGHT  (CDRN, 'H',    4, NULL, &States[S_ZCAULDRON+0]),

#define S_ZCAULDRON_U (S_ZCAULDRON+7)
	S_NORMAL1 (CDRN, 'A',   -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Cauldron unlit

IMPLEMENT_STATELESS_ACTOR (AZCauldronUnlit, Hexen, 8070, 0)
	PROP_SpawnState (S_ZCAULDRON_U)
END_DEFAULTS

------------------------------------------------------------------------

//========== Water drip

IMPLEMENT_ACTOR (AHWaterDrip, Hexen, -1, 95)
	PROP_Flags (MF_MISSILE)
	PROP_Flags2 (MF2_LOGRAV|MF2_NOTELEPORT)
	PROP_Mass (1)
	PROP_SpawnState (0)
	PROP_DeathSound ("Drip")
END_DEFAULTS

FState AHWaterDrip::States[] =
{
	S_NORMAL1 (HWAT, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== The wendigo, or ice golem, is a creature made of solid ice that is able to throw ice projectiles that upon impact explode into a volley of shards.

IMPLEMENT_ACTOR (AIceGuy, Hexen, 8020, 20)
	PROP_SpawnHealth (120)
	PROP_PainChance (144)
	PROP_SpeedFixed (14)
	PROP_RadiusFixed (22)
	PROP_HeightFixed (75)
	PROP_Mass (150)
	PROP_DamageType (MOD_ICE)
	PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_NOBLOOD|MF_COUNTKILL)
	PROP_Flags2 (MF2_PASSMOBJ|MF2_TELESTOMP|MF2_PUSHWALL|MF2_MCROSS)
	PROP_Flags4 (MF4_NOICEDEATH)
	PROP_SpawnState (S_ICEGUY_LOOK)
	PROP_SeeState (S_ICEGUY_WALK1)
	PROP_PainState (S_ICEGUY_PAIN1)
	PROP_MissileState (S_ICEGUY_ATK1)
	PROP_DeathState (S_ICEGUY_DEATH)
	PROP_SeeSound ("IceGuySight")
	PROP_AttackSound ("IceGuyAttack")
	PROP_ActiveSound ("IceGuyActive")
END_DEFAULTS

FState AIceGuy::States[] =
{
#define S_ICEGUY_LOOK 0
	S_NORMAL1 (ICEY, 'A',   10, A_IceGuyLook , &States[S_ICEGUY_LOOK]),

#define S_ICEGUY_WALK1 (S_ICEGUY_LOOK+1)
	S_NORMAL1 (ICEY, 'A',    4, A_Chase      , &States[S_ICEGUY_WALK1+1]),
	S_NORMAL1 (ICEY, 'B',    4, A_IceGuyChase, &States[S_ICEGUY_WALK1+2]),
	S_NORMAL1 (ICEY, 'C',    4, A_Chase      , &States[S_ICEGUY_WALK1+3]),
	S_NORMAL1 (ICEY, 'D',    4, A_Chase      , &States[S_ICEGUY_WALK1]),

#define S_ICEGUY_PAIN1 (S_ICEGUY_WALK1+4)
	S_NORMAL1 (ICEY, 'A',    1, A_Pain       , &States[S_ICEGUY_WALK1]),

#define S_ICEGUY_ATK1 (S_ICEGUY_PAIN1+1)
	S_NORMAL1 (ICEY, 'E',    3, A_FaceTarget , &States[S_ICEGUY_ATK1+1]),
	S_NORMAL1 (ICEY, 'F',    3, A_FaceTarget , &States[S_ICEGUY_ATK1+2]),
	S_BRIGHT (ICEY, 'G',    8, A_IceGuyAttack, &States[S_ICEGUY_ATK1+3]),
	S_NORMAL1 (ICEY, 'F',    4, A_FaceTarget , &States[S_ICEGUY_WALK1]),

#define S_ICEGUY_DEATH (S_ICEGUY_ATK1+4)
	S_NORMAL1 (ICEY, 'A',    1, A_IceGuyDie  , NULL),

#define S_ICEGUY_DORMANT (S_ICEGUY_DEATH+1)
	S_NORMAL1 (ICEY, 'A',   -1, NULL         , &States[S_ICEGUY_LOOK]),
};

------------------------------------------------------------------------

//========== The ice projectile fired by an ice golem; on impact, it bursts into eight damaging ice shards.

IMPLEMENT_ACTOR (AIceGuyFX, Hexen, -1, 0)
	PROP_SpeedFixed (14)
	PROP_RadiusFixed (8)
	PROP_HeightFixed (10)
	PROP_Damage (1)
	PROP_DamageType (MOD_ICE)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_Flags4 (MF4_BLOODSPLATTER)
	PROP_SpawnState (S_ICEGUY_FX1)
	PROP_DeathState (S_ICEGUY_FX_X1)
	PROP_DeathSound ("IceGuyMissileExplode")
END_DEFAULTS

FState AIceGuyFX::States[] =
{
#define S_ICEGUY_FX1 0
	S_BRIGHT (ICPR, 'A',    3, A_IceGuyMissilePuff   , &States[S_ICEGUY_FX1+1]),
	S_BRIGHT (ICPR, 'B',    3, A_IceGuyMissilePuff   , &States[S_ICEGUY_FX1+2]),
	S_BRIGHT (ICPR, 'C',    3, A_IceGuyMissilePuff   , &States[S_ICEGUY_FX1]),

#define S_ICEGUY_FX_X1 (S_ICEGUY_FX1+3)
	S_BRIGHT (ICPR, 'D',    4, NULL                  , &States[S_ICEGUY_FX_X1+1]),
	S_BRIGHT (ICPR, 'E',    4, A_IceGuyMissileExplode, &States[S_ICEGUY_FX_X1+2]),
	S_BRIGHT (ICPR, 'F',    4, NULL                  , &States[S_ICEGUY_FX_X1+3]),
	S_BRIGHT (ICPR, 'G',    4, NULL                  , &States[S_ICEGUY_FX_X1+4]),
	S_BRIGHT (ICPR, 'H',    3, NULL                  , NULL),
};


------------------------------------------------------------------------

//========== The trail spawned by the ice golem's projectile.

IMPLEMENT_ACTOR (AIceFXPuff, Hexen, -1, 0)
	PROP_RadiusFixed (1)
	PROP_HeightFixed (1)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_SHADOW)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_SpawnState (0)
END_DEFAULTS

FState AIceFXPuff::States[] =
{
	S_NORMAL1 (ICPR, 'I',    3, NULL, &States[1]),
	S_NORMAL1 (ICPR, 'J',    3, NULL, &States[2]),
	S_NORMAL1 (ICPR, 'K',    3, NULL, &States[3]),
	S_NORMAL1 (ICPR, 'L',    2, NULL, &States[4]),
	S_NORMAL1 (ICPR, 'M',    2, NULL, NULL),
};


------------------------------------------------------------------------

//========== One of eight ice shard projectiles bursting from the ice golem's projectile upon impact.

IMPLEMENT_ACTOR (AIceGuyFX2, Hexen, -1, 0)
	PROP_SpeedFixed (10)
	PROP_RadiusFixed (4)
	PROP_HeightFixed (4)
	PROP_Damage (1)
	PROP_DamageType (MOD_ICE)
	PROP_Flags (MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE)
	PROP_Flags2 (MF2_LOGRAV|MF2_NOTELEPORT)
	PROP_SpawnState (0)
END_DEFAULTS

FState AIceGuyFX2::States[] =
{
	S_BRIGHT (ICPR, 'N',    3, NULL, &States[1]),
	S_BRIGHT (ICPR, 'O',    3, NULL, &States[2]),
	S_BRIGHT (ICPR, 'P',    3, NULL, &States[0]),
};

------------------------------------------------------------------------

//========== The ice shards or pieces the ice golem bursts into when it dies.

IMPLEMENT_ACTOR (AIceGuyBit, Hexen, -1, 0)
	PROP_RadiusFixed (1)
	PROP_HeightFixed (1)
	PROP_Flags (MF_NOBLOCKMAP|MF_DROPOFF)
	PROP_Flags2 (MF2_LOGRAV|MF2_NOTELEPORT)
	PROP_SpawnState (0)
END_DEFAULTS

FState AIceGuyBit::States[] =
{
	S_BRIGHT (ICPR, 'Q',   50, NULL, NULL),
#define S_ICEGUY_BIT2 (1)
	S_BRIGHT (ICPR, 'R',   50, NULL, NULL),
};

------------------------------------------------------------------------

//========== Ice Guy Wisp 1

IMPLEMENT_ACTOR (AIceGuyWisp1, Hexen, -1, 0)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_RenderStyle (STYLE_Translucent)
	PROP_Alpha (HX_ALTSHADOW)
	PROP_SpawnState (0)
END_DEFAULTS

FState AIceGuyWisp1::States[] =
{
	S_NORMAL1 (ICWS, 'A',    2, NULL, &States[1]),
	S_NORMAL1 (ICWS, 'B',    2, NULL, &States[2]),
	S_NORMAL1 (ICWS, 'C',    2, NULL, &States[3]),
	S_NORMAL1 (ICWS, 'D',    2, NULL, &States[4]),
	S_NORMAL1 (ICWS, 'E',    2, NULL, &States[5]),
	S_NORMAL1 (ICWS, 'F',    2, NULL, &States[6]),
	S_NORMAL1 (ICWS, 'G',    2, NULL, &States[7]),
	S_NORMAL1 (ICWS, 'H',    2, NULL, &States[8]),
	S_NORMAL1 (ICWS, 'I',    2, NULL, NULL),
};

------------------------------------------------------------------------

//========== Ice Guy Wisp 2

IMPLEMENT_ACTOR (AIceGuyWisp2, Hexen, -1, 0)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_RenderStyle (STYLE_Translucent)
	PROP_Alpha (HX_ALTSHADOW)
	PROP_SpawnState (0)
END_DEFAULTS

FState AIceGuyWisp2::States[] =
{
	S_NORMAL1 (ICWS, 'J',    2, NULL, &States[1]),
	S_NORMAL1 (ICWS, 'K',    2, NULL, &States[2]),
	S_NORMAL1 (ICWS, 'L',    2, NULL, &States[3]),
	S_NORMAL1 (ICWS, 'M',    2, NULL, &States[4]),
	S_NORMAL1 (ICWS, 'N',    2, NULL, &States[5]),
	S_NORMAL1 (ICWS, 'O',    2, NULL, &States[6]),
	S_NORMAL1 (ICWS, 'P',    2, NULL, &States[7]),
	S_NORMAL1 (ICWS, 'Q',    2, NULL, &States[8]),
	S_NORMAL1 (ICWS, 'R',    2, NULL, NULL),
};

------------------------------------------------------------------------

//========== Korax is the second Serpent Rider and the final boss of Hexen.

IMPLEMENT_ACTOR (AKorax, Hexen, 10200, 0)
	PROP_SpawnHealth (5000)
	PROP_PainChance (20)
	PROP_SpeedFixed (10)
	PROP_RadiusFixed (65)
	PROP_HeightFixed (115)
	PROP_Mass (2000)
	PROP_Damage (15)
	PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL)
	PROP_Flags2 (MF2_FLOORCLIP|MF2_BOSS|MF2_TELESTOMP|MF2_PUSHWALL|MF2_MCROSS)
	PROP_Flags3 (MF3_DONTMORPH)
	PROP_Flags4 (MF4_NOICEDEATH)
	PROP_SpawnState (S_KORAX_LOOK1)
	PROP_SeeState (S_KORAX_CHASE2)
	PROP_PainState (S_KORAX_PAIN1)
	PROP_MissileState (S_KORAX_ATTACK1)
	PROP_DeathState (S_KORAX_DEATH1)
	PROP_SeeSound ("KoraxSight")
	PROP_AttackSound ("KoraxAttack")
	PROP_PainSound ("KoraxPain")
	PROP_DeathSound ("KoraxDeath")
	PROP_ActiveSound ("KoraxActive")
END_DEFAULTS

FState AKorax::States[] =
{
#define S_KORAX_LOOK1 0
	S_NORMAL1(KORX, 'A',	5, A_Look		, &States[S_KORAX_LOOK1]),

#define S_KORAX_CHASE2 (S_KORAX_LOOK1+1)
	S_NORMAL1(KORX, 'A',	3, A_KoraxChase		, &States[S_KORAX_CHASE2+1]),
	S_NORMAL1(KORX, 'A',	3, A_KoraxChase		, &States[S_KORAX_CHASE2+2]),
	S_NORMAL1(KORX, 'A',	3, A_KoraxChase		, &States[S_KORAX_CHASE2+3]),
	S_NORMAL1(KORX, 'B',	3, A_KoraxStep		, &States[S_KORAX_CHASE2+4]),
	S_NORMAL1(KORX, 'B',	3, A_KoraxChase		, &States[S_KORAX_CHASE2+5]),
	S_NORMAL1(KORX, 'B',	3, A_KoraxChase		, &States[S_KORAX_CHASE2+6]),
	S_NORMAL1(KORX, 'B',	3, A_KoraxChase		, &States[S_KORAX_CHASE2+7]),
	S_NORMAL1(KORX, 'C',	3, A_KoraxStep2		, &States[S_KORAX_CHASE2+8]),
	S_NORMAL1(KORX, 'C',	3, A_KoraxChase		, &States[S_KORAX_CHASE2+9]),
	S_NORMAL1(KORX, 'C',	3, A_KoraxChase		, &States[S_KORAX_CHASE2+10]),
	S_NORMAL1(KORX, 'C',	3, A_KoraxChase		, &States[S_KORAX_CHASE2+11]),
	S_NORMAL1(KORX, 'D',	3, A_KoraxStep		, &States[S_KORAX_CHASE2+12]),
	S_NORMAL1(KORX, 'D',	3, A_KoraxChase		, &States[S_KORAX_CHASE2+13]),
	S_NORMAL1(KORX, 'D',	3, A_KoraxChase		, &States[S_KORAX_CHASE2+14]),
	S_NORMAL1(KORX, 'D',	3, A_KoraxChase		, &States[S_KORAX_CHASE2+15]),
	S_NORMAL1(KORX, 'A',	3, A_KoraxStep2		, &States[S_KORAX_CHASE2]),

#define S_KORAX_PAIN1 (S_KORAX_CHASE2+16)
	S_NORMAL1(KORX, 'H',	5, A_Pain		, &States[S_KORAX_PAIN1+1]),
	S_NORMAL1(KORX, 'H',	5, NULL			, &States[S_KORAX_CHASE2]),

#define S_KORAX_ATTACK1 (S_KORAX_PAIN1+2)
	S_BRIGHT (KORX, 'E',	2, A_FaceTarget		, &States[S_KORAX_ATTACK1+1]),
	S_BRIGHT (KORX, 'E',	5, A_KoraxDecide	, &States[S_KORAX_ATTACK1+1]),

#define S_KORAX_DEATH1 (S_KORAX_ATTACK1+2)
	S_NORMAL1(KORX, 'I',	5, NULL			, &States[S_KORAX_DEATH1+1]),
	S_NORMAL1(KORX, 'J',	5, A_FaceTarget		, &States[S_KORAX_DEATH1+2]),
	S_NORMAL1(KORX, 'K',	5, A_Scream		, &States[S_KORAX_DEATH1+3]),
	S_NORMAL1(KORX, 'L',	5, NULL			, &States[S_KORAX_DEATH1+4]),
	S_NORMAL1(KORX, 'M',	5, NULL			, &States[S_KORAX_DEATH1+5]),
	S_NORMAL1(KORX, 'N',	5, NULL			, &States[S_KORAX_DEATH1+6]),
	S_NORMAL1(KORX, 'O',	5, NULL			, &States[S_KORAX_DEATH1+7]),
	S_NORMAL1(KORX, 'P',	5, NULL			, &States[S_KORAX_DEATH1+8]),
	S_NORMAL1(KORX, 'Q',   10, NULL			, &States[S_KORAX_DEATH1+9]),
	S_NORMAL1(KORX, 'R',	5, A_KoraxBonePop	, &States[S_KORAX_DEATH1+10]),
	S_NORMAL1(KORX, 'S',	5, A_NoBlocking		, &States[S_KORAX_DEATH1+11]),
	S_NORMAL1(KORX, 'T',	5, NULL			, &States[S_KORAX_DEATH1+12]),
	S_NORMAL1(KORX, 'U',	5, NULL			, &States[S_KORAX_DEATH1+13]),
	S_NORMAL1(KORX, 'V',   -1, NULL			, NULL),

#define S_KORAX_MISSILE1 (S_KORAX_DEATH1+14)
	S_BRIGHT (KORX, 'E',	4, A_FaceTarget		, &States[S_KORAX_MISSILE1+1]),
	S_BRIGHT (KORX, 'F',	8, A_KoraxMissile	, &States[S_KORAX_MISSILE1+2]),
	S_BRIGHT (KORX, 'E',	8, NULL			, &States[S_KORAX_CHASE2]),

#define S_KORAX_COMMAND1 (S_KORAX_MISSILE1+3)
	S_BRIGHT (KORX, 'E',	5, A_FaceTarget		, &States[S_KORAX_COMMAND1+1]),
	S_BRIGHT (KORX, 'W',   10, A_FaceTarget		, &States[S_KORAX_COMMAND1+2]),
	S_BRIGHT (KORX, 'G',   15, A_KoraxCommand	, &States[S_KORAX_COMMAND1+3]),
	S_BRIGHT (KORX, 'W',   10, NULL			, &States[S_KORAX_COMMAND1+4]),
	S_BRIGHT (KORX, 'E',	5, NULL			, &States[S_KORAX_CHASE2]),

};

------------------------------------------------------------------------

//========== Korax spirit: 6 of them get spawned upon Korax's death

IMPLEMENT_ACTOR (AKoraxSpirit, Hexen, -1, 0)
	PROP_SpeedFixed (8)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_NOCLIP|MF_MISSILE)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_RenderStyle (STYLE_Translucent)
	PROP_Alpha (HX_ALTSHADOW)
	PROP_SpawnState (0)
END_DEFAULTS

FState AKoraxSpirit::States[] =
{
	S_NORMAL1(SPIR, 'A',	5, A_KSpiritRoam, &States[1]),
	S_NORMAL1(SPIR, 'B',	5, A_KSpiritRoam, &States[0]),

#define S_KSPIRIT_DEATH (2)
	S_NORMAL1(SPIR, 'D',	5, NULL		, &States[S_KSPIRIT_DEATH+1]),
	S_NORMAL1(SPIR, 'E',	5, NULL		, &States[S_KSPIRIT_DEATH+2]),
	S_NORMAL1(SPIR, 'F',	5, NULL		, &States[S_KSPIRIT_DEATH+3]),
	S_NORMAL1(SPIR, 'G',	5, NULL		, &States[S_KSPIRIT_DEATH+4]),
	S_NORMAL1(SPIR, 'H',	5, NULL		, &States[S_KSPIRIT_DEATH+5]),
	S_NORMAL1(SPIR, 'I',	5, NULL		, NULL),
};

------------------------------------------------------------------------

//========== Korax command bolt: a special type of projectile that rises directly to the ceiling.

IMPLEMENT_ACTOR (AKoraxBolt, Hexen, -1, 0)
	PROP_RadiusFixed (15)
	PROP_HeightFixed (35)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_RenderStyle (STYLE_Add)
	PROP_SpawnState (S_KBOLT1)
END_DEFAULTS

FState AKoraxBolt::States[] =
{
#define S_KBOLT1 0
	S_BRIGHT (MLFX, 'I',	2, NULL		, &States[S_KBOLT1+1]),
	S_BRIGHT (MLFX, 'J',	2, A_KBoltRaise	, &States[S_KBOLT1+2]),
	S_BRIGHT (MLFX, 'I',	2, A_KBolt	, &States[S_KBOLT1+3]),
	S_BRIGHT (MLFX, 'J',	2, A_KBolt	, &States[S_KBOLT1+4]),
	S_BRIGHT (MLFX, 'K',	2, A_KBolt	, &States[S_KBOLT1+5]),
	S_BRIGHT (MLFX, 'L',	2, A_KBolt	, &States[S_KBOLT1+6]),
	S_BRIGHT (MLFX, 'M',	2, A_KBolt	, &States[S_KBOLT1+2]),
};

------------------------------------------------------------------------

//========== Menelkir is one of the three penultimate bosses of Hexen.

IMPLEMENT_ACTOR (AMageBoss, Hexen, 10102, 0)
	PROP_SpawnHealth (800)
	PROP_PainChance (50)
	PROP_SpeedFixed (25)
	PROP_RadiusFixed (16)
	PROP_HeightFixed (64)
	PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL)
	PROP_Flags2 (MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_TELESTOMP|MF2_PUSHWALL|MF2_MCROSS)
	PROP_Flags3 (MF3_DONTMORPH)
	PROP_SpawnState (S_MAGE)
	PROP_SeeState (S_MAGE_RUN1)
	PROP_PainState (S_MAGE_PAIN)
	PROP_MeleeState (S_MAGE_ATK1)
	PROP_MissileState (S_MAGE_ATK1)
	PROP_DeathState (S_MAGE_DIE1)
	PROP_XDeathState (S_MAGE_XDIE1)
	PROP_IDeathState (S_MAGE_ICE)
	PROP_BDeathState (S_MAGE_BURN)
	PROP_PainSound ("PlayerMagePain")
	PROP_DeathSound ("PlayerMageCrazyDeath")
END_DEFAULTS

FState AMageBoss::States[] =
{
#define S_MAGE 0
	S_NORMAL1 (MAGE, 'A',	2, NULL			, &States[S_MAGE+1]),
	S_NORMAL1 (MAGE, 'A',	3, A_ClassBossHealth	, &States[S_MAGE+2]),
	S_NORMAL1 (MAGE, 'A',	5, A_Look		, &States[S_MAGE+2]),

#define S_MAGE_RUN1 (S_MAGE+3)
	S_NORMAL1 (MAGE, 'A',	4, A_FastChase		, &States[S_MAGE_RUN1+1]),
	S_NORMAL1 (MAGE, 'B',	4, A_FastChase		, &States[S_MAGE_RUN1+2]),
	S_NORMAL1 (MAGE, 'C',	4, A_FastChase		, &States[S_MAGE_RUN1+3]),
	S_NORMAL1 (MAGE, 'D',	4, A_FastChase		, &States[S_MAGE_RUN1]),

#define S_MAGE_PAIN (S_MAGE_RUN1+4)
	S_NORMAL1 (MAGE, 'G',	4, NULL			, &States[S_MAGE_PAIN+1]),
	S_NORMAL1 (MAGE, 'G',	4, A_Pain		, &States[S_MAGE_RUN1]),

#define S_MAGE_ATK1 (S_MAGE_PAIN+2)
	S_NORMAL1 (MAGE, 'E',	8, A_FaceTarget		, &States[S_MAGE_ATK1+1]),
	S_BRIGHT  (MAGE, 'F',	8, A_MageAttack		, &States[S_MAGE_RUN1]),

#define S_MAGE_DIE1 (S_MAGE_ATK1+2)
	S_NORMAL1 (MAGE, 'H',	6, NULL			, &States[S_MAGE_DIE1+1]),
	S_NORMAL1 (MAGE, 'I',	6, A_Scream		, &States[S_MAGE_DIE1+2]),
	S_NORMAL1 (MAGE, 'J',	6, NULL			, &States[S_MAGE_DIE1+3]),
	S_NORMAL1 (MAGE, 'K',	6, NULL			, &States[S_MAGE_DIE1+4]),
	S_NORMAL1 (MAGE, 'L',	6, A_NoBlocking		, &States[S_MAGE_DIE1+5]),
	S_NORMAL1 (MAGE, 'M',	6, NULL			, &States[S_MAGE_DIE1+6]),
	S_NORMAL1 (MAGE, 'N',   -1, NULL		, NULL),

#define S_MAGE_XDIE1 (S_MAGE_DIE1+7)
	S_NORMAL1 (MAGE, 'O',	5, A_Scream		, &States[S_MAGE_XDIE1+1]),
	S_NORMAL1 (MAGE, 'P',	5, NULL			, &States[S_MAGE_XDIE1+2]),
	S_NORMAL1 (MAGE, 'R',	5, A_NoBlocking		, &States[S_MAGE_XDIE1+3]),
	S_NORMAL1 (MAGE, 'S',	5, NULL			, &States[S_MAGE_XDIE1+4]),
	S_NORMAL1 (MAGE, 'T',	5, NULL			, &States[S_MAGE_XDIE1+5]),
	S_NORMAL1 (MAGE, 'U',	5, NULL			, &States[S_MAGE_XDIE1+6]),
	S_NORMAL1 (MAGE, 'V',	5, NULL			, &States[S_MAGE_XDIE1+7]),
	S_NORMAL1 (MAGE, 'W',	5, NULL			, &States[S_MAGE_XDIE1+8]),
	S_NORMAL1 (MAGE, 'X',   -1, NULL		, NULL),

#define S_MAGE_ICE (S_MAGE_XDIE1+9)
	S_NORMAL1 (MAGE, 'Y',	5, A_FreezeDeath	, &States[S_MAGE_ICE+1]),
	S_NORMAL1 (MAGE, 'Y',	1, A_FreezeDeathChunks	, &States[S_MAGE_ICE+1]),

#define S_MAGE_BURN (S_MAGE_ICE+2)
	S_BRIGHT (FDTH, 'E',	5, A_MageBurnScream	, &States[S_MAGE_BURN+1]),
	S_BRIGHT (FDTH, 'F',	4, NULL			, &States[S_MAGE_BURN+2]),
	S_BRIGHT (FDTH, 'G',	5, NULL			, &States[S_MAGE_BURN+3]),
	S_BRIGHT (FDTH, 'H',	4, A_Scream		, &States[S_MAGE_BURN+4]),
	S_BRIGHT (FDTH, 'I',	5, NULL			, &States[S_MAGE_BURN+5]),
	S_BRIGHT (FDTH, 'J',	4, NULL			, &States[S_MAGE_BURN+6]),
	S_BRIGHT (FDTH, 'K',	5, NULL			, &States[S_MAGE_BURN+7]),
	S_BRIGHT (FDTH, 'L',	4, NULL			, &States[S_MAGE_BURN+8]),
	S_BRIGHT (FDTH, 'M',	5, NULL			, &States[S_MAGE_BURN+9]),
	S_BRIGHT (FDTH, 'N',	4, NULL			, &States[S_MAGE_BURN+10]),
	S_BRIGHT (FDTH, 'O',	5, NULL			, &States[S_MAGE_BURN+11]),
	S_BRIGHT (FDTH, 'P',	4, NULL			, &States[S_MAGE_BURN+12]),
	S_BRIGHT (FDTH, 'Q',	5, NULL			, &States[S_MAGE_BURN+13]),
	S_BRIGHT (FDTH, 'R',	4, NULL			, &States[S_MAGE_BURN+14]),
	S_BRIGHT (FDTH, 'S',	5, A_NoBlocking		, &States[S_MAGE_BURN+15]),
	S_BRIGHT (FDTH, 'T',	4, NULL			, &States[S_MAGE_BURN+16]),
	S_BRIGHT (FDTH, 'U',	5, NULL			, &States[S_MAGE_BURN+17]),
	S_BRIGHT (FDTH, 'V',	4, NULL			, &States[S_MAGE_BURN+18]),
	S_NORMAL1(ACLO, 'E',   35, A_CheckBurnGone	, &States[S_MAGE_BURN+18]),
	S_NORMAL1(ACLO, 'E',	8, NULL			, NULL),

};

------------------------------------------------------------------------

//========== The Mage's Frost Cone (2nd weapon)

IMPLEMENT_ACTOR (AMWeapFrost, Hexen, 53, 36)
	PROP_Flags (MF_SPECIAL)
	PROP_SpawnState (S_COS1)
END_DEFAULTS

FState AMWeapFrost::States[] =
{
#define S_COS1 0
	S_BRIGHT (WMCS, 'A',	8, NULL			, &States[S_COS1+1]),
	S_BRIGHT (WMCS, 'B',	8, NULL			, &States[S_COS1+2]),
	S_BRIGHT (WMCS, 'C',	8, NULL			, &States[S_COS1]),

#define S_CONEREADY (S_COS1+3)
	S_NORMAL1(CONE, 'A',	1, A_WeaponReady	, &States[S_CONEREADY]),

#define S_CONEDOWN (S_CONEREADY+1)
	S_NORMAL1(CONE, 'A',	1, A_Lower		, &States[S_CONEDOWN]),

#define S_CONEUP (S_CONEDOWN+1)
	S_NORMAL1(CONE, 'A',	1, A_Raise		, &States[S_CONEUP]),

#define S_CONEATK (S_CONEUP+1)
	S_NORMAL1(CONE, 'B',	3, NULL			, &States[S_CONEATK+1]),
	S_NORMAL1(CONE, 'C',	4, NULL			, &States[S_CONEATK+2]),
	S_NORMAL1(CONE, 'D',	3, NULL			, &States[S_CONEATK+3]),
	S_NORMAL1(CONE, 'E',	5, NULL			, &States[S_CONEATK+4]),
	S_NORMAL1(CONE, 'F',	3, A_FireConePL1	, &States[S_CONEATK+5]),
	S_NORMAL1(CONE, 'G',	3, NULL			, &States[S_CONEATK+6]),
	S_NORMAL1(CONE, 'A',	9, NULL			, &States[S_CONEATK+7]),
	S_NORMAL1(CONE, 'A',   10, A_ReFire		, &States[S_CONEREADY]),
};

FWeaponInfo AMWeapFrost::WeaponInfo =
{
	0,				// DWORD           flags;
	MANA_1,				// ammotype_t      ammo;
	3,				// int             ammouse;
	25,				// int             ammogive;
	&States[S_CONEUP],		// FState          *upstate;
	&States[S_CONEDOWN],		// FState          *downstate;
	&States[S_CONEREADY],		// FState          *readystate;
	&States[S_CONEATK],		// FState          *atkstate;
	&States[S_CONEATK+2],		// FState          *holdatkstate;
	NULL,				// FState          *flashstate;
	NULL,				// const TypeInfo  *droptype;
	150,				// int             kickback;
	18*FRACUNIT,			// fixed_t         yadjust;
	NULL,				// const char      *upsound;
	NULL,				// const char      *readysound;
	ZDRUNTIME_CLASS(AMWeapFrost),	// TypeInfo        *type;      // type of actor that represents this weapon
	-1				// int             minammo;    // minimum ammo needed to switch to this weapon
};

------------------------------------------------------------------------

//========== Frost shard

IMPLEMENT_ACTOR (AFrostMissile, Hexen, -1, 0)
	PROP_SpeedFixed (25)
	PROP_RadiusFixed (13)
	PROP_HeightFixed (8)
	PROP_Damage (1)
	PROP_DamageType (MOD_ICE)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
	PROP_Flags2 (MF2_NOTELEPORT|MF2_IMPACT|MF2_PCROSS)
	PROP_SpawnState (0)
	PROP_DeathState (S_SHARDFXE1_1)
	PROP_DeathSound ("MageShardsExplode")
END_DEFAULTS

FState AFrostMissile::States[] =
{
	S_BRIGHT (SHRD, 'A',	2, NULL		, &States[1]),
	S_BRIGHT (SHRD, 'A',	3, A_ShedShard	, &States[2]),
	S_BRIGHT (SHRD, 'B',	3, NULL		, &States[3]),
	S_BRIGHT (SHRD, 'C',	3, NULL		, &States[0]),

#define S_SHARDFXE1_1 (4)
	S_BRIGHT (SHEX, 'A',	5, NULL		, &States[S_SHARDFXE1_1+1]),
	S_BRIGHT (SHEX, 'B',	5, NULL		, &States[S_SHARDFXE1_1+2]),
	S_BRIGHT (SHEX, 'C',	5, NULL		, &States[S_SHARDFXE1_1+3]),
	S_BRIGHT (SHEX, 'D',	5, NULL		, &States[S_SHARDFXE1_1+4]),
	S_BRIGHT (SHEX, 'E',	5, NULL		, NULL),
};

------------------------------------------------------------------------

//========== Ice Shard

IMPLEMENT_ACTOR (AIceShard, Hexen, -1, 65)
	PROP_DamageType (MOD_ICE)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_SpawnState (0)
END_DEFAULTS

FState AIceShard::States[] =
{
	S_BRIGHT (SHRD, 'A',	3, NULL, &States[1]),
	S_BRIGHT (SHRD, 'B',	3, NULL, &States[2]),
	S_BRIGHT (SHRD, 'C',	3, NULL, &States[0]),
};

------------------------------------------------------------------------

//========== The Mage's Lightning Arc of Death

IMPLEMENT_ACTOR (AMWeapLightning, Hexen, 8040, 0)
	PROP_Flags (MF_SPECIAL|MF_NOGRAVITY)
	PROP_SpawnState (S_MW_LIGHTNING1)
END_DEFAULTS

FState AMWeapLightning::States[] =
{
#define S_MW_LIGHTNING1 0
	S_BRIGHT (WMLG, 'A',	4, NULL			, &States[S_MW_LIGHTNING1+1]),
	S_BRIGHT (WMLG, 'B',	4, NULL			, &States[S_MW_LIGHTNING1+2]),
	S_BRIGHT (WMLG, 'C',	4, NULL			, &States[S_MW_LIGHTNING1+3]),
	S_BRIGHT (WMLG, 'D',	4, NULL			, &States[S_MW_LIGHTNING1+4]),
	S_BRIGHT (WMLG, 'E',	4, NULL			, &States[S_MW_LIGHTNING1+5]),
	S_BRIGHT (WMLG, 'F',	4, NULL			, &States[S_MW_LIGHTNING1+6]),
	S_BRIGHT (WMLG, 'G',	4, NULL			, &States[S_MW_LIGHTNING1+7]),
	S_BRIGHT (WMLG, 'H',	4, NULL			, &States[S_MW_LIGHTNING1]),

#define S_MLIGHTNINGREADY (S_MW_LIGHTNING1+8)
	S_BRIGHT (MLNG, 'A',	1, A_WeaponReady	, &States[S_MLIGHTNINGREADY+1]),
	S_BRIGHT (MLNG, 'A',	1, A_WeaponReady	, &States[S_MLIGHTNINGREADY+2]),
	S_BRIGHT (MLNG, 'A',	1, A_WeaponReady	, &States[S_MLIGHTNINGREADY+3]),
	S_BRIGHT (MLNG, 'A',	1, A_WeaponReady	, &States[S_MLIGHTNINGREADY+4]),
	S_BRIGHT (MLNG, 'A',	1, A_WeaponReady	, &States[S_MLIGHTNINGREADY+5]),
	S_BRIGHT (MLNG, 'A',	1, A_LightningReady	, &States[S_MLIGHTNINGREADY+6]),
	S_BRIGHT (MLNG, 'B',	1, A_WeaponReady	, &States[S_MLIGHTNINGREADY+7]),
	S_BRIGHT (MLNG, 'B',	1, A_WeaponReady	, &States[S_MLIGHTNINGREADY+8]),
	S_BRIGHT (MLNG, 'B',	1, A_WeaponReady	, &States[S_MLIGHTNINGREADY+9]),
	S_BRIGHT (MLNG, 'B',	1, A_WeaponReady	, &States[S_MLIGHTNINGREADY+10]),
	S_BRIGHT (MLNG, 'B',	1, A_WeaponReady	, &States[S_MLIGHTNINGREADY+11]),
	S_BRIGHT (MLNG, 'B',	1, A_WeaponReady	, &States[S_MLIGHTNINGREADY+12]),
	S_BRIGHT (MLNG, 'C',	1, A_WeaponReady	, &States[S_MLIGHTNINGREADY+13]),
	S_BRIGHT (MLNG, 'C',	1, A_WeaponReady	, &States[S_MLIGHTNINGREADY+14]),
	S_BRIGHT (MLNG, 'C',	1, A_WeaponReady	, &States[S_MLIGHTNINGREADY+15]),
	S_BRIGHT (MLNG, 'C',	1, A_WeaponReady	, &States[S_MLIGHTNINGREADY+16]),
	S_BRIGHT (MLNG, 'C',	1, A_WeaponReady	, &States[S_MLIGHTNINGREADY+17]),
	S_BRIGHT (MLNG, 'C',	1, A_LightningReady	, &States[S_MLIGHTNINGREADY+18]),
	S_BRIGHT (MLNG, 'B',	1, A_WeaponReady	, &States[S_MLIGHTNINGREADY+19]),
	S_BRIGHT (MLNG, 'B',	1, A_WeaponReady	, &States[S_MLIGHTNINGREADY+20]),
	S_BRIGHT (MLNG, 'B',	1, A_WeaponReady	, &States[S_MLIGHTNINGREADY+21]),
	S_BRIGHT (MLNG, 'B',	1, A_WeaponReady	, &States[S_MLIGHTNINGREADY+22]),
	S_BRIGHT (MLNG, 'B',	1, A_WeaponReady	, &States[S_MLIGHTNINGREADY+23]),
	S_BRIGHT (MLNG, 'B',	1, A_WeaponReady	, &States[S_MLIGHTNINGREADY]),

#define S_MLIGHTNINGDOWN (S_MLIGHTNINGREADY+24)
	S_BRIGHT (MLNG, 'A',	1, A_Lower		, &States[S_MLIGHTNINGDOWN]),

#define S_MLIGHTNINGUP (S_MLIGHTNINGDOWN+1)
	S_BRIGHT (MLNG, 'A',	1, A_Raise		, &States[S_MLIGHTNINGUP]),

#define S_MLIGHTNINGATK (S_MLIGHTNINGUP+1)
	S_BRIGHT (MLNG, 'D',	3, NULL			, &States[S_MLIGHTNINGATK+1]),
	S_BRIGHT (MLNG, 'E',	3, NULL			, &States[S_MLIGHTNINGATK+2]),
	S_BRIGHT (MLNG, 'F',	4, A_MLightningAttack	, &States[S_MLIGHTNINGATK+3]),
	S_BRIGHT (MLNG, 'G',	4, NULL			, &States[S_MLIGHTNINGATK+4]),
	S_BRIGHT (MLNG, 'H',	3, NULL			, &States[S_MLIGHTNINGATK+5]),
	S_BRIGHT (MLNG, 'I',	3, NULL			, &States[S_MLIGHTNINGATK+6]),
	S_BRIGHT2 (MLNG, 'I',	6, NULL			, &States[S_MLIGHTNINGATK+7], 0, 199),
	S_BRIGHT2 (MLNG, 'C',	2, NULL			, &States[S_MLIGHTNINGATK+8], 0, 55),
	S_BRIGHT2 (MLNG, 'B',	2, NULL			, &States[S_MLIGHTNINGATK+9], 0, 50),
	S_BRIGHT2 (MLNG, 'B',	2, NULL			, &States[S_MLIGHTNINGATK+10], 0, 45),
	S_BRIGHT2 (MLNG, 'B',	2, NULL			, &States[S_MLIGHTNINGREADY], 0, 40),
};

FWeaponInfo AMWeapLightning::WeaponInfo =
{
	0,				// DWORD           flags;
	MANA_2,				// ammotype_t      ammo;
	5,				// int             ammouse;
	25,				// int             ammogive;
	&States[S_MLIGHTNINGUP],	// FState          *upstate;
	&States[S_MLIGHTNINGDOWN],	// FState          *downstate;
	&States[S_MLIGHTNINGREADY],	// FState          *readystate;
	&States[S_MLIGHTNINGATK],	// FState          *atkstate;
	&States[S_MLIGHTNINGATK],	// FState          *holdatkstate;
	NULL,				// FState          *flashstate;
	NULL,				// const TypeInfo  *droptype;
	0,				// int             kickback;
	12*FRACUNIT,			// fixed_t         yadjust;
	NULL,				// const char      *upsound;
	NULL,				// const char      *readysound;
	ZDRUNTIME_CLASS(AMWeapLightning),// TypeInfo       *type;      // type of actor that represents this weapon
	-1				// int             minammo;    // minimum ammo needed to switch to this weapon
};

------------------------------------------------------------------------

//========== Ceiling Lightning

IMPLEMENT_ACTOR (ALightningCeiling, Hexen, -1, 0)
	PROP_SpawnHealth (144)
	PROP_SpeedFixed (25)
	PROP_RadiusFixed (16)
	PROP_HeightFixed (40)
	PROP_Damage (8)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
	PROP_Flags2 (MF2_NOTELEPORT|MF2_IMPACT|MF2_PCROSS)
	PROP_Flags3 (MF3_CEILINGHUGGER)
	PROP_RenderStyle (STYLE_Add)
	PROP_SpawnState (S_LIGHTNING_CEILING1)
	PROP_DeathState (S_LIGHTNING_C_X1)
END_DEFAULTS

FState ALightningCeiling::States[] =
{
#define S_LIGHTNING_CEILING1 0
	S_BRIGHT (MLFX, 'A',	2, A_LightningZap	, &States[S_LIGHTNING_CEILING1+1]),
	S_BRIGHT (MLFX, 'B',	2, A_LightningClip	, &States[S_LIGHTNING_CEILING1+2]),
	S_BRIGHT (MLFX, 'C',	2, A_LightningClip	, &States[S_LIGHTNING_CEILING1+3]),
	S_BRIGHT (MLFX, 'D',	2, A_LightningClip	, &States[S_LIGHTNING_CEILING1]),

#define S_LIGHTNING_C_X1 (S_LIGHTNING_CEILING1+4)
	S_BRIGHT (MLF2, 'A',	2, A_LightningRemove	, &States[S_LIGHTNING_C_X1+1]),
	S_BRIGHT (MLF2, 'B',	3, NULL			, &States[S_LIGHTNING_C_X1+2]),
	S_BRIGHT (MLF2, 'C',	3, NULL			, &States[S_LIGHTNING_C_X1+3]),
	S_BRIGHT (MLF2, 'D',	3, NULL			, &States[S_LIGHTNING_C_X1+4]),
	S_BRIGHT (MLF2, 'E',	3, NULL			, &States[S_LIGHTNING_C_X1+5]),
	S_BRIGHT (MLF2, 'K',	3, NULL			, &States[S_LIGHTNING_C_X1+6]),
	S_BRIGHT (MLF2, 'L',	3, NULL			, &States[S_LIGHTNING_C_X1+7]),
	S_BRIGHT (MLF2, 'M',	3, NULL			, &States[S_LIGHTNING_C_X1+8]),
	S_NORMAL1(ACLO, 'E',   35, NULL			, &States[S_LIGHTNING_C_X1+9]),
	S_BRIGHT (MLF2, 'N',	3, NULL			, &States[S_LIGHTNING_C_X1+10]),
	S_BRIGHT (MLF2, 'O',	3, NULL			, &States[S_LIGHTNING_C_X1+11]),
	S_BRIGHT (MLF2, 'P',	4, NULL			, &States[S_LIGHTNING_C_X1+12]),
	S_BRIGHT (MLF2, 'Q',	3, NULL			, &States[S_LIGHTNING_C_X1+13]),
	S_BRIGHT (MLF2, 'P',	3, NULL			, &States[S_LIGHTNING_C_X1+14]),
	S_BRIGHT (MLF2, 'Q',	4, NULL			, &States[S_LIGHTNING_C_X1+15]),
	S_BRIGHT (MLF2, 'P',	3, NULL			, &States[S_LIGHTNING_C_X1+16]),
	S_BRIGHT (MLF2, 'O',	3, NULL			, &States[S_LIGHTNING_C_X1+17]),
	S_BRIGHT (MLF2, 'P',	3, NULL			, &States[S_LIGHTNING_C_X1+18]),
	S_BRIGHT (MLF2, 'P',	1, A_HideThing		, &States[S_LIGHTNING_C_X1+19]),
	S_NORMAL1(ACLO, 'E', 1050, A_FreeTargMobj	, NULL),
};

------------------------------------------------------------------------

//========== Floor Lightning

IMPLEMENT_ACTOR (ALightningFloor, Hexen, -1, 0)
	PROP_SpawnHealth (144)
	PROP_SpeedFixed (25)
	PROP_RadiusFixed (16)
	PROP_HeightFixed (40)
	PROP_Damage (8)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
	PROP_Flags2 (MF2_NOTELEPORT|MF2_IMPACT|MF2_PCROSS)
	PROP_Flags3 (MF3_FLOORHUGGER)
	PROP_RenderStyle (STYLE_Add)
	PROP_SpawnState (S_LIGHTNING_FLOOR1)
	PROP_DeathState (S_LIGHTNING_F_X1)
END_DEFAULTS

FState ALightningFloor::States[] =
{
#define S_LIGHTNING_FLOOR1 0
	S_BRIGHT (MLFX, 'E',	2, A_LightningZap	, &States[S_LIGHTNING_FLOOR1+1]),
	S_BRIGHT (MLFX, 'F',	2, A_LightningClip	, &States[S_LIGHTNING_FLOOR1+2]),
	S_BRIGHT (MLFX, 'G',	2, A_LightningClip	, &States[S_LIGHTNING_FLOOR1+3]),
	S_BRIGHT (MLFX, 'H',	2, A_LightningClip	, &States[S_LIGHTNING_FLOOR1]),

#define S_LIGHTNING_F_X1 (S_LIGHTNING_FLOOR1+4)
	S_BRIGHT (MLF2, 'F',	2, A_LightningRemove	, &States[S_LIGHTNING_F_X1+1]),
	S_BRIGHT (MLF2, 'G',	3, NULL			, &States[S_LIGHTNING_F_X1+2]),
	S_BRIGHT (MLF2, 'H',	3, NULL			, &States[S_LIGHTNING_F_X1+3]),
	S_BRIGHT (MLF2, 'I',	3, NULL			, &States[S_LIGHTNING_F_X1+4]),
	S_BRIGHT (MLF2, 'J',	3, NULL			, &States[S_LIGHTNING_F_X1+5]),
	S_BRIGHT (MLF2, 'K',	3, NULL			, &States[S_LIGHTNING_F_X1+6]),
	S_BRIGHT (MLF2, 'L',	3, NULL			, &States[S_LIGHTNING_F_X1+7]),
	S_BRIGHT (MLF2, 'M',	3, NULL			, &States[S_LIGHTNING_F_X1+8]),
	S_NORMAL1(ACLO, 'E',   20, NULL			, &States[S_LIGHTNING_F_X1+9]),
	S_BRIGHT (MLF2, 'N',	3, NULL			, &States[S_LIGHTNING_F_X1+10]),
	S_BRIGHT (MLF2, 'O',	3, NULL			, &States[S_LIGHTNING_F_X1+11]),
	S_BRIGHT (MLF2, 'P',	4, NULL			, &States[S_LIGHTNING_F_X1+12]),
	S_BRIGHT (MLF2, 'Q',	3, NULL			, &States[S_LIGHTNING_F_X1+13]),
	S_BRIGHT (MLF2, 'P',	3, NULL			, &States[S_LIGHTNING_F_X1+14]),
	S_BRIGHT (MLF2, 'Q',	4, A_LastZap		, &States[S_LIGHTNING_F_X1+15]),
	S_BRIGHT (MLF2, 'P',	3, NULL			, &States[S_LIGHTNING_F_X1+16]),
	S_BRIGHT (MLF2, 'O',	3, NULL			, &States[S_LIGHTNING_F_X1+17]),
	S_BRIGHT (MLF2, 'P',	3, NULL			, &States[S_LIGHTNING_F_X1+18]),
	S_BRIGHT (MLF2, 'P',	1, A_HideThing		, &ALightningCeiling::States[S_LIGHTNING_C_X1+19]),
};

------------------------------------------------------------------------

//========== Lightning Zap

IMPLEMENT_ACTOR (ALightningZap, Hexen, -1, 0)
	PROP_RadiusFixed (15)
	PROP_HeightFixed (35)
	PROP_Damage (2)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
	PROP_RenderStyle (STYLE_Add)
	PROP_SpawnState (S_LIGHTNING_ZAP1)
	PROP_DeathState (S_LIGHTNING_ZAP_X1+7)
END_DEFAULTS

FState ALightningZap::States[] =
{
#define S_LIGHTNING_ZAP1 0
	S_BRIGHT (MLFX, 'I',	2, A_ZapMimic	, &States[S_LIGHTNING_ZAP1+1]),
	S_BRIGHT (MLFX, 'J',	2, A_ZapMimic	, &States[S_LIGHTNING_ZAP1+2]),
	S_BRIGHT (MLFX, 'K',	2, A_ZapMimic	, &States[S_LIGHTNING_ZAP1+3]),
	S_BRIGHT (MLFX, 'L',	2, A_ZapMimic	, &States[S_LIGHTNING_ZAP1+4]),
	S_BRIGHT (MLFX, 'M',	2, A_ZapMimic	, &States[S_LIGHTNING_ZAP1]),

#define S_LIGHTNING_ZAP_X1 (S_LIGHTNING_ZAP1+5)
	S_BRIGHT (MLFX, 'N',	2, NULL		, &States[S_LIGHTNING_ZAP_X1+1]),
	S_BRIGHT (MLFX, 'O',	2, NULL		, &States[S_LIGHTNING_ZAP_X1+2]),
	S_BRIGHT (MLFX, 'P',	2, NULL		, &States[S_LIGHTNING_ZAP_X1+3]),
	S_BRIGHT (MLFX, 'Q',	2, NULL		, &States[S_LIGHTNING_ZAP_X1+4]),
	S_BRIGHT (MLFX, 'R',	2, NULL		, &States[S_LIGHTNING_ZAP_X1+5]),
	S_BRIGHT (MLFX, 'S',	2, NULL		, &States[S_LIGHTNING_ZAP_X1+6]),
	S_BRIGHT (MLFX, 'T',	2, NULL		, &States[S_LIGHTNING_ZAP_X1+7]),
	S_BRIGHT (MLFX, 'U',	2, NULL		, NULL),
};

------------------------------------------------------------------------

//========== The mage

IMPLEMENT_ACTOR (AMagePlayer, Hexen, -1, 0)
	PROP_SpawnHealth (100)
	PROP_ReactionTime (0)
	PROP_PainChance (255)
	PROP_RadiusFixed (16)
	PROP_HeightFixed (64)
	PROP_SpeedFixed (1)
	PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_DROPOFF|MF_PICKUP|MF_NOTDMATCH|MF_FRIENDLY)
	PROP_Flags2 (MF2_WINDTHRUST|MF2_FLOORCLIP|MF2_SLIDE|MF2_PASSMOBJ|MF2_TELESTOMP|MF2_PUSHWALL)
	PROP_Flags3 (MF3_NOBLOCKMONST)
	PROP_Flags4 (MF4_NOSKIN)
	PROP_SpawnState (S_MPLAY)
	PROP_SeeState (S_MPLAY_RUN1)
	PROP_PainState (S_MPLAY_PAIN)
	PROP_MissileState (S_MPLAY_ATK1)
	PROP_DeathState (S_MPLAY_DIE1)
	PROP_XDeathState (S_MPLAY_XDIE1)
	PROP_BDeathState (S_PLAY_M_FDTH)
	PROP_IDeathState (S_MPLAY_ICE)
	PROP_PainSound ("PlayerMagePain")
END_DEFAULTS

FState AMagePlayer::States[] =
{
#define S_MPLAY 0
	S_NORMAL1(MAGE, 'A',   -1, NULL			, NULL),

#define S_MPLAY_RUN1 (S_MPLAY+1)
	S_NORMAL1(MAGE, 'A',	4, NULL			, &States[S_MPLAY_RUN1+1]),
	S_NORMAL1(MAGE, 'B',	4, NULL			, &States[S_MPLAY_RUN1+2]),
	S_NORMAL1(MAGE, 'C',	4, NULL			, &States[S_MPLAY_RUN1+3]),
	S_NORMAL1(MAGE, 'D',	4, NULL			, &States[S_MPLAY_RUN1]),

#define S_MPLAY_PAIN (S_MPLAY_RUN1+4)
	S_NORMAL1(MAGE, 'G',	4, NULL			, &States[S_MPLAY_PAIN+1]),
	S_NORMAL1(MAGE, 'G',	4, A_Pain		, &States[S_MPLAY]),

#define S_MPLAY_ATK1 (S_MPLAY_PAIN+2)
	S_NORMAL1(MAGE, 'E',	8, NULL			, &States[S_MPLAY_ATK1+1]),
	S_BRIGHT (MAGE, 'F',	8, NULL			, &States[S_MPLAY]),

#define S_MPLAY_DIE1 (S_MPLAY_ATK1+2)
	S_NORMAL1(MAGE, 'H',	6, NULL			, &States[S_MPLAY_DIE1+1]),
	S_NORMAL1(MAGE, 'I',	6, A_Scream		, &States[S_MPLAY_DIE1+2]),
	S_NORMAL1(MAGE, 'J',	6, NULL			, &States[S_MPLAY_DIE1+3]),
	S_NORMAL1(MAGE, 'K',	6, NULL			, &States[S_MPLAY_DIE1+4]),
	S_NORMAL1(MAGE, 'L',	6, A_NoBlocking		, &States[S_MPLAY_DIE1+5]),
	S_NORMAL1(MAGE, 'M',	6, NULL			, &States[S_MPLAY_DIE1+6]),
	S_NORMAL1(MAGE, 'N',   -1, NULL/*A_AddPlayerCorpse*/, NULL),

#define S_MPLAY_XDIE1 (S_MPLAY_DIE1+7)
	S_NORMAL1(MAGE, 'O',	5, A_Scream		, &States[S_MPLAY_XDIE1+1]),
	S_NORMAL1(MAGE, 'P',	5, NULL			, &States[S_MPLAY_XDIE1+2]),
	S_NORMAL1(MAGE, 'R',	5, A_NoBlocking		, &States[S_MPLAY_XDIE1+3]),
	S_NORMAL1(MAGE, 'S',	5, NULL			, &States[S_MPLAY_XDIE1+4]),
	S_NORMAL1(MAGE, 'T',	5, NULL			, &States[S_MPLAY_XDIE1+5]),
	S_NORMAL1(MAGE, 'U',	5, NULL			, &States[S_MPLAY_XDIE1+6]),
	S_NORMAL1(MAGE, 'V',	5, NULL			, &States[S_MPLAY_XDIE1+7]),
	S_NORMAL1(MAGE, 'W',	5, NULL			, &States[S_MPLAY_XDIE1+8]),
	S_NORMAL1(MAGE, 'X',   -1, NULL/*A_AddPlayerCorpse*/, NULL),

#define S_MPLAY_ICE (S_MPLAY_XDIE1+9)
	S_NORMAL1(MAGE, 'Y',	5, A_FreezeDeath	, &States[S_MPLAY_ICE+1]),
	S_NORMAL1(MAGE, 'Y',	1, A_FreezeDeathChunks	, &States[S_MPLAY_ICE+1]),

#define S_PLAY_M_FDTH (S_MPLAY_ICE+2)
	S_BRIGHT (FDTH, 'E',	5, NULL			, &States[S_PLAY_M_FDTH+1]),
	S_BRIGHT (FDTH, 'F',	4, NULL			, &States[S_PLAY_M_FDTH+2]),

#define S_PLAY_FDTH (S_PLAY_M_FDTH+2)
	S_BRIGHT (FDTH, 'G',	5, A_FireScream		, &States[S_PLAY_FDTH+1]),
	S_BRIGHT (FDTH, 'H',	4, A_PlayerScream 	, &States[S_PLAY_FDTH+2]),
	S_BRIGHT (FDTH, 'I',	5, NULL 		, &States[S_PLAY_FDTH+3]),
	S_BRIGHT (FDTH, 'J',	4, NULL 		, &States[S_PLAY_FDTH+4]),
	S_BRIGHT (FDTH, 'K',	5, NULL 		, &States[S_PLAY_FDTH+5]),
	S_BRIGHT (FDTH, 'L',	4, NULL 		, &States[S_PLAY_FDTH+6]),
	S_BRIGHT (FDTH, 'M',	5, NULL 		, &States[S_PLAY_FDTH+7]),
	S_BRIGHT (FDTH, 'N',	4, NULL 		, &States[S_PLAY_FDTH+8]),
	S_BRIGHT (FDTH, 'O',	5, NULL 		, &States[S_PLAY_FDTH+9]),
	S_BRIGHT (FDTH, 'P',	4, NULL 		, &States[S_PLAY_FDTH+10]),
	S_BRIGHT (FDTH, 'Q',	5, NULL 		, &States[S_PLAY_FDTH+11]),
	S_BRIGHT (FDTH, 'R',	4, NULL 		, &States[S_PLAY_FDTH+12]),
	S_BRIGHT (FDTH, 'S',	5, A_NoBlocking 	, &States[S_PLAY_FDTH+13]),
	S_BRIGHT (FDTH, 'T',	4, NULL 		, &States[S_PLAY_FDTH+14]),
	S_BRIGHT (FDTH, 'U',	5, NULL 		, &States[S_PLAY_FDTH+15]),
	S_BRIGHT (FDTH, 'V',	4, NULL 		, &States[S_PLAY_FDTH+16]),
	S_NORMAL1(ACLO, 'E',   35, A_CheckBurnGone	, &States[S_PLAY_FDTH+16]),
	S_NORMAL1(ACLO, 'E',	8, NULL 		, NULL),
};

------------------------------------------------------------------------

//========== First piece of the Bloodscourge

IMPLEMENT_ACTOR (AMWeaponPiece1, Hexen, 21, 37)
	PROP_Flags (MF_SPECIAL)
	PROP_Flags2 (MF2_FLOATBOB)
	PROP_SpawnState (0)
END_DEFAULTS

FState AMWeaponPiece1::States[] =
{
	S_BRIGHT (WMS1, 'A',   -1, NULL, NULL),
};

------------------------------------------------------------------------

//========== Second piece of the Bloodscourge

IMPLEMENT_ACTOR (AMWeaponPiece2, Hexen, 22, 38)
	PROP_Flags (MF_SPECIAL)
	PROP_Flags2 (MF2_FLOATBOB)
	PROP_SpawnState (0)
END_DEFAULTS

FState AMWeaponPiece2::States[] =
{
	S_BRIGHT (WMS2, 'A',   -1, NULL, NULL),
};

------------------------------------------------------------------------

//========== Third piece of the Bloodscourge

IMPLEMENT_ACTOR (AMWeaponPiece3, Hexen, 23, 39)
	PROP_Flags (MF_SPECIAL)
	PROP_Flags2 (MF2_FLOATBOB)
	PROP_SpawnState (0)
END_DEFAULTS

FState AMWeaponPiece3::States[] =
{
	S_BRIGHT (WMS3, 'A',   -1, NULL, NULL),
};

------------------------------------------------------------------------

//==========This spawns the three pieces of the mage's fourth weapon: gets spawned if weapon drop is on so that other players can pick up the dead guy's weapon.

IMPLEMENT_ACTOR (ABloodscourgeDrop, Hexen, -1, 0)
	PROP_SpawnState (0)
END_DEFAULTS

FState ABloodscourgeDrop::States[] =
{
	S_NORMAL1 (TNT1, 'A', 1, NULL, &States[1]),
	S_NORMAL1 (TNT1, 'A', 1, A_DropBloodscourgePieces, NULL)
};

------------------------------------------------------------------------

//========== The Mages's Staff (Bloodscourge)

IMPLEMENT_ACTOR (AMWeapBloodscourge, Hexen, -1, 0)
	PROP_Flags (MF_SPECIAL)
	PROP_SpawnState (0)
END_DEFAULTS

FState AMWeapBloodscourge::States[] =
{
	// Dummy state, because the fourth weapon does not appear in a level directly.
	S_NORMAL1 (TNT1, 'A',   -1, NULL		, NULL),

#define S_MSTAFFREADY 1
	S_NORMAL1 (MSTF, 'A',	1, A_WeaponReady	, &States[S_MSTAFFREADY+1]),
	S_NORMAL1 (MSTF, 'A',	1, A_WeaponReady	, &States[S_MSTAFFREADY+2]),
	S_NORMAL1 (MSTF, 'A',	1, A_WeaponReady	, &States[S_MSTAFFREADY+3]),
	S_NORMAL1 (MSTF, 'A',	1, A_WeaponReady	, &States[S_MSTAFFREADY+4]),
	S_NORMAL1 (MSTF, 'A',	1, A_WeaponReady	, &States[S_MSTAFFREADY+5]),
	S_NORMAL1 (MSTF, 'A',	1, A_WeaponReady	, &States[S_MSTAFFREADY+6]),
	S_NORMAL1 (MSTF, 'B',	1, A_WeaponReady	, &States[S_MSTAFFREADY+7]),
	S_NORMAL1 (MSTF, 'B',	1, A_WeaponReady	, &States[S_MSTAFFREADY+8]),
	S_NORMAL1 (MSTF, 'B',	1, A_WeaponReady	, &States[S_MSTAFFREADY+9]),
	S_NORMAL1 (MSTF, 'B',	1, A_WeaponReady	, &States[S_MSTAFFREADY+10]),
	S_NORMAL1 (MSTF, 'B',	1, A_WeaponReady	, &States[S_MSTAFFREADY+11]),
	S_NORMAL1 (MSTF, 'B',	1, A_WeaponReady	, &States[S_MSTAFFREADY+12]),
	S_NORMAL1 (MSTF, 'C',	1, A_WeaponReady	, &States[S_MSTAFFREADY+13]),
	S_NORMAL1 (MSTF, 'C',	1, A_WeaponReady	, &States[S_MSTAFFREADY+14]),
	S_NORMAL1 (MSTF, 'C',	1, A_WeaponReady	, &States[S_MSTAFFREADY+15]),
	S_NORMAL1 (MSTF, 'C',	1, A_WeaponReady	, &States[S_MSTAFFREADY+16]),
	S_NORMAL1 (MSTF, 'C',	1, A_WeaponReady	, &States[S_MSTAFFREADY+17]),
	S_NORMAL1 (MSTF, 'C',	1, A_WeaponReady	, &States[S_MSTAFFREADY+18]),
	S_NORMAL1 (MSTF, 'D',	1, A_WeaponReady	, &States[S_MSTAFFREADY+19]),
	S_NORMAL1 (MSTF, 'D',	1, A_WeaponReady	, &States[S_MSTAFFREADY+20]),
	S_NORMAL1 (MSTF, 'D',	1, A_WeaponReady	, &States[S_MSTAFFREADY+21]),
	S_NORMAL1 (MSTF, 'D',	1, A_WeaponReady	, &States[S_MSTAFFREADY+22]),
	S_NORMAL1 (MSTF, 'D',	1, A_WeaponReady	, &States[S_MSTAFFREADY+23]),
	S_NORMAL1 (MSTF, 'D',	1, A_WeaponReady	, &States[S_MSTAFFREADY+24]),
	S_NORMAL1 (MSTF, 'E',	1, A_WeaponReady	, &States[S_MSTAFFREADY+25]),
	S_NORMAL1 (MSTF, 'E',	1, A_WeaponReady	, &States[S_MSTAFFREADY+26]),
	S_NORMAL1 (MSTF, 'E',	1, A_WeaponReady	, &States[S_MSTAFFREADY+27]),
	S_NORMAL1 (MSTF, 'E',	1, A_WeaponReady	, &States[S_MSTAFFREADY+28]),
	S_NORMAL1 (MSTF, 'E',	1, A_WeaponReady	, &States[S_MSTAFFREADY+29]),
	S_NORMAL1 (MSTF, 'E',	1, A_WeaponReady	, &States[S_MSTAFFREADY+30]),
	S_NORMAL1 (MSTF, 'F',	1, A_WeaponReady	, &States[S_MSTAFFREADY+31]),
	S_NORMAL1 (MSTF, 'F',	1, A_WeaponReady	, &States[S_MSTAFFREADY+32]),
	S_NORMAL1 (MSTF, 'F',	1, A_WeaponReady	, &States[S_MSTAFFREADY+33]),
	S_NORMAL1 (MSTF, 'F',	1, A_WeaponReady	, &States[S_MSTAFFREADY+34]),
	S_NORMAL1 (MSTF, 'F',	1, A_WeaponReady	, &States[S_MSTAFFREADY]),

#define S_MSTAFFDOWN (S_MSTAFFREADY+35)
	S_NORMAL1 (MSTF, 'A',	1, A_Lower		, &States[S_MSTAFFDOWN]),

#define S_MSTAFFUP (S_MSTAFFDOWN+1)
	S_NORMAL1 (MSTF, 'A',	1, A_Raise		, &States[S_MSTAFFUP]),

#define S_MSTAFFATK (S_MSTAFFUP+1)
	S_NORMAL2 (MSTF, 'G',	4, NULL			, &States[S_MSTAFFATK+1], 0, 40),
	S_BRIGHT2 (MSTF, 'H',	4, A_MStaffAttack	, &States[S_MSTAFFATK+2], 0, 48),
	S_BRIGHT2 (MSTF, 'H',	2, A_MStaffPalette	, &States[S_MSTAFFATK+3], 0, 48),
	S_NORMAL2 (MSTF, 'I',	2, A_MStaffPalette	, &States[S_MSTAFFATK+4], 0, 48),
	S_NORMAL2 (MSTF, 'I',	2, A_MStaffPalette	, &States[S_MSTAFFATK+5], 0, 48),
	S_NORMAL2 (MSTF, 'I',	1, NULL			, &States[S_MSTAFFATK+6], 0, 40),
	S_NORMAL2 (MSTF, 'J',	5, NULL			, &States[S_MSTAFFREADY], 0, 36)
};

FWeaponInfo AMWeapBloodscourge::WeaponInfo =
{
	0,					// DWORD           flags;
	MANA_BOTH,				// ammotype_t      ammo;
	15,					// int             ammouse;
	0,					// int             ammogive;
	&States[S_MSTAFFUP],			// FState          *upstate;
	&States[S_MSTAFFDOWN],			// FState          *downstate;
	&States[S_MSTAFFREADY],			// FState          *readystate;
	&States[S_MSTAFFATK],			// FState          *atkstate;
	&States[S_MSTAFFATK],			// FState          *holdatkstate;
	NULL,					// FState          *flashstate;
	NULL,					// const TypeInfo  *droptype;
	150,					// int             kickback;
	15*FRACUNIT,				// fixed_t         yadjust;
	NULL,					// const char      *upsound;
	NULL,					// const char      *readysound;
	ZDRUNTIME_CLASS(AMWeapBloodscourge),	// TypeInfo    *type;      // type of actor that represents this weapon
	-1					// int             minammo;    // minimum ammo needed to switch to this weapon
};

------------------------------------------------------------------------

//========== Bloodscourge shot

IMPLEMENT_ACTOR (AMageStaffFX2, Hexen, -1, 0)
	PROP_SpeedFixed (17)
	PROP_HeightFixed (8)
	PROP_Damage (4)
	PROP_DamageType (MOD_FIRE)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
	PROP_Flags2 (MF2_NOTELEPORT|MF2_IMPACT|MF2_PCROSS|MF2_SEEKERMISSILE)
	PROP_SpawnState (S_MSTAFF_FX2_1)
	PROP_DeathState (S_MSTAFF_FX2_X1)
	PROP_DeathSound ("MageStaffExplode")
END_DEFAULTS

FState AMageStaffFX2::States[] =
{
#define S_MSTAFF_FX2_1 0
	S_BRIGHT (MSP2, 'A',	2, A_MStaffTrack, &States[S_MSTAFF_FX2_1+1]),
	S_BRIGHT (MSP2, 'B',	2, A_MStaffTrack, &States[S_MSTAFF_FX2_1+2]),
	S_BRIGHT (MSP2, 'C',	2, A_MStaffTrack, &States[S_MSTAFF_FX2_1+3]),
	S_BRIGHT (MSP2, 'D',	2, A_MStaffTrack, &States[S_MSTAFF_FX2_1]),

#define S_MSTAFF_FX2_X1 (S_MSTAFF_FX2_1+4)
	S_BRIGHT (MSP2, 'E',	4, A_BeAdditive	, &States[S_MSTAFF_FX2_X1+1]),
	S_BRIGHT (MSP2, 'F',	5, A_Explode	, &States[S_MSTAFF_FX2_X1+2]),
	S_BRIGHT (MSP2, 'G',	5, NULL		, &States[S_MSTAFF_FX2_X1+3]),
	S_BRIGHT (MSP2, 'H',	5, NULL		, &States[S_MSTAFF_FX2_X1+4]),
	S_BRIGHT (MSP2, 'I',	4, NULL		, NULL),
};

------------------------------------------------------------------------

//========== The Mage's Sapphire wand (first weapon)

IMPLEMENT_ACTOR (AMWeapWand, Hexen, -1, 0)
END_DEFAULTS

FState AMWeapWand::States[] =
{
#define S_MWANDREADY 0
	S_NORMAL1 (MWND, 'A',	1, A_WeaponReady, &States[S_MWANDREADY]),

#define S_MWANDDOWN (S_MWANDREADY+1)
	S_NORMAL1 (MWND, 'A',	1, A_Lower	, &States[S_MWANDDOWN]),

#define S_MWANDUP (S_MWANDDOWN+1)
	S_NORMAL1 (MWND, 'A',	1, A_Raise	, &States[S_MWANDUP]),

#define S_MWANDATK (S_MWANDUP+1)
	S_NORMAL1 (MWND, 'A',	6, NULL		, &States[S_MWANDATK+1]),
	S_BRIGHT2 (MWND, 'B',	6, A_MWandAttack, &States[S_MWANDATK+2], 0, 48),
	S_NORMAL2 (MWND, 'A',	3, NULL		, &States[S_MWANDATK+3], 0, 40),
	S_NORMAL2 (MWND, 'A',	3, A_ReFire	, &States[S_MWANDREADY], 0, 36),
};

FWeaponInfo AMWeapWand::WeaponInfo =
{
	0,				// DWORD           flags;
	MANA_NONE,			// ammotype_t      ammo;
	0,				// int             ammouse;
	0,				// int             ammogive;
	&States[S_MWANDUP],		// FState          *upstate;
	&States[S_MWANDDOWN],		// FState          *downstate;
	&States[S_MWANDREADY],		// FState          *readystate;
	&States[S_MWANDATK],		// FState          *atkstate;
	&States[S_MWANDATK],		// FState          *holdatkstate;
	NULL,				// FState          *flashstate;
	NULL,				// const TypeInfo  *droptype;
	0,				// int             kickback;
	4*FRACUNIT,			// fixed_t         yadjust;
	NULL,				// const char      *upsound;
	NULL,				// const char      *readysound;
	ZDRUNTIME_CLASS(AMWeapWand),	// TypeInfo        *type;      // type of actor that represents this weapon
	-1				// int             minammo;    // minimum ammo needed to switch to this weapon
};


------------------------------------------------------------------------

//========== Sapphire wand smoke

IMPLEMENT_ACTOR (AMageWandSmoke, Hexen, -1, 0)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_SHADOW)
	PROP_Flags2 (MF2_NOTELEPORT|MF2_CANNOTPUSH|MF2_NODMGTHRUST)
	PROP_Flags4 (MF4_NOSPEEDCHECK|MF4_NONETSPAWN)
	PROP_SpawnState (0)
	PROP_RenderStyle (STYLE_Translucent)
	PROP_Alpha (HX_SHADOW)
END_DEFAULTS

FState AMageWandSmoke::States[] =
{
	S_NORMAL1 (MWND, 'C',	4, NULL, &States[1]),
	S_NORMAL1 (MWND, 'D',	4, NULL, &States[2]),
	S_NORMAL1 (MWND, 'C',	4, NULL, &States[3]),
	S_NORMAL1 (MWND, 'D',	4, NULL, NULL),
};

------------------------------------------------------------------------

//========== Sapphire wand missile

IMPLEMENT_ACTOR (AMageWandMissile, Hexen, -1, 0)
	PROP_SpeedFixed (184)
	PROP_RadiusFixed (12)
	PROP_HeightFixed (8)
	PROP_Damage (2)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
	PROP_Flags2 (MF2_NOTELEPORT|MF2_RIP|MF2_CANNOTPUSH|MF2_NODMGTHRUST|MF2_IMPACT|MF2_PCROSS)
	PROP_SpawnState (S_MWAND_MISSILE)
	PROP_DeathState (S_MWANDPUFF)
END_DEFAULTS

FState AMageWandMissile::States[] =
{
#define S_MWAND_MISSILE 0
	S_BRIGHT (MWND, 'C',	4, NULL, &States[S_MWAND_MISSILE+1]),
	S_BRIGHT (MWND, 'D',	4, NULL, &States[S_MWAND_MISSILE]),

#define S_MWANDPUFF (S_MWAND_MISSILE+2)
	S_BRIGHT (MWND, 'E',	4, NULL, &States[S_MWANDPUFF+1]),
	S_BRIGHT (MWND, 'F',	3, NULL, &States[S_MWANDPUFF+2]),
	S_BRIGHT (MWND, 'G',	4, NULL, &States[S_MWANDPUFF+3]),
	S_BRIGHT (MWND, 'H',	3, NULL, &States[S_MWANDPUFF+4]),
	S_BRIGHT (MWND, 'I',	4, NULL, NULL),
};

------------------------------------------------------------------------

//========== Blue mana

IMPLEMENT_ACTOR (AMana1, Hexen, 122, 11)
	PROP_SpawnHealth (10)
	PROP_RadiusFixed (8)
	PROP_HeightFixed (8)
	PROP_Flags (MF_SPECIAL)
	PROP_Flags2 (MF2_FLOATBOB)
	PROP_SpawnState (0)
END_DEFAULTS

FState AMana1::States[] =
{
	S_BRIGHT (MAN1, 'A',    4, NULL, &States[1]),
	S_BRIGHT (MAN1, 'B',    4, NULL, &States[2]),
	S_BRIGHT (MAN1, 'C',    4, NULL, &States[3]),
	S_BRIGHT (MAN1, 'D',    4, NULL, &States[4]),
	S_BRIGHT (MAN1, 'E',    4, NULL, &States[5]),
	S_BRIGHT (MAN1, 'F',    4, NULL, &States[6]),
	S_BRIGHT (MAN1, 'G',    4, NULL, &States[7]),
	S_BRIGHT (MAN1, 'H',    4, NULL, &States[8]),
	S_BRIGHT (MAN1, 'I',    4, NULL, &States[0]),
};

------------------------------------------------------------------------

//========== Green mana

IMPLEMENT_ACTOR (AMana2, Hexen, 124, 12)
	PROP_SpawnHealth (10)
	PROP_RadiusFixed (8)
	PROP_HeightFixed (8)
	PROP_Flags (MF_SPECIAL)
	PROP_Flags2 (MF2_FLOATBOB)
	PROP_SpawnState (0)
END_DEFAULTS

FState AMana2::States[] =
{
	S_BRIGHT (MAN2, 'A',    4, NULL, &States[1]),
	S_BRIGHT (MAN2, 'B',    4, NULL, &States[2]),
	S_BRIGHT (MAN2, 'C',    4, NULL, &States[3]),
	S_BRIGHT (MAN2, 'D',    4, NULL, &States[4]),
	S_BRIGHT (MAN2, 'E',    4, NULL, &States[5]),
	S_BRIGHT (MAN2, 'F',    4, NULL, &States[6]),
	S_BRIGHT (MAN2, 'G',    4, NULL, &States[7]),
	S_BRIGHT (MAN2, 'H',    4, NULL, &States[8]),
	S_BRIGHT (MAN2, 'I',    4, NULL, &States[9]),
	S_BRIGHT (MAN2, 'J',    4, NULL, &States[10]),
	S_BRIGHT (MAN2, 'K',    4, NULL, &States[11]),
	S_BRIGHT (MAN2, 'L',    4, NULL, &States[12]),
	S_BRIGHT (MAN2, 'M',    4, NULL, &States[13]),
	S_BRIGHT (MAN2, 'N',    4, NULL, &States[14]),
	S_BRIGHT (MAN2, 'O',    4, NULL, &States[15]),
	S_BRIGHT (MAN2, 'P',    4, NULL, &States[0]),
};

------------------------------------------------------------------------

//========== Combined mana

IMPLEMENT_ACTOR (AMana3, Hexen, 8004, 75)
	PROP_SpawnHealth (20)
	PROP_RadiusFixed (8)
	PROP_HeightFixed (8)
	PROP_Flags (MF_SPECIAL)
	PROP_Flags2 (MF2_FLOATBOB)
	PROP_SpawnState (0)
END_DEFAULTS

FState AMana3::States[] =
{
	S_BRIGHT (MAN3, 'A',    4, NULL, &States[1]),
	S_BRIGHT (MAN3, 'B',    4, NULL, &States[2]),
	S_BRIGHT (MAN3, 'C',    4, NULL, &States[3]),
	S_BRIGHT (MAN3, 'D',    4, NULL, &States[4]),
	S_BRIGHT (MAN3, 'E',    4, NULL, &States[5]),
	S_BRIGHT (MAN3, 'F',    4, NULL, &States[6]),
	S_BRIGHT (MAN3, 'G',    4, NULL, &States[7]),
	S_BRIGHT (MAN3, 'H',    4, NULL, &States[8]),
	S_BRIGHT (MAN3, 'I',    4, NULL, &States[9]),
	S_BRIGHT (MAN3, 'J',    4, NULL, &States[10]),
	S_BRIGHT (MAN3, 'K',    4, NULL, &States[11]),
	S_BRIGHT (MAN3, 'L',    4, NULL, &States[12]),
	S_BRIGHT (MAN3, 'M',    4, NULL, &States[13]),
	S_BRIGHT (MAN3, 'N',    4, NULL, &States[14]),
	S_BRIGHT (MAN3, 'O',    4, NULL, &States[15]),
	S_BRIGHT (MAN3, 'P',    4, NULL, &States[0]),
};

------------------------------------------------------------------------

//========== Krater of might artifact

IMPLEMENT_ACTOR (AArtiBoostMana, Hexen, 8003, 26)
	PROP_Flags (MF_SPECIAL)
	PROP_Flags2 (MF2_FLOATBOB)
	PROP_SpawnState (0)
	PROP_PickupSound("misc/p_pkup")
END_DEFAULTS

FState AArtiBoostMana::States[] =
{
	S_BRIGHT (BMAN, 'A',   -1, NULL, NULL),
};

------------------------------------------------------------------------

//========== Snout puff

IMPLEMENT_ACTOR (ASnoutPuff, Hexen, -1, 0)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
	PROP_Flags4 (MF4_NONETSPAWN)
	PROP_RenderStyle (STYLE_Translucent)
	PROP_Alpha (HX_SHADOW)
	PROP_SpawnState (0)
END_DEFAULTS

FState ASnoutPuff::States[] =
{
	S_NORMAL1(FHFX, 'S',	4, NULL, &States[1]),
	S_NORMAL1(FHFX, 'T',	4, NULL, &States[2]),
	S_NORMAL1(FHFX, 'U',	4, NULL, &States[3]),
	S_NORMAL1(FHFX, 'V',	4, NULL, &States[4]),
	S_NORMAL1(FHFX, 'W',	4, NULL, NULL)
};

------------------------------------------------------------------------

//========== The weapon used by players morphed into a pig.

IMPLEMENT_ACTOR (ASnout, Hexen, -1, 0)
END_DEFAULTS

FState ASnout::States[] =
{
#define S_SNOUTREADY 0
	S_NORMAL1(WPIG, 'A',	1, A_WeaponReady, &States[S_SNOUTREADY]),

#define S_SNOUTDOWN 1
	S_NORMAL1(WPIG, 'A',	1, A_Lower	, &States[S_SNOUTDOWN]),

#define S_SNOUTUP 2
	S_NORMAL1(WPIG, 'A',	1, A_Raise	, &States[S_SNOUTUP]),

#define S_SNOUTATK 3
	S_NORMAL1(WPIG, 'A',	4, A_SnoutAttack, &States[S_SNOUTATK+1]),
	S_NORMAL1(WPIG, 'B',	8, A_SnoutAttack, &States[S_SNOUTREADY])
};

FWeaponInfo ASnout::WeaponInfo =
{
	WIF_BLOODSPLATTER|WIF_DONTBOB,  // DWORD           flags;
	am_noammo,			// ammotype_t      ammo;
	0,				// int             ammouse;
	0,				// int             ammogive;
	&States[S_SNOUTUP],		// FState          *upstate;
	&States[S_SNOUTDOWN],		// FState          *downstate;
	&States[S_SNOUTREADY],		// FState          *readystate;
	&States[S_SNOUTATK],		// FState          *atkstate;
	&States[S_SNOUTATK],		// FState          *holdatkstate;
	NULL,				// FState          *flashstate;
	NULL,				// const TypeInfo  *droptype;
	150,				// int             kickback;
	10*FRACUNIT,			// fixed_t         yadjust;
	NULL,				// const char      *upsound;
	NULL,				// const char      *readysound;
	ZDRUNTIME_CLASS(ASnout),	// TypeInfo        *type;      // type of actor that represents this weapon
	-1				// int             minammo;    // minimum ammo needed to switch to this weapon
};

------------------------------------------------------------------------

//========== Players hit by a porkalator shot are temporarily turned into this.

IMPLEMENT_ACTOR (APigPlayer, Hexen, -1, 0)
	PROP_SpawnHealth (100)
	PROP_ReactionTime (0)
	PROP_PainChance (255)
	PROP_RadiusFixed (16)
	PROP_HeightFixed (24)
	PROP_SpeedFixed (1)
	PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_DROPOFF|MF_NOTDMATCH|MF_FRIENDLY)
	PROP_Flags2 (MF2_WINDTHRUST|MF2_FLOORCLIP|MF2_SLIDE|MF2_PASSMOBJ|MF2_TELESTOMP|MF2_PUSHWALL)
	PROP_Flags3 (MF3_NOBLOCKMONST)
	PROP_Flags4 (MF4_NOSKIN)
	PROP_SpawnState (S_PIGPLAY)
	PROP_SeeState (S_PIGPLAY_RUN1)
	PROP_PainState (S_PIGPLAY_PAIN)
	PROP_MissileState (S_PIGPLAY_ATK1)
	PROP_DeathState (S_PIGPLAY_DIE1)
	PROP_IDeathState (S_PIGPLAY_ICE)
	PROP_PainSound ("PigPain")
	PROP_DeathSound ("PigDeath")
END_DEFAULTS

FState APigPlayer::States[] =
{
#define S_PIGPLAY 0
	S_NORMAL1(PIGY, 'A',   -1, NULL		, NULL),

#define S_PIGPLAY_RUN1 (S_PIGPLAY+1)
	S_NORMAL1(PIGY, 'A',	3, NULL		, &States[S_PIGPLAY_RUN1+1]),
	S_NORMAL1(PIGY, 'B',	3, NULL		, &States[S_PIGPLAY_RUN1+2]),
	S_NORMAL1(PIGY, 'C',	3, NULL		, &States[S_PIGPLAY_RUN1+3]),
	S_NORMAL1(PIGY, 'D',	3, NULL		, &States[S_PIGPLAY_RUN1]),

#define S_PIGPLAY_PAIN (S_PIGPLAY_RUN1+4)
	S_NORMAL1(PIGY, 'D',	4, A_PigPain	, &States[S_PIGPLAY]),

#define S_PIGPLAY_ATK1 (S_PIGPLAY_PAIN+1)
	S_NORMAL1(PIGY, 'A',   12, NULL		, &States[S_PIGPLAY]),

#define S_PIGPLAY_DIE1 (S_PIGPLAY_ATK1+1)
	S_NORMAL1(PIGY, 'E',	4, A_Scream	, &States[S_PIGPLAY_DIE1+1]),
	S_NORMAL1(PIGY, 'F',	3, A_NoBlocking	, &States[S_PIGPLAY_DIE1+2]),
	S_NORMAL1(PIGY, 'G',	4, NULL		, &States[S_PIGPLAY_DIE1+3]),
	S_NORMAL1(PIGY, 'H',	3, NULL		, &States[S_PIGPLAY_DIE1+4]),
	S_NORMAL1(PIGY, 'I',	4, NULL		, &States[S_PIGPLAY_DIE1+5]),
	S_NORMAL1(PIGY, 'J',	4, NULL		, &States[S_PIGPLAY_DIE1+6]),
	S_NORMAL1(PIGY, 'K',	4, NULL		, &States[S_PIGPLAY_DIE1+7]),
	S_NORMAL1(PIGY, 'L',   -1, NULL		, NULL),

#define S_PIGPLAY_ICE (S_PIGPLAY_DIE1+8)
	S_NORMAL1(PIGY, 'M',	5, A_FreezeDeath, &States[S_PIGPLAY_ICE+1]),
	S_NORMAL1(PIGY, 'M',	1, A_FreezeDeathChunks, &States[S_PIGPLAY_ICE+1]),

};

------------------------------------------------------------------------

//========== Monsters hit by a porkalator shot are temporarily turned into this.

IMPLEMENT_ACTOR (APig, Hexen, -1, 0)
	PROP_SpawnHealth (25)
	PROP_PainChance (128)
	PROP_SpeedFixed (10)
	PROP_RadiusFixed (12)
	PROP_HeightFixed (22)
	PROP_Mass (60)
	PROP_Flags (MF_SOLID|MF_SHOOTABLE)
	PROP_Flags2 (MF2_WINDTHRUST|MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_TELESTOMP|MF2_PUSHWALL)
	PROP_Flags3 (MF3_DONTMORPH|MF3_ISMONSTER)
	PROP_SpawnState (S_PIG_LOOK1)
	PROP_SeeState (S_PIG_WALK1)
	PROP_PainState (S_PIG_PAIN)
	PROP_MeleeState (S_PIG_ATK1)
	PROP_DeathState (S_PIG_DIE1)
	PROP_IDeathState (S_PIG_ICE)
	PROP_SeeSound ("PigActive1")
	PROP_PainSound ("PigPain")
	PROP_DeathSound ("PigDeath")
	PROP_ActiveSound ("PigActive1")
END_DEFAULTS

FState APig::States[] =
{
#define S_PIG_LOOK1 0
	S_NORMAL1(PIGY, 'B',   10, A_PigLook	, &States[S_PIG_LOOK1]),

#define S_PIG_WALK1 (S_PIG_LOOK1+1)
	S_NORMAL1(PIGY, 'A',	3, A_PigChase	, &States[S_PIG_WALK1+1]),
	S_NORMAL1(PIGY, 'B',	3, A_PigChase	, &States[S_PIG_WALK1+2]),
	S_NORMAL1(PIGY, 'C',	3, A_PigChase	, &States[S_PIG_WALK1+3]),
	S_NORMAL1(PIGY, 'D',	3, A_PigChase	, &States[S_PIG_WALK1]),

#define S_PIG_PAIN (S_PIG_WALK1+4)
	S_NORMAL1(PIGY, 'D',	4, A_PigPain	, &States[S_PIG_WALK1]),

#define S_PIG_ATK1 (S_PIG_PAIN+1)
	S_NORMAL1(PIGY, 'A',	5, A_FaceTarget	, &States[S_PIG_ATK1+1]),
	S_NORMAL1(PIGY, 'A',   10, A_PigAttack	, &States[S_PIG_WALK1]),

#define S_PIG_DIE1 (S_PIG_ATK1+2)
	S_NORMAL1(PIGY, 'E',	4, A_Scream	, &States[S_PIG_DIE1+1]),
	S_NORMAL1(PIGY, 'F',	3, A_NoBlocking	, &States[S_PIG_DIE1+2]),
	S_NORMAL1(PIGY, 'G',	4, A_QueueCorpse, &States[S_PIG_DIE1+3]),
	S_NORMAL1(PIGY, 'H',	3, NULL		, &States[S_PIG_DIE1+4]),
	S_NORMAL1(PIGY, 'I',	4, NULL		, &States[S_PIG_DIE1+5]),
	S_NORMAL1(PIGY, 'J',	4, NULL		, &States[S_PIG_DIE1+6]),
	S_NORMAL1(PIGY, 'K',	4, NULL		, &States[S_PIG_DIE1+7]),
	S_NORMAL1(PIGY, 'L',   -1, NULL		, NULL),

#define S_PIG_ICE (S_PIG_DIE1+8)
	S_NORMAL1(PIGY, 'M',	5, A_FreezeDeath, &States[S_PIG_ICE+1]),
	S_NORMAL1(PIGY, 'M',	1, A_FreezeDeathChunks, &States[S_PIG_ICE+1]),

};

------------------------------------------------------------------------

//========== PuzzleItems are special inventory items which act like keys that get removed once they have been used.

IMPLEMENT_STATELESS_ACTOR (APuzzleItem, Any, -1, 0)
	PROP_Flags (MF_SPECIAL|MF_NOGRAVITY)
	PROP_PickupSound ("misc/i_pkup")
END_DEFAULTS

------------------------------------------------------------------------

//========== Yorick's skull. After obtaining this artifact, the player must find the headless statue onto which it fits.

IMPLEMENT_ACTOR (APuzzSkull, Hexen, 9002, 76)
	PROP_SpawnState (0)
END_DEFAULTS

FState APuzzSkull::States[] =
{
	S_NORMAL1 (ASKU, 'A',   -1, NULL, NULL),
};

------------------------------------------------------------------------

//========== Heart of D'Sparil

IMPLEMENT_ACTOR (APuzzGemBig, Hexen, 9003, 77)
	PROP_SpawnState (0)
END_DEFAULTS

FState APuzzGemBig::States[] =
{
	S_NORMAL1 (ABGM, 'A',   -1, NULL, NULL),
};

------------------------------------------------------------------------

//========== Red Gem (Ruby Planet)

IMPLEMENT_ACTOR (APuzzGemRed, Hexen, 9004, 78)
	PROP_SpawnState (0)
END_DEFAULTS

FState APuzzGemRed::States[] =
{
	S_NORMAL1 (AGMR, 'A',   -1, NULL, NULL),
};

------------------------------------------------------------------------

//========== Green Gem 1 (Emerald Planet)

IMPLEMENT_ACTOR (APuzzGemGreen1, Hexen, 9005, 79)
	PROP_SpawnState (0)
END_DEFAULTS

FState APuzzGemGreen1::States[] =
{
	S_NORMAL1 (AGMG, 'A',   -1, NULL, NULL),
};

------------------------------------------------------------------------

//========== Green Gem 2 (Emerald Planet)

IMPLEMENT_ACTOR (APuzzGemGreen2, Hexen, 9009, 80)
	PROP_SpawnState (0)
END_DEFAULTS

FState APuzzGemGreen2::States[] =
{
	S_NORMAL1 (AGG2, 'A',   -1, NULL, NULL),
};

------------------------------------------------------------------------

//========== Blue Gem 1 (Sapphire Planet)

IMPLEMENT_ACTOR (APuzzGemBlue1, Hexen, 9006, 81)
	PROP_SpawnState (0)
END_DEFAULTS

FState APuzzGemBlue1::States[] =
{
	S_NORMAL1 (AGMB, 'A',   -1, NULL, NULL),
};

------------------------------------------------------------------------

//========== Blue Gem 2 (Sapphire Planet)

IMPLEMENT_ACTOR (APuzzGemBlue2, Hexen, 9010, 82)
	PROP_SpawnState (0)
END_DEFAULTS

FState APuzzGemBlue2::States[] =
{
	S_NORMAL1 (AGB2, 'A',   -1, NULL, NULL),
};

------------------------------------------------------------------------

//========== Book 1 (Daemon Codex)

IMPLEMENT_ACTOR (APuzzBook1, Hexen, 9007, 83)
	PROP_SpawnState (0)
END_DEFAULTS

FState APuzzBook1::States[] =
{
	S_NORMAL1 (ABK1, 'A',   -1, NULL, NULL),
};

------------------------------------------------------------------------

//========== Book 2 (Liber Oscura)

IMPLEMENT_ACTOR (APuzzBook2, Hexen, 9008, 84)
	PROP_SpawnState (0)
END_DEFAULTS

FState APuzzBook2::States[] =
{
	S_NORMAL1 (ABK2, 'A',   -1, NULL, NULL),
};

------------------------------------------------------------------------

//========== Flame Mask

IMPLEMENT_ACTOR (APuzzFlameMask, Hexen, 9014, 0)
	PROP_SpawnState (0)
END_DEFAULTS

FState APuzzFlameMask::States[] =
{
	S_NORMAL1 (ASK2, 'A',   -1, NULL, NULL),
};

------------------------------------------------------------------------

//========== Fighter Weapon (Glaive Seal)

IMPLEMENT_ACTOR (APuzzFWeapon, Hexen, 9015, 0)
	PROP_SpawnState (0)
END_DEFAULTS

FState APuzzFWeapon::States[] =
{
	S_NORMAL1 (AFWP, 'A',   -1, NULL, NULL),
};

------------------------------------------------------------------------

//========== Cleric Weapon (Holy Relic)

IMPLEMENT_ACTOR (APuzzCWeapon, Hexen, 9016, 0)
	PROP_SpawnState (0)
END_DEFAULTS

FState APuzzCWeapon::States[] =
{
	S_NORMAL1 (ACWP, 'A',   -1, NULL, NULL),
};

------------------------------------------------------------------------

//========== Mage Weapon (Sigil of the Magus)

IMPLEMENT_ACTOR (APuzzMWeapon, Hexen, 9017, 0)
	PROP_SpawnState (0)
END_DEFAULTS

FState APuzzMWeapon::States[] =
{
	S_NORMAL1 (AMWP, 'A',   -1, NULL, NULL),
};

------------------------------------------------------------------------

//========== Clock Gear 1

IMPLEMENT_ACTOR (APuzzGear1, Hexen, 9018, 0)
	PROP_SpawnState (0)
END_DEFAULTS

FState APuzzGear1::States[] =
{
	S_BRIGHT (AGER, 'A',	4, NULL, &States[1]),
	S_BRIGHT (AGER, 'B',	4, NULL, &States[2]),
	S_BRIGHT (AGER, 'C',	4, NULL, &States[3]),
	S_BRIGHT (AGER, 'D',	4, NULL, &States[4]),
	S_BRIGHT (AGER, 'E',	4, NULL, &States[5]),
	S_BRIGHT (AGER, 'F',	4, NULL, &States[6]),
	S_BRIGHT (AGER, 'G',	4, NULL, &States[7]),
	S_BRIGHT (AGER, 'H',	4, NULL, &States[0]),
};

------------------------------------------------------------------------

//========== Clock Gear 2

IMPLEMENT_ACTOR (APuzzGear2, Hexen, 9019, 0)
	PROP_SpawnState (0)
END_DEFAULTS

FState APuzzGear2::States[] =
{
	S_BRIGHT (AGR2, 'A',	4, NULL, &States[1]),
	S_BRIGHT (AGR2, 'B',	4, NULL, &States[2]),
	S_BRIGHT (AGR2, 'C',	4, NULL, &States[3]),
	S_BRIGHT (AGR2, 'D',	4, NULL, &States[4]),
	S_BRIGHT (AGR2, 'E',	4, NULL, &States[5]),
	S_BRIGHT (AGR2, 'F',	4, NULL, &States[6]),
	S_BRIGHT (AGR2, 'G',	4, NULL, &States[7]),
	S_BRIGHT (AGR2, 'H',	4, NULL, &States[0]),
};

------------------------------------------------------------------------

//========== Clock Gear 3

IMPLEMENT_ACTOR (APuzzGear3, Hexen, 9020, 0)
	PROP_SpawnState (0)
END_DEFAULTS

FState APuzzGear3::States[] =
{
	S_BRIGHT (AGR3, 'A',	4, NULL, &States[1]),
	S_BRIGHT (AGR3, 'B',	4, NULL, &States[2]),
	S_BRIGHT (AGR3, 'C',	4, NULL, &States[3]),
	S_BRIGHT (AGR3, 'D',	4, NULL, &States[4]),
	S_BRIGHT (AGR3, 'E',	4, NULL, &States[5]),
	S_BRIGHT (AGR3, 'F',	4, NULL, &States[6]),
	S_BRIGHT (AGR3, 'G',	4, NULL, &States[7]),
	S_BRIGHT (AGR3, 'H',	4, NULL, &States[0]),
};

------------------------------------------------------------------------

//========== Clock Gear 4

FState APuzzGear4::States[] =
{
	S_BRIGHT (AGR4, 'A',	4, NULL, &States[1]),
	S_BRIGHT (AGR4, 'B',	4, NULL, &States[2]),
	S_BRIGHT (AGR4, 'C',	4, NULL, &States[3]),
	S_BRIGHT (AGR4, 'D',	4, NULL, &States[4]),
	S_BRIGHT (AGR4, 'E',	4, NULL, &States[5]),
	S_BRIGHT (AGR4, 'F',	4, NULL, &States[6]),
	S_BRIGHT (AGR4, 'G',	4, NULL, &States[7]),
	S_BRIGHT (AGR4, 'H',	4, NULL, &States[0]),
};

IMPLEMENT_ACTOR (APuzzGear4, Hexen, 9021, 0)
	PROP_SpawnState (0)
END_DEFAULTS

------------------------------------------------------------------------

//========== Fire Ball (intended to be spawned through ACS)

IMPLEMENT_ACTOR (AFireBall, Hexen, -1, 10)
	PROP_SpeedFixed (2)
	PROP_RadiusFixed (8)
	PROP_HeightFixed (8)
	PROP_Damage (4)
	PROP_DamageType (MOD_FIRE)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_RenderStyle (STYLE_Add)
	PROP_SpawnState (S_FIREBALL1_1)
	PROP_DeathState (S_FIREBALL1_X1)
	PROP_DeathSound ("Fireball")
END_DEFAULTS

FState AFireBall::States[] =
{
#define S_FIREBALL1_1 0
	S_BRIGHT (FBL1, 'A',	4, NULL, &States[S_FIREBALL1_1+1]),
	S_BRIGHT (FBL1, 'B',	4, NULL, &States[S_FIREBALL1_1]),

#define S_FIREBALL1_X1 (S_FIREBALL1_1+2)
	S_BRIGHT (XPL1, 'A',	4, NULL, &States[S_FIREBALL1_X1+1]),
	S_BRIGHT (XPL1, 'B',	4, NULL, &States[S_FIREBALL1_X1+2]),
	S_BRIGHT (XPL1, 'C',	4, NULL, &States[S_FIREBALL1_X1+3]),
	S_BRIGHT (XPL1, 'D',	4, NULL, &States[S_FIREBALL1_X1+4]),
	S_BRIGHT (XPL1, 'E',	4, NULL, &States[S_FIREBALL1_X1+5]),
	S_BRIGHT (XPL1, 'F',	4, NULL, NULL),
};

------------------------------------------------------------------------

//========== Arrow (intended to be spawned through ACS)

IMPLEMENT_ACTOR (AArrow, Hexen, -1, 50)
	PROP_SpeedFixed (6)
	PROP_RadiusFixed (8)
	PROP_HeightFixed (4)
	PROP_Damage (4)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_SpawnState (S_ARROW_1)
	PROP_DeathState (S_ARROW_X1)
END_DEFAULTS

FState AArrow::States[] =
{
#define S_ARROW_1 0
	S_NORMAL1(ARRW, 'A',   -1, NULL, NULL),

#define S_ARROW_X1 (S_ARROW_1+1)
	S_NORMAL1(ARRW, 'A',	1, NULL, NULL),
};

------------------------------------------------------------------------

//========== Dart (intended to be spawned through ACS)

IMPLEMENT_ACTOR (ADart, Hexen, -1, 51)
	PROP_SpeedFixed (6)
	PROP_RadiusFixed (8)
	PROP_HeightFixed (4)
	PROP_Damage (2)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_SpawnState (S_DART_1)
	PROP_DeathState (S_DART_X1)
END_DEFAULTS

FState ADart::States[] =
{
#define S_DART_1 0
	S_NORMAL1(DART, 'A',   -1, NULL, NULL),

#define S_DART_X1 (S_DART_1+1)
	S_NORMAL1(DART, 'A',	1, NULL, NULL),
};

------------------------------------------------------------------------

//========== Poisonous Dart (intended to be spawned through ACS)

IMPLEMENT_STATELESS_ACTOR (APoisonDart, Hexen, -1, 52)
END_DEFAULTS

------------------------------------------------------------------------

//========== Ripper Ball (intended to be spawned through ACS)

IMPLEMENT_ACTOR (ARipperBall, Hexen, -1, 53)
	PROP_SpeedFixed (6)
	PROP_RadiusFixed (8)
	PROP_Damage (2)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
	PROP_Flags2 (MF2_NOTELEPORT|MF2_RIP)
	PROP_SpawnState (S_RIPPERBALL_1)
	PROP_DeathState (S_RIPPERBALL_X1)
END_DEFAULTS

FState ARipperBall::States[] =
{
#define S_RIPPERBALL_1 0
	S_NORMAL1 (RIPP, 'A',	3, NULL, &States[S_RIPPERBALL_1+1]),
	S_NORMAL1 (RIPP, 'B',	3, NULL, &States[S_RIPPERBALL_1+2]),
	S_NORMAL1 (RIPP, 'C',	3, NULL, &States[S_RIPPERBALL_1]),

#define S_RIPPERBALL_X1 (S_RIPPERBALL_1+3)
	S_BRIGHT (CFCF, 'Q',	4, NULL, &States[S_RIPPERBALL_X1+1]),
	S_BRIGHT (CFCF, 'R',	3, NULL, &States[S_RIPPERBALL_X1+2]),
	S_BRIGHT (CFCF, 'S',	4, NULL, &States[S_RIPPERBALL_X1+3]),
	S_BRIGHT (CFCF, 'T',	3, NULL, &States[S_RIPPERBALL_X1+4]),
	S_BRIGHT (CFCF, 'U',	4, NULL, &States[S_RIPPERBALL_X1+5]),
	S_BRIGHT (CFCF, 'V',	3, NULL, &States[S_RIPPERBALL_X1+6]),
	S_BRIGHT (CFCF, 'W',	4, NULL, &States[S_RIPPERBALL_X1+7]),
	S_BRIGHT (CFCF, 'X',	3, NULL, &States[S_RIPPERBALL_X1+8]),
	S_BRIGHT (CFCF, 'Y',	4, NULL, &States[S_RIPPERBALL_X1+9]),
	S_BRIGHT (CFCF, 'Z',	3, NULL, NULL),
};

------------------------------------------------------------------------

//========== Projectile Blade (intended to be spawned through ACS)

IMPLEMENT_ACTOR (AProjectileBlade, Hexen, -1, 64)
	PROP_SpeedFixed (6)
	PROP_RadiusFixed (6)
	PROP_HeightFixed (6)
	PROP_Damage (3)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_SpawnState (S_PRJ_BLADE1)
	PROP_DeathState (S_PRJ_BLADE_X1)
END_DEFAULTS

FState AProjectileBlade::States[] =
{
#define S_PRJ_BLADE1 0
	S_NORMAL1 (BLAD, 'A',   -1, NULL, NULL),

#define S_PRJ_BLADE_X1 (S_PRJ_BLADE1+1)
	S_NORMAL1 (BLAD, 'A',	 1, NULL, NULL),
};

------------------------------------------------------------------------

//========== Stalkers are 'underwater' serpents in Hexen.

IMPLEMENT_ACTOR (ASerpent, Hexen, 121, 6)
	PROP_SpawnHealth (90)
	PROP_PainChance (96)
	PROP_SpeedFixed (12)
	PROP_RadiusFixed (32)
	PROP_HeightFixed (70)
	PROP_MassLong (0x7fffffff)
	PROP_Flags (MF_SOLID|MF_NOBLOOD|MF_COUNTKILL)
	PROP_Flags2 (MF2_PASSMOBJ|MF2_MCROSS|MF2_CANTLEAVEFLOORPIC|MF2_NONSHOOTABLE)
	PROP_Flags3 (MF3_STAYMORPHED|MF3_DONTBLAST|MF3_NOTELEOTHER)
	PROP_RenderFlags (RF_INVISIBLE)
	PROP_SpawnState (S_SERPENT_LOOK1)
	PROP_SeeState (S_SERPENT_SWIM1)
	PROP_PainState (S_SERPENT_PAIN1)
	PROP_MeleeState (S_SERPENT_SURFACE1)
	PROP_DeathState (S_SERPENT_DIE1)
	PROP_XDeathState (S_SERPENT_XDIE1)
	PROP_IDeathState (S_SERPENT_ICE)
	PROP_SeeSound ("SerpentSight")
	PROP_AttackSound ("SerpentAttack")
	PROP_PainSound ("SerpentPain")
	PROP_DeathSound ("SerpentDeath")
END_DEFAULTS

FState ASerpent::States[] =
{
#define S_SERPENT_LOOK1 0
	S_NORMAL1 (SSPT, 'H',   10, A_Look		, &States[S_SERPENT_LOOK1]),

#define S_SERPENT_SWIM1 (S_SERPENT_LOOK1+1)
	S_NORMAL1 (SSPT, 'H',    1, A_SerpentChase	, &States[S_SERPENT_SWIM1+1]),
	S_NORMAL1 (SSPT, 'H',    1, A_SerpentChase	, &States[S_SERPENT_SWIM1+2]),
	S_NORMAL1 (SSPT, 'H',    2, A_SerpentHumpDecide	, &States[S_SERPENT_SWIM1]),

#define S_SERPENT_PAIN1 (S_SERPENT_SWIM1+3)
	S_NORMAL1 (SSPT, 'L',    5, NULL		, &States[S_SERPENT_PAIN1+1]),
	S_NORMAL1 (SSPT, 'L',    5, A_Pain		, &States[S_SERPENT_PAIN1+2]),
	S_NORMAL1 (SSDV, 'A',    4, NULL		, &States[S_SERPENT_PAIN1+3]),
	S_NORMAL1 (SSDV, 'B',    4, NULL		, &States[S_SERPENT_PAIN1+4]),
	S_NORMAL1 (SSDV, 'C',    4, NULL		, &States[S_SERPENT_PAIN1+5]),
	S_NORMAL1 (SSDV, 'D',    4, A_UnSetShootable	, &States[S_SERPENT_PAIN1+6]),
	S_NORMAL1 (SSDV, 'E',    3, A_SerpentDiveSound	, &States[S_SERPENT_PAIN1+7]),
	S_NORMAL1 (SSDV, 'F',    3, NULL		, &States[S_SERPENT_PAIN1+8]),
	S_NORMAL1 (SSDV, 'G',    4, NULL		, &States[S_SERPENT_PAIN1+9]),
	S_NORMAL1 (SSDV, 'H',    4, NULL		, &States[S_SERPENT_PAIN1+10]),
	S_NORMAL1 (SSDV, 'I',    3, NULL		, &States[S_SERPENT_PAIN1+11]),
	S_NORMAL1 (SSDV, 'J',    3, A_SerpentHide	, &States[S_SERPENT_SWIM1]),

#define S_SERPENT_SURFACE1 (S_SERPENT_PAIN1+12)
	S_NORMAL1 (SSPT, 'A',    1, A_UnHideThing	, &States[S_SERPENT_SURFACE1+1]),
	S_NORMAL1 (SSPT, 'A',    1, A_SerpentBirthScream, &States[S_SERPENT_SURFACE1+2]),
	S_NORMAL1 (SSPT, 'B',    3, A_SetShootable	, &States[S_SERPENT_SURFACE1+3]),
	S_NORMAL1 (SSPT, 'C',    3, NULL		, &States[S_SERPENT_SURFACE1+4]),
	S_NORMAL1 (SSPT, 'D',    4, A_SerpentCheckForAttack, &States[S_SERPENT_PAIN1+2]),

#define S_SERPENT_DIE1 (S_SERPENT_SURFACE1+5)
	S_NORMAL1 (SSPT, 'O',    4, NULL		, &States[S_SERPENT_DIE1+1]),
	S_NORMAL1 (SSPT, 'P',    4, A_Scream		, &States[S_SERPENT_DIE1+2]),
	S_NORMAL1 (SSPT, 'Q',    4, A_NoBlocking	, &States[S_SERPENT_DIE1+3]),
	S_NORMAL1 (SSPT, 'R',    4, NULL		, &States[S_SERPENT_DIE1+4]),
	S_NORMAL1 (SSPT, 'S',    4, NULL		, &States[S_SERPENT_DIE1+5]),
	S_NORMAL1 (SSPT, 'T',    4, NULL		, &States[S_SERPENT_DIE1+6]),
	S_NORMAL1 (SSPT, 'U',    4, NULL		, &States[S_SERPENT_DIE1+7]),
	S_NORMAL1 (SSPT, 'V',    4, NULL		, &States[S_SERPENT_DIE1+8]),
	S_NORMAL1 (SSPT, 'W',    4, NULL		, &States[S_SERPENT_DIE1+9]),
	S_NORMAL1 (SSPT, 'X',    4, NULL		, &States[S_SERPENT_DIE1+10]),
	S_NORMAL1 (SSPT, 'Y',    4, NULL		, &States[S_SERPENT_DIE1+11]),
	S_NORMAL1 (SSPT, 'Z',    4, NULL		, NULL),

#define S_SERPENT_XDIE1 (S_SERPENT_DIE1+12)
	S_NORMAL1 (SSXD, 'A',    4, NULL		, &States[S_SERPENT_XDIE1+1]),
	S_NORMAL1 (SSXD, 'B',    4, A_SerpentHeadPop	, &States[S_SERPENT_XDIE1+2]),
	S_NORMAL1 (SSXD, 'C',    4, A_NoBlocking	, &States[S_SERPENT_XDIE1+3]),
	S_NORMAL1 (SSXD, 'D',    4, NULL		, &States[S_SERPENT_XDIE1+4]),
	S_NORMAL1 (SSXD, 'E',    4, NULL		, &States[S_SERPENT_XDIE1+5]),
	S_NORMAL1 (SSXD, 'F',    3, NULL		, &States[S_SERPENT_XDIE1+6]),
	S_NORMAL1 (SSXD, 'G',    3, NULL		, &States[S_SERPENT_XDIE1+7]),
	S_NORMAL1 (SSXD, 'H',    3, A_SerpentSpawnGibs	, NULL),

#define S_SERPENT_WALK1 (S_SERPENT_XDIE1+8)
	S_NORMAL1 (SSPT, 'I',    5, A_SerpentWalk	, &States[S_SERPENT_WALK1+1]),
	S_NORMAL1 (SSPT, 'J',    5, A_SerpentWalk	, &States[S_SERPENT_WALK1+2]),
	S_NORMAL1 (SSPT, 'I',    5, A_SerpentWalk	, &States[S_SERPENT_WALK1+3]),
	S_NORMAL1 (SSPT, 'J',    5, A_SerpentCheckForAttack, &States[S_SERPENT_PAIN1+2]),

#define S_SERPENT_HUMP1 (S_SERPENT_WALK1+4)
	S_NORMAL1 (SSPT, 'H',    3, A_SerpentUnHide	, &States[S_SERPENT_HUMP1+1]),
	S_NORMAL1 (SSPT, 'E',    3, A_SerpentRaiseHump	, &States[S_SERPENT_HUMP1+2]),
	S_NORMAL1 (SSPT, 'F',    3, A_SerpentRaiseHump	, &States[S_SERPENT_HUMP1+3]),
	S_NORMAL1 (SSPT, 'G',    3, A_SerpentRaiseHump	, &States[S_SERPENT_HUMP1+4]),
	S_NORMAL1 (SSPT, 'E',    3, A_SerpentRaiseHump	, &States[S_SERPENT_HUMP1+5]),
	S_NORMAL1 (SSPT, 'F',    3, A_SerpentRaiseHump	, &States[S_SERPENT_HUMP1+6]),
	S_NORMAL1 (SSPT, 'G',    3, NULL		, &States[S_SERPENT_HUMP1+7]),
	S_NORMAL1 (SSPT, 'E',    3, NULL		, &States[S_SERPENT_HUMP1+8]),
	S_NORMAL1 (SSPT, 'F',    3, NULL		, &States[S_SERPENT_HUMP1+9]),
	S_NORMAL1 (SSPT, 'G',    3, A_SerpentLowerHump	, &States[S_SERPENT_HUMP1+10]),
	S_NORMAL1 (SSPT, 'E',    3, A_SerpentLowerHump	, &States[S_SERPENT_HUMP1+11]),
	S_NORMAL1 (SSPT, 'F',    3, A_SerpentLowerHump	, &States[S_SERPENT_HUMP1+12]),
	S_NORMAL1 (SSPT, 'G',    3, A_SerpentLowerHump	, &States[S_SERPENT_HUMP1+13]),
	S_NORMAL1 (SSPT, 'E',    3, A_SerpentLowerHump	, &States[S_SERPENT_HUMP1+14]),
	S_NORMAL1 (SSPT, 'F',    3, A_SerpentHide	, &States[S_SERPENT_SWIM1]),

#define S_SERPENT_MELEE1 (S_SERPENT_HUMP1+15)
	S_NORMAL1 (SSPT, 'N',    5, A_SerpentMeleeAttack, &ASerpent::States[S_SERPENT_PAIN1+2]),

#define S_SERPENT_MISSILE1 (S_SERPENT_MELEE1+1)
	S_NORMAL1 (SSPT, 'N',    5, A_SerpentMissileAttack, &ASerpent::States[S_SERPENT_PAIN1+2]),

#define S_SERPENT_ATK1 (S_SERPENT_MISSILE1+1)
	S_NORMAL1 (SSPT, 'K',    6, A_FaceTarget	, &States[S_SERPENT_ATK1+1]),
	S_NORMAL1 (SSPT, 'L',    5, A_SerpentChooseAttack, &States[S_SERPENT_MELEE1]),

#define S_SERPENT_ICE (S_SERPENT_ATK1+2)
	S_NORMAL1 (SSPT, '[',    5, A_FreezeDeath	, &States[S_SERPENT_ICE+1]),
	S_NORMAL1 (SSPT, '[',    1, A_FreezeDeathChunks	, &States[S_SERPENT_ICE+1]),
};

------------------------------------------------------------------------

//========== Stalker variants that can throw a slimy ball from range.

IMPLEMENT_STATELESS_ACTOR (ASerpentLeader, Hexen, 120, 7)
	PROP_Mass (200)
END_DEFAULTS

------------------------------------------------------------------------

//========== The slimy green ball of acid thrown by a stalker leader.

IMPLEMENT_ACTOR (ASerpentFX, Hexen, -1, 0)
	PROP_SpeedFixed (15)
	PROP_RadiusFixed (8)
	PROP_HeightFixed (10)
	PROP_Damage (4)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_Flags4 (MF4_BLOODSPLATTER)
	PROP_SpawnState (S_SERPENT_FX1)
	PROP_DeathState (S_SERPENT_FX_X1)
	PROP_DeathSound ("SerpentFXHit")
END_DEFAULTS

FState ASerpentFX::States[] =
{
#define S_SERPENT_FX1 0
	// [RH] This 0-length state was added so that the looping sound can start
	// playing as soon as possible, because action functions are not called
	// when an actor is spawned. (Should I change that?)
	S_BRIGHT (SSFX, 'A',    0, NULL			, &States[S_SERPENT_FX1+1]),
	S_BRIGHT (SSFX, 'A',    3, A_SerpentFXSound	, &States[S_SERPENT_FX1+2]),
	S_BRIGHT (SSFX, 'B',    3, NULL			, &States[S_SERPENT_FX1+3]),
	S_BRIGHT (SSFX, 'A',    3, NULL			, &States[S_SERPENT_FX1+4]),
	S_BRIGHT (SSFX, 'B',    3, NULL			, &States[S_SERPENT_FX1+1]),

#define S_SERPENT_FX_X1 (S_SERPENT_FX1+5)
	S_BRIGHT (SSFX, 'C',    4, A_StopSerpentFXSound	, &States[S_SERPENT_FX_X1+1]),
	S_BRIGHT (SSFX, 'D',    4, NULL			, &States[S_SERPENT_FX_X1+2]),
	S_BRIGHT (SSFX, 'E',    4, NULL			, &States[S_SERPENT_FX_X1+3]),
	S_BRIGHT (SSFX, 'F',    4, NULL			, &States[S_SERPENT_FX_X1+4]),
	S_BRIGHT (SSFX, 'G',    4, NULL			, &States[S_SERPENT_FX_X1+5]),
	S_BRIGHT (SSFX, 'H',    4, NULL			, NULL),
};

------------------------------------------------------------------------

//========== The head of a stalker or a stalker leader. It is spawned when gibbed.

IMPLEMENT_ACTOR (ASerpentHead, Hexen, -1, 0)
	PROP_RadiusFixed (5)
	PROP_HeightFixed (10)
	PROP_Flags (MF_NOBLOCKMAP)
	PROP_Flags2 (MF2_LOGRAV)
	PROP_SpawnState (S_SERPENT_HEAD1)
	PROP_DeathState (S_SERPENT_HEAD_X1)
END_DEFAULTS

FState ASerpentHead::States[] =
{
#define S_SERPENT_HEAD1 0
	S_NORMAL1 (SSXD, 'I',    4, A_SerpentHeadCheck	, &States[S_SERPENT_HEAD1+1]),
	S_NORMAL1 (SSXD, 'J',    4, A_SerpentHeadCheck	, &States[S_SERPENT_HEAD1+2]),
	S_NORMAL1 (SSXD, 'K',    4, A_SerpentHeadCheck	, &States[S_SERPENT_HEAD1+3]),
	S_NORMAL1 (SSXD, 'L',    4, A_SerpentHeadCheck	, &States[S_SERPENT_HEAD1+4]),
	S_NORMAL1 (SSXD, 'M',    4, A_SerpentHeadCheck	, &States[S_SERPENT_HEAD1+5]),
	S_NORMAL1 (SSXD, 'N',    4, A_SerpentHeadCheck	, &States[S_SERPENT_HEAD1+6]),
	S_NORMAL1 (SSXD, 'O',    4, A_SerpentHeadCheck	, &States[S_SERPENT_HEAD1+7]),
	S_NORMAL1 (SSXD, 'P',    4, A_SerpentHeadCheck	, &States[S_SERPENT_HEAD1]),

#define S_SERPENT_HEAD_X1 (S_SERPENT_HEAD1+8)
	S_NORMAL1 (SSXD, 'S',   -1, NULL		, &States[S_SERPENT_HEAD_X1]),
};

------------------------------------------------------------------------

//========== A meat chunk from a stalker or a stalker leader. It is spawned when gibbed.

IMPLEMENT_ACTOR (ASerpentGib1, Hexen, -1, 0)
	PROP_RadiusFixed (3)
	PROP_HeightFixed (3)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
	PROP_SpawnState (S_SERPENT_GIB1_1)
END_DEFAULTS

FState ASerpentGib1::States[] =
{
#define S_SERPENT_GIB1_1 0
	S_NORMAL1 (SSXD, 'Q',    6, NULL	, &States[S_SERPENT_GIB1_1+1]),
	S_NORMAL1 (SSXD, 'Q',    6, A_FloatGib	, &States[S_SERPENT_GIB1_1+2]),
	S_NORMAL1 (SSXD, 'Q',    8, A_FloatGib	, &States[S_SERPENT_GIB1_1+3]),
	S_NORMAL1 (SSXD, 'Q',    8, A_FloatGib	, &States[S_SERPENT_GIB1_1+4]),
	S_NORMAL1 (SSXD, 'Q',   12, A_FloatGib	, &States[S_SERPENT_GIB1_1+5]),
	S_NORMAL1 (SSXD, 'Q',   12, A_FloatGib	, &States[S_SERPENT_GIB1_1+6]),
	S_NORMAL1 (SSXD, 'Q',  232, A_DelayGib	, &States[S_SERPENT_GIB1_1+7]),
	S_NORMAL1 (SSXD, 'Q',   12, A_SinkGib	, &States[S_SERPENT_GIB1_1+8]),
	S_NORMAL1 (SSXD, 'Q',   12, A_SinkGib	, &States[S_SERPENT_GIB1_1+9]),
	S_NORMAL1 (SSXD, 'Q',    8, A_SinkGib	, &States[S_SERPENT_GIB1_1+10]),
	S_NORMAL1 (SSXD, 'Q',    8, A_SinkGib	, &States[S_SERPENT_GIB1_1+11]),
	S_NORMAL1 (SSXD, 'Q',    8, A_SinkGib	, NULL),
};

------------------------------------------------------------------------

//========== A stalker or a stalker leader arm. It is spawned when gibbed.

IMPLEMENT_ACTOR (ASerpentGib2, Hexen, -1, 0)
	PROP_RadiusFixed (3)
	PROP_HeightFixed (3)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
	PROP_SpawnState (S_SERPENT_GIB2_1)
END_DEFAULTS

FState ASerpentGib2::States[] =
{
#define S_SERPENT_GIB2_1 0
	S_NORMAL1 (SSXD, 'R',    6, NULL	, &States[S_SERPENT_GIB2_1+1]),
	S_NORMAL1 (SSXD, 'R',    6, A_FloatGib	, &States[S_SERPENT_GIB2_1+2]),
	S_NORMAL1 (SSXD, 'R',    8, A_FloatGib	, &States[S_SERPENT_GIB2_1+3]),
	S_NORMAL1 (SSXD, 'R',    8, A_FloatGib	, &States[S_SERPENT_GIB2_1+4]),
	S_NORMAL1 (SSXD, 'R',   12, A_FloatGib	, &States[S_SERPENT_GIB2_1+5]),
	S_NORMAL1 (SSXD, 'R',   12, A_FloatGib	, &States[S_SERPENT_GIB2_1+6]),
	S_NORMAL1 (SSXD, 'R',  232, A_DelayGib	, &States[S_SERPENT_GIB2_1+7]),
	S_NORMAL1 (SSXD, 'R',   12, A_SinkGib	, &States[S_SERPENT_GIB2_1+8]),
	S_NORMAL1 (SSXD, 'R',   12, A_SinkGib	, &States[S_SERPENT_GIB2_1+9]),
	S_NORMAL1 (SSXD, 'R',    8, A_SinkGib	, &States[S_SERPENT_GIB2_1+10]),
	S_NORMAL1 (SSXD, 'R',    8, A_SinkGib	, &States[S_SERPENT_GIB2_1+11]),
	S_NORMAL1 (SSXD, 'R',    8, A_SinkGib	, NULL),
};

------------------------------------------------------------------------

//========== A small meat chunk from a stalker or a stalker leader. It is spawned when gibbed.

IMPLEMENT_ACTOR (ASerpentGib3, Hexen, -1, 0)
	PROP_RadiusFixed (3)
	PROP_HeightFixed (3)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
	PROP_SpawnState (S_SERPENT_GIB3_1)
END_DEFAULTS

FState ASerpentGib3::States[] =
{
#define S_SERPENT_GIB3_1 0
	S_NORMAL1 (SSXD, 'T',    6, NULL	, &States[S_SERPENT_GIB3_1+1]),
	S_NORMAL1 (SSXD, 'T',    6, A_FloatGib	, &States[S_SERPENT_GIB3_1+2]),
	S_NORMAL1 (SSXD, 'T',    8, A_FloatGib	, &States[S_SERPENT_GIB3_1+3]),
	S_NORMAL1 (SSXD, 'T',    8, A_FloatGib	, &States[S_SERPENT_GIB3_1+4]),
	S_NORMAL1 (SSXD, 'T',   12, A_FloatGib	, &States[S_SERPENT_GIB3_1+5]),
	S_NORMAL1 (SSXD, 'T',   12, A_FloatGib	, &States[S_SERPENT_GIB3_1+6]),
	S_NORMAL1 (SSXD, 'T',  232, A_DelayGib	, &States[S_SERPENT_GIB3_1+7]),
	S_NORMAL1 (SSXD, 'T',   12, A_SinkGib	, &States[S_SERPENT_GIB3_1+8]),
	S_NORMAL1 (SSXD, 'T',   12, A_SinkGib	, &States[S_SERPENT_GIB3_1+9]),
	S_NORMAL1 (SSXD, 'T',    8, A_SinkGib	, &States[S_SERPENT_GIB3_1+10]),
	S_NORMAL1 (SSXD, 'T',    8, A_SinkGib	, &States[S_SERPENT_GIB3_1+11]),
	S_NORMAL1 (SSXD, 'T',    8, A_SinkGib	, NULL),
};

------------------------------------------------------------------------

//========== Speed Boots Artifact

IMPLEMENT_ACTOR (AArtiSpeedBoots, Hexen, 8002, 13)
	PROP_Flags (MF_SPECIAL)
	PROP_Flags2 (MF2_FLOATBOB)
	PROP_SpawnState (0)
END_DEFAULTS

FState AArtiSpeedBoots::States[] =
{
	S_BRIGHT (SPED, 'A',	3, NULL, &States[1]),
	S_BRIGHT (SPED, 'B',	3, NULL, &States[2]),
	S_BRIGHT (SPED, 'C',	3, NULL, &States[3]),
	S_BRIGHT (SPED, 'D',	3, NULL, &States[4]),
	S_BRIGHT (SPED, 'E',	3, NULL, &States[5]),
	S_BRIGHT (SPED, 'F',	3, NULL, &States[6]),
	S_BRIGHT (SPED, 'G',	3, NULL, &States[7]),
	S_BRIGHT (SPED, 'H',	3, NULL, &States[0]),
};

------------------------------------------------------------------------

//========== Dirt clump (spawned by spike)

IMPLEMENT_ACTOR (ADirtClump, Hexen, -1, 0)
	PROP_Flags (MF_NOBLOCKMAP)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_SpawnState (0)
END_DEFAULTS

FState ADirtClump::States[] =
{
	S_NORMAL1 (TSPK, 'C',   20, NULL, &States[0])
};

------------------------------------------------------------------------

//========== Spike up

IMPLEMENT_STATELESS_ACTOR (AThrustFloorUp, Hexen, 10091, 104)
	PROP_Flags (MF_SOLID)
	PROP_Flags2 (MF2_NOTELEPORT|MF2_FLOORCLIP)
	PROP_SpawnState (S_THRUSTINIT2)
END_DEFAULTS

------------------------------------------------------------------------

//========== Spike down

IMPLEMENT_STATELESS_ACTOR (AThrustFloorDown, Hexen, 10090, 105)
	PROP_Flags2 (MF2_NOTELEPORT|MF2_FLOORCLIP)
	PROP_RenderFlags (RF_INVISIBLE)
	PROP_SpawnState (S_THRUSTINIT1)
END_DEFAULTS

------------------------------------------------------------------------

//========== Dark Servant Artifact

IMPLEMENT_ACTOR (AArtiDarkServant, Hexen, 86, 16)
	PROP_Flags (MF_SPECIAL)
	PROP_Flags2 (MF2_FLOATBOB)
	PROP_SpawnState (S_ARTI_SUMMON)
	PROP_PickupSound ("misc/p_pkup")
END_DEFAULTS

FState AArtiDarkServant::States[] =
{
#define S_ARTI_SUMMON 0
	S_NORMAL1(SUMN, 'A',  350, NULL, &States[S_ARTI_SUMMON]),
};

------------------------------------------------------------------------

//========== Summoning Doll

IMPLEMENT_ACTOR (ASummoningDoll, Hexen, -1, 0)
	PROP_SpeedFixed (20)
	PROP_Flags (MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_SpawnState (S_SUMMON_FX1_1)
	PROP_DeathState (S_SUMMON_FX2_1)
END_DEFAULTS

FState ASummoningDoll::States[] =
{
#define S_SUMMON_FX1_1 0
	S_NORMAL1(SUMN, 'A',	4, NULL		, &States[S_SUMMON_FX1_1]),

#define S_SUMMON_FX2_1 (S_SUMMON_FX1_1+1)
	S_NORMAL1(SUMN, 'A',	4, NULL		, &States[S_SUMMON_FX2_1+1]),
	S_NORMAL1(SUMN, 'A',	4, NULL		, &States[S_SUMMON_FX2_1+2]),
	S_NORMAL1(SUMN, 'A',	4, A_Summon	, NULL),
};

------------------------------------------------------------------------

//========== Minotaur Smoke

IMPLEMENT_ACTOR (AMinotaurSmoke, Hexen, -1, 0)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_RenderStyle (STYLE_Translucent)
	PROP_Alpha (HX_SHADOW)
	PROP_SpawnState (0)
END_DEFAULTS

FState AMinotaurSmoke::States[] =
{
	S_NORMAL1(MNSM, 'A',	3, NULL, &States[1]),
	S_NORMAL1(MNSM, 'B',	3, NULL, &States[2]),
	S_NORMAL1(MNSM, 'C',	3, NULL, &States[3]),
	S_NORMAL1(MNSM, 'D',	3, NULL, &States[4]),
	S_NORMAL1(MNSM, 'E',	3, NULL, &States[5]),
	S_NORMAL1(MNSM, 'F',	3, NULL, &States[6]),
	S_NORMAL1(MNSM, 'G',	3, NULL, &States[7]),
	S_NORMAL1(MNSM, 'H',	3, NULL, &States[8]),
	S_NORMAL1(MNSM, 'I',	3, NULL, &States[9]),
	S_NORMAL1(MNSM, 'J',	3, NULL, &States[10]),
	S_NORMAL1(MNSM, 'K',	3, NULL, &States[11]),
	S_NORMAL1(MNSM, 'L',	3, NULL, &States[12]),
	S_NORMAL1(MNSM, 'M',	3, NULL, &States[13]),
	S_NORMAL1(MNSM, 'N',	3, NULL, &States[14]),
	S_NORMAL1(MNSM, 'O',	3, NULL, &States[15]),
	S_NORMAL1(MNSM, 'P',	3, NULL, &States[16]),
	S_NORMAL1(MNSM, 'Q',	3, NULL, NULL),
};

------------------------------------------------------------------------

//========== Banishment device blast

IMPLEMENT_ACTOR (ATelOtherFX1, Any, -1, 0)
	PROP_DamageLong (10001)
	PROP_Flags (MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY|MF_NOBLOCKMAP)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_Flags3 (MF3_BLOODLESSIMPACT)
	PROP_RadiusFixed (16)
	PROP_HeightFixed (16)
	PROP_SpeedFixed (20)
	PROP_SpawnState (S_TELO_FX1)
	PROP_DeathState (S_TELO_FX_DONE)
END_DEFAULTS

FState ATelOtherFX1::States[] =
{
#define S_TELO_FX1 0
	S_BRIGHT (TRNG, 'E',    5, NULL		, &States[S_TELO_FX1+1]),
	S_BRIGHT (TRNG, 'D',    4, NULL		, &States[S_TELO_FX1+2]),
	S_BRIGHT (TRNG, 'C',    3, A_TeloSpawnC	, &States[S_TELO_FX1+3]),
	S_BRIGHT (TRNG, 'B',    3, A_TeloSpawnB	, &States[S_TELO_FX1+4]),
	S_BRIGHT (TRNG, 'A',    3, A_TeloSpawnA	, &States[S_TELO_FX1+5]),
	S_BRIGHT (TRNG, 'B',    3, A_TeloSpawnB	, &States[S_TELO_FX1+6]),
	S_BRIGHT (TRNG, 'C',    3, A_TeloSpawnC	, &States[S_TELO_FX1+7]),
	S_BRIGHT (TRNG, 'D',    3, A_TeloSpawnD	, &States[S_TELO_FX1+2]),

#define S_TELO_FX_DONE (S_TELO_FX1+8)
	S_BRIGHT (TRNG, 'E',    3, NULL		, NULL),

#define S_TELO_FX2 (S_TELO_FX_DONE+1)
	S_BRIGHT (TRNG, 'B',    4, NULL		, &States[S_TELO_FX2+1]),
	S_BRIGHT (TRNG, 'C',    4, NULL		, &States[S_TELO_FX2+2]),
	S_BRIGHT (TRNG, 'D',    4, NULL		, &States[S_TELO_FX2+3]),
	S_BRIGHT (TRNG, 'C',    4, NULL		, &States[S_TELO_FX2+4]),
	S_BRIGHT (TRNG, 'B',    4, NULL		, &States[S_TELO_FX2+5]),
	S_BRIGHT (TRNG, 'A',    4, A_CheckTeleRing, &States[S_TELO_FX2+0]),

#define S_TELO_FX3 (S_TELO_FX2+6)
	S_BRIGHT (TRNG, 'C',    4, NULL		, &States[S_TELO_FX3+1]),
	S_BRIGHT (TRNG, 'D',    4, NULL		, &States[S_TELO_FX3+2]),
	S_BRIGHT (TRNG, 'C',    4, NULL		, &States[S_TELO_FX3+3]),
	S_BRIGHT (TRNG, 'B',    4, NULL		, &States[S_TELO_FX3+4]),
	S_BRIGHT (TRNG, 'A',    4, NULL		, &States[S_TELO_FX3+5]),
	S_BRIGHT (TRNG, 'B',    4, A_CheckTeleRing, &States[S_TELO_FX3+0]),

#define S_TELO_FX4 (S_TELO_FX3+6)
	S_BRIGHT (TRNG, 'D',    4, NULL		, &States[S_TELO_FX4+1]),
	S_BRIGHT (TRNG, 'C',    4, NULL		, &States[S_TELO_FX4+2]),
	S_BRIGHT (TRNG, 'B',    4, NULL		, &States[S_TELO_FX4+3]),
	S_BRIGHT (TRNG, 'A',    4, NULL		, &States[S_TELO_FX4+4]),
	S_BRIGHT (TRNG, 'B',    4, NULL		, &States[S_TELO_FX4+5]),
	S_BRIGHT (TRNG, 'C',    4, A_CheckTeleRing, &States[S_TELO_FX4+0]),

#define S_TELO_FX5 (S_TELO_FX4+6)
	S_BRIGHT (TRNG, 'C',    4, NULL		, &States[S_TELO_FX5+1]),
	S_BRIGHT (TRNG, 'B',    4, NULL		, &States[S_TELO_FX5+2]),
	S_BRIGHT (TRNG, 'A',    4, NULL		, &States[S_TELO_FX5+3]),
	S_BRIGHT (TRNG, 'B',    4, NULL		, &States[S_TELO_FX5+4]),
	S_BRIGHT (TRNG, 'C',    4, NULL		, &States[S_TELO_FX5+5]),
	S_BRIGHT (TRNG, 'D',    4, A_CheckTeleRing, &States[S_TELO_FX5+0])
};

------------------------------------------------------------------------

//========== Banishment device blast

IMPLEMENT_STATELESS_ACTOR (ATelOtherFX2, Any, -1, 0)
	PROP_SpeedFixed (16)
	PROP_SpawnState (S_TELO_FX2)
END_DEFAULTS

------------------------------------------------------------------------

//========== Banishment device blast

IMPLEMENT_STATELESS_ACTOR (ATelOtherFX3, Any, -1, 0)
	PROP_SpeedFixed (16)
	PROP_SpawnState (S_TELO_FX3)
END_DEFAULTS

------------------------------------------------------------------------

//========== Banishment device blast

IMPLEMENT_STATELESS_ACTOR (ATelOtherFX4, Any, -1, 0)
	PROP_SpeedFixed (16)
	PROP_SpawnState (S_TELO_FX4)
END_DEFAULTS

------------------------------------------------------------------------

//========== Banishment device blast

IMPLEMENT_STATELESS_ACTOR (ATelOtherFX5, Any, -1, 0)
	PROP_SpeedFixed (16)
	PROP_SpawnState (S_TELO_FX5)
END_DEFAULTS

------------------------------------------------------------------------

//========== Banishment Device: teleports an enemy to a random deathmatch start.

IMPLEMENT_ACTOR (AArtiTeleportOther, Hexen, 10040, 17)
	PROP_Flags (MF_SPECIAL)
	PROP_Flags2 (MF2_FLOATBOB)
	PROP_SpawnState (S_ARTI_TELOTHER1)
	PROP_PickupSound ("misc/p_pkup")
END_DEFAULTS

FState AArtiTeleportOther::States[] =
{
#define S_ARTI_TELOTHER1 0
	S_NORMAL1(TELO, 'A',	5, NULL, &States[S_ARTI_TELOTHER1+1]),
	S_NORMAL1(TELO, 'B',	5, NULL, &States[S_ARTI_TELOTHER1+2]),
	S_NORMAL1(TELO, 'C',	5, NULL, &States[S_ARTI_TELOTHER1+3]),
	S_NORMAL1(TELO, 'D',	5, NULL, &States[S_ARTI_TELOTHER1]),
};

------------------------------------------------------------------------

//========== Reivers are enemies in Hexen. Those flying monsters look like the upper half of a human's body, and throw fireballs.

IMPLEMENT_ACTOR (AWraith, Hexen, 34, 8)
	PROP_SpawnHealth (150)
	PROP_PainChance (25)
	PROP_SpeedFixed (11)
	PROP_HeightFixed (55)
	PROP_Mass (75)
	PROP_Damage (10)
	PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_NOGRAVITY|MF_DROPOFF|MF_FLOAT|MF_COUNTKILL)
	PROP_Flags2 (MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_TELESTOMP|MF2_PUSHWALL)
	PROP_SpawnState (S_WRAITH_INIT1)
	PROP_SeeState (S_WRAITH_CHASE1)
	PROP_PainState (S_WRAITH_PAIN1)
	PROP_MeleeState (S_WRAITH_ATK1_1)
	PROP_MissileState (S_WRAITH_ATK2_1)
	PROP_DeathState (S_WRAITH_DEATH1_1)
	PROP_XDeathState (S_WRAITH_DEATH2_1)
	PROP_IDeathState (S_WRAITH_ICE)
	PROP_SeeSound ("WraithSight")
	PROP_AttackSound ("WraithAttack")
	PROP_PainSound ("WraithPain")
	PROP_DeathSound ("WraithDeath")
	PROP_ActiveSound ("WraithActive")
END_DEFAULTS

FState AWraith::States[] =
{
#define S_WRAITH_LOOK1 0
	S_NORMAL1(WRTH, 'A',   15, A_WraithLook		, &States[S_WRAITH_LOOK1+1]),
	S_NORMAL1(WRTH, 'B',   15, A_WraithLook		, &States[S_WRAITH_LOOK1]),

#define S_WRAITH_RAISE1 (S_WRAITH_LOOK1+2)
	S_NORMAL1(WRTH, 'A',	2, A_WraithRaiseInit	, &States[S_WRAITH_RAISE1+1]),
	S_NORMAL1(WRTH, 'A',	2, A_WraithRaise	, &States[S_WRAITH_RAISE1+2]),
	S_NORMAL1(WRTH, 'A',	2, A_FaceTarget		, &States[S_WRAITH_RAISE1+3]),
	S_NORMAL1(WRTH, 'B',	2, A_WraithRaise	, &States[S_WRAITH_RAISE1+4]),
	S_NORMAL1(WRTH, 'B',	2, A_WraithRaise	, &States[S_WRAITH_RAISE1+1]),

#define S_WRAITH_ICE (S_WRAITH_RAISE1+5)
	S_NORMAL1(WRT2, 'I',	5, A_FreezeDeath	, &States[S_WRAITH_ICE+1]),
	S_NORMAL1(WRT2, 'I',	1, A_FreezeDeathChunks	, &States[S_WRAITH_ICE+1]),

#define S_WRAITH_INIT1 (S_WRAITH_ICE+2)
	S_NORMAL1(WRTH, 'A',   10, NULL			, &States[S_WRAITH_INIT1+1]),
	S_NORMAL1(WRTH, 'B',	5, A_WraithInit		, &States[S_WRAITH_LOOK1]),

#define S_WRAITH_CHASE1 (S_WRAITH_INIT1+2)
	S_NORMAL1(WRTH, 'A',	4, A_WraithChase	, &States[S_WRAITH_CHASE1+1]),
	S_NORMAL1(WRTH, 'B',	4, A_WraithChase	, &States[S_WRAITH_CHASE1+2]),
	S_NORMAL1(WRTH, 'C',	4, A_WraithChase	, &States[S_WRAITH_CHASE1+3]),
	S_NORMAL1(WRTH, 'D',	4, A_WraithChase	, &States[S_WRAITH_CHASE1+0]),

#define S_WRAITH_PAIN1 (S_WRAITH_CHASE1+4)
	S_NORMAL1(WRTH, 'A',	2, NULL			, &States[S_WRAITH_PAIN1+1]),
	S_NORMAL1(WRTH, 'H',	6, A_Pain		, &States[S_WRAITH_CHASE1]),

#define S_WRAITH_ATK1_1 (S_WRAITH_PAIN1+2)
	S_NORMAL1(WRTH, 'E',	6, A_FaceTarget		, &States[S_WRAITH_ATK1_1+1]),
	S_NORMAL1(WRTH, 'F',	6, A_WraithFX3		, &States[S_WRAITH_ATK1_1+2]),
	S_NORMAL1(WRTH, 'G',	6, A_WraithMelee	, &States[S_WRAITH_CHASE1]),

#define S_WRAITH_ATK2_1 (S_WRAITH_ATK1_1+3)
	S_NORMAL1(WRTH, 'E',	6, A_FaceTarget		, &States[S_WRAITH_ATK2_1+1]),
	S_NORMAL1(WRTH, 'F',	6, NULL			, &States[S_WRAITH_ATK2_1+2]),
	S_NORMAL1(WRTH, 'G',	6, A_WraithMissile	, &States[S_WRAITH_CHASE1]),

#define S_WRAITH_DEATH1_1 (S_WRAITH_ATK2_1+3)
	S_NORMAL1(WRTH, 'I',	4, NULL			, &States[S_WRAITH_DEATH1_1+1]),
	S_NORMAL1(WRTH, 'J',	4, A_Scream		, &States[S_WRAITH_DEATH1_1+2]),
	S_NORMAL1(WRTH, 'K',	4, NULL			, &States[S_WRAITH_DEATH1_1+3]),
	S_NORMAL1(WRTH, 'L',	4, NULL			, &States[S_WRAITH_DEATH1_1+4]),
	S_NORMAL1(WRTH, 'M',	4, A_NoBlocking		, &States[S_WRAITH_DEATH1_1+5]),
	S_NORMAL1(WRTH, 'N',	4, A_QueueCorpse	, &States[S_WRAITH_DEATH1_1+6]),
	S_NORMAL1(WRTH, 'O',	4, NULL			, &States[S_WRAITH_DEATH1_1+7]),
	S_NORMAL1(WRTH, 'P',	5, NULL			, &States[S_WRAITH_DEATH1_1+8]),
	S_NORMAL1(WRTH, 'Q',	5, NULL			, &States[S_WRAITH_DEATH1_1+9]),
	S_NORMAL1(WRTH, 'R',   -1, NULL			, NULL),

#define S_WRAITH_DEATH2_1 (S_WRAITH_DEATH1_1+10)
	S_NORMAL1(WRT2, 'A',	5, NULL			, &States[S_WRAITH_DEATH2_1+1]),
	S_NORMAL1(WRT2, 'B',	5, A_Scream		, &States[S_WRAITH_DEATH2_1+2]),
	S_NORMAL1(WRT2, 'C',	5, NULL			, &States[S_WRAITH_DEATH2_1+3]),
	S_NORMAL1(WRT2, 'D',	5, NULL			, &States[S_WRAITH_DEATH2_1+4]),
	S_NORMAL1(WRT2, 'E',	5, A_NoBlocking		, &States[S_WRAITH_DEATH2_1+5]),
	S_NORMAL1(WRT2, 'F',	5, A_QueueCorpse	, &States[S_WRAITH_DEATH2_1+6]),
	S_NORMAL1(WRT2, 'G',	5, NULL			, &States[S_WRAITH_DEATH2_1+7]),
	S_NORMAL1(WRT2, 'H',   -1, NULL			, NULL),
};

------------------------------------------------------------------------

//========== Exactly the same as a standard Reiver, except those are buried in the ground and raise when they see the player, simulating an 'undead' effect, as they appear in a graveyard.

IMPLEMENT_STATELESS_ACTOR (AWraithBuried, Hexen, 10011, 9)
	PROP_HeightFixed (68)
	PROP_Flags (MF_NOGRAVITY|MF_DROPOFF|MF_FLOAT|MF_COUNTKILL)
	PROP_Flags2 (MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_TELESTOMP|MF2_PUSHWALL)
	PROP_Flags3 (MF3_DONTMORPH|MF3_DONTBLAST|MF3_STAYMORPHED)
	PROP_RenderFlags (RF_INVISIBLE)
	PROP_PainChance (0)
	PROP_SpawnState (S_WRAITH_LOOK1)
	PROP_SeeState (S_WRAITH_RAISE1)
END_DEFAULTS

------------------------------------------------------------------------

//========== Fireballs thrown by Reivers. Their native action spawns small sparks that fall from the main fireball.

IMPLEMENT_ACTOR (AWraithFX1, Hexen, -1, 0)
	PROP_SpeedFixed (14)
	PROP_RadiusFixed (10)
	PROP_HeightFixed (6)
	PROP_Mass (5)
	PROP_Damage (5)
	PROP_DamageType (MOD_FIRE)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
	PROP_Flags2 (MF2_FLOORCLIP|MF2_NOTELEPORT|MF2_IMPACT|MF2_PCROSS)
	PROP_SpawnState (S_WRTHFX_MOVE1)
	PROP_DeathState (S_WRTHFX_BOOM1)
	PROP_SeeSound ("WraithMissileFire")
	PROP_DeathSound ("WraithMissileExplode")
END_DEFAULTS

FState AWraithFX1::States[] =
{
#define S_WRTHFX_MOVE1 0
	S_BRIGHT (WRBL, 'A',	3, NULL		, &States[S_WRTHFX_MOVE1+1]),
	S_BRIGHT (WRBL, 'B',	3, A_WraithFX2	, &States[S_WRTHFX_MOVE1+2]),
	S_BRIGHT (WRBL, 'C',	3, NULL		, &States[S_WRTHFX_MOVE1]),

#define S_WRTHFX_BOOM1 (S_WRTHFX_MOVE1+3)
	S_BRIGHT (WRBL, 'D',	4, NULL		, &States[S_WRTHFX_BOOM1+1]),
	S_BRIGHT (WRBL, 'E',	4, A_WraithFX2	, &States[S_WRTHFX_BOOM1+2]),
	S_BRIGHT (WRBL, 'F',	4, NULL		, &States[S_WRTHFX_BOOM1+3]),
	S_BRIGHT (WRBL, 'G',	3, A_WraithFX2	, &States[S_WRTHFX_BOOM1+4]),
	S_BRIGHT (WRBL, 'H',	3, A_WraithFX2	, &States[S_WRTHFX_BOOM1+5]),
	S_BRIGHT (WRBL, 'I',	3, NULL		, NULL),
};

------------------------------------------------------------------------

//========== Reiver fireball sparks

IMPLEMENT_ACTOR (AWraithFX2, Hexen, -1, 108)
	PROP_RadiusFixed (2)
	PROP_HeightFixed (5)
	PROP_Mass (5)
	PROP_Flags (MF_NOBLOCKMAP|MF_DROPOFF)
	PROP_Flags2 (MF2_FLOORCLIP|MF2_NOTELEPORT)
	PROP_SpawnState (S_WRTHFX_SIZZLE1)
END_DEFAULTS

FState AWraithFX2::States[] =
{
#define S_WRTHFX_SIZZLE1 0
	S_BRIGHT (WRBL, 'J',	4, NULL, &States[S_WRTHFX_SIZZLE1+1]),
	S_BRIGHT (WRBL, 'K',	4, NULL, &States[S_WRTHFX_SIZZLE1+2]),
	S_BRIGHT (WRBL, 'L',	4, NULL, &States[S_WRTHFX_SIZZLE1+3]),
	S_BRIGHT (WRBL, 'M',	4, NULL, &States[S_WRTHFX_SIZZLE1+4]),
	S_BRIGHT (WRBL, 'N',	4, NULL, &States[S_WRTHFX_SIZZLE1+5]),
	S_BRIGHT (WRBL, 'O',	4, NULL, &States[S_WRTHFX_SIZZLE1+6]),
	S_BRIGHT (WRBL, 'P',	4, NULL, NULL),
};

------------------------------------------------------------------------

//========== Reiver spark

IMPLEMENT_ACTOR (AWraithFX3, Hexen, -1, 0)
	PROP_RadiusFixed (2)
	PROP_HeightFixed (5)
	PROP_Mass (5)
	PROP_Flags (MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE)
	PROP_Flags2 (MF2_FLOORCLIP|MF2_NOTELEPORT)
	PROP_SpawnState (S_WRTHFX_DROP1)
	PROP_DeathState (S_WRTHFX_DEAD1)
	PROP_DeathSound ("Drip")
END_DEFAULTS

FState AWraithFX3::States[] =
{
#define S_WRTHFX_DROP1 0
	S_BRIGHT (WRBL, 'Q',	4, NULL, &States[S_WRTHFX_DROP1+1]),
	S_BRIGHT (WRBL, 'R',	4, NULL, &States[S_WRTHFX_DROP1+2]),
	S_BRIGHT (WRBL, 'S',	4, NULL, &States[S_WRTHFX_DROP1]),

#define S_WRTHFX_DEAD1 (S_WRTHFX_DROP1+3)
	S_BRIGHT (WRBL, 'S',	4, NULL, NULL),
};

------------------------------------------------------------------------

//========== Dripping flesh

IMPLEMENT_ACTOR (AWraithFX4, Hexen, -1, 106)
	PROP_RadiusFixed (2)
	PROP_HeightFixed (5)
	PROP_Mass (5)
	PROP_Flags (MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_SpawnState (S_WRTHFX_ADROP1)
	PROP_DeathState (S_WRTHFX_ADEAD1)
	PROP_DeathSound ("Drip")
END_DEFAULTS

FState AWraithFX4::States[] =
{
#define S_WRTHFX_ADROP1 0
	S_NORMAL1(WRBL, 'T',	4, NULL, &States[S_WRTHFX_ADROP1+1]),
	S_NORMAL1(WRBL, 'U',	4, NULL, &States[S_WRTHFX_ADROP1+2]),
	S_NORMAL1(WRBL, 'V',	4, NULL, &States[S_WRTHFX_ADROP1+3]),
	S_NORMAL1(WRBL, 'W',	4, NULL, &States[S_WRTHFX_ADROP1]),

#define S_WRTHFX_ADEAD1 (S_WRTHFX_ADROP1+4)
	S_NORMAL1(WRBL, 'W',   10, NULL, NULL),
};

------------------------------------------------------------------------

//========== Dripping flesh

IMPLEMENT_ACTOR (AWraithFX5, Hexen, -1, 107)
	PROP_RadiusFixed (2)
	PROP_HeightFixed (5)
	PROP_Mass (5)
	PROP_Flags (MF_NOBLOCKMAP|MF_DROPOFF|MF_MISSILE)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_SpawnState (S_WRTHFX_BDROP1)
	PROP_DeathState (S_WRTHFX_BDEAD1)
	PROP_DeathSound ("Drip")
END_DEFAULTS

FState AWraithFX5::States[] =
{
#define S_WRTHFX_BDROP1 0
	S_NORMAL1(WRBL, 'X',	7, NULL, &States[S_WRTHFX_BDROP1+1]),
	S_NORMAL1(WRBL, 'Y',	7, NULL, &States[S_WRTHFX_BDROP1+2]),
	S_NORMAL1(WRBL, 'Z',	7, NULL, &States[S_WRTHFX_BDROP1]),

#define S_WRTHFX_BDEAD1 (S_WRTHFX_BDROP1+3)
	S_NORMAL1(WRBL, 'Z',   35, NULL, NULL),
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZWingedStatue, Hexen, 5, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(10)
	PROP_HeightFixed(62)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZWingedStatue::States[1] =
{
	S_NORMAL1 (STTW, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZRock1, Hexen, 6, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(16)
END_DEFAULTS

FState AZRock1::States[1] =
{
	S_NORMAL1 (RCK1, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZRock2, Hexen, 7, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(16)
END_DEFAULTS

FState AZRock2::States[1] =
{
	S_NORMAL1 (RCK2, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZRock3, Hexen, 9, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(16)
END_DEFAULTS

FState AZRock3::States[1] =
{
	S_NORMAL1 (RCK3, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZRock4, Hexen, 15, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(16)
END_DEFAULTS

FState AZRock4::States[1] =
{
	S_NORMAL1 (RCK4, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZChandelier, Hexen, 17, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(60)
	PROP_Flags (MF_SPAWNCEILING|MF_NOGRAVITY)
END_DEFAULTS

FState AZChandelier::States[3] =
{
	S_NORMAL1 (CDLR, 'A',  4, NULL, &States[1]),
	S_NORMAL1 (CDLR, 'B',  4, NULL, &States[2]),
	S_NORMAL1 (CDLR, 'C',  4, NULL, &States[0]),
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZChandelierUnlit, Hexen, 8063, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(60)
	PROP_Flags (MF_SPAWNCEILING|MF_NOGRAVITY)
END_DEFAULTS

FState AZChandelierUnlit::States[1] =
{
	S_NORMAL1 (CDLR, 'D', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZTreeDead, Hexen, 24, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(10)
	PROP_HeightFixed(96)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZTreeDead::States[1] =
{
	S_NORMAL1 (TRE1, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZTree, Hexen, 25, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(15)
	PROP_HeightFixed(128)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZTree::States[1] =
{
	S_NORMAL1 (TRE1, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZTreeSwamp150, Hexen, 26, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(10)
	PROP_HeightFixed(150)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZTreeSwamp150::States[1] =
{
	S_NORMAL1 (TRE2, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZTreeSwamp120, Hexen, 27, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(10)
	PROP_HeightFixed(120)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZTreeSwamp120::States[1] =
{
	S_NORMAL1 (TRE3, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZStumpBurned, Hexen, 28, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(12)
	PROP_HeightFixed(20)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZStumpBurned::States[1] =
{
	S_NORMAL1 (STM1, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZStumpBare, Hexen, 29, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(12)
	PROP_HeightFixed(20)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZStumpBare::States[1] =
{
	S_NORMAL1 (STM2, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZStumpSwamp1, Hexen, 37, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(16)
END_DEFAULTS

FState AZStumpSwamp1::States[1] =
{
	S_NORMAL1 (STM3, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZStumpSwamp2, Hexen, 38, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(16)
END_DEFAULTS

FState AZStumpSwamp2::States[1] =
{
	S_NORMAL1 (STM4, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZShroomLarge1, Hexen, 39, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(16)
END_DEFAULTS

FState AZShroomLarge1::States[1] =
{
	S_NORMAL1 (MSH1, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZShroomLarge2, Hexen, 40, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(16)
END_DEFAULTS

FState AZShroomLarge2::States[1] =
{
	S_NORMAL1 (MSH2, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZShroomLarge3, Hexen, 41, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(16)
END_DEFAULTS

FState AZShroomLarge3::States[1] =
{
	S_NORMAL1 (MSH3, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZShroomSmall1, Hexen, 42, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(16)
END_DEFAULTS

FState AZShroomSmall1::States[1] =
{
	S_NORMAL1 (MSH4, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZShroomSmall2, Hexen, 44, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(16)
END_DEFAULTS

FState AZShroomSmall2::States[1] =
{
	S_NORMAL1 (MSH5, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZShroomSmall3, Hexen, 45, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(16)
END_DEFAULTS

FState AZShroomSmall3::States[1] =
{
	S_NORMAL1 (MSH6, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZShroomSmall4, Hexen, 46, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(16)
END_DEFAULTS

FState AZShroomSmall4::States[1] =
{
	S_NORMAL1 (MSH7, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZShroomSmall5, Hexen, 47, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(16)
END_DEFAULTS

FState AZShroomSmall5::States[1] =
{
	S_NORMAL1 (MSH8, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZStalagmitePillar, Hexen, 48, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(8)
	PROP_HeightFixed(138)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZStalagmitePillar::States[1] =
{
	S_NORMAL1 (SGMP, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZStalagmiteLarge, Hexen, 49, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(8)
	PROP_HeightFixed(48)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZStalagmiteLarge::States[1] =
{
	S_NORMAL1 (SGM1, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZStalagmiteMedium, Hexen, 50, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(6)
	PROP_HeightFixed(40)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZStalagmiteMedium::States[1] =
{
	S_NORMAL1 (SGM2, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZStalagmiteSmall, Hexen, 51, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(8)
	PROP_HeightFixed(36)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZStalagmiteSmall::States[1] =
{
	S_NORMAL1 (SGM3, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZStalactiteLarge, Hexen, 52, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(8)
	PROP_HeightFixed(66)
	PROP_Flags (MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY)
END_DEFAULTS

FState AZStalactiteLarge::States[1] =
{
	S_NORMAL1 (SLC1, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZStalactiteMedium, Hexen, 56, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(6)
	PROP_HeightFixed(50)
	PROP_Flags (MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY)
END_DEFAULTS

FState AZStalactiteMedium::States[1] =
{
	S_NORMAL1 (SLC2, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZStalactiteSmall, Hexen, 57, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(8)
	PROP_HeightFixed(40)
	PROP_Flags (MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY)
END_DEFAULTS

FState AZStalactiteSmall::States[1] =
{
	S_NORMAL1 (SLC3, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZMossCeiling1, Hexen, 58, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(20)
	PROP_Flags (MF_SPAWNCEILING|MF_NOGRAVITY)
END_DEFAULTS

FState AZMossCeiling1::States[1] =
{
	S_NORMAL1 (MSS1, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZMossCeiling2, Hexen, 59, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(24)
	PROP_Flags (MF_SPAWNCEILING|MF_NOGRAVITY)
END_DEFAULTS

FState AZMossCeiling2::States[1] =
{
	S_NORMAL1 (MSS2, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZSwampVine, Hexen, 60, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(8)
	PROP_HeightFixed(52)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZSwampVine::States[1] =
{
	S_NORMAL1 (SWMV, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZCorpseKabob, Hexen, 61, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(10)
	PROP_HeightFixed(92)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZCorpseKabob::States[1] =
{
	S_NORMAL1 (CPS1, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZCorpseSleeping, Hexen, 62, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(16)
END_DEFAULTS

FState AZCorpseSleeping::States[1] =
{
	S_NORMAL1 (CPS2, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZTombstoneRIP, Hexen, 63, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(10)
	PROP_HeightFixed(46)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZTombstoneRIP::States[1] =
{
	S_NORMAL1 (TMS1, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZTombstoneShane, Hexen, 64, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(10)
	PROP_HeightFixed(46)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZTombstoneShane::States[1] =
{
	S_NORMAL1 (TMS2, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZTombstoneBigCross, Hexen, 65, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(10)
	PROP_HeightFixed(46)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZTombstoneBigCross::States[1] =
{
	S_NORMAL1 (TMS3, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZTombstoneBrianR, Hexen, 66, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(10)
	PROP_HeightFixed(52)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZTombstoneBrianR::States[1] =
{
	S_NORMAL1 (TMS4, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZTombstoneCrossCircle, Hexen, 67, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(10)
	PROP_HeightFixed(52)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZTombstoneCrossCircle::States[1] =
{
	S_NORMAL1 (TMS5, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZTombstoneSmallCross, Hexen, 68, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(8)
	PROP_HeightFixed(46)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZTombstoneSmallCross::States[1] =
{
	S_NORMAL1 (TMS6, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZTombstoneBrianP, Hexen, 69, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(8)
	PROP_HeightFixed(46)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZTombstoneBrianP::States[1] =
{
	S_NORMAL1 (TMS7, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZCorpseHanging, Hexen, 71, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(6)
	PROP_HeightFixed(75)
	PROP_Flags (MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY)
END_DEFAULTS

FState AZCorpseHanging::States[1] =
{
	S_NORMAL1 (CPS3, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZStatueGargoyleGreenTall, Hexen, 72, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(14)
	PROP_HeightFixed(108)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZStatueGargoyleGreenTall::States[1] =
{
	S_NORMAL1 (STT2, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZStatueGargoyleBlueTall, Hexen, 73, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(14)
	PROP_HeightFixed(108)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZStatueGargoyleBlueTall::States[1] =
{
	S_NORMAL1 (STT3, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZStatueGargoyleGreenShort, Hexen, 74, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(14)
	PROP_HeightFixed(62)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZStatueGargoyleGreenShort::States[1] =
{
	S_NORMAL1 (STT4, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZStatueGargoyleBlueShort, Hexen, 76, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(14)
	PROP_HeightFixed(62)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZStatueGargoyleBlueShort::States[1] =
{
	S_NORMAL1 (STT5, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZStatueGargoyleStripeTall, Hexen, 8044, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(14)
	PROP_HeightFixed(108)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZStatueGargoyleStripeTall::States[1] =
{
	S_NORMAL1 (GAR1, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZStatueGargoyleDarkRedTall, Hexen, 8045, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(14)
	PROP_HeightFixed(108)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZStatueGargoyleDarkRedTall::States[1] =
{
	S_NORMAL1 (GAR2, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZStatueGargoyleRedTall, Hexen, 8046, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(14)
	PROP_HeightFixed(108)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZStatueGargoyleRedTall::States[1] =
{
	S_NORMAL1 (GAR3, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZStatueGargoyleTanTall, Hexen, 8047, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(14)
	PROP_HeightFixed(108)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZStatueGargoyleTanTall::States[1] =
{
	S_NORMAL1 (GAR4, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZStatueGargoyleRustTall, Hexen, 8048, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(14)
	PROP_HeightFixed(108)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZStatueGargoyleRustTall::States[1] =
{
	S_NORMAL1 (GAR5, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZStatueGargoyleDarkRedShort, Hexen, 8049, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(14)
	PROP_HeightFixed(62)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZStatueGargoyleDarkRedShort::States[1] =
{
	S_NORMAL1 (GAR6, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZStatueGargoyleRedShort, Hexen, 8050, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(14)
	PROP_HeightFixed(62)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZStatueGargoyleRedShort::States[1] =
{
	S_NORMAL1 (GAR7, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZStatueGargoyleTanShort, Hexen, 8051, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(14)
	PROP_HeightFixed(62)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZStatueGargoyleTanShort::States[1] =
{
	S_NORMAL1 (GAR8, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZStatueGargoyleRustShort, Hexen, 8052, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(14)
	PROP_HeightFixed(62)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZStatueGargoyleRustShort::States[1] =
{
	S_NORMAL1 (GAR9, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZBannerTattered, Hexen, 77, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(8)
	PROP_HeightFixed(120)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZBannerTattered::States[1] =
{
	S_NORMAL1 (BNR1, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZTreeLarge1, Hexen, 78, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(15)
	PROP_HeightFixed(180)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZTreeLarge1::States[1] =
{
	S_NORMAL1 (TRE4, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZTreeLarge2, Hexen, 79, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(15)
	PROP_HeightFixed(180)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZTreeLarge2::States[1] =
{
	S_NORMAL1 (TRE5, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZTreeGnarled1, Hexen, 80, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(22)
	PROP_HeightFixed(100)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZTreeGnarled1::States[1] =
{
	S_NORMAL1 (TRE6, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZTreeGnarled2, Hexen, 87, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(22)
	PROP_HeightFixed(100)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZTreeGnarled2::States[1] =
{
	S_NORMAL1 (TRE7, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZLog, Hexen, 88, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(25)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZLog::States[1] =
{
	S_NORMAL1 (LOGG, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZStalactiteIceLarge, Hexen, 89, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(8)
	PROP_HeightFixed(66)
	PROP_Flags (MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY)
END_DEFAULTS

FState AZStalactiteIceLarge::States[1] =
{
	S_NORMAL1 (ICT1, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZStalactiteIceMedium, Hexen, 90, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(5)
	PROP_HeightFixed(50)
	PROP_Flags (MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY)
END_DEFAULTS

FState AZStalactiteIceMedium::States[1] =
{
	S_NORMAL1 (ICT2, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZStalactiteIceSmall, Hexen, 91, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(4)
	PROP_HeightFixed(32)
	PROP_Flags (MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY)
END_DEFAULTS

FState AZStalactiteIceSmall::States[1] =
{
	S_NORMAL1 (ICT3, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZStalactiteIceTiny, Hexen, 92, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(4)
	PROP_HeightFixed(8)
	PROP_Flags (MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY)
END_DEFAULTS

FState AZStalactiteIceTiny::States[1] =
{
	S_NORMAL1 (ICT4, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZStalagmiteIceLarge, Hexen, 93, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(8)
	PROP_HeightFixed(66)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZStalagmiteIceLarge::States[1] =
{
	S_NORMAL1 (ICM1, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZStalagmiteIceMedium, Hexen, 94, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(5)
	PROP_HeightFixed(50)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZStalagmiteIceMedium::States[1] =
{
	S_NORMAL1 (ICM2, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZStalagmiteIceSmall, Hexen, 95, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(4)
	PROP_HeightFixed(32)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZStalagmiteIceSmall::States[1] =
{
	S_NORMAL1 (ICM3, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZStalagmiteIceTiny, Hexen, 96, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(4)
	PROP_HeightFixed(8)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZStalagmiteIceTiny::States[1] =
{
	S_NORMAL1 (ICM4, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZRockBrown1, Hexen, 97, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(17)
	PROP_HeightFixed(72)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZRockBrown1::States[1] =
{
	S_NORMAL1 (RKBL, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZRockBrown2, Hexen, 98, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(15)
	PROP_HeightFixed(50)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZRockBrown2::States[1] =
{
	S_NORMAL1 (RKBS, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZRockBlack, Hexen, 99, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(40)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZRockBlack::States[1] =
{
	S_NORMAL1 (RKBK, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZRubble1, Hexen, 100, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(16)
END_DEFAULTS

FState AZRubble1::States[1] =
{
	S_NORMAL1 (RBL1, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZRubble2, Hexen, 101, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(16)
END_DEFAULTS

FState AZRubble2::States[1] =
{
	S_NORMAL1 (RBL2, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZRubble3, Hexen, 102, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(16)
END_DEFAULTS

FState AZRubble3::States[1] =
{
	S_NORMAL1 (RBL3, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZVasePillar, Hexen, 103, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(12)
	PROP_HeightFixed(54)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZVasePillar::States[1] =
{
	S_NORMAL1 (VASE, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZCorpseLynched, Hexen, 108, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(11)
	PROP_HeightFixed(95)
	PROP_Flags (MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY)
END_DEFAULTS

FState AZCorpseLynched::States[1] =
{
	S_NORMAL1 (CPS4, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZCandle, Hexen, 119, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(16)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
END_DEFAULTS

FState AZCandle::States[3] =
{
	S_BRIGHT (CNDL, 'A',  4, NULL, &States[1]),
	S_BRIGHT (CNDL, 'B',  4, NULL, &States[2]),
	S_BRIGHT (CNDL, 'C',  4, NULL, &States[0])
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZBarrel, Hexen, 8100, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(15)
	PROP_HeightFixed(32)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZBarrel::States[1] =
{
	S_NORMAL1 (BARL, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZBucket, Hexen, 8103, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(8)
	PROP_HeightFixed(72)
	PROP_Flags (MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY)
END_DEFAULTS

FState AZBucket::States[1] =
{
	S_NORMAL1 (BCKT, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AFireThing, Hexen, 8060, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(5)
	PROP_HeightFixed(10)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AFireThing::States[9] =
{
	S_BRIGHT (FSKL, 'A',  4, NULL, &States[1]),
	S_BRIGHT (FSKL, 'B',  3, NULL, &States[2]),
	S_BRIGHT (FSKL, 'C',  4, NULL, &States[3]),
	S_BRIGHT (FSKL, 'D',  3, NULL, &States[4]),
	S_BRIGHT (FSKL, 'E',  4, NULL, &States[5]),
	S_BRIGHT (FSKL, 'F',  3, NULL, &States[6]),
	S_BRIGHT (FSKL, 'G',  4, NULL, &States[7]),
	S_BRIGHT (FSKL, 'H',  3, NULL, &States[8]),
	S_BRIGHT (FSKL, 'I',  4, NULL, &States[0])
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (ABrassTorch, Hexen, 8061, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(6)
	PROP_HeightFixed(35)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState ABrassTorch::States[13] =
{
	S_BRIGHT (BRTR, 'A',  4, NULL, &States[1]),
	S_BRIGHT (BRTR, 'B',  4, NULL, &States[2]),
	S_BRIGHT (BRTR, 'C',  4, NULL, &States[3]),
	S_BRIGHT (BRTR, 'D',  4, NULL, &States[4]),
	S_BRIGHT (BRTR, 'E',  4, NULL, &States[5]),
	S_BRIGHT (BRTR, 'F',  4, NULL, &States[6]),
	S_BRIGHT (BRTR, 'G',  4, NULL, &States[7]),
	S_BRIGHT (BRTR, 'H',  4, NULL, &States[8]),
	S_BRIGHT (BRTR, 'I',  4, NULL, &States[9]),
	S_BRIGHT (BRTR, 'J',  4, NULL, &States[10]),
	S_BRIGHT (BRTR, 'K',  4, NULL, &States[11]),
	S_BRIGHT (BRTR, 'L',  4, NULL, &States[12]),
	S_BRIGHT (BRTR, 'M',  4, NULL, &States[0])
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZBlueCandle, Hexen, 8066, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(16)
	PROP_Flags (MF_NOBLOCKMAP)
END_DEFAULTS

FState AZBlueCandle::States[5] =
{
	S_BRIGHT (CAND, 'A',  5, NULL, &States[1]),
	S_BRIGHT (CAND, 'B',  5, NULL, &States[2]),
	S_BRIGHT (CAND, 'C',  5, NULL, &States[3]),
	S_BRIGHT (CAND, 'D',  5, NULL, &States[4]),
	S_BRIGHT (CAND, 'E',  5, NULL, &States[0])
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZIronMaiden, Hexen, 8067, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(12)
	PROP_HeightFixed(60)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState AZIronMaiden::States[1] =
{
	S_NORMAL1 (IRON, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZChainBit32, Hexen, 8071, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(4)
	PROP_HeightFixed(32)
	PROP_Flags (MF_NOBLOCKMAP|MF_SPAWNCEILING|MF_NOGRAVITY)
END_DEFAULTS

FState AZChainBit32::States[1] =
{
	S_NORMAL1 (CHNS, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZChainBit64, Hexen, 8072, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(4)
	PROP_HeightFixed(64)
	PROP_Flags (MF_NOBLOCKMAP|MF_SPAWNCEILING|MF_NOGRAVITY)
END_DEFAULTS

FState AZChainBit64::States[1] =
{
	S_NORMAL1 (CHNS, 'B', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZChainEndHeart, Hexen, 8073, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(4)
	PROP_HeightFixed(32)
	PROP_Flags (MF_NOBLOCKMAP|MF_SPAWNCEILING|MF_NOGRAVITY)
END_DEFAULTS

FState AZChainEndHeart::States[1] =
{
	S_NORMAL1 (CHNS, 'C', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZChainEndHook1, Hexen, 8074, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(4)
	PROP_HeightFixed(32)
	PROP_Flags (MF_NOBLOCKMAP|MF_SPAWNCEILING|MF_NOGRAVITY)
END_DEFAULTS

FState AZChainEndHook1::States[1] =
{
	S_NORMAL1 (CHNS, 'D', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZChainEndHook2, Hexen, 8075, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(4)
	PROP_HeightFixed(32)
	PROP_Flags (MF_NOBLOCKMAP|MF_SPAWNCEILING|MF_NOGRAVITY)
END_DEFAULTS

FState AZChainEndHook2::States[1] =
{
	S_NORMAL1 (CHNS, 'E', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZChainEndSpike, Hexen, 8076, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(4)
	PROP_HeightFixed(32)
	PROP_Flags (MF_NOBLOCKMAP|MF_SPAWNCEILING|MF_NOGRAVITY)
END_DEFAULTS

FState AZChainEndSpike::States[1] =
{
	S_NORMAL1 (CHNS, 'F', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (AZChainEndSkull, Hexen, 8077, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(4)
	PROP_HeightFixed(32)
	PROP_Flags (MF_NOBLOCKMAP|MF_SPAWNCEILING|MF_NOGRAVITY)
END_DEFAULTS

FState AZChainEndSkull::States[1] =
{
	S_NORMAL1 (CHNS, 'G', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (ATableShit1, Hexen, 8500, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(16)
	PROP_Flags (MF_NOBLOCKMAP)
END_DEFAULTS

FState ATableShit1::States[1] =
{
	S_NORMAL1 (TST1, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (ATableShit2, Hexen, 8501, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(16)
	PROP_Flags (MF_NOBLOCKMAP)
END_DEFAULTS

FState ATableShit2::States[1] =
{
	S_NORMAL1 (TST2, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (ATableShit3, Hexen, 8502, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(16)
	PROP_Flags (MF_NOBLOCKMAP)
END_DEFAULTS

FState ATableShit3::States[1] =
{
	S_NORMAL1 (TST3, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (ATableShit4, Hexen, 8503, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(16)
	PROP_Flags (MF_NOBLOCKMAP)
END_DEFAULTS

FState ATableShit4::States[1] =
{
	S_NORMAL1 (TST4, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (ATableShit5, Hexen, 8504, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(16)
	PROP_Flags (MF_NOBLOCKMAP)
END_DEFAULTS

FState ATableShit5::States[1] =
{
	S_NORMAL1 (TST5, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (ATableShit6, Hexen, 8505, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(16)
	PROP_Flags (MF_NOBLOCKMAP)
END_DEFAULTS

FState ATableShit6::States[1] =
{
	S_NORMAL1 (TST6, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (ATableShit7, Hexen, 8506, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(16)
	PROP_Flags (MF_NOBLOCKMAP)
END_DEFAULTS

FState ATableShit7::States[1] =
{
	S_NORMAL1 (TST7, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (ATableShit8, Hexen, 8507, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(16)
	PROP_Flags (MF_NOBLOCKMAP)
END_DEFAULTS

FState ATableShit8::States[1] =
{
	S_NORMAL1 (TST8, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (ATableShit9, Hexen, 8508, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(16)
	PROP_Flags (MF_NOBLOCKMAP)
END_DEFAULTS

FState ATableShit9::States[1] =
{
	S_NORMAL1 (TST9, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (ATableShit10, Hexen, 8509, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(16)
	PROP_Flags (MF_NOBLOCKMAP)
END_DEFAULTS

FState ATableShit10::States[1] =
{
	S_NORMAL1 (TST0, 'A', -1, NULL, NULL)
};

------------------------------------------------------------------------

//========== Hexen decoration

IMPLEMENT_ACTOR (ATeleSmoke, Hexen, 140, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(16)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
	PROP_RenderStyle (STYLE_Translucent)
	PROP_Alpha (ZOPAQUE*8/10)
END_DEFAULTS

FState ATeleSmoke::States[26] =
{
	S_NORMAL1 (TSMK, 'A',  4, NULL, &States[1]),
	S_NORMAL1 (TSMK, 'B',  3, NULL, &States[2]),
	S_NORMAL1 (TSMK, 'C',  4, NULL, &States[3]),
	S_NORMAL1 (TSMK, 'D',  3, NULL, &States[4]),
	S_NORMAL1 (TSMK, 'E',  4, NULL, &States[5]),
	S_NORMAL1 (TSMK, 'F',  3, NULL, &States[6]),
	S_NORMAL1 (TSMK, 'G',  4, NULL, &States[7]),
	S_NORMAL1 (TSMK, 'H',  3, NULL, &States[8]),
	S_NORMAL1 (TSMK, 'I',  4, NULL, &States[9]),
	S_NORMAL1 (TSMK, 'J',  3, NULL, &States[10]),
	S_NORMAL1 (TSMK, 'K',  4, NULL, &States[11]),
	S_NORMAL1 (TSMK, 'L',  3, NULL, &States[12]),
	S_NORMAL1 (TSMK, 'M',  4, NULL, &States[13]),
	S_NORMAL1 (TSMK, 'N',  3, NULL, &States[14]),
	S_NORMAL1 (TSMK, 'O',  4, NULL, &States[15]),
	S_NORMAL1 (TSMK, 'P',  3, NULL, &States[16]),
	S_NORMAL1 (TSMK, 'Q',  4, NULL, &States[17]),
	S_NORMAL1 (TSMK, 'R',  3, NULL, &States[18]),
	S_NORMAL1 (TSMK, 'S',  4, NULL, &States[19]),
	S_NORMAL1 (TSMK, 'T',  3, NULL, &States[20]),
	S_NORMAL1 (TSMK, 'U',  4, NULL, &States[21]),
	S_NORMAL1 (TSMK, 'V',  3, NULL, &States[22]),
	S_NORMAL1 (TSMK, 'W',  4, NULL, &States[23]),
	S_NORMAL1 (TSMK, 'X',  3, NULL, &States[24]),
	S_NORMAL1 (TSMK, 'Y',  4, NULL, &States[25]),
	S_NORMAL1 (TSMK, 'Z',  3, NULL, &States[0])
};

------------------------------------------------------------------------

//========== Pork missile

IMPLEMENT_ACTOR(APorkFX, Hexen, -1, 40)
	PROP_RadiusFixed(8)
	PROP_HeightFixed(8)
	PROP_SpeedFixed(18)
	PROP_Damage(1)
	PROP_Flags(MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
	PROP_Flags2(MF2_NOTELEPORT)
	PROP_SpawnState(S_EGGFX)
	PROP_DeathState(S_EGGFXI2)
END_DEFAULTS

FState APorkFX::States[] =
{
//#define S_EGGFX 0
	S_NORMAL1(EGGM, 'A',	4, NULL, &States[S_EGGFX+1]),
	S_NORMAL1(EGGM, 'B',	4, NULL, &States[S_EGGFX+2]),
	S_NORMAL1(EGGM, 'C',	4, NULL, &States[S_EGGFX+3]),
	S_NORMAL1(EGGM, 'D',	4, NULL, &States[S_EGGFX+4]),
	S_NORMAL1(EGGM, 'E',	4, NULL, &States[S_EGGFX+0]),

#define S_EGGFXI2 (S_EGGFX+5)
	S_BRIGHT (FHFX, 'I',	3, NULL, &States[S_EGGFXI2+1]),
	S_BRIGHT (FHFX, 'J',	3, NULL, &States[S_EGGFXI2+2]),
	S_BRIGHT (FHFX, 'K',	3, NULL, &States[S_EGGFXI2+3]),
	S_BRIGHT (FHFX, 'L',	3, NULL, NULL)
};

------------------------------------------------------------------------

//========== Porkalator

IMPLEMENT_ACTOR(AArtiPork, Hexen, 30, 14)
	PROP_Flags(MF_SPECIAL|MF_COUNTITEM)
	PROP_Flags2(MF2_FLOATBOB)
	PROP_SpawnState(0)
	PROP_PickupSound("misc/p_pkup")
END_DEFAULTS

FState AArtiPork::States[] =
{
	S_NORMAL1(PORK, 'A',	5, NULL, &States[1]),
	S_NORMAL1(PORK, 'B',	5, NULL, &States[2]),
	S_NORMAL1(PORK, 'C',	5, NULL, &States[3]),
	S_NORMAL1(PORK, 'D',	5, NULL, &States[4]),
	S_NORMAL1(PORK, 'E',	5, NULL, &States[5]),
	S_NORMAL1(PORK, 'F',	5, NULL, &States[6]),
	S_NORMAL1(PORK, 'G',	5, NULL, &States[7]),
	S_NORMAL1(PORK, 'H',	5, NULL, &States[0])
};

------------------------------------------------------------------------

//========== Minotaur Smoke Exit

IMPLEMENT_ACTOR (AMinotaurSmokeExit, Hexen, -1, 0)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_RenderStyle (STYLE_Translucent)
	PROP_Alpha (HX_SHADOW)
	PROP_SpawnState (0)
END_DEFAULTS

FState AMinotaurSmokeExit::States[] =
{
	S_NORMAL1(MNSM, 'A',	3, NULL					    , &States[1]),
	S_NORMAL1(MNSM, 'B',	3, NULL					    , &States[2]),
	S_NORMAL1(MNSM, 'C',	3, NULL					    , &States[3]),
	S_NORMAL1(MNSM, 'D',	3, NULL					    , &States[4]),
	S_NORMAL1(MNSM, 'E',	3, NULL					    , &States[5]),
	S_NORMAL1(MNSM, 'F',	3, NULL					    , &States[6]),
	S_NORMAL1(MNSM, 'G',	3, NULL					    , &States[7]),
	S_NORMAL1(MNSM, 'H',	3, NULL					    , &States[8]),
	S_NORMAL1(MNSM, 'I',	3, NULL					    , &States[9]),
	S_NORMAL1(MNSM, 'J',	3, NULL					    , &States[10]),
	S_NORMAL1(MNSM, 'I',	3, NULL					    , &States[11]),
	S_NORMAL1(MNSM, 'H',	3, NULL					    , &States[12]),
	S_NORMAL1(MNSM, 'G',	3, NULL					    , &States[13]),
	S_NORMAL1(MNSM, 'F',	3, NULL					    , &States[14]),
	S_NORMAL1(MNSM, 'E',	3, NULL					    , &States[15]),
	S_NORMAL1(MNSM, 'D',	3, NULL					    , &States[16]),
	S_NORMAL1(MNSM, 'C',	3, NULL					    , &States[17]),
	S_NORMAL1(MNSM, 'B',	3, NULL					    , &States[18]),
	S_NORMAL1(MNSM, 'A',	3, NULL					    , NULL),
};

------------------------------------------------------------------------

//========== Minotaur Friend

IMPLEMENT_STATELESS_ACTOR (AMinotaurFriend, Hexen, -1, 0)
	PROP_SpawnState (S_MNTR_FADEIN)
	PROP_DeathState (S_MNTR_FADEOUT)
	PROP_RenderStyle (STYLE_Translucent)
	PROP_Alpha (ZOPAQUE/3)
	PROP_SpawnHealth (2500)
	PROP_FlagsClear (MF_DROPOFF)
	PROP_FlagsSet (MF_FRIENDLY)
	PROP_Flags2Clear (MF2_BOSS)
	PROP_Flags2Set (MF2_TELESTOMP)
	PROP_Flags3Set (MF3_STAYMORPHED)
	PROP_Flags3Clear (MF3_DONTMORPH)
	PROP_Flags4Set (MF4_NOTARGETSWITCH)
	PROP_Flags5Set (MF5_SUMMONEDMONSTER)
END_DEFAULTS

------------------------------------------------------------------------