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