diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm index 2b19610040..56d5c63833 100644 --- a/code/__DEFINES/citadel_defines.dm +++ b/code/__DEFINES/citadel_defines.dm @@ -34,6 +34,7 @@ #define CAN_MASTURBATE_WITH (1<<5) #define MASTURBATE_LINKED_ORGAN (1<<6) //used to pass our mission to the linked organ #define CAN_CLIMAX_WITH (1<<7) +#define GENITAL_CAN_AROUSE (1<<8) #define COCK_SIZE_MIN 1 #define COCK_SIZE_MAX 20 diff --git a/code/__HELPERS/_cit_helpers.dm b/code/__HELPERS/_cit_helpers.dm index c0acf4c5a5..1bde770045 100644 --- a/code/__HELPERS/_cit_helpers.dm +++ b/code/__HELPERS/_cit_helpers.dm @@ -57,14 +57,11 @@ GLOBAL_LIST_EMPTY(ipc_antennas_list) //Genitals and Arousal Lists GLOBAL_LIST_EMPTY(genitals_list) -GLOBAL_LIST_EMPTY(cock_shapes_list)//global_lists.dm for the list initializations //Now also _DATASTRUCTURES globals.dm -GLOBAL_LIST_EMPTY(cock_shapes_icons) //Associated list for names->icon_states for cockshapes. +GLOBAL_LIST_EMPTY(cock_shapes_list) GLOBAL_LIST_EMPTY(gentlemans_organ_names) GLOBAL_LIST_EMPTY(balls_shapes_list) -GLOBAL_LIST_EMPTY(balls_shapes_icons) GLOBAL_LIST_EMPTY(breasts_size_list) GLOBAL_LIST_EMPTY(breasts_shapes_list) -GLOBAL_LIST_EMPTY(breasts_shapes_icons) GLOBAL_LIST_EMPTY(vagina_shapes_list) GLOBAL_LIST_INIT(cum_into_containers_list, list(/obj/item/reagent_containers/food/snacks/pie)) //Yer fuggin snowflake name list jfc GLOBAL_LIST_INIT(dick_nouns, list("dick","cock","member","shaft")) diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index ff9d1bec4c..7045767f98 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -51,26 +51,15 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/antenna, GLOB.ipc_antennas_list, roundstart = TRUE) //genitals init_sprite_accessory_subtypes(/datum/sprite_accessory/penis, GLOB.cock_shapes_list) - for(var/K in GLOB.cock_shapes_list) - var/datum/sprite_accessory/penis/value = GLOB.cock_shapes_list[K] - GLOB.cock_shapes_icons[K] = value.icon_state - init_sprite_accessory_subtypes(/datum/sprite_accessory/vagina, GLOB.vagina_shapes_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/breasts, GLOB.breasts_shapes_list) + init_sprite_accessory_subtypes(/datum/sprite_accessory/testicles, GLOB.balls_shapes_list) GLOB.breasts_size_list = list ("a", "b", "c", "d", "e") //We need the list to choose from initialized, but it's no longer a sprite_accessory thing. GLOB.gentlemans_organ_names = list("phallus", "willy", "dick", "prick", "member", "tool", "gentleman's organ", "cock", "wang", "knob", "dong", "joystick", "pecker", "johnson", "weenie", "tadger", "schlong", "thirsty ferret", "baloney pony", "schlanger", "Mutton dagger", "old blind bob","Hanging Johnny", "fishing rod", "Tally whacker", "polly rocket", "One eyed trouser trout", "Ding dong", "ankle spanker", "Pork sword", "engine cranker", "Harry hot dog", "Davy Crockett", "Kidney cracker", "Heat seeking moisture missile", "Giggle stick", "love whistle", "Tube steak", "Uncle Dick", "Purple helmet warrior") - for(var/K in GLOB.breasts_shapes_list) - var/datum/sprite_accessory/breasts/value = GLOB.breasts_shapes_list[K] - GLOB.breasts_shapes_icons[K] = value.icon_state - - init_sprite_accessory_subtypes(/datum/sprite_accessory/testicles, GLOB.balls_shapes_list) - for(var/K in GLOB.balls_shapes_list) - var/datum/sprite_accessory/testicles/value = GLOB.balls_shapes_list[K] - GLOB.balls_shapes_icons[K] = value.icon_state for(var/gpath in subtypesof(/obj/item/organ/genital)) var/obj/item/organ/genital/G = gpath diff --git a/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm b/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm index 241ec8118e..92bc8e407b 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm @@ -16,7 +16,7 @@ from doing this unless you absolutely know what you are doing, and have defined a conversion in savefile.dm */ -/proc/init_sprite_accessory_subtypes(prototype, list/L, list/male, list/female,var/roundstart = FALSE)//Roundstart argument builds a specific list for roundstart parts where some parts may be locked +/proc/init_sprite_accessory_subtypes(prototype, list/L, list/male, list/female, roundstart = FALSE, skip_prototype = TRUE)//Roundstart argument builds a specific list for roundstart parts where some parts may be locked if(!istype(L)) L = list() if(!istype(male)) @@ -25,7 +25,7 @@ female = list() for(var/path in typesof(prototype)) - if(path == prototype) + if(path == prototype && skip_prototype) continue if(roundstart) var/datum/sprite_accessory/P = path diff --git a/modular_citadel/code/modules/arousal/arousal.dm b/modular_citadel/code/modules/arousal/arousal.dm index 3a586d061d..4fe57dfebe 100644 --- a/modular_citadel/code/modules/arousal/arousal.dm +++ b/modular_citadel/code/modules/arousal/arousal.dm @@ -46,20 +46,12 @@ var/list/obj/item/organ/genital/genit_list = list() if(!client?.prefs.arousable || (aphro && (client?.prefs.cit_toggles & NO_APHRO)) || (maso && !HAS_TRAIT(src, TRAIT_MASO))) return // no adjusting made here - if(strength>0) - for(var/obj/item/organ/genital/G in internal_organs) - if(!G.aroused_state && prob(strength*G.sensitivity)) - G.set_aroused_state(TRUE) - G.update_appearance() - if(G.aroused_state) - genit_list += G - else - for(var/obj/item/organ/genital/G in internal_organs) - if(G.aroused_state && prob(strength*G.sensitivity)) - G.set_aroused_state(FALSE) - G.update_appearance() - if(G.aroused_state) - genit_list += G + for(var/obj/item/organ/genital/G in internal_organs) + if(G.genital_flags & GENITAL_CAN_AROUSE && !G.aroused_state && prob(strength*G.sensitivity)) + G.set_aroused_state(strength > 0) + G.update_appearance() + if(G.aroused_state) + genit_list += G return genit_list /obj/item/organ/genital/proc/climaxable(mob/living/carbon/human/H, silent = FALSE) //returns the fluid source (ergo reagents holder) if found. diff --git a/modular_citadel/code/modules/arousal/genitals.dm b/modular_citadel/code/modules/arousal/genitals.dm index ca01ef46cb..dc299e4d4c 100644 --- a/modular_citadel/code/modules/arousal/genitals.dm +++ b/modular_citadel/code/modules/arousal/genitals.dm @@ -38,6 +38,8 @@ return ..() /obj/item/organ/genital/proc/set_aroused_state(new_state) + if(!(genital_flags & GENITAL_CAN_AROUSE)) + return FALSE if(!((HAS_TRAIT(owner,TRAIT_PERMABONER) && !new_state) || HAS_TRAIT(owner,TRAIT_NEVERBONER) && new_state)) aroused_state = new_state return aroused_state @@ -113,17 +115,7 @@ set desc = "Allows you to toggle which genitals are showing signs of arousal." var/list/genital_list = list() for(var/obj/item/organ/genital/G in internal_organs) - var/datum/sprite_accessory/S - switch(G.type) - if(/obj/item/organ/genital/penis) - S = GLOB.cock_shapes_list[G.shape] - if(/obj/item/organ/genital/testicles) - S = GLOB.balls_shapes_list[G.shape] - if(/obj/item/organ/genital/vagina) - S = GLOB.vagina_shapes_list[G.shape] - if(/obj/item/organ/genital/breasts) - S = GLOB.breasts_shapes_list[G.shape] - if(S?.alt_aroused) + if(G.genital_flags & GENITAL_CAN_AROUSE) genital_list += G if(!genital_list.len) //There's nothing that can show arousal return @@ -325,7 +317,6 @@ var/obj/item/organ/genital/G = A var/datum/sprite_accessory/S var/size = G.size - var/aroused_state = G.aroused_state switch(G.type) if(/obj/item/organ/genital/penis) S = GLOB.cock_shapes_list[G.shape] @@ -338,10 +329,9 @@ if(!S || S.icon_state == "none") continue + var/aroused_state = G.aroused_state && S.alt_aroused var/mutable_appearance/genital_overlay = mutable_appearance(S.icon, layer = -layer) - genital_overlay.icon_state = "[G.slot]_[S.icon_state]_[size]_[aroused_state]_[layertext]" - if(S.center) genital_overlay = center_image(genital_overlay, S.dimension_x, S.dimension_y) @@ -357,8 +347,8 @@ genital_overlay.color = "#[H.dna.features["breasts_color"]]" if("vag_color") genital_overlay.color = "#[H.dna.features["vag_color"]]" - - genital_overlay.icon_state = "[G.slot]_[S.icon_state]_[size]-s_[aroused_state]_[layertext]" + + genital_overlay.icon_state = "[G.slot]_[S.icon_state]_[size][use_skintones ? "_s" : ""]_[aroused_state]_[layertext]" if(layer == GENITALS_FRONT_LAYER && CHECK_BITFIELD(G.genital_flags, GENITAL_THROUGH_CLOTHES)) genital_overlay.layer = -GENITALS_EXPOSED_LAYER diff --git a/modular_citadel/code/modules/arousal/genitals_sprite_accessories.dm b/modular_citadel/code/modules/arousal/genitals_sprite_accessories.dm index 0c1763b8e2..594fc83e46 100644 --- a/modular_citadel/code/modules/arousal/genitals_sprite_accessories.dm +++ b/modular_citadel/code/modules/arousal/genitals_sprite_accessories.dm @@ -85,36 +85,36 @@ //Vaginas /datum/sprite_accessory/vagina icon = 'modular_citadel/icons/obj/genitals/vagina_onmob.dmi' - icon_state = null name = "vagina" color_src = "vag_color" + alt_aroused = TRUE /datum/sprite_accessory/vagina/human icon_state = "human" name = "Human" - alt_aroused = TRUE /datum/sprite_accessory/vagina/tentacles icon_state = "tentacle" name = "Tentacle" - alt_aroused = TRUE /datum/sprite_accessory/vagina/dentata icon_state = "dentata" name = "Dentata" - alt_aroused = TRUE /datum/sprite_accessory/vagina/hairy icon_state = "hairy" name = "Hairy" + alt_aroused = FALSE /datum/sprite_accessory/vagina/spade icon_state = "spade" name = "Spade" + alt_aroused = FALSE /datum/sprite_accessory/vagina/furred icon_state = "furred" name = "Furred" + alt_aroused = FALSE /datum/sprite_accessory/vagina/gaping icon_state = "gaping" @@ -125,7 +125,6 @@ icon = 'modular_citadel/icons/obj/genitals/breasts_onmob.dmi' name = "breasts" color_src = "breasts_color" - alt_aroused = TRUE /datum/sprite_accessory/breasts/pair icon_state = "pair" diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm index 1537d5cebe..dc7923e448 100644 --- a/modular_citadel/code/modules/arousal/organs/breasts.dm +++ b/modular_citadel/code/modules/arousal/organs/breasts.dm @@ -1,3 +1,6 @@ +#define BREASTS_ICON_MIN_SIZE 1 +#define BREASTS_ICON_MAX_SIZE 6 + /obj/item/organ/genital/breasts name = "breasts" desc = "Female milk producing organs." @@ -9,7 +12,7 @@ fluid_id = /datum/reagent/consumable/milk fluid_rate = MILK_RATE shape = "pair" - genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_FUID_PRODUCTION + genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_FUID_PRODUCTION|GENITAL_CAN_AROUSE masturbation_verb = "massage" arousal_verb = "Your breasts start feeling sensitive" unarousal_verb = "Your breasts no longer feel sensitive" @@ -49,21 +52,21 @@ var/datum/reagent/R = GLOB.chemical_reagents_list[fluid_id] if(R) desc += " They're leaking [lowertext(R.name)]." - var/string + 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) + icon_state = "breasts_[icon_shape]_[breast_values[icon_size]]" if(owner) if(owner.dna.species.use_skintones && owner.dna.features["genitals_use_skintone"]) if(ishuman(owner)) // Check before recasting type, although someone fucked up if you're not human AND have use_skintones somehow... var/mob/living/carbon/human/H = owner // only human mobs have skin_tone, which we need. color = "#[skintone2hex(H.skin_tone)]" - string = "breasts_[GLOB.breasts_shapes_icons[shape]]_[size]-s" + icon_state += "_s" else color = "#[owner.dna.features["breasts_color"]]" - string = "breasts_[GLOB.breasts_shapes_icons[shape]]_[size]" if(ishuman(owner)) var/mob/living/carbon/human/H = owner - icon_state = sanitize_text(string) H.update_genitals() - icon_state = sanitize_text(string) //Allows breasts to grow and change size, with sprite changes too. //maximum wah @@ -130,3 +133,6 @@ cached_size = size size = breast_values[size] prev_size = cached_size + +#undef BREASTS_ICON_MIN_SIZE +#undef BREASTS_ICON_MAX_SIZE \ No newline at end of file diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm index c6d3c764ac..791a186732 100644 --- a/modular_citadel/code/modules/arousal/organs/penis.dm +++ b/modular_citadel/code/modules/arousal/organs/penis.dm @@ -8,7 +8,7 @@ masturbation_verb = "stroke" arousal_verb = "You pop a boner" unarousal_verb = "Your boner goes down" - genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH + genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_CAN_AROUSE linked_organ_slot = ORGAN_SLOT_TESTICLES fluid_transfer_factor = 0.5 size = 2 //arbitrary value derived from length and girth for sprites. @@ -73,22 +73,21 @@ /obj/item/organ/genital/penis/update_appearance() . = ..() - var/string + var/datum/sprite_accessory/S = GLOB.cock_shapes_list[shape] + var/icon_shape = S ? S.icon_state : "human" + icon_state = "penis_[icon_shape]_[size]" var/lowershape = lowertext(shape) desc = "You see [aroused_state ? "an erect" : "a flaccid"] [lowershape] [name]. You estimate it's about [round(length, 0.25)] inch[round(length, 0.25) != 1 ? "es" : ""] long and [round(girth, 0.25)] inch[round(girth, 0.25) != 1 ? "es" : ""] in girth." - if(owner) if(owner.dna.species.use_skintones && owner.dna.features["genitals_use_skintone"]) if(ishuman(owner)) // Check before recasting type, although someone fucked up if you're not human AND have use_skintones somehow... var/mob/living/carbon/human/H = owner // only human mobs have skin_tone, which we need. color = "#[skintone2hex(H.skin_tone)]" - string = "penis_[GLOB.cock_shapes_icons[shape]]_[size]-s" + icon_state += "_s" else color = "#[owner.dna.features["cock_color"]]" - string = "penis_[GLOB.cock_shapes_icons[shape]]_[size]" if(ishuman(owner)) var/mob/living/carbon/human/H = owner - icon_state = sanitize_text(string) H.update_genitals() /obj/item/organ/genital/penis/get_features(mob/living/carbon/human/H) diff --git a/modular_citadel/code/modules/arousal/organs/testicles.dm b/modular_citadel/code/modules/arousal/organs/testicles.dm index 9573020417..eb6c1536cb 100644 --- a/modular_citadel/code/modules/arousal/organs/testicles.dm +++ b/modular_citadel/code/modules/arousal/organs/testicles.dm @@ -43,19 +43,19 @@ /obj/item/organ/genital/testicles/update_appearance() . = ..() desc = "You see an [size_name] pair of testicles." + var/datum/sprite_accessory/S = GLOB.balls_shapes_list[shape] + var/icon_shape = S ? S.icon_state : "single" + icon_state = "testicles_[icon_shape]_[size]" if(owner) - var/string if(owner.dna.species.use_skintones && owner.dna.features["genitals_use_skintone"]) if(ishuman(owner)) // Check before recasting type, although someone fucked up if you're not human AND have use_skintones somehow... var/mob/living/carbon/human/H = owner // only human mobs have skin_tone, which we need. color = "#[skintone2hex(H.skin_tone)]" - string = "testicles_[GLOB.balls_shapes_icons[shape]]_[size]-s" + icon_state += "_s" else color = "#[owner.dna.features["balls_color"]]" - string = "testicles_[GLOB.balls_shapes_icons[shape]]_[size]" if(ishuman(owner)) var/mob/living/carbon/human/H = owner - icon_state = sanitize_text(string) H.update_genitals() /obj/item/organ/genital/testicles/get_features(mob/living/carbon/human/H) diff --git a/modular_citadel/code/modules/arousal/organs/vagina.dm b/modular_citadel/code/modules/arousal/organs/vagina.dm index 3f1bcc5f9b..311afe75b0 100644 --- a/modular_citadel/code/modules/arousal/organs/vagina.dm +++ b/modular_citadel/code/modules/arousal/organs/vagina.dm @@ -6,7 +6,7 @@ zone = BODY_ZONE_PRECISE_GROIN slot = "vagina" size = 1 //There is only 1 size right now - genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH + genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_CAN_AROUSE masturbation_verb = "finger" arousal_verb = "You feel wetness on your crotch" unarousal_verb = "You no longer feel wet" @@ -22,7 +22,7 @@ /obj/item/organ/genital/vagina/update_appearance() . = ..() - var/string //Keeping this code here, so making multiple sprites for the different kinds is easier. + icon_state = "vagina" var/lowershape = lowertext(shape) var/details @@ -55,13 +55,11 @@ if(ishuman(owner)) // Check before recasting type, although someone fucked up if you're not human AND have use_skintones somehow... var/mob/living/carbon/human/H = owner // only human mobs have skin_tone, which we need. color = "#[skintone2hex(H.skin_tone)]" - string = "vagina-s" + icon_state += "_s" else color = "#[owner.dna.features["vag_color"]]" - string = "vagina" if(ishuman(owner)) var/mob/living/carbon/human/H = owner - icon_state = sanitize_text(string) H.update_genitals() /obj/item/organ/genital/vagina/get_features(mob/living/carbon/human/H) diff --git a/modular_citadel/icons/obj/genitals/breasts.dmi b/modular_citadel/icons/obj/genitals/breasts.dmi index d70207ee69..24656062d2 100644 Binary files a/modular_citadel/icons/obj/genitals/breasts.dmi and b/modular_citadel/icons/obj/genitals/breasts.dmi differ diff --git a/modular_citadel/icons/obj/genitals/breasts_onmob.dmi b/modular_citadel/icons/obj/genitals/breasts_onmob.dmi index 371041b6f4..578086c4c3 100644 Binary files a/modular_citadel/icons/obj/genitals/breasts_onmob.dmi and b/modular_citadel/icons/obj/genitals/breasts_onmob.dmi differ diff --git a/modular_citadel/icons/obj/genitals/penis.dmi b/modular_citadel/icons/obj/genitals/penis.dmi index 517758b248..c3fd184a7c 100644 Binary files a/modular_citadel/icons/obj/genitals/penis.dmi and b/modular_citadel/icons/obj/genitals/penis.dmi differ diff --git a/modular_citadel/icons/obj/genitals/penis_onmob.dmi b/modular_citadel/icons/obj/genitals/penis_onmob.dmi index 4f84c52360..4a92bffa2a 100644 Binary files a/modular_citadel/icons/obj/genitals/penis_onmob.dmi and b/modular_citadel/icons/obj/genitals/penis_onmob.dmi differ diff --git a/modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi b/modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi index ae2339e2e0..e8efbec216 100644 Binary files a/modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi and b/modular_citadel/icons/obj/genitals/taur_penis_onmob.dmi differ diff --git a/modular_citadel/icons/obj/genitals/testicles.dmi b/modular_citadel/icons/obj/genitals/testicles.dmi index 3d7a5f4f48..386eab0956 100644 Binary files a/modular_citadel/icons/obj/genitals/testicles.dmi and b/modular_citadel/icons/obj/genitals/testicles.dmi differ diff --git a/modular_citadel/icons/obj/genitals/vagina.dmi b/modular_citadel/icons/obj/genitals/vagina.dmi index 39bdd48e89..1bbe62ba0e 100644 Binary files a/modular_citadel/icons/obj/genitals/vagina.dmi and b/modular_citadel/icons/obj/genitals/vagina.dmi differ diff --git a/modular_citadel/icons/obj/genitals/vagina_onmob.dmi b/modular_citadel/icons/obj/genitals/vagina_onmob.dmi index ab71b22e3b..6c34ffadfa 100644 Binary files a/modular_citadel/icons/obj/genitals/vagina_onmob.dmi and b/modular_citadel/icons/obj/genitals/vagina_onmob.dmi differ