From ea1101ec5c4d2bc54366faaa93cbd08d82dbd548 Mon Sep 17 00:00:00 2001 From: "Wowzewow (Wezzy)" <42310821+alsoandanswer@users.noreply.github.com> Date: Sun, 8 Oct 2023 05:36:13 +0800 Subject: [PATCH] Better Bodyscanners and Surgery Stuff (#17520) * Better Bodyscanners and Surgery Stuff * ope * i can't believe that worked * adv * bodyscanner fixes --- code/game/machinery/OpTable.dm | 76 ++- code/game/machinery/Sleeper.dm | 2 +- code/game/machinery/body_scanner.dm | 432 ++++++++++-------- code/game/machinery/computer/Operating.dm | 424 ++++------------- code/game/machinery/computer/sentencing.dm | 4 +- code/game/machinery/machinery.dm | 11 +- code/game/machinery/requests_console.dm | 2 +- code/game/objects/items/devices/scanners.dm | 209 +++++---- code/game/sound.dm | 6 + .../detectivework/microscope/dnascanner.dm | 2 +- .../detectivework/microscope/microscope.dm | 2 +- code/modules/economy/ATM.dm | 25 +- .../heavy_vehicle/equipment/medical.dm | 8 +- code/modules/mob/living/carbon/carbon.dm | 2 +- .../carbon/human/species/outsider/revenant.dm | 2 +- .../carbon/human/species/outsider/undead.dm | 2 +- .../living/carbon/human/species/species.dm | 8 +- .../human/species/station/diona/diona.dm | 4 +- .../carbon/human/species/station/golem.dm | 2 +- .../carbon/human/species/station/ipc/ipc.dm | 2 +- .../carbon/human/species/station/monkey.dm | 6 +- .../human/species/station/skrell/skrell.dm | 8 +- .../carbon/human/species/station/slime.dm | 2 +- .../human/species/station/tajara/tajara.dm | 6 +- .../station/tajara/tajaran_subspecies.dm | 6 +- .../human/species/station/unathi/unathi.dm | 16 +- .../human/species/station/vaurca/vaurca.dm | 6 +- .../station/vaurca/vaurca_subspecies.dm | 8 +- code/modules/organs/internal/_internal.dm | 4 +- code/modules/organs/organ_stump.dm | 1 + code/modules/paperwork/photocopier.dm | 2 +- code/modules/paperwork/photography.dm | 2 +- code/modules/research/rdconsole.dm | 2 +- code/modules/research/weaponsanalyzer.dm | 2 +- .../machinery/artifact_analyser.dm | 2 +- html/changelogs/wezzy_bodyscanner-better.yml | 46 ++ icons/mob/items/device/lefthand_device.dmi | Bin 6213 -> 6213 bytes icons/mob/items/device/righthand_device.dmi | Bin 6273 -> 6273 bytes icons/obj/device.dmi | Bin 34275 -> 34275 bytes icons/obj/sleeper.dmi | Bin 55097 -> 45882 bytes icons/obj/surgery.dmi | Bin 14070 -> 14327 bytes maps/sccv_horizon/sccv_horizon-2_deck_2.dmm | 98 +++- tgui/packages/tgui/interfaces/BodyScanner.tsx | 272 ++++++----- tgui/packages/tgui/interfaces/Operating.tsx | 174 +++++++ tgui/packages/tgui/interfaces/Sleeper.tsx | 4 +- 45 files changed, 1015 insertions(+), 877 deletions(-) create mode 100644 html/changelogs/wezzy_bodyscanner-better.yml create mode 100644 tgui/packages/tgui/interfaces/Operating.tsx diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm index 9ebb8cd6a4d..35f70dd8d09 100644 --- a/code/game/machinery/OpTable.dm +++ b/code/game/machinery/OpTable.dm @@ -15,11 +15,29 @@ /obj/item/stock_parts/scanning_module = 1 ) - var/mob/living/carbon/human/victim = null + var/mob/living/carbon/human/occupant = null var/suppressing = FALSE var/obj/machinery/computer/operating/computer = null + var/list/allowed_species = list( + SPECIES_HUMAN, + SPECIES_HUMAN_OFFWORLD, + SPECIES_SKRELL, + SPECIES_SKRELL_AXIORI, + SPECIES_UNATHI, + SPECIES_TAJARA, + SPECIES_TAJARA_MSAI, + SPECIES_TAJARA_ZHAN, + SPECIES_VAURCA_WORKER, + SPECIES_VAURCA_WARRIOR, + SPECIES_VAURCA_BREEDER, + SPECIES_VAURCA_BULWARK, + SPECIES_DIONA, + SPECIES_DIONA_COEUS, + SPECIES_MONKEY + ) + /obj/machinery/optable/Initialize() . = ..() LAZYADD(can_buckle, /mob/living) @@ -55,18 +73,18 @@ qdel(src) return - if(!victim) + if(!occupant) to_chat(user, SPAN_WARNING("There is nobody on \the [src]. It would be pointless to turn the suppressor on.")) return TRUE if((user.a_intent != I_HELP) && buckled) user_unbuckle(user) return - if(user != victim && !use_check_and_message(user)) // Skip checks if you're doing it to yourself or turning it off, this is an anti-griefing mechanic more than anything. + if(user != occupant && !use_check_and_message(user)) // Skip checks if you're doing it to yourself or turning it off, this is an anti-griefing mechanic more than anything. user.visible_message(SPAN_WARNING("\The [user] begins switching [suppressing ? "off" : "on"] \the [src]'s neural suppressor.")) if(!do_after(user, 3 SECONDS, src, DO_UNIQUE)) return - if(!victim) + if(!occupant) to_chat(user, SPAN_WARNING("There is nobody on \the [src]. It would be pointless to turn the suppressor on.")) suppressing = !suppressing @@ -84,32 +102,32 @@ user.drop_from_inventory(O,get_turf(src)) ..() -/obj/machinery/optable/proc/check_victim() - if(!victim || !victim.lying || victim.loc != loc) +/obj/machinery/optable/proc/check_occupant() + if(!occupant || !occupant.lying || occupant.loc != loc) suppressing = FALSE - victim = null + occupant = null var/mob/living/carbon/human/H = locate() in loc if(istype(H)) if(H.lying) icon_state = H.pulse() ? "[modify_state]-active" : "[modify_state]-idle" - victim = H - if(victim && !victim.isSynthetic()) - if(suppressing && victim.sleeping < 7) - victim.Sleeping(7 - victim.sleeping) - victim.willfully_sleeping = FALSE - if(victim.eye_blurry < 7) - victim.eye_blurry = (7 - victim.eye_blurry) - icon_state = victim.pulse() ? "[modify_state]-active" : "[modify_state]-idle" - if(victim.stat == DEAD || victim.is_asystole() || victim.status_flags & FAKEDEATH) + occupant = H + if(occupant && !occupant.isSynthetic()) + if(suppressing && occupant.sleeping < 7) + occupant.Sleeping(7 - occupant.sleeping) + occupant.willfully_sleeping = FALSE + if(occupant.eye_blurry < 7) + occupant.eye_blurry = (7 - occupant.eye_blurry) + icon_state = occupant.pulse() ? "[modify_state]-active" : "[modify_state]-idle" + if(occupant.stat == DEAD || occupant.is_asystole() || occupant.status_flags & FAKEDEATH) icon_state = "[modify_state]-critical" return TRUE icon_state = "[modify_state]-idle" return FALSE /obj/machinery/optable/process() - check_victim() + check_occupant() -/obj/machinery/optable/proc/take_victim(mob/living/carbon/C, mob/living/carbon/user) +/obj/machinery/optable/proc/take_occupant(mob/living/carbon/C, mob/living/carbon/user) if(C == user) user.visible_message("\The [user] climbs on \the [src].", "You climb on \the [src].") else @@ -122,7 +140,7 @@ add_fingerprint(user) if(ishuman(C)) var/mob/living/carbon/human/H = C - victim = H + occupant = H icon_state = H.pulse() ? "[modify_state]-active" : "[modify_state]-idle" if(H.stat == DEAD || H.is_asystole() || H.status_flags & FAKEDEATH) icon_state = "[modify_state]-critical" @@ -147,7 +165,7 @@ if(bucklestatus == 2) var/obj/structure/LB = L.buckled_to LB.user_unbuckle(user) - take_victim(target,user) + take_occupant(target,user) else return ..() @@ -159,12 +177,12 @@ if(usr.stat || !ishuman(usr) || usr.restrained() ) return - take_victim(usr,usr) + take_occupant(usr,usr) /obj/machinery/optable/attackby(obj/item/W, mob/living/carbon/user) if(istype(W, /obj/item/grab)) var/obj/item/grab/G = W - if(victim) + if(occupant) to_chat(usr, SPAN_NOTICE(SPAN_BOLD("\The [src] is already occupied!"))) return TRUE @@ -178,7 +196,7 @@ else user.visible_message(SPAN_NOTICE("\The [user] starts putting \the [L] onto \the [src]."), SPAN_NOTICE("You start putting \the [L] onto \the [src]."), range = 3) if(do_mob(user, L, 10, needhand = FALSE)) - take_victim(G.affecting,usr) + take_occupant(G.affecting,usr) qdel(W) return TRUE if(default_deconstruction_screwdriver(user, W)) @@ -189,11 +207,19 @@ return TRUE /obj/machinery/optable/proc/check_table(mob/living/carbon/patient) - check_victim() - if(victim?.lying && get_turf(victim) == get_turf(src)) + check_occupant() + if(occupant?.lying && get_turf(occupant) == get_turf(src)) to_chat(usr, SPAN_WARNING("\The [src] is already occupied!")) return FALSE if(patient.buckled_to) to_chat(usr, SPAN_NOTICE("Unbuckle \the [patient] first!")) return FALSE return TRUE + +/obj/machinery/optable/proc/check_species() + if (!occupant || !ishuman(occupant)) + return TRUE + var/mob/living/carbon/human/O = occupant + if (!O) + return TRUE + return !(O.get_species() in allowed_species) diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index eec4ebc251d..b8e42dc784c 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -115,7 +115,7 @@ /obj/machinery/sleeper/ui_interact(mob/user, var/datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) - ui = new(user, src, "Sleeper", "Sleeper", 1200, 800) + ui = new(user, src, "Sleeper", "Sleeper", 450, 500) ui.open() /obj/machinery/sleeper/ui_data(mob/user) diff --git a/code/game/machinery/body_scanner.dm b/code/game/machinery/body_scanner.dm index d1f1860a84f..58721e579e1 100644 --- a/code/game/machinery/body_scanner.dm +++ b/code/game/machinery/body_scanner.dm @@ -4,7 +4,7 @@ desc_info = "The advanced scanner detects and reports internal injuries such as bone fractures, internal bleeding, and organ damage. \ This is useful if you are about to perform surgery.
\
\ - Click your target with Grab intent, then click on the scanner to place them in it. Click the red terminal to operate. \ + Click your target with Grab intent, then click on the scanner to place them in it. Click the connected terminal to operate. \ Right-click the scanner and click 'Eject Occupant' to remove them. You can enter the scanner yourself in a similar way, using the 'Enter Body Scanner' \ verb." icon = 'icons/obj/sleeper.dmi' @@ -45,6 +45,11 @@ /obj/machinery/bodyscanner/Initialize() . = ..() + for(var/obj/machinery/body_scanconsole/C in orange(1,src)) + connected = C + break + if(connected) + connected.connected = src update_icon() /obj/machinery/bodyscanner/Destroy() @@ -104,9 +109,6 @@ if (occupant) to_chat(usr, SPAN_WARNING("The scanner is already occupied!")) return - if (usr.abiotic()) - to_chat(usr, SPAN_WARNING("The subject cannot have abiotic items on.")) - return usr.pulling = null usr.client.perspective = EYE_PERSPECTIVE usr.client.eye = src @@ -121,8 +123,8 @@ if(!occupant || locked) return - playsound(loc, 'sound/machines/compbeep2.ogg', 50) - playsound(loc, 'sound/machines/windowdoor.ogg', 50) + playsound(loc, 'sound/machines/compbeep2.ogg', 25) + playsound(loc, 'sound/machines/cryopod/cryopod_exit.ogg', 25) last_occupant_name = occupant.name if (occupant.client) @@ -140,9 +142,6 @@ if (occupant) to_chat(user, SPAN_WARNING("The scanner is already occupied!")) return TRUE - if (G.affecting.abiotic()) - to_chat(user, SPAN_WARNING("Subject cannot have abiotic items on.")) - return TRUE var/mob/living/M = G.affecting var/bucklestatus = M.bucklecheck(user) @@ -174,9 +173,6 @@ if (occupant) to_chat(user, SPAN_NOTICE("The scanner is already occupied!")) return - if (M.abiotic()) - to_chat(user, SPAN_NOTICE("Subject cannot have abiotic items on.")) - return var/mob/living/L = O var/bucklestatus = L.bucklecheck(user) @@ -199,7 +195,8 @@ occupant = M update_use_power(POWER_USE_ACTIVE) update_icon() - playsound(loc, 'sound/machines/medbayscanner1.ogg', 50) + playsound(loc, 'sound/machines/cryopod/cryopod_enter.ogg', 25) + playsound(loc, 'sound/machines/medbayscanner1.ogg', 25) add_fingerprint(user) //G = null return @@ -260,11 +257,16 @@ /obj/item/stock_parts/console_screen ) var/global/image/console_overlay + var/list/connected_displays = list() + var/list/data = list() + var/scan_data /obj/machinery/body_scanconsole/Destroy() if (connected) connected.connected = null connected = null + for(var/D in connected_displays) + remove_display(D) return ..() /obj/machinery/body_scanconsole/power_change() @@ -281,26 +283,6 @@ add_overlay(console_overlay) set_light(1.4, 1, COLOR_PURPLE) -/obj/machinery/body_scanconsole/proc/get_collapsed_lung_desc() - if (!connected || !connected.occupant) - return - if (connected.occupant.name != connected.last_occupant_name || !collapse_desc) - var/ldesc = pick("shows symptoms of collapse", "dollapsed", "pneumothorax detected") - collapse_desc = ldesc - connected.last_occupant_name = connected.occupant.name - - return collapse_desc - -/obj/machinery/body_scanconsole/proc/get_broken_lung_desc() - if (!connected || !connected.occupant) - return - if (connected.occupant.name != connected.last_occupant_name || !broken_desc) - var/ldesc = pick("shows symptoms of rupture", "ruptured", "extensive damage detected") - broken_desc = ldesc - connected.last_occupant_name = connected.occupant.name - - return broken_desc - /obj/machinery/body_scanconsole/Initialize() . = ..() for(var/obj/machinery/bodyscanner/C in orange(1,src)) @@ -328,22 +310,36 @@ switch(action) // shouldn't be reachable if occupant is invalid if("print") - var/obj/item/paper/medscan/R = new(loc) + var/obj/item/paper/medscan/R = new /obj/item/paper/medscan R.color = "#eeffe8" R.set_content_unsafe("Scan ([connected.occupant])", format_occupant_data(connected.get_occupant_data())) - print(R, message = "\The [src] beeps, printing \the [R] after a moment.") + print(R, message = "\The [src] beeps, printing \the [R] after a moment.", user = usr) if("eject") if(connected) connected.eject() +/obj/machinery/body_scanconsole/proc/FindDisplays() + for(var/obj/machinery/computer/operating/D in SSmachinery.machinery) + if (AreConnectedZLevels(D.z, z)) + connected_displays += D + destroyed_event.register(D, src, PROC_REF(remove_display)) + return !!length(connected_displays) + /obj/machinery/body_scanconsole/ui_interact(mob/user, var/datum/tgui/ui) + if(!connected) + to_chat(usr, SPAN_WARNING("[icon2html(src, usr)]Error: No body scanner detected.")) + return ui = SStgui.try_update_ui(user, src, ui) if(!ui) - ui = new(user, src, "BodyScanner", "Zeng-Hu Pharmaceuticals Body Scanner", 1200, 800) + ui = new(user, src, "BodyScanner", "Zeng-Hu Pharmaceuticals Body Scanner", 450, 500) ui.open() +/obj/machinery/body_scanconsole/proc/remove_display(obj/machinery/computer/operating/display) + connected_displays -= display + destroyed_event.unregister(display, src, PROC_REF(remove_display)) + /obj/machinery/body_scanconsole/ui_data(mob/user) var/list/data = list( "noscan" = null, @@ -351,6 +347,7 @@ "occupied" = null, "invalid" = null, "ipc" = null, + "stationtime" = null, "stat" = null, "name" = null, "species" = null, @@ -360,6 +357,7 @@ "blood_pressure_level" = null, "blood_volume" = null, "blood_o2" = null, + "blood_type" = null, "rads" = null, "cloneLoss" = null, "oxyLoss" = null, @@ -419,6 +417,8 @@ if(occupant.status_flags & FAKEDEATH) displayed_stat = DEAD blood_oxygenation = min(blood_oxygenation, BLOOD_VOLUME_SURVIVE) + + data["stationtime"] = worldtime2text() data["stat"] = displayed_stat data["name"] = occupant.name data["species"] = occupant.get_species() @@ -428,6 +428,7 @@ data["blood_pressure_level"] = occupant.get_blood_pressure_alert() data["blood_volume"] = occupant.get_blood_volume() data["blood_o2"] = blood_oxygenation + data["blood_type"] = occupant.dna.b_type data["rads"] = occupant.total_radiation data["cloneLoss"] = get_severity(occupant.getCloneLoss(), TRUE) @@ -451,8 +452,10 @@ data["organs"] = get_internal_wound_data(occupant) data["has_internal_injuries"] = has_internal_injuries data["has_external_injuries"] = has_external_injuries - var/list/missing = get_missing_organs(occupant) - data["missing_organs"] = missing + var/list/missing_limbs = get_missing_limbs(occupant) + data["missing_limbs"] = missing_limbs + var/list/missing_organs = get_missing_organs(occupant) + data["missing_organs"] = missing_organs return data /obj/machinery/body_scanconsole/proc/get_internal_damage(var/obj/item/organ/internal/I) @@ -485,6 +488,17 @@ missingOrgans += organ_name return capitalize(english_list(missingOrgans)) +/obj/machinery/body_scanconsole/proc/get_missing_limbs(var/mob/living/carbon/human/H) + var/list/missingLimbs = list() + var/list/species_limbs = H.species.has_limbs + for(var/limb_tag in species_limbs) + var/obj/item/organ/external/E = H.get_organ(limb_tag) + if(!locate(E) in H.organs) + var/list/organ_data = species_limbs[limb_tag] + var/organ_descriptor = organ_data["descriptor"] + missingLimbs += organ_descriptor + return capitalize(english_list(missingLimbs)) + /obj/machinery/body_scanconsole/proc/get_external_wound_data(var/mob/living/carbon/human/H) // Limbs. var/organs = list() @@ -499,7 +513,7 @@ var/list/wounds = list() if (O.status & ORGAN_ROBOT) - wounds += "appears to be composed of inorganic material" + wounds += "inorganic" if (O.status & ORGAN_ARTERY_CUT) wounds += "severed [O.artery_name]" if (O.tendon_status() & TENDON_CUT) @@ -513,34 +527,37 @@ if (O.status & ORGAN_BROKEN) wounds += "[O.broken_description]" if (O.open) - wounds += "has an open wound" + wounds += "open" + + var/list/infection = list() if (O.germ_level) var/level = get_infection_level(O.germ_level) if (level && level != "") - wounds += "shows symptoms of \a [level] infection" + infection += "[level]" if (O.rejecting) - wounds += "shows symptoms indicating limb rejection" + infection += "rejection" if (O.implants.len) var/unk = 0 var/list/organic = list() for (var/atom/movable/I in O.implants) if(is_type_in_list(I, known_implants)) - wounds += "\a [I.name] is installed" + wounds += "[I.name] installed" else if(istype(I, /obj/effect/spider)) organic += I else unk += 1 if (unk) - wounds += "has unknown objects present" + wounds += "unknown objects present" var/friends = length(organic) if(friends) - wounds += friends > 1 ? "multiple abnormal organic bodies present" : "abnormal organic body present" + wounds += friends > 1 ? "multiple abnormal organic bodies" : "abnormal organic body" if(length(wounds) || brute_damage != "None" || burn_damage != "None") has_external_injuries = TRUE data["wounds"] = capitalize(english_list(wounds, "None")) + data["infection"] = capitalize(english_list(infection, "None")) organs += list(data) return organs @@ -558,63 +575,70 @@ if(H.status_flags & FAKEDEATH) internal_damage = "Severe" // fake some brain damage if(!(O.status & ORGAN_DEAD)) // to prevent this wound from appearing twice - wounds += "Necrotic and decaying." + wounds += "necrotic; dead" if(H.has_brain_worms()) - wounds += "Has an abnormal growth." + wounds += "abnormal growth" data["damage"] = internal_damage + if(O.is_broken()) + wounds += "broken" + else if(O.is_bruised()) + wounds += "bruised" if(istype(O, /obj/item/organ/internal/lungs)) var/obj/item/organ/internal/lungs/L = O - if(L.is_broken()) - wounds += get_broken_lung_desc() - else if(L.is_bruised()) - wounds += get_collapsed_lung_desc() if(L.rescued) - wounds += "has a small puncture wound" + wounds += "punctured" if(O.status & ORGAN_DEAD) - wounds += "necrotic and decaying" + if(O.can_recover()) + wounds += "necrotic; debridable" + else + wounds += "necrotic; dead" if(istype(O, H.species.vision_organ)) if(H.sdisabilities & BLIND) - wounds += "appears to have cataracts" + wounds += "has cataracts" else if(H.disabilities & NEARSIGHTED) - wounds += "appears to have misaligned retinas" + wounds += "has misaligned retinas" + var/list/infection = list() if(O.germ_level) var/level = get_infection_level(O.germ_level) if (level && level != "") - wounds += "shows symptoms of \a [level] infection" + infection += "[level]" if(O.rejecting) - wounds += "shows symptoms of organ rejection" + infection += "rejection" if(O.get_scarring_level() > 0.01) wounds += "[O.get_scarring_results()]" - if(length(wounds) || internal_damage != "None") + if(length(wounds) || internal_damage != "None" || length(infection)) has_internal_injuries = TRUE - data["wounds"] = english_list(wounds, "None") + if(!length(infection)) + infection += "healthy" + data["wounds"] = capitalize(english_list(wounds, "None")) + data["infection"] = capitalize(english_list(infection, "None")) organs += list(data) return organs /obj/machinery/body_scanconsole/proc/get_infection_level(var/level) switch (level) if (INFECTION_LEVEL_ONE to INFECTION_LEVEL_ONE + 200) - return "mild" + return "Sepsis" if (INFECTION_LEVEL_ONE + 200 to INFECTION_LEVEL_ONE + 300) - return "worsening mild" + return "Worsening Sepsis" if (INFECTION_LEVEL_ONE + 300 to INFECTION_LEVEL_ONE + 400) - return "borderline acute" + return "Borderline Severe Sepsis" if (INFECTION_LEVEL_TWO to INFECTION_LEVEL_TWO + 200) - return "acute" + return "Severe Sepsis" if (INFECTION_LEVEL_TWO + 200 to INFECTION_LEVEL_TWO + 300) - return "worsening acute" + return "Worsening Severe Sepsis" if (INFECTION_LEVEL_TWO + 300 to INFECTION_LEVEL_TWO + 400) - return "borderline septic" + return "Borderline Septic Shock" if (INFECTION_LEVEL_THREE to INFINITY) - return "septic" + return "Septic Shock" return "" @@ -633,12 +657,55 @@ return var/mob/living/carbon/human/H = occupant + var/displayed_stat = H.stat + var/blood_oxygenation = H.get_blood_oxygenation() + if(H.status_flags & FAKEDEATH) + displayed_stat = DEAD + blood_oxygenation = min(blood_oxygenation, BLOOD_VOLUME_SURVIVE) + switch(displayed_stat) + if(CONSCIOUS) + displayed_stat = "Conscious" + if(UNCONSCIOUS) + displayed_stat = "Unconscious" + if(DEAD) + displayed_stat = "DEAD" + + var/pulse_result + if(H.should_have_organ(BP_HEART)) + var/obj/item/organ/internal/heart/heart = H.internal_organs_by_name[BP_HEART] + if(!heart) + pulse_result = 0 + else if(BP_IS_ROBOTIC(heart)) + pulse_result = -2 + else if(H.status_flags & FAKEDEATH) + pulse_result = 0 + else + pulse_result = H.get_pulse(GETPULSE_TOOL) + else + pulse_result = -1 + + if(pulse_result == ">250") + pulse_result = -3 + + var/datum/reagents/R = H.bloodstr + + connected.has_internal_injuries = FALSE + connected.has_external_injuries = FALSE + var/list/bodyparts = connected.get_external_wound_data(H) + var/list/organs = connected.get_internal_wound_data(H) + var/list/occupant_data = list( "stationtime" = worldtime2text(), + "stat" = displayed_stat, + "name" = H.name, + "species" = H.get_species(), + "brain_activity" = H.get_brain_status(), + "pulse" = text2num(pulse_result), "blood_volume" = H.get_blood_volume(), "blood_oxygenation" = H.get_blood_oxygenation(), "blood_pressure" = H.get_blood_pressure(), + "blood_type" = H.dna.b_type, "bruteloss" = get_severity(H.getBruteLoss(), TRUE), "fireloss" = get_severity(H.getFireLoss(), TRUE), @@ -648,159 +715,122 @@ "rads" = H.total_radiation, "paralysis" = H.paralysis, - "bodytemp" = H.bodytemperature - T0C, + "bodytemp" = H.bodytemperature, "borer_present" = H.has_brain_worms(), - "inaprovaline_amount" = REAGENT_VOLUME(H.reagents, /singleton/reagent/inaprovaline), - "dexalin_amount" = REAGENT_VOLUME(H.reagents, /singleton/reagent/dexalin), - "soporific_amount" = REAGENT_VOLUME(H.reagents, /singleton/reagent/soporific), - "bicaridine_amount" = REAGENT_VOLUME(H.reagents, /singleton/reagent/bicaridine), - "dermaline_amount" = REAGENT_VOLUME(H.reagents, /singleton/reagent/dermaline), - "thetamycin_amount" = REAGENT_VOLUME(H.reagents, /singleton/reagent/thetamycin), - "blood_amount" = REAGENT_VOLUME(H.vessel, /singleton/reagent/blood), - "disabilities" = H.sdisabilities, - "lung_ruptured" = H.is_lung_ruptured(), - "lung_rescued" = H.is_lung_rescued(), - "external_organs" = H.organs.Copy(), - "internal_organs" = H.internal_organs.Copy(), - "species_organs" = H.species.has_organ //Just pass a reference for this, it shouldn't ever be modified outside of the datum. + "inaprovaline_amount" = REAGENT_VOLUME(R, /singleton/reagent/inaprovaline), + "dexalin_amount" = REAGENT_VOLUME(R, /singleton/reagent/dexalin), + "soporific_amount" = REAGENT_VOLUME(R, /singleton/reagent/soporific), + "bicaridine_amount" = REAGENT_VOLUME(R, /singleton/reagent/bicaridine), + "dermaline_amount" = REAGENT_VOLUME(R, /singleton/reagent/dermaline), + "thetamycin_amount" = REAGENT_VOLUME(R, /singleton/reagent/thetamycin), + "other_amount" = R.total_volume - (REAGENT_VOLUME(R, /singleton/reagent/inaprovaline) + REAGENT_VOLUME(R, /singleton/reagent/soporific) + REAGENT_VOLUME(R, /singleton/reagent/bicaridine) + REAGENT_VOLUME(R, /singleton/reagent/dexalin) + REAGENT_VOLUME(R, /singleton/reagent/dermaline) + REAGENT_VOLUME(R, /singleton/reagent/thetamycin)), + "bodyparts" = bodyparts, + "organs" = organs, + "has_internal_injuries" = connected.has_internal_injuries, + "has_external_injuries" = connected.has_external_injuries, + "missing_limbs" = connected.get_missing_limbs(H), + "missing_organs" = connected.get_missing_organs(H) ) return occupant_data /obj/machinery/body_scanconsole/proc/format_occupant_data(var/list/occ) - var/dat = "Scan performed at [occ["stationtime"]]
" - dat += "Occupant Statistics:
" - dat += text("Brain Activity: []
", occ["brain_activity"]) - dat += text("Blood Pressure: []
", occ["blood_pressure"]) - dat += text("Blood Oxygenation: []%
", occ["blood_oxygenation"]) - dat += text("Blood Volume: []%
", occ["blood_volume"]) - dat += text("Physical Trauma: []
", occ["bruteloss"]) + var/dat = "Scan performed at [occ["stationtime"]]
" + dat += "" + dat += "Patient Status

" + dat += "" + dat += text("Name: []
", occ["name"]) + dat += text("Status: []
", occ["stat"]) + dat += text("Species: []
", occ["species"]) + dat += text("Pulse: [] BPM
", occ["pulse"]) + dat += text("Brain Activity: []
", occ["brain_activity"]) + dat += text("Body Temperature: []°C ", (occ["bodytemp"] - T0C)) + dat += text("([]°F)
", (occ["bodytemp"]*1.8-459.67)) + + dat += "
Blood Status


" + dat += text("Blood Pressure: []
", occ["blood_pressure"]) + dat += text("Blood Oxygenation: []%
", occ["blood_oxygenation"]) + dat += text("Blood Volume: []%
", occ["blood_volume"]) + dat += text("Blood Type: []
", occ["blood_type"]) + + if(occ["inaprovaline_amount"]) + dat += text("Inaprovaline: [] units
", occ["inaprovaline_amount"]) + if(occ["soporific_amount"]) + dat += text("Soporific: [] units
", occ["soporific_amount"]) + if(occ["dermaline_amount"]) + dat += text("[]\tDermaline: [] units

", (""), occ["dermaline_amount"]) + if(occ["bicaridine_amount"]) + dat += text("[]\tBicaridine: [] units
", (""), occ["bicaridine_amount"]) + if(occ["dexalin_amount"]) + dat += text("[]\tDexalin: [] units
", (""), occ["dexalin_amount"]) + if(occ["thetamycin_amount"]) + dat += text("[]\tThetamycin: [] units
", (""), occ["thetamycin_amount"]) + if(occ["other_amount"]) + dat += text("Other: [] units
", occ["other_amount"]) + + dat += "
Symptom Status


" + dat += text("Radiation Level: [] Gy
", round(occ["rads"])) + dat += text("Genetic Damage: []
", occ["cloneloss"]) + if(occ["paralysis"]) + dat += text("Est Paralysis Level: [] Seconds Left
", round(occ["paralysis"] / 4)) + else + dat += text("Est Paralysis Level: None
") + + dat += "
Damage Status


" + dat += text("Brute Trauma: []
", occ["bruteloss"]) + dat += text("Burn Severity: []
", occ["fireloss"]) dat += text("Oxygen Deprivation: []
", occ["oxyloss"]) - dat += text("Systemic Organ Failure: []
", occ["toxloss"]) - dat += text("Burn Severity: []

", occ["fireloss"]) + dat += text("Toxin Exposure: []
", occ["toxloss"]) - dat += text("[]\tRadiation Level %: []

", (""), occ["rads"]) - dat += text("Genetic Tissue Damage: []
", occ["cloneloss"]) - dat += text("Paralysis Summary %: [] ([] seconds left!)
", occ["paralysis"], round(occ["paralysis"] / 4)) - dat += text("Body Temperature: [occ["bodytemp"]]°C

") - - if(occ["borer_present"]) - dat += "Large growth detected in frontal lobe, possibly cancerous. Surgical removal is recommended.
" - - dat += text("Inaprovaline: [] units
", occ["inaprovaline_amount"]) - dat += text("Soporific: [] units
", occ["soporific_amount"]) - dat += text("[]\tDermaline: [] units

", (""), occ["dermaline_amount"]) - dat += text("[]\tBicaridine: [] units
", (""), occ["bicaridine_amount"]) - dat += text("[]\tDexalin: [] units
", (""), occ["dexalin_amount"]) - dat += text("[]\tThetamycin: [] units
", (""), occ["thetamycin_amount"]) - - dat += "
" - dat += "" - dat += "" - dat += "" - dat += "" - dat += "" - dat += "" - - for(var/obj/item/organ/external/e in occ["external_organs"]) - var/list/wounds = list() + dat += "
Body Status
" + if(occ["has_external_injuries"]) + dat += "
OrganBurn SeverityPhysical TraumaOther Wounds
" dat += "" - - if(e.status & ORGAN_ARTERY_CUT) - wounds += "severed [e.artery_name]" - if(e.tendon_status() & TENDON_CUT) - wounds += "severed [e.tendon.name]" - if(istype(e, /obj/item/organ/external/chest) && occ["lung_ruptured"]) - wounds += "lung ruptured" - if(e.status & ORGAN_SPLINTED) - wounds += "splinted" - if(ORGAN_IS_DISLOCATED(e)) - wounds += "dislocated" - if(e.status & ORGAN_BLEEDING) - wounds += "bleeding" - if(e.status & ORGAN_BROKEN) - wounds += "[e.broken_description]" - if(e.status & ORGAN_ROBOT) - wounds += "prosthetic" - if(e.open) - wounds += "open" - - var/infection = get_infection_level(e.germ_level) - if (infection != "") - var/infected = "[infection] infection" - if(e.rejecting) - infected += " (being rejected)" - wounds += infection - - if (e.implants.len) - var/unk = 0 - var/list/organic = list() - var/imp - for(var/I in e.implants) - if(istype(I, /obj/item/implant)) - var/obj/item/implant/A = I - if (A.hidden) - return - else if(A.known) - imp += "[I] implanted:" - else - unk += 1 - else if(istype(I, /obj/effect/spider)) - organic += I - else - unk += 1 - if(unk) - wounds += "has unknown objects present:" - var/friends = length(organic) - if(friends) - wounds += friends > 1 ? "multiple abnormal organic bodies present" : "abnormal organic body present" - if(!length(wounds)) - wounds += "none" - if(!e.is_stump()) - dat += "" - else - dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" dat += "" + for(var/list/data in occ["bodyparts"]) // cant believe this shit worked HOLY FUCK - for(var/obj/item/organ/internal/i in occ["internal_organs"]) + dat += "" + dat += "" + dat += "" - var/mech = "" - if(i.robotic == ROBOTIC_ASSISTED) - mech = "Assisted:" - if(i.robotic == ROBOTIC_MECHANICAL) - mech = "Mechanical:" + if(!has_external_injuries) + dat += "No external injuries detected.
" + else + dat += "
[e.name][get_severity(e.burn_dam, TRUE)][get_severity(e.brute_dam, TRUE)][capitalize(english_list(wounds))][e.name]--Not [e.is_stump() ? "Found" : "Attached Completely"]NameBruteBurnComplicationsImmune
[data["name"]][data["brute_damage"]][data["burn_damage"]][data["wounds"]][data["infection"]]
" - var/infection = get_infection_level(i.germ_level) - if(infection == "") - infection = "No infection." - else - infection = "[infection] infection." - if(i.rejecting) - infection += "(being rejected)." + if(occ["missing_limbs"] != "Nothing") + dat += text("Missing limbs : [occ["missing_limbs"]]
") - var/necrotic = "" - if(i.get_scarring_level() > 0.01) - necrotic += " [i.get_scarring_results()]." - if(i.status & ORGAN_DEAD) - necrotic = " Necrotic and decaying." - - var/rescued = "" - if(istype(i, /obj/item/organ/internal/lungs) && occ["lung_rescued"]) - rescued = " Has a small puncture wound." + dat += "
Internal Organ Status
" + if(occ["has_internal_injuries"]) + dat += "" dat += "" - dat += "" + dat += "" + dat += "" + dat += "" + dat += "" dat += "" - dat += "
[i.name]N/A[get_internal_damage(i)][infection][mech][necrotic][rescued]NameDamageComplicationsImmune
" + for(var/list/data in occ["organs"]) // cant believe this shit worked HOLY FUCK - var/list/species_organs = occ["species_organs"] - for(var/organ_name in species_organs) - if(!locate(species_organs[organ_name]) in occ["internal_organs"]) - dat += text("No [organ_name] detected.
") + dat += "" + dat += "[data["name"]][data["damage"]][data["wounds"]][data["infection"]]" + dat += "" + + if(!has_internal_injuries) + dat += "No internal injuries detected.
" + else + dat += "" + + if(occ["missing_organs"] != "Nothing") + dat += text("Missing organs : [occ["missing_organs"]]
") + + dat += "
" - if(occ["sdisabilities"] & BLIND) - dat += text("Cataracts detected.
") - if(occ["sdisabilities"] & NEARSIGHTED) - dat += text("Retinal misalignment detected.
") return dat diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm index d2694eff7e1..ca120aa80e2 100644 --- a/code/game/machinery/computer/Operating.dm +++ b/code/game/machinery/computer/Operating.dm @@ -8,371 +8,105 @@ icon_screen = "crew" icon_keyboard = "teal_key" light_color = LIGHT_COLOR_BLUE - circuit = /obj/item/circuitboard/operating - var/mob/living/carbon/human/victim = null var/obj/machinery/optable/table = null - var/obj/machinery/body_scanconsole/internal_bodyscanner = null - var/obj/item/paper/medscan/input_scan = null - var/scan_slot = FALSE - var/backup_victim = null // Backup data - var/backup_data = null + var/list/bodyscans = list() + var/selected = 0 - var/last_critical // Spam checks for the alarms - var/last_ba // Brain Activity - var/last_bo // Blood Oxygenation - -/obj/machinery/computer/operating/Initialize() - . = ..() - for(dir in list(NORTH,EAST,SOUTH,WEST)) - table = locate(/obj/machinery/optable, get_step(src, dir)) +/obj/machinery/computer/operating/New() + ..() + for(var/obj/machinery/optable/T in orange(1,src)) + table = T if (table) table.computer = src break - if(!internal_bodyscanner) // So it can scan correctly - var/obj/machinery/body_scanconsole/S = new (src) - S.forceMove(src) - S.update_use_power(POWER_USE_OFF) - internal_bodyscanner = S - -/obj/machinery/computer/operating/Destroy() - QDEL_NULL(table.computer) - QDEL_NULL(internal_bodyscanner) - QDEL_NULL(input_scan) - return ..() /obj/machinery/computer/operating/attack_ai(mob/user) if(!ai_can_interact(user)) return - add_fingerprint(user) - if(stat & (BROKEN|NOPOWER)) - return - interact(user) + return attack_hand(user) + /obj/machinery/computer/operating/attack_hand(mob/user) - add_fingerprint(user) - if(stat & (BROKEN|NOPOWER)) - return - interact(user) - -/obj/machinery/computer/operating/attackby(obj/item/O as obj, mob/user) - if(!istype(O, /obj/item/paper/medscan)) - return ..() - else if(scan_slot) - if(input_scan) - to_chat(usr, SPAN_NOTICE("You try to insert \the [O], but \the [src] buzzes. There is already a [O] inside!")) - playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 1) - return TRUE - - if(O.name != "Scan ([victim])") - to_chat(usr, SPAN_NOTICE("This scan is of a different patient! Please insert the scan of the correct patient.")) - playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 1) - return TRUE - - user.drop_from_inventory(O, src) - input_scan = O - input_scan.color = "#272727" - input_scan.set_content_unsafe("Scan ([victim])", operating_format(get_medical_data(victim))) - usr.visible_message("\The [src] pings, displaying \the [input_scan].") - to_chat(usr, SPAN_NOTICE("You insert \the [O] into [src].")) - playsound(src, 'sound/bureaucracy/scan.ogg', 50, 1) - return TRUE - else - to_chat(usr, SPAN_WARNING("\The [src]'s scan slot is closed! Please put in a valid patient on the table to open it!")) - return TRUE - -/obj/machinery/computer/operating/interact(mob/user) - if ( (get_dist(src, user) > 1 ) || (stat & (BROKEN|NOPOWER)) ) - if (!istype(user, /mob/living/silicon)) - user.unset_machine() - user << browse(null, "window=op") - return - - user.set_machine(src) - var/dat = "Operating Computer\n" - if(src.table && (src.table.check_victim())) - src.victim = src.table.victim - dat += {" - Patient Information:
- Brain Activity: [victim.isFBP() ? "N/A" : victim.get_brain_status()]
- Pulse: [victim.get_pulse(GETPULSE_TOOL)]
- BP: [victim.get_blood_pressure()]
- Blood Oxygenation: [victim.get_blood_oxygenation()]%
- Blood Volume: [victim.get_blood_volume()]%
- "} - if(!input_scan) - dat += "Patient Scan: Scan not found. Please insert a Medical Scan.
" - else - dat += {" - Patient Scan: [input_scan]
- Update scan - Remove and update scan - Print new scan

- "} - dat += "[input_scan.get_content()]" - else - src.victim = null - dat += {" -Patient Information:
-No Patient Detected -"} - var/datum/browser/op_win = new(user, "op", capitalize_first_letters(name), 450, 800) - op_win.set_content(dat) - op_win.open() - -/obj/machinery/computer/operating/examine(mob/user, distance, is_adjacent) - . = ..() - if(distance <= 2) - if(src.table && (src.table.check_victim())) - src.victim = src.table.victim - - to_chat(user, SPAN_NOTICE("Patient Info:")) - to_chat(user, SPAN_NOTICE("Brain Activity: [victim.isFBP() ? "N/A" : victim.get_brain_status()]")) - to_chat(user, SPAN_NOTICE("Pulse: [victim.get_pulse(GETPULSE_TOOL)]")) - to_chat(user, SPAN_NOTICE("BP: [victim.get_blood_pressure()]")) - to_chat(user, SPAN_NOTICE("Blood Oxygenation: [victim.get_blood_oxygenation()]%")) - to_chat(user, SPAN_NOTICE("Blood Volume: [victim.get_blood_volume()]%")) - if(!input_scan) - to_chat(user, SPAN_NOTICE("Patient Scan: Scan not found. Please insert the Medical Scan.")) - else - to_chat(user, SPAN_NOTICE("Patient Scan: [input_scan]")) - else - src.victim = null - to_chat(user, SPAN_NOTICE("No Patient Detected")) - -/obj/machinery/computer/operating/Topic(href, href_list) if(..()) - return TRUE - if(href_list["action"]) - switch(href_list["action"]) - if("update") - input_scan.set_content_unsafe("Scan ([victim])", operating_format(get_medical_data(victim))) - usr.visible_message("\The [src] chimes, updating \the [input_scan].") - playsound(src, 'sound/machines/chime.ogg', 50, 1) - if("eject") - usr.visible_message("\The [src] beeps, ejecting \the [input_scan].") - input_scan.color = "#eeffe8" - input_scan.set_content_unsafe("Scan ([victim])", internal_bodyscanner.format_occupant_data(get_medical_data(victim))) // Re-formats it correctly - input_scan.forceMove(usr.loc) - usr.put_in_hands(input_scan) - input_scan = null - backup_clear() - playsound(src, 'sound/machines/twobeep.ogg', 50, 1) - if("print_new") - print_new() - usr.visible_message("\The [src] beeps, printing a new [input_scan] after a moment.") - return + return + + ui_interact(user) + +/obj/machinery/computer/operating/ui_interact(mob/user, var/datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "Operating", "Patient Monitoring Console", 450, 500) + ui.open() /obj/machinery/computer/operating/process() if(operable()) - src.updateDialog() - if(src.stat & BROKEN) - QDEL_NULL(input_scan) - QDEL_NULL(internal_bodyscanner) - return PROCESS_KILL - if(src.table && (src.table.check_victim())) // Specific warning alarms for specific conditions. Times to be tweaked according to feedback - src.victim = src.table.victim - scan_slot = TRUE - if(src.victim.stat != DEAD && !src.victim.is_diona()) - if(victim.get_blood_oxygenation() < 30 && victim.get_brain_result() < 20) - if(world.time > last_critical + 25 SECONDS) - last_critical = world.time - src.visible_message(SPAN_WARNING("Warning! [victim]'s Blood Oxygenation AND Brain Activity are in critical condition!")) - playsound(src, 'sound/effects/3.wav', 75) + updateDialog() + +/obj/machinery/computer/operating/ui_data(mob/user) + var/list/data = list( + "noscan" = null, + "nocons" = null, + "occupied" = null, + "invalid" = null, + "ipc" = null, + "stat" = null, + "name" = null, + "species" = null, + "brain_activity" = null, + "pulse" = null, + "blood_pressure" = null, + "blood_pressure_level" = null, + "blood_volume" = null, + "blood_o2" = null, + "blood_type" = null + ) + + var/mob/living/carbon/human/occupant + if(table) + occupant = table.occupant + + data["noscan"] = !!table.check_species() + data["nocons"] = !table + data["occupied"] = !!table.occupant + data["invalid"] = !!table.check_species() + data["ipc"] = occupant && isipc(occupant) + + if(!data["invalid"]) + var/brain_result = occupant.get_brain_result() + var/pulse_result + if(occupant.should_have_organ(BP_HEART)) + var/obj/item/organ/internal/heart/heart = occupant.internal_organs_by_name[BP_HEART] + if(!heart) + pulse_result = 0 + else if(BP_IS_ROBOTIC(heart)) + pulse_result = -2 + else if(occupant.status_flags & FAKEDEATH) + pulse_result = 0 else - if(victim.get_blood_oxygenation() < 30 && victim.get_brain_result() > 20) - blood_oxygenation_alarm() - if(victim.get_brain_result() < 20 && victim.get_blood_oxygenation() > 30) - brain_activity_alarm() - else if(input_scan) - src.visible_message(SPAN_WARNING("Patient not found! Automatically ejecting the scan.")) - playsound(src, 'sound/machines/twobeep.ogg', 50, 1) - input_scan.color = "#eeffe8" - input_scan.set_content_unsafe("Scan ([backup_victim])", internal_bodyscanner.format_occupant_data(backup_data)) // To do: Figure out how to re-format without doing more shitcode - input_scan.forceMove(src.loc) - input_scan = null - backup_clear() - scan_slot = FALSE - -/obj/machinery/computer/operating/proc/blood_oxygenation_alarm() - if(world.time > last_bo + 25 SECONDS) - last_bo = world.time - src.visible_message(SPAN_WARNING("Warning! [victim]'s Blood Oxygenation is in critical condition!")) - playsound(src, 'sound/machines/ringer.ogg', 50) - -/obj/machinery/computer/operating/proc/brain_activity_alarm() - if(world.time > last_ba + 20 SECONDS) - last_ba = world.time - src.visible_message(SPAN_WARNING("Warning! [victim]'s Brain Activity is in critical condition!")) - playsound(src, 'sound/effects/alert.ogg', 50) - -/obj/machinery/computer/operating/proc/backup_clear() - backup_victim = null - backup_data = null - -// PRINTING SHENANIGANRY -/obj/machinery/computer/operating/proc/print_new() - var/obj/item/paper/medscan/S = new() - usr.put_in_hands(S) - S.color = "#eeffe8" - S.set_content_unsafe("Scan ([victim])", internal_bodyscanner.format_occupant_data(get_medical_data(victim))) - playsound(src, 'sound/bureaucracy/print.ogg', 50, 1) - -/obj/machinery/computer/operating/proc/get_medical_data(var/mob/living/carbon/human/H) - if (!ishuman(H)) - return - - var/list/medical_data = list( - "stationtime" = worldtime2text(), - "brain_activity" = H.get_brain_status(), - "blood_volume" = H.get_blood_volume(), - "blood_oxygenation" = H.get_blood_oxygenation(), - "blood_pressure" = H.get_blood_pressure(), - - "bruteloss" = get_severity(H.getBruteLoss(), TRUE), - "fireloss" = get_severity(H.getFireLoss(), TRUE), - "oxyloss" = get_severity(H.getOxyLoss(), TRUE), - "toxloss" = get_severity(H.getToxLoss(), TRUE), - "cloneloss" = get_severity(H.getCloneLoss(), TRUE), - - "rads" = H.total_radiation, - "paralysis" = H.paralysis, - "bodytemp" = H.bodytemperature, - "borer_present" = H.has_brain_worms(), - "inaprovaline_amount" = REAGENT_VOLUME(H.reagents, /singleton/reagent/inaprovaline), - "dexalin_amount" = REAGENT_VOLUME(H.reagents, /singleton/reagent/dexalin), - "stoxin_amount" = REAGENT_VOLUME(H.reagents, /singleton/reagent/soporific), - "bicaridine_amount" = REAGENT_VOLUME(H.reagents, /singleton/reagent/bicaridine), - "dermaline_amount" = REAGENT_VOLUME(H.reagents, /singleton/reagent/dermaline), - "thetamycin_amount" = REAGENT_VOLUME(H.reagents, /singleton/reagent/thetamycin), - "blood_amount" = REAGENT_VOLUME(H.vessel, /singleton/reagent/blood), - "disabilities" = H.sdisabilities, - "lung_ruptured" = H.is_lung_ruptured(), - "lung_rescued" = H.is_lung_rescued(), - "external_organs" = H.organs.Copy(), - "internal_organs" = H.internal_organs.Copy(), - "species_organs" = H.species.has_organ - ) - backup_victim = H.name - backup_data = medical_data - return medical_data - -/obj/machinery/computer/operating/proc/operating_format(var/list/occ) // Format to cut out redundant information - var/dat = "
Scan last updated at [occ["stationtime"]]
" - if(occ["borer_present"]) - dat += "Large growth detected in frontal lobe, possibly cancerous. Surgical removal is recommended.
" - - dat += "
" - dat += "" - dat += "" - dat += "" - dat += "" - dat += "" - dat += "" - - for(var/obj/item/organ/external/e in occ["external_organs"]) - var/AN = "" - var/open = "" - var/infected = "" - var/imp = "" - var/bled = "" - var/robot = "" - var/splint = "" - var/internal_bleeding = "" - var/severed_tendon = "" - var/lung_ruptured = "" - var/dislocated = "" - - dat += "" - - if(e.status & ORGAN_ARTERY_CUT) - internal_bleeding = "Arterial bleeding." - if(e.tendon_status() & TENDON_CUT) - severed_tendon = "Severed tendon." - if(istype(e, /obj/item/organ/external/chest) && occ["lung_ruptured"]) - lung_ruptured = "Lung ruptured." - if(e.status & ORGAN_SPLINTED) - splint = "Splinted." - if(ORGAN_IS_DISLOCATED(e)) - dislocated = "Dislocated." - if(e.status & ORGAN_BLEEDING) - bled = "Bleeding." - if(e.status & ORGAN_BROKEN) - AN = "[e.broken_description]." - if(e.status & ORGAN_ROBOT) - robot = "Prosthetic." - if(e.open) - open = "Open." - - var/infection = internal_bodyscanner.get_infection_level(e.germ_level) - if (infection != "") - infected = "[infection] infection" - if(e.rejecting) - infected += " (being rejected)" - - if (e.implants.len) - var/unknown_body = 0 - var/list/organic = list() - for(var/I in e.implants) - if(is_type_in_list(I,internal_bodyscanner.known_implants)) - imp += "[I] implanted:" - else if(istype(I, /obj/effect/spider)) - organic += I - else - unknown_body++ - if(unknown_body) - imp += "Unknown body present:" - var/friends = length(organic) - if(friends) - imp += friends > 1 ? "Multiple abnormal organic bodies present:" : "Abnormal organic body present:" - - if(!AN && !open && !infected && !imp) - AN = "None:" - if(!e.is_stump()) - dat += "" + pulse_result = occupant.get_pulse(GETPULSE_TOOL) else - dat += "" - dat += "" + pulse_result = -1 - for(var/obj/item/organ/internal/i in occ["internal_organs"]) + if(pulse_result == ">250") + pulse_result = -3 - var/mech = "" - if(i.robotic == ROBOTIC_ASSISTED) - mech = "Assisted:" - if(i.robotic == ROBOTIC_MECHANICAL) - mech = "Mechanical:" + var/displayed_stat = occupant.stat + var/blood_oxygenation = occupant.get_blood_oxygenation() + if(occupant.status_flags & FAKEDEATH) + displayed_stat = DEAD + blood_oxygenation = min(blood_oxygenation, BLOOD_VOLUME_SURVIVE) - var/infection = internal_bodyscanner.get_infection_level(i.germ_level) - if(infection == "") - infection = "No Infection." - else - infection = "[infection] infection." - if(i.rejecting) - infection += "(being rejected)." + data["stat"] = displayed_stat + data["name"] = occupant.name + data["species"] = occupant.get_species() + data["brain_activity"] = brain_result + data["pulse"] = text2num(pulse_result) + data["blood_pressure"] = occupant.get_blood_pressure() + data["blood_pressure_level"] = occupant.get_blood_pressure_alert() + data["blood_volume"] = occupant.get_blood_volume() + data["blood_o2"] = blood_oxygenation + data["blood_type"] = occupant.dna.b_type - var/necrotic = "" - if(i.get_scarring_level() > 0.01) - necrotic += " [i.get_scarring_results()]." - if(i.status & ORGAN_DEAD) - necrotic = " Necrotic and decaying." - - var/rescued = "" - if(istype(i, /obj/item/organ/internal/lungs) && occ["lung_rescued"]) - rescued = " Has a small puncture wound." - - dat += "" - dat += "" - dat += "" - dat += "
OrganBurn SeverityPhysical TraumaOther Wounds
[e.name][get_severity(e.burn_dam, TRUE)][get_severity(e.brute_dam, TRUE)][robot][bled][AN][splint][open][infected][imp][dislocated][internal_bleeding][severed_tendon][lung_ruptured][e.name]--Not [e.is_stump() ? "Found" : "Attached Completely"]
[i.name]N/A[internal_bodyscanner.get_internal_damage(i)][infection][mech][necrotic][rescued]
" - - var/list/species_organs = occ["species_organs"] - for(var/organ_name in species_organs) - if(!locate(species_organs[organ_name]) in occ["internal_organs"]) - dat += text("No [organ_name] detected.
") - - if(occ["sdisabilities"] & BLIND) - dat += text("Cataracts detected.
") - if(occ["sdisabilities"] & NEARSIGHTED) - dat += text("Retinal misalignment detected.
") - return dat + return data diff --git a/code/game/machinery/computer/sentencing.dm b/code/game/machinery/computer/sentencing.dm index fa8f7e91e27..6b3bb83aee4 100644 --- a/code/game/machinery/computer/sentencing.dm +++ b/code/game/machinery/computer/sentencing.dm @@ -458,7 +458,7 @@ /obj/machinery/computer/sentencing/proc/print_incident_overview(var/text) var/obj/item/paper/P = new /obj/item/paper P.set_content_unsafe("Incident Summary",text) - print(P) + print(P, user = usr) /obj/machinery/computer/sentencing/proc/print_incident_report( var/sentence = 1 ) var/error = incident.missingSentenceReq() @@ -473,7 +473,7 @@ I.incident = incident I.sentence = sentence I.name = "Encoded Incident Report" - print( I ) + print(I, user = usr) return 0 diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 4490459ca86..a285a9135e8 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -456,7 +456,7 @@ Class Procs: qdel(src) return 1 -/obj/machinery/proc/print(var/obj/paper, var/play_sound = 1, var/print_sfx = 'sound/items/polaroid1.ogg', var/print_delay = 10, var/message) +/obj/machinery/proc/print(var/obj/paper, var/play_sound = 1, var/print_sfx = /singleton/sound_category/print_sound, var/print_delay = 10, var/message, var/mob/user) if( printing ) return 0 @@ -469,12 +469,15 @@ Class Procs: message = "\The [src] rattles to life and spits out a paper titled [paper]." visible_message(SPAN_NOTICE(message)) - addtimer(CALLBACK(src, PROC_REF(print_move_paper), paper), print_delay) + addtimer(CALLBACK(src, PROC_REF(print_move_paper), paper, user), print_delay) return 1 -/obj/machinery/proc/print_move_paper(obj/paper) - paper.forceMove(loc) +/obj/machinery/proc/print_move_paper(obj/paper, mob/user) + if(user) + user.put_in_hands(paper) + else + paper.forceMove(loc) printing = FALSE /obj/machinery/bullet_act(obj/item/projectile/P, def_zone) diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index eb4f72aae6c..f514bfc0bdf 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -404,7 +404,7 @@ var/list/obj/machinery/requests_console/allConsoles = list() data = html_encode(data) C.set_content("NFC-[id] - [name]", data) - print(C) + print(C, user = usr) paperstock-- diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index fba0fa296bf..2cbeb585bf0 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -20,8 +20,8 @@ BREATH ANALYZER throw_range = 10 matter = list(DEFAULT_WALL_MATERIAL = 200) origin_tech = list(TECH_MAGNET = 1, TECH_BIO = 1) - var/mode = 1 var/last_scan = 0 + var/mode = 1 var/sound_scan = FALSE /obj/item/device/healthanalyzer/attack(mob/living/M, mob/living/user) @@ -29,6 +29,8 @@ BREATH ANALYZER if(last_scan <= world.time - 20) //Spam limiter. last_scan = world.time sound_scan = TRUE + user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) + user.do_attack_animation(src) flick("[icon_state]-scan", src) //makes it so that it plays the scan animation on a successful scan health_scan_mob(M, user, mode, sound_scan = sound_scan) add_fingerprint(user) @@ -38,6 +40,8 @@ BREATH ANALYZER if(last_scan <= world.time - 20) //Spam limiter. last_scan = world.time sound_scan = TRUE + user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) + user.do_attack_animation(src) flick("[icon_state]-scan", src) //makes it so that it plays the scan animation on a successful scan health_scan_mob(user, user, mode, sound_scan = sound_scan) add_fingerprint(user) @@ -93,8 +97,8 @@ BREATH ANALYZER playsound(user.loc, 'sound/items/healthscanner/healthscanner_used.ogg', 25) return - if(!usr.IsAdvancedToolUser()) - to_chat(usr, "You don't have the dexterity to do this!") + if(!user.IsAdvancedToolUser()) + to_chat(user, "You don't have the dexterity to do this!") return user.visible_message("[user] runs a scanner over [M].","You run the scanner over [M].") @@ -131,6 +135,9 @@ BREATH ANALYZER . += "[b]Scan results for \the [H]:[endb]" + if(H.stat == DEAD || H.status_flags & FAKEDEATH) + dat += "[b]Time of Death:[endb] [worldtime2text(H.timeofdeath)]" + // Brain activity. var/brain_status = H.get_brain_status() dat += "Brain activity: [brain_status]" @@ -152,9 +159,6 @@ BREATH ANALYZER else playsound(user.loc, 'sound/items/healthscanner/healthscanner_stable.ogg', 25) - if(H.stat == DEAD || H.status_flags & FAKEDEATH) - dat += "[b]Time of Death:[endb] [worldtime2text(H.timeofdeath)]" - // Pulse rate. var/pulse_result = "normal" if(H.should_have_organ(BP_HEART)) @@ -162,33 +166,27 @@ BREATH ANALYZER pulse_result = "0" else pulse_result = H.get_pulse(GETPULSE_TOOL) - pulse_result = "[pulse_result]" + pulse_result = "[pulse_result] BPM" if(H.pulse() == PULSE_NONE) - pulse_result = "[pulse_result]" + pulse_result = "[pulse_result] BPM" else if(H.pulse() < PULSE_NORM) - pulse_result = "[pulse_result]" + pulse_result = "[pulse_result] BPM" else if(H.pulse() > PULSE_NORM) - pulse_result = "[pulse_result]" + pulse_result = "[pulse_result] BPM" else - pulse_result = "0" - dat += "Pulse rate: [pulse_result] bpm" + pulse_result = "0 BPM" + dat += "Pulse rate: [pulse_result]" + + // Body temperature. Rounds to one digit after decimal. + var/temperature_string + if(H.bodytemperature < H.species.cold_level_1 || H.bodytemperature > H.species.heat_level_1) + temperature_string = "Body temperature: [round(H.bodytemperature-T0C, 0.1)]°C ([round(H.bodytemperature*1.8-459.67, 0.1)]°F)" + else + temperature_string = "Body temperature: [round(H.bodytemperature-T0C, 0.1)]°C ([round(H.bodytemperature*1.8-459.67, 0.1)]°F)" + dat += temperature_string // Blood pressure and blood type. Based on the idea of a normal blood pressure being 120 over 80. if(H.should_have_organ(BP_HEART)) - if(H.get_blood_volume() <= 70) - dat += "Severe blood loss detected." - var/oxygenation_string = "[H.get_blood_oxygenation()]% blood oxygenation" - dat += "Blood type: [H.dna.b_type]" - switch(H.get_blood_oxygenation()) - if(BLOOD_VOLUME_OKAY to BLOOD_VOLUME_SAFE) - oxygenation_string = "[oxygenation_string]" - if(BLOOD_VOLUME_SURVIVE to BLOOD_VOLUME_OKAY) - oxygenation_string = "[oxygenation_string]" - if(-(INFINITY) to BLOOD_VOLUME_SURVIVE) - oxygenation_string = "[oxygenation_string]" - if(H.status_flags & FAKEDEATH) - oxygenation_string = "0% blood oxygenation" - var/blood_pressure_string switch(H.get_blood_pressure_alert()) if(1) @@ -199,23 +197,38 @@ BREATH ANALYZER blood_pressure_string = "[H.get_blood_pressure()]" if(4) blood_pressure_string = "[H.get_blood_pressure()]" - dat += "Blood pressure: [blood_pressure_string] ([oxygenation_string])" + + var/blood_volume_string = "\>[BLOOD_VOLUME_SAFE]%" + switch(H.get_blood_oxygenation()) + if(BLOOD_VOLUME_OKAY to BLOOD_VOLUME_SAFE) + blood_volume_string = "\<[BLOOD_VOLUME_SAFE]%" + if(BLOOD_VOLUME_SURVIVE to BLOOD_VOLUME_OKAY) + blood_volume_string = "\<[BLOOD_VOLUME_OKAY]%" + if(-(INFINITY) to BLOOD_VOLUME_SURVIVE) + blood_volume_string = "\<[BLOOD_VOLUME_SURVIVE]%" + + var/oxygenation_string = "[H.get_blood_oxygenation()]%" + switch(H.get_blood_oxygenation()) + if(BLOOD_VOLUME_OKAY to BLOOD_VOLUME_SAFE) + oxygenation_string = "[oxygenation_string]%" + if(BLOOD_VOLUME_SURVIVE to BLOOD_VOLUME_OKAY) + oxygenation_string = "[oxygenation_string]%" + if(-(INFINITY) to BLOOD_VOLUME_SURVIVE) + oxygenation_string = "[oxygenation_string]%" + if(H.status_flags & FAKEDEATH) + oxygenation_string = "[rand(0,10)]%" + dat += "Blood pressure: [blood_pressure_string]" + dat += "Blood oxygenation: [oxygenation_string]" + dat += "Blood volume: [blood_volume_string]" + dat += "Blood type: [H.dna.b_type]" else dat += "Blood pressure: N/A" - // Body temperature. Rounds to one digit after decimal. - var/temperature_string - if(H.bodytemperature < H.species.cold_level_1 || H.bodytemperature > H.species.heat_level_1) - temperature_string = "Body temperature: [round(H.bodytemperature-T0C, 0.1)]°C ([round(H.bodytemperature*1.8-459.67, 0.1)]°F)" - else - temperature_string = "Body temperature: [round(H.bodytemperature-T0C, 0.1)]°C ([round(H.bodytemperature*1.8-459.67, 0.1)]°F)" - dat += temperature_string - // Traumatic shock. if(H.is_asystole() || (H.status_flags & FAKEDEATH)) - dat += "Patient is suffering from cardiovascular shock. Administer CPR immediately." + dat += "Cardiovascular shock detected. Administer CPR immediately." else if(H.shock_stage > 80) - dat += "Patient is at serious risk of going into shock. Pain relief recommended." + dat += "Imminent cardiovascular shock. Pain relief recommended." if(H.getOxyLoss() > 50) dat += "[b]Severe oxygen deprivation detected.[endb]" @@ -226,18 +239,6 @@ BREATH ANALYZER if(H.getBruteLoss() > 50) dat += "[b]Severe anatomical damage detected.[endb]" - var/rad_result = "Radiation: " - switch(H.total_radiation) - if(RADS_NONE) - rad_result += span("scan_green", "No radiation detected.") - if(RADS_LOW to RADS_MED) - rad_result += span("scan_orange", "Low levels of radiation poisoning detected.") - if(RADS_MED to RADS_HIGH) - rad_result += span("scan_orange", "Severe levels of radiation poisoning detected!") - if(RADS_HIGH to INFINITY) - rad_result += span("scan_red", "[b]Extreme levels of radiation poisoning detected![endb]") - dat += rad_result - if(show_limb_damage) var/list/damaged = H.get_damaged_organs(1,1) if(damaged.len) @@ -347,9 +348,10 @@ BREATH ANALYZER . = jointext(.,"
") . = jointext(list(header,.),null) - to_chat(user, "
") - to_chat(user, .) - to_chat(user, "
") + if(user) + to_chat(user, "
") + to_chat(user, .) + to_chat(user, "
") /obj/item/device/healthanalyzer/verb/toggle_mode() set name = "Switch Verbosity" @@ -683,31 +685,33 @@ BREATH ANALYZER /obj/item/device/advanced_healthanalyzer - name = "zeng-hu body analyzer" - desc = "An expensive and varied-use health analyzer that prints full-body scans after a short scanning delay." - icon_state = "zh-analyzer" - item_state = "zh-analyzer" + name = "advanced health analyzer" + desc = "An expensive and varied-use health analyzer of Zeng-Hu design that prints full-body scans after a short scanning delay." + icon_state = "adv-analyzer" + item_state = "adv-analyzer" slot_flags = SLOT_BELT w_class = ITEMSIZE_NORMAL origin_tech = list(TECH_MAGNET = 2, TECH_BIO = 3) - var/obj/machinery/body_scanconsole/internal_bodyscanner = null //this is used to print the date and to deal with extra + var/obj/machinery/body_scanconsole/connected = null //this is used to print the date and to deal with extra /obj/item/device/advanced_healthanalyzer/Initialize() . = ..() - if(!internal_bodyscanner) + if(!connected) var/obj/machinery/body_scanconsole/S = new (src) S.forceMove(src) S.update_use_power(POWER_USE_OFF) - internal_bodyscanner = S + connected = S /obj/item/device/advanced_healthanalyzer/Destroy() - if(internal_bodyscanner) - QDEL_NULL(internal_bodyscanner) + if(connected) + QDEL_NULL(connected) return ..() /obj/item/device/advanced_healthanalyzer/attack(mob/living/M, mob/living/user) - if(!internal_bodyscanner) + if(!connected) return + user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) + user.do_attack_animation(src) user.visible_message("[user] starts scanning \the [M] with \the [src].", SPAN_NOTICE("You start scanning \the [M] with \the [src].")) if(do_after(user, 7 SECONDS, M, DO_UNIQUE)) print_scan(M, user) @@ -716,22 +720,63 @@ BREATH ANALYZER /obj/item/device/advanced_healthanalyzer/proc/print_scan(var/mob/M, var/mob/living/user) var/obj/item/paper/medscan/R = new(user.loc) R.color = "#eeffe8" - R.set_content_unsafe("Scan ([M.name])", internal_bodyscanner.format_occupant_data(get_medical_data(M))) + R.set_content_unsafe("Scan ([M.name])", connected.format_occupant_data(get_occupant_data(M))) - if(ishuman(user) && !(user.l_hand && user.r_hand)) - user.put_in_hands(R) - user.visible_message("\The [src] spits out a piece of paper.") + connected.print(R, message = "\The [src] beeps, printing \the [R] after a moment.", user = user) -/obj/item/device/advanced_healthanalyzer/proc/get_medical_data(var/mob/living/carbon/human/H) +/obj/item/device/advanced_healthanalyzer/proc/get_occupant_data(var/mob/living/carbon/human/H) if (!ishuman(H)) return - var/list/medical_data = list( + var/displayed_stat = H.stat + var/blood_oxygenation = H.get_blood_oxygenation() + if(H.status_flags & FAKEDEATH) + displayed_stat = DEAD + blood_oxygenation = min(blood_oxygenation, BLOOD_VOLUME_SURVIVE) + switch(displayed_stat) + if(CONSCIOUS) + displayed_stat = "Conscious" + if(UNCONSCIOUS) + displayed_stat = "Unconscious" + if(DEAD) + displayed_stat = "DEAD" + + var/pulse_result + if(H.should_have_organ(BP_HEART)) + var/obj/item/organ/internal/heart/heart = H.internal_organs_by_name[BP_HEART] + if(!heart) + pulse_result = 0 + else if(BP_IS_ROBOTIC(heart)) + pulse_result = -2 + else if(H.status_flags & FAKEDEATH) + pulse_result = 0 + else + pulse_result = H.get_pulse(GETPULSE_TOOL) + else + pulse_result = -1 + + if(pulse_result == ">250") + pulse_result = -3 + + var/datum/reagents/R = H.bloodstr + + connected.has_internal_injuries = FALSE + connected.has_external_injuries = FALSE + var/list/bodyparts = connected.get_external_wound_data(H) + var/list/organs = connected.get_internal_wound_data(H) + + var/list/occupant_data = list( "stationtime" = worldtime2text(), + "stat" = displayed_stat, + "name" = H.name, + "species" = H.get_species(), + "brain_activity" = H.get_brain_status(), + "pulse" = text2num(pulse_result), "blood_volume" = H.get_blood_volume(), "blood_oxygenation" = H.get_blood_oxygenation(), "blood_pressure" = H.get_blood_pressure(), + "blood_type" = H.dna.b_type, "bruteloss" = get_severity(H.getBruteLoss(), TRUE), "fireloss" = get_severity(H.getFireLoss(), TRUE), @@ -743,18 +788,18 @@ BREATH ANALYZER "paralysis" = H.paralysis, "bodytemp" = H.bodytemperature, "borer_present" = H.has_brain_worms(), - "inaprovaline_amount" = REAGENT_VOLUME(H.reagents, /singleton/reagent/inaprovaline), - "dexalin_amount" = REAGENT_VOLUME(H.reagents, /singleton/reagent/dexalin), - "stoxin_amount" = REAGENT_VOLUME(H.reagents, /singleton/reagent/soporific), - "bicaridine_amount" = REAGENT_VOLUME(H.reagents, /singleton/reagent/bicaridine), - "dermaline_amount" = REAGENT_VOLUME(H.reagents, /singleton/reagent/dermaline), - "thetamycin_amount" = REAGENT_VOLUME(H.reagents, /singleton/reagent/thetamycin), - "blood_amount" = REAGENT_VOLUME(H.vessel, /singleton/reagent/blood), - "disabilities" = H.sdisabilities, - "lung_ruptured" = H.is_lung_ruptured(), - "lung_rescued" = H.is_lung_rescued(), - "external_organs" = H.organs.Copy(), - "internal_organs" = H.internal_organs.Copy(), - "species_organs" = H.species.has_organ + "inaprovaline_amount" = REAGENT_VOLUME(R, /singleton/reagent/inaprovaline), + "dexalin_amount" = REAGENT_VOLUME(R, /singleton/reagent/dexalin), + "soporific_amount" = REAGENT_VOLUME(R, /singleton/reagent/soporific), + "bicaridine_amount" = REAGENT_VOLUME(R, /singleton/reagent/bicaridine), + "dermaline_amount" = REAGENT_VOLUME(R, /singleton/reagent/dermaline), + "thetamycin_amount" = REAGENT_VOLUME(R, /singleton/reagent/thetamycin), + "other_amount" = R.total_volume - (REAGENT_VOLUME(R, /singleton/reagent/inaprovaline) + REAGENT_VOLUME(R, /singleton/reagent/soporific) + REAGENT_VOLUME(R, /singleton/reagent/bicaridine) + REAGENT_VOLUME(R, /singleton/reagent/dexalin) + REAGENT_VOLUME(R, /singleton/reagent/dermaline) + REAGENT_VOLUME(R, /singleton/reagent/thetamycin)), + "bodyparts" = bodyparts, + "organs" = organs, + "has_internal_injuries" = connected.has_internal_injuries, + "has_external_injuries" = connected.has_external_injuries, + "missing_limbs" = connected.get_missing_limbs(H), + "missing_organs" = connected.get_missing_organs(H) ) - return medical_data + return occupant_data diff --git a/code/game/sound.dm b/code/game/sound.dm index 5769f547fc8..de0d05632bb 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -964,3 +964,9 @@ 'sound/effects/creatures/hivebot/hivebot-bark-003.ogg', 'sound/effects/creatures/hivebot/hivebot-bark-005.ogg', ) + +/singleton/sound_category/print_sound + sounds = list( + 'sound/items/polaroid1.ogg', + 'sound/items/polaroid2.ogg' + ) diff --git a/code/modules/detectivework/microscope/dnascanner.dm b/code/modules/detectivework/microscope/dnascanner.dm index 94ae60516e7..2c6ab09d06a 100644 --- a/code/modules/detectivework/microscope/dnascanner.dm +++ b/code/modules/detectivework/microscope/dnascanner.dm @@ -120,7 +120,7 @@ info = "[src] analysis report #[report_num]
" info += "Scanned item: [bloodsamp.name]

" + data P.set_content_unsafe(pname, info) - print(P) + print(P, user = usr) scanning = 0 update_icon() return diff --git a/code/modules/detectivework/microscope/microscope.dm b/code/modules/detectivework/microscope/microscope.dm index fd735214aef..3ab2738b4c6 100644 --- a/code/modules/detectivework/microscope/microscope.dm +++ b/code/modules/detectivework/microscope/microscope.dm @@ -104,7 +104,7 @@ report.update_icon() if(report.info) to_chat(user, report.info) - print(report) + print(report, user) /obj/machinery/microscope/proc/remove_sample(var/mob/living/remover) if(!istype(remover) || remover.incapacitated() || !Adjacent(remover)) diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm index 83808f1e90f..edfc00474e7 100644 --- a/code/modules/economy/ATM.dm +++ b/code/modules/economy/ATM.dm @@ -66,11 +66,7 @@ for(var/obj/item/spacecash/S in src) S.forceMove(src.loc) - if(prob(50)) - playsound(loc, 'sound/items/polaroid1.ogg', 50, 1) - else - playsound(loc, 'sound/items/polaroid2.ogg', 50, 1) - break + playsound(loc, /singleton/sound_category/print_sound, 50, 1) /obj/machinery/atm/emag_act(var/remaining_charges, var/mob/user) if(emagged) @@ -110,10 +106,7 @@ if(istype(I,/obj/item/spacecash)) //consume the money authenticated_account.money += I:worth - if(prob(50)) - playsound(loc, 'sound/items/polaroid1.ogg', 50, 1) - else - playsound(loc, 'sound/items/polaroid2.ogg', 50, 1) + playsound(loc, /singleton/sound_category/print_sound, 50, 1) //create a transaction log entry var/datum/transaction/T = new() @@ -330,15 +323,12 @@ R.stamped += /obj/item/stamp R.add_overlay(stampoverlay) R.stamps += "
This paper has been stamped by the Automatic Teller Machine." - print(R) + print(R, user = usr) release_held_id(usr) // printing ends the ATM session similar to real life + prevents spam . = TRUE - if(prob(50)) - playsound(loc, 'sound/items/polaroid1.ogg', 50, 1) - else - playsound(loc, 'sound/items/polaroid2.ogg', 50, 1) + playsound(loc, /singleton/sound_category/print_sound, 50, 1) if ("print_transaction") if(authenticated_account) var/obj/item/paper/R = new() @@ -378,12 +368,9 @@ R.stamped += /obj/item/stamp R.add_overlay(stampoverlay) R.stamps += "
This paper has been stamped by the Automatic Teller Machine." - print(R) + print(R, user = usr) - if(prob(50)) - playsound(loc, 'sound/items/polaroid1.ogg', 50, 1) - else - playsound(loc, 'sound/items/polaroid2.ogg', 50, 1) + playsound(loc, /singleton/sound_category/print_sound, 50, 1) release_held_id(usr) // printing ends the ATM session similar to real life + prevents spam . = TRUE diff --git a/code/modules/heavy_vehicle/equipment/medical.dm b/code/modules/heavy_vehicle/equipment/medical.dm index 31abe381207..4cb878c41d4 100644 --- a/code/modules/heavy_vehicle/equipment/medical.dm +++ b/code/modules/heavy_vehicle/equipment/medical.dm @@ -299,13 +299,11 @@ to_chat(user, SPAN_NOTICE("You switch to \the [src]'s [HA.fullScan ? "full body" : "basic"] scan mode.")) /obj/item/device/healthanalyzer/mech/attack(mob/living/M, var/mob/living/heavy_vehicle/user) - sound_scan = FALSE - if(last_scan <= world.time - 20) //Spam limiter. - last_scan = world.time - sound_scan = TRUE + user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) + user.do_attack_animation(src) if(!fullScan) for(var/mob/pilot in user.pilots) - health_scan_mob(M, pilot, TRUE, TRUE, sound_scan = sound_scan) + health_scan_mob(M, pilot, TRUE, TRUE, sound_scan = TRUE) else user.visible_message("[user] starts scanning \the [M] with \the [src].", SPAN_NOTICE("You start scanning \the [M] with \the [src].")) if(do_after(user, 7 SECONDS)) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 288412695ec..4def206ee74 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -240,7 +240,7 @@ if(org.status & ORGAN_BROKEN) status += "hurts when touched" if(org.status & ORGAN_DEAD) - status += "is bruised and necrotic" + status += "is necrotic" if(!org.is_usable()) status += "dangling uselessly" if(org.status & ORGAN_BLEEDING) diff --git a/code/modules/mob/living/carbon/human/species/outsider/revenant.dm b/code/modules/mob/living/carbon/human/species/outsider/revenant.dm index 1bd709cc572..fc49f81d17f 100644 --- a/code/modules/mob/living/carbon/human/species/outsider/revenant.dm +++ b/code/modules/mob/living/carbon/human/species/outsider/revenant.dm @@ -67,9 +67,9 @@ ) has_limbs = list( + BP_HEAD = list("path" = /obj/item/organ/external/head/unbreakable/revenant), BP_CHEST = list("path" = /obj/item/organ/external/chest), BP_GROIN = list("path" = /obj/item/organ/external/groin), - BP_HEAD = list("path" = /obj/item/organ/external/head/unbreakable/revenant), BP_L_ARM = list("path" = /obj/item/organ/external/arm), BP_R_ARM = list("path" = /obj/item/organ/external/arm/right), BP_L_LEG = list("path" = /obj/item/organ/external/leg), diff --git a/code/modules/mob/living/carbon/human/species/outsider/undead.dm b/code/modules/mob/living/carbon/human/species/outsider/undead.dm index 8b3b9fed753..d8fd684b838 100644 --- a/code/modules/mob/living/carbon/human/species/outsider/undead.dm +++ b/code/modules/mob/living/carbon/human/species/outsider/undead.dm @@ -181,9 +181,9 @@ BP_STOMACH = /obj/item/organ/internal/stomach ) has_limbs = list( + BP_HEAD = list("path" = /obj/item/organ/external/head/zombie), BP_CHEST = list("path" = /obj/item/organ/external/chest/zombie), BP_GROIN = list("path" = /obj/item/organ/external/groin/zombie), - BP_HEAD = list("path" = /obj/item/organ/external/head/zombie), BP_L_ARM = list("path" = /obj/item/organ/external/arm/zombie), BP_R_ARM = list("path" = /obj/item/organ/external/arm/right/zombie), BP_L_LEG = list("path" = /obj/item/organ/external/leg/zombie), diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 1b68b455c15..a4399b80395 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -240,22 +240,22 @@ ///Determines the organs that the species spawns with and var/list/has_organ = list( // which required-organ checks are conducted. + BP_BRAIN = /obj/item/organ/internal/brain, + BP_EYES = /obj/item/organ/internal/eyes, BP_HEART = /obj/item/organ/internal/heart, BP_LUNGS = /obj/item/organ/internal/lungs, BP_LIVER = /obj/item/organ/internal/liver, BP_KIDNEYS = /obj/item/organ/internal/kidneys, BP_STOMACH = /obj/item/organ/internal/stomach, - BP_BRAIN = /obj/item/organ/internal/brain, - BP_APPENDIX = /obj/item/organ/internal/appendix, - BP_EYES = /obj/item/organ/internal/eyes + BP_APPENDIX = /obj/item/organ/internal/appendix ) var/vision_organ // If set, this organ is required for vision. Defaults to BP_EYES if the species has them. var/breathing_organ // If set, this organ is required to breathe. Defaults to BP_LUNGS if the species has them. var/list/has_limbs = list( + BP_HEAD = list("path" = /obj/item/organ/external/head), BP_CHEST = list("path" = /obj/item/organ/external/chest), BP_GROIN = list("path" = /obj/item/organ/external/groin), - BP_HEAD = list("path" = /obj/item/organ/external/head), BP_L_ARM = list("path" = /obj/item/organ/external/arm), BP_R_ARM = list("path" = /obj/item/organ/external/arm/right), BP_L_LEG = list("path" = /obj/item/organ/external/leg), diff --git a/code/modules/mob/living/carbon/human/species/station/diona/diona.dm b/code/modules/mob/living/carbon/human/species/station/diona/diona.dm index 7060dab22ce..cc067e84209 100644 --- a/code/modules/mob/living/carbon/human/species/station/diona/diona.dm +++ b/code/modules/mob/living/carbon/human/species/station/diona/diona.dm @@ -68,12 +68,12 @@ grab_mod = 0.6 // Viney Tentacles and shit to cling onto resist_mod = 1.5 // Reasonably stronk, not moreso than an Unathi or robot. - has_organ = list( BP_STOMACH = /obj/item/organ/internal/stomach/diona) + has_organ = list(BP_STOMACH = /obj/item/organ/internal/stomach/diona) has_limbs = list( + BP_HEAD = list("path" = /obj/item/organ/external/head/diona), BP_CHEST = list("path" = /obj/item/organ/external/chest/diona), BP_GROIN = list("path" = /obj/item/organ/external/groin/diona), - BP_HEAD = list("path" = /obj/item/organ/external/head/diona), BP_L_ARM = list("path" = /obj/item/organ/external/arm/diona), BP_R_ARM = list("path" = /obj/item/organ/external/arm/right/diona), BP_L_LEG = list("path" = /obj/item/organ/external/leg/diona), diff --git a/code/modules/mob/living/carbon/human/species/station/golem.dm b/code/modules/mob/living/carbon/human/species/station/golem.dm index 0523da6f417..0d9bc15ad7e 100644 --- a/code/modules/mob/living/carbon/human/species/station/golem.dm +++ b/code/modules/mob/living/carbon/human/species/station/golem.dm @@ -69,9 +69,9 @@ var/global/list/golem_types = list( ) has_limbs = list( + BP_HEAD = list("path" = /obj/item/organ/external/head/unbreakable), BP_CHEST = list("path" = /obj/item/organ/external/chest/unbreakable), BP_GROIN = list("path" = /obj/item/organ/external/groin/unbreakable), - BP_HEAD = list("path" = /obj/item/organ/external/head/unbreakable), BP_L_ARM = list("path" = /obj/item/organ/external/arm/unbreakable), BP_R_ARM = list("path" = /obj/item/organ/external/arm/right/unbreakable), BP_L_LEG = list("path" = /obj/item/organ/external/leg/unbreakable), diff --git a/code/modules/mob/living/carbon/human/species/station/ipc/ipc.dm b/code/modules/mob/living/carbon/human/species/station/ipc/ipc.dm index dfc5b838f87..48d02a70c00 100644 --- a/code/modules/mob/living/carbon/human/species/station/ipc/ipc.dm +++ b/code/modules/mob/living/carbon/human/species/station/ipc/ipc.dm @@ -97,9 +97,9 @@ vision_organ = BP_EYES has_limbs = list( + BP_HEAD = list("path" = /obj/item/organ/external/head/ipc), BP_CHEST = list("path" = /obj/item/organ/external/chest/ipc), BP_GROIN = list("path" = /obj/item/organ/external/groin/ipc), - BP_HEAD = list("path" = /obj/item/organ/external/head/ipc), BP_L_ARM = list("path" = /obj/item/organ/external/arm/ipc), BP_R_ARM = list("path" = /obj/item/organ/external/arm/right/ipc), BP_L_LEG = list("path" = /obj/item/organ/external/leg/ipc), diff --git a/code/modules/mob/living/carbon/human/species/station/monkey.dm b/code/modules/mob/living/carbon/human/species/station/monkey.dm index 7d9e3ffd13f..916dec46dd7 100644 --- a/code/modules/mob/living/carbon/human/species/station/monkey.dm +++ b/code/modules/mob/living/carbon/human/species/station/monkey.dm @@ -129,13 +129,13 @@ fall_mod = 0.25 has_organ = list( + BP_BRAIN = /obj/item/organ/internal/brain/skrell/neaera, + BP_EYES = /obj/item/organ/internal/eyes/skrell/neaera, BP_HEART = /obj/item/organ/internal/heart/skrell/neaera, BP_LUNGS = /obj/item/organ/internal/lungs/skrell/neaera, BP_LIVER = /obj/item/organ/internal/liver/skrell/neaera, BP_KIDNEYS = /obj/item/organ/internal/kidneys/skrell/neaera, - BP_BRAIN = /obj/item/organ/internal/brain/skrell/neaera, - BP_STOMACH = /obj/item/organ/internal/stomach, - BP_EYES = /obj/item/organ/internal/eyes/skrell/neaera + BP_STOMACH = /obj/item/organ/internal/stomach ) /datum/species/monkey/unathi diff --git a/code/modules/mob/living/carbon/human/species/station/skrell/skrell.dm b/code/modules/mob/living/carbon/human/species/station/skrell/skrell.dm index 2f325551b26..a777fe81ad1 100644 --- a/code/modules/mob/living/carbon/human/species/station/skrell/skrell.dm +++ b/code/modules/mob/living/carbon/human/species/station/skrell/skrell.dm @@ -46,9 +46,9 @@ possible_external_organs_modifications = list("Normal","Amputated","Prosthesis", "Diona Nymph") has_limbs = list( + BP_HEAD = list("path" = /obj/item/organ/external/head/skrell), BP_CHEST = list("path" = /obj/item/organ/external/chest), BP_GROIN = list("path" = /obj/item/organ/external/groin), - BP_HEAD = list("path" = /obj/item/organ/external/head/skrell), BP_L_ARM = list("path" = /obj/item/organ/external/arm), BP_R_ARM = list("path" = /obj/item/organ/external/arm/right), BP_L_LEG = list("path" = /obj/item/organ/external/leg), @@ -60,13 +60,13 @@ ) has_organ = list( + BP_BRAIN = /obj/item/organ/internal/brain/skrell, + BP_EYES = /obj/item/organ/internal/eyes/skrell, BP_HEART = /obj/item/organ/internal/heart/skrell, BP_LUNGS = /obj/item/organ/internal/lungs/skrell, BP_LIVER = /obj/item/organ/internal/liver/skrell, BP_KIDNEYS = /obj/item/organ/internal/kidneys/skrell, - BP_BRAIN = /obj/item/organ/internal/brain/skrell, - BP_STOMACH = /obj/item/organ/internal/stomach, - BP_EYES = /obj/item/organ/internal/eyes/skrell + BP_STOMACH = /obj/item/organ/internal/stomach ) pain_messages = list("I can't feel my headtails", "You really need some painkillers", "Stars above, the pain") diff --git a/code/modules/mob/living/carbon/human/species/station/slime.dm b/code/modules/mob/living/carbon/human/species/station/slime.dm index 7546bf76f29..d9c9cceaced 100644 --- a/code/modules/mob/living/carbon/human/species/station/slime.dm +++ b/code/modules/mob/living/carbon/human/species/station/slime.dm @@ -38,9 +38,9 @@ push_flags = MONKEY|SLIME|SIMPLE_ANIMAL has_limbs = list( + BP_HEAD = list("path" = /obj/item/organ/external/head/unbreakable), BP_CHEST = list("path" = /obj/item/organ/external/chest/unbreakable), BP_GROIN = list("path" = /obj/item/organ/external/groin/unbreakable), - BP_HEAD = list("path" = /obj/item/organ/external/head/unbreakable), BP_L_ARM = list("path" = /obj/item/organ/external/arm/unbreakable), BP_R_ARM = list("path" = /obj/item/organ/external/arm/right/unbreakable), BP_L_LEG = list("path" = /obj/item/organ/external/leg/unbreakable), diff --git a/code/modules/mob/living/carbon/human/species/station/tajara/tajara.dm b/code/modules/mob/living/carbon/human/species/station/tajara/tajara.dm index 78ca3720258..3f9bc06ef9a 100644 --- a/code/modules/mob/living/carbon/human/species/station/tajara/tajara.dm +++ b/code/modules/mob/living/carbon/human/species/station/tajara/tajara.dm @@ -109,14 +109,14 @@ zombie_type = SPECIES_ZOMBIE_TAJARA has_organ = list( + BP_BRAIN = /obj/item/organ/internal/brain/tajara, + BP_EYES = /obj/item/organ/internal/eyes/night, BP_HEART = /obj/item/organ/internal/heart/tajara, BP_LUNGS = /obj/item/organ/internal/lungs/tajara, BP_LIVER = /obj/item/organ/internal/liver/tajara, BP_KIDNEYS = /obj/item/organ/internal/kidneys/tajara, BP_STOMACH = /obj/item/organ/internal/stomach/tajara, - BP_BRAIN = /obj/item/organ/internal/brain/tajara, - BP_APPENDIX = /obj/item/organ/internal/appendix/tajara, - BP_EYES = /obj/item/organ/internal/eyes/night + BP_APPENDIX = /obj/item/organ/internal/appendix/tajara ) stomach_capacity = 6 diff --git a/code/modules/mob/living/carbon/human/species/station/tajara/tajaran_subspecies.dm b/code/modules/mob/living/carbon/human/species/station/tajara/tajaran_subspecies.dm index 6f5462a5c27..bd79f6b1b96 100644 --- a/code/modules/mob/living/carbon/human/species/station/tajara/tajaran_subspecies.dm +++ b/code/modules/mob/living/carbon/human/species/station/tajara/tajaran_subspecies.dm @@ -160,21 +160,21 @@ bodyfall_sound = /singleton/sound_category/bodyfall_machine_sound has_organ = list( + BP_BRAIN = /obj/item/organ/internal/brain/tajara, + BP_EYES = /obj/item/organ/internal/eyes/night, BP_HEART = /obj/item/organ/internal/heart/tajara/tesla_body, BP_LUNGS = /obj/item/organ/internal/lungs/tajara, BP_LIVER = /obj/item/organ/internal/liver/tajara, BP_KIDNEYS = /obj/item/organ/internal/kidneys/tajara, BP_STOMACH = /obj/item/organ/internal/stomach/tajara, - BP_BRAIN = /obj/item/organ/internal/brain/tajara, BP_APPENDIX = /obj/item/organ/internal/appendix/tajara, - BP_EYES = /obj/item/organ/internal/eyes/night, BP_AUG_TESLA = /obj/item/organ/internal/augment/tesla/massive ) has_limbs = list( + BP_HEAD = list("path" = /obj/item/organ/external/head), BP_CHEST = list("path" = /obj/item/organ/external/chest/tesla_body), BP_GROIN = list("path" = /obj/item/organ/external/groin/tesla_body), - BP_HEAD = list("path" = /obj/item/organ/external/head), BP_L_ARM = list("path" = /obj/item/organ/external/arm/tesla_body), BP_R_ARM = list("path" = /obj/item/organ/external/arm/right/tesla_body), BP_L_LEG = list("path" = /obj/item/organ/external/leg/tesla_body), diff --git a/code/modules/mob/living/carbon/human/species/station/unathi/unathi.dm b/code/modules/mob/living/carbon/human/species/station/unathi/unathi.dm index 6c0e7eaaf84..b89e0ed4a50 100644 --- a/code/modules/mob/living/carbon/human/species/station/unathi/unathi.dm +++ b/code/modules/mob/living/carbon/human/species/station/unathi/unathi.dm @@ -105,14 +105,14 @@ ) has_organ = list( - BP_BRAIN = /obj/item/organ/internal/brain/unathi, - BP_HEART = /obj/item/organ/internal/heart/unathi, - BP_LIVER = /obj/item/organ/internal/liver/unathi, - BP_LUNGS = /obj/item/organ/internal/lungs/unathi, - BP_KIDNEYS = /obj/item/organ/internal/kidneys/unathi, - BP_STOMACH = /obj/item/organ/internal/stomach/unathi, - BP_EYES = /obj/item/organ/internal/eyes/unathi - ) + BP_BRAIN = /obj/item/organ/internal/brain/unathi, + BP_EYES = /obj/item/organ/internal/eyes/unathi, + BP_HEART = /obj/item/organ/internal/heart/unathi, + BP_LIVER = /obj/item/organ/internal/liver/unathi, + BP_LUNGS = /obj/item/organ/internal/lungs/unathi, + BP_KIDNEYS = /obj/item/organ/internal/kidneys/unathi, + BP_STOMACH = /obj/item/organ/internal/stomach/unathi + ) alterable_internal_organs = list(BP_HEART, BP_EYES, BP_LUNGS, BP_LIVER, BP_KIDNEYS, BP_STOMACH) diff --git a/code/modules/mob/living/carbon/human/species/station/vaurca/vaurca.dm b/code/modules/mob/living/carbon/human/species/station/vaurca/vaurca.dm index 6572b1cfbe3..78567caca35 100644 --- a/code/modules/mob/living/carbon/human/species/station/vaurca/vaurca.dm +++ b/code/modules/mob/living/carbon/human/species/station/vaurca/vaurca.dm @@ -101,6 +101,8 @@ stamina_recovery = 2 //slow recovery has_organ = list( + BP_BRAIN = /obj/item/organ/internal/brain/vaurca, + BP_EYES = /obj/item/organ/internal/eyes/night/vaurca, BP_NEURAL_SOCKET = /obj/item/organ/internal/vaurca/neuralsocket, BP_LUNGS = /obj/item/organ/internal/lungs/vaurca, BP_FILTRATION_BIT = /obj/item/organ/internal/vaurca/filtrationbit, @@ -109,9 +111,7 @@ BP_LIVER = /obj/item/organ/internal/liver/vaurca, BP_KIDNEYS = /obj/item/organ/internal/kidneys/vaurca, BP_STOMACH = /obj/item/organ/internal/stomach/vaurca, - BP_APPENDIX = /obj/item/organ/internal/appendix/vaurca, - BP_BRAIN = /obj/item/organ/internal/brain/vaurca, - BP_EYES = /obj/item/organ/internal/eyes/night/vaurca + BP_APPENDIX = /obj/item/organ/internal/appendix/vaurca ) has_limbs = list( diff --git a/code/modules/mob/living/carbon/human/species/station/vaurca/vaurca_subspecies.dm b/code/modules/mob/living/carbon/human/species/station/vaurca/vaurca_subspecies.dm index 7e3570f043f..f0ad6f7c4eb 100644 --- a/code/modules/mob/living/carbon/human/species/station/vaurca/vaurca_subspecies.dm +++ b/code/modules/mob/living/carbon/human/species/station/vaurca/vaurca_subspecies.dm @@ -126,6 +126,8 @@ default_h_style = "Bald" has_organ = list( + BP_BRAIN = /obj/item/organ/internal/brain/vaurca, + BP_EYES = /obj/item/organ/internal/eyes/night/vaurca, BP_NEURAL_SOCKET = /obj/item/organ/internal/vaurca/neuralsocket/admin, BP_LUNGS = /obj/item/organ/internal/lungs/vaurca, BP_FILTRATION_BIT = /obj/item/organ/internal/vaurca/filtrationbit, @@ -135,8 +137,6 @@ BP_KIDNEYS = /obj/item/organ/internal/kidneys/vaurca, BP_STOMACH = /obj/item/organ/internal/stomach/vaurca, BP_APPENDIX = /obj/item/organ/internal/appendix/vaurca, - BP_BRAIN = /obj/item/organ/internal/brain/vaurca, - BP_EYES = /obj/item/organ/internal/eyes/night/vaurca, BP_HIVENET_SHIELD = /obj/item/organ/internal/augment/hiveshield ) @@ -213,6 +213,8 @@ ) has_organ = list( + BP_BRAIN = /obj/item/organ/internal/brain/vaurca, + BP_EYES = /obj/item/organ/internal/eyes/night/vaurca, BP_NEURAL_SOCKET = /obj/item/organ/internal/vaurca/neuralsocket, BP_LUNGS = /obj/item/organ/internal/lungs/vaurca, BP_HEART = /obj/item/organ/internal/heart/vaurca, @@ -220,8 +222,6 @@ BP_VAURCA_LIVER = /obj/item/organ/internal/liver/vaurca/robo, BP_VAURCA_KIDNEYS = /obj/item/organ/internal/kidneys/vaurca/robo, BP_STOMACH = /obj/item/organ/internal/stomach, - BP_BRAIN = /obj/item/organ/internal/brain/vaurca, - BP_EYES = /obj/item/organ/internal/eyes/night/vaurca, BP_FILTRATION_BIT = /obj/item/organ/internal/vaurca/filtrationbit, BP_HIVENET_SHIELD = /obj/item/organ/internal/augment/hiveshield/advanced ) diff --git a/code/modules/organs/internal/_internal.dm b/code/modules/organs/internal/_internal.dm index a20158c7947..41c30508a40 100644 --- a/code/modules/organs/internal/_internal.dm +++ b/code/modules/organs/internal/_internal.dm @@ -129,9 +129,9 @@ . = "damaged " if(status & ORGAN_DEAD) if(can_recover()) - . = "decaying [.]" + . = "necrotic and debridable [.]" else - . = "necrotic [.]" + . = "necrotic and dead [.]" . = "[.][name]" /obj/item/organ/internal/process() diff --git a/code/modules/organs/organ_stump.dm b/code/modules/organs/organ_stump.dm index a0d35476ea8..627dd40d389 100644 --- a/code/modules/organs/organ_stump.dm +++ b/code/modules/organs/organ_stump.dm @@ -5,6 +5,7 @@ /obj/item/organ/external/stump/Initialize(mapload, var/internal, var/obj/item/organ/external/limb) if(istype(limb)) + name = "[limb.name] stump" limb_name = limb.limb_name body_part = limb.body_part amputation_point = limb.amputation_point diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 33b94cb764d..60eb03a79d8 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -219,7 +219,7 @@ var/obj/machinery/photocopier/T = target flick(T.print_animation, target) --T.toner - target.print(c, use_sound, 'sound/bureaucracy/print.ogg', delay) + target.print(c, use_sound, 'sound/bureaucracy/print.ogg', delay, , user = usr) return c /proc/photocopy(var/obj/machinery/target, var/obj/item/photo/photocopy, var/toner) diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index 77574bbc507..54f3f7ebf0f 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -209,7 +209,7 @@ var/global/photo_count = 0 if(!on || !pictures_left || ismob(target.loc)) return captureimage(target, user, flag) - playsound(loc, pick('sound/items/polaroid1.ogg', 'sound/items/polaroid2.ogg'), 75, 1, -3) + playsound(loc, /singleton/sound_category/print_sound, 75, 1, -3) pictures_left-- to_chat(user, "[pictures_left] photos left.") diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 6b8a7db6ab4..d8f6cb2d17e 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -427,7 +427,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, info += GetResearchLevelsInfo() PR.set_content_unsafe(pname, info) - print(PR) + print(PR, user = usr) spawn(10) screen = ((text2num(href_list["print"]) == 2) ? 5.0 : 1.1) updateUsrDialog() diff --git a/code/modules/research/weaponsanalyzer.dm b/code/modules/research/weaponsanalyzer.dm index c7875be95b0..87d32967a08 100644 --- a/code/modules/research/weaponsanalyzer.dm +++ b/code/modules/research/weaponsanalyzer.dm @@ -282,7 +282,7 @@ var/obj/item/paper/R = new /obj/item/paper(get_turf(src)) R.color = "#fef8ff" R.set_content_unsafe("Weapon Analysis ([item.name])", get_print_info(item)) - print(R, message = "\The [src] beeps, printing \the [R] after a moment.") + print(R, message = "\The [src] beeps, printing \the [R] after a moment.", user = usr) /obj/machinery/weapons_analyzer/proc/get_print_info(var/obj/item/device) var/dat = "Analysis performed at [worldtime2text()]
" diff --git a/code/modules/research/xenoarchaeology/machinery/artifact_analyser.dm b/code/modules/research/xenoarchaeology/machinery/artifact_analyser.dm index 8c01f5a1b58..ea3e480471c 100644 --- a/code/modules/research/xenoarchaeology/machinery/artifact_analyser.dm +++ b/code/modules/research/xenoarchaeology/machinery/artifact_analyser.dm @@ -84,7 +84,7 @@ P.stamped = list(/obj/item/stamp) P.overlays = list("paper_stamped") P.set_content_unsafe(pname, info) - print(P) + print(P, user = usr) if(scanned_object && istype(scanned_object, /obj/machinery/artifact)) var/obj/machinery/artifact/A = scanned_object diff --git a/html/changelogs/wezzy_bodyscanner-better.yml b/html/changelogs/wezzy_bodyscanner-better.yml new file mode 100644 index 00000000000..f98784268f4 --- /dev/null +++ b/html/changelogs/wezzy_bodyscanner-better.yml @@ -0,0 +1,46 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +# balance +# admin +# backend +# security +# refactor +################################# + +# Your name. +author: Wowzewow (Wezzy) + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - imageadd: "Updated the sprites for Operating tables, Bodyscanner consoles, and freezers/heaters." + - rscadd: "Updates the Operating console to TGUI." + - rscadd: "Improves Bodyscanner UI and printed scans to look nicer and be more accurate." + - rscadd: "Printing stuff should now put the printed paper in your hands." + - rscadd: "Tweaked handheld health analyzers. Renamed the Zeng-hu health analyzer to the advanced health analyzer." + - maptweak: "Tweaks second body scanner floor decals in the GTR to match the other one." diff --git a/icons/mob/items/device/lefthand_device.dmi b/icons/mob/items/device/lefthand_device.dmi index c9d92a41368166587c9d2c3405d4df4d13d3b80e..a18d90369d3a610f8e718ca2f092a65baa6c44c4 100644 GIT binary patch delta 199 zcmV;&0671}FvT#CQ-8!;qk72{ryJ$zIe-A6L3*_GS@v(Q;d%Gc9-!H`>Pk^u@Svf7 z+^FK_Y#Knr_DK~3xzmt73Q3pXo9n;6X$E zxKYK`4atIr?UO1jxsy#Fg(OS_8dgU}u`5*!E(&O)1M99$`i^J9Me7yWaAHS7)zH2YS)10DSk^#F#`AG0(85f{MH BVTS+! diff --git a/icons/mob/items/device/righthand_device.dmi b/icons/mob/items/device/righthand_device.dmi index 0a5d0c7a1edb25cdae20f87d6082dd2620c0a500..4bc86f5adc1b7750b86a5bcf54a232b39d41edfc 100644 GIT binary patch delta 199 zcmV;&0671FF@Z6VQ-8!;qk72{ryJ$zIe-A6L3*_GS@v(Q;d%Gc9-!H`>Pk^u@Svf7 z+^FK_Y#Knr_DK~3xzmt73Q3pXo9n;6X$E zxKYK`4atIr?UO1jxsy#Fg(OS_8dgU}u`5*!E(&O)1M99$`i^J9Me7yWaAHS7)zH2YS)10DSk^#F#`AG0(8O&3|D BVLbo< diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index a75e16c47c7e64846a483dd97f2c662a7c493c2f..d048cb4ba8d4680359c656203f37054c4a766064 100644 GIT binary patch delta 932 zcmV;V16%y#ivr_|0+2d?%Z}SR3|%K*VYFLkkY}fxY%ZoKX3_qF!AOivj4Y{?oN4;? zcahx0POXR;TzC-#IOm9>_>w*s|9t!Y`m=cX@j5*q2XeO97VD?^bn;F*HpRABEvJ(P zscz!wPlyn)*cP7{p++04puk$>Pt%De4#l=uOecGW7DKTuzDy^78VwwaZLusb-&F+k zq55Bhf=3nEwHQ+hi*axj#^I~$g6nc!uBQ{mcd|OIG&^r3wfv|6=tK38?Y9K6{Yixn z+1((R*kr9e!Dc~$O<}i|5S37ihvaUq*a?(_bpT09m)+i(qySiJH{g z=yUme!)j4e*Jg>Ue!6(F&MM;qW_gRJO}Tj547h)^dry@7!VpNH& zxJ$I1F(06TL5^9k40`Utk-~heMQ4!}aAeYTzNcvPvAH`o_3YX7YyS>nL>7!2{{dx% zlUi>eh3iLu%)I=YRpEj1$1zTA(L@wflYR6qF);Nv-PwSGUVXwn*sFsxT_k6#$dDLi z#%im)u8NU~mefPC+qno9%<+#PR$8auC?6ymL#!gywLr3F@*Y{#D$ZE3W{a8>BqDAE z9~8;8$&#(*(hZ`-amuxxjO2#XQB=+uv4Sao;eyQv&yK89odM1#Tz9A>EwDRO zE_ILS6;bfWs2po#(t^>vPw>!%1mmU%%@YC!j_IQx9~Q>GarM)0Qa@Gh6&fQOt}jSg z!N0&C9>={SE4lBUaTTMk41@<5JJaEVl$sIkgB;(nH`0Z6rrR6fd`x;Kh4-IC`i}yZ zS}^B-qMFb60bG#u!USff2Hu1 z{YDlesS0eWuMFJP8!Ufy^yUSg@?FsigYn;@i)c;^oKd^j~bwF&7HX1(>tR G0~&&+yWeX7 delta 932 zcmV;V16%y#ivr_|0+2d?O^@O@5Iw`Mh-R*##pm=~xU71#>ch-mhzh$%O6}O*vO^F3 z>-PW)2@~U@waNh@z4u%$*O&dZ`0K~tufK|ypRdycav*1mZLxluPbcrBV^eI4)p9y% zkm@F${)7k-i*50R5o)xt3JR=6{xY3t;!tdh#dNY~XfYJq;@fn8qS3&y*cQw3@?Awh zAFBUFD0oznU5hcLuowqdVI01?F1Rk&<$5|{d?%~ZO0)AuQp=ADfId_Y*?vn9+n-eU zl-&)2iA~np6Koa~*aUWYwR2I9eVd-;U35Mi$CaLMg;w)&RW8f#gPjZQHcmlwz0>%f z*dJJ3MKqXIY+WROXXirPVjMSg)-7o%AZ>0*tH)N_8wh##?G1z`Va{rJPODxr$;89w z)b|ELv+Fn==vU8>)pu-3)S}TmxkyRuU6z}S%3b@%D^x>hbUyA*xJ2A-Mv}DWS;uGt zsrk$qosW$(dLcq%>m?XS6wXu_d-skU$iC$rbAcv&^KHa`H~ppZ3y^jDy$ELakf=$$ zjXsypH>?&lb#0co>Zgk*>#Q;^V3xOd+LVi@&4Bx%-Fu?sF9+!}WOa$tzQb`=6QfFG z#a*K9jQIo&406nRWzcgEjuhr&Ejo*=fFqNx^F2kQkImh&sb|loU;B3uBeG!J_zx&6 zoYZ;)DO^8)V&>(atO^g5KaO!~izcF=n(U)@iGiuV>COfe^y(At!CoDl=^{B>MTW#E zGge#WbybW^w4@%A-Ofd@V2&SxSZSSpqkNEP46%w(*8<6!$$Ml`t2krDnk{NlkchYu zd{89UCQG)KOE-uT$0^r(GLjokM^QOvkn`bi#R{f>gbOwwJUg;Zbp|+}aNVJjw7~9A zxzs(PS46=hqjIc~Nef2vKEXp55{#Q7G*1W^IHr$&d{`L!#??>1N&Qs0S7?lExV|7| z1^)tncpUeRtmM9X##M~EG7uhM>`aFbQffxD4|06R-bfePnQm`@^D*g}6yARl=|2is zYQda;i)udO2XH~s3nz?W)H+WJOz@H}w_}9ZRN_wKejgQBNp4?|l`NpI_*A7?|B=F1 z_8VD@q$;qfzA|uEZ?OEQqc<<`lqXx^@5rDA&l3{#EVZMXB<*(`CS#!9Qc3l%#gAVv#mmpv>Ax^OFuqv+KS#64 G0~&%w%h5jo diff --git a/icons/obj/sleeper.dmi b/icons/obj/sleeper.dmi index 8467f2661c049c9bcd7ca47cda04b7604ef66629..b0825198f239a5b0822f125d3ea19e09cb3d4d0c 100644 GIT binary patch literal 45882 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 rJL;evqMhIIdzvlN8mp0t6?L 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 vt)W@}q`X^Zn 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 diff --git a/maps/sccv_horizon/sccv_horizon-2_deck_2.dmm b/maps/sccv_horizon/sccv_horizon-2_deck_2.dmm index cbd726d2f4a..901e7d748e8 100644 --- a/maps/sccv_horizon/sccv_horizon-2_deck_2.dmm +++ b/maps/sccv_horizon/sccv_horizon-2_deck_2.dmm @@ -1116,6 +1116,14 @@ }, /turf/simulated/floor/wood, /area/horizon/library) +"axJ" = ( +/obj/machinery/iv_drip, +/obj/effect/floor_decal/industrial/warning{ + dir = 1 + }, +/obj/effect/floor_decal/industrial/outline/red, +/turf/simulated/floor/tiled/white, +/area/medical/gen_treatment) "axL" = ( /obj/machinery/light/small, /obj/effect/floor_decal/spline/fancy/wood, @@ -5625,11 +5633,8 @@ layer = 3.01; pixel_y = 6 }, -/obj/effect/floor_decal/industrial/warning{ - dir = 1 - }, -/obj/effect/floor_decal/sign/gtr, -/turf/simulated/floor/tiled/white, +/obj/effect/floor_decal/corner/beige/full, +/turf/simulated/floor/tiled/dark, /area/medical/gen_treatment) "cGM" = ( /obj/structure/cable/green{ @@ -7795,7 +7800,9 @@ /area/operations/mail_room) "dLo" = ( /obj/machinery/bodyscanner, -/obj/effect/floor_decal/corner/beige/full, +/obj/effect/floor_decal/corner/beige{ + dir = 9 + }, /turf/simulated/floor/tiled/dark, /area/medical/gen_treatment) "dLu" = ( @@ -16618,6 +16625,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, +/obj/effect/floor_decal/sign/gtr, /turf/simulated/floor/tiled/white, /area/medical/gen_treatment) "hQE" = ( @@ -17495,6 +17503,14 @@ }, /turf/simulated/floor/tiled, /area/engineering/lobby) +"imc" = ( +/obj/structure/bed/roller, +/obj/effect/floor_decal/industrial/warning/corner{ + dir = 4 + }, +/obj/effect/floor_decal/industrial/outline/medical, +/turf/simulated/floor/tiled/white, +/area/medical/gen_treatment) "imp" = ( /obj/effect/floor_decal/industrial/warning{ dir = 1 @@ -19360,8 +19376,8 @@ /obj/machinery/camera/network/medbay{ c_tag = "Medical - General Treatment 1" }, -/obj/effect/floor_decal/corner/beige/full{ - dir = 4 +/obj/effect/floor_decal/corner/beige{ + dir = 6 }, /turf/simulated/floor/tiled/dark, /area/medical/gen_treatment) @@ -25879,6 +25895,14 @@ /obj/random/loot, /turf/simulated/floor/plating, /area/maintenance/wing/starboard) +"mtc" = ( +/obj/structure/bed/roller, +/obj/effect/floor_decal/industrial/warning{ + dir = 1 + }, +/obj/effect/floor_decal/industrial/outline/medical, +/turf/simulated/floor/tiled/white, +/area/medical/gen_treatment) "mte" = ( /obj/effect/floor_decal/industrial/warning{ dir = 6 @@ -26531,10 +26555,13 @@ /turf/simulated/floor/tiled/full, /area/horizon/stairwell/central) "mIh" = ( -/obj/effect/floor_decal/industrial/warning{ +/obj/effect/floor_decal/corner/beige/full{ + dir = 4 + }, +/obj/effect/floor_decal/industrial/loading/yellow{ dir = 1 }, -/turf/simulated/floor/tiled/white, +/turf/simulated/floor/tiled/dark, /area/medical/gen_treatment) "mIN" = ( /obj/structure/platform_stairs/full/east_west_cap{ @@ -27482,6 +27509,9 @@ /obj/effect/floor_decal/industrial/warning/corner{ dir = 8 }, +/obj/effect/floor_decal/industrial/warning/corner{ + dir = 4 + }, /turf/simulated/floor/tiled/white, /area/medical/gen_treatment) "nbh" = ( @@ -28958,7 +28988,7 @@ /turf/simulated/floor/tiled/white, /area/medical/reception) "nLS" = ( -/obj/effect/floor_decal/industrial/warning/corner{ +/obj/effect/floor_decal/industrial/warning{ dir = 4 }, /turf/simulated/floor/tiled/white, @@ -34582,6 +34612,12 @@ /obj/effect/floor_decal/corner/mauve/diagonal, /turf/simulated/floor/tiled/white, /area/rnd/research) +"qBz" = ( +/obj/effect/floor_decal/industrial/warning/corner{ + dir = 4 + }, +/turf/simulated/wall, +/area/medical/icu) "qBF" = ( /obj/structure/lattice/catwalk/indoor/grate, /obj/structure/cable/green{ @@ -40143,6 +40179,20 @@ }, /turf/simulated/floor/tiled, /area/engineering/storage_eva) +"tnR" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/structure/cable/green{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/effect/floor_decal/industrial/warning{ + dir = 4 + }, +/obj/effect/floor_decal/industrial/warning{ + dir = 4 + }, +/turf/simulated/floor/tiled/white, +/area/medical/gen_treatment) "tnX" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -40885,6 +40935,9 @@ /obj/effect/floor_decal/industrial/loading/yellow{ dir = 4 }, +/obj/effect/floor_decal/industrial/warning{ + dir = 4 + }, /turf/simulated/floor/tiled/dark, /area/medical/gen_treatment) "tHI" = ( @@ -44216,6 +44269,9 @@ /obj/effect/floor_decal/industrial/warning{ dir = 1 }, +/obj/effect/floor_decal/industrial/warning{ + dir = 4 + }, /turf/simulated/floor/tiled/white, /area/medical/gen_treatment) "vmv" = ( @@ -45627,7 +45683,7 @@ input_tag = "cooling_in"; name = "Engine Cooling Control"; output_tag = "cooling_out"; - sensors = list("engine_sensor"="Engine Core") + sensors = list("engine_sensor"="Engine Core") }, /obj/machinery/camera/network/engineering{ c_tag = "Engineering - Supermatter Reactor Monitoring"; @@ -46295,6 +46351,12 @@ }, /turf/simulated/floor/plating, /area/engineering/engine_room) +"weX" = ( +/obj/effect/floor_decal/industrial/warning{ + dir = 8 + }, +/turf/simulated/floor/tiled/white, +/area/medical/gen_treatment) "weY" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -68504,7 +68566,7 @@ uky whU fyx nLS -whF +imc whF vsb ryP @@ -68706,7 +68768,7 @@ xQB vTY dLo cGJ -pJt +axJ pJt hQb dVw @@ -68903,12 +68965,12 @@ aDY wia wia wia -wia +qBz wia wia jhL mIh -whF +mtc whF vsb abD @@ -69109,9 +69171,9 @@ uhk vwc nbd abA +weX iyl xqE -xqE pUI bCl iIf @@ -69313,7 +69375,7 @@ uwi yay ruS rPf -rPf +tnR rQB oBZ pMB diff --git a/tgui/packages/tgui/interfaces/BodyScanner.tsx b/tgui/packages/tgui/interfaces/BodyScanner.tsx index 273b1a384d7..d87c591bdcb 100644 --- a/tgui/packages/tgui/interfaces/BodyScanner.tsx +++ b/tgui/packages/tgui/interfaces/BodyScanner.tsx @@ -21,6 +21,7 @@ export type ScannerData = { blood_pressure_level: number; blood_volume: number; blood_o2: number; + blood_type: string; rads: number; cloneLoss: string; @@ -43,6 +44,7 @@ export type ScannerData = { organs: InternalOrgan[]; has_internal_injuries: BooleanLike; has_external_injuries: BooleanLike; + missing_limbs: string; missing_organs: string; }; @@ -51,6 +53,7 @@ type Organ = { burn_damage: string; brute_damage: string; wounds: string; + infection: string; }; type InternalOrgan = { @@ -58,6 +61,7 @@ type InternalOrgan = { location: string; damage: string; wounds: string; + infection: string; }; export const BodyScanner = (props, context) => { @@ -76,17 +80,25 @@ export const InvalidWindow = (props, context) => { const { act, data } = useBackend(context); return ( -

- {data.nocons - ? 'No scanner bed detected.' - : !data.occupied - ? 'No occupant detected.' - : data.ipc - ? 'An object in the scanner bed is interfering with the sensor array.' - : data.noscan - ? 'No diagnostics profile installed for this species.' - : 'Unknown error.'} -
+ + + +
+
+ {data.nocons + ? 'No scanner bed detected.' + : !data.occupied + ? 'No occupant detected.' + : data.ipc + ? 'An object in the scanner bed is interfering with the sensor array.' + : data.noscan + ? 'No diagnostics profile installed for this species.' + : 'Unknown error.'} +
+
+
+
+
); }; @@ -97,50 +109,54 @@ export const ScannerWindow = (props, context) => { -
- - {data.name} - - {consciousnessText(data.stat)} - - - {data.species} - - - {data.pulse} - - - {brainText(data.brain_activity)} - - {data.stat < 2 ? : ''} - - - - - {Math.round(data.rads)} Gy - - - {data.cloneLoss} - - - {data.paralysis - ? Math.round(data.paralysis / 4) + ' Seconds Left' - : 'No paralysis detected.'} - - - {data.bodytemp}°C - - +
+
- - -
-
@@ -265,9 +305,9 @@ export const OrganWindow = (props, context) => { Name - Trauma - Wounds - Location + Damage + Complications + Immune {data.organs.sort().map((organ) => ( @@ -276,7 +316,7 @@ export const OrganWindow = (props, context) => { {organ.damage} {organ.wounds} - {organ.location} + {organ.infection} ))}
@@ -292,7 +332,8 @@ export const ExternalOrganWindow = (props, context) => { Name Brute Burn - Wounds + Complications + Immune {data.bodyparts.sort().map((organ) => ( @@ -304,6 +345,7 @@ export const ExternalOrganWindow = (props, context) => { {organ.burn_damage} {organ.wounds} + {organ.infection} ))} @@ -323,30 +365,16 @@ export const MissingOrgans = (props, context) => { ); }; -export const TraumaInfo = (props, context) => { +export const MissingLimbs = (props, context) => { const { act, data } = useBackend(context); return ( - <> - - {data.bruteLoss} - - - {data.oxyLoss} - - - {data.toxLoss} - - - {data.fireLoss} - - +
+ Missing limbs:{' '} + + {data.missing_limbs} + +
); }; diff --git a/tgui/packages/tgui/interfaces/Operating.tsx b/tgui/packages/tgui/interfaces/Operating.tsx new file mode 100644 index 00000000000..e504903531b --- /dev/null +++ b/tgui/packages/tgui/interfaces/Operating.tsx @@ -0,0 +1,174 @@ +import { BooleanLike } from '../../common/react'; +import { useBackend } from '../backend'; +import { BlockQuote, LabeledList, Section, Table } from '../components'; +import { Window } from '../layouts'; + +export type OperatingData = { + // Booleans for errors. + noscan: BooleanLike; + nocons: BooleanLike; + occupied: BooleanLike; + invalid: BooleanLike; + ipc: BooleanLike; + + // Occupant data. + stat: number; + name: string; + species: string; + brain_activity: number; + pulse: number; + blood_pressure: number; + blood_pressure_level: number; + blood_volume: number; + blood_o2: number; + blood_type: string; +}; + +export const Operating = (props, context) => { + const { act, data } = useBackend(context); + + return ( + + + {data.invalid ? : } + + + ); +}; + +export const InvalidWindow = (props, context) => { + const { act, data } = useBackend(context); + + return ( +
+
+ {data.nocons + ? 'No operating table detected.' + : !data.occupied + ? 'No occupant detected.' + : data.ipc + ? 'An object on the operating table is interfering with the sensor array.' + : data.noscan + ? 'No diagnostics profile installed for this species.' + : 'Unknown error.'} +
+
+ ); +}; + +export const OperatingWindow = (props, context) => { + const { act, data } = useBackend(context); + + return ( + + + +
+
+ + {data.name} + + {data.species} + + + {consciousnessText(data.stat)} + + + {brainText(data.brain_activity)} + + + {data.pulse} + + +
+
+ + + {data.blood_pressure} + + + {Math.round(data.blood_o2)}% + + + {Math.round(data.blood_volume)}% + + + {data.blood_type} + + +
+
+
+
+
+ ); +}; + +const consciousnessLabel = (value) => { + switch (value) { + case 0: + return 'green'; + case 1: + return 'average'; + case 2: + return 'bad'; + } +}; +const consciousnessText = (value) => { + switch (value) { + case 0: + return 'Conscious'; + case 1: + return 'Unconscious'; + case 2: + return 'DEAD'; + } +}; + +const progressClass = (value) => { + if (value <= 50) { + return 'bad'; + } else if (value <= 90) { + return 'average'; + } else { + return 'green'; + } +}; + +const brainText = (value) => { + switch (value) { + case 0: + return 'None, patient is braindead'; + case -1: + return 'ERROR - Non-Standard Biology'; + default: + return value.toString().concat('%'); + } +}; + +const getPressureClass = (tpressure) => { + switch (tpressure) { + case 1: + return 'red'; + case 2: + return 'green'; + case 3: + return 'good'; + case 4: + return 'red'; + default: + return 'teal'; + } +}; diff --git a/tgui/packages/tgui/interfaces/Sleeper.tsx b/tgui/packages/tgui/interfaces/Sleeper.tsx index 2929dcf182a..66063ece9cd 100644 --- a/tgui/packages/tgui/interfaces/Sleeper.tsx +++ b/tgui/packages/tgui/interfaces/Sleeper.tsx @@ -71,7 +71,7 @@ export const OccupantStatus = (props, context) => { title="Occupant Status" buttons={