|
------------------------------------------------------------------------ //========== 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]), }; ------------------------------------------------------------------------