if GS_RAILS_SKINS==nil rawset(_G,"GS_RAILS_SKINS",{}) end  --Make sure your own lump has this line too!

local RAIL = GS_RAILS if RAIL and RAIL.blockload return end --Don't include this part in your own file
if GS_RAILS_SKINS["knuckles"] return end 

--Knuckles is VERY similar to Sonic, but heavier and thus more affected by slopes. Grinding+Gliding is one powerful combo! 
GS_RAILS_SKINS["knuckles"] = {}
local SKIN = GS_RAILS_SKINS["knuckles"]

SKIN["S_SKIN"] = {
SIDEHOP = 35,
SIDEHOPARC = -8, --Very heavy sidehop that sends him downwards.
SIDEHOPTIME = 11, 
SLOPEMULT = 30, --Affected very strongly by slopes, negatively and positively!
HEROESTWIST = 12, --Lamer Heroes Twist.
}

SKIN["PreAttach"] = function(p, s, GS, rail)
	if (p.pflags & PF_GLIDING) --Slow down a bit when landing on a rail gliding.
		s.momx,s.momy = $*7/8, $*7/8
	end
end

SKIN["CustomJump"] = function(p, s, GS,rail, SIDEJUMP)
	p.pflags = $|PF_JUMPDOWN & ~(PF_GLIDING|PF_THOKKED)
	if GS_RAILS.GrindState(s, "hang")
	or GS.JumpRamp and GS.JumpRamp.timer
	or GS.LTAB and GS.LTAB.snappedtofloor==true
	or GS.walljump and GS.walljump.timer
		return --
	end
	GS.forcesprite = SPR2_LAND
	if GS.railspeed and (abs(GS.railspeed) < 60*s.scale)
		GS.railspeed = ($*7/6) --Gain a bit of speed from regular jumps.
	end
end
SKIN["CustomSideHop"] = function(p, s, GS,rail, SIDEJUMP)
	p.pflags = $|PF_JUMPDOWN & ~(PF_GLIDING|PF_THOKKED)
	if GS_RAILS.GrindState(s, "hang") return end
	GS.forcesprite = SPR2_LAND
end

SKIN["PlayerThink"] = function(p, s, GS,rail)
	if GS.railswitching
		if (p.pflags & (PF_JUMPED|PF_NOJUMPDAMAGE)) and not GS.grinding and not P_IsObjectOnGround(s)
		and not (p.pflags & (PF_THOKKED|PF_SLIDING|PF_SPINNING|PF_STARTDASH)) and not p.powers[pw_carry]	
			if (GS.railswitching > 1)
				if (p.pflags & (PF_JUMPED|PF_NOJUMPDAMAGE)) and not GS.grinding and not P_IsObjectOnGround(s)
				and not (p.pflags & (PF_THOKKED|PF_SLIDING|PF_SPINNING|PF_STARTDASH)) and not p.powers[pw_carry]
					p.pflags = $|PF_JUMPDOWN & ~(PF_GLIDING|PF_THOKKED)
					if (GS.railswitching < 6)
						GS.forcesprite = SPR2_SPIN
					elseif (GS.railswitching > 10)
						GS.forcesprite = SPR2_LAND
					else
						if (s.state!=S_PLAY_FALL)
							s.state = S_PLAY_FALL
						end
						s.tics,s.anim_duration = 1,1
					end
				end
			elseif (p.cmd.buttons & BT_JUMP)
				p.pflags = $ & ~PF_JUMPDOWN --Auto glide with your momentum going forwards!
				local ghs = P_SpawnGhostMobj(s)
				ghs.scale = s.scale
				ghs.fuse,ghs.tics = 7,8
				ghs.momx,ghs.momy = s.momx/2,s.momy/2
				ghs.destscale = 1
				if (s.momz*P_MobjFlip(s) < 0)
					s.momz = $/2 --Negate falling speed!
				end				
				local THRUST = abs(s.momx)+abs(s.momy)
				s.momx,s.momy = $-(s.momx/3), $-(s.momy/3)
				P_Thrust(s, p.drawangle, ((THRUST/3)>40*s.scale) and max(40*s.scale, THRUST/4) or THRUST/3)
				S_StartSoundAtVolume(s, sfx_s1b8, 190)
			end
		end
	end
end