mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-02-05 22:09:05 +00:00
157 lines
5.2 KiB
Plaintext
157 lines
5.2 KiB
Plaintext
#define MENU_OPERATION 1
|
|
#define MENU_SURGERIES 2
|
|
|
|
/obj/machinery/computer/operating
|
|
name = "operating computer"
|
|
desc = "Monitors patient vitals and displays surgery steps. Can be loaded with surgery disks to perform experimental procedures. Automatically syncs to stasis beds within its line of sight for surgical tech advancement."
|
|
icon_screen = "crew"
|
|
icon_keyboard = "med_key"
|
|
circuit = /obj/item/circuitboard/computer/operating
|
|
ui_x = 350
|
|
ui_y = 470
|
|
|
|
var/mob/living/carbon/human/patient
|
|
var/obj/structure/table/optable/table
|
|
var/obj/machinery/stasis/sbed
|
|
var/list/advanced_surgeries = list()
|
|
var/datum/techweb/linked_techweb
|
|
light_color = LIGHT_COLOR_BLUE
|
|
|
|
/obj/machinery/computer/operating/Initialize()
|
|
. = ..()
|
|
linked_techweb = SSresearch.science_tech
|
|
find_table()
|
|
|
|
/obj/machinery/computer/operating/Destroy()
|
|
for(var/direction in GLOB.cardinals)
|
|
table = locate(/obj/structure/table/optable, get_step(src, direction))
|
|
if(table && table.computer == src)
|
|
table.computer = null
|
|
else
|
|
sbed = locate(/obj/machinery/stasis, get_step(src, direction))
|
|
if(sbed && sbed.op_computer == src)
|
|
sbed.op_computer = null
|
|
. = ..()
|
|
|
|
/obj/machinery/computer/operating/attackby(obj/item/O, mob/user, params)
|
|
if(istype(O, /obj/item/disk/surgery))
|
|
user.visible_message("<span class='notice'>[user] begins to load \the [O] in \the [src]...</span>", \
|
|
"<span class='notice'>You begin to load a surgery protocol from \the [O]...</span>", \
|
|
"<span class='hear'>You hear the chatter of a floppy drive.</span>")
|
|
var/obj/item/disk/surgery/D = O
|
|
if(do_after(user, 10, target = src))
|
|
advanced_surgeries |= D.surgeries
|
|
return TRUE
|
|
return ..()
|
|
|
|
/obj/machinery/computer/operating/proc/sync_surgeries()
|
|
for(var/i in linked_techweb.researched_designs)
|
|
var/datum/design/surgery/D = SSresearch.techweb_design_by_id(i)
|
|
if(!istype(D))
|
|
continue
|
|
advanced_surgeries |= D.surgery
|
|
|
|
/obj/machinery/computer/operating/proc/find_table()
|
|
for(var/direction in GLOB.cardinals)
|
|
table = locate(/obj/structure/table/optable, get_step(src, direction))
|
|
if(table)
|
|
table.computer = src
|
|
break
|
|
else
|
|
sbed = locate(/obj/machinery/stasis, get_step(src, direction))
|
|
if(sbed)
|
|
sbed.op_computer = src
|
|
break
|
|
|
|
/obj/machinery/computer/operating/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.not_incapacitated_state)
|
|
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
|
|
if(!ui)
|
|
ui = new(user, src, ui_key, "operating_computer", name, ui_x, ui_y, master_ui, state)
|
|
ui.open()
|
|
|
|
/obj/machinery/computer/operating/ui_data(mob/user)
|
|
var/list/data = list()
|
|
var/list/surgeries = list()
|
|
for(var/X in advanced_surgeries)
|
|
var/datum/surgery/S = X
|
|
var/list/surgery = list()
|
|
surgery["name"] = initial(S.name)
|
|
surgery["desc"] = initial(S.desc)
|
|
surgeries += list(surgery)
|
|
data["surgeries"] = surgeries
|
|
data["patient"] = null
|
|
if(table)
|
|
data["table"] = table
|
|
if(!table.check_patient())
|
|
return data
|
|
data["patient"] = list()
|
|
patient = table.patient
|
|
else
|
|
if(sbed)
|
|
data["table"] = sbed
|
|
if(!sbed.check_patient())
|
|
return data
|
|
data["patient"] = list()
|
|
patient = sbed.occupant
|
|
else
|
|
data["patient"] = null
|
|
return data
|
|
|
|
switch(patient.stat)
|
|
if(CONSCIOUS)
|
|
data["patient"]["stat"] = "Conscious"
|
|
data["patient"]["statstate"] = "good"
|
|
if(SOFT_CRIT)
|
|
data["patient"]["stat"] = "Conscious"
|
|
data["patient"]["statstate"] = "average"
|
|
if(UNCONSCIOUS)
|
|
data["patient"]["stat"] = "Unconscious"
|
|
data["patient"]["statstate"] = "average"
|
|
if(DEAD)
|
|
data["patient"]["stat"] = "Dead"
|
|
data["patient"]["statstate"] = "bad"
|
|
data["patient"]["health"] = patient.health
|
|
data["patient"]["blood_type"] = patient.dna.blood_type
|
|
data["patient"]["maxHealth"] = patient.maxHealth
|
|
data["patient"]["minHealth"] = HEALTH_THRESHOLD_DEAD
|
|
data["patient"]["bruteLoss"] = patient.getBruteLoss()
|
|
data["patient"]["fireLoss"] = patient.getFireLoss()
|
|
data["patient"]["toxLoss"] = patient.getToxLoss()
|
|
data["patient"]["oxyLoss"] = patient.getOxyLoss()
|
|
if(patient.surgeries.len)
|
|
data["procedures"] = list()
|
|
for(var/datum/surgery/procedure in patient.surgeries)
|
|
var/datum/surgery_step/surgery_step = procedure.get_surgery_step()
|
|
var/chems_needed = surgery_step.get_chem_list()
|
|
var/alternative_step
|
|
var/alt_chems_needed = ""
|
|
if(surgery_step.repeatable)
|
|
var/datum/surgery_step/next_step = procedure.get_surgery_next_step()
|
|
if(next_step)
|
|
alternative_step = capitalize(next_step.name)
|
|
alt_chems_needed = next_step.get_chem_list()
|
|
else
|
|
alternative_step = "Finish operation"
|
|
data["procedures"] += list(list(
|
|
"name" = capitalize("[parse_zone(procedure.location)] [procedure.name]"),
|
|
"next_step" = capitalize(surgery_step.name),
|
|
"chems_needed" = chems_needed,
|
|
"alternative_step" = alternative_step,
|
|
"alt_chems_needed" = alt_chems_needed
|
|
))
|
|
return data
|
|
|
|
|
|
|
|
/obj/machinery/computer/operating/ui_act(action, params)
|
|
if(..())
|
|
return
|
|
switch(action)
|
|
if("sync")
|
|
sync_surgeries()
|
|
. = TRUE
|
|
. = TRUE
|
|
|
|
#undef MENU_OPERATION
|
|
#undef MENU_SURGERIES
|