freeslot("S_XTREME_SPINSLASH", "S_XTREME_SPINSLASH2", "S_XTREME_VICTORY", "S_XTREME_VICTORY2")

states[S_XTREME_SPINSLASH] = {SPR_PLAY, SPR2_TIRE|FF_ANIMATE, 8, nil, 7,  1, S_XTREME_SPINSLASH2}
states[S_XTREME_SPINSLASH2] = {SPR_PLAY, SPR2_FLY|FF_ANIMATE, -1, nil, 7,  1, S_XTREME_SPINSLASH2}
states[S_XTREME_VICTORY] = {SPR_PLAY, SPR2_MLEE|FF_SPR2ENDSTATE, 3, nil, S_XTREME_VICTORY2,  0, S_XTREME_VICTORY}
states[S_XTREME_VICTORY2] = {SPR_PLAY, SPR2_MLEE, -1, nil, 0, 0, S_PLAY_STND}
freeslot("sfx_slash1","sfx_slash2","sfx_slash3")
sfxinfo[sfx_slash1].caption = "Spinslash Start"
sfxinfo[sfx_slash2].caption = "Spinslash"
sfxinfo[sfx_slash2].singular = true
sfxinfo[sfx_slash3].caption = "Spinslash End"
sfxinfo[sfx_s255].caption = "Spinslash Hit"

//Kirby Support
if not(kirbyabilitytable)
	rawset(_G, "kirbyabilitytable", {})
end
kirbyabilitytable["xtreme"] = 6

//Music
//Original Reusable template by Katmint.
/*
addHook("MusicChange", function(oldname, newname)
	if consoleplayer
		local character = skins[consoleplayer.skin].name
		if character == "xtreme" //skin to use custom themes
			if newname == "_super" //intercept and override jingles
				if consoleplayer.hyper and consoleplayer.hyper.capable
					return "xhyper"
				else
					return "xsuper"
				end
			elseif newname == "_inv"
				return "xinv"
			elseif newname == "_shoes"
				return "xshoes"
			end
		end
	end
end)
*/
//Music
addHook("PlayerThink", function(player)
	if (player.mo.valid) and (player.mo.skin == "xtreme")
		player.hassupermusic = true
		if player.powers[pw_super]
			if player.hyper and player.hyper.capable
				S_ChangeMusic("xhyper", true, player)
			else
				S_ChangeMusic("xsuper", true, player)
			end
		elseif player.powers[pw_invulnerability]
			S_ChangeMusic("xinv", true, player)
		elseif player.powers[pw_sneakers]
			S_ChangeMusic("xshoes", true, player)
		//else
			//P_RestoreMusic(player)
		end
	end
end)
//Classic spindash behavior by rumia1!
addHook("ThinkFrame", do
	for player in players.iterate
		if player.mo and player.mo.valid
		and not (player.mo.state == S_PLAY_DEAD)
			if(player.mo.skin == "xtreme")
				if player.mo.sprite2 == SPR2_FLY_
				or player.mo.sprite2 == SPR2_TIRE
					player.mo.spritexscale = 5*FRACUNIT/4
					player.mo.spriteyscale = 5*FRACUNIT/4
				else
					player.mo.spritexscale = FRACUNIT
					player.mo.spriteyscale = FRACUNIT
				end
			//setting up the variable to check for how many charges the current spindash has
				if player.spincharges == nil
					player.spincharges = 0
				end
			//this one checks how long the spindash has been held for
				if player.dashtime == nil
				or not (player.pflags & PF_STARTDASH)
					player.dashtime = 15
				end
			//and this one checks how many automatic charges we've added, as we can only have 4
				if player.dashcounter == nil
				or not (player.pflags & PF_STARTDASH)
					player.dashcounter = 0
				end
			//checks if player was holding jump last frame
				if player.jumpwasdown == nil
					player.jumpwasdown = 0
				end
				
				if player.forwardwasdown == nil
					player.forwardwasdown = 0
				end
				if player.backwasdown == nil
					player.backwasdown = 0
				end
				if player.leftwasdown == nil
					player.leftwasdown = 0
				end
				if player.rightwasdown == nil
					player.rightwasdown = 0
				end
				
			//makes our life easier
 				if player.pflags & PF_STARTDASH
 					player.dashspeed = player.maxdash
 					player.mindash = player.maxdash - (21*player.dashspeed)
 				end
		
				if player.dashcounter >= 3
					player.dashcounter = 3
				end
				if player.dashtime <= 0
					player.dashtime = 15
				end
				if testing == true then print(player.dashcounter, player.dashtime, player.dashspeed/FRACUNIT, player.spincharges) end
				if (player.pflags & PF_STARTDASH)
					player.jumpfactor = 0
					player.dashtime = $ - 1
					if player.spincharges == 0
						player.mindash = 23*FRACUNIT
						player.maxdash = 25*FRACUNIT
						player.mindash = player.maxdash - (21*player.dashspeed)
					else
						player.maxdash = (25*FRACUNIT) + (player.spincharges*(5*FRACUNIT))
					end
					if (player.cmd.forwardmove >= 25)
					and not (player.forwardwasdown)
					or (player.cmd.forwardmove <= -25)
					and not (player.backwasdown)
					or (player.cmd.sidemove >= 25)
					and not (player.rightwasdown)
					or (player.cmd.sidemove <= -25)
					and not (player.leftwasdown)
					or (player.cmd.buttons & BT_JUMP)
					and not (player.jumpwasdown)
						if player.spincharges < 15
							player.spincharges = $ + 1
						else
							player.spincharges = 15
						end
						S_StopSound(player.mo)
						S_StartSound(player.mo, 478 + player.spincharges)
					end

				else
					player.jumpfactor = skins[player.mo.skin].jumpfactor
					player.spincharges = 0
				end
			//Our "was jump pressed last frame?" check ends here
				player.jumpwasdown = (player.cmd.buttons & BT_JUMP)
				if (player.cmd.forwardmove >= 25)
					player.forwardwasdown = 1
				else
					player.forwardwasdown = 0
				end
				if (player.cmd.forwardmove <= -25)
					player.backwasdown = 1
				else
					player.backwasdown = 0
				end
				if (player.cmd.sidemove >= 25)
					player.rightwasdown = 1
				else
					player.rightwasdown = 0
				end
				if (player.cmd.sidemove <= -25)
					player.leftwasdown = 1
				else
					player.leftwasdown = 0
				end
			end
		end
	end
end)

//Animation Speed fix + Momentum Stuff
addHook("ThinkFrame", do
	for player in players.iterate
		if (player.mo and player.mo.valid and player.mo.skin == "xtreme")
			if (player.speed > player.normalspeed)
			and P_IsObjectOnGround(player.mo)
			and (player.cmd.forwardmove or player.cmd.sidemove)
			and not (player.pflags & PF_SPINNING)
				player.mo.friction = FRACUNIT-256
			end
			
			if (player.pflags & PF_SPINNING)
			and (player.pflags & PF_JUMPED)
				player.pflags = $ & ~PF_SPINNING
			end
			
			if (player.mo.state == S_PLAY_RUN) and (player.speed > 50*FRACUNIT)
				player.mo.state = S_PLAY_DASH
			elseif (player.mo.state == S_PLAY_DASH) and (player.speed < 48*FRACUNIT)
				player.mo.state = S_PLAY_RUN
			end
			
			if (player.mo.state == S_PLAY_ROLL) and (player.speed > 50*FRACUNIT)
				player.mo.state = S_PLAY_GLIDE
			elseif (player.mo.state == S_PLAY_GLIDE) and (player.speed < 48*FRACUNIT)
				player.mo.state = S_PLAY_ROLL
			end

			
			if (player.mo.state == S_PLAY_JUMP) and (player.speed > 50*FRACUNIT)
				player.mo.state = S_PLAY_GLIDE
			elseif (player.mo.state == S_PLAY_GLIDE)  and (player.speed < 48*FRACUNIT)
				player.mo.state = S_PLAY_JUMP
			end
			
			if player.walkspeed == nil
				player.walkspeed = 0
			end
			
			if player.speed >= 8*FU
				player.walkspeed = 1
			else
				player.walkspeed = 2
			end
			
			if player.runningspeed == nil
				player.runningspeed = 0
			end
			
			if player.speed >= 24*FU
				player.runningspeed = 1
			else
				player.runningspeed = 2
			end
			
			if (player.mo.state == S_PLAY_STND)
				if (player.mo.anim_duration > 3)
					player.mo.anim_duration = 3
				end
			elseif (player.mo.state == S_PLAY_WAIT)
				if (player.mo.anim_duration > 4)
					player.mo.anim_duration = 4
				end
			elseif (player.mo.state == S_PLAY_SKID)
				if not (player.mo.frame&FF_ANIMATE) player.mo.frame = $|FF_ANIMATE end
				if (player.mo.anim_duration > 1)
					player.mo.anim_duration = 1
				end
			elseif (player.mo.state == S_PLAY_WALK)
				if (player.mo.tics >= 2)
					player.mo.tics = player.walkspeed
				end
			elseif (player.mo.state == S_PLAY_RUN)
				if (player.mo.tics >= 2)
					player.mo.tics = player.runningspeed
				end
			elseif (player.mo.state == S_PLAY_DASH)
				if (player.mo.tics >= 2)
					player.mo.tics = 1
				end
			elseif (player.mo.state == S_PLAY_GLIDE)
				if (player.mo.tics >= 2)
					player.mo.tics = 1
				end
			else
				continue
			end
		end
	end
end)

//Spin Slash Starter
addHook("AbilitySpecial", function(player)
	if not (player.mo and player.mo.valid and player.mo.skin == "xtreme")  return end
	if player.pflags&PF_THOKKED or player.spinslash return true end
	player.mo.momz = (max(min(P_GetMobjGravity(player.mo),FRACUNIT/2),FRACUNIT/-2)*-10)
	player.charability = CA_GLIDEANDCLIMB
	player.pflags = $|PF_THOKKED&~PF_NOJUMPDAMAGE
	player.spinslash = 1
	player.mo.state = S_XTREME_SPINSLASH
	S_StartSoundAtVolume(player.mo,sfx_slash1,192)
	return true
end)

//Make the Spin Slash block one attack
addHook("MobjDamage", function(target, inflictor, source, damage, damagetype)
	if not (target and target.valid and target.player and target.skin == "xtreme"
	and target.player.spinslash) return end
	target.player.spinslash = 0
	if (damagetype&DMG_DEATHMASK) or (CBW_Battle and source and source.valid and source.player) return end
	local i = 0 while i < 10
		S_StopSound(target)
		i = $+1
	end
	S_StartSound(target,sfx_s255)
	target.player.pflags = $&~PF_JUMPED
	target.state = S_PLAY_SPRING
	target.player.powers[pw_flashing] = 7
	target.momz = $+(max(min(P_GetMobjGravity(target),FRACUNIT/2),FRACUNIT/-2)*-15)
	if inflictor and inflictor.valid
		target.player.drawangle = R_PointToAngle2(target.x-target.momx,target.y-target.momy,inflictor.x-inflictor.momx,inflictor.y-inflictor.momy)
		P_InstaThrust(target, target.player.drawangle, -10*FRACUNIT)
		target.momx = inflictor.momx target.momy = $+inflictor.momy target.momz = $+inflictor.momz
	end
	return true
end, MT_PLAYER)

//Damage while Spin Slashing, to insure it happens
addHook("PlayerCanDamage", function(player, mobj)
	if player.mo and player.mo.valid and player.mo.skin == "xtreme"
	and player.spinslash
	return true end
end)

//Battle Support
local ScriptLoaded = false
addHook("ThinkFrame", function()
	if not(CBW_Battle) or ScriptLoaded then return end
	ScriptLoaded = true
	
	CBW_Battle.CharShieldMax["xtreme"] = 0
	//CBW_Battle.ActionChar["xtreme"] = CBW_Battle.Action.SuperSpinJump
	
	local function GarbagePriority2(player)
		if player and player.mo and player.mo.skin == "xtreme"
		and player.spinslash
			if player.spinslash > 1
				CBW_Battle.SetPriority(player,1,1,nil,1,1)
			else
				CBW_Battle.SetPriority(player,1,2,nil,1,2)
			end
		end
	end

	CBW_Battle.AddPriorityFunction("spinslash",GarbagePriority2)

	CBW_Battle.AddCharPriority("xtreme","basic","spinslash")
	print("xtreme priority script has been loaded.")
end)

//Get rings from shield monitors instead of shields in Battle
local shieldtorings = function(target, inflictor, source)
	if source and source.valid and source.player and source.skin == "xtreme"
	and CBW_Battle and CBW_Battle.BattleGametype and not (gametyperules&GTR_FRIENDLY)
		target.type = MT_RING_BOX
	end
end

addHook("MobjDeath", function(target, inflictor, source) shieldtorings(target, inflictor, source)
end,MT_PITY_BOX)
addHook("MobjDeath", function(target, inflictor, source) shieldtorings(target, inflictor, source)
end,MT_ATTRACT_BOX)
addHook("MobjDeath", function(target, inflictor, source) shieldtorings(target, inflictor, source)
end,MT_FORCE_BOX)
addHook("MobjDeath", function(target, inflictor, source) shieldtorings(target, inflictor, source)
end,MT_ARMAGEDDON_BOX)
addHook("MobjDeath", function(target, inflictor, source) shieldtorings(target, inflictor, source)
end,MT_WHIRLWIND_BOX)
addHook("MobjDeath", function(target, inflictor, source) shieldtorings(target, inflictor, source)
end,MT_ELEMENTAL_BOX)
addHook("MobjDeath", function(target, inflictor, source) shieldtorings(target, inflictor, source)
end,MT_FLAMEAURA_BOX)
addHook("MobjDeath", function(target, inflictor, source) shieldtorings(target, inflictor, source)
end,MT_BUBBLEWRAP_BOX)
addHook("MobjDeath", function(target, inflictor, source) shieldtorings(target, inflictor, source)
end,MT_THUNDERCOIN_BOX)

//Jumping out of the Spin Slash
addHook("JumpSpecial", function(player)
	if not (player.mo and player.mo.valid and player.mo.skin == "xtreme")  return end
	if player.spinslash and (player.climbing or P_IsObjectOnGround(player.mo))
		if not (player.pflags & PF_JUMPDOWN)
			player.spinslash = 0
			local climb = false
			if player.climbing climb = true end
			P_DoJump(player,false)
			if climb player.mo.momz = $*2 end
			S_StartSound(player.mo,sfx_jump)
			player.mo.state = S_PLAY_ROLL --NO MORE SPRING STATE
			player.pflags = $|PF_JUMPED&~PF_THOKKED 
		end
	return true end
end)

//Jumping out of the Spin Slash but with Spin
addHook("SpinSpecial", function(player)
	if not (player.mo and player.mo.valid and player.mo.skin == "xtreme")  return end
	if player.spinslash and player.spinslash <= 2
	and (player.climbing or P_IsObjectOnGround(player.mo))
		if not (player.cmd.buttons & BT_JUMP)
			if player.climbing
				player.spinslash = 3
				player.timire = 0
				player.pflags= $|PF_JUMPSTASIS&~PF_THOKKED 
			elseif not (player.pflags & PF_USEDOWN)
				if S_SoundPlaying(player.mo, sfx_slash2)
					local i = 0 while i < 10
						S_StopSound(player.mo)
						i = $+1
					end
					S_StartSound(player.mo,sfx_s255)
				end
				player.spinslash = 0
				player.mo.momx = 0 player.mo.momy = 0
				player.speed = 0
				player.pflags= $&~PF_THOKKED 
				return false
			end
		else
			return true
		end
	elseif player.mo.eflags & MFE_JUSTHITFLOOR
	and player.mo.state == S_PLAY_GLIDE
		S_StartSound(player.mo,sfx_spin)
	end
end)

//Reset the Variable on spawn
addHook("PlayerSpawn", function(player)
	player.spinslash = 0

	//Remove Shields in Battle Mod
	if player.mo and player.mo.valid and player.mo.skin == "xtreme"
	and CBW_Battle and CBW_Battle.BattleGametype and not (gametyperules&GTR_FRIENDLY)
	and player.powers[pw_shield] != SH_NONE and player.powers[pw_shield] != SH_FIREFLOWER
		if player.powers[pw_shield]&SH_FIREFLOWER
			player.powers[pw_shield] = SH_FIREFLOWER
		else
			player.powers[pw_shield] = SH_NONE
		end
	end
end)

//Allow me to access whatever line was collided with this frame
//This is to prevent latching onto objects
//It's also supposed to prevent latching onto invisible walls, but it only works sometimes
addHook("MobjLineCollide", function(mobj, line)
	if mobj and mobj.valid and mobj.player and mobj.skin == "xtreme"
	and mobj.player.spinslash and not mobj.player.climbing
		local dumbangle = R_PointToAngle2(mobj.x, mobj.y,  P_ClosestPointOnLine(mobj.x, mobj.y, line))
		local platx = P_ReturnThrustX(mobj, dumbangle, mobj.radius + FixedMul(10*FRACUNIT, mobj.scale))
		local platy = P_ReturnThrustY(mobj, dumbangle, mobj.radius + FixedMul(10*FRACUNIT, mobj.scale))
		local glidesector = R_PointInSubsector(mobj.x + platx, mobj.y + platy)
		local ceilingheight = glidesector.sector.ceilingheight
		if glidesector.sector.c_slope ceilingheight = P_GetZAt(glidesector.sector.c_slope, mobj.x, mobj.y) end
		if ceilingheight < mobj.z
		and glidesector.sector.ceilingpic == "F_SKY1"
			mobj.player.spinslashslashline = nil
		else
			mobj.player.spinslashslashline = line
		end
	end
end, MT_PLAYER)

addHook("PostThinkFrame", do
	for player in players.iterate
		if player.spinslashslashline player.spinslashslashline = nil end
		
		if player.spinslash and player.mo.state != S_PLAY_FLY
		and player.mo.state != S_XTREME_SPINSLASH
		and player.mo.state != S_XTREME_SPINSLASH2
			if player.spinslash >= 2
				player.mo.state = S_PLAY_FLY
				player.mo.frame = A
				if P_IsObjectOnGround(player.mo) and not player.climbing
					player.panim = PA_IDLE
				end
			else
				player.mo.state = S_XTREME_SPINSLASH2
			end
		end
	end
end)

//Getting stuck on walls
addHook("MobjMoveBlocked", function(mobj)
	if mobj and mobj.valid and mobj.player and mobj.skin == "xtreme"
	and mobj.player.spinslash and not mobj.player.climbing
	and mobj.player.spinslashslashline and mobj.player.spinslashslashline.valid
		mobj.charability = CA_GLIDEANDCLIMB
		mobj.player.spinslash = 2
		mobj.player.timire = 0
		local i = 0 while i < 10
			S_StopSound(mobj)
			i = $+1
		end
		//Super Form Wall Slam
		if mobj.player.speed > skins[mobj.player.mo.skin].normalspeed
		and mobj.player.powers[pw_super]
			S_StartSound(smo, sfx_s3k5f, player)
			//P_StartQuake(FRACUNIT*40, TICRATE/4)
			P_RadiusAttack(mobj,mobj,1536*FRACUNIT*2)
		end
		S_StartSound(mobj,sfx_s255, player)
		//local prevmomx = mobj.momx local prevmomy = mobj.momy
		//P_BounceMove(mobj)
		//mobj.player.drawangle = R_PointToAngle2(mobj.momx, mobj.momy, 0,0)
		mobj.player.drawangle = R_PointToAngle2(mobj.x, mobj.y, P_ClosestPointOnLine(mobj.x, mobj.y, mobj.player.spinslashslashline))
		mobj.angle = mobj.player.drawangle
		//mobj.momx = prevmomx mobj.momy = prevmomy
		mobj.player.climbing = 7
	end
end, MT_PLAYER)

//Prevent climbing around on walls when latched to them
addHook("PreThinkFrame", do
	for player in players.iterate
		if player.mo and player.mo.valid and player.mo.skin == "xtreme"
		and player.spinslash and (player.climbing or P_IsObjectOnGround(player.mo))
			player.cmd.forwardmove = 0
			player.cmd.sidemove = 0
		end
	end
end)

//Spike Destroyer
local xtremespike = function(thing, tmthing)
  if not (thing and thing.valid and tmthing and tmthing.valid) return end
	if tmthing.player and tmthing.skin == "xtreme" and (abs(thing.z - tmthing.z) <= 60*tmthing.scale)
		if tmthing.player.spinslash == 1
			local bottomheight = tmthing.z
			local topheight = tmthing.z + tmthing.height

			if (tmthing.eflags & MFE_VERTICALFLIP)
				local swap = bottomheight
				bottomheight = topheight
				topheight = swap
			end

			if not ((P_MobjFlip(tmthing)*(bottomheight - (thing.z + thing.height/2)) > 0)
			and (P_MobjFlip(tmthing)*(tmthing.momz - thing.momz) < 0)) then return end
			
			P_KillMobj(thing, tmthing, tmthing)
			return true
		end
	end
end
addHook("MobjCollide", function(thing, tmthing) xtremespike(thing, tmthing) end, MT_SPIKE)
addHook("MobjCollide", function(thing, tmthing) xtremespike(thing, tmthing) end, MT_WALLSPIKE)

//Win Animation and Spin Slash
addHook("PlayerThink", function(player)
	if not (player.mo and player.mo.valid and player.mo.skin == "xtreme") return end
	
	//Remove Shields in Battle Mod
	if CBW_Battle and CBW_Battle.BattleGametype and not (gametyperules&GTR_FRIENDLY)
	and player.powers[pw_shield] != SH_NONE and player.powers[pw_shield] != SH_FIREFLOWER
		S_StartSound(player.mo,sfx_lose,player)
		local smoke = P_SpawnMobjFromMobj(player.mo,0,0,0,MT_DUST)
		smoke.scale = $*4
		if player.powers[pw_shield]&SH_FIREFLOWER
			player.powers[pw_shield] = SH_FIREFLOWER
		else
			player.powers[pw_shield] = SH_NONE
		end
	end

	//Disallows the rest of the code in certain circumstances
	if P_PlayerInPain(player)
	or (player.pflags & PF_SLIDING)
	or player.powers[pw_carry] != CR_NONE
	or player.spectator
	or player.playerstate != PST_LIVE
	or not player.mo.health
	or player.panim == PA_PAIN
	or player.powers[pw_super] == 1
	or player.iseggrobo
	or player.powers[pw_nocontrol] > 0
	or player.mo.eflags & MFE_SPRUNG
	or (player.mo.recoilthrust != nil and player.mo.recoilthrust != 0)
	or player.actionstate
	or player.exiting != 0
		player.charability = CA_NONE
		if S_SoundPlaying(player.mo, sfx_s3kd8l)
			local i = 0 while i < 10
				S_StopSound(player.mo)
				i = $+1
			end
		end
		player.spinslash = 0
		if player.exiting
			if (player.mo.state != S_XTREME_VICTORY)
			and (player.mo.state != S_XTREME_VICTORY2)
				player.mo.state = S_XTREME_VICTORY
				player.mo.momx = 0
				player.mo.momy = 0
				return
			end
		end
	else
	
	if player.spinslash
		player.charability = CA_GLIDEANDCLIMB
		player.charflags = $ | SF_CANBUSTWALLS
		player.pflags = $&~PF_APPLYAUTOBRAKE
		if not P_IsObjectOnGround(player.mo) player.pflags = $|PF_THOKKED end
		player.skidtime = 0
		
		//Break Floors
		local sectorthing = P_PlayerTouchingSectorSpecial(player, 0, 0)
		if sectorthing.valid then
			for fof in sectorthing.ffloors()
				if fof.valid and (fof.flags & FF_BUSTUP) and (fof.flags & FF_EXISTS)
				and (abs(fof.topheight - player.mo.z) <= 40*player.mo.scale) then
					EV_CrumbleChain(player.sectorthing, fof)
				end
			end
		end
		
		if player.spinslash > 2
			if not (player.cmd.buttons&BT_JUMP) player.pflags=$|PF_JUMPSTASIS end
			player.mo.state = S_XTREME_SPINSLASH2
			player.mo.frame = (player.timire%8)
			if P_IsObjectOnGround(player.mo)
			or ((not (player.cmd.buttons & BT_USE) or not player.climbing)
			and player.timire > 2)
				player.pflags=$|PF_JUMPSTASIS
				S_StartSound(player.mo,sfx_zoom)
				player.climbing = 0
				player.spinslash = 0
				player.mo.state = S_PLAY_ROLL
				player.pflags = $|PF_SPINNING
				local dashspeed = min((23*FRACUNIT)+(player.timire*FRACUNIT*2/3),70*FRACUNIT)
				player.mo.momz = FixedMul(dashspeed, P_GetMobjGravity(player.mo)*2/-3)
				if player.cmd.forwardmove < 0 player.mo.momz = $*-1 end
			else
				if player.spinslashslashline and player.spinslashslashline.valid
					player.drawangle = R_PointToAngle2(player.mo.x, player.mo.y, P_ClosestPointOnLine(player.mo.x, player.mo.y, player.spinslashslashline))
					player.mo.angle = player.drawangle
				end
				local dashspeed = min((23*FRACUNIT)+(player.timire*FRACUNIT*2/3),70*FRACUNIT)
				local dust = P_SpawnMobjFromMobj(player.mo,P_ReturnThrustX(nil,player.mo.angle,player.mo.radius),
				P_ReturnThrustY(nil,player.mo.angle,player.mo.radius),0,MT_SPINDUST)
				dust.angle = player.drawangle
				P_Thrust(dust, dust.angle, FRACUNIT*P_RandomByte()/-32)
				dust.angle = $+ANGLE_90
				P_Thrust(dust, dust.angle, FRACUNIT*P_SignedRandom()/-16)
				dust.momz = dashspeed/-16
				if dashspeed < 70*FRACUNIT and not (player.timire%10)
					S_StartSound(player.mo, sfx_spndsh)
				end
				player.timire = $+1
			end
			
		elseif player.spinslash == 2
			player.mo.state = S_PLAY_FLY
			player.mo.frame = A
			if player.mo.eflags&MFE_JUSTHITFLOOR S_StartSound(player.mo,sfx_s255) end
			if P_IsObjectOnGround(player.mo) and not player.climbing
				player.panim = PA_IDLE
				player.mo.momx = player.cmomx*20/19
				player.mo.momy = player.cmomy*20/19
				player.mo.momz = 0
			end
			player.timire = $+1
		elseif P_IsObjectOnGround(player.mo)
			player.pflags = $|PF_JUMPSTASIS
			player.spinslash = 2
			player.timire = 0
			local i = 0 while i < 10
				S_StopSound(player.mo)
				i = $+1
			end
			S_StartSound(player.mo,sfx_s255)
		else
			S_StartSoundAtVolume(player.mo,sfx_slash2,192)
			player.pflags = $|PF_JUMPSTASIS
			player.mo.momz = $+(P_GetMobjGravity(player.mo)/-2)
		end
	else
		player.charability = CA_NONE
		player.charflags = SF_SUPER
		if player.mo.state == S_XTREME_SPINSLASH
		or player.mo.state == S_XTREME_SPINSLASH2
		or player.mo.state == S_PLAY_FLY
			player.mo.state = S_PLAY_FALL
		end
	end
	end
end)