// Dimension Teleport

addHook("SpinSpecial", function(p)
    if not p.mo or not p.mo.valid
	or p.playerstate == PST_DEAD or p.playerstate == PST_REBORN
	or (p.pflags & PF_THOKKED)
	or p.Dimentelecooldown ~= 0
	or p.Peachisfloating == true
	or (not P_IsObjectOnGround(p.mo) and p.Teleusedinair == true)
    or p.mo.skin ~= "paperpeach" return end
	
	p.Dimentele = true
	
	if not P_IsObjectOnGround(p.mo) then
		p.Teleusedinair = true
	end
	
	if p.speed >= 30*FRACUNIT then
		p.mo.state = S_INSTANTTELE_TELEPORT
		S_StartSound(p.mo, sfx_tlflpe)
		p.Dimentelecooldown = 105
		P_SpawnMobjFromMobj(p.mo, 0, 0, 0, MT_INSTANTTELE_PORTAL)
	else
		p.mo.state = S_DIMENTELE_START
		p.Dimentelecooldown = 140
		S_StartSound(p.mo, sfx_tlflip)	
	end
end)

local function InitializeDteleVars(p)
	p.Dimentele = false
	p.Dimenteleclock = 0
	p.Dimentelecooldown = 0
	p.Teleusedinair = false
end

addHook("PlayerThink", function(p)
    if not p.mo or not p.mo.valid
	or p.playerstate == PST_DEAD or p.playerstate == PST_REBORN
    or p.mo.skin ~= "paperpeach" return end
	
	if p.Dimentele == nil
		InitializeDteleVars(p)
	end
	
	if P_IsObjectOnGround(p.mo)
		p.Teleusedinair = false
	end
	
	if p.Dimentelecooldown >= 1
		p.Dimentelecooldown = $-1
	end
	
	if p.mo.state == S_PLAY_STND or p.mo.state == S_PLAY_WALK or p.mo.state == S_PLAY_FALL or p.mo.state == S_PLAY_SPRING then
		p.Dimentele = false
		p.Dimenteleclock = 0
	end
	
	if p.Dimentele == true
		p.Dimenteleclock = $+1
		P_SetObjectMomZ(p.mo, 0)
		p.pflags = $1|PF_FULLSTASIS
		if p.mo.state == S_DIMENTELE_TELEPORT then
			P_InstaThrust(p.mo, p.mo.angle, 30*FRACUNIT)
			p.powers[pw_strong] = STR_ANIM|STR_GUARD|STR_ATTACK|STR_BUST
		elseif p.mo.state == S_INSTANTTELE_TELEPORT then
			P_InstaThrust(p.mo, p.mo.angle, 35*FRACUNIT)
			p.powers[pw_strong] = STR_ANIM|STR_GUARD|STR_ATTACK|STR_BUST
		elseif p.mo.state == S_DIMENTELE_END or p.mo.state == S_INSTANTTELE_END then
			p.powers[pw_strong] = STR_NONE
			P_InstaThrust(p.mo, 0, 0)
		else
			P_InstaThrust(p.mo, 0, 0)
		end
	end
	
	if p.Dimenteleclock == 46 and p.mo.state == S_DIMENTELE_END then
		S_StartSound(p.mo, sfx_tlflpe)
	end

	if p.mo.state == S_DIMENTELE_FINISH
	and (p.cmd.buttons & BT_JUMP) 
	and not P_IsObjectOnGround(p.mo) then
		p.mo.state = S_DIMENBLAST_READYYELLOW
	end
	
	if p.mo.state == S_INSTANTTELE_END
	and (p.cmd.buttons & BT_JUMP) then
		P_InstaThrust(p.mo, p.mo.angle, 40*FRACUNIT)
		P_SetObjectMomZ(p.mo, 3*FRACUNIT)
		p.mo.state = S_PLAY_SPRING
		P_SpawnMobjFromMobj(p.mo, 0, 0, 0, MT_INSTANTTELE_PORTAL)
		S_StartSound(p.mo, sfx_dmblsy)
	end
	
	if p.mo.state == S_DIMENBLAST_READYYELLOW
	and not (p.cmd.buttons & BT_JUMP) then
		P_InstaThrust(p.mo, p.mo.angle, 40*FRACUNIT)
		P_SetObjectMomZ(p.mo, 2*FRACUNIT)
		p.mo.state = S_PLAY_SPRING
		S_StartSound(p.mo, sfx_dmblsy)
		P_SpawnMobjFromMobj(p.mo, 0, 0, 0, MT_DIMENBLAST_YELLOWPORTAL)
	end
	
	if p.mo.state == S_DIMENBLAST_READYORANGE
	and not (p.cmd.buttons & BT_JUMP) then
		P_InstaThrust(p.mo, p.mo.angle, 45*FRACUNIT)
		P_SetObjectMomZ(p.mo, 4*FRACUNIT)
		p.mo.state = S_PLAY_SPRING
		S_StartSound(p.mo, sfx_dmblso)
		P_SpawnMobjFromMobj(p.mo, 0, 0, 0, MT_DIMENBLAST_ORANGEPORTAL)
	end
	
	if p.mo.state == S_DIMENBLAST_READYRED
	and not (p.cmd.buttons & BT_JUMP)
	or p.mo.state == S_DIMENBLAST_FINISH then
		P_InstaThrust(p.mo, p.mo.angle, 52*FRACUNIT)
		P_SetObjectMomZ(p.mo, 6*FRACUNIT)
		p.mo.state = S_PLAY_SPRING
		S_StartSound(p.mo, sfx_dmblsr)
		P_SpawnMobjFromMobj(p.mo, 0, 0, 0, MT_DIMENBLAST_REDPORTAL)
	end
end)

addHook("MobjThinker", function(MT_DIMENBLAST_YELLOWPORTAL)
	if MT_DIMENBLAST_YELLOWPORTAL.state == S_DIMENBLAST_YELLOWPORTAL then
		MT_DIMENBLAST_YELLOWPORTAL.color = 51
	end
end)

addHook("MobjThinker", function(MT_DIMENBLAST_ORANGEPORTAL)
	if MT_DIMENBLAST_ORANGEPORTAL.state == S_DIMENBLAST_ORANGEPORTAL then
		MT_DIMENBLAST_ORANGEPORTAL.color = 44
	end
end)

addHook("MobjThinker", function(MT_DIMENBLAST_REDPORTAL)
	if MT_DIMENBLAST_REDPORTAL.state == S_DIMENBLAST_REDPORTAL then
		MT_DIMENBLAST_REDPORTAL.color = 33
	end
end)