Aller au contenu
← Le jeu

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.

Salles46 14 formes de couloir, tirées au hasard
Personnages6 chacun avec sa capacité et son second pouvoir
Cartes19 80 exemplaires — 13 bonus, 6 pièges
Modules26 aucune bibliothèque extérieure
Bancs d'essai30 joués avant chaque livraison
Points de règle155 éprouvés sur 200 tirages chacun
Points signalés315 défauts corrigés qui ne peuvent plus revenir
Pages18 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.

ÉchelleSeuilCe qu'elle fait en débordant
Malédiction4Des momies surgissent autour de chaque joueur, sur les cases libres les plus proches
Effondrement4Chaque salle occupée s'effondre ; ses occupants fuient vers la plus proche
Sable4Chaque salle occupée est envahie ; si elle l'est déjà, le sable déborde vers les salles qui communiquent avec elle
Serpents4Apophis 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ésTuilesTotal
aucun220
un88
deux714
trois412
quatre312
46 salles46

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

  1. Un seul module modifie l'état. moteur.js détient P ; 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.
  2. 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.
  3. 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

ModuleLignesRôle
amorce.js68Charge les données puis les modules, dans l'ordre
donnees.js89Lit les JSON et publie les constantes
partie.js224L'état P, la géométrie du labyrinthe, le journal
moteur.js2 700Toutes les règles. Le seul module qui modifie P
cuisson.js157Compose les salles en images dans le navigateur
tuiles.js56Les salles cuites en images : à une définition, quel fichier
plateau.js1229Dessine le labyrinthe en SVG, gère pincement et animations
app.js755Le câblage : clics, menu, reprise de partie, historique
carte-perso.js318La carte du joueur actif : actions, inventaire
modales.js467Seuil, salon, lancement, fin de partie, relecture
gardiennes.js158L'écran de la phase 2
apercu.js203Vignettes : la tuile qu'on pose, la carte qu'on tire
panneau.js90La colonne de droite
historique.js100Une photo par coup, pour revenir en arrière
schema.js154Plateau miniature, pour montrer une situation
reseau.js342Chiffrement, session, dialogue avec le serveur
salon.js490Le jeu en ligne de bout en bout : salon, tours, relecture
veille.js189Être prévenu de son tour, application fermée
verif.js186Coche la liste de vérification pendant qu'on joue

VILes données

Tout se règle ici, sans toucher au code.

FichierCe qu'il décide
plateau.jsonLes formes de couloir, case par case
tuiles.jsonLes 46 salles : type, couloir, momies, symboles de réveil
cartes.jsonLes 78 cartes de fouille : effets, nombre d'exemplaires
personnages.jsonLes six explorateurs, leurs chiffres et leurs pouvoirs
regles.jsonSeuils, plafonds, échelles du tombeau
textes.jsonTout ce qui s'affiche. Aucun libellé n'est écrit dans le code
reseau.jsonCadences, 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.

BancCe qu'il prouve
demarrageLa page se lance et se joue au clic, même avec un stockage refusé
interfaceClés de texte, exports, et 297 acquis d'interface permanents
completudeRien n'a été écrit puis oublié : fonctions, actions d'API, textes
securiteCe qu'un visiteur malveillant tenterait — 78 contrôles
regles184 points de règle, joués sur 200 tirages chacun
cartesLes 18 cartes produisent leur effet
cartes-uiChaque carte se joue au clic, depuis la main
gestesChaque bouton offert répond au doigt — la faute « peint mais sourd »
ligneDeux joueurs partagent une partie chiffrée, et finissent d'accord
fuitesRien n'enfle d'un tour à l'autre : nœuds, écouteurs, minuteurs, envois
pagesLes dix pages du site s'ouvrent, suivent le thème et ramènent au jeu
lotRobustesse : des centaines de parties, invariants vérifiés à chaque coup
conformiteLes clauses de la règle papier : prouvée, ou écart déclaré et motivé
comparer-leadersCe 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

  1. Téléverser api/.
  2. Donner les droits d'écriture à api/parties/.
  3. 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 chantiers ouverts

SujetOù en est-on
Un meilleur joueur automatiqueLe mien décide au hasard ; toutes les mesures d'équilibre en dépendent
Le matériel imprimableRien ne produit les tuiles et les cartes pour la table
Les scarabéesDéfausser deux cartes déplace l'arithmétique de la phase 2 — arbitrage en attente
Le rendu en reliefRetiré 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 à picsLa pierre éclatée les attend, la règle n'existe pas encore
Le pilotage à la manettePrésent chez Leaders, sans objet ici