// HUGGIES //
// reused from my knight mod lmao //
if not SpeccyHugs then
freeslot("S_PLAY_SPECCYHUGS", "SPR2_HUG_", "S_SoundPlaying", "S_PLAY_BDOVE")
states[S_PLAY_SPECCYHUGS] = {SPR_PLAY, SPR2_HUG_, -1, nil, 0, 0, S_PLAY_STND}
states[S_PLAY_BDOVE] = {SPR_PLAY, SPR2_FALL|FF_ANIMATE, 3, nil, 0, 0, S_PLAY_BDOVE}
rawset(_G, "SpeccyHugs", {})

	local function CheckObject(refmo, foundmo)
		local p2 = foundmo.player

		-- Make sure the player exists.
		if not p2 or not p2.valid then return end

		local p = refmo.player

		-- Make sure we're on the floor.
		if not P_IsObjectOnGround(refmo) or not P_IsObjectOnGround(foundmo) then return end

		-- No NiGHTS.
		if (p.powers[pw_carry] & CR_NIGHTSMODE) return end

		-- Make sure the player is alive.
		if p2.playerstate ~= PST_LIVE return end

		-- No hugging the enemy!
		if p.ctfteam ~= p2.ctfteam return end

		-- Distance check.
		local dist = P_AproxDistance(P_AproxDistance(foundmo.x - refmo.x, foundmo.y - refmo.y), foundmo.z - refmo.z)

		if dist <= 48*refmo.scale then
			P_SpawnLockOn(p, foundmo, S_LOCKON2)

			if (p.cmd.buttons & BT_TOSSFLAG) then
				p.tossflagbtn = $ and $+1 or 1
			else
				p.tossflagbtn = nil
			end

			if p.tossflagbtn == 1 then
				if not p.hugging then
					p.hugging = {p2}
				else
					p.hugging[#p.hugging + 1] = p2
				end
				p2.hugged = p
				S_StartSound(refmo, sfx_s3k4a)
				S_StartSound(refmo, sfx_cdpcm6)
			end
		end
	end

	addHook("PlayerThink", function(p)
		-- lmao.
		if not p.mo or not p.mo.valid then return end

		-- There would be nobody to hug.
		if not multiplayer then return end

		-- Only do this for characters that support it.
		if not SpeccyHugs[p.mo.skin] then return end

		if p.hugging then
			local p2, cancel

			for i = 1, #p.hugging do
				p2 = p.hugging[i]
				p2.hugged = p

				-- Force to look at eachother.
				p.drawangle = R_PointToAngle2(p.mo.x, p.mo.y, p2.mo.x, p2.mo.y)

				-- Stop movement.
				p.powers[pw_nocontrol] = 5
				p2.powers[pw_nocontrol] = 5
				p.pflags = $|PF_STASIS -- Recognise as
				p2.pflags = $|PF_STASIS -- a hug.
				p.mo.momx, p.mo.momy = 0, 0
				p2.mo.momx, p2.mo.momy = 0, 0

				-- Force state.
				if p.mo.state ~= S_PLAY_SPECCYHUGS then p.mo.state = S_PLAY_SPECCYHUGS end
				p.mo.frame = A

				-- Cancel Hug.
				if (p.cmd.buttons & BT_JUMP) or (p2.cmd.buttons & BT_JUMP) or P_PlayerInPain(p) or p.mo.dying or not P_IsObjectOnGround(p.mo) then
					cancel = true
				end
			end

			-- The hug was cancelled.
			if cancel then
				for i = 1, #p.hugging do
					p2 = p.hugging[i]
					p2.hugged = nil
					p2.pflags = $ & ~PF_STASIS
				end

				p.hugging = nil
				p.pflags = $ & ~PF_STASIS
				p.mo.state = S_PLAY_STND
			end

			return
		end

		searchBlockmap("objects", CheckObject, p.mo)
	end)

	addHook("MapChange", function()
		for p in players.iterate do
			if p.hugging then
				for i = 1, #p.hugging do
					p2 = p.hugging[i]
					p2.hugged = nil
					p2.pflags = $ & ~PF_STASIS
				end

				p.hugging = nil
				p.pflags = $ & ~PF_STASIS
				p.mo.state = S_PLAY_STND
			end
		end
	end)
end

SpeccyHugs.bob = true

//Footsteps support
if not PlayerAnimInfo
	rawset(_G, "PlayerAnimInfo", {})
end

PlayerAnimInfo["bob"] = {
		["runFrames"] = {3, 7},
		["dashFrames"] = {-1},
		["walkFrames"] = {3, 7},
		["waitFrames"] = {0},
		["milnekickFrames"] = {0, 4},
		["run"] = true,
		["dash"] = false,
		["walk"] = true,
		["idle"] = true,
		["wait"] = false,
		["milnekick"] = true,
		["superRun"] = false,
		["superDash"] = false,
		["superWalk"] = true,
		["superIdle"] = true,
		["superWait"] = false
}
freeslot("sfx_run1", "sfx_run2", "sfx_run3")
addHook("ThinkFrame", function()
for player in players.iterate do
if player and player.mo and player.mo.valid and player.mo.skin == "bob" then
-- Calculate player's speed
local speed = R_PointToDist2(0, 0, player.mo.momx, player.mo.momy) / FRACUNIT

-- Initialize flags if not already
if not player.sound_level1_triggered then player.sound_level1_triggered = false end
if not player.sound_level2_triggered then player.sound_level2_triggered = false end
if not player.sound_level3_triggered then player.sound_level3_triggered = false end

-- Play sound based on speed
if speed > 1 and speed <= 28 then
if not player.sound_level1_triggered then
-- Stop existing sounds
if player.sound_level2_triggered then
player.sound_level2_triggered = false
end
if player.sound_level3_triggered then
player.sound_level3_triggered = false
end

S_StartSound(player.mo, sfx_run1)
player.sound_level1_triggered = true
end

elseif speed > 28 and speed <= 35 then
if not player.sound_level2_triggered then
-- Stop existing sounds
if player.sound_level1_triggered then
player.sound_level1_triggered = false
end
if player.sound_level3_triggered then
player.sound_level3_triggered = false
end

S_StartSound(player.mo, sfx_run2)
player.sound_level2_triggered = true
end

elseif speed > 35 then
if not player.sound_level3_triggered then
-- Stop existing sounds
if player.sound_level1_triggered then
player.sound_level1_triggered = false
end
if player.sound_level2_triggered then
player.sound_level2_triggered = false
end

S_StartSound(player.mo, sfx_run3)
player.sound_level3_triggered = true
end

else
-- Reset flags
player.sound_level1_triggered = false
player.sound_level2_triggered = false
player.sound_level3_triggered = false
end

-- Reset flags when sounds finish
if player.sound_level2_triggered and not S_SoundPlaying(player.mo, sfx_run2) then
player.sound_level2_triggered = false
end

if player.sound_level3_triggered and not S_SoundPlaying(player.mo, sfx_run3) then
player.sound_level3_triggered = false
end

end
end
end)

addHook("ThinkFrame", do
    for player in players.iterate do
        if player.mo and player.mo.valid and player.mo.skin == "bob" then
            if player.bob_cheered == nil then player.bob_cheered = 0 end
        end
    end
end)

addHook("PlayerThink", function(player)
    if not (player.mo and player.mo.valid and player.mo.skin == "bob") and player.bob_cheered >= 1 then return end
    if player.exiting then
		player.bob_cheered = 1
        if not S_SoundPlaying(player.mo, sfx_bwina) then S_StartSound(player.mo, sfx_bwina) end
    end
end)
