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