diff --git a/code/controllers/subsystem/ambience.dm b/code/controllers/subsystem/ambience.dm index 4aacf3802cf..4b64c1ddf82 100644 --- a/code/controllers/subsystem/ambience.dm +++ b/code/controllers/subsystem/ambience.dm @@ -34,7 +34,7 @@ SUBSYSTEM_DEF(ambience) var/area/current_area = get_area(client_mob) if(!current_area) //Something's gone horribly wrong stack_trace("[key_name(client_mob)] has somehow ended up in nullspace. WTF did you do") - ambience_listening_clients -= client_iterator + remove_ambience_client(client_iterator) continue if(ambience_listening_clients[client_iterator] > world.time) @@ -59,7 +59,8 @@ SUBSYSTEM_DEF(ambience) new_sound = sound(new_sound, repeat = 0, wait = 0, volume = volume*volume_modifier, channel = CHANNEL_AMBIENCE) SEND_SOUND(M, new_sound) - return rand(min_ambience_cooldown, max_ambience_cooldown) + var/sound_length = SSsounds.get_sound_length(new_sound.file) + return sound_length + rand(min_ambience_cooldown, max_ambience_cooldown) /datum/controller/subsystem/ambience/proc/remove_ambience_client(client/to_remove) ambience_listening_clients -= to_remove @@ -67,8 +68,6 @@ SUBSYSTEM_DEF(ambience) currentrun -= to_remove /area/station/maintenance - min_ambience_cooldown = 20 SECONDS - max_ambience_cooldown = 35 SECONDS ///A list of rare sound effects to fuck with players. No, it does not contain actual minecraft sounds anymore. var/static/list/minecraft_cave_noises = list( diff --git a/code/controllers/subsystem/sounds.dm b/code/controllers/subsystem/sounds.dm index 2bc253c5af7..bcc06e67f63 100644 --- a/code/controllers/subsystem/sounds.dm +++ b/code/controllers/subsystem/sounds.dm @@ -26,9 +26,28 @@ SUBSYSTEM_DEF(sounds) /// All valid sound files in the sound directory var/list/all_sounds + // || Sound caching || + /// k:v list of file_path : length + VAR_PRIVATE/list/sound_lengths + /// A list of sounds to cache upon initialize. + VAR_PRIVATE/list/sounds_to_precache = list() + /// Any errors from precaching. + VAR_PRIVATE/list/precache_errors = list() + /datum/controller/subsystem/sounds/Initialize() setup_available_channels() find_all_available_sounds() + + if(!(RUST_G)) + to_chat(world, span_boldnotice("Sounds subsystem: No rust_g detected.")) + return ..() + + // Precache ambience sounds + for(var/key in GLOB.ambience_assoc) + sounds_to_precache |= GLOB.ambience_assoc[key] + + precache_sounds() + return SS_INIT_SUCCESS /datum/controller/subsystem/sounds/proc/setup_available_channels() @@ -156,4 +175,54 @@ SUBSYSTEM_DEF(sounds) /datum/controller/subsystem/sounds/proc/available_channels_left() return length(channel_list) - random_channels_min +/datum/controller/subsystem/sounds/proc/precache_sounds() + if(!length(sounds_to_precache)) + return + + var/list/lengths = rustg_sound_length_list(sounds_to_precache) + precache_errors = lengths[RUSTG_SOUNDLEN_ERRORS] + sound_lengths = lengths[RUSTG_SOUNDLEN_SUCCESSES] + for(var/sound_path in sound_lengths) + sound_lengths[sound_path] = text2num(sound_lengths[sound_path]) + + sounds_to_precache = null + +/// Cache a list of sound lengths. +/datum/controller/subsystem/sounds/proc/cache_sounds(list/paths) + var/list/reconstructed = list() + reconstructed.len = length(paths) + + for(var/i in 1 to length(paths)) + reconstructed[i] = "[paths[i]]" + + var/list/out = rustg_sound_length_list(paths) + var/list/successes = out[RUSTG_SOUNDLEN_SUCCESSES] + for(var/sound_path in successes) + sound_lengths[sound_path] = text2num(successes[sound_path]) + +/// Cache and return a single sound. +/datum/controller/subsystem/sounds/proc/get_sound_length(file_path) + . = 0 + if(!istext(file_path)) + if(!isfile(file_path)) + CRASH("rustg_sound_length error: Passed non-text object") + + if(length("[file_path]")) // Runtime generated RSC references stringify into 0-length strings. + file_path = "[file_path]" + else + CRASH("rustg_sound_length does not support non-static file refs.") + + var/cached_length = sound_lengths[file_path] + if(!isnull(cached_length)) + return cached_length + + var/ret = RUSTG_CALL(RUST_G, "sound_len")(file_path) + var/as_num = text2num(ret) + if(isnull(ret)) + . = 0 + CRASH("rustg_sound_length error: [ret]") + + sound_lengths[file_path] = as_num + return as_num + #undef DATUMLESS diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 450a29d9cbd..1a1720b75f0 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -95,9 +95,9 @@ ///The volume of the ambient buzz var/ambient_buzz_vol = 35 ///Used to decide what the minimum time between ambience is - var/min_ambience_cooldown = 30 SECONDS + var/min_ambience_cooldown = 4 SECONDS ///Used to decide what the maximum time between ambience is - var/max_ambience_cooldown = 60 SECONDS + var/max_ambience_cooldown = 10 SECONDS flags_1 = CAN_BE_DIRTY_1 diff --git a/code/game/area/areas/centcom.dm b/code/game/area/areas/centcom.dm index 022e0d91c17..2d6c3551ba1 100644 --- a/code/game/area/areas/centcom.dm +++ b/code/game/area/areas/centcom.dm @@ -278,8 +278,6 @@ ambience_index = AMBIENCE_MINING flags_1 = CAN_BE_DIRTY_1 sound_environment = SOUND_AREA_ASTEROID - min_ambience_cooldown = 70 SECONDS - max_ambience_cooldown = 220 SECONDS /area/centcom/asteroid/nearstation static_lighting = TRUE diff --git a/code/game/area/areas/mining.dm b/code/game/area/areas/mining.dm index 4254e23d62b..957956cb12d 100644 --- a/code/game/area/areas/mining.dm +++ b/code/game/area/areas/mining.dm @@ -146,8 +146,6 @@ requires_power = TRUE ambience_index = AMBIENCE_MINING area_flags = VALID_TERRITORY | UNIQUE_AREA - min_ambience_cooldown = 70 SECONDS - max_ambience_cooldown = 220 SECONDS /area/lavaland/underground name = "Lavaland Caves" @@ -159,8 +157,6 @@ power_light = FALSE ambience_index = AMBIENCE_MINING area_flags = VALID_TERRITORY | UNIQUE_AREA | FLORA_ALLOWED - min_ambience_cooldown = 70 SECONDS - max_ambience_cooldown = 220 SECONDS /area/lavaland/surface/outdoors name = "Lavaland Wastes" @@ -206,8 +202,6 @@ power_light = FALSE requires_power = TRUE area_flags = UNIQUE_AREA | FLORA_ALLOWED - min_ambience_cooldown = 70 SECONDS - max_ambience_cooldown = 220 SECONDS /area/icemoon/surface/outdoors // parent that defines if something is on the exterior of the station. name = "Icemoon Wastes" @@ -269,8 +263,6 @@ power_equip = FALSE power_light = FALSE area_flags = UNIQUE_AREA | FLORA_ALLOWED - min_ambience_cooldown = 70 SECONDS - max_ambience_cooldown = 220 SECONDS /area/icemoon/underground/unexplored // mobs and megafauna and ruins spawn here name = "Icemoon Caves" diff --git a/code/game/area/areas/misc.dm b/code/game/area/areas/misc.dm index 00ce0d6f464..63290754db5 100644 --- a/code/game/area/areas/misc.dm +++ b/code/game/area/areas/misc.dm @@ -16,8 +16,6 @@ flags_1 = CAN_BE_DIRTY_1 sound_environment = SOUND_AREA_SPACE ambient_buzz = null //Space is deafeningly quiet - min_ambience_cooldown = 195 SECONDS //length of ambispace.ogg - max_ambience_cooldown = 200 SECONDS /area/space/nearstation icon_state = "space_near" diff --git a/code/game/area/areas/station/engineering.dm b/code/game/area/areas/station/engineering.dm index 6925aa4d096..71fe6024d88 100644 --- a/code/game/area/areas/station/engineering.dm +++ b/code/game/area/areas/station/engineering.dm @@ -31,8 +31,6 @@ sound_environment = SOUND_AREA_SPACE ambience_index = AMBIENCE_SPACE ambient_buzz = null //Space is deafeningly quiet - min_ambience_cooldown = 195 SECONDS //length of ambispace.ogg - max_ambience_cooldown = 200 SECONDS /area/station/engineering/atmos/project name = "\improper Atmospherics Project Room" diff --git a/code/game/area/areas/station/medical.dm b/code/game/area/areas/station/medical.dm index 3b77a7a1a66..03bdc8eb5bf 100644 --- a/code/game/area/areas/station/medical.dm +++ b/code/game/area/areas/station/medical.dm @@ -4,8 +4,6 @@ ambience_index = AMBIENCE_MEDICAL airlock_wires = /datum/wires/airlock/medbay sound_environment = SOUND_AREA_STANDARD_STATION - min_ambience_cooldown = 90 SECONDS - max_ambience_cooldown = 180 SECONDS /area/station/medical/abandoned name = "\improper Abandoned Medbay" diff --git a/sound/ambience/maintenance/ambimaint.ogg b/sound/ambience/maintenance/ambimaint.ogg index 346662ac4c9..d1c832e31d6 100644 Binary files a/sound/ambience/maintenance/ambimaint.ogg and b/sound/ambience/maintenance/ambimaint.ogg differ diff --git a/sound/ambience/maintenance/ambimaint1.ogg b/sound/ambience/maintenance/ambimaint1.ogg index b4ca9ffd128..2bdc0c3e9d0 100644 Binary files a/sound/ambience/maintenance/ambimaint1.ogg and b/sound/ambience/maintenance/ambimaint1.ogg differ diff --git a/sound/ambience/maintenance/ambimaint10.ogg b/sound/ambience/maintenance/ambimaint10.ogg index 0aee1569341..c51df1d5530 100644 Binary files a/sound/ambience/maintenance/ambimaint10.ogg and b/sound/ambience/maintenance/ambimaint10.ogg differ diff --git a/sound/ambience/maintenance/ambimaint12.ogg b/sound/ambience/maintenance/ambimaint12.ogg index baf0755e96c..3b7886dd8de 100644 Binary files a/sound/ambience/maintenance/ambimaint12.ogg and b/sound/ambience/maintenance/ambimaint12.ogg differ diff --git a/sound/ambience/maintenance/ambimaint2.ogg b/sound/ambience/maintenance/ambimaint2.ogg index fa172c61e78..458707e7728 100644 Binary files a/sound/ambience/maintenance/ambimaint2.ogg and b/sound/ambience/maintenance/ambimaint2.ogg differ diff --git a/sound/ambience/maintenance/ambimaint3.ogg b/sound/ambience/maintenance/ambimaint3.ogg index 184239a5de8..f99df8bd2b7 100644 Binary files a/sound/ambience/maintenance/ambimaint3.ogg and b/sound/ambience/maintenance/ambimaint3.ogg differ diff --git a/sound/ambience/maintenance/ambimaint4.ogg b/sound/ambience/maintenance/ambimaint4.ogg index 402681a46de..71b2b6b1853 100644 Binary files a/sound/ambience/maintenance/ambimaint4.ogg and b/sound/ambience/maintenance/ambimaint4.ogg differ diff --git a/sound/ambience/maintenance/ambimaint5.ogg b/sound/ambience/maintenance/ambimaint5.ogg index 5b7941f37f0..acd2d7d4015 100644 Binary files a/sound/ambience/maintenance/ambimaint5.ogg and b/sound/ambience/maintenance/ambimaint5.ogg differ diff --git a/sound/ambience/maintenance/source_corridor2.ogg b/sound/ambience/maintenance/source_corridor2.ogg index 35cf63555f1..fbf77382d62 100644 Binary files a/sound/ambience/maintenance/source_corridor2.ogg and b/sound/ambience/maintenance/source_corridor2.ogg differ