diff --git a/code/__DEFINES/~~bubber_defines/___HELPERS/global_lists.dm b/code/__DEFINES/~~bubber_defines/___HELPERS/global_lists.dm deleted file mode 100644 index 80f5c2a54e5..00000000000 --- a/code/__DEFINES/~~bubber_defines/___HELPERS/global_lists.dm +++ /dev/null @@ -1,2 +0,0 @@ -GLOBAL_LIST_EMPTY(blooper_list) -GLOBAL_LIST_EMPTY(blooper_random_list) diff --git a/code/__DEFINES/~~bubber_defines/say.dm b/code/__DEFINES/~~bubber_defines/blooper.dm similarity index 70% rename from code/__DEFINES/~~bubber_defines/say.dm rename to code/__DEFINES/~~bubber_defines/blooper.dm index 528ec2362fc..c8a74b742c3 100644 --- a/code/__DEFINES/~~bubber_defines/say.dm +++ b/code/__DEFINES/~~bubber_defines/blooper.dm @@ -1,4 +1,3 @@ -//BLOOPER defines #define BLOOPER_DEFAULT_MINPITCH 0.4 #define BLOOPER_DEFAULT_MAXPITCH 2 #define BLOOPER_DEFAULT_MINVARY 0.1 @@ -8,12 +7,10 @@ #define BLOOPER_SPEED_BASELINE 4 //Used to calculate delay between BLOOPERs, any BLOOPER speeds below this feature higher BLOOPER density, any speeds above feature lower BLOOPER density. Keeps BLOOPERing length consistent +#define BLOOPER_TRANSMIT_VOLUME 55 #define BLOOPER_MAX_BLOOPERS 24 #define BLOOPER_MAX_TIME (1.5 SECONDS) // More or less the amount of time the above takes to process through with a BLOOPER speed of 2. -#define BLOOPER_PITCH_RAND(gend) ((gend == MALE ? rand(60, 120) : (gend == FEMALE ? rand(80, 140) : rand(60,140))) / 100) //Macro for determining random pitch based off gender -#define BLOOPER_VARIANCE_RAND (rand(BLOOPER_DEFAULT_MINVARY * 100, BLOOPER_DEFAULT_MAXVARY * 100) / 100) //Macro for randomizing BLOOPER variance to reduce the amount of copy-pasta necessary for that - #define BLOOPER_DO_VARY(pitch, variance) (rand(((pitch * 100) - (variance*50)), ((pitch*100) + (variance*50))) / 100) #define BLOOPER_SOUND_FALLOFF_EXPONENT 0.5 //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 diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 6a779c7b562..f452e408839 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -510,12 +510,6 @@ if(NAMEOF(src, glide_size)) set_glide_size(var_value) . = TRUE - // THE BUBBER EDIT ADDITION BEGIN - BLOOPER - if(NAMEOF(src, blooper)) // Sorry, Vishenka. - if(isfile(var_value)) - blooper = sound(var_value) //bark() expects vocal_bark to already be a sound datum, for performance reasons. adminbus QoL! - . = TRUE - // THE BUBBER EDIT ADDITION END if(!isnull(.)) datum_flags |= DF_VAR_EDITED return diff --git a/code/modules/admin/create_mob.dm b/code/modules/admin/create_mob.dm index 18e3fd819d3..f501f986026 100644 --- a/code/modules/admin/create_mob.dm +++ b/code/modules/admin/create_mob.dm @@ -22,12 +22,6 @@ // Snowflake for Ethereals human.updatehealth() human.updateappearance(mutcolor_update = TRUE) - // BUBBER EDIT ADDITION BEGIN - Bloopers - human.set_blooper(pick(GLOB.blooper_list)) - human.blooper_pitch = BLOOPER_PITCH_RAND(human.gender) - human.blooper_pitch_range = BLOOPER_VARIANCE_RAND - human.blooper_speed = rand(BLOOPER_DEFAULT_MINSPEED, BLOOPER_DEFAULT_MAXSPEED) - // BUBBER EDIT ADDITION END - Bloopers /** * Randomizes a human, but produces someone who looks exceedingly average (by most standards). diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm index 4920c32326c..42c3d118555 100644 --- a/code/modules/antagonists/changeling/changeling.dm +++ b/code/modules/antagonists/changeling/changeling.dm @@ -575,6 +575,10 @@ new_profile.undershirt_color = target.undershirt_color new_profile.socks_color = target.socks_color new_profile.bra_color = target.bra_color + new_profile.blooper = target.blooper + new_profile.blooper_speed = target.blooper_speed + new_profile.blooper_pitch = target.blooper_pitch + new_profile.blooper_pitch_range = target.blooper_pitch_range new_profile.eye_color_left = target.eye_color_left new_profile.eye_color_right = target.eye_color_right new_profile.emissive_eyes = target.emissive_eyes @@ -584,12 +588,6 @@ new_profile.target_size = target.mob_size //SKYRAT EDIT ADDITION END // Hair and facial hair gradients, alongside their colours. - //THE BUBBER EDIT ADDITION BEGIN - Voice Bark - new_profile.blooper_id = target.blooper_id - new_profile.blooper_pitch = target.blooper_pitch - new_profile.blooper_speed = target.blooper_speed - new_profile.blooper_pitch_range = target.blooper_pitch_range - //THE BUBBER EDIT END // Grab skillchips they have new_profile.skillchips = target.clone_skillchip_list(TRUE) @@ -829,6 +827,10 @@ user.undershirt_color = chosen_profile.undershirt_color user.socks_color = chosen_profile.socks_color user.bra_color = chosen_profile.bra_color + user.blooper = chosen_profile.blooper + user.blooper_speed = chosen_profile.blooper_speed + user.blooper_pitch = chosen_profile.blooper_pitch + user.blooper_pitch_range = chosen_profile.blooper_pitch_range user.emissive_eyes = chosen_profile.emissive_eyes user.dna.mutant_bodyparts = chosen_dna.mutant_bodyparts.Copy() user.dna.body_markings = chosen_dna.body_markings.Copy() @@ -970,13 +972,6 @@ //this has to be at the end of the proc or it breaks everything below it, womp womp user.set_mob_height(chosen_profile.target_body_scaling) // SKYRAT EDIT END -//THE BUBBER EDIT ADDITION BEGIN - Voice Bark - user.blooper = null - user.blooper_id = chosen_profile.blooper_id - user.blooper_pitch = chosen_profile.blooper_pitch - user.blooper_speed = chosen_profile.blooper_speed - user.blooper_pitch_range = chosen_profile.blooper_pitch_range - //THE BUBBER EDIT END // Changeling profile themselves. Store a data to store what every DNA instance looked like. /datum/changeling_profile /// The name of the profile / the name of whoever this profile source. @@ -1075,6 +1070,10 @@ new_profile.socks_color = socks_color new_profile.bra = bra new_profile.bra_color = bra_color + new_profile.blooper = blooper + new_profile.blooper_speed = blooper_speed + new_profile.blooper_pitch = blooper_pitch + new_profile.blooper_pitch_range = blooper_pitch_range new_profile.eye_color_left = eye_color_left new_profile.eye_color_right = eye_color_right new_profile.emissive_eyes = emissive_eyes diff --git a/config/bloopers/README.md b/config/bloopers/README.md new file mode 100644 index 00000000000..c4567ca69b9 --- /dev/null +++ b/config/bloopers/README.md @@ -0,0 +1,17 @@ +# Vocal Bloopers + +By default, no vocal bloopers are included in the repository, a sample config file is provided to demonstrate the format used. +To set things up, copy `blooper_config.json.example` and rename it to `blooper_config.json`, then add an entry for each blooper. + +## Config Format + +- name: Required, the user-friendly name of the voice, will be shown in the config menu +- id: Required, an internal ID for the voice, must be unique +- files: Required, a JSON array of audio file names, relative to the bloopers directory. + If there's more than one entry, a file is randomly chosen each time the user speaks +- min_speed: Optional, the minimum value the user can set for the voice speed +- max_speed: Optional, the maximum value the user can set for the voice speed +- min_pitch: Optional, the minimum value the user can set for the voice pitch +- max_pitch: Optional, the maximum value the user can set for the voice pitch +- min_vary: Optional, the minimum value the user can set for the voice pitch variance +- max_vary: Optional, the maximum value the user can set for the voice pitch variance diff --git a/config/bloopers/blooper_config.json.example b/config/bloopers/blooper_config.json.example new file mode 100644 index 00000000000..4f31f32bb61 --- /dev/null +++ b/config/bloopers/blooper_config.json.example @@ -0,0 +1,13 @@ +[ + { + "name": "Example Blooper", + "id": "example", + "files": ["example.ogg"], + "min_speed": 2, + "max_speed": 16, + "min_pitch": 0.4, + "max_pitch": 2, + "min_vary": 0.1, + "max_vary": 0.8 + } +] diff --git a/modular_skyrat/modules/customization/__HELPERS/global_lists.dm b/modular_skyrat/modules/customization/__HELPERS/global_lists.dm index 20ee3393d57..0be2a6ddafa 100644 --- a/modular_skyrat/modules/customization/__HELPERS/global_lists.dm +++ b/modular_skyrat/modules/customization/__HELPERS/global_lists.dm @@ -1,6 +1,5 @@ /proc/make_skyrat_datum_references() init_prefs_emotes() - make_bloopers() make_default_mutant_bodypart_references() make_body_marking_references() make_body_marking_set_references() @@ -181,12 +180,3 @@ continue SSaccessories.bra_m -= sprite_name - -// Text bloopers -/proc/make_bloopers() - GLOB.blooper_list = list() - for(var/sound_blooper_path in subtypesof(/datum/blooper)) - var/datum/blooper/bloop = new sound_blooper_path() - GLOB.blooper_list[bloop.id] = sound_blooper_path - if(bloop.allow_random) - GLOB.blooper_random_list[bloop.id] = sound_blooper_path diff --git a/modular_zubbers/code/controllers/subsystem/blooper.dm b/modular_zubbers/code/controllers/subsystem/blooper.dm new file mode 100644 index 00000000000..6232113dc56 --- /dev/null +++ b/modular_zubbers/code/controllers/subsystem/blooper.dm @@ -0,0 +1,40 @@ +#define BLOOPER_CONFIG_PATH "[global.config.directory]/bloopers" + +SUBSYSTEM_DEF(blooper) + name = "Blooper" + flags = SS_NO_FIRE | SS_NO_INIT + + var/list/blooper_list + +/datum/controller/subsystem/blooper/OnConfigLoad() + blooper_list = initialize_blooper_datums() + +/datum/controller/subsystem/blooper/proc/initialize_blooper_datums() + var/list/blooper_datums = list() + if(!rustg_file_exists("[BLOOPER_CONFIG_PATH]/blooper_config.json")) + logger.Log(LOG_CATEGORY_DEBUG, "blooper_config.json not found.") + return blooper_datums + var/list/blooper_entries = safe_json_decode(rustg_file_read("[BLOOPER_CONFIG_PATH]/blooper_config.json")) + if(isnull(blooper_entries)) + stack_trace("Blooper config is malformed!") + return blooper_datums + for(var/entry in blooper_entries) + // These fields are required + if(isnull(entry["name"]) || isnull(entry["id"]) || isnull(entry["files"]) || !length(entry["files"])) + stack_trace("Blooper config entry was missing required field!") + continue + var/datum/blooper/new_blooper = new() + new_blooper.name = entry["name"] + new_blooper.id = entry["id"] + for(var/file in entry["files"]) + new_blooper.soundpath_list += sound("[BLOOPER_CONFIG_PATH]/[file]") + new_blooper.min_pitch = entry["min_pitch"] || BLOOPER_DEFAULT_MINPITCH + new_blooper.max_pitch = entry["max_pitch"] || BLOOPER_DEFAULT_MAXPITCH + new_blooper.min_vary = entry["min_vary"] || BLOOPER_DEFAULT_MINVARY + new_blooper.max_vary = entry["max_vary"] || BLOOPER_DEFAULT_MAXVARY + new_blooper.min_speed = entry["min_speed"] || BLOOPER_DEFAULT_MINSPEED + new_blooper.max_speed = entry["max_speed"] || BLOOPER_DEFAULT_MAXSPEED + blooper_datums[new_blooper.id] = new_blooper + return blooper_datums + +#undef BLOOPER_CONFIG_PATH diff --git a/modular_zubbers/code/datums/blooper.dm b/modular_zubbers/code/datums/blooper.dm new file mode 100644 index 00000000000..1291dcc2508 --- /dev/null +++ b/modular_zubbers/code/datums/blooper.dm @@ -0,0 +1,63 @@ +/datum/blooper + /// User friendly name of the blooper, displayed in preferences menu + var/name = null + /// Internal ID of blooper, must be unique + var/id = null + /// List of sounds, one is chosen randomly each time the blooper is played + var/list/sound/soundpath_list = list() + + var/min_pitch = BLOOPER_DEFAULT_MINPITCH + var/max_pitch = BLOOPER_DEFAULT_MAXPITCH + var/min_vary = BLOOPER_DEFAULT_MINVARY + var/max_vary = BLOOPER_DEFAULT_MAXVARY + + // Speed vars. Speed determines the number of characters required for each blooper, with lower speeds being faster with higher blooper density + var/min_speed = BLOOPER_DEFAULT_MINSPEED + var/max_speed = BLOOPER_DEFAULT_MAXSPEED + +/** + * Plays the vocal blooper for all listeners, duration is controlled by length of the message argument + * * speaker - Origin source of the blooper, used for 3D audio calculations and to set the cooldown + * * listeners - List of mobs that will hear the blooper + * * message - Chat message being sent, used to determine how long bloopers play for (longer message, more sounds) + * * distance - Range at which the sounds will be heard + * * volume - Volume the sounds will play at + * * speed - How fast the bloopers will be, percentage between 0 - 100, converted and clamped to datum's min/max values + * * pitch - How high-pitched the bloopers will be, percentage between 0 - 100, converted and clamped to datum's min/max values + * * pitch_range - Amount of pitch variance for each blooper, percentage between 0 - 100, converted and clamped to datum's max/min values + */ +/datum/blooper/proc/play_bloop(atom/movable/speaker, list/listeners, message, distance, volume, speed, pitch, pitch_range) + if(!COOLDOWN_FINISHED(speaker, blooper_cooldown)) + return + volume = min(volume, 100) + // convert passed values (which are percentages) into value clamped between min and max of blooper datum + speed = round(min_speed + ((max_speed - min_speed) * ((100 - speed) / 100)), 0.01) // this one gets inverted because lower % = faster isn't intuitive + pitch = round(min_pitch + ((max_pitch - min_pitch) * (pitch / 100)), 0.01) + pitch_range = round(min_vary + ((max_vary - min_vary) * (pitch_range / 100)), 0.01) + for(var/mob/target_mob in listeners) + if(target_mob.client && !(target_mob.client.prefs.read_preference(/datum/preference/toggle/hear_blooper))) + listeners -= target_mob + var/sound/blooper_pick = pick(soundpath_list) + var/num_bloopers = min(round(length(message) / speed, 1) + 1, BLOOPER_MAX_BLOOPERS) + var/total_delay = 0 + for(var/i in 1 to num_bloopers) + if(total_delay > BLOOPER_MAX_TIME) + break + addtimer(CALLBACK(src, PROC_REF(play_callback), speaker, listeners, distance, volume, BLOOPER_DO_VARY(pitch, pitch_range), blooper_pick), total_delay) + total_delay += rand(DS2TICKS(speed / BLOOPER_SPEED_BASELINE), DS2TICKS(speed / BLOOPER_SPEED_BASELINE) + DS2TICKS(speed / BLOOPER_SPEED_BASELINE)) TICKS + COOLDOWN_START(speaker, blooper_cooldown, total_delay) + +/// Private callback function to actually play the sound, used for timers scheduled in play_bloop +/datum/blooper/proc/play_callback(atom/movable/speaker, list/listeners, distance, volume, pitch, sound/voice) + PRIVATE_PROC(TRUE) + for(var/mob/target_mob in listeners) + target_mob.playsound_local( + turf_source = get_turf(speaker), + soundin = voice, + vol = volume, + vary = TRUE, + frequency = pitch, + falloff_distance = 0, + falloff_exponent = BLOOPER_SOUND_FALLOFF_EXPONENT, + max_distance = distance, + ) diff --git a/modular_zubbers/code/game/atoms_movable.dm b/modular_zubbers/code/game/atoms_movable.dm new file mode 100644 index 00000000000..518eb3232ad --- /dev/null +++ b/modular_zubbers/code/game/atoms_movable.dm @@ -0,0 +1,15 @@ +/atom/movable + // Text-to-blooper sounds + // yes. all atoms can have a say. + var/datum/blooper/blooper + var/blooper_speed = 50 + var/blooper_pitch = 50 + var/blooper_pitch_range = 50 //Actual pitch is (pitch - (blooper_pitch_range*0.5)) to (pitch + (blooper_pitch_range*0.5)) + COOLDOWN_DECLARE(blooper_cooldown) + +/atom/movable/send_speech(message, range = 7, obj/source = src, bubble_type, list/spans, datum/language/message_language, list/message_mods = list(), forced = FALSE, tts_message, list/tts_filter) + . = ..() + if(!blooper) + return + var/list/listeners = get_hearers_in_view(range, source) + blooper.play_bloop(source, listeners, message, range, BLOOPER_TRANSMIT_VOLUME, blooper_speed, blooper_pitch, blooper_pitch_range) diff --git a/modular_zubbers/code/game/objects/items/plushes.dm b/modular_zubbers/code/game/objects/items/plushes.dm index 657f7948100..aa8f2eafe17 100644 --- a/modular_zubbers/code/game/objects/items/plushes.dm +++ b/modular_zubbers/code/game/objects/items/plushes.dm @@ -264,7 +264,6 @@ icon_state = "johnghoul" attack_verb_continuous = list("ghouls") attack_verb_simple = list("ghoul") - squeak_override = list('modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/ehh.ogg' = 1) // plushie for BeoTheKobold // sprite by Cepha, code by Mitryll diff --git a/modular_zubbers/code/modules/antagonists/changeling/changeling.dm b/modular_zubbers/code/modules/antagonists/changeling/changeling.dm new file mode 100644 index 00000000000..6e40ecf4881 --- /dev/null +++ b/modular_zubbers/code/modules/antagonists/changeling/changeling.dm @@ -0,0 +1,9 @@ +/datum/changeling_profile + /// The blooper voice used by the profile source + var/datum/blooper/blooper + /// The blooper speed used by the profile source + var/blooper_speed + /// The blooper pitch used by the profile source + var/blooper_pitch + /// The blooper pitch range used by the profile source + var/blooper_pitch_range diff --git a/modular_zubbers/code/modules/blooper/atoms_movable.dm b/modular_zubbers/code/modules/blooper/atoms_movable.dm deleted file mode 100644 index 09cec4f819e..00000000000 --- a/modular_zubbers/code/modules/blooper/atoms_movable.dm +++ /dev/null @@ -1,109 +0,0 @@ -/* Originally written by Bhijn & Myr on Citadel[1], with various other contributions since- see the Splurt & Citadel github for a full list of contributors. -It has also been further modified by Rashcat & other Fluffyfrontier contributors on Fluffy Frontier! -[1]https://github.com/Citadel-Station-13/Citadel-Station-13/pull/15677 -*/ -/atom/movable - // Text-to-blooper sounds - // yes. all atoms can have a say. - var/sound/blooper - var/blooper_id - var/blooper_pitch = 1 - var/blooper_pitch_range = 0.2 //Actual pitch is (pitch - (blooper_pitch_range*0.5)) to (pitch + (blooper_pitch_range*0.5)) - var/blooper_volume = 50 - var/blooper_speed = 4 //Lower values are faster, higher values are slower - var/blooper_current_blooper //When bloopers are queued, this gets passed to the blooper proc. If blooper_current_blooper doesn't match the args passed to the blooper proc (if passed at all), then the blooper simply doesn't play. Basic curtailing of spam~ - -/atom/movable/proc/set_blooper(id) - if(!id) - return FALSE - var/datum/blooper/B = GLOB.blooper_list[id] - if(!B) - return FALSE - blooper = sound(initial(B.soundpath)) - blooper_id = id - return blooper - -/atom/movable/proc/blooper(list/listeners, distance, volume, pitch, queue_time) - if(!GLOB.blooper_allowed) - return - if(queue_time && blooper_current_blooper != queue_time) - return - if(!blooper) - if(!blooper_id || !set_blooper(blooper_id)) //just-in-time blooper generation - return - volume = min(volume, 100) - var/turf/T = get_turf(src) - for(var/mob/M in listeners) - M.playsound_local(T, vol = volume, vary = TRUE, frequency = pitch, max_distance = distance, falloff_distance = 0, falloff_exponent = BLOOPER_SOUND_FALLOFF_EXPONENT, sound_to_use = blooper, distance_multiplier = 1) - -/atom/movable/send_speech(message, range = 7, obj/source = src, bubble_type, list/spans, datum/language/message_language, list/message_mods = list(), forced = FALSE, tts_message, list/tts_filter) - . = ..() - var/list/listeners = get_hearers_in_view(range, source) - if(blooper || blooper_id) - for(var/mob/M in listeners) - if(!M.client) - continue - if(!(M.client.prefs?.read_preference(/datum/preference/toggle/hear_sound_blooper))) - listeners -= M - var/bloopers = min(round((LAZYLEN(message) / blooper_speed)) + 1, BLOOPER_MAX_BLOOPERS) - var/total_delay - blooper_current_blooper = 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 bloopers) - if(total_delay > BLOOPER_MAX_TIME) - break - addtimer(CALLBACK(src, PROC_REF(blooper), listeners, range, blooper_volume, BLOOPER_DO_VARY(blooper_pitch, blooper_pitch_range), blooper_current_blooper), total_delay) - total_delay += rand(DS2TICKS(blooper_speed / BLOOPER_SPEED_BASELINE), DS2TICKS(blooper_speed / BLOOPER_SPEED_BASELINE) + DS2TICKS(blooper_speed / BLOOPER_SPEED_BASELINE)) TICKS - -/mob/living/carbon/human/Initialize(mapload) - . = ..() - // This gives a random vocal bark to a random created person - if(!client) - set_blooper(pick(GLOB.blooper_list)) - blooper_pitch = BLOOPER_PITCH_RAND(gender) - blooper_pitch_range = BLOOPER_VARIANCE_RAND - blooper_speed = rand(BLOOPER_DEFAULT_MINSPEED, BLOOPER_DEFAULT_MAXSPEED) - -/mob/living/send_speech(message_raw, message_range = 6, obj/source = src, bubble_type = bubble_icon, list/spans, datum/language/message_language = null, list/message_mods = list(), forced = null, tts_message, list/tts_filter) - . = ..() - - if(!(client?.prefs.read_preference(/datum/preference/toggle/send_sound_blooper))) - return - blooper_volume = client?.prefs.read_preference(/datum/preference/numeric/sound_blooper_volume) //volume scales with your volume slider in game preferences. - if(HAS_TRAIT(src, TRAIT_SIGN_LANG) && !HAS_TRAIT(src, TRAIT_MUTE)) //if you can speak and you sign, your hands don't make a bark. Unless you are completely mute, you can have some hand bark. - return - if(message_mods[WHISPER_MODE]) - blooper_volume = (client?.prefs.read_preference(/datum/preference/numeric/sound_blooper_volume)*0.5) //Whispered barked are half as loud. - message_range++ - var/list/listening = get_hearers_in_view(message_range, source) - var/is_yell = (say_test(message_raw) == "2") - //Listening gets trimmed here if a blooper blooper's present. If anyone ever makes this proc return listening, make sure to instead initialize a copy of listening in here to avoid wonkiness - if(blooper || blooper_id) - for(var/mob/M in listening) - if(!M.client) - continue - - var/tts_pref = M.client.prefs?.read_preference(/datum/preference/choiced/sound_tts) - var/hear_blooper = M.client.prefs?.read_preference(/datum/preference/toggle/hear_sound_blooper) - - if(!hear_blooper) // Check pref for blooper - listening -= M - - else if (CONFIG_GET(string/tts_http_url) && SStts.tts_enabled == TRUE) // TTS for vocal barks. - if (source.voice == "" || source.voice == "None") // "None" is for borgs - continue - if (tts_pref == TTS_SOUND_OFF) - continue - listening -= M - - - - var/bloopers = min(round((LAZYLEN(message_raw) / blooper_speed)) + 1, BLOOPER_MAX_BLOOPERS) - var/total_delay - blooper_current_blooper = world.time - for(var/i in 1 to bloopers) - if(total_delay > BLOOPER_MAX_TIME) - break - addtimer(CALLBACK(src, TYPE_PROC_REF(/atom/movable, blooper), listening, message_range + 1, (blooper_volume * (is_yell ? 2 : 1)), BLOOPER_DO_VARY(blooper_pitch, blooper_pitch_range), blooper_current_blooper), total_delay) //The function is zero on the seventh tile. This makes it a maximum of 1 more. - total_delay += rand(DS2TICKS(blooper_speed / BLOOPER_SPEED_BASELINE), DS2TICKS(blooper_speed / BLOOPER_SPEED_BASELINE) + DS2TICKS((blooper_speed / BLOOPER_SPEED_BASELINE) * (is_yell ? 0.5 : 1))) TICKS - - diff --git a/modular_zubbers/code/modules/blooper/bark.dm b/modular_zubbers/code/modules/blooper/bark.dm deleted file mode 100644 index 0847c9e7dad..00000000000 --- a/modular_zubbers/code/modules/blooper/bark.dm +++ /dev/null @@ -1,180 +0,0 @@ -GLOBAL_VAR_INIT(blooper_allowed, TRUE) // For administrators - -// we let borgs have some bark too -/mob/living/silicon/Login() - // This is the only found function that updates the client for borgs. - set_blooper(client.prefs.read_preference(/datum/preference/choiced/blooper)) - blooper_pitch = client.prefs.read_preference(/datum/preference/numeric/blooper_speech_pitch) - blooper_speed = client.prefs.read_preference(/datum/preference/numeric/blooper_speech_speed) - blooper_pitch_range = client.prefs.read_preference(/datum/preference/numeric/blooper_pitch_range) - . = ..() - -// Mechanics for Changelings -/datum/changeling_profile - var/blooper_id - var/blooper_pitch - var/blooper_pitch_range - var/blooper_speed - -/datum/smite/normalblooper - name = "Normal blooper" - -/datum/smite/normalblooper/effect(client/user, mob/living/carbon/human/target) - . = ..() - target.blooper = null - target.blooper_id = pick(GLOB.blooper_random_list) - target.blooper_speed = round((BLOOPER_DEFAULT_MINSPEED + BLOOPER_DEFAULT_MAXSPEED) / 2) - target.blooper_pitch = round((BLOOPER_DEFAULT_MINPITCH + BLOOPER_DEFAULT_MAXPITCH) / 2) - target.blooper_pitch_range = 0.2 - -/datum/admins/proc/toggleblooper() - set category = "Server" - set desc = "Toggle the annoying voices." - set name = "Toggle Vocal Barks" - toggle_blooper() - log_admin("[key_name(usr)] toggled Voice Barks.") - message_admins("[key_name_admin(usr)] toggled Voice Barks.") - SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Voice Bark", "[GLOB.blooper_allowed ? "Enabled" : "Disabled"]")) // If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! - -/* /world/AVerbsAdmin() - . = ..() - return . + /datum/admins/proc/toggleblooper */ - -/proc/toggle_blooper(toggle = null) - if(toggle != null) - if(toggle != GLOB.blooper_allowed) - GLOB.blooper_allowed = toggle - else - return - else - GLOB.blooper_allowed = !GLOB.blooper_allowed - to_chat(world, "Vocal barks have been globally [GLOB.blooper_allowed ? "enabled" : "disabled"].") - -/datum/preference/choiced/blooper - category = PREFERENCE_CATEGORY_NON_CONTEXTUAL - savefile_identifier = PREFERENCE_CHARACTER - savefile_key = "blooper_speech" - -/datum/preference/choiced/blooper/init_possible_values() - return assoc_to_keys(GLOB.blooper_list) - -/datum/preference/choiced/blooper/apply_to_human(mob/living/carbon/human/target, value) - target.set_blooper(value) - -/datum/preference/choiced/blooper/compile_constant_data() - var/list/data = ..() - var/list/display_names = list() - for(var/id in GLOB.blooper_list) - var/datum/blooper/blooper_path = GLOB.blooper_list[id] - display_names[id] = blooper_path::name - data[CHOICED_PREFERENCE_DISPLAY_NAMES] = display_names - return data - -/datum/preference_middleware/blooper - /// Cooldown on requesting a Blooper preview. - COOLDOWN_DECLARE(blooper_cooldown) - - action_delegations = list( - "play_blooper" = PROC_REF(play_blooper), - ) - -/datum/preference_middleware/blooper/proc/play_blooper(list/params, mob/user) - if(!COOLDOWN_FINISHED(src, blooper_cooldown)) - return TRUE - var/atom/movable/blooperbox = new(get_turf(user)) - blooperbox.set_blooper(preferences.read_preference(/datum/preference/choiced/blooper)) - blooperbox.blooper_pitch = preferences.read_preference(/datum/preference/numeric/blooper_speech_pitch) - blooperbox.blooper_speed = preferences.read_preference(/datum/preference/numeric/blooper_speech_speed) - blooperbox.blooper_pitch_range = preferences.read_preference(/datum/preference/numeric/blooper_pitch_range) - var/total_delay - for(var/i in 1 to (round((32 / blooperbox.blooper_speed)) + 1)) - addtimer(CALLBACK(blooperbox, TYPE_PROC_REF(/atom/movable, blooper), list(user), 7, 70, BLOOPER_DO_VARY(blooperbox.blooper_pitch, blooperbox.blooper_pitch_range)), total_delay) - total_delay += rand(DS2TICKS(blooperbox.blooper_speed/4), DS2TICKS(blooperbox.blooper_speed/4) + DS2TICKS(blooperbox.blooper_speed/4)) TICKS - QDEL_IN(blooperbox, total_delay) - COOLDOWN_START(src, blooper_cooldown, 2 SECONDS) - return TRUE - -/datum/preference/numeric/blooper_speech_speed - category = PREFERENCE_CATEGORY_NON_CONTEXTUAL - savefile_identifier = PREFERENCE_CHARACTER - savefile_key = "blooper_speech_speed" - minimum = BLOOPER_DEFAULT_MINSPEED - maximum = BLOOPER_DEFAULT_MAXSPEED - step = 0.01 - -/datum/preference/numeric/blooper_speech_speed/apply_to_human(mob/living/carbon/human/target, value) - target.blooper_speed = value - -/datum/preference/numeric/blooper_speech_speed/create_default_value() - return round((BLOOPER_DEFAULT_MINSPEED + BLOOPER_DEFAULT_MAXSPEED) / 2) - -/datum/preference/numeric/blooper_speech_pitch - category = PREFERENCE_CATEGORY_NON_CONTEXTUAL - savefile_identifier = PREFERENCE_CHARACTER - savefile_key = "blooper_speech_pitch" - minimum = BLOOPER_DEFAULT_MINPITCH - maximum = BLOOPER_DEFAULT_MAXPITCH - step = 0.01 - -/datum/preference/numeric/blooper_speech_pitch/apply_to_human(mob/living/carbon/human/target, value) - target.blooper_pitch = value - -/datum/preference/numeric/blooper_speech_pitch/create_default_value() - return round((BLOOPER_DEFAULT_MINPITCH + BLOOPER_DEFAULT_MAXPITCH) / 2) - -/datum/preference/numeric/blooper_pitch_range - category = PREFERENCE_CATEGORY_NON_CONTEXTUAL - savefile_identifier = PREFERENCE_CHARACTER - savefile_key = "blooper_pitch_range" - minimum = BLOOPER_DEFAULT_MINVARY - maximum = BLOOPER_DEFAULT_MAXVARY - step = 0.01 - -/datum/preference/numeric/blooper_pitch_range/apply_to_human(mob/living/carbon/human/target, value) - target.blooper_pitch_range = value - -/datum/preference/numeric/blooper_pitch_range/create_default_value() - return 0.2 - -/// Can I use the blooper? -/datum/preference/toggle/send_sound_blooper - category = PREFERENCE_CATEGORY_GAME_PREFERENCES - savefile_key = "send_sound_blooper" - savefile_identifier = PREFERENCE_PLAYER - default_value = TRUE - -/// Can I hear everyone else's bloops? -/datum/preference/toggle/hear_sound_blooper - category = PREFERENCE_CATEGORY_GAME_PREFERENCES - savefile_key = "hear_sound_blooper" - savefile_identifier = PREFERENCE_PLAYER - default_value = TRUE - -/// Can I have a slider to adjust the volume of the barks? -/datum/preference/numeric/sound_blooper_volume - category = PREFERENCE_CATEGORY_GAME_PREFERENCES - savefile_key = "sound_blooper_volume" - savefile_identifier = PREFERENCE_PLAYER - minimum = 0 - maximum = 60 - step = 5 - -/// It's was stoolen from Splurt build >:3 and from fluffySTG!! nyeehehehheee!~ -/datum/blooper - var/name = "None" - var/id = "No Voice" - var/soundpath - - var/minpitch = BLOOPER_DEFAULT_MINPITCH - var/maxpitch = BLOOPER_DEFAULT_MAXPITCH - var/minvariance = BLOOPER_DEFAULT_MINVARY - var/maxvariance = BLOOPER_DEFAULT_MAXVARY - - // Speed vars. Speed determines the number of characters required for each blooper, with lower speeds being faster with higher blooper density - var/minspeed = BLOOPER_DEFAULT_MINSPEED - var/maxspeed = BLOOPER_DEFAULT_MAXSPEED - - // Visibility vars. Regardless of what's set below, these can still be obtained via adminbus and genetics. Rule of fun. - var/list/ckeys_allowed - var/ignore = FALSE // If TRUE - only for admins - var/allow_random = FALSE diff --git a/modular_zubbers/code/modules/blooper/bark_list.dm b/modular_zubbers/code/modules/blooper/bark_list.dm deleted file mode 100644 index 5c49a456aa8..00000000000 --- a/modular_zubbers/code/modules/blooper/bark_list.dm +++ /dev/null @@ -1,438 +0,0 @@ -/datum/blooper/mutedc2 - name = "Muted String (Low)" - id = "mutedc2" - soundpath = 'sound/runtime/instruments/synthesis_samples/guitar/crisis_muted/C2.ogg' - allow_random = TRUE - -/datum/blooper/mutedc3 - name = "Muted String (Medium)" - id = "mutedc3" - soundpath = 'sound/runtime/instruments/synthesis_samples/guitar/crisis_muted/C3.ogg' - allow_random = TRUE - -/datum/blooper/mutedc4 - name = "Muted String (High)" - id = "mutedc4" - soundpath = 'sound/runtime/instruments/synthesis_samples/guitar/crisis_muted/C4.ogg' - allow_random = TRUE - -/datum/blooper/banjoc3 - name = "Banjo (Medium)" - id = "banjoc3" - soundpath = 'sound/runtime/instruments/banjo/Cn3.ogg' - allow_random = TRUE - -/datum/blooper/banjoc4 - name = "Banjo (High)" - id = "banjoc4" - soundpath = 'sound/runtime/instruments/banjo/Cn4.ogg' - allow_random = TRUE - -/datum/blooper/squeaky - name = "Squeaky" - id = "squeak" - soundpath = 'sound/items/toy_squeak/toysqueak1.ogg' - maxspeed = 4 - -/datum/blooper/beep - name = "Beepy" - id = "beep" - soundpath = 'sound/machines/terminal/terminal_select.ogg' - maxpitch = 1 //Bringing the pitch higher just hurts your ears :< - maxspeed = 4 //This soundbyte's too short for larger speeds to not sound awkward - -/datum/blooper/chitter - name = "Chittery" - id = "chitter" - minspeed = 4 //Even with the sound being replaced with a unique, shorter sound, this is still a little too long for higher speeds - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/chitter.ogg' - -/datum/blooper/synthetic_grunt - name = "Synthetic (Grunt)" - id = "synthgrunt" - soundpath = 'sound/misc/bloop.ogg' - -/datum/blooper/synthetic - name = "Synthetic (Normal)" - id = "synth" - soundpath = 'sound/machines/uplink/uplinkerror.ogg' - -/datum/blooper/bullet - name = "Windy" - id = "bullet" - maxpitch = 1.6 - soundpath = 'sound/items/weapons/bulletflyby.ogg' - -/datum/blooper/coggers - name = "Brassy" - id = "coggers" - soundpath = 'sound/machines/clockcult/integration_cog_install.ogg' - -/datum/blooper/moff/short - name = "Moff squeak" - id = "moffsqueak" - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/mothsqueak.ogg' - allow_random = TRUE - ignore = FALSE - -/datum/blooper/meow //Meow blooper? - name = "Meow" - id = "meow" - allow_random = TRUE - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/meow1.ogg' - minspeed = 5 - maxspeed = 11 - -/datum/blooper/chirp - name = "Chirp" - id = "chirp" - allow_random = TRUE - soundpath = 'modular_zubbers/sound/voice/chirp.ogg' - -/datum/blooper/caw - name = "Caw" - id = "caw" - allow_random = TRUE - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/caw.ogg' - -//Undertale -/datum/blooper/alphys - name = "Alphys" - id = "alphys" - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_alphys.ogg' - minvariance = 0 - -/datum/blooper/asgore - name = "Asgore" - id = "asgore" - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_asgore.ogg' - minvariance = 0 - -/datum/blooper/flowey - name = "Flowey (normal)" - id = "flowey1" - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_flowey_1.ogg' - minvariance = 0 - -/datum/blooper/flowey/evil - name = "Flowey (evil)" - id = "flowey2" - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_flowey_2.ogg' - minvariance = 0 - -/datum/blooper/papyrus - name = "Papyrus" - id = "papyrus" - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_papyrus.ogg' - minvariance = 0 - -/datum/blooper/ralsei - name = "Ralsei" - id = "ralsei" - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_ralsei.ogg' - minvariance = 0 - -/datum/blooper/sans //real - name = "Sans" - id = "sans" - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_sans.ogg' - minvariance = 0 - -/datum/blooper/toriel - name = "Toriel" - id = "toriel" - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_toriel.ogg' - minvariance = 0 - maxpitch = BLOOPER_DEFAULT_MAXPITCH*2 - -/datum/blooper/undyne - name = "Undyne" - id = "undyne" - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_undyne.ogg' - minvariance = 0 - -/datum/blooper/temmie - name = "Temmie" - id = "temmie" - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_temmie.ogg' - minvariance = 0 - -/datum/blooper/susie - name = "Susie" - id = "susie" - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_susie.ogg' - minvariance = 0 - -/datum/blooper/gaster - name = "Gaster" - id = "gaster" - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_gaster_1.ogg' - minvariance = 0 - -/datum/blooper/mettaton - name = "Mettaton" - id = "mettaton" - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_metta_1.ogg' - minvariance = 0 - -/datum/blooper/gen_monster - name = "Generic Monster 1" - id = "gen_monster_1" - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_monster1.ogg' - minvariance = 0 - -/datum/blooper/gen_monster/alt - name = "Generic Monster 2" - id = "gen_monster_2" - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_monster2.ogg' - minvariance = 0 - -/datum/blooper/wilson - name = "Wilson" - id = "wilson" - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/dont_starve/wilson_blooper.ogg' - -/datum/blooper/wolfgang - name = "Wolfgang" - id = "wolfgang" - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/dont_starve/wolfgang_blooper.ogg' - minspeed = 4 - maxspeed = 10 - -/datum/blooper/woodie - name = "Woodie" - id = "woodie" - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/dont_starve/woodie_blooper.ogg' - minspeed = 4 - maxspeed = 10 - -/datum/blooper/wurt - name = "Wurt" - id = "wurt" - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/dont_starve/wurt_blooper.ogg' - -/datum/blooper/wx78 - name = "wx78" - id = "wx78" - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/dont_starve/wx78_blooper.ogg' - minspeed = 3 - maxspeed = 9 - -/datum/blooper/blub - name = "Blub" - id = "blub" - soundpath = 'goon/sounds/blub.ogg' - -/datum/blooper/bottalk - name = "Bottalk 1" - id = "bottalk1" - soundpath = 'goon/sounds/bottalk_1.ogg' - minspeed = 3 - maxspeed = 9 - -/datum/blooper/bottalk/alt1 - name = "Bottalk 2" - id = "bottalk2" - soundpath = 'goon/sounds/bottalk_2.ogg' - -/datum/blooper/bottalk/alt2 - name = "Bottalk 3" - id = "bottalk3" - soundpath = 'goon/sounds/bottalk_3.ogg' - -/datum/blooper/bottalk/alt3 - name = "Bottalk 4" - id = "bottalk4" - soundpath = 'goon/sounds/bottalk_4.ogg' - -/datum/blooper/buwoo - name = "Buwoo" - id = "buwoo" - soundpath = 'goon/sounds/buwoo.ogg' - -/datum/blooper/cow - name = "Cow" - id = "cow" - soundpath = 'goon/sounds/cow.ogg' - -/datum/blooper/lizard - name = "Lizard" - id = "lizard" - soundpath = 'goon/sounds/lizard.ogg' - -/datum/blooper/pug - name = "Pug" - id = "pug" - soundpath = 'goon/sounds/pug.ogg' - -/datum/blooper/pugg - name = "Pugg" - id = "pugg" - soundpath = 'goon/sounds/pugg.ogg' - -/datum/blooper/radio - name = "Radio 1" - id = "radio1" - soundpath = 'goon/sounds/radio.ogg' - -/datum/blooper/radio/short - name = "Radio 2" - id = "radio2" - soundpath = 'goon/sounds/radio2.ogg' - -/datum/blooper/radio/ai - name = "Radio (AI)" - id = "radio_ai" - soundpath = 'goon/sounds/radio_ai.ogg' - -/datum/blooper/roach //Turkish characters be like - name = "Roach" - id = "roach" - soundpath = 'goon/sounds/roach.ogg' - -/datum/blooper/skelly - name = "Skelly" - id = "skelly" - soundpath = 'goon/sounds/skelly.ogg' - -/datum/blooper/speak - name = "Speak 1" - id = "speak1" - soundpath = 'goon/sounds/speak_1.ogg' - -/datum/blooper/speak/alt1 - name = "Speak 2" - id = "speak2" - soundpath = 'goon/sounds/speak_2.ogg' - -/datum/blooper/speak/alt2 - name = "Speak 3" - id = "speak3" - soundpath = 'goon/sounds/speak_3.ogg' - -/datum/blooper/speak/alt3 - name = "Speak 4" - id = "speak4" - soundpath = 'goon/sounds/speak_4.ogg' - -/datum/blooper/chitter/alt - name = "Chittery Alt" - id = "chitter2" - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/moth/mothchitter2.ogg' - -// The Mayhem Special -/datum/blooper/whistle - name = "Whistle 1" - id = "whistle1" - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/birdwhistle.ogg' - -/datum/blooper/whistle/alt1 - name = "Whistle 2" - id = "whistle2" - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/birdwhistle2.ogg' - -/datum/blooper/caw/alt1 - name = "Caw 2" - id = "caw2" - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/caw.ogg' - minspeed = 4 - maxspeed = 9 - -/datum/blooper/caw/alt2 - name = "Caw 3" - id = "caw3" - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/caw2.ogg' - minspeed = 3 - maxspeed = 9 - -/datum/blooper/caw/alt3 - name = "Caw 4" - id = "caw4" - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/caw3.ogg' - minspeed = 3 - maxspeed = 9 - -/datum/blooper/ehh - name = "Ehh 1" - id = "ehh1" - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/ehh.ogg' - minspeed = 3 - maxspeed = 9 - -/datum/blooper/ehh/alt1 - name = "Ehh 2" - id = "ehh2" - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/ehh2.ogg' - -/datum/blooper/ehh/alt2 - name = "Ehh 3" - id = "ehh3" - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/ehh3.ogg' - -/datum/blooper/ehh/alt3 - name = "Ehh 4" - id = "ehh4" - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/ehh4.ogg' - minspeed = 3 - maxspeed = 9 - -/datum/blooper/ehh/alt5 - name = "Ehh 5" - id = "ehh5" - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/ehh5.ogg' - -/datum/blooper/faucet - name = "Faucet 1" - id = "faucet1" - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/faucet.ogg' - -/datum/blooper/faucet/alt1 - name = "Faucet 2" - id = "faucet2" - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/faucet2.ogg' - -/datum/blooper/ribbit - name = "Ribbit" - id = "ribbit" - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/ribbit.ogg' - -/datum/blooper/hoot - name = "Hoot" - id = "hoot" - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/hoot.ogg' - minspeed = 4 - maxspeed = 9 - -/datum/blooper/tweet - name = "Tweet" - id = "tweet" - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/tweet.ogg' - -/datum/blooper/dwoop - name = "Dwoop" - id = "dwoop" - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/dwoop.ogg' - minspeed = 3 - maxspeed = 9 - -/datum/blooper/uhm - name = "Uhm" - id = "uhm" - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/uhm.ogg' - -/datum/blooper/wurtesh - name = "Wurtesh" - id = "wurtesh" - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/wurble1.ogg' - -/datum/blooper/chitter2 - name = "Chitter2" - id = "chitter2" - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/chitter1.ogg' - -/datum/blooper/xenohiss - name = "Xenohiss" - id = "Xenohiss" - soundpath = 'modular_zubbers/code/modules/blooper/voice/bloopers/Xenohiss.ogg' - minspeed = 10 - maxspeed = 16 diff --git a/modular_zubbers/code/modules/blooper/voice/bababooey/bababooey.ogg b/modular_zubbers/code/modules/blooper/voice/bababooey/bababooey.ogg deleted file mode 100644 index 87c7e802bde..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bababooey/bababooey.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bababooey/bababooey2.ogg b/modular_zubbers/code/modules/blooper/voice/bababooey/bababooey2.ogg deleted file mode 100644 index 53b2b3d0d49..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bababooey/bababooey2.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bababooey/babafooey.ogg b/modular_zubbers/code/modules/blooper/voice/bababooey/babafooey.ogg deleted file mode 100644 index 63f7db4b12c..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bababooey/babafooey.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bababooey/fafafoggy.ogg b/modular_zubbers/code/modules/blooper/voice/bababooey/fafafoggy.ogg deleted file mode 100644 index 9851fb66717..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bababooey/fafafoggy.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bababooey/fafafoggy2.ogg b/modular_zubbers/code/modules/blooper/voice/bababooey/fafafoggy2.ogg deleted file mode 100644 index 425be3a4c72..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bababooey/fafafoggy2.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bababooey/fafafooey.ogg b/modular_zubbers/code/modules/blooper/voice/bababooey/fafafooey.ogg deleted file mode 100644 index b3d58813586..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bababooey/fafafooey.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bababooey/fafafooey2.ogg b/modular_zubbers/code/modules/blooper/voice/bababooey/fafafooey2.ogg deleted file mode 100644 index d4602643ecb..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bababooey/fafafooey2.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bababooey/fafafooey3.ogg b/modular_zubbers/code/modules/blooper/voice/bababooey/fafafooey3.ogg deleted file mode 100644 index 183344cb7dc..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bababooey/fafafooey3.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bababooey/ffff.ogg b/modular_zubbers/code/modules/blooper/voice/bababooey/ffff.ogg deleted file mode 100644 index c55f5ced519..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bababooey/ffff.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bababooey/ffffhvh.ogg b/modular_zubbers/code/modules/blooper/voice/bababooey/ffffhvh.ogg deleted file mode 100644 index 88b9f1a1e1e..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bababooey/ffffhvh.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bababooey/hohohoy.ogg b/modular_zubbers/code/modules/blooper/voice/bababooey/hohohoy.ogg deleted file mode 100644 index 241668ea67b..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bababooey/hohohoy.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/Xenohiss.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/Xenohiss.ogg deleted file mode 100644 index ec9dd7e6ede..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/Xenohiss.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/caw.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/caw.ogg deleted file mode 100644 index a560d00908c..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/caw.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/chitter.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/chitter.ogg deleted file mode 100644 index 0d162fa3035..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/chitter.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/dont_starve/wilson_blooper.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/dont_starve/wilson_blooper.ogg deleted file mode 100644 index e8aaa06eb0d..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/dont_starve/wilson_blooper.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/dont_starve/wolfgang_blooper.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/dont_starve/wolfgang_blooper.ogg deleted file mode 100644 index 31cbfdf7202..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/dont_starve/wolfgang_blooper.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/dont_starve/woodie_blooper.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/dont_starve/woodie_blooper.ogg deleted file mode 100644 index 8092d66e618..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/dont_starve/woodie_blooper.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/dont_starve/wurt_blooper.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/dont_starve/wurt_blooper.ogg deleted file mode 100644 index d5ede2f3b9d..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/dont_starve/wurt_blooper.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/dont_starve/wx78_blooper.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/dont_starve/wx78_blooper.ogg deleted file mode 100644 index ee58058eb3f..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/dont_starve/wx78_blooper.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/birdwhistle.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/birdwhistle.ogg deleted file mode 100644 index f970f8af458..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/birdwhistle.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/birdwhistle2.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/birdwhistle2.ogg deleted file mode 100644 index 61fd3e850bd..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/birdwhistle2.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/caw.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/caw.ogg deleted file mode 100644 index 21181b65194..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/caw.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/caw2.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/caw2.ogg deleted file mode 100644 index e4e4645034b..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/caw2.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/caw3.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/caw3.ogg deleted file mode 100644 index 8339440d779..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/caw3.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/chitter1.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/chitter1.ogg deleted file mode 100644 index 1854d50a426..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/chitter1.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/dwoop.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/dwoop.ogg deleted file mode 100644 index 785a18431fd..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/dwoop.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/ehh.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/ehh.ogg deleted file mode 100644 index c0b5591ed5b..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/ehh.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/ehh2.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/ehh2.ogg deleted file mode 100644 index 830bb1e29e3..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/ehh2.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/ehh3.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/ehh3.ogg deleted file mode 100644 index bb0925b68b1..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/ehh3.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/ehh4.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/ehh4.ogg deleted file mode 100644 index 5797b131797..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/ehh4.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/ehh5.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/ehh5.ogg deleted file mode 100644 index 970a2040bcd..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/ehh5.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/faucet.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/faucet.ogg deleted file mode 100644 index 56a98a8539f..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/faucet.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/faucet2.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/faucet2.ogg deleted file mode 100644 index 02af88442a6..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/faucet2.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/hoot.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/hoot.ogg deleted file mode 100644 index 316949652ce..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/hoot.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/ribbit.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/ribbit.ogg deleted file mode 100644 index a4299d2a744..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/ribbit.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/tweet.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/tweet.ogg deleted file mode 100644 index b784636e251..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/tweet.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/uhm.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/uhm.ogg deleted file mode 100644 index 857e99c7c5a..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/uhm.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/wurble1.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/wurble1.ogg deleted file mode 100644 index 047eca3510a..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/kazooie/wurble1.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/meow1.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/meow1.ogg deleted file mode 100644 index be9393d7d6e..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/meow1.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/moth/mothchitter2.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/moth/mothchitter2.ogg deleted file mode 100644 index 07619ba1437..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/moth/mothchitter2.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/mothsqueak.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/mothsqueak.ogg deleted file mode 100644 index 5a345df09d2..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/mothsqueak.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_alphys.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_alphys.ogg deleted file mode 100644 index 5b136e8f90b..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_alphys.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_asgore.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_asgore.ogg deleted file mode 100644 index e823a486cc9..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_asgore.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_flowey_1.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_flowey_1.ogg deleted file mode 100644 index 86d00963a3b..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_flowey_1.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_flowey_2.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_flowey_2.ogg deleted file mode 100644 index 8c06e29d21c..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_flowey_2.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_gaster_1.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_gaster_1.ogg deleted file mode 100644 index 1301f1fabd8..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_gaster_1.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_gaster_2.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_gaster_2.ogg deleted file mode 100644 index e6fa2fd4d51..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_gaster_2.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_gaster_3.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_gaster_3.ogg deleted file mode 100644 index 1d6bc2cfc65..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_gaster_3.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_gaster_4.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_gaster_4.ogg deleted file mode 100644 index 047d33aa37d..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_gaster_4.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_gaster_5.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_gaster_5.ogg deleted file mode 100644 index e5d2e73970a..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_gaster_5.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_gaster_6.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_gaster_6.ogg deleted file mode 100644 index 85211ad1353..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_gaster_6.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_gaster_7.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_gaster_7.ogg deleted file mode 100644 index ad584a52e6c..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_gaster_7.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_metta_1.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_metta_1.ogg deleted file mode 100644 index 0d4acf2b637..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_metta_1.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_monster1.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_monster1.ogg deleted file mode 100644 index 94f109c3050..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_monster1.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_monster2.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_monster2.ogg deleted file mode 100644 index baec7392ec3..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_monster2.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_papyrus.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_papyrus.ogg deleted file mode 100644 index 3a69144f389..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_papyrus.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_ralsei.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_ralsei.ogg deleted file mode 100644 index ee7dbb25135..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_ralsei.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_sans.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_sans.ogg deleted file mode 100644 index 7ccfe7b9786..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_sans.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_susie.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_susie.ogg deleted file mode 100644 index bfe3552bb33..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_susie.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_temmie.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_temmie.ogg deleted file mode 100644 index 6e1b72dee2a..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_temmie.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_toriel.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_toriel.ogg deleted file mode 100644 index 326d1c2f9c6..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_toriel.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_undyne.ogg b/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_undyne.ogg deleted file mode 100644 index eebf78fb2f9..00000000000 Binary files a/modular_zubbers/code/modules/blooper/voice/bloopers/undertale/voice_undyne.ogg and /dev/null differ diff --git a/modular_zubbers/code/modules/client/preferences/blooper.dm b/modular_zubbers/code/modules/client/preferences/blooper.dm new file mode 100644 index 00000000000..1644c0d7d47 --- /dev/null +++ b/modular_zubbers/code/modules/client/preferences/blooper.dm @@ -0,0 +1,88 @@ +/datum/preference/choiced/blooper + category = PREFERENCE_CATEGORY_NON_CONTEXTUAL + savefile_identifier = PREFERENCE_CHARACTER + savefile_key = "blooper_choice" + +/datum/preference/choiced/blooper/init_possible_values() + // no bloopers configured, return dummy list to avoid runtimes + if(!length(SSblooper.blooper_list)) + return list("none") + return assoc_to_keys(SSblooper.blooper_list) + +/datum/preference/choiced/blooper/apply_to_human(mob/living/carbon/human/target, value) + target.blooper = SSblooper.blooper_list[value] + +/datum/preference/choiced/blooper/is_accessible(datum/preferences/preferences) + return ..() && length(SSblooper.blooper_list) + +/datum/preference/choiced/blooper/compile_constant_data() + var/list/data = ..() + if(!length(SSblooper.blooper_list)) + return data + var/list/display_names = list() + for(var/id in get_choices()) + display_names[id] = astype(SSblooper.blooper_list[id], /datum/blooper).name + data[CHOICED_PREFERENCE_DISPLAY_NAMES] = display_names + return data + +/datum/preference/numeric/blooper_speed + category = PREFERENCE_CATEGORY_NON_CONTEXTUAL + savefile_identifier = PREFERENCE_CHARACTER + savefile_key = "blooper_speed" + minimum = 0 + maximum = 100 + +/datum/preference/numeric/blooper_speed/apply_to_human(mob/living/carbon/human/target, value) + target.blooper_speed = value + +/datum/preference/numeric/blooper_speed/create_default_value() + return 50 + +/datum/preference/numeric/blooper_speed/is_accessible(datum/preferences/preferences) + return ..() && length(SSblooper.blooper_list) + +/datum/preference/numeric/blooper_pitch + category = PREFERENCE_CATEGORY_NON_CONTEXTUAL + savefile_identifier = PREFERENCE_CHARACTER + savefile_key = "blooper_pitch" + minimum = 0 + maximum = 100 + +/datum/preference/numeric/blooper_pitch/apply_to_human(mob/living/carbon/human/target, value) + target.blooper_pitch = value + +/datum/preference/numeric/blooper_pitch/create_default_value() + return 50 + +/datum/preference/numeric/blooper_pitch/is_accessible(datum/preferences/preferences) + return ..() && length(SSblooper.blooper_list) + +/datum/preference/numeric/blooper_pitch_range + category = PREFERENCE_CATEGORY_NON_CONTEXTUAL + savefile_identifier = PREFERENCE_CHARACTER + savefile_key = "blooper_pitch_range" + minimum = 0 + maximum = 100 + +/datum/preference/numeric/blooper_pitch_range/apply_to_human(mob/living/carbon/human/target, value) + target.blooper_pitch_range = value + +/datum/preference/numeric/blooper_pitch_range/create_default_value() + return 30 + +/datum/preference/numeric/blooper_pitch_range/is_accessible(datum/preferences/preferences) + return ..() && length(SSblooper.blooper_list) + +// Send vocal bloopers +/datum/preference/toggle/send_blooper + category = PREFERENCE_CATEGORY_GAME_PREFERENCES + savefile_identifier = PREFERENCE_PLAYER + savefile_key = "blooper_send" + default_value = TRUE + +// Hear vocal bloopers +/datum/preference/toggle/hear_blooper + category = PREFERENCE_CATEGORY_GAME_PREFERENCES + savefile_identifier = PREFERENCE_PLAYER + savefile_key = "blooper_hear" + default_value = TRUE diff --git a/modular_zubbers/code/modules/client/preferences/middleware/blooper.dm b/modular_zubbers/code/modules/client/preferences/middleware/blooper.dm new file mode 100644 index 00000000000..4edbc76c08b --- /dev/null +++ b/modular_zubbers/code/modules/client/preferences/middleware/blooper.dm @@ -0,0 +1,12 @@ +/datum/preference_middleware/blooper + action_delegations = list( + "play_blooper" = PROC_REF(play_blooper), + ) + +/datum/preference_middleware/blooper/proc/play_blooper(list/params, mob/user) + var/datum/blooper/blooper_to_use = SSblooper.blooper_list[preferences.read_preference(/datum/preference/choiced/blooper)] + var/blooper_speed = preferences.read_preference(/datum/preference/numeric/blooper_speed) + var/blooper_pitch = preferences.read_preference(/datum/preference/numeric/blooper_pitch) + var/blooper_pitch_range = preferences.read_preference(/datum/preference/numeric/blooper_pitch_range) + blooper_to_use.play_bloop(user, list(user), "This is a test message to hear a blooper.", 7, 70, blooper_speed, blooper_pitch, blooper_pitch_range) + return TRUE diff --git a/modular_zubbers/code/modules/mob/living/carbon/human/human.dm b/modular_zubbers/code/modules/mob/living/carbon/human/human.dm index 73877d28f28..d275f5f59ce 100644 --- a/modular_zubbers/code/modules/mob/living/carbon/human/human.dm +++ b/modular_zubbers/code/modules/mob/living/carbon/human/human.dm @@ -4,6 +4,15 @@ /// Used for footstep type pref, to apply to any new legs that get added to this mob. Uses a var instead of checking prefs because there are a lot of clientless mob situations. var/footstep_type +/mob/living/carbon/human/Initialize(mapload) + . = ..() + // clientless mobs are given a random voice + if(!client && length(SSblooper.blooper_list)) + var/blooper_key = pick(SSblooper.blooper_list) + blooper = SSblooper.blooper_list[blooper_key] + blooper_speed = rand(0, 100) + blooper_pitch = rand(0, 100) + blooper_pitch_range = rand(0, 100) /mob/living/carbon/human/species/shadekin race = /datum/species/shadekin diff --git a/modular_zubbers/code/modules/mob/living/living_say.dm b/modular_zubbers/code/modules/mob/living/living_say.dm new file mode 100644 index 00000000000..13a27920f09 --- /dev/null +++ b/modular_zubbers/code/modules/mob/living/living_say.dm @@ -0,0 +1,15 @@ +/mob/living/send_speech(message_raw, message_range = 6, obj/source = src, bubble_type = bubble_icon, list/spans, datum/language/message_language = null, list/message_mods = list(), forced = null, tts_message, list/tts_filter) + . = ..() + if(!blooper) + return + if(client && !(client.prefs.read_preference(/datum/preference/toggle/send_blooper))) + return + if(HAS_TRAIT(src, TRAIT_SIGN_LANG) && !HAS_TRAIT(src, TRAIT_MUTE)) //if you can speak and you sign, your hands don't make a bark. Unless you are completely mute, you can have some hand bark. + return + var/volume = BLOOPER_TRANSMIT_VOLUME + if(message_mods[WHISPER_MODE]) + volume = BLOOPER_TRANSMIT_VOLUME * 0.5 + message_range++ + var/list/listeners = get_hearers_in_view(message_range, source) + var/is_yelling = (say_test(message_raw) == "2") // boost the volume if their message ends in ! + blooper.play_bloop(source, listeners, message_raw, message_range, volume * (is_yelling ? 2 : 1), blooper_speed, blooper_pitch, blooper_pitch_range) diff --git a/modular_zubbers/code/modules/mob/living/silicon/silicon.dm b/modular_zubbers/code/modules/mob/living/silicon/silicon.dm new file mode 100644 index 00000000000..118a0fc5e2a --- /dev/null +++ b/modular_zubbers/code/modules/mob/living/silicon/silicon.dm @@ -0,0 +1,7 @@ +// we let borgs have some bark too +/mob/living/silicon/Login() + blooper = SSblooper.blooper_list[client.prefs.read_preference(/datum/preference/choiced/blooper)] + blooper_speed = client.prefs.read_preference(/datum/preference/numeric/blooper_speed) + blooper_pitch = client.prefs.read_preference(/datum/preference/numeric/blooper_pitch) + blooper_pitch_range = client.prefs.read_preference(/datum/preference/numeric/blooper_pitch_range) + . = ..() diff --git a/tgstation.dme b/tgstation.dme index 01ba18e4c7e..4af63247267 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -514,6 +514,7 @@ #include "code\__DEFINES\~~bubber_defines\access.dm" #include "code\__DEFINES\~~bubber_defines\basic_mobs.dm" #include "code\__DEFINES\~~bubber_defines\bloodsucker.dm" +#include "code\__DEFINES\~~bubber_defines\blooper.dm" #include "code\__DEFINES\~~bubber_defines\bodyparts.dm" #include "code\__DEFINES\~~bubber_defines\cameranets.dm" #include "code\__DEFINES\~~bubber_defines\changeling_zombie.dm" @@ -543,7 +544,6 @@ #include "code\__DEFINES\~~bubber_defines\research_categories.dm" #include "code\__DEFINES\~~bubber_defines\robot_defines.dm" #include "code\__DEFINES\~~bubber_defines\role_preferences.dm" -#include "code\__DEFINES\~~bubber_defines\say.dm" #include "code\__DEFINES\~~bubber_defines\signals.dm" #include "code\__DEFINES\~~bubber_defines\span.dm" #include "code\__DEFINES\~~bubber_defines\species.dm" @@ -554,7 +554,6 @@ #include "code\__DEFINES\~~bubber_defines\transport.dm" #include "code\__DEFINES\~~bubber_defines\vehicles.dm" #include "code\__DEFINES\~~bubber_defines\vomit.dm" -#include "code\__DEFINES\~~bubber_defines\___HELPERS\global_lists.dm" #include "code\__DEFINES\~~bubber_defines\atmospherics\atmos_mob_interaction.dm" #include "code\__DEFINES\~~bubber_defines\research\techweb_nodes.dm" #include "code\__DEFINES\~~bubber_defines\traits\declarations.dm" @@ -8875,6 +8874,7 @@ #include "modular_zubbers\code\controllers\configuration\entries\game_options.dm" #include "modular_zubbers\code\controllers\configuration\entries\nsfw.dm" #include "modular_zubbers\code\controllers\subsystem\air.dm" +#include "modular_zubbers\code\controllers\subsystem\blooper.dm" #include "modular_zubbers\code\controllers\subsystem\dynamic_xmas_blacklist.dm" #include "modular_zubbers\code\controllers\subsystem\job.dm" #include "modular_zubbers\code\controllers\subsystem\map_vote.dm" @@ -8891,6 +8891,7 @@ #include "modular_zubbers\code\controllers\subsystem\processing\sol_subsystem.dm" #include "modular_zubbers\code\datums\action.dm" #include "modular_zubbers\code\datums\akula_overrides.dm" +#include "modular_zubbers\code\datums\blooper.dm" #include "modular_zubbers\code\datums\deadline_alert.dm" #include "modular_zubbers\code\datums\ert.dm" #include "modular_zubbers\code\datums\view.dm" @@ -9019,6 +9020,7 @@ #include "modular_zubbers\code\datums\weather\weather_types\radiation_storm.dm" #include "modular_zubbers\code\datums\weather\weather_types\sand_storm.dm" #include "modular_zubbers\code\datums\wounds\permanent_limp.dm" +#include "modular_zubbers\code\game\atoms_movable.dm" #include "modular_zubbers\code\game\area\areas.dm" #include "modular_zubbers\code\game\area\nanite.dm" #include "modular_zubbers\code\game\area\areas\centcom.dm" @@ -9223,6 +9225,7 @@ #include "modular_zubbers\code\modules\antagonists\bloodsucker\vassal\vassal_types\ex_vassal.dm" #include "modular_zubbers\code\modules\antagonists\bloodsucker\vassal\vassal_types\favorite_vassal.dm" #include "modular_zubbers\code\modules\antagonists\bloodsucker\vassal\vassal_types\revenge_vassal.dm" +#include "modular_zubbers\code\modules\antagonists\changeling\changeling.dm" #include "modular_zubbers\code\modules\antagonists\changeling\powers\headcrab.dm" #include "modular_zubbers\code\modules\antagonists\ert\make_ert.dm" #include "modular_zubbers\code\modules\antagonists\ert\names.dm" @@ -9262,9 +9265,6 @@ #include "modular_zubbers\code\modules\automapper\code\overrides\area_spawn_subsystem.dm" #include "modular_zubbers\code\modules\beserk_ability_onstation\beserk.dm" #include "modular_zubbers\code\modules\bitrunning\disks.dm" -#include "modular_zubbers\code\modules\blooper\atoms_movable.dm" -#include "modular_zubbers\code\modules\blooper\bark.dm" -#include "modular_zubbers\code\modules\blooper\bark_list.dm" #include "modular_zubbers\code\modules\bodyparts\code\moth_bodyparts.dm" #include "modular_zubbers\code\modules\borer_hud\borer.dm" #include "modular_zubbers\code\modules\bow_adjustments\arrow.dm" @@ -9300,6 +9300,7 @@ #include "modular_zubbers\code\modules\client\ssd.dm" #include "modular_zubbers\code\modules\client\autopunctuation\preferences.dm" #include "modular_zubbers\code\modules\client\flavor_text\flavor_text.dm" +#include "modular_zubbers\code\modules\client\preferences\blooper.dm" #include "modular_zubbers\code\modules\client\preferences\footstep_sound.dm" #include "modular_zubbers\code\modules\client\preferences\permanent_limp.dm" #include "modular_zubbers\code\modules\client\preferences\player_panel.dm" @@ -9307,6 +9308,7 @@ #include "modular_zubbers\code\modules\client\preferences\screen.dm" #include "modular_zubbers\code\modules\client\preferences\sounds.dm" #include "modular_zubbers\code\modules\client\preferences\unique_blood_color.dm" +#include "modular_zubbers\code\modules\client\preferences\middleware\blooper.dm" #include "modular_zubbers\code\modules\client\verbs\character_directory.dm" #include "modular_zubbers\code\modules\clothing\_job.dm" #include "modular_zubbers\code\modules\clothing\donator_clothing.dm" @@ -9570,6 +9572,7 @@ #include "modular_zubbers\code\modules\mob\living\examine.dm" #include "modular_zubbers\code\modules\mob\living\living.dm" #include "modular_zubbers\code\modules\mob\living\living_defines.dm" +#include "modular_zubbers\code\modules\mob\living\living_say.dm" #include "modular_zubbers\code\modules\mob\living\basic\bots\firebot.dm" #include "modular_zubbers\code\modules\mob\living\basic\guardian\guardian_types\holoparasite_timestop.dm" #include "modular_zubbers\code\modules\mob\living\basic\lightgeist\lightgeist.dm" @@ -9644,6 +9647,7 @@ #include "modular_zubbers\code\modules\mob\living\carbon\human\species_types\vox_primalis.dm" #include "modular_zubbers\code\modules\mob\living\carbon\human\species_types\vulpkanin.dm" #include "modular_zubbers\code\modules\mob\living\carbon\human\species_types\zombie.dm" +#include "modular_zubbers\code\modules\mob\living\silicon\silicon.dm" #include "modular_zubbers\code\modules\mob\living\silicon\robot\robot.dm" #include "modular_zubbers\code\modules\mob\living\simple_animal\guardian\guardian.dm" #include "modular_zubbers\code\modules\mob\living\simple_animal\hostile\megafauna\drake.dm" diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/bubbers/blooper.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/bubbers/blooper.tsx new file mode 100644 index 00000000000..2e0e85f7fda --- /dev/null +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/bubbers/blooper.tsx @@ -0,0 +1,58 @@ +import { useBackend } from 'tgui/backend'; +import { Button, Stack } from 'tgui-core/components'; +import { + type FeatureChoiced, + type FeatureChoicedServerData, + type FeatureNumeric, + FeatureSliderInput, + type FeatureValueProps, +} from '../../base'; +import { FeatureDropdownInput } from '../../dropdowns'; + +const FeatureBlooperDropdownInput = ( + props: FeatureValueProps, +) => { + const { act } = useBackend(); + + return ( + + + + + +