
// Serpent ------------------------------------------------------------------

ACTOR Serpent
{
	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"

	action native A_SerpentHumpDecide();
	action native A_SerpentHide();
	action native A_SerpentCheckForAttack();
	action native A_SerpentSpawnGibs();
	action native A_SerpentUnHide();
	action native A_SerpentRaiseHump();
	action native A_SerpentLowerHump();
	action native A_SerpentChooseAttack();
	action native 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_PlaySoundEx("SerpentActive", "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_PlaySoundEx("SerpentBirth", "Voice")
		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 -----------------------------------------------------------

ACTOR SerpentLeader : Serpent
{
	Mass 200
	Obituary "$OB_SERPENT"
	States
	{
	Missile:
		SSPT N 5 A_CustomMissile("SerpentFX", 32, 0)
		Goto Dive
	}
}

// Serpent Missile Ball -----------------------------------------------------

ACTOR SerpentFX
{
	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_PlaySoundEx("SerpentFXContinuous", "Body", 1)
		SSFX BAB 3 Bright
		Goto Spawn+1
	Death:
		SSFX C 4 Bright A_StopSoundEx("Body")
		SSFX DEFGH 4 Bright
		Stop
	}
}

// Serpent Head -------------------------------------------------------------

ACTOR SerpentHead
{
	Radius 5
	Height 10
	Gravity 0.125
	+NOBLOCKMAP

	action native A_SerpentHeadCheck();

	States
	{
	Spawn:
		SSXD IJKLMNOP 4 A_SerpentHeadCheck
		Loop
	Death:
		SSXD S -1
		Loop
	}
}

// Serpent Gib 1 ------------------------------------------------------------

ACTOR SerpentGib1
{
	Radius 3
	Height 3
	+NOBLOCKMAP +NOGRAVITY

	action native A_FloatGib();
	action native A_DelayGib();
	action native 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 ------------------------------------------------------------

ACTOR 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 ------------------------------------------------------------

ACTOR 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
	}
}
