|
JustAnotherDnDGame 0.1.0
Jeu de rôle tactique au d20, vue de dessus, en C++/Qt
|
Le programme complet de la version 0.1.0, et l'unique source de vérité des lots à venir : les lots LOT-09 à LOT-84, ce que le corpus Documentation/SourceBook/ permet d'en tirer, et l'audit qui a confronté le tout à l'état réel du dépôt.
Les lots livrés gardent leur dossier et leur epic.md : ils portent ce que leur réalisation a tranché, qui est de l'histoire, pas du programme. Tout le reste vit ici, et un dossier se crée au démarrage d'un lot.
Par où commencer. L'état d'avancement ci-dessous donne, en un tableau, ce qui reste à faire et dans quel ordre — c'est la réponse à « et maintenant ? ». Le reste de la page dit pourquoi.
Documentation/SourceBook/ rassemble le matériel de référence ayant servi à construire le monde et les règles : huit PDF, environ 1 200 pages, 280 Mo. Les sections 1 à 4 disent ce qu'ils contiennent et ce que l'extraction a appris ; la section 5 découpe le travail et la section 6 donne la règle d'ordre qui produit le tableau d'avancement, le chemin critique et le graphe ; la section 7 dessine l'arborescence cible et la section 8 récapitule ce qui est tranché ; les sections 9 et 10 rapportent l'audit et ce qu'il faut anticiper ; la section 11 porte les lots LOT-09 à LOT-29.
Vingt-neuf lots livrés, cinquante et un restants. Le prochain est le LOT-19.
Livrés : LOT-01 à LOT-08 (le socle : fork et purge, HmiLib, LevelData, format de carte version 3, modes de jeu, déplacement top-down, tri par profondeur, tuiles RPG), LOT-77, LOT-78 et LOT-79 (les trois préconditions), puis le LOT-30 (la chaîne d'extraction du corpus et le lexique bilingue), le LOT-32 (les schémas de données RPG) et le LOT-43 (compétences, langues, dons, multiclassage) — les trois premiers lots de la filière contenu —, le LOT-12 (dés, caractéristiques, jet de d20), premier lot du noyau RPG, le LOT-33 (les 94 bêtes du SRD), premier catalogue rempli, et le LOT-36 (22 espèces, 13 historiques, 4 classes provisoires), enfin le LOT-13 (la fiche de personnage, qui les assemble) et le LOT-10 (entités de carte et interaction), le LOT-34 (armes, armures et équipement), le LOT-66 (charte visuelle), le LOT-37 (l'atlas des treize régions et de leurs 94 lieux) et le LOT-76 (les vingt et une planches d'habillage extraites des feuilles de personnage) et le LOT-67 (les menus et le vocabulaire d'un RPG, qui retire du programme la notion de niveau discret) et le LOT-68 (le châssis des huit écrans du RPG, décrits par une table plutôt qu'écrits un par un) et le LOT-38 (la fiche de personnage, calquée sur la planche du corpus) et le LOT-14 (inventaire, équipement et statistiques dérivées) et le LOT-18 (la bascule exploration ↔ combat) et le LOT-39 (la plomberie des clés d'assets). Chacun garde son dossier et son epic.md.
Quelle date pour la 0.1.0 ? Aucune n'est annoncée ici, et ce n'est pas une prudence de principe : les vingt-six lots livrés l'ont été entre le 3 et le 7 septembre 2026, soit une cadence observée qui, prise au pied de la lettre, placerait la version dans deux semaines. Cette extrapolation est fausse, et il vaut mieux l'écrire que la laisser deviner : les lots livrés sont des lots de socle, dont le périmètre tient dans quelques fichiers. Ceux qui restent portent des catalogues — 176 créatures, 31 tables de progression, dix régions — et un volume de données ne se livre pas à la vitesse d'un refactoring. La cadence sera mesurable après les cinq premiers lots de la filière contenu ; d'ici là, ce tableau donne le reste à faire, pas une date.
L'ordre ci-dessous n'est pas arbitré : il est calculé depuis le graphe de dépendances, par la règle de la section 6 — à chaque pas, parmi les lots dont tous les prérequis sont faits, celui qui en débloque le plus — et vérifié en intégration continue par scripts/lint_lots.py. Le détail de chaque lot est en section 5 (filière contenu) et en section 11 (lots absorbés) ; ce tableau n'en porte volontairement aucun.
| # | Lot | Objet | Débloque | Statut |
|---|---|---|---|---|
| 1 | LOT-19 | Grille tactique et déplacement | 11 | prochain |
| 2 | LOT-15 | PNJ et dialogues | 9 | prêt |
| 3 | LOT-20 | Initiative et tour par tour | 9 | en attente |
| 4 | LOT-11 | Éditeur multi-couches et placement d'entités | 8 | prêt |
| 5 | LOT-27 | Contenu du vertical slice | 8 | prêt |
| 6 | LOT-80 | Factions, panthéon et organisations | 8 | prêt |
| 7 | LOT-81 | Descripteurs de terrain des dix régions | 7 | prêt |
| 8 | LOT-16 | Quêtes et drapeaux de monde | 6 | en attente |
| 9 | LOT-21 | Attaques, dégâts et états | 6 | en attente |
| 10 | LOT-40 | Générateur de terrain | 6 | en attente |
| 11 | LOT-44 | Noms, tables aléatoires et contenu d'ambiance | 6 | prêt |
| 12 | LOT-46 | Créatures de Tanares | 6 | prêt |
| 13 | LOT-26 | Butin, marchands, économie | 5 | en attente |
| 14 | LOT-41 | Peuplement : rencontres et créatures | 5 | en attente |
| 15 | LOT-70 | Horloge de partie et cycle jour/nuit | 4 | prêt |
| 16 | LOT-82 | Peuplement civil : PNJ, marchands et quêtes | 4 | en attente |
| 17 | LOT-09 | Graphe de cartes et transitions | 3 | prêt |
| 18 | LOT-22 | Portée, ligne de vue et zones d'effet | 3 | en attente |
| 19 | LOT-84 | Les 31 tables de progression de classe | 3 | prêt |
| 20 | LOT-17 | Sauvegarde riche | 2 | en attente |
| 21 | LOT-35 | Sorts et états | 2 | prêt |
| 22 | LOT-47 | Socle de classe, et le guerrier comme preuve | 2 | en attente |
| 23 | LOT-23 | IA tactique ennemie | 1 | en attente |
| 24 | LOT-42 | Voyage et carte du monde | 1 | en attente |
| 25 | LOT-45 | Guilde des Aventuriers : rangs et contrats | 1 | en attente |
| 26 | LOT-50 | Le Colisée : bac à sable de combat | 1 | en attente |
| 27 | LOT-74 | Expérience et progression | 1 | en attente |
| 28 | LOT-24 | IHM de combat | 0 | en attente |
| 29 | LOT-25 | Sorts et capacités de classe | 0 | en attente |
| 30 | LOT-28 | Audio, effets et version 0.2.0 | 0 | en attente |
| 31 | LOT-29 | Groupe de quatre personnages | 0 | en attente |
| 32 | LOT-49 | Contrôle de cohérence du contenu | 0 | prêt |
| 33 | LOT-69 | Retrait de l'atelier pixel art | 0 | en attente |
| 34 | LOT-72 | Conditions, agonie et mort | 0 | en attente |
| 35 | LOT-75 | Campement et repos dans le monde | 0 | en attente |
| 36 | LOT-83 | Boucle de progression de la Guilde | 0 | en attente |
| 37 | LOT-51 → LOT-65 | une classe par lot | 0 | en attente |
Débloque — combien de lots restants dépendent de celui-ci, directement ou en cascade. C'est le critère de priorité, et il se relit sur la ligne.
Documentation/SourceBook/ est exclu en entier par le .gitignore. La raison est désormais la taille : 785 Mo de binaires, dont deux images de plus de 100 Mo, que git versionne mal — chaque clone les traîne, et aucune de leurs révisions ne se compresse. (280 Mo jusqu'au 7 septembre 2026 ; les neuf ressources de table virtuelle du §2 ont presque triplé le volume, ce qui ne change pas la règle mais en renforce le motif.)
Cette phrase a été fausse jusqu'au LOT-30. La règle d'exclusion n'était pas dans le .gitignore du dépôt : elle vivait comme modification locale non commitée, sur un seul poste. Sur un clone neuf, un git add -A embarquait les 280 Mo. scripts/check_glossary.py vérifie désormais l'exclusion en intégration continue — une affirmation que rien ne vérifie finit par devenir fausse, et celle-ci l'était depuis le début.
Deux conséquences pratiques, à retenir avant d'écrire quoi que ce soit dans ce dossier :
| Document | Nature | Pages PDF | Langue | Texte | Images |
|---|---|---|---|---|---|
| Tanares_Sourcebook.pdf | Univers de Tanares : monde, factions, panthéon, régions, organisations, histoire, bestiaire, objets magiques | 179 | EN | natif, double page | 2 029 (1 806 ≥ 512²) |
| Players_Guide_to_Tanares_Version_20231218.pdf | Espèces, classes, sous-classes, historiques, dons, sorts, règles optionnelles | 165 | EN | natif, double page | 1 710 (1 476 ≥ 512²) |
| Manuel-Des-Monstres.pdf | Monster Manual D&D 5 en français | 354 | FR | scan OCR bruité | 1 424 (633 ≥ 512²) |
| Manuel-Des-Joueurs.pdf | Player's Handbook D&D 5 en français — 5 races et 8 classes absentes des Basic Rules | 320 | FR | scan OCR, tables récupérables en -table | 631 (453 ≥ 512²) |
| Basic-Rules-FR.pdf | Règles de base D&D 5 en français (aidedd.org) | 137 | FR | natif propre | 175, surtout des fonds de page |
| Animaux.pdf | Bêtes du SRD traduites (aidedd.org) | 32 | FR | natif très propre | 38, uniquement des fonds |
| Glossaire.pdf | Lexique de traduction anglais → français (aidedd.org) | 22 | EN/FR | natif, 2 colonnes | 5 pictogrammes |
| Character_Sheets_Tanares.pdf | Feuilles de personnage | 5 | EN | aucun (vectoriel) | 6, jusqu'à 2 668 × 3 418 |
Neuf ressources se sont ajoutées au corpus après les huit PDF ci-dessus. Elles ne viennent pas d'un autre livre : ce sont les fichiers distribués avec Tanares pour jouer sur table virtuelle. Leur intérêt tient exactement à ce que les PDF de règles n'ont pas — des cartes vues de dessus, des jetons déjà détourés, une carte du monde sans double page ni filigrane, et une feuille de personnage vierge, c'est-à-dire une maquette et non un exemple rempli.
| Ressource | Nature | Volume | Texte | Ce qu'elle alimente |
|---|---|---|---|---|
| VTT/Character Compendium - Low.pdf | PNJ et créatures de Tanares : bloc de statistiques complet et portrait pleine page | 169 pages | natif, 608 000 car. | LOT-46, LOT-82 |
| VTT/Character Compendium - High.pdf | le même, à haute définition (83 Mo) | 169 pages | identique | extraction d'illustrations |
| VTT/Adventure Map Grids.pdf | 31 cartes tactiques peintes, vues de dessus, alignées sur une grille | 31 planches | aucun | LOT-19, LOT-27, LOT-40 |
| VTT/Adventure Hunt for Azymor.pdf | module d'aventure complet : intrigue, PNJ nommés, lieux, rencontres | 15 pages, double | natif, 97 000 car. | LOT-27, LOT-16 |
| VTT/Map - World.jpg | la carte du monde, 9 933 × 7 016, sans filigrane | 1 planche | aucun | LOT-42 |
| VTT/Map - Capital.jpg | plan de la capitale, rue par rue, 9 933 × 7 016 | 1 planche | aucun | LOT-42, LOT-82 |
| VTT/Blank Sheets RPG (1).pdf | les 5 feuilles de personnage vierges | 5 planches | aucun (vectoriel) | LOT-38 |
| VTT/RPG Sheets - BW print (2).pdf | les mêmes en noir et blanc | 5 planches | aucun | LOT-38 |
| VTT/Tokens VTT PNG/ | 172 jetons ronds détourés, 354 × 354, canal alpha | 172 fichiers | — | LOT-38, LOT-15, LOT-24, LOT-82 |
Trois d'entre elles changent un arbitrage déjà pris, et il vaut mieux l'écrire ici que le laisser découvrir au lot concerné :
Comme les huit premiers, ces fichiers ne sont pas versionnés (§1) : ils sont déclarés dans scripts/sourcebook/corpus.toml, avec leur empreinte, et c'est ce manifeste qui est versionné. Il sait depuis leur arrivée décrire autre chose qu'un PDF — une planche seule, ou une collection de fichiers, dont l'empreinte porte sur la liste triée de ses membres : un jeton retiré, ajouté ou retouché la change, et 172 lignes de manifeste n'ont pas eu à être écrites pour un jeu qu'on prend ou qu'on laisse entier.
Le projet est privé, sans diffusion ni acte commercial, et le dépôt est passé en privé. Les licences du corpus ne contraignent donc pas l'usage : noms propres, textes, blocs de statistiques et illustrations sont utilisables tels quels dans le jeu.
Ce paragraphe existe quand même, parce que la contrainte n'est pas supprimée mais endormie : elle se réveille intégralement le jour où le projet serait publié, diffusé ou vendu. Autant savoir dès maintenant ce qu'il faudrait alors reprendre, plutôt que de le découvrir à ce moment-là.
| Source | Statut | Ce qu'il faudrait faire en cas de publication |
|---|---|---|
| Basic-Rules-FR, Animaux, Glossaire | OGL 1.0a, diffusion libre (aidedd.org) | Rien, hors ajout de la notice OGL et de l'attribution SRD 5.1 à THIRD-PARTY-NOTICES.md |
| Tanares_Sourcebook, Players_Guide | Mécanique SRD ouverte ; lore, noms et art réservés (Product Identity : « Tanares », « Penumbral Plane », « madwalker », « taii'maku », « Golgöggoth », « Isendden », « emogum ») | Renommer le monde et ses entités, réécrire les textes, remplacer les illustrations |
| Manuel-Des-Joueurs (dans le périmètre), Manuel-Des-Monstres (hors périmètre) | Copyright plein (Wizards of the Coast / Black Book Éditions) | Retirer les données marquées phb-fr — soit 5 races et 8 classes, à remplacer par des créations propres |
En pratique, cela suggère une seule discipline, peu coûteuse et qui garde la porte ouverte : tracer la provenance. Chaque donnée produite porte un champ "source" (srd, tanares, phb-fr, original). Un jour de publication, la question « qu'est-ce qui doit sauter ? » se répond par une requête plutôt que par une relecture de tout le catalogue — et le LOT-32 peut l'imposer par schéma sans effort supplémentaire.
Cela ne change rien au cadrage acté avant le LOT-01 — règles d20 maison, compatibles SRD dans leur structure, sans en dépendre : le moteur reste indépendant du SRD, ce sont les données qui viennent du corpus.
Six constats techniques, tous vérifiés sur le corpus, qui déterminent la faisabilité des lots.
PyMuPDF fait tout, et mieux que l'outillage en ligne de commande. Le poste dispose de pdftotext version Xpdf 4.00, mais ni pdfimages ni pdftoppm. PyMuPDF 1.28.2 (installable par pip, testé) couvre en une seule bibliothèque le texte, les coordonnées de mots, les images et le rendu de page — c'est la dépendance à retenir pour le LOT-30, plutôt qu'un assemblage d'exécutables partiellement présents.
Les livres Tanares sont paginés en double page. 179 pages PDF pour un livre qui numérote jusqu'à 358 ; une page PDF porte deux pages du livre côte à côte, ce qu'un rendu confirme visuellement. Toute correspondance « page du sommaire → page PDF » doit intégrer ce facteur 2, sinon on cible systématiquement le mauvais chapitre. C'est la première chose que le manifeste du LOT-30 doit enregistrer.
pdftotext -layout mélange les colonnes des tableaux. Sur la table des armes des Basic Rules, il produit des lignes où le poids et le prix appartiennent à l'arme d'en dessous — une donnée fausse, et fausse silencieusement, ce qui est pire qu'une extraction qui échoue. Le mode -table d'Xpdf les restitue correctement (Bâton | 1d6 contondant | 2 kg | 2 pa | Polyvalente (1d8)), et PyMuPDF permet mieux encore en regroupant les mots par coordonnée x. Dans tous les cas : jamais -layout sur un tableau.
Les blocs de statistiques d'Animaux.pdf suivent un gabarit strict. Toujours le même ordre, toujours les mêmes libellés :
Un automate suffit. Les 94 entrées sont accessibles sans jugement humain, hors relecture de contrôle. Les 82 blocs du Sourcebook suivent un gabarit analogue en anglais.
Les deux manuels français sont des OCR bruités — mais moins gravement qu'il n'y paraît. Leurs pages de crédits donnent « Cordeil » pour « Cordell », « )on Schindehette », « Chefde projet », « W'àyne Reynolds ». Il serait tentant d'en conclure que ces fichiers sont inexploitables ; ce serait généraliser depuis la page la plus bruitée du livre, et ce serait faux. Le bruit se répartit en trois niveaux, de gravité très inégale :
Les valeurs numériques *absentes*** — pire que le précédent, et découvert en préparant le LOT-43. Sur la table du multiclassage (Manuel-Des-Joueurs, p. 166), l'extraction **supprime purement et simplement toute cellule valant 1 : le chiffre est trop fin pour que l'OCR le retienne, et il ne laisse rien derrière lui. Onze lignes sur vingt sont amputées d'une à quatre cellules, et un magicien de niveau 20 y perd ses deux emplacements de niveau 8 et 9.
Ce défaut n'est pas de la même famille que les précédents : une valeur fausse finit par se voir, une valeur absente ressemble à une case vide légitime — et cette table en contient de vraies. Aucune relecture du texte extrait ne peut le détecter, parce qu'il n'y a rien à relire.
Ce qui l'a révélé n'est pas une relecture mais un recoupement : la table du multiclassage est identique à la table de progression du magicien, laquelle figure en texte natif propre dans les Basic Rules (p. 31). Les vingt lignes comparées cellule à cellule donnent onze divergences, et toutes sont un 1 manquant côté OCR.
La règle qui en découle vaut pour toute la filière : une table numérique tirée d'un scan doit être recoupée contre une seconde source, ou contre un invariant. Sans quoi le LOT-49 cherchera des valeurs fausses, et ne trouvera pas les valeurs manquantes.
Conclusion : le Manuel-Des-Joueurs.pdf est exploitable avec le bon outil et une passe de contrôle — et il est indispensable, puisqu'il est la seule source française des 5 races et 8 classes absentes des Basic Rules. Le Manuel-Des-Monstres.pdf reste hors périmètre, non par impossibilité mais par arbitrage (§8) : 416 blocs à contrôler pour un bestiaire déjà suffisant.
L'extraction du flux brut des images est corrompue ; il faut passer par le rendu. Tirer un objet image par son xref produit sur ce corpus des zones de bruit vert et cyan — décodage raté d'un flux JPX ou d'un masque alpha. En revanche, rendre la page (ou une région clippée de la page) donne un résultat parfait, parce que le rendu passe par la composition complète. Avec une réserve qui compte : rendre une région composite tout ce qui y est dessiné, texte compris. Sur ces livres où l'art court sous les colonnes, l'extraction d'illustrations propres est donc semi-automatique — l'outil propose les régions candidates, l'humain garde et recadre. Les éléments d'habillage autonomes (panneaux de parchemin, cadres, bordures) sortent en revanche parfaitement seuls, et ce sont eux qui alimenteront l'interface.
Les lots LOT-13 (fiche de personnage), LOT-14 (inventaire), LOT-25 (sorts) et LOT-26 (économie) exigent tous un « catalogue en JSON », conformément à EX-VIS-007. Aucun ne dit d'où sortent ces JSON. C'est exactement le trou que ce corpus comble, et c'est le périmètre de cette filière.
Trente-huit lots, LOT-35 à LOT-84. Quatre numéros ont été retirés par fusion (LOT-31, LOT-48, LOT-71, LOT-73 : voir l'encart en fin de section), et les trois préconditions ont été livrées — LOT-77, LOT-78 et LOT-79 — qui ont donc quitté cette page pour leur dossier, comme tout lot livré. Les numéros sont, comme toujours, des identifiants stables : ils viennent après LOT-29 dans la numérotation, mais plusieurs s'exécutent avant les lots qui les consomment (voir §6). Une nouvelle famille d'exigences EX-CNT-* les couvre, à écrire dans un Documentation/Specification/contenu.md.
État de l'audit. Cette page a été confrontée à l'état réel du dépôt, puis à elle-même. Six lots dépassaient l'étalon mesuré sur les huit lots livrés — LOT-01 à LOT-08, soit 16 à 34 fichiers et 450 à 1340 lignes : le LOT-04 marque la borne haute à 19 fichiers pour 1337 lignes, le LOT-08 la borne basse à 16 fichiers pour 453 lignes. Ils ont été découpés : LOT-37/LOT-80, LOT-40/LOT-81, LOT-41/LOT-82, LOT-45/LOT-83, LOT-47/LOT-84, et le LOT-69 réduit à la suppression qu'il est réellement. Le principe de coupe est le même partout : le code d'un côté, la donnée de l'autre, chaque moitié ayant son consommateur et son critère d'acceptation.
Les epics réels font 33 à 89 lignes ; les sections ci-dessous en font environ 27, donc sous-spécifiées comme epics — elles seront reprises au démarrage de chaque lot. Aucune ne porte encore de rubrique « Exigences couvertes », faute de familles EX-* existantes : c'est l'objet du LOT-77.
Trois formes de sortie, et le choix entre elles n'est pas cosmétique. JSON pour tout ce qui est structuré et imbriqué — une créature a des actions, une classe a une progression par niveau — et parce que le projet lit déjà du JSON (skins.json, sounds.json, palettes.json). CSV pour la seule donnée réellement tabulaire et plate du corpus, le lexique du LOT-30 : 1 200 lignes de trois colonnes, qu'on veut pouvoir trier, comparer et corriger dans un tableur sans passer par un éditeur de code. PNG enfin, pour les textures du LOT-39.
Le périmètre est le monde complet : les 10 régions et leurs lieux, les 13 espèces, les 8 classes et leurs sous-classes, les historiques, les factions, le panthéon, le bestiaire entier. Pas de socle réduit, pas de tri préalable.
C'est le bon choix, et il est peu coûteux : extraire dix régions ne demande pas dix fois le travail d'en extraire une, puisque c'est le parseur qui coûte, pas les données qu'il avale. Mais il introduit un écart qu'il faut nommer tout de suite, sous peine de le découvrir en jeu :
Une donnée importée n'est pas une mécanique implémentée. L'élémentaliste a sa propre liste de sorts, le madwalker ses trails, le redeemer ses blessings. Importer ces classes prend une après-midi ; faire que le moteur les joue correctement est un programme entier.
La règle qui évite le piège est celle que le LOT-25 pose déjà pour les sorts, étendue à toute la filière : chaque donnée déclare les mécanismes dont elle a besoin, et le moteur refuse en le disant ce qu'il ne sait pas honorer. Une classe dont le moteur ignore la ressource propre se signale au chargement, elle ne se joue pas en silence comme une classe ordinaire amputée de ce qui la définit.
Ainsi le catalogue peut être complet longtemps avant le moteur, sans jamais mentir sur ce qui est jouable — et l'écart entre les deux devient une liste consultable plutôt qu'une surprise.
Le jeu visé dans un premier temps est un bac à sable — le personnage parcourt les dix régions librement, sans intrigue directrice. Ce cadrage n'ajoute pas une contrainte à la filière, il en change la nature, et pour le mieux.
Un bac à sable se nourrit de contenu systémique : les rencontres naissent d'une table et d'un lieu, pas d'un script ; le stock d'un marchand se déduit de sa région ; une quête se compose à partir des objectifs d'une faction et de l'état du monde. Rien de tout cela ne s'écrit à la main région par région — et c'est précisément ce que le corpus permet d'éviter, parce que les Regional Statistics sont déjà des réglages de bac à sable. Monster Presence, Magic Access, Economic Prosperity, Crime and Violence : quatre axes notés, dix régions, et le monde se différencie mécaniquement sans qu'une seule valeur soit inventée.
D'où trois lots supplémentaires, LOT-40 à LOT-42, qui transforment l'atlas en monde parcourable : le terrain, son peuplement, et le voyage entre les régions.
Cela ne remplace pas le LOT-27, qui garde sa fonction : prouver que la boucle complète tourne — explorer, parler, déclencher, combattre, gagner — sur un village et un donjon. Un bac à sable est cette boucle répétée sur cent lieux ; la construire sur cent lieux avant de l'avoir validée sur un seul multiplierait simplement par cent le coût de chaque correction.
Prérequis : LOT-32. Alimente LOT-25.
Exigences couvertes : EX-RPG-050, EX-RPG-051.
Les sorts et l'appendice des états des Basic Rules vers spells/ et conditions/, complétés par les sorts propres au Player's Guide (liste de l'élémentaliste, descriptions du ch. 4).
La règle qui compte est celle que le LOT-25 énonce déjà : le C++ ne porte que des mécanismes (dégâts de zone, jet de sauvegarde, condition appliquée, durée), la donnée les compose. Un sort dont l'effet n'entre pas dans ces mécanismes se déclare explicitement "effet": "narratif" — un sort tu, qu'on croit implémenté et qui ne fait rien, coûte bien plus cher à diagnostiquer qu'un sort déclaré non joué.
Acceptation — chaque sort porte école, niveau, portée, durée, composantes, effet ; aucun sort ne tombe silencieusement dans un cas par défaut, un test énumère le catalogue et l'exige.
Prérequis : LOT-81, LOT-11. Alimente LOT-41.
Découpé à l'audit. Ce lot mêlait un générateur (du C++ déterministe, testable sans aucune donnée de région) et les descripteurs des dix régions (de la donnée extraite et relue). Deux métiers, deux critères d'acceptation : les descripteurs partent au LOT-81. Ne reste ici que le moteur, qui se valide sur un descripteur de test.
Dix régions, une dizaine de lieux nommés chacune : environ cent cartes. Dessinées à la main dans l'éditeur, à raison de quelques heures pièce, c'est une année de travail pour un développeur seul — et la certitude que le monde ne sera jamais fini. Elles doivent donc se générer.
La génération n'est pas un pis-aller ici, parce que la matière existe déjà. Le LOT-81 livre pour chaque région un descripteur de terrain dérivé de sa section Geography, et le vocabulaire de tuiles est posé depuis le LOT-08 : Grass, Dirt, Sand, Water, DeepWater, Wall, Cliff, Bridge, Stairs. Le Central Empire annonce « vallées fluviales, vastes prairies, forêt du Bak, marais, hauts plateaux du nord » ; le Freelands « landes et zones humides, forêts tempérées, chaînes glacées, deux mers ». Ce sont des recettes de terrain, pas de la prose d'ambiance.
Le lot produit un générateur qui, d'un descripteur de région et d'une graine dérivée de l'identité du lieu, rend une carte au format du LOT-04 : couches, collision, portails. La graine dérive du lieu et non de l'horloge — même raison qu'au LOT-26 pour les coffres : une carte qui se re-tire différemment à chaque chargement n'est pas un monde, c'est un kaléidoscope.
Le rapport à l'éditeur est le point à ne pas manquer : la génération produit un niveau ordinaire, que le LOT-11 ouvre, corrige et enregistre comme n'importe quel autre. Un générateur dont la sortie n'est pas éditable oblige à choisir entre tout générer et tout dessiner ; celui-ci permet de générer les cent cartes et d'en finir dix à la main — les seules que le joueur regardera de près.
Les 31 cartes tactiques de VTT/Adventure Map Grids.pdf (§2) donnent au générateur ce qui lui manquait : un étalon. Elles sont peintes vues de dessus et alignées sur une grille, c'est-à-dire sous l'angle exact où ce lot produit — ce qu'aucune autre matière du corpus ne montre. Une carte générée qui ne soutient pas la comparaison avec l'une d'elles n'est pas une carte finie.
Acceptation — une même graine et un même descripteur rendent deux fois la carte identique ; toute carte générée est traversable de son entrée à sa sortie, vérifié par un parcours automatique ; une carte générée s'ouvre dans l'éditeur, se modifie et se recharge sans perte. Le générateur se teste sur un descripteur de fixture, sans dépendre des dix régions réelles.
Prérequis : LOT-40, LOT-33, LOT-46, LOT-44, LOT-27. Alimente LOT-82.
Découpé à l'audit. Ce lot dérivait deux peuplements sans rapport des mêmes statistiques : le danger (créatures, rencontres, embuscades) et le civil (PNJ, marchands, prix, quêtes). Deux dérivations indépendantes, deux jeux de données d'entrée, deux mesures d'acceptation. Le civil part au LOT-82.
Une carte vide n'est pas un lieu. Ce lot y met ce qui est hostile, et il le fait par déduction depuis les données de région, jamais par placement manuel — c'est ce qui rend dix régions tenables.
Trois des sept Regional Statistics pilotent ce versant :
| Statistique | Ce qu'elle pilote |
|---|---|
| Monster Presence | Densité des rencontres, dangerosité des tables de la région |
| Crime and Violence | Embuscades sur les routes, fréquence des rencontres hostiles |
| Political Stability | Présence de gardes, donc de rencontres qui tournent mal |
Le bestiaire des 176 créatures y est filtré par région : une table de rencontre se compose de ce qui vit là, à la dangerosité que la région annonce, et non d'un tirage uniforme dans le catalogue.
Acceptation — deux régions aux statistiques opposées produisent des densités et des tables de rencontre mesurablement différentes, vérifié par un test ; le peuplement est reproductible à graine égale ; aucune rencontre n'est placée en dur dans le code ; aucune créature n'apparaît dans une région dont le biome ne la porte pas.
Prérequis : LOT-82, LOT-68, LOT-70, LOT-09, LOT-17.
Un univers vaste ne vaut que si l'on peut le parcourir. Ce lot livre la carte du monde — les dix régions, leurs lieux connus, la position du personnage — et le déplacement entre régions : routes, voyage rapide vers un lieu déjà visité, et le coût que ce voyage représente (temps, ravitaillement, risque de rencontre selon la Crime and Violence traversée).
Il porte aussi la découverte : un lieu se révèle en y arrivant ou en l'apprenant d'un PNJ, et cet état de découverte entre dans la sauvegarde du LOT-17. Sans cela, un monde de cent lieux s'ouvre entièrement dès la première seconde et n'a plus rien à offrir.
L'IHM s'appuie sur les cartes de régions du Sourcebook, redessinées à l'échelle du jeu par le LOT-39 — et surtout sur VTT/Map - World.jpg, la carte du monde à 9 933 × 7 016 sans filigrane et hors double page, là où le fond de menu du LOT-67 se contentait de 96 ppp parce qu'il n'était qu'un décor. Un écran qu'on consulte demande de lire les toponymes ; celui-ci le permet. VTT/Map - Capital.jpg donne la capitale rue par rue, à la même définition.
Acceptation — le joueur atteint les dix régions par le seul jeu, sans commande de débogage ; la carte du monde n'affiche que ce qui est découvert ; l'état de découverte survit à une sauvegarde et à un rechargement.
Prérequis : LOT-36, LOT-37. Prérequis de LOT-41.
Un bac à sable peuple des centaines de PNJ. Il lui faut donc des noms, et le corpus en fournit par espèce et par culture : les Basic Rules listent noms masculins, féminins et de famille pour chaque race, le Player's Guide fait de même pour les siennes (Male Names: A'Kole, B'Abku… chez les taii'maku). Croisés avec la répartition d'espèces d'une région, ils donnent des habitants plausibles plutôt qu'une suite de « Villageois 1 ».
S'y ajoutent les tables aléatoires déjà écrites : les traits, idéaux, liens et défauts en d6 de chaque historique — de quoi donner une personnalité à un PNJ sans en écrire une —, la table de babioles (p. 59), et le contenu d'ambiance du chapitre 8 du Sourcebook : animaux de compagnie, boissons, fêtes, nourriture, jeux de taverne, mesure du temps.
C'est le lot le moins spectaculaire de la filière et l'un des plus rentables : c'est lui qui fait la différence entre un monde peuplé et une grille d'entités.
Acceptation — mille PNJ générés dans une région donnent une distribution d'espèces conforme à celle déclarée par la région, et aucun doublon de nom complet en deçà d'un seuil annoncé ; la génération est reproductible à graine égale.
Prérequis : LOT-82, LOT-68, LOT-16, LOT-26. Alimente LOT-83.
Découpé à l'audit. Ce lot portait à la fois le catalogue (rangs, bandes de facteur de puissance, gabarits de contrat, tableau d'affichage) et la boucle de progression (monter de rang, ce que cela change, ce que cela débloque). Le premier est de la donnée et un écran ; le second est une mécanique qui suppose l'expérience du LOT-74. La boucle part au LOT-83.
C'est la colonne vertébrale du bac à sable, et elle n'est pas à inventer : le Sourcebook la décrit dans la République des Freelands. La Guilde enregistre les aventuriers, affiche les quêtes déposées par les citoyens, et applique un classement du fer au diamant dont l'objet explicite est d'« empêcher les aventuriers inexpérimentés de prendre des tâches au-dessus de leurs moyens ».
Chaque rang porte sa correspondance chiffrée :
| Rang | Niveau de personnage | FP des PNJ |
|---|---|---|
| Fer | 1 à 2 | ⅛ à ¼ |
| Cuivre | 3 à 4 | ½ à 1 |
| Bronze | 5 à 6 | 2 à 4 |
| Argent | 7 à 10 | 5 à 7 |
| Or et au-delà | 11 à 16 | 8 à 13 |
C'est exactement ce qui manque à un monde ouvert : un tableau de quêtes diégétique où déposer le contenu généré par le LOT-41, une échelle de difficulté qui dit quelle créature opposer à quel niveau, une raison de progresser, et un garde-fou qui évite au joueur de niveau 2 de se faire étriller dans une région d'Argent sans avertissement.
Les halls de guilde étant « bâtis jusqu'au-delà des Freelands », le système s'étend naturellement aux dix régions et donne au LOT-42 des points d'ancrage pour le voyage.
Acceptation — un contrat n'est proposé qu'au rang correspondant ; la difficulté d'un contrat généré respecte la bande de FP de son rang, vérifié sur les cinq rangs ; le tableau de quêtes affiche ce que le LOT-82 a composé, sans qu'aucun contrat ne soit écrit à la main.
Prérequis : LOT-33, LOT-30.
Les 82 blocs de Tanares (ch. 9, 17 familles : akhu, emoguns, gloomfolk, ironhands, kemets, kepesh, kikoku, dragons et drakes pénombraux, ninjas spectraux, constructs taii'makian…). Gabarit analogue aux 94 du LOT-33, mais en anglais : c'est l'étape de traduction, via le lexique du LOT-30, qui justifie un lot séparé plutôt qu'un pipeline supplémentaire dans le précédent.
Avec les 94 du SRD, cela porte le bestiaire à 176 créatures — et c'est le total retenu. Les 416 blocs du Manuel des Monstres sont écartés du périmètre (voir §8) : 176 profils suffisent largement à peupler dix régions, et ils épargnent le seul gisement du corpus dont chaque valeur numérique aurait dû être relue.
À réexaminer dans ce lot : le VTT/Character Compendium (§2), arrivé après cet arbitrage, porte 169 pages de PNJ et de créatures en texte natif — l'argument de l'OCR bruité qui écartait le Manuel des Monstres ne s'y applique pas. Le total de 176 était un choix de périmètre, pas une limite de matière : c'est ici qu'il se rediscute, chiffres en main.
Ce lot est donc borné et achevable, contrairement à ce qu'il était quand il portait le Manuel des Monstres : 17 familles, une fin, un critère de fin.
Acceptation — les 82 profils chargent et sont jouables en combat, pas seulement chargés ; chaque terme de règle traduit est conforme au lexique du LOT-30 ; dix profils sont vérifiés à la main contre le PDF.
Prérequis : LOT-36, LOT-43, LOT-84.
Exigences couvertes : EX-RPG-021, EX-RPG-022, EX-RPG-023, EX-RPG-052.
Découpé à l'audit, et allégé d'une dépendance. Ce lot portait aussi l'extraction des 31 tables de progression — de la donnée, relue ligne à ligne, qui appartient à la filière contenu et n'a aucune raison d'attendre le socle : elle part au LOT-84. Et il déclarait le LOT-49 en prérequis, ce qui faisait attendre au socle de classe un contrôleur de cohérence numérique qui attend lui-même le catalogue d'objets. Le lien est passé en « alimente » : le LOT-49 contrôle les tables quand elles arrivent, il ne les précède pas.
Non pas les seize classes, mais ce qui leur est commun — et une seule classe pour le démontrer.
Grouper seize classes dans un lot serait cacher une phase entière derrière un numéro. Une classe n'apporte pas des données, elle apporte une mécanique : la rage n'est pas la magie de pacte, la forme sauvage n'est pas l'attaque sournoise. Chacune se code, se teste et se règle séparément. D'où le découpage en LOT-51 à LOT-65, une classe par lot.
Ce lot-ci pose donc le contrat commun : ce qu'une classe déclare (dé de vie, maîtrises, caractéristiques de sauvegarde, table de progression sur 20 niveaux, niveau de choix de sous-classe, ressources propres), comment une ressource de classe se décrit génériquement — quantité, cadence de récupération (repos court, repos long, à volonté), et ce qu'elle alimente — et comment une sous-classe se greffe sans dupliquer sa classe mère.
Il le prouve sur le guerrier, la classe la plus simple : pas d'incantation, deux ressources seulement (Second souffle, Fougue), et l'Attaque supplémentaire qui suffit à valider la boucle d'attaque du LOT-21. Si le socle ne tient pas pour le guerrier, il ne tiendra pour personne.
Les 31 tables de progression que le LOT-84 a extraites sont ici consommées : le socle les lit, il ne les produit pas.
Acceptation — le guerrier est jouable du niveau 1 au niveau 5, ses deux ressources se consomment et se récupèrent au bon repos ; ajouter une classe ne demande de toucher à aucun fichier C++ existant hors l'ajout de sa mécanique propre.
Prérequis : LOT-33, LOT-34.
Exigences couvertes : EX-CNT-050.
Le LOT-32 valide la structure : un fichier bien formé, des champs présents, des énumérations connues. Il ne dit rien de la plausibilité. Un loup à CA 47, une épée à 3 pièces d'or au lieu de 30, une créature de FP ⅛ avec 90 points de vie : tout cela franchit un schéma sans broncher.
Écarter le Manuel des Monstres retire le pire des risques — l'OCR bruité — mais pas le risque lui-même, qui vient des tableaux et qui est démontré au §4 : sur la table des armes, -layout attribue le poids et le prix à l'arme de la ligne suivante. Les 31 tables de progression du LOT-84 et les tables d'équipement du LOT-34 courent exactement ce danger, et une valeur décalée d'une ligne ne lève aucune alerte.
Le lot ajoute donc un contrôle statistique plutôt que syntaxique : pour chaque famille, les bornes attendues d'une valeur au regard des autres champs — PV cohérents avec le dé de vie et la Constitution, bonus d'attaque cohérent avec la caractéristique et le facteur de puissance, prix cohérent avec la rareté. Ce qui sort des bornes est signalé, pas rejeté : une créature volontairement hors norme existe, un OCR raté aussi, et seul un humain les distingue.
Acceptation — une valeur sciemment corrompue dans un profil de test est détectée ; le rapport distingue l'anomalie confirmée de l'anomalie acceptée, et cette acceptation est enregistrée dans la donnée pour ne pas être re-signalée à chaque exécution.
Prérequis : LOT-19, LOT-20, LOT-21, LOT-47. Prérequis de LOT-51 à LOT-65.
Un lieu pour éprouver le combat, encore et encore, sans monter une partie complète à chaque essai. Et le corpus en fournit un qui n'est pas un outil de développement déguisé : les Arènes de Tanares, mentionnées cent fois dans le Sourcebook, sont une institution centrale du monde.
Ce qu'elles apportent est presque taillé pour l'usage :
Le lot livre l'arène comme carte jouable — une grille tactique dégagée, des gradins, des points d'entrée — plus un écran de mise en place : choisir les combattants de chaque camp, leur niveau, leur équipement, et lancer. Rejouable à graine fixée pour comparer deux versions d'une mécanique.
Sa vertu la plus durable est de n'être jamais du code jetable : c'est une zone du jeu final, avec ses combats de gloire, sa Marque Héroïque à gagner et son statut social — le monde de Tanares est né du jeu de plateau Arena: The Contest, et l'arène y est chez elle.
Acceptation — un affrontement se met en place, se joue et se rejoue sans quitter le jeu ; à graine et composition égales, deux exécutions donnent le même déroulé ; aucun combattant n'y meurt définitivement ; l'arène s'ouvre aussi comme une carte ordinaire depuis le monde (LOT-42).
Prérequis de chacun : LOT-47, LOT-50, LOT-70.
Quinze lots sur le même patron, un par classe restante. Chacun livre : la classe complète du niveau 1 au niveau 20, sa mécanique propre implémentée dans le moteur, au moins une sous-classe, et ses tests.
Le critère d'acceptation est commun et tient en une phrase : la classe se joue dans le Colisée contre un adversaire de son niveau, et sa mécanique propre s'y observe — la rage réduit effectivement les dégâts subis, le châtiment divin consomme bien un emplacement, la forme sauvage change réellement le profil. Une classe dont la mécanique ne se voit pas en combat n'est pas livrée.
| Lot | Classe | Mécanique propre | Ce qu'elle exige du moteur |
|---|---|---|---|
| LOT-51 | Barbare | Rage, défense sans armure | Ressource par repos long, résistance conditionnelle, CA calculée autrement |
| LOT-52 | Roublard | Attaque sournoise, Ruse | Condition d'avantage ou d'allié adjacent, action bonus de déplacement |
| LOT-53 | Clerc | Conduit divin, sorts préparés | Emplacements, distinction préparés / connus, canal à usage limité |
| LOT-54 | Magicien | Grimoire, restauration arcanique | Préparation depuis un grimoire, récupération partielle d'emplacements |
| LOT-55 | Barde | Inspiration bardique | Dé confié à un autre personnage, dépensé plus tard, à distance |
| LOT-56 | Moine | Ki, arts martiaux | Ressource par repos court, progression des attaques à mains nues |
| LOT-57 | Paladin | Châtiment divin, auras | Conversion d'emplacement en dégâts, effet de zone permanent autour du porteur |
| LOT-58 | Rôdeur | Ennemi juré, explorateur | Bonus conditionnés au type de créature et au terrain |
| LOT-59 | Ensorceleur | Points de sorcellerie, métamagie | Conversion ressource ↔ emplacement, altération d'un sort à l'incantation |
| LOT-60 | Sorcier | Magie de pacte, manifestations occultes | Un second système d'emplacements : peu nombreux, toujours au niveau maximal, récupérés au repos court |
| LOT-61 | Druide | Forme sauvage | Substitution complète du profil de créature — le plus lourd du lot |
| LOT-62 | Élémentaliste | Éléments primordiaux, sorts de fusion | Liste de sorts dédiée, combinaison de deux sorts en un |
| LOT-63 | Dragonblade | Voies draconiques | Ressource liée à un dragon choisi, effets par couleur |
| LOT-64 | Madwalker | Trails aberrantes | Progression par piste plutôt que par sous-classe unique |
| LOT-65 | Redeemer | Bénédictions | Liste de bénédictions accordées à autrui, distincte des sorts |
Deux d'entre eux méritent d'être vus venir. Le druide (LOT-61) remplace le profil entier du personnage par celui d'une bête pendant sa forme sauvage : c'est le seul cas où une classe touche à l'agrégat que le LOT-13 suppose stable, et il vaut mieux l'aborder tard, une fois le reste éprouvé. Le sorcier (LOT-60) introduit un système d'emplacements parallèle : si le LOT-25 a codé « les emplacements » au singulier, il faudra y revenir — autant le savoir avant.
L'ordre du tableau n'est pas alphabétique : il va du plus simple au plus intrusif, pour que chaque lot bénéficie du précédent.
Le dernier lot livré retire l'échafaudage : les quatre classes provisoires du LOT-36 sont supprimées, et rien ne doit s'en apercevoir.
Deux fois corrigé à l'audit. D'abord la prémisse : ce lot affirmait que l'éditeur est « un outil Qt séparé », ce qui est faux — EX-EDIT-030 impose déjà « un éditeur intégré à l'application (mode éditeur), et non un outil séparé », et EX-ARCH-090 prévoit un état Éditeur.
Ensuite le périmètre, et c'est le changement qui compte. Ce lot était écrit comme la refonte de l'éditeur en mode édition dans la scène, et déclarait LOT-50 en prérequis — ce qui plaçait le socle de classe et le Colisée avant le vertical slice du LOT-27, à rebours de l'argument du §6. Or le §10 conclut que le LOT-11 n'étant pas commencé, il doit viser d'emblée l'édition dans la scène. Cette conclusion est ici prise au mot : la refonte est devenue le cahier des charges du LOT-11, et il ne reste à ce lot que la suppression de l'atelier de dessin — qui n'a besoin ni du Colisée ni des classes.
Le LOT-66 supprime l'identité pixel art — et avec elle la raison d'être de l'atelier pixel art que l'EX-IHM-073 impose aujourd'hui comme l'un des deux espaces de travail exclusifs. Un atelier de dessin de sprites au pixel n'a plus d'objet dans un jeu habillé de parchemin peint et d'illustrations à 300 ppp. C'est tout le sujet de ce lot.
Ce qui a été transféré au LOT-11. L'édition dans la scène — entrer en mode édition depuis le jeu, poser librement décors, objets, coffres, PNJ et ennemis sur la grille, sortir, et jouer immédiatement ce qu'on vient de poser. La boucle « modifier → constater » tombe de plusieurs minutes à quelques secondes, et c'est cette boucle qui décide si un outil sert vraiment. Sept exigences en portent le sens inverse et sont à réviser là-bas : EX-IHM-001 range l'éditeur dans l'interface hors-jeu, EX-IHM-010 en fait une fenêtre à panneaux dockables détachables, EX-IHM-050/054/082 lui donnent une portée de style disjointe de celle du jeu, EX-EDIT-020 en fait un « outil exécutable » pour non-codeurs, et EX-EDIT-008 fait aller le flux de l'éditeur vers le jeu. EX-VIS-006 — « un éditeur permettant à des membres non-développeurs de créer du contenu sans coder » — s'en trouve mieux servi, pas abandonné.
Le construire d'emblée coûte ce que coûte le LOT-11 ; le construire puis le refondre coûte le double. C'est la seule raison de ce transfert.
Ce qui est conservé : le format de niveau du LOT-04, les couches, la couche de collision qui fait foi, les portails, la validation du graphe — et le panneau de textures (TexturePanel), qui affecte des habillages aux types de tuiles et reste utile.
Ce qui est retiré : l'atelier de dessin proprement dit — PixelCanvas, PixelOperations, PixelHistory, PixelPalette, PixelAssetIO, PixelAutotilePreview et leurs deux panneaux, soit **~2 975 lignes** — avec la révision d'EX-IHM-073, qui n'a plus deux espaces à rendre exclusifs, et d'EX-EDIT-045 qui le prescrit. Le guide Documentation/Guide/guide-atelier-pixel-art.md et les huit fichiers de tests associés disparaissent avec.
Ce retrait est un revirement, pas un oubli. Le LOT-01 a conservé l'atelier lors de la purge, et le LOT-11 en fait un acquis à ne pas régresser. La raison de revenir dessus est que le LOT-66 retire l'identité pixel art : un atelier de dessin au pixel n'a plus de sujet. Mais c'est une décision à assumer explicitement, pas à laisser passer.
Acceptation — aucun panneau, aucun fichier ni aucun test de l'atelier pixel art ne subsiste ; EX-IHM-073 et EX-EDIT-045 sont révisées ; l'éditeur du LOT-11 continue de fonctionner à l'identique, panneau de textures compris.
*Prérequis : LOT-13. **Débloque LOT-51→LOT-65, LOT-25, LOT-75 et LOT-42.***
Exigences couvertes : EX-DND-030, EX-DND-032.
Fusionné à l'audit. Ce lot a absorbé l'ancien LOT-71 (repos court et long). L'horloge n'a aucun consommateur hors du repos et du campement : livrée seule, elle ne produit rien d'observable, et le §6 les traitait déjà comme une paire indissociable. Le numéro LOT-71 est retiré.
core::GameClock : un temps de jeu, distinct du temps réel, qui avance en exploration et se gèle en combat — un combat se compte en tours, pas en minutes. Cycle jour/nuit, calendrier simple.
Le piège. Le temps de jeu ne doit jamais dériver de l'horloge système. Le LOT-26 interdit déjà les graines liées à l'horloge, et pour la même raison : une sauvegarde rechargée décalerait tout. Le temps avance par pas de simulation, et par rien d'autre.
Et ce qu'un repos restaure. Un repos court (1 h de jeu) et un repos long (8 h) : points de vie via les dés de vie, ressources de classe selon leur cadence, emplacements de sorts. Interruption par une rencontre.
Le second piège. Chaque ressource déclare sa propre cadence — repos court, repos long, à volonté — et Rest ne connaît aucune classe. Sans cela, chacun des quinze lots de classes à venir modifierait le code du repos, et la quinzième modification casserait la première.
Acceptation — 24 h de jeu s'écoulent en un nombre déterministe de pas ; une ressource « repos court » se restaure au repos court et pas avant ; un repos interrompu ne restaure rien ; les quatre classes provisoires du LOT-36 récupèrent correctement sans que Rest les connaisse ; l'horloge ne bouge pas pendant un combat ; elle survit à une sauvegarde et à un rechargement.
Prérequis : LOT-12, LOT-21, LOT-35.
Exigences couvertes : EX-DND-040, EX-DND-041, EX-CBT-040, EX-CBT-041, EX-CBT-042.
Fusionné à l'audit. Ce lot a absorbé l'ancien LOT-73 (agonie et mort). Les jets de sauvegarde contre la mort sont une application du système de conditions — inconscient, stabilisé — et les traiter à part faisait rouvrir par le second les fichiers du premier. Le numéro LOT-73 est retiré.
Le moteur d'application : poser, empiler, expirer — en tours ou en temps de jeu — et l'effet sur les jets : avantage, désavantage, incapacité d'agir.
Le piège. Une condition n'est pas un booléen sur la fiche. Deux sources peuvent poser « empoisonné » avec deux durées différentes ; retirer l'une ne doit pas retirer l'autre. C'est le piège de la classe d'armure du LOT-14, transposé : on recalcule depuis les sources, on n'accumule jamais.
Et l'agonie. Points de vie à 0, inconscience, jets de sauvegarde contre la mort (trois succès ou trois échecs), stabilisation, critique à 0 PV, dégâts massifs. Et la mort hors combat, aujourd'hui absente de tout document.
Ce lot ne touche pas à EX-GP-030/031/032, qui décrivent encore la mort du jeu de plateforme : leur retrait appartient au LOT-67, qui retire la notion de niveau discret dans son ensemble. Le LOT-72 en dépend pour son vocabulaire, mais ne se les approprie pas — une exigence retirée deux fois par deux lots est une exigence dont personne ne répond.
Acceptation — deux sources de la même condition, retrait de l'une, l'autre tient ; une condition expire au bon tour ; chaque état du catalogue LOT-35 a un effet observable, ou est explicitement déclaré narratif ; trois échecs tuent, trois succès stabilisent, un soin au-dessus de 0 réinitialise le compteur ; mourir en exploration a un effet défini, et ce n'est pas « redémarrer le niveau ».
Prérequis : LOT-13, LOT-20, LOT-16.
Exigences couvertes : EX-RPG-030, EX-RPG-031, EX-RPG-032.
Les sources d'expérience, qui manquent entièrement : victoire au combat selon le facteur de puissance des adversaires, achèvement de quête, découverte de lieu — cette dernière propre au bac à sable. Puis les seuils, la montée de niveau, et la répartition dans un groupe (LOT-29).
Le piège. Trois lots consomment l'expérience et aucun n'en produit : le LOT-13 fait monter de niveau, le LOT-28 règle des seuils, le LOT-29 la répartit, mais rien n'en attribue jamais. Et niveaux.md fait encore progresser par tableau franchi (EX-LVL-014), une notion qui disparaît avec le LOT-67.
Acceptation — tuer une créature de facteur de puissance connu donne l'expérience attendue ; franchir un seuil monte d'un niveau, un dépassement multiple monte de plusieurs ; aucune progression liée au franchissement d'un tableau ne subsiste.
Prérequis : LOT-70, LOT-42, LOT-41.
Où et quand on peut se reposer : le campement comme action en monde ouvert, le risque de rencontre nocturne, l'auberge comme lieu sûr — que le LOT-09 cite déjà comme nœud de graphe sans lui donner de fonction.
Le piège. Un repos long disponible partout et sans risque annule toute gestion de ressources — or c'est elle qui rend le repos intéressant. La contrainte doit venir des données de région (Crime and Violence, Monster Presence du LOT-41), jamais d'une règle codée : c'est ainsi que dix régions donnent dix rapports au repos sans qu'une ligne de C++ les distingue.
Acceptation — se reposer en zone dangereuse déclenche des rencontres à une fréquence dérivée de la région ; une auberge garantit un repos non interrompu ; l'horloge avance du montant attendu.
Prérequis : LOT-37. Alimente LOT-16, LOT-82.
Détaché du LOT-37 à l'audit : les 5 factions, 18 divinités, 11 organisations, 7 lieux du plan pénombral, la chronologie et l'économie de minerais rares, vers Source/Elements/World/factions/, pantheon/ et organizations/.
Ce sont les entités transverses aux régions, et elles servent un autre consommateur que l'atlas : une faction porte des objectifs qui se traduisent en quêtes, un panthéon porte des domaines qui se traduisent en capacités. C'est ce qui rend le LOT-16 écrivable plutôt qu'improvisable — et c'est aussi pourquoi ce lot peut arriver après le LOT-37 sans retarder le graphe de cartes.
Acceptation — toute faction, divinité ou organisation citée par une région du LOT-37 existe dans le catalogue ; chaque faction déclare au moins un objectif exploitable comme gabarit de quête ; aucune entité orpheline, vérifié par check_world_graph.py.
Prérequis : LOT-37. Prérequis de LOT-40.
Détaché du LOT-40 à l'audit, pour séparer la donnée du moteur. Chaque région déclare son descripteur de terrain — proportions de biomes, présence d'eau, de relief, de bâti — dérivé de sa section Geography.
La matière est déjà écrite : le Central Empire annonce « vallées fluviales, vastes prairies, forêt du Bak, marais, hauts plateaux du nord » ; le Freelands « landes et zones humides, forêts tempérées, chaînes glacées, deux mers ». Ce sont des recettes de terrain, pas de la prose d'ambiance. Le travail est de les typer dans le vocabulaire de tuiles du LOT-08, et de les relire.
Acceptation — les dix régions portent un descripteur validé par schéma ; chaque biome cité correspond à un type de tuile existant ; deux régions distinctes ne portent pas le même descripteur.
Prérequis : LOT-41, LOT-34, LOT-44, LOT-80, LOT-15, LOT-26. Alimente LOT-45, LOT-42.
Exigences couvertes : EX-INV-030, EX-INV-031.
Détaché du LOT-41 à l'audit : le versant non hostile du peuplement, dérivé des quatre autres Regional Statistics.
| Statistique | Ce qu'elle pilote |
|---|---|
| Magic Access | Présence d'objets magiques chez les marchands, PNJ lanceurs de sorts |
| Economic Prosperity | Prix pratiqués, richesse des étals, valeur du butin |
| Government Corruption | Disponibilité des marchés noirs et des contrats douteux |
| Citizen Freedom | Ton des dialogues génériques, ce que les PNJ osent dire |
S'y ajoute la répartition des espèces de la région — le Freelands est à 70 % humain, 11 % elfe d'automne, 8 % elfe d'hiver : les PNJ générés suivent cette distribution, avec les noms du LOT-44.
Les quêtes se composent sur le même principe : un objectif de faction venu du LOT-80, une cible dans la région, une récompense tirée de sa prospérité. Le LOT-16 fournit les drapeaux, ce lot fournit les gabarits qui s'en servent.
Acceptation — deux régions aux statistiques opposées produisent des prix moyens et des stocks mesurablement différents, vérifié par un test ; mille PNJ générés suivent la distribution d'espèces déclarée par leur région ; aucun PNJ ni aucun marchand n'est placé en dur dans le code.
Prérequis : LOT-45, LOT-74.
Détaché du LOT-45 à l'audit : le catalogue des rangs et des contrats est une donnée et un écran, la progression est une mécanique — et elle suppose l'expérience du LOT-74, que le LOT-45 n'exigeait pas.
Monter de rang : ce qui le déclenche (contrats accomplis, niveau atteint), ce que cela change dans l'offre affichée, ce que cela ouvre — accès aux régions de rang supérieur, tarifs, réputation auprès des factions du LOT-80. Et le garde-fou que la fiction impose déjà : « empêcher les aventuriers inexpérimentés de prendre des tâches au-dessus de leurs moyens » — un joueur de niveau 2 doit être averti avant d'entrer dans une région d'Argent, pas seulement puni.
Acceptation — accomplir les contrats d'un rang fait monter au suivant ; monter de rang change l'offre de façon observable ; entrer dans une zone au-dessus de son rang produit un avertissement diégétique, et non un écran de mort.
Prérequis : LOT-32. Prérequis de LOT-47.
Exigences couvertes : EX-RPG-020.
Détaché du LOT-47 à l'audit : c'est de la donnée, extraite et relue, et elle appartient à la filière contenu aux côtés des LOT-36 et LOT-43. Rien ne justifiait qu'elle attende le socle de classe ; l'inverse, si.
Les 31 tables de progression sont extraites pour les seize classes et leurs sous-classes, même celles dont la mécanique viendra bien plus tard. Le §4 le démontre sur la table du barbare : illisible en -layout, où le niveau 5 reçoit « Amélioration de caractéristiques » au lieu d'« Attaque supplémentaire », exacte en -table. C'est le lot où le §4 se paie une seconde fois.
La donnée peut précéder le code — c'est même souhaitable, cela rend le travail restant visible : les quinze lots de classes à venir lisent une table qui existe déjà, au lieu de l'extraire chacun pour soi.
Le LOT-49 contrôle ces tables comme il contrôle les autres catalogues — il ne les précède pas et n'en dépend pas : c'est un filet, pas un maillon.
Acceptation — les 31 tables sont extraites et validées par schéma ; trois d'entre elles sont comparées ligne à ligne au PDF ; le contrôle statistique du LOT-49 ne signale aucune anomalie non acceptée.
Trois numéros retirés. Les LOT-48, LOT-71 et LOT-73 ont été absorbés par fusion et ne seront pas réattribués : un identifiant de lot est stable, y compris quand il cesse de désigner du travail. Le tableau ci-dessous dit où leur contenu est parti.
Numéro retiré Contenu Absorbé par LOT-48 Portraits et illustrations Dissous dans chaque lot de catalogue LOT-71 Repos court et long LOT-70 LOT-73 Agonie et mort LOT-72 Le LOT-31 (lexique bilingue) a lui aussi été retiré par fusion, dans le LOT-30 — mais ce dernier étant livré, la plage de cette page commence désormais au LOT-32, et le numéro LOT-31 n'y manque plus. Son sort est écrit dans l'epic du LOT-30.
Les numéros ne sont pas un ordre. Ils datent de l'écriture de cette page, où la filière contenu a été numérotée après les lots de moteur. Les suivre tels quels construirait le graphe de cartes du LOT-09 avant l'atlas du LOT-37 qui lui donne de vrais nœuds à relier, et la fiche de personnage du LOT-13 avant les espèces qu'elle affiche. Mais les ignorer ne vaut pas mieux : l'ordre retombe alors sur un arbitrage, et un arbitrage se refait à chaque lot — sans jamais donner deux fois la même réponse.
Cette section donne donc une suite unique, et la règle qui la produit.
À chaque pas, on prend, parmi les lots dont tous les prérequis sont faits, celui qui en débloque le plus. À égalité, le plus petit numéro.
« Débloque » se compte : c'est le nombre de lots restants qui dépendent de celui-ci, directement ou en cascade. Le LOT-30 en débloque quarante-neuf sur soixante-neuf, le LOT-10 vingt-cinq, le LOT-49 aucun. « Outillage et contrats ; le plus tôt est le mieux » cesse ainsi d'être un avis éditorial : c'est ce que le graphe dit, et le chiffre est dans le tableau.
Le critère a d'abord été le plus petit numéro. Il donnait une suite déterministe, mais bête : elle plaçait le LOT-10 et le LOT-12 devant le LOT-30, c'est-à-dire deux lots de moteur devant la chaîne qui leur fournira leurs catalogues. Le numéro ne dit rien de l'utilité d'un lot ; il ne sert plus qu'à départager, et il faut un départage — sans lui, deux lots de même portée sortiraient dans un ordre qui changerait d'une exécution à l'autre.
Quatre propriétés en découlent, et ce sont elles qui justifient de préférer une règle à un choix :
Un lien se déclare des deux côtés : soit un lot cite ce qu'il attend, soit un lot amont déclare ce qu'il alimente. Les deux comptent. C'est ce qui place le LOT-27 au rang 20, et non parmi les tout premiers : il ne déclare aucun prérequis — son texte est repris tel quel de son epic d'origine, qui ignorait la filière — alors que cinq lots de contenu déclarent l'alimenter. Le vertical slice se jouerait sinon sur des catalogues vides.
La suite calculée par cette règle est le tableau d'avancement en tête de page (État d'avancement) : c'est la première chose qu'on lit en ouvrant ce document, et c'est là qu'elle sert. Elle n'est pas recopiée ici — deux tableaux décrivant le même ordre divergeraient, et cette page a déjà payé ce prix une fois.
Ce qui reste dans cette section explique pourquoi la suite est celle-là : le regroupement d'intention dont elle est issue, ce que le calcul a révélé, le chemin critique qu'il faut tenir court, et le graphe dont tout est tiré.
Le tableau ci-dessous ne donne pas l'ordre — celui d'en-tête le donne. Il donne la raison de chaque placement, et c'est la seule chose qu'un calcul ne saura jamais produire : un graphe dit qu'un lot en attend un autre, il ne dit pas pourquoi on a voulu ce lien. Les deux tableaux ne se contredisent donc pas, ils ne répondent pas à la même question — et chacun a son garde-fou : le lint vérifie qu'aucun lot de la filière ne manque à celui-ci (règle 6), comme il vérifie que celui d'en-tête est bien la suite calculée (règle 13).
Ces cinquante et un lots ne forment pas une phase qui suivrait le LOT-29 : ils s'entrelacent avec les phases B à E, parce que chacun sert un lot existant qui, sans lui, se construirait sur un catalogue fictif — et un catalogue fictif finit toujours par se figer en valeurs codées en dur, exactement ce que EX-VIS-007 interdit. D'où « filière » plutôt que « phase ».
| Quand | Lots | Pourquoi là |
|---|---|---|
| Démarrables maintenant — le LOT-08 est livré | LOT-30, puis LOT-32 | Outillage et contrats ; le plus tôt est le mieux |
| Démarrables maintenant | LOT-19 | La grille tactique : la bascule du LOT-18 est livrée |
| Avec LOT-09 | LOT-80 | L'atlas du LOT-37 est livré : le graphe de cartes a ses nœuds, il lui manque les entités transverses |
| Avant LOT-13 | LOT-43, puis LOT-36 | Compétences et langues d'abord, car les espèces s'appuient dessus ; puis les 4 classes simplifiées pour le premier combat |
| Avant LOT-14 | LOT-34, puis LOT-49 | Catalogue réel, puis contrôle de ses valeurs |
| Avant LOT-21 / LOT-23 | LOT-33 | Attaques et IA ont besoin de vraies créatures |
| Avant LOT-25 | LOT-35 | Les sorts sont des données avant d'être un système |
| Avant LOT-25 et les lots de classes | LOT-70 | Un petit lot qui en débloque quinze |
| Après LOT-13 | LOT-38, puis LOT-39 | La maquette suppose la fiche ; la plomberie d'assets suit |
| Avec LOT-11 | LOT-69 | Le LOT-11 vise l'édition dans la scène ; ce lot retire l'atelier devenu sans objet |
| Après LOT-11 | LOT-81, puis LOT-40 | Les descripteurs, puis le générateur qui les consomme |
| Avec LOT-21 | LOT-72 | Conditions, agonie et mort appartiennent au combat |
| Avec LOT-20 | LOT-74 | L'expérience se gagne à la fin d'un combat |
| Avant LOT-47 | LOT-84 | Les 31 tables sont de la donnée : elles précèdent le socle qui les lit |
| Après LOT-21 | LOT-47, puis LOT-50 | Le socle de classe, puis le lieu où éprouver ce qu'on lui ajoute |
Quatre points méritent qu'on s'y arrête.
Le LOT-09 n'est pas le prochain lot, alors qu'il en porte le plus petit numéro. À ne lire que sa ligne « Prérequis », il n'attend que des lots livrés. Mais le LOT-37 déclare l'alimenter : le graphe de cartes attend l'atlas des régions, faute de quoi il relierait des nœuds inventés. Il tombe au rang 33. La version précédente de cette page portait l'information — « Avec LOT-09 : LOT-37 » — mais « avec » n'est pas un ordre, et rien n'obligeait à la lire comme tel. C'est le LOT-30 qui sort premier, et pour une raison chiffrée : il débloque quarante-neuf des soixante-neuf lots restants.
Les trois préconditions sont livrées, et la filière contenu remonte en tête. Le LOT-77 a écrit les cinq documents de spécification RPG, rendant réelles les cinq familles EX-* fantômes. Le LOT-78 a préfixé LOT-H-NN les 201 renvois qui désignaient le programme hérité, et posé la règle de lint qui empêche l'ambiguïté de revenir. Le LOT-79 a factorisé les six lecteurs JSON avant que la filière n'en ajoute quinze. Le LOT-30 n'attend donc plus rien, et sort premier — devant tous les lots de moteur que ses catalogues alimentent.
Les lots du bac à sable restent résolument après le LOT-27. Peupler dix régions revient à appliquer cent fois la même recette ; si la recette est mauvaise — rencontres mal dosées, marchands inutiles, quêtes vides — on la découvre cent fois. Le LOT-27 coûte un village et un donjon, et c'est le prix pour ne pas payer cette erreur au centuple. Leur ordre interne compte aussi, et la règle le produit sans qu'on ait à l'imposer : LOT-44 (les noms) avant LOT-41 (le peuplement), sinon on peuple avec des « Villageois 1 » ; LOT-45 (la Guilde) après le LOT-82, parce qu'elle a besoin de quêtes à afficher.
Le volume d'images n'est plus un lot. 6 000 images ne se traitent pas d'un bloc, et rien n'y oblige — le LOT-39 affiche un marqueur pour tout ce qui n'a pas encore d'image, et chaque illustration livrée en remplace un. Ce travail était le LOT-48, « volume long, sans jalon » ; il est désormais réparti dans chaque lot de catalogue, qui livre ses propres illustrations. Un lot sans date de fin est un lot qu'on ne finit pas — et en garder un pendant qu'on écrit cette phrase était le plus visible des angles morts de cette page.
C'est la contrainte que cette feuille de route a le plus de mal à tenir, parce qu'elle se dégrade sans que personne ne décide rien : chaque lot qu'on déclare « avant le LOT-27 » repousse d'autant le seul jalon qui prouve que le jeu est un jeu.
L'audit a trouvé le LOT-69 placé « avec LOT-50, avant le LOT-27 ». Comme le LOT-50 exige le socle de classe, cela plaçait LOT-84 → LOT-47 → LOT-50 → LOT-69 — les seize classes, le Colisée et le mode édition — devant le slice. Vingt-six des lots de la filière se retrouvaient ainsi en amont d'un jalon censé arriver tôt. La correction est au LOT-69, réduit à une suppression.
Le chemin critique restant compte huit lots, et c'est la plus longue chaîne de prérequis qui mène au slice :
LOT-30 → LOT-32 → LOT-43 → LOT-36 → LOT-13 → LOT-38 → LOT-39 → LOT-27
Tout le reste — classes, Colisée, peuplement, voyage, guilde — vient après. La règle à tenir tient en une phrase : un lot n'entre dans ce chemin que si le slice ne peut pas se jouer sans lui.
Ce chemin s'est allongé de trois lots quand le lien LOT-38 / LOT-39 a été remis à l'endroit. Il passait auparavant par les seuls catalogues — cinq lots, LOT-30 → LOT-32 → LOT-43 → LOT-36 → LOT-27 — parce que le LOT-39 était déclaré avant le LOT-38. Dans le bon sens, le slice attend les clés d'assets, qui attendent la maquette de fiche, qui attend la fiche : la fiche de personnage et sa maquette sont sur le chemin critique, ce qu'aucune version de cette page n'avait dit.
C'est la conséquence à surveiller, et la seule question qui vaille est : le slice a-t-il vraiment besoin du LOT-39 ? Oui — c'est le LOT-39 qui produit le marqueur généré pour toute clé sans image, donc ce qui permet au jeu de tourner complet avant qu'une seule illustration ne soit découpée. Sans lui, le slice n'aurait rien à afficher pour ses créatures. Le chemin est long parce qu'il est réel, pas parce qu'il a dérivé.
Les liens ci-dessous sont ceux que déclarent les lignes « Prérequis » de la section 5. Ils sont vérifiés en CI par scripts/lint_lots.py, qui refuse un cycle, un lien déclaré d'un seul côté, un lot absent du tableau d'ordre ci-dessus ou une section de lot sans ancre Doxygen.
Le graphe ci-dessous est donné en source Graphviz, et non en diagramme rendu : la chaîne Doxygen du projet tourne sans HAVE_DOT, et ajouter Graphviz au runner pour une seule illustration coûterait plus que de coller ces vingt lignes dans un visualiseur.
Ce tableau est généré depuis les lignes « Prérequis » ci-dessus et vérifié en CI par scripts/lint_lots.py : s'il diverge du texte, c'est le lint qui échoue, pas le lecteur qui s'en aperçoit trois lots plus tard. La colonne « Alimente » est l'inverse calculé de la colonne « Prérequis », augmentée des dépendances que les lots livrés et absorbés ne peuvent pas déclarer eux-mêmes.
| Lot | Objet | Prérequis | Alimente |
|---|---|---|---|
| LOT-35 | Sorts et états | LOT-32 | LOT-25, LOT-72 |
| LOT-40 | Générateur de terrain | LOT-11, LOT-81 | LOT-41 |
| LOT-41 | Peuplement : rencontres et créatures | LOT-27, LOT-33, LOT-40, LOT-44, LOT-46 | LOT-75, LOT-82 |
| LOT-42 | Voyage et carte du monde | LOT-09, LOT-17, LOT-68, LOT-70, LOT-82 | LOT-75 |
| LOT-44 | Noms, tables aléatoires et contenu d'ambiance | LOT-36, LOT-37 | LOT-41, LOT-82 |
| LOT-45 | Guilde des Aventuriers : rangs et contrats | LOT-16, LOT-26, LOT-68, LOT-82 | LOT-83 |
| LOT-46 | Créatures de Tanares | LOT-30, LOT-33 | LOT-41 |
| LOT-47 | Socle de classe, et le guerrier comme preuve | LOT-36, LOT-43, LOT-84 | LOT-50, LOT-51 |
| LOT-49 | Contrôle de cohérence du contenu | LOT-33, LOT-34 | — |
| LOT-50 | Le Colisée : bac à sable de combat | LOT-19, LOT-20, LOT-21, LOT-47 | LOT-51, LOT-65 |
| LOT-51 | une classe par lot | LOT-47, LOT-50, LOT-70 | — |
| LOT-69 | Retrait de l'atelier pixel art | LOT-11, LOT-66 | — |
| LOT-70 | Horloge de partie et cycle jour/nuit | LOT-13 | LOT-25, LOT-42, LOT-51, LOT-65, LOT-75 |
| LOT-72 | Conditions, agonie et mort | LOT-12, LOT-21, LOT-35 | — |
| LOT-74 | Expérience et progression | LOT-13, LOT-16, LOT-20 | LOT-83 |
| LOT-75 | Campement et repos dans le monde | LOT-41, LOT-42, LOT-70 | — |
| LOT-80 | Factions, panthéon et organisations | LOT-37 | LOT-16, LOT-82 |
| LOT-81 | Descripteurs de terrain des dix régions | LOT-37 | LOT-40 |
| LOT-82 | Peuplement civil : PNJ, marchands et quêtes | LOT-15, LOT-26, LOT-34, LOT-41, LOT-44, LOT-80 | LOT-42, LOT-45 |
| LOT-83 | Boucle de progression de la Guilde | LOT-45, LOT-74 | — |
| LOT-84 | Les 31 tables de progression de classe | LOT-32 | LOT-47 |
(Le sort du *Manuel des Monstres est tranché : voir ci-dessus.)*
Cette page a été confrontée à l'état réel du code et des spécifications. Cinq constats la dépassent et conditionnent son exécution.
Le dépôt compte 13 familles réelles pour 269 exigences (EX-ARCH, EX-BUILD, EX-CTRL, EX-DEC, EX-EDIT, EX-EXP, EX-GP, EX-IA, EX-IHM, EX-LVL, EX-NFR, EX-REN, EX-VIS). Cinq autres sont référencées par une vingtaine d'epics et n'existent pas : EX-DND-*, EX-RPG-*, EX-INV-*, EX-CBT-* et EX-CNT-*. Les documents censés les porter — regles-dnd.md, combat.md, rpg.md, contenu.md — sont absents.
Le garde-fou, lui, est réparé. Il ne l'était pas : scripts/lint_exigences.py ne filtrait que sur EX-[A-Z]+-[0-9]+, si bien qu'un EX-DND-* n'était ni une déclaration ni une référence, et que la CI passait au vert sur cinq familles inexistantes. Une seconde expression, FAMILY_REF_RE = re.compile(r'EX-([A-Z]+)-\*'), capte désormais les références de famille entière et le lint échoue sur les cinq.
Cet échec était voulu, et c'était le seul mécanisme empêchant la dette de grossir en silence. Il est éteint : le LOT-77 a écrit regles-dnd.md, rpg.md, combat.md, inventaire.md et contenu.md, soit 69 exigences qui portent les cinq familles, et a posé la rubrique « Exigences couvertes » sur les 25 lots qui les implémentent. Le lint compte désormais 339 exigences déclarées et 339 référencées, sans aucune entrée ajoutée à la liste des exceptions.
Écrire la moitié RPG de la spécification était le vrai chantier de fond, celui dont dépendait tout le reste — d'où un lot dédié plutôt qu'une ligne dans « à trancher ».
Le repos était invoqué par six lots et livré par aucun. Le temps de jeu et le campement n'existaient nulle part. Les conditions, l'agonie et l'expérience étaient mentionnées dans un périmètre sans être ni spécifiées ni testées — et aucune source d'expérience n'était définie, alors que trois lots en consomment.
D'où les LOT-70 à LOT-75. Les rattacher au périmètre de lots existants aurait reproduit exactement la cause du trou.
Les décisions prises rendent mort un volume de code supérieur à ce que les cinq lots suivants ajouteront :
| Élément | Poids | Retiré par |
|---|---|---|
| Atelier de dessin pixel art (Source/HMI/Editor/Pixel*) | ~2 975 lignes | LOT-69 |
| Widgets pixel art (Source/HMI/Interface/Pixel*) | ~640 lignes | LOT-66 |
| Écrans de plateforme (LevelSelectScreen, LevelCompleteScreen) | 622 lignes | LOT-67 |
| Maquettes SelectionNiveau, FinDeNiveau + clés level.* | — | LOT-67 |
Soit plus de 4 200 lignes. Chaque suppression est portée par le lot qui la rend possible, jamais reportée à un lot de ménage : du code mort qu'on garde « pour plus tard » se remet à coûter dès la première refactorisation qui le traverse.
À décider à part : Documentation/Heritage/ pèse 520 fichiers et 3,7 Mo — l'archive du programme de lots d'un autre projet, hors Doxygen. L'historique git la conserve de toute façon.
Ce qui est sain : 927 tests verts sur 129 fichiers, une CI durcie (/W4 /WX, clang-tidy et Doxygen épinglés), un cœur déjà purgé de 63 000 lignes au LOT-01 et déjà réorienté vers le RPG top-down par les LOT-06, LOT-07 et LOT-08. Le format v3 porte déjà les entités (MapEntity), et GridDistanceField — un parcours en largeur sur la grille — a été explicitement sauvé de la purge comme « le calcul de portée de déplacement du futur combat tactique ».
Ce qui manque avant d'ajouter des dizaines de catalogues :
Aucun test paramétré dans tout Source/Test/ — ni TEST_P, ni parcours de dossier de fixtures. Créé au LOT-79, avec Source/Test/Fixtures/Json/.
Ces deux manques étaient attribués au LOT-32 par le tableau du §10, mais absents de son périmètre, qui ne livre que des schémas, un script Python et un test d'énumérations : personne ne portait le travail C++. C'est l'audit qui l'a trouvé.
Le programme hérité allait jusqu'à LOT-74. En atteignant LOT-84, la filière recouvre entièrement cette plage. Or les spécifications citent encore des lots hérités dans le corps de leurs exigences — gameplay.md (« Complété en LOT-65 »), niveaux.md (« LOT-25, étendu en LOT-65 »), editeur-niveaux.md (« LOT-54 introduit un éditeur de texture »), les titres de sections d'interface-ihm.md, et jusqu'à architecture.md (« Concrétisé en LOT-33 »).
Le décompte a été fait, et il corrige l'estimation initiale. Les spécifications portent 222 renvois LOT-NN, dont 208 ambigus — tout numéro au-delà de LOT-07, puisque seuls les sept premiers désignent à coup sûr un lot livré de ce dépôt. Ils se répartissent sur douze fichiers, et non quatre :
| Fichier | Renvois ambigus |
|---|---|
| editeur-niveaux.md | 42 |
| rendu-technique.md | 34 |
| interface-ihm.md | 26 |
| decors.md | 21 |
| gameplay.md | 20 |
| exigences-non-fonctionnelles.md | 17 |
| niveaux.md | 15 |
| controles.md | 13 |
| architecture.md | 9 |
| exploration.md | 6 |
| conventions.md | 4 |
| vision.md | 1 |
Ces renvois étaient ambigus sans être cassés : ni le lint ni Doxygen ne les signalaient. Et ce n'était pas « une recherche-remplacement dans six specs » comme l'estimait le §10 : chaque référence devait être classée — lot hérité ou lot courant — avant d'être préfixée ou laissée telle quelle. D'où un lot à part entière.
C'est fait : le LOT-78 a préfixé 201 renvois en LOT-H-NN dans dix fichiers, laissé les 49 qui désignent de vrais lots courants, écrit la convention en tête de specifications.md, et ajouté à scripts/lint_lots.py la règle 12, qui refuse tout LOT-NN de spécification ne désignant pas un lot existant de ce programme. La classification s'est faite par couple (fichier, numéro) et non par fichier : rendu-technique.md cite le LOT-07 courant et le LOT-H-08 hérité à onze lignes d'écart.
Huit lots sont livrés sur les quatre-vingts que compte le programme. Presque tout ce que cette filière modifie n'existe pas encore : ni la fiche de personnage, ni l'inventaire, ni le combat, ni l'éditeur multi-couches, ni le graphe de cartes. C'est un avantage considérable et temporaire — chaque décision prise maintenant coûte une écriture ; la même, prise dans dix lots, coûte une réécriture plus la migration de ce qui s'est construit dessus.
Huit choses méritent donc d'être décidées avant, et non après.
| À anticiper | Coût aujourd'hui | Coût si on attend |
|---|---|---|
| Retirer les exigences de plateforme (EX-GP-030/031/032, EX-LVL-010→015, EX-IHM-003/004/005) — porté par le LOT-67 | Une passe de rédaction : elles ne décrivent rien de construit pour le RPG | Les LOT-09→17 se bâtissent dessus, puis il faut les défaire |
| La charte visuelle (LOT-66) | Seuls les écrans hérités existent | Chaque écran RPG livré entre-temps est à refaire |
| Viser directement l'édition dans la scène au LOT-11 au lieu de la refondre au LOT-69 | Le LOT-11 n'est pas commencé : il suffit qu'il vise cette cible | Construire l'éditeur multi-couches, puis le remplacer |
| Six lecteurs factorisés, et un échec qui nomme le fichier et la ligne | Vingt et plus, chacun avec sa validation manuscrite | |
| Capacité créée sur une suite encore petite | À créer quand même, mais avec des dizaines de tests déjà écrits autrement | |
| L'horloge et le repos (LOT-70) | Le LOT-13 n'existe pas : la fiche peut naître en déclarant ses ressources et leur cadence | Rétro-adapter la fiche, puis les quinze classes |
| Les champs "source" et "statut" au schéma (LOT-32) | Une ligne, avant le premier catalogue | Une migration de tous les catalogues livrés |
| 201 renvois préfixés LOT-H-NN dans dix specs, plus la règle de lint qui l'empêche de revenir | Ambiguïté silencieuse, invisible au lint comme à Doxygen |
Deux d'entre elles sont plus que des économies.
Le LOT-11 ne doit pas être construit puis refondu. Le LOT-69 était écrit comme une refonte parce qu'il a été conçu après ; mais l'éditeur multi-couches n'étant pas commencé, la bonne décision est que le LOT-11 vise d'emblée l'édition dans la scène. Le LOT-69 a donc été réécrit en conséquence : il ne reste que le retrait de l'atelier de dessin, qui est une suppression, pas une réécriture — et il n'a plus besoin ni du Colisée ni du socle de classe pour cela.
MapEntity existe déjà et n'alimente rien. Le format v3 porte { type, position, properties } avec un contrat explicite — « Core ne connaît aucune sémantique de type » — mais aucun consommateur hors des tests : ni le rendu, ni l'ECS, ni l'éditeur. Le LOT-10 (entités et interaction) est le premier à pouvoir s'y brancher, et il doit le faire plutôt que d'inventer un second conteneur d'entités à côté.
Ces vingt et un lots avaient chacun leur dossier LOT-NN-nom/. Ils sont absorbés ici pour que la feuille de route ait une seule source de vérité : deux documents décrivant le même programme divergent, et l'audit a montré qu'ils avaient déjà commencé à le faire.
Le LOT-08 a été livré entre-temps. Il n'est donc plus ici : comme les sept lots qui le précèdent, il garde son dossier LOT-08-tuiles-rpg/ et son epic.md, qui porte ce que sa réalisation a tranché — de l'histoire, pas du programme.
Leurs ancres Doxygen sont conservées ({#lot-09}, {#lot-13}…), si bien que tous les renvois @ref lot-NN des spécifications continuent de résoudre. Seuls les @subpage de lots.md disparaissent, faute de pages séparées.
Contenu d'origine, corrections signalées. Le texte de chaque epic est repris tel quel. Là où l'audit l'a contredit — l'éditeur du LOT-11, la mort du LOT-21, le repos du LOT-25 — la correction figure dans les sections 5, 9 et 10 ci-dessus, qui font foi.
Remplacer la séquence linéaire de tableaux héritée par un monde de cartes connectées, où chaque carte a des sorties nommées vers d'autres cartes, et où l'on peut revenir sur ses pas.
core::LevelSequence est une liste ordonnée : tableau 1, puis 2, puis 3. C'est la structure d'un jeu de niveaux discrets, pas d'un monde. Un RPG a besoin d'un graphe : un village ouvre sur une forêt et sur une auberge, la forêt ramène au village, le donjon a trois entrées.
LevelSequence disparaît ou devient un cas dégénéré du graphe — à trancher à l'implémentation.
EX-EXP-* (portails, points d'arrivée nommés), EX-LVL-* (validation du graphe).
Rendre l'éditeur hérité capable d'éditer les trois couches et de poser des entités avec leurs propriétés — c'est-à-dire de produire le contenu du RPG sans écrire de JSON à la main.
L'éditeur du dépôt d'origine est un poste de travail complet, et il est entièrement conservé : peinture à la souris, outils rectangle et sélection, liaison de mécanismes, undo/redo, essai immédiat, bibliothèque d'assets à vignettes avec rechargement à chaud et détection des références avant suppression, atelier pixel art intégré. Ce lot retarge, il ne reconstruit pas.
Le LOT-01 a retiré l'outil « Parcours » et le panneau « Propriétés », qui ne pilotaient que des réglages de plateforme.
Le combat se déroulant sur la carte d'exploration (décision de cadrage, cf. Documentation/Specification/vision.md), toute carte doit être un terrain tactique valide. L'éditeur doit avertir quand une zone est trop étroite ou trop encombrée pour y poser une rencontre. Découvrir la contrainte au LOT-18, une fois vingt cartes dessinées, coûterait leur reprise.
EX-EDIT-*.
Statut : à faire. Prérequis : LOT-05 (mode « monde gelé »), LOT-10 (entités et interaction), LOT-12 (jets de compétence en dialogue).
Parler à un PNJ via un arbre de dialogue scripté, avec choix, conditions et jets de compétence.
La séparation runner pur / widget. Un dialogue doit être jouable en test headless, nœud par nœud, sans fenêtre : c'est ce qui permettra de vérifier des arbres de vingt nœuds sans les cliquer à la main. Le widget ne fait qu'afficher ce que le runner décide.
EX-RPG-* (dialogue, choix, conditions, actions), EX-IHM-*.
Statut : à faire. Prérequis : LOT-15 (les dialogues déclenchent et font avancer les quêtes).
Suivre l'avancement du joueur par des drapeaux persistants, et en donner une lecture dans un journal de quêtes.
Les drapeaux de monde et les quêtes sont deux niveaux du même mécanisme : une quête lit des drapeaux pour décider de son avancement, elle n'a pas d'état propre au-delà de son étape courante. Cette séparation évite le piège classique où l'état du monde existe en double — une fois dans les entités, une fois dans les quêtes — et diverge.
EX-RPG-*.
Statut : à faire. Prérequis : LOT-09, LOT-10, LOT-13, LOT-16.
Remplacer la progression héritée — qui ne retenait qu'un tableau atteint — par un état de partie complet et versionné.
hmi::Progression stocke un identifiant de séquence, un nom de tableau courant et un ensemble de tableaux terminés. C'était suffisant pour un jeu de niveaux discrets ; c'est sans rapport avec un monde persistant où le joueur a une position, un inventaire, des quêtes en cours et un monde qui a gardé la trace de ses actes.
Source/Core/Rpg/SaveGame.{h,cpp} : JSON versionné, portant
hmi::Progression disparaît ou devient un cas dégénéré.
Mêmes règles que le format de carte, pour les mêmes raisons : versionné, tolérant aux champs inconnus, migration ascendante. Une sauvegarde est la donnée que le joueur ne peut pas reconstruire — un format qui casse lui fait perdre sa partie.
EX-RPG-* (sauvegarde, chargement, versionnement, tolérance).
Statut : à faire. Prérequis : LOT-18. Exigences couvertes : EX-CBT-020, EX-DND-051.
Poser la grille de combat, l'occupation des cases, et le calcul du déplacement par budget.
core::GridDistanceField (Source/Core/World/GridDistanceField.h) : champ de distances de plus court chemin sur la grille, BFS 4-voisins multi-source, lectures O(1), avec sentinelle d'inatteignabilité. Il vient du solveur d'IA du dépôt d'origine ; le LOT-01 l'a délibérément sauvé de la purge et déplacé dans Core/World/ pour ce lot précis.
C'est exactement le calcul « quelles cases puis-je atteindre avec ce budget de déplacement ».
Deux chemins de même coût existent presque toujours sur une grille. Si le départage dépend de l'ordre d'itération d'un conteneur non ordonné, l'IA (LOT-23) devient irreproductible et aucun test de combat ne tient. Le départage doit être une règle explicite (par exemple : plus petit indice de case), pas un hasard d'implémentation.
EX-CBT-* (grille, portée de déplacement, chemin déterministe).
Statut : à faire. Prérequis : LOT-12 (jet d'initiative), LOT-19. Exigences couvertes : EX-CBT-010, EX-CBT-011, EX-CBT-012.
Ordonnancer les combattants par initiative et structurer le tour : mouvement, action, action bonus, réaction.
Un combat se termine de trois façons, et les trois doivent être couvertes :
Une machine à états qui n'en couvre que deux laisse un combat qui ne finit jamais — le pire des défauts, parce qu'il bloque le joueur sans message d'erreur.
EX-CBT-* (initiative, structure du tour, conditions de fin).
Statut : à faire. Prérequis : LOT-13, LOT-14, LOT-20. Exigences couvertes : EX-CBT-030, EX-CBT-031, EX-CBT-032.
Résoudre une attaque au d20 contre la classe d'armure, appliquer les dégâts, gérer critiques, inconscience et mort.
Chaque jet doit être auditable : jet brut, modificateurs détaillés, cible, total, résultat. « Tu as raté » n'est pas une information ; « 7 + 3 = 10 contre CA 15 : raté » en est une. C'est ce qui permet au joueur de comprendre le système, et au développeur de déboguer l'équilibrage sans attacher un débogueur.
EX-DND-* (résolution chiffrée) et EX-CBT-* (application en combat).
Statut : à faire. Prérequis : LOT-19. Exigences couvertes : EX-CBT-021, EX-CBT-022.
Rendre la géométrie tactique signifiante : portée d'arme, ligne de vue bloquée, couverture, gabarits d'effet de zone.
C'est ce lot qui fait qu'un combat se joue avec le terrain plutôt que sur une grille vide.
La ligne de vue doit être symétrique : A voit B si et seulement si B voit A. C'est le défaut classique des tracés sur grille — un algorithme qui part de A et s'arrête au premier obstacle ne donne pas le même résultat en partant de B, et le joueur découvre qu'il peut tirer sur un ennemi qui ne peut pas riposter (ou l'inverse, plus rageant encore).
À vérifier exhaustivement sur des grilles générées, pas sur trois cas choisis à la main.
EX-CBT-* (portée, ligne de vue, couverture, gabarits).
Statut : à faire. Prérequis : LOT-20, LOT-21, LOT-22. Exigences couvertes : EX-CBT-050.
Donner aux ennemis un comportement de combat crédible, déterministe et testable sans GPU.
Heuristiques pondérées, pas de réseau de neurones.
Le dépôt d'origine embarquait 12 000 lignes de solveur RL (tenseurs, autodiff, réseaux, optimiseurs, quatre familles d'algorithmes), retirées au LOT-01. La tentation serait de les ressusciter ici : c'est le seul endroit du programme où elles auraient pu resservir.
Il ne faut pas. Une IA tactique par heuristiques est plus prévisible, plus déboguable et bien moins coûteuse ; surtout, le déterminisme est ici un critère d'acceptation, pas une préférence — sans lui, aucun test de combat ne tient. Un agent entraîné rendrait chaque régression irreproductible.
EX-CBT-* (choix de cible, de position et d'action).
Rendre le combat lisible et jouable : bandeau d'initiative, portées surlignées, curseur de ciblage, prévisualisations, journal.
C'est le lot qui transforme une machine à états correcte en un combat qu'on a envie de jouer.
Un combat tactique doit se jouer entièrement au clavier et entièrement à la manette, pas seulement à la souris. Le projet hérite d'un système de remappage complet (clavier, manette XInput) et d'une navigation à la manette dans tous les écrans : il serait incohérent que le combat, cœur du jeu, soit le seul écran à exiger une souris.
EX-IHM-*, EX-REN-*.
Ajouter les sorts — emplacements, incantation, concentration — et les capacités propres aux classes.
C'est le lot où la tentation d'écrire des règles en dur est la plus forte, parce que chaque sort a sa particularité. Y céder rend l'équilibrage impossible : un sort qui se règle en recompilant ne se règle pas. Un sort est une donnée ; le C++ ne porte que les mécanismes qu'elle compose (dégâts de zone, jet de sauvegarde, condition appliquée, durée).
EX-DND-*.
Statut : à faire. Prérequis : LOT-14, LOT-15. Exigences couvertes : EX-INV-040.
Boucler la boucle économique : gagner du butin, le vendre, acheter mieux.
Un butin tiré au moment de l'ouverture, avec une graine liée à l'instant, se re-tire différemment à chaque chargement de sauvegarde. La graine doit dériver de l'identité du coffre et de l'état de la partie, pas de l'horloge — deriveSeed(baseSeed, step, entityId) existe pour cela.
EX-RPG-*, EX-INV-*.
Statut : à faire. Prérequis : phases B, C et D complètes.
Produire le contenu jouable qui démontre la boucle entière : « un personnage explore une carte top-down, parle à un PNJ, déclenche une rencontre, gagne un combat tactique au d20 ».
Tout se produit dans l'éditeur (LOT-11), pas en écrivant du JSON à la main : c'est le test grandeur nature de l'outil, et la preuve qu'un non-développeur pourrait le faire (EX-VIS-006).
scripts/check_world_graph.py remplace le check_demo_sequence.py hérité, retiré au LOT-01. Il valide, en CI :
EX-RPG-*, EX-LVL-*, et concrétisation de EX-VIS-001 à EX-VIS-005.
Statut : à faire. Prérequis : LOT-27.
Donner au jeu son identité sonore et ses retours d'impact, puis clore le programme du vertical slice par une version publiable.
hmi::AudioEngine et SoundCatalog sont hérités et fonctionnels — ce lot les alimente, il ne les réécrit pas :
La règle héritée tient : le jeu reste pleinement jouable en silence, sans périphérique audio, et le volume est réglable et persisté.
ParticleRenderer et la secousse d'écran sont hérités : particules à l'impact, secousse sur critique uniquement (une secousse à chaque coup rendrait un combat tour par tour épuisant).
Passe de réglage sur les données du slice : PV, CA, dégâts, seuils d'expérience, prix. Tout est en JSON depuis la phase C — aucune recompilation.
La documentation de chaque domaine est mise à jour par le lot qui le livre, pas ici. Ce lot ne fait que la cohérence d'ensemble et la régénération. Un lot fourre-tout de fin de programme n'est jamais fini : c'est le risque à éviter.
EX-REN-* audio et effets, EX-NFR-* (budget de rendu mesuré, patron hérité).
Statut : à faire. Prérequis : LOT-27. Vient après le vertical slice, délibérément.
Passer d'un héros seul à un groupe de quatre — recrutement, compagnons suiveurs en exploration, combat tactique à quatre alliés.
C'est la décision de cadrage n° 4, et tout le programme la prépare : rien ne doit supposer l'unicité du personnage. Concrètement, au moment d'aborder ce lot, ces précautions doivent déjà être en place :
Si l'un de ces points a dérivé en chemin, ce lot redevient une refonte — c'est le signal d'alarme à surveiller pendant les phases C et D.
Le combat à quatre alliés multiplie les tours et allonge la boucle : l'IHM du LOT-24 doit rester lisible avec huit combattants au bandeau d'initiative. C'est le seul endroit où ce lot peut exiger un vrai travail d'interface plutôt qu'un simple ajout.
EX-RPG-*, EX-CBT-*, EX-IHM-*.