fix(rules): give Tiny-or-smaller creatures zero reach and square sharing

This commit is contained in:
2026-09-13 15:35:23 +02:00
parent 7fb7ec55dd
commit b579cb4934
4 changed files with 322 additions and 21 deletions
+48 -11
View File
@@ -657,8 +657,9 @@ Règles modélisées :
inchangée. `default_policy` ne choisit pas d'arme (disponible via une
politique personnalisée).
- Mêlée (conformance R1, CRB « Big and Little Creatures in Combat ») :
l'**allonge naturelle** du gabarit (Small/Medium 5 ft, Large 10 ft, Huge
15 ft, Gargantuan 20 ft, Colossal 30 ft) est un **disque** : la créature
l'**allonge naturelle** du gabarit (Tiny/Diminutive/Fine 0 ft, Small/Medium
5 ft, Large 10 ft, Huge 15 ft, Gargantuan 20 ft, Colossal 30 ft) est un
**disque** : la créature
frappe et menace toutes les cases jusqu'à son allonge, l'adjacence
comprise — une créature Large dont l'attaque naturelle a `reach_ft` 10
menace donc aussi les cases adjacentes (le `reach_ft` d'une attaque
@@ -669,6 +670,19 @@ Règles modélisées :
allonge naturelle`, la dead zone vaut donc 5 ft pour un porteur
Small/Medium et 10 ft pour un porteur Large. Une arme ordinaire sans
allonge menace les cases adjacentes (disque de 5 ft).
**S4c — allonge nulle des créatures Tiny et plus petites** (CRB « Big and
Little Creatures in Combat » : « Tiny, Diminutive, and Fine Creatures [...]
They must enter an opponent's square to attack in melee ») : l'allonge
naturelle de Tiny/Diminutive/Fine vaut **0 ft** — une telle créature ne
**menace aucune case** (aucune AoO) et ne peut pas frapper une case
adjacente ; son attaque de mêlée n'est utilisable qu'à **distance 0**, la
case qu'elle partage avec sa cible (l'abstraction « entrer dans la case de
l'adversaire »). L'allonge effective reste `max(allonge naturelle,
reach_ft de l'arme)` : une attaque naturelle dont le JSON déclare
explicitement `reach_ft` (ierlieth : morsure `reach_ft: 5`) conserve cette
allonge — le `reach_ft` d'une attaque naturelle EST son allonge naturelle,
une créature Tiny peut donc être encodée avec une allonge non nulle si sa
fiche l'exige.
Mouvement : un déplacement parcourt jusqu'à la
vitesse du combattant en cases le long du plus court chemin réel (champ de
coût Dijkstra depuis la cible, diagonales 5-10-5), en s'arrêtant adjacent à
@@ -711,6 +725,21 @@ Règles modélisées :
manœuvres et invocation sont généralisés aux cellules occupées (distance =
minimum entre cellules, LoS/couvert = meilleure paire) ; le comportement 1×1
reste bit-identique.
**S4c — co-occupation des créatures Tiny et plus petites** (CRB « Big and
Little Creatures in Combat » : « Very small creatures take up less than 1
square of space. This means that more than one such creature can fit into a
single square ») : une créature Tiny/Diminutive/Fine peut **traverser et
finir son déplacement** dans une case occupée par une créature plus grande,
et une créature plus grande peut traverser et finir dans une case occupée
par une créature Tiny ou plus petite — la case n'est pas « bloquée » pour
ce couple de tailles (`_can_cooccupy` : tailles différentes ET la plus
petite est Tiny ou moins). Deux créatures de même taille (ou Small et plus
grande) ne partagent jamais une case : le blocage reste total pour elles.
La co-occupation s'applique au mouvement (`_blocked`/`_blocked_hostile`
sont conscients du déplaceur), à la destination explicite (`_cells_free`)
et à la charge ; deux créatures partageant une case sont à **distance 0**
l'une de l'autre (ligne d'effet directe, attaque de mêlée possible — c'est
la voie d'attaque des créatures à allonge nulle, voir « Mêlée »).
- Taille et attaques/CA : les valeurs `ac` (total/touch/flat_footed) et
`attack_bonus` des JSON de créatures sont des valeurs FINALES, déjà majorées
du modificateur de taille PF1e aux attaques/CA (Small +1, Medium 0, Large −1,
@@ -1227,10 +1256,12 @@ Règles modélisées :
pénalisé (un test de compétence n'est pas un jet de manœuvre). Conformance
L1 (SRD « Combat Maneuvers ») : « Creatures that are size Tiny or smaller
use their Dexterity modifier in place of their Strength modifier to
determine their CMB » — Tiny/Diminutive/Fine calculent donc leur CMB avec
le modificateur de Dextérité à la place de celui de Force ; lacune
documentée : l'allonge nulle et la co-occupation des créatures Tiny et
plus petites ne sont pas modélisées (abstraction à la grille de 5 ft).
determine their CMB » — Tiny/Diminutive/Fine calculent donc leur CMB avec
le modificateur de Dextérité à la place de celui de Force. Leur allonge
naturelle nulle (aucune case menacée, attaque dans leur propre case) et la
co-occupation Tiny-or-smaller avec une créature strictement plus grande
sont modélisées (conformance S4c) ; une attaque naturelle dotée d'un
`reach_ft` explicite (ex. morsure d'ierlieth) conserve cette allonge.
Conformance L2 (SRD « Combat Maneuver Defense ») : le CMD calculé ajoute
les bonus de CA des huit types autorisés (« A creature can also add any
circumstance, deflection, dodge, insight, luck, morale, profane, and
@@ -1391,7 +1422,10 @@ Règles modélisées :
- Par combattant : id, side, pos, occupied_cells, hp/hp_max, active/dead,
dying/stabilized, conditions (noms + rounds_left), resources_left (+ `spell_slot_{level}`),
weapon_broken/weapon_stolen, grappled_with, moved_this_turn, power_attack,
name, level, size, aware (SRD « Surprise » : agit au round de surprise),
name, level, size, natural_reach_ft (S4c : allonge naturelle du gabarit
en pieds — 0 pour Tiny/Diminutive/Fine, 5 pour Small/Medium, 10 pour
Large… ; l'allonge effective d'une attaque reste `max(allonge naturelle,
reach_ft de l'arme)`), aware (SRD « Surprise » : agit au round de surprise),
dr {amount, bypass} ou None (C1), creature_type (C3),
bab (E1), initiative_mod (E2) et initiative_total (U2 : total du jet
d'initiative courant = d20 + mod, 0 si pas encore de clé — invocation
@@ -1514,10 +1548,13 @@ plutôt que bricolées) :
spell automatically fails ») : non planifiables dans un tour, ils sont
jetés du budget (`downgraded:cast_time`) plutôt qu'approximés, faute de
données d'objectif pour ces sorts rituels.
- **Gabarits Tiny/Diminutive/Fine abstraits à la grille de 5 ft** : leur
allonge nulle et la co-occupation de leurs cases (plusieurs créatures
minuscules sur une même case) ne sont pas modélisées ; seule la substitution
Dextérité/Force du CMB (conformance L1) tient compte de leur taille.
- **Co-occupation au-delà de Tiny vs plus grand** : la règle Tiny-or-smaller
est modélisée (S4c) — allonge naturelle 0, aucune case menacée, attaque
possible dans sa propre case, et partage de case avec une créature
strictement plus grande (déplacement à travers et fin de mouvement dessus) ;
en revanche deux créatures de même taille (Small et plus) ne partagent
jamais une case, et la co-occupation de plusieurs Tiny sur une même case
n'est pas modélisée.
Limites de sorts (conformance D6-D9, documentées plutôt que bricolées) :