From cbde7d6206955b6953474b35a9340b01ea8424c2 Mon Sep 17 00:00:00 2001
From: Roxy <75404941+TealSeer@users.noreply.github.com>
Date: Thu, 2 Apr 2026 16:25:36 -0400
Subject: [PATCH] [BOUNTY] Character Preferences Reorganization (#5389)
This bounty was requested by @ArrisFairburne
Cleans up the character customization; various customization features
have been moved into three new tabs, "Character Basics" "OOC
Preferences" and "Silicon Preferences".
A ton of the character customization options (maybe 40%?) are stuff that
almost nobody would use on a regular basis. Options like mushroom caps,
frills, fluff, taur bodies, xenodorsal heads, etc. could be ignored by a
most players because they're irrelevant to their characters. Ideally the
most necessary stuff (basic furry parts, our required FTs, and
soundbytes for speaking) are the stuff the players see first, with more
stuff continuing to be available upon checking different tabs.
Silicon prefs are moved into their own tab because most characters are
carbons so they just won't ever need to bother with them.
Screenshots/Videos
:cl: ArrisFairburne
qol: Cleaned up the character preference window.
/:cl:
^ Conflicts:
^ tgui/packages/tgui/interfaces/PreferencesMenu/types.ts
---
code/__DEFINES/~skyrat_defines/preferences.dm | 7 ++
.../client/preferences/ai_core_display.dm | 2 +-
.../client/preferences/ai_emote_display.dm | 2 +-
.../client/preferences/ai_hologram_display.dm | 2 +-
code/modules/client/preferences/random.dm | 2 +-
.../client/preferences/silicon_gender.dm | 2 +-
.../preferences/species_features/basic.dm | 2 +-
.../code/modules/client/preferences/brain.dm | 2 +-
.../client/preferences/erp_preferences.dm | 10 +--
.../modules/client/preferences/flavor_text.dm | 6 +-
.../modules/client/preferences/genitals.dm | 12 +--
.../modules/client/preferences/headshot.dm | 2 +-
.../client/preferences/mutant_parts.dm | 30 ++++---
.../species_features/digitigrade_legs.dm | 2 +-
.../modules/client/flavor_text/flavor_text.dm | 9 +-
.../modules/client/preferences/blooper.dm | 8 +-
.../client/verbs/character_directory.dm | 6 +-
.../modules/rr_opt_in/rr_optin_preferences.dm | 2 +-
.../modules/client/preferences/hypnopref.dm | 2 +-
.../CharacterPreferences/MainPage.tsx | 88 ++++++++++++++++++-
.../CharacterPreferences/index.tsx | 8 +-
.../interfaces/PreferencesMenu/LimbsPage.tsx | 1 +
.../tgui/interfaces/PreferencesMenu/index.tsx | 2 +-
.../bubbers/species_features.tsx | 8 +-
.../skyrat/species_features.tsx | 1 +
.../tgui/interfaces/PreferencesMenu/types.ts | 25 +++---
26 files changed, 179 insertions(+), 64 deletions(-)
diff --git a/code/__DEFINES/~skyrat_defines/preferences.dm b/code/__DEFINES/~skyrat_defines/preferences.dm
index 9fb6cd69ff3..c7007efb8a0 100644
--- a/code/__DEFINES/~skyrat_defines/preferences.dm
+++ b/code/__DEFINES/~skyrat_defines/preferences.dm
@@ -14,3 +14,10 @@
#define ORGAN_PREF_POSI_BRAIN "Positronic Brain"
#define ORGAN_PREF_MMI_BRAIN "Man-Machine Interface"
#define ORGAN_PREF_CIRCUIT_BRAIN "Circuitboard"
+
+/// Essential features for every character, don't add new prefs to this unless you can justify why the majority of characters would use it
+#define PREFERENCE_CATEGORY_CHARACTER_BASICS "character_basics"
+/// OOC per-character preferences e.g. character advert, ERP status
+#define PREFERENCE_CATEGORY_OOC_PREFS "ooc_preferences"
+/// Preferences that only apply to AI and cyborgs
+#define PREFERENCE_CATEGORY_SILICON_PREFS "silicon_preferences"
diff --git a/code/modules/client/preferences/ai_core_display.dm b/code/modules/client/preferences/ai_core_display.dm
index c2eedc03e47..23d4b4b1291 100644
--- a/code/modules/client/preferences/ai_core_display.dm
+++ b/code/modules/client/preferences/ai_core_display.dm
@@ -1,6 +1,6 @@
/// What to show on the AI screen
/datum/preference/choiced/ai_core_display
- category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
+ category = PREFERENCE_CATEGORY_SILICON_PREFS // BUBBER EDIT CHANGE - Original: PREFERENCE_CATEGORY_NON_CONTEXTUAL
savefile_identifier = PREFERENCE_CHARACTER
savefile_key = "preferred_ai_core_display"
should_generate_icons = TRUE
diff --git a/code/modules/client/preferences/ai_emote_display.dm b/code/modules/client/preferences/ai_emote_display.dm
index 685887e4e49..b0472b48cb4 100644
--- a/code/modules/client/preferences/ai_emote_display.dm
+++ b/code/modules/client/preferences/ai_emote_display.dm
@@ -1,6 +1,6 @@
/// What to show on the AI monitor
/datum/preference/choiced/ai_emote_display
- category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
+ category = PREFERENCE_CATEGORY_SILICON_PREFS // BUBBER EDIT CHANGE - Original: PREFERENCE_CATEGORY_NON_CONTEXTUAL
savefile_identifier = PREFERENCE_CHARACTER
savefile_key = "preferred_ai_emote_display"
should_generate_icons = TRUE
diff --git a/code/modules/client/preferences/ai_hologram_display.dm b/code/modules/client/preferences/ai_hologram_display.dm
index f82803039cc..5cc0f944e0b 100644
--- a/code/modules/client/preferences/ai_hologram_display.dm
+++ b/code/modules/client/preferences/ai_hologram_display.dm
@@ -1,6 +1,6 @@
/// What to show on the AI hologram
/datum/preference/choiced/ai_hologram_display
- category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
+ category = PREFERENCE_CATEGORY_SILICON_PREFS // BUBBER EDIT CHANGE - Original: PREFERENCE_CATEGORY_NON_CONTEXTUAL
savefile_identifier = PREFERENCE_CHARACTER
savefile_key = "preferred_ai_hologram_display"
should_generate_icons = TRUE
diff --git a/code/modules/client/preferences/random.dm b/code/modules/client/preferences/random.dm
index a28c46a4c95..05ac23667ba 100644
--- a/code/modules/client/preferences/random.dm
+++ b/code/modules/client/preferences/random.dm
@@ -18,7 +18,7 @@
return RANDOM_DISABLED
/datum/preference/toggle/random_hardcore
- category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
+ category = PREFERENCE_CATEGORY_OOC_PREFS // BUBBER EDIT CHANGE - Original: PREFERENCE_CATEGORY_NON_CONTEXTUAL
savefile_key = "random_hardcore"
savefile_identifier = PREFERENCE_CHARACTER
can_randomize = FALSE
diff --git a/code/modules/client/preferences/silicon_gender.dm b/code/modules/client/preferences/silicon_gender.dm
index 65d7b27b582..332d6aa9079 100644
--- a/code/modules/client/preferences/silicon_gender.dm
+++ b/code/modules/client/preferences/silicon_gender.dm
@@ -4,7 +4,7 @@
#define SILICON_NEUTER "It/Its"
/datum/preference/choiced/silicon_gender
- category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
+ category = PREFERENCE_CATEGORY_SILICON_PREFS // BUBBER EDIT CHANGE - Original: PREFERENCE_CATEGORY_NON_CONTEXTUAL
savefile_identifier = PREFERENCE_CHARACTER
savefile_key = "silicon_gender"
var/static/use_character_gender = "Use character gender"
diff --git a/code/modules/client/preferences/species_features/basic.dm b/code/modules/client/preferences/species_features/basic.dm
index b33f2818bda..594e63c57a0 100644
--- a/code/modules/client/preferences/species_features/basic.dm
+++ b/code/modules/client/preferences/species_features/basic.dm
@@ -23,7 +23,7 @@
priority = PREFERENCE_PRIORITY_BODYPARTS
savefile_key = "eye_color"
savefile_identifier = PREFERENCE_CHARACTER
- category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
+ category = PREFERENCE_CATEGORY_CHARACTER_BASICS // BUBBER EDIT CHANGE - Original: PREFERENCE_CATEGORY_SECONDARY_FEATURES
relevant_head_flag = HEAD_EYECOLOR
/datum/preference/color/eye_color/apply_to_human(mob/living/carbon/human/target, value)
diff --git a/modular_skyrat/master_files/code/modules/client/preferences/brain.dm b/modular_skyrat/master_files/code/modules/client/preferences/brain.dm
index 386412d3133..6c490dd2b69 100644
--- a/modular_skyrat/master_files/code/modules/client/preferences/brain.dm
+++ b/modular_skyrat/master_files/code/modules/client/preferences/brain.dm
@@ -1,5 +1,5 @@
/datum/preference/choiced/brain_type
- category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
+ category = PREFERENCE_CATEGORY_SILICON_PREFS
savefile_key = "brain_type"
savefile_identifier = PREFERENCE_CHARACTER
priority = PREFERENCE_PRIORITY_NAMES // Apply after species, cause that's super important.
diff --git a/modular_skyrat/master_files/code/modules/client/preferences/erp_preferences.dm b/modular_skyrat/master_files/code/modules/client/preferences/erp_preferences.dm
index c77508b6594..69cd36502a1 100644
--- a/modular_skyrat/master_files/code/modules/client/preferences/erp_preferences.dm
+++ b/modular_skyrat/master_files/code/modules/client/preferences/erp_preferences.dm
@@ -130,7 +130,7 @@
savefile_key = "new_genitalia_growth_pref"
/datum/preference/choiced/erp_status
- category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
+ category = PREFERENCE_CATEGORY_OOC_PREFS
savefile_identifier = PREFERENCE_CHARACTER
savefile_key = "erp_status_pref"
@@ -180,7 +180,7 @@
return FALSE
/datum/preference/choiced/erp_status_nc
- category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
+ category = PREFERENCE_CATEGORY_OOC_PREFS
savefile_identifier = PREFERENCE_CHARACTER
savefile_key = "erp_status_pref_nc"
@@ -210,7 +210,7 @@
return FALSE
/datum/preference/choiced/erp_status_v
- category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
+ category = PREFERENCE_CATEGORY_OOC_PREFS
savefile_identifier = PREFERENCE_CHARACTER
savefile_key = "erp_status_pref_v"
@@ -240,7 +240,7 @@
return FALSE
/datum/preference/choiced/erp_status_mechanics
- category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
+ category = PREFERENCE_CATEGORY_OOC_PREFS
savefile_identifier = PREFERENCE_CHARACTER
savefile_key = "erp_status_pref_mechanics"
@@ -300,7 +300,7 @@
return FALSE
/datum/preference/choiced/erp_status_hypno
- category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
+ category = PREFERENCE_CATEGORY_OOC_PREFS
savefile_identifier = PREFERENCE_CHARACTER
savefile_key = "erp_status_pref_hypnosis"
diff --git a/modular_skyrat/master_files/code/modules/client/preferences/flavor_text.dm b/modular_skyrat/master_files/code/modules/client/preferences/flavor_text.dm
index fbd71e61ecf..413add1b0cc 100644
--- a/modular_skyrat/master_files/code/modules/client/preferences/flavor_text.dm
+++ b/modular_skyrat/master_files/code/modules/client/preferences/flavor_text.dm
@@ -1,5 +1,5 @@
/datum/preference/text/flavor_text
- category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
+ category = PREFERENCE_CATEGORY_CHARACTER_BASICS
savefile_identifier = PREFERENCE_CHARACTER
savefile_key = "flavor_text"
maximum_value_length = MAX_FLAVOR_LEN
@@ -8,7 +8,7 @@
target.dna.features["flavor_text"] = value
/datum/preference/text/silicon_flavor_text
- category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
+ category = PREFERENCE_CATEGORY_SILICON_PREFS
savefile_identifier = PREFERENCE_CHARACTER
savefile_key = "silicon_flavor_text"
maximum_value_length = MAX_FLAVOR_LEN
@@ -18,7 +18,7 @@
return FALSE // To prevent the not-implemented runtime
/datum/preference/text/ooc_notes
- category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
+ category = PREFERENCE_CATEGORY_OOC_PREFS
savefile_identifier = PREFERENCE_CHARACTER
savefile_key = "ooc_notes"
maximum_value_length = MAX_FLAVOR_LEN
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 7bc229b0d0a..ba4d6cc9cfe 100644
--- a/modular_skyrat/master_files/code/modules/client/preferences/genitals.dm
+++ b/modular_skyrat/master_files/code/modules/client/preferences/genitals.dm
@@ -3,7 +3,7 @@
// ABSTRACT TYPES
/datum/preference/toggle/allow_genitals
- category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
+ category = PREFERENCE_CATEGORY_CHARACTER_BASICS
savefile_identifier = PREFERENCE_CHARACTER
savefile_key = "allow_genitals_toggle"
default_value = TRUE
@@ -19,7 +19,7 @@
return erp_allowed && passed_initial_check
/datum/preference/choiced/genital
- category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
+ category = PREFERENCE_CATEGORY_CHARACTER_BASICS
savefile_identifier = PREFERENCE_CHARACTER
abstract_type = /datum/preference/choiced/genital
@@ -74,7 +74,7 @@
return assoc_to_keys_features(SSaccessories.sprite_accessories[relevant_mutant_bodypart])
/datum/preference/toggle/genital_skin_tone
- category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
+ category = PREFERENCE_CATEGORY_CHARACTER_BASICS
savefile_identifier = PREFERENCE_CHARACTER
default_value = FALSE
abstract_type = /datum/preference/toggle/genital_skin_tone
@@ -91,7 +91,7 @@
return erp_allowed && (passed_initial_check || allowed)
/datum/preference/toggle/genital_skin_color
- category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
+ category = PREFERENCE_CATEGORY_CHARACTER_BASICS
savefile_identifier = PREFERENCE_CHARACTER
default_value = FALSE
abstract_type = /datum/preference/toggle/genital_skin_color
@@ -123,7 +123,7 @@
/datum/preference/tri_color/genital
- category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
+ category = PREFERENCE_CATEGORY_CHARACTER_BASICS
savefile_identifier = PREFERENCE_CHARACTER
check_mode = TRICOLOR_CHECK_ACCESSORY
abstract_type = /datum/preference/tri_color/genital
@@ -141,7 +141,7 @@
return erp_allowed && can_color && passed_initial_check
/datum/preference/tri_bool/genital
- category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
+ category = PREFERENCE_CATEGORY_CHARACTER_BASICS
savefile_identifier = PREFERENCE_CHARACTER
check_mode = TRICOLOR_CHECK_ACCESSORY
abstract_type = /datum/preference/tri_bool/genital
diff --git a/modular_skyrat/master_files/code/modules/client/preferences/headshot.dm b/modular_skyrat/master_files/code/modules/client/preferences/headshot.dm
index cc68f9dbd99..b2f17de3322 100644
--- a/modular_skyrat/master_files/code/modules/client/preferences/headshot.dm
+++ b/modular_skyrat/master_files/code/modules/client/preferences/headshot.dm
@@ -1,7 +1,7 @@
// Hey listen! Imgur doesn't actually work, it's been tested.
/datum/preference/text/headshot
- category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
+ category = PREFERENCE_CATEGORY_CHARACTER_BASICS
savefile_identifier = PREFERENCE_CHARACTER
savefile_key = "headshot"
maximum_value_length = MAX_MESSAGE_LEN
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 30ac9d54b2e..d357ecc42d2 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
@@ -36,7 +36,7 @@
return ..()
/datum/preference/toggle/allow_emissives
- category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
+ category = PREFERENCE_CATEGORY_CHARACTER_BASICS
savefile_identifier = PREFERENCE_CHARACTER
savefile_key = "allow_emissives_toggle" // no 'e' so it goes right after allow_mismatched_parts, not before
default_value = FALSE
@@ -45,7 +45,7 @@
return TRUE // we dont actually want this to do anything
/datum/preference/tri_color/mutant_colors
- category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
+ category = PREFERENCE_CATEGORY_CHARACTER_BASICS
savefile_identifier = PREFERENCE_CHARACTER
savefile_key = "mutant_colors_color"
check_mode = TRICOLOR_NO_CHECK
@@ -58,7 +58,7 @@
/datum/preference/toggle/eye_emissives
savefile_key = "eye_emissives"
savefile_identifier = PREFERENCE_CHARACTER
- category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
+ category = PREFERENCE_CATEGORY_CHARACTER_BASICS
relevant_head_flag = HEAD_EYECOLOR
/datum/preference/toggle/eye_emissives/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences)
@@ -140,24 +140,26 @@
/// Tails
/datum/preference/toggle/mutant_toggle/tail
+ category = PREFERENCE_CATEGORY_CHARACTER_BASICS
savefile_key = "tail_toggle"
relevant_mutant_bodypart = "tail"
/datum/preference/choiced/mutant_choice/tail
+ category = PREFERENCE_CATEGORY_CHARACTER_BASICS
savefile_key = "feature_tail"
relevant_mutant_bodypart = "tail"
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
+ category = PREFERENCE_CATEGORY_CHARACTER_BASICS
savefile_identifier = PREFERENCE_CHARACTER
savefile_key = "tail_color"
relevant_mutant_bodypart = "tail"
type_to_check = /datum/preference/toggle/mutant_toggle/tail
/datum/preference/tri_bool/tail
- category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
+ category = PREFERENCE_CATEGORY_CHARACTER_BASICS
savefile_identifier = PREFERENCE_CHARACTER
savefile_key = "tail_emissive"
relevant_mutant_bodypart = "tail"
@@ -166,10 +168,12 @@
/// Snouts
/datum/preference/toggle/mutant_toggle/snout
+ category = PREFERENCE_CATEGORY_CHARACTER_BASICS
savefile_key = "snout_toggle"
relevant_mutant_bodypart = "snout"
/datum/preference/choiced/mutant_choice/snout
+ category = PREFERENCE_CATEGORY_CHARACTER_BASICS
savefile_key = "feature_snout"
relevant_mutant_bodypart = "snout"
type_to_check = /datum/preference/toggle/mutant_toggle/snout
@@ -190,14 +194,14 @@
target.synchronize_bodyshapes()
/datum/preference/tri_color/snout
- category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
+ category = PREFERENCE_CATEGORY_CHARACTER_BASICS
savefile_identifier = PREFERENCE_CHARACTER
savefile_key = "snout_color"
relevant_mutant_bodypart = "snout"
type_to_check = /datum/preference/toggle/mutant_toggle/snout
/datum/preference/tri_bool/snout
- category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
+ category = PREFERENCE_CATEGORY_CHARACTER_BASICS
savefile_identifier = PREFERENCE_CHARACTER
savefile_key = "snout_emissive"
relevant_mutant_bodypart = "snout"
@@ -206,24 +210,26 @@
/// Horns
/datum/preference/toggle/mutant_toggle/horns
+ category = PREFERENCE_CATEGORY_CHARACTER_BASICS
savefile_key = "horns_toggle"
relevant_mutant_bodypart = "horns"
/datum/preference/choiced/mutant_choice/horns
+ category = PREFERENCE_CATEGORY_CHARACTER_BASICS
savefile_key = "feature_horns"
relevant_mutant_bodypart = "horns"
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
+ category = PREFERENCE_CATEGORY_CHARACTER_BASICS
savefile_identifier = PREFERENCE_CHARACTER
savefile_key = "horns_color"
relevant_mutant_bodypart = "horns"
type_to_check = /datum/preference/toggle/mutant_toggle/horns
/datum/preference/tri_bool/horns
- category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
+ category = PREFERENCE_CATEGORY_CHARACTER_BASICS
savefile_identifier = PREFERENCE_CHARACTER
savefile_key = "horns_emissive"
relevant_mutant_bodypart = "horns"
@@ -232,24 +238,26 @@
/// Ears
/datum/preference/toggle/mutant_toggle/ears
+ category = PREFERENCE_CATEGORY_CHARACTER_BASICS
savefile_key = "ears_toggle"
relevant_mutant_bodypart = "ears"
/datum/preference/choiced/mutant_choice/ears
+ category = PREFERENCE_CATEGORY_CHARACTER_BASICS
savefile_key = "feature_ears"
relevant_mutant_bodypart = "ears"
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
+ category = PREFERENCE_CATEGORY_CHARACTER_BASICS
savefile_identifier = PREFERENCE_CHARACTER
savefile_key = "ears_color"
relevant_mutant_bodypart = "ears"
type_to_check = /datum/preference/toggle/mutant_toggle/ears
/datum/preference/tri_bool/ears
- category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
+ category = PREFERENCE_CATEGORY_CHARACTER_BASICS
savefile_identifier = PREFERENCE_CHARACTER
savefile_key = "ears_emissive"
relevant_mutant_bodypart = "ears"
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 85a08559c80..f1046a01ce3 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
@@ -2,7 +2,7 @@
/datum/preference/choiced/digitigrade_legs
savefile_key = "digitigrade_legs"
savefile_identifier = PREFERENCE_CHARACTER
- category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
+ category = PREFERENCE_CATEGORY_CHARACTER_BASICS
relevant_mutant_bodypart = "legs"
diff --git a/modular_zubbers/code/modules/client/flavor_text/flavor_text.dm b/modular_zubbers/code/modules/client/flavor_text/flavor_text.dm
index a3091df0cbc..4d2a252dd73 100644
--- a/modular_zubbers/code/modules/client/flavor_text/flavor_text.dm
+++ b/modular_zubbers/code/modules/client/flavor_text/flavor_text.dm
@@ -12,7 +12,7 @@
var/art_ref = ""
/datum/preference/text/flavor_text_nsfw
- category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
+ category = PREFERENCE_CATEGORY_CHARACTER_BASICS
savefile_identifier = PREFERENCE_CHARACTER
savefile_key = "flavor_text_nsfw"
maximum_value_length = MAX_FLAVOR_LEN
@@ -53,6 +53,7 @@
//This is just a silicon variant of the NSFW flavor text.
/datum/preference/text/flavor_text_nsfw/silicon
+ category = PREFERENCE_CATEGORY_SILICON_PREFS
savefile_key = "silicon_flavor_text_nsfw"
/datum/preference/text/flavor_text_nsfw/silicon/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences)
@@ -91,6 +92,7 @@
//This is literally just the same as the original headshot pref but for silicons :)
/datum/preference/text/headshot/silicon
+ category = PREFERENCE_CATEGORY_SILICON_PREFS
savefile_key = "headshot_silicon"
/datum/preference/text/headshot/silicon/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences)
@@ -131,7 +133,7 @@
usr?.client?.prefs.art_ref = value
/datum/preference/toggle/art_ref_nsfw
- category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
+ category = PREFERENCE_CATEGORY_CHARACTER_BASICS
savefile_identifier = PREFERENCE_CHARACTER
savefile_key = "art_ref_nsfw"
default_value = FALSE
@@ -143,6 +145,7 @@
//OOC notes for Silicons. Overwrites regular OOC notes when you are playing a Silicon character.
//TODO: Make this your regular OOC notes if you don't have Silicon ones. Every time I've tried, for some reason regular OOC notes haven't shown.
/datum/preference/text/ooc_notes/silicon
+ category = PREFERENCE_CATEGORY_SILICON_PREFS
savefile_key = "ooc_notes_silicon"
/datum/preference/text/ooc_notes/silicon/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences)
@@ -150,12 +153,14 @@
//Custom species and lore for silicons, also known as "Custom Model." This allows silicons to define a custom species rather than receiving, by default "A cyborg unit." BORING.
/datum/preference/text/custom_species/silicon
+ category = PREFERENCE_CATEGORY_SILICON_PREFS
savefile_key = "custom_species_silicon"
/datum/preference/text/custom_species/silicon/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences)
return FALSE
/datum/preference/text/custom_species_lore/silicon
+ category = PREFERENCE_CATEGORY_SILICON_PREFS
savefile_key = "custom_species_lore_silicon"
/datum/preference/text/custom_species_lore/silicon/apply_to_human(mob/living/carbon/human/target, value, datum/preferences/preferences)
diff --git a/modular_zubbers/code/modules/client/preferences/blooper.dm b/modular_zubbers/code/modules/client/preferences/blooper.dm
index 1644c0d7d47..fbf31fdb30f 100644
--- a/modular_zubbers/code/modules/client/preferences/blooper.dm
+++ b/modular_zubbers/code/modules/client/preferences/blooper.dm
@@ -1,5 +1,5 @@
/datum/preference/choiced/blooper
- category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
+ category = PREFERENCE_CATEGORY_CHARACTER_BASICS
savefile_identifier = PREFERENCE_CHARACTER
savefile_key = "blooper_choice"
@@ -26,7 +26,7 @@
return data
/datum/preference/numeric/blooper_speed
- category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
+ category = PREFERENCE_CATEGORY_CHARACTER_BASICS
savefile_identifier = PREFERENCE_CHARACTER
savefile_key = "blooper_speed"
minimum = 0
@@ -42,7 +42,7 @@
return ..() && length(SSblooper.blooper_list)
/datum/preference/numeric/blooper_pitch
- category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
+ category = PREFERENCE_CATEGORY_CHARACTER_BASICS
savefile_identifier = PREFERENCE_CHARACTER
savefile_key = "blooper_pitch"
minimum = 0
@@ -58,7 +58,7 @@
return ..() && length(SSblooper.blooper_list)
/datum/preference/numeric/blooper_pitch_range
- category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
+ category = PREFERENCE_CATEGORY_CHARACTER_BASICS
savefile_identifier = PREFERENCE_CHARACTER
savefile_key = "blooper_pitch_range"
minimum = 0
diff --git a/modular_zubbers/code/modules/client/verbs/character_directory.dm b/modular_zubbers/code/modules/client/verbs/character_directory.dm
index 9d73ae69879..dc457529b6a 100644
--- a/modular_zubbers/code/modules/client/verbs/character_directory.dm
+++ b/modular_zubbers/code/modules/client/verbs/character_directory.dm
@@ -11,7 +11,7 @@ GLOBAL_DATUM(character_directory, /datum/character_directory)
//The advertisement that you show to people looking through the directory
/datum/preference/text/character_ad
savefile_key = "character_ad"
- category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
+ category = PREFERENCE_CATEGORY_OOC_PREFS
savefile_identifier = PREFERENCE_CHARACTER
maximum_value_length = MAX_FLAVOR_LEN
@@ -25,7 +25,7 @@ GLOBAL_DATUM(character_directory, /datum/character_directory)
/datum/preference/choiced/attraction
savefile_key = "attraction"
- category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
+ category = PREFERENCE_CATEGORY_OOC_PREFS
savefile_identifier = PREFERENCE_CHARACTER
/datum/preference/choiced/attraction/init_possible_values()
@@ -39,7 +39,7 @@ GLOBAL_DATUM(character_directory, /datum/character_directory)
/datum/preference/choiced/display_gender
savefile_key = "display_gender"
- category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
+ category = PREFERENCE_CATEGORY_OOC_PREFS
savefile_identifier = PREFERENCE_CHARACTER
/datum/preference/choiced/display_gender/init_possible_values()
diff --git a/modular_zubbers/code/modules/rr_opt_in/rr_optin_preferences.dm b/modular_zubbers/code/modules/rr_opt_in/rr_optin_preferences.dm
index d985bb84781..9617014185e 100644
--- a/modular_zubbers/code/modules/rr_opt_in/rr_optin_preferences.dm
+++ b/modular_zubbers/code/modules/rr_opt_in/rr_optin_preferences.dm
@@ -1,5 +1,5 @@
/datum/preference/toggle/be_round_removed
- category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
+ category = PREFERENCE_CATEGORY_OOC_PREFS
savefile_identifier = PREFERENCE_CHARACTER
savefile_key = "be_round_removed"
diff --git a/modular_zubbers/master_files/code/modules/client/preferences/hypnopref.dm b/modular_zubbers/master_files/code/modules/client/preferences/hypnopref.dm
index f65b5cf861a..e6be063899d 100644
--- a/modular_zubbers/master_files/code/modules/client/preferences/hypnopref.dm
+++ b/modular_zubbers/master_files/code/modules/client/preferences/hypnopref.dm
@@ -1,5 +1,5 @@
/datum/preference/choiced/erp_status_hypno
- category = PREFERENCE_CATEGORY_NON_CONTEXTUAL
+ category = PREFERENCE_CATEGORY_OOC_PREFS
savefile_identifier = PREFERENCE_CHARACTER
savefile_key = "erp_status_pref_hypnosis"
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/MainPage.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/MainPage.tsx
index 5207225ec14..0b6d5942636 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/MainPage.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/MainPage.tsx
@@ -9,6 +9,7 @@ import {
Floating,
Input,
LabeledList,
+ NoticeBox,
Section,
Stack,
} from 'tgui-core/components';
@@ -493,6 +494,16 @@ export function MainPage(props: MainPageProps) {
const contextualPreferences =
data.character_preferences.secondary_features || [];
+ // BUBBER EDIT ADDITION BEGIN: more character setup tabs
+ const characterBasicsPreferences =
+ data.character_preferences.character_basics || [];
+
+ const oocPrefPreferences = data.character_preferences.ooc_preferences || [];
+
+ const siliconPreferences =
+ data.character_preferences.silicon_preferences || [];
+ // BUBBER EDIT ADDITION END: more character setup tabs
+
const mainFeatures = [
...Object.entries(data.character_preferences.clothing ?? {}),
...Object.entries(data.character_preferences.features ?? {}),
@@ -523,14 +534,30 @@ export function MainPage(props: MainPageProps) {
// BUBBER EDIT ADDITION BEGIN: SWAPPABLE PREF MENUS
enum PrefPage {
+ CharBasics, // Character basics
Visual, // The visual parts
Lore, // Lore, Flavor Text, Age, Records
+ OOCPref, // OOC preferences
+ Silicon, // Silicon prefs
}
- const [currentPrefPage, setCurrentPrefPage] = useState(PrefPage.Visual);
+ const [currentPrefPage, setCurrentPrefPage] = useState(PrefPage.CharBasics);
let prefPageContents;
switch (currentPrefPage) {
+ case PrefPage.CharBasics:
+ prefPageContents = (
+
+ );
+ break;
case PrefPage.Visual:
prefPageContents = (
);
break;
+ case PrefPage.OOCPref:
+ prefPageContents = (
+
+ );
+ break;
+ case PrefPage.Silicon:
+ prefPageContents = (
+ <>
+
+ This tab is for preferences that only apply when playing the AI or
+ Cyborg jobs!
+
+
+ >
+ );
+ break;
default:
exhaustiveCheck(currentPrefPage);
}
@@ -696,6 +755,15 @@ export function MainPage(props: MainPageProps) {
+
+
+ Character Basics
+
+
+
+
+ OOC Preferences
+
+
+
+
+ Silicon Preferences
+
+
{prefPageContents}
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/index.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/index.tsx
index d9570c38a96..bb756e188d4 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/index.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/index.tsx
@@ -1,6 +1,6 @@
import { useState } from 'react';
import { useBackend } from 'tgui/backend';
-import { NoticeBox, Stack, Button } from 'tgui-core/components'; // BUBBER EDIT CHANGE - ORIGINAL : import { NoticeBox, Stack } from 'tgui-core/components';
+import { Button, NoticeBox, Stack } from 'tgui-core/components'; // BUBBER EDIT CHANGE - ORIGINAL : import { NoticeBox, Stack } from 'tgui-core/components';
import { exhaustiveCheck } from 'tgui-core/exhaustive';
import { SideDropdown } from '../../../bubber_components/SideDropdown'; // BUBBER EDIT ADDITION
@@ -141,7 +141,9 @@ export function CharacterPreferenceWindow(props) {
{/* BUBBER EDIT ADDITION BEGIN */}
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/LimbsPage.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/LimbsPage.tsx
index 73e95f2865e..af41bc6bd60 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/LimbsPage.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/LimbsPage.tsx
@@ -47,6 +47,7 @@ export const Markings = (props) => {
width="100%"
options={props.limb.markings.marking_choices}
selected={marking.name}
+ buttons
onSelected={(shit) =>
act('change_marking', {
limb_slot: props.limb.slot,
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/index.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/index.tsx
index 4fdbe87cad7..42e77a9c13e 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/index.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/index.tsx
@@ -20,7 +20,7 @@ import { ServerPrefs } from './useServerPrefs';
export function PreferencesMenu(props) {
return (
-
+
{/* BUBBER change line 23 bigger char setup */}
}>
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/bubbers/species_features.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/bubbers/species_features.tsx
index 631ec1e8170..95b2fd25e01 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/bubbers/species_features.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/bubbers/species_features.tsx
@@ -86,7 +86,7 @@ export const display_gender: FeatureChoiced = {
};
export const flavor_text_nsfw: Feature = {
- name: 'NSFW Flavor Text',
+ name: 'Flavor Text (NSFW)',
description:
'The NSFW part of your flavor text. Used to store visual sexual details.',
component: FeatureTextInput,
@@ -129,7 +129,7 @@ export const headshot_silicon: Feature = {
};
export const headshot_nsfw: Feature = {
- name: 'NSFW Headshot',
+ name: 'Headshot (NSFW)',
description:
'Headshot, but for NSFW references. \
Requires a link ending with .png, .jpeg, or .jpg, starting with \
@@ -141,7 +141,7 @@ export const headshot_nsfw: Feature = {
};
export const headshot_silicon_nsfw: Feature = {
- name: 'Silicon NSFW Headshot',
+ name: 'Silicon Headshot (NSFW)',
description:
'Headshot, but for NSFW references on Silicons. \
Requires a link ending with .png, .jpeg, or .jpg, starting with \
@@ -182,7 +182,7 @@ export const art_ref: Feature = {
};
export const art_ref_nsfw: FeatureToggle = {
- name: 'Art Reference NSFW',
+ name: 'Art Reference (NSFW)',
description: 'Is your reference picture NSFW?',
component: CheckboxInput,
};
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/skyrat/species_features.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/skyrat/species_features.tsx
index bbc837e73d9..09963c10f14 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/skyrat/species_features.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/skyrat/species_features.tsx
@@ -145,6 +145,7 @@ export const eye_emissives: FeatureToggle = {
export const mutant_colors_color: Feature = {
name: 'Mutant Colors',
component: FeatureTriColorInput,
+ description: 'Body color used for non-human species.',
};
export const body_markings_toggle: FeatureToggle = {
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/types.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/types.ts
index e4b2b393b46..261bce48aac 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/types.ts
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/types.ts
@@ -189,16 +189,21 @@ export enum PrefsWindow {
export type CharacterPreferencesData = {
preview_options: string[]; // SKYRAT EDIT ADDITION
preview_selection: string; // SKYRAT EDIT ADDITION
- clothing: Record;
- features: Record;
- game_preferences: Record;
- non_contextual: {
- random_body: RandomSetting;
- [otherKey: string]: unknown;
- };
- secondary_features: Record;
- supplemental_features: Record;
- manually_rendered_features: Record;
+
+ character_preferences: {
+ clothing: Record;
+ features: Record;
+ game_preferences: Record;
+ non_contextual: {
+ random_body: RandomSetting;
+ [otherKey: string]: unknown;
+ };
+ secondary_features: Record;
+ character_basics: Record; // BUBBER EDIT ADDITION: more character setup tabs
+ ooc_preferences: Record; // BUBBER EDIT ADDITION: more character setup tabs
+ silicon_preferences: Record; // BUBBER EDIT ADDITION: more character setup tabs
+ supplemental_features: Record;
+ manually_rendered_features: Record;
names: Record;