From fb3a6bfbfc948fe3d272eef7211bf2670b295670 Mon Sep 17 00:00:00 2001 From: MrROBUST Date: Tue, 10 Oct 2017 11:32:08 +0300 Subject: [PATCH] [ReadyForReview]Correct organ manipulation step for robotic prosthesis surgery (#30818) * Try to make some steps repeatable * Done making repeatable steps Organ manipulation steps now repeatable Dummy robotic prosthesis organ manipulation step * few more steps * implant removal for augmentations --- code/game/machinery/computer/Operating.dm | 10 +- code/modules/surgery/amputation.dm | 2 +- code/modules/surgery/eye_surgery.dm | 2 +- code/modules/surgery/helpers.dm | 27 +- code/modules/surgery/implant_removal.dm | 14 +- code/modules/surgery/mechanic_steps.dm | 85 +++++++ code/modules/surgery/organ_manipulation.dm | 74 ++++-- .../{generic_steps.dm => organic_steps.dm} | 236 +++++++++--------- .../modules/surgery/prosthetic_replacement.dm | 1 + code/modules/surgery/surgery.dm | 9 +- code/modules/surgery/surgery_step.dm | 14 +- tgstation.dme | 3 +- 12 files changed, 321 insertions(+), 156 deletions(-) create mode 100644 code/modules/surgery/mechanic_steps.dm rename code/modules/surgery/{generic_steps.dm => organic_steps.dm} (97%) 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"