mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-29 16:18:01 +01:00
[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:
co-authored by
GoldenAlpharex
GoldenAlpharex
parent
f51e4124ad
commit
50dda74fc2
@@ -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
+28
-2
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user