freeslot("sfx_drpdsh")
sfxinfo[sfx_drpdsh].caption = "Drop Dash"

addHook("PlayerThink", function(player)
	if player.dropdashcharged == nil
		player.dropdashcharged = false
	end
end)

freeslot(
"S_DROPDASH1",
"S_DROPDASH2",
"S_DROPDASH3",
"S_DROPDASH4",
"S_DROPDASH5",
"S_DROPDASH6",
"SPR_DRPD"
)

states[S_DROPDASH1] = {
	sprite = SPR_DRPD,
	frame = A,
	tics = 1,
	nextstate = S_DROPDASH2
}

states[S_DROPDASH2] = {
	sprite = SPR_DRPD,
	frame = B,
	tics = 1,
	nextstate = S_DROPDASH3
}

states[S_DROPDASH3] = {
	sprite = SPR_DRPD,
	frame = C,
	tics = 1,
	nextstate = S_DROPDASH4
}

states[S_DROPDASH4] = {
	sprite = SPR_DRPD,
	frame = D,
	tics = 1,
	nextstate = S_DROPDASH5
}

states[S_DROPDASH5] = {
	sprite = SPR_DRPD,
	frame = E,
	tics = 1,
	nextstate = S_DROPDASH6
}

states[S_DROPDASH6] = {
	sprite = SPR_DRPD,
	frame = F,
	tics = 1,
	nextstate = S_DROPDASH1
}

COM_AddCommand("truedropdash", function(p, arg)
	if arg == "off" then
		print("The Drop Dash is now off")
		p.truedropdash = 0
	elseif arg == "on" then
		print("The Drop Dash is now on")
		p.truedropdash = 1
	end
end)

addHook("PlayerThink", function(p)
	if p.truedropdash == nil
		p.truedropdash = 1
	end
end)

addHook("JumpSpinSpecial", function(player)
	if player.mo.skin == "sonic"
	and player.mo.state == S_PLAY_JUMP
	and not player.dropdashcharged
	and player.truedropdash == 1
		player.dropdashcharged = true
		S_StartSound(player.mo, sfx_drpdsh)
		player.mo.state = S_DROPDASH1
		return true
	end
end)

addHook("PlayerThink", function(player)
	if player.dropdashcharged
	and not (player.cmd.buttons & BT_SPIN)
		player.dropdashcharged = false
		player.mo.state = S_PLAY_JUMP
	end
	if player.dropdashcharged
	and player.powers[pw_super]
	and player.speed > 5*FRACUNIT
		player.dropdashcharged = false
	end
	if player.dropdashcharged
	and leveltime%2 == 1
	and player.mo.state >= S_DROPDASH1
		local ghost = P_SpawnGhostMobj(player.mo)
		ghost.colorized = true
		ghost.blendmode = AST_ADD
		ghost.renderflags = ghost.renderflags|FF_FULLBRIGHT
		ghost.fuse = 4
		ghost.frame = TR_TRANS40
	end
	if player.dropdashcharged
	and (player.powers[pw_justsprung] or player.mo.eflags & MFE_SPRUNG)
	or player.dropdashcharged
	and P_PlayerInPain(player)
	or player.dropdashcharged
	and P_CheckDeathPitCollide(player.mo, true)
		player.dropdashcharged = false
	end
	if player.dropdashcharged
	and not (player.mo.eflags & MFE_VERTICALFLIP)
		player.mo.spritexscale = FRACUNIT+player.mo.momz/96
		player.mo.spriteyscale = FRACUNIT-player.mo.momz/96
	else
		player.mo.spritexscale = FRACUNIT-player.mo.momz/96
		player.mo.spriteyscale = FRACUNIT+player.mo.momz/96
	end
	if not player.dropdashcharged
	and not (player.powers[pw_carry] == CR_NIGHTSMODE)
		player.mo.spritexscale = FRACUNIT
		player.mo.spriteyscale = FRACUNIT
	end
	if player.airtime == nil
		player.airtime = 0
	end
	if player.dropdashcharged
	and leveltime%1 == 1
		player.airtime = player.mo.momz --scraped
	end
	if not player.dropdashcharged
	and not (player.mo.eflags & MFE_JUSTHITFLOOR)
		player.airtime = 0
	end
	if player.dropdashcharged
	and player.playerstate == PST_DEAD
		player.dropdashcharged = false
	end
	if player.dropdashcharged
	and (P_IsObjectOnGround(player.mo) or (player.mo.eflags & MFE_JUSTHITFLOOR))
	and not P_CheckDeathPitCollide(player.mo, true)
		P_InstaThrust(player.mo, player.mo.angle, player.airtime*FRACUNIT)
		player.dropdashcharged = false
		S_StartSound(player.mo, sfx_zoom)
		player.pflags = $|PF_SPINNING
		player.mo.state = S_PLAY_ROLL
		for i = 0, 19
			local dust = P_SpawnMobj(player.mo.x,player.mo.y,player.mo.z,MT_SPINDUST)
			if dust and dust.valid
				P_InstaThrust(dust, i*20*ANG1, -13*FRACUNIT)
			end
		end
	end
end)

addHook("PlayerThink", function(p)
	if p.airtime == nil
		p.airtime = 0
	end
	if p.dropdashcharged
		p.airtime = $1+2
	else
		p.airtime = 0
	end
	if p.airtime > 82
		p.airtime = 82
	end
end)
	
addHook("PlayerThink", function(p)
	if p.mo.skin == "sonic"
	and (p.pflags & PF_SPINNING)
	and (p.pflags & PF_JUMPED)
		p.pflags = $ & ~PF_SPINNING
	end
end)

addHook("ShieldSpecial", function(player)
	if player.mo.skin == "sonic"
	and (player.powers[pw_shield] == SH_WHIRLWIND or player.powers[pw_shield] == SH_ELEMENTAL or player.powers[pw_shield] == SH_BUBBLEWRAP or player.powers[pw_shield] == SH_FORCE or player.powers[pw_shield] == SH_ATTRACT or player.powers[pw_shield] == SH_THUNDERCOIN or player.powers[pw_shield] == SH_FLAMEAURA or player.powers[pw_shield] == SH_ARMAGEDDON)
	and (player.cmd.buttons & BT_USE)
		player.dropdashcharged = true
		S_StartSound(player.mo, sfx_drpdsh)
		player.pflags = $|PF_JUMPED
		player.mo.state = S_DROPDASH1
	end
end)

addHook("PlayerThink", function(player)
	if player.dropdashcharged
	and player.mo.sprite ~= SPR_DRPD
		player.mo.state = S_DROPDASH1
	end
end)

//different button example for your character
addHook("PlayerThink", function(player)
	if player.mo.skin == "skinname"
	and player.mo.state == S_PLAY_JUMP
	and not player.dropdashcharged
	and (player.cmd.buttons & BT_CUSTOM1)
	and player.truedropdash == 1
		player.dropdashcharged = true
		S_StartSound(player.mo, sfx_drpdsh)
		player.mo.state = S_DROPDASH1
	end
end)

addHook("PlayerThink", function(player)
	if player.mo.skin ~= "skinname" return end

	if player.dropdashcharged
	and not (player.cmd.buttons & BT_CUSTOM1)
		player.dropdashcharged = false
		player.mo.state = S_PLAY_JUMP
	end
	if player.dropdashcharged
	and player.powers[pw_super]
	and player.speed > 5*FRACUNIT
		player.dropdashcharged = false
	end
	if player.dropdashcharged
	and leveltime%2 == 1
	and player.mo.state >= S_DROPDASH1
		local ghost = P_SpawnGhostMobj(player.mo)
		ghost.colorized = true
		ghost.blendmode = AST_ADD
		ghost.renderflags = ghost.renderflags|FF_FULLBRIGHT
		ghost.fuse = 4
		ghost.frame = TR_TRANS40
	end
	if player.dropdashcharged
	and (player.powers[pw_justsprung] or player.mo.eflags & MFE_SPRUNG)
	or player.dropdashcharged
	and P_PlayerInPain(player)
	or player.dropdashcharged
	and P_CheckDeathPitCollide(player.mo, true)
		player.dropdashcharged = false
	end
	if player.dropdashcharged
	and not (player.mo.eflags & MFE_VERTICALFLIP)
		player.mo.spritexscale = FRACUNIT+player.mo.momz/96
		player.mo.spriteyscale = FRACUNIT-player.mo.momz/96
	else
		player.mo.spritexscale = FRACUNIT-player.mo.momz/96
		player.mo.spriteyscale = FRACUNIT+player.mo.momz/96
	end
	if player.dropdashcharged
	and player.playerstate == PST_DEAD
		player.dropdashcharged = false
	end
	if not player.dropdashcharged
	and not (player.powers[pw_carry] == CR_NIGHTSMODE)
		player.mo.spritexscale = FRACUNIT
		player.mo.spriteyscale = FRACUNIT
	end
	if player.dropdashcharged
	and (P_IsObjectOnGround(player.mo) or (player.mo.eflags & MFE_JUSTHITFLOOR))
	and not P_CheckDeathPitCollide(player.mo, true)
		P_InstaThrust(player.mo, player.mo.angle, player.airtime*FRACUNIT) --make sure to get the airtime stuff above
		player.dropdashcharged = false
		S_StartSound(player.mo, sfx_zoom)
		player.pflags = $|PF_SPINNING
		player.mo.state = S_PLAY_ROLL
		for i = 0, 19
			local dust = P_SpawnMobj(player.mo.x,player.mo.y,player.mo.z,MT_SPINDUST)
			if dust and dust.valid
				P_InstaThrust(dust, i*20*ANG1, -13*FRACUNIT)
			end
		end
	end
end)
	
addHook("PlayerThink", function(p)
	if p.mo.skin == "skinname"
	and (p.pflags & PF_SPINNING)
	and (p.pflags & PF_JUMPED)
		p.pflags = $ & ~PF_SPINNING
	end
end)

addHook("ShieldSpecial", function(player)
	if player.mo.skin == "skinname"
	and (player.powers[pw_shield] == SH_WHIRLWIND or player.powers[pw_shield] == SH_ELEMENTAL or player.powers[pw_shield] == SH_BUBBLEWRAP or player.powers[pw_shield] == SH_FORCE or player.powers[pw_shield] == SH_ATTRACT or player.powers[pw_shield] == SH_THUNDERCOIN or player.powers[pw_shield] == SH_FLAMEAURA or player.powers[pw_shield] == SH_ARMAGEDDON)
	and (player.cmd.buttons & BT_CUSTOM1)
		player.dropdashcharged = true
		S_StartSound(player.mo, sfx_drpdsh)
		player.pflags = $|PF_JUMPED
		player.mo.state = S_DROPDASH1
	end
end)

addHook("PlayerThink", function(player)
	if player.mo.skin ~= "skinname" return end

	if player.dropdashcharged
	and player.mo.sprite ~= SPR_DRPD
		player.mo.state = S_DROPDASH1
	end
end)