freeslot(
	"S_PLAY_SLIDE",
	"SPR2_SLID",
	"sfx_slidev"
)

states[S_PLAY_SLIDE] = {
	sprite = SPR_PLAY,
	frame = SPR2_SLID,
	tics = 1,
	nextstate = S_PLAY_SLIDE
}

sfxinfo[sfx_slidev].caption = "Slide"

addHook("PlayerThink", function(p)
	if p.mo.skin == "alm"
	and p.almslide == nil
		p.almslide = false
	end
	if p.mo.skin == "alm"
	and p.alreadyplayedtheslidesound == nil
		p.alreadyplayedtheslidesound = false
	end
end)

local function slide(p)
	if p.mo.skin == "alm"
	and not p.woag
	and P_IsObjectOnGround(p.mo)
	and p.speed >= 13*FRACUNIT
	and (p.cmd.buttons & BT_CUSTOM3)
	and not (p.pflags & PF_STARTDASH)
		p.mo.state = S_PLAY_SLIDE
		p.pflags = $|PF_SPINNING
		p.almslide = true
	end
	if p.mo.skin == "alm"
	and p.almslide == true
		p.canboost = false
	end
end

addHook("PlayerThink", slide)


addHook("PlayerThink", function(p)
	if p.mo.skin == "alm"
	and p.almslide == true
	and p.speed < 13*FRACUNIT
	and not (p.pflags & PF_STARTDASH)
		p.mo.friction = 29*FRACUNIT/32
		p.mo.state = S_PLAY_WALK
		p.pflags = $ & ~PF_SPINNING
		p.almslide = false
	end
end)

addHook("PlayerThink", function(p)
	if p.mo.skin == "alm"
	and not P_IsObjectOnGround(p.mo)
	and p.almslide
	and not (p.pflags & PF_JUMPED)
		p.mo.state = S_PLAY_FALL
		p.pflags = $ & ~PF_SPINNING
		p.almslide = false
	end
end)

addHook("PlayerThink", function(p)
	if p.mo.skin == "alm"
	and (p.pflags & PF_JUMPED)
	and (p.pflags & PF_SPINNING)
		p.pflags = $ & ~PF_SPINNING
	end
end)

addHook("PlayerThink", function(p)
	if not (p.mo and p.mo.valid)
	or p.mo.skin ~= "alm" return end
	
	if p.almslide
		P_ButteredSlope(p.mo)
		p.spinitem = MT_NULL
	else
		p.spinitem = MT_THOK
	end
end)

addHook("PlayerThink", function(p)
	if p.mo.skin == "alm"
	and p.almslide == true
	and p.alreadyplayedtheslidesound == false
		S_StartSound(p.mo, sfx_slidev)
		p.alreadyplayedtheslidesound = true
	end
	if p.mo.skin == "alm"
	and p.almslide == false
		p.alreadyplayedtheslidesound = false
	end
end)


addHook("MobjMoveCollide", function(mo, spike) -- Spike breaking by ARJr.
    if mo.valid
    and (mo.type == MT_PLAYER)
	and mo.player.almslide
    and spike.type == MT_SPIKE
		if (spike.z >= (mo.z - 16*FRACUNIT)) and (spike.z <= (mo.z + mo.height + 16*FRACUNIT))
			P_KillMobj(spike, mo, mo)
		elseif (spike.flags2 & MF2_OBJECTFLIP)
		and (spike.z <= (mo.z - 16*FRACUNIT)) and (spike.z >= (mo.z + mo.height+ 16*FRACUNIT))
			P_KillMobj(spike, mo, mo)
        end
    end
end)

addHook("PlayerThink", function(p)
	if p.mo.skin == "alm"
	and p.almslide == true
		p.charflags = $|SF_CANBUSTWALLS
	else
		if p.mo.skin == "alm"
		and p.almslide == false
		and p.boosting == false
			p.charflags = $ & ~SF_CANBUSTWALLS
		end
	end
end)

addHook("PlayerCanDamage", function(p)
	if p.mo.state == S_PLAY_SLIDE
		return true
	end
end)

addHook("PlayerThink", function(p)
	if p.mo.skin == "alm"
	and p.mo.state ~= S_PLAY_SLIDE
		p.almslide = false
	end
end)

addHook("PlayerHeight", function(p)
	if not (p.mo and p.mo.valid)
	or p.mo.skin ~= "alm" return end
	
	if p.almslide return P_GetPlayerSpinHeight(p) end
end)

addHook("PlayerCanEnterSpinGaps", function(p)
	if not (p.mo and p.mo.valid)
	or p.mo.skin ~= "alm" return end
	
	if p.almslide return true end
end)