diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index a1f2335a9d..9bb70214ba 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -44,8 +44,8 @@ avoid code duplication. This includes items that may sometimes act as a standard
/mob/living/attackby(obj/item/I, mob/user, var/attack_modifier)
if(!ismob(user))
return 0
- if(can_operate(src) && I.do_surgery(src,user))
- if(I.can_do_surgery(src,user))
+ if(can_operate(src) && I.can_do_surgery(src,user))
+ if(I.do_surgery(src,user))
return 1
else
return 0
diff --git a/code/modules/surgery/bones.dm b/code/modules/surgery/bones.dm
index 2f832fdb9f..c994d6259c 100644
--- a/code/modules/surgery/bones.dm
+++ b/code/modules/surgery/bones.dm
@@ -24,6 +24,8 @@
if (!hasorgans(target))
return 0
var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(coverage_check(user, target, affected, tool))
+ return 0
return affected && (affected.robotic < ORGAN_ROBOT) && affected.open >= 2 && affected.stage == 0
/datum/surgery_step/glue_bone/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -63,6 +65,8 @@
if (!hasorgans(target))
return 0
var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(coverage_check(user, target, affected, tool))
+ return 0
return affected && affected.organ_tag != BP_HEAD && !(affected.robotic >= ORGAN_ROBOT) && affected.open >= 2 && affected.stage == 1
/datum/surgery_step/set_bone/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -107,6 +111,8 @@
if (!hasorgans(target))
return 0
var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(coverage_check(user, target, affected, tool))
+ return 0
return affected && affected.organ_tag == BP_HEAD && (affected.robotic < ORGAN_ROBOT) && affected.open >= 2 && affected.stage == 1
/datum/surgery_step/mend_skull/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -149,6 +155,8 @@
if (!hasorgans(target))
return 0
var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(coverage_check(user, target, affected, tool))
+ return 0
return affected && affected.open >= 2 && !(affected.robotic >= ORGAN_ROBOT) && affected.stage == 2
/datum/surgery_step/finish_bone/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
@@ -188,6 +196,8 @@
if (!hasorgans(target))
return 0
var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(coverage_check(user, target, affected, tool))
+ return 0
return affected && (affected.robotic < ORGAN_ROBOT) && affected.open >= 2 && affected.stage == 0
/datum/surgery_step/clamp_bone/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
diff --git a/code/modules/surgery/encased.dm b/code/modules/surgery/encased.dm
index 4e03024a01..6111e56fc8 100644
--- a/code/modules/surgery/encased.dm
+++ b/code/modules/surgery/encased.dm
@@ -12,6 +12,8 @@
return 0
var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(coverage_check(user, target, affected, tool))
+ return 0
return affected && !(affected.robotic >= ORGAN_ROBOT) && affected.encased && affected.open >= 2
///////////////////////////////////////////////////////////////
diff --git a/code/modules/surgery/external_repair.dm b/code/modules/surgery/external_repair.dm
index 4ed2d96c1a..4f8707e82d 100644
--- a/code/modules/surgery/external_repair.dm
+++ b/code/modules/surgery/external_repair.dm
@@ -26,6 +26,8 @@
return 0
if (affected.robotic >= ORGAN_ROBOT)
return 0
+ if(coverage_check(user, target, affected, tool))
+ return 0
return 1
diff --git a/code/modules/surgery/face.dm b/code/modules/surgery/face.dm
index 30f50b14ec..f871d84ec2 100644
--- a/code/modules/surgery/face.dm
+++ b/code/modules/surgery/face.dm
@@ -14,6 +14,8 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
if (!affected || (affected.robotic >= ORGAN_ROBOT))
return 0
+ if(coverage_check(user, target, affected, tool))
+ return 0
return target_zone == O_MOUTH
///////////////////////////////////////////////////////////////
diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm
index 02003dd950..556b616cf5 100644
--- a/code/modules/surgery/generic.dm
+++ b/code/modules/surgery/generic.dm
@@ -20,6 +20,8 @@
return 0
if (affected.robotic >= ORGAN_ROBOT)
return 0
+ if(coverage_check(user, target, affected, tool))
+ return 0
return 1
///////////////////////////////////////////////////////////////
diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm
index 58a322febd..26887bcf88 100644
--- a/code/modules/surgery/implant.dm
+++ b/code/modules/surgery/implant.dm
@@ -6,37 +6,40 @@
/datum/surgery_step/cavity
priority = 1
- 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 == (affected.encased ? 3 : 2) && !(affected.status & ORGAN_BLEEDING)
- proc/get_max_wclass(var/obj/item/organ/external/affected)
- switch (affected.organ_tag)
- if (BP_HEAD)
- return ITEMSIZE_TINY
- if (BP_TORSO)
- return ITEMSIZE_NORMAL
- if (BP_GROIN)
- return ITEMSIZE_SMALL
+/datum/surgery_step/cavity/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(coverage_check(user, target, affected, tool))
+ return 0
+ return affected && affected.open == (affected.encased ? 3 : 2) && !(affected.status & ORGAN_BLEEDING)
- proc/get_cavity(var/obj/item/organ/external/affected)
- switch (affected.organ_tag)
- if (BP_HEAD)
- return "cranial"
- if (BP_TORSO)
- return "thoracic"
- if (BP_GROIN)
- return "abdominal"
- return ""
+/datum/surgery_step/cavity/proc/get_max_wclass(var/obj/item/organ/external/affected)
+ switch (affected.organ_tag)
+ if (BP_HEAD)
+ return ITEMSIZE_TINY
+ if (BP_TORSO)
+ return ITEMSIZE_NORMAL
+ if (BP_GROIN)
+ return ITEMSIZE_SMALL
+ return 0
- 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)
- user.visible_message("[user]'s hand slips, scraping around inside [target]'s [affected.name] with \the [tool]!", \
- "Your hand slips, scraping around inside [target]'s [affected.name] with \the [tool]!")
- affected.createwound(CUT, 20)
+/datum/surgery_step/cavity/proc/get_cavity(var/obj/item/organ/external/affected)
+ switch (affected.organ_tag)
+ if (BP_HEAD)
+ return "cranial"
+ if (BP_TORSO)
+ return "thoracic"
+ if (BP_GROIN)
+ return "abdominal"
+ return ""
+
+/datum/surgery_step/cavity/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)
+ user.visible_message("[user]'s hand slips, scraping around inside [target]'s [affected.name] with \the [tool]!", \
+ "Your hand slips, scraping around inside [target]'s [affected.name] with \the [tool]!")
+ affected.createwound(CUT, 20)
///////////////////////////////////////////////////////////////
// Space Making Surgery
@@ -52,23 +55,23 @@
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/make_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 making some space inside [target]'s [get_cavity(affected)] cavity with \the [tool].", \
- "You start making some space inside [target]'s [get_cavity(affected)] cavity with \the [tool]." )
- target.custom_pain("The pain in your chest is living hell!",1)
- affected.cavity = 1
- ..()
+ 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] 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]." )
+/datum/surgery_step/cavity/make_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 making some space inside [target]'s [get_cavity(affected)] cavity with \the [tool].", \
+ "You start making some space inside [target]'s [get_cavity(affected)] cavity with \the [tool]." )
+ target.custom_pain("The pain in your chest is living hell!",1)
+ affected.cavity = 1
+ ..()
+
+/datum/surgery_step/cavity/make_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] 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
diff --git a/code/modules/surgery/neck.dm b/code/modules/surgery/neck.dm
index ec9803309f..88d5053afe 100644
--- a/code/modules/surgery/neck.dm
+++ b/code/modules/surgery/neck.dm
@@ -14,6 +14,8 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
if (!affected || (affected.robotic >= ORGAN_ROBOT) || !(affected.open >= 3))
return 0
+ if(coverage_check(user, target, affected, tool))
+ return 0
return target_zone == BP_HEAD
/////////////////////////////
diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm
index 8d261f7535..d7e3c7be55 100644
--- a/code/modules/surgery/organs_internal.dm
+++ b/code/modules/surgery/organs_internal.dm
@@ -10,6 +10,8 @@
return 0
var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(coverage_check(user, target, affected, tool))
+ return 0
return affected && affected.open == (affected.encased ? 3 : 2)
diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm
index 782074b2ad..411ecf75d3 100644
--- a/code/modules/surgery/other.dm
+++ b/code/modules/surgery/other.dm
@@ -25,6 +25,8 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
if(!affected) return
+ if(coverage_check(user, target, affected, tool))
+ return 0
var/internal_bleeding = 0
for(var/datum/wound/W in affected.wounds) if(W.internal)
internal_bleeding = 1
@@ -80,6 +82,8 @@
return 0
var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(coverage_check(user, target, affected, tool))
+ return 0
return affected && affected.open >= 2 && (affected.status & ORGAN_DEAD)
@@ -136,6 +140,8 @@
return 0
var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ if(coverage_check(user, target, affected, tool))
+ return 0
return affected && affected.open == 3 && (affected.status & ORGAN_DEAD)
/datum/surgery_step/treat_necrosis/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm
index a1de76461c..229a10472a 100644
--- a/code/modules/surgery/robotics.dm
+++ b/code/modules/surgery/robotics.dm
@@ -20,6 +20,8 @@
return 0
if (!(affected.robotic == ORGAN_ROBOT || affected.robotic == ORGAN_LIFELIKE)) //VOREStation Edit - No good on ORGAN_NANOFORM
return 0
+ if(coverage_check(user, target, affected, tool))
+ return 0
return 1
///////////////////////////////////////////////////////////////
diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm
index 837e10a5a0..a79a3702c2 100644
--- a/code/modules/surgery/surgery.dm
+++ b/code/modules/surgery/surgery.dm
@@ -67,6 +67,18 @@
return 1
+// Let's check if stuff blocks us from doing surgery on them
+// TODO: make it based on area coverage rather than just forbid spacesuits?
+// Returns true if target organ is covered
+/datum/surgery_step/proc/coverage_check(mob/living/user, mob/living/carbon/human/target, obj/item/organ/external/affected, obj/item/tool)
+ if(affected.organ_tag == BP_HEAD)
+ if(target.head && istype(target.head,/obj/item/clothing/head/helmet/space))
+ return TRUE
+ else
+ if(target.wear_suit && istype(target.wear_suit,/obj/item/clothing/suit/space))
+ return TRUE
+
+ return FALSE
// checks whether this step can be applied with the given user and target
/datum/surgery_step/proc/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
diff --git a/html/changelogs/heroman3003 - voidsuti-surgery.yml b/html/changelogs/heroman3003 - voidsuti-surgery.yml
new file mode 100644
index 0000000000..ea04348b8e
--- /dev/null
+++ b/html/changelogs/heroman3003 - voidsuti-surgery.yml
@@ -0,0 +1,36 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Heroman3003
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - tweak: "Surgery can no longer be done through the space suits."