fix(combat): correct hex and AoE DCs, DR bypassed by spells

This commit is contained in:
ctan
2026-08-31 14:02:08 +02:00
parent f1cf353a4d
commit d50d5809c6
3 changed files with 178 additions and 11 deletions
+10 -5
View File
@@ -1260,7 +1260,7 @@ class CombatEngine:
)
return
hex_dc = 10 + state.combatant.level // 2 + (state.combatant.abilities.cha_score - 10) // 2
hex_dc = 10 + state.combatant.level // 2 + (state.combatant.abilities.int_score - 10) // 2
if hex_name == "evil_eye":
self._hex_evil_eye(state, target, hex_dc)
@@ -1519,6 +1519,7 @@ class CombatEngine:
caster=caster, spell_name=spell.name,
empower="Empower Spell" in metamagic_feats,
maximize="Maximize Spell" in metamagic_feats,
dc=dc,
)
save_str = _save_label(save_result)
self._log(
@@ -1559,6 +1560,7 @@ class CombatEngine:
spell_name: str,
empower: bool = False,
maximize: bool = False,
dc: int = 15,
) -> list[str]:
saved = save_result is not None and save_result.success
return [
@@ -1566,6 +1568,7 @@ class CombatEngine:
effect, target, caster_live, target_live,
caster=caster, spell_name=spell_name,
empower=empower, maximize=maximize, saved=saved,
dc=dc,
)
for effect in effects
]
@@ -1582,12 +1585,13 @@ class CombatEngine:
empower: bool = False,
maximize: bool = False,
saved: bool,
dc: int = 15,
) -> str:
if isinstance(effect, AreaEffect):
return self._apply_area_effect(
effect, target, caster_live, target_live,
caster=caster, spell_name=spell_name, saved=saved,
empower=empower, maximize=maximize,
empower=empower, maximize=maximize, dc=dc,
)
if isinstance(effect, SummonEffect):
return self._apply_summon_effect(effect, caster, caster_live, spell_name)
@@ -1619,7 +1623,6 @@ class CombatEngine:
dmg = max(0, raw // 2) if saved and effect.half_on_save else raw
if empower:
dmg = int(dmg * 1.5)
dmg = self._apply_dr_for_types(dmg, frozenset(effect.types), target)
target.hp -= dmg
caster_live.damage_dealt += dmg
target_live.damage_taken += dmg
@@ -1691,6 +1694,7 @@ class CombatEngine:
saved: bool,
empower: bool = False,
maximize: bool = False,
dc: int = 15,
) -> str:
"""Apply an area effect to all creatures within radius.
@@ -1709,7 +1713,7 @@ class CombatEngine:
for affected_state in affected:
creature_saved = self._area_save(
affected_state, target, effect, saved=saved
affected_state, target, effect, saved=saved, dc=dc
)
for sub_effect in effect.effects:
target_live = self._stats[affected_state.combatant.id]
@@ -1751,13 +1755,14 @@ class CombatEngine:
effect: AreaEffect,
*,
saved: bool,
dc: int = 15,
) -> bool:
"""Save result for one creature in an area effect."""
if not effect.save_for_half:
return False
if affected_state is target:
return saved
save_result = self.resolve_save(affected_state, "ref", 15)
save_result = self.resolve_save(affected_state, "ref", dc)
return save_result.success
def _apply_metamagic(