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:
2026-09-19 17:02:21 +02:00
parent 7fefce4653
commit 0ad627c97c
4 changed files with 72 additions and 1 deletions
+10 -1
View File
@@ -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)