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}}
-
| Timestamp: | Message: |
| {{:value.time}} | {{:value.message}} |