diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm
index 24c897ff5ce..17bcb32fe71 100644
--- a/code/game/machinery/computer/Operating.dm
+++ b/code/game/machinery/computer/Operating.dm
@@ -61,6 +61,14 @@
for(var/datum/surgery/procedure in patient.surgeries)
dat += "[capitalize(procedure.name)]
"
var/datum/surgery_step/surgery_step = procedure.get_surgery_step()
- dat += "Next step: [capitalize(surgery_step.name)]
"
+ dat += "Next step: [capitalize(surgery_step.name)]"
+ if(surgery_step.repeatable)
+ dat += " or "
+ var/datum/surgery_step/next_step = procedure.get_surgery_next_step()
+ if(next_step)
+ dat += "[capitalize(next_step.name)]"
+ else
+ dat += "finish operation" // Current step is repeatable, but there is no next step. Try to finish it with cautery.
+ dat += "
"
dat += ""
return dat
diff --git a/code/modules/surgery/amputation.dm b/code/modules/surgery/amputation.dm
index 7684484a42d..0f8003b9b46 100644
--- a/code/modules/surgery/amputation.dm
+++ b/code/modules/surgery/amputation.dm
@@ -4,7 +4,7 @@
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/sever_limb)
species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
possible_locs = list("r_arm", "l_arm", "l_leg", "r_leg", "head")
- requires_organic_bodypart = 0
+ requires_bodypart_type = 0
/datum/surgery_step/sever_limb
diff --git a/code/modules/surgery/eye_surgery.dm b/code/modules/surgery/eye_surgery.dm
index 66da14f617a..41ca8a194e0 100644
--- a/code/modules/surgery/eye_surgery.dm
+++ b/code/modules/surgery/eye_surgery.dm
@@ -3,7 +3,7 @@
steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/fix_eyes, /datum/surgery_step/close)
species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
possible_locs = list("eyes")
- requires_organic_bodypart = 0
+ requires_bodypart_type = 0
//fix eyes
/datum/surgery_step/fix_eyes
diff --git a/code/modules/surgery/helpers.dm b/code/modules/surgery/helpers.dm
index f2aa5f5a090..2f3d3c55ce7 100644
--- a/code/modules/surgery/helpers.dm
+++ b/code/modules/surgery/helpers.dm
@@ -29,7 +29,7 @@
if(affecting)
if(!S.requires_bodypart)
continue
- if(S.requires_organic_bodypart && affecting.status == BODYPART_ROBOTIC)
+ if(S.requires_bodypart_type && affecting.status != S.requires_bodypart_type)
continue
if(S.requires_real_bodypart && affecting.is_pseudopart)
continue
@@ -56,7 +56,7 @@
if(affecting)
if(!S.requires_bodypart)
return
- if(S.requires_organic_bodypart && affecting.status == BODYPART_ROBOTIC)
+ if(S.requires_bodypart_type && affecting.status != S.requires_bodypart_type)
return
else if(C && S.requires_bodypart)
return
@@ -72,19 +72,30 @@
else
to_chat(user, "You need to expose [M]'s [parse_zone(selected_zone)] first!")
+ // so hardcoded, we need to do something with it
else if(!current_surgery.step_in_progress)
if(current_surgery.status == 1)
M.surgeries -= current_surgery
user.visible_message("[user] removes the drapes from [M]'s [parse_zone(selected_zone)].", \
"You remove the drapes from [M]'s [parse_zone(selected_zone)].")
qdel(current_surgery)
- else if(istype(user.get_inactive_held_item(), /obj/item/cautery) && current_surgery.can_cancel)
- M.surgeries -= current_surgery
- user.visible_message("[user] mends the incision and removes the drapes from [M]'s [parse_zone(selected_zone)].", \
- "You mend the incision and remove the drapes from [M]'s [parse_zone(selected_zone)].")
- qdel(current_surgery)
else if(current_surgery.can_cancel)
- to_chat(user, "You need to hold a cautery in inactive hand to stop [M]'s surgery!")
+ if(current_surgery.requires_bodypart_type == BODYPART_ORGANIC)
+ if(istype(user.get_inactive_held_item(), /obj/item/cautery))
+ M.surgeries -= current_surgery
+ user.visible_message("[user] mends the incision and removes the drapes from [M]'s [parse_zone(selected_zone)].", \
+ "You mend the incision and remove the drapes from [M]'s [parse_zone(selected_zone)].")
+ qdel(current_surgery)
+ else
+ to_chat(user, "You need to hold a cautery in inactive hand to stop [M]'s surgery!")
+ else if(current_surgery.requires_bodypart_type == BODYPART_ROBOTIC)
+ if(istype(user.get_inactive_held_item(), /obj/item/screwdriver))
+ M.surgeries -= current_surgery
+ user.visible_message("[user] screw the shell and removes the drapes from [M]'s [parse_zone(selected_zone)].", \
+ "You screw the shell and remove the drapes from [M]'s [parse_zone(selected_zone)].")
+ qdel(current_surgery)
+ else
+ to_chat(user, "You need to hold a screwdriver in inactive hand to stop [M]'s surgery!")
return 1
diff --git a/code/modules/surgery/implant_removal.dm b/code/modules/surgery/implant_removal.dm
index 7d67bf37be0..d6d5ba1968d 100644
--- a/code/modules/surgery/implant_removal.dm
+++ b/code/modules/surgery/implant_removal.dm
@@ -3,7 +3,6 @@
steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/extract_implant, /datum/surgery_step/close)
species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
possible_locs = list("chest")
- requires_organic_bodypart = 0
//extract implant
@@ -43,4 +42,15 @@
else
to_chat(user, "You can't find anything in [target]'s [target_zone]!")
- return 1
\ No newline at end of file
+ return 1
+
+/datum/surgery/implant_removal/mechanic
+ name = "implant removal"
+ requires_bodypart_type = BODYPART_ROBOTIC
+ steps = list(
+ /datum/surgery_step/mechanic_open,
+ /datum/surgery_step/open_hatch,
+ /datum/surgery_step/mechanic_unwrench,
+ /datum/surgery_step/extract_implant,
+ /datum/surgery_step/mechanic_wrench,
+ /datum/surgery_step/mechanic_close)
\ No newline at end of file
diff --git a/code/modules/surgery/mechanic_steps.dm b/code/modules/surgery/mechanic_steps.dm
new file mode 100644
index 00000000000..0bdef2aac93
--- /dev/null
+++ b/code/modules/surgery/mechanic_steps.dm
@@ -0,0 +1,85 @@
+//open shell
+/datum/surgery_step/mechanic_open
+ name = "unscrew shell"
+ implements = list(
+ /obj/item/screwdriver = 100,
+ /obj/item/scalpel = 75, // med borgs could try to unskrew shell with scalpel
+ /obj/item/kitchen/knife = 50,
+ /obj/item = 10) // 10% success with any sharp item.
+ time = 24
+
+/datum/surgery_step/mechanic_open/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ user.visible_message("[user] begins to unscrew the shell of [target]'s [parse_zone(target_zone)].",
+ "You begin to unscrew the shell of [target]'s [parse_zone(target_zone)]...")
+
+/datum/surgery_step/mechanic_incise/tool_check(mob/user, obj/item/tool)
+ if(implement_type == /obj/item && !tool.is_sharp())
+ return FALSE
+
+ return TRUE
+
+//close shell
+/datum/surgery_step/mechanic_close
+ name = "screw shell"
+ implements = list(
+ /obj/item/screwdriver = 100,
+ /obj/item/scalpel = 75,
+ /obj/item/kitchen/knife = 50,
+ /obj/item = 10) // 10% success with any sharp item.
+ time = 24
+
+/datum/surgery_step/mechanic_close/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ user.visible_message("[user] begins to screw the shell of [target]'s [parse_zone(target_zone)].",
+ "You begin to screw the shell of [target]'s [parse_zone(target_zone)]...")
+
+/datum/surgery_step/mechanic_close/tool_check(mob/user, obj/item/tool)
+ if(implement_type == /obj/item && !tool.is_sharp())
+ return FALSE
+
+ return TRUE
+
+//prepare electronics
+/datum/surgery_step/prepare_electronics
+ name = "prepare electronics"
+ implements = list(
+ /obj/item/device/multitool = 100,
+ /obj/item/hemostat = 10) // try to reboot internal controllers via short circuit with some conductor
+ time = 24
+
+/datum/surgery_step/prepare_electronics/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ user.visible_message("[user] begins to prepare electronics in [target]'s [parse_zone(target_zone)].",
+ "You begin to prepare electronics in [target]'s [parse_zone(target_zone)]...")
+
+//unwrench
+/datum/surgery_step/mechanic_unwrench
+ name = "unwrench bolts"
+ implements = list(
+ /obj/item/wrench = 100,
+ /obj/item/retractor = 10)
+ time = 24
+
+/datum/surgery_step/mechanic_unwrench/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ user.visible_message("[user] begins to unwrench some bolts in [target]'s [parse_zone(target_zone)].",
+ "You begin to unwrench some bolts in [target]'s [parse_zone(target_zone)]...")
+
+//wrench
+/datum/surgery_step/mechanic_wrench
+ name = "wrench bolts"
+ implements = list(
+ /obj/item/wrench = 100,
+ /obj/item/retractor = 10)
+ time = 24
+
+/datum/surgery_step/mechanic_wrench/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ user.visible_message("[user] begins to wrench some bolts in [target]'s [parse_zone(target_zone)].",
+ "You begin to wrench some bolts in [target]'s [parse_zone(target_zone)]...")
+
+//open hatch
+/datum/surgery_step/open_hatch
+ name = "open the hatch"
+ accept_hand = 1
+ time = 10
+
+/datum/surgery_step/open_hatch/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ user.visible_message("[user] begins to open the hatch holders in [target]'s [parse_zone(target_zone)].",
+ "You begin to open the hatch holders in [target]'s [parse_zone(target_zone)]...")
\ No newline at end of file
diff --git a/code/modules/surgery/organ_manipulation.dm b/code/modules/surgery/organ_manipulation.dm
index 1fa7fee496e..a3493a03b15 100644
--- a/code/modules/surgery/organ_manipulation.dm
+++ b/code/modules/surgery/organ_manipulation.dm
@@ -1,38 +1,79 @@
/datum/surgery/organ_manipulation
name = "organ manipulation"
- steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/clamp_bleeders,
- /datum/surgery_step/incise, /datum/surgery_step/manipulate_organs)
species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
possible_locs = list("chest", "head")
- requires_organic_bodypart = FALSE
- requires_real_bodypart = TRUE
+ requires_real_bodypart = 1
+ steps = list(
+ /datum/surgery_step/incise,
+ /datum/surgery_step/retract_skin,
+ /datum/surgery_step/saw,
+ /datum/surgery_step/clamp_bleeders,
+ /datum/surgery_step/incise,
+ /datum/surgery_step/manipulate_organs,
+ //there should be bone fixing
+ /datum/surgery_step/close
+ )
/datum/surgery/organ_manipulation/soft
possible_locs = list("groin", "eyes", "mouth", "l_arm", "r_arm")
- steps = list(/datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/clamp_bleeders,
- /datum/surgery_step/incise, /datum/surgery_step/manipulate_organs)
+ steps = list(
+ /datum/surgery_step/incise,
+ /datum/surgery_step/retract_skin,
+ /datum/surgery_step/clamp_bleeders,
+ /datum/surgery_step/incise,
+ /datum/surgery_step/manipulate_organs,
+ /datum/surgery_step/close
+ )
/datum/surgery/organ_manipulation/alien
name = "alien organ manipulation"
possible_locs = list("chest", "head", "groin", "eyes", "mouth", "l_arm", "r_arm")
species = list(/mob/living/carbon/alien/humanoid)
- steps = list(/datum/surgery_step/saw, /datum/surgery_step/incise, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/manipulate_organs)
-
+ steps = list(
+ /datum/surgery_step/saw,
+ /datum/surgery_step/incise,
+ /datum/surgery_step/retract_skin,
+ /datum/surgery_step/saw,
+ /datum/surgery_step/manipulate_organs,
+ /datum/surgery_step/close
+ )
+/datum/surgery/organ_manipulation/mechanic
+ name = "prosthesis organ manipulation"
+ possible_locs = list("chest", "head")
+ requires_bodypart_type = BODYPART_ROBOTIC
+ steps = list(
+ /datum/surgery_step/mechanic_open,
+ /datum/surgery_step/open_hatch,
+ /datum/surgery_step/mechanic_unwrench,
+ /datum/surgery_step/prepare_electronics,
+ /datum/surgery_step/manipulate_organs,
+ /datum/surgery_step/mechanic_wrench,
+ /datum/surgery_step/mechanic_close
+ )
+/datum/surgery/organ_manipulation/mechanic/soft
+ possible_locs = list("groin", "eyes", "mouth", "l_arm", "r_arm")
+ steps = list(
+ /datum/surgery_step/mechanic_open,
+ /datum/surgery_step/open_hatch,
+ /datum/surgery_step/prepare_electronics,
+ /datum/surgery_step/manipulate_organs,
+ /datum/surgery_step/mechanic_close
+ )
/datum/surgery_step/manipulate_organs
time = 64
name = "manipulate organs"
+ repeatable = 1
implements = list(/obj/item/organ = 100, /obj/item/reagent_containers/food/snacks/organ = 0, /obj/item/organ_storage = 100)
var/implements_extract = list(/obj/item/hemostat = 100, /obj/item/crowbar = 55)
- var/implements_mend = list(/obj/item/cautery = 100, /obj/item/weldingtool = 70, /obj/item/lighter = 45, /obj/item/match = 20)
var/current_type
var/obj/item/organ/I = null
/datum/surgery_step/manipulate_organs/New()
..()
- implements = implements + implements_extract + implements_mend
+ implements = implements + implements_extract
/datum/surgery_step/manipulate_organs/tool_check(mob/user, obj/item/tool)
if(istype(tool, /obj/item/weldingtool))
@@ -96,23 +137,12 @@
else
return -1
- else if(implement_type in implements_mend)
- current_type = "mend"
- user.visible_message("[user] begins to mend the incision in [target]'s [parse_zone(target_zone)].",
- "You begin to mend the incision in [target]'s [parse_zone(target_zone)]...")
-
else if(istype(tool, /obj/item/reagent_containers/food/snacks/organ))
to_chat(user, "[tool] was bitten by someone! It's too damaged to use!")
return -1
/datum/surgery_step/manipulate_organs/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- if(current_type == "mend")
- user.visible_message("[user] mends the incision in [target]'s [parse_zone(target_zone)].",
- "You mend the incision in [target]'s [parse_zone(target_zone)].")
- if(locate(/datum/surgery_step/saw) in surgery.steps)
- target.heal_bodypart_damage(45,0)
- return 1
- else if(current_type == "insert")
+ if(current_type == "insert")
if(istype(tool, /obj/item/organ_storage))
I = tool.contents[1]
tool.icon_state = "evidenceobj"
diff --git a/code/modules/surgery/generic_steps.dm b/code/modules/surgery/organic_steps.dm
similarity index 97%
rename from code/modules/surgery/generic_steps.dm
rename to code/modules/surgery/organic_steps.dm
index 25bf7465460..8a4c795c63c 100644
--- a/code/modules/surgery/generic_steps.dm
+++ b/code/modules/surgery/organic_steps.dm
@@ -1,118 +1,118 @@
-
-//make incision
-/datum/surgery_step/incise
- name = "make incision"
- implements = list(/obj/item/scalpel = 100, /obj/item/melee/transforming/energy/sword = 75, /obj/item/kitchen/knife = 65,
- /obj/item/shard = 45, /obj/item = 30) // 30% success with any sharp item.
- time = 16
-
-/datum/surgery_step/incise/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to make an incision in [target]'s [parse_zone(target_zone)].",
- "You begin to make an incision in [target]'s [parse_zone(target_zone)]...")
-
-/datum/surgery_step/incise/tool_check(mob/user, obj/item/tool)
- if(implement_type == /obj/item && !tool.is_sharp())
- return FALSE
-
- return TRUE
-
-//clamp bleeders
-/datum/surgery_step/clamp_bleeders
- name = "clamp bleeders"
- implements = list(/obj/item/hemostat = 100, /obj/item/wirecutters = 60, /obj/item/stack/packageWrap = 35, /obj/item/stack/cable_coil = 15)
- time = 24
-
-/datum/surgery_step/clamp_bleeders/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to clamp bleeders in [target]'s [parse_zone(target_zone)].",
- "You begin to clamp bleeders in [target]'s [parse_zone(target_zone)]...")
-
-/datum/surgery_step/clamp_bleeders/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- if(locate(/datum/surgery_step/saw) in surgery.steps)
- target.heal_bodypart_damage(20,0)
- return ..()
-
-
-//retract skin
-/datum/surgery_step/retract_skin
- name = "retract skin"
- implements = list(/obj/item/retractor = 100, /obj/item/screwdriver = 45, /obj/item/wirecutters = 35)
- time = 24
-
-/datum/surgery_step/retract_skin/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to retract the skin in [target]'s [parse_zone(target_zone)].",
- "You begin to retract the skin in [target]'s [parse_zone(target_zone)]...")
-
-
-
-//close incision
-/datum/surgery_step/close
- name = "mend incision"
- implements = list(/obj/item/cautery = 100, /obj/item/gun/energy/laser = 90, /obj/item/weldingtool = 70,
- /obj/item/lighter = 45, /obj/item/match = 20)
- time = 24
-
-/datum/surgery_step/close/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to mend the incision in [target]'s [parse_zone(target_zone)].",
- "You begin to mend the incision in [target]'s [parse_zone(target_zone)]...")
-
-
-/datum/surgery_step/close/tool_check(mob/user, obj/item/tool)
- if(istype(tool, /obj/item/cautery))
- return 1
-
- if(istype(tool, /obj/item/weldingtool))
- var/obj/item/weldingtool/WT = tool
- if(WT.isOn())
- return 1
-
- else if(istype(tool, /obj/item/lighter))
- var/obj/item/lighter/L = tool
- if(L.lit)
- return 1
-
- else if(istype(tool, /obj/item/match))
- var/obj/item/match/M = tool
- if(M.lit)
- return 1
-
- return 0
-
-/datum/surgery_step/close/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- if(locate(/datum/surgery_step/saw) in surgery.steps)
- target.heal_bodypart_damage(45,0)
- return ..()
-
-
-
-//saw bone
-/datum/surgery_step/saw
- name = "saw bone"
- implements = list(/obj/item/circular_saw = 100, /obj/item/melee/transforming/energy/sword/cyborg/saw = 100,
- /obj/item/melee/arm_blade = 75, /obj/item/mounted_chainsaw = 65, /obj/item/twohanded/required/chainsaw = 50,
- /obj/item/twohanded/fireaxe = 50, /obj/item/hatchet = 35, /obj/item/kitchen/knife/butcher = 25)
- time = 54
-
-/datum/surgery_step/saw/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to saw through the bone in [target]'s [parse_zone(target_zone)].",
- "You begin to saw through the bone in [target]'s [parse_zone(target_zone)]...")
-
-/datum/surgery_step/saw/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- target.apply_damage(50, BRUTE, "[target_zone]")
-
- user.visible_message("[user] saws [target]'s [parse_zone(target_zone)] open!", "You saw [target]'s [parse_zone(target_zone)] open.")
- return 1
-
-//drill bone
-/datum/surgery_step/drill
- name = "drill bone"
- implements = list(/obj/item/surgicaldrill = 100, /obj/item/pickaxe/drill = 60, /obj/item/mecha_parts/mecha_equipment/drill = 60, /obj/item/screwdriver = 20)
- time = 30
-
-/datum/surgery_step/drill/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] begins to drill into the bone in [target]'s [parse_zone(target_zone)].",
- "You begin to drill into the bone in [target]'s [parse_zone(target_zone)]...")
-
-/datum/surgery_step/drill/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
- user.visible_message("[user] drills into [target]'s [parse_zone(target_zone)]!",
- "You drill into [target]'s [parse_zone(target_zone)].")
- return 1
+
+//make incision
+/datum/surgery_step/incise
+ name = "make incision"
+ implements = list(/obj/item/scalpel = 100, /obj/item/melee/transforming/energy/sword = 75, /obj/item/kitchen/knife = 65,
+ /obj/item/shard = 45, /obj/item = 30) // 30% success with any sharp item.
+ time = 16
+
+/datum/surgery_step/incise/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ user.visible_message("[user] begins to make an incision in [target]'s [parse_zone(target_zone)].",
+ "You begin to make an incision in [target]'s [parse_zone(target_zone)]...")
+
+/datum/surgery_step/incise/tool_check(mob/user, obj/item/tool)
+ if(implement_type == /obj/item && !tool.is_sharp())
+ return FALSE
+
+ return TRUE
+
+//clamp bleeders
+/datum/surgery_step/clamp_bleeders
+ name = "clamp bleeders"
+ implements = list(/obj/item/hemostat = 100, /obj/item/wirecutters = 60, /obj/item/stack/packageWrap = 35, /obj/item/stack/cable_coil = 15)
+ time = 24
+
+/datum/surgery_step/clamp_bleeders/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ user.visible_message("[user] begins to clamp bleeders in [target]'s [parse_zone(target_zone)].",
+ "You begin to clamp bleeders in [target]'s [parse_zone(target_zone)]...")
+
+/datum/surgery_step/clamp_bleeders/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ if(locate(/datum/surgery_step/saw) in surgery.steps)
+ target.heal_bodypart_damage(20,0)
+ return ..()
+
+
+//retract skin
+/datum/surgery_step/retract_skin
+ name = "retract skin"
+ implements = list(/obj/item/retractor = 100, /obj/item/screwdriver = 45, /obj/item/wirecutters = 35)
+ time = 24
+
+/datum/surgery_step/retract_skin/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ user.visible_message("[user] begins to retract the skin in [target]'s [parse_zone(target_zone)].",
+ "You begin to retract the skin in [target]'s [parse_zone(target_zone)]...")
+
+
+
+//close incision
+/datum/surgery_step/close
+ name = "mend incision"
+ implements = list(/obj/item/cautery = 100, /obj/item/gun/energy/laser = 90, /obj/item/weldingtool = 70,
+ /obj/item/lighter = 45, /obj/item/match = 20)
+ time = 24
+
+/datum/surgery_step/close/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ user.visible_message("[user] begins to mend the incision in [target]'s [parse_zone(target_zone)].",
+ "You begin to mend the incision in [target]'s [parse_zone(target_zone)]...")
+
+
+/datum/surgery_step/close/tool_check(mob/user, obj/item/tool)
+ if(istype(tool, /obj/item/cautery))
+ return 1
+
+ if(istype(tool, /obj/item/weldingtool))
+ var/obj/item/weldingtool/WT = tool
+ if(WT.isOn())
+ return 1
+
+ else if(istype(tool, /obj/item/lighter))
+ var/obj/item/lighter/L = tool
+ if(L.lit)
+ return 1
+
+ else if(istype(tool, /obj/item/match))
+ var/obj/item/match/M = tool
+ if(M.lit)
+ return 1
+
+ return 0
+
+/datum/surgery_step/close/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ if(locate(/datum/surgery_step/saw) in surgery.steps)
+ target.heal_bodypart_damage(45,0)
+ return ..()
+
+
+
+//saw bone
+/datum/surgery_step/saw
+ name = "saw bone"
+ implements = list(/obj/item/circular_saw = 100, /obj/item/melee/transforming/energy/sword/cyborg/saw = 100,
+ /obj/item/melee/arm_blade = 75, /obj/item/mounted_chainsaw = 65, /obj/item/twohanded/required/chainsaw = 50,
+ /obj/item/twohanded/fireaxe = 50, /obj/item/hatchet = 35, /obj/item/kitchen/knife/butcher = 25)
+ time = 54
+
+/datum/surgery_step/saw/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ user.visible_message("[user] begins to saw through the bone in [target]'s [parse_zone(target_zone)].",
+ "You begin to saw through the bone in [target]'s [parse_zone(target_zone)]...")
+
+/datum/surgery_step/saw/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ target.apply_damage(50, BRUTE, "[target_zone]")
+
+ user.visible_message("[user] saws [target]'s [parse_zone(target_zone)] open!", "You saw [target]'s [parse_zone(target_zone)] open.")
+ return 1
+
+//drill bone
+/datum/surgery_step/drill
+ name = "drill bone"
+ implements = list(/obj/item/surgicaldrill = 100, /obj/item/pickaxe/drill = 60, /obj/item/mecha_parts/mecha_equipment/drill = 60, /obj/item/screwdriver = 20)
+ time = 30
+
+/datum/surgery_step/drill/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ user.visible_message("[user] begins to drill into the bone in [target]'s [parse_zone(target_zone)].",
+ "You begin to drill into the bone in [target]'s [parse_zone(target_zone)]...")
+
+/datum/surgery_step/drill/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ user.visible_message("[user] drills into [target]'s [parse_zone(target_zone)]!",
+ "You drill into [target]'s [parse_zone(target_zone)].")
+ return 1
diff --git a/code/modules/surgery/prosthetic_replacement.dm b/code/modules/surgery/prosthetic_replacement.dm
index 2dddb95872d..7c46ce4604c 100644
--- a/code/modules/surgery/prosthetic_replacement.dm
+++ b/code/modules/surgery/prosthetic_replacement.dm
@@ -4,6 +4,7 @@
species = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
possible_locs = list("r_arm", "l_arm", "l_leg", "r_leg", "head")
requires_bodypart = FALSE //need a missing limb
+ requires_bodypart_type = 0
/datum/surgery/prosthetic_replacement/can_start(mob/user, mob/living/carbon/target)
if(!iscarbon(target))
diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm
index 03beacf27b3..3904c814e28 100644
--- a/code/modules/surgery/surgery.dm
+++ b/code/modules/surgery/surgery.dm
@@ -6,7 +6,7 @@
var/can_cancel = 1 //Can cancel this surgery after step 1 with cautery
var/list/species = list(/mob/living/carbon/human) //Acceptable Species
var/location = "chest" //Surgery location
- var/requires_organic_bodypart = 1 //Prevents you from performing an operation on robotic limbs
+ var/requires_bodypart_type = BODYPART_ORGANIC //Prevents you from performing an operation on incorrect limbs. 0 for any limb type
var/list/possible_locs = list() //Multiple locations
var/ignore_clothes = 0 //This surgery ignores clothes
var/mob/living/carbon/target //Operation target mob
@@ -53,6 +53,13 @@
var/step_type = steps[status]
return new step_type
+/datum/surgery/proc/get_surgery_next_step()
+ if(status < steps.len)
+ var/step_type = steps[status + 1]
+ return new step_type
+ else
+ return null
+
/datum/surgery/proc/complete()
SSblackbox.add_details("surgeries_completed", "[type]")
qdel(src)
diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm
index f53042c5932..d83f7501e27 100644
--- a/code/modules/surgery/surgery_step.dm
+++ b/code/modules/surgery/surgery_step.dm
@@ -5,6 +5,7 @@
var/accept_hand = 0 //does the surgery step require an open hand? If true, ignores implements. Compatible with accept_any_item.
var/accept_any_item = 0 //does the surgery step accept any item? If true, ignores implements. Compatible with require_hand.
var/time = 10 //how long does the step take?
+ var/repeatable = 0 //does this step may be repeated? Make shure it isn't last step, or it used in surgery with `can_cancel = 1`. Or surgion will be stuck in the loop
/datum/surgery_step/proc/try_op(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
@@ -31,8 +32,19 @@
else
to_chat(user, "You need to expose [target]'s [parse_zone(target_zone)] to perform surgery on it!")
return 1 //returns 1 so we don't stab the guy in the dick or wherever.
+
+ if(repeatable)
+ var/datum/surgery_step/next_step = surgery.get_surgery_next_step()
+ if(next_step)
+ surgery.status++
+ if(next_step.try_op(user, target, user.zone_selected, user.get_active_held_item(), surgery))
+ return 1
+ else
+ surgery.status--
+
if(iscyborg(user) && user.a_intent != INTENT_HARM) //to save asimov borgs a LOT of heartache
return 1
+
return 0
@@ -63,7 +75,7 @@
if(failure(user, target, target_zone, tool, surgery))
advance = 1
- if(advance)
+ if(advance && !repeatable)
surgery.status++
if(surgery.status > surgery.steps.len)
surgery.complete()
diff --git a/tgstation.dme b/tgstation.dme
index fed34cc4c7c..65cff0910b4 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -2146,12 +2146,13 @@
#include "code\modules\surgery\core_removal.dm"
#include "code\modules\surgery\dental_implant.dm"
#include "code\modules\surgery\eye_surgery.dm"
-#include "code\modules\surgery\generic_steps.dm"
#include "code\modules\surgery\helpers.dm"
#include "code\modules\surgery\implant_removal.dm"
#include "code\modules\surgery\limb_augmentation.dm"
#include "code\modules\surgery\lipoplasty.dm"
+#include "code\modules\surgery\mechanic_steps.dm"
#include "code\modules\surgery\organ_manipulation.dm"
+#include "code\modules\surgery\organic_steps.dm"
#include "code\modules\surgery\plastic_surgery.dm"
#include "code\modules\surgery\prosthetic_replacement.dm"
#include "code\modules\surgery\remove_embedded_object.dm"