diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index 9cae56645f..a057d3cf41 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -200,3 +200,8 @@ #define G_FEMALE 2 #define G_PLURAL 3 #define G_NEUTER 4 + +#define PREVIEW_PREF_JOB "Job" +#define PREVIEW_PREF_LOADOUT "Loadout" +#define PREVIEW_PREF_NAKED "Naked" +#define PREVIEW_PREF_NAKED_AROUSED "Naked - Aroused" diff --git a/code/__DEFINES/loadout.dm b/code/__DEFINES/loadout.dm index 4a52d25fb3..0b1db1ecc6 100644 --- a/code/__DEFINES/loadout.dm +++ b/code/__DEFINES/loadout.dm @@ -88,12 +88,21 @@ //the names of the customization tabs #define SETTINGS_TAB 0 -#define GAME_PREFERENCES_TAB 1 -#define APPEARANCE_TAB 2 -#define SPEECH_TAB 3 -#define LOADOUT_TAB 4 -#define CONTENT_PREFERENCES_TAB 5 -#define KEYBINDINGS_TAB 6 +#define PREFERENCES_TAB 1 +#define KEYBINDINGS_TAB 2 + +//subtabs for the character settings tab +#define GENERAL_CHAR_TAB 0 +#define BACKGROUND_CHAR_TAB 1 +#define APPEARANCE_CHAR_TAB 2 +#define MARKINGS_CHAR_TAB 3 +#define SPEECH_CHAR_TAB 4 +#define LOADOUT_CHAR_TAB 5 + +//subtabs for preferences tab +#define GAME_PREFS_TAB 0 +#define OOC_PREFS_TAB 1 +#define CONTENT_PREFS_TAB 2 //quirks #define QUIRK_POSITIVE "Positive" diff --git a/code/_globalvars/lists/loadout_categories.dm b/code/_globalvars/lists/loadout_categories.dm index 4ddb451f19..37e6145e47 100644 --- a/code/_globalvars/lists/loadout_categories.dm +++ b/code/_globalvars/lists/loadout_categories.dm @@ -1,10 +1,10 @@ GLOBAL_LIST_INIT(loadout_categories, list( - LOADOUT_CATEGORY_ACCESSORY = LOADOUT_SUBCATEGORIES_NONE, LOADOUT_CATEGORY_BACKPACK = list(LOADOUT_SUBCATEGORY_BACKPACK_GENERAL, LOADOUT_SUBCATEGORY_BACKPACK_TOYS), LOADOUT_CATEGORY_NECK = list(LOADOUT_SUBCATEGORY_NECK_GENERAL, LOADOUT_SUBCATEGORY_NECK_TIE, LOADOUT_SUBCATEGORY_NECK_SCARVES), LOADOUT_CATEGORY_MASK = LOADOUT_SUBCATEGORIES_NONE, LOADOUT_CATEGORY_HANDS = LOADOUT_SUBCATEGORIES_NONE, LOADOUT_CATEGORY_UNIFORM = list(LOADOUT_SUBCATEGORY_UNIFORM_GENERAL, LOADOUT_SUBCATEGORY_UNIFORM_JOBS, LOADOUT_SUBCATEGORY_UNIFORM_SUITS, LOADOUT_SUBCATEGORY_UNIFORM_SKIRTS, LOADOUT_SUBCATEGORY_UNIFORM_DRESSES, LOADOUT_SUBCATEGORY_UNIFORM_SWEATERS, LOADOUT_SUBCATEGORY_UNIFORM_PANTS, LOADOUT_SUBCATEGORY_UNIFORM_SHORTS), + LOADOUT_CATEGORY_ACCESSORY = LOADOUT_SUBCATEGORIES_NONE, LOADOUT_CATEGORY_SUIT = list(LOADOUT_SUBCATEGORY_SUIT_GENERAL, LOADOUT_SUBCATEGORY_SUIT_COATS, LOADOUT_SUBCATEGORY_SUIT_JACKETS, LOADOUT_SUBCATEGORY_SUIT_JOBS), LOADOUT_CATEGORY_HEAD = list(LOADOUT_SUBCATEGORY_HEAD_GENERAL, LOADOUT_SUBCATEGORY_HEAD_JOBS), LOADOUT_CATEGORY_SHOES = LOADOUT_SUBCATEGORIES_NONE, diff --git a/code/_onclick/hud/new_player.dm b/code/_onclick/hud/new_player.dm index 4eff9cd7e6..b01199c6c2 100644 --- a/code/_onclick/hud/new_player.dm +++ b/code/_onclick/hud/new_player.dm @@ -280,7 +280,7 @@ if(!.) return - hud.mymob.client.prefs.current_tab = GAME_PREFERENCES_TAB + hud.mymob.client.prefs.current_tab = PREFERENCES_TAB hud.mymob.client.prefs.ShowChoices(hud.mymob) /atom/movable/screen/lobby/button/bottom/changelog_button diff --git a/code/modules/arousal/genitals.dm b/code/modules/arousal/genitals.dm index 3e16a46526..e9fe56cadf 100644 --- a/code/modules/arousal/genitals.dm +++ b/code/modules/arousal/genitals.dm @@ -41,7 +41,8 @@ return FALSE if(!((HAS_TRAIT(owner,TRAIT_PERMABONER) && !new_state) || HAS_TRAIT(owner,TRAIT_NEVERBONER) && new_state)) aroused_state = new_state - owner.log_message("[src]'s arousal was [new_state ? "enabled" : "disabled"] due to [cause]", LOG_EMOTE) + if(cause) + owner.log_message("[src]'s arousal was [new_state ? "enabled" : "disabled"] due to [cause]", LOG_EMOTE) return aroused_state /obj/item/organ/genital/proc/update() diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 20db71a3dc..43f800b812 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -221,6 +221,10 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/show_mismatched_markings = FALSE //determines whether or not the markings lists should show markings that don't match the currently selected species. Intentionally left unsaved. + var/character_settings_tab = GENERAL_CHAR_TAB + var/preferences_tab = GAME_PREFS_TAB + var/preview_pref = PREVIEW_PREF_JOB + var/no_tetris_storage = FALSE ///loadout stuff @@ -300,11 +304,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/list/dat = list("
| "
- if(jobban_isbanned(user, "appearance"))
- dat += "You are banned from using custom names and appearances. You can continue to adjust your characters, but you will be randomised once you join the game. " - dat += "Random Name " - dat += "Always Random Name:[be_random_name ? "Yes" : "No"] " + dat += " " - dat += "[nameless ? "Default designation" : "Name"]:" - dat += "[real_name] " - dat += "Be nameless: [nameless ? "Yes" : "No"] " + dat += " " - dat += "Age: [age] " - - dat += "Special Names: " - var/old_group - for(var/custom_name_id in GLOB.preferences_custom_names) - var/namedata = GLOB.preferences_custom_names[custom_name_id] - if(!old_group) - old_group = namedata["group"] - else if(old_group != namedata["group"]) - old_group = namedata["group"] - dat += " " - dat += "[namedata["pref_name"]]: [custom_names[custom_name_id]] " - dat += " " - - dat += "Custom job preferences: " - dat += "Preferred AI Core Display: [preferred_ai_core_display] " - dat += "Preferred Security Department: [prefered_security_department] | "
- dat += "
| "
+ dat += " " + dat += " " + dat += "[PREVIEW_PREF_NAKED_AROUSED]" + dat += " | "
+ if(character_settings_tab == LOADOUT_CHAR_TAB) //if loadout
+ //calculate your gear points from the chosen item
+ gear_points = CONFIG_GET(number/initial_gear_points)
+ var/list/chosen_gear = loadout_data["SAVE_[loadout_slot]"]
+ if(chosen_gear)
+ for(var/loadout_item in chosen_gear)
+ var/loadout_item_path = loadout_item[LOADOUT_ITEM]
+ if(loadout_item_path)
+ var/datum/gear/loadout_gear = text2path(loadout_item_path)
+ if(loadout_gear)
+ gear_points -= initial(loadout_gear.cost)
else
- dat += "[security_records]"
+ chosen_gear = list()
+
+ dat += ""
+ dat += " " + dat += " | "
else
- dat += "[TextPreview(security_records)]..."
+ dat += " " + dat += " | "
- dat += "
| "
+ if(jobban_isbanned(user, "appearance"))
+ dat += "You are banned from using custom names and appearances. You can continue to adjust your characters, but you will be randomised once you join the game. " - dat += "
[GLOB.all_mutant_parts[mutant_part]]" - dat += "[features[mutant_part]]" - var/color_type = GLOB.colored_mutant_parts[mutant_part] //if it can be coloured, show the appropriate button - if(color_type) - dat += " Change" + dat += " Flavor Text" + dat += "Set Examine Text" + if(length(features["flavor_text"]) <= MAX_FLAVOR_PREVIEW_LEN) + if(!length(features["flavor_text"])) + dat += "\[...\]" + else + dat += "[features["flavor_text"]]" else - if(features["color_scheme"] == ADVANCED_CHARACTER_COLORING) //advanced individual part colouring system - //is it matrixed or does it have extra parts to be coloured? - var/find_part = features[mutant_part] || pref_species.mutant_bodyparts[mutant_part] - var/find_part_list = GLOB.mutant_reference_list[mutant_part] - if(find_part && find_part != "None" && find_part_list) - var/datum/sprite_accessory/accessory = find_part_list[find_part] - if(accessory) - if(accessory.color_src == MATRIXED || accessory.color_src == MUTCOLORS || accessory.color_src == MUTCOLORS2 || accessory.color_src == MUTCOLORS3) //mutcolors1-3 are deprecated now, please don't rely on these in the future - var/mutant_string = accessory.mutant_part_string - var/primary_feature = "[mutant_string]_primary" - var/secondary_feature = "[mutant_string]_secondary" - var/tertiary_feature = "[mutant_string]_tertiary" - if(!features[primary_feature]) - features[primary_feature] = features["mcolor"] - if(!features[secondary_feature]) - features[secondary_feature] = features["mcolor2"] - if(!features[tertiary_feature]) - features[tertiary_feature] = features["mcolor3"] + dat += "[TextPreview(features["flavor_text"])]..." + dat += " Silicon Flavor Text" + dat += "Set Silicon Examine Text" + if(length(features["silicon_flavor_text"]) <= MAX_FLAVOR_PREVIEW_LEN) + if(!length(features["silicon_flavor_text"])) + dat += "\[...\]" + else + dat += "[features["silicon_flavor_text"]]" + else + dat += "[TextPreview(features["silicon_flavor_text"])]..." + dat += " OOC notes" + dat += "Set OOC notes" + var/ooc_notes_len = length(features["ooc_notes"]) + if(ooc_notes_len <= MAX_FLAVOR_PREVIEW_LEN) + if(!ooc_notes_len) + dat += "\[...\]" + else + dat += "[features["ooc_notes"]]" + else + dat += "[TextPreview(features["ooc_notes"])]..." + dat += "" - var/matrixed_sections = accessory.matrixed_sections - if(accessory.color_src == MATRIXED && !matrixed_sections) - message_admins("Sprite Accessory Failure (customization): Accessory [accessory.type] is a matrixed item without any matrixed sections set!") - continue - else if(accessory.color_src == MATRIXED) - switch(matrixed_sections) - if(MATRIX_GREEN) //only composed of a green section - primary_feature = secondary_feature //swap primary for secondary, so it properly assigns the second colour, reserved for the green section - if(MATRIX_BLUE) - primary_feature = tertiary_feature //same as above, but the tertiary feature is for the blue section - if(MATRIX_RED_BLUE) //composed of a red and blue section - secondary_feature = tertiary_feature //swap secondary for tertiary, as blue should always be tertiary - if(MATRIX_GREEN_BLUE) //composed of a green and blue section - primary_feature = secondary_feature //swap primary for secondary, as first option is green, which is linked to the secondary - secondary_feature = tertiary_feature //swap secondary for tertiary, as second option is blue, which is linked to the tertiary - dat += "Primary Color " - dat += " Change " - if((accessory.color_src == MATRIXED && (matrixed_sections == MATRIX_RED_BLUE || matrixed_sections == MATRIX_GREEN_BLUE || matrixed_sections == MATRIX_RED_GREEN || matrixed_sections == MATRIX_ALL)) || (accessory.extra && (accessory.extra_color_src == MUTCOLORS || accessory.extra_color_src == MUTCOLORS2 || accessory.extra_color_src == MUTCOLORS3))) - dat += "Secondary Color " - dat += " Change " - if((accessory.color_src == MATRIXED && matrixed_sections == MATRIX_ALL) || (accessory.extra2 && (accessory.extra2_color_src == MUTCOLORS || accessory.extra2_color_src == MUTCOLORS2 || accessory.extra2_color_src == MUTCOLORS3))) - dat += "Tertiary Color " - dat += " Change " + dat += " "
+ dat += " | Records" + dat += "Security Records" + if(length_char(security_records) <= 40) + if(!length(security_records)) + dat += "\[...\]" + else + dat += "[security_records]" + else + dat += "[TextPreview(security_records)]..." - mutant_category++ - if(mutant_category >= MAX_MUTANT_ROWS) + dat += " Medical Records " + if(length_char(medical_records) <= 40) + if(!length(medical_records)) + dat += "\[...\]" + else + dat += "[medical_records]" + else + dat += "[TextPreview(medical_records)]..." + dat += "
| "
- mutant_category = 0
+ dat += ""
+ dat += "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"
+ dat += "Clothing & Equipment" + dat += "Underwear:[underwear]" + if(GLOB.underwear_list[underwear]?.has_color) + dat += "Underwear Color: #[undie_color] Change" + dat += "Undershirt:[undershirt]" + if(GLOB.undershirt_list[undershirt]?.has_color) + dat += "Undershirt Color: #[shirt_color] Change " + dat += "Socks:[socks]" + if(GLOB.socks_list[socks]?.has_color) + dat += "Socks Color: #[socks_color] Change " + dat += "Backpack:[backbag]" + dat += "Jumpsuit: [jumpsuit_style] " + if((HAS_FLESH in pref_species.species_traits) || (HAS_BONE in pref_species.species_traits)) + dat += " Temporal Scarring: [(persistent_scars) ? "Enabled" : "Disabled"]" + dat += "Clear scar slots" + dat += "Uplink Location:[uplink_spawn_loc]" + dat += " | "
- dat += "
"
- dat += "Clothing & Equipment" - dat += "Underwear:[underwear]" - if(GLOB.underwear_list[underwear]?.has_color) - dat += "Underwear Color: Change" - dat += "Undershirt:[undershirt]" - if(GLOB.undershirt_list[undershirt]?.has_color) - dat += "Undershirt Color: Change " - dat += "Socks:[socks]" - if(GLOB.socks_list[socks]?.has_color) - dat += "Socks Color: Change " - dat += "Backpack:[backbag]" - dat += "Jumpsuit: [jumpsuit_style] " - if((HAS_FLESH in pref_species.species_traits) || (HAS_BONE in pref_species.species_traits)) - dat += " Temporal Scarring: [(persistent_scars) ? "Enabled" : "Disabled"]" - dat += "Clear scar slots" - dat += "Uplink Location:[uplink_spawn_loc]" - dat += " | "
-
- dat +=""
- if(NOGENITALS in pref_species.species_traits)
- dat += "Your species ([pref_species.name]) does not support genitals! " - else - if(pref_species.use_skintones) - dat += "Genitals use skintone:[features["genitals_use_skintone"] == TRUE ? "Yes" : "No"]" - dat += " Penis" - dat += "[features["has_cock"] == TRUE ? "Yes" : "No"]" - if(features["has_cock"]) - if(pref_species.use_skintones && features["genitals_use_skintone"] == TRUE) - dat += "Penis Color:" - dat += " (Skin tone overriding) " + if(NOGENITALS in pref_species.species_traits) + dat += "Your species ([pref_species.name]) does not support genitals! " else - dat += "Penis Color: " - dat += " Change " - var/tauric_shape = FALSE - if(features["cock_taur"]) - var/datum/sprite_accessory/penis/P = GLOB.cock_shapes_list[features["cock_shape"]] - if(P.taur_icon && parent.can_have_part("taur")) - var/datum/sprite_accessory/taur/T = GLOB.taur_list[features["taur"]] - if(T.taur_mode & P.accepted_taurs) - tauric_shape = TRUE - dat += "Penis Shape: [features["cock_shape"]][tauric_shape ? " (Taur)" : ""]" - dat += "Penis Length: [features["cock_length"]] inch(es)" - dat += "Penis Visibility:[features["cock_visibility"]]" - dat += "Has Testicles:[features["has_balls"] == TRUE ? "Yes" : "No"]" - if(features["has_balls"]) - if(pref_species.use_skintones && features["genitals_use_skintone"] == TRUE) - dat += "Testicles Color: " - dat += " (Skin tone overriding) " - else - dat += "Testicles Color: " - dat += " Change " - dat += "Testicles Shape: [features["balls_shape"]]" - dat += "Testicles Visibility:[features["balls_visibility"]]" - dat += APPEARANCE_CATEGORY_COLUMN - dat += " Vagina" - dat += "[features["has_vag"] == TRUE ? "Yes" : "No"]" - if(features["has_vag"]) - dat += "Vagina Type: [features["vag_shape"]]" - if(pref_species.use_skintones && features["genitals_use_skintone"] == TRUE) - dat += "Vagina Color:" - dat += " (Skin tone overriding) " - else - dat += "Vagina Color: " - dat += " Change " - dat += "Vagina Visibility:[features["vag_visibility"]]" - dat += "Has Womb:[features["has_womb"] == TRUE ? "Yes" : "No"]" - dat += " | "
- dat += APPEARANCE_CATEGORY_COLUMN
- dat += "
"
- dat += "Speech preferences" - dat += "Custom Speech Verb:" - dat += "[custom_speech_verb] " - dat += "Custom Tongue: " - dat += "[custom_tongue] " - dat += "Additional Language " - dat += "[additional_language] " - dat += " | "
- dat += ""
- dat += "Vocal Bark preferences" - var/datum/bark/B = GLOB.bark_list[bark_id] - dat += "Vocal Bark Sound:" - dat += "[B ? initial(B.name) : "INVALID"] " - dat += "Vocal Bark Speed: [bark_speed] " - dat += "Vocal Bark Pitch: [bark_pitch] " - dat += "Vocal Bark Variance: [bark_variance] " - dat += " Preview Bark " - dat += " | "
- dat += "
"
- dat += "General Settings" - dat += "UI Style: [UI_style]" - dat += "Outline: [outline_enabled ? "Enabled" : "Disabled"] " - dat += "Outline Color: [outline_color ? "" : "Theme-based (null)"] Change " - dat += "Screentip: [screentip_pref] " - dat += "Screentip Color: Change " - dat += "\ - Screentip context with images: [screentip_images ? "Allowed" : "Disallowed"] " - dat += "tgui Monitors: [(tgui_lock) ? "Primary" : "All"] " - dat += "tgui Style: [(tgui_fancy) ? "Fancy" : "No Frills"] " - dat += "Show Runechat Chat Bubbles: [chat_on_map ? "Enabled" : "Disabled"] " - dat += "Runechat message char limit: [max_chat_length] " - dat += "See Runechat for non-mobs: [see_chat_non_mob ? "Enabled" : "Disabled"] " - dat += " " - dat += "Action Buttons: [(buttons_locked) ? "Locked In Place" : "Unlocked"] " - dat += " " - dat += "PDA Color: Change " - dat += "PDA Style: [pda_style] " - dat += "PDA Reskin: [pda_skin] " - dat += " " - dat += "Ghost Ears: [(chat_toggles & CHAT_GHOSTEARS) ? "All Speech" : "Nearest Creatures"] " - dat += "Ghost Radio: [(chat_toggles & CHAT_GHOSTRADIO) ? "All Messages":"No Messages"] " - dat += "Ghost Sight: [(chat_toggles & CHAT_GHOSTSIGHT) ? "All Emotes" : "Nearest Creatures"] " - dat += "Ghost Whispers: [(chat_toggles & CHAT_GHOSTWHISPER) ? "All Speech" : "Nearest Creatures"] " - dat += "Ghost PDA: [(chat_toggles & CHAT_GHOSTPDA) ? "All Messages" : "Nearest Creatures"] " - dat += "Window Flashing: [(windowflashing) ? "Enabled":"Disabled"] " - dat += " " - dat += "Play Admin MIDIs: [(toggles & SOUND_MIDI) ? "Enabled":"Disabled"] " - dat += "Play Lobby Music: [(toggles & SOUND_LOBBY) ? "Enabled":"Disabled"] " - dat += "See Pull Requests: [(chat_toggles & CHAT_PULLR) ? "Enabled":"Disabled"] " - dat += " " - if(user.client) - if(unlock_content) - dat += "BYOND Membership Publicity: [(toggles & MEMBER_PUBLIC) ? "Public" : "Hidden"] " - if(unlock_content || check_rights_for(user.client, R_ADMIN)) - dat += "OOC Color: Change " - dat += "Antag OOC Color: Change " - - dat += " | "
- if(user.client.holder)
- dat +=""
- dat += "Admin Settings" - dat += "Adminhelp Sounds: [(toggles & SOUND_ADMINHELP)?"Enabled":"Disabled"]" - dat += "Announce Login: [(toggles & ANNOUNCE_LOGIN)?"Enabled":"Disabled"] " - dat += " " - dat += "Combo HUD Lighting: [(toggles & COMBOHUD_LIGHTING)?"Full-bright":"No Change"] " - dat += " " - - //deadmin - dat += " Deadmin While Playing" - if(CONFIG_GET(flag/auto_deadmin_players)) - dat += "Always Deadmin: FORCED" - else - dat += "Always Deadmin: [(deadmin & DEADMIN_ALWAYS)?"Enabled":"Disabled"] " - if(!(deadmin & DEADMIN_ALWAYS)) - dat += " " - if(!CONFIG_GET(flag/auto_deadmin_antagonists)) - dat += "As Antag: [(deadmin & DEADMIN_ANTAGONIST)?"Deadmin":"Keep Admin"] " - else - dat += "As Antag: FORCED " - - if(!CONFIG_GET(flag/auto_deadmin_heads)) - dat += "As Command: [(deadmin & DEADMIN_POSITION_HEAD)?"Deadmin":"Keep Admin"] " - else - dat += "As Command: FORCED " - - if(!CONFIG_GET(flag/auto_deadmin_security)) - dat += "As Security: [(deadmin & DEADMIN_POSITION_SECURITY)?"Deadmin":"Keep Admin"] " - else - dat += "As Security: FORCED " - - if(!CONFIG_GET(flag/auto_deadmin_silicons)) - dat += "As Silicon: [(deadmin & DEADMIN_POSITION_SILICON)?"Deadmin":"Keep Admin"] " - else - dat += "As Silicon: FORCED " - dat += " | "
-
- dat +=""
- dat += "Citadel Preferences" //Because fuck me if preferences can't be fucking modularized and expected to update in a reasonable timeframe. - dat += "Widescreen: [widescreenpref ? "Enabled ([CONFIG_GET(string/default_view)])" : "Disabled (15x15)"]" - dat += "Long strip menu: [long_strip_menu ? "Enabled" : "Disabled"] " - dat += "Auto stand: [autostand ? "Enabled" : "Disabled"] " - dat += "Auto OOC: [auto_ooc ? "Enabled" : "Disabled"] " - dat += "Force Slot Storage HUD: [no_tetris_storage ? "Enabled" : "Disabled"] " - dat += "Screen Shake: [(screenshake==100) ? "Full" : ((screenshake==0) ? "None" : "[screenshake]")] " - if (user && user.client && !user.client.prefs.screenshake==0) - dat += "Damage Screen Shake: [(damagescreenshake==1) ? "On" : ((damagescreenshake==0) ? "Off" : "Only when down")] " - dat += "Recoil Screen Push: [(recoil_screenshake==100) ? "Full" : ((recoil_screenshake==0) ? "None" : "[screenshake]")] " - var/p_chaos - if (!preferred_chaos) - p_chaos = "No preference" - else - p_chaos = preferred_chaos - dat += "Preferred Chaos Amount: [p_chaos] " - dat += " " - dat += " | "
- dat += "
| Name | " - dat += "Cost | " - dat += "Restrictions | " - dat += "Description |
| [name][extra_loadout_data] | " - dat += "[gear.cost] | "
- if(islist(gear.restricted_roles))
- if(gear.restricted_roles.len)
- if(gear.restricted_desc)
- dat += ""
- dat += gear.restricted_desc
- dat += ""
+ dat += "Penis Color: " + dat += "#[features["cock_color"]] Change " + var/tauric_shape = FALSE + if(features["cock_taur"]) + var/datum/sprite_accessory/penis/P = GLOB.cock_shapes_list[features["cock_shape"]] + if(P.taur_icon && parent.can_have_part("taur")) + var/datum/sprite_accessory/taur/T = GLOB.taur_list[features["taur"]] + if(T.taur_mode & P.accepted_taurs) + tauric_shape = TRUE + dat += "Penis Shape: [features["cock_shape"]][tauric_shape ? " (Taur)" : ""]" + dat += "Penis Length: [features["cock_length"]] inch(es)" + dat += "Penis Visibility:[features["cock_visibility"]]" + dat += "Has Testicles:[features["has_balls"] == TRUE ? "Yes" : "No"]" + if(features["has_balls"]) + if(pref_species.use_skintones && features["genitals_use_skintone"] == TRUE) + dat += "Testicles Color: " + dat += "[SKINTONE2HEX(skin_tone)](Skin tone overriding) " else - dat += "" - dat += gear.restricted_roles.Join(";") - dat += "" - if(!istype(gear, /datum/gear/unlockable)) - // the below line essentially means "if the loadout item is picked by the user and has a custom description, give it the custom description, otherwise give it the default description" - dat += " | [loadout_item ? (loadout_item[LOADOUT_CUSTOM_DESCRIPTION] ? loadout_item[LOADOUT_CUSTOM_DESCRIPTION] : gear.description) : gear.description] | [loadout_item ? (loadout_item[LOADOUT_CUSTOM_DESCRIPTION] ? loadout_item[LOADOUT_CUSTOM_DESCRIPTION] : gear.description) : gear.description] Progress: [min(progress_made, unlockable.progress_required)]/[unlockable.progress_required] | " + dat += "Testicles Color:
"
+ dat += ""
+ dat += " | "
+ iterated_markings = 0
+ dat += "
| " + dat += " | " + dat += " | " + dat += " | " + dat += " | " + dat += " | " + dat += "" + + // list out the current markings you have + if(length(features[marking_type])) + var/list/markings = features[marking_type] + if(!islist(markings)) + // something went terribly wrong + markings = list() + + for(var/list/marking_list in markings) + var/marking_index = markings.Find(marking_list) // consider changing loop to go through indexes over lists instead of using Find here + var/limb_value = marking_list[1] + var/actual_name = GLOB.bodypart_names[num2text(limb_value)] // get the actual name from the bitflag representing the part the marking is applied to + if(actual_name != limb) + continue + var/color_marking_dat = "" + var/number_colors = 1 + var/datum/sprite_accessory/mam_body_markings/S = GLOB.mam_body_markings_list[marking_list[2]] + var/matrixed_sections = S.covered_limbs[actual_name] + if(S && matrixed_sections) + // if it has nothing initialize it to white + if(length(marking_list) == 2) + var/first = "#FFFFFF" + var/second = "#FFFFFF" + var/third = "#FFFFFF" + if(features["mcolor"]) + first = "#[features["mcolor"]]" + if(features["mcolor2"]) + second = "#[features["mcolor2"]]" + if(features["mcolor3"]) + third = "#[features["mcolor3"]]" + marking_list += list(list(first, second, third)) // just assume its 3 colours if it isnt it doesnt matter we just wont use the other values + // index magic + var/primary_index = 1 + var/secondary_index = 2 + var/tertiary_index = 3 + switch(matrixed_sections) + if(MATRIX_GREEN) + primary_index = 2 + if(MATRIX_BLUE) + primary_index = 3 + if(MATRIX_RED_BLUE) + secondary_index = 2 + if(MATRIX_GREEN_BLUE) + primary_index = 2 + secondary_index = 3 + + // we know it has one matrixed section at minimum + color_marking_dat += "[marking_list[3][primary_index]]" + // if it has a second section, add it + if(matrixed_sections == MATRIX_RED_BLUE || matrixed_sections == MATRIX_GREEN_BLUE || matrixed_sections == MATRIX_RED_GREEN || matrixed_sections == MATRIX_ALL) + number_colors = 2 + color_marking_dat += "[marking_list[3][secondary_index]]" + // if it has a third section, add it + if(matrixed_sections == MATRIX_ALL) + number_colors = 3 + color_marking_dat += "[marking_list[3][tertiary_index]]" + dat += " |
| [marking_index] | " + dat += "˅ | " + dat += "˄ | " + dat += "[marking_list[2]] | " + dat += "[color_marking_dat] | " + dat += "X | " + dat += "
| " + dat += " | " + dat += " | " + dat += " | " + dat += " | " + dat += " | " + dat += " |
"
+ dat += "Speech preferences" + dat += "Custom Speech Verb:" + dat += "[custom_speech_verb] " + dat += "Custom Tongue: " + dat += "[custom_tongue] " + dat += "Additional Language " + dat += "[additional_language] " + dat += " | "
+ dat += ""
+ dat += "Vocal Bark preferences" + var/datum/bark/B = GLOB.bark_list[bark_id] + dat += "Vocal Bark Sound:" + dat += "[B ? initial(B.name) : "INVALID"] " + dat += "Vocal Bark Speed: [bark_speed] " + dat += "Vocal Bark Pitch: [bark_pitch] " + dat += "Vocal Bark Variance: [bark_variance] " + dat += " Preview Bark " + dat += " | "
+ dat += "
| Name | " + dat += "Cost | " + dat += "Restrictions | " + dat += "Description |
| [name][extra_loadout_data] | " + dat += "[gear.cost] | " + if(islist(gear.restricted_roles)) + if(gear.restricted_roles.len) + if(gear.restricted_desc) + dat += "" + dat += gear.restricted_desc + dat += "" + else + dat += "" + dat += gear.restricted_roles.Join(";") + dat += "" + if(!istype(gear, /datum/gear/unlockable)) + // the below line essentially means "if the loadout item is picked by the user and has a custom description, give it the custom description, otherwise give it the default description" + dat += " | [loadout_item ? (loadout_item[LOADOUT_CUSTOM_DESCRIPTION] ? loadout_item[LOADOUT_CUSTOM_DESCRIPTION] : gear.description) : gear.description] | [loadout_item ? (loadout_item[LOADOUT_CUSTOM_DESCRIPTION] ? loadout_item[LOADOUT_CUSTOM_DESCRIPTION] : gear.description) : gear.description] Progress: [min(progress_made, unlockable.progress_required)]/[unlockable.progress_required] | " + dat += "
"
+ dat += "General Settings" + dat += "UI Style: [UI_style]" + dat += "Outline: [outline_enabled ? "Enabled" : "Disabled"] " + dat += "Outline Color: [outline_color ? "" : "Theme-based (null)"][outline_color] Change " + dat += "Screentip: [screentip_pref ? "Enabled" : "Disabled"] " + dat += "Screentip Color: [screentip_color] Change " + dat += "\ + Screentip context with images: [screentip_images ? "Allowed" : "Disallowed"] " + dat += "tgui Monitors: [(tgui_lock) ? "Primary" : "All"] " + dat += "tgui Style: [(tgui_fancy) ? "Fancy" : "No Frills"] " + dat += "Show Runechat Chat Bubbles: [chat_on_map ? "Enabled" : "Disabled"] " + dat += "Runechat message char limit: [max_chat_length] " + dat += "See Runechat for non-mobs: [see_chat_non_mob ? "Enabled" : "Disabled"] " + dat += " " + dat += "Action Buttons: [(buttons_locked) ? "Locked In Place" : "Unlocked"] " + dat += " " + dat += "PDA Color: [pda_color] Change " + dat += "PDA Style: [pda_style] " + dat += "PDA Reskin: [pda_skin] " + dat += " " + dat += "Ghost Ears: [(chat_toggles & CHAT_GHOSTEARS) ? "All Speech" : "Nearest Creatures"] " + dat += "Ghost Radio: [(chat_toggles & CHAT_GHOSTRADIO) ? "All Messages":"No Messages"] " + dat += "Ghost Sight: [(chat_toggles & CHAT_GHOSTSIGHT) ? "All Emotes" : "Nearest Creatures"] " + dat += "Ghost Whispers: [(chat_toggles & CHAT_GHOSTWHISPER) ? "All Speech" : "Nearest Creatures"] " + dat += "Ghost PDA: [(chat_toggles & CHAT_GHOSTPDA) ? "All Messages" : "Nearest Creatures"] " + + dat += " | "
+
+ dat += ""
+
+ dat += "Special Role Settings" + + if(jobban_isbanned(user, ROLE_SYNDICATE)) + dat += "You are banned from antagonist roles." + src.be_special = list() + + dat += "DISABLE ALL ANTAGONISM [(toggles & NO_ANTAG) ? "YES" : "NO"]" + + for (var/i in GLOB.special_roles) + if(jobban_isbanned(user, i)) + dat += "Be [capitalize(i)]: BANNED " + else + var/days_remaining = null + if(ispath(GLOB.special_roles[i]) && CONFIG_GET(flag/use_age_restriction_for_jobs)) //If it's a game mode antag, check if the player meets the minimum age + var/mode_path = GLOB.special_roles[i] + var/datum/game_mode/temp_mode = new mode_path + days_remaining = temp_mode.get_remaining_days(user.client) + + if(days_remaining) + dat += "Be [capitalize(i)]: \[IN [days_remaining] DAYS\] " + else + var/enabled_text = "" + if(i in be_special) + if(be_special[i] >= 1) + enabled_text = "Enabled" + else + enabled_text = "Low" + else + enabled_text = "Disabled" + dat += "Be [capitalize(i)]: [enabled_text] " + dat += "Midround Antagonist: [(toggles & MIDROUND_ANTAG) ? "Enabled" : "Disabled"] " + + dat += " |
"
+ dat += "OOC Settings" + dat += "Window Flashing: [(windowflashing) ? "Enabled":"Disabled"]" + dat += " " + dat += "Play Admin MIDIs: [(toggles & SOUND_MIDI) ? "Enabled":"Disabled"] " + dat += "Play Lobby Music: [(toggles & SOUND_LOBBY) ? "Enabled":"Disabled"] " + dat += "See Pull Requests: [(chat_toggles & CHAT_PULLR) ? "Enabled":"Disabled"] " + dat += " " + if(user.client) + if(unlock_content) + dat += "BYOND Membership Publicity: [(toggles & MEMBER_PUBLIC) ? "Public" : "Hidden"] " + if(unlock_content || check_rights_for(user.client, R_ADMIN)) + dat += "OOC Color: [ooccolor ? ooccolor : GLOB.normal_ooc_colour] Change " + dat += "Antag OOC Color: [aooccolor ? aooccolor : GLOB.normal_aooc_colour] Change " + + if(user.client.holder) + dat += " Admin Settings" + dat += "Adminhelp Sounds: [(toggles & SOUND_ADMINHELP)?"Enabled":"Disabled"]" + dat += "Announce Login: [(toggles & ANNOUNCE_LOGIN)?"Enabled":"Disabled"] " + dat += " " + dat += "Combo HUD Lighting: [(toggles & COMBOHUD_LIGHTING)?"Full-bright":"No Change"] " + + //deadmin + dat += " Deadmin While Playing" + if(CONFIG_GET(flag/auto_deadmin_players)) + dat += "Always Deadmin: FORCED" + else + dat += "Always Deadmin: [(deadmin & DEADMIN_ALWAYS)?"Enabled":"Disabled"] " + if(!(deadmin & DEADMIN_ALWAYS)) + dat += " " + if(!CONFIG_GET(flag/auto_deadmin_antagonists)) + dat += "As Antag: [(deadmin & DEADMIN_ANTAGONIST)?"Deadmin":"Keep Admin"] " + else + dat += "As Antag: FORCED " + + if(!CONFIG_GET(flag/auto_deadmin_heads)) + dat += "As Command: [(deadmin & DEADMIN_POSITION_HEAD)?"Deadmin":"Keep Admin"] " + else + dat += "As Command: FORCED " + + if(!CONFIG_GET(flag/auto_deadmin_security)) + dat += "As Security: [(deadmin & DEADMIN_POSITION_SECURITY)?"Deadmin":"Keep Admin"] " + else + dat += "As Security: FORCED " + + if(!CONFIG_GET(flag/auto_deadmin_silicons)) + dat += "As Silicon: [(deadmin & DEADMIN_POSITION_SILICON)?"Deadmin":"Keep Admin"] " + else + dat += "As Silicon: FORCED " + + dat += " | "
+
+ dat += ""
+
+ dat += "Citadel Preferences" //Because fuck me if preferences can't be fucking modularized and expected to update in a reasonable timeframe. + dat += "Widescreen: [widescreenpref ? "Enabled ([CONFIG_GET(string/default_view)])" : "Disabled (15x15)"]" + dat += "Long strip menu: [long_strip_menu ? "Enabled" : "Disabled"] " + dat += "Auto stand: [autostand ? "Enabled" : "Disabled"] " + dat += "Auto OOC: [auto_ooc ? "Enabled" : "Disabled"] " + dat += "Force Slot Storage HUD: [no_tetris_storage ? "Enabled" : "Disabled"] " + dat += "Screen Shake: [(screenshake==100) ? "Full" : ((screenshake==0) ? "None" : "[screenshake]")] " + if (user && user.client && !user.client.prefs.screenshake==0) + dat += "Damage Screen Shake: [(damagescreenshake==1) ? "On" : ((damagescreenshake==0) ? "Off" : "Only when down")] " + dat += "Recoil Screen Push: [(recoil_screenshake==100) ? "Full" : ((recoil_screenshake==0) ? "None" : "[screenshake]")] " + var/p_chaos + if (!preferred_chaos) + p_chaos = "No preference" + else + p_chaos = preferred_chaos + dat += "Preferred Chaos Amount: [p_chaos] " + dat += " " + + if(unlock_content) + dat += "Ghost Form: [ghost_form] " + dat += "Ghost Orbit: [ghost_orbit] " + var/button_name = "If you see this something went wrong." + switch(ghost_accs) + if(GHOST_ACCS_FULL) + button_name = GHOST_ACCS_FULL_NAME + if(GHOST_ACCS_DIR) + button_name = GHOST_ACCS_DIR_NAME + if(GHOST_ACCS_NONE) + button_name = GHOST_ACCS_NONE_NAME + + dat += "Ghost Accessories: [button_name] " + switch(ghost_others) + if(GHOST_OTHERS_THEIR_SETTING) + button_name = GHOST_OTHERS_THEIR_SETTING_NAME + if(GHOST_OTHERS_DEFAULT_SPRITE) + button_name = GHOST_OTHERS_DEFAULT_SPRITE_NAME + if(GHOST_OTHERS_SIMPLE) + button_name = GHOST_OTHERS_SIMPLE_NAME + + dat += "Ghosts of Others: [button_name] " + dat += " " + + dat += "FPS: [clientfps] " + + dat += "Income Updates: [(chat_toggles & CHAT_BANKCARD) ? "Allowed" : "Muted"] " + dat += " " + + dat += "Parallax (Fancy Space): " + switch (parallax) + if (PARALLAX_LOW) + dat += "Low" + if (PARALLAX_MED) + dat += "Medium" + if (PARALLAX_INSANE) + dat += "Insane" + if (PARALLAX_DISABLE) + dat += "Disabled" + else + dat += "High" + dat += " " + dat += "Ambient Occlusion: [ambientocclusion ? "Enabled" : "Disabled"] " + dat += "Fit Viewport: [auto_fit_viewport ? "Auto" : "Manual"] " + dat += "HUD Button Flashes: [hud_toggle_flash ? "Enabled" : "Disabled"] " + dat += "HUD Button Flash Color: [hud_toggle_color] Change " + + + if (CONFIG_GET(flag/maprotation) && CONFIG_GET(flag/tgstyle_maprotation)) + var/p_map = preferred_map + if (!p_map) + p_map = "Default" + if (config.defaultmap) + p_map += " ([config.defaultmap.map_name])" + else + if (p_map in config.maplist) + var/datum/map_config/VM = config.maplist[p_map] + if (!VM) + p_map += " (No longer exists)" + else + p_map = VM.map_name + else + p_map += " (No longer exists)" + if(CONFIG_GET(flag/allow_map_voting)) + dat += "Preferred Map: [p_map] " + + dat += " |