114 lines
4.4 KiB
Plaintext
114 lines
4.4 KiB
Plaintext
|
|
//Lists to keep track of:
|
|
// - Mobs with a sprite size over 100%
|
|
// - Mobs with the toggle activated
|
|
// Done to reduce the amount of mobs that need to be taken into account when the toggle is switched and for updating the seen sprite
|
|
GLOBAL_LIST_EMPTY(enabled_smallsprite)
|
|
GLOBAL_LIST_EMPTY(see_toggle_smallsprite)
|
|
|
|
/mob/
|
|
///var to know if one has the toggle activated or not
|
|
var/see_resized_others = FALSE
|
|
|
|
/datum/atom_hud/alternate_appearance/basic/showSmall
|
|
|
|
//Verb for the associated toggle.
|
|
//When switched on, add the current mob to the list of mobs that need to see smallsprites and apply the ones already present immediately to the mob's hud.
|
|
//When switched off, remove from the list and remove smallsprites for the user's hud.
|
|
/client/verb/toggle_others_giant()
|
|
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/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.")
|
|
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.
|
|
* * If present, remove the old sprite from the huds and from the mob
|
|
* * If the size_multiplier is still higher than 1, check if the mob is in the list of smallsprite mobs and add it if not
|
|
* * add a new sprite by generating it, then go through the list of mobs with smallsprites toggled on and it to their hud
|
|
* * 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/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", 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
|
|
|
|
GLOB.see_toggle_smallsprite -= remove_from_list
|
|
|
|
return FALSE
|
|
|
|
//Called periodically to regenerate the mob's smallsprite
|
|
/mob/living/carbon/human/BiologicalLife(delta_time, times_fired)
|
|
. = ..()
|
|
regenerate_smallsprite()
|