diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 8e98e80d78..110188a85a 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 81881f76b5..e7fe1b354d 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -55,7 +55,9 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/xeno_dorsal, xeno_dorsal_list) //genitals init_sprite_accessory_subtypes(/datum/sprite_accessory/penis, cock_shapes_list) - init_sprite_accessory_subtypes(/datum/sprite_accessory/breasts, breasts_size_list) + init_sprite_accessory_subtypes(/datum/sprite_accessory/vagina, vagina_shapes_list) + init_sprite_accessory_subtypes(/datum/sprite_accessory/breasts, breasts_shapes_list) + 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 61e7f9364a..f73220abde 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -138,8 +138,10 @@ "has_breasts" = FALSE, "breasts_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), "breasts_size" = pick(breasts_size_list), + "breasts_shape" = pick(breasts_shapes_list), "breasts_fluid" = "milk", "has_vag" = FALSE, + "vag_shape" = pick(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 433926df3f..3cb2bee4ca 100644 --- a/code/citadel/_cit_helpers.dm +++ b/code/citadel/_cit_helpers.dm @@ -53,7 +53,9 @@ var/global/list/xeno_dorsal_list = list() //Genitals and Arousal Lists var/global/list/cock_shapes_list = list()//global_lists.dm for the list initializations +var/global/list/breasts_shapes_list = list() var/global/list/breasts_size_list = list() +var/global/list/vagina_shapes_list = list() var/global/list/cum_into_containers_list = list(/obj/item/weapon/reagent_containers/food/snacks/pie) var/global/list/dick_nouns = list("dick","cock","member","shaft") var/global/list/cum_id_list = list("semen") 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..32d2832388 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/vagina_onmob.dmi b/code/citadel/icons/vagina_onmob.dmi index 867ede99d5..0f939c03f6 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..f7cbbeb527 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,23 @@ 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) + 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 d5d1e8c541..0a5410bd40 100644 --- a/code/citadel/organs/genitals.dm +++ b/code/citadel/organs/genitals.dm @@ -100,13 +100,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 +117,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 +138,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 +154,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,13 +194,12 @@ 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 @@ -198,14 +208,15 @@ if(H.is_groin_exposed(worn_stuff)) if(H.has_penis()) genitals_to_add += H.getorganslot("penis") - if(H.has_vagina()) - genitals_to_add += H.getorganslot("vagina") + else + if(H.has_vagina()) //Sadly, a penis would cover the vagina and they use the same layer, so don't draw both. + genitals_to_add += H.getorganslot("vagina") 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 @@ -213,6 +224,12 @@ if(/obj/item/organ/genital/penis) S = cock_shapes_list[G.shape] size = G.size + if(/obj/item/organ/genital/vagina) + S = vagina_shapes_list[G.shape] + size = G.size + if(/obj/item/organ/genital/breasts) + S = breasts_shapes_list[G.shape] + size = G.size if(!S || S.icon_state == "none") continue @@ -226,6 +243,8 @@ 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]" @@ -246,6 +265,5 @@ 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..d2b802e9dd 100644 --- a/code/citadel/organs/genitals_sprite_accessories.dm +++ b/code/citadel/organs/genitals_sprite_accessories.dm @@ -27,15 +27,57 @@ 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 + +/datum/sprite_accessory/vagina/human + icon_state = "human" + name = "Human" + +/datum/sprite_accessory/vagina/gaping + icon_state = "gaping" + name = "Gaping" + +//I think this one is intended for arousal... but it would only work for human vaginas in this case... +//So I'm leaving it as a selectable option until we can make/need variants for the sprites to change based on arousal. +/datum/sprite_accessory/vagina/dripping + icon_state = "dripping" + name = "Dripping" + +/datum/sprite_accessory/vagina/tentacles + icon_state = "tentacle" + name = "Tentacle" + +/datum/sprite_accessory/vagina/dentata + icon_state = "dentata" + name = "Dentata" + +/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/pair + icon_state = "pair" + name = "Pair" + +/*!!ULTRACOMPRESSEDEDITION!! /datum/sprite_accessory/breasts/a icon_state = "a" name = "A" @@ -90,6 +132,8 @@ icon_state = "h" name = "HH" locked = 1 +*/// Sorry for ruining your things + //OVIPOSITORS BE HERE /datum/sprite_accessory/ovipositor @@ -100,10 +144,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..e47498620c 100644 --- a/code/citadel/organs/penis.dm +++ b/code/citadel/organs/penis.dm @@ -44,7 +44,7 @@ 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." diff --git a/code/citadel/organs/vagina.dm b/code/citadel/organs/vagina.dm index bcbb23d8e9..50d44d3b77 100644 --- a/code/citadel/organs/vagina.dm +++ b/code/citadel/organs/vagina.dm @@ -5,13 +5,60 @@ 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/wetness = FALSE 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) + + desc = "That's a [lowershape] vagina. You estimate it could stretch about [round(cap_length, 0.25)] inch[cap_length > 1 ? "es" : ""] deep, around something [round(cap_girth, 0.25)] inch[cap_girth > 1 ? "es" : ""] thick \ + and 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." + switch(lowershape) + if("tentacle") + desc += "\nIts opening is lined with several tentacles and " + if("dentata") + desc += "\nThere's teeth inside it and it is " + if("hairy") + desc += "\nIt has quite a bit of hair growing on it and is " + if("human") + desc += "\nIt is taut with smooth skin, though without much hair and " + if("gaping") + desc += "\nIt is gaping slightly open, though without much hair and " + if("dripping") + desc += "\nIt is gaping slightly, inflamed and " + else + desc += "\nIt has an exotic shape and is " + if(wetness) + desc += "slick with female arousal." + else + desc += "not very wet." + if(owner) + 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 20a57f2d0e..c2325b2bd8 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -115,8 +115,10 @@ var/list/preferences_datums = list() "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 @@ var/list/preferences_datums = list() else dat += "High" dat += "
" -// dat += "Genital Colors:[features["genitals_use_skintone"] == TRUE ? "Skin Tone" : "Custom"]
" dat += "" @@ -405,6 +406,8 @@ var/list/preferences_datums = list() 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 @@ var/list/preferences_datums = list() 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"]" @@ -847,6 +858,11 @@ var/list/preferences_datums = list() eye_color = random_eye_color() if("s_tone") skin_tone = random_skin_tone() + if(pref_species.use_skintones && features["genitals_use_skintone"]) + features["cock_color"] = sanitize_hexcolor(skintone2hex(skin_tone)) + features["breasts_color"] = sanitize_hexcolor(skintone2hex(skin_tone)) + features["vag_color"] = sanitize_hexcolor(skintone2hex(skin_tone)) + features["balls_color"] = sanitize_hexcolor(skintone2hex(skin_tone)) if("bag") backbag = pick(backbaglist) if("all") @@ -1163,6 +1179,10 @@ var/list/preferences_datums = list() var/new_s_tone = input(user, "Choose your character's skin-tone:", "Character Preference") as null|anything in skin_tones if(new_s_tone) skin_tone = new_s_tone + features["cock_color"] = sanitize_hexcolor(skintone2hex(skin_tone)) + features["breasts_color"] = sanitize_hexcolor(skintone2hex(skin_tone)) + features["vag_color"] = sanitize_hexcolor(skintone2hex(skin_tone)) + features["balls_color"] = sanitize_hexcolor(skintone2hex(skin_tone)) if("ooccolor") var/new_ooccolor = input(user, "Choose your OOC colour:", "Game Preference") as color|null @@ -1313,6 +1333,12 @@ var/list/preferences_datums = list() 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 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 +1349,11 @@ var/list/preferences_datums = list() 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 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 +1369,22 @@ var/list/preferences_datums = list() 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 + features["cock_color"] = sanitize_hexcolor(skintone2hex(skin_tone)) + features["breasts_color"] = sanitize_hexcolor(skintone2hex(skin_tone)) + features["vag_color"] = sanitize_hexcolor(skintone2hex(skin_tone)) + features["balls_color"] = sanitize_hexcolor(skintone2hex(skin_tone)) + else + features["genitals_use_skintone"] = FALSE + features["cock_color"] = sanitize_hexcolor(skintone2hex(skin_tone)) + features["breasts_color"] = sanitize_hexcolor(skintone2hex(skin_tone)) + features["vag_color"] = sanitize_hexcolor(skintone2hex(skin_tone)) + features["balls_color"] = sanitize_hexcolor(skintone2hex(skin_tone)) if("arousable") switch(arousable) if(TRUE) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index b4006ea5a9..6631f0dfe7 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -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"], breasts_size_list, "C") + features["breasts_shape"] = sanitize_inlist(features["breasts_shape"], breasts_shapes_list, "pair") features["breasts_color"] = sanitize_hexcolor(features["breasts_color"], 3, 0) features["breasts_fluid"] = sanitize_inlist(features["breasts_fluid"], 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"], 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 017f081bd7..6b4c19078b 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -357,12 +357,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 @@ -488,7 +487,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) @@ -695,9 +694,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 @@ -710,6 +708,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/icons/mob/special/mam_taur.dmi b/icons/mob/special/mam_taur.dmi index 4626f63404..5760b7b3ab 100644 Binary files a/icons/mob/special/mam_taur.dmi and b/icons/mob/special/mam_taur.dmi differ