Repository navigation
FR Creer Routes
English · Procédure · Publiée, écrite et vérifiée par une IA, pas relue par une personne · S'applique depuis : 4.6.0
Donnez un itinéraire à n'importe quel personnage : marcher jusqu'à un endroit, attendre, passer une porte vers la salle suivante, et ainsi de suite, à l'horloge du monde, que le joueur regarde ou non. Le joueur peut le croiser, le suivre, lui parler ou profiter de son absence pour une énigme.
Public, contexte, et statuts de ce sur quoi repose la page
Public : auteur · Contexte : dépôt du moteur, projet créé
Un personnage qui fait sa tournée à travers plusieurs salles et continue hors champ. Il s'arrête quand le joueur lui parle, attend devant une porte fermée et reprend sa tournée après un détour que l'histoire lui impose. Les sauvegardes et les rejeux gardent l'endroit où il se trouve, et le solveur prouve que les occasions qu'il ouvre restent ouvertes.
- Un projet créé (
game/) ou le dépôt du moteur (games/<id>/). - À partir de la 4.6.0 « Routes » (ADR 0031). Sur un moteur plus ancien, un personnage ne change de salle qu'avec
moveActor(Faire bouger les personnages). - L'exemple jouable est
games/routes(« Lou's Rounds ») :GAME=routes npm run devdans le dépôt du moteur.
- Le personnage déclaré avec une
room(sa salle de départ) et une posewalk(Faire bouger les personnages). - Un acteur pour ce personnage dans chaque salle que la route traverse, et une zone de marche dans chacune (géométrie).
- Les sorties que prend la route, déclarées dans les salles (salles).
- La route s'écrit dans
game.ts(scripts) et les points dans les layouts, que vous placez dans l'éditeur (?edit=<salle>, ou l'onglet Salles du Studio). - Vérifiez depuis la racine du projet :
npm run validate,npm run solveetnpm run lintdans le dépôt du moteur, ounpx quest-n-click validate,solveetlintdans un projet créé.
-
Placez les points. Dans l'éditeur, ouvrez la salle, tapez un nom dans « Entry and route points », appuyez sur
« Add a route point » et faites glisser le point là où le personnage s'arrête. Le layout le garde sous
points. Une route ne contient jamais de coordonnées : elle nomme des points, et la géométrie reste dans le layout.
-
Écrivez la route dans
game.ts, parmi lesscriptsdu jeu (une route appartient au jeu, jamais à une salle).whoest le personnage,fromla salle de la première étape, et chaque étape a unidstable et fait une seule chose :-
walkvers un point de la salle où elle se trouve ; -
waitun nombre de millisecondes, avec unfaceou uneposefacultatifs ; -
exitpar l'une des sorties de la salle, vers la salle où elle mène, à son entrée.
scripts: [ { id: 'rounds', loop: true, route: { who: 'neighbor', from: 'hall', steps: [ { id: 'desk', walk: 'desk' }, { id: 'paperwork', wait: 3000, face: 'left' }, { id: 'out', exit: 'out' }, { id: 'stalls', walk: 'stalls' }, { id: 'inspect', wait: 2500, face: 'right' }, { id: 'to-kitchen', exit: 'kitchen_door' }, { id: 'hello', walk: 'hello' }, { id: 'chat', wait: 2500, do: [{ if: { room: 'kitchen' }, then: [{ say: ['neighbor', 'Evening, Grandma!'] }] }] }, { id: 'to-street', exit: 'windows' }, { id: 'home', exit: 'hall_door' }, ], }, }, ],
La salle de chaque étape se déduit de
fromet des sorties qui la précèdent. Une routeloopdoit finir dansfrom. -
-
Faites de son absence l'énigme. Les règles lisent où se trouve le personnage, comme pour tout personnage mobile :
{ actorIn: ['neighbor', 'hall'] }. Par exemple, la carte ne se fouille que pendant que Lou est sorti :if: { all: ['!cable_taken', { not: { actorIn: ['neighbor', 'hall'] } }] }.
-
Réagissez à une arrivée avec le
dode l'étape : il s'exécute une fois l'étape faite (arrivé, attendu, entré). Les commandes d'arrivée passent une route à la fois, jamais pendant l'action du joueur, et la route les attend. Protégez une réplique par{ if: { room: '…' } }quand elle n'a de sens que si le joueur est là.
-
Changez la routine depuis l'histoire.
-
{ suspendScript: 'rounds' }arrête la route là où elle en est (son étape, sa position, l'attente restante). -
{ resumeScript: 'rounds' }la reprend. -
{ startScript: 'detour' }démarre une autre route du même personnage et suspend celle qu'il suivait. - Une route marquée
manual: truene démarre que de cette façon. - Un détour doit ramener le personnage dans la salle de l'étape suspendue avant de la reprendre, par exemple avec une
dernière étape dont le
doest[{ resumeScript: 'rounds' }]. -
whileimmobilise une route tant qu'il est faux ; contrairement à un script, il ne la rembobine jamais.
-
-
Fermez-lui une porte. Une étape
exitne passe que si leifde la sortie est vrai. En attendant, le personnage attend devant la porte et la franchit au tick où elle s'ouvre. Un lien de marche dont leifest faux (stage.links) le retient de la même façon.
-
Vérifiez.
validatesignale un point, une sortie ou un acteur manquant dans la salle où l'étape se joue, une boucle qui ne revient pas àfromou ne progresse jamais, et deux routes automatiques pour un même personnage.solvelaisse passer le temps jusqu'au prochain arrêt d'une route (le choix « Route » dans un chemin).lintajoute les quatre codes ci-dessous.
Garantie ·
routes-clock-steps· référencée · exécutée sur95341b04ba59· portée relue Le monde avance par ticks entiers :nticks d'un coup laissent exactement le même état quenticks un par un, donc une partie ne dépend pas de la fréquence d'images.
Garantie ·
routes-offscreen· référencée · exécutée sur95341b04ba59· portée relue Une route continue que sa salle soit affichée ou non : après les mêmes ticks, le personnage est au même endroit et à la même étape.
Garantie ·
routes-hold· référencée · exécutée sur95341b04ba59· portée relue Un clic sur un personnage en route le retient du clic jusqu'à la fin de cette action ; les autres routes continuent.
Garantie ·
routes-shut-door· référencée · exécutée sur95341b04ba59· portée relue Une sortie fermée retient le personnage devant elle ; il la franchit au tick qui suit son ouverture.
Garantie ·
routes-suspend· référencée · exécutée sur95341b04ba59· portée relue Suspendue, une route garde son étape, sa position et l'attente restante ; une reprise hors de la salle de l'étape est refusée et signalée (route-resume-misplaced).
Garantie ·
routes-arrival· référencée · exécutée sur95341b04ba59· portée relue Deux commandes d'arrivée ne s'exécutent jamais en même temps, ni pendant l'action du joueur.
Garantie ·
routes-saves· référencée · exécutée sur95341b04ba59· portée relue Une sauvegarde faite en pleine marche, en pleine attente ou devant une porte fermée se recharge dans le même monde ; une sauvegarde d'avant la 4.6.0 se charge, et ses routes commencent à partir d'elle.
Garantie ·
routes-replay· référencée · exécutée sur95341b04ba59· portée relue Une session dont les actions chevauchent l'horloge du monde se rejoue jusqu'au même état.
Garantie ·
routes-solver· référencée · exécutée sur95341b04ba59· portée relue Le solveur laisse passer le temps jusqu'au prochain arrêt d'une route et prouve que les occasions qu'elle ouvre restent accessibles.
Limite ·
routes-no-timingLa preuve porte sur les arrêts des routes (quelle étape, quelle salle, retenue ou non), jamais sur le chronométrage. Deux chemins qui ne diffèrent que par l'endroit où un personnage se trouve au milieu d'une marche sont un seul état pour le solveur.
Limite ·
routes-frozenLe monde s'arrête dans le menu pause, pendant une cinématique, un mini-jeu ou une transition de salle, et quand la page est cachée. Rien n'est rattrapé ensuite : une heure en arrière-plan n'est pas marchée. Une image lente perd au plus 250 ms de monde.
Limite ·
routes-overlapUne session se rejoue exactement quand ses entrées ne se chevauchent pas. Une étape de script ordinaire encore en cours pendant que le joueur agit est rejouée après cette action, comme avant la 4.6.0.
- Dans le jeu, le personnage fait sa tournée, et on le trouve là où son horloge l'a mené quand on entre dans une salle.
-
npm run solvetermine, avec des étapes « Route » là où attendre compte, etnpm run solve -- --provedit que la fin reste accessible depuis chaque état. -
GAME=routes npm run e2e -- <url> --prodjoue l'exemple dans un navigateur : la retenue, le menu qui fige, l'absence, un rechargement en pleine tournée, la porte fermée.
| Symptôme | Cause | Solution |
|---|---|---|
no point "x" in the layout of "room" |
Le point est placé dans une autre salle, ou nulle part | Placez-le dans la salle où l'étape se joue (celle qu'atteignent les sorties qui la précèdent) |
<who> has no actor in room "room" |
Le personnage n'a pas d'acteur là où la route l'emmène | Ajoutez-lui un acteur dans cette salle et placez-le |
loop route "id" ends in "room", not in "from" |
Les dernières sorties ne ramènent pas au départ | Ajoutez les étapes de sortie jusqu'à from
|
two automatic routes for <who> |
Deux routes d'un même personnage démarrent avec le jeu | Marquez le détour manual: true et démarrez-le avec startScript
|
route-resume-misplaced dans solve ou lint
|
Une reprise alors que le personnage est dans une autre salle | Finissez le détour dans la salle de l'étape suspendue, puis reprenez |
route-script-conflict |
Un script ou une règle déplace le personnage (walk, place, moveActor) alors que sa route peut tourner |
Suspendez d'abord la route, reprenez-la quand le personnage est revenu |
-
game.ts(scripts) etlayout/<salle>.json(points). - Une sauvegarde gagne
world(l'horloge, en ticks) et, pour chaque route,scripts.<id>.route(l'attente restante, retenue devant une porte, commandes d'arrivée en attente) etpaused. - Une session enregistre les ticks du monde à chaque point de synchronisation d'une entrée (
wt), et deux entrées :{ world }et{ routeDo }.
- Retirer une route est un changement de contenu comme un autre. Une ancienne sauvegarde laisse le personnage où il
était, et une sauvegarde dont l'étape de route a disparu abandonne l'état de cette route au chargement
(
save adjusted after a content update). - Pour renommer une étape, utilisez
renameScriptStepdans une migration (État et sauvegardes).
-
docs/dev/adr/0031-npc-routes.md,docs/dev/PLAN-4.6-ROUTES.md -
src/engine/core/world.ts(l'horloge, chargée par chaque jeu),src/engine/core/route-runtime.ts(les routes, chargées seulement par un jeu qui en a),src/engine/core/nav/walk.ts(la recherche de chemin),src/engine/dom/world-loop.ts(les images et le gel) -
src/engine/tools/validate/routes.ts,src/engine/tools/lint-routes.ts -
games/routes/(l'exemple),tests/route-runtime.test.ts,tests/route-solve.test.ts
Generated publication · publication générée — current documentation · documentation courante: quest'n'click 4.6.0 r1, documentation revision · révision de la documentation 95341b04ba5991ace3b1a885e31250bc080fdb21.
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 (19)
- 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.6
- 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 (56)
- 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
- Routes : la tournée d'un personnage à travers les salles
- 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