diff --git a/modular_bandastation/species/code/clothing/human_update_icons.dm b/modular_bandastation/species/code/clothing/human_update_icons.dm index 4b29722f827cc1..5c70d17284ebd6 100644 --- a/modular_bandastation/species/code/clothing/human_update_icons.dm +++ b/modular_bandastation/species/code/clothing/human_update_icons.dm @@ -48,7 +48,7 @@ overlays_standing[FACEMASK_LAYER] = mask_overlay apply_overlay(FACEMASK_LAYER) - update_mutant_bodyparts() + update_body_parts() /mob/living/carbon/human/update_worn_head(update_obscured = TRUE) remove_overlay(HEAD_LAYER) @@ -130,6 +130,6 @@ my_chest?.worn_suit_offset?.apply_offset(suit_overlay) overlays_standing[SUIT_LAYER] = suit_overlay update_body_parts() - update_mutant_bodyparts() + update_body_parts() apply_overlay(SUIT_LAYER) diff --git a/modular_bandastation/species/code/human/species_type/vulpkanin.dm b/modular_bandastation/species/code/human/species_type/vulpkanin.dm index 016977bf6fde51..49105bde3c2750 100644 --- a/modular_bandastation/species/code/human/species_type/vulpkanin.dm +++ b/modular_bandastation/species/code/human/species_type/vulpkanin.dm @@ -17,17 +17,11 @@ mutanttongue = /obj/item/organ/internal/tongue/vulpkanin mutantliver = /obj/item/organ/internal/liver/vulpkanin mutantstomach = /obj/item/organ/internal/stomach/vulpkanin - - external_organs = list( + mutant_organs = list( /obj/item/organ/external/tail/vulpkanin = "Default", ) - mutant_bodyparts = list( - "wings" = "None", - "vulpkanin_body_markings" = "None", - "vulpkanin_tail_markings" = "None", - ) - + body_markings = list(/datum/bodypart_overlay/simple/body_marking/vulpkanin = "None") bodypart_overrides = list( BODY_ZONE_HEAD = /obj/item/bodypart/head/vulpkanin, BODY_ZONE_CHEST = /obj/item/bodypart/chest/vulpkanin, @@ -214,90 +208,30 @@ 'sound/voice/human/manlaugh2.ogg', ) -/datum/species/vulpkanin/handle_mutant_bodyparts(mob/living/carbon/human/source, 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/standing = list() - - source.remove_overlay(BODY_BEHIND_LAYER) - source.remove_overlay(BODY_ADJ_LAYER) - source.remove_overlay(BODY_FRONT_LAYER) - - if(!mutant_bodyparts || HAS_TRAIT(source, TRAIT_INVISIBLE_MAN)) - return - - var/obj/item/bodypart/head/noggin = source.get_bodypart(BODY_ZONE_HEAD) - - - if(mutant_bodyparts["ears"]) - if(!source.dna.features["ears"] || source.dna.features["ears"] == "None" || source.head && (source.head.flags_inv & HIDEHAIR) || (source.wear_mask && (source.wear_mask.flags_inv & HIDEHAIR)) || !noggin || IS_ROBOTIC_LIMB(noggin)) - bodyparts_to_add -= "ears" +/datum/species/vulpkanin/add_body_markings(mob/living/carbon/human/vulp) + for(var/markings_type in body_markings) + var/datum/bodypart_overlay/simple/body_marking/markings = new markings_type() + var/accessory_name = vulp.dna.features[markings.dna_feature_key] + var/datum/sprite_accessory/vulpkanin_body_markings/accessory = markings.get_accessory(accessory_name) - if(!bodyparts_to_add) - return + if(isnull(accessory)) + CRASH("Value: [accessory_name] did not have a corresponding sprite accessory!") - var/g = (source.physique == FEMALE) ? "f" : "m" + for(var/obj/item/bodypart/part as anything in markings.applies_to) //check through our limbs + var/obj/item/bodypart/people_part = vulp.get_bodypart(initial(part.body_zone)) // and see if we have a compatible marking for that limb - for(var/layer in relevent_layers) - var/layertext = mutant_bodyparts_layertext(layer) + if(!people_part) + continue - for(var/bodypart in bodyparts_to_add) - var/datum/sprite_accessory/accessory - switch(bodypart) - if("ears") - accessory = SSaccessories.ears_list[source.dna.features["ears"]] - if("vulpkanin_body_markings") - accessory = SSaccessories.vulpkanin_body_markings_list[source.dna.features["vulpkanin_body_markings"]] + var/datum/bodypart_overlay/simple/body_marking/overlay = new markings_type () - if(!accessory || accessory.icon_state == "none") - continue + // Tell the overlay what it should look like + overlay.icon = accessory.icon + overlay.icon_state = accessory.icon_state + overlay.use_gender = accessory.gender_specific + overlay.draw_color = accessory.color_src ? vulp.dna.features["furcolor_first"] : null - var/mutable_appearance/accessory_overlay = mutable_appearance(accessory.icon, layer = -layer) - - if(accessory.gender_specific) - accessory_overlay.icon_state = "[g]_[bodypart]_[accessory.icon_state]_[layertext]" - else - accessory_overlay.icon_state = "m_[bodypart]_[accessory.icon_state]_[layertext]" - - if(accessory.em_block) - accessory_overlay.overlays += emissive_blocker(accessory_overlay.icon, accessory_overlay.icon_state, source, accessory_overlay.alpha) - - if(accessory.center) - accessory_overlay = center_image(accessory_overlay, accessory.dimension_x, accessory.dimension_y) - - if(!(HAS_TRAIT(source, TRAIT_HUSK))) - if(!forced_colour) - switch(accessory.color_src) - if(MUTANT_COLOR) - accessory_overlay.color = fixed_mut_color || source.dna.features["mcolor"] - if(HAIR_COLOR) - accessory_overlay.color = get_fixed_hair_color(source) || source.hair_color - if(EYE_COLOR) - accessory_overlay.color = source.eye_color_left - if("vulpkanin_body_markings_color") - accessory_overlay.color = source.dna.features["furcolor_first"] - else - accessory_overlay.color = forced_colour - standing += accessory_overlay - - if(accessory.hasinner) - var/mutable_appearance/inner_accessory_overlay = mutable_appearance(accessory.icon, layer = -layer) - if(accessory.gender_specific) - inner_accessory_overlay.icon_state = "[g]_[bodypart]inner_[accessory.icon_state]_[layertext]" - else - inner_accessory_overlay.icon_state = "m_[bodypart]inner_[accessory.icon_state]_[layertext]" - - if(accessory.center) - inner_accessory_overlay = center_image(inner_accessory_overlay, accessory.dimension_x, accessory.dimension_y) - - standing += inner_accessory_overlay - - source.overlays_standing[layer] = standing.Copy() - standing = list() - - source.apply_overlay(BODY_BEHIND_LAYER) - source.apply_overlay(BODY_ADJ_LAYER) - source.apply_overlay(BODY_FRONT_LAYER) + people_part.add_bodypart_overlay(overlay) /obj/item/bodypart/head/get_hair_and_lips_icon(dropped) . = ..() diff --git a/modular_bandastation/species/code/human/sprite_accessories/vulpkanin.dm b/modular_bandastation/species/code/human/sprite_accessories/vulpkanin.dm index 03a0c29036eec9..ee8a1454f08201 100644 --- a/modular_bandastation/species/code/human/sprite_accessories/vulpkanin.dm +++ b/modular_bandastation/species/code/human/sprite_accessories/vulpkanin.dm @@ -1,5 +1,12 @@ // BODY +/datum/bodypart_overlay/simple/body_marking/vulpkanin + dna_feature_key = "vulpkanin_body_markings" + applies_to = list(/obj/item/bodypart/chest) + +/datum/bodypart_overlay/simple/body_marking/vulpkanin/get_accessory(name) + return SSaccessories.vulpkanin_body_markings_list[name] + /datum/sprite_accessory/vulpkanin_body_markings icon = 'modular_bandastation/species/icons/mob/species/vulpkanin/body_markings.dmi' name = "None" diff --git a/modular_bandastation/species/code/preferences/species_features/vulpkanin.dm b/modular_bandastation/species/code/preferences/species_features/vulpkanin.dm index b161f059bfe8f0..27efd55b747532 100644 --- a/modular_bandastation/species/code/preferences/species_features/vulpkanin.dm +++ b/modular_bandastation/species/code/preferences/species_features/vulpkanin.dm @@ -6,7 +6,7 @@ category = PREFERENCE_CATEGORY_FEATURES main_feature_name = "Раскраска тела" should_generate_icons = TRUE - relevant_mutant_bodypart = "vulpkanin_body_markings" + relevant_body_markings = /datum/bodypart_overlay/simple/body_marking/vulpkanin /datum/preference/choiced/vulpkanin_body_markings/init_possible_values() return assoc_to_keys_features(SSaccessories.vulpkanin_body_markings_list) @@ -32,7 +32,7 @@ var/icon/icon_with_markings = new(body) if (value != "None") - var/icon/body_part_icon = icon(markings.icon, "m_vulpkanin_body_markings_[markings.icon_state]_ADJ") + var/icon/body_part_icon = icon(markings.icon, "male_[markings.icon_state]_chest") body_part_icon.Crop(1, 1, 32, 32) body_part_icon.Blend(COLOR_VERY_LIGHT_GRAY, ICON_MULTIPLY) icon_with_markings.Blend(body_part_icon, ICON_OVERLAY) @@ -60,8 +60,7 @@ target.dna.features["tail_vulpkanin"] = value /datum/preference/choiced/tail_vulpkanin/create_default_value() - var/datum/sprite_accessory/tails/vulpkanin/fluffy/tail = /datum/sprite_accessory/tails/vulpkanin/fluffy - return initial(tail.name) + return /datum/sprite_accessory/tails/vulpkanin/fluffy::name /datum/preference/choiced/vulpkanin_body_markings/compile_constant_data() var/list/data = ..() @@ -75,7 +74,7 @@ savefile_key = "vulpkanin_body_markings_color" savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_SUPPLEMENTAL_FEATURES - relevant_mutant_bodypart = "vulpkanin_body_markings" + relevant_body_markings = /datum/bodypart_overlay/simple/body_marking/vulpkanin /datum/preference/color/vulpkanin_body_markings_color/create_default_value() return COLOR_WHITE @@ -283,7 +282,7 @@ savefile_key = "feature_vulpkanin_tail_markings" savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_SECONDARY_FEATURES - relevant_mutant_bodypart = "vulpkanin_tail_markings" + relevant_external_organ = /obj/item/organ/external/tail/vulpkanin /datum/preference/choiced/vulpkanin_tail_markings/init_possible_values() return assoc_to_keys_features(SSaccessories.vulpkanin_tail_markings_list) @@ -312,7 +311,7 @@ savefile_key = "vulpkanin_tail_markings_color" savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_SECONDARY_FEATURES - relevant_mutant_bodypart = "vulpkanin_tail_markings" + relevant_external_organ = /obj/item/organ/external/tail/vulpkanin /datum/preference/color/vulpkanin_tail_markings_color/create_default_value() return COLOR_WHITE diff --git a/modular_bandastation/species/icons/mob/species/vulpkanin/body_markings.dmi b/modular_bandastation/species/icons/mob/species/vulpkanin/body_markings.dmi index cbe4ed2caf2daf..1e43b131341318 100644 Binary files a/modular_bandastation/species/icons/mob/species/vulpkanin/body_markings.dmi and b/modular_bandastation/species/icons/mob/species/vulpkanin/body_markings.dmi differ