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