Commit Graph

76 Commits

Author SHA1 Message Date
ctan 7591614460 feat(cli): add --transcript option 2026-09-04 23:34:12 +02:00
ctan cedff5b932 feat(data): add giant belostomatid monster 2026-09-04 23:22:38 +02:00
ctan 83a5250ca6 fix(combat): deed range gating 2026-09-04 23:02:27 +02:00
ctan c5f31c30d1 fix(combat): summon spawns only on passable cells 2026-09-04 23:02:27 +02:00
ctan f4fc66a6ab docs: align README with fixed behavior 2026-09-04 23:02:26 +02:00
ctan 0dcb967033 test(combat): pin ScriptedRng transcripts, unique per scenario 2026-09-04 23:02:26 +02:00
ctan 6e08df6eb6 feat(combat): class abilities from default_policy 2026-09-04 23:02:26 +02:00
ctan 66a664ad85 fix(data): lich fear aura, paralyzing touch, slot keys 2026-09-04 23:02:26 +02:00
ctan d0833c7a2c feat(data): wire all 55 PC feats 2026-09-04 23:02:25 +02:00
ctan 5353018c80 fix(combat): single roll to escape grapple 2026-09-04 23:02:25 +02:00
ctan f575c77037 fix(combat): sunder damages weapon not HP 2026-09-04 23:02:25 +02:00
ctan 6e4a9d8323 feat(combat): Combat Reflexes extra AoOs 2026-09-04 23:02:24 +02:00
ctan 679d405943 feat(combat): enforce prone/staggered/nauseated/paralyzed 2026-09-04 23:02:24 +02:00
ctan 0d61ad44ab fix(combat): bound cackle hex extension 2026-09-04 23:02:24 +02:00
ctan 735642a607 fix(combat): summoned creatures act and expire 2026-09-04 23:02:23 +02:00
ctan 2e4d192522 refactor(combat): single source active_buffs/active_conditions 2026-09-04 23:02:23 +02:00
ctan 073da40fca feat(combat): class-ability action kinds, engine RNG only 2026-09-04 23:02:22 +02:00
ctan 0058e71550 fix(combat): correct hex and AoE DCs, DR bypassed by spells 2026-09-04 23:02:22 +02:00
ctan a7729eebf1 fix(combat): correct concentration DCs by situation 2026-09-04 23:02:22 +02:00
ctan 625e8c56b9 feat(runner): wire spell registry in CLI and Monte Carlo 2026-09-04 23:02:21 +02:00
ctan fd94522546 feat(data): per-level spell slots for 8 PCs 2026-09-04 23:02:21 +02:00
ctan 1893072b5d chore(lint): restore green gate 2026-09-04 23:02:20 +02:00
ctan 31d62b39c2 feat(data): lich monster 2026-09-04 23:02:20 +02:00
ctan 510990188a feat(combat): class action patterns 2026-09-04 23:02:20 +02:00
ctan a6366edd33 feat(combat): channel energy and hexes 2026-09-04 23:02:19 +02:00
ctan 77ffad8e2f feat(data): companions and mounts 2026-09-04 23:02:19 +02:00
ctan 4d7f1b8233 feat(loaders): map 8-PC feats 2026-09-04 23:02:18 +02:00
ctan 934d443d7d feat(combat): summoning 2026-09-04 23:02:18 +02:00
ctan 136ddcf7aa feat(combat): combat maneuvers CMB/CMD 2026-09-04 23:02:18 +02:00
ctan 8ae344fd16 feat(combat): area-of-effect spells 2026-09-04 23:02:17 +02:00
ctan 09062b37ea feat(combat): spellcasting default policy 2026-09-04 23:02:17 +02:00
ctan ab2874d79b feat(combat): skills system 2026-09-04 23:02:17 +02:00
ctan d792b6e28f feat(combat): AoO and concentration on casting 2026-09-04 23:02:16 +02:00
ctan 0c2e3383d7 feat(combat): enforce behavioral condition flags 2026-09-04 23:02:16 +02:00
ctan d2c80c0d61 feat(combat): metamagic 2026-09-04 23:02:16 +02:00
ctan eb8072ace7 feat(models): combat resources 2026-09-04 23:02:15 +02:00
ctan 789d2f5396 fix(combat): correct spell DC formula 2026-09-04 23:02:15 +02:00
ctan 43303cf28e feat(combat): effect and condition durations 2026-09-04 23:01:57 +02:00
ctan 2e49aa7293 docs(handoff): add finalize-engine plan for session transfer 2026-08-29 13:37:32 +02:00
ctan 52904a0d03 docs(handoff): add session summary for pf1e-simulator transfer 2026-08-29 13:35:47 +02:00
ctan 37f07d90a7 chore(data): drop Plot Armor from misty features (non-combat feat) 2026-08-18 17:34:48 +02:00
ctan 82148cea1e test(loaders): add unit tests for combatant feat resolution and feature/spell handling
Tests for _resolve_feat (known/unknown/Toughness/Weapon Focus),
_resolve_features (filtering, empty lists), load_combatant with
features+spells integration, and backward-compat aliases.

Gate: 401 tests, ruff clean, basedpyright clean.
2026-08-18 15:11:28 +02:00
ctan 36f72dcb37 chore(clean): cleanup .codegraph 2026-08-17 22:54:53 +02:00
ctan 557bb2304a fix(git): fix gitignore for .codegraph 2026-08-17 22:53:58 +02:00
ctan c88d8fd6f4 refactor(loaders): unify combatant loader, migrate PC features/spells
Rename monster.py → combatant.py with _KNOWN_FEATS lookup table
that resolves feat name strings to AbilitySpec constants (Power Attack,
Iron Will, Toughness, Weapon Focus, etc.). Unknown feats produce
minimal AbilitySpec (data preserved for future implementation).

Migrate all 8 PC JSONs (data/pcs/) with complete feat/spell lists
extracted from Foundry sheets — including traits, racial abilities,
and all spells. Monsters (goblin, orc) unchanged (no feats/spells).

Update all imports, add backward-compatible aliases (load_monster,
MonsterLoadError), update CLI to use load_combatant.

Gate: 377 tests, ruff clean, basedpyright clean.
2026-08-17 22:49:50 +02:00
ctan e9e8c26d50 feat(loaders): extend Foundry loader with feat/spell extraction
Map Foundry feat strings to AbilitySpec constants (Power Attack, Iron Will,
Alertness, Point-Blank Shot, Precise Shot, Dodge, Weapon Focus (X)).
Extract spell names from spellcasting.spells into Combatant.spells.
Wire features and spells into load_sheet_detailed return.
Add 41 tests (unit + golden on 8 real sheets).

Gate: 377 tests, ruff clean, basedpyright clean.
2026-08-17 22:49:50 +02:00
ctan 828afc15c0 feat(spells): add spell system with 10 combat spells, cast_spell action
Spells are SpellSpec dataclasses with typed effects: DamageEffect
(dice + types, half-on-save), ConditionEffect (condition lookup +
save negates), HealEffect (capped at hp_max), BuffEffect (transient
StatModifiers). Range categories (personal/touch/close/medium/long)
scale with caster level via spell_range_ft. JSON loader
(load_spell/load_spell_registry) reads data/spells/*.json.

The engine integrates spells via Action(kind='cast_spell') and
_cast_spell: range check, line-of-effect gate, save resolution
(resolve_save), effect application (_apply_spell_effects with DR
via _apply_dr_for_types), transcript logging. The spell_registry
is passed to CombatEngine; Combatant.spells holds known spell names.

- spells.py: SpellSpec, 4 effect types, SpellRange/SaveType literals,
  spell_range_ft, JSON loader (uses Json type from foundry.py)
- conditions.py: CONDITIONS_BY_NAME registry for condition lookup
- combat.py: cast_spell Action kind, _execute_cast_spell dispatch,
  _cast_spell (range/LoE/save/effects/log), _apply_spell_effects,
  _apply_dr_for_types, _save_label helper, SpellSpec/BuffEffect/etc
  imports, spell_registry parameter on CombatEngine
- models.py: spells field on Combatant
- data/spells/: 10 spells (Magic Missile, Burning Hands, Fireball,
  Lightning Bolt, Acid Arrow, Cure Light/Moderate Wounds, Hold Person,
  Fear, Bull's Strength)
- tests/test_spells.py: 29 tests (loading, range, damage/save/condition/
  heal/buff/DR, out-of-range, unknown spell, dispatch, DC scaling)
- pyproject.toml: PLR0913 ignore for combat.py (CombatEngine.__init__)
- README.md: spells.py architecture section, Sorts removed from
  non-modeled list, 336 tests
2026-08-17 22:49:50 +02:00
ctan 97c0431479 feat(abilities): add Power Attack active feat (-X atk / +2X dmg, melee only)
Power Attack is the first active feat: a free-action toggle declared at
turn start. When state.power_attack is True and the combatant has the
POWER_ATTACK feature, melee attacks apply -X to the attack roll and
+2X to damage, where X = BAB//4 + 1 (min 1). Ranged attacks are
unaffected. The flag is cleared at the start of each turn via
_take_turn, like other per-turn state.

- abilities.py: POWER_ATTACK constant (AbilitySpec, no passive effects)
- combat.py: _has_feat helper, _power_attack_amt, resolve_attack
  applies penalty to attack total + crit confirm, bonus to damage
- tests/test_power_attack.py: 14 tests (amount at BAB 1/4/8/12, flag
  false, feat missing, attack penalty, damage bonus, ranged unaffected,
  flag cleared on turn)
- pyproject.toml: add SLF001 + RUF059 to test per-file-ignores (white-box
  testing accesses private helpers, partial tuple unpacking)
- README.md: document Power Attack in abilities.py section, 307 tests
2026-08-17 22:49:50 +02:00
ctan ba1c3c2117 feat(abilities): add passive feats system (Weapon Focus, Iron Will, Dodge, Point-Blank Shot) 2026-08-17 22:49:50 +02:00
ctan a32444f804 feat(conditions): add condition system with 18 PF1e conditions 2026-08-17 22:49:50 +02:00