mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-13 11:43:31 +00:00
Merge pull request #5511 from Anewbe/descriptors
Ports character physical descriptors from Bay
This commit is contained in:
@@ -39,6 +39,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
S["synth_markings"] >> pref.synth_markings
|
||||
pref.preview_icon = null
|
||||
S["bgstate"] >> pref.bgstate
|
||||
S["body_descriptors"] >> pref.body_descriptors
|
||||
|
||||
/datum/category_item/player_setup_item/general/body/save_character(var/savefile/S)
|
||||
S["species"] << pref.species
|
||||
@@ -68,6 +69,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
S["synth_blue"] << pref.b_synth
|
||||
S["synth_markings"] << pref.synth_markings
|
||||
S["bgstate"] << pref.bgstate
|
||||
S["body_descriptors"] << pref.body_descriptors
|
||||
|
||||
/datum/category_item/player_setup_item/general/body/sanitize_character(var/savefile/S)
|
||||
if(!pref.species || !(pref.species in playable_species))
|
||||
@@ -167,6 +169,21 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
if(O)
|
||||
O.markings[M] = list("color" = mark_color, "datum" = mark_datum)
|
||||
|
||||
var/list/last_descriptors = list()
|
||||
if(islist(pref.body_descriptors))
|
||||
last_descriptors = pref.body_descriptors.Copy()
|
||||
pref.body_descriptors = list()
|
||||
|
||||
var/datum/species/mob_species = all_species[pref.species]
|
||||
if(LAZYLEN(mob_species.descriptors))
|
||||
for(var/entry in mob_species.descriptors)
|
||||
var/datum/mob_descriptor/descriptor = mob_species.descriptors[entry]
|
||||
if(istype(descriptor))
|
||||
if(isnull(last_descriptors[entry]))
|
||||
pref.body_descriptors[entry] = descriptor.default_value // Species datums have initial default value.
|
||||
else
|
||||
pref.body_descriptors[entry] = Clamp(last_descriptors[entry], 1, LAZYLEN(descriptor.standalone_value_descriptors))
|
||||
|
||||
return
|
||||
|
||||
/datum/category_item/player_setup_item/general/body/content(var/mob/user)
|
||||
@@ -175,7 +192,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
pref.update_preview_icon()
|
||||
user << browse_rsc(pref.preview_icon, "previewicon.png")
|
||||
|
||||
var/mob_species = all_species[pref.species]
|
||||
var/datum/species/mob_species = all_species[pref.species]
|
||||
. += "<table><tr style='vertical-align:top'><td><b>Body</b> "
|
||||
. += "(<a href='?src=\ref[src];random=1'>®</A>)"
|
||||
. += "<br>"
|
||||
@@ -280,6 +297,13 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
else
|
||||
. += "<br><br>"
|
||||
|
||||
if(LAZYLEN(pref.body_descriptors))
|
||||
. += "<table>"
|
||||
for(var/entry in pref.body_descriptors)
|
||||
var/datum/mob_descriptor/descriptor = mob_species.descriptors[entry]
|
||||
. += "<tr><td><b>[capitalize(descriptor.chargen_label)]:</b></td><td>[descriptor.get_standalone_value_descriptor(pref.body_descriptors[entry])]</td><td><a href='?src=\ref[src];change_descriptor=[entry]'>Change</a><br/></td></tr>"
|
||||
. += "</table><br>"
|
||||
|
||||
. += "</td><td><b>Preview</b><br>"
|
||||
. += "<div class='statusDisplay'><center><img src=previewicon.png width=[pref.preview_icon.Width()] height=[pref.preview_icon.Height()]></center></div>"
|
||||
. += "<br><a href='?src=\ref[src];cycle_bg=1'>Cycle background</a>"
|
||||
@@ -329,6 +353,16 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
pref.randomize_appearance_and_body_for()
|
||||
return TOPIC_REFRESH_UPDATE_PREVIEW
|
||||
|
||||
else if(href_list["change_descriptor"])
|
||||
if(mob_species.descriptors)
|
||||
var/desc_id = href_list["change_descriptor"]
|
||||
if(pref.body_descriptors[desc_id])
|
||||
var/datum/mob_descriptor/descriptor = mob_species.descriptors[desc_id]
|
||||
var/choice = input("Please select a descriptor.", "Descriptor") as null|anything in descriptor.chargen_value_descriptors
|
||||
if(choice && mob_species.descriptors[desc_id]) // Check in case they sneakily changed species.
|
||||
pref.body_descriptors[desc_id] = descriptor.chargen_value_descriptors[choice]
|
||||
return TOPIC_REFRESH
|
||||
|
||||
else if(href_list["blood_type"])
|
||||
var/new_b_type = input(user, "Choose your character's blood-type:", "Character Preference") as null|anything in valid_bloodtypes
|
||||
if(new_b_type && CanUseTopic(user))
|
||||
|
||||
@@ -104,6 +104,8 @@ datum/preferences
|
||||
var/list/flavor_texts = list()
|
||||
var/list/flavour_texts_robot = list()
|
||||
|
||||
var/list/body_descriptors = list()
|
||||
|
||||
var/med_record = ""
|
||||
var/sec_record = ""
|
||||
var/gen_record = ""
|
||||
@@ -295,6 +297,10 @@ datum/preferences
|
||||
character.update_underwear()
|
||||
character.update_hair()
|
||||
|
||||
if(LAZYLEN(character.descriptors))
|
||||
for(var/entry in body_descriptors)
|
||||
character.descriptors[entry] = body_descriptors[entry]
|
||||
|
||||
/datum/preferences/proc/open_load_dialog(mob/user)
|
||||
var/dat = "<body>"
|
||||
dat += "<tt><center>"
|
||||
|
||||
107
code/modules/mob/living/carbon/human/descriptors/_descriptors.dm
Normal file
107
code/modules/mob/living/carbon/human/descriptors/_descriptors.dm
Normal file
@@ -0,0 +1,107 @@
|
||||
/*
|
||||
Small, mechanically supported physical customisation options.
|
||||
Also allows for per-species physical information ('his neck markings are more important than yours').
|
||||
ETA till a downstream ports this and adds boob and penis size: 2 days.
|
||||
*/
|
||||
|
||||
/mob/living/carbon/human/proc/show_descriptors_to(var/mob/user)
|
||||
if(LAZYLEN(descriptors))
|
||||
if(user == src)
|
||||
for(var/entry in descriptors)
|
||||
var/datum/mob_descriptor/descriptor = species.descriptors[entry]
|
||||
LAZYADD(., "[descriptor.get_first_person_message_start()] [descriptor.get_standalone_value_descriptor(descriptors[entry])].")
|
||||
else
|
||||
for(var/entry in descriptors)
|
||||
var/datum/mob_descriptor/descriptor = species.descriptors[entry]
|
||||
LAZYADD(., descriptor.get_comparative_value_descriptor(descriptors[entry], user, src))
|
||||
|
||||
/datum/mob_descriptor
|
||||
var/name // String ident.
|
||||
var/chargen_label // String ident for chargen.
|
||||
var/default_value // Initial value for this descriptor.
|
||||
var/comparison_offset = 0 // Used for examining similar properties between different species.
|
||||
var/comparative_value_descriptor_equivalent // String for looking at someone with roughly the same property.
|
||||
var/list/standalone_value_descriptors // String set for initial descriptor text.
|
||||
var/list/comparative_value_descriptors_smaller // String set for looking at someone smaller than you.
|
||||
var/list/comparative_value_descriptors_larger // String set for looking at someone larger than you.
|
||||
var/list/chargen_value_descriptors // Used for chargen selection of values in cases where there is a hidden meaning.
|
||||
var/skip_species_mention
|
||||
|
||||
/datum/mob_descriptor/New()
|
||||
if(!chargen_label)
|
||||
chargen_label = name
|
||||
if(!chargen_value_descriptors)
|
||||
chargen_value_descriptors = list()
|
||||
for(var/i = 1 to LAZYLEN(standalone_value_descriptors))
|
||||
chargen_value_descriptors[standalone_value_descriptors[i]] = i
|
||||
default_value = ceil(LAZYLEN(standalone_value_descriptors) * 0.5)
|
||||
..()
|
||||
|
||||
/datum/mob_descriptor/proc/get_third_person_message_start(var/datum/gender/my_gender)
|
||||
return "[my_gender.He] [my_gender.is]"
|
||||
|
||||
/datum/mob_descriptor/proc/get_first_person_message_start()
|
||||
return "You are"
|
||||
|
||||
/datum/mob_descriptor/proc/get_standalone_value_descriptor(var/check_value)
|
||||
if(isnull(check_value))
|
||||
check_value = default_value
|
||||
if(check_value && LAZYLEN(standalone_value_descriptors) >= check_value)
|
||||
return standalone_value_descriptors[check_value]
|
||||
|
||||
// Build a species-specific descriptor string.
|
||||
/datum/mob_descriptor/proc/get_initial_comparison_component(var/mob/me, var/datum/gender/my_gender, var/datum/gender/other_gender, var/my_value)
|
||||
var/species_text
|
||||
if(ishuman(me) && !skip_species_mention)
|
||||
var/mob/living/carbon/human/H = me
|
||||
var/use_name = "\improper [H.species.name]"
|
||||
species_text = " for \a [use_name]"
|
||||
. = "[get_third_person_message_start(my_gender)] [get_standalone_value_descriptor(my_value)][species_text]"
|
||||
|
||||
/datum/mob_descriptor/proc/get_secondary_comparison_component(var/datum/gender/my_gender, var/datum/gender/other_gender, var/my_value, var/comparing_value)
|
||||
var/raw_value = my_value
|
||||
my_value += comparison_offset
|
||||
var/variance = abs((my_value)-comparing_value)
|
||||
if(variance < 1)
|
||||
. = "[.], [get_comparative_value_string_equivalent(raw_value, my_gender, other_gender)]"
|
||||
else
|
||||
variance = variance / LAZYLEN(standalone_value_descriptors)
|
||||
if(my_value < comparing_value)
|
||||
. = "[.], [get_comparative_value_string_smaller(variance, my_gender, other_gender)]"
|
||||
else if(my_value > comparing_value)
|
||||
. = "[.], [get_comparative_value_string_larger(variance, my_gender, other_gender)]"
|
||||
|
||||
/datum/mob_descriptor/proc/get_comparative_value_descriptor(var/my_value, var/mob/observer, var/mob/me)
|
||||
|
||||
// Store our gender info for later.
|
||||
var/datum/gender/my_gender = gender_datums[me.get_gender()]
|
||||
var/datum/gender/other_gender = gender_datums[observer.get_gender()]
|
||||
|
||||
. = get_initial_comparison_component(me, my_gender, other_gender, my_value)
|
||||
|
||||
// Append the same-descriptor comparison text.
|
||||
var/comparing_value
|
||||
if(ishuman(observer))
|
||||
var/mob/living/carbon/human/human_observer = observer
|
||||
if(LAZYLEN(human_observer.descriptors) && !isnull(human_observer.species.descriptors[name]) && !isnull(human_observer.descriptors[name]))
|
||||
var/datum/mob_descriptor/obs_descriptor = human_observer.species.descriptors[name]
|
||||
comparing_value = human_observer.descriptors[name] + obs_descriptor.comparison_offset
|
||||
|
||||
if(. && !isnull(comparing_value))
|
||||
. = "[.][get_secondary_comparison_component(my_gender, other_gender, my_value, comparing_value)]"
|
||||
|
||||
// We're done, add a full stop.
|
||||
. = "[.]. "
|
||||
|
||||
/datum/mob_descriptor/proc/get_comparative_value_string_equivalent(var/my_value, var/datum/gender/my_gender, var/datum/gender/other_gender)
|
||||
return comparative_value_descriptor_equivalent
|
||||
|
||||
/datum/mob_descriptor/proc/get_comparative_value_string_smaller(var/value, var/datum/gender/my_gender, var/datum/gender/other_gender)
|
||||
var/maxval = LAZYLEN(comparative_value_descriptors_smaller)
|
||||
value = Clamp(ceil(value * maxval), 1, maxval)
|
||||
return comparative_value_descriptors_smaller[value]
|
||||
|
||||
/datum/mob_descriptor/proc/get_comparative_value_string_larger(var/value, var/datum/gender/my_gender, var/datum/gender/other_gender)
|
||||
var/maxval = LAZYLEN(comparative_value_descriptors_larger)
|
||||
value = Clamp(ceil(value * maxval), 1, maxval)
|
||||
return comparative_value_descriptors_larger[value]
|
||||
@@ -0,0 +1,45 @@
|
||||
/datum/mob_descriptor/height
|
||||
name = "height"
|
||||
standalone_value_descriptors = list(
|
||||
"very short",
|
||||
"short",
|
||||
"of average height",
|
||||
"tall",
|
||||
"very tall"
|
||||
)
|
||||
comparative_value_descriptor_equivalent = "around the same height as you"
|
||||
comparative_value_descriptors_smaller = list(
|
||||
"slightly shorter than you",
|
||||
"shorter than you",
|
||||
"much shorter than you",
|
||||
"tiny and insignificant next to you"
|
||||
)
|
||||
comparative_value_descriptors_larger = list(
|
||||
"slightly taller than you",
|
||||
"taller than you",
|
||||
"much taller than you",
|
||||
"towering over you"
|
||||
)
|
||||
|
||||
/datum/mob_descriptor/build
|
||||
name = "build"
|
||||
comparative_value_descriptor_equivalent = "around the same build as you"
|
||||
standalone_value_descriptors = list(
|
||||
"rail thin",
|
||||
"thin",
|
||||
"of average build",
|
||||
"broad-shouldered",
|
||||
"heavily built"
|
||||
)
|
||||
comparative_value_descriptors_smaller = list(
|
||||
"a bit smaller in build than you",
|
||||
"smaller in build than you",
|
||||
"much smaller in build than you",
|
||||
"dwarfed by your height"
|
||||
)
|
||||
comparative_value_descriptors_larger = list(
|
||||
"slightly larger than you in build",
|
||||
"built larger than you",
|
||||
"built much larger than you",
|
||||
"dwarfing you"
|
||||
)
|
||||
@@ -0,0 +1,27 @@
|
||||
/datum/mob_descriptor/headtail_length
|
||||
name = "headtail length"
|
||||
chargen_label = "headtails (gender)"
|
||||
skip_species_mention = TRUE
|
||||
standalone_value_descriptors = list(
|
||||
"short",
|
||||
"long"
|
||||
)
|
||||
chargen_value_descriptors = list(
|
||||
"short (male)" = 1,
|
||||
"long (female)" = 2
|
||||
)
|
||||
|
||||
/datum/mob_descriptor/headtail_length/get_first_person_message_start()
|
||||
. = "Your headtails are"
|
||||
|
||||
/datum/mob_descriptor/headtail_length/get_third_person_message_start(var/datum/gender/my_gender)
|
||||
. = "[my_gender.His] headtails are"
|
||||
|
||||
/datum/mob_descriptor/headtail_length/get_comparative_value_string_equivalent(var/my_value, var/datum/gender/my_gender, var/datum/gender/other_gender)
|
||||
. = "indicating [other_gender.he] [other_gender.is] [my_value == 1 ? "male" : "female"] like you"
|
||||
|
||||
/datum/mob_descriptor/headtail_length/get_comparative_value_string_smaller(var/value, var/datum/gender/my_gender, var/datum/gender/other_gender)
|
||||
. = "indicating [other_gender.he] [other_gender.is] male"
|
||||
|
||||
/datum/mob_descriptor/headtail_length/get_comparative_value_string_larger(var/value, var/datum/gender/my_gender, var/datum/gender/other_gender)
|
||||
. = "indicating [other_gender.he] [other_gender.is] female"
|
||||
@@ -0,0 +1,35 @@
|
||||
/datum/mob_descriptor/vox_markings
|
||||
name = "neck markings"
|
||||
chargen_label = "neck markings (rank)"
|
||||
skip_species_mention = TRUE
|
||||
standalone_value_descriptors = list(
|
||||
"very simplistic",
|
||||
"rather simple",
|
||||
"complex",
|
||||
"moderately complex",
|
||||
"bewilderingly complex"
|
||||
)
|
||||
chargen_value_descriptors = list(
|
||||
"servitor" = 1,
|
||||
"labourer" = 2,
|
||||
"cannon fodder" = 3,
|
||||
"raider" = 4,
|
||||
"leader" = 5
|
||||
)
|
||||
comparative_value_descriptor_equivalent = "around the same importance as yours"
|
||||
comparative_value_descriptors_smaller = list(
|
||||
"slightly less important than yours",
|
||||
"much less important than yours",
|
||||
"insignificant and beneath your notice"
|
||||
)
|
||||
comparative_value_descriptors_larger = list(
|
||||
"slightly more important than yours",
|
||||
"much more important than yours",
|
||||
"commanding your unquestioning obedience and respect"
|
||||
)
|
||||
|
||||
/datum/mob_descriptor/vox_markings/get_first_person_message_start()
|
||||
. = "Your neck markings are"
|
||||
|
||||
/datum/mob_descriptor/vox_markings/get_third_person_message_start(var/datum/gender/my_gender)
|
||||
. = "[my_gender.His] neck markings are"
|
||||
@@ -426,6 +426,10 @@
|
||||
pose = addtext(pose,".") //Makes sure all emotes end with a period.
|
||||
msg += "[T.He] [pose]"
|
||||
|
||||
var/show_descs = show_descriptors_to(user)
|
||||
if(show_descs)
|
||||
msg += "<span class='notice'>[jointext(show_descs, "<br>")]</span>"
|
||||
|
||||
to_chat(user, jointext(msg, null))
|
||||
|
||||
//Helper procedure. Called by /mob/living/carbon/human/examine() and /mob/living/carbon/human/Topic() to determine HUD access to security and medical records.
|
||||
|
||||
@@ -1148,6 +1148,15 @@
|
||||
|
||||
maxHealth = species.total_health
|
||||
|
||||
if(LAZYLEN(descriptors))
|
||||
descriptors = null
|
||||
|
||||
if(LAZYLEN(species.descriptors))
|
||||
descriptors = list()
|
||||
for(var/desctype in species.descriptors)
|
||||
var/datum/mob_descriptor.descriptor = species.descriptors[desctype]
|
||||
descriptors[desctype] = descriptor.default_value
|
||||
|
||||
spawn(0)
|
||||
if(regen_icons) regenerate_icons()
|
||||
make_blood()
|
||||
|
||||
@@ -99,6 +99,8 @@
|
||||
|
||||
var/identifying_gender // In case the human identifies as another gender than it's biological
|
||||
|
||||
var/list/descriptors // For comparative examine code
|
||||
|
||||
var/step_count = 0 // Track how many footsteps have been taken to know when to play footstep sounds
|
||||
|
||||
can_be_antagged = TRUE
|
||||
|
||||
@@ -81,6 +81,12 @@
|
||||
|
||||
genders = list(NEUTER)
|
||||
|
||||
descriptors = list(
|
||||
/datum/mob_descriptor/height = -1,
|
||||
/datum/mob_descriptor/build = 1,
|
||||
/datum/mob_descriptor/vox_markings = 0
|
||||
)
|
||||
|
||||
/datum/species/vox/get_random_name(var/gender)
|
||||
var/datum/language/species_language = all_languages[default_language]
|
||||
return species_language.get_random_name(gender)
|
||||
|
||||
@@ -221,12 +221,25 @@
|
||||
|
||||
var/pass_flags = 0
|
||||
|
||||
var/list/descriptors = list(
|
||||
/datum/mob_descriptor/height,
|
||||
/datum/mob_descriptor/build
|
||||
)
|
||||
|
||||
/datum/species/New()
|
||||
if(hud_type)
|
||||
hud = new hud_type()
|
||||
else
|
||||
hud = new()
|
||||
|
||||
// Prep the descriptors for the species
|
||||
if(LAZYLEN(descriptors))
|
||||
var/list/descriptor_datums = list()
|
||||
for(var/desctype in descriptors)
|
||||
var/datum/mob_descriptor/descriptor = new desctype
|
||||
descriptor_datums[descriptor.name] = descriptor
|
||||
descriptors = descriptor_datums
|
||||
|
||||
//If the species has eyes, they are the default vision organ
|
||||
if(!vision_organ && has_organ[O_EYES])
|
||||
vision_organ = O_EYES
|
||||
|
||||
@@ -137,6 +137,11 @@
|
||||
"Your scales bristle against the cold."
|
||||
)
|
||||
|
||||
descriptors = list(
|
||||
/datum/mob_descriptor/height = 2,
|
||||
/datum/mob_descriptor/build = 2
|
||||
)
|
||||
|
||||
/datum/species/unathi/equip_survival_gear(var/mob/living/carbon/human/H)
|
||||
..()
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H),slot_shoes)
|
||||
|
||||
@@ -1841,6 +1841,10 @@
|
||||
#include "code\modules\mob\living\carbon\human\stripping.dm"
|
||||
#include "code\modules\mob\living\carbon\human\unarmed_attack.dm"
|
||||
#include "code\modules\mob\living\carbon\human\update_icons.dm"
|
||||
#include "code\modules\mob\living\carbon\human\descriptors\_descriptors.dm"
|
||||
#include "code\modules\mob\living\carbon\human\descriptors\descriptors_generic.dm"
|
||||
#include "code\modules\mob\living\carbon\human\descriptors\descriptors_skrell.dm"
|
||||
#include "code\modules\mob\living\carbon\human\descriptors\descriptors_vox.dm"
|
||||
#include "code\modules\mob\living\carbon\human\species\species.dm"
|
||||
#include "code\modules\mob\living\carbon\human\species\species_attack.dm"
|
||||
#include "code\modules\mob\living\carbon\human\species\species_getters.dm"
|
||||
|
||||
Reference in New Issue
Block a user