Moteur de point & click open source
Faites un point-and-click pour le navigateur.
Écrivez-le comme des données, façonnez-le dans un Studio visuel, prouvez qu'il peut être terminé, et livrez-le comme un jeu web qui s'installe sur un téléphone et joue hors ligne.
v4.5.0publiée le 23 octobre 2026★ 15 étoiles sur GitHub

Un jeu, ce sont des données, jamais du code
Salles, objets, règles et répliques sont des objets TypeScript ordinaires. Une personne les écrit, un assistant IA les écrit, un solveur les lit.
import { defineRoom } from 'quest-n-click/content';
export default defineRoom({
id: 'house',
name: "Grandma's house",
decor: 'decor/house',
music: 'house',
// Props: images on the background, each with states.
props: {
lamp: { name: 'lamp', states: { off: 'house/r1c1', on: 'house/r1c2' } },
stool: { name: 'stool', states: { shelf: 'house/r1c5', pulled: 'house/r1c6' } },
},
// Characters present.
actors: {
grandma: { char: 'grandma', facing: 'left' },
cat: { char: 'cat', pose: 'sleep', visible: '!cat_awake' },
},
// Zones of the background that can be acted on.
hotspots: {
shelf: { name: 'shelf' },
door: { name: 'garden door' },
},
// Look. A list = a different line each time.
look: {
shelf: 'The shelf. Too high without a step up.',
cupboard: ['An old cupboard.', 'Still an old cupboard.',
'Someday I will check what is behind it.'],
},
});// A reaction: a verb, a target, a condition, and what happens.
on: [
{ id: 'pull.stool', verb: 'pull', a: 'stool',
if: { prop: ['stool', 'shelf'] },
do: [
{ prop: ['stool', 'pulled'] },
'There. A step up.',
] },
{ id: 'tie.rope', verb: 'use', a: 'rope', b: ['hook', 'bucket'],
do: [
{ lose: 'rope' }, { set: 'tied' },
'Tied. One end on the hook, the other on the bucket.',
{ say: ['grandma', 'Careful with that bucket, dear.'] },
] },
],
// Hints, from the walkie-talkie: the first whose condition is still false.
hints: [
{ until: { has: 'rope' }, lines: ['Khhh… check the side of the armchair.'] },
{ until: 'tied', lines: ['Khhh… a rope… it ties to things.'] },
],// Talk topics. "Bye" is added to every menu.
talk: {
grandma: [
{ id: 'ask.basket', topic: "Grandma, what's in the basket?",
do: [{ say: ['grandma', 'A surprise for everyone.'] }] },
{ id: 'ask.market', topic: 'Can I go to the market alone?',
do: [
{ say: ['grandma', 'Alone?! With your scarf, your hat, your water bottle…'] },
{ say: ['grandma', '… Fine. Back by ten.'] },
] },
],
},
// On every entry into the room.
onEnter: [
{ once: ['The living room. Home base.'], id: 'arrival.first' },
],Ce que vous obtenez
Selon qui vous êtes. Chaque point renvoie à la page qui en dit plus.
Pour les joueurs
- Une interface de point-and-click classique : des verbes, un sac, une ligne de phrase ; un double tap agit avec le verbe que vous voulez dire ; une touche par verbe quand le jeu en donne une (Commandes).
- Téléphone et ordinateur : en paysage sur un téléphone, la mise en page classique à la souris ; le jeu entier au clavier (Accessibilité).
- S’installe et se joue hors ligne : une PWA qui met le jeu entier en cache après la première visite et dit quand c’est complet (Installer le jeu comme une application).
- Sauvegarde automatique et emplacements, avec export et import en fichier (Sauvegardes).
- Réglages : vitesse et taille du texte, animations réduites, police lisible, sous-titres des sons, volumes, langue (Réglages, Langues).
- Speedruns : catégories, horloge de jeu, temps intermédiaires, fantôme, preuve scellée, OBS et LiveSplit (Speedrun pour les joueurs).
Dans un jeu
- Plusieurs personnages jouables, et depuis la 4.3.0 le héros choisi à la Nouvelle partie parmi autant qu’on veut, avec des portraits, un nom par héros et des répliques qui suivent le héros (Héros).
- Une carte du monde, ses lieux débloqués par l’histoire ; depuis la 4.4.0, une épingle peut porter plusieurs lieux (Carte du monde).
- Des mini-jeux au toucher ou au clavier (pick, hide, pipes, runner, stroke, scratch, cables, la roue à code), et les vôtres (Mini-jeux fournis).
- Des cinématiques et des coups de téléphone, des scripts et des événements qui font agir le monde sans un tap, des personnages qui marchent et patrouillent (Scripts et événements, Déplacer les personnages).
- La mise en scène : salles larges et caméra, animations avec événements d’image, calques, masques, lumières, particules, zones de marche et passages (Mise en scène, La scène).
- Une musique en pistes séparées qui suit l’état du jeu, des bruitages tirés d’une même palette, des voix enregistrées par langue et par héros (Musique en pistes, Voix).
- Remix : des mondes générés depuis une graine, chacun validé et résolu avant d’être livré ; un défi du jour et des mondes mystère avec un Bridge (Remix).
- Speedrun : des runs enregistrés, scellés et vérifiés par un rejeu ; des classements sur le Bridge (Speedrun pour les auteurs).
- Reality : un jeu réagit à un fait du monde (un email reçu, une commande de terminal, un badge) par un signal signé venu d’un Bridge, sans que son contenu touche au réseau (Le Bridge Reality).
Pour les auteurs
- Le contenu en données, des objets TypeScript sans code ; les commandes sur mesure comme du code de confiance nommé dans le jeu (Principes du contenu, Code sur mesure).
- Vérifié avant que quiconque joue : le validateur trouve les références cassées, les salles inatteignables et les
répliques non traduites ; le solveur fait tourner le vrai moteur pour trouver un chemin gagnant (
npm run verify) ou prouver que chaque état atteignable peut finir (solve --prove) (Vérifier son jeu, Ce que prouve le solveur). - Rejoué : une session reproduit exactement la partie d’un testeur (Parties de test).
- Images, son et langues : un prompt pour chaque planche de sprites, des planches découpées en sprites, une musique chiptune arrangée depuis un MIDI, chaque réplique traduisible (Images, Traductions).
- Livré : un site statique avec un budget de téléchargement et chaque fichier compté avec sa licence (Construire et publier, Provenance des assets).
- Le Studio local : le vrai moteur avec un éditeur par-dessus, le storyboard, les assets, les vérifications après chaque enregistrement, un onglet de jeu qui explique une règle et rejoue une session, la matrice héros × langue, un assistant avec votre propre clé (Le Studio local).
- Travailler avec une IA : chaque opération est une commande et un outil MCP (Travailler avec une IA).
Pour les équipes et les opérateurs
- Le Studio d’équipe hébergé (expérimental) : un jeu, plusieurs personnes derrière OpenID Connect, des pans et des baux, des prévisualisations par révision, des commentaires, un diff sémantique, Git, un MCP distant pour les agents, des sauvegardes et des restaurations ; documenté pour Clever Cloud (Ce qui tourne où, Clever Cloud : vue d’ensemble).
- Le Bridge Reality : sur SQLite (stable) ou Postgres (expérimental), plusieurs locataires, des sauvegardes, des classements ; quatre connecteurs (expérimentaux) (Installer et faire tourner le Bridge).
Ce que voit le joueur, ce que voit l'auteur
Captures du vrai build de production et du vrai Studio, tirées de la galerie du moteur.
Des conversations avec sujets, choix et transcription
Des minijeux, au toucher ou au clavier
Une carte du monde, des personnages qui se déplacent
Une fin qui se souvient de ce que le joueur a deviné
Salles : le vrai moteur, un éditeur de placement par-dessus, chaque ligne modifiable sur place
Storyboard : l'histoire case par case, vérifiée contre le jeu
Assets : chaque planche et chaque case, où elle sert, le prompt pour la faire
Vérification : le validateur et le solveur, relancés après chaque sauvegarde
Prouvez qu'il peut être terminé
Avant que quiconque joue, le validateur trouve ce qui est cassé et le solveur fait tourner le vrai moteur dans chaque état atteignable.
1
Valider
Références cassées, salles inaccessibles, lignes non traduites, paramètres des minijeux.
2
Résoudre
Un chemin gagnant depuis Nouvelle partie, puis une preuve exhaustive : aucun état où la partie est perdue.
3
Livrer
Une PWA avec un budget de téléchargement, chaque fichier compté avec sa licence, vérifiée dans de vrais navigateurs.
En chiffres
- 3315
- déclarations de tests unitaires
- 288
- états prouvés dans le jeu de référence
- 136
- Ko de JavaScript à la première visite, gzippé
Mesurés sur le commit de la release par les portes automatiques, lus dans le README du tag.

Démarrer en trois commandes
Node 22.12 ou plus récent. Python 3 et ffmpeg servent les outils d'images et de son ; `npm run doctor` dit lequel manque.
Puis le tutoriel vous mène à une première salle en quinze minutes.
T=https://github.com/wanoo/quest-n-click/releases/download/v4.5.0/quest-n-click-4.5.0.tgz
npx --package=$T quest-n-click create my-game "My Game" --engine=$T
cd my-game && npm install
npm run assets && npm run dev