diff --git a/code/__DEFINES/~ff_defines/__HELPERS/global_lists.dm b/code/__DEFINES/~ff_defines/__HELPERS/global_lists.dm
new file mode 100644
index 00000000000..80f5c2a54e5
--- /dev/null
+++ b/code/__DEFINES/~ff_defines/__HELPERS/global_lists.dm
@@ -0,0 +1,2 @@
+GLOBAL_LIST_EMPTY(blooper_list)
+GLOBAL_LIST_EMPTY(blooper_random_list)
diff --git a/code/__DEFINES/~ff_defines/say.dm b/code/__DEFINES/~ff_defines/say.dm
new file mode 100644
index 00000000000..528ec2362fc
--- /dev/null
+++ b/code/__DEFINES/~ff_defines/say.dm
@@ -0,0 +1,19 @@
+//BLOOPER defines
+#define BLOOPER_DEFAULT_MINPITCH 0.4
+#define BLOOPER_DEFAULT_MAXPITCH 2
+#define BLOOPER_DEFAULT_MINVARY 0.1
+#define BLOOPER_DEFAULT_MAXVARY 0.8
+#define BLOOPER_DEFAULT_MINSPEED 2
+#define BLOOPER_DEFAULT_MAXSPEED 16
+
+#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_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/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index 616469ecabf..a3353dc5c1d 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -54,6 +54,14 @@
sort_list(GLOB.laugh_types, GLOBAL_PROC_REF(cmp_typepaths_asc))
//SKYRAT EDIT END
+ //THE FLUFFY FRONTIER EDIT ADDITION BEGIN - Blooper
+ for(var/sound_blooper_path in subtypesof(/datum/blooper))
+ var/datum/blooper/B = new sound_blooper_path()
+ GLOB.blooper_list[B.id] = sound_blooper_path
+ if(B.allow_random)
+ GLOB.blooper_random_list[B.id] = sound_blooper_path
+ //THE FLUFFY FRONTIER EDIT END
+
/// Inits GLOB.species_list. Not using GLOBAL_LIST_INIT b/c it depends on GLOB.string_lists
/proc/init_species_list()
for(var/species_path in subtypesof(/datum/species))
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index 53b248fde38..2c606c06d5a 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -478,6 +478,12 @@
if(NAMEOF(src, glide_size))
set_glide_size(var_value)
. = TRUE
+ // THE FLUFFY FRONTIER 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 FLUFFY FRONTIER EDIT ADDITION END
if(!isnull(.))
datum_flags |= DF_VAR_EDITED
diff --git a/tff_modular/modules/blooper/atoms_movable.dm b/tff_modular/modules/blooper/atoms_movable.dm
new file mode 100644
index 00000000000..3ab14b8ead8
--- /dev/null
+++ b/tff_modular/modules/blooper/atoms_movable.dm
@@ -0,0 +1,84 @@
+/atom/movable
+ // Text-to-blooper sounds
+ // Да. У нас все атом могут иметь звучение для 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 = 70
+ 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
+
+/randomize_human(mob/living/carbon/human/human)
+ . = ..()
+ human.set_blooper(pick(GLOB.blooper_random_list))
+ human.blooper_pitch = BLOOPER_PITCH_RAND(human.gender)
+ human.blooper_pitch_range = BLOOPER_VARIANCE_RAND
+
+/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)
+ if(!(client?.prefs.read_preference(/datum/preference/toggle/send_sound_blooper)))
+ return
+ blooper_volume = 55
+ if(message_mods[WHISPER_MODE])
+ blooper_volume = 25
+ 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
+ if(!(M.client?.prefs.read_preference(/datum/preference/toggle/hear_sound_blooper)))
+ 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) //На седьмом тайле функция равна нулю, поэтому мы обязаны ставить максимум на 1 тайл дальше.
+ 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/tff_modular/modules/blooper/bark.dm b/tff_modular/modules/blooper/bark.dm
new file mode 100644
index 00000000000..b1a45d45bf9
--- /dev/null
+++ b/tff_modular/modules/blooper/bark.dm
@@ -0,0 +1,148 @@
+GLOBAL_VAR_INIT(blooper_allowed, TRUE) // For administrators
+
+/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 ANNOYING NOIZES"
+ set name = "Toggle Blooper"
+ toggle_blooper()
+ log_admin("[key_name(usr)] toggled Blooper.")
+ message_admins("[key_name_admin(usr)] toggled Blooper.")
+ SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Blooper", "[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, "The Blooper has 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, /datum/preference/numeric/blooper_speech_speed)
+ target.set_blooper(value)
+
+/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
+
+
+/// Могу ли я использовать свой блупер?
+/datum/preference/toggle/send_sound_blooper
+ category = PREFERENCE_CATEGORY_GAME_PREFERENCES
+ savefile_key = "send_sound_blooper"
+ savefile_identifier = PREFERENCE_PLAYER
+ default_value = FALSE
+
+/// Могу ли я слышать блупки остальных?
+/datum/preference/toggle/hear_sound_blooper
+ category = PREFERENCE_CATEGORY_GAME_PREFERENCES
+ savefile_key = "hear_sound_blooper"
+ savefile_identifier = PREFERENCE_PLAYER
+ default_value = FALSE
+
+/// It's was stoolen from Splurt build >:3
+/datum/blooper
+ var/name = "None"
+ var/id = "Default"
+ 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/tff_modular/modules/blooper/bark_list.dm b/tff_modular/modules/blooper/bark_list.dm
new file mode 100644
index 00000000000..d726fb7584e
--- /dev/null
+++ b/tff_modular/modules/blooper/bark_list.dm
@@ -0,0 +1,432 @@
+/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/toysqueak1.ogg'
+ maxspeed = 4
+
+/datum/blooper/beep
+ name = "Beepy"
+ id = "beep"
+ soundpath = 'sound/machines/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 = 'tff_modular/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/uplinkerror.ogg'
+
+/datum/blooper/bullet
+ name = "Windy"
+ id = "bullet"
+ maxpitch = 1.6
+ soundpath = 'sound/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 = 'tff_modular/modules/blooper/voice/bloopers/mothsqueak.ogg'
+ allow_random = TRUE
+ ignore = FALSE
+
+/datum/blooper/meow //Meow blooper?
+ name = "Meow"
+ id = "meow"
+ allow_random = TRUE
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/meow1.ogg'
+ minspeed = 5
+ maxspeed = 11
+
+/datum/blooper/chirp
+ name = "Chirp"
+ id = "chirp"
+ allow_random = TRUE
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/chirp.ogg'
+
+/datum/blooper/caw
+ name = "Caw"
+ id = "caw"
+ allow_random = TRUE
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/caw.ogg'
+
+//Undertale
+/datum/blooper/alphys
+ name = "Alphys"
+ id = "alphys"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/undertale/voice_alphys.ogg'
+ minvariance = 0
+
+/datum/blooper/asgore
+ name = "Asgore"
+ id = "asgore"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/undertale/voice_asgore.ogg'
+ minvariance = 0
+
+/datum/blooper/flowey
+ name = "Flowey (normal)"
+ id = "flowey1"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/undertale/voice_flowey_1.ogg'
+ minvariance = 0
+
+/datum/blooper/flowey/evil
+ name = "Flowey (evil)"
+ id = "flowey2"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/undertale/voice_flowey_2.ogg'
+ minvariance = 0
+
+/datum/blooper/papyrus
+ name = "Papyrus"
+ id = "papyrus"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/undertale/voice_papyrus.ogg'
+ minvariance = 0
+
+/datum/blooper/ralsei
+ name = "Ralsei"
+ id = "ralsei"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/undertale/voice_ralsei.ogg'
+ minvariance = 0
+
+/datum/blooper/sans //real
+ name = "Sans"
+ id = "sans"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/undertale/voice_sans.ogg'
+ minvariance = 0
+
+/datum/blooper/toriel
+ name = "Toriel"
+ id = "toriel"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/undertale/voice_toriel.ogg'
+ minvariance = 0
+ maxpitch = BLOOPER_DEFAULT_MAXPITCH*2
+
+/datum/blooper/undyne
+ name = "Undyne"
+ id = "undyne"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/undertale/voice_undyne.ogg'
+ minvariance = 0
+
+/datum/blooper/temmie
+ name = "Temmie"
+ id = "temmie"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/undertale/voice_temmie.ogg'
+ minvariance = 0
+
+/datum/blooper/susie
+ name = "Susie"
+ id = "susie"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/undertale/voice_susie.ogg'
+ minvariance = 0
+
+/datum/blooper/gaster
+ name = "Gaster"
+ id = "gaster"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/undertale/voice_gaster_1.ogg'
+ minvariance = 0
+
+/datum/blooper/mettaton
+ name = "Mettaton"
+ id = "mettaton"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/undertale/voice_metta_1.ogg'
+ minvariance = 0
+
+/datum/blooper/gen_monster
+ name = "Generic Monster 1"
+ id = "gen_monster_1"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/undertale/voice_monster1.ogg'
+ minvariance = 0
+
+/datum/blooper/gen_monster/alt
+ name = "Generic Monster 2"
+ id = "gen_monster_2"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/undertale/voice_monster2.ogg'
+ minvariance = 0
+
+/datum/blooper/wilson
+ name = "Wilson"
+ id = "wilson"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/dont_starve/wilson_blooper.ogg'
+
+/datum/blooper/wolfgang
+ name = "Wolfgang"
+ id = "wolfgang"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/dont_starve/wolfgang_blooper.ogg'
+ minspeed = 4
+ maxspeed = 10
+
+/datum/blooper/woodie
+ name = "Woodie"
+ id = "woodie"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/dont_starve/woodie_blooper.ogg'
+ minspeed = 4
+ maxspeed = 10
+
+/datum/blooper/wurt
+ name = "Wurt"
+ id = "wurt"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/dont_starve/wurt_blooper.ogg'
+
+/datum/blooper/wx78
+ name = "wx78"
+ id = "wx78"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/dont_starve/wx78_blooper.ogg'
+ minspeed = 3
+ maxspeed = 9
+
+/datum/blooper/blub
+ name = "Blub"
+ id = "blub"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/goon/blub.ogg'
+
+/datum/blooper/bottalk
+ name = "Bottalk 1"
+ id = "bottalk1"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/goon/bottalk_1.ogg'
+ minspeed = 3
+ maxspeed = 9
+
+/datum/blooper/bottalk/alt1
+ name = "Bottalk 2"
+ id = "bottalk2"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/goon/bottalk_2.ogg'
+
+/datum/blooper/bottalk/alt2
+ name = "Bottalk 3"
+ id = "bottalk3"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/goon/bottalk_3.ogg'
+
+/datum/blooper/bottalk/alt3
+ name = "Bottalk 4"
+ id = "bottalk4"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/goon/bottalk_4.ogg'
+
+/datum/blooper/buwoo
+ name = "Buwoo"
+ id = "buwoo"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/goon/buwoo.ogg'
+
+/datum/blooper/cow
+ name = "Cow"
+ id = "cow"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/goon/cow.ogg'
+
+/datum/blooper/lizard
+ name = "Lizard"
+ id = "lizard"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/goon/lizard.ogg'
+
+/datum/blooper/pug
+ name = "Pug"
+ id = "pug"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/goon/pug.ogg'
+
+/datum/blooper/pugg
+ name = "Pugg"
+ id = "pugg"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/goon/pugg.ogg'
+
+/datum/blooper/radio
+ name = "Radio 1"
+ id = "radio1"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/goon/radio.ogg'
+
+/datum/blooper/radio/short
+ name = "Radio 2"
+ id = "radio2"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/goon/radio2.ogg'
+
+/datum/blooper/radio/ai
+ name = "Radio (AI)"
+ id = "radio_ai"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/goon/radio_ai.ogg'
+
+/datum/blooper/roach //Turkish characters be like
+ name = "Roach"
+ id = "roach"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/goon/roach.ogg'
+
+/datum/blooper/skelly
+ name = "Skelly"
+ id = "skelly"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/goon/skelly.ogg'
+
+/datum/blooper/speak
+ name = "Speak 1"
+ id = "speak1"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/goon/speak_1.ogg'
+
+/datum/blooper/speak/alt1
+ name = "Speak 2"
+ id = "speak2"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/goon/speak_2.ogg'
+
+/datum/blooper/speak/alt2
+ name = "Speak 3"
+ id = "speak3"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/goon/speak_3.ogg'
+
+/datum/blooper/speak/alt3
+ name = "Speak 4"
+ id = "speak4"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/goon/speak_4.ogg'
+
+/datum/blooper/chitter/alt
+ name = "Chittery Alt"
+ id = "chitter2"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/moth/mothchitter2.ogg'
+
+// The Mayhem Special
+/datum/blooper/whistle
+ name = "Whistle 1"
+ id = "whistle1"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/kazooie/birdwhistle.ogg'
+
+/datum/blooper/whistle/alt1
+ name = "Whistle 2"
+ id = "whistle2"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/kazooie/birdwhistle2.ogg'
+
+/datum/blooper/caw/alt1
+ name = "Caw 2"
+ id = "caw2"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/kazooie/caw.ogg'
+ minspeed = 4
+ maxspeed = 9
+
+/datum/blooper/caw/alt2
+ name = "Caw 3"
+ id = "caw3"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/kazooie/caw2.ogg'
+ minspeed = 3
+ maxspeed = 9
+
+/datum/blooper/caw/alt3
+ name = "Caw 4"
+ id = "caw4"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/kazooie/caw3.ogg'
+ minspeed = 3
+ maxspeed = 9
+
+/datum/blooper/ehh
+ name = "Ehh 1"
+ id = "ehh1"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/kazooie/ehh.ogg'
+ minspeed = 3
+ maxspeed = 9
+
+/datum/blooper/ehh/alt1
+ name = "Ehh 2"
+ id = "ehh2"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/kazooie/ehh2.ogg'
+
+/datum/blooper/ehh/alt2
+ name = "Ehh 3"
+ id = "ehh3"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/kazooie/ehh3.ogg'
+
+/datum/blooper/ehh/alt3
+ name = "Ehh 4"
+ id = "ehh4"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/kazooie/ehh4.ogg'
+ minspeed = 3
+ maxspeed = 9
+
+/datum/blooper/ehh/alt5
+ name = "Ehh 5"
+ id = "ehh5"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/kazooie/ehh5.ogg'
+
+/datum/blooper/faucet
+ name = "Faucet 1"
+ id = "faucet1"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/kazooie/faucet.ogg'
+
+/datum/blooper/faucet/alt1
+ name = "Faucet 2"
+ id = "faucet2"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/kazooie/faucet2.ogg'
+
+/datum/blooper/ribbit
+ name = "Ribbit"
+ id = "ribbit"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/kazooie/ribbit.ogg'
+
+/datum/blooper/hoot
+ name = "Hoot"
+ id = "hoot"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/kazooie/hoot.ogg'
+ minspeed = 4
+ maxspeed = 9
+
+/datum/blooper/tweet
+ name = "Tweet"
+ id = "tweet"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/kazooie/tweet.ogg'
+
+/datum/blooper/dwoop
+ name = "Dwoop"
+ id = "dwoop"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/kazooie/dwoop.ogg'
+ minspeed = 3
+ maxspeed = 9
+
+/datum/blooper/uhm
+ name = "Uhm"
+ id = "uhm"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/kazooie/uhm.ogg'
+
+/datum/blooper/wurtesh
+ name = "Wurtesh"
+ id = "wurtesh"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/kazooie/wurble1.ogg'
+
+/datum/blooper/chitter2
+ name = "Chitter2"
+ id = "chitter2"
+ soundpath = 'tff_modular/modules/blooper/voice/bloopers/kazooie/chitter1.ogg'
+
diff --git a/tff_modular/modules/blooper/voice/bababooey/bababooey.ogg b/tff_modular/modules/blooper/voice/bababooey/bababooey.ogg
new file mode 100644
index 00000000000..87c7e802bde
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bababooey/bababooey.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bababooey/bababooey2.ogg b/tff_modular/modules/blooper/voice/bababooey/bababooey2.ogg
new file mode 100644
index 00000000000..53b2b3d0d49
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bababooey/bababooey2.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bababooey/babafooey.ogg b/tff_modular/modules/blooper/voice/bababooey/babafooey.ogg
new file mode 100644
index 00000000000..63f7db4b12c
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bababooey/babafooey.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bababooey/fafafoggy.ogg b/tff_modular/modules/blooper/voice/bababooey/fafafoggy.ogg
new file mode 100644
index 00000000000..9851fb66717
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bababooey/fafafoggy.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bababooey/fafafoggy2.ogg b/tff_modular/modules/blooper/voice/bababooey/fafafoggy2.ogg
new file mode 100644
index 00000000000..425be3a4c72
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bababooey/fafafoggy2.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bababooey/fafafooey.ogg b/tff_modular/modules/blooper/voice/bababooey/fafafooey.ogg
new file mode 100644
index 00000000000..b3d58813586
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bababooey/fafafooey.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bababooey/fafafooey2.ogg b/tff_modular/modules/blooper/voice/bababooey/fafafooey2.ogg
new file mode 100644
index 00000000000..d4602643ecb
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bababooey/fafafooey2.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bababooey/fafafooey3.ogg b/tff_modular/modules/blooper/voice/bababooey/fafafooey3.ogg
new file mode 100644
index 00000000000..183344cb7dc
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bababooey/fafafooey3.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bababooey/ffff.ogg b/tff_modular/modules/blooper/voice/bababooey/ffff.ogg
new file mode 100644
index 00000000000..c55f5ced519
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bababooey/ffff.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bababooey/ffffhvh.ogg b/tff_modular/modules/blooper/voice/bababooey/ffffhvh.ogg
new file mode 100644
index 00000000000..88b9f1a1e1e
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bababooey/ffffhvh.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bababooey/hohohoy.ogg b/tff_modular/modules/blooper/voice/bababooey/hohohoy.ogg
new file mode 100644
index 00000000000..241668ea67b
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bababooey/hohohoy.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/caw.ogg b/tff_modular/modules/blooper/voice/bloopers/caw.ogg
new file mode 100644
index 00000000000..a560d00908c
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/caw.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/chirp.ogg b/tff_modular/modules/blooper/voice/bloopers/chirp.ogg
new file mode 100644
index 00000000000..73cb0376d21
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/chirp.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/chitter.ogg b/tff_modular/modules/blooper/voice/bloopers/chitter.ogg
new file mode 100644
index 00000000000..0d162fa3035
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/chitter.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/dont_starve/wilson_blooper.ogg b/tff_modular/modules/blooper/voice/bloopers/dont_starve/wilson_blooper.ogg
new file mode 100644
index 00000000000..e8aaa06eb0d
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/dont_starve/wilson_blooper.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/dont_starve/wolfgang_blooper.ogg b/tff_modular/modules/blooper/voice/bloopers/dont_starve/wolfgang_blooper.ogg
new file mode 100644
index 00000000000..31cbfdf7202
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/dont_starve/wolfgang_blooper.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/dont_starve/woodie_blooper.ogg b/tff_modular/modules/blooper/voice/bloopers/dont_starve/woodie_blooper.ogg
new file mode 100644
index 00000000000..8092d66e618
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/dont_starve/woodie_blooper.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/dont_starve/wurt_blooper.ogg b/tff_modular/modules/blooper/voice/bloopers/dont_starve/wurt_blooper.ogg
new file mode 100644
index 00000000000..d5ede2f3b9d
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/dont_starve/wurt_blooper.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/dont_starve/wx78_blooper.ogg b/tff_modular/modules/blooper/voice/bloopers/dont_starve/wx78_blooper.ogg
new file mode 100644
index 00000000000..ee58058eb3f
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/dont_starve/wx78_blooper.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/goon/blub.ogg b/tff_modular/modules/blooper/voice/bloopers/goon/blub.ogg
new file mode 100644
index 00000000000..ee6de6ede44
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/goon/blub.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/goon/bottalk_1.ogg b/tff_modular/modules/blooper/voice/bloopers/goon/bottalk_1.ogg
new file mode 100644
index 00000000000..b7272249989
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/goon/bottalk_1.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/goon/bottalk_2.ogg b/tff_modular/modules/blooper/voice/bloopers/goon/bottalk_2.ogg
new file mode 100644
index 00000000000..745b1a4edcc
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/goon/bottalk_2.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/goon/bottalk_3.ogg b/tff_modular/modules/blooper/voice/bloopers/goon/bottalk_3.ogg
new file mode 100644
index 00000000000..e91f6bc1567
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/goon/bottalk_3.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/goon/bottalk_4.ogg b/tff_modular/modules/blooper/voice/bloopers/goon/bottalk_4.ogg
new file mode 100644
index 00000000000..3cf58966f7f
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/goon/bottalk_4.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/goon/buwoo.ogg b/tff_modular/modules/blooper/voice/bloopers/goon/buwoo.ogg
new file mode 100644
index 00000000000..45bcbd50c6b
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/goon/buwoo.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/goon/cow.ogg b/tff_modular/modules/blooper/voice/bloopers/goon/cow.ogg
new file mode 100644
index 00000000000..db6c0a63ca2
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/goon/cow.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/goon/lizard.ogg b/tff_modular/modules/blooper/voice/bloopers/goon/lizard.ogg
new file mode 100644
index 00000000000..48638b0f236
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/goon/lizard.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/goon/pug.ogg b/tff_modular/modules/blooper/voice/bloopers/goon/pug.ogg
new file mode 100644
index 00000000000..86d50225a52
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/goon/pug.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/goon/pugg.ogg b/tff_modular/modules/blooper/voice/bloopers/goon/pugg.ogg
new file mode 100644
index 00000000000..90fa070e8b7
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/goon/pugg.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/goon/radio.ogg b/tff_modular/modules/blooper/voice/bloopers/goon/radio.ogg
new file mode 100644
index 00000000000..0dcb87214ff
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/goon/radio.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/goon/radio2.ogg b/tff_modular/modules/blooper/voice/bloopers/goon/radio2.ogg
new file mode 100644
index 00000000000..a9364857a53
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/goon/radio2.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/goon/radio_ai.ogg b/tff_modular/modules/blooper/voice/bloopers/goon/radio_ai.ogg
new file mode 100644
index 00000000000..97eaf17417d
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/goon/radio_ai.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/goon/roach.ogg b/tff_modular/modules/blooper/voice/bloopers/goon/roach.ogg
new file mode 100644
index 00000000000..1bc765fa989
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/goon/roach.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/goon/skelly.ogg b/tff_modular/modules/blooper/voice/bloopers/goon/skelly.ogg
new file mode 100644
index 00000000000..b8e1a2921a4
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/goon/skelly.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/goon/speak_1.ogg b/tff_modular/modules/blooper/voice/bloopers/goon/speak_1.ogg
new file mode 100644
index 00000000000..ab8ddde4a66
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/goon/speak_1.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/goon/speak_2.ogg b/tff_modular/modules/blooper/voice/bloopers/goon/speak_2.ogg
new file mode 100644
index 00000000000..a8c9444a52f
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/goon/speak_2.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/goon/speak_3.ogg b/tff_modular/modules/blooper/voice/bloopers/goon/speak_3.ogg
new file mode 100644
index 00000000000..33ec079b84d
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/goon/speak_3.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/goon/speak_4.ogg b/tff_modular/modules/blooper/voice/bloopers/goon/speak_4.ogg
new file mode 100644
index 00000000000..6de26114aee
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/goon/speak_4.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/kazooie/birdwhistle.ogg b/tff_modular/modules/blooper/voice/bloopers/kazooie/birdwhistle.ogg
new file mode 100644
index 00000000000..f970f8af458
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/kazooie/birdwhistle.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/kazooie/birdwhistle2.ogg b/tff_modular/modules/blooper/voice/bloopers/kazooie/birdwhistle2.ogg
new file mode 100644
index 00000000000..61fd3e850bd
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/kazooie/birdwhistle2.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/kazooie/caw.ogg b/tff_modular/modules/blooper/voice/bloopers/kazooie/caw.ogg
new file mode 100644
index 00000000000..21181b65194
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/kazooie/caw.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/kazooie/caw2.ogg b/tff_modular/modules/blooper/voice/bloopers/kazooie/caw2.ogg
new file mode 100644
index 00000000000..e4e4645034b
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/kazooie/caw2.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/kazooie/caw3.ogg b/tff_modular/modules/blooper/voice/bloopers/kazooie/caw3.ogg
new file mode 100644
index 00000000000..8339440d779
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/kazooie/caw3.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/kazooie/chitter1.ogg b/tff_modular/modules/blooper/voice/bloopers/kazooie/chitter1.ogg
new file mode 100644
index 00000000000..1854d50a426
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/kazooie/chitter1.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/kazooie/dwoop.ogg b/tff_modular/modules/blooper/voice/bloopers/kazooie/dwoop.ogg
new file mode 100644
index 00000000000..785a18431fd
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/kazooie/dwoop.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/kazooie/ehh.ogg b/tff_modular/modules/blooper/voice/bloopers/kazooie/ehh.ogg
new file mode 100644
index 00000000000..c0b5591ed5b
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/kazooie/ehh.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/kazooie/ehh2.ogg b/tff_modular/modules/blooper/voice/bloopers/kazooie/ehh2.ogg
new file mode 100644
index 00000000000..830bb1e29e3
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/kazooie/ehh2.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/kazooie/ehh3.ogg b/tff_modular/modules/blooper/voice/bloopers/kazooie/ehh3.ogg
new file mode 100644
index 00000000000..bb0925b68b1
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/kazooie/ehh3.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/kazooie/ehh4.ogg b/tff_modular/modules/blooper/voice/bloopers/kazooie/ehh4.ogg
new file mode 100644
index 00000000000..5797b131797
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/kazooie/ehh4.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/kazooie/ehh5.ogg b/tff_modular/modules/blooper/voice/bloopers/kazooie/ehh5.ogg
new file mode 100644
index 00000000000..970a2040bcd
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/kazooie/ehh5.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/kazooie/faucet.ogg b/tff_modular/modules/blooper/voice/bloopers/kazooie/faucet.ogg
new file mode 100644
index 00000000000..56a98a8539f
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/kazooie/faucet.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/kazooie/faucet2.ogg b/tff_modular/modules/blooper/voice/bloopers/kazooie/faucet2.ogg
new file mode 100644
index 00000000000..02af88442a6
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/kazooie/faucet2.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/kazooie/hoot.ogg b/tff_modular/modules/blooper/voice/bloopers/kazooie/hoot.ogg
new file mode 100644
index 00000000000..316949652ce
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/kazooie/hoot.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/kazooie/ribbit.ogg b/tff_modular/modules/blooper/voice/bloopers/kazooie/ribbit.ogg
new file mode 100644
index 00000000000..a4299d2a744
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/kazooie/ribbit.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/kazooie/tweet.ogg b/tff_modular/modules/blooper/voice/bloopers/kazooie/tweet.ogg
new file mode 100644
index 00000000000..b784636e251
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/kazooie/tweet.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/kazooie/uhm.ogg b/tff_modular/modules/blooper/voice/bloopers/kazooie/uhm.ogg
new file mode 100644
index 00000000000..857e99c7c5a
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/kazooie/uhm.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/kazooie/wurble1.ogg b/tff_modular/modules/blooper/voice/bloopers/kazooie/wurble1.ogg
new file mode 100644
index 00000000000..047eca3510a
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/kazooie/wurble1.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/meow1.ogg b/tff_modular/modules/blooper/voice/bloopers/meow1.ogg
new file mode 100644
index 00000000000..be9393d7d6e
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/meow1.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/moth/mothchitter2.ogg b/tff_modular/modules/blooper/voice/bloopers/moth/mothchitter2.ogg
new file mode 100644
index 00000000000..07619ba1437
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/moth/mothchitter2.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/mothsqueak.ogg b/tff_modular/modules/blooper/voice/bloopers/mothsqueak.ogg
new file mode 100644
index 00000000000..5a345df09d2
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/mothsqueak.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/undertale/voice_alphys.ogg b/tff_modular/modules/blooper/voice/bloopers/undertale/voice_alphys.ogg
new file mode 100644
index 00000000000..5b136e8f90b
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/undertale/voice_alphys.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/undertale/voice_asgore.ogg b/tff_modular/modules/blooper/voice/bloopers/undertale/voice_asgore.ogg
new file mode 100644
index 00000000000..e823a486cc9
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/undertale/voice_asgore.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/undertale/voice_flowey_1.ogg b/tff_modular/modules/blooper/voice/bloopers/undertale/voice_flowey_1.ogg
new file mode 100644
index 00000000000..86d00963a3b
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/undertale/voice_flowey_1.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/undertale/voice_flowey_2.ogg b/tff_modular/modules/blooper/voice/bloopers/undertale/voice_flowey_2.ogg
new file mode 100644
index 00000000000..8c06e29d21c
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/undertale/voice_flowey_2.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/undertale/voice_gaster_1.ogg b/tff_modular/modules/blooper/voice/bloopers/undertale/voice_gaster_1.ogg
new file mode 100644
index 00000000000..1301f1fabd8
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/undertale/voice_gaster_1.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/undertale/voice_gaster_2.ogg b/tff_modular/modules/blooper/voice/bloopers/undertale/voice_gaster_2.ogg
new file mode 100644
index 00000000000..e6fa2fd4d51
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/undertale/voice_gaster_2.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/undertale/voice_gaster_3.ogg b/tff_modular/modules/blooper/voice/bloopers/undertale/voice_gaster_3.ogg
new file mode 100644
index 00000000000..1d6bc2cfc65
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/undertale/voice_gaster_3.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/undertale/voice_gaster_4.ogg b/tff_modular/modules/blooper/voice/bloopers/undertale/voice_gaster_4.ogg
new file mode 100644
index 00000000000..047d33aa37d
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/undertale/voice_gaster_4.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/undertale/voice_gaster_5.ogg b/tff_modular/modules/blooper/voice/bloopers/undertale/voice_gaster_5.ogg
new file mode 100644
index 00000000000..e5d2e73970a
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/undertale/voice_gaster_5.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/undertale/voice_gaster_6.ogg b/tff_modular/modules/blooper/voice/bloopers/undertale/voice_gaster_6.ogg
new file mode 100644
index 00000000000..85211ad1353
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/undertale/voice_gaster_6.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/undertale/voice_gaster_7.ogg b/tff_modular/modules/blooper/voice/bloopers/undertale/voice_gaster_7.ogg
new file mode 100644
index 00000000000..ad584a52e6c
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/undertale/voice_gaster_7.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/undertale/voice_metta_1.ogg b/tff_modular/modules/blooper/voice/bloopers/undertale/voice_metta_1.ogg
new file mode 100644
index 00000000000..0d4acf2b637
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/undertale/voice_metta_1.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/undertale/voice_monster1.ogg b/tff_modular/modules/blooper/voice/bloopers/undertale/voice_monster1.ogg
new file mode 100644
index 00000000000..94f109c3050
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/undertale/voice_monster1.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/undertale/voice_monster2.ogg b/tff_modular/modules/blooper/voice/bloopers/undertale/voice_monster2.ogg
new file mode 100644
index 00000000000..baec7392ec3
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/undertale/voice_monster2.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/undertale/voice_papyrus.ogg b/tff_modular/modules/blooper/voice/bloopers/undertale/voice_papyrus.ogg
new file mode 100644
index 00000000000..3a69144f389
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/undertale/voice_papyrus.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/undertale/voice_ralsei.ogg b/tff_modular/modules/blooper/voice/bloopers/undertale/voice_ralsei.ogg
new file mode 100644
index 00000000000..ee7dbb25135
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/undertale/voice_ralsei.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/undertale/voice_sans.ogg b/tff_modular/modules/blooper/voice/bloopers/undertale/voice_sans.ogg
new file mode 100644
index 00000000000..7ccfe7b9786
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/undertale/voice_sans.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/undertale/voice_susie.ogg b/tff_modular/modules/blooper/voice/bloopers/undertale/voice_susie.ogg
new file mode 100644
index 00000000000..bfe3552bb33
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/undertale/voice_susie.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/undertale/voice_temmie.ogg b/tff_modular/modules/blooper/voice/bloopers/undertale/voice_temmie.ogg
new file mode 100644
index 00000000000..6e1b72dee2a
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/undertale/voice_temmie.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/undertale/voice_toriel.ogg b/tff_modular/modules/blooper/voice/bloopers/undertale/voice_toriel.ogg
new file mode 100644
index 00000000000..326d1c2f9c6
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/undertale/voice_toriel.ogg differ
diff --git a/tff_modular/modules/blooper/voice/bloopers/undertale/voice_undyne.ogg b/tff_modular/modules/blooper/voice/bloopers/undertale/voice_undyne.ogg
new file mode 100644
index 00000000000..eebf78fb2f9
Binary files /dev/null and b/tff_modular/modules/blooper/voice/bloopers/undertale/voice_undyne.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index 46cecd17d0a..56ac7fcc85f 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -369,9 +369,11 @@
#include "code\__DEFINES\research\slimes.dm"
#include "code\__DEFINES\~ff_defines\DNA.dm"
#include "code\__DEFINES\~ff_defines\nabber_clothes_pathes.dm"
+#include "code\__DEFINES\~ff_defines\say.dm"
#include "code\__DEFINES\~ff_defines\signals.dm"
#include "code\__DEFINES\~ff_defines\text.dm"
#include "code\__DEFINES\~ff_defines\traits.dm"
+#include "code\__DEFINES\~ff_defines\__HELPERS\global_lists.dm"
#include "code\__DEFINES\~ff_defines\__HELPERS\ishelpers.dm"
#include "code\__DEFINES\~ff_defines\__HELPERS\names.dm"
#include "code\__DEFINES\~skyrat_defines\_organ_defines.dm"
@@ -7799,6 +7801,9 @@
#include "tff_modular\master_files\code\modules\mod\mod_clothes.dm"
#include "tff_modular\master_files\code\modules\reagents\recipe\coagulant_recipe.dm"
#include "tff_modular\modules\autoaccent\code\autoaccent.dm"
+#include "tff_modular\modules\blooper\atoms_movable.dm"
+#include "tff_modular\modules\blooper\bark.dm"
+#include "tff_modular\modules\blooper\bark_list.dm"
#include "tff_modular\modules\blueshield-mod\code.dm"
#include "tff_modular\modules\blueshield-rearm\code\holster.dm"
#include "tff_modular\modules\blueshield-rearm\code\projectiles.dm"
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/tff/character_voice.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/tff/character_voice.tsx
new file mode 100644
index 00000000000..23cf24448c8
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/tff/character_voice.tsx
@@ -0,0 +1,56 @@
+import { Button, Stack } from '../../../../../../components';
+import { CheckboxInput, FeatureChoiced, FeatureChoicedServerData, FeatureDropdownInput, FeatureNumberInput, FeatureNumeric, FeatureToggle, FeatureValueProps } from '../../base';
+
+const FeatureBlooperDropdownInput = (
+ props: FeatureValueProps
+) => {
+ return (
+
+
+
+
+
+
+
+ );
+};
+
+export const blooper_speech: FeatureChoiced = {
+ name: 'Character Voice',
+ component: FeatureBlooperDropdownInput,
+};
+
+export const blooper_speech_speed: FeatureNumeric = {
+ name: 'Character Voice Speed',
+ component: FeatureNumberInput,
+};
+
+export const blooper_speech_pitch: FeatureNumeric = {
+ name: 'Character Voice Pitch',
+ component: FeatureNumberInput,
+};
+
+export const blooper_pitch_range: FeatureNumeric = {
+ name: 'Character Voice Range',
+ component: FeatureNumberInput,
+};
+
+export const hear_sound_blooper: FeatureToggle = {
+ name: 'Enable blooper hearing',
+ category: 'SOUND',
+ component: CheckboxInput,
+};
+
+export const send_sound_blooper: FeatureToggle = {
+ name: 'Enable blooper sending',
+ category: 'SOUND',
+ component: CheckboxInput,
+};
diff --git a/tools/ci/annotate_dm.sh b/tools/ci/annotate_dm.sh
old mode 100755
new mode 100644