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+X}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"