From 7e4a9f5edf35ea7541665d3d16d3e7ac691b143c Mon Sep 17 00:00:00 2001 From: ctan Date: Sun, 20 Sep 2026 22:35:55 +0200 Subject: [PATCH] docs(rules): conformance journal round 15 - nonlethal, splash, skills and flight (out of scope -> modeled) Brings in the last four out-of-scope mechanics: the nonlethal damage track (unarmed strikes, minimum damage), splash weapons (direct + scatter), combat skills (skill checks, Acrobatics Tumbling, Stealth/opposed Perception) and 3D flight over ground terrain (vertical line of effect deferred). Updates the out-of-scope and residual tables to drop the now-modeled items and marks the round-2 disposition tables as historical. Gate 1981. --- docs/conformance-srd.md | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/docs/conformance-srd.md b/docs/conformance-srd.md index 4961f1b..2013b77 100644 --- a/docs/conformance-srd.md +++ b/docs/conformance-srd.md @@ -26,7 +26,7 @@ résiduel**. | Contrôle | Résultat | |---|---| -| `uv run pytest -q` | 1900 tests verts | +| `uv run pytest -q` | 1981 tests verts | | `uv run ruff check src tests` (`select=ALL`) | conforme | | `uv run basedpyright src` (strict) | 0 erreur | | Transcript doré depuis la passe 1 | inchangé | @@ -35,6 +35,10 @@ résiduel**. ## 1. Écarts corrigés +> Les tableaux de disposition ci-dessous (passe 2) sont **historiques** : les +> constats marqués « à corriger » / « résiduel assumé » ont depuis été corrigés +> ou reclassés dans les passes suivantes (voir les tableaux de commits ci-après). + ### Correctifs de la passe 2 (commits) | Commit | Objet | @@ -231,6 +235,19 @@ Audit read-only de la dernière zone non vérifiée (`cli.py` rendu du transcrip | `ee22f75` | Clés YAML dupliquées rejetées (SafeLoader dédié) | | `dd0b42b` | `move_cost` omis documenté explicitement comme infranchissable | +### Correctifs de la passe 15 — hors-périmètre : non-létal, éclaboussures, compétences, vol + +| Commit | Objet | +|---|---| +| `cba7bbf` | **Piste de dégâts non létaux** séparée ; *staggered* à non-létal = PV, *inconscient* au-delà ; immunité morts-vivants/artificiels ; le soin au-dessus du non-létal rend conscient | +| `83c6e54` | Sources non létales : **unarmed strikes** non létaux par défaut ; **minimum de dégâts** = 1 **non-létal** exact | +| `9cfcd67` / `2e60bbb` / `a1b1c29` / `678a4d8` | **Armes à éclaboussures** : touche directe = dégâts + 1 aux créatures à 5 ft ; échec = dispersion (d8) ; énergie (résistance/immunité), pas de RD ni de critique ; RNG inchangé pour les autres armes | +| `e0fb5be` | **Jet de compétence** général (d20 + rangs + car. + classe +3 si rangs + ACP) | +| `61686b5` | **Acrobaties « Tumbling »** : esquive d'AoO (DC = CMD, +5 si plus grand, +2 par adversaire), demi-vitesse, échec = l'AoO part et le déplacement s'arrête | +| `2c40994` | **Discrétion / Perception opposée** : action de se cacher, `hidden_from` par observateur (concealment total + +2/déni Dex), brisée en attaquant/courant | +| `2ae86ab` | **Vol au-dessus du terrain** : un volant ignore le terrain difficile et franchit les cases infranchissables au sol, sauf les murs `blocks_los` (pleine hauteur) ; LoE/couvert/high ground inchangés | +| `9210a54` | Documentation du vol et de la **LoE verticale/falaise différée** (pas de hauteur de mur dans les données) | + > Vérifiés conformes par l'audit : largeur d'affichage (accents NFC/NFD, CJK), repli en ligne brute sans perte, parsing des lignes conformes, capture du premier combat (`seed+0`), sémantique des nuls, normalisation du couvert (`cover_bonus`, `cover: true` → +4, `blocks_los` → +4), validations de déploiement/markers, ordre `(ligne, colonne)`, bande 3σ bornée. > **Registre des sorts clos** : les 35 derniers sorts ont été vérifiés champ par champ contre le KB — **0 divergence** (niveaux, sauvegardes, RM, portées, zones, formules conformes). Seuls 2 sorts sont absents du KB (`create_alcool`, `hidden_diplomacy`) et 1 nit de description subsiste (`detect_poison` mentionne « acid »). @@ -359,14 +376,13 @@ ne pas être confondues avec des bogues. | Sujet | Raison | |---|---| | **Squeeze** (se serrer dans un passage étroit) | La largeur de couloir n'est pas comparée à la taille ; une créature bloquée par son footprint l'est sans option de squeeze payante | -| **Acrobatics « Tumbling »** (traverser une case ennemie sans AoO) | Le moteur n'a pas de système de compétences | -| **Système de compétences** (Perception opposée, Discrétion, Acrobaties) | Pas de sous-système de compétences (hors `dex_skills`/bonus statiques) | +| **Compétences hors combat** (Escalade, Natation, Diplomatie, Sabotage, Connaissances, Art de la magie…) | Seules les compétences utiles au combat sont modélisées (Acrobaties Tumbling, Discrétion/Perception, Évasion) | | **Créature inerte très grande = obstacle à 2 cases** | Les cases d'une créature inactive ne bloquent pas et ne coûtent pas double | -| **Échec d'incantation du personnage sourd (20 %)** | Modélisé : composante verbale + condition `deafened` → jet de d20% ≤ 20 | +| **Échec d'incantation du personnage sourd (20 %)** | Modélisé (composante verbale + `deafened`) | | **Incantation multi-round (`long` : 3 rounds, 10 min, 1 h)** | Non planifiable dans un tour ; jetée du budget (`downgraded:cast_time`) plutôt qu'approximée | | **Co-occupation au-delà de Tiny vs plus grand** | Deux créatures Small+ ne partagent jamais une case ; plusieurs Tiny sur une case non gérés | | **Combat à deux armes / arme en main secondaire (×0,5 Force)** | Hors du modèle d'attaque actuel | -| **Vol 3D / vol par-dessus les obstacles** | La vitesse de vol est un budget au sol ; pas de maniabilité ni de survol du terrain | +| **Vol — LoE verticale / falaise** | Le survol du terrain est modélisé ; la ligne d'effet verticale et les falaises ne le sont pas (les données n'expriment pas de hauteur de mur) | | **`markers`** (points nommés de la carte) | Validés à la lecture, non appliqués à la résolution | --- @@ -377,8 +393,8 @@ ne pas être confondues avec des bogues. |---|---|---| | **Origine des bursts** | Mesure **centre-à-centre** au lieu d'**intersection-à-intersection** avec la règle du bord lointain (SRD « Aiming a Spell ») ; l'exactitude exigerait une coordonnée d'intersection dans le contrat d'observation et un choix de coin du lanceur | Différé, documenté précisément (`areas.py`, `_creatures_in_range`) | | **Course en armure lourde (×3)** | Le modèle n'a pas de champ d'armure ; la course est désormais bornée par la CON et le don Run est modélisé | Hors périmètre (reclassé) | -| **Dégâts non létaux** | Aucune source dans les données ; le minimum de dégâts est approximé en dégâts normaux | Hors périmètre (aucune source) | -| **Armes à éclaboussures** | Aucun objet concerné dans les données | Hors périmètre | +| **Dégâts non létaux** | **Modélisé** (piste séparée, sources unarmed, minimum de dégâts non létal) | Sorti du hors-périmètre | +| **Armes à éclaboussures** | **Modélisées** (touche directe + éclaboussure, dispersion d8) | Sorties du hors-périmètre | | **Sorts utilitaires différés** | `spiritual_weapon` (attaque flottante persistante — pas d'attaquant sans porteur dans le moteur) et `saving_finale` (reroll immédiat — pas de crochet de réaction sur un jet de sauvegarde) restent hors d'atteinte ; `guidance`, `resistance`, `virtue` et `stabilize` sont désormais **modélisés** | Différés (raison moteur consignée) | | **Non vérifiable (KB)** | `create_alcool`, `hidden_diplomacy` absents du KB ; nit de description de `detect_poison` (« acid ») | Indéterminé / nit | | **Couverture d'audit** | Rendu du transcript et formats de données désormais **audités** (passe 14, 14 bogues corrigés) ; toutes les zones sont couvertes | Couverture complète | @@ -422,7 +438,8 @@ Constats explicitement contrôlés et **confirmés conformes** : | 12 | **Hors périmètre — composantes & ASF** : composantes sur 107 sorts, sourd 20 %, échec d'armure, `arcane_caster` | `bg_02d4b4e3`, `bg_84baec1d` | 4 correctifs | Composantes/ASF **sortis du hors-périmètre** | | 13 | **Hors périmètre — objets/inventaire** : Sunder réel (dureté/PV), Steal, récupération d'arme | `bg_f9c69e32`, `bg_44d81a98` | 2 correctifs | Objets/inventaire **sortis du hors-périmètre** | | 14 | Audit du rendu du transcript + formats (cli/map/loader) | `bg_dc36ad2f` | 14 bogues (4 Med, 10 Low), 0 High | 14 correctifs (`9656ae8`..`dd0b42b`) | -| 15+ | Hors périmètre restant : compétences, pv non létaux, armes à éclaboussures, vol 3D | — | — | En cours (sans demande d'arrêt) | +| 15 | **Hors périmètre — non-létal, éclaboussures, compétences, vol** | `bg_388b9b98`, `bg_22a32075`, `bg_137eb485`, `bg_edd042b7` | 15 correctifs | 4 chantiers **sortis du hors-périmètre** | +| 16+ | Reste structurel : LoE verticale/falaise, deux armes, multi-round `long`, squeeze, compétences hors combat, markers | — | — | Documenté (hors périmètre) | ---