Files
Bubberstation/code/modules/surgery/healing.dm
Watermelon914 375a20e49b Refactors most spans into span procs (#59645)
Converts most spans into span procs. Mostly used regex for this and sorted out any compile time errors afterwards so there could be some bugs.
Was initially going to do defines, but ninja said to make it into a proc, and if there's any overhead, they can easily be changed to defines.

Makes it easier to control the formatting and prevents typos when creating spans as it'll runtime if you misspell instead of silently failing.
Reduces the code you need to write when writing spans, as you don't need to close the span as that's automatically handled by the proc.

(Note from Lemon: This should be converted to defines once we update the minimum version to 514. Didn't do it now because byond pain and such)
2021-06-14 13:03:53 -07:00

327 lines
13 KiB
Plaintext

/datum/surgery/healing
steps = list(
/datum/surgery_step/incise,
/datum/surgery_step/retract_skin,
/datum/surgery_step/incise,
/datum/surgery_step/clamp_bleeders,
/datum/surgery_step/heal,
/datum/surgery_step/close)
target_mobtypes = list(/mob/living)
possible_locs = list(BODY_ZONE_CHEST)
requires_bodypart_type = FALSE
replaced_by = /datum/surgery
ignore_clothes = TRUE
var/healing_step_type
var/antispam = FALSE
/datum/surgery/healing/can_start(mob/user, mob/living/patient)
. = ..()
if(isanimal(patient))
var/mob/living/simple_animal/critter = patient
if(!critter.healable)
return FALSE
if(!(patient.mob_biotypes & (MOB_ORGANIC|MOB_HUMANOID)))
return FALSE
/datum/surgery/healing/New(surgery_target, surgery_location, surgery_bodypart)
..()
if(healing_step_type)
steps = list(
/datum/surgery_step/incise/nobleed,
healing_step_type, //hehe cheeky
/datum/surgery_step/close)
/datum/surgery_step/heal
name = "repair body"
implements = list(
TOOL_HEMOSTAT = 100,
TOOL_SCREWDRIVER = 65,
/obj/item/pen = 55)
repeatable = TRUE
time = 25
var/brutehealing = 0
var/burnhealing = 0
var/brute_multiplier = 0 //multiplies the damage that the patient has. if 0 the patient wont get any additional healing from the damage he has.
var/burn_multiplier = 0
/// Returns a string letting the surgeon know roughly how much longer the surgery is estimated to take at the going rate
/datum/surgery_step/heal/proc/get_progress(mob/user, mob/living/carbon/target, brute_healed, burn_healed)
return
/datum/surgery_step/heal/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
var/woundtype
if(brutehealing && burnhealing)
woundtype = "wounds"
else if(brutehealing)
woundtype = "bruises"
else //why are you trying to 0,0...?
woundtype = "burns"
if(istype(surgery,/datum/surgery/healing))
var/datum/surgery/healing/the_surgery = surgery
if(!the_surgery.antispam)
display_results(user, target, span_notice("You attempt to patch some of [target]'s [woundtype]."),
span_notice("[user] attempts to patch some of [target]'s [woundtype]."),
span_notice("[user] attempts to patch some of [target]'s [woundtype]."))
/datum/surgery_step/heal/initiate(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, try_to_fail = FALSE)
if(!..())
return
while((brutehealing && target.getBruteLoss()) || (burnhealing && target.getFireLoss()))
if(!..())
break
/datum/surgery_step/heal/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE)
var/user_msg = "You succeed in fixing some of [target]'s wounds" //no period, add initial space to "addons"
var/target_msg = "[user] fixes some of [target]'s wounds" //see above
var/brute_healed = brutehealing
var/burn_healed = burnhealing
if(target.stat == DEAD) //dead patients get way less additional heal from the damage they have.
brute_healed += round((target.getBruteLoss() * (brute_multiplier * 0.2)),0.1)
burn_healed += round((target.getFireLoss() * (burn_multiplier * 0.2)),0.1)
else
brute_healed += round((target.getBruteLoss() * brute_multiplier),0.1)
burn_healed += round((target.getFireLoss() * burn_multiplier),0.1)
if(!get_location_accessible(target, target_zone))
brute_healed *= 0.55
burn_healed *= 0.55
user_msg += " as best as you can while [target.p_they()] [target.p_have()] clothing on"
target_msg += " as best as [user.p_they()] can while [target.p_they()] [target.p_have()] clothing on"
target.heal_bodypart_damage(brute_healed,burn_healed)
user_msg += get_progress(user, target, brute_healed, burn_healed)
display_results(user, target, span_notice("[user_msg]."),
"[target_msg].",
"[target_msg].")
if(istype(surgery, /datum/surgery/healing))
var/datum/surgery/healing/the_surgery = surgery
the_surgery.antispam = TRUE
return ..()
/datum/surgery_step/heal/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
display_results(user, target, span_warning("You screwed up!"),
span_warning("[user] screws up!"),
span_notice("[user] fixes some of [target]'s wounds."), TRUE)
var/brute_dealt = brutehealing * 0.8
var/burn_dealt = burnhealing * 0.8
brute_dealt += round((target.getBruteLoss() * (brute_multiplier * 0.5)),0.1)
burn_dealt += round((target.getFireLoss() * (burn_multiplier * 0.5)),0.1)
target.take_bodypart_damage(brute_dealt, burn_dealt, wound_bonus=CANT_WOUND)
return FALSE
/***************************BRUTE***************************/
/datum/surgery/healing/brute
name = "Tend Wounds (Bruises)"
/datum/surgery/healing/brute/basic
name = "Tend Wounds (Bruises, Basic)"
replaced_by = /datum/surgery/healing/brute/upgraded
healing_step_type = /datum/surgery_step/heal/brute/basic
desc = "A surgical procedure that provides basic treatment for a patient's brute traumas. Heals slightly more when the patient is severely injured."
/datum/surgery/healing/brute/upgraded
name = "Tend Wounds (Bruises, Adv.)"
replaced_by = /datum/surgery/healing/brute/upgraded/femto
requires_tech = TRUE
healing_step_type = /datum/surgery_step/heal/brute/upgraded
desc = "A surgical procedure that provides advanced treatment for a patient's brute traumas. Heals more when the patient is severely injured."
/datum/surgery/healing/brute/upgraded/femto
name = "Tend Wounds (Bruises, Exp.)"
replaced_by = /datum/surgery/healing/combo/upgraded/femto
requires_tech = TRUE
healing_step_type = /datum/surgery_step/heal/brute/upgraded/femto
desc = "A surgical procedure that provides experimental treatment for a patient's brute traumas. Heals considerably more when the patient is severely injured."
/********************BRUTE STEPS********************/
/datum/surgery_step/heal/brute/get_progress(mob/user, mob/living/carbon/target, brute_healed, burn_healed)
if(!brute_healed)
return
var/estimated_remaining_steps = target.getBruteLoss() / brute_healed
var/progress_text
if(locate(/obj/item/healthanalyzer) in user.held_items)
progress_text = ". Remaining brute: <font color='#ff3333'>[target.getBruteLoss()]</font>"
else
switch(estimated_remaining_steps)
if(-INFINITY to 1)
return
if(1 to 3)
progress_text = ", stitching up the last few scrapes"
if(3 to 6)
progress_text = ", counting down the last few bruises left to treat"
if(6 to 9)
progress_text = ", continuing to plug away at [target.p_their()] extensive rupturing"
if(9 to 12)
progress_text = ", steadying yourself for the long surgery ahead"
if(12 to 15)
progress_text = ", though [target.p_they()] still look[target.p_s()] more like ground beef than a person"
if(15 to INFINITY)
progress_text = ", though you feel like you're barely making a dent in treating [target.p_their()] pulped body"
return progress_text
/datum/surgery_step/heal/brute/basic
name = "tend bruises"
brutehealing = 5
brute_multiplier = 0.07
/datum/surgery_step/heal/brute/upgraded
brutehealing = 5
brute_multiplier = 0.1
/datum/surgery_step/heal/brute/upgraded/femto
brutehealing = 5
brute_multiplier = 0.2
/***************************BURN***************************/
/datum/surgery/healing/burn
name = "Tend Wounds (Burn)"
/datum/surgery/healing/burn/basic
name = "Tend Wounds (Burn, Basic)"
replaced_by = /datum/surgery/healing/burn/upgraded
healing_step_type = /datum/surgery_step/heal/burn/basic
desc = "A surgical procedure that provides basic treatment for a patient's burns. Heals slightly more when the patient is severely injured."
/datum/surgery/healing/burn/upgraded
name = "Tend Wounds (Burn, Adv.)"
replaced_by = /datum/surgery/healing/burn/upgraded/femto
requires_tech = TRUE
healing_step_type = /datum/surgery_step/heal/burn/upgraded
desc = "A surgical procedure that provides advanced treatment for a patient's burns. Heals more when the patient is severely injured."
/datum/surgery/healing/burn/upgraded/femto
name = "Tend Wounds (Burn, Exp.)"
replaced_by = /datum/surgery/healing/combo/upgraded/femto
requires_tech = TRUE
healing_step_type = /datum/surgery_step/heal/burn/upgraded/femto
desc = "A surgical procedure that provides experimental treatment for a patient's burns. Heals considerably more when the patient is severely injured."
/********************BURN STEPS********************/
/datum/surgery_step/heal/burn/get_progress(mob/user, mob/living/carbon/target, brute_healed, burn_healed)
if(!burn_healed)
return
var/estimated_remaining_steps = target.getFireLoss() / burn_healed
var/progress_text
if(locate(/obj/item/healthanalyzer) in user.held_items)
progress_text = ". Remaining burn: <font color='#ff9933'>[target.getFireLoss()]</font>"
else
switch(estimated_remaining_steps)
if(-INFINITY to 1)
return
if(1 to 3)
progress_text = ", finishing up the last few singe marks"
if(3 to 6)
progress_text = ", counting down the last few blisters left to treat"
if(6 to 9)
progress_text = ", continuing to plug away at [target.p_their()] thorough roasting"
if(9 to 12)
progress_text = ", steadying yourself for the long surgery ahead"
if(12 to 15)
progress_text = ", though [target.p_they()] still look[target.p_s()] more like burnt steak than a person"
if(15 to INFINITY)
progress_text = ", though you feel like you're barely making a dent in treating [target.p_their()] charred body"
return progress_text
/datum/surgery_step/heal/burn/basic
name = "tend burn wounds"
burnhealing = 5
burn_multiplier = 0.07
/datum/surgery_step/heal/burn/upgraded
burnhealing = 5
burn_multiplier = 0.1
/datum/surgery_step/heal/burn/upgraded/femto
burnhealing = 5
burn_multiplier = 0.2
/***************************COMBO***************************/
/datum/surgery/healing/combo
/datum/surgery/healing/combo
name = "Tend Wounds (Mixture, Basic)"
replaced_by = /datum/surgery/healing/combo/upgraded
requires_tech = TRUE
healing_step_type = /datum/surgery_step/heal/combo
desc = "A surgical procedure that provides basic treatment for a patient's burns and brute traumas. Heals slightly more when the patient is severely injured."
/datum/surgery/healing/combo/upgraded
name = "Tend Wounds (Mixture, Adv.)"
replaced_by = /datum/surgery/healing/combo/upgraded/femto
healing_step_type = /datum/surgery_step/heal/combo/upgraded
desc = "A surgical procedure that provides advanced treatment for a patient's burns and brute traumas. Heals more when the patient is severely injured."
/datum/surgery/healing/combo/upgraded/femto //no real reason to type it like this except consistency, don't worry you're not missing anything
name = "Tend Wounds (Mixture, Exp.)"
replaced_by = null
healing_step_type = /datum/surgery_step/heal/combo/upgraded/femto
desc = "A surgical procedure that provides experimental treatment for a patient's burns and brute traumas. Heals considerably more when the patient is severely injured."
/********************COMBO STEPS********************/
/datum/surgery_step/heal/combo/get_progress(mob/user, mob/living/carbon/target, brute_healed, burn_healed)
var/estimated_remaining_steps = 0
if(brute_healed > 0)
estimated_remaining_steps = max(0, (target.getBruteLoss() / brute_healed))
if(burn_healed > 0)
estimated_remaining_steps = max(estimated_remaining_steps, (target.getFireLoss() / burn_healed)) // whichever is higher between brute or burn steps
var/progress_text
if(locate(/obj/item/healthanalyzer) in user.held_items)
if(target.getBruteLoss())
progress_text = ". Remaining brute: <font color='#ff3333'>[target.getBruteLoss()]</font>"
if(target.getFireLoss())
progress_text += ". Remaining burn: <font color='#ff9933'>[target.getFireLoss()]</font>"
else
switch(estimated_remaining_steps)
if(-INFINITY to 1)
return
if(1 to 3)
progress_text = ", finishing up the last few signs of damage"
if(3 to 6)
progress_text = ", counting down the last few patches of trauma"
if(6 to 9)
progress_text = ", continuing to plug away at [target.p_their()] extensive injuries"
if(9 to 12)
progress_text = ", steadying yourself for the long surgery ahead"
if(12 to 15)
progress_text = ", though [target.p_they()] still look[target.p_s()] more like smooshed baby food than a person"
if(15 to INFINITY)
progress_text = ", though you feel like you're barely making a dent in treating [target.p_their()] broken body"
return progress_text
/datum/surgery_step/heal/combo
name = "tend physical wounds"
brutehealing = 3
burnhealing = 3
brute_multiplier = 0.07
burn_multiplier = 0.07
time = 10
/datum/surgery_step/heal/combo/upgraded
brutehealing = 3
burnhealing = 3
brute_multiplier = 0.1
burn_multiplier = 0.1
/datum/surgery_step/heal/combo/upgraded/femto
brutehealing = 1
burnhealing = 1
brute_multiplier = 0.4
burn_multiplier = 0.4
/datum/surgery_step/heal/combo/upgraded/femto/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
display_results(user, target, span_warning("You screwed up!"),
span_warning("[user] screws up!"),
span_notice("[user] fixes some of [target]'s wounds."), TRUE)
target.take_bodypart_damage(5,5)