diff --git a/code/_helpers/text.dm b/code/_helpers/text.dm
index 5aa80299c7..549060b0af 100644
--- a/code/_helpers/text.dm
+++ b/code/_helpers/text.dm
@@ -314,3 +314,19 @@ proc/TextPreview(var/string,var/len=40)
if(C && (C.prefs.toggles & CHAT_NOICONS))
return tagdesc
return "
"
+
+/proc/contains_az09(var/input)
+ for(var/i=1, i<=length(input), i++)
+ var/ascii_char = text2ascii(input,i)
+ switch(ascii_char)
+ // A .. Z
+ if(65 to 90) //Uppercase Letters
+ return 1
+ // a .. z
+ if(97 to 122) //Lowercase Letters
+ return 1
+
+ // 0 .. 9
+ if(48 to 57) //Numbers
+ return 1
+ return 0
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index f7fa88dc01..15945ab25a 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -691,7 +691,9 @@ var/list/gamemode_cache = list()
config.aggressive_changelog = 1
if("default_language_prefixes")
- language_prefixes = text2list(value, " ")
+ var/list/values = text2list(value, " ")
+ if(values.len > 0)
+ language_prefixes = values
else
log_misc("Unknown setting in configuration: '[name]'")
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 12bb317867..33dfc109e1 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -76,7 +76,7 @@ datum/preferences
var/species = "Human" //Species datum to use.
var/species_preview //Used for the species selection window.
var/list/alternate_languages = list() //Secondary language(s)
- var/list/alternate_language_prefixes = list() //Alternative language prefixes
+ var/list/language_prefixes = list() //Kanguage prefix keys
var/list/gear //Custom/fluff item loadout.
//Some faction information.
@@ -402,8 +402,11 @@ datum/preferences
dat += "- add ([S.num_alternate_languages - alternate_languages.len] remaining)
"
else
dat += "- [species] cannot choose secondary languages.
"
- dat += "
"
+ dat += "Language Keys
"
+ dat += " [english_list(language_prefixes, and_text = " ", comma_text = " ")] Change
"
+
+ dat += "
"
var/list/undies = gender == MALE ? underwear_m : underwear_f
dat += "Underwear: [get_key_by_value(undies,underwear)]
"
@@ -1176,6 +1179,24 @@ datum/preferences
if(new_lang)
alternate_languages |= new_lang
+ else if(href_list["preference"] == "language_prefix")
+ var/char
+ var/keys[0]
+ do
+ char = input("Enter a single special character.\nYou may re-select the same characters.\nBe aware that the following characters are already in use by radio: ; : .", "Enter Character - [3 - keys.len] remaining") as null|text
+ if(char)
+ if(length(char) > 1)
+ alert("Only single characters allowed.", "Error", "Ok")
+ else if(char in list(";", ":", "."))
+ alert("Radio character. Rejected.", "Error", "Ok")
+ else if(contains_az09(char))
+ alert("Non-special character. Rejected.", "Error", "Ok")
+ else
+ keys.Add(char)
+ while(char && keys.len < 3)
+
+ if(keys.len == 3)
+ language_prefixes = keys
switch(href_list["task"])
if("change")
if(href_list["preference"] == "species")
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 98c012962d..cc721a62ee 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -110,11 +110,11 @@
S["spawnpoint"] >> spawnpoint
S["language"] >> alternate_languages
- S["language_prefixes"] >> alternate_language_prefixes
+ S["language_prefixes"] >> language_prefixes
if(isnull(alternate_languages))
alternate_languages = list()
- if(isnull(alternate_language_prefixes))
- alternate_language_prefixes = config.language_prefixes.Copy()
+ if(isnull(language_prefixes) || !language_prefixes.len)
+ language_prefixes = config.language_prefixes.Copy()
if(!islist(alternate_languages))
if(client)
// Warn them that we (probably) just broke their languages
@@ -290,7 +290,7 @@
S["age"] << age
S["species"] << species
S["language"] << alternate_languages
- S["language_prefixes"] << alternate_language_prefixes
+ S["language_prefixes"] << language_prefixes
S["hair_red"] << r_hair
S["hair_green"] << g_hair
S["hair_blue"] << b_hair
diff --git a/code/modules/mob/language/language.dm b/code/modules/mob/language/language.dm
index 81c7a7b735..5898546f41 100644
--- a/code/modules/mob/language/language.dm
+++ b/code/modules/mob/language/language.dm
@@ -158,14 +158,14 @@
return (universal_speak || (speaking && speaking.flags & INNATE) || speaking in src.languages)
/mob/proc/get_language_prefix()
- if(client && client.prefs.alternate_language_prefixes && client.prefs.alternate_language_prefixes.len)
- return client.prefs.alternate_language_prefixes[1]
+ if(client && client.prefs.language_prefixes && client.prefs.language_prefixes.len)
+ return client.prefs.language_prefixes[1]
return config.language_prefixes[1]
/mob/proc/is_language_prefix(var/prefix)
- if(client && client.prefs.alternate_language_prefixes && client.prefs.alternate_language_prefixes.len)
- return prefix in client.prefs.alternate_language_prefixes
+ if(client && client.prefs.language_prefixes && client.prefs.language_prefixes.len)
+ return prefix in client.prefs.language_prefixes
return prefix in config.language_prefixes