diff --git a/code/_helpers/text.dm b/code/_helpers/text.dm
index 72549c9ee1..be836248a6 100644
--- a/code/_helpers/text.dm
+++ b/code/_helpers/text.dm
@@ -323,3 +323,5 @@ proc/TextPreview(var/string,var/len=40)
if(48 to 57) //Numbers
return 1
return 0
+
+#define gender2text(gender) capitalize(gender)
\ No newline at end of file
diff --git a/code/modules/client/preference_setup/general/01_basic.dm b/code/modules/client/preference_setup/general/01_basic.dm
index efd55d37ec..c9dfe4fc02 100644
--- a/code/modules/client/preference_setup/general/01_basic.dm
+++ b/code/modules/client/preference_setup/general/01_basic.dm
@@ -1,7 +1,6 @@
/datum/category_item/player_setup_item/general/basic
name = "Basic"
sort_order = 1
- var/list/valid_player_genders = list(MALE, FEMALE, NEUTER, PLURAL)
/datum/category_item/player_setup_item/general/basic/load_character(var/savefile/S)
S["real_name"] >> pref.real_name
@@ -23,7 +22,7 @@
if(!pref.species) pref.species = "Human"
var/datum/species/S = all_species[pref.species ? pref.species : "Human"]
pref.age = sanitize_integer(pref.age, S.min_age, S.max_age, initial(pref.age))
- pref.gender = sanitize_inlist(pref.gender, valid_player_genders, pick(valid_player_genders))
+ pref.gender = sanitize_inlist(pref.gender, S.genders, pick(S.genders))
pref.real_name = sanitize_name(pref.real_name, pref.species)
if(!pref.real_name)
pref.real_name = random_name(pref.gender, pref.species)
@@ -36,13 +35,14 @@
. += "(Random Name) "
. += "(Always Random Name: [pref.be_random_name ? "Yes" : "No"])"
. += "
"
- . += "Gender: [capitalize(lowertext(pref.gender))]
"
+ . += "Gender: [gender2text(pref.gender)]
"
. += "Age: [pref.age]
"
. += "Spawn Point: [pref.spawnpoint]
"
if(config.allow_Metadata)
. += "OOC Notes: Edit
"
/datum/category_item/player_setup_item/general/basic/OnTopic(var/href,var/list/href_list, var/mob/user)
+ var/datum/species/S = all_species[pref.species]
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))
@@ -63,12 +63,13 @@
return TOPIC_REFRESH
else if(href_list["gender"])
- pref.gender = next_in_list(pref.gender, valid_player_genders)
+ var/new_gender = input(user, "Choose your character's gender:", "Character Preference", pref.gender) as null|anything in S.genders
+ if(new_gender && CanUseTopic(user))
+ pref.gender = new_gender
return TOPIC_REFRESH
else if(href_list["age"])
if(!pref.species) pref.species = "Human"
- var/datum/species/S = all_species[pref.species]
var/new_age = input(user, "Choose your character's age:\n([S.min_age]-[S.max_age])", "Character Preference", pref.age) as num|null
if(new_age && CanUseTopic(user))
pref.age = max(min(round(text2num(new_age)), S.max_age), S.min_age)
@@ -76,8 +77,8 @@
else if(href_list["spawnpoint"])
var/list/spawnkeys = list()
- for(var/S in spawntypes)
- spawnkeys += S
+ for(var/spawntype in spawntypes)
+ spawnkeys += spawntype
var/choice = input(user, "Where would you like to spawn when late-joining?") as null|anything in spawnkeys
if(!choice || !spawntypes[choice] || !CanUseTopic(user)) return TOPIC_NOACTION
pref.spawnpoint = choice
diff --git a/code/modules/client/preference_setup/general/03_body.dm b/code/modules/client/preference_setup/general/03_body.dm
index db9fa5227d..4087d1468d 100644
--- a/code/modules/client/preference_setup/general/03_body.dm
+++ b/code/modules/client/preference_setup/general/03_body.dm
@@ -220,6 +220,11 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
var/prev_species = pref.species
pref.species = href_list["set_species"]
if(prev_species != pref.species)
+ mob_species = all_species[pref.species]
+ if(!(pref.gender in mob_species.genders))
+ pref.gender = mob_species.genders[1]
+
+
//grab one of the valid hair styles for the newly chosen species
var/list/valid_hairstyles = list()
for(var/hairstyle in hair_styles_list)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 74d8b54a93..0c11ada074 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1104,6 +1104,9 @@
if(species.holder_type)
holder_type = species.holder_type
+ if(!(gender in species.genders))
+ gender = species.genders[1]
+
icon_state = lowertext(species.name)
species.create_organs(src)
diff --git a/code/modules/mob/living/carbon/human/species/outsider/shadow.dm b/code/modules/mob/living/carbon/human/species/outsider/shadow.dm
index 8820ffaf5b..ba7d4d1d0a 100644
--- a/code/modules/mob/living/carbon/human/species/outsider/shadow.dm
+++ b/code/modules/mob/living/carbon/human/species/outsider/shadow.dm
@@ -21,6 +21,8 @@
flags = NO_SCAN | NO_SLIP | NO_POISON | NO_MINOR_CUT
spawn_flags = IS_RESTRICTED
+ genders = list(NEUTER)
+
/datum/species/shadow/handle_death(var/mob/living/carbon/human/H)
spawn(1)
new /obj/effect/decal/cleanable/ash(H.loc)
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index e8a8304510..fa7116c822 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -147,6 +147,8 @@
BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right)
)
+ var/list/genders = list(MALE, FEMALE, PLURAL)
+
// Bump vars
var/bump_flag = HUMAN // What are we considered to be when bumped?
var/push_flags = ~HEAVY // What can we push?
diff --git a/code/modules/mob/living/carbon/human/species/station/golem.dm b/code/modules/mob/living/carbon/human/species/station/golem.dm
index 23970c61b2..83d5f6f8f0 100644
--- a/code/modules/mob/living/carbon/human/species/station/golem.dm
+++ b/code/modules/mob/living/carbon/human/species/station/golem.dm
@@ -23,6 +23,8 @@
death_message = "becomes completely motionless..."
+ genders = list(NEUTER)
+
/datum/species/golem/handle_post_spawn(var/mob/living/carbon/human/H)
if(H.mind)
H.mind.assigned_role = "Golem"
diff --git a/code/modules/mob/living/carbon/human/species/station/slime.dm b/code/modules/mob/living/carbon/human/species/station/slime.dm
index f2277f9921..769b1a2f35 100644
--- a/code/modules/mob/living/carbon/human/species/station/slime.dm
+++ b/code/modules/mob/living/carbon/human/species/station/slime.dm
@@ -44,6 +44,8 @@
BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/unbreakable)
)
+ genders = list(NEUTER)
+
/datum/species/slime/handle_death(var/mob/living/carbon/human/H)
spawn(1)
if(H)
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 a00bfc86d7..07a623887b 100644
--- a/code/modules/mob/living/carbon/human/species/station/station.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station.dm
@@ -253,6 +253,7 @@
reagent_tag = IS_DIONA
+ genders = list(PLURAL)
/datum/species/diona/can_understand(var/mob/other)
var/mob/living/carbon/alien/diona/D = other
if(istype(D))
diff --git a/code/modules/nano/modules/human_appearance.dm b/code/modules/nano/modules/human_appearance.dm
index 87bfc76176..878a85ab55 100644
--- a/code/modules/nano/modules/human_appearance.dm
+++ b/code/modules/nano/modules/human_appearance.dm
@@ -27,7 +27,7 @@
cut_and_generate_data()
return 1
if(href_list["gender"])
- if(can_change(APPEARANCE_GENDER))
+ if(can_change(APPEARANCE_GENDER) && (href_list["gender"] in owner.species.genders))
if(owner.change_gender(href_list["gender"]))
cut_and_generate_data()
return 1
@@ -108,6 +108,12 @@
data["species"] = species
data["change_gender"] = can_change(APPEARANCE_GENDER)
+ if(data["change_gender"])
+ var/genders[0]
+ for(var/gender in owner.species.genders)
+ genders[++genders.len] = list("gender_name" = gender2text(gender), "gender_key" = gender)
+ data["genders"] = genders
+
data["change_skin_tone"] = can_change_skin_tone()
data["change_skin_color"] = can_change_skin_color()
data["change_eye_color"] = can_change(APPEARANCE_EYE_COLOR)
diff --git a/nano/templates/appearance_changer.tmpl b/nano/templates/appearance_changer.tmpl
index bb283f245b..3260f7f83f 100644
--- a/nano/templates/appearance_changer.tmpl
+++ b/nano/templates/appearance_changer.tmpl
@@ -17,8 +17,9 @@
Gender: