From 25fb847e121bd32df9ea0677dcc499c1bd7a10e4 Mon Sep 17 00:00:00 2001 From: Geeves Date: Fri, 30 Apr 2021 00:47:12 +0200 Subject: [PATCH] Vitals Monitor (#11769) --- aurorastation.dme | 1 + code/game/objects/items/vitals_monitor.dm | 121 ++++++++++++++++++ .../structures/stool_bed_chair_nest/bed.dm | 40 +++++- .../geeves-rollerbed_vitals_monitor.yml | 6 + .../contained_items/tools/vitals_monitor.dmi | Bin 0 -> 526 bytes icons/obj/rollerbed.dmi | Bin 3669 -> 3674 bytes maps/aurora/aurora-4_mainlevel.dmm | 5 + .../components/view/devices/vitalsmonitor.vue | 71 ++++++++++ 8 files changed, 240 insertions(+), 4 deletions(-) create mode 100644 code/game/objects/items/vitals_monitor.dm create mode 100644 html/changelogs/geeves-rollerbed_vitals_monitor.yml create mode 100644 icons/obj/contained_items/tools/vitals_monitor.dmi create mode 100644 vueui/src/components/view/devices/vitalsmonitor.vue diff --git a/aurorastation.dme b/aurorastation.dme index 4b0c9a4ad81..ee05a5d16cd 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -814,6 +814,7 @@ #include "code\game\objects\items\tajara.dm" #include "code\game\objects\items\toys.dm" #include "code\game\objects\items\trash.dm" +#include "code\game\objects\items\vitals_monitor.dm" #include "code\game\objects\items\devices\aicard.dm" #include "code\game\objects\items\devices\augment_implanter.dm" #include "code\game\objects\items\devices\binoculars.dm" diff --git a/code/game/objects/items/vitals_monitor.dm b/code/game/objects/items/vitals_monitor.dm new file mode 100644 index 00000000000..548d2c13887 --- /dev/null +++ b/code/game/objects/items/vitals_monitor.dm @@ -0,0 +1,121 @@ +/obj/item/vitals_monitor + name = "vitals monitor" + desc = "A vitals monitor, used to track a patient's vitality. It needs to be attached to a rollerbed to function." + icon = 'icons/obj/contained_items/tools/vitals_monitor.dmi' + icon_state = "vitals_monitor" + item_state = "vitals_monitor" + contained_sprite = TRUE + + var/obj/structure/bed/roller/bed + var/reported_critical = FALSE + +/obj/item/vitals_monitor/process() + if(!bed) + return + + var/mob/living/carbon/human/H + if(bed?.buckled) + if(ishuman(bed.buckled)) + H = bed.buckled + else if(istype(bed.buckled, /obj/structure/closet)) + H = locate() in bed.buckled.contents + + if(!H) + return + + if(H.is_asystole()) + if(!reported_critical) + bed.visible_message(SPAN_WARNING("\The [src] flashes red!")) + playsound(bed.loc, 'sound/machines/airalarm.ogg', 70) + reported_critical = TRUE + update_icon() + else if(reported_critical) + bed.visible_message(SPAN_NOTICE("\The [src] returns to a normal green.")) + reported_critical = FALSE + update_icon() + +/obj/item/vitals_monitor/proc/update_monitor() + if(bed) + START_PROCESSING(SSprocessing, src) + else + STOP_PROCESSING(SSprocessing, src) + reported_critical = FALSE + update_icon() + +/obj/item/vitals_monitor/update_icon() + if(bed) + if(bed.density) + icon_state = "[initial(icon_state)]-bb" + layer = bed.buckled.layer + 0.1 + else + icon_state = "[initial(icon_state)]-b" + layer = bed.layer + 0.1 + else + icon_state = initial(icon_state) + layer = initial(layer) + if(reported_critical) + color = color_rotation(-120) + else + color = null + +/obj/item/vitals_monitor/CtrlClick(var/mob/user) + if(bed) + return bed.CtrlClick(user) + return ..() + +/obj/item/vitals_monitor/Click() // attack_hand doesn't work here because it's inside the rollerbed + if(bed && bed.Adjacent(usr)) + interact(usr) + return + return ..() + +/obj/item/vitals_monitor/interact(mob/user) + var/datum/vueui/ui = SSvueui.get_open_ui(user, src) + if(!ui) + ui = new(user, src, "devices-vitalsmonitor", 480, 250, capitalize_first_letters(name), set_state_object = bed) + ui.auto_update_content = TRUE + ui.open() + +/obj/item/vitals_monitor/vueui_data_change(var/list/data, var/mob/user, var/datum/vueui/ui) + if(!data) + data = list() + + var/mob/living/carbon/human/H + if(bed?.buckled) + if(ishuman(bed.buckled)) + H = bed.buckled + else if(istype(bed.buckled, /obj/structure/closet)) + H = locate() in bed.buckled.contents + + var/has_occupant = !isnull(H) + VUEUI_SET_CHECK(data["has_occupant"], has_occupant, ., data) + + if(has_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) + + 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 + + VUEUI_SET_CHECK(data["stat"], displayed_stat, ., data) + VUEUI_SET_CHECK(data["brain_activity"], H.get_brain_result(), ., data) + VUEUI_SET_CHECK(data["blood_pressure"], H.get_blood_pressure(), ., data) + VUEUI_SET_CHECK(data["blood_pressure_level"], H.get_blood_pressure_alert(), ., data) + VUEUI_SET_CHECK(data["blood_volume"], H.get_blood_volume(), ., data) + VUEUI_SET_CHECK(data["blood_o2"], blood_oxygenation, ., data) \ No newline at end of file diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index 37cf71184b7..c9ebd99f750 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -224,6 +224,7 @@ var/base_state = "standard" var/item_bedpath = /obj/item/roller var/obj/item/reagent_containers/beaker + var/obj/item/vitals_monitor/vitals var/iv_attached = 0 var/iv_stand = TRUE var/patient_shift = 9 //How much are mobs moved up when they are buckled_to. @@ -234,8 +235,15 @@ ..() LAZYADD(can_buckle, /obj/structure/closet/body_bag) +/obj/structure/bed/roller/Destroy() + QDEL_NULL(beaker) + vitals.bed = null + QDEL_NULL(vitals) + return ..() + /obj/structure/bed/roller/update_icon() - overlays.Cut() + cut_overlays() + vis_contents = list() if(density) icon_state = "[base_state]_up" else @@ -245,18 +253,31 @@ var/percentage = round((beaker.reagents.total_volume / beaker.volume) * 100, 25) var/image/filling = image(icon, "iv_filling[percentage]") filling.color = beaker.reagents.get_color() - iv.overlays += filling + iv.add_overlay(filling) if(percentage < 25) - iv.overlays += image(icon, "light_low") + iv.add_overlay(image(icon, "light_low")) if(density) iv.pixel_y = 6 - overlays += iv + add_overlay(iv) + if(vitals) + vitals.update_monitor() + vis_contents += vitals if(bag_strap && istype(buckled, /obj/structure/closet/body_bag)) LAZYADD(buckled.overlays, image(icon, bag_strap)) /obj/structure/bed/roller/attackby(obj/item/I, mob/user) if(iswrench(I) || istype(I, /obj/item/stack) || iswirecutter(I)) return 1 + if(istype(I, /obj/item/vitals_monitor)) + if(vitals) + to_chat(user, SPAN_WARNING("\The [src] already has a vitals monitor attached!")) + return + to_chat(user, SPAN_NOTICE("You attach \the [I] to \the [src].")) + user.drop_from_inventory(I, src) + vitals = I + vitals.bed = src + update_icon() + return if(iv_stand && !beaker && (istype(I, /obj/item/reagent_containers/glass/beaker) || istype(I, /obj/item/reagent_containers/blood))) if(!user.unEquip(I, target = src)) return @@ -295,6 +316,14 @@ beaker = null update_icon() +/obj/structure/bed/roller/proc/remove_vitals(mob/user) + to_chat(user, SPAN_NOTICE("You detach \the [vitals] from \the [src].")) + vitals.bed = null + vitals.update_monitor() + user.put_in_hands(vitals) + vitals = null + update_icon() + /obj/structure/bed/roller/proc/attach_iv(mob/living/carbon/human/target, mob/user) if(!beaker) return @@ -329,6 +358,9 @@ if(beaker) remove_beaker(usr) return + if(vitals) + remove_vitals(usr) + return if(buckled) return collapse() diff --git a/html/changelogs/geeves-rollerbed_vitals_monitor.yml b/html/changelogs/geeves-rollerbed_vitals_monitor.yml new file mode 100644 index 00000000000..8aa364f9476 --- /dev/null +++ b/html/changelogs/geeves-rollerbed_vitals_monitor.yml @@ -0,0 +1,6 @@ +author: Geeves + +delete-after: True + +changes: + - rscadd: "Added vitals monitors for rollerbeds, two mapped into medical's GTR." \ No newline at end of file diff --git a/icons/obj/contained_items/tools/vitals_monitor.dmi b/icons/obj/contained_items/tools/vitals_monitor.dmi new file mode 100644 index 0000000000000000000000000000000000000000..a8eb1df489786d3e8c2684203ab45cba2272d925 GIT binary patch literal 526 zcmV+p0`dKcP)iSoBr&HrJ~uxvvn0PriHkEOv#1y-VaUaqR+N~V z3Syf8MN@MUD?wUyzz~;y-6ZTL7~>A!-Zi#RVb8< z-GM7$tam{>L~N|bOOHy%pDkRKjNwv`d%jgNhV5gh(42$}a2{1jIVtH+w0phc3|-qk zBMs))2D4%ahwKcU0p))(^b07*qoM6N<$g7aM3q5uE@ literal 0 HcmV?d00001 diff --git a/icons/obj/rollerbed.dmi b/icons/obj/rollerbed.dmi index b664669fdf3cbfd2ff57890a4a878ee956c89ba2..4d63e5409d7f5bc0b8a23a0d573f4d780ad5bc39 100644 GIT binary patch delta 3483 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 +
+

Patient Vitals:

+ + +
+ + + \ No newline at end of file