// TODO: well, a lot really, but specifically I want to add potential fusing of clothing/equipment on the affected area, and limb infections, though those may go in body part code /datum/wound/burn a_or_from = "from" wound_type = WOUND_LIST_BURN processes = TRUE sound_effect = 'sound/effects/sizzle1.ogg' treatable_by = list(/obj/item/stack/medical/gauze, /obj/item/stack/medical/ointment, /obj/item/stack/medical/mesh) // sterilizer and alcohol will require reagent treatments, coming soon // Flesh damage vars /// How much damage to our flesh we currently have. Once both this and infestation reach 0, the wound is considered healed var/flesh_damage = 5 /// Our current counter for how much flesh regeneration we have stacked from regenerative mesh/synthflesh/whatever, decrements each tick and lowers flesh_damage var/flesh_healing = 0 // Infestation vars (only for severe and critical) /// How quickly infection breeds on this burn if we don't have disinfectant var/infestation_rate = 0 /// Our current level of infection var/infestation = 0 /// Our current level of sanitization/anti-infection, from disinfectants/alcohol/UV lights. While positive, totally pauses and slowly reverses infestation effects each tick var/sanitization = 0 /// Once we reach infestation beyond WOUND_INFESTATION_SEPSIS, we get this many warnings before the limb is completely paralyzed (you'd have to ignore a really bad burn for a really long time for this to happen) var/strikes_to_lose_limb = 3 /// The current bandage we have for this wound (maybe move bandages to the limb?) var/obj/item/stack/current_bandage /datum/wound/burn/handle_process() . = ..() if(strikes_to_lose_limb == 0) victim.adjustToxLoss(0.5) if(prob(1)) victim.visible_message("The infection on the remnants of [victim]'s [limb.name] shift and bubble nauseatingly!", "You can feel the infection on the remnants of your [limb.name] coursing through your veins!") return if(victim.reagents) if(victim.reagents.has_reagent(/datum/reagent/medicine/spaceacillin)) sanitization += 0.9 if(victim.reagents.has_reagent(/datum/reagent/space_cleaner/sterilizine/)) sanitization += 0.9 if(victim.reagents.has_reagent(/datum/reagent/medicine/mine_salve)) sanitization += 0.3 flesh_healing += 0.5 if(current_bandage) current_bandage.absorption_capacity -= WOUND_BURN_SANITIZATION_RATE if(current_bandage.absorption_capacity <= 0) victim.visible_message("Pus soaks through \the [current_bandage] on [victim]'s [limb.name].", "Pus soaks through \the [current_bandage] on your [limb.name].", vision_distance=COMBAT_MESSAGE_RANGE) QDEL_NULL(current_bandage) treat_priority = TRUE if(flesh_healing > 0) var/bandage_factor = (current_bandage ? current_bandage.splint_factor : 1) flesh_damage = max(0, flesh_damage - 1) flesh_healing = max(0, flesh_healing - bandage_factor) // good bandages multiply the length of flesh healing // here's the check to see if we're cleared up if((flesh_damage <= 0) && (infestation <= 1)) to_chat(victim, "The burns on your [limb.name] have cleared up!") qdel(src) return // sanitization is checked after the clearing check but before the rest, because we freeze the effects of infection while we have sanitization if(sanitization > 0) var/bandage_factor = (current_bandage ? current_bandage.splint_factor : 1) infestation = max(0, infestation - WOUND_BURN_SANITIZATION_RATE) sanitization = max(0, sanitization - (WOUND_BURN_SANITIZATION_RATE * bandage_factor)) return infestation += infestation_rate switch(infestation) if(0 to WOUND_INFECTION_MODERATE) if(WOUND_INFECTION_MODERATE to WOUND_INFECTION_SEVERE) if(prob(30)) victim.adjustToxLoss(0.2) if(prob(6)) to_chat(victim, "The blisters on your [limb.name] ooze a strange pus...") if(WOUND_INFECTION_SEVERE to WOUND_INFECTION_CRITICAL) if(!disabling && prob(2)) to_chat(victim, "Your [limb.name] completely locks up, as you struggle for control against the infection!") disabling = TRUE else if(disabling && prob(8)) to_chat(victim, "You regain sensation in your [limb.name], but it's still in terrible shape!") disabling = FALSE else if(prob(20)) victim.adjustToxLoss(0.5) if(WOUND_INFECTION_CRITICAL to WOUND_INFECTION_SEPTIC) if(!disabling && prob(3)) to_chat(victim, "You suddenly lose all sensation of the festering infection in your [limb.name]!") disabling = TRUE else if(disabling && prob(3)) to_chat(victim, "You can barely feel your [limb.name] again, and you have to strain to retain motor control!") disabling = FALSE else if(prob(1)) to_chat(victim, "You contemplate life without your [limb.name]...") victim.adjustToxLoss(0.75) else if(prob(4)) victim.adjustToxLoss(1) if(WOUND_INFECTION_SEPTIC to INFINITY) if(prob(infestation)) switch(strikes_to_lose_limb) if(3 to INFINITY) to_chat(victim, "The skin on your [limb.name] is literally dripping off, you feel awful!") if(2) to_chat(victim, "The infection in your [limb.name] is literally dripping off, you feel horrible!") if(1) to_chat(victim, "Infection has just about completely claimed your [limb.name]!") if(0) to_chat(victim, "The last of the nerve endings in your [limb.name] wither away, as the infection completely paralyzes your joint connector.") threshold_penalty = 120 // piss easy to destroy var/datum/brain_trauma/severe/paralysis/sepsis = new (limb.body_zone) victim.gain_trauma(sepsis) strikes_to_lose_limb-- /datum/wound/burn/get_examine_description(mob/user) if(strikes_to_lose_limb <= 0) return "[victim.p_their(TRUE)] [limb.name] is completely dead and unrecognizable as organic." var/condition = "" if(current_bandage) var/bandage_condition switch(current_bandage.absorption_capacity) if(0 to 1.25) bandage_condition = "nearly ruined " if(1.25 to 2.75) bandage_condition = "badly worn " if(2.75 to 4) bandage_condition = "slightly pus-stained " if(4 to INFINITY) bandage_condition = "clean " condition += " underneath a dressing of [bandage_condition] [current_bandage.name]" else switch(infestation) if(WOUND_INFECTION_MODERATE to WOUND_INFECTION_SEVERE) condition += ", with small spots of discoloration along the nearby veins!" if(WOUND_INFECTION_SEVERE to WOUND_INFECTION_CRITICAL) condition += ", with dark clouds spreading outwards under the skin!" if(WOUND_INFECTION_CRITICAL to WOUND_INFECTION_SEPTIC) condition += ", with streaks of rotten infection pulsating outward!" if(WOUND_INFECTION_SEPTIC to INFINITY) return "[victim.p_their(TRUE)] [limb.name] is a mess of char and rot, skin literally dripping off the bone with infection!" else condition += "!" return "[victim.p_their(TRUE)] [limb.name] [examine_desc][condition]" /datum/wound/burn/get_scanner_description(mob/user) if(strikes_to_lose_limb == 0) var/oopsie = "Type: [name]\nSeverity: [severity_text()]" oopsie += "
Infection Level: The infection is total. The bodypart is lost. Amputate or augment limb immediately.
" return oopsie . = ..() . += "
" if(infestation <= sanitization && flesh_damage <= flesh_healing) . += "No further treatment required: Burns will heal shortly." else switch(infestation) if(WOUND_INFECTION_MODERATE to WOUND_INFECTION_SEVERE) . += "Infection Level: Moderate\n" if(WOUND_INFECTION_SEVERE to WOUND_INFECTION_CRITICAL) . += "Infection Level: Severe\n" if(WOUND_INFECTION_CRITICAL to WOUND_INFECTION_SEPTIC) . += "Infection Level: CRITICAL\n" if(WOUND_INFECTION_SEPTIC to INFINITY) . += "Infection Level: LOSS IMMINENT\n" if(infestation > sanitization) . += "\tSurgical debridement, antiobiotics/sterilizers, or regenerative mesh will rid infection. Paramedic UV penlights are also effective.\n" if(flesh_damage > 0) . += "Flesh damage detected: Please apply ointment or regenerative mesh to allow recovery.\n" . += "
" /* new burn common procs */ /// if someone is using ointment on our burns /datum/wound/burn/proc/ointment(obj/item/stack/medical/ointment/I, mob/user) user.visible_message("[user] begins applying [I] to [victim]'s [limb.name]...", "You begin applying [I] to [user == victim ? "your" : "[victim]'s"] [limb.name]...") if(!do_after(user, (user == victim ? I.self_delay : I.other_delay), target = victim)) return limb.heal_damage(I.heal_brute, I.heal_burn) user.visible_message("[user] applies [I] to [victim].", "You apply [I] to [user == victim ? "your" : "[victim]'s"] [limb.name].") I.use(1) sanitization += I.sanitization flesh_healing += I.flesh_regeneration if((infestation <= 0 || sanitization >= infestation) && (flesh_damage <= 0 || flesh_healing > flesh_damage)) to_chat(user, "You've done all you can with [I], now you must wait for the flesh on [victim]'s [limb.name] to recover.") else try_treating(I, user) /// for use in the burn dressing surgery since we don't want to make them do another do_after obviously /datum/wound/burn/proc/force_bandage(obj/item/stack/medical/gauze/I, mob/user) QDEL_NULL(current_bandage) current_bandage = new I.type(limb) current_bandage.amount = 1 treat_priority = FALSE sanitization += I.sanitization I.use(1) /// if someone is wrapping gauze on our burns /datum/wound/burn/proc/bandage(obj/item/stack/medical/gauze/I, mob/user) if(current_bandage) if(current_bandage.absorption_capacity > I.absorption_capacity + 1) to_chat(user, "The [current_bandage] on [victim]'s [limb.name] is still in better condition than your [I.name]!") return user.visible_message("[user] begins to redress the burns on [victim]'s [limb.name] with [I]...", "You begin redressing the burns on [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...") else user.visible_message("[user] begins to dress the burns on [victim]'s [limb.name] with [I]...", "You begin dressing the burns on [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...") if(!do_after(user, (user == victim ? I.self_delay : I.other_delay), target=victim, extra_checks = CALLBACK(src, .proc/still_exists))) return user.visible_message("[user] applies [I] to [victim].", "You apply [I] to [user == victim ? "your" : "[victim]'s"] [limb.name].") QDEL_NULL(current_bandage) current_bandage = new I.type(limb) current_bandage.amount = 1 treat_priority = FALSE sanitization += I.sanitization I.use(1) /// if someone is using mesh on our burns /datum/wound/burn/proc/mesh(obj/item/stack/medical/mesh/I, mob/user) user.visible_message("[user] begins wrapping [victim]'s [limb.name] with [I]...", "You begin wrapping [user == victim ? "your" : "[victim]'s"] [limb.name] with [I]...") if(!do_after(user, (user == victim ? I.self_delay : I.other_delay), target=victim, extra_checks = CALLBACK(src, .proc/still_exists))) return limb.heal_damage(I.heal_brute, I.heal_burn) user.visible_message("[user] applies [I] to [victim].", "You apply [I] to [user == victim ? "your" : "[victim]'s"] [limb.name].") I.use(1) sanitization += I.sanitization flesh_healing += I.flesh_regeneration if(sanitization >= infestation && flesh_healing > flesh_damage) to_chat(user, "You've done all you can with [I], now you must wait for the flesh on [victim]'s [limb.name] to recover.") else try_treating(I, user) /// Paramedic UV penlights /datum/wound/burn/proc/uv(obj/item/flashlight/pen/paramedic/I, mob/user) if(I.uv_cooldown > world.time) to_chat(user, "[I] is still recharging!") return if(infestation <= 0 || infestation < sanitization) to_chat(user, "There's no infection to treat on [victim]'s [limb.name]!") return user.visible_message("[user] flashes the burns on [victim]'s [limb] with [I].", "You flash the burns on [user == victim ? "your" : "[victim]'s"] [limb.name] with [I].", vision_distance=COMBAT_MESSAGE_RANGE) sanitization += I.uv_power I.uv_cooldown = world.time + I.uv_cooldown_length /datum/wound/burn/treat(obj/item/I, mob/user) if(istype(I, /obj/item/stack/medical/gauze)) bandage(I, user) else if(istype(I, /obj/item/stack/medical/ointment)) ointment(I, user) else if(istype(I, /obj/item/stack/medical/mesh)) mesh(I, user) else if(istype(I, /obj/item/flashlight/pen/paramedic)) uv(I, user) /// basic support for instabitaluri/synthflesh healing flesh damage, more chem support in the future /datum/wound/burn/proc/regenerate_flesh(amount) flesh_healing += amount * 0.5 // 20u patch will heal 10 flesh standard // we don't even care about first degree burns, straight to second /datum/wound/burn/moderate name = "Second Degree Burns" desc = "Patient is suffering considerable burns with mild skin penetration, weakening limb integrity and increased burning sensations." treat_text = "Recommended application of topical ointment or regenerative mesh to affected region." examine_desc = "is badly burned and breaking out in blisters" occur_text = "breaks out with violent red burns" severity = WOUND_SEVERITY_MODERATE damage_mulitplier_penalty = 1.1 threshold_minimum = 40 threshold_penalty = 30 // burns cause significant decrease in limb integrity compared to other wounds status_effect_type = /datum/status_effect/wound/burn/moderate flesh_damage = 5 scarring_descriptions = list("small amoeba-shaped skinmarks", "a faded streak of depressed skin") /datum/wound/burn/severe name = "Third Degree Burns" desc = "Patient is suffering extreme burns with full skin penetration, creating serious risk of infection and greatly reduced limb integrity." treat_text = "Recommended immediate disinfection and excision of any infected skin, followed by bandaging and ointment." examine_desc = "appears seriously charred, with aggressive red splotches" occur_text = "chars rapidly, exposing ruined tissue and spreading angry red burns" severity = WOUND_SEVERITY_SEVERE damage_mulitplier_penalty = 1.2 threshold_minimum = 80 threshold_penalty = 40 status_effect_type = /datum/status_effect/wound/burn/severe treatable_by = list(/obj/item/flashlight/pen/paramedic, /obj/item/stack/medical/gauze, /obj/item/stack/medical/ointment, /obj/item/stack/medical/mesh) infestation_rate = 0.05 // appx 13 minutes to reach sepsis without any treatment flesh_damage = 12.5 scarring_descriptions = list("a large, jagged patch of faded skin", "random spots of shiny, smooth skin", "spots of taut, leathery skin") /datum/wound/burn/critical name = "Catastrophic Burns" desc = "Patient is suffering near complete loss of tissue and significantly charred muscle and bone, creating life-threatening risk of infection and negligible limb integrity." treat_text = "Immediate surgical debriding of any infected skin, followed by potent tissue regeneration formula and bandaging." examine_desc = "is a ruined mess of blanched bone, melted fat, and charred tissue" occur_text = "vaporizes as flesh, bone, and fat melt together in a horrifying mess" severity = WOUND_SEVERITY_CRITICAL damage_mulitplier_penalty = 1.3 sound_effect = 'sound/effects/sizzle2.ogg' threshold_minimum = 140 threshold_penalty = 80 status_effect_type = /datum/status_effect/wound/burn/critical treatable_by = list(/obj/item/flashlight/pen/paramedic, /obj/item/stack/medical/gauze, /obj/item/stack/medical/ointment, /obj/item/stack/medical/mesh) infestation_rate = 0.15 // appx 4.33 minutes to reach sepsis without any treatment flesh_damage = 20 scarring_descriptions = list("massive, disfiguring keloid scars", "several long streaks of badly discolored and malformed skin", "unmistakeable splotches of dead tissue from serious burns")