diff --git a/code/modules/client/preference_setup/general/02_language.dm b/code/modules/client/preference_setup/general/02_language.dm index 4a6bf5810f..7c16e4c306 100644 --- a/code/modules/client/preference_setup/general/02_language.dm +++ b/code/modules/client/preference_setup/general/02_language.dm @@ -11,12 +11,14 @@ S["extra_languages"] >> pref.extra_languages testing("LANGSANI: Loaded from [pref.client]'s character [pref.real_name || "-name not yet loaded-"] savefile: [english_list(pref.alternate_languages || list())]") S["language_prefixes"] >> pref.language_prefixes + S["language_custom_keys"] >> pref.language_custom_keys /datum/category_item/player_setup_item/general/language/save_character(var/savefile/S) S["language"] << pref.alternate_languages S["extra_languages"] << pref.extra_languages testing("LANGSANI: Saved to [pref.client]'s character [pref.real_name || "-name not yet loaded-"] savefile: [english_list(pref.alternate_languages || list())]") S["language_prefixes"] << pref.language_prefixes + S["language_custom_keys"] << pref.language_custom_keys /datum/category_item/player_setup_item/general/language/sanitize_character() if(!islist(pref.alternate_languages)) diff --git a/code/modules/mob/language/language.dm b/code/modules/mob/language/language.dm index 4cb01b981f..f2ddceb84b 100644 --- a/code/modules/mob/language/language.dm +++ b/code/modules/mob/language/language.dm @@ -192,6 +192,9 @@ /mob/proc/remove_language(var/rem_language) var/datum/language/L = GLOB.all_languages[rem_language] . = (L in languages) + var/prefix = get_custom_prefix_by_lang(src, L) + if(prefix) + language_keys.Remove(prefix) languages.Remove(L) /mob/living/remove_language(rem_language) @@ -240,7 +243,8 @@ for(var/datum/language/L in languages) if(!(L.flags & NONGLOBAL)) - . += "[L.name] ([get_language_prefix()][L.key])
[L.desc]

" + var/lang_key = get_custom_prefix_by_lang(src, L) + . += "[L.name] ([get_language_prefix()][L.key][lang_key ? " [get_language_prefix()][lang_key]" : ""])
[L.desc]

" /mob/living/check_lang_data() . = "" @@ -250,12 +254,13 @@ for(var/datum/language/L in languages) if(!(L.flags & NONGLOBAL)) + var/lang_key = get_custom_prefix_by_lang(src, L) if(L == default_language) - . += "[L.name] ([get_language_prefix()][L.key]) - default - reset
[L.desc]

" + . += "[L.name] ([get_language_prefix()][L.key][lang_key ? " [get_language_prefix()][lang_key]" : ""]) Edit Custom Key - default - reset
[L.desc]

" else if (can_speak(L)) - . += "[L.name] ([get_language_prefix()][L.key]) - set default
[L.desc]

" + . += "[L.name] ([get_language_prefix()][L.key][lang_key ? " [get_language_prefix()][lang_key]" : ""]) Edit Custom Key - set default
[L.desc]

" else - . += "[L.name] ([get_language_prefix()][L.key]) - cannot speak!
[L.desc]

" + . += "[L.name] ([get_language_prefix()][L.key][lang_key ? " [get_language_prefix()][lang_key]" : ""]) Edit Custom Key - cannot speak!
[L.desc]

" /mob/verb/check_languages() set name = "Check Known Languages" @@ -279,6 +284,16 @@ set_default_language(L) check_languages() return 1 + else if(href_list["set_lang_key"]) + var/datum/language/L = locate(href_list["set_lang_key"]) + if(L && (L in languages)) + var/old_key = get_custom_prefix_by_lang(src, L) + var/custom_key = tgui_input_text(src, "Input a new key for [L.name]", "Language Key", null) + if(custom_key && length(custom_key) == 1) + language_keys[custom_key] = L + if(old_key && old_key != custom_key) + language_keys.Remove(old_key) + check_languages() else return ..() @@ -287,5 +302,17 @@ if(L.flags & except_flags) continue target.add_language(L.name) + for(var/key in source.language_keys) + if(L == source.language_keys[key]) + if(!(key in target.language_keys)) + target.language_keys[key] = L + +/proc/get_custom_prefix_by_lang(var/mob/our_mob, var/language) + if(!our_mob || !our_mob.language_keys.len || !language) + return + + for(var/key in our_mob.language_keys) + if(our_mob.language_keys[key] == language) + return key #undef SCRAMBLE_CACHE_LEN diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index dc1f1fc219..86bc1989ce 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -94,6 +94,7 @@ var/list/pinned = list() // List of things pinning this creature to walls (see living_defense.dm) var/list/embedded = list() // Embedded items, since simple mobs don't have organs. var/list/languages = list() // For speaking/listening. + var/list/language_keys = list() // List of language keys indexed by language var/species_language = null // For species who want reset to use a specified default. var/only_species_language = 0 // For species who can only speak their default and no other languages. Does not affect understanding. var/list/speak_emote = list("says") // Verbs used when speaking. Defaults to 'say' if speak_emote is null. diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index 646c82a168..d3fcbe0a95 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -180,6 +180,8 @@ // Okay, we're definitely now trying to invoke a language (probably) // This "[]" is probably unnecessary but BYOND will runtime if a number is used var/datum/language/L = GLOB.language_keys["[language_key]"] + if(language_key in language_keys && language_keys[language_key]) + L = language_keys[language_key] // MULTILINGUAL_SPACE enforces a space after the language key if(client && (client.prefs.multilingual_mode == MULTILINGUAL_SPACE) && (text2ascii(copytext(selection, 3, 4)) != 32)) // If we're looking for a space and we don't find one diff --git a/vorestation.dme b/vorestation.dme index a0adcd3db9..f2a518448b 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -4159,6 +4159,6 @@ #include "maps\submaps\space_submaps\debrisfield\debrisfield.dm" #include "maps\submaps\surface_submaps\wilderness\wilderness.dm" #include "maps\submaps\surface_submaps\wilderness\wilderness_areas.dm" -#include "maps\tether\tether.dm" +#include "maps\virgo_minitest\virgo_minitest.dm" #include "maps\~map_system\maps.dm" // END_INCLUDE