diff --git a/GainStation13/code/modules/mob/living/belly.dm b/GainStation13/code/modules/mob/living/belly.dm
index 549afa12ca..b85cbd9960 100644
--- a/GainStation13/code/modules/mob/living/belly.dm
+++ b/GainStation13/code/modules/mob/living/belly.dm
@@ -3,16 +3,17 @@
desc = "You see a belly on their midsection."
icon_state = "belly"
icon = 'hyperstation/icons/obj/genitals/belly.dmi'
- zone = "chest"
- slot = "belly"
+ zone = BODY_ZONE_CHEST
+ slot = ORGAN_SLOT_BELLY
w_class = 3
size = 0
var/statuscheck = FALSE
- shape = "Pair"
+ shape = "belly"
masturbation_verb = "massage"
var/sent_full_message = TRUE //defaults to 1 since they're full to start
var/inflatable = FALSE //For inflation connoisseurs
-
+ var/size_cached = 0
+ var/prev_size = 0
/obj/item/organ/genital/belly/on_life()
if(QDELETED(src))
@@ -20,6 +21,16 @@
if(!owner)
return
+/obj/item/organ/genital/belly/modify_size(modifier, min = BELLY_SIZE_DEF, max = BELLY_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/belly/update_appearance()
var/string
if(owner)
@@ -36,4 +47,13 @@
icon_state = sanitize_text(string)
+/obj/item/organ/genital/belly/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["belly_color"]]"
+ size = "[D.features["belly_size"]]"
+ toggle_visibility(D.features["belly_visibility"], FALSE)
+
diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm
index 4be8af77b4..245c39f367 100644
--- a/code/__DEFINES/citadel_defines.dm
+++ b/code/__DEFINES/citadel_defines.dm
@@ -66,6 +66,9 @@
#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.
+#define BELLY_SIZE_DEF 0
+#define BELLY_SIZE_MAX 10
+
//visibility toggles defines to avoid errors typos code errors.
#define GEN_VISIBLE_ALWAYS "Always visible"
#define GEN_VISIBLE_NO_CLOTHES "Hidden by clothes"
diff --git a/code/__HELPERS/_cit_helpers.dm b/code/__HELPERS/_cit_helpers.dm
index c4a7b051de..de006de90e 100644
--- a/code/__HELPERS/_cit_helpers.dm
+++ b/code/__HELPERS/_cit_helpers.dm
@@ -57,6 +57,7 @@ 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(belly_shapes_list)
GLOBAL_LIST_EMPTY(breasts_shapes_list)
GLOBAL_LIST_EMPTY(vagina_shapes_list)
//longcat memes.
@@ -130,6 +131,11 @@ GLOBAL_VAR_INIT(miscreants_allowed, FALSE)
return TRUE
return FALSE
+/mob/living/carbon/proc/has_belly()
+ if(getorganslot(ORGAN_SLOT_BELLY))
+ return TRUE
+ return FALSE
+
/mob/living/carbon/proc/is_groin_exposed(list/L)
if(!L)
L = get_equipped_items()
diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index 55e6e43bf8..6d0a690672 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -57,6 +57,7 @@
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)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/belly, GLOB.belly_shapes_list)
for(var/gpath in subtypesof(/obj/item/organ/genital))
var/obj/item/organ/genital/G = gpath
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index dca8c184f2..e2f76e1952 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -92,6 +92,8 @@
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.belly_shapes_list.len)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/butt, GLOB.belly_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)
@@ -211,7 +213,12 @@
"has_butt" = FALSE,
"butt_size" = BUTT_SIZE_DEF,
"butt_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
-
+ // GS13 EDIT START - BELLY
+ "has_belly" = FALSE,
+ "hide_belly" = FALSE,
+ "inflatable_belly" = FALSE,
+ "belly_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
+ // GS13 EDIT END
"balls_visibility" = GEN_VISIBLE_NO_UNDIES,
"breasts_visibility"= GEN_VISIBLE_NO_UNDIES,
diff --git a/code/modules/arousal/genitals.dm b/code/modules/arousal/genitals.dm
index 023c55e050..e4b9f4107c 100644
--- a/code/modules/arousal/genitals.dm
+++ b/code/modules/arousal/genitals.dm
@@ -234,6 +234,8 @@
give_genital(/obj/item/organ/genital/penis)
if(dna.features["has_butt"])
give_genital(/obj/item/organ/genital/butt)
+ if(dna.features["has_belly"])
+ give_genital(/obj/item/organ/genital/belly)
/mob/living/carbon/human/proc/give_genital(obj/item/organ/genital/G)
if(!dna || (NOGENITALS in dna.species.species_traits) || getorganslot(initial(G.slot)))
@@ -293,6 +295,8 @@
S = GLOB.breasts_shapes_list[G.shape]
if(/obj/item/organ/genital/butt)
S = GLOB.butt_shapes_list[G.shape]
+ if(/obj/item/organ/genital/belly)
+ S = GLOB.belly_shapes_list[G.shape]
if(!S || S.icon_state == "none")
continue
@@ -327,6 +331,8 @@
genital_overlay.color = "#[dna.features["vag_color"]]"
if("butt_color")
genital_overlay.color = "#[dna.features["butt_color"]]"
+ if("belly_color")
+ genital_overlay.color = "#[dna.features["belly_color"]]"
genital_overlay.icon_state = "[G.slot]_[S.icon_state]_[size][(dna.species.use_skintones && !dna.skin_tone_override) ? "_s" : ""]_[aroused_state]_[layertext]"
@@ -358,6 +364,7 @@
var/willyCheck = getorganslot(ORGAN_SLOT_PENIS)
var/buttCheck = getorganslot(ORGAN_SLOT_BUTT)
var/ballCheck = getorganslot(ORGAN_SLOT_TESTICLES)
+ var/bellyCheck = getorganslot(ORGAN_SLOT_BELLY)
if(organCheck == FALSE)
if(ishuman(src) && dna.species.use_skintones)
@@ -366,12 +373,14 @@
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["belly_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["belly_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)
@@ -380,6 +389,8 @@
dna.features["cock_color"] = dna.features["breasts_color"]
else if (buttCheck == FALSE)
dna.features["butt_color"] = dna.features["butt_color"]
+ else if (bellyCheck == FALSE)
+ dna.features["belly_color"] = dna.features["belly_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 65c71edb30..d72c59f9af 100644
--- a/code/modules/arousal/genitals_sprite_accessories.dm
+++ b/code/modules/arousal/genitals_sprite_accessories.dm
@@ -135,3 +135,14 @@
/datum/sprite_accessory/butt/pair
icon_state = "pair"
name = "Pair"
+
+//BELLY BE HERE
+/datum/sprite_accessory/belly
+ icon = 'hyperstation/icons/obj/genitals/belly.dmi'
+ icon_state = "belly"
+ name = "belly"
+ color_src = "belly_color"
+
+/datum/sprite_accessory/belly/belly
+ icon_state = "belly"
+ name = "belly"
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index f2a9c131cc..48a681bc7b 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -769,6 +769,24 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += ""
dat += ""
dat += ""
+ // GS13 EDIT BELLY START
+ dat += APPEARANCE_CATEGORY_COLUMN
+ dat += "
Belly
"
+ dat += "[features["has_belly"] == TRUE ? "Yes" : "No"]"
+ if(features["has_belly"])
+ dat += "Belly Size: [features["belly_size"]]"
+ if(pref_species.use_skintones && features["genitals_use_skintone"] == TRUE)
+ dat += "Color:
"
+ dat += " (Skin tone overriding)
"
+ else
+ dat += "Color:
"
+ dat += " Change
"
+ dat += "Belly Visibility:[features["belly_visibility"]]"
+ // GS13: tweak inflation description
+ //dat += "Inflation (climax with and manual belly size change in arousal menu):[features["inflatable_belly"] == 1 ? "Yes" : "No"]"
+
+ dat += ""
+
//Markings
if(MARKINGS_CHAR_TAB)
var/iterated_markings = 0
@@ -2566,6 +2584,29 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(n_vis)
features["butt_visibility"] = n_vis
+ if("belly_color")
+ var/new_bellycolor = input(user, "Belly Color:", "Character Preference", "#"+features["belly_color"]) as color|null
+ if(new_bellycolor)
+ var/temp_hsv = RGBtoHSV(new_bellycolor)
+ if(new_bellycolor == "#000000")
+ features["belly_color"] = pref_species.default_color
+ else if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV("#202020")[3])
+ features["belly_color"] = sanitize_hexcolor(new_bellycolor)
+ else
+ to_chat(user,"Invalid color. Your color is not bright enough.")
+
+ if("belly_size") //GS13 Edit here if we add more belly sprites
+ // GS13: Adjust sprite ranges in char setup
+ var/new_bellysize = input(user, "Belly size :\n(1-10)", "Character Preference") as num|null
+ if(new_bellysize)
+ features["belly_size"] = clamp(new_bellysize, 1, 10)
+
+ if("belly_visibility")
+ var/n_vis = input(user, "Belly Visibility", "Character Preference") as null|anything in CONFIG_GET(str_list/safe_visibility_toggles)
+ if(n_vis)
+ features["belly_visibility"] = n_vis
+
+
if("ooccolor")
var/new_ooccolor = input(user, "Choose your OOC colour:", "Game Preference",ooccolor) as color|null
if(new_ooccolor)
@@ -2854,6 +2895,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
features["has_womb"] = !features["has_womb"]
if("has_butt")
features["has_butt"] = !features["has_butt"]
+ if("has_belly")
+ features["has_belly"] = !features["has_belly"]
if("widescreenpref")
widescreenpref = !widescreenpref
user.client.view_size.setDefault(getScreenSize(widescreenpref))
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 6c65cc0720..8e21730525 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -704,7 +704,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, "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)
+ 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, "belly_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)
@@ -889,6 +889,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["feature_butt_color"] >> features["butt_color"]
S["feature_butt_size"] >> features["butt_size"]
S["feature_butt_visibility"] >> features["butt_visibility"]
+ //belly features
+ S["feature_has_belly"] >> features["has_belly"]
+ S["feature_belly_size"] >> features["belly_size"]
+ S["feature_belly_color"] >> features["belly_color"]
+ S["feature_hide_belly"] >> features["hide_belly"]
+ S["feature_inflatable_belly"] >> features["inflatable_belly"]
// Flavor texts, Made into a standard.
S["feature_flavor_text"] >> features["flavor_text"]
@@ -1030,6 +1036,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
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)
+ features["belly_visibility"] = sanitize_inlist(features["belly_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")
@@ -1210,6 +1217,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
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"])
+ //belly features
+ WRITE_FILE(S["feature_has_belly"], features["has_belly"])
+ WRITE_FILE(S["feature_belly_size"], features["belly_size"])
+ WRITE_FILE(S["feature_belly_color"], features["belly_color"])
+ WRITE_FILE(S["feature_hide_belly"], features["hide_belly"])
+ WRITE_FILE(S["feature_inflatable_belly"], features["inflatable_belly"])
WRITE_FILE(S["feature_ooc_notes"], features["ooc_notes"])
diff --git a/code/modules/research/designs/limbgrower_designs.dm b/code/modules/research/designs/limbgrower_designs.dm
index f0e162b24f..af804b16a0 100644
--- a/code/modules/research/designs/limbgrower_designs.dm
+++ b/code/modules/research/designs/limbgrower_designs.dm
@@ -222,3 +222,14 @@
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")
+
+// GS13 EDIT
+/datum/design/belly
+ name = "Belly"
+ id = "belly"
+ research_icon_state = "testicles_single_3_s"
+ research_icon = 'icons/obj/genitals/testicles.dmi'
+ build_type = LIMBGROWER
+ reagents_list = list(/datum/reagent/medicine/synthflesh = 25)
+ build_path = /obj/item/organ/genital/belly
+ category = list("initial","human","lizard","fly","insect","plasmaman","mammal","xeno")
diff --git a/hyperstation/icons/obj/genitals/belly.dmi b/hyperstation/icons/obj/genitals/belly.dmi
index cd6598644c..885a2ea802 100644
Binary files a/hyperstation/icons/obj/genitals/belly.dmi and b/hyperstation/icons/obj/genitals/belly.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index 814e2b9432..9c62457f8c 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -3953,8 +3953,8 @@
#include "GainStation13\code\modules\food_and_drinks\recipes_bigpizza.dm"
#include "GainStation13\code\modules\food_and_drinks\objects\candy_flora.dm"
#include "GainStation13\code\modules\food_and_drinks\recipes\recipes_ported.dm"
-#include "GainStation13\code\modules\hud\alert.dm"
#include "GainStation13\code\modules\gym\gym.dm"
+#include "GainStation13\code\modules\hud\alert.dm"
#include "GainStation13\code\modules\hydroponics\lipoplant.dm"
#include "GainStation13\code\modules\hydroponics\munchies_weed.dm"
#include "GainStation13\code\modules\hydroponics\grown\berries.dm"