diff --git a/code/datums/wounds/_wounds.dm b/code/datums/wounds/_wounds.dm index 29c87b32d4..02421b1e52 100644 --- a/code/datums/wounds/_wounds.dm +++ b/code/datums/wounds/_wounds.dm @@ -91,8 +91,6 @@ var/wound_flags = (FLESH_WOUND | BONE_WOUND | ACCEPTS_GAUZE) /datum/wound/Destroy() - if(attached_surgery) - QDEL_NULL(attached_surgery) if(limb?.wounds && (src in limb.wounds)) // destroy can call remove_wound() and remove_wound() calls qdel, so we check to make sure there's anything to remove first remove_wound() limb = null diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index 7a8a523a18..c02eb4a051 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -21,13 +21,13 @@ force = 5 w_class = WEIGHT_CLASS_SMALL tool_behaviour = TOOL_MULTITOOL + item_flags = SURGICAL_TOOL throwforce = 0 throw_range = 7 throw_speed = 3 custom_materials = list(/datum/material/iron=50, /datum/material/glass=20) var/obj/machinery/buffer // simple machine buffer for device linkage toolspeed = 1 - tool_behaviour = TOOL_MULTITOOL usesound = 'sound/weapons/empty.ogg' var/datum/integrated_io/selected_io = null //functional for integrated circuits. var/mode = 0 diff --git a/code/game/objects/items/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm index 0dd9885c29..5c1c67e78c 100644 --- a/code/game/objects/items/tools/crowbar.dm +++ b/code/game/objects/items/tools/crowbar.dm @@ -8,6 +8,7 @@ usesound = 'sound/items/crowbar.ogg' flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BELT + item_flags = SURGICAL_TOOL force = 5 throwforce = 7 w_class = WEIGHT_CLASS_SMALL diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm index bf767af2ed..920afb8d14 100644 --- a/code/game/objects/items/tools/screwdriver.dm +++ b/code/game/objects/items/tools/screwdriver.dm @@ -8,6 +8,7 @@ righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BELT + item_flags = SURGICAL_TOOL force = 5 w_class = WEIGHT_CLASS_TINY throwforce = 5 diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index 8e4fb05d71..c8eb96005c 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -9,6 +9,7 @@ righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BELT + item_flags = SURGICAL_TOOL force = 3 throwforce = 5 hitsound = "swing_hit" diff --git a/code/game/objects/items/tools/wirecutters.dm b/code/game/objects/items/tools/wirecutters.dm index 000b816d70..ad2c83da3a 100644 --- a/code/game/objects/items/tools/wirecutters.dm +++ b/code/game/objects/items/tools/wirecutters.dm @@ -8,6 +8,7 @@ righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BELT + item_flags = SURGICAL_TOOL force = 6 throw_speed = 3 throw_range = 7 diff --git a/code/game/objects/items/tools/wrench.dm b/code/game/objects/items/tools/wrench.dm index e8b77199d7..f44652dbf4 100644 --- a/code/game/objects/items/tools/wrench.dm +++ b/code/game/objects/items/tools/wrench.dm @@ -7,6 +7,7 @@ righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BELT + item_flags = SURGICAL_TOOL force = 5 throwforce = 7 w_class = WEIGHT_CLASS_SMALL diff --git a/code/modules/surgery/bone_mending.dm b/code/modules/surgery/bone_mending.dm index 0c0083575b..659e20aa3a 100644 --- a/code/modules/surgery/bone_mending.dm +++ b/code/modules/surgery/bone_mending.dm @@ -15,6 +15,9 @@ var/obj/item/bodypart/targeted_bodypart = target.get_bodypart(user.zone_selected) return(targeted_bodypart.get_wound_type(targetable_wound)) +/datum/surgery/repair_bone_hairline/biomech + requires_bodypart_type = BODYPART_HYBRID + steps = list(/datum/surgery_step/mechanic_open, /datum/surgery_step/repair_bone_hairline, /datum/surgery_step/mechanic_close) ///// Repair Compound Fracture (Critical) /datum/surgery/repair_bone_compound @@ -25,6 +28,10 @@ requires_real_bodypart = TRUE targetable_wound = /datum/wound/blunt/critical +/datum/surgery/repair_bone_compound/biomech + requires_bodypart_type = BODYPART_HYBRID + steps = list(/datum/surgery_step/mechanic_open, /datum/surgery_step/open_hatch, /datum/surgery_step/pry_off_plating, /datum/surgery_step/reset_compound_fracture, /datum/surgery_step/repair_bone_compound, /datum/surgery_step/add_plating, /datum/surgery_step/mechanic_close) + /datum/surgery/repair_bone_compound/can_start(mob/living/user, mob/living/carbon/target) if(..()) var/obj/item/bodypart/targeted_bodypart = target.get_bodypart(user.zone_selected) diff --git a/code/modules/surgery/burn_dressing.dm b/code/modules/surgery/burn_dressing.dm index 8bfa52d245..14bca66139 100644 --- a/code/modules/surgery/burn_dressing.dm +++ b/code/modules/surgery/burn_dressing.dm @@ -16,6 +16,10 @@ var/datum/wound/burn/burn_wound = targeted_bodypart.get_wound_type(targetable_wound) return(burn_wound && burn_wound.infestation > 0) +/datum/surgery/debride/biomech + name = "Debride infected synthetic flesh" + requires_bodypart_type = BODYPART_HYBRID + //SURGERY STEPS ///// Debride diff --git a/code/modules/surgery/mechanic_steps.dm b/code/modules/surgery/mechanic_steps.dm index 101be7f103..1650e43d7f 100644 --- a/code/modules/surgery/mechanic_steps.dm +++ b/code/modules/surgery/mechanic_steps.dm @@ -13,7 +13,7 @@ "[user] begins to unscrew the shell of [target]'s [parse_zone(target_zone)].", "[user] begins to unscrew the shell of [target]'s [parse_zone(target_zone)].") -/datum/surgery_step/mechanic_incise/tool_check(mob/user, obj/item/tool) +/datum/surgery_step/mechanic_open/tool_check(mob/user, obj/item/tool) if(implement_type == /obj/item && !tool.get_sharpness()) return FALSE return TRUE @@ -38,7 +38,7 @@ return TRUE //prepare electronics /datum/surgery_step/prepare_electronics - name = "prepare electronics" + name = "prepare electronics (multitool)" implements = list( TOOL_MULTITOOL = 100, TOOL_HEMOSTAT = 10) // try to reboot internal controllers via short circuit with some conductor @@ -77,7 +77,7 @@ //open hatch /datum/surgery_step/open_hatch - name = "open the hatch" + name = "open the hatch (empty hand)" accept_hand = 1 time = 10 diff --git a/code/modules/surgery/organ_manipulation.dm b/code/modules/surgery/organ_manipulation.dm index 85b400d2da..0876357e8e 100644 --- a/code/modules/surgery/organ_manipulation.dm +++ b/code/modules/surgery/organ_manipulation.dm @@ -144,4 +144,4 @@ display_results(user, target, "You can't extract anything from [target]'s [parse_zone(target_zone)]!", "[user] can't seem to extract anything from [target]'s [parse_zone(target_zone)]!", "[user] can't seem to extract anything from [target]'s [parse_zone(target_zone)]!") - return 0 + return 1 diff --git a/code/modules/surgery/repair_puncture.dm b/code/modules/surgery/repair_puncture.dm index 12aefefc82..d6dde5c007 100644 --- a/code/modules/surgery/repair_puncture.dm +++ b/code/modules/surgery/repair_puncture.dm @@ -1,5 +1,5 @@ -/////BURN FIXING SURGERIES////// +/////PUNCTURE FIXING SURGERIES////// //the step numbers of each of these two, we only currently use the first to switch back and forth due to advancing after finishing steps anyway #define REALIGN_INNARDS 1 @@ -14,6 +14,10 @@ requires_real_bodypart = TRUE targetable_wound = /datum/wound/pierce +/datum/surgery/repair_puncture/biomech + requires_bodypart_type = BODYPART_HYBRID + steps = list(/datum/surgery_step/mechanic_open, /datum/surgery_step/repair_innards, /datum/surgery_step/seal_veins, /datum/surgery_step/mechanic_close) + /datum/surgery/repair_puncture/can_start(mob/living/user, mob/living/carbon/target) . = ..() if(.) diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm index e287b38ca1..54134d5a47 100644 --- a/code/modules/surgery/surgery_step.dm +++ b/code/modules/surgery/surgery_step.dm @@ -81,8 +81,12 @@ surgery.status++ if(surgery.status > surgery.steps.len) surgery.complete() - surgery.step_in_progress = FALSE - return advance + surgery.step_in_progress = FALSE + return advance + else + surgery.step_in_progress = FALSE + return TRUE //Stop the attack chain! + /datum/surgery_step/proc/preop(mob/user, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery) display_results(user, target, "You begin to perform surgery on [target]...",