Files
Aurora.3/code/modules/mob/living/autohiss.dm
T

184 lines
5.3 KiB
Plaintext

/mob/living/proc/handle_autohiss(message, datum/language/L)
return message // no autohiss at this level
/mob/living/carbon/human/handle_autohiss(message, datum/language/L)
if(!client || client.autohiss_mode == AUTOHISS_OFF) // no need to process if there's no client or they have autohiss off
return message
return species.handle_autohiss(message, L, client.autohiss_mode)
/client
var/autohiss_mode = AUTOHISS_OFF
/client/verb/toggle_autohiss()
set name = "Toggle Auto-Hiss"
set desc = "Toggle automatic hissing as Unathi, r-rolling as Taj, buzzing as Vaurca, or beakmouth-speech as Skrell."
set category = "OOC"
autohiss_mode = (autohiss_mode + 1) % AUTOHISS_NUM
switch(autohiss_mode)
if(AUTOHISS_OFF)
to_chat(src, "Auto-hiss is now OFF.")
if(AUTOHISS_BASIC)
to_chat(src, "Auto-hiss is now BASIC.")
if(AUTOHISS_FULL)
to_chat(src, "Auto-hiss is now FULL.")
else
soft_assert(0, "invalid autohiss value [autohiss_mode]")
autohiss_mode = AUTOHISS_OFF
to_chat(src, "Auto-hiss is now OFF.")
/datum/species
var/has_autohiss = FALSE
var/list/autohiss_basic_map = null
var/list/autohiss_extra_map = null
var/list/autohiss_exempt = null
var/list/autohiss_basic_extend = null
var/list/autohiss_extra_extend = null
var/autohiss_extender = "..."
var/ignore_subsequent = FALSE
/datum/species/unathi
autohiss_basic_map = list(
"s" = list("ss", "sss", "ssss")
)
autohiss_extra_map = list(
"x" = list("ks", "kss", "ksss")
)
autohiss_exempt = list(
LANGUAGE_UNATHI,
LANGUAGE_AZAZIBA
)
/datum/species/tajaran
autohiss_basic_map = list(
"r" = list("rr", "rrr", "rrrr")
)
autohiss_exempt = list(
LANGUAGE_SIIK_MAAS,
LANGUAGE_SIIK_TAJR,
LANGUAGE_SIGN_TAJARA,
LANGUAGE_YA_SSA,
LANGUAGE_DELVAHII
)
/datum/species/skrell
autohiss_basic_map = list(
"s" = list("sch", "ssch")
)
autohiss_extra_map = list(
"x" = list("ksch", "kssch")
)
autohiss_exempt = list(LANGUAGE_SKRELLIAN)
ignore_subsequent = TRUE
/datum/species/bug
autohiss_basic_map = list(
"f" = list("v","vh"),
"ph" = list("v", "vh")
)
autohiss_extra_map = list(
"s" = list("z", "zz", "zzz"),
"ce" = list("z", "zz"),
"ci" = list("z", "zz"),
"v" = list("vv", "vvv")
)
autohiss_exempt = list(LANGUAGE_VAURCA)
/datum/species/bug/type_b
autohiss_basic_map = list(
"f" = list("v","vh"),
"ph" = list("v", "vh")
)
autohiss_extra_map = list(
"s" = list("z", "zz", "zzz"),
"ce" = list("z", "zz"),
"ci" = list("z", "zz"),
"v" = list("vv", "vvv")
)
autohiss_exempt = list(LANGUAGE_VAURCA)
/datum/species/diona
autohiss_basic_extend = list("who","what","when","where","why","how")
autohiss_extra_extend = list("i'm","i","am","this","they","are","they're","their","his","her","their","the","he","she")
autohiss_extender = "..."
autohiss_basic_map = list(
"s" = list("s","ss","sss"),
"z" = list("z","zz","zzz"),
"ee" = list("ee","eee")
)
autohiss_extra_map = list(
"a" = list("a","aa", "aaa"),
"i" = list("i","ii", "iii"),
"o" = list("o","oo", "ooo"),
"u" = list("u","uu", "uuu")
)
autohiss_exempt = list(
LANGUAGE_ROOTSONG
)
/datum/species/proc/handle_autohiss(message, datum/language/lang, mode)
if (!autohiss_basic_map || !autohiss_basic_map.len)
return message
if(autohiss_exempt && (lang.name in autohiss_exempt))
return message
// No reason to auto-hiss in sign-language.
if (lang.flags && (lang.flags & SIGNLANG))
return message
if(autohiss_extender && autohiss_basic_extend)
var/longwords = autohiss_basic_extend.Copy()
if(mode == AUTOHISS_FULL && autohiss_extra_extend)
longwords |= autohiss_extra_extend
var/list/returninglist = list()
for(var/word in text2list(message," ")) // For each word in a message
if (lowertext(word) in longwords)
word += autohiss_extender
returninglist += word
message = returninglist.Join(" ")
if (autohiss_basic_map)
var/map = autohiss_basic_map.Copy()
if(mode == AUTOHISS_FULL && autohiss_extra_map)
map |= autohiss_extra_map
. = list()
while(length(message))
var/min_index = 10000 // if the message is longer than this, the autohiss is the least of your problems
var/min_char = null
for(var/char in map)
var/i = findtext(message, char)
if(!i) // no more of this character anywhere in the string, don't even bother searching next time
map -= char
else if(i < min_index)
min_index = i
min_char = char
if(!min_char) // we didn't find any of the mapping characters
. += message
break
. += copytext(message, 1, min_index)
if(copytext(message, min_index, min_index+1) == uppertext(min_char))
switch(text2ascii(message, min_index+1))
if(65 to 90) // A-Z, uppercase; uppercase R/S followed by another uppercase letter, uppercase the entire replacement string
. += uppertext(pick(map[min_char]))
else
. += capitalize(pick(map[min_char]))
else
. += pick(map[min_char])
if(ignore_subsequent && lowertext(copytext(message, min_index, min_index+1)) == lowertext(copytext(message, min_index+1, min_index+2)))
message = copytext(message, min_index + 2) // If the current letter and the subsequent letter are the same, skip the subsequent letter
else
message = copytext(message, min_index + 1)
return jointext(., "")
#undef AUTOHISS_OFF
#undef AUTOHISS_BASIC
#undef AUTOHISS_FULL
#undef AUTOHISS_NUM