/*
CONTAINS:
T-RAY SCANNER
REAGENT SCANNERS
SLIME SCANNER
*/
////////////////////////////////////////
// MARK: T-ray scanner
////////////////////////////////////////
/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"
worn_icon_state = "electronic"
inhand_icon_state = "electronic"
slot_flags = ITEM_SLOT_BELT
w_class = WEIGHT_CLASS_SMALL
materials = list(MAT_METAL = 300)
origin_tech = "magnets=1;engineering=1"
var/on = FALSE
/obj/item/t_scanner/Destroy()
if(on)
STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/t_scanner/proc/toggle_on()
on = !on
icon_state = copytext_char(icon_state, 1, -1) + "[on]"
if(on)
START_PROCESSING(SSobj, src)
else
STOP_PROCESSING(SSobj, src)
/obj/item/t_scanner/attack_self__legacy__attackchain(mob/user)
toggle_on()
/obj/item/t_scanner/process()
if(!on)
STOP_PROCESSING(SSobj, src)
return null
scan()
/obj/item/t_scanner/proc/scan()
t_ray_scan(loc)
/proc/t_ray_scan(mob/viewer, flick_time = 8, distance = 3)
if(!ismob(viewer) || !viewer.client)
return
var/list/t_ray_images = list()
for(var/obj/O in orange(distance, viewer))
if(O.level != 1)
continue
if(O.invisibility == INVISIBILITY_MAXIMUM)
var/image/I = new(loc = get_turf(O))
var/mutable_appearance/MA = new(O)
MA.alpha = 128
MA.dir = O.dir
if(MA.layer < TURF_LAYER)
MA.layer += TRAY_SCAN_LAYER_OFFSET
MA.plane = GAME_PLANE
I.appearance = MA
t_ray_images += I
if(length(t_ray_images))
flick_overlay(t_ray_images, list(viewer.client), flick_time)
////////////////////////////////////////
// MARK: Reagent scanners
////////////////////////////////////////
/obj/item/reagent_scanner
name = "reagent scanner"
desc = "A hand-held reagent scanner which identifies chemical agents and blood types."
icon = 'icons/obj/device.dmi'
icon_state = "spectrometer"
inhand_icon_state = "analyzer"
w_class = WEIGHT_CLASS_SMALL
flags = CONDUCT
slot_flags = ITEM_SLOT_BELT
throw_speed = 4
throw_range = 20
materials = list(MAT_METAL = 300, MAT_GLASS = 200)
origin_tech = "magnets=2;biotech=1;plasmatech=2"
var/details = FALSE
var/datatoprint = ""
var/scanning = TRUE
actions_types = list(/datum/action/item_action/print_report)
new_attack_chain = TRUE
/obj/item/reagent_scanner/interact_with_atom(atom/target, mob/living/user, list/modifiers)
. = ..()
do_scan(target, user)
/obj/item/reagent_scanner/ranged_interact_with_atom(atom/target, mob/living/user, list/modifiers)
. = ..()
do_scan(target, user)
/obj/item/reagent_scanner/proc/do_scan(atom/target, mob/living/user)
if(user.stat != CONSCIOUS)
return
if(!user.IsAdvancedToolUser())
to_chat(user, SPAN_WARNING("You don't have the dexterity to do this!"))
return
if(!target.reagents)
to_chat(user, SPAN_NOTICE("No significant chemical agents found in [target]."))
return
if(!length(target.reagents.reagent_list))
to_chat(user, SPAN_NOTICE("No active chemical agents found in [target]."))
return
var/dat
var/blood_type = ""
var/one_percent = target.reagents.total_volume / 100
for(var/datum/reagent/R in target.reagents.reagent_list)
if(R.id != "blood")
dat += "
[TAB][SPAN_NOTICE("[R] [details ? ":([R.volume / one_percent]%)" : ""]")]"
else
blood_type = R.data["blood_type"]
dat += "
[TAB][SPAN_NOTICE("[blood_type ? "[blood_type]" : ""] [R.data["species"]] [R.name] [details ? ":([R.volume / one_percent]%)" : ""]")]"
to_chat(user, SPAN_NOTICE("Chemicals found: [dat]"))
datatoprint = dat
scanning = FALSE
/obj/item/reagent_scanner/adv
name = "advanced reagent scanner"
icon_state = "adv_spectrometer"
details = TRUE
origin_tech = "magnets=4;biotech=3;plasmatech=3"
/obj/item/reagent_scanner/proc/print_report(mob/user)
if(!istype(user))
return
if(scanning)
to_chat(user, SPAN_NOTICE("[src] has no logs or is already in use."))
return
user.visible_message(SPAN_WARNING("[src] rattles and prints out a sheet of paper."))
playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, TRUE)
sleep(5 SECONDS)
var/obj/item/paper/P = new(get_turf(src))
P.name = "Reagent Scanner Report: [station_time_timestamp()]"
P.info = "