diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index b71af8236e..bacd49f0e3 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -32,14 +32,13 @@ //Human Overlays Indexes///////// //citadel code -#define MUTATIONS_LAYER 31 //mutations. Tk headglows, cold resistance glow, etc -#define BODY_BEHIND_LAYER 30 //certain mutantrace features (tail when looking south) that must appear behind the body parts -#define GENITALS_BEHIND_LAYER 29 -#define BODYPARTS_LAYER 28 //Initially "AUGMENTS", this was repurposed to be a catch-all bodyparts flag -#define BODY_ADJ_LAYER 27 //certain mutantrace features (snout, body markings) that must appear above the body parts -#define GENITALS_ADJ_LAYER 26 -#define BODY_LAYER 25 //underwear, undershirts, socks, eyes, lips(makeup) -#define GENITALS_FRONT_LAYER 24 +#define MUTATIONS_LAYER 30 //mutations. Tk headglows, cold resistance glow, etc +#define BODY_BEHIND_LAYER 29 //certain mutantrace features (tail when looking south) that must appear behind the body parts +#define GENITALS_BEHIND_LAYER 28 +#define BODYPARTS_LAYER 27 //Initially "AUGMENTS", this was repurposed to be a catch-all bodyparts flag +#define BODY_ADJ_LAYER 26 //certain mutantrace features (snout, body markings) that must appear above the body parts +#define GENITALS_ADJ_LAYER 25 +#define BODY_LAYER 24 //underwear, undershirts, socks, eyes, lips(makeup) #define FRONT_MUTATIONS_LAYER 23 //mutations that should appear above body, body_adj and bodyparts layer (e.g. laser eyes) #define DAMAGE_LAYER 22 //damage indicators (cuts and burns) #define UNIFORM_LAYER 21 @@ -49,7 +48,7 @@ #define EARS_LAYER 17 #define SUIT_LAYER 16 #define BODY_TAUR_LAYER 15 -#define GENITALS_FRONT_LAYER 14 +#define GENITALS_FRONT_LAYER 14 //Draws some genitalia above clothes and the TAUR body if need be. #define GLASSES_LAYER 13 #define BELT_LAYER 12 //Possible make this an overlay of somethign required to wear a belt? #define SUIT_STORE_LAYER 11 @@ -63,7 +62,7 @@ #define HANDS_LAYER 3 #define BODY_FRONT_LAYER 2 #define FIRE_LAYER 1 //If you're on fire -#define TOTAL_LAYERS 31 //KEEP THIS UP-TO-DATE OR SHIT WILL BREAK ;_; +#define TOTAL_LAYERS 30 //KEEP THIS UP-TO-DATE OR SHIT WILL BREAK ;_; //Human Overlay Index Shortcuts for alternate_worn_layer, layers //Because I *KNOW* somebody will think layer+1 means "above" diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index a010d3a0a4..92d5dcbd80 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -48,7 +48,9 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/xeno_dorsal, GLOB.xeno_dorsal_list) //genitals init_sprite_accessory_subtypes(/datum/sprite_accessory/penis, GLOB.cock_shapes_list) - init_sprite_accessory_subtypes(/datum/sprite_accessory/breasts, GLOB.breasts_size_list) + init_sprite_accessory_subtypes(/datum/sprite_accessory/vagina, GLOB.vagina_shapes_list) + init_sprite_accessory_subtypes(/datum/sprite_accessory/breasts, GLOB.breasts_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. //Species for(var/spath in subtypesof(/datum/species)) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 5c3e6da561..ca4093adf1 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -71,6 +71,10 @@ if(!GLOB.cock_shapes_list.len) init_sprite_accessory_subtypes(/datum/sprite_accessory/penis, GLOB.cock_shapes_list) + if(!GLOB.vagina_shapes_list.len) + init_sprite_accessory_subtypes(/datum/sprite_accessory/vagina, GLOB.vagina_shapes_list) + if(!GLOB.breasts_shapes_list.len) + init_sprite_accessory_subtypes(/datum/sprite_accessory/breasts, GLOB.breasts_shapes_list) // if(ishuman(src)) // var/mob/living/carbon/human/H = src /* if(H.gender == MALE) Fuck if I know how to fix this. @@ -110,7 +114,7 @@ "xenotail" = "None", "exhibitionist" = FALSE, "has_cock" = FALSE, - "cock_shape" = "human", + "cock_shape" = pick(GLOB.cock_shapes_list), "cock_length" = 6, "cock_girth_ratio" = COCK_GIRTH_RATIO_DEF, "cock_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), @@ -139,8 +143,10 @@ "has_breasts" = FALSE, "breasts_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), "breasts_size" = pick(GLOB.breasts_size_list), + "breasts_shape" = pick(GLOB.breasts_shapes_list), "breasts_fluid" = "milk", "has_vag" = FALSE, + "vag_shape" = pick(GLOB.vagina_shapes_list), "vag_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), "vag_clits" = 1, "vag_clit_diam" = 0.25, diff --git a/code/citadel/_cit_helpers.dm b/code/citadel/_cit_helpers.dm index 85bb754f06..30db35481a 100644 --- a/code/citadel/_cit_helpers.dm +++ b/code/citadel/_cit_helpers.dm @@ -54,10 +54,13 @@ GLOBAL_LIST_EMPTY(xeno_dorsal_list) //Genitals and Arousal Lists GLOBAL_LIST_EMPTY(cock_shapes_list)//global_lists.dm for the list initializations //Now also _DATASTRUCTURES globals.dm GLOBAL_LIST_EMPTY(breasts_size_list) +GLOBAL_LIST_EMPTY(breasts_shapes_list) +GLOBAL_LIST_EMPTY(vagina_shapes_list) GLOBAL_LIST_INIT(cum_into_containers_list, /obj/item/weapon/reagent_containers/food/snacks/pie) //Yer fuggin snowflake name list jfc GLOBAL_LIST_INIT(dick_nouns, list("dick","cock","member","shaft")) GLOBAL_LIST_INIT(cum_id_list,"semen") GLOBAL_LIST_INIT(milk_id_list,"milk") + //mentor stuff GLOBAL_LIST_EMPTY(mentors) diff --git a/code/citadel/cit_arousal.dm b/code/citadel/cit_arousal.dm index 3d998d971c..f2801d1ede 100644 --- a/code/citadel/cit_arousal.dm +++ b/code/citadel/cit_arousal.dm @@ -81,6 +81,7 @@ CRASH("Provided percentage is invalid") if(getPercentAroused() >= percentage) return TRUE + return FALSE //H U D// /mob/living/proc/updatearousal() diff --git a/code/citadel/icons/breasts.dmi b/code/citadel/icons/breasts.dmi index 7735fad868..7e4a631876 100644 Binary files a/code/citadel/icons/breasts.dmi and b/code/citadel/icons/breasts.dmi differ diff --git a/code/citadel/icons/breasts_onmob.dmi b/code/citadel/icons/breasts_onmob.dmi index 12f23ad56d..473ec058bf 100644 Binary files a/code/citadel/icons/breasts_onmob.dmi and b/code/citadel/icons/breasts_onmob.dmi differ diff --git a/code/citadel/icons/penis_onmob.dmi b/code/citadel/icons/penis_onmob.dmi index 628ed11068..bdda4a94d5 100644 Binary files a/code/citadel/icons/penis_onmob.dmi and b/code/citadel/icons/penis_onmob.dmi differ diff --git a/code/citadel/icons/vagina_onmob.dmi b/code/citadel/icons/vagina_onmob.dmi index 867ede99d5..41bc818719 100644 Binary files a/code/citadel/icons/vagina_onmob.dmi and b/code/citadel/icons/vagina_onmob.dmi differ diff --git a/code/citadel/organs/breasts.dm b/code/citadel/organs/breasts.dm index 356ef77c1a..4643115e32 100644 --- a/code/citadel/organs/breasts.dm +++ b/code/citadel/organs/breasts.dm @@ -6,11 +6,11 @@ zone = "chest" slot = "breasts" w_class = 3 - size = "e" + size = BREASTS_SIZE_DEF fluid_id = "milk" - var/cup_size = BREASTS_SIZE_DEF var/amount = 2 producing = TRUE + shape = "pair" /obj/item/organ/genital/breasts/Initialize() create_reagents(fluid_max_volume) @@ -31,3 +31,28 @@ return FALSE reagents.isolate_reagent(fluid_id) reagents.add_reagent(fluid_id, (fluid_mult * fluid_rate)) + +/obj/item/organ/genital/breasts/update_appearance() + var/string = "breasts_[lowertext(shape)]_[size]" + icon_state = sanitize_text(string) + var/lowershape = lowertext(shape) + switch(lowershape) + if("pair") + desc = "That's a pair of breasts." + else + desc = "That's breasts, they seem to be quite exotic." + if (size) + desc += " You estimate they're about [size]-cup size." + else + desc += " You wouldn't measure them in cup sizes." + if(producing) + desc += "\nThey're leaking [fluid_id]." + else + desc += "\nThey do not seem to be producing liquids." + 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)]" + else + color = "#[owner.dna.features["breasts_color"]]" \ No newline at end of file diff --git a/code/citadel/organs/genitals.dm b/code/citadel/organs/genitals.dm index 71078e382b..09785b8ec6 100644 --- a/code/citadel/organs/genitals.dm +++ b/code/citadel/organs/genitals.dm @@ -11,6 +11,8 @@ var/fluid_rate = 1 var/fluid_mult = 1 var/producing = FALSE + var/aroused_state = FALSE //Boolean used in icon_state strings + var/aroused_amount = 50 //This is a num from 0 to 100 for arousal percentage for when to use arousal state icons. /obj/item/organ/genital/Initialize() reagents = create_reagents(fluid_max_volume) @@ -100,13 +102,14 @@ // T.color = skintone2hex(skin_tone) // else // T.color = "#[dna.features["balls_color"]]" - T.size = dna.features["balls_size"] - T.sack_size = dna.features["balls_sack_size"] - T.fluid_id = dna.features["balls_fluid"] - T.fluid_rate = dna.features["balls_cum_rate"] - T.fluid_mult = dna.features["balls_cum_mult"] - T.fluid_efficiency = dna.features["balls_efficiency"] - T.update() + if(T) + T.size = dna.features["balls_size"] + T.sack_size = dna.features["balls_sack_size"] + T.fluid_id = dna.features["balls_fluid"] + T.fluid_rate = dna.features["balls_cum_rate"] + T.fluid_mult = dna.features["balls_cum_mult"] + T.fluid_efficiency = dna.features["balls_efficiency"] + T.update() /mob/living/carbon/human/proc/give_breasts() if(!dna) @@ -116,9 +119,15 @@ if(!getorganslot("breasts")) var/obj/item/organ/genital/breasts/B = new B.Insert(src) - B.cup_size = dna.features["breasts_size"] - B.fluid_id = dna.features["breasts_fluid"] - B.update() + if(B) + if(dna.species.use_skintones && dna.features["genitals_use_skintone"]) + B.color = skintone2hex(skin_tone) + else + B.color = "#[dna.features["breasts_color"]]" + B.size = dna.features["breasts_size"] + B.shape = dna.features["breasts_shape"] + B.fluid_id = dna.features["breasts_fluid"] + B.update() /mob/living/carbon/human/proc/give_ovipositor() @@ -131,11 +140,14 @@ if(!getorganslot("vagina")) var/obj/item/organ/genital/vagina/V = new V.Insert(src) - if(dna.species.use_skintones && dna.features["genitals_use_skintone"]) - V.color = skintone2hex(skin_tone) - else - V.color = "[dna.features["vag_color"]]" - V.update() + if(V) + if(dna.species.use_skintones && dna.features["genitals_use_skintone"]) + V.color = skintone2hex(skin_tone) + else + V.color = "[dna.features["vag_color"]]" + V.shape = "[dna.features["vag_shape"]]" + V.update() + /mob/living/carbon/human/proc/give_womb() if(!dna) return FALSE @@ -144,7 +156,8 @@ if(!getorganslot("womb")) var/obj/item/organ/genital/womb/W = new W.Insert(src) - W.update() + if(W) + W.update() /datum/species/proc/genitals_layertext(layer) @@ -183,69 +196,82 @@ return var/list/genitals_to_add = list() - var/list/relevent_layers = list(GENITALS_BEHIND_LAYER, GENITALS_ADJ_LAYER, GENITALS_FRONT_LAYER) + var/list/relevant_layers = list(GENITALS_BEHIND_LAYER, GENITALS_ADJ_LAYER, GENITALS_FRONT_LAYER) var/list/standing = list() - var/size + var/size = null - H.remove_overlay(GENITALS_BEHIND_LAYER) - H.remove_overlay(GENITALS_ADJ_LAYER) - H.remove_overlay(GENITALS_FRONT_LAYER) + for(var/L in relevant_layers) //Less hardcode + H.remove_overlay(L) if(H.disabilities & HUSK) return //start scanning for genitals var/list/worn_stuff = H.get_equipped_items()//cache this list so it's not built again if(H.is_groin_exposed(worn_stuff)) - if(H.has_penis()) - genitals_to_add += H.getorganslot("penis") + //ORDER is important here. Vaginas first, theoretical testes after, and penis LAST. + //The latter is always drawn on top of the former. if(H.has_vagina()) genitals_to_add += H.getorganslot("vagina") + if(H.has_penis()) + genitals_to_add += H.getorganslot("penis") if(H.is_chest_exposed(worn_stuff)) if(H.has_breasts()) genitals_to_add += H.getorganslot("breasts") var/image/I //start applying overlays - for(var/layer in relevent_layers) + for(var/layer in relevant_layers) var/layertext = genitals_layertext(layer) for(var/obj/item/organ/genital/G in genitals_to_add) var/datum/sprite_accessory/S + size = G.size switch(G.type) if(/obj/item/organ/genital/penis) S = GLOB.cock_shapes_list[G.shape] - size = G.size + 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 || S.icon_state == "none") continue var/icon_string - icon_string = "[G.slot]_[S.icon_state]_[size]_[layertext]" + if(S.alt_aroused) + G.aroused_state = H.isPercentAroused(G.aroused_amount) + else + G.aroused_state = FALSE + icon_string = "[G.slot]_[S.icon_state]_[size]_[G.aroused_state]_[layertext]" I = image("icon" = S.icon, "icon_state" = icon_string, "layer" =- layer) if(S.center) I = center_image(I,S.dimension_x,S.dimension_y) - switch(S.color_src) - if("cock_color") - I.color = "#[H.dna.features["cock_color"]]" - if("breasts_color") - I.color = "#[H.dna.features["breasts_color"]]" - if(MUTCOLORS) - if(fixed_mut_color) - I.color = "#[fixed_mut_color]" - else - I.color = "#[H.dna.features["mcolor"]]" - if(MUTCOLORS2) - if(fixed_mut_color2) - I.color = "#[fixed_mut_color2]" - else - I.color = "#[H.dna.features["mcolor2"]]" - if(MUTCOLORS3) - if(fixed_mut_color3) - I.color = "#[fixed_mut_color3]" - else - I.color = "#[H.dna.features["mcolor3"]]" + if(use_skintones && H.dna.features["genitals_use_skintone"]) + I.color = "#[skintone2hex(H.skin_tone)]" + else + switch(S.color_src) + if("cock_color") + I.color = "#[H.dna.features["cock_color"]]" + if("breasts_color") + I.color = "#[H.dna.features["breasts_color"]]" + if("vag_color") + I.color = "#[H.dna.features["vag_color"]]" + if(MUTCOLORS) + if(fixed_mut_color) + I.color = "#[fixed_mut_color]" + else + I.color = "#[H.dna.features["mcolor"]]" + if(MUTCOLORS2) + if(fixed_mut_color2) + I.color = "#[fixed_mut_color2]" + else + I.color = "#[H.dna.features["mcolor2"]]" + if(MUTCOLORS3) + if(fixed_mut_color3) + I.color = "#[fixed_mut_color3]" + else + I.color = "#[H.dna.features["mcolor3"]]" standing += I if(LAZYLEN(standing)) H.overlays_standing[layer] = standing.Copy() standing = list() - H.apply_overlay(GENITALS_BEHIND_LAYER) - H.apply_overlay(GENITALS_ADJ_LAYER) - H.apply_overlay(GENITALS_FRONT_LAYER) \ No newline at end of file + for(var/L in relevant_layers) + H.apply_overlay(L) \ No newline at end of file diff --git a/code/citadel/organs/genitals_sprite_accessories.dm b/code/citadel/organs/genitals_sprite_accessories.dm index 2ec52b80c5..586be3a095 100644 --- a/code/citadel/organs/genitals_sprite_accessories.dm +++ b/code/citadel/organs/genitals_sprite_accessories.dm @@ -1,3 +1,7 @@ +/datum/sprite_accessory + var/alt_aroused = FALSE //CIT CODE if this is TRUE, then the genitals will use an alternate icon_state when aroused. + + //DICKS,COCKS,PENISES,WHATEVER YOU WANT TO CALL THEM /datum/sprite_accessory/penis icon = 'code/citadel/icons/penis_onmob.dmi' @@ -27,69 +31,49 @@ icon_state = "tapered" name = "Tapered" +//Vaginas +/datum/sprite_accessory/vagina + icon = 'code/citadel/icons/vagina_onmob.dmi' + icon_state = null + name = "vagina" + gender_specific = 0 + color_src = "vag_color" + locked = 0 + alt_aroused = FALSE //if this is TRUE, then the genitals will use an alternate sprite for aroused states + +/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" + + //BREASTS BE HERE /datum/sprite_accessory/breasts icon = 'code/citadel/icons/breasts_onmob.dmi' icon_state = null name = "breasts" gender_specific = 0 - color_src = MUTCOLORS2 //I'll have skin_tone override this if the species uses them + color_src = "breasts_color" locked = 0 -/*!!ULTRACOMPRESSEDEDITION!!*/ -/datum/sprite_accessory/breasts/a - icon_state = "a" - name = "A" -/datum/sprite_accessory/breasts/aa - icon_state = "a" - name = "AA" -/datum/sprite_accessory/breasts/b - icon_state = "b" - name = "B" -/datum/sprite_accessory/breasts/bb - icon_state = "b" - name = "BB" -/datum/sprite_accessory/breasts/c - icon_state = "c" - name = "C" -/datum/sprite_accessory/breasts/cc - icon_state = "c" - name = "CC" -/datum/sprite_accessory/breasts/d - icon_state = "d" - name = "D" -/datum/sprite_accessory/breasts/dd - icon_state = "d" - name = "DD" -/datum/sprite_accessory/breasts/e - icon_state = "e" - name = "E" -/datum/sprite_accessory/breasts/ee - icon_state = "e" - name = "EE" -/datum/sprite_accessory/breasts/f - icon_state = "f" - name = "F" - locked = 1 -/datum/sprite_accessory/breasts/ff - icon_state = "f" - name = "FF" - locked = 1 -/datum/sprite_accessory/breasts/g - icon_state = "g" - name = "G" - locked = 1 -/datum/sprite_accessory/breasts/gg - icon_state = "g" - name = "GG" - locked = 1 -/datum/sprite_accessory/breasts/h - icon_state = "h" - name = "H" - locked = 1 -/datum/sprite_accessory/breasts/hh - icon_state = "h" - name = "HH" - locked = 1 + +/datum/sprite_accessory/breasts/pair + icon_state = "pair" + name = "Pair" + //OVIPOSITORS BE HERE /datum/sprite_accessory/ovipositor @@ -100,10 +84,6 @@ color_src = "cock_color" locked = 0 -/datum/sprite_accessory/ovipositor/knotted - icon_state = "none" - name = "None" - /datum/sprite_accessory/ovipositor/knotted icon_state = "knotted" name = "Knotted" diff --git a/code/citadel/organs/penis.dm b/code/citadel/organs/penis.dm index 6c88f28179..02adb6e2eb 100644 --- a/code/citadel/organs/penis.dm +++ b/code/citadel/organs/penis.dm @@ -44,12 +44,17 @@ if(lowershape in knotted_types) if(lowershape == "barbknot") lowershape = "barbed, knotted" - desc = "That's a [lowershape] penis. You estimate it's about [round(length, 0.25)] inch[length > 1 ? "es" : ""] long, [round(girth, 0.25)] inch[length > 1 ? "es" : ""] around the shaft \ + desc = "That's a [lowershape] penis. You estimate it's about [round(length, 0.25)] inch[length > 1 ? "es" : ""] long, [round(girth, 0.25)] inch[girth > 1 ? "es" : ""] around the shaft \ and [round(length * knot_girth_ratio, 0.25)] inch[length > 1 ? "es" : ""] around the knot." else desc = "That's a [lowershape] penis. You estimate it's about [round(length, 0.25)] inch[length > 1 ? "es" : ""] long and [round(girth, 0.25)] inch[length > 1 ? "es" : ""] around." if(owner) - color = "#[owner.dna.features["cock_color"]]" + 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)]" + else + color = "#[owner.dna.features["cock_color"]]" /obj/item/organ/genital/penis/update_link() if(owner) diff --git a/code/citadel/organs/vagina.dm b/code/citadel/organs/vagina.dm index bcbb23d8e9..c1924a3067 100644 --- a/code/citadel/organs/vagina.dm +++ b/code/citadel/organs/vagina.dm @@ -5,13 +5,66 @@ icon_state = "vagina" zone = "groin" slot = "vagina" + size = 1 //There is only 1 size right now can_masturbate_with = 1 w_class = 3 - var/wetness = 1 var/cap_length = 8//D E P T H (cap = capacity) var/cap_girth = 12 var/cap_girth_ratio = 1.5 var/clits = 1 var/clit_diam = 0.25 var/clit_len = 0.25 - var/obj/item/organ/womb/linked_womb + var/list/vag_types = list("tentacle", "dentata", "hairy") + var/obj/item/organ/genital/womb/linked_womb + + +/obj/item/organ/genital/vagina/update_appearance() + var/string = "vagina" //Keeping this code here, so making multiple sprites for the different kinds is easier. + icon_state = sanitize_text(string) + var/lowershape = lowertext(shape) + var/details + + switch(lowershape) + if("tentacle") + details = "\nIts opening is lined with several tentacles and " + if("dentata") + details = "\nThere's teeth inside it and it is " + if("hairy") + details = "\nIt has quite a bit of hair growing on it and is " + if("human") + details = "\nIt is taut with smooth skin, though without much hair and " + if("gaping") + details = "\nIt is gaping slightly open, though without much hair and " + else + details = "\nIt has an exotic shape and is " + if(aroused_state) + details += "slick with female arousal." + else + details += "not very wet." + + desc = "That's a [lowershape] vagina. You estimate it to be around [round(cap_length, 0.5)] inch[cap_length > 1 ? "es" : ""] deep and could stretch around something [round(cap_girth, 0.5)] inch[cap_girth > 1 ? "es" : ""] in girth. \ + It has [clits > 1 ? "[clits] clits" : "a clit"] about [round(clit_len,0.25)] inch[clit_len > 1 ? "es" : ""] long and [round(clit_diam, 0.25)] inch[clit_diam > 1 ? "es" : ""] in diameter.[details]" + + 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)]" + else + color = "#[owner.dna.features["vag_color"]]" + + +/obj/item/organ/genital/vagina/update_link() + if(owner) + linked_womb = (owner.getorganslot("womb")) + if(linked_womb) + linked_womb.linked_vag = src + else + if(linked_womb) + linked_womb.linked_vag = null + linked_womb = null + +/obj/item/organ/genital/vagina/remove_ref() + if(linked_womb) + linked_womb.linked_vag = null + linked_womb = null diff --git a/code/citadel/organs/womb.dm b/code/citadel/organs/womb.dm index 8552f20e46..948bc33385 100644 --- a/code/citadel/organs/womb.dm +++ b/code/citadel/organs/womb.dm @@ -9,5 +9,20 @@ fluid_id = "femcum" var/obj/item/organ/genital/vagina/linked_vag +/obj/item/organ/genital/womb/update_link() + if(owner) + linked_vag = (owner.getorganslot("vagina")) + if(linked_vag) + linked_vag.linked_womb = src + else + if(linked_vag) + linked_vag.linked_womb = null + linked_vag = null + +/obj/item/organ/genital/womb/remove_ref() + if(linked_vag) + linked_vag.linked_womb = null + linked_vag = null + /obj/item/organ/genital/womb/Destroy() return ..() \ No newline at end of file diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index e51e6e1860..786da51f78 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -86,7 +86,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) "exhibitionist" = FALSE, "genitals_use_skintone" = FALSE, "has_cock" = FALSE, - "cock_shape" = "human", + "cock_shape" = "Human", "cock_length" = 6, "cock_girth_ratio" = COCK_GIRTH_RATIO_DEF, "cock_color" = "fff", @@ -115,8 +115,10 @@ GLOBAL_LIST_EMPTY(preferences_datums) "has_breasts" = FALSE, "breasts_color" = "fff", "breasts_size" = "C", + "breasts_shape" = "pair", "breasts_fluid" = "milk", "has_vag" = FALSE, + "vag_shape" = "Human", "vag_color" = "fff", "vag_clits" = 1, "vag_clit_diam" = 0.25, @@ -353,7 +355,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) else dat += "High" dat += "
" -// dat += "Genital Colors:[features["genitals_use_skintone"] == TRUE ? "Skin Tone" : "Custom"]
" dat += "" @@ -405,6 +406,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Tertiary Color:     Change
" if(pref_species.use_skintones) dat += "Skin Tone: [skin_tone]
" + dat += "Genitals Use Skintone:[features["genitals_use_skintone"] == TRUE ? "Enabled" : "Disabled"]
" + if(HAIR in pref_species.species_traits) dat += "Hair Style: [hair_style]
" dat += "Hair Color:     Change
" @@ -473,18 +476,26 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Penis Length: [features["cock_length"]] inch(es)
" dat += "Has Testicles:[features["has_balls"] == TRUE ? "Yes" : "No"]
" if(features["has_balls"] == TRUE) - dat += "Testicles Color:    Change
" + if(pref_species.use_skintones && features["genitals_use_skintone"] == TRUE) + dat += "Testicles Color:   (Skin tone overriding)
" + else + dat += "Testicles Color:    Change
" dat += "Has Vagina:[features["has_vag"] == TRUE ? "Yes" : "No"]
" if(features["has_vag"]) - dat += "Vagina Color:    Change
" + dat += "Vagina Type: [features["vag_shape"]]
" + if(pref_species.use_skintones && features["genitals_use_skintone"] == TRUE) + dat += "Vagina Color:   (Skin tone overriding)
" + else + dat += "Vagina Color:    Change
" dat += "Has Womb:[features["has_womb"] == TRUE ? "Yes" : "No"]
" dat += "Has Breasts:[features["has_breasts"] == TRUE ? "Yes" : "No"]
" if(features["has_breasts"]) -// if(pref_species.use_skintones) -// dat += "Color:   (Skin tone overriding)" -// else -// dat += "Color:    Change" + if(pref_species.use_skintones && features["genitals_use_skintone"] == TRUE) + dat += "Color:   (Skin tone overriding)
" + else + dat += "Color:    Change
" dat += "Cup Size:[features["breasts_size"]]
" + dat += "Breast Shape:[features["breasts_shape"]]
" /* dat += "

Ovipositor

" dat += "Has Ovipositor:[features["has_ovi"] == TRUE ? "Yes" : "No"]" @@ -1313,6 +1324,12 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(new_size) features["breasts_size"] = new_size + if("breasts_shape") + var/new_shape + new_shape = input(user, "Breast Shape", "Character Preference") as null|anything in GLOB.breasts_shapes_list + if(new_shape) + features["breasts_shape"] = new_shape + if("breasts_color") var/new_breasts_color = input(user, "Breast Color:", "Character Preference") as color|null if(new_breasts_color) @@ -1323,6 +1340,11 @@ GLOBAL_LIST_EMPTY(preferences_datums) features["breasts_color"] = sanitize_hexcolor(new_breasts_color) else user << "Invalid color. Your color is not bright enough." + if("vag_shape") + var/new_shape + new_shape = input(user, "Vagina Type", "Character Preference") as null|anything in GLOB.vagina_shapes_list + if(new_shape) + features["vag_shape"] = new_shape if("vag_color") var/new_vagcolor = input(user, "Vagina color:", "Character Preference") as color|null if(new_vagcolor) @@ -1338,6 +1360,14 @@ GLOBAL_LIST_EMPTY(preferences_datums) switch(href_list["preference"]) //citadel code + if("genital_colour") + switch(features["genitals_use_skintone"]) + if(TRUE) + features["genitals_use_skintone"] = FALSE + if(FALSE) + features["genitals_use_skintone"] = TRUE + else + features["genitals_use_skintone"] = FALSE if("arousable") switch(arousable) if(TRUE) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 4f8155f680..cd50224445 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -2,7 +2,7 @@ #define SAVEFILE_VERSION_MIN 10 //This is the current version, anything below this will attempt to update (if it's not obsolete) -#define SAVEFILE_VERSION_MAX 18 +#define SAVEFILE_VERSION_MAX 19 /* SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn This proc checks if the current directory of the savefile S needs updating @@ -125,7 +125,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car joblessrole = BEASSISTANT if(current_version < 17) features["legs"] = "Normal Legs" - if(current_version < 18)//this should lower the amount of lag when you select or change something. + if(current_version < 19)//this should lower the amount of lag when you select or change something. features["mam_body_markings"] = sanitize_inlist(features["mam_body_markings"], GLOB.mam_body_markings_list) features["mam_ears"] = sanitize_inlist(features["mam_ears"], GLOB.mam_ears_list) features["mam_tail"] = sanitize_inlist(features["mam_tail"], GLOB.mam_tails_list) @@ -148,10 +148,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //breasts features features["has_breasts"] = sanitize_integer(features["has_breasts"], 0, 1, 0) features["breasts_size"] = sanitize_inlist(features["breasts_size"], GLOB.breasts_size_list, "C") + features["breasts_shape"] = sanitize_inlist(features["breasts_shape"], GLOB.breasts_shapes_list, "pair") features["breasts_color"] = sanitize_hexcolor(features["breasts_color"], 3, 0) features["breasts_fluid"] = sanitize_inlist(features["breasts_fluid"], GLOB.milk_id_list, "milk") //vagina features features["has_vag"] = sanitize_integer(features["has_vag"], 0, 1, 0) + features["vag_shape"] = sanitize_inlist(features["vag_shape"], GLOB.vagina_shapes_list, "Human") features["vag_color"] = sanitize_hexcolor(features["vag_color"], 3, 0) //womb features features["has_womb"] = sanitize_integer(features["has_womb"], 0, 1, 0) @@ -383,10 +385,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //breasts features S["feature_has_breasts"] >> features["has_breasts"] S["feature_breasts_size"] >> features["breasts_size"] + S["feature_breasts_shape"] >> features["breasts_shape"] S["feature_breasts_color"] >> features["breasts_color"] S["feature_breasts_fluid"] >> features["breasts_fluid"] //vagina features S["feature_has_vag"] >> features["has_vag"] + S["feature_vag_shape"] >> features["vag_shape"] S["feature_vag_color"] >> features["vag_color"] //womb features S["feature_has_womb"] >> features["has_womb"] @@ -547,10 +551,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //breasts features S["feature_has_breasts"] << features["has_breasts"] S["feature_breasts_size"] << features["breasts_size"] + S["feature_breasts_shape"] << features["breasts_shape"] S["feature_breasts_color"] << features["breasts_color"] S["feature_breasts_fluid"] << features["breasts_fluid"] //vagina features S["feature_has_vag"] << features["has_vag"] + S["feature_vag_shape"] << features["vag_shape"] S["feature_vag_color"] << features["vag_color"] //womb features S["feature_has_womb"] << features["has_womb"] diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 8a062b9e33..038c6dba4b 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -366,12 +366,11 @@ /datum/species/proc/handle_mutant_bodyparts(mob/living/carbon/human/H, forced_colour) var/list/bodyparts_to_add = mutant_bodyparts.Copy() - var/list/relevent_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER) + var/list/relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER, BODY_TAUR_LAYER) var/list/standing = list() - H.remove_overlay(BODY_BEHIND_LAYER) - H.remove_overlay(BODY_ADJ_LAYER) - H.remove_overlay(BODY_FRONT_LAYER) + for(var/L in relevant_layers) + H.remove_overlay(L) if(!mutant_bodyparts) return @@ -497,7 +496,7 @@ var/image/I - for(var/layer in relevent_layers) + for(var/layer in relevant_layers) var/layertext = mutant_bodyparts_layertext(layer) for(var/bodypart in bodyparts_to_add) @@ -704,9 +703,8 @@ H.overlays_standing[layer] = standing.Copy() standing = list() - H.apply_overlay(BODY_BEHIND_LAYER) - H.apply_overlay(BODY_ADJ_LAYER) - H.apply_overlay(BODY_FRONT_LAYER) + for(var/L in relevant_layers) + H.apply_overlay(L) //This exists so sprite accessories can still be per-layer without having to include that layer's @@ -719,6 +717,8 @@ return "ADJ" if(BODY_FRONT_LAYER) return "FRONT" + if(BODY_TAUR_LAYER) + return "TAUR" /datum/species/proc/spec_life(mob/living/carbon/human/H) diff --git a/html/changelogs/ktccd-PR-339.yml b/html/changelogs/ktccd-PR-339.yml new file mode 100644 index 0000000000..76ceef0bbd --- /dev/null +++ b/html/changelogs/ktccd-PR-339.yml @@ -0,0 +1,40 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: "ktccd" + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit. +# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog. +changes: + - fix: Taur layers now render correctly, no longer covering genitals! Rejoice Nagas! + - add: Breasts are now selectable in shapes and sizes and will render properly! + - add: Vaginas are now selectable in shapes and will render properly! Some of them are horrifying! + - tweak: Tweaked how colours are chosen (Humans can enable/disable matching genitals to their skintones, everyone else has to pick their colours). + - tweak: Breasts and Vaginas should now also have better descriptions. So far, these descriptions only apply when examining one that's not on a person... + - fix: Taur Shephard sprite bug fixed where there was a missing 2 pixels in the middle of the body. \ No newline at end of file