diff --git a/code/datums/brain_damage/imaginary_friend.dm b/code/datums/brain_damage/imaginary_friend.dm
index 435a7a4dd82..1bc7d8e3be8 100644
--- a/code/datums/brain_damage/imaginary_friend.dm
+++ b/code/datums/brain_damage/imaginary_friend.dm
@@ -124,7 +124,7 @@
client.images.Remove(human_image)
return ..()
-/mob/camera/imaginary_friend/say(message)
+/mob/camera/imaginary_friend/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null)
if (!message)
return
diff --git a/code/datums/brain_damage/mild.dm b/code/datums/brain_damage/mild.dm
index 1ca07589e58..afd53726dbc 100644
--- a/code/datums/brain_damage/mild.dm
+++ b/code/datums/brain_damage/mild.dm
@@ -51,7 +51,7 @@
if(prob(3))
owner.emote("drool")
else if(owner.stat == CONSCIOUS && prob(3))
- owner.say(pick_list_replacements(BRAIN_DAMAGE_FILE, "brain_damage"))
+ owner.say(pick_list_replacements(BRAIN_DAMAGE_FILE, "brain_damage"), forced = "brain damage")
..()
/datum/brain_trauma/mild/dumbness/on_lose()
diff --git a/code/datums/brain_damage/phobia.dm b/code/datums/brain_damage/phobia.dm
index 76f759294bf..c6ccbee38c3 100644
--- a/code/datums/brain_damage/phobia.dm
+++ b/code/datums/brain_damage/phobia.dm
@@ -107,7 +107,7 @@
if(2)
owner.emote("scream")
owner.Jitter(5)
- owner.say("AAAAH!!")
+ owner.say("AAAAH!!", forced = "phobia")
if(reason)
owner.pointed(reason)
if(3)
diff --git a/code/datums/brain_damage/split_personality.dm b/code/datums/brain_damage/split_personality.dm
index ba39845d61a..9ce65717f11 100644
--- a/code/datums/brain_damage/split_personality.dm
+++ b/code/datums/brain_damage/split_personality.dm
@@ -138,7 +138,7 @@
to_chat(src, "As a split personality, you cannot do anything but observe. However, you will eventually gain control of your body, switching places with the current personality.")
to_chat(src, "Do not commit suicide or put the body in a deadly position. Behave like you care about it as much as the owner.")
-/mob/living/split_personality/say(message)
+/mob/living/split_personality/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null)
to_chat(src, "You cannot speak, your other self is controlling your body!")
return FALSE
diff --git a/code/datums/diseases/parrotpossession.dm b/code/datums/diseases/parrotpossession.dm
index ee58c287610..d9c4b324f63 100644
--- a/code/datums/diseases/parrotpossession.dm
+++ b/code/datums/diseases/parrotpossession.dm
@@ -21,7 +21,7 @@
cure()
else if(prob(parrot.speak_chance))
if(parrot.speech_buffer.len)
- affected_mob.say(pick(parrot.speech_buffer))
+ affected_mob.say(pick(parrot.speech_buffer), forced = "parrot possession")
/datum/disease/parrot_possession/cure()
if(parrot && parrot.loc == affected_mob)
diff --git a/code/datums/diseases/pierrot_throat.dm b/code/datums/diseases/pierrot_throat.dm
index 8f13d2e2fa4..64f453cd48a 100644
--- a/code/datums/diseases/pierrot_throat.dm
+++ b/code/datums/diseases/pierrot_throat.dm
@@ -25,4 +25,4 @@
to_chat(affected_mob, "Your thoughts are interrupted by a loud HONK!")
if(4)
if(prob(5))
- affected_mob.say( pick( list("HONK!", "Honk!", "Honk.", "Honk?", "Honk!!", "Honk?!", "Honk...") ) )
+ affected_mob.say( pick( list("HONK!", "Honk!", "Honk.", "Honk?", "Honk!!", "Honk?!", "Honk...") ) , forced = "pierrot's throat")
diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm
index 5f51c021cbf..b295f5f10b4 100644
--- a/code/datums/diseases/transformation.dm
+++ b/code/datums/diseases/transformation.dm
@@ -136,7 +136,7 @@
affected_mob.confused += 10
if(4)
if(prob(3))
- affected_mob.say(pick("Eeek, ook ook!", "Eee-eeek!", "Eeee!", "Ungh, ungh."))
+ affected_mob.say(pick("Eeek, ook ook!", "Eee-eeek!", "Eeee!", "Ungh, ungh."), forced = "jungle fever")
/datum/disease/transformation/jungle_fever/cure()
remove_monkey(affected_mob.mind)
@@ -176,13 +176,13 @@
switch(stage)
if(3)
if (prob(8))
- affected_mob.say(pick("Beep, boop", "beep, beep!", "Boop...bop"))
+ affected_mob.say(pick("Beep, boop", "beep, beep!", "Boop...bop"), forced = "robotic transformation")
if (prob(4))
to_chat(affected_mob, "You feel a stabbing pain in your head.")
affected_mob.Unconscious(40)
if(4)
if (prob(20))
- affected_mob.say(pick("beep, beep!", "Boop bop boop beep.", "kkkiiiill mmme", "I wwwaaannntt tttoo dddiiieeee..."))
+ affected_mob.say(pick("beep, beep!", "Boop bop boop beep.", "kkkiiiill mmme", "I wwwaaannntt tttoo dddiiieeee..."), forced = "robotic transformation")
/datum/disease/transformation/xeno
@@ -212,7 +212,7 @@
affected_mob.Unconscious(40)
if(4)
if (prob(20))
- affected_mob.say(pick("You look delicious.", "Going to... devour you...", "Hsssshhhhh!"))
+ affected_mob.say(pick("You look delicious.", "Going to... devour you...", "Hsssshhhhh!"), forced = "xenomorph transformation")
/datum/disease/transformation/slime
@@ -264,10 +264,10 @@
switch(stage)
if(3)
if (prob(8))
- affected_mob.say(pick("YAP", "Woof!"))
+ affected_mob.say(pick("YAP", "Woof!"), forced = "corgi transformation")
if(4)
if (prob(20))
- affected_mob.say(pick("Bark!", "AUUUUUU"))
+ affected_mob.say(pick("Bark!", "AUUUUUU"), forced = "corgi transformation")
/datum/disease/transformation/morph
name = "Gluttony's Blessing"
diff --git a/code/datums/diseases/wizarditis.dm b/code/datums/diseases/wizarditis.dm
index 919eaa6e124..b2880463800 100644
--- a/code/datums/diseases/wizarditis.dm
+++ b/code/datums/diseases/wizarditis.dm
@@ -29,21 +29,21 @@ STI KALY - blind
switch(stage)
if(2)
if(prob(1)&&prob(50))
- affected_mob.say(pick("You shall not pass!", "Expeliarmus!", "By Merlins beard!", "Feel the power of the Dark Side!"))
+ affected_mob.say(pick("You shall not pass!", "Expeliarmus!", "By Merlins beard!", "Feel the power of the Dark Side!"), forced = "wizarditis")
if(prob(1)&&prob(50))
to_chat(affected_mob, "You feel [pick("that you don't have enough mana", "that the winds of magic are gone", "an urge to summon familiar")].")
if(3)
if(prob(1)&&prob(50))
- affected_mob.say(pick("NEC CANTIO!","AULIE OXIN FIERA!", "STI KALY!", "TARCOL MINTI ZHERI!"))
+ affected_mob.say(pick("NEC CANTIO!","AULIE OXIN FIERA!", "STI KALY!", "TARCOL MINTI ZHERI!"), forced = "wizarditis")
if(prob(1)&&prob(50))
to_chat(affected_mob, "You feel [pick("the magic bubbling in your veins","that this location gives you a +1 to INT","an urge to summon familiar")].")
if(4)
if(prob(1))
- affected_mob.say(pick("NEC CANTIO!","AULIE OXIN FIERA!","STI KALY!","EI NATH!"))
+ affected_mob.say(pick("NEC CANTIO!","AULIE OXIN FIERA!","STI KALY!","EI NATH!"), forced = "wizarditis")
return
if(prob(1)&&prob(50))
to_chat(affected_mob, "You feel [pick("the tidal wave of raw power building inside","that this location gives you a +2 to INT and +1 to WIS","an urge to teleport")].")
@@ -111,7 +111,7 @@ STI KALY - blind
if(!L)
return
- affected_mob.say("SCYAR NILA [uppertext(thearea.name)]!")
+ affected_mob.say("SCYAR NILA [uppertext(thearea.name)]!", forced = "wizarditis teleport")
affected_mob.forceMove(pick(L))
return
diff --git a/code/datums/martial/plasma_fist.dm b/code/datums/martial/plasma_fist.dm
index 1b1c92413b9..f540dc07835 100644
--- a/code/datums/martial/plasma_fist.dm
+++ b/code/datums/martial/plasma_fist.dm
@@ -32,7 +32,7 @@
sleep(1)
/datum/martial_art/plasma_fist/proc/Tornado(mob/living/carbon/human/A, mob/living/carbon/human/D)
- A.say("TORNADO SWEEP!")
+ A.say("TORNADO SWEEP!", forced="plasma fist")
TornadoAnimate(A)
var/obj/effect/proc_holder/spell/aoe_turf/repulse/R = new(null)
var/list/turfs = list()
@@ -48,14 +48,14 @@
playsound(D.loc, 'sound/weapons/punch1.ogg', 50, 1, -1)
var/atom/throw_target = get_edge_target_turf(D, get_dir(D, get_step_away(D, A)))
D.throw_at(throw_target, 200, 4,A)
- A.say("HYAH!")
+ A.say("HYAH!", forced="plasma fist")
log_combat(A, D, "threw back (Plasma Fist)")
return
/datum/martial_art/plasma_fist/proc/Plasma(mob/living/carbon/human/A, mob/living/carbon/human/D)
A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
playsound(D.loc, 'sound/weapons/punch1.ogg', 50, 1, -1)
- A.say("PLASMA FIST!")
+ A.say("PLASMA FIST!", forced="plasma fist")
D.visible_message("[A] has hit [D] with THE PLASMA FIST TECHNIQUE!", \
"[A] has hit [D] with THE PLASMA FIST TECHNIQUE!")
D.gib()
diff --git a/code/datums/mutations/body.dm b/code/datums/mutations/body.dm
index dbe150b0fab..e114a437360 100644
--- a/code/datums/mutations/body.dm
+++ b/code/datums/mutations/body.dm
@@ -107,7 +107,7 @@
if(1)
owner.emote("twitch")
if(2 to 3)
- owner.say("[prob(50) ? ";" : ""][pick("SHIT", "PISS", "FUCK", "CUNT", "COCKSUCKER", "MOTHERFUCKER", "TITS")]")
+ owner.say("[prob(50) ? ";" : ""][pick("SHIT", "PISS", "FUCK", "CUNT", "COCKSUCKER", "MOTHERFUCKER", "TITS")]", forced="tourette's syndrome")
var/x_offset_old = owner.pixel_x
var/y_offset_old = owner.pixel_y
var/x_offset = owner.pixel_x + rand(-2,2)
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 7f9f8e7f370..69332489f90 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -625,10 +625,11 @@
stack_trace("Invalid individual logging type: [message_type]. Defaulting to [LOG_GAME] (LOG_GAME).")
log_game(log_text)
-// Helper for logging chat messages or other logs wiht arbitrary inputs (e.g. announcements)
-/atom/proc/log_talk(message, message_type, tag=null, log_globally=TRUE)
+// Helper for logging chat messages or other logs with arbitrary inputs (e.g. announcements)
+/atom/proc/log_talk(message, message_type, tag=null, log_globally=TRUE, forced_by=null)
var/prefix = tag ? "([tag]) " : ""
- log_message("[prefix]\"[message]\"", message_type, log_globally=log_globally)
+ var/suffix = forced_by ? " FORCED by [forced_by]" : ""
+ log_message("[prefix]\"[message]\"[suffix]", message_type, log_globally=log_globally)
// Helper for logging of messages with only one sender and receiver
/proc/log_directed_talk(atom/source, atom/target, message, message_type, tag)
diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm
index 07f8448ef23..86e8fc8af5c 100644
--- a/code/game/machinery/newscaster.dm
+++ b/code/game/machinery/newscaster.dm
@@ -885,7 +885,7 @@ GLOBAL_LIST_EMPTY(allCasters)
/obj/item/newspaper/suicide_act(mob/user)
user.visible_message("[user] is focusing intently on [src]! It looks like [user.p_theyre()] trying to commit sudoku... until [user.p_their()] eyes light up with realization!")
- user.say(";JOURNALISM IS MY CALLING! EVERYBODY APPRECIATES UNBIASED REPORTI-GLORF")
+ user.say(";JOURNALISM IS MY CALLING! EVERYBODY APPRECIATES UNBIASED REPORTI-GLORF", forced="newspaper suicide")
var/mob/living/carbon/human/H = user
var/obj/W = new /obj/item/reagent_containers/food/drinks/bottle/whiskey(H.loc)
playsound(H.loc, 'sound/items/drink.ogg', rand(10,50), 1)
diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm
index 59cd1643d0e..f3d5a664e8e 100644
--- a/code/game/machinery/recycler.dm
+++ b/code/game/machinery/recycler.dm
@@ -171,7 +171,7 @@
// By default, the emagged recycler will gib all non-carbons. (human simple animal mobs don't count)
if(iscarbon(L))
if(L.stat == CONSCIOUS)
- L.say("ARRRRRRRRRRRGH!!!")
+ L.say("ARRRRRRRRRRRGH!!!", forced="recycler grinding")
add_mob_blood(L)
if(!blood && !issilicon(L))
diff --git a/code/game/objects/items/clown_items.dm b/code/game/objects/items/clown_items.dm
index 6ed265c403b..0d255a7d7f1 100644
--- a/code/game/objects/items/clown_items.dm
+++ b/code/game/objects/items/clown_items.dm
@@ -51,7 +51,7 @@
cleanspeed = 10 //much faster than mop so it is useful for traitors who want to clean crime scenes
/obj/item/soap/suicide_act(mob/user)
- user.say(";FFFFFFFFFFFFFFFFUUUUUUUDGE!!")
+ user.say(";FFFFFFFFFFFFFFFFUUUUUUUDGE!!", forced="soap suicide")
user.visible_message("[user] lifts [src] to [user.p_their()] mouth and gnaws on it furiously, producing a thick froth! [user.p_they(TRUE)]'ll never get that BB gun now!")
new /obj/effect/particle_effect/foam(loc)
return (TOXLOSS)
diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm
index b1a58f2b960..5442277f1ee 100644
--- a/code/game/objects/items/crayons.dm
+++ b/code/game/objects/items/crayons.dm
@@ -535,11 +535,11 @@
var/mob/living/carbon/human/H = user
if(is_capped || !actually_paints)
user.visible_message("[user] shakes up [src] with a rattle and lifts it to [user.p_their()] mouth, but nothing happens!")
- user.say("MEDIOCRE!!")
+ user.say("MEDIOCRE!!", forced="spraycan suicide")
return SHAME
else
user.visible_message("[user] shakes up [src] with a rattle and lifts it to [user.p_their()] mouth, spraying paint across [user.p_their()] teeth!")
- user.say("WITNESS ME!!")
+ user.say("WITNESS ME!!", forced="spraycan suicide")
if(pre_noise || post_noise)
playsound(loc, 'sound/effects/spray.ogg', 5, 1, 5)
if(can_change_colour)
diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm
index 5fa089a0122..4b244e3002d 100644
--- a/code/game/objects/items/devices/megaphone.dm
+++ b/code/game/objects/items/devices/megaphone.dm
@@ -14,7 +14,7 @@
/obj/item/megaphone/suicide_act(mob/living/carbon/user)
user.visible_message("[user] is uttering [user.p_their()] last words into \the [src]! It looks like [user.p_theyre()] trying to commit suicide!")
spamcheck = 0//so they dont have to worry about recharging
- user.say("AAAAAAAAAAAARGHHHHH")//he must have died while coding this
+ user.say("AAAAAAAAAAAARGHHHHH", forced="megaphone suicide")//he must have died while coding this
return OXYLOSS
/obj/item/megaphone/get_held_item_speechspans(mob/living/carbon/user)
diff --git a/code/game/objects/items/grenades/plastic.dm b/code/game/objects/items/grenades/plastic.dm
index ffe61ee5fa0..cfcd73b5eb4 100644
--- a/code/game/objects/items/grenades/plastic.dm
+++ b/code/game/objects/items/grenades/plastic.dm
@@ -147,7 +147,7 @@
message_say = "FOR RATVAR!"
else if(UM.has_antag_datum(/datum/antagonist/rev))
message_say = "VIVA LA REVOLUTION!"
- M.say(message_say)
+ M.say(message_say, forced="C4 suicide")
/obj/item/grenade/plastic/suicide_act(mob/user)
message_admins("[ADMIN_LOOKUPFLW(user)] suicided with [src] at [ADMIN_VERBOSEJMP(user)]")
diff --git a/code/game/objects/items/religion.dm b/code/game/objects/items/religion.dm
index 36eb3173dae..a80aa1be602 100644
--- a/code/game/objects/items/religion.dm
+++ b/code/game/objects/items/religion.dm
@@ -30,7 +30,7 @@
"You raise [src] skywards, inspiring your allies!")
playsound(src, "rustle", 100, FALSE)
if(warcry)
- user.say("[warcry]")
+ user.say("[warcry]", forced="banner")
var/old_transform = user.transform
user.transform *= 1.2
animate(user, transform = old_transform, time = 10)
diff --git a/code/game/objects/items/twohanded.dm b/code/game/objects/items/twohanded.dm
index 2d47e23ad34..63876b5f7c9 100644
--- a/code/game/objects/items/twohanded.dm
+++ b/code/game/objects/items/twohanded.dm
@@ -482,7 +482,7 @@
/obj/item/twohanded/spear/suicide_act(mob/living/carbon/user)
user.visible_message("[user] begins to sword-swallow \the [src]! It looks like [user.p_theyre()] trying to commit suicide!")
if(explosive)
- user.say("[war_cry]")
+ user.say("[war_cry]", forced="spear warcry")
explosive.forceMove(user)
explosive.prime()
user.gib()
@@ -512,7 +512,7 @@
if(isopenturf(AM)) //So you can actually melee with it
return
if(explosive && wielded)
- user.say("[war_cry]")
+ user.say("[war_cry]", forced="spear warcry")
explosive.forceMove(AM)
explosive.prime()
qdel(src)
diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm
index 749c8f66720..6221416db8c 100644
--- a/code/game/objects/obj_defense.dm
+++ b/code/game/objects/obj_defense.dm
@@ -83,7 +83,7 @@
visible_message("[user] smashes [src]!", null, null, COMBAT_MESSAGE_RANGE)
if(density)
playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1)
- user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
+ user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced="hulk")
else
playsound(src, 'sound/effects/bang.ogg', 50, 1)
take_damage(hulk_damage(), BRUTE, "melee", 0, get_dir(src, user))
diff --git a/code/game/say.dm b/code/game/say.dm
index 2b5791bc57d..9553b4eb4c1 100644
--- a/code/game/say.dm
+++ b/code/game/say.dm
@@ -18,12 +18,12 @@ GLOBAL_LIST_INIT(freqtospan, list(
"[FREQ_CTF_BLUE]" = "blueteamradio"
))
-/atom/movable/proc/say(message, datum/language/language = null)
+/atom/movable/proc/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null)
if(!can_speak())
return
if(message == "" || !message)
return
- var/list/spans = get_spans()
+ spans |= get_spans()
if(!language)
language = get_default_language()
send_speech(message, 7, src, , spans, message_language=language)
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index b153243f5d4..b18fbb50f69 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -139,7 +139,7 @@
..(user, 1)
if(prob(hardness))
playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1)
- user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
+ user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk")
dismantle_wall(1)
else
playsound(src, 'sound/effects/bang.ogg', 50, 1)
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 4ae4a809106..8b379a4e35f 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1413,7 +1413,7 @@
var/speech = input("What will [key_name(M)] say?.", "Force speech", "")// Don't need to sanitize, since it does that in say(), we also trust our admins.
if(!speech)
return
- M.say(speech)
+ M.say(speech, forced = "admin speech")
speech = sanitize(speech) // Nah, we don't trust them
log_admin("[key_name(usr)] forced [key_name(M)] to say: [speech]")
message_admins("[key_name_admin(usr)] forced [key_name_admin(M)] to say: [speech]")
diff --git a/code/modules/antagonists/blob/blob/overmind.dm b/code/modules/antagonists/blob/blob/overmind.dm
index 58268d92074..ddf745c0f9c 100644
--- a/code/modules/antagonists/blob/blob/overmind.dm
+++ b/code/modules/antagonists/blob/blob/overmind.dm
@@ -185,7 +185,7 @@ GLOBAL_LIST_EMPTY(blob_nodes)
blob_points = CLAMP(blob_points + points, 0, max_blob_points)
hud_used.blobpwrdisplay.maptext = "
[round(blob_points)]
"
-/mob/camera/blob/say(message)
+/mob/camera/blob/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null)
if (!message)
return
diff --git a/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm b/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm
index e07bdbc11e6..47faea6dc81 100644
--- a/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm
+++ b/code/modules/antagonists/clockcult/clock_mobs/_eminence.dm
@@ -76,7 +76,7 @@
E = new V
E.Grant(src)
-/mob/camera/eminence/say(message)
+/mob/camera/eminence/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null)
if(client)
if(client.prefs.muted & MUTE_IC)
to_chat(src, "You cannot send IC messages (muted).")
diff --git a/code/modules/antagonists/cult/cult_comms.dm b/code/modules/antagonists/cult/cult_comms.dm
index fd6e40639a0..375d250f59c 100644
--- a/code/modules/antagonists/cult/cult_comms.dm
+++ b/code/modules/antagonists/cult/cult_comms.dm
@@ -196,15 +196,15 @@
/datum/action/innate/cult/master/finalreck/proc/chant(chant_number)
switch(chant_number)
if(1)
- owner.say("C'arta forbici!", language = /datum/language/common)
+ owner.say("C'arta forbici!", language = /datum/language/common, forced = "cult invocation")
if(2)
- owner.say("Pleggh e'ntrath!", language = /datum/language/common)
+ owner.say("Pleggh e'ntrath!", language = /datum/language/common, forced = "cult invocation")
playsound(get_turf(owner),'sound/magic/clockwork/narsie_attack.ogg', 50, 1)
if(3)
- owner.say("Barhah hra zar'garis!", language = /datum/language/common)
+ owner.say("Barhah hra zar'garis!", language = /datum/language/common, forced = "cult invocation")
playsound(get_turf(owner),'sound/magic/clockwork/narsie_attack.ogg', 75, 1)
if(4)
- owner.say("N'ath reth sh'yro eth d'rekkathnor!!!", language = /datum/language/common)
+ owner.say("N'ath reth sh'yro eth d'rekkathnor!!!", language = /datum/language/common, forced = "cult invocation")
playsound(get_turf(owner),'sound/magic/clockwork/narsie_attack.ogg', 100, 1)
/datum/action/innate/cult/master/cultmark
diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm
index 4513195804b..7eb203c63f6 100644
--- a/code/modules/antagonists/cult/runes.dm
+++ b/code/modules/antagonists/cult/runes.dm
@@ -62,7 +62,7 @@ Runes can either be invoked by one's self or with many different cultists. Each
to_chat(user, "You carefully erase the [lowertext(cultist_name)] rune.")
qdel(src)
else if(istype(I, /obj/item/nullrod))
- user.say("BEGONE FOUL MAGIKS!!")
+ user.say("BEGONE FOUL MAGIKS!!", forced = "nullrod")
to_chat(user, "You disrupt the magic of [src] with [I].")
qdel(src)
@@ -136,7 +136,7 @@ structure_check() searches for nearby cultist structures required for the invoca
if(isliving(M))
var/mob/living/L = M
if(invocation)
- L.say(invocation, language = /datum/language/common, ignore_spam = TRUE)
+ L.say(invocation, language = /datum/language/common, ignore_spam = TRUE, forced = "cult invocation")
if(invoke_damage)
L.apply_damage(invoke_damage, BRUTE)
to_chat(L, "[src] saps your strength!")
diff --git a/code/modules/antagonists/disease/disease_mob.dm b/code/modules/antagonists/disease/disease_mob.dm
index 903c08b5eb8..4d378af7248 100644
--- a/code/modules/antagonists/disease/disease_mob.dm
+++ b/code/modules/antagonists/disease/disease_mob.dm
@@ -107,7 +107,7 @@ the new instance inside the host to be updated to the template's stats.
if(istype(B))
to_chat(user, "[B.name]")
-/mob/camera/disease/say(message)
+/mob/camera/disease/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null)
return
/mob/camera/disease/Move(NewLoc, Dir = 0)
diff --git a/code/modules/antagonists/revenant/revenant.dm b/code/modules/antagonists/revenant/revenant.dm
index c88f6f0828e..e421e7fad8d 100644
--- a/code/modules/antagonists/revenant/revenant.dm
+++ b/code/modules/antagonists/revenant/revenant.dm
@@ -144,7 +144,7 @@
/mob/living/simple_animal/revenant/med_hud_set_status()
return //we use no hud
-/mob/living/simple_animal/revenant/say(message)
+/mob/living/simple_animal/revenant/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null)
if(!message)
return
src.log_talk(message, LOG_SAY)
diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm
index ba594cfc5b8..7cfefd5413c 100644
--- a/code/modules/antagonists/wizard/equipment/artefact.dm
+++ b/code/modules/antagonists/wizard/equipment/artefact.dm
@@ -301,7 +301,7 @@
switch(user.zone_selected)
if(BODY_ZONE_PRECISE_MOUTH)
var/wgw = sanitize(input(user, "What would you like the victim to say", "Voodoo", null) as text)
- target.say(wgw)
+ target.say(wgw, forced = "voodoo doll")
log_game("[key_name(user)] made [key_name(target)] say [wgw] with a voodoo doll.")
if(BODY_ZONE_PRECISE_EYES)
user.set_machine(src)
diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm
index e27b1e9e136..6c22334f782 100644
--- a/code/modules/clothing/gloves/miscellaneous.dm
+++ b/code/modules/clothing/gloves/miscellaneous.dm
@@ -70,7 +70,7 @@
if(M.a_intent == INTENT_HARM)
M.changeNext_move(CLICK_CD_RAPID)
if(warcry)
- M.say("[warcry]", ignore_spam = TRUE)
+ M.say("[warcry]", ignore_spam = TRUE, forced = "north star warcry")
.= FALSE
/obj/item/clothing/gloves/rapid/attack_self(mob/user)
diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm
index 2710949c8ca..ad8fafb8720 100644
--- a/code/modules/clothing/head/jobs.dm
+++ b/code/modules/clothing/head/jobs.dm
@@ -12,10 +12,10 @@
/obj/item/clothing/head/chefhat/suicide_act(mob/user)
user.visible_message("[user] is donning [src]! It looks like [user.p_theyre()] trying to become a chef.")
- user.say("Bork Bork Bork!")
+ user.say("Bork Bork Bork!", forced = "chef hat suicide")
sleep(20)
user.visible_message("[user] climbs into an imaginary oven!")
- user.say("BOOORK!")
+ user.say("BOOORK!", forced = "chef hat suicide")
playsound(user, 'sound/machines/ding.ogg', 50, 1)
return(FIRELOSS)
diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm
index fbdd0890d66..281a48bfdae 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -193,7 +193,7 @@
return 0
var/mob/living/carbon/human/H = user
user.visible_message("[user] is donning [src]! It looks like [user.p_theyre()] trying to be nice to girls.")
- user.say("M'lady.")
+ user.say("M'lady.", forced = "fedora suicide")
sleep(10)
H.facial_hair_style = "Neckbeard"
return(BRUTELOSS)
diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm
index dc866977777..9d1a47f2311 100644
--- a/code/modules/clothing/suits/wiz_robe.dm
+++ b/code/modules/clothing/suits/wiz_robe.dm
@@ -168,7 +168,7 @@
to_chat(usr, "\The robe's internal magic supply is still recharging!")
return
- usr.say("Rise, my creation! Off your page into this realm!")
+ usr.say("Rise, my creation! Off your page into this realm!", forced = "stickman summoning")
playsound(src.loc, 'sound/magic/summon_magic.ogg', 50, 1, 1)
var/mob/living/M = new /mob/living/simple_animal/hostile/stickman(get_turf(usr))
var/list/factions = usr.faction
diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm
index 93058e1bc24..dd0083a1b72 100755
--- a/code/modules/clothing/under/accessories.dm
+++ b/code/modules/clothing/under/accessories.dm
@@ -283,7 +283,7 @@
/obj/item/clothing/accessory/lawyers_badge/attack_self(mob/user)
if(prob(1))
- user.say("The testimony contradicts the evidence!")
+ user.say("The testimony contradicts the evidence!", forced = "attorney's badge")
user.visible_message("[user] shows [user.p_their()] attorney's badge.", "You show your attorney's badge.")
/obj/item/clothing/accessory/lawyers_badge/on_uniform_equip(obj/item/clothing/under/U, user)
diff --git a/code/modules/hydroponics/grown/banana.dm b/code/modules/hydroponics/grown/banana.dm
index 166731accf9..251d9de5c0e 100644
--- a/code/modules/hydroponics/grown/banana.dm
+++ b/code/modules/hydroponics/grown/banana.dm
@@ -33,7 +33,7 @@
sleep(25)
if(!user)
return (OXYLOSS)
- user.say("BANG!")
+ user.say("BANG!", forced = "banana")
sleep(25)
if(!user)
return (OXYLOSS)
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index d41ce7fd2ec..99f8cc4e039 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -164,22 +164,22 @@
var/failText = "The snake seems unsatisfied with your incomplete oath and returns to it's previous place on the rod, returning to its dormant, wooden state. You must stand still while completing your oath!"
to_chat(itemUser, "The wooden snake that was carved into the rod seems to suddenly come alive and begins to slither down your arm! The compulsion to help others grows abnormally strong...")
if(do_after(itemUser, 40, target = itemUser))
- itemUser.say("I swear to fulfill, to the best of my ability and judgment, this covenant:")
+ itemUser.say("I swear to fulfill, to the best of my ability and judgment, this covenant:", forced = "hippocratic oath")
else
to_chat(itemUser, failText)
return
if(do_after(itemUser, 20, target = itemUser))
- itemUser.say("I will apply, for the benefit of the sick, all measures that are required, avoiding those twin traps of overtreatment and therapeutic nihilism.")
+ itemUser.say("I will apply, for the benefit of the sick, all measures that are required, avoiding those twin traps of overtreatment and therapeutic nihilism.", forced = "hippocratic oath")
else
to_chat(itemUser, failText)
return
if(do_after(itemUser, 30, target = itemUser))
- itemUser.say("I will remember that I remain a member of society, with special obligations to all my fellow human beings, those sound of mind and body as well as the infirm.")
+ itemUser.say("I will remember that I remain a member of society, with special obligations to all my fellow human beings, those sound of mind and body as well as the infirm.", forced = "hippocratic oath")
else
to_chat(itemUser, failText)
return
if(do_after(itemUser, 30, target = itemUser))
- itemUser.say("If I do not violate this oath, may I enjoy life and art, respected while I live and remembered with affection thereafter. May I always act so as to preserve the finest traditions of my calling and may I long experience the joy of healing those who seek my help.")
+ itemUser.say("If I do not violate this oath, may I enjoy life and art, respected while I live and remembered with affection thereafter. May I always act so as to preserve the finest traditions of my calling and may I long experience the joy of healing those who seek my help.", forced = "hippocratic oath")
else
to_chat(itemUser, failText)
return
@@ -1083,7 +1083,7 @@
to_chat(user, "The[beacon ? " beacon is not currently":"re is a beacon"] attached.")
/obj/item/hierophant_club/suicide_act(mob/living/user)
- say("Xverwpsgexmrk...")
+ say("Xverwpsgexmrk...", forced = "hierophant club suicide")
user.visible_message("[user] holds [src] into the air! It looks like [user.p_theyre()] trying to commit suicide!")
new/obj/effect/temp_visual/hierophant/telegraph(get_turf(user))
playsound(user,'sound/machines/airlockopen.ogg', 75, TRUE)
diff --git a/code/modules/mob/dead/observer/say.dm b/code/modules/mob/dead/observer/say.dm
index eef7dd5bd3d..d521ef179f1 100644
--- a/code/modules/mob/dead/observer/say.dm
+++ b/code/modules/mob/dead/observer/say.dm
@@ -1,4 +1,4 @@
-/mob/dead/observer/say(message)
+/mob/dead/observer/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null)
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
if (!message)
return
diff --git a/code/modules/mob/living/brain/say.dm b/code/modules/mob/living/brain/say.dm
index de18b8ce3f5..ce0a09c27f6 100644
--- a/code/modules/mob/living/brain/say.dm
+++ b/code/modules/mob/living/brain/say.dm
@@ -1,4 +1,4 @@
-/mob/living/brain/say(message, language)
+/mob/living/brain/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null)
if(!(container && istype(container, /obj/item/mmi)))
return //No MMI, can't speak, bucko./N
else
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 032550261d1..df7ccf85154 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -676,7 +676,7 @@
/mob/living/carbon/human/cuff_resist(obj/item/I)
if(dna && dna.check_mutation(HULK))
- say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
+ say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk")
if(..(I, cuff_break = FAST_CUFFBREAK))
dropItemToGround(I)
else
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 2d983d81ef9..a3ef87b01c3 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -460,12 +460,12 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put
else
ballmer_percent = (-abs(drunkenness - 13.35) / 0.9) + 1
if(prob(5))
- say(pick(GLOB.ballmer_good_msg))
+ say(pick(GLOB.ballmer_good_msg), forced = "ballmer")
SSresearch.science_tech.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = BALLMER_POINTS * ballmer_percent))
if(drunkenness > 26) // by this point you're into windows ME territory
if(prob(5))
SSresearch.science_tech.remove_point_list(list(TECHWEB_POINT_TYPE_GENERIC = BALLMER_POINTS))
- say(pick(GLOB.ballmer_windows_me_msg))
+ say(pick(GLOB.ballmer_windows_me_msg), forced = "ballmer")
if(drunkenness >= 41)
if(prob(25))
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index e6be7497210..5ed5534e993 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -81,7 +81,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
return new_msg
-/mob/living/say(message, bubble_type,var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE)
+/mob/living/say(message, bubble_type,var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null)
var/static/list/crit_allowed_modes = list(MODE_WHISPER = TRUE, MODE_CHANGELING = TRUE, MODE_ALIEN = TRUE)
var/static/list/unconscious_allowed_modes = list(MODE_CHANGELING = TRUE, MODE_ALIEN = TRUE)
var/talk_key = get_key(message)
@@ -174,7 +174,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
message_mode = MODE_WHISPER_CRIT
succumbed = TRUE
else
- src.log_talk(message, LOG_SAY)
+ src.log_talk(message, LOG_SAY, forced_by=forced)
message = treat_message(message)
if(!message)
diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm
index ae361ecd0f9..928bd63dd11 100644
--- a/code/modules/mob/living/silicon/ai/say.dm
+++ b/code/modules/mob/living/silicon/ai/say.dm
@@ -1,4 +1,4 @@
-/mob/living/silicon/ai/say(message, language)
+/mob/living/silicon/ai/say(message, bubble_type,var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null)
if(parent && istype(parent) && parent.stat != DEAD) //If there is a defined "parent" AI, it is actually an AI, and it is alive, anything the AI tries to say is said by the parent instead.
parent.say(message, language)
return
diff --git a/code/modules/mob/living/silicon/pai/say.dm b/code/modules/mob/living/silicon/pai/say.dm
index 94a74318641..84a878e59e3 100644
--- a/code/modules/mob/living/silicon/pai/say.dm
+++ b/code/modules/mob/living/silicon/pai/say.dm
@@ -1,8 +1,8 @@
-/mob/living/silicon/pai/say(msg)
+/mob/living/silicon/pai/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null)
if(silent)
to_chat(src, "Communication circuits remain unitialized.")
else
- ..(msg)
+ ..(message)
/mob/living/silicon/pai/binarycheck()
return 0
diff --git a/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm b/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm
index 9ae70745cf8..be883946921 100644
--- a/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm
@@ -65,7 +65,7 @@
return 0
if(boss)
if(say_when_triggered)
- boss.say(say_when_triggered)
+ boss.say(say_when_triggered, forced = "boss action")
if(!boss.atb.spend(boss_cost))
return 0
diff --git a/code/modules/mob/living/simple_animal/hostile/netherworld.dm b/code/modules/mob/living/simple_animal/hostile/netherworld.dm
index db02919d323..8210fd64909 100644
--- a/code/modules/mob/living/simple_animal/hostile/netherworld.dm
+++ b/code/modules/mob/living/simple_animal/hostile/netherworld.dm
@@ -36,7 +36,7 @@
. = ..()
migo_sounds = list('sound/items/bubblewrap.ogg', 'sound/items/change_jaws.ogg', 'sound/items/crowbar.ogg', 'sound/items/drink.ogg', 'sound/items/deconstruct.ogg', 'sound/items/carhorn.ogg', 'sound/items/change_drill.ogg', 'sound/items/dodgeball.ogg', 'sound/items/eatfood.ogg', 'sound/items/megaphone.ogg', 'sound/items/screwdriver.ogg', 'sound/items/weeoo1.ogg', 'sound/items/wirecutter.ogg', 'sound/items/welder.ogg', 'sound/items/zip.ogg', 'sound/items/rped.ogg', 'sound/items/ratchet.ogg', 'sound/items/polaroid1.ogg', 'sound/items/pshoom.ogg', 'sound/items/airhorn.ogg', 'sound/items/geiger/high1.ogg', 'sound/items/geiger/high2.ogg', 'sound/voice/beepsky/creep.ogg', 'sound/voice/beepsky/iamthelaw.ogg', 'sound/voice/ed209_20sec.ogg', 'sound/voice/hiss3.ogg', 'sound/voice/hiss6.ogg', 'sound/voice/medbot/patchedup.ogg', 'sound/voice/medbot/feelbetter.ogg', 'sound/voice/human/manlaugh1.ogg', 'sound/voice/human/womanlaugh.ogg', 'sound/weapons/sear.ogg', 'sound/ambience/antag/clockcultalr.ogg', 'sound/ambience/antag/ling_aler.ogg', 'sound/ambience/antag/tatoralert.ogg', 'sound/ambience/antag/monkey.ogg', 'sound/mecha/nominal.ogg', 'sound/mecha/weapdestr.ogg', 'sound/mecha/critdestr.ogg', 'sound/mecha/imag_enh.ogg', 'sound/effects/adminhelp.ogg', 'sound/effects/alert.ogg', 'sound/effects/attackblob.ogg', 'sound/effects/bamf.ogg', 'sound/effects/blobattack.ogg', 'sound/effects/break_stone.ogg', 'sound/effects/bubbles.ogg', 'sound/effects/bubbles2.ogg', 'sound/effects/clang.ogg', 'sound/effects/clockcult_gateway_disrupted.ogg', 'sound/effects/clownstep2.ogg', 'sound/effects/curse1.ogg', 'sound/effects/dimensional_rend.ogg', 'sound/effects/doorcreaky.ogg', 'sound/effects/empulse.ogg', 'sound/effects/explosion_distant.ogg', 'sound/effects/explosionfar.ogg', 'sound/effects/explosion1.ogg', 'sound/effects/grillehit.ogg', 'sound/effects/genetics.ogg', 'sound/effects/heart_beat.ogg', 'sound/effects/hyperspace_begin.ogg', 'sound/effects/hyperspace_end.ogg', 'sound/effects/his_grace_awaken.ogg', 'sound/effects/pai_boot.ogg', 'sound/effects/phasein.ogg', 'sound/effects/picaxe1.ogg', 'sound/effects/ratvar_reveal.ogg', 'sound/effects/sparks1.ogg', 'sound/effects/smoke.ogg', 'sound/effects/splat.ogg', 'sound/effects/snap.ogg', 'sound/effects/tendril_destroyed.ogg', 'sound/effects/supermatter.ogg', 'sound/misc/desceration-01.ogg', 'sound/misc/desceration-02.ogg', 'sound/misc/desceration-03.ogg', 'sound/misc/bloblarm.ogg', 'sound/misc/airraid.ogg', 'sound/misc/bang.ogg','sound/misc/highlander.ogg', 'sound/misc/interference.ogg', 'sound/misc/notice1.ogg', 'sound/misc/notice2.ogg', 'sound/misc/sadtrombone.ogg', 'sound/misc/slip.ogg', 'sound/misc/splort.ogg', 'sound/weapons/armbomb.ogg', 'sound/weapons/beam_sniper.ogg', 'sound/weapons/chainsawhit.ogg', 'sound/weapons/emitter.ogg', 'sound/weapons/emitter2.ogg', 'sound/weapons/blade1.ogg', 'sound/weapons/bladeslice.ogg', 'sound/weapons/blastcannon.ogg', 'sound/weapons/blaster.ogg', 'sound/weapons/bulletflyby3.ogg', 'sound/weapons/circsawhit.ogg', 'sound/weapons/cqchit2.ogg', 'sound/weapons/drill.ogg', 'sound/weapons/genhit1.ogg', 'sound/weapons/gunshot_silenced.ogg', 'sound/weapons/gunshot2.ogg', 'sound/weapons/handcuffs.ogg', 'sound/weapons/homerun.ogg', 'sound/weapons/kenetic_accel.ogg', 'sound/machines/clockcult/steam_whoosh.ogg', 'sound/machines/fryer/deep_fryer_emerge.ogg', 'sound/machines/airlock.ogg', 'sound/machines/airlock_alien_prying.ogg', 'sound/machines/airlockclose.ogg', 'sound/machines/airlockforced.ogg', 'sound/machines/airlockopen.ogg', 'sound/machines/alarm.ogg', 'sound/machines/blender.ogg', 'sound/machines/boltsdown.ogg', 'sound/machines/boltsup.ogg', 'sound/machines/buzz-sigh.ogg', 'sound/machines/buzz-two.ogg', 'sound/machines/chime.ogg', 'sound/machines/cryo_warning.ogg', 'sound/machines/defib_charge.ogg', 'sound/machines/defib_failed.ogg', 'sound/machines/defib_ready.ogg', 'sound/machines/defib_zap.ogg', 'sound/machines/deniedbeep.ogg', 'sound/machines/ding.ogg', 'sound/machines/disposalflush.ogg', 'sound/machines/door_close.ogg', 'sound/machines/door_open.ogg', 'sound/machines/engine_alert1.ogg', 'sound/machines/engine_alert2.ogg', 'sound/machines/hiss.ogg', 'sound/machines/honkbot_evil_laugh.ogg', 'sound/machines/juicer.ogg', 'sound/machines/ping.ogg', 'sound/machines/signal.ogg', 'sound/machines/synth_no.ogg', 'sound/machines/synth_yes.ogg', 'sound/machines/terminal_alert.ogg', 'sound/machines/triple_beep.ogg', 'sound/machines/twobeep.ogg', 'sound/machines/ventcrawl.ogg', 'sound/machines/warning-buzzer.ogg', 'sound/ai/outbreak5.ogg', 'sound/ai/outbreak7.ogg', 'sound/ai/poweroff.ogg', 'sound/ai/radiation.ogg', 'sound/ai/shuttlecalled.ogg', 'sound/ai/shuttledock.ogg', 'sound/ai/shuttlerecalled.ogg', 'sound/ai/aimalf.ogg') //hahahaha fuck you code divers
-/mob/living/simple_animal/hostile/netherworld/migo/say(message)
+/mob/living/simple_animal/hostile/netherworld/migo/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null)
..()
if(stat)
return
diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm
index 81d583ee654..804989e71ee 100644
--- a/code/modules/mob/living/simple_animal/hostile/statue.dm
+++ b/code/modules/mob/living/simple_animal/hostile/statue.dm
@@ -133,7 +133,7 @@
// Cannot talk
-/mob/living/simple_animal/hostile/statue/say()
+/mob/living/simple_animal/hostile/statue/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null)
return 0
// Turn to dust when gibbed
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 435ca40066f..fcb201d0ad7 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -174,7 +174,7 @@
length += emote_see.len
var/randomValue = rand(1,length)
if(randomValue <= speak.len)
- say(pick(speak))
+ say(pick(speak), forced = "poly")
else
randomValue -= speak.len
if(emote_see && randomValue <= emote_see.len)
@@ -182,7 +182,7 @@
else
emote("me [pick(emote_hear)]", 2)
else
- say(pick(speak))
+ say(pick(speak), forced = "poly")
else
if(!(emote_hear && emote_hear.len) && (emote_see && emote_see.len))
emote("me", 1, pick(emote_see))
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm
index 1385f4e54c2..ff1f620a3a8 100644
--- a/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm
@@ -9,7 +9,7 @@
H.SetKnockdown(0)
H.adjustStaminaLoss(-75)
H.stuttering = 0
- H.say(pick("A CORNERED FOX IS MORE DANGEROUS THAN A JACKAL!","HURT ME MOOORRREEE!","IMPRESSIVE!"))
+ H.say(pick("A CORNERED FOX IS MORE DANGEROUS THAN A JACKAL!","HURT ME MOOORRREEE!","IMPRESSIVE!"), forced = "ninjaboost")
a_boost--
to_chat(H, "There are [a_boost] adrenaline boosts remaining.")
s_coold = 3
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm
index 81d731b1101..8c8f92e522f 100644
--- a/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm
@@ -19,7 +19,7 @@
return
if(!ninjacost(200,N_STEALTH_CANCEL))
H.Beam(C,"n_beam",time=15)
- H.say("Get over here!")
+ H.say("Get over here!", forced = "ninja net")
var/obj/structure/energy_net/E = new /obj/structure/energy_net(C.drop_location())
E.affecting = C
E.master = H
diff --git a/code/modules/paperwork/contract.dm b/code/modules/paperwork/contract.dm
index 71eb5ba922f..006151c4eb8 100644
--- a/code/modules/paperwork/contract.dm
+++ b/code/modules/paperwork/contract.dm
@@ -100,7 +100,7 @@
/obj/item/paper/contract/infernal/suicide_act(mob/user)
if(signed && (user == target.current) && istype(user, /mob/living/carbon/human/))
var/mob/living/carbon/human/H = user
- H.forcesay("OH GREAT INFERNO! I DEMAND YOU COLLECT YOUR BOUNTY IMMEDIATELY!")
+ H.forcesay("OH GREAT INFERNO! I DEMAND YOU COLLECT YOUR BOUNTY IMMEDIATELY!", forced = "infernal contract suicide")
H.visible_message("[H] holds up a contract claiming [user.p_their()] soul, then immediately catches fire. It looks like [user.p_theyre()] trying to commit suicide!")
H.adjust_fire_stacks(20)
H.IgniteMob()
diff --git a/code/modules/projectiles/projectile/energy/stun.dm b/code/modules/projectiles/projectile/energy/stun.dm
index b5b45a84ec6..db1ad403a76 100644
--- a/code/modules/projectiles/projectile/energy/stun.dm
+++ b/code/modules/projectiles/projectile/energy/stun.dm
@@ -21,7 +21,7 @@
SEND_SIGNAL(C, COMSIG_ADD_MOOD_EVENT, "tased", /datum/mood_event/tased)
SEND_SIGNAL(C, COMSIG_LIVING_MINOR_SHOCK)
if(C.dna && C.dna.check_mutation(HULK))
- C.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
+ C.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk")
else if((C.status_flags & CANKNOCKDOWN) && !C.has_trait(TRAIT_STUNIMMUNE))
addtimer(CALLBACK(C, /mob/living/carbon.proc/do_jitter_animation, jitter), 5)
diff --git a/code/modules/projectiles/projectile/special/hallucination.dm b/code/modules/projectiles/projectile/special/hallucination.dm
index 81284814eb8..f65ebce51f7 100644
--- a/code/modules/projectiles/projectile/special/hallucination.dm
+++ b/code/modules/projectiles/projectile/special/hallucination.dm
@@ -169,7 +169,7 @@
hal_target.Knockdown(100)
hal_target.stuttering += 20
if(hal_target.dna && hal_target.dna.check_mutation(HULK))
- hal_target.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
+ hal_target.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ), forced = "hulk")
else if((hal_target.status_flags & CANKNOCKDOWN) && !hal_target.has_trait(TRAIT_STUNIMMUNE))
addtimer(CALLBACK(hal_target, /mob/living/carbon.proc/do_jitter_animation, 20), 5)
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index ddd1a568c67..048357cbeb7 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -219,7 +219,7 @@
M.stuttering = min(M.stuttering+4, 10)
M.Dizzy(5)
if(iscultist(M) && prob(20))
- M.say(pick("Av'te Nar'sie","Pa'lid Mors","INO INO ORA ANA","SAT ANA!","Daim'niodeis Arc'iai Le'eones","R'ge Na'sie","Diabo us Vo'iscum","Eld' Mon Nobis"))
+ M.say(pick("Av'te Nar'sie","Pa'lid Mors","INO INO ORA ANA","SAT ANA!","Daim'niodeis Arc'iai Le'eones","R'ge Na'sie","Diabo us Vo'iscum","Eld' Mon Nobis"), forced = "holy water")
if(prob(10))
M.visible_message("[M] starts having a seizure!", "You have a seizure!")
M.Unconscious(120)
@@ -414,7 +414,7 @@
else
M.visible_message("[M] flexes [M.p_their()] arms.")
if(prob(10))
- M.say(pick("Shit was SO cash.", "You are everything bad in the world.", "What sports do you play, other than 'jack off to naked drawn Japanese people?'", "Don’t be a stranger. Just hit me with your best shot.", "My name is John and I hate every single one of you."))
+ M.say(pick("Shit was SO cash.", "You are everything bad in the world.", "What sports do you play, other than 'jack off to naked drawn Japanese people?'", "Don’t be a stranger. Just hit me with your best shot.", "My name is John and I hate every single one of you."), forced = "spraytan")
..()
return
@@ -1650,7 +1650,7 @@
/datum/reagent/royal_bee_jelly/on_mob_life(mob/living/carbon/M)
if(prob(2))
- M.say(pick("Bzzz...","BZZ BZZ","Bzzzzzzzzzzz..."))
+ M.say(pick("Bzzz...","BZZ BZZ","Bzzzzzzzzzzz..."), forced = "royal bee jelly")
..()
//Misc reagents
diff --git a/code/modules/research/nanites/nanite_programs/suppression.dm b/code/modules/research/nanites/nanite_programs/suppression.dm
index 9d501e626a0..3d89baba68c 100644
--- a/code/modules/research/nanites/nanite_programs/suppression.dm
+++ b/code/modules/research/nanites/nanite_programs/suppression.dm
@@ -147,7 +147,7 @@
if(host_mob.stat == DEAD)
return
to_chat(host_mob, "You feel compelled to speak...")
- host_mob.say(sentence)
+ host_mob.say(sentence, forced = "nanite speech")
/datum/nanite_program/triggered/voice
name = "Skull Echo"
diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm
index e7466a390e1..98eb6f56bf5 100644
--- a/code/modules/spells/spell.dm
+++ b/code/modules/spells/spell.dm
@@ -237,9 +237,9 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th
switch(invocation_type)
if("shout")
if(prob(50))//Auto-mute? Fuck that noise
- user.say(invocation)
+ user.say(invocation, forced = "spell")
else
- user.say(replacetext(invocation," ","`"))
+ user.say(replacetext(invocation," ","`"), forced = "spell")
if("whisper")
if(prob(50))
user.whisper(invocation)
diff --git a/code/modules/spells/spell_types/area_teleport.dm b/code/modules/spells/spell_types/area_teleport.dm
index 23fdc1ee547..ab399f4e2a7 100644
--- a/code/modules/spells/spell_types/area_teleport.dm
+++ b/code/modules/spells/spell_types/area_teleport.dm
@@ -77,12 +77,12 @@
else
switch(invocation_type)
if("shout")
- user.say("[invocation] [uppertext(chosenarea.name)]")
+ user.say("[invocation] [uppertext(chosenarea.name)]", forced = "spell")
if(user.gender==MALE)
playsound(user.loc, pick('sound/misc/null.ogg','sound/misc/null.ogg'), 100, 1)
else
playsound(user.loc, pick('sound/misc/null.ogg','sound/misc/null.ogg'), 100, 1)
if("whisper")
- user.whisper("[invocation] [uppertext(chosenarea.name)]")
+ user.whisper("[invocation] [uppertext(chosenarea.name)]", forced = "spell")
return
diff --git a/code/modules/spells/spell_types/godhand.dm b/code/modules/spells/spell_types/godhand.dm
index 5d07b88ca7b..919d87b4c7b 100644
--- a/code/modules/spells/spell_types/godhand.dm
+++ b/code/modules/spells/spell_types/godhand.dm
@@ -25,7 +25,7 @@
/obj/item/melee/touch_attack/afterattack(atom/target, mob/user, proximity)
. = ..()
- user.say(catchphrase)
+ user.say(catchphrase, forced = "spell")
playsound(get_turf(user), on_use_sound,50,1)
charges--
if(charges <= 0)
diff --git a/code/modules/spells/spell_types/wizard.dm b/code/modules/spells/spell_types/wizard.dm
index 3d7894f98d4..aec0e7806b0 100644
--- a/code/modules/spells/spell_types/wizard.dm
+++ b/code/modules/spells/spell_types/wizard.dm
@@ -374,4 +374,4 @@
. = ..()
if(ishuman(thrower))
var/mob/living/carbon/human/H = thrower
- H.say("LIGHTNINGBOLT!!")
+ H.say("LIGHTNINGBOLT!!", forced = "spell")