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) ..()