From df0188662cf4739ccdf24aae08e27f697130edef Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Wed, 11 Nov 2015 09:34:14 +0100 Subject: [PATCH] Character setup tweaks. Adds client verb to access the character setup screen from anywhere. Moves name validation to species level, making it possible for IPCs to have numbers in their name. Adds gender validation, also adds support to add neuter/plural genders in the future if ever desired. Now sanitizes preferences before applying them to a mob. Fixes #11433. (cherry picked from commit e40246e9dfc9feb28b8c5a0a7ce765fd063c4f7e) --- code/_helpers/mobs.dm | 7 +++++++ code/modules/client/client procs.dm | 6 ++++++ .../client/preference_setup/general/01_basic.dm | 16 +++++++--------- .../client/preference_setup/preference_setup.dm | 17 +++++++++++++++++ code/modules/client/preferences.dm | 3 ++- code/modules/client/preferences_savefile.dm | 3 +++ .../mob/living/carbon/human/species/species.dm | 3 +++ .../carbon/human/species/station/station.dm | 3 +++ 8 files changed, 48 insertions(+), 10 deletions(-) diff --git a/code/_helpers/mobs.dm b/code/_helpers/mobs.dm index cb6cd511a5..6e2a7fae36 100644 --- a/code/_helpers/mobs.dm +++ b/code/_helpers/mobs.dm @@ -61,6 +61,13 @@ proc/random_facial_hair_style(gender, species = "Human") f_style = pick(valid_facialhairstyles) return f_style + +proc/sanitize_name(name, species = "Human") + var/datum/species/current_species + if(species) + current_species = all_species[species] + + return current_species ? current_species.sanitize_name(name) : sanitizeName(name) proc/random_name(gender, species = "Human") diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 875b6d4810..d3f71325eb 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -339,3 +339,9 @@ client/proc/MayRespawn() // Something went wrong, client is usually kicked or transfered to a new mob at this point return 0 + +client/verb/character_setup() + set name = "Character Setup" + set category = "Preferences" + if(prefs) + prefs.ShowChoices(usr) diff --git a/code/modules/client/preference_setup/general/01_basic.dm b/code/modules/client/preference_setup/general/01_basic.dm index 2e17707a69..440cf90e59 100644 --- a/code/modules/client/preference_setup/general/01_basic.dm +++ b/code/modules/client/preference_setup/general/01_basic.dm @@ -1,6 +1,7 @@ /datum/category_item/player_setup_item/general/basic name = "Basic" sort_order = 1 + var/list/valid_player_genders = list(MALE, FEMALE) /datum/category_item/player_setup_item/general/basic/load_character(var/savefile/S) S["real_name"] >> pref.real_name @@ -19,12 +20,13 @@ S["OOC_Notes"] << pref.metadata /datum/category_item/player_setup_item/general/basic/sanitize_character() - pref.real_name = sanitizeName(pref.real_name) + pref.age = sanitize_integer(pref.age, AGE_MIN, AGE_MAX, initial(pref.age)) + pref.gender = sanitize_inlist(pref.gender, valid_player_genders, pick(valid_player_genders)) + pref.real_name = sanitize_name(pref.real_name, pref.species) if(!pref.real_name) pref.real_name = random_name(pref.gender, pref.species) pref.spawnpoint = sanitize_inlist(pref.spawnpoint, spawntypes, initial(pref.spawnpoint)) pref.be_random_name = sanitize_integer(pref.be_random_name, 0, 1, initial(pref.be_random_name)) - pref.age = sanitize_integer(pref.age, AGE_MIN, AGE_MAX, initial(pref.age)) /datum/category_item/player_setup_item/general/basic/content() . = "Name: " @@ -32,7 +34,7 @@ . += "(Random Name) " . += "(Always Random Name: [pref.be_random_name ? "Yes" : "No"])" . += "
" - . += "Gender: [pref.gender == MALE ? "Male" : "Female"]
" + . += "Gender: [capitalize(lowertext(pref.gender))]
" . += "Age: [pref.age]
" . += "Spawn Point: [pref.spawnpoint]
" if(config.allow_Metadata) @@ -42,7 +44,7 @@ if(href_list["rename"]) var/raw_name = input(user, "Choose your character's name:", "Character Name") as text|null if (!isnull(raw_name) && CanUseTopic(user)) - var/new_name = sanitizeName(raw_name) + var/new_name = sanitize_name(raw_name, pref.species) if(new_name) pref.real_name = new_name return TOPIC_REFRESH @@ -59,10 +61,7 @@ return TOPIC_REFRESH else if(href_list["gender"]) - if(pref.gender == MALE) - pref.gender = FEMALE - else - pref.gender = MALE + pref.gender = next_in_list(pref.gender, valid_player_genders) return TOPIC_REFRESH else if(href_list["age"]) @@ -80,7 +79,6 @@ pref.spawnpoint = choice return TOPIC_REFRESH - else if(href_list["metadata"]) var/new_metadata = sanitize(input(user, "Enter any information you'd like others to see, such as Roleplay-preferences:", "Game Preference" , pref.metadata)) as message|null if(new_metadata && CanUseTopic(user)) diff --git a/code/modules/client/preference_setup/preference_setup.dm b/code/modules/client/preference_setup/preference_setup.dm index 9cb4f943f8..4ac42920ae 100644 --- a/code/modules/client/preference_setup/preference_setup.dm +++ b/code/modules/client/preference_setup/preference_setup.dm @@ -46,6 +46,10 @@ selected_category = null return ..() +/datum/category_collection/player_setup_collection/proc/sanitize_setup() + for(var/datum/category_group/player_setup_category/PS in categories) + PS.sanitize_setup() + /datum/category_collection/player_setup_collection/proc/load_character(var/savefile/S) for(var/datum/category_group/player_setup_category/PS in categories) PS.load_character(S) @@ -100,24 +104,37 @@ /datum/category_group/player_setup_category/dd_SortValue() return sort_order +/datum/category_group/player_setup_category/proc/sanitize_setup() + for(var/datum/category_item/player_setup_item/PI in items) + PI.sanitize_preferences() + for(var/datum/category_item/player_setup_item/PI in items) + PI.sanitize_character() + /datum/category_group/player_setup_category/proc/load_character(var/savefile/S) + // Load all data, then sanitize it. + // Need due to, for example, the 01_basic module relying on species having been loaded to sanitize correctly but that isn't loaded until module 03_body. for(var/datum/category_item/player_setup_item/PI in items) PI.load_character(S) + for(var/datum/category_item/player_setup_item/PI in items) PI.sanitize_character() /datum/category_group/player_setup_category/proc/save_character(var/savefile/S) + // Sanitize all data, then save it for(var/datum/category_item/player_setup_item/PI in items) PI.sanitize_character() + for(var/datum/category_item/player_setup_item/PI in items) PI.save_character(S) /datum/category_group/player_setup_category/proc/load_preferences(var/savefile/S) for(var/datum/category_item/player_setup_item/PI in items) PI.load_preferences(S) + for(var/datum/category_item/player_setup_item/PI in items) PI.sanitize_preferences() /datum/category_group/player_setup_category/proc/save_preferences(var/savefile/S) for(var/datum/category_item/player_setup_item/PI in items) PI.sanitize_preferences() + for(var/datum/category_item/player_setup_item/PI in items) PI.save_preferences(S) /datum/category_group/player_setup_category/proc/content(var/mob/user) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 61bf6939ff..66a029900b 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -113,7 +113,6 @@ datum/preferences /datum/preferences/New(client/C) player_setup = new(src) - gender = pick(MALE, FEMALE) real_name = random_name(gender,species) b_type = pick(4;"O-", 36;"O+", 3;"A-", 28;"A+", 1;"B-", 20;"B+", 1;"AB-", 5;"AB+") @@ -235,6 +234,8 @@ datum/preferences return 1 /datum/preferences/proc/copy_to(mob/living/carbon/human/character, safety = 0) + // Sanitizing rather than saving as someone might still be editing when copy_to occurs. + player_setup.sanitize_setup() if(be_random_name) real_name = random_name(gender,species) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 66709917e0..11e5857cba 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -85,6 +85,9 @@ player_setup.save_character(S) return 1 +/datum/preferences/proc/sanitize_preferences() + player_setup.sanitize_setup() + return 1 #undef SAVEFILE_VERSION_MAX #undef SAVEFILE_VERSION_MIN diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index d77493b0b3..d6e32722b1 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -198,6 +198,9 @@ if(covered) H << "[pick(heat_discomfort_strings)]" +/datum/species/proc/sanitize_name(var/name) + return sanitizeName(name) + /datum/species/proc/get_random_name(var/gender) if(!name_language) if(gender == FEMALE) diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm index e4c31a1447..e5b3ae6b0f 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -330,3 +330,6 @@ H.h_style = "" spawn(100) if(H) H.update_hair() + +/datum/species/machine/sanitize_name(var/name) + return sanitizeName(name, allow_numbers = 1)