From ce2871bc2b44146c2a168d796772e0a07169aff6 Mon Sep 17 00:00:00 2001 From: Anthony Rodriguez Date: Mon, 14 Jun 2021 17:02:56 -0700 Subject: [PATCH] Porting Over De-Husking Surgery --- .../objects/items/weapons/surgery_tools.dm | 10 ++ code/modules/surgery/external_repair.dm | 4 +- code/modules/surgery/other.dm | 154 ++++++++++++++++++ icons/obj/surgery.dmi | Bin 45013 -> 45720 bytes maps/tether/tether-03-surface3.dmm | 12 ++ 5 files changed, 178 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm index 15bb7cd0e51..5e1d6ceae33 100644 --- a/code/game/objects/items/weapons/surgery_tools.dm +++ b/code/game/objects/items/weapons/surgery_tools.dm @@ -22,6 +22,16 @@ return 0 ..() +/* + * Bio-Regenerator + */ +/obj/item/weapon/surgical/bioregen + name="bioregenerator" + desc="A special tool used in surgeries which can pull toxins from and restore oxygen to organic tissue as well as recreate missing biological structures to allow otherwise irreperable flesh to be mended." + icon='icons/obj/surgery.dmi' + icon_state="bioregen" + drop_sound = 'sound/items/drop/scrap.ogg' + /* * Retractor */ diff --git a/code/modules/surgery/external_repair.dm b/code/modules/surgery/external_repair.dm index 4f8707e82d9..5fbb94030b8 100644 --- a/code/modules/surgery/external_repair.dm +++ b/code/modules/surgery/external_repair.dm @@ -128,7 +128,7 @@ user.visible_message("[user] finishes taping up [target]'s [affected] with \the [tool].", \ "You finish taping up [target]'s [affected] with \the [tool].") affected.createwound(BRUISE, 10) - affected.heal_damage(0, 25, 0, 0) + affected.heal_damage(0, 50, 0, 0) //Up from 25 if(!(affected.burn_dam)) affected.burn_stage = 0 if(istype(tool, /obj/item/stack)) @@ -194,7 +194,7 @@ user.visible_message("[user] finishes taping up [target]'s [affected] with \the [tool].", \ "You finish taping up [target]'s [affected] with \the [tool].") affected.createwound(BRUISE, 10) - affected.heal_damage(25, 0, 0, 0) + affected.heal_damage(50, 0, 0, 0) //Up from 25 if(!(affected.brute_dam)) affected.brute_stage = 0 if(istype(tool, /obj/item/stack)) diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm index fe7d004dc4d..9cde26f240f 100644 --- a/code/modules/surgery/other.dm +++ b/code/modules/surgery/other.dm @@ -232,3 +232,157 @@ /datum/surgery_step/hardsuit/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) user.visible_message("[user]'s [tool] can't quite seem to get through the metal...", \ "\The [tool] can't quite seem to get through the metal. It's weakening, though - try again.") + +/////////////////////////////////////////// +// De-Husking Surgery // +///////////////////////////////////////// + +/datum/surgery_status/ + var/dehusk = 0 + +/datum/surgery_step/dehusk/ + priority = 1 + can_infect = 0 + blood_level = 1 + +/datum/surgery_step/dehusk/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 || (affected.robotic >= ORGAN_ROBOT)) + return 0 + if(coverage_check(user,target,affected,tool)) + return 0 + return target_zone == BP_TORSO && (HUSK in target.mutations) + +/datum/surgery_step/dehusk/structinitial + allowed_tools = list( + /obj/item/weapon/surgical/bioregen = 100 + ) + min_duration = 90 + max_duration = 120 + +/datum/surgery_step/dehusk/structinitial/can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + return ..() && target.op_stage.dehusk == 0 + +/datum/surgery_step/dehusk/structinitial/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("[user] begins to create a fleshy but rigid looking mesh over gaps in [target]'s flesh with \the [tool].", \ + "You begin to create a fleshy but rigid looking mesh over gaps in [target]'s flesh with \the [tool].") + ..() + +/datum/surgery_step/dehusk/structinitial/end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("[user] creates a fleshy but rigid looking mesh over gaps in [target]'s flesh with \the [tool].", \ + "You create a fleshy but rigid looking mesh over gaps in [target]'s flesh with \the [tool].") + target.op_stage.dehusk = 1 + ..() + +/datum/surgery_step/dehusk/structinitial/fail_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]'s hand slips, and the mesh falls, with \the [tool] scraping [target]'s body.", \ + "Your hand slips, and the mesh falls, with \the [tool] scraping [target]'s body.") + affected.createwound(CUT, 15) + affected.createwound(BRUISE, 10) + ..() + +/datum/surgery_step/dehusk/relocateflesh + allowed_tools = list( + /obj/item/weapon/surgical/hemostat = 100, \ + /obj/item/stack/cable_coil = 75, \ + /obj/item/device/assembly/mousetrap = 20 + ) + min_duration = 90 + max_duration = 120 + +/datum/surgery_step/dehusk/relocateflesh/can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + return ..() && target.op_stage.dehusk == 1 + +/datum/surgery_step/dehusk/relocateflesh/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("[user] begins to relocate some of [target]'s flesh with \the [tool], using it to fill in gaps.", \ + "You begin to relocate some of [target]'s flesh with \the [tool], using it to fill in gaps.") + ..() + +/datum/surgery_step/dehusk/relocateflesh/end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("[user] relocates some of [target]'s flesh with \the [tool], using it to fill in gaps.", \ + "You relocate some of [target]'s flesh with \the [tool], using it to fill in gaps.") + target.op_stage.dehusk = 2 + ..() + +/datum/surgery_step/dehusk/relocateflesh/fail_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] accidentally rips a massive chunk out of [target]'s flesh with \the [tool], causing massive damage.", \ + "You accidentally rip a massive chunk out of [target]'s flesh with \the [tool], causing massive damage.") + affected.createwound(CUT, 25) + affected.createwound(BRUISE, 10) + ..() + +/datum/surgery_step/dehusk/structfinish + allowed_tools = list( + /obj/item/weapon/surgical/bioregen = 100, \ + /obj/item/weapon/surgical/FixOVein = 30 + ) + min_duration = 90 + max_duration = 120 + +/datum/surgery_step/dehusk/structfinish/can_use(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + return ..() && target.op_stage.dehusk == 2 + +/datum/surgery_step/dehusk/structfinish/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if(istype(tool,/obj/item/weapon/surgical/bioregen)) + user.visible_message("[user] begins to recreate blood vessels and fill in the gaps in [target]'s flesh with \the [tool].", \ + "You begin to recreate blood vessels and fill in the gaps in [target]'s flesh with \the [tool].") + else if(istype(tool,/obj/item/weapon/surgical/FixOVein)) + user.visible_message("[user] attempts to recreate blood vessels and fill in the gaps in [target]'s flesh with \the [tool].", \ + "You attempt to recreate blood vessels and fill in the gaps in [target]'s flesh with \the [tool].") + ..() + +/datum/surgery_step/dehusk/structfinish/end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("[user] finishes recreating the missing biological structures and filling in gaps in [target]'s flesh with \the [tool].", \ + "You finish recreating the missing biological structures and filling in gaps in [target]'s flesh with \the [tool].") + target.op_stage.dehusk = 0 + target.mutations.Remove(HUSK) + target.status_flags &= ~DISFIGURED + target.update_icons_body() + ..() + +/datum/surgery_step/dehusk/structfinish/fail_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/obj/item/organ/external/affected = target.get_organ(target_zone) + if(istype(tool,/obj/item/weapon/surgical/bioregen)) + user.visible_message("[user]'s hand slips, causing \the [tool] to scrape [target]'s body.", \ + "Your hand slips, causing \the [tool] to scrape [target]'s body.") + else if(istype(tool,/obj/item/weapon/surgical/FixOVein)) + user.visible_message("[user] fails to finish the structure over the gaps in [target]'s flesh, doing more damage than good.", \ + "You fail to finish the structure over the gaps in [target]'s flesh, doing more damage than good.") + affected.createwound(CUT, 15) + affected.createwound(BRUISE, 10) + ..() + +/datum/surgery_step/internal/detoxify + blood_level = 1 + allowed_tools = list(/obj/item/weapon/surgical/bioregen=100) + min_duration = 90 + max_duration = 120 + +/datum/surgery_step/internal/detoxify/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + return ..() && target_zone == BP_TORSO && (target.toxloss > 25 || target.oxyloss > 25) + +/datum/surgery_step/internal/detoxify/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("[user] begins to pull toxins from, and restore oxygen to [target]'s musculature and organs with \the [tool].", \ + "You begin to pull toxins from, and restore oxygen to [target]'s musculature and organs with \the [tool].") + ..() + +/datum/surgery_step/internal/detoxify/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("[user] finishes pulling toxins from, and restoring oxygen to [target]'s musculature and organs with \the [tool].", \ + "You finish pulling toxins from, and restoring oxygen to [target]'s musculature and organs with \the [tool].") + if(target.toxloss>25) + target.adjustToxLoss(-20) + if(target.oxyloss>25) + target.adjustOxyLoss(-20) + ..() + +/datum/surgery_step/internal/detoxify/fail_step(mob/living/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]'s hand slips, failing to finish the surgery, and damaging [target] with \the [tool].", \ + "Your hand slips, failing to finish the surgery, and damaging [target] with \the [tool].") + affected.createwound(CUT, 15) + affected.createwound(BRUISE, 10) + ..() \ No newline at end of file diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 0f22fa82cd3d1da8df12ff682086a9981bfc3912..d6de460866b160dd08080cb86aa4300b5db52e0a 100644 GIT binary patch delta 7286 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