// YYYYYEEEEEEEEEEEEEEHAAAAAAWW!!!

freeslot("SPR_HAT9", "SPR2_FANG", "S_D94XKZ_FANG_STAND")

spr2defaults[SPR2_FANG] = SPR2_WAIT

states[S_D94XKZ_FANG_STAND] = {
	tics = 5,
	sprite = SPR_PLAY,
	frame = A|SPR2_FANG,
	nextstate = S_D94XKZ_FANG_STAND
}

addHook("MapLoad", function()
	for player in players.iterate
		player.d94xkzfangboss = nil
		player.d94xkzfangstandmenacingly = false
	end
end)

addHook("PlayerSpawn", function(player)
	player.d94xkzfangstandmenacingly = false
end)

addHook("PlayerThink", function(player)
	if player.mo and player.mo.valid
		if player.mo.skin == "dark"
		or player.mo.skin == "xkz"
			if player.d94xkzfangboss
				if leveltime < 4*TICRATE
					player.mo.state = S_D94XKZ_FANG_STAND
					player.panim = PA_IDLE
					player.powers[pw_nocontrol] = 2
				elseif player.mo.state == S_D94XKZ_FANG_STAND
					player.d94xkzfangstandmenacingly = false
					player.drawangle = $+ANGLE_180
					P_DoPlayerPain(player)
					player.powers[pw_flashing] = 0
				end
				local d94xkzhatz = player.mo.height
				if P_MobjFlip(player.mo) == -1
					d94xkzhatz = 0
				end
				if not (player.d94xkzhat and player.d94xkzhat.valid)
					local d94xkzhat = P_SpawnMobj(player.mo.x, player.mo.y, player.mo.z+d94xkzhatz, MT_THOK)
					d94xkzhat.target = player.mo
					d94xkzhat.tics = 2
					d94xkzhat.sprite = SPR_HAT9
					if player.mo.skin == "dark"
						d94xkzhat.spriteyoffset = 4
					else
						d94xkzhat.spriteyoffset = 0
					end
					d94xkzhat.frame = A
					d94xkzhat.angle = player.drawangle
					d94xkzhat.scale = player.mo.scale
					if player.mo.eflags & MFE_VERTICALFLIP
						d94xkzhat.eflags = $|MFE_VERTICALFLIP
					end
					if ((player.mo.state == S_PLAY_DEAD or player.mo.state == S_PLAY_DRWN) and player.playerstate != PST_LIVE)
					or player.mo.state == S_PLAY_PAIN
					or player.mo.state == S_D94XKZ_FALLEN
						if player.mo.state == S_PLAY_DEAD
							d94xkzhat.momz = player.mo.momz*2*P_MobjFlip(d94xkzhat)
							d94xkzhat.angle = leveltime*(ANG30)
							d94xkzhat.rollangle = leveltime*(ANG30-ANG10)
							d94xkzhat.flags = $ & ~MF_NOGRAVITY
						elseif player.mo.state == S_PLAY_DRWN
							d94xkzhat.angle = leveltime*(ANG10)
							d94xkzhat.rollangle = leveltime*(ANG10/2)
							d94xkzhat.flags = $|MF_NOGRAVITY
						elseif player.mo.state == S_PLAY_PAIN
							d94xkzhat.angle = leveltime*(ANG30)
							d94xkzhat.rollangle = leveltime*(ANG30-ANG10)
							P_TeleportMove(d94xkzhat, player.mo.x, player.mo.y, player.mo.z+d94xkzhatz)
							d94xkzhat.flags = $|MF_NOGRAVITY
							d94xkzhat.spriteyoffset = 8
						else
							d94xkzhat.angle = player.drawangle
							d94xkzhat.rollangle = 0
							P_TeleportMove(d94xkzhat, player.mo.x, player.mo.y, player.mo.z)
							d94xkzhat.flags = $|MF_NOGRAVITY
							d94xkzhat.spriteyoffset = 0
						end
					else
						d94xkzhat.rollangle = player.mo.rollangle
						P_TeleportMove(d94xkzhat, player.mo.x, player.mo.y, player.mo.z+d94xkzhatz)
						d94xkzhat.flags = $|MF_NOGRAVITY
					end
					player.d94xkzhat = d94xkzhat
				end
			end
		end
	end
end)

addHook("BossThinker", function(mobj)
	if not (mobj and mobj.valid) then return end

	for player in players.iterate
		player.d94xkzfangboss = mobj
		player.d94xkzfangstandmenacingly = true
	end
end, MT_FANG)

addHook("MobjThinker", function(mobj)
	if not (mobj and mobj.valid) then return end
	if mobj.sprite != SPR_HAT9 then return end
	if not (mobj.target and mobj.target.valid) then return end

	local d94xkzhatz = mobj.target.height
	if P_MobjFlip(mobj.target) == -1
		d94xkzhatz = 0
	end
	if mobj.target.player.d94xkzfangboss
	and (mobj.target.skin == "dark" or mobj.target.skin == "xkz")
		mobj.tics = 2
		mobj.sprite = SPR_HAT9
		if mobj.target.skin == "dark"
			mobj.spriteyoffset = 4
		else
			mobj.spriteyoffset = 0
		end
		mobj.frame = A
		mobj.angle = mobj.target.player.drawangle
		mobj.scale = mobj.target.scale
		if mobj.target.eflags & MFE_VERTICALFLIP
			mobj.eflags = $|MFE_VERTICALFLIP
		else
			mobj.eflags = $ & ~MFE_VERTICALFLIP
		end
		if ((mobj.target.state == S_PLAY_DEAD or mobj.target.state == S_PLAY_DRWN) and mobj.target.player.playerstate != PST_LIVE)
		or mobj.target.state == S_PLAY_PAIN
		or mobj.target.state == S_D94XKZ_FALLEN
			if mobj.target.state == S_PLAY_DEAD
				if mobj.flags & MF_NOGRAVITY
					mobj.momz = mobj.target.momz*2*P_MobjFlip(mobj)
				end
				mobj.angle = leveltime*(ANG30)
				mobj.rollangle = leveltime*(ANG30-ANG10)
				mobj.flags = $ & ~MF_NOGRAVITY
			elseif mobj.target.state == S_PLAY_DRWN
				mobj.angle = leveltime*(ANG10)
				mobj.rollangle = leveltime*(ANG10/2)
				mobj.flags = $|MF_NOGRAVITY
			elseif mobj.target.state == S_PLAY_PAIN
				mobj.angle = leveltime*(ANG30)
				mobj.rollangle = leveltime*(ANG30-ANG10)
				P_TeleportMove(mobj, mobj.target.x, mobj.target.y, mobj.target.z+d94xkzhatz)
				mobj.flags = $|MF_NOGRAVITY
				mobj.spriteyoffset = 8
			else
				mobj.angle = mobj.target.player.drawangle
				mobj.rollangle = 0
				P_TeleportMove(mobj, mobj.target.x, mobj.target.y, mobj.target.z)
				mobj.flags = $|MF_NOGRAVITY
				mobj.spriteyoffset = 0
			end
		else
			mobj.rollangle = mobj.target.rollangle
			P_TeleportMove(mobj, mobj.target.x, mobj.target.y, mobj.target.z+d94xkzhatz)
			mobj.flags = $|MF_NOGRAVITY
		end
		mobj.dispoffset = 1
	else
		mobj.target.player.d94xkzhat = nil
		P_RemoveMobj(mobj)
	end
end, MT_THOK)