diff --git a/code/__DEFINES/~skyrat_defines/DNA.dm b/code/__DEFINES/~skyrat_defines/DNA.dm
index f691b97ccf1..af0d9022c48 100644
--- a/code/__DEFINES/~skyrat_defines/DNA.dm
+++ b/code/__DEFINES/~skyrat_defines/DNA.dm
@@ -66,7 +66,7 @@
#define SHEATH_NORMAL "Sheath"
#define SHEATH_SLIT "Slit"
-#define MANDATORY_FEATURE_LIST list("mcolor" = "FFB","mcolor2" = "FFB","mcolor3" = "FFB","ethcolor" = "FCC","skin_color" = "FED","flavor_text" = "","breasts_size" = 1,"breasts_lactation" = FALSE,"penis_size" = 13,"penis_girth" = 9,"penis_taur_mode" = TRUE,"penis_sheath" = SHEATH_NONE ,"balls_size" = 1, "body_size" = BODY_SIZE_NORMAL, "custom_species" = null)
+#define MANDATORY_FEATURE_LIST list("mcolor" = "FFB","mcolor2" = "FFB","mcolor3" = "FFB","ethcolor" = "FCC","skin_color" = "FED","flavor_text" = "","breasts_size" = 1,"breasts_lactation" = FALSE,"penis_size" = 13,"penis_girth" = 9,"penis_taur_mode" = TRUE,"penis_sheath" = SHEATH_NONE ,"balls_size" = 1, "body_size" = BODY_SIZE_NORMAL, "custom_species" = null, "uses_skintones" = FALSE)
#define UNDERWEAR_HIDE_SOCKS (1<<0)
#define UNDERWEAR_HIDE_SHIRT (1<<1)
diff --git a/modular_skyrat/modules/customization/_globalvars/lists.dm b/modular_skyrat/modules/customization/_globalvars/lists.dm
index 6a4f94df03e..6c2441a831b 100644
--- a/modular_skyrat/modules/customization/_globalvars/lists.dm
+++ b/modular_skyrat/modules/customization/_globalvars/lists.dm
@@ -26,16 +26,6 @@ GLOBAL_LIST_INIT(balls_size_translation, list("0" = "Small",
"3" = "Enormous"
))
-/*GLOBAL_LIST_INIT(bitflag_to_marking_zones, list(HEAD = "Head",
- CHEST = "Chest",
- LEG_LEFT = "Left Leg",
- LEG_RIGHT = "Right Leg",
- ARM_LEFT = "Left Arm",
- ARM_RIGHT = "Right Arm",
- HAND_LEFT = "Left Hand",
- HAND_RIGHT = "Right Hand"
- ))*/
-
GLOBAL_LIST_INIT(marking_zone_to_bitflag, list(BODY_ZONE_HEAD = HEAD,
BODY_ZONE_CHEST = CHEST,
BODY_ZONE_L_LEG = LEG_LEFT,
@@ -51,7 +41,7 @@ GLOBAL_LIST_INIT(marking_zone_to_bitflag, list(BODY_ZONE_HEAD = HEAD,
GLOBAL_LIST_INIT(marking_zones, list(BODY_ZONE_HEAD,BODY_ZONE_CHEST,BODY_ZONE_L_LEG,BODY_ZONE_R_LEG,BODY_ZONE_L_ARM,BODY_ZONE_R_ARM,BODY_ZONE_PRECISE_L_HAND,BODY_ZONE_PRECISE_R_HAND))
///Those are the values available from prefs
-GLOBAL_LIST_INIT(preference_breast_sizes, list("Flatchested","A","B","C","D","E","F","G","H"))
+GLOBAL_LIST_INIT(preference_breast_sizes, list("Flatchested","A","B","C","D","E","F","G","H","I","J"))
GLOBAL_LIST_INIT(preference_balls_sizes, list("Small","Average","Big","Enormous"))
diff --git a/modular_skyrat/modules/customization/datums/dna.dm b/modular_skyrat/modules/customization/datums/dna.dm
index dac7c5b4a49..9e6927a48ed 100644
--- a/modular_skyrat/modules/customization/datums/dna.dm
+++ b/modular_skyrat/modules/customization/datums/dna.dm
@@ -22,7 +22,7 @@
var/change_multiplier = features["body_size"] / current_body_size
//We update the translation to make sure our character doesn't go out of the southern bounds of the tile
var/translate = ((change_multiplier-1) * 32)/2
- holder.transform = holder.transform.Scale(change_multiplier, change_multiplier)
+ holder.transform = holder.transform.Scale(change_multiplier)
holder.transform = holder.transform.Translate(0, translate)
current_body_size = features["body_size"]
diff --git a/modular_skyrat/modules/customization/icons/mob/sprite_accessory/genitals/breasts_onmob.dmi b/modular_skyrat/modules/customization/icons/mob/sprite_accessory/genitals/breasts_onmob.dmi
index 2c9cbe63549..47c61a4af48 100644
Binary files a/modular_skyrat/modules/customization/icons/mob/sprite_accessory/genitals/breasts_onmob.dmi and b/modular_skyrat/modules/customization/icons/mob/sprite_accessory/genitals/breasts_onmob.dmi differ
diff --git a/modular_skyrat/modules/customization/icons/mob/sprite_accessory/genitals/penis_onmob.dmi b/modular_skyrat/modules/customization/icons/mob/sprite_accessory/genitals/penis_onmob.dmi
index d52cf2f7abf..153fe78c50a 100644
Binary files a/modular_skyrat/modules/customization/icons/mob/sprite_accessory/genitals/penis_onmob.dmi and b/modular_skyrat/modules/customization/icons/mob/sprite_accessory/genitals/penis_onmob.dmi differ
diff --git a/modular_skyrat/modules/customization/icons/mob/sprite_accessory/genitals/testicles_onmob.dmi b/modular_skyrat/modules/customization/icons/mob/sprite_accessory/genitals/testicles_onmob.dmi
index 13e4360ccbb..11fd2c518bb 100644
Binary files a/modular_skyrat/modules/customization/icons/mob/sprite_accessory/genitals/testicles_onmob.dmi and b/modular_skyrat/modules/customization/icons/mob/sprite_accessory/genitals/testicles_onmob.dmi differ
diff --git a/modular_skyrat/modules/customization/icons/obj/genitals/breasts.dmi b/modular_skyrat/modules/customization/icons/obj/genitals/breasts.dmi
index c57fbe5fc8a..c193919c23e 100644
Binary files a/modular_skyrat/modules/customization/icons/obj/genitals/breasts.dmi and b/modular_skyrat/modules/customization/icons/obj/genitals/breasts.dmi differ
diff --git a/modular_skyrat/modules/customization/modules/client/preferences.dm b/modular_skyrat/modules/customization/modules/client/preferences.dm
index bcd6fe14365..48acb4bd566 100644
--- a/modular_skyrat/modules/customization/modules/client/preferences.dm
+++ b/modular_skyrat/modules/customization/modules/client/preferences.dm
@@ -538,9 +538,8 @@
if(pref_species.can_have_genitals)
- dat += "
Arousal Preview
"
- dat += "Change arousal preview"
dat += APPEARANCE_CATEGORY_COLUMN
+ dat += "Change arousal preview"
dat += "Penis
"
var/penis_name = mutant_bodyparts["penis"][MUTANT_INDEX_NAME]
dat += print_bodypart_change_line("penis")
@@ -565,6 +564,7 @@
dat += ""
dat += APPEARANCE_CATEGORY_COLUMN
+ dat += "Uses skintones: [(features["uses_skintones"]) ? "Yes" : "No"]"
dat += "Vagina
"
dat += print_bodypart_change_line("vagina")
dat += "Womb
"
@@ -572,6 +572,7 @@
dat += ""
dat += APPEARANCE_CATEGORY_COLUMN
+ dat += "
"
dat += "Breasts
"
var/breasts_name = mutant_bodyparts["breasts"][MUTANT_INDEX_NAME]
dat += print_bodypart_change_line("breasts")
@@ -1735,7 +1736,7 @@
validate_color_keys_for_part(key)
if(!allow_advanced_colors)
var/datum/sprite_accessory/SA = GLOB.sprite_accessories[key][new_name]
- mutant_bodyparts[key][MUTANT_INDEX_COLOR_LIST] = SA.get_default_color(features)
+ mutant_bodyparts[key][MUTANT_INDEX_COLOR_LIST] = SA.get_default_color(features, pref_species)
if("change_color")
var/key = href_list["key"]
if(!mutant_bodyparts[key])
@@ -1752,7 +1753,7 @@
if(!mutant_bodyparts[key])
return
var/datum/sprite_accessory/SA = GLOB.sprite_accessories[key][mutant_bodyparts[key][MUTANT_INDEX_NAME]]
- mutant_bodyparts[key][MUTANT_INDEX_COLOR_LIST] = SA.get_default_color(features)
+ mutant_bodyparts[key][MUTANT_INDEX_COLOR_LIST] = SA.get_default_color(features, pref_species)
if("reset_all_colors")
var/action = alert(user, "Are you sure you want to reset all colors?", "", "Yes", "No")
if(action == "Yes")
@@ -1881,6 +1882,10 @@
if(!isnull(msg))
exploitable_info = strip_html_simple(msg, MAX_FLAVOR_LEN, TRUE)
+ if("uses_skintones")
+ needs_update = TRUE
+ features["uses_skintones"] = !features["uses_skintones"]
+
if("erp_pref")
switch(erp_pref)
if("Yes")
diff --git a/modular_skyrat/modules/customization/modules/mob/dead/new_player/preferences_setup.dm b/modular_skyrat/modules/customization/modules/mob/dead/new_player/preferences_setup.dm
index 61e6c3f89c3..966d8e6ca65 100644
--- a/modular_skyrat/modules/customization/modules/mob/dead/new_player/preferences_setup.dm
+++ b/modular_skyrat/modules/customization/modules/mob/dead/new_player/preferences_setup.dm
@@ -100,6 +100,8 @@
features[key] = new_features[key]
mutant_bodyparts = pref_species.get_random_mutant_bodyparts(features)
body_markings = pref_species.get_random_body_markings(features)
+ if(pref_species.use_skintones)
+ features["uses_skintones"] = TRUE
//We reset the quirk-based stuff
augments = list()
all_quirks = list()
diff --git a/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/genitals.dm b/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/genitals.dm
index 61952335ddf..f0bc2a8b0c4 100644
--- a/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/genitals.dm
+++ b/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories/genitals.dm
@@ -1,6 +1,7 @@
/datum/sprite_accessory/genital
special_render_case = TRUE
var/associated_organ_slot
+ var/uses_skintones
/datum/sprite_accessory/genital/is_hidden(mob/living/carbon/human/H, obj/item/bodypart/HD)
var/obj/item/organ/genital/badonkers = H.getorganslot(associated_organ_slot)
@@ -36,6 +37,7 @@
special_x_dimension = TRUE
//default_color = DEFAULT_SKIN_OR_PRIMARY //This is the price we're paying for sheaths
relevent_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER)
+ var/can_have_sheath = TRUE
/datum/sprite_accessory/genital/penis/is_hidden(mob/living/carbon/human/H, obj/item/bodypart/HD)
if(H.underwear != "Nude" && !(H.underwear_visibility & UNDERWEAR_HIDE_UNDIES))
@@ -67,7 +69,10 @@
/datum/sprite_accessory/genital/penis/human
icon_state = "human"
name = "Human"
+ color_src = USE_ONE_COLOR
default_color = DEFAULT_SKIN_OR_PRIMARY
+ uses_skintones = TRUE
+ can_have_sheath = FALSE
/datum/sprite_accessory/genital/penis/knotted
icon_state = "knotted"
@@ -105,6 +110,7 @@
always_color_customizable = TRUE
special_icon_case = TRUE
special_x_dimension = TRUE
+ default_color = DEFAULT_SKIN_OR_PRIMARY
relevent_layers = list(BODY_ADJ_LAYER, BODY_BEHIND_LAYER)
var/has_size = TRUE
@@ -138,6 +144,7 @@
/datum/sprite_accessory/genital/testicles/pair
name = "Pair"
icon_state = "pair"
+ uses_skintones = TRUE
/datum/sprite_accessory/genital/testicles/internal
name = "Internal"
@@ -230,6 +237,7 @@
always_color_customizable = TRUE
default_color = DEFAULT_SKIN_OR_PRIMARY
relevent_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER)
+ uses_skintones = TRUE
/datum/sprite_accessory/genital/breasts/is_hidden(mob/living/carbon/human/H, obj/item/bodypart/HD)
if(H.undershirt != "Nude" && !(H.underwear_visibility & UNDERWEAR_HIDE_SHIRT))
diff --git a/modular_skyrat/modules/customization/modules/surgery/organs/genitals.dm b/modular_skyrat/modules/customization/modules/surgery/organs/genitals.dm
index cfd92aa2ce0..c49623fdb67 100644
--- a/modular_skyrat/modules/customization/modules/surgery/organs/genitals.dm
+++ b/modular_skyrat/modules/customization/modules/surgery/organs/genitals.dm
@@ -13,6 +13,8 @@
var/visibility_preference = GENITAL_HIDDEN_BY_CLOTHES
///Whether the organ is aroused, matters for sprites, use AROUSAL_CANT, AROUSAL_NONE, AROUSAL_PARTIAL or AROUSAL_FULL
var/aroused = AROUSAL_NONE
+ ///Whether the organ is supposed to use a skintoned variant of the sprite
+ var/uses_skintones
//This translates the float size into a sprite string
/obj/item/organ/genital/proc/get_sprite_size_string()
@@ -42,9 +44,11 @@
/obj/item/organ/genital/build_from_dna(datum/dna/DNA, associated_key)
..()
- var/datum/sprite_accessory/SA = GLOB.sprite_accessories[associated_key][DNA.mutant_bodyparts[associated_key][MUTANT_INDEX_NAME]]
+ var/datum/sprite_accessory/genital/SA = GLOB.sprite_accessories[associated_key][DNA.mutant_bodyparts[associated_key][MUTANT_INDEX_NAME]]
genital_name = SA.name
genital_type = SA.icon_state
+ if(DNA.features["uses_skintones"])
+ uses_skintones = SA.uses_skintones
update_sprite_suffix()
/obj/item/organ/genital/penis
@@ -95,7 +99,10 @@
size_affix = "3"
else
size_affix = "4"
- icon_state = "penis_[genital_type]_[size_affix]"
+ var/passed_string = "penis_[genital_type]_[size_affix]"
+ if(uses_skintones)
+ passed_string += "_s"
+ icon_state = passed_string
/obj/item/organ/genital/penis/get_sprite_size_string()
if(aroused != AROUSAL_FULL && sheath != SHEATH_NONE) //Sheath time!
@@ -120,12 +127,17 @@
size_affix = "3"
else
size_affix = "4"
- return "[genital_type]_[size_affix]_[is_erect]"
+ var/passed_string = "[genital_type]_[size_affix]_[is_erect]"
+ if(uses_skintones)
+ passed_string += "_s"
+ return passed_string
/obj/item/organ/genital/penis/build_from_dna(datum/dna/DNA, associated_key)
..()
girth = DNA.features["penis_girth"]
- sheath = DNA.features["penis_sheath"]
+ var/datum/sprite_accessory/genital/penis/PS = GLOB.sprite_accessories[associated_key][DNA.mutant_bodyparts[associated_key][MUTANT_INDEX_NAME]]
+ if(PS.can_have_sheath)
+ sheath = DNA.features["penis_sheath"]
set_size(DNA.features["penis_size"])
/obj/item/organ/genital/testicles
@@ -139,6 +151,13 @@
slot = ORGAN_SLOT_TESTICLES
aroused = AROUSAL_CANT
+/obj/item/organ/genital/testicles/update_genital_icon_state()
+ var/measured_size = clamp(genital_size, 1, 3)
+ var/passed_string = "testicles_[genital_type]_[measured_size]"
+ if(uses_skintones)
+ passed_string += "_s"
+ icon_state = passed_string
+
/obj/item/organ/genital/testicles/get_description_string(datum/sprite_accessory/genital/gas)
return "You see a pair of testicles, they look [lowertext(balls_size_to_description(genital_size))]."
@@ -148,11 +167,11 @@
/obj/item/organ/genital/testicles/get_sprite_size_string()
var/measured_size = FLOOR(genital_size,1)
- if(measured_size < 0)
- measured_size = 0
- else if (measured_size > 3)
- measured_size = 3
- return "[genital_type]_[measured_size]"
+ measured_size = clamp(measured_size, 0, 3)
+ var/passed_string = "[genital_type]_[measured_size]"
+ if(uses_skintones)
+ passed_string += "_s"
+ return passed_string
/obj/item/organ/genital/vagina
name = "vagina"
@@ -212,7 +231,7 @@
if("Flatchested")
size_description = " They are small and flat, however."
if("beyond measurement")
- size_description = " Their size is enormous, far beyond measurement."
+ size_description = " Their size is enormous, you estimate they're around [genital_size] inches in diameter."
else
size_description = " You estimate they are [translation]-cups."
returned_string += size_description
@@ -230,7 +249,10 @@
current_size = 0
else if (current_size > max_size)
current_size = max_size
- icon_state = "breasts_pair_[current_size]"
+ var/passed_string = "breasts_pair_[current_size]"
+ if(uses_skintones)
+ passed_string += "_s"
+ icon_state = passed_string
/obj/item/organ/genital/breasts/get_sprite_size_string()
var/max_size = 5
@@ -241,7 +263,10 @@
current_size = 0
else if (current_size > max_size)
current_size = max_size
- return "[genital_type]_[current_size]"
+ var/passed_string = "[genital_type]_[current_size]"
+ if(uses_skintones)
+ passed_string += "_s"
+ return passed_string
/obj/item/organ/genital/breasts/build_from_dna(datum/dna/DNA, associated_key)
..()