mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-09 16:12:17 +00:00
Co-authored-by: Cameron Lennox <killer65311@gmail.com> Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
154 lines
4.5 KiB
Plaintext
154 lines
4.5 KiB
Plaintext
#define overlay_cache_LEN 50
|
|
|
|
/obj/item/t_scanner
|
|
name = "\improper T-ray scanner"
|
|
desc = "A terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes."
|
|
icon = 'icons/obj/device.dmi'
|
|
icon_state = "t-ray0"
|
|
item_state = "t-ray"
|
|
slot_flags = SLOT_BELT
|
|
w_class = ITEMSIZE_SMALL
|
|
matter = list(MAT_STEEL = 150)
|
|
origin_tech = list(TECH_MAGNET = 1, TECH_ENGINEERING = 1)
|
|
|
|
var/scan_range = 1
|
|
|
|
var/on = 0
|
|
var/list/active_scanned = list() //assoc list of objects being scanned, mapped to their overlay
|
|
var/client/user_client //since making sure overlays are properly added and removed is pretty important, so we track the current user explicitly
|
|
var/flicker = 0
|
|
|
|
pickup_sound = 'sound/items/pickup/device.ogg'
|
|
drop_sound = 'sound/items/drop/device.ogg'
|
|
|
|
/obj/item/t_scanner/update_icon()
|
|
icon_state = "t-ray[on]"
|
|
|
|
/obj/item/t_scanner/attack_self(mob/user)
|
|
set_active(!on)
|
|
|
|
/obj/item/t_scanner/proc/set_active(var/active)
|
|
on = active
|
|
if(on)
|
|
START_PROCESSING(SSobj, src)
|
|
flicker = 0
|
|
else
|
|
STOP_PROCESSING(SSobj, src)
|
|
set_user_client(null)
|
|
update_icon()
|
|
|
|
//If reset is set, then assume the client has none of our overlays, otherwise we only send new overlays.
|
|
/obj/item/t_scanner/process()
|
|
if(!on) return
|
|
|
|
//handle clients changing
|
|
var/client/loc_client = null
|
|
if(ismob(src.loc))
|
|
var/mob/M = src.loc
|
|
loc_client = M.client
|
|
set_user_client(loc_client)
|
|
|
|
//no sense processing if no-one is going to see it.
|
|
if(!user_client) return
|
|
|
|
//get all objects in scan range
|
|
var/list/scanned = get_scanned_objects(scan_range)
|
|
var/list/update_add = scanned - active_scanned
|
|
var/list/update_remove = active_scanned - scanned
|
|
|
|
//Add new overlays
|
|
for(var/obj/O in update_add)
|
|
var/image/overlay = get_overlay(O)
|
|
active_scanned[O] = overlay
|
|
user_client.images += overlay
|
|
|
|
//Remove stale overlays
|
|
for(var/obj/O in update_remove)
|
|
user_client.images -= active_scanned[O]
|
|
active_scanned -= O
|
|
|
|
//Flicker effect
|
|
for(var/obj/O in active_scanned)
|
|
var/image/overlay = active_scanned[O]
|
|
if(flicker)
|
|
overlay.alpha = 0
|
|
else
|
|
overlay.alpha = 128
|
|
flicker = !flicker
|
|
|
|
//creates a new overlay for a scanned object
|
|
/obj/item/t_scanner/proc/get_overlay(obj/scanned)
|
|
//Use a cache so we don't create a whole bunch of new images just because someone's walking back and forth in a room.
|
|
//Also means that images are reused if multiple people are using t-rays to look at the same objects.
|
|
if(scanned in GLOB.overlay_cache)
|
|
. = GLOB.overlay_cache[scanned]
|
|
else
|
|
var/image/I = image(loc = scanned, icon = scanned.icon, icon_state = scanned.icon_state, layer = HUD_LAYER)
|
|
|
|
//Pipes are special
|
|
if(istype(scanned, /obj/machinery/atmospherics/pipe))
|
|
var/obj/machinery/atmospherics/pipe/P = scanned
|
|
I.color = P.pipe_color
|
|
I.add_overlay(P.overlays)
|
|
|
|
I.alpha = 128
|
|
I.mouse_opacity = 0
|
|
. = I
|
|
|
|
// Add it to cache, cutting old entries if the list is too long
|
|
GLOB.overlay_cache[scanned] = .
|
|
if(GLOB.overlay_cache.len > overlay_cache_LEN)
|
|
GLOB.overlay_cache.Cut(1, GLOB.overlay_cache.len-overlay_cache_LEN-1)
|
|
|
|
/obj/item/t_scanner/proc/get_scanned_objects(var/scan_dist)
|
|
. = list()
|
|
|
|
var/turf/center = get_turf(src.loc)
|
|
if(!center) return
|
|
|
|
for(var/turf/T in range(scan_range, center))
|
|
if(!!T.is_plating())
|
|
continue
|
|
|
|
for(var/obj/O in T.contents)
|
|
if(O.level != 1)
|
|
continue
|
|
if(!O.invisibility)
|
|
continue //if it's already visible don't need an overlay for it
|
|
. += O
|
|
|
|
/obj/item/t_scanner/proc/set_user_client(var/client/new_client)
|
|
if(new_client == user_client)
|
|
return
|
|
if(user_client)
|
|
for(var/scanned in active_scanned)
|
|
user_client.images -= active_scanned[scanned]
|
|
if(new_client)
|
|
for(var/scanned in active_scanned)
|
|
new_client.images += active_scanned[scanned]
|
|
else
|
|
active_scanned.Cut()
|
|
|
|
user_client = new_client
|
|
|
|
/obj/item/t_scanner/dropped(mob/user)
|
|
set_user_client(null)
|
|
..()
|
|
|
|
/obj/item/t_scanner/upgraded
|
|
name = "Upgraded T-ray Scanner"
|
|
desc = "An upgraded version of the terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes."
|
|
matter = list(MAT_STEEL = 500, PHORON = 150)
|
|
origin_tech = list(TECH_MAGNET = 4, TECH_ENGINEERING = 5)
|
|
scan_range = 3
|
|
|
|
/obj/item/t_scanner/advanced
|
|
name = "Advanced T-ray Scanner"
|
|
desc = "An advanced version of the terahertz-ray emitter and scanner used to detect underfloor objects such as cables and pipes."
|
|
matter = list(MAT_STEEL = 1500, PHORON = 200, SILVER = 250)
|
|
origin_tech = list(TECH_MAGNET = 7, TECH_ENGINEERING = 7, TECH_MATERIAL = 6)
|
|
scan_range = 7
|
|
|
|
|
|
#undef overlay_cache_LEN
|