if GS_RAILS_SKINS==nil rawset(_G,"GS_RAILS_SKINS",{}) end --Make sure your own lump has this 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["sms"] return end

--Some adjustments for the fastest mod in SRB2 history!
--https://mb.srb2.org/threads/super-mystic-sonic-smsreborn-v3-2-boundless.28009/
GS_RAILS_SKINS["sms"] = {}
local SKIN = GS_RAILS_SKINS["sms"]

SKIN["S_SKIN"] = {
SIDEHOP = 69, --Nyoom
SIDEHOPARC = 4,
SIDEFLIP = SPR2_SPNG, --Ah, why not.
SIDEHOPTIME = 8,

AIRDRAG = 0,
EMERGENCYDROP = false,
CROUCH = true,
CROUCHBUTTON = BT_SPIN|BT_CUSTOM1|BT_CUSTOM2,
AUTOBALANCE = false,
SLOPEPHYSICS = true,
SLOPEMULT = 20,

MAXSPEED = 0,
STARTSPEEDMODIFIER = 10,
STARTSPEEDCONDITION = 35,

HEROESTWIST = 36,
TWISTBUTTON = BT_CUSTOM1|BT_CUSTOM2,
ACCELSPEED = 250,
ACCELCAP = 2005,
AUTODASHMODE = 125,

NOSIDEHOPGFX = 2,
}

--HMS and even some SMS animations don't use SPR_PLAY, so I'm making some custom behaviour here.
SKIN["CustomAnim"] = function(p, s, GS, rail, POSTTHINK, ANIMCALL) 
	if (POSTTHINK!=true) return false end
	if type(ANIMCALL)=="string" return end
	if p.hypermysticsonic
		s.sprite = SPR_HMSO
		if (p.cmd.buttons & BT_CUSTOM2) --Crouch, winding up for a superjump!
			s.frame = ($ & ~FF_FRAMEMASK)|F
		else
			s.frame = ($ & ~FF_FRAMEMASK)|((leveltime%2) and D or E)
		end
		GS.forcesprite = nil
	else
		if not (GS.railswitching and GS.forcesprite)
			s.sprite = SPR_SMSO --Yes, not SPR_PLAY!
			if (p.cmd.buttons & BT_CUSTOM2) --Crouch, winding up for a superjump!
				s.frame = ($ & ~FF_FRAMEMASK)|Q
				if GS.railspeed and rail --Slows you down, tho'.
					GS.railspeed = FixedDiv(FixedMul($,95),96)
				end
			elseif (p.cmd.buttons & BT_CUSTOM3) --Cool handstand trick!
				s.frame = ($ & ~FF_FRAMEMASK)|N
				if rail
					local TILT = GS.railtilt or 0
					if (TILT>=0) --What, you thought this shit was easy?!
						GS.railtilt = TILT+2
					else
						GS.railtilt = TILT-2
					end
				end
			else
				s.frame = ($ & ~FF_FRAMEMASK)|((leveltime%2) and M or L)
			end
		end
	end
	GS.animcall = "stop"
end

--First kick out legs before straightening out during a sidehop.
SKIN["PlayerThink"] = function(p, s, GS, rail)
	if ((GS.railswitching or 0) > 6) and not p.hypermysticsonic
		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]
			GS.forcesprite = SPR2_FALL
		end
	end
end

--First kick out legs before straightening out during a sidehop.
SKIN["GrindThinker"] = function(p, s, GS, rail)
	if not GS.speedtrail and (abs(GS.railspeed)> 99*s.scale)
		GS.speedtrail = 1
	end
end