Fixed merge conflicts and errors, everything seems to work

This commit is contained in:
ShadowLarkens
2020-04-23 18:25:25 -07:00
parent 5d41534ab8
commit 1d655268a4
17 changed files with 77 additions and 587 deletions
@@ -741,11 +741,7 @@
twitch_v, vomit, whimper, wink, yawn. Prometheans: squish Synthetics: beep, buzz, dwoop, yes, no, rcough, rsneeze, ping. Skrell: warble</span>")
else
<<<<<<< HEAD
to_chat(src, "<font color='blue'>Unusable emote '[act]'. Say *help or *vhelp for a list.</font>") //VOREStation Edit, mention *vhelp for Virgo-specific emotes located in emote_vr.dm.
=======
to_chat(src, "<span class='filter_say'><font color='blue'>Unusable emote '[act]'. Say *help for a list.</font></span>")
>>>>>>> 54a8a58... Saycode Overhaul -- Multilingualism (#6956)
to_chat(src, "<span class='filter_say'><font color='blue'>Unusable emote '[act]'. Say *help or *vhelp for a list.</font></span>") //VOREStation Edit, mention *vhelp for Virgo-specific emotes located in emote_vr.dm.
if(message)
custom_emote(m_type,message)
@@ -2,12 +2,7 @@
if(name != GetVoice())
return " (as [get_id_name("Unknown")])"
<<<<<<< HEAD
message = sanitize_or_reflect(message,src) //VOREStation Edit - Reflect too-long messages, within reason
..(message, alt_name = alt_name, whispering = whispering)
=======
return ..()
>>>>>>> 54a8a58... Saycode Overhaul -- Multilingualism (#6956)
/mob/living/carbon/human/proc/forcesay(list/append)
if(stat == CONSCIOUS)
@@ -61,21 +56,6 @@
if(!speaking)
if(istype(other, /mob/living/carbon/alien/diona))
if(other.languages.len >= 2) //They've sucked down some blood and can speak common now.
<<<<<<< HEAD
return 1
if (istype(other, /mob/living/silicon))
return 1
if (istype(other, /mob/living/carbon/brain))
return 1
if (istype(other, /mob/living/simple_mob/slime))
return 1
//This is already covered by mob/say_understands()
//if (istype(other, /mob/living/simple_mob))
// if((other.universal_speak && !speaking) || src.universal_speak || src.universal_understand)
// return 1
// return 0
=======
return TRUE
if(issilicon(other))
return TRUE
@@ -83,7 +63,6 @@
return TRUE
if(isslime(other))
return TRUE
>>>>>>> 54a8a58... Saycode Overhaul -- Multilingualism (#6956)
return ..()
+6 -36
View File
@@ -86,29 +86,6 @@ proc/get_radio_key_from_channel(var/channel)
var/whispering = message_data[3]
. = 0
<<<<<<< HEAD
if((HULK in mutations) && health >= 25 && length(message))
message = "[uppertext(message)]!!!"
verb = pick("yells","roars","hollers")
whispering = 0
. = 1
if(slurring)
message = slur(message)
verb = pick("slobbers","slurs")
. = 1
if(stuttering)
message = stutter(message)
verb = pick("stammers","stutters")
. = 1
//VOREStation Edit Start
if(muffled)
verb = pick("muffles")
whispering = 1
. = 1
//VOREStation Edit End
message_data[1] = message
=======
// Technically this rerolls the verb for as many say pieces as there are. _shrug_
for(var/datum/multilingual_say_piece/S in message_pieces)
if(S.speaking && (S.speaking.flags & NO_STUTTER || S.speaking.flags & SIGNLANG))
@@ -127,9 +104,14 @@ proc/get_radio_key_from_channel(var/channel)
S.message = stutter(S.message)
verb = pick("stammers","stutters")
. = 1
//VOREStation Edit Start
if(muffled)
verb = pick("muffles")
whispering = 1
. = 1
//VOREStation Edit End
message_data[1] = message_pieces
>>>>>>> 54a8a58... Saycode Overhaul -- Multilingualism (#6956)
message_data[2] = verb
message_data[3] = whispering
@@ -282,7 +264,6 @@ proc/get_radio_key_from_channel(var/channel)
message_range = 1
sound_vol *= 0.5
<<<<<<< HEAD
//VOREStation edit - allows for custom say verbs, overriding all other say-verb types- e.g. "says loudly" instead of "shouts"
//You'll still stammer if injured or slur if drunk, but it won't have those specific words
var/ending = copytext(message, length(message))
@@ -297,22 +278,11 @@ proc/get_radio_key_from_channel(var/channel)
verb = "[custom_say]"
//VOREStation edit ends
//Handle nonverbal and sign languages here
if (speaking)
if (speaking.flags & SIGNLANG)
log_say("(SIGN) [message]", src)
return say_signlang(message, pick(speaking.signlang_verb), speaking)
if (speaking.flags & NONVERBAL)
if (prob(30))
src.custom_emote(1, "[pick(speaking.signlang_verb)].")
=======
//Handle nonverbal languages here
for(var/datum/multilingual_say_piece/S in message_pieces)
if(S.speaking.flags & NONVERBAL)
if(prob(30))
custom_emote(1, "[pick(S.speaking.signlang_verb)].")
>>>>>>> 54a8a58... Saycode Overhaul -- Multilingualism (#6956)
//These will contain the main receivers of the message
var/list/listening = list()
+2 -12
View File
@@ -120,13 +120,8 @@
m_type = 1
if("law")
<<<<<<< HEAD
if (istype(module,/obj/item/weapon/robot_module/robot/security) || istype(module,/obj/item/weapon/robot_module/robot/knine)) //VOREStation Add - K9
message = "shows its legal authorization barcode."
=======
if(istype(module,/obj/item/weapon/robot_module/robot/security))
if(istype(module,/obj/item/weapon/robot_module/robot/security) || istype(module,/obj/item/weapon/robot_module/robot/knine)) //VOREStation Add - K9
message = "<b>[src]</b> shows its legal authorization barcode."
>>>>>>> 54a8a58... Saycode Overhaul -- Multilingualism (#6956)
playsound(src.loc, 'sound/voice/biamthelaw.ogg', 50, 0)
m_type = 2
@@ -134,13 +129,8 @@
to_chat(src, "You are not THE LAW, pal.")
if("halt")
<<<<<<< HEAD
if (istype(module,/obj/item/weapon/robot_module/robot/security) || istype(module,/obj/item/weapon/robot_module/robot/knine)) //VOREStation Add - K9
message = "<B>'s</B> speakers skreech, \"Halt! Security!\"."
=======
if(istype(module,/obj/item/weapon/robot_module/robot/security))
if(istype(module,/obj/item/weapon/robot_module/robot/security) || istype(module,/obj/item/weapon/robot_module/robot/knine)) //VOREStation Add - K9
message = "<b>[src]</b> <B>'s</B> speakers skreech, \"Halt! Security!\"."
>>>>>>> 54a8a58... Saycode Overhaul -- Multilingualism (#6956)
playsound(src.loc, 'sound/voice/halt.ogg', 50, 0)
m_type = 2
-17
View File
@@ -61,23 +61,6 @@
var/obj/machinery/hologram/holopad/T = src.holo
if(T && T.masters[src])//If there is a hologram and its master is the user.
<<<<<<< HEAD
//Human-like, sorta, heard by those who understand humans.
var/rendered_a
//Speech distorted, heard by those who do not understand AIs.
var/message_stars = stars(message)
var/rendered_b
if(speaking)
rendered_a = "<span class='game say'><span class='name'>[name]</span> [speaking.format_message(message, verb)]</span>"
rendered_b = "<span class='game say'><span class='name'>[voice_name]</span> [speaking.format_message(message_stars, verb)]</span>"
to_chat(src, "<i><span class='game say'>Holopad transmitted, <span class='name'>[real_name]</span> [speaking.format_message(message, verb)]</span></i>") //The AI can "hear" its own message.
else
rendered_a = "<span class='game say'><span class='name'>[name]</span> [verb], <span class='message'>\"[message]\"</span></span>"
rendered_b = "<span class='game say'><span class='name'>[voice_name]</span> [verb], <span class='message'>\"[message_stars]\"</span></span>"
to_chat(src, "<i><span class='game say'>Holopad transmitted, <span class='name'>[real_name]</span> [verb], <span class='message'><span class='body'>\"[message]\"</span></span></span></i>") //The AI can "hear" its own message.
=======
>>>>>>> 54a8a58... Saycode Overhaul -- Multilingualism (#6956)
var/list/listeners = get_mobs_and_objs_in_view_fast(get_turf(T), world.view)
var/list/listening = listeners["mobs"]
var/list/listening_obj = listeners["objs"]
@@ -1,4 +1,3 @@
<<<<<<< HEAD
// Parrots can talk, and may repeat things it hears.
/mob/living/simple_mob/animal/passive/bird/parrot
name = "parrot"
@@ -42,11 +41,11 @@
return say(message)
// Ugly saycode so parrots can use their headsets.
/mob/living/simple_mob/animal/passive/bird/parrot/handle_message_mode(message_mode, message, verb, speaking, used_radios, alt_name)
/mob/living/simple_mob/animal/passive/bird/parrot/handle_message_mode(message_mode, message, verb, used_radios)
..()
if(message_mode)
if(my_headset && istype(my_headset, /obj/item/device/radio))
my_headset.talk_into(src, message, message_mode, verb, speaking)
my_headset.talk_into(src, message, message_mode, verb)
used_radios += my_headset
// Clicked on while holding an object.
@@ -250,257 +249,4 @@
if(holder.stat || !holder.say_list || !message || speaker == holder)
return
var/datum/say_list/S = holder.say_list
=======
// Parrots can talk, and may repeat things it hears.
/mob/living/simple_mob/animal/passive/bird/parrot
name = "parrot"
description_info = "You can give it a headset by clicking on it with a headset. \
To remove it, click the bird while on grab intent."
has_langs = list("Galactic Common", "Bird")
ai_holder_type = /datum/ai_holder/simple_mob/passive/parrot
// A headset, so that talking parrots can yell at the crew over comms.
// If set to a type, on initialize it will be instantiated into that type.
var/obj/item/device/radio/headset/my_headset = null
// Say list
/datum/say_list/bird/poly
speak = list(
"Poly wanna cracker!",
"Check the singulo, you chucklefucks!",
"Wire the solars, you lazy bums!",
"WHO TOOK THE DAMN HARDSUITS?",
"OH GOD ITS FREE CALL THE SHUTTLE",
"Danger! Crystal hyperstructure instability!",
"CRYSTAL DELAMINATION IMMINENT.",
"Tweet tweet, I'm a Teshari.",
"Chitters.",
"Meteors have been detected on a collision course with the station!"
)
// Lets the AI use headsets.
// Player-controlled parrots will need to do it manually.
/mob/living/simple_mob/animal/passive/bird/parrot/ISay(message)
if(my_headset && prob(50))
var/list/keys = list()
for(var/channel in my_headset.channels)
var/key = get_radio_key_from_channel(channel)
if(key)
keys += key
if(keys.len)
var/key_used = pick(keys)
return say("[key_used] [message]")
return say(message)
// Ugly saycode so parrots can use their headsets.
/mob/living/simple_mob/animal/passive/bird/parrot/handle_message_mode(message_mode, message, verb, speaking, used_radios)
..()
if(message_mode)
if(my_headset && istype(my_headset, /obj/item/device/radio))
my_headset.talk_into(src, message, message_mode, verb, speaking)
used_radios += my_headset
// Clicked on while holding an object.
/mob/living/simple_mob/animal/passive/bird/parrot/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/device/radio/headset))
give_headset(I, user)
return
return ..()
// Clicked on by empty hand.
/mob/living/simple_mob/animal/passive/bird/parrot/attack_hand(mob/living/L)
if(L.a_intent == I_GRAB && my_headset)
remove_headset(L)
else
..()
/mob/living/simple_mob/animal/passive/bird/parrot/proc/give_headset(obj/item/device/radio/headset/new_headset, mob/living/user)
if(!istype(new_headset))
to_chat(user, span("warning", "\The [new_headset] isn't a headset."))
return
if(my_headset)
to_chat(user, span("warning", "\The [src] is already wearing \a [my_headset]."))
return
else
user.drop_item(new_headset)
my_headset = new_headset
new_headset.forceMove(src)
to_chat(user, span("warning", "You place \a [new_headset] on \the [src]. You monster."))
to_chat(src, span("notice", "\The [user] gives you \a [new_headset]. You should put it to good use immediately."))
return
/mob/living/simple_mob/animal/passive/bird/parrot/proc/remove_headset(mob/living/user)
if(!my_headset)
to_chat(user, "<span class='warning'>\The [src] doesn't have a headset to remove, thankfully.</span>")
else
ISay("BAWWWWWK LEAVE THE HEADSET BAWKKKKK!")
my_headset.forceMove(get_turf(src))
user.put_in_hands(my_headset)
to_chat(user, span("notice", "You take away \the [src]'s [my_headset.name]. Finally."))
to_chat(src, span("warning", "\The [user] takes your [my_headset.name] away! How cruel!"))
my_headset = null
/mob/living/simple_mob/animal/passive/bird/parrot/examine(mob/user)
..()
if(my_headset)
to_chat(user, "It is wearing \a [my_headset].")
/mob/living/simple_mob/animal/passive/bird/parrot/Initialize()
if(my_headset)
my_headset = new my_headset(src)
return ..()
// Subtypes.
// Best Bird
/mob/living/simple_mob/animal/passive/bird/parrot/poly
name = "Poly"
desc = "It's a parrot. An expert on quantum cracker theory."
icon_state = "poly"
icon_rest = "poly-held"
icon_dead = "poly-dead"
tt_desc = "E Ara macao"
my_headset = /obj/item/device/radio/headset/headset_eng
say_list_type = /datum/say_list/bird/poly
// Best Bird with best headset.
/mob/living/simple_mob/animal/passive/bird/parrot/poly/ultimate
my_headset = /obj/item/device/radio/headset/omni
/mob/living/simple_mob/animal/passive/bird/parrot/kea
name = "kea"
desc = "A species of parrot. On Earth, they are unique among other parrots for residing in alpine climates. \
They are known to be intelligent and curious, which has made some consider them a pest."
icon_state = "kea"
icon_rest = "kea-held"
icon_dead = "kea-dead"
tt_desc = "E Nestor notabilis"
/mob/living/simple_mob/animal/passive/bird/parrot/eclectus
name = "eclectus"
desc = "A species of parrot, this species features extreme sexual dimorphism in their plumage's colors. \
A male eclectus has emerald green plumage, where as a female eclectus has red and purple plumage."
icon_state = "eclectus"
icon_rest = "eclectus-held"
icon_dead = "eclectus-dead"
tt_desc = "E Eclectus roratus"
/mob/living/simple_mob/animal/passive/bird/parrot/eclectus/Initialize()
gender = pick(MALE, FEMALE)
if(gender == FEMALE)
icon_state = "eclectusf"
icon_rest = "eclectusf-held"
icon_dead = "eclectusf-dead"
return ..()
/mob/living/simple_mob/animal/passive/bird/parrot/grey_parrot
name = "grey parrot"
desc = "A species of parrot. This one is predominantly grey, but has red tail feathers."
icon_state = "agrey"
icon_rest = "agrey-held"
icon_dead = "agrey-dead"
tt_desc = "E Psittacus erithacus"
/mob/living/simple_mob/animal/passive/bird/parrot/black_headed_caique
name = "black-headed caique"
desc = "A species of parrot, these birds have a distinct black color on their heads, distinguishing them from their relative Caiques."
icon_state = "bcaique"
icon_rest = "bcaique-held"
icon_dead = "bcaique-dead"
tt_desc = "E Pionites melanocephalus"
/mob/living/simple_mob/animal/passive/bird/parrot/white_caique
name = "white-bellied caique"
desc = "A species of parrot, they are also known as the Green-Thighed Parrot."
icon_state = "wcaique"
icon_rest = "wcaique-held"
icon_dead = "wcaique-dead"
tt_desc = "E Pionites leucogaster"
/mob/living/simple_mob/animal/passive/bird/parrot/budgerigar
name = "budgerigar"
desc = "A species of parrot, they are also known as the common parakeet, or in some circles, the budgie. \
This one is has its natural colors of green and yellow."
icon_state = "gbudge"
icon_rest = "gbudge-held"
icon_dead = "gbudge-dead"
tt_desc = "E Melopsittacus undulatus"
/mob/living/simple_mob/animal/passive/bird/parrot/budgerigar/blue
icon_state = "bbudge"
icon_rest = "bbudge-held"
icon_dead = "bbudge-dead"
desc = "A species of parrot, they are also known as the common parakeet, or in some circles, the budgie. \
This one has a mutation which altered its color to be blue instead of green and yellow."
/mob/living/simple_mob/animal/passive/bird/parrot/budgerigar/bluegreen
icon_state = "bgbudge"
icon_rest = "bgbudge-held"
icon_dead = "bgbudge-dead"
desc = "A species of parrot, they are also known as the common parakeet, or in some circles, the budgie. \
This one has a mutation which altered its color to be a mix of blue and green."
/mob/living/simple_mob/animal/passive/bird/parrot/cockatiel
name = "cockatiel"
desc = "A species of parrot. This one has a highly visible crest."
icon_state = "tiel"
icon_rest = "tiel-held"
icon_dead = "tiel-dead"
tt_desc = "E Nymphicus hollandicus"
/mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/white
icon_state = "wtiel"
icon_rest = "wtiel-held"
icon_dead = "wtiel-dead"
/mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/yellowish
icon_state = "luttiel"
icon_rest = "luttiel-held"
icon_dead = "luttiel-dead"
/mob/living/simple_mob/animal/passive/bird/parrot/cockatiel/grey
icon_state = "blutiel" // idk why this is blu.
icon_rest = "blutiel-held"
icon_dead = "blutiel-dead"
// This actually might be the yellow-crested cockatoo but idk.
/mob/living/simple_mob/animal/passive/bird/parrot/sulphur_cockatoo
name = "sulphur-crested cockatoo"
desc = "A species of parrot. This one has an expressive yellow crest. Their underwing and tail feathers are also yellow."
icon_state = "too"
icon_rest = "too-held"
icon_dead = "too-dead"
tt_desc = "E Cacatua galerita"
// This was originally called 'hooded_too', which might not mean the unbrella cockatoo but idk.
/mob/living/simple_mob/animal/passive/bird/parrot/white_cockatoo
name = "white cockatoo"
desc = "A species of parrot. This one is also known as the Umbrella Cockatoo, due to the semicircular shape of its crest."
icon_state = "utoo"
icon_rest = "utoo-held"
icon_dead = "utoo-dead"
tt_desc = "E Cacatua alba"
/mob/living/simple_mob/animal/passive/bird/parrot/pink_cockatoo
name = "pink cockatoo"
desc = "A species of parrot. This one is also known as Major Mitchell's cockatoo, \
in honor of a human surveyor and explorer who existed before humans fully explored their home planet."
icon_state = "mtoo"
icon_rest = "mtoo-held"
icon_dead = "mtoo-dead"
tt_desc = "E Lophochroa leadbeateri"
// AI
/datum/ai_holder/simple_mob/passive/parrot
speak_chance = 2
base_wander_delay = 8
/datum/ai_holder/simple_mob/passive/parrot/on_hear_say(mob/living/speaker, message)
if(holder.stat || !holder.say_list || !message || speaker == holder)
return
var/datum/say_list/S = holder.say_list
>>>>>>> 54a8a58... Saycode Overhaul -- Multilingualism (#6956)
S.speak |= message
+1 -1
View File
@@ -605,7 +605,7 @@
return ready && ..()
// Prevents lobby players from seeing say, even with ghostears
/mob/new_player/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/italics = 0, var/mob/speaker = null)
/mob/new_player/hear_say(var/list/message_pieces, var/verb = "says", var/italics = 0, var/mob/speaker = null)
return
// Prevents lobby players from seeing emotes, even with ghosteyes
+1
View File
@@ -12,6 +12,7 @@
set category = "IC"
set_typing_indicator(FALSE)
message = sanitize_or_reflect(message, src) //VOREStation Edit - Reflect too-long messages, within reason
usr.say(message)
/mob/verb/me_verb(message as text)
+2 -2
View File
@@ -41,12 +41,12 @@
return owner.examine(user, distance, infix, suffix)
// Relay some stuff they hear
/mob/zshadow/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol)
/mob/zshadow/hear_say(var/list/message_pieces, var/verb = "says", var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol)
if(speaker && speaker.z != src.z)
return // Only relay speech on our acutal z, otherwise we might relay sounds that were themselves relayed up!
if(isliving(owner))
verb += " from above"
return owner.hear_say(message, verb, language, italics, speaker, speech_sound, sound_vol)
return owner.hear_say(message_pieces, verb, italics, speaker, speech_sound, sound_vol)
/mob/zshadow/proc/sync_icon(var/mob/M)
name = M.name
+7 -14
View File
@@ -58,17 +58,18 @@
nif.save_data["commlink_name"] = owner
//So that only the owner's chat is relayed to others.
/obj/item/device/communicator/commlink/hear_talk(mob/living/M, text, verb, datum/language/speaking)
if(M != nif.human) return
for(var/obj/item/device/communicator/comm in communicating)
/obj/item/device/communicator/commlink/hear_talk(mob/living/M, list/message_pieces, verb)
if(M != nif.human)
return
for(var/obj/item/device/communicator/comm in communicating)
var/turf/T = get_turf(comm)
if(!T) return
var/icon_object = src
var/list/mobs_to_relay
if(istype(comm,/obj/item/device/communicator/commlink))
if(istype(comm, /obj/item/device/communicator/commlink))
var/obj/item/device/communicator/commlink/CL = comm
mobs_to_relay = list(CL.nif.human)
icon_object = CL.nif.big_icon
@@ -77,18 +78,10 @@
mobs_to_relay = in_range["mobs"]
for(var/mob/mob in mobs_to_relay)
//Can whoever is hearing us understand?
if(!mob.say_understands(M, speaking))
if(speaking)
text = speaking.scramble(text)
else
text = stars(text)
var/message = mob.combine_message(message_pieces, verb, M)
var/name_used = M.GetVoice()
var/rendered = null
if(speaking) //Language being used
rendered = "<span class='game say'>[bicon(icon_object)] <span class='name'>[name_used]</span> [speaking.format_message(text, verb)]</span>"
else
rendered = "<span class='game say'>[bicon(icon_object)] <span class='name'>[name_used]</span> [verb], <span class='message'>\"[text]\"</span></span>"
rendered = "<span class='game say'>[bicon(icon_object)] <span class='name'>[name_used]</span> [message]</span>"
mob.show_message(rendered, 2)
//Not supported by the internal one
-4
View File
@@ -472,10 +472,6 @@
var/obj/item/weapon/grab/G = W
if(!ismob(G.affecting))
return
for(var/mob/living/carbon/slime/M in range(1, G.affecting))
if(M.Victim == G.affecting)
to_chat(usr, "[G.affecting:name] will not fit into the [src.name] because they have a slime latched onto their head.")
return
var/mob/M = G.affecting
if(put_mob(M))
qdel(G)
@@ -253,7 +253,7 @@ datum/signal
newsign.data["realname"] = newsign.data["name"]
newsign.data["job"] = job
newsign.data["compression"] = 0
newsign.data["message"] = message
newsign.data["message"] = message_to_multilingual(message)
newsign.data["type"] = 2 // artificial broadcast
if(!isnum(freq))
freq = text2num(freq)
@@ -264,7 +264,7 @@ datum/signal
newsign.data["radio"] = hradio
newsign.data["vmessage"] = message
newsign.data["vmessage"] = message_to_multilingual(message)
newsign.data["vname"] = source
newsign.data["vmask"] = 0
newsign.data["level"] = list()
+3 -19
View File
@@ -112,27 +112,11 @@ Divergence proc, used in mutation to make unique datums.
/mob/living/simple_mob/xeno/proc/RandomizeTraits()
return
<<<<<<< HEAD
/mob/living/simple_mob/xeno/hear_say(var/message, var/verb = "says", var/datum/language/language, var/alt_name = "",var/italics = 0, var/mob/speaker = null)
=======
/mob/living/simple_animal/xeno/hear_say(var/message, var/verb = "says", var/datum/language/language, var/italics = 0, var/mob/speaker = null)
>>>>>>> 54a8a58... Saycode Overhaul -- Multilingualism (#6956)
/mob/living/simple_mob/xeno/hear_say(var/list/message_pieces, var/verb = "says", var/italics = 0, var/mob/speaker = null)
if(traitdat.traits[TRAIT_XENO_CANLEARN])
/*
Until this gets sorted out to a functioning point, or waiting on Psi's saycode update.
var/learned_message = say_understands(speaker, language)
if(!message || isxeno(speaker))
return
if(learned_message) //Is it understood?
var/complete_message = ",[language.key] [message]"
if(!(complete_message in speak))
speech_buffer.Add(complete_message)
log_debug("Added '[complete_message]'.")
else
*/
if(!(message in speak))
speech_buffer.Add(message)
..(message,verb,language,italics,speaker)
speech_buffer.Add(multilingual_to_message(message_pieces))
. = ..()
/mob/living/simple_mob/xeno/proc/ProcessSpeechBuffer()
if(speech_buffer.len)