Files
Aurora.3/code/modules/detectivework/tools/swabs.dm
Werner 3742231bc2 Major UT Overhaul (#16544)
* Removes old UT definition files (drone/travis)
* Adds concurrency definitions to the workflows
* Changes our workflows to be more in line with what /tg does
* Adds a workflow to build/commit TGUI
* Adds a workflow to build/commit changelogs

Add python version to dependencies.sh
Fix dme errors
Removes a bunch of not included files
Cache Opendream and add directory to check_grep.py

Co-authored-by: Werner <Arrow768@users.noreply.github.com>
2023-06-27 16:44:16 +02:00

162 lines
5.2 KiB
Plaintext

/obj/item/forensics/swab
name = "swab kit"
desc = "A sterilized cotton swab and vial used to take forensic samples."
desc_info = "Swab kits can be used to gather blood with DNA attached to it by clicking the blood. \
If it fails to collect a sample, it means that particular bit of blood has no associated DNA. \
\nThey can also collect DNA samples directly from people by targetting their mouth to take a saliva sample. \
\nGunshot Residue (GSR) can be collected from someones hands by targetting them. If they are wearing gloves, \
the residue will be taken from the gloves instead. \
\n\nGSR samples are put in a slide and examined in a microscope. \
\nBlood and DNA samples are checked in the DNA analyzer"
icon_state = "swab"
var/list/gsr
var/list/dna
var/used
drop_sound = 'sound/items/drop/glass.ogg'
pickup_sound = 'sound/items/pickup/glass.ogg'
/obj/item/forensics/swab/proc/is_used()
return used
/obj/item/forensics/swab/attack(var/mob/living/M, var/mob/user, var/target_zone)
if(!ishuman(M))
return ..()
if(is_used())
return
var/mob/living/carbon/human/H = M
var/sample_type
if(!H.dna || !H.dna.unique_enzymes)
to_chat(user, SPAN_WARNING("They don't seem to have DNA!"))
return
if(user != H && H.a_intent != "help" && !H.lying)
user.visible_message(SPAN_DANGER("\The [user] tries to take a swab sample from \the [H], but they move away."))
return
if(target_zone == BP_MOUTH)
if(!H.organs_by_name[BP_HEAD])
to_chat(user, SPAN_WARNING("They don't have a head."))
return
if(!H.check_has_mouth())
to_chat(user, SPAN_WARNING("They don't have a mouth."))
return
if(H.wear_mask)
to_chat(user, SPAN_WARNING("\The [H] is wearing a mask."))
return
user.visible_message("[user] swabs \the [H]'s mouth for a saliva sample.")
dna = list(H.dna.unique_enzymes)
sample_type = "DNA"
else if(target_zone == BP_R_HAND || target_zone == BP_L_HAND)
var/has_hand
var/obj/item/organ/external/O = H.organs_by_name[BP_R_HAND]
if(istype(O) && !O.is_stump())
has_hand = 1
else
O = H.organs_by_name[BP_L_HAND]
if(istype(O) && !O.is_stump())
has_hand = 1
if(!has_hand)
to_chat(user, SPAN_WARNING("They don't have any hands."))
return
if(H.gloves)
var/obj/item/clothing/B = H.gloves
if(!LAZYLEN(B.gunshot_residue))
to_chat(user, SPAN_WARNING("There is no residue on [H]'s [B]."))
return
user.visible_message("[user] swabs [H]'s [B] for a sample.")
LAZYADD(gsr, B.gunshot_residue)
else
if(!LAZYLEN(H.gunshot_residue))
to_chat(user, SPAN_WARNING("There is no residue on [H]'s palms."))
return
user.visible_message("[user] swabs [H]'s palm for a sample.")
LAZYADD(gsr, H.gunshot_residue)
sample_type = "GSR"
else
return
if(sample_type)
set_used(sample_type, H)
return
return 1
/obj/item/forensics/swab/afterattack(var/atom/A, var/mob/user, var/proximity)
if(!proximity || istype(A, /obj/item/forensics/slide) || istype(A, /obj/machinery/dnaforensics) || ismob(A) || istype(A, /obj/structure/filingcabinet))
return
if(is_used())
to_chat(user, SPAN_WARNING("This swab has already been used."))
return
add_fingerprint(user)
var/list/choices = list()
if(A.blood_DNA)
choices |= EVIDENCE_TYPE_BLOOD
if(istype(A, /obj/item/clothing))
choices |= EVIDENCE_TYPE_GSR
if(LAZYLEN(A.other_DNA) && A.other_DNA_type == "saliva")
choices |= EVIDENCE_TYPE_SALIVA
var/list/list/additional_evidence = A.get_additional_forensics_swab_info()
if(additional_evidence && additional_evidence["type"] != "")
choices |= EVIDENCE_TYPE_ADDITIONAL + " - " + additional_evidence["type"]
var/choice
if(!choices.len)
to_chat(user, SPAN_WARNING("There is no evidence on \the [A]."))
return
else if(choices.len == 1)
choice = choices[1]
else
choice = input("What kind of evidence are you looking for?","Evidence Collection") as null|anything in choices
if(!choice)
return
var/sample_type
var/sample_message
switch (choice)
if (EVIDENCE_TYPE_BLOOD)
if(!A.blood_DNA || !A.blood_DNA.len) return
dna = A.blood_DNA.Copy()
sample_type = "blood"
if (EVIDENCE_TYPE_GSR)
var/obj/item/clothing/B = A
if(!istype(B) || !LAZYLEN(B.gunshot_residue))
to_chat(user, SPAN_WARNING("There is no residue on \the [A]."))
return
LAZYADD(gsr, B.gunshot_residue)
sample_type = "residue"
if (EVIDENCE_TYPE_SALIVA)
if (!LAZYLEN(A.other_DNA)) return
dna = A.other_DNA.Copy()
sample_type = "saliva"
else //additional evidence
if(additional_evidence["dna"].len)
dna = additional_evidence["dna"].Copy()
if(additional_evidence["gsr"])
gsr = additional_evidence["gsr"]
sample_type = additional_evidence["sample_type"]
if(!sample_type)
crash_with("[user] swabbed \the [A.name] for additional evidence but there was no sample_type defined!")
sample_message = additional_evidence["sample_message"]
if(sample_type)
user.visible_message("\The [user] swabs \the [A] for a sample.", sample_message || "You swab \the [A] for a sample.")
set_used(sample_type, A)
/obj/item/forensics/swab/proc/set_used(var/sample_str, var/atom/source)
name = "[initial(name)] ([sample_str] - [source])"
desc = "[initial(desc)] The label on the vial reads 'Sample of [sample_str] from [source].'."
icon_state = "swab_used"
used = 1