--don't run setup again.
if BonkMod return end
rawset(_G, "BonkMod", {})
rawset(_G, "Bonk_Add", function (...)	
	local object = {...}
	for k, v in ipairs(object) --no plans to actually do anything with the name yet but it's nice to have.
		if not (_G[v.sfx]) --the sound's already freeslotted?
			freeslot(v.sfx)
		end
		table.insert(BonkMod, v)
	end
end)
freeslot("sfx_vs3k49")

local bonk_mode = CV_RegisterVar({
	name = "bonk_mode",
	defaultvalue = "On",
	flags = CV_NETVAR,
	possiblevalue = CV_OnOff
})

local function bonk_rng(player)
	local mx = (#BonkMod)
	local px = abs(player.x) --slightly paranoid that gating RNG behind S_SoundPlaying would cause desync
	local py = abs(player.y) --so here's a deterministic solution that doesn't advance RNG.
	local pa = abs(player.angle)
	return max((px+py+pa+leveltime)%mx,abs((px+py+pa+leveltime)%mx))+1
end

addHook("MobjThinker", function(pmo)
	if S_SoundPlaying(pmo, sfx_s3k49)
		S_StopSoundByID(pmo, sfx_s3k49)
		local r = bonk_rng(pmo)
		local s = BonkMod[r]
		local t = s.sfx
		if bonk_mode.value
			S_StartSound(pmo, _G[t]) --get a random sound
		end
		if (not bonk_mode.value) or (s.voice)
			S_StartSound(pmo, sfx_vs3k49)
		end
	end
end)

addHook("NetVars", function(net)
	rawset(_G, "BonkMod", net(_G.BonkMod))
end)