From fce1875d73721c4fb6deb1ddb1072998d693b172 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 30 Jun 2017 22:47:57 -0500 Subject: [PATCH] Observers can see through some alternate apperances (#1829) --- code/game/alternate_appearance.dm | 39 +++++++++++++++++----- code/modules/mob/dead/observer/observer.dm | 6 ++++ 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/code/game/alternate_appearance.dm b/code/game/alternate_appearance.dm index ce2529890b..67c4469673 100644 --- a/code/game/alternate_appearance.dm +++ b/code/game/alternate_appearance.dm @@ -10,6 +10,7 @@ GLOBAL_LIST_EMPTY(active_alternate_appearances) var/datum/atom_hud/alternate_appearance/AA = alternate_appearances[K] if(AA.appearance_key == key) AA.remove_from_hud(src) + break /atom/proc/add_alt_appearance(type, key, ...) if(!type || !key) @@ -59,6 +60,8 @@ GLOBAL_LIST_EMPTY(active_alternate_appearances) /datum/atom_hud/alternate_appearance/basic var/atom/target var/image/theImage + var/add_ghost_version = FALSE + var/ghost_appearance /datum/atom_hud/alternate_appearance/basic/New(key, image/I, target_sees_appearance = TRUE) ..() @@ -68,6 +71,16 @@ GLOBAL_LIST_EMPTY(active_alternate_appearances) add_to_hud(target, I) if(target_sees_appearance && ismob(target)) add_hud_to(target) + if(add_ghost_version) + var/image/ghost_image = image(icon = I.icon , icon_state = I.icon_state, loc = I.loc) + ghost_image.override = FALSE + ghost_image.alpha = 128 + ghost_appearance = new /datum/atom_hud/alternate_appearance/basic/observers(key + "_observer", ghost_image, FALSE) + +/datum/atom_hud/alternate_appearance/basic/Destroy() + . = ..() + if(ghost_appearance) + QDEL_NULL(ghost_appearance) /datum/atom_hud/alternate_appearance/basic/add_to_hud(atom/A) A.hud_list[appearance_key] = theImage @@ -76,32 +89,42 @@ GLOBAL_LIST_EMPTY(active_alternate_appearances) /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(.) + if(. && !QDELETED(src)) qdel(src) /datum/atom_hud/alternate_appearance/basic/everyone + add_ghost_version = TRUE /datum/atom_hud/alternate_appearance/basic/everyone/New() ..() - for(var/mob in GLOB.player_list) - if(mob) + for(var/mob in GLOB.mob_list) + if(mobShouldSee(mob)) add_hud_to(mob) /datum/atom_hud/alternate_appearance/basic/everyone/mobShouldSee(mob/M) - return TRUE + return !isobserver(M) /datum/atom_hud/alternate_appearance/basic/silicons /datum/atom_hud/alternate_appearance/basic/silicons/New() ..() for(var/mob in GLOB.silicon_mobs) - if(mob) + if(mobShouldSee(mob)) add_hud_to(mob) /datum/atom_hud/alternate_appearance/basic/silicons/mobShouldSee(mob/M) if(issilicon(M)) return TRUE return FALSE + +/datum/atom_hud/alternate_appearance/basic/observers + add_ghost_version = FALSE //just in case, to prevent infinite loops + +/datum/atom_hud/alternate_appearance/basic/observers/New() + ..() + for(var/mob in GLOB.dead_mob_list) + if(mobShouldSee(mob)) + add_hud_to(mob) + +/datum/atom_hud/alternate_appearance/basic/observers/mobShouldSee(mob/M) + return isobserver(M) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 22a81ae7fc..1ac7b27c9e 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -120,6 +120,12 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) GLOB.dead_mob_list += src + for(var/v in GLOB.active_alternate_appearances) + if(!v) + continue + var/datum/atom_hud/alternate_appearance/AA = v + AA.onNewMob(src) + . = ..() grant_all_languages()