diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index 60b4cefefc1..336e0080ee7 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -9,13 +9,18 @@ amount_per_transfer_from_this = 5 possible_transfer_amounts = list(1,2,3,4,5) volume = 5 - var/filled = 0 + +/obj/item/weapon/reagent_containers/dropper/on_reagent_change() + if(reagents.total_volume <= 0) + icon_state = "[initial(icon_state)]" + else + icon_state = "[initial(icon_state)]1" /obj/item/weapon/reagent_containers/dropper/afterattack(obj/target, mob/user , flag) if(!target.reagents) return - if(filled) + if(reagents.total_volume) if(target.reagents.total_volume >= target.reagents.maximum_volume) to_chat(user, "[target] is full.") @@ -51,12 +56,7 @@ spawn(5) reagents.reaction(safe_thing, TOUCH) - - to_chat(user, "You transfer [trans] units of the solution.") - if(reagents.total_volume<=0) - filled = 0 - icon_state = "[initial(icon_state)]" return @@ -80,9 +80,6 @@ trans = reagents.trans_to(target, amount_per_transfer_from_this) to_chat(user, "You transfer [trans] units of the solution.") - if(reagents.total_volume<=0) - filled = 0 - icon_state = "[initial(icon_state)]" else @@ -98,9 +95,6 @@ to_chat(user, "You fill [src] with [trans] units of the solution.") - filled = 1 - icon_state = "[initial(icon_state)][filled]" - /obj/item/weapon/reagent_containers/dropper/cyborg name = "Industrial Dropper" desc = "A larger dropper. Transfers 10 units." diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm index 3ff6020af26..300f6a88918 100644 --- a/code/modules/surgery/generic.dm +++ b/code/modules/surgery/generic.dm @@ -82,7 +82,7 @@ user.visible_message(" [user] clamps bleeders in [target]'s [affected.name] with \the [tool].", \ " You clamp bleeders in [target]'s [affected.name] with \the [tool].") affected.clamp() - spread_germs_to_organ(affected, user) + spread_germs_to_organ(affected, user, tool) return 1 /datum/surgery_step/generic/clamp_bleeders/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) diff --git a/code/modules/surgery/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm index a077853a5fc..009f2a929ec 100644 --- a/code/modules/surgery/organs/organ_external.dm +++ b/code/modules/surgery/organs/organ_external.dm @@ -108,26 +108,26 @@ switch(open) if(0) if(istype(W,/obj/item/weapon/scalpel)) - spread_germs_to_organ(src,user) + spread_germs_to_organ(src,user, W) user.visible_message("[user] cuts [src] open with [W]!") open++ return if(1) if(istype(W,/obj/item/weapon/retractor)) - spread_germs_to_organ(src,user) + spread_germs_to_organ(src,user, W) user.visible_message("[user] cracks [src] open like an egg with [W]!") open++ return if(2) if(istype(W,/obj/item/weapon/hemostat)) - spread_germs_to_organ(src,user) + spread_germs_to_organ(src,user, W) if(contents.len) var/obj/item/removing = pick(contents) var/obj/item/organ/internal/O = removing if(istype(O)) O.status |= ORGAN_CUT_AWAY if(!O.sterile) - spread_germs_to_organ(O,user) // This wouldn't be any cleaner than the actual surgery + spread_germs_to_organ(O,user, W) // This wouldn't be any cleaner than the actual surgery user.put_in_hands(removing) user.visible_message("[user] extracts [removing] from [src] with [W]!") else diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index df9ab4dde20..420d56de43d 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -1,3 +1,5 @@ +#define GHETTO_DISINFECT_AMOUNT 5 //Amount of units to transfer from the container to the organs during ghetto surgery disinfection step + /datum/surgery/organ_manipulation name = "Organ Manipulation" 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, @@ -68,6 +70,13 @@ 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/kitchen/utensil/fork = 55) var/implements_mend = list(/obj/item/stack/medical/bruise_pack = 20,/obj/item/stack/medical/bruise_pack/advanced = 100,/obj/item/stack/nanopaste = 100) + var/implements_clean = list(/obj/item/weapon/reagent_containers/dropper = 100, + /obj/item/weapon/reagent_containers/glass/bottle = 75, + /obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 70, + /obj/item/weapon/reagent_containers/food/drinks/bottle = 65, + /obj/item/weapon/reagent_containers/glass/beaker = 60, + /obj/item/weapon/reagent_containers/spray = 50, + /obj/item/weapon/reagent_containers/glass/bucket = 40) //Finish is just so you can close up after you do other things. var/implements_finsh = list(/obj/item/weapon/scalpel/laser/manager = 100,/obj/item/weapon/retractor = 100 ,/obj/item/weapon/crowbar = 75) var/current_type @@ -77,7 +86,7 @@ /datum/surgery_step/internal/manipulate_organs/New() ..() - allowed_tools = allowed_tools + implements_extract + implements_mend + implements_finsh + allowed_tools = allowed_tools + implements_extract + implements_mend + implements_clean + implements_finsh /datum/surgery_step/internal/manipulate_organs/begin_step(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) @@ -95,32 +104,53 @@ return -1 if(I.damage > (I.max_damage * 0.75)) - to_chat(user, " \The [I] is in no state to be transplanted.") + to_chat(user, " [I] is in no state to be transplanted.") return -1 if(target.get_int_organ(I)) - to_chat(user, " \The [target] already has [I].") + to_chat(user, " [target] already has [I].") return -1 if(affected) - user.visible_message("[user] starts transplanting \the [tool] into [target]'s [affected.name].", \ - "You start transplanting \the [tool] into [target]'s [affected.name].") + user.visible_message("[user] starts transplanting [tool] into [target]'s [affected.name].", \ + "You start transplanting [tool] into [target]'s [affected.name].") H.custom_pain("Someone's rooting around in your [affected.name]!",1) else - user.visible_message("[user] starts transplanting \the [tool] into [target]'s [parse_zone(target_zone)].", \ - "You start transplanting \the [tool] into [target]'s [parse_zone(target_zone)].") + user.visible_message("[user] starts transplanting [tool] into [target]'s [parse_zone(target_zone)].", \ + "You start transplanting [tool] into [target]'s [parse_zone(target_zone)].") + + else if(implement_type in implements_clean) + current_type = "clean" + + if(!istype(tool, /obj/item/weapon/reagent_containers)) + return + + var/obj/item/weapon/reagent_containers/C = tool + + for(var/obj/item/organ/internal/I in affected.internal_organs) + if(I) + if(C.reagents.total_volume < GHETTO_DISINFECT_AMOUNT) + user.visible_message("[user] notices [tool] is empty.", \ + "You notice [tool] is empty") + return 0 + + var/msg = "[user] starts pouring some of [tool] over [target]'s [I.name]." + var/self_msg = "You start pouring some of [tool] over [target]'s [I.name]." + user.visible_message(msg, self_msg) + if(H && affected) + H.custom_pain("Something burns horribly in your [affected.name]!",1) else if(implement_type in implements_finsh) //same as surgery step /datum/surgery_step/open_encased/close/ current_type = "finish" if(affected && affected.encased) - var/msg = "[user] starts bending [target]'s [affected.encased] back into place with \the [tool]." - var/self_msg = "You start bending [target]'s [affected.encased] back into place with \the [tool]." + var/msg = "[user] starts bending [target]'s [affected.encased] back into place with [tool]." + var/self_msg = "You start bending [target]'s [affected.encased] back into place with [tool]." user.visible_message(msg, self_msg) else - var/msg = "[user] starts pulling [target]'s skin back into place with \the [tool]." - var/self_msg = "You start pulling [target]'s skin back into place with \the [tool]." + var/msg = "[user] starts pulling [target]'s skin back into place with [tool]." + var/self_msg = "You start pulling [target]'s skin back into place with [tool]." user.visible_message(msg, self_msg) if(H && affected) @@ -143,8 +173,8 @@ I = organs[I] if(!I) return -1 - user.visible_message("[user] starts to separate [target]'s [I] with \the [tool].", \ - "You start to separate [target]'s [I] with \the [tool] for removal." ) + user.visible_message("[user] starts to separate [target]'s [I] with [tool].", \ + "You start to separate [target]'s [I] with [tool] for removal." ) if(H && affected) H.custom_pain("The pain in your [affected.name] is living hell!",1) else @@ -152,13 +182,13 @@ else if(implement_type in implements_mend) current_type = "mend" - var/tool_name = "\the [tool]" + var/tool_name = "[tool]" if(istype(tool, /obj/item/stack/medical/bruise_pack)) tool_name = "the bandaid" if(istype(tool, /obj/item/stack/medical/bruise_pack/advanced)) tool_name = "regenerative membrane" else if(istype(tool, /obj/item/stack/nanopaste)) - tool_name = "\the [tool]" //what else do you call nanopaste medically? + tool_name = "[tool]" //what else do you call nanopaste medically? if(!hasorgans(target)) to_chat(user, "They do not have organs to mend!") @@ -168,7 +198,7 @@ if(I && I.damage > 0) if(I.robotic < 2 && !istype (tool, /obj/item/stack/nanopaste)) if(!(I.sterile)) - spread_germs_to_organ(I, user) + spread_germs_to_organ(I, user, tool) 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]." ) else if(I.robotic >= 2 && istype(tool, /obj/item/stack/nanopaste)) @@ -189,13 +219,13 @@ /datum/surgery_step/internal/manipulate_organs/end_step(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool,datum/surgery/surgery) if(current_type == "mend") - var/tool_name = "\the [tool]" + var/tool_name = "[tool]" if(istype(tool, /obj/item/stack/medical/bruise_pack/advanced)) tool_name = "regenerative membrane" if(istype(tool, /obj/item/stack/medical/bruise_pack)) tool_name = "the bandaid" if(istype(tool, /obj/item/stack/nanopaste)) - tool_name = "\the [tool]" //what else do you call nanopaste medically? + tool_name = "[tool]" //what else do you call nanopaste medically? if(!hasorgans(target)) return @@ -217,27 +247,27 @@ I = tool user.drop_item() I.insert(target) - spread_germs_to_organ(I, user) + spread_germs_to_organ(I, user, tool) if(!user.canUnEquip(I, 0)) to_chat(user, "[I] is stuck to your hand, you can't put it in [target]!") return 0 if(affected) - user.visible_message(" [user] has transplanted \the [tool] into [target]'s [affected.name].", - " You have transplanted \the [tool] into [target]'s [affected.name].") + user.visible_message(" [user] has transplanted [tool] into [target]'s [affected.name].", + " You have transplanted [tool] into [target]'s [affected.name].") else - user.visible_message(" [user] has transplanted \the [tool] into [target]'s [parse_zone(target_zone)].", - " You have transplanted \the [tool] into [target]'s [parse_zone(target_zone)].") + user.visible_message(" [user] has transplanted [tool] into [target]'s [parse_zone(target_zone)].", + " You have transplanted [tool] into [target]'s [parse_zone(target_zone)].") I.status &= ~ORGAN_CUT_AWAY else if(current_type == "extract") if(I && I.owner == target) - user.visible_message(" [user] has separated and extracts [target]'s [I] with \the [tool].", - " You have separated and extracted [target]'s [I] with \the [tool].") + user.visible_message(" [user] has separated and extracts [target]'s [I] with [tool].", + " You have separated and extracted [target]'s [I] with [tool].") add_logs(user, target, "surgically removed [I.name] from", addition="INTENT: [uppertext(user.a_intent)]") - spread_germs_to_organ(I, user) + spread_germs_to_organ(I, user, tool) I.status |= ORGAN_CUT_AWAY var/obj/item/thing = I.remove(target) if(!istype(thing)) @@ -250,20 +280,49 @@ 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 == "clean") + if(!hasorgans(target)) + return + if(!istype(tool,/obj/item/weapon/reagent_containers)) + return + + var/obj/item/weapon/reagent_containers/C = tool + var/datum/reagents/R = C.reagents + var/ethanol = 0 //how much alcohol is in the thing + + if(R.reagent_list.len) + for(var/datum/reagent/consumable/ethanol/alcohol in R.reagent_list) + ethanol += alcohol.alcohol_perc * 300 + ethanol /= R.reagent_list.len + + for(var/obj/item/organ/internal/I in affected.internal_organs) + if(I) + if(R.total_volume < GHETTO_DISINFECT_AMOUNT) + user.visible_message("[user] notices there is not enough of [tool].", \ + "You notice there is not enough of [tool].") + return 0 + if(I.germ_level < INFECTION_LEVEL_ONE / 2) + to_chat(user, "[I] does not appear to be infected.") + if(I.germ_level >= INFECTION_LEVEL_ONE / 2) + I.germ_level = max(I.germ_level-ethanol, 0) + user.visible_message(" [user] has poured some of [tool] over [target]'s [I.name].", + " You have poured some of [tool] over [target]'s [I.name].") + R.trans_to(target, GHETTO_DISINFECT_AMOUNT) + R.reaction(target, INGEST) + else if(current_type == "finish") if(affected && affected.encased) - var/msg = " [user] bends [target]'s [affected.encased] back into place with \the [tool]." - var/self_msg = " You bend [target]'s [affected.encased] back into place with \the [tool]." + var/msg = " [user] bends [target]'s [affected.encased] back into place with [tool]." + var/self_msg = " You bend [target]'s [affected.encased] back into place with [tool]." user.visible_message(msg, self_msg) affected.open = 2.5 else - var/msg = "[user] pulls [target]'s flesh back into place with \the [tool]." - var/self_msg = "You pull [target]'s flesh back into place with \the [tool]." + var/msg = "[user] pulls [target]'s flesh back into place with [tool]." + var/self_msg = "You pull [target]'s flesh back into place with [tool]." user.visible_message(msg, self_msg) return 1 - return 0 /datum/surgery_step/internal/manipulate_organs/fail_step(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool,datum/surgery/surgery) @@ -271,8 +330,8 @@ if(!hasorgans(target)) return - user.visible_message(" [user]'s hand slips, getting mess and tearing the inside of [target]'s [affected.name] with \the [tool]!", \ - " Your hand slips, getting mess and tearing the inside of [target]'s [affected.name] with \the [tool]!") + user.visible_message(" [user]'s hand slips, getting mess and tearing the inside of [target]'s [affected.name] with [tool]!", \ + " Your hand slips, getting mess and tearing the inside of [target]'s [affected.name] with [tool]!") var/dam_amt = 2 @@ -291,24 +350,49 @@ return 0 else if(current_type == "insert") - user.visible_message(" [user]'s hand slips, damaging \the [tool]!", \ - " Your hand slips, damaging \the [tool]!") + user.visible_message(" [user]'s hand slips, damaging [tool]!", \ + " Your hand slips, damaging [tool]!") var/obj/item/organ/internal/I = tool if(istype(I) && !I.tough) I.take_damage(rand(3,5),0) return 0 + else if(current_type == "clean") + if(!hasorgans(target)) + return + if(!istype(tool,/obj/item/weapon/reagent_containers)) + return + + var/obj/item/weapon/reagent_containers/C = tool + var/datum/reagents/R = C.reagents + var/ethanol = 0 //how much alcohol is in the thing + + if(R.reagent_list.len) + for(var/datum/reagent/consumable/ethanol/alcohol in R.reagent_list) + ethanol += alcohol.alcohol_perc * 300 + ethanol /= C.reagents.reagent_list.len + + for(var/obj/item/organ/internal/I in affected.internal_organs) + I.germ_level = max(I.germ_level-ethanol, 0) + I.take_damage(rand(4,8),0) + + R.trans_to(target, GHETTO_DISINFECT_AMOUNT * 10) + R.reaction(target, INGEST) + + user.visible_message(" [user]'s hand slips, splashing the contents of [tool] all over [target]'s [affected.name] incision!", \ + " Your hand slips, splashing the contents of [tool] all over [target]'s [affected.name] incision!") + return 0 else if(current_type == "extract") if(I && I.owner == target) if(affected) - user.visible_message(" [user]'s hand slips, damaging [target]'s [affected.name] with \the [tool]!", \ - " Your hand slips, damaging [target]'s [affected.name] with \the [tool]!") + user.visible_message(" [user]'s hand slips, damaging [target]'s [affected.name] with [tool]!", \ + " Your hand slips, damaging [target]'s [affected.name] with [tool]!") affected.createwound(BRUISE, 20) else - user.visible_message(" [user]'s hand slips, damaging [target]'s [parse_zone(target_zone)] with \the [tool]!", \ - " Your hand slips, damaging [target]'s [parse_zone(target_zone)] with \the [tool]!") + user.visible_message(" [user]'s hand slips, damaging [target]'s [parse_zone(target_zone)] with [tool]!", \ + " Your hand slips, damaging [target]'s [parse_zone(target_zone)] with [tool]!") 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)]!") @@ -349,20 +433,20 @@ /datum/surgery_step/saw_carapace/begin_step(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool,datum/surgery/surgery) - user.visible_message("[user] begins to cut through [target]'s [target_zone] with \the [tool].", \ - "You begin to cut through [target]'s [target_zone] with \the [tool].") + user.visible_message("[user] begins to cut through [target]'s [target_zone] with [tool].", \ + "You begin to cut through [target]'s [target_zone] with [tool].") ..() /datum/surgery_step/saw_carapace/end_step(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool,datum/surgery/surgery) - user.visible_message(" [user] has cut [target]'s [target_zone] open with \the [tool].", \ - " You have cut [target]'s [target_zone] open with \the [tool].") + user.visible_message(" [user] has cut [target]'s [target_zone] open with [tool].", \ + " You have cut [target]'s [target_zone] open with [tool].") return 1 /datum/surgery_step/saw_carapace/fail_step(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool,datum/surgery/surgery) - user.visible_message(" [user]'s hand slips, cracking [target]'s [target_zone] with \the [tool]!" , \ - " Your hand slips, cracking [target]'s [target_zone] with \the [tool]!" ) + user.visible_message(" [user]'s hand slips, cracking [target]'s [target_zone] with [tool]!" , \ + " Your hand slips, cracking [target]'s [target_zone] with [tool]!" ) return 0 /datum/surgery_step/cut_carapace @@ -375,27 +459,27 @@ /obj/item/weapon/twohanded/chainsaw = 1, \ /obj/item/weapon/claymore = 5, \ /obj/item/weapon/melee/energy/ = 5, \ - /obj/item/weapon/pen/edagger = 5, \ + /obj/item/weapon/pen/edagger = 5, \ ) time = 16 /datum/surgery_step/cut_carapace/begin_step(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool,datum/surgery/surgery) - user.visible_message("[user] starts the incision on [target]'s [target_zone] with \the [tool].", \ - "You start the incision on [target]'s [target_zone] with \the [tool].") + user.visible_message("[user] starts the incision on [target]'s [target_zone] with [tool].", \ + "You start the incision on [target]'s [target_zone] with [tool].") ..() /datum/surgery_step/cut_carapace/end_step(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool,datum/surgery/surgery) - user.visible_message(" [user] has made an incision on [target]'s [target_zone] with \the [tool].", \ - " You have made an incision on [target]'s [target_zone] with \the [tool].",) + user.visible_message(" [user] has made an incision on [target]'s [target_zone] with [tool].", \ + " You have made an incision on [target]'s [target_zone] with [tool].",) return 1 /datum/surgery_step/cut_carapace/fail_step(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool,datum/surgery/surgery) - user.visible_message(" [user]'s hand slips, slicing open [target]'s [target_zone] in a wrong spot with \the [tool]!", \ - " Your hand slips, slicing open [target]'s [target_zone] in a wrong spot with \the [tool]!") + user.visible_message(" [user]'s hand slips, slicing open [target]'s [target_zone] in a wrong spot with [tool]!", \ + " Your hand slips, slicing open [target]'s [target_zone] in a wrong spot with [tool]!") return 0 /datum/surgery_step/retract_carapace @@ -411,37 +495,37 @@ time = 24 /datum/surgery_step/retract_carapace/begin_step(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool,datum/surgery/surgery) - var/msg = "[user] starts to pry open the incision on [target]'s [target_zone] with \the [tool]." - var/self_msg = "You start to pry open the incision on [target]'s [target_zone] with \the [tool]." + var/msg = "[user] starts to pry open the incision on [target]'s [target_zone] with [tool]." + var/self_msg = "You start to pry open the incision on [target]'s [target_zone] with [tool]." if(target_zone == "chest") - msg = "[user] starts to separate the ribcage and rearrange the organs in [target]'s torso with \the [tool]." - self_msg = "You start to separate the ribcage and rearrange the organs in [target]'s torso with \the [tool]." + msg = "[user] starts to separate the ribcage and rearrange the organs in [target]'s torso with [tool]." + self_msg = "You start to separate the ribcage and rearrange the organs in [target]'s torso with [tool]." if(target_zone == "groin") - msg = "[user] starts to pry open the incision and rearrange the organs in [target]'s lower abdomen with \the [tool]." - self_msg = "You start to pry open the incision and rearrange the organs in [target]'s lower abdomen with \the [tool]." + msg = "[user] starts to pry open the incision and rearrange the organs in [target]'s lower abdomen with [tool]." + self_msg = "You start to pry open the incision and rearrange the organs in [target]'s lower abdomen with [tool]." user.visible_message(msg, self_msg) ..() /datum/surgery_step/retract_carapace/end_step(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool,datum/surgery/surgery) - var/msg = " [user] keeps the incision open on [target]'s [target_zone] with \the [tool]." - var/self_msg = " You keep the incision open on [target]'s [target_zone] with \the [tool]." + var/msg = " [user] keeps the incision open on [target]'s [target_zone] with [tool]." + var/self_msg = " You keep the incision open on [target]'s [target_zone] with [tool]." if(target_zone == "chest") - msg = " [user] keeps the ribcage open on [target]'s torso with \the [tool]." - self_msg = " You keep the ribcage open on [target]'s torso with \the [tool]." + msg = " [user] keeps the ribcage open on [target]'s torso with [tool]." + self_msg = " You keep the ribcage open on [target]'s torso with [tool]." if(target_zone == "groin") - msg = " [user] keeps the incision open on [target]'s lower abdomen with \the [tool]." - self_msg = " You keep the incision open on [target]'s lower abdomen with \the [tool]." + msg = " [user] keeps the incision open on [target]'s lower abdomen with [tool]." + self_msg = " You keep the incision open on [target]'s lower abdomen with [tool]." user.visible_message(msg, self_msg) return 1 /datum/surgery_step/generic/retract_carapace/fail_step(mob/living/user, mob/living/carbon/target, target_zone, obj/item/tool,datum/surgery/surgery) - var/msg = " [user]'s hand slips, tearing the edges of incision on [target]'s [target_zone] with \the [tool]!" - var/self_msg = " Your hand slips, tearing the edges of incision on [target]'s [target_zone] with \the [tool]!" + var/msg = " [user]'s hand slips, tearing the edges of incision on [target]'s [target_zone] with [tool]!" + var/self_msg = " Your hand slips, tearing the edges of incision on [target]'s [target_zone] with [tool]!" if(target_zone == "chest") - msg = " [user]'s hand slips, damaging several organs [target]'s torso with \the [tool]!" - self_msg = " Your hand slips, damaging several organs [target]'s torso with \the [tool]!" + msg = " [user]'s hand slips, damaging several organs [target]'s torso with [tool]!" + self_msg = " Your hand slips, damaging several organs [target]'s torso with [tool]!" if(target_zone == "groin") - msg = " [user]'s hand slips, damaging several organs [target]'s lower abdomen with \the [tool]" - self_msg = " Your hand slips, damaging several organs [target]'s lower abdomen with \the [tool]!" + msg = " [user]'s hand slips, damaging several organs [target]'s lower abdomen with [tool]" + self_msg = " Your hand slips, damaging several organs [target]'s lower abdomen with [tool]!" user.visible_message(msg, self_msg) return 0 diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm index 87f676c7903..cfd6b8e632e 100644 --- a/code/modules/surgery/other.dm +++ b/code/modules/surgery/other.dm @@ -13,6 +13,11 @@ steps = list(/datum/surgery_step/generic/cut_open,/datum/surgery_step/generic/clamp_bleeders,/datum/surgery_step/generic/retract_skin,/datum/surgery_step/fix_vein,/datum/surgery_step/generic/cauterize) possible_locs = list("chest","head","groin", "l_arm", "r_arm", "l_leg", "r_leg", "r_hand", "l_hand", "r_foot", "l_foot") +/datum/surgery/debridement + name = "Debridement" + steps = list(/datum/surgery_step/generic/cut_open,/datum/surgery_step/generic/clamp_bleeders,/datum/surgery_step/generic/retract_skin,/datum/surgery_step/fix_dead_tissue,/datum/surgery_step/treat_necrosis,/datum/surgery_step/generic/cauterize) + possible_locs = list("chest","head","groin", "l_arm", "r_arm", "l_leg", "r_leg", "r_hand", "l_hand", "r_foot", "l_foot") + /datum/surgery/infection/can_start(mob/user, mob/living/carbon/target) if(ishuman(target)) var/mob/living/carbon/human/H = target @@ -39,6 +44,24 @@ return 1 return 0 +/datum/surgery/debridement/can_start(mob/user, mob/living/carbon/target) + if(ishuman(target)) + var/mob/living/carbon/human/H = target + var/obj/item/organ/external/affected = H.get_organ(user.zone_sel.selecting) + + if(!hasorgans(target)) + return 0 + + if(!affected) + return 0 + + if(!(affected.status & ORGAN_DEAD)) + return 0 + + return 1 + + return 0 + /datum/surgery_step/fix_vein name = "mend internal bleeding" allowed_tools = list( @@ -115,7 +138,6 @@ if(!(affected.status & ORGAN_DEAD)) return 0 - return 1 /datum/surgery_step/fix_dead_tissue/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) @@ -146,9 +168,11 @@ allowed_tools = list( /obj/item/weapon/reagent_containers/dropper = 100, /obj/item/weapon/reagent_containers/glass/bottle = 75, - /obj/item/weapon/reagent_containers/glass/beaker = 75, + /obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 70, + /obj/item/weapon/reagent_containers/food/drinks/bottle = 65, + /obj/item/weapon/reagent_containers/glass/beaker = 60, /obj/item/weapon/reagent_containers/spray = 50, - /obj/item/weapon/reagent_containers/glass/bucket = 50, + /obj/item/weapon/reagent_containers/glass/bucket = 40 ) can_infect = 0 @@ -156,12 +180,14 @@ time = 24 -/datum/surgery_step/fix_dead_tissue/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) +/datum/surgery_step/treat_necrosis/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) if(!istype(tool, /obj/item/weapon/reagent_containers)) return 0 var/obj/item/weapon/reagent_containers/container = tool if(!container.reagents.has_reagent("mitocholide")) + user.visible_message("[user] looks at \the [tool] and ponders." , \ + "You are not sure if \the [tool] contains mitocholide to treat the necrosis.") return 0 if(!hasorgans(target)) @@ -172,34 +198,39 @@ return 0 return 1 -/datum/surgery_step/fix_dead_tissue/begin_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) +/datum/surgery_step/treat_necrosis/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 applying medication to the affected tissue in [target]'s [affected.name] with \the [tool]." , \ "You start applying medication to the affected tissue in [target]'s [affected.name] with \the [tool].") target.custom_pain("Something in your [affected.name] is causing you a lot of pain!",1) ..() -/datum/surgery_step/fix_dead_tissue/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) +/datum/surgery_step/treat_necrosis/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) if(!istype(tool, /obj/item/weapon/reagent_containers)) return 0 var/obj/item/weapon/reagent_containers/container = tool + var/mitocholide = 0 + + if(container.reagents.has_reagent("mitocholide")) + mitocholide = 1 var/trans = container.reagents.trans_to(target, container.amount_per_transfer_from_this) if(trans > 0) container.reagents.reaction(target, INGEST) //technically it's contact, but the reagents are being applied to internal tissue - if(container.reagents.has_reagent("mitocholide")) + if(mitocholide) affected.status &= ~ORGAN_DEAD + target.update_body() user.visible_message(" [user] applies [trans] units of the solution to affected tissue in [target]'s [affected.name]", \ " You apply [trans] units of the solution to affected tissue in [target]'s [affected.name] with \the [tool].") return 1 -/datum/surgery_step/fix_dead_tissue/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) +/datum/surgery_step/treat_necrosis/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) if(!istype(tool, /obj/item/weapon/reagent_containers)) diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index de3d84796f4..127077a621d 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -163,7 +163,7 @@ if(ishuman(target)) var/obj/item/organ/external/affected = target.get_organ(target_zone) if(can_infect && affected) - spread_germs_to_organ(affected, user) + spread_germs_to_organ(affected, user, tool) if(ishuman(user) && !(istype(target,/mob/living/carbon/alien)) && prob(60)) var/mob/living/carbon/human/H = user if(blood_level) @@ -180,16 +180,45 @@ /datum/surgery_step/proc/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery) return null +/proc/spread_germs_to_organ(obj/item/organ/E, mob/living/carbon/human/user, obj/item/tool) + if(!istype(user) || !istype(E)) + return -/proc/spread_germs_to_organ(obj/item/organ/E, mob/living/carbon/human/user) - if(!istype(user) || !istype(E)) return -// to_chat(world, "Germ spread: [E] : [E.owner]") var/germ_level = user.germ_level + + //germ spread from surgeon touching the patient if(user.gloves) germ_level = user.gloves.germ_level if(!(E.status & ORGAN_ROBOT)) //Germs on robotic limbs bad E.germ_level = max(germ_level,E.germ_level) //as funny as scrubbing microbes out with clean gloves is - no. + spread_germs_by_incision(E,tool)//germ spread from environement to patient +/proc/spread_germs_by_incision(obj/item/organ/external/E,obj/item/tool) + if(!istype(E,/obj/item/organ/external)) + return + + var/germs = 0 + + for(var/mob/living/carbon/human/H in view(2, E.loc))//germs from people + if(AStar(E.loc, H.loc, /turf/proc/Distance, 2, simulated_only = 0)) + if((!(NO_BREATH in H.mutations) || !(H.species.flags & NO_BREATH)) && !H.wear_mask) //wearing a mask helps preventing people from breathing cooties into open incisions + germs+=H.germ_level/4 + + for(var/obj/effect/decal/cleanable/M in view(2, E.loc))//germs from messes + if(AStar(E.loc, M.loc, /turf/proc/Distance, 2, simulated_only = 0)) + if(!istype(M,/obj/effect/decal/cleanable/dirt))//dirt is too common + germs++ + + if(tool.blood_DNA && tool.blood_DNA.len) //germs from blood-stained tools + germs += 30 + + if(E.internal_organs.len) + germs = germs / E.internal_organs.len + for(var/obj/item/organ/internal/O in E.internal_organs) + if(!(O.status & ORGAN_ROBOT)) + O.germ_level += germs + + E.germ_level += germs /proc/sort_surgeries() var/gap = surgery_steps.len