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
5.7 KiB
5.7 KiB
Format de monstre (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. Armerangedutilisable jusqu'à 10 incréments,touchjusqu'à 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 = dansattacks; équipement porté serré (armure, sac à dos, anneaux) exclus.aware: bool (défauttrue) — 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 dansdata/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
acetattack_bonusdes 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/etdata/pcs/sont la référence. Le chargeurloaders/foundry.pyest un outil de migration one-shot et incomplet — ne pas régénérer les JSON de PJ sans réappliquer les corrections SRD (voirdocs/rules/conformance-srd.md).