local p = player
local frac = FRACUNIT

freeslot("sfx_boost")

addHook("ThinkFrame", function()
	for p in players.iterate do
		if not (p.mo and (p.mo.skin == "frontiersclassic" or p.mo.skin == "knuckles")) then return end
		
		if not (p.cmd.buttons & BT_FIRENORMAL) then -- flight button press
			p.c1ready = true
			p.c1 = false
		elseif p.c1ready then
			p.c1 = true
			p.c1ready = false
		else
			p.c1 = false
		end
		
		if p.powers[pw_super]
			if p.flying and p.c1
				p.flying = false
			elseif not p.flying and not P_IsObjectOnGround(p.mo) and p.c1
				p.flying = true
			end
		end
		
		if not p.powers[pw_super]
		and p.flying
			p.flying = false
		end
		
		if p.flying == nil
			p.flying = false
		end
		
		if P_IsObjectOnGround(p.mo)
			p.flying = false
		end
		
		if p.flying
			if (p.cmd.buttons & BT_JUMP)
				if p.mo.momz <= 20*frac
					p.mo.momz = p.mo.momz + 2*frac
				end
			elseif (p.cmd.buttons & BT_SPIN)
				if p.mo.momz >= -20*frac
					p.mo.momz = p.mo.momz - 2*frac
				end
			else
				if p.mo.momz >= 2*frac
					p.mo.momz = p.mo.momz - 1*frac
				elseif p.mo.momz <= -2*frac
					p.mo.momz = p.mo.momz + 2*frac
				elseif p.mo.momz > -2*frac and p.mo.momz < 2*frac
					p.mo.momz = 0
				end
			end
			
			if p.mo.skin == "frontiersclassic"
				if p.speed > 45*frac
					p.mo.state = S_PLAY_FLOAT_RUN
				else
					p.mo.state = S_PLAY_FLOAT
				end
			elseif p.mo.skin == "knuckles"
				if p.speed > 45*frac
					p.mo.state = S_PLAY_GLIDE
				else
					p.mo.state = S_PLAY_FALL
				end
			end
		end
	end
end)

addHook("AbilitySpecial", function()
	for p in players.iterate
		if not (p.mo and p.mo.skin == "frontiersclassic") then return end
		if not (p.pflags & PF_THOKKED)
			P_InstaThrust(p.mo, p.mo.angle, p.actionspd + 10*frac)
			S_StartSound(nil, sfx_thok, p)
		end
	end
end)