diff --git a/GainStation13/code/modules/resize/height_limits.dm b/GainStation13/code/modules/resize/height_limits.dm index 1f3670e4d3..b8fc50e8ac 100644 --- a/GainStation13/code/modules/resize/height_limits.dm +++ b/GainStation13/code/modules/resize/height_limits.dm @@ -19,21 +19,50 @@ GLOBAL_LIST_EMPTY(see_toggle_smallsprite) set name = "Toggle Others' Giant Sprite" set category = "Preferences.GS13" set desc = "Change display settings to and from displaying others' giant sprites." + var/list/remove_from_list = new() + mob.see_resized_others = !mob.see_resized_others + if(mob.see_resized_others) GLOB.see_toggle_smallsprite += mob - for(var/mob/living/L in GLOB.enabled_smallsprite) - if(L && L != mob && L.alternate_appearances && L.alternate_appearances["gscode_smallsprite"]) - var/datum/atom_hud/alternate_appearance/AA = L.alternate_appearances["gscode_smallsprite"] - AA.add_to_single_hud(mob, L) + for(var/mob/living/resize_mob in GLOB.enabled_smallsprite) + if(QDELETED(resize_mob)) + remove_from_list += resize_mob + continue + + if(resize_mob && resize_mob != mob && resize_mob.alternate_appearances && resize_mob.alternate_appearances["gscode_smallsprite"]) + var/datum/atom_hud/alternate_appearance/appearance = resize_mob.alternate_appearances["gscode_smallsprite"] + appearance.add_to_single_hud(mob, resize_mob) + + GLOB.enabled_smallsprite -= remove_from_list to_chat(src, "Resize others view toggled ON.") - else - GLOB.see_toggle_smallsprite -= mob - for(var/mob/living/L in GLOB.enabled_smallsprite) - if(L && L.alternate_appearances && L.alternate_appearances["gscode_smallsprite"]) - var/datum/atom_hud/alternate_appearance/AA = L.alternate_appearances["gscode_smallsprite"] - AA.remove_from_single_hud(mob, L) - to_chat(src, "Resize others view toggled OFF.") + return + + GLOB.see_toggle_smallsprite -= mob + for(var/mob/living/resize_mob in GLOB.enabled_smallsprite) + if(QDELETED(resize_mob)) + remove_from_list += resize_mob + continue + + if(resize_mob && resize_mob.alternate_appearances && resize_mob.alternate_appearances["gscode_smallsprite"]) + var/datum/atom_hud/alternate_appearance/appearance = resize_mob.alternate_appearances["gscode_smallsprite"] + appearance.remove_from_single_hud(mob, resize_mob) + + GLOB.enabled_smallsprite -= remove_from_list + to_chat(src, "Resize others view toggled OFF.") + +///Generate the image based on the mob's current icon and apply matrix transformations to adjust its position and angle +/mob/living/proc/create_smallsprite() + var/image/smallsprite = image(icon=icon, icon_state=icon_state, loc=src, layer=layer, pixel_x=pixel_x, pixel_y=pixel_y) + smallsprite.overlays += overlays + smallsprite.override = TRUE + + var/matrix/ntransform = matrix(lying, MATRIX_ROTATE) + if(lying != 0) + ntransform.Translate(0, -get_standard_pixel_y_offset(lying)) + + smallsprite.transform = ntransform + return smallsprite /** * Call to regenerate the sprites and update huds. @@ -43,37 +72,42 @@ GLOBAL_LIST_EMPTY(see_toggle_smallsprite) * * If the size_multiplier was not higher than one then remove the mob from the list of smallsprite mobs */ /mob/living/proc/regenerate_smallsprite() + var/list/remove_from_list = new() + if(length(alternate_appearances) && alternate_appearances["gscode_smallsprite"]) - for(var/mob/M in GLOB.see_toggle_smallsprite) - var/datum/atom_hud/alternate_appearance/AA = alternate_appearances["gscode_smallsprite"] - AA.remove_from_single_hud(M, src) + for(var/mob/viewer_mob in GLOB.see_toggle_smallsprite) + if(QDELETED(viewer_mob)) + remove_from_list += viewer_mob + continue + + var/datum/atom_hud/alternate_appearance/appearance = alternate_appearances["gscode_smallsprite"] + appearance.remove_from_single_hud(viewer_mob, src) remove_alt_appearance("gscode_smallsprite") + if(size_multiplier > 1) if(!GLOB.enabled_smallsprite[src]) GLOB.enabled_smallsprite += src - add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/showSmall, "gscode_smallsprite", generate_smallsprite(), FALSE) - for(var/mob/M in GLOB.see_toggle_smallsprite) - if(M != src) - var/datum/atom_hud/alternate_appearance/AA = alternate_appearances["gscode_smallsprite"] - AA.add_to_single_hud(M, src) + + add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/showSmall, "gscode_smallsprite", create_smallsprite(), FALSE) + for(var/mob/viewer_mob in GLOB.see_toggle_smallsprite) + if(QDELETED(viewer_mob)) + remove_from_list += viewer_mob + continue + + if(viewer_mob != src) + var/datum/atom_hud/alternate_appearance/appearance = alternate_appearances["gscode_smallsprite"] + appearance.add_to_single_hud(viewer_mob, src) return TRUE + else if(GLOB.enabled_smallsprite[src]) GLOB.enabled_smallsprite -= src - return FALSE -///Generate the image based on the mob's current icon and apply matrix transformations to adjust its position and angle -/mob/living/proc/generate_smallsprite() - var/image/I = image(icon=icon, icon_state=icon_state, loc=src, layer=layer, pixel_x=pixel_x, pixel_y=pixel_y) - I.overlays += overlays - I.override = TRUE - var/matrix/ntransform = matrix(lying, MATRIX_ROTATE) - if(lying != 0) - ntransform.Translate(0, -get_standard_pixel_y_offset(lying)) - I.transform = ntransform - return I + GLOB.see_toggle_smallsprite -= remove_from_list + + return FALSE //Called periodically to regenerate the mob's smallsprite -/mob/living/BiologicalLife(delta_time, times_fired) +/mob/living/carbon/human/BiologicalLife(delta_time, times_fired) . = ..() regenerate_smallsprite()