From 53f410272a900ff04b74f321a17103c82ed809d1 Mon Sep 17 00:00:00 2001 From: Aurorablade Date: Tue, 26 Jan 2016 20:53:13 -0500 Subject: [PATCH] home streach. --- code/datums/datumvars.dm | 5 +- .../carbon/alien/humanoid/alien_powers.dm | 2 +- code/modules/projectiles/guns/mounted.dm | 5 +- code/modules/surgery/bones.dm | 14 +- code/modules/surgery/encased.dm | 10 +- code/modules/surgery/face.dm | 17 +- code/modules/surgery/generic.dm | 126 ++---- code/modules/surgery/implant.dm | 62 ++- code/modules/surgery/limb_reattach.dm | 7 +- .../surgery/organs/augments_internal.dm | 2 +- code/modules/surgery/organs/organ.dm | 12 +- code/modules/surgery/organs/organ_internal.dm | 46 +- code/modules/surgery/organs/subtypes/xenos.dm | 10 +- code/modules/surgery/organs_internal.dm | 418 +----------------- code/modules/surgery/other.dm | 60 ++- code/modules/surgery/robotics.dm | 28 +- code/modules/surgery/slime.dm | 3 - code/modules/surgery/surgery.dm | 18 +- code/modules/surgery/tools.dm | 10 +- icons/mob/inhands/guns_lefthand.dmi | Bin 41214 -> 41215 bytes icons/mob/inhands/guns_righthand.dmi | Bin 41560 -> 41561 bytes icons/obj/gun.dmi | Bin 80196 -> 80216 bytes 22 files changed, 260 insertions(+), 595 deletions(-) diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 1e217acf30a..bc2d1e737ba 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -1,4 +1,3 @@ - // reference: /client/proc/modify_variables(var/atom/O, var/param_var_name = null, var/autodetect_class = 0) client @@ -993,8 +992,8 @@ client if(locate(new_organ) in M.internal_organs) usr << "Mob already has that organ." return - - new new_organ(M) + var/obj/item/organ/internal/organ = new new_organ + organ.insert(M) message_admins("[key_name_admin(usr)] has given [key_name_admin(M)] the organ [new_organ]") log_admin("[key_name(usr)] has given [key_name(M)] the organ [new_organ]") diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm index ce95c4dd791..17680b80f56 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm @@ -6,7 +6,7 @@ These are general powers. Specific powers are stored under the appropriate alien Doesn't work on other aliens/AI.*/ -/mob/living/carbon/alien/proc/powerc(X, Y)//Y is optional, checks for weed planting. X can be null. +/mob/living/carbon/proc/powerc(X, Y)//Y is optional, checks for weed planting. X can be null. if(stat) src << "You must be conscious to do this." return 0 diff --git a/code/modules/projectiles/guns/mounted.dm b/code/modules/projectiles/guns/mounted.dm index 4cb965f3727..551d56bc4f8 100644 --- a/code/modules/projectiles/guns/mounted.dm +++ b/code/modules/projectiles/guns/mounted.dm @@ -1,7 +1,9 @@ /obj/item/weapon/gun/energy/gun/advtaser/mounted name = "mounted taser" desc = "An arm mounted dual-mode weapon that fires electrodes and disabler shots." - icon_state = "armcannon" + icon_state = "armcannon_stun" + item_state = "armcannonstun" + modifystate = "armcannon_stun" force = "5" self_recharge = 1 flags = NODROP @@ -17,6 +19,7 @@ desc = "An arm mounted cannon that fires lethal lasers. Doesn't come with a charge beam." icon_state = "armcannon" item_state = "armcannonlase" + modifystate = "armcannon" force = "5" self_recharge = 1 flags = NODROP diff --git a/code/modules/surgery/bones.dm b/code/modules/surgery/bones.dm index 63d956e99c5..c26689a9675 100644 --- a/code/modules/surgery/bones.dm +++ b/code/modules/surgery/bones.dm @@ -16,6 +16,8 @@ //surgery steps /datum/surgery_step/glue_bone + name = "mend bone" + allowed_tools = list( /obj/item/weapon/bonegel = 100, \ /obj/item/weapon/screwdriver = 75 @@ -23,7 +25,6 @@ can_infect = 1 blood_level = 1 - min_duration = 50 max_duration = 60 /datum/surgery_step/glue_bone/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -53,12 +54,13 @@ return 0 /datum/surgery_step/set_bone + name = "set bone" + allowed_tools = list( /obj/item/weapon/bonesetter = 100, \ /obj/item/weapon/wrench = 75 \ ) - min_duration = 60 max_duration = 70 /datum/surgery_step/set_bone/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -82,7 +84,7 @@ else user.visible_message("\blue [user] sets the bone in [target]'s [affected.name]\red in the WRONG place with \the [tool].", \ "\blue You set the bone in [target]'s [affected.name]\red in the WRONG place with \the [tool].") - affected.fracture() + affected.fracture()//can i remove this please? return 0 /datum/surgery_step/set_bone/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -93,12 +95,13 @@ return 0 /datum/surgery_step/mend_skull + name = "mend skull" + allowed_tools = list( /obj/item/weapon/bonesetter = 100, \ /obj/item/weapon/wrench = 75 \ ) - min_duration = 60 max_duration = 70 /datum/surgery_step/mend_skull/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -128,6 +131,8 @@ return 0 /datum/surgery_step/finish_bone + name = "medicate bones" + allowed_tools = list( /obj/item/weapon/bonegel = 100, \ /obj/item/weapon/screwdriver = 75 @@ -135,7 +140,6 @@ can_infect = 1 blood_level = 1 - min_duration = 50 max_duration = 60 /datum/surgery_step/finish_bone/can_use(mob/living/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 d7caa513a5c..46d65e8b149 100644 --- a/code/modules/surgery/encased.dm +++ b/code/modules/surgery/encased.dm @@ -17,13 +17,13 @@ /datum/surgery_step/open_encased/saw + name = "saw bone" allowed_tools = list( /obj/item/weapon/circular_saw = 100, \ /obj/item/weapon/melee/energy/sword/cyborg/saw = 100, \ /obj/item/weapon/hatchet = 75 ) - min_duration = 50 max_duration = 70 /datum/surgery_step/open_encased/saw/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) @@ -70,12 +70,13 @@ /datum/surgery_step/open_encased/retract + name = "retract bone" allowed_tools = list( + /obj/item/weapon/scalpel/manager = 120, \ /obj/item/weapon/retractor = 100, \ /obj/item/weapon/crowbar = 75 ) - min_duration = 30 max_duration = 40 /datum/surgery_step/open_encased/retract/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) @@ -130,12 +131,13 @@ return 0 /datum/surgery_step/open_encased/close + name = "unretract bone" //i suck at names okay? give me a new one allowed_tools = list( + /obj/item/weapon/scalpel/manager = 120, \ /obj/item/weapon/retractor = 100, \ /obj/item/weapon/crowbar = 75 ) - min_duration = 20 max_duration = 40 /datum/surgery_step/open_encased/close/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) @@ -187,12 +189,12 @@ return 0 /datum/surgery_step/open_encased/mend + name = "mend bone" allowed_tools = list( /obj/item/weapon/bonegel = 100, \ /obj/item/weapon/screwdriver = 75 ) - min_duration = 20 max_duration = 40 /datum/surgery_step/open_encased/mend/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) diff --git a/code/modules/surgery/face.dm b/code/modules/surgery/face.dm index 4f39d969232..3ab54efc376 100644 --- a/code/modules/surgery/face.dm +++ b/code/modules/surgery/face.dm @@ -20,13 +20,17 @@ return target_zone == "mouth" /datum/surgery_step/generic/cut_face + name = "make incision" allowed_tools = list( + /obj/item/weapon/scalpel/laser3 = 115, \ + /obj/item/weapon/scalpel/laser2 = 110, \ + /obj/item/weapon/scalpel/laser1 = 105, \ + /obj/item/weapon/scalpel/manager = 120, \ /obj/item/weapon/scalpel = 100, \ /obj/item/weapon/kitchenknife = 75, \ /obj/item/weapon/shard = 50, \ ) - min_duration = 90 max_duration = 110 /datum/surgery_step/generic/cut_face/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) @@ -54,13 +58,14 @@ return 0 /datum/surgery_step/face/mend_vocal + name = "mend vocal cords" allowed_tools = list( + /obj/item/weapon/scalpel/manager = 120, \ /obj/item/weapon/hemostat = 100, \ /obj/item/stack/cable_coil = 75, \ /obj/item/device/assembly/mousetrap = 10 //I don't know. Don't ask me. But I'm leaving it because hilarity. ) - min_duration = 70 max_duration = 90 /datum/surgery_step/face/mend_vocal/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) @@ -84,12 +89,13 @@ return 0 /datum/surgery_step/face/fix_face + name = "reshape face" allowed_tools = list( + /obj/item/weapon/scalpel/manager = 120, \ /obj/item/weapon/retractor = 100, \ /obj/item/weapon/crowbar = 55, \ /obj/item/weapon/kitchen/utensil/fork = 75) - min_duration = 80 max_duration = 100 /datum/surgery_step/face/fix_face/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) @@ -114,14 +120,17 @@ return 0 /datum/surgery_step/face/cauterize + name = "close incision" allowed_tools = list( + /obj/item/weapon/scalpel/laser3 = 115, \ + /obj/item/weapon/scalpel/laser2 = 110, \ + /obj/item/weapon/scalpel/laser1 = 105, \ /obj/item/weapon/cautery = 100, \ /obj/item/clothing/mask/cigarette = 75, \ /obj/item/weapon/lighter = 50, \ /obj/item/weapon/weldingtool = 25 ) - min_duration = 70 max_duration = 100 /datum/surgery_step/face/cauterize/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm index fb329a5deab..f07cef38b97 100644 --- a/code/modules/surgery/generic.dm +++ b/code/modules/surgery/generic.dm @@ -20,109 +20,26 @@ return 0 return 1 -/datum/surgery_step/generic/cut_with_laser - allowed_tools = list( - /obj/item/weapon/scalpel/laser3 = 95, \ - /obj/item/weapon/scalpel/laser2 = 85, \ - /obj/item/weapon/scalpel/laser1 = 75, \ - /obj/item/weapon/melee/energy/ = 5, \ - /obj/item/weapon/pen/edagger = 5, \ - ) - - min_duration = 90 - max_duration = 110 - -/datum/surgery_step/generic/cut_with_laser/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - if(..()) - var/obj/item/organ/external/affected = target.get_organ(target_zone) - return affected.open == 0 && target_zone != "mouth" - -/datum/surgery_step/generic/cut_with_laser/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user] starts the bloodless incision on [target]'s [affected.name] with \the [tool].", \ - "You start the bloodless incision on [target]'s [affected.name] with \the [tool].") - target.custom_pain("You feel a horrible, searing pain in your [affected.name]!",1) - ..() - -/datum/surgery_step/generic/cut_with_laser/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message(" [user] has made a bloodless incision on [target]'s [affected.name] with \the [tool].", \ - " You have made a bloodless incision on [target]'s [affected.name] with \the [tool].",) - //Could be cleaner ... - affected.open = 1 - - if(istype(target) && !(target.species.flags & NO_BLOOD)) - affected.status |= ORGAN_BLEEDING - - affected.createwound(CUT, 1) - affected.clamp() - spread_germs_to_organ(affected, user) - return 1 - -/datum/surgery_step/generic/cut_with_laser/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message(" [user]'s hand slips as the blade sputters, searing a long gash in [target]'s [affected.name] with \the [tool]!", \ - "\red Your hand slips as the blade sputters, searing a long gash in [target]'s [affected.name] with \the [tool]!") - affected.createwound(CUT, 7.5) - affected.createwound(BURN, 12.5) - return 0 - -/datum/surgery_step/generic/incision_manager - allowed_tools = list( - /obj/item/weapon/scalpel/manager = 100 - ) - - min_duration = 80 - max_duration = 120 - -/datum/surgery_step/generic/incision_manager/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - if(..()) - var/obj/item/organ/external/affected = target.get_organ(target_zone) - return affected.open == 0 && target_zone != "mouth" - -/datum/surgery_step/generic/incision_manager/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user] starts to construct a prepared incision on and within [target]'s [affected.name] with \the [tool].", \ - "You start to construct a prepared incision on and within [target]'s [affected.name] with \the [tool].") - target.custom_pain("You feel a horrible, searing pain in your [affected.name] as it is pushed apart!",1) - ..() - -/datum/surgery_step/generic/incision_manager/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("\blue [user] has constructed a prepared incision on and within [target]'s [affected.name] with \the [tool].", \ - "\blue You have constructed a prepared incision on and within [target]'s [affected.name] with \the [tool].",) - affected.open = 1 - - if(istype(target) && !(target.species.flags & NO_BLOOD)) - affected.status |= ORGAN_BLEEDING - - affected.createwound(CUT, 1) - affected.clamp() - affected.open = 2 - - return 1 - -/datum/surgery_step/generic/incision_manager/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("\red [user]'s hand jolts as the system sparks, ripping a gruesome hole in [target]'s [affected.name] with \the [tool]!", \ - "\red Your hand jolts as the system sparks, ripping a gruesome hole in [target]'s [affected.name] with \the [tool]!") - affected.createwound(CUT, 20) - affected.createwound(BURN, 15) - - return 2 /datum/surgery_step/generic/cut_open + name = "make incision" + allowed_tools = list( + /obj/item/weapon/scalpel/laser3 = 115, \ + /obj/item/weapon/scalpel/laser2 = 110, \ + /obj/item/weapon/scalpel/laser1 = 105, \ + /obj/item/weapon/scalpel/manager = 120, \ /obj/item/weapon/scalpel = 100, \ /obj/item/weapon/kitchenknife = 75, \ /obj/item/weapon/shard = 50, \ /obj/item/weapon/scissors = 10, \ /obj/item/weapon/twohanded/chainsaw = 1, \ /obj/item/weapon/claymore = 5, \ + /obj/item/weapon/melee/energy/ = 5, \ + /obj/item/weapon/pen/edagger = 5, \ ) - min_duration = 90 - max_duration = 110 + max_duration = 60 /datum/surgery_step/generic/cut_open/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) var/obj/item/organ/external/affected = target.get_organ(target_zone) @@ -154,13 +71,18 @@ return 0 /datum/surgery_step/generic/clamp_bleeders + name = "clamp bleeders" + allowed_tools = list( + /obj/item/weapon/scalpel/laser3 = 115, \ + /obj/item/weapon/scalpel/laser2 = 110, \ + /obj/item/weapon/scalpel/laser1 = 105, \ + /obj/item/weapon/scalpel/manager = 120, \ /obj/item/weapon/hemostat = 100, \ /obj/item/stack/cable_coil = 75, \ /obj/item/device/assembly/mousetrap = 20 ) - min_duration = 40 max_duration = 60 @@ -192,13 +114,15 @@ return 0 /datum/surgery_step/generic/retract_skin + name = "retract skin" + allowed_tools = list( + /obj/item/weapon/scalpel/manager = 120, \ /obj/item/weapon/retractor = 100, \ /obj/item/weapon/crowbar = 75, \ /obj/item/weapon/kitchen/utensil/fork = 50 ) - min_duration = 30 max_duration = 40 /datum/surgery_step/generic/retract_skin/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) @@ -248,15 +172,20 @@ return 0 /datum/surgery_step/generic/cauterize + + name = "cauterize incision" + allowed_tools = list( + /obj/item/weapon/scalpel/laser3 = 115, \ + /obj/item/weapon/scalpel/laser2 = 110, \ + /obj/item/weapon/scalpel/laser1 = 105, \ /obj/item/weapon/cautery = 100, \ /obj/item/clothing/mask/cigarette = 75, \ /obj/item/weapon/lighter = 50, \ /obj/item/weapon/weldingtool = 25 ) - min_duration = 70 - max_duration = 100 + max_duration = 90 /datum/surgery_step/generic/cauterize/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) var/obj/item/organ/external/affected = target.get_organ(target_zone) @@ -287,6 +216,8 @@ /datum/surgery_step/generic/amputate + name = "amputate limb" + allowed_tools = list( /obj/item/weapon/circular_saw = 100, \ /obj/item/weapon/melee/energy/sword/cyborg/saw = 100, \ @@ -294,8 +225,7 @@ /obj/item/weapon/melee/arm_blade = 60 ) - min_duration = 110 - max_duration = 160 + max_duration = 110 /datum/surgery_step/generic/amputate/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) if (target_zone == "eyes") //there are specific steps for eye surgery diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm index 87c20ada7ed..4cd06a68402 100644 --- a/code/modules/surgery/implant.dm +++ b/code/modules/surgery/implant.dm @@ -54,13 +54,13 @@ affected.createwound(CUT, 20) /datum/surgery_step/cavity/make_space + name = "make cavity space" allowed_tools = list( /obj/item/weapon/surgicaldrill = 100, \ /obj/item/weapon/pen = 75, \ /obj/item/stack/rods = 50 ) - min_duration = 60 max_duration = 80 /datum/surgery_step/cavity/make_space/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) @@ -83,15 +83,18 @@ return 1 /datum/surgery_step/cavity/close_space - priority = 2 + name = "close cavity space" allowed_tools = list( + /obj/item/weapon/scalpel/laser3 = 115, \ + /obj/item/weapon/scalpel/laser2 = 110, \ + /obj/item/weapon/scalpel/laser1 = 105, \ + /obj/item/weapon/scalpel/manager = 120, \ /obj/item/weapon/cautery = 100, \ /obj/item/clothing/mask/cigarette = 75, \ /obj/item/weapon/lighter = 50, \ /obj/item/weapon/weldingtool = 25 ) - min_duration = 60 max_duration = 80 /datum/surgery_step/cavity/close_space/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) @@ -115,10 +118,12 @@ /datum/surgery_step/cavity/place_item - priority = 0 + name = "implant object" + accept_hand = 1 + accept_any_item = 1 + var/obj/item/IC = null allowed_tools = list(/obj/item = 100) - min_duration = 80 max_duration = 100 @@ -131,8 +136,15 @@ /datum/surgery_step/cavity/place_item/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user] starts putting \the [tool] inside [target]'s [get_cavity(affected)] cavity.", \ - "You start putting \the [tool] inside [target]'s [get_cavity(affected)] cavity." ) + for(var/obj/item/I in target.internal_organs) + if(!istype(I, /obj/item/organ)) + IC = I + break + if(tool) + user.visible_message("[user] starts putting \the [tool] inside [target]'s [get_cavity(affected)] cavity.", \ + "You start putting \the [tool] inside [target]'s [get_cavity(affected)] cavity." ) + else + user.visible_message("[user] checks for items in [target]'s [target_zone].", "You check for items in [target]'s [target_zone]...") target.custom_pain("The pain in your chest is living hell!",1) ..() @@ -142,11 +154,12 @@ if(istype(tool, /obj/item/weapon/disk/nuclear)) user << "Central command would kill you if you implanted the disk into someone." return 0//fail - else + + if(tool) user.visible_message("\blue [user] puts \the [tool] inside [target]'s [get_cavity(affected)] cavity.", \ "\blue You put \the [tool] inside [target]'s [get_cavity(affected)] cavity." ) - if (tool.w_class > get_max_wclass(affected)/2 && prob(50) && !(affected.status & ORGAN_ROBOT)) - user << "\red You tear some vessels trying to fit such big object in this cavity." + if (IC || (tool.w_class > get_max_wclass(affected)/2 && prob(50) && !(affected.status & ORGAN_ROBOT))) + user << "\red You tear some vessels trying to fit the object in the cavity." var/datum/wound/internal_bleeding/I = new () affected.wounds += I affected.owner.custom_pain("You feel something rip in your [affected.name]!", 1) @@ -155,39 +168,50 @@ target.internal_organs += tool tool.loc = target affected.cavity = 0 - return 1 + else + if(IC) + user.visible_message("[user] pulls [IC] out of [target]'s [target_zone]!", "You pull [IC] out of [target]'s [target_zone].") + user.put_in_hands(IC) + target.internal_organs -= IC + return 1 + else + user << "You don't find anything in [target]'s [target_zone]." + return 0 + ////////////////////////////////////////////////////////////////// // IMPLANT/ITEM REMOVAL SURGERY // ////////////////////////////////////////////////////////////////// -///Fethas note:I might could condense this down but it would need to take out the part with poking around with a hemostat /datum/surgery/cavity_implant_rem name = "implant removal" steps = list(/datum/surgery_step/generic/cut_open, /datum/surgery_step/generic/clamp_bleeders, /datum/surgery_step/generic/retract_skin, /datum/surgery_step/generic/cut_open,/datum/surgery_step/cavity/implant_removal,/datum/surgery_step/cavity/close_space,/datum/surgery_step/generic/cauterize/) - possible_locs = list("chest","head") + possible_locs = list("chest","head")//head is for borers..i can put it elsewhere /datum/surgery_step/cavity/implant_removal + name = "extract implant" allowed_tools = list( /obj/item/weapon/hemostat = 100, \ /obj/item/weapon/wirecutters = 75, \ /obj/item/weapon/kitchen/utensil/fork = 20 ) - - min_duration = 80 - max_duration = 100 + var/obj/item/weapon/implant/I = null + max_duration = 70 /datum/surgery_step/cavity/implant_removal/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user] starts poking around inside [target]'s [affected.name] with \the [tool].", \ + I = locate(/obj/item/weapon/implant) in target + if(I) + user.visible_message("[user] begins to extract [I] from [target]'s [target_zone].", "You begin to extract [I] from [target]'s [target_zone]...") + else + user.visible_message("[user] starts poking around inside [target]'s [affected.name] with \the [tool].", \ "You start poking around inside [target]'s [affected.name] with \the [tool]." ) target.custom_pain("The pain in your [affected.name] is living hell!",1) ..() /datum/surgery_step/cavity/implant_removal/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) var/obj/item/organ/external/affected = target.get_organ(target_zone) - var/obj/item/weapon/implant/I = locate(/obj/item/weapon/implant) in target if (affected.implants.len) var/obj/item/obj = affected.implants[1] @@ -228,7 +252,7 @@ user.visible_message("[user] places [I] into [case]!", "You place [I] into [case].") else qdel(I) - target.sec_hud_set_implants() + //target.sec_hud_set_implants() return 1 else if (affected.hidden) user.visible_message("\blue [user] takes something out of incision on [target]'s [affected.name] with \the [tool].", \ diff --git a/code/modules/surgery/limb_reattach.dm b/code/modules/surgery/limb_reattach.dm index 3ea7fc49acd..bd11f11db1e 100644 --- a/code/modules/surgery/limb_reattach.dm +++ b/code/modules/surgery/limb_reattach.dm @@ -57,7 +57,6 @@ return 0 /datum/surgery_step/limb/ - priority = 3 // Must be higher than /datum/surgery_step/internal can_infect = 0 can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) if (!hasorgans(target)) @@ -69,9 +68,9 @@ return !isnull(organ_data) /datum/surgery_step/limb/attach + name = "attach limb" allowed_tools = list(/obj/item/organ/external = 100) - min_duration = 50 max_duration = 70 /datum/surgery_step/limb/attach/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -99,6 +98,7 @@ return 0 /datum/surgery_step/limb/connect + name = "connect limb" allowed_tools = list( /obj/item/weapon/hemostat = 100, \ /obj/item/stack/cable_coil = 75, \ @@ -106,7 +106,6 @@ ) can_infect = 1 - min_duration = 100 max_duration = 120 /datum/surgery_step/limb/connect/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -139,9 +138,9 @@ return 0 /datum/surgery_step/limb/mechanize + name = "attach robotic limb" allowed_tools = list(/obj/item/robot_parts = 100) - min_duration = 80 max_duration = 100 /datum/surgery_step/limb/mechanize/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index 719cff9dd0c..35e5560e4d3 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -1,4 +1,4 @@ -//note i am putting External in robolimbs. +datumvars//note i am putting External in robolimbs. #define STUN_SET_AMOUNT 2 diff --git a/code/modules/surgery/organs/organ.dm b/code/modules/surgery/organs/organ.dm index 9808f8d6233..0d6942d3b73 100644 --- a/code/modules/surgery/organs/organ.dm +++ b/code/modules/surgery/organs/organ.dm @@ -29,7 +29,11 @@ var/list/organ_cache = list() var/freezer_update_period = 100 var/is_in_freezer = 0 -/obj/item/organ/Destroy() + var/sterile = 0 //can the organ be infected by germs? + var/tough = 0 //can organ be easily damaged? + + +/*/obj/item/organ/Destroy() if(!owner) return ..() @@ -49,7 +53,7 @@ var/list/organ_cache = list() if(src in owner.contents) owner.contents -= src - return ..() + return ..()*/ @@ -113,7 +117,7 @@ var/list/organ_cache = list() return //Process infections - if ((status & ORGAN_ROBOT) || (owner && owner.species && (owner.species.flags & IS_PLANT))) + if ((status & ORGAN_ROBOT) || (sterile) ||(owner && owner.species && (owner.species.flags & IS_PLANT))) germ_level = 0 return @@ -244,6 +248,8 @@ var/list/organ_cache = list() //Note: external organs have their own version of this proc /obj/item/organ/proc/take_damage(amount, var/silent=0) + if(tough) + return if(src.status & ORGAN_ROBOT) src.damage = between(0, src.damage + (amount * 0.8), max_damage) else diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 5d3717a3d75..9a1476bdfbc 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -9,8 +9,6 @@ var/slot vital = 0 var/organ_action_name = null - var/sterile = 0 //can the organ be infected by germs? - var/tough = 0 //can organ be easily damaged? /obj/item/organ/internal/proc/insert(mob/living/carbon/M, special = 0) if(!iscarbon(M) || owner == M) @@ -33,7 +31,6 @@ owner = null if(M) M.internal_organs -= src - //M.internal_organs_by_name[src] -= src if(vital && !special) M.death() @@ -46,6 +43,11 @@ /obj/item/organ/internal/proc/on_life() return +/obj/item/organ/internal/Destroy() + if(owner) + remove(owner, 1) + return ..() + /obj/item/organ/internal/proc/prepare_eat() var/obj/item/weapon/reagent_containers/food/snacks/organ/S = new S.name = name @@ -129,6 +131,7 @@ organ_tag = "lungs" parent_organ = "chest" slot = "lungs" + vital = 1 //Insert something neat here. ///obj/item/organ/internal/lungs/remove(mob/living/carbon/M, special = 0) @@ -358,7 +361,8 @@ if(!owner) return - + if(lasthonk == 0) + lasthonk = world.time if(lasthonk > world.time + 600|| lasthonk == 0) lasthonk = world.time owner << "HONK" @@ -382,3 +386,37 @@ spawn(20) if(thingy) walk(thingy,0) + + +/obj/item/organ/internal/beard + name = "beard organ" + desc = "" + icon_state = "liver" + origin_tech = "biotech=1" + w_class = 1 + parent_organ = "head" + slot = "hair_organ" + + +/obj/item/organ/internal/beard/on_life() + + if(!owner) + return + + if(istype(owner, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = owner + if(!(H.h_style == "Very Long Hair" || H.h_style == "Mowhawk")) + if(prob(10)) + H.h_style = "Mohawk" + else + H.h_style = "Very Long Hair" + H.r_hair = 216 + H.g_hair = 192 + H.b_hair = 120 + H.update_hair() + if(!(H.f_style == "Very Long Beard")) + H.f_style = "Very Long Beard" + H.r_facial = 216 + H.g_facial = 192 + H.b_facial = 120 + H.update_fhair() \ No newline at end of file diff --git a/code/modules/surgery/organs/subtypes/xenos.dm b/code/modules/surgery/organs/subtypes/xenos.dm index 0a99983ca49..b99dd1575ab 100644 --- a/code/modules/surgery/organs/subtypes/xenos.dm +++ b/code/modules/surgery/organs/subtypes/xenos.dm @@ -15,12 +15,14 @@ ///can be changed if xenos get an update.. /obj/item/organ/internal/xenos/insert(mob/living/carbon/M, special = 0) ..() - for(var/mob/living/carbon/alien/humanoid/verb/P in alien_powers) - verbs += P //at least until xeno powers are vamped to TG + for(var/P in alien_powers) + M.verbs |= P + //M.verbs |= alien_powers.Copy() /obj/item/organ/internal/xenos/remove(mob/living/carbon/M, special = 0) - for(var/mob/living/carbon/alien/humanoid/verb/P in alien_powers) - verbs -= P + for(var/P in alien_powers) + M.verbs -= P + //M.verbs -= alien_powers.Copy() ..() diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index 48a83ec62f5..2af5a44e88c 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -39,59 +39,6 @@ var/obj/item/organ/external/affected = target.get_organ(target_zone) return affected && affected.open_enough_for_surgery() -////////////////////////////////////////////////////////////////// -// Dethrall Shadowling // -////////////////////////////////////////////////////////////////// -/datum/surgery/remove_thrall - name = "clense contaminations"//RENAME MEH - steps = list(/datum/surgery_step/generic/cut_open, /datum/surgery_step/generic/clamp_bleeders, /datum/surgery_step/generic/retract_skin, /datum/surgery_step/open_encased/saw,/datum/surgery_step/open_encased/retract, /datum/surgery_step/internal/dethrall) - possible_locs = list("head") - -/datum/surgery_step/internal/dethrall - allowed_tools = list( - /obj/item/weapon/hemostat = 100, \ - /obj/item/weapon/wirecutters = 75, \ - /obj/item/weapon/kitchen/utensil/fork = 20 - ) - - min_duration = 120 - max_duration = 120 - -/datum/surgery_step/internal/dethrall/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - if (!hasorgans(target)) - return - var/obj/item/organ/external/affected = target.get_organ(target_zone) - return ..() && affected && is_thrall(target) && affected.open_enough_for_surgery() && target_zone == target.named_organ_parent("brain") - -/datum/surgery_step/internal/dethrall/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - 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...") - 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...") - ..() - -/datum/surgery_step/internal/dethrall/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - 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 [braincase]. It quickly shrivels and burns away.") - ticker.mode.remove_thrall(target.mind,0) - new /obj/item/organ/internal/shadowtumor(get_turf(target)) - - return 1 - -/datum/surgery_step/internal/dethrall/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - var/braincase = target.named_organ_parent("brain") - if(prob(50)) - user.visible_message("[user] slips and rips the tumor out from [target]'s [braincase]!", \ - "You fumble and tear out [target]'s tumor!") - target.adjustBrainLoss(110) // This is so you can't just defib'n go - ticker.mode.remove_thrall(target.mind,1) - - return 0 - else - user.visible_message("[user]'s hand slips and fumbles! Luckily, they didn't damage anything!") - return 0 ////////////////////////////////////////////////////////////////// // ALIEN EMBRYO SURGERY // @@ -100,7 +47,7 @@ // steps = list(/datum/surgery_step/generic/cut_open, /datum/surgery_step/generic/clamp_bleeders,/datum/surgery_step/generic/retract_skin, /datum/surgery_step/open_encased/saw,/datum/surgery_step/open_encased/retract, /datum/surgery_step/internal/remove_embryo) // possible_locs = list("chest") // disallowed_mob = (/mob/living/carbon/human/machine) - +//this is all handled bia organ mainpulation as an On_find /datum/surgery_step/internal/remove_embryo//might can just do this in organ mainpulation..but this is TARGETED for.. allowed_tools = list( @@ -110,7 +57,6 @@ ) blood_level = 2 - min_duration = 80 max_duration = 100 /datum/surgery_step/internal/remove_embryo/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) @@ -165,16 +111,15 @@ /datum/surgery_step/internal/manipulate_organs - + name = "manipulate organs" allowed_tools = list(/obj/item/organ/internal = 100, /obj/item/weapon/reagent_containers/food/snacks/organ = 0) - var/implements_extract = list(/obj/item/weapon/hemostat = 100, /obj/item/weapon/crowbar = 55) + var/implements_extract = list(/obj/item/weapon/hemostat = 100, /obj/item/weapon/kitchen/utensil/fork = 55) var/implements_mend = list(/obj/item/stack/medical/advanced/bruise_pack = 100,/obj/item/stack/nanopaste = 100,/obj/item/stack/medical/bruise_pack = 20) //Finish is just so you can close up after you do other things. - var/implements_finsh = list(/obj/item/weapon/retractor = 100 ,/obj/item/weapon/crowbar = 75) + var/implements_finsh = list(/obj/item/weapon/scalpel/manager = 120,/obj/item/weapon/retractor = 100 ,/obj/item/weapon/crowbar = 75) var/current_type var/obj/item/organ/internal/I = null var/obj/item/organ/external/affected = null - min_duration = 70 max_duration = 90 /datum/surgery_step/internal/manipulate_organs/New() @@ -342,361 +287,6 @@ //todo set up fail steps - -////////////////////////////////////////////////////////////////// -// CHEST INTERNAL ORGAN SURGERY // -////////////////////////////////////////////////////////////////// -/* -/datum/surgery_step/internal/fix_organ - allowed_tools = list( - /obj/item/stack/medical/advanced/bruise_pack= 100, \ - /obj/item/stack/medical/bruise_pack = 20 - ) - - min_duration = 70 - max_duration = 90 - - can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - - if (!hasorgans(target)) - return - var/obj/item/organ/external/affected = target.get_organ(target_zone) - if(!affected) - return - var/is_organ_damaged = 0 - for(var/obj/item/organ/internal/I in affected.internal_organs) - if(I.damage > 0 && I.robotic < 2) - is_organ_damaged = 1 - break - return ..() && is_organ_damaged - - begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - var/tool_name = "\the [tool]" - if (istype(tool, /obj/item/stack/medical/advanced/bruise_pack)) - tool_name = "regenerative membrane" - else if (istype(tool, /obj/item/stack/medical/bruise_pack)) - tool_name = "the bandaid" - - if (!hasorgans(target)) - return - var/obj/item/organ/external/affected = target.get_organ(target_zone) - - for(var/obj/item/organ/internal/I in affected.internal_organs) - if(I && I.damage > 0) - if(I.robotic < 2) - if(!I.sterile) - spread_germs_to_organ(I, user) - user.visible_message("[user] starts treating damage to [target]'s [I.name] with [tool_name].", \ - "You start treating damage to [target]'s [I.name] with [tool_name]." ) - - target.custom_pain("The pain in your [affected.name] is living hell!",1) - ..() - - end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - var/tool_name = "\the [tool]" - if (istype(tool, /obj/item/stack/medical/advanced/bruise_pack)) - tool_name = "regenerative membrane" - if (istype(tool, /obj/item/stack/medical/bruise_pack)) - tool_name = "the bandaid" - - if (!hasorgans(target)) - return - var/obj/item/organ/external/affected = target.get_organ(target_zone) - - for(var/obj/item/organ/internal/I in affected.internal_organs) - if(I) - I.surgeryize() - if(I && I.damage > 0) - if(I.robotic < 2) - user.visible_message("\blue [user] treats damage to [target]'s [I.name] with [tool_name].", \ - "\blue You treat damage to [target]'s [I.name] with [tool_name]." ) - I.damage = 0 - - fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - - if (!hasorgans(target)) - return - var/obj/item/organ/external/affected = target.get_organ(target_zone) - - user.visible_message("\red [user]'s hand slips, getting mess and tearing the inside of [target]'s [affected.name] with \the [tool]!", \ - "\red Your hand slips, getting mess and tearing the inside of [target]'s [affected.name] with \the [tool]!") - var/dam_amt = 2 - - if (istype(tool, /obj/item/stack/medical/advanced/bruise_pack)) - target.adjustToxLoss(5) - - else if (istype(tool, /obj/item/stack/medical/bruise_pack)) - dam_amt = 5 - target.adjustToxLoss(10) - affected.createwound(CUT, 5) - - for(var/obj/item/organ/internal/I in affected.internal_organs) - if(I && I.damage > 0) - I.take_damage(dam_amt,0) - -/datum/surgery_step/internal/detatch_organ - - allowed_tools = list( - /obj/item/weapon/scalpel = 100, \ - /obj/item/weapon/kitchenknife = 75, \ - /obj/item/weapon/shard = 50, \ - ) - - min_duration = 90 - max_duration = 110 - - can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - - if (!..()) - return 0 - - var/obj/item/organ/external/affected = target.get_organ(target_zone) - - if(!(affected && !(affected.status & ORGAN_ROBOT))) - return 0 - - surgery.current_organ = null - surgery.organ_ref = null - - var/list/attached_organs = list() - for(var/organ in affected.internal_organs) - var/obj/item/organ/internal/I = organ - if(I && !(I.status & ORGAN_CUT_AWAY) && I.parent_organ == target_zone) - attached_organs[I.organ_tag] = I - - var/organ_to_remove = input(user, "Which organ do you want to prepare for removal?") as null|anything in attached_organs - if(!organ_to_remove) - return 0 - - surgery.current_organ = organ_to_remove - surgery.organ_ref = attached_organs[organ_to_remove] - - return ..() && organ_to_remove - - begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - - var/obj/item/organ/external/affected = target.get_organ(target_zone) - - user.visible_message("[user] starts to separate [target]'s [surgery.current_organ] with \the [tool].", \ - "You start to separate [target]'s [surgery.current_organ] with \the [tool]." ) - target.custom_pain("The pain in your [affected.name] is living hell!",1) - ..() - - end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - user.visible_message("\blue [user] has separated [target]'s [surgery.current_organ] with \the [tool]." , \ - "\blue You have separated [target]'s [surgery.current_organ] with \the [tool].") - - var/obj/item/organ/internal/I = surgery.organ_ref - if(I && istype(I)) - spread_germs_to_organ(I, user) - I.status |= ORGAN_CUT_AWAY - - fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("\red [user]'s hand slips, slicing an artery inside [target]'s [affected.name] with \the [tool]!", \ - "\red Your hand slips, slicing an artery inside [target]'s [affected.name] with \the [tool]!") - affected.createwound(CUT, rand(30,50), 1) - -/datum/surgery_step/internal/remove_organ - - allowed_tools = list( - /obj/item/weapon/hemostat = 100, \ - /obj/item/weapon/wirecutters = 75, \ - /obj/item/weapon/kitchen/utensil/fork = 20 - ) - - min_duration = 60 - max_duration = 80 - - can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - - if (!..()) - return 0 - var/obj/item/organ/external/affected = target.get_organ(target_zone) - - if(!istype(affected)) - return 0 - - surgery.current_organ = null - surgery.organ_ref = null - - var/list/removable_organs = list() - for(var/organ in affected.internal_organs) - var/obj/item/organ/internal/I = organ - if(istype(I) && (I.status & ORGAN_CUT_AWAY) && I.parent_organ == target_zone) - removable_organs[I.organ_tag] = I - - var/organ_to_remove = input(user, "Which organ do you want to remove?") as null|anything in removable_organs - if(!organ_to_remove) - return 0 - - surgery.current_organ = organ_to_remove - surgery.organ_ref = removable_organs[organ_to_remove] - return ..() - - begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - user.visible_message("[user] starts removing [target]'s [surgery.current_organ] with \the [tool].", \ - "You start removing [target]'s [surgery.current_organ] with \the [tool].") - target.custom_pain("Someone's ripping out your [surgery.current_organ]!",1) - ..() - - end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - user.visible_message("\blue [user] has removed [target]'s [surgery.current_organ] with \the [tool].", \ - "\blue You have removed [target]'s [surgery.current_organ] with \the [tool].") - - // Extract the organ! - if(surgery.current_organ) - var/obj/item/organ/internal/O = surgery.organ_ref - if(O && istype(O)) - - spread_germs_to_organ(O, user) - O.remove(target) - O.loc = get_turf(target) - - fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("\red [user]'s hand slips, damaging [target]'s [affected.name] with \the [tool]!", \ - "\red Your hand slips, damaging [target]'s [affected.name] with \the [tool]!") - affected.createwound(BRUISE, 20) - -/datum/surgery_step/internal/replace_organ - allowed_tools = list( - /obj/item/organ/internal = 100 - ) - - min_duration = 60 - max_duration = 80 - - can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - - var/obj/item/organ/internal/O = tool - var/obj/item/organ/external/affected = target.get_organ(target_zone) - if(!affected) return - var/organ_compatible - var/organ_missing - - if(!istype(O)) - return 0 - - if((affected.status & ORGAN_ROBOT) && !(O.status & ORGAN_ROBOT)) - user << "You cannot install a naked organ into a robotic body." - return 2 - - if(!target.species) - user << "\red You have no idea what species this person is. Report this on the bug tracker." - return 2 - - var/o_is = (O.gender == PLURAL) ? "are" : "is" - var/o_a = (O.gender == PLURAL) ? "" : "a " - var/o_do = (O.gender == PLURAL) ? "don't" : "doesn't" - - if(O.organ_tag == "limb") - return 0 - else if(target.species.has_organ[O.organ_tag])//need to change this around for cybernetic implants - - if(O.damage > (O.max_damage * 0.75)) - user << "\red \The [O.organ_tag] [o_is] in no state to be transplanted." - return 2 - - if(!target.get_int_organ(O)) - organ_missing = 1 - else - user << "\red \The [target] already has [o_a][O.organ_tag]." - return 2 - - if(O && affected.limb_name == O.parent_organ) - organ_compatible = 1 - else - user << "\red \The [O.organ_tag] [o_do] normally go in \the [affected.name]." - return 2 - else - user << "\red You're pretty sure [target.species.name] don't normally have [o_a][O.organ_tag]." - return 2 - - return ..() && organ_missing && organ_compatible - - begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("[user] starts transplanting \the [tool] into [target]'s [affected.name].", \ - "You start transplanting \the [tool] into [target]'s [affected.name].") - target.custom_pain("Someone's rooting around in your [affected.name]!",1) - ..() - - end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("\blue [user] has transplanted \the [tool] into [target]'s [affected.name].", \ - "\blue You have transplanted \the [tool] into [target]'s [affected.name].") - user.drop_item(tool) - var/obj/item/organ/internal/O = tool - if(istype(O)) - O.insert(target) - spread_germs_to_organ(O, user) - - fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - user.visible_message("\red [user]'s hand slips, damaging \the [tool]!", \ - "\red Your hand slips, damaging \the [tool]!") - var/obj/item/organ/internal/I = tool - if(istype(I)) - I.take_damage(rand(3,5),0) - -/datum/surgery_step/internal/attach_organ - allowed_tools = list( - /obj/item/weapon/FixOVein = 100, \ - /obj/item/stack/cable_coil = 75 - ) - - min_duration = 100 - max_duration = 120 - - can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - - if (!..()) - return 0 - - var/obj/item/organ/external/affected = target.get_organ(target_zone) - - if(!istype(affected)) - return 0 - - surgery.current_organ = null - surgery.organ_ref = null - - var/list/removable_organs = list() - for(var/organ in affected.internal_organs) - var/obj/item/organ/internal/I = organ - if(I && istype(I) && (I.status & ORGAN_CUT_AWAY) && !(I.status & ORGAN_ROBOT) && I.parent_organ == target_zone) - removable_organs[I.organ_tag] = I - - var/organ_to_replace = input(user, "Which organ do you want to reattach?") as null|anything in removable_organs - if(!organ_to_replace) - return 0 - - surgery.current_organ = organ_to_replace - surgery.organ_ref = removable_organs[organ_to_replace] - return ..() - - begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - user.visible_message("[user] begins reattaching [target]'s [surgery.current_organ] with \the [tool].", \ - "You start reattaching [target]'s [surgery.current_organ] with \the [tool].") - target.custom_pain("Someone's digging needles into your [surgery.current_organ]!",1) - ..() - - end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - user.visible_message("\blue [user] has reattached [target]'s [surgery.current_organ] with \the [tool]." , \ - "\blue You have reattached [target]'s [surgery.current_organ] with \the [tool].") - - var/obj/item/organ/internal/I = surgery.organ_ref - if(I && istype(I)) - I.status &= ~ORGAN_CUT_AWAY - spread_germs_to_organ(I, user) - - fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) - var/obj/item/organ/external/affected = target.get_organ(target_zone) - user.visible_message("\red [user]'s hand slips, damaging the flesh in [target]'s [affected.name] with \the [tool]!", \ - "\red Your hand slips, damaging the flesh in [target]'s [affected.name] with \the [tool]!") - affected.createwound(BRUISE, 20) - -*/ ////////////////////////////////////////////////////////////////// // HEART SURGERY // ////////////////////////////////////////////////////////////////// diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm index b0aaea718a1..1121810b837 100644 --- a/code/modules/surgery/other.dm +++ b/code/modules/surgery/other.dm @@ -5,7 +5,7 @@ /datum/surgery_step/fix_vein - priority = 2 + name = "mend internal bleeding" allowed_tools = list( /obj/item/weapon/FixOVein = 100, \ /obj/item/stack/cable_coil = 75 @@ -13,7 +13,6 @@ can_infect = 1 blood_level = 1 - min_duration = 70 max_duration = 90 /datum/surgery_step/fix_vein/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) @@ -57,7 +56,7 @@ return 0 /datum/surgery_step/fix_dead_tissue //Debridement - priority = 2 + name = "remove dead tissue" allowed_tools = list( /obj/item/weapon/scalpel = 100, \ /obj/item/weapon/kitchenknife = 75, \ @@ -67,7 +66,6 @@ can_infect = 1 blood_level = 1 - min_duration = 110 max_duration = 160 /datum/surgery_step/fix_dead_tissue/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) @@ -105,7 +103,7 @@ return 0 /datum/surgery_step/treat_necrosis - priority = 2 + name = "treat necrosis" allowed_tools = list( /obj/item/weapon/reagent_containers/dropper = 100, /obj/item/weapon/reagent_containers/glass/bottle = 75, @@ -117,7 +115,6 @@ can_infect = 0 blood_level = 0 - min_duration = 50 max_duration = 60 /datum/surgery_step/fix_dead_tissue/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) @@ -179,3 +176,54 @@ "\red Your hand slips, applying [trans] units of the solution to the wrong place in [target]'s [affected.name] with the [tool]!") //no damage or anything, just wastes medicine + + +////////////////////////////////////////////////////////////////// +// Dethrall Shadowling // +////////////////////////////////////////////////////////////////// +/datum/surgery/remove_thrall + name = "clense contaminations"//RENAME MEH + steps = list(/datum/surgery_step/generic/cut_open, /datum/surgery_step/generic/clamp_bleeders, /datum/surgery_step/generic/retract_skin, /datum/surgery_step/open_encased/saw,/datum/surgery_step/open_encased/retract, /datum/surgery_step/internal/dethrall) + possible_locs = list("head") + +/datum/surgery/remove_thrall/can_start(mob/user, mob/living/carbon/target) + return is_thrall(target)//would this be too meta? + +/datum/surgery_step/dethrall + name = "cleanse contamination" + allowed_tools = list(/obj/item/device/flash = 100, /obj/item/device/flashlight/pen = 80, /obj/item/device/flashlight = 40) + + max_duration = 120 + +/datum/surgery_step/internal/dethrall/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) + if (!hasorgans(target)) + return + var/obj/item/organ/external/affected = target.get_organ(target_zone) + return ..() && affected && is_thrall(target) && affected.open_enough_for_surgery() && target_zone == target.named_organ_parent("brain") + +/datum/surgery_step/internal/dethrall/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) + var/braincase = target.named_organ_parent("brain") + user.visible_message("[user] reaches into [target]'s head with [tool].", "You begin aligning [tool]'s light to the tumor on [target]'s brain...") + target << "A small part of your [braincase] pulses with agony as the light impacts it." + ..() + +/datum/surgery_step/internal/dethrall/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) + user.visible_message("[user] shines light onto the tumor in [target]'s head!", "You cleanse the contamination from [target]'s brain!") + ticker.mode.remove_thrall(target.mind,0) + target.visible_message("A strange black mass falls from [target]'s head!") + new /obj/item/organ/internal/shadowtumor(get_turf(target)) + + return 1 + +/datum/surgery_step/internal/dethrall/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) + var/braincase = target.named_organ_parent("brain") + if(prob(50)) + user.visible_message("[user] slips and rips the tumor out from [target]'s [braincase]!", \ + "You fumble and tear out [target]'s tumor!") + target.adjustBrainLoss(110) // This is so you can't just defib'n go + ticker.mode.remove_thrall(target.mind,1) + + return 0 + else + user.visible_message("[user]'s hand slips and fumbles! Luckily, they didn't damage anything!") + return 0 diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm index 6df377b56d1..9a1460d98f2 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -55,7 +55,6 @@ /obj/item/weapon/kitchen/utensil/knife = 50 ) - min_duration = 90 max_duration = 110 /datum/surgery_step/robotics/external/unscrew_hatch/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) @@ -89,7 +88,6 @@ /obj/item/weapon/kitchen/utensil/ = 50 ) - min_duration = 30 max_duration = 40 /datum/surgery_step/robotics/external/open_hatch/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) @@ -123,7 +121,6 @@ /obj/item/weapon/kitchen/utensil = 50 ) - min_duration = 70 max_duration = 100 /datum/surgery_step/robotics/external/close_hatch/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) @@ -157,7 +154,6 @@ /obj/item/weapon/gun/energy/plasmacutter = 50 ) - min_duration = 50 max_duration = 60 /datum/surgery_step/robotics/external/repair_brute/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) @@ -198,7 +194,6 @@ /obj/item/stack/cable_coil = 100 ) - min_duration = 50 max_duration = 60 /datum/surgery_step/robotics/external/repair_burn/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) @@ -242,10 +237,10 @@ var/implements_extract = list(/obj/item/device/multitool = 100) var/implements_mend = list( /obj/item/stack/nanopaste = 100,/obj/item/weapon/bonegel = 30, /obj/item/weapon/screwdriver = 70) var/implements_insert = list(/obj/item/weapon/screwdriver = 100) + var/implements_finish =list(/obj/item/weapon/retractor = 100,/obj/item/weapon/crowbar = 100,/obj/item/weapon/kitchen/utensil = 50) var/current_type var/obj/item/organ/internal/I = null var/obj/item/organ/external/affected = null - min_duration = 70 max_duration = 90 /datum/surgery_step/robotics/manipulate_robotic_organs/New() @@ -363,6 +358,12 @@ target.custom_pain("The pain in your [affected.name] is living hell!",1) + else if(implement_type in implements_finish) + current_type = "finish" + user.visible_message("[user] begins to close and secure the hatch on [target]'s [affected.name] with \the [tool]." , \ + "You begin to close and secure the hatch on [target]'s [affected.name] with \the [tool].") + + ..() /datum/surgery_step/robotics/manipulate_robotic_organs/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) @@ -376,13 +377,12 @@ user.visible_message("\blue [user] repairs [target]'s [I.name] with [tool].", \ "\blue You repair [target]'s [I.name] with [tool]." ) I.damage = 0 - return 1 else if(current_type == "insert") var/obj/item/organ/internal/I = target.get_int_organ(surgery.current_organ) var/off_tool = user.get_inactive_hand() I = off_tool - user.drop_item() + //user.drop_item() I.insert(target) user.visible_message("\blue [user] has reattached [target]'s [I] with \the [tool]." , \ "\blue You have reattached [target]'s [I] with \the [tool].") @@ -420,6 +420,13 @@ else user.visible_message("[user] can't seem to extract anything from [target]'s [parse_zone(target_zone)]!", "You can't extract anything from [target]'s [parse_zone(target_zone)]!") + else if(current_type == "finish") + var/obj/item/organ/external/affected = target.get_organ(target_zone) + user.visible_message("\blue [user] closes and secures the hatch on [target]'s [affected.name] with \the [tool].", \ + "\blue You close and secure the hatch on [target]'s [affected.name] with \the [tool].") + affected.open = 0 + affected.germ_level = 0 + return 1 return 0 /datum/surgery_step/robotics/manipulate_robotic_organs/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) @@ -450,6 +457,10 @@ else if (current_type == "install") user.visible_message("\red [user]'s hand slips!.", \ "\red Your hand slips!") + else if(current_type == "finish") + var/obj/item/organ/external/affected = target.get_organ(target_zone) + 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].") return -1 @@ -459,7 +470,6 @@ /obj/item/device/mmi = 100 ) - min_duration = 60 max_duration = 80 can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) diff --git a/code/modules/surgery/slime.dm b/code/modules/surgery/slime.dm index a2b6dc521c6..c822dc0d8b4 100644 --- a/code/modules/surgery/slime.dm +++ b/code/modules/surgery/slime.dm @@ -21,7 +21,6 @@ /obj/item/weapon/shard = 50, \ ) - min_duration = 30 max_duration = 50 /datum/surgery_step/slime/cut_flesh/can_use(mob/living/user, mob/living/carbon/slime/target, target_zone, obj/item/tool) @@ -50,7 +49,6 @@ /obj/item/weapon/shard = 50, \ ) - min_duration = 30 max_duration = 50 /datum/surgery_step/slime/cut_innards/can_use(mob/living/user, mob/living/carbon/slime/target, target_zone, obj/item/tool) @@ -77,7 +75,6 @@ /obj/item/weapon/hatchet = 75 ) - min_duration = 50 max_duration = 70 /datum/surgery_step/slime/saw_core/can_use(mob/living/user, mob/living/carbon/slime/target, target_zone, obj/item/tool) diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index 4b10ee37fd2..075c9199534 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -57,7 +57,6 @@ var/implement_type = null // duration of the step - var/min_duration = 0 var/max_duration = 0 var/name @@ -103,13 +102,18 @@ surgery.step_in_progress = 0 return - if(do_after(user, max_duration, target = target)) - var/advance = 0 - var/prob_chance = 100 + var/advance = 0 + var/prob_chance = 100 + + if(implement_type) //this means it isn't a require nd or any item step. + prob_chance = min(allowed_tools[implement_type], 100) + prob_chance *= get_location_modifier(target) + + if(prob_chance > 100)//if we are using a super tool + max_duration = max_duration - 50 //PLACEHOLDER VALUES + + if(do_after(user, max_duration, target = target)) - if(implement_type) //this means it isn't a require nd or any item step. - prob_chance = allowed_tools[implement_type] - prob_chance *= get_location_modifier(target) if(prob(prob_chance) || isrobot(user)) if(end_step(user, target, target_zone, tool, surgery)) diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm index 2ccfad81de2..74d0cb05ffd 100644 --- a/code/modules/surgery/tools.dm +++ b/code/modules/surgery/tools.dm @@ -82,9 +82,9 @@ /* * Researchable Scalpels */ -/obj/item/weapon/scalpel/laser1 +/obj/item/weapon/scalpel/laser1 //lasers also count as catuarys name = "laser scalpel" - desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks basic and could be improved." + desc = "A scalpel augmented with a directed laser. This one looks basic and could be improved." icon_state = "scalpel_laser1_on" item_state = "scalpel" damtype = "fire" @@ -92,7 +92,7 @@ /obj/item/weapon/scalpel/laser2 name = "laser scalpel" - desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks somewhat advanced." + desc = "A scalpel augmented with a directed laser. This one looks somewhat advanced." icon_state = "scalpel_laser2_on" item_state = "scalpel" damtype = "fire" @@ -100,13 +100,13 @@ /obj/item/weapon/scalpel/laser3 name = "laser scalpel" - desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks to be the pinnacle of precision energy cutlery!" + desc = "A scalpel augmented with a directed laser.. This one looks to be the pinnacle of precision energy cutlery!" icon_state = "scalpel_laser3_on" item_state = "scalpel" damtype = "fire" hitsound = 'sound/weapons/sear.ogg' -/obj/item/weapon/scalpel/manager +/obj/item/weapon/scalpel/manager //super tool! Retractor/hemostat name = "incision management system" desc = "A true extension of the surgeon's body, this marvel instantly and completely prepares an incision allowing for the immediate commencement of therapeutic steps." icon_state = "scalpel_manager_on" diff --git a/icons/mob/inhands/guns_lefthand.dmi b/icons/mob/inhands/guns_lefthand.dmi index f92115bf33b680c9c56990868885d852f2c77e57..0d4e61b7cac98f93af6339109b14cea9060e4338 100644 GIT binary patch delta 709 zcmV;$0y_Qv!2mS~AJwIsM?jJ$mhiYnEKz@gHkfp0`| zb~z^YQv7`Q_4q7yPmjf`@~kb1t+@HNEEXqSg+^?}W?d{ArRyeiKRC#s#8zC$>NQAK z{-Rh^+Oyb-n__YBvQ;d$V)YTMG|RnF%g+VtVo@n0-^5m|t~QhE)p9~Vf4$)PHdk?* zy~aJh28T#9J>U>2#{dqIGEUDSQpV9aL_*H(>m;*}##A=VmFs1?-%9BW)R<-CE!jF! zn)H@=Z%_Xpyk={3mBcG0YopQzDN??EJ8EMx&~(WM7HPkM2AXexfz}&fpz%7G15n=q zMfZSS#es&s0I%Ty16~}AE^Jk3yge!ZlK%ET_$rNC*}|QV+_%Ouc7=QJJ%)4nv=e6n zq~vE3pzdc1p!jE#cmXPZQYrmjQ~FX3X!>2Vx%yOy*fY?8IRgw>Gr*WJULSz0>A`$c zygp!2)3cZ%ULT-v=~2Lpqb3z}iDY^PYVJy7Syin}zj%6LjP4pMk*Ts zY=5L{)LPAfVqL3{WXWn)r6jUx>nTDN>ag@SI}T~(jszOH1A#Vw?m(c4oql&G{ms8< z`cdSJ3_NjMGz_JUi-wV?anUf6GcFoNLdI(w zkf!7Y%3wXx%O6#LFV;({p^NZQ40Q42inFx9^_pC8mKM18lMBw$e&K+?49mA&j?bCK zjkU;lZOkL{wJ{G3*hV}w9_$4(C$eYq91AiAtY?xOBXVZNy~fDtf7DCy@Vpbdr^n(C rx{>1jQp6QY001BWNklmS~9$MG{;xhTpyiMUm`8*rC&-fp0`| zc6UVUQv81Wvw0Q|Pn+UR1=7xnwYd2)FJ^mP#YU{fYFW%0rRyekKPbwm#9Ca)>McrA z;i8yTI*?e4n_{*LvQ;G3V(}TQG|8<|^RETVVpb_54`MAASF1_&Vm_gte_n8To2$6Z zUgI8LgJQC0dO$JR90MpOn{j%I$z~j#VzS7&L(MYVWK89Fu3XOfek-LnP-B)&aMsny z@?>yCTetuJ;59j;D;BSmtc~IgQdWif@T!f;K>3mnEYf}h4K&{X1Fbi}K;v~VMWDU| zitYg&#es&s0LO5E0WWq&Ew(B)!R=Le;h%kkFL>O^7Vdmx-Wo^P2>0N74CnH^6DInQCjk0(QX0QqDHxZ?O^2ud5D3?WhDlOZH$d@_WDOwcYO zO-T*Nc_jk`9)h;DLeQvMUndLPt$UL1pq^a9|vlSU0yel$nFmn1mdMO^CAH>7cruYZt qQsDoW_8zSO03ZNKL_t(|ob26wcvSVB|NqxP5)i_TckQzv1K*vFS7G)5 diff --git a/icons/mob/inhands/guns_righthand.dmi b/icons/mob/inhands/guns_righthand.dmi index cc7c2527e5497a5c6984b7789b93357cf90a3497..94fe615fb56ecfe1f286c71335ada18d84823549 100644 GIT binary patch delta 709 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