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