diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 247a7a964c183..ea87ed30f4962 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -713,6 +713,10 @@ GLOBAL_LIST_INIT(human_heights_to_offsets, list( /// DOPPLER SHIFT ADDITION BEGIN /// Just below clothing layer #define UNDER_UNIFORM_LAYER 27.5 +/// Bra and socks +#define BRA_SOCKS_LAYER 27.02 +/// Underwear and undershirt +#define UNDERWEAR_UNDERSHIRT 27.01 /// DOPPLER SHIFT ADDITION END /// Jumpsuit clothing layer #define UNIFORM_LAYER 27 diff --git a/code/__DEFINES/~doppler_defines/mobs.dm b/code/__DEFINES/~doppler_defines/mobs.dm index 9e06c02bb5eaa..ef27886806438 100644 --- a/code/__DEFINES/~doppler_defines/mobs.dm +++ b/code/__DEFINES/~doppler_defines/mobs.dm @@ -1 +1,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) +#define UNDERWEAR_HIDE_ALL (UNDERWEAR_HIDE_SOCKS | UNDERWEAR_HIDE_SHIRT | UNDERWEAR_HIDE_UNDIES | UNDERWEAR_HIDE_BRA) + #define BODYPART_ICON_SNAIL 'modular_doppler/modular_species/species_types/snails/icons/bodyparts/snail_bodyparts.dmi' diff --git a/code/__HELPERS/~doppler_helpers/mobs.dm b/code/__HELPERS/~doppler_helpers/mobs.dm new file mode 100644 index 0000000000000..7822dcc15a12d --- /dev/null +++ b/code/__HELPERS/~doppler_helpers/mobs.dm @@ -0,0 +1,8 @@ +/proc/random_bra(gender) + switch(gender) + if(MALE) + return pick(SSaccessories.bra_m) + if(FEMALE) + return pick(SSaccessories.bra_f) + else + return pick(SSaccessories.bra_list) diff --git a/code/datums/outfit.dm b/code/datums/outfit.dm index 542d0d6504672..a5a80762e8449 100644 --- a/code/datums/outfit.dm +++ b/code/datums/outfit.dm @@ -227,6 +227,11 @@ if(socks) user.socks = initial(socks.name) + // DOPPLER EDIT ADDITION START - Underwear and bra split + if(bra) + user.bra = initial(bra.name) + // DOPPLER 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 bcdf8ada48f35..b216fe9c8269a 100644 --- a/code/datums/sprite_accessories.dm +++ b/code/datums/sprite_accessories.dm @@ -1160,6 +1160,8 @@ use_static = TRUE +// DOPPLER EDIT REMOVAL BEGIN - Underwear and bra split +/* //FEMALE UNDERWEAR /datum/sprite_accessory/underwear/female_bikini name = "Bikini" @@ -1261,6 +1263,8 @@ icon_state = "female_kinky" gender = FEMALE use_static = TRUE +*/ +// DOPPLER EDIT END //////////////////////////// // Undershirt Definitions // @@ -1457,6 +1461,8 @@ icon_state = "whiteshortsleeve" gender = NEUTER +// DOPPLER EDIT REMOVAL BEGIN - Underwear and bra split +/* /datum/sprite_accessory/undershirt/sports_bra name = "Sports Bra" icon_state = "sports_bra" @@ -1466,6 +1472,8 @@ name = "Sports Bra (Alt)" icon_state = "sports_bra_alt" gender = NEUTER +*/ +// DOPPLER EDIT END /datum/sprite_accessory/undershirt/blueshirtsport name = "Sports Shirt (Blue)" diff --git a/code/game/objects/structures/dresser.dm b/code/game/objects/structures/dresser.dm index cf3864b140059..7bda5955da078 100644 --- a/code/game/objects/structures/dresser.dm +++ b/code/game/objects/structures/dresser.dm @@ -32,7 +32,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")) + 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")) //DOPPLER EDIT ADDITION - Colorable Undershirt/Socks/Bra if(isnull(choice)) return @@ -55,6 +55,24 @@ var/new_socks = tgui_input_list(user, "Select your socks", "Changing", SSaccessories.socks_list) if(new_socks) dressing_human.socks = new_socks + //DOPPLER 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) + dressing_human.undershirt_color = sanitize_hexcolor(new_undershirt_color) + if("Socks Color") + 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) + if("Bra") + var/new_bra = tgui_input_list(user, "Select your Bra", "Changing", SSaccessories.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) + //DOPPLER 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 afad19b27114f..6d4d45d9a5abb 100644 --- a/code/game/objects/structures/mannequin.dm +++ b/code/game/objects/structures/mannequin.dm @@ -98,18 +98,24 @@ var/datum/sprite_accessory/underwear/underwear = SSaccessories.underwear_list[underwear_name] if(underwear) if(body_type == FEMALE && underwear.gender == MALE) - . += mutable_appearance(wear_female_version(underwear.icon_state, underwear.icon, FEMALE_UNIFORM_FULL), layer = -BODY_LAYER) + . += mutable_appearance(wear_female_version(underwear.icon_state, underwear.icon, FEMALE_UNIFORM_FULL), layer = -UNDERWEAR_UNDERSHIRT) else - . += mutable_appearance(underwear.icon, underwear.icon_state, layer = -BODY_LAYER) + . += mutable_appearance(underwear.icon, underwear.icon_state, layer = -UNDERWEAR_UNDERSHIRT) var/datum/sprite_accessory/undershirt/undershirt = SSaccessories.undershirt_list[undershirt_name] if(undershirt) if(body_type == FEMALE) - . += mutable_appearance(wear_female_version(undershirt.icon_state, undershirt.icon), layer = -BODY_LAYER) + . += mutable_appearance(wear_female_version(undershirt.icon_state, undershirt.icon), layer = -UNDERWEAR_UNDERSHIRT) else - . += mutable_appearance(undershirt.icon, undershirt.icon_state, layer = -BODY_LAYER) + . += mutable_appearance(undershirt.icon, undershirt.icon_state, layer = -UNDERWEAR_UNDERSHIRT) var/datum/sprite_accessory/socks/socks = SSaccessories.socks_list[socks_name] if(socks) - . += mutable_appearance(socks.icon, socks.icon_state, -BODY_LAYER) + . += mutable_appearance(socks.icon, socks.icon_state, -BRA_SOCKS_LAYER) + //DOPPLER EDIT ADDITION BEGIN - Underwear and Bra split + var/datum/sprite_accessory/bra/bra = SSaccessories.bra_list[bra_name] + if(bra) + . += mutable_appearance(bra.icon, bra.icon_state, -BRA_SOCKS_LAYER) + //DOPPLER EDIT END + for(var/slot_flag in worn_items) var/obj/item/worn_item = worn_items[slot_flag] if(!worn_item) @@ -163,7 +169,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")) //DOPPLER EDIT ADDITION - Underwear and Bra split if(!Adjacent(user)) return switch(choice) @@ -179,6 +185,12 @@ var/new_socks = tgui_input_list(user, "Select the mannequin's socks", "Changing", SSaccessories.socks_list) if(new_socks) socks_name = new_socks + //DOPPLER EDIT ADDITION BEGIN - Underwear and Bra split + if("Bra") + var/new_bra = tgui_input_list(user, "Select the mannequin's bra", "Changing", SSaccessories.bra_list) + if(new_bra) + bra_name = new_bra + //DOPPLER 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 20e1c94ee9a60..505c103f9d09c 100644 --- a/code/modules/antagonists/changeling/changeling.dm +++ b/code/modules/antagonists/changeling/changeling.dm @@ -541,6 +541,12 @@ new_profile.underwear_color = target.underwear_color new_profile.undershirt = target.undershirt new_profile.socks = target.socks + // DOPPLER EDIT ADDITION START - Underwear and Bra split + new_profile.bra = target.bra + new_profile.undershirt_color = target.undershirt_color + new_profile.socks_color = target.socks_color + new_profile.bra_color = target.bra_color + // DOPPLER EDIT ADDITION END // Grab skillchips they have new_profile.skillchips = target.clone_skillchip_list(TRUE) diff --git a/code/modules/client/preferences/clothing.dm b/code/modules/client/preferences/clothing.dm index 074ed4e041ac6..ac950179caf51 100644 --- a/code/modules/client/preferences/clothing.dm +++ b/code/modules/client/preferences/clothing.dm @@ -1,13 +1,13 @@ -/proc/generate_underwear_icon(datum/sprite_accessory/accessory, icon/base_icon, color) +/proc/generate_underwear_icon(datum/sprite_accessory/accessory, icon/base_icon, color, icon_offset = 0) // DOPPLER EDIT CHANGE : adds icon_offset - Colorable Undershirt/Socks var/icon/final_icon = new(base_icon) if (!isnull(accessory)) - var/icon/accessory_icon = icon('icons/mob/clothing/underwear.dmi', accessory.icon_state) + var/icon/accessory_icon = icon(accessory.icon, accessory.icon_state) // DOPPLER EDIT CHANGE: ORIGINAL - var/icon/accessory_icon = icon('icons/mob/clothing/underwear.dmi', accessory.icon_state) if (color && !accessory.use_static) accessory_icon.Blend(color, ICON_MULTIPLY) final_icon.Blend(accessory_icon, ICON_OVERLAY) - final_icon.Crop(10, 1, 22, 13) + final_icon.Crop(10, 1+icon_offset, 22, 13+icon_offset) // DOPPLER EDIT CHANGE : adds icon_offset - Colorable Undershirt/Socks final_icon.Scale(32, 32) return final_icon @@ -137,6 +137,8 @@ /datum/preference/choiced/undershirt/create_default_value() return /datum/sprite_accessory/undershirt/nude::name +// DOPPLER EDIT REMOVAL BEGIN - Sports Bra doesn't exist anymore. We leave it as nude and set the underwear in modular_customization +/* /datum/preference/choiced/undershirt/create_informed_default_value(datum/preferences/preferences) switch(preferences.read_preference(/datum/preference/choiced/gender)) if(MALE) @@ -145,6 +147,8 @@ return /datum/sprite_accessory/undershirt/sports_bra::name return ..() +*/ +// DOPPLER EDIT END /datum/preference/choiced/undershirt/icon_for(value) var/static/icon/body @@ -161,9 +165,9 @@ if (value != "Nude") var/datum/sprite_accessory/accessory = SSaccessories.undershirt_list[value] - icon_with_undershirt.Blend(icon('icons/mob/clothing/underwear.dmi', accessory.icon_state), ICON_OVERLAY) + icon_with_undershirt.Blend(icon(accessory.icon, accessory.icon_state), ICON_OVERLAY) // DOPPLER EDIT CHANGE: ORIGINAL - icon_with_undershirt.Blend(icon('icons/mob/clothing/underwear.dmi', accessory.icon_state), ICON_OVERLAY) - icon_with_undershirt.Crop(9, 9, 23, 23) + icon_with_undershirt.Crop(10, 11, 22, 23) // DOPPLER EDIT CHANGE : ORIGINAL - icon_with_undershirt.Crop(9, 9, 23, 23) icon_with_undershirt.Scale(32, 32) return icon_with_undershirt @@ -194,7 +198,7 @@ lower_half.Blend(icon('icons/mob/human/bodyparts_greyscale.dmi', "human_r_leg"), ICON_OVERLAY) lower_half.Blend(icon('icons/mob/human/bodyparts_greyscale.dmi', "human_l_leg"), ICON_OVERLAY) - return generate_underwear_icon(SSaccessories.underwear_list[value], lower_half, COLOR_ALMOST_BLACK) + return generate_underwear_icon(SSaccessories.underwear_list[value], lower_half, COLOR_ALMOST_BLACK, icon_offset = 5) // DOPPLER EDIT CHANGE : ICON_OFFSET // DOPPLER EDIT CHANGE - ORIGINAL: return generate_underwear_icon(SSaccessories.underwear_list[value], lower_half, COLOR_ALMOST_BLACK) /datum/preference/choiced/underwear/apply_to_human(mob/living/carbon/human/target, value) target.underwear = value diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm index 948a3f90ea31d..94edbc3515179 100644 --- a/code/modules/mob/living/carbon/human/_species.dm +++ b/code/modules/mob/living/carbon/human/_species.dm @@ -488,34 +488,61 @@ GLOBAL_LIST_EMPTY(features_by_species) eye_organ.refresh(call_update = FALSE) standing += eye_organ.generate_body_overlay(species_human) - //Underwear, Undershirts & Socks + // DOPPLER EDIT ADDITION START - Underwear, Bra, Undershirts & Socks if(!HAS_TRAIT(species_human, TRAIT_NO_UNDERWEAR)) - if(species_human.underwear) + if(species_human.underwear && !(species_human.underwear_visibility & UNDERWEAR_HIDE_UNDIES)) var/datum/sprite_accessory/underwear/underwear = SSaccessories.underwear_list[species_human.underwear] var/mutable_appearance/underwear_overlay + var/female_sprite_flags = FEMALE_UNIFORM_FULL // the default gender shaping if(underwear) + var/icon_state = underwear.icon_state + if(underwear.has_digitigrade && (species_human.bodyshape & BODYSHAPE_DIGITIGRADE)) + icon_state += "_d" + female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY // for digi gender shaping if(species_human.dna.species.sexes && species_human.physique == FEMALE && (underwear.gender == MALE)) - underwear_overlay = mutable_appearance(wear_female_version(underwear.icon_state, underwear.icon, FEMALE_UNIFORM_FULL), layer = -BODY_LAYER) + underwear_overlay = mutable_appearance(wear_female_version(icon_state, underwear.icon, female_sprite_flags), layer = -UNDERWEAR_UNDERSHIRT) else - underwear_overlay = mutable_appearance(underwear.icon, underwear.icon_state, -BODY_LAYER) + underwear_overlay = mutable_appearance(underwear.icon, icon_state, -UNDERWEAR_UNDERSHIRT) if(!underwear.use_static) underwear_overlay.color = species_human.underwear_color standing += underwear_overlay - if(species_human.undershirt) + if(species_human.bra && !(species_human.underwear_visibility & UNDERWEAR_HIDE_BRA)) + var/datum/sprite_accessory/bra/bra = SSaccessories.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, -BRA_SOCKS_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 = SSaccessories.undershirt_list[species_human.undershirt] if(undershirt) - var/mutable_appearance/working_shirt + var/mutable_appearance/undershirt_overlay if(species_human.dna.species.sexes && species_human.physique == FEMALE) - working_shirt = mutable_appearance(wear_female_version(undershirt.icon_state, undershirt.icon), layer = -BODY_LAYER) + undershirt_overlay = mutable_appearance(wear_female_version(undershirt.icon_state, undershirt.icon), layer = -UNDERWEAR_UNDERSHIRT) else - working_shirt = mutable_appearance(undershirt.icon, undershirt.icon_state, layer = -BODY_LAYER) - standing += working_shirt + undershirt_overlay = mutable_appearance(undershirt.icon, undershirt.icon_state, layer = -UNDERWEAR_UNDERSHIRT) + if(!undershirt.use_static) + undershirt_overlay.color = species_human.undershirt_color + standing += undershirt_overlay - if(species_human.socks && species_human.num_legs >= 2 && !(species_human.bodyshape & BODYSHAPE_DIGITIGRADE)) + if(species_human.socks && !(species_human.underwear_visibility & UNDERWEAR_HIDE_SOCKS)) + // if(!("taur" in mutant_bodyparts) || mutant_bodyparts["taur"][MUTANT_INDEX_NAME] == SPRITE_ACCESSORY_NONE) var/datum/sprite_accessory/socks/socks = SSaccessories.socks_list[species_human.socks] if(socks) - standing += mutable_appearance(socks.icon, socks.icon_state, -BODY_LAYER) + var/mutable_appearance/socks_overlay + var/icon_state = socks.icon_state + if((species_human.bodyshape & BODYSHAPE_DIGITIGRADE)) + icon_state += "_d" + socks_overlay = mutable_appearance(socks.icon, icon_state, -BRA_SOCKS_LAYER) + if(!socks.use_static) + socks_overlay.color = species_human.socks_color + standing += socks_overlay + // DOPPLER EDIT ADDITION END if(standing.len) species_human.overlays_standing[BODY_LAYER] = standing @@ -544,6 +571,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) //DOPPLER 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/modular_doppler/enterprise_resource_planning/code/breasts.dm b/modular_doppler/enterprise_resource_planning/code/breasts.dm index 28263478d6471..9f523d180a169 100644 --- a/modular_doppler/enterprise_resource_planning/code/breasts.dm +++ b/modular_doppler/enterprise_resource_planning/code/breasts.dm @@ -42,10 +42,14 @@ feature_key = "breasts" /datum/bodypart_overlay/mutant/breasts/can_draw_on_bodypart(mob/living/carbon/human/human) - if(human.undershirt != "Nude") + if((human.undershirt != "Nude" && !(human.underwear_visibility & UNDERWEAR_HIDE_SHIRT)) || (human.bra != "Nude" && !(human.underwear_visibility & UNDERWEAR_HIDE_BRA))) return FALSE if((human.w_uniform && human.w_uniform.body_parts_covered & CHEST) || (human.wear_suit && human.wear_suit.body_parts_covered & CHEST)) return FALSE + if(human.underwear != "Nude" && !(human.underwear_visibility & UNDERWEAR_HIDE_UNDIES)) + var/datum/sprite_accessory/underwear/worn_underwear = SSaccessories.underwear_list[human.underwear] + if(worn_underwear.hides_breasts) + return FALSE return TRUE /datum/bodypart_overlay/mutant/breasts/get_global_feature_list() diff --git a/modular_doppler/modular_antagonists/changeling/changeling.dm b/modular_doppler/modular_antagonists/changeling/changeling.dm new file mode 100644 index 0000000000000..8ae10b8a51f59 --- /dev/null +++ b/modular_doppler/modular_antagonists/changeling/changeling.dm @@ -0,0 +1,9 @@ +/datum/changeling_profile + /// The bra worn by the profile source + var/bra + /// The color of the undershirt used by the profile source + var/undershirt_color + /// The color of the socks used by the profile source + var/socks_color + /// The color of the bra used by the profile source + var/bra_color diff --git a/modular_doppler/modular_customization/accessories/code/underwear_accessories/bras.dm b/modular_doppler/modular_customization/accessories/code/underwear_accessories/bras.dm new file mode 100644 index 0000000000000..1ce6b658b784a --- /dev/null +++ b/modular_doppler/modular_customization/accessories/code/underwear_accessories/bras.dm @@ -0,0 +1,146 @@ +//Modular separation of Bras as a separate underwear option that displays below undershirts +/datum/sprite_accessory/bra + icon = 'modular_doppler/modular_customization/accessories/icons/underwear/bra.dmi' + use_static = FALSE + gender = FEMALE + +/datum/sprite_accessory/bra/nude + name = "Nude" + icon_state = null + gender = NEUTER + +/datum/sprite_accessory/bra/bra + name = "Bra" + icon_state = "bra" + +/datum/sprite_accessory/bra/bra_alt + name = "Bra - Alt" + icon_state = "bra_alt" + +/datum/sprite_accessory/bra/bra_thin + name = "Bra - Thin" + icon_state = "bra_thin" + +/datum/sprite_accessory/bra/sports_bra + name = "Bra - Sports" + icon_state = "sports_bra" + +/datum/sprite_accessory/bra/sports_bra_alt + name = "Bra - Sports (Alt)" + icon_state = "sports_bra_alt" + +/datum/sprite_accessory/bra/bra_strapless + name = "Bra - Strapless" + icon_state = "bra_strapless" + +/datum/sprite_accessory/bra/bra_strapless_alt + name = "Bra - Strapless (Alt)" + icon_state = "bra_strapless_alt" + +/datum/sprite_accessory/bra/swimsuit + name = "Swimsuit Top" + icon_state = "bikini_bra" + +/datum/sprite_accessory/bra/strapless_swimsuit + name = "Swimsuit Top - Strapless" + icon_state = "strapless_biki_bra" + +/datum/sprite_accessory/bra/halterneck_bra + name = "Bra - Halterneck" + icon_state = "halterneck_bra" + +/datum/sprite_accessory/bra/halterneck_alt + name = "Bra - Halterneck (Alt)" + icon_state = "halterneck_bra_alt" + +/datum/sprite_accessory/bra/bra_neko + name = "Bra - Neko" + icon_state = "bra_neko" + +/datum/sprite_accessory/bra/binder + name = "Binder" + icon_state = "binder" + gender = MALE + +/datum/sprite_accessory/bra/binder/strapless + name = "Binder - Strapless" + icon_state = "binder_strapless" + +/datum/sprite_accessory/bra/sarashi + name = "Sarashi" + icon_state = "bandages" + gender = NEUTER + +/datum/sprite_accessory/bra/striped_bra + name = "Bra - Striped" + icon_state = "striped_bra" + +//Presets +/datum/sprite_accessory/bra/lizared + name = "LIZARED Top" + icon_state = "lizared_top" + use_static = TRUE + +/datum/sprite_accessory/bra/bra_kinky + name = "Bra - Lingerie" + icon_state = "bra_kinky" + use_static = TRUE + +/datum/sprite_accessory/bra/bra_commie + name = "Bra - Commie" + icon_state = "bra_commie" + use_static = TRUE + +/datum/sprite_accessory/bra/bra_freedom + name = "Bra - Freedom" + icon_state = "bra_assblastusa" + use_static = TRUE + +/datum/sprite_accessory/bra/bra_uk + name = "Bra - UK" + icon_state = "bra_uk" + use_static = TRUE + +/datum/sprite_accessory/bra/bra_beekini + name = "Bra - Bee-kini" + icon_state = "bra_bee-kini" + use_static = TRUE + +/datum/sprite_accessory/bra/cow + name = "Bra - Cow" + icon_state = "bra_cow" + use_static = TRUE + +/datum/sprite_accessory/bra/hi_vis_bra + name = "Safekini" + icon_state = "hi_vis_bra" + use_static = TRUE + +//Fishnets +/datum/sprite_accessory/bra/fishnet_sleeves + name = "Fishnet - Sleeved" + icon_state = "fishnet_sleeves" + use_static = TRUE + +/datum/sprite_accessory/bra/fishnet_base + name = "Fishnet - Sleeveless" + icon_state = "fishnet_body" + use_static = TRUE + +/datum/sprite_accessory/bra/fishnet_sleeves/alt + name = "Fishnet - Sleeved (Greyscale)" + icon_state = "fishnet_sleeves_alt" + use_static = FALSE + +/datum/sprite_accessory/bra/fishnet_base/alt + name = "Fishnet - Sleeveless (Greyscale)" + icon_state = "fishnet_body_alt" + use_static = FALSE + +/datum/sprite_accessory/bra/pasties + name = "Pasties" + icon_state = "pasties" + +/datum/sprite_accessory/bra/pasties_alt + name = "Pasties (Alt)" + icon_state = "pasties_alt" diff --git a/modular_doppler/modular_customization/accessories/code/underwear_accessories/socks.dm b/modular_doppler/modular_customization/accessories/code/underwear_accessories/socks.dm new file mode 100644 index 0000000000000..94a33bfbbc099 --- /dev/null +++ b/modular_doppler/modular_customization/accessories/code/underwear_accessories/socks.dm @@ -0,0 +1,161 @@ +/datum/sprite_accessory/socks + //All underwear goes in the same file for the sake of digi variants + icon = 'modular_doppler/modular_customization/accessories/icons/underwear/socks.dmi' + use_static = TRUE + +/datum/sprite_accessory/socks/socks_norm + name = "Normal (Greyscale)" + icon_state = "white_norm" + use_static = FALSE + +/datum/sprite_accessory/socks/stirrups_norm + name = "Normal Stirrups (Greyscale)" + icon_state = "socks_norm-stir" + use_static = FALSE + +/datum/sprite_accessory/socks/socks_short + name = "Short (Greyscale)" + icon_state = "white_short" + use_static = FALSE + +/datum/sprite_accessory/socks/socks_knee + name = "Knee-high (Greyscale)" + icon_state = "white_knee" + use_static = FALSE + +/datum/sprite_accessory/socks/stirrups_knee + name = "Knee-high Stirrups" + icon_state = "socks_knee-stir" + use_static = FALSE + +/datum/sprite_accessory/socks/striped_knee + name = "Knee-high - Striped" + icon_state = "striped_knee" + use_static = FALSE + +/datum/sprite_accessory/socks/thin_knee + name = "Knee-high - Thin" + icon_state = "thin_knee" + use_static = FALSE + +/datum/sprite_accessory/socks/socks_thigh + name = "Thigh-high (Greyscale)" + icon_state = "white_thigh" + use_static = FALSE + +/datum/sprite_accessory/socks/stirrups_thigh + name = "Thigh-high Stirrups (Greyscale)" + icon_state = "socks_thigh-stir" + use_static = FALSE + +/datum/sprite_accessory/socks/striped_thigh + name = "Thigh-high (Striped)" + icon_state = "striped_thigh" + use_static = FALSE + +/datum/sprite_accessory/socks/striped_thigh/stirrups + name = "Thigh-high (Striped Stirrups)" + icon_state = "striped_thigh-stir" + use_static = FALSE + +/datum/sprite_accessory/socks/leggings/stirrups/gym + name = "Thigh-high Stirrups (black with stripe)" + icon_state = "leggings-stir-black" + +/datum/sprite_accessory/socks/bee_thigh + name = "Thigh-high - Bee (Old)" + icon_state = "bee_thigh_old" + +/datum/sprite_accessory/socks/bee_knee + name = "Knee-high - Bee (Old)" + icon_state = "bee_knee_old" + +/datum/sprite_accessory/socks/christmas_norm + name = "Normal - Christmas" + icon_state = "christmas_norm" + +/datum/sprite_accessory/socks/candycaner_norm + name = "Normal - Red Candy Cane" + icon_state = "candycaner_norm" + +/datum/sprite_accessory/socks/candycaneg_norm + name = "Normal - Green Candy Cane" + icon_state = "candycaneg_norm" + +/datum/sprite_accessory/socks/christmas_knee + name = "Knee-High - Christmas" + icon_state = "christmas_knee" + +/datum/sprite_accessory/socks/candycaner_knee + name = "Knee-High - Red Candy Cane" + icon_state = "candycaner_knee" + +/datum/sprite_accessory/socks/candycaneg_knee + name = "Knee-High - Green Candy Cane" + icon_state = "candycaneg_knee" + +/datum/sprite_accessory/socks/christmas_thigh + name = "Thigh-high - Christmas" + icon_state = "christmas_thigh" + +/datum/sprite_accessory/socks/candycaner_thigh + name = "Thigh-high - Red Candy Cane" + icon_state = "candycaner_thigh" + +/datum/sprite_accessory/socks/candycaneg_thigh + name = "Thigh-high - Green Candy Cane" + icon_state = "candycaneg_thigh" + +/datum/sprite_accessory/socks/rainbow_thigh + name = "Thigh-high - Rainbow" + icon_state = "rainbow_thigh" + +/datum/sprite_accessory/socks/rainbow_knee + name = "Knee-high - Rainbow" + icon_state = "rainbow_knee" + +/datum/sprite_accessory/socks/rainbow_knee/stirrups + name = "Knee-high - Rainbow Stirrups" + icon_state = "rainbow_knee-stir" + +/datum/sprite_accessory/socks/rainbow_thigh/stirrups + name = "Thigh-high - Rainbow Stirrups" + icon_state = "rainbow_thigh-stir" + +/datum/sprite_accessory/socks/fishnet_thigh_sr //TG has one, but this one matches with several tops that I'll get whined to if I change soooo + name = "Thigh-high - Fishnet" + icon_state = "fishnet" + +/datum/sprite_accessory/socks/fishnet_thigh/alt + name = "Thigh-high - Fishnet (Greyscale)" + icon_state = "fishnet_alt" + use_static = FALSE + +/datum/sprite_accessory/socks/pantyhose/stirrups + name = "Pantyhose Stirrups" + icon_state = "pantyhose-stir" + use_static = FALSE + +/datum/sprite_accessory/socks/pantyhose_ripped + name = "Pantyhose - Ripped" + icon_state = "pantyhose_ripped" + use_static = FALSE + +/datum/sprite_accessory/socks/pantyhose_ripped/stirrups + name = "Pantyhose - Ripped Stirrups" + icon_state = "pantyhose_ripped-stir" + use_static = FALSE + +/datum/sprite_accessory/socks/stockings_ripped + name = "Stockings - Ripped" + icon_state = "stockings_ripped" + +/datum/sprite_accessory/socks/leggings + name = "Leggings" + icon_state = "leggings" + use_static = FALSE + +/datum/sprite_accessory/socks/leggings/stirrups + name = "Leggings - Stirrups" + icon_state = "leggings-stir" + use_static = FALSE diff --git a/modular_doppler/modular_customization/accessories/code/underwear_accessories/undershirts.dm b/modular_doppler/modular_customization/accessories/code/underwear_accessories/undershirts.dm new file mode 100644 index 0000000000000..dc4e5376eef87 --- /dev/null +++ b/modular_doppler/modular_customization/accessories/code/underwear_accessories/undershirts.dm @@ -0,0 +1,135 @@ +//Modular Undershirts +/datum/sprite_accessory/undershirt + icon = 'modular_doppler/modular_customization/accessories/icons/underwear/undershirt.dmi' + use_static = TRUE + ///Whether this underwear includes a bottom (For Leotards and the likes) + var/hides_groin = FALSE + +/* + Base recolorable shirts +*/ +/datum/sprite_accessory/undershirt/shirt + name = "Shirt" + icon_state = "shirt_white" //Reuses TG sprite until they set up GAGS for underwear + use_static = FALSE + +/datum/sprite_accessory/undershirt/shortsleeve + name = "Short-Sleeved Shirt" + icon_state = "whiteshortsleeve" //Reuses TG sprite until they set up GAGS for underwear + use_static = FALSE + +/datum/sprite_accessory/undershirt/tanktop + name = "Tank Top" + icon_state = "tank_white" //Reuses TG sprite until they set up GAGS for underwear + use_static = FALSE + +/datum/sprite_accessory/undershirt/longsleeve + name = "Long-Sleeved Shirt" + icon_state = "shirt_white_long" + use_static = FALSE + +/datum/sprite_accessory/undershirt/polo + name = "Polo Shirt" + icon_state = "polo" + use_static = FALSE + +/datum/sprite_accessory/undershirt/tanktop_midriff + name = "Tank Top - Midriff" + icon_state = "tank_midriff" + gender = FEMALE + use_static = FALSE + +/datum/sprite_accessory/undershirt/tanktop_midriff_alt + name = "Tank Top - Midriff Halterneck" + icon_state = "tank_midriff_alt" + gender = FEMALE + use_static = FALSE + +/datum/sprite_accessory/undershirt/offshoulder + name = "Shirt - Off-Shoulder" + icon_state = "one_arm" + gender = FEMALE + use_static = FALSE + +/datum/sprite_accessory/undershirt/buttondown + name = "Shirt - Buttondown" + icon_state = "buttondown" + gender = NEUTER + use_static = FALSE + +/datum/sprite_accessory/undershirt/buttondown/short_sleeve + name = "Shirt - Short Sleeved Buttondown" + icon_state = "buttondown_short" + +/datum/sprite_accessory/undershirt/leotard + name = "Shirt - Leotard" + icon_state = "leotard" + gender = FEMALE + use_static = FALSE + hides_groin = TRUE + +/datum/sprite_accessory/undershirt/turtleneck + name = "Sweater - Turtleneck" + icon_state = "turtleneck" + use_static = FALSE + gender = NEUTER + +/datum/sprite_accessory/undershirt/turtleneck/smooth + name = "Sweater - Smooth Turtleneck" + icon_state = "turtleneck_smooth" + +/datum/sprite_accessory/undershirt/turtleneck/sleeveless + name = "Sweater - Sleeveless Turtleneck" + icon_state = "turtleneck_sleeveless" + +/datum/sprite_accessory/undershirt/leotard/turtleneck + name = "Shirt - Turtleneck Leotard" + icon_state = "leotard_turtleneck" + +/datum/sprite_accessory/undershirt/leotard/turtleneck/sleeveless + name = "Shirt - Turtleneck Leotard Sleeveless" + icon_state = "leotard_turtleneck_sleeveless" + +//Presets +/datum/sprite_accessory/undershirt/bulletclub //4 life + name = "Shirt - Black Skull" + icon_state = "shirt_bc" + gender = NEUTER + +/datum/sprite_accessory/undershirt/bee_shirt + name = "Shirt - Bee" + icon_state = "bee_shirt" + +/datum/sprite_accessory/undershirt/striped + name = "Long-Sleeved Shirt - Black Stripes" + icon_state = "longstripe" + gender = NEUTER + +/datum/sprite_accessory/undershirt/striped/blue + name = "Long-Sleeved Shirt - Blue Stripes" + icon_state = "longstripe_blue" + +/datum/sprite_accessory/undershirt/tankstripe + name = "Tank Top - Striped" + icon_state = "tank_stripes" + +/datum/sprite_accessory/undershirt/tank_top_rainbow + name = "Tank Top - Rainbow" + icon_state = "tank_rainbow" + +/datum/sprite_accessory/undershirt/tank_top_sun + name = "Tank Top - Sun" + icon_state = "tank_sun" + +//Not really qualifying as shirts but having nowhere better to go, these get shoved to the bottom of the list +/datum/sprite_accessory/undershirt/corset + name = "Corset" + icon_state = "corset" + gender = FEMALE + hides_groin = TRUE //an undershirt-specific bit of code, so the corset has to be an undershirt... unless you want to refactor it + +/datum/sprite_accessory/undershirt/babydoll + name = "Babydoll" + icon_state = "babydoll" + gender = FEMALE + use_static = FALSE diff --git a/modular_doppler/modular_customization/accessories/code/underwear_accessories/underwear.dm b/modular_doppler/modular_customization/accessories/code/underwear_accessories/underwear.dm new file mode 100644 index 0000000000000..7d8fc4d7353e1 --- /dev/null +++ b/modular_doppler/modular_customization/accessories/code/underwear_accessories/underwear.dm @@ -0,0 +1,195 @@ +/datum/sprite_accessory/underwear + icon = 'modular_doppler/modular_customization/accessories/icons/underwear/underwear.dmi' + ///Whether the underwear uses a special sprite for digitigrade style (i.e. briefs, not panties). Adds a "_d" suffix to the icon state + var/has_digitigrade = FALSE + ///Whether this underwear includes a top (Because gender = FEMALE doesn't actually apply here.). Hides breasts, nothing more. + var/hides_breasts = FALSE + +/* + Adding has_digitigrade to TG stuff +*/ +/datum/sprite_accessory/underwear/male_briefs + has_digitigrade = TRUE + +/datum/sprite_accessory/underwear/male_boxers + has_digitigrade = TRUE + +/datum/sprite_accessory/underwear/male_stripe + has_digitigrade = TRUE + +/datum/sprite_accessory/underwear/male_midway + has_digitigrade = TRUE + +/datum/sprite_accessory/underwear/male_longjohns + has_digitigrade = TRUE + +/datum/sprite_accessory/underwear/male_hearts + has_digitigrade = TRUE + +/datum/sprite_accessory/underwear/male_commie + has_digitigrade = TRUE + +/datum/sprite_accessory/underwear/male_usastripe + has_digitigrade = TRUE + +/datum/sprite_accessory/underwear/male_uk + has_digitigrade = TRUE + +/* + Modular Underwear past here +*/ + +//Briefs +/datum/sprite_accessory/underwear/male_bee + name = "Boxers - Bee" + icon_state = "bee_shorts" + has_digitigrade = TRUE + gender = MALE + use_static = TRUE + +/datum/sprite_accessory/underwear/boyshorts + name = "Boyshorts" + icon_state = "boyshorts" + has_digitigrade = TRUE + gender = FEMALE + +/datum/sprite_accessory/underwear/boyshorts_alt + name = "Boyshorts (Alt)" + icon_state = "boyshorts_alt" + gender = FEMALE + +//Panties +/datum/sprite_accessory/underwear/panties_basic + name = "Panties" + icon_state = "panties" + gender = FEMALE + +/datum/sprite_accessory/underwear/panties_slim + name = "Panties - Slim" + icon_state = "panties_slim" + gender = FEMALE + +/datum/sprite_accessory/underwear/panties_thin + name = "Panties - Thin" + icon_state = "panties_thin" + gender = FEMALE + +/datum/sprite_accessory/underwear/thong + name = "Thong" + icon_state = "thong" + gender = FEMALE + +/datum/sprite_accessory/underwear/thong_babydoll + name = "Thong (Alt)" + icon_state = "thong_babydoll" + gender = FEMALE + +/datum/sprite_accessory/underwear/panties_swimsuit + name = "Panties - Swimsuit" + icon_state = "panties_swimming" + gender = FEMALE + +/datum/sprite_accessory/underwear/panties_neko + name = "Panties - Neko" + icon_state = "panties_neko" + gender = FEMALE + +/datum/sprite_accessory/underwear/striped_panties + name = "Panties - Striped" + icon_state = "striped_panties" + gender = FEMALE + +/datum/sprite_accessory/underwear/loincloth + name = "Loincloth" + icon_state = "loincloth" + +/datum/sprite_accessory/underwear/loincloth_alt + name = "Shorter Loincloth" + icon_state = "loincloth_alt" + +//Presets +/datum/sprite_accessory/underwear/lizared + name = "LIZARED Underwear" + icon_state = "lizared" + use_static = TRUE + +/datum/sprite_accessory/underwear/female_kinky + name = "Panties - Lingerie" + icon_state = "panties_kinky" + gender = FEMALE + use_static = TRUE + +/datum/sprite_accessory/underwear/female_commie + name = "Panties - Commie" + icon_state = "panties_commie" + gender = FEMALE + use_static = TRUE + +/datum/sprite_accessory/underwear/female_usastripe + name = "Panties - Freedom" + icon_state = "panties_assblastusa" + gender = FEMALE + use_static = TRUE + +/datum/sprite_accessory/underwear/panties_uk + name = "Panties - UK" + icon_state = "panties_uk" + gender = FEMALE + use_static = TRUE + +/datum/sprite_accessory/underwear/female_beekini + name = "Panties - Bee-kini" + icon_state = "panties_bee-kini" + gender = FEMALE + use_static = TRUE + +/datum/sprite_accessory/underwear/cow + name = "Panties - Cow" + icon_state = "panties_cow" + gender = FEMALE + use_static = TRUE + +//Full-Body Underwear, i.e. swimsuits (Including re-enabling 3 from TG) +//These likely require hides_breasts = TRUE +/datum/sprite_accessory/underwear/swimsuit_onepiece //TG + name = "One-Piece Swimsuit" + icon_state = "swim_onepiece" + gender = FEMALE + hides_breasts = TRUE + +/datum/sprite_accessory/underwear/swimsuit_strapless_onepiece //TG + name = "Strapless One-Piece Swimsuit" + icon_state = "swim_strapless_onepiece" + gender = FEMALE + hides_breasts = TRUE + +/datum/sprite_accessory/underwear/swimsuit_stripe //TG + name = "Strapless Striped Swimsuit" + icon_state = "swim_stripe" + gender = FEMALE + hides_breasts = TRUE + +/datum/sprite_accessory/underwear/swimsuit_red + name = "One-Piece Swimsuit - Red" + icon_state = "swimming_red" + gender = FEMALE + use_static = TRUE + hides_breasts = TRUE + +/datum/sprite_accessory/underwear/swimsuit + name = "One-Piece Swimsuit - Black" + icon_state = "swimming_black" + gender = FEMALE + use_static = TRUE + hides_breasts = TRUE + +//Fishnets +/datum/sprite_accessory/underwear/fishnet_lower + name = "Panties - Fishnet" + icon_state = "fishnet_lower" + gender = FEMALE + use_static = TRUE + +/datum/sprite_accessory/underwear/fishnet_lower/alt + name = "Panties - Fishnet (Greyscale)" + icon_state = "fishnet_lower_alt" diff --git a/modular_doppler/modular_customization/accessories/code/~overrides/code/overrides.dm b/modular_doppler/modular_customization/accessories/code/~overrides/code/overrides.dm index 2576ff1ecc555..85ca189962c5e 100644 --- a/modular_doppler/modular_customization/accessories/code/~overrides/code/overrides.dm +++ b/modular_doppler/modular_customization/accessories/code/~overrides/code/overrides.dm @@ -30,3 +30,24 @@ if(species.id != /datum/species/human/felinid::id) features["tail_cat"] = /datum/sprite_accessory/tails/human/none::name update_dna_identity() + +/mob/living/carbon/human + /// Color of the undershirt + var/undershirt_color = "#FFFFFF" + /// Color of the socks + var/socks_color = "#FFFFFF" + /// The selected bra. + var/bra = "Nude" + /// Color of the bra. + var/bra_color = "#FFFFFF" + /// Flags for showing/hiding underwear, toggleabley by a verb + var/underwear_visibility = NONE + +///copies over clothing preferences like underwear to another human +/mob/living/carbon/human/copy_clothing_prefs(mob/living/carbon/human/destination) + . = ..() + + destination.undershirt_color = undershirt_color + destination.socks_color = socks_color + destination.bra = bra + destination.bra_color = bra_color diff --git a/modular_doppler/modular_customization/accessories/icons/underwear/bra.dmi b/modular_doppler/modular_customization/accessories/icons/underwear/bra.dmi new file mode 100644 index 0000000000000..1048a0a231b0b Binary files /dev/null and b/modular_doppler/modular_customization/accessories/icons/underwear/bra.dmi differ diff --git a/modular_doppler/modular_customization/accessories/icons/underwear/socks.dmi b/modular_doppler/modular_customization/accessories/icons/underwear/socks.dmi new file mode 100644 index 0000000000000..6785177ee3095 Binary files /dev/null and b/modular_doppler/modular_customization/accessories/icons/underwear/socks.dmi differ diff --git a/modular_doppler/modular_customization/accessories/icons/underwear/undershirt.dmi b/modular_doppler/modular_customization/accessories/icons/underwear/undershirt.dmi new file mode 100644 index 0000000000000..9964bb3a28471 Binary files /dev/null and b/modular_doppler/modular_customization/accessories/icons/underwear/undershirt.dmi differ diff --git a/modular_doppler/modular_customization/accessories/icons/underwear/underwear.dmi b/modular_doppler/modular_customization/accessories/icons/underwear/underwear.dmi new file mode 100644 index 0000000000000..719481e2da4ff Binary files /dev/null and b/modular_doppler/modular_customization/accessories/icons/underwear/underwear.dmi differ diff --git a/modular_doppler/modular_customization/preferences/underwear.dm b/modular_doppler/modular_customization/preferences/underwear.dm new file mode 100644 index 0000000000000..42bfb095711b2 --- /dev/null +++ b/modular_doppler/modular_customization/preferences/underwear.dm @@ -0,0 +1,106 @@ +/// SSAccessories setup +/datum/controller/subsystem/accessories + var/list/bra_list + var/list/bra_m + var/list/bra_f + +/datum/controller/subsystem/accessories/setup_lists() + . = ..() + var/bra_lists = init_sprite_accessory_subtypes(/datum/sprite_accessory/bra) + bra_list = bra_lists["default_sprites"] + bra_m = bra_lists["male_sprites"] + bra_f = bra_lists["female_sprites"] + +/datum/outfit + /// Underwear and bras are separated + var/datum/sprite_accessory/bra = null + +/datum/preference/choiced/socks/compile_constant_data() + var/list/data = ..() + + data[SUPPLEMENTAL_FEATURE_KEY] = "socks_color" + + return data + +/datum/preference/choiced/socks/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) + +/datum/preference/choiced/undershirt/compile_constant_data() + var/list/data = ..() + + data[SUPPLEMENTAL_FEATURE_KEY] = "undershirt_color" + + return data + +/datum/preference/choiced/undershirt/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) + +/datum/preference/choiced/underwear/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) + +/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(SSaccessories.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 = SSaccessories.bra_list[value] + icon_with_bra.Blend(icon(accessory.icon, accessory.icon_state), ICON_OVERLAY) + + icon_with_bra.Crop(10, 11, 22, 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) + +/datum/preference/choiced/bra/create_informed_default_value(datum/preferences/preferences) + if(preferences.read_preference(/datum/preference/choiced/gender) == FEMALE) + return /datum/sprite_accessory/bra/sports_bra::name + return /datum/sprite_accessory/bra/nude::name diff --git a/modular_doppler/modular_customization/preferences/underwear_color.dm b/modular_doppler/modular_customization/preferences/underwear_color.dm new file mode 100644 index 0000000000000..9e66b0459a851 --- /dev/null +++ b/modular_doppler/modular_customization/preferences/underwear_color.dm @@ -0,0 +1,47 @@ +/datum/preference/color/undershirt_color + savefile_key = "undershirt_color" + savefile_identifier = PREFERENCE_CHARACTER + category = PREFERENCE_CATEGORY_SUPPLEMENTAL_FEATURES + +/datum/preference/color/undershirt_color/apply_to_human(mob/living/carbon/human/target, value) + target.undershirt_color = value + +/datum/preference/color/undershirt_color/is_accessible(datum/preferences/preferences) + if (!..(preferences)) + return FALSE + + var/species_type = preferences.read_preference(/datum/preference/choiced/species) + var/datum/species/species = GLOB.species_prototypes[species_type] + return !(TRAIT_NO_UNDERWEAR in species.inherent_traits) + +/datum/preference/color/socks_color + savefile_key = "socks_color" + savefile_identifier = PREFERENCE_CHARACTER + category = PREFERENCE_CATEGORY_SUPPLEMENTAL_FEATURES + +/datum/preference/color/socks_color/apply_to_human(mob/living/carbon/human/target, value) + target.socks_color = value + +/datum/preference/color/socks_color/is_accessible(datum/preferences/preferences) + if (!..(preferences)) + return FALSE + + var/species_type = preferences.read_preference(/datum/preference/choiced/species) + var/datum/species/species = GLOB.species_prototypes[species_type] + return !(TRAIT_NO_UNDERWEAR in species.inherent_traits) + +/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 = GLOB.species_prototypes[species_type] + return !(TRAIT_NO_UNDERWEAR in species.inherent_traits) diff --git a/modular_doppler/modular_customization/verbs/human.dm b/modular_doppler/modular_customization/verbs/human.dm new file mode 100644 index 0000000000000..a8392fdf7d8ab --- /dev/null +++ b/modular_doppler/modular_customization/verbs/human.dm @@ -0,0 +1,44 @@ +/mob/living/carbon/human/verb/toggle_undies() + set category = "IC" + set name = "Toggle underwear visibility" + set desc = "Allows you to toggle which underwear should show or be hidden. Underwear will obscure genitals." + + if(stat != CONSCIOUS) + to_chat(usr, span_warning("You can't toggle underwear visibility right now...")) + return + + 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/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") + + if(underwear_visibility != NONE) + choice_list += list("Show all" = "show") + + if(underwear_visibility != UNDERWEAR_HIDE_ALL) + choice_list += list("Hide all" = "hide") + + var/picked_visibility = tgui_input_list(src, "Choose visibility setting", "Show/Hide underwear", choice_list) + + if(!picked_visibility) + return + + var/picked_choice = choice_list[picked_visibility] + + switch(picked_choice) + if("underwear") + underwear_visibility ^= UNDERWEAR_HIDE_UNDIES + if("bra") + underwear_visibility ^= UNDERWEAR_HIDE_BRA + if("shirt") + underwear_visibility ^= UNDERWEAR_HIDE_SHIRT + if("socks") + underwear_visibility ^= UNDERWEAR_HIDE_SOCKS + if("show") + underwear_visibility = NONE + if("hide") + underwear_visibility = UNDERWEAR_HIDE_ALL + + update_body() diff --git a/modular_doppler/objects_and_structures/code/mannequin.dm b/modular_doppler/objects_and_structures/code/mannequin.dm new file mode 100644 index 0000000000000..9604fb7ac5f7b --- /dev/null +++ b/modular_doppler/objects_and_structures/code/mannequin.dm @@ -0,0 +1,3 @@ +/obj/structure/mannequin + /// String for the bra we use. + var/bra_name diff --git a/tgstation.dme b/tgstation.dme index b76ac2e0b08a3..ebe0449eb715d 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -554,6 +554,7 @@ #include "code\__HELPERS\~doppler_helpers\chat.dm" #include "code\__HELPERS\~doppler_helpers\global_lists.dm" #include "code\__HELPERS\~doppler_helpers\logging.dm" +#include "code\__HELPERS\~doppler_helpers\mobs.dm" #include "code\__HELPERS\~doppler_helpers\verbs.dm" #include "code\_globalvars\_regexes.dm" #include "code\_globalvars\admin.dm" @@ -6638,6 +6639,7 @@ #include "modular_doppler\loadout_categories\categories\shoes.dm" #include "modular_doppler\loadout_categories\categories\toys.dm" #include "modular_doppler\loadout_categories\categories\undersuit.dm" +#include "modular_doppler\modular_antagonists\changeling\changeling.dm" #include "modular_doppler\modular_antagonists\datums\antag_recipes.dm" #include "modular_doppler\modular_antagonists\sapper_gang\sapper.dm" #include "modular_doppler\modular_antagonists\sapper_gang\sapper_event.dm" @@ -6739,6 +6741,10 @@ #include "modular_doppler\modular_customization\accessories\code\slugcat_accessories\slugcat_tail.dm" #include "modular_doppler\modular_customization\accessories\code\synthetic_accessories\synth_ears.dm" #include "modular_doppler\modular_customization\accessories\code\synthetic_accessories\synth_tail.dm" +#include "modular_doppler\modular_customization\accessories\code\underwear_accessories\bras.dm" +#include "modular_doppler\modular_customization\accessories\code\underwear_accessories\socks.dm" +#include "modular_doppler\modular_customization\accessories\code\underwear_accessories\undershirts.dm" +#include "modular_doppler\modular_customization\accessories\code\underwear_accessories\underwear.dm" #include "modular_doppler\modular_customization\accessories\code\~overrides\code\overrides.dm" #include "modular_doppler\modular_customization\bodypart\bodypart_overrides.dm" #include "modular_doppler\modular_customization\organs\_organs.dm" @@ -6758,6 +6764,8 @@ #include "modular_doppler\modular_customization\preferences\snout.dm" #include "modular_doppler\modular_customization\preferences\species_traits.dm" #include "modular_doppler\modular_customization\preferences\tail.dm" +#include "modular_doppler\modular_customization\preferences\underwear.dm" +#include "modular_doppler\modular_customization\preferences\underwear_color.dm" #include "modular_doppler\modular_customization\preferences\wings.dm" #include "modular_doppler\modular_customization\tri_color\antennae.dm" #include "modular_doppler\modular_customization\tri_color\body_marking_lizard.dm" @@ -6773,6 +6781,7 @@ #include "modular_doppler\modular_customization\tri_color\tri_color_prefs.dm" #include "modular_doppler\modular_customization\tri_color\tri_color_prefs_bespoke.dm" #include "modular_doppler\modular_customization\tri_color\wings.dm" +#include "modular_doppler\modular_customization\verbs\human.dm" #include "modular_doppler\modular_food_drinks_and_chems\chemistry_reagents.dm" #include "modular_doppler\modular_food_drinks_and_chems\food_and_drinks\alcohol_reagents.dm" #include "modular_doppler\modular_food_drinks_and_chems\food_and_drinks\drink_reagents.dm" @@ -6874,6 +6883,7 @@ #include "modular_doppler\modular_weapons\manufacturer_examine\code\manufacturer_element.dm" #include "modular_doppler\obj_flags_doppler\code\objs.dm" #include "modular_doppler\objects_and_structures\code\icemoon_tiles.dm" +#include "modular_doppler\objects_and_structures\code\mannequin.dm" #include "modular_doppler\objects_and_structures\code\sauna_oven.dm" #include "modular_doppler\objects_and_structures\code\structure.dm" #include "modular_doppler\objects_and_structures\code\towel_bins.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 6d36760ee68e7..94b10bacb469e 100644 --- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/species_features.tsx +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/species_features.tsx @@ -114,6 +114,23 @@ export const underwear_color: Feature = { component: FeatureColorInput, }; +// DOPPLER ADDITION START +export const bra_color: Feature = { + name: 'Bra color', + component: FeatureColorInput, +}; + +export const undershirt_color: Feature = { + name: 'Undershirt color', + component: FeatureColorInput, +}; + +export const socks_color: Feature = { + name: 'Socks color', + component: FeatureColorInput, +}; +// DOPPLER ADDITION END + export const feature_vampire_status: Feature = { name: 'Vampire status', component: FeatureDropdownInput,