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 3f3bcf5bd7..aa717be8f0 100644 Binary files a/icons/obj/genitals/breasts_onmob.dmi and b/icons/obj/genitals/breasts_onmob.dmi differ diff --git a/icons/obj/genitals/butt.dmi b/icons/obj/genitals/butt.dmi new file mode 100644 index 0000000000..304a8424bb Binary files /dev/null and b/icons/obj/genitals/butt.dmi differ diff --git a/icons/obj/genitals/butt_onmob.dmi b/icons/obj/genitals/butt_onmob.dmi new file mode 100644 index 0000000000..95a75fa745 Binary files /dev/null and b/icons/obj/genitals/butt_onmob.dmi differ diff --git a/icons/obj/genitals/testicles_onmob.dmi b/icons/obj/genitals/testicles_onmob.dmi index 65eb24268f..febbd5b362 100644 Binary files a/icons/obj/genitals/testicles_onmob.dmi and b/icons/obj/genitals/testicles_onmob.dmi differ 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"