From 2e230617baa992309c4353eb7b5d5e34b3f98a9f Mon Sep 17 00:00:00 2001 From: Heroman Date: Tue, 4 Feb 2020 09:59:22 +1000 Subject: [PATCH 1/3] Restricts surgery through voidsuits --- code/_onclick/item_attack.dm | 4 +- code/modules/surgery/bones.dm | 30 ++++++++ code/modules/surgery/encased.dm | 6 ++ code/modules/surgery/external_repair.dm | 6 ++ code/modules/surgery/face.dm | 3 + code/modules/surgery/generic.dm | 6 ++ code/modules/surgery/implant.dm | 91 +++++++++++++------------ code/modules/surgery/neck.dm | 2 + code/modules/surgery/organs_internal.dm | 6 ++ code/modules/surgery/other.dm | 18 +++++ code/modules/surgery/robotics.dm | 6 ++ 11 files changed, 134 insertions(+), 44 deletions(-) diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index afe99e2c1d..e3d9cca31d 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..800bd451a3 100644 --- a/code/modules/surgery/bones.dm +++ b/code/modules/surgery/bones.dm @@ -24,6 +24,12 @@ if (!hasorgans(target)) return 0 var/obj/item/organ/external/affected = target.get_organ(target_zone) + if(affected.organ_tag == BP_HEAD) + if(target.head && istype(target.head,/obj/item/clothing/head/helmet/space)) + return 0 + else + if(target.wear_suit && istype(target.wear_suit,/obj/item/clothing/suit/space)) + 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 +69,12 @@ if (!hasorgans(target)) return 0 var/obj/item/organ/external/affected = target.get_organ(target_zone) + if(affected.organ_tag == BP_HEAD) + if(target.head && istype(target.head,/obj/item/clothing/head/helmet/space)) + return 0 + else + if(target.wear_suit && istype(target.wear_suit,/obj/item/clothing/suit/space)) + 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 +119,12 @@ if (!hasorgans(target)) return 0 var/obj/item/organ/external/affected = target.get_organ(target_zone) + if(affected.organ_tag == BP_HEAD) + if(target.head && istype(target.head,/obj/item/clothing/head/helmet/space)) + return 0 + else + if(target.wear_suit && istype(target.wear_suit,/obj/item/clothing/suit/space)) + 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 +167,12 @@ if (!hasorgans(target)) return 0 var/obj/item/organ/external/affected = target.get_organ(target_zone) + if(affected.organ_tag == BP_HEAD) + if(target.head && istype(target.head,/obj/item/clothing/head/helmet/space)) + return 0 + else + if(target.wear_suit && istype(target.wear_suit,/obj/item/clothing/suit/space)) + 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 +212,12 @@ if (!hasorgans(target)) return 0 var/obj/item/organ/external/affected = target.get_organ(target_zone) + if(affected.organ_tag == BP_HEAD) + if(target.head && istype(target.head,/obj/item/clothing/head/helmet/space)) + return 0 + else + if(target.wear_suit && istype(target.wear_suit,/obj/item/clothing/suit/space)) + 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..9e8289bae4 100644 --- a/code/modules/surgery/encased.dm +++ b/code/modules/surgery/encased.dm @@ -12,6 +12,12 @@ return 0 var/obj/item/organ/external/affected = target.get_organ(target_zone) + if(affected.organ_tag == BP_HEAD) + if(target.head && istype(target.head,/obj/item/clothing/head/helmet/space)) + return 0 + else + if(target.wear_suit && istype(target.wear_suit,/obj/item/clothing/suit/space)) + 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 a061c02e1c..f35d4bd718 100644 --- a/code/modules/surgery/external_repair.dm +++ b/code/modules/surgery/external_repair.dm @@ -24,6 +24,12 @@ return 0 if (affected.robotic >= ORGAN_ROBOT) return 0 + if(affected.organ_tag == BP_HEAD) + if(target.head && istype(target.head,/obj/item/clothing/head/helmet/space)) + return 0 + else + if(target.wear_suit && istype(target.wear_suit,/obj/item/clothing/suit/space)) + return 0 return 1 diff --git a/code/modules/surgery/face.dm b/code/modules/surgery/face.dm index 30f50b14ec..968b99f4f9 100644 --- a/code/modules/surgery/face.dm +++ b/code/modules/surgery/face.dm @@ -14,6 +14,9 @@ var/obj/item/organ/external/affected = target.get_organ(target_zone) if (!affected || (affected.robotic >= ORGAN_ROBOT)) return 0 + if(affected.organ_tag == BP_HEAD) + if(target.head && istype(target.head,/obj/item/clothing/head/helmet/space)) + return 0 return target_zone == O_MOUTH /////////////////////////////////////////////////////////////// diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm index 02003dd950..84f9b35f32 100644 --- a/code/modules/surgery/generic.dm +++ b/code/modules/surgery/generic.dm @@ -20,6 +20,12 @@ return 0 if (affected.robotic >= ORGAN_ROBOT) return 0 + if(affected.organ_tag == BP_HEAD) + if(target.head && istype(target.head,/obj/item/clothing/head/helmet/space)) + return 0 + else + if(target.wear_suit && istype(target.wear_suit,/obj/item/clothing/suit/space)) + return 0 return 1 /////////////////////////////////////////////////////////////// diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm index a86842837b..9234c1b9c9 100644 --- a/code/modules/surgery/implant.dm +++ b/code/modules/surgery/implant.dm @@ -6,37 +6,44 @@ /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(affected.organ_tag == BP_HEAD) + if(target.head && istype(target.head,/obj/item/clothing/head/helmet/space)) + return 0 + else + if(target.wear_suit && istype(target.wear_suit,/obj/item/clothing/suit/space)) + 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 +59,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..9e847b6aa6 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(target.head && istype(target.head,/obj/item/clothing/head/helmet/space)) + 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..ca54fbffc9 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -10,6 +10,12 @@ return 0 var/obj/item/organ/external/affected = target.get_organ(target_zone) + if(affected.organ_tag == BP_HEAD) + if(target.head && istype(target.head,/obj/item/clothing/head/helmet/space)) + return 0 + else + if(target.wear_suit && istype(target.wear_suit,/obj/item/clothing/suit/space)) + 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..93dd453321 100644 --- a/code/modules/surgery/other.dm +++ b/code/modules/surgery/other.dm @@ -25,6 +25,12 @@ var/obj/item/organ/external/affected = target.get_organ(target_zone) if(!affected) return + if(affected.organ_tag == BP_HEAD) + if(target.head && istype(target.head,/obj/item/clothing/head/helmet/space)) + return 0 + else + if(target.wear_suit && istype(target.wear_suit,/obj/item/clothing/suit/space)) + return 0 var/internal_bleeding = 0 for(var/datum/wound/W in affected.wounds) if(W.internal) internal_bleeding = 1 @@ -80,6 +86,12 @@ return 0 var/obj/item/organ/external/affected = target.get_organ(target_zone) + if(affected.organ_tag == BP_HEAD) + if(target.head && istype(target.head,/obj/item/clothing/head/helmet/space)) + return 0 + else + if(target.wear_suit && istype(target.wear_suit,/obj/item/clothing/suit/space)) + return 0 return affected && affected.open >= 2 && (affected.status & ORGAN_DEAD) @@ -136,6 +148,12 @@ return 0 var/obj/item/organ/external/affected = target.get_organ(target_zone) + if(affected.organ_tag == BP_HEAD) + if(target.head && istype(target.head,/obj/item/clothing/head/helmet/space)) + return 0 + else + if(target.wear_suit && istype(target.wear_suit,/obj/item/clothing/suit/space)) + 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 7fccfa8071..5aca3aa47e 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -20,6 +20,12 @@ return 0 if (!(affected.robotic >= ORGAN_ROBOT)) return 0 + if(affected.organ_tag == BP_HEAD) + if(target.head && istype(target.head,/obj/item/clothing/head/helmet/space)) + return 0 + else + if(target.wear_suit && istype(target.wear_suit,/obj/item/clothing/suit/space)) + return 0 return 1 /////////////////////////////////////////////////////////////// From e5d425695af23b08533591c4ffdf95be272dc84d Mon Sep 17 00:00:00 2001 From: Heroman Date: Mon, 10 Feb 2020 09:48:10 +1000 Subject: [PATCH 2/3] Adds changelog --- .../heroman3003 - voidsuti-surgery.yml | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 html/changelogs/heroman3003 - voidsuti-surgery.yml 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." From e1c6b18bad743583072980b4a0c48ba0fa89ffac Mon Sep 17 00:00:00 2001 From: Heroman Date: Mon, 10 Feb 2020 17:52:03 +1000 Subject: [PATCH 3/3] Separates it into its own proc --- code/modules/surgery/bones.dm | 40 +++++++------------------ code/modules/surgery/encased.dm | 8 ++--- code/modules/surgery/external_repair.dm | 8 ++--- code/modules/surgery/face.dm | 5 ++-- code/modules/surgery/generic.dm | 8 ++--- code/modules/surgery/implant.dm | 8 ++--- code/modules/surgery/neck.dm | 2 +- code/modules/surgery/organs_internal.dm | 8 ++--- code/modules/surgery/other.dm | 24 ++++----------- code/modules/surgery/robotics.dm | 8 ++--- code/modules/surgery/surgery.dm | 12 ++++++++ 11 files changed, 43 insertions(+), 88 deletions(-) diff --git a/code/modules/surgery/bones.dm b/code/modules/surgery/bones.dm index 800bd451a3..c994d6259c 100644 --- a/code/modules/surgery/bones.dm +++ b/code/modules/surgery/bones.dm @@ -24,12 +24,8 @@ if (!hasorgans(target)) return 0 var/obj/item/organ/external/affected = target.get_organ(target_zone) - if(affected.organ_tag == BP_HEAD) - if(target.head && istype(target.head,/obj/item/clothing/head/helmet/space)) - return 0 - else - if(target.wear_suit && istype(target.wear_suit,/obj/item/clothing/suit/space)) - return 0 + 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) @@ -69,12 +65,8 @@ if (!hasorgans(target)) return 0 var/obj/item/organ/external/affected = target.get_organ(target_zone) - if(affected.organ_tag == BP_HEAD) - if(target.head && istype(target.head,/obj/item/clothing/head/helmet/space)) - return 0 - else - if(target.wear_suit && istype(target.wear_suit,/obj/item/clothing/suit/space)) - return 0 + 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) @@ -119,12 +111,8 @@ if (!hasorgans(target)) return 0 var/obj/item/organ/external/affected = target.get_organ(target_zone) - if(affected.organ_tag == BP_HEAD) - if(target.head && istype(target.head,/obj/item/clothing/head/helmet/space)) - return 0 - else - if(target.wear_suit && istype(target.wear_suit,/obj/item/clothing/suit/space)) - return 0 + 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) @@ -167,12 +155,8 @@ if (!hasorgans(target)) return 0 var/obj/item/organ/external/affected = target.get_organ(target_zone) - if(affected.organ_tag == BP_HEAD) - if(target.head && istype(target.head,/obj/item/clothing/head/helmet/space)) - return 0 - else - if(target.wear_suit && istype(target.wear_suit,/obj/item/clothing/suit/space)) - return 0 + 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) @@ -212,12 +196,8 @@ if (!hasorgans(target)) return 0 var/obj/item/organ/external/affected = target.get_organ(target_zone) - if(affected.organ_tag == BP_HEAD) - if(target.head && istype(target.head,/obj/item/clothing/head/helmet/space)) - return 0 - else - if(target.wear_suit && istype(target.wear_suit,/obj/item/clothing/suit/space)) - return 0 + 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 9e8289bae4..6111e56fc8 100644 --- a/code/modules/surgery/encased.dm +++ b/code/modules/surgery/encased.dm @@ -12,12 +12,8 @@ return 0 var/obj/item/organ/external/affected = target.get_organ(target_zone) - if(affected.organ_tag == BP_HEAD) - if(target.head && istype(target.head,/obj/item/clothing/head/helmet/space)) - return 0 - else - if(target.wear_suit && istype(target.wear_suit,/obj/item/clothing/suit/space)) - return 0 + 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 f35d4bd718..93c04175d2 100644 --- a/code/modules/surgery/external_repair.dm +++ b/code/modules/surgery/external_repair.dm @@ -24,12 +24,8 @@ return 0 if (affected.robotic >= ORGAN_ROBOT) return 0 - if(affected.organ_tag == BP_HEAD) - if(target.head && istype(target.head,/obj/item/clothing/head/helmet/space)) - return 0 - else - if(target.wear_suit && istype(target.wear_suit,/obj/item/clothing/suit/space)) - 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 968b99f4f9..f871d84ec2 100644 --- a/code/modules/surgery/face.dm +++ b/code/modules/surgery/face.dm @@ -14,9 +14,8 @@ var/obj/item/organ/external/affected = target.get_organ(target_zone) if (!affected || (affected.robotic >= ORGAN_ROBOT)) return 0 - if(affected.organ_tag == BP_HEAD) - if(target.head && istype(target.head,/obj/item/clothing/head/helmet/space)) - 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 84f9b35f32..556b616cf5 100644 --- a/code/modules/surgery/generic.dm +++ b/code/modules/surgery/generic.dm @@ -20,12 +20,8 @@ return 0 if (affected.robotic >= ORGAN_ROBOT) return 0 - if(affected.organ_tag == BP_HEAD) - if(target.head && istype(target.head,/obj/item/clothing/head/helmet/space)) - return 0 - else - if(target.wear_suit && istype(target.wear_suit,/obj/item/clothing/suit/space)) - 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 9234c1b9c9..0622bcf4bc 100644 --- a/code/modules/surgery/implant.dm +++ b/code/modules/surgery/implant.dm @@ -11,12 +11,8 @@ if(!hasorgans(target)) return 0 var/obj/item/organ/external/affected = target.get_organ(target_zone) - if(affected.organ_tag == BP_HEAD) - if(target.head && istype(target.head,/obj/item/clothing/head/helmet/space)) - return 0 - else - if(target.wear_suit && istype(target.wear_suit,/obj/item/clothing/suit/space)) - return 0 + if(coverage_check(user, target, affected, tool)) + return 0 return affected && affected.open == (affected.encased ? 3 : 2) && !(affected.status & ORGAN_BLEEDING) /datum/surgery_step/cavity/proc/get_max_wclass(var/obj/item/organ/external/affected) diff --git a/code/modules/surgery/neck.dm b/code/modules/surgery/neck.dm index 9e847b6aa6..88d5053afe 100644 --- a/code/modules/surgery/neck.dm +++ b/code/modules/surgery/neck.dm @@ -14,7 +14,7 @@ var/obj/item/organ/external/affected = target.get_organ(target_zone) if (!affected || (affected.robotic >= ORGAN_ROBOT) || !(affected.open >= 3)) return 0 - if(target.head && istype(target.head,/obj/item/clothing/head/helmet/space)) + 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 ca54fbffc9..d7e3c7be55 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -10,12 +10,8 @@ return 0 var/obj/item/organ/external/affected = target.get_organ(target_zone) - if(affected.organ_tag == BP_HEAD) - if(target.head && istype(target.head,/obj/item/clothing/head/helmet/space)) - return 0 - else - if(target.wear_suit && istype(target.wear_suit,/obj/item/clothing/suit/space)) - return 0 + 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 93dd453321..411ecf75d3 100644 --- a/code/modules/surgery/other.dm +++ b/code/modules/surgery/other.dm @@ -25,12 +25,8 @@ var/obj/item/organ/external/affected = target.get_organ(target_zone) if(!affected) return - if(affected.organ_tag == BP_HEAD) - if(target.head && istype(target.head,/obj/item/clothing/head/helmet/space)) - return 0 - else - if(target.wear_suit && istype(target.wear_suit,/obj/item/clothing/suit/space)) - return 0 + 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 @@ -86,12 +82,8 @@ return 0 var/obj/item/organ/external/affected = target.get_organ(target_zone) - if(affected.organ_tag == BP_HEAD) - if(target.head && istype(target.head,/obj/item/clothing/head/helmet/space)) - return 0 - else - if(target.wear_suit && istype(target.wear_suit,/obj/item/clothing/suit/space)) - return 0 + if(coverage_check(user, target, affected, tool)) + return 0 return affected && affected.open >= 2 && (affected.status & ORGAN_DEAD) @@ -148,12 +140,8 @@ return 0 var/obj/item/organ/external/affected = target.get_organ(target_zone) - if(affected.organ_tag == BP_HEAD) - if(target.head && istype(target.head,/obj/item/clothing/head/helmet/space)) - return 0 - else - if(target.wear_suit && istype(target.wear_suit,/obj/item/clothing/suit/space)) - return 0 + 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 5aca3aa47e..3c9d2e2a1f 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -20,12 +20,8 @@ return 0 if (!(affected.robotic >= ORGAN_ROBOT)) return 0 - if(affected.organ_tag == BP_HEAD) - if(target.head && istype(target.head,/obj/item/clothing/head/helmet/space)) - return 0 - else - if(target.wear_suit && istype(target.wear_suit,/obj/item/clothing/suit/space)) - 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)