diff --git a/code/game/machinery/medical_kiosk.dm b/code/game/machinery/medical_kiosk.dm
new file mode 100644
index 0000000000..7fc98cb443
--- /dev/null
+++ b/code/game/machinery/medical_kiosk.dm
@@ -0,0 +1,187 @@
+#define BROKEN_BONES 0x1
+#define INTERNAL_BLEEDING 0x2
+#define EXTERNAL_BLEEDING 0x4
+#define SERIOUS_EXTERNAL_DAMAGE 0x8
+#define SERIOUS_INTERNAL_DAMAGE 0x10
+#define RADIATION_DAMAGE 0x20
+#define TOXIN_DAMAGE 0x40
+#define OXY_DAMAGE 0x80
+
+/obj/machinery/medical_kiosk
+ name = "medical kiosk"
+ desc = "A helpful kiosk for finding out whatever is wrong with you."
+ icon = 'icons/obj/machines/medical_kiosk.dmi'
+ icon_state = "kiosk_off"
+ idle_power_usage = 5
+ active_power_usage = 200
+ circuit = /obj/item/weapon/circuitboard/medical_kiosk
+ anchored = TRUE
+ density = TRUE
+
+ var/mob/living/active_user
+ var/db_key
+ var/datum/transcore_db/our_db
+
+/obj/machinery/medical_kiosk/Initialize()
+ . = ..()
+ our_db = SStranscore.db_by_key(db_key)
+
+/obj/machinery/medical_kiosk/update_icon()
+ . = ..()
+ if(panel_open)
+ icon_state = "kiosk_open" // panel
+ else if((stat & (NOPOWER|BROKEN)) || !active_user)
+ icon_state = "kiosk_off" // asleep or no power
+ else
+ icon_state = "kiosk" // waiting for user or to finish processing
+
+/obj/machinery/medical_kiosk/attack_hand(mob/living/user)
+ . = ..()
+ if(istype(user) && Adjacent(user))
+ if(inoperable() || panel_open)
+ to_chat(user, "\The [src] seems to be nonfunctional...")
+ else if(active_user && active_user != user)
+ to_chat(user, "Another patient has begin using this machine. Please wait for them to finish, or their session to time out.")
+ else
+ start_using(user)
+
+/obj/machinery/medical_kiosk/attackby(obj/item/O, mob/user)
+ . = ..()
+ if(default_unfasten_wrench(user, O, 40))
+ return
+ if(default_deconstruction_screwdriver(user, O))
+ return
+ if(default_deconstruction_crowbar(user, O))
+ return
+ if(default_part_replacement(user, O))
+ return
+
+/obj/machinery/medical_kiosk/proc/wake_lock(mob/living/user)
+ active_user = user
+ update_icon()
+ update_use_power(USE_POWER_ACTIVE)
+
+/obj/machinery/medical_kiosk/proc/suspend()
+ active_user = null
+ update_icon()
+ update_use_power(USE_POWER_IDLE)
+
+/obj/machinery/medical_kiosk/proc/start_using(mob/living/user)
+ // Out of standby
+ wake_lock(user)
+
+ // User requests service
+ user.visible_message("[user] wakes [src].", "You wake [src].")
+ var/choice = tgui_alert(user, "What service would you like?", "[src]", list("Health Scan", "Backup Scan", "Cancel"), timeout = 10 SECONDS)
+ if(!choice || choice == "Cancel" || !Adjacent(user) || inoperable() || panel_open)
+ suspend()
+ return
+
+ // Service begins, delay
+ visible_message("\The [src] scans [user] thoroughly!")
+ flick("kiosk_active", src)
+ if(!do_after(user, 10 SECONDS, src, exclusive = TASK_ALL_EXCLUSIVE) || inoperable())
+ suspend()
+ return
+
+ // Service completes
+ switch(choice)
+ if("Health Scan")
+ var/health_report = tell_health_info(user)
+ to_chat(user, "Health report results:"+health_report)
+ if("Backup Scan")
+ if(!our_db)
+ to_chat(user, "Backup scan results:
DATABASE ERROR!")
+ else
+ var/scan_report = do_backup_scan(user)
+ to_chat(user, "Backup scan results:"+scan_report)
+
+ // Standby
+ suspend()
+
+/obj/machinery/medical_kiosk/proc/tell_health_info(mob/living/user)
+ if(!istype(user))
+ return "
Unable to perform diagnosis on this type of life form."
+ if(user.isSynthetic())
+ return "
Unable to perform diagnosis on synthetic life forms."
+
+ var/problems = 0
+ for(var/obj/item/organ/external/E in user)
+ if(E.status & ORGAN_BROKEN)
+ problems |= BROKEN_BONES
+ if(E.status & (ORGAN_DEAD|ORGAN_DESTROYED))
+ problems |= SERIOUS_EXTERNAL_DAMAGE
+ if(E.status & ORGAN_BLEEDING)
+ problems |= EXTERNAL_BLEEDING
+ for(var/datum/wound/W in E.wounds)
+ if(W.bleeding())
+ if(W.internal)
+ problems |= INTERNAL_BLEEDING
+ else
+ problems |= EXTERNAL_BLEEDING
+
+ for(var/obj/item/organ/internal/I in user)
+ if(I.status & (ORGAN_BROKEN|ORGAN_DEAD|ORGAN_DESTROYED))
+ problems |= SERIOUS_INTERNAL_DAMAGE
+ if(I.status & ORGAN_BLEEDING)
+ problems |= INTERNAL_BLEEDING
+
+ if(user.getToxLoss() > 0)
+ problems |= TOXIN_DAMAGE
+ if(user.getOxyLoss() > 0)
+ problems |= OXY_DAMAGE
+ if(user.radiation > 0)
+ problems |= RADIATION_DAMAGE
+ if(user.getFireLoss() > 40 || user.getBruteLoss() > 40)
+ problems |= SERIOUS_EXTERNAL_DAMAGE
+
+ if(!problems)
+ if(user.getHalLoss() > 0)
+ return "
Mild concussion detected - advising bed rest until patient feels well. No other anatomical issues detected."
+ else
+ return "
No anatomical issues detected."
+
+ var/problem_text = ""
+ if(problems & BROKEN_BONES)
+ problem_text += "
Broken bones detected - see a medical professional and move as little as possible."
+ if(problems & INTERNAL_BLEEDING)
+ problem_text += "
Internal bleeding detected - seek medical attention, ASAP!"
+ if(problems & EXTERNAL_BLEEDING)
+ problem_text += "
External bleeding detected - advising pressure with cloth and bandaging."
+ if(problems & SERIOUS_EXTERNAL_DAMAGE)
+ problem_text += "
Severe anatomical damage detected - seek medical attention."
+ if(problems & SERIOUS_INTERNAL_DAMAGE)
+ problem_text += "
Severe internal damage detected - seek medical attention."
+ if(problems & RADIATION_DAMAGE)
+ problem_text += "
Exposure to ionizing radiation detected - seek medical attention."
+ if(problems & TOXIN_DAMAGE)
+ problem_text += "
Exposure to toxic materials detected - induce vomiting if you have consumed anything recently."
+ if(problems & OXY_DAMAGE)
+ problem_text += "
Blood/air perfusion level is below acceptable norms - use concentrated oxygen if necessary."
+
+ return problem_text
+
+/obj/machinery/medical_kiosk/proc/do_backup_scan(mob/living/carbon/human/user)
+ if(!istype(user))
+ return "
Unable to perform full scan. Please see a medical professional."
+ if(!user.mind)
+ return "
Unable to perform full scan. Please see a medical professional."
+
+ var/nif = user.nif
+ if(nif)
+ persist_nif_data(user)
+
+ our_db.m_backup(user.mind,nif,one_time = TRUE)
+ var/datum/transhuman/body_record/BR = new()
+ BR.init_from_mob(user, TRUE, TRUE, database_key = db_key)
+
+ return "
Backup scan completed!
Note: A backup implant is required for automated notifications to the appropriate department in case of incident."
+
+#undef BROKEN_BONES
+#undef INTERNAL_BLEEDING
+#undef EXTERNAL_BLEEDING
+#undef SERIOUS_EXTERNAL_DAMAGE
+#undef SERIOUS_INTERNAL_DAMAGE
+#undef RADIATION_DAMAGE
+#undef TOXIN_DAMAGE
+#undef OXY_DAMAGE
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/circuitboards/frame.dm b/code/game/objects/items/weapons/circuitboards/frame.dm
index 56f1dac4d4..a3c755a3ac 100644
--- a/code/game/objects/items/weapons/circuitboards/frame.dm
+++ b/code/game/objects/items/weapons/circuitboards/frame.dm
@@ -210,6 +210,15 @@
/obj/item/weapon/stock_parts/scanning_module = 3,
/obj/item/stack/material/glass/reinforced = 2)
+/obj/item/weapon/circuitboard/medical_kiosk
+ name = T_BOARD("medical kiosk")
+ build_path = /obj/machinery/medical_kiosk
+ board_type = new /datum/frame/frame_types/machine
+ origin_tech = list(TECH_MAGNET = 2, TECH_BIO = 2)
+ req_components = list(
+ /obj/item/weapon/stock_parts/scanning_module = 3,
+ /obj/item/stack/material/glass/reinforced = 2)
+
/obj/item/weapon/circuitboard/sleeper
name = T_BOARD("sleeper")
build_path = /obj/machinery/sleeper
diff --git a/code/modules/economy/vending_machines.dm b/code/modules/economy/vending_machines.dm
index af7e905005..6b562f411c 100644
--- a/code/modules/economy/vending_machines.dm
+++ b/code/modules/economy/vending_machines.dm
@@ -650,6 +650,7 @@
/obj/item/weapon/circuitboard/scanner_console,
/obj/item/weapon/circuitboard/sleeper_console,
/obj/item/weapon/circuitboard/body_scanner,
+ /obj/item/weapon/circuitboard/medical_kiosk,
/obj/item/weapon/circuitboard/sleeper,
/obj/item/weapon/circuitboard/dna_analyzer)
contraband = list(/obj/item/weapon/cell/potato = 3)
diff --git a/icons/obj/machines/medical_kiosk.dmi b/icons/obj/machines/medical_kiosk.dmi
new file mode 100644
index 0000000000..fd8481ac43
Binary files /dev/null and b/icons/obj/machines/medical_kiosk.dmi differ
diff --git a/maps/tether/tether-03-surface3.dmm b/maps/tether/tether-03-surface3.dmm
index 5fa176f29e..1e0c6d0176 100644
--- a/maps/tether/tether-03-surface3.dmm
+++ b/maps/tether/tether-03-surface3.dmm
@@ -130942,31 +130942,21 @@ aaa
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/admin)
"aeN" = (
-/obj/effect/floor_decal/borderfloorwhite{
- dir = 5
- },
-/obj/effect/floor_decal/corner/paleblue/border{
- dir = 5
- },
-/obj/effect/floor_decal/borderfloorwhite/corner2{
- dir = 4
- },
-/obj/effect/floor_decal/corner/paleblue/bordercorner2{
- dir = 4
- },
/obj/structure/extinguisher_cabinet{
pixel_y = 30
},
-/obj/structure/disposalpipe/trunk,
-/obj/machinery/disposal,
-/obj/machinery/camera/network/medbay{
- dir = 8
- },
/obj/item/device/radio/intercom{
dir = 4;
name = "Station Intercom (General)";
pixel_x = 24
},
+/obj/machinery/medical_kiosk,
+/obj/effect/floor_decal/corner/paleblue{
+ dir = 6
+ },
+/obj/effect/floor_decal/corner/paleblue{
+ dir = 9
+ },
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/lobby)
"aeO" = (
@@ -131488,14 +131478,9 @@ aaa
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/lobby)
"afC" = (
-/obj/structure/cable/green{
- d1 = 1;
- d2 = 2;
- icon_state = "1-2"
- },
-/obj/structure/disposalpipe/junction{
- dir = 2;
- icon_state = "pipe-j2"
+/obj/structure/disposalpipe/segment{
+ dir = 4;
+ icon_state = "pipe-c"
},
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/lobby)
@@ -132969,6 +132954,9 @@ aaa
/obj/effect/floor_decal/corner/paleblue/bordercorner2{
dir = 9
},
+/obj/machinery/camera/network/medbay{
+ dir = 1
+ },
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/lobby)
"ahM" = (
@@ -155259,16 +155247,21 @@ aaa
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/lobby)
"aUW" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
/obj/effect/floor_decal/borderfloorwhite{
dir = 4
},
/obj/effect/floor_decal/corner/paleblue/border{
dir = 4
},
-/obj/structure/disposalpipe/segment{
- dir = 4
+/obj/effect/floor_decal/borderfloorwhite/corner2{
+ dir = 6
+ },
+/obj/effect/floor_decal/corner/paleblue/bordercorner2{
+ dir = 6
},
-/obj/structure/disposalpipe/segment,
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/lobby)
"aUX" = (
@@ -155363,10 +155356,6 @@ aaa
/obj/effect/floor_decal/corner/paleblue/border{
dir = 4
},
-/obj/structure/disposalpipe/segment{
- dir = 8;
- icon_state = "pipe-c"
- },
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/lobby)
"aVf" = (
@@ -155454,6 +155443,9 @@ aaa
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/lobby)
"aVl" = (
@@ -155472,15 +155464,16 @@ aaa
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/lobby)
"aVn" = (
-/obj/structure/bed/chair{
- dir = 1
- },
/obj/effect/floor_decal/borderfloorwhite,
/obj/effect/floor_decal/corner/paleblue/border,
/obj/machinery/alarm{
dir = 1;
pixel_y = -25
},
+/obj/machinery/disposal,
+/obj/structure/disposalpipe/trunk{
+ dir = 1
+ },
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/lobby)
"aVo" = (
@@ -166500,6 +166493,9 @@ aaa
/area/tether/surfacebase/public_garden_three)
"exM" = (
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/lobby)
"eCG" = (
@@ -171091,6 +171087,15 @@ aaa
},
/turf/simulated/floor/tiled/white,
/area/crew_quarters/kitchen)
+"wle" = (
+/obj/structure/cable/green{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/structure/disposalpipe/junction,
+/turf/simulated/floor/tiled/white,
+/area/tether/surfacebase/medical/lobby)
"wlf" = (
/obj/structure/table/glass,
/obj/machinery/atmospherics/unary/vent_pump/on,
@@ -171525,6 +171530,52 @@ aaa
/obj/machinery/camera/network/tether,
/turf/simulated/floor/tiled,
/area/tether/surfacebase/surface_three_hall)
+<<<<<<< HEAD
+||||||| parent of 3f87fb4853... Merge pull request #11234 from VOREStation/Arokha/scanmachine
+"xEb" = (
+/obj/effect/floor_decal/borderfloor{
+ dir = 8
+ },
+/obj/effect/floor_decal/corner/lightgrey/border{
+ dir = 8
+ },
+/obj/effect/floor_decal/steeldecal/steel_decals7{
+ dir = 5
+ },
+/obj/effect/floor_decal/steeldecal/steel_decals7{
+ dir = 6
+ },
+/obj/structure/sign/painting/public{
+ pixel_x = -30
+ },
+/turf/simulated/floor/tiled,
+/area/tether/surfacebase/surface_three_hall)
+=======
+"xDo" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/tether/surfacebase/medical/lobby)
+"xEb" = (
+/obj/effect/floor_decal/borderfloor{
+ dir = 8
+ },
+/obj/effect/floor_decal/corner/lightgrey/border{
+ dir = 8
+ },
+/obj/effect/floor_decal/steeldecal/steel_decals7{
+ dir = 5
+ },
+/obj/effect/floor_decal/steeldecal/steel_decals7{
+ dir = 6
+ },
+/obj/structure/sign/painting/public{
+ pixel_x = -30
+ },
+/turf/simulated/floor/tiled,
+/area/tether/surfacebase/surface_three_hall)
+>>>>>>> 3f87fb4853... Merge pull request #11234 from VOREStation/Arokha/scanmachine
"xEB" = (
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{
@@ -247829,7 +247880,7 @@ abw
ahW
lqJ
bno
-agX
+afC
aVn
aeG
qIb
@@ -248113,7 +248164,7 @@ aah
adE
aUV
bnY
-agX
+xDo
ahL
aUU
xIO
@@ -248396,8 +248447,8 @@ bnG
uAI
aOX
gtn
-afC
uAI
+wle
ahN
aii
aRW
diff --git a/vorestation.dme b/vorestation.dme
index 9817ff3985..e3126bedb0 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -869,6 +869,7 @@
#include "code\game\machinery\machinery_power.dm"
#include "code\game\machinery\magnet.dm"
#include "code\game\machinery\mass_driver.dm"
+#include "code\game\machinery\medical_kiosk.dm"
#include "code\game\machinery\navbeacon.dm"
#include "code\game\machinery\neonsign.dm"
#include "code\game\machinery\newscaster.dm"