diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index af7e92b1..ed0434f2 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -182,7 +182,7 @@ "has_cock" = FALSE, "cock_shape" = pick(GLOB.cock_shapes_list), "cock_length" = 6, - "belly_size" = 1, + "belly_size" = 1, "butt_size" = 1, "cock_girth_ratio" = COCK_GIRTH_RATIO_DEF, "cock_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), @@ -190,10 +190,11 @@ "sheath_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), "has_belly" = FALSE, "hide_belly" = FALSE, - "inflatable_belly" = FALSE, + "inflatable_belly" = FALSE, "belly_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), "has_balls" = FALSE, "has_anus" = FALSE, + "butt_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), "balls_internal" = FALSE, "balls_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), "balls_amount" = 2, diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index b1c2229c..1ba1677b 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -148,6 +148,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) "inflatable_belly" = FALSE, "belly_color" = "fff", "has_anus" = FALSE, + "butt_color" = "fff", "has_balls" = FALSE, "balls_internal" = FALSE, "balls_color" = "fff", @@ -932,6 +933,13 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "[features["has_anus"] == TRUE ? "Yes" : "No"]" if(features["has_anus"]) dat += "Butt Size: [features["butt_size"]]" + if(pref_species.use_skintones && features["genitals_use_skintone"] == TRUE) + dat += "Color:
" + dat += "   (Skin tone overriding)
" + else + dat += "Color:
" + dat += "    Change
" + dat += "" dat += "" @@ -2274,6 +2282,17 @@ GLOBAL_LIST_EMPTY(preferences_datums) else to_chat(user,"Invalid color. Your color is not bright enough.") + if("butt_color") + var/new_buttcolor = input(user, "Butt Color:", "Character Preference") 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((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3]) + features["butt_color"] = sanitize_hexcolor(new_buttcolor) + else + to_chat(user,"Invalid color. Your color is not bright enough.") + if("balls_shape") var/new_shape new_shape = input(user, "Testicle Type:", "Character Preference") as null|anything in GLOB.balls_shapes_list @@ -2355,8 +2374,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) features["belly_size"] = clamp(new_bellysize, 1, 3) if("butt_size") - var/new_buttsize = input(user, "Butt size :\n(0-4)", "Character Preference") as num|null - features["butt_size"] = clamp(new_buttsize, 0, 4) + var/new_buttsize = input(user, "Butt size :\n(0-5)", "Character Preference") as num|null + if(new_buttsize) + features["butt_size"] = clamp(new_buttsize, 0, 5) if("vag_shape") var/new_shape diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index f4c91da8..5f0f1e4f 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -434,13 +434,14 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //womb features S["feature_has_womb"] >> features["has_womb"] S["feature_can_get_preg"] >> features["can_get_preg"] //hyperstation 13 - //belly features + //belly features S["feature_has_belly"] >> features["has_belly"] S["feature_belly_color"] >> features["belly_color"] S["feature_hide_belly"] >> features["hide_belly"] S["feature_inflatable_belly"] >> features["inflatable_belly"] //anus features S["feature_has_anus"] >> features["has_anus"] + S["feature_butt_color"] >> features["butt_color"] //flavor text //Let's make our players NOT cry desperately as we wipe their savefiles of their special snowflake texts: diff --git a/hyperstation/code/modules/arousal/arousalhud.dm b/hyperstation/code/modules/arousal/arousalhud.dm index cf903eb7..55d58183 100644 --- a/hyperstation/code/modules/arousal/arousalhud.dm +++ b/hyperstation/code/modules/arousal/arousalhud.dm @@ -44,7 +44,6 @@ dat += "(Shrink your belly down a size)
" - if(user.pulling) dat += "Climax over [user.pulling]" //you can cum on objects if you really want... dat += "(Orgasm over a person or object.)
" @@ -127,6 +126,11 @@ var/picked_visibility = input(usr, "Choose visibility", "Expose/Hide genitals", "Hidden by clothes") in list("Always visible", "Hidden by clothes", "Always hidden") E.toggle_visibility(picked_visibility) + if(href_list["hideanus"]) + var/obj/item/organ/genital/anus/A = usr.getorganslot("anus") + var/picked_visibility = input(usr, "Choose visibility", "Expose/Hide genitals", "Hidden by clothes") in list("Always visible", "Hidden by clothes", "Always hidden") + A.toggle_visibility(picked_visibility) + if(href_list["hidetesticles"]) var/obj/item/organ/genital/testicles/T = usr.getorganslot("testicles") var/picked_visibility = input(usr, "Choose visibility", "Expose/Hide genitals", "Hidden by clothes") in list("Always visible", "Hidden by clothes", "Always hidden") diff --git a/hyperstation/icons/obj/genitals/butt.dmi b/hyperstation/icons/obj/genitals/butt.dmi index 08e60ea5..e4b8f5c6 100644 Binary files a/hyperstation/icons/obj/genitals/butt.dmi and b/hyperstation/icons/obj/genitals/butt.dmi differ diff --git a/modular_citadel/code/modules/arousal/organs/anus.dm b/modular_citadel/code/modules/arousal/organs/anus.dm index 8e0f5564..5be324d2 100644 --- a/modular_citadel/code/modules/arousal/organs/anus.dm +++ b/modular_citadel/code/modules/arousal/organs/anus.dm @@ -1,29 +1,46 @@ /obj/item/organ/genital/anus name = "anus" - desc = "You see a butt." + desc = "You see a pair of asscheeks." icon_state = "butt" icon = 'modular_citadel/icons/obj/genitals/breasts.dmi' zone = "anus" slot = "anus" w_class = 3 size = 0 + var/size_name = "nonexistant" var/statuscheck = FALSE shape = "Pair" + can_masturbate_with = FALSE masturbation_verb = "massage" can_climax = FALSE - - - /obj/item/organ/genital/anus/on_life() if(QDELETED(src)) return if(!owner) return - /obj/item/organ/genital/anus/update_appearance() var/string + var/lowershape = lowertext(shape) + + //Reflect the size of dat ass on examine. + switch(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 = "godly" + else + size_name = "nonexistant" + + desc = "You see a [lowershape] of [size_name] asscheeks." + if(owner) var/mob/living/carbon/human/H = owner color = "#[skintone2hex(H.skin_tone)]" diff --git a/modular_citadel/code/modules/arousal/organs/belly.dm b/modular_citadel/code/modules/arousal/organs/belly.dm index 09473547..b4fb7d02 100644 --- a/modular_citadel/code/modules/arousal/organs/belly.dm +++ b/modular_citadel/code/modules/arousal/organs/belly.dm @@ -10,6 +10,7 @@ var/statuscheck = FALSE shape = "Pair" masturbation_verb = "massage" + can_masturbate_with = FALSE can_climax = FALSE var/sent_full_message = TRUE //defaults to 1 since they're full to start var/inflatable = FALSE //For inflation connoisseurs diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index a33c68d8..98a5232c 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -258,8 +258,6 @@ A.color = "#[skintone2hex(skin_tone)]" A.update() - - /mob/living/carbon/human/proc/give_breasts() if(!dna) return FALSE @@ -397,6 +395,7 @@ dna.features["cock_color"] = dna.features["breasts_color"] return +//called every time players sprite changes, ie, moves item in hands or equiped item. /datum/species/proc/handle_genitals(mob/living/carbon/human/H)//more like handle sadness if(!H)//no args CRASH("H = null") @@ -452,6 +451,10 @@ continue var/mutable_appearance/genital_overlay = mutable_appearance(S.icon, layer = -layer) + + //creates another icon with mutable appearance, allows different layering depending on direction + var/mutable_appearance/genital_overlay_directional = mutable_appearance(S.icon, layer = -layer) + //genitals bigger than 11 inches / g-cup will appear over clothing, if accepted //otherwise, appear under clothing if(G.slot == "penis" || G.slot == "testicles") @@ -471,17 +474,28 @@ genital_overlay.icon_state = "belly_[size]" colourcode = "belly_color" - if(G.slot == "anus") //we have a different size system + //sizecheck added to prevent rendering blank icons + if(G.slot == "anus" && G.size > 0) //we have a different size system + genital_overlay.icon = 'hyperstation/icons/obj/genitals/butt.dmi' - genital_overlay.icon_state = "butt_[size]" - genital_overlay.layer = -FRONT_MUTATIONS_LAYER + genital_overlay.icon_state = "butt_[size]_OTHER" + genital_overlay.layer = -ID_LAYER //in front of suit, behind bellies. + + //creates directional layering by rendering twice. North has higher layer priority to occlude hands. + genital_overlay_directional.icon = 'hyperstation/icons/obj/genitals/butt.dmi' + genital_overlay_directional.icon_state = "butt_[size]_NORTH" + genital_overlay_directional.layer = -NECK_LAYER + colourcode = "butt_color" if(use_skintones) //butts are forced a colour, either skin tones, or main colour. how ever, mutants use a darker version, because of their body tone. genital_overlay.color = "#[skintone2hex(H.skin_tone)]" - genital_overlay.icon_state = "butt_[size]" + genital_overlay.icon_state = "butt_[size]_OTHER" + genital_overlay_directional.icon_state = "butt_[size]_NORTH" else genital_overlay.color = "#[H.dna.features["mcolor"]]" - genital_overlay.icon_state = "butt_[size]_m" + genital_overlay.icon_state = "butt_[size]_OTHER_m" + genital_overlay_directional.icon_state = "butt_[size]_NORTH_m" + if(S.center) genital_overlay = center_image(genital_overlay, S.dimension_x, S.dimension_y) @@ -504,10 +518,26 @@ genital_overlay.color = "#[H.dna.features["vag_color"]]" if("belly_color") genital_overlay.color = "#[H.dna.features["belly_color"]]" - + if("butt_color") + genital_overlay.color = "#[H.dna.features["butt_color"]]" standing += genital_overlay + //check whether or not there is a directional overlay + if(genital_overlay_directional) + if(S.center) + genital_overlay_directional = center_image(genital_overlay_directional, S.dimension_x, S.dimension_y) + + if(use_skintones && H.dna.features["genitals_use_skintone"]) + genital_overlay_directional.color = "#[skintone2hex(H.skin_tone)]" + if (colourtint) + genital_overlay_directional.color = "#[colourtint]" + else + genital_overlay_directional.color = "#[H.dna.features["butt_color"]]" + + standing += genital_overlay_directional + + if(LAZYLEN(standing)) H.overlays_standing[layer] = standing.Copy() standing = list()