diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index ebaa6866e0..dc3c78b0ce 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -1267,7 +1267,7 @@ var/global/list/damage_icon_parts = list()
var/image/total = new
for(var/obj/item/organ/external/E in organs)
if(E.open)
- var/image/I = image("icon"='icons/mob/surgery.dmi', "icon_state"="[E.name][round(E.open)]", "layer"=-SURGERY_LEVEL)
+ var/image/I = image("icon"='icons/mob/surgery.dmi', "icon_state"="[E.icon_name][round(E.open)]", "layer"=-SURGERY_LEVEL)
total.overlays += I
overlays_standing[SURGERY_LEVEL] = total
if(update_icons) update_icons()
diff --git a/code/modules/surgery/bones.dm b/code/modules/surgery/bones.dm
index e1086dbdca..5465e7d03e 100644
--- a/code/modules/surgery/bones.dm
+++ b/code/modules/surgery/bones.dm
@@ -3,6 +3,10 @@
// BONE SURGERY //
//////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////
+// Bone Glue Surgery
+///////////////////////////////////////////////////////////////
+
/datum/surgery_step/glue_bone
allowed_tools = list(
/obj/item/weapon/surgical/bonegel = 100, \
@@ -14,30 +18,34 @@
min_duration = 50
max_duration = 60
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if (!hasorgans(target))
- return 0
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- return affected && (affected.robotic < ORGAN_ROBOT) && affected.open >= 2 && affected.stage == 0
+/datum/surgery_step/glue_bone/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (!hasorgans(target))
+ return 0
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ return affected && (affected.robotic < ORGAN_ROBOT) && affected.open >= 2 && affected.stage == 0
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if (affected.stage == 0)
- user.visible_message("[user] starts applying medication to the damaged bones in [target]'s [affected.name] with \the [tool]." , \
- "You start applying medication to the damaged bones in [target]'s [affected.name] with \the [tool].")
- target.custom_pain("Something in your [affected.name] is causing you a lot of pain!", 50)
- ..()
+/datum/surgery_step/glue_bone/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if (affected.stage == 0)
+ user.visible_message("[user] starts applying medication to the damaged bones in [target]'s [affected.name] with \the [tool]." , \
+ "You start applying medication to the damaged bones in [target]'s [affected.name] with \the [tool].")
+ target.custom_pain("Something in your [affected.name] is causing you a lot of pain!", 50)
+ ..()
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] applies some [tool] to [target]'s bone in [affected.name]", \
- "You apply some [tool] to [target]'s bone in [affected.name] with \the [tool].")
- affected.stage = 1
+/datum/surgery_step/glue_bone/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] applies some [tool] to [target]'s bone in [affected.name]", \
+ "You apply some [tool] to [target]'s bone in [affected.name] with \the [tool].")
+ affected.stage = 1
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user]'s hand slips, smearing [tool] in the incision in [target]'s [affected.name]!" , \
- "Your hand slips, smearing [tool] in the incision in [target]'s [affected.name]!")
+/datum/surgery_step/glue_bone/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user]'s hand slips, smearing [tool] in the incision in [target]'s [affected.name]!" , \
+ "Your hand slips, smearing [tool] in the incision in [target]'s [affected.name]!")
+
+///////////////////////////////////////////////////////////////
+// Bone Setting Surgery
+///////////////////////////////////////////////////////////////
/datum/surgery_step/set_bone
allowed_tools = list(
@@ -48,35 +56,39 @@
min_duration = 60
max_duration = 70
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if (!hasorgans(target))
- return 0
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- return affected && affected.organ_tag != BP_HEAD && !(affected.robotic >= ORGAN_ROBOT) && affected.open >= 2 && affected.stage == 1
+/datum/surgery_step/set_bone/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (!hasorgans(target))
+ return 0
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ return affected && affected.organ_tag != BP_HEAD && !(affected.robotic >= ORGAN_ROBOT) && affected.open >= 2 && affected.stage == 1
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] is beginning to set the bone in [target]'s [affected.name] in place with \the [tool]." , \
- "You are beginning to set the bone in [target]'s [affected.name] in place with \the [tool].")
- target.custom_pain("The pain in your [affected.name] is going to make you pass out!", 50)
- ..()
+/datum/surgery_step/set_bone/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] is beginning to set the bone in [target]'s [affected.name] in place with \the [tool]." , \
+ "You are beginning to set the bone in [target]'s [affected.name] in place with \the [tool].")
+ target.custom_pain("The pain in your [affected.name] is going to make you pass out!", 50)
+ ..()
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if (affected.status & ORGAN_BROKEN)
- user.visible_message("[user] sets the bone in [target]'s [affected.name] in place with \the [tool].", \
- "You set the bone in [target]'s [affected.name] in place with \the [tool].")
- affected.stage = 2
- else
- user.visible_message("[user] sets the bone in [target]'s [affected.name] in the WRONG place with \the [tool].", \
- "You set the bone in [target]'s [affected.name] in the WRONG place with \the [tool].")
- affected.fracture()
+/datum/surgery_step/set_bone/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if (affected.status & ORGAN_BROKEN)
+ user.visible_message("[user] sets the bone in [target]'s [affected.name] in place with \the [tool].", \
+ "You set the bone in [target]'s [affected.name] in place with \the [tool].")
+ affected.stage = 2
+ else
+ user.visible_message("[user] sets the bone in [target]'s [affected.name] in the WRONG place with \the [tool].", \
+ "You set the bone in [target]'s [affected.name] in the WRONG place with \the [tool].")
+ affected.fracture()
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user]'s hand slips, damaging the bone in [target]'s [affected.name] with \the [tool]!" , \
- "Your hand slips, damaging the bone in [target]'s [affected.name] with \the [tool]!")
- affected.createwound(BRUISE, 5)
+/datum/surgery_step/set_bone/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user]'s hand slips, damaging the bone in [target]'s [affected.name] with \the [tool]!" , \
+ "Your hand slips, damaging the bone in [target]'s [affected.name] with \the [tool]!")
+ affected.createwound(BRUISE, 5)
+
+///////////////////////////////////////////////////////////////
+// Skull Mending Surgery
+///////////////////////////////////////////////////////////////
/datum/surgery_step/mend_skull
allowed_tools = list(
@@ -87,30 +99,34 @@
min_duration = 60
max_duration = 70
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if (!hasorgans(target))
- return 0
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- return affected && affected.organ_tag == BP_HEAD && (affected.robotic < ORGAN_ROBOT) && affected.open >= 2 && affected.stage == 1
+/datum/surgery_step/mend_skull/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (!hasorgans(target))
+ return 0
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ return affected && affected.organ_tag == BP_HEAD && (affected.robotic < ORGAN_ROBOT) && affected.open >= 2 && affected.stage == 1
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] is beginning to piece together [target]'s skull with \the [tool]." , \
- "You are beginning to piece together [target]'s skull with \the [tool].")
- ..()
+/datum/surgery_step/mend_skull/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] is beginning to piece together [target]'s skull with \the [tool]." , \
+ "You are beginning to piece together [target]'s skull with \the [tool].")
+ ..()
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] sets [target]'s skull with \the [tool]." , \
- "You set [target]'s skull with \the [tool].")
- affected.stage = 2
+/datum/surgery_step/mend_skull/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] sets [target]'s skull with \the [tool]." , \
+ "You set [target]'s skull with \the [tool].")
+ affected.stage = 2
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user]'s hand slips, damaging [target]'s face with \the [tool]!" , \
- "Your hand slips, damaging [target]'s face with \the [tool]!")
- var/obj/item/organ/external/head/h = affected
- h.createwound(BRUISE, 10)
- h.disfigured = 1
+/datum/surgery_step/mend_skull/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user]'s hand slips, damaging [target]'s face with \the [tool]!" , \
+ "Your hand slips, damaging [target]'s face with \the [tool]!")
+ var/obj/item/organ/external/head/h = affected
+ h.createwound(BRUISE, 10)
+ h.disfigured = 1
+
+///////////////////////////////////////////////////////////////
+// Bone Fixing Surgery
+///////////////////////////////////////////////////////////////
/datum/surgery_step/finish_bone
allowed_tools = list(
@@ -123,31 +139,33 @@
min_duration = 50
max_duration = 60
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if (!hasorgans(target))
- return 0
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- return affected && affected.open >= 2 && !(affected.robotic >= ORGAN_ROBOT) && affected.stage == 2
+/datum/surgery_step/finish_bone/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (!hasorgans(target))
+ return 0
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ return affected && affected.open >= 2 && !(affected.robotic >= ORGAN_ROBOT) && affected.stage == 2
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] starts to finish mending the damaged bones in [target]'s [affected.name] with \the [tool].", \
- "You start to finish mending the damaged bones in [target]'s [affected.name] with \the [tool].")
- ..()
+/datum/surgery_step/finish_bone/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] starts to finish mending the damaged bones in [target]'s [affected.name] with \the [tool].", \
+ "You start to finish mending the damaged bones in [target]'s [affected.name] with \the [tool].")
+ ..()
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] has mended the damaged bones in [target]'s [affected.name] with \the [tool]." , \
- "You have mended the damaged bones in [target]'s [affected.name] with \the [tool]." )
- affected.status &= ~ORGAN_BROKEN
- affected.stage = 0
-
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user]'s hand slips, smearing [tool] in the incision in [target]'s [affected.name]!" , \
- "Your hand slips, smearing [tool] in the incision in [target]'s [affected.name]!")
+/datum/surgery_step/finish_bone/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] has mended the damaged bones in [target]'s [affected.name] with \the [tool]." , \
+ "You have mended the damaged bones in [target]'s [affected.name] with \the [tool]." )
+ affected.status &= ~ORGAN_BROKEN
+ affected.stage = 0
+/datum/surgery_step/finish_bone/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user]'s hand slips, smearing [tool] in the incision in [target]'s [affected.name]!" , \
+ "Your hand slips, smearing [tool] in the incision in [target]'s [affected.name]!")
+///////////////////////////////////////////////////////////////
+// Bone Clamp Surgery
+///////////////////////////////////////////////////////////////
/datum/surgery_step/clamp_bone
allowed_tools = list(
@@ -159,28 +177,28 @@
min_duration = 70
max_duration = 90
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if (!hasorgans(target))
- return 0
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- return affected && (affected.robotic < ORGAN_ROBOT) && affected.open >= 2 && affected.stage == 0
+/datum/surgery_step/clamp_bone/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (!hasorgans(target))
+ return 0
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ return affected && (affected.robotic < ORGAN_ROBOT) && affected.open >= 2 && affected.stage == 0
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if (affected.stage == 0)
- user.visible_message("[user] starts repairing the damaged bones in [target]'s [affected.name] with \the [tool]." , \
- "You starts repairing the damaged bones in [target]'s [affected.name] with \the [tool].")
- target.custom_pain("Something in your [affected.name] is causing you a lot of pain!", 50)
- ..()
+/datum/surgery_step/clamp_bone/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if (affected.stage == 0)
+ user.visible_message("[user] starts repairing the damaged bones in [target]'s [affected.name] with \the [tool]." , \
+ "You starts repairing the damaged bones in [target]'s [affected.name] with \the [tool].")
+ target.custom_pain("Something in your [affected.name] is causing you a lot of pain!", 50)
+ ..()
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] sets the bone in [target]'s [affected.name] with \the [tool].", \
- "You sets [target]'s bone in [affected.name] with \the [tool].")
- affected.status &= ~ORGAN_BROKEN
+/datum/surgery_step/clamp_bone/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] sets the bone in [target]'s [affected.name] with \the [tool].", \
+ "You sets [target]'s bone in [affected.name] with \the [tool].")
+ affected.status &= ~ORGAN_BROKEN
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user]'s hand slips, damaging the bone in [target]'s [affected.name] with \the [tool]!" , \
- "Your hand slips, damaging the bone in [target]'s [affected.name] with \the [tool]!")
- affected.createwound(BRUISE, 5)
\ No newline at end of file
+/datum/surgery_step/clamp_bone/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user]'s hand slips, damaging the bone in [target]'s [affected.name] with \the [tool]!" , \
+ "Your hand slips, damaging the bone in [target]'s [affected.name] with \the [tool]!")
+ affected.createwound(BRUISE, 5)
\ No newline at end of file
diff --git a/code/modules/surgery/encased.dm b/code/modules/surgery/encased.dm
index c92bf837d3..d3013c4570 100644
--- a/code/modules/surgery/encased.dm
+++ b/code/modules/surgery/encased.dm
@@ -6,14 +6,17 @@
priority = 2
can_infect = 1
blood_level = 1
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if (!hasorgans(target))
- return 0
+/datum/surgery_step/open_encased/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (!hasorgans(target))
+ return 0
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- return affected && !(affected.robotic >= ORGAN_ROBOT) && affected.encased && affected.open >= 2
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ return affected && !(affected.robotic >= ORGAN_ROBOT) && affected.encased && affected.open >= 2
+///////////////////////////////////////////////////////////////
+// Rib Sawing Surgery
+///////////////////////////////////////////////////////////////
/datum/surgery_step/open_encased/saw
allowed_tools = list(
@@ -24,45 +27,45 @@
min_duration = 50
max_duration = 70
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if (!hasorgans(target))
- return
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- return ..() && affected && affected.open == 2
+/datum/surgery_step/open_encased/saw/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (!hasorgans(target))
+ return
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ return ..() && affected && affected.open == 2
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+/datum/surgery_step/open_encased/saw/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (!hasorgans(target))
+ return
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if (!hasorgans(target))
- return
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] begins to cut through [target]'s [affected.encased] with \the [tool].", \
+ "You begin to cut through [target]'s [affected.encased] with \the [tool].")
+ target.custom_pain("Something hurts horribly in your [affected.name]!", 60)
+ ..()
- user.visible_message("[user] begins to cut through [target]'s [affected.encased] with \the [tool].", \
- "You begin to cut through [target]'s [affected.encased] with \the [tool].")
- target.custom_pain("Something hurts horribly in your [affected.name]!", 60)
- ..()
+/datum/surgery_step/open_encased/saw/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (!hasorgans(target))
+ return
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] has cut [target]'s [affected.encased] open with \the [tool].", \
+ "You have cut [target]'s [affected.encased] open with \the [tool].")
+ affected.open = 2.5
- if (!hasorgans(target))
- return
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
+/datum/surgery_step/open_encased/saw/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (!hasorgans(target))
+ return
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] has cut [target]'s [affected.encased] open with \the [tool].", \
- "You have cut [target]'s [affected.encased] open with \the [tool].")
- affected.open = 2.5
+ user.visible_message("[user]'s hand slips, cracking [target]'s [affected.encased] with \the [tool]!" , \
+ "Your hand slips, cracking [target]'s [affected.encased] with \the [tool]!" )
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
-
- if (!hasorgans(target))
- return
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
-
- user.visible_message("[user]'s hand slips, cracking [target]'s [affected.encased] with \the [tool]!" , \
- "Your hand slips, cracking [target]'s [affected.encased] with \the [tool]!" )
-
- affected.createwound(CUT, 20)
- affected.fracture()
+ affected.createwound(CUT, 20)
+ affected.fracture()
+///////////////////////////////////////////////////////////////
+// Rib Opening Surgery
+///////////////////////////////////////////////////////////////
/datum/surgery_step/open_encased/retract
allowed_tools = list(
@@ -73,53 +76,53 @@
min_duration = 30
max_duration = 40
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if (!hasorgans(target))
- return
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- return ..() && affected && affected.open == 2.5
+/datum/surgery_step/open_encased/retract/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (!hasorgans(target))
+ return
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ return ..() && affected && affected.open == 2.5
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+/datum/surgery_step/open_encased/retract/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (!hasorgans(target))
+ return
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if (!hasorgans(target))
- return
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ var/msg = "[user] starts to force open the [affected.encased] in [target]'s [affected.name] with \the [tool]."
+ var/self_msg = "You start to force open the [affected.encased] in [target]'s [affected.name] with \the [tool]."
+ user.visible_message(msg, self_msg)
+ target.custom_pain("Something hurts horribly in your [affected.name]!", 40)
+ ..()
- var/msg = "[user] starts to force open the [affected.encased] in [target]'s [affected.name] with \the [tool]."
- var/self_msg = "You start to force open the [affected.encased] in [target]'s [affected.name] with \the [tool]."
- user.visible_message(msg, self_msg)
- target.custom_pain("Something hurts horribly in your [affected.name]!", 40)
- ..()
+/datum/surgery_step/open_encased/retract/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (!hasorgans(target))
+ return
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ var/msg = "[user] forces open [target]'s [affected.encased] with \the [tool]."
+ var/self_msg = "You force open [target]'s [affected.encased] with \the [tool]."
+ user.visible_message(msg, self_msg)
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ affected.open = 3
- if (!hasorgans(target))
- return
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
-
- var/msg = "[user] forces open [target]'s [affected.encased] with \the [tool]."
- var/self_msg = "You force open [target]'s [affected.encased] with \the [tool]."
- user.visible_message(msg, self_msg)
-
- affected.open = 3
-
- // Whoops!
- if(prob(10))
- affected.fracture()
-
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
-
- if (!hasorgans(target))
- return
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
-
- var/msg = "[user]'s hand slips, cracking [target]'s [affected.encased]!"
- var/self_msg = "Your hand slips, cracking [target]'s [affected.encased]!"
- user.visible_message(msg, self_msg)
-
- affected.createwound(BRUISE, 20)
+ // Whoops!
+ if(prob(10))
affected.fracture()
+/datum/surgery_step/open_encased/retract/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (!hasorgans(target))
+ return
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+
+ var/msg = "[user]'s hand slips, cracking [target]'s [affected.encased]!"
+ var/self_msg = "Your hand slips, cracking [target]'s [affected.encased]!"
+ user.visible_message(msg, self_msg)
+
+ affected.createwound(BRUISE, 20)
+ affected.fracture()
+
+///////////////////////////////////////////////////////////////
+// Rib Closing Surgery
+///////////////////////////////////////////////////////////////
+
/datum/surgery_step/open_encased/close
allowed_tools = list(
/obj/item/weapon/surgical/retractor = 100, \
@@ -129,53 +132,53 @@
min_duration = 20
max_duration = 40
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+/datum/surgery_step/open_encased/close/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (!hasorgans(target))
+ return
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ return ..() && affected && affected.open == 3
- if (!hasorgans(target))
- return
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- return ..() && affected && affected.open == 3
+/datum/surgery_step/open_encased/close/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (!hasorgans(target))
+ return
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/msg = "[user] starts bending [target]'s [affected.encased] back into place with \the [tool]."
+ var/self_msg = "You start bending [target]'s [affected.encased] back into place with \the [tool]."
+ user.visible_message(msg, self_msg)
+ target.custom_pain("Something hurts horribly in your [affected.name]!", 100)
+ ..()
- if (!hasorgans(target))
- return
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
+/datum/surgery_step/open_encased/close/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (!hasorgans(target))
+ return
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
- var/msg = "[user] starts bending [target]'s [affected.encased] back into place with \the [tool]."
- var/self_msg = "You start bending [target]'s [affected.encased] back into place with \the [tool]."
- user.visible_message(msg, self_msg)
- target.custom_pain("Something hurts horribly in your [affected.name]!", 100)
- ..()
+ var/msg = "[user] bends [target]'s [affected.encased] back into place with \the [tool]."
+ var/self_msg = "You bend [target]'s [affected.encased] back into place with \the [tool]."
+ user.visible_message(msg, self_msg)
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ affected.open = 2.5
- if (!hasorgans(target))
- return
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
+/datum/surgery_step/open_encased/close/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (!hasorgans(target))
+ return
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
- var/msg = "[user] bends [target]'s [affected.encased] back into place with \the [tool]."
- var/self_msg = "You bend [target]'s [affected.encased] back into place with \the [tool]."
- user.visible_message(msg, self_msg)
+ var/msg = "[user]'s hand slips, bending [target]'s [affected.encased] the wrong way!"
+ var/self_msg = "Your hand slips, bending [target]'s [affected.encased] the wrong way!"
+ user.visible_message(msg, self_msg)
- affected.open = 2.5
+ affected.createwound(BRUISE, 20)
+ affected.fracture()
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ /*if (prob(40)) //TODO: ORGAN REMOVAL UPDATE.
+ user.visible_message(" A rib pierces the lung!")
+ target.rupture_lung()*/
- if (!hasorgans(target))
- return
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
-
- var/msg = "[user]'s hand slips, bending [target]'s [affected.encased] the wrong way!"
- var/self_msg = "Your hand slips, bending [target]'s [affected.encased] the wrong way!"
- user.visible_message(msg, self_msg)
-
- affected.createwound(BRUISE, 20)
- affected.fracture()
-
- /*if (prob(40)) //TODO: ORGAN REMOVAL UPDATE.
- user.visible_message(" A rib pierces the lung!")
- target.rupture_lung()*/
+///////////////////////////////////////////////////////////////
+// Rib Mending Surgery
+///////////////////////////////////////////////////////////////
/datum/surgery_step/open_encased/mend
allowed_tools = list(
@@ -186,33 +189,30 @@
min_duration = 20
max_duration = 40
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+/datum/surgery_step/open_encased/mend/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (!hasorgans(target))
+ return
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ return ..() && affected && affected.open == 2.5
- if (!hasorgans(target))
- return
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- return ..() && affected && affected.open == 2.5
+/datum/surgery_step/open_encased/mend/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (!hasorgans(target))
+ return
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/msg = "[user] starts applying \the [tool] to [target]'s [affected.encased]."
+ var/self_msg = "You start applying \the [tool] to [target]'s [affected.encased]."
+ user.visible_message(msg, self_msg)
+ target.custom_pain("Something hurts horribly in your [affected.name]!", 100)
+ ..()
- if (!hasorgans(target))
- return
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
+/datum/surgery_step/open_encased/mend/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (!hasorgans(target))
+ return
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
- var/msg = "[user] starts applying \the [tool] to [target]'s [affected.encased]."
- var/self_msg = "You start applying \the [tool] to [target]'s [affected.encased]."
- user.visible_message(msg, self_msg)
- target.custom_pain("Something hurts horribly in your [affected.name]!", 100)
- ..()
+ var/msg = "[user] applied \the [tool] to [target]'s [affected.encased]."
+ var/self_msg = "You applied \the [tool] to [target]'s [affected.encased]."
+ user.visible_message(msg, self_msg)
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
-
- if (!hasorgans(target))
- return
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
-
- var/msg = "[user] applied \the [tool] to [target]'s [affected.encased]."
- var/self_msg = "You applied \the [tool] to [target]'s [affected.encased]."
- user.visible_message(msg, self_msg)
-
- affected.open = 2
\ No newline at end of file
+ affected.open = 2
\ No newline at end of file
diff --git a/code/modules/surgery/face.dm b/code/modules/surgery/face.dm
index f9c6a6b285..b3fae927bb 100644
--- a/code/modules/surgery/face.dm
+++ b/code/modules/surgery/face.dm
@@ -7,13 +7,18 @@
priority = 2
req_open = 0
can_infect = 0
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if (!hasorgans(target))
- return 0
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if (!affected || (affected.robotic >= ORGAN_ROBOT))
- return 0
- return target_zone == O_MOUTH
+
+/datum/surgery_step/face/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (!hasorgans(target))
+ return 0
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if (!affected || (affected.robotic >= ORGAN_ROBOT))
+ return 0
+ return target_zone == O_MOUTH
+
+///////////////////////////////////////////////////////////////
+// Face Opening Surgery
+///////////////////////////////////////////////////////////////
/datum/surgery_step/generic/cut_face
allowed_tools = list(
@@ -25,25 +30,29 @@
min_duration = 90
max_duration = 110
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- return ..() && target_zone == O_MOUTH && target.op_stage.face == 0
+/datum/surgery_step/generic/cut_face/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ return ..() && target_zone == O_MOUTH && target.op_stage.face == 0
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] starts to cut open [target]'s face and neck with \the [tool].", \
- "You start to cut open [target]'s face and neck with \the [tool].")
- ..()
+/datum/surgery_step/generic/cut_face/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] starts to cut open [target]'s face and neck with \the [tool].", \
+ "You start to cut open [target]'s face and neck with \the [tool].")
+ ..()
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] has cut open [target]'s face and neck with \the [tool]." , \
- " You have cut open[target]'s face and neck with \the [tool].",)
- target.op_stage.face = 1
+/datum/surgery_step/generic/cut_face/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] has cut open [target]'s face and neck with \the [tool]." , \
+ " You have cut open[target]'s face and neck with \the [tool].",)
+ target.op_stage.face = 1
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user]'s hand slips, slicing [target]'s throat wth \the [tool]!" , \
- "Your hand slips, slicing [target]'s throat wth \the [tool]!" )
- affected.createwound(CUT, 60)
- target.AdjustLosebreath(10)
+/datum/surgery_step/generic/cut_face/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user]'s hand slips, slicing [target]'s throat wth \the [tool]!" , \
+ "Your hand slips, slicing [target]'s throat wth \the [tool]!" )
+ affected.createwound(CUT, 60)
+ target.AdjustLosebreath(10)
+
+///////////////////////////////////////////////////////////////
+// Vocal Cord/Face Repair Surgery
+///////////////////////////////////////////////////////////////
/datum/surgery_step/face/mend_vocal
allowed_tools = list(
@@ -55,23 +64,27 @@
min_duration = 70
max_duration = 90
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- return ..() && target.op_stage.face == 1
+/datum/surgery_step/face/mend_vocal/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ return ..() && target.op_stage.face == 1
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] starts mending [target]'s vocal cords with \the [tool].", \
- "You start mending [target]'s vocal cords with \the [tool].")
- ..()
+/datum/surgery_step/face/mend_vocal/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] starts mending [target]'s vocal cords with \the [tool].", \
+ "You start mending [target]'s vocal cords with \the [tool].")
+ ..()
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] mends [target]'s vocal cords with \the [tool].", \
- "You mend [target]'s vocal cords with \the [tool].")
- target.op_stage.face = 2
+/datum/surgery_step/face/mend_vocal/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] mends [target]'s vocal cords with \the [tool].", \
+ "You mend [target]'s vocal cords with \the [tool].")
+ target.op_stage.face = 2
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user]'s hand slips, clamping [target]'s trachea shut for a moment with \the [tool]!", \
- "Your hand slips, clamping [user]'s trachea shut for a moment with \the [tool]!")
- target.AdjustLosebreath(10)
+/datum/surgery_step/face/mend_vocal/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user]'s hand slips, clamping [target]'s trachea shut for a moment with \the [tool]!", \
+ "Your hand slips, clamping [user]'s trachea shut for a moment with \the [tool]!")
+ target.AdjustLosebreath(10)
+
+///////////////////////////////////////////////////////////////
+// Face Fixing Surgery
+///////////////////////////////////////////////////////////////
/datum/surgery_step/face/fix_face
allowed_tools = list(
@@ -82,24 +95,28 @@
min_duration = 80
max_duration = 100
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- return ..() && target.op_stage.face == 2
+/datum/surgery_step/face/fix_face/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ return ..() && target.op_stage.face == 2
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] starts pulling the skin on [target]'s face back in place with \the [tool].", \
- "You start pulling the skin on [target]'s face back in place with \the [tool].")
- ..()
+/datum/surgery_step/face/fix_face/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] starts pulling the skin on [target]'s face back in place with \the [tool].", \
+ "You start pulling the skin on [target]'s face back in place with \the [tool].")
+ ..()
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] pulls the skin on [target]'s face back in place with \the [tool].", \
- "You pull the skin on [target]'s face back in place with \the [tool].")
- target.op_stage.face = 3
+/datum/surgery_step/face/fix_face/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] pulls the skin on [target]'s face back in place with \the [tool].", \
+ "You pull the skin on [target]'s face back in place with \the [tool].")
+ target.op_stage.face = 3
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user]'s hand slips, tearing skin on [target]'s face with \the [tool]!", \
- "Your hand slips, tearing skin on [target]'s face with \the [tool]!")
- target.apply_damage(10, BRUTE, affected, sharp=1, sharp=1)
+/datum/surgery_step/face/fix_face/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user]'s hand slips, tearing skin on [target]'s face with \the [tool]!", \
+ "Your hand slips, tearing skin on [target]'s face with \the [tool]!")
+ target.apply_damage(10, BRUTE, affected, sharp=1, sharp=1)
+
+///////////////////////////////////////////////////////////////
+// Face Cauterizing Surgery
+///////////////////////////////////////////////////////////////
/datum/surgery_step/face/cauterize
allowed_tools = list(
@@ -112,27 +129,27 @@
min_duration = 70
max_duration = 100
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- return ..() && target.op_stage.face > 0
+/datum/surgery_step/face/cauterize/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ return ..() && target.op_stage.face > 0
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] is beginning to cauterize the incision on [target]'s face and neck with \the [tool]." , \
- "You are beginning to cauterize the incision on [target]'s face and neck with \the [tool].")
- ..()
+/datum/surgery_step/face/cauterize/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] is beginning to cauterize the incision on [target]'s face and neck with \the [tool]." , \
+ "You are beginning to cauterize the incision on [target]'s face and neck with \the [tool].")
+ ..()
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] cauterizes the incision on [target]'s face and neck with \the [tool].", \
- "You cauterize the incision on [target]'s face and neck with \the [tool].")
- affected.open = 0
- affected.status &= ~ORGAN_BLEEDING
- if (target.op_stage.face == 3)
- var/obj/item/organ/external/head/h = affected
- h.disfigured = 0
- target.op_stage.face = 0
+/datum/surgery_step/face/cauterize/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] cauterizes the incision on [target]'s face and neck with \the [tool].", \
+ "You cauterize the incision on [target]'s face and neck with \the [tool].")
+ affected.open = 0
+ affected.status &= ~ORGAN_BLEEDING
+ if (target.op_stage.face == 3)
+ var/obj/item/organ/external/head/h = affected
+ h.disfigured = 0
+ target.op_stage.face = 0
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user]'s hand slips, leaving a small burn on [target]'s face with \the [tool]!", \
- "Your hand slips, leaving a small burn on [target]'s face with \the [tool]!")
- target.apply_damage(4, BURN, affected)
\ No newline at end of file
+/datum/surgery_step/face/cauterize/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user]'s hand slips, leaving a small burn on [target]'s face with \the [tool]!", \
+ "Your hand slips, leaving a small burn on [target]'s face with \the [tool]!")
+ target.apply_damage(4, BURN, affected)
\ No newline at end of file
diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm
index 8bbfaac718..4c10bb8035 100644
--- a/code/modules/surgery/generic.dm
+++ b/code/modules/surgery/generic.dm
@@ -5,21 +5,70 @@
/datum/surgery_step/generic/
can_infect = 1
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if (isslime(target))
- return 0
- if (target_zone == O_EYES) //there are specific steps for eye surgery
- return 0
- if (!hasorgans(target))
- return 0
+
+/datum/surgery_step/generic/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (isslime(target))
+ return 0
+ if (target_zone == O_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.is_stump())
+ return 0
+ if (affected.robotic >= ORGAN_ROBOT)
+ return 0
+ return 1
+
+///////////////////////////////////////////////////////////////
+// Scalpel Surgery
+///////////////////////////////////////////////////////////////
+
+/datum/surgery_step/generic/cut_open
+ allowed_tools = list(
+ /obj/item/weapon/surgical/scalpel = 100, \
+ /obj/item/weapon/material/knife = 75, \
+ /obj/item/weapon/material/shard = 50, \
+ )
+ req_open = 0
+
+ min_duration = 90
+ max_duration = 110
+
+/datum/surgery_step/generic/cut_open/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if(..())
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if (affected == null)
- return 0
- if (affected.is_stump())
- return 0
- if (affected.robotic >= ORGAN_ROBOT)
- return 0
- return 1
+ return affected && affected.open == 0 && target_zone != O_MOUTH
+
+/datum/surgery_step/generic/cut_open/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] starts the incision on [target]'s [affected.name] with \the [tool].", \
+ "You start the incision on [target]'s [affected.name] with \the [tool].")
+ target.custom_pain("You feel a horrible pain as if from a sharp knife in your [affected.name]!", 40)
+ ..()
+
+/datum/surgery_step/generic/cut_open/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] has made an incision on [target]'s [affected.name] with \the [tool].", \
+ "You have made an incision on [target]'s [affected.name] with \the [tool].",)
+ affected.open = 1
+
+ if(istype(target) && target.should_have_organ(O_HEART))
+ affected.status |= ORGAN_BLEEDING
+
+ affected.createwound(CUT, 1)
+
+/datum/surgery_step/generic/cut_open/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user]'s hand slips, slicing open [target]'s [affected.name] in the wrong place with \the [tool]!", \
+ "Your hand slips, slicing open [target]'s [affected.name] in the wrong place with \the [tool]!")
+ affected.createwound(CUT, 10)
+
+///////////////////////////////////////////////////////////////
+// Laser Scalpel Surgery
+///////////////////////////////////////////////////////////////
/datum/surgery_step/generic/cut_with_laser
allowed_tools = list(
@@ -33,35 +82,39 @@
min_duration = 90
max_duration = 110
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if(..())
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- return affected && affected.open == 0 && target_zone != O_MOUTH
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+/datum/surgery_step/generic/cut_with_laser/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if(..())
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] starts the bloodless incision on [target]'s [affected.name] with \the [tool].", \
- "You start the bloodless incision on [target]'s [affected.name] with \the [tool].")
- target.custom_pain("You feel a horrible, searing pain in your [affected.name]!", 50)
- ..()
+ return affected && affected.open == 0 && target_zone != O_MOUTH
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] has made a bloodless incision on [target]'s [affected.name] with \the [tool].", \
- "You have made a bloodless incision on [target]'s [affected.name] with \the [tool].",)
- //Could be cleaner ...
- affected.open = 1
+/datum/surgery_step/generic/cut_with_laser/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] starts the bloodless incision on [target]'s [affected.name] with \the [tool].", \
+ "You start the bloodless incision on [target]'s [affected.name] with \the [tool].")
+ target.custom_pain("You feel a horrible, searing pain in your [affected.name]!", 50)
+ ..()
- affected.createwound(CUT, 1)
- affected.clamp()
- spread_germs_to_organ(affected, user)
+/datum/surgery_step/generic/cut_with_laser/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] has made a bloodless incision on [target]'s [affected.name] with \the [tool].", \
+ "You have made a bloodless incision on [target]'s [affected.name] with \the [tool].",)
+ //Could be cleaner ...
+ affected.open = 1
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user]'s hand slips as the blade sputters, searing a long gash in [target]'s [affected.name] with \the [tool]!", \
- "Your hand slips as the blade sputters, searing a long gash in [target]'s [affected.name] with \the [tool]!")
- affected.createwound(CUT, 7.5)
- affected.createwound(BURN, 12.5)
+ affected.createwound(CUT, 1)
+ affected.clamp()
+ spread_germs_to_organ(affected, user)
+
+/datum/surgery_step/generic/cut_with_laser/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user]'s hand slips as the blade sputters, searing a long gash in [target]'s [affected.name] with \the [tool]!", \
+ "Your hand slips as the blade sputters, searing a long gash in [target]'s [affected.name] with \the [tool]!")
+ affected.createwound(CUT, 7.5)
+ affected.createwound(BURN, 12.5)
+
+///////////////////////////////////////////////////////////////
+// Incision Management Surgery
+///////////////////////////////////////////////////////////////
/datum/surgery_step/generic/incision_manager
allowed_tools = list(
@@ -72,77 +125,41 @@
min_duration = 80
max_duration = 120
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if(..())
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- return affected && affected.open == 0 && target_zone != O_MOUTH
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+/datum/surgery_step/generic/incision_manager/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if(..())
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] starts to construct a prepared incision on and within [target]'s [affected.name] with \the [tool].", \
- "You start to construct a prepared incision on and within [target]'s [affected.name] with \the [tool].")
- target.custom_pain("You feel a horrible, searing pain in your [affected.name] as it is pushed apart!", 50)
- ..()
+ return affected && affected.open == 0 && target_zone != O_MOUTH
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] has constructed a prepared incision on and within [target]'s [affected.name] with \the [tool].", \
- "You have constructed a prepared incision on and within [target]'s [affected.name] with \the [tool].",)
- affected.open = 1
+/datum/surgery_step/generic/incision_manager/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] starts to construct a prepared incision on and within [target]'s [affected.name] with \the [tool].", \
+ "You start to construct a prepared incision on and within [target]'s [affected.name] with \the [tool].")
+ target.custom_pain("You feel a horrible, searing pain in your [affected.name] as it is pushed apart!", 50)
+ ..()
- if(istype(target) && target.should_have_organ(O_HEART))
- affected.status |= ORGAN_BLEEDING
+/datum/surgery_step/generic/incision_manager/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] has constructed a prepared incision on and within [target]'s [affected.name] with \the [tool].", \
+ "You have constructed a prepared incision on and within [target]'s [affected.name] with \the [tool].",)
+ affected.open = 1
- affected.createwound(CUT, 1)
- affected.clamp()
- affected.open = 2
+ if(istype(target) && target.should_have_organ(O_HEART))
+ affected.status |= ORGAN_BLEEDING
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user]'s hand jolts as the system sparks, ripping a gruesome hole in [target]'s [affected.name] with \the [tool]!", \
- "Your hand jolts as the system sparks, ripping a gruesome hole in [target]'s [affected.name] with \the [tool]!")
- affected.createwound(CUT, 20)
- affected.createwound(BURN, 15)
+ affected.createwound(CUT, 1)
+ affected.clamp()
+ affected.open = 2
-/datum/surgery_step/generic/cut_open
- allowed_tools = list(
- /obj/item/weapon/surgical/scalpel = 100, \
- /obj/item/weapon/material/knife = 75, \
- /obj/item/weapon/material/shard = 50, \
- )
- req_open = 0
+/datum/surgery_step/generic/incision_manager/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user]'s hand jolts as the system sparks, ripping a gruesome hole in [target]'s [affected.name] with \the [tool]!", \
+ "Your hand jolts as the system sparks, ripping a gruesome hole in [target]'s [affected.name] with \the [tool]!")
+ affected.createwound(CUT, 20)
+ affected.createwound(BURN, 15)
- min_duration = 90
- max_duration = 110
-
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if(..())
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- return affected && affected.open == 0 && target_zone != O_MOUTH
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] starts the incision on [target]'s [affected.name] with \the [tool].", \
- "You start the incision on [target]'s [affected.name] with \the [tool].")
- target.custom_pain("You feel a horrible pain as if from a sharp knife in your [affected.name]!", 40)
- ..()
-
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] has made an incision on [target]'s [affected.name] with \the [tool].", \
- "You have made an incision on [target]'s [affected.name] with \the [tool].",)
- affected.open = 1
-
- if(istype(target) && target.should_have_organ(O_HEART))
- affected.status |= ORGAN_BLEEDING
-
- affected.createwound(CUT, 1)
-
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user]'s hand slips, slicing open [target]'s [affected.name] in the wrong place with \the [tool]!", \
- "Your hand slips, slicing open [target]'s [affected.name] in the wrong place with \the [tool]!")
- affected.createwound(CUT, 10)
+///////////////////////////////////////////////////////////////
+// Hemostat Surgery
+///////////////////////////////////////////////////////////////
/datum/surgery_step/generic/clamp_bleeders
allowed_tools = list(
@@ -154,30 +171,34 @@
min_duration = 40
max_duration = 60
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if(..())
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- return affected && affected.open && (affected.status & ORGAN_BLEEDING)
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+/datum/surgery_step/generic/clamp_bleeders/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if(..())
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] starts clamping bleeders in [target]'s [affected.name] with \the [tool].", \
- "You start clamping bleeders in [target]'s [affected.name] with \the [tool].")
- target.custom_pain("The pain in your [affected.name] is maddening!", 40)
- ..()
+ return affected && affected.open && (affected.status & ORGAN_BLEEDING)
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] clamps bleeders in [target]'s [affected.name] with \the [tool].", \
- "You clamp bleeders in [target]'s [affected.name] with \the [tool].")
- affected.clamp()
- spread_germs_to_organ(affected, user)
+/datum/surgery_step/generic/clamp_bleeders/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] starts clamping bleeders in [target]'s [affected.name] with \the [tool].", \
+ "You start clamping bleeders in [target]'s [affected.name] with \the [tool].")
+ target.custom_pain("The pain in your [affected.name] is maddening!", 40)
+ ..()
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user]'s hand slips, tearing blood vessals and causing massive bleeding in [target]'s [affected.name] with \the [tool]!", \
- "Your hand slips, tearing blood vessels and causing massive bleeding in [target]'s [affected.name] with \the [tool]!",)
- affected.createwound(CUT, 10)
+/datum/surgery_step/generic/clamp_bleeders/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] clamps bleeders in [target]'s [affected.name] with \the [tool].", \
+ "You clamp bleeders in [target]'s [affected.name] with \the [tool].")
+ affected.clamp()
+ spread_germs_to_organ(affected, user)
+
+/datum/surgery_step/generic/clamp_bleeders/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user]'s hand slips, tearing blood vessals and causing massive bleeding in [target]'s [affected.name] with \the [tool]!", \
+ "Your hand slips, tearing blood vessels and causing massive bleeding in [target]'s [affected.name] with \the [tool]!",)
+ affected.createwound(CUT, 10)
+
+///////////////////////////////////////////////////////////////
+// Retractor Surgery
+///////////////////////////////////////////////////////////////
/datum/surgery_step/generic/retract_skin
allowed_tools = list(
@@ -189,50 +210,54 @@
min_duration = 30
max_duration = 40
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if(..())
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- return affected && affected.open == 1 //&& !(affected.status & ORGAN_BLEEDING)
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+/datum/surgery_step/generic/retract_skin/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if(..())
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- var/msg = "[user] starts to pry open the incision on [target]'s [affected.name] with \the [tool]."
- var/self_msg = "You start to pry open the incision on [target]'s [affected.name] with \the [tool]."
- if (target_zone == BP_TORSO)
- msg = "[user] starts to separate the ribcage and rearrange the organs in [target]'s torso with \the [tool]."
- self_msg = "You start to separate the ribcage and rearrange the organs in [target]'s torso with \the [tool]."
- if (target_zone == BP_GROIN)
- msg = "[user] starts to pry open the incision and rearrange the organs in [target]'s lower abdomen with \the [tool]."
- self_msg = "You start to pry open the incision and rearrange the organs in [target]'s lower abdomen with \the [tool]."
- user.visible_message(msg, self_msg)
- target.custom_pain("It feels like the skin on your [affected.name] is on fire!", 40)
- ..()
+ return affected && affected.open == 1 //&& !(affected.status & ORGAN_BLEEDING)
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- var/msg = "[user] keeps the incision open on [target]'s [affected.name] with \the [tool]."
- var/self_msg = "You keep the incision open on [target]'s [affected.name] with \the [tool]."
- if (target_zone == BP_TORSO)
- msg = "[user] keeps the ribcage open on [target]'s torso with \the [tool]."
- self_msg = "You keep the ribcage open on [target]'s torso with \the [tool]."
- if (target_zone == BP_GROIN)
- msg = "[user] keeps the incision open on [target]'s lower abdomen with \the [tool]."
- self_msg = "You keep the incision open on [target]'s lower abdomen with \the [tool]."
- user.visible_message(msg, self_msg)
- affected.open = 2
+/datum/surgery_step/generic/retract_skin/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ var/msg = "[user] starts to pry open the incision on [target]'s [affected.name] with \the [tool]."
+ var/self_msg = "You start to pry open the incision on [target]'s [affected.name] with \the [tool]."
+ if (target_zone == BP_TORSO)
+ msg = "[user] starts to separate the ribcage and rearrange the organs in [target]'s torso with \the [tool]."
+ self_msg = "You start to separate the ribcage and rearrange the organs in [target]'s torso with \the [tool]."
+ if (target_zone == BP_GROIN)
+ msg = "[user] starts to pry open the incision and rearrange the organs in [target]'s lower abdomen with \the [tool]."
+ self_msg = "You start to pry open the incision and rearrange the organs in [target]'s lower abdomen with \the [tool]."
+ user.visible_message(msg, self_msg)
+ target.custom_pain("It feels like the skin on your [affected.name] is on fire!", 40)
+ ..()
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- var/msg = "[user]'s hand slips, tearing the edges of the incision on [target]'s [affected.name] with \the [tool]!"
- var/self_msg = "Your hand slips, tearing the edges of the incision on [target]'s [affected.name] with \the [tool]!"
- if (target_zone == BP_TORSO)
- msg = "[user]'s hand slips, damaging several organs in [target]'s torso with \the [tool]!"
- self_msg = "Your hand slips, damaging several organs in [target]'s torso with \the [tool]!"
- if (target_zone == BP_GROIN)
- msg = "[user]'s hand slips, damaging several organs in [target]'s lower abdomen with \the [tool]!"
- self_msg = "Your hand slips, damaging several organs in [target]'s lower abdomen with \the [tool]!"
- user.visible_message(msg, self_msg)
- target.apply_damage(12, BRUTE, affected, sharp=1)
+/datum/surgery_step/generic/retract_skin/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ var/msg = "[user] keeps the incision open on [target]'s [affected.name] with \the [tool]."
+ var/self_msg = "You keep the incision open on [target]'s [affected.name] with \the [tool]."
+ if (target_zone == BP_TORSO)
+ msg = "[user] keeps the ribcage open on [target]'s torso with \the [tool]."
+ self_msg = "You keep the ribcage open on [target]'s torso with \the [tool]."
+ if (target_zone == BP_GROIN)
+ msg = "[user] keeps the incision open on [target]'s lower abdomen with \the [tool]."
+ self_msg = "You keep the incision open on [target]'s lower abdomen with \the [tool]."
+ user.visible_message(msg, self_msg)
+ affected.open = 2
+
+/datum/surgery_step/generic/retract_skin/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ var/msg = "[user]'s hand slips, tearing the edges of the incision on [target]'s [affected.name] with \the [tool]!"
+ var/self_msg = "Your hand slips, tearing the edges of the incision on [target]'s [affected.name] with \the [tool]!"
+ if (target_zone == BP_TORSO)
+ msg = "[user]'s hand slips, damaging several organs in [target]'s torso with \the [tool]!"
+ self_msg = "Your hand slips, damaging several organs in [target]'s torso with \the [tool]!"
+ if (target_zone == BP_GROIN)
+ msg = "[user]'s hand slips, damaging several organs in [target]'s lower abdomen with \the [tool]!"
+ self_msg = "Your hand slips, damaging several organs in [target]'s lower abdomen with \the [tool]!"
+ user.visible_message(msg, self_msg)
+ target.apply_damage(12, BRUTE, affected, sharp=1)
+
+///////////////////////////////////////////////////////////////
+// Cauterize Surgery
+///////////////////////////////////////////////////////////////
/datum/surgery_step/generic/cauterize
allowed_tools = list(
@@ -245,31 +270,35 @@
min_duration = 70
max_duration = 100
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if(..())
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- return affected && affected.open && target_zone != O_MOUTH
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+/datum/surgery_step/generic/cauterize/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if(..())
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] is beginning to cauterize the incision on [target]'s [affected.name] with \the [tool]." , \
- "You are beginning to cauterize the incision on [target]'s [affected.name] with \the [tool].")
- target.custom_pain("Your [affected.name] is being burned!", 40)
- ..()
+ return affected && affected.open && target_zone != O_MOUTH
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] cauterizes the incision on [target]'s [affected.name] with \the [tool].", \
- "You cauterize the incision on [target]'s [affected.name] with \the [tool].")
- affected.open = 0
- affected.germ_level = 0
- affected.status &= ~ORGAN_BLEEDING
+/datum/surgery_step/generic/cauterize/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] is beginning to cauterize the incision on [target]'s [affected.name] with \the [tool]." , \
+ "You are beginning to cauterize the incision on [target]'s [affected.name] with \the [tool].")
+ target.custom_pain("Your [affected.name] is being burned!", 40)
+ ..()
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user]'s hand slips, leaving a small burn on [target]'s [affected.name] with \the [tool]!", \
- "Your hand slips, leaving a small burn on [target]'s [affected.name] with \the [tool]!")
- target.apply_damage(3, BURN, affected)
+/datum/surgery_step/generic/cauterize/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] cauterizes the incision on [target]'s [affected.name] with \the [tool].", \
+ "You cauterize the incision on [target]'s [affected.name] with \the [tool].")
+ affected.open = 0
+ affected.germ_level = 0
+ affected.status &= ~ORGAN_BLEEDING
+
+/datum/surgery_step/generic/cauterize/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user]'s hand slips, leaving a small burn on [target]'s [affected.name] with \the [tool]!", \
+ "Your hand slips, leaving a small burn on [target]'s [affected.name] with \the [tool]!")
+ target.apply_damage(3, BURN, affected)
+
+///////////////////////////////////////////////////////////////
+// Amputation Surgery
+///////////////////////////////////////////////////////////////
/datum/surgery_step/generic/amputate
allowed_tools = list(
@@ -281,32 +310,32 @@
min_duration = 110
max_duration = 160
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if (target_zone == O_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
- return !affected.cannot_amputate
+/datum/surgery_step/generic/amputate/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (target_zone == O_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
+ return !affected.cannot_amputate
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] is beginning to amputate [target]'s [affected.name] with \the [tool]." , \
- "You are beginning to cut through [target]'s [affected.amputation_point] with \the [tool].")
- target.custom_pain("Your [affected.amputation_point] is being ripped apart!", 100)
- ..()
+/datum/surgery_step/generic/amputate/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] is beginning to amputate [target]'s [affected.name] with \the [tool]." , \
+ "You are beginning to cut through [target]'s [affected.amputation_point] with \the [tool].")
+ target.custom_pain("Your [affected.amputation_point] is being ripped apart!", 100)
+ ..()
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] amputates [target]'s [affected.name] at the [affected.amputation_point] with \the [tool].", \
- "You amputate [target]'s [affected.name] with \the [tool].")
- affected.droplimb(1,DROPLIMB_EDGE)
+/datum/surgery_step/generic/amputate/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] amputates [target]'s [affected.name] at the [affected.amputation_point] with \the [tool].", \
+ "You amputate [target]'s [affected.name] with \the [tool].")
+ affected.droplimb(1,DROPLIMB_EDGE)
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user]'s hand slips, sawing through the bone in [target]'s [affected.name] with \the [tool]!", \
- "Your hand slips, sawwing through the bone in [target]'s [affected.name] with \the [tool]!")
- affected.createwound(CUT, 30)
- affected.fracture()
+/datum/surgery_step/generic/amputate/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user]'s hand slips, sawing through the bone in [target]'s [affected.name] with \the [tool]!", \
+ "Your hand slips, sawwing through the bone in [target]'s [affected.name] with \the [tool]!")
+ affected.createwound(CUT, 30)
+ affected.fracture()
diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm
index c58a927b52..c8872e05cc 100644
--- a/code/modules/surgery/implant.dm
+++ b/code/modules/surgery/implant.dm
@@ -38,6 +38,10 @@
"Your hand slips, scraping around inside [target]'s [affected.name] with \the [tool]!")
affected.createwound(CUT, 20)
+///////////////////////////////////////////////////////////////
+// Space Making Surgery
+///////////////////////////////////////////////////////////////
+
/datum/surgery_step/cavity/make_space
allowed_tools = list(
/obj/item/weapon/surgical/surgicaldrill = 100, \
@@ -66,6 +70,10 @@
user.visible_message("[user] makes some space inside [target]'s [get_cavity(affected)] cavity with \the [tool].", \
"You make some space inside [target]'s [get_cavity(affected)] cavity with \the [tool]." )
+///////////////////////////////////////////////////////////////
+// Cavity Closing Surgery
+///////////////////////////////////////////////////////////////
+
/datum/surgery_step/cavity/close_space
priority = 2
allowed_tools = list(
@@ -78,23 +86,27 @@
min_duration = 60
max_duration = 80
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if(..())
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- return affected && affected.cavity
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+/datum/surgery_step/cavity/close_space/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if(..())
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] starts mending [target]'s [get_cavity(affected)] cavity wall with \the [tool].", \
- "You start mending [target]'s [get_cavity(affected)] cavity wall with \the [tool]." )
- target.custom_pain("The pain in your chest is living hell!",1)
- affected.cavity = 0
- ..()
+ return affected && affected.cavity
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/chest/affected = target.get_organ(target_zone)
- user.visible_message("[user] mends [target]'s [get_cavity(affected)] cavity walls with \the [tool].", \
- " You mend[target]'s [get_cavity(affected)] cavity walls with \the [tool]." )
+/datum/surgery_step/cavity/close_space/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] starts mending [target]'s [get_cavity(affected)] cavity wall with \the [tool].", \
+ "You start mending [target]'s [get_cavity(affected)] cavity wall with \the [tool]." )
+ target.custom_pain("The pain in your chest is living hell!",1)
+ affected.cavity = 0
+ ..()
+
+/datum/surgery_step/cavity/close_space/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/chest/affected = target.get_organ(target_zone)
+ user.visible_message("[user] mends [target]'s [get_cavity(affected)] cavity walls with \the [tool].", \
+ " You mend[target]'s [get_cavity(affected)] cavity walls with \the [tool]." )
+
+///////////////////////////////////////////////////////////////
+// Item Implantation Surgery
+///////////////////////////////////////////////////////////////
/datum/surgery_step/cavity/place_item
priority = 0
@@ -103,43 +115,43 @@
min_duration = 80
max_duration = 100
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if(..())
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if(istype(user,/mob/living/silicon/robot))
- return
- if(affected && affected.cavity)
- var/total_volume = tool.w_class
- for(var/obj/item/I in affected.implants)
- if(istype(I,/obj/item/weapon/implant))
- continue
- total_volume += I.w_class
- return total_volume <= get_max_wclass(affected)
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+/datum/surgery_step/cavity/place_item/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if(..())
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] starts putting \the [tool] inside [target]'s [get_cavity(affected)] cavity.", \
- "You start putting \the [tool] inside [target]'s [get_cavity(affected)] cavity." ) //Nobody will probably ever see this, but I made these two blue. ~CK
- target.custom_pain("The pain in your chest is living hell!",1)
- ..()
+ if(istype(user,/mob/living/silicon/robot))
+ return
+ if(affected && affected.cavity)
+ var/total_volume = tool.w_class
+ for(var/obj/item/I in affected.implants)
+ if(istype(I,/obj/item/weapon/implant))
+ continue
+ total_volume += I.w_class
+ return total_volume <= get_max_wclass(affected)
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/chest/affected = target.get_organ(target_zone)
+/datum/surgery_step/cavity/place_item/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] starts putting \the [tool] inside [target]'s [get_cavity(affected)] cavity.", \
+ "You start putting \the [tool] inside [target]'s [get_cavity(affected)] cavity." ) //Nobody will probably ever see this, but I made these two blue. ~CK
+ target.custom_pain("The pain in your chest is living hell!",1)
+ ..()
- user.visible_message("[user] puts \the [tool] inside [target]'s [get_cavity(affected)] cavity.", \
- "You put \the [tool] inside [target]'s [get_cavity(affected)] cavity." )
- if (tool.w_class > get_max_wclass(affected)/2 && prob(50) && (affected.robotic < ORGAN_ROBOT))
- user << " You tear some blood vessels trying to fit such a big object in this cavity."
- var/datum/wound/internal_bleeding/I = new (10)
- affected.wounds += I
- affected.owner.custom_pain("You feel something rip in your [affected.name]!", 1)
- user.drop_item()
- affected.implants += tool
- tool.loc = affected
- affected.cavity = 0
+/datum/surgery_step/cavity/place_item/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/chest/affected = target.get_organ(target_zone)
+
+ user.visible_message("[user] puts \the [tool] inside [target]'s [get_cavity(affected)] cavity.", \
+ "You put \the [tool] inside [target]'s [get_cavity(affected)] cavity." )
+ if (tool.w_class > get_max_wclass(affected)/2 && prob(50) && (affected.robotic < ORGAN_ROBOT))
+ user << " You tear some blood vessels trying to fit such a big object in this cavity."
+ var/datum/wound/internal_bleeding/I = new (10)
+ affected.wounds += I
+ affected.owner.custom_pain("You feel something rip in your [affected.name]!", 1)
+ user.drop_item()
+ affected.implants += tool
+ tool.loc = affected
+ affected.cavity = 0
//////////////////////////////////////////////////////////////////
-// IMPLANT/ITEM REMOVAL SURGERY //
+// IMPLANT/ITEM REMOVAL SURGERY
//////////////////////////////////////////////////////////////////
/datum/surgery_step/cavity/implant_removal
@@ -152,78 +164,77 @@
min_duration = 80
max_duration = 100
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if(affected.organ_tag == BP_HEAD)
- var/obj/item/organ/internal/brain/sponge = target.internal_organs_by_name["brain"]
- return ..() && (!sponge || !sponge.damage)
- else
- return ..()
+/datum/surgery_step/cavity/implant_removal/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(affected.organ_tag == BP_HEAD)
+ var/obj/item/organ/internal/brain/sponge = target.internal_organs_by_name["brain"]
+ return ..() && (!sponge || !sponge.damage)
+ else
+ return ..()
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] starts poking around inside [target]'s [affected.name] with \the [tool].", \
- "You start poking around inside [target]'s [affected.name] with \the [tool]." )
- target.custom_pain("The pain in your [affected.name] is living hell!",1)
- ..()
+/datum/surgery_step/cavity/implant_removal/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] starts poking around inside [target]'s [affected.name] with \the [tool].", \
+ "You start poking around inside [target]'s [affected.name] with \the [tool]." )
+ target.custom_pain("The pain in your [affected.name] is living hell!",1)
+ ..()
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/chest/affected = target.get_organ(target_zone)
+/datum/surgery_step/cavity/implant_removal/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/chest/affected = target.get_organ(target_zone)
- var/find_prob = 0
+ var/find_prob = 0
- if (affected.implants.len)
+ if (affected.implants.len)
- var/obj/item/obj = pick(affected.implants)
+ var/obj/item/obj = pick(affected.implants)
- if(istype(obj,/obj/item/weapon/implant))
- var/obj/item/weapon/implant/imp = obj
- if (imp.islegal())
- find_prob +=60
- else
- find_prob +=40
+ if(istype(obj,/obj/item/weapon/implant))
+ var/obj/item/weapon/implant/imp = obj
+ if (imp.islegal())
+ find_prob +=60
else
- find_prob +=50
-
- if (prob(find_prob))
- user.visible_message("[user] takes something out of incision on [target]'s [affected.name] with \the [tool]!", \
- "You take [obj] out of incision on [target]'s [affected.name]s with \the [tool]!" )
- affected.implants -= obj
-
- BITSET(target.hud_updateflag, IMPLOYAL_HUD)
-
- //Handle possessive brain borers.
- if(istype(obj,/mob/living/simple_animal/borer))
- var/mob/living/simple_animal/borer/worm = obj
- if(worm.controlling)
- target.release_control()
- worm.detatch()
- worm.leave_host()
- else
- obj.loc = get_turf(target)
- obj.add_blood(target)
- obj.update_icon()
- if(istype(obj,/obj/item/weapon/implant))
- var/obj/item/weapon/implant/imp = obj
- imp.imp_in = null
- imp.implanted = 0
- else
- user.visible_message("[user] removes \the [tool] from [target]'s [affected.name].", \
- "There's something inside [target]'s [affected.name], but you just missed it this time." )
+ find_prob +=40
else
- user.visible_message("[user] could not find anything inside [target]'s [affected.name], and pulls \the [tool] out.", \
- "You could not find anything inside [target]'s [affected.name]." )
+ find_prob +=50
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- ..()
- var/obj/item/organ/external/chest/affected = target.get_organ(target_zone)
- if (affected.implants.len)
- var/fail_prob = 10
- fail_prob += 100 - tool_quality(tool)
- if (prob(fail_prob))
- var/obj/item/weapon/implant/imp = affected.implants[1]
- user.visible_message(" Something beeps inside [target]'s [affected.name]!")
- playsound(imp.loc, 'sound/items/countdown.ogg', 75, 1, -3)
- spawn(25)
- imp.activate()
+ if (prob(find_prob))
+ user.visible_message("[user] takes something out of incision on [target]'s [affected.name] with \the [tool]!", \
+ "You take [obj] out of incision on [target]'s [affected.name]s with \the [tool]!" )
+ affected.implants -= obj
+ BITSET(target.hud_updateflag, IMPLOYAL_HUD)
+
+ //Handle possessive brain borers.
+ if(istype(obj,/mob/living/simple_animal/borer))
+ var/mob/living/simple_animal/borer/worm = obj
+ if(worm.controlling)
+ target.release_control()
+ worm.detatch()
+ worm.leave_host()
+ else
+ obj.loc = get_turf(target)
+ obj.add_blood(target)
+ obj.update_icon()
+ if(istype(obj,/obj/item/weapon/implant))
+ var/obj/item/weapon/implant/imp = obj
+ imp.imp_in = null
+ imp.implanted = 0
+ else
+ user.visible_message("[user] removes \the [tool] from [target]'s [affected.name].", \
+ "There's something inside [target]'s [affected.name], but you just missed it this time." )
+ else
+ user.visible_message("[user] could not find anything inside [target]'s [affected.name], and pulls \the [tool] out.", \
+ "You could not find anything inside [target]'s [affected.name]." )
+
+/datum/surgery_step/cavity/implant_removal/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ ..()
+ var/obj/item/organ/external/chest/affected = target.get_organ(target_zone)
+ if (affected.implants.len)
+ var/fail_prob = 10
+ fail_prob += 100 - tool_quality(tool)
+ if (prob(fail_prob))
+ var/obj/item/weapon/implant/imp = affected.implants[1]
+ user.visible_message(" Something beeps inside [target]'s [affected.name]!")
+ playsound(imp.loc, 'sound/items/countdown.ogg', 75, 1, -3)
+ spawn(25)
+ imp.activate()
diff --git a/code/modules/surgery/limb_reattach.dm b/code/modules/surgery/limb_reattach.dm
index 99fa33d1cb..c57248da0f 100644
--- a/code/modules/surgery/limb_reattach.dm
+++ b/code/modules/surgery/limb_reattach.dm
@@ -7,14 +7,19 @@
priority = 3 // Must be higher than /datum/surgery_step/internal
req_open = 0
can_infect = 0
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if (!hasorgans(target))
- return 0
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if (affected)
- return 0
- var/list/organ_data = target.species.has_limbs["[target_zone]"]
- return !isnull(organ_data)
+
+/datum/surgery_step/limb/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (!hasorgans(target))
+ return 0
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if (affected)
+ return 0
+ var/list/organ_data = target.species.has_limbs["[target_zone]"]
+ return !isnull(organ_data)
+
+///////////////////////////////////////////////////////////////
+// Limb Attachment Surgery
+///////////////////////////////////////////////////////////////
/datum/surgery_step/limb/attach
allowed_tools = list(/obj/item/organ/external = 100)
@@ -22,45 +27,49 @@
min_duration = 50
max_duration = 70
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/E = tool
- var/obj/item/organ/external/P = target.organs_by_name[E.parent_organ]
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if (affected)
- to_chat(user, "Something is in the way! You can't attach [E] here!")
- return 0
- if(!P)
- to_chat(user, "There's nothing to attach [E] to!")
- return 0
- else if((P.robotic >= ORGAN_ROBOT) && (E.robotic < ORGAN_ROBOT))
- to_chat(user, "Attaching [E] to [P] wouldn't work well.")
- return 0
- else if(istype(E, /obj/item/organ/external/head) && E.robotic >= ORGAN_ROBOT && P.robotic < ORGAN_ROBOT)
- to_chat(user, "Attaching [E] to [P] might break [E].")
- return 0
- else
- return 1
+/datum/surgery_step/limb/attach/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/E = tool
+ var/obj/item/organ/external/P = target.organs_by_name[E.parent_organ]
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if (affected)
+ to_chat(user, "Something is in the way! You can't attach [E] here!")
+ return 0
+ if(!P)
+ to_chat(user, "There's nothing to attach [E] to!")
+ return 0
+ else if((P.robotic >= ORGAN_ROBOT) && (E.robotic < ORGAN_ROBOT))
+ to_chat(user, "Attaching [E] to [P] wouldn't work well.")
+ return 0
+ else if(istype(E, /obj/item/organ/external/head) && E.robotic >= ORGAN_ROBOT && P.robotic < ORGAN_ROBOT)
+ to_chat(user, "Attaching [E] to [P] might break [E].")
+ return 0
+ else
+ return 1
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/E = tool
- user.visible_message("[user] starts attaching [E.name] to [target]'s [E.amputation_point].", \
- "You start attaching [E.name] to [target]'s [E.amputation_point].")
+/datum/surgery_step/limb/attach/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/E = tool
+ user.visible_message("[user] starts attaching [E.name] to [target]'s [E.amputation_point].", \
+ "You start attaching [E.name] to [target]'s [E.amputation_point].")
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/E = tool
- user.visible_message("[user] has attached [target]'s [E.name] to the [E.amputation_point].", \
- "You have attached [target]'s [E.name] to the [E.amputation_point].")
- user.drop_from_inventory(E)
- E.replaced(target)
- target.update_body()
- target.updatehealth()
- target.UpdateDamageIcon()
+/datum/surgery_step/limb/attach/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/E = tool
+ user.visible_message("[user] has attached [target]'s [E.name] to the [E.amputation_point].", \
+ "You have attached [target]'s [E.name] to the [E.amputation_point].")
+ user.drop_from_inventory(E)
+ E.replaced(target)
+ target.update_body()
+ target.updatehealth()
+ target.UpdateDamageIcon()
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/E = tool
- user.visible_message(" [user]'s hand slips, damaging [target]'s [E.amputation_point]!", \
- " Your hand slips, damaging [target]'s [E.amputation_point]!")
- target.apply_damage(10, BRUTE, null, sharp=1)
+/datum/surgery_step/limb/attach/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/E = tool
+ user.visible_message(" [user]'s hand slips, damaging [target]'s [E.amputation_point]!", \
+ " Your hand slips, damaging [target]'s [E.amputation_point]!")
+ target.apply_damage(10, BRUTE, null, sharp=1)
+
+///////////////////////////////////////////////////////////////
+// Limb Connection Surgery
+///////////////////////////////////////////////////////////////
/datum/surgery_step/limb/connect
allowed_tools = list(
@@ -73,32 +82,36 @@
min_duration = 100
max_duration = 120
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/E = target.get_organ(target_zone)
- return E && !E.is_stump() && (E.status & ORGAN_DESTROYED)
+/datum/surgery_step/limb/connect/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/E = target.get_organ(target_zone)
+ return E && !E.is_stump() && (E.status & ORGAN_DESTROYED)
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/E = target.get_organ(target_zone)
- user.visible_message("[user] starts connecting tendons and muscles in [target]'s [E.amputation_point] with [tool].", \
- "You start connecting tendons and muscle in [target]'s [E.amputation_point].")
+/datum/surgery_step/limb/connect/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/E = target.get_organ(target_zone)
+ user.visible_message("[user] starts connecting tendons and muscles in [target]'s [E.amputation_point] with [tool].", \
+ "You start connecting tendons and muscle in [target]'s [E.amputation_point].")
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/E = target.get_organ(target_zone)
- user.visible_message("[user] has connected tendons and muscles in [target]'s [E.amputation_point] with [tool].", \
- "You have connected tendons and muscles in [target]'s [E.amputation_point] with [tool].")
- E.status &= ~ORGAN_DESTROYED
- if(E.children)
- for(var/obj/item/organ/external/C in E.children)
- C.status &= ~ORGAN_DESTROYED
- target.update_body()
- target.updatehealth()
- target.UpdateDamageIcon()
+/datum/surgery_step/limb/connect/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/E = target.get_organ(target_zone)
+ user.visible_message("[user] has connected tendons and muscles in [target]'s [E.amputation_point] with [tool].", \
+ "You have connected tendons and muscles in [target]'s [E.amputation_point] with [tool].")
+ E.status &= ~ORGAN_DESTROYED
+ if(E.children)
+ for(var/obj/item/organ/external/C in E.children)
+ C.status &= ~ORGAN_DESTROYED
+ target.update_body()
+ target.updatehealth()
+ target.UpdateDamageIcon()
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/E = tool
- user.visible_message(" [user]'s hand slips, damaging [target]'s [E.amputation_point]!", \
- " Your hand slips, damaging [target]'s [E.amputation_point]!")
- target.apply_damage(10, BRUTE, null, sharp=1)
+/datum/surgery_step/limb/connect/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/E = tool
+ user.visible_message(" [user]'s hand slips, damaging [target]'s [E.amputation_point]!", \
+ " Your hand slips, damaging [target]'s [E.amputation_point]!")
+ target.apply_damage(10, BRUTE, null, sharp=1)
+
+///////////////////////////////////////////////////////////////
+// Robolimb Attachment Surgery
+///////////////////////////////////////////////////////////////
/datum/surgery_step/limb/mechanize
allowed_tools = list(/obj/item/robot_parts = 100)
@@ -106,43 +119,43 @@
min_duration = 80
max_duration = 100
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if(..())
- var/obj/item/robot_parts/p = tool
- if (p.part)
- if (!(target_zone in p.part))
- return 0
- return isnull(target.get_organ(target_zone))
+/datum/surgery_step/limb/mechanize/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if(..())
+ var/obj/item/robot_parts/p = tool
+ if (p.part)
+ if (!(target_zone in p.part))
+ return 0
+ return isnull(target.get_organ(target_zone))
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] starts attaching \the [tool] to [target].", \
- "You start attaching \the [tool] to [target].")
+/datum/surgery_step/limb/mechanize/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] starts attaching \the [tool] to [target].", \
+ "You start attaching \the [tool] to [target].")
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/robot_parts/L = tool
- user.visible_message("[user] has attached \the [tool] to [target].", \
- "You have attached \the [tool] to [target].")
+/datum/surgery_step/limb/mechanize/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/robot_parts/L = tool
+ user.visible_message("[user] has attached \the [tool] to [target].", \
+ "You have attached \the [tool] to [target].")
- if(L.part)
- for(var/part_name in L.part)
- if(!isnull(target.get_organ(part_name)))
- continue
- var/list/organ_data = target.species.has_limbs["[part_name]"]
- if(!organ_data)
- continue
- var/new_limb_type = organ_data["path"]
- var/obj/item/organ/external/new_limb = new new_limb_type(target)
- new_limb.robotize(L.model_info)
- if(L.sabotaged)
- new_limb.sabotaged = 1
+ if(L.part)
+ for(var/part_name in L.part)
+ if(!isnull(target.get_organ(part_name)))
+ continue
+ var/list/organ_data = target.species.has_limbs["[part_name]"]
+ if(!organ_data)
+ continue
+ var/new_limb_type = organ_data["path"]
+ var/obj/item/organ/external/new_limb = new new_limb_type(target)
+ new_limb.robotize(L.model_info)
+ if(L.sabotaged)
+ new_limb.sabotaged = 1
- target.update_body()
- target.updatehealth()
- target.UpdateDamageIcon()
+ target.update_body()
+ target.updatehealth()
+ target.UpdateDamageIcon()
- qdel(tool)
+ qdel(tool)
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message(" [user]'s hand slips, damaging [target]'s flesh!", \
- " Your hand slips, damaging [target]'s flesh!")
- target.apply_damage(10, BRUTE, null, sharp=1)
+/datum/surgery_step/limb/mechanize/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message(" [user]'s hand slips, damaging [target]'s flesh!", \
+ " Your hand slips, damaging [target]'s flesh!")
+ target.apply_damage(10, BRUTE, null, sharp=1)
diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm
index 562cc8e380..49fe150c4e 100644
--- a/code/modules/surgery/organs_internal.dm
+++ b/code/modules/surgery/organs_internal.dm
@@ -65,86 +65,87 @@
min_duration = 70
max_duration = 90
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+/datum/surgery_step/internal/fix_organ/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (!hasorgans(target))
+ return
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(!affected)
+ return
+ var/is_organ_damaged = 0
+ for(var/obj/item/organ/I in affected.internal_organs)
+ if(I.damage > 0)
+ is_organ_damaged = 1
+ break
+ return ..() && is_organ_damaged
- if (!hasorgans(target))
- return
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if(!affected)
- return
- var/is_organ_damaged = 0
- for(var/obj/item/organ/I in affected.internal_organs)
- if(I.damage > 0)
- is_organ_damaged = 1
- break
- return ..() && is_organ_damaged
+/datum/surgery_step/internal/fix_organ/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/tool_name = "\the [tool]"
+ if (istype(tool, /obj/item/stack/medical/advanced/bruise_pack))
+ tool_name = "regenerative membrane"
+ else if (istype(tool, /obj/item/stack/medical/bruise_pack))
+ tool_name = "the bandaid"
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/tool_name = "\the [tool]"
- if (istype(tool, /obj/item/stack/medical/advanced/bruise_pack))
- tool_name = "regenerative membrane"
- else if (istype(tool, /obj/item/stack/medical/bruise_pack))
- tool_name = "the bandaid"
+ if (!hasorgans(target))
+ return
- if (!hasorgans(target))
- return
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ for(var/obj/item/organ/I in affected.internal_organs)
+ if(I && I.damage > 0)
+ if(!(I.robotic >= ORGAN_ROBOT))
+ user.visible_message("[user] starts treating damage to [target]'s [I.name] with [tool_name].", \
+ "You start treating damage to [target]'s [I.name] with [tool_name]." )
- for(var/obj/item/organ/I in affected.internal_organs)
- if(I && I.damage > 0)
- if(!(I.robotic >= ORGAN_ROBOT))
- user.visible_message("[user] starts treating damage to [target]'s [I.name] with [tool_name].", \
- "You start treating damage to [target]'s [I.name] with [tool_name]." )
+ target.custom_pain("The pain in your [affected.name] is living hell!", 100)
+ ..()
- target.custom_pain("The pain in your [affected.name] is living hell!", 100)
- ..()
+/datum/surgery_step/internal/fix_organ/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/tool_name = "\the [tool]"
+ if (istype(tool, /obj/item/stack/medical/advanced/bruise_pack))
+ tool_name = "regenerative membrane"
+ if (istype(tool, /obj/item/stack/medical/bruise_pack))
+ tool_name = "the bandaid"
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/tool_name = "\the [tool]"
- if (istype(tool, /obj/item/stack/medical/advanced/bruise_pack))
- tool_name = "regenerative membrane"
- if (istype(tool, /obj/item/stack/medical/bruise_pack))
- tool_name = "the bandaid"
+ if (!hasorgans(target))
+ return
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if (!hasorgans(target))
- return
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ for(var/obj/item/organ/internal/I in affected.internal_organs)
+ if(I && I.damage > 0)
+ if(!(I.robotic >= ORGAN_ROBOT))
+ user.visible_message("[user] treats damage to [target]'s [I.name] with [tool_name].", \
+ "You treat damage to [target]'s [I.name] with [tool_name]." )
+ I.damage = 0
+ if(I.organ_tag == O_EYES)
+ target.sdisabilities &= ~BLIND
+ if(I.organ_tag == O_LUNGS)
+ target.SetLosebreath(0)
- for(var/obj/item/organ/internal/I in affected.internal_organs)
- if(I && I.damage > 0)
- if(!(I.robotic >= ORGAN_ROBOT))
- user.visible_message("[user] treats damage to [target]'s [I.name] with [tool_name].", \
- "You treat damage to [target]'s [I.name] with [tool_name]." )
- I.damage = 0
- if(I.organ_tag == O_EYES)
- target.sdisabilities &= ~BLIND
- if(I.organ_tag == O_LUNGS)
- target.SetLosebreath(0)
+/datum/surgery_step/internal/fix_organ/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (!hasorgans(target))
+ return
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user]'s hand slips, getting mess and tearing the inside of [target]'s [affected.name] with \the [tool]!", \
+ "Your hand slips, getting mess and tearing the inside of [target]'s [affected.name] with \the [tool]!")
+ var/dam_amt = 2
- if (!hasorgans(target))
- return
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if (istype(tool, /obj/item/stack/medical/advanced/bruise_pack))
+ target.adjustToxLoss(5)
+ else if (istype(tool, /obj/item/stack/medical/bruise_pack))
+ dam_amt = 5
+ target.adjustToxLoss(10)
+ affected.createwound(CUT, 5)
- user.visible_message("[user]'s hand slips, getting mess and tearing the inside of [target]'s [affected.name] with \the [tool]!", \
- "Your hand slips, getting mess and tearing the inside of [target]'s [affected.name] with \the [tool]!")
- var/dam_amt = 2
+ for(var/obj/item/organ/I in affected.internal_organs)
+ if(I && I.damage > 0)
+ I.take_damage(dam_amt,0)
- if (istype(tool, /obj/item/stack/medical/advanced/bruise_pack))
- target.adjustToxLoss(5)
+///////////////////////////////////////////////////////////////
+// Organ Detaching Surgery
+///////////////////////////////////////////////////////////////
- else if (istype(tool, /obj/item/stack/medical/bruise_pack))
- dam_amt = 5
- target.adjustToxLoss(10)
- affected.createwound(CUT, 5)
-
- for(var/obj/item/organ/I in affected.internal_organs)
- if(I && I.damage > 0)
- I.take_damage(dam_amt,0)
-
-/datum/surgery_step/internal/detatch_organ
+/datum/surgery_step/internal/detatch_organ/
allowed_tools = list(
/obj/item/weapon/surgical/scalpel = 100, \
@@ -155,54 +156,56 @@
min_duration = 90
max_duration = 110
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+/datum/surgery_step/internal/detatch_organ/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (!..())
+ return 0
- if (!..())
- return 0
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(!(affected && !(affected.robotic >= ORGAN_ROBOT)))
+ return 0
- if(!(affected && !(affected.robotic >= ORGAN_ROBOT)))
- return 0
+ target.op_stage.current_organ = null
- target.op_stage.current_organ = null
+ var/list/attached_organs = list()
+ for(var/organ in target.internal_organs_by_name)
+ var/obj/item/organ/I = target.internal_organs_by_name[organ]
+ if(I && !(I.status & ORGAN_CUT_AWAY) && I.parent_organ == target_zone)
+ attached_organs |= organ
- var/list/attached_organs = list()
- for(var/organ in target.internal_organs_by_name)
- var/obj/item/organ/I = target.internal_organs_by_name[organ]
- if(I && !(I.status & ORGAN_CUT_AWAY) && I.parent_organ == target_zone)
- attached_organs |= organ
+ var/organ_to_remove = input(user, "Which organ do you want to prepare for removal?") as null|anything in attached_organs
+ if(!organ_to_remove)
+ return 0
- var/organ_to_remove = input(user, "Which organ do you want to prepare for removal?") as null|anything in attached_organs
- if(!organ_to_remove)
- return 0
+ target.op_stage.current_organ = organ_to_remove
- target.op_stage.current_organ = organ_to_remove
+ return ..() && organ_to_remove
- return ..() && organ_to_remove
+/datum/surgery_step/internal/detatch_organ/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] starts to separate [target]'s [target.op_stage.current_organ] with \the [tool].", \
+ "You start to separate [target]'s [target.op_stage.current_organ] with \the [tool]." )
+ target.custom_pain("The pain in your [affected.name] is living hell!", 100)
+ ..()
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
+/datum/surgery_step/internal/detatch_organ/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] has separated [target]'s [target.op_stage.current_organ] with \the [tool]." , \
+ "You have separated [target]'s [target.op_stage.current_organ] with \the [tool].")
- user.visible_message("[user] starts to separate [target]'s [target.op_stage.current_organ] with \the [tool].", \
- "You start to separate [target]'s [target.op_stage.current_organ] with \the [tool]." )
- target.custom_pain("The pain in your [affected.name] is living hell!", 100)
- ..()
+ var/obj/item/organ/I = target.internal_organs_by_name[target.op_stage.current_organ]
+ if(I && istype(I))
+ I.status |= ORGAN_CUT_AWAY
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] has separated [target]'s [target.op_stage.current_organ] with \the [tool]." , \
- "You have separated [target]'s [target.op_stage.current_organ] with \the [tool].")
+/datum/surgery_step/internal/detatch_organ/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user]'s hand slips, slicing an artery inside [target]'s [affected.name] with \the [tool]!", \
+ "Your hand slips, slicing an artery inside [target]'s [affected.name] with \the [tool]!")
+ affected.createwound(CUT, rand(30,50), 1)
- var/obj/item/organ/I = target.internal_organs_by_name[target.op_stage.current_organ]
- if(I && istype(I))
- I.status |= ORGAN_CUT_AWAY
-
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user]'s hand slips, slicing an artery inside [target]'s [affected.name] with \the [tool]!", \
- "Your hand slips, slicing an artery inside [target]'s [affected.name] with \the [tool]!")
- affected.createwound(CUT, rand(30,50), 1)
+///////////////////////////////////////////////////////////////
+// Organ Removal Surgery
+///////////////////////////////////////////////////////////////
/datum/surgery_step/internal/remove_organ
@@ -215,48 +218,51 @@
min_duration = 60
max_duration = 80
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+/datum/surgery_step/internal/remove_organ/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (!..())
+ return 0
- if (!..())
- return 0
+ target.op_stage.current_organ = null
+ var/list/removable_organs = list()
+ for(var/organ in target.internal_organs_by_name)
+ var/obj/item/organ/internal/I = target.internal_organs_by_name[organ]
+ if(istype(I) && (I.status & ORGAN_CUT_AWAY) && I.parent_organ == target_zone)
+ removable_organs |= organ
+
+ var/organ_to_remove = input(user, "Which organ do you want to remove?") as null|anything in removable_organs
+ if(!organ_to_remove)
+ return 0
+
+ target.op_stage.current_organ = organ_to_remove
+ return ..()
+
+/datum/surgery_step/internal/remove_organ/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] starts removing [target]'s [target.op_stage.current_organ] with \the [tool].", \
+ "You start removing [target]'s [target.op_stage.current_organ] with \the [tool].")
+ target.custom_pain("Someone's ripping out your [target.op_stage.current_organ]!", 100)
+ ..()
+
+/datum/surgery_step/internal/remove_organ/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] has removed [target]'s [target.op_stage.current_organ] with \the [tool].", \
+ "You have removed [target]'s [target.op_stage.current_organ] with \the [tool].")
+
+ // Extract the organ!
+ if(target.op_stage.current_organ)
+ var/obj/item/organ/O = target.internal_organs_by_name[target.op_stage.current_organ]
+ if(O && istype(O))
+ O.removed(user)
target.op_stage.current_organ = null
- var/list/removable_organs = list()
- for(var/organ in target.internal_organs_by_name)
- var/obj/item/organ/internal/I = target.internal_organs_by_name[organ]
- if(istype(I) && (I.status & ORGAN_CUT_AWAY) && I.parent_organ == target_zone)
- removable_organs |= organ
+/datum/surgery_step/internal/remove_organ/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user]'s hand slips, damaging [target]'s [affected.name] with \the [tool]!", \
+ "Your hand slips, damaging [target]'s [affected.name] with \the [tool]!")
+ affected.createwound(BRUISE, 20)
- var/organ_to_remove = input(user, "Which organ do you want to remove?") as null|anything in removable_organs
- if(!organ_to_remove)
- return 0
-
- target.op_stage.current_organ = organ_to_remove
- return ..()
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] starts removing [target]'s [target.op_stage.current_organ] with \the [tool].", \
- "You start removing [target]'s [target.op_stage.current_organ] with \the [tool].")
- target.custom_pain("Someone's ripping out your [target.op_stage.current_organ]!", 100)
- ..()
-
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] has removed [target]'s [target.op_stage.current_organ] with \the [tool].", \
- "You have removed [target]'s [target.op_stage.current_organ] with \the [tool].")
-
- // Extract the organ!
- if(target.op_stage.current_organ)
- var/obj/item/organ/O = target.internal_organs_by_name[target.op_stage.current_organ]
- if(O && istype(O))
- O.removed(user)
- target.op_stage.current_organ = null
-
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user]'s hand slips, damaging [target]'s [affected.name] with \the [tool]!", \
- "Your hand slips, damaging [target]'s [affected.name] with \the [tool]!")
- affected.createwound(BRUISE, 20)
+///////////////////////////////////////////////////////////////
+// Organ Replacement Surgery
+///////////////////////////////////////////////////////////////
/datum/surgery_step/internal/replace_organ
allowed_tools = list(
@@ -266,70 +272,76 @@
min_duration = 60
max_duration = 80
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+/datum/surgery_step/internal/replace_organ/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/internal/O = tool
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
- var/obj/item/organ/internal/O = tool
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if(!affected) return
- var/organ_compatible
- var/organ_missing
+ if(!affected)
+ return
- if(!istype(O))
- return 0
+ var/organ_compatible
+ var/organ_missing
- if((affected.robotic >= ORGAN_ROBOT) && !(O.robotic >= ORGAN_ROBOT))
- user << "You cannot install a naked organ into a robotic body."
- return SURGERY_FAILURE
+ if(!istype(O))
+ return 0
- if(!target.species)
- user << "You have no idea what species this person is. Report this on the bug tracker."
- return SURGERY_FAILURE
+ if((affected.robotic >= ORGAN_ROBOT) && !(O.robotic >= ORGAN_ROBOT))
+ user << "You cannot install a naked organ into a robotic body."
+ return SURGERY_FAILURE
- var/o_is = (O.gender == PLURAL) ? "are" : "is"
- var/o_a = (O.gender == PLURAL) ? "" : "a "
- var/o_do = (O.gender == PLURAL) ? "don't" : "doesn't"
+ if(!target.species)
+ user << "You have no idea what species this person is. Report this on the bug tracker."
+ return SURGERY_FAILURE
- if(O.damage > (O.max_damage * 0.75))
- user << "\The [O.organ_tag] [o_is] in no state to be transplanted."
- return SURGERY_FAILURE
+ var/o_is = (O.gender == PLURAL) ? "are" : "is"
+ var/o_a = (O.gender == PLURAL) ? "" : "a "
+ var/o_do = (O.gender == PLURAL) ? "don't" : "doesn't"
- if(!target.internal_organs_by_name[O.organ_tag])
- organ_missing = 1
- else
- user << "\The [target] already has [o_a][O.organ_tag]."
- return SURGERY_FAILURE
+ if(O.damage > (O.max_damage * 0.75))
+ user << "\The [O.organ_tag] [o_is] in no state to be transplanted."
+ return SURGERY_FAILURE
- if(O && affected.organ_tag == O.parent_organ)
- organ_compatible = 1
+ if(!target.internal_organs_by_name[O.organ_tag])
+ organ_missing = 1
+ else
+ user << "\The [target] already has [o_a][O.organ_tag]."
+ return SURGERY_FAILURE
- else
- user << "\The [O.organ_tag] [o_do] normally go in \the [affected.name]."
- return SURGERY_FAILURE
+ if(O && affected.organ_tag == O.parent_organ)
+ organ_compatible = 1
- return ..() && organ_missing && organ_compatible
+ else
+ user << "\The [O.organ_tag] [o_do] normally go in \the [affected.name]."
+ return SURGERY_FAILURE
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] starts transplanting \the [tool] into [target]'s [affected.name].", \
- "You start transplanting \the [tool] into [target]'s [affected.name].")
- target.custom_pain("Someone's rooting around in your [affected.name]!", 100)
- ..()
+ return ..() && organ_missing && organ_compatible
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] has transplanted \the [tool] into [target]'s [affected.name].", \
- "You have transplanted \the [tool] into [target]'s [affected.name].")
- var/obj/item/organ/O = tool
- if(istype(O))
- user.remove_from_mob(O)
- O.replaced(target,affected)
+/datum/surgery_step/internal/replace_organ/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] starts transplanting \the [tool] into [target]'s [affected.name].", \
+ "You start transplanting \the [tool] into [target]'s [affected.name].")
+ target.custom_pain("Someone's rooting around in your [affected.name]!", 100)
+ ..()
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user]'s hand slips, damaging \the [tool]!", \
- "Your hand slips, damaging \the [tool]!")
- var/obj/item/organ/I = tool
- if(istype(I))
- I.take_damage(rand(3,5),0)
+/datum/surgery_step/internal/replace_organ/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] has transplanted \the [tool] into [target]'s [affected.name].", \
+ "You have transplanted \the [tool] into [target]'s [affected.name].")
+ var/obj/item/organ/O = tool
+ if(istype(O))
+ user.remove_from_mob(O)
+ O.replaced(target,affected)
+
+/datum/surgery_step/internal/replace_organ/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user]'s hand slips, damaging \the [tool]!", \
+ "Your hand slips, damaging \the [tool]!")
+ var/obj/item/organ/I = tool
+ if(istype(I))
+ I.take_damage(rand(3,5),0)
+
+///////////////////////////////////////////////////////////////
+// Organ Attaching Surgery
+///////////////////////////////////////////////////////////////
/datum/surgery_step/internal/attach_organ
allowed_tools = list(
@@ -340,45 +352,44 @@
min_duration = 100
max_duration = 120
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+/datum/surgery_step/internal/attach_organ/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (!..())
+ return 0
- if (!..())
- return 0
+ target.op_stage.current_organ = null
- target.op_stage.current_organ = null
+ var/list/removable_organs = list()
+ for(var/organ in target.internal_organs_by_name)
+ var/obj/item/organ/I = target.internal_organs_by_name[organ]
+ if(istype(I) && (I.status & ORGAN_CUT_AWAY) && !(I.robotic >= ORGAN_ROBOT) && I.parent_organ == target_zone)
+ removable_organs |= organ
- var/list/removable_organs = list()
- for(var/organ in target.internal_organs_by_name)
- var/obj/item/organ/I = target.internal_organs_by_name[organ]
- if(istype(I) && (I.status & ORGAN_CUT_AWAY) && !(I.robotic >= ORGAN_ROBOT) && I.parent_organ == target_zone)
- removable_organs |= organ
+ var/organ_to_replace = input(user, "Which organ do you want to reattach?") as null|anything in removable_organs
+ if(!organ_to_replace)
+ return 0
- var/organ_to_replace = input(user, "Which organ do you want to reattach?") as null|anything in removable_organs
- if(!organ_to_replace)
- return 0
+ target.op_stage.current_organ = organ_to_replace
+ return ..()
- target.op_stage.current_organ = organ_to_replace
- return ..()
+/datum/surgery_step/internal/attach_organ/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] begins reattaching [target]'s [target.op_stage.current_organ] with \the [tool].", \
+ "You start reattaching [target]'s [target.op_stage.current_organ] with \the [tool].")
+ target.custom_pain("Someone's digging needles into your [target.op_stage.current_organ]!", 100)
+ ..()
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] begins reattaching [target]'s [target.op_stage.current_organ] with \the [tool].", \
- "You start reattaching [target]'s [target.op_stage.current_organ] with \the [tool].")
- target.custom_pain("Someone's digging needles into your [target.op_stage.current_organ]!", 100)
- ..()
+/datum/surgery_step/internal/attach_organ/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] has reattached [target]'s [target.op_stage.current_organ] with \the [tool]." , \
+ "You have reattached [target]'s [target.op_stage.current_organ] with \the [tool].")
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] has reattached [target]'s [target.op_stage.current_organ] with \the [tool]." , \
- "You have reattached [target]'s [target.op_stage.current_organ] with \the [tool].")
+ var/obj/item/organ/I = target.internal_organs_by_name[target.op_stage.current_organ]
+ if(I && istype(I))
+ I.status &= ~ORGAN_CUT_AWAY
- var/obj/item/organ/I = target.internal_organs_by_name[target.op_stage.current_organ]
- if(I && istype(I))
- I.status &= ~ORGAN_CUT_AWAY
-
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user]'s hand slips, damaging the flesh in [target]'s [affected.name] with \the [tool]!", \
- "Your hand slips, damaging the flesh in [target]'s [affected.name] with \the [tool]!")
- affected.createwound(BRUISE, 20)
+/datum/surgery_step/internal/attach_organ/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user]'s hand slips, damaging the flesh in [target]'s [affected.name] with \the [tool]!", \
+ "Your hand slips, damaging the flesh in [target]'s [affected.name] with \the [tool]!")
+ affected.createwound(BRUISE, 20)
//////////////////////////////////////////////////////////////////
// HEART SURGERY //
@@ -394,5 +405,5 @@
// min_duration = 30
// max_duration = 40
-// can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+// /datum/surgery_step/ribcage/heart/cut/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
// return ..() && target.op_stage.ribcage == 2
\ No newline at end of file
diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm
index 0bc086dd9d..ab18e302c3 100644
--- a/code/modules/surgery/other.dm
+++ b/code/modules/surgery/other.dm
@@ -3,6 +3,9 @@
// INTERNAL WOUND PATCHING //
//////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////
+// Internal Bleeding Surgery
+///////////////////////////////////////////////////////////////
/datum/surgery_step/fix_vein
priority = 2
@@ -16,85 +19,45 @@
min_duration = 70
max_duration = 90
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if(!hasorgans(target))
- return 0
+/datum/surgery_step/fix_vein/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if(!hasorgans(target))
+ return 0
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if(!affected) return
- var/internal_bleeding = 0
- for(var/datum/wound/W in affected.wounds) if(W.internal)
- internal_bleeding = 1
- break
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(!affected) return
+ var/internal_bleeding = 0
+ for(var/datum/wound/W in affected.wounds) if(W.internal)
+ internal_bleeding = 1
+ break
- return affected.open == (affected.encased ? 3 : 2) && internal_bleeding
+ return affected.open == (affected.encased ? 3 : 2) && internal_bleeding
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] starts patching the damaged vein in [target]'s [affected.name] with \the [tool]." , \
- "You start patching the damaged vein in [target]'s [affected.name] with \the [tool].")
- target.custom_pain("The pain in [affected.name] is unbearable!", 100)
- ..()
+/datum/surgery_step/fix_vein/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] starts patching the damaged vein in [target]'s [affected.name] with \the [tool]." , \
+ "You start patching the damaged vein in [target]'s [affected.name] with \the [tool].")
+ target.custom_pain("The pain in [affected.name] is unbearable!", 100)
+ ..()
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] has patched the damaged vein in [target]'s [affected.name] with \the [tool].", \
- "You have patched the damaged vein in [target]'s [affected.name] with \the [tool].")
+/datum/surgery_step/fix_vein/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] has patched the damaged vein in [target]'s [affected.name] with \the [tool].", \
+ "You have patched the damaged vein in [target]'s [affected.name] with \the [tool].")
- for(var/datum/wound/W in affected.wounds) if(W.internal)
- affected.wounds -= W
- affected.update_damages()
- if (ishuman(user) && prob(40)) user:bloody_hands(target, 0)
+ for(var/datum/wound/W in affected.wounds) if(W.internal)
+ affected.wounds -= W
+ affected.update_damages()
+ if (ishuman(user) && prob(40)) user:bloody_hands(target, 0)
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user]'s hand slips, smearing [tool] in the incision in [target]'s [affected.name]!" , \
- "Your hand slips, smearing [tool] in the incision in [target]'s [affected.name]!")
- affected.take_damage(5, 0)
+/datum/surgery_step/fix_vein/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user]'s hand slips, smearing [tool] in the incision in [target]'s [affected.name]!" , \
+ "Your hand slips, smearing [tool] in the incision in [target]'s [affected.name]!")
+ affected.take_damage(5, 0)
-/datum/surgery_step/fix_dead_tissue //Debridement
- priority = 2
- allowed_tools = list(
- /obj/item/weapon/surgical/scalpel = 100, \
- /obj/item/weapon/material/knife = 75, \
- /obj/item/weapon/material/shard = 50, \
- )
-
- can_infect = 1
- blood_level = 1
-
- min_duration = 110
- max_duration = 160
-
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if(!hasorgans(target))
- return 0
-
- if (target_zone == O_MOUTH || target_zone == O_EYES)
- return 0
-
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
-
- return affected && affected.open >= 2 && (affected.status & ORGAN_DEAD)
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] starts cutting away necrotic tissue in [target]'s [affected.name] with \the [tool]." , \
- "You start cutting away necrotic tissue in [target]'s [affected.name] with \the [tool].")
- target.custom_pain("The pain in [affected.name] is unbearable!", 100)
- ..()
-
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] has cut away necrotic tissue in [target]'s [affected.name] with \the [tool].", \
- "You have cut away necrotic tissue in [target]'s [affected.name] with \the [tool].")
- affected.open = 3
-
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user]'s hand slips, slicing an artery inside [target]'s [affected.name] with \the [tool]!", \
- "Your hand slips, slicing an artery inside [target]'s [affected.name] with \the [tool]!")
- affected.createwound(CUT, 20, 1)
+///////////////////////////////////////////////////////////////
+// Necrosis Surgery
+///////////////////////////////////////////////////////////////
/datum/surgery_step/treat_necrosis
priority = 2
@@ -112,60 +75,64 @@
min_duration = 50
max_duration = 60
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if (!istype(tool, /obj/item/weapon/reagent_containers))
- return 0
+/datum/surgery_step/treat_necrosis/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (!istype(tool, /obj/item/weapon/reagent_containers))
+ return 0
- var/obj/item/weapon/reagent_containers/container = tool
- if(!container.reagents.has_reagent("peridaxon"))
- return 0
+ var/obj/item/weapon/reagent_containers/container = tool
+ if(!container.reagents.has_reagent("peridaxon"))
+ return 0
- if(!hasorgans(target))
- return 0
+ if(!hasorgans(target))
+ return 0
- if (target_zone == O_MOUTH || target_zone == O_EYES)
- return 0
+ if (target_zone == O_MOUTH || target_zone == O_EYES)
+ return 0
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- return affected && affected.open == 3 && (affected.status & ORGAN_DEAD)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ return affected && affected.open == 3 && (affected.status & ORGAN_DEAD)
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] starts applying medication to the affected tissue in [target]'s [affected.name] with \the [tool]." , \
- "You start applying medication to the affected tissue in [target]'s [affected.name] with \the [tool].")
- target.custom_pain("Something in your [affected.name] is causing you a lot of pain!", 50)
- ..()
+/datum/surgery_step/treat_necrosis/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] starts applying medication to the affected tissue in [target]'s [affected.name] with \the [tool]." , \
+ "You start applying medication to the affected tissue in [target]'s [affected.name] with \the [tool].")
+ target.custom_pain("Something in your [affected.name] is causing you a lot of pain!", 50)
+ ..()
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
+/datum/surgery_step/treat_necrosis/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if (!istype(tool, /obj/item/weapon/reagent_containers))
- return
+ if (!istype(tool, /obj/item/weapon/reagent_containers))
+ return
- var/obj/item/weapon/reagent_containers/container = tool
+ var/obj/item/weapon/reagent_containers/container = tool
- var/trans = container.reagents.trans_to_mob(target, container.amount_per_transfer_from_this, CHEM_BLOOD) //technically it's contact, but the reagents are being applied to internal tissue
- if (trans > 0)
- affected.status &= ~ORGAN_DEAD
- affected.owner.update_body(1)
+ var/trans = container.reagents.trans_to_mob(target, container.amount_per_transfer_from_this, CHEM_BLOOD) //technically it's contact, but the reagents are being applied to internal tissue
+ if (trans > 0)
+ affected.status &= ~ORGAN_DEAD
+ affected.owner.update_body(1)
- user.visible_message("[user] applies [trans] units of the solution to affected tissue in [target]'s [affected.name].", \
- "You apply [trans] units of the solution to affected tissue in [target]'s [affected.name] with \the [tool].")
+ user.visible_message("[user] applies [trans] units of the solution to affected tissue in [target]'s [affected.name].", \
+ "You apply [trans] units of the solution to affected tissue in [target]'s [affected.name] with \the [tool].")
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
+/datum/surgery_step/treat_necrosis/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if (!istype(tool, /obj/item/weapon/reagent_containers))
- return
+ if (!istype(tool, /obj/item/weapon/reagent_containers))
+ return
- var/obj/item/weapon/reagent_containers/container = tool
+ var/obj/item/weapon/reagent_containers/container = tool
- var/trans = container.reagents.trans_to_mob(target, container.amount_per_transfer_from_this, CHEM_BLOOD)
+ var/trans = container.reagents.trans_to_mob(target, container.amount_per_transfer_from_this, CHEM_BLOOD)
- user.visible_message("[user]'s hand slips, applying [trans] units of the solution to the wrong place in [target]'s [affected.name] with the [tool]!" , \
- "Your hand slips, applying [trans] units of the solution to the wrong place in [target]'s [affected.name] with the [tool]!")
+ user.visible_message("[user]'s hand slips, applying [trans] units of the solution to the wrong place in [target]'s [affected.name] with the [tool]!" , \
+ "Your hand slips, applying [trans] units of the solution to the wrong place in [target]'s [affected.name] with the [tool]!")
- //no damage or anything, just wastes medicine
+ //no damage or anything, just wastes medicine
+
+///////////////////////////////////////////////////////////////
+// Hardsuit Removal Surgery
+///////////////////////////////////////////////////////////////
/datum/surgery_step/hardsuit
allowed_tools = list(
@@ -181,29 +148,28 @@
min_duration = 120
max_duration = 180
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if(!istype(target))
+/datum/surgery_step/hardsuit/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if(!istype(target))
+ return 0
+ if(istype(tool,/obj/item/weapon/weldingtool))
+ var/obj/item/weapon/weldingtool/welder = tool
+ if(!welder.isOn() || !welder.remove_fuel(1,user))
return 0
- if(istype(tool,/obj/item/weapon/weldingtool))
- var/obj/item/weapon/weldingtool/welder = tool
- if(!welder.isOn() || !welder.remove_fuel(1,user))
- return 0
- return (target_zone == BP_TORSO) && istype(target.back, /obj/item/weapon/rig) && !(target.back.canremove)
+ return (target_zone == BP_TORSO) && istype(target.back, /obj/item/weapon/rig) && !(target.back.canremove)
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] starts cutting through the support systems of [target]'s [target.back] with \the [tool]." , \
- "You start cutting through the support systems of [target]'s [target.back] with \the [tool].")
- ..()
+/datum/surgery_step/hardsuit/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] starts cutting through the support systems of [target]'s [target.back] with \the [tool]." , \
+ "You start cutting through the support systems of [target]'s [target.back] with \the [tool].")
+ ..()
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+/datum/surgery_step/hardsuit/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/weapon/rig/rig = target.back
+ if(!istype(rig))
+ return
+ rig.reset()
+ user.visible_message("[user] has cut through the support systems of [target]'s [rig] with \the [tool].", \
+ "You have cut through the support systems of [target]'s [rig] with \the [tool].")
- var/obj/item/weapon/rig/rig = target.back
- if(!istype(rig))
- return
- rig.reset()
- user.visible_message("[user] has cut through the support systems of [target]'s [rig] with \the [tool].", \
- "You have cut through the support systems of [target]'s [rig] with \the [tool].")
-
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user]'s [tool] can't quite seem to get through the metal...", \
- "Your [tool] can't quite seem to get through the metal. It's weakening, though - try again.")
+/datum/surgery_step/hardsuit/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user]'s [tool] can't quite seem to get through the metal...", \
+ "Your [tool] can't quite seem to get through the metal. It's weakening, though - try again.")
diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm
index 660cc6e05b..79609b0b7b 100644
--- a/code/modules/surgery/robotics.dm
+++ b/code/modules/surgery/robotics.dm
@@ -5,21 +5,26 @@
/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 == O_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.robotic >= ORGAN_ROBOT))
- return 0
- return 1
+
+/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 == O_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.robotic >= ORGAN_ROBOT))
+ return 0
+ return 1
+
+///////////////////////////////////////////////////////////////
+// Unscrew Hatch Surgery
+///////////////////////////////////////////////////////////////
/datum/surgery_step/robotics/unscrew_hatch
allowed_tools = list(
@@ -32,27 +37,31 @@
min_duration = 90
max_duration = 110
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if(..())
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- return affected && affected.open == 0 && target_zone != O_MOUTH
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+/datum/surgery_step/robotics/unscrew_hatch/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if(..())
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] starts to unscrew the maintenance hatch on [target]'s [affected.name] with \the [tool].", \
- "You start to unscrew the maintenance hatch on [target]'s [affected.name] with \the [tool].")
- ..()
+ return affected && affected.open == 0 && target_zone != O_MOUTH
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] has opened the maintenance hatch on [target]'s [affected.name] with \the [tool].", \
- "You have opened the maintenance hatch on [target]'s [affected.name] with \the [tool].",)
- affected.open = 1
+/datum/surgery_step/robotics/unscrew_hatch/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] starts to unscrew the maintenance hatch on [target]'s [affected.name] with \the [tool].", \
+ "You start to unscrew the maintenance hatch on [target]'s [affected.name] with \the [tool].")
+ ..()
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user]'s [tool.name] slips, failing to unscrew [target]'s [affected.name].", \
- "Your [tool] slips, failing to unscrew [target]'s [affected.name].")
+/datum/surgery_step/robotics/unscrew_hatch/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] has opened the maintenance hatch on [target]'s [affected.name] with \the [tool].", \
+ "You have opened the maintenance hatch on [target]'s [affected.name] with \the [tool].",)
+ affected.open = 1
+
+/datum/surgery_step/robotics/unscrew_hatch/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user]'s [tool.name] slips, failing to unscrew [target]'s [affected.name].", \
+ "Your [tool] slips, failing to unscrew [target]'s [affected.name].")
+
+///////////////////////////////////////////////////////////////
+// Open Hatch Surgery
+///////////////////////////////////////////////////////////////
/datum/surgery_step/robotics/open_hatch
allowed_tools = list(
@@ -64,27 +73,31 @@
min_duration = 30
max_duration = 40
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if(..())
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- return affected && affected.open == 1
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+/datum/surgery_step/robotics/open_hatch/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if(..())
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] starts to pry open the maintenance hatch on [target]'s [affected.name] with \the [tool].",
- "You start to pry open the maintenance hatch on [target]'s [affected.name] with \the [tool].")
- ..()
+ return affected && affected.open == 1
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] opens the maintenance hatch on [target]'s [affected.name] with \the [tool].", \
- "You open the maintenance hatch on [target]'s [affected.name] with \the [tool].")
- affected.open = 3
+/datum/surgery_step/robotics/open_hatch/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] starts to pry open the maintenance hatch on [target]'s [affected.name] with \the [tool].",
+ "You start to pry open the maintenance hatch on [target]'s [affected.name] with \the [tool].")
+ ..()
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user]'s [tool.name] slips, failing to open the hatch on [target]'s [affected.name].",
- "Your [tool] slips, failing to open the hatch on [target]'s [affected.name].")
+/datum/surgery_step/robotics/open_hatch/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] opens the maintenance hatch on [target]'s [affected.name] with \the [tool].", \
+ "You open the maintenance hatch on [target]'s [affected.name] with \the [tool].")
+ affected.open = 3
+
+/datum/surgery_step/robotics/open_hatch/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user]'s [tool.name] slips, failing to open the hatch on [target]'s [affected.name].",
+ "Your [tool] slips, failing to open the hatch on [target]'s [affected.name].")
+
+///////////////////////////////////////////////////////////////
+// Close Hatch Surgery
+///////////////////////////////////////////////////////////////
/datum/surgery_step/robotics/close_hatch
allowed_tools = list(
@@ -96,28 +109,32 @@
min_duration = 70
max_duration = 100
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if(..())
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- return affected && affected.open && target_zone != O_MOUTH
-
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+/datum/surgery_step/robotics/close_hatch/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if(..())
var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] begins to close and secure the hatch on [target]'s [affected.name] with \the [tool]." , \
- "You begin to close and secure the hatch on [target]'s [affected.name] with \the [tool].")
- ..()
+ return affected && affected.open && target_zone != O_MOUTH
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] closes and secures the hatch on [target]'s [affected.name] with \the [tool].", \
- "You close and secure the hatch on [target]'s [affected.name] with \the [tool].")
- affected.open = 0
- affected.germ_level = 0
+/datum/surgery_step/robotics/close_hatch/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] begins to close and secure the hatch on [target]'s [affected.name] with \the [tool]." , \
+ "You begin to close and secure the hatch on [target]'s [affected.name] with \the [tool].")
+ ..()
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user]'s [tool.name] slips, failing to close the hatch on [target]'s [affected.name].",
- "Your [tool.name] slips, failing to close the hatch on [target]'s [affected.name].")
+/datum/surgery_step/robotics/close_hatch/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] closes and secures the hatch on [target]'s [affected.name] with \the [tool].", \
+ "You close and secure the hatch on [target]'s [affected.name] with \the [tool].")
+ affected.open = 0
+ affected.germ_level = 0
+
+/datum/surgery_step/robotics/close_hatch/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user]'s [tool.name] slips, failing to close the hatch on [target]'s [affected.name].",
+ "Your [tool.name] slips, failing to close the hatch on [target]'s [affected.name].")
+
+///////////////////////////////////////////////////////////////
+// Brute Repair Surgery
+///////////////////////////////////////////////////////////////
/datum/surgery_step/robotics/repair_brute
allowed_tools = list(
@@ -128,32 +145,37 @@
min_duration = 50
max_duration = 60
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if(..())
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if(istype(tool,/obj/item/weapon/weldingtool))
- var/obj/item/weapon/weldingtool/welder = tool
- if(!welder.isOn() || !welder.remove_fuel(1,user))
- return 0
- return affected && affected.open == 3 && (affected.disfigured || affected.brute_dam > 0) && target_zone != O_MOUTH
+/datum/surgery_step/robotics/repair_brute/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if(..())
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(istype(tool,/obj/item/weapon/weldingtool))
+ var/obj/item/weapon/weldingtool/welder = tool
+ if(!welder.isOn() || !welder.remove_fuel(1,user))
+ return 0
+ return affected && affected.open == 3 && (affected.disfigured || affected.brute_dam > 0) && target_zone != O_MOUTH
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] begins to patch damage to [target]'s [affected.name]'s support structure with \the [tool]." , \
- "You begin to patch damage to [target]'s [affected.name]'s support structure with \the [tool].")
- ..()
+/datum/surgery_step/robotics/repair_brute/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] begins to patch damage to [target]'s [affected.name]'s support structure with \the [tool]." , \
+ "You begin to patch damage to [target]'s [affected.name]'s support structure with \the [tool].")
+ ..()
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] finishes patching damage to [target]'s [affected.name] with \the [tool].", \
- "You finish patching damage to [target]'s [affected.name] with \the [tool].")
- affected.heal_damage(rand(30,50),0,1,1)
- affected.disfigured = 0
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user]'s [tool.name] slips, damaging the internal structure of [target]'s [affected.name].",
- "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_brute/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] finishes patching damage to [target]'s [affected.name] with \the [tool].", \
+ "You finish patching damage to [target]'s [affected.name] with \the [tool].")
+ affected.heal_damage(rand(30,50),0,1,1)
+ affected.disfigured = 0
+
+/datum/surgery_step/robotics/repair_brute/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user]'s [tool.name] slips, damaging the internal structure of [target]'s [affected.name].",
+ "Your [tool.name] slips, damaging the internal structure of [target]'s [affected.name].")
+ target.apply_damage(rand(5,10), BURN, affected)
+
+///////////////////////////////////////////////////////////////
+// Burn Repair Surgery
+///////////////////////////////////////////////////////////////
/datum/surgery_step/robotics/repair_burn
allowed_tools = list(
@@ -163,41 +185,45 @@
min_duration = 50
max_duration = 60
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- if(..())
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if(istype(tool,/obj/item/stack/cable_coil/))
- var/obj/item/stack/cable_coil/C = tool
- if(affected.burn_dam == 0)
- to_chat(user, "There are no burnt wires here!")
+/datum/surgery_step/robotics/repair_burn/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if(..())
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(istype(tool,/obj/item/stack/cable_coil/))
+ var/obj/item/stack/cable_coil/C = tool
+ if(affected.burn_dam == 0)
+ to_chat(user, "There are no burnt wires here!")
+ return SURGERY_FAILURE
+ else
+ if(!C.can_use(5))
+ to_chat(user, "You need at least five cable pieces to repair this part.") //usage amount made more consistent with regular cable repair
return SURGERY_FAILURE
else
- if(!C.can_use(5))
- to_chat(user, "You need at least five cable pieces to repair this part.") //usage amount made more consistent with regular cable repair
- return SURGERY_FAILURE
- else
- C.use(5)
+ C.use(5)
- return affected && affected.open == 3 && (affected.disfigured || affected.burn_dam > 0) && target_zone != O_MOUTH
+ return affected && affected.open == 3 && (affected.disfigured || affected.burn_dam > 0) && target_zone != O_MOUTH
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] begins to splice new cabling into [target]'s [affected.name]." , \
- "You begin to splice new cabling into [target]'s [affected.name].")
- ..()
+/datum/surgery_step/robotics/repair_burn/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] begins to splice new cabling into [target]'s [affected.name]." , \
+ "You begin to splice new cabling into [target]'s [affected.name].")
+ ..()
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] finishes splicing cable into [target]'s [affected.name].", \
- "You finishes splicing new cable into [target]'s [affected.name].")
- affected.heal_damage(0,rand(30,50),1,1)
- affected.disfigured = 0
+/datum/surgery_step/robotics/repair_burn/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] finishes splicing cable into [target]'s [affected.name].", \
+ "You finishes splicing new cable into [target]'s [affected.name].")
+ affected.heal_damage(0,rand(30,50),1,1)
+ affected.disfigured = 0
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] causes a short circuit in [target]'s [affected.name]!",
- "You cause a short circuit in [target]'s [affected.name]!")
- target.apply_damage(rand(5,10), BURN, affected)
+/datum/surgery_step/robotics/repair_burn/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] causes a short circuit in [target]'s [affected.name]!",
+ "You cause a short circuit in [target]'s [affected.name]!")
+ target.apply_damage(rand(5,10), BURN, affected)
+
+///////////////////////////////////////////////////////////////
+// Robot Organ Surgery
+///////////////////////////////////////////////////////////////
/datum/surgery_step/robotics/fix_organ_robotic //For artificial organs
allowed_tools = list(
@@ -209,65 +235,64 @@
min_duration = 70
max_duration = 90
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+/datum/surgery_step/robotics/fix_organ_robotic/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (!hasorgans(target))
+ return
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(!affected) return
+ var/is_organ_damaged = 0
+ for(var/obj/item/organ/I in affected.internal_organs)
+ if(I.damage > 0 && (I.robotic >= ORGAN_ROBOT))
+ is_organ_damaged = 1
+ break
+ return affected.open == 3 && is_organ_damaged
- if (!hasorgans(target))
- return
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if(!affected) return
- var/is_organ_damaged = 0
- for(var/obj/item/organ/I in affected.internal_organs)
- if(I.damage > 0 && (I.robotic >= ORGAN_ROBOT))
- is_organ_damaged = 1
- break
- return affected.open == 3 && is_organ_damaged
+/datum/surgery_step/robotics/fix_organ_robotic/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (!hasorgans(target))
+ return
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ for(var/obj/item/organ/I in affected.internal_organs)
+ if(I && I.damage > 0)
+ if(I.robotic >= ORGAN_ROBOT)
+ user.visible_message("[user] starts mending the damage to [target]'s [I.name]'s mechanisms.", \
+ "You start mending the damage to [target]'s [I.name]'s mechanisms." )
- if (!hasorgans(target))
- return
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ target.custom_pain("The pain in your [affected.name] is living hell!",1)
+ ..()
- for(var/obj/item/organ/I in affected.internal_organs)
- if(I && I.damage > 0)
- if(I.robotic >= ORGAN_ROBOT)
- user.visible_message("[user] starts mending the damage to [target]'s [I.name]'s mechanisms.", \
- "You start mending the damage to [target]'s [I.name]'s mechanisms." )
+/datum/surgery_step/robotics/fix_organ_robotic/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (!hasorgans(target))
+ return
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
- target.custom_pain("The pain in your [affected.name] is living hell!",1)
- ..()
+ for(var/obj/item/organ/I in affected.internal_organs)
+ if(I && I.damage > 0)
+ if(I.robotic >= ORGAN_ROBOT)
+ user.visible_message("[user] repairs [target]'s [I.name] with [tool].", \
+ "You repair [target]'s [I.name] with [tool]." )
+ I.damage = 0
+ if(I.organ_tag == O_EYES)
+ target.sdisabilities &= ~BLIND
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+/datum/surgery_step/robotics/fix_organ_robotic/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if (!hasorgans(target))
+ return
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if (!hasorgans(target))
- return
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user]'s hand slips, gumming up the mechanisms inside of [target]'s [affected.name] with \the [tool]!", \
+ "Your hand slips, gumming up the mechanisms inside of [target]'s [affected.name] with \the [tool]!")
- for(var/obj/item/organ/I in affected.internal_organs)
+ target.adjustToxLoss(5)
+ affected.createwound(CUT, 5)
- if(I && I.damage > 0)
- if(I.robotic >= ORGAN_ROBOT)
- user.visible_message("[user] repairs [target]'s [I.name] with [tool].", \
- "You repair [target]'s [I.name] with [tool]." )
- I.damage = 0
- if(I.organ_tag == O_EYES)
- target.sdisabilities &= ~BLIND
+ for(var/obj/item/organ/I in affected.internal_organs)
+ if(I)
+ I.take_damage(rand(3,5),0)
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
-
- if (!hasorgans(target))
- return
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
-
- user.visible_message("[user]'s hand slips, gumming up the mechanisms inside of [target]'s [affected.name] with \the [tool]!", \
- "Your hand slips, gumming up the mechanisms inside of [target]'s [affected.name] with \the [tool]!")
-
- target.adjustToxLoss(5)
- affected.createwound(CUT, 5)
-
- for(var/obj/item/organ/I in affected.internal_organs)
- if(I)
- I.take_damage(rand(3,5),0)
+///////////////////////////////////////////////////////////////
+// Robot Organ Detaching Surgery
+///////////////////////////////////////////////////////////////
/datum/surgery_step/robotics/detatch_organ_robotic
@@ -278,46 +303,49 @@
min_duration = 90
max_duration = 110
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+/datum/surgery_step/robotics/detatch_organ_robotic/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(!(affected && (affected.robotic >= ORGAN_ROBOT)))
+ return 0
+ if(affected.open < 3)
+ return 0
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if(!(affected && (affected.robotic >= ORGAN_ROBOT)))
- return 0
- if(affected.open < 3)
- return 0
+ target.op_stage.current_organ = null
- target.op_stage.current_organ = null
+ var/list/attached_organs = list()
+ for(var/organ in target.internal_organs_by_name)
+ var/obj/item/organ/I = target.internal_organs_by_name[organ]
+ if(I && !(I.status & ORGAN_CUT_AWAY) && I.parent_organ == target_zone)
+ attached_organs |= organ
- var/list/attached_organs = list()
- for(var/organ in target.internal_organs_by_name)
- var/obj/item/organ/I = target.internal_organs_by_name[organ]
- if(I && !(I.status & ORGAN_CUT_AWAY) && I.parent_organ == target_zone)
- attached_organs |= organ
+ var/organ_to_remove = input(user, "Which organ do you want to prepare for removal?") as null|anything in attached_organs
+ if(!organ_to_remove)
+ return 0
- var/organ_to_remove = input(user, "Which organ do you want to prepare for removal?") as null|anything in attached_organs
- if(!organ_to_remove)
- return 0
+ target.op_stage.current_organ = organ_to_remove
- target.op_stage.current_organ = organ_to_remove
+ return ..() && organ_to_remove
- return ..() && organ_to_remove
+/datum/surgery_step/robotics/detatch_organ_robotic/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] starts to decouple [target]'s [target.op_stage.current_organ] with \the [tool].", \
+ "You start to decouple [target]'s [target.op_stage.current_organ] with \the [tool]." )
+ ..()
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] starts to decouple [target]'s [target.op_stage.current_organ] with \the [tool].", \
- "You start to decouple [target]'s [target.op_stage.current_organ] with \the [tool]." )
- ..()
+/datum/surgery_step/robotics/detatch_organ_robotic/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] has decoupled [target]'s [target.op_stage.current_organ] with \the [tool]." , \
+ "You have decoupled [target]'s [target.op_stage.current_organ] with \the [tool].")
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] has decoupled [target]'s [target.op_stage.current_organ] with \the [tool]." , \
- "You have decoupled [target]'s [target.op_stage.current_organ] with \the [tool].")
+ var/obj/item/organ/internal/I = target.internal_organs_by_name[target.op_stage.current_organ]
+ if(I && istype(I))
+ I.status |= ORGAN_CUT_AWAY
- var/obj/item/organ/internal/I = target.internal_organs_by_name[target.op_stage.current_organ]
- if(I && istype(I))
- I.status |= ORGAN_CUT_AWAY
+/datum/surgery_step/robotics/detatch_organ_robotic/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user]'s hand slips, disconnecting \the [tool].", \
+ "Your hand slips, disconnecting \the [tool].")
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user]'s hand slips, disconnecting \the [tool].", \
- "Your hand slips, disconnecting \the [tool].")
+///////////////////////////////////////////////////////////////
+// Robot Organ Attaching Surgery
+///////////////////////////////////////////////////////////////
/datum/surgery_step/robotics/attach_organ_robotic
allowed_tools = list(
@@ -327,45 +355,48 @@
min_duration = 100
max_duration = 120
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+/datum/surgery_step/robotics/attach_organ_robotic/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(!(affected && (affected.robotic >= ORGAN_ROBOT)))
+ return 0
+ if(affected.open < 3)
+ return 0
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if(!(affected && (affected.robotic >= ORGAN_ROBOT)))
- return 0
- if(affected.open < 3)
- return 0
+ target.op_stage.current_organ = null
- target.op_stage.current_organ = null
+ var/list/removable_organs = list()
+ for(var/organ in target.internal_organs_by_name)
+ var/obj/item/organ/I = target.internal_organs_by_name[organ]
+ if(I && (I.status & ORGAN_CUT_AWAY) && (I.robotic >= ORGAN_ROBOT) && I.parent_organ == target_zone)
+ removable_organs |= organ
- var/list/removable_organs = list()
- for(var/organ in target.internal_organs_by_name)
- var/obj/item/organ/I = target.internal_organs_by_name[organ]
- if(I && (I.status & ORGAN_CUT_AWAY) && (I.robotic >= ORGAN_ROBOT) && I.parent_organ == target_zone)
- removable_organs |= organ
+ var/organ_to_replace = input(user, "Which organ do you want to reattach?") as null|anything in removable_organs
+ if(!organ_to_replace)
+ return 0
- var/organ_to_replace = input(user, "Which organ do you want to reattach?") as null|anything in removable_organs
- if(!organ_to_replace)
- return 0
+ target.op_stage.current_organ = organ_to_replace
+ return ..()
- target.op_stage.current_organ = organ_to_replace
- return ..()
+/datum/surgery_step/robotics/attach_organ_robotic/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] begins reattaching [target]'s [target.op_stage.current_organ] with \the [tool].", \
+ "You start reattaching [target]'s [target.op_stage.current_organ] with \the [tool].")
+ ..()
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] begins reattaching [target]'s [target.op_stage.current_organ] with \the [tool].", \
- "You start reattaching [target]'s [target.op_stage.current_organ] with \the [tool].")
- ..()
+/datum/surgery_step/robotics/attach_organ_robotic/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user] has reattached [target]'s [target.op_stage.current_organ] with \the [tool]." , \
+ "You have reattached [target]'s [target.op_stage.current_organ] with \the [tool].")
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user] has reattached [target]'s [target.op_stage.current_organ] with \the [tool]." , \
- "You have reattached [target]'s [target.op_stage.current_organ] with \the [tool].")
+ var/obj/item/organ/I = target.internal_organs_by_name[target.op_stage.current_organ]
+ if(I && istype(I))
+ I.status &= ~ORGAN_CUT_AWAY
- var/obj/item/organ/I = target.internal_organs_by_name[target.op_stage.current_organ]
- if(I && istype(I))
- I.status &= ~ORGAN_CUT_AWAY
+/datum/surgery_step/robotics/attach_organ_robotic/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user]'s hand slips, disconnecting \the [tool].", \
+ "Your hand slips, disconnecting \the [tool].")
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user]'s hand slips, disconnecting \the [tool].", \
- "Your hand slips, disconnecting \the [tool].")
+///////////////////////////////////////////////////////////////
+// MMI Insertion Surgery
+///////////////////////////////////////////////////////////////
/datum/surgery_step/robotics/install_mmi
allowed_tools = list(
@@ -375,74 +406,73 @@
min_duration = 60
max_duration = 80
- can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+/datum/surgery_step/robotics/install_mmi/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ if(target_zone != BP_HEAD)
+ return
- if(target_zone != BP_HEAD)
- return
+ var/obj/item/device/mmi/M = tool
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(!(affected && affected.open == 3))
+ return 0
- var/obj/item/device/mmi/M = tool
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- if(!(affected && affected.open == 3))
- return 0
+ if(!istype(M))
+ return 0
- if(!istype(M))
- return 0
+ if(!M.brainmob || !M.brainmob.client || !M.brainmob.ckey || M.brainmob.stat >= DEAD)
+ user << "That brain is not usable."
+ return SURGERY_FAILURE
- if(!M.brainmob || !M.brainmob.client || !M.brainmob.ckey || M.brainmob.stat >= DEAD)
- user << "That brain is not usable."
- return SURGERY_FAILURE
+ if(!(affected.robotic >= ORGAN_ROBOT))
+ user << "You cannot install a computer brain into a meat skull."
+ return SURGERY_FAILURE
- if(!(affected.robotic >= ORGAN_ROBOT))
- user << "You cannot install a computer brain into a meat skull."
- return SURGERY_FAILURE
+ if(!target.should_have_organ("brain"))
+ user << "You're pretty sure [target.species.name_plural] don't normally have a brain."
+ return SURGERY_FAILURE
- if(!target.should_have_organ("brain"))
- user << "You're pretty sure [target.species.name_plural] don't normally have a brain."
- return SURGERY_FAILURE
+ if(!isnull(target.internal_organs["brain"]))
+ user << "Your subject already has a brain."
+ return SURGERY_FAILURE
- if(!isnull(target.internal_organs["brain"]))
- user << "Your subject already has a brain."
- return SURGERY_FAILURE
+ return 1
- return 1
+/datum/surgery_step/robotics/install_mmi/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] starts installing \the [tool] into [target]'s [affected.name].", \
+ "You start installing \the [tool] into [target]'s [affected.name].")
+ ..()
- begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] starts installing \the [tool] into [target]'s [affected.name].", \
- "You start installing \the [tool] into [target]'s [affected.name].")
- ..()
+/datum/surgery_step/robotics/install_mmi/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ user.visible_message("[user] has installed \the [tool] into [target]'s [affected.name].", \
+ "You have installed \the [tool] into [target]'s [affected.name].")
- end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- var/obj/item/organ/external/affected = target.get_organ(target_zone)
- user.visible_message("[user] has installed \the [tool] into [target]'s [affected.name].", \
- "You have installed \the [tool] into [target]'s [affected.name].")
+ var/obj/item/device/mmi/M = tool
+ var/obj/item/organ/internal/mmi_holder/holder = new(target, 1)
+ target.internal_organs_by_name["brain"] = holder
+ user.drop_from_inventory(tool)
+ tool.loc = holder
+ holder.stored_mmi = tool
+ holder.update_from_mmi()
- var/obj/item/device/mmi/M = tool
- var/obj/item/organ/internal/mmi_holder/holder = new(target, 1)
- target.internal_organs_by_name["brain"] = holder
- user.drop_from_inventory(tool)
- tool.loc = holder
- holder.stored_mmi = tool
- holder.update_from_mmi()
+ if(M.brainmob && M.brainmob.mind)
+ M.brainmob.mind.transfer_to(target)
+ target.languages = M.brainmob.languages
- if(M.brainmob && M.brainmob.mind)
- M.brainmob.mind.transfer_to(target)
- target.languages = M.brainmob.languages
+ spawn(0) //Name yourself on your own damn time
+ var/new_name = ""
+ while(!new_name)
+ if(!target) return
+ var/try_name = input(target,"Pick a name for your new form!", "New Name", target.name)
+ var/clean_name = sanitizeName(try_name)
+ if(clean_name)
+ var/okay = alert(target,"New name will be '[clean_name]', ok?", "Cancel", "Ok")
+ if(okay == "Ok")
+ new_name = clean_name
- spawn(0) //Name yourself on your own damn time
- var/new_name = ""
- while(!new_name)
- if(!target) return
- var/try_name = input(target,"Pick a name for your new form!", "New Name", target.name)
- var/clean_name = sanitizeName(try_name)
- if(clean_name)
- var/okay = alert(target,"New name will be '[clean_name]', ok?", "Cancel", "Ok")
- if(okay == "Ok")
- new_name = clean_name
+ target.name = new_name
+ target.real_name = target.name
- target.name = new_name
- target.real_name = target.name
-
- fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
- user.visible_message("[user]'s hand slips.", \
- "Your hand slips.")
+/datum/surgery_step/robotics/install_mmi/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
+ user.visible_message("[user]'s hand slips.", \
+ "Your hand slips.")
diff --git a/code/modules/surgery/slimes.dm b/code/modules/surgery/slimes.dm
index 256f4d377f..7cb5e4acfc 100644
--- a/code/modules/surgery/slimes.dm
+++ b/code/modules/surgery/slimes.dm
@@ -6,8 +6,10 @@
is_valid_target(mob/living/simple_animal/slime/target)
return istype(target, /mob/living/simple_animal/slime/)
- can_use(mob/living/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool)
- return target.stat == 2
+/datum/surgery_step/slime/can_use(mob/living/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool)
+ return target.stat == 2
+
+
/datum/surgery_step/slime/cut_flesh
allowed_tools = list(
@@ -19,21 +21,23 @@
min_duration = 30
max_duration = 50
- can_use(mob/living/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool)
- return ..() && istype(target) && target.core_removal_stage == 0
+/datum/surgery_step/slime/cut_flesh/can_use(mob/living/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool)
+ return ..() && istype(target) && target.core_removal_stage == 0
- begin_step(mob/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool)
- user.visible_message("[user] starts cutting through [target]'s flesh with \the [tool].", \
- "You start cutting through [target]'s flesh with \the [tool].")
+/datum/surgery_step/slime/cut_flesh/begin_step(mob/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool)
+ user.visible_message("[user] starts cutting through [target]'s flesh with \the [tool].", \
+ "You start cutting through [target]'s flesh with \the [tool].")
+
+/datum/surgery_step/slime/cut_flesh/end_step(mob/living/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool)
+ user.visible_message("[user] cuts through [target]'s flesh with \the [tool].", \
+ "You cut through [target]'s flesh with \the [tool], revealing its silky innards.")
+ target.core_removal_stage = 1
+
+/datum/surgery_step/slime/cut_flesh/fail_step(mob/living/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool)
+ user.visible_message("[user]'s hand slips, tearing [target]'s flesh with \the [tool]!", \
+ "Your hand slips, tearing [target]'s flesh with \the [tool]!")
- end_step(mob/living/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool)
- user.visible_message("[user] cuts through [target]'s flesh with \the [tool].", \
- "You cut through [target]'s flesh with \the [tool], revealing its silky innards.")
- target.core_removal_stage = 1
- fail_step(mob/living/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool)
- user.visible_message("[user]'s hand slips, tearing [target]'s flesh with \the [tool]!", \
- "Your hand slips, tearing [target]'s flesh with \the [tool]!")
/datum/surgery_step/slime/cut_innards
allowed_tools = list(
@@ -45,21 +49,23 @@
min_duration = 30
max_duration = 50
- can_use(mob/living/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool)
- return ..() && istype(target) && target.core_removal_stage == 1
+/datum/surgery_step/slime/cut_innards/can_use(mob/living/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool)
+ return ..() && istype(target) && target.core_removal_stage == 1
- begin_step(mob/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool)
- user.visible_message("[user] starts cutting [target]'s silky innards apart with \the [tool].", \
- "You start cutting [target]'s silky innards apart with \the [tool].")
+/datum/surgery_step/slime/cut_innards/begin_step(mob/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool)
+ user.visible_message("[user] starts cutting [target]'s silky innards apart with \the [tool].", \
+ "You start cutting [target]'s silky innards apart with \the [tool].")
+
+/datum/surgery_step/slime/cut_innards/end_step(mob/living/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool)
+ user.visible_message("[user] cuts [target]'s innards apart with \the [tool], exposing the cores.", \
+ "You cut [target]'s innards apart with \the [tool], exposing the cores.")
+ target.core_removal_stage = 2
+
+/datum/surgery_step/slime/cut_innards/fail_step(mob/living/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool)
+ user.visible_message("[user]'s hand slips, tearing [target]'s innards with \the [tool]!", \
+ "Your hand slips, tearing [target]'s innards with \the [tool]!")
- end_step(mob/living/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool)
- user.visible_message("[user] cuts [target]'s innards apart with \the [tool], exposing the cores.", \
- "You cut [target]'s innards apart with \the [tool], exposing the cores.")
- target.core_removal_stage = 2
- fail_step(mob/living/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool)
- user.visible_message("[user]'s hand slips, tearing [target]'s innards with \the [tool]!", \
- "Your hand slips, tearing [target]'s innards with \the [tool]!")
/datum/surgery_step/slime/saw_core
allowed_tools = list(
@@ -70,24 +76,24 @@
min_duration = 50
max_duration = 70
- can_use(mob/living/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool)
- return ..() && (istype(target) && target.core_removal_stage == 2 && target.cores > 0) //This is being passed a human as target, unsure why.
+/datum/surgery_step/slime/saw_core/can_use(mob/living/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool)
+ return ..() && (istype(target) && target.core_removal_stage == 2 && target.cores > 0) //This is being passed a human as target, unsure why.
- begin_step(mob/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool)
- user.visible_message("[user] starts cutting out one of [target]'s cores with \the [tool].", \
- "You start cutting out one of [target]'s cores with \the [tool].")
+/datum/surgery_step/slime/saw_core/begin_step(mob/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool)
+ user.visible_message("[user] starts cutting out one of [target]'s cores with \the [tool].", \
+ "You start cutting out one of [target]'s cores with \the [tool].")
- end_step(mob/living/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool)
- target.cores--
- user.visible_message("[user] cuts out one of [target]'s cores with \the [tool].",, \
- "You cut out one of [target]'s cores with \the [tool]. [target.cores] cores left.")
+/datum/surgery_step/slime/saw_core/end_step(mob/living/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool)
+ target.cores--
+ user.visible_message("[user] cuts out one of [target]'s cores with \the [tool].",, \
+ "You cut out one of [target]'s cores with \the [tool]. [target.cores] cores left.")
- if(target.cores >= 0)
- new target.coretype(target.loc)
- if(target.cores <= 0)
- target.icon_state = "slime extracted"
+ if(target.cores >= 0)
+ new target.coretype(target.loc)
+ if(target.cores <= 0)
+ target.icon_state = "slime extracted"
- fail_step(mob/living/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool)
- user.visible_message("[user]'s hand slips, causing \him to miss the core!", \
- "Your hand slips, causing you to miss the core!")
\ No newline at end of file
+/datum/surgery_step/slime/saw_core/fail_step(mob/living/user, mob/living/simple_animal/slime/target, target_zone, obj/item/tool)
+ user.visible_message("[user]'s hand slips, causing \him to miss the core!", \
+ "Your hand slips, causing you to miss the core!")
\ No newline at end of file