diff --git a/code/game/objects/items/devices/scanners/health.dm b/code/game/objects/items/devices/scanners/health.dm index 1b132a9dd3..62f2d9b938 100644 --- a/code/game/objects/items/devices/scanners/health.dm +++ b/code/game/objects/items/devices/scanners/health.dm @@ -1,4 +1,3 @@ -<<<<<<< HEAD #define DEFIB_TIME_LIMIT (10 MINUTES) //VOREStation addition- past this many seconds, defib is useless. /obj/item/device/healthanalyzer @@ -231,7 +230,7 @@ dat += "Severe brain damage detected. Subject likely to have a traumatic brain injury.
" else if (M.getBrainLoss() >= 10) dat += "Significant brain damage detected. Subject may have had a concussion.
" - else if (M.getBrainLoss() >= 1 && advscan >= 2 && showadvscan == 1) + else if (M.getBrainLoss() >= 1) dat += "Minor brain damage detected.
" if(ishuman(M)) var/mob/living/carbon/human/H = M @@ -251,6 +250,26 @@ var/fracture_dat = "" // All the fractures var/infection_dat = "" // All the infections var/ib_dat = "" // All the IB + var/int_damage_acc = 0 // For internal organs + for(var/obj/item/organ/internal/i in H.internal_organs) + if(!i || i.robotic >= ORGAN_ROBOT || istype(i, /obj/item/organ/internal/brain)) + continue // not there or robotic or brain which is handled separately + if(i.damage || i.status & ORGAN_DEAD) + int_damage_acc += (i.damage + ((i.status & ORGAN_DEAD) ? 30 : 0)) + if(advscan >= 2 && showadvscan == 1) + if(advscan >= 3) + var/dam_adj + if(i.damage >= i.min_broken_damage || i.status & ORGAN_DEAD) + dam_adj = "Severe" + else if(i.damage >= i.min_bruised_damage) + dam_adj = "Moderate" + else + dam_adj = "Mild" + dat += "[dam_adj] damage detected to subject's [i.name].
" + else + dat += "Damage detected to subject's [i.name].
" + if(int_damage_acc >= 1 && (advscan < 2 || !showadvscan)) + dat += "Damage detected to subject's internal organs.
" for(var/obj/item/organ/external/e in H.organs) if(!e) continue @@ -354,380 +373,3 @@ icon_state = "health3" #undef DEFIB_TIME_LIMIT //VOREStation addition -======= -#define DEFIB_TIME_LIMIT (10 MINUTES) //VOREStation addition- past this many seconds, defib is useless. - -/obj/item/device/healthanalyzer - name = "health analyzer" - desc = "A hand-held body scanner able to distinguish vital signs of the subject." - icon_state = "health" - item_state = "healthanalyzer" - slot_flags = SLOT_BELT - throwforce = 3 - w_class = ITEMSIZE_SMALL - throw_speed = 5 - throw_range = 10 - matter = list(MAT_STEEL = 200) - origin_tech = list(TECH_MAGNET = 1, TECH_BIO = 1) - var/mode = 1; - var/advscan = 0 - var/showadvscan = 1 - var/guide = FALSE - -/obj/item/device/healthanalyzer/New() - if(advscan >= 1) - verbs += /obj/item/device/healthanalyzer/proc/toggle_adv - ..() - -/obj/item/device/healthanalyzer/examine(mob/user) - . = ..() - if(guide) - . += "Guidance is currently enabled." - else - . += "Guidance is currently disabled." - -/obj/item/device/healthanalyzer/do_surgery(mob/living/M, mob/living/user) - if(user.a_intent != I_HELP) //in case it is ever used as a surgery tool - return ..() - scan_mob(M, user) //default surgery behaviour is just to scan as usual - return 1 - -/obj/item/device/healthanalyzer/attack(mob/living/M, mob/living/user) - scan_mob(M, user) - -/obj/item/device/healthanalyzer/proc/scan_mob(mob/living/M, mob/living/user) - var/dat = "" - if ((CLUMSY in user.mutations) && prob(50)) - user.visible_message("\The [user] has analyzed the floor's vitals!", "You try to analyze the floor's vitals!") - dat += "Analyzing Results for the floor:
" - dat += "Overall Status: Healthy
" - dat += "\tDamage Specifics: 0-0-0-0
" - dat += "Key: Suffocation/Toxin/Burns/Brute
" - dat += "Body Temperature: ???" - user.show_message("[dat]", 1) - return - if (!user.IsAdvancedToolUser()) - to_chat(user, "You don't have the dexterity to do this!") - return - - flick("[icon_state]-scan", src) //makes it so that it plays the scan animation on a succesful scan - user.visible_message("[user] has analyzed [M]'s vitals.","You have analyzed [M]'s vitals.") - - if (!ishuman(M) || M.isSynthetic()) - //these sensors are designed for organic life - dat += "Analyzing Results for ERROR:\n\tOverall Status: ERROR
" - dat += "\tKey: Suffocation/Toxin/Burns/Brute
" - dat += "\tDamage Specifics: ? - ? - ? - ?
" - dat += "Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)

" - dat += "Warning: Blood Level ERROR: --% --cl. Type: ERROR
" - dat += "Subject's pulse: -- bpm." - user.show_message(dat, 1) - return - - var/fake_oxy = max(rand(1,40), M.getOxyLoss(), (300 - (M.getToxLoss() + M.getFireLoss() + M.getBruteLoss()))) - var/OX = M.getOxyLoss() > 50 ? "[M.getOxyLoss()]" : M.getOxyLoss() - var/TX = M.getToxLoss() > 50 ? "[M.getToxLoss()]" : M.getToxLoss() - var/BU = M.getFireLoss() > 50 ? "[M.getFireLoss()]" : M.getFireLoss() - var/BR = M.getBruteLoss() > 50 ? "[M.getBruteLoss()]" : M.getBruteLoss() - if(M.status_flags & FAKEDEATH) - OX = fake_oxy > 50 ? "[fake_oxy]" : fake_oxy - dat += "Analyzing Results for [M]:
" - dat += "Overall Status: dead
" - else - dat += "Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "dead" : "[round((M.health/M.getMaxHealth())*100) ]% healthy"]
" - dat += "\tKey: Suffocation/Toxin/Burns/Brute
" - dat += "\tDamage Specifics: [OX] - [TX] - [BU] - [BR]
" - dat += "Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)

" - //VOREStation edit/addition starts - if(M.timeofdeath && (M.stat == DEAD || (M.status_flags & FAKEDEATH))) - dat += "Time of Death: [worldtime2stationtime(M.timeofdeath)]
" - var/tdelta = round(world.time - M.timeofdeath) - if(tdelta < (DEFIB_TIME_LIMIT * 10)) - dat += "Subject died [DisplayTimeText(tdelta)] ago - resuscitation may be possible!
" - //VOREStation edit/addition ends - if(istype(M, /mob/living/carbon/human) && mode == 1) - var/mob/living/carbon/human/H = M - var/list/damaged = H.get_damaged_organs(1,1) - dat += "Localized Damage, Brute/Burn:
" - if(length(damaged)>0) - for(var/obj/item/organ/external/org in damaged) - if(org.robotic >= ORGAN_ROBOT) - continue - else - dat += " [capitalize(org.name)]: [(org.brute_dam > 0) ? "[org.brute_dam]" : 0]" - dat += "[(org.status & ORGAN_BLEEDING)?"\[Bleeding\]":""] - " - dat += "[(org.burn_dam > 0) ? "[org.burn_dam]" : 0]
" - else - dat += " Limbs are OK.
" - - OX = M.getOxyLoss() > 50 ? "Severe oxygen deprivation detected" : "Subject bloodstream oxygen level normal" - TX = M.getToxLoss() > 50 ? "Dangerous amount of toxins detected" : "Subject bloodstream toxin level minimal" - BU = M.getFireLoss() > 50 ? "Severe burn damage detected" : "Subject burn injury status O.K" - BR = M.getBruteLoss() > 50 ? "Severe anatomical damage detected" : "Subject brute-force injury status O.K" - if(M.status_flags & FAKEDEATH) - OX = fake_oxy > 50 ? "Severe oxygen deprivation detected" : "Subject bloodstream oxygen level normal" - dat += "[OX] | [TX] | [BU] | [BR]
" - if(M.radiation) - if(advscan >= 2 && showadvscan == 1) - var/severity = "" - if(M.radiation >= 1500) - severity = "Lethal" - else if(M.radiation >= 600) - severity = "Critical" - else if(M.radiation >= 400) - severity = "Severe" - else if(M.radiation >= 300) - severity = "Moderate" - else if(M.radiation >= 100) - severity = "Low" - dat += "[severity] levels of acute radiation sickness detected. [round(M.radiation/50)]Gy. [(severity == "Critical" || severity == "Lethal") ? " Immediate treatment advised." : ""]
" - else - dat += "Acute radiation sickness detected.
" - if(M.accumulated_rads) - if(advscan >= 2 && showadvscan == 1) - var/severity = "" - if(M.accumulated_rads >= 1500) - severity = "Critical" - else if(M.accumulated_rads >= 600) - severity = "Severe" - else if(M.accumulated_rads >= 400) - severity = "Moderate" - else if(M.accumulated_rads >= 300) - severity = "Mild" - else if(M.accumulated_rads >= 100) - severity = "Low" - dat += "[severity] levels of chronic radiation sickness detected. [round(M.accumulated_rads/50)]Gy.
" - else - dat += "Chronic radiation sickness detected.
" - if(iscarbon(M)) - var/mob/living/carbon/C = M - if(C.reagents.total_volume) - var/unknown = 0 - var/reagentdata[0] - var/unknownreagents[0] - for(var/datum/reagent/R as anything in C.reagents.reagent_list) - if(R.scannable) - reagentdata["[R.id]"] = "\t[round(C.reagents.get_reagent_amount(R.id), 1)]u [R.name][(R.overdose && R.volume > R.overdose) ? " - Overdose" : ""]
" - else - unknown++ - unknownreagents["[R.id]"] = "\t[round(C.reagents.get_reagent_amount(R.id), 1)]u [R.name][(R.overdose && R.volume > R.overdose) ? " - Overdose" : ""]
" - if(reagentdata.len) - dat += "Beneficial reagents detected in subject's blood:
" - for(var/d in reagentdata) - dat += reagentdata[d] - if(unknown) - if(advscan >= 3 && showadvscan == 1) - dat += "Warning: Non-medical reagent[(unknown>1)?"s":""] detected in subject's blood:
" - for(var/d in unknownreagents) - dat += unknownreagents[d] - else - dat += "Warning: Unknown substance[(unknown>1)?"s":""] detected in subject's blood.
" - if(C.ingested && C.ingested.total_volume) - var/unknown = 0 - var/stomachreagentdata[0] - var/stomachunknownreagents[0] - for(var/datum/reagent/R as anything in C.ingested.reagent_list) - if(R.scannable) - stomachreagentdata["[R.id]"] = "\t[round(C.ingested.get_reagent_amount(R.id), 1)]u [R.name][(R.overdose && R.volume > R.overdose) ? " - Overdose" : ""]
" - if (advscan == 0 || showadvscan == 0) - dat += "[R.name] found in subject's stomach.
" - else - ++unknown - stomachunknownreagents["[R.id]"] = "\t[round(C.ingested.get_reagent_amount(R.id), 1)]u [R.name][(R.overdose && R.volume > R.overdose) ? " - Overdose" : ""]
" - if(advscan >= 1 && showadvscan == 1) - dat += "Beneficial reagents detected in subject's stomach:
" - for(var/d in stomachreagentdata) - dat += stomachreagentdata[d] - if(unknown) - if(advscan >= 3 && showadvscan == 1) - dat += "Warning: Non-medical reagent[(unknown > 1)?"s":""] found in subject's stomach:
" - for(var/d in stomachunknownreagents) - dat += stomachunknownreagents[d] - else - dat += "Unknown substance[(unknown > 1)?"s":""] found in subject's stomach.
" - if(C.touching && C.touching.total_volume) - var/unknown = 0 - var/touchreagentdata[0] - var/touchunknownreagents[0] - for(var/datum/reagent/R as anything in C.touching.reagent_list) - if(R.scannable) - touchreagentdata["[R.id]"] = "\t[round(C.touching.get_reagent_amount(R.id), 1)]u [R.name][(R.overdose && R.can_overdose_touch && R.volume > R.overdose) ? " - Overdose" : ""]
" - if (advscan == 0 || showadvscan == 0) - dat += "[R.name] found in subject's dermis.
" - else - ++unknown - touchunknownreagents["[R.id]"] = "\t[round(C.ingested.get_reagent_amount(R.id), 1)]u [R.name][(R.overdose && R.can_overdose_touch && R.volume > R.overdose) ? " - Overdose" : ""]
" - if(advscan >= 1 && showadvscan == 1) - dat += "Beneficial reagents detected in subject's dermis:
" - for(var/d in touchreagentdata) - dat += touchreagentdata[d] - if(unknown) - if(advscan >= 3 && showadvscan == 1) - dat += "Warning: Non-medical reagent[(unknown > 1)?"s":""] found in subject's dermis:
" - for(var/d in touchunknownreagents) - dat += touchunknownreagents[d] - else - dat += "Unknown substance[(unknown > 1)?"s":""] found in subject's dermis.
" - if(C.virus2.len) - for (var/ID in C.virus2) - if (ID in virusDB) - var/datum/data/record/V = virusDB[ID] - dat += "Warning: Pathogen [V.fields["name"]] detected in subject's blood. Known antigen : [V.fields["antigen"]]
" - else - dat += "Warning: Unknown pathogen detected in subject's blood.
" - if (M.getCloneLoss()) - dat += "Subject appears to have been imperfectly cloned.
" -// if (M.reagents && M.reagents.get_reagent_amount("inaprovaline")) -// user.show_message("Bloodstream Analysis located [M.reagents:get_reagent_amount("inaprovaline")] units of rejuvenation chemicals.") - if (M.has_brain_worms()) - dat += "Subject suffering from aberrant brain activity. Recommend further scanning.
" - else if (M.getBrainLoss() >= 60 || !M.has_brain()) - dat += "Subject is brain dead.
" - else if (M.getBrainLoss() >= 25) - dat += "Severe brain damage detected. Subject likely to have a traumatic brain injury.
" - else if (M.getBrainLoss() >= 10) - dat += "Significant brain damage detected. Subject may have had a concussion.
" - else if (M.getBrainLoss() >= 1) - dat += "Minor brain damage detected.
" - if(ishuman(M)) - var/mob/living/carbon/human/H = M - for(var/obj/item/organ/internal/appendix/a in H.internal_organs) - var/severity = "" - if(a.inflamed > 3) - severity = "Severe" - else if(a.inflamed > 2) - severity = "Moderate" - else if(a.inflamed >= 1) - severity = "Mild" - if(severity) - dat += "[severity] inflammation detected in subject [a.name].
" - // Infections, fractures, and IB - var/basic_fracture = 0 // If it's a basic scanner - var/basic_ib = 0 // If it's a basic scanner - var/fracture_dat = "" // All the fractures - var/infection_dat = "" // All the infections - var/ib_dat = "" // All the IB - var/int_damage_acc = 0 // For internal organs - for(var/obj/item/organ/internal/i in H.internal_organs) - if(!i || i.robotic >= ORGAN_ROBOT || istype(i, /obj/item/organ/internal/brain)) - continue // not there or robotic or brain which is handled separately - if(i.damage || i.status & ORGAN_DEAD) - int_damage_acc += (i.damage + ((i.status & ORGAN_DEAD) ? 30 : 0)) - if(advscan >= 2 && showadvscan == 1) - if(advscan >= 3) - var/dam_adj - if(i.damage >= i.min_broken_damage || i.status & ORGAN_DEAD) - dam_adj = "Severe" - else if(i.damage >= i.min_bruised_damage) - dam_adj = "Moderate" - else - dam_adj = "Mild" - dat += "[dam_adj] damage detected to subject's [i.name].
" - else - dat += "Damage detected to subject's [i.name].
" - if(int_damage_acc >= 1 && (advscan < 2 || !showadvscan)) - dat += "Damage detected to subject's internal organs.
" - for(var/obj/item/organ/external/e in H.organs) - if(!e) - continue - // Broken limbs - if(e.status & ORGAN_BROKEN) - if((e.name in list(BP_L_ARM, BP_R_ARM, BP_L_LEG, BP_R_LEG, BP_HEAD, BP_TORSO, BP_GROIN)) && (!e.splinted)) - fracture_dat += "Unsecured fracture in subject [e.name]. Splinting recommended for transport.
" - else if(advscan >= 1 && showadvscan == 1) - fracture_dat += "Bone fractures detected in subject [e.name].
" - else - basic_fracture = 1 - // Infections - if(e.has_infected_wound()) - dat += "Infected wound detected in subject [e.name]. Disinfection recommended.
" - // IB - for(var/datum/wound/W in e.wounds) - if(W.internal) - if(advscan >= 1 && showadvscan == 1) - ib_dat += "Internal bleeding detected in subject [e.name].
" - else - basic_ib = 1 - if(basic_fracture) - fracture_dat += "Bone fractures detected. Advanced scanner required for location.
" - if(basic_ib) - ib_dat += "Internal bleeding detected. Advanced scanner required for location.
" - dat += fracture_dat - dat += infection_dat - dat += ib_dat - - // Blood level - if(M:vessel) - var/blood_volume = H.vessel.get_reagent_amount("blood") - var/blood_percent = round((blood_volume / H.species.blood_volume)*100) - var/blood_type = H.dna.b_type - if(blood_volume <= H.species.blood_volume*H.species.blood_level_danger) - dat += "Warning: Blood Level CRITICAL: [blood_percent]% [blood_volume]cl. Type: [blood_type]
" - else if(blood_volume <= H.species.blood_volume*H.species.blood_level_warning) - dat += "Warning: Blood Level VERY LOW: [blood_percent]% [blood_volume]cl. Type: [blood_type]
" - else if(blood_volume <= H.species.blood_volume*H.species.blood_level_safe) - dat += "Warning: Blood Level LOW: [blood_percent]% [blood_volume]cl. Type: [blood_type]
" - else - dat += "Blood Level Normal: [blood_percent]% [blood_volume]cl. Type: [blood_type]
" - dat += "Subject's pulse: [H.get_pulse(GETPULSE_TOOL)] bpm.
" // VORE Edit: Missed a linebreak here. - if(istype(H.species, /datum/species/xenochimera)) // VOREStation Edit Start: Visible feedback for medmains on Xenochimera. - if(H.stat == DEAD && H.revive_ready == REVIVING_READY && !H.hasnutriment()) - dat += "WARNING: Protein levels low. Subject incapable of reconstitution." - else if(H.revive_ready == REVIVING_NOW) - dat += "Subject is undergoing form reconstruction. Estimated time to finish is in: [round((H.revive_finished - world.time) / 10)] seconds." - else if(H.revive_ready == REVIVING_DONE) - dat += "Subject is ready to hatch. Transfer to dark room for holding with food available." - else if(H.stat == DEAD) - dat+= "WARNING: Defib will cause extreme pain and set subject feral. Sedation recommended prior to defibrillation." - else // If they bop them and they're not dead or reviving, give 'em a little notice. - dat += "Subject is a Xenochimera. Treat accordingly." - // VOREStation Edit End - user.show_message(dat, 1) - if(guide) - guide(M, user) - -/obj/item/device/healthanalyzer/verb/toggle_mode() - set name = "Switch Verbosity" - set category = "Object" - - mode = !mode - switch (mode) - if(1) - to_chat(usr, "The scanner now shows specific limb damage.") - if(0) - to_chat(usr, "The scanner no longer shows limb damage.") - -/obj/item/device/healthanalyzer/proc/toggle_adv() - set name = "Toggle Advanced Scan" - set category = "Object" - - showadvscan = !showadvscan - switch (showadvscan) - if(1) - to_chat(usr, "The scanner will now perform an advanced analysis.") - if(0) - to_chat(usr, "The scanner will now perform a basic analysis.") - -/obj/item/device/healthanalyzer/improved //reports bone fractures, IB, quantity of beneficial reagents in stomach; also regular health analyzer stuff - name = "improved health analyzer" - desc = "A miracle of medical technology, this handheld scanner can produce an accurate and specific report of a patient's biosigns." - advscan = 1 - origin_tech = list(TECH_MAGNET = 5, TECH_BIO = 6) - icon_state = "health1" - -/obj/item/device/healthanalyzer/advanced //reports all of the above, as well as radiation severity and minor brain damage - name = "advanced health analyzer" - desc = "An even more advanced handheld health scanner, complete with a full biosign monitor and on-board radiation and neurological analysis suites." - advscan = 2 - origin_tech = list(TECH_MAGNET = 6, TECH_BIO = 7) - icon_state = "health2" - -/obj/item/device/healthanalyzer/phasic //reports all of the above, as well as name and quantity of nonmed reagents in stomach - name = "phasic health analyzer" - desc = "Possibly the most advanced health analyzer to ever have existed, utilising bluespace technology to determine almost everything worth knowing about a patient." - advscan = 3 - origin_tech = list(TECH_MAGNET = 7, TECH_BIO = 8) - icon_state = "health3" - -#undef DEFIB_TIME_LIMIT //VOREStation addition ->>>>>>> 754936afd8... Merge pull request #15111 from Heroman3003/healthanal