From dd0b42b73b4c15d2fd27fd1ad497549ca298afc3 Mon Sep 17 00:00:00 2001 From: ctan Date: Sun, 20 Sep 2026 18:03:46 +0200 Subject: [PATCH] docs(map): make omitted move_cost explicitly mean impassable --- README.md | 5 ++++- src/pf1e_simulator/map.py | 7 ++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index cfcf006..ecc21dc 100644 --- a/README.md +++ b/README.md @@ -226,7 +226,10 @@ deployment: # obligatoire si zones : nom de camp -> lettre de zone ``` Valeur du `move_cost` : entier > 0 pour un terrain praticable, `null` pour un -terrain infranchissable (mur, pilier). `blocks_los` et `cover` sont appliqués +terrain infranchissable (mur, pilier). **Omettre `move_cost` équivaut à +`null` : le terrain est infranchissable** — un terrain praticable doit donc +toujours déclarer explicitement son coût (une entrée de légende sans coût de +déplacement n'est jamais un couloir invisible). `blocks_los` et `cover` sont appliqués par la résolution des attaques (module `los.py`, règle des coins) : pas de ligne d'effet ⇒ l'attaque est impossible ; couvert ⇒ bonus de CA. Le champ optionnel `cover_bonus` (`2`, `4` ou `8`) encode le niveau de couvert PF1e diff --git a/src/pf1e_simulator/map.py b/src/pf1e_simulator/map.py index df26dd5..9a3867e 100644 --- a/src/pf1e_simulator/map.py +++ b/src/pf1e_simulator/map.py @@ -66,7 +66,12 @@ _NoDuplicateLoader.add_constructor( class TerrainType(BaseModel): - """What one square means for movement and sight lines.""" + """What one square means for movement and sight lines. + + ``move_cost``: positive int = passable; ``None`` -- explicit or omitted + (the field default) -- means IMPASSABLE. A passable terrain must always + declare its cost; omitting the field is never a silent walkable default. + """ model_config = ConfigDict(frozen=True, extra="forbid")