Repository navigation
FR Creer Premier Jeu
English · Tutoriel · Publiée, relue en partie par une personne · S'applique depuis : 4.3.0
Le plus court chemin entre rien et une salle jouable sur votre téléphone, avec, à chaque étape, les fichiers que vous touchez.
Public, contexte, et statuts de ce sur quoi repose la page
Public : auteur · Contexte : dépôt du moteur, projet créé
Un jeu d'une salle à partir du modèle : un jardin, un seau, un portail. On prend le seau, on l'utilise sur le portail, c'est fini. Vous y ajoutez une lampe que le héros peut allumer : vous la racontez d'abord dans le storyboard, vous écrivez sa règle, vous la placez à la souris, vous vérifiez le jeu avec le validateur et le solveur, et vous y jouez sur votre téléphone. Les étapes sont prévues pour une quinzaine de minutes. Tout ce que vous écrirez ensuite est une variation de ce qui est déjà là.
Le contenu est une donnée. Salles, accessoires à états, personnages, objets, règles, conversations, indices, scripts et événements sont de simples objets TypeScript, sans code dedans : chaque outil peut les lire, les vérifier et y jouer.
export const garden: RoomDef = {
id: 'garden', name: 'Le jardin', decor: 'garden',
props: { tank: { name: 'citerne', states: { full: 'tank_full', empty: 'tank_empty' } } },
exits: { back_door: { name: 'porte de derrière', to: 'house', entry: 'garden' } },
on: [
{ verb: 'use', a: 'pipe', b: 'tank', if: '!tank_drained',
do: [{ minigame: 'pipes' }, { lose: 'pipe' }, { set: 'tank_drained' }, { prop: ['tank', 'empty'] }] },
],
hints: [{ until: 'tank_drained', lines: ['Utilise le tuyau sur la citerne.'] }],
};Une règle, c'est un verbe, une cible, une condition et une liste de commandes. Ce dont un jeu a besoin au-delà, une commande sur mesure, est du TypeScript à lui : du code de confiance, nommé dans le jeu et haché avec lui (code sur mesure). Des mécaniques célèbres du genre sont écrites ainsi dans mécaniques classiques. Le Studio, c'est le vrai moteur avec un éditeur par-dessus : les salles et leurs placements, le storyboard case par case, les vérifications après chaque enregistrement (le Studio local).
Images, sons et langues. Un prompt pour chaque planche, chaque objet et chaque décor dans un même style, et des planches découpées en sprites (images) ; une musique chiptune arrangée depuis un MIDI et des bruitages tirés d'une même palette (musique, bruitages) ; chaque réplique traduisible, une traduction manquante repérée avant la release (traductions).
- Node 22.13 ou plus récent : le Studio local (étape 5) et les outils qui écrivent un jeu en ont besoin ; 22.12 ne
sert qu'à jouer et construire un jeu (prérequis). Python 3 avec Pillow pour
npm run assets(python3 -m pip install --require-hashes -r node_modules/@quest-n-click/engine/requirements.txtdans un projet créé,python3 -m pip install --require-hashes -r requirements.txtdans le dépôt du moteur). - Un téléphone sur le même réseau, pour la dernière étape (facultatif).
- Un des deux endroits où travailler, avec les mêmes étapes (lequel est lequel) :
-
un projet créé, où le jeu est
game/; les chemins de cette page disentgame/; -
le dépôt du moteur, où le jeu est
games/<id>/(icigames/lamp/).
-
un projet créé, où le jeu est
Les paquets ne sont pas encore sur le registre npm : un jeu part donc de l'archive que chaque release GitHub joint (installer depuis l'archive de release). Prenez la dernière version sur https://github.com/Quest-n-Click/quest-n-click/releases/latest puis, dans un dossier vide de votre choix :
# dans le dossier qui contiendra le projet : crée le dossier my-game
V=4.5.0 # la version de la release que vous prenez
T=https://github.com/Quest-n-Click/quest-n-click/releases/download/v$V/quest-n-click-$V.tgz
npx --package=$T quest-n-click create my-game "My Game" --engine=$T
cd my-game
npm install
python3 -m pip install --require-hashes -r node_modules/@quest-n-click/engine/requirements.txt
npm run assets # les images provisoires dans public/assets
npm run dev # http://127.0.0.1:5173/ : un jardin, un seau, un portailLes paquets sont sur npm depuis la 4.5.2 : npm init @quest-n-click my-game "My Game" crée le même projet depuis le
registre, sans URL d'archive (installer depuis npm).
Ou, dans le dépôt du moteur, le même modèle devient games/lamp, choisi comme jeu courant (.cache/game) :
# dans le dépôt du moteur
npm install
npm run new-game lamp "The Lamp"
npm run assets
npm run devVous voyez un jardin. Le modèle est un jeu complet d'une salle. Ses images sont provisoires, dessinées à partir de
formes (tools/placeholder-art.py) : provenance.json le dit, et une release les refuse tant que chaque fichier n'est
pas remplacé et relu.
game/rooms/start.ts (games/lamp/rooms/start.ts) est toute la salle. Lisez-la de haut en bas : props (les
choses qui ont une image), hotspots (des endroits du décor), look (une réplique, ou trois qui tournent, pour chacun),
on (les règles : un verbe, une cible, une condition, ce qui se passe), hints (ce que dit l'objet d'indices, tant
qu'un drapeau n'est pas posé), onEnter. La géométrie n'est pas là : layout/start.json dit où sont les choses, et
seuls le Studio ou l'éditeur de placement l'écrivent (géométrie).
storyboard.json est la source de vérité du texte : l'histoire s'y écrit avant la salle
(le storyboard). Ajoutez une case à la planche du jardin, après celle du seau :
{ "id": "start-lamp", "title": "La lampe", "action": "Use lamp", "lines": [{ "who": "hero", "text": "Et la lumière fut." }] }L'onglet Storyboard du Studio montrera cette case comme pas encore faite : l'étape suivante la réalise, avec la même réplique.
Ajoutez la lampe au jardin. Dans rooms/start.ts :
props: {
bucket: { name: 'seau', img: 'starter/items/bucket' },
lamp: { name: 'lampe', states: { off: 'starter/items/bucket', on: 'starter/items/note' }, initial: 'off' },
},
look: {
// …
lamp: ['Une lampe de jardin. Éteinte.', 'Toujours éteinte.', 'Elle réfléchit.'],
},
on: [
// …
{ id: 'start.light-lamp', verb: 'use', a: 'lamp', if: '!lamp_on',
do: [{ set: 'lamp_on' }, { prop: ['lamp', 'on'] }, 'Et la lumière fut.'] },
],Les images provisoires n'ont pas de lampe : elle emprunte donc les deux images d'objets du modèle, celle du seau quand
elle est éteinte, celle de la note quand elle est allumée. C'est un pis-aller, mais le changement se voit. Pour une vraie
lampe, npm run prompts écrit le prompt et l'onglet Assets du Studio découpe ce que vous générez
(images). Une règle est un verbe, une cible, une condition et une liste de commandes ; une chaîne
dans do est une réplique du héros, celle du storyboard. { prop: ['lamp', 'on'] } change l'état de l'accessoire,
{ set: 'lamp_on' } le retient dans la sauvegarde (réactions, commandes).
# dans le projet créé, ou dans le dépôt du moteur
npm run studio # le Studio s'ouvre ; onglet Rooms, « start »La lampe n'a pas encore de place : le Studio la montre à l'endroit par défaut. Faites-la glisser où vous voulez,
ajustez sa hauteur, enregistrez : layout/start.json gagne une entrée lamp. Ne tapez jamais de coordonnées à la
main ; l'éditeur et le Studio sont faits pour ça. Tant qu'elle n'est pas placée, validate dit
no position in the layout.
L'onglet Storyboard montre maintenant la case de la lampe comme faite ; l'onglet Check relance le validateur et le solveur après chaque enregistrement. Depuis le terminal :
# dans le dépôt du moteur
npm run validate # un accessoire sans texte Regarder, un drapeau que rien ne lit, une règle inaccessible : c'est dit ici
npm run solve # un chemin gagnant de Nouvelle partie à la fin, étape par étape (pas la preuve que personne ne reste bloqué)
npm test # les tests du moteur et la soluce de votre jeu (games/lamp/tests/game.test.ts)# dans le projet créé
npx quest-n-click validate
npx quest-n-click solve
npm run verify # validate, solve, i18n status, lint, playtestssolve s'arrête au premier chemin vers la fin qu'il trouve : un autre chemin peut encore mener le joueur dans une
impasse. npm run solve -- --prove (npx quest-n-click solve --prove) en cherche une dans tous les états qu'il peut
atteindre, dans ses budgets (ce que prouve le solveur). Une règle dont le solveur n'a jamais
besoin n'est pas un bug (la lampe est décorative), mais npm run lint (npx quest-n-click lint) vous dit qu'elle
l'est (vérifier son jeu).
# dans le dépôt du moteur
npm run dev:lan # le serveur sur votre réseau ; ouvrez l'URL affichée sur le téléphone, en paysageUn projet créé n'a pas de dev:lan : tester sur un téléphone par le réseau local dit comment
faire. Touchez la lampe avec Utiliser. Avant : la lampe montre l'image du seau. Après : le héros dit « Et la lumière
fut. », la lampe montre l'image de la note, et un second Utiliser ne déclenche plus la règle (son if: '!lamp_on').
Rechargez la page : la lampe est toujours allumée, car la sauvegarde retient lamp_on et l'état de l'accessoire.
Limite ·
tutorial-scopeCe tutoriel laisse de côté les images (la lampe emprunte les images provisoires du modèle), la carte, les personnages et les conversations, et la publication. Chacun a sa page ci-dessous.
C'est la boucle : raconter dans le storyboard, écrire la règle, la placer, vérifier, jouer (la boucle de travail).
- Le storyboard vient d'abord : les répliques de la salle sont celles du storyboard (le storyboard).
- Une salle est une donnée : accessoires, zones, textes Regarder, règles (salles).
- La géométrie vit dans
layout/, placée à la souris (géométrie). - Le validateur et le solveur vérifient le jeu après chaque changement ;
solvetrouve un chemin gagnant,solve --provecherche les impasses (vérifier son jeu).
- Salles, champ par champ ; réactions ; commandes ; conditions.
- Mécaniques classiques : des énigmes célèbres écrites avec ces champs.
- Le Studio local, et concevoir les énigmes pour un jeu entier, de la première idée à la release.
Generated publication · publication générée — current documentation · documentation courante: quest'n'click 4.5.5 r1, documentation revision · révision de la documentation 301f199dc2e38aa35a552a22ef87fd1e0f1f50f7.
Latest documentation · dernière documentation: https://quest-n-click.cleverapps.io/docs · https://quest-n-click.cleverapps.io/fr/docs; earlier versions · versions précédentes: each release's quest-n-click-docs-<version>.tar.gz · l'archive quest-n-click-docs-<version>.tar.gz de chaque release, https://github.com/Quest-n-Click/quest-n-click/releases
An edit made in this wiki is overwritten at the next publication · une modification faite dans ce wiki est écrasée à la publication suivante.
Edit the source · Modifier la source · Report an error · Signaler une erreur
Index (6)
Démarrer (6)
Jouer (9)
Installer (18)
- Prérequis
- Installer depuis l'archive de la release
- Installer depuis npm
- Installer depuis le dépôt pour travailler sur le moteur
- doctor : vérifier sa machine
- Outils pour les images
- Outils audio : ffmpeg, fluidsynth, Furnace, uv
- Mettre à jour
- Notes de mise à jour : 4.5
- Notes de mise à jour : 4.4
- Notes de mise à jour : 4.3
- Notes de mise à jour : 4.2
- Notes de mise à jour : 4.1
- Notes de mise à jour : v3
- Notes de mise à jour : v2 vers v3
- Venir de web-scumm
- Référence du paquet
- Dépannage de l'installation
Créer un jeu (55)
- Votre premier jeu
- Organisation d'un projet créé et du dépôt du moteur
- La boucle de travail
- Principes du contenu et contrat d'identité
- Salles
- Géométrie : placement, zones de marche, masques, calques, caméra
- Un objet est visible mais inaccessible
- Réactions
- Commandes du jeu
- Conditions
- Drapeaux, variables et événements : lequel choisir
- Code sur mesure
- Personnages
- Objets et inventaire
- Carte du monde
- Dialogues
- Scripts et événements
- Faire bouger les personnages : patrouilles et marches
- Sorties
- Chapitres et objectifs
- État et sauvegardes : persistant ou temporaire, renommer un id, migrations
- Mise en scène : salles larges et animations
- La scène : lumières, particules, sols
- Habillage et polices
- Titre et générique
- Héros : plusieurs personnages et choix du héros
- Mini-jeux intégrés
- Un mini-jeu sur mesure
- Traductions
- Musique en stems
- Bruitages
- Voix : par langue et par héros
- Images : prompts, découpe des planches, transparence, échelle
- Provenance des assets
- Le storyboard, source de vérité
- Concevoir des énigmes
- Mécaniques classiques
- Pages de relecture
- Référence du DSL
- Vérifier son jeu
- Ce que prouve le solveur
- Options du solveur
- Playtests
- Remix
- Speedrun pour les auteurs
- La fin scellée
- Modèle de production
- Jeux d'exemple
- Travailler avec une IA
- Construire et publier un jeu
- Publier sur GitHub Pages
- Le jeu statique sur Clever Cloud
- Autres hébergeurs statiques
- Sous-chemin, cache et service worker, déploiement incomplet, retour arrière
- Tester sur un téléphone en réseau local
Studio local (24)
- Le Studio local : présentation et lancement
- Modifier une salle
- Placement et scène
- Aperçu, application, annulation
- Storyboard
- Assets et découpe
- Vérifier : validateur, solveur, chemin critique, chaleur, santé, couverture
- Captures avant et après
- Diff sémantique
- Jouer et rejouer une session
- Explication des règles
- Langue et objectifs
- Voix et matrice héros × langues
- Carte
- Notes
- Remix dans le Studio
- Musique
- L'Assistant : votre propre clé
- Mode démo et studio-apply
- Sécurité en local et en réseau local
- API du Studio
- MCP local : configurer chaque client
- Outils MCP
- Dépannage du Studio
Studio d'équipe (21)
- Ce qui tourne où
- Concepts : révision, transaction, pan, bail, aperçu, build
- Débuter comme dev invité
- Travailler ensemble au quotidien
- Rôles et actions : la matrice complète
- Invitations
- Gérer les membres
- Écriture refusée sur le Studio hébergé : révision de base périmée (409)
- Écriture refusée sur le Studio hébergé : pan verrouillé (423)
- Reprendre après un bail perdu, une déconnexion ou un aperçu périmé
- Commentaires
- Carte et diff sémantique
- Publier des builds
- MCP distant
- Le jeu dans Git
- Mettre à jour le moteur d'un jeu hébergé
- Assets hébergés
- La ligne de commande du serveur
- Routes de santé et de métriques
- L'essayer en local avec compose.yml
- Limites connues
Clever Cloud (23)
- Clever Cloud : vue d'ensemble, coût et prérequis
- Applications et add-ons
- Domaines et TLS
- Keycloak
- OIDC générique et GitLab
- Configuration
- Premier déploiement
- Sauvegardes
- RPO et RTO
- Exercice de restauration sur une installation vierge
- Redéploiements
- Mettre à jour le serveur et vérifier l'état après une migration
- Limites du retour arrière
- Supervision
- Sécurité
- Renouveler les clés
- Récupérer l'accès administrateur
- Changer de domaine ou de fournisseur OIDC
- Worker, PostgreSQL ou Cellar en panne
- Exporter le jeu et quitter l'installation
- Rétention
- Dépannage sur Clever Cloud
- Coûts et démontage
Reality Bridge et connecteurs (16)
- Le Reality Bridge : ce que c'est
- Démarrage rapide
- Garanties
- Installer et lancer le Bridge
- Sauvegarde et restauration
- Plusieurs tenants
- Signaux et manifeste
- La ligne de commande du Bridge
- Vue d'ensemble des connecteurs
- Connecteur email
- Connecteur Telnet
- Connecteur SSH
- Connecteur Open Badges
- Le SDK des connecteurs
- Sécurité : Biscuit et signatures
- Dépannage du Bridge et des connecteurs
Contribuer (25)
- Bienvenue
- Préparer son poste de développement
- La boucle de développement
- Avant une pull request
- Conventions
- Écrire la documentation
- Architecture
- Visite du code
- Frontières d'import
- Quels tests tournent quand
- Tests de mutation
- Le cliquet de couverture
- La référence de qualité
- La CI expliquée
- Passes de terrain
- Mesures de performance
- Publier une release
- Paquets npm
- Décisions et ADR
- Gouvernance
- Pull requests des bots
- Contribuer avec des agents IA
- Politique de sécurité
- Code de conduite
- Licences et crédits