153 lines
4.6 KiB
Plaintext
153 lines
4.6 KiB
Plaintext
//Engineering Mesons
|
|
|
|
#define MODE_NONE ""
|
|
#define MODE_MESON "meson"
|
|
#define MODE_TRAY "t-ray"
|
|
#define MODE_RAD "radiation"
|
|
#define MODE_SHUTTLE "shuttle"
|
|
|
|
/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, 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-meson"
|
|
item_state = "trayson-meson"
|
|
actions_types = list(/datum/action/item_action/toggle_mode)
|
|
|
|
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)
|
|
mode = modes[mode]
|
|
to_chat(user, "<span class='[voluntary ? "notice":"warning"]'>[voluntary ? "You turn the goggles":"The goggles turn"] [mode ? "to [mode] mode":"off"][voluntary ? ".":"!"]</span>")
|
|
|
|
switch(mode)
|
|
if(MODE_MESON)
|
|
vision_flags = SEE_TURFS
|
|
darkness_view = 1
|
|
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
|
|
|
|
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
|
|
if(H.glasses == src)
|
|
H.update_sight()
|
|
|
|
update_icon()
|
|
for(var/X in actions)
|
|
var/datum/action/A = X
|
|
A.UpdateButtonIcon()
|
|
|
|
/obj/item/clothing/glasses/meson/engine/attack_self(mob/user)
|
|
toggle_mode(user, TRUE)
|
|
|
|
/obj/item/clothing/glasses/meson/engine/process()
|
|
if(!ishuman(loc))
|
|
return
|
|
var/mob/living/carbon/human/user = loc
|
|
if(user.glasses != src || !user.client)
|
|
return
|
|
switch(mode)
|
|
if(MODE_TRAY)
|
|
t_ray_scan(user, 8, range)
|
|
if(MODE_RAD)
|
|
show_rads()
|
|
if(MODE_SHUTTLE)
|
|
show_shuttle()
|
|
|
|
/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 = 180
|
|
MA.maptext = "[strength]k"
|
|
MA.color = "#64C864"
|
|
MA.layer = FLY_LAYER
|
|
pic.appearance = MA
|
|
flick_overlay(pic, list(user.client), 8)
|
|
|
|
/obj/item/clothing/glasses/meson/engine/proc/show_shuttle()
|
|
var/mob/living/carbon/human/user = loc
|
|
var/obj/docking_port/mobile/port = SSshuttle.get_containing_shuttle(user)
|
|
if(!port)
|
|
return
|
|
var/list/shuttle_areas = port.shuttle_areas
|
|
for(var/r in shuttle_areas)
|
|
var/area/region = r
|
|
for(var/turf/place in region.contents)
|
|
if(get_dist(user, place) > 7)
|
|
continue
|
|
var/image/pic
|
|
if(isshuttleturf(place))
|
|
pic = new('icons/turf/overlays.dmi', place, "greenOverlay", AREA_LAYER)
|
|
else
|
|
pic = new('icons/turf/overlays.dmi', place, "redOverlay", AREA_LAYER)
|
|
flick_overlay(pic, list(user.client), 8)
|
|
|
|
/obj/item/clothing/glasses/meson/engine/update_icon()
|
|
icon_state = "trayson-[mode]"
|
|
update_mob()
|
|
|
|
/obj/item/clothing/glasses/meson/engine/proc/update_mob()
|
|
item_state = icon_state
|
|
if(isliving(loc))
|
|
var/mob/living/user = loc
|
|
if(user.get_item_by_slot(slot_glasses) == src)
|
|
user.update_inv_glasses()
|
|
else
|
|
user.update_inv_hands()
|
|
|
|
/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"
|
|
icon_state = "trayson-t-ray"
|
|
item_state = "trayson-t-ray"
|
|
desc = "Used by engineering staff to see underfloor objects such as cables and pipes."
|
|
range = 2
|
|
|
|
modes = list(MODE_NONE = MODE_TRAY, MODE_TRAY = MODE_NONE)
|
|
|
|
/obj/item/clothing/glasses/meson/engine/shuttle
|
|
name = "shuttle region scanner"
|
|
icon_state = "trayson-shuttle"
|
|
item_state = "trayson-shuttle"
|
|
desc = "Used to see the boundaries of shuttle regions."
|
|
|
|
modes = list(MODE_NONE = MODE_SHUTTLE, MODE_SHUTTLE = MODE_NONE)
|
|
|
|
#undef MODE_NONE
|
|
#undef MODE_MESON
|
|
#undef MODE_TRAY
|
|
#undef MODE_RAD
|
|
#undef MODE_SHUTTLE
|