local speedmult = 1
local speeddiv = 1
local airspeed = false
local walldmg = false
local sneaker = 1
local sneakerbuffer = 0
addHook("PlayerThink", do
    for player in players.iterate
		if G_IsSpecialStage() == false then
			if (airspeed or (player.mo.z <= player.mo.floorz or (player.mo.z >= (player.mo.ceilingz - player.height) and (player.mo.eflags & MFE_VERTICALFLIP)))) and (not (player.pflags & PF_SPINNING) or player.speed < player.normalspeed*speedmult/speeddiv) and not ((player.pflags & PF_STASIS) or (player.pflags & PF_FULLSTASIS)) then
				P_InstaThrust(player.mo, player.mo.angle, player.normalspeed*speedmult/speeddiv*sneaker)
				player.speed = player.normalspeed*speedmult/speeddiv*sneaker
			end
			if (player.mo.z <= player.mo.floorz or (player.mo.z >= (player.mo.ceilingz - player.height) and (player.mo.eflags & MFE_VERTICALFLIP))) and not (player.pflags & PF_SPINNING) then
				player.mo.state = S_PLAY_RUN
			end
			if player.powers[pw_pushing] and walldmg then
				P_DamageMobj(player.mo, enemy, enemy, DMG_INSTAKILL)
			end
			
			if player.powers[pw_sneakers] > 0 and sneaker == 1 then
				sneaker = 2
				sneakerbuffer = 0
			elseif sneakerbuffer > 4 then
				//player.powers[pw_sneakers] is only correct every 4th frame for some reason so sneakerbuffer checks if its 0 for more than 4 frames
				sneaker = 1
				sneakerbuffer = 0
			elseif player.powers[pw_sneakers] == 0 and sneaker == 2 then
				sneakerbuffer = sneakerbuffer + 1
			end
		end
    end
end)

local function SpeedMult(p, field)
    if (field ~= nil) then
        speedmult = tonumber(field)
		print("speed multiplier is now "+tostring(speedmult))
    end
end

local function SpeedDiv(p, field)
    if (field ~= nil) then
        speeddiv = tonumber(field)
		print("speed divider is now "+tostring(speeddiv))
    end
end

local function ChangeAirSpeed(p, field)
	if field == "true" or field == "1" then
		airspeed = true
		print("air speed is now on")
	else
		airspeed = false
		print("air speed is now off")
	end
end

local function ChangeWallDamage(p, field)
	if field == "true" or field == "1" then
		walldmg = true
		print("wall damage is now on")
	else
		walldmg = false
		print("wall damage is now off")
	end
end

local function ShowSpeed(p)
	if sneaker > 1 then
		print("Speed: "+tostring(p.normalspeed*speedmult/speeddiv*sneaker)+" ("+p.normalspeed+" * "+speedmult+" / "+speeddiv+" * "+sneaker+" (super sneakers) )")
	else
		print("Speed: "+tostring(p.normalspeed*speedmult/speeddiv)+" ("+p.normalspeed+" * "+speedmult+" / "+speeddiv+")")
	end
end

COM_AddCommand("multiplier", SpeedMult)
COM_AddCommand("divider", SpeedDiv)
COM_AddCommand("airspeed", ChangeAirSpeed)
COM_AddCommand("walldamage", ChangeWallDamage)
COM_AddCommand("showspeed", ShowSpeed)
