diff --git a/baystation12.dme b/baystation12.dme
index 0c2a7bef0b..a8ceac79f0 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -1029,7 +1029,6 @@
#include "code\modules\mob\hear_say.dm"
#include "code\modules\mob\holder.dm"
#include "code\modules\mob\inventory.dm"
-#include "code\modules\mob\language.dm"
#include "code\modules\mob\login.dm"
#include "code\modules\mob\logout.dm"
#include "code\modules\mob\mob.dm"
@@ -1047,6 +1046,11 @@
#include "code\modules\mob\dead\observer\logout.dm"
#include "code\modules\mob\dead\observer\observer.dm"
#include "code\modules\mob\dead\observer\say.dm"
+#include "code\modules\mob\language\generic.dm"
+#include "code\modules\mob\language\language.dm"
+#include "code\modules\mob\language\outsider.dm"
+#include "code\modules\mob\language\station.dm"
+#include "code\modules\mob\language\synthetic.dm"
#include "code\modules\mob\living\damage_procs.dm"
#include "code\modules\mob\living\living.dm"
#include "code\modules\mob\living\living_defense.dm"
diff --git a/code/modules/mob/language/generic.dm b/code/modules/mob/language/generic.dm
new file mode 100644
index 0000000000..d93edf3ac2
--- /dev/null
+++ b/code/modules/mob/language/generic.dm
@@ -0,0 +1,64 @@
+// Noise "language", for audible emotes.
+/datum/language/noise
+ name = "Noise"
+ desc = "Noises"
+ key = ""
+ flags = RESTRICTED|NONGLOBAL|INNATE|NO_TALK_MSG|NO_STUTTER
+
+/datum/language/noise/format_message(message, verb)
+ return "[message]"
+
+/datum/language/noise/format_message_plain(message, verb)
+ return message
+
+/datum/language/noise/format_message_radio(message, verb)
+ return "[message]"
+
+/datum/language/noise/get_talkinto_msg_range(message)
+ // if you make a loud noise (screams etc), you'll be heard from 4 tiles over instead of two
+ return (copytext(message, length(message)) == "!") ? 4 : 2
+
+// 'basic' language; spoken by default.
+/datum/language/common
+ name = "Galactic Common"
+ desc = "The common galactic tongue."
+ speech_verb = "says"
+ whisper_verb = "whispers"
+ key = "0"
+ flags = RESTRICTED
+ syllables = list("blah","blah","blah","bleh","meh","neh","nah","wah")
+
+//TODO flag certain languages to use the mob-type specific say_quote and then get rid of these.
+/datum/language/common/get_spoken_verb(var/msg_end)
+ switch(msg_end)
+ if("!")
+ return pick("exclaims","shouts","yells") //TODO: make the basic proc handle lists of verbs.
+ if("?")
+ return ask_verb
+ return speech_verb
+
+// Galactic common languages (systemwide accepted standards).
+/datum/language/trader
+ name = "Tradeband"
+ desc = "Maintained by the various trading cartels in major systems, this elegant, structured language is used for bartering and bargaining."
+ speech_verb = "enunciates"
+ colour = "say_quote"
+ key = "2"
+ space_chance = 100
+ syllables = list("lorem", "ipsum", "dolor", "sit", "amet", "consectetur", "adipiscing", "elit",
+ "sed", "do", "eiusmod", "tempor", "incididunt", "ut", "labore", "et", "dolore",
+ "magna", "aliqua", "ut", "enim", "ad", "minim", "veniam", "quis", "nostrud",
+ "exercitation", "ullamco", "laboris", "nisi", "ut", "aliquip", "ex", "ea", "commodo",
+ "consequat", "duis", "aute", "irure", "dolor", "in", "reprehenderit", "in",
+ "voluptate", "velit", "esse", "cillum", "dolore", "eu", "fugiat", "nulla",
+ "pariatur", "excepteur", "sint", "occaecat", "cupidatat", "non", "proident", "sunt",
+ "in", "culpa", "qui", "officia", "deserunt", "mollit", "anim", "id", "est", "laborum")
+
+// Criminal language.
+/datum/language/gutter
+ name = "Gutter"
+ desc = "Much like Standard, this crude pidgin tongue descended from numerous languages and serves as Tradeband for criminal elements."
+ speech_verb = "growls"
+ colour = "rough"
+ key = "3"
+ syllables = list ("gra","ba","ba","breh","bra","rah","dur","ra","ro","gro","go","ber","bar","geh","heh", "gra")
diff --git a/code/modules/mob/language/language.dm b/code/modules/mob/language/language.dm
index e6b4f5c0b0..d2cb8a82ab 100644
--- a/code/modules/mob/language/language.dm
+++ b/code/modules/mob/language/language.dm
@@ -82,7 +82,6 @@
if(scramble_cache.len > SCRAMBLE_CACHE_LEN)
scramble_cache.Cut(1, scramble_cache.len-SCRAMBLE_CACHE_LEN-1)
-
return scrambled_text
/datum/language/proc/format_message(message, verb)
@@ -119,312 +118,6 @@
return ask_verb
return speech_verb
-// Noise "language", for audible emotes.
-/datum/language/noise
- name = "Noise"
- desc = "Noises"
- key = ""
- flags = RESTRICTED|NONGLOBAL|INNATE|NO_TALK_MSG|NO_STUTTER
-
-/datum/language/noise/format_message(message, verb)
- return "[message]"
-
-/datum/language/noise/format_message_plain(message, verb)
- return message
-
-/datum/language/noise/format_message_radio(message, verb)
- return "[message]"
-
-/datum/language/noise/get_talkinto_msg_range(message)
- // if you make a loud noise (screams etc), you'll be heard from 4 tiles over instead of two
- return (copytext(message, length(message)) == "!") ? 4 : 2
-
-/datum/language/unathi
- name = "Sinta'unathi"
- desc = "The common language of Moghes, composed of sibilant hisses and rattles. Spoken natively by Unathi."
- speech_verb = "hisses"
- ask_verb = "hisses"
- exclaim_verb = "roars"
- colour = "soghun"
- key = "o"
- flags = WHITELISTED
- syllables = list("ss","ss","ss","ss","skak","seeki","resh","las","esi","kor","sh")
-
-/datum/language/unathi/get_random_name()
-
- var/new_name = ..()
- while(findtextEx(new_name,"sss",1,null))
- new_name = replacetext(new_name, "sss", "ss")
- return capitalize(new_name)
-
-/datum/language/tajaran
- name = "Siik'tajr"
- desc = "The traditionally employed tongue of Ahdomai, composed of expressive yowls and chirps. Native to the Tajaran."
- speech_verb = "mrowls"
- ask_verb = "mrowls"
- exclaim_verb = "yowls"
- colour = "tajaran"
- key = "j"
- flags = WHITELISTED
- syllables = list("rr","rr","tajr","kir","raj","kii","mir","kra","ahk","nal","vah","khaz","jri","ran","darr", \
- "mi","jri","dynh","manq","rhe","zar","rrhaz","kal","chur","eech","thaa","dra","jurl","mah","sanu","dra","ii'r", \
- "ka","aasi","far","wa","baq","ara","qara","zir","sam","mak","hrar","nja","rir","khan","jun","dar","rik","kah", \
- "hal","ket","jurl","mah","tul","cresh","azu","ragh", "mro", "mra")
-
-/datum/language/tajaran/get_random_name(var/gender)
-
- var/new_name = ..(gender,1)
- if(prob(80))
- new_name += " [pick(list("Hadii","Kaytam","Zhan-Khazan","Hharar","Njarir'Akhan"))]"
- else
- new_name += ..(gender,1)
- return new_name
-
-/datum/language/skrell
- name = "Skrellian"
- desc = "A melodic and complex language spoken by the Skrell of Qerrbalak. Some of the notes are inaudible to humans."
- speech_verb = "warbles"
- ask_verb = "warbles"
- exclaim_verb = "warbles"
- colour = "skrell"
- key = "k"
- flags = WHITELISTED
- syllables = list("qr","qrr","xuq","qil","quum","xuqm","vol","xrim","zaoo","qu-uu","qix","qoo","zix","*","!")
-
-/datum/language/vox
- name = "Vox-pidgin"
- desc = "The common tongue of the various Vox ships making up the Shoal. It sounds like chaotic shrieking to everyone else."
- speech_verb = "shrieks"
- ask_verb = "creels"
- exclaim_verb = "SHRIEKS"
- colour = "vox"
- key = "5"
- flags = WHITELISTED
- syllables = list("ti","ti","ti","hi","hi","ki","ki","ki","ki","ya","ta","ha","ka","ya","chi","cha","kah", \
- "SKRE","AHK","EHK","RAWK","KRA","AAA","EEE","KI","II","KRI","KA")
-
-/datum/language/vox/get_random_name()
- return ..(FEMALE,1,6)
-
-/datum/language/diona
- name = "Rootspeak"
- desc = "A creaking, subvocal language spoken instinctively by the Dionaea. Due to the unique makeup of the average Diona, a phrase of Rootspeak can be a combination of anywhere from one to twelve individual voices and notes."
- speech_verb = "creaks and rustles"
- ask_verb = "creaks"
- exclaim_verb = "rustles"
- colour = "soghun"
- key = "q"
- flags = RESTRICTED
- syllables = list("hs","zt","kr","st","sh")
-
-/datum/language/diona/get_random_name()
- var/new_name = "[pick(list("To Sleep Beneath","Wind Over","Embrace of","Dreams of","Witnessing","To Walk Beneath","Approaching the"))]"
- new_name += " [pick(list("the Void","the Sky","Encroaching Night","Planetsong","Starsong","the Wandering Star","the Empty Day","Daybreak","Nightfall","the Rain"))]"
- return new_name
-
-/datum/language/common
- name = "Galactic Common"
- desc = "The common galactic tongue."
- speech_verb = "says"
- whisper_verb = "whispers"
- key = "0"
- flags = RESTRICTED
- syllables = list("blah","blah","blah","bleh","meh","neh","nah","wah")
-
-//TODO flag certain languages to use the mob-type specific say_quote and then get rid of these.
-/datum/language/common/get_spoken_verb(var/msg_end)
- switch(msg_end)
- if("!")
- return pick("exclaims","shouts","yells") //TODO: make the basic proc handle lists of verbs.
- if("?")
- return ask_verb
- return speech_verb
-
-/datum/language/human
- name = "Sol Common"
- desc = "A bastardized hybrid of informal English and elements of Mandarin Chinese; the common language of the Sol system."
- speech_verb = "says"
- whisper_verb = "whispers"
- colour = "solcom"
- key = "1"
- flags = RESTRICTED
-
- //syllables are at the bottom of the file
-
-/datum/language/human/get_spoken_verb(var/msg_end)
- switch(msg_end)
- if("!")
- return pick("exclaims","shouts","yells") //TODO: make the basic proc handle lists of verbs.
- if("?")
- return ask_verb
- return speech_verb
-
-/datum/language/human/get_random_name(var/gender)
- if (prob(80))
- if(gender==FEMALE)
- return capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names))
- else
- return capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names))
- else
- return ..()
-
-// Galactic common languages (systemwide accepted standards).
-/datum/language/trader
- name = "Tradeband"
- desc = "Maintained by the various trading cartels in major systems, this elegant, structured language is used for bartering and bargaining."
- speech_verb = "enunciates"
- colour = "say_quote"
- key = "2"
- space_chance = 100
- syllables = list("lorem", "ipsum", "dolor", "sit", "amet", "consectetur", "adipiscing", "elit",
- "sed", "do", "eiusmod", "tempor", "incididunt", "ut", "labore", "et", "dolore",
- "magna", "aliqua", "ut", "enim", "ad", "minim", "veniam", "quis", "nostrud",
- "exercitation", "ullamco", "laboris", "nisi", "ut", "aliquip", "ex", "ea", "commodo",
- "consequat", "duis", "aute", "irure", "dolor", "in", "reprehenderit", "in",
- "voluptate", "velit", "esse", "cillum", "dolore", "eu", "fugiat", "nulla",
- "pariatur", "excepteur", "sint", "occaecat", "cupidatat", "non", "proident", "sunt",
- "in", "culpa", "qui", "officia", "deserunt", "mollit", "anim", "id", "est", "laborum")
-
-/datum/language/gutter
- name = "Gutter"
- desc = "Much like Standard, this crude pidgin tongue descended from numerous languages and serves as Tradeband for criminal elements."
- speech_verb = "growls"
- colour = "rough"
- key = "3"
- syllables = list ("gra","ba","ba","breh","bra","rah","dur","ra","ro","gro","go","ber","bar","geh","heh", "gra")
-
-/datum/language/xenocommon
- name = "Xenomorph"
- colour = "alien"
- desc = "The common tongue of the xenomorphs."
- speech_verb = "hisses"
- ask_verb = "hisses"
- exclaim_verb = "hisses"
- key = "4"
- flags = RESTRICTED
- syllables = list("sss","sSs","SSS")
-
-/datum/language/xenos
- name = "Hivemind"
- desc = "Xenomorphs have the strange ability to commune over a psychic hivemind."
- speech_verb = "hisses"
- ask_verb = "hisses"
- exclaim_verb = "hisses"
- colour = "alien"
- key = "a"
- flags = RESTRICTED | HIVEMIND
-
-/datum/language/xenos/check_special_condition(var/mob/other)
-
- var/mob/living/carbon/M = other
- if(!istype(M))
- return 1
- if(locate(/datum/organ/internal/xenos/hivenode) in M.internal_organs)
- return 1
-
- return 0
-
-/datum/language/ling
- name = "Changeling"
- desc = "Although they are normally wary and suspicious of each other, changelings can commune over a distance."
- speech_verb = "says"
- colour = "changeling"
- key = "g"
- flags = RESTRICTED | HIVEMIND
-
-/datum/language/ling/broadcast(var/mob/living/speaker,var/message,var/speaker_mask)
-
- if(speaker.mind && speaker.mind.changeling)
- ..(speaker,message,speaker.mind.changeling.changelingID)
- else
- ..(speaker,message)
-
-/datum/language/corticalborer
- name = "Cortical Link"
- desc = "Cortical borers possess a strange link between their tiny minds."
- speech_verb = "sings"
- ask_verb = "sings"
- exclaim_verb = "sings"
- colour = "alien"
- key = "x"
- flags = RESTRICTED | HIVEMIND
-
-/datum/language/corticalborer/broadcast(var/mob/living/speaker,var/message,var/speaker_mask)
-
- var/mob/living/simple_animal/borer/B
-
- if(istype(speaker,/mob/living/carbon))
- var/mob/living/carbon/M = speaker
- B = M.has_brain_worms()
- else if(istype(speaker,/mob/living/simple_animal/borer))
- B = speaker
-
- if(B)
- speaker_mask = B.truename
- ..(speaker,message,speaker_mask)
-
-/datum/language/binary
- name = "Robot Talk"
- desc = "Most human stations support free-use communications protocols and routing hubs for synthetic use."
- colour = "say_quote"
- speech_verb = "states"
- ask_verb = "queries"
- exclaim_verb = "declares"
- key = "b"
- flags = RESTRICTED | HIVEMIND
- var/drone_only
-
-/datum/language/binary/broadcast(var/mob/living/speaker,var/message,var/speaker_mask)
-
- if(!speaker.binarycheck())
- return
-
- if (!message)
- return
-
- var/message_start = "[name], [speaker.name]"
- var/message_body = "[speaker.say_quote(message)], \"[message]\""
-
- for (var/mob/M in dead_mob_list)
- if(!istype(M,/mob/new_player) && !istype(M,/mob/living/carbon/brain)) //No meta-evesdropping
- M.show_message("[message_start] [message_body]", 2)
-
- for (var/mob/living/S in living_mob_list)
-
- if(drone_only && !istype(S,/mob/living/silicon/robot/drone))
- continue
- else if(istype(S , /mob/living/silicon/ai))
- message_start = "[name], [speaker.name]"
- else if (!S.binarycheck())
- continue
-
- S.show_message("[message_start] [message_body]", 2)
-
- var/list/listening = hearers(1, src)
- listening -= src
-
- for (var/mob/living/M in listening)
- if(istype(M, /mob/living/silicon) || M.binarycheck())
- continue
- M.show_message("synthesised voice beeps, \"beep beep beep\"",2)
-
- //robot binary xmitter component power usage
- if (isrobot(speaker))
- var/mob/living/silicon/robot/R = speaker
- var/datum/robot_component/C = R.components["comms"]
- R.cell_use_power(C.active_usage)
-
-/datum/language/binary/drone
- name = "Drone Talk"
- desc = "A heavily encoded damage control coordination stream."
- speech_verb = "transmits"
- ask_verb = "transmits"
- exclaim_verb = "transmits"
- colour = "say_quote"
- key = "d"
- flags = RESTRICTED | HIVEMIND
- drone_only = 1
-
// Language handling.
/mob/proc/add_language(var/language)
@@ -461,66 +154,4 @@
src << browse(dat, "window=checklanguage")
return
-//Syllable Lists
-
-/*
- This list really long, mainly because I can't make up my mind about which mandarin syllables should be removed,
- and the english syllables had to be duplicated so that there is roughly a 50-50 weighting.
-
- Sources:
- http://www.sttmedia.com/syllablefrequency-english
- http://www.chinahighlights.com/travelguide/learning-chinese/pinyin-syllables.htm
-*/
-/datum/language/human/syllables = list(
-"a", "ai", "an", "ang", "ao", "ba", "bai", "ban", "bang", "bao", "bei", "ben", "beng", "bi", "bian", "biao",
-"bie", "bin", "bing", "bo", "bu", "ca", "cai", "can", "cang", "cao", "ce", "cei", "cen", "ceng", "cha", "chai",
-"chan", "chang", "chao", "che", "chen", "cheng", "chi", "chong", "chou", "chu", "chua", "chuai", "chuan", "chuang", "chui", "chun",
-"chuo", "ci", "cong", "cou", "cu", "cuan", "cui", "cun", "cuo", "da", "dai", "dan", "dang", "dao", "de", "dei",
-"den", "deng", "di", "dian", "diao", "die", "ding", "diu", "dong", "dou", "du", "duan", "dui", "dun", "duo", "e",
-"ei", "en", "er", "fa", "fan", "fang", "fei", "fen", "feng", "fo", "fou", "fu", "ga", "gai", "gan", "gang",
-"gao", "ge", "gei", "gen", "geng", "gong", "gou", "gu", "gua", "guai", "guan", "guang", "gui", "gun", "guo", "ha",
-"hai", "han", "hang", "hao", "he", "hei", "hen", "heng", "hm", "hng", "hong", "hou", "hu", "hua", "huai", "huan",
-"huang", "hui", "hun", "huo", "ji", "jia", "jian", "jiang", "jiao", "jie", "jin", "jing", "jiong", "jiu", "ju", "juan",
-"jue", "jun", "ka", "kai", "kan", "kang", "kao", "ke", "kei", "ken", "keng", "kong", "kou", "ku", "kua", "kuai",
-"kuan", "kuang", "kui", "kun", "kuo", "la", "lai", "lan", "lang", "lao", "le", "lei", "leng", "li", "lia", "lian",
-"liang", "liao", "lie", "lin", "ling", "liu", "long", "lou", "lu", "luan", "lun", "luo", "ma", "mai", "man", "mang",
-"mao", "me", "mei", "men", "meng", "mi", "mian", "miao", "mie", "min", "ming", "miu", "mo", "mou", "mu", "na",
-"nai", "nan", "nang", "nao", "ne", "nei", "nen", "neng", "ng", "ni", "nian", "niang", "niao", "nie", "nin", "ning",
-"niu", "nong", "nou", "nu", "nuan", "nuo", "o", "ou", "pa", "pai", "pan", "pang", "pao", "pei", "pen", "peng",
-"pi", "pian", "piao", "pie", "pin", "ping", "po", "pou", "pu", "qi", "qia", "qian", "qiang", "qiao", "qie", "qin",
-"qing", "qiong", "qiu", "qu", "quan", "que", "qun", "ran", "rang", "rao", "re", "ren", "reng", "ri", "rong", "rou",
-"ru", "rua", "ruan", "rui", "run", "ruo", "sa", "sai", "san", "sang", "sao", "se", "sei", "sen", "seng", "sha",
-"shai", "shan", "shang", "shao", "she", "shei", "shen", "sheng", "shi", "shou", "shu", "shua", "shuai", "shuan", "shuang", "shui",
-"shun", "shuo", "si", "song", "sou", "su", "suan", "sui", "sun", "suo", "ta", "tai", "tan", "tang", "tao", "te",
-"teng", "ti", "tian", "tiao", "tie", "ting", "tong", "tou", "tu", "tuan", "tui", "tun", "tuo", "wa", "wai", "wan",
-"wang", "wei", "wen", "weng", "wo", "wu", "xi", "xia", "xian", "xiang", "xiao", "xie", "xin", "xing", "xiong", "xiu",
-"xu", "xuan", "xue", "xun", "ya", "yan", "yang", "yao", "ye", "yi", "yin", "ying", "yong", "you", "yu", "yuan",
-"yue", "yun", "za", "zai", "zan", "zang", "zao", "ze", "zei", "zen", "zeng", "zha", "zhai", "zhan", "zhang", "zhao",
-"zhe", "zhei", "zhen", "zheng", "zhi", "zhong", "zhou", "zhu", "zhua", "zhuai", "zhuan", "zhuang", "zhui", "zhun", "zhuo", "zi",
-"zong", "zou", "zuan", "zui", "zun", "zuo", "zu",
-"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it",
-"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to",
-"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin",
-"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi",
-"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it",
-"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to",
-"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin",
-"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi",
-"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it",
-"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to",
-"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin",
-"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi",
-"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it",
-"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to",
-"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin",
-"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi",
-"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it",
-"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to",
-"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin",
-"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi",
-"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it",
-"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to",
-"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin",
-"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi")
-
#undef SCRAMBLE_CACHE_LEN
diff --git a/code/modules/mob/language/outsider.dm b/code/modules/mob/language/outsider.dm
new file mode 100644
index 0000000000..c03cb9a9d1
--- /dev/null
+++ b/code/modules/mob/language/outsider.dm
@@ -0,0 +1,84 @@
+/datum/language/xenocommon
+ name = "Xenomorph"
+ colour = "alien"
+ desc = "The common tongue of the xenomorphs."
+ speech_verb = "hisses"
+ ask_verb = "hisses"
+ exclaim_verb = "hisses"
+ key = "4"
+ flags = RESTRICTED
+ syllables = list("sss","sSs","SSS")
+
+/datum/language/xenos
+ name = "Hivemind"
+ desc = "Xenomorphs have the strange ability to commune over a psychic hivemind."
+ speech_verb = "hisses"
+ ask_verb = "hisses"
+ exclaim_verb = "hisses"
+ colour = "alien"
+ key = "a"
+ flags = RESTRICTED | HIVEMIND
+
+/datum/language/xenos/check_special_condition(var/mob/other)
+
+ var/mob/living/carbon/M = other
+ if(!istype(M))
+ return 1
+ if(locate(/datum/organ/internal/xenos/hivenode) in M.internal_organs)
+ return 1
+
+ return 0
+
+/datum/language/ling
+ name = "Changeling"
+ desc = "Although they are normally wary and suspicious of each other, changelings can commune over a distance."
+ speech_verb = "says"
+ colour = "changeling"
+ key = "g"
+ flags = RESTRICTED | HIVEMIND
+
+/datum/language/ling/broadcast(var/mob/living/speaker,var/message,var/speaker_mask)
+
+ if(speaker.mind && speaker.mind.changeling)
+ ..(speaker,message,speaker.mind.changeling.changelingID)
+ else
+ ..(speaker,message)
+
+/datum/language/corticalborer
+ name = "Cortical Link"
+ desc = "Cortical borers possess a strange link between their tiny minds."
+ speech_verb = "sings"
+ ask_verb = "sings"
+ exclaim_verb = "sings"
+ colour = "alien"
+ key = "x"
+ flags = RESTRICTED | HIVEMIND
+
+/datum/language/corticalborer/broadcast(var/mob/living/speaker,var/message,var/speaker_mask)
+
+ var/mob/living/simple_animal/borer/B
+
+ if(istype(speaker,/mob/living/carbon))
+ var/mob/living/carbon/M = speaker
+ B = M.has_brain_worms()
+ else if(istype(speaker,/mob/living/simple_animal/borer))
+ B = speaker
+
+ if(B)
+ speaker_mask = B.truename
+ ..(speaker,message,speaker_mask)
+
+/datum/language/vox
+ name = "Vox-pidgin"
+ desc = "The common tongue of the various Vox ships making up the Shoal. It sounds like chaotic shrieking to everyone else."
+ speech_verb = "shrieks"
+ ask_verb = "creels"
+ exclaim_verb = "SHRIEKS"
+ colour = "vox"
+ key = "5"
+ flags = WHITELISTED
+ syllables = list("ti","ti","ti","hi","hi","ki","ki","ki","ki","ya","ta","ha","ka","ya","chi","cha","kah", \
+ "SKRE","AHK","EHK","RAWK","KRA","AAA","EEE","KI","II","KRI","KA")
+
+/datum/language/vox/get_random_name()
+ return ..(FEMALE,1,6)
diff --git a/code/modules/mob/language/station.dm b/code/modules/mob/language/station.dm
new file mode 100644
index 0000000000..d5900769b3
--- /dev/null
+++ b/code/modules/mob/language/station.dm
@@ -0,0 +1,156 @@
+/datum/language/diona
+ name = "Rootspeak"
+ desc = "A creaking, subvocal language spoken instinctively by the Dionaea. Due to the unique makeup of the average Diona, a phrase of Rootspeak can be a combination of anywhere from one to twelve individual voices and notes."
+ speech_verb = "creaks and rustles"
+ ask_verb = "creaks"
+ exclaim_verb = "rustles"
+ colour = "soghun"
+ key = "q"
+ flags = RESTRICTED
+ syllables = list("hs","zt","kr","st","sh")
+
+/datum/language/diona/get_random_name()
+ var/new_name = "[pick(list("To Sleep Beneath","Wind Over","Embrace of","Dreams of","Witnessing","To Walk Beneath","Approaching the"))]"
+ new_name += " [pick(list("the Void","the Sky","Encroaching Night","Planetsong","Starsong","the Wandering Star","the Empty Day","Daybreak","Nightfall","the Rain"))]"
+ return new_name
+
+/datum/language/unathi
+ name = "Sinta'unathi"
+ desc = "The common language of Moghes, composed of sibilant hisses and rattles. Spoken natively by Unathi."
+ speech_verb = "hisses"
+ ask_verb = "hisses"
+ exclaim_verb = "roars"
+ colour = "soghun"
+ key = "o"
+ flags = WHITELISTED
+ syllables = list("ss","ss","ss","ss","skak","seeki","resh","las","esi","kor","sh")
+
+/datum/language/unathi/get_random_name()
+
+ var/new_name = ..()
+ while(findtextEx(new_name,"sss",1,null))
+ new_name = replacetext(new_name, "sss", "ss")
+ return capitalize(new_name)
+
+/datum/language/tajaran
+ name = "Siik'tajr"
+ desc = "The traditionally employed tongue of Ahdomai, composed of expressive yowls and chirps. Native to the Tajaran."
+ speech_verb = "mrowls"
+ ask_verb = "mrowls"
+ exclaim_verb = "yowls"
+ colour = "tajaran"
+ key = "j"
+ flags = WHITELISTED
+ syllables = list("rr","rr","tajr","kir","raj","kii","mir","kra","ahk","nal","vah","khaz","jri","ran","darr", \
+ "mi","jri","dynh","manq","rhe","zar","rrhaz","kal","chur","eech","thaa","dra","jurl","mah","sanu","dra","ii'r", \
+ "ka","aasi","far","wa","baq","ara","qara","zir","sam","mak","hrar","nja","rir","khan","jun","dar","rik","kah", \
+ "hal","ket","jurl","mah","tul","cresh","azu","ragh", "mro", "mra")
+
+/datum/language/tajaran/get_random_name(var/gender)
+
+ var/new_name = ..(gender,1)
+ if(prob(80))
+ new_name += " [pick(list("Hadii","Kaytam","Zhan-Khazan","Hharar","Njarir'Akhan"))]"
+ else
+ new_name += ..(gender,1)
+ return new_name
+
+/datum/language/skrell
+ name = "Skrellian"
+ desc = "A melodic and complex language spoken by the Skrell of Qerrbalak. Some of the notes are inaudible to humans."
+ speech_verb = "warbles"
+ ask_verb = "warbles"
+ exclaim_verb = "warbles"
+ colour = "skrell"
+ key = "k"
+ flags = WHITELISTED
+ syllables = list("qr","qrr","xuq","qil","quum","xuqm","vol","xrim","zaoo","qu-uu","qix","qoo","zix","*","!")
+
+/datum/language/human
+ name = "Sol Common"
+ desc = "A bastardized hybrid of informal English and elements of Mandarin Chinese; the common language of the Sol system."
+ speech_verb = "says"
+ whisper_verb = "whispers"
+ colour = "solcom"
+ key = "1"
+ flags = RESTRICTED
+
+ //syllables are at the bottom of the file
+
+/datum/language/human/get_spoken_verb(var/msg_end)
+ switch(msg_end)
+ if("!")
+ return pick("exclaims","shouts","yells") //TODO: make the basic proc handle lists of verbs.
+ if("?")
+ return ask_verb
+ return speech_verb
+
+/datum/language/human/get_random_name(var/gender)
+ if (prob(80))
+ if(gender==FEMALE)
+ return capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names))
+ else
+ return capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names))
+ else
+ return ..()
+
+//Syllable Lists
+/*
+ This list really long, mainly because I can't make up my mind about which mandarin syllables should be removed,
+ and the english syllables had to be duplicated so that there is roughly a 50-50 weighting.
+
+ Sources:
+ http://www.sttmedia.com/syllablefrequency-english
+ http://www.chinahighlights.com/travelguide/learning-chinese/pinyin-syllables.htm
+*/
+/datum/language/human/syllables = list(
+"a", "ai", "an", "ang", "ao", "ba", "bai", "ban", "bang", "bao", "bei", "ben", "beng", "bi", "bian", "biao",
+"bie", "bin", "bing", "bo", "bu", "ca", "cai", "can", "cang", "cao", "ce", "cei", "cen", "ceng", "cha", "chai",
+"chan", "chang", "chao", "che", "chen", "cheng", "chi", "chong", "chou", "chu", "chua", "chuai", "chuan", "chuang", "chui", "chun",
+"chuo", "ci", "cong", "cou", "cu", "cuan", "cui", "cun", "cuo", "da", "dai", "dan", "dang", "dao", "de", "dei",
+"den", "deng", "di", "dian", "diao", "die", "ding", "diu", "dong", "dou", "du", "duan", "dui", "dun", "duo", "e",
+"ei", "en", "er", "fa", "fan", "fang", "fei", "fen", "feng", "fo", "fou", "fu", "ga", "gai", "gan", "gang",
+"gao", "ge", "gei", "gen", "geng", "gong", "gou", "gu", "gua", "guai", "guan", "guang", "gui", "gun", "guo", "ha",
+"hai", "han", "hang", "hao", "he", "hei", "hen", "heng", "hm", "hng", "hong", "hou", "hu", "hua", "huai", "huan",
+"huang", "hui", "hun", "huo", "ji", "jia", "jian", "jiang", "jiao", "jie", "jin", "jing", "jiong", "jiu", "ju", "juan",
+"jue", "jun", "ka", "kai", "kan", "kang", "kao", "ke", "kei", "ken", "keng", "kong", "kou", "ku", "kua", "kuai",
+"kuan", "kuang", "kui", "kun", "kuo", "la", "lai", "lan", "lang", "lao", "le", "lei", "leng", "li", "lia", "lian",
+"liang", "liao", "lie", "lin", "ling", "liu", "long", "lou", "lu", "luan", "lun", "luo", "ma", "mai", "man", "mang",
+"mao", "me", "mei", "men", "meng", "mi", "mian", "miao", "mie", "min", "ming", "miu", "mo", "mou", "mu", "na",
+"nai", "nan", "nang", "nao", "ne", "nei", "nen", "neng", "ng", "ni", "nian", "niang", "niao", "nie", "nin", "ning",
+"niu", "nong", "nou", "nu", "nuan", "nuo", "o", "ou", "pa", "pai", "pan", "pang", "pao", "pei", "pen", "peng",
+"pi", "pian", "piao", "pie", "pin", "ping", "po", "pou", "pu", "qi", "qia", "qian", "qiang", "qiao", "qie", "qin",
+"qing", "qiong", "qiu", "qu", "quan", "que", "qun", "ran", "rang", "rao", "re", "ren", "reng", "ri", "rong", "rou",
+"ru", "rua", "ruan", "rui", "run", "ruo", "sa", "sai", "san", "sang", "sao", "se", "sei", "sen", "seng", "sha",
+"shai", "shan", "shang", "shao", "she", "shei", "shen", "sheng", "shi", "shou", "shu", "shua", "shuai", "shuan", "shuang", "shui",
+"shun", "shuo", "si", "song", "sou", "su", "suan", "sui", "sun", "suo", "ta", "tai", "tan", "tang", "tao", "te",
+"teng", "ti", "tian", "tiao", "tie", "ting", "tong", "tou", "tu", "tuan", "tui", "tun", "tuo", "wa", "wai", "wan",
+"wang", "wei", "wen", "weng", "wo", "wu", "xi", "xia", "xian", "xiang", "xiao", "xie", "xin", "xing", "xiong", "xiu",
+"xu", "xuan", "xue", "xun", "ya", "yan", "yang", "yao", "ye", "yi", "yin", "ying", "yong", "you", "yu", "yuan",
+"yue", "yun", "za", "zai", "zan", "zang", "zao", "ze", "zei", "zen", "zeng", "zha", "zhai", "zhan", "zhang", "zhao",
+"zhe", "zhei", "zhen", "zheng", "zhi", "zhong", "zhou", "zhu", "zhua", "zhuai", "zhuan", "zhuang", "zhui", "zhun", "zhuo", "zi",
+"zong", "zou", "zuan", "zui", "zun", "zuo", "zu",
+"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it",
+"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to",
+"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin",
+"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi",
+"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it",
+"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to",
+"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin",
+"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi",
+"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it",
+"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to",
+"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin",
+"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi",
+"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it",
+"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to",
+"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin",
+"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi",
+"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it",
+"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to",
+"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin",
+"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi",
+"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it",
+"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to",
+"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin",
+"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi")
diff --git a/code/modules/mob/language/synthetic.dm b/code/modules/mob/language/synthetic.dm
new file mode 100644
index 0000000000..3355a1e5c8
--- /dev/null
+++ b/code/modules/mob/language/synthetic.dm
@@ -0,0 +1,61 @@
+/datum/language/binary
+ name = "Robot Talk"
+ desc = "Most human stations support free-use communications protocols and routing hubs for synthetic use."
+ colour = "say_quote"
+ speech_verb = "states"
+ ask_verb = "queries"
+ exclaim_verb = "declares"
+ key = "b"
+ flags = RESTRICTED | HIVEMIND
+ var/drone_only
+
+/datum/language/binary/broadcast(var/mob/living/speaker,var/message,var/speaker_mask)
+
+ if(!speaker.binarycheck())
+ return
+
+ if (!message)
+ return
+
+ var/message_start = "[name], [speaker.name]"
+ var/message_body = "[speaker.say_quote(message)], \"[message]\""
+
+ for (var/mob/M in dead_mob_list)
+ if(!istype(M,/mob/new_player) && !istype(M,/mob/living/carbon/brain)) //No meta-evesdropping
+ M.show_message("[message_start] [message_body]", 2)
+
+ for (var/mob/living/S in living_mob_list)
+
+ if(drone_only && !istype(S,/mob/living/silicon/robot/drone))
+ continue
+ else if(istype(S , /mob/living/silicon/ai))
+ message_start = "[name], [speaker.name]"
+ else if (!S.binarycheck())
+ continue
+
+ S.show_message("[message_start] [message_body]", 2)
+
+ var/list/listening = hearers(1, src)
+ listening -= src
+
+ for (var/mob/living/M in listening)
+ if(istype(M, /mob/living/silicon) || M.binarycheck())
+ continue
+ M.show_message("synthesised voice beeps, \"beep beep beep\"",2)
+
+ //robot binary xmitter component power usage
+ if (isrobot(speaker))
+ var/mob/living/silicon/robot/R = speaker
+ var/datum/robot_component/C = R.components["comms"]
+ R.cell_use_power(C.active_usage)
+
+/datum/language/binary/drone
+ name = "Drone Talk"
+ desc = "A heavily encoded damage control coordination stream."
+ speech_verb = "transmits"
+ ask_verb = "transmits"
+ exclaim_verb = "transmits"
+ colour = "say_quote"
+ key = "d"
+ flags = RESTRICTED | HIVEMIND
+ drone_only = 1