Skip to main content
Jonathan Andrei
Retour aux billets
Juil. 202611 min de lecture

Clatterfall : une bille, un subreddit, une exécution partagée par jour, une machine que personne ne peut bâtir seul

r/Clatterfall est une descente continue, bâtie par une foule, une pièce par personne par jour. Chaque matin, toute la machine engagée est ré-exécutée comme une simulation canonique unique que tout le monde regarde ensemble, et les pièces que la bille abandonne se dissolvent. Trois règles portent le poids : on ne peut bâtir que sur le chemin réel de la bille (la frontière), l'exécution quotidienne est simulée côté serveur une fois et rejouée identique au pixel partout, et les pièces que la bille cesse de toucher se dissolvent. Non-IA et fier de l'être : chaque pixel dessiné à partir de primitives Phaser Graphics à l'exécution.

RedditGamesHackathonReddit DevvitPhasermatter-jsGame DesignTypeScriptCommunity
J'ai créé ce billet et le projet Clatterfall pour le Reddit Games and Puzzles Hackathon. #RedditGamesHackathon

Je collectionnais des billes enfant et j'en gardais une boîte, le genre de petit trésor privé qu'on ressort et qu'on admire seul. Clatterfall est l'inverse de cette boîte. Il y a une seule bille, et elle appartient à tout le monde. Un subreddit entier bâtit la machine dans laquelle elle descend, une pièce par jour, et chaque matin on regarde tous la même bille ensemble. Je voulais prendre ce que j'aimais seul enfant et en faire quelque chose qu'une communauté fait au même moment.

L'exécution quotidienne : une bille traverse une cascade faite main de rampes en bois, de rebondisseurs en laiton et de chutes crème sur un plateau style établi éclairé au soleil, avec une règle de profondeur à droite
L'exécution quotidienne. Chaque matin, toute la machine se ré-exécute, et tout le monde regarde la même bille.

Le hook : la raison de revenir est un cliffhanger, pas une notification

  • Chaque matin une tâche planifiée re-simule toute la machine engagée et lance une bille. On ouvre le post pour regarder la bille traverser tout le contraption communautaire et découvrir : a-t-on battu un record, ou une mauvaise pièce nous a coupés court de l'objectif ?
  • Puis on dépense sa seule pièce du jour. On en a exactement une par jour. On la pose sur la frontière vivante de la machine, on argumente en commentaires sur quoi bâtir ensuite, et son streak monte.
  • Demain la bille repasse à travers tout, y compris ta pièce, et tout le monde revient voir jusqu'où elle est allée.
La machine entière vue en zoom plus large : des dizaines de pièces posées par différents redditors forment un contraption 2D délibéré de rampes, chutes, rebondisseurs et entonnoirs qui descendent à travers le plateau
La machine. Chaque pièce est la contribution quotidienne d'un redditor. Personne n'aurait pu bâtir ça seul.

La frontière est le couloir de chute réel de la bille

La frontière n'est pas un large éventail de cellules sous le dernier contact de la machine. C'est le vrai chemin de chute de la bille, élargi d'une colonne de chaque côté. C'est parti d'un choix esthétique et c'est devenu structurel. Quand la frontière était un cône large, la plupart des cellules légales étaient des endroits où la bille n'irait jamais, donc une pièce bâtie là n'était touchée par rien, ne marquait rien, et se dissolvait. Le jeu invitait les gens à dépenser leur seule pièce du jour là où elle ne pouvait pas compter. Bâtir là où la bille passe vraiment est ce qui rend une pièce capable de compter.

La vue de construction montrant la frontière comme un ensemble de cellules mises en évidence qui pulsent le long du chemin réel de la bille du run précédent, avec le reste du plateau assombri et non constructible
La frontière. On ne peut bâtir que là où la bille d'hier a réellement atteint, élargi d'une colonne de chaque côté.
La palette superposée montrant les quatre pièces statiques (Rampe droite, Chute courbe, Rebondisseur, Entonnoir), le contrôle rotation-par-tap, et un indicateur de rareté « vous avez une pièce aujourd'hui » avec le compte à rebours de placement
Une pièce par personne par jour. La rareté rend chaque contribution importante. Jamais de spam.

Chaque pièce est signée, et créditée exactement du chemin qu'elle a fait porter à la bille

On tape n'importe quelle pièce posée pour voir qui l'a bâtie et jusqu'où elle a fait aller la bille au dernier run (« la rampe de u/alice, a porté +118 px »), puis on vote pour la garder ou la couper. La carte de résultat nomme les trois redditors dont les pièces ont porté la bille le plus loin aujourd'hui, et la carte splash affiche « bâti par N redditors ». Le collectif est visible, pas abstrait. L'attribution utilise un accumulateur à marque de plus haute eau, pour que le crédit de chaque pièce s'additionne exactement à REACH même quand un rebondisseur renvoie la bille vers le haut.

Une pièce posée ouverte au tap, montrant le pseudo Reddit du bâtisseur, les px exacts que la pièce a fait porter à la bille au dernier run, et les boutons de vote haut/bas
Chaque pièce est signée et créditée aux px exacts qu'elle a fait avancer la bille. Le collectif est visible, pas abstrait.

Le résultat quotidien : NEW RECORD / TIED / CAPPED SHORT / GOAL

À l'approche de la ligne de record, la lecture se dilate en slow motion et la caméra se penche, pour que le moment que toute la communauté attend joue vraiment comme un moment. Puis la règle se remplit vers la punaise du record et l'une des quatre résolutions tombe : NEW RECORD, TIED, CAPPED SHORT, ou GOAL. Un camera-shake sur un record battu. Confettis dessinés à partir de primitives Phaser Graphics, pas d'une sprite sheet.

La résolution NEW RECORD : la bille a passé la punaise du record précédent sur la règle, la caméra a zoomé pendant un moment slow-mo, des confettis tombent, et le chiffre de profondeur est mis en évidence
NEW RECORD. Toute la communauté se réveille et le découvre ensemble.

La dissolution : aucun vote ne peut sauver une pièce inutile

Les pièces que la bille cesse de toucher se dissolvent la nuit. Une pièce qui bloque la bille se dissout le lendemain. Rien dans la lignée des machines-de-foule ne taille les contributions selon le résultat de simulation, donc la machine est sous sélection négative constante : seul ce que la bille utilise vraiment survit. Une pièce que la bille a utilisée au dernier run ne peut jamais être votée dehors.

Une pièce qui s'estompe avec une petite bouffée de sciure en dessous, marquée « dissoute : la bille n'a pas touché cette pièce »
La dissolution. L'artefact s'édite lui-même. Seules les pièces que la bille a réellement utilisées survivent à la nuit.

Pourquoi c'est Reddit-y (et pas de l'AI slop)

Le brief Reddit mettait en garde contre l'« AI slop ». Alors il n'y en a pas dans Clatterfall. Chaque pixel du jeu (pièces, bille, règle, ligne de record, confettis) est dessiné à partir de primitives Phaser Graphics à l'exécution. Pas de sprite sheets, pas d'art de stock, pas d'images générées par IA nulle part dans le projet. La carte de flux hors du jeu est du HTML écrit à la main plus un seul SVG inline. C'est non-IA et fier de l'être, ce qui est la bonne réponse à ce brief. La couche communautaire est Reddit-native par construction : le fil de commentaires devient l'arène de coordination (« quelqu'un a mis un rebondisseur en 4,6 pour qu'on arrête de coller le mur gauche »), une pièce posée par personne par jour rend chaque contribution conséquente et jamais du spam, et le run partagé du matin est le rituel r/place reconditionné en artefact qui tourne.

La vue carte de flux Reddit d'un post Clatterfall : titre, compteur du jour courant, plus grande profondeur en px, compte à rebours avant le prochain run, et un aperçu de la machine, du HTML écrit à la main plus un SVG inline, sans Phaser à la couche flux
Le post tel qu'il apparaît dans le flux Reddit. Rapide, aucun boot Phaser requis pour annoncer l'état. Le jeu complet ne boote que quand l'utilisateur l'ouvre.

Les deux problèmes durs, réglés par le design

  • Coordination. Le placement est aligné sur la grille, une pièce par cellule (premier commit gagne, atomique via Redis hSetNX), une pièce par utilisateur par jour, et restreint à la frontière vivante de la bille. Des centaines de pièces quotidiennes deviennent un contraption 2D délibéré, jamais un tas chaotique ni une ligne à une largeur. Une mauvaise pièce ne peut que plafonner la distance, jamais briquer la chaîne de façon permanente (un plancher de rattrapage doux est toujours maintenu sous la machine). Les pièces mortes ou downvotées se décomposent et libèrent leur cellule, alors la machine se répare.
  • Déterminisme. La bille est simulée une seule fois, côté serveur, par run quotidien, et stockée comme un chemin de keyframes compact. Chaque client rejoue simplement ces keyframes en tweens. Il n'y a pas de physique côté client, donc le run est identique au pixel près pour chaque joueur sur chaque appareil. La dérive entre appareils est structurellement impossible.
  • Les affirmations d'équilibre sont reproductibles, pas déclarées. npx tsx tools/season-sim.mts joue des saisons de 20 jours avec une foule amorcée et imprime le record, la taille de la frontière, et combien la bille a taillé. C'est aussi le script qui a attrapé deux bugs silencieux : il a prouvé qu'une pièce non touchée ne peut pas bouger le record, et c'est ce qui a montré que des joueurs aléatoires n'amélioraient jamais le record en 20 jours sous l'ancienne frontière en cône.

Limites honnêtes

  • Amorcé, pas encore adopté. Un post fraîchement installé livre une vraie cascade de démarrage de 26 pièces (construite par la même logique gloutonne « étendre la portée » que le jeu récompense, donc les 26 pièces d'amorce sont réellement sur le chemin de la bille). Pour rendre la course au record réelle pour le jugement, la machine a besoin d'une cohorte vivante qui pose des pièces sur plusieurs jours UTC.
  • Le ressenti physique dépend du playtest. Les valeurs de gravité, restitution et friction sont réglées pour sembler denses et se reposer de manière fiable, mais un vocabulaire de pièces plus large demanderait plus de réglage. La palette de quatre pièces statiques est un choix de portée délibéré qui garde la bille comme seul corps dynamique (ce qui protège aussi le déterminisme).
  • Coupé pour la portée, facile à ajouter plus tard : un minimap dézoomé, une galerie Hall of Machines des saisons terminées, et des pièces plus riches (un spinner et une bascule ont été conçus puis délibérément reportés).
Une machine. Une bille. Une exécution partagée par jour. Le fil de commentaires devient l'arène de coordination, la frontière rend chaque pièce causalement dépendante de la bille d'hier, la dissolution taille tout ce que la bille cesse de toucher, et le run du matin est regardé identique au pixel par tout le monde. C'est la boîte de billes que j'avais enfant, inversée : pas privée, pas silencieuse, pas admirée seul.
Projet associé

Clatterfall: A Whole Subreddit Builds One Marble Machine, One Part a Day, and Every Morning We All Watch the Same Marble

Voir le projet