From be7d332d857c857fc378aa21444f0239b4f2cf43 Mon Sep 17 00:00:00 2001 From: Metis <100518708+sheepishgoat@users.noreply.github.com> Date: Sat, 14 Sep 2024 15:29:13 -0400 Subject: [PATCH] belly --- .../code/modules/mob/living/belly.dm | 28 ++++++++++-- code/__DEFINES/citadel_defines.dm | 3 ++ code/__HELPERS/_cit_helpers.dm | 6 +++ code/__HELPERS/global_lists.dm | 1 + code/__HELPERS/mobs.dm | 9 +++- code/modules/arousal/genitals.dm | 11 +++++ .../arousal/genitals_sprite_accessories.dm | 11 +++++ code/modules/client/preferences.dm | 43 ++++++++++++++++++ code/modules/client/preferences_savefile.dm | 15 +++++- .../research/designs/limbgrower_designs.dm | 11 +++++ hyperstation/icons/obj/genitals/belly.dmi | Bin 43429 -> 46043 bytes tgstation.dme | 2 +- 12 files changed, 133 insertions(+), 7 deletions(-) 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 += "
S!Q^I->>Ks9%AlBX^U^Vhr7<(`
z{wj3Ut`{H<;EEb(TT@J)UteWAxx2f=@4P(xyL>&I_jYwxKNYQWg6chWHBIs}%nQ`J
z_2Q|4>=f(m^(+d)9^j+vQII?%2s#}<{)Ud}?>4Kyq?$6hzYqm4PSCc;gb@2Ao9O
znwqBW5UXtEd7^>|Fn)FHzg hQu$K5_|O|t;e
zJ{g7-s*0=3D`!9nq)H^)yOt7*ub|N~5L&%6!kz9!62FR(y~QF;g`apVlE!782$<6~
zGb?%fP$H*VwSt8a2A;cwl5`DFBRRPf{{Z}};zakB=ro+xw}YtU8NBstO+>fJ)sNuf
zKt-T~-kZndhPTbk>Lcjdx+fh!`AE*S`U`M-_?wM}9QTqMxrNJ%@)|Cw&vY}Kbe{JE
zKvu*?5yv5<%N;aU8nU~l!r8>2bJc5yV4av{cLebIDe8$EQ3S*Mfacz_P0kQOX&9un
z3o#-=eNr{oD}4 yXjtl aE
z-j}yQcoC4=#~y1R1eX&dP*HrXEJ1lz1G_GNfAt_YN+)8wM15q3nQlyvVSdYYIQdz_$6^-^>4*UyC2fH4TV
zT6Z-8gm#(F#@{Cj)haBJmRA#*KE>+`IKL<}FWz;C`ZDXqF(yme>
zEBh7mXewCJGgJ!9ozA*lOk=W`fy>y)9DEzZH&qKFw}=KfDU}O(X_mQZT`X#IIFmeS
z^Rs=E7E`1+yCI9)>vNk&kKVr|9+L^|ksTz{-fe?CU<)U68|fS`EykWzd$kO*jX+SQ
z0S)idd3^tST_1vb0eBgtHP-SO@xEZdj&wh&ZX!6OjJ0@>L<2Vk0NrA<7o$KYjNsMw
z&vzBF#oT-!oPScHJG!qsnk78rOZz|Cd|H0~^l7``RSyogiiU2EeDR!gWcZkTF@(Q&Yi{7&<|~gFGCE};i)C@F
_JahjfS{B}hrS>H5y)=bUrTz0dvWK9@fLHhZl#*PP@18e@b$q{0L#
ztv>shMUR^XZf*8+#N21ub9R@A?IgmQz)Qv27q~tUK)l_+#Q+NlULwa6{7sG1JeRw}
zLP;pl?)0;42wi*m^Md0N=~>4PSCiYr
zNZ_;x5q`#DJ~|hBiR9U#XMQIYFr{uJ$bmGd)ry$>JGdqr6HX+Rfpo8!Rg&
zJgG>d070B@bjOcwDSTHZ!b3J3>U*UeTZoS5wpyz0gwKuICK{36wS`9MJO%A0iGobU
zIDMjBcE!ViZ$EVSkwDGLMI|4DdRISqa&rT&!DspmskaX=Ic%YZ*Elx@{+=+*oCb
zQ$sGxc3AMIMaY$5^)qI*5|v
z9ZG%U^`ATgLERunAQ!2PVzapwvF4I$zVPmA3!%(l^=t$!WkKc0)T
z^S=(^?xE@hm+_AQ`H!!5zv1g*E2MAhj`no3wpI0l(>zPK8W))>Znjn)Xtx_^w9`Lt
zlg`cm1o%oa(AqBt)boBm_k-iu^fUEiD;!
zl)Hx&%Gy?4MV<@B=c0pyjf}{hOJc$jBEo`VckW0FN{EPC2}((di3!?@iHizLNr~D@
zi-`X7{VHf{Pr@wt=lgB`58toj<^ZeE%IUxSIfS)Im_9Ps9Ngi?`u=0}7}&c0<2xq@
z&Ob9o#>$#dBIUWP2~)t