| MapVar("g_EnvSound", false) | |
| MapVar("g_EnvSoundChannel", false) | |
| MapVar("g_EnvSoundTimeEnd", 0) | |
| MapVar("g_EnvSoundFadeOut", 3000) | |
| if FirstLoad then | |
| g_EnvSndDebugPrints = false | |
| end | |
| function ToggleEnvSndDebugPrints() | |
| g_EnvSndDebugPrints = not g_EnvSndDebugPrints | |
| end | |
| function EnvSndDebugPrint(...) | |
| if g_EnvSndDebugPrints then | |
| print(...) | |
| end | |
| end | |
| local listener_size = point(const.SlabSizeX, const.SlabSizeY, 0) | |
| function IsPointInsideRoom(pos) | |
| return not not EnumVolumes("Room", sizebox(pos - listener_size, listener_size * 2)) | |
| end | |
| function IsListenerInsideRoom(listener_pos) | |
| return IsPointInsideRoom(listener_pos or GetListenerPos()) | |
| end | |
| local function GetEnvObjects(pos) | |
| local pos_zero_Z = pos:SetZ(0) | |
| local max_range = GetLocationMaxRange() | |
| local pt_range = point(max_range, max_range, const.SanePosMaxZ) | |
| local box_range = box(pos_zero_Z - pt_range, pos_zero_Z + pt_range) | |
| return MapGet(box_range) | |
| end | |
| MapVar("g_LastEnvLocations", false) | |
| MapVar("g_LastEnvLocationsPos", false) | |
| function EnvironmentSoundUpdate() | |
| if IsEditorActive() then return end | |
| local pos = GetListenerPos() | |
| local cam_pos = camera.GetPos() | |
| local high = cam_pos:z() - pos:z() > 8 * guim and "High" or "Low" | |
| local locations = g_LastEnvLocations | |
| if not g_LastEnvLocations or not g_LastEnvLocationsPos or g_LastEnvLocationsPos:Dist(pos) > guim then | |
| local objs = GetEnvObjects(pos) | |
| locations = GetEnvironmentLocation(pos, objs) | |
| g_LastEnvLocations = locations | |
| g_LastEnvLocationsPos = pos | |
| end | |
| local sound, env_sound_fade, env_sound_volume = GetAtmosphericSound(locations, high) | |
| if env_sound_volume then | |
| env_sound_volume = MulDivTrunc(env_sound_volume, 1000, 100) | |
| env_sound_volume = IsListenerInsideRoom(pos) and (env_sound_volume / 2) or env_sound_volume | |
| end | |
| if g_EnvSound ~= sound then | |
| if g_EnvSoundChannel then | |
| SetSoundVolume(g_EnvSoundChannel, -1, g_EnvSoundFadeOut) | |
| EnvSndDebugPrint(string.format("Stopping '%s', Fade Out: %d", g_EnvSound, g_EnvSoundFadeOut)) | |
| end | |
| g_EnvSoundChannel = false | |
| if sound then | |
| g_EnvSoundChannel = PlaySound(sound, env_sound_volume, g_EnvSoundFadeOut) | |
| local duration = GetSoundDuration(g_EnvSoundChannel) or 0 | |
| g_EnvSoundTimeEnd = RealTime() + duration | |
| EnvSndDebugPrint(string.format("Playing '%s' for %d, '%s' Fade Out: %d", sound, duration, g_EnvSound, g_EnvSoundFadeOut)) | |
| end | |
| elseif g_EnvSoundChannel then | |
| SetSoundVolume(g_EnvSoundChannel, env_sound_volume, g_EnvSoundFadeOut) | |
| if RealTime() - g_EnvSoundTimeEnd >= 0 then | |
| SetSoundVolume(g_EnvSoundChannel, -1, g_EnvSoundFadeOut) | |
| g_EnvSoundChannel = PlaySound(sound, env_sound_volume, g_EnvSoundFadeOut) | |
| local duration = GetSoundDuration(g_EnvSoundChannel) or 0 | |
| g_EnvSoundTimeEnd = RealTime() + duration | |
| EnvSndDebugPrint(string.format("Re-Playing '%s' for %d, Fade Out: %d", sound, duration, g_EnvSoundFadeOut)) | |
| end | |
| end | |
| g_EnvSound = sound | |
| g_EnvSoundFadeOut = env_sound_fade or 3000 | |
| end | |
| function OnMsg.DoneMap() | |
| if g_EnvSoundChannel then | |
| StopSound(g_EnvSoundChannel) | |
| end | |
| end | |
| function OnMsg.GameEnterEditor() | |
| EnvSndDebugPrint(string.format("Stopping environmental sounds in editor")) | |
| StopSound(g_EnvSoundChannel) | |
| g_EnvSound = false | |
| g_EnvSoundChannel = false | |
| end | |
| MapGameTimeRepeat("EnvSound", 333, EnvironmentSoundUpdate) | |
| function OnMsg.GatherSounds(used_sounds) | |
| local atmo_sounds = Presets.SoundPreset.ATMOSPHERIC or {} | |
| for _, preset in ipairs(atmo_sounds) do | |
| if not preset.Regions or table.find(preset.Regions, "Jungle") or table.find(preset.Regions, "Underground") then | |
| for _, bank in ipairs(preset) do | |
| used_sounds[bank.file] = true | |
| end | |
| end | |
| end | |
| end |