Files
Bubberstation/code/modules/client/preferences/species_features/basic.dm
SkyratBot 52a70b1df4 [MIRROR] Adds informed default values for a bunch of preferences (to produce less outlandish random characters) (#28688)
* Adds informed default values for a bunch of preferences (to produce less outlandish random characters)

* Update felinid.dm

* Update lizard.dm

* Update monkey.dm

* [READY] the unfuckening of clothing rendering (#79784)

refactors clothing visors to use the same system, including masks being
toggled and stuff like riot helmets toggling using the same system and
welding helmets and such
adds a handler that updates all visuals in slots that an item has
obscured, each visual proc calls that so you no longer have weird shit
happening like having to hardcode a proc for heads where you need to
also update hair, mask, glasses everytime you put on an item

one thing here i could also do is make check_obscured_slots return the
HIDEX flags instead of item slots, because in 99% of cases its hardcoded
to be ran against specific slots (like eye code running it against the
glasses slot), but maintainers didnt seem to like that :/

fuck this 2003 bullshit

theres like several bugs here i fixed but i forgot them all and they are
small

---------

Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
Co-authored-by: SpaceLoveSs13 <68121607+SpaceLoveSs13@users.noreply.github.com>
2024-07-20 17:46:17 +05:30

228 lines
9.0 KiB
Plaintext

/proc/generate_icon_with_head_accessory(datum/sprite_accessory/sprite_accessory, y_offset = 0)
var/static/icon/head_icon
if (isnull(head_icon))
head_icon = icon('icons/mob/human/bodyparts_greyscale.dmi', "human_head_m")
head_icon.Blend(skintone2hex("caucasian1"), ICON_MULTIPLY)
var/icon/final_icon = new(head_icon)
if (!isnull(sprite_accessory))
ASSERT(istype(sprite_accessory))
var/icon/head_accessory_icon = icon(sprite_accessory.icon, sprite_accessory.icon_state)
if(y_offset)
head_accessory_icon.Shift(NORTH, y_offset)
head_accessory_icon.Blend(COLOR_DARK_BROWN, ICON_MULTIPLY)
final_icon.Blend(head_accessory_icon, ICON_OVERLAY)
final_icon.Crop(10, 19, 22, 31)
final_icon.Scale(32, 32)
return final_icon
/datum/preference/color/eye_color
priority = PREFERENCE_PRIORITY_BODYPARTS
savefile_key = "eye_color"
savefile_identifier = PREFERENCE_CHARACTER
category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
relevant_head_flag = HEAD_EYECOLOR
/datum/preference/color/eye_color/apply_to_human(mob/living/carbon/human/target, value)
var/hetero = target.eye_color_heterochromatic
target.eye_color_left = value
if(!hetero)
target.eye_color_right = value
var/obj/item/organ/internal/eyes/eyes_organ = target.get_organ_by_type(/obj/item/organ/internal/eyes)
if (!eyes_organ || !istype(eyes_organ))
return
if (!initial(eyes_organ.eye_color_left))
eyes_organ.eye_color_left = value
eyes_organ.old_eye_color_left = value
if(hetero) // Don't override the snowflakes please
return
if (!initial(eyes_organ.eye_color_right))
eyes_organ.eye_color_right = value
eyes_organ.old_eye_color_right = value
eyes_organ.refresh()
/datum/preference/color/eye_color/create_default_value()
return random_eye_color()
/datum/preference/choiced/facial_hairstyle
priority = PREFERENCE_PRORITY_LATE_BODY_TYPE
savefile_key = "facial_style_name"
savefile_identifier = PREFERENCE_CHARACTER
category = PREFERENCE_CATEGORY_FEATURES
main_feature_name = "Facial hair"
should_generate_icons = TRUE
relevant_head_flag = HEAD_FACIAL_HAIR
/datum/preference/choiced/facial_hairstyle/init_possible_values()
return assoc_to_keys_features(SSaccessories.facial_hairstyles_list)
/datum/preference/choiced/facial_hairstyle/icon_for(value)
return generate_icon_with_head_accessory(SSaccessories.facial_hairstyles_list[value])
/datum/preference/choiced/facial_hairstyle/apply_to_human(mob/living/carbon/human/target, value)
target.set_facial_hairstyle(value, update = FALSE)
/datum/preference/choiced/facial_hairstyle/create_default_value()
return /datum/sprite_accessory/facial_hair/shaved::name
/datum/preference/choiced/facial_hairstyle/create_informed_default_value(datum/preferences/preferences)
var/gender = preferences.read_preference(/datum/preference/choiced/gender)
var/species_type = preferences.read_preference(/datum/preference/choiced/species)
var/datum/species/species_real = GLOB.species_prototypes[species_type]
if(!gender || !species_real || !species_real.sexes)
return ..()
var/picked_beard = random_facial_hairstyle(gender)
var/datum/sprite_accessory/beard_style = SSaccessories.facial_hairstyles_list[picked_beard]
if(!beard_style || !beard_style.natural_spawn || beard_style.locked) // Invalid, go with god(bald)
return ..()
return picked_beard
/datum/preference/choiced/facial_hairstyle/compile_constant_data()
var/list/data = ..()
data[SUPPLEMENTAL_FEATURE_KEY] = /datum/preference/color/facial_hair_color::savefile_key
return data
/datum/preference/color/facial_hair_color
priority = PREFERENCE_PRORITY_LATE_BODY_TYPE // Need to happen after hair oclor is set so we can match by default
savefile_key = "facial_hair_color"
savefile_identifier = PREFERENCE_CHARACTER
category = PREFERENCE_CATEGORY_SUPPLEMENTAL_FEATURES
relevant_head_flag = HEAD_FACIAL_HAIR
/datum/preference/color/facial_hair_color/apply_to_human(mob/living/carbon/human/target, value)
target.set_facial_haircolor(value, update = FALSE)
/datum/preference/color/facial_hair_color/create_informed_default_value(datum/preferences/preferences)
return preferences.read_preference(/datum/preference/color/hair_color) || random_hair_color()
/datum/preference/choiced/facial_hair_gradient
priority = PREFERENCE_PRORITY_LATE_BODY_TYPE
category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
savefile_identifier = PREFERENCE_CHARACTER
savefile_key = "facial_hair_gradient"
relevant_head_flag = HEAD_FACIAL_HAIR
can_randomize = FALSE
/datum/preference/choiced/facial_hair_gradient/init_possible_values()
return assoc_to_keys_features(SSaccessories.facial_hair_gradients_list)
/datum/preference/choiced/facial_hair_gradient/apply_to_human(mob/living/carbon/human/target, value)
target.set_facial_hair_gradient_style(new_style = value, update = FALSE)
/datum/preference/choiced/facial_hair_gradient/create_default_value()
return /datum/sprite_accessory/gradient/none::name
/datum/preference/color/facial_hair_gradient
priority = PREFERENCE_PRORITY_LATE_BODY_TYPE
category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
savefile_identifier = PREFERENCE_CHARACTER
savefile_key = "facial_hair_gradient_color"
relevant_head_flag = HEAD_FACIAL_HAIR
/datum/preference/color/facial_hair_gradient/apply_to_human(mob/living/carbon/human/target, value)
target.set_facial_hair_gradient_color(new_color = value, update = FALSE)
/datum/preference/color/facial_hair_gradient/is_accessible(datum/preferences/preferences)
if (!..(preferences))
return FALSE
return preferences.read_preference(/datum/preference/choiced/facial_hair_gradient) != /datum/sprite_accessory/gradient/none::name
/datum/preference/color/hair_color
priority = PREFERENCE_PRIORITY_BODY_TYPE
savefile_key = "hair_color"
savefile_identifier = PREFERENCE_CHARACTER
category = PREFERENCE_CATEGORY_SUPPLEMENTAL_FEATURES
relevant_head_flag = HEAD_HAIR
/datum/preference/color/hair_color/apply_to_human(mob/living/carbon/human/target, value)
target.set_haircolor(value, update = FALSE)
/datum/preference/color/hair_color/create_informed_default_value(datum/preferences/preferences)
return random_hair_color()
/datum/preference/choiced/hairstyle
priority = PREFERENCE_PRIORITY_BODY_TYPE // Happens after gender so we can picka hairstyle based on that
savefile_key = "hairstyle_name"
savefile_identifier = PREFERENCE_CHARACTER
category = PREFERENCE_CATEGORY_FEATURES
main_feature_name = "Hairstyle"
should_generate_icons = TRUE
relevant_head_flag = HEAD_HAIR
/datum/preference/choiced/hairstyle/init_possible_values()
return assoc_to_keys_features(SSaccessories.hairstyles_list)
/datum/preference/choiced/hairstyle/icon_for(value)
var/datum/sprite_accessory/hair/hairstyle = SSaccessories.hairstyles_list[value]
return generate_icon_with_head_accessory(hairstyle, hairstyle?.y_offset)
/datum/preference/choiced/hairstyle/apply_to_human(mob/living/carbon/human/target, value)
target.set_hairstyle(value, update = FALSE)
/datum/preference/choiced/hairstyle/create_default_value()
return /datum/sprite_accessory/hair/bald::name
/datum/preference/choiced/hairstyle/create_informed_default_value(datum/preferences/preferences)
var/gender = preferences.read_preference(/datum/preference/choiced/gender)
var/species_type = preferences.read_preference(/datum/preference/choiced/species)
var/datum/species/species_real = GLOB.species_prototypes[species_type]
if(!gender || !species_real || !species_real.sexes)
return ..()
var/picked_hair = random_hairstyle(gender)
var/datum/sprite_accessory/hair_style = SSaccessories.hairstyles_list[picked_hair]
if(!hair_style || !hair_style.natural_spawn || hair_style.locked) // Invalid, go with god(bald)
return ..()
return picked_hair
/datum/preference/choiced/hairstyle/compile_constant_data()
var/list/data = ..()
data[SUPPLEMENTAL_FEATURE_KEY] = /datum/preference/color/hair_color::savefile_key
return data
/datum/preference/choiced/hair_gradient
priority = PREFERENCE_PRIORITY_BODY_TYPE
category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
savefile_identifier = PREFERENCE_CHARACTER
savefile_key = "hair_gradient"
relevant_head_flag = HEAD_HAIR
can_randomize = FALSE
/datum/preference/choiced/hair_gradient/init_possible_values()
return assoc_to_keys_features(SSaccessories.hair_gradients_list)
/datum/preference/choiced/hair_gradient/apply_to_human(mob/living/carbon/human/target, value)
target.set_hair_gradient_style(new_style = value, update = FALSE)
/datum/preference/choiced/hair_gradient/create_default_value()
return /datum/sprite_accessory/gradient/none::name
/datum/preference/color/hair_gradient
priority = PREFERENCE_PRIORITY_BODY_TYPE
category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
savefile_identifier = PREFERENCE_CHARACTER
savefile_key = "hair_gradient_color"
relevant_head_flag = HEAD_HAIR
/datum/preference/color/hair_gradient/apply_to_human(mob/living/carbon/human/target, value)
target.set_hair_gradient_color(new_color = value, update = FALSE)
/datum/preference/color/hair_gradient/is_accessible(datum/preferences/preferences)
if (!..(preferences))
return FALSE
return preferences.read_preference(/datum/preference/choiced/hair_gradient) != /datum/sprite_accessory/gradient/none::name