GLOBAL_LIST_EMPTY(active_alternate_appearances) /atom var/list/alternate_appearances /atom/proc/remove_alt_appearance(key) if(alternate_appearances) for(var/K in alternate_appearances) var/datum/atom_hud/alternate_appearance/AA = alternate_appearances[K] if(AA.appearance_key == key) AA.remove_from_hud(src) /atom/proc/add_alt_appearance(type, key, ...) if(!type || !key) return if(alternate_appearances && alternate_appearances[key]) return var/list/arguments = args.Copy(2) new type(arglist(arguments)) /datum/atom_hud/alternate_appearance var/appearance_key /datum/atom_hud/alternate_appearance/New(key) ..() GLOB.active_alternate_appearances += src appearance_key = key /datum/atom_hud/alternate_appearance/Destroy() for(var/v in hudusers) remove_hud_from(v) for(var/v in hudatoms) remove_from_hud(v) GLOB.active_alternate_appearances -= src return ..() /datum/atom_hud/alternate_appearance/proc/onNewMob(mob/M) if(mobShouldSee(M)) add_hud_to(M) /datum/atom_hud/alternate_appearance/proc/mobShouldSee(mob/M) return FALSE /datum/atom_hud/alternate_appearance/add_to_hud(atom/A, image/I) . = ..() if(.) LAZYINITLIST(A.alternate_appearances) A.alternate_appearances[appearance_key] = src /datum/atom_hud/alternate_appearance/remove_from_hud(atom/A) . = ..() if(.) LAZYREMOVE(A.alternate_appearances, appearance_key) //an alternate appearance that attaches a single image to a single atom /datum/atom_hud/alternate_appearance/basic var/atom/target var/image/theImage /datum/atom_hud/alternate_appearance/basic/New(key, image/I, target_sees_appearance = TRUE) ..() theImage = I target = I.loc hud_icons = list(appearance_key) add_to_hud(target, I) if(target_sees_appearance && ismob(target)) add_hud_to(target) /datum/atom_hud/alternate_appearance/basic/add_to_hud(atom/A) A.hud_list[appearance_key] = theImage . = ..() /datum/atom_hud/alternate_appearance/basic/remove_from_hud(atom/A) . = ..() A.hud_list -= appearance_key /datum/atom_hud/alternate_appearance/basic/remove_from_hud(atom/A) . = ..() if(.) qdel(src) /datum/atom_hud/alternate_appearance/basic/everyone /datum/atom_hud/alternate_appearance/basic/everyone/New() ..() for(var/mob in GLOB.player_list) if(mob) add_hud_to(mob) /datum/atom_hud/alternate_appearance/basic/everyone/mobShouldSee(mob/M) return TRUE /datum/atom_hud/alternate_appearance/basic/silicons /datum/atom_hud/alternate_appearance/basic/silicons/New() ..() for(var/mob in GLOB.silicon_mobs) if(mob) add_hud_to(mob) /datum/atom_hud/alternate_appearance/basic/silicons/mobShouldSee(mob/M) if(issilicon(M)) return TRUE return FALSE