Attrape Eliott !
Un mini-jeu d'arcade offert à Le Cas Pucine : deux minutes pour attraper Eliott, qui pique les sièges des spectateurs avant leur arrivée.
Le contexte
Le Cas Pucine est humoriste et ventriloque. Sur scène, elle partage la vedette avec Eliott, sa marionnette, un petit personnage vert et survolté qui ne tient pas en place.
En novembre 2021, j'ai eu envie de lui rendre un peu de ce que ses spectacles m'avaient apporté. Pas avec un dessin ou un message, mais avec ce que je sais faire : un jeu. Pas de commande, pas de client, pas de deadline. Juste un cadeau de fan, codé en quelques jours. Elle l'a partagé en story.
Le principe
Le jeu tient en une phrase, et c'est volontaire : Eliott s'amuse à piquer les sièges des spectateurs, attrape-le avant qu'ils n'arrivent.

- Une salle de 63 fauteuils rouges (9 rangées de 7).
- Eliott apparaît sur un fauteuil au hasard. Un tap dessus, il disparaît, un point en plus, et il réapparaît ailleurs.
- Si on est trop lent, il file tout seul vers un autre siège. Pas de pénalité : juste un point qu'on n'aura pas.
- Une partie dure deux minutes, chrono à la milliseconde.
- À la fin, on enregistre son pseudo dans un classement des dix meilleurs scores.
Aucun tutoriel, aucun menu d'options. On ouvre la page, on lit deux lignes, on appuie sur « Jouer ».
Le vrai sujet : la difficulté
Un jeu de réflexes qui reste au même rythme pendant deux minutes devient ennuyeux au bout de trente secondes. Un jeu qui accélère trop vite décourage. Tout le game design tient dans la façon dont Eliott devient insaisissable.
J'ai découpé la partie en paliers de score. À chaque palier, la fenêtre pendant laquelle Eliott reste sur un siège rétrécit, et elle est tirée au hasard dans une fourchette pour qu'on ne puisse jamais caler son rythme :
| Score | Eliott reste visible… |
|---|---|
| 0 à 20 | entre 5 et 7 secondes |
| 21 à 40 | entre 3 et 7 secondes |
| 41 à 60 | entre 2 et 5 secondes |
| 61 à 80 | entre 0,5 et 5 secondes |
| 81 à 100 | entre 0,5 et 4 secondes |
| 101 à 120 | entre 0,3 et 3 secondes |
| 121 à 140 | entre 0,3 et 2 secondes |
| 141 à 500 | entre 0,3 et 1 seconde |
| au-delà de 500 | entre 0,1 et 0,3 seconde |
Le début est volontairement mou : on comprend le jeu, on attrape ses premiers Eliott, on se sent bon. Le basculement arrive vers 60 points, quand la borne basse tombe à une demi-seconde. Là, Eliott peut s'évaporer avant même qu'on l'ait vu. La fourchette reste large (de 0,5 à 5 secondes) pour alterner les apparitions faciles et les vraies frustrations, et donner envie de relancer une partie.
Le dernier palier, au-delà de 500 points, est une blague. Personne ne l'atteindra en deux minutes, et ce n'est pas le but. C'est le petit clin d'œil laissé pour ceux qui iront lire le code.
Dans l'historique du projet, un commit s'appelle simplement « ajustement difficulté ». Il ne change que des nombres, mais c'est lui qui transforme une démo en jeu.
Rester dans son univers
Un fan game ne vaut que s'il sonne juste pour la personne à qui on l'offre. Eliott est hyperactif, il court partout : le placer dans une salle de spectacle, en train de squatter les fauteuils du public avant le lever de rideau, c'était le prétexte le plus naturel. Le joueur ne joue pas contre Eliott, il fait le placeur débordé d'un soir de représentation.
L'interface s'efface derrière ça. Fond sombre, fauteuils rouges, un compteur et un chrono, rien d'autre. Chaque prise déclenche un petit son, pour que le tap se sente autant qu'il se voit.
2026 : le jeu qui avait disparu
En octobre 2026, j'ai sorti mes serveurs de Cloudron pour passer sur un déploiement plus léger. Dans la manœuvre, l'enregistrement DNS de lcp.marill.dev a disparu, et le jeu avec.
J'en ai profité pour lui donner un hébergement qui ne dépend plus de mes serveurs :
- Le code a quitté GitLab pour GitHub. L'ancien dépôt est archivé et pointe vers le nouveau.
- Chaque push sur la branche principale reconstruit et redéploie le jeu sur GitHub Pages, via GitHub Actions. Plus de mise en ligne à la main.
- Le domaine
lcp.marill.devpointe vers GitHub Pages, avec un certificat HTTPS renouvelé automatiquement.
Et la migration a fait remonter ce que personne ne voit tant qu'on ne réinstalle pas : le projet ne se construisait plus. Sur une installation propre, une dépendance d'Angular 13 réclamait un paquet qui n'était déclaré nulle part, et le build échouait. En 2021, npm l'installait par chance au bon endroit. Une ligne dans le package.json a suffi, mais sans la CI, je ne l'aurais jamais su.
C'est la même leçon que pour mes sauvegardes : un projet qu'on n'a pas reconstruit depuis cinq ans n'est pas un projet qui marche, c'est un projet qui marchait.
Ce que je ferais autrement aujourd'hui
Ce jeu a cinq ans, et je préfère le regarder honnêtement :
- Angular pour un écran unique, c'était trop. Le jeu pèse près de 580 Ko de JavaScript au chargement, pour une grille, un chrono et un compteur. Aujourd'hui, je partirais sur du Svelte ou du JavaScript sans framework, pour un dixième du poids.
- Le mobile mérite mieux. Sur téléphone, la grille occupe le haut de l'écran et laisse un grand vide en dessous, et Eliott est tout petit sur son fauteuil. Une grille qui remplit l'écran rendrait le jeu plus lisible et plus nerveux.
- Le classement ne se partage pas. Les scores sont enregistrés dans le navigateur du joueur. C'est simple et sans aucune donnée collectée, mais chacun ne voit que ses propres records. Un vrai classement commun demanderait un petit serveur, et un minimum de protection contre la triche.
Je n'ai pas réécrit le jeu pour autant. Il fait exactement ce qu'il devait faire : faire sourire la personne à qui je l'ai offert.
Stack technique
| Couche | Technologie |
|---|---|
| Frontend | Angular 13 + TypeScript |
| Boucle de jeu | RxJS (timers d'apparition, chrono) |
| Style | Tailwind CSS 2 |
| Scores | localStorage (dix meilleurs, sans serveur) |
| Hébergement | GitHub Pages, domaine lcp.marill.dev |
| Déploiement | GitHub Actions (build Node 16, déploiement à chaque push) |
Attrape Eliott ! est un fan game non commercial. Eliott et l'univers de Le Cas Pucine lui appartiennent.