diff --git a/code/modules/surgery/abstract_steps.dm b/code/modules/surgery/abstract_steps.dm index df7619b212a..4465f07ca1b 100644 --- a/code/modules/surgery/abstract_steps.dm +++ b/code/modules/surgery/abstract_steps.dm @@ -292,13 +292,30 @@ to_chat(user, "The bones in [target]'s [parse_zone(affected)] look fully intact, they don't need mending.") return FALSE -/// Proxy surgery step to allow healing bleeding and mending bones. +/datum/surgery/intermediate/treat_burns + name = "Burns (abstract)" + desc = "An intermediate surgery to treat burn wounds while a patient is undergoing another procedure." + steps = list(/datum/surgery_step/treat_burns) + possible_locs = list(BODY_ZONE_CHEST, BODY_ZONE_HEAD, BODY_ZONE_PRECISE_GROIN, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_FOOT, BODY_ZONE_PRECISE_L_FOOT) + +/datum/surgery/intermediate/treat_burns/can_start(mob/user, mob/living/carbon/target) + . = ..() + if(!.) + return FALSE + var/mob/living/carbon/human/H = target + var/obj/item/organ/external/affected = H.get_organ(user.zone_selected) + if(affected.status & ORGAN_BURNT) + return TRUE + return FALSE + +/// Proxy surgery step to allow healing bleeding, bones, and burns. /// Should be added into surgeries just after the first three standard steps. /datum/surgery_step/proxy/open_organ - name = "mend internal bleeding or mend bone (proxy)" + name = "mend internal bleeding, bones, or burns (proxy)" branches = list( /datum/surgery/intermediate/bleeding, - /datum/surgery/intermediate/mendbone + /datum/surgery/intermediate/mendbone, + /datum/surgery/intermediate/treat_burns ) /// Mend IB without healing bones diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm index 78aa20f6bfe..a2aee0e2e39 100644 --- a/code/modules/surgery/other.dm +++ b/code/modules/surgery/other.dm @@ -33,6 +33,26 @@ possible_locs = list(BODY_ZONE_CHEST, BODY_ZONE_HEAD, BODY_ZONE_PRECISE_GROIN, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_FOOT, BODY_ZONE_PRECISE_L_FOOT) requires_organic_bodypart = TRUE +/datum/surgery/treat_burns + name = "Treat Severe Burns" + steps = list( + /datum/surgery_step/generic/cut_open, + /datum/surgery_step/generic/clamp_bleeders, + /datum/surgery_step/generic/retract_skin, + /datum/surgery_step/proxy/open_organ, + /datum/surgery_step/generic/cauterize + ) + possible_locs = list(BODY_ZONE_CHEST, BODY_ZONE_HEAD, BODY_ZONE_PRECISE_GROIN, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_FOOT, BODY_ZONE_PRECISE_L_FOOT) + +/datum/surgery/treat_burns/can_start(mob/user, mob/living/carbon/target) + . = ..() + if(!.) + return FALSE + var/obj/item/organ/external/affected = target.get_organ(user.zone_selected) + if(affected.status & ORGAN_BURNT) + return TRUE + return FALSE + /datum/surgery/bleeding/can_start(mob/user, mob/living/carbon/target) . = ..() if(!.) @@ -51,7 +71,6 @@ return FALSE return TRUE - /datum/surgery_step/fix_vein name = "mend internal bleeding" allowed_tools = list( @@ -94,13 +113,66 @@ /datum/surgery_step/fix_vein/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, smearing [tool] in the incision in [target]'s [affected.name]!", - " Your hand slips, smearing [tool] in the incision in [target]'s [affected.name]!" + "[user]'s hand slips, smearing [tool] in the incision in [target]'s [affected.name]!", + "Your hand slips, smearing [tool] in the incision in [target]'s [affected.name]!" ) affected.receive_damage(5, 0) return SURGERY_STEP_RETRY +/datum/surgery_step/treat_burns + name = "mend burns" + allowed_tools = list( + /obj/item/stack/medical/ointment/advanced = 100, + /obj/item/stack/medical/ointment = 90 + ) + can_infect = TRUE + blood_level = SURGERY_BLOODSPREAD_HANDS + + time = 3.2 SECONDS + +/datum/surgery_step/treat_burns/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) + if(!(affected.status & ORGAN_BURNT)) + to_chat(user, "The skin on [target]'s [parse_zone(affected)] seems to be in perfect condition, it doesn't need treatment.") + return SURGERY_BEGINSTEP_SKIP + + user.visible_message( + "[user] starts to treat the scorched tissue in [target]'s [affected.name] with [tool].", + "You start to treat the scorched tissue in [target]'s [affected.name] with [tool]." + ) + target.custom_pain("Your [affected.name] flares with agony as its burn is touched!") + + return ..() + +/datum/surgery_step/treat_burns/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/stack/stack = tool + + stack.use(1) + affected.fix_burn_wound() + affected.germ_level = 0 + target.update_body() + + user.visible_message( + "[user] finishes treating affected tissue in [target]'s [affected.name].", + "You finish treating affected tissue in [target]'s [affected.name] with [tool]." + ) + + return SURGERY_STEP_CONTINUE + +/datum/surgery_step/treat_burns/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) + var/obj/item/stack/stack = tool + + stack.use(1) + + user.visible_message( + "[user]'s hand slips, applying [tool] in the wrong place on [target]'s [affected.name]!", + "Your hand slips, applying [tool] in the wrong place on [target]'s [affected.name]!" + ) + + return SURGERY_STEP_RETRY /datum/surgery_step/fix_dead_tissue //Debridement name = "remove dead tissue" allowed_tools = list( @@ -136,8 +208,8 @@ /datum/surgery_step/fix_dead_tissue/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, slicing an artery inside [target]'s [affected.name] with \the [tool]!", - " Your hand slips, slicing an artery inside [target]'s [affected.name] with \the [tool]!" + "[user]'s hand slips, slicing an artery inside [target]'s [affected.name] with [tool]!", + "Your hand slips, slicing an artery inside [target]'s [affected.name] with [tool]!" ) affected.receive_damage(20) @@ -223,8 +295,8 @@ container.reagents.reaction(target, REAGENT_INGEST) //technically it's contact, but the reagents are being applied to internal tissue user.visible_message( - " [user]'s hand slips, applying [trans] units of the solution to the wrong place in [target]'s [affected.name] with the [tool]!", - " Your hand slips, applying [trans] units of the solution to the wrong place in [target]'s [affected.name] with the [tool]!" + "[user]'s hand slips, applying [trans] units of the solution to the wrong place in [target]'s [affected.name] with the [tool]!", + "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