From 1b75ccb39dc46ab19ef55df6b724b6ebebae2e88 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Tue, 29 Sep 2020 18:38:25 +0100 Subject: [PATCH] puddle --- .../mob/living/carbon/human/species.dm | 4 + .../carbon/human/species_types/jellypeople.dm | 37 +- .../mob/living/carbon/human/update_icons.dm | 829 +++++++++--------- icons/mob/actions/actions_slime.dmi | Bin 4717 -> 5093 bytes icons/mob/mob.dmi | Bin 288041 -> 293284 bytes tgstation.dme | 4 +- 6 files changed, 455 insertions(+), 419 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index d433ca1821..70c8f1322d 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1926,6 +1926,10 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(HAS_BONE in species_traits) . |= BIO_JUST_BONE +//a check for if you should render any overlays or not +/datum/species/proc/should_render(mob/living/carbon/human/H) + return TRUE + ///////////// //BREATHING// ///////////// diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index 43f5ca5526..54cfce54c0 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -16,7 +16,8 @@ exotic_blood_color = "BLOOD_COLOR_SLIME" damage_overlay_type = "" var/datum/action/innate/regenerate_limbs/regenerate_limbs - var/datum/action/innate/slime_change/slime_change //CIT CHANGE + var/datum/action/innate/slime_change/slime_change + var/datum/action/innate/slime_puddle/slime_puddle liked_food = TOXIC | MEAT disliked_food = null toxic_food = ANTITOXIC @@ -35,12 +36,13 @@ desc = "A slimey membranous mass from a slime person" icon_state = "brain-slime" - /datum/species/jelly/on_species_loss(mob/living/carbon/C) if(regenerate_limbs) regenerate_limbs.Remove(C) - if(slime_change) //CIT CHANGE - slime_change.Remove(C) //CIT CHANGE + if(slime_change) + slime_change.Remove(C) + if(slime_puddle) + slime_puddle.Remove(C) C.faction -= "slime" ..() C.faction -= "slime" @@ -50,8 +52,10 @@ if(ishuman(C)) regenerate_limbs = new regenerate_limbs.Grant(C) - slime_change = new //CIT CHANGE - slime_change.Grant(C) //CIT CHANGE + slime_change = new + slime_change.Grant(C) + slime_puddle = new + slime_puddle.Grant(C) C.faction |= "slime" /datum/species/jelly/handle_body(mob/living/carbon/human/H) @@ -59,6 +63,12 @@ //update blood color to body color exotic_blood_color = "#" + H.dna.features["mcolor"] +/datum/species/jelly/should_render() + if(slime_puddle && slime_puddle.is_puddle) + return FALSE + else + return ..() + /datum/species/jelly/spec_life(mob/living/carbon/human/H) if(H.stat == DEAD || HAS_TRAIT(H, TRAIT_NOMARROW)) //can't farm slime jelly from a dead slime/jelly person indefinitely, and no regeneration for blooduskers return @@ -641,6 +651,21 @@ else return +/datum/action/innate/slime_puddle + name = "Puddle Transformation" + check_flags = AB_CHECK_CONSCIOUS + button_icon_state = "slimepuddle" + icon_icon = 'modular_citadel/icons/mob/actions/actions_slime.dmi' + background_icon_state = "bg_alien" + var/is_puddle = FALSE + +/datum/action/innate/slime_puddle/Activate() + if(!is_puddle) + is_puddle = TRUE + owner.cut_overlays() + else + is_puddle = FALSE + owner.regenerate_icons() ///////////////////////////////////LUMINESCENTS////////////////////////////////////////// diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index cfb35fbb00..caf0189483 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -50,19 +50,21 @@ There are several things that need to be remembered: //HAIR OVERLAY /mob/living/carbon/human/update_hair() - dna.species.handle_hair(src) + if(dna.species.should_render()) + dna.species.handle_hair(src) //used when putting/removing clothes that hide certain mutant body parts to just update those and not update the whole body. /mob/living/carbon/human/proc/update_mutant_bodyparts() - dna.species.handle_mutant_bodyparts(src) - + if(dna.species.should_render()) + dna.species.handle_mutant_bodyparts(src) /mob/living/carbon/human/update_body(update_genitals = FALSE) - remove_overlay(BODY_LAYER) - dna.species.handle_body(src) - ..() - if(update_genitals) - update_genitals() + if(dna.species.should_render()) + remove_overlay(BODY_LAYER) + dna.species.handle_body(src) + ..() + if(update_genitals) + update_genitals() /mob/living/carbon/human/update_fire() ..((fire_stacks > 3) ? "Standing" : "Generic_mob_burning") @@ -71,381 +73,385 @@ There are several things that need to be remembered: /* --------------------------------------- */ //For legacy support. /mob/living/carbon/human/regenerate_icons() - - if(!..()) - icon_render_key = null //invalidate bodyparts cache - update_body(TRUE) - update_hair() - update_inv_w_uniform() - update_inv_wear_id() - update_inv_gloves() - update_inv_glasses() - update_inv_ears() - update_inv_shoes() - update_inv_s_store() - update_inv_wear_mask() - update_inv_head() - update_inv_belt() - update_inv_back() - update_inv_wear_suit() - update_inv_pockets() - update_inv_neck() - update_transform() - //mutations - update_mutations_overlay() - //damage overlays - update_damage_overlays() + if(dna.species.should_render()) + if(!..()) + icon_render_key = null //invalidate bodyparts cache + update_body(TRUE) + update_hair() + update_inv_w_uniform() + update_inv_wear_id() + update_inv_gloves() + update_inv_glasses() + update_inv_ears() + update_inv_shoes() + update_inv_s_store() + update_inv_wear_mask() + update_inv_head() + update_inv_belt() + update_inv_back() + update_inv_wear_suit() + update_inv_pockets() + update_inv_neck() + update_transform() + //mutations + update_mutations_overlay() + //damage overlays + update_damage_overlays() /* --------------------------------------- */ //vvvvvv UPDATE_INV PROCS vvvvvv /mob/living/carbon/human/update_inv_w_uniform() - remove_overlay(UNIFORM_LAYER) + if(dna.species.should_render()) + remove_overlay(UNIFORM_LAYER) - if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_W_UNIFORM] - inv.update_icon() + if(client && hud_used) + var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_W_UNIFORM] + inv.update_icon() - if(istype(w_uniform, /obj/item/clothing/under)) - var/obj/item/clothing/under/U = w_uniform - U.screen_loc = ui_iclothing - if(client && hud_used && hud_used.hud_shown) - if(hud_used.inventory_shown) - client.screen += w_uniform - update_observer_view(w_uniform,1) + if(istype(w_uniform, /obj/item/clothing/under)) + var/obj/item/clothing/under/U = w_uniform + U.screen_loc = ui_iclothing + if(client && hud_used && hud_used.hud_shown) + if(hud_used.inventory_shown) + client.screen += w_uniform + update_observer_view(w_uniform,1) - if(wear_suit && (wear_suit.flags_inv & HIDEJUMPSUIT)) - return + if(wear_suit && (wear_suit.flags_inv & HIDEJUMPSUIT)) + return - var/target_overlay = U.icon_state - if(U.adjusted == ALT_STYLE) - target_overlay = "[target_overlay]_d" + var/target_overlay = U.icon_state + if(U.adjusted == ALT_STYLE) + target_overlay = "[target_overlay]_d" - var/alt_worn = U.mob_overlay_icon || 'icons/mob/clothing/uniform.dmi' - var/variant_flag = NONE + var/alt_worn = U.mob_overlay_icon || 'icons/mob/clothing/uniform.dmi' + var/variant_flag = NONE - if((DIGITIGRADE in dna.species.species_traits) && U.mutantrace_variation & STYLE_DIGITIGRADE && !(U.mutantrace_variation & STYLE_NO_ANTHRO_ICON)) - alt_worn = U.anthro_mob_worn_overlay || 'icons/mob/clothing/uniform_digi.dmi' - variant_flag |= STYLE_DIGITIGRADE + if((DIGITIGRADE in dna.species.species_traits) && U.mutantrace_variation & STYLE_DIGITIGRADE && !(U.mutantrace_variation & STYLE_NO_ANTHRO_ICON)) + alt_worn = U.anthro_mob_worn_overlay || 'icons/mob/clothing/uniform_digi.dmi' + variant_flag |= STYLE_DIGITIGRADE - var/mask - if(dna.species.mutant_bodyparts["taur"]) - var/datum/sprite_accessory/taur/T = GLOB.taur_list[dna.features["taur"]] - var/clip_flag = U.mutantrace_variation & T?.hide_legs - if(clip_flag) - variant_flag |= clip_flag - mask = T.alpha_mask_state + var/mask + if(dna.species.mutant_bodyparts["taur"]) + var/datum/sprite_accessory/taur/T = GLOB.taur_list[dna.features["taur"]] + var/clip_flag = U.mutantrace_variation & T?.hide_legs + if(clip_flag) + variant_flag |= clip_flag + mask = T.alpha_mask_state - var/mutable_appearance/uniform_overlay + var/mutable_appearance/uniform_overlay - var/gendered = (dna?.species.sexes && dna.features["body_model"] == FEMALE) ? U.fitted : NO_FEMALE_UNIFORM - uniform_overlay = U.build_worn_icon( UNIFORM_LAYER, alt_worn, FALSE, gendered, target_overlay, variant_flag, FALSE, mask) + var/gendered = (dna?.species.sexes && dna.features["body_model"] == FEMALE) ? U.fitted : NO_FEMALE_UNIFORM + uniform_overlay = U.build_worn_icon( UNIFORM_LAYER, alt_worn, FALSE, gendered, target_overlay, variant_flag, FALSE, mask) - if(OFFSET_UNIFORM in dna.species.offset_features) - uniform_overlay.pixel_x += dna.species.offset_features[OFFSET_UNIFORM][1] - uniform_overlay.pixel_y += dna.species.offset_features[OFFSET_UNIFORM][2] - overlays_standing[UNIFORM_LAYER] = uniform_overlay - - apply_overlay(UNIFORM_LAYER) - update_mutant_bodyparts() + if(OFFSET_UNIFORM in dna.species.offset_features) + uniform_overlay.pixel_x += dna.species.offset_features[OFFSET_UNIFORM][1] + uniform_overlay.pixel_y += dna.species.offset_features[OFFSET_UNIFORM][2] + overlays_standing[UNIFORM_LAYER] = uniform_overlay + apply_overlay(UNIFORM_LAYER) + update_mutant_bodyparts() /mob/living/carbon/human/update_inv_wear_id() - remove_overlay(ID_LAYER) + if(dna.species.should_render()) + remove_overlay(ID_LAYER) - if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_ID] - inv.update_icon() + if(client && hud_used) + var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_ID] + inv.update_icon() - var/mutable_appearance/id_overlay = overlays_standing[ID_LAYER] + var/mutable_appearance/id_overlay = overlays_standing[ID_LAYER] - if(wear_id) - wear_id.screen_loc = ui_id - if(client && hud_used && hud_used.hud_shown) - client.screen += wear_id - update_observer_view(wear_id) + if(wear_id) + wear_id.screen_loc = ui_id + if(client && hud_used && hud_used.hud_shown) + client.screen += wear_id + update_observer_view(wear_id) - //TODO: add an icon file for ID slot stuff, so it's less snowflakey - id_overlay = wear_id.build_worn_icon(default_layer = ID_LAYER, default_icon_file = 'icons/mob/mob.dmi', override_state = wear_id.item_state) - if(OFFSET_ID in dna.species.offset_features) - id_overlay.pixel_x += dna.species.offset_features[OFFSET_ID][1] - id_overlay.pixel_y += dna.species.offset_features[OFFSET_ID][2] - overlays_standing[ID_LAYER] = id_overlay - apply_overlay(ID_LAYER) + //TODO: add an icon file for ID slot stuff, so it's less snowflakey + id_overlay = wear_id.build_worn_icon(default_layer = ID_LAYER, default_icon_file = 'icons/mob/mob.dmi', override_state = wear_id.item_state) + if(OFFSET_ID in dna.species.offset_features) + id_overlay.pixel_x += dna.species.offset_features[OFFSET_ID][1] + id_overlay.pixel_y += dna.species.offset_features[OFFSET_ID][2] + overlays_standing[ID_LAYER] = id_overlay + apply_overlay(ID_LAYER) /mob/living/carbon/human/update_inv_gloves() - remove_overlay(GLOVES_LAYER) + if(dna.species.should_render()) + remove_overlay(GLOVES_LAYER) - if(client && hud_used && hud_used.inv_slots[SLOT_GLOVES]) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_GLOVES] - inv.update_icon() + if(client && hud_used && hud_used.inv_slots[SLOT_GLOVES]) + var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_GLOVES] + inv.update_icon() - if(!gloves && bloody_hands) - var/mutable_appearance/bloody_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyhands", -GLOVES_LAYER, color = blood_DNA_to_color()) - if(get_num_arms(FALSE) < 2) - if(has_left_hand(FALSE)) - bloody_overlay.icon_state = "bloodyhands_left" - else if(has_right_hand(FALSE)) - bloody_overlay.icon_state = "bloodyhands_right" + if(!gloves && bloody_hands) + var/mutable_appearance/bloody_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyhands", -GLOVES_LAYER, color = blood_DNA_to_color()) + if(get_num_arms(FALSE) < 2) + if(has_left_hand(FALSE)) + bloody_overlay.icon_state = "bloodyhands_left" + else if(has_right_hand(FALSE)) + bloody_overlay.icon_state = "bloodyhands_right" - overlays_standing[GLOVES_LAYER] = bloody_overlay + overlays_standing[GLOVES_LAYER] = bloody_overlay - var/mutable_appearance/gloves_overlay = overlays_standing[GLOVES_LAYER] - if(gloves) - gloves.screen_loc = ui_gloves - if(client && hud_used && hud_used.hud_shown) - if(hud_used.inventory_shown) - client.screen += gloves - update_observer_view(gloves,1) - overlays_standing[GLOVES_LAYER] = gloves.build_worn_icon(default_layer = GLOVES_LAYER, default_icon_file = 'icons/mob/clothing/hands.dmi') - gloves_overlay = overlays_standing[GLOVES_LAYER] - if(OFFSET_GLOVES in dna.species.offset_features) - gloves_overlay.pixel_x += dna.species.offset_features[OFFSET_GLOVES][1] - gloves_overlay.pixel_y += dna.species.offset_features[OFFSET_GLOVES][2] - overlays_standing[GLOVES_LAYER] = gloves_overlay - apply_overlay(GLOVES_LAYER) + var/mutable_appearance/gloves_overlay = overlays_standing[GLOVES_LAYER] + if(gloves) + gloves.screen_loc = ui_gloves + if(client && hud_used && hud_used.hud_shown) + if(hud_used.inventory_shown) + client.screen += gloves + update_observer_view(gloves,1) + overlays_standing[GLOVES_LAYER] = gloves.build_worn_icon(default_layer = GLOVES_LAYER, default_icon_file = 'icons/mob/clothing/hands.dmi') + gloves_overlay = overlays_standing[GLOVES_LAYER] + if(OFFSET_GLOVES in dna.species.offset_features) + gloves_overlay.pixel_x += dna.species.offset_features[OFFSET_GLOVES][1] + gloves_overlay.pixel_y += dna.species.offset_features[OFFSET_GLOVES][2] + overlays_standing[GLOVES_LAYER] = gloves_overlay + apply_overlay(GLOVES_LAYER) /mob/living/carbon/human/update_inv_glasses() - remove_overlay(GLASSES_LAYER) + if(dna.species.should_render()) + remove_overlay(GLASSES_LAYER) - if(!get_bodypart(BODY_ZONE_HEAD)) //decapitated - return - - if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_GLASSES] - inv.update_icon() - - if(glasses) - glasses.screen_loc = ui_glasses //...draw the item in the inventory screen - if(client && hud_used && hud_used.hud_shown) - if(hud_used.inventory_shown) //if the inventory is open ... - client.screen += glasses //Either way, add the item to the HUD - update_observer_view(glasses,1) - if(!(head && (head.flags_inv & HIDEEYES)) && !(wear_mask && (wear_mask.flags_inv & HIDEEYES))) - overlays_standing[GLASSES_LAYER] = glasses.build_worn_icon(default_layer = GLASSES_LAYER, default_icon_file = 'icons/mob/clothing/eyes.dmi', override_state = glasses.icon_state) - var/mutable_appearance/glasses_overlay = overlays_standing[GLASSES_LAYER] - if(glasses_overlay) - if(OFFSET_GLASSES in dna.species.offset_features) - glasses_overlay.pixel_x += dna.species.offset_features[OFFSET_GLASSES][1] - glasses_overlay.pixel_y += dna.species.offset_features[OFFSET_GLASSES][2] - overlays_standing[GLASSES_LAYER] = glasses_overlay - apply_overlay(GLASSES_LAYER) - - -/mob/living/carbon/human/update_inv_ears() - remove_overlay(EARS_LAYER) - - if(!get_bodypart(BODY_ZONE_HEAD)) //decapitated - return - - if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_EARS] - inv.update_icon() - - if(ears) - ears.screen_loc = ui_ears //move the item to the appropriate screen loc - if(client && hud_used && hud_used.hud_shown) - if(hud_used.inventory_shown) //if the inventory is open - client.screen += ears //add it to the client's screen - update_observer_view(ears,1) - - overlays_standing[EARS_LAYER] = ears.build_worn_icon(default_layer = EARS_LAYER, default_icon_file = 'icons/mob/ears.dmi') - var/mutable_appearance/ears_overlay = overlays_standing[EARS_LAYER] - if(OFFSET_EARS in dna.species.offset_features) - ears_overlay.pixel_x += dna.species.offset_features[OFFSET_EARS][1] - ears_overlay.pixel_y += dna.species.offset_features[OFFSET_EARS][2] - overlays_standing[EARS_LAYER] = ears_overlay - apply_overlay(EARS_LAYER) - - -/mob/living/carbon/human/update_inv_shoes() - remove_overlay(SHOES_LAYER) - - if(get_num_legs(FALSE) <2) - return - - if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_SHOES] - inv.update_icon() - - if(dna.species.mutant_bodyparts["taur"]) - var/datum/sprite_accessory/taur/T = GLOB.taur_list[dna.features["taur"]] - if(T?.hide_legs) //If only they actually made shoes unwearable. Please don't making cosmetics, guys. + if(!get_bodypart(BODY_ZONE_HEAD)) //decapitated return - if(shoes) - var/obj/item/clothing/shoes/S = shoes - shoes.screen_loc = ui_shoes //move the item to the appropriate screen loc - if(client && hud_used && hud_used.hud_shown) - if(hud_used.inventory_shown) //if the inventory is open - client.screen += shoes //add it to client's screen - update_observer_view(shoes,1) + if(client && hud_used) + var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_GLASSES] + inv.update_icon() - var/alt_icon = S.mob_overlay_icon || 'icons/mob/clothing/feet.dmi' - var/variation_flag = NONE - if((DIGITIGRADE in dna.species.species_traits) && S.mutantrace_variation & STYLE_DIGITIGRADE && !(S.mutantrace_variation & STYLE_NO_ANTHRO_ICON)) - alt_icon = S.anthro_mob_worn_overlay || 'icons/mob/clothing/feet_digi.dmi' - variation_flag |= STYLE_DIGITIGRADE + if(glasses) + glasses.screen_loc = ui_glasses //...draw the item in the inventory screen + if(client && hud_used && hud_used.hud_shown) + if(hud_used.inventory_shown) //if the inventory is open ... + client.screen += glasses //Either way, add the item to the HUD + update_observer_view(glasses,1) + if(!(head && (head.flags_inv & HIDEEYES)) && !(wear_mask && (wear_mask.flags_inv & HIDEEYES))) + overlays_standing[GLASSES_LAYER] = glasses.build_worn_icon(default_layer = GLASSES_LAYER, default_icon_file = 'icons/mob/clothing/eyes.dmi', override_state = glasses.icon_state) + var/mutable_appearance/glasses_overlay = overlays_standing[GLASSES_LAYER] + if(glasses_overlay) + if(OFFSET_GLASSES in dna.species.offset_features) + glasses_overlay.pixel_x += dna.species.offset_features[OFFSET_GLASSES][1] + glasses_overlay.pixel_y += dna.species.offset_features[OFFSET_GLASSES][2] + overlays_standing[GLASSES_LAYER] = glasses_overlay + apply_overlay(GLASSES_LAYER) - overlays_standing[SHOES_LAYER] = shoes.build_worn_icon(SHOES_LAYER, alt_icon, FALSE, NO_FEMALE_UNIFORM, S.icon_state, variation_flag, FALSE) - var/mutable_appearance/shoes_overlay = overlays_standing[SHOES_LAYER] - if(OFFSET_SHOES in dna.species.offset_features) - shoes_overlay.pixel_x += dna.species.offset_features[OFFSET_SHOES][1] - shoes_overlay.pixel_y += dna.species.offset_features[OFFSET_SHOES][2] - overlays_standing[SHOES_LAYER] = shoes_overlay - apply_overlay(SHOES_LAYER) +/mob/living/carbon/human/update_inv_ears() + if(dna.species.should_render()) + remove_overlay(EARS_LAYER) -/mob/living/carbon/human/update_inv_s_store() - remove_overlay(SUIT_STORE_LAYER) + if(!get_bodypart(BODY_ZONE_HEAD)) //decapitated + return - if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_S_STORE] - inv.update_icon() + if(client && hud_used) + var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_EARS] + inv.update_icon() - if(s_store) - s_store.screen_loc = ui_sstore1 - if(client && hud_used && hud_used.hud_shown) - client.screen += s_store - update_observer_view(s_store) - var/t_state = s_store.item_state - if(!t_state) - t_state = s_store.icon_state - overlays_standing[SUIT_STORE_LAYER] = mutable_appearance(((s_store.mob_overlay_icon) ? s_store.mob_overlay_icon : 'icons/mob/clothing/belt_mirror.dmi'), t_state, -SUIT_STORE_LAYER) - var/mutable_appearance/s_store_overlay = overlays_standing[SUIT_STORE_LAYER] - if(OFFSET_S_STORE in dna.species.offset_features) - s_store_overlay.pixel_x += dna.species.offset_features[OFFSET_S_STORE][1] - s_store_overlay.pixel_y += dna.species.offset_features[OFFSET_S_STORE][2] - overlays_standing[SUIT_STORE_LAYER] = s_store_overlay - apply_overlay(SUIT_STORE_LAYER) + if(ears) + ears.screen_loc = ui_ears //move the item to the appropriate screen loc + if(client && hud_used && hud_used.hud_shown) + if(hud_used.inventory_shown) //if the inventory is open + client.screen += ears //add it to the client's screen + update_observer_view(ears,1) + overlays_standing[EARS_LAYER] = ears.build_worn_icon(default_layer = EARS_LAYER, default_icon_file = 'icons/mob/ears.dmi') + var/mutable_appearance/ears_overlay = overlays_standing[EARS_LAYER] + if(OFFSET_EARS in dna.species.offset_features) + ears_overlay.pixel_x += dna.species.offset_features[OFFSET_EARS][1] + ears_overlay.pixel_y += dna.species.offset_features[OFFSET_EARS][2] + overlays_standing[EARS_LAYER] = ears_overlay + apply_overlay(EARS_LAYER) -/mob/living/carbon/human/update_inv_head() - remove_overlay(HEAD_LAYER) +/mob/living/carbon/human/update_inv_shoes() + if(dna.species.should_render()) + remove_overlay(SHOES_LAYER) - if(!get_bodypart(BODY_ZONE_HEAD)) //Decapitated - return + if(get_num_legs(FALSE) <2) + return - if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_HEAD] - inv.update_icon() + if(client && hud_used) + var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_SHOES] + inv.update_icon() - if(head) - head.screen_loc = ui_head - if(client && hud_used && hud_used.hud_shown) - if(hud_used.inventory_shown) - client.screen += head - update_observer_view(head,1) - remove_overlay(HEAD_LAYER) - var/obj/item/clothing/head/H = head - var/alt_icon = H.mob_overlay_icon || 'icons/mob/clothing/head.dmi' - var/muzzled = FALSE - var/variation_flag = NONE - if(dna.species.mutant_bodyparts["mam_snouts"] && dna.features["mam_snouts"] != "None") - muzzled = TRUE - else if(dna.species.mutant_bodyparts["snout"] && dna.features["snout"] != "None") - muzzled = TRUE - if(muzzled && H.mutantrace_variation & STYLE_MUZZLE && !(H.mutantrace_variation & STYLE_NO_ANTHRO_ICON)) - alt_icon = H.anthro_mob_worn_overlay || 'icons/mob/clothing/head_muzzled.dmi' - variation_flag |= STYLE_MUZZLE - - overlays_standing[HEAD_LAYER] = H.build_worn_icon(HEAD_LAYER, alt_icon, FALSE, NO_FEMALE_UNIFORM, H.icon_state, variation_flag, FALSE) - var/mutable_appearance/head_overlay = overlays_standing[HEAD_LAYER] - - if(OFFSET_HEAD in dna.species.offset_features) - head_overlay.pixel_x += dna.species.offset_features[OFFSET_HEAD][1] - head_overlay.pixel_y += dna.species.offset_features[OFFSET_HEAD][2] - overlays_standing[HEAD_LAYER] = head_overlay - apply_overlay(HEAD_LAYER) - update_mutant_bodyparts() - -/mob/living/carbon/human/update_inv_belt() - remove_overlay(BELT_LAYER) - - if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_BELT] - inv.update_icon() - - if(belt) - belt.screen_loc = ui_belt - if(client && hud_used && hud_used.hud_shown) - client.screen += belt - update_observer_view(belt) - - overlays_standing[BELT_LAYER] = belt.build_worn_icon(default_layer = BELT_LAYER, default_icon_file = 'icons/mob/clothing/belt.dmi') - var/mutable_appearance/belt_overlay = overlays_standing[BELT_LAYER] - if(OFFSET_BELT in dna.species.offset_features) - belt_overlay.pixel_x += dna.species.offset_features[OFFSET_BELT][1] - belt_overlay.pixel_y += dna.species.offset_features[OFFSET_BELT][2] - overlays_standing[BELT_LAYER] = belt_overlay - apply_overlay(BELT_LAYER) - - -/mob/living/carbon/human/update_inv_wear_suit() - remove_overlay(SUIT_LAYER) - - if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_SUIT] - inv.update_icon() - - if(wear_suit) - var/obj/item/clothing/suit/S = wear_suit - wear_suit.screen_loc = ui_oclothing - if(client && hud_used && hud_used.hud_shown) - if(hud_used.inventory_shown) - client.screen += wear_suit - update_observer_view(wear_suit,1) - - var/worn_icon = wear_suit.mob_overlay_icon || 'icons/mob/clothing/suit.dmi' - var/worn_state = wear_suit.icon_state - var/center = FALSE - var/dimension_x = 32 - var/dimension_y = 32 - var/variation_flag = NONE - var/datum/sprite_accessory/taur/T if(dna.species.mutant_bodyparts["taur"]) - T = GLOB.taur_list[dna.features["taur"]] + var/datum/sprite_accessory/taur/T = GLOB.taur_list[dna.features["taur"]] + if(T?.hide_legs) //If only they actually made shoes unwearable. Please don't making cosmetics, guys. + return - if(S.mutantrace_variation) + if(shoes) + var/obj/item/clothing/shoes/S = shoes + shoes.screen_loc = ui_shoes //move the item to the appropriate screen loc + if(client && hud_used && hud_used.hud_shown) + if(hud_used.inventory_shown) //if the inventory is open + client.screen += shoes //add it to client's screen + update_observer_view(shoes,1) - if(T?.taur_mode) - var/init_worn_icon = worn_icon - variation_flag |= S.mutantrace_variation & T.taur_mode || S.mutantrace_variation & T.alt_taur_mode - switch(variation_flag) - if(STYLE_HOOF_TAURIC) - worn_icon = 'icons/mob/clothing/taur_hooved.dmi' - if(STYLE_SNEK_TAURIC) - worn_icon = 'icons/mob/clothing/taur_naga.dmi' - if(STYLE_PAW_TAURIC) - worn_icon = 'icons/mob/clothing/taur_canine.dmi' - if(worn_icon != init_worn_icon) //worn icon sprite was changed, taur offsets will have to be applied. - if(S.taur_mob_worn_overlay) //not going to make several new variables for all taur types. Nope. - var/static/list/icon_to_state = list('icons/mob/clothing/taur_hooved.dmi' = "_hooved", 'icons/mob/clothing/taur_naga.dmi' = "_naga", 'icons/mob/clothing/taur_canine.dmi' = "_paws") - worn_state += icon_to_state[worn_icon] - worn_icon = S.taur_mob_worn_overlay - center = T.center - dimension_x = T.dimension_x - dimension_y = T.dimension_y - - else if((DIGITIGRADE in dna.species.species_traits) && S.mutantrace_variation & STYLE_DIGITIGRADE && !(S.mutantrace_variation & STYLE_NO_ANTHRO_ICON)) //not a taur, but digitigrade legs. - worn_icon = S.anthro_mob_worn_overlay || 'icons/mob/clothing/suit_digi.dmi' + var/alt_icon = S.mob_overlay_icon || 'icons/mob/clothing/feet.dmi' + var/variation_flag = NONE + if((DIGITIGRADE in dna.species.species_traits) && S.mutantrace_variation & STYLE_DIGITIGRADE && !(S.mutantrace_variation & STYLE_NO_ANTHRO_ICON)) + alt_icon = S.anthro_mob_worn_overlay || 'icons/mob/clothing/feet_digi.dmi' variation_flag |= STYLE_DIGITIGRADE - overlays_standing[SUIT_LAYER] = S.build_worn_icon(SUIT_LAYER, worn_icon, FALSE, NO_FEMALE_UNIFORM, worn_state, variation_flag, FALSE) - var/mutable_appearance/suit_overlay = overlays_standing[SUIT_LAYER] - if(OFFSET_SUIT in dna.species.offset_features) - suit_overlay.pixel_x += dna.species.offset_features[OFFSET_SUIT][1] - suit_overlay.pixel_y += dna.species.offset_features[OFFSET_SUIT][2] - if(center) - suit_overlay = center_image(suit_overlay, dimension_x, dimension_y) - overlays_standing[SUIT_LAYER] = suit_overlay - update_hair() - update_mutant_bodyparts() + overlays_standing[SHOES_LAYER] = shoes.build_worn_icon(SHOES_LAYER, alt_icon, FALSE, NO_FEMALE_UNIFORM, S.icon_state, variation_flag, FALSE) + var/mutable_appearance/shoes_overlay = overlays_standing[SHOES_LAYER] + if(OFFSET_SHOES in dna.species.offset_features) + shoes_overlay.pixel_x += dna.species.offset_features[OFFSET_SHOES][1] + shoes_overlay.pixel_y += dna.species.offset_features[OFFSET_SHOES][2] + overlays_standing[SHOES_LAYER] = shoes_overlay + apply_overlay(SHOES_LAYER) - apply_overlay(SUIT_LAYER) +/mob/living/carbon/human/update_inv_s_store() + if(dna.species.should_render()) + remove_overlay(SUIT_STORE_LAYER) + if(client && hud_used) + var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_S_STORE] + inv.update_icon() + + if(s_store) + s_store.screen_loc = ui_sstore1 + if(client && hud_used && hud_used.hud_shown) + client.screen += s_store + update_observer_view(s_store) + var/t_state = s_store.item_state + if(!t_state) + t_state = s_store.icon_state + overlays_standing[SUIT_STORE_LAYER] = mutable_appearance(((s_store.mob_overlay_icon) ? s_store.mob_overlay_icon : 'icons/mob/clothing/belt_mirror.dmi'), t_state, -SUIT_STORE_LAYER) + var/mutable_appearance/s_store_overlay = overlays_standing[SUIT_STORE_LAYER] + if(OFFSET_S_STORE in dna.species.offset_features) + s_store_overlay.pixel_x += dna.species.offset_features[OFFSET_S_STORE][1] + s_store_overlay.pixel_y += dna.species.offset_features[OFFSET_S_STORE][2] + overlays_standing[SUIT_STORE_LAYER] = s_store_overlay + apply_overlay(SUIT_STORE_LAYER) + +/mob/living/carbon/human/update_inv_head() + if(dna.species.should_render()) + remove_overlay(HEAD_LAYER) + + if(!get_bodypart(BODY_ZONE_HEAD)) //Decapitated + return + + if(client && hud_used) + var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_HEAD] + inv.update_icon() + + if(head) + head.screen_loc = ui_head + if(client && hud_used && hud_used.hud_shown) + if(hud_used.inventory_shown) + client.screen += head + update_observer_view(head,1) + remove_overlay(HEAD_LAYER) + var/obj/item/clothing/head/H = head + var/alt_icon = H.mob_overlay_icon || 'icons/mob/clothing/head.dmi' + var/muzzled = FALSE + var/variation_flag = NONE + if(dna.species.mutant_bodyparts["mam_snouts"] && dna.features["mam_snouts"] != "None") + muzzled = TRUE + else if(dna.species.mutant_bodyparts["snout"] && dna.features["snout"] != "None") + muzzled = TRUE + if(muzzled && H.mutantrace_variation & STYLE_MUZZLE && !(H.mutantrace_variation & STYLE_NO_ANTHRO_ICON)) + alt_icon = H.anthro_mob_worn_overlay || 'icons/mob/clothing/head_muzzled.dmi' + variation_flag |= STYLE_MUZZLE + + overlays_standing[HEAD_LAYER] = H.build_worn_icon(HEAD_LAYER, alt_icon, FALSE, NO_FEMALE_UNIFORM, H.icon_state, variation_flag, FALSE) + var/mutable_appearance/head_overlay = overlays_standing[HEAD_LAYER] + + if(OFFSET_HEAD in dna.species.offset_features) + head_overlay.pixel_x += dna.species.offset_features[OFFSET_HEAD][1] + head_overlay.pixel_y += dna.species.offset_features[OFFSET_HEAD][2] + overlays_standing[HEAD_LAYER] = head_overlay + apply_overlay(HEAD_LAYER) + update_mutant_bodyparts() + +/mob/living/carbon/human/update_inv_belt() + if(dna.species.should_render()) + remove_overlay(BELT_LAYER) + + if(client && hud_used) + var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_BELT] + inv.update_icon() + + if(belt) + belt.screen_loc = ui_belt + if(client && hud_used && hud_used.hud_shown) + client.screen += belt + update_observer_view(belt) + + overlays_standing[BELT_LAYER] = belt.build_worn_icon(default_layer = BELT_LAYER, default_icon_file = 'icons/mob/clothing/belt.dmi') + var/mutable_appearance/belt_overlay = overlays_standing[BELT_LAYER] + if(OFFSET_BELT in dna.species.offset_features) + belt_overlay.pixel_x += dna.species.offset_features[OFFSET_BELT][1] + belt_overlay.pixel_y += dna.species.offset_features[OFFSET_BELT][2] + overlays_standing[BELT_LAYER] = belt_overlay + apply_overlay(BELT_LAYER) + +/mob/living/carbon/human/update_inv_wear_suit() + if(dna.species.should_render()) + remove_overlay(SUIT_LAYER) + + if(client && hud_used) + var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_SUIT] + inv.update_icon() + + if(wear_suit) + var/obj/item/clothing/suit/S = wear_suit + wear_suit.screen_loc = ui_oclothing + if(client && hud_used && hud_used.hud_shown) + if(hud_used.inventory_shown) + client.screen += wear_suit + update_observer_view(wear_suit,1) + + var/worn_icon = wear_suit.mob_overlay_icon || 'icons/mob/clothing/suit.dmi' + var/worn_state = wear_suit.icon_state + var/center = FALSE + var/dimension_x = 32 + var/dimension_y = 32 + var/variation_flag = NONE + var/datum/sprite_accessory/taur/T + if(dna.species.mutant_bodyparts["taur"]) + T = GLOB.taur_list[dna.features["taur"]] + + if(S.mutantrace_variation) + + if(T?.taur_mode) + var/init_worn_icon = worn_icon + variation_flag |= S.mutantrace_variation & T.taur_mode || S.mutantrace_variation & T.alt_taur_mode + switch(variation_flag) + if(STYLE_HOOF_TAURIC) + worn_icon = 'icons/mob/clothing/taur_hooved.dmi' + if(STYLE_SNEK_TAURIC) + worn_icon = 'icons/mob/clothing/taur_naga.dmi' + if(STYLE_PAW_TAURIC) + worn_icon = 'icons/mob/clothing/taur_canine.dmi' + if(worn_icon != init_worn_icon) //worn icon sprite was changed, taur offsets will have to be applied. + if(S.taur_mob_worn_overlay) //not going to make several new variables for all taur types. Nope. + var/static/list/icon_to_state = list('icons/mob/clothing/taur_hooved.dmi' = "_hooved", 'icons/mob/clothing/taur_naga.dmi' = "_naga", 'icons/mob/clothing/taur_canine.dmi' = "_paws") + worn_state += icon_to_state[worn_icon] + worn_icon = S.taur_mob_worn_overlay + center = T.center + dimension_x = T.dimension_x + dimension_y = T.dimension_y + + else if((DIGITIGRADE in dna.species.species_traits) && S.mutantrace_variation & STYLE_DIGITIGRADE && !(S.mutantrace_variation & STYLE_NO_ANTHRO_ICON)) //not a taur, but digitigrade legs. + worn_icon = S.anthro_mob_worn_overlay || 'icons/mob/clothing/suit_digi.dmi' + variation_flag |= STYLE_DIGITIGRADE + + overlays_standing[SUIT_LAYER] = S.build_worn_icon(SUIT_LAYER, worn_icon, FALSE, NO_FEMALE_UNIFORM, worn_state, variation_flag, FALSE) + var/mutable_appearance/suit_overlay = overlays_standing[SUIT_LAYER] + if(OFFSET_SUIT in dna.species.offset_features) + suit_overlay.pixel_x += dna.species.offset_features[OFFSET_SUIT][1] + suit_overlay.pixel_y += dna.species.offset_features[OFFSET_SUIT][2] + if(center) + suit_overlay = center_image(suit_overlay, dimension_x, dimension_y) + overlays_standing[SUIT_LAYER] = suit_overlay + update_hair() + update_mutant_bodyparts() + + apply_overlay(SUIT_LAYER) /mob/living/carbon/human/update_inv_pockets() if(client && hud_used) @@ -471,55 +477,57 @@ There are several things that need to be remembered: /mob/living/carbon/human/update_inv_wear_mask() - remove_overlay(FACEMASK_LAYER) - - if(!get_bodypart(BODY_ZONE_HEAD)) //Decapitated - return - - if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_MASK] - inv.update_icon() - - if(wear_mask) - wear_mask.screen_loc = ui_mask - if(client && hud_used && hud_used.hud_shown) - if(hud_used.inventory_shown) - client.screen += wear_mask - update_observer_view(wear_mask,1) - var/obj/item/clothing/mask/M = wear_mask + if(dna.species.should_render()) remove_overlay(FACEMASK_LAYER) - var/alt_icon = M.mob_overlay_icon || 'icons/mob/clothing/mask.dmi' - var/muzzled = FALSE - var/variation_flag = NONE - if(head && (head.flags_inv & HIDEMASK)) + + if(!get_bodypart(BODY_ZONE_HEAD)) //Decapitated return - if(dna.species.mutant_bodyparts["mam_snouts"] && dna.features["mam_snouts"] != "None") - muzzled = TRUE - else if(dna.species.mutant_bodyparts["snout"] && dna.features["snout"] != "None") - muzzled = TRUE - if(muzzled && M.mutantrace_variation & STYLE_MUZZLE && !(M.mutantrace_variation & STYLE_NO_ANTHRO_ICON)) - alt_icon = M.anthro_mob_worn_overlay || 'icons/mob/clothing/mask_muzzled.dmi' - variation_flag |= STYLE_MUZZLE - var/mutable_appearance/mask_overlay = M.build_worn_icon(FACEMASK_LAYER, alt_icon, FALSE, NO_FEMALE_UNIFORM, wear_mask.icon_state, variation_flag, FALSE) + if(client && hud_used) + var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_MASK] + inv.update_icon() - if(OFFSET_FACEMASK in dna.species.offset_features) - mask_overlay.pixel_x += dna.species.offset_features[OFFSET_FACEMASK][1] - mask_overlay.pixel_y += dna.species.offset_features[OFFSET_FACEMASK][2] - overlays_standing[FACEMASK_LAYER] = mask_overlay - apply_overlay(FACEMASK_LAYER) - update_mutant_bodyparts() //e.g. upgate needed because mask now hides lizard snout + if(wear_mask) + wear_mask.screen_loc = ui_mask + if(client && hud_used && hud_used.hud_shown) + if(hud_used.inventory_shown) + client.screen += wear_mask + update_observer_view(wear_mask,1) + var/obj/item/clothing/mask/M = wear_mask + remove_overlay(FACEMASK_LAYER) + var/alt_icon = M.mob_overlay_icon || 'icons/mob/clothing/mask.dmi' + var/muzzled = FALSE + var/variation_flag = NONE + if(head && (head.flags_inv & HIDEMASK)) + return + if(dna.species.mutant_bodyparts["mam_snouts"] && dna.features["mam_snouts"] != "None") + muzzled = TRUE + else if(dna.species.mutant_bodyparts["snout"] && dna.features["snout"] != "None") + muzzled = TRUE + if(muzzled && M.mutantrace_variation & STYLE_MUZZLE && !(M.mutantrace_variation & STYLE_NO_ANTHRO_ICON)) + alt_icon = M.anthro_mob_worn_overlay || 'icons/mob/clothing/mask_muzzled.dmi' + variation_flag |= STYLE_MUZZLE + + var/mutable_appearance/mask_overlay = M.build_worn_icon(FACEMASK_LAYER, alt_icon, FALSE, NO_FEMALE_UNIFORM, wear_mask.icon_state, variation_flag, FALSE) + + if(OFFSET_FACEMASK in dna.species.offset_features) + mask_overlay.pixel_x += dna.species.offset_features[OFFSET_FACEMASK][1] + mask_overlay.pixel_y += dna.species.offset_features[OFFSET_FACEMASK][2] + overlays_standing[FACEMASK_LAYER] = mask_overlay + apply_overlay(FACEMASK_LAYER) + update_mutant_bodyparts() //e.g. upgate needed because mask now hides lizard snout /mob/living/carbon/human/update_inv_back() - ..() - var/mutable_appearance/back_overlay = overlays_standing[BACK_LAYER] - if(back_overlay) - remove_overlay(BACK_LAYER) - if(OFFSET_BACK in dna.species.offset_features) - back_overlay.pixel_x += dna.species.offset_features[OFFSET_BACK][1] - back_overlay.pixel_y += dna.species.offset_features[OFFSET_BACK][2] - overlays_standing[BACK_LAYER] = back_overlay - apply_overlay(BACK_LAYER) + if(dna.species.should_render()) + ..() + var/mutable_appearance/back_overlay = overlays_standing[BACK_LAYER] + if(back_overlay) + remove_overlay(BACK_LAYER) + if(OFFSET_BACK in dna.species.offset_features) + back_overlay.pixel_x += dna.species.offset_features[OFFSET_BACK][1] + back_overlay.pixel_y += dna.species.offset_features[OFFSET_BACK][2] + overlays_standing[BACK_LAYER] = back_overlay + apply_overlay(BACK_LAYER) /proc/wear_alpha_masked_version(state, icon, layer, female, alpha_mask) var/mask = "-[alpha_mask]" @@ -710,8 +718,6 @@ use_mob_overlay_icon: if FALSE, it will always use the default_icon_file even if ..() update_hair() - - /mob/living/carbon/human/proc/update_observer_view(obj/item/I, inventory) if(observers && observers.len) for(var/M in observers) @@ -735,47 +741,48 @@ use_mob_overlay_icon: if FALSE, it will always use the default_icon_file even if if (!dna.species) return - var/obj/item/bodypart/HD = get_bodypart("head") + if(dna.species.should_render()) + var/obj/item/bodypart/HD = get_bodypart("head") - if (!istype(HD)) - return + if (!istype(HD)) + return - HD.update_limb() + HD.update_limb() - add_overlay(HD.get_limb_icon()) - update_damage_overlays() + add_overlay(HD.get_limb_icon()) + update_damage_overlays() - if(HD && !(HAS_TRAIT(src, TRAIT_HUSK))) - // lipstick - if(lip_style && (LIPS in dna.species.species_traits)) - var/mutable_appearance/lip_overlay = mutable_appearance('icons/mob/human_face.dmi', "lips_[lip_style]", -BODY_LAYER) - lip_overlay.color = lip_color - if(OFFSET_LIPS in dna.species.offset_features) - lip_overlay.pixel_x += dna.species.offset_features[OFFSET_LIPS][1] - lip_overlay.pixel_y += dna.species.offset_features[OFFSET_LIPS][2] - add_overlay(lip_overlay) + if(HD && !(HAS_TRAIT(src, TRAIT_HUSK))) + // lipstick + if(lip_style && (LIPS in dna.species.species_traits)) + var/mutable_appearance/lip_overlay = mutable_appearance('icons/mob/human_face.dmi', "lips_[lip_style]", -BODY_LAYER) + lip_overlay.color = lip_color + if(OFFSET_LIPS in dna.species.offset_features) + lip_overlay.pixel_x += dna.species.offset_features[OFFSET_LIPS][1] + lip_overlay.pixel_y += dna.species.offset_features[OFFSET_LIPS][2] + add_overlay(lip_overlay) - // eyes - if(!(NOEYES in dna.species.species_traits)) - var/has_eyes = getorganslot(ORGAN_SLOT_EYES) - if(!has_eyes) - add_overlay(mutable_appearance('icons/mob/human_face.dmi', "eyes_missing", -BODY_LAYER)) - else - var/mutable_appearance/left_eye = mutable_appearance('icons/mob/human_face.dmi', "left_eye", -BODY_LAYER) - var/mutable_appearance/right_eye = mutable_appearance('icons/mob/human_face.dmi', "right_eye", -BODY_LAYER) - if((EYECOLOR in dna.species.species_traits) && has_eyes) - left_eye.color = "#" + left_eye_color - right_eye.color = "#" + right_eye_color - if(OFFSET_EYES in dna.species.offset_features) - left_eye.pixel_x += dna.species.offset_features[OFFSET_EYES][1] - left_eye.pixel_y += dna.species.offset_features[OFFSET_EYES][2] - right_eye.pixel_x += dna.species.offset_features[OFFSET_EYES][1] - right_eye.pixel_y += dna.species.offset_features[OFFSET_EYES][2] - add_overlay(left_eye) - add_overlay(right_eye) + // eyes + if(!(NOEYES in dna.species.species_traits)) + var/has_eyes = getorganslot(ORGAN_SLOT_EYES) + if(!has_eyes) + add_overlay(mutable_appearance('icons/mob/human_face.dmi', "eyes_missing", -BODY_LAYER)) + else + var/mutable_appearance/left_eye = mutable_appearance('icons/mob/human_face.dmi', "left_eye", -BODY_LAYER) + var/mutable_appearance/right_eye = mutable_appearance('icons/mob/human_face.dmi', "right_eye", -BODY_LAYER) + if((EYECOLOR in dna.species.species_traits) && has_eyes) + left_eye.color = "#" + left_eye_color + right_eye.color = "#" + right_eye_color + if(OFFSET_EYES in dna.species.offset_features) + left_eye.pixel_x += dna.species.offset_features[OFFSET_EYES][1] + left_eye.pixel_y += dna.species.offset_features[OFFSET_EYES][2] + right_eye.pixel_x += dna.species.offset_features[OFFSET_EYES][1] + right_eye.pixel_y += dna.species.offset_features[OFFSET_EYES][2] + add_overlay(left_eye) + add_overlay(right_eye) - dna.species.handle_hair(src) + dna.species.handle_hair(src) - update_inv_head() - update_inv_wear_mask() + update_inv_head() + update_inv_wear_mask() diff --git a/icons/mob/actions/actions_slime.dmi b/icons/mob/actions/actions_slime.dmi index acf7a31c6ed9f353ddd8c63149619c3c4d8ff8b6..59840650a58f79f515178d2c6da2c39311be9209 100644 GIT binary patch literal 5093 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 Hu0mjfZ&I*y literal 4717 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 diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi index 23f0e2cc13f147cda16bd16959c7c384109b03b3..ca67926a22a4e34b48e52b438ac6f233d7e8025d 100644 GIT binary patch delta 13006 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 Z4ZW=8FIT diff --git a/tgstation.dme b/tgstation.dme index 143f66a656..9291d1c2b8 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -808,8 +808,6 @@ #include "code\game\machinery\mass_driver.dm" #include "code\game\machinery\navbeacon.dm" #include "code\game\machinery\PDApainter.dm" -#include "code\game\machinery\poweredfans\fan_assembly.dm" -#include "code\game\machinery\poweredfans\poweredfans.dm" #include "code\game\machinery\quantum_pad.dm" #include "code\game\machinery\recharger.dm" #include "code\game\machinery\rechargestation.dm" @@ -887,6 +885,8 @@ #include "code\game\machinery\porta_turret\portable_turret.dm" #include "code\game\machinery\porta_turret\portable_turret_construct.dm" #include "code\game\machinery\porta_turret\portable_turret_cover.dm" +#include "code\game\machinery\poweredfans\fan_assembly.dm" +#include "code\game\machinery\poweredfans\poweredfans.dm" #include "code\game\machinery\shuttle\custom_shuttle.dm" #include "code\game\machinery\shuttle\shuttle_engine.dm" #include "code\game\machinery\shuttle\shuttle_heater.dm"