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()