Dirty surgery rooms more prone to infections and ghetto surgery internal organ disinfection and dead limb revival

Combination of #6743 and #6479, because I am a pro mlg git user, who
would never have issues with the master branch no sir

Doing surgery with another person watching, even if they don't wear a
mask, doesn't warrant an infection either, but beyond that you are
pushing your luck

However, doing surgery in this scenario:

![why would you even do this](http://puu.sh/u7kLj/f3a444e1e9.jpg)
Resulted in acute infections to the heart and lungs.

So, recap:
-Wash your hands, wash your tools if needed, clean your room, wear a
mask and nothing bad happens.
You can even invite a friend to watch over
-Do brain surgery in a blood filled room with 11 clowns honking and
breathing cooties down your patient, and it's just bad
//-Letting your patient go without closing the incisions is also bad why
would you even do that (NOT WORKING ATM)
Allows to use a droppers, bottle, drinking glasses, drinking bottles.
beakers, sprays, or if you are brave
enough, an entire bucket, to treat internal organ infections with
alcohol. The more alcoholic the thing is the more it disinfects. This is
an available option during organ manipulation, at the time where you can
apply trauma kits and etc, so you can for instance apply a trauma kit
and then drip a bottle of vodka over someone's liver to treat infection.

Also adds a debridement surgery to revive dead EXTERNAL organs. Same
list of utensils as the previous, lets you apply mithocolide on a dead
limb or chest to make it unded. Surgery steps are incision, scalpel,
applying a reagent container, cauterize.

🆑 pinatacolada
add: dirty surgery environments get you nasty infections
add: ghetto surgery internal organ disinfection with alcohol
add: dead limb revival surgery step
/🆑
This commit is contained in:
pinatacolada
2017-03-23 15:10:28 +00:00
parent 22c80dca8e
commit eafa00f4b7
6 changed files with 177 additions and 35 deletions
+1 -1
View File
@@ -89,7 +89,7 @@
user.visible_message("<span class='notice'> [user] clamps bleeders in [target]'s [affected.name] with \the [tool]</span>.", \
"<span class='notice'> You clamp bleeders in [target]'s [affected.name] with \the [tool].</span>")
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)
@@ -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("<span class='danger'><b>[user]</b> cuts [src] open with [W]!</span>")
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("<span class='danger'><b>[user]</b> cracks [src] open like an egg with [W]!</span>")
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("<span class='danger'><b>[user]</b> extracts [removing] from [src] with [W]!</span>")
else
+90 -5
View File
@@ -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, "<span class='warning'>[I] is stuck to your hand, you can't put it in [target]!</span>")
return 0
@@ -237,7 +267,7 @@
"<span class='notice'> You have separated and extracted [target]'s [I] with \the [tool].</span>")
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("<span class='notice'>[user] can't seem to extract anything from [target]'s [parse_zone(target_zone)]!</span>",
"<span class='notice'>You can't extract anything from [target]'s [parse_zone(target_zone)]!</span>")
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("<span class='notice'> [user] has poured some of \the [tool] over [target]'s [I.name].</span>",
"<span class='notice'> You have poured some of \the [tool] over [target]'s [I.name].</span>")
R.trans_to(target, GHETTO_DISINFECT_AMOUNT)
R.reaction(target, INGEST)
else if(current_type == "finish")
if(affected && affected.encased)
var/msg = "<span class='notice'> [user] bends [target]'s [affected.encased] back into place with \the [tool].</span>"
@@ -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("<span class='warning'> [user]'s hand slips, splashing the contents of \the [tool] all over [target]'s [affected.name] incision!</span>", \
"<span class='warning'> Your hand slips, splashing the contents of \the [tool] all over [target]'s [affected.name] incision!</span>")
return 0
else if(current_type == "extract")
if(I && I.owner == target)
+39 -8
View File
@@ -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("<span class='notice'> [user] applies [trans] units of the solution to affected tissue in [target]'s [affected.name]</span>", \
"<span class='notice'> You apply [trans] units of the solution to affected tissue in [target]'s [affected.name] with \the [tool].</span>")
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))
+33 -4
View File
@@ -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