diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index 157d9bdfe9eb..6f8b67f0bbdf 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -55,6 +55,7 @@
#define TRAIT_PARALYSIS_R_ARM "para-r-arm"
#define TRAIT_PARALYSIS_L_LEG "para-l-leg"
#define TRAIT_PARALYSIS_R_LEG "para-r-leg"
+#define TRAIT_XRAY_VISION "xray_vision"
//non-mob traits
#define TRAIT_PARALYSIS "paralysis" //Used for limb-based paralysis, where replacing the limb will fix it
@@ -98,4 +99,5 @@
#define STASIS_MUTE "stasis"
#define GENETICS_SPELL "genetics_spell"
#define EYES_COVERED "eyes_covered"
-#define CULT_EYES "cult_eyes"
\ No newline at end of file
+#define CULT_EYES "cult_eyes"
+#define SCRYING_ORB "scrying-orb"
diff --git a/code/datums/mutations/sight.dm b/code/datums/mutations/sight.dm
index 1f23a92906b5..f16dad20dddf 100644
--- a/code/datums/mutations/sight.dm
+++ b/code/datums/mutations/sight.dm
@@ -45,11 +45,13 @@
if(..())
return
+ owner.add_trait(TRAIT_XRAY_VISION, GENETIC_MUTATION)
owner.update_sight()
/datum/mutation/human/x_ray/on_losing(mob/living/carbon/human/owner)
if(..())
return
+ owner.remove_trait(TRAIT_XRAY_VISION, GENETIC_MUTATION)
owner.update_sight()
diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm
index a98169aa6715..8bc04bd1bc55 100644
--- a/code/modules/antagonists/wizard/equipment/artefact.dm
+++ b/code/modules/antagonists/wizard/equipment/artefact.dm
@@ -136,7 +136,7 @@
/obj/item/scrying
name = "scrying orb"
- desc = "An incandescent orb of otherworldly energy, staring into it gives you vision beyond mortal means."
+ desc = "An incandescent orb of otherworldly energy, merely holding it gives you vision and hearing beyond mortal means, and staring into it lets you see the entire universe."
icon = 'icons/obj/projectiles.dmi'
icon_state ="bluespace"
throw_speed = 3
@@ -146,18 +146,38 @@
force = 15
hitsound = 'sound/items/welder2.ogg'
- var/xray_granted = FALSE
+ var/mob/current_owner
-/obj/item/scrying/equipped(mob/user)
- if(!xray_granted && ishuman(user))
- var/mob/living/carbon/human/H = user
- if(!(H.dna.check_mutation(XRAY)))
- H.dna.add_mutation(XRAY)
- xray_granted = TRUE
+/obj/item/scrying/Initialize(mapload)
+ . = ..()
+ START_PROCESSING(SSobj, src)
+
+/obj/item/scrying/Destroy()
+ STOP_PROCESSING(SSobj, src)
. = ..()
+/obj/item/scrying/process()
+ var/mob/holder = get(loc, /mob)
+ if(current_owner && current_owner != holder)
+
+ to_chat(current_owner, "Your otherworldly vision fades...")
+
+ current_owner.remove_trait(TRAIT_SIXTHSENSE, SCRYING_ORB)
+ current_owner.remove_trait(TRAIT_XRAY_VISION, SCRYING_ORB)
+ current_owner.update_sight()
+
+ current_owner = null
+
+ if(!current_owner)
+ current_owner = holder
+
+ to_chat(current_owner, "You can see...everything!")
+
+ current_owner.add_trait(TRAIT_SIXTHSENSE, SCRYING_ORB)
+ current_owner.add_trait(TRAIT_XRAY_VISION, SCRYING_ORB)
+ current_owner.update_sight()
+
/obj/item/scrying/attack_self(mob/user)
- to_chat(user, "You can see...everything!")
visible_message("[user] stares into [src], their eyes glazing over.")
user.ghostize(1)
@@ -188,12 +208,12 @@
if(M.stat != DEAD)
to_chat(user, "This artifact can only affect the dead!")
return
-
+
for(var/mob/dead/observer/ghost in GLOB.dead_mob_list) //excludes new players
if(ghost.mind && ghost.mind.current == M && ghost.client) //the dead mobs list can contain clientless mobs
ghost.reenter_corpse()
break
-
+
if(!M.mind || !M.client)
to_chat(user, "There is no soul connected to this body...")
return
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index d161c7d23dbd..3a7be0eacc26 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -590,12 +590,10 @@
see_invisible = min(G.invis_view, see_invisible)
if(!isnull(G.lighting_alpha))
lighting_alpha = min(lighting_alpha, G.lighting_alpha)
- if(dna)
- for(var/X in dna.mutations)
- var/datum/mutation/M = X
- if(M.name == XRAY)
- sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS)
- see_in_dark = max(see_in_dark, 8)
+
+ if(has_trait(TRAIT_XRAY_VISION))
+ sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS)
+ see_in_dark = max(see_in_dark, 8)
if(see_override)
see_invisible = see_override