Merge pull request #1455 from Yoshax/gendertweak

Gender tweaks and adjustments
This commit is contained in:
Datraen
2016-05-05 10:18:25 -04:00
22 changed files with 156 additions and 53 deletions

View File

@@ -23,6 +23,9 @@ var/global/list/joblist = list() //list of all jobstypes, minus borg and AI
var/global/list/turfs = list() //list of all turfs var/global/list/turfs = list() //list of all turfs
#define all_genders_define_list list(MALE,FEMALE,PLURAL,NEUTER)
#define all_genders_text_list list("Male","Female","Plural","Neuter")
//Languages/species/whitelist. //Languages/species/whitelist.
var/global/list/all_species[0] var/global/list/all_species[0]
var/global/list/all_languages[0] var/global/list/all_languages[0]

View File

@@ -323,3 +323,5 @@ proc/TextPreview(var/string,var/len=40)
if(48 to 57) //Numbers if(48 to 57) //Numbers
return 1 return 1
return 0 return 0
#define gender2text(gender) capitalize(gender)

View File

@@ -1,3 +1,4 @@
/hook/startup/proc/createDatacore() /hook/startup/proc/createDatacore()
data_core = new /datum/datacore() data_core = new /datum/datacore()
return 1 return 1
@@ -186,7 +187,7 @@
G.fields["fingerprint"] = md5(H.dna.uni_identity) G.fields["fingerprint"] = md5(H.dna.uni_identity)
G.fields["p_stat"] = "Active" G.fields["p_stat"] = "Active"
G.fields["m_stat"] = "Stable" G.fields["m_stat"] = "Stable"
G.fields["sex"] = H.gender G.fields["sex"] = gender2text(H.gender)
G.fields["species"] = H.get_species() G.fields["species"] = H.get_species()
G.fields["home_system"] = H.home_system G.fields["home_system"] = H.home_system
G.fields["citizenship"] = H.citizenship G.fields["citizenship"] = H.citizenship
@@ -199,6 +200,7 @@
var/datum/data/record/M = CreateMedicalRecord(H.real_name, id) var/datum/data/record/M = CreateMedicalRecord(H.real_name, id)
M.fields["b_type"] = H.b_type M.fields["b_type"] = H.b_type
M.fields["b_dna"] = H.dna.unique_enzymes M.fields["b_dna"] = H.dna.unique_enzymes
M.fields["id_gender"] = gender2text(H.identifying_gender)
if(H.med_record && !jobban_isbanned(H, "Records")) if(H.med_record && !jobban_isbanned(H, "Records"))
M.fields["notes"] = H.med_record M.fields["notes"] = H.med_record
@@ -214,7 +216,8 @@
L.fields["rank"] = H.mind.assigned_role L.fields["rank"] = H.mind.assigned_role
L.fields["age"] = H.age L.fields["age"] = H.age
L.fields["fingerprint"] = md5(H.dna.uni_identity) L.fields["fingerprint"] = md5(H.dna.uni_identity)
L.fields["sex"] = H.gender L.fields["sex"] = gender2text(H.gender)
L.fields["id_gender"] = gender2text(H.identifying_gender)
L.fields["b_type"] = H.b_type L.fields["b_type"] = H.b_type
L.fields["b_dna"] = H.dna.unique_enzymes L.fields["b_dna"] = H.dna.unique_enzymes
L.fields["enzymes"] = H.dna.SE // Used in respawning L.fields["enzymes"] = H.dna.SE // Used in respawning
@@ -418,7 +421,7 @@
G.fields["id"] = id G.fields["id"] = id
G.fields["rank"] = "Unassigned" G.fields["rank"] = "Unassigned"
G.fields["real_rank"] = "Unassigned" G.fields["real_rank"] = "Unassigned"
G.fields["sex"] = "Male" G.fields["sex"] = "Unknown"
G.fields["age"] = "Unknown" G.fields["age"] = "Unknown"
G.fields["fingerprint"] = "Unknown" G.fields["fingerprint"] = "Unknown"
G.fields["p_stat"] = "Active" G.fields["p_stat"] = "Active"
@@ -460,6 +463,7 @@
M.fields["name"] = name M.fields["name"] = name
M.fields["b_type"] = "AB+" M.fields["b_type"] = "AB+"
M.fields["b_dna"] = md5(name) M.fields["b_dna"] = md5(name)
M.fields["id_gender"] = "Unknown"
M.fields["mi_dis"] = "None" M.fields["mi_dis"] = "None"
M.fields["mi_dis_d"] = "No minor disabilities have been declared." M.fields["mi_dis_d"] = "No minor disabilities have been declared."
M.fields["ma_dis"] = "None" M.fields["ma_dis"] = "None"

View File

@@ -49,11 +49,11 @@
/obj/machinery/computer/med_data/attack_hand(mob/user as mob) /obj/machinery/computer/med_data/attack_hand(mob/user as mob)
if(..()) if(..())
return return
var/dat var/dat = list()
if (src.temp) if (src.temp)
dat = text("<TT>[src.temp]</TT><BR><BR><A href='?src=\ref[src];temp=1'>Clear Screen</A>") dat += text("<TT>[src.temp]</TT><BR><BR><A href='?src=\ref[src];temp=1'>Clear Screen</A>")
else else
dat = text("Confirm Identity: <A href='?src=\ref[];scan=1'>[]</A><HR>", src, (src.scan ? text("[]", src.scan.name) : "----------")) dat += text("Confirm Identity: <A href='?src=\ref[];scan=1'>[]</A><HR>", src, (src.scan ? text("[]", src.scan.name) : "----------"))
if (src.authenticated) if (src.authenticated)
switch(src.screen) switch(src.screen)
if(1.0) if(1.0)
@@ -85,8 +85,12 @@
if ((istype(src.active1, /datum/data/record) && data_core.general.Find(src.active1))) if ((istype(src.active1, /datum/data/record) && data_core.general.Find(src.active1)))
dat += "<table><tr><td>Name: [active1.fields["name"]] \ dat += "<table><tr><td>Name: [active1.fields["name"]] \
ID: [active1.fields["id"]]<BR>\n \ ID: [active1.fields["id"]]<BR>\n \
Sex: <A href='?src=\ref[src];field=sex'>[active1.fields["sex"]]</A><BR>\n \ Sex: <A href='?src=\ref[src];field=sex'>[active1.fields["sex"]]</A><BR>\n"
Age: <A href='?src=\ref[src];field=age'>[active1.fields["age"]]</A><BR>\n \ if ((istype(src.active2, /datum/data/record) && data_core.medical.Find(src.active2)))
dat += "Gender identity: <A href='?src=\ref[src];field=id_gender'>[active2.fields["id_gender"]]</A><BR>"
else
dat += "Gender identity: <A href='?src=\ref[src];field=id_gender'>Unknown</A><BR>"
dat += "Age: <A href='?src=\ref[src];field=age'>[active1.fields["age"]]</A><BR>\n \
Fingerprint: <A href='?src=\ref[src];field=fingerprint'>[active1.fields["fingerprint"]]</A><BR>\n \ Fingerprint: <A href='?src=\ref[src];field=fingerprint'>[active1.fields["fingerprint"]]</A><BR>\n \
Physical Status: <A href='?src=\ref[src];field=p_stat'>[active1.fields["p_stat"]]</A><BR>\n \ Physical Status: <A href='?src=\ref[src];field=p_stat'>[active1.fields["p_stat"]]</A><BR>\n \
Mental Status: <A href='?src=\ref[src];field=m_stat'>[active1.fields["m_stat"]]</A><BR></td><td align = center valign = top> \ Mental Status: <A href='?src=\ref[src];field=m_stat'>[active1.fields["m_stat"]]</A><BR></td><td align = center valign = top> \
@@ -135,6 +139,7 @@
else else
else else
dat += text("<A href='?src=\ref[];login=1'>{Log In}</A>", src) dat += text("<A href='?src=\ref[];login=1'>{Log In}</A>", src)
dat = jointext(dat,null)
user << browse(text("<HEAD><TITLE>Medical Records</TITLE></HEAD><TT>[]</TT>", dat), "window=med_rec") user << browse(text("<HEAD><TITLE>Medical Records</TITLE></HEAD><TT>[]</TT>", dat), "window=med_rec")
onclose(user, "med_rec") onclose(user, "med_rec")
return return
@@ -249,10 +254,10 @@
src.active1.fields["fingerprint"] = t1 src.active1.fields["fingerprint"] = t1
if("sex") if("sex")
if (istype(src.active1, /datum/data/record)) if (istype(src.active1, /datum/data/record))
if (src.active1.fields["sex"] == "Male") src.active1.fields["sex"] = next_in_list(src.active1.fields["sex"], all_genders_text_list)
src.active1.fields["sex"] = "Female" if("id_gender")
else if (istype(src.active2, /datum/data/record))
src.active1.fields["sex"] = "Male" src.active2.fields["id_gender"] = next_in_list(src.active2.fields["id_gender"], all_genders_text_list)
if("age") if("age")
if (istype(src.active1, /datum/data/record)) if (istype(src.active1, /datum/data/record))
var/t1 = input("Please input age:", "Med. records", src.active1.fields["age"], null) as num var/t1 = input("Please input age:", "Med. records", src.active1.fields["age"], null) as num

View File

@@ -1,12 +1,20 @@
datum/preferences
var/biological_gender = MALE
var/identifying_gender = MALE
datum/preferences/proc/set_biological_gender(var/gender)
biological_gender = gender
identifying_gender = gender
/datum/category_item/player_setup_item/general/basic /datum/category_item/player_setup_item/general/basic
name = "Basic" name = "Basic"
sort_order = 1 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) /datum/category_item/player_setup_item/general/basic/load_character(var/savefile/S)
S["real_name"] >> pref.real_name S["real_name"] >> pref.real_name
S["name_is_always_random"] >> pref.be_random_name S["name_is_always_random"] >> pref.be_random_name
S["gender"] >> pref.gender S["gender"] >> pref.biological_gender
S["id_gender"] << pref.identifying_gender
S["age"] >> pref.age S["age"] >> pref.age
S["spawnpoint"] >> pref.spawnpoint S["spawnpoint"] >> pref.spawnpoint
S["OOC_Notes"] >> pref.metadata S["OOC_Notes"] >> pref.metadata
@@ -14,7 +22,8 @@
/datum/category_item/player_setup_item/general/basic/save_character(var/savefile/S) /datum/category_item/player_setup_item/general/basic/save_character(var/savefile/S)
S["real_name"] << pref.real_name S["real_name"] << pref.real_name
S["name_is_always_random"] << pref.be_random_name S["name_is_always_random"] << pref.be_random_name
S["gender"] << pref.gender S["gender"] << pref.biological_gender
S["id_gender"] << pref.identifying_gender
S["age"] << pref.age S["age"] << pref.age
S["spawnpoint"] << pref.spawnpoint S["spawnpoint"] << pref.spawnpoint
S["OOC_Notes"] << pref.metadata S["OOC_Notes"] << pref.metadata
@@ -23,10 +32,11 @@
if(!pref.species) pref.species = "Human" if(!pref.species) pref.species = "Human"
var/datum/species/S = all_species[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.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.biological_gender = sanitize_inlist(pref.biological_gender, S.genders, pick(S.genders))
pref.identifying_gender = (pref.identifying_gender in all_genders_define_list) ? pref.identifying_gender : pref.biological_gender
pref.real_name = sanitize_name(pref.real_name, pref.species) pref.real_name = sanitize_name(pref.real_name, pref.species)
if(!pref.real_name) if(!pref.real_name)
pref.real_name = random_name(pref.gender, pref.species) pref.real_name = random_name(pref.identifying_gender, pref.species)
pref.spawnpoint = sanitize_inlist(pref.spawnpoint, spawntypes, initial(pref.spawnpoint)) 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.be_random_name = sanitize_integer(pref.be_random_name, 0, 1, initial(pref.be_random_name))
@@ -36,13 +46,15 @@
. += "(<a href='?src=\ref[src];random_name=1'>Random Name</A>) " . += "(<a href='?src=\ref[src];random_name=1'>Random Name</A>) "
. += "(<a href='?src=\ref[src];always_random_name=1'>Always Random Name: [pref.be_random_name ? "Yes" : "No"]</a>)" . += "(<a href='?src=\ref[src];always_random_name=1'>Always Random Name: [pref.be_random_name ? "Yes" : "No"]</a>)"
. += "<br>" . += "<br>"
. += "<b>Gender:</b> <a href='?src=\ref[src];gender=1'><b>[capitalize(lowertext(pref.gender))]</b></a><br>" . += "<b>Biological Gender:</b> <a href='?src=\ref[src];bio_gender=1'><b>[gender2text(pref.biological_gender)]</b></a><br>"
. += "<b>Gender Identity:</b> <a href='?src=\ref[src];id_gender=1'><b>[gender2text(pref.identifying_gender)]</b></a><br>"
. += "<b>Age:</b> <a href='?src=\ref[src];age=1'>[pref.age]</a><br>" . += "<b>Age:</b> <a href='?src=\ref[src];age=1'>[pref.age]</a><br>"
. += "<b>Spawn Point</b>: <a href='?src=\ref[src];spawnpoint=1'>[pref.spawnpoint]</a><br>" . += "<b>Spawn Point</b>: <a href='?src=\ref[src];spawnpoint=1'>[pref.spawnpoint]</a><br>"
if(config.allow_Metadata) if(config.allow_Metadata)
. += "<b>OOC Notes:</b> <a href='?src=\ref[src];metadata=1'> Edit </a><br>" . += "<b>OOC Notes:</b> <a href='?src=\ref[src];metadata=1'> Edit </a><br>"
/datum/category_item/player_setup_item/general/basic/OnTopic(var/href,var/list/href_list, var/mob/user) /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"]) if(href_list["rename"])
var/raw_name = input(user, "Choose your character's name:", "Character Name") as text|null var/raw_name = input(user, "Choose your character's name:", "Character Name") as text|null
if (!isnull(raw_name) && CanUseTopic(user)) if (!isnull(raw_name) && CanUseTopic(user))
@@ -55,20 +67,27 @@
return TOPIC_NOACTION return TOPIC_NOACTION
else if(href_list["random_name"]) else if(href_list["random_name"])
pref.real_name = random_name(pref.gender, pref.species) pref.real_name = random_name(pref.identifying_gender, pref.species)
return TOPIC_REFRESH return TOPIC_REFRESH
else if(href_list["always_random_name"]) else if(href_list["always_random_name"])
pref.be_random_name = !pref.be_random_name pref.be_random_name = !pref.be_random_name
return TOPIC_REFRESH return TOPIC_REFRESH
else if(href_list["gender"]) else if(href_list["bio_gender"])
pref.gender = next_in_list(pref.gender, valid_player_genders) var/new_gender = input(user, "Choose your character's biological gender:", "Character Preference", pref.biological_gender) as null|anything in get_genders()
if(new_gender && CanUseTopic(user))
pref.set_biological_gender(new_gender)
return TOPIC_REFRESH
else if(href_list["id_gender"])
var/new_gender = input(user, "Choose your character's identifying gender:", "Character Preference", pref.identifying_gender) as null|anything in all_genders_define_list
if(new_gender && CanUseTopic(user))
pref.identifying_gender = new_gender
return TOPIC_REFRESH return TOPIC_REFRESH
else if(href_list["age"]) else if(href_list["age"])
if(!pref.species) pref.species = "Human" 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 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)) if(new_age && CanUseTopic(user))
pref.age = max(min(round(text2num(new_age)), S.max_age), S.min_age) pref.age = max(min(round(text2num(new_age)), S.max_age), S.min_age)
@@ -76,8 +95,8 @@
else if(href_list["spawnpoint"]) else if(href_list["spawnpoint"])
var/list/spawnkeys = list() var/list/spawnkeys = list()
for(var/S in spawntypes) for(var/spawntype in spawntypes)
spawnkeys += S spawnkeys += spawntype
var/choice = input(user, "Where would you like to spawn when late-joining?") as null|anything in spawnkeys 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 if(!choice || !spawntypes[choice] || !CanUseTopic(user)) return TOPIC_NOACTION
pref.spawnpoint = choice pref.spawnpoint = choice
@@ -90,3 +109,12 @@
return TOPIC_REFRESH return TOPIC_REFRESH
return ..() return ..()
/datum/category_item/player_setup_item/general/basic/proc/get_genders()
var/datum/species/S = all_species[pref.species]
var/list/possible_genders = S.genders
if(pref.organ_data[BP_TORSO] != "cyborg")
return possible_genders
possible_genders = possible_genders.Copy()
possible_genders |= NEUTER
return possible_genders

View File

@@ -191,7 +191,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
return mob_species && (mob_species.appearance_flags & flag) return mob_species && (mob_species.appearance_flags & flag)
/datum/category_item/player_setup_item/general/body/OnTopic(var/href,var/list/href_list, var/mob/user) /datum/category_item/player_setup_item/general/body/OnTopic(var/href,var/list/href_list, var/mob/user)
var/mob_species = all_species[pref.species] var/datum/species/mob_species = all_species[pref.species]
if(href_list["random"]) if(href_list["random"])
pref.randomize_appearance_for() pref.randomize_appearance_for()
@@ -220,13 +220,17 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
var/prev_species = pref.species var/prev_species = pref.species
pref.species = href_list["set_species"] pref.species = href_list["set_species"]
if(prev_species != pref.species) if(prev_species != pref.species)
if(!(pref.biological_gender in mob_species.genders))
pref.set_biological_gender(mob_species.genders[1])
//grab one of the valid hair styles for the newly chosen species //grab one of the valid hair styles for the newly chosen species
var/list/valid_hairstyles = list() var/list/valid_hairstyles = list()
for(var/hairstyle in hair_styles_list) for(var/hairstyle in hair_styles_list)
var/datum/sprite_accessory/S = hair_styles_list[hairstyle] var/datum/sprite_accessory/S = hair_styles_list[hairstyle]
if(pref.gender == MALE && S.gender == FEMALE) if(pref.biological_gender == MALE && S.gender == FEMALE)
continue continue
if(pref.gender == FEMALE && S.gender == MALE) if(pref.biological_gender == FEMALE && S.gender == MALE)
continue continue
if(!(pref.species in S.species_allowed)) if(!(pref.species in S.species_allowed))
continue continue
@@ -242,9 +246,9 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
var/list/valid_facialhairstyles = list() var/list/valid_facialhairstyles = list()
for(var/facialhairstyle in facial_hair_styles_list) for(var/facialhairstyle in facial_hair_styles_list)
var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle] var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle]
if(pref.gender == MALE && S.gender == FEMALE) if(pref.biological_gender == MALE && S.gender == FEMALE)
continue continue
if(pref.gender == FEMALE && S.gender == MALE) if(pref.biological_gender == FEMALE && S.gender == MALE)
continue continue
if(!(pref.species in S.species_allowed)) if(!(pref.species in S.species_allowed))
continue continue
@@ -336,9 +340,9 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
var/list/valid_facialhairstyles = list() var/list/valid_facialhairstyles = list()
for(var/facialhairstyle in facial_hair_styles_list) for(var/facialhairstyle in facial_hair_styles_list)
var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle] var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle]
if(pref.gender == MALE && S.gender == FEMALE) if(pref.biological_gender == MALE && S.gender == FEMALE)
continue continue
if(pref.gender == FEMALE && S.gender == MALE) if(pref.biological_gender == FEMALE && S.gender == MALE)
continue continue
if(!(pref.species in S.species_allowed)) if(!(pref.species in S.species_allowed))
continue continue

View File

@@ -25,7 +25,6 @@ datum/preferences
//character preferences //character preferences
var/real_name //our character's name var/real_name //our character's name
var/be_random_name = 0 //whether we are a random name every round var/be_random_name = 0 //whether we are a random name every round
var/gender = MALE //gender of character (well duh)
var/age = 30 //age of character var/age = 30 //age of character
var/spawnpoint = "Arrivals Shuttle" //where this character will spawn (0-2). var/spawnpoint = "Arrivals Shuttle" //where this character will spawn (0-2).
var/b_type = "A+" //blood type (not-chooseable) var/b_type = "A+" //blood type (not-chooseable)
@@ -120,8 +119,8 @@ datum/preferences
/datum/preferences/New(client/C) /datum/preferences/New(client/C)
player_setup = new(src) player_setup = new(src)
gender = pick(MALE, FEMALE) set_biological_gender(pick(MALE, FEMALE))
real_name = random_name(gender,species) real_name = random_name(identifying_gender,species)
b_type = pick(4;"O-", 36;"O+", 3;"A-", 28;"A+", 1;"B-", 20;"B+", 1;"AB-", 5;"AB+") b_type = pick(4;"O-", 36;"O+", 3;"A-", 28;"A+", 1;"B-", 20;"B+", 1;"AB-", 5;"AB+")
gear = list() gear = list()
@@ -255,7 +254,7 @@ datum/preferences
// Sanitizing rather than saving as someone might still be editing when copy_to occurs. // Sanitizing rather than saving as someone might still be editing when copy_to occurs.
player_setup.sanitize_setup() player_setup.sanitize_setup()
if(be_random_name) if(be_random_name)
real_name = random_name(gender,species) real_name = random_name(identifying_gender,species)
if(config.humans_need_surnames) if(config.humans_need_surnames)
var/firstspace = findtext(real_name, " ") var/firstspace = findtext(real_name, " ")
@@ -285,7 +284,8 @@ datum/preferences
character.gen_record = gen_record character.gen_record = gen_record
character.exploit_record = exploit_record character.exploit_record = exploit_record
character.gender = gender character.gender = biological_gender
character.identifying_gender = identifying_gender
character.age = age character.age = age
character.b_type = b_type character.b_type = b_type

View File

@@ -26,7 +26,7 @@
var/msg = "<span class='info'>*---------*\nThis is " var/msg = "<span class='info'>*---------*\nThis is "
var/datum/gender/T = gender_datums[gender] var/datum/gender/T = gender_datums[get_gender()]
if(skipjumpsuit && skipface) //big suits/masks/helmets make it hard to tell their gender if(skipjumpsuit && skipface) //big suits/masks/helmets make it hard to tell their gender
T = gender_datums[PLURAL] T = gender_datums[PLURAL]
else else

View File

@@ -1104,6 +1104,9 @@
if(species.holder_type) if(species.holder_type)
holder_type = species.holder_type holder_type = species.holder_type
if(!(gender in species.genders))
gender = species.genders[1]
icon_state = lowertext(species.name) icon_state = lowertext(species.name)
species.create_organs(src) species.create_organs(src)

View File

@@ -91,3 +91,5 @@
mob_bump_flag = HUMAN mob_bump_flag = HUMAN
mob_push_flags = ~HEAVY mob_push_flags = ~HEAVY
mob_swap_flags = ~HEAVY mob_swap_flags = ~HEAVY
var/identifying_gender // In case the human identifies as another gender than it's biological

View File

@@ -55,6 +55,8 @@
sum += H.ear_protection sum += H.ear_protection
return sum return sum
/mob/living/carbon/human/get_gender()
return identifying_gender ? identifying_gender : gender
#undef HUMAN_EATING_NO_ISSUE #undef HUMAN_EATING_NO_ISSUE
#undef HUMAN_EATING_NO_MOUTH #undef HUMAN_EATING_NO_MOUTH

View File

@@ -21,6 +21,8 @@
flags = NO_SCAN | NO_SLIP | NO_POISON | NO_MINOR_CUT flags = NO_SCAN | NO_SLIP | NO_POISON | NO_MINOR_CUT
spawn_flags = IS_RESTRICTED spawn_flags = IS_RESTRICTED
genders = list(NEUTER)
/datum/species/shadow/handle_death(var/mob/living/carbon/human/H) /datum/species/shadow/handle_death(var/mob/living/carbon/human/H)
spawn(1) spawn(1)
new /obj/effect/decal/cleanable/ash(H.loc) new /obj/effect/decal/cleanable/ash(H.loc)

View File

@@ -147,6 +147,8 @@
BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right) BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right)
) )
var/list/genders = list(MALE, FEMALE)
// Bump vars // Bump vars
var/bump_flag = HUMAN // What are we considered to be when bumped? var/bump_flag = HUMAN // What are we considered to be when bumped?
var/push_flags = ~HEAVY // What can we push? var/push_flags = ~HEAVY // What can we push?

View File

@@ -23,6 +23,8 @@
death_message = "becomes completely motionless..." death_message = "becomes completely motionless..."
genders = list(NEUTER)
/datum/species/golem/handle_post_spawn(var/mob/living/carbon/human/H) /datum/species/golem/handle_post_spawn(var/mob/living/carbon/human/H)
if(H.mind) if(H.mind)
H.mind.assigned_role = "Golem" H.mind.assigned_role = "Golem"

View File

@@ -44,6 +44,8 @@
BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/unbreakable) 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) /datum/species/slime/handle_death(var/mob/living/carbon/human/H)
spawn(1) spawn(1)
if(H) if(H)

View File

@@ -253,6 +253,7 @@
reagent_tag = IS_DIONA reagent_tag = IS_DIONA
genders = list(PLURAL)
/datum/species/diona/can_understand(var/mob/other) /datum/species/diona/can_understand(var/mob/other)
var/mob/living/carbon/alien/diona/D = other var/mob/living/carbon/alien/diona/D = other
if(istype(D)) if(istype(D))

View File

@@ -33,7 +33,7 @@
var/datum/preferences/p = speaker.client.prefs var/datum/preferences/p = speaker.client.prefs
name = p.real_name name = p.real_name
real_name = name real_name = name
gender = p.gender gender = p.identifying_gender
for(var/language in p.alternate_languages) for(var/language in p.alternate_languages)
add_language(language) add_language(language)

View File

@@ -127,7 +127,7 @@
observer.alpha = 127 observer.alpha = 127
if(client.prefs.be_random_name) if(client.prefs.be_random_name)
client.prefs.real_name = random_name(client.prefs.gender) client.prefs.real_name = random_name(client.prefs.identifying_gender)
observer.real_name = client.prefs.real_name observer.real_name = client.prefs.real_name
observer.name = observer.real_name observer.name = observer.real_name
if(!client.holder && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed. if(!client.holder && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed.
@@ -493,7 +493,7 @@
/mob/new_player/get_gender() /mob/new_player/get_gender()
if(!client || !client.prefs) ..() if(!client || !client.prefs) ..()
return client.prefs.gender return client.prefs.biological_gender
/mob/new_player/is_ready() /mob/new_player/is_ready()
return ready && ..() return ready && ..()

View File

@@ -1,8 +1,8 @@
/datum/preferences /datum/preferences
//The mob should have a gender you want before running this proc. Will run fine without H //The mob should have a gender you want before running this proc. Will run fine without H
/datum/preferences/proc/randomize_appearance_for(var/mob/living/carbon/human/H) /datum/preferences/proc/randomize_appearance_for(var/mob/living/carbon/human/H)
gender = pick(MALE, FEMALE) var/datum/species/current_species = all_species[species ? species : "Human"]
var/datum/species/current_species = all_species[species] set_biological_gender(pick(current_species.genders))
if(current_species) if(current_species)
if(current_species.flags & HAS_SKIN_TONE) if(current_species.flags & HAS_SKIN_TONE)
@@ -25,8 +25,8 @@
use_head_species = H.species.get_bodytype() use_head_species = H.species.get_bodytype()
if(use_head_species) if(use_head_species)
h_style = random_hair_style(gender, species) h_style = random_hair_style(biological_gender, species)
f_style = random_facial_hair_style(gender, species) f_style = random_facial_hair_style(biological_gender, species)
randomize_hair_color("hair") randomize_hair_color("hair")
randomize_hair_color("facial") randomize_hair_color("facial")
@@ -202,7 +202,7 @@
qdel(preview_icon) qdel(preview_icon)
var/g = "m" var/g = "m"
if(gender == FEMALE) g = "f" if(biological_gender == FEMALE) g = "f"
var/icon/icobase var/icon/icobase
var/datum/species/current_species = all_species[species] var/datum/species/current_species = all_species[species]

View File

@@ -27,10 +27,14 @@
cut_and_generate_data() cut_and_generate_data()
return 1 return 1
if(href_list["gender"]) if(href_list["gender"])
if(can_change(APPEARANCE_GENDER)) if(can_change(APPEARANCE_GENDER) && (href_list["gender"] in get_genders()))
if(owner.change_gender(href_list["gender"])) if(owner.change_gender(href_list["gender"]))
cut_and_generate_data() cut_and_generate_data()
return 1 return 1
if(href_list["gender_id"])
if(can_change(APPEARANCE_GENDER) && (href_list["gender_id"] in all_genders_define_list))
owner.identifying_gender = href_list["gender_id"]
return 1
if(href_list["skin_tone"]) if(href_list["skin_tone"])
if(can_change_skin_tone()) if(can_change_skin_tone())
var/new_s_tone = input(usr, "Choose your character's skin-tone:\n(Light 1 - 220 Dark)", "Skin Tone", -owner.s_tone + 35) as num|null var/new_s_tone = input(usr, "Choose your character's skin-tone:\n(Light 1 - 220 Dark)", "Skin Tone", -owner.s_tone + 35) as num|null
@@ -100,6 +104,7 @@
data["specimen"] = owner.species.name data["specimen"] = owner.species.name
data["gender"] = owner.gender data["gender"] = owner.gender
data["gender_id"] = owner.identifying_gender
data["change_race"] = can_change(APPEARANCE_RACE) data["change_race"] = can_change(APPEARANCE_RACE)
if(data["change_race"]) if(data["change_race"])
var/species[0] var/species[0]
@@ -108,6 +113,17 @@
data["species"] = species data["species"] = species
data["change_gender"] = can_change(APPEARANCE_GENDER) data["change_gender"] = can_change(APPEARANCE_GENDER)
if(data["change_gender"])
var/genders[0]
for(var/gender in get_genders())
genders[++genders.len] = list("gender_name" = gender2text(gender), "gender_key" = gender)
data["genders"] = genders
var/id_genders[0]
for(var/gender in all_genders_define_list)
id_genders[++id_genders.len] = list("gender_name" = gender2text(gender), "gender_key" = gender)
data["id_genders"] = id_genders
data["change_skin_tone"] = can_change_skin_tone() data["change_skin_tone"] = can_change_skin_tone()
data["change_skin_color"] = can_change_skin_color() data["change_skin_color"] = can_change_skin_color()
data["change_eye_color"] = can_change(APPEARANCE_EYE_COLOR) data["change_eye_color"] = can_change(APPEARANCE_EYE_COLOR)
@@ -163,3 +179,13 @@
if(!valid_hairstyles.len || !valid_facial_hairstyles.len) if(!valid_hairstyles.len || !valid_facial_hairstyles.len)
valid_hairstyles = owner.generate_valid_hairstyles(check_gender = 0) valid_hairstyles = owner.generate_valid_hairstyles(check_gender = 0)
valid_facial_hairstyles = owner.generate_valid_facial_hairstyles() valid_facial_hairstyles = owner.generate_valid_facial_hairstyles()
/datum/nano_module/appearance_changer/proc/get_genders()
var/datum/species/S = owner.species
var/list/possible_genders = S.genders
if(!owner.internal_organs_by_name["cell"])
return possible_genders
possible_genders = possible_genders.Copy()
possible_genders |= NEUTER
return possible_genders

View File

@@ -0,0 +1,4 @@
author: Yoshax
delete-after: True
changes:
- tweak"Splits gender into biological gender and gender identity. Biological gender modifies the sprite (for between male and female) and gender identity determines what pronouns show up when examined or suchlike. Both are displayed in medical records and such. "

View File

@@ -14,11 +14,22 @@
{{if data.change_gender}} {{if data.change_gender}}
<div class="item"> <div class="item">
<div class="itemLabelNarrow"> <div class="itemLabelNarrow">
Gender: Biological Gender:
</div> </div>
<div class="itemContentWide"> <div class="itemContentWide">
{{:helper.link('Male', null, { 'gender' : 'male'}, null, data.gender == 'male' ? 'selected' : null)}} {{for data.genders}}
{{:helper.link('Female', null, { 'gender' : 'female'}, null, data.gender == 'female' ? 'selected' : null)}} {{:helper.link(value.gender_name, null, { 'gender' : value.gender_key}, null, data.gender == value.gender_key ? 'selected' : null)}}
{{/for}}
</div>
<div class="item">
<div class="itemLabelNarrow">
Gender Identity:
</div>
<div class="itemContentWide">
{{for data.id_genders}}
{{:helper.link(value.gender_name, null, { 'gender_id' : value.gender_key}, null, data.gender_id == value.gender_key ? 'selected' : null)}}
{{/for}}
</div> </div>
</div> </div>
{{/if}} {{/if}}