From a3522082d867fa12d4a143d0ae081a0ce739998a Mon Sep 17 00:00:00 2001 From: Pin-alternative Date: Mon, 3 Oct 2022 13:18:05 +1100 Subject: [PATCH 01/74] init --- code/game/machinery/limbgrower.dm | 2 +- code/modules/arousal/genitals.dm | 7 +- code/modules/arousal/organs/breasts.dm | 87 +++++++++---------- .../chemistry/reagents/enlargement.dm | 9 +- .../code/modules/arousal/organs/breasts.dm | 4 +- 5 files changed, 52 insertions(+), 57 deletions(-) diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm index 90408870a7..f004a4efca 100644 --- a/code/game/machinery/limbgrower.dm +++ b/code/game/machinery/limbgrower.dm @@ -330,7 +330,7 @@ var/obj/item/organ/genital/breasts/boobs = new(loc) if(features["has_breasts"]) boobs.color = sanitize_hexcolor(features["breasts_color"], 6, TRUE) - boobs.size = features["breasts_size"] + boobs.size = boobs.breast_values[features["breasts_size"]] boobs.shape = features["breasts_shape"] if(!features["breasts_producing"]) boobs.genital_flags &= ~(GENITAL_FUID_PRODUCTION|CAN_CLIMAX_WITH|CAN_MASTURBATE_WITH) diff --git a/code/modules/arousal/genitals.dm b/code/modules/arousal/genitals.dm index aa8858508b..603e29aa1a 100644 --- a/code/modules/arousal/genitals.dm +++ b/code/modules/arousal/genitals.dm @@ -10,7 +10,7 @@ var/arousal_verb = "You feel aroused" var/unarousal_verb = "You no longer feel aroused" var/fluid_transfer_factor = 0 //How much would a partner get in them if they climax using this? - var/size = 2 //can vary between num or text, just used in icon_state strings + var/size = 2 var/datum/reagent/fluid_id = null var/fluid_max_volume = 50 var/fluid_efficiency = 1 @@ -36,6 +36,9 @@ /obj/item/organ/genital/on_life() return +/obj/item/organ/genital/proc/size_to_state() + return size + /obj/item/organ/genital/proc/set_aroused_state(new_state,cause = "manual toggle") if(!(genital_flags & GENITAL_CAN_AROUSE)) return FALSE @@ -323,7 +326,7 @@ var/obj/item/organ/genital/G = A var/datum/sprite_accessory/S - var/size = G.size + var/size = G.size_to_state() switch(G.type) if(/obj/item/organ/genital/penis) S = GLOB.cock_shapes_list[G.shape] diff --git a/code/modules/arousal/organs/breasts.dm b/code/modules/arousal/organs/breasts.dm index 53892b24d8..b447e616fe 100644 --- a/code/modules/arousal/organs/breasts.dm +++ b/code/modules/arousal/organs/breasts.dm @@ -8,7 +8,7 @@ icon = 'icons/obj/genitals/breasts.dmi' zone = BODY_ZONE_CHEST slot = ORGAN_SLOT_BREASTS - size = BREASTS_SIZE_DEF // "c". Refer to the breast_values static list below for the cups associated number values + size = 3 fluid_id = /datum/reagent/consumable/milk fluid_rate = MILK_RATE shape = DEF_BREASTS_SHAPE @@ -20,18 +20,12 @@ fluid_transfer_factor = 0.5 layer_index = BREASTS_LAYER_INDEX var/static/list/breast_values = list("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5, "f" = 6, "g" = 7, "h" = 8, "i" = 9, "j" = 10, "k" = 11, "l" = 12, "m" = 13, "n" = 14, "o" = 15, "huge" = 16, "massive" = 17, "giga" = 25, "impossible" = 30, "flat" = 0) - var/cached_size //these two vars pertain size modifications and so should be expressed in NUMBERS. var/prev_size //former cached_size value, to allow update_size() to early return should be there no significant changes. -/obj/item/organ/genital/breasts/Initialize(mapload, do_update = TRUE) - if(do_update) - cached_size = breast_values[size] - prev_size = cached_size - return ..() - /obj/item/organ/genital/breasts/update_appearance() . = ..() var/lowershape = lowertext(shape) + var/size_state = size_to_state() switch(lowershape) if("pair") desc = "You see a pair of breasts." @@ -41,13 +35,13 @@ desc = "You see three sets of breasts, running from their chest to their belly." else desc = "You see some breasts, they seem to be quite exotic." - if(size == "huge") - desc = "You see [pick("some serious honkers", "a real set of badonkers", "some dobonhonkeros", "massive dohoonkabhankoloos", "two big old tonhongerekoogers", "a couple of giant bonkhonagahoogs", "a pair of humongous hungolomghnonoloughongous")]. Their volume is way beyond cupsize now, measuring in about [round(cached_size*(owner ? get_size(owner) : 1))]cm in diameter." + if(size_state == "huge") + desc = "You see [pick("some serious honkers", "a real set of badonkers", "some dobonhonkeros", "massive dohoonkabhankoloos", "two big old tonhongerekoogers", "a couple of giant bonkhonagahoogs", "a pair of humongous hungolomghnonoloughongous")]. Their volume is way beyond cupsize now, measuring in about [round(size*(owner ? get_size(owner) : 1))]cm in diameter." else - if (size == "flat") + if (size_state == "flat") desc += " They're very small and flatchested, however." else - desc += " You estimate that they're [uppertext(size)]-cups." + desc += " You estimate that they're [uppertext(size_state)]-cups." if((genital_flags & GENITAL_FUID_PRODUCTION) && aroused_state) var/datum/reagent/R = GLOB.chemical_reagents_list[fluid_id] @@ -55,7 +49,7 @@ desc += " They're leaking [lowertext(R.name)]." var/datum/sprite_accessory/S = GLOB.breasts_shapes_list[shape] var/icon_shape = S ? S.icon_state : "pair" - var/icon_size = clamp(breast_values[size], BREASTS_ICON_MIN_SIZE, BREASTS_ICON_MAX_SIZE) + var/icon_size = clamp(breast_values[size_state], BREASTS_ICON_MIN_SIZE, BREASTS_ICON_MAX_SIZE) icon_state = "breasts_[icon_shape]_[icon_size]" if(owner) if(owner.dna.species.use_skintones && owner.dna.features["genitals_use_skintone"]) @@ -74,45 +68,49 @@ //this is far too lewd wah /obj/item/organ/genital/breasts/modify_size(modifier, min = -INFINITY, max = INFINITY) - var/new_value = clamp(cached_size + modifier, min, max) - if(new_value == cached_size) + var/new_value = clamp(size + modifier, min, max) + if(new_value == size) return - prev_size = cached_size - cached_size = new_value + prev_size = size + size = new_value update() ..() +/obj/item/organ/genital/breasts/size_to_state() + var/str_size + switch(size) + if(0) //flatchested + str_size = "flat" + if(1 to 8) //modest + str_size = breast_values[size] + if(9 to 15) //massive + str_size = breast_values[size] + if(16 to 17) //ridiculous + str_size = breast_values[size] + if(18 to 24) //AWOOOOGAAAAAAA + str_size = "massive" + if(25 to 29) //AWOOOOOOGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + str_size = "giga" + if(30 to INFINITY) //AWWWWWWWWWWWWWOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOGGGGGAAAAAAAAAAAAAAAAAAAAAA + str_size = "impossible" + return str_size + /obj/item/organ/genital/breasts/update_size()//wah - var/rounded_cached = round(cached_size) - if(cached_size < 0)//I don't actually know what round() does to negative numbers, so to be safe!!fixed + var/rounded_size = round(size) + var/size_state = size_to_state() + if(rounded_size < 0)//I don't actually know what round() does to negative numbers, so to be safe!!fixed if(owner) to_chat(owner, "You feel your breasts shrinking away from your body as your chest flattens out.") QDEL_IN(src, 1) return - switch(rounded_cached) - if(0) //flatchested - size = "flat" - if(1 to 8) //modest - size = breast_values[rounded_cached] - if(9 to 15) //massive - size = breast_values[rounded_cached] - if(16 to 17) //ridiculous - size = breast_values[rounded_cached] - if(18 to 24) //AWOOOOGAAAAAAA - size = "massive" - if(25 to 29) //AWOOOOOOGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - size = "giga" - if(30 to INFINITY) //AWWWWWWWWWWWWWOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOGGGGGAAAAAAAAAAAAAAAAAAAAAA - size = "impossible" - - if((rounded_cached < 18 || rounded_cached == 25 || rounded_cached == 30) && owner )//Because byond doesn't count from 0, I have to do this. + if((rounded_size < 18 || rounded_size == 25 || rounded_size == 30) && owner )//Because byond doesn't count from 0, I have to do this. var/mob/living/carbon/human/H = owner var/r_prev_size = round(prev_size) - if (rounded_cached > r_prev_size) - to_chat(H, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a [uppertext(size)]-cup.") - else if (rounded_cached < r_prev_size) - to_chat(H, "Your breasts [pick("shrink down to", "decrease into", "diminish into", "deflate into", "shrivel regretfully into", "contracts into")] a [uppertext(size)]-cup.") + if (rounded_size > r_prev_size) + to_chat(H, "Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a [uppertext(size_state)]-cup.") + else if (rounded_size < r_prev_size) + to_chat(H, "Your breasts [pick("shrink down to", "decrease into", "diminish into", "deflate into", "shrivel regretfully into", "contracts into")] a [uppertext(size_state)]-cup.") /obj/item/organ/genital/breasts/get_features(mob/living/carbon/human/H) var/datum/dna/D = H.dna @@ -120,16 +118,11 @@ color = SKINTONE2HEX(H.skin_tone) else color = "#[D.features["breasts_color"]]" - size = D.features["breasts_size"] + size = breast_values[D.features["breasts_size"]] shape = D.features["breasts_shape"] if(!D.features["breasts_producing"]) genital_flags &= ~ (GENITAL_FUID_PRODUCTION|CAN_CLIMAX_WITH|CAN_MASTURBATE_WITH) - if(!isnum(size)) - cached_size = breast_values[size] - else - cached_size = size - size = breast_values[size] - prev_size = cached_size + prev_size = size toggle_visibility(D.features["breasts_visibility"], FALSE) if(D.features["breasts_stuffing"]) toggle_visibility(GEN_ALLOW_EGG_STUFFING, FALSE) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm index 24b0fc0a76..2105c7debe 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm @@ -68,8 +68,7 @@ B.color = "#[M.dna.features["breasts_color"]]" else B.color = SKINTONE2HEX(H.skin_tone) - B.size = "flat" - B.cached_size = 0 + B.size = 0 B.prev_size = 0 to_chat(H, "Your chest feels warm, tingling with newfound sensitivity.") H.reagents.remove_reagent(type, 5) @@ -148,9 +147,9 @@ var/optimal_size = B.breast_values[M.dna.features["breasts_size"]] if(!optimal_size)//Fast fix for those who don't want it. B.modify_size(-0.1) - else if(B.cached_size > optimal_size) + else if(B.size > optimal_size) B.modify_size(-0.05, optimal_size) - else if(B.cached_size < optimal_size) + else if(B.size < optimal_size) B.modify_size(0.05, 0, optimal_size) return ..() @@ -238,7 +237,7 @@ if(B) B.modify_size(-0.05) - if(V && (!B || B.cached_size <= 0)) + if(V && (!B || B.size <= 0)) qdel(V) if(W && (!B || B.size <= 0)) qdel(W) diff --git a/modular_splurt/code/modules/arousal/organs/breasts.dm b/modular_splurt/code/modules/arousal/organs/breasts.dm index c815295e28..60d2d7eab1 100644 --- a/modular_splurt/code/modules/arousal/organs/breasts.dm +++ b/modular_splurt/code/modules/arousal/organs/breasts.dm @@ -13,8 +13,8 @@ fluid_id = initial(fluid_id) original_fluid_id = fluid_id . = ..() - fluid_max_volume += ((cached_size - breast_values[initial(size)])*2.5)*(owner ? get_size(owner) : 1) - fluid_rate += ((cached_size - breast_values[initial(size)])/10)*(owner ? get_size(owner) : 1) + fluid_max_volume += ((size - breast_values[initial(size)])*2.5)*(owner ? get_size(owner) : 1) + fluid_rate += ((size - breast_values[initial(size)])/10)*(owner ? get_size(owner) : 1) /obj/item/organ/genital/breasts/climax_modify_size(mob/living/partner, obj/item/organ/genital/source_gen) if(!(owner.client?.prefs.cit_toggles & BREAST_ENLARGEMENT)) From d57be2341108cae83f0f8bf7169037c5c5d4c913 Mon Sep 17 00:00:00 2001 From: Pin-alternative Date: Sun, 23 Oct 2022 16:53:39 +1100 Subject: [PATCH 02/74] sizes rework --- code/__HELPERS/mobs.dm | 2 +- code/game/machinery/limbgrower.dm | 2 +- code/modules/arousal/organs/breasts.dm | 11 +++--- code/modules/client/preferences.dm | 35 ++++++++++++++++++- code/modules/client/preferences_savefile.dm | 24 ++++++++++--- .../human/innate_abilities/customization.dm | 2 +- .../chemistry/reagents/enlargement.dm | 2 +- .../interaction_datums/lewd/breasts.dm | 4 +-- .../interaction_datums/lewd/nipsuck.dm | 12 +++---- .../interaction_datums/lewd/self/breasts.dm | 4 +-- .../code/_globalvars/lists/global_lewd.dm | 2 ++ .../code/game/machinery/research_table.dm | 2 +- .../code/modules/arousal/organs/breasts.dm | 4 +-- 13 files changed, 77 insertions(+), 29 deletions(-) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 4e3677f2f9..2e41244331 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -203,7 +203,7 @@ "balls_efficiency" = CUM_EFFICIENCY, "has_breasts" = FALSE, "breasts_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), - "breasts_size" = pick(CONFIG_GET(keyed_list/breasts_cups_prefs)), + "breasts_size" = pick(GLOB.breast_values), "breasts_shape" = DEF_BREASTS_SHAPE, "breasts_producing" = FALSE, "has_vag" = FALSE, diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm index f004a4efca..c3ce5732ab 100644 --- a/code/game/machinery/limbgrower.dm +++ b/code/game/machinery/limbgrower.dm @@ -330,7 +330,7 @@ var/obj/item/organ/genital/breasts/boobs = new(loc) if(features["has_breasts"]) boobs.color = sanitize_hexcolor(features["breasts_color"], 6, TRUE) - boobs.size = boobs.breast_values[features["breasts_size"]] + boobs.size = GLOB.breast_values[features["breasts_size"]] boobs.shape = features["breasts_shape"] if(!features["breasts_producing"]) boobs.genital_flags &= ~(GENITAL_FUID_PRODUCTION|CAN_CLIMAX_WITH|CAN_MASTURBATE_WITH) diff --git a/code/modules/arousal/organs/breasts.dm b/code/modules/arousal/organs/breasts.dm index b447e616fe..8788b2c219 100644 --- a/code/modules/arousal/organs/breasts.dm +++ b/code/modules/arousal/organs/breasts.dm @@ -19,7 +19,6 @@ orgasm_verb = "leaking" fluid_transfer_factor = 0.5 layer_index = BREASTS_LAYER_INDEX - var/static/list/breast_values = list("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5, "f" = 6, "g" = 7, "h" = 8, "i" = 9, "j" = 10, "k" = 11, "l" = 12, "m" = 13, "n" = 14, "o" = 15, "huge" = 16, "massive" = 17, "giga" = 25, "impossible" = 30, "flat" = 0) var/prev_size //former cached_size value, to allow update_size() to early return should be there no significant changes. /obj/item/organ/genital/breasts/update_appearance() @@ -49,7 +48,7 @@ desc += " They're leaking [lowertext(R.name)]." var/datum/sprite_accessory/S = GLOB.breasts_shapes_list[shape] var/icon_shape = S ? S.icon_state : "pair" - var/icon_size = clamp(breast_values[size_state], BREASTS_ICON_MIN_SIZE, BREASTS_ICON_MAX_SIZE) + var/icon_size = clamp(GLOB.breast_values[size_state], BREASTS_ICON_MIN_SIZE, BREASTS_ICON_MAX_SIZE) icon_state = "breasts_[icon_shape]_[icon_size]" if(owner) if(owner.dna.species.use_skintones && owner.dna.features["genitals_use_skintone"]) @@ -82,11 +81,11 @@ if(0) //flatchested str_size = "flat" if(1 to 8) //modest - str_size = breast_values[size] + str_size = GLOB.breast_values[size] if(9 to 15) //massive - str_size = breast_values[size] + str_size = GLOB.breast_values[size] if(16 to 17) //ridiculous - str_size = breast_values[size] + str_size = GLOB.breast_values[size] if(18 to 24) //AWOOOOGAAAAAAA str_size = "massive" if(25 to 29) //AWOOOOOOGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA @@ -118,7 +117,7 @@ color = SKINTONE2HEX(H.skin_tone) else color = "#[D.features["breasts_color"]]" - size = breast_values[D.features["breasts_size"]] + size = GLOB.breast_values[D.features["breasts_size"]] shape = D.features["breasts_shape"] if(!D.features["breasts_producing"]) genital_flags &= ~ (GENITAL_FUID_PRODUCTION|CAN_CLIMAX_WITH|CAN_MASTURBATE_WITH) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 0f52662689..b8b81090a4 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -895,6 +895,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) tauric_shape = TRUE dat += "Penis Shape: [features["cock_shape"]][tauric_shape ? " (Taur)" : ""]" dat += "Penis Length: [features["cock_length"]] inch(es)" + dat += "Max Size:[features["cock_max_length"]]" dat += "Diameter Ratio: [features["cock_diameter_ratio"]]" dat += "Penis Visibility:[features["cock_visibility"]]" dat += "Egg Stuffing:[features["cock_stuffing"] == TRUE ? "Yes" : "No"]" @@ -906,6 +907,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) else dat += "Testicles Color:
" dat += "#[features["balls_color"]] Change
" + dat += "Max Size:[features["balls_max_size"]]" dat += "Testicles Shape: [features["balls_shape"]]" dat += "Testicles Visibility:[features["balls_visibility"]]" dat += "Egg Stuffing:[features["balls_stuffing"] == TRUE ? "Yes" : "No"]" @@ -949,6 +951,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Color:
" dat += "#[features["breasts_color"]] Change
" dat += "Cup Size:[features["breasts_size"]]" + dat += "Max Size:[features["breasts_max_size"]]" dat += "Breasts Shape:[features["breasts_shape"]]" dat += "Breasts Visibility:[features["breasts_visibility"]]" dat += "Lactates:[features["breasts_producing"] == TRUE ? "Yes" : "No"]" @@ -972,6 +975,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Color:
" dat += "#[features["butt_color"]] Change
" dat += "Butt Size:[features["butt_size"]]" + dat += "Max Size:[features["butt_max_size"]]" dat += "Butt Visibility:[features["butt_visibility"]]" dat += "Egg Stuffing:[features["butt_stuffing"] == TRUE ? "Yes" : "No"]" dat += "" @@ -986,6 +990,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Color:
" dat += "#[features["belly_color"]] Change
" dat += "Belly Size:[features["belly_size"]]" + dat += "Max Size:[features["belly_max_size"]]" dat += "Belly Visibility:[features["belly_visibility"]]" dat += "Egg Stuffing:[features["belly_stuffing"] == TRUE ? "Yes" : "No"]" dat += "" @@ -2761,7 +2766,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) features["balls_fluid"] = new_fluid.type if("breasts_size") - var/new_size = input(user, "Breast Size", "Character Preference") as null|anything in CONFIG_GET(keyed_list/breasts_cups_prefs) + var/new_size = input(user, "Breast Size", "Character Preference") as null|anything in GLOB.breast_values if(new_size) features["breasts_size"] = new_size @@ -2875,6 +2880,34 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(n_vis) features["belly_visibility"] = n_vis + if("cock_max_length") + var/max_B = CONFIG_GET(number/penis_max_inches_prefs) + var/new_size = input(user, "Max size:\n([features["cock_length"]]-[max_B])", "Character Preference") as num|null + if(new_size) + features["cock_max_length"] = clamp(round(new_size), features["cock_length"], max_B) + + if("balls_max_size") + var/new_size = input(user, "Max size:\n([BALLS_SIZE_MIN]-[BALLS_SIZE_MAX])", "Character Preference") as num|null + if(new_size) + features["balls_max_size"] = clamp(round(new_size), BALLS_SIZE_MIN, BALLS_SIZE_MAX) + + if("breasts_max_size") + var/new_size = input(user, "Breast Size", "Character Preference") as null|anything in GLOB.breast_values + if(new_size) + features["max_breasts_size"] = new_size + + if("belly_max_size") + var/max_B = CONFIG_GET(number/belly_max_size_prefs) + var/new_size = input(user, "Max size:\n([features["belly_size"]]-[max_B])", "Character Preference") as num|null + if(new_size) + features["belly_max_size"] = clamp(round(new_size), features["belly_size"], max_B) + + if("butt_max_size") + var/max_B = CONFIG_GET(number/butt_max_size_prefs) + var/new_size = input(user, "Max size:\n([features["butt_size"]]-[max_B])", "Character Preference") as num|null + if(new_size) + features["butt_max_size"] = clamp(round(new_size), features["butt_size"], max_B) + if("ooccolor") var/new_ooccolor = input(user, "Choose your OOC colour:", "Game Preference",ooccolor) as color|null if(new_ooccolor) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index e99788c23f..933cb69270 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -737,6 +737,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car "has_cock" = FALSE, "cock_shape" = DEF_COCK_SHAPE, "cock_length" = COCK_SIZE_DEF, +"cock_max_length" = COCK_SIZE_DEF * 3, "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF, "cock_color" = "ffffff", "cock_taur" = FALSE, @@ -744,12 +745,14 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car "balls_color" = "ffffff", "balls_shape" = DEF_BALLS_SHAPE, "balls_size" = BALLS_SIZE_DEF, +"balls_max_size" = BALLS_SIZE_DEF * 3, "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_max_size" = 9, "breasts_shape" = DEF_BREASTS_SHAPE, "breasts_producing" = FALSE, "has_vag" = FALSE, @@ -759,7 +762,9 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car "has_butt" = FALSE, "butt_color" = "ffffff", "butt_size" = BUTT_SIZE_DEF, +"butt_max_size" = BUTT_SIZE_DEF * 3, "belly_size" = BELLY_SIZE_DEF, +"belly_max_size" = BELLY_SIZE_DEF * 3, "has_belly" = FALSE, "belly_color" = "ffffff", "balls_visibility" = GEN_VISIBLE_NO_UNDIES, @@ -1015,6 +1020,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["feature_belly_stuffing"] >> features["belly_stuffing"] S["feature_inert_eggs"] >> features["inert_eggs"] + S["features_cock_max_length"] >> features["cock_max_length"] + S["features_balls_max_size"] >> features["balls_max_size"] + S["features_breasts_max_size"] >> features["breasts_max_size"] + S["features_belly_max_size"] >> features["belly_max_size"] + S["features_butt_max_size"] >> features["butt_max_size"] + var/char_vr_path = "[vr_path]/character_[default_slot]_v2.json" if(fexists(char_vr_path)) var/list/json_from_file = json_decode(file2text(char_vr_path)) @@ -1106,10 +1117,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car size_max = CONFIG_GET(number/body_size_max) features["body_size"] = sanitize_num_clamp(features["body_size"], size_min, size_max, RESIZE_DEFAULT_SIZE, 0.01) - var/static/list/B_sizes - if(!B_sizes) - var/list/L = CONFIG_GET(keyed_list/breasts_cups_prefs) - B_sizes = L.Copy() var/static/min_D if(!min_D) min_D = CONFIG_GET(number/penis_min_inches_prefs) @@ -1141,7 +1148,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car var/list/L = CONFIG_GET(keyed_list/safe_visibility_toggles) safe_visibilities = L.Copy() - features["breasts_size"] = sanitize_inlist(features["breasts_size"], B_sizes, BREASTS_SIZE_DEF) + features["breasts_size"] = sanitize_inlist(features["breasts_size"], GLOB.breast_values, BREASTS_SIZE_DEF) features["cock_length"] = sanitize_integer(features["cock_length"], min_D, max_D, COCK_SIZE_DEF) features["cock_diameter_ratio"] = sanitize_integer(features["cock_diameter_ratio"], min_diameter_ratio, max_diameter_ratio, COCK_DIAMETER_RATIO_DEF) features["butt_size"] = sanitize_integer(features["butt_size"], min_B, max_B, BUTT_SIZE_DEF) @@ -1365,6 +1372,13 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["feature_inert_eggs"], features["inert_eggs"]) + + WRITE_FILE(S["features_cock_max_length"], features["cock_max_length"]) + WRITE_FILE(S["features_balls_max_size"], features["balls_max_size"]) + WRITE_FILE(S["features_breasts_max_size"], features["breasts_max_size"]) + WRITE_FILE(S["features_belly_max_size"], features["belly_max_size"]) + WRITE_FILE(S["features_butt_max_size"], features["butt_max_size"]) + WRITE_FILE(S["feature_neckfire"], features["neckfire"]) WRITE_FILE(S["feature_neckfire_color"], features["neckfire_color"]) diff --git a/code/modules/mob/living/carbon/human/innate_abilities/customization.dm b/code/modules/mob/living/carbon/human/innate_abilities/customization.dm index 361ba78a3a..c0f53faaff 100644 --- a/code/modules/mob/living/carbon/human/innate_abilities/customization.dm +++ b/code/modules/mob/living/carbon/human/innate_abilities/customization.dm @@ -229,7 +229,7 @@ else if (select_alteration == "Breast Size") for(var/obj/item/organ/genital/breasts/X in H.internal_organs) qdel(X) - var/new_size = input(owner, "Breast Size", "Genital Alteration") as null|anything in CONFIG_GET(keyed_list/breasts_cups_prefs) + var/new_size = input(owner, "Breast Size", "Genital Alteration") as null|anything in GLOB.breast_values if(new_size) H.dna.features["breasts_size"] = new_size H.update_genitals() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm index 2105c7debe..8f0e3d00d7 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm @@ -144,7 +144,7 @@ var/obj/item/organ/genital/breasts/B = M.getorganslot(ORGAN_SLOT_BREASTS) if(!B) return..() - var/optimal_size = B.breast_values[M.dna.features["breasts_size"]] + var/optimal_size = GLOB.breast_values[M.dna.features["breasts_size"]] if(!optimal_size)//Fast fix for those who don't want it. B.modify_size(-0.1) else if(B.size > optimal_size) diff --git a/modular_sand/code/datums/interactions/interaction_datums/lewd/breasts.dm b/modular_sand/code/datums/interactions/interaction_datums/lewd/breasts.dm index 6fdd1df0c8..7f31dd22fb 100644 --- a/modular_sand/code/datums/interactions/interaction_datums/lewd/breasts.dm +++ b/modular_sand/code/datums/interactions/interaction_datums/lewd/breasts.dm @@ -41,8 +41,8 @@ if("f", "g", "h") modifier = 3 else - if(milkers.size in milkers.breast_values) - modifier = clamp(milkers.breast_values[milkers.size] - 5, 0, INFINITY) + if(milkers.size in GLOB.breast_values) + modifier = clamp(GLOB.breast_values[milkers.size] - 5, 0, INFINITY) else modifier = 1 target.reagents.add_reagent(milktype, rand(1,3 * modifier)) diff --git a/modular_sand/code/datums/interactions/interaction_datums/lewd/nipsuck.dm b/modular_sand/code/datums/interactions/interaction_datums/lewd/nipsuck.dm index 617821e111..d9119af328 100644 --- a/modular_sand/code/datums/interactions/interaction_datums/lewd/nipsuck.dm +++ b/modular_sand/code/datums/interactions/interaction_datums/lewd/nipsuck.dm @@ -22,8 +22,8 @@ if("f", "g", "h") modifier = 3 else - if(B.size in B.breast_values) - modifier = clamp(B.breast_values[B.size] - 5, 0, INFINITY) + if(B.size in GLOB.breast_values) + modifier = clamp(GLOB.breast_values[B.size] - 5, 0, INFINITY) else modifier = 1 if(B.fluid_id) @@ -42,8 +42,8 @@ if("f", "g", "h") modifier = 3 else - if(B.size in B.breast_values) - modifier = clamp(B.breast_values[B.size] - 5, 0, INFINITY) + if(B.size in GLOB.breast_values) + modifier = clamp(GLOB.breast_values[B.size] - 5, 0, INFINITY) else modifier = 1 if(B.fluid_id) @@ -63,8 +63,8 @@ if("f", "g", "h") modifier = 3 else - if(B.size in B.breast_values) - modifier = clamp(B.breast_values[B.size] - 5, 0, INFINITY) + if(B.size in GLOB.breast_values) + modifier = clamp(GLOB.breast_values[B.size] - 5, 0, INFINITY) else modifier = 1 if(B.fluid_id) diff --git a/modular_sand/code/datums/interactions/interaction_datums/lewd/self/breasts.dm b/modular_sand/code/datums/interactions/interaction_datums/lewd/self/breasts.dm index f4d4599d3d..544e5a8bab 100644 --- a/modular_sand/code/datums/interactions/interaction_datums/lewd/self/breasts.dm +++ b/modular_sand/code/datums/interactions/interaction_datums/lewd/self/breasts.dm @@ -79,8 +79,8 @@ if("f", "g", "h") modifier = 3 else - if(milkers.size in milkers.breast_values) - modifier = clamp(milkers.breast_values[milkers.size] - 5, 0, INFINITY) + if(milkers.size in GLOB.breast_values) + modifier = clamp(GLOB.breast_values[milkers.size] - 5, 0, INFINITY) else modifier = 1 user.reagents.add_reagent(milktype, rand(1,3 * modifier)) diff --git a/modular_splurt/code/_globalvars/lists/global_lewd.dm b/modular_splurt/code/_globalvars/lists/global_lewd.dm index 77b051c103..7883a8ecb4 100644 --- a/modular_splurt/code/_globalvars/lists/global_lewd.dm +++ b/modular_splurt/code/_globalvars/lists/global_lewd.dm @@ -15,3 +15,5 @@ GLOBAL_LIST_INIT(breast_nouns, list("breasts", "boobs", "honkers", "tatas", "tid GLOBAL_LIST_INIT(balls_nouns, list("balls", "nuts", "ballsack", "testicles", "sack", "cum orbs", "cum spheres", "cum tanks", "cum holders", "cum churners", "spunk orbs", "spunk spheres", "spunk tanks", "spunk holders", "spunk churners", "nut orbs", "nut spheres", "nut tanks", "nut holders", "nut churners", "jizz orbs", "jizz spheres", "jizz tanks", "jizz holders", "jizz churners", "seed orbs", "seed spheres", "seed tanks", "seed holders", "seed churners")) GLOBAL_LIST_INIT(butt_nouns, list("ass", "butt", "dumptruck", "tush", "badonk", "booty", "rump", "behind")) + +GLOBAL_LIST_INIT(breast_values, list("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5, "f" = 6, "g" = 7, "h" = 8, "i" = 9, "j" = 10, "k" = 11, "l" = 12, "m" = 13, "n" = 14, "o" = 15, "huge" = 16, "massive" = 17, "giga" = 25, "impossible" = 30, "flat" = 0)) diff --git a/modular_splurt/code/game/machinery/research_table.dm b/modular_splurt/code/game/machinery/research_table.dm index 19b1e9f3a0..9c317e3e60 100644 --- a/modular_splurt/code/game/machinery/research_table.dm +++ b/modular_splurt/code/game/machinery/research_table.dm @@ -139,7 +139,7 @@ for(var/obj/item/organ/genital/genital in buckled_mob.internal_organs) if(istype(genital, /obj/item/organ/genital/breasts)) var/obj/item/organ/genital/breasts/breasts = genital - points_awarded += breasts.fluid_rate + breasts.breast_values[breasts.size] // Breasts use letters instead of numbers! + points_awarded += breasts.fluid_rate + GLOB.breast_values[breasts.size] continue points_awarded += genital.fluid_rate + genital.size points_awarded *= tier diff --git a/modular_splurt/code/modules/arousal/organs/breasts.dm b/modular_splurt/code/modules/arousal/organs/breasts.dm index 60d2d7eab1..a4f3688d00 100644 --- a/modular_splurt/code/modules/arousal/organs/breasts.dm +++ b/modular_splurt/code/modules/arousal/organs/breasts.dm @@ -13,8 +13,8 @@ fluid_id = initial(fluid_id) original_fluid_id = fluid_id . = ..() - fluid_max_volume += ((size - breast_values[initial(size)])*2.5)*(owner ? get_size(owner) : 1) - fluid_rate += ((size - breast_values[initial(size)])/10)*(owner ? get_size(owner) : 1) + fluid_max_volume += ((size - initial(size))*2.5)*(owner ? get_size(owner) : 1) + fluid_rate += ((size - initial(size))/10)*(owner ? get_size(owner) : 1) /obj/item/organ/genital/breasts/climax_modify_size(mob/living/partner, obj/item/organ/genital/source_gen) if(!(owner.client?.prefs.cit_toggles & BREAST_ENLARGEMENT)) From 6f396825960baaf3a3b8fe21274da47321844afa Mon Sep 17 00:00:00 2001 From: Pin-alternative Date: Tue, 20 Dec 2022 21:17:50 +1100 Subject: [PATCH 03/74] ui --- .../datums/genitals/genitals_interface.dm | 175 ++++++++++++ tgstation.dme | 1 + tgui/packages/tgui/index.js | 1 + .../tgui/interfaces/GenitalConfig.tsx | 258 ++++++++++++++++++ tgui/packages/tgui/styles/themes/hotpink.scss | 54 ++++ 5 files changed, 489 insertions(+) create mode 100644 modular_splurt/code/datums/genitals/genitals_interface.dm create mode 100644 tgui/packages/tgui/interfaces/GenitalConfig.tsx create mode 100644 tgui/packages/tgui/styles/themes/hotpink.scss diff --git a/modular_splurt/code/datums/genitals/genitals_interface.dm b/modular_splurt/code/datums/genitals/genitals_interface.dm new file mode 100644 index 0000000000..544de853a4 --- /dev/null +++ b/modular_splurt/code/datums/genitals/genitals_interface.dm @@ -0,0 +1,175 @@ +/// Attempts to open the tgui menu +/mob/living/verb/configure_genitals() + set name = "Genitals Menu" + set desc = "Change your genital settings" + set category = "IC" + + if(!iscarbon(usr)) + return + if(!usr.mind) //Mindless boys, honestly just don't, it's better this way + return + if(!usr.mind.genitals_menu_holder) + usr.mind.genitals_menu_holder= new(usr.mind) + + usr.mind.genitals_menu_holder.ui_interact(usr) + +/datum/mind + var/datum/genitals_menu/genitals_menu_holder + +/datum/mind/New(key) + . = ..() + genitals_menu_holder = new(src) + +/datum/genitals_menu + +/datum/genitals_menu/ui_state(mob/user) + return GLOB.conscious_state + +/datum/genitals_menu/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "GenitalConfig", "Genitals") + ui.open() + + +/datum/genitals_menu/ui_data(mob/user) + . = ..() + var/mob/living/carbon/genital_holder = user + var/list/genitals = list() + for(var/obj/item/organ/genital/genital in genital_holder.internal_organs) //Only get the genitals + if(CHECK_BITFIELD(genital.genital_flags, GENITAL_INTERNAL)) //Not those though + continue + var/list/genital_entry = list() + genital_entry["name"] = "[capitalize(genital.name)]" //Prevents code from adding a prefix + genital_entry["key"] = REF(genital) //The key is the reference to the object + + genital_entry["description"] = genital.desc + "\n [genital.linked_organ ? "Linked organ: [genital.linked_organ.name]" : ""]" + + var/visibility = "Invalid" + if(CHECK_BITFIELD(genital.genital_flags, GENITAL_THROUGH_CLOTHES)) + visibility = "Always visible" + else if(CHECK_BITFIELD(genital.genital_flags, GENITAL_UNDIES_HIDDEN)) + visibility = "Hidden by underwear" + else if(CHECK_BITFIELD(genital.genital_flags, GENITAL_HIDDEN)) + visibility = "Always hidden" + else + visibility = "Hidden by clothes" + + var/extras = "None" + if(CHECK_BITFIELD(genital.genital_flags, GENITAL_CAN_STUFF)) + extras = "Allows egg stuffing" + + genital_entry["extras"] = extras + genital_entry["visibility"] = visibility + genital_entry["possible_choices"] = GLOB.genitals_visibility_toggles + genital_entry["extra_choices"] = list(GEN_ALLOW_EGG_STUFFING) + genital_entry["can_arouse"] = ( + !!CHECK_BITFIELD(genital.genital_flags, GENITAL_CAN_AROUSE) \ + && !(HAS_TRAIT(genital_holder, TRAIT_PERMABONER) \ + || HAS_TRAIT(genital_holder, TRAIT_NEVERBONER))) + genital_entry["arousal_state"] = genital.aroused_state + genital_entry["max_size"] = 5 //TODO + + + //fluids + if(CHECK_BITFIELD(genital.genital_flags, GENITAL_FUID_PRODUCTION)) + var/fluids = (clamp(genital.fluid_rate * ((world.time - genital.last_orgasmed) / (10 SECONDS)) * genital.fluid_mult, 0, genital.fluid_max_volume) / genital.fluid_max_volume) + genital_entry["fluid"] = fluids + + //equipments + if(genital.is_exposed()) + var/list/equipments = list() + for(var/obj/equipment in genital.contents) + var/list/equipment_entry = list() + equipment_entry["name"] = equipment.name + equipment_entry["key"] = REF(equipment) + equipments += list(equipment_entry) + genital_entry["possible_equipment_choices"] = GLOB.genitals_interactions + genital_entry["equipments"] = equipments + + genitals += list(genital_entry) + + if(!genital_holder.getorganslot(ORGAN_SLOT_ANUS)) + var/simulated_ass = list() + simulated_ass["name"] = "Anus" + simulated_ass["key"] = "anus" + var/visibility = "Invalid" + switch(genital_holder.anus_exposed) + if(1) + visibility = "Always visible" + if(0) + visibility = "Hidden by underwear" + else + visibility = "Always hidden" + simulated_ass["visibility"] = visibility + simulated_ass["possible_choices"] = GLOB.genitals_visibility_toggles - GEN_VISIBLE_NO_CLOTHES + genitals += list(simulated_ass) + .["genitals"] = genitals + +/datum/genitals_menu/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + if(..()) + return + switch(action) + if("genital") + var/mob/living/carbon/self = usr + if("visibility" in params) + if(params["genital"] == "anus") + self.anus_toggle_visibility(params["visibility"]) + return TRUE + var/obj/item/organ/genital/genital = locate(params["genital"], self.internal_organs) + if(genital && (genital in self.internal_organs)) + genital.toggle_visibility(params["visibility"]) + return TRUE + if("set_arousal" in params) + var/obj/item/organ/genital/genital = locate(params["genital"], self.internal_organs) + if(!genital || (genital \ + && (!CHECK_BITFIELD(genital.genital_flags, GENITAL_CAN_AROUSE) \ + || HAS_TRAIT(self, TRAIT_PERMABONER) \ + || HAS_TRAIT(self, TRAIT_NEVERBONER)))) + return FALSE + var/original_state = genital.aroused_state + genital.set_aroused_state(params["set_arousal"])// i'm not making it just `!aroused_state` because + if(original_state != genital.aroused_state) // someone just might port skyrat's new genitals + to_chat(self, "[genital.aroused_state ? genital.arousal_verb : genital.unarousal_verb].") + . = TRUE + else + to_chat(self, "You can't make that genital [genital.aroused_state ? "unaroused" : "aroused"]!") + . = FALSE + genital.update_appearance() + if(ishuman(self)) + var/mob/living/carbon/human/human = self + human.update_genitals() + return + else + return FALSE + if("equipment") + var/mob/living/carbon/self = usr + var/obj/item/organ/genital/genital = locate(params["genital"], self.internal_organs) + if(!(genital && (genital in self.internal_organs))) + return FALSE + switch(params["equipment_action"]) + if("remove") + var/obj/item/selected_item = locate(params["equipment"], genital.contents) + if(selected_item) + if(!do_mob(self, self, 5 SECONDS)) + return FALSE + if(!self.put_in_hands(selected_item)) + self.transferItemToLoc(get_turf(self)) + return TRUE + return FALSE + if("insert") + var/obj/item/stuff = self.get_active_held_item() + if(!istype(stuff)) + to_chat(self, span_warning("You need to hold an item to insert it!")) + return FALSE + stuff.insert_item_organ(self, self, genital) + if("sizes") + var/mob/living/carbon/self = usr + var/obj/item/organ/genital/genital = locate(params["genital"], self.internal_organs) + if(!(genital && (genital in self.internal_organs))) + return FALSE + //switch(params["action"]) + // if("max") + + + diff --git a/tgstation.dme b/tgstation.dme index 141d126ba2..98f7c67ed7 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -4312,6 +4312,7 @@ #include "modular_splurt\code\datums\elements\smalltalk.dm" #include "modular_splurt\code\datums\elements\spooky.dm" #include "modular_splurt\code\datums\elements\wuv.dm" +#include "modular_splurt\code\datums\genitals\genitals_interface.dm" #include "modular_splurt\code\datums\interactions\cuddling.dm" #include "modular_splurt\code\datums\interactions\rope.dm" #include "modular_splurt\code\datums\interactions\lewd\_lewd.dm" diff --git a/tgui/packages/tgui/index.js b/tgui/packages/tgui/index.js index 31251cc35b..bd6f3f5302 100644 --- a/tgui/packages/tgui/index.js +++ b/tgui/packages/tgui/index.js @@ -7,6 +7,7 @@ // Themes import './styles/main.scss'; import './styles/themes/abductor.scss'; +import './styles/themes/hotpink.scss'; import './styles/themes/cardtable.scss'; import './styles/themes/hackerman.scss'; import './styles/themes/malfunction.scss'; diff --git a/tgui/packages/tgui/interfaces/GenitalConfig.tsx b/tgui/packages/tgui/interfaces/GenitalConfig.tsx new file mode 100644 index 0000000000..d7df29eeec --- /dev/null +++ b/tgui/packages/tgui/interfaces/GenitalConfig.tsx @@ -0,0 +1,258 @@ + +import { filter } from 'common/collections'; +import { flow } from 'common/fp'; +import { createSearch } from 'common/string'; +import { useBackend, useLocalState } from '../backend'; +import { BlockQuote, Button, LabeledList, Icon, NumberInput, Input, Section, Table, Tabs, Stack, ProgressBar, Divider } from '../components'; +import { Window } from '../layouts'; + + +type GenitalInfo = { + genitals: GenitalData[]; +} + +type GenitalData = { + name: string, + key: string, + description: string, + visibility: string, + extras: string, + extra_choices: string[], + possible_choices: string[], + can_arouse: boolean, + arousal_state: boolean, + fluid: number, + possible_equipment_choices: string[], + equipments: Equipment[], +} + +type Equipment = { + name: string, + key: string, +} + +export const GenitalConfig = (props, context) => { + const { act, data } = useBackend(context); + const genitals = data.genitals || []; + const [tabIndex, setTabIndex] = useLocalState(context, 'tabIndex', 0) + return ( + + + {genitals.length ? ( + <> +
+ + + + {genitals.map((genital, index) => ( + setTabIndex(index)} + > + {genital.name} + + ))} + + + + {genitals[tabIndex].description} + + +
+
+ + + + +
+ Fluid level: + +
+
+ + + + + + + + + + +
+
+
+
+
act('equipment', { + genital: genitals[tabIndex].key, + equipment_action: "insert", + })} + /> + )} + > + +
+ + ) : ( +
+ You don't seem to have any genitals... + Or any that you could modify. +
+ ) + } +
+
+ ); +}; + +const SizeButtons = (props, context) => { + return ( +
+ + + + Max growth: + + + + + + Min shrink: + + + + +
+ ); +}; + +const ModeToIcon = { + "Always visible": "eye", + "Hidden by clothes": "tshirt", + "Hidden by underwear": "low-vision", + "Always hidden": "eye-slash", + "Allows egg stuffing": "egg", +}; + +const ToggleSettings = (props , context) => { + const [tabIndex] = useLocalState(context, 'tabIndex', 0) + const { act, data } = useBackend(context); + const genital = data.genitals[tabIndex]; + return ( + + {genital.possible_choices.map(choice => ( + +