Repository navigation
FR Creer Reactions
English · Type : référence · Public : auteur · Contexte : dépôt du moteur, projet créé · Statut : prête · S'applique depuis : 4.3.0
Ce qui répond à l'action du joueur : une règle écrite, un texte Regarder, une conversation, une réaction par sorte, un refus, ou une réponse de repli. Cette page donne les champs d'une règle, l'ordre exact dans lequel le moteur cherche une réponse, et le verbe qu'utilise un double tap.
Une réaction dit : « quand VERBE arrive sur A (avec B, ou à B), si CONDITION, alors ces commandes ».
| Champ | Sens |
|---|---|
id |
Son id stable, obligatoire en schéma 3 (contrat d'identité). |
verb |
Un id de verbe du jeu : dans le modèle give, open, close, take, look, talk, use, push, pull. Une liste accepte plusieurs verbes. |
a |
La chose visée. Pour Utiliser/Donner à deux termes, c'est l'objet d'inventaire. Une liste = n'importe lequel. |
b |
La cible de « Utiliser A avec B » ou « Donner A à B ». Absent = action à un seul terme uniquement. |
if |
Condition facultative. La première règle dont la condition est vraie gagne : mettez les cas particuliers d'abord. |
do |
Les commandes à lancer. |
on: [
{ id: 'pull.stool', verb: 'pull', a: 'stool', if: { prop: ['stool', 'shelf'] }, do: [{ prop: ['stool', 'pulled'] }, 'Voilà. Un marchepied.'] },
{ id: 'tie.rope', verb: 'use', a: 'rope', b: ['hook', 'bucket'], do: [{ lose: 'rope' }, { set: 'tied' }, 'Noué.'] },
]Deux objets d'inventaire se combinent dans les deux sens : une règle a: 'piece1', b: 'piece2' marche aussi pour
« Utiliser pièce 2 avec pièce 1 » (seulement quand les deux sont dans le sac). Les règles valables partout (combiner
deux objets, par exemple) vont dans rules.on du jeu, pas dans une salle. Les règles de la salle passent avant celles
du jeu.
Les ids de verbes sont libres : les verbs du jeu les déclarent. Quatre ont un sens pour le moteur : look (les
textes Regarder), talk (les conversations, l'objet d'indices), give et use (deux termes : un objet d'inventaire,
puis une cible ; toucher un objet sans verbe choisi le prend pour Utiliser). Tout autre verbe ne passe que par les
règles écrites et les réponses de repli.
Le moteur cherche une réponse dans cet ordre, et s'arrête à la première trouvée
(src/engine/core/interactions.ts) :
- une règle de la salle (
on), puis une règle du jeu (rules.on), dont le verbe,a,bet la condition correspondent ; - Regarder sur une chose : le texte
lookde la salle pour elle, sinon, pour un objet d'inventaire, lelookde l'objet ; - Parler à une chose : à l'objet d'indices (quand il est dans le sac), les indices ; à un acteur qui a des sujets, le menu de conversation ;
- une réaction par sorte (
rules.kinds) : d'abord celle qui vise exactement cet id (target), puis celle par sorte (kind) ; - Donner à un personnage : sa réplique de refus (
refusesur sa fiche) ; - la réponse de repli du verbe (
rules.fallbacks,use2pour « Utiliser A avec B »), tirée au hasard, jamais deux fois la même de suite. Un verbe sans liste de repli prend la liste delook, sinon dit « … ».
// rules.ts
export const rules = {
fallbacks: {
look: ['Hmm. {item}. Rien de suspect. Pour l’instant.'],
take: ['Ce n’est pas à moi.', 'Trop lourd. Même pour moi.'],
use2: ['{item} avec {target} ? Ça ne marche pas. Mais ça valait le coup d’essayer.'],
// … un tableau par verbe : give, open, close, take, look, talk, use, push, pull, use2
},
kinds: [
{ verb: 'pull', kind: 'cat', say: 'Non ! On ne tire jamais la queue d’un chat.' },
{ verb: 'take', target: 'grandma', say: 'Grand-mère a déjà bien assez à porter.' }, // cible précise : passe en premier
{ verb: 'take', kind: 'person', say: 'Je ne peux pas porter {name}. Mais {name} pourrait me porter.' },
{ verb: 'use', item: 'stinky_cheese', kind: 'person', say: 'Non. Même moi, je ne suis pas si méchant.' },
],
on: [
{ id: 'combine.postcard', verb: 'use', a: 'left_half', b: 'right_half', do: [{ lose: 'left_half' }, { lose: 'right_half' }, { gain: 'postcard' }] },
],
};Dans les répliques de repli, de sorte et de refus, {item} est remplacé par le nom de l'objet, {target} par celui de
la cible (vide s'il n'y en a pas), {name} par le nom de ce qui est visé. {objet}, {cible} et {nom} sont les
trois mêmes sous leurs noms de la 4.0 : tout jeu écrit avec eux continue de marcher. Le item d'une réaction par sorte
la limite à un objet utilisé ou donné.
Garantie ·
fallback-order· référencée · portée vérifiée par son auteur (IA), pas relue Sans règle écrite, une réaction par sorte répond quand l'une correspond. Un objet donné à un personnage qui refuse reçoit son refus, pas la réponse de repli du verbe. Le reste reçoit la réponse de repli.
Quand une réaction par sorte et un refus correspondent tous deux à un don, la réaction par sorte répond.
Écrire la couche de repli. La plupart des clics ne tombent sur aucune règle écrite : ce qui leur répond, c'est la voix du jeu.
-
3 à 6 variantes par verbe dans
rules.fallbacks, plususe2. La démo en a deux ou trois ; visez plus haut. -
Écrivez-les dans le ton du personnage. Le
pushde Pixel : « Ça ne bouge pas. Il me faut un plus gros petit déjeuner. » Sonuse2: « Ça ne va pas ensemble. Comme les chats et les bains. » -
kindsrépond à toute une famille d'un coup : aucuncatne se laisse tirer, aucunepersonne se laisse porter. Unetargetprécise l'emporte sur unekind. -
refusepar personnage répond à tout Donner sans règle : Lou dit « Merci, mais mes poches sont pleines. Des affaires des autres. » - « Ça ne marche pas » n'est jamais acceptable. Ça n'apprend rien au joueur. Une réponse de repli doit être une blague, un indice sur ce que veut le héros, ou les deux (concevoir les énigmes).
Le mot désigne une seule idée, un effet qui n'arrive qu'une fois par partie, sur quatre choses : la commande
{ once: […], id } ne lance sa liste que la première fois ; once: true sur une option d'un choice ne la montre
qu'une fois ; once: true sur un écouteur (events) ne le déclenche qu'une fois ; un signal du monde extérieur
s'applique une fois par défaut (once: false le répète à chaque nouvelle livraison). Le moteur retient chacun dans la
sauvegarde, sous l'id stable de la chose.
Sur un téléphone, un simple tap marche jusqu'à une chose ; un double tap agit dessus sans choisir de verbe
(src/engine/core/default-verb.ts) :
- on passe une sortie (son premier verbe que le jeu possède) ;
- on parle à un personnage ;
- on regarde tout le reste.
Quand ce n'est pas le bon verbe, la chose nomme le sien :
hotspots: { cupboard: { name: 'placard', defaultVerb: 'open' } } (aussi sur un accessoire, un acteur, une sortie). Un
objet pris dans le sac sans verbe est donné à un personnage, et utilisé sur tout le reste ; la ligne de phrase dit
lequel avant le tap. Un verbe que le jeu n'a pas n'est jamais choisi. Le côté joueur : commandes.
fonction apparue en 4.2.4
Dans les classiques de LucasArts, un clic sur une porte avec le « Aller vers » par défaut y faisait passer le héros.
input: { exitOnTap: true } dans game.ts fait pareil : un simple tap sur une sortie, sans verbe choisi, y marche et
la passe à l'arrivée, avec le verbe du double tap (une sortie fermée dit sa réplique locked). Un verbe choisi
l'emporte toujours, un tap ailleurs pendant la marche redirige toujours le héros, et rien n'est passé ; le double tap
ne change pas. Une sortie peut dire autre chose : onTap: 'walk' la garde en simple marche dans un jeu qui a
l'interrupteur, onTap: 'go' la fait passer dans un jeu qui ne l'a pas
(exits: { path: { name: 'chemin', to: 'village', onTap: 'go' } }). Désactivé par défaut.
Limite ·
input-onlyexitOnTap,onTap,defaultVerbet les touches des verbes ne concernent que la saisie : ni les règles, ni le solveur, ni les sauvegardes ne les voient.
S'applique depuis la 4.4.0 · fonction apparue en 4.4.0
Une zone cliquable peut aussi dire onTap: 'go' : un simple tap y marche et agit à l'arrivée avec son defaultVerb.
Par exemple un rayon sans fin qui dit pourquoi on ne s'y engage pas. Sans cela, un tap sur une zone ne fait qu'y
marcher ; input.exitOnTap ne concerne que les sorties et n'y change rien.
{
"room": {
"id": "shop",
"name": "La boutique",
"decor": "decor/shop",
"hotspots": {
"aisle": { "name": "rayon", "defaultVerb": "use", "onTap": "go" },
"cupboard": { "name": "placard", "defaultVerb": "open" }
},
"look": { "aisle": "Des étagères à perte de vue.", "cupboard": "Un placard." },
"on": [
{ "id": "shop.use-aisle", "verb": "use", "a": "aisle", "do": ["Ce rayon ne finit jamais. Je n'y vais pas."] },
{ "id": "shop.open-cupboard", "verb": "open", "a": "cupboard", "do": ["Vide. Évidemment."] }
],
"hints": [{ "id": "shop.hint", "until": "never", "lines": ["Pas dans le rayon."] }]
},
"layout": {
"walk": { "area": [[20, 300], [620, 300], [630, 395], [10, 395]] },
"entries": { "default": [320, 360] },
"hotspots": {
"aisle": { "rect": [400, 120, 120, 180], "approach": [460, 320] },
"cupboard": { "rect": [80, 150, 90, 150], "approach": [125, 320] }
}
}
}
fonction apparue en 4.3.0
Sur ordinateur, les jeux LucasArts choisissaient un verbe au clavier : O pour Ouvrir, L pour Regarder. Le key d'un
verbe fait pareil : { id: 'open', label: 'Ouvrir', color: '#8fd3ff', key: 'o' }. La touche, en majuscule ou
minuscule et sans Ctrl, Alt ni Meta, choisit le verbe comme un tap sur son bouton (et le retire s'il est déjà choisi).
Elle ne fait rien quand le moteur est occupé, qu'une réplique est à l'écran, ou qu'une conversation, la carte, un
mini-jeu ou un menu couvre la scène. Le bouton souligne la première occurrence de la lettre dans son libellé et
l'annonce au lecteur d'écran (aria-keyshortcuts).
La touche se traduit avec le libellé (verb:open/key dans les locales : le c de Close est le f de Fermer).
npm run validate refuse une touche qui ne fait pas un caractère, Espace (elle fait avancer une réplique) et une
touche partagée par deux verbes, dans le jeu comme dans chaque traduction, et prévient quand le libellé ne contient
pas la lettre. Choisissez les lettres une fois les libellés écrits : « Pousser », « Prendre » et « Parler »
commencent tous par P, l'un d'eux prendra donc une autre lettre de son libellé. Sans key, pas de raccourci.
Avec settings: true, les réglages offrent une ligne « Verb keys » (ui.verbKeys) dans tout jeu dont les verbes ont
des touches, pour que le joueur puisse les couper, comme le demande le critère WCAG 2.1.4 pour un raccourci d'une seule
lettre (quelqu'un qui tape à la voix, ou qui frappe des touches par mégarde) ; npm run validate prévient des touches
sans menu de réglages. Rien ne se passe non plus pendant le générique.
-
on,rules.on,rules.kinds,rules.fallbacks,refuse,defaultVerb,onTap,input.exitOnTap,VerbDef.key. - Commandes, conditions, sorties, la référence du DSL, ADR 0006, le double tap.
Generated publication · publication générée — current documentation · documentation courante: quest'n'click 4.4.0 r1, documentation revision · révision de la documentation 8dc717c69acb62c4742b69c54a7e7dfb620f75d8.
Earlier versions and permalinks · versions précédentes et liens permanents: https://wanoo.github.io/quest-n-click/docs/
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 (17)
- Prérequis
- Installer depuis l'archive de la release
- Installer depuis npm, une fois publié
- 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.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