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