mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-30 08:37:43 +01:00
Small refactor for medical stack items (#55213)
Someone DM'd me asking a question about what the 'heal' var was for on aloe, I looked into it and realized it was an unnecessary variable that just replicated what heal_brute and heal_burn do. I then realized there was quite a lot of unnecessary copypasta in medical stack code, so I made some changes to make it neater and added some documentation in to boot
This commit is contained in:
@@ -15,16 +15,19 @@
|
||||
cost = 250
|
||||
source = /datum/robot_energy_storage/medical
|
||||
merge_type = /obj/item/stack/medical
|
||||
var/self_delay = 50
|
||||
/// How long it takes to apply it to yourself
|
||||
var/self_delay = 5 SECONDS
|
||||
/// How long it takes to apply it to someone else
|
||||
var/other_delay = 0
|
||||
/// If we've still got more and the patient is still hurt, should we keep going automatically?
|
||||
var/repeating = FALSE
|
||||
/// How much brute we heal per application
|
||||
/// How much brute we heal per application. This is the only number that matters for simplemobs
|
||||
var/heal_brute
|
||||
/// How much burn we heal per application
|
||||
var/heal_burn
|
||||
/// How much we reduce bleeding per application on cut wounds
|
||||
var/stop_bleeding
|
||||
/// How much sanitization to apply to burns on application
|
||||
/// How much sanitization to apply to burn wounds on application
|
||||
var/sanitization
|
||||
/// How much we add to flesh_healing for burn wounds on application
|
||||
var/flesh_regeneration
|
||||
@@ -33,49 +36,66 @@
|
||||
. = ..()
|
||||
try_heal(M, user)
|
||||
|
||||
|
||||
/obj/item/stack/medical/proc/try_heal(mob/living/M, mob/user, silent = FALSE)
|
||||
if(!M.can_inject(user, TRUE))
|
||||
/// In which we print the message that we're starting to heal someone, then we try healing them. Does the do_after whether or not it can actually succeed on a targeted mob
|
||||
/obj/item/stack/medical/proc/try_heal(mob/living/patient, mob/user, silent = FALSE)
|
||||
if(!patient.can_inject(user, TRUE))
|
||||
return
|
||||
if(M == user)
|
||||
if(patient == user)
|
||||
if(!silent)
|
||||
user.visible_message("<span class='notice'>[user] starts to apply \the [src] on [user.p_them()]self...</span>", "<span class='notice'>You begin applying \the [src] on yourself...</span>")
|
||||
if(!do_mob(user, M, self_delay, extra_checks=CALLBACK(M, /mob/living/proc/can_inject, user, TRUE)))
|
||||
user.visible_message("<span class='notice'>[user] starts to apply [src] on [user.p_them()]self...</span>", "<span class='notice'>You begin applying [src] on yourself...</span>")
|
||||
if(!do_mob(user, patient, self_delay, extra_checks=CALLBACK(patient, /mob/living/proc/can_inject, user, TRUE)))
|
||||
return
|
||||
else if(other_delay)
|
||||
if(!silent)
|
||||
user.visible_message("<span class='notice'>[user] starts to apply \the [src] on [M].</span>", "<span class='notice'>You begin applying \the [src] on [M]...</span>")
|
||||
if(!do_mob(user, M, other_delay, extra_checks=CALLBACK(M, /mob/living/proc/can_inject, user, TRUE)))
|
||||
user.visible_message("<span class='notice'>[user] starts to apply [src] on [patient].</span>", "<span class='notice'>You begin applying [src] on [patient]...</span>")
|
||||
if(!do_mob(user, patient, other_delay, extra_checks=CALLBACK(patient, /mob/living/proc/can_inject, user, TRUE)))
|
||||
return
|
||||
|
||||
if(heal(M, user))
|
||||
log_combat(user, M, "healed", src.name)
|
||||
if(heal(patient, user))
|
||||
log_combat(user, patient, "healed", src.name)
|
||||
use(1)
|
||||
if(repeating && amount > 0)
|
||||
try_heal(M, user, TRUE)
|
||||
try_heal(patient, user, TRUE)
|
||||
|
||||
/obj/item/stack/medical/proc/heal(mob/living/M, mob/user)
|
||||
return
|
||||
/// Apply the actual effects of the healing if it's a simple animal, goes to [/obj/item/stack/medical/proc/heal_carbon] if it's a carbon, returns TRUE if it works, FALSE if it doesn't
|
||||
/obj/item/stack/medical/proc/heal(mob/living/patient, mob/user)
|
||||
if(patient.stat == DEAD)
|
||||
to_chat(user, "<span class='warning'>[patient] is dead! You can not help [patient.p_them()].</span>")
|
||||
return
|
||||
if(isanimal(patient) && heal_brute) // only brute can heal
|
||||
var/mob/living/simple_animal/critter = patient
|
||||
if (!critter.healable)
|
||||
to_chat(user, "<span class='warning'>You cannot use [src] on [patient]!</span>")
|
||||
return FALSE
|
||||
else if (critter.health == critter.maxHealth)
|
||||
to_chat(user, "<span class='notice'>[patient] is at full health.</span>")
|
||||
return FALSE
|
||||
user.visible_message("<span class='green'>[user] applies [src] on [patient].</span>", "<span class='green'>You apply [src] on [patient].</span>")
|
||||
patient.heal_bodypart_damage((heal_brute * 0.5))
|
||||
return TRUE
|
||||
if(iscarbon(patient))
|
||||
return heal_carbon(patient, user, heal_brute, heal_burn)
|
||||
to_chat(user, "<span class='warning'>You can't heal [patient] with [src]!</span>")
|
||||
|
||||
/// The healing effects on a carbon patient. Since we have extra details for dealing with bodyparts, we get our own fancy proc. Still returns TRUE on success and FALSE on fail
|
||||
/obj/item/stack/medical/proc/heal_carbon(mob/living/carbon/C, mob/user, brute, burn)
|
||||
var/obj/item/bodypart/affecting = C.get_bodypart(check_zone(user.zone_selected))
|
||||
if(!affecting) //Missing limb?
|
||||
to_chat(user, "<span class='warning'>[C] doesn't have \a [parse_zone(user.zone_selected)]!</span>")
|
||||
return FALSE
|
||||
if(affecting.status != BODYPART_ORGANIC) //Limb must be organic to be healed - RR
|
||||
to_chat(user, "<span class='warning'>\The [src] won't work on a robotic limb!</span>")
|
||||
to_chat(user, "<span class='warning'>[src] won't work on a robotic limb!</span>")
|
||||
return FALSE
|
||||
if(affecting.brute_dam && brute || affecting.burn_dam && burn)
|
||||
user.visible_message("<span class='green'>[user] applies \the [src] on [C]'s [affecting.name].</span>", "<span class='green'>You apply \the [src] on [C]'s [affecting.name].</span>")
|
||||
user.visible_message("<span class='green'>[user] applies [src] on [C]'s [affecting.name].</span>", "<span class='green'>You apply [src] on [C]'s [affecting.name].</span>")
|
||||
var/previous_damage = affecting.get_damage()
|
||||
if(affecting.heal_damage(brute, burn))
|
||||
C.update_damage_overlays()
|
||||
post_heal_effects(max(previous_damage - affecting.get_damage(), 0), C, user)
|
||||
return TRUE
|
||||
to_chat(user, "<span class='warning'>[C]'s [affecting.name] can not be healed with \the [src]!</span>")
|
||||
to_chat(user, "<span class='warning'>[C]'s [affecting.name] can not be healed with [src]!</span>")
|
||||
return FALSE
|
||||
|
||||
|
||||
///Override this proc for special post heal effects.
|
||||
/obj/item/stack/medical/proc/post_heal_effects(amount_healed, mob/living/carbon/healed_mob, mob/user)
|
||||
return
|
||||
@@ -88,30 +108,11 @@
|
||||
lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
|
||||
heal_brute = 40
|
||||
self_delay = 40
|
||||
other_delay = 20
|
||||
self_delay = 4 SECONDS
|
||||
other_delay = 2 SECONDS
|
||||
grind_results = list(/datum/reagent/medicine/c2/libital = 10)
|
||||
merge_type = /obj/item/stack/medical/bruise_pack
|
||||
|
||||
/obj/item/stack/medical/bruise_pack/heal(mob/living/M, mob/user)
|
||||
if(M.stat == DEAD)
|
||||
to_chat(user, "<span class='warning'>[M] is dead! You can not help [M.p_them()].</span>")
|
||||
return
|
||||
if(isanimal(M))
|
||||
var/mob/living/simple_animal/critter = M
|
||||
if (!(critter.healable))
|
||||
to_chat(user, "<span class='warning'>You cannot use \the [src] on [M]!</span>")
|
||||
return FALSE
|
||||
else if (critter.health == critter.maxHealth)
|
||||
to_chat(user, "<span class='notice'>[M] is at full health.</span>")
|
||||
return FALSE
|
||||
user.visible_message("<span class='green'>[user] applies \the [src] on [M].</span>", "<span class='green'>You apply \the [src] on [M].</span>")
|
||||
M.heal_bodypart_damage((heal_brute/2))
|
||||
return TRUE
|
||||
if(iscarbon(M))
|
||||
return heal_carbon(M, user, heal_brute, heal_burn)
|
||||
to_chat(user, "<span class='warning'>You can't heal [M] with \the [src]!</span>")
|
||||
|
||||
/obj/item/stack/medical/bruise_pack/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is bludgeoning [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to commit suicide!</span>")
|
||||
return (BRUTELOSS)
|
||||
@@ -122,8 +123,8 @@
|
||||
gender = PLURAL
|
||||
singular_name = "medical gauze"
|
||||
icon_state = "gauze"
|
||||
self_delay = 50
|
||||
other_delay = 20
|
||||
self_delay = 5 SECONDS
|
||||
other_delay = 2 SECONDS
|
||||
max_amount = 12
|
||||
amount = 6
|
||||
grind_results = list(/datum/reagent/cellulose = 2)
|
||||
@@ -158,7 +159,6 @@
|
||||
return
|
||||
|
||||
user.visible_message("<span class='warning'>[user] begins wrapping the wounds on [M]'s [limb.name] with [src]...</span>", "<span class='warning'>You begin wrapping the wounds on [user == M ? "your" : "[M]'s"] [limb.name] with [src]...</span>")
|
||||
|
||||
if(!do_after(user, (user == M ? self_delay : other_delay), target=M))
|
||||
return
|
||||
|
||||
@@ -182,27 +182,35 @@
|
||||
return ..()
|
||||
|
||||
/obj/item/stack/medical/gauze/suicide_act(mob/living/user)
|
||||
user.visible_message("<span class='suicide'>[user] begins tightening \the [src] around [user.p_their()] neck! It looks like [user.p_they()] forgot how to use medical supplies!</span>")
|
||||
user.visible_message("<span class='suicide'>[user] begins tightening [src] around [user.p_their()] neck! It looks like [user.p_they()] forgot how to use medical supplies!</span>")
|
||||
return OXYLOSS
|
||||
|
||||
/obj/item/stack/medical/gauze/improvised
|
||||
name = "improvised gauze"
|
||||
singular_name = "improvised gauze"
|
||||
desc = "A roll of cloth roughly cut from something that does a decent job of stabilizing wounds, but less efficiently so than real medical gauze."
|
||||
self_delay = 60
|
||||
other_delay = 30
|
||||
self_delay = 6 SECONDS
|
||||
other_delay = 3 SECONDS
|
||||
absorption_rate = 0.15
|
||||
absorption_capacity = 4
|
||||
merge_type = /obj/item/stack/medical/gauze/improvised
|
||||
|
||||
/*
|
||||
The idea is for the following medical devices to work like a hybrid of the old brute packs and tend wounds,
|
||||
they heal a little at a time, have reduced healing density and does not allow for rapid healing while in combat.
|
||||
However they provice graunular control of where the healing is directed, this makes them better for curing work-related cuts and scrapes.
|
||||
|
||||
The interesting limb targeting mechanic is retained and i still believe they will be a viable choice, especially when healing others in the field.
|
||||
*/
|
||||
|
||||
/obj/item/stack/medical/suture
|
||||
name = "suture"
|
||||
desc = "Basic sterile sutures used to seal up cuts and lacerations and stop bleeding."
|
||||
gender = PLURAL
|
||||
singular_name = "suture"
|
||||
icon_state = "suture"
|
||||
self_delay = 30
|
||||
other_delay = 10
|
||||
self_delay = 3 SECONDS
|
||||
other_delay = 1 SECONDS
|
||||
amount = 10
|
||||
max_amount = 10
|
||||
repeating = TRUE
|
||||
@@ -228,27 +236,6 @@
|
||||
grind_results = list(/datum/reagent/medicine/polypyr = 1)
|
||||
merge_type = /obj/item/stack/medical/suture/medicated
|
||||
|
||||
/obj/item/stack/medical/suture/heal(mob/living/M, mob/user)
|
||||
. = ..()
|
||||
if(M.stat == DEAD)
|
||||
to_chat(user, "<span class='warning'>[M] is dead! You can not help [M.p_them()].</span>")
|
||||
return
|
||||
if(iscarbon(M))
|
||||
return heal_carbon(M, user, heal_brute, heal_burn)
|
||||
if(isanimal(M))
|
||||
var/mob/living/simple_animal/critter = M
|
||||
if (!(critter.healable))
|
||||
to_chat(user, "<span class='warning'>You cannot use \the [src] on [M]!</span>")
|
||||
return FALSE
|
||||
else if (critter.health == critter.maxHealth)
|
||||
to_chat(user, "<span class='notice'>[M] is at full health.</span>")
|
||||
return FALSE
|
||||
user.visible_message("<span class='green'>[user] applies \the [src] on [M].</span>", "<span class='green'>You apply \the [src] on [M].</span>")
|
||||
M.heal_bodypart_damage(heal_brute)
|
||||
return TRUE
|
||||
|
||||
to_chat(user, "<span class='warning'>You can't heal [M] with \the [src]!</span>")
|
||||
|
||||
/obj/item/stack/medical/ointment
|
||||
name = "ointment"
|
||||
desc = "Basic burn ointment, rated effective for second degree burns with proper bandaging, though it's still an effective stabilizer for worse burns. Not terribly good at outright healing burns though."
|
||||
@@ -259,8 +246,8 @@
|
||||
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
|
||||
amount = 8
|
||||
max_amount = 8
|
||||
self_delay = 40
|
||||
other_delay = 20
|
||||
self_delay = 4 SECONDS
|
||||
other_delay = 2 SECONDS
|
||||
|
||||
heal_burn = 5
|
||||
flesh_regeneration = 2.5
|
||||
@@ -268,16 +255,8 @@
|
||||
grind_results = list(/datum/reagent/medicine/c2/lenturi = 10)
|
||||
merge_type = /obj/item/stack/medical/ointment
|
||||
|
||||
/obj/item/stack/medical/ointment/heal(mob/living/M, mob/user)
|
||||
if(M.stat == DEAD)
|
||||
to_chat(user, "<span class='warning'>[M] is dead! You can not help [M.p_them()].</span>")
|
||||
return
|
||||
if(iscarbon(M))
|
||||
return heal_carbon(M, user, heal_brute, heal_burn)
|
||||
to_chat(user, "<span class='warning'>You can't heal [M] with \the [src]!</span>")
|
||||
|
||||
/obj/item/stack/medical/ointment/suicide_act(mob/living/user)
|
||||
user.visible_message("<span class='suicide'>[user] is squeezing \the [src] into [user.p_their()] mouth! [user.p_do(TRUE)]n't [user.p_they()] know that stuff is toxic?</span>")
|
||||
user.visible_message("<span class='suicide'>[user] is squeezing [src] into [user.p_their()] mouth! [user.p_do(TRUE)]n't [user.p_they()] know that stuff is toxic?</span>")
|
||||
return TOXLOSS
|
||||
|
||||
/obj/item/stack/medical/mesh
|
||||
@@ -286,8 +265,8 @@
|
||||
gender = PLURAL
|
||||
singular_name = "mesh piece"
|
||||
icon_state = "regen_mesh"
|
||||
self_delay = 30
|
||||
other_delay = 10
|
||||
self_delay = 3 SECONDS
|
||||
other_delay = 1 SECONDS
|
||||
amount = 15
|
||||
heal_burn = 10
|
||||
max_amount = 15
|
||||
@@ -311,33 +290,23 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/stack/medical/mesh/heal(mob/living/M, mob/user)
|
||||
. = ..()
|
||||
if(M.stat == DEAD)
|
||||
to_chat(user, "<span class='warning'>[M] is dead! You can not help [M.p_them()].</span>")
|
||||
return
|
||||
if(iscarbon(M))
|
||||
return heal_carbon(M, user, heal_brute, heal_burn)
|
||||
to_chat(user, "<span class='warning'>You can't heal [M] with \the [src]!</span>")
|
||||
|
||||
|
||||
/obj/item/stack/medical/mesh/try_heal(mob/living/M, mob/user, silent = FALSE)
|
||||
if(!is_open)
|
||||
to_chat(user, "<span class='warning'>You need to open [src] first.</span>")
|
||||
return
|
||||
. = ..()
|
||||
return ..()
|
||||
|
||||
/obj/item/stack/medical/mesh/AltClick(mob/living/user)
|
||||
if(!is_open)
|
||||
to_chat(user, "<span class='warning'>You need to open [src] first.</span>")
|
||||
return
|
||||
. = ..()
|
||||
return ..()
|
||||
|
||||
/obj/item/stack/medical/mesh/attack_hand(mob/user)
|
||||
if(!is_open && user.get_inactive_held_item() == src)
|
||||
to_chat(user, "<span class='warning'>You need to open [src] first.</span>")
|
||||
return
|
||||
. = ..()
|
||||
return ..()
|
||||
|
||||
/obj/item/stack/medical/mesh/attack_self(mob/user)
|
||||
if(!is_open)
|
||||
@@ -346,7 +315,7 @@
|
||||
update_icon()
|
||||
playsound(src, 'sound/items/poster_ripped.ogg', 20, TRUE)
|
||||
return
|
||||
. = ..()
|
||||
return ..()
|
||||
|
||||
/obj/item/stack/medical/mesh/advanced
|
||||
name = "advanced regenerative mesh"
|
||||
@@ -368,50 +337,22 @@
|
||||
|
||||
/obj/item/stack/medical/aloe
|
||||
name = "aloe cream"
|
||||
desc = "A healing paste you can apply on wounds."
|
||||
desc = "A healing paste for minor cuts and burns."
|
||||
|
||||
gender = PLURAL
|
||||
singular_name = "aloe cream"
|
||||
icon_state = "aloe_paste"
|
||||
self_delay = 20
|
||||
other_delay = 10
|
||||
self_delay = 2 SECONDS
|
||||
other_delay = 1 SECONDS
|
||||
novariants = TRUE
|
||||
amount = 20
|
||||
max_amount = 20
|
||||
repeating = TRUE
|
||||
var/heal = 3
|
||||
heal_brute = 3
|
||||
heal_burn = 3
|
||||
grind_results = list(/datum/reagent/consumable/aloejuice = 1)
|
||||
merge_type = /obj/item/stack/medical/aloe
|
||||
|
||||
/obj/item/stack/medical/aloe/heal(mob/living/M, mob/user)
|
||||
. = ..()
|
||||
if(M.stat == DEAD)
|
||||
to_chat(user, "<span class='warning'>[M] is dead! You can not help [M.p_them()].</span>")
|
||||
return FALSE
|
||||
if(iscarbon(M))
|
||||
return heal_carbon(M, user, heal, heal)
|
||||
if(isanimal(M))
|
||||
var/mob/living/simple_animal/critter = M
|
||||
if (!(critter.healable))
|
||||
to_chat(user, "<span class='warning'>You cannot use \the [src] on [M]!</span>")
|
||||
return FALSE
|
||||
else if (critter.health == critter.maxHealth)
|
||||
to_chat(user, "<span class='notice'>[M] is at full health.</span>")
|
||||
return FALSE
|
||||
user.visible_message("<span class='green'>[user] applies \the [src] on [M].</span>", "<span class='green'>You apply \the [src] on [M].</span>")
|
||||
M.heal_bodypart_damage(heal, heal)
|
||||
return TRUE
|
||||
|
||||
to_chat(user, "<span class='warning'>You can't heal [M] with the \the [src]!</span>")
|
||||
|
||||
/*
|
||||
The idea is for these medical devices to work like a hybrid of the old brute packs and tend wounds,
|
||||
they heal a little at a time, have reduced healing density and does not allow for rapid healing while in combat.
|
||||
However they provice graunular control of where the healing is directed, this makes them better for curing work-related cuts and scrapes.
|
||||
|
||||
The interesting limb targeting mechanic is retained and i still believe they will be a viable choice, especially when healing others in the field.
|
||||
*/
|
||||
|
||||
/obj/item/stack/medical/bone_gel
|
||||
name = "bone gel"
|
||||
singular_name = "bone gel"
|
||||
@@ -433,26 +374,27 @@
|
||||
return
|
||||
|
||||
/obj/item/stack/medical/bone_gel/suicide_act(mob/user)
|
||||
if(iscarbon(user))
|
||||
var/mob/living/carbon/C = user
|
||||
C.visible_message("<span class='suicide'>[C] is squirting all of \the [src] into [C.p_their()] mouth! That's not proper procedure! It looks like [C.p_theyre()] trying to commit suicide!</span>")
|
||||
if(do_after(C, 2 SECONDS))
|
||||
C.emote("scream")
|
||||
for(var/i in C.bodyparts)
|
||||
var/obj/item/bodypart/bone = i
|
||||
var/datum/wound/blunt/severe/oof_ouch = new
|
||||
oof_ouch.apply_wound(bone)
|
||||
var/datum/wound/blunt/critical/oof_OUCH = new
|
||||
oof_OUCH.apply_wound(bone)
|
||||
if(!iscarbon(user))
|
||||
return
|
||||
var/mob/living/carbon/C = user
|
||||
C.visible_message("<span class='suicide'>[C] is squirting all of [src] into [C.p_their()] mouth! That's not proper procedure! It looks like [C.p_theyre()] trying to commit suicide!</span>")
|
||||
if(!do_after(C, 2 SECONDS))
|
||||
C.visible_message("<span class='suicide'>[C] screws up like an idiot and still dies anyway!</span>")
|
||||
return (BRUTELOSS)
|
||||
|
||||
for(var/i in C.bodyparts)
|
||||
var/obj/item/bodypart/bone = i
|
||||
bone.receive_damage(brute=60)
|
||||
use(1)
|
||||
return (BRUTELOSS)
|
||||
else
|
||||
C.visible_message("<span class='suicide'>[C] screws up like an idiot and still dies anyway!</span>")
|
||||
return (BRUTELOSS)
|
||||
C.emote("scream")
|
||||
for(var/i in C.bodyparts)
|
||||
var/obj/item/bodypart/bone = i
|
||||
var/datum/wound/blunt/severe/oof_ouch = new
|
||||
oof_ouch.apply_wound(bone)
|
||||
var/datum/wound/blunt/critical/oof_OUCH = new
|
||||
oof_OUCH.apply_wound(bone)
|
||||
|
||||
for(var/i in C.bodyparts)
|
||||
var/obj/item/bodypart/bone = i
|
||||
bone.receive_damage(brute=60)
|
||||
use(1)
|
||||
return (BRUTELOSS)
|
||||
|
||||
/obj/item/stack/medical/poultice
|
||||
name = "mourning poultices"
|
||||
@@ -472,10 +414,10 @@
|
||||
merge_type = /obj/item/stack/medical/poultice
|
||||
|
||||
/obj/item/stack/medical/poultice/heal(mob/living/M, mob/user)
|
||||
. = .. ()
|
||||
if(iscarbon(M))
|
||||
playsound(src, 'sound/misc/soggy.ogg', 30, TRUE)
|
||||
return heal_carbon(M, user, heal_brute, heal_burn)
|
||||
return ..()
|
||||
|
||||
/obj/item/stack/medical/poultice/post_heal_effects(amount_healed, mob/living/carbon/healed_mob, mob/user)
|
||||
. = ..()
|
||||
|
||||
Reference in New Issue
Block a user