From 72f993fdbd308f46e8552405b0997ad46db53113 Mon Sep 17 00:00:00 2001
From: Enric Gabriel <43283559+SandPoot@users.noreply.github.com>
Date: Thu, 2 Jul 2020 02:20:27 -0300
Subject: [PATCH] Pulls #1706 from Skyrat (#18)
---
code/__DEFINES/language.dm | 4 +
code/controllers/subsystem/language.dm | 28 +++
code/controllers/subsystem/ticker.dm | 4 +
code/modules/client/preferences.dm | 65 +++++-
code/modules/client/preferences_savefile.dm | 6 +
code/modules/language/aphasia.dm | 3 +
code/modules/language/beachbum.dm | 3 +
code/modules/language/codespeak.dm | 3 +
code/modules/language/common.dm | 3 +
code/modules/language/draconic.dm | 3 +
code/modules/language/drone.dm | 3 +
code/modules/language/dwarven.dm | 5 +-
code/modules/language/language.dm | 3 +
code/modules/language/language_holder.dm | 59 +++---
code/modules/language/machine.dm | 5 +-
code/modules/language/monkey.dm | 3 +
code/modules/language/mushroom.dm | 3 +
code/modules/language/narsian.dm | 5 +-
code/modules/language/ratvarian.dm | 7 +-
code/modules/language/slime.dm | 5 +-
code/modules/language/swarmer.dm | 5 +-
code/modules/language/vampiric.dm | 3 +
code/modules/language/xenocommon.dm | 3 +
.../modules/mob/dead/new_player/new_player.dm | 3 +
.../mob/living/carbon/human/species.dm | 2 +
.../carbon/human/species_types/bugmen.dm | 1 +
.../carbon/human/species_types/furrypeople.dm | 1 +
.../living/carbon/human/species_types/ipc.dm | 1 +
.../carbon/human/species_types/jellypeople.dm | 1 +
.../human/species_types/lizardpeople.dm | 1 +
.../carbon/human/species_types/mushpeople.dm | 1 +
.../carbon/human/species_types/plasmamen.dm | 1 +
.../carbon/human/species_types/podpeople.dm | 1 +
.../human/species_types/shadowpeople.dm | 1 +
.../carbon/human/species_types/synthliz.dm | 1 +
code/modules/surgery/organs/tongue.dm | 9 +
sandcode/code/datums/traits/_quirk.dm | 2 +
sandcode/code/datums/traits/neutral.dm | 18 --
sandcode/code/modules/language/language.dm | 197 ++++++++++++++++++
sandcode/code/modules/ninja/outfit.dm | 9 +
sandcode/icons/misc/language.dmi | Bin 346 -> 3227 bytes
tgstation.dme | 2 +
42 files changed, 432 insertions(+), 51 deletions(-)
create mode 100644 sandcode/code/datums/traits/_quirk.dm
create mode 100644 sandcode/code/modules/ninja/outfit.dm
diff --git a/code/__DEFINES/language.dm b/code/__DEFINES/language.dm
index add4a8e277..4a1ca3a152 100644
--- a/code/__DEFINES/language.dm
+++ b/code/__DEFINES/language.dm
@@ -24,3 +24,7 @@
#define LANGUAGE_STONER "stoner"
#define LANGUAGE_VASSAL "vassal"
#define LANGUAGE_VOICECHANGE "voicechange"
+
+//SKYRAT LANGUAGES
+#define LANGUAGE_ADDITIONAL "additional"
+#define LANGUAGE_NINJA "ninja"
diff --git a/code/controllers/subsystem/language.dm b/code/controllers/subsystem/language.dm
index e80a7096d8..2272c67b19 100644
--- a/code/controllers/subsystem/language.dm
+++ b/code/controllers/subsystem/language.dm
@@ -2,6 +2,7 @@ SUBSYSTEM_DEF(language)
name = "Language"
init_order = INIT_ORDER_LANGUAGE
flags = SS_NO_FIRE
+ var/list/languages_by_name = list() //SKYRAT CHANGE - language bullshit
/datum/controller/subsystem/language/Initialize(timeofday)
for(var/L in subtypesof(/datum/language))
@@ -14,5 +15,32 @@ SUBSYSTEM_DEF(language)
var/datum/language/instance = new language
GLOB.language_datum_instances[language] = instance
+ //skyrat change
+ languages_by_name[initial(language.name)] = new language
+ //
return ..()
+
+//Skyrat change
+/datum/controller/subsystem/language/proc/AssignLanguage(mob/living/user, client/cli)
+ var/list/my_lang = cli.prefs.language
+ if(isnull(my_lang))
+ return
+ for(var/I in GLOB.all_languages)
+ var/datum/language/L = I
+ var/datum/language/cool = new L
+ if(my_lang == cool.name)
+ if(!cool.restricted || (cool.name in cli.prefs.pref_species.languagewhitelist))
+ user.grant_language(cool.type, TRUE, TRUE, LANGUAGE_ADDITIONAL)
+ to_chat(user, "You are able to speak in [my_lang]. If you're actually good at it or not, it's up to you.")
+ else
+ for(var/datum/quirk/Q in cli.prefs.all_quirks)
+ if(cool.name in Q.languagewhitelist)
+ user.grant_language(cool, TRUE, TRUE, LANGUAGE_ADDITIONAL)
+ to_chat(user, "You are able to speak in [my_lang]. If you're actually good at it or not, it's up to you.")
+ return
+ to_chat(user, "Uh oh. [my_lang] is a restricted language, and couldn't be assigned!")
+ to_chat(user, "This probably shouldn't be happening. Scream at Bob on #main-dev.")
+ else
+ continue
+//
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index 765f0c8382..57fa017461 100755
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -396,6 +396,10 @@ SUBSYSTEM_DEF(ticker)
SSjob.EquipRank(N, player.mind.assigned_role, 0)
if(CONFIG_GET(flag/roundstart_traits) && ishuman(N.new_character))
SSquirks.AssignQuirks(N.new_character, N.client, TRUE, TRUE, SSjob.GetJob(player.mind.assigned_role), FALSE, N)
+ //skyrat change
+ if(ishuman(N.new_character))
+ SSlanguage.AssignLanguage(N.new_character, N.client)
+ //
CHECK_TICK
if(captainless)
for(var/mob/dead/new_player/N in GLOB.player_list)
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 240b275084..8040c6ad17 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -164,6 +164,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
)
var/custom_speech_verb = "default" //if your say_mod is to be something other than your races
var/custom_tongue = "default" //if your tongue is to be something other than your races
+ var/language = ""
var/list/custom_names = list()
var/preferred_ai_core_display = "Blue"
@@ -337,6 +338,10 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "[namedata["pref_name"]]: [custom_names[custom_name_id]] "
dat += "
"
+ //SKYRAT EDIT - additional language
+ dat += "Additional Language
"
+ dat += "[language ? language : "None"]
"
+ //
dat += "Custom job preferences:
"
dat += "Preferred AI Core Display: [preferred_ai_core_display]
"
dat += "Preferred Security Department: [prefered_security_department]
"
@@ -1464,6 +1469,48 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(SSquirks.quirk_points[q] > 0)
.++
+//SKYRAT EDIT - extra language
+/datum/preferences/proc/SetLanguage(mob/user)
+ var/list/dat = list()
+ dat += "
Choose an Additional Language
"
+ dat += "Do note, however, than you can only have one chosen language.
"
+ dat += "If you want no additional language at all, simply remove the currently chosen language.
"
+ dat += "
"
+ if(SSlanguage && SSlanguage.languages_by_name.len)
+ for(var/V in SSlanguage.languages_by_name)
+ var/datum/language/L = SSlanguage.languages_by_name[V]
+ if(!L)
+ return
+ var/language_name = initial(L.name)
+ var/restricted = FALSE
+ var/has_language = FALSE
+ if(L.restricted)
+ restricted = TRUE
+ if(language_name == language)
+ has_language = TRUE
+ var/font_color = "#4682B4"
+ var/nullify = ""
+ if(restricted && !(language_name in pref_species.languagewhitelist))
+ var/quirklanguagefound = FALSE
+ for(var/datum/quirk/Q in all_quirks)
+ if(language_name in Q.languagewhitelist)
+ quirklanguagefound = TRUE
+ if(!quirklanguagefound)
+ continue
+ else
+ dat += "[language_name]: [initial(L.desc)]"
+ dat += "[has_language ? "Remove" : "Choose"]
"
+ else
+ dat += "The language subsystem hasn't fully loaded yet! Please wait a bit and try again.
"
+ dat += "
"
+ dat += "Done"
+
+ var/datum/browser/popup = new(user, "mob_occupation", "Language Preference
", 900, 600) //no reason not to reuse the occupation window, as it's cleaner that way
+ popup.set_window_options("can_close=0")
+ popup.set_content(dat.Join())
+ popup.open(FALSE)
+//
+
/datum/preferences/Topic(href, href_list, hsrc) //yeah, gotta do this I guess..
. = ..()
if(href_list["close"])
@@ -1557,7 +1604,23 @@ GLOBAL_LIST_EMPTY(preferences_datums)
else
SetQuirks(user)
return TRUE
-
+ //SKYRAT CHANGE - only language pref
+ else if(href_list["preference"] == "language")
+ switch(href_list["task"])
+ if("close")
+ user << browse(null, "window=mob_occupation")
+ ShowChoices(user)
+ if("update")
+ var/lang = href_list["language"]
+ if(SSlanguage.languages_by_name[lang] || lang == "")
+ language = lang
+ SetLanguage(user)
+ else
+ SetLanguage(user)
+ else
+ SetLanguage(user)
+ return TRUE
+//
switch(href_list["task"])
if("random")
switch(href_list["preference"])
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index aa1b6f801b..1014b8e909 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -514,6 +514,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
//Quirks
S["all_quirks"] >> all_quirks
+ //SKYRAT ADDITION - additional language
+ S["language"] >> language
+ //
//Citadel code
S["feature_genitals_use_skintone"] >> features["genitals_use_skintone"]
@@ -821,6 +824,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
//Quirks
WRITE_FILE(S["all_quirks"] , all_quirks)
+ //SKYRAT ADDITION - additional language
+ WRITE_FILE(S["language"] , language)
+ //
WRITE_FILE(S["vore_flags"] , vore_flags)
WRITE_FILE(S["vore_taste"] , vore_taste)
diff --git a/code/modules/language/aphasia.dm b/code/modules/language/aphasia.dm
index 91f14f9111..5ca44cf5b9 100644
--- a/code/modules/language/aphasia.dm
+++ b/code/modules/language/aphasia.dm
@@ -11,3 +11,6 @@
space_chance = 20
default_priority = 10
icon_state = "aphasia"
+ //SKYRAT CHANGE - language restriction
+ restricted = TRUE
+ //
diff --git a/code/modules/language/beachbum.dm b/code/modules/language/beachbum.dm
index 528e9a8da2..51f4689a91 100644
--- a/code/modules/language/beachbum.dm
+++ b/code/modules/language/beachbum.dm
@@ -20,3 +20,6 @@
"tail", "trim", "tube", "wobble", "roll", "gnarly", "epic")
icon_state = "beach"
+ //SKYRAT CHANGE - language restriction
+ restricted = FALSE
+ //
diff --git a/code/modules/language/codespeak.dm b/code/modules/language/codespeak.dm
index 5d658b1fce..d31d82e769 100644
--- a/code/modules/language/codespeak.dm
+++ b/code/modules/language/codespeak.dm
@@ -5,6 +5,9 @@
default_priority = 0
flags = TONGUELESS_SPEECH | LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD
icon_state = "codespeak"
+ //SKYRAT CHANGE - language restriction
+ restricted = TRUE
+ //
/datum/language/codespeak/scramble(input)
var/lookup = check_cache(input)
diff --git a/code/modules/language/common.dm b/code/modules/language/common.dm
index 8d06dd8fa0..4e874d084d 100644
--- a/code/modules/language/common.dm
+++ b/code/modules/language/common.dm
@@ -9,6 +9,9 @@
default_priority = 100
icon_state = "galcom"
+ //SKYRAT CHANGE - language restriction
+ restricted = TRUE //i know it's weird, but it's restricted because crewmembers spawn with it by default
+ //
//Syllable Lists
/*
diff --git a/code/modules/language/draconic.dm b/code/modules/language/draconic.dm
index aaa998c2c0..fe7ed28fc9 100644
--- a/code/modules/language/draconic.dm
+++ b/code/modules/language/draconic.dm
@@ -18,3 +18,6 @@
)
icon_state = "lizard"
default_priority = 90
+ //SKYRAT CHANGE - language restriction
+ restricted = TRUE
+ //
diff --git a/code/modules/language/drone.dm b/code/modules/language/drone.dm
index 390e0027cf..3609cc3fda 100644
--- a/code/modules/language/drone.dm
+++ b/code/modules/language/drone.dm
@@ -14,3 +14,6 @@
default_priority = 20
icon_state = "drone"
+ //SKYRAT CHANGE - language restriction
+ restricted = TRUE
+ //
diff --git a/code/modules/language/dwarven.dm b/code/modules/language/dwarven.dm
index fe2df478f9..ffd22dd3f8 100644
--- a/code/modules/language/dwarven.dm
+++ b/code/modules/language/dwarven.dm
@@ -6,8 +6,11 @@
space_chance = 100 // Each 'syllable' is its own word
key = "D"
flags = TONGUELESS_SPEECH
+ //SKYRAT CHANGE - language restriction
+ restricted = FALSE
+ //
syllables = list("kulet", "alak", "bidok", "nicol", "anam", "gatal", "mabdug", "zustash", "sedil", "ustos", "emr", "izeg", "beming", "gost", "ntak", "tosid", "feb", "berim", "ibruk", "ermis", "thoth", "thatthil", "gistang", "libash", "lakish", "asdos", "roder", "nel", "biban", "ugog", "ish", "robek", "olmul", "nokzam", "emuth", "fer", "uvel", "dolush", "ag^k", "ucat", "ng rak", "enir", "ugath", "lisig", "etg", "erong", "osed", "lanlar", "udir", "tarmid", "s krith", "nural", "bugsud", "okag", "nazush", "nashon", "ftrid", "en''r", "dstik", "kogan", "ingish", "dudgoth", "stalk*b", "themor", "murak", "altth", "osod", "thcekut", "cog", "selsten", "egdoth", "othsin", "idek", "st", "suthmam", "im", "okab", "onlnl", "gasol", "tegir", "nam...sh", "noval", "shalig", "shin", "lek", ",,kim", "kfkdal", "stum,,m", "alud", "olom", "%lot", "rozsed", "thos", "okon", "nV=-0C=2@(7_6WFboFZvwe!7_c3AY=4B|ugTBJ(YP8*K15K;=_B#mPM!hBQ
z@rV2cJep_QL*2DvLC=O9RB*doMYftDXsDpPi%g@Lbl4XTG9Xlt^ENNi^cqg2-3D8H(Q8EG6<6lrvWzOGNgwnmAhp{RVBqG6R4=Fq*U%6*27OPDdFAj?&$fu-Q7$t
zDM{P!a#a;ZE;y~&^nb~9MJL@Ai$4=j|L$s`0IxH9X
ze7=}6S`hkWFoB$R@HaoUQ_S?xp=I4tIrk^C0l0AC0+&rGr~SxbGBPp%*tVsaS@%4f
zb|gDGIwU|{T^#^x*RBPitgLKEE=YxV2Sf#kCof;{BW}x#9KY&E+?g43p?DEA^52~{
zl|vsM1R{hrLA3gGB6M_g$il)x06ZQK0Qz$y5j4x|iN#NYVdnrLgyFFfTGlO<^On@|
z-Dy*!b@sgCm|uv9FmFk1(&?a)&&kQ5sHiAfUsO~?PEHPmg@sXf7$M!!eljyNlZp^Ox_U<>
z8+i?h4$ug?#$2p(jY%tzueS$ZZw~+u)h~}})6VrVM$nIXdwV-|b#>I$)zRMGZWyD-
zP{T;IKhoC~}-@jv=j2fSs>DEU&n(f)Czm
zqvNEPc}r?}=Zzg)d-IL-SbiXi2mUFw^UaMLDVvaw7GHYH>X;GJteq^|r)wVy@pzYr
z_}yTP2nNewvL#TDmUT;I*@S#bZ&@umUw>G3ob(Q9`5Q?XiC{EE5(Lmg+X5=}CWG
zky3!KD-=Z$7K`Pdd-m+P9-z9qdQT`6nxm>}I6ijN1gN-fW{d^f-unAj>Y`Vj&I|h?
z5C(Y_SbyqvXBx!~c{@B*IQyr|VEMJOm_vsKj$aCdce>+PY?
z6(%rCKtTAfX7l^c?cG}yA8Y7<#>PfzwOY}actPT!i1ktO8ex5DJ9>V`j(rX+Z-z4%D9LJJhg|%z}*0Kdy
z@~g;OaGb;Ao05+Hqe5f=IKVE1F#93wcDuuFw<>*z0YH3fa4P%`EZS5s6u@e=;_-N5
ziq&dO`p}A4FUd-LO^zpD#q(70JXaUmle(bNcdzX8bYd-AK+mokdUn-dEn7gJr;|$G
zy-A(pcDn}vR=VBx5|e5BVpYv}O;HB6D$2k;Zg*CJ$+Y2aRkZ=As+#_jSo{=71)~u)
zBCmHye4mnIbLGZ;6JIpw-F9_*|=|_OqB=~MG@7Z
z&`baukOKl>Za93a)9Fm$JL0QAJgRseNEAe7E=${Y(u7MmezJd9_p3CUkKCcE8Os&r
zupNXISgt6C7pkiDdqR8?AD
zP9J%d;yF#s4}FJ+iz_Ie)5Pf`uVS+0Q#<2?=$^bSAs0BEP76RGi~*ReYtxPk!9Exp
zov$$hJow;)5@6ZRoe4>B+0LCYF?zT!c~`vWiT!RDPd?`Sd?4vkxZnP?$So`-*zpp@
zbDAig(?qc2C2|W(*>8W^u#cCEIbhY^y_f#th8vn!sA~BE*n9vsuTa(UJ8rmP-~G+a
zV~NBDJb+VCgvIEBPtKaf{ey({b?KnDyWa9zy_N@3q5RVt+1unKZ$WFcZou10?@N;?
zuc?tnE5RPKxh-E&LI)rW@Up5}pVGbXJf$e}UQ|_cgQE0XzS
z2BCd{eR9^Um;#Y6wG9mohNGZ&K}zeV7<~X&*M4j@ZuZ-s7J;7K1bTL}-~P0))wpqW
z?KkZ6+}^!a0$8c4*4)9Q_cw?R?%yB-ARjC%Rn=++o@j2K3o-VbVLoDj)YfX!xen_E#rg@XbJA)?$=RUH5r
z2g0o=q0MG9qYuN`IRW=S)%_8myjrC1h#u|9X7w1yB^_OZ6Z17oq=k
z7%qb&g(JIHOS9R+q}jhpJO8gPeoYGByGZ+VlK=h-h~&W5Gmni(P8l@^eDe1OS&(NV
zFUQ33=Eu{1=|JQ3Q>AcG1icdrm_KG(Gp2EGl*o3Ps)}0s~>rp6;e*>BB=(
z{o_54$}zbaWL$Cy2*Eg;e7y6``$IuF|jE67hxF=V=}?F%ZfRc!U^ND
ztsL3z$9wc`PM;hwjL9yV3Hd(rK?D(#F`MDoD_Z`J*wIYy6KnOE_-^b*QE#TPR$K>SdUne-hVe>(@ozMR{LgW#nBk%o7LO{C`5AX)ZIw!TtKZjK34ioX)S
z_J{lADNip2W3m~Olf?ysTnrxoth68P=Jc6!eDLr4c=+cAj^TT3trf&anuYKg_yP<{qhL`@W!+E
z%iMyo^mLyhD?4_&c>i-6$7K#q_xZVb>5~ao(mTLGZ$t!o>FR?^HS*dN7{MeMBS2V6
zN=wW6@xsIn%fe;L#MbreWt;c2q!-hOtyz4NYw@Em*K76lci!%Dz3@tX(vHBJANO(n
zw{xQoF#CJy3fLnK&_;fce9QaABet)I3h=}uzm^$UW7BrX9a}`hBdg?tkE}`h5Uc*Y
zy?)K&n_Swt>(AR$k_VW!{6*2VahW79i30|cU&}tvh;FK)liC*uGqrr0;pl7l@xq1T
zva%@%(*MKPszK7LhCp6JPVF<|&5!%&3fL1JV6PZ)^6(XGhSn^;$u%4i06zTV9db&M
zohv6~(cKrI;#UtPwf&df42|ku;EQ6~@)rfbM}y}r?~mTSzVX}P{{kl;gNZC&Dx3fS
N002ovPDHLkV1hoZJWc=r
literal 346
zcmV-g0j2(lP)1d#_2iao+*02QLyZ5mZoZi;udX;dFkc2Lr&t!fK_m*J!=
sqo-ln0iHB$-Re&Kv0dM#>E1u{0;E<0Y=4cS$p8QV07*qoM6N<$f_PSrE&u=k
diff --git a/tgstation.dme b/tgstation.dme
index de76e5b49e..dcf85b8c6a 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -3493,6 +3493,7 @@
#include "modular_citadel\code\modules\reagents\objects\items.dm"
#include "sandcode\code\__DEFINES\language.dm"
#include "sandcode\code\__DEFINES\traits.dm"
+#include "sandcode\code\datums\traits\_quirk.dm"
#include "sandcode\code\datums\traits\negative.dm"
#include "sandcode\code\datums\traits\neutral.dm"
#include "sandcode\code\game\area\ship_area.dm"
@@ -3519,6 +3520,7 @@
#include "sandcode\code\modules\mob\living\give.dm"
#include "sandcode\code\modules\mob\living\simple_animal\hostile\megafauna\drake.dm"
#include "sandcode\code\modules\mob\living\simple_animal\hostile\megafauna\sand.dm"
+#include "sandcode\code\modules\ninja\outfit.dm"
#include "sandcode\code\modules\power\port_gen.dm"
#include "sandcode\code\modules\projectiles\guns\ballistic\pistol.dm"
#include "sandcode\code\modules\reagents\chemistry\reagents\other_reagents.dm"