actor ZTBloodPool
{
    var int user_growth;
    
    radius 1
    height 0
    mass 1
    scale 0.02
    +NOTELEPORT
    +NOBLOCKMAP
    +CLIENTSIDEONLY    
    +MOVEWITHSECTOR
	+CANPASS
    -FLOORCLIP
    +MISSILE
    -DONTSPLASH
    states
    {
        Spawn:
            TNT1 A 0 A_JumpIf(waterlevel > 1, "Vanish") 			
		ChooseSprite:
			BLPL A 0 A_Jump(128,3)
			"####" B 0 A_Jump(128,2)
			"####" C 0 
			"####" "#" 0
            Goto Death            
        Vanish:
            TNT1 A 1
            Stop
        
        Death:
        Crash:
            "####" "#" 0 A_JumpIf(user_growth >= 45, "Lay")
            "####" "#" 0 A_JumpIf(user_growth >= 40, "Grow4")
            "####" "#" 0 A_JumpIf(user_growth >= 30, "Grow3")
            "####" "#" 0 A_JumpIf(user_growth >= 20, "Grow2")
            "####" "#" 0 A_JumpIf(user_growth >= 10, "Grow1")
            Goto Grow0
            
        Grow0:
            "####" "#" 0 A_SetScale(scalex + 0.02)
            Goto Grown
        Grow1:
            "####" "#" 0 A_SetScale(scalex + 0.015)
            Goto Grown
        Grow2:
            "####" "#" 0 A_SetScale(scalex + 0.0125)
            Goto Grown
        Grow3:
            "####" "#" 1 A_SetScale(scalex + 0.01)
            Goto Grown
        Grow4:
            "####" "#" 2 A_SetScale(scalex + 0.005)
            Goto Grown
            
        Lay:
            "####" "#" 300
            "####" "#" 0 A_CheckSight("Vanish")
            Loop
            
        Grown:
            "####" "#" 2 A_SetUserVar("user_growth", user_growth+1)
            Goto Death
    }
} 

//--==--==--==--==--==--==--==--==--==--==--==--==--==
// Z O M B I E   G I B B E R
// All zombies inherit from this class
//--==--==--==--==--==--==--==--==--==--==--==--==--==

ACTOR ZombieGibber
{
	+NOBLOCKMAP
	+CLIENTSIDEONLY
	+NOGRAVITY
	Radius 2
	Height 2
	Gravity 1.1
	States
	{
		// Spawn
		// This plays the sound
		Spawn:
			TNT1 A 0
			TNT1 A 0 ACS_NamedExecuteAlways("RadialBlood", 0, x, y, z)
			TNT1 A 0 A_PlaySoundEx("gore/obliterate","Body")
			TNT1 A 0 A_Jump(256,"BloodCore")
			TNT1 AAAAAA 0 A_SpawnItemEx("FloorGibLeaver",random(-3,3),random(-3,3),random(-3,3),random(-10,10),random(-10,10),random(5,25))
			Goto BloodCore
		
		// BloodCore
		// If your zombie has different blood, this should be overridden
		BloodCore:
			TNT1 AAAA 0 A_SpawnItemEx("ZombieScouter",random(-16,16),random(-16,16),0,random(-4,4),random(-4,4),random(16,18))
			TNT1 AA 0 A_SpawnItemEx("ZombieScouter",random(-16,16),random(-16,16),0,random(-4,4),random(-4,4),random(-4,4))
			TNT1 A 0 A_SpawnItemEx("BloodSpurtRed",0,0,0)
			TNT1 A 0 A_SpawnItemEx("HeadshotBloodExplode",0,0,0)
			TNT1 A -1 A_Jump(256, "BloodEssentials")
			Wait
			
		// BloodEssentials
		// Ribcage, intestines, etc.
		// Organs that all living things should share
		BloodEssentials:
			TNT1 AA 0 A_CustomMissile ("Guts_Intestines", 0, 0, random(0,359), 2, random(40,50))
			TNT1 A 0 A_CustomMissile ("Guts_Ribcage", 0, 0, random(0,359), 2, random(40,50))
			TNT1 A -1 A_Jump(256, "BloodArms")
			Wait
			
		// BloodArms
		// Controls our arms
		BloodArms:
			TNT1 A 0 A_CustomMissile ("ZombieArm", 0, 0, 90, 2, random(40,50))
			TNT1 A 0 A_CustomMissile ("ZombieArm", 0, 0, 270, 2, random(40,50))
			TNT1 A -1 A_Jump(256, "BloodHead")
			Wait
			
		// BloodHead
		// Spawns a head
		// Nullify this state if there is no head, or general gibs
		BloodHead:
			TNT1 A 0 A_SpawnItemEx("ZombieHead", 0, 0, 0, random(1,2), 0, random(4, 10), random(0,360))
			Stop
	}
}

ACTOR GibChunkSpawner : ZombieGibber {}

//--==--==--==--==--==--==--==--==--==--==--==--==--==
// Z O M B I E   G U T
// All chunks should inherit from this
//--==--==--==--==--==--==--==--==--==--==--==--==--==
ACTOR ZombieGut
{
	Radius 2
	Height 4
	Gravity 0.7
	Speed 10
	Decal BrutalBloodSplat
	+NOTELEPORT
	+CANNOTPUSH
	+THRUACTORS
	+NOBLOCKMONST
	-NOGRAVITY
	+CLIENTSIDEONLY
	States
	{
		// Spawn
		// Don't touch this
		Spawn:
			TNT1 A 0
			TNT1 A 0 A_Jump(256, "SetSprite")
			Goto SetSprite
			
		// SetSprite
		// Set the visual sprite, override this!
		SetSprite:
			HED1 A 0
			HED1 A 0 A_Jump(256, "Main")
			Goto Main
			
		// Main
		// Flying through the air
		Main:
			"####" A 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
			"####" A 1 A_CheckFloor("Hit")
			"####" A 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
			"####" A 1 A_CheckFloor("Hit")
			
			"####" B 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
			"####" B 1 A_CheckFloor("Hit")
			"####" B 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
			"####" B 1 A_CheckFloor("Hit")
			
			"####" B 0 A_SpawnItemEx("ZTDecalLeaver",0,0,0,momx*1.1)
			
			"####" C 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
			"####" C 1 A_CheckFloor("Hit")
			"####" C 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
			"####" C 1 A_CheckFloor("Hit")
			
			"####" D 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
			"####" D 1 A_CheckFloor("Hit")
			"####" D 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
			"####" D 1 A_CheckFloor("Hit")
			
			"####" D 0 A_SpawnItemEx("ZTDecalLeaver",0,0,0,momx*1.1)

			"####" E 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
			"####" E 1 A_CheckFloor("Hit")
			"####" E 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
			"####" E 1 A_CheckFloor("Hit")
			
			"####" F 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
			"####" F 1 A_CheckFloor("Hit")
			"####" F 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
			"####" F 1 A_CheckFloor("Hit")
			
			"####" F 0 A_SpawnItemEx("ZTDecalLeaver",0,0,0,momx*1.1)
			
			"####" G 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
			"####" G 1 A_CheckFloor("Hit")
			"####" G 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
			"####" G 1 A_CheckFloor("Hit")
			
			"####" H 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
			"####" H 1 A_CheckFloor("Hit")
			"####" H 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
			"####" H 1 A_CheckFloor("Hit")
			
			"####" H 0 A_SpawnItemEx("ZTDecalLeaver",0,0,0,momx*1.1)

			"####" I 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
			"####" I 1 A_CheckFloor("Hit")
			"####" I 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
			"####" I 1 A_CheckFloor("Hit")
			
			"####" J 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
			"####" J 1 A_CheckFloor("Hit")
			"####" J 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
			"####" J 1 A_CheckFloor("Hit")
			
			"####" J 0 A_SpawnItemEx("ZTDecalLeaver",0,0,0,momx*1.1)
			Loop
			
		// Hit
		// We hit the floor, or stopped moving
		Death:
		Hit:
			"####" A 0 A_ScaleVelocity(0.25)
			"####" A 0 A_SpawnItemEx("GibletPuddle",0,0,0)
			"####" A 0 A_PlaySound("gore/splat")
			"####" A 0 A_Jump(256, "SetRestSprite")
			Goto SetRestSprite
			
		// SetRestSprite
		// This sets our on-ground sprite
		SetRestSprite:
			"####" A 0
			"####" A 0 A_Jump(256, "Rest")
			Goto Rest
			
		// Rest
		// We are on the ground
		Rest:
			"####" "#" 300
			"####" "#" 0 A_CheckSight("Vanish")
			Loop
			
		// Vanish
		// Disappears
		Vanish:
			TNT1 A 1
			Stop
	}
}

ACTOR ZombieGut_Bloodless : ZombieGut
{
	States
	{
		// Main
		// Flying through the air
		Main:
			"####" AB 1 A_CheckFloor("Hit")
			"####" B 0 A_SpawnItemEx("ZTDecalLeaver",0,0,0,momx*1.1)
			
			"####" CD 1 A_CheckFloor("Hit")
			"####" D 0 A_SpawnItemEx("ZTDecalLeaver",0,0,0,momx*1.1)
			
			"####" EF 1 A_CheckFloor("Hit")
			"####" F 0 A_SpawnItemEx("ZTDecalLeaver",0,0,0,momx*1.1)
			
			"####" GH 1 A_CheckFloor("Hit")
			"####" H 0 A_SpawnItemEx("ZTDecalLeaver",0,0,0,momx*1.1)
			
			"####" IJ 1 A_CheckFloor("Hit")
			"####" J 0 A_SpawnItemEx("ZTDecalLeaver",0,0,0,momx*1.1)
			Loop
	}
}

//--==--==--==--==--==--==--==--==--==--==--==--==--==
// Z O M B I E   S C O U T E R
// Basically a piece of gore that aims to leave puddles
//--==--==--==--==--==--==--==--==--==--==--==--==--==
ACTOR ZombieScouter : ZombieGut
{
	+MISSILE
	Gravity 0.80
	States
	{
		SetSprite:
			SPGR A 0 A_Jump(128,"Main")
			SPGR B 0 A_Jump(128,"Main")
			SPGR C 0 A_Jump(128,"Main")
			SPGR D 0 A_Jump(128,"Main")
			Goto Main
			
		Death:
			"####" "#" 0 A_CheckCeiling("OnCeiling")
			"####" "#" 0 A_CheckFloor("OnFloor")
			"####" "#" 1
			Loop
			
		OnCeiling:
			"####" "#" 0 A_SpawnItemEx("PuddleCeiling",0,0,ceilingz-z)
			Stop
			
		OnFloor:
			"####" "#" 0 A_SpawnItemEx("GibletPuddle",0,0,0)
			Stop
	}
}

// Ceiling puddle
ACTOR PuddleCeiling
{
	+NOGRAVITY
	+CEILINGHUGGER
	+CLIENTSIDEONLY
	Height 2
	Scale 0.5
	States
	{
		Spawn:
			FGUT A 0
			FGUT A 0 A_Jump(64, "Vanish")
			FGUT A 0 A_SetScale(0.1 * random(4,5))
			FGUT E 0 A_Jump(128, "Looping")
			FGUT F 0 A_Jump(128, "Looping")
			FGUT G 0 A_Jump(128, "Looping")
			Goto Looping
			
		Vanish:
			TNT1 A 1
			Stop
			
		Looping:
			"####" "#" 0 A_Jump(256,"DripFast","DripMed","DripSlow")
			Goto DripFast
			
		DripFast:
			"####" "#######" 35 A_SpawnItemEx("ZTBloodDrop",0,0,-8)
			"####" "#" 0 A_CheckSight("Vanish")
			Loop
			
		DripMed:
			"####" "######" 45 A_SpawnItemEx("ZTBloodDrop",0,0,-8)
			"####" "#" 0 A_CheckSight("Vanish")
			Loop
			
		DripSlow:
			"####" "#####" 60 A_SpawnItemEx("ZTBloodDrop",0,0,-8)
			"####" "#" 0 A_CheckSight("Vanish")
			Loop
	}
}

//--==--==--==--==--==--==--==--==--==--==--==--==--==
// Z O M B I E   H E A D
// Skull or head, this can be inherited from
//--==--==--==--==--==--==--==--==--==--==--==--==--==
ACTOR ZombieHead : ZombieGut
{
	States
	{
		SetSprite:
			ZHED A 0
			Goto Main
			
		SetRestSprite:
			ZHED D 0
			ZHED D 0 A_Jump(128,"Rest")
			ZHED I 0
			Goto Super::Rest
	}
}
ACTOR Guts_ZombieHead : ZombieHead {}

//-- == -- == -- == -- == -- == -- == -- == -- == -- == -- == -- == 

ACTOR ZombieArm : ZombieGut
{
	Scale 0.5
	States
	{
		SetSprite:
			BZRM A 0
			Goto Main
			
		SetRestSprite:
			BZRM M 0
			BZRM M 0 A_Jump(128,"Rest")
			BZRM N 0
			Goto Super::Rest
	}
}

//-- == -- == -- == -- == -- == -- == -- == -- == -- == -- == -- == 

ACTOR GrowingBloodPuddle
{
	+THRUACTORS
	-SOLID
	+NOCLIP
	+MOVEWITHSECTOR
	+FLOORCLIP
	+CLIENTSIDEONLY
	Scale 1.0
	States
	{
		Spawn:
		    TNT1 A 0
			POOL A 0 A_SetAngle(random(0,360))
			TNT1 A 0 A_SetScale(0.25)
			POOL A 4 A_SetScale(0.25)
			POOL A 4 A_SetScale(0.30)
			POOL A 4 A_SetScale(0.35)
			POOL A 4 A_SetScale(0.40)
			POOL A 4 A_SetScale(0.45)
			POOL A 4 A_SetScale(0.50)
			POOL A 4 A_SetScale(0.55)
			POOL A 4 A_SetScale(0.60)
			POOL A 4 A_SetScale(0.65)
			POOL A 4 A_SetScale(0.70)
			POOL A 4 A_SetScale(0.75)
			POOL A 4 A_SetScale(0.80)
			POOL A 6 A_SetScale(0.82)
			POOL A 6 A_SetScale(0.84)
			POOL A 6 A_SetScale(0.86)
			POOL A 6 A_SetScale(0.88)
			POOL A 6 A_SetScale(0.90)
			POOL A 7 A_SetScale(0.91)
			POOL A 7 A_SetScale(0.92)
			POOL A 7 A_SetScale(0.93)
			POOL A 7 A_SetScale(0.94)
			POOL A 7 A_SetScale(0.95)
			POOL A 8 A_SetScale(0.96)
			POOL A 8 A_SetScale(0.97)
			POOL A 8 A_SetScale(0.98)
			POOL A 8 A_SetScale(0.99)
			POOL A 8 A_SetScale(1.00)
			POOL A 1000
			POOL AAAAAAAAAAAAAAAAAAAA 1 A_FadeOut(0.05)
		Stop
	}
}

ACTOR GibletPuddle : GrowingBloodPuddle
{
	Scale 1.0
	States
	{
		Spawn:
			FDRP A 0
			FDRP A 1 A_CheckFloor("OnFloor")
			Loop
		OnFloor:
			POOL A 0 A_SetScale(0.1 * random(6,8))
			POOL A 0 A_SetAngle(random(0,360))
		Laid:
			POOL A 300
			POOL A 0 A_CheckSight("Vanish")
			Loop
		Vanish:
			TNT1 A 1
			Stop
	}
}

ACTOR GibletPuddleSmall : GibletPuddle
{
	States
	{
		OnFloor:
			POOL A 0 A_SetScale(0.1 * random(2,3))
			Goto Super::OnFloor+1
	}
}

ACTOR GibletPuddleTiny : GibletPuddle
{
	Scale 1.0
	States
	{
		Spawn:
		FDRP A 0
		FDRP A 1 A_CheckFloor("OnFloor")
		Loop
		OnFloor:
		POOL A 0 A_SetScale(0.4)
		POOL A 0 A_SetAngle(random(0,360))
		POOL A 200
		POOL AAAAAAAAAAAAAAAAAAAA 1 A_FadeOut(0.05)
		Stop
	}
}

ACTOR ZTBloodDrop
{
	+CLIENTSIDEONLY
	-SOLID
	+THRUACTORS
	Scale 0.80
	States
	{
	Spawn:
	FDRP A 0
	FDRP A 1 A_CheckFloor("Drip")
	Loop
	
	Drip:
	FDRP A 0 A_PlaySoundEx("blood/drip","Body")
	FDRP A 0
	Stop
	}
}

//-- == -- == -- == -- == -- == -- == -- == -- == -- == -- == -- == 

// MAIN BLOOD SPAWNER!
// This is used for headshot detection
ACTOR NewBloodSpawner replaces Blood
{
	+NOBLOCKMAP
	+PUFFGETSOWNER
	States
	{
		Spawn:
			TNT1 A 0
			TNT1 A 0 ACS_NamedExecuteAlways("Script_Blood", 0, z)
			TNT1 AA 0 A_SpawnItemEx("NewBloodParticle",random(-3,3),random(-3,3),random(-3,3),random(-5,5),random(-5,5),random(3,5))
			TNT1 A 4
			Stop
	}
}

// Fancy
ACTOR NewBloodParticle
{
	Radius 2
	Height 2
	Projectile
	-NOGRAVITY
	+THRUACTORS
	-SOLID
	+CLIENTSIDEONLY
	+MOVEWITHSECTOR
	Decal BrutalBloodSplat
	States
	{
		Spawn:
			TNT1 A 0
			TNT1 A 0 A_Jump(255,"Blood1","Blood2","Blood3","Blood4")
			Goto Blood1
		Blood1:
			NBLD A 0
			Goto Bloody
		Blood2:
			NBLD B 0
			Goto Bloody
		Blood3:
			NBLD C 0
			Goto Bloody
		Blood4:
			NBLD D 0
			Goto Bloody
		
		Bloody:
			"####" "###" 2 A_SpawnItemEx("ZTDecalLeaver",0,0,0,momx*1.1)
			"####" "#" 1 A_SetScale(0.9)
			"####" "#" 1 A_SetScale(0.8)
			"####" "#" 0 A_SpawnItemEx("ZTDecalLeaver",0,0,0,momx*1.1)
			"####" "#" 1 A_SetScale(0.7)
			"####" "#" 1 A_SetScale(0.6)
			"####" "#" 0 A_SpawnItemEx("ZTDecalLeaver",0,0,0,momx*1.1)
			"####" "#" 1 A_SetScale(0.5)
			"####" "#" 1 A_SetScale(0.4)
			"####" "#" 0 A_SpawnItemEx("ZTDecalLeaver",0,0,0,momx*1.1)
			"####" "#" 1 A_SetScale(0.3)
			"####" "#" 1 A_SetScale(0.2)
			"####" "#" 0 A_SpawnItemEx("ZTDecalLeaver",0,0,0,momx*1.1)
			"####" "#" 1 A_SetScale(0.1)
			Stop
	}
}

//-- == -- == -- == -- == -- == -- == -- == -- == -- == -- == -- == 

ACTOR HeadChunkFX : ZTFX
{
	scale 0.5
	Alpha 0.80
	States
	{
		Spawn:
		BLHT ABCDEFGHIJ 1
		Stop
	}
}

// IMPORTANT HEADSHOT EFFECTS, DO NOT REMOVE
ACTOR HeadChunkSpawner
{
	+NOBLOCKMAP
	+CLIENTSIDEONLY
	+NOGRAVITY
	States
	{
		Spawn:
			TNT1 A 1
			TNT1 A 0 A_JumpIf(ACS_NamedExecuteWithResult("HeadAvailable",0), 1)
			Stop
			TNT1 A 0 A_SpawnItemEx("HeadChunkFX",0,0,0)
			TNT1 A 0 A_PlaySoundEx("gore/juicy","SoundSlot5")
			TNT1 A 0 A_PlaySoundEx("skull/hit","Body")
			TNT1 A 0 A_SpawnItemEx("HeadshotBloodExplode",0,0,0)
			TNT1 A 0 A_CustomMissile ("Head_Jaw", 0, 0, random(0,180), 2, random(40,50))
			TNT1 A 0 A_CustomMissile ("Head_Jaw", 0, 0, random(180,359), 2, random(40,50))
			
			TNT1 A 0 A_SpawnItemEx("Head_Brain",random(-8,8),-8,0,random(-3,3),random(-4,-3),random(4,5))
			TNT1 A 0 A_SpawnItemEx("Head_Brain",random(-8,8),8,0,random(-3,3),random(3,4),random(4,5))
			
			TNT1 A 0 A_SpawnItemEx("Head_Chunky",random(-8,8),-8,0,random(-2,2),-2,random(1,2))
			TNT1 A 0 A_SpawnItemEx("Head_Chunky",random(-8,8),8,0,random(-2,2),2,random(1,2))
			// TNT1 A 0 A_CustomMissile ("Head_Chunky", 0, 0, random(0,180), 2, random(60,70))
			// TNT1 A 0 A_CustomMissile ("Head_Chunky", 0, 0, random(180,359), 2, random(60,70))
			TNT1 A -1 A_Jump(256, "Eye")
			Wait
			
		// 50% chance of spawning eyes
		// These wouldn't always pop out of your skull
		Eye:
			TNT1 A 0 A_Jump(128,1)
			Stop
			TNT1 AA 0 A_CustomMissile ("Head_Eye", 0, 0, random(0,359), 2, random(50,60))
			Stop
	}
}

ACTOR HeadChunkSpawner_Eyeless : HeadChunkSpawner
{
	States
	{
		Eye:
			TNT1 A 1
			Stop
	}
}

ACTOR FloorGibLeaver
{
	BounceType "Doom"
	BounceFactor 0.2
	WallBounceFactor 0.2
	BounceSound "gore/splat"
	Radius 2
	Height 2
	Projectile
	-NOGRAVITY
	-SOLID
	+CLIENTSIDEONLY
	+MOVEWITHSECTOR
	+MISSILE
	Decal BrutalBloodSplat
	States
	{
	Spawn:
	BRTL A 0 A_CheckCeiling("TouchCeiling")
	BRTL A 1 A_SpawnItemEx("QuakeBloodPuffSmall",0,0,0)
	BRTL A 0 A_CheckCeiling("TouchCeiling")
	BRTL B 1 A_SpawnItemEx("QuakeBloodPuffSmall",0,0,0)
	BRTL A 0 A_CheckCeiling("TouchCeiling")
	BRTL D 1 A_SpawnItemEx("QuakeBloodPuffSmall",0,0,0)
	BLUD B 0 A_SpawnItemEx("ZTDecalLeaver",0,0,0,momx*1.1)
	Loop
	Death:
	SPGR A 0 A_Jump(255,"Ground1","Ground2","Ground3","Ground4")
	Goto Ground1
	
	Ground1:
	SPGR A 0 A_SpawnItemEx("GibletPuddle",0,0,0)
	FGUT AAA 300
	FGUT AAAAAAAAAA 1 A_FadeOut(0.1)
	Stop
	
	Ground2:
	SPGR A 0 A_SpawnItemEx("GibletPuddle",0,0,0)
	FGUT BBB 300
	FGUT BBBBBBBBBB 1 A_FadeOut(0.1)
	Stop
	
	Ground3:
	SPGR A 0 A_SpawnItemEx("GibletPuddle",0,0,0)
	FGUT CCC 300
	FGUT CCCCCCCCCC 1 A_FadeOut(0.1)
	Stop
	
	Ground4:
	SPGR A 0 A_SpawnItemEx("GibletPuddle",0,0,0)
	FGUT DDD 300
	FGUT DDDDDDDDDD 1 A_FadeOut(0.1)
	Stop
	
	// CEILING //
	TouchCeiling:
	TNT1 A 0 A_Stop
	TNT1 A 0 A_NoGravity
	TNT1 A 0 A_ChangeFlag("SPAWNCEILING",true)
	TNT1 A 0 A_Jump(255,"Ceiling1","Ceiling2")
	Goto Ceiling1
	
	Ceiling1:
	FGUT EEEEEEEEEEEEEEEEEEEEEEEEEEEEEE 30 A_SpawnItemEx("ZTBloodDrop",0,0,0)
	FGUT EEEEEEEEEE 1 A_FadeOut(0.1)
	Stop
	
	Ceiling2:
	FGUT FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 30 A_SpawnItemEx("ZTBloodDrop",0,0,0)
	FGUT FFFFFFFFFF 1 A_FadeOut(0.1)
	Stop
	
	Ceiling3:
	FGUT GGGGGGGGGGGGGGGGGGGGGGGGGGGGGG 30 A_SpawnItemEx("ZTBloodDrop",0,0,0)
	FGUT GGGGGGGGGG 1 A_FadeOut(0.1)
	Stop
	
	}
}

ACTOR QuakeBloodPuff
{
	+NOBLOCKMAP
	+NOCLIP
	+CLIENTSIDEONLY
	-SOLID
	Gravity 0.75
	Scale 0.6
	States
	{
	Spawn:
	TNT1 A 0
	TNT1 A 0 A_Jump(255,"Bloody1","Bloody2","Bloody3")
	Goto Bloody1
	
	Bloody1:
	QBLD AAAAAAAAAA 1 A_FadeOut(0.1)
	Stop
	
	Bloody2:
	QBLD BBBBBBBBBB 1 A_FadeOut(0.1)
	Stop
	
	Bloody3:
	QBLD CCCCCCCCCC 1 A_FadeOut(0.1)
	Stop
	}
}

ACTOR QuakeBloodPuffHuge : QuakeBloodPuff
{
	Scale 1.0
}

ACTOR QuakeBloodPuffMed : QuakeBloodPuff
{
	Scale 0.4
}

ACTOR QuakeBloodPuffSmall : QuakeBloodPuff
{
	Scale 0.25
}

ACTOR ZTDecalLeaver
{
	Projectile
	+NOGRAVITY
	Speed 20
	-SOLID
	+MISSILE
	+CLIENTSIDEONLY
	Decal BrutalBloodSplat
	Scale 2
	States
	{
	Spawn:
	TNT1 A 15
	Goto Death
	
	Death:
	TNT1 A 1
	Stop
	}
}

//===================================================
// SPLIT SPAWNER
//===================================================

ACTOR GibSpawn_Splitter
{
	+CLIENTSIDEONLY
	+NOBLOCKMAP
	-SOLID
	+THRUACTORS
	States
	{
	Spawn:
	TNT1 A 0
	// Play sound here
	TNT1 AA 0 A_SpawnItemEx("Giblet_Small1",random(-2,2),random(-2,2),random(-2,2),random(-10,10),random(-10,10),random(-2,2))
	TNT1 AA 0 A_SpawnItemEx("Giblet_Small2",random(-2,2),random(-2,2),random(-2,2),random(-10,10),random(-10,10),random(-2,2))
	TNT1 AA 0 A_SpawnItemEx("Giblet_Small3",random(-2,2),random(-2,2),random(-2,2),random(-10,10),random(-10,10),random(-2,2))
	Stop
	}
}

//===================================================
// SMALL BIT 1
//===================================================

ACTOR Giblet_Small1
{
	BounceType "Doom"
	BounceFactor 0.6
	WallBounceFactor 0.6
	BounceSound "gore/splat"
	Projectile
	-NOGRAVITY
	-SOLID
	+CLIENTSIDEONLY
	+MOVEWITHSECTOR
	+MISSILE
	Decal BrutalBloodSplat
	States
	{
	Spawn:
	SPGR AAAAA 1 A_SpawnItemEx("QuakeBloodPuffSmall",0,0,0)
	BLUD B 0 A_SpawnItemEx("ZTDecalLeaver",0,0,0,momx*1.1)
	Loop
	Death:
	SPGR A 0 A_SpawnItemEx("GibletPuddle",0,0,0)
	SPGR AAA 300
	Stop
	}
}

//===================================================
// SMALL BIT 2
//===================================================

ACTOR Giblet_Small2 : Giblet_Small1
{
	States
	{
	Spawn:
	SPGR BBBBB 1 A_SpawnItemEx("QuakeBloodPuffSmall",0,0,0)
	BLUD B 0 A_SpawnItemEx("ZTDecalLeaver",0,0,0,momx*1.1)
	Loop
	Death:
	SPGR A 0 A_SpawnItemEx("GibletPuddle",0,0,0)
	SPGR BBB 300
	Stop
	}
}

//===================================================
// SMALL BIT 3
//===================================================

ACTOR Giblet_Small3 : Giblet_Small1
{
	States
	{
	Spawn:
	SPGR CCCCC 1 A_SpawnItemEx("QuakeBloodPuffSmall",0,0,0)
	BLUD B 0 A_SpawnItemEx("ZTDecalLeaver",0,0,0,momx*1.1)
	Loop
	Death:
	SPGR A 0 A_SpawnItemEx("GibletPuddle",0,0,0)
	SPGR CCC 300
	Stop
	}
}

//===================================================
// TORSO: BASE ZOMBIE
//===================================================

ACTOR Torso_BaseZombie
{
	Gravity 0.85
	-NOGRAVITY
	+THRUACTORS
	+CLIENTSIDEONLY
	-SOLID
	States
	{
		Spawn:
		TNT1 A 0
		TNT1 A 0 A_JumpIf(momz < 0,"StartFall")
		BZSP A 1
		Loop
		
		StartFall:
		BZSP BC 2
		Goto Falling
		
		Falling:
		BZSP C 1 A_CheckFloor("Fell")
		Loop
		
		Fell:
		SPGR A 0 A_SpawnItemEx("GibletPuddle",0,0,0)
		BZSP D 0 A_PlaySoundEx("quake/gibsplat","Body")
		BZSP DDDDDDD 100
		BZSP DDDDDDDDDD 1 A_FadeOut(0.1)
		Stop
	}
}

// Head was SLICED OFF
ACTOR DecapChunkSpawner : HeadChunkSpawner
{
	States
	{
	Spawn:
	TNT1 A 0
	TNT1 A 0 A_PlaySound("skull/hit")
	TNT1 A 0 A_SpawnItemEx("HeadshotBloodExplode",0,0,0)
	TNT1 A 0 A_CustomMissile ("ZombieHead", 10, 0, 270, 2, random(40,90))
	Stop
	}
}

ACTOR HeadshotBloodExplode
{
	+NOBLOCKMAP
	+NOGRAVITY
	+CLIENTSIDEONLY
	States
	{
	Spawn:
	BLBD ABCDE 1
	stop
	}
}

// This is a sticky brain
ACTOR Head_Brain : ZombieGut
{
	+MISSILE
	-NOGRAVITY
	Scale 0.10
	Speed 15
	Decal Brains
	States
	{
		Spawn:
			TNT1 A 0
			TNT1 A 0 A_Jump(128,1)
			Goto Super::Spawn
			TNT1 A 1
			Stop
		SetSprite:
			BRAN A 0 A_SetScale(0.1 * random(3,4))
			Goto Main
			
		SetRestSprite:
			BRAN A 0
			BRAN A 0 A_Jump(128,"Rest")
			BRAN M 0
			BRAN M 0 A_Jump(128,"Rest")
			BRAN N 0
			Goto Super::Rest
			
		Death:
		Hit:
			"####" A 4
			"####" A 0 A_ScaleVelocity(0.25)
			"####" A 0 A_SpawnItemEx("GibletPuddleSmall",0,0,0)
			"####" A 0 A_PlaySound("gore/splat")
			"####" A 0 A_Jump(256, "SetRestSprite")
			Goto SetRestSprite
	}
}

// Eyes are small and bounce around a lot
// Pretty cool, huh
ACTOR Head_Eye : ZombieGut
{
	+MISSILE
	+DOOMBOUNCE
	BounceFactor 0.70
	WallBounceFactor 0.40
	-NOGRAVITY
	Scale 0.10
	Speed 5
	States
	{
		SetSprite:
			EYEB A 0
			Goto Main
			
		Hit:
		Main:
			"####" ABCDEFGHIJKL 1
			Loop
			
		SetRestSprite:
			EYEB M 0
			EYEB M 0 A_Jump(128,"Rest")
			EYEB N 0
			Goto Super::Rest
			
		Death:
			"####" A 0 A_ScaleVelocity(0.25)
			"####" A 0 A_Jump(256, "SetRestSprite")
			Goto SetRestSprite
	}
}

ACTOR Head_Jaw : Head_Eye
{
	BounceFactor 0.40
	WallBounceFactor 0.30
	Scale 0.32
	States
	{
		SetSprite:
			JAWB A 0
			Goto Super::Main
			
		SetRestSprite:
			JAWB M 0
			JAWB M 0 A_Jump(128,"Rest")
			JAWB A 0
			Goto Super::Rest
	}
}

ACTOR Head_Chunky : Head_Eye
{
	BounceFactor 0.60
	WallBounceFactor 0.30
	Scale 0.45
	Speed 2
	Gravity 0.90
	States
	{
		SetSprite:
			HEDY A 0
			Goto Super::Main
			
		SetRestSprite:
			HEDY M 0
			HEDY M 0 A_Jump(128,"Rest")
			HEDY A 0
			Goto Super::Rest
	}
}

ACTOR Head_JawBone : Head_Eye
{
  Scale 0.75
  States
  {
  Spawn:
    HED1 A 0
	BRIB AABBCCDD 1 A_CheckFloor("Hit")
    Goto Spawn+1
  Death:
  Hit:
    //FBLD E 0 A_PlaySound("gore/splat")
    BRIB Q 200 A_Stop
	BRIB QQQQQQQQQQ 2 A_FadeOut(0.1)
    Stop
  }
}

ACTOR Guts_Intestines : Head_Eye
{
  Scale 0.85
  Speed 8
  States
  {
  Spawn:
    HED1 A 0
	HED1 A 0 A_SpawnItemEx("BloodTrailMed",0,0,0)
	XME4 A 1 A_CheckFloor("Hit")
	HED1 A 0 A_SpawnItemEx("BloodTrailMed",0,0,0)
	XME4 A 1 A_CheckFloor("Hit")
	HED1 B 0 A_SpawnItemEx("BloodTrailMed",0,0,0)
	XME4  B 1 A_CheckFloor("Hit")
	HED1 B 0 A_SpawnItemEx("BloodTrailMed",0,0,0)
	BLUD B 0 A_SpawnItemEx("ZTDecalLeaver",0,0,0,momx*1.1)
	XME4  B 1 A_CheckFloor("Hit")
	HED1 C 0 A_SpawnItemEx("BloodTrailMed",0,0,0)
	XME4  C 1 A_CheckFloor("Hit")
	HED1 C 0 A_SpawnItemEx("BloodTrailMed",0,0,0)
	XME4  C 1 A_CheckFloor("Hit")
	HED1 D 0 A_SpawnItemEx("BloodTrailMed",0,0,0)
	XME4  D 1 A_CheckFloor("Hit")
	HED1 D 0 A_SpawnItemEx("BloodTrailMed",0,0,0)
	BLUD B 0 A_SpawnItemEx("ZTDecalLeaver",0,0,0,momx*1.1)
	XME4  D 1 A_CheckFloor("Hit")
    Goto Spawn+1
  Death:
  Hit:
	SPGR A 0 A_SpawnItemEx("GibletPuddle",0,0,0)
    FBLD E 0 A_PlaySound("gore/splat")
    XME4 E 200 A_ScaleVelocity(0.1)
	XME4 EEEEEEEEEE 2 A_FadeOut(0.1)
    Stop
  }
}

ACTOR Guts_Ribcage : ZombieGut
{
	Scale 0.40
	Speed 4
	States
	{
		SetSprite:
			XME5 A 0
			Goto Super::Main
		SetRestSprite:
			XME5 M 0
			Goto Super::Rest
	}
}

// FACEMAW HEAD
ACTOR Guts_FacemawHead : Head_Eye
{
  Radius 7
  Height 16
  Speed 8
  +THRUACTORS
  +MISSILE
  BounceType "Doom"
  BounceSound "gore/bone"
  BounceFactor 0.7
  BounceCount 999
  States
  {
  Spawn:
    HED1 A 0
	
	MHED ABC 1 A_SpawnItemEx("BloodTrailLong",0,0,0)
	MHED C 0 A_SpawnItemEx("ZTDecalLeaver",0,0,0,0)
	
	MHED DEF 1 A_SpawnItemEx("BloodTrailLong",0,0,0)
	MHED C 0 A_SpawnItemEx("ZTDecalLeaver",0,0,0,0)
	
	MHED GHI 1 A_SpawnItemEx("BloodTrailLong",0,0,0)
	MHED C 0 A_SpawnItemEx("ZTDecalLeaver",0,0,0,0)
	
	MHED JKL 1 A_SpawnItemEx("BloodTrailLong",0,0,0)
	MHED C 0 A_SpawnItemEx("ZTDecalLeaver",0,0,0,0)
	
	MHED MNO 1 A_SpawnItemEx("BloodTrailLong",0,0,0)
	MHED C 0 A_SpawnItemEx("ZTDecalLeaver",0,0,0,0)
	
	MHED PQR 1 A_SpawnItemEx("BloodTrailLong",0,0,0)
	MHED C 0 A_SpawnItemEx("ZTDecalLeaver",0,0,0,0)
	
	MHED STU 1 A_SpawnItemEx("BloodTrailLong",0,0,0)
	MHED C 0 A_SpawnItemEx("ZTDecalLeaver",0,0,0,0)
	
	MHED VWX 1 A_SpawnItemEx("BloodTrailLong",0,0,0)
	MHED C 0 A_SpawnItemEx("ZTDecalLeaver",0,0,0,0)
    Loop
  Death:
  Hit:
	TNT1 A 0 A_Stop
	SPGR A 0 A_SpawnItemEx("GibletPuddle",0,0,0)
    FBLD E 0 A_PlaySound("gore/splat")
    MHED Z 200 A_ScaleVelocity(0.1)
	MHED ZZZZZZZZZZ 2 A_FadeOut(0.1)
    Stop
  Vanish:
	TNT1 A 0
	Stop
  }
}

// BLOOD SPURT
Actor BloodSpurtRed
{
	+NOGRAVITY
	+NOBLOCKMAP
	+CLIENTSIDEONLY
	States
	{
		Spawn:
		BLHT ABCDEFGHIJ 1
		Stop
	}
}

ACTOR Guts_FacemawArm : ZombieGut
{
	Gravity 0.8
	Speed 5
	+MISSILE
	BounceType "Doom"
	BounceSound "gore/bone"
	BounceCount 999
	BounceFactor 0.3
	States
	{
		Spawn:
			AROT A 0
			AROA A 0 A_Jump(128,"ReverseIt")
		Spinning:
			AROT ABCDEFGHIJKL 2
			Loop
		ReverseIt:
			AROT LKJIHGFEDCBA 2
			Loop
		
		Death:
			TNT1 A 0 A_Jump(255,"Rest1","Rest2")
		Rest1:
			AROT F 200 A_ScaleVelocity(0.1)
			AROT FFFFFFFFFF 2 A_FadeOut(0.1)
			Stop
		
		Rest2:
			AROT L 200 A_ScaleVelocity(0.1)
			AROT LLLLLLLLLL 2 A_FadeOut(0.1)
			Stop
	}
}

ACTOR Guts_FacemawLeg : ZombieGut
{
	Gravity 0.8
	Speed 5
	States
	{
		Spawn:
			LROT A 0
			LROT A 0
			LROT ABCDEFGHIJKL 2 A_CheckFloor("Hit")
			Goto Spawn+2
		
		Rest1:
			LROT F 200 A_ScaleVelocity(0.1)
			LROT FFFFFFFFFF 2 A_FadeOut(0.1)
			Stop
		
		Rest2:
			LROT L 200 A_ScaleVelocity(0.1)
			LROT LLLLLLLLLL 2 A_FadeOut(0.1)
			Stop
	}
}

ACTOR BloodTrailSmall
{
	+NOBLOCKMAP
	+CLIENTSIDEONLY
	+NOGRAVITY
	Scale 0.15
	Decal BrutalBloodSplat
	Renderstyle Translucent
	Alpha 0.8
	States
	{
	Spawn:
	BLER G 0
	BLER GG 1 A_FadeOut(0.1)
	BLER G 0 A_SetScale(scalex+0.05)
	BLER HH 1 A_FadeOut(0.1)
	BLER G 0 A_SetScale(scalex+0.05)
	BLER II 1 A_FadeOut(0.1)
	BLER G 0 A_SetScale(scalex+0.05)
	BLER JJ 1 A_FadeOut(0.1)
	BLER J 0 A_Jump(32,"Drippy")
	Goto Ender
	
	Drippy:
	BLER J 0 A_SpawnItemEx("ZTBloodDrop",0,0,0)
	Goto Endy
	
	Endy:
	BLER G 0 A_SetScale(scalex+0.05)
	BLER JJ 2 A_FadeOut(0.1)
	stop
	}
}

ACTOR BloodTrailLong : BloodTrailSmall
{
	States
	{
	Spawn:
	BLER GGGGHHHHIIIIJJJJ 2 A_FadeOut(0.1)
	stop
	}
}

ACTOR BloodTrailMed : BloodTrailSmall
{
	Scale 0.25
}

//===========================================================
//
// EVISCERATORS
//
//===========================================================

ACTOR Guts_ChainHead : Head_Eye
{
  Scale 1.0
  States
  {
  Spawn:
    EROT A 0
	EROT A 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
	EROT A 1 A_CheckFloor("Hit")
	EROT A 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
	EROT A 1 A_CheckFloor("Hit")
	
	EROT B 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
	EROT B 1 A_CheckFloor("Hit")
	EROT B 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
	EROT B 0 A_SpawnItemEx("ZTDecalLeaver",0,0,0,momx*1.1)
	EROT B 1 A_CheckFloor("Hit")
	
	EROT C 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
	EROT C 1 A_CheckFloor("Hit")
	EROT C 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
	EROT C 1 A_CheckFloor("Hit")
	
	EROT D 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
	EROT D 1 A_CheckFloor("Hit")
	EROT D 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
	EROT D 0 A_SpawnItemEx("ZTDecalLeaver",0,0,0,momx*1.1)
	EROT D 1 A_CheckFloor("Hit")
	
	EROT E 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
	EROT E 1 A_CheckFloor("Hit")
	EROT E 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
	EROT E 1 A_CheckFloor("Hit")
	
	EROT F 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
	EROT F 1 A_CheckFloor("Hit")
	EROT F 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
	EROT F 0 A_SpawnItemEx("ZTDecalLeaver",0,0,0,momx*1.1)
	EROT F 1 A_CheckFloor("Hit")
	
	EROT G 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
	EROT G 1 A_CheckFloor("Hit")
	EROT G 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
	EROT G 1 A_CheckFloor("Hit")
	
	EROT H 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
	EROT H 1 A_CheckFloor("Hit")
	EROT H 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
	EROT H 0 A_SpawnItemEx("ZTDecalLeaver",0,0,0,momx*1.1)
	EROT H 1 A_CheckFloor("Hit")
	
	EROT I 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
	EROT I 1 A_CheckFloor("Hit")
	EROT I 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
	EROT I 1 A_CheckFloor("Hit")
	
	EROT J 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
	EROT J 1 A_CheckFloor("Hit")
	EROT J 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
	EROT J 0 A_SpawnItemEx("ZTDecalLeaver",0,0,0,momx*1.1)
	EROT J 1 A_CheckFloor("Hit")
	
	EROT K 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
	EROT K 1 A_CheckFloor("Hit")
	EROT K 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
	EROT K 1 A_CheckFloor("Hit")
	
	EROT L 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
	EROT L 1 A_CheckFloor("Hit")
	EROT L 0 A_SpawnItemEx("BloodTrailSmall",0,0,0)
	EROT L 0 A_SpawnItemEx("ZTDecalLeaver",0,0,0,momx*1.1)
	EROT L 1 A_CheckFloor("Hit")
    Goto Spawn+1
  Death:
  Hit:
    EROT L 0 A_PlaySound("gore/splat")
    EROT L 200 A_Stop
	EROT LLLLLLLLLL 2 A_FadeOut(0.1)
    Stop
  }
}