addHook("PlayerThink", function(player)
	if player.mo.skin == "sonic"
	and player.ismach4 == true
	and player.mo.state == S_PLAY_DASH
	and player.dashmode > 3*TICRATE
		player.mo.state = S_PLAY_MACH4
	end
end)

addHook("PlayerThink", function(player)
	if player.mo.skin == "sonic"
	and player.ismach4 == false
	and player.mo.state == S_PLAY_MACH4
	and player.dashmode > 3*TICRATE
		player.mo.state = S_PLAY_DASH
	end
end)

addHook("PlayerThink", function(player)
	if player.mo.skin == "sonic"
	and player.dashmode < 3*TICRATE
		player.canmach4 = 0
		player.ismach4 = false
	end
end)

addHook("PlayerThink", function(player)
	if player.mo.skin == "sonic"
	and player.ismach4 == false
	and player.mo.state == S_PLAY_MACH4
		player.mo.state = S_PLAY_RUN
	end
end)

addHook("PlayerThink", function(player)
	if player.mo.skin == "sonic"
	and player.ismach4 == true
		player.normalspeed = $ + FRACUNIT
	elseif
		player.ismach4 == false
		and player.dashmode < 3*TICRATE
		player.normalspeed = 36*FRACUNIT
	end
end)

addHook("PlayerThink", function(p)
	if p.mo.skin == "sonic"
	and p.dashmode > 3*TICRATE
		p.canmach4 = $1+1
	end
end)

addHook("PlayerThink", function(p)
	if p.mo.skin == "sonic"
	and p.normalspeed > 91*FRACUNIT
		p.normalspeed = 92*FRACUNIT
	end
end)

addHook("PlayerThink", function(p)
	if p.mo.skin == "sonic"
	and p.ismach4 == true
		p.powers[pw_invulnerability] = 15
	end
end)

addHook("PlayerThink", function(p)
	if p.mo.skin == "sonic"
	and p.ismach4 == true
	and p.mo.state == S_PLAY_MACH4
	and (p.pflags & PF_STARTDASH)
		p.mo.state = S_PLAY_SPINDASH
	end
end)

addHook("PlayerThink", function(p)
	if p.mo.skin == "sonic"
	and p.ismach4 == true
	and p.mo.state == S_PLAY_MACH4
	and (p.pflags & PF_SPINNING)
		p.mo.state = S_PLAY_ROLL
	end
end)

addHook("PlayerThink", function(p)
	if p.mo.skin == "sonic"
	and p.ismach4 == true
	and p.mo.state == S_PLAY_MACH4
	and (p.pflags & PF_JUMPED)
		p.mo.state = S_PLAY_JUMP
	end
end)

addHook("PlayerThink", function(p)
	if p.mo.skin == "sonic"
    and p.ismach4 == true
	and not p.mo.state == S_PLAY_SPINDASH
        p.mo.friction = FRACUNIT
    else
		if (p.pflags & PF_STARTDASH)
		or p.mo.skin ~= "sonic"
		or p.ismach4 == false
		or p.mo.state == S_PLAY_SPINDASH
			p.mo.friction = 29*FRACUNIT/32
		end
    end
end)

addHook("PlayerThink", function(p)
	if p.mo.skin == "sonic"
	and p.ismach4 == true
	and p.canspawnthering == true
		local mach4ring = P_SpawnMobjFromMobj(p.mo, 0, 0, 0, MT_MACH4BOOSTRING)
		mach4ring.color = p.mo.color
		mach4ring.angle = p.cmd.angleturn << 16 + R_PointToAngle2(0, 0, p.cmd.forwardmove*FRACUNIT, -p.cmd.sidemove*FRACUNIT) + ANGLE_90
		mach4ring.scale = p.mo.scale
		mach4ring.destscale = p.mo.scale
		mach4ring.tics = 3
		p.canspawnthering = false
	end
end)

local function ringcheck(p)
	if p.mo.skin == "sonic"
	and p.dashmode < 3*TICRATE
	or p.ismach4 == false
		p.canspawnthering = true
	end
end

addHook("PlayerThink", ringcheck)

local function mach4ghost(p)
	if p.mo.skin == "sonic"
	and p.ismach4 == true
		local ghost = P_SpawnGhostMobj(p.mo) 
		ghost.fuse = 5
	end
end

addHook("PlayerThink", mach4ghost)