CréerGuidePour auteursS'applique de 4.2.5
Construire et publier un jeu
This page in EnglishCette page sur le wiki GitHub
npm run build fait d'un jeu un dossier statique, dist/, que n'importe quel hébergeur web sait servir : le jeu, ses
assets, son service worker et ses licences. Une construction de release ajoute les contrôles qu'un jeu doit passer
avant que des gens y jouent : provenance verrouillée, budgets, traductions, voix, playtests et preuve exhaustive. Cette
page dit ce que vérifie chaque commande, dans quel dossier elle se lance, et quoi regarder avant d'envoyer le lien.
Ce que vous obtenez
Un dossier dist/, vérifié fichier par fichier, prêt à téléverser : une application web installable (PWA) qui se joue
hors ligne après la première visite, dont chaque fichier est recensé avec sa licence dans dist/licenses/.
Contexte et versions
Le même jeu se construit à deux endroits, avec des commandes différentes :
Projet créé (quest-n-click create) | Dépôt du moteur (games/<id>/) | |
|---|---|---|
| Construction courante | npm run build | npm run build |
| Construction de release | npm run release | npm run verify:release après npm run build |
| Release qui peut être vendue | npm run release -- --commercial | npm run verify:commercial |
| Preuve exhaustive | comprise dans npm run release | npm run prove:game |
| Fin scellée | indisponible (seal n'est pas une commande de quest-n-click) | npm run seal, npm run check:spoilers |
Servir dist/ | npm run preview (en local seulement) | npm run preview, ou npm start (toutes interfaces, $PORT) |
La page vaut à partir de la 4.2.5, quand la commande est devenue quest-n-click (avant, web-scumm). Le projet créé et
ses commandes build et release existent depuis la 3.9.0 ; npm start est un lanceur Node depuis la 4.1.8.
Prérequis
- Node 22.12 ou plus récent, le projet installé (
npm installdans un projet créé,npm cidans le dépôt du moteur). Voir Prérequis. - Python 3 avec les paquets de
requirements.txt(Pillow d'abord) :npm run assetstransformeart/etaudio/enpublic/assets, et lebuildd'un projet créé le lance à chaque fois. Dans un projet créé, le fichier estnode_modules/quest-n-click/requirements.txt. - ffmpeg quand le jeu a des sons, des musiques ou des vidéos à encoder, et pour une release quand le jeu déclare une
musique en stems (
validate --releaseles mesure avec ffprobe). - Un jeu qui passe ses vérifications : Vérifier son jeu. La construction les relance et s'arrête à la première qui échoue.
Où lancer les commandes
- « Dans le projet créé » : le dossier fait par
quest-n-click create, celui qui contientgame/etpackage.json. - « Dans le dépôt du moteur » : le clone de
wanoo/quest-n-click. Le jeu construit est celui que nommeGAME, sinon celui choisi parnpm run game, sinonpackage.json→config.game, sinondemo.
Étapes
-
Préparer les assets quand des images ou des sons ont changé.
# dans le dépôt du moteur (public/assets y est commité : commitez ce que la commande écrit) npm run assetsDans un projet créé,
public/assetsn'est pas commité (son.gitignorele liste) etnpm run buildlanceassetslui-même.
-
Construire.
# dans le projet créé npm run buildElle enchaîne, et s'arrête au premier échec :
assets;verify(validation, solveur, état des traductions, lint, playtests) ; la construction Vite dansdist/; puis le contrôle que chaque fichier dedist/est recensé.# dans le dépôt du moteur npm run buildElle lance
check(types, tests Node) puisbuild:game:verify:game(validation, solveur, solveur par chapitre, variantes, état des traductions, lint, playtests), la construction Vite,verify:dist,check:spoilersetaudit:assets.
-
Passer les contrôles de release avant une sortie publique.
# dans le projet créé npm run release # ou : npm run release -- --commercialreleaselanceassets,verifyet la construction, puis :validate --release(le verrou de provenance, les placeholders, les ids),weight --release(ce qu'un téléphone télécharge, face auxassetBudgetsdu jeu),i18n status,voices check --release,playtests --strict,solve --prove(chaque état atteignable),solve-reality, et avec--commercialvalidate --commercial --errors(aucune exception, aucun placeholder, aucune licence non commerciale) ; enfin le contrôle dedist/.# dans le dépôt du moteur npm run verify:release # ou : npm run verify:commercial npm run prove:gameLes images du modèle sont des placeholders : une release les refuse tant que chaque fichier n'est pas remplacé, relu et verrouillé (
npx quest-n-click provenance --lockdans un projet créé,npm run provenance -- --lockdans le dépôt du moteur). Voir Provenance des assets.
-
Sceller la fin, seulement pour un jeu à fin scellée, dans le dépôt du moteur : sceller la vraie issue, construire, commiter, puis déployer. Toute la procédure est dans La fin scellée.
# dans le dépôt du moteur, games/<id>/private/ending.config.ts rempli npm run seal -- --outcome=<key> npm run build
-
Téléverser
dist/chez un hébergeur statique (section suivante), puis jouer la version en ligne.# dans le dépôt du moteur : joue le jeu déployé jusqu'à la fin, dans un navigateur à taille de téléphone node scripts/e2e.mjs https://<votre-site>/scripts/e2e.mjsn'existe que dans le dépôt du moteur ; dans un projet créé, jouez le site en ligne à la main jusqu'à la fin.
Ce que livre la construction
npm run build vérifie les types (dans le dépôt du moteur), lance les tests, assemble et audite le résultat. On
obtient une PWA :
- le service worker met en cache l'application de base (code, styles, la page, les polices de la page, les icônes) dès l'installation ;
- les images et les sons sont mis en cache au premier usage, et le moteur réchauffe en tâche de fond le lieu courant, les lieux à une sortie et leur audio ;
- par défaut (
GameDef.offline: 'full'), il télécharge ensuite le reste du jeu pendant les temps morts, si bien que le jeu entier se joue hors ligne après la première visite ; avecoffline: 'nearby', un lieu jamais visité ni réchauffé peut encore demander le réseau. Les lieux ne sont jamais tous téléchargés avant que le jeu démarre : la première visite reste légère.
Le menu pause dit au joueur si le jeu entier est en cache. Le détail est dans Sous-chemin, cache et service worker.
Chaque construction finit par retirer de dist/assets les fichiers qui ne sont pas à ce jeu et par écrire
dist/licenses/ : la LICENSE du moteur, LICENSE-ASSETS, CREDITS.md tiré de la provenance du jeu,
THIRD_PARTY_NOTICES.txt et assets-manifest.json (pour chaque fichier : chemin, auteur, source, licence, SHA-256 et
statut). Le contrôle qui suit refuse tout autre fichier dans dist/, ainsi qu'un fichier verrouillé ou une notice qui
manque.
Déployer
dist/ est statique : n'importe quel hébergeur statique le sert.
- GitHub Pages : un workflow construit avec
BASE_PATH=/<dépôt>/et déploiedist/. Pour un projet créé, qui n'a pas de workflow, copiez celui de Publier sur GitHub Pages. - Clever Cloud : une application Node qui construit au déploiement et sert
dist/; voir Le jeu statique sur Clever Cloud. - Netlify, Cloudflare Pages, nginx, un bucket… : Autres hébergeurs statiques.
Sous un sous-chemin (https://<utilisateur>.github.io/<dépôt>/), construisez avec BASE_PATH=/<dépôt>/ ; à la racine
d'un domaine, pas de BASE_PATH. Tous les chemins (scripts, styles, manifeste, icônes, service worker, fichier de la
fin scellée) le suivent :
# dans le projet créé ou le dépôt du moteur : la même construction que Pages, en local
BASE_PATH=/my-repo/ npm run buildCe qui casse sous un sous-chemin, avec le cache ou avec un site à moitié téléversé : Sous-chemin, cache et service worker, déploiement incomplet, retour arrière.
Dans le dépôt du moteur, games/<id>/private/ (photos, planches brutes, configuration de la fin scellée) n'est jamais
envoyé : .gitignore l'exclut, et rien de ce dossier n'est copié dans dist/. Le .gitignore d'un projet créé ne
liste que node_modules, dist, .cache et public/assets : gardez les fichiers privés hors de game/, ou
ajoutez-les-y.
Résultat attendu, et comment le vérifier
- La commande se termine sans erreur et
dist/contientindex.html,sw.js,manifest.webmanifest,assets/,icons/,fonts/etlicenses/. npm run previewle sert surhttp://127.0.0.1:4173/: jouez-y avant de téléverser.- Après le téléversement, jouez le site en ligne jusqu'à la fin sur un vrai téléphone, en paysage ; ouvrez le menu pause et attendez « complete » sur sa ligne « Offline » (ou sa traduction) avant de tester hors ligne.
- Les dernières vérifications avant de partager le lien (un vrai téléphone, quelqu'un d'autre qui joue sans aide, la fin scellée) sont dans Vérifier son jeu.
Erreurs fréquentes
| Symptôme | Cause | Correction |
|---|---|---|
python3 introuvable, ou No module named 'PIL' | L'étape des assets demande Python 3 et Pillow | pip install -r node_modules/quest-n-click/requirements.txt (projet créé) ou pip install -r requirements.txt (dépôt du moteur) |
provenance.lock.json › missing: a release ships the files that were reviewed | Pas encore de verrou | Relire les assets, puis les verrouiller (étape 3) |
Un placeholder refusé par validate --release | Les images du modèle sont toujours là | Les remplacer, ou les nommer dans releaseExceptions avec une raison (refusé par --commercial) |
audio.scores › ffprobe not found | Une release mesure les stems | Installer ffmpeg, puis npx quest-n-click doctor |
Un fichier de dist/ non recensé | Un fichier égaré dans public/, ou un asset d'un autre jeu | Le retirer, ou le déclarer (un fichier de données que le jeu nomme) |
Une page blanche une fois en ligne, sous /<dépôt>/ | Construit sans BASE_PATH | Sous-chemin |
Fichiers ou données modifiés
dist/: vidé et réécrit à chaque construction (non commité).public/assets/et.cache/refs.json: écrits parassets(commités dans le dépôt du moteur, pas dans un projet créé).games/<id>/data/(dépôt du moteur) : le fichier de la fin scellée, écrit parseal.- Rien dans
node_modules/quest-n-click: le moteur est lu, jamais écrit.
Revenir en arrière
Une construction ne change rien qu'on ne puisse reconstruire : supprimez dist/ et relancez-la. Pour remettre en ligne
une version précédente, déployez la construction d'un commit précédent ; ce que font alors les caches et les
sauvegardes des joueurs est dans Retour arrière.
Références
cli/quest-n-click.mjs: ce que lancentbuildetreleasedans un projet créé.package.json:build,build:game,verify:release,verify:commercial,prove:game,startdans le dépôt du moteur ;scripts/start.mjs.tools/dist.ts: ce quedist/peut contenir ;tools/validate.ts: les contrôles de release et commerciaux.vite.config.ts: la construction et le service worker.- Scripts npm, Le paquet.