mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-13 09:05:11 +01:00
83cd43da91
Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com>
241 lines
9.2 KiB
Plaintext
241 lines
9.2 KiB
Plaintext
//Engineering Mesons
|
|
|
|
#define MODE_NONE ""
|
|
#define MODE_MESON "meson"
|
|
#define MODE_TRAY "t-ray"
|
|
#define MODE_SHUTTLE "shuttle"
|
|
#define MODE_PIPE_CONNECTABLE "connectable"
|
|
#define MODE_ATMOS_THERMAL "atmospheric-thermal"
|
|
#define MODE_AREA_BLUEPRINTS "area-blueprints"
|
|
#define TEMP_SHADE_CYAN 273.15
|
|
#define TEMP_SHADE_GREEN 283.15
|
|
#define TEMP_SHADE_YELLOW 300
|
|
#define TEMP_SHADE_RED 500
|
|
|
|
/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 and the T-ray Scanner mode lets you see underfloor objects such as cables and pipes."
|
|
icon_state = "trayson-meson"
|
|
inhand_icon_state = "trayson-meson"
|
|
actions_types = list(/datum/action/item_action/toggle_mode)
|
|
glass_colour_type = /datum/client_colour/glass_colour/gray
|
|
gender = PLURAL
|
|
vision_flags = NONE
|
|
color_cutoffs = null
|
|
/// List of selectable modes that can be used by the goggles
|
|
var/list/modes = list(MODE_NONE, MODE_MESON, MODE_TRAY)
|
|
/// The current mode string that is selected from the modes list (used for icons)
|
|
var/mode = MODE_NONE
|
|
/// The current mode index that is selected from the modes list
|
|
var/mode_index = 1
|
|
/// The distance for how far we can see special objects (only used for pipes and wires)
|
|
var/range = 1
|
|
/// A cache of tracked pipes used in MODE_PIPE_CONNECTABLE
|
|
var/list/connection_images = list()
|
|
|
|
/obj/item/clothing/glasses/meson/engine/Initialize(mapload)
|
|
. = ..()
|
|
AddElement(/datum/element/update_icon_updates_onmob)
|
|
START_PROCESSING(SSobj, src)
|
|
update_appearance()
|
|
|
|
/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_index = WRAP_UP(mode_index, modes.len)
|
|
mode = modes[mode_index]
|
|
to_chat(user, "<span class='[voluntary ? "notice":"warning"]'>[voluntary ? "You turn the goggles":"The goggles turn"] [mode ? "to [mode] mode":"off"][voluntary ? ".":"!"]</span>")
|
|
if(connection_images.len)
|
|
connection_images.Cut()
|
|
switch(mode)
|
|
if(MODE_MESON)
|
|
vision_flags = SEE_TURFS
|
|
color_cutoffs = list(15, 12, 0)
|
|
change_glass_color(/datum/client_colour/glass_colour/yellow)
|
|
|
|
if(MODE_TRAY) //undoes the last mode, meson
|
|
vision_flags = NONE
|
|
color_cutoffs = null
|
|
change_glass_color(/datum/client_colour/glass_colour/lightblue)
|
|
|
|
if(MODE_PIPE_CONNECTABLE)
|
|
change_glass_color(/datum/client_colour/glass_colour/lightblue)
|
|
|
|
if(MODE_SHUTTLE)
|
|
change_glass_color(/datum/client_colour/glass_colour/red)
|
|
|
|
if(MODE_AREA_BLUEPRINTS)
|
|
change_glass_color(/datum/client_colour/glass_colour/lightyellow)
|
|
|
|
if(MODE_NONE)
|
|
change_glass_color(initial(glass_colour_type))
|
|
|
|
if(ishuman(user))
|
|
var/mob/living/carbon/human/H = user
|
|
if(H.glasses == src)
|
|
H.update_sight()
|
|
|
|
update_appearance()
|
|
update_item_action_buttons()
|
|
|
|
/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_SHUTTLE)
|
|
show_shuttle()
|
|
if(MODE_PIPE_CONNECTABLE)
|
|
show_connections()
|
|
if(MODE_ATMOS_THERMAL)
|
|
atmos_thermal(user)
|
|
if(MODE_AREA_BLUEPRINTS)
|
|
show_blueprints(user)
|
|
|
|
/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/area/region as anything in shuttle_areas)
|
|
for (var/list/zlevel_turfs as anything in region.get_zlevel_turf_lists())
|
|
for (var/turf/place as anything in zlevel_turfs)
|
|
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_global(pic, list(user.client), 8)
|
|
|
|
/obj/item/clothing/glasses/meson/engine/proc/show_connections()
|
|
var/mob/living/carbon/human/user = loc
|
|
|
|
for(var/obj/machinery/atmospherics/pipe/smart/smart in connection_images)
|
|
if(get_dist(loc, smart.loc) > range)
|
|
connection_images -= smart
|
|
|
|
for(var/obj/machinery/atmospherics/pipe/smart/smart in orange(range, user))
|
|
if(!connection_images[smart])
|
|
connection_images[smart] = list()
|
|
for(var/direction in GLOB.cardinals)
|
|
if(!(smart.get_init_directions() & direction))
|
|
continue
|
|
if(!connection_images[smart][dir2text(direction)])
|
|
var/image/arrow
|
|
arrow = new('icons/obj/pipes_n_cables/simple.dmi', get_turf(smart), "connection_overlay")
|
|
arrow.dir = direction
|
|
arrow.layer = smart.layer
|
|
arrow.color = smart.pipe_color
|
|
PIPING_LAYER_DOUBLE_SHIFT(arrow, smart.piping_layer)
|
|
connection_images[smart][dir2text(direction)] = arrow
|
|
if(connection_images.len)
|
|
flick_overlay_global(connection_images[smart][dir2text(direction)], list(user.client), 1.5 SECONDS)
|
|
|
|
/obj/item/clothing/glasses/meson/engine/update_icon_state()
|
|
icon_state = inhand_icon_state = "trayson-[mode]"
|
|
return ..()
|
|
|
|
/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"
|
|
inhand_icon_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_PIPE_CONNECTABLE, MODE_ATMOS_THERMAL) // atmos techs now finally have 3 modes on their goggles!
|
|
|
|
/obj/item/clothing/glasses/meson/engine/tray/dropped(mob/user)
|
|
. = ..()
|
|
if(connection_images.len)
|
|
connection_images.Cut()
|
|
|
|
/obj/item/clothing/glasses/meson/engine/shuttle
|
|
name = "shuttle region scanner"
|
|
icon_state = "trayson-shuttle"
|
|
inhand_icon_state = "trayson-shuttle"
|
|
desc = "Used to see the boundaries of shuttle regions."
|
|
modes = list(MODE_NONE, MODE_SHUTTLE)
|
|
|
|
/obj/item/clothing/glasses/meson/engine/atmos_imaging
|
|
name = "atmospheric thermal imaging goggles"
|
|
desc = "Goggles used by Atmospheric Technicians to see the thermal energy of gasses in open areas."
|
|
icon_state = "trayson-atmospheric-thermal"
|
|
inhand_icon_state = "trayson-meson"
|
|
glass_colour_type = /datum/client_colour/glass_colour/gray
|
|
modes = list(MODE_NONE, MODE_ATMOS_THERMAL)
|
|
|
|
/obj/item/clothing/glasses/meson/engine/atmos_imaging/update_icon_state()
|
|
icon_state = inhand_icon_state = "trayson-[mode]"
|
|
return ..()
|
|
|
|
/obj/item/clothing/glasses/meson/engine/admin
|
|
name = "admin imaging goggles"
|
|
desc = "Used by Nanotrasen admins to detect blueprint areas, pipes, thermal, wiring, and pipes."
|
|
range = 7
|
|
modes = list(MODE_NONE, MODE_TRAY, MODE_PIPE_CONNECTABLE, MODE_ATMOS_THERMAL, MODE_AREA_BLUEPRINTS)
|
|
|
|
/proc/show_blueprints(mob/viewer, range = 7, duration = 10)
|
|
if(!ismob(viewer) || !viewer.client)
|
|
return
|
|
for(var/turf/viewable_turf in view(range, viewer))
|
|
var/area/selected_area = get_area(viewable_turf)
|
|
var/obj/area_overlay = image(selected_area.icon, viewable_turf, initial(selected_area.icon_state), TOPDOWN_ABOVE_WATER_LAYER)
|
|
SET_PLANE_EXPLICIT(area_overlay, ABOVE_GAME_PLANE, viewable_turf)
|
|
area_overlay.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA
|
|
area_overlay.mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
|
area_overlay.alpha = 255
|
|
flick_overlay_global(area_overlay, list(viewer.client), duration)
|
|
|
|
/proc/atmos_thermal(mob/viewer, range = 5, duration = 10)
|
|
if(!ismob(viewer) || !viewer.client)
|
|
return
|
|
for(var/turf/open in view(range, viewer))
|
|
if(open.blocks_air)
|
|
continue
|
|
var/datum/gas_mixture/environment = open.return_air()
|
|
var/temp = round(environment.return_temperature())
|
|
var/image/turf_overlay = image('icons/turf/overlays.dmi', open, "greyOverlay", ABOVE_OPEN_TURF_LAYER)
|
|
// Lower than TEMP_SHADE_CYAN should be deep blue
|
|
switch(temp)
|
|
if(-INFINITY to TEMP_SHADE_CYAN)
|
|
turf_overlay.color = COLOR_STRONG_BLUE
|
|
// Between TEMP_SHADE_CYAN and TEMP_SHADE_GREEN
|
|
if(TEMP_SHADE_CYAN to TEMP_SHADE_GREEN)
|
|
turf_overlay.color = BlendRGB(COLOR_DARK_CYAN, COLOR_LIME, max(round((temp - TEMP_SHADE_CYAN)/(TEMP_SHADE_GREEN - TEMP_SHADE_CYAN), 0.01), 0))
|
|
// Between TEMP_SHADE_GREEN and TEMP_SHADE_YELLOW
|
|
if(TEMP_SHADE_GREEN to TEMP_SHADE_YELLOW)
|
|
turf_overlay.color = BlendRGB(COLOR_LIME, COLOR_YELLOW, clamp(round((temp-TEMP_SHADE_GREEN)/(TEMP_SHADE_YELLOW - TEMP_SHADE_GREEN), 0.01), 0, 1))
|
|
// Between TEMP_SHADE_YELLOW and TEMP_SHADE_RED
|
|
if(TEMP_SHADE_YELLOW to TEMP_SHADE_RED)
|
|
turf_overlay.color = BlendRGB(COLOR_YELLOW, COLOR_RED, clamp(round((temp-TEMP_SHADE_YELLOW)/(TEMP_SHADE_RED - TEMP_SHADE_YELLOW), 0.01), 0, 1))
|
|
// Over TEMP_SHADE_RED should be red
|
|
if(TEMP_SHADE_RED to INFINITY)
|
|
turf_overlay.color = COLOR_RED
|
|
turf_overlay.mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
|
turf_overlay.alpha = 200
|
|
flick_overlay_global(turf_overlay, list(viewer.client), duration)
|
|
|
|
|
|
#undef MODE_NONE
|
|
#undef MODE_MESON
|
|
#undef MODE_TRAY
|
|
#undef MODE_SHUTTLE
|
|
#undef MODE_PIPE_CONNECTABLE
|
|
#undef MODE_ATMOS_THERMAL
|
|
#undef MODE_AREA_BLUEPRINTS
|
|
#undef TEMP_SHADE_CYAN
|
|
#undef TEMP_SHADE_GREEN
|
|
#undef TEMP_SHADE_YELLOW
|
|
#undef TEMP_SHADE_RED
|