--alt slope physics, stronger slope going down, easier going up
--air speed easing, good for speed mods
CV_RegisterVar({
	name = "slopefactor",
	defaultvalue = "128",
	flags = CV_NETVAR,
	PossibleValue = CV_Natural 

})
CV_RegisterVar({
	name = "slopefactordivisor",
	defaultvalue = "4",
	flags = CV_NETVAR,
	PossibleValue = CV_Natural 

})
CV_RegisterVar({
	name = "aireasefactor",
	defaultvalue = "22",
	flags = CV_NETVAR,
	PossibleValue = CV_Natural 

})
CV_RegisterVar({
	name = "airminspeed",
	defaultvalue = "120",
	flags = CV_NETVAR,
	PossibleValue = CV_Natural 

})
CV_RegisterVar({
	name = "ignoremapheader",
	defaultvalue = "Off",
	flags = CV_NETVAR,
	PossibleValue = CV_OnOff 

})
local localversion = 01
rawset(_G,"altslopeaircapver",localversion)

--run once or newer version
if localversion < altslopeaircapver then return end

addHook("MobjThinker",function(mo)
	if not mo or mo and not mo.valid then return end
	local forcescript = CV_FindVar("ignoremapheader").value
	--map header based unless you dont want to
	if not mapheaderinfo[gamemap].slpaireastest 
	and not forcescript then return end

	local p= mo.player

	--alt slopep hysic code
	p.smva = R_PointToAngle2(0,0,mo.momx, mo.momy)
	p.sfh = 0
	p.sbh = 0
	p.mszd = 0
	if not p.arsipdeas then p.arsipdeas = 0 end
	if not p.slpfrc then p.slpfrc = 0 end
	local slpfrocfactor = CV_FindVar("slopefactor").value
	local airspdcapfactor = CV_FindVar("aireasefactor").value
	local slopeforcedampening = CV_FindVar("slopefactordivisor").value
	local airspeedeaseminspeed = CV_FindVar("airminspeed").value
	local ground = P_IsObjectOnGround(mo)
	local spd = K_GetKartSpeed(p,false)
	local slope = mo.standingslope
	p.sfh = P_FloorzAtPos(p.mo.x+P_ReturnThrustX(p.mo,p.smva,32*FRACUNIT),
						 p.mo.y+P_ReturnThrustY(p.mo,p.smva,32*FRACUNIT),
						 p.mo.z,p.mo.height)

	p.sbh = P_FloorzAtPos(p.mo.x+P_ReturnThrustX(p.mo,p.smva-ANGLE_180,32*FRACUNIT),
						 p.mo.y+P_ReturnThrustY(p.mo,p.smva-ANGLE_180,32*FRACUNIT),
						p.mo.z, p.mo.height)
	p.mszd = FixedDiv((p.sbh-p.sfh), 64*FRACUNIT) --formula to get slope zdelta 

	//negative goes up up positive goes down
	if p.slpfrc < p.mszd then p.slpfrc = min($+slpfrocfactor*2,p.mszd) end
	if p.slpfrc > p.mszd then p.slpfrc = max($-slpfrocfactor,p.mszd) end

	if slope and p.speed >= 8*FRACUNIT then
		--give more speed when going down any slope
		p.kartstuff[k_speedboost] = $ + (max(0,p.slpfrc/slopeforcedampening))
		p.kartstuff[k_accelboost] = $ + abs(p.slpfrc*2)
		if p.slpfrc < 0 then
			if not(slope.flags & SL_NOPHYSICS) then
				--only help to climb up slope with physics
				p.kartstuff[k_accelboost] = $ + abs(p.slpfrc*8)
			end
		else
			--give some small extra acceleration when going down slopes
			p.kartstuff[k_accelboost] = $ + abs(p.slpfrc*2)			
		end
	end

	--air easing code
	if ground then
		p.arsipdeas = 0
	else
		p.arsipdeas = $ + airspdcapfactor
		if p.speed > spd*airspeedeaseminspeed/100
		and not p.kartstuff[k_pogospring]
		and not(p.cmd.buttons & BT_ACCELERATE) then
			--speed above 120%
			mo.momx = FixedDiv($,FRACUNIT+p.arsipdeas)
			mo.momy = FixedDiv($,FRACUNIT+p.arsipdeas)
			mo.momz = FixedDiv($,FRACUNIT+p.arsipdeas)
		end
	end
	
end,MT_PLAYER)