Repository navigation
EN Studio Placement
Français · Type: how-to · Audience: author · Context: local Studio · Status: ready · Applies from: 4.2.1
The local Studio · contract: stable · verified by CI (support matrix of 4.4.0, 2026-10-23): Chromium end to end (the Studio's checks); Windows: the unit suite only · automated checks: jobs
e2e,windows; CI plane2e,windows; 2 test files · people's passes:studio-hero-matrixnot run (#238) · known limits:stage-save-blocked
Where things stand in a room (zones, feet, heights, approach points, the walkable area, depth scale, entries) and the room's stage geometry (layers, masks, walk zones and their links) are placed with the mouse, never typed by hand.
A room whose layout/<room>.json holds every place the room needs, set by dragging in the engine's own view, and a
stage (layers, occlusion masks, walk zones, links between them) the validator accepts.
The placement editor runs on any dev server: in the Studio's Rooms tab, or alone at ?edit=<room> on the game
(npm run dev). The stage editor is the Rooms tab's. True from 4.2.1 (a saved layout is one operation of the game's
journal); the actorGap setting below from 4.2.4.
- The Studio running (overview), or
npm run dev. - Every entity declared in the room file (Edit a room); the editor offers a place to those the layout lacks.
In the engine repository or the created project, on your machine. The editor itself is in the browser.
Geometry lives apart from logic, in games/<id>/layout/<room>.json, and is never typed by hand. Three ways:
-
In the Studio: the Rooms tab shows the room with the placement editor on top (it is the page
/?edit=<room>&at=<checkpoint>in an iframe). Or in the game alone: start the dev server and open the room's editor.# in the engine repository or the created project npm run dev # then open http://localhost:5173/?edit=<room>
-
On a phone without the dev server: publish a drag-and-drop page, place things on it, and bring the result back.
# in the engine repository npm run page:placement npm run import-layout <file>
- Drag, then Save the layout (the gestures below). In the Studio, a placement in progress is saved before any other save of the room.
On start, the editor loads the first checkpoint located in that room; if there is none, it starts from a fresh state, without playing an arrival script. All coordinates are logical (640 × 400).
| Gesture | Effect |
|---|---|
| Drag a zone | Move it, with its approach point |
| Drag a corner | Resize the zone |
| Drag a foot point (circle) | Move a prop or a character, with its approach point |
| Drag the square above the foot, or scroll | Set the height |
| Drag a small circle (filled or hollow) | Place the approach point: where the hero goes before acting |
| Drag a vertex of the walkable zone or a hole | Move it |
| Double-click an edge of the walkable zone | Add a vertex |
| Alt-click a vertex | Delete it; on a hole reduced to 3 vertices, delete the hole |
| Drag an orange depth-scale line | Change its depth (y); the scale factor is set in the panel |
| Drag a pink triangle | Move an entry point |
The editor's panel:
-
Save the layout: writes
games/<GAME>/layout/<room>.json, coordinates rounded to the unit; the page then reloads with the saved file. - Reload (undo): discards unsaved changes.
- hidden zones: also shows zones and props whose visibility condition is false (dashed).
- Selection: the touched element and its values.
- To place: one button per hotspot, prop or actor defined in the room but missing from the layout; it creates it at the centre, ready to be moved.
- Walkable zone: create the zone, add a hole.
- Depth scale: create the scale, set the back and front factors.
-
Entries: add an entry point by name (
defaultis the one used by default). - Room width: the logical width of a wide room (640 = no scrolling) and a camera slider to look around while placing.
- Walk zones folder: makes the single walk polygon a zone, adds zones (holes, zoom) and links between them (mode, duration, one way).
- Stage folder: each layer's depth, parallax, blend and opacity; occluders drawn as polygons (depth, feather, invert); lights and particle areas placed. Handles: drag; double-click a zone edge to add a vertex; Alt-click one to remove it.
For a prop with a per-state position (states in the layout, a pulled-out stool for instance), the editor edits the
variant of the state shown.
Inside the Studio the editor runs in an iframe and talks to the page with postMessage (same origin only). In an
iframe its panel starts folded. It sends { source: 'web-scumm-editor', room, type } messages: ready (with
missing, the entities that have no place yet), select (key such as prop:lamp, hs:door, actor:grandma,
plus kind and id for those three), dirty (unsaved changes) and saved (ok, error). It accepts
{ source: 'web-scumm-studio', type } messages: select (kind, id), create (gives a place to an entity the room
declares but the layout lacks, optionally at at) and save. On the dev server the editor writes the layout through
the Studio's API (PUT /__studio/api/room/<id>/layout); in the demo it keeps it as a patch (Demo mode).
Under the room sheet of the Rooms tab, the stage editor shows the backdrop with the occlusion masks (red), the walk zones (green) and the links between zones.
- Set each layer's depth, parallax, opacity and blend in its fields. Draw a mask or Draw a zone, click its
corners on the backdrop, then Close the polygon (a polygon that closes no surface is not kept). Link them
joins two zones by a stairs, ladder, jump, teleport or walk link, placed by two clicks. Save stage writes this
geometry (
layers,occluders,walkZones,walkLinks) over the room's layout once the placement view is saved.
Limit ·
stage-save-blockedSave stage stays off while a mask closes no surface or a zone has no link: the validator refuses both too (src/engine/tools/validate-stage.ts).
Fields the engine reads: on a prop (and in each of its states) rot (degrees, clockwise, pivot at the feet), flip
(horizontal mirror), flipV (vertical mirror: the image sits below the feet line, as on the placement page), z
(forced layer); a field missing from a state falls back to the prop's own. On an actor, z forces their layer
(otherwise it follows their feet). On the room, floor (default 395) is the bottom of the floor: a computed approach
point never goes lower.
An actor with no approach point in the layout is reached from the side facing the middle of the room, 44 units away
whatever the characters' size. The whole layout format: Geometry.
Applies from 4.2.4
Tall characters who gesture as they talk can end up with a hand in each other's head. Set actorGap on the game
(for example 0.8): the distance becomes that share of the two characters' mean height (height of the hero and of
the character, or the actor's h in the layout), times the depth scale where the character stands. An approach
point in the layout still wins, for a character who needs the other side.
After Save the layout the page reloads with the saved file and the thing stays where you left it.
npm run validate (or the Check tab) reports no geometry error, and the solver still reaches the end.
| Symptom | Cause | Fix |
|---|---|---|
| An entity is missing from the view | It is declared in the room but has no place in the layout | To place, then drag it |
| Save stage is greyed out | A mask closes no surface, or a zone has no link | Close the polygon, or link the zone |
| Something visible cannot be reached | Its approach point is outside the walkable area | Something is visible but unreachable |
games/<id>/layout/<room>.json only (in a created project, game/layout/<room>.json).
Before saving: Reload (undo). After: the Studio's Undo (one step per save), or git checkout -- games/<id>/layout/<room>.json.
- Geometry: placement, walk zones, masks, layers, camera, Dev URL parameters.
-
src/studio/rooms-stage.ts,src/studio/rooms-bridge.ts.
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