diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 00dfcd5c041..0f04710421f 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -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) diff --git a/modular_skyrat/master_files/code/modules/client/preferences/_preference.dm b/modular_skyrat/master_files/code/modules/client/preferences/_preference.dm index 78bd0aa8450..d64d14874ec 100644 --- a/modular_skyrat/master_files/code/modules/client/preferences/_preference.dm +++ b/modular_skyrat/master_files/code/modules/client/preferences/_preference.dm @@ -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 diff --git a/modular_skyrat/master_files/code/modules/client/preferences/genitals.dm b/modular_skyrat/master_files/code/modules/client/preferences/genitals.dm index c1596e8f3d3..ff88c6071f2 100644 --- a/modular_skyrat/master_files/code/modules/client/preferences/genitals.dm +++ b/modular_skyrat/master_files/code/modules/client/preferences/genitals.dm @@ -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 diff --git a/modular_skyrat/master_files/code/modules/client/preferences/mutant_parts.dm b/modular_skyrat/master_files/code/modules/client/preferences/mutant_parts.dm index 030fd94c445..bc2786fbee9 100644 --- a/modular_skyrat/master_files/code/modules/client/preferences/mutant_parts.dm +++ b/modular_skyrat/master_files/code/modules/client/preferences/mutant_parts.dm @@ -33,9 +33,11 @@ category = PREFERENCE_CATEGORY_SECONDARY_FEATURES relevant_species_trait = EYECOLOR -/datum/preference/toggle/eye_emissives/apply_to_human(mob/living/carbon/human/target, value) +/datum/preference/toggle/eye_emissives/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences) + value = value && preferences && is_allowed(preferences) + var/obj/item/organ/internal/eyes/eyes_organ = target.getorgan(/obj/item/organ/internal/eyes) - target.emissive_eyes = TRUE + target.emissive_eyes = value if (istype(eyes_organ)) eyes_organ.is_emissive = value @@ -44,1211 +46,591 @@ /datum/preference/toggle/eye_emissives/is_accessible(datum/preferences/preferences) var/passed_initial_check = ..(preferences) - var/allowed = preferences.read_preference(/datum/preference/toggle/allow_emissives) + var/allowed = is_allowed(preferences) return passed_initial_check && allowed +/** + * If eye emissives are actually on. + */ +/datum/preference/toggle/eye_emissives/proc/is_allowed(datum/preferences/preferences) + return preferences.read_preference(/datum/preference/toggle/allow_emissives) // Body Markings -/datum/preference/toggle/body_markings - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES - savefile_identifier = PREFERENCE_CHARACTER +/datum/preference/toggle/mutant_toggle/body_markings savefile_key = "body_markings_toggle" relevant_mutant_bodypart = "body_markings" - default_value = FALSE -/datum/preference/toggle/body_markings/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/body_markings/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 - -/datum/preference/choiced/body_markings +/datum/preference/choiced/mutant_choice/body_markings savefile_key = "feature_body_markings" - savefile_identifier = PREFERENCE_CHARACTER - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES relevant_mutant_bodypart = "body_markings" - -/datum/preference/choiced/body_markings/is_accessible(datum/preferences/preferences) - var/passed_initial_check = ..(preferences) - var/allowed = preferences.read_preference(/datum/preference/toggle/allow_mismatched_parts) - var/part_enabled = preferences.read_preference(/datum/preference/toggle/body_markings) - return ((passed_initial_check || allowed) && part_enabled) - -/datum/preference/choiced/body_markings/init_possible_values() - return assoc_to_keys(GLOB.sprite_accessories["body_markings"]) - -/datum/preference/choiced/body_markings/apply_to_human(mob/living/carbon/human/target, value) - 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_NAME] = value - -/datum/preference/choiced/body_markings/create_default_value() - var/datum/sprite_accessory/body_markings/none/default = /datum/sprite_accessory/body_markings/none - return initial(default.name) + type_to_check = /datum/preference/toggle/mutant_toggle/body_markings + default_accessory_type = /datum/sprite_accessory/body_markings/none /datum/preference/tri_color/body_markings category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "body_markings_color" relevant_mutant_bodypart = "body_markings" - type_to_check = /datum/preference/toggle/body_markings + type_to_check = /datum/preference/toggle/mutant_toggle/body_markings /datum/preference/tri_bool/body_markings category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "body_markings_emissive" relevant_mutant_bodypart = "body_markings" - type_to_check = /datum/preference/toggle/body_markings + type_to_check = /datum/preference/toggle/mutant_toggle/body_markings /// Tails -/datum/preference/toggle/tail - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES - savefile_identifier = PREFERENCE_CHARACTER +/datum/preference/toggle/mutant_toggle/tail savefile_key = "tail_toggle" relevant_mutant_bodypart = "tail" - default_value = FALSE -/datum/preference/toggle/tail/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/tail/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 - -/datum/preference/choiced/tail +/datum/preference/choiced/mutant_choice/tail savefile_key = "feature_tail" - savefile_identifier = PREFERENCE_CHARACTER - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES relevant_mutant_bodypart = "tail" - -/datum/preference/choiced/tail/is_accessible(datum/preferences/preferences) - var/passed_initial_check = ..(preferences) - var/allowed = preferences.read_preference(/datum/preference/toggle/allow_mismatched_parts) - var/part_enabled = preferences.read_preference(/datum/preference/toggle/tail) - return ((passed_initial_check || allowed) && part_enabled) - -/datum/preference/choiced/tail/init_possible_values() - return assoc_to_keys(GLOB.sprite_accessories["tail"]) - -/datum/preference/choiced/tail/apply_to_human(mob/living/carbon/human/target, value) - 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_NAME] = value - -/datum/preference/choiced/tail/create_default_value() - var/datum/sprite_accessory/tails/none/default = /datum/sprite_accessory/tails/none - return initial(default.name) + type_to_check = /datum/preference/toggle/mutant_toggle/tail + default_accessory_type = /datum/sprite_accessory/tails/none /datum/preference/tri_color/tail category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "tail_color" relevant_mutant_bodypart = "tail" - type_to_check = /datum/preference/toggle/tail + type_to_check = /datum/preference/toggle/mutant_toggle/tail /datum/preference/tri_bool/tail category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "tail_emissive" relevant_mutant_bodypart = "tail" - type_to_check = /datum/preference/toggle/tail + type_to_check = /datum/preference/toggle/mutant_toggle/tail /// Snouts -/datum/preference/toggle/snout - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES - savefile_identifier = PREFERENCE_CHARACTER +/datum/preference/toggle/mutant_toggle/snout savefile_key = "snout_toggle" relevant_mutant_bodypart = "snout" - default_value = FALSE -/datum/preference/toggle/snout/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/snout/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 - -/datum/preference/choiced/snout +/datum/preference/choiced/mutant_choice/snout savefile_key = "feature_snout" - savefile_identifier = PREFERENCE_CHARACTER - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES relevant_mutant_bodypart = "snout" + type_to_check = /datum/preference/toggle/mutant_toggle/snout + default_accessory_type = /datum/sprite_accessory/snouts/none -/datum/preference/choiced/snout/is_accessible(datum/preferences/preferences) - var/passed_initial_check = ..(preferences) - var/allowed = preferences.read_preference(/datum/preference/toggle/allow_mismatched_parts) - var/part_enabled = preferences.read_preference(/datum/preference/toggle/snout) - return ((passed_initial_check || allowed) && part_enabled) +/datum/preference/choiced/mutant_choice/snout/apply_to_human(mob/living/carbon/human/target, value) + . = ..() -/datum/preference/choiced/snout/init_possible_values() - return assoc_to_keys(GLOB.sprite_accessories["snout"]) - -/datum/preference/choiced/snout/apply_to_human(mob/living/carbon/human/target, value) - 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_NAME] = value var/obj/item/bodypart/head/our_head = target.get_bodypart(BODY_ZONE_HEAD) - our_head.bodytype |= BODYTYPE_SNOUTED + if(.) + our_head.bodytype |= BODYTYPE_SNOUTED + else + our_head.bodytype &= ~BODYTYPE_SNOUTED our_head.synchronize_bodytypes(target) -/datum/preference/choiced/snout/create_default_value() - var/datum/sprite_accessory/snouts/none/default = /datum/sprite_accessory/snouts/none - return initial(default.name) - /datum/preference/tri_color/snout category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "snout_color" relevant_mutant_bodypart = "snout" - type_to_check = /datum/preference/toggle/snout + type_to_check = /datum/preference/toggle/mutant_toggle/snout /datum/preference/tri_bool/snout category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "snout_emissive" relevant_mutant_bodypart = "snout" - type_to_check = /datum/preference/toggle/snout + type_to_check = /datum/preference/toggle/mutant_toggle/snout /// Horns -/datum/preference/toggle/horns - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES - savefile_identifier = PREFERENCE_CHARACTER +/datum/preference/toggle/mutant_toggle/horns savefile_key = "horns_toggle" relevant_mutant_bodypart = "horns" - default_value = FALSE -/datum/preference/toggle/horns/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/horns/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 - -/datum/preference/choiced/horns +/datum/preference/choiced/mutant_choice/horns savefile_key = "feature_horns" - savefile_identifier = PREFERENCE_CHARACTER - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES relevant_mutant_bodypart = "horns" - -/datum/preference/choiced/horns/is_accessible(datum/preferences/preferences) - var/passed_initial_check = ..(preferences) - var/allowed = preferences.read_preference(/datum/preference/toggle/allow_mismatched_parts) - var/part_enabled = preferences.read_preference(/datum/preference/toggle/horns) - return ((passed_initial_check || allowed) && part_enabled) - -/datum/preference/choiced/horns/init_possible_values() - return assoc_to_keys(GLOB.sprite_accessories["horns"]) - -/datum/preference/choiced/horns/apply_to_human(mob/living/carbon/human/target, value) - 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_NAME] = value - -/datum/preference/choiced/horns/create_default_value() - var/datum/sprite_accessory/horns/none/default = /datum/sprite_accessory/horns/none - return initial(default.name) + type_to_check = /datum/preference/toggle/mutant_toggle/horns + default_accessory_type = /datum/sprite_accessory/horns/none /datum/preference/tri_color/horns category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "horns_color" relevant_mutant_bodypart = "horns" - type_to_check = /datum/preference/toggle/horns + type_to_check = /datum/preference/toggle/mutant_toggle/horns /datum/preference/tri_bool/horns category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "horns_emissive" relevant_mutant_bodypart = "horns" - type_to_check = /datum/preference/toggle/horns + type_to_check = /datum/preference/toggle/mutant_toggle/horns /// Ears -/datum/preference/toggle/ears - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES - savefile_identifier = PREFERENCE_CHARACTER +/datum/preference/toggle/mutant_toggle/ears savefile_key = "ears_toggle" relevant_mutant_bodypart = "ears" - default_value = FALSE -/datum/preference/toggle/ears/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/ears/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 - -/datum/preference/choiced/ears +/datum/preference/choiced/mutant_choice/ears savefile_key = "feature_ears" - savefile_identifier = PREFERENCE_CHARACTER - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES relevant_mutant_bodypart = "ears" - -/datum/preference/choiced/ears/is_accessible(datum/preferences/preferences) - var/passed_initial_check = ..(preferences) - var/allowed = preferences.read_preference(/datum/preference/toggle/allow_mismatched_parts) - var/part_enabled = preferences.read_preference(/datum/preference/toggle/ears) - return ((passed_initial_check || allowed) && part_enabled) - -/datum/preference/choiced/ears/init_possible_values() - return assoc_to_keys(GLOB.sprite_accessories["ears"]) - -/datum/preference/choiced/ears/apply_to_human(mob/living/carbon/human/target, value) - 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_NAME] = value - -/datum/preference/choiced/ears/create_default_value() - var/datum/sprite_accessory/ears/none/default = /datum/sprite_accessory/ears/none - return initial(default.name) + type_to_check = /datum/preference/toggle/mutant_toggle/ears + default_accessory_type = /datum/sprite_accessory/ears/none /datum/preference/tri_color/ears category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "ears_color" relevant_mutant_bodypart = "ears" - type_to_check = /datum/preference/toggle/ears + type_to_check = /datum/preference/toggle/mutant_toggle/ears /datum/preference/tri_bool/ears category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "ears_emissive" relevant_mutant_bodypart = "ears" - type_to_check = /datum/preference/toggle/ears + type_to_check = /datum/preference/toggle/mutant_toggle/ears /// Wings -/datum/preference/toggle/wings - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES - savefile_identifier = PREFERENCE_CHARACTER +/datum/preference/toggle/mutant_toggle/wings savefile_key = "wings_toggle" relevant_mutant_bodypart = "wings" - default_value = FALSE -/datum/preference/toggle/wings/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/wings/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 - -/datum/preference/choiced/wings +/datum/preference/choiced/mutant_choice/wings savefile_key = "feature_wings" - savefile_identifier = PREFERENCE_CHARACTER - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES relevant_mutant_bodypart = "wings" - -/datum/preference/choiced/wings/is_accessible(datum/preferences/preferences) - var/passed_initial_check = ..(preferences) - var/allowed = preferences.read_preference(/datum/preference/toggle/allow_mismatched_parts) - var/part_enabled = preferences.read_preference(/datum/preference/toggle/wings) - return ((passed_initial_check || allowed) && part_enabled) - -/datum/preference/choiced/wings/init_possible_values() - return assoc_to_keys(GLOB.sprite_accessories["wings"]) - -/datum/preference/choiced/wings/apply_to_human(mob/living/carbon/human/target, value) - 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_NAME] = value - -/datum/preference/choiced/wings/create_default_value() - var/datum/sprite_accessory/wings/none/default = /datum/sprite_accessory/wings/none - return initial(default.name) + type_to_check = /datum/preference/toggle/mutant_toggle/wings + default_accessory_type = /datum/sprite_accessory/wings/none /datum/preference/tri_color/wings category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "wings_color" relevant_mutant_bodypart = "wings" - type_to_check = /datum/preference/toggle/wings + type_to_check = /datum/preference/toggle/mutant_toggle/wings /datum/preference/tri_bool/wings category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "wings_emissive" relevant_mutant_bodypart = "wings" - type_to_check = /datum/preference/toggle/wings + type_to_check = /datum/preference/toggle/mutant_toggle/wings /// Frills -/datum/preference/toggle/frills - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES - savefile_identifier = PREFERENCE_CHARACTER +/datum/preference/toggle/mutant_toggle/frills savefile_key = "frills_toggle" relevant_mutant_bodypart = "frills" - default_value = FALSE -/datum/preference/toggle/frills/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/frills/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 - -/datum/preference/choiced/frills +/datum/preference/choiced/mutant_choice/frills savefile_key = "feature_frills" - savefile_identifier = PREFERENCE_CHARACTER - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES relevant_mutant_bodypart = "frills" - -/datum/preference/choiced/frills/is_accessible(datum/preferences/preferences) - var/passed_initial_check = ..(preferences) - var/allowed = preferences.read_preference(/datum/preference/toggle/allow_mismatched_parts) - var/part_enabled = preferences.read_preference(/datum/preference/toggle/frills) - return ((passed_initial_check || allowed) && part_enabled) - -/datum/preference/choiced/frills/init_possible_values() - return assoc_to_keys(GLOB.sprite_accessories["frills"]) - -/datum/preference/choiced/frills/apply_to_human(mob/living/carbon/human/target, value) - 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_NAME] = value - -/datum/preference/choiced/frills/create_default_value() - var/datum/sprite_accessory/frills/none/default = /datum/sprite_accessory/frills/none - return initial(default.name) + type_to_check = /datum/preference/toggle/mutant_toggle/frills + default_accessory_type = /datum/sprite_accessory/frills/none /datum/preference/tri_color/frills category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "frills_color" relevant_mutant_bodypart = "frills" - type_to_check = /datum/preference/toggle/frills + type_to_check = /datum/preference/toggle/mutant_toggle/frills /datum/preference/tri_bool/frills category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "frills_emissive" relevant_mutant_bodypart = "frills" - type_to_check = /datum/preference/toggle/frills + type_to_check = /datum/preference/toggle/mutant_toggle/frills /// Spines -/datum/preference/toggle/spines - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES - savefile_identifier = PREFERENCE_CHARACTER +/datum/preference/toggle/mutant_toggle/spines savefile_key = "spines_toggle" relevant_mutant_bodypart = "spines" - default_value = FALSE -/datum/preference/toggle/spines/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/spines/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 - -/datum/preference/choiced/spines +/datum/preference/choiced/mutant_choice/spines savefile_key = "feature_spines" - savefile_identifier = PREFERENCE_CHARACTER - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES relevant_mutant_bodypart = "spines" - -/datum/preference/choiced/spines/is_accessible(datum/preferences/preferences) - var/passed_initial_check = ..(preferences) - var/allowed = preferences.read_preference(/datum/preference/toggle/allow_mismatched_parts) - var/part_enabled = preferences.read_preference(/datum/preference/toggle/spines) - return ((passed_initial_check || allowed) && part_enabled) - -/datum/preference/choiced/spines/init_possible_values() - return assoc_to_keys(GLOB.sprite_accessories["spines"]) - -/datum/preference/choiced/spines/apply_to_human(mob/living/carbon/human/target, value) - 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_NAME] = value - -/datum/preference/choiced/spines/create_default_value() - var/datum/sprite_accessory/spines/none/default = /datum/sprite_accessory/spines/none - return initial(default.name) + type_to_check = /datum/preference/toggle/mutant_toggle/spines + default_accessory_type = /datum/sprite_accessory/spines/none /datum/preference/tri_color/spines category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "spines_color" relevant_mutant_bodypart = "spines" - type_to_check = /datum/preference/toggle/spines + type_to_check = /datum/preference/toggle/mutant_toggle/spines /datum/preference/tri_bool/spines category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "spines_emissive" relevant_mutant_bodypart = "spines" - type_to_check = /datum/preference/toggle/spines + type_to_check = /datum/preference/toggle/mutant_toggle/spines /// Caps -/datum/preference/toggle/caps - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES - savefile_identifier = PREFERENCE_CHARACTER +/datum/preference/toggle/mutant_toggle/caps savefile_key = "caps_toggle" relevant_mutant_bodypart = "caps" - default_value = FALSE -/datum/preference/toggle/caps/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/caps/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 - -/datum/preference/choiced/caps +/datum/preference/choiced/mutant_choice/caps savefile_key = "feature_caps" - savefile_identifier = PREFERENCE_CHARACTER - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES relevant_mutant_bodypart = "caps" - -/datum/preference/choiced/caps/is_accessible(datum/preferences/preferences) - var/passed_initial_check = ..(preferences) - var/allowed = preferences.read_preference(/datum/preference/toggle/allow_mismatched_parts) - var/part_enabled = preferences.read_preference(/datum/preference/toggle/caps) - return ((passed_initial_check || allowed) && part_enabled) - -/datum/preference/choiced/caps/init_possible_values() - return assoc_to_keys(GLOB.sprite_accessories["caps"]) - -/datum/preference/choiced/caps/apply_to_human(mob/living/carbon/human/target, value) - 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_NAME] = value - -/datum/preference/choiced/caps/create_default_value() - var/datum/sprite_accessory/caps/none/default = /datum/sprite_accessory/caps/none - return initial(default.name) + type_to_check = /datum/preference/toggle/mutant_toggle/caps + default_accessory_type = /datum/sprite_accessory/caps/none /datum/preference/tri_color/caps category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "caps_color" relevant_mutant_bodypart = "caps" - type_to_check = /datum/preference/toggle/caps + type_to_check = /datum/preference/toggle/mutant_toggle/caps /datum/preference/tri_bool/caps category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "caps_emissive" relevant_mutant_bodypart = "caps" - type_to_check = /datum/preference/toggle/caps + type_to_check = /datum/preference/toggle/mutant_toggle/caps /// Moth Antennae -/datum/preference/toggle/moth_antennae - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES - savefile_identifier = PREFERENCE_CHARACTER +/datum/preference/toggle/mutant_toggle/moth_antennae savefile_key = "moth_antennae_toggle" relevant_mutant_bodypart = "moth_antennae" - default_value = FALSE -/datum/preference/toggle/moth_antennae/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/moth_antennae/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 - -/datum/preference/choiced/moth_antennae +/datum/preference/choiced/mutant_choice/moth_antennae savefile_key = "feature_moth_antennae" - savefile_identifier = PREFERENCE_CHARACTER - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES relevant_mutant_bodypart = "moth_antennae" - -/datum/preference/choiced/moth_antennae/is_accessible(datum/preferences/preferences) - var/passed_initial_check = ..(preferences) - var/allowed = preferences.read_preference(/datum/preference/toggle/allow_mismatched_parts) - var/part_enabled = preferences.read_preference(/datum/preference/toggle/moth_antennae) - return ((passed_initial_check || allowed) && part_enabled) - -/datum/preference/choiced/moth_antennae/init_possible_values() - return assoc_to_keys(GLOB.sprite_accessories["moth_antennae"]) - -/datum/preference/choiced/moth_antennae/apply_to_human(mob/living/carbon/human/target, value) - 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_NAME] = value - -/datum/preference/choiced/moth_antennae/create_default_value() - var/datum/sprite_accessory/moth_antennae/none/default = /datum/sprite_accessory/moth_antennae/none - return initial(default.name) + type_to_check = /datum/preference/toggle/mutant_toggle/moth_antennae + default_accessory_type = /datum/sprite_accessory/moth_antennae/none /datum/preference/tri_color/moth_antennae category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "moth_antennae_color" relevant_mutant_bodypart = "moth_antennae" - type_to_check = /datum/preference/toggle/moth_antennae + type_to_check = /datum/preference/toggle/mutant_toggle/moth_antennae /datum/preference/tri_bool/moth_antennae category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "moth_antennae_emissive" relevant_mutant_bodypart = "moth_antennae" - type_to_check = /datum/preference/toggle/moth_antennae + type_to_check = /datum/preference/toggle/mutant_toggle/moth_antennae /// Moth Markings -/datum/preference/toggle/moth_markings - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES - savefile_identifier = PREFERENCE_CHARACTER +/datum/preference/toggle/mutant_toggle/moth_markings savefile_key = "moth_markings_toggle" relevant_mutant_bodypart = "moth_markings" - default_value = FALSE -/datum/preference/toggle/moth_markings/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/moth_markings/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 - -/datum/preference/choiced/moth_markings +/datum/preference/choiced/mutant_choice/moth_markings savefile_key = "feature_moth_markings" - savefile_identifier = PREFERENCE_CHARACTER - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES relevant_mutant_bodypart = "moth_markings" - -/datum/preference/choiced/moth_markings/is_accessible(datum/preferences/preferences) - var/passed_initial_check = ..(preferences) - var/allowed = preferences.read_preference(/datum/preference/toggle/allow_mismatched_parts) - var/part_enabled = preferences.read_preference(/datum/preference/toggle/moth_markings) - return ((passed_initial_check || allowed) && part_enabled) - -/datum/preference/choiced/moth_markings/init_possible_values() - return assoc_to_keys(GLOB.sprite_accessories["moth_markings"]) - -/datum/preference/choiced/moth_markings/apply_to_human(mob/living/carbon/human/target, value) - 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_NAME] = value - -/datum/preference/choiced/moth_markings/create_default_value() - var/datum/sprite_accessory/moth_markings/none/default = /datum/sprite_accessory/moth_markings/none - return initial(default.name) + type_to_check = /datum/preference/toggle/mutant_toggle/moth_markings + default_accessory_type = /datum/sprite_accessory/moth_markings/none /datum/preference/tri_color/moth_markings category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "moth_markings_color" relevant_mutant_bodypart = "moth_markings" - type_to_check = /datum/preference/toggle/moth_markings + type_to_check = /datum/preference/toggle/mutant_toggle/moth_markings /datum/preference/tri_bool/moth_markings category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "moth_markings_emissive" relevant_mutant_bodypart = "moth_markings" - type_to_check = /datum/preference/toggle/moth_markings + type_to_check = /datum/preference/toggle/mutant_toggle/moth_markings /// Fluff -/datum/preference/toggle/fluff - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES - savefile_identifier = PREFERENCE_CHARACTER +/datum/preference/toggle/mutant_toggle/fluff savefile_key = "fluff_toggle" relevant_mutant_bodypart = "fluff" - default_value = FALSE -/datum/preference/toggle/fluff/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/fluff/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 - -/datum/preference/choiced/fluff +/datum/preference/choiced/mutant_choice/fluff savefile_key = "feature_fluff" - savefile_identifier = PREFERENCE_CHARACTER - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES relevant_mutant_bodypart = "fluff" - -/datum/preference/choiced/fluff/is_accessible(datum/preferences/preferences) - var/passed_initial_check = ..(preferences) - var/allowed = preferences.read_preference(/datum/preference/toggle/allow_mismatched_parts) - var/part_enabled = preferences.read_preference(/datum/preference/toggle/fluff) - return ((passed_initial_check || allowed) && part_enabled) - -/datum/preference/choiced/fluff/init_possible_values() - return assoc_to_keys(GLOB.sprite_accessories["fluff"]) - -/datum/preference/choiced/fluff/apply_to_human(mob/living/carbon/human/target, value) - 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_NAME] = value - -/datum/preference/choiced/fluff/create_default_value() - var/datum/sprite_accessory/fluff/moth/none/default = /datum/sprite_accessory/fluff/moth/none - return initial(default.name) + type_to_check = /datum/preference/toggle/mutant_toggle/fluff + default_accessory_type = /datum/sprite_accessory/fluff/moth/none /datum/preference/tri_color/fluff category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "fluff_color" relevant_mutant_bodypart = "fluff" - type_to_check = /datum/preference/toggle/fluff + type_to_check = /datum/preference/toggle/mutant_toggle/fluff /datum/preference/tri_bool/fluff category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "fluff_emissive" relevant_mutant_bodypart = "fluff" - type_to_check = /datum/preference/toggle/fluff + type_to_check = /datum/preference/toggle/mutant_toggle/fluff /// IPC Screens -/datum/preference/toggle/ipc_screen - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES - savefile_identifier = PREFERENCE_CHARACTER +/datum/preference/toggle/mutant_toggle/ipc_screen savefile_key = "ipc_screen_toggle" relevant_mutant_bodypart = "ipc_screen" - default_value = FALSE -/datum/preference/toggle/ipc_screen/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/ipc_screen/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 - -/datum/preference/choiced/ipc_screen +/datum/preference/choiced/mutant_choice/ipc_screen savefile_key = "feature_ipc_screen" - savefile_identifier = PREFERENCE_CHARACTER - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES relevant_mutant_bodypart = "ipc_screen" - -/datum/preference/choiced/ipc_screen/is_accessible(datum/preferences/preferences) - var/passed_initial_check = ..(preferences) - var/allowed = preferences.read_preference(/datum/preference/toggle/allow_mismatched_parts) - var/part_enabled = preferences.read_preference(/datum/preference/toggle/ipc_screen) - return ((passed_initial_check || allowed) && part_enabled) - -/datum/preference/choiced/ipc_screen/init_possible_values() - return assoc_to_keys(GLOB.sprite_accessories["ipc_screen"]) - -/datum/preference/choiced/ipc_screen/apply_to_human(mob/living/carbon/human/target, value) - 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_NAME] = value - -/datum/preference/choiced/ipc_screen/create_default_value() - var/datum/sprite_accessory/screen/none/default = /datum/sprite_accessory/screen/none - return initial(default.name) + type_to_check = /datum/preference/toggle/mutant_toggle/ipc_screen + default_accessory_type = /datum/sprite_accessory/screen/none /datum/preference/tri_color/ipc_screen category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "ipc_screen_color" relevant_mutant_bodypart = "ipc_screen" - type_to_check = /datum/preference/toggle/ipc_screen + type_to_check = /datum/preference/toggle/mutant_toggle/ipc_screen /datum/preference/tri_bool/ipc_screen category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "ipc_screen_emissive" relevant_mutant_bodypart = "ipc_screen" - type_to_check = /datum/preference/toggle/ipc_screen + type_to_check = /datum/preference/toggle/mutant_toggle/ipc_screen /// IPC Antennas -/datum/preference/toggle/ipc_antenna - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES - savefile_identifier = PREFERENCE_CHARACTER +/datum/preference/toggle/mutant_toggle/ipc_antenna savefile_key = "ipc_antenna_toggle" relevant_mutant_bodypart = "ipc_antenna" - default_value = FALSE -/datum/preference/toggle/ipc_antenna/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/ipc_antenna/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 - -/datum/preference/choiced/ipc_antenna +/datum/preference/choiced/mutant_choice/ipc_antenna savefile_key = "feature_ipc_antenna" - savefile_identifier = PREFERENCE_CHARACTER - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES relevant_mutant_bodypart = "ipc_antenna" - -/datum/preference/choiced/ipc_antenna/is_accessible(datum/preferences/preferences) - var/passed_initial_check = ..(preferences) - var/allowed = preferences.read_preference(/datum/preference/toggle/allow_mismatched_parts) - var/part_enabled = preferences.read_preference(/datum/preference/toggle/ipc_antenna) - return ((passed_initial_check || allowed) && part_enabled) - -/datum/preference/choiced/ipc_antenna/init_possible_values() - return assoc_to_keys(GLOB.sprite_accessories["ipc_antenna"]) - -/datum/preference/choiced/ipc_antenna/apply_to_human(mob/living/carbon/human/target, value) - 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_NAME] = value - -/datum/preference/choiced/ipc_antenna/create_default_value() - var/datum/sprite_accessory/antenna/none/default = /datum/sprite_accessory/antenna/none - return initial(default.name) + type_to_check = /datum/preference/toggle/mutant_toggle/ipc_antenna + default_accessory_type = /datum/sprite_accessory/antenna/none /datum/preference/tri_color/ipc_antenna category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "ipc_antenna_color" relevant_mutant_bodypart = "ipc_antenna" - type_to_check = /datum/preference/toggle/ipc_antenna + type_to_check = /datum/preference/toggle/mutant_toggle/ipc_antenna /datum/preference/tri_bool/ipc_antenna category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "ipc_antenna_emissive" relevant_mutant_bodypart = "ipc_antenna" - type_to_check = /datum/preference/toggle/ipc_antenna + type_to_check = /datum/preference/toggle/mutant_toggle/ipc_antenna /// IPC Chassis -/datum/preference/toggle/ipc_chassis - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES - savefile_identifier = PREFERENCE_CHARACTER +/datum/preference/toggle/mutant_toggle/ipc_chassis savefile_key = "ipc_chassis_toggle" relevant_mutant_bodypart = "ipc_chassis" - default_value = FALSE -/datum/preference/toggle/ipc_chassis/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/ipc_chassis/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 - -/datum/preference/choiced/ipc_chassis +/datum/preference/choiced/mutant_choice/ipc_chassis savefile_key = "feature_ipc_chassis" - savefile_identifier = PREFERENCE_CHARACTER - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES relevant_mutant_bodypart = "ipc_chassis" - -/datum/preference/choiced/ipc_chassis/is_accessible(datum/preferences/preferences) - var/passed_initial_check = ..(preferences) - var/allowed = preferences.read_preference(/datum/preference/toggle/allow_mismatched_parts) - var/part_enabled = preferences.read_preference(/datum/preference/toggle/ipc_chassis) - return ((passed_initial_check || allowed) && part_enabled) - -/datum/preference/choiced/ipc_chassis/init_possible_values() - return assoc_to_keys(GLOB.sprite_accessories["ipc_chassis"]) - -/datum/preference/choiced/ipc_chassis/apply_to_human(mob/living/carbon/human/target, value) - 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_NAME] = value - -/datum/preference/choiced/ipc_chassis/create_default_value() - var/datum/sprite_accessory/ipc_chassis/default = /datum/sprite_accessory/ipc_chassis/none - return initial(default.name) + type_to_check = /datum/preference/toggle/mutant_toggle/ipc_chassis + default_accessory_type = /datum/sprite_accessory/ipc_chassis/none /datum/preference/tri_color/ipc_chassis category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "ipc_chassis_color" relevant_mutant_bodypart = "ipc_chassis" - type_to_check = /datum/preference/toggle/ipc_chassis + type_to_check = /datum/preference/toggle/mutant_toggle/ipc_chassis /// IPC Head -/datum/preference/toggle/ipc_head - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES - savefile_identifier = PREFERENCE_CHARACTER +/datum/preference/toggle/mutant_toggle/ipc_head savefile_key = "ipc_head_toggle" relevant_mutant_bodypart = "ipc_head" - default_value = FALSE -/datum/preference/toggle/ipc_head/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/ipc_head/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 - -/datum/preference/choiced/ipc_head +/datum/preference/choiced/mutant_choice/ipc_head savefile_key = "feature_ipc_head" - savefile_identifier = PREFERENCE_CHARACTER - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES relevant_mutant_bodypart = "ipc_head" - -/datum/preference/choiced/ipc_head/is_accessible(datum/preferences/preferences) - var/passed_initial_check = ..(preferences) - var/allowed = preferences.read_preference(/datum/preference/toggle/allow_mismatched_parts) - var/part_enabled = preferences.read_preference(/datum/preference/toggle/ipc_head) - return ((passed_initial_check || allowed) && part_enabled) - -/datum/preference/choiced/ipc_head/init_possible_values() - return assoc_to_keys(GLOB.sprite_accessories["ipc_head"]) - -/datum/preference/choiced/ipc_head/apply_to_human(mob/living/carbon/human/target, value) - 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_NAME] = value - -/datum/preference/choiced/ipc_head/create_default_value() - var/datum/sprite_accessory/ipc_head/default = /datum/sprite_accessory/ipc_head/none - return initial(default.name) + type_to_check = /datum/preference/toggle/mutant_toggle/ipc_head + default_accessory_type = /datum/sprite_accessory/ipc_head/none /datum/preference/tri_color/ipc_head category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "ipc_head_color" relevant_mutant_bodypart = "ipc_head" - type_to_check = /datum/preference/toggle/ipc_head + type_to_check = /datum/preference/toggle/mutant_toggle/ipc_head /// Skrell Hair -/datum/preference/toggle/skrell_hair - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES - savefile_identifier = PREFERENCE_CHARACTER +/datum/preference/toggle/mutant_toggle/skrell_hair savefile_key = "skrell_hair_toggle" relevant_mutant_bodypart = "skrell_hair" - default_value = FALSE -/datum/preference/toggle/skrell_hair/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/skrell_hair/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 - -/datum/preference/choiced/skrell_hair +/datum/preference/choiced/mutant_choice/skrell_hair savefile_key = "feature_skrell_hair" - savefile_identifier = PREFERENCE_CHARACTER - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES relevant_mutant_bodypart = "skrell_hair" - -/datum/preference/choiced/skrell_hair/is_accessible(datum/preferences/preferences) - var/passed_initial_check = ..(preferences) - var/allowed = preferences.read_preference(/datum/preference/toggle/allow_mismatched_parts) - var/part_enabled = preferences.read_preference(/datum/preference/toggle/skrell_hair) - return ((passed_initial_check || allowed) && part_enabled) - -/datum/preference/choiced/skrell_hair/init_possible_values() - return assoc_to_keys(GLOB.sprite_accessories["skrell_hair"]) - -/datum/preference/choiced/skrell_hair/apply_to_human(mob/living/carbon/human/target, value) - 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_NAME] = value - -/datum/preference/choiced/skrell_hair/create_default_value() - var/datum/sprite_accessory/skrell_hair/none/default = /datum/sprite_accessory/skrell_hair/none - return initial(default.name) + type_to_check = /datum/preference/toggle/mutant_toggle/skrell_hair + default_accessory_type = /datum/sprite_accessory/skrell_hair/none /datum/preference/tri_color/skrell_hair category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "skrell_hair_color" relevant_mutant_bodypart = "skrell_hair" - type_to_check = /datum/preference/toggle/skrell_hair + type_to_check = /datum/preference/toggle/mutant_toggle/skrell_hair /datum/preference/tri_bool/skrell_hair category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "skrell_hair_emissive" relevant_mutant_bodypart = "skrell_hair" - type_to_check = /datum/preference/toggle/skrell_hair + type_to_check = /datum/preference/toggle/mutant_toggle/skrell_hair /// Taur -/datum/preference/toggle/taur - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES - savefile_identifier = PREFERENCE_CHARACTER +/datum/preference/toggle/mutant_toggle/taur savefile_key = "taur_toggle" relevant_mutant_bodypart = "taur" - default_value = FALSE -/datum/preference/toggle/taur/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/taur/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 - -/datum/preference/choiced/taur +/datum/preference/choiced/mutant_choice/taur savefile_key = "feature_taur" - savefile_identifier = PREFERENCE_CHARACTER - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES relevant_mutant_bodypart = "taur" - -/datum/preference/choiced/taur/is_accessible(datum/preferences/preferences) - var/passed_initial_check = ..(preferences) - var/allowed = preferences.read_preference(/datum/preference/toggle/allow_mismatched_parts) - var/part_enabled = preferences.read_preference(/datum/preference/toggle/taur) - return ((passed_initial_check || allowed) && part_enabled) - -/datum/preference/choiced/taur/init_possible_values() - return assoc_to_keys(GLOB.sprite_accessories["taur"]) - -/datum/preference/choiced/taur/apply_to_human(mob/living/carbon/human/target, value) - 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_NAME] = value - -/datum/preference/choiced/taur/create_default_value() - var/datum/sprite_accessory/taur/none/default = /datum/sprite_accessory/taur/none - return initial(default.name) + type_to_check = /datum/preference/toggle/mutant_toggle/taur + default_accessory_type = /datum/sprite_accessory/taur/none /datum/preference/tri_color/taur category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "taur_color" relevant_mutant_bodypart = "taur" - type_to_check = /datum/preference/toggle/taur + type_to_check = /datum/preference/toggle/mutant_toggle/taur /datum/preference/tri_bool/taur category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "taur_emissive" relevant_mutant_bodypart = "taur" - type_to_check = /datum/preference/toggle/taur + type_to_check = /datum/preference/toggle/mutant_toggle/taur /// Xenodorsal -/datum/preference/toggle/xenodorsal - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES - savefile_identifier = PREFERENCE_CHARACTER +/datum/preference/toggle/mutant_toggle/xenodorsal savefile_key = "xenodorsal_toggle" relevant_mutant_bodypart = "xenodorsal" - default_value = FALSE -/datum/preference/toggle/xenodorsal/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/xenodorsal/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 - -/datum/preference/choiced/xenodorsal +/datum/preference/choiced/mutant_choice/xenodorsal savefile_key = "feature_xenodorsal" - savefile_identifier = PREFERENCE_CHARACTER - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES relevant_mutant_bodypart = "xenodorsal" - -/datum/preference/choiced/xenodorsal/is_accessible(datum/preferences/preferences) - var/passed_initial_check = ..(preferences) - var/allowed = preferences.read_preference(/datum/preference/toggle/allow_mismatched_parts) - var/part_enabled = preferences.read_preference(/datum/preference/toggle/xenodorsal) - return ((passed_initial_check || allowed) && part_enabled) - -/datum/preference/choiced/xenodorsal/init_possible_values() - return assoc_to_keys(GLOB.sprite_accessories["xenodorsal"]) - -/datum/preference/choiced/xenodorsal/apply_to_human(mob/living/carbon/human/target, value) - 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_NAME] = value - -/datum/preference/choiced/xenodorsal/create_default_value() - var/datum/sprite_accessory/xenodorsal/none/default = /datum/sprite_accessory/xenodorsal/none - return initial(default.name) + type_to_check = /datum/preference/toggle/mutant_toggle/xenodorsal + default_accessory_type = /datum/sprite_accessory/xenodorsal/none /datum/preference/tri_color/xenodorsal category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "xenodorsal_color" relevant_mutant_bodypart = "xenodorsal" - type_to_check = /datum/preference/toggle/xenodorsal + type_to_check = /datum/preference/toggle/mutant_toggle/xenodorsal /datum/preference/tri_bool/xenodorsal category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "xenodorsal_emissive" relevant_mutant_bodypart = "xenodorsal" - type_to_check = /datum/preference/toggle/xenodorsal + type_to_check = /datum/preference/toggle/mutant_toggle/xenodorsal /// Xeno heads -/datum/preference/toggle/xenohead - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES - savefile_identifier = PREFERENCE_CHARACTER +/datum/preference/toggle/mutant_toggle/xenohead savefile_key = "xenohead_toggle" relevant_mutant_bodypart = "xenohead" - default_value = FALSE -/datum/preference/toggle/xenohead/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/xenohead/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 - -/datum/preference/choiced/xenohead +/datum/preference/choiced/mutant_choice/xenohead savefile_key = "feature_xenohead" - savefile_identifier = PREFERENCE_CHARACTER - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES relevant_mutant_bodypart = "xenohead" - -/datum/preference/choiced/xenohead/is_accessible(datum/preferences/preferences) - var/passed_initial_check = ..(preferences) - var/allowed = preferences.read_preference(/datum/preference/toggle/allow_mismatched_parts) - var/part_enabled = preferences.read_preference(/datum/preference/toggle/xenohead) - return ((passed_initial_check || allowed) && part_enabled) - -/datum/preference/choiced/xenohead/init_possible_values() - return assoc_to_keys(GLOB.sprite_accessories["xenohead"]) - -/datum/preference/choiced/xenohead/apply_to_human(mob/living/carbon/human/target, value) - 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_NAME] = value - -/datum/preference/choiced/xenohead/create_default_value() - var/datum/sprite_accessory/xenohead/none/default = /datum/sprite_accessory/xenohead/none - return initial(default.name) + type_to_check = /datum/preference/toggle/mutant_toggle/xenohead + default_accessory_type = /datum/sprite_accessory/xenohead/none /datum/preference/tri_color/xenohead category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "xenohead_color" relevant_mutant_bodypart = "xenohead" - type_to_check = /datum/preference/toggle/xenohead + type_to_check = /datum/preference/toggle/mutant_toggle/xenohead /datum/preference/tri_bool/xenohead category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "xenohead_emissive" relevant_mutant_bodypart = "xenohead" - type_to_check = /datum/preference/toggle/xenohead + type_to_check = /datum/preference/toggle/mutant_toggle/xenohead /// Head Accessories - Unless more get added, this is only able to be applied for one person, a donator only thing -/datum/preference/toggle/head_acc - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES - savefile_identifier = PREFERENCE_CHARACTER +/datum/preference/toggle/mutant_toggle/head_acc savefile_key = "head_acc_toggle" relevant_mutant_bodypart = "head_acc" - default_value = FALSE -/datum/preference/toggle/head_acc/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/head_acc/is_accessible(datum/preferences/preferences) +/datum/preference/toggle/mutant_toggle/head_acc/is_accessible(datum/preferences/preferences) var/ckeycheck = preferences?.parent?.ckey == "whirlsam" - var/passed_initial_check = ..(preferences) - var/allowed = preferences.read_preference(/datum/preference/toggle/allow_mismatched_parts) - return ckeycheck && (passed_initial_check || allowed) + return ckeycheck && ..(preferences) -/datum/preference/choiced/head_acc +/datum/preference/choiced/mutant_choice/head_acc savefile_key = "feature_head_acc" - savefile_identifier = PREFERENCE_CHARACTER - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES relevant_mutant_bodypart = "head_acc" - -/datum/preference/choiced/head_acc/is_accessible(datum/preferences/preferences) - var/passed_initial_check = ..(preferences) - var/allowed = preferences.read_preference(/datum/preference/toggle/allow_mismatched_parts) - var/part_enabled = preferences.read_preference(/datum/preference/toggle/head_acc) - return ((passed_initial_check || allowed) && part_enabled) - -/datum/preference/choiced/head_acc/init_possible_values() - return assoc_to_keys(GLOB.sprite_accessories["head_acc"]) - -/datum/preference/choiced/head_acc/apply_to_human(mob/living/carbon/human/target, value) - 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_NAME] = value - -/datum/preference/choiced/head_acc/create_default_value() - var/datum/sprite_accessory/head_accessory/none/default = /datum/sprite_accessory/head_accessory/none - return initial(default.name) + type_to_check = /datum/preference/toggle/mutant_toggle/head_acc + default_accessory_type = /datum/sprite_accessory/head_accessory/none /datum/preference/tri_color/head_acc category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "head_acc_color" relevant_mutant_bodypart = "head_acc" - type_to_check = /datum/preference/toggle/head_acc + type_to_check = /datum/preference/toggle/mutant_toggle/head_acc /datum/preference/tri_bool/head_acc category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "head_acc_emissive" relevant_mutant_bodypart = "head_acc" - type_to_check = /datum/preference/toggle/head_acc + type_to_check = /datum/preference/toggle/mutant_toggle/head_acc /// Neck Accessories - Same as head_acc -/datum/preference/toggle/neck_acc - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES - savefile_identifier = PREFERENCE_CHARACTER +/datum/preference/toggle/mutant_toggle/neck_acc savefile_key = "neck_acc_toggle" relevant_mutant_bodypart = "neck_acc" - default_value = FALSE -/datum/preference/toggle/neck_acc/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/neck_acc/is_accessible(datum/preferences/preferences) +/datum/preference/toggle/mutant_toggle/neck_acc/is_accessible(datum/preferences/preferences) var/ckeycheck = preferences?.parent?.ckey == "whirlsam" - var/passed_initial_check = ..(preferences) - var/allowed = preferences.read_preference(/datum/preference/toggle/allow_mismatched_parts) - return ckeycheck && (passed_initial_check || allowed) + return ckeycheck && ..(preferences) -/datum/preference/choiced/neck_acc +/datum/preference/choiced/mutant_choice/neck_acc savefile_key = "feature_neck_acc" - savefile_identifier = PREFERENCE_CHARACTER - category = PREFERENCE_CATEGORY_SECONDARY_FEATURES relevant_mutant_bodypart = "neck_acc" - -/datum/preference/choiced/neck_acc/is_accessible(datum/preferences/preferences) - var/passed_initial_check = ..(preferences) - var/allowed = preferences.read_preference(/datum/preference/toggle/allow_mismatched_parts) - var/part_enabled = preferences.read_preference(/datum/preference/toggle/neck_acc) - return ((passed_initial_check || allowed) && part_enabled) - -/datum/preference/choiced/neck_acc/init_possible_values() - return assoc_to_keys(GLOB.sprite_accessories["neck_acc"]) - -/datum/preference/choiced/neck_acc/apply_to_human(mob/living/carbon/human/target, value) - 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_NAME] = value - -/datum/preference/choiced/neck_acc/create_default_value() - var/datum/sprite_accessory/neck_accessory/none/default = /datum/sprite_accessory/neck_accessory/none - return initial(default.name) + type_to_check = /datum/preference/toggle/mutant_toggle/neck_acc + default_accessory_type = /datum/sprite_accessory/neck_accessory/none /datum/preference/tri_color/neck_acc category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "neck_acc_color" relevant_mutant_bodypart = "neck_acc" - type_to_check = /datum/preference/toggle/neck_acc + type_to_check = /datum/preference/toggle/mutant_toggle/neck_acc /datum/preference/tri_bool/neck_acc category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "neck_acc_emissive" relevant_mutant_bodypart = "neck_acc" - type_to_check = /datum/preference/toggle/neck_acc + type_to_check = /datum/preference/toggle/mutant_toggle/neck_acc diff --git a/modular_skyrat/master_files/code/modules/client/preferences/species_features/digitigrade_legs.dm b/modular_skyrat/master_files/code/modules/client/preferences/species_features/digitigrade_legs.dm index a3af216e389..56a65ed36aa 100644 --- a/modular_skyrat/master_files/code/modules/client/preferences/species_features/digitigrade_legs.dm +++ b/modular_skyrat/master_files/code/modules/client/preferences/species_features/digitigrade_legs.dm @@ -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 diff --git a/modular_skyrat/modules/better_vox/code/vox_bodycolor.dm b/modular_skyrat/modules/better_vox/code/vox_bodycolor.dm index 24ab880e513..dd7ee0db96e 100644 --- a/modular_skyrat/modules/better_vox/code/vox_bodycolor.dm +++ b/modular_skyrat/modules/better_vox/code/vox_bodycolor.dm @@ -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 diff --git a/modular_skyrat/modules/teshari/code/_teshari.dm b/modular_skyrat/modules/teshari/code/_teshari.dm index f3aebe24085..43c9c3475f7 100644 --- a/modular_skyrat/modules/teshari/code/_teshari.dm +++ b/modular_skyrat/modules/teshari/code/_teshari.dm @@ -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