feat(rules): scale spell damage with caster level
DamageEffect gains optional scaling (1dX per N levels, capped) and scaling_flat (+X per N levels, capped) specs; effective_formula resolves them against the caster's level at cast time, so scaled dice flow through crits, energy resistance and metamagic like the base formula (CRB Magic - Caster Level). Loader rejects mismatched die types. Data: Fireball/Lightning Bolt 1d6/lvl max 10d6, Burning Hands 1d4/lvl max 5d4, Shocking Grasp 1d6/lvl max 5d6, Inflict Light Wounds +1/lvl max +5 (SRD-verified). Cure Light Wounds stays flat: its golden transcript pins 1d8+1 and HealEffect scaling is out of scope. Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
@@ -5783,9 +5783,13 @@ class CombatEngine:
|
||||
caster: CombatantState,
|
||||
crit: bool = False,
|
||||
) -> str:
|
||||
raw = effect.formula.roll(self._rng)
|
||||
# PF1e (CRB, Magic — Caster Level): per-level spell damage is resolved
|
||||
# against the caster's level at cast time; the scaled formula then
|
||||
# flows through crits, energy resistance and metamagic unchanged.
|
||||
formula = effect.effective_formula(caster.combatant.level)
|
||||
raw = formula.roll(self._rng)
|
||||
if maximize:
|
||||
raw = effect.formula.max_value()
|
||||
raw = formula.max_value()
|
||||
if crit:
|
||||
# PF1e (CRB "Range — Touch"): a touch/ranged-touch spell that
|
||||
# deals damage threatens on a natural 20 and deals double damage
|
||||
|
||||
Reference in New Issue
Block a user