diff --git a/code/modules/clothing/glasses/engine_goggles.dm b/code/modules/clothing/glasses/engine_goggles.dm
index 7908964b1c..e3a99fdb9a 100644
--- a/code/modules/clothing/glasses/engine_goggles.dm
+++ b/code/modules/clothing/glasses/engine_goggles.dm
@@ -1,45 +1,48 @@
//Engineering Mesons
+#define MODE_NONE ""
+#define MODE_MESON "meson"
+#define MODE_TRAY "t-ray"
+#define MODE_RAD "radiation"
+
/obj/item/clothing/glasses/meson/engine
name = "engineering scanner goggles"
- desc = "Goggles used by engineers. The Meson Scanner mode lets you see basic structural and terrain layouts through walls, regardless of lighting condition. The T-ray Scanner mode lets you see underfloor objects such as cables and pipes."
- icon_state = "trayson-meson"
+ desc = "Goggles used by engineers. The Meson Scanner mode lets you see basic structural and terrain layouts through walls, the T-ray Scanner mode lets you see underfloor objects such as cables and pipes, and the Radiation Scanner mode let's you see objects contaminated by radiation."
+ icon_state = "trayson"
actions_types = list(/datum/action/item_action/toggle_mode)
origin_tech = "materials=3;magnets=3;engineering=3;plasmatech=3"
- var/mesons_on = TRUE //if set to FALSE, these goggles work as t-ray scanners.
+ vision_flags = NONE
+ darkness_view = 2
+ invis_view = SEE_INVISIBLE_LIVING
+
+ var/list/modes = list(MODE_NONE = MODE_MESON, MODE_MESON = MODE_TRAY, MODE_TRAY = MODE_RAD, MODE_RAD = MODE_NONE)
+ var/mode = MODE_NONE
var/range = 1
-
-
/obj/item/clothing/glasses/meson/engine/Initialize()
. = ..()
START_PROCESSING(SSobj, src)
+ update_icon()
/obj/item/clothing/glasses/meson/engine/Destroy()
STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/clothing/glasses/meson/engine/proc/toggle_mode(mob/user, voluntary)
- mesons_on = !mesons_on
+ mode = modes[mode]
+ to_chat(user, "[voluntary ? "You turn the goggles":"The goggles turn"] [mode ? "to [mode] mode":"off"][voluntary ? ".":"!"]")
- if(!mesons_on)
- vision_flags = 0
- darkness_view = 2
- invis_view = SEE_INVISIBLE_LIVING
- lighting_alpha = null
- if(voluntary)
- to_chat(user, "You toggle the goggles' scanning mode to \[T-Ray].")
- else
- to_chat(user, "The goggles abruptly toggle to \[T-Ray] mode!")
- else
- vision_flags = SEE_TURFS
- darkness_view = 1
- lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE
- if(voluntary)
- to_chat(user, "You toggle the goggles' scanning mode to \[Meson].")
- else
- to_chat(user, "The goggles abruptly toggle to \[Meson] mode!")
+ switch(mode)
+ if(MODE_MESON)
+ vision_flags = SEE_TURFS
+ darkness_view = 1
+ lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE
+
+ if(MODE_TRAY) //undoes the last mode, meson
+ vision_flags = NONE
+ darkness_view = 2
+ lighting_alpha = null
if(ishuman(user))
var/mob/living/carbon/human/H = user
@@ -55,7 +58,7 @@
toggle_mode(user, TRUE)
/obj/item/clothing/glasses/meson/engine/process()
- if(mesons_on)
+ if(mode == MODE_MESON)
var/turf/T = get_turf(src)
if(T && T.z == ZLEVEL_MINING)
toggle_mode(loc)
@@ -63,11 +66,13 @@
if(!ishuman(loc))
return
-
var/mob/living/carbon/human/user = loc
- if(user.glasses != src)
+ if(user.glasses != src || !user.client)
return
- scan()
+ if(mode == MODE_TRAY)
+ scan()
+ else if(mode == MODE_RAD)
+ show_rads()
/obj/item/clothing/glasses/meson/engine/proc/scan()
for(var/turf/T in range(range, loc))
@@ -79,17 +84,40 @@
flick_sonar(O)
/obj/item/clothing/glasses/meson/engine/proc/flick_sonar(obj/pipe)
- if(ismob(loc))
- var/mob/M = loc
- var/image/I = new(loc = get_turf(pipe))
- var/mutable_appearance/MA = new(pipe)
+ var/mob/M = loc
+ var/image/I = new(loc = get_turf(pipe))
+ var/mutable_appearance/MA = new(pipe)
+ MA.alpha = 128
+ I.appearance = MA
+ flick_overlay(I, list(M.client), 8)
+
+/obj/item/clothing/glasses/meson/engine/proc/show_rads()
+ var/mob/living/carbon/human/user = loc
+ var/list/rad_places = list()
+ for(var/datum/component/radioactive/thing in SSradiation.processing)
+ var/atom/owner = thing.parent
+ var/turf/place = get_turf(owner)
+ if(rad_places[place])
+ rad_places[place] += thing.strength
+ else
+ rad_places[place] = thing.strength
+
+ for(var/i in rad_places)
+ var/turf/place = i
+ if(get_dist(user, place) >= range*2) //Rads are easier to see than wires under the floor
+ continue
+ var/strength = round(rad_places[i] / 1000, 0.1)
+ var/image/pic = new(loc = place)
+ var/mutable_appearance/MA = new()
MA.alpha = 128
- I.appearance = MA
- if(M.client)
- flick_overlay(I, list(M.client), 8)
+ MA.maptext = "[strength]k"
+ MA.color = "#64C864"
+ MA.layer = AREA_LAYER
+ pic.appearance = MA
+ flick_overlay(pic, list(user.client), 8)
/obj/item/clothing/glasses/meson/engine/update_icon()
- icon_state = mesons_on ? "trayson-meson" : "trayson-tray"
+ icon_state = "[initial(icon_state)]-[mode]"
if(istype(loc, /mob/living/carbon/human/))
var/mob/living/carbon/human/user = loc
if(user.glasses == src)
@@ -98,35 +126,13 @@
/obj/item/clothing/glasses/meson/engine/tray //atmos techs have lived far too long without tray goggles while those damned engineers get their dual-purpose gogles all to themselves
name = "optical t-ray scanner"
desc = "Used by engineering staff to see underfloor objects such as cables and pipes."
- icon_state = "trayson-tray_off"
origin_tech = "materials=3;magnets=2;engineering=2"
- mesons_on = FALSE
- var/on = FALSE
- vision_flags = 0
- darkness_view = 2
- invis_view = SEE_INVISIBLE_LIVING
range = 2
+ modes = list(MODE_NONE = MODE_TRAY, MODE_TRAY = MODE_NONE)
-/obj/item/clothing/glasses/meson/engine/tray/process()
- if(!on)
- return
- ..()
-
-/obj/item/clothing/glasses/meson/engine/tray/update_icon()
- icon_state = "trayson-tray[on ? "" : "_off"]"
- if(istype(loc, /mob/living/carbon/human/))
- var/mob/living/carbon/human/user = loc
- if(user.glasses == src)
- user.update_inv_glasses()
-
-/obj/item/clothing/glasses/meson/engine/tray/toggle_mode(mob/user, voluntary)
- on = !on
-
- to_chat(user, "[voluntary ? "You turn the goggles":"The goggles turn"] [on ? "on":"off"][voluntary ? ".":"!"]")
-
- update_icon()
- for(var/X in actions)
- var/datum/action/A = X
- A.UpdateButtonIcon()
+#undef MODE_NONE
+#undef MODE_MESON
+#undef MODE_TRAY
+#undef MODE_RAD
\ No newline at end of file
diff --git a/icons/mob/eyes.dmi b/icons/mob/eyes.dmi
index 193182892d..39f5f1a6f8 100644
Binary files a/icons/mob/eyes.dmi and b/icons/mob/eyes.dmi differ
diff --git a/icons/obj/clothing/glasses.dmi b/icons/obj/clothing/glasses.dmi
index 1152b395ab..5045ccce2b 100644
Binary files a/icons/obj/clothing/glasses.dmi and b/icons/obj/clothing/glasses.dmi differ