[Ready]Logs when speech is forced by an external factor (#39964)

* Logs when speech is forced by an external factor

* makes say args uniform

* fix
This commit is contained in:
XDTM
2018-09-03 11:38:16 +02:00
committed by AnturK
parent 7c2225ef04
commit 3f32f8c110
59 changed files with 92 additions and 91 deletions

View File

@@ -124,7 +124,7 @@
client.images.Remove(human_image) client.images.Remove(human_image)
return ..() 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) if (!message)
return return

View File

@@ -51,7 +51,7 @@
if(prob(3)) if(prob(3))
owner.emote("drool") owner.emote("drool")
else if(owner.stat == CONSCIOUS && prob(3)) 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() /datum/brain_trauma/mild/dumbness/on_lose()

View File

@@ -107,7 +107,7 @@
if(2) if(2)
owner.emote("scream") owner.emote("scream")
owner.Jitter(5) owner.Jitter(5)
owner.say("AAAAH!!") owner.say("AAAAH!!", forced = "phobia")
if(reason) if(reason)
owner.pointed(reason) owner.pointed(reason)
if(3) if(3)

View File

@@ -138,7 +138,7 @@
to_chat(src, "<span class='notice'>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.</span>") to_chat(src, "<span class='notice'>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.</span>")
to_chat(src, "<span class='warning'><b>Do not commit suicide or put the body in a deadly position. Behave like you care about it as much as the owner.</b></span>") to_chat(src, "<span class='warning'><b>Do not commit suicide or put the body in a deadly position. Behave like you care about it as much as the owner.</b></span>")
/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, "<span class='warning'>You cannot speak, your other self is controlling your body!</span>") to_chat(src, "<span class='warning'>You cannot speak, your other self is controlling your body!</span>")
return FALSE return FALSE

View File

@@ -21,7 +21,7 @@
cure() cure()
else if(prob(parrot.speak_chance)) else if(prob(parrot.speak_chance))
if(parrot.speech_buffer.len) 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() /datum/disease/parrot_possession/cure()
if(parrot && parrot.loc == affected_mob) if(parrot && parrot.loc == affected_mob)

View File

@@ -25,4 +25,4 @@
to_chat(affected_mob, "<span class='danger'>Your thoughts are interrupted by a loud <b>HONK!</b></span>") to_chat(affected_mob, "<span class='danger'>Your thoughts are interrupted by a loud <b>HONK!</b></span>")
if(4) if(4)
if(prob(5)) 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")

View File

@@ -136,7 +136,7 @@
affected_mob.confused += 10 affected_mob.confused += 10
if(4) if(4)
if(prob(3)) 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() /datum/disease/transformation/jungle_fever/cure()
remove_monkey(affected_mob.mind) remove_monkey(affected_mob.mind)
@@ -176,13 +176,13 @@
switch(stage) switch(stage)
if(3) if(3)
if (prob(8)) 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)) if (prob(4))
to_chat(affected_mob, "<span class='danger'>You feel a stabbing pain in your head.</span>") to_chat(affected_mob, "<span class='danger'>You feel a stabbing pain in your head.</span>")
affected_mob.Unconscious(40) affected_mob.Unconscious(40)
if(4) if(4)
if (prob(20)) 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 /datum/disease/transformation/xeno
@@ -212,7 +212,7 @@
affected_mob.Unconscious(40) affected_mob.Unconscious(40)
if(4) if(4)
if (prob(20)) 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 /datum/disease/transformation/slime
@@ -264,10 +264,10 @@
switch(stage) switch(stage)
if(3) if(3)
if (prob(8)) if (prob(8))
affected_mob.say(pick("YAP", "Woof!")) affected_mob.say(pick("YAP", "Woof!"), forced = "corgi transformation")
if(4) if(4)
if (prob(20)) if (prob(20))
affected_mob.say(pick("Bark!", "AUUUUUU")) affected_mob.say(pick("Bark!", "AUUUUUU"), forced = "corgi transformation")
/datum/disease/transformation/morph /datum/disease/transformation/morph
name = "Gluttony's Blessing" name = "Gluttony's Blessing"

View File

@@ -29,21 +29,21 @@ STI KALY - blind
switch(stage) switch(stage)
if(2) if(2)
if(prob(1)&&prob(50)) 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)) if(prob(1)&&prob(50))
to_chat(affected_mob, "<span class='danger'>You feel [pick("that you don't have enough mana", "that the winds of magic are gone", "an urge to summon familiar")].</span>") to_chat(affected_mob, "<span class='danger'>You feel [pick("that you don't have enough mana", "that the winds of magic are gone", "an urge to summon familiar")].</span>")
if(3) if(3)
if(prob(1)&&prob(50)) 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)) if(prob(1)&&prob(50))
to_chat(affected_mob, "<span class='danger'>You feel [pick("the magic bubbling in your veins","that this location gives you a +1 to INT","an urge to summon familiar")].</span>") to_chat(affected_mob, "<span class='danger'>You feel [pick("the magic bubbling in your veins","that this location gives you a +1 to INT","an urge to summon familiar")].</span>")
if(4) if(4)
if(prob(1)) 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 return
if(prob(1)&&prob(50)) if(prob(1)&&prob(50))
to_chat(affected_mob, "<span class='danger'>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")].</span>") to_chat(affected_mob, "<span class='danger'>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")].</span>")
@@ -111,7 +111,7 @@ STI KALY - blind
if(!L) if(!L)
return 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)) affected_mob.forceMove(pick(L))
return return

View File

@@ -32,7 +32,7 @@
sleep(1) sleep(1)
/datum/martial_art/plasma_fist/proc/Tornado(mob/living/carbon/human/A, mob/living/carbon/human/D) /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) TornadoAnimate(A)
var/obj/effect/proc_holder/spell/aoe_turf/repulse/R = new(null) var/obj/effect/proc_holder/spell/aoe_turf/repulse/R = new(null)
var/list/turfs = list() var/list/turfs = list()
@@ -48,14 +48,14 @@
playsound(D.loc, 'sound/weapons/punch1.ogg', 50, 1, -1) 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))) 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) 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)") log_combat(A, D, "threw back (Plasma Fist)")
return return
/datum/martial_art/plasma_fist/proc/Plasma(mob/living/carbon/human/A, mob/living/carbon/human/D) /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) A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
playsound(D.loc, 'sound/weapons/punch1.ogg', 50, 1, -1) playsound(D.loc, 'sound/weapons/punch1.ogg', 50, 1, -1)
A.say("PLASMA FIST!") A.say("PLASMA FIST!", forced="plasma fist")
D.visible_message("<span class='danger'>[A] has hit [D] with THE PLASMA FIST TECHNIQUE!</span>", \ D.visible_message("<span class='danger'>[A] has hit [D] with THE PLASMA FIST TECHNIQUE!</span>", \
"<span class='userdanger'>[A] has hit [D] with THE PLASMA FIST TECHNIQUE!</span>") "<span class='userdanger'>[A] has hit [D] with THE PLASMA FIST TECHNIQUE!</span>")
D.gib() D.gib()

View File

@@ -107,7 +107,7 @@
if(1) if(1)
owner.emote("twitch") owner.emote("twitch")
if(2 to 3) 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/x_offset_old = owner.pixel_x
var/y_offset_old = owner.pixel_y var/y_offset_old = owner.pixel_y
var/x_offset = owner.pixel_x + rand(-2,2) var/x_offset = owner.pixel_x + rand(-2,2)

View File

@@ -625,10 +625,11 @@
stack_trace("Invalid individual logging type: [message_type]. Defaulting to [LOG_GAME] (LOG_GAME).") stack_trace("Invalid individual logging type: [message_type]. Defaulting to [LOG_GAME] (LOG_GAME).")
log_game(log_text) log_game(log_text)
// Helper for logging chat messages or other logs wiht arbitrary inputs (e.g. announcements) // 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) /atom/proc/log_talk(message, message_type, tag=null, log_globally=TRUE, forced_by=null)
var/prefix = tag ? "([tag]) " : "" 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 // Helper for logging of messages with only one sender and receiver
/proc/log_directed_talk(atom/source, atom/target, message, message_type, tag) /proc/log_directed_talk(atom/source, atom/target, message, message_type, tag)

View File

@@ -885,7 +885,7 @@ GLOBAL_LIST_EMPTY(allCasters)
/obj/item/newspaper/suicide_act(mob/user) /obj/item/newspaper/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[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!</span>") user.visible_message("<span class='suicide'>[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!</span>")
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/mob/living/carbon/human/H = user
var/obj/W = new /obj/item/reagent_containers/food/drinks/bottle/whiskey(H.loc) 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) playsound(H.loc, 'sound/items/drink.ogg', rand(10,50), 1)

View File

@@ -171,7 +171,7 @@
// By default, the emagged recycler will gib all non-carbons. (human simple animal mobs don't count) // By default, the emagged recycler will gib all non-carbons. (human simple animal mobs don't count)
if(iscarbon(L)) if(iscarbon(L))
if(L.stat == CONSCIOUS) if(L.stat == CONSCIOUS)
L.say("ARRRRRRRRRRRGH!!!") L.say("ARRRRRRRRRRRGH!!!", forced="recycler grinding")
add_mob_blood(L) add_mob_blood(L)
if(!blood && !issilicon(L)) if(!blood && !issilicon(L))

View File

@@ -51,7 +51,7 @@
cleanspeed = 10 //much faster than mop so it is useful for traitors who want to clean crime scenes 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) /obj/item/soap/suicide_act(mob/user)
user.say(";FFFFFFFFFFFFFFFFUUUUUUUDGE!!") user.say(";FFFFFFFFFFFFFFFFUUUUUUUDGE!!", forced="soap suicide")
user.visible_message("<span class='suicide'>[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!</span>") user.visible_message("<span class='suicide'>[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!</span>")
new /obj/effect/particle_effect/foam(loc) new /obj/effect/particle_effect/foam(loc)
return (TOXLOSS) return (TOXLOSS)

View File

@@ -535,11 +535,11 @@
var/mob/living/carbon/human/H = user var/mob/living/carbon/human/H = user
if(is_capped || !actually_paints) if(is_capped || !actually_paints)
user.visible_message("<span class='suicide'>[user] shakes up [src] with a rattle and lifts it to [user.p_their()] mouth, but nothing happens!</span>") user.visible_message("<span class='suicide'>[user] shakes up [src] with a rattle and lifts it to [user.p_their()] mouth, but nothing happens!</span>")
user.say("MEDIOCRE!!") user.say("MEDIOCRE!!", forced="spraycan suicide")
return SHAME return SHAME
else else
user.visible_message("<span class='suicide'>[user] shakes up [src] with a rattle and lifts it to [user.p_their()] mouth, spraying paint across [user.p_their()] teeth!</span>") user.visible_message("<span class='suicide'>[user] shakes up [src] with a rattle and lifts it to [user.p_their()] mouth, spraying paint across [user.p_their()] teeth!</span>")
user.say("WITNESS ME!!") user.say("WITNESS ME!!", forced="spraycan suicide")
if(pre_noise || post_noise) if(pre_noise || post_noise)
playsound(loc, 'sound/effects/spray.ogg', 5, 1, 5) playsound(loc, 'sound/effects/spray.ogg', 5, 1, 5)
if(can_change_colour) if(can_change_colour)

View File

@@ -14,7 +14,7 @@
/obj/item/megaphone/suicide_act(mob/living/carbon/user) /obj/item/megaphone/suicide_act(mob/living/carbon/user)
user.visible_message("<span class='suicide'>[user] is uttering [user.p_their()] last words into \the [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>") user.visible_message("<span class='suicide'>[user] is uttering [user.p_their()] last words into \the [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
spamcheck = 0//so they dont have to worry about recharging 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 return OXYLOSS
/obj/item/megaphone/get_held_item_speechspans(mob/living/carbon/user) /obj/item/megaphone/get_held_item_speechspans(mob/living/carbon/user)

View File

@@ -147,7 +147,7 @@
message_say = "FOR RATVAR!" message_say = "FOR RATVAR!"
else if(UM.has_antag_datum(/datum/antagonist/rev)) else if(UM.has_antag_datum(/datum/antagonist/rev))
message_say = "VIVA LA REVOLUTION!" message_say = "VIVA LA REVOLUTION!"
M.say(message_say) M.say(message_say, forced="C4 suicide")
/obj/item/grenade/plastic/suicide_act(mob/user) /obj/item/grenade/plastic/suicide_act(mob/user)
message_admins("[ADMIN_LOOKUPFLW(user)] suicided with [src] at [ADMIN_VERBOSEJMP(user)]") message_admins("[ADMIN_LOOKUPFLW(user)] suicided with [src] at [ADMIN_VERBOSEJMP(user)]")

View File

@@ -30,7 +30,7 @@
"<span class='notice'>You raise [src] skywards, inspiring your allies!</span>") "<span class='notice'>You raise [src] skywards, inspiring your allies!</span>")
playsound(src, "rustle", 100, FALSE) playsound(src, "rustle", 100, FALSE)
if(warcry) if(warcry)
user.say("[warcry]") user.say("[warcry]", forced="banner")
var/old_transform = user.transform var/old_transform = user.transform
user.transform *= 1.2 user.transform *= 1.2
animate(user, transform = old_transform, time = 10) animate(user, transform = old_transform, time = 10)

View File

@@ -482,7 +482,7 @@
/obj/item/twohanded/spear/suicide_act(mob/living/carbon/user) /obj/item/twohanded/spear/suicide_act(mob/living/carbon/user)
user.visible_message("<span class='suicide'>[user] begins to sword-swallow \the [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>") user.visible_message("<span class='suicide'>[user] begins to sword-swallow \the [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
if(explosive) if(explosive)
user.say("[war_cry]") user.say("[war_cry]", forced="spear warcry")
explosive.forceMove(user) explosive.forceMove(user)
explosive.prime() explosive.prime()
user.gib() user.gib()
@@ -512,7 +512,7 @@
if(isopenturf(AM)) //So you can actually melee with it if(isopenturf(AM)) //So you can actually melee with it
return return
if(explosive && wielded) if(explosive && wielded)
user.say("[war_cry]") user.say("[war_cry]", forced="spear warcry")
explosive.forceMove(AM) explosive.forceMove(AM)
explosive.prime() explosive.prime()
qdel(src) qdel(src)

View File

@@ -83,7 +83,7 @@
visible_message("<span class='danger'>[user] smashes [src]!</span>", null, null, COMBAT_MESSAGE_RANGE) visible_message("<span class='danger'>[user] smashes [src]!</span>", null, null, COMBAT_MESSAGE_RANGE)
if(density) if(density)
playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1) 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 else
playsound(src, 'sound/effects/bang.ogg', 50, 1) playsound(src, 'sound/effects/bang.ogg', 50, 1)
take_damage(hulk_damage(), BRUTE, "melee", 0, get_dir(src, user)) take_damage(hulk_damage(), BRUTE, "melee", 0, get_dir(src, user))

View File

@@ -18,12 +18,12 @@ GLOBAL_LIST_INIT(freqtospan, list(
"[FREQ_CTF_BLUE]" = "blueteamradio" "[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()) if(!can_speak())
return return
if(message == "" || !message) if(message == "" || !message)
return return
var/list/spans = get_spans() spans |= get_spans()
if(!language) if(!language)
language = get_default_language() language = get_default_language()
send_speech(message, 7, src, , spans, message_language=language) send_speech(message, 7, src, , spans, message_language=language)

View File

@@ -139,7 +139,7 @@
..(user, 1) ..(user, 1)
if(prob(hardness)) if(prob(hardness))
playsound(src, 'sound/effects/meteorimpact.ogg', 100, 1) 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) dismantle_wall(1)
else else
playsound(src, 'sound/effects/bang.ogg', 50, 1) playsound(src, 'sound/effects/bang.ogg', 50, 1)

View File

@@ -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. 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) if(!speech)
return return
M.say(speech) M.say(speech, forced = "admin speech")
speech = sanitize(speech) // Nah, we don't trust them speech = sanitize(speech) // Nah, we don't trust them
log_admin("[key_name(usr)] forced [key_name(M)] to say: [speech]") log_admin("[key_name(usr)] forced [key_name(M)] to say: [speech]")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] forced [key_name_admin(M)] to say: [speech]</span>") message_admins("<span class='adminnotice'>[key_name_admin(usr)] forced [key_name_admin(M)] to say: [speech]</span>")

View File

@@ -185,7 +185,7 @@ GLOBAL_LIST_EMPTY(blob_nodes)
blob_points = CLAMP(blob_points + points, 0, max_blob_points) blob_points = CLAMP(blob_points + points, 0, max_blob_points)
hud_used.blobpwrdisplay.maptext = "<div align='center' valign='middle' style='position:relative; top:0px; left:6px'><font color='#82ed00'>[round(blob_points)]</font></div>" hud_used.blobpwrdisplay.maptext = "<div align='center' valign='middle' style='position:relative; top:0px; left:6px'><font color='#82ed00'>[round(blob_points)]</font></div>"
/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) if (!message)
return return

View File

@@ -76,7 +76,7 @@
E = new V E = new V
E.Grant(src) 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)
if(client.prefs.muted & MUTE_IC) if(client.prefs.muted & MUTE_IC)
to_chat(src, "You cannot send IC messages (muted).") to_chat(src, "You cannot send IC messages (muted).")

View File

@@ -196,15 +196,15 @@
/datum/action/innate/cult/master/finalreck/proc/chant(chant_number) /datum/action/innate/cult/master/finalreck/proc/chant(chant_number)
switch(chant_number) switch(chant_number)
if(1) 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) 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) playsound(get_turf(owner),'sound/magic/clockwork/narsie_attack.ogg', 50, 1)
if(3) 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) playsound(get_turf(owner),'sound/magic/clockwork/narsie_attack.ogg', 75, 1)
if(4) 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) playsound(get_turf(owner),'sound/magic/clockwork/narsie_attack.ogg', 100, 1)
/datum/action/innate/cult/master/cultmark /datum/action/innate/cult/master/cultmark

View File

@@ -62,7 +62,7 @@ Runes can either be invoked by one's self or with many different cultists. Each
to_chat(user, "<span class='notice'>You carefully erase the [lowertext(cultist_name)] rune.</span>") to_chat(user, "<span class='notice'>You carefully erase the [lowertext(cultist_name)] rune.</span>")
qdel(src) qdel(src)
else if(istype(I, /obj/item/nullrod)) else if(istype(I, /obj/item/nullrod))
user.say("BEGONE FOUL MAGIKS!!") user.say("BEGONE FOUL MAGIKS!!", forced = "nullrod")
to_chat(user, "<span class='danger'>You disrupt the magic of [src] with [I].</span>") to_chat(user, "<span class='danger'>You disrupt the magic of [src] with [I].</span>")
qdel(src) qdel(src)
@@ -136,7 +136,7 @@ structure_check() searches for nearby cultist structures required for the invoca
if(isliving(M)) if(isliving(M))
var/mob/living/L = M var/mob/living/L = M
if(invocation) 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) if(invoke_damage)
L.apply_damage(invoke_damage, BRUTE) L.apply_damage(invoke_damage, BRUTE)
to_chat(L, "<span class='cult italic'>[src] saps your strength!</span>") to_chat(L, "<span class='cult italic'>[src] saps your strength!</span>")

View File

@@ -107,7 +107,7 @@ the new instance inside the host to be updated to the template's stats.
if(istype(B)) if(istype(B))
to_chat(user, "<span class='notice'>[B.name]</span>") to_chat(user, "<span class='notice'>[B.name]</span>")
/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 return
/mob/camera/disease/Move(NewLoc, Dir = 0) /mob/camera/disease/Move(NewLoc, Dir = 0)

View File

@@ -144,7 +144,7 @@
/mob/living/simple_animal/revenant/med_hud_set_status() /mob/living/simple_animal/revenant/med_hud_set_status()
return //we use no hud 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) if(!message)
return return
src.log_talk(message, LOG_SAY) src.log_talk(message, LOG_SAY)

View File

@@ -301,7 +301,7 @@
switch(user.zone_selected) switch(user.zone_selected)
if(BODY_ZONE_PRECISE_MOUTH) if(BODY_ZONE_PRECISE_MOUTH)
var/wgw = sanitize(input(user, "What would you like the victim to say", "Voodoo", null) as text) 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.") log_game("[key_name(user)] made [key_name(target)] say [wgw] with a voodoo doll.")
if(BODY_ZONE_PRECISE_EYES) if(BODY_ZONE_PRECISE_EYES)
user.set_machine(src) user.set_machine(src)

View File

@@ -70,7 +70,7 @@
if(M.a_intent == INTENT_HARM) if(M.a_intent == INTENT_HARM)
M.changeNext_move(CLICK_CD_RAPID) M.changeNext_move(CLICK_CD_RAPID)
if(warcry) if(warcry)
M.say("[warcry]", ignore_spam = TRUE) M.say("[warcry]", ignore_spam = TRUE, forced = "north star warcry")
.= FALSE .= FALSE
/obj/item/clothing/gloves/rapid/attack_self(mob/user) /obj/item/clothing/gloves/rapid/attack_self(mob/user)

View File

@@ -12,10 +12,10 @@
/obj/item/clothing/head/chefhat/suicide_act(mob/user) /obj/item/clothing/head/chefhat/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is donning [src]! It looks like [user.p_theyre()] trying to become a chef.</span>") user.visible_message("<span class='suicide'>[user] is donning [src]! It looks like [user.p_theyre()] trying to become a chef.</span>")
user.say("Bork Bork Bork!") user.say("Bork Bork Bork!", forced = "chef hat suicide")
sleep(20) sleep(20)
user.visible_message("<span class='suicide'>[user] climbs into an imaginary oven!</span>") user.visible_message("<span class='suicide'>[user] climbs into an imaginary oven!</span>")
user.say("BOOORK!") user.say("BOOORK!", forced = "chef hat suicide")
playsound(user, 'sound/machines/ding.ogg', 50, 1) playsound(user, 'sound/machines/ding.ogg', 50, 1)
return(FIRELOSS) return(FIRELOSS)

View File

@@ -193,7 +193,7 @@
return 0 return 0
var/mob/living/carbon/human/H = user var/mob/living/carbon/human/H = user
user.visible_message("<span class='suicide'>[user] is donning [src]! It looks like [user.p_theyre()] trying to be nice to girls.</span>") user.visible_message("<span class='suicide'>[user] is donning [src]! It looks like [user.p_theyre()] trying to be nice to girls.</span>")
user.say("M'lady.") user.say("M'lady.", forced = "fedora suicide")
sleep(10) sleep(10)
H.facial_hair_style = "Neckbeard" H.facial_hair_style = "Neckbeard"
return(BRUTELOSS) return(BRUTELOSS)

View File

@@ -168,7 +168,7 @@
to_chat(usr, "<span class='warning'>\The robe's internal magic supply is still recharging!</span>") to_chat(usr, "<span class='warning'>\The robe's internal magic supply is still recharging!</span>")
return 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) 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/mob/living/M = new /mob/living/simple_animal/hostile/stickman(get_turf(usr))
var/list/factions = usr.faction var/list/factions = usr.faction

View File

@@ -283,7 +283,7 @@
/obj/item/clothing/accessory/lawyers_badge/attack_self(mob/user) /obj/item/clothing/accessory/lawyers_badge/attack_self(mob/user)
if(prob(1)) 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.", "<span class='notice'>You show your attorney's badge.</span>") user.visible_message("[user] shows [user.p_their()] attorney's badge.", "<span class='notice'>You show your attorney's badge.</span>")
/obj/item/clothing/accessory/lawyers_badge/on_uniform_equip(obj/item/clothing/under/U, user) /obj/item/clothing/accessory/lawyers_badge/on_uniform_equip(obj/item/clothing/under/U, user)

View File

@@ -33,7 +33,7 @@
sleep(25) sleep(25)
if(!user) if(!user)
return (OXYLOSS) return (OXYLOSS)
user.say("BANG!") user.say("BANG!", forced = "banana")
sleep(25) sleep(25)
if(!user) if(!user)
return (OXYLOSS) return (OXYLOSS)

View File

@@ -164,22 +164,22 @@
var/failText = "<span class='warning'>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!</span>" var/failText = "<span class='warning'>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!</span>"
to_chat(itemUser, "<span class='notice'>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...</span>") to_chat(itemUser, "<span class='notice'>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...</span>")
if(do_after(itemUser, 40, target = itemUser)) 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 else
to_chat(itemUser, failText) to_chat(itemUser, failText)
return return
if(do_after(itemUser, 20, target = itemUser)) 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 else
to_chat(itemUser, failText) to_chat(itemUser, failText)
return return
if(do_after(itemUser, 30, target = itemUser)) 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 else
to_chat(itemUser, failText) to_chat(itemUser, failText)
return return
if(do_after(itemUser, 30, target = itemUser)) 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 else
to_chat(itemUser, failText) to_chat(itemUser, failText)
return return
@@ -1083,7 +1083,7 @@
to_chat(user, "<span class='hierophant_warning'>The[beacon ? " beacon is not currently":"re is a beacon"] attached.</span>") to_chat(user, "<span class='hierophant_warning'>The[beacon ? " beacon is not currently":"re is a beacon"] attached.</span>")
/obj/item/hierophant_club/suicide_act(mob/living/user) /obj/item/hierophant_club/suicide_act(mob/living/user)
say("Xverwpsgexmrk...") say("Xverwpsgexmrk...", forced = "hierophant club suicide")
user.visible_message("<span class='suicide'>[user] holds [src] into the air! It looks like [user.p_theyre()] trying to commit suicide!</span>") user.visible_message("<span class='suicide'>[user] holds [src] into the air! It looks like [user.p_theyre()] trying to commit suicide!</span>")
new/obj/effect/temp_visual/hierophant/telegraph(get_turf(user)) new/obj/effect/temp_visual/hierophant/telegraph(get_turf(user))
playsound(user,'sound/machines/airlockopen.ogg', 75, TRUE) playsound(user,'sound/machines/airlockopen.ogg', 75, TRUE)

View File

@@ -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)) message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
if (!message) if (!message)
return return

View File

@@ -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))) if(!(container && istype(container, /obj/item/mmi)))
return //No MMI, can't speak, bucko./N return //No MMI, can't speak, bucko./N
else else

View File

@@ -676,7 +676,7 @@
/mob/living/carbon/human/cuff_resist(obj/item/I) /mob/living/carbon/human/cuff_resist(obj/item/I)
if(dna && dna.check_mutation(HULK)) 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)) if(..(I, cuff_break = FAST_CUFFBREAK))
dropItemToGround(I) dropItemToGround(I)
else else

View File

@@ -460,12 +460,12 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put
else else
ballmer_percent = (-abs(drunkenness - 13.35) / 0.9) + 1 ballmer_percent = (-abs(drunkenness - 13.35) / 0.9) + 1
if(prob(5)) 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)) 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(drunkenness > 26) // by this point you're into windows ME territory
if(prob(5)) if(prob(5))
SSresearch.science_tech.remove_point_list(list(TECHWEB_POINT_TYPE_GENERIC = BALLMER_POINTS)) 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(drunkenness >= 41)
if(prob(25)) if(prob(25))

View File

@@ -81,7 +81,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
return new_msg 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/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/static/list/unconscious_allowed_modes = list(MODE_CHANGELING = TRUE, MODE_ALIEN = TRUE)
var/talk_key = get_key(message) var/talk_key = get_key(message)
@@ -174,7 +174,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
message_mode = MODE_WHISPER_CRIT message_mode = MODE_WHISPER_CRIT
succumbed = TRUE succumbed = TRUE
else else
src.log_talk(message, LOG_SAY) src.log_talk(message, LOG_SAY, forced_by=forced)
message = treat_message(message) message = treat_message(message)
if(!message) if(!message)

View File

@@ -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. 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) parent.say(message, language)
return return

View File

@@ -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) if(silent)
to_chat(src, "<span class='warning'>Communication circuits remain unitialized.</span>") to_chat(src, "<span class='warning'>Communication circuits remain unitialized.</span>")
else else
..(msg) ..(message)
/mob/living/silicon/pai/binarycheck() /mob/living/silicon/pai/binarycheck()
return 0 return 0

View File

@@ -65,7 +65,7 @@
return 0 return 0
if(boss) if(boss)
if(say_when_triggered) if(say_when_triggered)
boss.say(say_when_triggered) boss.say(say_when_triggered, forced = "boss action")
if(!boss.atb.spend(boss_cost)) if(!boss.atb.spend(boss_cost))
return 0 return 0

View File

@@ -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 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) if(stat)
return return

View File

@@ -133,7 +133,7 @@
// Cannot talk // 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 return 0
// Turn to dust when gibbed // Turn to dust when gibbed

View File

@@ -174,7 +174,7 @@
length += emote_see.len length += emote_see.len
var/randomValue = rand(1,length) var/randomValue = rand(1,length)
if(randomValue <= speak.len) if(randomValue <= speak.len)
say(pick(speak)) say(pick(speak), forced = "poly")
else else
randomValue -= speak.len randomValue -= speak.len
if(emote_see && randomValue <= emote_see.len) if(emote_see && randomValue <= emote_see.len)
@@ -182,7 +182,7 @@
else else
emote("me [pick(emote_hear)]", 2) emote("me [pick(emote_hear)]", 2)
else else
say(pick(speak)) say(pick(speak), forced = "poly")
else else
if(!(emote_hear && emote_hear.len) && (emote_see && emote_see.len)) if(!(emote_hear && emote_hear.len) && (emote_see && emote_see.len))
emote("me", 1, pick(emote_see)) emote("me", 1, pick(emote_see))

View File

@@ -9,7 +9,7 @@
H.SetKnockdown(0) H.SetKnockdown(0)
H.adjustStaminaLoss(-75) H.adjustStaminaLoss(-75)
H.stuttering = 0 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-- a_boost--
to_chat(H, "<span class='notice'>There are <B>[a_boost]</B> adrenaline boosts remaining.</span>") to_chat(H, "<span class='notice'>There are <B>[a_boost]</B> adrenaline boosts remaining.</span>")
s_coold = 3 s_coold = 3

View File

@@ -19,7 +19,7 @@
return return
if(!ninjacost(200,N_STEALTH_CANCEL)) if(!ninjacost(200,N_STEALTH_CANCEL))
H.Beam(C,"n_beam",time=15) 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()) var/obj/structure/energy_net/E = new /obj/structure/energy_net(C.drop_location())
E.affecting = C E.affecting = C
E.master = H E.master = H

View File

@@ -100,7 +100,7 @@
/obj/item/paper/contract/infernal/suicide_act(mob/user) /obj/item/paper/contract/infernal/suicide_act(mob/user)
if(signed && (user == target.current) && istype(user, /mob/living/carbon/human/)) if(signed && (user == target.current) && istype(user, /mob/living/carbon/human/))
var/mob/living/carbon/human/H = user 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("<span class='suicide'>[H] holds up a contract claiming [user.p_their()] soul, then immediately catches fire. It looks like [user.p_theyre()] trying to commit suicide!</span>") H.visible_message("<span class='suicide'>[H] holds up a contract claiming [user.p_their()] soul, then immediately catches fire. It looks like [user.p_theyre()] trying to commit suicide!</span>")
H.adjust_fire_stacks(20) H.adjust_fire_stacks(20)
H.IgniteMob() H.IgniteMob()

View File

@@ -21,7 +21,7 @@
SEND_SIGNAL(C, COMSIG_ADD_MOOD_EVENT, "tased", /datum/mood_event/tased) SEND_SIGNAL(C, COMSIG_ADD_MOOD_EVENT, "tased", /datum/mood_event/tased)
SEND_SIGNAL(C, COMSIG_LIVING_MINOR_SHOCK) SEND_SIGNAL(C, COMSIG_LIVING_MINOR_SHOCK)
if(C.dna && C.dna.check_mutation(HULK)) 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)) else if((C.status_flags & CANKNOCKDOWN) && !C.has_trait(TRAIT_STUNIMMUNE))
addtimer(CALLBACK(C, /mob/living/carbon.proc/do_jitter_animation, jitter), 5) addtimer(CALLBACK(C, /mob/living/carbon.proc/do_jitter_animation, jitter), 5)

View File

@@ -169,7 +169,7 @@
hal_target.Knockdown(100) hal_target.Knockdown(100)
hal_target.stuttering += 20 hal_target.stuttering += 20
if(hal_target.dna && hal_target.dna.check_mutation(HULK)) 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)) 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) addtimer(CALLBACK(hal_target, /mob/living/carbon.proc/do_jitter_animation, 20), 5)

View File

@@ -219,7 +219,7 @@
M.stuttering = min(M.stuttering+4, 10) M.stuttering = min(M.stuttering+4, 10)
M.Dizzy(5) M.Dizzy(5)
if(iscultist(M) && prob(20)) 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)) if(prob(10))
M.visible_message("<span class='danger'>[M] starts having a seizure!</span>", "<span class='userdanger'>You have a seizure!</span>") M.visible_message("<span class='danger'>[M] starts having a seizure!</span>", "<span class='userdanger'>You have a seizure!</span>")
M.Unconscious(120) M.Unconscious(120)
@@ -414,7 +414,7 @@
else else
M.visible_message("<b>[M]</b> flexes [M.p_their()] arms.") M.visible_message("<b>[M]</b> flexes [M.p_their()] arms.")
if(prob(10)) 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?'", "Dont 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?'", "Dont 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 return
@@ -1650,7 +1650,7 @@
/datum/reagent/royal_bee_jelly/on_mob_life(mob/living/carbon/M) /datum/reagent/royal_bee_jelly/on_mob_life(mob/living/carbon/M)
if(prob(2)) if(prob(2))
M.say(pick("Bzzz...","BZZ BZZ","Bzzzzzzzzzzz...")) M.say(pick("Bzzz...","BZZ BZZ","Bzzzzzzzzzzz..."), forced = "royal bee jelly")
..() ..()
//Misc reagents //Misc reagents

View File

@@ -147,7 +147,7 @@
if(host_mob.stat == DEAD) if(host_mob.stat == DEAD)
return return
to_chat(host_mob, "<span class='warning'>You feel compelled to speak...</span>") to_chat(host_mob, "<span class='warning'>You feel compelled to speak...</span>")
host_mob.say(sentence) host_mob.say(sentence, forced = "nanite speech")
/datum/nanite_program/triggered/voice /datum/nanite_program/triggered/voice
name = "Skull Echo" name = "Skull Echo"

View File

@@ -237,9 +237,9 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th
switch(invocation_type) switch(invocation_type)
if("shout") if("shout")
if(prob(50))//Auto-mute? Fuck that noise if(prob(50))//Auto-mute? Fuck that noise
user.say(invocation) user.say(invocation, forced = "spell")
else else
user.say(replacetext(invocation," ","`")) user.say(replacetext(invocation," ","`"), forced = "spell")
if("whisper") if("whisper")
if(prob(50)) if(prob(50))
user.whisper(invocation) user.whisper(invocation)

View File

@@ -77,12 +77,12 @@
else else
switch(invocation_type) switch(invocation_type)
if("shout") if("shout")
user.say("[invocation] [uppertext(chosenarea.name)]") user.say("[invocation] [uppertext(chosenarea.name)]", forced = "spell")
if(user.gender==MALE) if(user.gender==MALE)
playsound(user.loc, pick('sound/misc/null.ogg','sound/misc/null.ogg'), 100, 1) playsound(user.loc, pick('sound/misc/null.ogg','sound/misc/null.ogg'), 100, 1)
else else
playsound(user.loc, pick('sound/misc/null.ogg','sound/misc/null.ogg'), 100, 1) playsound(user.loc, pick('sound/misc/null.ogg','sound/misc/null.ogg'), 100, 1)
if("whisper") if("whisper")
user.whisper("[invocation] [uppertext(chosenarea.name)]") user.whisper("[invocation] [uppertext(chosenarea.name)]", forced = "spell")
return return

View File

@@ -25,7 +25,7 @@
/obj/item/melee/touch_attack/afterattack(atom/target, mob/user, proximity) /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) playsound(get_turf(user), on_use_sound,50,1)
charges-- charges--
if(charges <= 0) if(charges <= 0)

View File

@@ -374,4 +374,4 @@
. = ..() . = ..()
if(ishuman(thrower)) if(ishuman(thrower))
var/mob/living/carbon/human/H = thrower var/mob/living/carbon/human/H = thrower
H.say("LIGHTNINGBOLT!!") H.say("LIGHTNINGBOLT!!", forced = "spell")