fix(rules): allow a Will save to halve channeled energy damage
PF1e CRB (Channel Energy): creatures damaged by channeled energy get a Will save (DC 10 + half the channeler's level + her Charisma modifier) for half damage (floor). Harm mode only; heal mode unchanged. Charisma is used RAW even for casters whose spellcasting ability differs (channeling is a Charisma class feature). Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
@@ -4195,7 +4195,9 @@ class CombatEngine:
|
||||
Heal mode heals all living creatures in the burst; harm mode damages
|
||||
all undead creatures in the burst — the target's side does not matter
|
||||
(PF1e Channel Energy: positive energy heals living creatures and
|
||||
damages undead creatures within 30 feet).
|
||||
damages undead creatures within 30 feet). Damaged creatures get a
|
||||
Will save (DC 10 + half the channeler's level + her Cha modifier)
|
||||
for half damage (CRB Channel Energy).
|
||||
"""
|
||||
if not state.spend_resource("channel_energy", 1):
|
||||
self._log(
|
||||
@@ -4223,11 +4225,20 @@ class CombatEngine:
|
||||
# 2d6 damage/healing
|
||||
dmg = 1 + self._rng.roll_die(11) # 2d6
|
||||
|
||||
# PF1e (CRB, Channel Energy): creatures damaged by the channel get a
|
||||
# Will save (DC 10 + half the channeler's level + her Charisma
|
||||
# modifier) for half damage. Charisma is used RAW even when the
|
||||
# caster's spellcasting ability is another one (channeling is a
|
||||
# Charisma class feature). Heal mode grants no save.
|
||||
channel_dc = 10 + state.combatant.level // 2 + (
|
||||
(state.combatant.abilities.cha_score - 10) // 2
|
||||
)
|
||||
|
||||
for affected_state in hit:
|
||||
if channel_mode == "heal":
|
||||
self._channel_heal(state, affected_state, dmg)
|
||||
else:
|
||||
self._channel_damage(state, affected_state, dmg)
|
||||
self._channel_damage(state, affected_state, dmg, channel_dc)
|
||||
|
||||
self._log(
|
||||
f"round {self._current_round} {state.combatant.id}: "
|
||||
@@ -4248,15 +4259,20 @@ class CombatEngine:
|
||||
)
|
||||
|
||||
def _channel_damage(
|
||||
self, state: CombatantState, affected_state: CombatantState, dmg: int
|
||||
self, state: CombatantState, affected_state: CombatantState, dmg: int, dc: int
|
||||
) -> None:
|
||||
"""Apply channel energy damage: Will save (DC from the channeler) for half."""
|
||||
save = self.resolve_save(affected_state, "will", dc)
|
||||
dealt = dmg // 2 if save.success else dmg
|
||||
hp_before = affected_state.hp
|
||||
affected_state.hp -= dmg
|
||||
self._stats[state.combatant.id].damage_dealt += dmg
|
||||
self._stats[affected_state.combatant.id].damage_taken += dmg
|
||||
affected_state.hp -= dealt
|
||||
self._stats[state.combatant.id].damage_dealt += dealt
|
||||
self._stats[affected_state.combatant.id].damage_taken += dealt
|
||||
self._log(
|
||||
f"round {self._current_round} {state.combatant.id}: "
|
||||
f"channel energy damages {affected_state.combatant.id} {dmg} "
|
||||
f"round {self._current_round} {state.combatant.id}: channel energy "
|
||||
f"damages {affected_state.combatant.id} {dealt} "
|
||||
f"(Will DC{dc} d20={save.roll}+{save.total - save.roll}={save.total} "
|
||||
f"{'SAVED half' if save.success else 'FAILED full'}) "
|
||||
f"({hp_before}->{affected_state.hp})"
|
||||
)
|
||||
if affected_state.dead:
|
||||
@@ -4269,7 +4285,7 @@ class CombatEngine:
|
||||
kind="damage_taken",
|
||||
actor=state,
|
||||
target=affected_state,
|
||||
damage=dmg,
|
||||
damage=dealt,
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user