-- @ Version: SCREEN SPACE SHADERS - UPDATE 17
-- @ Description: Rain - Footsteps
-- @ Author: https://www.moddb.com/members/ascii1457
-- @ Mod: https://www.moddb.com/mods/stalker-anomaly/addons/screen-space-shaders

-- Settings
local ssfx_rf_vol = 0
local ssfx_rf_vol_variation = 0

local ssfx_rf_vol_multi_without_rain = 0
local ssfx_rf_vol_multi_walk = 0
local ssfx_rf_vol_multi_run = 0

local ssfx_rf_jump_vol = 0
local ssfx_rf_land_vol = 0

-- Internal vars
module_installed = true

local Rain_Hemi = 0
local Rain_Factor = 0

local Footstep_Snd = {}
local Footstep_Jump_Snd = {}
local Footstep_Land_Snd = {}

local Weapon_Aiming = 0

local Last_Snd = -1
local JL_Counter = { ["jump"] = 0, ["land"] = 0 }

function actor_on_first_update()

	Rain_Hemi = 0
	Rain_Factor = 0

end

function on_game_load()

	-- Preload all the sounds
	Footstep_Snd[0] = sound_object([[material\human\step\rain_01]]) 
	Footstep_Snd[1] = sound_object([[material\human\step\rain_02]])
	Footstep_Snd[2] = sound_object([[material\human\step\rain_03]])
	Footstep_Snd[3] = sound_object([[material\human\step\rain_04]])
	Footstep_Snd[4] = sound_object([[material\human\step\rain_05]])
	Footstep_Snd[5] = sound_object([[material\human\step\rain_06]])
	Footstep_Snd[6] = sound_object([[material\human\step\rain_07]])
	Footstep_Snd[7] = sound_object([[material\human\step\rain_08]])

	Footstep_Jump_Snd[0] = sound_object([[material\human\step\rain_jump_01]])
	Footstep_Jump_Snd[1] = sound_object([[material\human\step\rain_jump_02]])
	Footstep_Jump_Snd[2] = sound_object([[material\human\step\rain_jump_03]])

	Footstep_Land_Snd[0] = sound_object([[material\human\step\rain_land_01]])
	Footstep_Land_Snd[1] = sound_object([[material\human\step\rain_land_02]])
	Footstep_Land_Snd[2] = sound_object([[material\human\step\rain_land_03]])
end
local TestValue = 0
function actor_on_footstep()

	local Base_Vol = clamp(level.rain_wetness() * 2.0, 0.0, 1.0) -- Base sound volume

	if Base_Vol > 0 then
		
		Rain_Hemi = level.rain_hemi() -- Use rain hemi to detect cover
		Rain_Factor = clamp(level.rain_factor(), ssfx_rf_vol_multi_without_rain, 1.0) -- Lower volume when rain stop

		Base_Vol = Base_Vol * Rain_Hemi * Rain_Factor

		if (Base_Vol < 0.05) then return end -- Just skip

		local Actor_State = level.actor_moving_state()

		-- Slower
		Actor_Crouch = ssfx_rf_vol_multi_walk * (bit_and(Actor_State, 16) ~= 0 and 1 or 0)
		Actor_Walk = ssfx_rf_vol_multi_walk * (bit_and(Actor_State, 32) ~= 0 and 1 or 0)
		Actor_Aiming = ssfx_rf_vol_multi_walk * Weapon_Aiming

		-- Faster
		Actor_Sprint = bit_and(Actor_State, 4096) ~= 0
		
		-- Adjust volume
		Vol_Mod = 1.0 - (Actor_Crouch + Actor_Walk + Actor_Aiming)
		Vol_Mod = Actor_Sprint and ssfx_rf_vol_multi_run or Vol_Mod

		local rand = math.random(0, 7) -- Random Sound

		-- Avoid repeat
		if rand == Last_Snd then
			rand = (Last_Snd + 1) % 8
		end

		-- Play Sound and set volume
		variation = math.random(0.0, ssfx_rf_vol_variation * 100) / 100

		Footstep_Snd[rand]:play(db.actor,0,sound_object.s2d)
		Footstep_Snd[rand].volume = clamp(Base_Vol * (ssfx_rf_vol + variation) * Vol_Mod, 0.0, 1.0);

		--printdbg("* RAIN - FOOTSTEP : [%s] vol:%s base:%s", rand, Footstep_Snd[rand].volume, Base_Vol)

		Last_Snd = rand
	end
end

local function actor_on_jump()

	if ssfx_rf_jump_vol > 0 then
		ssfx_JumpLand_Snd(Footstep_Jump_Snd, ssfx_rf_jump_vol, "jump")
	end

end

local function actor_on_land()

	if ssfx_rf_land_vol > 0 then
		ssfx_JumpLand_Snd(Footstep_Land_Snd, ssfx_rf_land_vol, "land")
	end

end

function ssfx_JumpLand_Snd(SndDB, Vol, CntStr)

	-- Check last Rain_Hemi
	if (Rain_Hemi > 0.1) then
		
		-- Play Sound and set volume
		SndDB[JL_Counter[CntStr]]:play(db.actor,0,sound_object.s2d)
		SndDB[JL_Counter[CntStr]].volume = Vol * Rain_Factor

		-- Next Sound
		JL_Counter[CntStr] = (JL_Counter[CntStr] + 1) % 3
	end
end


local function ssfx_aim_in()
	Weapon_Aiming = 1
end

local function ssfx_aim_out()
	Weapon_Aiming = 0
end

function on_option_change()
	
	-- Get settings
	local module_id = "ssfx_rain_module/ssfx_rain_footsteps"
	ssfx_rf_vol = ssfx_001_mcm.ssfx_get_setting(module_id, "main_vol", ssfx_rain_footsteps_settings)
	ssfx_rf_vol_variation = ssfx_001_mcm.ssfx_get_setting(module_id, "vol_rnd", ssfx_rain_footsteps_settings)
	
	ssfx_rf_vol_multi_without_rain = ssfx_001_mcm.ssfx_get_setting(module_id, "multi_no_rain", ssfx_rain_footsteps_settings)
	ssfx_rf_vol_multi_walk = ssfx_001_mcm.ssfx_get_setting(module_id, "multi_walk", ssfx_rain_footsteps_settings)
	ssfx_rf_vol_multi_run = ssfx_001_mcm.ssfx_get_setting(module_id, "multi_run", ssfx_rain_footsteps_settings)

	ssfx_rf_jump_vol = ssfx_001_mcm.ssfx_get_setting(module_id, "jump_vol", ssfx_rain_footsteps_settings)
	ssfx_rf_land_vol = ssfx_001_mcm.ssfx_get_setting(module_id, "land_vol", ssfx_rain_footsteps_settings)

end

function on_game_start()

	-- General Functions
	RegisterScriptCallback("actor_on_first_update", actor_on_first_update)
	RegisterScriptCallback("on_option_change", on_option_change)
	RegisterScriptCallback("on_game_load", on_game_load)

	-- Actor Actions
	RegisterScriptCallback("actor_on_weapon_zoom_in", ssfx_aim_in)
	RegisterScriptCallback("actor_on_weapon_zoom_out", ssfx_aim_out)
	RegisterScriptCallback("actor_on_jump", actor_on_jump)
	RegisterScriptCallback("actor_on_land", actor_on_land)
	RegisterScriptCallback("actor_on_footstep",actor_on_footstep)
	
	-- Read and apply settigns
	on_option_change()
end