f61fc5c61f
- Clean README.md with installation, usage, CLI, examples - Move data formats to docs/data-formats/ (map.md, monster.md, pc-sheets.md, index.md) - Move architecture to docs/architecture/ (index.md, technical-architecture.md, phase-2-llm-architecture.md) - Add contributing guidelines in docs/contributing.md - Clean README.md: install, usage, CLI, data-formats/rules/architecture links, contributing link
117 lines
5.7 KiB
Markdown
117 lines
5.7 KiB
Markdown
# 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`). |