diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm
index 0e16bfe18ae..0cef06f2fa2 100644
--- a/code/game/objects/items/weapons/defib.dm
+++ b/code/game/objects/items/weapons/defib.dm
@@ -366,8 +366,8 @@
for(var/obj/item/organ/external/O in H.organs)
total_brute += O.brute_dam
total_burn += O.burn_dam
- if(H.health <= config.health_threshold_dead && total_burn <= 180 && total_brute <= 180 && !H.suiciding && !ghost && tplus < tlimit && !(NOCLONE in H.mutations))
- tobehealed = health + threshold
+ if(total_burn <= 180 && total_brute <= 180 && !H.suiciding && !ghost && tplus < tlimit && !(NOCLONE in H.mutations))
+ tobehealed = min(health + threshold, 0) // It's HILARIOUS without this min statement, let me tell you
tobehealed -= 5 //They get 5 of each type of damage healed so excessive combined damage will not immediately kill them after they get revived
H.adjustOxyLoss(tobehealed)
H.adjustToxLoss(tobehealed)
@@ -475,8 +475,8 @@
for(var/obj/item/organ/external/O in H.organs)
total_brute += O.brute_dam
total_burn += O.burn_dam
- if(H.health <= config.health_threshold_dead && total_burn <= 180 && total_brute <= 180 && !H.suiciding && !ghost && tplus < tlimit && !(NOCLONE in H.mutations))
- tobehealed = health + threshold
+ if(total_burn <= 180 && total_brute <= 180 && !H.suiciding && !ghost && tplus < tlimit && !(NOCLONE in H.mutations))
+ tobehealed = min(health + threshold, 0) // It's HILARIOUS without this min statement, let me tell you
tobehealed -= 5 //They get 5 of each type of damage healed so excessive combined damage will not immediately kill them after they get revived
H.adjustOxyLoss(tobehealed)
H.adjustToxLoss(tobehealed)
diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm
index ae796523aa9..64a5ad53948 100644
--- a/code/game/objects/items/weapons/kitchen.dm
+++ b/code/game/objects/items/weapons/kitchen.dm
@@ -63,6 +63,9 @@
overlays.Cut()
return
+ if (can_operate(M))
+ do_surgery(M, user, src)
+
/obj/item/weapon/kitchen/utensil/fork
name = "fork"
desc = "It's a fork. Sure is pointy."
diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm
index c891c9e2cd2..28879225b39 100644
--- a/code/modules/mob/living/carbon/human/human_organs.dm
+++ b/code/modules/mob/living/carbon/human/human_organs.dm
@@ -150,3 +150,14 @@
var/list/all_bits = internal_organs|organs
for(var/obj/item/organ/O in all_bits)
O.set_dna(dna)
+
+/*
+Given the name of an organ, returns the external organ it's contained in
+I use this to standardize shadowling dethrall code
+-- Crazylemon
+*/
+/mob/living/carbon/human/proc/named_organ_parent(var/organ_name)
+ if (!(organ_name in internal_organs_by_name))
+ return null
+ var/obj/item/organ/O = internal_organs_by_name[organ_name]
+ return O.parent_organ
\ No newline at end of file
diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm
index ca625443893..1c6ca1d176b 100644
--- a/code/modules/organs/organ_external.dm
+++ b/code/modules/organs/organ_external.dm
@@ -139,6 +139,9 @@
//robot limbs take reduced damage
brute_mod = 0.66
burn_mod = 0.66
+ // Robot parts also lack bones
+ // This is so surgery isn't kaput, let's see how this does
+ encased = null
/****************************************************
DAMAGE PROCS
@@ -820,6 +823,9 @@ Note that amputating the affected organ does in fact remove the infection from t
H.drop_item()
W.loc = owner
+/obj/item/organ/external/proc/open_enough_for_surgery()
+ return (encased ? (open == 3) : (open == 2))
+
/obj/item/organ/external/removed(var/mob/living/user, var/ignore_children)
if(!owner)
diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm
index 6b29f969743..96344a40a16 100644
--- a/code/modules/surgery/organs_internal.dm
+++ b/code/modules/surgery/organs_internal.dm
@@ -10,7 +10,7 @@
return 0
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- return affected && affected.open == (affected.encased ? 3 : 2)
+ return affected && affected.open_enough_for_surgery()
//////////////////////////////////////////////////////////////////
// Dethrall Shadowling //
@@ -29,25 +29,29 @@
if (!hasorgans(target))
return
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- return ..() && affected && is_thrall(target) && affected.open == 3 && target_zone == "head"
+ return ..() && affected && is_thrall(target) && affected.open_enough_for_surgery() && target_zone == target.named_organ_parent("brain")
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] begins looking around in [target]'s head.", "You begin looking for foreign influences on [target]'s brain...")
+ var/braincase = target.named_organ_parent("brain")
+ user.visible_message("[user] begins looking around in [target]'s [braincase].", "You begin looking for foreign influences on [target]'s brain...")
user << "You locate a small, pulsing black tumor on the side of [target]'s brain and begin to remove it."
- target << "A small part of your head pulses with agony as the light impacts it."
- user.visible_message("[user] begins removing something from [target]'s head.", \
+ target << "A small part of your [braincase] pulses with agony as the light impacts it."
+ user.visible_message("[user] begins removing something from [target]'s [braincase].", \
"You begin carefully extracting the tumor...")
..()
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/braincase = target.named_organ_parent("brain")
user.visible_message("[user] carefully extracts the tumor from [target]'s brain!", \
- "You extract the black tumor from [target]'s head. It quickly shrivels and burns away.")
+ "You extract the black tumor from [target]'s [braincase]. It quickly shrivels and burns away.")
ticker.mode.remove_thrall(target.mind,0)
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/braincase = target.named_organ_parent("brain")
if(prob(50))
- user.visible_message("[user] slips and rips the tumor out from [target]'s head!", \
+ user.visible_message("[user] slips and rips the tumor out from [target]'s [braincase]!", \
"You fumble and tear out [target]'s tumor!")
+ target.adjustBrainLoss(150) // This is so you can't just defib'n go
ticker.mode.remove_thrall(target.mind,1)
else
user.visible_message("[user]'s hand slips and fumbles! Luckily, they didn't damage anything!")
@@ -75,7 +79,7 @@
if (!hasorgans(target))
return
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- return ..() && affected && embryo && affected.open == 3 && target_zone == "chest"
+ return ..() && affected && embryo && affected.open_enough_for_surgery() && target_zone == "chest"
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
var/msg = "[user] starts to pull something out from [target]'s ribcage with \the [tool]."
@@ -113,7 +117,7 @@
return
var/is_organ_damaged = 0
for(var/obj/item/organ/I in affected.internal_organs)
- if(I.damage > 0)
+ if(I.damage > 0 && I.robotic < 2)
is_organ_damaged = 1
break
return ..() && is_organ_damaged
diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm
index df0e5608221..fa6fd6f215f 100644
--- a/code/modules/surgery/robotics.dm
+++ b/code/modules/surgery/robotics.dm
@@ -3,25 +3,34 @@
// COMMON STEPS //
//////////////////////////////////////////////////////////////////
-/datum/surgery_step/robotics/
+/datum/surgery_step/robotics
can_infect = 0
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if (isslime(target))
- return 0
- if (target_zone == "eyes") //there are specific steps for eye surgery
- return 0
- if (!hasorgans(target))
- return 0
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if (affected == null)
- return 0
- if (affected.status & ORGAN_DESTROYED)
- return 0
- if (!(affected.status & ORGAN_ROBOT))
- return 0
- return 1
-/datum/surgery_step/robotics/unscrew_hatch
+/datum/surgery_step/robotics/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (isslime(target))
+ return 0
+ if (target_zone == "eyes") //there are specific steps for eye surgery
+ return 0
+ if (!hasorgans(target))
+ return 0
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if (affected == null)
+ return 0
+ if (affected.status & ORGAN_DESTROYED)
+ return 0
+ return 1
+
+/datum/surgery_step/robotics/external
+
+/datum/surgery_step/robotics/external/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (!..())
+ return 0
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if (!(affected.status & ORGAN_ROBOT))
+ return 0
+ return 1
+
+/datum/surgery_step/robotics/external/unscrew_hatch
allowed_tools = list(
/obj/item/weapon/screwdriver = 100,
/obj/item/weapon/coin = 50,
@@ -53,7 +62,7 @@
user.visible_message("\red [user]'s [tool.name] slips, failing to unscrew [target]'s [affected.name].", \
"\red Your [tool] slips, failing to unscrew [target]'s [affected.name].")
-/datum/surgery_step/robotics/open_hatch
+/datum/surgery_step/robotics/external/open_hatch
allowed_tools = list(
/obj/item/weapon/retractor = 100,
/obj/item/weapon/crowbar = 100,
@@ -85,7 +94,7 @@
user.visible_message("\red [user]'s [tool.name] slips, failing to open the hatch on [target]'s [affected.name].",
"\red Your [tool] slips, failing to open the hatch on [target]'s [affected.name].")
-/datum/surgery_step/robotics/close_hatch
+/datum/surgery_step/robotics/external/close_hatch
allowed_tools = list(
/obj/item/weapon/retractor = 100,
/obj/item/weapon/crowbar = 100,
@@ -118,7 +127,7 @@
user.visible_message("\red [user]'s [tool.name] slips, failing to close the hatch on [target]'s [affected.name].",
"\red Your [tool.name] slips, failing to close the hatch on [target]'s [affected.name].")
-/datum/surgery_step/robotics/repair_brute
+/datum/surgery_step/robotics/external/repair_brute
allowed_tools = list(
/obj/item/weapon/weldingtool = 100,
/obj/item/weapon/gun/energy/plasmacutter = 50
@@ -154,7 +163,7 @@
"\red Your [tool.name] slips, damaging the internal structure of [target]'s [affected.name].")
target.apply_damage(rand(5,10), BURN, affected)
-/datum/surgery_step/robotics/repair_burn
+/datum/surgery_step/robotics/external/repair_burn
allowed_tools = list(
/obj/item/stack/cable_coil = 100
)
@@ -215,7 +224,7 @@
if(I.damage > 0 && I.robotic >= 2)
is_organ_damaged = 1
break
- return affected.open == 2 && is_organ_damaged
+ return affected.open_enough_for_surgery() && is_organ_damaged
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -276,7 +285,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
if(!(affected && (affected.status & ORGAN_ROBOT)))
return 0
- if(affected.open != 2)
+ if(!affected.open_enough_for_surgery())
return 0
target.op_stage.current_organ = null
@@ -325,7 +334,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
if(!(affected && (affected.status & ORGAN_ROBOT)))
return 0
- if(affected.open != 2)
+ if(!affected.open_enough_for_surgery())
return 0
target.op_stage.current_organ = null
@@ -375,7 +384,7 @@
var/obj/item/device/mmi/M = tool
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if(!(affected && affected.open == 2))
+ if(!(affected && affected.open_enough_for_surgery()))
return 0
if(!istype(M))