//Shity Thicc
freeslot("S_LOGIC_DROPDASH")

states[S_LOGIC_DROPDASH] = {
        sprite = SPR_PLAY,
        frame = SPR2_TIRE|FF_ANIMATE,
        tics = -1,
		var1 = 0,
        var2 = 1,
        nextstate = S_LOGIC_DROPDASH
}

local mincharge = 25
local maxcharge = 70

local function CheckPlayerFlags(player)
	if player.powers[pw_carry]
	or P_PlayerInPain(player)
	or (player.pflags & PF_SLIDING)
	return false
	else
	return true
	end
end

addHook("PlayerThink", function(player)
	if player.mo
	and player.playerstate == PST_LIVE
	and not player.powers[pw_super]
	and player.mo.skin == "(ns)"
	and player.mo.valid
	local mo = player.mo
		if P_IsObjectOnGround(mo) and mo.dropdash ~= nil
			if mo.dropdash ~= false and mo.dropdash >= 0 and player.cmd.buttons & BT_USE
				if mo.flags2 & MF2_TWOD or player.pflags & PF_ANALOGMODE
					P_InstaThrust(mo, mo.angle, mo.dropdash*FRACUNIT)
				else
					P_InstaThrust(mo, player.cmd.angleturn*FRACUNIT, mo.dropdash*FRACUNIT)
				end
				S_StartSound(mo, sfx_zoom)
				player.pflags = $ | PF_SPINNING
				mo.state = S_PLAY_ROLL
				if mo.emeraldpower
				P_Earthquake(player.mo, player.mo, 512*FRACUNIT)
				P_StartQuake(8*FRACUNIT, 15, {0, 0, 0}, player.mo.radius)
				S_StartSound(player.mo, sfx_s3k5f)
				end
			end
			mo.dropdash = nil
		end
		if type(mo.dropdash) == "number"
			if player.cmd.buttons & BT_USE and player.pflags & PF_JUMPED
			mo.dropdash = $ + 1
				if mo.dropdash < mincharge
				and not (mo.dropdash < 1)
				mo.dropdash = mincharge
				end
				if mo.dropdash >= maxcharge
				mo.dropdash = maxcharge
				end
				if mo.dropdash == 0
				S_StartSound(mo, sfx_spin)
				player.pflags = $1 & ~PF_SPINNING
				mo.state = S_LOGIC_DROPDASH
				end
			else
			mo.dropdash = false
				if player.powers[pw_justsprung]
				or (player.mo.eflags & MFE_SPRUNG)
				mo.state = S_PLAY_SPRING
				mo.momz = $*5/4
				mo.momx = $*5/4
				mo.momy = $*5/4
				S_StartSound(mo, sfx_sprong)
				else
					if CheckPlayerFlags(player)
					mo.state = S_PLAY_JUMP
					player.pflags = $1|(PF_JUMPED|PF_THOKKED)
					end
				end
			end
		end
		if not CheckPlayerFlags(player)
		mo.dropdash = false
		end
	end
end)

addHook("SpinSpecial", function(player)
	if not player.mo
	or (player.mo.skin ~= "(ns)")
	or player.pflags & PF_USEDOWN
	or not (player.pflags & PF_JUMPED)
	or player.mo.dropdash ~= nil
	or player.powers[pw_justsprung]
	or not CheckPlayerFlags(player)
		return
	end
	
	if player.powers[pw_shield] & ~SH_FIREFLOWER == SH_WHIRLWIND
		P_DoJumpShield(player)
		player.mo.state = S_PLAY_ROLL
	end
	
	player.mo.dropdash = -8
end)