From e9886d05fc1315667b85b6e969563ec21f4ab4c9 Mon Sep 17 00:00:00 2001 From: Krausus Date: Thu, 4 Aug 2016 11:14:56 -0400 Subject: [PATCH] Human overlay caching and minor overlay fixes --- code/modules/admin/verbs/freeze.dm | 11 ++-- .../mob/living/carbon/human/human_organs.dm | 2 +- .../mob/living/carbon/human/update_icons.dm | 52 ++++++++++++------- 3 files changed, 39 insertions(+), 26 deletions(-) diff --git a/code/modules/admin/verbs/freeze.dm b/code/modules/admin/verbs/freeze.dm index 3537dd3d6df..92af790dc4b 100644 --- a/code/modules/admin/verbs/freeze.dm +++ b/code/modules/admin/verbs/freeze.dm @@ -21,7 +21,7 @@ var/global/list/frozen_mob_list = list() ///mob freeze procs -/mob/living/var/frozen = 0 //used for preventing attacks on admin-frozen mobs +/mob/living/var/frozen = null //used for preventing attacks on admin-frozen mobs /mob/living/var/admin_prev_sleeping = 0 //used for keeping track of previous sleeping value with admin freeze /mob/living/proc/admin_Freeze(var/client/admin) @@ -34,7 +34,7 @@ var/global/list/frozen_mob_list = list() src.overlays += AO anchored = 1 - frozen = 1 + frozen = AO admin_prev_sleeping = sleeping sleeping += 20000 if(!(src in frozen_mob_list)) @@ -46,15 +46,16 @@ var/global/list/frozen_mob_list = list() message_admins("\blue [key_name_admin(admin)] unfroze [key_name_admin(src)]") log_admin("[key_name(admin)] unfroze [key_name(src)]") - update_icons() - anchored = 0 - frozen = 0 + overlays -= frozen + frozen = null sleeping = admin_prev_sleeping admin_prev_sleeping = null if(src in frozen_mob_list) frozen_mob_list -= src + update_icons() + /mob/living/carbon/slime/admin_Freeze(admin) ..(admin) diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm index aa0724c5c80..f8d612aadba 100644 --- a/code/modules/mob/living/carbon/human/human_organs.dm +++ b/code/modules/mob/living/carbon/human/human_organs.dm @@ -2,7 +2,7 @@ var/obj/item/organ/internal/eyes/eyes = get_int_organ(/obj/item/organ/internal/eyes) if(eyes) eyes.update_colour() - regenerate_icons() + update_body() /mob/living/carbon/human/var/list/organs = list() /mob/living/carbon/human/var/list/organs_by_name = list() // map organ names to organs diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 50270ed3f78..b919912a6c1 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -107,17 +107,7 @@ Please contact me on #coderbus IRC. ~Carn x var/list/overlays_standing[TOTAL_LAYERS] var/previous_damage_appearance // store what the body last looked like, so we only have to update it if something changed var/icon/skeleton - - -/mob/living/carbon/human/proc/apply_overlay(cache_index) - var/image/I = overlays_standing[cache_index] - if(I) - overlays += I - -/mob/living/carbon/human/proc/remove_overlay(cache_index) - if(overlays_standing[cache_index]) - overlays -= overlays_standing[cache_index] - overlays_standing[cache_index] = null + var/list/cached_standing_overlays = list() // List of everything currently in a human's actual overlays //UPDATES OVERLAYS FROM OVERLAYS_LYING/OVERLAYS_STANDING //this proc is messy as I was forced to include some old laggy cloaking code to it so that I don't break cloakers @@ -125,6 +115,7 @@ Please contact me on #coderbus IRC. ~Carn x /mob/living/carbon/human/update_icons() var/stealth = 0 var/obj/item/clothing/suit/armor/abductor/vest/V // Begin the most snowflakey bullshit code I've ever written. I'm so sorry, but there was no other way. + for(V in list(wear_suit)) if(V.stealth_active) stealth = 1 @@ -133,6 +124,7 @@ Please contact me on #coderbus IRC. ~Carn x if(stealth) icon = V.disguise.icon //if the suit is active, reference the suit's current loaded icon and overlays; this does not include hand overlays overlays.Cut() + cached_standing_overlays.Cut() // Make sure the cache gets rebuilt once the disguise is gone for(var/thing in V.disguise.overlays) if(thing) @@ -146,10 +138,28 @@ Please contact me on #coderbus IRC. ~Carn x overlays += I else icon = stand_icon - overlays.Cut() + var/list/new_overlays = list() + var/list/old_overlays = cached_standing_overlays - for(var/thing in overlays_standing) - if(thing) overlays += thing + // Totally regenerate if something touched our overlays + if(overlays.len != old_overlays.len) + overlays.Cut() + old_overlays.Cut() + + for(var/i in 1 to TOTAL_LAYERS) + var/image/I = overlays_standing[i] + if(I) + if(istype(I)) + // Since we avoid full overlay rebuilds, we have to reorganize the layers manually + I.layer = (-2 - (TOTAL_LAYERS - i)) // Highest layer gets -2, each prior layer is 1 lower + new_overlays += I + + if(frozen) // Admin freeze overlay + new_overlays += frozen + + overlays += (new_overlays - old_overlays) + overlays -= (old_overlays - new_overlays) + cached_standing_overlays = new_overlays update_transform() @@ -538,12 +548,13 @@ var/global/list/damage_icon_parts = list() /mob/living/carbon/human/update_fire() - remove_overlay(FIRE_LAYER) if(on_fire) - overlays_standing[FIRE_LAYER] = image("icon"=fire_dmi, "icon_state"=fire_sprite, "layer"=-FIRE_LAYER) + if(!overlays_standing[FIRE_LAYER]) + overlays_standing[FIRE_LAYER] = image("icon"=fire_dmi, "icon_state"=fire_sprite) + update_icons() else overlays_standing[FIRE_LAYER] = null - apply_overlay(FIRE_LAYER) + update_icons() /* --------------------------------------- */ //For legacy support. @@ -574,11 +585,12 @@ var/global/list/damage_icon_parts = list() update_inv_legcuffed(0) update_inv_pockets(0) update_inv_wear_pda(0) - UpdateDamageIcon() - update_icons() - update_fire() + UpdateDamageIcon(0) force_update_limbs() update_tail_layer(0) + overlays.Cut() // Force all overlays to regenerate + update_fire() + update_icons() /* --------------------------------------- */ //vvvvvv UPDATE_INV PROCS vvvvvv