Huge Sprite Rework (#342)

* Revert "Revert "Huge Sprite Rework""

* Compilation of all feedback fixes

This commit contains all the suggested fixes so far and the changes we
came up with through discussion about the code.
For example, genitals **may** now use alternate icons for aroused
states, but does not have to, this is decided by a boolean variable in
the sprite accessory itself, defaulting to not using alternate icons.
Genital icon_state names now follow a new format to match these new
options in a modular way for all kinds of genitals.

* Conflict solving

reformats all the taurs to use the TAUR layer instead of the BODY_FRONT
layer. Same for the new Eevee sprites.

* Committing the old, unfixed file.

This will cause errors if used, but at least it won't cause conflicts.

* Contains fixed sprite names

The shepherd taur body should STILL have a hole in the body due to a
pixel error.
I have forgotten which pixes these are, so.... **le shrug**

* Anger commit

Commiting this in anger. I WILL make it work damnit!

* Proper name fixes.

Also renames the taur cow to no longer have an incorrectly duplicate
icon_state.

* Shepherd taur pixel fix

Fixes the missing pixels from the taur body that caused a hole to appear
when viewed from the sides.

* Conflict resolution

This PR will cause some sprite-breaking overlay errors.
But it's the only way to handle the conflicting .dmi.
So I'll make a separate PR to fix the sprites later.

* Fixes global lists

Now they use whatever weird new system we got for them.
This commit is contained in:
ktccd
2017-04-15 13:24:44 +02:00
committed by TalkingCactus
parent bd1a26de8d
commit c785038994
19 changed files with 336 additions and 145 deletions

View File

@@ -32,14 +32,13 @@
//Human Overlays Indexes///////// //Human Overlays Indexes/////////
//citadel code //citadel code
#define MUTATIONS_LAYER 31 //mutations. Tk headglows, cold resistance glow, etc #define MUTATIONS_LAYER 30 //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 BODY_BEHIND_LAYER 29 //certain mutantrace features (tail when looking south) that must appear behind the body parts
#define GENITALS_BEHIND_LAYER 29 #define GENITALS_BEHIND_LAYER 28
#define BODYPARTS_LAYER 28 //Initially "AUGMENTS", this was repurposed to be a catch-all bodyparts flag #define BODYPARTS_LAYER 27 //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 BODY_ADJ_LAYER 26 //certain mutantrace features (snout, body markings) that must appear above the body parts
#define GENITALS_ADJ_LAYER 26 #define GENITALS_ADJ_LAYER 25
#define BODY_LAYER 25 //underwear, undershirts, socks, eyes, lips(makeup) #define BODY_LAYER 24 //underwear, undershirts, socks, eyes, lips(makeup)
#define GENITALS_FRONT_LAYER 24
#define FRONT_MUTATIONS_LAYER 23 //mutations that should appear above body, body_adj and bodyparts layer (e.g. laser eyes) #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 DAMAGE_LAYER 22 //damage indicators (cuts and burns)
#define UNIFORM_LAYER 21 #define UNIFORM_LAYER 21
@@ -49,7 +48,7 @@
#define EARS_LAYER 17 #define EARS_LAYER 17
#define SUIT_LAYER 16 #define SUIT_LAYER 16
#define BODY_TAUR_LAYER 15 #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 GLASSES_LAYER 13
#define BELT_LAYER 12 //Possible make this an overlay of somethign required to wear a belt? #define BELT_LAYER 12 //Possible make this an overlay of somethign required to wear a belt?
#define SUIT_STORE_LAYER 11 #define SUIT_STORE_LAYER 11
@@ -63,7 +62,7 @@
#define HANDS_LAYER 3 #define HANDS_LAYER 3
#define BODY_FRONT_LAYER 2 #define BODY_FRONT_LAYER 2
#define FIRE_LAYER 1 //If you're on fire #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 //Human Overlay Index Shortcuts for alternate_worn_layer, layers
//Because I *KNOW* somebody will think layer+1 means "above" //Because I *KNOW* somebody will think layer+1 means "above"

View File

@@ -48,7 +48,9 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/xeno_dorsal, GLOB.xeno_dorsal_list) init_sprite_accessory_subtypes(/datum/sprite_accessory/xeno_dorsal, GLOB.xeno_dorsal_list)
//genitals //genitals
init_sprite_accessory_subtypes(/datum/sprite_accessory/penis, GLOB.cock_shapes_list) 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 //Species
for(var/spath in subtypesof(/datum/species)) for(var/spath in subtypesof(/datum/species))

View File

@@ -71,6 +71,10 @@
if(!GLOB.cock_shapes_list.len) if(!GLOB.cock_shapes_list.len)
init_sprite_accessory_subtypes(/datum/sprite_accessory/penis, GLOB.cock_shapes_list) 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)) // if(ishuman(src))
// var/mob/living/carbon/human/H = src // var/mob/living/carbon/human/H = src
/* if(H.gender == MALE) Fuck if I know how to fix this. /* if(H.gender == MALE) Fuck if I know how to fix this.
@@ -110,7 +114,7 @@
"xenotail" = "None", "xenotail" = "None",
"exhibitionist" = FALSE, "exhibitionist" = FALSE,
"has_cock" = FALSE, "has_cock" = FALSE,
"cock_shape" = "human", "cock_shape" = pick(GLOB.cock_shapes_list),
"cock_length" = 6, "cock_length" = 6,
"cock_girth_ratio" = COCK_GIRTH_RATIO_DEF, "cock_girth_ratio" = COCK_GIRTH_RATIO_DEF,
"cock_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), "cock_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
@@ -139,8 +143,10 @@
"has_breasts" = FALSE, "has_breasts" = FALSE,
"breasts_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), "breasts_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
"breasts_size" = pick(GLOB.breasts_size_list), "breasts_size" = pick(GLOB.breasts_size_list),
"breasts_shape" = pick(GLOB.breasts_shapes_list),
"breasts_fluid" = "milk", "breasts_fluid" = "milk",
"has_vag" = FALSE, "has_vag" = FALSE,
"vag_shape" = pick(GLOB.vagina_shapes_list),
"vag_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), "vag_color" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),
"vag_clits" = 1, "vag_clits" = 1,
"vag_clit_diam" = 0.25, "vag_clit_diam" = 0.25,

View File

@@ -54,10 +54,13 @@ GLOBAL_LIST_EMPTY(xeno_dorsal_list)
//Genitals and Arousal Lists //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(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_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(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(dick_nouns, list("dick","cock","member","shaft"))
GLOBAL_LIST_INIT(cum_id_list,"semen") GLOBAL_LIST_INIT(cum_id_list,"semen")
GLOBAL_LIST_INIT(milk_id_list,"milk") GLOBAL_LIST_INIT(milk_id_list,"milk")
//mentor stuff //mentor stuff
GLOBAL_LIST_EMPTY(mentors) GLOBAL_LIST_EMPTY(mentors)

View File

@@ -81,6 +81,7 @@
CRASH("Provided percentage is invalid") CRASH("Provided percentage is invalid")
if(getPercentAroused() >= percentage) if(getPercentAroused() >= percentage)
return TRUE return TRUE
return FALSE
//H U D// //H U D//
/mob/living/proc/updatearousal() /mob/living/proc/updatearousal()

Binary file not shown.

Before

Width:  |  Height:  |  Size: 698 B

After

Width:  |  Height:  |  Size: 703 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 762 B

After

Width:  |  Height:  |  Size: 769 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 592 B

After

Width:  |  Height:  |  Size: 644 B

View File

@@ -6,11 +6,11 @@
zone = "chest" zone = "chest"
slot = "breasts" slot = "breasts"
w_class = 3 w_class = 3
size = "e" size = BREASTS_SIZE_DEF
fluid_id = "milk" fluid_id = "milk"
var/cup_size = BREASTS_SIZE_DEF
var/amount = 2 var/amount = 2
producing = TRUE producing = TRUE
shape = "pair"
/obj/item/organ/genital/breasts/Initialize() /obj/item/organ/genital/breasts/Initialize()
create_reagents(fluid_max_volume) create_reagents(fluid_max_volume)
@@ -31,3 +31,28 @@
return FALSE return FALSE
reagents.isolate_reagent(fluid_id) reagents.isolate_reagent(fluid_id)
reagents.add_reagent(fluid_id, (fluid_mult * fluid_rate)) 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"]]"

View File

@@ -11,6 +11,8 @@
var/fluid_rate = 1 var/fluid_rate = 1
var/fluid_mult = 1 var/fluid_mult = 1
var/producing = FALSE 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() /obj/item/organ/genital/Initialize()
reagents = create_reagents(fluid_max_volume) reagents = create_reagents(fluid_max_volume)
@@ -100,13 +102,14 @@
// T.color = skintone2hex(skin_tone) // T.color = skintone2hex(skin_tone)
// else // else
// T.color = "#[dna.features["balls_color"]]" // T.color = "#[dna.features["balls_color"]]"
T.size = dna.features["balls_size"] if(T)
T.sack_size = dna.features["balls_sack_size"] T.size = dna.features["balls_size"]
T.fluid_id = dna.features["balls_fluid"] T.sack_size = dna.features["balls_sack_size"]
T.fluid_rate = dna.features["balls_cum_rate"] T.fluid_id = dna.features["balls_fluid"]
T.fluid_mult = dna.features["balls_cum_mult"] T.fluid_rate = dna.features["balls_cum_rate"]
T.fluid_efficiency = dna.features["balls_efficiency"] T.fluid_mult = dna.features["balls_cum_mult"]
T.update() T.fluid_efficiency = dna.features["balls_efficiency"]
T.update()
/mob/living/carbon/human/proc/give_breasts() /mob/living/carbon/human/proc/give_breasts()
if(!dna) if(!dna)
@@ -116,9 +119,15 @@
if(!getorganslot("breasts")) if(!getorganslot("breasts"))
var/obj/item/organ/genital/breasts/B = new var/obj/item/organ/genital/breasts/B = new
B.Insert(src) B.Insert(src)
B.cup_size = dna.features["breasts_size"] if(B)
B.fluid_id = dna.features["breasts_fluid"] if(dna.species.use_skintones && dna.features["genitals_use_skintone"])
B.update() 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() /mob/living/carbon/human/proc/give_ovipositor()
@@ -131,11 +140,14 @@
if(!getorganslot("vagina")) if(!getorganslot("vagina"))
var/obj/item/organ/genital/vagina/V = new var/obj/item/organ/genital/vagina/V = new
V.Insert(src) V.Insert(src)
if(dna.species.use_skintones && dna.features["genitals_use_skintone"]) if(V)
V.color = skintone2hex(skin_tone) if(dna.species.use_skintones && dna.features["genitals_use_skintone"])
else V.color = skintone2hex(skin_tone)
V.color = "[dna.features["vag_color"]]" else
V.update() V.color = "[dna.features["vag_color"]]"
V.shape = "[dna.features["vag_shape"]]"
V.update()
/mob/living/carbon/human/proc/give_womb() /mob/living/carbon/human/proc/give_womb()
if(!dna) if(!dna)
return FALSE return FALSE
@@ -144,7 +156,8 @@
if(!getorganslot("womb")) if(!getorganslot("womb"))
var/obj/item/organ/genital/womb/W = new var/obj/item/organ/genital/womb/W = new
W.Insert(src) W.Insert(src)
W.update() if(W)
W.update()
/datum/species/proc/genitals_layertext(layer) /datum/species/proc/genitals_layertext(layer)
@@ -183,69 +196,82 @@
return return
var/list/genitals_to_add = list() 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/list/standing = list()
var/size var/size = null
H.remove_overlay(GENITALS_BEHIND_LAYER) for(var/L in relevant_layers) //Less hardcode
H.remove_overlay(GENITALS_ADJ_LAYER) H.remove_overlay(L)
H.remove_overlay(GENITALS_FRONT_LAYER)
if(H.disabilities & HUSK) if(H.disabilities & HUSK)
return return
//start scanning for genitals //start scanning for genitals
var/list/worn_stuff = H.get_equipped_items()//cache this list so it's not built again 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.is_groin_exposed(worn_stuff))
if(H.has_penis()) //ORDER is important here. Vaginas first, theoretical testes after, and penis LAST.
genitals_to_add += H.getorganslot("penis") //The latter is always drawn on top of the former.
if(H.has_vagina()) if(H.has_vagina())
genitals_to_add += H.getorganslot("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.is_chest_exposed(worn_stuff))
if(H.has_breasts()) if(H.has_breasts())
genitals_to_add += H.getorganslot("breasts") genitals_to_add += H.getorganslot("breasts")
var/image/I var/image/I
//start applying overlays //start applying overlays
for(var/layer in relevent_layers) for(var/layer in relevant_layers)
var/layertext = genitals_layertext(layer) var/layertext = genitals_layertext(layer)
for(var/obj/item/organ/genital/G in genitals_to_add) for(var/obj/item/organ/genital/G in genitals_to_add)
var/datum/sprite_accessory/S var/datum/sprite_accessory/S
size = G.size
switch(G.type) switch(G.type)
if(/obj/item/organ/genital/penis) if(/obj/item/organ/genital/penis)
S = GLOB.cock_shapes_list[G.shape] 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") if(!S || S.icon_state == "none")
continue continue
var/icon_string 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) I = image("icon" = S.icon, "icon_state" = icon_string, "layer" =- layer)
if(S.center) if(S.center)
I = center_image(I,S.dimension_x,S.dimension_y) I = center_image(I,S.dimension_x,S.dimension_y)
switch(S.color_src) if(use_skintones && H.dna.features["genitals_use_skintone"])
if("cock_color") I.color = "#[skintone2hex(H.skin_tone)]"
I.color = "#[H.dna.features["cock_color"]]" else
if("breasts_color") switch(S.color_src)
I.color = "#[H.dna.features["breasts_color"]]" if("cock_color")
if(MUTCOLORS) I.color = "#[H.dna.features["cock_color"]]"
if(fixed_mut_color) if("breasts_color")
I.color = "#[fixed_mut_color]" I.color = "#[H.dna.features["breasts_color"]]"
else if("vag_color")
I.color = "#[H.dna.features["mcolor"]]" I.color = "#[H.dna.features["vag_color"]]"
if(MUTCOLORS2) if(MUTCOLORS)
if(fixed_mut_color2) if(fixed_mut_color)
I.color = "#[fixed_mut_color2]" I.color = "#[fixed_mut_color]"
else else
I.color = "#[H.dna.features["mcolor2"]]" I.color = "#[H.dna.features["mcolor"]]"
if(MUTCOLORS3) if(MUTCOLORS2)
if(fixed_mut_color3) if(fixed_mut_color2)
I.color = "#[fixed_mut_color3]" I.color = "#[fixed_mut_color2]"
else else
I.color = "#[H.dna.features["mcolor3"]]" 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 standing += I
if(LAZYLEN(standing)) if(LAZYLEN(standing))
H.overlays_standing[layer] = standing.Copy() H.overlays_standing[layer] = standing.Copy()
standing = list() standing = list()
H.apply_overlay(GENITALS_BEHIND_LAYER) for(var/L in relevant_layers)
H.apply_overlay(GENITALS_ADJ_LAYER) H.apply_overlay(L)
H.apply_overlay(GENITALS_FRONT_LAYER)

View File

@@ -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 //DICKS,COCKS,PENISES,WHATEVER YOU WANT TO CALL THEM
/datum/sprite_accessory/penis /datum/sprite_accessory/penis
icon = 'code/citadel/icons/penis_onmob.dmi' icon = 'code/citadel/icons/penis_onmob.dmi'
@@ -27,69 +31,49 @@
icon_state = "tapered" icon_state = "tapered"
name = "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 //BREASTS BE HERE
/datum/sprite_accessory/breasts /datum/sprite_accessory/breasts
icon = 'code/citadel/icons/breasts_onmob.dmi' icon = 'code/citadel/icons/breasts_onmob.dmi'
icon_state = null icon_state = null
name = "breasts" name = "breasts"
gender_specific = 0 gender_specific = 0
color_src = MUTCOLORS2 //I'll have skin_tone override this if the species uses them color_src = "breasts_color"
locked = 0 locked = 0
/*!!ULTRACOMPRESSEDEDITION!!*/
/datum/sprite_accessory/breasts/a /datum/sprite_accessory/breasts/pair
icon_state = "a" icon_state = "pair"
name = "A" name = "Pair"
/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
//OVIPOSITORS BE HERE //OVIPOSITORS BE HERE
/datum/sprite_accessory/ovipositor /datum/sprite_accessory/ovipositor
@@ -100,10 +84,6 @@
color_src = "cock_color" color_src = "cock_color"
locked = 0 locked = 0
/datum/sprite_accessory/ovipositor/knotted
icon_state = "none"
name = "None"
/datum/sprite_accessory/ovipositor/knotted /datum/sprite_accessory/ovipositor/knotted
icon_state = "knotted" icon_state = "knotted"
name = "Knotted" name = "Knotted"

View File

@@ -44,12 +44,17 @@
if(lowershape in knotted_types) if(lowershape in knotted_types)
if(lowershape == "barbknot") if(lowershape == "barbknot")
lowershape = "barbed, knotted" 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." and [round(length * knot_girth_ratio, 0.25)] inch[length > 1 ? "es" : ""] around the knot."
else 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." 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) 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() /obj/item/organ/genital/penis/update_link()
if(owner) if(owner)

View File

@@ -5,13 +5,66 @@
icon_state = "vagina" icon_state = "vagina"
zone = "groin" zone = "groin"
slot = "vagina" slot = "vagina"
size = 1 //There is only 1 size right now
can_masturbate_with = 1 can_masturbate_with = 1
w_class = 3 w_class = 3
var/wetness = 1
var/cap_length = 8//D E P T H (cap = capacity) var/cap_length = 8//D E P T H (cap = capacity)
var/cap_girth = 12 var/cap_girth = 12
var/cap_girth_ratio = 1.5 var/cap_girth_ratio = 1.5
var/clits = 1 var/clits = 1
var/clit_diam = 0.25 var/clit_diam = 0.25
var/clit_len = 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

View File

@@ -9,5 +9,20 @@
fluid_id = "femcum" fluid_id = "femcum"
var/obj/item/organ/genital/vagina/linked_vag 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() /obj/item/organ/genital/womb/Destroy()
return ..() return ..()

View File

@@ -86,7 +86,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
"exhibitionist" = FALSE, "exhibitionist" = FALSE,
"genitals_use_skintone" = FALSE, "genitals_use_skintone" = FALSE,
"has_cock" = FALSE, "has_cock" = FALSE,
"cock_shape" = "human", "cock_shape" = "Human",
"cock_length" = 6, "cock_length" = 6,
"cock_girth_ratio" = COCK_GIRTH_RATIO_DEF, "cock_girth_ratio" = COCK_GIRTH_RATIO_DEF,
"cock_color" = "fff", "cock_color" = "fff",
@@ -115,8 +115,10 @@ GLOBAL_LIST_EMPTY(preferences_datums)
"has_breasts" = FALSE, "has_breasts" = FALSE,
"breasts_color" = "fff", "breasts_color" = "fff",
"breasts_size" = "C", "breasts_size" = "C",
"breasts_shape" = "pair",
"breasts_fluid" = "milk", "breasts_fluid" = "milk",
"has_vag" = FALSE, "has_vag" = FALSE,
"vag_shape" = "Human",
"vag_color" = "fff", "vag_color" = "fff",
"vag_clits" = 1, "vag_clits" = 1,
"vag_clit_diam" = 0.25, "vag_clit_diam" = 0.25,
@@ -353,7 +355,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
else else
dat += "High" dat += "High"
dat += "</a><br>" dat += "</a><br>"
// dat += "<b>Genital Colors:</b><a href='?_src_=prefs;preference=genitals_color_source'>[features["genitals_use_skintone"] == TRUE ? "Skin Tone" : "Custom"]</a><BR>"
dat += "</td><td width='300px' height='300px' valign='top'>" dat += "</td><td width='300px' height='300px' valign='top'>"
@@ -405,6 +406,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "<b>Tertiary Color: </b><span style='border: 1px solid #161616; background-color: #[features["mcolor3"]];'>&nbsp;&nbsp;&nbsp;</span> <a href='?_src_=prefs;preference=mutant_color3;task=input'>Change</a><BR>" dat += "<b>Tertiary Color: </b><span style='border: 1px solid #161616; background-color: #[features["mcolor3"]];'>&nbsp;&nbsp;&nbsp;</span> <a href='?_src_=prefs;preference=mutant_color3;task=input'>Change</a><BR>"
if(pref_species.use_skintones) if(pref_species.use_skintones)
dat += "<b>Skin Tone: </b><a href='?_src_=prefs;preference=s_tone;task=input'>[skin_tone]</a><BR>" dat += "<b>Skin Tone: </b><a href='?_src_=prefs;preference=s_tone;task=input'>[skin_tone]</a><BR>"
dat += "<b>Genitals Use Skintone:</b><a href='?_src_=prefs;preference=genital_colour'>[features["genitals_use_skintone"] == TRUE ? "Enabled" : "Disabled"]</a><BR>"
if(HAIR in pref_species.species_traits) if(HAIR in pref_species.species_traits)
dat += "<b>Hair Style: </b><a href='?_src_=prefs;preference=hair_style;task=input'>[hair_style]</a><BR>" dat += "<b>Hair Style: </b><a href='?_src_=prefs;preference=hair_style;task=input'>[hair_style]</a><BR>"
dat += "<b>Hair Color: </b><span style='border:1px solid #161616; background-color: #[hair_color];'>&nbsp;&nbsp;&nbsp;</span> <a href='?_src_=prefs;preference=hair;task=input'>Change</a><BR>" dat += "<b>Hair Color: </b><span style='border:1px solid #161616; background-color: #[hair_color];'>&nbsp;&nbsp;&nbsp;</span> <a href='?_src_=prefs;preference=hair;task=input'>Change</a><BR>"
@@ -473,18 +476,26 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "<b>Penis Length:</b> <a href='?_src_=prefs;preference=cock_length;task=input'>[features["cock_length"]] inch(es)</a><BR>" dat += "<b>Penis Length:</b> <a href='?_src_=prefs;preference=cock_length;task=input'>[features["cock_length"]] inch(es)</a><BR>"
dat += "<b>Has Testicles:</b><a href='?_src_=prefs;preference=has_balls'>[features["has_balls"] == TRUE ? "Yes" : "No"]</a><BR>" dat += "<b>Has Testicles:</b><a href='?_src_=prefs;preference=has_balls'>[features["has_balls"] == TRUE ? "Yes" : "No"]</a><BR>"
if(features["has_balls"] == TRUE) if(features["has_balls"] == TRUE)
dat += "<b>Testicles Color:</b><span style='border: 1px solid #161616; background-color: #[features["balls_color"]];'>&nbsp;&nbsp;&nbsp;</span> <a href='?_src_=prefs;preference=balls_color;task=input'>Change</a><BR>" if(pref_species.use_skintones && features["genitals_use_skintone"] == TRUE)
dat += "<b>Testicles Color:</b><span style='border: 1px solid #161616; background-color: #[skintone2hex(skin_tone)];'>&nbsp;&nbsp;&nbsp;</span>(Skin tone overriding)<BR>"
else
dat += "<b>Testicles Color:</b><span style='border: 1px solid #161616; background-color: #[features["balls_color"]];'>&nbsp;&nbsp;&nbsp;</span> <a href='?_src_=prefs;preference=balls_color;task=input'>Change</a><BR>"
dat += "<b>Has Vagina:</b><a href='?_src_=prefs;preference=has_vag'>[features["has_vag"] == TRUE ? "Yes" : "No"]</a><BR>" dat += "<b>Has Vagina:</b><a href='?_src_=prefs;preference=has_vag'>[features["has_vag"] == TRUE ? "Yes" : "No"]</a><BR>"
if(features["has_vag"]) if(features["has_vag"])
dat += "<b>Vagina Color:</b><span style='border: 1px solid #161616; background-color: #[features["vag_color"]];'>&nbsp;&nbsp;&nbsp;</span> <a href='?_src_=prefs;preference=vag_color;task=input'>Change</a><BR>" dat += "<b>Vagina Type:</b> <a href='?_src_=prefs;preference=vag_shape;task=input'>[features["vag_shape"]]</a><BR>"
if(pref_species.use_skintones && features["genitals_use_skintone"] == TRUE)
dat += "<b>Vagina Color:</b><span style='border: 1px solid #161616; background-color: #[skintone2hex(skin_tone)];'>&nbsp;&nbsp;&nbsp;</span>(Skin tone overriding)<BR>"
else
dat += "<b>Vagina Color:</b><span style='border: 1px solid #161616; background-color: #[features["vag_color"]];'>&nbsp;&nbsp;&nbsp;</span> <a href='?_src_=prefs;preference=vag_color;task=input'>Change</a><BR>"
dat += "<b>Has Womb:</b><a href='?_src_=prefs;preference=has_womb'>[features["has_womb"] == TRUE ? "Yes" : "No"]</a><BR>" dat += "<b>Has Womb:</b><a href='?_src_=prefs;preference=has_womb'>[features["has_womb"] == TRUE ? "Yes" : "No"]</a><BR>"
dat += "<b>Has Breasts:</b><a href='?_src_=prefs;preference=has_breasts'>[features["has_breasts"] == TRUE ? "Yes" : "No"]</a><BR>" dat += "<b>Has Breasts:</b><a href='?_src_=prefs;preference=has_breasts'>[features["has_breasts"] == TRUE ? "Yes" : "No"]</a><BR>"
if(features["has_breasts"]) if(features["has_breasts"])
// if(pref_species.use_skintones) if(pref_species.use_skintones && features["genitals_use_skintone"] == TRUE)
// dat += "<b>Color:</b><span style='border: 1px solid #161616; background-color: #[skintone2hex(skin_tone)];'>&nbsp;&nbsp;&nbsp;</span>(Skin tone overriding)" dat += "<b>Color:</b><span style='border: 1px solid #161616; background-color: #[skintone2hex(skin_tone)];'>&nbsp;&nbsp;&nbsp;</span>(Skin tone overriding)<BR>"
// else else
// dat += "<b>Color:</b><span style='border: 1px solid #161616; background-color: #[features["breasts_color"]];'>&nbsp;&nbsp;&nbsp;</span> <a href='?_src_=prefs;preference=breasts_color;task=input'>Change</a>" dat += "<b>Color:</b><span style='border: 1px solid #161616; background-color: #[features["breasts_color"]];'>&nbsp;&nbsp;&nbsp;</span> <a href='?_src_=prefs;preference=breasts_color;task=input'>Change</a><BR>"
dat += "<b>Cup Size:</b><a href='?_src_=prefs;preference=breasts_size;task=input'>[features["breasts_size"]]</a><br>" dat += "<b>Cup Size:</b><a href='?_src_=prefs;preference=breasts_size;task=input'>[features["breasts_size"]]</a><br>"
dat += "<b>Breast Shape:</b><a href='?_src_=prefs;preference=breasts_shape;task=input'>[features["breasts_shape"]]</a><br>"
/* /*
dat += "<h3>Ovipositor</h3>" dat += "<h3>Ovipositor</h3>"
dat += "<b>Has Ovipositor:</b><a href='?_src_=prefs;preference=has_ovi'>[features["has_ovi"] == TRUE ? "Yes" : "No"]</a>" dat += "<b>Has Ovipositor:</b><a href='?_src_=prefs;preference=has_ovi'>[features["has_ovi"] == TRUE ? "Yes" : "No"]</a>"
@@ -1313,6 +1324,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(new_size) if(new_size)
features["breasts_size"] = 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") if("breasts_color")
var/new_breasts_color = input(user, "Breast Color:", "Character Preference") as color|null var/new_breasts_color = input(user, "Breast Color:", "Character Preference") as color|null
if(new_breasts_color) if(new_breasts_color)
@@ -1323,6 +1340,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
features["breasts_color"] = sanitize_hexcolor(new_breasts_color) features["breasts_color"] = sanitize_hexcolor(new_breasts_color)
else else
user << "<span class='danger'>Invalid color. Your color is not bright enough.</span>" user << "<span class='danger'>Invalid color. Your color is not bright enough.</span>"
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") if("vag_color")
var/new_vagcolor = input(user, "Vagina color:", "Character Preference") as color|null var/new_vagcolor = input(user, "Vagina color:", "Character Preference") as color|null
if(new_vagcolor) if(new_vagcolor)
@@ -1338,6 +1360,14 @@ GLOBAL_LIST_EMPTY(preferences_datums)
switch(href_list["preference"]) switch(href_list["preference"])
//citadel code //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") if("arousable")
switch(arousable) switch(arousable)
if(TRUE) if(TRUE)

View File

@@ -2,7 +2,7 @@
#define SAVEFILE_VERSION_MIN 10 #define SAVEFILE_VERSION_MIN 10
//This is the current version, anything below this will attempt to update (if it's not obsolete) //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 SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn
This proc checks if the current directory of the savefile S needs updating 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 joblessrole = BEASSISTANT
if(current_version < 17) if(current_version < 17)
features["legs"] = "Normal Legs" 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_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_ears"] = sanitize_inlist(features["mam_ears"], GLOB.mam_ears_list)
features["mam_tail"] = sanitize_inlist(features["mam_tail"], GLOB.mam_tails_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 //breasts features
features["has_breasts"] = sanitize_integer(features["has_breasts"], 0, 1, 0) 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_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_color"] = sanitize_hexcolor(features["breasts_color"], 3, 0)
features["breasts_fluid"] = sanitize_inlist(features["breasts_fluid"], GLOB.milk_id_list, "milk") features["breasts_fluid"] = sanitize_inlist(features["breasts_fluid"], GLOB.milk_id_list, "milk")
//vagina features //vagina features
features["has_vag"] = sanitize_integer(features["has_vag"], 0, 1, 0) 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) features["vag_color"] = sanitize_hexcolor(features["vag_color"], 3, 0)
//womb features //womb features
features["has_womb"] = sanitize_integer(features["has_womb"], 0, 1, 0) 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 //breasts features
S["feature_has_breasts"] >> features["has_breasts"] S["feature_has_breasts"] >> features["has_breasts"]
S["feature_breasts_size"] >> features["breasts_size"] S["feature_breasts_size"] >> features["breasts_size"]
S["feature_breasts_shape"] >> features["breasts_shape"]
S["feature_breasts_color"] >> features["breasts_color"] S["feature_breasts_color"] >> features["breasts_color"]
S["feature_breasts_fluid"] >> features["breasts_fluid"] S["feature_breasts_fluid"] >> features["breasts_fluid"]
//vagina features //vagina features
S["feature_has_vag"] >> features["has_vag"] S["feature_has_vag"] >> features["has_vag"]
S["feature_vag_shape"] >> features["vag_shape"]
S["feature_vag_color"] >> features["vag_color"] S["feature_vag_color"] >> features["vag_color"]
//womb features //womb features
S["feature_has_womb"] >> features["has_womb"] S["feature_has_womb"] >> features["has_womb"]
@@ -547,10 +551,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
//breasts features //breasts features
S["feature_has_breasts"] << features["has_breasts"] S["feature_has_breasts"] << features["has_breasts"]
S["feature_breasts_size"] << features["breasts_size"] S["feature_breasts_size"] << features["breasts_size"]
S["feature_breasts_shape"] << features["breasts_shape"]
S["feature_breasts_color"] << features["breasts_color"] S["feature_breasts_color"] << features["breasts_color"]
S["feature_breasts_fluid"] << features["breasts_fluid"] S["feature_breasts_fluid"] << features["breasts_fluid"]
//vagina features //vagina features
S["feature_has_vag"] << features["has_vag"] S["feature_has_vag"] << features["has_vag"]
S["feature_vag_shape"] << features["vag_shape"]
S["feature_vag_color"] << features["vag_color"] S["feature_vag_color"] << features["vag_color"]
//womb features //womb features
S["feature_has_womb"] << features["has_womb"] S["feature_has_womb"] << features["has_womb"]

View File

@@ -366,12 +366,11 @@
/datum/species/proc/handle_mutant_bodyparts(mob/living/carbon/human/H, forced_colour) /datum/species/proc/handle_mutant_bodyparts(mob/living/carbon/human/H, forced_colour)
var/list/bodyparts_to_add = mutant_bodyparts.Copy() 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() var/list/standing = list()
H.remove_overlay(BODY_BEHIND_LAYER) for(var/L in relevant_layers)
H.remove_overlay(BODY_ADJ_LAYER) H.remove_overlay(L)
H.remove_overlay(BODY_FRONT_LAYER)
if(!mutant_bodyparts) if(!mutant_bodyparts)
return return
@@ -497,7 +496,7 @@
var/image/I var/image/I
for(var/layer in relevent_layers) for(var/layer in relevant_layers)
var/layertext = mutant_bodyparts_layertext(layer) var/layertext = mutant_bodyparts_layertext(layer)
for(var/bodypart in bodyparts_to_add) for(var/bodypart in bodyparts_to_add)
@@ -704,9 +703,8 @@
H.overlays_standing[layer] = standing.Copy() H.overlays_standing[layer] = standing.Copy()
standing = list() standing = list()
H.apply_overlay(BODY_BEHIND_LAYER) for(var/L in relevant_layers)
H.apply_overlay(BODY_ADJ_LAYER) H.apply_overlay(L)
H.apply_overlay(BODY_FRONT_LAYER)
//This exists so sprite accessories can still be per-layer without having to include that layer's //This exists so sprite accessories can still be per-layer without having to include that layer's
@@ -719,6 +717,8 @@
return "ADJ" return "ADJ"
if(BODY_FRONT_LAYER) if(BODY_FRONT_LAYER)
return "FRONT" return "FRONT"
if(BODY_TAUR_LAYER)
return "TAUR"
/datum/species/proc/spec_life(mob/living/carbon/human/H) /datum/species/proc/spec_life(mob/living/carbon/human/H)

View File

@@ -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.