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"