// Dimension Teleport and it's upgrades

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 not (p.pflags & PF_THOKKED)
	and not (p.weapondelay)
	and p.InstantTeleportUpgrade == false
	and p.DirectionTeleportUpgrade == false
	and (p.cmd.buttons & BT_USE) then
		p.mo.state = S_DIMENTELE_START
		p.weapondelay = TICRATE*4
		S_StartSound(p.mo, sfx_tlflip)
	end
	if p.mo.state == S_DIMENTELE_START 
	or p.mo.state == S_DIMENTELE_DIMENSION 
	or p.mo.state == S_DIRECTTELE_START
	or p.mo.state == S_DIRECTTELE_DIMENSION 
	or p.mo.state == S_DIRECTTELE_READYFORWARD
	or p.mo.state == S_DIRECTTELE_READYDIAGONAL
	or p.mo.state == S_DIRECTTELE_READYVERTICAL then
		P_InstaThrust(p.mo, 0, 0)
		P_SetObjectMomZ(p.mo, 0)
		p.pflags = $1|PF_FULLSTASIS
	end
	if p.mo.state == S_DIMENTELE_TELEPORT
	or p.mo.state == S_MULTITELE_2NDTELEPORT
	or p.mo.state == S_MULTITELE_3RDTELEPORT then
		P_InstaThrust(p.mo, p.mo.angle, 30*FRACUNIT)
		P_SetObjectMomZ(p.mo, 0)
		p.powers[pw_strong] = STR_ANIM|STR_GUARD|STR_ATTACK
		p.pflags = $1|PF_FULLSTASIS
	end
	if p.mo.state == S_DIMENTELE_END_START then
		S_StartSound(p.mo, sfx_tlflpe)
	end
	if p.mo.state == S_DIMENTELE_END 
	or p.mo.state == S_DIMENTELE_END_START then
		P_InstaThrust(p.mo, 0, 0)
		P_SetObjectMomZ(p.mo, 0)
		p.powers[pw_strong] = STR_NONE
		p.pflags = $1|PF_FULLSTASIS
	end
	if p.mo.state == S_DIMENTELE_FINISH
		P_InstaThrust(p.mo, 0, 0)
		P_SetObjectMomZ(p.mo, 0)
		p.pflags = $1|PF_FULLSTASIS
	end
	if p.mo.state == S_DIMENTELE_FINISH
	and (p.cmd.buttons & BT_JUMP) then
		P_InstaThrust(p.mo, p.mo.angle, 30*FRACUNIT)
		P_SetObjectMomZ(p.mo, 1*FRACUNIT)
	end
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.InstantTeleportUpgrade == true
	and not (p.pflags & PF_THOKKED)
	and not (p.weapondelay)
	and (p.cmd.buttons & BT_SPIN) then
		p.mo.state = S_INSTANTTELE_TELEPORT
		p.weapondelay = TICRATE*3
		S_StartSound(p.mo, sfx_tlflpe)
		P_SpawnMobjFromMobj(p.mo, 0, 0, 0, MT_INSTANTTELE_PORTAL)
	end
	if p.mo.state == S_INSTANTTELE_TELEPORT then
		P_InstaThrust(p.mo, p.mo.angle, 35*FRACUNIT)
		P_SetObjectMomZ(p.mo, 0)
		p.powers[pw_strong] = STR_ANIM|STR_GUARD|STR_ATTACK
		p.pflags = $1|PF_FULLSTASIS
	end
	if p.mo.state == S_INSTANTTELE_END
		P_InstaThrust(p.mo, 0, 0)
		P_SetObjectMomZ(p.mo, 0)
		p.pflags = $1|PF_FULLSTASIS
		p.powers[pw_strong] = STR_NONE
	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_STND
		P_SpawnMobjFromMobj(p.mo, 0, 0, 0, MT_INSTANTTELE_PORTAL)
	end
end)

local function initializeMultiteleVars(p)
	p.MultiteleLimit = 0 
	p.Directionswitch = false
	p.Peachisteleporting = false
	p.Directionswitchtimer = 0
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.MultiteleLimit == nil
		initializeMultiteleVars(p)
	end
	
	if p.mo.state == S_DIMENTELE_FINISH
	and p.MultiTeleportUpgrade == true
	and (p.cmd.buttons & BT_USE)
	and p.MultiteleLimit == 1 
	or p.mo.state == S_DIMENTELE_FINISH
	and p.MultiTeleportUpgrade == true
	and (p.cmd.buttons & BT_USE)
	and p.MultiteleLimit == 0 then
		p.mo.state = S_DIMENTELE_START
		p.weapondelay = TICRATE*4
		p.MultiteleLimit = $+1
		S_StartSound(p.mo, sfx_tlflip)
	end
	
	if p.mo.state == S_DIMENTELE_TELEPORT
	and p.MultiteleLimit == 1 then
		p.mo.state = S_MULTITELE_2NDTELEPORT
	end
	if p.mo.state == S_DIMENTELE_TELEPORT
	and p.MultiteleLimit == 2 then
		p.mo.state = S_MULTITELE_3RDTELEPORT
	end
	if p.mo.state == S_PLAY_STND or p.mo.state == S_PLAY_WALK or p.mo.state == S_PLAY_FALL then
		p.MultiteleLimit = 0
	end
end)

addHook("MobjDamage", function(mo, pmo)
	if not (pmo and pmo.valid)
	or not (mo and mo.valid)
	or not (pmo.player and pmo.player.valid)
	or pmo.skin ~= "paperpeach" return end
	
	pmo.player.MultiteleLimit = 0
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 not (p.pflags & PF_THOKKED)
	and not (p.weapondelay)
	and p.DirectionTeleportUpgrade == true
	and (p.cmd.buttons & BT_USE) then
		p.mo.state = S_DIRECTTELE_START
		S_StartSound(p.mo, sfx_tlflip)
		p.weapondelay = TICRATE*20
	end
	
	if p.mo.state == S_DIRECTTELE_READYFORWARD then
		p.Readyforward = true
	end
	
	if p.mo.state == S_DIRECTTELE_READYFORWARD
	and p.Directionswitch == false
	and (p.cmd.buttons & BT_JUMP) then
		p.Directionswitch = true
		p.mo.state = S_DIRECTTELE_READYDIAGONAL
		p.Readydiagonal = true
		p.Readyforward = false
	end
	
	if p.mo.state == S_DIRECTTELE_READYDIAGONAL
	and p.Directionswitch == false
	and (p.cmd.buttons & BT_JUMP) then
		p.Directionswitch = true
		p.mo.state = S_DIRECTTELE_READYVERTICAL
		p.Readyvertical = true
		p.Readydiagonal = false
	end
	
	if p.mo.state == S_DIRECTTELE_READYVERTICAL
	and p.Directionswitch == false
	and (p.cmd.buttons & BT_JUMP) then
		p.Directionswitch = true
		p.mo.state = S_DIRECTTELE_READYFORWARD
		p.Readyforward = true
		p.Readyvertical = false
	end
	
	if p.Directionswitch == true then
		p.Directionswitchtimer = $+1
	end
	
	if p.Directionswitchtimer == 13 then
		p.Directionswitchtimer = 0
		p.Directionswitch = false
	end
	
	if not (p.cmd.buttons & BT_USE)
	and p.mo.state == S_DIRECTTELE_READYFORWARD then
		p.mo.state = S_DIMENTELE_TELEPORT
		p.weapondelay = TICRATE*4
	end
	
	if not (p.cmd.buttons & BT_USE)
	and p.mo.state == S_DIRECTTELE_READYDIAGONAL then
		p.mo.state = S_DIRECTTELE_DIAGONALTELEPORT
		p.weapondelay = TICRATE*4
	end
	
	if not (p.cmd.buttons & BT_USE)
	and p.mo.state == S_DIRECTTELE_READYVERTICAL then
		p.mo.state = S_DIRECTTELE_VERTICALTELEPORT
		p.weapondelay = TICRATE*4
	end
	
	if p.mo.state == S_DIRECTTELE_DIAGONALTELEPORT then
		P_SetObjectMomZ(p.mo, 10*FRACUNIT)
		P_InstaThrust(p.mo, p.mo.angle, 20*FRACUNIT)
		p.powers[pw_strong] = STR_ANIM|STR_GUARD|STR_ATTACK
		p.pflags = $1|PF_FULLSTASIS
	end
	
	if p.mo.state == S_DIRECTTELE_VERTICALTELEPORT then
		P_SetObjectMomZ(p.mo, 20*FRACUNIT)
		P_InstaThrust(p.mo, p.mo.angle, 0)
		p.powers[pw_strong] = STR_ANIM|STR_GUARD|STR_ATTACK
		p.pflags = $1|PF_FULLSTASIS
	end
end)