// Serpent ------------------------------------------------------------------ class Serpent : Actor { Default { Health 90; PainChance 96; Speed 12; Radius 32; Height 70; Mass 0x7fffffff; Monster; -SHOOTABLE +NOBLOOD +CANTLEAVEFLOORPIC +NONSHOOTABLE +STAYMORPHED +DONTBLAST +NOTELEOTHER +INVISIBLE SeeSound "SerpentSight"; AttackSound "SerpentAttack"; PainSound "SerpentPain"; DeathSound "SerpentDeath"; HitObituary "$OB_SERPENTHIT"; } native void A_SerpentHumpDecide(); native void A_SerpentHide(); native void A_SerpentCheckForAttack(); native void A_SerpentSpawnGibs(); native void A_SerpentUnHide(); native void A_SerpentRaiseHump(); native void A_SerpentLowerHump(); native void A_SerpentChooseAttack(); native void A_SerpentMeleeAttack(); States { Spawn: SSPT H 10 A_Look; Loop; See: SSPT HH 1 A_Chase("Melee", "None", CHF_NIGHTMAREFAST|CHF_NOPLAYACTIVE); SSPT H 2 A_SerpentHumpDecide; Loop; Pain: SSPT L 5; SSPT L 5 A_Pain; Dive: SSDV ABC 4; SSDV D 4 A_UnSetShootable; SSDV E 3 A_PlaySound("SerpentActive", CHAN_BODY); SSDV F 3; SSDV GH 4; SSDV I 3; SSDV J 3 A_SerpentHide; Goto See; Melee: SSPT A 1 A_UnHideThing; SSPT A 1 A_PlaySound("SerpentBirth", CHAN_BODY); SSPT B 3 A_SetShootable; SSPT C 3; SSPT D 4 A_SerpentCheckForAttack; Goto Dive; Death: SSPT O 4; SSPT P 4 A_Scream; SSPT Q 4 A_NoBlocking; SSPT RSTUVWXYZ 4; Stop; XDeath: SSXD A 4; SSXD B 4 A_SpawnItemEx("SerpentHead", 0, 0, 45); SSXD C 4 A_NoBlocking; SSXD DE 4; SSXD FG 3; SSXD H 3 A_SerpentSpawnGibs; Stop; Ice: SSPT [ 5 A_FreezeDeath; SSPT [ 1 A_FreezeDeathChunks; Wait; Walk: SSPT IJI 5 A_Chase("Attack", "None", CHF_NIGHTMAREFAST); SSPT J 5 A_SerpentCheckForAttack; Goto Dive; Hump: SSPT H 3 A_SerpentUnHide; SSPT EFGEF 3 A_SerpentRaiseHump; SSPT GEF 3; SSPT GEFGE 3 A_SerpentLowerHump; SSPT F 3 A_SerpentHide; Goto See; Attack: SSPT K 6 A_FaceTarget; SSPT L 5 A_SerpentChooseAttack; Goto MeleeAttack; MeleeAttack: SSPT N 5 A_SerpentMeleeAttack; Goto Dive; } } // Serpent Leader ----------------------------------------------------------- class SerpentLeader : Serpent { Default { Mass 200; Obituary "$OB_SERPENT"; } States { Missile: SSPT N 5 A_CustomMissile("SerpentFX", 32, 0); Goto Dive; } } // Serpent Missile Ball ----------------------------------------------------- class SerpentFX : Actor { Default { Speed 15; Radius 8; Height 10; Damage 4; Projectile; -ACTIVATEIMPACT -ACTIVATEPCROSS RenderStyle "Add"; DeathSound "SerpentFXHit"; } States { Spawn: SSFX A 0; SSFX A 3 Bright A_PlaySound("SerpentFXContinuous", CHAN_BODY, 1.0, 1); SSFX BAB 3 Bright; Goto Spawn+1; Death: SSFX C 4 Bright A_StopSound(CHAN_BODY); SSFX DEFGH 4 Bright; Stop; } } // Serpent Head ------------------------------------------------------------- class SerpentHead : Actor { Default { Radius 5; Height 10; Gravity 0.125; +NOBLOCKMAP } native void A_SerpentHeadCheck(); States { Spawn: SSXD IJKLMNOP 4 A_SerpentHeadCheck; Loop; Death: SSXD S -1; Loop; } } // Serpent Gib 1 ------------------------------------------------------------ class SerpentGib1 : Actor { Default { Radius 3; Height 3; +NOBLOCKMAP +NOGRAVITY } native void A_FloatGib(); native void A_DelayGib(); native void A_SinkGib(); States { Spawn: SSXD Q 6; SSXD Q 6 A_FloatGib; SSXD QQ 8 A_FloatGib; SSXD QQ 12 A_FloatGib; SSXD Q 232 A_DelayGib; SSXD QQ 12 A_SinkGib; SSXD QQQ 8 A_SinkGib; Stop; } } // Serpent Gib 2 ------------------------------------------------------------ class SerpentGib2 : SerpentGib1 { States { Spawn: SSXD R 6; SSXD R 6 A_FloatGib; SSXD RR 8 A_FloatGib; SSXD RR 12 A_FloatGib; SSXD R 232 A_DelayGib; SSXD RR 12 A_SinkGib; SSXD RRR 8 A_SinkGib; Stop; } } // Serpent Gib 3 ------------------------------------------------------------ class SerpentGib3 : SerpentGib1 { States { Spawn: SSXD T 6; SSXD T 6 A_FloatGib; SSXD TT 8 A_FloatGib; SSXD TT 12 A_FloatGib; SSXD T 232 A_DelayGib; SSXD TT 12 A_SinkGib; SSXD TTT 8 A_SinkGib; Stop; } }