ZDaemon Actors particular to Heretic only

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

//========== Beast (Weredragon)

IMPLEMENT_ACTOR (ABeast, Heretic, 70, 3)
	PROP_SpawnHealth (220)
	PROP_RadiusFixed (32)
	PROP_HeightFixed (74)
	PROP_Mass (200)
	PROP_SpeedFixed (14)
	PROP_PainChance (100)
	PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL)
	PROP_Flags2 (MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_PUSHWALL)
	PROP_SpawnState (S_BEAST_LOOK)
	PROP_SeeState (S_BEAST_WALK)
	PROP_PainState (S_BEAST_PAIN)
	PROP_MissileState (S_BEAST_ATK)
	PROP_DeathState (S_BEAST_DIE)
	PROP_XDeathState (S_BEAST_XDIE)
	PROP_SeeSound ("beast/sight")
	PROP_AttackSound ("beast/attack")
	PROP_PainSound ("beast/pain")
	PROP_DeathSound ("beast/death")
	PROP_ActiveSound ("beast/active")
END_DEFAULTS

FState ABeast::States[] =
{
#define S_BEAST_LOOK 0
	S_NORMAL1 (BEAS, 'A',   10, A_Look      , &States[S_BEAST_LOOK+1]),
	S_NORMAL1 (BEAS, 'B',   10, A_Look      , &States[S_BEAST_LOOK+0]),

#define S_BEAST_WALK (S_BEAST_LOOK+2)
	S_NORMAL1 (BEAS, 'A',    3, A_Chase     , &States[S_BEAST_WALK+1]),
	S_NORMAL1 (BEAS, 'B',    3, A_Chase     , &States[S_BEAST_WALK+2]),
	S_NORMAL1 (BEAS, 'C',    3, A_Chase     , &States[S_BEAST_WALK+3]),
	S_NORMAL1 (BEAS, 'D',    3, A_Chase     , &States[S_BEAST_WALK+4]),
	S_NORMAL1 (BEAS, 'E',    3, A_Chase     , &States[S_BEAST_WALK+5]),
	S_NORMAL1 (BEAS, 'F',    3, A_Chase     , &States[S_BEAST_WALK+0]),

#define S_BEAST_ATK (S_BEAST_WALK+6)
	S_NORMAL1 (BEAS, 'H',   10, A_FaceTarget, &States[S_BEAST_ATK+1]),
	S_NORMAL1 (BEAS, 'I',   10, A_BeastAttack, &States[S_BEAST_WALK+0]),

#define S_BEAST_PAIN (S_BEAST_ATK+2)
	S_NORMAL1 (BEAS, 'G',    3, NULL        , &States[S_BEAST_PAIN+1]),
	S_NORMAL1 (BEAS, 'G',    3, A_Pain      , &States[S_BEAST_WALK+0]),

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

#define S_BEAST_XDIE (S_BEAST_DIE+9)
	S_NORMAL1 (BEAS, 'J',    5, NULL        , &States[S_BEAST_XDIE+1]),
	S_NORMAL1 (BEAS, 'K',    6, A_Scream    , &States[S_BEAST_XDIE+2]),
	S_NORMAL1 (BEAS, 'L',    5, NULL        , &States[S_BEAST_XDIE+3]),
	S_NORMAL1 (BEAS, 'M',    6, NULL        , &States[S_BEAST_XDIE+4]),
	S_NORMAL1 (BEAS, 'N',    5, NULL        , &States[S_BEAST_XDIE+5]),
	S_NORMAL1 (BEAS, 'O',    6, A_NoBlocking, &States[S_BEAST_XDIE+6]),
	S_NORMAL1 (BEAS, 'P',    5, NULL        , &States[S_BEAST_XDIE+7]),
	S_NORMAL1 (BEAS, 'Q',   -1, NULL        , NULL)
};

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

//========== The smoking projectile belched forth by Weredragons.

IMPLEMENT_ACTOR (ABeastBall, Heretic, -1, 120)
	PROP_RadiusFixed (9)
	PROP_HeightFixed (8)
	PROP_SpeedFixed (12)
	PROP_Damage (4)
	PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
	PROP_Flags2 (MF2_WINDTHRUST|MF2_NOTELEPORT)
	PROP_Flags4 (MF4_BLOODSPLATTER)
	PROP_SpawnState (S_BEASTBALL)
	PROP_DeathState (S_BEASTBALLX)
END_DEFAULTS

FState ABeastBall::States[] =
{
#define S_BEASTBALL 0
	S_NORMAL1 (FRB1, 'A',    2, A_BeastPuff, &States[S_BEASTBALL+1]),
	S_NORMAL1 (FRB1, 'A',    2, A_BeastPuff, &States[S_BEASTBALL+2]),
	S_NORMAL1 (FRB1, 'B',    2, A_BeastPuff, &States[S_BEASTBALL+3]),
	S_NORMAL1 (FRB1, 'B',    2, A_BeastPuff, &States[S_BEASTBALL+4]),
	S_NORMAL1 (FRB1, 'C',    2, A_BeastPuff, &States[S_BEASTBALL+5]),
	S_NORMAL1 (FRB1, 'C',    2, A_BeastPuff, &States[S_BEASTBALL+0]),

#define S_BEASTBALLX (S_BEASTBALL+6)
	S_NORMAL1 (FRB1, 'D',    4, NULL       , &States[S_BEASTBALLX+1]),
	S_NORMAL1 (FRB1, 'E',    4, NULL       , &States[S_BEASTBALLX+2]),
	S_NORMAL1 (FRB1, 'F',    4, NULL       , &States[S_BEASTBALLX+3]),
	S_NORMAL1 (FRB1, 'G',    4, NULL       , &States[S_BEASTBALLX+4]),
	S_NORMAL1 (FRB1, 'H',    4, NULL       , NULL)
};

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

//========== The trail of smoke left by the weredragon's fire ball. 

IMPLEMENT_ACTOR (APuffy, Heretic, -1, 0)
	PROP_RadiusFixed (6)
	PROP_HeightFixed (8)
	PROP_SpeedFixed (10)
	PROP_Damage (2)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_MISSILE)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_Flags3 (MF3_DONTSPLASH)
	PROP_Flags4 (MF4_NOSPEEDCHECK)
	PROP_SpawnState (0)
END_DEFAULTS

FState APuffy::States[] =
{
	S_NORMAL1 (FRB1, 'D',    4, NULL, &States[1]),
	S_NORMAL1 (FRB1, 'E',    4, NULL, &States[2]),
	S_NORMAL1 (FRB1, 'F',    4, NULL, &States[3]),
	S_NORMAL1 (FRB1, 'G',    4, NULL, &States[4]),
	S_NORMAL1 (FRB1, 'H',    4, NULL, NULL)
};

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

//========== The puff spawned when the Heretic player hits something with his beak.

IMPLEMENT_STATELESS_ACTOR (ABeakPuff, Heretic, -1, 0)
	PROP_Mass (5)
	PROP_AttackSound ("chicken/attack")
END_DEFAULTS

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

//========== The weapon used by players morphed into a chicken. 

IMPLEMENT_ACTOR (ABeak, Heretic, -1, 0)
END_DEFAULTS

FState ABeak::States[] =
{
#define S_BEAKREADY 0
	S_NORMAL1 (BEAK, 'A',    1, A_BeakReady    , &States[S_BEAKREADY]),

#define S_BEAKDOWN (S_BEAKREADY+1)
	S_NORMAL1 (BEAK, 'A',    1, A_Lower        , &States[S_BEAKDOWN]),

#define S_BEAKUP (S_BEAKDOWN+1)
	S_NORMAL1 (BEAK, 'A',    1, A_BeakRaise    , &States[S_BEAKUP]),

#define S_BEAKATK1 (S_BEAKUP+1)
	S_NORMAL1 (BEAK, 'A',   18, A_BeakAttackPL1, &States[S_BEAKREADY]),

#define S_BEAKATK2 (S_BEAKATK1+1)
	S_NORMAL1 (BEAK, 'A',   12, A_BeakAttackPL2, &States[S_BEAKREADY])
};

FWeaponInfo ABeak::WeaponInfo1 =
{
	WIF_BLOODSPLATTER,
	am_noammo,
	0,
	0,
	&States[S_BEAKUP],
	&States[S_BEAKDOWN],
	&States[S_BEAKREADY],
	&States[S_BEAKATK1],
	&States[S_BEAKATK1],
	NULL,
	NULL,
	150,
	15*FRACUNIT,
	NULL,
	NULL,
	ZDRUNTIME_CLASS(ABeak),
	-1
};

FWeaponInfo ABeak::WeaponInfo2 =
{
	WIF_BLOODSPLATTER,
	am_noammo,
	0,
	0,
	&States[S_BEAKUP],
	&States[S_BEAKDOWN],
	&States[S_BEAKREADY],
	&States[S_BEAKATK2],
	&States[S_BEAKATK2],
	NULL,
	NULL,
	150,
	15*FRACUNIT,
	NULL,
	NULL,
	ZDRUNTIME_CLASS(ABeak),
	-1
};

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

//========== Player who has been morphed into a chicken

IMPLEMENT_ACTOR (AChickenPlayer, Heretic, -1, 0)
	PROP_SpawnHealth (30)
	PROP_RadiusFixed (16)
	PROP_HeightFixed (24)
	PROP_SpeedFixed (1)
	PROP_PainChance (255)
	PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_DROPOFF|MF_NOTDMATCH|MF_FRIENDLY)
	PROP_Flags2 (MF2_WINDTHRUST|MF2_SLIDE|MF2_PASSMOBJ|MF2_FLOORCLIP|MF2_LOGRAV|MF2_TELESTOMP)
	PROP_Flags3 (MF3_NOBLOCKMONST)
	PROP_Flags4 (MF4_NOSKIN)
	PROP_SpawnState (S_CHICPLAY)
	PROP_SeeState (S_CHICPLAY_RUN)
	PROP_PainState (S_CHICPLAY_PAIN)
	PROP_MissileState (S_CHICPLAY_ATK)
	PROP_DeathState (S_CHICPLAY_DIE)
	PROP_PainSound ("chicken/pain")
	PROP_DeathSound ("chicken/death")
END_DEFAULTS


FState AChickenPlayer::States[] =
{
#define S_CHICPLAY 0
	S_NORMAL1 (CHKN, 'A',   -1, NULL        , NULL),

#define S_CHICPLAY_RUN (S_CHICPLAY+1)
	S_NORMAL1 (CHKN, 'A',    3, NULL        , &States[S_CHICPLAY_RUN+1]),
	S_NORMAL1 (CHKN, 'B',    3, NULL        , &States[S_CHICPLAY_RUN+2]),
	S_NORMAL1 (CHKN, 'A',    3, NULL        , &States[S_CHICPLAY_RUN+3]),
	S_NORMAL1 (CHKN, 'B',    3, NULL        , &States[S_CHICPLAY_RUN+0]),

#define S_CHICPLAY_ATK (S_CHICPLAY_RUN+4)
	S_NORMAL1 (CHKN, 'C',   12, NULL        , &States[S_CHICPLAY]),

#define S_CHICPLAY_PAIN (S_CHICPLAY_ATK+1)
	S_NORMAL1 (CHKN, 'D',    4, A_Feathers  , &States[S_CHICPLAY_PAIN+1]),
	S_NORMAL1 (CHKN, 'C',    4, A_Pain      , &States[S_CHICPLAY]),

#define S_CHICPLAY_DIE (S_CHICPLAY_PAIN+2)
	S_NORMAL1 (CHKN, 'E',    6, A_Scream    , &States[S_CHICPLAY_DIE+1]),
	S_NORMAL1 (CHKN, 'F',    6, A_Feathers  , &States[S_CHICPLAY_DIE+2]),
	S_NORMAL1 (CHKN, 'G',    6, NULL        , &States[S_CHICPLAY_DIE+3]),
	S_NORMAL1 (CHKN, 'H',    6, A_NoBlocking, &States[S_CHICPLAY_DIE+4]),
	S_NORMAL1 (CHKN, 'I',    6, NULL        , &States[S_CHICPLAY_DIE+5]),
	S_NORMAL1 (CHKN, 'J',    6, NULL        , &States[S_CHICPLAY_DIE+6]),
	S_NORMAL1 (CHKN, 'K',    6, NULL        , &States[S_CHICPLAY_DIE+7]),
	S_NORMAL1 (CHKN, 'L',   -1, NULL        , NULL)
};

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

//========== Monster that has been morphed into a chicken

IMPLEMENT_ACTOR (AChicken, Heretic, -1, 122)
	PROP_SpawnHealth (10)
	PROP_RadiusFixed (9)
	PROP_HeightFixed (22)
	PROP_Mass (40)
	PROP_SpeedFixed (4)
	PROP_PainChance (200)
	PROP_Flags (MF_SOLID|MF_SHOOTABLE)
	PROP_Flags2 (MF2_WINDTHRUST|MF2_FLOORCLIP|MF2_PASSMOBJ)
	PROP_Flags3 (MF3_DONTMORPH|MF3_ISMONSTER)
	PROP_SpawnState (S_CHICKEN_LOOK)
	PROP_SeeState (S_CHICKEN_WALK)
	PROP_PainState (S_CHICKEN_PAIN)
	PROP_MeleeState (S_CHICKEN_ATK)
	PROP_DeathState (S_CHICKEN_DIE)
	PROP_SeeSound ("chicken/pain")
	PROP_AttackSound ("chicken/attack")
	PROP_PainSound ("chicken/pain")
	PROP_DeathSound ("chicken/death")
	PROP_ActiveSound ("chicken/active")
END_DEFAULTS

FState AChicken::States[] =
{
#define S_CHICKEN_LOOK 0
	S_NORMAL1 (CHKN, 'A',   10, A_ChicLook  , &States[S_CHICKEN_LOOK+1]),
	S_NORMAL1 (CHKN, 'B',   10, A_ChicLook  , &States[S_CHICKEN_LOOK+0]),

#define S_CHICKEN_WALK (S_CHICKEN_LOOK+2)
	S_NORMAL1 (CHKN, 'A',    3, A_ChicChase , &States[S_CHICKEN_WALK+1]),
	S_NORMAL1 (CHKN, 'B',    3, A_ChicChase , &States[S_CHICKEN_WALK+0]),

#define S_CHICKEN_PAIN (S_CHICKEN_WALK+2)
	S_NORMAL1 (CHKN, 'D',    5, A_Feathers  , &States[S_CHICKEN_PAIN+1]),
	S_NORMAL1 (CHKN, 'C',    5, A_ChicPain  , &States[S_CHICKEN_WALK+0]),

#define S_CHICKEN_ATK (S_CHICKEN_PAIN+2)
	S_NORMAL1 (CHKN, 'A',    8, A_FaceTarget, &States[S_CHICKEN_ATK+1]),
	S_NORMAL1 (CHKN, 'C',   10, A_ChicAttack, &States[S_CHICKEN_WALK+0]),

#define S_CHICKEN_DIE (S_CHICKEN_ATK+2)
	S_NORMAL1 (CHKN, 'E',    6, A_Scream    , &States[S_CHICKEN_DIE+1]),
	S_NORMAL1 (CHKN, 'F',    6, A_Feathers  , &States[S_CHICKEN_DIE+2]),
	S_NORMAL1 (CHKN, 'G',    6, NULL        , &States[S_CHICKEN_DIE+3]),
	S_NORMAL1 (CHKN, 'H',    6, A_NoBlocking, &States[S_CHICKEN_DIE+4]),
	S_NORMAL1 (CHKN, 'I',    6, NULL        , &States[S_CHICKEN_DIE+5]),
	S_NORMAL1 (CHKN, 'J',    6, NULL        , &States[S_CHICKEN_DIE+6]),
	S_NORMAL1 (CHKN, 'K',    6, NULL        , &States[S_CHICKEN_DIE+7]),
	S_NORMAL1 (CHKN, 'L',   -1, NULL        , NULL)
};

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

//========== Feathers spawned when a chicken, player-controled or not, is hurt or killed. 

IMPLEMENT_ACTOR (AFeather, Heretic, -1, 121)
	PROP_RadiusFixed (2)
	PROP_HeightFixed (4)
	PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF)
	PROP_Flags2 (MF2_NOTELEPORT|MF2_LOGRAV|MF2_CANNOTPUSH|MF2_WINDTHRUST)
	PROP_Flags3 (MF3_DONTSPLASH)
	PROP_Flags4 (MF4_NONETSPAWN)
	PROP_SpawnState (S_FEATHER)
	PROP_DeathState (S_FEATHERX)
END_DEFAULTS

FState AFeather::States[] =
{
#define S_FEATHER 0
	S_NORMAL1 (CHKN, 'M',    3, NULL, &States[S_FEATHER+1]),
	S_NORMAL1 (CHKN, 'N',    3, NULL, &States[S_FEATHER+2]),
	S_NORMAL1 (CHKN, 'O',    3, NULL, &States[S_FEATHER+3]),
	S_NORMAL1 (CHKN, 'P',    3, NULL, &States[S_FEATHER+4]),
	S_NORMAL1 (CHKN, 'Q',    3, NULL, &States[S_FEATHER+5]),
	S_NORMAL1 (CHKN, 'P',    3, NULL, &States[S_FEATHER+6]),
	S_NORMAL1 (CHKN, 'O',    3, NULL, &States[S_FEATHER+7]),
	S_NORMAL1 (CHKN, 'N',    3, NULL, &States[S_FEATHER+0]),

#define S_FEATHERX (S_FEATHER+8)
	S_NORMAL1 (CHKN, 'N',    6, NULL, NULL)
};

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

//========== Clink (Sabreclaw): it's a mechano-magical being that has a blade for a right arm.

IMPLEMENT_ACTOR (AClink, Heretic, 90, 1)
	PROP_SpawnHealth (150)
	PROP_RadiusFixed (20)
	PROP_HeightFixed (64)
	PROP_Mass (75)
	PROP_SpeedFixed (14)
	PROP_PainChance (32)
	PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_NOBLOOD)
	PROP_Flags2 (MF2_FLOORCLIP|MF2_PASSMOBJ)
	PROP_SpawnState (S_CLINK_LOOK)
	PROP_SeeState (S_CLINK_WALK)
	PROP_PainState (S_CLINK_PAIN)
	PROP_MeleeState (S_CLINK_ATK)
	PROP_DeathState (S_CLINK_DIE)
	PROP_SeeSound ("clink/sight")
	PROP_AttackSound ("clink/attack")
	PROP_PainSound ("clink/pain")
	PROP_DeathSound ("clink/death")
	PROP_ActiveSound ("clink/active")
END_DEFAULTS

FState AClink::States[] =
{
#define S_CLINK_LOOK 0
	S_NORMAL1 (CLNK, 'A',   10, A_Look       , &States[S_CLINK_LOOK+1]),
	S_NORMAL1 (CLNK, 'B',   10, A_Look       , &States[S_CLINK_LOOK+0]),

#define S_CLINK_WALK (S_CLINK_LOOK+2)
	S_NORMAL1 (CLNK, 'A',    3, A_Chase      , &States[S_CLINK_WALK+1]),
	S_NORMAL1 (CLNK, 'B',    3, A_Chase      , &States[S_CLINK_WALK+2]),
	S_NORMAL1 (CLNK, 'C',    3, A_Chase      , &States[S_CLINK_WALK+3]),
	S_NORMAL1 (CLNK, 'D',    3, A_Chase      , &States[S_CLINK_WALK+0]),

#define S_CLINK_ATK (S_CLINK_WALK+4)
	S_NORMAL1 (CLNK, 'E',    5, A_FaceTarget , &States[S_CLINK_ATK+1]),
	S_NORMAL1 (CLNK, 'F',    4, A_FaceTarget , &States[S_CLINK_ATK+2]),
	S_NORMAL1 (CLNK, 'G',    7, A_ClinkAttack, &States[S_CLINK_WALK+0]),

#define S_CLINK_PAIN (S_CLINK_ATK+3)
	S_NORMAL1 (CLNK, 'H',    3, NULL         , &States[S_CLINK_PAIN+1]),
	S_NORMAL1 (CLNK, 'H',    3, A_Pain       , &States[S_CLINK_WALK+0]),

#define S_CLINK_DIE (S_CLINK_PAIN+2)
	S_NORMAL1 (CLNK, 'I',    6, NULL         , &States[S_CLINK_DIE+1]),
	S_NORMAL1 (CLNK, 'J',    6, NULL         , &States[S_CLINK_DIE+2]),
	S_NORMAL1 (CLNK, 'K',    5, A_Scream     , &States[S_CLINK_DIE+3]),
	S_NORMAL1 (CLNK, 'L',    5, A_NoBlocking , &States[S_CLINK_DIE+4]),
	S_NORMAL1 (CLNK, 'M',    5, NULL         , &States[S_CLINK_DIE+5]),
	S_NORMAL1 (CLNK, 'N',    5, NULL         , &States[S_CLINK_DIE+6]),
	S_NORMAL1 (CLNK, 'O',   -1, NULL         , NULL)
};

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

//========== D'Sparil teleport point: used randomly by D'Sparil when he teleports after having been hurt.

IMPLEMENT_STATELESS_ACTOR (ABossSpot, Heretic, 56, 141)
	PROP_RenderFlags (RF_INVISIBLE)
END_DEFAULTS

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

//========== Sorcerer (D'Sparil on his serpent)

IMPLEMENT_ACTOR (ASorcerer1, Heretic, 7, 142)
	PROP_SpawnHealth (2000)
	PROP_RadiusFixed (28)
	PROP_HeightFixed (100)
	PROP_Mass (800)
	PROP_SpeedFixed (16)
	PROP_PainChance (56)
	PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL)
	PROP_Flags2 (MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_PUSHWALL|MF2_BOSS)
	PROP_Flags3 (MF3_DONTMORPH|MF3_NORADIUSDMG|MF3_NOTARGET)
	PROP_Flags4 (MF4_NOICEDEATH)
	PROP_SpawnState (S_SRCR1_LOOK)
	PROP_SeeState (S_SRCR1_WALK)
	PROP_PainState (S_SRCR1_PAIN)
	PROP_MissileState (S_SRCR1_ATK)
	PROP_DeathState (S_SRCR1_DIE)
	PROP_SeeSound ("dsparilserpent/sight")
	PROP_AttackSound ("dsparilserpent/attack")
	PROP_PainSound ("dsparilserpent/pain")
	PROP_DeathSound ("dsparilserpent/death")
	PROP_ActiveSound ("dsparilserpent/active")
END_DEFAULTS

FState ASorcerer1::States[] =
{
#define S_SRCR1_LOOK 0
	S_NORMAL1 (SRCR, 'A',   10, A_Look        , &States[S_SRCR1_LOOK+1]),
	S_NORMAL1 (SRCR, 'B',   10, A_Look        , &States[S_SRCR1_LOOK+0]),

#define S_SRCR1_WALK (S_SRCR1_LOOK+2)
	S_NORMAL1 (SRCR, 'A',    5, A_Sor1Chase   , &States[S_SRCR1_WALK+1]),
	S_NORMAL1 (SRCR, 'B',    5, A_Sor1Chase   , &States[S_SRCR1_WALK+2]),
	S_NORMAL1 (SRCR, 'C',    5, A_Sor1Chase   , &States[S_SRCR1_WALK+3]),
	S_NORMAL1 (SRCR, 'D',    5, A_Sor1Chase   , &States[S_SRCR1_WALK+0]),

#define S_SRCR1_PAIN (S_SRCR1_WALK+4)
	S_NORMAL1 (SRCR, 'Q',    6, A_Sor1Pain    , &States[S_SRCR1_WALK+0]),

#define S_SRCR1_ATK (S_SRCR1_PAIN+1)
	S_NORMAL1 (SRCR, 'Q',    7, A_FaceTarget  , &States[S_SRCR1_ATK+1]),
	S_NORMAL1 (SRCR, 'R',    6, A_FaceTarget  , &States[S_SRCR1_ATK+2]),
	S_NORMAL1 (SRCR, 'S',   10, A_Srcr1Attack , &States[S_SRCR1_WALK+0]),
	S_NORMAL1 (SRCR, 'S',   10, A_FaceTarget  , &States[S_SRCR1_ATK+4]),
	S_NORMAL1 (SRCR, 'Q',    7, A_FaceTarget  , &States[S_SRCR1_ATK+5]),
	S_NORMAL1 (SRCR, 'R',    6, A_FaceTarget  , &States[S_SRCR1_ATK+6]),
	S_NORMAL1 (SRCR, 'S',   10, A_Srcr1Attack , &States[S_SRCR1_WALK+0]),

#define S_SRCR1_DIE (S_SRCR1_ATK+7)
	S_NORMAL1 (SRCR, 'E',    7, NULL          , &States[S_SRCR1_DIE+1]),
	S_NORMAL1 (SRCR, 'F',    7, A_Scream      , &States[S_SRCR1_DIE+2]),
	S_NORMAL1 (SRCR, 'G',    7, NULL          , &States[S_SRCR1_DIE+3]),
	S_NORMAL1 (SRCR, 'H',    6, NULL          , &States[S_SRCR1_DIE+4]),
	S_NORMAL1 (SRCR, 'I',    6, NULL          , &States[S_SRCR1_DIE+5]),
	S_NORMAL1 (SRCR, 'J',    6, NULL          , &States[S_SRCR1_DIE+6]),
	S_NORMAL1 (SRCR, 'K',    6, NULL          , &States[S_SRCR1_DIE+7]),
	S_NORMAL1 (SRCR, 'L',   25, A_SorZap      , &States[S_SRCR1_DIE+8]),
	S_NORMAL1 (SRCR, 'M',    5, NULL          , &States[S_SRCR1_DIE+9]),
	S_NORMAL1 (SRCR, 'N',    5, NULL          , &States[S_SRCR1_DIE+10]),
	S_NORMAL1 (SRCR, 'O',    4, NULL          , &States[S_SRCR1_DIE+11]),
	S_NORMAL1 (SRCR, 'L',   20, A_SorZap      , &States[S_SRCR1_DIE+12]),
	S_NORMAL1 (SRCR, 'M',    5, NULL          , &States[S_SRCR1_DIE+13]),
	S_NORMAL1 (SRCR, 'N',    5, NULL          , &States[S_SRCR1_DIE+14]),
	S_NORMAL1 (SRCR, 'O',    4, NULL          , &States[S_SRCR1_DIE+15]),
	S_NORMAL1 (SRCR, 'L',   12, NULL          , &States[S_SRCR1_DIE+16]),
	S_NORMAL1 (SRCR, 'P',   -1, A_SorcererRise, NULL)
};

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

//========== The fireball spit by D'Sparil's chaos serpent

IMPLEMENT_ACTOR (ASorcererFX1, Heretic, -1, 144)
	PROP_RadiusFixed (10)
	PROP_HeightFixed (10)
	PROP_SpeedFixed (20)
	PROP_Damage (10)
	PROP_DamageType (MOD_FIRE)
	PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_Flags4 (MF4_BLOODSPLATTER)
	PROP_RenderStyle (STYLE_Add)
	PROP_SpawnState (S_SRCRFX1)
	PROP_DeathState (S_SRCRFXI1)
END_DEFAULTS

FState ASorcererFX1::States[] =
{
#define S_SRCRFX1 0
	S_BRIGHT (FX14, 'A',    6, NULL, &States[S_SRCRFX1+1]),
	S_BRIGHT (FX14, 'B',    6, NULL, &States[S_SRCRFX1+2]),
	S_BRIGHT (FX14, 'C',    6, NULL, &States[S_SRCRFX1+0]),

#define S_SRCRFXI1 (S_SRCRFX1+3)
	S_BRIGHT (FX14, 'D',    5, NULL, &States[S_SRCRFXI1+1]),
	S_BRIGHT (FX14, 'E',    5, NULL, &States[S_SRCRFXI1+2]),
	S_BRIGHT (FX14, 'F',    5, NULL, &States[S_SRCRFXI1+3]),
	S_BRIGHT (FX14, 'G',    5, NULL, &States[S_SRCRFXI1+4]),
	S_BRIGHT (FX14, 'H',    5, NULL, NULL)
};

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

//========== Sorcerer 2 (D'Sparil without his serpent)

IMPLEMENT_ACTOR (ASorcerer2, Heretic, -1, 143)
	PROP_SpawnHealth (3500)
	PROP_RadiusFixed (16)
	PROP_HeightFixed (70)
	PROP_Mass (300)
	PROP_SpeedFixed (14)
	PROP_PainChance (32)
	PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_DROPOFF)
	PROP_Flags2 (MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_PUSHWALL|MF2_BOSS)
	PROP_Flags3 (MF3_DONTMORPH|MF3_FULLVOLACTIVE|MF3_NORADIUSDMG|MF3_NOTARGET)
	PROP_Flags4 (MF4_NOICEDEATH)
	PROP_SpawnState (S_SOR2_LOOK)
	PROP_SeeState (S_SOR2_WALK)
	PROP_PainState (S_SOR2_PAIN)
	PROP_MissileState (S_SOR2_ATK)
	PROP_DeathState (S_SOR2_DIE)
	PROP_SeeSound ("dsparil/sight")
	PROP_AttackSound ("dsparil/attack")
	PROP_PainSound ("dsparil/pain")
	PROP_ActiveSound ("dsparil/active")
END_DEFAULTS

FState ASorcerer2::States[] =
{
#define S_SOR2_LOOK 0
	S_NORMAL1 (SOR2, 'M',   10, A_Look       , &States[S_SOR2_LOOK+1]),
	S_NORMAL1 (SOR2, 'N',   10, A_Look       , &States[S_SOR2_LOOK+0]),

#define S_SOR2_WALK (S_SOR2_LOOK+2)
	S_NORMAL1 (SOR2, 'M',    4, A_Chase      , &States[S_SOR2_WALK+1]),
	S_NORMAL1 (SOR2, 'N',    4, A_Chase      , &States[S_SOR2_WALK+2]),
	S_NORMAL1 (SOR2, 'O',    4, A_Chase      , &States[S_SOR2_WALK+3]),
	S_NORMAL1 (SOR2, 'P',    4, A_Chase      , &States[S_SOR2_WALK+0]),

#define S_SOR2_RISE (S_SOR2_WALK+4)
	S_NORMAL1 (SOR2, 'A',    4, NULL         , &States[S_SOR2_RISE+1]),
	S_NORMAL1 (SOR2, 'B',    4, NULL         , &States[S_SOR2_RISE+2]),
	S_NORMAL1 (SOR2, 'C',    4, A_SorRise    , &States[S_SOR2_RISE+3]),
	S_NORMAL1 (SOR2, 'D',    4, NULL         , &States[S_SOR2_RISE+4]),
	S_NORMAL1 (SOR2, 'E',    4, NULL         , &States[S_SOR2_RISE+5]),
	S_NORMAL1 (SOR2, 'F',    4, NULL         , &States[S_SOR2_RISE+6]),
	S_NORMAL1 (SOR2, 'G',   12, A_SorSightSnd, &States[S_SOR2_WALK+0]),

#define S_SOR2_PAIN (S_SOR2_RISE+7)
	S_NORMAL1 (SOR2, 'Q',    3, NULL         , &States[S_SOR2_PAIN+1]),
	S_NORMAL1 (SOR2, 'Q',    6, A_Pain       , &States[S_SOR2_WALK+0]),

#define S_SOR2_ATK (S_SOR2_PAIN+2)
	S_NORMAL1 (SOR2, 'R',    9, A_Srcr2Decide, &States[S_SOR2_ATK+1]),
	S_NORMAL1 (SOR2, 'S',    9, A_FaceTarget , &States[S_SOR2_ATK+2]),
	S_NORMAL1 (SOR2, 'T',   20, A_Srcr2Attack, &States[S_SOR2_WALK+0]),

#define S_SOR2_TELE (S_SOR2_ATK+3)
	S_NORMAL1 (SOR2, 'L',    6, NULL         , &States[S_SOR2_TELE+1]),
	S_NORMAL1 (SOR2, 'K',    6, NULL         , &States[S_SOR2_TELE+2]),
	S_NORMAL1 (SOR2, 'J',    6, NULL         , &States[S_SOR2_TELE+3]),
	S_NORMAL1 (SOR2, 'I',    6, NULL         , &States[S_SOR2_TELE+4]),
	S_NORMAL1 (SOR2, 'H',    6, NULL         , &States[S_SOR2_TELE+5]),
	S_NORMAL1 (SOR2, 'G',    6, NULL         , &States[S_SOR2_WALK+0]),

#define S_SOR2_DIE (S_SOR2_TELE+6)
	S_NORMAL1 (SDTH, 'A',    8, A_Sor2DthInit, &States[S_SOR2_DIE+1]),
	S_NORMAL1 (SDTH, 'B',    8, NULL         , &States[S_SOR2_DIE+2]),
	S_NORMAL1 (SDTH, 'C',    8, A_SorDSph    , &States[S_SOR2_DIE+3]),
	S_NORMAL1 (SDTH, 'D',    7, NULL         , &States[S_SOR2_DIE+4]),
	S_NORMAL1 (SDTH, 'E',    7, NULL         , &States[S_SOR2_DIE+5]),
	S_NORMAL1 (SDTH, 'F',    7, A_Sor2DthLoop, &States[S_SOR2_DIE+6]),
	S_NORMAL1 (SDTH, 'G',    6, A_SorDExp    , &States[S_SOR2_DIE+7]),
	S_NORMAL1 (SDTH, 'H',    6, NULL         , &States[S_SOR2_DIE+8]),
	S_NORMAL1 (SDTH, 'I',   18, NULL         , &States[S_SOR2_DIE+9]),
	S_NORMAL1 (SDTH, 'J',    6, A_NoBlocking , &States[S_SOR2_DIE+10]),
	S_NORMAL1 (SDTH, 'K',    6, A_SorDBon    , &States[S_SOR2_DIE+11]),
	S_NORMAL1 (SDTH, 'L',    6, NULL         , &States[S_SOR2_DIE+12]),
	S_NORMAL1 (SDTH, 'M',    6, NULL         , &States[S_SOR2_DIE+13]),
	S_NORMAL1 (SDTH, 'N',    6, NULL         , &States[S_SOR2_DIE+14]),
	S_NORMAL1 (SDTH, 'O',   -1, A_BossDeath  , NULL)
};

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

//========== The lightning bolt thrown by D'Sparil.

IMPLEMENT_ACTOR (ASorcerer2FX1, Heretic, -1, 145)
	PROP_RadiusFixed (10)
	PROP_HeightFixed (6)
	PROP_SpeedFixed (20)
	PROP_Damage (1)
	PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_Flags4 (MF4_BLOODSPLATTER)
	PROP_SpawnState (S_SOR2FX1)
	PROP_DeathState (S_SOR2FXI1)
END_DEFAULTS

FState ASorcerer2FX1::States[] =
{
#define S_SOR2FX1 0
	S_BRIGHT (FX16, 'A',    3, A_BlueSpark, &States[S_SOR2FX1+1]),
	S_BRIGHT (FX16, 'B',    3, A_BlueSpark, &States[S_SOR2FX1+2]),
	S_BRIGHT (FX16, 'C',    3, A_BlueSpark, &States[S_SOR2FX1+0]),

#define S_SOR2FXI1 (S_SOR2FX1+3)
	S_BRIGHT (FX16, 'G',    5, A_Explode  , &States[S_SOR2FXI1+1]),
	S_BRIGHT (FX16, 'H',    5, NULL       , &States[S_SOR2FXI1+2]),
	S_BRIGHT (FX16, 'I',    5, NULL       , &States[S_SOR2FXI1+3]),
	S_BRIGHT (FX16, 'J',    5, NULL       , &States[S_SOR2FXI1+4]),
	S_BRIGHT (FX16, 'K',    5, NULL       , &States[S_SOR2FXI1+5]),
	S_BRIGHT (FX16, 'L',    5, NULL       , NULL)
};

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

//========== The sparks that trail behind D'Sparil's lightning bolts. 

IMPLEMENT_ACTOR (ASorcerer2FXSpark, Heretic, -1, 0)
	PROP_RadiusFixed (20)
	PROP_HeightFixed (16)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
	PROP_Flags2 (MF2_NOTELEPORT|MF2_CANNOTPUSH)
	PROP_SpawnState (S_SOR2FXSPARK)
END_DEFAULTS

FState ASorcerer2FXSpark::States[] =
{
#define S_SOR2FXSPARK 0
	S_BRIGHT (FX16, 'D',   12, NULL, &States[S_SOR2FXSPARK+1]),
	S_BRIGHT (FX16, 'E',   12, NULL, &States[S_SOR2FXSPARK+2]),
	S_BRIGHT (FX16, 'F',   12, NULL, NULL)
};

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

//========== One of D'Sparil's two modes of attack, this projectile spawns a disciple and dies afterwards.

IMPLEMENT_ACTOR (ASorcerer2FX2, Heretic, -1, 146)
	PROP_RadiusFixed (10)
	PROP_HeightFixed (6)
	PROP_SpeedFixed (6)
	PROP_Damage (10)
	PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_Flags4 (MF4_BLOODSPLATTER)
	PROP_SpawnState (S_SOR2FX2)
	PROP_DeathState (S_SOR2FXI2)
END_DEFAULTS

FState ASorcerer2FX2::States[] =
{
#define S_SOR2FX2 0
	S_BRIGHT (FX11, 'A',   35, NULL       , &States[S_SOR2FX2+1]),
	S_BRIGHT (FX11, 'A',    5, A_GenWizard, &States[S_SOR2FX2+2]),
	S_BRIGHT (FX11, 'B',    5, NULL       , &States[S_SOR2FX2+1]),

#define S_SOR2FXI2 (S_SOR2FX2+3)
	S_BRIGHT (FX11, 'C',    5, NULL       , &States[S_SOR2FXI2+1]),
	S_BRIGHT (FX11, 'D',    5, NULL       , &States[S_SOR2FXI2+2]),
	S_BRIGHT (FX11, 'E',    5, NULL       , &States[S_SOR2FXI2+3]),
	S_BRIGHT (FX11, 'F',    5, NULL       , &States[S_SOR2FXI2+4]),
	S_BRIGHT (FX11, 'G',    5, NULL       , NULL)
};

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

//========== When D'Sparil teleports, this actor is spawned in his place.

IMPLEMENT_ACTOR (ASorcerer2Telefade, Heretic, -1, 0)
	PROP_Flags (MF_NOBLOCKMAP)
	PROP_SpawnState (S_SOR2TELEFADE)
END_DEFAULTS

FState ASorcerer2Telefade::States[] =
{
#define S_SOR2TELEFADE 0
	S_NORMAL1 (SOR2, 'G',    8, NULL, &States[S_SOR2TELEFADE+1]),
	S_NORMAL1 (SOR2, 'H',    6, NULL, &States[S_SOR2TELEFADE+2]),
	S_NORMAL1 (SOR2, 'I',    6, NULL, &States[S_SOR2TELEFADE+3]),
	S_NORMAL1 (SOR2, 'J',    6, NULL, &States[S_SOR2TELEFADE+4]),
	S_NORMAL1 (SOR2, 'K',    6, NULL, &States[S_SOR2TELEFADE+5]),
	S_NORMAL1 (SOR2, 'L',    6, NULL, NULL)
};

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

//========== Master for all scripted ambient sounds on a level

IMPLEMENT_STATELESS_ACTOR (AScriptedAmbientMaster, Heretic, -1, 0)
	PROP_Flags (MF_NOSECTOR|MF_NOBLOCKMAP)
END_DEFAULTS

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

//========== Individual ambient sound things

IMPLEMENT_STATELESS_ACTOR (AScriptedAmbient, Heretic, -1, 0)
	PROP_Flags (MF_NOSECTOR|MF_NOBLOCKMAP)
END_DEFAULTS

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

//========== Scripted ambient sound thing

IMPLEMENT_STATELESS_ACTOR (AScriptedAmbient1, Heretic, 1200, 0)
	PROP_SpawnHealth (1200)
END_DEFAULTS

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

//========== Scripted ambient sound thing

IMPLEMENT_STATELESS_ACTOR (AScriptedAmbient2, Heretic, 1201, 0)
	PROP_SpawnHealth (1201)
END_DEFAULTS

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

//========== Scripted ambient sound thing

IMPLEMENT_STATELESS_ACTOR (AScriptedAmbient3, Heretic, 1202, 0)
	PROP_SpawnHealth (1202)
END_DEFAULTS

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

//========== Scripted ambient sound thing

IMPLEMENT_STATELESS_ACTOR (AScriptedAmbient4, Heretic, 1203, 0)
	PROP_SpawnHealth (1203)
END_DEFAULTS

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

//========== Scripted ambient sound thing

IMPLEMENT_STATELESS_ACTOR (AScriptedAmbient5, Heretic, 1204, 0)
	PROP_SpawnHealth (1204)
END_DEFAULTS

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

//========== Scripted ambient sound thing

IMPLEMENT_STATELESS_ACTOR (AScriptedAmbient6, Heretic, 1205, 0)
	PROP_SpawnHealth (1205)
END_DEFAULTS

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

//========== Scripted ambient sound thing

IMPLEMENT_STATELESS_ACTOR (AScriptedAmbient7, Heretic, 1206, 0)
	PROP_SpawnHealth (1206)
END_DEFAULTS

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

//========== Scripted ambient sound thing

IMPLEMENT_STATELESS_ACTOR (AScriptedAmbient8, Heretic, 1207, 0)
	PROP_SpawnHealth (1207)
END_DEFAULTS

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

//========== Scripted ambient sound thing

IMPLEMENT_STATELESS_ACTOR (AScriptedAmbient9, Heretic, 1208, 0)
	PROP_SpawnHealth (1208)
END_DEFAULTS

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

//========== Scripted ambient sound thing

IMPLEMENT_STATELESS_ACTOR (AScriptedAmbient10, Heretic, 1209, 0)
	PROP_SpawnHealth (1209)
END_DEFAULTS

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

//========== Silver Shield (Shield1)

IMPLEMENT_ACTOR (ASilverShield, Heretic, 85, 68)
	PROP_Flags (MF_SPECIAL)
	PROP_Flags2 (MF2_FLOATBOB)
	PROP_SpawnState (0)
END_DEFAULTS

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

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

//==========  Enchanted shield (Shield2)

IMPLEMENT_ACTOR (AEnchantedShield, Heretic, 31, 69)
	PROP_Flags (MF_SPECIAL)
	PROP_Flags2 (MF2_FLOATBOB)
	PROP_SpawnState (0)
END_DEFAULTS

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

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

//========== Invisibility artifact

IMPLEMENT_ACTOR (AArtiInvisibility, Heretic, 75, 135)
	PROP_Flags (MF_SPECIAL|MF_COUNTITEM)
	PROP_Flags2 (MF2_FLOATBOB)
	PROP_RenderStyle (STYLE_Translucent)
	PROP_Alpha (HR_SHADOW)
	PROP_SpawnState (0)
END_DEFAULTS

FState AArtiInvisibility::States[] =
{
	S_BRIGHT (INVS, 'A',  350, NULL, &States[0])
};

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

//========== Tome of power artifact

IMPLEMENT_ACTOR (AArtiTomeOfPower, Heretic, 86, 134)
	PROP_Flags (MF_SPECIAL|MF_COUNTITEM)
	PROP_Flags2 (MF2_FLOATBOB)
	PROP_SpawnState (0)
END_DEFAULTS

FState AArtiTomeOfPower::States[] =
{
	S_NORMAL1 (PWBK, 'A',  350, NULL, &States[0])
};

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

//========== The time bomb artifact is a large hourglass that explodes a few seconds after being used.

IMPLEMENT_ACTOR (AArtiTimeBomb, Heretic, 34, 72)
	PROP_Flags (MF_SPECIAL|MF_COUNTITEM)
	PROP_Flags2 (MF2_FLOATBOB)
	PROP_SpawnState (0)
END_DEFAULTS

FState AArtiTimeBomb::States[] =
{
	S_NORMAL1 (FBMB, 'E',  350, NULL, &States[0]),
};

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

//========== When a time bomb of the Ancients is used, this actor is spawned.

IMPLEMENT_ACTOR (AActivatedTimeBomb, Heretic, -1, 72)
	PROP_Flags (MF_NOGRAVITY)
	PROP_RenderStyle (STYLE_Translucent)
	PROP_Alpha (HR_SHADOW)
	PROP_SpawnState (0)
	PROP_DeathSound ("misc/timebomb")
END_DEFAULTS

FState AActivatedTimeBomb::States[] =
{
	S_NORMAL1(FBMB, 'A',   10, NULL     , &States[1]),
	S_NORMAL1(FBMB, 'B',   10, NULL     , &States[2]),
	S_NORMAL1(FBMB, 'C',   10, NULL     , &States[3]),
	S_NORMAL1(FBMB, 'D',   10, NULL     , &States[4]),
	S_NORMAL1(FBMB, 'E',    6, A_Scream , &States[5]),
	S_BRIGHT (XPL1, 'A',    4, A_Explode, &States[6]),
	S_BRIGHT (XPL1, 'B',    4, NULL     , &States[7]),
	S_BRIGHT (XPL1, 'C',    4, NULL     , &States[8]),
	S_BRIGHT (XPL1, 'D',    4, NULL     , &States[9]),
	S_BRIGHT (XPL1, 'E',    4, NULL     , &States[10]),
	S_BRIGHT (XPL1, 'F',    4, NULL     , NULL)
};

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

//========== Heretic imp (gargoyle)

IMPLEMENT_ACTOR (AHereticImp, Heretic, 66, 5)
	PROP_SpawnHealth (40)
	PROP_RadiusFixed (16)
	PROP_HeightFixed (36)
	PROP_Mass (50)
	PROP_SpeedFixed (10)
	PROP_PainChance (200)
	PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_FLOAT|MF_NOGRAVITY|MF_COUNTKILL)
	PROP_Flags2 (MF2_SPAWNFLOAT|MF2_PASSMOBJ|MF2_PUSHWALL)
	PROP_Flags3 (MF3_DONTOVERLAP)
	PROP_SpawnState (S_IMP_LOOK)
	PROP_SeeState (S_IMP_FLY)
	PROP_PainState (S_IMP_PAIN)
	PROP_MeleeState (S_IMP_MEATK)
	PROP_MissileState (S_IMP_MSATK1)
	PROP_CrashState (S_IMP_CRASH)
	PROP_DeathState (S_IMP_DIE)
	PROP_XDeathState (S_IMP_XDIE)
	PROP_SeeSound ("imp/sight")
	PROP_AttackSound ("imp/attack")
	PROP_PainSound ("imp/pain")
	PROP_DeathSound ("imp/death")
	PROP_ActiveSound ("imp/active")
END_DEFAULTS

FState AHereticImp::States[] =
{
#define S_IMP_LOOK 0
	S_NORMAL1 (IMPX, 'A',   10, A_Look       , &States[S_IMP_LOOK+1]),
	S_NORMAL1 (IMPX, 'B',   10, A_Look       , &States[S_IMP_LOOK+2]),
	S_NORMAL1 (IMPX, 'C',   10, A_Look       , &States[S_IMP_LOOK+3]),
	S_NORMAL1 (IMPX, 'B',   10, A_Look       , &States[S_IMP_LOOK+0]),

#define S_IMP_FLY (S_IMP_LOOK+4)
	S_NORMAL1 (IMPX, 'A',    3, A_Chase      , &States[S_IMP_FLY+1]),
	S_NORMAL1 (IMPX, 'A',    3, A_Chase      , &States[S_IMP_FLY+2]),
	S_NORMAL1 (IMPX, 'B',    3, A_Chase      , &States[S_IMP_FLY+3]),
	S_NORMAL1 (IMPX, 'B',    3, A_Chase      , &States[S_IMP_FLY+4]),
	S_NORMAL1 (IMPX, 'C',    3, A_Chase      , &States[S_IMP_FLY+5]),
	S_NORMAL1 (IMPX, 'C',    3, A_Chase      , &States[S_IMP_FLY+6]),
	S_NORMAL1 (IMPX, 'B',    3, A_Chase      , &States[S_IMP_FLY+7]),
	S_NORMAL1 (IMPX, 'B',    3, A_Chase      , &States[S_IMP_FLY+0]),

#define S_IMP_MEATK (S_IMP_FLY+8)
	S_NORMAL1 (IMPX, 'D',    6, A_FaceTarget , &States[S_IMP_MEATK+1]),
	S_NORMAL1 (IMPX, 'E',    6, A_FaceTarget , &States[S_IMP_MEATK+2]),
	S_NORMAL1 (IMPX, 'F',    6, A_ImpMeAttack, &States[S_IMP_FLY+0]),

#define S_IMP_MSATK1 (S_IMP_MEATK+3)
	S_NORMAL1 (IMPX, 'A',   10, A_FaceTarget , &States[S_IMP_MSATK1+1]),
	S_NORMAL1 (IMPX, 'B',    6, A_ImpMsAttack, &States[S_IMP_MSATK1+2]),
	S_NORMAL1 (IMPX, 'C',    6, NULL         , &States[S_IMP_MSATK1+3]),
	S_NORMAL1 (IMPX, 'B',    6, NULL         , &States[S_IMP_MSATK1+4]),
	S_NORMAL1 (IMPX, 'A',    6, NULL         , &States[S_IMP_MSATK1+5]),
	S_NORMAL1 (IMPX, 'B',    6, NULL         , &States[S_IMP_MSATK1+2]),

#define S_IMP_PAIN (S_IMP_MSATK1+6)
	S_NORMAL1 (IMPX, 'G',    3, NULL         , &States[S_IMP_PAIN+1]),
	S_NORMAL1 (IMPX, 'G',    3, A_Pain       , &States[S_IMP_FLY+0]),

#define S_IMP_DIE (S_IMP_PAIN+2)
	S_NORMAL1 (IMPX, 'G',    4, A_ImpDeath   , &States[S_IMP_DIE+1]),
	S_NORMAL1 (IMPX, 'H',    5, NULL         , &States[S_IMP_DIE+1]),

#define S_IMP_XDIE (S_IMP_DIE+2)
	S_NORMAL1 (IMPX, 'S',    5, A_ImpXDeath1 , &States[S_IMP_XDIE+1]),
	S_NORMAL1 (IMPX, 'T',    5, NULL         , &States[S_IMP_XDIE+2]),
	S_NORMAL1 (IMPX, 'U',    5, NULL         , &States[S_IMP_XDIE+3]),
	S_NORMAL1 (IMPX, 'V',    5, A_ImpXDeath2 , &States[S_IMP_XDIE+4]),
	S_NORMAL1 (IMPX, 'W',    5, NULL         , &States[S_IMP_XDIE+4]),

#define S_IMP_CRASH (S_IMP_XDIE+5)
	S_NORMAL1 (IMPX, 'I',    7, A_ImpExplode , &States[S_IMP_CRASH+1]),
	S_NORMAL1 (IMPX, 'J',    7, A_Scream     , &States[S_IMP_CRASH+2]),
	S_NORMAL1 (IMPX, 'K',    7, NULL         , &States[S_IMP_CRASH+3]),
	S_NORMAL1 (IMPX, 'L',   -1, NULL         , NULL),

#define S_IMP_XCRASH (S_IMP_CRASH+4)
	S_NORMAL1 (IMPX, 'X',    7, NULL         , &States[S_IMP_XCRASH+1]),
	S_NORMAL1 (IMPX, 'Y',    7, NULL         , &States[S_IMP_XCRASH+2]),
	S_NORMAL1 (IMPX, 'Z',   -1, NULL         , NULL)
};

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

//========== Heretic imp leader (Fire gargoyle)

IMPLEMENT_ACTOR (AHereticImpLeader, Heretic, 5, 7)
	PROP_SpawnHealth (80)
	PROP_MeleeState (~0)
	PROP_MissileState (S_IMP_MSATK2)
	PROP_AttackSound ("imp/leaderattack")
END_DEFAULTS

FState AHereticImpLeader::States[] =
{
#define S_IMP_MSATK2 0
	S_NORMAL1 (IMPX, 'D',    6, A_FaceTarget  , &States[S_IMP_MSATK2+1]),
	S_NORMAL1 (IMPX, 'E',    6, A_FaceTarget  , &States[S_IMP_MSATK2+2]),
	S_NORMAL1 (IMPX, 'F',    6, A_ImpMsAttack2, &AHereticImp::States[S_IMP_FLY]),
};

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

//========== A chunk of gargoyle meat created by the death of a gargoyle or fire gargoyle.

IMPLEMENT_ACTOR (AHereticImpChunk1, Heretic, -1, 0)
	PROP_Mass (5)
	PROP_Flags (MF_NOBLOCKMAP)
	PROP_Flags4 (MF4_NONETSPAWN)
	PROP_SpawnState (0)
END_DEFAULTS

FState AHereticImpChunk1::States[] =
{
	S_NORMAL1 (IMPX, 'M',    5, NULL, &States[1]),
	S_NORMAL1 (IMPX, 'N',  700, NULL, &States[2]),
	S_NORMAL1 (IMPX, 'O',  700, NULL, NULL)
};

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

//========== A chunk of gargoyle meat created by the death of a gargoyle or fire gargoyle.

IMPLEMENT_ACTOR (AHereticImpChunk2, Heretic, -1, 0)
	PROP_Mass (5)
	PROP_Flags (MF_NOBLOCKMAP)
	PROP_Flags4 (MF4_NONETSPAWN)
	PROP_SpawnState (0)
END_DEFAULTS

FState AHereticImpChunk2::States[] =
{
	S_NORMAL1 (IMPX, 'P',    5, NULL, &States[1]),
	S_NORMAL1 (IMPX, 'Q',  700, NULL, &States[2]),
	S_NORMAL1 (IMPX, 'R',  700, NULL, NULL)
};

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

//========== The little fireball thrown by fire gargoyles. Common gargoyles are unable to produce them.

IMPLEMENT_ACTOR (AHereticImpBall, Heretic, -1, 10)
	PROP_RadiusFixed (8)
	PROP_HeightFixed (8)
	PROP_SpeedFixed (10)
	PROP_Damage (1)
	PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
	PROP_Flags2 (MF2_WINDTHRUST|MF2_NOTELEPORT)
	PROP_Flags4 (MF4_BLOODSPLATTER)
	PROP_SpawnState (S_IMPFX)
	PROP_DeathState (S_IMPFXI)
END_DEFAULTS

FState AHereticImpBall::States[] =
{
#define S_IMPFX 0
	S_BRIGHT (FX10, 'A',    6, NULL, &States[S_IMPFX+1]),
	S_BRIGHT (FX10, 'B',    6, NULL, &States[S_IMPFX+2]),
	S_BRIGHT (FX10, 'C',    6, NULL, &States[S_IMPFX+0]),

#define S_IMPFXI (S_IMPFX+3)
	S_BRIGHT (FX10, 'D',    5, NULL, &States[S_IMPFXI+1]),
	S_BRIGHT (FX10, 'E',    5, NULL, &States[S_IMPFXI+2]),
	S_BRIGHT (FX10, 'F',    5, NULL, &States[S_IMPFXI+3]),
	S_BRIGHT (FX10, 'G',    5, NULL, NULL)
};

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

//========== Green key

IMPLEMENT_ACTOR (AKeyGreen, Heretic, 73, 86)
	PROP_Flags (MF_SPECIAL|MF_NOTDMATCH)
	PROP_SpawnState (0)
END_DEFAULTS

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

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

//========== Blue key

IMPLEMENT_ACTOR (AKeyBlue, Heretic, 79, 85)
	PROP_Flags (MF_SPECIAL|MF_NOTDMATCH)
	PROP_SpawnState (0)
END_DEFAULTS

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

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

//========== Yellow key

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

IMPLEMENT_ACTOR (AKeyYellow, Heretic, 80, 87)
	PROP_Flags (MF_SPECIAL|MF_NOTDMATCH)
	PROP_SpawnState (0)
END_DEFAULTS

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

//========== Key gizmos

IMPLEMENT_ACTOR (AKeyGizmo, Heretic, -1, 0)
	PROP_RadiusFixed (16)
	PROP_HeightFixed (50)
	PROP_Flags (MF_SOLID)
	PROP_SpawnState (0)
END_DEFAULTS

FState AKeyGizmo::States[] =
{
	S_NORMAL1 (KGZ1, 'A',    1, NULL          , &States[1]),
	S_NORMAL1 (KGZ1, 'A',    1, A_InitKeyGizmo, &States[2]),
	S_NORMAL1 (KGZ1, 'A',   -1, NULL          , NULL)
};

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

//========== Key gizmo float

IMPLEMENT_ACTOR (AKeyGizmoFloat, Heretic, -1, 0)
	PROP_RadiusFixed (16)
	PROP_HeightFixed (16)
	PROP_Flags (MF_SOLID|MF_NOGRAVITY)
	PROP_Flags4 (MF4_NONETSPAWN)
	PROP_SpawnState (0)
END_DEFAULTS

FState AKeyGizmoFloat::States[] =
{
#define S_KGZ_BLUEFLOAT 0
	S_BRIGHT (KGZB, 'A',   -1, NULL, NULL),

#define S_KGZ_GREENFLOAT (S_KGZ_BLUEFLOAT+1)
	S_BRIGHT (KGZG, 'A',   -1, NULL, NULL),

#define S_KGZ_YELLOWFLOAT (S_KGZ_GREENFLOAT+1)
	S_BRIGHT (KGZY, 'A',   -1, NULL, NULL)
};

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

//========== Blue gizmo

IMPLEMENT_STATELESS_ACTOR (AKeyGizmoBlue, Heretic, 94, 0)
END_DEFAULTS

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

//========== Green gizmo

IMPLEMENT_STATELESS_ACTOR (AKeyGizmoGreen, Heretic, 95, 0)
END_DEFAULTS

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

//========== Yellow gizmo

IMPLEMENT_STATELESS_ACTOR (AKeyGizmoYellow, Heretic, 96, 0)
END_DEFAULTS

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

//========== A strange fungal growth, floating a few inches over the ground, which explodes when damaged too much.

BEGIN_DEFAULTS (APod, Heretic, 2035, 125)
	PROP_SpawnHealth (45)
	PROP_RadiusFixed (16)
	PROP_HeightFixed (54)
	PROP_PainChance (255)
	PROP_Flags (MF_SOLID|MF_NOBLOOD|MF_SHOOTABLE|MF_DROPOFF)
	PROP_Flags2 (MF2_WINDTHRUST|MF2_PUSHABLE|MF2_SLIDE|MF2_PASSMOBJ|MF2_TELESTOMP)
	PROP_Flags3 (MF3_DONTMORPH|MF3_NOBLOCKMONST)
	PROP_SpawnState (S_POD_WAIT)
	PROP_PainState (S_POD_PAIN)
	PROP_DeathState (S_POD_DIE)
	PROP_DeathSound ("world/podexplode")
END_DEFAULTS

FState APod::States[] =
{
#define S_POD_WAIT 0
	S_NORMAL1 (PPOD, 'A',   10, NULL      , &States[S_POD_WAIT+0]),

#define S_POD_PAIN (S_POD_WAIT+1)
	S_NORMAL1 (PPOD, 'B',   14, A_PodPain , &States[S_POD_WAIT+0]),

#define S_POD_DIE (S_POD_PAIN+1)
	S_BRIGHT (PPOD, 'C',    5, A_RemovePod, &States[S_POD_DIE+1]),
	S_BRIGHT (PPOD, 'D',    5, A_Scream   , &States[S_POD_DIE+2]),
	S_BRIGHT (PPOD, 'E',    5, A_Explode  , &States[S_POD_DIE+3]),
	S_BRIGHT (PPOD, 'F',   10, NULL       , &AActor::States[S_FREETARGMOBJ]),

#define S_POD_GROW (S_POD_DIE+4)
	S_NORMAL1 (PPOD, 'I',    3, NULL      , &States[S_POD_GROW+1]),
	S_NORMAL1 (PPOD, 'J',    3, NULL      , &States[S_POD_GROW+2]),
	S_NORMAL1 (PPOD, 'K',    3, NULL      , &States[S_POD_GROW+3]),
	S_NORMAL1 (PPOD, 'L',    3, NULL      , &States[S_POD_GROW+4]),
	S_NORMAL1 (PPOD, 'M',    3, NULL      , &States[S_POD_GROW+5]),
	S_NORMAL1 (PPOD, 'N',    3, NULL      , &States[S_POD_GROW+6]),
	S_NORMAL1 (PPOD, 'O',    3, NULL      , &States[S_POD_GROW+7]),
	S_NORMAL1 (PPOD, 'P',    3, NULL      , &States[S_POD_WAIT+0])
};

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

//========== Pod goo (falls from pod when damaged)

IMPLEMENT_ACTOR (APodGoo, Heretic, -1, 0)
	PROP_RadiusFixed (2)
	PROP_HeightFixed (4)
	PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF)
	PROP_Flags2 (MF2_NOTELEPORT|MF2_LOGRAV|MF2_CANNOTPUSH)
	PROP_Flags4 (MF4_NONETSPAWN)
	PROP_SpawnState (S_PODGOO)
END_DEFAULTS

FState APodGoo::States[] =
{
#define S_PODGOO 0
	S_NORMAL1 (PPOD, 'G',    8, NULL, &States[S_PODGOO+1]),
	S_NORMAL1 (PPOD, 'H',    8, NULL, &States[S_PODGOO+0]),

#define S_PODGOOX (S_PODGOO+2)
	S_NORMAL1 (PPOD, 'G',   10, NULL, NULL)
};

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

//========== Pod generator

IMPLEMENT_ACTOR (APodGenerator, Heretic, 43, 126)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOSECTOR)
	PROP_Flags4 (MF4_NONETSPAWN)
	PROP_SpawnState (0)
END_DEFAULTS

FState APodGenerator::States[] =
{
	S_NORMAL1 (TNT1, 'A',   35, A_MakePod, &States[0])
};

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

//========== This constantly creates small red particles. They are typically used to mark intra-level teleporters. 

IMPLEMENT_ACTOR (ATeleGlitterGenerator1, Heretic, 74, 166)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_NOSECTOR)
	PROP_SpawnState (0)
END_DEFAULTS

FState ATeleGlitterGenerator1::States[] =
{
	S_NORMAL1 (TGLT, 'A',    8, A_SpawnTeleGlitter, &States[0])
};

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

//========== This constantly creates small blue particles. They are typically used to mark level-exit teleporters. 

IMPLEMENT_ACTOR (ATeleGlitterGenerator2, Heretic, 52, 167)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_NOSECTOR)
	PROP_SpawnState (0)
END_DEFAULTS

FState ATeleGlitterGenerator2::States[] =
{
	S_NORMAL1 (TGLT, 'F',    8, A_SpawnTeleGlitter2, &States[0])
};

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

//========== A small particle created by a red glitter generator.

IMPLEMENT_ACTOR (ATeleGlitter1, Heretic, -1, 0)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_MISSILE)
	PROP_Flags4 (MF4_NONETSPAWN)
	PROP_SpawnState (0)
END_DEFAULTS

FState ATeleGlitter1::States[] =
{
	S_BRIGHT (TGLT, 'A',    2, NULL            , &States[1]),
	S_BRIGHT (TGLT, 'B',    2, A_AccTeleGlitter, &States[2]),
	S_BRIGHT (TGLT, 'C',    2, NULL            , &States[3]),
	S_BRIGHT (TGLT, 'D',    2, A_AccTeleGlitter, &States[4]),
	S_BRIGHT (TGLT, 'E',    2, NULL            , &States[0])
};

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

//========== A blue variant of the red glitter, created by a blue glitter generator.

IMPLEMENT_ACTOR (ATeleGlitter2, Heretic, -1, 0)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_MISSILE)
	PROP_Flags4 (MF4_NONETSPAWN)
	PROP_SpawnState (0)
END_DEFAULTS

FState ATeleGlitter2::States[] =
{
	S_BRIGHT (TGLT, 'F',    2, NULL            , &States[1]),
	S_BRIGHT (TGLT, 'G',    2, A_AccTeleGlitter, &States[2]),
	S_BRIGHT (TGLT, 'H',    2, NULL            , &States[3]),
	S_BRIGHT (TGLT, 'I',    2, A_AccTeleGlitter, &States[4]),
	S_BRIGHT (TGLT, 'J',    2, NULL            , &States[0])
};

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

//========== The Map Scroll. Reveals all the unexplored areas with gray lines.

IMPLEMENT_ACTOR (ASuperMap, Heretic, 35, 137)
	PROP_Flags (MF_SPECIAL|MF_COUNTITEM)
	PROP_Flags2 (MF2_FLOATBOB)
	PROP_SpawnState (0)
END_DEFAULTS

FState ASuperMap::States[] =
{
#define S_ITEM_SPMP 0
	S_NORMAL1 (SPMP, 'A',   -1, NULL, NULL)
};

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

//========== A miniature volcano that spouts gouts of fire. 

IMPLEMENT_ACTOR (AVolcano, Heretic, 87, 150)
	PROP_RadiusFixed (12)
	PROP_HeightFixed (20)
	PROP_Flags (MF_SOLID)
	PROP_SpawnState (0)
END_DEFAULTS

FState AVolcano::States[] =
{
	S_NORMAL1 (VLCO, 'A',  350, NULL          , &States[1]),
	S_NORMAL1 (VLCO, 'A',   35, A_VolcanoSet  , &States[2]),
	S_NORMAL1 (VLCO, 'B',    3, NULL          , &States[3]),
	S_NORMAL1 (VLCO, 'C',    3, NULL          , &States[4]),
	S_NORMAL1 (VLCO, 'D',    3, NULL          , &States[5]),
	S_NORMAL1 (VLCO, 'B',    3, NULL          , &States[6]),
	S_NORMAL1 (VLCO, 'C',    3, NULL          , &States[7]),
	S_NORMAL1 (VLCO, 'D',    3, NULL          , &States[8]),
	S_NORMAL1 (VLCO, 'E',   10, A_VolcanoBlast, &States[1])
};

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

//========== A big ball of fire spitted by a volcano.

IMPLEMENT_ACTOR (AVolcanoBlast, Heretic, -1, 123)
	PROP_RadiusFixed (8)
	PROP_HeightFixed (8)
	PROP_SpeedFixed (2)
	PROP_Damage (2)
	PROP_DamageType (MOD_FIRE)
	PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF)
	PROP_Flags2 (MF2_LOGRAV|MF2_NOTELEPORT)
	PROP_SpawnState (S_VOLCANOBALL)
	PROP_DeathState (S_VOLCANOBALLX)
	PROP_DeathSound ("world/volcano/blast")
END_DEFAULTS

FState AVolcanoBlast::States[] =
{
#define S_VOLCANOBALL 0
	S_NORMAL1 (VFBL, 'A',    4, A_BeastPuff     , &States[S_VOLCANOBALL+1]),
	S_NORMAL1 (VFBL, 'B',    4, A_BeastPuff     , &States[S_VOLCANOBALL+0]),

#define S_VOLCANOBALLX (S_VOLCANOBALL+2)
	S_NORMAL1 (XPL1, 'A',    4, A_VolcBallImpact, &States[S_VOLCANOBALLX+1]),
	S_NORMAL1 (XPL1, 'B',    4, NULL            , &States[S_VOLCANOBALLX+2]),
	S_NORMAL1 (XPL1, 'C',    4, NULL            , &States[S_VOLCANOBALLX+3]),
	S_NORMAL1 (XPL1, 'D',    4, NULL            , &States[S_VOLCANOBALLX+4]),
	S_NORMAL1 (XPL1, 'E',    4, NULL            , &States[S_VOLCANOBALLX+5]),
	S_NORMAL1 (XPL1, 'F',    4, NULL            , NULL)
};

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

//========== A tiny ball of fire, resulting from the explosion of a bigger one spitted by a volcano. 

IMPLEMENT_ACTOR (AVolcanoTBlast, Heretic, -1, 124)
	PROP_RadiusFixed (8)
	PROP_HeightFixed (6)
	PROP_SpeedFixed (2)
	PROP_Damage (1)
	PROP_DamageType (MOD_FIRE)
	PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF)
	PROP_Flags2 (MF2_LOGRAV|MF2_NOTELEPORT)
	PROP_SpawnState (S_VOLCANOTBALL)
	PROP_DeathState (S_VOLCANOTBALLX)
END_DEFAULTS

FState AVolcanoTBlast::States[] =
{
#define S_VOLCANOTBALL 0
	S_NORMAL1 (VTFB, 'A',    4, NULL, &States[S_VOLCANOTBALL+1]),
	S_NORMAL1 (VTFB, 'B',    4, NULL, &States[S_VOLCANOTBALL+0]),

#define S_VOLCANOTBALLX (S_VOLCANOTBALL+2)
	S_NORMAL1 (SFFI, 'C',    4, NULL, &States[S_VOLCANOTBALLX+1]),
	S_NORMAL1 (SFFI, 'B',    4, NULL, &States[S_VOLCANOTBALLX+2]),
	S_NORMAL1 (SFFI, 'A',    4, NULL, &States[S_VOLCANOTBALLX+3]),
	S_NORMAL1 (SFFI, 'B',    4, NULL, &States[S_VOLCANOTBALLX+4]),
	S_NORMAL1 (SFFI, 'C',    4, NULL, &States[S_VOLCANOTBALLX+5]),
	S_NORMAL1 (SFFI, 'D',    4, NULL, &States[S_VOLCANOTBALLX+6]),
	S_NORMAL1 (SFFI, 'E',    4, NULL, NULL)
};

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

//========== Heretic Player (Corvus)

IMPLEMENT_ACTOR (AHereticPlayer, Heretic, -1, 0)
	PROP_SpawnHealth (100)
	PROP_RadiusFixed (16)
	PROP_HeightFixed (56)
	PROP_SpeedFixed (1)
	PROP_Mass (100)
	PROP_PainChance (255)
	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_PUSHWALL|MF2_TELESTOMP)
	PROP_Flags3 (MF3_NOBLOCKMONST)
	PROP_SpawnState (S_PLAY)
	PROP_SeeState (S_PLAY_RUN)
	PROP_PainState (S_PLAY_PAIN)
	PROP_MissileState (S_PLAY_ATK)
	PROP_DeathState (S_PLAY_DIE)
	PROP_XDeathState (S_PLAY_XDIE)
	PROP_BDeathState (S_PLAY_FDTH)
END_DEFAULTS

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

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

#define S_PLAY_ATK (S_PLAY_RUN+4)
	S_NORMAL1 (PLAY, 'E',   12, NULL           , &States[S_PLAY]),
	S_BRIGHT (PLAY, 'F',    6, NULL            , &States[S_PLAY_ATK+0]),

#define S_PLAY_PAIN (S_PLAY_ATK+2)
	S_NORMAL1 (PLAY, 'G',    4, NULL           , &States[S_PLAY_PAIN+1]),
	S_NORMAL1 (PLAY, 'G',    4, A_Pain         , &States[S_PLAY]),

#define S_PLAY_DIE (S_PLAY_PAIN+2)
	S_NORMAL1 (PLAY, 'H',    6, NULL           , &States[S_PLAY_DIE+1]),
	S_NORMAL1 (PLAY, 'I',    6, A_PlayerScream , &States[S_PLAY_DIE+2]),
	S_NORMAL1 (PLAY, 'J',    6, NULL           , &States[S_PLAY_DIE+3]),
	S_NORMAL1 (PLAY, 'K',    6, NULL           , &States[S_PLAY_DIE+4]),
	S_NORMAL1 (PLAY, 'L',    6, A_NoBlocking   , &States[S_PLAY_DIE+5]),
	S_NORMAL1 (PLAY, 'M',    6, NULL           , &States[S_PLAY_DIE+6]),
	S_NORMAL1 (PLAY, 'N',    6, NULL           , &States[S_PLAY_DIE+7]),
	S_NORMAL1 (PLAY, 'O',    6, NULL           , &States[S_PLAY_DIE+8]),
	S_NORMAL1 (PLAY, 'P',   -1, NULL           , NULL),

#define S_PLAY_XDIE (S_PLAY_DIE+9)
	S_NORMAL1 (PLAY, 'Q',    5, A_PlayerScream , &States[S_PLAY_XDIE+1]),
	S_NORMAL1 (PLAY, 'R',    0, A_NoBlocking   , &States[S_PLAY_XDIE+2]),
	S_NORMAL1 (PLAY, 'R',    5, A_SkullPop     , &States[S_PLAY_XDIE+3]),
	S_NORMAL1 (PLAY, 'S',    5, NULL           , &States[S_PLAY_XDIE+4]),
	S_NORMAL1 (PLAY, 'T',    5, NULL           , &States[S_PLAY_XDIE+5]),
	S_NORMAL1 (PLAY, 'U',    5, NULL           , &States[S_PLAY_XDIE+6]),
	S_NORMAL1 (PLAY, 'V',    5, NULL           , &States[S_PLAY_XDIE+7]),
	S_NORMAL1 (PLAY, 'W',    5, NULL           , &States[S_PLAY_XDIE+8]),
	S_NORMAL1 (PLAY, 'X',    5, NULL           , &States[S_PLAY_XDIE+9]),
	S_NORMAL1 (PLAY, 'Y',   -1, NULL           , NULL),

#define S_PLAY_FDTH (S_PLAY_XDIE+10)
	S_BRIGHT (FDTH, 'A',    5, A_FlameSnd      , &States[S_PLAY_FDTH+1]),
	S_BRIGHT (FDTH, 'B',    4, NULL            , &States[S_PLAY_FDTH+2]),
	S_BRIGHT (FDTH, 'C',    5, NULL            , &States[S_PLAY_FDTH+3]),
	S_BRIGHT (FDTH, 'D',    4, A_PlayerScream  , &States[S_PLAY_FDTH+4]),
	S_BRIGHT (FDTH, 'E',    5, NULL            , &States[S_PLAY_FDTH+5]),
	S_BRIGHT (FDTH, 'F',    4, NULL            , &States[S_PLAY_FDTH+6]),
	S_BRIGHT (FDTH, 'G',    5, A_FlameSnd      , &States[S_PLAY_FDTH+7]),
	S_BRIGHT (FDTH, 'H',    4, NULL            , &States[S_PLAY_FDTH+8]),
	S_BRIGHT (FDTH, 'I',    5, NULL            , &States[S_PLAY_FDTH+9]),
	S_BRIGHT (FDTH, 'J',    4, NULL            , &States[S_PLAY_FDTH+10]),
	S_BRIGHT (FDTH, 'K',    5, NULL            , &States[S_PLAY_FDTH+11]),
	S_BRIGHT (FDTH, 'L',    4, NULL            , &States[S_PLAY_FDTH+12]),
	S_BRIGHT (FDTH, 'M',    5, NULL            , &States[S_PLAY_FDTH+13]),
	S_BRIGHT (FDTH, 'N',    4, NULL            , &States[S_PLAY_FDTH+14]),
	S_BRIGHT (FDTH, 'O',    5, A_NoBlocking    , &States[S_PLAY_FDTH+15]),
	S_BRIGHT (FDTH, 'P',    4, NULL            , &States[S_PLAY_FDTH+16]),
	S_BRIGHT (FDTH, 'Q',    5, NULL            , &States[S_PLAY_FDTH+17]),
	S_BRIGHT (FDTH, 'R',    4, NULL            , &States[S_PLAY_FDTH+18]),
	S_NORMAL1 (ACLO, 'E',   35, A_CheckBurnGone, &States[S_PLAY_FDTH+18])
};

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

//========== Bloody skull created when Corvus is gibbed. 

IMPLEMENT_ACTOR (ABloodySkull, Heretic, -1, 0)
	PROP_RadiusFixed(4)
	PROP_HeightFixed(4)
	PROP_Flags(MF_NOBLOCKMAP|MF_DROPOFF)
	PROP_Flags2(MF2_LOGRAV|MF2_CANNOTPUSH)
	PROP_Flags3(MF3_SKYEXPLODE|MF3_NOBLOCKMONST)
	PROP_Flags4(MF4_NONETSPAWN)
	PROP_SpawnState(0)
END_DEFAULTS

FState ABloodySkull::States[] =
{
	S_NORMAL1 (PLAY, 'A',    0, NULL             , &States[1]),
#define S_BLOODYSKULL 1
	S_NORMAL1 (BSKL, 'A',    5, A_CheckSkullFloor, &States[S_BLOODYSKULL+1]),
	S_NORMAL1 (BSKL, 'B',    5, A_CheckSkullFloor, &States[S_BLOODYSKULL+2]),
	S_NORMAL1 (BSKL, 'C',    5, A_CheckSkullFloor, &States[S_BLOODYSKULL+3]),
	S_NORMAL1 (BSKL, 'D',    5, A_CheckSkullFloor, &States[S_BLOODYSKULL+4]),
	S_NORMAL1 (BSKL, 'E',    5, A_CheckSkullFloor, &States[S_BLOODYSKULL+0]),

#define S_BLOODYSKULLX1 (S_BLOODYSKULL+5)
	S_NORMAL1 (BSKL, 'F',   16, A_CheckSkullDone , &States[S_BLOODYSKULLX1]),
};

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

//========== Corvus's ironshod staff. Useless against ghosts.

IMPLEMENT_ACTOR (AStaff, Heretic, -1, 0)
END_DEFAULTS

FState AStaff::States[] =
{
#define S_STAFFREADY 0
	S_NORMAL1 (STFF, 'A',    1, A_WeaponReady   , &States[S_STAFFREADY]),

#define S_STAFFDOWN (S_STAFFREADY+1)
	S_NORMAL1 (STFF, 'A',    1, A_Lower         , &States[S_STAFFDOWN]),

#define S_STAFFUP (S_STAFFDOWN+1)
	S_NORMAL1 (STFF, 'A',    1, A_Raise         , &States[S_STAFFUP]),

#define S_STAFFREADY2 (S_STAFFUP+1)
	S_NORMAL1 (STFF, 'D',    4, A_WeaponReady   , &States[S_STAFFREADY2+1]),
	S_NORMAL1 (STFF, 'E',    4, A_WeaponReady   , &States[S_STAFFREADY2+2]),
	S_NORMAL1 (STFF, 'F',    4, A_WeaponReady   , &States[S_STAFFREADY2+0]),

#define S_STAFFDOWN2 (S_STAFFREADY2+3)
	S_NORMAL1 (STFF, 'D',    1, A_Lower         , &States[S_STAFFDOWN2]),

#define S_STAFFUP2 (S_STAFFDOWN2+1)
	S_NORMAL1 (STFF, 'D',    1, A_Raise         , &States[S_STAFFUP2]),

#define S_STAFFATK1 (S_STAFFUP2+1)
	S_NORMAL1 (STFF, 'B',    6, NULL            , &States[S_STAFFATK1+1]),
	S_NORMAL1 (STFF, 'C',    8, A_StaffAttackPL1, &States[S_STAFFATK1+2]),
	S_NORMAL1 (STFF, 'B',    8, A_ReFire        , &States[S_STAFFREADY]),

#define S_STAFFATK2 (S_STAFFATK1+3)
	S_NORMAL1 (STFF, 'G',    6, NULL            , &States[S_STAFFATK2+1]),
	S_NORMAL1 (STFF, 'H',    8, A_StaffAttackPL2, &States[S_STAFFATK2+2]),
	S_NORMAL1 (STFF, 'G',    8, A_ReFire        , &States[S_STAFFREADY2+0])
};

FWeaponInfo AStaff::WeaponInfo1 =
{
	WIF_BLOODSPLATTER,
	am_noammo,
	0,
	0,
	&States[S_STAFFUP],
	&States[S_STAFFDOWN],
	&States[S_STAFFREADY],
	&States[S_STAFFATK1],
	&States[S_STAFFATK1],
	NULL,
	NULL,
	150,
	0,
	NULL,
	NULL,
	ZDRUNTIME_CLASS(AStaff),
	-1
};

FWeaponInfo AStaff::WeaponInfo2 =
{
	WIF_READYSNDHALF|WIF_BLOODSPLATTER,
	am_noammo,
	0,
	0,
	&States[S_STAFFUP2],
	&States[S_STAFFDOWN2],
	&States[S_STAFFREADY2],
	&States[S_STAFFATK2],
	&States[S_STAFFATK2],
	NULL,
	NULL,
	150,
	0,
	NULL,
	"weapons/staffcrackle",
	ZDRUNTIME_CLASS(AStaff),
	-1
};

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

//========== Impact puff from Corvus's staff.

IMPLEMENT_ACTOR (AStaffPuff, Heretic, -1, 0)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
	PROP_Flags3 (MF3_PUFFONACTORS)
	PROP_SpawnState (0)
	PROP_AttackSound ("weapons/staffhit")
END_DEFAULTS

FState AStaffPuff::States[] =
{
	S_BRIGHT  (PUF3, 'A',    4, NULL, &States[1]),
	S_NORMAL1 (PUF3, 'B',    4, NULL, &States[2]),
	S_NORMAL1 (PUF3, 'C',    4, NULL, &States[3]),
	S_NORMAL1 (PUF3, 'D',    4, NULL, NULL)
};

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

//========== Electric impact puff from Corvus's tomed staff.

IMPLEMENT_ACTOR (AStaffPuff2, Heretic, -1, 0)
	PROP_SpawnState (0)
	PROP_AttackSound ("weapons/staffpowerhit")
END_DEFAULTS

FState AStaffPuff2::States[] =
{
	S_BRIGHT (PUF4, 'A',    4, NULL, &States[1]),
	S_BRIGHT (PUF4, 'B',    4, NULL, &States[2]),
	S_BRIGHT (PUF4, 'C',    4, NULL, &States[3]),
	S_BRIGHT (PUF4, 'D',    4, NULL, &States[4]),
	S_BRIGHT (PUF4, 'E',    4, NULL, &States[5]),
	S_BRIGHT (PUF4, 'F',    4, NULL, NULL)
};

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

//========== Small crystal containing ten charges for the gold wand. When dropped by a golem, they contain only three charges. 

IMPLEMENT_ACTOR (AGoldWandAmmo, Heretic, 10, 11)
	PROP_SpawnHealth (AMMO_GWND_WIMPY)
	PROP_Flags (MF_SPECIAL)
	PROP_SpawnState (0)
END_DEFAULTS

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

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

//========== Large crystal containing fifty charges for the gold wand. 

IMPLEMENT_ACTOR (AGoldWandHefty, Heretic, 12, 12)
	PROP_SpawnHealth (AMMO_GWND_HEFTY)
	PROP_Flags (MF_SPECIAL)
	PROP_SpawnState (0)
END_DEFAULTS

FState AGoldWandHefty::States[] =
{
	S_NORMAL1 (AMG2, 'A',    4, NULL, &States[1]),
	S_NORMAL1 (AMG2, 'B',    4, NULL, &States[2]),
	S_NORMAL1 (AMG2, 'C',    4, NULL, &States[0])
};

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

//========== Corvus's elvenwand. It fires magical hitscan shots.

IMPLEMENT_ACTOR (AGoldWand, Heretic, -1, 0)
END_DEFAULTS

FState AGoldWand::States[] =
{
#define S_GOLDWANDREADY 0
	S_NORMAL1 (GWND, 'A',    1, A_WeaponReady    , &States[S_GOLDWANDREADY]),

#define S_GOLDWANDDOWN (S_GOLDWANDREADY+1)
	S_NORMAL1 (GWND, 'A',    1, A_Lower          , &States[S_GOLDWANDDOWN]),

#define S_GOLDWANDUP (S_GOLDWANDDOWN+1)
	S_NORMAL1 (GWND, 'A',    1, A_Raise          , &States[S_GOLDWANDUP]),

#define S_GOLDWANDATK1 (S_GOLDWANDUP+1)
	S_NORMAL1 (GWND, 'B',    3, NULL             , &States[S_GOLDWANDATK1+1]),
	S_NORMAL1 (GWND, 'C',    5, A_FireGoldWandPL1, &States[S_GOLDWANDATK1+2]),
	S_NORMAL1 (GWND, 'D',    3, NULL             , &States[S_GOLDWANDATK1+3]),
	S_NORMAL1 (GWND, 'D',    0, A_ReFire         , &States[S_GOLDWANDREADY]),

#define S_GOLDWANDATK2 (S_GOLDWANDATK1+4)
	S_NORMAL1 (GWND, 'B',    3, NULL             , &States[S_GOLDWANDATK2+1]),
	S_NORMAL1 (GWND, 'C',    4, A_FireGoldWandPL2, &States[S_GOLDWANDATK2+2]),
	S_NORMAL1 (GWND, 'D',    3, NULL             , &States[S_GOLDWANDATK2+3]),
	S_NORMAL1 (GWND, 'D',    0, A_ReFire         , &States[S_GOLDWANDREADY])
};

FWeaponInfo AGoldWand::WeaponInfo1 =
{
	WIF_BLOODSPLATTER,
	am_goldwand,
	USE_GWND_AMMO_1,
	25,
	&States[S_GOLDWANDUP],
	&States[S_GOLDWANDDOWN],
	&States[S_GOLDWANDREADY],
	&States[S_GOLDWANDATK1],
	&States[S_GOLDWANDATK1],
	NULL,
	ZDRUNTIME_CLASS(AGoldWandAmmo),
	150,
	5*FRACUNIT,
	NULL,
	NULL,
	ZDRUNTIME_CLASS(AGoldWand),
	-1
};

FWeaponInfo AGoldWand::WeaponInfo2 =
{
	WIF_BLOODSPLATTER,
	am_goldwand,
	USE_GWND_AMMO_2,
	25,
	&States[S_GOLDWANDUP],
	&States[S_GOLDWANDDOWN],
	&States[S_GOLDWANDREADY],
	&States[S_GOLDWANDATK2],
	&States[S_GOLDWANDATK2],
	NULL,
	ZDRUNTIME_CLASS(AGoldWandHefty),
	150,
	5*FRACUNIT,
	NULL,
	NULL,
	ZDRUNTIME_CLASS(AGoldWand),
	-1
};

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

//========== While this actor is not normally used by the elvenwand, it serves as a base class for its powered-up projectile and puff.

IMPLEMENT_ACTOR (AGoldWandFX1, Heretic, -1, 151)
	PROP_RadiusFixed (10)
	PROP_HeightFixed (6)
	PROP_SpeedFixed (22)
	PROP_Damage (2)
	PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_Flags4 (MF4_BLOODSPLATTER)
	PROP_SpawnState (S_GWANDFX1)
	PROP_DeathState (S_GWANDFXI1)
	PROP_DeathSound ("weapons/wandhit")
END_DEFAULTS

FState AGoldWandFX1::States[] =
{
#define S_GWANDFX1 0
	S_BRIGHT (FX01, 'A',    6, NULL, &States[S_GWANDFX1+1]),
	S_BRIGHT (FX01, 'B',    6, NULL, &States[S_GWANDFX1+0]),

#define S_GWANDFXI1 (S_GWANDFX1+2)
	S_BRIGHT (FX01, 'E',    3, NULL, &States[S_GWANDFXI1+1]),
	S_BRIGHT (FX01, 'F',    3, NULL, &States[S_GWANDFXI1+2]),
	S_BRIGHT (FX01, 'G',    3, NULL, &States[S_GWANDFXI1+3]),
	S_BRIGHT (FX01, 'H',    3, NULL, NULL)
};

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

//========== A projectile from the tomed elvenwand.

IMPLEMENT_ACTOR (AGoldWandFX2, Heretic, -1, 152)
	PROP_SpeedFixed (18)
	PROP_Damage (1)
	PROP_SpawnState (0)
	PROP_DeathSound ("")
END_DEFAULTS

FState AGoldWandFX2::States[] =
{
	S_BRIGHT (FX01, 'C',    6, NULL, &States[1]),
	S_BRIGHT (FX01, 'D',    6, NULL, &States[0])
};

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

//========== A hitscan puff from the elvenwand. It appears even on bleeding actors. 

IMPLEMENT_ACTOR (AGoldWandPuff1, Heretic, -1, 0)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
	PROP_Flags3 (MF3_PUFFONACTORS)
	PROP_SpawnState (0)
END_DEFAULTS

FState AGoldWandPuff1::States[] =
{
	S_BRIGHT (PUF2, 'A',    3, NULL, &States[1]),
	S_BRIGHT (PUF2, 'B',    3, NULL, &States[2]),
	S_BRIGHT (PUF2, 'C',    3, NULL, &States[3]),
	S_BRIGHT (PUF2, 'D',    3, NULL, &States[4]),
	S_BRIGHT (PUF2, 'E',    3, NULL, NULL)
};

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

//========== A hitscan puff from the tomed elvenwand.

IMPLEMENT_STATELESS_ACTOR (AGoldWandPuff2, Heretic, -1, 0)
	PROP_SpawnState (S_GWANDFXI1)
END_DEFAULTS

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

//========== Small bundle of five arrows for the ethereal crossbow.

IMPLEMENT_ACTOR (ACrossbowAmmo, Heretic, 18, 33)
	PROP_SpawnHealth (AMMO_CBOW_WIMPY)
	PROP_Flags (MF_SPECIAL)
	PROP_SpawnState (0)
END_DEFAULTS

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

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

//========== Quiver of twenty arrows for the ethereal crossbow. 

IMPLEMENT_ACTOR (ACrossbowHefty, Heretic, 19, 34)
	PROP_SpawnHealth (AMMO_CBOW_HEFTY)
	PROP_Flags (MF_SPECIAL)
	PROP_SpawnState (0)
END_DEFAULTS

FState ACrossbowHefty::States[] =
{
	S_NORMAL1 (AMC2, 'A',    5, NULL, &States[1]),
	S_NORMAL1 (AMC2, 'B',    5, NULL, &States[2]),
	S_NORMAL1 (AMC2, 'C',    5, NULL, &States[0])
};

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

//========== Ethereal crossbow

IMPLEMENT_ACTOR (ACrossbow, Heretic, 2001, 27)
	PROP_Flags (MF_SPECIAL)
	PROP_SpawnState (S_WBOW)
END_DEFAULTS

FState ACrossbow::States[] =
{
#define S_WBOW 0
	S_NORMAL1 (WBOW, 'A',   -1, NULL             , NULL),

#define S_CRBOW (S_WBOW+1)
	S_NORMAL1 (CRBW, 'A',    1, A_WeaponReady    , &States[S_CRBOW+1]),
	S_NORMAL1 (CRBW, 'A',    1, A_WeaponReady    , &States[S_CRBOW+2]),
	S_NORMAL1 (CRBW, 'A',    1, A_WeaponReady    , &States[S_CRBOW+3]),
	S_NORMAL1 (CRBW, 'A',    1, A_WeaponReady    , &States[S_CRBOW+4]),
	S_NORMAL1 (CRBW, 'A',    1, A_WeaponReady    , &States[S_CRBOW+5]),
	S_NORMAL1 (CRBW, 'A',    1, A_WeaponReady    , &States[S_CRBOW+6]),
	S_NORMAL1 (CRBW, 'B',    1, A_WeaponReady    , &States[S_CRBOW+7]),
	S_NORMAL1 (CRBW, 'B',    1, A_WeaponReady    , &States[S_CRBOW+8]),
	S_NORMAL1 (CRBW, 'B',    1, A_WeaponReady    , &States[S_CRBOW+9]),
	S_NORMAL1 (CRBW, 'B',    1, A_WeaponReady    , &States[S_CRBOW+10]),
	S_NORMAL1 (CRBW, 'B',    1, A_WeaponReady    , &States[S_CRBOW+11]),
	S_NORMAL1 (CRBW, 'B',    1, A_WeaponReady    , &States[S_CRBOW+12]),
	S_NORMAL1 (CRBW, 'C',    1, A_WeaponReady    , &States[S_CRBOW+13]),
	S_NORMAL1 (CRBW, 'C',    1, A_WeaponReady    , &States[S_CRBOW+14]),
	S_NORMAL1 (CRBW, 'C',    1, A_WeaponReady    , &States[S_CRBOW+15]),
	S_NORMAL1 (CRBW, 'C',    1, A_WeaponReady    , &States[S_CRBOW+16]),
	S_NORMAL1 (CRBW, 'C',    1, A_WeaponReady    , &States[S_CRBOW+17]),
	S_NORMAL1 (CRBW, 'C',    1, A_WeaponReady    , &States[S_CRBOW+0]),

#define S_CRBOWDOWN (S_CRBOW+18)
	S_NORMAL1 (CRBW, 'A',    1, A_Lower          , &States[S_CRBOWDOWN]),

#define S_CRBOWUP (S_CRBOWDOWN+1)
	S_NORMAL1 (CRBW, 'A',    1, A_Raise          , &States[S_CRBOWUP]),

#define S_CRBOWATK1 (S_CRBOWUP+1)
	S_NORMAL1 (CRBW, 'D',    6, A_FireCrossbowPL1, &States[S_CRBOWATK1+1]),
	S_NORMAL1 (CRBW, 'E',    3, NULL             , &States[S_CRBOWATK1+2]),
	S_NORMAL1 (CRBW, 'F',    3, NULL             , &States[S_CRBOWATK1+3]),
	S_NORMAL1 (CRBW, 'G',    3, NULL             , &States[S_CRBOWATK1+4]),
	S_NORMAL1 (CRBW, 'H',    3, NULL             , &States[S_CRBOWATK1+5]),
	S_NORMAL1 (CRBW, 'A',    4, NULL             , &States[S_CRBOWATK1+6]),
	S_NORMAL1 (CRBW, 'B',    4, NULL             , &States[S_CRBOWATK1+7]),
	S_NORMAL1 (CRBW, 'C',    5, A_ReFire         , &States[S_CRBOW+0]),

#define S_CRBOWATK2 (S_CRBOWATK1+8)
	S_NORMAL1 (CRBW, 'D',    5, A_FireCrossbowPL2, &States[S_CRBOWATK2+1]),
	S_NORMAL1 (CRBW, 'E',    3, NULL             , &States[S_CRBOWATK2+2]),
	S_NORMAL1 (CRBW, 'F',    2, NULL             , &States[S_CRBOWATK2+3]),
	S_NORMAL1 (CRBW, 'G',    3, NULL             , &States[S_CRBOWATK2+4]),
	S_NORMAL1 (CRBW, 'H',    2, NULL             , &States[S_CRBOWATK2+5]),
	S_NORMAL1 (CRBW, 'A',    3, NULL             , &States[S_CRBOWATK2+6]),
	S_NORMAL1 (CRBW, 'B',    3, NULL             , &States[S_CRBOWATK2+7]),
	S_NORMAL1 (CRBW, 'C',    4, A_ReFire         , &States[S_CRBOW+0])
};

FWeaponInfo ACrossbow::WeaponInfo1 =
{
	WIF_BLOODSPLATTER,
	am_crossbow,
	USE_CBOW_AMMO_1,
	10,
	&States[S_CRBOWUP],
	&States[S_CRBOWDOWN],
	&States[S_CRBOW],
	&States[S_CRBOWATK1],
	&States[S_CRBOWATK1],
	NULL,
	ZDRUNTIME_CLASS(ACrossbow),
	150,
	15*FRACUNIT,
	NULL,
	NULL,
	ZDRUNTIME_CLASS(ACrossbow),
	-1
};

FWeaponInfo ACrossbow::WeaponInfo2 =
{
	WIF_BLOODSPLATTER,
	am_crossbow,
	USE_CBOW_AMMO_2,
	10,
	&States[S_CRBOWUP],
	&States[S_CRBOWDOWN],
	&States[S_CRBOW],
	&States[S_CRBOWATK2],
	&States[S_CRBOWATK2],
	NULL,
	ZDRUNTIME_CLASS(ACrossbow),
	150,
	15*FRACUNIT,
	NULL,
	NULL,
	ZDRUNTIME_CLASS(ACrossbow),
	-1
};

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

//========== The main projectile fired by the ethereal crossbow. 

IMPLEMENT_ACTOR (ACrossbowFX1, Heretic, -1, 147)
	PROP_RadiusFixed (11)
	PROP_HeightFixed (8)
	PROP_SpeedFixed (30)
	PROP_Damage (10)
	PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
	PROP_Flags2 (MF2_NOTELEPORT|MF2_PCROSS|MF2_IMPACT)
	PROP_Flags4 (MF4_BLOODSPLATTER)
	PROP_SpawnState (S_CRBOWFX1)
	PROP_DeathState (S_CRBOWFXI1)
	PROP_SeeSound ("weapons/bowshoot")
	PROP_DeathSound ("weapons/bowhit")
END_DEFAULTS

FState ACrossbowFX1::States[] =
{
#define S_CRBOWFX1 0
	S_BRIGHT (FX03, 'B',    1, NULL, &States[S_CRBOWFX1]),

#define S_CRBOWFXI1 (S_CRBOWFX1+1)
	S_BRIGHT (FX03, 'H',    8, NULL, &States[S_CRBOWFXI1+1]),
	S_BRIGHT (FX03, 'I',    8, NULL, &States[S_CRBOWFXI1+2]),
	S_BRIGHT (FX03, 'J',    8, NULL, NULL)
};

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

//========== The projectiles fired by the tomed ethereal crossbow. They spawn trails of magic sparks behind them. 

IMPLEMENT_ACTOR (ACrossbowFX2, Heretic, -1, 148)
	PROP_SpeedFixed (32)
	PROP_Damage (6)
	PROP_SpawnState (S_CRBOWFX2)
END_DEFAULTS

FState ACrossbowFX2::States[] =
{
#define S_CRBOWFX2 0
	S_BRIGHT (FX03, 'B',    1, A_BoltSpark, &States[S_CRBOWFX2])
};

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

//========== The secondary projectiles fired by the ethereal crossbow.

IMPLEMENT_ACTOR (ACrossbowFX3, Heretic, -1, 149)
	PROP_SpeedFixed (20)
	PROP_Damage (2)
	PROP_Flags2 (MF2_WINDTHRUST|MF2_THRUGHOST|MF2_NOTELEPORT|MF2_PCROSS|MF2_IMPACT)
	PROP_SpawnState (S_CRBOWFX3)
	PROP_DeathState (S_CRBOWFXI3)
	PROP_SeeSound ("")
END_DEFAULTS

FState ACrossbowFX3::States[] =
{
#define S_CRBOWFX3 0
	S_BRIGHT (FX03, 'A',    1, NULL, &States[S_CRBOWFX3]),

#define S_CRBOWFXI3 (S_CRBOWFX3+1)
	S_BRIGHT (FX03, 'C',    8, NULL, &States[S_CRBOWFXI3+1]),
	S_BRIGHT (FX03, 'D',    8, NULL, &States[S_CRBOWFXI3+2]),
	S_BRIGHT (FX03, 'E',    8, NULL, NULL)
};

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

//========== The sparks spawned behind tomed ethereal crossbow shots. 

IMPLEMENT_ACTOR (ACrossbowFX4, Heretic, -1, 0)
	PROP_Flags (MF_NOBLOCKMAP)
	PROP_Flags2 (MF2_LOGRAV)
	PROP_SpawnState (S_CRBOWFX4)
END_DEFAULTS

FState ACrossbowFX4::States[] =
{
#define S_CRBOWFX4 0
	S_BRIGHT (FX03, 'F',    8, NULL, &States[S_CRBOWFX4+1]),
	S_BRIGHT (FX03, 'G',    8, NULL, NULL)
};

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

//========== Small pile of twenty mace spheres for the firemace. 

IMPLEMENT_ACTOR (AMaceAmmo, Heretic, 13, 35)
	PROP_SpawnHealth (AMMO_MACE_WIMPY)
	PROP_Flags (MF_SPECIAL)
	PROP_SpawnState (0)
END_DEFAULTS

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

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

//========== Big pile of one hundred mace spheres for the firemace. 

IMPLEMENT_ACTOR (AMaceHefty, Heretic, 16, 36)
	PROP_SpawnHealth (AMMO_MACE_HEFTY)
	PROP_Flags (MF_SPECIAL)
	PROP_SpawnState (0)
END_DEFAULTS

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

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

//========== Firemace

BEGIN_DEFAULTS (AMace, Heretic, -1, 0)
	PROP_Flags (MF_SPECIAL)
	PROP_SpawnState (0)
END_DEFAULTS

FState AMace::States[] =
{
#define S_WMCE 0
	S_NORMAL1 (WMCE, 'A',   -1, NULL         , NULL),

#define S_MACEREADY (S_WMCE+1)
	S_NORMAL1 (MACE, 'A',    1, A_WeaponReady, &States[S_MACEREADY]),

#define S_MACEDOWN (S_MACEREADY+1)
	S_NORMAL1 (MACE, 'A',    1, A_Lower      , &States[S_MACEDOWN]),

#define S_MACEUP (S_MACEDOWN+1)
	S_NORMAL1 (MACE, 'A',    1, A_Raise      , &States[S_MACEUP]),

#define S_MACEATK1 (S_MACEUP+1)
	S_NORMAL1 (MACE, 'B',    4, NULL         , &States[S_MACEATK1+1]),
	S_NORMAL1 (MACE, 'C',    3, A_FireMacePL1, &States[S_MACEATK1+2]),
	S_NORMAL1 (MACE, 'D',    3, A_FireMacePL1, &States[S_MACEATK1+3]),
	S_NORMAL1 (MACE, 'E',    3, A_FireMacePL1, &States[S_MACEATK1+4]),
	S_NORMAL1 (MACE, 'F',    3, A_FireMacePL1, &States[S_MACEATK1+5]),
	S_NORMAL1 (MACE, 'C',    4, A_ReFire     , &States[S_MACEATK1+6]),
	S_NORMAL1 (MACE, 'D',    4, NULL         , &States[S_MACEATK1+7]),
	S_NORMAL1 (MACE, 'E',    4, NULL         , &States[S_MACEATK1+8]),
	S_NORMAL1 (MACE, 'F',    4, NULL         , &States[S_MACEATK1+9]),
	S_NORMAL1 (MACE, 'B',    4, NULL         , &States[S_MACEREADY]),

#define S_MACEATK2 (S_MACEATK1+10)
	S_NORMAL1 (MACE, 'B',    4, NULL         , &States[S_MACEATK2+1]),
	S_NORMAL1 (MACE, 'D',    4, A_FireMacePL2, &States[S_MACEATK2+2]),
	S_NORMAL1 (MACE, 'B',    4, NULL         , &States[S_MACEATK2+3]),
	S_NORMAL1 (MACE, 'A',    8, A_ReFire     , &States[S_MACEREADY])
};

FWeaponInfo AMace::WeaponInfo1 =
{
	WIF_BLOODSPLATTER,
	am_mace,
	USE_MACE_AMMO_1,
	50,
	&States[S_MACEUP],
	&States[S_MACEDOWN],
	&States[S_MACEREADY],
	&States[S_MACEATK1],
	&States[S_MACEATK1+1],
	NULL,
	ZDRUNTIME_CLASS(AMace),
	150,
	15*FRACUNIT,
	NULL,
	NULL,
	ZDRUNTIME_CLASS(AMace),
	-1
};

FWeaponInfo AMace::WeaponInfo2 =
{
	WIF_BLOODSPLATTER,
	am_mace,
	USE_MACE_AMMO_2,
	50,
	&States[S_MACEUP],
	&States[S_MACEDOWN],
	&States[S_MACEREADY],
	&States[S_MACEATK2],
	&States[S_MACEATK2],
	NULL,
	ZDRUNTIME_CLASS(AMace),
	150,
	15*FRACUNIT,
	NULL,
	NULL,
	ZDRUNTIME_CLASS(AMace),
	-1
};

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

//========== The most common of the firemace's projectiles, it also serves as a base class for its large and small spheres.

IMPLEMENT_ACTOR (AMaceFX1, Heretic, -1, 154)
	PROP_RadiusFixed (8)
	PROP_HeightFixed (6)
	PROP_SpeedFixed (20)
	PROP_Damage (2)
	PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
	PROP_Flags2 (MF2_HERETICBOUNCE|MF2_THRUGHOST|MF2_NOTELEPORT|MF2_PCROSS|MF2_IMPACT)
	PROP_Flags4 (MF4_BLOODSPLATTER|MF4_NOSPEEDCHECK)
	PROP_SpawnState (S_MACEFX1)
	PROP_DeathState (S_MACEFXI1)
	PROP_SeeSound ("weapons/maceshoot")
END_DEFAULTS

FState AMaceFX1::States[] =
{
#define S_MACEFX1 0
	S_NORMAL1 (FX02, 'A',    4, A_MacePL1Check , &States[S_MACEFX1+1]),
	S_NORMAL1 (FX02, 'B',    4, A_MacePL1Check , &States[S_MACEFX1+0]),

#define S_MACEFXI1 (S_MACEFX1+2)
	S_BRIGHT (FX02, 'F',    4, A_MaceBallImpact, &States[S_MACEFXI1+1]),
	S_BRIGHT (FX02, 'G',    4, NULL            , &States[S_MACEFXI1+2]),
	S_BRIGHT (FX02, 'H',    4, NULL            , &States[S_MACEFXI1+3]),
	S_BRIGHT (FX02, 'I',    4, NULL            , &States[S_MACEFXI1+4]),
	S_BRIGHT (FX02, 'J',    4, NULL            , NULL)
};

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

//========== The firemace's secondary projectile, this mace sphere bounces a few times, spawning two small spheres on each bounce. 

IMPLEMENT_ACTOR (AMaceFX2, Heretic, -1, 156)
	PROP_RadiusFixed (8)
	PROP_HeightFixed (6)
	PROP_SpeedFixed (10)
	PROP_Damage (6)
	PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF)
	PROP_Flags2 (MF2_LOGRAV|MF2_HERETICBOUNCE|MF2_THRUGHOST|MF2_NOTELEPORT|MF2_PCROSS|MF2_IMPACT)
	PROP_Flags4 (MF4_BLOODSPLATTER|MF4_NOSPEEDCHECK)
	PROP_SpawnState (S_MACEFX2)
	PROP_DeathState (S_MACEFXI2)
END_DEFAULTS

FState AMaceFX2::States[] =
{
#define S_MACEFX2 0
	S_NORMAL1 (FX02, 'C',    4, NULL            , &States[S_MACEFX2+1]),
	S_NORMAL1 (FX02, 'D',    4, NULL            , &States[S_MACEFX2+0]),

#define S_MACEFXI2 (S_MACEFX2+2)
	S_BRIGHT (FX02, 'F',    4, A_MaceBallImpact2, &AMaceFX1::States[S_MACEFXI1+1])
};

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

//========== The firemace's secondary projectiles, spawned when a large mace sphere bounces.

IMPLEMENT_ACTOR (AMaceFX3, Heretic, -1, 155)
	PROP_RadiusFixed (8)
	PROP_HeightFixed (6)
	PROP_SpeedFixed (7)
	PROP_Damage (4)
	PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF)
	PROP_Flags2 (MF2_LOGRAV|MF2_HERETICBOUNCE|MF2_THRUGHOST|MF2_NOTELEPORT|MF2_PCROSS|MF2_IMPACT)
	PROP_Flags4 (MF4_BLOODSPLATTER|MF4_NOSPEEDCHECK)
	PROP_SpawnState (S_MACEFX3)
	PROP_STATE_BASE (AMaceFX1)
	PROP_DeathState (S_MACEFXI1)
END_DEFAULTS

FState AMaceFX3::States[] =
{
#define S_MACEFX3 0
	S_NORMAL1 (FX02, 'A',    4, NULL, &States[S_MACEFX3+1]),
	S_NORMAL1 (FX02, 'B',    4, NULL, &States[S_MACEFX3+0])
};

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

//========== The slow and enormous projectile from the powered-up firemace.

IMPLEMENT_ACTOR (AMaceFX4, Heretic, -1, 153)
	PROP_RadiusFixed (8)
	PROP_HeightFixed (6)
	PROP_SpeedFixed (7)
	PROP_Damage (18)
	PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF)
	PROP_Flags2 (MF2_LOGRAV|MF2_HERETICBOUNCE|MF2_THRUGHOST|MF2_TELESTOMP|MF2_PCROSS|MF2_IMPACT)
	PROP_Flags4 (MF4_BLOODSPLATTER|MF4_SYNCMOVEMENT)
	PROP_SpawnState (S_MACEFX4)
	PROP_DeathState (S_MACEFXI4)
END_DEFAULTS

FState AMaceFX4::States[] =
{
#define S_MACEFX4 0
	S_NORMAL1 (FX02, 'E',   99, NULL            , &States[S_MACEFX4+0]),

#define S_MACEFXI4 (S_MACEFX4+1)
	S_BRIGHT (FX02, 'C',    4, A_DeathBallImpact, &AMaceFX1::States[S_MACEFXI1+1])
};

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

//========== Firemace spawn spot

IMPLEMENT_ACTOR (AMaceSpawner, Heretic, 2002, 0)
	PROP_Flags (MF_NOSECTOR|MF_NOBLOCKMAP)
	PROP_SpawnState (0)
END_DEFAULTS

FState AMaceSpawner::States[] =
{
	S_NORMAL1 (TNT1, 'A',  1, NULL,        &States[1]),
	S_NORMAL1 (TNT1, 'A', -1, A_SpawnMace, NULL)
};

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

//========== Gauntlets of the necromancer

IMPLEMENT_ACTOR (AGauntlets, Heretic, 2005, 32)
	PROP_Flags (MF_SPECIAL)
	PROP_SpawnState (S_WGNT)
END_DEFAULTS

FState AGauntlets::States[] =
{
#define S_WGNT 0
	S_NORMAL1 (WGNT, 'A',   -1, NULL            , NULL),

#define S_GAUNTLETREADY (S_WGNT+1)
	S_NORMAL1 (GAUN, 'A',    1, A_WeaponReady   , &States[S_GAUNTLETREADY]),

#define S_GAUNTLETDOWN (S_GAUNTLETREADY+1)
	S_NORMAL1 (GAUN, 'A',    1, A_Lower         , &States[S_GAUNTLETDOWN]),

#define S_GAUNTLETUP (S_GAUNTLETDOWN+1)
	S_NORMAL1 (GAUN, 'A',    1, A_Raise         , &States[S_GAUNTLETUP]),

#define S_GAUNTLETREADY2 (S_GAUNTLETUP+1)
	S_NORMAL1 (GAUN, 'G',    4, A_WeaponReady   , &States[S_GAUNTLETREADY2+1]),
	S_NORMAL1 (GAUN, 'H',    4, A_WeaponReady   , &States[S_GAUNTLETREADY2+2]),
	S_NORMAL1 (GAUN, 'I',    4, A_WeaponReady   , &States[S_GAUNTLETREADY2+0]),

#define S_GAUNTLETDOWN2 (S_GAUNTLETREADY2+3)
	S_NORMAL1 (GAUN, 'G',    1, A_Lower         , &States[S_GAUNTLETDOWN2]),

#define S_GAUNTLETUP2 (S_GAUNTLETDOWN2+1)
	S_NORMAL1 (GAUN, 'G',    1, A_Raise         , &States[S_GAUNTLETUP2]),

#define S_GAUNTLETATK1 (S_GAUNTLETUP2+1)
	S_NORMAL1 (GAUN, 'B',    4, NULL            , &States[S_GAUNTLETATK1+1]),
	S_NORMAL1 (GAUN, 'C',    4, NULL            , &States[S_GAUNTLETATK1+2]),
	S_BRIGHT  (GAUN, 'D',    4, A_GauntletAttack, &States[S_GAUNTLETATK1+3]),
	S_BRIGHT  (GAUN, 'E',    4, A_GauntletAttack, &States[S_GAUNTLETATK1+4]),
	S_BRIGHT  (GAUN, 'F',    4, A_GauntletAttack, &States[S_GAUNTLETATK1+5]),
	S_NORMAL1 (GAUN, 'C',    4, A_ReFire        , &States[S_GAUNTLETATK1+6]),
	S_NORMAL1 (GAUN, 'B',    4, A_Light0        , &States[S_GAUNTLETREADY]),

#define S_GAUNTLETATK2 (S_GAUNTLETATK1+7)
	S_NORMAL1 (GAUN, 'J',    4, NULL            , &States[S_GAUNTLETATK2+1]),
	S_NORMAL1 (GAUN, 'K',    4, NULL            , &States[S_GAUNTLETATK2+2]),
	S_BRIGHT  (GAUN, 'L',    4, A_GauntletAttack, &States[S_GAUNTLETATK2+3]),
	S_BRIGHT  (GAUN, 'M',    4, A_GauntletAttack, &States[S_GAUNTLETATK2+4]),
	S_BRIGHT  (GAUN, 'N',    4, A_GauntletAttack, &States[S_GAUNTLETATK2+5]),
	S_NORMAL1 (GAUN, 'K',    4, A_ReFire        , &States[S_GAUNTLETATK2+6]),
	S_NORMAL1 (GAUN, 'J',    4, A_Light0        , &States[S_GAUNTLETREADY2+0])
};

FWeaponInfo AGauntlets::WeaponInfo1 =
{
	WIF_BLOODSPLATTER,
	am_noammo,
	0,
	0,
	&States[S_GAUNTLETUP],
	&States[S_GAUNTLETDOWN],
	&States[S_GAUNTLETREADY],
	&States[S_GAUNTLETATK1],
	&States[S_GAUNTLETATK1+2],
	NULL,
	ZDRUNTIME_CLASS(AGauntlets),
	0,
	15*FRACUNIT,
	"weapons/gauntletsactivate",
	NULL,
	ZDRUNTIME_CLASS(AGauntlets),
	-1
};

FWeaponInfo AGauntlets::WeaponInfo2 =
{
	WIF_BLOODSPLATTER,
	am_noammo,
	0,
	0,
	&States[S_GAUNTLETUP2],
	&States[S_GAUNTLETDOWN2],
	&States[S_GAUNTLETREADY2],
	&States[S_GAUNTLETATK2],
	&States[S_GAUNTLETATK2+2],
	NULL,
	ZDRUNTIME_CLASS(AGauntlets),
	0,
	15*FRACUNIT,
	"weapons/gauntletsactivate",
	NULL,
	ZDRUNTIME_CLASS(AGauntlets),
	-1
};

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

//========== The puffs spawned when the gauntlets of the necromancer hit something.

IMPLEMENT_ACTOR (AGauntletPuff1, Heretic, -1, 0)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
	PROP_Flags3 (MF3_PUFFONACTORS)
	PROP_RenderStyle (STYLE_Translucent)
	PROP_Alpha (HR_SHADOW)
	PROP_SpawnState (S_GAUNTLETPUFF1)
END_DEFAULTS

FState AGauntletPuff1::States[] =
{
#define S_GAUNTLETPUFF1 0
	S_BRIGHT (PUF1, 'A',    4, NULL, &States[S_GAUNTLETPUFF1+1]),
	S_BRIGHT (PUF1, 'B',    4, NULL, &States[S_GAUNTLETPUFF1+2]),
	S_BRIGHT (PUF1, 'C',    4, NULL, &States[S_GAUNTLETPUFF1+3]),
	S_BRIGHT (PUF1, 'D',    4, NULL, NULL)
};

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

//========== The puffs spawned when the tomed gauntlets of the necromancer hit something. 

IMPLEMENT_ACTOR (AGauntletPuff2, Heretic, -1, 0)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
	PROP_RenderStyle (STYLE_Translucent)
	PROP_Alpha (HR_SHADOW)
	PROP_SpawnState (S_GAUNTLETPUFF2)
END_DEFAULTS

FState AGauntletPuff2::States[] =
{
#define S_GAUNTLETPUFF2 0
	S_BRIGHT (PUF1, 'E',    4, NULL, &States[S_GAUNTLETPUFF2+1]),
	S_BRIGHT (PUF1, 'F',    4, NULL, &States[S_GAUNTLETPUFF2+2]),
	S_BRIGHT (PUF1, 'G',    4, NULL, &States[S_GAUNTLETPUFF2+3]),
	S_BRIGHT (PUF1, 'H',    4, NULL, NULL)
};

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

//========== Small orb of ten charges for the dragon claw.

IMPLEMENT_ACTOR (ABlasterAmmo, Heretic, 54, 37)
	PROP_SpawnHealth (AMMO_BLSR_WIMPY)
	PROP_Flags (MF_SPECIAL)
	PROP_SpawnState (0)
END_DEFAULTS

FState ABlasterAmmo::States[] =
{
	S_NORMAL1 (AMB1, 'A',    4, NULL, &States[1]),
	S_NORMAL1 (AMB1, 'B',    4, NULL, &States[2]),
	S_NORMAL1 (AMB1, 'C',    4, NULL, &States[0])
};

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

//========== Large orb of 25 charges for the dragon claw.

IMPLEMENT_ACTOR (ABlasterHefty, Heretic, 55, 38)
	PROP_SpawnHealth (AMMO_BLSR_HEFTY)
	PROP_Flags (MF_SPECIAL)
	PROP_SpawnState (0)
END_DEFAULTS

FState ABlasterHefty::States[] =
{
	S_NORMAL1 (AMB2, 'A',    4, NULL, &States[1]),
	S_NORMAL1 (AMB2, 'B',    4, NULL, &States[2]),
	S_NORMAL1 (AMB2, 'C',    4, NULL, &States[0])
};

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

//========== Blaster (Dragon claw)

IMPLEMENT_ACTOR (ABlaster, Heretic, 53, 28)
	PROP_Flags (MF_SPECIAL)
	PROP_SpawnState (S_BLSR)
END_DEFAULTS

FState ABlaster::States[] =
{
#define S_BLSR 0
	S_NORMAL1 (WBLS, 'A',   -1, NULL            , NULL),

#define S_BLASTERREADY (S_BLSR+1)
	S_NORMAL1 (BLSR, 'A',    1, A_WeaponReady   , &States[S_BLASTERREADY]),

#define S_BLASTERDOWN (S_BLASTERREADY+1)
	S_NORMAL1 (BLSR, 'A',    1, A_Lower         , &States[S_BLASTERDOWN]),

#define S_BLASTERUP (S_BLASTERDOWN+1)
	S_NORMAL1 (BLSR, 'A',    1, A_Raise         , &States[S_BLASTERUP]),

#define S_BLASTERATK1 (S_BLASTERUP+1)
	S_NORMAL1 (BLSR, 'B',    3, NULL            , &States[S_BLASTERATK1+1]),
	S_NORMAL1 (BLSR, 'C',    3, NULL            , &States[S_BLASTERATK1+2]),
	S_NORMAL1 (BLSR, 'D',    2, A_FireBlasterPL1, &States[S_BLASTERATK1+3]),
	S_NORMAL1 (BLSR, 'C',    2, NULL            , &States[S_BLASTERATK1+4]),
	S_NORMAL1 (BLSR, 'B',    2, NULL            , &States[S_BLASTERATK1+5]),
	S_NORMAL1 (BLSR, 'A',    0, A_ReFire        , &States[S_BLASTERREADY]),

#define S_BLASTERATK2 (S_BLASTERATK1+6)
	S_NORMAL1 (BLSR, 'B',    0, NULL            , &States[S_BLASTERATK2+1]),
	S_NORMAL1 (BLSR, 'C',    0, NULL            , &States[S_BLASTERATK2+2]),
	S_NORMAL1 (BLSR, 'D',    3, A_FireBlasterPL2, &States[S_BLASTERATK2+3]),
	S_NORMAL1 (BLSR, 'C',    4, NULL            , &States[S_BLASTERATK2+4]),
	S_NORMAL1 (BLSR, 'B',    4, NULL            , &States[S_BLASTERATK2+5]),
	S_NORMAL1 (BLSR, 'A',    0, A_ReFire        , &States[S_BLASTERREADY])
};

FWeaponInfo ABlaster::WeaponInfo1 =
{
	WIF_BLOODSPLATTER,
	am_blaster,
	USE_BLSR_AMMO_1,
	30,
	&States[S_BLASTERUP],
	&States[S_BLASTERDOWN],
	&States[S_BLASTERREADY],
	&States[S_BLASTERATK1],
	&States[S_BLASTERATK1+2],
	NULL,
	ZDRUNTIME_CLASS(ABlaster),
	150,
	15*FRACUNIT,
	NULL,
	NULL,
	ZDRUNTIME_CLASS(ABlaster),
	-1
};

FWeaponInfo ABlaster::WeaponInfo2 =
{
	WIF_BLOODSPLATTER,
	am_blaster,
	USE_BLSR_AMMO_2,
	30,
	&States[S_BLASTERUP],
	&States[S_BLASTERDOWN],
	&States[S_BLASTERREADY],
	&States[S_BLASTERATK2],
	&States[S_BLASTERATK2+2],
	NULL,
	ZDRUNTIME_CLASS(ABlaster),
	150,
	15*FRACUNIT,
	NULL,
	NULL,
	ZDRUNTIME_CLASS(ABlaster),
	-1
};

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

//========== The ultra-fast projectiles from the powered-up dragon claw. They spawn four rippers on impact.

IMPLEMENT_ACTOR (ABlasterFX1, Heretic, -1, 0)
	PROP_RadiusFixed (12)
	PROP_HeightFixed (8)
	PROP_SpeedFixed (184)
	PROP_Damage (2)
	PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
	PROP_Flags2 (MF2_NOTELEPORT|MF2_PCROSS|MF2_IMPACT)
	PROP_Flags4 (MF4_BLOODSPLATTER)
	PROP_SpawnState (S_BLASTERFX1)
	PROP_DeathState (S_BLASTERFXI1)
	PROP_DeathSound ("weapons/blasterhit")
END_DEFAULTS

FState ABlasterFX1::States[] =
{
#define S_BLASTERFX1 0
	S_NORMAL1 (ACLO, 'E',  200, NULL         , &States[S_BLASTERFX1+0]),

#define S_BLASTERFXI1 (S_BLASTERFX1+1)
	S_BRIGHT (FX18, 'A',    3, A_SpawnRippers, &States[S_BLASTERFXI1+1]),
	S_BRIGHT (FX18, 'B',    3, NULL          , &States[S_BLASTERFXI1+2]),
	S_BRIGHT (FX18, 'C',    4, NULL          , &States[S_BLASTERFXI1+3]),
	S_BRIGHT (FX18, 'D',    4, NULL          , &States[S_BLASTERFXI1+4]),
	S_BRIGHT (FX18, 'E',    4, NULL          , &States[S_BLASTERFXI1+5]),
	S_BRIGHT (FX18, 'F',    4, NULL          , &States[S_BLASTERFXI1+6]),
	S_BRIGHT (FX18, 'G',    4, NULL          , NULL)
};

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

//========== The trail spawned behind a powered-up dragon claw shot as it travels.

IMPLEMENT_ACTOR (ABlasterSmoke, Heretic, -1, 0)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
	PROP_Flags2 (MF2_NOTELEPORT|MF2_CANNOTPUSH)
	PROP_RenderStyle (STYLE_Translucent)
	PROP_Alpha (HR_SHADOW)
	PROP_SpawnState (S_BLASTERSMOKE)
END_DEFAULTS

FState ABlasterSmoke::States[] =
{
#define S_BLASTERSMOKE 0
	S_NORMAL1 (FX18, 'H',    4, NULL, &States[S_BLASTERSMOKE+1]),
	S_NORMAL1 (FX18, 'I',    4, NULL, &States[S_BLASTERSMOKE+2]),
	S_NORMAL1 (FX18, 'J',    4, NULL, &States[S_BLASTERSMOKE+3]),
	S_NORMAL1 (FX18, 'K',    4, NULL, &States[S_BLASTERSMOKE+4]),
	S_NORMAL1 (FX18, 'L',    4, NULL, NULL)
};

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

//========== The spiked balls spawned when a powered-up Dragon Claw shot impacts a surface.

IMPLEMENT_ACTOR (ARipper, Heretic, -1, 157)
	PROP_RadiusFixed (8)
	PROP_HeightFixed (6)
	PROP_SpeedFixed (14)
	PROP_Damage (1)
	PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
	PROP_Flags2 (MF2_NOTELEPORT|MF2_RIP|MF2_PCROSS|MF2_IMPACT)
	PROP_Flags4 (MF4_BLOODSPLATTER)
	PROP_SpawnState (S_RIPPER)
	PROP_DeathSound ("weapons/blasterpowhit")
END_DEFAULTS

FState ARipper::States[] =
{
#define S_RIPPER 0
	S_NORMAL1(FX18, 'M',    4, NULL, &States[S_RIPPER+1]),
	S_NORMAL1(FX18, 'N',    5, NULL, &States[S_RIPPER+0]),

#define S_RIPPERX (S_RIPPER+2)
	S_BRIGHT (FX18, 'O',    4, NULL, &States[S_RIPPERX+1]),
	S_BRIGHT (FX18, 'P',    4, NULL, &States[S_RIPPERX+2]),
	S_BRIGHT (FX18, 'Q',    4, NULL, &States[S_RIPPERX+3]),
	S_BRIGHT (FX18, 'R',    4, NULL, &States[S_RIPPERX+4]),
	S_BRIGHT (FX18, 'S',    4, NULL, NULL)
};

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

//========== Blaster puff 1

IMPLEMENT_ACTOR (ABlasterPuff1, Heretic, -1, 0)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
	PROP_Flags3 (MF3_PUFFONACTORS)
	PROP_SpawnState (S_BLASTERPUFF)
	PROP_CrashState (S_BLASTERPUFF_CRASH)
END_DEFAULTS

FState ABlasterPuff1::States[] =
{
#define S_BLASTERPUFF_CRASH 0
	S_BRIGHT (FX17, 'A',    4, NULL, &States[S_BLASTERPUFF_CRASH+1]),
	S_BRIGHT (FX17, 'B',    4, NULL, &States[S_BLASTERPUFF_CRASH+2]),
	S_BRIGHT (FX17, 'C',    4, NULL, &States[S_BLASTERPUFF_CRASH+3]),
	S_BRIGHT (FX17, 'D',    4, NULL, &States[S_BLASTERPUFF_CRASH+4]),
	S_BRIGHT (FX17, 'E',    4, NULL, NULL),
#define S_BLASTERPUFF (S_BLASTERPUFF_CRASH+5)
	S_BRIGHT (FX17, 'F',    3, NULL, &States[S_BLASTERPUFF+1]),
	S_BRIGHT (FX17, 'G',    3, NULL, &States[S_BLASTERPUFF+2]),
	S_BRIGHT (FX17, 'H',    4, NULL, &States[S_BLASTERPUFF+3]),
	S_BRIGHT (FX17, 'I',    4, NULL, &States[S_BLASTERPUFF+4]),
	S_BRIGHT (FX17, 'J',    4, NULL, &States[S_BLASTERPUFF+5]),
	S_BRIGHT (FX17, 'K',    4, NULL, &States[S_BLASTERPUFF+6]),
	S_BRIGHT (FX17, 'L',    4, NULL, NULL)
};

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

//========== Blaster puff 2

IMPLEMENT_ACTOR (ABlasterPuff2, Heretic, -1, 0)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
	PROP_Flags3 (MF3_PUFFONACTORS)
	PROP_SpawnState (S_BLASTERPUFF2)
END_DEFAULTS

FState ABlasterPuff2::States[] =
{
#define S_BLASTERPUFF2 0
	S_BRIGHT (FX17, 'F',    3, NULL, &States[S_BLASTERPUFF2+1]),
	S_BRIGHT (FX17, 'G',    3, NULL, &States[S_BLASTERPUFF2+2]),
	S_BRIGHT (FX17, 'H',    4, NULL, &States[S_BLASTERPUFF2+3]),
	S_BRIGHT (FX17, 'I',    4, NULL, &States[S_BLASTERPUFF2+4]),
	S_BRIGHT (FX17, 'J',    4, NULL, &States[S_BLASTERPUFF2+5]),
	S_BRIGHT (FX17, 'K',    4, NULL, &States[S_BLASTERPUFF2+6]),
	S_BRIGHT (FX17, 'L',    4, NULL, NULL)
};

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

//========== Small rune holding twenty charges for the hellstaff.

IMPLEMENT_ACTOR (ASkullRodAmmo, Heretic, 20, 158)
	PROP_SpawnHealth (AMMO_SKRD_WIMPY)
	PROP_Flags (MF_SPECIAL)
	PROP_SpawnState (0)
END_DEFAULTS

FState ASkullRodAmmo::States[] =
{
	S_NORMAL1 (AMS1, 'A',    5, NULL, &States[1]),
	S_NORMAL1 (AMS1, 'B',    5, NULL, &States[0])
};

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

//========== Big rune holding one hundred charges for the hellstaff. 

IMPLEMENT_ACTOR (ASkullRodHefty, Heretic, 21, 159)
	PROP_SpawnHealth (AMMO_SKRD_HEFTY)
	PROP_Flags (MF_SPECIAL)
	PROP_SpawnState (0)
END_DEFAULTS

FState ASkullRodHefty::States[] =
{
	S_NORMAL1 (AMS2, 'A',    5, NULL, &States[1]),
	S_NORMAL1 (AMS2, 'B',    5, NULL, &States[0])
};

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

//========== Skull Rod (Hellstaff or Horn Rod); it's a rapid-fire weapon throwing a stream of red projectiles.

IMPLEMENT_ACTOR (ASkullRod, Heretic, 2004, 30)
	PROP_Flags (MF_SPECIAL)
	PROP_SpawnState (S_WSKL)
END_DEFAULTS

FState ASkullRod::States[] =
{
#define S_WSKL 0
	S_NORMAL1 (WSKL, 'A',   -1, NULL             , NULL),

#define S_HORNRODREADY (S_WSKL+1)
	S_NORMAL1 (HROD, 'A',    1, A_WeaponReady    , &States[S_HORNRODREADY]),

#define S_HORNRODDOWN (S_HORNRODREADY+1)
	S_NORMAL1 (HROD, 'A',    1, A_Lower          , &States[S_HORNRODDOWN]),

#define S_HORNRODUP (S_HORNRODDOWN+1)
	S_NORMAL1 (HROD, 'A',    1, A_Raise          , &States[S_HORNRODUP]),

#define S_HORNRODATK1 (S_HORNRODUP+1)
	S_NORMAL1 (HROD, 'A',    4, A_FireSkullRodPL1, &States[S_HORNRODATK1+1]),
	S_NORMAL1 (HROD, 'B',    4, A_FireSkullRodPL1, &States[S_HORNRODATK1+2]),
	S_NORMAL1 (HROD, 'B',    0, A_ReFire         , &States[S_HORNRODREADY]),

#define S_HORNRODATK2 (S_HORNRODATK1+3)
	S_NORMAL1 (HROD, 'C',    2, NULL             , &States[S_HORNRODATK2+1]),
	S_NORMAL1 (HROD, 'D',    3, NULL             , &States[S_HORNRODATK2+2]),
	S_NORMAL1 (HROD, 'E',    2, NULL             , &States[S_HORNRODATK2+3]),
	S_NORMAL1 (HROD, 'F',    3, NULL             , &States[S_HORNRODATK2+4]),
	S_NORMAL1 (HROD, 'G',    4, A_FireSkullRodPL2, &States[S_HORNRODATK2+5]),
	S_NORMAL1 (HROD, 'F',    2, NULL             , &States[S_HORNRODATK2+6]),
	S_NORMAL1 (HROD, 'E',    3, NULL             , &States[S_HORNRODATK2+7]),
	S_NORMAL1 (HROD, 'D',    2, NULL             , &States[S_HORNRODATK2+8]),
	S_NORMAL1 (HROD, 'C',    2, A_ReFire         , &States[S_HORNRODREADY])
};

FWeaponInfo ASkullRod::WeaponInfo1 =
{
	WIF_BLOODSPLATTER,
	am_skullrod,
	USE_SKRD_AMMO_1,
	50,
	&States[S_HORNRODUP],
	&States[S_HORNRODDOWN],
	&States[S_HORNRODREADY],
	&States[S_HORNRODATK1],
	&States[S_HORNRODATK1],
	NULL,
	ZDRUNTIME_CLASS(ASkullRod),
	150,
	15*FRACUNIT,
	NULL,
	NULL,
	ZDRUNTIME_CLASS(ASkullRod),
	-1
};

FWeaponInfo ASkullRod::WeaponInfo2 =
{
	WIF_BLOODSPLATTER,
	am_skullrod,
	USE_SKRD_AMMO_2,
	50,
	&States[S_HORNRODUP],
	&States[S_HORNRODDOWN],
	&States[S_HORNRODREADY],
	&States[S_HORNRODATK2],
	&States[S_HORNRODATK2],
	NULL,
	ZDRUNTIME_CLASS(ASkullRod),
	150,
	15*FRACUNIT,
	NULL,
	NULL,
	ZDRUNTIME_CLASS(ASkullRod),
	-1
};

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

//========== The projectile from the hellstaff.

IMPLEMENT_ACTOR (AHornRodFX1, Heretic, -1, 160)
	PROP_RadiusFixed (12)
	PROP_HeightFixed (8)
	PROP_SpeedFixed (22)
	PROP_Damage (3)
	PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
	PROP_Flags2 (MF2_WINDTHRUST|MF2_NOTELEPORT|MF2_PCROSS|MF2_IMPACT)
	PROP_Flags4 (MF4_BLOODSPLATTER)
	PROP_SpawnState (S_HRODFX1)
	PROP_DeathState (S_HRODFXI1)
	PROP_SeeSound ("weapons/hornrodshoot")
	PROP_DeathSound ("weapons/hornrodhit")
END_DEFAULTS

FState AHornRodFX1::States[] =
{
#define S_HRODFX1 0
	S_BRIGHT (FX00, 'A',    6, NULL, &States[S_HRODFX1+1]),
	S_BRIGHT (FX00, 'B',    6, NULL, &States[S_HRODFX1+0]),

#define S_HRODFXI1 (S_HRODFX1+2)
	S_BRIGHT (FX00, 'H',    5, NULL, &States[S_HRODFXI1+1]),
	S_BRIGHT (FX00, 'I',    5, NULL, &States[S_HRODFXI1+2]),
	S_BRIGHT (FX00, 'J',    4, NULL, &States[S_HRODFXI1+3]),
	S_BRIGHT (FX00, 'K',    4, NULL, &States[S_HRODFXI1+4]),
	S_BRIGHT (FX00, 'L',    3, NULL, &States[S_HRODFXI1+5]),
	S_BRIGHT (FX00, 'M',    3, NULL, NULL)
};

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

//========== The large, rain-creating projectile from the powered-up hellstaff.

IMPLEMENT_ACTOR (AHornRodFX2, Heretic, -1, 0)
	PROP_RadiusFixed (12)
	PROP_HeightFixed (8)
	PROP_SpeedFixed (22)
	PROP_Damage (10)
	PROP_SpawnHealth (4*35)
	PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
	PROP_Flags2 (MF2_NOTELEPORT|MF2_PCROSS|MF2_IMPACT)
	PROP_Flags4 (MF4_BLOODSPLATTER)
	PROP_SpawnState (S_HRODFX2)
	PROP_DeathState (S_HRODFXI2)
END_DEFAULTS

FState AHornRodFX2::States[] =
{
#define S_HRODFX2 0
	S_BRIGHT (FX00, 'C',    3, NULL             , &States[S_HRODFX2+1]),
	S_BRIGHT (FX00, 'D',    3, A_SkullRodPL2Seek, &States[S_HRODFX2+2]),
	S_BRIGHT (FX00, 'E',    3, NULL             , &States[S_HRODFX2+3]),
	S_BRIGHT (FX00, 'F',    3, A_SkullRodPL2Seek, &States[S_HRODFX2+0]),

#define S_HRODFXI2 (S_HRODFX2+4)
	S_BRIGHT (FX00, 'H',    5, A_AddPlayerRain  , &States[S_HRODFXI2+1]),
	S_BRIGHT (FX00, 'I',    5, NULL             , &States[S_HRODFXI2+2]),
	S_BRIGHT (FX00, 'J',    4, NULL             , &States[S_HRODFXI2+3]),
	S_BRIGHT (FX00, 'K',    3, NULL             , &States[S_HRODFXI2+4]),
	S_BRIGHT (FX00, 'L',    3, NULL             , &States[S_HRODFXI2+5]),
	S_BRIGHT (FX00, 'M',    3, NULL             , &States[S_HRODFXI2+6]),
	S_NORMAL1(FX00, 'G',    1, A_HideInCeiling  , &States[S_HRODFXI2+7]),
	S_NORMAL1(FX00, 'G',    1, A_SkullRodStorm  , &States[S_HRODFXI2+7])
};

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

//========== A rain drop from the powered-up hellstaff.

IMPLEMENT_ACTOR (ARainPillar, Heretic, -1, 0)
	PROP_RadiusFixed (5)
	PROP_HeightFixed (12)
	PROP_SpeedFixed (12)
	PROP_Damage (5)
	PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_Flags4 (MF4_BLOODSPLATTER|MF4_NONETSPAWN)
	PROP_SpawnState (S_RAINPLR)
	PROP_DeathState (S_RAINPLRX)
END_DEFAULTS

FState ARainPillar::States[] =
{
#define S_RAINPLR 0
	S_BRIGHT (FX22, 'A',   -1, NULL        , NULL),

#define S_RAINPLRX (S_RAINPLR+1)
	S_BRIGHT (FX22, 'B',    4, A_RainImpact, &States[S_RAINPLRX+1]),
	S_BRIGHT (FX22, 'C',    4, NULL        , &States[S_RAINPLRX+2]),
	S_BRIGHT (FX22, 'D',    4, NULL        , &States[S_RAINPLRX+3]),
	S_BRIGHT (FX22, 'E',    4, NULL        , &States[S_RAINPLRX+4]),
	S_BRIGHT (FX22, 'F',    4, NULL        , NULL),

#define S_RAINAIRXPLR (S_RAINPLRX+5)
	S_BRIGHT (FX22, 'G',    4, NULL        , &States[S_RAINAIRXPLR+1]),
	S_BRIGHT (FX22, 'H',    4, NULL        , &States[S_RAINAIRXPLR+2]),
	S_BRIGHT (FX22, 'I',    4, NULL        , NULL),
};

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

//========== Small orb containing a single charge for the phoenix rod.

IMPLEMENT_ACTOR (APhoenixRodAmmo, Heretic, 22, 161)
	PROP_SpawnHealth (AMMO_PHRD_WIMPY)
	PROP_Flags (MF_SPECIAL)
	PROP_SpawnState (0)
END_DEFAULTS

FState APhoenixRodAmmo::States[] =
{
	S_NORMAL1 (AMP1, 'A',    4, NULL, &States[1]),
	S_NORMAL1 (AMP1, 'B',    4, NULL, &States[2]),
	S_NORMAL1 (AMP1, 'C',    4, NULL, &States[0])
};

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

//========== Large orb containing ten charges for the phoenix rod.

IMPLEMENT_ACTOR (APhoenixRodHefty, Heretic, 23, 162)
	PROP_SpawnHealth (AMMO_PHRD_HEFTY)
	PROP_Flags (MF_SPECIAL)
	PROP_SpawnState (0)
END_DEFAULTS

FState APhoenixRodHefty::States[] =
{
	S_NORMAL1 (AMP2, 'A',    4, NULL, &States[1]),
	S_NORMAL1 (AMP2, 'B',    4, NULL, &States[2]),
	S_NORMAL1 (AMP2, 'C',    4, NULL, &States[0])
};

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

//========== Phoenix Rod

IMPLEMENT_ACTOR (APhoenixRod, Heretic, 2003, 29)
	PROP_Flags (MF_SPECIAL)
	PROP_SpawnState (S_WPHX)
END_DEFAULTS

FState APhoenixRod::States[] =
{
#define S_WPHX 0
	S_NORMAL1 (WPHX, 'A',   -1, NULL                , NULL),

#define S_PHOENIXREADY (S_WPHX+1)
	S_NORMAL1 (PHNX, 'A',    1, A_WeaponReady       , &States[S_PHOENIXREADY]),

#define S_PHOENIXDOWN (S_PHOENIXREADY+1)
	S_NORMAL1 (PHNX, 'A',    1, A_Lower             , &States[S_PHOENIXDOWN]),

#define S_PHOENIXUP (S_PHOENIXDOWN+1)
	S_NORMAL1 (PHNX, 'A',    1, A_Raise             , &States[S_PHOENIXUP]),

#define S_PHOENIXATK1 (S_PHOENIXUP+1)
	S_NORMAL1 (PHNX, 'B',    5, NULL                , &States[S_PHOENIXATK1+1]),
	S_NORMAL1 (PHNX, 'C',    7, A_FirePhoenixPL1    , &States[S_PHOENIXATK1+2]),
	S_NORMAL1 (PHNX, 'D',    4, NULL                , &States[S_PHOENIXATK1+3]),
	S_NORMAL1 (PHNX, 'B',    4, NULL                , &States[S_PHOENIXATK1+4]),
	S_NORMAL1 (PHNX, 'B',    0, A_ReFire            , &States[S_PHOENIXREADY]),

#define S_PHOENIXATK2 (S_PHOENIXATK1+5)
	S_NORMAL1 (PHNX, 'B',    3, A_InitPhoenixPL2    , &States[S_PHOENIXATK2+1]),
	S_BRIGHT  (PHNX, 'C',    1, A_FirePhoenixPL2    , &States[S_PHOENIXATK2+2]),
	S_NORMAL1 (PHNX, 'B',    4, A_ReFire            , &States[S_PHOENIXATK2+3]),
	S_NORMAL1 (PHNX, 'B',    4, A_ShutdownPhoenixPL2, &States[S_PHOENIXREADY])
};

FWeaponInfo APhoenixRod::WeaponInfo1 =
{
	WIF_NOAUTOFIRE|WIF_BLOODSPLATTER,
	am_phoenixrod,
	USE_PHRD_AMMO_1,
	2,
	&States[S_PHOENIXUP],
	&States[S_PHOENIXDOWN],
	&States[S_PHOENIXREADY],
	&States[S_PHOENIXATK1],
	&States[S_PHOENIXATK1],
	NULL,
	ZDRUNTIME_CLASS(APhoenixRod),
	150,
	15*FRACUNIT,
	NULL,
	NULL,
	ZDRUNTIME_CLASS(APhoenixRod),
	-1
};

FWeaponInfo APhoenixRod::WeaponInfo2 =
{
	WIF_NOAUTOFIRE|WIF_BLOODSPLATTER,
	am_phoenixrod,
	USE_PHRD_AMMO_2,
	2,
	&States[S_PHOENIXUP],
	&States[S_PHOENIXDOWN],
	&States[S_PHOENIXREADY],
	&States[S_PHOENIXATK2],
	&States[S_PHOENIXATK2+1],
	NULL,
	ZDRUNTIME_CLASS(APhoenixRod),
	150,
	15*FRACUNIT,
	NULL,
	NULL,
	ZDRUNTIME_CLASS(APhoenixRod),
	-1
};

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

//========== The exploding projectile from the phoenix rod.

IMPLEMENT_ACTOR (APhoenixFX1, Heretic, -1, 163)
	PROP_RadiusFixed (11)
	PROP_HeightFixed (8)
	PROP_SpeedFixed (20)
	PROP_Damage (20)
	PROP_DamageType (MOD_FIRE)
	PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
	PROP_Flags2 (MF2_THRUGHOST|MF2_NOTELEPORT|MF2_PCROSS|MF2_IMPACT)
	PROP_Flags4 (MF4_BLOODSPLATTER)
	PROP_SpawnState (S_PHOENIXFX1)
	PROP_DeathState (S_PHOENIXFXI1)
	PROP_SeeSound ("weapons/phoenixshoot")
	PROP_DeathSound ("weapons/phoenixhit")
END_DEFAULTS

FState APhoenixFX1::States[] =
{
#define S_PHOENIXFX1 0
	S_BRIGHT (FX04, 'A',    4, A_PhoenixPuff, &States[S_PHOENIXFX1+0]),

#define S_PHOENIXFXI1 (S_PHOENIXFX1+1)
	S_BRIGHT (FX08, 'A',    6, A_Explode, &States[S_PHOENIXFXI1+1]),
	S_BRIGHT (FX08, 'B',    5, NULL     , &States[S_PHOENIXFXI1+2]),
	S_BRIGHT (FX08, 'C',    5, NULL     , &States[S_PHOENIXFXI1+3]),
	S_BRIGHT (FX08, 'D',    4, NULL     , &States[S_PHOENIXFXI1+4]),
	S_BRIGHT (FX08, 'E',    4, NULL     , &States[S_PHOENIXFXI1+5]),
	S_BRIGHT (FX08, 'F',    4, NULL     , &States[S_PHOENIXFXI1+6]),
	S_BRIGHT (FX08, 'G',    4, NULL     , &States[S_PHOENIXFXI1+7]),
	S_BRIGHT (FX08, 'H',    4, NULL     , NULL)
};

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

//========== The smoke puffs left in the slipstream of a phoenix rod shot.

IMPLEMENT_ACTOR (APhoenixPuff, Heretic, -1, 0)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
	PROP_Flags2 (MF2_NOTELEPORT|MF2_CANNOTPUSH)
	PROP_RenderStyle (STYLE_Translucent)
	PROP_Alpha (HR_SHADOW)
	PROP_SpawnState (0)
END_DEFAULTS

FState APhoenixPuff::States[] =
{
	S_NORMAL1 (FX04, 'B',    4, NULL, &States[1]),
	S_NORMAL1 (FX04, 'C',    4, NULL, &States[2]),
	S_NORMAL1 (FX04, 'D',    4, NULL, &States[3]),
	S_NORMAL1 (FX04, 'E',    4, NULL, &States[4]),
	S_NORMAL1 (FX04, 'F',    4, NULL, NULL),
};

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

//========== The fire thrown by a powered-up phoenix rod.

IMPLEMENT_ACTOR (APhoenixFX2, Heretic, -1, 0)
	PROP_RadiusFixed (6)
	PROP_HeightFixed (8)
	PROP_SpeedFixed (10)
	PROP_Damage (2)
	PROP_DamageType (MOD_FIRE)
	PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
	PROP_Flags2 (MF2_NOTELEPORT|MF2_PCROSS|MF2_IMPACT)
	PROP_Flags4 (MF4_BLOODSPLATTER)
	PROP_SpawnState (S_PHOENIXFX2)
	PROP_DeathState (S_PHOENIXFXI2)
END_DEFAULTS

FState APhoenixFX2::States[] =
{
#define S_PHOENIXFX2 0
	S_BRIGHT (FX09, 'A',    2, NULL       , &States[S_PHOENIXFX2+1]),
	S_BRIGHT (FX09, 'B',    2, NULL       , &States[S_PHOENIXFX2+2]),
	S_BRIGHT (FX09, 'A',    2, NULL       , &States[S_PHOENIXFX2+3]),
	S_BRIGHT (FX09, 'B',    2, NULL       , &States[S_PHOENIXFX2+4]),
	S_BRIGHT (FX09, 'A',    2, NULL       , &States[S_PHOENIXFX2+5]),
	S_BRIGHT (FX09, 'B',    2, A_FlameEnd , &States[S_PHOENIXFX2+6]),
	S_BRIGHT (FX09, 'C',    2, NULL       , &States[S_PHOENIXFX2+7]),
	S_BRIGHT (FX09, 'D',    2, NULL       , &States[S_PHOENIXFX2+8]),
	S_BRIGHT (FX09, 'E',    2, NULL       , &States[S_PHOENIXFX2+9]),
	S_BRIGHT (FX09, 'F',    2, NULL       , NULL),

#define S_PHOENIXFXI2 (S_PHOENIXFX2+10)
	S_BRIGHT (FX09, 'G',    3, NULL       , &States[S_PHOENIXFXI2+1]),
	S_BRIGHT (FX09, 'H',    3, A_FloatPuff, &States[S_PHOENIXFXI2+2]),
	S_BRIGHT (FX09, 'I',    4, NULL       , &States[S_PHOENIXFXI2+3]),
	S_BRIGHT (FX09, 'J',    5, NULL       , &States[S_PHOENIXFXI2+4]),
	S_BRIGHT (FX09, 'K',    5, NULL       , NULL)
};

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

//========== The bag of holding contains a sample of each ammunition type and extends the carrying capacity of each type.

IMPLEMENT_ACTOR (ABagOfHolding, Heretic, 8, 136)
	PROP_Flags (MF_SPECIAL|MF_COUNTITEM)
	PROP_Flags2 (MF2_FLOATBOB)
	PROP_SpawnState (0)
END_DEFAULTS

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

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

//========== Ironlich

IMPLEMENT_ACTOR (AIronlich, Heretic, 6, 20)
	PROP_SpawnHealth (700)
	PROP_RadiusFixed (40)
	PROP_HeightFixed (72)
	PROP_Mass (325)
	PROP_SpeedFixed (6)
	PROP_PainChance (32)
	PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_NOBLOOD)
	PROP_Flags2 (MF2_PASSMOBJ|MF2_PUSHWALL)
	PROP_Flags3 (MF3_DONTMORPH|MF3_DONTSQUASH)
	PROP_Flags4 (MF4_BOSSDEATH)
	PROP_SpawnState (S_HEAD_LOOK)
	PROP_SeeState (S_HEAD_FLOAT)
	PROP_PainState (S_HEAD_PAIN)
	PROP_MissileState (S_HEAD_ATK)
	PROP_DeathState (S_HEAD_DIE)
	PROP_SeeSound ("ironlich/sight")
	PROP_AttackSound ("ironlich/attack")
	PROP_PainSound ("ironlich/pain")
	PROP_DeathSound ("ironlich/death")
	PROP_ActiveSound ("ironlich/active")
END_DEFAULTS

FState AIronlich::States[] =
{
#define S_HEAD_LOOK 0
	S_NORMAL1 (HEAD, 'A',   10, A_Look      , &States[S_HEAD_LOOK]),

#define S_HEAD_FLOAT (S_HEAD_LOOK+1)
	S_NORMAL1 (HEAD, 'A',    4, A_Chase     , &States[S_HEAD_FLOAT]),

#define S_HEAD_ATK (S_HEAD_FLOAT+1)
	S_NORMAL1 (HEAD, 'A',    5, A_FaceTarget, &States[S_HEAD_ATK+1]),
	S_NORMAL1 (HEAD, 'B',   20, A_LichAttack, &States[S_HEAD_FLOAT]),

#define S_HEAD_PAIN (S_HEAD_ATK+2)
	S_NORMAL1 (HEAD, 'A',    4, NULL        , &States[S_HEAD_PAIN+1]),
	S_NORMAL1 (HEAD, 'A',    4, A_Pain      , &States[S_HEAD_FLOAT]),

#define S_HEAD_DIE (S_HEAD_PAIN+2)
	S_NORMAL1 (HEAD, 'C',    7, NULL        , &States[S_HEAD_DIE+1]),
	S_NORMAL1 (HEAD, 'D',    7, A_Scream    , &States[S_HEAD_DIE+2]),
	S_NORMAL1 (HEAD, 'E',    7, NULL        , &States[S_HEAD_DIE+3]),
	S_NORMAL1 (HEAD, 'F',    7, NULL        , &States[S_HEAD_DIE+4]),
	S_NORMAL1 (HEAD, 'G',    7, A_NoBlocking, &States[S_HEAD_DIE+5]),
	S_NORMAL1 (HEAD, 'H',    7, NULL        , &States[S_HEAD_DIE+6]),
	S_NORMAL1 (HEAD, 'I',   -1, A_BossDeath , NULL)
};

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

//========== The large ball of ice hurled by one of the iron lich's attacks.

IMPLEMENT_ACTOR (AHeadFX1, Heretic, -1, 164)
	PROP_RadiusFixed (12)
	PROP_HeightFixed (6)
	PROP_SpeedFixed (13)
	PROP_Damage (1)
	PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
	PROP_Flags2 (MF2_NOTELEPORT|MF2_THRUGHOST)
	PROP_Flags4 (MF4_BLOODSPLATTER)
	PROP_SpawnState (S_HEADFX1)
	PROP_DeathState (S_HEADFXI1)
END_DEFAULTS

FState AHeadFX1::States[] =
{
#define S_HEADFX1 0
	S_NORMAL1 (FX05, 'A',    6, NULL           , &States[S_HEADFX1+1]),
	S_NORMAL1 (FX05, 'B',    6, NULL           , &States[S_HEADFX1+2]),
	S_NORMAL1 (FX05, 'C',    6, NULL           , &States[S_HEADFX1+0]),

#define S_HEADFXI1 (S_HEADFX1+3)
	S_NORMAL1 (FX05, 'D',    5, A_LichIceImpact, &States[S_HEADFXI1+1]),
	S_NORMAL1 (FX05, 'E',    5, NULL           , &States[S_HEADFXI1+2]),
	S_NORMAL1 (FX05, 'F',    5, NULL           , &States[S_HEADFXI1+3]),
	S_NORMAL1 (FX05, 'G',    5, NULL           , NULL)
};

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

//========== The ice shards created when an iron lich's ice ball explodes on impact.

IMPLEMENT_ACTOR (AHeadFX2, Heretic, -1, 0)
	PROP_RadiusFixed (12)
	PROP_HeightFixed (6)
	PROP_SpeedFixed (8)
	PROP_Damage (3)
	PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_Flags4 (MF4_BLOODSPLATTER)
	PROP_SpawnState (S_HEADFX2)
	PROP_DeathState (S_HEADFXI2)
END_DEFAULTS

FState AHeadFX2::States[] =
{
#define S_HEADFX2 0
	S_NORMAL1 (FX05, 'H',    6, NULL, &States[S_HEADFX2+1]),
	S_NORMAL1 (FX05, 'I',    6, NULL, &States[S_HEADFX2+2]),
	S_NORMAL1 (FX05, 'J',    6, NULL, &States[S_HEADFX2+0]),

#define S_HEADFXI2 (S_HEADFX2+3)
	S_NORMAL1 (FX05, 'D',    5, NULL, &States[S_HEADFXI2+1]),
	S_NORMAL1 (FX05, 'E',    5, NULL, &States[S_HEADFXI2+2]),
	S_NORMAL1 (FX05, 'F',    5, NULL, &States[S_HEADFXI2+3]),
	S_NORMAL1 (FX05, 'G',    5, NULL, NULL)
};

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

//========== A fireball thrown by one of the iron lich's attacks (the lich actually spits six of them at once).

IMPLEMENT_ACTOR (AHeadFX3, Heretic, -1, 0)
	PROP_RadiusFixed (14)
	PROP_HeightFixed (12)
	PROP_SpeedFixed (10)
	PROP_Damage (5)
	PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
	PROP_Flags2 (MF2_WINDTHRUST|MF2_NOTELEPORT)
	PROP_Flags4 (MF4_BLOODSPLATTER)
	PROP_SpawnState (S_HEADFX3)
	PROP_DeathState (S_HEADFXI3)
END_DEFAULTS

FState AHeadFX3::States[] =
{
#define S_HEADFX3 0
	S_NORMAL1 (FX06, 'A',    4, A_LichFireGrow, &States[S_HEADFX3+1]),
	S_NORMAL1 (FX06, 'B',    4, A_LichFireGrow, &States[S_HEADFX3+2]),
	S_NORMAL1 (FX06, 'C',    4, A_LichFireGrow, &States[S_HEADFX3+0]),
	S_NORMAL1 (FX06, 'A',    5, NULL          , &States[S_HEADFX3+4]),
	S_NORMAL1 (FX06, 'B',    5, NULL          , &States[S_HEADFX3+5]),
	S_NORMAL1 (FX06, 'C',    5, NULL          , &States[S_HEADFX3+3]),

#define S_HEADFXI3 (S_HEADFX3+6)
	S_NORMAL1 (FX06, 'D',    5, NULL          , &States[S_HEADFXI3+1]),
	S_NORMAL1 (FX06, 'E',    5, NULL          , &States[S_HEADFXI3+2]),
	S_NORMAL1 (FX06, 'F',    5, NULL          , &States[S_HEADFXI3+3]),
	S_NORMAL1 (FX06, 'G',    5, NULL          , NULL)
};

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

//========== The tornado summoned by one of the iron lich's attacks.

IMPLEMENT_ACTOR (AWhirlwind, Heretic, -1, 165)
	PROP_RadiusFixed (16)
	PROP_HeightFixed (74)
	PROP_SpeedFixed (10)
	PROP_Damage (1)
	PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_Flags3 (MF3_EXPLOCOUNT)
	PROP_Flags4 (MF4_BLOODSPLATTER)
	PROP_RenderStyle (STYLE_Translucent)
	PROP_Alpha (HR_SHADOW)
	PROP_SpawnState (S_HEADFX4)
	PROP_DeathState (S_HEADFXI4)
END_DEFAULTS

FState AWhirlwind::States[] =
{
#define S_HEADFX4 0
	S_NORMAL1 (FX07, 'D',    3, NULL           , &States[S_HEADFX4+1]),
	S_NORMAL1 (FX07, 'E',    3, NULL           , &States[S_HEADFX4+2]),
	S_NORMAL1 (FX07, 'F',    3, NULL           , &States[S_HEADFX4+3]),
	S_NORMAL1 (FX07, 'G',    3, NULL           , &States[S_HEADFX4+4]),
	S_NORMAL1 (FX07, 'A',    3, A_WhirlwindSeek, &States[S_HEADFX4+5]),
	S_NORMAL1 (FX07, 'B',    3, A_WhirlwindSeek, &States[S_HEADFX4+6]),
	S_NORMAL1 (FX07, 'C',    3, A_WhirlwindSeek, &States[S_HEADFX4+4]),

#define S_HEADFXI4 (S_HEADFX4+7)
	S_NORMAL1 (FX07, 'G',    4, NULL           , &States[S_HEADFXI4+1]),
	S_NORMAL1 (FX07, 'F',    4, NULL           , &States[S_HEADFXI4+2]),
	S_NORMAL1 (FX07, 'E',    4, NULL           , &States[S_HEADFXI4+3]),
	S_NORMAL1 (FX07, 'D',    4, NULL           , NULL)
};

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

//========== Knight (Undead warrior)

IMPLEMENT_ACTOR (AKnight, Heretic, 64, 6)
	PROP_SpawnHealth (200)
	PROP_RadiusFixed (24)
	PROP_HeightFixed (78)
	PROP_Mass (150)
	PROP_SpeedFixed (12)
	PROP_PainChance (100)
	PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL)
	PROP_Flags2 (MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_PUSHWALL)
	PROP_SpawnState (S_KNIGHT_STND)
	PROP_SeeState (S_KNIGHT_WALK)
	PROP_PainState (S_KNIGHT_PAIN)
	PROP_MeleeState (S_KNIGHT_ATK)
	PROP_MissileState (S_KNIGHT_ATK)
	PROP_DeathState (S_KNIGHT_DIE)
	PROP_SeeSound ("hknight/sight")
	PROP_AttackSound ("hknight/attack")
	PROP_PainSound ("hknight/pain")
	PROP_DeathSound ("hknight/death")
	PROP_ActiveSound ("hknight/active")
END_DEFAULTS

FState AKnight::States[] =
{
#define S_KNIGHT_STND 0
	S_NORMAL1 (KNIG, 'A',   10, A_Look        , &States[S_KNIGHT_STND+1]),
	S_NORMAL1 (KNIG, 'B',   10, A_Look        , &States[S_KNIGHT_STND+0]),

#define S_KNIGHT_WALK (S_KNIGHT_STND+2)
	S_NORMAL1 (KNIG, 'A',    4, A_Chase       , &States[S_KNIGHT_WALK+1]),
	S_NORMAL1 (KNIG, 'B',    4, A_Chase       , &States[S_KNIGHT_WALK+2]),
	S_NORMAL1 (KNIG, 'C',    4, A_Chase       , &States[S_KNIGHT_WALK+3]),
	S_NORMAL1 (KNIG, 'D',    4, A_Chase       , &States[S_KNIGHT_WALK+0]),

#define S_KNIGHT_ATK (S_KNIGHT_WALK+4)
	S_NORMAL1 (KNIG, 'E',   10, A_FaceTarget  , &States[S_KNIGHT_ATK+1]),
	S_NORMAL1 (KNIG, 'F',    8, A_FaceTarget  , &States[S_KNIGHT_ATK+2]),
	S_NORMAL1 (KNIG, 'G',    8, A_KnightAttack, &States[S_KNIGHT_ATK+3]),
	S_NORMAL1 (KNIG, 'E',   10, A_FaceTarget  , &States[S_KNIGHT_ATK+4]),
	S_NORMAL1 (KNIG, 'F',    8, A_FaceTarget  , &States[S_KNIGHT_ATK+5]),
	S_NORMAL1 (KNIG, 'G',    8, A_KnightAttack, &States[S_KNIGHT_WALK+0]),

#define S_KNIGHT_PAIN (S_KNIGHT_ATK+6)
	S_NORMAL1 (KNIG, 'H',    3, NULL          , &States[S_KNIGHT_PAIN+1]),
	S_NORMAL1 (KNIG, 'H',    3, A_Pain        , &States[S_KNIGHT_WALK+0]),

#define S_KNIGHT_DIE (S_KNIGHT_PAIN+2)
	S_NORMAL1 (KNIG, 'I',    6, NULL          , &States[S_KNIGHT_DIE+1]),
	S_NORMAL1 (KNIG, 'J',    6, A_Scream      , &States[S_KNIGHT_DIE+2]),
	S_NORMAL1 (KNIG, 'K',    6, NULL          , &States[S_KNIGHT_DIE+3]),
	S_NORMAL1 (KNIG, 'L',    6, A_NoBlocking  , &States[S_KNIGHT_DIE+4]),
	S_NORMAL1 (KNIG, 'M',    6, NULL          , &States[S_KNIGHT_DIE+5]),
	S_NORMAL1 (KNIG, 'N',    6, NULL          , &States[S_KNIGHT_DIE+6]),
	S_NORMAL1 (KNIG, 'O',   -1, NULL          , NULL)
};

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

//========== The ghost version of the undead warrior.

IMPLEMENT_STATELESS_ACTOR (AKnightGhost, Heretic, 65, 129)
	PROP_FlagsSet (MF_SHADOW)
	PROP_Flags3 (MF3_GHOST)
	PROP_RenderStyle (STYLE_Translucent)
	PROP_Alpha (HR_SHADOW)
END_DEFAULTS

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

//========== A spinning axe, glowing with green light, tossed by undead warriors.

IMPLEMENT_ACTOR (AKnightAxe, Heretic, -1, 127)
	PROP_RadiusFixed (10)
	PROP_HeightFixed (8)
	PROP_SpeedFixed (9)
	PROP_Damage (2)
	PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
	PROP_Flags2 (MF2_WINDTHRUST|MF2_NOTELEPORT|MF2_THRUGHOST)
	PROP_Flags4 (MF4_BLOODSPLATTER)
	PROP_SpawnState (S_SPINAXE)
	PROP_DeathState (S_SPINAXEX)
	PROP_DeathSound ("knight/hit")
END_DEFAULTS

FState AKnightAxe::States[] =
{
#define S_SPINAXE 0
	S_BRIGHT (SPAX, 'A',    3, A_AxeSound, &States[S_SPINAXE+1]),
	S_BRIGHT (SPAX, 'B',    3, NULL      , &States[S_SPINAXE+2]),
	S_BRIGHT (SPAX, 'C',    3, NULL      , &States[S_SPINAXE+0]),

#define S_SPINAXEX (S_SPINAXE+3)
	S_BRIGHT (SPAX, 'D',    6, NULL      , &States[S_SPINAXEX+1]),
	S_BRIGHT (SPAX, 'E',    6, NULL      , &States[S_SPINAXEX+2]),
	S_BRIGHT (SPAX, 'F',    6, NULL      , NULL)
};

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

//========== A spinning axe, dripping with blood, tossed by ghost warriors and sometimes by undead warriors. 

IMPLEMENT_ACTOR (ARedAxe, Heretic, -1, 128)
	PROP_Damage (7)
	PROP_Flags2Clear (MF2_WINDTHRUST)
	PROP_SpawnState (S_REDAXE)
	PROP_DeathState (S_REDAXEX)
END_DEFAULTS

FState ARedAxe::States[] =
{
#define S_REDAXE 0
	S_BRIGHT (RAXE, 'A',    5, A_DripBlood, &States[S_REDAXE+1]),
	S_BRIGHT (RAXE, 'B',    5, A_DripBlood, &States[S_REDAXE+0]),

#define S_REDAXEX (S_REDAXE+2)
	S_BRIGHT (RAXE, 'C',    6, NULL       , &States[S_REDAXEX+1]),
	S_BRIGHT (RAXE, 'D',    6, NULL       , &States[S_REDAXEX+2]),
	S_BRIGHT (RAXE, 'E',    6, NULL       , NULL)
};

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

//========== Mummy (Golem)

IMPLEMENT_ACTOR (AMummy, Heretic, 68, 4)
	PROP_SpawnHealth (80)
	PROP_RadiusFixed (22)
	PROP_HeightFixed (62)
	PROP_Mass (75)
	PROP_SpeedFixed (12)
	PROP_PainChance (128)
	PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL)
	PROP_Flags2 (MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_PUSHWALL)
	PROP_SpawnState (S_MUMMY_LOOK)
	PROP_SeeState (S_MUMMY_WALK)
	PROP_PainState (S_MUMMY_PAIN)
	PROP_MeleeState (S_MUMMY_ATK)
	PROP_DeathState (S_MUMMY_DIE)
	PROP_SeeSound ("mummy/sight")
	PROP_AttackSound ("mummy/attack1")
	PROP_PainSound ("mummy/pain")
	PROP_DeathSound ("mummy/death")
	PROP_ActiveSound ("mummy/active")
END_DEFAULTS

FState AMummy::States[] =
{
#define S_MUMMY_LOOK 0
	S_NORMAL1 (MUMM, 'A',   10, A_Look       , &States[S_MUMMY_LOOK+1]),
	S_NORMAL1 (MUMM, 'B',   10, A_Look       , &States[S_MUMMY_LOOK+0]),

#define S_MUMMY_WALK (S_MUMMY_LOOK+2)
	S_NORMAL1 (MUMM, 'A',    4, A_Chase      , &States[S_MUMMY_WALK+1]),
	S_NORMAL1 (MUMM, 'B',    4, A_Chase      , &States[S_MUMMY_WALK+2]),
	S_NORMAL1 (MUMM, 'C',    4, A_Chase      , &States[S_MUMMY_WALK+3]),
	S_NORMAL1 (MUMM, 'D',    4, A_Chase      , &States[S_MUMMY_WALK+0]),

#define S_MUMMY_ATK (S_MUMMY_WALK+4)
	S_NORMAL1 (MUMM, 'E',    6, A_FaceTarget , &States[S_MUMMY_ATK+1]),
	S_NORMAL1 (MUMM, 'F',    6, A_MummyAttack, &States[S_MUMMY_ATK+2]),
	S_NORMAL1 (MUMM, 'G',    6, A_FaceTarget , &States[S_MUMMY_WALK+0]),

#define S_MUMMY_PAIN (S_MUMMY_ATK+3)
	S_NORMAL1 (MUMM, 'H',    4, NULL         , &States[S_MUMMY_PAIN+1]),
	S_NORMAL1 (MUMM, 'H',    4, A_Pain       , &States[S_MUMMY_WALK+0]),

#define S_MUMMY_DIE (S_MUMMY_PAIN+2)
	S_NORMAL1 (MUMM, 'I',    5, NULL         , &States[S_MUMMY_DIE+1]),
	S_NORMAL1 (MUMM, 'J',    5, A_Scream     , &States[S_MUMMY_DIE+2]),
	S_NORMAL1 (MUMM, 'K',    5, A_MummySoul  , &States[S_MUMMY_DIE+3]),
	S_NORMAL1 (MUMM, 'L',    5, NULL         , &States[S_MUMMY_DIE+4]),
	S_NORMAL1 (MUMM, 'M',    5, A_NoBlocking , &States[S_MUMMY_DIE+5]),
	S_NORMAL1 (MUMM, 'N',    5, NULL         , &States[S_MUMMY_DIE+6]),
	S_NORMAL1 (MUMM, 'O',    5, NULL         , &States[S_MUMMY_DIE+7]),
	S_NORMAL1 (MUMM, 'P',   -1, NULL         , NULL)
};

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

//========== Mummy leader (Nitrogolem)

IMPLEMENT_ACTOR (AMummyLeader, Heretic, 45, 2)
	PROP_SpawnHealth (100)
	PROP_PainChance (64)
	PROP_MissileState (S_MUMMYL_ATK)
END_DEFAULTS

FState AMummyLeader::States[] =
{
#define S_MUMMYL_ATK 0
	S_NORMAL1(MUMM, 'X',    5, A_FaceTarget  , &States[S_MUMMYL_ATK+1]),
	S_BRIGHT (MUMM, 'Y',    5, A_FaceTarget  , &States[S_MUMMYL_ATK+2]),
	S_NORMAL1(MUMM, 'X',    5, A_FaceTarget  , &States[S_MUMMYL_ATK+3]),
	S_BRIGHT (MUMM, 'Y',    5, A_FaceTarget  , &States[S_MUMMYL_ATK+4]),
	S_NORMAL1(MUMM, 'X',    5, A_FaceTarget  , &States[S_MUMMYL_ATK+5]),
	S_BRIGHT (MUMM, 'Y',   15, A_MummyAttack2, &AMummy::States[S_MUMMY_WALK+0]),
};

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

//========== Mummy ghost (Ghost golem)

IMPLEMENT_STATELESS_ACTOR (AMummyGhost, Heretic, 69, 8)
	PROP_FlagsSet (MF_SHADOW)
	PROP_Flags3 (MF3_GHOST)
	PROP_RenderStyle (STYLE_Translucent)
	PROP_Alpha (HR_SHADOW)
END_DEFAULTS

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

//========== Mummy leader ghost (Ghost nitrogolem)

IMPLEMENT_STATELESS_ACTOR (AMummyLeaderGhost, Heretic, 46, 9)
	PROP_FlagsSet (MF_SHADOW)
	PROP_Flags3 (MF3_GHOST)
	PROP_RenderStyle (STYLE_Translucent)
	PROP_Alpha (HR_SHADOW)
END_DEFAULTS

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

//========== When a golem is killed this ghost leaves its body.

IMPLEMENT_ACTOR (AMummySoul, Heretic, -1, 0)
	PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
	PROP_Flags4 (MF4_NONETSPAWN)
	PROP_SpawnState (S_MUMMY_SOUL)
END_DEFAULTS

FState AMummySoul::States[] =
{
#define S_MUMMY_SOUL 0
	S_NORMAL1 (MUMM, 'Q',    5, NULL, &States[S_MUMMY_SOUL+1]),
	S_NORMAL1 (MUMM, 'R',    5, NULL, &States[S_MUMMY_SOUL+2]),
	S_NORMAL1 (MUMM, 'S',    5, NULL, &States[S_MUMMY_SOUL+3]),
	S_NORMAL1 (MUMM, 'T',    9, NULL, &States[S_MUMMY_SOUL+4]),
	S_NORMAL1 (MUMM, 'U',    5, NULL, &States[S_MUMMY_SOUL+5]),
	S_NORMAL1 (MUMM, 'V',    5, NULL, &States[S_MUMMY_SOUL+6]),
	S_NORMAL1 (MUMM, 'W',    5, NULL, NULL)
};

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

//========== The screaming, flying, flaming skulls launched by nitrogolems.

IMPLEMENT_ACTOR (AMummyFX1, Heretic, -1, 131)
	PROP_RadiusFixed (8)
	PROP_HeightFixed (14)
	PROP_SpeedFixed (9)
	PROP_Damage (4)
	PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_Flags4 (MF4_BLOODSPLATTER)
	PROP_SpawnState (S_MUMMYFX1)
	PROP_DeathState (S_MUMMYFXI1)
END_DEFAULTS

FState AMummyFX1::States[] =
{
#define S_MUMMYFX1 0
	// [RH] Make the mummy scream right away
	S_BRIGHT (FX15, 'A',    1, NULL          , &States[S_MUMMYFX1+1]),
	S_BRIGHT (FX15, 'A',    5, A_MummyFXSound, &States[S_MUMMYFX1+2]),
	S_BRIGHT (FX15, 'B',    5, A_MummyFX1Seek, &States[S_MUMMYFX1+3]),
	S_BRIGHT (FX15, 'C',    5, NULL          , &States[S_MUMMYFX1+4]),
	S_BRIGHT (FX15, 'B',    5, A_MummyFX1Seek, &States[S_MUMMYFX1+1]),

#define S_MUMMYFXI1 (S_MUMMYFX1+5)
	S_BRIGHT (FX15, 'D',    5, NULL          , &States[S_MUMMYFXI1+1]),
	S_BRIGHT (FX15, 'E',    5, NULL          , &States[S_MUMMYFXI1+2]),
	S_BRIGHT (FX15, 'F',    5, NULL          , &States[S_MUMMYFXI1+3]),
	S_BRIGHT (FX15, 'G',    5, NULL          , NULL)
};

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

//========== Ophidian: a serpentine enemy wielding a magic trident able to throw projectiles of ice and fire.

IMPLEMENT_ACTOR (ASnake, Heretic, 92, 132)
	PROP_SpawnHealth (280)
	PROP_RadiusFixed (22)
	PROP_HeightFixed (70)
	PROP_SpeedFixed (10)
	PROP_PainChance (48)
	PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL)
	PROP_Flags2 (MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_PUSHWALL)
	PROP_SpawnState (S_SNAKE_LOOK)
	PROP_SeeState (S_SNAKE_WALK)
	PROP_PainState (S_SNAKE_PAIN)
	PROP_MissileState (S_SNAKE_ATK)
	PROP_DeathState (S_SNAKE_DIE)
	PROP_AttackSound ("snake/attack")
	PROP_SeeSound ("snake/sight")
	PROP_PainSound ("snake/pain")
	PROP_DeathSound ("snake/death")
	PROP_ActiveSound ("snake/active")
END_DEFAULTS

FState ASnake::States[] =
{
#define S_SNAKE_LOOK 0
	S_NORMAL1 (SNKE, 'A',   10, A_Look        , &States[S_SNAKE_LOOK+1]),
	S_NORMAL1 (SNKE, 'B',   10, A_Look        , &States[S_SNAKE_LOOK+0]),

#define S_SNAKE_WALK (S_SNAKE_LOOK+2)
	S_NORMAL1 (SNKE, 'A',    4, A_Chase       , &States[S_SNAKE_WALK+1]),
	S_NORMAL1 (SNKE, 'B',    4, A_Chase       , &States[S_SNAKE_WALK+2]),
	S_NORMAL1 (SNKE, 'C',    4, A_Chase       , &States[S_SNAKE_WALK+3]),
	S_NORMAL1 (SNKE, 'D',    4, A_Chase       , &States[S_SNAKE_WALK+0]),

#define S_SNAKE_ATK (S_SNAKE_WALK+4)
	S_NORMAL1 (SNKE, 'F',    5, A_FaceTarget  , &States[S_SNAKE_ATK+1]),
	S_NORMAL1 (SNKE, 'F',    5, A_FaceTarget  , &States[S_SNAKE_ATK+2]),
	S_NORMAL1 (SNKE, 'F',    4, A_SnakeAttack , &States[S_SNAKE_ATK+3]),
	S_NORMAL1 (SNKE, 'F',    4, A_SnakeAttack , &States[S_SNAKE_ATK+4]),
	S_NORMAL1 (SNKE, 'F',    4, A_SnakeAttack , &States[S_SNAKE_ATK+5]),
	S_NORMAL1 (SNKE, 'F',    5, A_FaceTarget  , &States[S_SNAKE_ATK+6]),
	S_NORMAL1 (SNKE, 'F',    5, A_FaceTarget  , &States[S_SNAKE_ATK+7]),
	S_NORMAL1 (SNKE, 'F',    5, A_FaceTarget  , &States[S_SNAKE_ATK+8]),
	S_NORMAL1 (SNKE, 'F',    4, A_SnakeAttack2, &States[S_SNAKE_WALK+0]),

#define S_SNAKE_PAIN (S_SNAKE_ATK+9)
	S_NORMAL1 (SNKE, 'E',    3, NULL          , &States[S_SNAKE_PAIN+1]),
	S_NORMAL1 (SNKE, 'E',    3, A_Pain        , &States[S_SNAKE_WALK+0]),

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

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

//========== Ophidian ice ball: ophidians throw a volley of three of these projectiles, quickly followed by one of a more dangerous type.

IMPLEMENT_ACTOR (ASnakeProjA, Heretic, -1, 138)
	PROP_RadiusFixed (12)
	PROP_HeightFixed (8)
	PROP_SpeedFixed (14)
	PROP_Damage (1)
	PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
	PROP_Flags2 (MF2_WINDTHRUST|MF2_NOTELEPORT)
	PROP_Flags4 (MF4_BLOODSPLATTER)
	PROP_SpawnState (S_SNAKEPRO_A)
	PROP_DeathState (S_SNAKEPRO_AX)
END_DEFAULTS

FState ASnakeProjA::States[] =
{
#define S_SNAKEPRO_A 0
	S_BRIGHT (SNFX, 'A',    5, NULL, &States[S_SNAKEPRO_A+1]),
	S_BRIGHT (SNFX, 'B',    5, NULL, &States[S_SNAKEPRO_A+2]),
	S_BRIGHT (SNFX, 'C',    5, NULL, &States[S_SNAKEPRO_A+3]),
	S_BRIGHT (SNFX, 'D',    5, NULL, &States[S_SNAKEPRO_A+0]),

#define S_SNAKEPRO_AX (S_SNAKEPRO_A+4)
	S_BRIGHT (SNFX, 'E',    5, NULL, &States[S_SNAKEPRO_AX+1]),
	S_BRIGHT (SNFX, 'F',    5, NULL, &States[S_SNAKEPRO_AX+2]),
	S_BRIGHT (SNFX, 'G',    4, NULL, &States[S_SNAKEPRO_AX+3]),
	S_BRIGHT (SNFX, 'H',    3, NULL, &States[S_SNAKEPRO_AX+4]),
	S_BRIGHT (SNFX, 'I',    3, NULL, NULL)
};

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

//========== The last and most powerful projectile thrown by an ophidian's attack, after a volley of three less dangerous ones. 

IMPLEMENT_ACTOR (ASnakeProjB, Heretic, -1, 139)
	PROP_RadiusFixed (12)
	PROP_HeightFixed (8)
	PROP_Damage (3)
	PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_SpawnState (S_SNAKEPRO_B)
	PROP_DeathState (S_SNAKEPRO_BX)
END_DEFAULTS

FState ASnakeProjB::States[] =
{
#define S_SNAKEPRO_B 0
	S_BRIGHT (SNFX, 'J',    6, NULL, &States[S_SNAKEPRO_B+1]),
	S_BRIGHT (SNFX, 'K',    6, NULL, &States[S_SNAKEPRO_B+0]),

#define S_SNAKEPRO_BX (S_SNAKEPRO_B+2)
	S_BRIGHT (SNFX, 'L',    5, NULL, &States[S_SNAKEPRO_BX+1]),
	S_BRIGHT (SNFX, 'M',    5, NULL, &States[S_SNAKEPRO_BX+2]),
	S_BRIGHT (SNFX, 'N',    4, NULL, &States[S_SNAKEPRO_BX+3]),
	S_BRIGHT (SNFX, 'O',    3, NULL, NULL)
};

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

//========== The Disciples of D'Sparil are sinister wizards wearing a dark hooded robe, probably undead.

IMPLEMENT_ACTOR (AWizard, Heretic, 15, 19)
	PROP_SpawnHealth (180)
	PROP_RadiusFixed (16)
	PROP_HeightFixed (68)
	PROP_Mass (100)
	PROP_SpeedFixed (12)
	PROP_PainChance (64)
	PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL|MF_FLOAT|MF_NOGRAVITY)
	PROP_Flags2 (MF2_PASSMOBJ|MF2_PUSHWALL)
	PROP_Flags3 (MF3_DONTOVERLAP)
	PROP_SpawnState (S_WIZARD_LOOK)
	PROP_SeeState (S_WIZARD_WALK)
	PROP_PainState (S_WIZARD_PAIN)
	PROP_MissileState (S_WIZARD_ATK)
	PROP_DeathState (S_WIZARD_DIE)
	PROP_SeeSound ("wizard/sight")
	PROP_AttackSound ("wizard/attack")
	PROP_PainSound ("wizard/pain")
	PROP_DeathSound ("wizard/death")
	PROP_ActiveSound ("wizard/active")
END_DEFAULTS

FState AWizard::States[] =
{
#define S_WIZARD_LOOK 0
	S_NORMAL1 (WZRD, 'A',   10, A_Look      , &States[S_WIZARD_LOOK+1]),
	S_NORMAL1 (WZRD, 'B',   10, A_Look      , &States[S_WIZARD_LOOK+0]),

#define S_WIZARD_WALK (S_WIZARD_LOOK+2)
	S_NORMAL1 (WZRD, 'A',    3, A_Chase     , &States[S_WIZARD_WALK+1]),
	S_NORMAL1 (WZRD, 'A',    4, A_Chase     , &States[S_WIZARD_WALK+2]),
	S_NORMAL1 (WZRD, 'A',    3, A_Chase     , &States[S_WIZARD_WALK+3]),
	S_NORMAL1 (WZRD, 'A',    4, A_Chase     , &States[S_WIZARD_WALK+4]),
	S_NORMAL1 (WZRD, 'B',    3, A_Chase     , &States[S_WIZARD_WALK+5]),
	S_NORMAL1 (WZRD, 'B',    4, A_Chase     , &States[S_WIZARD_WALK+6]),
	S_NORMAL1 (WZRD, 'B',    3, A_Chase     , &States[S_WIZARD_WALK+7]),
	S_NORMAL1 (WZRD, 'B',    4, A_Chase     , &States[S_WIZARD_WALK+0]),

#define S_WIZARD_ATK (S_WIZARD_WALK+8)
	S_NORMAL1 (WZRD, 'C',    4, A_WizAtk1   , &States[S_WIZARD_ATK+1]),
	S_NORMAL1 (WZRD, 'C',    4, A_WizAtk2   , &States[S_WIZARD_ATK+2]),
	S_NORMAL1 (WZRD, 'C',    4, A_WizAtk1   , &States[S_WIZARD_ATK+3]),
	S_NORMAL1 (WZRD, 'C',    4, A_WizAtk2   , &States[S_WIZARD_ATK+4]),
	S_NORMAL1 (WZRD, 'C',    4, A_WizAtk1   , &States[S_WIZARD_ATK+5]),
	S_NORMAL1 (WZRD, 'C',    4, A_WizAtk2   , &States[S_WIZARD_ATK+6]),
	S_NORMAL1 (WZRD, 'C',    4, A_WizAtk1   , &States[S_WIZARD_ATK+7]),
	S_NORMAL1 (WZRD, 'C',    4, A_WizAtk2   , &States[S_WIZARD_ATK+8]),
	S_NORMAL1 (WZRD, 'D',   12, A_WizAtk3   , &States[S_WIZARD_WALK+0]),

#define S_WIZARD_PAIN (S_WIZARD_ATK+9)
	S_NORMAL1 (WZRD, 'E',    3, A_GhostOff  , &States[S_WIZARD_PAIN+1]),
	S_NORMAL1 (WZRD, 'E',    3, A_Pain      , &States[S_WIZARD_WALK+0]),

#define S_WIZARD_DIE (S_WIZARD_PAIN+2)
	S_NORMAL1 (WZRD, 'F',    6, A_GhostOff  , &States[S_WIZARD_DIE+1]),
	S_NORMAL1 (WZRD, 'G',    6, A_Scream    , &States[S_WIZARD_DIE+2]),
	S_NORMAL1 (WZRD, 'H',    6, NULL        , &States[S_WIZARD_DIE+3]),
	S_NORMAL1 (WZRD, 'I',    6, NULL        , &States[S_WIZARD_DIE+4]),
	S_NORMAL1 (WZRD, 'J',    6, A_NoBlocking, &States[S_WIZARD_DIE+5]),
	S_NORMAL1 (WZRD, 'K',    6, NULL        , &States[S_WIZARD_DIE+6]),
	S_NORMAL1 (WZRD, 'L',    6, NULL        , &States[S_WIZARD_DIE+7]),
	S_NORMAL1 (WZRD, 'M',   -1, NULL        , NULL)
};

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

//========== Disciples of D'Sparil fire three of these purple projectiles at a time, in large spread.

IMPLEMENT_ACTOR (AWizardFX1, Heretic, -1, 140)
	PROP_RadiusFixed (10)
	PROP_HeightFixed (6)
	PROP_SpeedFixed (18)
	PROP_Damage (3)
	PROP_Flags (MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY)
	PROP_Flags2 (MF2_NOTELEPORT)
	PROP_Flags4 (MF4_BLOODSPLATTER)
	PROP_SpawnState (S_WIZFX1)
	PROP_DeathState (S_WIZFXI1)
END_DEFAULTS

FState AWizardFX1::States[] =
{
#define S_WIZFX1 0
	S_BRIGHT (FX11, 'A',    6, NULL, &States[S_WIZFX1+1]),
	S_BRIGHT (FX11, 'B',    6, NULL, &States[S_WIZFX1+0]),

#define S_WIZFXI1 (S_WIZFX1+2)
	S_BRIGHT (FX11, 'C',    5, NULL, &States[S_WIZFXI1+1]),
	S_BRIGHT (FX11, 'D',    5, NULL, &States[S_WIZFXI1+2]),
	S_BRIGHT (FX11, 'E',    5, NULL, &States[S_WIZFXI1+3]),
	S_BRIGHT (FX11, 'F',    5, NULL, &States[S_WIZFXI1+4]),
	S_BRIGHT (FX11, 'G',    5, NULL, NULL)
};

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

//========== Heretic Decoration: just a skull on a quite long rope.

IMPLEMENT_ACTOR (ASkullHang70, Heretic, 17, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(70)
	PROP_Flags(MF_SPAWNCEILING|MF_NOGRAVITY)
END_DEFAULTS

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

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

//========== Heretic Decoration: just a skull on a long rope.

IMPLEMENT_ACTOR (ASkullHang60, Heretic, 24, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(60)
	PROP_Flags(MF_SPAWNCEILING|MF_NOGRAVITY)
END_DEFAULTS

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

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

//========== Heretic Decoration: just a skull on a rope.

IMPLEMENT_ACTOR (ASkullHang45, Heretic, 25, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(45)
	PROP_Flags(MF_SPAWNCEILING|MF_NOGRAVITY)
END_DEFAULTS

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

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

//========== Heretic Decoration: just a skull on a short rope.

IMPLEMENT_ACTOR (ASkullHang35, Heretic, 26, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(35)
	PROP_Flags(MF_SPAWNCEILING|MF_NOGRAVITY)
END_DEFAULTS

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

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

//========== Heretic Decoration: a heavy iron chandelier carrying eight brown candles.

IMPLEMENT_ACTOR (AChandelier, Heretic, 28, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(60)
	PROP_Flags(MF_SPAWNCEILING|MF_NOGRAVITY)
END_DEFAULTS

FState AChandelier::States[3] =
{
	S_NORMAL1 (CHDL, 'A',  4, NULL, &States[1]),
	S_NORMAL1 (CHDL, 'B',  4, NULL, &States[2]),
	S_NORMAL1 (CHDL, 'C',  4, NULL, &States[0])
};

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

//========== Heretic Decoration: a tall iron torch with a green serpent coiled around it, topped by a silver-crowned goldskull.

IMPLEMENT_ACTOR (ASerpentTorch, Heretic, 27, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(12)
	PROP_HeightFixed(54)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

FState ASerpentTorch::States[3] =
{
	S_NORMAL1 (SRTC, 'A',  4, NULL, &States[1]),
	S_NORMAL1 (SRTC, 'B',  4, NULL, &States[2]),
	S_NORMAL1 (SRTC, 'C',  4, NULL, &States[0])
};

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

//========== Heretic Decoration: a small stone pillar with four sculpted demon faces (only one of which faces the player on the sprite). 

IMPLEMENT_ACTOR (ASmallPillar, Heretic, 29, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(16)
	PROP_HeightFixed(34)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

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

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

//========== Heretic Decoration: small stalagmite

IMPLEMENT_ACTOR (AStalagmiteSmall, Heretic, 37, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(8)
	PROP_HeightFixed(32)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

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

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

//========== Heretic Decoration: large stalagmite

IMPLEMENT_ACTOR (AStalagmiteLarge, Heretic, 38, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(12)
	PROP_HeightFixed(64)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

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

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

//========== Heretic Decoration: small stalactite

IMPLEMENT_ACTOR (AStalactiteSmall, Heretic, 39, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(8)
	PROP_HeightFixed(36)
	PROP_Flags(MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY)
END_DEFAULTS

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

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

//========== Heretic Decoration: large stalactite

IMPLEMENT_ACTOR (AStalactiteLarge, Heretic, 40, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(12)
	PROP_HeightFixed(68)
	PROP_Flags(MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY)
END_DEFAULTS

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

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

//========== Heretic Decoration: Fire Brazier

IMPLEMENT_ACTOR (AFireBrazier, Heretic, 76, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(16)
	PROP_HeightFixed(44)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

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

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

//========== Heretic Decoration: a wooden barrel from Heretic, slightly more massive-looking than Hexen's own wooden barrel.

IMPLEMENT_ACTOR (ABarrel, Heretic, 44, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(12)
	PROP_HeightFixed(32)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

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

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

//========== Heretic Decoration: Brown pillar

IMPLEMENT_ACTOR (ABrownPillar, Heretic, 47, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(14)
	PROP_HeightFixed(128)
	PROP_Flags(MF_SOLID)
END_DEFAULTS

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

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

//========== Heretic Decoration: Moss

IMPLEMENT_ACTOR (AMoss1, Heretic, 48, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(23)
	PROP_Flags(MF_SPAWNCEILING|MF_NOGRAVITY)
END_DEFAULTS

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

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

//========== Heretic Decoration: Moss

IMPLEMENT_ACTOR (AMoss2, Heretic, 49, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(20)
	PROP_HeightFixed(27)
	PROP_Flags(MF_SPAWNCEILING|MF_NOGRAVITY)
END_DEFAULTS

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

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

//========== Heretic Decoration: Wall-mounted torch

IMPLEMENT_ACTOR (AWallTorch, Heretic, 50, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(6)
	PROP_HeightFixed(16)
	PROP_Flags(MF_NOGRAVITY)
	PROP_Flags4(MF4_FIXMAPTHINGPOS)
END_DEFAULTS

FState AWallTorch::States[3] =
{
	S_BRIGHT (WTRH, 'A',  6, NULL, &States[1]),
	S_BRIGHT (WTRH, 'B',  6, NULL, &States[2]),
	S_BRIGHT (WTRH, 'C',  6, NULL, &States[0])
};

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

//========== Heretic Decoration: Hanging corpse

IMPLEMENT_ACTOR (AHangingCorpse, Heretic, 51, 0)
	PROP_SpawnState(0)
	PROP_RadiusFixed(8)
	PROP_HeightFixed(104)
	PROP_Flags(MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY)
END_DEFAULTS

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

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

//==========  Egg

IMPLEMENT_ACTOR(AEggFX, Heretic, -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_EGGFXI1)
END_DEFAULTS

FState AEggFX::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_EGGFXI1 (S_EGGFX+5)
	S_BRIGHT (FX01, 'E',	3, NULL, &States[S_EGGFXI1+1]),
	S_BRIGHT (FX01, 'F',	3, NULL, &States[S_EGGFXI1+2]),
	S_BRIGHT (FX01, 'G',	3, NULL, &States[S_EGGFXI1+3]),
	S_BRIGHT (FX01, 'H',	3, NULL, NULL),
};

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

//==========  Morph Ovum

IMPLEMENT_ACTOR (AArtiEgg, Heretic, 30, 14)
	PROP_Flags(MF_SPECIAL|MF_COUNTITEM)
	PROP_Flags2(MF2_FLOATBOB)
	PROP_SpawnState(0)
	PROP_PickupSound("misc/p_pkup")
END_DEFAULTS

FState AArtiEgg::States[] =
{
	S_NORMAL1(EGGC, 'A',	6, NULL, &States[1]),
	S_NORMAL1(EGGC, 'B',	6, NULL, &States[2]),
	S_NORMAL1(EGGC, 'C',	6, NULL, &States[3]),
	S_NORMAL1(EGGC, 'B',	6, NULL, &States[0]),
};

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