diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index 0e16bfe18ae..0cef06f2fa2 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -366,8 +366,8 @@ for(var/obj/item/organ/external/O in H.organs) total_brute += O.brute_dam total_burn += O.burn_dam - if(H.health <= config.health_threshold_dead && total_burn <= 180 && total_brute <= 180 && !H.suiciding && !ghost && tplus < tlimit && !(NOCLONE in H.mutations)) - tobehealed = health + threshold + if(total_burn <= 180 && total_brute <= 180 && !H.suiciding && !ghost && tplus < tlimit && !(NOCLONE in H.mutations)) + tobehealed = min(health + threshold, 0) // It's HILARIOUS without this min statement, let me tell you tobehealed -= 5 //They get 5 of each type of damage healed so excessive combined damage will not immediately kill them after they get revived H.adjustOxyLoss(tobehealed) H.adjustToxLoss(tobehealed) @@ -475,8 +475,8 @@ for(var/obj/item/organ/external/O in H.organs) total_brute += O.brute_dam total_burn += O.burn_dam - if(H.health <= config.health_threshold_dead && total_burn <= 180 && total_brute <= 180 && !H.suiciding && !ghost && tplus < tlimit && !(NOCLONE in H.mutations)) - tobehealed = health + threshold + if(total_burn <= 180 && total_brute <= 180 && !H.suiciding && !ghost && tplus < tlimit && !(NOCLONE in H.mutations)) + tobehealed = min(health + threshold, 0) // It's HILARIOUS without this min statement, let me tell you tobehealed -= 5 //They get 5 of each type of damage healed so excessive combined damage will not immediately kill them after they get revived H.adjustOxyLoss(tobehealed) H.adjustToxLoss(tobehealed) diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm index ae796523aa9..64a5ad53948 100644 --- a/code/game/objects/items/weapons/kitchen.dm +++ b/code/game/objects/items/weapons/kitchen.dm @@ -63,6 +63,9 @@ overlays.Cut() return + if (can_operate(M)) + do_surgery(M, user, src) + /obj/item/weapon/kitchen/utensil/fork name = "fork" desc = "It's a fork. Sure is pointy." diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm index c891c9e2cd2..28879225b39 100644 --- a/code/modules/mob/living/carbon/human/human_organs.dm +++ b/code/modules/mob/living/carbon/human/human_organs.dm @@ -150,3 +150,14 @@ var/list/all_bits = internal_organs|organs for(var/obj/item/organ/O in all_bits) O.set_dna(dna) + +/* +Given the name of an organ, returns the external organ it's contained in +I use this to standardize shadowling dethrall code +-- Crazylemon +*/ +/mob/living/carbon/human/proc/named_organ_parent(var/organ_name) + if (!(organ_name in internal_organs_by_name)) + return null + var/obj/item/organ/O = internal_organs_by_name[organ_name] + return O.parent_organ \ No newline at end of file diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index ca625443893..1c6ca1d176b 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -139,6 +139,9 @@ //robot limbs take reduced damage brute_mod = 0.66 burn_mod = 0.66 + // Robot parts also lack bones + // This is so surgery isn't kaput, let's see how this does + encased = null /**************************************************** DAMAGE PROCS @@ -820,6 +823,9 @@ Note that amputating the affected organ does in fact remove the infection from t H.drop_item() W.loc = owner +/obj/item/organ/external/proc/open_enough_for_surgery() + return (encased ? (open == 3) : (open == 2)) + /obj/item/organ/external/removed(var/mob/living/user, var/ignore_children) if(!owner) diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index 6b29f969743..96344a40a16 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -10,7 +10,7 @@ return 0 var/obj/item/organ/external/affected = target.get_organ(target_zone) - return affected && affected.open == (affected.encased ? 3 : 2) + return affected && affected.open_enough_for_surgery() ////////////////////////////////////////////////////////////////// // Dethrall Shadowling // @@ -29,25 +29,29 @@ if (!hasorgans(target)) return var/obj/item/organ/external/affected = target.get_organ(target_zone) - return ..() && affected && is_thrall(target) && affected.open == 3 && target_zone == "head" + return ..() && affected && is_thrall(target) && affected.open_enough_for_surgery() && target_zone == target.named_organ_parent("brain") begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - user.visible_message("[user] begins looking around in [target]'s head.", "You begin looking for foreign influences on [target]'s brain...") + var/braincase = target.named_organ_parent("brain") + user.visible_message("[user] begins looking around in [target]'s [braincase].", "You begin looking for foreign influences on [target]'s brain...") user << "You locate a small, pulsing black tumor on the side of [target]'s brain and begin to remove it." - target << "A small part of your head pulses with agony as the light impacts it." - user.visible_message("[user] begins removing something from [target]'s head.", \ + target << "A small part of your [braincase] pulses with agony as the light impacts it." + user.visible_message("[user] begins removing something from [target]'s [braincase].", \ "You begin carefully extracting the tumor...") ..() end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/braincase = target.named_organ_parent("brain") user.visible_message("[user] carefully extracts the tumor from [target]'s brain!", \ - "You extract the black tumor from [target]'s head. It quickly shrivels and burns away.") + "You extract the black tumor from [target]'s [braincase]. It quickly shrivels and burns away.") ticker.mode.remove_thrall(target.mind,0) fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + var/braincase = target.named_organ_parent("brain") if(prob(50)) - user.visible_message("[user] slips and rips the tumor out from [target]'s head!", \ + user.visible_message("[user] slips and rips the tumor out from [target]'s [braincase]!", \ "You fumble and tear out [target]'s tumor!") + target.adjustBrainLoss(150) // This is so you can't just defib'n go ticker.mode.remove_thrall(target.mind,1) else user.visible_message("[user]'s hand slips and fumbles! Luckily, they didn't damage anything!") @@ -75,7 +79,7 @@ if (!hasorgans(target)) return var/obj/item/organ/external/affected = target.get_organ(target_zone) - return ..() && affected && embryo && affected.open == 3 && target_zone == "chest" + return ..() && affected && embryo && affected.open_enough_for_surgery() && target_zone == "chest" begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/msg = "[user] starts to pull something out from [target]'s ribcage with \the [tool]." @@ -113,7 +117,7 @@ return var/is_organ_damaged = 0 for(var/obj/item/organ/I in affected.internal_organs) - if(I.damage > 0) + if(I.damage > 0 && I.robotic < 2) is_organ_damaged = 1 break return ..() && is_organ_damaged diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm index df0e5608221..fa6fd6f215f 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -3,25 +3,34 @@ // COMMON STEPS // ////////////////////////////////////////////////////////////////// -/datum/surgery_step/robotics/ +/datum/surgery_step/robotics can_infect = 0 - can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - if (isslime(target)) - return 0 - if (target_zone == "eyes") //there are specific steps for eye surgery - return 0 - if (!hasorgans(target)) - return 0 - var/obj/item/organ/external/affected = target.get_organ(target_zone) - if (affected == null) - return 0 - if (affected.status & ORGAN_DESTROYED) - return 0 - if (!(affected.status & ORGAN_ROBOT)) - return 0 - return 1 -/datum/surgery_step/robotics/unscrew_hatch +/datum/surgery_step/robotics/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if (isslime(target)) + return 0 + if (target_zone == "eyes") //there are specific steps for eye surgery + return 0 + if (!hasorgans(target)) + return 0 + var/obj/item/organ/external/affected = target.get_organ(target_zone) + if (affected == null) + return 0 + if (affected.status & ORGAN_DESTROYED) + return 0 + return 1 + +/datum/surgery_step/robotics/external + +/datum/surgery_step/robotics/external/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) + if (!..()) + return 0 + var/obj/item/organ/external/affected = target.get_organ(target_zone) + if (!(affected.status & ORGAN_ROBOT)) + return 0 + return 1 + +/datum/surgery_step/robotics/external/unscrew_hatch allowed_tools = list( /obj/item/weapon/screwdriver = 100, /obj/item/weapon/coin = 50, @@ -53,7 +62,7 @@ user.visible_message("\red [user]'s [tool.name] slips, failing to unscrew [target]'s [affected.name].", \ "\red Your [tool] slips, failing to unscrew [target]'s [affected.name].") -/datum/surgery_step/robotics/open_hatch +/datum/surgery_step/robotics/external/open_hatch allowed_tools = list( /obj/item/weapon/retractor = 100, /obj/item/weapon/crowbar = 100, @@ -85,7 +94,7 @@ user.visible_message("\red [user]'s [tool.name] slips, failing to open the hatch on [target]'s [affected.name].", "\red Your [tool] slips, failing to open the hatch on [target]'s [affected.name].") -/datum/surgery_step/robotics/close_hatch +/datum/surgery_step/robotics/external/close_hatch allowed_tools = list( /obj/item/weapon/retractor = 100, /obj/item/weapon/crowbar = 100, @@ -118,7 +127,7 @@ user.visible_message("\red [user]'s [tool.name] slips, failing to close the hatch on [target]'s [affected.name].", "\red Your [tool.name] slips, failing to close the hatch on [target]'s [affected.name].") -/datum/surgery_step/robotics/repair_brute +/datum/surgery_step/robotics/external/repair_brute allowed_tools = list( /obj/item/weapon/weldingtool = 100, /obj/item/weapon/gun/energy/plasmacutter = 50 @@ -154,7 +163,7 @@ "\red Your [tool.name] slips, damaging the internal structure of [target]'s [affected.name].") target.apply_damage(rand(5,10), BURN, affected) -/datum/surgery_step/robotics/repair_burn +/datum/surgery_step/robotics/external/repair_burn allowed_tools = list( /obj/item/stack/cable_coil = 100 ) @@ -215,7 +224,7 @@ if(I.damage > 0 && I.robotic >= 2) is_organ_damaged = 1 break - return affected.open == 2 && is_organ_damaged + return affected.open_enough_for_surgery() && is_organ_damaged begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -276,7 +285,7 @@ var/obj/item/organ/external/affected = target.get_organ(target_zone) if(!(affected && (affected.status & ORGAN_ROBOT))) return 0 - if(affected.open != 2) + if(!affected.open_enough_for_surgery()) return 0 target.op_stage.current_organ = null @@ -325,7 +334,7 @@ var/obj/item/organ/external/affected = target.get_organ(target_zone) if(!(affected && (affected.status & ORGAN_ROBOT))) return 0 - if(affected.open != 2) + if(!affected.open_enough_for_surgery()) return 0 target.op_stage.current_organ = null @@ -375,7 +384,7 @@ var/obj/item/device/mmi/M = tool var/obj/item/organ/external/affected = target.get_organ(target_zone) - if(!(affected && affected.open == 2)) + if(!(affected && affected.open_enough_for_surgery())) return 0 if(!istype(M))