diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index e9a622365a..e55c728121 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -73,6 +73,7 @@ MASS SPECTROMETER
origin_tech = "magnets=1;biotech=1"
var/mode = 1
var/scanmode = 0
+ var/advanced = FALSE
/obj/item/device/healthanalyzer/attack_self(mob/user)
if(!scanmode)
@@ -97,7 +98,7 @@ MASS SPECTROMETER
user.visible_message("[user] has analyzed [M]'s vitals.")
if(scanmode == 0)
- healthscan(user, M, mode)
+ healthscan(user, M, mode, advanced)
else if(scanmode == 1)
chemscan(user, M)
@@ -105,7 +106,7 @@ MASS SPECTROMETER
// Used by the PDA medical scanner too
-/proc/healthscan(mob/living/user, mob/living/M, mode = 1)
+/proc/healthscan(mob/living/user, mob/living/M, mode = 1, advanced = FALSE)
if(user.incapacitated() || user.eye_blind)
return
//Damage specifics
@@ -115,8 +116,8 @@ MASS SPECTROMETER
var/brute_loss = M.getBruteLoss()
var/mob_status = (M.stat == DEAD ? "Deceased" : "[round(M.health/M.maxHealth,0.01)*100] % healthy")
- if(M.status_flags & FAKEDEATH)
- mob_status = "Deceased"
+ if(M.status_flags & FAKEDEATH && !advanced)
+ mob_status = "Deceased"
oxy_loss = max(rand(1, 40), oxy_loss, (300 - (tox_loss + fire_loss + brute_loss))) // Random oxygen loss
if(ishuman(M))
@@ -141,19 +142,77 @@ MASS SPECTROMETER
if(oxy_loss > 10)
to_chat(user, "\t[oxy_loss > 50 ? "Severe" : "Minor"] oxygen deprivation detected.")
if(tox_loss > 10)
- to_chat(user, "\t[tox_loss > 50 ? "Critical" : "Dangerous"] amount of toxins detected.")
+ to_chat(user, "\t[tox_loss > 50 ? "Severe" : "Minor"] amount of toxin damage detected.")
if(M.getStaminaLoss())
to_chat(user, "\tSubject appears to be suffering from fatigue.")
+ if(advanced)
+ to_chat(user, "\tFatigue Level: [M.getStaminaLoss()]%.")
if (M.getCloneLoss())
to_chat(user, "\tSubject appears to have [M.getCloneLoss() > 30 ? "severe" : "minor"] cellular damage.")
- if (M.reagents && M.reagents.get_reagent_amount("epinephrine"))
- to_chat(user, "\tBloodstream analysis located [M.reagents.get_reagent_amount("epinephrine")] units of rejuvenation chemicals.")
+ if(advanced)
+ to_chat(user, "\tCellular Damage Level: [M.getCloneLoss()].")
if (M.getBrainLoss() >= 100 || !M.getorgan(/obj/item/organ/brain))
to_chat(user, "\tSubject brain function is non-existent.")
else if (M.getBrainLoss() >= 60)
to_chat(user, "\tSevere brain damage detected. Subject likely to have mental retardation.")
else if (M.getBrainLoss() >= 10)
to_chat(user, "\tBrain damage detected. Subject may have had a concussion.")
+ if(advanced)
+ to_chat(user, "\tBrain Activity Level: [100 - M.getBrainLoss()]%.")
+ if (M.radiation)
+ to_chat(user, "\tSubject is irradiated.")
+ if(advanced)
+ to_chat(user, "\tRadiation Level: [M.radiation]%.")
+
+ if(advanced && M.hallucinating())
+ to_chat(user, "\tSubject is hallucinating.")
+
+ //Eyes and ears
+ if(advanced)
+ if(iscarbon(M))
+ var/mob/living/carbon/C = M
+ var/obj/item/organ/ears/ears = C.getorganslot("ears")
+ to_chat(user, "\t==EAR STATUS==")
+ if(istype(ears))
+ var/healthy = TRUE
+ if(C.disabilities & DEAF)
+ healthy = FALSE
+ to_chat(user, "\tSubject is genetically deaf.")
+ else
+ if(ears.ear_damage)
+ to_chat(user, "\tSubject has [ears.ear_damage > UNHEALING_EAR_DAMAGE? "permanent ": "temporary "]hearing damage.")
+ healthy = FALSE
+ if(ears.deaf)
+ to_chat(user, "\tSubject is [ears.ear_damage > UNHEALING_EAR_DAMAGE ? "permanently ": "temporarily "] deaf.")
+ healthy = FALSE
+ if(healthy)
+ to_chat(user, "\tHealthy.")
+ else
+ to_chat(user, "\tSubject does not have ears.")
+ var/obj/item/organ/eyes/eyes = C.getorganslot("eye_sight")
+ to_chat(user, "\t==EYE STATUS==")
+ if(istype(eyes))
+ var/healthy = TRUE
+ if(C.disabilities & BLIND)
+ to_chat(user, "\tSubject is blind.")
+ healthy = FALSE
+ if(C.disabilities & NEARSIGHT)
+ to_chat(user, "\tSubject is nearsighted.")
+ healthy = FALSE
+ if(eyes.eye_damage > 30)
+ to_chat(user, "\tSubject has severe eye damage.")
+ healthy = FALSE
+ else if(eyes.eye_damage > 20)
+ to_chat(user, "\tSubject has significant eye damage.")
+ healthy = FALSE
+ else if(eyes.eye_damage)
+ to_chat(user, "\tSubject has minor eye damage.")
+ healthy = FALSE
+ if(healthy)
+ to_chat(user, "\tHealthy.")
+ else
+ to_chat(user, "\tSubject does not have eyes.")
+
if(ishuman(M))
var/mob/living/carbon/human/H = M
@@ -177,7 +236,7 @@ MASS SPECTROMETER
to_chat(user, "Body temperature: [round(M.bodytemperature-T0C,0.1)] °C ([round(M.bodytemperature*1.8-459.67,0.1)] °F)")
// Time of death
- if(M.tod && (M.stat == DEAD || (M.status_flags & FAKEDEATH)))
+ if(M.tod && (M.stat == DEAD || ((M.status_flags & FAKEDEATH) && !advanced)))
to_chat(user, "Time of Death: [M.tod]")
var/tdelta = round(world.time - M.timeofdeath)
if(tdelta < (DEFIB_TIME_LIMIT * 10))
@@ -251,6 +310,12 @@ MASS SPECTROMETER
if(0)
to_chat(usr, "The scanner no longer shows limb damage.")
+/obj/item/device/healthanalyzer/advanced
+ name = "advanced health analyzer"
+ icon_state = "health_adv"
+ desc = "A hand-held body scanner able to distinguish vital signs of the subject with high accuracy."
+ origin_tech = "magnets=3;biotech=3"
+ advanced = TRUE
/obj/item/device/analyzer
desc = "A hand-held environmental scanner which reports current gas levels."
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
index a2a055f464..bf42619280 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
@@ -50,6 +50,7 @@
/obj/structure/closet/secure_closet/CMO
name = "\proper chief medical officer's locker"
req_access = list(ACCESS_CMO)
+<<<<<<< HEAD
icon_state = "cmo"
/obj/structure/closet/secure_closet/CMO/PopulateContents()
@@ -74,6 +75,33 @@
/obj/structure/closet/secure_closet/animal
name = "animal control"
+=======
+ icon_state = "cmo"
+
+/obj/structure/closet/secure_closet/CMO/PopulateContents()
+ ..()
+ new /obj/item/clothing/neck/cloak/cmo(src)
+ new /obj/item/storage/backpack/duffelbag/med(src)
+ new /obj/item/clothing/suit/bio_suit/cmo(src)
+ new /obj/item/clothing/head/bio_hood/cmo(src)
+ new /obj/item/clothing/suit/toggle/labcoat/cmo(src)
+ new /obj/item/clothing/under/rank/chief_medical_officer(src)
+ new /obj/item/clothing/shoes/sneakers/brown (src)
+ new /obj/item/cartridge/cmo(src)
+ new /obj/item/device/radio/headset/heads/cmo(src)
+ new /obj/item/device/megaphone/command(src)
+ new /obj/item/defibrillator/compact/loaded(src)
+ new /obj/item/clothing/gloves/color/latex/nitrile(src)
+ new /obj/item/storage/belt/medical(src)
+ new /obj/item/device/healthanalyzer/advanced(src)
+ new /obj/item/device/assembly/flash/handheld(src)
+ new /obj/item/reagent_containers/hypospray/CMO(src)
+ new /obj/item/device/autosurgeon/cmo(src)
+ new /obj/item/door_remote/chief_medical_officer(src)
+
+/obj/structure/closet/secure_closet/animal
+ name = "animal control"
+>>>>>>> 6ed612c... Adds the advanced medical scanner, gives one to the CMO (#31179)
req_access = list(ACCESS_SURGERY)
/obj/structure/closet/secure_closet/animal/PopulateContents()
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index 79f0a207d4..71ce7d6df5 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ