diff --git a/code/datums/action.dm b/code/datums/action.dm
index 1a146467b5a..84702757e86 100644
--- a/code/datums/action.dm
+++ b/code/datums/action.dm
@@ -162,6 +162,14 @@
/datum/action/item_action/print_report
name = "Print Report"
+/datum/action/item_action/print_forensic_report
+ name = "Print Report"
+ button_icon_state = "scanner_print"
+ use_itemicon = FALSE
+
+/datum/action/item_action/clear_records
+ name = "Clear Scanner Records"
+
/datum/action/item_action/toggle_gunlight
name = "Toggle Gunlight"
diff --git a/code/modules/detective_work/scanner.dm b/code/modules/detective_work/scanner.dm
index dea08c602f9..d043c3e1263 100644
--- a/code/modules/detective_work/scanner.dm
+++ b/code/modules/detective_work/scanner.dm
@@ -12,17 +12,17 @@
flags = CONDUCT | NOBLUDGEON
slot_flags = SLOT_BELT
origin_tech = "engineering=4;biotech=2;programming=5"
- var/scanning = 0
+ var/scanning = FALSE
var/list/log = list()
- actions_types = list(/datum/action/item_action/print_report)
+ actions_types = list(/datum/action/item_action/print_forensic_report, /datum/action/item_action/clear_records)
-/obj/item/detective_scanner/attack_self(var/mob/user)
+/obj/item/detective_scanner/attack_self(mob/user)
var/search = input(user, "Enter name, fingerprint or blood DNA.", "Find record", "")
if(!search || user.stat || user.incapacitated())
return
- search = lowertext(search)
+ search = lowertext(search) //This is here so that it doesn't run 'lowertext()' until the checks have passed.
var/name
var/fingerprint = "FINGERPRINT NOT FOUND"
@@ -30,85 +30,95 @@
// I really, really wish I didn't have to split this into two seperate loops. But the datacore is awful.
- for(var/record in GLOB.data_core.general)
+ for(var/record in GLOB.data_core.general) // Search in the 'general' datacore
var/datum/data/record/S = record
- if(S && (search == lowertext(S.fields["fingerprint"]) || search == lowertext(S.fields["name"])))
+ if(S && (search == lowertext(S.fields["fingerprint"]) || search == lowertext(S.fields["name"]))) // Get Fingerprint and Name
name = S.fields["name"]
fingerprint = S.fields["fingerprint"]
- continue
+ break
- for(var/record in GLOB.data_core.medical)
+ for(var/record in GLOB.data_core.medical) // Then search in the 'medical' datacore
var/datum/data/record/M = record
- if(M && ( search == lowertext(M.fields["b_dna"]) || name == M.fields["name"]) )
+ if(M && (search == lowertext(M.fields["b_dna"]) || name == M.fields["name"])) // Get Blood DNA
dna = M.fields["b_dna"]
- if(fingerprint == "FINGERPRINT NOT FOUND") // We have searched by DNA, and do not have the relevant information from the fingerprint records.
+ if(fingerprint == "FINGERPRINT NOT FOUND") // We have searched for DNA, and so do not have the relevant information from the fingerprint records.
name = M.fields["name"]
for(var/gen_record in GLOB.data_core.general)
var/datum/data/record/S = gen_record
if(S && (name == S.fields["name"]))
fingerprint = S.fields["fingerprint"]
- continue
- continue
+ break
+ else //Eveything's been set, break the loop
+ break
if(name)
to_chat(user, "Match found in station records: [name]
\
Fingerprint: [fingerprint]
\
Blood DNA: [dna]")
- return
+ else
+ to_chat(user, "No match found in station records.")
- to_chat(user, "No match found in station records.")
-
-/obj/item/detective_scanner/ui_action_click()
- print_scanner_report()
+/obj/item/detective_scanner/ui_action_click(mob/user, actiontype)
+ if(actiontype == /datum/action/item_action/print_forensic_report)
+ print_scanner_report()
+ else
+ clear_scanner()
/obj/item/detective_scanner/proc/print_scanner_report()
- if(log.len && !scanning)
- scanning = 1
+ if(length(log) && !scanning)
+ scanning = TRUE
to_chat(usr, "Printing report, please wait...")
playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1)
- spawn(100)
- // Create our paper
- var/obj/item/paper/P = new(get_turf(src))
- P.name = "paper- 'Scanner Report'"
- P.info = "
Scanner Report
"
- P.info += jointext(log, "
")
- P.info += "
Notes:
"
- P.info_links = P.info
-
- if(ismob(loc))
- var/mob/M = loc
- M.put_in_hands(P)
- to_chat(M, "Report printed. Log cleared.")
-
- // Clear the logs
- log = list()
- scanning = 0
+ addtimer(CALLBACK(src, .proc/make_paper, log), 10 SECONDS) // Create our paper
+ log = list() // Clear the logs
+ scanning = FALSE
else
- to_chat(usr, "The scanner has no logs or is in use.")
+ to_chat(usr, "The scanner has no logs or is in use.")
+
+/obj/item/detective_scanner/proc/make_paper(log) // Moved to a proc because 'spawn()' is evil
+ var/obj/item/paper/P = new(get_turf(src))
+ P.name = "paper- 'Scanner Report'"
+ P.info = "Scanner Report
"
+ P.info += jointext(log, "
")
+ P.info += "
Notes:
"
+ P.info_links = P.info
+
+ if(ismob(loc))
+ var/mob/M = loc
+ M.put_in_hands(P)
+ to_chat(M, "Report printed. Log cleared.")
-/obj/item/detective_scanner/attack(mob/living/M as mob, mob/user as mob)
+/obj/item/detective_scanner/proc/clear_scanner()
+ if(length(log) && !scanning)
+ log = list()
+ playsound(loc, 'sound/machines/ding.ogg', 40)
+ addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, usr, "Scanner logs cleared."), 1.5 SECONDS) //Timer so that it clears on the 'ding'
+ else
+ to_chat(usr, "The scanner has no logs or is in use.")
+
+
+/obj/item/detective_scanner/attack()
return
-
-/obj/item/detective_scanner/afterattack(atom/A, mob/user as mob, proximity)
+/obj/item/detective_scanner/afterattack(atom/A, mob/user)
scan(A, user)
-/obj/item/detective_scanner/proc/scan(var/atom/A, var/mob/user)
+/obj/item/detective_scanner/proc/scan(atom/A, mob/user)
if(!scanning)
// Can remotely scan objects and mobs.
- if(!in_range(A, user) && !(A in view(world.view, user)))
+ if(!(A in view(world.view, user)))
return
if(loc != user)
return
- scanning = 1
+ scanning = TRUE
- user.visible_message("\The [user] points the [src.name] at \the [A] and performs a forensic scan.")
- to_chat(user, "You scan \the [A]. The scanner is now analysing the results...")
+ user.visible_message("[user] points [src] at [A] and performs a forensic scan.",
+ "You scan [A]. The scanner is now analysing the results...")
// GATHER INFORMATION
@@ -123,10 +133,10 @@
// Start gathering
- if(A.blood_DNA && A.blood_DNA.len)
+ if(length(A.blood_DNA))
blood = A.blood_DNA.Copy()
- if(A.suit_fibers && A.suit_fibers.len)
+ if(length(A.suit_fibers))
fibers = A.suit_fibers.Copy()
if(ishuman(A))
@@ -137,11 +147,11 @@
else if(!ismob(A))
- if(A.fingerprints && A.fingerprints.len)
+ if(length(A.fingerprints))
fingerprints = A.fingerprints.Copy()
// Only get reagents from non-mobs.
- if(A.reagents && A.reagents.reagent_list.len)
+ if(A.reagents && length(A.reagents.reagent_list))
for(var/datum/reagent/R in A.reagents.reagent_list)
reagents[R.name] = R.volume
@@ -154,63 +164,60 @@
var/blood_type = R.data["blood_type"]
blood[blood_DNA] = blood_type
- // We gathered everything. Create a fork and slowly display the results to the holder of the scanner.
- spawn(0)
+ // We gathered everything. Slowly display the results to the holder of the scanner.
+ var/found_something = FALSE
+ add_log("[station_time_timestamp()][get_timestamp()] - [target_name]", FALSE)
- var/found_something = 0
- add_log("[station_time_timestamp()][get_timestamp()] - [target_name]", 0)
+ // Fingerprints
+ if(length(fingerprints))
+ sleep(30)
+ add_log("Prints:")
+ for(var/finger in fingerprints)
+ add_log("[finger]")
+ found_something = TRUE
- // Fingerprints
- if(fingerprints && fingerprints.len)
- sleep(30)
- add_log("Prints:")
- for(var/finger in fingerprints)
- add_log("[finger]")
- found_something = 1
+ // Blood
+ if(length(blood))
+ sleep(30)
+ add_log("Blood:")
+ found_something = TRUE
+ for(var/B in blood)
+ add_log("Type: [blood[B]] DNA: [B]")
- // Blood
- if(blood && blood.len)
- sleep(30)
- add_log("Blood:")
- found_something = 1
- for(var/B in blood)
- add_log("Type: [blood[B]] DNA: [B]")
+ //Fibers
+ if(length(fibers))
+ sleep(30)
+ add_log("Fibers:")
+ for(var/fiber in fibers)
+ add_log("[fiber]")
+ found_something = TRUE
- //Fibers
- if(fibers && fibers.len)
- sleep(30)
- add_log("Fibers:")
- for(var/fiber in fibers)
- add_log("[fiber]")
- found_something = 1
+ //Reagents
+ if(length(reagents))
+ sleep(30)
+ add_log("Reagents:")
+ for(var/R in reagents)
+ add_log("Reagent: [R] Volume: [reagents[R]]")
+ found_something = TRUE
- //Reagents
- if(reagents && reagents.len)
- sleep(30)
- add_log("Reagents:")
- for(var/R in reagents)
- add_log("Reagent: [R] Volume: [reagents[R]]")
- found_something = 1
+ // Get a new user
+ var/mob/holder = null
+ if(ismob(loc))
+ holder = loc
- // Get a new user
- var/mob/holder = null
- if(ismob(src.loc))
- holder = src.loc
+ if(!found_something)
+ add_log("# No forensic traces found #", FALSE) // Don't display this to the holder user
+ if(holder)
+ to_chat(holder, "Unable to locate any fingerprints, materials, fibers, or blood on [A]!")
+ else
+ if(holder)
+ to_chat(holder, "You finish scanning [A].")
- if(!found_something)
- add_log("# No forensic traces found #", 0) // Don't display this to the holder user
- if(holder)
- to_chat(holder, "Unable to locate any fingerprints, materials, fibers, or blood on \the [target_name]!")
- else
- if(holder)
- to_chat(holder, "You finish scanning \the [target_name].")
+ add_log("---------------------------------------------------------", FALSE)
+ scanning = FALSE
- add_log("---------------------------------------------------------", 0)
- scanning = 0
- return
-
-/obj/item/detective_scanner/proc/add_log(var/msg, var/broadcast = 1)
+/obj/item/detective_scanner/proc/add_log(msg, broadcast = TRUE)
if(scanning)
if(broadcast && ismob(loc))
var/mob/M = loc
diff --git a/icons/mob/actions/actions.dmi b/icons/mob/actions/actions.dmi
index 80a5dbe5b04..011baf1e4ac 100644
Binary files a/icons/mob/actions/actions.dmi and b/icons/mob/actions/actions.dmi differ