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", "n