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 (
+
+
+
+
+
+
+
+ );
+};
+
+export const blooper_choice: FeatureChoiced = {
+ name: 'Character Voice',
+ component: FeatureBlooperDropdownInput,
+};
+
+export const blooper_speed: FeatureNumeric = {
+ name: 'Character Voice Speed %',
+ description: 'Lower number, slower voice. Higher number, faster voice.',
+ component: FeatureSliderInput,
+};
+
+export const blooper_pitch: FeatureNumeric = {
+ name: 'Character Voice Pitch %',
+ description: 'Lower number, deeper pitch. Higher number, higher pitch.',
+ component: FeatureSliderInput,
+};
+
+export const blooper_pitch_range: FeatureNumeric = {
+ name: 'Character Voice Range %',
+ description:
+ 'Lower number, less pitch range. Higher number, more pitch range.',
+ component: FeatureSliderInput,
+};
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/bubbers/character_voice.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/bubbers/character_voice.tsx
deleted file mode 100644
index 162ff254c7d..00000000000
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/bubbers/character_voice.tsx
+++ /dev/null
@@ -1,79 +0,0 @@
-import { Button, Stack } from 'tgui-core/components';
-
-import { useBackend } from '../../../../../../backend';
-import {
- CheckboxInput,
- type Feature,
- type FeatureChoiced,
- FeatureNumberInput,
- type FeatureNumeric,
- FeatureSliderInput,
- type FeatureToggle,
-} from '../../base';
-import { FeatureDropdownInput } from '../../dropdowns';
-
-const FeatureBlooperDropdownInput = (props) => {
- const { act } = useBackend();
- return (
-
-
-
-
-
-
-
- );
-};
-
-export const blooper_pitch_range: FeatureNumeric = {
- name: 'Character Voice Range',
- description:
- '[0.1 - 0.8] Lower number, less range. Higher number, more range.',
- component: FeatureNumberInput,
-};
-
-export const blooper_speech: FeatureChoiced = {
- name: 'Character Voice',
- component: FeatureBlooperDropdownInput,
-};
-
-export const blooper_speech_speed: FeatureNumeric = {
- name: 'Character Voice Speed',
- description:
- '[2 - 16] Lower number, faster speed. Higher number, slower voice.',
- component: FeatureNumberInput,
-};
-
-export const blooper_speech_pitch: FeatureNumeric = {
- name: 'Character Voice Pitch',
- description:
- '[0.4 - 2] Lower number, deeper pitch. Higher number, higher pitch.',
- component: FeatureNumberInput,
-};
-
-export const hear_sound_blooper: FeatureToggle = {
- name: 'Enable Vocal Bark hearing',
- category: 'SOUND',
- component: CheckboxInput,
-};
-
-export const sound_blooper_volume: Feature = {
- name: 'Vocal Bark Volume',
- category: 'SOUND',
- description: 'The volume that the Vocal Barks sounds will play at.',
- component: FeatureSliderInput,
-};
-
-export const send_sound_blooper: FeatureToggle = {
- name: 'Enable Vocal Bark sending',
- category: 'SOUND',
- component: CheckboxInput,
-};
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/bubber/blooper.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/bubber/blooper.tsx
new file mode 100644
index 00000000000..32a4b2fec91
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/bubber/blooper.tsx
@@ -0,0 +1,16 @@
+import { CheckboxInput, type FeatureToggle } from '../../base';
+
+export const blooper_send: FeatureToggle = {
+ name: 'Enable sending vocal bloopers',
+ category: 'SOUND',
+ description:
+ 'When enabled, plays a customizable sound effect when your character speaks.',
+ component: CheckboxInput,
+};
+
+export const blooper_hear: FeatureToggle = {
+ name: 'Enable hearing vocal bloopers',
+ category: 'SOUND',
+ description: `When enabled, allows you to hear other character's speech sounds.`,
+ component: CheckboxInput,
+};