feat(combat): expose weapon reference in observation snapshot

This commit is contained in:
2026-09-06 13:46:12 +02:00
parent cd8051f2c4
commit f3d874790a
4 changed files with 284 additions and 2 deletions
+24
View File
@@ -86,6 +86,7 @@ from pathlib import Path
from typing import TYPE_CHECKING
from pf1e_simulator.conditions import CONDITIONS_BY_NAME, Condition
from pf1e_simulator.dice import dice_to_str
from pf1e_simulator.effects import ActiveBuff, ActiveCondition, StatModifier, resolve_modifiers
from pf1e_simulator.loaders.combatant import CombatantLoadError, load_combatant
from pf1e_simulator.models import PREDEFINED_SKILLS
@@ -613,6 +614,29 @@ class CombatEngine:
},
"cmb": self._maneuver_cmb(state),
"cmd": self._maneuver_cmd(state),
"attacks": tuple(
{
"id": attack.id,
"name": attack.name,
"kind": attack.kind,
"attack_bonus": attack.attack_bonus,
"damage": tuple(
{
"formula": dice_to_str(component.formula),
"types": tuple(component.types),
}
for component in attack.damage
),
"damage_bonus": attack.damage_bonus,
"crit_range": attack.crit_range,
"crit_mult": attack.crit_mult,
"reach_ft": attack.reach_ft,
"range_increment_ft": attack.range_increment_ft,
"count": attack.count,
"firearm": attack.firearm,
}
for attack in state.combatant.attacks
),
}
def _pair_snapshot(
+17
View File
@@ -122,3 +122,20 @@ def parse_dice(text: str) -> DiceExpr:
raise DiceParseError(text) from None
return DiceExpr.flat(n)
def dice_to_str(expr: DiceExpr) -> str:
"""Serialize a DiceExpr into canonical dice notation.
Inverse of `parse_dice`: flat expressions (count=0) render as the bare
integer, dice expressions render as "NdS" with a signed bonus appended
only when non-zero.
"""
if expr.count == 0:
return str(expr.bonus)
base = f"{expr.count}d{expr.sides}"
if expr.bonus > 0:
return f"{base}+{expr.bonus}"
if expr.bonus < 0:
return f"{base}{expr.bonus}"
return base