mirror of
https://github.com/yogstation13/Yogstation.git
synced 2025-02-26 09:04:50 +00:00
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.
164 lines
5.4 KiB
Plaintext
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
|