fix(stats): non-attack damage now lands in damage_taken - bleed ticks, recurring spell damage (Acid Arrow) and cure-spells-damage-undead (SRD Cure Light Wounds negative-energy hit, attributed to the caster's damage_dealt) were invisible to attrition while attacks were counted; transcripts and RNG untouched
This commit is contained in:
@@ -2173,6 +2173,7 @@ class CombatEngine:
|
||||
return
|
||||
old_hp = state.hp
|
||||
state.hp -= state.bleed_damage
|
||||
self._stats[state.combatant.id].damage_taken += state.bleed_damage
|
||||
self._log(
|
||||
f"round {self._current_round} {state.combatant.id}: "
|
||||
f"bleed {state.bleed_damage} (hp {old_hp}->{state.hp})"
|
||||
@@ -2186,11 +2187,13 @@ class CombatEngine:
|
||||
if not state.recurring_damage:
|
||||
return
|
||||
remaining: list[RecurringDamage] = []
|
||||
live = self._stats[state.combatant.id]
|
||||
for entry in state.recurring_damage:
|
||||
raw = entry.formula.roll(self._rng)
|
||||
dmg = self._apply_energy_resistance(raw, entry.types, state)
|
||||
old_hp = state.hp
|
||||
state.hp -= dmg
|
||||
live.damage_taken += dmg
|
||||
self._log(
|
||||
f"round {self._current_round} {state.combatant.id}: "
|
||||
f"{entry.source} {dmg} (hp {old_hp}->{state.hp})"
|
||||
@@ -6766,7 +6769,7 @@ class CombatEngine:
|
||||
return self._apply_heal_effect(
|
||||
effect, target, caster_level=caster.combatant.level,
|
||||
empower=empower, maximize=maximize, saved=saved,
|
||||
healer=caster,
|
||||
healer=caster, caster_live=caster_live, target_live=target_live,
|
||||
)
|
||||
if isinstance(effect, PenaltyEffect):
|
||||
return self._apply_penalty_effect(
|
||||
@@ -7032,6 +7035,8 @@ class CombatEngine:
|
||||
maximize: bool,
|
||||
saved: bool,
|
||||
healer: CombatantState | None = None,
|
||||
caster_live: _LiveStats | None = None,
|
||||
target_live: _LiveStats | None = None,
|
||||
) -> str:
|
||||
formula = effect.effective_formula(caster_level)
|
||||
heal = formula.roll(self._rng)
|
||||
@@ -7050,6 +7055,10 @@ class CombatEngine:
|
||||
# healing, not this damage.
|
||||
dmg = heal // 2 if saved else heal
|
||||
target.hp -= dmg
|
||||
if caster_live is not None:
|
||||
caster_live.damage_dealt += dmg
|
||||
if target_live is not None:
|
||||
target_live.damage_taken += dmg
|
||||
return f"{dmg} damage (undead)"
|
||||
if healer is not None:
|
||||
heal = self._bitter_reduced(healer, target, heal)
|
||||
|
||||
Reference in New Issue
Block a user