/mob/verb/say_verb(message as text)
set name = "Say"
set category = "IC"
if(say_disabled)
to_chat(usr, "Speech is currently admin-disabled.")
return
usr.say(message)
remove_typing_indicator()
/mob/verb/whisper(message as text)
set name = "Whisper"
set category = "IC"
return
/*
/mob/proc/whisper(var/message, var/unheard=" whispers something", var/heard="whispers,", var/apply_filters=1, var/allow_lastwords=1)
return
*/
/mob/verb/me_verb(message as text)
set name = "Me"
set category = "IC"
if(say_disabled) //This is here to try to identify lag problems
to_chat(usr, "Speech is currently admin-disabled.")
remove_typing_indicator()
return
if(!usr.stat && (usr.status_flags & FAKEDEATH))
to_chat(usr, "Doing this will give us away!")
remove_typing_indicator()
return
message = html_encode(sanitize_speech(message))
if(usr.stat == DEAD)
usr.emote_dead(message)
else if(message)
usr.emote("me",usr.emote_type,message)
remove_typing_indicator()
/datum/deadchat_listener //This datum allows you to read the currently funky deadchat. Simply make a child, instantiate an instance, and add functions to add/remove it from the global_deadchat_listeners.
var/name = "default"
/datum/deadchat_listener/proc/deadchat_event(var/ckey, var/message)
return
var/list/global_deadchat_listeners = list()
/mob/proc/say_dead(var/message)
var/name = src.real_name
var/alt_name = ""
if(say_disabled) //This is here to try to identify lag problems
to_chat(usr, "Speech is currently admin-disabled.")
return
if(client && !(client.prefs.get_pref(/datum/preference_setting/binary_flag/toggles) & CHAT_DEAD))
to_chat(usr, "You have deadchat muted.")
return
if(mind && mind.name)
name = "[mind.name]"
else
name = real_name
if(name != real_name)
alt_name = " (died as [real_name])"
var/ckey = "[key_name(src)]"
for(var/datum/deadchat_listener/listener in global_deadchat_listeners)
listener.deadchat_event(ckey,message)
message = src.say_quote("\"[html_encode(message)]\"")
var/location_text = get_coordinates_string(src)
log_say("[name]/[key_name(src)] (@[location_text]) Deadsay: [message]")
for(var/mob/M in get_deadchat_hearers())
to_chat(M, "[formatFollow(src)] [name][alt_name] [message]")
/mob/proc/get_ear()
// returns an atom representing a location on the map from which this
// mob can hear things
// should be overloaded for all mobs whose "ear" is separate from their "mob"
return get_turf(src)
/mob/proc/lingcheck()
return 0
/mob/proc/cult_chat_check(var/setting)
return 0
/mob/proc/hivecheck()
return 0
/mob/proc/binarycheck()
return 0
//parses the language code (e.g. :j) from text, such as that supplied to say.
//returns the language object only if the code corresponds to a language that src can speak, otherwise null.
/mob/proc/parse_language(var/message)
if(length(message) >= 2)
var/language_prefix = lowertext(copytext(message, 1 ,3))
if(language_prefix in language_keys)
var/datum/language/L = language_keys[language_prefix]
if (can_speak_lang(L))
return L
else
if(istype(L))
say_testing(src, "Tried to speak [L.name] but don't know it, prefix length is [length(language_prefix)] before [message] after [copytext(message, 1+length(language_prefix))]")
return language_prefix
return null
/mob/say_understands(var/mob/other,var/datum/language/speaking = null)
if (src.stat == 2) //Dead
return 1
//Universal speak makes everything understandable, for obvious reasons.
if(src.universal_speak || src.universal_understand)
return 1
//Languages are handled after.
if (!speaking)
if(other)
other = other.GetSource()
if(!other || !ismob(other))
return 1
if(other.universal_speak)
return 1
if(isAI(src) && ispAI(other))
return 1
if (istype(other, src.type) || istype(src, other.type))
return 1
return 0
//Language check.
for(var/datum/language/L in src.languages)
if(speaking.name == L.name)
return 1
return 0
/mob/proc/can_read()
if(stat == DEAD || universal_understand)
return TRUE
return FALSE
/mob/proc/forcesay(list/append)
if(stat == CONSCIOUS)
if(client)
var/virgin = 1 //has the text been modified yet?
var/temp = winget(client, "input", "text")
if(findtext(temp, "Say \"", 1, 7) && length(temp) > 5) //NOT case sensitive, because both "say" and "Say" can happen
temp = replacetext(temp, ";", "") //general radio
if(findtext(trim_left(temp), ":", 6, 7)) //dept radio
temp = copytext(trim_left(temp), 8)
virgin = 0
if(virgin)
temp = copytext(trim_left(temp), 6) //normal speech
virgin = 0
while(findtext(trim_left(temp), ":", 1, 2)) //dept radio again (necessary)
temp = copytext(trim_left(temp), 3)
if(findtext(temp, "*", 1, 2)) //emotes
return
var/trimmed = trim_left(temp)
if(length(trimmed))
if(append)
temp += pick(append)
say(temp)
winset(client, "input", "text=[null]")