diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm index 55ab6d7d..8e3c9653 100644 --- a/code/game/machinery/OpTable.dm +++ b/code/game/machinery/OpTable.dm @@ -2,7 +2,8 @@ name = "Operating Table" desc = "Used for advanced medical procedures." icon = 'icons/obj/surgery.dmi' - icon_state = "table2" + icon_state = "table2-idle" + var/modify_state = "table2" density = 1 anchored = 1.0 use_power = 1 @@ -95,10 +96,10 @@ var/mob/living/carbon/human/M = locate(/mob/living/carbon/human, src.loc) if(M.lying) src.victim = M - icon_state = M.pulse ? "[initial(icon_state)]-active" : "[initial(icon_state)]-idle" + icon_state = M.pulse ? "[initial(modify_state)]-active" : "[initial(modify_state)]-idle" return 1 src.victim = null - icon_state = "[initial(icon_state)]-idle" + icon_state = "[initial(modify_state)]-idle" return 0 /obj/machinery/optable/process() @@ -115,9 +116,9 @@ if(ishuman(C)) var/mob/living/carbon/human/H = C src.victim = H - icon_state = H.pulse ? "[initial(icon_state)]-active" : "[initial(icon_state)]-idle" + icon_state = H.pulse ? "[initial(modify_state)]-active" : "[initial(modify_state)]-idle" else - icon_state = "[initial(icon_state)]-idle" + icon_state = "[initial(modify_state)]-idle" /obj/machinery/optable/verb/climb_on() set name = "Climb On Table" @@ -164,7 +165,7 @@ if (computer) computer.table = null computer = null - icon_state = "[initial(icon_state)]-open" + icon_state = "[initial(modify_state)]-open" user << "You open the maintenance hatch of [src]." return 1 if (1) @@ -174,7 +175,7 @@ if (computer) computer.table = src break - icon_state = "[initial(icon_state)]-idle" + icon_state = "[initial(modify_state)]-idle" user << "You close the maintenance hatch of [src]." return 1 diff --git a/code/game/machinery/OpTable_LifeSupport.dm b/code/game/machinery/OpTable_LifeSupport.dm index 72cafdd2..37c2bb51 100644 --- a/code/game/machinery/OpTable_LifeSupport.dm +++ b/code/game/machinery/OpTable_LifeSupport.dm @@ -2,6 +2,7 @@ #define AUTO_AIR 2 #define TRANSFUSE_ACTIVE 4 #define AIR_ACTIVE 8 +#define VAMPIRE 16 /* * The more advanced life support table @@ -9,7 +10,8 @@ /obj/machinery/optable/lifesupport name = "Life Support Enabled Operating Table" desc = "A more advanced version of the standard operating table." - icon_state = "table2" + icon_state = "table3-idle" + modify_state = "table3" flags = OPENCONTAINER idle_power_usage = 3 active_power_usage = 8 @@ -17,6 +19,7 @@ var/movable = 0 //For buckling! var/buckled = 0 //Is the patient hooked up to the machine properly? var/active = 0 //Is the machine active, and providing lifesupport? + var/expired = 0 //Have we alerted the folks about a dead patient yet? var/activeoverlay //Stores an overlay to be added/removed, depending on that machine's status. var/program = 0 //Bitfield for containing the programmable settings. var/obj/item/weapon/reagent_containers/blood/bloodbag //Stores the bloodbag that you can add to the machine, for IV dripping shenanigans. @@ -26,6 +29,7 @@ "clonexadone" = 0.06, "cryoxadone" = 0.2) //Details what chemicals (use ids, not names) it keeps track of, and the minimum quantities required for operation. Each time process() is called, the associated amount of that chemical is removed from storage. //Cryoxadone will last you around 10 minutes, Clonexadone around 30. (Provided you use the standard, 60 unit beaker.) + var/list/internallog = list() //A log of everything that has happened on the table. Has two keys per entry: "time" and "message". /obj/machinery/optable/lifesupport/New() ..() @@ -40,7 +44,7 @@ component_parts += new /obj/item/clothing/mask/breath/medical(src) RefreshParts() - var/image/i = image('icons/obj/surgery.dmi', icon_state = "table-lifesupport-disabledoverlay") + var/image/i = image('icons/obj/surgery.dmi', icon_state = "table3-disabledoverlay") activeoverlay = i overlays += activeoverlay @@ -74,6 +78,15 @@ user << "There is already [airsupply] in [src]!" return + if (istype(W, /obj/item/weapon/card/emag)) + if (!emagged) + emagged = 1 + user << "You run [W] through [src], hear the machine quietly whirr. A new option has been unlocked." + return + else + user << "[src] is already emagged!" + return + /obj/machinery/optable/lifesupport/process() ..() @@ -99,6 +112,11 @@ else reagents.remove_reagent(id, requiredchems[id]) + if (victim.stat == 2 && !expired) + broadcastalert("ALERT! Patient death detected!") + addtolog("Patient death detected.") + expired = 1 + var/bloodvolume = round(victim.vessel.get_reagent_amount("blood")) if ((program & AUTO_TRANSFUSE) && bloodbag && bloodbag.reagents.total_volume) if (bloodvolume < BLOOD_VOLUME_SAFE && !(program & TRANSFUSE_ACTIVE)) @@ -119,6 +137,9 @@ if ((program & AIR_ACTIVE) && (!airsupply || airsupply.air_contents.return_pressure() < 10)) toggleprogram(AIR_ACTIVE) + if (program & VAMPIRE) + victim.vessel.remove_reagent("blood", 5) + /obj/machinery/optable/lifesupport/check_table(mob/living/carbon/patient as mob) if (victim) usr << "\blue The table is already occupied!" @@ -150,6 +171,14 @@ return 0 +/obj/machinery/optable/lifesupport/proc/addtolog(var/log as text) + var/time = worldtime2text() + internallog.Add(list(list("time" = time, "message" = log))) + +/obj/machinery/optable/lifesupport/proc/clearlog() + if (internallog.len) + internallog = list() + /obj/machinery/optable/lifesupport/proc/eject(var/item as text) switch (item) if ("airsupply") @@ -161,6 +190,7 @@ airsupply.loc = loc airsupply = null broadcastalert("Internal air supply ejected.") + addtolog("Internal air supply ejected.") return if ("bloodbag") if (bloodbag) @@ -170,15 +200,17 @@ else bloodbag.loc = loc bloodbag = null - broadcastalert("Internal bloodsupply ejected.") + broadcastalert("Internal blood supply ejected.") + addtolog("Internal blood supply ejected.") return if ("chems") if (reagents.total_volume) if (active) - broadcastalert("ERROR: Lifesupport systems enabled, unable to flush chemicals. Aborting!") + broadcastalert("ERROR: Life support systems enabled, unable to flush chemicals. Aborting!") return else broadcastalert("Stored chemicals flushed.") + addtolog("Stored chemicals flushed.") reagents.clear_reagents() /obj/machinery/optable/lifesupport/proc/buckle(mob/living/carbon/human/patient as mob, mob/living/carbon/human/user as mob) @@ -211,6 +243,7 @@ patient.buckled = src patient.update_canmove() patient.equip_to_slot(airmask, slot_wear_mask) + addtolog("Restraints activated.") return if (1) user.visible_message("[user] unbuckles \the [victim] from \the [src], disconnecting them from the tubing and straps.", "You remove \the [victim]'s restraints, and unhook them from the life-support machine.") @@ -222,6 +255,7 @@ patient.update_canmove() patient.u_equip(airmask) airmask.loc = src + addtolog("Restraints deactivated.") return /obj/machinery/optable/lifesupport/verb/bucklepatient() @@ -254,18 +288,19 @@ return if (victim.stat == DEAD) - broadcastalert("ERROR: No lifesigns detected from the patient. Unable to enable lifesupport systems.") + broadcastalert("ERROR: No life signs detected from the patient. Unable to enable life support systems.") return if (checkrequiredchems()) if (activeoverlay) overlays -= activeoverlay activeoverlay = null - var/image/i = image('icons/obj/surgery.dmi', icon_state = "table-lifesupport-activeoverlay") + var/image/i = image('icons/obj/surgery.dmi', icon_state = "table3-activeoverlay") activeoverlay = i overlays += activeoverlay active = 1 - broadcastalert("Patient detected. Lifesupport systems enabled.") + broadcastalert("Patient detected. Life support systems enabled.") + addtolog("Life support systems enabled.") return else broadcastalert("ERROR: Required chemicals not detected in the machine. Aborting!") @@ -292,15 +327,17 @@ if (activeoverlay) overlays -= activeoverlay activeoverlay = null - var/image/i = image('icons/obj/surgery.dmi', icon_state = "table-lifesupport-disabledoverlay") + var/image/i = image('icons/obj/surgery.dmi', icon_state = "table3-disabledoverlay") activeoverlay = i overlays += activeoverlay active = 0 if (override) broadcastalert("ERROR: Not enough chemicals to sustain lifesupport functionality! Shutting down lifesupport systems!") + addtolog("Emergency shutdown of life support systems.") else broadcastalert("Lifesupport systems disabled.") + addtolog("Life support systems disabled.") return @@ -315,11 +352,14 @@ setting = TRANSFUSE_ACTIVE if ("AIR_ACTIVE") setting = AIR_ACTIVE + if ("VAMPIRE") + setting = VAMPIRE if (program & setting) switch (setting) if (TRANSFUSE_ACTIVE) broadcastalert("Transfusion processes deactivated.") + addtolog("Transfusion processes deactivated.") program &= ~setting return if (AIR_ACTIVE) @@ -328,15 +368,31 @@ if (victim.internals) victim.internals.icon_state = "internal0" broadcastalert("Internal air supply deactivated.") + addtolog("Internal air supply deactivated.") program &= ~setting return + if (VAMPIRE) + if (!emagged) + return + else + program &= ~setting + return else + var/textname + if (setting == AUTO_TRANSFUSE) + textname = "Automatic transfusion control" + else if (setting == AUTO_AIR) + textname = "Automatic air supply control" + else + textname = "Unknown program" + addtolog("[textname] deactivated.") program &= ~setting else switch (setting) if (TRANSFUSE_ACTIVE) if (bloodbag && bloodbag.reagents.total_volume) broadcastalert("Transfusion processes activated.") + addtolog("Transfusion processes activated.") program |= setting return else @@ -349,12 +405,26 @@ if (victim.internals) victim.internals.icon_state = "internal1" broadcastalert("Internal air supply activated.") + addtolog("Internal air supply activated.") program |= setting return else broadcastalert("Air supply empty or not connected!") return + if (VAMPIRE) + if (!emagged) + return + else + program |= setting else + var/textname + if (setting == AUTO_TRANSFUSE) + textname = "Automatic transfusion control" + else if (setting == AUTO_AIR) + textname = "Automatic air supply control" + else + textname = "Unknown program" + addtolog("[textname] activated.") program |= setting /obj/machinery/optable/lifesupport/proc/checkprogram(var/textsetting as text) @@ -368,6 +438,8 @@ setting = TRANSFUSE_ACTIVE if ("AIR_ACTIVE") setting = AIR_ACTIVE + if ("VAMPIRE") + setting = VAMPIRE if (program & setting) return 1 @@ -378,3 +450,4 @@ #undef AUTO_AIR #undef TRANSFUSE_ACTIVE #undef AIR_ACTIVE +#undef VAMPIRE diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm index 3c4c4ddf..7f59e177 100644 --- a/code/game/machinery/computer/Operating.dm +++ b/code/game/machinery/computer/Operating.dm @@ -7,6 +7,7 @@ icon_state = "operating" circuit = "/obj/item/weapon/circuitboard/operating" interact_offline = 0 + var/screen = 1 var/obj/machinery/optable/table = null /obj/machinery/computer/operating/New() @@ -41,72 +42,86 @@ var/data[0] data["table"] = 0 + data["screen"] = screen if (table) if (istype(table, /obj/machinery/optable/lifesupport)) data["table"] = 2 else data["table"] = 1 - var/patientgeneral[0] - var/patienthealth[0] - if (table.victim) - var/mob/living/carbon/human/patient = table.victim - patientgeneral["Name"] = patient.real_name - patientgeneral["Age"] = patient.age - patientgeneral["BloodType"] = patient.b_type - data["patientgeneral"] = patientgeneral; + if (screen == 1) + var/patientgeneral[0] + var/patienthealth[0] + if (table.victim) + var/mob/living/carbon/human/patient = table.victim + patientgeneral["Name"] = patient.real_name + patientgeneral["Age"] = patient.age + patientgeneral["BloodType"] = patient.b_type + data["patientgeneral"] = patientgeneral; - patienthealth["Health"] = patient.health - patienthealth["Brute"] = patient.getBruteLoss() - patienthealth["Toxins"] = patient.getToxLoss() - patienthealth["Burn"] = patient.getFireLoss() - patienthealth["Suffocation"] = patient.getOxyLoss() - patienthealth["Status"] = patient.stat ? "Non-response" : "Stable" - patienthealth["Heartrate"] = patient.get_pulse(GETPULSE_TOOL) - data["patienthealth"] = patienthealth; + patienthealth["Health"] = round(patient.health) + patienthealth["Brute"] = round(patient.getBruteLoss()) + patienthealth["Toxins"] = round(patient.getToxLoss()) + patienthealth["Burn"] = round(patient.getFireLoss()) + patienthealth["Suffocation"] = round(patient.getOxyLoss()) + patienthealth["Status"] = patient.stat ? "Non-responsive" : "Stable" + patienthealth["Heartrate"] = patient.get_pulse(GETPULSE_TOOL) + if (data["table"] == 2) + patienthealth["BloodLevel"] = round(patient.vessel.get_reagent_amount("blood")) + data["patienthealth"] = patienthealth; - if (data["table"] == 2) - var/obj/machinery/optable/lifesupport/A = table - data["buckled"] = A.buckled - data["lifesupport"] = A.onlifesupport() + if (data["table"] == 2) + var/obj/machinery/optable/lifesupport/A = table + data["buckled"] = A.buckled + data["lifesupport"] = A.onlifesupport() - if (A.reagents.reagent_list.len) - data["hasreagents"] = 1 - var/loadedreagents[0] - for(var/datum/reagent/chem in A.reagents.reagent_list) - loadedreagents.Add(list(list("name" = chem.name, "volume" = chem.volume))) - data["loadedreagents"] = loadedreagents; - else - data["hasreagents"] = 0 - - if (A.airsupply) - data["hasair"] = 1 - var/air[0] - air["internalpressure"] = round(A.airsupply.air_contents.return_pressure()) - air["releasepressure"] = round(A.airsupply.distribute_pressure) - data["air"] = air; - else - data["hasair"] = 0 - - if (A.bloodbag) - data["hasblood"] = 1 - var/blood[0] - blood["volume"] = A.bloodbag.reagents.total_volume - if (A.bloodbag.reagents.reagent_list.len) - for (var/datum/reagent/blood/Blood in A.bloodbag.reagents.reagent_list) - blood["type"] = Blood.data["blood_type"] + if (A.reagents.reagent_list.len) + data["hasreagents"] = 1 + var/loadedreagents[0] + for(var/datum/reagent/chem in A.reagents.reagent_list) + loadedreagents.Add(list(list("name" = chem.name, "volume" = round(chem.volume)))) + data["loadedreagents"] = loadedreagents; else - blood["type"] = "N/A" - data["blood"] = blood; - else - data["hasblood"] = 0 + data["hasreagents"] = 0 - var/program[0] - program["autotransfuse"] = A.checkprogram("AUTO_TRANSFUSE") - program["transfuseactive"] = A.checkprogram("TRANSFUSE_ACTIVE") - program["autoair"] = A.checkprogram("AUTO_AIR") - program["airactive"] = A.checkprogram("AIR_ACTIVE") - data["program"] = program; + if (A.airsupply) + data["hasair"] = 1 + var/air[0] + air["internalpressure"] = round(A.airsupply.air_contents.return_pressure()) + air["releasepressure"] = round(A.airsupply.distribute_pressure) + data["air"] = air; + else + data["hasair"] = 0 + + if (A.bloodbag) + data["hasblood"] = 1 + var/blood[0] + blood["volume"] = A.bloodbag.reagents.total_volume + if (A.bloodbag.reagents.reagent_list.len) + for (var/datum/reagent/blood/Blood in A.bloodbag.reagents.reagent_list) + blood["type"] = Blood.data["blood_type"] + else + blood["type"] = "N/A" + data["blood"] = blood; + else + data["hasblood"] = 0 + + var/program[0] + program["autotransfuse"] = A.checkprogram("AUTO_TRANSFUSE") + program["transfuseactive"] = A.checkprogram("TRANSFUSE_ACTIVE") + program["autoair"] = A.checkprogram("AUTO_AIR") + program["airactive"] = A.checkprogram("AIR_ACTIVE") + program["vampire"] = A.checkprogram("VAMPIRE") + program["emagged"] = A.emagged + data["program"] = program; + + else if (screen == 2) + if (data["table"] == 1) + screen = 1 + return + + var/obj/machinery/optable/lifesupport/B = table + data["log"] = B.internallog; ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) @@ -135,4 +150,10 @@ if (href_list["toggle_program"]) A.toggleprogram(null, href_list["toggle_program"]) return 1 + if (href_list["select_screen"]) + screen = text2num(href_list["select_screen"]) + return 1 + if (href_list["clear_log"]) + A.clearlog() + return 1 return 1 diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 79dc0096..15d6f67c 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1665,24 +1665,24 @@ if (head_organ.covering) return head_organ.covering.hair_species return species.name - - + + /mob/living/carbon/human/proc/valid_hairstyles_for_this_mob() return get_valid_hairstyles(gender, hair_species_name()) - + /mob/living/carbon/human/proc/valid_facialhairstyles_for_this_mob() return get_valid_facialhairstyles(gender, hair_species_name()) - - + + /mob/living/carbon/human/proc/should_we_show_hair() var/datum/organ/external/head/head_organ = get_organ("head") if(!head_organ || (head_organ.status & ORGAN_DESTROYED)) - return + return if( (head && (head.flags & BLOCKHAIR)) || (wear_mask && (wear_mask.flags & BLOCKHAIR))) return return TRUE - + /mob/living/carbon/human/proc/validate_hair() var/list/hair=valid_hairstyles_for_this_mob() if (!(h_style in hair)) @@ -1691,7 +1691,7 @@ if (!(f_style in face)) f_style=null - + /mob/living/carbon/human/proc/hair_icon() if (h_style) var/datum/sprite_accessory/hair_style = hair_styles_list[h_style] @@ -1699,8 +1699,8 @@ if(hair_style.do_colouration) hair.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD) return hair - - + + /mob/living/carbon/human/proc/facial_hair_icon() if (f_style) var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[f_style] @@ -1708,15 +1708,15 @@ if(facial_hair_style.do_colouration) facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD) return facial_s - - + + /mob/living/carbon/human/proc/get_eye_icon_state() var/datum/organ/external/head/head_organ = get_organ("head") if (head_organ.covering) return head_organ.covering.eyes_state return species.eyes - - + + /mob/living/carbon/human/proc/eye_icon() var/icon/result_icon = new/icon('icons/mob/human_face.dmi', get_eye_icon_state()) result_icon.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD) @@ -1729,12 +1729,19 @@ return list(groin_organ.covering.tail,groin_organ.covering.colour) if (species.tail) return list(species.tail,rgb(r_skin, g_skin, b_skin)) - - + + /mob/living/carbon/human/proc/tail_icon() var/list/tail_info = tail_icon_state() if(!isnull(tail_info)) if(!wear_suit || !(wear_suit.flags_inv & HIDETAIL) && !istype(wear_suit, /obj/item/clothing/suit/space)) var/icon/tail_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[tail_info[1]]_s") tail_s.Blend(tail_info[2], ICON_ADD) - return tail_s \ No newline at end of file + return tail_s + +/mob/living/carbon/human/proc/isonlifesupport() + if (buckled && istype(buckled, /obj/machinery/optable/lifesupport)) + var/obj/machinery/optable/lifesupport/A = buckled + return A.onlifesupport() + else + return 0 diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 5e14402c..bc7bec90 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1136,7 +1136,7 @@ handle_organs() //Optimized. handle_blood() - if(health <= config.health_threshold_dead || (species.has_organ["brain"] && !has_brain())) + if(health <= config.health_threshold_dead || (species.has_organ["brain"] && !has_brain() && !isonlifesupport())) death() blinded = 1 silent = 0 diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index a6ef98d0..7aa7d6de 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -67,13 +67,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122 if(species && species.has_organ["heart"]) var/datum/organ/internal/heart/heart = internal_organs_by_name["heart"] - // Before we do that, we check for lifesupport. - var/onlifesupport = 0 - if (buckled && istype(buckled, /obj/machinery/optable/lifesupport)) - var/obj/machinery/optable/lifesupport/A = buckled - onlifesupport = A.onlifesupport() - - if (!onlifesupport) + if (!isonlifesupport()) if(!heart) blood_volume = 0 else if(heart.damage > 1 && heart.damage < heart.min_bruised_damage) diff --git a/code/modules/organs/organ_internal.dm b/code/modules/organs/organ_internal.dm index 2694caeb..d6a26a1a 100644 --- a/code/modules/organs/organ_internal.dm +++ b/code/modules/organs/organ_internal.dm @@ -42,10 +42,8 @@ /datum/organ/internal/process() //Check if we're on lifesupport, and whether or not organs should be processing. - if (owner.buckled && istype(owner.buckled, /obj/machinery/optable/lifesupport)) - var/obj/machinery/optable/lifesupport/A = owner.buckled - if (A.onlifesupport()) - return 1 + if (owner.isonlifesupport()) + return 1 //Process infections if (robotic >= 2 || (owner.species && owner.species.flags & IS_PLANT)) //TODO make robotic internal and external organs separate types of organ instead of a flag diff --git a/code/modules/organs/organ_objects.dm b/code/modules/organs/organ_objects.dm index 2340a34e..5c1ec0f1 100644 --- a/code/modules/organs/organ_objects.dm +++ b/code/modules/organs/organ_objects.dm @@ -191,7 +191,9 @@ user.attack_log += "\[[time_stamp()]\] removed a vital organ ([src]) from [target.name] ([target.ckey]) (INTENT: [uppertext(user.a_intent)])" target.attack_log += "\[[time_stamp()]\] had a vital organ ([src]) removed by [user.name] ([user.ckey]) (INTENT: [uppertext(user.a_intent)])" msg_admin_attack("[user.name] ([user.ckey]) removed a vital organ ([src]) from [target.name] ([target.ckey]) (INTENT: [uppertext(user.a_intent)]) (JMP)") - target.death() + + if (!target.isonlifesupport()) + target.death() /obj/item/organ/proc/exposed_to_the_world() // this is only useful for organs that change when actually removed from the body diff --git a/nano/templates/operating_computer.tmpl b/nano/templates/operating_computer.tmpl index 22b929f8..38bf021b 100644 --- a/nano/templates/operating_computer.tmpl +++ b/nano/templates/operating_computer.tmpl @@ -7,218 +7,254 @@ Used In File(s): \code\game\machinery\computer\Operating.dm






No connected table detected! {{else}} -
-

Patient Information:

+ {{if data.screen == 1}} +
+

Patient Information:

- {{if data.patientgeneral && data.patienthealth}} + {{if data.patientgeneral && data.patienthealth}} -
-
- Name: +
+
+ Name: +
+
+ {{:data.patientgeneral.Name}} +
-
- {{:data.patientgeneral.Name}} +
+
+ Age: +
+
+ {{:data.patientgeneral.Age}} +
-
-
-
- Age: +
+
+ Blood Type: +
+
+ {{:data.patientgeneral.BloodType}} +
-
- {{:data.patientgeneral.Age}} -
-
-
-
- Blood Type: -
-
- {{:data.patientgeneral.BloodType}} -
-
-
-
- Health: +
+
+ Health: +
+
+ {{:data.patienthealth.Health}} +
-
- {{:data.patienthealth.Health}} +
+
+ Brute Damage: +
+
+ {{:data.patienthealth.Brute}} +
-
-
-
- Brute Damage: +
+
+ Toxins Damage: +
+
+ {{:data.patienthealth.Toxins}} +
-
- {{:data.patienthealth.Brute}} +
+
+ Burn Damage: +
+
+ {{:data.patienthealth.Burn}} +
-
-
-
- Toxins Damage: +
+
+ Suffocation Damage: +
+
+ {{:data.patienthealth.Suffocation}} +
-
- {{:data.patienthealth.Toxins}} +
+
+ Status: +
+
+ {{:data.patienthealth.Status}} +
-
-
-
- Burn Damage: +
+
+ Heartbeat Rate: +
+
+ {{:data.patienthealth.Heartrate}} bpm +
-
- {{:data.patienthealth.Burn}} + {{if data.table == 2}} +
+
+ Blood Level: +
+
+ {{:data.patienthealth.BloodLevel}} cl +
+
+ {{/if}} + {{else}} +
+ No Patient Detected!
-
-
-
- Suffocation Damage: + {{/if}} +
+ + {{if data.table == 2}} +
+

Life Support Systems Detected

+

Machine Information:

+ +
+
+ Restraints: +
+
+ {{:data.buckled ? 'Active' : 'Inactive'}} +
-
- {{:data.patienthealth.Suffocation}} + +
+
+ Life Support Systems: +
+
+ {{:data.lifesupport ? 'Enabled' : 'Disabled'}} +
+
+ {{:helper.link(data.lifesupport ? 'Disable Life Support' : 'Enable Life Support', data.lifesupport ? 'close' : 'check', {'toggle_lifesupport' : 1}, null)}} +
-
-
-
- Status: + +
+
+ Stored Chemicals +
+
+ {{:helper.link('Flush Chemicals', 'eject', {'eject_advanced' : 'chems'}, data.hasreagents ? null : 'disabled', 'floatRight')}} +
-
- {{:data.patienthealth.Status}} + + {{if data.hasreagents}} +
+
+
+ {{for data.loadedreagents}} + {{:value.volume}} units of {{:value.name}}
+ {{/for}} +
+
+
+ {{else}} +
+ No chemicals stored! +
+ {{/if}} + +
+
+ Internal Air Tank +
+
+ {{:helper.link('Eject Air Tank', 'eject', {'eject_advanced' : 'airsupply'}, data.hasair ? null : 'disabled', 'floatRight')}} +
-
-
-
- Heartbeat Rate: + + {{if data.hasair}} +
+
+
+ Tank Internal Pressure: {{:data.air.internalpressure}} kPa
+ Tank Release Pressure: {{:data.air.releasepressure}} kPa +
+
+
+ {{else}} +
+ No air tank detected! +
+ {{/if}} + +
+
+ Internal Blood Supply +
+
+ {{:helper.link('Eject Blood Bag', 'eject', {'eject_advanced' : 'bloodbag'}, data.hasblood ? null : 'disabled', 'floatRight')}} +
-
- {{:data.patienthealth.Heartrate}} + + {{if data.hasblood}} +
+
+
+ Stored Volume: {{:data.blood.volume}}
+ Blood Type: {{:data.blood.type}} +
+
+
+ {{else}} +
+ No blood bag detected! +
+ {{/if}} + +

Programming Information:

+ +
+
+
Transfusion Control:
+
{{:helper.link(data.program.autotransfuse ? 'Automated' : 'Manually Controlled', 'refresh', {'toggle_program' : 'AUTO_TRANSFUSE'}, null)}}
+
+
+
Transfusion:
+
{{:helper.link(data.program.transfuseactive ? 'Activated' : 'Deactivated', 'refresh', {'toggle_program' : 'TRANSFUSE_ACTIVE'}, data.program.autotransfuse ? 'disabled' : null)}}
+
+
+
Air Control:
+
{{:helper.link(data.program.autoair ? 'Automated' : 'Manually Controlled', 'refresh', {'toggle_program' : 'AUTO_AIR'}, null)}}
+
+
+
Air Status:
+
{{:helper.link(data.program.airactive ? 'Activated' : 'Deactivated', 'refresh', {'toggle_program' : 'AIR_ACTIVE'}, data.program.autoair ? 'disabled' : null)}}
+
+ {{if data.program.emagged}} +
+
Blood Syphons:
+
{{:helper.link(data.program.vampire ? 'Activated' : 'Deactivated', 'refresh', {'toggle_program' : 'VAMPIRE'})}}
+
+ {{/if}}
-
- {{else}} -
- No Patient Detected! + + {{:helper.link('Show Logs', 'gear', {'select_screen' : '2'})}}
{{/if}} -
+ {{else data.screen == 2}} + {{:helper.link('Main Menu', 'gear', {'select_screen' : '1'})}} + {{:helper.link('Clear Log', 'gear', {'clear_log' : '1'})}} - {{if data.table == 2}} -
-

Life Support Systems Detected

-

Machine Information:

- -
-
- Restraints: -
-
- {{:data.buckled ? 'Active' : 'Inactive'}} -
-
- -
-
- Life Support Systems: -
-
- {{:data.lifesupport ? 'Enabled' : 'Disabled'}} -
-
- {{:helper.link(data.lifesupport ? 'Disable Life Support' : 'Enable Life Support', data.lifesupport ? 'close-thick' : 'check', {'toggle_lifesupport' : 1}, null, 'floatRight')}} -
-
- -
-
- Stored Chemicals -
-
- {{:helper.link('Flush Chemicals', 'eject', {'eject_advanced' : 'chems'}, data.hasreagents ? null : 'disabled', 'floatRight')}} -
-
- - {{if data.hasreagents}} -
-
-
- {{for data.loadedreagents}} - {{:value.volume}} units of {{:value.name}}
- {{/for}} -
-
-
- {{else}} -
- No chemicals stored! -
- {{/if}} - -
-
- Internal Air Tank -
-
- {{:helper.link('Eject Air Tank', 'eject', {'eject_advanced' : 'airsupply'}, data.hasair ? null : 'disabled', 'floatRight')}} -
-
- - {{if data.hasair}} -
-
-
- Tank Internal Pressure: {{:data.air.internalpressure}} kPa
- Tank Release Pressure: {{:data.air.releasepressure}} kPa -
-
-
- {{else}} -
- No air tank detected! -
- {{/if}} - -
-
- Internal Blood Supply -
-
- {{:helper.link('Eject Blood Bag', 'eject', {'eject_advanced' : 'bloodbag'}, data.hasblood ? null : 'disabled', 'floatRight')}} -
-
- - {{if data.hasblood}} -
-
-
- Stored Volume: {{:data.blood.volume}}
- Blood Type: {{:data.blood.type}} -
-
-
- {{else}} -
- No blood bag detected! -
- {{/if}} - -

Programming Information:

- -
-
-
Transfusion Control:
-
{{:helper.link(data.program.autotransfuse ? 'Automated' : 'Manually Controlled', 'refresh', {'toggle_program' : 'AUTO_TRANSFUSE'}, null)}}
-
-
-
Transfusion:
-
{{:helper.link(data.program.transfuseactive ? 'Activated' : 'Deactivated', 'refresh', {'toggle_program' : 'TRANSFUSE_ACTIVE'}, data.program.autotransfuse ? 'disabled' : null)}}
-
-
-
Air Control:
-
{{:helper.link(data.program.autoair ? 'Automated' : 'Manually Controlled', 'refresh', {'toggle_program' : 'AUTO_AIR'}, null)}}
-
-
-
Air Status:
-
{{:helper.link(data.program.airactive ? 'Activated' : 'Deactivated', 'refresh', {'toggle_program' : 'AIR_ACTIVE'}, data.program.autoair ? 'disabled' : null)}}
-
-
-
+ {{if data.log}} + + + + + + {{for data.log}} + + {{/for}} + +
Timestamp:Message:
{{:value.time}}{{:value.message}}
+ {{/if}} {{/if}} {{/if}}