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.
@@ -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"
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -81,6 +81,7 @@
|
||||
CRASH("Provided percentage is invalid")
|
||||
if(getPercentAroused() >= percentage)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
//H U D//
|
||||
/mob/living/proc/updatearousal()
|
||||
|
||||
|
Before Width: | Height: | Size: 698 B After Width: | Height: | Size: 703 B |
|
Before Width: | Height: | Size: 762 B After Width: | Height: | Size: 769 B |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 592 B After Width: | Height: | Size: 644 B |
@@ -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"]]"
|
||||
@@ -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)
|
||||
for(var/L in relevant_layers)
|
||||
H.apply_overlay(L)
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 ..()
|
||||
@@ -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 += "</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'>"
|
||||
|
||||
@@ -405,6 +406,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
||||
dat += "<b>Tertiary Color: </b><span style='border: 1px solid #161616; background-color: #[features["mcolor3"]];'> </span> <a href='?_src_=prefs;preference=mutant_color3;task=input'>Change</a><BR>"
|
||||
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>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)
|
||||
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];'> </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>Has Testicles:</b><a href='?_src_=prefs;preference=has_balls'>[features["has_balls"] == TRUE ? "Yes" : "No"]</a><BR>"
|
||||
if(features["has_balls"] == TRUE)
|
||||
dat += "<b>Testicles Color:</b><span style='border: 1px solid #161616; background-color: #[features["balls_color"]];'> </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)];'> </span>(Skin tone overriding)<BR>"
|
||||
else
|
||||
dat += "<b>Testicles Color:</b><span style='border: 1px solid #161616; background-color: #[features["balls_color"]];'> </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>"
|
||||
if(features["has_vag"])
|
||||
dat += "<b>Vagina Color:</b><span style='border: 1px solid #161616; background-color: #[features["vag_color"]];'> </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)];'> </span>(Skin tone overriding)<BR>"
|
||||
else
|
||||
dat += "<b>Vagina Color:</b><span style='border: 1px solid #161616; background-color: #[features["vag_color"]];'> </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 Breasts:</b><a href='?_src_=prefs;preference=has_breasts'>[features["has_breasts"] == TRUE ? "Yes" : "No"]</a><BR>"
|
||||
if(features["has_breasts"])
|
||||
// if(pref_species.use_skintones)
|
||||
// dat += "<b>Color:</b><span style='border: 1px solid #161616; background-color: #[skintone2hex(skin_tone)];'> </span>(Skin tone overriding)"
|
||||
// else
|
||||
// dat += "<b>Color:</b><span style='border: 1px solid #161616; background-color: #[features["breasts_color"]];'> </span> <a href='?_src_=prefs;preference=breasts_color;task=input'>Change</a>"
|
||||
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)];'> </span>(Skin tone overriding)<BR>"
|
||||
else
|
||||
dat += "<b>Color:</b><span style='border: 1px solid #161616; background-color: #[features["breasts_color"]];'> </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>Breast Shape:</b><a href='?_src_=prefs;preference=breasts_shape;task=input'>[features["breasts_shape"]]</a><br>"
|
||||
/*
|
||||
dat += "<h3>Ovipositor</h3>"
|
||||
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)
|
||||
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 << "<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")
|
||||
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)
|
||||
|
||||
@@ -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"]
|
||||
|
||||
@@ -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)
|
||||
|
||||