c88d8fd6f4
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.
160 lines
3.0 KiB
JSON
160 lines
3.0 KiB
JSON
{
|
|
"name": "Misty",
|
|
"level": 4,
|
|
"size": "Medium",
|
|
"abilities": {
|
|
"str_score": 12,
|
|
"dex_score": 19,
|
|
"con_score": 14,
|
|
"int_score": 16,
|
|
"wis_score": 7,
|
|
"cha_score": 18
|
|
},
|
|
"hp_max": 31,
|
|
"ac": {
|
|
"total": 20,
|
|
"touch": 14,
|
|
"flat_footed": 16
|
|
},
|
|
"bab": 3,
|
|
"initiative_mod": 4,
|
|
"speed_land_ft": 30,
|
|
"saves": {
|
|
"fort": 7,
|
|
"ref": 9,
|
|
"will": 3
|
|
},
|
|
"attacks": [
|
|
{
|
|
"name": "MWK Rapier",
|
|
"kind": "melee",
|
|
"attack_bonus": 8,
|
|
"damage": [
|
|
{
|
|
"formula": "1d6",
|
|
"types": [
|
|
"piercing"
|
|
]
|
|
}
|
|
],
|
|
"damage_bonus": 1,
|
|
"crit_range": 18,
|
|
"crit_mult": 2,
|
|
"reach_ft": 5,
|
|
"count": 1
|
|
},
|
|
{
|
|
"name": "Dagger",
|
|
"kind": "melee",
|
|
"attack_bonus": 7,
|
|
"damage": [
|
|
{
|
|
"formula": "1d4",
|
|
"types": [
|
|
"piercing"
|
|
]
|
|
}
|
|
],
|
|
"damage_bonus": 1,
|
|
"crit_range": 19,
|
|
"crit_mult": 2,
|
|
"reach_ft": 5,
|
|
"count": 1,
|
|
"range_increment_ft": 10
|
|
},
|
|
{
|
|
"name": "Talons (attaque naturelle)",
|
|
"kind": "melee",
|
|
"attack_bonus": 4,
|
|
"damage": [
|
|
{
|
|
"formula": "1d4",
|
|
"types": [
|
|
"slashing"
|
|
]
|
|
}
|
|
],
|
|
"damage_bonus": 1,
|
|
"crit_range": 20,
|
|
"crit_mult": 2,
|
|
"reach_ft": 5,
|
|
"count": 1
|
|
},
|
|
{
|
|
"name": "Bite (attaque naturelle)",
|
|
"kind": "melee",
|
|
"attack_bonus": 4,
|
|
"damage": [
|
|
{
|
|
"formula": "1d4",
|
|
"types": [
|
|
"piercing"
|
|
]
|
|
}
|
|
],
|
|
"damage_bonus": 1,
|
|
"crit_range": 20,
|
|
"crit_mult": 2,
|
|
"reach_ft": 5,
|
|
"count": 1
|
|
},
|
|
{
|
|
"name": "Unarmed Strike",
|
|
"kind": "melee",
|
|
"attack_bonus": 4,
|
|
"damage": [
|
|
{
|
|
"formula": "1d3",
|
|
"types": [
|
|
"bludgeoning"
|
|
]
|
|
}
|
|
],
|
|
"damage_bonus": 1,
|
|
"crit_range": 20,
|
|
"crit_mult": 2,
|
|
"reach_ft": 5,
|
|
"count": 1
|
|
}
|
|
],
|
|
"source": "fiches_personnages/misty_sheet.json",
|
|
"features": [
|
|
"Plot Armor",
|
|
"Harmonic Spell",
|
|
"Weapon Finesse",
|
|
"Axe to Grind (combat)",
|
|
"Spell Vulnerability (divination; drawback)",
|
|
"Born Damned (race: tiefling)",
|
|
"Gifted Adept (dispel magic; magic)",
|
|
"Prehensile Tail (tiefling daemon-spawn)",
|
|
"Scaled Skin (electricity) (tiefling daemon-spawn)",
|
|
"Maw or Claw (Bite) (tiefling daemon-spawn)"
|
|
],
|
|
"spells": [
|
|
"Prestidigitation",
|
|
"Oath of Anonymity",
|
|
"Detect Magic",
|
|
"Read Magic",
|
|
"Disrupt Undead",
|
|
"Ray of Frost",
|
|
"Summon Instrument",
|
|
"Mage Hand",
|
|
"Open/Close",
|
|
"Arcane Mark",
|
|
"Acid Splash",
|
|
"Grasp",
|
|
"Shield",
|
|
"Cure Light Wounds",
|
|
"Color Spray",
|
|
"Saving Finale",
|
|
"Vanish",
|
|
"Shocking Grasp",
|
|
"Burning Hands",
|
|
"Alarm",
|
|
"Scorching Ray",
|
|
"Bladed Dash",
|
|
"Mirror Image",
|
|
"Heroism"
|
|
]
|
|
}
|