addHook("PlayerThink", function(p)
	if p.c3tics == nil
		p.c3tics = 0
	end
	if (p.cmd.buttons & BT_CUSTOM3)
		p.c3tics = $1+1
	else
		p.c3tics = 0
	end
end)

freeslot("S_PLAY_REDIRECTSTART1","S_PLAY_REDIRECTSTART2","S_PLAY_REDIRECTSTART3","S_PLAY_REDIRECTSTART4","SPR_RDRS","S_PLAY_REDIRECTFALL")

states[S_PLAY_REDIRECTSTART1] = {
	sprite = SPR_RDRS,
	frame = A|FF_ANIMATE,
	tics = 2,
	nextstate = S_PLAY_REDIRECTSTART2
}

states[S_PLAY_REDIRECTSTART2] = {
	sprite = SPR_RDRS,
	frame = B|FF_ANIMATE,
	tics = 2,
	nextstate = S_PLAY_REDIRECTSTART3
}

states[S_PLAY_REDIRECTSTART3] = {
	sprite = SPR_RDRS,
	frame = C|FF_ANIMATE,
	tics = 2,
	nextstate = S_PLAY_REDIRECTSTART4
}

states[S_PLAY_REDIRECTSTART4] = {
	sprite = SPR_RDRS,
	frame = D|FF_ANIMATE,
	tics = 2,
	nextstate = S_PLAY_PP_REDIRECT
}

states[S_PLAY_REDIRECTFALL] = {
	sprite = SPR_PLAY,
	frame = SPR2_FLT_,
	tics = 2,
	nextstate = S_PLAY_REDIRECTFALL
}

freeslot("sfx_pskid")
sfxinfo[sfx_pskid].caption = "Redirecting"

addHook("ThinkFrame", do
	for p in players.iterate
		if p.redirecttimer == nil
			p.redirecttimer = 0
		end
		if p.mo.state == S_PLAY_SKID
		and P_IsObjectOnGround(p.mo)
		and p.mo.skin == "prpeppino"
		and p.machcounter >= 10*FRACUNIT
		and (p.cmd.forwardmove or p.cmd.sidemove)
			p.mo.state = S_PLAY_REDIRECTSTART1
			S_StartSound(p.mo, sfx_pskid)
		end
		if (p.mo.state == S_PLAY_PP_REDIRECT or p.mo.state == S_PLAY_REDIRECTSTART1 or p.mo.state == S_PLAY_REDIRECTSTART2 or p.mo.state == S_PLAY_REDIRECTSTART3 or p.mo.state == S_PLAY_REDIRECTSTART4 or p.mo.state == S_PLAY_REDIRECTFALL)
			p.pflags = ($|PF_STASIS|PF_JUMPSTASIS)
			Resettheshet(p)
			p.redirecttimer = $1+1
			p.machcounter = 10*FRACUNIT
			p.normalspeed = 36*FRACUNIT
		end
		if p.redirecttimer > 0
		and p.mo.state ~= S_PLAY_REDIRECTSTART1
		and p.mo.state ~= S_PLAY_REDIRECTSTART2
		and p.mo.state ~= S_PLAY_REDIRECTSTART3
		and p.mo.state ~= S_PLAY_REDIRECTSTART4
		and p.mo.state ~= S_PLAY_PP_REDIRECT
		and p.mo.state ~= S_PLAY_REDIRECTFALL
			p.mo.state = S_PLAY_PP_REDIRECT
		end
		if p.redirecttimer >= 25
		and P_IsObjectOnGround(p.mo)
			p.pflags = ($ & ~PF_STASIS|PF_JUMPSTASIS)
			P_InstaThrust(p.mo, p.mo.angle, 44*FRACUNIT)
			p.redirecttimer = 0
			p.mo.state = S_PLAY_PP_MACH3
			p.machcounter = 10*FRACUNIT
		end
	end
end)

addHook("PlayerThink", function(p)
	if (p.mo.state == S_PLAY_PP_REDIRECT)
	and not P_IsObjectOnGround(p.mo)
	and p.redirecttimer >= 25
		p.mo.state = S_PLAY_REDIRECTFALL
	end
	if (p.mo.eflags & MFE_SPRUNG)
	and p.redirecttimer > 0
		p.redirecttimer = 0
		p.pflags = ($ & ~PF_STASIS|PF_JUMPSTASIS)
		p.mo.state = S_PLAY_SPRING
	end
end)