Files
Bubberstation/code/datums/components/aura_healing.dm
SkyratBot 1b90273c28 [MIRROR] Cult pylons slowly close bleeding wounds (#28139)
* Cult pylons slowly close bleeding wounds (#83870)

## About The Pull Request

Cult pylons will now slowly close bleeding wounds.

## Why It's Good For The Game

Pylons were never updated alongside wounds, so it's an EXTREMELY common
sight to see people dead or dying next to pylons purely from blood loss.
Even havign 4 pylons near isn't enough to help you up - it doesn't oxy
heal, so if you're in crit, you're fucked.

The blood cult should be able to deal with blood loss.

## Changelog

🆑
qol: Cult pylons slowly close bleeding wounds
refactor: allowed aura healing to clot wounds shut
/🆑

* Cult pylons slowly close bleeding wounds

---------

Co-authored-by: carlarctg <53100513+carlarctg@users.noreply.github.com>
2024-06-14 10:31:20 -04:00

163 lines
5.2 KiB
Plaintext

#define HEAL_EFFECT_COOLDOWN (1 SECONDS)
/// Applies healing to those in the area.
/// Will provide them with an alert while they're in range, as well as
/// give them a healing particle.
/// Can be applied to those only with a trait conditionally.
/datum/component/aura_healing
/// The range of which to heal
var/range = 5
/// Whether or not you must be a visible object of the parent
var/requires_visibility = TRUE
/// Brute damage to heal over a second
var/brute_heal = 0
/// Burn damage to heal over a second
var/burn_heal = 0
/// Toxin damage to heal over a second
var/toxin_heal = 0
/// Suffocation damage to heal over a second
var/suffocation_heal = 0
/// Stamina damage to heal over a second
var/stamina_heal = 0
/// Amount of blood to heal over a second
var/blood_heal = 0
/// Amount of bleed/pierce wound lowering per second.
var/wound_clotting = 0
/// Map of organ (such as ORGAN_SLOT_BRAIN) to damage heal over a second
var/list/organ_healing = null
/// Amount of damage to heal on simple mobs over a second
var/simple_heal = 0
/// Trait to limit healing to, if set
var/limit_to_trait = null
/// The color to give the healing visual
var/healing_color = COLOR_GREEN
/// A list of being healed to active alerts
var/list/mob/living/current_alerts = list()
/// Cooldown between showing the heal effect
COOLDOWN_DECLARE(last_heal_effect_time)
/datum/component/aura_healing/Initialize(
range = 5,
requires_visibility = TRUE,
brute_heal = 0,
burn_heal = 0,
toxin_heal = 0,
suffocation_heal = 0,
stamina_heal = 0,
blood_heal = 0,
wound_clotting = 0,
organ_healing = null,
simple_heal = 0,
limit_to_trait = null,
healing_color = COLOR_GREEN,
)
if (!isatom(parent))
return COMPONENT_INCOMPATIBLE
START_PROCESSING(SSaura, src)
src.range = range
src.requires_visibility = requires_visibility
src.brute_heal = brute_heal
src.burn_heal = burn_heal
src.toxin_heal = toxin_heal
src.suffocation_heal = suffocation_heal
src.stamina_heal = stamina_heal
src.blood_heal = blood_heal
src.wound_clotting = wound_clotting
src.organ_healing = organ_healing
src.simple_heal = simple_heal
src.limit_to_trait = limit_to_trait
src.healing_color = healing_color
/datum/component/aura_healing/Destroy(force)
STOP_PROCESSING(SSaura, src)
var/alert_category = "aura_healing_[REF(src)]"
for(var/mob/living/alert_holder as anything in current_alerts)
alert_holder.clear_alert(alert_category)
current_alerts.Cut()
return ..()
/datum/component/aura_healing/process(seconds_per_tick)
var/should_show_effect = COOLDOWN_FINISHED(src, last_heal_effect_time)
if (should_show_effect)
COOLDOWN_START(src, last_heal_effect_time, HEAL_EFFECT_COOLDOWN)
var/list/to_heal = list()
var/alert_category = "aura_healing_[REF(src)]"
if(requires_visibility)
for(var/mob/living/candidate in view(range, parent))
if (!isnull(limit_to_trait) && !HAS_TRAIT(candidate, limit_to_trait))
continue
to_heal[candidate] = TRUE
else
for(var/mob/living/candidate in range(range, parent))
if (!isnull(limit_to_trait) && !HAS_TRAIT(candidate, limit_to_trait))
continue
to_heal[candidate] = TRUE
for (var/mob/living/candidate as anything in to_heal)
if (!current_alerts[candidate])
var/atom/movable/screen/alert/aura_healing/alert = candidate.throw_alert(alert_category, /atom/movable/screen/alert/aura_healing, new_master = parent)
alert.desc = "You are being healed by [parent]."
current_alerts[candidate] = TRUE
if (should_show_effect && candidate.health < candidate.maxHealth)
new /obj/effect/temp_visual/heal(get_turf(candidate), healing_color)
if (iscarbon(candidate) || issilicon(candidate) || isbasicmob(candidate))
candidate.adjustBruteLoss(-brute_heal * seconds_per_tick, updating_health = FALSE)
candidate.adjustFireLoss(-burn_heal * seconds_per_tick, updating_health = FALSE)
if (iscarbon(candidate))
// Toxin healing is forced for slime people
candidate.adjustToxLoss(-toxin_heal * seconds_per_tick, updating_health = FALSE, forced = TRUE)
candidate.adjustOxyLoss(-suffocation_heal * seconds_per_tick, updating_health = FALSE)
candidate.adjustStaminaLoss(-stamina_heal * seconds_per_tick, updating_stamina = FALSE)
for (var/organ in organ_healing)
candidate.adjustOrganLoss(organ, -organ_healing[organ] * seconds_per_tick)
var/mob/living/carbon/carbidate = candidate
for(var/datum/wound/iter_wound as anything in carbidate.all_wounds)
iter_wound.adjust_blood_flow(-wound_clotting * seconds_per_tick)
else if (isanimal(candidate))
var/mob/living/simple_animal/animal_candidate = candidate
animal_candidate.adjustHealth(-simple_heal * seconds_per_tick, updating_health = FALSE)
else if (isbasicmob(candidate))
var/mob/living/basic/basic_candidate = candidate
basic_candidate.adjust_health(-simple_heal * seconds_per_tick, updating_health = FALSE)
if (candidate.blood_volume < BLOOD_VOLUME_NORMAL)
candidate.blood_volume += blood_heal * seconds_per_tick
candidate.updatehealth()
for (var/mob/living/remove_alert_from as anything in current_alerts - to_heal)
remove_alert_from.clear_alert(alert_category)
current_alerts -= remove_alert_from
/atom/movable/screen/alert/aura_healing
name = "Aura Healing"
icon_state = "template"
#undef HEAL_EFFECT_COOLDOWN