Jack cherche un taf : un point-and-click né dans un train

Hier, 18 octobre, ma fille Anna et moi étions dans un TGV entre Paris et Brest, sur le retour d'un week-end en famille. Quelques heures de train, mon ordinateur portable, et Anna, 12 ans, assise à côté de moi.
Ce n'était pas notre premier jeu du week-end. À l'aller, de la Bretagne à Paris, nous en avions déjà fait un ensemble dans le TGV : un jeu à la Temple Run, basé sur un des sets LEGO reçus dans le TGV. Alors pour le retour, Anna voulait un jeu aussi, mais d'un autre genre : sans combat, sans mode arcade, un jeu où il faut plutôt réfléchir. J'ai pensé aux vieux point-and-click de LucasArts, puis au projet de mon collègue Erwan, Web-SCUMM. C'était l'occasion idéale de l'essayer enfin.
Elle a imaginé une histoire : Jack, un squelette à tête de citrouille, se fait virer juste avant Halloween et doit trouver un nouveau taf. En arrivant en Bretagne, Jack avait un patron vampire radin, un maire Frankenstein qui a perdu son boulon, une momie à l'agence pour l'emploi et un blob vert qui avale tout. Et il vivait dans un jeu. Un vrai point-and-click, comme ceux avec lesquels j'ai grandi, déjà jouable, avec de vilaines formes provisoires à la place des dessins. Aujourd'hui, nous avons ajouté le pixel art, un deuxième épisode et une bande-son, et nous l'avons publié : Jack cherche un taf, jouable dans le navigateur et sur téléphone.
Nous l'avons construit avec Claude Code, sur un moteur qui s'appelle Web-SCUMM. Et je veux être clair dès le départ : ce billet ne parle pas d'un jeu fait malgré l'IA, il parle de ce que l'IA a rendu possible. L'histoire d'une fille de 12 ans devenue un jeu d'aventure jouable entre deux gares, c'est exactement le genre de truc d'ouf que ces outils permettent aujourd'hui, et j'en suis encore un peu épaté.
Web-SCUMM, ou comment un jeu devient des données
Si vous avez un certain âge, les mots Day of the Tentacle ou Monkey Island 2 vous parlent sûrement. Des verbes en bas de l'écran (Regarder, Prendre, Utiliser, Donner…), des énigmes absurdes, des personnages dont on se souvient trente ans plus tard. LucasArts construisait ces jeux sur SCUMM, son moteur maison.
Web-SCUMM est un moteur libre (licence MIT) pour ce genre de jeux, dans le navigateur. Il est l'œuvre de mon collègue Erwan (wanoo sur GitHub), VP International Growth chez Clever Cloud.
Ce qui le rend intéressant, ce n'est pas qu'il reproduise le genre, c'est la façon dont il le fait :
- Le jeu est fait de données, pas de code. Les lieux, les objets, les personnages, l'inventaire, les dialogues, les énigmes et les indices sont de simples objets TypeScript, sans aucune logique. Une règle, c'est un verbe, une cible, une condition et une liste de commandes. C'est tout.
- Parce que ce sont des données, on peut les vérifier. Un validateur trouve les références cassées et les choses visibles qu'on ne peut pas regarder. Un solveur fait tourner le vrai moteur pour prouver que le jeu peut être terminé depuis « Nouvelle partie ». Un test de parcours le rejoue après chaque modification.
- Un Studio visuel : le vrai moteur avec un éditeur par-dessus, pour placer les choses dans un lieu, modifier chaque réplique sur place et relancer les vérifications à chaque sauvegarde.
- Il produit un jeu web qui s'installe sur un téléphone et se joue hors ligne.
- Il est pensé pour être écrit avec un assistant IA. Le dépôt contient un
AGENTS.mdavec les règles, et des skills pour Claude Code (/storyboard,/new-room,/new-character…) qui suivent la méthode du moteur pas à pas.
Ce dernier point est le cœur de cette histoire. Anna et moi avons passé notre temps sur ce qui compte : l'histoire, les blagues et les énigmes. Claude Code transformait nos idées en lieux, en dialogues et en énigmes, en suivant les règles du moteur, et le moteur nous prévenait (nous et Claude) quand quelque chose était cassé. C'est comme ça qu'une histoire imaginée au début du voyage est devenue un jeu auquel Anna a pu jouer avant la fin.
L'histoire de Jack
Jack est un squelette avec une citrouille sculptée en guise de tête, inspiré d'un autre des sets LEGO reçus dans le TGV, le 30717 « Fun Halloween Skeleton ». Mais dans le jeu, Jack est en pixel art, pas un jouet.
Jack travaille comme effrayeur au Manoir Frissonnant. Il fait très bien son travail. Trop bien : hier, un car entier de touristes s'est enfui en hurlant. Sans payer. Alors le Comte Radinoff, vampire aussi radin que pâle, le licencie. Trois jours avant Halloween.
Le Comte donne le ton dès la première réplique :
« Jack, mon petit. Asseyez-vous. Ah non, pas sur la chaise, elle est neuve. »
Et quand Jack ose parler de ses indemnités :
« Votre quoi ? Je ne connais pas ce mot. Il n'existe pas en transylvanien. »
Jack a jusqu'au 31 pour retrouver du travail. Première étape : la place du village et Pôle Frousse, l'agence pour l'emploi locale. Au guichet, Mme Bandelette, une momie très, très lente. Pour monter un dossier, Jack a besoin d'une photo d'identité et d'une lettre de recommandation du Maire.
Bien sûr, rien n'est simple. Le Maire, Franck Enstein, a perdu le boulon de son cou, et sa tête penche dangereusement sur le côté. Le boulon a été avalé par Gloubi, l'éboueur, un gros blob vert qui avale tout et ne rend rien, sauf s'il est assez content pour roter. Et la route de la fête foraine est gardée par le Brigadier Sans-Tête, un chevalier sans tête à la logique imparable :
« HALTE ! Personne ne passe sans que je le voie ! »
Il n'a pas de tête. Donc il ne voit personne. Donc personne ne passe. C'est le règlement.
À la fête foraine, Jack essaie quelques petits boulots pour obtenir ce qu'il lui faut : vendre de la barbe à papa pour Mémé Guimauve, une sorcière à la retraite, et calmer Pépite, le petit dragon de M. Carrousel, qui a peur des enfants. Il réussit les deux. Et il se fait virer des deux, parce que les enfants ont peur de lui. D'où un gag à répétition :
« Troisième licenciement de la journée. Record personnel. »
Le deuxième épisode se passe dans le train fantôme de Wolfgang, un loup-garou qui est comptable quand ce n'est pas la pleine lune. Jack est pris à l'essai, mais rien ne marche : les fantômes sont en grève (Ginette la déléguée syndicale, Gaston et ses chaînes, et Bouh le stagiaire, qui ne dit que « bouh »), le courant est coupé, et personne ne sait que le train rouvre. Ce dernier problème, c'est la photo ratée de Jack qui le règle : celle qui a tellement fait peur au photomaton qu'il en a toussé de la fumée devient l'affiche. Et puis vient la revanche du Comte, que je ne vais pas divulgâcher, sauf pour dire qu'un vampire radin finit par payer. Deux fois.
En chemin, il y a quatre petits mini-jeux dans la tradition LucasArts : servir la bonne couleur de barbe à papa, caresser tout doucement un dragon qui a peur, démêler les câbles du tableau électrique, et choisir où se cacher pour la répétition générale.
Et si on est bloqué, on peut parler à Mireille, la petite araignée qui habite dans la tête de Jack (elle est dans l'inventaire). Ses indices vont du plus vague au plus précis. Parce qu'il y a une règle que nous avons prise directement chez LucasArts : on ne meurt jamais, et on ne reste jamais bloqué.
Le jeu est en français, et il se joue sur ordinateur ou sur téléphone en mode paysage.
Comment nous avons travaillé
Le brief de départ tient en trois lignes : un petit premier périmètre de 3 ou 4 lieux, du pixel art, l'esprit LucasArts.
L'histoire est celle d'Anna : Jack viré avant Halloween, qui cherche un nouveau taf. Le maire Frankenstein, Gloubi et plusieurs autres personnages sont aussi ses idées. Certaines situations viennent d'elle, d'autres de moi, d'autres de nous deux, et d'autres encore sont sorties de nos discussions avec Claude. Car Claude ne faisait pas que taper le code : c'était la troisième personne autour de la table, celle qui transformait une idée lancée en l'air en un lieu jouable en quelques minutes. Nous avons travaillé ensemble sur mon ordinateur, côte à côte, avec Claude Code qui travaillait dans le dépôt de Web-SCUMM en suivant sa méthode. Le TGV ne nous a pas facilité la tâche (le wifi n'a pas arrêté de couper et de revenir jusqu'en Bretagne), mais on y est arrivés.
Mon moment préféré, c'est dans le train, la première fois qu'Anna y a joué. Les dessins n'étaient encore que de vilaines formes SVG provisoires, mais elle était émerveillée de voir ses idées devenir un jeu.
C'est cette méthode qui m'a le plus plu, parce qu'elle garde un jeu en bonne santé même quand on l'écrit vite, dans un train :
- Le storyboard d'abord. Chaque réplique du jeu vit dans un seul fichier de storyboard, lieu par lieu, scène par scène, avec les indices. C'est la source de vérité : quand on voulait changer une blague, on changeait le storyboard, puis le lieu.
- Les lieux sont des données. Un fichier par lieu, avec ce qui se passe quand on regarde, prend, donne ou utilise quelque chose. Pas de code dans le dossier du jeu.
- Des vérifications après chaque modification.
npm run validateattrape les identifiants cassés et les répliques manquantes,npm run solveprouve que le jeu peut toujours être terminé depuis « Nouvelle partie », et un test de parcours rejoue tout le jeu. Quand on ajoute des gags à toute vitesse, savoir qu'une faute de frappe ne peut pas casser le jeu est un vrai confort.
Tout le reste est venu le lendemain, c'est-à-dire aujourd'hui : le pixel art, le deuxième épisode dans le train fantôme, la bande-son et la mise en ligne.
Pour les dessins, l'outillage du moteur écrit les consignes de chaque planche de sprites, de chaque objet et de chaque décor dans un même style (npm run prompts). Les planches ont été générées par un modèle d'images à partir de ces consignes, puis découpées en sprites avec l'outil cut-sheet.py du moteur et nettoyées par deux petits scripts. La planche de Jack a été faite en premier, et elle a servi de référence de style pour toutes les autres.
Le jeu est publié sur GitHub Pages, avec un workflow GitHub Actions qui le construit et le déploie.
Une bande-son Mega Drive pour Halloween
Un point-and-click sans musique, c'est triste. Le jeu a donc une bande-son d'Halloween façon Mega Drive. Web-SCUMM fournit une chaîne audio qui transforme un fichier MIDI en arrangement pour Sega Mega Drive (synthèse FM et PSG, rendue avec le tracker chiptune Furnace), et qui génère les bruitages à partir de la même palette de sons, pour que tout sonne comme un seul et même jeu.
Le manoir joue donc la Toccata en ré mineur de Bach (quoi d'autre ?), le train fantôme joue Dans l'antre du roi de la montagne de Grieg, et il y a des airs originaux pour la place du village, une valse pour la fête foraine et un petit jingle pour la fin. Sans oublier les bruitages : le tonnerre, une porte qui grince, un casier qui s'ouvre, et bien sûr le rot de Gloubi.
Jouer, lire, forker
- Jouer en ligne : lostinbrittany.github.io/web-scumm-jack-cherche-un-taf, sur ordinateur ou sur téléphone en mode paysage.
- Le dépôt du jeu : LostInBrittany/web-scumm-jack-cherche-un-taf, un fork du moteur qui ne contient que le jeu de Jack. Toute l'histoire se lit dans le storyboard, et on peut voir comment un lieu est écrit.
- Le moteur Web-SCUMM : wanoo/web-scumm, sous licence MIT. Merci, Erwan, d'avoir construit un si beau moteur, et d'avoir réfléchi avec autant de soin à la façon dont il fonctionne avec un assistant IA. Si vous avez toujours rêvé de faire votre propre jeu d'aventure, c'est un excellent point de départ.
Les crédits du jeu disent « Anna et Horacio », et c'est ma réplique préférée de tout le jeu. J'ai vraiment kiffé de pouvoir faire ça avec ma fille, de pouvoir l'aider à voir ses idées transformées en jeu. Et Jack ? Il a trouvé du travail. Faire peur, juste ce qu'il faut.