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 "[tagdesc]" + +/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