-- Improved lightdash, made by TeriosSonic
-- Original by Badz
-- thx for letting me use dis 
freeslot(
"S_PLAY_LDSH", "S_PLAY_LDSH2")

states[S_PLAY_LDSH] = {SPR_PLAY, SPR2_GLIDE|FF_ANIMATE|FF_SPR2MIDSTART, 1, A_HomingChase, 50*FRACUNIT, 0, S_PLAY_LDSH2}
states[S_PLAY_LDSH2] = {SPR_PLAY, SPR2_GLIDE|FF_ANIMATE|FF_SPR2MIDSTART, 2, A_GhostMe, 0, 0, S_PLAY_ROLL}

addHook("ThinkFrame", do
	for player in players.iterate
		player.lightdash = $1 // Whether they are currently lightdashing and how many tics they have left before they stop picking up on other rings
		player.custom1down = $1 // Whether they are currently holding down custom button 1
		
		if player.lightdash == nil
			player.lightdash = 0
		end
		if player.custom1down == nil
			player.custom1down = 1
		end
		
		if player.mo and player.mo.skin == "sonic" or player.blueshoes -- are u an adventure boi
			if (((player.cmd.buttons & BT_CUSTOM1) and not player.custom1down) or player.lightdash > 0)
//			and not (player.pflags & PF_NIGHTSMODE)
			and not (player.pflags & PF_STASIS)
			and not (player.pflags & PF_JUMPSTASIS)
			and not (player.pflags & PF_SPINNING)
			and not (player.powers[pw_shield] == SH_ATTRACT)
			and not (player.mo.state == player.mo.info.painstate)
				A_FindTarget (player.mo, MT_RING, 0)
				if player.mo.target
				and player.mo.target.type == MT_RING //Prevents lightdashing into bosses!
					A_CheckTrueRange (player.mo, 160, S_PLAY_LDSH)
				end
				
				if player.mo.state >= S_PLAY_LDSH and player.mo.state <= S_PLAY_LDSH2 //after that, if you are lightdashing, set the lightdash counter to 5 tics
					player.lightdash = 5
				end
			else
				player.lightdash = 0 // Kill it if these conditions aren't met
			end
		end
		
		if (player.cmd.buttons & BT_CUSTOM1)
			player.custom1down = true
		else
			player.custom1down = false
		end
		
		if (player.lightdash > 0)
			player.lightdash = $1 - 1
		end
-- Here is a little script so you hurt enemies when lightdashing much better than the sa2/sa1
		if player.mo.state == S_PLAY_LDSH
		or player.mo.state == S_PLAY_LDSH2
		and not (player.pflags & PF_JUMPED)
			player.pflags = $ | PF_JUMPED
		end
	end
end)

addHook("SpinSpecial", function(p)
	 if p.mo.skin == "sonic"
	 if (p.speed > 5*FRACUNIT and p.pflags & PF_STARTDASH) then return true end
	   p.mindash = 56*FRACUNIT
	   p.maxdash = 91*FRACUNIT
	
	  if P_IsObjectOnGround(p.mo) and p.mo.state != S_PLAY_SPINDASH and p.charability2 ==
 CA2_SPINDASH and not (p.pflags & (PF_USEDOWN|PF_SPINNING)) and not (p.mo.eflags & MFE_SPRUNG) then
        
        p.cmomx = 5 * cos(p.mo.angle)
	    p.cmomy = 5 * sin(p.mo.angle)
	    p.mo.cmomx = p.cmomx
	    p.mo.cmomy = p.cmomy
	    p.dashspeed = p.mindash
	    p.mo.state = S_PLAY_SPINDASH
	    p.pflags = $ | (PF_USEDOWN|PF_STARTDASH|PF_SPINNING)
	    S_StartSound(p.mo, sfx_spndsh)
		p.mo.ghs = P_SpawnGhostMobj(p.mo)
		p.mo.ghs.scale = (p.mo.scale*(p.mindash/FRACUNIT))/20
		p.mo.ghs.destscale = p.mo.scale
		p.mo.ghs.scalespeed = $*2
		p.mo.ghs.flags = $|MF_NOCLIPHEIGHT|MF_NOCLIP & ~MF_SOLID
		p.mo.ghs.z = p.mo.z-p.mo.ghs.scale*10
	    return true
    end
    if P_IsObjectOnGround(p.mo) and p.pflags & PF_SPINNING and p.mo.state == S_PLAY_ROLL and
not (p.pflags & (PF_USEDOWN|PF_STARTDASH)) then
        p.mo.state = S_PLAY_RUN
		p.pflags = ($ & ~PF_SPINNING) | PF_USEDOWN
		return true
	else if p.mo.eflags & MFE_SPRUNG then
		p.mo.state = S_PLAY_ROLL
		p.pflags = $|PF_SPINNING
			end
		end
	end
end)

//Movement while spinning by Krimps (I think)
addHook("PlayerThink",function(p)
 if p.mo.skin == "sonic"
	and p.pflags & PF_SPINNING
	and not (p.pflags & PF_STARTDASH) 
	and P_IsObjectOnGround then
		if p.cmd.forwardmove ~= 0
		or p.cmd.sidemove ~= 0
		or p.camangle == nil
		or p.mo.eflags & MFE_SPRUNG then
			p.camangle = p.cmd.angleturn<<16 + R_PointToAngle2(0, 0, p.cmd.forwardmove*FRACUNIT, -p.cmd.sidemove<<16)
		end
		p.movespd = R_PointToDist2(p.mo.x, p.mo.y, p.mo.x + p.mo.momx, p.mo.y + p.mo.momy)
		P_InstaThrust(p.mo,R_PointToAngle2(p.mo.x - p.mo.momx,p.mo.y - p.mo.momy,p.mo.x + P_ReturnThrustX(p.mo,p.camangle,p.movespd),p.mo.y + P_ReturnThrustY(p.mo,p.camangle,p.movespd)),p.movespd)
	else
		p.camangle = nil
	end
end)





addHook("SpinSpecial", function(p)
	 if p.mo.skin == "blueshoessonic"
	 if (p.speed > 5*FRACUNIT and p.pflags & PF_STARTDASH) then return true end
	   p.mindash = 56*FRACUNIT
	   p.maxdash = 91*FRACUNIT
	
	  if P_IsObjectOnGround(p.mo) and p.mo.state != S_PLAY_SPINDASH and p.charability2 ==
 CA2_SPINDASH and not (p.pflags & (PF_USEDOWN|PF_SPINNING)) and not (p.mo.eflags & MFE_SPRUNG) then
        
        p.cmomx = 5 * cos(p.mo.angle)
	    p.cmomy = 5 * sin(p.mo.angle)
	    p.mo.cmomx = p.cmomx
	    p.mo.cmomy = p.cmomy
	    p.dashspeed = p.mindash
	    p.mo.state = S_PLAY_SPINDASH
	    p.pflags = $ | (PF_USEDOWN|PF_STARTDASH|PF_SPINNING)
	    S_StartSound(p.mo, sfx_spndsh)
		p.mo.ghs = P_SpawnGhostMobj(p.mo)
		p.mo.ghs.scale = (p.mo.scale*(p.mindash/FRACUNIT))/20
		p.mo.ghs.destscale = p.mo.scale
		p.mo.ghs.scalespeed = $*2
		p.mo.ghs.flags = $|MF_NOCLIPHEIGHT|MF_NOCLIP & ~MF_SOLID
		p.mo.ghs.z = p.mo.z-p.mo.ghs.scale*10
	    return true
    end
    if P_IsObjectOnGround(p.mo) and p.pflags & PF_SPINNING and p.mo.state == S_PLAY_ROLL and
not (p.pflags & (PF_USEDOWN|PF_STARTDASH)) then
        p.mo.state = S_PLAY_RUN
		p.pflags = ($ & ~PF_SPINNING) | PF_USEDOWN
		return true
	else if p.mo.eflags & MFE_SPRUNG then
		p.mo.state = S_PLAY_ROLL
		p.pflags = $|PF_SPINNING
			end
		end
	end
end)

//Movement while spinning by Krimps (I think)
addHook("PlayerThink",function(p)
 if p.mo.skin == "blueshoessonic"
	and p.pflags & PF_SPINNING
	and not (p.pflags & PF_STARTDASH) 
	and P_IsObjectOnGround then
		if p.cmd.forwardmove ~= 0
		or p.cmd.sidemove ~= 0
		or p.camangle == nil
		or p.mo.eflags & MFE_SPRUNG then
			p.camangle = p.cmd.angleturn<<16 + R_PointToAngle2(0, 0, p.cmd.forwardmove*FRACUNIT, -p.cmd.sidemove<<16)
		end
		p.movespd = R_PointToDist2(p.mo.x, p.mo.y, p.mo.x + p.mo.momx, p.mo.y + p.mo.momy)
		P_InstaThrust(p.mo,R_PointToAngle2(p.mo.x - p.mo.momx,p.mo.y - p.mo.momy,p.mo.x + P_ReturnThrustX(p.mo,p.camangle,p.movespd),p.mo.y + P_ReturnThrustY(p.mo,p.camangle,p.movespd)),p.movespd)
	else
		p.camangle = nil
	end
end)