Repository navigation
EN Install Upgrade Notes 4 3
Français · Type: reference · Audience: author · Context: created project · Status: ready · Applies from: 4.3.0
What 4.3.0 "Hero Choice" and 4.3.1 changed, kept unchanged. 4.3.0 is the one minor that removed something: the
former names web-scumm…, aliases through 4.2.x (D47). A game that still says web-scumm runs
npx quest-n-click migrate once (Coming from web-scumm). The rest is optional for a game,
with three things to check after upgrading to 4.3.0: a literal {hero} or switch-shaped brace group in a text, the new
interface font on a phone, and, for a Bridge operator, the limits of each config.json.
The upgrade itself is Upgrade. The section numbers are those of the former
docs/en/UPGRADING.md, so "§39" still finds its section.
Nothing to change in a game's content: the content format only grows (ADR 0022, D49), schemaVersion stays 3, saves and the
save envelope are 4.2.0's, the logic fingerprint of a game that uses none of what follows does not move. The engine
installs from releases/download/v4.3.0/…. What is new, all optional (CONTENT_GUIDE, "Choosing the hero"):
-
A character variant may carry a
name: while it applies, the speech box, the transcript, the talk header and{name}in a fallback read it. A translation lists it (char:<id>/variants[<i>].name). -
Text switches and
{hero}, filled when a text is shown, after the translation:{hero}is the active hero's name,{form?knight=him|witch=her|*=it}the text listed for the flag's current value. In lines, choices, looks, hints, toasts, captions, item and object names and objective titles; the validator refuses them in room names, verbs, character and variant names,ui, the title, the map, the ending and minigame params. -
imgon a choice option: the option is a card, the image with itstextas the label. -
Voices by value: a line with a switch looks up
<id>~<flag>=<value>before its plain id (AUDIO.md). -
A key per verb (#203):
key: 'o'on a verb picks it at the keyboard, translated like the label; withsettings: truethe player can turn the keys off (ui.verbKeys, CONTENT_GUIDE, "A key per verb"). -
npm run linthashero-looks-default(info), and no longer callsaction-deada rule that only sets a flag a character's variant or a text switch reads.
A Bridge checks the limits of its config.json at start (4.3.0): an unknown name, or a value that is not an
integer of at least 0 (at least 1 for streamPage, bodyBytes and streamBufferBytes), stops it with the name
and the value; on a shared Bridge that is every tenant. Before upgrading, list each tenant's limits and compare them
with DEFAULT_LIMITS's names (bridge/src/config.ts):
node -e 'console.log(JSON.parse(require("fs").readFileSync(process.argv[1], "utf8")).limits ?? {})' <dir>/config.json.
The web-scumm names are gone (D47). Through 4.2.x the engine's former names were aliases; 4.3.0 removes them.
There is no web-scumm-<version>.tgz, create-web-scumm, web-scumm-bridge, web-scumm-connectors or
web-scumm-studio-server archive any more, no web-scumm, web-scumm-bridge, web-scumm-connector,
web-scumm-studio-server or web-scumm-studio-worker command, and web-scumm/content and the other old imports no
longer resolve. A game that switched to the new names (§38) has nothing to do. A game that still says web-scumm moves
like this, then npm run verify:
npm uninstall web-scumm
npm install https://github.com/wanoo/quest-n-click/releases/download/v4.3.0/quest-n-click-4.3.0.tgz
npx quest-n-click migratequest-n-click migrate renames, in every source of the project (node_modules, dist, public and hidden folders
left out), the imports web-scumm/… to quest-n-click/…; in tsconfig.json, the path web-scumm/* and the
node_modules/web-scumm/… targets; in package.json, the scripts' commands (web-scumm dev becomes
quest-n-click dev, web-scumm-bridge serve becomes quest-n-click-bridge serve). Any string that starts with
web-scumm/ in quotes is renamed, an import or not; web-scumm-save and the other format names are not. A
symbolic link out of the project, a web-scumm script beside a quest-n-click one, or a dependency on an old package
whose new one is not installed is said and left to you. migrate --check names what is left. The commands you type
change the same way: npx web-scumm … becomes npx quest-n-click …, and npx web-scumm-bridge,
npx web-scumm-connector, npx web-scumm-studio-server, npx web-scumm-studio-worker become
npx quest-n-click-bridge, npx quest-n-click-connector, npx quest-n-click-studio-server,
npx quest-n-click-studio-worker. By hand instead, from the project's folder, the imports in both quote styles in
.ts, .tsx, .mts, .cts, .js, .jsx, .mjs and .cjs files, names with spaces included (GNU and BSD grep
and sed alike), then tsconfig.json and package.json as §38 says:
grep -rl --null -E --include='*.ts' --include='*.tsx' --include='*.mts' --include='*.cts' --include='*.js' \
--include='*.jsx' --include='*.mjs' --include='*.cjs' --exclude-dir=node_modules --exclude-dir=dist \
--exclude-dir=public --exclude-dir='.*' "['\"]web-scumm/" * \
| xargs -0 sed -i.bak -e "s#'web-scumm/#'quest-n-click/#g" -e 's#"web-scumm/#"quest-n-click/#g'
find . -name '*.bak' -not -path './node_modules/*' -deleteA host of the Bridge, the connectors or the Studio Server installs the quest-n-click-… archives and calls the new
commands in its unit files and scripts. A game on a hosted Studio that still imports web-scumm/… no longer loads
(its health is not green and its writes are refused) until its owner runs the engine's upgrade
(POST /api/engine/migrate, STUDIO-SERVER). The upgrade renames its imports first, as a revision of its own judged
only by whether the game loads (and, if it loaded before, by no new validator error), never by the solver: a game that
cannot be finished yet gets its imports renamed and loads again; then the schema's migration, if one is due, is judged
as before and may still be refused (422, the rename kept). The rename is not undoable (its undo would bring back
imports that no longer resolve): take a backup first to go back. The formats keep their names:
saves, sessions, runs, the stores, the headers and WEB_SCUMM_* are unchanged (§38).
Check one thing: a 4.2 text that holds, literally, {hero} or a brace group shaped like a switch
({word?…=…}) is now filled when shown. npm run validate reports a switch-shaped group (a flag no command sets,
a malformed switch, or one in a text shown as written); a {hero} in a line is valid, so search for it
(grep -rn '{hero}' games/<id>). To keep the braces on screen, write them otherwise ([hero], or {word ? …} with a
space before the ?). A text with no such group shows exactly as before.
The interface font (#204). A game that sets no skin.fonts.ui now shows its dialogue, verbs and menus in
Galmuri11, a proportional pixel font, instead of DotGothic16; its size-adjust keeps the text at the same height, and
lines come out slightly narrower. Saves, sessions and runs are unchanged: the font is presentation, outside the
fingerprints. To keep the old look, set skin: { fonts: { ui: 'DotGothic16' } } in game.ts (a skin change: the
game's presentation fingerprint moves, so record its reference run again, if it keeps one). A game that already sets
skin.fonts.ui keeps its font; a character that font lacks now falls back to DotGothic16 (the Latin subset, then the
full font for Japanese) before 'Courier New'. Look at a room with dialogue and a choice after upgrading, on a phone:
a line that just fitted may wrap differently.
The Python tools (#213): the asset tools and a hosted Studio's processing worker use Pillow 13.0.0; run
python3 -m pip install -r requirements.txt again. Their output does not change (the sample game's images come out
byte for byte the same); a host that installs the worker from ops/studio/worker-requirements.lock gets the new wheel
by its sha256.
Applies from 4.3.1
Nothing to change: a game builds, plays and saves as on 4.3.0 (the same fingerprints, golden saves and reference
runs). The engine installs from releases/download/v4.3.1/…. What a game may notice:
-
Voices of a translation: when a translation adds a text switch its source line has not (
Prêt{form?witch=e|*=} ?forReady?),npm run voices -- importnow takes that language's clips by value,statusno longer calls them orphans, andnpm run validatewarns when one is missing. A game that worked around the refusal by filing those clips under the plain id can file them by value now. -
npm run solvefinds one winning path;npm run solve -- --provechecks every reachable state, every answer of an intro's choice included. A game whose heroes or paths must all reach the ending runs--prove. The witness's sentence now says "on one path"; a script that matched its old wording readsstatusfrom--jsoninstead.
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)
Start (6)
Play (9)
Install (17)
- Requirements
- Install from the release archive
- Install from npm, once published
- Install from the repository to work on the engine
- doctor: checking your machine
- Image toolchain
- Audio toolchain: ffmpeg, fluidsynth, Furnace, uv
- Upgrade
- Upgrade notes: 4.4
- Upgrade notes: 4.3
- Upgrade notes: 4.2
- Upgrade notes: 4.1
- Upgrade notes: v3
- Upgrade notes: v2 to v3
- Coming from web-scumm
- Package reference
- Install troubleshooting
Create a game (55)
- Your first game
- Layout of a created project and of the engine repository
- The working loop
- Content principles and the identity contract
- Rooms
- Geometry: placement, walk zones, masks, layers, camera
- Something is visible but unreachable
- Reactions
- Game commands
- Conditions
- Flags, variables and events: which to use
- Custom code
- Characters
- Items and inventory
- World map
- Dialogues
- Scripts and events
- Moving characters: patrols and walks
- Exits
- Chapters and objectives
- State and saves: persistent or temporary, renaming an id, migrations
- Staging: wide rooms and animations
- The stage: lights, particles, floors
- Skin and fonts
- Title and credits
- Heroes: several characters and hero choice
- Built-in minigames
- A custom minigame
- Translations
- Music in stems
- Sound effects
- Voices: per language and per hero
- Images: prompts, cutting sheets, transparency, scale
- Asset provenance
- The storyboard, source of truth
- Puzzle design
- Classic mechanics
- Review pages
- DSL reference
- Checking your game
- What the solver proves
- Solver options
- Playtests
- Remix
- Speedrun for authors
- The sealed ending
- Production template
- Example games
- Working with an AI
- Build and release a game
- Publish on GitHub Pages
- The static game on Clever Cloud
- Other static hosts
- Sub-path, cache and service worker, incomplete deploys, going back
- Testing on a phone over the LAN
Local Studio (24)
- The local Studio: overview and launch
- Edit a room
- Placement and stage
- Preview, apply, undo
- Storyboard
- Assets and cutting
- Check: validator, solver, critical path, heat, health, coverage
- Before and after captures
- Semantic diff
- Play and replay a session
- Rule explainer
- Language and objectives
- Voices and the heroes × languages matrix
- Map
- Notes
- Remix in the Studio
- Music
- The Assistant: bring your own key
- Demo mode and studio-apply
- Local and LAN security
- Studio API
- Local MCP: setting up each client
- MCP tools
- Studio troubleshooting
Team Studio (21)
- What runs where
- Concepts: revision, transaction, span, lease, preview, build
- Starting as an invited dev
- Working together day to day
- Roles and actions: the full matrix
- Invitations
- Managing members
- Write refused on the hosted Studio: stale base revision (409)
- Write refused on the hosted Studio: span locked (423)
- Recovering after a lost lease, a disconnection or a stale preview
- Comments
- Map and semantic diff
- Publishing builds
- Remote MCP
- The game in Git
- Upgrading the engine of a hosted game
- Hosted assets
- The server's command line
- Health and metrics routes
- Trying it locally with compose.yml
- Known limits
Clever Cloud (23)
- Clever Cloud: overview, cost and prerequisites
- Apps and add-ons
- Domains and TLS
- Keycloak
- Generic OIDC and GitLab
- Configuration
- First deployment
- Backups
- RPO and RTO
- Restore the Studio on a fresh installation
- Redeploys
- Upgrading the server and checking state after a migration
- Limits of going back
- Monitoring
- Security
- Rotating keys
- Recovering admin access
- Changing domain or OIDC provider
- Worker, PostgreSQL or Cellar down
- Exporting the game and leaving the installation
- Retention
- Clever Cloud troubleshooting
- Costs and teardown
Reality Bridge and connectors (16)
- The Reality Bridge: what it is
- Quick start
- Guarantees
- Install and run the Bridge
- Backup and restore
- Several tenants
- Signals and the manifest
- The Bridge's command line
- Connectors overview
- Email connector
- Telnet connector
- SSH connector
- Open Badges connector
- The connector SDK
- Security: Biscuit and signatures
- Bridge and connector troubleshooting
Contribute (25)
- Welcome
- Developer setup
- The dev loop
- Before a pull request
- Conventions
- Writing documentation
- Architecture
- Code tour
- Import boundaries
- Which tests run when
- Mutation testing
- The coverage ratchet
- The quality baseline
- CI explained
- Field passes
- Benchmarks
- Releasing
- npm packages
- Decisions and ADRs
- Governance
- Bot pull requests
- Contributing with AI agents
- Security policy
- Code of conduct
- Licences and credits