From fa05932d090bfca66a9404e886dbf86fe970d3cb Mon Sep 17 00:00:00 2001
From: Nathan Winters <100448493+CinnamonSnowball@users.noreply.github.com>
Date: Sat, 2 Sep 2023 00:06:00 +0200
Subject: [PATCH] Buffs Rod of Asclepius (#21983)
* Refactor mass heal out into a proc; readability
* Make user's healing particles more accurate
* Make target's healing particles more accurate
* Make Rod of Asclepius not waste heal points on healthy targets
* Let Asclepius Rod heal robotic limbs
* Fix simple animals sometimes not producing heal particles
* Fix Asclepius Rod not updating health after fixing burn wounds
* webedit temptation
* Remove redundant checks and healing from carbons
* Simplify silicon damage check
* Who wrote this
* Clarify two `if` checks
* I forgor
* Get this linter a True...
* Simplify? the simplemob health check
* Avoid healing if `health` is somehow > `maxHealth`
* Assume `heal_points` is always an int
* Fix human limb injury healing sometimes making `heal_points` negative
* Microoptimization
---
code/datums/status_effects/buffs.dm | 148 +++++++++++++++++-----------
1 file changed, 90 insertions(+), 58 deletions(-)
diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm
index a72de5fb471..4e57df1548e 100644
--- a/code/datums/status_effects/buffs.dm
+++ b/code/datums/status_effects/buffs.dm
@@ -265,67 +265,99 @@
H.remove_hud_from(owner)
/datum/status_effect/hippocraticOath/tick()
+ // Death transforms you into a snake after a short grace period
if(owner.stat == DEAD)
if(deathTick < 4)
- deathTick += 1
- else
- owner.visible_message("[owner]'s soul is absorbed into the rod, relieving the previous snake of its duty.")
- var/mob/living/simple_animal/hostile/retaliate/poison/snake/healSnake = new(owner.loc)
- var/list/chems = list("bicaridine", "perfluorodecalin", "kelotane")
- healSnake.poison_type = pick(chems)
- healSnake.name = "Asclepius's Snake"
- healSnake.real_name = "Asclepius's Snake"
- healSnake.desc = "A mystical snake previously trapped upon the Rod of Asclepius, now freed of its burden. Unlike the average snake, its bites contain chemicals with minor healing properties."
- new /obj/effect/decal/cleanable/ash(owner.loc)
- new /obj/item/rod_of_asclepius(owner.loc)
- qdel(owner)
- else
- if(ishuman(owner))
- var/mob/living/carbon/human/itemUser = owner
- //Because a servant of medicines stops at nothing to help others, lets keep them on their toes and give them an additional boost.
- if(itemUser.health < itemUser.maxHealth)
- new /obj/effect/temp_visual/heal(get_turf(itemUser), COLOR_HEALING_GREEN)
- itemUser.adjustBruteLoss(-1.5)
- itemUser.adjustFireLoss(-1.5)
- itemUser.adjustToxLoss(-1.5)
- itemUser.adjustOxyLoss(-1.5)
- itemUser.adjustStaminaLoss(-1.5)
- itemUser.adjustBrainLoss(-1.5)
- itemUser.adjustCloneLoss(-0.5) //Becasue apparently clone damage is the bastion of all health
- if(heal_points < max_heal_points)
- heal_points = min(heal_points += 3, max_heal_points)
- //Heal all those around you, unbiased
- for(var/mob/living/L in view(7, owner))
- if(heal_points <= 0)
- break
- if(L.health < L.maxHealth)
- new /obj/effect/temp_visual/heal(get_turf(L), COLOR_HEALING_GREEN)
- if(iscarbon(L))
- L.adjustBruteLoss(-3.5)
- L.adjustFireLoss(-3.5)
- L.adjustToxLoss(-3.5)
- L.adjustOxyLoss(-3.5)
- L.adjustStaminaLoss(-3.5)
- L.adjustBrainLoss(-3.5)
- L.adjustCloneLoss(-1) //Becasue apparently clone damage is the bastion of all health
+ deathTick++
+ return
+
+ owner.visible_message("[owner]'s soul is absorbed into the rod, relieving the previous snake of its duty.")
+ var/mob/living/simple_animal/hostile/retaliate/poison/snake/healSnake = new(owner.loc)
+ var/list/chems = list("bicaridine", "perfluorodecalin", "kelotane")
+ healSnake.poison_type = pick(chems)
+ healSnake.name = "Asclepius's Snake"
+ healSnake.real_name = "Asclepius's Snake"
+ healSnake.desc = "A mystical snake previously trapped upon the Rod of Asclepius, now freed of its burden. Unlike the average snake, its bites contain chemicals with minor healing properties."
+ new /obj/effect/decal/cleanable/ash(owner.loc)
+ new /obj/item/rod_of_asclepius(owner.loc)
+ qdel(owner)
+ return
+
+ // A servant of medicines stops at nothing to help others, let's give them an additional boost
+ if(ishuman(owner))
+ var/mob/living/carbon/human/H = owner
+ if(H.getBruteLoss() || H.getFireLoss() || H.getOxyLoss() || H.getToxLoss() || H.getBrainLoss() || H.getStaminaLoss() || H.getCloneLoss()) // Avoid counting burn wounds
+ H.adjustBruteLoss(-1.5, robotic = TRUE)
+ H.adjustFireLoss(-1.5, robotic = TRUE)
+ H.adjustOxyLoss(-1.5)
+ H.adjustToxLoss(-1.5)
+ H.adjustBrainLoss(-1.5)
+ H.adjustStaminaLoss(-1.5)
+ H.adjustCloneLoss(-0.5)
+ new /obj/effect/temp_visual/heal(get_turf(H), COLOR_HEALING_GREEN)
+
+ // Regenerate points passively
+ if(heal_points < max_heal_points)
+ heal_points = min(heal_points + 3, max_heal_points)
+
+ // The main course: heal everyone around you with the points we just gained!
+ for(var/mob/living/L in view(7, owner))
+ heal(L)
+ if(!heal_points)
+ break
+
+/datum/status_effect/hippocraticOath/proc/heal(mob/living/L)
+ var/starting_points = heal_points
+ var/force_particle = FALSE
+
+ if(ishuman(L))
+ heal_human(L)
+ else if(iscarbon(L))
+ if(L.health < L.maxHealth || L.getStaminaLoss()) // Carbons have no burn wounds to worry about nor brain damage to heal
+ L.adjustBruteLoss(-3.5)
+ L.adjustFireLoss(-3.5)
+ L.adjustOxyLoss(-3.5)
+ L.adjustToxLoss(-3.5)
+ L.adjustStaminaLoss(-3.5)
+ L.adjustCloneLoss(-1)
+ heal_points--
+ else if(issilicon(L))
+ if(L.health < L.maxHealth)
+ L.adjustBruteLoss(-3.5)
+ L.adjustFireLoss(-3.5)
+ heal_points--
+ else if(isanimal(L))
+ var/mob/living/simple_animal/SM = L
+ if(SM.health < SM.maxHealth)
+ SM.adjustHealth(-3.5)
+ force_particle = TRUE
+ if(prob(50)) // Animals are simpler
heal_points--
- if(ishuman(L))
- var/mob/living/carbon/human/H = L
- for(var/obj/item/organ/external/E in H.bodyparts)
- if(prob(10))
- E.mend_fracture()
- E.fix_internal_bleeding()
- E.fix_burn_wound(update_health = FALSE)
- heal_points--
- else if(issilicon(L))
- L.adjustBruteLoss(-3.5)
- L.adjustFireLoss(-3.5)
- heal_points--
- else if(isanimal(L))
- var/mob/living/simple_animal/SM = L
- SM.adjustHealth(-3.5)
- if(prob(50))
- heal_points -- // Animals are simpler
+
+ if(starting_points < heal_points || force_particle)
+ new /obj/effect/temp_visual/heal(get_turf(L), COLOR_HEALING_GREEN)
+
+/datum/status_effect/hippocraticOath/proc/heal_human(mob/living/carbon/human/H)
+ if(H.getBruteLoss() || H.getFireLoss() || H.getOxyLoss() || H.getToxLoss() || H.getBrainLoss() || H.getStaminaLoss() || H.getCloneLoss()) // Avoid counting burn wounds
+ H.adjustBruteLoss(-3.5, robotic = TRUE)
+ H.adjustFireLoss(-3.5, robotic = TRUE)
+ H.adjustOxyLoss(-3.5)
+ H.adjustToxLoss(-3.5)
+ H.adjustBrainLoss(-3.5)
+ H.adjustStaminaLoss(-3.5)
+ H.adjustCloneLoss(-1)
+ heal_points--
+ if(!heal_points)
+ return
+
+ for(var/obj/item/organ/external/E in H.bodyparts)
+ if(prob(10) && (E.status & (ORGAN_BROKEN | ORGAN_INT_BLEEDING | ORGAN_BURNT)) && !E.is_robotic())
+ E.mend_fracture()
+ E.fix_internal_bleeding()
+ E.fix_burn_wound()
+ heal_points--
+ if(!heal_points)
+ return
/obj/screen/alert/status_effect/regenerative_core
name = "Reinforcing Tendrils"