[MODULAR] Fixes bug where opening Game Preferences and then spawning causing you to be random human. Also SR bodypart prefs refactor (#16433)

* Fixes opening Game Options and then spawning making you random

* Refactors mutant and cursed char prefs to not require running is_available first()

* oop

* minor cleanup of eye emissive application

* Update modular_skyrat/master_files/code/modules/client/preferences/_preference.dm

Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com>

* Fixes people getting digitigrade legs when they shouldn't be

* accidental false return

* Make vox bodycolor option only appear when a Vox Primalis

* Remove option to change legs on teshari - they never have had 2 leg types

* Digi legs pref now only appears and applies for digi optional species

Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com>
Co-authored-by: GoldenAlpharex <jerego1234@hotmail.com>
This commit is contained in:
Tastyfish
2022-10-11 16:09:30 -04:00
committed by GitHub
co-authored by GoldenAlpharex GoldenAlpharex
parent f51e4124ad
commit 50dda74fc2
7 changed files with 316 additions and 800 deletions
+5 -4
View File
@@ -538,13 +538,14 @@ GLOBAL_LIST_EMPTY(preferences_datums)
for (var/datum/preference/preference as anything in get_preferences_in_priority_order())
if (preference.savefile_identifier != PREFERENCE_CHARACTER)
continue
// SKYRAT EDIT
if(preference.is_accessible(src)) // Only apply preferences you can actually access.
preference.apply_to_human(character, read_preference(preference.type), src)
preference.apply_to_human(character, read_preference(preference.type), src)
// SKYRAT EDIT ADDITION START - middleware apply human prefs
for (var/datum/preference_middleware/preference_middleware as anything in middleware)
preference_middleware.apply_to_human(character, src)
// SKYRAT EDIT END
// SKYRAT EDIT ADDITION END
character.dna.real_name = character.real_name
if(icon_updates)
@@ -75,3 +75,87 @@
if(!target.dna.mutant_bodyparts[relevant_mutant_bodypart])
target.dna.mutant_bodyparts[relevant_mutant_bodypart] = list(MUTANT_INDEX_NAME = "None", MUTANT_INDEX_COLOR_LIST = list("#FFFFFF", "#FFFFFF", "#FFFFFF"), MUTANT_INDEX_EMISSIVE_LIST = list(FALSE, FALSE, FALSE))
target.dna.mutant_bodyparts[relevant_mutant_bodypart][MUTANT_INDEX_EMISSIVE_LIST] = list(sanitize_integer(value[1]), sanitize_integer(value[2]), sanitize_integer(value[3]))
/**
* Base class for character feature togglers
*/
/datum/preference/toggle/mutant_toggle
abstract_type = /datum/preference/toggle/mutant_toggle
category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
savefile_identifier = PREFERENCE_CHARACTER
default_value = FALSE
/// The linked preferences to this toggle. Automatically filled.
var/list/linked_preference_paths = list()
/datum/preference/toggle/mutant_toggle/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences)
return TRUE // we dont actually want this to do anything
/datum/preference/toggle/mutant_toggle/is_accessible(datum/preferences/preferences)
var/passed_initial_check = ..(preferences)
var/allowed = preferences.read_preference(/datum/preference/toggle/allow_mismatched_parts)
return passed_initial_check || allowed
/**
* Base class for choices character features, mainly mutant body parts
*/
/datum/preference/choiced/mutant_choice
abstract_type = /datum/preference/choiced/mutant_choice
category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
savefile_identifier = PREFERENCE_CHARACTER
/// Path to the default sprite accessory
var/datum/sprite_accessory/default_accessory_type
/// Path to the corresponding /datum/preference/toggle to check if part is enabled.
var/datum/preference/toggle/type_to_check
/datum/preference/choiced/mutant_choice/is_accessible(datum/preferences/preferences)
var/passed_initial_check = ..(preferences)
var/overriding = preferences.read_preference(/datum/preference/toggle/allow_mismatched_parts)
var/part_enabled = is_part_enabled(preferences)
return (passed_initial_check || overriding) && part_enabled
/datum/preference/choiced/mutant_choice/init_possible_values()
return assoc_to_keys(GLOB.sprite_accessories[relevant_mutant_bodypart])
/datum/preference/choiced/mutant_choice/create_default_value()
return initial(default_accessory_type?.name) || "None"
/**
* Is this part enabled by the player?
*
* Arguments:
* * preferences - The relevant character preferences.
*/
/datum/preference/choiced/mutant_choice/proc/is_part_enabled(datum/preferences/preferences)
return preferences.read_preference(type_to_check)
/**
* Actually rendered. Slimmed down version of the logic in is_available() that actually works when spawning or drawing the character.
*
* Returns if feature is visible.
*
* Arguments:
* * target - The character this is being applied to.
* * preferences - The relevant character preferences.
*/
/datum/preference/choiced/mutant_choice/proc/is_visible(mob/living/carbon/human/target, datum/preferences/preferences)
var/species_type = preferences.read_preference(/datum/preference/choiced/species)
var/datum/species/species = new species_type
var/species_available = (savefile_key in species.get_features())
var/overriding = preferences.read_preference(/datum/preference/toggle/allow_mismatched_parts)
var/part_enabled = is_part_enabled(preferences)
return (species_available || overriding) && part_enabled
/datum/preference/choiced/mutant_choice/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences)
if(!preferences || !is_visible(target, preferences))
value = create_default_value()
if(!target.dna.mutant_bodyparts[relevant_mutant_bodypart])
target.dna.mutant_bodyparts[relevant_mutant_bodypart] = list(MUTANT_INDEX_NAME = value, MUTANT_INDEX_COLOR_LIST = list("#FFFFFF", "#FFFFFF", "#FFFFFF"), MUTANT_INDEX_EMISSIVE_LIST = list(FALSE, FALSE, FALSE))
return TRUE
target.dna.mutant_bodyparts[relevant_mutant_bodypart][MUTANT_INDEX_NAME] = value
return TRUE
@@ -7,10 +7,20 @@
savefile_identifier = PREFERENCE_CHARACTER
abstract_type = /datum/preference/choiced/genital
/// Path to the default sprite accessory
var/datum/sprite_accessory/default_accessory_type
/datum/preference/choiced/genital/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences)
if(!preferences || !is_visible(target, preferences))
value = create_default_value()
. = FALSE
if(!target.dna.mutant_bodyparts[relevant_mutant_bodypart])
target.dna.mutant_bodyparts[relevant_mutant_bodypart] = list("name" = "None", "color" = list("#FFFFFF", "#FFFFFF", "#FFFFFF"))
target.dna.mutant_bodyparts[relevant_mutant_bodypart]["name"] = value
target.dna.mutant_bodyparts[relevant_mutant_bodypart] = list(MUTANT_INDEX_NAME = value, MUTANT_INDEX_COLOR_LIST = list("#FFFFFF", "#FFFFFF", "#FFFFFF"), MUTANT_INDEX_EMISSIVE_LIST = list(FALSE, FALSE, FALSE))
return TRUE
target.dna.mutant_bodyparts[relevant_mutant_bodypart][MUTANT_INDEX_NAME] = value
return TRUE
/datum/preference/choiced/genital/is_accessible(datum/preferences/preferences)
if(CONFIG_GET(flag/disable_erp_preferences))
@@ -20,6 +30,27 @@
var/erp_allowed = preferences.read_preference(/datum/preference/toggle/master_erp_preferences)
return erp_allowed && (passed_initial_check || allowed)
/**
* Actually rendered. Slimmed down version of the logic in is_available() that actually works when spawning or drawing the character.
*
* Returns if feature is visible.
*
* Arguments:
* * The character this is being applied to.
* * preferences - The relevant character preferences.
*/
/datum/preference/choiced/genital/proc/is_visible(mob/living/carbon/human/target, datum/preferences/preferences)
var/species_type = preferences.read_preference(/datum/preference/choiced/species)
var/datum/species/species = new species_type
var/species_available = (savefile_key in species.get_features())
var/overriding = preferences.read_preference(/datum/preference/toggle/allow_mismatched_parts)
var/erp_allowed = preferences.read_preference(/datum/preference/toggle/master_erp_preferences)
return (species_available || overriding) && erp_allowed
/datum/preference/choiced/genital/create_default_value()
return initial(default_accessory_type?.name) || "None"
/datum/preference/choiced/genital/init_possible_values()
return assoc_to_keys(GLOB.sprite_accessories[relevant_mutant_bodypart])
@@ -100,10 +131,7 @@
/datum/preference/choiced/genital/penis
savefile_key = "feature_penis"
relevant_mutant_bodypart = ORGAN_SLOT_PENIS
/datum/preference/choiced/genital/penis/create_default_value()
var/datum/sprite_accessory/genital/penis/none/default = /datum/sprite_accessory/genital/penis/none
return initial(default.name)
default_accessory_type = /datum/sprite_accessory/genital/penis/none
/datum/preference/toggle/genital_skin_tone/penis
savefile_key = "penis_skin_tone"
@@ -221,10 +249,7 @@
/datum/preference/choiced/genital/testicles
savefile_key = "feature_testicles"
relevant_mutant_bodypart = ORGAN_SLOT_TESTICLES
/datum/preference/choiced/genital/testicles/create_default_value()
var/datum/sprite_accessory/genital/testicles/none/default = /datum/sprite_accessory/genital/testicles/none
return initial(default.name)
default_accessory_type = /datum/sprite_accessory/genital/testicles/none
/datum/preference/toggle/genital_skin_tone/testicles
savefile_key = "testicles_skin_tone"
@@ -280,6 +305,7 @@
/datum/preference/choiced/genital/vagina
savefile_key = "feature_vagina"
relevant_mutant_bodypart = ORGAN_SLOT_VAGINA
default_accessory_type = /datum/sprite_accessory/genital/vagina/none
/datum/preference/toggle/genital_skin_tone/vagina
savefile_key = "vagina_skin_tone"
@@ -297,10 +323,6 @@
/datum/preference/toggle/genital_skin_color/vagina/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences)
target.dna.features["vagina_uses_skincolor"] = value
/datum/preference/choiced/genital/vagina/create_default_value()
var/datum/sprite_accessory/genital/vagina/none/default = /datum/sprite_accessory/genital/vagina/none
return initial(default.name)
/datum/preference/tri_color/genital/vagina
savefile_key = "vagina_color"
relevant_mutant_bodypart = ORGAN_SLOT_VAGINA
@@ -318,20 +340,14 @@
/datum/preference/choiced/genital/womb
savefile_key = "feature_womb"
relevant_mutant_bodypart = ORGAN_SLOT_WOMB
/datum/preference/choiced/genital/womb/create_default_value()
var/datum/sprite_accessory/genital/womb/none/default = /datum/sprite_accessory/genital/womb/none
return initial(default.name)
default_accessory_type = /datum/sprite_accessory/genital/womb/none
// BREASTS
/datum/preference/choiced/genital/breasts
savefile_key = "feature_breasts"
relevant_mutant_bodypart = ORGAN_SLOT_BREASTS
/datum/preference/choiced/genital/breasts/create_default_value()
var/datum/sprite_accessory/genital/breasts/none/default = /datum/sprite_accessory/genital/breasts/none
return initial(default.name)
default_accessory_type = /datum/sprite_accessory/genital/breasts/none
/datum/preference/toggle/genital_skin_tone/breasts
savefile_key = "breasts_skin_tone"
@@ -405,7 +421,4 @@
/datum/preference/choiced/genital/anus
savefile_key = "feature_anus"
relevant_mutant_bodypart = ORGAN_SLOT_ANUS
/datum/preference/choiced/genital/anus/create_default_value()
var/datum/sprite_accessory/genital/anus/none/default = /datum/sprite_accessory/genital/anus/none
return initial(default.name)
default_accessory_type = /datum/sprite_accessory/genital/anus/none
File diff suppressed because it is too large Load Diff
@@ -5,9 +5,35 @@
category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
relevant_mutant_bodypart = "legs"
/datum/preference/choiced/digitigrade_legs/create_default_value()
return "Normal Legs"
/datum/preference/choiced/digitigrade_legs/init_possible_values()
return assoc_to_keys(GLOB.sprite_accessories["legs"])
/datum/preference/choiced/digitigrade_legs/apply_to_human(mob/living/carbon/human/target, value)
target.dna.features["legs"] = value
/datum/preference/choiced/digitigrade_legs/is_accessible(datum/preferences/preferences)
return ..() && is_usable(preferences)
/**
* Actually rendered. Slimmed down version of the logic in is_available() that actually works when spawning or drawing the character.
*
* Returns if feature value is usable.
*
* Arguments:
* * preferences - The relevant character preferences.
*/
/datum/preference/choiced/digitigrade_legs/proc/is_usable(datum/preferences/preferences)
var/species_type = preferences.read_preference(/datum/preference/choiced/species)
var/datum/species/species = new species_type
return (savefile_key in species.get_features()) \
&& species.digitigrade_customization == DIGITIGRADE_OPTIONAL
/datum/preference/choiced/digitigrade_legs/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences)
if(!preferences || !is_usable(preferences))
return FALSE
target.dna.features["legs"] = value
return TRUE
@@ -9,6 +9,15 @@
/datum/preference/choiced/vox_bodycolor/create_default_value()
return "default"
/datum/preference/choiced/vox_bodycolor/is_accessible(datum/preferences/preferences)
. = ..()
if(!.)
return FALSE
var/species_type = preferences.read_preference(/datum/preference/choiced/species)
return species_type == /datum/species/vox_primalis
/datum/preference/choiced/vox_bodycolor/apply_to_human(mob/living/carbon/human/target, value)
target.dna.features["vox_bodycolor"] = value
@@ -27,6 +27,7 @@
"ears" = ACC_RANDOM,
"legs" = "Normal Legs"
)
digitigrade_customization = DIGITIGRADE_NEVER
disliked_food = GROSS | GRAIN | GORE
liked_food = MEAT
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT