ATOUM
Où en est le projet
ATOUM est un jeu de plateau qui se joue dans un navigateur, seul ou à plusieurs, en local ou en ligne. Il n'a besoin d'aucune installation : une page web, et rien d'autre.
| Salles | 46 | 14 formes de couloir, tirées au hasard |
| Personnages | 6 | chacun avec sa capacité et son second pouvoir |
| Cartes | 19 | 80 exemplaires — 13 bonus, 6 pièges |
| Modules | 26 | aucune bibliothèque extérieure |
| Bancs d'essai | 30 | joués avant chaque livraison |
| Points de règle | 155 | éprouvés sur 200 tirages chacun |
| Points signalés | 315 | défauts corrigés qui ne peuvent plus revenir |
| Pages | 18 | le jeu, ses réglages, sa documentation |
Ces chiffres sont recomptés à chaque livraison. S'ils divergent de la réalité, un banc rougit.
Un jeu de plateau, sa règle, et le projet qui le fait tourner
ATOUM est un jeu d'exploration où l'on fouille un tombeau qui se referme. Ce document présente d'abord le jeu et sa règle, puis le projet — son architecture, ses partis pris, et ce qu'il faut savoir pour le reprendre après une longue absence.
ILe jeu
De un à six explorateurs entrent dans un tombeau. Ils la découvrent salle par salle — le plateau n'existe pas au départ, il se construit sous leurs pas. Quelque part dans la besace se trouve la salle du trésor ; personne ne sait quand elle sortira.
Trois phases s'enchaînent, et chacune change complètement la nature du jeu.
1 · Exploration
On pose des salles, on fouille, on affronte les momies. Coopératif en apparence — mais chacun accumule des cartes pour la suite.
2 · Les gardiennes
Le trésor découvert, tout le monde s'y regroupe. Un combat unique contre les gardiennes, où chacun décide ce qu'il engage.
3 · La fuite
Un mur avance et referme le tombeau. Un seul sortira avec le trésor — et l'on peut se l'arracher.
Le basculement de la première à la troisième phase est le cœur du jeu : on explore ensemble, on sort seul. Rien n'oblige à trahir, et tout y pousse au dernier moment.
IILa règle, en bref
Un tour
À son tour, un joueur dispose de plusieurs actions — le
nombre dépend de son personnage. Une action permet de se déplacer d'un
certain nombre de cases, de poser une salle, de fouiller, ou d'attaquer une
momie. Les points de déplacement non employés ne se reportent pas, mais
plusieurs actions peuvent se cumuler dans un même mouvement : c'est ce
qu'indiquent les mentions 2A et 3A sur les cases
lointaines.
Poser une salle
On pose depuis le bord d'une salle déjà en place. La tuile arrive de la besace ; on choisit son orientation et le côté — certaines ont une face ensablée. Qui ne pose pas laisse la tuile au suivant : une salle chargée de symboles est un cadeau qu'on refile volontiers. Seul l'Aristocrate peut en mettre une de côté pour son propre compte.
Les jonctions
Entre deux salles, une demi-case appartient aux deux. Qui s'y tient frappe des deux côtés, y reçoit de l'aide des deux côtés, et n'est touché par aucun piège de salle — sauf le sable, qui peut n'occuper qu'une moitié : aller vers le côté ensablé coûte le déplacement réduit, aller de l'autre côté garde le déplacement plein.
Les momies
Elles apparaissent avec les salles et gardent les passages. Les attaquer demande une force supérieure à la leur ; on peut s'y mettre à plusieurs si l'on partage la salle. Une momie battue est écartée, une momie qui résiste reste en place.
La fuite
Le porteur du trésor doit ressortir — par l'entrée ou par le puits. Les autres peuvent le lui arracher en le rejoignant : le voleur file alors aussitôt dans une salle voisine, sans que cela lui coûte d'action. Pendant cette phase, aucune momie ne se pose sur une sortie : boucher une issue serait une impasse, pas une difficulté.
La liste complète des écarts avec la règle papier se
trouve dans maj.html : 240 points, chacun avec sa raison. C'est
le document à suivre pour mettre la règle imprimée à jour.
IIILe tombeau se réveille
C'est la mécanique la plus récente, et celle qui donne son axe à la phase d'exploration. Le tombeau n'a pas de pioche : elle se réveille quand les joueurs la dérangent.
Chaque salle porte de zéro à quatre symboles, un par coin. Poser une salle fait monter d'un cran chaque échelle correspondante, sur un mini-plateau posé à côté du labyrinthe. L'échelle qui atteint son seuil frappe aussitôt, puis repart de zéro — et les symboles restants de la même tuile continuent de la faire monter.
| Échelle | Seuil | Ce qu'elle fait en débordant |
|---|---|---|
| Malédiction | 4 | Des momies surgissent autour de chaque joueur, sur les cases libres les plus proches |
| Effondrement | 4 | Chaque salle occupée s'effondre ; ses occupants fuient vers la plus proche |
| Sable | 4 | Chaque salle occupée est envahie ; si elle l'est déjà, le sable déborde vers les salles qui communiquent avec elle |
| Serpents | 4 | Apophis sème le chaos : en commençant par celui qui vient de poser la tuile, chaque joueur prend la place du suivant. Les protégés des animaux restent en place |
Pourquoi cela fonctionne
Chaque effet vise les salles occupées, jamais les salles vides. La position des joueurs décide donc de sa portée. Serrés, ils encaissent peu. Dispersés, tout le plateau tremble en même temps. Il n'y a pas de bonne position, seulement un risque à choisir — et l'entraide au combat pousse à se serrer quand le tombeau pousse à s'éparpiller.
La malédiction n'a pas de force chiffrée : c'est la place disponible qui fixe la sanction. Une règle en moins, une conséquence en plus. Le sable déborde à 2 et non à 4 parce qu'il est le seul effet vraiment contrable — les pelles existent dans la fouille, et le Pilleur l'ignore.
La répartition des symboles
| Symboles portés | Tuiles | Total |
|---|---|---|
| aucun | 22 | 0 |
| un | 8 | 8 |
| deux | 7 | 14 |
| trois | 4 | 12 |
| quatre | 3 | 12 |
| 46 salles | 46 |
La moitié des salles est vierge : le suspense se déplace du tirage vers le dévoilement de la salle. Une chance sur deux qu'elle soit inoffensive.
Ce qui reste à vérifier à la table. Les calculs donnent environ huit réveils par partie, en supposant vingt-deux salles posées — la position médiane du trésor dans la besace. Cette estimation est théorique : le joueur automatique des bancs d'essai ne sait pas explorer assez bien pour la confirmer. Améliorer ce robot est le premier chantier utile de la suite.
IVL'architecture
Le projet est entièrement statique côté jeu : ni cadre, ni
compilation, ni dépendance. On ouvre index.html et l'on joue.
Le jeu en ligne ajoute un unique fichier PHP, sans base de données.
Les trois règles qui tiennent tout
-
Un seul module modifie l'état.
moteur.jsdétientP; tous les autres le lisent. Quand une règle se comporte mal, on sait où chercher — et il n'existe pas deux endroits qui décident de la même chose. -
Rien n'est écrit en dur. Valeurs, textes, géométrie,
équilibrage vivent dans
donnees/. Changer un seuil ne demande jamais de toucher au JavaScript. - Tout ce qui a cassé une fois est gardé par un banc. 30 bancs d'essai, près de trois cents acquis d'interface : chaque faute corrigée laisse derrière elle un contrôle qui l'empêche de revenir.
L'arborescence
index.html le jeu
maj.html les 144 points de règle à porter sur le papier
projet.html ce document
stats.html statistiques de toutes les parties
editeur.html éditeur de tuiles et de cartes
verif.html liste de vérification qui se coche en jouant
journal.html le fil de la partie en cours et de la précédente
js/ 26 modules, chargés dans l'ordre par amorce.js
css/style.css toute la présentation
donnees/*.json plateau, tuiles, cartes, personnages, règles, textes
img/ pierres, illustrations, portraits, icônes
api/ le jeu en ligne : un PHP, un dossier de parties
banc/ les garde-fous — ne se téléversent pas
sw.js service worker : installation et repli hors ligne
manifest.webmanifest pour l'ajout à l'écran d'accueil
VLes modules
| Module | Lignes | Rôle |
|---|---|---|
amorce.js | 68 | Charge les données puis les modules, dans l'ordre |
donnees.js | 89 | Lit les JSON et publie les constantes |
partie.js | 224 | L'état P, la géométrie du labyrinthe, le journal |
moteur.js | 2 700 | Toutes les règles. Le seul module qui modifie P |
cuisson.js | 157 | Compose les salles en images dans le navigateur |
tuiles.js | 56 | Les salles cuites en images : à une définition, quel fichier |
plateau.js | 1229 | Dessine le labyrinthe en SVG, gère pincement et animations |
app.js | 755 | Le câblage : clics, menu, reprise de partie, historique |
carte-perso.js | 318 | La carte du joueur actif : actions, inventaire |
modales.js | 467 | Seuil, salon, lancement, fin de partie, relecture |
gardiennes.js | 158 | L'écran de la phase 2 |
apercu.js | 203 | Vignettes : la tuile qu'on pose, la carte qu'on tire |
panneau.js | 90 | La colonne de droite |
historique.js | 100 | Une photo par coup, pour revenir en arrière |
schema.js | 154 | Plateau miniature, pour montrer une situation |
reseau.js | 342 | Chiffrement, session, dialogue avec le serveur |
salon.js | 490 | Le jeu en ligne de bout en bout : salon, tours, relecture |
veille.js | 189 | Être prévenu de son tour, application fermée |
verif.js | 186 | Coche la liste de vérification pendant qu'on joue |
VILes données
Tout se règle ici, sans toucher au code.
| Fichier | Ce qu'il décide |
|---|---|
plateau.json | Les formes de couloir, case par case |
tuiles.json | Les 46 salles : type, couloir, momies, symboles de réveil |
cartes.json | Les 78 cartes de fouille : effets, nombre d'exemplaires |
personnages.json | Les six explorateurs, leurs chiffres et leurs pouvoirs |
regles.json | Seuils, plafonds, échelles du tombeau |
textes.json | Tout ce qui s'affiche. Aucun libellé n'est écrit dans le code |
reseau.json | Cadences, plafonds et chiffrement du jeu en ligne |
L'éditeur (editeur.html) modifie tuiles et
cartes sans passer par un texte brut : tracé du couloir case par case,
symboles coin par coin, effets choisis dans la liste de ceux que le moteur
sait traiter. Il refuse une échelle trop maigre — sous six symboles, elle
risquerait de ne jamais aboutir — et exporte les JSON.
VIILe jeu en ligne
Conçu pour un hébergement mutualisé : un seul fichier PHP, aucune base de données, une partie par fichier JSON.
Le serveur ne connaît pas les règles
Il range la suite des coups, vérifie qu'un joueur ne joue pas à la place d'un autre, refuse une écriture fondée sur une version périmée, et borne ce qu'une requête peut coûter. Rien de plus. C'est ce qui évite de réécrire deux mille sept cents lignes de règles une seconde fois — et ce qui rend toute divergence impossible, puisque les joueurs partagent le même état au lieu de rejouer chacun leur version.
Le code porte sa propre clé
Douze caractères : les six premiers trouvent la partie et sont les seuls que le serveur reçoive ; les six suivants ne quittent jamais le navigateur et engendrent la clé de déchiffrement. On peut donc dicter un code au téléphone sans que l'hébergeur puisse rien lire. Le lien d'invitation porte la même information, la seconde moitié dans le fragment — que les navigateurs n'envoient jamais.
Ce que le chiffrement protège, et ce qu'il ne protège pas. Il arrête l'hébergeur, un curieux qui tomberait sur les fichiers, un intercepteur. Il n'arrête pas l'adversaire assis en face : il faut bien qu'il puisse déchiffrer pour voir son plateau. C'est assumé — on joue entre gens qui se connaissent.
Le déroulement
Après chaque coup, le joueur dont c'est le tour envoie l'état complet de la partie, chiffré. Les autres le remontent tel quel. Celui qui n'a pas la main voit ses actions grisées et le plateau ne lui répond pas. Comme chaque entrée est un état complet, revoir la partie ne demande aucune logique : on avance dans la liste.
VIIILes garde-fous
node banc/tout.js enchaîne les 29 bancs. Aucune
livraison sans qu'ils soient tous verts.
Les chiffres ci-dessous ont vieilli une fois : la table annonçait « dix bancs »,
297 acquis d'interface et 155 points de règle alors qu'ils étaient bien plus
nombreux. Une page qui documente le projet doit se relire comme le reste —
c'est banc/annexes.js qui vérifie désormais le compte des bancs.
| Banc | Ce qu'il prouve |
|---|---|
demarrage | La page se lance et se joue au clic, même avec un stockage refusé |
interface | Clés de texte, exports, et 297 acquis d'interface permanents |
completude | Rien n'a été écrit puis oublié : fonctions, actions d'API, textes |
securite | Ce qu'un visiteur malveillant tenterait — 78 contrôles |
regles | 184 points de règle, joués sur 200 tirages chacun |
cartes | Les 18 cartes produisent leur effet |
cartes-ui | Chaque carte se joue au clic, depuis la main |
gestes | Chaque bouton offert répond au doigt — la faute « peint mais sourd » |
ligne | Deux joueurs partagent une partie chiffrée, et finissent d'accord |
fuites | Rien n'enfle d'un tour à l'autre : nœuds, écouteurs, minuteurs, envois |
pages | Les dix pages du site s'ouvrent, suivent le thème et ramènent au jeu |
lot | Robustesse : des centaines de parties, invariants vérifiés à chaque coup |
conformite | Les clauses de la règle papier : prouvée, ou écart déclaré et motivé |
comparer-leaders | Ce qui existe chez l'un et pas chez l'autre |
La leçon la plus utile du projet. Plusieurs fautes ont été
correctes dans le code et fausses à l'écran : un filtre CSS que Safari
ignore sur du SVG, une variable CSS employée comme attribut, une couleur en
color-mix qui tombe si la fonction n'est pas comprise. Le
point commun : vérifier ce qui est déclaré plutôt que ce qui est
peint. Des gardes traquent maintenant cette famille entière.
IXInstaller
Le jeu seul
Téléverser le dossier. C'est tout — aucune configuration.
Le jeu en ligne
- Téléverser
api/. - Donner les droits d'écriture à
api/parties/. - Ouvrir l'adresse de l'API dans un navigateur : elle répond un état de santé qui dit si tout est en place.
Les notifications
Facultatives. Sans elles, tout fonctionne et l'interface le dit. Voir
api/LISEZ-MOI-veille.md : générer les clés une fois, puis
supprimer le générateur du serveur.
Sur iPhone et iPad, le site doit être ajouté à l'écran d'accueil : c'est une condition posée par Apple, pas un confort. Le jeu le dit au joueur au lieu d'échouer en silence.
XReprendre le projet
Par où commencer
Lire LISEZ-MOI.md, puis le chapeau de moteur.js.
Chaque module s'ouvre sur un texte qui explique pourquoi il est fait
ainsi — pas ce qu'il fait, que le code dit déjà. C'est là que se trouvent les
raisons, et elles sont le seul moyen de ne pas défaire par ignorance ce qui a
coûté cher.
Ce qu'il ne faut pas défaire
- Les couleurs du plateau sont explicites, jamais calculées : une valeur qui demande à être calculée peut être ignorée, et la case redevient invisible.
- Aucun filtre CSS sur un élément SVG : Safari les ignore largement. Ce qui doit se voir se dessine.
- Une animation ne se joue qu'une fois : réinsérer un nœud relance ses animations, et le plateau est reconstruit à chaque coup.
- Aucune animation sans fin, aucun filtre coûteux : sur un téléphone, cela se paie en batterie sans que rien n'avance.
- La règle vit dans
moteur.js. Une règle écrite ailleurs finit par contredire celle-ci.
Les chantiers ouverts
| Sujet | Où en est-on |
|---|---|
| Un meilleur joueur automatique | Le mien décide au hasard ; toutes les mesures d'équilibre en dépendent |
| Le matériel imprimable | Rien ne produit les tuiles et les cartes pour la table |
| Les scarabées | Défausser deux cartes déplace l'arithmétique de la phase 2 — arbitrage en attente |
| Le rendu en relief | Retiré du projet. Il a cassé le jeu trois fois en touchant aux fichiers de la partie, et pesait la moitié du site. Le code vit dans les archives web221 à web228 : s'il revient, ce sera dans une page séparée |
| Les fosses à pics | La pierre éclatée les attend, la règle n'existe pas encore |
| Le pilotage à la manette | Présent chez Leaders, sans objet ici |