diff --git a/code/__DEFINES/~skyrat_defines/mobs.dm b/code/__DEFINES/~skyrat_defines/mobs.dm index d02f0d7108e..71f8c21e894 100644 --- a/code/__DEFINES/~skyrat_defines/mobs.dm +++ b/code/__DEFINES/~skyrat_defines/mobs.dm @@ -9,6 +9,7 @@ #define UNDERWEAR_HIDE_SOCKS (1<<0) #define UNDERWEAR_HIDE_SHIRT (1<<1) #define UNDERWEAR_HIDE_UNDIES (1<<2) +#define UNDERWEAR_HIDE_BRA (1<<3) //Appends to the bottom of Defib fails - DNR TRAIT #define DEFIB_FAIL_DNR (1<<11) diff --git a/code/__HELPERS/dynamic_human_icon_gen.dm b/code/__HELPERS/dynamic_human_icon_gen.dm index 9f9dd9f1aa1..31957a27600 100644 --- a/code/__HELPERS/dynamic_human_icon_gen.dm +++ b/code/__HELPERS/dynamic_human_icon_gen.dm @@ -14,6 +14,7 @@ GLOBAL_LIST_EMPTY(dynamic_human_appearances) dummy.underwear = "Nude" dummy.undershirt = "Nude" dummy.socks = "Nude" + dummy.bra = "Nude" // SKYRAT EDIT ADDITION - Underwear and bra split if(outfit_path) var/datum/outfit/outfit = new outfit_path() if(r_hand != NO_REPLACE) //we can still override to be null, no replace means just use outfit's diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 659c2c0144e..994aa6cfa81 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -34,6 +34,9 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_antennae, GLOB.moth_antennae_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_markings, GLOB.moth_markings_list) */ //SKYRAT EDIT REMOVAL END + //bras + init_sprite_accessory_subtypes(/datum/sprite_accessory/bra, GLOB.bra_list, GLOB.bra_m, GLOB.bra_f) // SKYRAT EDIT ADDITION + init_sprite_accessory_subtypes(/datum/sprite_accessory/wings/moth, GLOB.moth_wings_list) // SKYRAT EDIT ADDITION - Customization init_sprite_accessory_subtypes(/datum/sprite_accessory/pod_hair, GLOB.pod_hair_list, add_blank = TRUE) // SKYRAT EDIT - Customization - ORIGINAL: init_sprite_accessory_subtypes(/datum/sprite_accessory/pod_hair, GLOB.pod_hair_list) diff --git a/code/datums/martial/plasma_fist.dm b/code/datums/martial/plasma_fist.dm index ed8ac5fe812..1bc353cc698 100644 --- a/code/datums/martial/plasma_fist.dm +++ b/code/datums/martial/plasma_fist.dm @@ -98,6 +98,7 @@ human_attacker.underwear = "Nude" human_attacker.undershirt = "Nude" human_attacker.socks = "Nude" + human_attacker.bra = "Nude" // SKYRAT EDIT ADDITION - Underwear and bra split human_attacker.update_body() var/turf/boomspot = get_turf(user) diff --git a/code/datums/outfit.dm b/code/datums/outfit.dm index 8dc2c99f632..784e7a1b06f 100644 --- a/code/datums/outfit.dm +++ b/code/datums/outfit.dm @@ -220,6 +220,12 @@ if(socks) user.socks = initial(socks.name) + + // SKYRAT EDIT ADDITION START - Underwear and bra split + if(bra) + user.bra = initial(bra.name) + // SKYRAT EDIT END + if(accessory) var/obj/item/clothing/under/U = user.w_uniform if(U) diff --git a/code/datums/sprite_accessories.dm b/code/datums/sprite_accessories.dm index 22e2473f2e4..16ce537b840 100644 --- a/code/datums/sprite_accessories.dm +++ b/code/datums/sprite_accessories.dm @@ -1162,6 +1162,8 @@ use_static = TRUE + +/* SKYRAT EDIT REMOVAL START - Underwear and bra split //FEMALE UNDERWEAR /datum/sprite_accessory/underwear/female_bikini name = "Bikini" @@ -1263,6 +1265,7 @@ icon_state = "female_kinky" gender = FEMALE use_static = TRUE +*/ // SKYRAT EDIT END //////////////////////////// // Undershirt Definitions // @@ -1458,7 +1461,7 @@ name = "Short-sleeved Shirt (White)" icon_state = "whiteshortsleeve" gender = NEUTER - +/* SKYRAT EDIT REMOVAL START - Underwear and bra split /datum/sprite_accessory/undershirt/sports_bra name = "Sports Bra" icon_state = "sports_bra" @@ -1468,7 +1471,7 @@ name = "Sports Bra (Alt)" icon_state = "sports_bra_alt" gender = NEUTER - +*/ // SKYRAT EDIT END /datum/sprite_accessory/undershirt/blueshirtsport name = "Sports Shirt (Blue)" icon_state = "blueshirtsport" diff --git a/code/game/objects/structures/dresser.dm b/code/game/objects/structures/dresser.dm index 6644b088f08..a6de88c5f8a 100644 --- a/code/game/objects/structures/dresser.dm +++ b/code/game/objects/structures/dresser.dm @@ -36,7 +36,7 @@ to_chat(dressing_human, span_warning("You are not capable of wearing underwear.")) return - var/choice = tgui_input_list(user, "Underwear, Undershirt, or Socks?", "Changing", list("Underwear", "Underwear Color", "Undershirt", "Socks", "Undershirt Color", "Socks Color")) //SKYRAT EDIT ADDITION - Colorable Undershirt/Socks + var/choice = tgui_input_list(user, "Underwear, Bra, Undershirt, or Socks?", "Changing", list("Underwear", "Underwear Color", "Bra", "Bra Color", "Undershirt", "Undershirt Color", "Socks", "Socks Color")) //SKYRAT EDIT ADDITION - Colorable Undershirt/Socks/Bra if(isnull(choice)) return @@ -59,7 +59,7 @@ var/new_socks = tgui_input_list(user, "Select your socks", "Changing", GLOB.socks_list) if(new_socks) dressing_human.socks = new_socks - //SKYRAT EDIT ADDITION BEGIN - Colorable Undershirt/Socks + //SKYRAT EDIT ADDITION BEGIN - Colorable Undershirt/Socks/Bras if("Undershirt Color") var/new_undershirt_color = input(dressing_human, "Choose your undershirt color", "Undershirt Color", dressing_human.undershirt_color) as color|null if(new_undershirt_color) @@ -68,7 +68,18 @@ var/new_socks_color = input(dressing_human, "Choose your socks color", "Socks Color", dressing_human.socks_color) as color|null if(new_socks_color) dressing_human.socks_color = sanitize_hexcolor(new_socks_color) - //SKYRAT EDIT ADDITION END - Colorable Undershirt/Socks + + if("Bra") + var/new_bra = tgui_input_list(user, "Select your Bra", "Changing", GLOB.bra_list) + if(new_bra) + dressing_human.bra = new_bra + + if("Bra Color") + var/new_bra_color = input(dressing_human, "Choose your Bra color", "Bra Color", dressing_human.bra_color) as color|null + if(new_bra_color) + dressing_human.bra_color = sanitize_hexcolor(new_bra_color) + + //SKYRAT EDIT ADDITION END - Colorable Undershirt/Socks/Bras add_fingerprint(dressing_human) dressing_human.update_body() diff --git a/code/game/objects/structures/mannequin.dm b/code/game/objects/structures/mannequin.dm index ad9588d5aa8..618b935e690 100644 --- a/code/game/objects/structures/mannequin.dm +++ b/code/game/objects/structures/mannequin.dm @@ -109,6 +109,12 @@ var/datum/sprite_accessory/socks/socks = GLOB.socks_list[socks_name] if(socks) . += mutable_appearance(socks.icon, socks.icon_state, -BODY_LAYER) + //SKYRAT EDIT ADDITION BEGIN - Underwear and Bra split + var/datum/sprite_accessory/bra/bra = GLOB.bra_list[bra_name] + if(bra) + . += mutable_appearance(bra.icon, bra.icon_state, -BODY_LAYER) + //SKYRAT EDIT END + for(var/slot_flag in worn_items) var/obj/item/worn_item = worn_items[slot_flag] if(!worn_item) @@ -162,7 +168,7 @@ . = ..() if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) return - var/choice = tgui_input_list(user, "Underwear, Undershirt, or Socks?", "Changing", list("Underwear","Undershirt","Socks")) + var/choice = tgui_input_list(user, "Underwear, Bra, Undershirt, or Socks?", "Changing", list("Underwear", "Bra", "Undershirt","Socks")) //SKYRAT EDIT ADDITION - Underwear and Bra split if(!Adjacent(user)) return switch(choice) @@ -178,6 +184,12 @@ var/new_socks = tgui_input_list(user, "Select the mannequin's socks", "Changing", GLOB.socks_list) if(new_socks) socks_name = new_socks + //SKYRAT EDIT ADDITION BEGIN - Underwear and Bra split + if("Bra") + var/new_bra = tgui_input_list(user, "Select the mannequin's bra", "Changing", GLOB.bra_list) + if(new_bra) + bra_name = new_bra + //SKYRAT EDIT END update_appearance() /obj/structure/mannequin/wood diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm index be687499194..a42eebcff7f 100644 --- a/code/modules/antagonists/changeling/changeling.dm +++ b/code/modules/antagonists/changeling/changeling.dm @@ -548,9 +548,12 @@ new_profile.socks = target.socks // SKYRAT EDIT START + new_profile.bra = target.bra + new_profile.underwear_color = target.underwear_color new_profile.undershirt_color = target.undershirt_color new_profile.socks_color = target.socks_color + new_profile.bra_color = target.bra_color new_profile.eye_color_left = target.eye_color_left new_profile.eye_color_right = target.eye_color_right new_profile.emissive_eyes = target.emissive_eyes @@ -790,9 +793,12 @@ user.socks = chosen_profile.socks // SKYRAT EDIT START + user.bra = chosen_profile.bra + user.underwear_color = chosen_profile.underwear_color user.undershirt_color = chosen_profile.undershirt_color user.socks_color = chosen_profile.socks_color + user.bra_color = chosen_profile.bra_color user.emissive_eyes = chosen_profile.emissive_eyes user.dna.mutant_bodyparts = chosen_dna.mutant_bodyparts.Copy() user.dna.body_markings = chosen_dna.body_markings.Copy() @@ -974,27 +980,6 @@ /// ID HUD icon associated with the profile var/id_icon - /// SKYRAT EDIT START - var/underwear_color - var/undershirt_color - var/socks_color - var/eye_color_left - var/eye_color_right - var/emissive_eyes - var/list/grad_style = list("None", "None") - var/list/grad_color = list(null, null) - - var/physique - var/list/worn_icon_digi_list = list() - var/list/worn_icon_monkey_list = list() - var/list/worn_icon_teshari_list = list() - var/list/worn_icon_vox_list = list() - var/list/supports_variations_flags_list = list() - var/scream_type - var/laugh_type - var/age - var/list/quirks = list() - /// SKYRAT EDIT END /// The TTS voice of the profile source var/voice @@ -1037,6 +1022,8 @@ new_profile.underwear_color = underwear_color new_profile.undershirt_color = undershirt_color new_profile.socks_color = socks_color + new_profile.bra = bra + new_profile.bra_color = bra_color new_profile.eye_color_left = eye_color_left new_profile.eye_color_right = eye_color_right new_profile.emissive_eyes = emissive_eyes diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm index 6e9f61cdb8c..17718190ba5 100644 --- a/code/modules/mob/living/carbon/human/_species.dm +++ b/code/modules/mob/living/carbon/human/_species.dm @@ -845,6 +845,7 @@ GLOBAL_LIST_EMPTY(features_by_species) human_mob.undershirt = random_undershirt(human_mob.gender) human_mob.underwear = random_underwear(human_mob.gender) human_mob.socks = random_socks(human_mob.gender) + human_mob.bra = random_bra(human_mob.gender) //SKYRAT EDIT ADDITION - Underwear and Bra split ///Proc that will randomise the underwear (i.e. top, pants and socks) of a species' associated mob /datum/species/proc/randomize_active_underwear(mob/living/carbon/human/human_mob) diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 818ca1cf860..62fc77bc6ce 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -247,7 +247,6 @@ destination.socks = socks destination.jumpsuit_style = jumpsuit_style - /// Fully randomizes everything according to the given flags. /mob/living/carbon/human/proc/randomize_human_appearance(randomize_flags = ALL) var/datum/preferences/preferences = new(new /datum/client_interface) diff --git a/code/modules/mob_spawn/mob_spawn.dm b/code/modules/mob_spawn/mob_spawn.dm index a254c5511aa..a853d48c0ec 100644 --- a/code/modules/mob_spawn/mob_spawn.dm +++ b/code/modules/mob_spawn/mob_spawn.dm @@ -58,6 +58,7 @@ spawned_human.underwear = "Nude" spawned_human.undershirt = "Nude" spawned_human.socks = "Nude" + spawned_human.bra = "Nude" //SKYRAT EDIT ADDITION if(hairstyle) spawned_human.hairstyle = hairstyle else diff --git a/modular_skyrat/master_files/code/game/objects/structures/mannequin.dm b/modular_skyrat/master_files/code/game/objects/structures/mannequin.dm new file mode 100644 index 00000000000..9604fb7ac5f --- /dev/null +++ b/modular_skyrat/master_files/code/game/objects/structures/mannequin.dm @@ -0,0 +1,3 @@ +/obj/structure/mannequin + /// String for the bra we use. + var/bra_name diff --git a/modular_skyrat/master_files/code/modules/antagonists/changeling/changeling.dm b/modular_skyrat/master_files/code/modules/antagonists/changeling/changeling.dm index 5c7b4c4bbd1..92f0b0786dc 100644 --- a/modular_skyrat/master_files/code/modules/antagonists/changeling/changeling.dm +++ b/modular_skyrat/master_files/code/modules/antagonists/changeling/changeling.dm @@ -1,2 +1,46 @@ /datum/antagonist/changeling/forge_objectives() return + + +/datum/changeling_profile + /// The bra worn by the profile source - Skyrats addition + var/bra + /// The color of the underwear used by the profile source - Skyrats addition + var/underwear_color + /// The color of the undershirt used by the profile source - Skyrats addition + var/undershirt_color + /// The color of the socks used by the profile source - Skyrats addition + var/socks_color + /// The color of the bra used by the profile source - Skyrats addition + var/bra_color + /// The profile source's left eye color - Skyrats addition + var/eye_color_left + /// The profile source's right eye color - Skyrats addition + var/eye_color_right + /// Does the profile source's eyes glow - Skyrats addition + var/emissive_eyes + /// The profile sorce's gradient styles - Skyrats addition + var/list/grad_style = list("None", "None") + /// The colors for the profile source's gradients - Skyrats addition + var/list/grad_color = list(null, null) + + /// The physique used by the profile source - Skyrats addition + var/physique + /// Profile source digi leg icons - Skyrats addition + var/list/worn_icon_digi_list = list() + /// profile source monkey icons - Skyrats addition + var/list/worn_icon_monkey_list = list() + /// Profile source vox icons - Skyrats addition + var/list/worn_icon_teshari_list = list() + /// The bra worn by the profile source - Skyrats addition + var/list/worn_icon_vox_list = list() + /// Support variation flags used by the profile source - Skyrats addition + var/list/supports_variations_flags_list = list() + /// The profile source scream type - Skyrats addition + var/scream_type + /// The profile source laugh type - Skyrats addition + var/laugh_type + /// The profile source's age - Skyrats addition + var/age + /// The quirks used by the profile source - Skyrats addition + var/list/quirks = list() diff --git a/modular_skyrat/master_files/code/modules/client/preferences/clothing.dm b/modular_skyrat/master_files/code/modules/client/preferences/clothing.dm index 8041e751783..f542e867fc6 100644 --- a/modular_skyrat/master_files/code/modules/client/preferences/clothing.dm +++ b/modular_skyrat/master_files/code/modules/client/preferences/clothing.dm @@ -35,3 +35,50 @@ var/species_type = preferences.read_preference(/datum/preference/choiced/species) var/datum/species/species = new species_type return !(TRAIT_NO_UNDERWEAR in species.inherent_traits) + +/datum/preference/choiced/bra + savefile_key = "bra" + savefile_identifier = PREFERENCE_CHARACTER + main_feature_name = "Bra" + category = PREFERENCE_CATEGORY_CLOTHING + should_generate_icons = TRUE + +/datum/preference/choiced/bra/init_possible_values() + return assoc_to_keys_features(GLOB.bra_list) + +/datum/preference/choiced/bra/icon_for(value) + var/static/icon/body + if (isnull(body)) + body = icon('icons/mob/human/bodyparts_greyscale.dmi', "human_r_arm") + body.Blend(icon('icons/mob/human/bodyparts_greyscale.dmi', "human_l_arm"), ICON_OVERLAY) + body.Blend(icon('icons/mob/human/bodyparts_greyscale.dmi', "human_r_hand"), ICON_OVERLAY) + body.Blend(icon('icons/mob/human/bodyparts_greyscale.dmi', "human_l_hand"), ICON_OVERLAY) + body.Blend(icon('icons/mob/human/bodyparts_greyscale.dmi', "human_chest_m"), ICON_OVERLAY) + + var/icon/icon_with_bra = icon(body) + + if (value != "Nude") + var/datum/sprite_accessory/accessory = GLOB.bra_list[value] + icon_with_bra.Blend(icon(accessory.icon, accessory.icon_state), ICON_OVERLAY) + + icon_with_bra.Crop(10, 11, 22, 23) // SKYRAT EDIT CHANGE : ORIGINAL - icon_with_undershirt.Crop(9, 9, 23, 23) + icon_with_bra.Scale(32, 32) + return icon_with_bra + +/datum/preference/choiced/bra/apply_to_human(mob/living/carbon/human/target, value) + target.bra = value + +/datum/preference/choiced/bra/compile_constant_data() + var/list/data = ..() + + data[SUPPLEMENTAL_FEATURE_KEY] = "bra_color" + + return data + +/datum/preference/choiced/bra/is_accessible(datum/preferences/preferences) + if (!..(preferences)) + return FALSE + + var/species_type = preferences.read_preference(/datum/preference/choiced/species) + var/datum/species/species = new species_type + return !(TRAIT_NO_UNDERWEAR in species.inherent_traits) diff --git a/modular_skyrat/master_files/code/modules/client/preferences/underwear_color.dm b/modular_skyrat/master_files/code/modules/client/preferences/underwear_color.dm index a1819c64b3f..f7e5a86d5ea 100644 --- a/modular_skyrat/master_files/code/modules/client/preferences/underwear_color.dm +++ b/modular_skyrat/master_files/code/modules/client/preferences/underwear_color.dm @@ -49,3 +49,20 @@ var/datum/species/species = new species_type return !(TRAIT_NO_UNDERWEAR in species.inherent_traits) // SKYRAT EDIT ADDITION END - Colorable Undershirt/Socks + + +/datum/preference/color/bra_color + savefile_key = "bra_color" + savefile_identifier = PREFERENCE_CHARACTER + category = PREFERENCE_CATEGORY_SUPPLEMENTAL_FEATURES + +/datum/preference/color/bra_color/apply_to_human(mob/living/carbon/human/target, value) + target.bra_color = value + +/datum/preference/color/bra_color/is_accessible(datum/preferences/preferences) + if (!..(preferences)) + return FALSE + + var/species_type = preferences.read_preference(/datum/preference/choiced/species) + var/datum/species/species = new species_type + return !(TRAIT_NO_UNDERWEAR in species.inherent_traits) diff --git a/modular_skyrat/master_files/code/modules/client/preferences_savefile.dm b/modular_skyrat/master_files/code/modules/client/preferences_savefile.dm index 641a5c3537a..f7ffc6fddd6 100644 --- a/modular_skyrat/master_files/code/modules/client/preferences_savefile.dm +++ b/modular_skyrat/master_files/code/modules/client/preferences_savefile.dm @@ -3,10 +3,18 @@ * You can't really use the non-modular version, least you eventually want asinine merge * conflicts and/or potentially disastrous issues to arise, so here's your own. */ -#define MODULAR_SAVEFILE_VERSION_MAX 3 +#define MODULAR_SAVEFILE_VERSION_MAX 4 #define MODULAR_SAVEFILE_UP_TO_DATE -1 +#define VERSION_GENITAL_TOGGLES 1 +#define VERSION_BREAST_SIZE_CHANGE 2 +#define VERSION_SYNTH_REFACTOR 3 +#define VERSION_UNDERSHIRT_BRA_SPLIT 4 + +#define INDEX_UNDERWEAR 1 +#define INDEX_BRA 2 + /** * Checks if the modular side of the savefile is up to date. * If the return value is higher than 0, update_character_skyrat() will be called later. @@ -16,8 +24,10 @@ if(savefile_version < MODULAR_SAVEFILE_VERSION_MAX) return savefile_version + return MODULAR_SAVEFILE_UP_TO_DATE + /// Loads the modular customizations of a character from the savefile /datum/preferences/proc/load_character_skyrat(list/save_data) if(!save_data) @@ -89,9 +99,10 @@ if(needs_update >= 0) update_character_skyrat(needs_update, save_data) // needs_update == savefile_version if we need an update (positive integer) + /// Brings a savefile up to date with modular preferences. Called if savefile_needs_update_skyrat() returned a value higher than 0 /datum/preferences/proc/update_character_skyrat(current_version, list/save_data) - if(current_version < 1) + if(current_version < VERSION_GENITAL_TOGGLES) // removed genital toggles, with the new choiced prefs paths as assoc var/static/list/old_toggles if(!old_toggles) @@ -114,14 +125,14 @@ for(var/pref_type in subtypesof(/datum/preference/toggle/genital_skin_tone)) write_preference(GLOB.preference_entries[pref_type], TRUE) - if(current_version < 2) + if(current_version < VERSION_BREAST_SIZE_CHANGE) var/list/old_breast_prefs old_breast_prefs = save_data["breasts_size"] if(isnum(old_breast_prefs)) // Can't be too careful // You weren't meant to be able to pick sizes over this anyways. write_preference(GLOB.preference_entries[/datum/preference/choiced/breasts_size], GLOB.breast_size_translation["[min(old_breast_prefs, 10)]"]) - if(current_version < 3) + if(current_version < VERSION_SYNTH_REFACTOR) var/old_species = save_data["species"] if(istext(old_species) && (old_species in list("synthhuman", "synthliz", "synthmammal", "ipc"))) @@ -156,11 +167,99 @@ write_preference(GLOB.preference_entries[/datum/preference/color/mutant/synth_chassis], new_color) write_preference(GLOB.preference_entries[/datum/preference/color/mutant/synth_head], new_color) + if(current_version < VERSION_UNDERSHIRT_BRA_SPLIT) + var/static/list/underwear_to_underwear_bra = list( + "Panties" = list("Panties - Basic", null), // Just a rename + "Bikini" = list("Panties - Slim", "Bra"), + "Lace Bikini" = list("Panties - Thin", "Bra - Thin"), + "Bralette w/ Boyshorts" = list("Boyshorts (Alt)", "Bra, Sports"), + "Sports Bra w/ Boyshorts" = list("Boyshorts", "Bra, Sports - Alt"), + "Strapless Bikini" = list("Panties - Slim", "Strapless Swimsuit Top (Alt)"), + "Babydoll" = list("Thong - Alt", null), // Got moved to an undershirt, actual underwear part is now a thong. + "Two-Piece Swimsuit" = list("Panties - Swimsuit", "Swimsuit Top"), + "Strapless Two-Piece Swimsuit" = list("Panties - Swimsuit", "Strapless Swimsuit Top"), + "Halter Swimsuit" = list("Panties - Basic", "Bra - Halterneck - (Alt)"), + "Neko Bikini (White)" = list("Panties - Neko", "Bra - Neko"), + "Neko Bikini (Black)" = list("Panties - Neko", "Bra - Neko"), + "UK Biniki" = list("Panties - UK", "Bra - UK"), + ) + + var/current_underwear = save_data["underwear"] + var/migrated_underwear_bra = underwear_to_underwear_bra[current_underwear] + + if(migrated_underwear_bra) + var/migrated_color = save_data["underwear_color"] + var/migrated_underwear = migrated_underwear_bra[INDEX_UNDERWEAR] + var/migrated_bra = migrated_underwear_bra[INDEX_BRA] + + if(migrated_underwear) + write_preference(GLOB.preference_entries[/datum/preference/choiced/underwear], migrated_underwear) + + if(migrated_bra) + write_preference(GLOB.preference_entries[/datum/preference/choiced/bra], migrated_bra) + write_preference(GLOB.preference_entries[/datum/preference/color/bra_color], migrated_color) + + var/current_undershirt = save_data["undershirt"] + + // This one has a different treatment because it's an underwear that has been moved mainly to an undershirt, + // ending up as a thong for the underwear part itself. We only want to override the undershirt if there's none, + // though. + if(current_underwear == "Babydoll" && current_undershirt == "Nude") + var/migrated_color = save_data["underwear_color"] + + write_preference(GLOB.preference_entries[/datum/preference/choiced/undershirt], "Babydoll") + write_preference(GLOB.preference_entries[/datum/preference/color/undershirt_color], migrated_color) + + var/static/list/undershirt_to_bra = list( + "Bra, Sports" = "Bra, Sports", + "Sports Bra (Alt)" = "Sports Bra (Alt)", + "LIZARED Top" = "LIZARED Top", + "Bra" = "Bra", + "Bra - Alt" = "Bra - Alt", + "Bra - Thin" = "Bra - Thin", + "Bra - Kinky Black" = "Bra - Kinky Black", + "Bra - Freedom" = "Bra - Freedom", + "Bra - Commie" = "Bra - Commie", + "Bra - Bee-kini" = "Bra - Bee-kini", + "Bra - UK" = "Bra - UK", + "Bra - Neko" = "Bra - Neko", + "Bra - Halterneck" = "Bra - Halterneck", + "Bra - Sports - Alt" = "Bra - Sports - Alt", + "Bra - Strapless" = "Bra - Strapless", + "Bra - Latex" = "Bra - Latex", + "Bra - Striped" = "Bra - Striped", + "Bra - Sarashi" = "Bra - Sarashi", + "Fishnet - Sleeved" = "Fishnet - Sleeved", + "Fishnet - Sleeved (Greyscaled)" = "Fishnet - Sleeved (Greyscaled)", + "Fishnet - Sleeveless" = "Fishnet - Sleeveless", + "Fishnet - Sleeveless (Greyscaled)" = "Fishnet - Sleeveless (Greyscaled)", + "Swimsuit Top" = "Bra - Halterneck - (Alt)", + "Chastity Bra" = "Chastity Bra", + "Pasties" = "Pasties", + "Pasties - Alt" = "Pasties - Alt", + "Shibari" = "Shibari", + "Shibari Sleeves" = "Shibari Sleeves", + "Binder" = "Binder", + "Binder - Strapless" = "Binder - Strapless", + "Safekini" = "Safekini", + ) + + var/migrated_bra_from_undershirt = undershirt_to_bra[current_undershirt] + + if(migrated_bra_from_undershirt) + var/migrated_color = save_data["undershirt_color"] + + write_preference(GLOB.preference_entries[/datum/preference/choiced/bra], migrated_bra_from_undershirt) + write_preference(GLOB.preference_entries[/datum/preference/color/bra_color], migrated_color) + write_preference(GLOB.preference_entries[/datum/preference/choiced/undershirt], "Nude") + + /datum/preferences/proc/check_migration() if(!tgui_prefs_migration) to_chat(parent, examine_block(span_redtext("CRITICAL FAILURE IN PREFERENCE MIGRATION, REPORT THIS IMMEDIATELY."))) message_admins("PREFERENCE MIGRATION: [ADMIN_LOOKUPFLW(parent)] has failed the process for migrating PREFERENCES. Check runtimes.") + /// Saves the modular customizations of a character on the savefile /datum/preferences/proc/save_character_skyrat(list/save_data) save_data["loadout_list"] = loadout_list @@ -176,6 +275,7 @@ save_data["headshot"] = headshot save_data["modular_version"] = MODULAR_SAVEFILE_VERSION_MAX + /datum/preferences/proc/update_mutant_bodyparts(datum/preference/preference) if (!preference.relevant_mutant_bodypart) return @@ -202,6 +302,7 @@ if (part in mutant_bodyparts) mutant_bodyparts[part][MUTANT_INDEX_COLOR_LIST] = value + /datum/preferences/proc/update_markings(list/markings) if (islist(markings)) for (var/marking in markings) @@ -210,5 +311,11 @@ markings[marking][title] = list(sanitize_hexcolor(markings[marking][title]), FALSE) return markings + #undef MODULAR_SAVEFILE_VERSION_MAX #undef MODULAR_SAVEFILE_UP_TO_DATE + +#undef VERSION_GENITAL_TOGGLES +#undef VERSION_BREAST_SIZE_CHANGE +#undef VERSION_SYNTH_REFACTOR +#undef VERSION_UNDERSHIRT_BRA_SPLIT diff --git a/modular_skyrat/master_files/code/modules/mob/dead/new_player/preferences_setup.dm b/modular_skyrat/master_files/code/modules/mob/dead/new_player/preferences_setup.dm index 180f6081277..c2b04c99382 100644 --- a/modular_skyrat/master_files/code/modules/mob/dead/new_player/preferences_setup.dm +++ b/modular_skyrat/master_files/code/modules/mob/dead/new_player/preferences_setup.dm @@ -23,14 +23,14 @@ if(PREVIEW_PREF_UNDERWEAR) mannequin.underwear_visibility = NONE if(PREVIEW_PREF_NAKED) - mannequin.underwear_visibility = UNDERWEAR_HIDE_UNDIES | UNDERWEAR_HIDE_SHIRT | UNDERWEAR_HIDE_SOCKS + mannequin.underwear_visibility = UNDERWEAR_HIDE_UNDIES | UNDERWEAR_HIDE_SHIRT | UNDERWEAR_HIDE_SOCKS | UNDERWEAR_HIDE_BRA for(var/organ_key in list(ORGAN_SLOT_VAGINA, ORGAN_SLOT_PENIS, ORGAN_SLOT_BREASTS, ORGAN_SLOT_ANUS)) var/obj/item/organ/external/genital/gent = mannequin.get_organ_slot(organ_key) if(gent) gent.aroused = AROUSAL_NONE gent.update_sprite_suffix() if(PREVIEW_PREF_NAKED_AROUSED) - mannequin.underwear_visibility = UNDERWEAR_HIDE_UNDIES | UNDERWEAR_HIDE_SHIRT | UNDERWEAR_HIDE_SOCKS + mannequin.underwear_visibility = UNDERWEAR_HIDE_UNDIES | UNDERWEAR_HIDE_SHIRT | UNDERWEAR_HIDE_SOCKS | UNDERWEAR_HIDE_BRA for(var/organ_key in list(ORGAN_SLOT_VAGINA, ORGAN_SLOT_PENIS, ORGAN_SLOT_BREASTS, ORGAN_SLOT_ANUS)) var/obj/item/organ/external/genital/gent = mannequin.get_organ_slot(organ_key) if(gent) diff --git a/modular_skyrat/master_files/code/modules/mob/living/carbon/human_helpers.dm b/modular_skyrat/master_files/code/modules/mob/living/carbon/human_helpers.dm index b13a1ec0e3e..d7b16d45d49 100644 --- a/modular_skyrat/master_files/code/modules/mob/living/carbon/human_helpers.dm +++ b/modular_skyrat/master_files/code/modules/mob/living/carbon/human_helpers.dm @@ -8,3 +8,10 @@ return span_deadsay("[t_He] [t_is] limp and unresponsive; they're still twitching on occasion, perhaps [p_they()] can still be saved..!") else return span_deadsay("[t_He] [t_is] limp and unresponsive; there are no signs of life and they've degraded beyond revival...") + +///copies over clothing preferences like underwear to another human +/mob/living/carbon/human/copy_clothing_prefs(mob/living/carbon/human/destination) + . = ..() + + destination.bra = bra + destination.bra_color = bra_color diff --git a/modular_skyrat/master_files/icons/mob/clothing/underwear.dmi b/modular_skyrat/master_files/icons/mob/clothing/underwear.dmi index 09b9161fade..3d9209905cb 100644 Binary files a/modular_skyrat/master_files/icons/mob/clothing/underwear.dmi and b/modular_skyrat/master_files/icons/mob/clothing/underwear.dmi differ diff --git a/modular_skyrat/modules/contractor/code/datums/outfit.dm b/modular_skyrat/modules/contractor/code/datums/outfit.dm new file mode 100644 index 00000000000..3364e2fbccb --- /dev/null +++ b/modular_skyrat/modules/contractor/code/datums/outfit.dm @@ -0,0 +1,2 @@ +/datum/outfit + var/datum/sprite_accessory/bra = null diff --git a/modular_skyrat/modules/customization/__HELPERS/global_lists.dm b/modular_skyrat/modules/customization/__HELPERS/global_lists.dm index 825737a6cf8..a2dca2e39be 100644 --- a/modular_skyrat/modules/customization/__HELPERS/global_lists.dm +++ b/modular_skyrat/modules/customization/__HELPERS/global_lists.dm @@ -152,3 +152,26 @@ if(!sprite_datum?.erp_accessory) continue GLOB.undershirt_m -= sprite_name + + + // Bras + for(var/sprite_name in GLOB.bra_list) + var/datum/sprite_accessory/sprite_datum = GLOB.bra_list[sprite_name] + if(!sprite_datum?.erp_accessory) + continue + + GLOB.bra_list -= sprite_name + + for(var/sprite_name in GLOB.bra_f) + var/datum/sprite_accessory/sprite_datum = GLOB.bra_f[sprite_name] + if(!sprite_datum?.erp_accessory) + continue + + GLOB.bra_f -= sprite_name + + for(var/sprite_name in GLOB.bra_m) + var/datum/sprite_accessory/sprite_datum = GLOB.bra_m[sprite_name] + if(!sprite_datum?.erp_accessory) + continue + + GLOB.bra_m -= sprite_name diff --git a/modular_skyrat/modules/customization/__HELPERS/mobs.dm b/modular_skyrat/modules/customization/__HELPERS/mobs.dm index 4e7fd400006..2707a172fe4 100644 --- a/modular_skyrat/modules/customization/__HELPERS/mobs.dm +++ b/modular_skyrat/modules/customization/__HELPERS/mobs.dm @@ -42,3 +42,15 @@ body_markings[zone] = list() body_markings[zone][set_name] = list(BM.get_default_color(features, pref_species), FALSE) return body_markings + +/proc/random_bra(gender) + if(!length(GLOB.bra_list)) + init_sprite_accessory_subtypes(/datum/sprite_accessory/bra, GLOB.bra_list, GLOB.bra_m, GLOB.bra_f) + + switch(gender) + if(MALE) + return pick(GLOB.bra_m) + if(FEMALE) + return pick(GLOB.bra_f) + else + return pick(GLOB.bra_list) diff --git a/modular_skyrat/modules/customization/_globalvars/lists.dm b/modular_skyrat/modules/customization/_globalvars/lists.dm index b684abf4e1c..86586e3f4d7 100644 --- a/modular_skyrat/modules/customization/_globalvars/lists.dm +++ b/modular_skyrat/modules/customization/_globalvars/lists.dm @@ -103,3 +103,11 @@ GLOBAL_LIST_INIT(color_list_ghoul, list( \ "Plutonium Blue" = "a5cfcc", \ "Marked Red" = "f05b68" \ )) + +//Bras +/// Stores all /datum/sprite_accessory/bra indexed by name. +GLOBAL_LIST_EMPTY(bra_list) +/// Stores only the bra names for male-compatible bras. +GLOBAL_LIST_EMPTY(bra_m) +/// Stores only the bra names for female-compatible bras. +GLOBAL_LIST_EMPTY(bra_f) diff --git a/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories.dm b/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories.dm index 33a5ba2487f..dd96f77df02 100644 --- a/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories.dm +++ b/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories.dm @@ -206,6 +206,7 @@ GLOBAL_LIST_EMPTY(cached_mutant_icon_files) /datum/sprite_accessory/socks icon = 'modular_skyrat/master_files/icons/mob/clothing/underwear.dmi' use_static = TRUE + /datum/sprite_accessory/socks/socks_norm name = "Normal (Greyscale)" icon_state = "white_norm" @@ -385,17 +386,17 @@ GLOBAL_LIST_EMPTY(cached_mutant_icon_files) gender = MALE use_static = TRUE +/datum/sprite_accessory/underwear/panties_basic + name = "Panties - Basic" + icon_state = "panties" + gender = FEMALE + /datum/sprite_accessory/underwear/female_beekini name = "Panties - Bee-kini" icon_state = "panties_bee-kini" gender = FEMALE use_static = TRUE -/datum/sprite_accessory/underwear/panties - name = "Panties" - icon_state = "panties" - gender = FEMALE - /datum/sprite_accessory/underwear/fishnet_lower name = "Panties - Fishnet" icon_state = "fishnet_lower" @@ -528,53 +529,32 @@ GLOBAL_LIST_EMPTY(cached_mutant_icon_files) has_digitigrade = TRUE gender = FEMALE +/datum/sprite_accessory/underwear/boyshorts_alt + name = "Boyshorts (Alt)" + icon_state = "boyshorts_alt" + gender = FEMALE + /* Adding hides_breasts to TG underwears where applicable */ -/datum/sprite_accessory/underwear/female_bikini - hides_breasts = TRUE - -/datum/sprite_accessory/underwear/female_lace - hides_breasts = TRUE - -/datum/sprite_accessory/underwear/female_bralette - hides_breasts = TRUE - -/datum/sprite_accessory/underwear/female_sport - hides_breasts = TRUE - -/datum/sprite_accessory/underwear/female_strapless - hides_breasts = TRUE - -/datum/sprite_accessory/underwear/female_babydoll - hides_breasts = TRUE /datum/sprite_accessory/underwear/swimsuit_onepiece + name = "One-Piece Swimsuit" + icon_state = "swim_onepiece" + gender = FEMALE hides_breasts = TRUE /datum/sprite_accessory/underwear/swimsuit_strapless_onepiece + name = "Strapless One-Piece Swimsuit" + icon_state = "swim_strapless_onepiece" + gender = FEMALE hides_breasts = TRUE - -/datum/sprite_accessory/underwear/swimsuit_twopiece - hides_breasts = TRUE - -/datum/sprite_accessory/underwear/swimsuit_strapless_twopiece - hides_breasts = TRUE - /datum/sprite_accessory/underwear/swimsuit_stripe + name = "Strapless Striped Swimsuit" + icon_state = "swim_stripe" + gender = FEMALE hides_breasts = TRUE -/datum/sprite_accessory/underwear/swimsuit_halter - hides_breasts = TRUE - -/datum/sprite_accessory/underwear/female_white_neko - hides_breasts = TRUE - -/datum/sprite_accessory/underwear/female_black_neko - hides_breasts = TRUE - -/datum/sprite_accessory/underwear/female_uk - hides_breasts = TRUE /* End of adding hides_breasts to TG stuff, start of adding has_digitigrade to TG stuff @@ -606,13 +586,216 @@ GLOBAL_LIST_EMPTY(cached_mutant_icon_files) /datum/sprite_accessory/underwear/male_uk has_digitigrade = TRUE -/datum/sprite_accessory/underwear/female_sport - has_digitigrade = TRUE - /* End of adding has_digitigrade to TG stuff */ + +/// BRAS and all the fun stuff of moving these about. +/datum/sprite_accessory/bra + icon = 'modular_skyrat/master_files/icons/mob/clothing/underwear.dmi' + use_static = FALSE + em_block = TRUE + +/datum/sprite_accessory/bra/nude + name = "Nude" + icon_state = null + gender = NEUTER + +/datum/sprite_accessory/bra/bra + name = "Bra" + icon_state = "bra" + gender = FEMALE + use_static = null + +/datum/sprite_accessory/bra/bra_alt + name = "Bra - Alt" + icon_state = "bra_alt" + gender = FEMALE + use_static = null + +/datum/sprite_accessory/bra/bra_thin + name = "Bra - Thin" + icon_state = "bra_thin" + gender = FEMALE + use_static = null + +/datum/sprite_accessory/bra/bra_kinky + name = "Bra - Kinky Black" + icon_state = "bra_kinky" + gender = FEMALE + use_static = TRUE + +/datum/sprite_accessory/bra/bra_freedom + name = "Bra - Freedom" + icon_state = "bra_assblastusa" + gender = FEMALE + use_static = TRUE + +/datum/sprite_accessory/bra/bra_commie + name = "Bra - Commie" + icon_state = "bra_commie" + gender = FEMALE + use_static = TRUE + +/datum/sprite_accessory/bra/bra_beekini + name = "Bra - Bee-kini" + icon_state = "bra_bee-kini" + gender = FEMALE + use_static = TRUE + +/datum/sprite_accessory/bra/bra_uk + name = "Bra - UK" + icon_state = "bra_uk" + gender = FEMALE + use_static = TRUE + +/datum/sprite_accessory/bra/bra_neko + name = "Bra - Neko" + icon_state = "bra_neko" + gender = FEMALE + use_static = null + +/datum/sprite_accessory/bra/hi_vis_bra + name = "Safekini" + icon_state = "hi_vis_bra" + gender = FEMALE + use_static = TRUE + +/datum/sprite_accessory/bra/halterneck_bra + name = "Bra - Halterneck" + icon_state = "halterneck_bra" + gender = FEMALE + use_static = null + +/datum/sprite_accessory/bra/halterneck_alt + name = "Bra - Halterneck (Alt)" + icon_state = "bra_swimming" + gender = FEMALE + use_static = null + +/datum/sprite_accessory/bra/sports_bra + name = "Bra, Sports" + icon_state = "sports_bra" + gender = FEMALE + use_static = null + +/datum/sprite_accessory/bra/sports_bra_alt + name = "Bra, Sports - Alt" + icon_state = "sports_bra_alt" + gender = FEMALE + use_static = null + +/datum/sprite_accessory/bra/bra_strapless + name = "Bra, Strapless" + icon_state = "bra_strapless" + gender = FEMALE + use_static = null + +/datum/sprite_accessory/bra/bra_latex + name = "Bra, Latex" + icon_state = "bra_latex" + gender = FEMALE + use_static = TRUE + erp_accessory = TRUE + +/datum/sprite_accessory/bra/striped_bra + name = "Bra - Striped" + icon_state = "striped_bra" + gender = FEMALE + use_static = null + +/datum/sprite_accessory/bra/sarashi + name = "Bra - Sarashi" + icon_state = "bandages" + gender = NEUTER + use_static = null + +/datum/sprite_accessory/bra/fishnet_sleeves + name = "Fishnet - Sleeved" + icon_state = "fishnet_sleeves" + gender = FEMALE + use_static = TRUE + +/datum/sprite_accessory/bra/fishnet_sleeves/alt + name = "Fishnet - Sleeved (Greyscale)" + icon_state = "fishnet_sleeves_alt" + use_static = null + +/datum/sprite_accessory/bra/fishnet_base + name = "Fishnet - Sleeveless" + icon_state = "fishnet_body" + gender = FEMALE + use_static = TRUE + +/datum/sprite_accessory/bra/fishnet_base/alt + name = "Fishnet - Sleeveless (Greyscale)" + icon_state = "fishnet_body_alt" + use_static = null + +/datum/sprite_accessory/bra/chastbra + name = "Chastity Bra" + icon_state = "chastbra" + gender = FEMALE + use_static = TRUE + erp_accessory = TRUE + +/datum/sprite_accessory/bra/pasties + name = "Pasties" + icon_state = "pasties" + gender = FEMALE + use_static = null + erp_accessory = TRUE + +/datum/sprite_accessory/bra/pasties_alt + name = "Pasties - Alt" + icon_state = "pasties_alt" + gender = FEMALE + use_static = null + erp_accessory = TRUE + +/datum/sprite_accessory/bra/shibari + name = "Shibari" + icon_state = "shibari" + gender = FEMALE + use_static = null + erp_accessory = TRUE + +/datum/sprite_accessory/bra/shibari_sleeves + name = "Shibari Sleeves" + icon_state = "shibari_sleeves" + gender = FEMALE + use_static = null + erp_accessory = TRUE + +/datum/sprite_accessory/bra/swimsuit + name = "Swimsuit Top" + icon_state = "bikini_bra" + gender = FEMALE + use_static = null + +/datum/sprite_accessory/bra/strapless_swimsuit + name = "Strapless Swimsuit Top" + icon_state = "strapless_biki_bra" + gender = FEMALE + use_static = null + +/datum/sprite_accessory/bra/strapless_swimsuit_alt + name = "Strapless Swimsuit Top (Alt)" + icon_state = "strapless_biki_bra_alt" + gender = FEMALE + use_static = null + +/datum/sprite_accessory/bra/binder + name = "Binder" + icon_state = "binder" + gender = MALE + use_static = null + +/datum/sprite_accessory/bra/binder/strapless + name = "Binder - Strapless" + icon_state = "binder_strapless" + /datum/sprite_accessory/undershirt icon = 'modular_skyrat/master_files/icons/mob/clothing/underwear.dmi' use_static = TRUE @@ -647,142 +830,11 @@ GLOBAL_LIST_EMPTY(cached_mutant_icon_files) use_static = TRUE /datum/sprite_accessory/undershirt/babydoll - name = "Baby-Doll" + name = "Babydoll" icon_state = "babydoll" gender = FEMALE use_static = null -/datum/sprite_accessory/undershirt/bra - name = "Bra" - icon_state = "bra" - gender = FEMALE - use_static = null - -/datum/sprite_accessory/undershirt/hi_vis_bra - name = "Safekini" - icon_state = "hi_vis_bra" - gender = FEMALE - use_static = TRUE - -/datum/sprite_accessory/undershirt/bra_alt - name = "Bra - Alt" - icon_state = "bra_alt" - gender = FEMALE - use_static = null - -/datum/sprite_accessory/undershirt/bra_thin - name = "Bra - Thin" - icon_state = "bra_thin" - gender = FEMALE - use_static = null - -/datum/sprite_accessory/undershirt/bra_kinky - name = "Bra - Kinky Black" - icon_state = "bra_kinky" - gender = FEMALE - use_static = TRUE - -/datum/sprite_accessory/undershirt/bra_freedom - name = "Bra - Freedom" - icon_state = "bra_assblastusa" - gender = FEMALE - use_static = TRUE - -/datum/sprite_accessory/undershirt/bra_commie - name = "Bra - Commie" - icon_state = "bra_commie" - gender = FEMALE - use_static = TRUE - -/datum/sprite_accessory/undershirt/bra_beekini - name = "Bra - Bee-kini" - icon_state = "bra_bee-kini" - gender = FEMALE - use_static = TRUE - -/datum/sprite_accessory/undershirt/bra_uk - name = "Bra - UK" - icon_state = "bra_uk" - gender = FEMALE - use_static = TRUE - -/datum/sprite_accessory/undershirt/bra_neko - name = "Bra - Neko" - icon_state = "bra_neko" - gender = FEMALE - use_static = null - -/datum/sprite_accessory/undershirt/halterneck_bra - name = "Bra - Halterneck" - icon_state = "halterneck_bra" - gender = FEMALE - use_static = null - -/datum/sprite_accessory/undershirt/sports_bra - name = "Bra, Sports" - icon_state = "sports_bra" - gender = FEMALE - use_static = null - -/datum/sprite_accessory/undershirt/sports_bra_alt - name = "Bra, Sports - Alt" - icon_state = "sports_bra_alt" - gender = FEMALE - use_static = null - -/datum/sprite_accessory/undershirt/bra_strapless - name = "Bra, Strapless" - icon_state = "bra_strapless" - gender = FEMALE - use_static = null - -/datum/sprite_accessory/undershirt/bra_latex - name = "Bra, Latex" - icon_state = "bra_latex" - gender = FEMALE - use_static = TRUE - erp_accessory = TRUE - -/datum/sprite_accessory/undershirt/striped_bra - name = "Bra - Striped" - icon_state = "striped_bra" - gender = FEMALE - use_static = null - -/datum/sprite_accessory/undershirt/sarashi - name = "Bra - Sarashi" - icon_state = "bandages" - gender = NEUTER - use_static = null - -/datum/sprite_accessory/undershirt/fishnet_sleeves - name = "Fishnet - Sleeved" - icon_state = "fishnet_sleeves" - gender = FEMALE - use_static = TRUE - -/datum/sprite_accessory/undershirt/fishnet_sleeves/alt - name = "Fishnet - Sleeved (Greyscale)" - icon_state = "fishnet_sleeves_alt" - use_static = null - -/datum/sprite_accessory/undershirt/fishnet_base - name = "Fishnet - Sleeveless" - icon_state = "fishnet_body" - gender = FEMALE - use_static = TRUE - -/datum/sprite_accessory/undershirt/fishnet_base/alt - name = "Fishnet - Sleeveless (Greyscale)" - icon_state = "fishnet_body_alt" - use_static = null - -/datum/sprite_accessory/undershirt/swimsuit - name = "Swimsuit Top" - icon_state = "bra_swimming" - gender = FEMALE - use_static = null - /datum/sprite_accessory/undershirt/corset name = "Corset" icon_state = "corset" @@ -790,41 +842,6 @@ GLOBAL_LIST_EMPTY(cached_mutant_icon_files) use_static = TRUE hides_groin = TRUE -/datum/sprite_accessory/undershirt/chastbra - name = "Chastity Bra" - icon_state = "chastbra" - gender = FEMALE - use_static = TRUE - erp_accessory = TRUE - -/datum/sprite_accessory/undershirt/pasties - name = "Pasties" - icon_state = "pasties" - gender = FEMALE - use_static = null - erp_accessory = TRUE - -/datum/sprite_accessory/undershirt/pasties_alt - name = "Pasties - Alt" - icon_state = "pasties_alt" - gender = FEMALE - use_static = null - erp_accessory = TRUE - -/datum/sprite_accessory/undershirt/shibari - name = "Shibari" - icon_state = "shibari" - gender = FEMALE - use_static = null - erp_accessory = TRUE - -/datum/sprite_accessory/undershirt/shibari_sleeves - name = "Shibari Sleeves" - icon_state = "shibari_sleeves" - gender = FEMALE - use_static = null - erp_accessory = TRUE - /datum/sprite_accessory/undershirt/bulletclub //4 life name = "Shirt - Black Skull" icon_state = "shirt_bc" @@ -840,16 +857,6 @@ GLOBAL_LIST_EMPTY(cached_mutant_icon_files) name = "Shirt - Blue Stripes" icon_state = "longstripe_blue" -/datum/sprite_accessory/undershirt/binder - name = "Binder" - icon_state = "binder" - gender = MALE - use_static = null - -/datum/sprite_accessory/undershirt/binder/strapless - name = "Binder - Strapless" - icon_state = "binder_strapless" - /datum/sprite_accessory/undershirt/turtleneck name = "Sweater - Turtleneck" icon_state = "turtleneck" diff --git a/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/genitals.dm b/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/genitals.dm index 6930b5ef585..f5d314f1793 100644 --- a/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/genitals.dm +++ b/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/genitals.dm @@ -45,6 +45,10 @@ else if(genital_location == CHEST && worn_underwear.hides_breasts) return TRUE + //Are they wearing a bra? + if(target_mob.bra != "Nude" && !(target_mob.underwear_visibility & UNDERWEAR_HIDE_BRA) && genital_location == CHEST) + return TRUE + //Nothing they're wearing will cover them else return FALSE diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/human.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/human.dm index 6b540a5cb7f..78c597e7864 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/human.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/human.dm @@ -83,21 +83,24 @@ var/underwear_button = underwear_visibility & UNDERWEAR_HIDE_UNDIES ? "Show underwear" : "Hide underwear" var/undershirt_button = underwear_visibility & UNDERWEAR_HIDE_SHIRT ? "Show shirt" : "Hide shirt" var/socks_button = underwear_visibility & UNDERWEAR_HIDE_SOCKS ? "Show socks" : "Hide socks" - var/list/choice_list = list("[underwear_button]" = 1,"[undershirt_button]" = 2,"[socks_button]" = 3,"Show all" = 4, "Hide all" = 5) + var/bra_button = underwear_visibility & UNDERWEAR_HIDE_BRA ? "Show bra" : "Hide bra" + var/list/choice_list = list("[underwear_button]" = "underwear", "[bra_button]" = "bra", "[undershirt_button]" = "shirt", "[socks_button]" = "socks","show all" = "show", "Hide all" = "hide") var/picked_visibility = input(src, "Choose visibility setting", "Show/Hide underwear") as null|anything in choice_list if(picked_visibility) var/picked_choice = choice_list[picked_visibility] switch(picked_choice) - if(1) + if("underwear") underwear_visibility ^= UNDERWEAR_HIDE_UNDIES - if(2) + if("bra") + underwear_visibility ^= UNDERWEAR_HIDE_BRA + if("shirt") underwear_visibility ^= UNDERWEAR_HIDE_SHIRT - if(3) + if("socks") underwear_visibility ^= UNDERWEAR_HIDE_SOCKS - if(4) + if("show") underwear_visibility = NONE - if(5) - underwear_visibility = UNDERWEAR_HIDE_UNDIES | UNDERWEAR_HIDE_SHIRT | UNDERWEAR_HIDE_SOCKS + if("hide") + underwear_visibility = UNDERWEAR_HIDE_UNDIES | UNDERWEAR_HIDE_SHIRT | UNDERWEAR_HIDE_SOCKS | UNDERWEAR_HIDE_BRA update_body() return diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/human_defines.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/human_defines.dm index 9e0f80c7c2c..2b5d1e83f9b 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/human_defines.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/human_defines.dm @@ -21,4 +21,7 @@ var/oversized_piggyknock = 3 SECONDS /// Alpha of the hair. Takes precedent over species hair_alpha if non-null. var/hair_alpha - + /// The selected bra. + var/bra = "Nude" + /// Color of the bra. + var/bra_color = "#FFFFFF" diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species.dm index 712a5fd1757..3d0aaf94db5 100644 --- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species.dm +++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species.dm @@ -133,6 +133,18 @@ GLOBAL_LIST_EMPTY(customizable_races) underwear_overlay.color = species_human.underwear_color standing += underwear_overlay + if(species_human.bra && !(species_human.underwear_visibility & UNDERWEAR_HIDE_BRA)) + var/datum/sprite_accessory/bra/bra = GLOB.bra_list[species_human.bra] + + if(bra) + var/mutable_appearance/bra_overlay + var/icon_state = bra.icon_state + bra_overlay = mutable_appearance(bra.icon, icon_state, -BODY_LAYER) + if(!bra.use_static) + bra_overlay.color = species_human.bra_color + + standing += bra_overlay + if(species_human.undershirt && !(species_human.underwear_visibility & UNDERWEAR_HIDE_SHIRT)) var/datum/sprite_accessory/undershirt/undershirt = GLOB.undershirt_list[species_human.undershirt] if(undershirt) diff --git a/tgstation.dme b/tgstation.dme index aa33b7e6619..600435c37f8 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -5877,6 +5877,7 @@ #include "modular_skyrat\master_files\code\game\objects\items\storage\backpack.dm" #include "modular_skyrat\master_files\code\game\objects\items\storage\boxes.dm" #include "modular_skyrat\master_files\code\game\objects\items\tools\weldingtool.dm" +#include "modular_skyrat\master_files\code\game\objects\structures\mannequin.dm" #include "modular_skyrat\master_files\code\game\objects\structures\railings.dm" #include "modular_skyrat\master_files\code\game\objects\structures\sauna_oven.dm" #include "modular_skyrat\master_files\code\game\objects\structures\tables_racks.dm" @@ -6487,6 +6488,7 @@ #include "modular_skyrat\modules\contractor\code\datums\contractor_tablet.dm" #include "modular_skyrat\modules\contractor\code\datums\mind_datum.dm" #include "modular_skyrat\modules\contractor\code\datums\objective.dm" +#include "modular_skyrat\modules\contractor\code\datums\outfit.dm" #include "modular_skyrat\modules\contractor\code\datums\midround\antag_datum.dm" #include "modular_skyrat\modules\contractor\code\datums\midround\event.dm" #include "modular_skyrat\modules\contractor\code\datums\midround\objective.dm" diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/species_features.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/species_features.tsx index 30ac1033eda..07b14461b3b 100644 --- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/species_features.tsx +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/species_features.tsx @@ -98,6 +98,11 @@ export const underwear_color: Feature = { component: FeatureColorInput, }; +export const bra_color: Feature = { + name: 'Bra color', + component: FeatureColorInput, +}; + export const feature_vampire_status: Feature = { name: 'Vampire status', component: FeatureDropdownInput,