From 36dc39053a6ff8b4b0f474b32eea62133d63399d Mon Sep 17 00:00:00 2001
From: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
Date: Sun, 4 Jan 2026 13:59:53 -0600
Subject: [PATCH] Medical larp: Adds vitals monitors to medbay (#94704)
## About The Pull Request
Adds vitals monitors to medbay
These are wall mounted monitors that display a patient's state visually:
- The doll on the left shows bodypart damage + missing bodyparts
- The droplet next to the head shows blood level, from a bright red to a
grey
- The top bar shows heart rate (an approximation - stops when dead,
speeds up in hard crit), as well as overall health
- The second to the top shows respiration (stops when not breathing)
- Second from the bottom bar shows oxyloss level
- Bottom bar shows toxloss level
You can **examine** a vitals display to get a condensed health analyzer
output to your chat. (This lets the AI see health scans as well)
They beep as patient conditions betters or worsens, though I didn't add
any sound FX to it (yet), it's just a runechat message.
They can link to most machines that accept an occupant - such as cryo
cells and stasis beds - as well as operating tables.
They are printable in two forms - basic and advanced, the latter
requiring tech and does advanced scans on examine, rather than basic
scans.
The displays are mapped in every surgical theatre, as well as over most
stasis beds and by a few cryo cells.
## Why It's Good For The Game
I made these to cut down on juggling the health analyzer when trying to
determine how a patient is faring. (And also to add to medical larp.)
Currently while monitoring a patient's state you have to spam click them
with your scanner and fill up your chat.
This is cumbersome and distracts you from the rest of chat.
The vitals display provides a visual feedback for how a patient is
doing, no spam clicking needed unless you need specific details like...
organ health.
Some other benefits:
- AI can now monitor patient health without a shell.
- Other doctors don't need to crowd around a patient, they can step back
to watch the screen instead.
- Visitors don't need to rush in and print an analyzer to see how a
patient is doing either.
## Changelog
:cl: Melbert
add: Adds vitals monitors, mapped into the medbay treatment center,
cryogenics, and every surgical theatre. They act as wall mounted health
scanners, providing visual feedback for a patient's health.
/:cl:
---
.../CatwalkStation/CatwalkStation_2023.dmm | 67 ++-
.../map_files/Deltastation/DeltaStation2.dmm | 33 +-
.../map_files/IceBoxStation/IceBoxStation.dmm | 22 +-
_maps/map_files/MetaStation/MetaStation.dmm | 78 ++-
.../map_files/NebulaStation/NebulaStation.dmm | 31 +-
_maps/map_files/debug/runtimestation.dmm | 1 +
_maps/map_files/generic/CentCom.dmm | 29 +-
_maps/map_files/tramstation/tramstation.dmm | 41 +-
_maps/map_files/wawastation/wawastation.dmm | 16 +-
.../dcs/signals/signals_operating_computer.dm | 6 +-
code/game/machinery/wall_vitals.dm | 538 ++++++++++++++++++
.../items/devices/scanners/health_analyzer.dm | 7 +-
code/game/objects/structures/tables_racks.dm | 1 +
.../research/designs/medical_designs.dm | 28 +
.../research/techweb/nodes/medbay_nodes.dm | 58 +-
icons/obj/machines/vitals_monitor.dmi | Bin 0 -> 1176 bytes
tgstation.dme | 1 +
17 files changed, 787 insertions(+), 170 deletions(-)
create mode 100644 code/game/machinery/wall_vitals.dm
create mode 100644 icons/obj/machines/vitals_monitor.dmi
diff --git a/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm b/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm
index 1b2d3a0e6b5..55a0ab29350 100644
--- a/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm
+++ b/_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm
@@ -2620,7 +2620,7 @@
/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{
dir = 8
},
-/obj/machinery/status_display/evac/directional/west,
+/obj/machinery/newscaster/directional/west,
/turf/open/floor/iron/white/textured_large,
/area/station/medical/medbay/central)
"aKJ" = (
@@ -5968,10 +5968,10 @@
"bEU" = (
/obj/structure/extinguisher_cabinet/directional/west,
/obj/machinery/camera/autoname/directional/south,
-/obj/machinery/light_switch/directional/south,
/obj/machinery/computer/operating{
dir = 4
},
+/obj/machinery/vitals_reader/directional/south,
/turf/open/floor/iron/dark/textured_corner{
dir = 4
},
@@ -16264,10 +16264,7 @@
/obj/effect/turf_decal/tile/blue/opposingcorners{
dir = 1
},
-/obj/structure/sign/warning/cold_temp/directional/east{
- name = "Cryogenics";
- pixel_x = 26
- },
+/obj/structure/sign/warning/cold_temp/directional/east,
/turf/open/floor/iron/white,
/area/station/medical/medbay/central)
"eta" = (
@@ -20589,7 +20586,7 @@
dir = 8
},
/obj/effect/turf_decal/trimline/blue/filled/mid_joiner,
-/obj/machinery/newscaster/directional/west,
+/obj/machinery/vitals_reader/directional/west,
/turf/open/floor/iron/white/textured_large,
/area/station/medical/medbay/central)
"fFq" = (
@@ -22772,7 +22769,7 @@
/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{
dir = 8
},
-/obj/machinery/status_display/ai/directional/west,
+/obj/machinery/airalarm/directional/west,
/turf/open/floor/iron/white/textured_large,
/area/station/medical/medbay/central)
"ghV" = (
@@ -32468,9 +32465,6 @@
network = list("ss13","medbay");
c_tag = "Medbay - Lower Central Hallway"
},
-/obj/machinery/firealarm/directional/west{
- pixel_x = -20
- },
/turf/open/floor/iron/white,
/area/station/medical/medbay/central)
"iKm" = (
@@ -38122,9 +38116,6 @@
},
/obj/structure/tank_holder/extinguisher,
/obj/structure/cable,
-/obj/machinery/light_switch/directional/west{
- pixel_x = -22
- },
/turf/open/floor/iron/dark,
/area/station/medical/cryo)
"knj" = (
@@ -46936,11 +46927,6 @@
/turf/open/floor/iron,
/area/station/cargo/storage)
"mDX" = (
-/obj/structure/bed/pod{
- desc = "An old medical bed, just waiting for replacement with something up to date.";
- name = "medical bed";
- dir = 1
- },
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 8
},
@@ -46948,6 +46934,9 @@
/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{
dir = 8
},
+/obj/machinery/stasis{
+ dir = 4
+ },
/turf/open/floor/iron/white/textured_large,
/area/station/medical/medbay/central)
"mDZ" = (
@@ -52406,8 +52395,13 @@
},
/area/station/hallway/primary/fore)
"ofr" = (
-/obj/machinery/firealarm/directional/east,
+/obj/machinery/firealarm/directional/east{
+ pixel_y = -6
+ },
/obj/machinery/atmospherics/components/unary/thermomachine/freezer,
+/obj/machinery/light_switch/directional/east{
+ pixel_y = 4
+ },
/turf/open/floor/iron/dark,
/area/station/medical/cryo)
"ofs" = (
@@ -55231,7 +55225,6 @@
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 9
},
-/obj/machinery/airalarm/directional/west,
/obj/item/radio/intercom/directional/north,
/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{
dir = 1
@@ -55240,6 +55233,7 @@
dir = 8
},
/obj/item/stack/medical/mesh,
+/obj/machinery/vitals_reader/directional/west,
/turf/open/floor/iron/white/textured_large,
/area/station/medical/medbay/central)
"oTZ" = (
@@ -71461,6 +71455,7 @@
dir = 1
},
/obj/machinery/computer/crew,
+/obj/machinery/status_display/ai/directional/north,
/turf/open/floor/iron/white,
/area/station/medical/medbay/central)
"tqv" = (
@@ -73952,10 +73947,8 @@
/obj/structure/disposalpipe/trunk{
dir = 8
},
-/obj/machinery/firealarm/directional/east{
- pixel_x = 20
- },
/obj/machinery/disposal/bin,
+/obj/machinery/firealarm/directional/east,
/turf/open/floor/iron/dark/smooth_large,
/area/station/medical/surgery)
"tYE" = (
@@ -78116,6 +78109,17 @@
/obj/effect/turf_decal/trimline/dark_green,
/turf/open/floor/iron/dark,
/area/station/engineering/atmos/upper)
+"vcG" = (
+/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
+/obj/effect/turf_decal/tile/blue/opposingcorners{
+ dir = 1
+ },
+/obj/structure/cable,
+/obj/structure/disposalpipe/segment,
+/obj/machinery/firealarm/directional/east,
+/turf/open/floor/iron/white,
+/area/station/medical/medbay/central)
"vcH" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
@@ -82752,7 +82756,10 @@
/turf/open/floor/iron/dark,
/area/station/medical/cryo)
"wqq" = (
-/obj/machinery/stasis,
+/obj/structure/bed/pod{
+ desc = "An old medical bed, just waiting for replacement with something up to date.";
+ name = "medical bed"
+ },
/turf/open/floor/iron/white/textured_large,
/area/station/medical/medbay/central)
"wqB" = (
@@ -83753,6 +83760,7 @@
/obj/machinery/computer/operating{
dir = 8
},
+/obj/machinery/vitals_reader/directional/south,
/turf/open/floor/iron/dark/textured_corner{
dir = 1
},
@@ -86459,6 +86467,7 @@
dir = 1
},
/obj/effect/turf_decal/siding/blue,
+/obj/structure/tank_holder/extinguisher,
/turf/open/floor/iron/white,
/area/station/medical/medbay/central)
"xsh" = (
@@ -88691,10 +88700,10 @@
/obj/item/storage/box/gloves{
pixel_y = 10
},
-/obj/structure/extinguisher_cabinet/directional/west,
/obj/effect/turf_decal/trimline/blue/filled/mid_joiner{
dir = 8
},
+/obj/machinery/status_display/evac/directional/west,
/turf/open/floor/iron/white/textured_large,
/area/station/medical/medbay/central)
"xUT" = (
@@ -119131,7 +119140,7 @@ tYC
qdd
uSP
wER
-oZn
+ccN
xeM
fYF
kLI
@@ -119643,8 +119652,8 @@ xsD
viV
iKa
uNT
-pMm
xeM
+pMm
xeM
xeM
siR
@@ -119902,7 +119911,7 @@ oOS
aJR
pTV
eZE
-gPC
+vcG
gPC
ovh
ljq
diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index 17f79580956..e671c1cc88f 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -31136,7 +31136,6 @@
/turf/open/floor/iron,
/area/station/commons/storage/tools)
"hJn" = (
-/obj/structure/extinguisher_cabinet/directional/north,
/obj/item/stack/medical/gauze,
/obj/item/stack/medical/suture,
/obj/machinery/camera/directional/north{
@@ -31146,6 +31145,7 @@
},
/obj/structure/table/reinforced/rglass,
/obj/effect/turf_decal/tile/blue/fourcorners,
+/obj/machinery/firealarm/directional/north,
/turf/open/floor/iron,
/area/station/medical/treatment_center)
"hJo" = (
@@ -36792,6 +36792,7 @@
},
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/effect/turf_decal/bot_white,
+/obj/machinery/vitals_reader/directional/south,
/turf/open/floor/iron/dark,
/area/station/medical/surgery/theatre)
"jdg" = (
@@ -38037,6 +38038,7 @@
/obj/item/storage/box/rxglasses,
/obj/structure/table/reinforced/rglass,
/obj/effect/turf_decal/tile/blue/fourcorners,
+/obj/item/radio/intercom/directional/south,
/turf/open/floor/iron,
/area/station/medical/treatment_center)
"jsh" = (
@@ -40141,7 +40143,6 @@
/area/station/hallway/secondary/exit/departure_lounge)
"jRJ" = (
/obj/machinery/defibrillator_mount/directional/south,
-/obj/item/radio/intercom/directional/west,
/obj/item/emergency_bed{
pixel_y = 6
},
@@ -40150,6 +40151,7 @@
},
/obj/structure/table/reinforced/rglass,
/obj/effect/turf_decal/tile/blue/fourcorners,
+/obj/machinery/vitals_reader/directional/west,
/turf/open/floor/iron,
/area/station/medical/treatment_center)
"jRL" = (
@@ -44333,6 +44335,7 @@
/obj/item/reagent_containers/syringe,
/obj/structure/table/reinforced/rglass,
/obj/effect/turf_decal/tile/blue/fourcorners,
+/obj/machinery/vitals_reader/directional/west,
/turf/open/floor/iron,
/area/station/medical/treatment_center)
"kXb" = (
@@ -46091,7 +46094,6 @@
/area/station/maintenance/disposal/incinerator)
"ltz" = (
/obj/machinery/defibrillator_mount/directional/north,
-/obj/item/radio/intercom/directional/east,
/obj/item/storage/box/bodybags{
pixel_x = 3;
pixel_y = 3
@@ -46099,6 +46101,7 @@
/obj/item/storage/box/masks,
/obj/structure/table/reinforced/rglass,
/obj/effect/turf_decal/tile/blue/fourcorners,
+/obj/machinery/vitals_reader/directional/east,
/turf/open/floor/iron,
/area/station/medical/treatment_center)
"ltD" = (
@@ -47417,13 +47420,6 @@
},
/turf/open/floor/iron,
/area/station/cargo/warehouse)
-"lIG" = (
-/obj/structure/table/optable,
-/obj/effect/turf_decal/tile/neutral/fourcorners,
-/obj/machinery/status_display/ai/directional/south,
-/obj/effect/turf_decal/bot_red,
-/turf/open/floor/iron/dark,
-/area/station/medical/surgery/theatre)
"lII" = (
/obj/structure/railing,
/obj/structure/chair/sofa/bench{
@@ -54928,11 +54924,11 @@
/area/station/hallway/primary/central/fore)
"nFO" = (
/obj/machinery/firealarm/directional/east,
-/obj/structure/extinguisher_cabinet/directional/north,
/obj/item/kirbyplants/random,
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
+/obj/structure/extinguisher_cabinet/directional/north,
/turf/open/floor/iron,
/area/station/medical/storage)
"nFV" = (
@@ -55254,12 +55250,12 @@
/turf/open/floor/iron,
/area/station/security/prison)
"nJh" = (
-/obj/machinery/firealarm/directional/north,
/obj/item/stack/medical/gauze,
/obj/item/stack/medical/mesh,
/obj/structure/table/reinforced/rglass,
/obj/effect/turf_decal/tile/blue/fourcorners,
/obj/machinery/light/cold/directional/north,
+/obj/item/radio/intercom/directional/north,
/turf/open/floor/iron,
/area/station/medical/treatment_center)
"nJj" = (
@@ -72194,6 +72190,7 @@
},
/obj/structure/extinguisher_cabinet/directional/west,
/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/machinery/firealarm/directional/south,
/turf/open/floor/iron,
/area/station/medical/surgery/theatre)
"rSZ" = (
@@ -73809,7 +73806,6 @@
},
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/machinery/light/small/directional/east,
-/obj/structure/sign/poster/official/random/directional/east,
/turf/open/floor/iron/textured,
/area/station/medical/medbay)
"snE" = (
@@ -75723,7 +75719,6 @@
pixel_x = -3
},
/obj/structure/window/reinforced/spawner/directional/west,
-/obj/machinery/status_display/evac/directional/south,
/obj/machinery/door/window/left/directional/north{
name = "Surgical Supplies";
req_access = list("surgery")
@@ -81063,7 +81058,7 @@
/obj/machinery/computer/operating,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/obj/effect/turf_decal/bot_white,
-/obj/machinery/firealarm/directional/east,
+/obj/machinery/vitals_reader/directional/north,
/turf/open/floor/iron/dark,
/area/station/medical/surgery/theatre)
"ubL" = (
@@ -82767,6 +82762,7 @@
/obj/structure/bodycontainer/morgue{
dir = 2
},
+/obj/machinery/status_display/evac/directional/north,
/turf/open/floor/iron/dark/textured_half{
dir = 1
},
@@ -83139,10 +83135,10 @@
/obj/effect/turf_decal/trimline/neutral/mid_joiner{
dir = 8
},
-/obj/machinery/status_display/evac/directional/north,
/obj/structure/bodycontainer/morgue{
dir = 2
},
+/obj/machinery/status_display/ai/directional/north,
/turf/open/floor/iron/dark/textured_half{
dir = 1
},
@@ -84008,7 +84004,6 @@
/turf/open/floor/iron,
/area/station/engineering/break_room)
"uLx" = (
-/obj/machinery/status_display/ai/directional/south,
/obj/effect/turf_decal/siding/thinplating/dark/corner,
/obj/effect/turf_decal/siding/thinplating/dark{
dir = 8
@@ -91202,6 +91197,7 @@
dir = 8
},
/obj/effect/turf_decal/tile/neutral/fourcorners,
+/obj/structure/extinguisher_cabinet/directional/east,
/turf/open/floor/iron,
/area/station/medical/treatment_center)
"wCc" = (
@@ -95027,7 +95023,6 @@
/area/station/security/detectives_office/private_investigators_office)
"xAr" = (
/obj/structure/mannequin/skeleton,
-/obj/machinery/status_display/ai/directional/north,
/obj/effect/turf_decal/tile/dark_blue/half/contrasted{
dir = 1
},
@@ -138664,7 +138659,7 @@ tOS
fCD
jqJ
jqJ
-lIG
+fCD
qYL
xAr
xBJ
diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
index bf6538a41c4..cd3eaa228e7 100644
--- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm
+++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
@@ -6753,7 +6753,6 @@
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/machinery/newscaster/directional/south,
/obj/machinery/camera/directional/south{
c_tag = "Medbay North";
network = list("ss13","medbay")
@@ -9300,6 +9299,7 @@
c_tag = "Surgery A";
network = list("ss13","medbay")
},
+/obj/machinery/newscaster/directional/north,
/turf/open/floor/iron/white,
/area/station/medical/surgery/fore)
"cyA" = (
@@ -13277,7 +13277,7 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
-/obj/machinery/firealarm/directional/north,
+/obj/machinery/airalarm/directional/north,
/turf/open/floor/iron/white,
/area/station/medical/medbay/central)
"dDV" = (
@@ -22303,6 +22303,7 @@
},
/obj/item/reagent_containers/syringe,
/obj/effect/turf_decal/tile/blue/full,
+/obj/machinery/vitals_reader/directional/north,
/turf/open/floor/iron/large,
/area/station/medical/treatment_center)
"gkY" = (
@@ -41573,6 +41574,7 @@
/area/station/tcommsat/computer)
"lIP" = (
/obj/effect/mapping_helpers/trapdoor_placer,
+/obj/item/radio/intercom/directional/north,
/turf/open/floor/catwalk_floor/iron_white,
/area/station/medical/medbay/central)
"lIQ" = (
@@ -43221,10 +43223,10 @@
/area/station/hallway/secondary/entry)
"mjH" = (
/obj/structure/table/optable,
-/obj/machinery/newscaster/directional/east,
/obj/effect/turf_decal/tile/blue/half/contrasted{
dir = 4
},
+/obj/machinery/vitals_reader/directional/east,
/turf/open/floor/iron/white,
/area/station/medical/surgery/fore)
"mjI" = (
@@ -47054,10 +47056,10 @@
/area/icemoon/surface/outdoors/less_spawns)
"nqd" = (
/obj/structure/table/optable,
-/obj/machinery/newscaster/directional/east,
/obj/effect/turf_decal/tile/blue/half/contrasted{
dir = 4
},
+/obj/machinery/vitals_reader/directional/east,
/turf/open/floor/iron/white,
/area/station/medical/surgery/aft)
"nqn" = (
@@ -49062,7 +49064,7 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/effect/turf_decal/trimline/blue/filled/line,
-/obj/machinery/airalarm/directional/south,
+/obj/machinery/newscaster/directional/south,
/turf/open/floor/iron/white,
/area/station/medical/medbay/central)
"nRm" = (
@@ -54201,6 +54203,7 @@
c_tag = "Surgery B";
network = list("ss13","medbay")
},
+/obj/machinery/newscaster/directional/south,
/turf/open/floor/iron/white,
/area/station/medical/surgery/aft)
"pkf" = (
@@ -57463,6 +57466,7 @@
/obj/item/reagent_containers/syringe,
/obj/effect/turf_decal/tile/blue/full,
/obj/item/radio/intercom/directional/west,
+/obj/machinery/vitals_reader/directional/north,
/turf/open/floor/iron/large,
/area/station/medical/treatment_center)
"qfs" = (
@@ -71052,12 +71056,6 @@
/obj/effect/spawner/random/maintenance,
/turf/open/floor/plating,
/area/station/maintenance/port/aft)
-"tXc" = (
-/obj/effect/turf_decal/trimline/blue/filled/line,
-/obj/structure/cable,
-/obj/item/radio/intercom/directional/south,
-/turf/open/floor/iron/white,
-/area/station/medical/medbay/central)
"tXh" = (
/obj/structure/disposalpipe/segment,
/obj/structure/cable,
@@ -254872,7 +254870,7 @@ mjI
fCM
dIL
hDq
-tXc
+pZm
lwQ
gkX
oeW
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index e8234f1482a..dd8fc524563 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -1099,7 +1099,6 @@
/obj/structure/disposalpipe/segment{
dir = 10
},
-/obj/structure/cable,
/turf/open/floor/iron/white/smooth_half,
/area/station/medical/cryo)
"avc" = (
@@ -1539,7 +1538,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 1
},
-/obj/machinery/firealarm/directional/west,
+/obj/machinery/airalarm/directional/west,
/turf/open/floor/iron/dark,
/area/station/medical/cryo)
"aDa" = (
@@ -3600,6 +3599,7 @@
/obj/structure/table/glass,
/obj/item/surgicaldrill,
/obj/item/toy/figure/paramedic,
+/obj/item/radio/intercom/directional/south,
/turf/open/floor/iron/dark/smooth_large,
/area/station/medical/paramedic)
"bnx" = (
@@ -5921,8 +5921,8 @@
dir = 4
},
/obj/machinery/suit_storage_unit/medical,
-/obj/structure/extinguisher_cabinet/directional/west,
-/obj/structure/sign/clock/directional/north,
+/obj/machinery/airalarm/directional/west,
+/obj/machinery/digital_clock/directional/north,
/turf/open/floor/iron/dark/smooth_large,
/area/station/medical/paramedic)
"ccc" = (
@@ -10777,7 +10777,6 @@
dir = 1
},
/obj/machinery/duct,
-/obj/structure/cable,
/turf/open/floor/iron/white/smooth_half,
/area/station/medical/cryo)
"dOA" = (
@@ -17817,7 +17816,7 @@
"gmN" = (
/obj/structure/table/glass,
/obj/effect/turf_decal/tile/blue/fourcorners,
-/obj/machinery/status_display/evac/directional/west,
+/obj/machinery/newscaster/directional/west,
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"gmS" = (
@@ -18209,7 +18208,6 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
-/obj/structure/cable,
/turf/open/floor/iron/white/smooth_half,
/area/station/medical/cryo)
"gtm" = (
@@ -18353,7 +18351,7 @@
dir = 10
},
/obj/structure/cable,
-/obj/structure/sign/eyechart/directional/west,
+/obj/machinery/power/apc/auto_name/directional/west,
/turf/open/floor/iron/white,
/area/station/medical/cryo)
"gvg" = (
@@ -24340,7 +24338,8 @@
"iwj" = (
/obj/structure/table/glass,
/obj/effect/turf_decal/tile/blue/fourcorners,
-/obj/machinery/status_display/evac/directional/east,
+/obj/machinery/vitals_reader/directional/north,
+/obj/machinery/newscaster/directional/east,
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"iwt" = (
@@ -24532,7 +24531,6 @@
/turf/open/floor/iron/dark,
/area/station/security/courtroom)
"izs" = (
-/obj/structure/cable,
/obj/structure/sink/directional/east,
/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible,
/obj/effect/turf_decal/tile/blue/fourcorners,
@@ -25665,8 +25663,7 @@
"iRy" = (
/obj/structure/table/reinforced,
/obj/machinery/cell_charger,
-/obj/item/radio/intercom/directional/west,
-/obj/machinery/firealarm/directional/north,
+/obj/machinery/firealarm/directional/west,
/turf/open/floor/iron/dark,
/area/station/medical/storage)
"iRW" = (
@@ -29456,6 +29453,7 @@
c_tag = "Medbay Storage";
network = list("ss13","medbay")
},
+/obj/item/radio/intercom/directional/north,
/turf/open/floor/iron/dark,
/area/station/medical/storage)
"kdx" = (
@@ -30163,8 +30161,8 @@
"kpi" = (
/obj/structure/table/glass,
/obj/effect/turf_decal/tile/blue/fourcorners,
-/obj/machinery/status_display/ai/directional/west,
-/obj/item/radio/intercom/directional/north,
+/obj/machinery/vitals_reader/directional/north,
+/obj/item/radio/intercom/directional/west,
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"kpB" = (
@@ -30925,6 +30923,7 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/light/directional/west,
+/obj/item/radio/intercom/directional/west,
/turf/open/floor/iron/white,
/area/station/medical/medbay/central)
"kDb" = (
@@ -32261,14 +32260,6 @@
},
/turf/open/floor/iron,
/area/station/commons/fitness/recreation)
-"kZv" = (
-/obj/structure/cable,
-/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
-/obj/structure/sign/poster/contraband/random/directional/east,
-/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden/layer5,
-/turf/open/floor/plating,
-/area/station/maintenance/port/aft)
"kZx" = (
/turf/closed/wall,
/area/station/science/lab)
@@ -32456,8 +32447,9 @@
"ldm" = (
/obj/structure/table/glass,
/obj/effect/turf_decal/tile/blue/fourcorners,
-/obj/machinery/status_display/evac/directional/west,
/obj/effect/spawner/surgery_tray/full,
+/obj/machinery/digital_clock/directional/north,
+/obj/structure/sign/poster/official/cleanliness/directional/west,
/turf/open/floor/iron/white,
/area/station/medical/surgery/theatre)
"lds" = (
@@ -33531,10 +33523,10 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/door/firedoor,
/obj/effect/turf_decal/tile/blue/fourcorners,
-/obj/machinery/door/airlock/medical/glass{
- name = "Cryogenics Bay"
- },
/obj/effect/mapping_helpers/airlock/access/all/medical/paramedic,
+/obj/machinery/door/airlock/medical/glass{
+ name = "Paramedic Dispatch Room"
+ },
/turf/open/floor/iron/dark,
/area/station/medical/paramedic)
"lyu" = (
@@ -35808,8 +35800,6 @@
/area/station/science/research)
"mpV" = (
/obj/structure/table/glass,
-/obj/machinery/power/apc/auto_name/directional/north,
-/obj/structure/cable,
/obj/item/reagent_containers/cup/beaker/cryoxadone{
pixel_x = -6;
pixel_y = 10
@@ -35832,6 +35822,7 @@
},
/obj/effect/turf_decal/tile/blue/fourcorners,
/obj/item/radio/intercom/directional/west,
+/obj/machinery/vitals_reader/directional/north,
/turf/open/floor/iron/white,
/area/station/medical/cryo)
"mqe" = (
@@ -38768,7 +38759,6 @@
"nnE" = (
/obj/structure/table/glass,
/obj/effect/turf_decal/tile/blue/fourcorners,
-/obj/machinery/status_display/evac/directional/west,
/obj/machinery/digital_clock/directional/south,
/obj/effect/spawner/surgery_tray/full,
/turf/open/floor/iron/white,
@@ -45151,8 +45141,7 @@
"pyU" = (
/obj/structure/table/glass,
/obj/effect/turf_decal/tile/blue/fourcorners,
-/obj/machinery/status_display/ai/directional/east,
-/obj/item/radio/intercom/directional/south,
+/obj/item/radio/intercom/directional/east,
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"pyY" = (
@@ -45865,6 +45854,7 @@
/obj/effect/turf_decal/trimline/blue/filled/corner{
dir = 8
},
+/obj/machinery/airalarm/directional/west,
/turf/open/floor/iron/white,
/area/station/medical/medbay/central)
"pMd" = (
@@ -48313,7 +48303,6 @@
/obj/machinery/computer/crew{
dir = 1
},
-/obj/machinery/airalarm/directional/west,
/obj/machinery/camera/directional/south,
/turf/open/floor/iron/dark/smooth_large,
/area/station/medical/paramedic)
@@ -48809,12 +48798,15 @@
dir = 1
},
/obj/machinery/portable_atmospherics/canister/anesthetic_mix,
-/obj/machinery/light_switch/directional/east{
- pixel_x = 21
- },
/obj/effect/turf_decal/stripes/end{
dir = 1
},
+/obj/machinery/light_switch/directional/east{
+ pixel_y = 4
+ },
+/obj/machinery/firealarm/directional/east{
+ pixel_y = -6
+ },
/turf/open/floor/iron/dark,
/area/station/medical/cryo)
"qNk" = (
@@ -50395,7 +50387,6 @@
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 8
},
-/obj/machinery/airalarm/directional/west,
/obj/machinery/door/firedoor,
/turf/open/floor/iron/white,
/area/station/medical/medbay/central)
@@ -50502,6 +50493,7 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/machinery/light/cold/directional/west,
+/obj/machinery/firealarm/directional/west,
/turf/open/floor/iron/white,
/area/station/medical/medbay/central)
"rpx" = (
@@ -51420,6 +51412,7 @@
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 9
},
+/obj/item/radio/intercom/directional/north,
/turf/open/floor/iron/white,
/area/station/medical/medbay/central)
"rEu" = (
@@ -52292,7 +52285,7 @@
/turf/open/floor/wood,
/area/station/commons/dorms)
"rUp" = (
-/obj/item/radio/intercom/directional/east,
+/obj/structure/sign/eyechart/directional/east,
/turf/open/floor/iron/white,
/area/station/medical/medbay/central)
"rUE" = (
@@ -53325,6 +53318,7 @@
"snb" = (
/obj/structure/table/optable,
/obj/effect/turf_decal/tile/blue/fourcorners,
+/obj/machinery/vitals_reader/directional/west,
/turf/open/floor/iron/white,
/area/station/medical/surgery/theatre)
"snt" = (
@@ -56879,6 +56873,7 @@
},
/obj/structure/table/glass,
/obj/machinery/fax,
+/obj/machinery/airalarm/directional/east,
/turf/open/floor/iron/white,
/area/station/medical/medbay/central)
"tzJ" = (
@@ -58584,7 +58579,7 @@
network = list("ss13","medbay")
},
/obj/effect/turf_decal/tile/blue/fourcorners,
-/obj/machinery/airalarm/directional/north,
+/obj/machinery/vitals_reader/directional/north,
/turf/open/floor/iron/white,
/area/station/medical/cryo)
"ucc" = (
@@ -69529,6 +69524,7 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/effect/spawner/random/structure/steam_vent,
/obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/hidden/layer5,
+/obj/structure/sign/poster/contraband/random/directional/east,
/turf/open/floor/plating,
/area/station/maintenance/port/aft)
"xLM" = (
@@ -69930,11 +69926,11 @@
"xST" = (
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
-/obj/item/radio/intercom/directional/west,
/obj/machinery/light/directional/west,
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 8
},
+/obj/machinery/status_display/ai/directional/west,
/turf/open/floor/iron/white,
/area/station/medical/medbay/central)
"xTg" = (
@@ -70873,10 +70869,10 @@
/turf/open/floor/iron/white/smooth_large,
/area/station/medical/chemistry)
"yiB" = (
-/obj/machinery/firealarm/directional/west,
/obj/effect/turf_decal/trimline/blue/filled/warning,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
+/obj/machinery/status_display/ai/directional/west,
/turf/open/floor/iron/white,
/area/station/medical/medbay/central)
"yiH" = (
@@ -88929,7 +88925,7 @@ xNq
bQm
xNq
mbx
-kZv
+xNq
xNq
xLB
mbx
diff --git a/_maps/map_files/NebulaStation/NebulaStation.dmm b/_maps/map_files/NebulaStation/NebulaStation.dmm
index 268e8cd2164..68cda7ae99a 100644
--- a/_maps/map_files/NebulaStation/NebulaStation.dmm
+++ b/_maps/map_files/NebulaStation/NebulaStation.dmm
@@ -14853,11 +14853,11 @@
/obj/effect/turf_decal/tile/blue/anticorner/contrasted{
dir = 4
},
-/obj/machinery/digital_clock/directional/east,
/obj/structure/bed/medical{
dir = 4
},
/obj/item/bedsheet/medical,
+/obj/machinery/vitals_reader/directional/east,
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"ckV" = (
@@ -24174,6 +24174,9 @@
/obj/effect/turf_decal/siding/dark/end{
dir = 8
},
+/obj/machinery/vitals_reader/directional/west{
+ id_tag = "uppercryo"
+ },
/turf/open/floor/iron/dark/small,
/area/station/medical/cryo)
"dDn" = (
@@ -35287,6 +35290,9 @@
/obj/structure/disposalpipe/segment{
dir = 6
},
+/obj/machinery/vitals_reader/directional/west{
+ id_tag = "lowercryo"
+ },
/turf/open/floor/iron/dark/small,
/area/station/medical/cryo)
"fkb" = (
@@ -50307,6 +50313,7 @@
dir = 1
},
/obj/machinery/digital_clock/directional/south,
+/obj/machinery/vitals_reader/directional/east,
/turf/open/floor/iron/showroomfloor,
/area/station/medical/surgery/theatre)
"hud" = (
@@ -75513,6 +75520,7 @@
/obj/machinery/computer/operating{
dir = 1
},
+/obj/machinery/vitals_reader/directional/west,
/turf/open/floor/iron/showroomfloor,
/area/station/medical/surgery/theatre)
"lfV" = (
@@ -78157,16 +78165,17 @@
"lAm" = (
/obj/machinery/defibrillator_mount/directional/south,
/obj/effect/turf_decal/tile/blue/anticorner/contrasted,
-/obj/machinery/digital_clock/directional/east,
/obj/structure/bed/medical{
dir = 4
},
/obj/item/bedsheet/medical,
+/obj/machinery/vitals_reader/directional/east,
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"lAq" = (
/obj/machinery/cryo_cell{
- dir = 4
+ dir = 4;
+ id_tag = "lowercryo"
},
/obj/effect/turf_decal/bot_white{
color = "#52B4E9"
@@ -95271,6 +95280,17 @@
/obj/machinery/power/apc/auto_name/directional/north,
/turf/open/floor/plating,
/area/station/maintenance/starboard/aft)
+"ogk" = (
+/obj/machinery/cryo_cell{
+ dir = 4;
+ id_tag = "uppercryo"
+ },
+/obj/effect/turf_decal/bot_white{
+ color = "#52B4E9"
+ },
+/obj/structure/sign/warning/cold_temp/directional/west,
+/turf/open/floor/iron/dark/textured,
+/area/station/medical/cryo)
"ogl" = (
/obj/structure/fluff/paper,
/obj/structure/sign/poster/random/directional/south,
@@ -118264,6 +118284,9 @@
/obj/item/bedsheet/medical{
dir = 4
},
+/obj/machinery/digital_clock/directional/north{
+ pixel_y = 36
+ },
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"rwS" = (
@@ -254375,7 +254398,7 @@ aqQ
gyf
nHB
dCZ
-lAq
+ogk
tMT
lAq
fjZ
diff --git a/_maps/map_files/debug/runtimestation.dmm b/_maps/map_files/debug/runtimestation.dmm
index f7bdd888516..95d31cc2042 100644
--- a/_maps/map_files/debug/runtimestation.dmm
+++ b/_maps/map_files/debug/runtimestation.dmm
@@ -2522,6 +2522,7 @@
/obj/effect/turf_decal/tile/blue{
dir = 8
},
+/obj/machinery/vitals_reader/directional/south,
/turf/open/floor/iron/white/corner,
/area/station/medical/medbay)
"SC" = (
diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm
index f3e01239f79..ab2590e6901 100644
--- a/_maps/map_files/generic/CentCom.dmm
+++ b/_maps/map_files/generic/CentCom.dmm
@@ -5769,22 +5769,11 @@
/turf/open/floor/iron,
/area/centcom/central_command_areas/control)
"zH" = (
-/obj/item/scalpel{
- pixel_y = 12
- },
-/obj/item/circular_saw,
-/obj/item/retractor{
- pixel_x = 4
- },
-/obj/item/hemostat{
- pixel_x = -4
- },
-/obj/item/clothing/gloves/latex,
-/obj/item/clothing/mask/surgical,
/obj/structure/table/reinforced,
/obj/effect/turf_decal/tile/blue/opposingcorners{
dir = 1
},
+/obj/item/surgery_tray/full/advanced,
/turf/open/floor/iron/white,
/area/centcom/central_command_areas/control)
"zI" = (
@@ -5932,7 +5921,6 @@
/area/centcom/central_command_areas/control)
"Aq" = (
/obj/structure/table/optable,
-/obj/item/surgical_drapes,
/obj/effect/turf_decal/tile/blue/opposingcorners{
dir = 1
},
@@ -6052,10 +6040,10 @@
/obj/machinery/computer/operating{
dir = 4
},
-/obj/machinery/status_display/ai/directional/west,
/obj/effect/turf_decal/tile/blue/opposingcorners{
dir = 1
},
+/obj/machinery/vitals_reader/directional/west,
/turf/open/floor/iron/white,
/area/centcom/central_command_areas/control)
"AV" = (
@@ -6208,7 +6196,6 @@
"BF" = (
/obj/item/defibrillator/loaded,
/obj/structure/table/reinforced,
-/obj/machinery/status_display/evac/directional/west,
/obj/effect/turf_decal/tile/blue/opposingcorners{
dir = 1
},
@@ -6249,6 +6236,7 @@
/obj/effect/turf_decal/tile/blue/opposingcorners{
dir = 1
},
+/obj/machinery/vitals_reader/directional/south,
/turf/open/floor/iron/white,
/area/centcom/central_command_areas/control)
"BH" = (
@@ -6262,7 +6250,6 @@
/area/centcom/central_command_areas/control)
"BI" = (
/obj/machinery/light/directional/south,
-/obj/structure/noticeboard/directional/south,
/obj/effect/turf_decal/stripes/line{
dir = 1
},
@@ -6959,7 +6946,6 @@
/area/centcom/central_command_areas/evacuation/ship)
"Fg" = (
/obj/structure/closet/crate/bin,
-/obj/machinery/status_display/evac/directional/south,
/obj/machinery/status_display/evac/directional/west,
/obj/effect/turf_decal/tile/green/anticorner/contrasted{
dir = 8
@@ -9421,6 +9407,7 @@
/obj/effect/turf_decal/tile/blue/opposingcorners{
dir = 1
},
+/obj/machinery/vitals_reader/directional/south,
/turf/open/floor/iron/white,
/area/centcom/central_command_areas/control)
"RA" = (
@@ -57319,9 +57306,9 @@ zI
Ab
xN
BG
-iu
+io
Tw
-iu
+io
uc
io
iu
@@ -58347,9 +58334,9 @@ zJ
Ab
xN
Ry
-iu
+io
oW
-iu
+io
uc
io
io
diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm
index 27fa9526b94..2b4d6f12f72 100644
--- a/_maps/map_files/tramstation/tramstation.dmm
+++ b/_maps/map_files/tramstation/tramstation.dmm
@@ -15128,6 +15128,14 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/turf/open/floor/iron/white,
/area/station/science/ordnance)
+"edV" = (
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ dir = 8
+ },
+/obj/machinery/portable_atmospherics/canister/anesthetic_mix,
+/obj/machinery/status_display/evac/directional/south,
+/turf/open/floor/iron/dark,
+/area/station/medical/treatment_center)
"eep" = (
/turf/open/floor/plating,
/area/station/service/barber)
@@ -27540,6 +27548,7 @@
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 5
},
+/obj/machinery/vitals_reader/directional/east,
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"iOi" = (
@@ -30474,7 +30483,6 @@
dir = 5
},
/obj/item/radio/intercom/directional/east,
-/obj/machinery/status_display/evac/directional/north,
/obj/machinery/light/directional/east,
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
@@ -33626,6 +33634,9 @@
dir = 1
},
/obj/machinery/light/directional/south,
+/obj/machinery/vitals_reader/directional/south{
+ id_tag = "lowersurgery"
+ },
/turf/open/floor/iron/white,
/area/station/medical/surgery/aft)
"kIi" = (
@@ -39844,7 +39855,6 @@
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 9
},
-/obj/machinery/status_display/ai/directional/north,
/obj/machinery/light/directional/west,
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
@@ -40155,7 +40165,9 @@
/turf/open/floor/iron,
/area/station/security/prison)
"mXd" = (
-/obj/structure/table/optable,
+/obj/structure/table/optable{
+ id_tag = "uppersurgery"
+ },
/obj/effect/turf_decal/trimline/blue/filled/line,
/turf/open/floor/iron/white,
/area/station/medical/surgery/fore)
@@ -40589,7 +40601,9 @@
/turf/open/floor/glass/reinforced,
/area/station/security/brig)
"neE" = (
-/obj/structure/table/optable,
+/obj/structure/table/optable{
+ id_tag = "lowersurgery"
+ },
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 1
},
@@ -41724,13 +41738,13 @@
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 10
},
-/obj/item/radio/intercom/directional/west,
/obj/machinery/light/directional/west,
/obj/item/storage/medkit/regular,
/obj/item/storage/medkit/regular{
pixel_x = 4;
pixel_y = 4
},
+/obj/item/radio/intercom/directional/south,
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"nyM" = (
@@ -48329,8 +48343,8 @@
network = list("ss13","medbay");
c_tag = "Medical - Treatment South-East"
},
-/obj/machinery/wall_healer/directional/east,
/obj/machinery/light/directional/east,
+/obj/machinery/wall_healer/directional/south,
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"pUV" = (
@@ -53516,6 +53530,7 @@
network = list("ss13","medbay");
c_tag = "Medical - Treatment North-West"
},
+/obj/machinery/vitals_reader/directional/west,
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"rNt" = (
@@ -62296,6 +62311,13 @@
/obj/machinery/firealarm/directional/south,
/turf/open/floor/iron,
/area/station/hallway/primary/tram/left)
+"uId" = (
+/obj/machinery/cryo_cell{
+ dir = 4
+ },
+/obj/machinery/status_display/ai/directional/south,
+/turf/open/floor/iron/dark,
+/area/station/medical/treatment_center)
"uIk" = (
/obj/machinery/atmospherics/pipe/smart/simple/purple/visible,
/obj/effect/turf_decal/trimline/purple/filled/line{
@@ -65148,6 +65170,9 @@
},
/obj/machinery/light/directional/north,
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2,
+/obj/machinery/vitals_reader/directional/north{
+ id_tag = "uppersurgery"
+ },
/turf/open/floor/iron/white,
/area/station/medical/surgery/fore)
"vGd" = (
@@ -168973,7 +168998,7 @@ aMG
xdx
gBt
uVW
-gBt
+uId
jtr
dSZ
aOO
@@ -170515,7 +170540,7 @@ brx
uem
dqe
dlN
-dqe
+edV
jtr
dSZ
aOO
diff --git a/_maps/map_files/wawastation/wawastation.dmm b/_maps/map_files/wawastation/wawastation.dmm
index 28b390be699..d46ffefcacc 100644
--- a/_maps/map_files/wawastation/wawastation.dmm
+++ b/_maps/map_files/wawastation/wawastation.dmm
@@ -6004,6 +6004,7 @@
/obj/effect/turf_decal/tile/blue/fourcorners,
/obj/structure/table/glass,
/obj/machinery/light/cold/dim/directional/south,
+/obj/machinery/vitals_reader/directional/south,
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"ceD" = (
@@ -17770,6 +17771,7 @@
/obj/effect/turf_decal/tile/blue/fourcorners,
/obj/machinery/iv_drip,
/obj/machinery/light/cold/dim/directional/north,
+/obj/machinery/vitals_reader/directional/north,
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"gkt" = (
@@ -22400,9 +22402,9 @@
"hPp" = (
/obj/structure/table/glass,
/obj/effect/turf_decal/tile/blue/fourcorners,
-/obj/machinery/light_switch/directional/west,
/obj/item/wrench/medical,
/obj/machinery/light/cold/dim/directional/west,
+/obj/machinery/vitals_reader/directional/west,
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"hPs" = (
@@ -23401,7 +23403,6 @@
"ifE" = (
/obj/machinery/vending/medical,
/obj/effect/turf_decal/tile/blue/fourcorners,
-/obj/machinery/firealarm/directional/south,
/obj/machinery/newscaster/directional/east,
/turf/open/floor/iron/white,
/area/station/medical/storage)
@@ -43587,6 +43588,13 @@
},
/turf/open/floor/engine,
/area/station/engineering/supermatter/room)
+"pek" = (
+/obj/effect/turf_decal/trimline/blue/filled/line{
+ dir = 5
+ },
+/obj/machinery/firealarm/directional/east,
+/turf/open/floor/iron/white,
+/area/station/medical/treatment_center)
"peo" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -44038,7 +44046,6 @@
dir = 4
},
/obj/machinery/duct,
-/obj/machinery/firealarm/directional/south,
/turf/open/floor/iron/dark,
/area/station/medical/treatment_center)
"pmp" = (
@@ -63424,6 +63431,7 @@
/obj/effect/turf_decal/trimline/blue/filled/line{
dir = 10
},
+/obj/machinery/light_switch/directional/west,
/turf/open/floor/iron/white,
/area/station/medical/treatment_center)
"vOu" = (
@@ -84884,7 +84892,7 @@ lcM
isy
isy
lJo
-crz
+pek
bui
yit
yit
diff --git a/code/__DEFINES/dcs/signals/signals_operating_computer.dm b/code/__DEFINES/dcs/signals/signals_operating_computer.dm
index 8974bb99db8..3517b0d01eb 100644
--- a/code/__DEFINES/dcs/signals/signals_operating_computer.dm
+++ b/code/__DEFINES/dcs/signals/signals_operating_computer.dm
@@ -1,5 +1,7 @@
-// /obj/machinery/computer/operating signals
-
/// Fired when a autopsy surgery completes.
/// (mob/living/target)
#define COMSIG_OPERATING_COMPUTER_AUTOPSY_COMPLETE "operating_computer_autopsy_complete"
+
+/// Fired when the patient on the operating table is changed.
+/// (mob/living/target)
+#define COMSIG_OPERATING_TABLE_SET_PATIENT "operating_table_set_patient"
diff --git a/code/game/machinery/wall_vitals.dm b/code/game/machinery/wall_vitals.dm
new file mode 100644
index 00000000000..c175fc98f48
--- /dev/null
+++ b/code/game/machinery/wall_vitals.dm
@@ -0,0 +1,538 @@
+/obj/item/wallframe/status_display/vitals
+ name = "vitals display frame"
+ desc = "Used to build vitals displays. Secure on a wall nearby a stasis bed, operating table, \
+ or another machine that can hold patients such as cryo cells or sleepers."
+ custom_materials = list(
+ /datum/material/iron = SHEET_MATERIAL_AMOUNT * 4,
+ /datum/material/glass = SHEET_MATERIAL_AMOUNT * 2,
+ /datum/material/gold = HALF_SHEET_MATERIAL_AMOUNT * 0.5,
+ )
+ result_path = /obj/machinery/vitals_reader
+
+/obj/item/wallframe/status_display/vitals/advanced
+ name = "advanced vitals display frame"
+ desc = "Used to build advanced vitals displays. Performs a more detailed scan of the patient than the basic display."
+ custom_materials = list(
+ /datum/material/iron = SHEET_MATERIAL_AMOUNT * 4,
+ /datum/material/glass = SHEET_MATERIAL_AMOUNT * 2,
+ /datum/material/gold = HALF_SHEET_MATERIAL_AMOUNT,
+ /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT * 0.5,
+ )
+ result_path = /obj/machinery/vitals_reader/advanced
+
+/// A wall mounted screen that showcases the vitals of a patient nearby.
+/obj/machinery/vitals_reader
+ name = "vitals display"
+ desc = "A screen that displays the vitals of a patient."
+ icon = 'icons/obj/machines/vitals_monitor.dmi'
+ icon_state = "frame"
+ verb_say = "beeps"
+ verb_ask = "beeps"
+ verb_exclaim = "beeps"
+ density = FALSE
+ layer = ABOVE_WINDOW_LAYER
+ interaction_flags_machine = INTERACT_MACHINE_ALLOW_SILICON
+ use_power = NO_POWER_USE
+ idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 0.1
+ active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 0.1
+ processing_flags = START_PROCESSING_MANUALLY
+ density = FALSE
+ max_integrity = 150
+ payment_department = ACCOUNT_MED
+ armor_type = /datum/armor/obj_machinery/vitals_reader
+ light_range = 1.5
+ light_power = 0.75
+ light_color = LIGHT_COLOR_FAINT_CYAN
+
+ /// Whether we perform an advanced scan on examine or not
+ var/advanced = FALSE
+ /// If TRUE, also append a chemical scan to the readout
+ var/chemscan = TRUE
+ /// Typepath to spawn when deconstructed
+ var/frame = /obj/item/wallframe/status_display/vitals
+ /// Range which we can connect to machines, don't go crazy ok?
+ var/connection_range = 3
+ /// Static typecache of things the vitals display can connect to.
+ var/static/list/connectable_typecache = typecacheof(list(
+ /obj/machinery/abductor/experiment,
+ /obj/machinery/cryo_cell,
+ /obj/machinery/dna_scannernew,
+ /obj/machinery/gulag_teleporter,
+ /obj/machinery/hypnochair,
+ /obj/machinery/implantchair,
+ /obj/machinery/sleeper,
+ /obj/machinery/stasis,
+ /obj/structure/table/optable,
+ ))
+ /// The last stat we beeped about
+ VAR_FINAL/last_reported_stat = null
+ /// CD between beeps
+ COOLDOWN_DECLARE(beep_cd)
+ /// Reference to the mob that is being tracked / scanned
+ VAR_FINAL/mob/living/patient
+ /// What machine are we talking to
+ VAR_FINAL/obj/machinery/connected
+
+MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/vitals_reader, 32)
+
+/obj/machinery/vitals_reader/advanced
+ name = "advanced vitals display"
+ desc = "A screen that displays the vitals of a patient. \
+ Performs a more detailed scan of the patient than a basic display."
+ frame = /obj/item/wallframe/status_display/vitals/advanced
+ advanced = TRUE
+
+MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/vitals_reader/advanced, 32)
+
+/datum/armor/obj_machinery/vitals_reader
+ melee = 30
+ bullet = 20
+ laser = 20
+ energy = 30
+ bomb = 10
+ fire = 50
+ acid = 80
+
+/obj/machinery/vitals_reader/Initialize(mapload, obj/item/circuitboard/C)
+ . = ..()
+ register_context()
+ return INITIALIZE_HINT_LATELOAD
+
+/obj/machinery/vitals_reader/post_machine_initialize()
+ . = ..()
+ find_machine(prioritize_by_id = TRUE) // mappers can set an id tag to connect it to specific machines
+ if(is_operational)
+ set_light_on(TRUE)
+
+/obj/machinery/vitals_reader/Destroy(force)
+ unset_connection()
+ unset_patient() // unset connection also unsets patient, but just in case
+ return ..()
+
+/obj/machinery/vitals_reader/proc/unset_connected(...)
+ SIGNAL_HANDLER
+ UnregisterSignal(connected, COMSIG_QDELETING)
+ UnregisterSignal(connected, list(COMSIG_OPERATING_TABLE_SET_PATIENT, COMSIG_MACHINERY_SET_OCCUPANT))
+ UnregisterSignal(connected, COMSIG_MOVABLE_MOVED)
+ connected = null
+
+/obj/machinery/vitals_reader/proc/connected_occupant_changed(datum/source, mob/living/new_patient)
+ SIGNAL_HANDLER
+
+ set_patient(new_patient)
+
+/obj/machinery/vitals_reader/proc/connected_moved(...)
+ SIGNAL_HANDLER
+ if(get_dist(src, connected) > connection_range)
+ unset_connected()
+
+/obj/machinery/vitals_reader/proc/unset_connection(...)
+ SIGNAL_HANDLER
+ if(isnull(connected))
+ return
+
+ UnregisterSignal(connected, COMSIG_QDELETING)
+ UnregisterSignal(connected, list(COMSIG_OPERATING_TABLE_SET_PATIENT, COMSIG_MACHINERY_SET_OCCUPANT))
+ UnregisterSignal(connected, COMSIG_MOVABLE_MOVED)
+ connected = null
+ unset_patient()
+ update_use_power(NO_POWER_USE)
+
+/obj/machinery/vitals_reader/proc/set_connection(obj/new_connected)
+ if(!isnull(connected))
+ unset_connected()
+
+ connected = new_connected
+ RegisterSignal(connected, COMSIG_QDELETING, PROC_REF(unset_connected))
+ RegisterSignals(connected, list(COMSIG_OPERATING_TABLE_SET_PATIENT, COMSIG_MACHINERY_SET_OCCUPANT), PROC_REF(connected_occupant_changed))
+ RegisterSignal(connected, COMSIG_MOVABLE_MOVED, PROC_REF(connected_moved))
+ update_use_power(IDLE_POWER_USE)
+
+ if(ismachinery(connected))
+ var/obj/machinery/connected_machine = connected
+ set_patient(connected_machine.occupant)
+ else if(istype(connected, /obj/structure/table/optable))
+ var/obj/structure/table/optable/connected_table = connected
+ set_patient(connected_table.patient)
+
+/obj/machinery/vitals_reader/wrench_act(mob/living/user, obj/item/tool)
+ balloon_alert(user, "detaching...")
+ if(tool.use_tool(src, user, 6 SECONDS, volume = 50))
+ playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE)
+ deconstruct(TRUE)
+ return ITEM_INTERACT_SUCCESS
+
+/obj/machinery/vitals_reader/multitool_act(mob/living/user, obj/item/tool)
+ if(!is_operational)
+ return NONE
+
+ if(isnull(connected))
+ if(find_machine())
+ balloon_alert(user, "connected to [connected.name]")
+ else
+ balloon_alert(user, "no connectable machines nearby!")
+ return ITEM_INTERACT_SUCCESS
+
+ balloon_alert(user, "disconnecting...")
+ if(!do_after(user, 2 SECONDS, target = src))
+ return ITEM_INTERACT_BLOCKING
+
+ balloon_alert(user, "disconnected from [connected.name]")
+ unset_connection()
+ return ITEM_INTERACT_SUCCESS
+
+/// Find and connects to a nearby machine
+/// If prioritize_by_id is TRUE, will first try to find a machine with the same id_tag as this vitals reader
+/obj/machinery/vitals_reader/proc/find_machine(prioritize_by_id = FALSE)
+ for(var/obj/nearby_thing in view(connection_range, src))
+ if(prioritize_by_id && nearby_thing.id_tag != src.id_tag)
+ continue
+ if(!is_type_in_typecache(nearby_thing, connectable_typecache))
+ continue
+
+ set_connection(nearby_thing)
+ return nearby_thing
+
+ if(prioritize_by_id)
+ return find_machine(prioritize_by_id = FALSE)
+ return null
+
+/obj/machinery/vitals_reader/on_deconstruction(disassembled)
+ var/atom/drop_loc = drop_location()
+ if(disassembled)
+ new frame(drop_loc)
+ else
+ new /obj/item/stack/sheet/iron(drop_loc, 2)
+ new /obj/item/shard(drop_loc)
+ new /obj/item/shard(drop_loc)
+ qdel(src)
+
+/obj/machinery/vitals_reader/examine(mob/user)
+ . = ..()
+ if(!is_operational)
+ return
+
+ if(isnull(connected))
+ . += span_notice("The display is currently not connected to anything. \
+ Use a [EXAMINE_HINT("multitool")] to connect it to a neighboring machine.")
+ return
+
+ if(user.is_blind())
+ return
+
+ if(machine_stat & EMPED)
+ . += span_warning("The display is flickering erratically!")
+ return
+
+ if(!issilicon(user) && !isobserver(user) && get_dist(patient, user) > 2)
+ . += span_notice("You are too far away to read the display.")
+ else if(HAS_TRAIT(user, TRAIT_DUMB) || !user.can_read(src, reading_check_flags = READING_CHECK_LITERACY, silent = TRUE))
+ . += span_warning("You try to comprehend the display, but it's too complex for you to understand.")
+ else
+ . += healthscan(user, patient, mode = SCANNER_CONDENSED, advanced = src.advanced, tochat = FALSE)
+ . += chemscan(user, patient, tochat = FALSE)
+
+/obj/machinery/vitals_reader/add_context(atom/source, list/context, obj/item/held_item, mob/user)
+ if(held_item?.tool_behaviour == TOOL_WRENCH)
+ context[SCREENTIP_CONTEXT_LMB] = "Detach"
+ . = CONTEXTUAL_SCREENTIP_SET
+ if(is_operational)
+ if(isnull(connected) && held_item?.tool_behaviour == TOOL_MULTITOOL)
+ context[SCREENTIP_CONTEXT_LMB] = "Connect to nearby machine"
+ . = CONTEXTUAL_SCREENTIP_SET
+ if(!isnull(patient))
+ context[SCREENTIP_CONTEXT_SHIFT_LMB] = "Examine vitals"
+ . = CONTEXTUAL_SCREENTIP_SET
+ return .
+
+#define LOWER_BAR_OFFSET -3
+
+/**
+ * Returns all overlays to be shown when a simple / basic animal patient is detected
+ *
+ * * hp_color - color being used for general, overrall health
+ */
+/obj/machinery/vitals_reader/proc/get_simple_mob_overlays(hp_color)
+ return list(
+ construct_overlay("mob", hp_color),
+ construct_overlay("blood", COLOR_GRAY),
+ construct_overlay("bar9", COLOR_GRAY),
+ construct_overlay("bar9", COLOR_GRAY, LOWER_BAR_OFFSET),
+ )
+
+/**
+ * Returns all overlays to be shown when a humanoid patient is detected
+ *
+ * * hp_color - color being used for general, overrall health
+ */
+/obj/machinery/vitals_reader/proc/get_humanoid_overlays(hp_color)
+ var/list/returned_overlays = list()
+
+ for(var/body_zone in GLOB.all_body_zones)
+ var/obj/item/bodypart/real_part = patient.get_bodypart(body_zone)
+ var/bodypart_color = isnull(real_part) ? COLOR_GRAY : percent_to_color((real_part.brute_dam + real_part.burn_dam) / real_part.max_damage)
+ returned_overlays += construct_overlay("human_[body_zone]", bodypart_color)
+
+ if(CAN_HAVE_BLOOD(patient))
+ var/blood_color = "#a51919"
+ switch((patient.blood_volume - BLOOD_VOLUME_SURVIVE) / (BLOOD_VOLUME_NORMAL - BLOOD_VOLUME_SURVIVE))
+ if(-INFINITY to 0.2)
+ blood_color = "#a1a1a1"
+ if(0.2 to 0.4)
+ blood_color = "#a18282"
+ if(0.4 to 0.6)
+ blood_color = "#a16363"
+ if(0.6 to 0.8)
+ blood_color = "#a14444"
+ if(0.8 to INFINITY)
+ blood_color = "#a51919"
+
+ returned_overlays += construct_overlay("blood", blood_color)
+ else
+ returned_overlays += construct_overlay("blood", COLOR_GRAY)
+
+ if(HAS_TRAIT(patient, TRAIT_NOBREATH))
+ returned_overlays += construct_overlay("bar9", COLOR_GRAY)
+ else
+ var/oxy_percent = patient.get_oxy_loss() / patient.maxHealth
+ returned_overlays += construct_overlay(percent_to_bar(oxy_percent), "#2A72AA")
+
+ if(HAS_TRAIT(patient, TRAIT_TOXIMMUNE))
+ returned_overlays += construct_overlay("bar9", COLOR_GRAY, LOWER_BAR_OFFSET)
+ else
+ var/tox_percent = patient.get_tox_loss() / patient.maxHealth
+ returned_overlays += construct_overlay(percent_to_bar(tox_percent), "#5d9c11", LOWER_BAR_OFFSET)
+
+ return returned_overlays
+
+/**
+ * Returns the EKG and Respiration overlays
+ *
+ * * hp_color - color being used for general, overrall health
+ */
+/obj/machinery/vitals_reader/proc/get_ekg_and_resp(hp_color)
+ var/ekg_icon_state = "ekg"
+ var/resp_icon_state = "resp"
+ if(!patient.appears_alive())
+ ekg_icon_state = "ekg_flat"
+ resp_icon_state = "resp_flat"
+
+ else if(patient.stat == HARD_CRIT || patient.has_status_effect(/datum/status_effect/jitter))
+ ekg_icon_state = "ekg_fast"
+
+ if(patient.losebreath || HAS_TRAIT(patient, TRAIT_NOBREATH))
+ resp_icon_state = "resp_flat"
+
+ return list(
+ construct_overlay(ekg_icon_state, hp_color),
+ construct_overlay(resp_icon_state, "#00f7ff"),
+ )
+
+/obj/machinery/vitals_reader/update_overlays()
+ . = ..()
+ if(!is_operational)
+ return
+
+ . += emissive_appearance(icon, "outline", src, alpha = src.alpha)
+ if(isnull(patient))
+ return
+
+ . += "buttons"
+
+ var/hp_color = percent_to_color((patient.maxHealth - patient.health) / patient.maxHealth)
+ . += get_ekg_and_resp(hp_color)
+ if(ishuman(patient))
+ . += get_humanoid_overlays(hp_color)
+ else
+ . += get_simple_mob_overlays(hp_color)
+
+/// Converts a percentage to a color
+/obj/machinery/vitals_reader/proc/percent_to_color(percent)
+ if(machine_stat & (EMPED|EMAGGED))
+ percent = rand(1, 100) * 0.01
+
+ if(percent == 0)
+ return "#2A72AA"
+
+ switch(percent)
+ if(0 to 0.125)
+ return "#A6BD00"
+ if(0.125 to 0.25)
+ return "#BDA600"
+ if(0.25 to 0.375)
+ return "#BD7E00"
+ if(0.375 to 0.5)
+ return "#BD4200"
+
+ return "#BD0600"
+
+/// Converts a percentage to a bar icon state
+/obj/machinery/vitals_reader/proc/percent_to_bar(percent)
+ if(machine_stat & (EMPED|EMAGGED))
+ percent = rand(1, 100) * 0.01
+
+ if(percent >= 1)
+ return "bar9"
+ if(percent <= 0)
+ return "bar1"
+
+ switch(percent)
+ if(0 to 0.125)
+ return "bar1"
+ if(0.125 to 0.25)
+ return "bar2"
+ if(0.25 to 0.375)
+ return "bar3"
+ if(0.375 to 0.5)
+ return "bar4"
+ if(0.5 to 0.625)
+ return "bar5"
+ if(0.625 to 0.75)
+ return "bar6"
+ if(0.75 to 0.875)
+ return "bar7"
+ if(0.875 to 1)
+ return "bar8"
+
+ return "bar9" // ??
+
+/**
+ * Helper to construct an overlay for the vitals display
+ *
+ * * state_to_use - icon state to use, required
+ * * color_to_use - color to use, optional
+ * * y_offset - offset to apply to the y position of the overlay, defaults to 0
+ */
+/obj/machinery/vitals_reader/proc/construct_overlay(state_to_use, color_to_use, y_offset = 0)
+ var/mutable_appearance/overlay = mutable_appearance(icon, state_to_use, alpha = src.alpha)
+ overlay.appearance_flags |= RESET_COLOR
+ overlay.color = color_to_use
+ overlay.pixel_z += 32
+ overlay.pixel_y += -32 + y_offset
+ return overlay
+
+#undef LOWER_BAR_OFFSET
+
+/obj/machinery/vitals_reader/on_set_is_operational(old_value)
+ update_appearance()
+ set_light_on(is_operational)
+
+/obj/machinery/vitals_reader/process()
+ if(!COOLDOWN_FINISHED(src, beep_cd) || !is_operational)
+ return
+ if(isnull(patient))
+ stack_trace("[src] has no patient but is still processing!")
+ end_processing()
+ return
+
+ var/patient_stat = patient.stat
+ if(machine_stat & (EMPED|EMAGGED))
+ patient_stat = pick(CONSCIOUS, SOFT_CRIT, HARD_CRIT, DEAD, DEAD, DEAD)
+
+ switch(patient_stat)
+ if(DEAD)
+ COOLDOWN_START(src, beep_cd, 11 SECONDS)
+ if(last_reported_stat != DEAD)
+ beep_message("lets out a droning beep.")
+ last_reported_stat = DEAD
+ if(HARD_CRIT)
+ COOLDOWN_START(src, beep_cd, 5 SECONDS)
+ if(last_reported_stat != HARD_CRIT)
+ beep_message("lets out an alternating beep.")
+ last_reported_stat = HARD_CRIT
+ if(SOFT_CRIT)
+ COOLDOWN_START(src, beep_cd, 7 SECONDS)
+ if(last_reported_stat != SOFT_CRIT)
+ beep_message("lets out a high pitch beep.")
+ last_reported_stat = SOFT_CRIT
+ else
+ COOLDOWN_START(src, beep_cd, 7 SECONDS)
+ if(last_reported_stat != CONSCIOUS)
+ beep_message("lets out a beep.")
+ last_reported_stat = CONSCIOUS
+
+/obj/machinery/vitals_reader/proc/beep_message(message)
+ for(var/mob/viewer as anything in viewers(src))
+ if(isnull(viewer.client) || !viewer.can_hear())
+ continue
+ if(!viewer.runechat_prefs_check(viewer, EMOTE_MESSAGE))
+ continue
+ viewer.create_chat_message(
+ speaker = src,
+ raw_message = message,
+ runechat_flags = EMOTE_MESSAGE,
+ )
+
+/// Sets the passed mob as the active patient
+/// If there is already a patient, it will be unset first.
+/obj/machinery/vitals_reader/proc/set_patient(mob/living/new_patient)
+ if(patient == new_patient)
+ return
+ if(isnull(new_patient))
+ unset_patient()
+ return
+
+ if(isnull(patient))
+ unset_patient()
+
+ patient = new_patient
+ RegisterSignal(patient, COMSIG_QDELETING, PROC_REF(unset_patient))
+ RegisterSignals(patient, list(
+ COMSIG_CARBON_POST_REMOVE_LIMB,
+ COMSIG_CARBON_POST_ATTACH_LIMB,
+ COMSIG_LIVING_HEALTH_UPDATE,
+ COMSIG_LIVING_UPDATE_BLOOD_STATUS,
+ ), PROC_REF(update_overlay_on_signal))
+ update_appearance()
+ begin_processing()
+ update_use_power(ACTIVE_POWER_USE)
+ last_reported_stat = null
+
+/// Unset the current patient.
+/obj/machinery/vitals_reader/proc/unset_patient(...)
+ SIGNAL_HANDLER
+ if(isnull(patient))
+ return
+
+ UnregisterSignal(patient, list(
+ COMSIG_QDELETING,
+ COMSIG_CARBON_POST_REMOVE_LIMB,
+ COMSIG_CARBON_POST_ATTACH_LIMB,
+ COMSIG_LIVING_HEALTH_UPDATE,
+ COMSIG_LIVING_UPDATE_BLOOD_STATUS,
+ ))
+
+ patient = null
+ end_processing()
+ update_use_power(IDLE_POWER_USE)
+ if(QDELING(src))
+ return
+
+ update_appearance()
+
+/// Signal proc to update the display when a signal is received.
+/obj/machinery/vitals_reader/proc/update_overlay_on_signal(...)
+ SIGNAL_HANDLER
+ update_appearance()
+
+/obj/machinery/vitals_reader/emp_act(severity)
+ . = ..()
+ if(. & EMP_PROTECT_SELF)
+ return
+
+ COOLDOWN_START(src, beep_cd, 1 SECONDS * rand(10, (severity == EMP_HEAVY ? 120 : 60)))
+ set_machine_stat(machine_stat | EMPED)
+ addtimer(CALLBACK(src, PROC_REF(fix_emp)), (severity == EMP_HEAVY ? 150 SECONDS : 75 SECONDS), TIMER_DELETE_ME)
+
+/obj/machinery/vitals_reader/proc/fix_emp()
+ set_machine_stat(machine_stat & ~EMPED)
+
+/obj/machinery/vitals_reader/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
+ switch(damage_type)
+ if(BRUTE)
+ if(machine_stat & BROKEN)
+ playsound(src, 'sound/effects/hit_on_shattered_glass.ogg', 70, TRUE)
+ else
+ playsound(src, 'sound/effects/glass/glasshit.ogg', 75, TRUE)
+ if(BURN)
+ playsound(src, 'sound/items/tools/welder.ogg', 100, TRUE)
diff --git a/code/game/objects/items/devices/scanners/health_analyzer.dm b/code/game/objects/items/devices/scanners/health_analyzer.dm
index e1f4bc6d792..971dcd513a3 100644
--- a/code/game/objects/items/devices/scanners/health_analyzer.dm
+++ b/code/game/objects/items/devices/scanners/health_analyzer.dm
@@ -525,7 +525,7 @@
REMOVE_TRAIT(target, TRAIT_RECENTLY_TREATED, ANALYZER_TRAIT)
return TRUE
-/proc/chemscan(mob/living/user, mob/living/target, reagent_types_to_check = null)
+/proc/chemscan(mob/living/user, mob/living/target, reagent_types_to_check = null, tochat = TRUE)
if(user.incapacitated)
return
@@ -594,7 +594,10 @@
render_list += "[allergies]
"
// we handled the last
so we don't need handholding
- to_chat(user, custom_boxed_message("blue_box", jointext(render_list, "")), trailing_newline = FALSE, type = MESSAGE_TYPE_INFO)
+ if(tochat)
+ to_chat(user, custom_boxed_message("blue_box", jointext(render_list, "")), trailing_newline = FALSE, type = MESSAGE_TYPE_INFO)
+ else
+ return jointext(render_list, "")
/obj/item/healthanalyzer/click_alt(mob/user)
if(mode == SCANNER_NO_MODE)
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index 53e142dce59..00a7dec2bf6 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -1103,6 +1103,7 @@
if (patient.external && patient.external == air_tank)
patient.close_externals()
+ SEND_SIGNAL(src, COMSIG_OPERATING_TABLE_SET_PATIENT, new_patient)
patient = new_patient
update_appearance()
computer?.update_static_data_for_all_viewers()
diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm
index 3ca9a45b732..5fec94d4333 100644
--- a/code/modules/research/designs/medical_designs.dm
+++ b/code/modules/research/designs/medical_designs.dm
@@ -1379,3 +1379,31 @@
id = "surgery_oldstation_dissection"
surgery = /datum/surgery_operation/basic/dissection
research_icon_state = "surgery_chest"
+
+/datum/design/vitals_monitor
+ name = "Vitals Monitor"
+ desc = "A wall mounted computer that displays the vitals of a patient nearby. \
+ Links to stasis beds, operating tables, and other machines that can hold patients \
+ such as cryo cells, sleepers, and more."
+ id = "vitals_monitor"
+ build_type = PROTOLATHE
+ materials = list(
+ /datum/material/iron = SHEET_MATERIAL_AMOUNT * 4,
+ /datum/material/glass = SHEET_MATERIAL_AMOUNT * 2,
+ /datum/material/gold = HALF_SHEET_MATERIAL_AMOUNT * 0.5,
+ )
+ build_path = /obj/item/wallframe/status_display/vitals
+ category = list(RND_CATEGORY_COMPUTER + RND_SUBCATEGORY_COMPUTER_MEDICAL)
+ departmental_flags = DEPARTMENT_BITFLAG_MEDICAL
+
+/datum/design/vitals_monitor/advanced
+ name = "Advanced Vitals Monitor"
+ desc = "An updated vitals display which performs a more detailed scan of the patient than the basic display."
+ id = "vitals_monitor_advanced"
+ materials = list(
+ /datum/material/iron = SHEET_MATERIAL_AMOUNT * 4,
+ /datum/material/glass = SHEET_MATERIAL_AMOUNT * 2,
+ /datum/material/gold = HALF_SHEET_MATERIAL_AMOUNT,
+ /datum/material/silver = HALF_SHEET_MATERIAL_AMOUNT * 0.5,
+ )
+ build_path = /obj/item/wallframe/status_display/vitals/advanced
diff --git a/code/modules/research/techweb/nodes/medbay_nodes.dm b/code/modules/research/techweb/nodes/medbay_nodes.dm
index c79bad013ef..6ae856d8173 100644
--- a/code/modules/research/techweb/nodes/medbay_nodes.dm
+++ b/code/modules/research/techweb/nodes/medbay_nodes.dm
@@ -4,35 +4,36 @@
display_name = "Medbay Equipment"
description = "Essential medical tools to patch you up while medbay is still intact."
design_ids = list(
- "operating",
- "medicalbed",
- "defibmountdefault",
- "surgical_drapes",
- "scalpel",
- "retractor",
- "hemostat",
- "cautery",
- "circular_saw",
- "surgicaldrill",
- "bonesetter",
+ "beaker",
"blood_filter",
- "surgical_tape",
+ "blood_pack",
+ "blood_scanner",
+ "bonesetter",
+ "cautery",
+ "chem_pack",
+ "circular_saw",
+ "defibmountdefault",
+ "dropper",
+ "hemostat",
+ "jerrycan",
+ "large_beaker",
+ "medicalbed",
+ "operating",
+ "organ_jar",
"penlight",
"penlight_paramedic",
- "stethoscope",
- "beaker",
- "large_beaker",
- "chem_pack",
- "blood_pack",
- "syringe",
- "dropper",
"pillbottle",
- "xlarge_beaker",
- "organ_jar",
- "jerrycan",
"reflex_hammer",
- "blood_scanner",
+ "retractor",
+ "scalpel",
+ "stethoscope",
"suit_sensor",
+ "surgical_drapes",
+ "surgical_tape",
+ "surgicaldrill",
+ "syringe",
+ "vitals_monitor",
+ "xlarge_beaker",
)
experiments_to_unlock = list(
/datum/experiment/autopsy/human,
@@ -74,16 +75,17 @@
description = "State-of-the-art medical gear for keeping the crew in one piece — mostly."
prereq_ids = list(TECHWEB_NODE_CHEM_SYNTHESIS)
design_ids = list(
- "smoke_machine",
"chem_mass_spec",
- "healthanalyzer_advanced",
- "mod_health_analyzer",
"crewpinpointer",
"defibmount",
- "medicalbed_emergency",
- "piercesyringe",
"diode_disk_healing",
"diode_disk_sanity",
+ "healthanalyzer_advanced",
+ "medicalbed_emergency",
+ "mod_health_analyzer",
+ "piercesyringe",
+ "smoke_machine",
+ "vitals_monitor_advanced",
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS)
required_experiments = list(/datum/experiment/scanning/reagent/haloperidol)
diff --git a/icons/obj/machines/vitals_monitor.dmi b/icons/obj/machines/vitals_monitor.dmi
new file mode 100644
index 0000000000000000000000000000000000000000..d402e7f0b3e48a5ab53c43ee40a16567e1e53e4e
GIT binary patch
literal 1176
zcmeAS@N?(olHy`uVBq!ia0y~yU~~Xt1rBDQ$fsRVhk#UafKQ0)fddBuLQ@n>91Kj|
z^6UH8?>?rWto#4}|0mC1O%vf;Fo}<&!Qz~(@bilz@}~@BWMo7|MI|LA6%-V%UArbE
zB&4XQsIIR5;>C-zXV1=?H}B!YhvntvKr>ICJh^7gn(f=SFIcePX3^>|KoOl28*R#5(
z?}a{2jSy){6}lSvEAydE1<&PH$vt7VdJ)$&UOTC#M`kZPocZtVv8bS{&EJ=m*Y7q8
z2|RrK`pvK;nc4H*pI&f`f9dtua_8BUx1nM=?puCw{noiyxo9ef@1(M2e)XvvELl0Z
zv@|k&9aUL#H8Q*%t+{r2D|Np!ZA#;vz5dbS9XzX}csEWHSb5}T>w)PJ#o{lEr;1yK
za&OeTdvw#0^)3G^S4K$-?_}9LBlkw_N&e-3e|Z09*^wO>mNxNJ6axd(aZeY=kcv5P
z@4gPY6(GVEAm!YDi#sA~tHIXV|I2m6FK1fM*(}M|=yI*-&(~bTI^p9J-*~DCOYAA1
zZr4zlJ!`hw^GnCg*nF+`&P>}P#bcU#dtd%$lO2<{$^Tx%J;yKqect(A$1f0|~!ESY9H*NWLZ=$Kmet(!UX3}^ooy?5g4_S}Nl2Q~jT
zT;Ju$ny0a05|g&(hMI7m)}tF^l>;r|XsGI@RAhx9aMa+<&~G`7h-coQxN^c;9i;b(7d@
zEWo7Fkp1<~pBOLorBhBmdsX}LQ|-<;HLfQrpVTiV1=<~5B);y?uZ<`E_o!=rcx!$m
zy777u*SGKo2lth`&HA4DbIWg@(rVS6%r(8?PisQYL5QV$^x4Hv)Nz4K2U(zaqu%`a
z{!jnd+jMPyooWoRy|B6do!92$MkoIBr0hRzbRwR;==gQsC!g{Z{{IS*eEsiE!k%^e
zpMHNF_OwRy3B(WvhAS3_x$bhZHT`LNW&Xs^C?L%K!t^V;2cCYu>!5g_Z_1}b{^Gg+
zU0*j}{Fj(3_fDS)rtbj5(g*))G^f5lKYdqY&Ae0JpI6IjJYBhG{|;G==Rm6B&p!pI
z+6$|V?`+K!VHW>$?Xld7+HI*_^Kxe{N{?Rl;^wrKUvf@g;e7(Lt>obB?d^@!#N%e$RLI$A1qT`gecf_H$Bi+U^9L+kf$2
z7pQOmgP!2Gb@3(t4{rbW#t$aOaO}C}iTXKDHGW-P`+e&C_0@O&JxGeo`|$L6bjAkv
n^WCn7|G$1JTBghh*0An$zVol>iG94xb|Ai|tDnm{r-UW|&>ky*
literal 0
HcmV?d00001
diff --git a/tgstation.dme b/tgstation.dme
index 266fd8a0eb0..da561f0cec6 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -2256,6 +2256,7 @@
#include "code\game\machinery\teleporter.dm"
#include "code\game\machinery\transformer.dm"
#include "code\game\machinery\wall_healer.dm"
+#include "code\game\machinery\wall_vitals.dm"
#include "code\game\machinery\washing_machine.dm"
#include "code\game\machinery\wishgranter.dm"
#include "code\game\machinery\ai_core\_core.dm"