From 437aad2d778dcf6ed1a1111d45c4f9179a95de90 Mon Sep 17 00:00:00 2001 From: Mechoid Date: Mon, 5 Mar 2018 17:46:05 -0800 Subject: [PATCH] Adds a Frankenstein Surgical Procedure (#4990) * Makes a Surgery for Frankensteining * Fix a thing. * Tweak things! * Sickness not permanent, Recovery is. --- code/modules/mob/_modifiers/cloning.dm | 63 +++++ code/modules/surgery/neck.dm | 247 ++++++++++++++++++ code/modules/surgery/surgery.dm | 1 + .../Mechoid - RecapitationSurgery.yml | 8 + polaris.dme | 1 + 5 files changed, 320 insertions(+) create mode 100644 code/modules/surgery/neck.dm create mode 100644 html/changelogs/Mechoid - RecapitationSurgery.yml diff --git a/code/modules/mob/_modifiers/cloning.dm b/code/modules/mob/_modifiers/cloning.dm index c3f8827f7b6..76aeabd50c2 100644 --- a/code/modules/mob/_modifiers/cloning.dm +++ b/code/modules/mob/_modifiers/cloning.dm @@ -61,3 +61,66 @@ outgoing_melee_damage_percent = 0.5 //50% less outgoing melee damage. attack_speed_percent = 1.2 //20% slower attack speed. + +////////////////////// +//Surgical Modifiers// As of writing, limited to the 'Frankenstein' modifier. +////////////////////// + +/datum/modifier/franken_sickness + name = "surgically attached brain" + desc = "You feel weak, as your central nervous system is still recovering from being repaired." + + on_created_text = "You feel... off, and your head hurts." + on_expired_text = "You feel some strength returning to you." + + max_health_percent = 0.9 // -10% max health. + incoming_damage_percent = 1.1 // 10% more incoming damage. + incoming_hal_damage_percent = 1.5 // 50% more halloss damage, stacking on the previous 1.1 widespread. + outgoing_melee_damage_percent = 0.9 // 10% less melee damage. + disable_duration_percent = 1.25 // Stuns last 25% longer. + incoming_healing_percent = 0.9 // -10% to all healing + slowdown = 0.5 // Slower, by a smidge. + evasion = -5 // 5% easier to hit. + accuracy_dispersion = 1 // Inaccurate trait level of tile dispersion. + + stacks = MODIFIER_STACK_ALLOWED //You have somehow had the surgery done twice. Your brain is very, very fucked, but I won't say no. + +/datum/modifier/franken_sickness/can_apply(var/mob/living/L) + if(!ishuman(L)) + return FALSE + if(L.isSynthetic()) //Nonhumans and Machines cannot be Frankensteined, at this time. + return FALSE + + return ..() + +/datum/modifier/franken_sickness/tick() + if(holder.stat != DEAD) + if(istype(holder, /mob/living/carbon/human)) + var/mob/living/carbon/human/F = holder + if(F.can_defib) + F.can_defib = 0 + +/datum/modifier/franken_sickness/on_expire() //Not permanent, but its child is. + holder.add_modifier(/datum/modifier/franken_recovery, 0) + +/datum/modifier/franken_recovery //When Franken_Sickness expires, this will be permanently applied in its place. + name = "neural recovery" + desc = "You feel out of touch, as your central nervous system is still recovering from being repaired." + + on_created_text = "You feel... off. Everything is fuzzy." + on_expired_text = "You feel your senses returning to you." + + incoming_hal_damage_percent = 1.5 // 50% more halloss damage. + disable_duration_percent = 1.25 // Stuns last 25% longer. + evasion = -5 // 5% easier to hit. + accuracy_dispersion = 1 // Inaccurate trait level of tile dispersion. + + stacks = MODIFIER_STACK_ALLOWED + +/datum/modifier/franken_recovery/can_apply(var/mob/living/L) + if(!ishuman(L)) + return FALSE + if(L.isSynthetic()) //Nonhumans and Machines cannot be Frankensteined, at this time. + return FALSE + + return ..() diff --git a/code/modules/surgery/neck.dm b/code/modules/surgery/neck.dm new file mode 100644 index 00000000000..6cd347586b2 --- /dev/null +++ b/code/modules/surgery/neck.dm @@ -0,0 +1,247 @@ +//Procedures in this file: Brain-stem reattachment surgery. +////////////////////////////////////////////////////////////////////// +// BRAINSTEM SURGERY // +////////////////////////////////////////////////////////////////////// + +/datum/surgery_step/brainstem + priority = 2 + req_open = 1 + can_infect = 1 + +/datum/surgery_step/brainstem/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) || !(affected.open >= 3)) + return 0 + return target_zone == BP_HEAD + +///////////////////////////// +// Blood Vessel Mending +///////////////////////////// + +/datum/surgery_step/brainstem/mend_vessels + priority = 1 + allowed_tools = list( + /obj/item/weapon/surgical/FixOVein = 100, + /obj/item/stack/nanopaste = 50, + /obj/item/stack/cable_coil = 40, + /obj/item/device/assembly/mousetrap = 5) + + min_duration = 80 + max_duration = 100 + +/datum/surgery_step/brainstem/mend_vessels/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + return ..() && target_zone == BP_HEAD && target.op_stage.brainstem == 0 + +/datum/surgery_step/brainstem/mend_vessels/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("[user] starts to mend the blood vessels on [target]'s brainstem with \the [tool].", \ + "You start to mend the blood vessels on [target]'s brainstem with \the [tool].") + ..() + +/datum/surgery_step/brainstem/mend_vessels/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("[user] has mended the blood vessels on [target]'s brainstem with \the [tool]." , \ + " You have mended the blood vessels on [target]'s brainstem with \the [tool].",) + target.op_stage.brainstem = 1 + +/datum/surgery_step/brainstem/mend_vessels/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, tearing at [target]'s brainstem with \the [tool]!" , \ + "Your hand slips, tearing at [target]'s brainstem with \the [tool]!" ) + affected.createwound(PIERCE, 10) + target.AdjustParalysis(10) + +///////////////////////////// +// Bone Drilling +///////////////////////////// + +/datum/surgery_step/brainstem/drill_vertebrae + priority = 3 //Do this instead of expanding the skull cavity + allowed_tools = list( + /obj/item/weapon/surgical/surgicaldrill = 100, + /obj/item/weapon/screwdriver = 75, + /obj/item/weapon/melee/changeling/arm_blade = 15, + /obj/item/weapon/pickaxe = 5) + + min_duration = 200 //Very. Very. Carefully. + max_duration = 300 + +/datum/surgery_step/brainstem/drill_vertebrae/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + return ..() && target_zone == BP_HEAD && target.op_stage.brainstem == 1 + +/datum/surgery_step/brainstem/drill_vertebrae/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("[user] starts to drill around [target]'s brainstem with \the [tool].", \ + "You start to drill around [target]'s brainstem with \the [tool].") + ..() + +/datum/surgery_step/brainstem/drill_vertebrae/end_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] has drilled around [target]'s brainstem with \the [tool]." , \ + " You have drilled around [target]'s brainstem with \the [tool].",) + target.AdjustParalysis(10) //We're getting Invasive here. This only ticks down when the person is alive, so it's a good side-effect for this step. Rattling the braincase with a drill is not optimal. + target.op_stage.brainstem = 2 + affected.fracture() //Does not apply damage, simply breaks it if it wasn't already. Doesn't stop a defib on its own. + +/datum/surgery_step/brainstem/drill_vertebrae/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, shredding [target]'s brainstem with \the [tool]!" , \ + "Your hand slips, shredding [target]'s brainstem with \the [tool]!" ) + affected.createwound(PIERCE, 10) + target.AdjustParalysis(15) + spawn() + for(var/obj/item/organ/internal/brain/O in affected.internal_organs) + O.take_damage(rand(5,10)) + +///////////////////////////// +// Bone Cleaning +///////////////////////////// + +/datum/surgery_step/brainstem/clean_chips + priority = 3 //Do this instead of picking around for implants. + allowed_tools = list( + /obj/item/weapon/surgical/hemostat = 100, + /obj/item/weapon/wirecutters = 60, + /obj/item/weapon/melee/changeling/claw = 40) //Surprisingly, claws are kind of okay at picking things out. + + min_duration = 90 + max_duration = 120 + +/datum/surgery_step/brainstem/clean_chips/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + return ..() && target_zone == BP_HEAD && target.op_stage.brainstem == 2 + +/datum/surgery_step/brainstem/clean_chips/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("[user] starts to pick around [target]'s brainstem for bone chips with \the [tool].", \ + "You start to pick around [target]'s brainstem for bone chips with \the [tool].") + ..() + +/datum/surgery_step/brainstem/clean_chips/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("[user] has cleaned around [target]'s brainstem with \the [tool]." , \ + " You have cleaned around [target]'s brainstem with \the [tool].",) + target.AdjustParalysis(10) //Still invasive. + target.op_stage.brainstem = 3 + +/datum/surgery_step/brainstem/clean_chips/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, gouging [target]'s brainstem with \the [tool]!" , \ + "Your hand slips, gouging [target]'s brainstem with \the [tool]!" ) + affected.createwound(CUT, 5) + target.AdjustParalysis(10) + spawn() + for(var/obj/item/organ/internal/brain/O in affected.internal_organs) //If there's more than one... + O.take_damage(rand(1,10)) + +///////////////////////////// +// Spinal Cord Repair +///////////////////////////// + +/datum/surgery_step/brainstem/mend_cord + priority = 1 //Do this after IB. + allowed_tools = list( + /obj/item/weapon/surgical/FixOVein = 100, + /obj/item/stack/nanopaste = 50, + /obj/item/stack/cable_coil = 40, + /obj/item/device/assembly/mousetrap = 5) + + min_duration = 100 + max_duration = 200 + +/datum/surgery_step/brainstem/mend_cord/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + return ..() && target_zone == BP_HEAD && target.op_stage.brainstem == 3 + +/datum/surgery_step/brainstem/mend_cord/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("[user] starts to fuse [target]'s spinal cord with \the [tool].", \ + "You start to fuse [target]'s spinal cord with \the [tool].") + ..() + +/datum/surgery_step/brainstem/mend_cord/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("[user] has fused [target]'s spinal cord with \the [tool]." , \ + " You have fused [target]'s spinal cord with \the [tool].",) + target.op_stage.brainstem = 4 + target.AdjustParalysis(5) + target.add_modifier(/datum/modifier/franken_sickness, 20 MINUTES) + +/datum/surgery_step/brainstem/mend_cord/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, tearing at [target]'s spinal cord with \the [tool]!" , \ + "Your hand slips, tearing at [target]'s spinal cord with \the [tool]!" ) + affected.createwound(PIERCE, 5) + target.AdjustParalysis(20) + spawn() + for(var/obj/item/organ/internal/brain/O in affected.internal_organs) + O.take_damage(rand(5,15)) //Down to the wire. Or rather, the cord. + +///////////////////////////// +// Vertebrae repair +///////////////////////////// + +/datum/surgery_step/brainstem/mend_vertebrae + priority = 3 //Do this instead of fixing bones. + allowed_tools = list( + /obj/item/weapon/surgical/bonegel = 100, + /obj/item/stack/nanopaste = 50, + /obj/item/weapon/tape_roll = 5) + + min_duration = 100 + max_duration = 160 + +/datum/surgery_step/brainstem/mend_vertebrae/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + return ..() && target_zone == BP_HEAD && target.op_stage.brainstem == 4 + +/datum/surgery_step/brainstem/mend_vertebrae/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("[user] starts to mend [target]'s opened vertebrae with \the [tool].", \ + "You start to mend [target]'s opened vertebrae with \the [tool].") + ..() + +/datum/surgery_step/brainstem/mend_vertebrae/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("[user] has mended [target]'s vertebrae with \the [tool]." , \ + " You have mended [target]'s vertebrae with \the [tool].",) + target.can_defib = 1 + target.op_stage.brainstem = 5 + +/datum/surgery_step/brainstem/mend_vertebrae/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, tearing at [target]'s spinal cord with \the [tool]!" , \ + "Your hand slips, tearing at [target]'s spinal cord with \the [tool]!" ) + affected.createwound(PIERCE, 5) + target.AdjustParalysis(15) + spawn() + for(var/obj/item/organ/internal/brain/O in affected.internal_organs) + O.take_damage(rand(1,10)) + +///////////////////////////// +// Realign tissues +///////////////////////////// + +/datum/surgery_step/brainstem/realign_tissue + priority = 3 //Do this instead of searching for objects in the skull. + allowed_tools = list( + /obj/item/weapon/surgical/hemostat = 100, + /obj/item/weapon/wirecutters = 60, + /obj/item/weapon/melee/changeling/claw = 20) //Claws. Good for digging, not so much for moving. + + min_duration = 90 + max_duration = 120 + +/datum/surgery_step/brainstem/realign_tissue/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + return ..() && target_zone == BP_HEAD && target.op_stage.brainstem == 5 + +/datum/surgery_step/brainstem/realign_tissue/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("[user] starts to realign the tissues in [target]'s skull with \the [tool].", \ + "You start to realign the tissues in [target]'s skull with \the [tool].") + ..() + +/datum/surgery_step/brainstem/realign_tissue/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + user.visible_message("[user] has realigned the tissues in [target]'s skull back into place with \the [tool]." , \ + " You have realigned the tissues in [target]'s skull back into place with \the [tool].",) + target.AdjustParalysis(5) //I n v a s i v e + target.op_stage.brainstem = 0 //The cycle begins anew. + +/datum/surgery_step/brainstem/realign_tissue/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, gouging [target]'s brainstem with \the [tool]!" , \ + "Your hand slips, gouging [target]'s brainstem with \the [tool]!" ) + affected.createwound(CUT, 5) + target.AdjustParalysis(30) + spawn() + for(var/obj/item/organ/internal/brain/O in affected.internal_organs) + O.take_damage(rand(1,10)) diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index 1dac70fea5f..b06221e5c9d 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -163,6 +163,7 @@ /datum/surgery_status/ var/eyes = 0 var/face = 0 + var/brainstem = 0 var/head_reattach = 0 var/current_organ = "organ" var/list/in_progress = list() \ No newline at end of file diff --git a/html/changelogs/Mechoid - RecapitationSurgery.yml b/html/changelogs/Mechoid - RecapitationSurgery.yml new file mode 100644 index 00000000000..5ca75eff802 --- /dev/null +++ b/html/changelogs/Mechoid - RecapitationSurgery.yml @@ -0,0 +1,8 @@ + +author: Mechoid + +delete-after: True + +changes: + - rscadd: "Add a surgical operation for repairing the brainstem of a decapitated individual." + - rscadd: "Add a permanent modifier for frankensteining individuals." diff --git a/polaris.dme b/polaris.dme index 56a44c8ed1e..2c3ea5bca62 100644 --- a/polaris.dme +++ b/polaris.dme @@ -2289,6 +2289,7 @@ #include "code\modules\surgery\generic.dm" #include "code\modules\surgery\implant.dm" #include "code\modules\surgery\limb_reattach.dm" +#include "code\modules\surgery\neck.dm" #include "code\modules\surgery\organs_internal.dm" #include "code\modules\surgery\other.dm" #include "code\modules\surgery\robotics.dm"