Files
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

102 lines
1.8 KiB
JSON

{
"name": "Esha Randu",
"level": 4,
"size": "Medium",
"abilities": {
"str_score": 14,
"dex_score": 18,
"con_score": 14,
"int_score": 16,
"wis_score": 12,
"cha_score": 9
},
"hp_max": 32,
"ac": {
"total": 19,
"touch": 15,
"flat_footed": 14
},
"bab": 4,
"initiative_mod": 5,
"speed_land_ft": 25,
"saves": {
"fort": 6,
"ref": 10,
"will": 5
},
"attacks": [
{
"name": "Lance",
"kind": "melee",
"attack_bonus": 7,
"damage": [
{
"formula": "1d8",
"types": [
"piercing"
]
}
],
"damage_bonus": 4,
"crit_range": 20,
"crit_mult": 3,
"reach_ft": 10,
"count": 1
},
{
"name": "Composite Shortbow +3",
"kind": "ranged",
"attack_bonus": 9,
"damage": [
{
"formula": "1d6",
"types": [
"piercing"
]
}
],
"damage_bonus": 3,
"crit_range": 20,
"crit_mult": 3,
"reach_ft": 5,
"count": 1,
"range_increment_ft": 70
},
{
"name": "Earth Breaker",
"kind": "melee",
"attack_bonus": 8,
"damage": [
{
"formula": "2d6",
"types": [
"bludgeoning"
]
}
],
"damage_bonus": 4,
"crit_range": 20,
"crit_mult": 3,
"reach_ft": 5,
"count": 1
}
],
"source": "fiches_personnages/esha_sheet.json",
"features": [
"Mounted Combat",
"Stealth Synergy",
"Point-Blank Shot",
"Precise Shot",
"Alertness",
"Adopted",
"Thoroughbred (Human; Keleshite)",
"Vagabond Child (Urban)",
"Whispering Wind",
"Breeze-Kissed",
"Like the Wind"
],
"spells": [
"Unseen Servant"
]
}