mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-19 02:54:41 +01:00
Expands "genderless" to all species, adds body-type option, removes some gender checks (#23910)
* adds most body type support, removes some gender checks * remove gender from species, accessories * restore pick_list * re-adds limitations on accessories * Universal access to body hair * remove unused var * Update example config, some preference saving code * updates tgui bundle * oops * Remove formatting * hopefully undoes formatting changes * dammit * been meaning to fix this one for a while * dgamer reviews * move body_type into human_defines * sql file changes * update tgui * Update db code * bump versions --------- Co-authored-by: S34N <12197162+S34NW@users.noreply.github.com> Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com>
This commit is contained in:
@@ -61,7 +61,8 @@
|
||||
custom_emotes,
|
||||
physique,
|
||||
height,
|
||||
cyborg_brain_type
|
||||
cyborg_brain_type,
|
||||
body_type
|
||||
FROM characters WHERE ckey=:ckey"}, list(
|
||||
"ckey" = C.ckey
|
||||
))
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
var/real_name //our character's name
|
||||
var/be_random_name = FALSE //whether we are a random name every round
|
||||
var/gender = MALE //gender of character (well duh)
|
||||
var/body_type = MALE //body sprite variant
|
||||
var/age = 30 //age of character
|
||||
var/b_type = "A+" //blood type (not-chooseable)
|
||||
var/underwear = "Nude" //underwear type
|
||||
@@ -118,13 +119,13 @@
|
||||
|
||||
var/markingcolourslist = list2params(m_colours)
|
||||
var/markingstyleslist = list2params(m_styles)
|
||||
if(!isemptylist(organ_data))
|
||||
if(length(organ_data))
|
||||
organ_list = list2params(organ_data)
|
||||
if(!isemptylist(rlimb_data))
|
||||
if(length(rlimb_data))
|
||||
rlimb_list = list2params(rlimb_data)
|
||||
if(!isemptylist(player_alt_titles))
|
||||
if(length(player_alt_titles))
|
||||
playertitlelist = list2params(player_alt_titles)
|
||||
if(!isemptylist(loadout_gear))
|
||||
if(length(loadout_gear))
|
||||
gearlist = json_encode(loadout_gear)
|
||||
|
||||
var/datum/db_query/firstquery = SSdbcore.NewQuery("SELECT slot FROM characters WHERE ckey=:ckey ORDER BY slot", list(
|
||||
@@ -141,6 +142,7 @@
|
||||
real_name=:real_name,
|
||||
name_is_always_random=:be_random_name,
|
||||
gender=:gender,
|
||||
body_type=:body_type,
|
||||
age=:age,
|
||||
species=:species,
|
||||
language=:language,
|
||||
@@ -193,7 +195,8 @@
|
||||
hair_gradient_colour=:h_grad_colour,
|
||||
hair_gradient_alpha=:h_grad_alpha,
|
||||
custom_emotes=:custom_emotes,
|
||||
cyborg_brain_type=:cyborg_brain_type
|
||||
cyborg_brain_type=:cyborg_brain_type,
|
||||
body_type=:body_type
|
||||
WHERE ckey=:ckey
|
||||
AND slot=:slot"}, list(
|
||||
// OH GOD SO MANY PARAMETERS
|
||||
@@ -201,6 +204,7 @@
|
||||
"real_name" = real_name,
|
||||
"be_random_name" = be_random_name,
|
||||
"gender" = gender,
|
||||
"body_type" = body_type,
|
||||
"age" = age,
|
||||
"species" = species,
|
||||
"language" = language,
|
||||
@@ -294,7 +298,7 @@
|
||||
player_alt_titles,
|
||||
disabilities, organ_data, rlimb_data, nanotrasen_relation, physique, height, speciesprefs,
|
||||
socks, body_accessory, gear, autohiss,
|
||||
hair_gradient, hair_gradient_offset, hair_gradient_colour, hair_gradient_alpha, custom_emotes, cyborg_brain_type)
|
||||
hair_gradient, hair_gradient_offset, hair_gradient_colour, hair_gradient_alpha, custom_emotes, cyborg_brain_type, body_type)
|
||||
VALUES
|
||||
(:ckey, :slot, :metadata, :name, :be_random_name, :gender,
|
||||
:age, :species, :language,
|
||||
@@ -321,7 +325,7 @@
|
||||
:playertitlelist,
|
||||
:disabilities, :organ_list, :rlimb_list, :nanotrasen_relation, :physique, :height, :speciesprefs,
|
||||
:socks, :body_accessory, :gearlist, :autohiss_mode,
|
||||
:h_grad_style, :h_grad_offset, :h_grad_colour, :h_grad_alpha, :custom_emotes, :cyborg_brain_type)
|
||||
:h_grad_style, :h_grad_offset, :h_grad_colour, :h_grad_alpha, :custom_emotes, :cyborg_brain_type, :body_type)
|
||||
"}, list(
|
||||
// This has too many params for anyone to look at this without going insae
|
||||
"ckey" = C.ckey,
|
||||
@@ -330,6 +334,7 @@
|
||||
"name" = real_name,
|
||||
"be_random_name" = be_random_name,
|
||||
"gender" = gender,
|
||||
"body_type" = body_type,
|
||||
"age" = age,
|
||||
"species" = species,
|
||||
"language" = language,
|
||||
@@ -394,6 +399,10 @@
|
||||
return 1
|
||||
|
||||
|
||||
/**
|
||||
* Load in and process the database's information on the player's character save.
|
||||
* The order of indices here is the relative order from get_query() in 20-load-characters.dm.
|
||||
*/
|
||||
/datum/character_save/proc/load(datum/db_query/query)
|
||||
//Character
|
||||
metadata = query.item[1]
|
||||
@@ -471,6 +480,7 @@
|
||||
physique = query.item[56]
|
||||
height = query.item[57]
|
||||
cyborg_brain_type = query.item[58]
|
||||
body_type = query.item[59]
|
||||
|
||||
//Sanitize
|
||||
var/datum/species/SP = GLOB.all_species[species]
|
||||
@@ -504,7 +514,7 @@
|
||||
real_name = random_name(gender, species)
|
||||
|
||||
be_random_name = sanitize_integer(be_random_name, 0, 1, initial(be_random_name))
|
||||
gender = sanitize_gender(gender, FALSE, !SP.has_gender)
|
||||
gender = sanitize_gender(gender, FALSE)
|
||||
age = sanitize_integer(age, SP.min_age, SP.max_age, initial(age))
|
||||
h_colour = sanitize_hexcolor(h_colour)
|
||||
h_sec_colour = sanitize_hexcolor(h_sec_colour)
|
||||
@@ -590,9 +600,10 @@
|
||||
gender = gender_override
|
||||
else
|
||||
gender = pick(MALE, FEMALE)
|
||||
underwear = random_underwear(gender, species)
|
||||
undershirt = random_undershirt(gender, species)
|
||||
socks = random_socks(gender, species)
|
||||
body_type = pick(MALE, FEMALE)
|
||||
underwear = random_underwear(body_type, species)
|
||||
undershirt = random_undershirt(body_type, species)
|
||||
socks = random_socks(body_type, species)
|
||||
if(length(GLOB.body_accessory_by_species[species]))
|
||||
body_accessory = random_body_accessory(species, S.optional_body_accessory)
|
||||
if(S.bodyflags & (HAS_SKIN_TONE|HAS_ICON_SKIN_TONE))
|
||||
@@ -794,7 +805,8 @@
|
||||
qdel(preview_icon)
|
||||
|
||||
var/g = "m"
|
||||
if(gender == FEMALE) g = "f"
|
||||
if(body_type == FEMALE)
|
||||
g = "f"
|
||||
|
||||
var/icon/icobase
|
||||
var/datum/species/current_species = GLOB.all_species[species]
|
||||
@@ -1808,6 +1820,7 @@
|
||||
character.gen_record = gen_record
|
||||
|
||||
character.change_gender(gender)
|
||||
character.body_type = body_type // TODO does this update the character properly or do we need a setter here
|
||||
character.age = age
|
||||
|
||||
//Head-specific
|
||||
@@ -1885,10 +1898,10 @@
|
||||
character.backbag = backbag
|
||||
|
||||
//Debugging report to track down a bug, which randomly assigned the plural gender to people.
|
||||
if(character.dna.species.has_gender && (character.gender in list(PLURAL, NEUTER)))
|
||||
if(character.gender == NEUTER)
|
||||
if(isliving(src)) //Ghosts get neuter by default
|
||||
message_admins("[key_name_admin(character)] has spawned with their gender as plural or neuter. Please notify coders.")
|
||||
character.change_gender(MALE)
|
||||
message_admins("[key_name_admin(character)] has spawned with their gender as neuter. Please notify coders.")
|
||||
character.change_gender(PLURAL)
|
||||
|
||||
character.change_eye_color(e_colour, skip_icons = TRUE)
|
||||
character.original_eye_color = e_colour
|
||||
|
||||
@@ -168,13 +168,13 @@
|
||||
if(S.bodyflags & HAS_TAIL_MARKINGS) //Species with tail markings.
|
||||
active_character.m_colours["tail"] = rand_hex_color()
|
||||
if("underwear")
|
||||
active_character.underwear = random_underwear(active_character.gender, active_character.species)
|
||||
active_character.underwear = random_underwear(active_character.body_type, active_character.species)
|
||||
ShowChoices(user)
|
||||
if("undershirt")
|
||||
active_character.undershirt = random_undershirt(active_character.gender, active_character.species)
|
||||
active_character.undershirt = random_undershirt(active_character.body_type, active_character.species)
|
||||
ShowChoices(user)
|
||||
if("socks")
|
||||
active_character.socks = random_socks(active_character.gender, active_character.species)
|
||||
active_character.socks = random_socks(active_character.body_type, active_character.species)
|
||||
ShowChoices(user)
|
||||
if("eyes")
|
||||
active_character.e_colour = rand_hex_color()
|
||||
@@ -226,8 +226,6 @@
|
||||
return
|
||||
if(prev_species != active_character.species)
|
||||
active_character.age = clamp(active_character.age, NS.min_age, NS.max_age)
|
||||
if(NS.has_gender && active_character.gender == PLURAL)
|
||||
active_character.gender = pick(MALE,FEMALE)
|
||||
var/datum/robolimb/robohead
|
||||
if(NS.bodyflags & ALL_RPARTS)
|
||||
var/head_model = "[!active_character.rlimb_data["head"] ? "Morpheus Cyberkinetics" : active_character.rlimb_data["head"]]"
|
||||
@@ -265,15 +263,15 @@
|
||||
// Don't wear another species' underwear!
|
||||
var/datum/sprite_accessory/SA = GLOB.underwear_list[active_character.underwear]
|
||||
if(!SA || !(active_character.species in SA.species_allowed))
|
||||
active_character.underwear = random_underwear(active_character.gender, active_character.species)
|
||||
active_character.underwear = random_underwear(active_character.body_type, active_character.species)
|
||||
|
||||
SA = GLOB.undershirt_list[active_character.undershirt]
|
||||
if(!SA || !(active_character.species in SA.species_allowed))
|
||||
active_character.undershirt = random_undershirt(active_character.gender, active_character.species)
|
||||
active_character.undershirt = random_undershirt(active_character.body_type, active_character.species)
|
||||
|
||||
SA = GLOB.socks_list[active_character.socks]
|
||||
if(!SA || !(active_character.species in SA.species_allowed))
|
||||
active_character.socks = random_socks(active_character.gender, active_character.species)
|
||||
active_character.socks = random_socks(active_character.body_type, active_character.species)
|
||||
|
||||
//reset skin tone and colour
|
||||
if(NS.bodyflags & (HAS_SKIN_TONE|HAS_ICON_SKIN_TONE))
|
||||
@@ -579,10 +577,6 @@
|
||||
if(facialhairstyle == "Shaved") //Just in case.
|
||||
valid_facial_hairstyles += facialhairstyle
|
||||
continue
|
||||
if(active_character.gender == MALE && SA.gender == FEMALE)
|
||||
continue
|
||||
if(active_character.gender == FEMALE && SA.gender == MALE)
|
||||
continue
|
||||
if(S.bodyflags & ALL_RPARTS) //Species that can use prosthetic heads.
|
||||
var/head_model
|
||||
if(!active_character.rlimb_data["head"]) //Handle situations where the head is default.
|
||||
@@ -608,9 +602,10 @@
|
||||
var/list/valid_underwear = list()
|
||||
for(var/underwear in GLOB.underwear_list)
|
||||
var/datum/sprite_accessory/SA = GLOB.underwear_list[underwear]
|
||||
if(active_character.gender == MALE && SA.gender == FEMALE)
|
||||
// soon...
|
||||
if(active_character.body_type == MALE && SA.body_type == FEMALE)
|
||||
continue
|
||||
if(active_character.gender == FEMALE && SA.gender == MALE)
|
||||
if(active_character.body_type == FEMALE && SA.body_type == MALE)
|
||||
continue
|
||||
if(!(active_character.species in SA.species_allowed))
|
||||
continue
|
||||
@@ -624,12 +619,12 @@
|
||||
var/list/valid_undershirts = list()
|
||||
for(var/undershirt in GLOB.undershirt_list)
|
||||
var/datum/sprite_accessory/SA = GLOB.undershirt_list[undershirt]
|
||||
if(active_character.gender == MALE && SA.gender == FEMALE)
|
||||
continue
|
||||
if(active_character.gender == FEMALE && SA.gender == MALE)
|
||||
continue
|
||||
if(!(active_character.species in SA.species_allowed))
|
||||
continue
|
||||
if(active_character.body_type == MALE && SA.body_type == FEMALE)
|
||||
continue
|
||||
if(active_character.body_type == FEMALE && SA.body_type == MALE)
|
||||
continue
|
||||
valid_undershirts[undershirt] = GLOB.undershirt_list[undershirt]
|
||||
sortTim(valid_undershirts, GLOBAL_PROC_REF(cmp_text_asc))
|
||||
var/new_undershirt = tgui_input_list(user, "Choose your character's undershirt", "Character Preference", valid_undershirts)
|
||||
@@ -641,12 +636,12 @@
|
||||
var/list/valid_sockstyles = list()
|
||||
for(var/sockstyle in GLOB.socks_list)
|
||||
var/datum/sprite_accessory/SA = GLOB.socks_list[sockstyle]
|
||||
if(active_character.gender == MALE && SA.gender == FEMALE)
|
||||
continue
|
||||
if(active_character.gender == FEMALE && SA.gender == MALE)
|
||||
continue
|
||||
if(!(active_character.species in SA.species_allowed))
|
||||
continue
|
||||
if(active_character.body_type == MALE && SA.body_type == FEMALE)
|
||||
continue
|
||||
if(active_character.body_type == FEMALE && SA.body_type == MALE)
|
||||
continue
|
||||
valid_sockstyles[sockstyle] = GLOB.socks_list[sockstyle]
|
||||
sortTim(valid_sockstyles, GLOBAL_PROC_REF(cmp_text_asc))
|
||||
var/new_socks = tgui_input_list(user, "Choose your character's socks", "Character Preference", valid_sockstyles)
|
||||
@@ -896,23 +891,25 @@
|
||||
toggles ^= PREFTOGGLE_DONATOR_PUBLIC
|
||||
|
||||
if("gender")
|
||||
if(!S.has_gender)
|
||||
var/newgender = tgui_input_list(user, "Who are you?", "Choose Gender", list("Male", "Female", "Genderless"))
|
||||
if(!newgender)
|
||||
return
|
||||
switch(newgender)
|
||||
if("Male")
|
||||
active_character.gender = MALE
|
||||
if("Female")
|
||||
active_character.gender = FEMALE
|
||||
if("Genderless")
|
||||
active_character.gender = PLURAL
|
||||
else
|
||||
if(active_character.gender == MALE)
|
||||
active_character.gender = FEMALE
|
||||
else
|
||||
var/newgender = tgui_input_list(user, "Who are you?", "Choose Gender", list("Male", "Female", "Genderless"))
|
||||
if(!newgender)
|
||||
return
|
||||
switch(newgender)
|
||||
if("Male")
|
||||
|
||||
active_character.gender = MALE
|
||||
active_character.underwear = random_underwear(active_character.gender)
|
||||
if("Female")
|
||||
active_character.gender = FEMALE
|
||||
if("Genderless")
|
||||
active_character.gender = PLURAL
|
||||
|
||||
if("body_type")
|
||||
if(active_character.body_type == MALE)
|
||||
active_character.body_type = FEMALE
|
||||
else
|
||||
active_character.body_type = MALE
|
||||
|
||||
active_character.underwear = random_underwear(active_character.body_type)
|
||||
|
||||
if("hear_adminhelps")
|
||||
sound ^= SOUND_ADMINHELP
|
||||
|
||||
@@ -195,11 +195,12 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts
|
||||
dat += "</td></tr></table>"
|
||||
dat += "<table width='100%'><tr><td width='405px' height='200px' valign='top'>"
|
||||
dat += "<h2>Identity</h2>"
|
||||
dat += "<b>Gender:</b> <a href='byond://?_src_=prefs;preference=gender'>[active_character.gender == MALE ? "Male" : (active_character.gender == FEMALE ? "Female" : "Genderless")]</a>"
|
||||
dat += "<br>"
|
||||
dat += "<b>Age:</b> <a href='byond://?_src_=prefs;preference=age;task=input'>[active_character.age]</a><br>"
|
||||
dat += "<b>Body:</b> <a href='byond://?_src_=prefs;preference=all;task=random'>(®)</a><br>"
|
||||
dat += "<b>Species:</b> <a href='byond://?_src_=prefs;preference=species;task=input'>[active_character.species]</a><br>"
|
||||
dat += "<b>Gender:</b> <a href='byond://?_src_=prefs;preference=gender'>[active_character.gender == MALE ? "Male" : (active_character.gender == FEMALE ? "Female" : "Genderless")]</a><br>"
|
||||
dat += "<b>Body Type:</b> <a href='byond://?_src_=prefs;preference=body_type'>[active_character.body_type == MALE ? "Masculine" : "Feminine"]</a>"
|
||||
dat += "<br>"
|
||||
if(active_character.species == "Vox") // Purge these bastards
|
||||
dat += "<b>N2 Tank:</b> <a href='byond://?_src_=prefs;preference=speciesprefs;task=input'>[active_character.speciesprefs ? "Large N2 Tank" : "Specialized N2 Tank"]</a><br>"
|
||||
if(active_character.species == "Plasmaman")
|
||||
|
||||
Reference in New Issue
Block a user