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["tails"] return end

--Adjustments for Tails, who kind of sucks at grinding, but can accelerate himself very easily and has a minimum speed.
GS_RAILS_SKINS["tails"] = {}
local SKIN = GS_RAILS_SKINS["tails"]

SKIN["S_SKIN"] = {
SIDEHOP = 32,
SIDEHOPARC = 20, --Has a big, slow, clumsy sidehop.
SIDEHOPTIME = 13,

CROUCH = false, --Cannot Focus Grind.
AUTOBALANCE = true,

STARTMODIFIER = -50,
SLOPEMULT = -8, --Tails is less affected by slopes, both positively and negatively.
HEROESTWIST = 14, 
ACCELSPEED = 60, --Tails can spin his tails to accelerate!
MINSPEED = 8,
MAXSPEED = 148, --Lowest maxspeed of all characters.
}

--All this for the stupid tails...
SKIN["CustomAnim"] = function(p, s, GS, rail, POSTTHINK, ANIMCALL)
	if (POSTTHINK!=true) return false end 
	
	local tails = p.followmobj
	if tails and tails.valid and not (tails.flags2 & MF2_DONTDRAW)
		local SPRITE2 = (s.sprite2&~FF_SPR2SUPER)
		if not ((SPRITE2 >= SPR2_TAL0) and (SPRITE2 <= SPR2_XTRA))
		and (SPRITE2!=SPR2_DEAD) and (SPRITE2!=SPR2_DRWN)
			if (p.cmd.forwardmove > 32) and not (GS.flipanim)
				if (tails.state!=S_TAILSOVERLAY_RUN)
					tails.state = S_TAILSOVERLAY_RUN
					tails.tics, tails.anim_duration = 1,1
				end
				if ANIMCALL=="forcebutnotskip" and rail and rail.valid and ((GS.grinding or 0)>3)
					local CONVEYOR = (rail.GSconveyor) and rail.GSconveyor<<16 or 0
					if not (abs(GS.railspeed+CONVEYOR) > 47*s.scale)   --Speed lines!
						RAIL.SpeedLines(s, GS, RAIL.ANG(rail)+GS.raildirection)
					end
					if not S_SoundPlaying(s, sfx_putput)
						S_StartSoundAtVolume(s, sfx_putput, 99)
					end	
				end			
			elseif (tails.state!=S_TAILSOVERLAY_STAND)
				tails.state = S_TAILSOVERLAY_STAND
				tails.tics, tails.anim_duration = 3,3
			end
			
			tails.frame = ($ & ~FF_FRAMEMASK)|((leveltime%4==0) and D or (leveltime%3==0) and C or (leveltime%2==0) and B or A)
			if not (s.flags2 & MF2_DONTDRAW)
				tails.flags2 = $ & ~MF2_DONTDRAW
			end
			local RAD = max(s.radius/3, 13*s.scale) / ((tails.state==S_TAILSOVERLAY_RUN) and 1 or 3)
			P_MoveOrigin(tails, s.x-FixedMul(RAD, cos(p.drawangle)), s.y-FixedMul(RAD, sin(p.drawangle)), s.z)
			if tails and tails.valid
				tails.rollangle = s.rollangle
				tails.mirrored = s.mirrored
				tails.spritexoffset,tails.spriteyoffset = s.spritexoffset,s.spriteyoffset
				tails.spritexscale,tails.spriteyscale = s.spritexscale,s.spriteyscale	
				tails.angle = p.drawangle
			end
			if GS.animcall=="flipanim"
				GS.animcall = "stop"
			end
		end
	end
end
	
--Aaaand AGAIN for hanging.
SKIN["CustomHangAnim"] = function(p, s, GS, rail)	
	local tails = p.followmobj
	if tails and tails.valid and not (tails.flags2 & MF2_DONTDRAW)
		local SPRITE2 = (s.sprite2&~FF_SPR2SUPER)
		if (p.cmd.forwardmove > 32)
			if (tails.state!=S_TAILSOVERLAY_RUN)
				tails.state = S_TAILSOVERLAY_RUN
				tails.tics, tails.anim_duration = 1,1
			end
			if rail and rail.valid and ((GS.grinding or 0)>3)
				local CONVEYOR = (rail.GSconveyor) and rail.GSconveyor<<16 or 0
				if not (abs(GS.railspeed+CONVEYOR) > 47*s.scale)   --Speed lines!
					RAIL.SpeedLines(s, GS, RAIL.ANG(rail)+GS.raildirection)
				end
				if not S_SoundPlaying(s, sfx_putput)
					S_StartSoundAtVolume(s, sfx_putput, 99)
				end
			end
		elseif (tails.state!=S_TAILSOVERLAY_STAND)
			tails.state = S_TAILSOVERLAY_STAND
			tails.tics, tails.anim_duration = 3,3
		end
		tails.frame = ($ & ~FF_FRAMEMASK)|((leveltime%4==0) and D or (leveltime%3==0) and C or (leveltime%2==0) and B or A)
		local RAD = max(s.radius/3, 13*s.scale) / ((tails.state==S_TAILSOVERLAY_RUN) and 1 or 3)
		P_MoveOrigin(tails, s.x-FixedMul(RAD, cos(p.drawangle)), s.y-FixedMul(RAD, sin(p.drawangle)), s.z)
		if tails and tails.valid
			tails.rollangle = s.rollangle
			tails.mirrored = s.mirrored
			tails.spritexoffset,tails.spriteyoffset = s.spritexoffset,s.spriteyoffset+(6<<16)
			tails.spritexscale, tails.spriteyscale = s.spritexscale,s.spriteyscale	
			tails.angle = p.drawangle
		end
	end
end

--Make sure the tails are fixed when we're done!
SKIN["PostExit"] = function(p, s) 
	local tails = p.followmobj
	if tails and tails.valid
		tails.frame = $ & ~FF_VERTICALFLIP
		tails.scale = s.scale
		tails.rollangle = s.rollangle
		tails.mirrored = s.mirrored
		tails.spritexoffset,tails.spriteyoffset = s.spritexoffset,s.spriteyoffset
		tails.spritexscale,tails.spriteyscale = s.spritexscale,s.spriteyscale
	end
end

--And now this for the SA2-trick.
SKIN["PlayerThink"] = function(p, s, GS, rail)
	if not (GS) return end local tails = p.followmobj
	if not (tails and tails.valid) return end --
	
	if not (GS.grinding) //GS.JumpRamp or GS.leftrail or GS.failroll or GS.railswitching or GS
		tails.rollangle = s.rollangle
		tails.mirrored = s.mirrored
		tails.spritexoffset,tails.spriteyoffset = s.spritexoffset,s.spriteyoffset
		tails.spritexscale,tails.spriteyscale = s.spritexscale,s.spriteyscale	
	end
end	