Files
Yogstation/code/datums/saymode.dm
Altoids1 906736997f Refactors how vocal_cords work, fixes say() bugs (#13607)
It's actually kinda complicated at this point, what the particular order of things should be within the say() verb.

Before this change, vocal cords -- any vocal cords, even normal ones, could bypass:
- Space making your voice not go as far
- Items in your inventory that do things when you talk
- Dying when you say something when very crit

So this fixes that. Beyond that, this commit also ensures that succumbing from your final whisper happens consistently, regardless of how you speak, and that on_mob_say() is consistently called for inventory items.
2022-04-09 23:33:43 +01:00

164 lines
5.4 KiB
Plaintext

/datum/saymode
var/key
var/mode
//Return FALSE if you have handled the message. Otherwise, return TRUE and saycode will continue doing saycode things.
//user = whoever said the message
//message = the message
//language = the language.
/datum/saymode/proc/handle_message(mob/living/user, message, datum/language/language)
return TRUE
/datum/saymode/changeling
key = MODE_KEY_CHANGELING
mode = MODE_CHANGELING
/datum/saymode/changeling/handle_message(mob/living/user, message, datum/language/language)
switch(user.lingcheck())
if(LINGHIVE_LINK)
var/msg = span_changeling("<b>[user.mind]:</b> [message]")
for(var/_M in GLOB.player_list)
var/mob/M = _M
if(M in GLOB.dead_mob_list)
var/link = FOLLOW_LINK(M, user)
to_chat(M, "[link] [msg]")
else
switch(M.lingcheck())
if (LINGHIVE_LING)
var/mob/living/L = M
if (!HAS_TRAIT(L, CHANGELING_HIVEMIND_MUTE))
to_chat(M, msg)
if(LINGHIVE_LINK)
to_chat(M, msg)
if(LINGHIVE_OUTSIDER)
if(prob(40))
to_chat(M, span_changeling("We can faintly sense an outsider trying to communicate through the hivemind..."))
if(LINGHIVE_LING)
if (HAS_TRAIT(user, CHANGELING_HIVEMIND_MUTE))
to_chat(user, span_warning("The poison in the air hinders our ability to interact with the hivemind."))
return FALSE
var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
var/msg = span_changeling("<b>[changeling.changelingID]:</b> [message]")
user.log_talk(message, LOG_SAY, tag="changeling [changeling.changelingID]")
for(var/_M in GLOB.player_list)
var/mob/M = _M
if(M in GLOB.dead_mob_list)
var/link = FOLLOW_LINK(M, user)
to_chat(M, "[link] [msg]")
else
switch(M.lingcheck())
if(LINGHIVE_LINK)
to_chat(M, msg)
if(LINGHIVE_LING)
var/mob/living/L = M
if (!HAS_TRAIT(L, CHANGELING_HIVEMIND_MUTE))
to_chat(M, msg)
if(LINGHIVE_OUTSIDER)
if(prob(40))
to_chat(M, span_changeling("We can faintly sense another of our kind trying to communicate through the hivemind..."))
if(LINGHIVE_OUTSIDER)
to_chat(user, span_changeling("Our senses have not evolved enough to be able to communicate this way..."))
return FALSE
/datum/saymode/xeno
key = "a"
mode = MODE_ALIEN
/datum/saymode/xeno/handle_message(mob/living/user, message, datum/language/language)
if(user.hivecheck())
user.alien_talk(message)
return FALSE
/datum/saymode/vocalcords
key = MODE_KEY_VOCALCORDS
mode = MODE_VOCALCORDS
/datum/saymode/vocalcords/handle_message(mob/living/user, message, datum/language/language)
return TRUE //Yogs -- This is handled in a refactored, special-snowflake way someplace else,
// because most of vocalcord code is to resolve commands, which must evade accent code
/datum/saymode/binary //everything that uses .b (silicons, drones, blobbernauts/spores, swarmers)
key = MODE_KEY_BINARY
mode = MODE_BINARY
/datum/saymode/binary/handle_message(mob/living/user, message, datum/language/language)
if(isswarmer(user))
var/mob/living/simple_animal/hostile/swarmer/S = user
S.swarmer_chat(message)
return FALSE
if(isblobmonster(user))
var/mob/living/simple_animal/hostile/blob/B = user
B.blob_chat(message)
return FALSE
if(isdrone(user))
var/mob/living/simple_animal/drone/D = user
D.drone_chat(message)
return FALSE
if(user.binarycheck())
user.robot_talk(message)
return FALSE
return FALSE
/datum/saymode/holopad
key = MODE_KEY_HOLOPAD
mode = MODE_HOLOPAD
/datum/saymode/holopad/handle_message(mob/living/user, message, datum/language/language)
if(isAI(user))
var/mob/living/silicon/ai/AI = user
AI.holopad_talk(message, language)
return FALSE
return TRUE
/datum/saymode/monkey
key = MODE_KEY_MONKEY
mode = MODE_MONKEY
/datum/saymode/monkey/handle_message(mob/living/user, message, datum/language/language)
var/datum/mind = user.mind
if(!mind)
return TRUE
if(is_monkey_leader(mind) || (ismonkey(user) && is_monkey(mind)))
user.log_talk(message, LOG_SAY, tag="monkey")
if(prob(75) && ismonkey(user))
user.visible_message(span_notice("\The [user] chimpers."))
var/msg = "<span class='[is_monkey_leader(mind) ? "monkeylead" : "monkeyhive"]'><b><font size=2>\[[is_monkey_leader(mind) ? "Monkey Leader" : "Monkey"]\]</font> [user]</b>: [message]</span>"
for(var/_M in GLOB.mob_list)
var/mob/M = _M
if(M in GLOB.dead_mob_list)
var/link = FOLLOW_LINK(M, user)
to_chat(M, "[link] [msg]")
if((is_monkey_leader(M.mind) || ismonkey(M)) && (M.mind in SSticker.mode.ape_infectees))
to_chat(M, msg)
return FALSE
/datum/saymode/darkspawn //yogs: darkspawn
key = MODE_KEY_DARKSPAWN
mode = MODE_DARKSPAWN
/datum/saymode/darkspawn/handle_message(mob/living/user, message, datum/language/language)
var/datum/mind = user.mind
if(!mind)
return TRUE
if(is_darkspawn_or_veil(user))
user.log_talk(message, LOG_SAY, tag="darkspawn")
var/msg = span_velvet("<b>\[Mindlink\] [user.real_name]:</b> \"[message]\"")
for(var/mob/M in GLOB.player_list)
if(M in GLOB.dead_mob_list)
var/link = FOLLOW_LINK(M, user)
to_chat(M, "[link] [msg]")
else if(is_darkspawn_or_veil(M))
var/turf/receiver = get_turf(M)
var/turf/sender = get_turf(user)
if(receiver.z != sender.z)
if(prob(25))
to_chat(M, span_warning("Your mindlink trembles with words, but they are too far to make out..."))
continue
to_chat(M, msg)
return FALSE //yogs end