From 17917ed56452b160cab50159af5b08a559e2df49 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Sat, 11 Jun 2022 19:39:48 -0400 Subject: [PATCH] bark followup - audio balance pass, bark intercepts, yelling nerf, falloff fix, etc! --- code/__DEFINES/dcs/signals.dm | 1 + code/__DEFINES/say.dm | 2 ++ code/datums/bark.dm | 15 +++++++++++++-- code/game/atoms_movable.dm | 6 ++++++ code/game/say.dm | 11 ++++++++--- code/modules/mob/living/say.dm | 7 ++++--- sound/voice/barks/chitter.ogg | Bin 0 -> 9305 bytes 7 files changed, 34 insertions(+), 8 deletions(-) create mode 100644 sound/voice/barks/chitter.ogg diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index b3dbc46806..456b9e9e54 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -244,6 +244,7 @@ // #define HEARING_SPANS 6 #define HEARING_MESSAGE_MODE 7 // #define HEARING_SOURCE 8 +#define COMSIG_MOVABLE_BARK "movable_bark" //from base of atom/movable/proc/Bark(): (list/hearers, distance, volume, pitch) #define COMSIG_MOVABLE_DISPOSING "movable_disposing" //called when the movable is added to a disposal holder object for disposal movement: (obj/structure/disposalholder/holder, obj/machinery/disposal/source) #define COMSIG_MOVABLE_TELEPORTED "movable_teleported" //from base of do_teleport(): (channel, turf/origin, turf/destination) #define COMSIG_MOVABLE_CHASM_DROP "movable_chasm_drop" //from base of /datum/component/chasm/drop() (/datum/component/chasm) diff --git a/code/__DEFINES/say.dm b/code/__DEFINES/say.dm index 9debb3a699..9d90e7aa9b 100644 --- a/code/__DEFINES/say.dm +++ b/code/__DEFINES/say.dm @@ -115,6 +115,8 @@ #define BARK_DO_VARY(pitch, variance) (rand(((pitch * 100) - (variance*50)), ((pitch*100) + (variance*50))) / 100) +#define BARK_SOUND_FALLOFF_EXPONENT(distance) (distance/7) //At lower ranges, we want the exponent to be below 1 so that whispers don't sound too awkward. At higher ranges, we want the exponent fairly high to make yelling less obnoxious + // Is something in the IC chat filter? This is config dependent. #define CHAT_FILTER_CHECK(T) (config.ic_filter_regex && findtext(T, config.ic_filter_regex)) diff --git a/code/datums/bark.dm b/code/datums/bark.dm index a7119273c3..2bf3d7c69a 100644 --- a/code/datums/bark.dm +++ b/code/datums/bark.dm @@ -72,8 +72,8 @@ /datum/bark/chitter name = "Chittery" id = "chitter" - minspeed = 6 //This is a pretty long sound - soundpath = 'sound/items/Ratchet.ogg' + minspeed = 4 //Even with the sound being replaced with a unique, shorter sound, this is still a little too long for higher speeds + soundpath = 'sound/voice/barks/chitter.ogg' /datum/bark/synthetic_grunt name = "Synthetic (Grunt)" @@ -91,6 +91,11 @@ maxpitch = 1.6 //This works well with higher pitches! soundpath = 'sound/weapons/bulletflyby.ogg' //This works... Surprisingly well as a bark? It's neat! +/datum/bark/coggers + name = "Brassy" + id = "coggers" + soundpath = 'sound/machines/clockcult/integration_cog_install.ogg' //Yet another unexpectedly good bark sound + // Genetics-only/admin-only sounds. These either clash hard with the audio design of the above sounds, or have some other form of audio design issue, but aren't *too* awful as a sometimes thing. // Rule of fun very much applies to this section. Audio design is extremely important for the above section, but down here? No gods, no masters, pure anarchy. @@ -137,3 +142,9 @@ id = "weh" soundpath = 'modular_citadel/sound/voice/weh.ogg' ignore = TRUE + +/datum/bark/honk + name = "Annoying Honk" + id = "honk" + soundpath = 'sound/creatures/goose1.ogg' + ignore = TRUE diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index ca133f882e..252eb7b11b 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -72,6 +72,8 @@ var/vocal_volume = 70 //Baseline. This gets modified by yelling and other factors var/vocal_speed = 4 //Lower values are faster, higher values are slower + var/vocal_current_bark //When barks are queued, this gets passed to the bark proc. If vocal_current_bark doesn't match the args passed to the bark proc (if passed at all), then the bark simply doesn't play. Basic curtailing of spam~ + /atom/movable/Initialize(mapload) . = ..() switch(blocks_emissive) @@ -225,6 +227,10 @@ if(NAMEOF(src, glide_size)) set_glide_size(var_value) . = TRUE + if(NAMEOF(src, vocal_bark)) + if(isfile(vocal_bark)) + vocal_bark = sound(vocal_bark) //bark() expects vocal_bark to already be a sound datum, for performance reasons. adminbus QoL! + . = TRUE if(!isnull(.)) datum_flags |= DF_VAR_EDITED diff --git a/code/game/say.dm b/code/game/say.dm index 205ddc2f0e..6dc5eec765 100644 --- a/code/game/say.dm +++ b/code/game/say.dm @@ -31,14 +31,18 @@ GLOBAL_LIST_INIT(freqtospan, list( /atom/movable/proc/Hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode, atom/movable/source) SEND_SIGNAL(src, COMSIG_MOVABLE_HEAR, args) -/atom/movable/proc/bark(list/hearers, distance, volume, pitch) +/atom/movable/proc/bark(list/hearers, distance, volume, pitch, queue_time) + if(queue_time && vocal_current_bark != queue_time) + return + if(SEND_SIGNAL(src, COMSIG_MOVABLE_BARK, hearers, distance, volume, pitch)) + return //bark interception. this probably counts as some flavor of BDSM if(!vocal_bark) if(!vocal_bark_id || !set_bark(vocal_bark_id)) //just-in-time bark generation return volume = min(volume, 100) var/turf/T = get_turf(src) for(var/mob/M in hearers) - M.playsound_local(T, vol = volume, vary = TRUE, frequency = pitch, max_distance = distance, falloff_distance = distance * 0.75, S = vocal_bark, distance_multiplier = 1) + M.playsound_local(T, vol = volume, vary = TRUE, frequency = pitch, max_distance = distance, falloff_distance = 0, falloff_exponent = BARK_SOUND_FALLOFF_EXPONENT(distance), S = vocal_bark, distance_multiplier = 1) /atom/movable/proc/can_speak() return 1 @@ -57,10 +61,11 @@ GLOBAL_LIST_INIT(freqtospan, list( hearers -= M var/barks = min(round((LAZYLEN(message) / vocal_speed)) + 1, BARK_MAX_BARKS) var/total_delay + vocal_current_bark = world.time //this is juuuuust random enough to reliably be unique every time send_speech() is called, in most scenarios for(var/i in 1 to barks) if(total_delay > BARK_MAX_TIME) break - addtimer(CALLBACK(src, .proc/bark, hearers, range, vocal_volume, BARK_DO_VARY(vocal_pitch, vocal_pitch_range)), total_delay) + addtimer(CALLBACK(src, .proc/bark, hearers, range, vocal_volume, BARK_DO_VARY(vocal_pitch, vocal_pitch_range), vocal_current_bark), total_delay) total_delay += rand(DS2TICKS(vocal_speed / BARK_SPEED_BASELINE), DS2TICKS(vocal_speed / BARK_SPEED_BASELINE) + DS2TICKS(vocal_speed / BARK_SPEED_BASELINE)) TICKS /atom/movable/proc/compose_message(atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode, face_name = FALSE, atom/movable/source) diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index b90909adf7..71803cc722 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -298,7 +298,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list( SEND_GLOBAL_SIGNAL(COMSIG_GLOB_LIVING_SAY_SPECIAL, src, message) var/is_yell = (say_test(message) == "2") - if(client && !eavesdrop_range && is_yell) // Yell hook + if(/*client && */!eavesdrop_range && is_yell) // Yell hook listening |= process_yelling(listening, rendered, src, message_language, message, spans, message_mode, source) //speech bubble @@ -319,11 +319,12 @@ GLOBAL_LIST_INIT(department_radio_keys, list( listening -= M var/barks = min(round((LAZYLEN(message) / vocal_speed)) + 1, BARK_MAX_BARKS) var/total_delay + vocal_current_bark = world.time for(var/i in 1 to barks) if(total_delay > BARK_MAX_TIME) break - addtimer(CALLBACK(src, /atom/movable/proc/bark, listening, (message_range * (is_yell ? 4 : 1)), (vocal_volume * (is_yell ? 1.5 : 1)), BARK_DO_VARY(vocal_pitch, vocal_pitch_range)), total_delay) - total_delay += rand(DS2TICKS((vocal_speed / BARK_SPEED_BASELINE) * (is_yell ? 0.5 : 1)), DS2TICKS(vocal_speed / BARK_SPEED_BASELINE) + DS2TICKS((vocal_speed / BARK_SPEED_BASELINE) * (is_yell ? 0.5 : 1))) TICKS + addtimer(CALLBACK(src, /atom/movable/proc/bark, listening, (message_range * (is_yell ? 4 : 1)), (vocal_volume * (is_yell ? 1.5 : 1)), BARK_DO_VARY(vocal_pitch, vocal_pitch_range), vocal_current_bark), total_delay) + total_delay += rand(DS2TICKS(vocal_speed / BARK_SPEED_BASELINE), DS2TICKS(vocal_speed / BARK_SPEED_BASELINE) + DS2TICKS((vocal_speed / BARK_SPEED_BASELINE) * (is_yell ? 0.5 : 1))) TICKS /atom/movable/proc/process_yelling(list/already_heard, rendered, atom/movable/speaker, datum/language/message_language, message, list/spans, message_mode, obj/source) diff --git a/sound/voice/barks/chitter.ogg b/sound/voice/barks/chitter.ogg new file mode 100644 index 0000000000000000000000000000000000000000..0d162fa30352e7d0335ae8d8260f1665188eea4a GIT binary patch literal 9305 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 E0{JV4?f?J) literal 0 HcmV?d00001