//Respawn reset
addHook("PlayerSpawn", function(p)
	if p and p.valid and p.mo and p.mo.valid and p.mo.skin == "taz" then
		p.charability = CA_TWINSPIN
		p.charability2 = CA2_SPINDASH
		p.normalspeed = FRACUNIT*30
		p.jumpfactor = FRACUNIT
		p.height = FRACUNIT*48
		p.spinheight = FRACUNIT*55
		p.mo.shadowscale = FRACUNIT/10*12
		p.tazquishing = FRACUNIT
		p.tashnado = false
		p.hungry = true
		p.wallbounce = false
		p.wallbounces = 0
		p.tazlide = 0
		p.crashed = false
		p.tazquished = false
		p.farted = false
		p.thatwasall = false
		p.chili = false
		p.spcanflip = false
		p.zok = false
		COM_BufInsertText(p, "tazload")
		if multiplayer == false then
			if gamemap == 40 then
				p.skincolor = SKINCOLOR_WERETAZ
				p.mo.color = SKINCOLOR_WERETAZ
				p.mo.colorized = true
			end
		end
		if p.drowned == true 
		and not (p.mo.eflags & MFE_UNDERWATER) then
			p.mo.state = S_TAZDROWN
			p.weapondelay = TICRATE/10
		elseif p.skincolor == SKINCOLOR_WERETAZ then
			S_StartSound(p.mo, sfx_twolf)
		else
			local zpawn = P_RandomRange(1, 5)
			if zpawn == 1 then
				S_StartSound(p.mo, sfx_tsup)
			elseif zpawn == 2 then
				S_StartSound(p.mo, sfx_tzs1)
			elseif zpawn == 3 then
				S_StartSound(p.mo, sfx_tzs2)
			elseif zpawn == 4 then
				S_StartSound(p.mo, sfx_tzs3)
			elseif zpawn == 5 then
				S_StartSound(p.mo, sfx_tyow)
			end
		end
	end
end)

addHook("MapLoad", do
	if not consoleplayer then return end
	COM_BufInsertText(consoleplayer, "tazload")
	for p in players.iterate
		if p.mo.skin != "taz" then return end
		if (p.powers[pw_shield] & SH_FORCE)
		and not ((p.powers[pw_shield] & SH_PITY)
		or (p.powers[pw_shield] & SH_PINK)) then
			if p.tzflck and not p.tzflck.valid then
				local flicky = P_SpawnMobj(p.mo.x, p.mo.y, p.mo.z, MT_TAZFLICKY)
				flicky.color = SKINCOLOR_WAVE
				flicky.target = p.mo
				p.tzflck = flicky
				S_StartSound(p.mo, sfx_3db09)
			end
		end
	end
end)

//Shields
addHook("ShieldSpecial", function(p)
	if p.mo.skin != "taz" then return end
	if (p.powers[pw_shield] != SH_TGUM  
	and (p.mo.state != S_SPINTWIN
	or (p.pflags & PF_JUMPDOWN)))
	or (p.powers[pw_shield] == SH_TGUM 
	and p.mo.state == S_PLAY_TWINSPIN)
	or p.mo.state == S_PLAY_GASP
	return true
	end
	if p.powers[pw_shield] == SH_ARMAGEDDON then
		S_StartSound(p.mo, sfx_burp)
		P_FlashPal(p, PAL_MIXUP, TICRATE/4)
	end
	if p.powers[pw_shield] == SH_FLAMEAURA then
		p.shieldscale = FRACUNIT
		S_StartSound(p.mo, sfx_tzok)
	end
	if p.shieldused == true then return true end
	if p.powers[pw_shield] == SH_THUNDERCOIN then
		p.pflags = $&~PF_THOKKED
		p.shieldused = true	
	end
end)

addHook("ShieldSpawn", function(p)
	if p.mo.skin != "taz" then return end
	if p.powers[pw_shield] == SH_GUM
	or p.powers[pw_shield] == SH_WHIRLWIND then
		P_RemoveShield(p)
		p.powers[pw_shield] = SH_TGUM
		S_StartSound(p.mo, sfx_gump)
	end
	if p.powers[pw_shield] == SH_BUBBLEWRAP then
		p.shieldscale = FRACUNIT/4*5
	else
		p.shieldscale = 0
	end
	if p.powers[pw_shield] == SH_TGUM then
		S_StartSound(p.mo, sfx_gump)
	end
	if p.powers[pw_shield] == SH_FLAMEAURA then
		p.tazfire = true
	end
	if p.powers[pw_shield] == SH_ELEMENTAL then
		if p.chili == true then
			P_RemoveShield(p)
			p.powers[pw_shield] = SH_FLAMEAURA
			p.tazfire = true
			p.chili = false
		end
	end
	if (p.powers[pw_shield] == SH_PITY) 
	or (p.powers[pw_shield] == SH_PINK) then
		if p.tzflck3 == nil 
		or (p.tzflck3 and not p.tzflck3.valid) then
			if (p.powers[pw_shield] == SH_PITY) then
				local flicky = P_SpawnMobj(p.mo.x, p.mo.y, p.mo.z, MT_TAZFLICKY)
				flicky.color = SKINCOLOR_GREEN
				flicky.target = p.mo
				p.tzflck3 = flicky
				S_StartSound(p.mo, sfx_3db09)
			else
				local flicky = P_SpawnMobj(p.mo.x, p.mo.y, p.mo.z, MT_TAZFLICKY)
				flicky.color = SKINCOLOR_ROSY
				flicky.target = p.mo
				p.tzflck3 = flicky
				S_StartSound(p.mo, sfx_3db09)
			end
		end
	elseif p.tzflck3 and p.tzflck3.valid then
		P_RemoveMobj(p.tzflck3)
		p.tzflck3 = nil
	end
	if (p.powers[pw_shield] & SH_FORCE)
	and (p.powers[pw_shield] & SH_FORCEHP) then
		if p.tzflck == nil 
		or (p.tzflck and not p.tzflck.valid) then
			local flicky = P_SpawnMobj(p.mo.x, p.mo.y, p.mo.z, MT_TAZFLICKY)
			flicky.color = SKINCOLOR_WAVE
			flicky.target = p.mo
			p.tzflck = flicky
			S_StopSoundByID(p.mo, sfx_forcsg)
			S_StopSoundByID(p.mo, sfx_frcssg)
			S_StartSound(p.mo, sfx_3db09)
		end
		if p.tzflck2 == nil 
		or (p.tzflck2 and not p.tzflck2.valid)then
			local flicky2 = P_SpawnMobj(p.mo.x, p.mo.y, p.mo.z, MT_TAZFLICKY2)
			flicky2.color = SKINCOLOR_WAVE
			flicky2.target = p.mo
			p.tzflck2 = flicky2
			S_StopSoundByID(p.mo, sfx_forcsg)
			S_StopSoundByID(p.mo, sfx_frcssg)
			S_StartSound(p.mo, sfx_flck2)
		end
	else
		if p.tzflck and p.tzflck.valid then
			P_RemoveMobj(p.tzflck)
			p.tzflck = nil
		end
		if p.tzflck2 and p.tzflck2.valid then
			P_RemoveMobj(p.tzflck2)
			p.tzflck2 = nil
		end
	end
end)

addHook("MobjRemoved", function(m)
	if m.state == S_TAZROCK then
		local rock0 = P_SpawnMobj(m.x, m.y, m.z, MT_ROCKCRUMBLE10)
		rock0.scale = FRACUNIT/3
		rock0.momz = P_RandomRange(1, 3)*FRACUNIT
		rock0.momx = P_RandomRange(-3, 3)*FRACUNIT
		rock0.momy = P_RandomRange(-3, 3)*FRACUNIT
		local rock2 = P_SpawnMobj(m.x, m.y, m.z, MT_ROCKCRUMBLE10)
		rock2.scale = FRACUNIT/3
		rock2.momz = P_RandomRange(1, 3)*FRACUNIT
		rock2.momx = P_RandomRange(-3, 3)*FRACUNIT
		rock2.momy = P_RandomRange(-3, 3)*FRACUNIT
		local rock3 = P_SpawnMobj(m.x, m.y, m.z, MT_ROCKCRUMBLE10)
		rock3.scale = FRACUNIT/3
		rock3.momz = P_RandomRange(1, 3)*FRACUNIT
		rock3.momx = P_RandomRange(-3, 3)*FRACUNIT
		rock3.momy = P_RandomRange(-3, 3)*FRACUNIT
		S_StartSound(rock3, sfx_wbreak)
	elseif m.sprite == SPR_ROII then
		local ice = P_SpawnMobj(m.x, m.y, m.z, MT_SPARK)
		ice.colorized = true
		ice.color = SKINCOLOR_ICY
		ice.scale = FRACUNIT/2*3
		local rock0 = P_SpawnMobj(m.x, m.y, m.z, MT_TIDB)
		rock0.scale = FRACUNIT/2
		rock0.momz = P_RandomRange(1, 3)*FRACUNIT
		rock0.momx = P_RandomRange(-3, 3)*FRACUNIT
		rock0.momy = P_RandomRange(-3, 3)*FRACUNIT
		local rock2 = P_SpawnMobj(m.x, m.y, m.z, MT_TIDB)
		rock2.scale = FRACUNIT/2
		rock2.momz = P_RandomRange(1, 3)*FRACUNIT
		rock2.momx = P_RandomRange(-3, 3)*FRACUNIT
		rock2.momy = P_RandomRange(-3, 3)*FRACUNIT
		local rock3 = P_SpawnMobj(m.x, m.y, m.z, MT_TIDB)
		rock3.scale = FRACUNIT/2
		rock3.momz = P_RandomRange(1, 3)*FRACUNIT
		rock3.momx = P_RandomRange(-3, 3)*FRACUNIT
		rock3.momy = P_RandomRange(-3, 3)*FRACUNIT
		S_StartSound(rock3, sfx_shattr)
	elseif m.sprite == SPR_ROID then
		local ice = P_SpawnMobj(m.x, m.y, m.z, MT_SPARK)
		ice.colorized = true
		ice.color = SKINCOLOR_AETHER
		ice.scale = FRACUNIT/2*3
		local rock0 = P_SpawnMobj(m.x, m.y, m.z, MT_CRYSTALCRUMBLE)
		rock0.scale = FRACUNIT/2
		rock0.momz = P_RandomRange(1, 3)*FRACUNIT
		rock0.momx = P_RandomRange(-3, 3)*FRACUNIT
		rock0.momy = P_RandomRange(-3, 3)*FRACUNIT
		local rock2 = P_SpawnMobj(m.x, m.y, m.z, MT_CRYSTALCRUMBLE)
		rock2.scale = FRACUNIT/2
		rock2.momz = P_RandomRange(1, 3)*FRACUNIT
		rock2.momx = P_RandomRange(-3, 3)*FRACUNIT
		rock2.momy = P_RandomRange(-3, 3)*FRACUNIT
		local rock3 = P_SpawnMobj(m.x, m.y, m.z, MT_CRYSTALCRUMBLE)
		rock3.scale = FRACUNIT/2
		rock3.momz = P_RandomRange(1, 3)*FRACUNIT
		rock3.momx = P_RandomRange(-3, 3)*FRACUNIT
		rock3.momy = P_RandomRange(-3, 3)*FRACUNIT
		S_StartSound(rock3, sfx_shattr)
	else
		local rock0 = P_SpawnMobj(m.x, m.y, m.z, MT_LAVASPLISH)
		rock0.scale = FRACUNIT/2
		rock0.momz = P_RandomRange(1, 3)*FRACUNIT
		rock0.momx = P_RandomRange(-3, 3)*FRACUNIT
		rock0.momy = P_RandomRange(-3, 3)*FRACUNIT
		local rock2 = P_SpawnMobj(m.x, m.y, m.z, MT_LAVASPLISH)
		rock2.scale = FRACUNIT/2
		rock2.momz = P_RandomRange(1, 3)*FRACUNIT
		rock2.momx = P_RandomRange(-3, 3)*FRACUNIT
		rock2.momy = P_RandomRange(-3, 3)*FRACUNIT
		local rock3 = P_SpawnMobj(m.x, m.y, m.z, MT_LAVASPLISH)
		rock3.scale = FRACUNIT/2
		rock3.momz = P_RandomRange(1, 3)*FRACUNIT
		rock3.momx = P_RandomRange(-3, 3)*FRACUNIT
		rock3.momy = P_RandomRange(-3, 3)*FRACUNIT
		S_StartSound(rock3, sfx_bexpld)
	end
end,MT_TAZROCK)

addHook("MobjRemoved", function(m)
	if m.state == S_TWDB 
	or m.state == S_TWDB2 then
		local expl = P_SpawnMobj(m.x, m.y, m.z, MT_DUST)
		expl.colorized = true
		expl.color = SKINCOLOR_BRONZE
		expl.scale = FRACUNIT/2*3
		expl.destscale = FRACUNIT*2
		S_StartSound(rock3, sfx_wbreak)
	else
		P_SpawnMobj(m.x, m.y, m.z, MT_EXPLODE)
		S_StartSound(rock3, sfx_wbreak)
	end
end,MT_TAZSPITTLE2)

//Bubblegum item
addHook("MobjRemoved", function(mobj)
	if mobj and mobj.valid then
		P_SpawnMobj(mobj.x, mobj.y, mobj.z, MT_TAZGUM)
	end
end,MT_GUMSPAWN)
addHook("TouchSpecial", function(s, t)
	if t and t.valid
	and t.player.charability != CA_FLY
	and t.player.powers[pw_shield] != SH_TGUM then
		if t.skin == "taz" then
			S_StartSound(t, sfx_gump)
		end
		t.player.powers[pw_shield] = SH_TGUM
		S_StartSound(t, sfx_s3k77)
		P_RemoveMobj(s)
	end
return true
end,MT_TAZGUM)

//Force Shield "Orb"
addHook("MobjThinker", function(m)
	A_RotateSpikeBall(m)
	if (m.target.eflags & MFE_VERTICALFLIP)
	or (m.target.flags2 & MF2_OBJECTFLIP) then
		m.z = m.target.z - FRACUNIT
		m.eflags = $|MFE_VERTICALFLIP
	else
		m.z = m.target.z + FRACUNIT*50
		m.eflags = $&~MFE_VERTICALFLIP
	end
end,MT_TAZFLICKY)
addHook("MobjThinker", function(m)
	A_RotateSpikeBall(m)
	if (m.target.eflags & MFE_VERTICALFLIP)
	or (m.target.flags2 & MF2_OBJECTFLIP) then
		m.z = m.target.z - FRACUNIT
		m.eflags = $|MFE_VERTICALFLIP
	else
		m.z = m.target.z + FRACUNIT*50
		m.eflags = $&~MFE_VERTICALFLIP
	end
end,MT_TAZFLICKY2)
addHook("MobjRemoved", function(m)
	local quil0 = P_SpawnMobj(m.x, m.y, m.z, MT_TMQUIL)
	quil0.color = m.color
	quil0.momz = P_RandomRange(3, 5)*FRACUNIT
	quil0.momx = P_RandomRange(-3, 3)*FRACUNIT
	quil0.momy = P_RandomRange(-3, 3)*FRACUNIT
	local quil2 = P_SpawnMobj(m.x, m.y, m.z, MT_TMQUIL)
	quil2.color = m.color
	quil2.momz = P_RandomRange(3, 5)*FRACUNIT
	quil2.momx = P_RandomRange(-3, 3)*FRACUNIT
	quil2.momy = P_RandomRange(-3, 3)*FRACUNIT
	local quil3 = P_SpawnMobj(m.x, m.y, m.z, MT_TMQUIL)
	quil3.color = m.color
	quil3.momz = P_RandomRange(3, 5)*FRACUNIT
	quil3.momx = P_RandomRange(-3, 3)*FRACUNIT
	quil3.momy = P_RandomRange(-3, 3)*FRACUNIT
	S_StartSound(m.target, sfx_3db14)
end,MT_TAZFLICKY)
addHook("MobjRemoved", function(m)
	local quil0 = P_SpawnMobj(m.x, m.y, m.z, MT_TMQUIL)
	quil0.color = m.color
	quil0.momz = P_RandomRange(3, 5)*FRACUNIT
	quil0.momx = P_RandomRange(-3, 3)*FRACUNIT
	quil0.momy = P_RandomRange(-3, 3)*FRACUNIT
	local quil2 = P_SpawnMobj(m.x, m.y, m.z, MT_TMQUIL)
	quil2.color = m.color
	quil2.momz = P_RandomRange(3, 5)*FRACUNIT
	quil2.momx = P_RandomRange(-3, 3)*FRACUNIT
	quil2.momy = P_RandomRange(-3, 3)*FRACUNIT
	local quil3 = P_SpawnMobj(m.x, m.y, m.z, MT_TMQUIL)
	quil3.color = m.color
	quil3.momz = P_RandomRange(3, 5)*FRACUNIT
	quil3.momx = P_RandomRange(-3, 3)*FRACUNIT
	quil3.momy = P_RandomRange(-3, 3)*FRACUNIT
	S_StartSound(m.target, sfx_3db14)
end,MT_TAZFLICKY2)

//Eat/Spit ability stuff
addHook("TouchSpecial", function(s, t)
	if t.state == S_TAZBITEG
	or t.state == S_TAZBITE then
		t.player.hungry = 3
		t.player.weapondelay = TICRATE/4*3
		P_KillMobj(s, t, t, 0)
		S_StopSoundByID(t, sfx_tasty)
		S_StopSoundByID(t, sfx_taste)
		S_StopSoundByID(t, sfx_tast2)
		S_StartSound(t,sfx_taste)
	return true
	end
end,MT_SHELL)

addHook("TouchSpecial", function(s, t)
	if t.state == S_TAZBITEG
	or t.state == S_TAZBITE then
		S_StartSound(t, sfx_gasp)
		t.player.powers[pw_underwater] = TICRATE*30
		P_RestoreMusic(t.player)
		local bub1 = P_SpawnMobj(s.x, s.y, s.z, MT_TAZBUBBLES)
		bub1.state = S_POP1
		P_RemoveMobj(s)
	return true
	end
end,MT_EXTRALARGEBUBBLE)

addHook("MobjDeath", function(t, i)
	if t.eaten != true then return end
	if t.flags & MF_ENEMY then
		t.state = S_XPLD1
		i.player.weapondelay = TICRATE/4*3
		if t.info.spawnhealth <= 1
		and t.type != MT_MGREENKOOPA
		and t.type != MT_GOOMBA
		and t.type != MT_BLUEGOOMBA then
			i.player.hungry = 1
		end
	return true
	end
end)

addHook("MobjSpawn", function(mobj)
	if P_RandomChance(FRACUNIT/2) then
		mobj.mirrored = true
	end
end,MT_TAZSPITTLE)
addHook("MobjSpawn", function(mobj)
	if P_RandomChance(FRACUNIT/2) then
		mobj.mirrored = true
	end
end,MT_TAZSPITTLE2)
addHook("MobjSpawn", function(mobj)
	if P_RandomChance(FRACUNIT/2) then
		mobj.mirrored = true
	end
end,MT_TAZROCK)
addHook("MobjSpawn", function(mobj)
	if P_RandomChance(FRACUNIT/2) then
		mobj.mirrored = true
	end
end,MT_TAZSMOKE)
addHook("MobjSpawn", function(mobj)
	if P_RandomChance(FRACUNIT/2) then
		mobj.mirrored = true
	end
end,MT_TAZBUBBLES)
addHook("MobjSpawn", function(mobj)
	if P_RandomChance(FRACUNIT/2) then
		mobj.mirrored = true
	end
end,MT_OTRAIL)

//Final Boss
addHook("MobjSpawn", function(m)
m.huggin = 0
end,MT_ROSY)
addHook("MobjThinker", function(s)
	if not s.target then return end
	if multiplayer then return end
	if s.target.skin != "taz" then return end
	if s.state == S_ROSY_HUG then
		if s.gameova then
			if s.target.player.lives != 0 then
				s.target.player.lives = 0
			end
			s.sprite = SPR_TWAF
			s.frame = A
			s.target.player.pflags = $|PF_FULLSTASIS
			s.target.player.playerstate = PST_DEAD
			s.target.sprite = SPR_TWAT
			s.target.frame = A
			s.target.tics = -1
		elseif s.huggin < 50 then
			local fuz = P_SpawnMobj(s.x, s.y, s.z+5*FRACUNIT, MT_SMOKE)
			fuz.momx = P_RandomRange(-1, 1)*FRACUNIT
			fuz.momy = P_RandomRange(-1, 1)*FRACUNIT
			fuz.momz = P_RandomRange(1, 2)*FRACUNIT
			fuz.scale = FRACUNIT*4
			s.huggin = $+1
			s.target.player.tossdelay = 0
		elseif s.target.player.rings != 0 
		or s.target.player.lives != 1 
		or s.huggin < 100 then
			S_StopMusic(s.target.player)
			s.sprite = SPR_TWAF
			s.frame = A
			s.target.player.pflags = $|PF_FULLSTASIS
			s.huggin = $+1
			s.target.player.thatwasall = true
			s.target.sprite = SPR_TWAT
			s.target.frame = A
			s.target.tics = -1
			if not s.target.player.tossdelay then
				local hrt = P_SpawnMobj(s.x, s.y, s.z+40*FRACUNIT, MT_TMHRT)
				hrt.momx = P_RandomRange(-1, 1)*FRACUNIT/4
				hrt.momy = P_RandomRange(-1, 1)*FRACUNIT/4
				hrt.momz = FRACUNIT
				s.target.player.tossdelay = TICRATE/2
			end
			if s.target.player.powers[pw_shield] then
				s.target.player.powers[pw_shield] = SH_NONE
				s.target.player.tossdelay = 0
			end
			if s.target.player.lives != 1 then
				s.target.player.lives = $-1
			end
			if s.target.player.rings >= 10 then
				s.target.player.rings = $-($/10)
			elseif s.target.player.rings != 0 then
				s.target.player.rings = $-1
			end
		else
			s.gameova = true
			s.target.player.pflags = $|PF_FULLSTASIS
			s.target.sprite = SPR_TWAT
			s.target.frame = A
			s.target.tics = -1
			S_StartSound(s, sfx_twaf)
		end
	elseif s.huggin != 0 then
		s.huggin = 0
	end
end,MT_ROSY)