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