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."