diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index 60b4cefefc1..fe60ad7b3e0 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -9,13 +9,21 @@ 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() + update_icon() + +/obj/item/weapon/reagent_containers/dropper/update_icon() + 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 +59,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 +83,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 +98,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 8d5f7669ecd..a782c0a981d 100644 --- a/code/modules/surgery/generic.dm +++ b/code/modules/surgery/generic.dm @@ -89,7 +89,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 242b6e48217..48b4d1332c2 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 73416045624..db603a71b33 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/manager = 120,/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) @@ -110,6 +119,27 @@ 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)].") + 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 \the [tool] is empty.", \ + "You notice \the [tool] is empty") + return 0 + + var/msg = "[user] starts pouring some of \the [tool] over [target]'s [I.name]." + var/self_msg = "You start pouring some of \the [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" @@ -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)) @@ -217,7 +247,7 @@ 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 @@ -237,7 +267,7 @@ " You have separated and extracted [target]'s [I] with \the [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,6 +280,37 @@ 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 \the [tool].", \ + "You notice there is not enough of \the [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.surgeryize()//is this even needed? + I.germ_level = max(I.germ_level-ethanol, 0) + user.visible_message(" [user] has poured some of \the [tool] over [target]'s [I.name].", + " You have poured some of \the [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]." @@ -263,7 +324,6 @@ 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) @@ -299,6 +359,31 @@ 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 \the [tool] all over [target]'s [affected.name] incision!", \ + " Your hand slips, splashing the contents of \the [tool] all over [target]'s [affected.name] incision!") + return 0 else if(current_type == "extract") if(I && I.owner == target) diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm index 8caac8e70eb..df058d08a44 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/mithocolide = 0 + + if(container.reagents.has_reagent("mitocholide")) + mithocolide = 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(mithocolide) 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..743953362fc 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) //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