From 3687361ba5917ffbcfb3480aa2bfbab1dc9cc564 Mon Sep 17 00:00:00 2001 From: BlueWildrose <57083662+BlueWildrose@users.noreply.github.com> Date: Wed, 30 Mar 2022 20:06:00 -0700 Subject: [PATCH] Butts, nuts, n' tats. (please testmerge or merge & deploy before Halloween ball) (#15304) * Butts * testicle fix + hidden is back * updated booba * prob bad idea actually thinking about icon states * fuck * this should be everything now * SandPoot's suggestion Co-authored-by: SandPoot <43283559+SandPoot@users.noreply.github.com> * tguify that last option * Revert "tguify that last option" This reverts commit f9d7a075e997e3d9c0a4f641db43343796cecb98. * Revert "Merge branch 'master' into cursingcitadel" This reverts commit 2998b1908a74b381857056f5ce6b34894d950c06, reversing changes made to 6fc65a28fa4f6012c70675b4cbc0299d7740912a. * Revert "Revert "Merge branch 'master' into cursingcitadel"" This reverts commit c4a2ad1a630b6376801df3e1cec88aad3d2935ea. Co-authored-by: SandPoot <43283559+SandPoot@users.noreply.github.com> Co-authored-by: Putnam3145 --- code/__DEFINES/DNA.dm | 1 + code/__DEFINES/citadel_defines.dm | 16 ++- code/__HELPERS/_cit_helpers.dm | 8 ++ code/__HELPERS/global_lists.dm | 1 + code/__HELPERS/mobs.dm | 8 ++ .../configuration/entries/fetish_content.dm | 10 ++ code/game/machinery/limbgrower.dm | 6 ++ code/game/objects/items/storage/firstaid.dm | 11 +++ code/modules/arousal/genitals.dm | 18 +++- .../arousal/genitals_sprite_accessories.dm | 16 +++ code/modules/arousal/organs/butt.dm | 92 ++++++++++++++++++ code/modules/client/preferences.dm | 51 +++++++++- code/modules/client/preferences_savefile.dm | 21 +++- .../human/innate_abilities/customization.dm | 14 ++- .../reagents/reagent_containers/hypovial.dm | 5 + .../reagents/reagent_containers/pill.dm | 4 + .../research/designs/limbgrower_designs.dm | 10 ++ code/modules/vending/kinkmate.dm | 1 + config/entries/fetish_content.txt | 4 + icons/obj/genitals/breasts_onmob.dmi | Bin 19045 -> 6353 bytes icons/obj/genitals/butt.dmi | Bin 0 -> 828 bytes icons/obj/genitals/butt_onmob.dmi | Bin 0 -> 2062 bytes icons/obj/genitals/testicles_onmob.dmi | Bin 561 -> 778 bytes .../chemistry/reagents/enlargement.dm | 88 ++++++++++++++++- tgstation.dme | 1 + 25 files changed, 375 insertions(+), 11 deletions(-) create mode 100644 code/modules/arousal/organs/butt.dm create mode 100644 icons/obj/genitals/butt.dmi create mode 100644 icons/obj/genitals/butt_onmob.dmi diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index a5b5cf6dc0..5695995713 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -179,6 +179,7 @@ #define ORGAN_SLOT_VAGINA "vagina" #define ORGAN_SLOT_TESTICLES "testicles" #define ORGAN_SLOT_BREASTS "breasts" +#define ORGAN_SLOT_BUTT "butt" ////organ defines #define STANDARD_ORGAN_THRESHOLD 100 diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm index 04eeb515c9..fa11db38aa 100644 --- a/code/__DEFINES/citadel_defines.dm +++ b/code/__DEFINES/citadel_defines.dm @@ -6,12 +6,13 @@ #define CIT_FILTER_STAMINACRIT filter(type="drop_shadow", x=0, y=0, size=-3, color="#04080F") //organ defines -#define VAGINA_LAYER_INDEX 1 -#define TESTICLES_LAYER_INDEX 2 -#define GENITAL_LAYER_INDEX 3 -#define PENIS_LAYER_INDEX 4 +#define BUTT_LAYER_INDEX 1 +#define VAGINA_LAYER_INDEX 2 +#define TESTICLES_LAYER_INDEX 3 +#define GENITAL_LAYER_INDEX 4 +#define PENIS_LAYER_INDEX 5 -#define GENITAL_LAYER_INDEX_LENGTH 4 //keep it updated with each new index added, thanks. +#define GENITAL_LAYER_INDEX_LENGTH 5 //keep it updated with each new index added, thanks. //genital flags #define GENITAL_BLACKLISTED (1<<0) //for genitals that shouldn't be added to GLOB.genitals_list. @@ -62,6 +63,9 @@ #define MILK_RATE_MULT 1 #define MILK_EFFICIENCY 1 +#define BUTT_SIZE_DEF 1 +#define BUTT_SIZE_MAX 5 //butt genitals are special in that they have caps. if there's the event there's even bigger butt sprites, raise this number. + //visibility toggles defines to avoid errors typos code errors. #define GEN_VISIBLE_ALWAYS "Always visible" #define GEN_VISIBLE_NO_CLOTHES "Hidden by clothes" @@ -102,6 +106,8 @@ #define GENITAL_EXAMINE (1<<13) #define VORE_EXAMINE (1<<14) #define TRASH_FORCEFEED (1<<15) +#define BUTT_ENLARGEMENT (1<<16) +//Note: reminder, if you're a coder adding more bitflags here in the event we add more horny things, the maximum is (1<<23). #define TOGGLES_CITADEL 0 //belly sound pref things diff --git a/code/__HELPERS/_cit_helpers.dm b/code/__HELPERS/_cit_helpers.dm index a5ffda36f9..c4a7b051de 100644 --- a/code/__HELPERS/_cit_helpers.dm +++ b/code/__HELPERS/_cit_helpers.dm @@ -56,6 +56,7 @@ GLOBAL_LIST_EMPTY(ipc_antennas_list) GLOBAL_LIST_EMPTY(genitals_list) GLOBAL_LIST_EMPTY(cock_shapes_list) GLOBAL_LIST_EMPTY(balls_shapes_list) +GLOBAL_LIST_EMPTY(butt_shapes_list) GLOBAL_LIST_EMPTY(breasts_shapes_list) GLOBAL_LIST_EMPTY(vagina_shapes_list) //longcat memes. @@ -124,6 +125,11 @@ GLOBAL_VAR_INIT(miscreants_allowed, FALSE) return TRUE return FALSE +/mob/living/carbon/proc/has_butt() + if(getorganslot(ORGAN_SLOT_BUTT)) + return TRUE + return FALSE + /mob/living/carbon/proc/is_groin_exposed(list/L) if(!L) L = get_equipped_items() @@ -157,7 +163,9 @@ GLOBAL_VAR_INIT(miscreants_allowed, FALSE) if(H.gender == MALE) H.give_genital(/obj/item/organ/genital/penis) H.give_genital(/obj/item/organ/genital/testicles) + H.give_genital(/obj/item/organ/genital/butt) else H.give_genital(/obj/item/organ/genital/vagina) H.give_genital(/obj/item/organ/genital/womb) H.give_genital(/obj/item/organ/genital/breasts) + H.give_genital(/obj/item/organ/genital/butt) diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 56e1976990..3e5658fa00 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -55,6 +55,7 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/penis, GLOB.cock_shapes_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/vagina, GLOB.vagina_shapes_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/breasts, GLOB.breasts_shapes_list) + init_sprite_accessory_subtypes(/datum/sprite_accessory/butt, GLOB.butt_shapes_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/testicles, GLOB.balls_shapes_list) for(var/gpath in subtypesof(/obj/item/organ/genital)) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 178fa5b8a4..d113b8b789 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -90,6 +90,8 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/vagina, GLOB.vagina_shapes_list) if(!GLOB.breasts_shapes_list.len) init_sprite_accessory_subtypes(/datum/sprite_accessory/breasts, GLOB.breasts_shapes_list) + if(!GLOB.butt_shapes_list.len) + init_sprite_accessory_subtypes(/datum/sprite_accessory/butt, GLOB.butt_shapes_list) if(!GLOB.ipc_screens_list.len) init_sprite_accessory_subtypes(/datum/sprite_accessory/screen, GLOB.ipc_screens_list) if(!GLOB.ipc_antennas_list.len) @@ -206,10 +208,16 @@ "vag_shape" = pick(GLOB.vagina_shapes_list), "vag_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), "has_womb" = FALSE, + "has_butt" = FALSE, + "butt_size" = BUTT_SIZE_DEF, + "butt_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), + + "balls_visibility" = GEN_VISIBLE_NO_UNDIES, "breasts_visibility"= GEN_VISIBLE_NO_UNDIES, "cock_visibility" = GEN_VISIBLE_NO_UNDIES, "vag_visibility" = GEN_VISIBLE_NO_UNDIES, + "butt_visibility" = GEN_VISIBLE_NO_UNDIES, "ipc_screen" = snowflake_ipc_antenna_list ? pick(snowflake_ipc_antenna_list) : "None", "ipc_antenna" = "None", "flavor_text" = "", diff --git a/code/controllers/configuration/entries/fetish_content.dm b/code/controllers/configuration/entries/fetish_content.dm index 1de796a11d..b7ae2e0d83 100644 --- a/code/controllers/configuration/entries/fetish_content.dm +++ b/code/controllers/configuration/entries/fetish_content.dm @@ -11,6 +11,16 @@ config_entry_value = 20 min_val = 0 +/datum/config_entry/number/butt_min_size_prefs + config_entry_value = 1 + min_val = 0 + max_val = BUTT_SIZE_MAX + +/datum/config_entry/number/butt_max_size_prefs + config_entry_value = BUTT_SIZE_MAX + min_val = 0 + max_val = BUTT_SIZE_MAX + /datum/config_entry/keyed_list/safe_visibility_toggles key_mode = KEY_MODE_TEXT value_mode = VALUE_MODE_FLAG diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm index ad286a52a7..2950bf5a9a 100644 --- a/code/game/machinery/limbgrower.dm +++ b/code/game/machinery/limbgrower.dm @@ -335,6 +335,12 @@ if(!features["breasts_producing"]) boobs.genital_flags &= ~(GENITAL_FUID_PRODUCTION|CAN_CLIMAX_WITH|CAN_MASTURBATE_WITH) boobs.update() + if(/obj/item/organ/genital/butt) + var/obj/item/organ/genital/butt/ass = new(loc) + if(features["has_butt"]) + ass.color = sanitize_hexcolor(features["butt_color"], 6, TRUE) + ass.size = features["butt_size"] + ass.update() else new built_typepath(loc) else diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm index 6c3185b312..e700bf87e0 100644 --- a/code/game/objects/items/storage/firstaid.dm +++ b/code/game/objects/items/storage/firstaid.dm @@ -405,6 +405,14 @@ for(var/i in 1 to 10) new /obj/item/reagent_containers/pill/breast_enlargement(src) +/obj/item/storage/pill_bottle/butt_enlargement + name = "butt enlargement pills" + desc = "May alert security when sneaking around if enough pills are consumed due to assclapping. Be dummy thick responsibly." + +/obj/item/storage/pill_bottle/butt_enlargement/PopulateContents() + for(var/i in 1 to 10) + new /obj/item/reagent_containers/pill/butt_enlargement(src) + /obj/item/storage/pill_bottle/neurine name = "bottle of neurine pills" desc = "Contains pills to treat non-severe mental traumas." @@ -551,6 +559,9 @@ new /obj/item/reagent_containers/glass/bottle/vial/small/penisreduction(src) new /obj/item/reagent_containers/glass/bottle/vial/small/penisreduction(src) new /obj/item/reagent_containers/glass/bottle/vial/small/penisreduction(src) + new /obj/item/reagent_containers/glass/bottle/vial/small/buttreduction(src) + new /obj/item/reagent_containers/glass/bottle/vial/small/buttreduction(src) + new /obj/item/reagent_containers/glass/bottle/vial/small/buttreduction(src) /obj/item/storage/hypospraykit/brute name = "brute trauma hypospray kit" diff --git a/code/modules/arousal/genitals.dm b/code/modules/arousal/genitals.dm index b7e90e5b84..f4ecafa690 100644 --- a/code/modules/arousal/genitals.dm +++ b/code/modules/arousal/genitals.dm @@ -228,6 +228,8 @@ give_genital(/obj/item/organ/genital/breasts) if(dna.features["has_cock"]) give_genital(/obj/item/organ/genital/penis) + if(dna.features["has_butt"]) + give_genital(/obj/item/organ/genital/butt) /mob/living/carbon/human/proc/give_genital(obj/item/organ/genital/G) if(!dna || (NOGENITALS in dna.species.species_traits) || getorganslot(initial(G.slot))) @@ -285,6 +287,8 @@ S = GLOB.vagina_shapes_list[G.shape] if(/obj/item/organ/genital/breasts) S = GLOB.breasts_shapes_list[G.shape] + if(/obj/item/organ/genital/butt) + S = GLOB.butt_shapes_list[G.shape] if(!S || S.icon_state == "none") continue @@ -317,6 +321,8 @@ genital_overlay.color = "#[dna.features["breasts_color"]]" if("vag_color") genital_overlay.color = "#[dna.features["vag_color"]]" + if("butt_color") + genital_overlay.color = "#[dna.features["butt_color"]]" genital_overlay.icon_state = "[G.slot]_[S.icon_state]_[size][(dna.species.use_skintones && !dna.skin_tone_override) ? "_s" : ""]_[aroused_state]_[layertext]" @@ -346,20 +352,30 @@ var/organCheck = locate(/obj/item/organ/genital) in internal_organs var/breastCheck = getorganslot(ORGAN_SLOT_BREASTS) var/willyCheck = getorganslot(ORGAN_SLOT_PENIS) + var/buttCheck = getorganslot(ORGAN_SLOT_BUTT) + var/ballCheck = getorganslot(ORGAN_SLOT_TESTICLES) if(organCheck == FALSE) if(ishuman(src) && dna.species.use_skintones) dna.features["genitals_use_skintone"] = TRUE - if(src.dna.species.fixed_mut_color) + if(dna.species.fixed_mut_color) dna.features["cock_color"] = "[dna.species.fixed_mut_color]" dna.features["breasts_color"] = "[dna.species.fixed_mut_color]" + dna.features["butt_color"] = "[dna.species.fixed_mut_color]" + dna.features["testicles_color"] = "[dna.species.fixed_mut_color]" return //So people who haven't set stuff up don't get rainbow surprises. dna.features["cock_color"] = "[dna.features["mcolor"]]" dna.features["breasts_color"] = "[dna.features["mcolor"]]" + dna.features["butt_color"] = "[dna.features["mcolor"]]" + dna.features["testicles_color"] = "[dna.features["mcolor"]]" else //If there's a new organ, make it the same colour. if(breastCheck == FALSE) dna.features["breasts_color"] = dna.features["cock_color"] else if (willyCheck == FALSE) dna.features["cock_color"] = dna.features["breasts_color"] + else if (buttCheck == FALSE) + dna.features["butt_color"] = dna.features["butt_color"] + else if (ballCheck == FALSE) + dna.features["testicles_color"] = dna.features["testicles_color"] return TRUE diff --git a/code/modules/arousal/genitals_sprite_accessories.dm b/code/modules/arousal/genitals_sprite_accessories.dm index 1140a1d3ec..65c71edb30 100644 --- a/code/modules/arousal/genitals_sprite_accessories.dm +++ b/code/modules/arousal/genitals_sprite_accessories.dm @@ -64,6 +64,10 @@ icon_state = "single" name = "Single" //Single as "single pair", for clarity. +/datum/sprite_accessory/testicles/hidden + icon_state = "hidden" + name = "Hidden" //not sure why these were missing, but I'm pretty certain people might want these. + //Vaginas /datum/sprite_accessory/vagina icon = 'icons/obj/genitals/vagina_onmob.dmi' @@ -119,3 +123,15 @@ /datum/sprite_accessory/breasts/sextuple icon_state = "sextuple" name = "Sextuple" + +//BUTT BE HERE +/datum/sprite_accessory/butt + icon = 'icons/obj/genitals/butt_onmob.dmi' + icon_state = "butt" + name = "butt" + color_src = "butt_color" + +//there literally shouldn't be any other ass types besides one because that'd be weird, this is just here to keep things consistent for the genital system. +/datum/sprite_accessory/butt/pair + icon_state = "pair" + name = "Pair" diff --git a/code/modules/arousal/organs/butt.dm b/code/modules/arousal/organs/butt.dm new file mode 100644 index 0000000000..172b87f748 --- /dev/null +++ b/code/modules/arousal/organs/butt.dm @@ -0,0 +1,92 @@ +/obj/item/organ/genital/butt + name = "butt" + desc = "You see a pair of asscheeks." + icon_state = "butt" + icon = 'icons/obj/genitals/butt.dmi' + zone = BODY_ZONE_PRECISE_GROIN + slot = ORGAN_SLOT_BUTT + w_class = 3 + size = 0 + var/size_name = "nonexistent" + shape = "Pair" //turn this into a default constant if for some inexplicable reason we get more than one butt type but I doubt it. + genital_flags = UPDATE_OWNER_APPEARANCE|GENITAL_UNDIES_HIDDEN + masturbation_verb = "massage" + var/size_cached = 0 + var/prev_size //former size value, to allow update_size() to early return should be there no significant changes. + layer_index = BUTT_LAYER_INDEX + +/obj/item/organ/genital/butt/on_life() + if(QDELETED(src)) + return + if(!owner) + return + +/obj/item/organ/genital/butt/modify_size(modifier, min = -INFINITY, max = BUTT_SIZE_MAX) + var/new_value = clamp(size_cached + modifier, min, max) + if(new_value == size_cached) + return + prev_size = size_cached + size_cached = new_value + size = round(size_cached) + update() + ..() + +/obj/item/organ/genital/butt/update_size()//wah + var/rounded_size = round(size) + if(size < 0)//I don't actually know what round() does to negative numbers, so to be safe!!fixed + if(owner) + to_chat(owner, "You feel your asscheeks shrink down to an ordinary size.") + QDEL_IN(src, 1) + return + + if(owner) //Because byond doesn't count from 0, I have to do this. + var/mob/living/carbon/human/H = owner + var/r_prev_size = round(prev_size) + if (rounded_size > r_prev_size) + to_chat(H, "Your buttcheeks [pick("swell up to", "flourish into", "expand into", "plump up into", "grow eagerly into", "amplify into")] a larger pair.") + else if (rounded_size < r_prev_size) + to_chat(H, "Your buttcheeks [pick("shrink down to", "decrease into", "wobble down into", "diminish into", "deflate into", "contracts into")] a smaller pair.") + + +/obj/item/organ/genital/butt/update_appearance() + var/lowershape = lowertext(shape) + + //Reflect the size of dat ass on examine. + switch(round(size)) + if(1) + size_name = "average" + if(2) + size_name = "sizable" + if(3) + size_name = "squeezable" + if(4) + size_name = "hefty" + if(5) + size_name = pick("massive","extreme","enormous","very generous","humongous","big bubbly","dummy thicc") + else + size_name = "nonexistent" + + desc = "You see a [lowershape] of [size_name] asscheeks." + + var/icon_size = size + icon_state = "butt_[lowershape]_[icon_size]" + if(owner) + if(owner.dna.species.use_skintones && owner.dna.features["genitals_use_skintone"]) + if(ishuman(owner)) // Check before recasting type, although someone fucked up if you're not human AND have use_skintones somehow... + var/mob/living/carbon/human/H = owner // only human mobs have skin_tone, which we need. + color = SKINTONE2HEX(H.skin_tone) + if(!H.dna.skin_tone_override) + icon_state += "_s" + else + color = "#[owner.dna.features["butt_color"]]" + + +/obj/item/organ/genital/butt/get_features(mob/living/carbon/human/H) + var/datum/dna/D = H.dna + if(D.species.use_skintones && D.features["genitals_use_skintone"]) + color = SKINTONE2HEX(H.skin_tone) + else + color = "#[D.features["butt_color"]]" + size = D.features["butt_size"] + prev_size = size + toggle_visibility(D.features["butt_visibility"], FALSE) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 5fcb6787d2..92e7830b74 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -130,7 +130,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/eye_type = DEFAULT_EYES_TYPE //Eye type var/split_eye_colors = FALSE var/datum/species/pref_species = new /datum/species/human() //Mutant race - var/list/features = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF", "mcolor3" = "FFFFFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "horns_color" = "85615a", "ears" = "None", "wings" = "None", "wings_color" = "FFF", "frills" = "None", "deco_wings" = "None", "spines" = "None", "legs" = "Plantigrade", "insect_wings" = "Plain", "insect_fluff" = "None", "insect_markings" = "None", "arachnid_legs" = "Plain", "arachnid_spinneret" = "Plain", "arachnid_mandibles" = "Plain", "mam_body_markings" = list(), "mam_ears" = "None", "mam_snouts" = "None", "mam_tail" = "None", "mam_tail_animated" = "None", "xenodorsal" = "Standard", "xenohead" = "Standard", "xenotail" = "Xenomorph Tail", "taur" = "None", "genitals_use_skintone" = FALSE, "has_cock" = FALSE, "cock_shape" = DEF_COCK_SHAPE, "cock_length" = COCK_SIZE_DEF, "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF, "cock_color" = "ffffff", "cock_taur" = FALSE, "has_balls" = FALSE, "balls_color" = "ffffff", "balls_shape" = DEF_BALLS_SHAPE, "balls_size" = BALLS_SIZE_DEF, "balls_cum_rate" = CUM_RATE, "balls_cum_mult" = CUM_RATE_MULT, "balls_efficiency" = CUM_EFFICIENCY, "has_breasts" = FALSE, "breasts_color" = "ffffff", "breasts_size" = BREASTS_SIZE_DEF, "breasts_shape" = DEF_BREASTS_SHAPE, "breasts_producing" = FALSE, "has_vag" = FALSE, "vag_shape" = DEF_VAGINA_SHAPE, "vag_color" = "ffffff", "has_womb" = FALSE, "balls_visibility" = GEN_VISIBLE_NO_UNDIES, "breasts_visibility"= GEN_VISIBLE_NO_UNDIES, "cock_visibility" = GEN_VISIBLE_NO_UNDIES, "vag_visibility" = GEN_VISIBLE_NO_UNDIES, "ipc_screen" = "Sunburst", "ipc_antenna" = "None", "flavor_text" = "", "silicon_flavor_text" = "", "ooc_notes" = "", "meat_type" = "Mammalian", "body_model" = MALE, "body_size" = RESIZE_DEFAULT_SIZE, "color_scheme" = OLD_CHARACTER_COLORING) + var/list/features = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF", "mcolor3" = "FFFFFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "horns_color" = "85615a", "ears" = "None", "wings" = "None", "wings_color" = "FFF", "frills" = "None", "deco_wings" = "None", "spines" = "None", "legs" = "Plantigrade", "insect_wings" = "Plain", "insect_fluff" = "None", "insect_markings" = "None", "arachnid_legs" = "Plain", "arachnid_spinneret" = "Plain", "arachnid_mandibles" = "Plain", "mam_body_markings" = list(), "mam_ears" = "None", "mam_snouts" = "None", "mam_tail" = "None", "mam_tail_animated" = "None", "xenodorsal" = "Standard", "xenohead" = "Standard", "xenotail" = "Xenomorph Tail", "taur" = "None", "genitals_use_skintone" = FALSE, "has_cock" = FALSE, "cock_shape" = DEF_COCK_SHAPE, "cock_length" = COCK_SIZE_DEF, "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF, "cock_color" = "ffffff", "cock_taur" = FALSE, "has_balls" = FALSE, "balls_color" = "ffffff", "balls_shape" = DEF_BALLS_SHAPE, "balls_size" = BALLS_SIZE_DEF, "balls_cum_rate" = CUM_RATE, "balls_cum_mult" = CUM_RATE_MULT, "balls_efficiency" = CUM_EFFICIENCY, "has_breasts" = FALSE, "breasts_color" = "ffffff", "breasts_size" = BREASTS_SIZE_DEF, "breasts_shape" = DEF_BREASTS_SHAPE, "breasts_producing" = FALSE, "has_vag" = FALSE, "vag_shape" = DEF_VAGINA_SHAPE, "vag_color" = "ffffff", "has_womb" = FALSE, "has_butt" = FALSE, "butt_color" = "ffffff", "butt_size" = BUTT_SIZE_DEF, "balls_visibility" = GEN_VISIBLE_NO_UNDIES, "breasts_visibility"= GEN_VISIBLE_NO_UNDIES, "cock_visibility" = GEN_VISIBLE_NO_UNDIES, "vag_visibility" = GEN_VISIBLE_NO_UNDIES, "butt_visibility" = GEN_VISIBLE_NO_UNDIES, "ipc_screen" = "Sunburst", "ipc_antenna" = "None", "flavor_text" = "", "silicon_flavor_text" = "", "ooc_notes" = "", "meat_type" = "Mammalian", "body_model" = MALE, "body_size" = RESIZE_DEFAULT_SIZE, "color_scheme" = OLD_CHARACTER_COLORING) var/custom_speech_verb = "default" //if your say_mod is to be something other than your races var/custom_tongue = "default" //if your tongue is to be something other than your races @@ -721,6 +721,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) else dat += "Testicles Color:
" dat += "    Change
" + dat += "Testicles Shape: [features["balls_shape"]]" dat += "Testicles Visibility:[features["balls_visibility"]]" dat += APPEARANCE_CATEGORY_COLUMN dat += "

Vagina

" @@ -751,6 +752,19 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Breasts Visibility:[features["breasts_visibility"]]" dat += "Lactates:[features["breasts_producing"] == TRUE ? "Yes" : "No"]" dat += "" + dat += APPEARANCE_CATEGORY_COLUMN + dat += "

Butt

" + dat += "[features["has_butt"] == TRUE ? "Yes" : "No"]" + if(features["has_butt"]) + if(pref_species.use_skintones && features["genitals_use_skintone"] == TRUE) + dat += "Color:
" + dat += "   (Skin tone overriding)
" + else + dat += "Color:
" + dat += "    Change
" + dat += "Butt Size:[features["butt_size"]]" + dat += "Butt Visibility:[features["butt_visibility"]]" + dat += "" dat += "" dat += "" @@ -1098,6 +1112,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "

Other content prefs

" dat += "Breast Enlargement: [(cit_toggles & BREAST_ENLARGEMENT) ? "Allowed" : "Disallowed"]
" dat += "Penis Enlargement: [(cit_toggles & PENIS_ENLARGEMENT) ? "Allowed" : "Disallowed"]
" + dat += "Butt Enlargement: [(cit_toggles & BUTT_ENLARGEMENT) ? "Allowed" : "Disallowed"]
" dat += "Hypno: [(cit_toggles & NEVER_HYPNO) ? "Disallowed" : "Allowed"]
" dat += "Aphrodisiacs: [(cit_toggles & NO_APHRO) ? "Disallowed" : "Allowed"]
" dat += "Ass Slapping: [(cit_toggles & NO_ASS_SLAP) ? "Disallowed" : "Allowed"]
" @@ -2285,6 +2300,12 @@ GLOBAL_LIST_EMPTY(preferences_datums) else to_chat(user,"Invalid color. Your color is not bright enough.") + if("balls_shape") + var/new_shape + new_shape = input(user, "Testicle Shape", "Character Preference") as null|anything in GLOB.balls_shapes_list + if(new_shape) + features["balls_shape"] = new_shape + if("balls_visibility") var/n_vis = input(user, "Testicles Visibility", "Character Preference") as null|anything in CONFIG_GET(keyed_list/safe_visibility_toggles) if(n_vis) @@ -2339,6 +2360,29 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(n_vis) features["vag_visibility"] = n_vis + if("butt_color") + var/new_buttcolor = input(user, "Butt color:", "Character Preference","#"+features["butt_color"]) as color|null + if(new_buttcolor) + var/temp_hsv = RGBtoHSV(new_buttcolor) + if(new_buttcolor == "#000000") + features["butt_color"] = pref_species.default_color + else if(ReadHSV(temp_hsv)[3] >= ReadHSV(MINIMUM_MUTANT_COLOR)[3]) + features["butt_color"] = sanitize_hexcolor(new_buttcolor, 6) + else + to_chat(user,"Invalid color. Your color is not bright enough.") + + if("butt_size") + var/min_B = CONFIG_GET(number/butt_min_size_prefs) + var/max_B = CONFIG_GET(number/butt_max_size_prefs) + var/new_length = input(user, "Butt size:\n([min_B]-[max_B])", "Character Preference") as num|null + if(new_length) + features["butt_size"] = clamp(round(new_length), min_B, max_B) + + if("butt_visibility") + var/n_vis = input(user, "Butt Visibility", "Character Preference") as null|anything in CONFIG_GET(keyed_list/safe_visibility_toggles) + if(n_vis) + features["butt_visibility"] = n_vis + if("ooccolor") var/new_ooccolor = input(user, "Choose your OOC colour:", "Game Preference",ooccolor) as color|null if(new_ooccolor) @@ -2597,6 +2641,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) features["has_womb"] = FALSE if("has_womb") features["has_womb"] = !features["has_womb"] + if("has_butt") + features["has_butt"] = !features["has_butt"] if("widescreenpref") widescreenpref = !widescreenpref user.client.view_size.setDefault(getScreenSize(widescreenpref)) @@ -2861,6 +2907,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("penis_enlargement") cit_toggles ^= PENIS_ENLARGEMENT + if("butt_enlargement") + cit_toggles ^= BUTT_ENLARGEMENT + if("feminization") cit_toggles ^= FORCED_FEM diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 628a51ed44..ecc2661cf8 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -641,7 +641,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car var/savefile/S = new /savefile(path) if(!S) return FALSE - features = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF", "mcolor3" = "FFFFFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "horns_color" = "85615a", "ears" = "None", "wings" = "None", "wings_color" = "FFF", "frills" = "None", "deco_wings" = "None", "spines" = "None", "legs" = "Plantigrade", "insect_wings" = "Plain", "insect_fluff" = "None", "insect_markings" = "None", "arachnid_legs" = "Plain", "arachnid_spinneret" = "Plain", "arachnid_mandibles" = "Plain", "mam_body_markings" = "Plain", "mam_ears" = "None", "mam_snouts" = "None", "mam_tail" = "None", "mam_tail_animated" = "None", "xenodorsal" = "Standard", "xenohead" = "Standard", "xenotail" = "Xenomorph Tail", "taur" = "None", "genitals_use_skintone" = FALSE, "has_cock" = FALSE, "cock_shape" = DEF_COCK_SHAPE, "cock_length" = COCK_SIZE_DEF, "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF, "cock_color" = "ffffff", "cock_taur" = FALSE, "has_balls" = FALSE, "balls_color" = "ffffff", "balls_shape" = DEF_BALLS_SHAPE, "balls_size" = BALLS_SIZE_DEF, "balls_cum_rate" = CUM_RATE, "balls_cum_mult" = CUM_RATE_MULT, "balls_efficiency" = CUM_EFFICIENCY, "has_breasts" = FALSE, "breasts_color" = "ffffff", "breasts_size" = BREASTS_SIZE_DEF, "breasts_shape" = DEF_BREASTS_SHAPE, "breasts_producing" = FALSE, "has_vag" = FALSE, "vag_shape" = DEF_VAGINA_SHAPE, "vag_color" = "ffffff", "has_womb" = FALSE, "balls_visibility" = GEN_VISIBLE_NO_UNDIES, "breasts_visibility"= GEN_VISIBLE_NO_UNDIES, "cock_visibility" = GEN_VISIBLE_NO_UNDIES, "vag_visibility" = GEN_VISIBLE_NO_UNDIES, "ipc_screen" = "Sunburst", "ipc_antenna" = "None", "flavor_text" = "", "silicon_flavor_text" = "", "ooc_notes" = "", "meat_type" = "Mammalian", "body_model" = MALE, "body_size" = RESIZE_DEFAULT_SIZE, "color_scheme" = OLD_CHARACTER_COLORING) + features = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF", "mcolor3" = "FFFFFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "horns_color" = "85615a", "ears" = "None", "wings" = "None", "wings_color" = "FFF", "frills" = "None", "deco_wings" = "None", "spines" = "None", "legs" = "Plantigrade", "insect_wings" = "Plain", "insect_fluff" = "None", "insect_markings" = "None", "arachnid_legs" = "Plain", "arachnid_spinneret" = "Plain", "arachnid_mandibles" = "Plain", "mam_body_markings" = "Plain", "mam_ears" = "None", "mam_snouts" = "None", "mam_tail" = "None", "mam_tail_animated" = "None", "xenodorsal" = "Standard", "xenohead" = "Standard", "xenotail" = "Xenomorph Tail", "taur" = "None", "genitals_use_skintone" = FALSE, "has_cock" = FALSE, "cock_shape" = DEF_COCK_SHAPE, "cock_length" = COCK_SIZE_DEF, "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF, "cock_color" = "ffffff", "cock_taur" = FALSE, "has_balls" = FALSE, "balls_color" = "ffffff", "balls_shape" = DEF_BALLS_SHAPE, "balls_size" = BALLS_SIZE_DEF, "balls_cum_rate" = CUM_RATE, "balls_cum_mult" = CUM_RATE_MULT, "balls_efficiency" = CUM_EFFICIENCY, "has_breasts" = FALSE, "breasts_color" = "ffffff", "breasts_size" = BREASTS_SIZE_DEF, "breasts_shape" = DEF_BREASTS_SHAPE, "breasts_producing" = FALSE, "has_vag" = FALSE, "vag_shape" = DEF_VAGINA_SHAPE, "vag_color" = "ffffff", "has_womb" = FALSE, "has_butt" = FALSE, "butt_color" = "ffffff", "butt_size" = BUTT_SIZE_DEF, "balls_visibility" = GEN_VISIBLE_NO_UNDIES, "breasts_visibility"= GEN_VISIBLE_NO_UNDIES, "cock_visibility" = GEN_VISIBLE_NO_UNDIES, "vag_visibility" = GEN_VISIBLE_NO_UNDIES, "butt_visibility" = GEN_VISIBLE_NO_UNDIES, "ipc_screen" = "Sunburst", "ipc_antenna" = "None", "flavor_text" = "", "silicon_flavor_text" = "", "ooc_notes" = "", "meat_type" = "Mammalian", "body_model" = MALE, "body_size" = RESIZE_DEFAULT_SIZE, "color_scheme" = OLD_CHARACTER_COLORING) S.cd = "/" if(!slot) @@ -820,6 +820,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["feature_vag_visibility"] >> features["vag_visibility"] //womb features S["feature_has_womb"] >> features["has_womb"] + //butt features + S["feature_has_butt"] >> features["has_butt"] + S["feature_butt_color"] >> features["butt_color"] + S["feature_butt_size"] >> features["butt_size"] + S["feature_butt_visibility"] >> features["butt_visibility"] //flavor text //Let's make our players NOT cry desperately as we wipe their savefiles of their special snowflake texts: @@ -942,6 +947,13 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car var/static/max_D if(!max_D) max_D = CONFIG_GET(number/penis_max_inches_prefs) + var/static/min_B + if(!min_B) + min_B = CONFIG_GET(number/butt_min_size_prefs) + var/static/max_B + if(!max_B) + max_B = CONFIG_GET(number/butt_max_size_prefs) + var/static/safe_visibilities if(!safe_visibilities) var/list/L = CONFIG_GET(keyed_list/safe_visibility_toggles) @@ -949,6 +961,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car features["breasts_size"] = sanitize_inlist(features["breasts_size"], B_sizes, BREASTS_SIZE_DEF) features["cock_length"] = sanitize_integer(features["cock_length"], min_D, max_D, COCK_SIZE_DEF) + features["butt_size"] = sanitize_integer(features["butt_size"], min_B, max_B, BUTT_SIZE_DEF) features["breasts_shape"] = sanitize_inlist(features["breasts_shape"], GLOB.breasts_shapes_list, DEF_BREASTS_SHAPE) features["cock_shape"] = sanitize_inlist(features["cock_shape"], GLOB.cock_shapes_list, DEF_COCK_SHAPE) features["balls_shape"] = sanitize_inlist(features["balls_shape"], GLOB.balls_shapes_list, DEF_BALLS_SHAPE) @@ -961,6 +974,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car features["cock_visibility"] = sanitize_inlist(features["cock_visibility"], safe_visibilities, GEN_VISIBLE_NO_UNDIES) features["balls_visibility"] = sanitize_inlist(features["balls_visibility"], safe_visibilities, GEN_VISIBLE_NO_UNDIES) features["vag_visibility"] = sanitize_inlist(features["vag_visibility"], safe_visibilities, GEN_VISIBLE_NO_UNDIES) + features["butt_visibility"] = sanitize_inlist(features["butt_visibility"], safe_visibilities, GEN_VISIBLE_NO_UNDIES) custom_speech_verb = sanitize_inlist(custom_speech_verb, GLOB.speech_verbs, "default") custom_tongue = sanitize_inlist(custom_tongue, GLOB.roundstart_tongues, "default") @@ -1124,6 +1138,11 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["feature_has_womb"], features["has_womb"]) + WRITE_FILE(S["feature_has_butt"], features["has_butt"]) + WRITE_FILE(S["feature_butt_color"], features["butt_color"]) + WRITE_FILE(S["feature_butt_size"], features["butt_size"]) + WRITE_FILE(S["feature_butt_visibility"], features["butt_visibility"]) + WRITE_FILE(S["feature_ooc_notes"], features["ooc_notes"]) WRITE_FILE(S["feature_color_scheme"], features["color_scheme"]) diff --git a/code/modules/mob/living/carbon/human/innate_abilities/customization.dm b/code/modules/mob/living/carbon/human/innate_abilities/customization.dm index 583577840f..f395dfd556 100644 --- a/code/modules/mob/living/carbon/human/innate_abilities/customization.dm +++ b/code/modules/mob/living/carbon/human/innate_abilities/customization.dm @@ -22,7 +22,7 @@ /datum/action/innate/ability/humanoid_customization/proc/change_form() var/mob/living/carbon/human/H = owner - var/select_alteration = input(owner, "Select what part of your form to alter", "Form Alteration", "cancel") in list("Body Color", "Eye Color","Hair Style", "Genitals", "Tail", "Snout", "Markings", "Ears", "Taur body", "Penis", "Vagina", "Penis Length", "Breast Size", "Breast Shape", "Cancel") + var/select_alteration = input(owner, "Select what part of your form to alter", "Form Alteration", "cancel") in list("Body Color", "Eye Color","Hair Style", "Genitals", "Tail", "Snout", "Markings", "Ears", "Taur body", "Penis", "Vagina", "Penis Length", "Breast Size", "Breast Shape", "Butt Size", "Cancel") if(select_alteration == "Body Color") var/new_color = input(owner, "Choose your skin color:", "Race change","#"+H.dna.features["mcolor"]) as color|null @@ -227,5 +227,17 @@ H.apply_overlay() H.give_genital(/obj/item/organ/genital/breasts) + else if (select_alteration == "Butt Size") + for(var/obj/item/organ/genital/butt/X in H.internal_organs) + qdel(X) + var/min_B = CONFIG_GET(number/butt_min_size_prefs) + var/max_B = CONFIG_GET(number/butt_max_size_prefs) + var/new_length = input(owner, "Butt size:\n([min_B]-[max_B])", "Genital Alteration") as num|null + if(new_length) + H.dna.features["butt_size"] = clamp(round(new_length), min_B, max_B) + H.update_genitals() + H.apply_overlay() + H.give_genital(/obj/item/organ/genital/butt) + else return diff --git a/code/modules/reagents/reagent_containers/hypovial.dm b/code/modules/reagents/reagent_containers/hypovial.dm index 8d99248d97..92c33af3b1 100644 --- a/code/modules/reagents/reagent_containers/hypovial.dm +++ b/code/modules/reagents/reagent_containers/hypovial.dm @@ -103,6 +103,11 @@ icon_state = "hypovial-pink" list_reagents = list(/datum/reagent/fermi/PEsmaller_hypo = 30) +/obj/item/reagent_containers/glass/bottle/vial/small/buttreduction + name = "pink hypovial (butt treatment)" + icon_state = "hypovial-pink" + list_reagents = list(/datum/reagent/fermi/AEsmaller_hypo = 30) + /obj/item/reagent_containers/glass/bottle/vial/large/CMO name = "deluxe hypovial" icon_state = "hypoviallarge-cmos" diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index a5b4e5b8ab..6cf528eed7 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -265,3 +265,7 @@ /obj/item/reagent_containers/pill/breast_enlargement name = "breast enlargement pill" list_reagents = list(/datum/reagent/fermi/breast_enlarger = 10) + +/obj/item/reagent_containers/pill/butt_enlargement + name = "butt enlargement pill" + list_reagents = list(/datum/reagent/fermi/butt_enlarger = 10) diff --git a/code/modules/research/designs/limbgrower_designs.dm b/code/modules/research/designs/limbgrower_designs.dm index e30cdfb5ef..f0e162b24f 100644 --- a/code/modules/research/designs/limbgrower_designs.dm +++ b/code/modules/research/designs/limbgrower_designs.dm @@ -212,3 +212,13 @@ reagents_list = list(/datum/reagent/medicine/synthflesh = 25) build_path = /obj/item/organ/genital/breasts category = list("initial","human","lizard","fly","insect","plasmaman","mammal","xeno") + +/datum/design/butt + name = "Butt" + id = "butt" + research_icon_state = "butt_pair_5_s" + research_icon = 'icons/obj/genitals/butt.dmi' + build_type = LIMBGROWER + reagents_list = list(/datum/reagent/medicine/synthflesh = 25) + build_path = /obj/item/organ/genital/butt + category = list("initial","human","lizard","fly","insect","plasmaman","mammal","xeno") diff --git a/code/modules/vending/kinkmate.dm b/code/modules/vending/kinkmate.dm index 6d8eea1782..02f3f30e4b 100644 --- a/code/modules/vending/kinkmate.dm +++ b/code/modules/vending/kinkmate.dm @@ -31,6 +31,7 @@ /obj/item/autosurgeon/testicles = 3, /obj/item/storage/pill_bottle/penis_enlargement = 10, /obj/item/storage/pill_bottle/breast_enlargement = 10, + /obj/item/storage/pill_bottle/butt_enlargement = 10, /obj/item/reagent_containers/glass/bottle/crocin = 10, /obj/item/reagent_containers/glass/bottle/camphor = 5, /obj/item/storage/daki = 4 diff --git a/config/entries/fetish_content.txt b/config/entries/fetish_content.txt index 6fabd095d8..1bc9ebe968 100644 --- a/config/entries/fetish_content.txt +++ b/config/entries/fetish_content.txt @@ -12,6 +12,10 @@ BREASTS_CUPS_PREFS h PENIS_MIN_INCHES_PREFS 1 PENIS_MAX_INCHES_PREFS 24 +## Minimum and maximum limits for butt size from the character creation menu. If there's bigger butt sizes out there, change the max accordingly. +BUTT_MIN_SIZE_PREFS 1 +BUTT_MAX_SIZE_PREFS 5 + ## Body size configs, the feature will be disabled if both min and max have the same value. BODY_SIZE_MIN 0.9 BODY_SIZE_MAX 1.25 diff --git a/icons/obj/genitals/breasts_onmob.dmi b/icons/obj/genitals/breasts_onmob.dmi index 3f3bcf5bd76198f2f0a867fc3128f682b35d6a92..aa717be8f0bf62e2011365408d0bafd35ac5785a 100644 GIT binary patch literal 6353 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 literal 0 HcmV?d00001 diff --git a/icons/obj/genitals/testicles_onmob.dmi b/icons/obj/genitals/testicles_onmob.dmi index 65eb24268f99929355d5d90054cf8d6a1c2b3a97..febbd5b3625dc6f3685a32094ce1d7d26d3cd713 100644 GIT binary patch literal 778 zcmV+l1NHogP)e<}o#>>FKz{HrGAOHXW0d!JMQvg8b*k%9#0M>d` zSad{Xb7OL8aCB*JZU6vyoTZep3c@fDhUerdLOUx>;_6abwSy7FJrr{`fm)##^!05O zIx1YYyW!8rms~CvWxa2VsE!SP!ieE9h^^SH3(j7_ML#uKapoa(K7JdFZG@@JB47;H z9?)VKx*n{wh25P`=8|#d!ie)poZZIu4s$JkMkPI3*s?w}rlMh~Sw**1bX%2Rs}gKA z-B#0Wb%L#?*!tic478bAvUD!#b(buiOS=*4Ke$s^}K` zPk(ASu)Y@i0RR91z{$k*+_K8I4ji~1>t<=CTK6qdzk&5*@9(<4ZGZM#eZF8nXn!~Q1xMfCjs1uL00019uve?kAyK{maoqao zYW^-HR_h|a8n-^Wna|dT6Q92Pdb*vDTOWOx&EAIrZ;O02ptU}_oz2rXP&~t%YCvm! zbai)^66^h^_IdyS0DzaItA9*(;`*rX+x}m#wf^V>j()*z(f9+!#(Dq%0000000000 z00000Xt3Rcz+|)k^e_E}dbkgPNfDT)`LQ1W0002|wa3R0xUTZ8{YsOcufyYayU=1+ zOuP>9+^_Vs4GY8Rx38hauH65H`MF=|;rS^n4DZuIaa!d=Joc-)-w*ph00000oUypi zJI2Vu=5RXh^Tt;WoNN!L^FD8M-^&H%^WpS=*yjygPy*-T2UVsxQ&X0GVE_OC07*qo IM6N<$g2@7TT>t<8 literal 561 zcmV-10?z%3P)e<}o#>>FKz%bJ9@c;k-0d!JMQvg8b*k%9#0IPabSad{Xb7OL8aCB*J zZU6vyoTbu14#FT11<*B|g0yQ*0khh^qpimg5wtN!nbTvQaGG8dHvDBocAf!AvGiSuDm1j~F_{s7lZTeZIa z8}i!gPF#rGo6G=otRCt{2+CgrDP!t7F5f=bEAgsXHcFw>R=>GT8rn65Xx9FEx zbB-hOZ{8!!Zoa!6007+7cOlSpx1a8rxA{T<0D!m9#Wpp|KRB=H`!J#GV@-(1d7CfX z{F4Fz06ar8FE7v5_vwCaWt)0@;kv#UHC^3;T0!Mc3IG87OE1{}X2u}|_QUO`dlsIK zX<-p)=L>WH0{{ScN7EDnhj1SI-)!9Z91`bg`8@W&Qv3Ol7Ooo@9n-wF?mhqjfL~KO zPl3|@=eOt(>Rs-CrOOx!W*g?^{#QC(FQLDsdKdd&sXeZHK>z@NO~n59ml1_wIUW07 zRu0&Y%jw+zqObA~sMqCmh5k3YP^^5P2@m)NDhUyYg~}JP00000NkvXXu0mjfkeUU{ diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm index fb770d75d8..1296e7d686 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm @@ -37,7 +37,7 @@ if(volume >= 15) //To prevent monkey breast farms var/turf/T = get_turf(M) var/obj/item/organ/genital/breasts/B = new /obj/item/organ/genital/breasts(T) - M.visible_message("A pair of breasts suddenly fly out of the [M]!") + M.visible_message("A pair of breasts suddenly fly out of [M]!") var/T2 = get_random_station_turf() M.adjustBruteLoss(25) M.DefaultCombatKnockdown(50) @@ -175,7 +175,7 @@ if(volume >= 15) //to prevent monkey penis farms var/turf/T = get_turf(M) var/obj/item/organ/genital/penis/P = new /obj/item/organ/genital/penis(T) - M.visible_message("A penis suddenly flies out of the [M]!") + M.visible_message("A penis suddenly flies out of [M]!") var/T2 = get_random_station_turf() M.adjustBruteLoss(25) M.DefaultCombatKnockdown(50) @@ -283,3 +283,87 @@ else if(P.length < optimal_size) P.modify_size(0.1, 0, optimal_size) return ..() + + + +///Ass enhancer +/datum/reagent/fermi/butt_enlarger + name = "Denbu Tincture" //on Hyper it was 'Denbu Draft' but this makes it more consistent with the rectifying chemical down below. + description = "A mixture of natural vitamins and valentines plant extract, causing butt enlargement in humanoids." + color = "#e8ff1b" + taste_description = "butter with a sweet aftertaste" //pass me the butter, OM NOM + overdose_threshold = 17 + can_synth = FALSE + +/datum/reagent/fermi/butt_enlarger/on_mob_metabolize(mob/living/carbon/M) + . = ..() + if(!ishuman(M)) //leaving the monkey feature for those desperate for goon level comedy. + if(volume >= 15) //to prevent monkey butt farms + var/turf/T = get_turf(M) + var/obj/item/organ/genital/butt/B = new /obj/item/organ/genital/butt(T) + M.visible_message("An ass suddenly flies out of [M]!") + var/T2 = get_random_station_turf() + M.adjustBruteLoss(25) + M.DefaultCombatKnockdown(50) + M.Stun(50) + B.throw_at(T2, 8, 1) + M.reagents.del_reagent(type) + return + var/mob/living/carbon/human/H = M + if(!H.getorganslot(ORGAN_SLOT_BUTT) && H.emergent_genital_call()) + H.genital_override = TRUE + +/datum/reagent/fermi/butt_enlarger/on_mob_life(mob/living/carbon/M) //Increases butt size + if(!ishuman(M)) + return ..() + var/mob/living/carbon/human/H = M + if(!(H.client?.prefs.cit_toggles & BUTT_ENLARGEMENT)) + return ..() + var/obj/item/organ/genital/butt/B = M.getorganslot(ORGAN_SLOT_BUTT) + if(!B) //If they don't have a butt. Give them one! + var/obj/item/organ/genital/butt/nB = new + nB.Insert(M) + if(nB) + if(M.dna.species.use_skintones && M.dna.features["genitals_use_skintone"]) + nB.color = SKINTONE2HEX(H.skin_tone) + else if(M.dna.features["butt_color"]) + nB.color = "#[M.dna.features["butt_color"]]" + else + nB.color = SKINTONE2HEX(H.skin_tone) + nB.size = 1 + to_chat(M, "Your ass cheeks bulge outwards and feel more plush.") + M.reagents.remove_reagent(type, 5) + B = nB + //If they have, increase size. + if(B.size_cached < BUTT_SIZE_MAX) //just in case + B.modify_size(0.05) + ..() + +/datum/reagent/fermi/AEsmaller_hypo //"BEsmaller" already exists so using "AE" instead, A is for ass. + name = "Rectify tincture" + color = "#e8ff1b" + taste_description = "butter" + description = "A medicine used to treat organomegaly in a patient's ass." + metabolization_rate = 0.5 + can_synth = TRUE + +/datum/reagent/fermi/AEsmaller_hypo/on_mob_metabolize(mob/living/M) + . = ..() + if(!ishuman(M)) + return + var/mob/living/carbon/human/H = M + if(!H.getorganslot(ORGAN_SLOT_BUTT) && H.dna.features["has_butt"]) + H.give_genital(/obj/item/organ/genital/butt) + +/datum/reagent/fermi/AEsmaller_hypo/on_mob_life(mob/living/carbon/M) + var/obj/item/organ/genital/butt/B = M.getorganslot(ORGAN_SLOT_BUTT) + if(!B) + return ..() + var/optimal_size = M.dna.features["butt_size"] + if(!optimal_size)//Fast fix for those who don't want it. + B.modify_size(-0.2) + else if(B.size > optimal_size) + B.modify_size(-0.1, optimal_size) + else if(B.size < optimal_size) + B.modify_size(0.1, 0, optimal_size) + return ..() diff --git a/tgstation.dme b/tgstation.dme index de8e9ccddc..cb2fa07f50 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1819,6 +1819,7 @@ #include "code\modules\arousal\genitals.dm" #include "code\modules\arousal\genitals_sprite_accessories.dm" #include "code\modules\arousal\organs\breasts.dm" +#include "code\modules\arousal\organs\butt.dm" #include "code\modules\arousal\organs\penis.dm" #include "code\modules\arousal\organs\testicles.dm" #include "code\modules\arousal\organs\vagina.dm"