diff --git a/code/game/machinery/bots/medbot.dm b/code/game/machinery/bots/medbot.dm
index 5193b1b7cdd..b0eac270b02 100644
--- a/code/game/machinery/bots/medbot.dm
+++ b/code/game/machinery/bots/medbot.dm
@@ -449,7 +449,7 @@
new /obj/item/device/assembly/prox_sensor(Tsec)
- new /obj/item/device/healthanalyzer(Tsec)
+ new /obj/item/device/healthanalyzer(Tsec) //yeah
if(src.reagent_glass)
src.reagent_glass.forceMove(Tsec)
diff --git a/code/game/machinery/vending/vendor_types/antag/antag_gear.dm b/code/game/machinery/vending/vendor_types/antag/antag_gear.dm
index 3e847b4919d..d22f256dfe9 100644
--- a/code/game/machinery/vending/vendor_types/antag/antag_gear.dm
+++ b/code/game/machinery/vending/vendor_types/antag/antag_gear.dm
@@ -42,7 +42,7 @@
/obj/item/bodybag/cryobag,
/obj/item/device/defibrillator,
/obj/item/storage/firstaid/adv,
- /obj/item/device/healthanalyzer,
+ /obj/item/device/healthanalyzer/soul,
/obj/item/roller,
/obj/item/tool/surgery/surgical_line,
/obj/item/tool/surgery/synthgraft,
diff --git a/code/game/machinery/vending/vendor_types/antag/antag_guns_snowflake.dm b/code/game/machinery/vending/vendor_types/antag/antag_guns_snowflake.dm
index 73a2c7346a4..841df51350e 100644
--- a/code/game/machinery/vending/vendor_types/antag/antag_guns_snowflake.dm
+++ b/code/game/machinery/vending/vendor_types/antag/antag_guns_snowflake.dm
@@ -41,7 +41,7 @@
/obj/item/bodybag/cryobag,
/obj/item/device/defibrillator,
/obj/item/storage/firstaid/adv,
- /obj/item/device/healthanalyzer,
+ /obj/item/device/healthanalyzer/soul,
/obj/item/roller,
)
diff --git a/code/game/machinery/vending/vendor_types/crew/medical.dm b/code/game/machinery/vending/vendor_types/crew/medical.dm
index b2477b4eb49..6c3e6e13e46 100644
--- a/code/game/machinery/vending/vendor_types/crew/medical.dm
+++ b/code/game/machinery/vending/vendor_types/crew/medical.dm
@@ -243,7 +243,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_researcher, list(
spawned_gear_list = list(
/obj/item/device/defibrillator,
/obj/item/storage/firstaid/adv,
- /obj/item/device/healthanalyzer,
+ /obj/item/device/healthanalyzer/soul,
/obj/item/tool/surgery/surgical_line,
/obj/item/tool/surgery/synthgraft,
/obj/item/storage/syringe_case,
@@ -258,7 +258,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_researcher, list(
spawned_gear_list = list(
/obj/item/device/defibrillator,
/obj/item/storage/firstaid/adv,
- /obj/item/device/healthanalyzer,
+ /obj/item/device/healthanalyzer/soul,
/obj/item/tool/surgery/surgical_line,
/obj/item/tool/surgery/synthgraft,
/obj/item/clothing/accessory/stethoscope,
diff --git a/code/game/machinery/vending/vendor_types/crew/senior_officers.dm b/code/game/machinery/vending/vendor_types/crew/senior_officers.dm
index 0a6bf52c3a4..70e6e100a0a 100644
--- a/code/game/machinery/vending/vendor_types/crew/senior_officers.dm
+++ b/code/game/machinery/vending/vendor_types/crew/senior_officers.dm
@@ -306,7 +306,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_cmo, list(
spawned_gear_list = list(
/obj/item/device/defibrillator,
/obj/item/storage/firstaid/adv,
- /obj/item/device/healthanalyzer,
+ /obj/item/device/healthanalyzer/soul,
/obj/item/tool/surgery/surgical_line,
/obj/item/tool/surgery/synthgraft,
/obj/item/device/flashlight/pen,
diff --git a/code/game/machinery/vending/vendor_types/crew/synthetic.dm b/code/game/machinery/vending/vendor_types/crew/synthetic.dm
index 43d6caebffc..cd42eef8e06 100644
--- a/code/game/machinery/vending/vendor_types/crew/synthetic.dm
+++ b/code/game/machinery/vending/vendor_types/crew/synthetic.dm
@@ -53,7 +53,7 @@
list("Injector (Tramadol)", 1, /obj/item/reagent_container/hypospray/autoinjector/tramadol, null, VENDOR_ITEM_REGULAR),
list("Injector (Tricord)", 1, /obj/item/reagent_container/hypospray/autoinjector/tricord, null, VENDOR_ITEM_REGULAR),
- list("Health Analyzer", 2, /obj/item/device/healthanalyzer, null, VENDOR_ITEM_REGULAR),
+ list("Health Analyzer", 2, /obj/item/device/healthanalyzer/soul, null, VENDOR_ITEM_REGULAR),
list("Surgical Line", 3, /obj/item/tool/surgery/surgical_line, null, VENDOR_ITEM_REGULAR),
list("Synth-Graft", 3, /obj/item/tool/surgery/synthgraft, null, VENDOR_ITEM_REGULAR),
diff --git a/code/game/machinery/vending/vendor_types/engineering.dm b/code/game/machinery/vending/vendor_types/engineering.dm
index 3662d447a34..0c7b7de47e8 100644
--- a/code/game/machinery/vending/vendor_types/engineering.dm
+++ b/code/game/machinery/vending/vendor_types/engineering.dm
@@ -207,6 +207,6 @@
list("MISCELLANOUS", -1, null, null),
list("Anesthetic Tank", 2, /obj/item/tank/anesthetic, VENDOR_ITEM_REGULAR),
- list("Health Analyzer", 2, /obj/item/device/healthanalyzer, VENDOR_ITEM_REGULAR)
+ list("Health Diagnostic Equipment", 2, /obj/item/device/healthanalyzer/soul, VENDOR_ITEM_REGULAR)
)
diff --git a/code/game/machinery/vending/vendor_types/medical.dm b/code/game/machinery/vending/vendor_types/medical.dm
index 9137ab35c19..09b550c3bce 100644
--- a/code/game/machinery/vending/vendor_types/medical.dm
+++ b/code/game/machinery/vending/vendor_types/medical.dm
@@ -242,7 +242,7 @@
var/list/chem_refill = list(
/obj/item/reagent_container/hypospray/autoinjector/bicaridine,
/obj/item/reagent_container/hypospray/autoinjector/dexalinp,
- /obj/item/reagent_container/hypospray/autoinjector/adrenaline,,
+ /obj/item/reagent_container/hypospray/autoinjector/adrenaline,
/obj/item/reagent_container/hypospray/autoinjector/inaprovaline,
/obj/item/reagent_container/hypospray/autoinjector/kelotane,
/obj/item/reagent_container/hypospray/autoinjector/oxycodone,
@@ -511,7 +511,7 @@
list("Surgical Line", floor(scale * 2), /obj/item/tool/surgery/surgical_line, VENDOR_ITEM_REGULAR),
list("Synth-Graft", floor(scale * 2), /obj/item/tool/surgery/synthgraft, VENDOR_ITEM_REGULAR),
list("Hypospray", floor(scale * 3), /obj/item/reagent_container/hypospray/tricordrazine, VENDOR_ITEM_REGULAR),
- list("Health Analyzer", floor(scale * 5), /obj/item/device/healthanalyzer, VENDOR_ITEM_REGULAR),
+ list("Health Diagnostic Equipment", floor(scale * 3), /obj/item/device/healthanalyzer/soul, VENDOR_ITEM_REGULAR),
list("M276 Pattern Medical Storage Rig", floor(scale * 2), /obj/item/storage/belt/medical, VENDOR_ITEM_REGULAR),
list("Medical HUD Glasses", floor(scale * 3), /obj/item/clothing/glasses/hud/health, VENDOR_ITEM_REGULAR),
list("Syringe", floor(scale * 7), /obj/item/reagent_container/syringe, VENDOR_ITEM_REGULAR)
@@ -710,7 +710,7 @@
list("Surgical Line", floor(scale * 2), /obj/item/tool/surgery/surgical_line, VENDOR_ITEM_REGULAR),
list("Synth-Graft", floor(scale * 2), /obj/item/tool/surgery/synthgraft, VENDOR_ITEM_REGULAR),
list("Hypospray", floor(scale * 2), /obj/item/reagent_container/hypospray/tricordrazine, VENDOR_ITEM_REGULAR),
- list("Health Analyzer", floor(scale * 5), /obj/item/device/healthanalyzer, VENDOR_ITEM_REGULAR),
+ list("Health Diagnostic Equipment", floor(scale * 3), /obj/item/device/healthanalyzer/soul, VENDOR_ITEM_REGULAR),
list("Type 41 Pattern Medical Storage Rig", floor(scale * 2), /obj/item/storage/belt/medical/upp, VENDOR_ITEM_REGULAR),
list("Medical HUD Glasses", floor(scale * 3), /obj/item/clothing/glasses/hud/health, VENDOR_ITEM_REGULAR),
list("Syringe", floor(scale * 7), /obj/item/reagent_container/syringe, VENDOR_ITEM_REGULAR)
@@ -747,8 +747,7 @@
list("Pain-Stop Autoinjector", floor(scale * 5), /obj/item/reagent_container/hypospray/autoinjector/skillless/tramadol, VENDOR_ITEM_REGULAR),
list("DEVICES", -1, null, null),
- list("Health Analyzer", floor(scale * 3), /obj/item/device/healthanalyzer, VENDOR_ITEM_REGULAR),
-
+ list("Health Diagnostic Equipment", floor(scale * 2), /obj/item/device/healthanalyzer/soul, VENDOR_ITEM_REGULAR),
list("FIELD SUPPLIES", -1, null, null),
list("Fire Extinguisher (portable)", 5, /obj/item/tool/extinguisher/mini, VENDOR_ITEM_REGULAR),
list("Ointment", floor(scale * 8), /obj/item/stack/medical/ointment, VENDOR_ITEM_REGULAR),
@@ -820,7 +819,7 @@
list("Medical Splints", 4, /obj/item/stack/medical/splint, VENDOR_ITEM_REGULAR),
list("UTILITY", -1, null, null),
- list("HF2 Health Analyzer", 2, /obj/item/device/healthanalyzer, VENDOR_ITEM_REGULAR)
+ list("Rebreather", 2, /obj/item/clothing/mask/rebreather, VENDOR_ITEM_REGULAR)
)
chem_refill_volume = 250
@@ -860,8 +859,7 @@
list("Pain-Stop Autoinjector", 8, /obj/item/reagent_container/hypospray/autoinjector/skillless/tramadol, VENDOR_ITEM_REGULAR),
list("DEVICES", -1, null, null),
- list("Health Analyzer", 8, /obj/item/device/healthanalyzer, VENDOR_ITEM_REGULAR),
-
+ list("Health Analyzer", 2, /obj/item/device/healthanalyzer/soul, VENDOR_ITEM_REGULAR),
list("FIELD SUPPLIES", -1, null, null),
list("Burn Kit", 8, /obj/item/stack/medical/advanced/ointment, VENDOR_ITEM_REGULAR),
list("Trauma Kit", 8, /obj/item/stack/medical/advanced/bruise_pack, VENDOR_ITEM_REGULAR),
diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_leader.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_leader.dm
index 8cb71a57872..63ab9fb30b7 100644
--- a/code/game/machinery/vending/vendor_types/squad_prep/squad_leader.dm
+++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_leader.dm
@@ -77,7 +77,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_leader, list(
list("Injector (Tramadol)", 1, /obj/item/reagent_container/hypospray/autoinjector/tramadol, null, VENDOR_ITEM_REGULAR),
list("Injector (Tricord)", 1, /obj/item/reagent_container/hypospray/autoinjector/tricord, null, VENDOR_ITEM_REGULAR),
- list("Health Analyzer", 4, /obj/item/device/healthanalyzer, null, VENDOR_ITEM_REGULAR),
+ list("Health Analyzer", 4, /obj/item/device/healthanalyzer/soul, null, VENDOR_ITEM_REGULAR),
list("Roller Bed", 2, /obj/item/roller, null, VENDOR_ITEM_REGULAR),
list("PRIMARY AMMUNITION", 0, null, null, null),
diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_medic.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_medic.dm
index 2e8bf82544e..318c509c927 100644
--- a/code/game/machinery/vending/vendor_types/squad_prep/squad_medic.dm
+++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_medic.dm
@@ -39,7 +39,7 @@ GLOBAL_LIST_INIT(cm_vending_gear_medic, list(
list("Pill Bottle (Tramadol)", 5, /obj/item/storage/pill_bottle/tramadol, null, VENDOR_ITEM_RECOMMENDED),
list("MEDICAL UTILITIES", 0, null, null, null),
- list("Health Analyzer", 4, /obj/item/device/healthanalyzer, null, VENDOR_ITEM_REGULAR),
+ list("Health Analyzer", 4, /obj/item/device/healthanalyzer/soul, null, VENDOR_ITEM_REGULAR),
list("Roller Bed", 4, /obj/item/roller, null, VENDOR_ITEM_REGULAR),
list("Pressurized Reagent Canister Pouch (EMPTY)", 3, /obj/item/storage/pouch/pressurized_reagent_canister, null, VENDOR_ITEM_REGULAR),
list("G8-A General Utility Pouch", 15, /obj/item/storage/backpack/general_belt, null, VENDOR_ITEM_REGULAR),
@@ -219,7 +219,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_medic, list(
spawned_gear_list = list(
/obj/item/storage/firstaid/adv,
/obj/item/storage/firstaid/adv,
- /obj/item/device/healthanalyzer,
+ /obj/item/device/healthanalyzer/soul,
/obj/item/roller/medevac,
/obj/item/roller,
/obj/item/tool/surgery/surgical_line,
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 0e7680cd2f7..2a27e467799 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -83,6 +83,7 @@ FORENSIC SCANNER
var/popup_window = TRUE
var/last_scan
+ var/list/buffer_for_report = list()
var/datum/health_scan/last_health_display
var/alien = FALSE
@@ -142,6 +143,422 @@ FORENSIC SCANNER
last_scan = null // reset the data
to_chat(usr, "The scanner [popup_window ? "now" : "no longer"] shows results on the hud.")
+/datum/looping_sound/healthanalyzer_oxygen_beeping //This will be instanced and the sounds changed because I might as well
+ start_sound = list('sound/items/healthanalyzer_oxygen_alarm.ogg' = 1)
+ mid_sounds = list('sound/items/healthanalyzer_oxygen_alarm.ogg' = 1)
+ mid_length = 1 SECONDS
+ volume = 4
+ extra_range = 14
+
+/datum/looping_sound/healthanalyzer_heart_beeping //This will be instanced and the sounds changed because I might as well
+ start_sound = list('sound/items/healthanalyzer_heart_flatline.ogg' = 1)
+ mid_sounds = list('sound/items/healthanalyzer_heart_flatline.ogg' = 1)
+ mid_length = 0.9 SECONDS
+ volume = 4
+ extra_range = 14
+/*
+/datum/looping_sound/healthanalyzer_heart_beeping_bad
+ start_sound = list('sound/items/healthanalyzer_heart_bad.ogg' = 1)
+ mid_sounds = start_sound
+ mid_length = 1.402 SECONDS
+ volume = 20
+
+/datum/looping_sound/healthanalyzer_heart_beeping_very_bad
+ start_sound = list('sound/items/healthanalyzer_heart_very_bad.ogg' = 1)
+ mid_sounds = list('sound/items/healthanalyzer_heart_very_bad.ogg' = 1)
+ mid_length = 0.492 SECONDS
+ volume = 20
+
+/datum/looping_sound/healthanalyzer_heart_beeping_severe
+ start_sound = list('sound/items/healthanalyzer_heart_severe.ogg' = 1)
+ mid_sounds = start_sound
+ mid_length = 0.408 SECONDS
+ volume = 20
+
+/datum/looping_sound/healthanalyzer_heart_beeping_flatline
+ start_sound = list('sound/items/healthanalyzer_heart_flatline.ogg' = 1)
+ mid_sounds = start_sound
+ mid_length = 1.446 SECONDS
+ volume = 20
+*/
+
+/obj/item/device/healthanalyzer/soul
+ icon = 'icons/obj/items/Medical Scanner.dmi'
+ icon_state = "Medical_scanner"
+ item_state = "analyzer"
+ flags_equip_slot = SLOT_WAIST | SLOT_BACK | SLOT_SUIT_STORE
+ w_class = SIZE_MEDIUM
+ var/mode = 1
+ var/report_delay_counter = 0
+ var/report_delay_threshold = 3 //every three processes, record to report buffer
+ var/mob/living/carbon/human/connected_to
+ var/mob/living/carbon/human/connected_from
+ var/blood_type = null
+ var/datum/beam/current_beam
+ var/datum/looping_sound/healthanalyzer_oxygen_beeping/oxygen_alarm_loop
+ var/datum/looping_sound/healthanalyzer_heart_beeping/heart_rate_loop
+/obj/item/device/healthanalyzer/soul/Initialize()
+ . = ..()
+ heart_rate_loop = new(src)
+ oxygen_alarm_loop = new(src)
+
+/obj/item/device/healthanalyzer/soul/verb/print_report_verb()
+ set name = "Print Report"
+ set category = "Object"
+ set src in usr
+
+ if(usr.is_mob_incapacitated())
+ return
+ print_report(usr)
+
+/obj/item/device/healthanalyzer/soul/proc/print_report(mob/living/user)
+ if(!last_scan)
+ to_chat(user, "There is no scan data to print.")
+ return
+ var/obj/item/paper/print_report = new /obj/item/paper
+ print_report.info += "Device ID:" + serial_number + "\n" + jointext(buffer_for_report,"
")
+ //print_report.info_links += jointext(buffer_for_report,"
")
+ //print_report.updateinfolinks()
+ print_report.update_icon()
+ user.put_in_hands(print_report)
+ user.visible_message("\The [src] spits out a piece of paper.")
+
+/obj/item/device/healthanalyzer/soul/proc/perform_scan_and_report()
+ if(ishuman(connected_from))
+ if(!popup_window)
+ last_scan = connected_to.health_scan_table(connected_from, FALSE, TRUE, popup_window, alien)
+ to_chat(connected_from, SPAN_NOTICE(last_scan))
+ else
+ if (!last_health_display)
+ last_health_display = new(connected_to)
+ else
+ last_health_display.target_mob = connected_to
+ SStgui.close_user_uis(connected_from, src)
+ last_scan = last_health_display.ui_data(connected_from, DETAIL_LEVEL_HEALTHANALYSER)
+ last_health_display.look_at(connected_from, DETAIL_LEVEL_HEALTHANALYSER, bypass_checks = FALSE, ignore_delay = FALSE, alien = alien)
+ src.add_fingerprint()
+ if(report_delay_counter >= report_delay_threshold)
+ to_chat(connected_from, SPAN_NOTICE("[connected_from] has analyzed [connected_to]'s vitals.")) //lol
+ if(findtext(last_scan,"
40)
+ buffer_for_report.Cut(1,3) //stop memory leak, maybe
+ report_delay_counter++
+
+/obj/item/device/healthanalyzer/soul/process()
+ //if we're not connected to anything stop doing stuff
+ if(!connected_to)
+ return PROCESS_KILL
+
+ /*if we're not on a human stop doing stuff
+ if(!ishuman(loc))
+ bad_disconnect()
+ return PROCESS_KILL
+
+ //if we're not being held in a hand stop doing stuff
+ var/mob/living/carbon/human/current_human = loc
+ if(!(current_human.l_hand == src || current_human.r_hand == src))
+ bad_disconnect()
+ return PROCESS_KILL
+ */
+ //if we're further than 3 tile away to stop doing stuff
+ if(!(get_dist(src, connected_to) <= 3))
+ disconnect(TRUE)
+ return PROCESS_KILL
+ update_beam(TRUE)
+ perform_scan_and_report()
+ //playsound(src.loc, 'sound/items/healthanalyzer.ogg', 50)
+ //Modify the health analyzers own beeping sounds depending on what is happening
+ var/health_percentage = connected_to.health - connected_to.halloss
+ // if oxyloss is more than half of the remaining damage to instant death, make a different beep
+ var/midpoint = abs(((connected_to.getBruteLoss() + connected_to.getFireLoss() + connected_to.getToxLoss()) + (HEALTH_THRESHOLD_DEAD-100)) / 2)
+ if (connected_to.oxyloss >= midpoint)
+ oxygen_alarm_loop.start()
+ else
+ oxygen_alarm_loop.stop()
+ if(health_percentage >= 40)
+ heart_rate_loop.start_sound = list('sound/items/healthanalyzer_heart_okay.ogg' = 1)
+ heart_rate_loop.mid_sounds = list('sound/items/healthanalyzer_heart_okay.ogg' = 1)
+ heart_rate_loop.mid_length = 0.703 SECONDS
+ if(health_percentage < 40)
+ heart_rate_loop.start_sound = list('sound/items/healthanalyzer_heart_bad.ogg' = 1)
+ heart_rate_loop.mid_sounds = list('sound/items/healthanalyzer_heart_bad.ogg' = 1)
+ heart_rate_loop.mid_length = 0.499 SECONDS
+ if(health_percentage < -20)
+ heart_rate_loop.start_sound = list('sound/items/healthanalyzer_heart_very_bad.ogg' = 1)
+ heart_rate_loop.mid_sounds = list('sound/items/healthanalyzer_heart_very_bad.ogg' = 1)
+ heart_rate_loop.mid_length = 0.550 SECONDS
+ if(health_percentage < -120)
+ heart_rate_loop.start_sound = list('sound/items/healthanalyzer_heart_severe.ogg' = 1)
+ heart_rate_loop.mid_sounds = list('sound/items/healthanalyzer_heart_severe.ogg' = 1)
+ heart_rate_loop.mid_length = 0.374 SECONDS
+ if(connected_to.stat > 1)
+ heart_rate_loop.start_sound = list('sound/items/healthanalyzer_heart_flatline.ogg' = 1)
+ heart_rate_loop.mid_sounds = list('sound/items/healthanalyzer_heart_flatline.ogg' = 1)
+ heart_rate_loop.mid_length = 3.110 SECONDS
+ return
+
+/// proc health_scan was a legacy proc for to_chat messages on health analysers. health_scan_table is retrofitted to have parity with the TGUI scan so it can record info for reports
+/mob/living/proc/health_scan_table(mob/living/carbon/human/user, ignore_delay = FALSE, show_limb_damage = TRUE, show_browser = TRUE, alien = FALSE, do_checks = TRUE) // ahem. FUCK WHOEVER CODED THIS SHIT AS NUMBERS AND NOT DEFINES.
+//fix this later or it might crash, idk
+ /*
+ if(do_checks)
+ if((user.getBrainLoss() >= 60) && prob(50))
+ to_chat(user, SPAN_WARNING("You try to analyze the floor's vitals!"))
+ for(var/mob/O in viewers(src, null))
+ O.show_message(SPAN_WARNING("[user] has analyzed the floor's vitals!"), 1)
+ user.show_message(SPAN_NOTICE("Health Analyzer results for The floor:\n\t Overall Status: Healthy"), 1)
+ user.show_message(SPAN_NOTICE("\t Damage Specifics: [0]-[0]-[0]-[0]"), 1)
+ user.show_message(SPAN_NOTICE("Key: Suffocation/Toxin/Burns/Brute"), 1)
+ user.show_message(SPAN_NOTICE("Body Temperature: ???"), 1)
+ return
+ if(HAS_TRAIT(src, TRAIT_FOREIGN_BIO) && !alien)
+ to_chat(user, SPAN_WARNING("ERROR: Unknown biology detected."))
+ return
+ if(!(ishuman(user) || SSticker?.mode.name == "monkey"))
+ to_chat(usr, SPAN_WARNING("You don't have the dexterity to do this!"))
+ return
+ if(!ignore_delay && !skillcheck(user, SKILL_MEDICAL, SKILL_MEDICAL_MEDIC))
+ to_chat(user, SPAN_WARNING("You start fumbling around with [src]..."))
+ var/fduration = 60
+ if(skillcheck(user, SKILL_MEDICAL, SKILL_MEDICAL_DEFAULT))
+ fduration = 30
+ if(!do_after(user, fduration, INTERRUPT_NO_NEEDHAND, BUSY_ICON_FRIENDLY) || !user.Adjacent(src))
+ return
+ if(isxeno(src))
+ to_chat(user, SPAN_WARNING("[src] can't make sense of this creature."))
+ return
+ // Doesn't work on non-humans
+ if(!istype(src, /mob/living/carbon))
+ user.show_message("\nHealth Analyzer results for ERROR:\n\t Overall Status: ERROR")
+ user.show_message("\tType: [SET_CLASS("Oxygen", INTERFACE_BLUE)]-[SET_CLASS("Toxin", INTERFACE_GREEN)]-[SET_CLASS("Burns", INTERFACE_ORANGE)]-[SET_CLASS("Brute", INTERFACE_RED)]", 1)
+ user.show_message("\tDamage: [SET_CLASS("?", INTERFACE_BLUE)] - [SET_CLASS("?", INTERFACE_GREEN)] - [SET_CLASS("?", INTERFACE_ORANGE)] - [SET_CLASS("?", INTERFACE_RED)]")
+ user.show_message(SPAN_NOTICE("Body Temperature: [src.bodytemperature-T0C]°C ([src.bodytemperature*1.8-459.67]°F)"), 1)
+ user.show_message(SPAN_DANGER("Warning: Blood Level ERROR: --% --cl.Type: ERROR"))
+ user.show_message(SPAN_NOTICE("Subject's pulse: [SET_CLASS("-- bpm", INTERFACE_RED)]"))
+ return
+*/
+ var/dat = ""
+ // Calculate damage amounts
+ var/fake_oxy = max(rand(1,40), src.getOxyLoss(), (300 - (src.getToxLoss() + src.getFireLoss() + src.getBruteLoss())))
+ var/OX = src.getOxyLoss() > 50 ? "[src.getOxyLoss()]" : src.getOxyLoss()
+ var/TX = src.getToxLoss() > 50 ? "[src.getToxLoss()]" : src.getToxLoss()
+ var/BU = src.getFireLoss() > 50 ? "[src.getFireLoss()]" : src.getFireLoss()
+ var/BR = src.getBruteLoss() > 50 ? "[src.getBruteLoss()]" : src.getBruteLoss()
+
+ // Show overall
+ if(src.status_flags & FAKEDEATH)
+ OX = fake_oxy > 50 ? "[fake_oxy]" : fake_oxy
+ dat += "\nHealth Analyzer for [src]:\n\tOverall Status: DEAD"
+ else
+ var/mob/living/carbon/human/snowflake_variable_for_name = src
+ dat += "[snowflake_variable_for_name.get_id_name("Unknown")] [src.stat > 1 ? "DEAD" : "[src.health - src.halloss]% "] at " + worldtime2text("hh:mm:ss") + "/n"
+ //dat += "[SET_CLASS("Oxygen", INTERFACE_BLUE)]-[SET_CLASS("Toxin", INTERFACE_GREEN)]-[SET_CLASS("Burns", INTERFACE_ORANGE)]-[SET_CLASS("Brute", INTERFACE_RED)] | "
+ dat += "[SET_CLASS(OX, INTERFACE_BLUE)] - [SET_CLASS(TX, INTERFACE_GREEN)] - [SET_CLASS(BU, INTERFACE_ORANGE)] - [SET_CLASS(BR, INTERFACE_RED)]\n"
+ //dat += "\tUntreated: {B}=Burns,{T}=Trauma,{F}=Fracture\n"
+
+ // Show specific limb damage
+ if(istype(src, /mob/living/carbon/human) && show_limb_damage)
+ var/mob/living/carbon/human/H = src
+ for(var/obj/limb/org in H.limbs)
+ var/brute_treated = TRUE
+ var/burn_treated = TRUE
+ var/open_incision = org.get_incision_depth() ? " Open surgical incision" : ""
+
+ if((org.brute_dam > 0 && !org.is_bandaged()) || open_incision)
+ brute_treated = FALSE
+ if(org.burn_dam > 0 && !org.is_salved())
+ burn_treated = FALSE
+ if(org.status & LIMB_DESTROYED)
+ dat += "\t\t [capitalize(org.display_name)]: Missing!\n"
+ continue
+
+ var/bleeding_check = FALSE
+ for(var/datum/effects/bleeding/external/E in org.bleeding_effects_list)
+ bleeding_check = TRUE
+ break
+ var/show_limb = (org.burn_dam > 0 || org.brute_dam > 0 || (org.status & LIMB_SPLINTED) || open_incision || bleeding_check)
+ //quick fix for IB showing, fix later!!
+ for(var/datum/effects/bleeding/internal/ib in org.bleeding_effects_list)
+ show_limb = TRUE
+ break
+
+ var/org_name = "[capitalize(org.display_name)]"
+ if(org.status & LIMB_ROBOT)
+ if(org.status & LIMB_UNCALIBRATED_PROSTHETIC)
+ org_name += " (Nonfunctional Cybernetic)]"
+ show_limb = TRUE
+ else
+ org_name += " (Cybernetic)"
+ else if(org.status & LIMB_SYNTHSKIN)
+ org_name += " (Synthskin)"
+
+ var/burn_info = org.burn_dam > 0 ? "" + "[burn_treated ? "" : "{"]" + "[floor(org.burn_dam)]" + "[burn_treated ? "" : "}"]" + "" : "0"
+ //burn_info += "[burn_treated ? "" : "{B}"]"
+ var/brute_info = org.brute_dam > 0 ? "" + "[brute_treated ? "" : "{"]" + "[floor(org.brute_dam)]" + "[brute_treated ? "" : "}"]" + "" : "0"
+ //brute_info += "[brute_treated ? "" : "{T}"]"
+ var/fracture_info = ""
+ if(org.status & LIMB_BROKEN)
+ fracture_info = "{F}"
+ show_limb = 1
+ var/org_bleed = ""
+ if(bleeding_check)
+ org_bleed = SPAN_SCANNERB("(Bleeding)")
+ if(show_limb)
+ dat += "[org_name]: \t [burn_info] - [brute_info] [fracture_info][org_bleed][open_incision]"
+ for(var/datum/effects/bleeding/internal/ib in org.bleeding_effects_list)
+ dat += SPAN_SCANNERB("(Internal Bleeding)")
+ break
+ if(org.status & LIMB_SPLINTED_INDESTRUCTIBLE)
+ dat += "(Nanosplinted)"
+ else if(org.status & LIMB_SPLINTED)
+ dat += "(Splinted)"
+ dat += "\n"
+
+ // Show red messages - broken bokes, etc
+ if (src.getCloneLoss())
+ dat += "\t *Subject appears to have been imperfectly cloned.\n"
+ for(var/datum/disease/D in src.viruses)
+ if(!D.hidden[SCANNER])
+ dat += "\t *Warning: [D.form] Detected\nName: [D.name].\nType: [D.spread].\nStage: [D.stage]/[D.max_stages].\nPossible Cure: [D.cure]\n"
+ if (src.getBrainLoss() >= 100 || !src.has_brain())
+ dat += "\t *Subject has taken extreme amounts of brain damage.\n"
+
+ if(src.has_brain() && src.stat != DEAD && ishuman(src))
+ if(!src.key)
+ dat += SPAN_WARNING("\tNo soul detected.\n") // they ghosted
+ else if(!src.client)
+ dat += SPAN_WARNING("\tSSD detected.\n") // SSD
+
+ if(ishuman(src))
+ var/mob/living/carbon/human/H = src
+
+ if(length(H.embedded_items) > 0)
+ dat += "\t[SPAN_SCANNER("*Embedded object detected. Advanced scanner required for location.")]\n"
+
+
+ var/reagents_in_body[0] // yes i know -spookydonut
+ if(istype(src, /mob/living/carbon))
+ // Show helpful reagents
+ if(src.reagents && (src.reagents.total_volume > 0))
+ var/unknown = 0
+ var/reagentdata[0]
+ for(var/A in src.reagents.reagent_list)
+ var/datum/reagent/R = A
+ reagents_in_body["[R.id]"] = R.volume
+ if(R.flags & REAGENT_SCANNABLE)
+ reagentdata["[R.id]"] = "[R.overdose != 0 && R.volume > R.overdose && !(R.flags & REAGENT_CANNOT_OVERDOSE) ? SPAN_WARNING("OD: ") : ""] [round(R.volume, 1)]u [R.name]"
+ else
+ unknown++
+ if(length(reagentdata))
+ dat += "\n\tBeneficial reagents:\n"
+ for(var/d in reagentdata)
+ dat += "\t\t [reagentdata[d]]\n"
+ if(unknown)
+ dat += "\t Warning: Unknown substance[(unknown>1)?"s":""] detected in subject's blood.\n"
+
+ // Show body temp
+ dat += "\n\tBody Temperature: [src.bodytemperature-T0C]°C ([src.bodytemperature*1.8-459.67]°F)\n"
+
+ if (ishuman(src))
+ var/mob/living/carbon/human/H = src
+ // Show blood level
+ var/blood_volume = BLOOD_VOLUME_NORMAL
+ if(!(H.species && H.species.flags & NO_BLOOD))
+ blood_volume = floor(H.blood_volume)
+
+ var/blood_percent = blood_volume / 560
+ var/blood_type = H.blood_type
+ blood_percent *= 100
+ if(blood_volume <= 500 && blood_volume > 336)
+ dat += "\t Blood Level LOW: [blood_percent]% [blood_volume]cl. [SET_CLASS("Type: [blood_type]", INTERFACE_BLUE)]\n"
+ else if(blood_volume <= 336)
+ dat += "\t Blood Level CRITICAL: [blood_percent]% [blood_volume]cl. [SET_CLASS("Type: [blood_type]", INTERFACE_BLUE)]\n"
+ else
+ dat += "\tBlood Level normal: [blood_percent]% [blood_volume]cl. Type: [blood_type]\n"
+ // Show pulse
+ dat += "\tPulse: [H.get_pulse(GETPULSE_TOOL)] bpm. |
"
+ dat = replacetext(dat, "\n", "
")
+ dat = replacetext(dat, "\t", " ")
+ dat = replacetext(dat, "class='warning'", "class='[INTERFACE_RED]'")
+ dat = replacetext(dat, "class='scanner'", "class='[INTERFACE_RED]'")
+ dat = replacetext(dat, "class='scannerb'", "style='font-weight: bold;' class='[INTERFACE_RED]'")
+ dat = replacetext(dat, "class='scannerburn'", "class='[INTERFACE_ORANGE]'")
+ dat = replacetext(dat, "class='scannerburnb'", "style='font-weight: bold;' class='[INTERFACE_ORANGE]'")
+ return dat
+
+/obj/item/device/healthanalyzer/soul/proc/update_beam(new_beam = TRUE)
+ connected_from = get_atom_on_turf(src)
+ if(current_beam)
+ QDEL_NULL(current_beam)
+ if(connected_from && connected_to && new_beam)
+ current_beam = connected_from.beam(connected_to, "iv_tube")
+
+/obj/item/device/healthanalyzer/soul/attack(mob/living/M, mob/living/user)
+ if(M == user)
+ to_chat(user, SPAN_WARNING("You cannot connect this to yourself!"))
+ return
+
+ if(connected_to == M)
+ disconnect()
+ return
+
+ if(user.action_busy)
+ return
+
+ if(!do_after(user, skillcheck(user, SKILL_SURGERY, SKILL_SURGERY_NOVICE) ? (0.2 SECONDS) * user.get_skill_duration_multiplier(SKILL_SURGERY) : (2 SECONDS), INTERRUPT_ALL, BUSY_ICON_FRIENDLY, M, INTERRUPT_MOVED, BUSY_ICON_MEDICAL))
+ to_chat(user, SPAN_WARNING("You were interrupted before you could finish!"))
+ return
+
+ if(istype(M, /mob/living/carbon/human))
+ connected_to = M
+ connected_from = user
+ connected_to.base_pixel_x = 5
+ START_PROCESSING(SSobj, src)
+ heart_rate_loop.start()
+ report_delay_counter = report_delay_threshold
+ user.visible_message("[user] attaches \the [src] to [connected_to].", \
+ "You attach \the [src] to [connected_to].")
+ icon_state = "Medical_scanner_open"
+ overlays += image(icon, src, "+running")
+ update_beam()
+ perform_scan_and_report()
+
+///Used to standardize effects of a blood bag disconnecting improperly
+/obj/item/device/healthanalyzer/soul/proc/disconnect(bad_disconnect = FALSE)
+ STOP_PROCESSING(SSobj, src)
+ heart_rate_loop.stop()
+ oxygen_alarm_loop.stop()
+ if(!connected_to)
+ return
+ if(bad_disconnect)
+ connected_to.visible_message("[src] breaks free of [connected_to]!", "[src] is pulled out of you!")
+ connected_to.apply_damage(3, BRUTE, pick("r_arm", "l_arm"))
+ if(connected_to.pain.feels_pain)
+ connected_to.emote("pain")
+ else
+ connected_from.visible_message("[connected_from] detaches [src] from [connected_to].", \
+ "You detach [src] from [connected_to].")
+ connected_to.base_pixel_x = 0
+ connected_to = null
+ connected_from = null
+ icon_state = "Medical_scanner"
+ overlays -= image(icon, src, "+running")
+ update_beam(FALSE)
+
+/obj/item/device/healthanalyzer/soul/dropped(mob/user)
+ . = ..()
+ connected_from = src
+ update_beam(TRUE)
+
+/obj/item/device/healthanalyzer/soul/pickup(mob/user)
+ . = ..()
+ connected_from = user
+ addtimer(CALLBACK(src, PROC_REF(update_beam), TRUE), 0)
+
/obj/item/device/healthanalyzer/alien
name = "\improper YMX scanner"
icon = 'icons/obj/items/hunter/pred_gear.dmi'
diff --git a/code/game/objects/items/reagent_containers/glass/bottle.dm b/code/game/objects/items/reagent_containers/glass/bottle.dm
index 99ea9ece4e4..09037bf833a 100644
--- a/code/game/objects/items/reagent_containers/glass/bottle.dm
+++ b/code/game/objects/items/reagent_containers/glass/bottle.dm
@@ -209,6 +209,17 @@
. = ..()
reagents.add_reagent("anti_toxin", 150)
+/obj/item/reagent_container/glass/bottle/water
+ name = "\improper distilled water bottle"
+ desc = "A small glossy bottle of distilled water, not all that different from regular water."
+ icon = 'icons/obj/items/chemistry.dmi'
+ icon_state = "bottle2"
+ amount_per_transfer_from_this = 150
+
+/obj/item/reagent_container/glass/bottle/water/Initialize()
+ . = ..()
+ reagents.add_reagent("water", 150)
+
/obj/item/reagent_container/glass/bottle/mutagen
name = "unstable mutagen bottle"
desc = "A small bottle of unstable mutagen. Randomly changes the DNA structure of whoever comes in contact."
diff --git a/code/game/objects/items/reagent_containers/pill.dm b/code/game/objects/items/reagent_containers/pill.dm
index d82f3bb338c..7002b5a29d1 100644
--- a/code/game/objects/items/reagent_containers/pill.dm
+++ b/code/game/objects/items/reagent_containers/pill.dm
@@ -299,3 +299,14 @@
pill_desc = "A pill containing nitrogen and water. Used to treat Tramadol overdoses."
pill_initial_reagents = list("nitrogen" = 15, "water" = 15)
pill_icon_class = "spac"
+
+/obj/item/reagent_container/pill/carbon
+ pill_desc = "A bulky pill of activated carbon. Commonly thought to be effective in treating posioning, in reality it is inadequate for most cases, especially at this dosage."
+ pill_initial_reagents = list("carbon" = 7.5)
+ pill_icon_class = "alky"
+
+/obj/item/reagent_container/pill/ethylredoxrazine
+ pill_desc = "An ethylredxrazine. Used to treat alcohol poisoning and the related effects of similiar chemical depressants."
+ pill_initial_reagents = list("ethylredoxrazine" = 7.5)
+ pill_icon_class = "alky"
+
diff --git a/code/game/objects/items/reagent_containers/syringes.dm b/code/game/objects/items/reagent_containers/syringes.dm
index 32808dbbfd8..c13ffc27576 100644
--- a/code/game/objects/items/reagent_containers/syringes.dm
+++ b/code/game/objects/items/reagent_containers/syringes.dm
@@ -495,3 +495,13 @@
reagents.add_reagent("anti_toxin", 8)
mode = SYRINGE_INJECT
update_icon()
+
+/obj/item/reagent_container/syringe/leporazine
+ name = "syringe (temperature stablization)"
+ desc = "Contains leporazine - used to stabilize body temperature."
+
+/obj/item/reagent_container/syringe/antitoxin/Initialize()
+ . = ..()
+ reagents.add_reagent("leporazine", 15)
+ mode = SYRINGE_INJECT
+ update_icon()
diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm
index eb560a050e6..b4f79e963e4 100644
--- a/code/game/objects/items/storage/belt.dm
+++ b/code/game/objects/items/storage/belt.dm
@@ -198,7 +198,7 @@
var/mode = 1 //Picking from pill bottle mode
can_hold = list(
- /obj/item/device/healthanalyzer,
+// /obj/item/device/healthanalyzer/soul,
/obj/item/reagent_container/dropper,
/obj/item/reagent_container/glass/beaker,
/obj/item/reagent_container/glass/bottle,
@@ -249,7 +249,7 @@
/obj/item/storage/belt/medical/full/with_defib_and_analyzer/fill_preset_inventory()
. = ..()
new /obj/item/device/defibrillator(src)
- new /obj/item/device/healthanalyzer(src)
+ new /obj/item/device/healthanalyzer/soul(get_turf(src))
/obj/item/storage/belt/medical/full/with_suture_and_graft/fill_preset_inventory()
. = ..()
@@ -378,7 +378,7 @@
new /obj/item/stack/medical/splint(src)
new /obj/item/reagent_container/hypospray/autoinjector/dexalinp(src)
new /obj/item/reagent_container/hypospray/autoinjector/oxycodone(src)
- new /obj/item/device/healthanalyzer(src)
+ new /obj/item/device/healthanalyzer/soul(get_turf(src))
/obj/item/storage/belt/medical/lifesaver/upp
name = "\improper Type 41 pattern lifesaver bag"
@@ -443,7 +443,7 @@
new /obj/item/stack/medical/splint(src)
new /obj/item/reagent_container/hypospray/autoinjector/dexalinp(src)
new /obj/item/reagent_container/hypospray/autoinjector/oxycodone(src)
- new /obj/item/device/healthanalyzer(src)
+ new /obj/item/device/healthanalyzer/soul(get_turf(src))
/obj/item/storage/belt/security
name = "\improper M276 pattern security rig"
diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm
index 45dcdcd7bc5..ca8abaf326a 100644
--- a/code/game/objects/items/storage/firstaid.dm
+++ b/code/game/objects/items/storage/firstaid.dm
@@ -73,7 +73,7 @@
/obj/item/storage/firstaid/fire/fill_preset_inventory()
- new /obj/item/device/healthanalyzer(src)
+ new /obj/item/reagent_container/syringe/leporazine(src)
new /obj/item/stack/medical/ointment(src)
new /obj/item/stack/medical/ointment(src)
new /obj/item/reagent_container/hypospray/autoinjector/kelotane(src)
@@ -89,7 +89,7 @@
desc = "It's an emergency medical kit containing basic medication and equipment. No training required to use. With medical training you can fit this in a backpack."
/obj/item/storage/firstaid/regular/fill_preset_inventory()
- new /obj/item/device/healthanalyzer(src)
+ new /obj/item/reagent_container/glass/bottle/water(src)
new /obj/item/reagent_container/hypospray/autoinjector/skillless(src)
new /obj/item/reagent_container/hypospray/autoinjector/skillless/tramadol(src)
new /obj/item/reagent_container/hypospray/autoinjector/inaprovaline(src)
@@ -105,11 +105,13 @@
required_skill_for_nest_opening = SKILL_MEDICAL
required_skill_level_for_nest_opening = SKILL_MEDICAL_DEFAULT
+
/obj/item/storage/firstaid/robust
icon_state = "firstaid"
+ max_w_class = SIZE_MEDIUM
/obj/item/storage/firstaid/robust/fill_preset_inventory()
- new /obj/item/device/healthanalyzer(src)
+ new /obj/item/device/healthanalyzer/soul(src)
new /obj/item/storage/pill_bottle/bicaridine(src)
new /obj/item/storage/pill_bottle/kelotane(src)
new /obj/item/storage/pill_bottle/tramadol(src)
@@ -128,11 +130,13 @@
possible_icons_full = list("antitoxin","antitoxfirstaid","antitoxfirstaid2","antitoxfirstaid3")
/obj/item/storage/firstaid/toxin/fill_preset_inventory()
- new /obj/item/device/healthanalyzer(src)
- new /obj/item/storage/pill_bottle/antitox(src)
+ new /obj/item/reagent_container/pill/nitrogenwater(src)
+ new /obj/item/reagent_container/pill/carbon(src)
new /obj/item/reagent_container/pill/antitox(src)
new /obj/item/reagent_container/pill/antitox(src)
new /obj/item/reagent_container/pill/antitox(src)
+ new /obj/item/reagent_container/glass/bottle/water(src)
+ new /obj/item/reagent_container/pill/ethylredoxrazine(src)
/obj/item/storage/firstaid/toxin/empty/fill_preset_inventory()
return
@@ -144,7 +148,7 @@
item_state = "firstaid-o2"
/obj/item/storage/firstaid/o2/fill_preset_inventory()
- new /obj/item/device/healthanalyzer(src)
+ new /obj/item/reagent_container/pill/peridaxon(src)
new /obj/item/reagent_container/pill/dexalin(src)
new /obj/item/reagent_container/pill/dexalin(src)
new /obj/item/reagent_container/hypospray/autoinjector/dexalinp(src)
diff --git a/code/game/objects/items/storage/pouch.dm b/code/game/objects/items/storage/pouch.dm
index 60962f4f52b..0ab7a3c7f65 100644
--- a/code/game/objects/items/storage/pouch.dm
+++ b/code/game/objects/items/storage/pouch.dm
@@ -649,7 +649,7 @@
)
/obj/item/storage/pouch/medical/full/fill_preset_inventory()
- new /obj/item/device/healthanalyzer(src)
+ new /obj/item/storage/syringe_case/regular(src)
new /obj/item/stack/medical/splint(src)
new /obj/item/stack/medical/advanced/ointment(src)
new /obj/item/stack/medical/advanced/bruise_pack(src)
@@ -744,7 +744,7 @@
)
/obj/item/storage/pouch/first_responder/full/fill_preset_inventory()
- new /obj/item/device/healthanalyzer(src)
+ new /obj/item/storage/syringe_case/oxy(src)
new /obj/item/roller(src)
new /obj/item/tool/extinguisher/mini(src)
new /obj/item/bodybag/cryobag(src)
@@ -866,7 +866,7 @@
can_hold_skill_only = TRUE
/obj/item/storage/pouch/medkit/full/fill_preset_inventory()
- new /obj/item/device/healthanalyzer(src)
+ new /obj/item/storage/syringe_case/regular(src)
new /obj/item/reagent_container/hypospray/autoinjector/skillless(src)
new /obj/item/reagent_container/hypospray/autoinjector/skillless/tramadol(src)
new /obj/item/reagent_container/hypospray/autoinjector/inaprovaline(src)
@@ -884,7 +884,7 @@
new /obj/item/stack/medical/splint(src)
/obj/item/storage/pouch/medkit/full/toxin/fill_preset_inventory()
- new /obj/item/device/healthanalyzer(src)
+ new /obj/item/storage/pill_bottle/spaceacillin(src)
new /obj/item/storage/pill_bottle/antitox(src)
new /obj/item/storage/pill_bottle/antitox(src)
new /obj/item/roller(src)
diff --git a/code/game/objects/structures/crates_lockers/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm
index 24f370a45d1..1a1f9ab540a 100644
--- a/code/game/objects/structures/crates_lockers/largecrate.dm
+++ b/code/game/objects/structures/crates_lockers/largecrate.dm
@@ -225,7 +225,7 @@
/obj/item/storage/pill_bottle/packet/tramadol,
/obj/item/stack/medical/ointment,
/obj/item/stack/medical/splint,
- /obj/item/device/healthanalyzer,
+ /obj/item/device/healthanalyzer/soul,
/obj/item/stack/medical/advanced/ointment,
/obj/item/stack/medical/advanced/bruise_pack,
/obj/item/tool/extinguisher/mini,
@@ -487,8 +487,8 @@ GLOBAL_LIST_INIT(rbarrel_color_list, list(COLOR_SILVER,
. = ..()
new /obj/item/clothing/glasses/hud/health(src)
new /obj/item/clothing/glasses/hud/health(src)
- new /obj/item/device/healthanalyzer(src)
- new /obj/item/device/healthanalyzer(src)
+ new /obj/item/device/healthanalyzer/soul(src)
+ new /obj/item/device/healthanalyzer/soul(src)
new /obj/item/storage/belt/medical/full(src)
new /obj/item/storage/belt/medical/lifesaver/full(src)
new /obj/item/storage/firstaid/regular(src)
diff --git a/code/modules/gear_presets/cbrn.dm b/code/modules/gear_presets/cbrn.dm
index 5f44551e14b..7381fe04d3a 100644
--- a/code/modules/gear_presets/cbrn.dm
+++ b/code/modules/gear_presets/cbrn.dm
@@ -136,7 +136,7 @@
new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/rad(new_human), WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/o2(new_human), WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/toxin(new_human), WEAR_IN_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/toxin(new_human), WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/device/healthanalyzer/soul(new_human), WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/roller(new_human), WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/device/defibrillator/upgraded(new_human), WEAR_IN_BACK)
@@ -146,7 +146,7 @@
new_human.equip_to_slot_or_del(new /obj/item/storage/box/MRE(new_human), WEAR_IN_JACKET)
new_human.equip_to_slot_or_del(new /obj/item/storage/box/MRE(new_human), WEAR_IN_JACKET)
- new_human.equip_to_slot_or_del(new /obj/item/device/healthanalyzer(new_human), WEAR_IN_ACCESSORY)
+ new_human.equip_to_slot_or_del(new /obj/item/reagent_container/hypospray/autoinjector/adrenaline_concentrated(new_human), WEAR_IN_ACCESSORY)
new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/high_explosive(new_human), WEAR_IN_ACCESSORY)
new_human.equip_to_slot_or_del(new /obj/item/explosive/grenade/incendiary(new_human), WEAR_IN_ACCESSORY)
new_human.equip_to_slot_or_del(new /obj/item/tool/surgery/surgical_line(new_human), WEAR_IN_ACCESSORY)
diff --git a/code/modules/gear_presets/clf.dm b/code/modules/gear_presets/clf.dm
index 22d3dd6af5f..275fd7f2b85 100644
--- a/code/modules/gear_presets/clf.dm
+++ b/code/modules/gear_presets/clf.dm
@@ -396,7 +396,7 @@
list("Pill Bottle (Tramadol)", 5, /obj/item/storage/pill_bottle/tramadol, null, VENDOR_ITEM_RECOMMENDED),
list("MEDICAL UTILITIES", 0, null, null, null),
- list("Health Analyzer", 4, /obj/item/device/healthanalyzer, null, VENDOR_ITEM_REGULAR),
+ list("Health Analyzer", 4, /obj/item/device/healthanalyzer/soul, null, VENDOR_ITEM_REGULAR),
list("Medical HUD Glasses", 4, /obj/item/clothing/glasses/hud/health, null, VENDOR_ITEM_REGULAR),
list("Roller Bed", 4, /obj/item/roller, null, VENDOR_ITEM_REGULAR),
list("Stasis Bag", 6, /obj/item/bodybag/cryobag, null, VENDOR_ITEM_REGULAR),
@@ -658,7 +658,7 @@
list("Injector (Tramadol)", 1, /obj/item/reagent_container/hypospray/autoinjector/tramadol, null, VENDOR_ITEM_REGULAR),
list("Injector (Tricord)", 1, /obj/item/reagent_container/hypospray/autoinjector/tricord, null, VENDOR_ITEM_REGULAR),
- list("Health Analyzer", 4, /obj/item/device/healthanalyzer, null, VENDOR_ITEM_REGULAR),
+ list("Health Analyzer", 4, /obj/item/device/healthanalyzer/soul, null, VENDOR_ITEM_REGULAR),
list("Medical Helmet Optic", 4, /obj/item/device/helmet_visor/medical, null, VENDOR_ITEM_MANDATORY),
list("SPECIAL AMMUNITION", 0, null, null, null),
@@ -751,7 +751,7 @@
new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/militia, WEAR_JACKET)
//waist
new_human.equip_to_slot_or_del(new /obj/item/storage/belt/medical/full/with_suture_and_graft, WEAR_WAIST)
- new_human.equip_to_slot_or_del(new /obj/item/device/healthanalyzer(new_human), WEAR_IN_BELT)
+ new_human.equip_to_slot_if_possible(new /obj/item/device/healthanalyzer/soul(new_human), WEAR_R_HAND)
//limbs
new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat, WEAR_HANDS)
new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat, WEAR_FEET)
@@ -861,7 +861,7 @@
list("Injector (Tricord)", 1, /obj/item/reagent_container/hypospray/autoinjector/tricord, null, VENDOR_ITEM_REGULAR),
list("Emergency Defibrillator", 4, /obj/item/device/defibrillator, null, VENDOR_ITEM_MANDATORY),
- list("Health Analyzer", 4, /obj/item/device/healthanalyzer, null, VENDOR_ITEM_REGULAR),
+ list("Health Analyzer", 4, /obj/item/device/healthanalyzer/soul, null, VENDOR_ITEM_REGULAR),
list("Surgical Line", 4, /obj/item/tool/surgery/surgical_line, null, VENDOR_ITEM_REGULAR),
list("Synth-Graft", 4, /obj/item/tool/surgery/synthgraft, null, VENDOR_ITEM_REGULAR),
@@ -916,7 +916,7 @@
new_human.equip_to_slot_or_del(new /obj/item/weapon/gun/rifle/mar40/carbine, WEAR_J_STORE)
//waist
new_human.equip_to_slot_or_del(new /obj/item/storage/belt/medical/full/with_suture_and_graft, WEAR_WAIST)
- new_human.equip_to_slot_or_del(new /obj/item/device/healthanalyzer(new_human), WEAR_IN_BELT)
+ new_human.equip_to_slot_if_possible(new /obj/item/device/healthanalyzer(new_human), WEAR_L_HAND)
//limbs
new_human.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat, WEAR_HANDS)
new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat, WEAR_FEET)
diff --git a/code/modules/gear_presets/pmc.dm b/code/modules/gear_presets/pmc.dm
index 1a7a2cf54d0..39467d6dec4 100644
--- a/code/modules/gear_presets/pmc.dm
+++ b/code/modules/gear_presets/pmc.dm
@@ -543,7 +543,7 @@ list("POUCHES (CHOOSE 2)", 0, null, null, null),
new_human.equip_to_slot_or_del(new /obj/item/tool/surgery/synthgraft, WEAR_IN_L_STORE)
new_human.equip_to_slot_or_del(new /obj/item/reagent_container/syringe/counteragent, WEAR_IN_L_STORE)
new_human.equip_to_slot_or_del(new /obj/item/reagent_container/hypospray/sedative, WEAR_IN_L_STORE)
- new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/m39/ap, WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/device/healthanalyzer/soul, WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/m39/ap, WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/m39/ap, WEAR_IN_JACKET)
new_human.equip_to_slot_or_del(new /obj/item/ammo_magazine/smg/m39/ap, WEAR_IN_JACKET)
diff --git a/code/modules/gear_presets/survivors/lv_522/forcon_survivors.dm b/code/modules/gear_presets/survivors/lv_522/forcon_survivors.dm
index 2a7c328106e..7eb88f405a8 100644
--- a/code/modules/gear_presets/survivors/lv_522/forcon_survivors.dm
+++ b/code/modules/gear_presets/survivors/lv_522/forcon_survivors.dm
@@ -132,11 +132,11 @@
new_human.equip_to_slot_or_del(new /obj/item/tool/extinguisher/mini(new_human), WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/device/defibrillator(new_human), WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/adv(new_human), WEAR_IN_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/device/healthanalyzer(new_human), WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/device/healthanalyzer/soul(new_human), WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/tool/surgery/surgical_line(new_human), WEAR_IN_JACKET)
add_forecon_weapon(new_human)
spawn_random_headgear(new_human)
add_forecon_equipment(new_human)
-
///*****************************//
/datum/equipment_preset/survivor/forecon/marksman
diff --git a/code/modules/gear_presets/synths.dm b/code/modules/gear_presets/synths.dm
index 5ed2902743f..ee8d6f71e5e 100644
--- a/code/modules/gear_presets/synths.dm
+++ b/code/modules/gear_presets/synths.dm
@@ -204,7 +204,7 @@
WEAR_BACK = /obj/item/storage/backpack/satchel/med,
WEAR_IN_BACK = /obj/item/roller/surgical,
WEAR_JACKET = /obj/item/clothing/suit/storage/hazardvest/blue,
- WEAR_IN_JACKET = /obj/item/device/healthanalyzer,
+ WEAR_R_HAND = /obj/item/device/healthanalyzer/soul,
WEAR_WAIST = /obj/item/storage/belt/medical/lifesaver/full,
WEAR_HANDS = /obj/item/clothing/gloves/latex,
WEAR_R_STORE = /obj/item/storage/pouch/tools/full,
@@ -228,12 +228,13 @@
WEAR_IN_BACK = /obj/item/tool/extinguisher/mini,
WEAR_IN_BACK = /obj/item/roller,
WEAR_JACKET = /obj/item/clothing/suit/storage/windbreaker/windbreaker_fr,
- WEAR_IN_JACKET = /obj/item/device/healthanalyzer,
+ WEAR_IN_JACKET = /obj/item/reagent_container/hypospray/autoinjector/adrenaline,
WEAR_WAIST = /obj/item/storage/belt/medical/full,
WEAR_HANDS = /obj/item/clothing/gloves/latex,
WEAR_R_STORE = /obj/item/storage/pouch/tools/full,
WEAR_FEET = /obj/item/clothing/shoes/marine/knife,
- WEAR_L_HAND = /obj/item/weapon/twohanded/fireaxe
+ WEAR_L_HAND = /obj/item/weapon/twohanded/fireaxe,
+ WEAR_R_HAND = /obj/item/device/healthanalyzer/soul,
)
survivor_variant = MEDICAL_SURVIVOR
@@ -249,6 +250,7 @@
WEAR_IN_BACK = /obj/item/reagent_container/glass/beaker/vial/random/good,
WEAR_IN_BACK = /obj/item/paper/research_notes/good,
WEAR_JACKET = /obj/item/clothing/suit/bio_suit,
+ WEAR_IN_JACKET = /obj/item/evidencebag,
WEAR_WAIST = /obj/item/storage/belt/medical/lifesaver/full,
WEAR_HANDS = /obj/item/clothing/gloves/black,
WEAR_R_HAND = /obj/item/device/motiondetector,
@@ -347,7 +349,7 @@
WEAR_IN_BACK = /obj/item/reagent_container/food/snacks/wy_chips/pepper,
WEAR_IN_BACK = /obj/item/storage/box/pdt_kit,
WEAR_JACKET = /obj/item/clothing/suit/storage/bomber/alt,
- WEAR_IN_JACKET = /obj/item/device/healthanalyzer,
+ WEAR_IN_JACKET = /obj/item/notepad,
WEAR_WAIST = /obj/item/reagent_container/spray/cleaner,
WEAR_R_HAND = /obj/item/storage/fancy/crayons,
WEAR_FEET = /obj/item/clothing/shoes/marine/knife,
diff --git a/code/modules/gear_presets/upp.dm b/code/modules/gear_presets/upp.dm
index 9641f6dfcad..6096421a07d 100644
--- a/code/modules/gear_presets/upp.dm
+++ b/code/modules/gear_presets/upp.dm
@@ -209,6 +209,7 @@
new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/lightpack/upp, WEAR_BACK)
new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/adv, WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/adv, WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/device/healthanalyzer/soul, WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/roller, WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/snacks/upp, WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/snacks/upp, WEAR_IN_BACK)
@@ -239,7 +240,7 @@
new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/medical, WEAR_L_STORE)
new_human.equip_to_slot_or_del(new /obj/item/tool/surgery/surgical_line, WEAR_IN_L_STORE)
new_human.equip_to_slot_or_del(new /obj/item/tool/surgery/synthgraft, WEAR_IN_L_STORE)
- new_human.equip_to_slot_or_del(new /obj/item/device/healthanalyzer, WEAR_IN_L_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/reagent_container/hypospray/autoinjector/adrenaline_concentrated, WEAR_IN_L_STORE)
new_human.equip_to_slot_or_del(new /obj/item/reagent_container/hypospray/tricordrazine, WEAR_IN_L_STORE)
if(SSmapping.configs[GROUND_MAP].environment_traits[MAP_COLD])
@@ -729,6 +730,7 @@
//back
new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/lightpack/upp, WEAR_BACK)
new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/adv, WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/device/healthanalyzer/soul, WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/roller/surgical, WEAR_IN_BACK)
//face
new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/UPP/medic, WEAR_L_EAR)
@@ -753,7 +755,7 @@
new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/snacks/upp, WEAR_IN_R_STORE)
new_human.equip_to_slot_or_del(new /obj/item/storage/pouch/medical, WEAR_L_STORE)
new_human.equip_to_slot_or_del(new /obj/item/tool/surgery/synthgraft, WEAR_IN_L_STORE)
- new_human.equip_to_slot_or_del(new /obj/item/device/healthanalyzer, WEAR_IN_L_STORE)
+ new_human.equip_to_slot_or_del(new /obj/item/reagent_container/hypospray/autoinjector/adrenaline_concentrated, WEAR_IN_L_STORE)
new_human.equip_to_slot_or_del(new /obj/item/reagent_container/hypospray/autoinjector/oxycodone, WEAR_IN_L_STORE)
new_human.equip_to_slot_or_del(new /obj/item/reagent_container/hypospray/tricordrazine, WEAR_IN_L_STORE)
diff --git a/code/modules/gear_presets/usasf.dm b/code/modules/gear_presets/usasf.dm
index 643779ef92c..cfadf0d5332 100644
--- a/code/modules/gear_presets/usasf.dm
+++ b/code/modules/gear_presets/usasf.dm
@@ -137,7 +137,7 @@
new_human.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health, WEAR_EYES)
new_human.equip_to_slot_or_del(new /obj/item/storage/belt/medical/lifesaver/full, WEAR_WAIST)
new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/adv, WEAR_IN_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/device/healthanalyzer, WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/device/healthanalyzer/soul, WEAR_IN_BACK)
//*****************************************************************************************************/
diff --git a/code/modules/gear_presets/uscm.dm b/code/modules/gear_presets/uscm.dm
index 5d2faecd1ec..0779bba2e92 100644
--- a/code/modules/gear_presets/uscm.dm
+++ b/code/modules/gear_presets/uscm.dm
@@ -556,7 +556,7 @@
new_human.undershirt = "Marine Undershirt"
new_human.underwear = "Marine Boxers"
//back
- new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/satchel/tech(new_human), WEAR_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/marine/medic(new_human), WEAR_BACK)
new_human.equip_to_slot_or_del(new /obj/item/tool/shovel/etool/folded(new_human), WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/storage/box/MRE(new_human), WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/reagent_container/food/drinks/flask/canteen, WEAR_IN_BACK)
@@ -564,6 +564,7 @@
new_human.equip_to_slot_or_del(new /obj/item/tool/surgery/synthgraft(new_human), WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/regular(new_human), WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/adv(new_human), WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/device/healthanalyzer/soul(new_human), WEAR_IN_BACK)
//face
new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/almayer/marine/solardevils/foxtrot(new_human), WEAR_L_EAR)
//head
diff --git a/code/modules/gear_presets/uscm_medical.dm b/code/modules/gear_presets/uscm_medical.dm
index acf2c6a60ba..a4e3f45fe21 100644
--- a/code/modules/gear_presets/uscm_medical.dm
+++ b/code/modules/gear_presets/uscm_medical.dm
@@ -82,7 +82,7 @@
new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(new_human), WEAR_FEET)
new_human.equip_to_slot_or_del(new /obj/item/storage/belt/medical/lifesaver/full, WEAR_WAIST)
new_human.equip_to_slot_or_del(new /obj/item/storage/firstaid/adv, WEAR_IN_BACK)
- new_human.equip_to_slot_or_del(new /obj/item/device/healthanalyzer, WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/device/healthanalyzer/soul, WEAR_R_HAND)
//Surgeon this part of the code is to change the name on your ID
diff --git a/code/modules/gear_presets/wo.dm b/code/modules/gear_presets/wo.dm
index 28ad3fbd8ac..aa66c414cfb 100644
--- a/code/modules/gear_presets/wo.dm
+++ b/code/modules/gear_presets/wo.dm
@@ -421,8 +421,8 @@
new_human.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(new_human), WEAR_J_STORE)
new_human.equip_to_slot_or_del(new /obj/item/storage/belt/medical/lifesaver/full(new_human), WEAR_WAIST)
- new_human.equip_to_slot_or_del(new /obj/item/device/healthanalyzer(new_human.back), WEAR_IN_BELT)
- new_human.equip_to_slot_or_del(new /obj/item/device/defibrillator(new_human.back), WEAR_IN_BACK)
+ new_human.equip_to_slot_or_del(new /obj/item/reagent_container/hypospray/autoinjector/adrenaline_concentrated(new_human.back), WEAR_IN_BELT)
+ new_human.equip_to_slot_or_del(new /obj/item/device/healthanalyzer/soul(new_human.back), WEAR_IN_BACK)
//*****************************************************************************************************/
@@ -461,7 +461,7 @@
new_human.equip_to_slot_or_del(new /obj/item/clothing/head/surgery/green(new_human), WEAR_HEAD)
new_human.equip_to_slot_or_del(new /obj/item/storage/belt/medical/lifesaver/full(new_human), WEAR_WAIST)
- new_human.equip_to_slot_or_del(new /obj/item/device/healthanalyzer(new_human.back), WEAR_IN_BELT)
+ new_human.equip_to_slot_or_del(new /obj/item/device/healthanalyzer/soul(new_human.back), WEAR_IN_BACK)
new_human.equip_to_slot_or_del(new /obj/item/device/defibrillator(new_human.back), WEAR_IN_BACK)
//*****************************************************************************************************/
diff --git a/code/modules/vehicles/interior/interactable/vendors.dm b/code/modules/vehicles/interior/interactable/vendors.dm
index 6bd4f6dfcde..fe41ec36d75 100644
--- a/code/modules/vehicles/interior/interactable/vendors.dm
+++ b/code/modules/vehicles/interior/interactable/vendors.dm
@@ -74,7 +74,7 @@
list("MEDICAL UTILITIES", -1, null, null),
list("Surgical Line", floor(scale * 2), /obj/item/tool/surgery/surgical_line, VENDOR_ITEM_REGULAR),
list("Synth-Graft", floor(scale * 2), /obj/item/tool/surgery/synthgraft, VENDOR_ITEM_REGULAR),
- list("Health Analyzer", floor(scale * 4), /obj/item/device/healthanalyzer, VENDOR_ITEM_REGULAR),
+ list("Health Analyzer", floor(scale * 2), /obj/item/device/healthanalyzer/soul, VENDOR_ITEM_REGULAR),
list("Stasis Bag", floor(scale * 6), /obj/item/bodybag/cryobag, VENDOR_ITEM_REGULAR),
list("Syringe", floor(scale * 3), /obj/item/reagent_container/syringe, VENDOR_ITEM_REGULAR)
)
diff --git a/icons/obj/items/Medical scanner new.dmi b/icons/obj/items/Medical scanner new.dmi
new file mode 100644
index 00000000000..e01de334594
Binary files /dev/null and b/icons/obj/items/Medical scanner new.dmi differ
diff --git a/icons/obj/items/Medical scanner.dmi b/icons/obj/items/Medical scanner.dmi
new file mode 100644
index 00000000000..8ed39d5cd0f
Binary files /dev/null and b/icons/obj/items/Medical scanner.dmi differ
diff --git a/sound/items/healthanalyzer_heart_bad.ogg b/sound/items/healthanalyzer_heart_bad.ogg
new file mode 100644
index 00000000000..1e0ccd464f4
Binary files /dev/null and b/sound/items/healthanalyzer_heart_bad.ogg differ
diff --git a/sound/items/healthanalyzer_heart_echo.ogg b/sound/items/healthanalyzer_heart_echo.ogg
new file mode 100644
index 00000000000..9d2097eecb0
Binary files /dev/null and b/sound/items/healthanalyzer_heart_echo.ogg differ
diff --git a/sound/items/healthanalyzer_heart_flatline.ogg b/sound/items/healthanalyzer_heart_flatline.ogg
new file mode 100644
index 00000000000..7876533c7e6
Binary files /dev/null and b/sound/items/healthanalyzer_heart_flatline.ogg differ
diff --git a/sound/items/healthanalyzer_heart_okay.ogg b/sound/items/healthanalyzer_heart_okay.ogg
new file mode 100644
index 00000000000..ed318bbb7ab
Binary files /dev/null and b/sound/items/healthanalyzer_heart_okay.ogg differ
diff --git a/sound/items/healthanalyzer_heart_severe.ogg b/sound/items/healthanalyzer_heart_severe.ogg
new file mode 100644
index 00000000000..a61f8413067
Binary files /dev/null and b/sound/items/healthanalyzer_heart_severe.ogg differ
diff --git a/sound/items/healthanalyzer_heart_very_bad.ogg b/sound/items/healthanalyzer_heart_very_bad.ogg
new file mode 100644
index 00000000000..824b6358c16
Binary files /dev/null and b/sound/items/healthanalyzer_heart_very_bad.ogg differ
diff --git a/sound/items/healthanalyzer_oxygen_alarm.ogg b/sound/items/healthanalyzer_oxygen_alarm.ogg
new file mode 100644
index 00000000000..570cf9e85a4
Binary files /dev/null and b/sound/items/healthanalyzer_oxygen_alarm.ogg differ