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 f92115bf33b..0d4e61b7cac 100644 Binary files a/icons/mob/inhands/guns_lefthand.dmi and b/icons/mob/inhands/guns_lefthand.dmi differ diff --git a/icons/mob/inhands/guns_righthand.dmi b/icons/mob/inhands/guns_righthand.dmi index cc7c2527e54..94fe615fb56 100644 Binary files a/icons/mob/inhands/guns_righthand.dmi and b/icons/mob/inhands/guns_righthand.dmi differ diff --git a/icons/obj/gun.dmi b/icons/obj/gun.dmi index 04ae145306e..67dadcd2a90 100644 Binary files a/icons/obj/gun.dmi and b/icons/obj/gun.dmi differ