diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index 6de17fc35b5..97978fe6832 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -1229,14 +1229,6 @@ var/global/list/common_tools = list(
istype(W, /obj/item/bonesetter)
)
-//check if mob is lying down on something we can operate him on.
-/proc/can_operate(mob/living/carbon/M)
- return (locate(/obj/machinery/optable, M.loc) && (M.lying || M.resting)) || \
- (locate(/obj/structure/bed/roller, M.loc) && \
- (M.buckled || M.lying || M.weakened || M.stunned || M.paralysis || M.sleeping || M.stat)) && prob(75) || \
- (locate(/obj/structure/table/, M.loc) && \
- (M.lying || M.weakened || M.stunned || M.paralysis || M.sleeping || M.stat) && prob(66))
-
/proc/reverse_direction(var/dir)
switch(dir)
if(NORTH)
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index d69c7fbf28f..6c1ca24314d 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -50,12 +50,12 @@
else
return 1
- if(isscrewdriver(src) && ismachine(M))
+ if(isscrewdriver(src) && ismachine(M) && user.a_intent == INTENT_HELP)
if(!attempt_initiate_surgery(src, M, user))
return 0
else
return 1
- if(is_sharp(src))
+ if(is_sharp(src) && user.a_intent == INTENT_HELP)
if(!attempt_initiate_surgery(src, M, user))
return 0
else
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index ee0cf0db06f..0250cbca499 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -153,10 +153,9 @@
modules += new /obj/item/stack/medical/ointment/advanced(src)
modules += new /obj/item/stack/medical/splint(src)
modules += new /obj/item/stack/nanopaste(src)
- modules += new /obj/item/scalpel(src)
+ modules += new /obj/item/scalpel/laser(src)
modules += new /obj/item/hemostat(src)
modules += new /obj/item/retractor(src)
- modules += new /obj/item/cautery(src)
modules += new /obj/item/bonegel(src)
modules += new /obj/item/FixOVein(src)
modules += new /obj/item/bonesetter(src)
@@ -416,10 +415,9 @@
modules += new /obj/item/stack/medical/ointment/advanced(src)
modules += new /obj/item/stack/medical/splint(src)
modules += new /obj/item/stack/nanopaste(src)
- modules += new /obj/item/scalpel(src)
+ modules += new /obj/item/scalpel/laser(src)
modules += new /obj/item/hemostat(src)
modules += new /obj/item/retractor(src)
- modules += new /obj/item/cautery(src)
modules += new /obj/item/bonegel(src)
modules += new /obj/item/FixOVein(src)
modules += new /obj/item/bonesetter(src)
diff --git a/code/modules/surgery/helpers.dm b/code/modules/surgery/helpers.dm
index dae7d2a7773..5a0f220d5e2 100644
--- a/code/modules/surgery/helpers.dm
+++ b/code/modules/surgery/helpers.dm
@@ -3,6 +3,13 @@
var/mob/living/carbon/human/H
var/obj/item/organ/external/affecting
var/selected_zone = user.zone_sel.selecting
+ var/list/cautery_tools = list(
+ /obj/item/scalpel/laser = 100, \
+ /obj/item/cautery = 100, \
+ /obj/item/clothing/mask/cigarette = 90, \
+ /obj/item/lighter = 60, \
+ /obj/item/weldingtool = 30
+ )
if(istype(M, /mob/living/carbon/human))
H = M
@@ -61,26 +68,49 @@
user.visible_message("[user] prepares to operate on [M]'s [parse_zone(selected_zone)].", \
"You prepare to operate on [M]'s [parse_zone(selected_zone)].")
- else if(!current_surgery.step_in_progress)
- if(current_surgery.status == 1 )
+ else if(!current_surgery.step_in_progress && ishuman(M)) //early surgery cautery
+ var/datum/surgery_step/generic/cauterize/C = new
+ var/target_zone = check_zone(selected_zone)
+ if(current_surgery.status == 1)
M.surgeries -= current_surgery
to_chat(user, "You stop the surgery.")
qdel(current_surgery)
- else if(istype(user.get_inactive_hand(), /obj/item/cautery) && current_surgery.can_cancel)
- M.surgeries -= current_surgery
- user.visible_message("[user] mends the incision on [M]'s [parse_zone(selected_zone)] with the [I] .", \
- "You mend the incision on [M]'s [parse_zone(selected_zone)].")
- if(affecting)
- affecting.open = 0
- affecting.germ_level = 0
- 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!")
+ else if(current_surgery.can_cancel)
+ var/cautery_chance = 0
+ var/obj/item/cautery_tool = null
+
+ if(isrobot(user))
+ if(istype(I, /obj/item/scalpel/laser))
+ cautery_chance = 100
+ cautery_tool = I
+
+ else
+ for(var/T in cautery_tools)
+ if(istype(user.get_inactive_hand(), T))
+ cautery_chance = cautery_tools[T]
+ cautery_tool = user.get_inactive_hand()
+
+ if(cautery_chance)
+ C.begin_step(user, H, selected_zone, target_zone, cautery_tool, current_surgery)
+ if(do_after(user, C.time * cautery_tool.toolspeed, target = M))
+ if(!isrobot(user))
+ cautery_chance *= get_location_modifier(target)
+ cautery_chance *= get_pain_modifier(target)
+ if(prob(cautery_chance))
+ C.end_step(user, H, selected_zone, target_zone, cautery_tool, current_surgery)
+ M.surgeries -= current_surgery
+ qdel(current_surgery)
+ else
+ C.fail_step(user, H, selected_zone, target_zone, cautery_tool, current_surgery)
+
+ else if(!isrobot(user))
+ to_chat(user, "You need to hold a cautery or equivalent in your inactive hand to stop the surgery in progress.")
return 1
return 0
+
/proc/get_pain_modifier(mob/living/carbon/human/M) //returns modfier to make surgery harder if patient is conscious and feels pain
if(M.stat) //stat=0 if CONSCIOUS, 1=UNCONSCIOUS and 2=DEAD. Operating on dead people is easy, too. Just sleeping won't work, though.
return 1
@@ -111,6 +141,18 @@
else
return 0.5
+//check if mob is lying down on something we can operate him on.
+/proc/can_operate(mob/living/carbon/M)
+ if(locate(/obj/machinery/optable, M.loc) && (M.lying || M.resting))
+ return TRUE
+ if(locate(/obj/structure/bed, M.loc) && (M.buckled || M.lying || M.weakened || M.stunned || M.paralysis || M.sleeping || M.stat))
+ return TRUE
+ if(locate(/obj/structure/table, M.loc) && (M.lying || M.weakened || M.stunned || M.paralysis || M.sleeping || M.stat))
+ return TRUE
+ if((istype(M.loc, /turf/simulated/floor) || istype(M.loc, /turf/unsimulated/floor)) && (M.lying || M.weakened || M.stunned || M.paralysis || M.sleeping || M.stat))
+ return TRUE
+ return FALSE
+
// Called when a limb containing this object is placed back on a body
/atom/movable/proc/attempt_become_organ(obj/item/organ/external/parent,mob/living/carbon/human/H)
return 0