Revenants are always visible in mirrors (#95379)

## About The Pull Request

Revenants, even while invisible, can be seen in the reflection of
mirrors

<img width="231" height="254" alt="image"
src="https://github.com/user-attachments/assets/135341b8-192c-4f9b-b9c3-0da2c96c6fac"
/>

They have an ethereal, ghostly effect applied to their reflection while
invisible (it's an animation so you can't see it in the picture), this
effect is removed if they become visible. It also doesn't apply when
reflecting in a magic mirror.

Additionally, "Defile" will now break mirrors, though not magic mirrors.
Also, Revenants no longer elevate over tables. They're ghosts after all.

## Why It's Good For The Game

It's a thematically appropriate way for a Revenant to reveal themselves
to the crew without, well, outright revealing themselves.

Also there's a hypothetical world where Medbay puts mirrors everywhere
to catch a Revenant.

## Changelog

🆑 Melbert
add: Revenants are always visible in mirror reflections, even while
invisible.
add: Revenant "Defile" now shatters mirrors.
qol: Revenants no longer elevate over tables.
/🆑
This commit is contained in:
MrMelbert
2026-03-12 09:39:36 +13:00
committed by GitHub
parent 531ac0c09c
commit 065c9eb763
5 changed files with 43 additions and 5 deletions
@@ -95,13 +95,22 @@
/mob/living/basic/revenant/Initialize(mapload)
. = ..()
AddElement(/datum/element/simple_flying)
add_traits(list(TRAIT_SPACEWALK, TRAIT_SIXTHSENSE, TRAIT_FREE_HYPERSPACE_MOVEMENT, TRAIT_SEE_BLESSED_TILES), INNATE_TRAIT)
add_traits(list(TRAIT_SPACEWALK, TRAIT_SIXTHSENSE, TRAIT_FREE_HYPERSPACE_MOVEMENT, TRAIT_SEE_BLESSED_TILES, TRAIT_IGNORE_ELEVATION), INNATE_TRAIT)
grant_actions_by_list(abilities)
RegisterSignal(src, COMSIG_LIVING_BANED, PROC_REF(on_baned))
RegisterSignal(src, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(on_move))
RegisterSignal(src, COMSIG_LIVING_LIFE, PROC_REF(on_life))
RegisterSignal(src, COMSIG_REFLECTION_UPDATED, PROC_REF(on_reflect))
RegisterSignals(src, list(
SIGNAL_ADDTRAIT(TRAIT_REVENANT_REVEALED),
SIGNAL_REMOVETRAIT(TRAIT_REVENANT_REVEALED),
SIGNAL_ADDTRAIT(TRAIT_REVENANT_INHIBITED),
SIGNAL_REMOVETRAIT(TRAIT_REVENANT_INHIBITED),
SIGNAL_ADDTRAIT(TRAIT_NO_TRANSFORM),
SIGNAL_REMOVETRAIT(TRAIT_NO_TRANSFORM),
), PROC_REF(update_revenant_appearance))
name = generate_random_mob_name()
GLOB.revenant_relay_mobs |= src
@@ -146,9 +155,12 @@
essence = min(essence + (essence_regen_amount * change_in_time), max_essence)
update_mob_action_buttons() //because we update something required by our spells in life, we need to update our buttons
update_appearance(UPDATE_ICON)
update_health_hud()
/mob/living/basic/revenant/proc/update_revenant_appearance()
SIGNAL_HANDLER
update_appearance(UPDATE_ICON)
/mob/living/basic/revenant/AltClickOn(atom/target)
if(CAN_I_SEE(target))
client.loot_panel.open(get_turf(target))
@@ -466,4 +478,18 @@
to_chat(src, span_revenminor("Lost [essence_to_change_by]E [source ? "from [source]":""]."))
return TRUE
/mob/living/basic/revenant/proc/on_reflect(datum/source, atom/movable/reflecting_in, obj/effect/abstract/reflection)
SIGNAL_HANDLER
// powers are inhibited and we're not revealed so we can't project a reflect
if(HAS_TRAIT(src, TRAIT_REVENANT_INHIBITED) && !HAS_TRAIT(src, TRAIT_REVENANT_REVEALED))
return
// otherwise revenants are always visible in reflections even if otherwise invisible
reflection.clear_filters()
reflection.SetInvisibility(0)
// but if we're (actually) invisible we look all wibbly and ghostly (unless the mirror is magic)
if(!HAS_TRAIT(src, TRAIT_REVENANT_REVEALED) && !istype(reflecting_in, /obj/structure/mirror/magic))
apply_wibbly_filters(reflection)
#undef REVENANT_STUNNED_TRAIT
@@ -188,6 +188,11 @@
new /obj/effect/temp_visual/revenant/cracks(window.loc)
for(var/obj/machinery/light/light in victim)
light.flicker(rand(3, 5)) //spooky
for(var/obj/structure/mirror/mirror in victim)
if(istype(mirror, /obj/structure/mirror/magic))
continue
new /obj/effect/temp_visual/revenant(mirror.loc)
mirror.atom_break("magic")
//Malfunction: Makes bad stuff happen to robots and machines.
/datum/action/cooldown/spell/aoe/revenant/malfunction