-- @ 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