# Format de monstre (JSON) ```json { "name": "Goblin", "level": 1, "size": "Small", "cr": "1/3", "xp": 135, "source": "Bestiary > Goblin", "abilities": { "str_score": 11, "dex_score": 15, "con_score": 12, "int_score": 10, "wis_score": 9, "cha_score": 6 }, "hp_max": 6, "ac": { "total": 16, "touch": 13, "flat_footed": 14 }, "bab": 1, "initiative_mod": 6, "speed_land_ft": 30, "saves": { "fort": 3, "ref": 2, "will": -1 }, "attacks": [ { "name": "short sword", "kind": "melee", "attack_bonus": 2, "damage": [{ "formula": "1d4", "types": ["slashing"] }], "crit_range": 19, "crit_mult": 2 }, { "name": "short bow", "kind": "ranged", "attack_bonus": 4, "damage": [{ "formula": "1d4", "types": ["piercing"] }], "crit_mult": 3, "range_increment_ft": 60 } ] } ``` ## Champs principaux | Champ | Type | Requis | Description | |-------|------|--------|-------------| | `name` | string | oui | Nom du monstre | | `level` | int | oui | Niveau / HD | | `size` | string | oui | `Tiny`, `Diminutive`, `Fine`, `Small`, `Medium`, `Large`, `Huge`, `Gargantuan`, `Colossal` | | `cr` | string | oui | Challenge Rating (ex: `"1/3"`, `"5"`) | | `xp` | int | oui | Points d'expérience | | `source` | string | oui | Source (ex: `"Bestiary > Goblin"`) | | `abilities` | object | oui | 6 scores : `str_score`, `dex_score`, `con_score`, `int_score`, `wis_score`, `cha_score` | | `hp_max` | int | oui | PV maximum | | `ac` | object | oui | `{ total, touch, flat_footed }` — valeurs **finales** (bonus de taille déjà inclus) | | `bab` | int | oui | Base Attack Bonus | | `initiative_mod` | int | oui | Modificateur d'initiative | | `speed_land_ft` | int | oui | Vitesse au sol en ft | | `speed_fly_ft` | int | non | Vitesse de vol en ft (si absent = pas de vol) | | `saves` | object | oui | `{ fort, ref, will }` — jets de sauvegarde finaux | | `attacks` | array | oui | Liste des attaques (voir ci-dessous) | ## Attaques (`attacks[]`) Chaque attaque est un objet avec les champs suivants : | Champ | Type | Requis | Description | |-------|------|--------|-------------| | `name` | string | oui | Nom de l'arme | | `kind` | string | oui | `"melee"`, `"ranged"`, ou `"touch"` | | `attack_bonus` | int | oui | Bonus d'attaque (final, taille incluse) | | `damage` | array | oui | Liste de composantes : `{ "formula": "1d4", "types": ["slashing"] }` | | `crit_range` | int | non | Menace de critique (défaut 20) | | `crit_mult` | int | oui | Multiplicateur de critique (2, 3, etc.) | | `range_increment_ft` | int | non* | Incrément de portée en ft (> 0), requis pour `ranged` et `touch` | | `damage_bonus` | int | non | Bonus de dégâts plat | | `dr` | string | non | Type de contournement de RD (ex: `"magic"`, `"cold_iron"`) | | `two_handed` | bool | non | Arme à deux mains (Power Attack +3X au lieu de +2X) | | `reach_weapon` | bool | non | Arme à allonge (anneau, dead zone) | | `reach_ft` | int | non | Allonge naturelle (pour attaques naturelles) | | `natural` | bool | non | Attaque naturelle (pas d'itératifs, peut être `secondary`) | | `secondary` | bool | non | Attaque naturelle secondaire (BAB −5, Multiattack → −2) | | `firearm` | bool | non | Arme à feu (touch dans 1er incrément, misfire sur 1 naturel) | | `splash` | object | non | Arme à éclaboussures : `{ "damage": 1, "type": "fire" }` | | `spell_resistance` | int | non | Résistance aux sorts | | `resistances` | object | non | Résistances énergétiques : `{ "fire": 5 }` | | `immunities` | array | non | Immunités : `["fire", "poison"]` | * `range_increment_ft` : entier **strictement positif** (zéro ou négatif = erreur). Pénalité −2 par incrément complet au-delà du premier. Arme `ranged` utilisable jusqu'à 10 incréments, `touch` jusqu'à 5. ## Champs optionnels avancés - `carried_items` : array d'objets transportés non maniés/portés serré (volables via manœuvre *Steal*). Armes maniées = dans `attacks` ; équipement porté serré (armure, sac à dos, anneaux) exclus. - `aware` : bool (défaut `true`) — conscience au début du combat (règle *Surprise*). - `alignment` : code à deux axes (`LG`, `NG`, `CG`, `LN`, `N`, `CN`, `LE`, `NE`, `CE`), défaut `"N"`. - `spell_slots` : dict niveau → nombre (ex: `{"1": 4, "2": 3}`) — budget d'encounter, **pas** calculé depuis la caractéristique. - `spells` : array de noms de sorts connus (doivent exister dans `data/spells/`). - `metamagic_feats` : array de noms de dons de métamagie connus. - `features` : noms de capacités de classe / dons (résolus par le chargeur). ## Taille et allonge | Taille | Allonge naturelle | Footprint | |--------|-------------------|-----------| | Fine / Diminutive / Tiny | 0 ft | 1×1 | | Small / Medium | 5 ft | 1×1 | | Large | 10 ft | 2×2 | | Huge | 15 ft | 3×3 | | Gargantuan | 20 ft | 4×4 | | Colossal | 30 ft | 6×6 | Une **arme à allonge** (`reach_weapon: true`) double l'allonge naturelle mais crée une **dead zone** (ne frappe pas à l'allonge naturelle ou moins). Une **arme naturelle** avec `reach_ft` explicite conserve cette allonge (le `reach_ft` d'une attaque naturelle EST son allonge naturelle). ## Notes importantes - Les valeurs `ac` et `attack_bonus` des JSON sont des valeurs **FINALES**, déjà majorées du modificateur de taille PF1e. Le moteur n'applique **jamais** de bonus de taille aux jets d'attaque ni à la CA. - La taille n'intervient que pour : manœuvres (CMB/CMD), allonge naturelle, footprint, occupation. - Les JSON de `data/monsters/` et `data/pcs/` sont la référence. Le chargeur `loaders/foundry.py` est un outil de migration **one-shot et incomplet** — ne pas régénérer les JSON de PJ sans réappliquer les corrections SRD (voir `docs/rules/conformance-srd.md`).