Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
c162c20
[fix] 30 P0: the pointer-capture throw in play (~100 errors on a Ques…
AlexZ005 Sep 22, 2026
10e71fd
[feat] author-kit p0: primitives, light kinds, physical/toon material…
AlexZ005 Sep 22, 2026
688dc40
[fix] 30 P0: console hygiene - the PCF shadow warning, the router pus…
AlexZ005 Sep 22, 2026
4b1e7ed
[feat] 30 P1: edit and interact — two editor click modes, click handl…
AlexZ005 Sep 22, 2026
bafc419
[feat] author-kit p1: a custom sky — gradient background, fog, ground…
AlexZ005 Sep 22, 2026
665e68c
[feat] 30 P2: select-through and click-cycle in the editor pick
AlexZ005 Sep 22, 2026
5b09954
[feat] 30 P3: every module's content in the object list — the Module …
AlexZ005 Sep 22, 2026
0da7522
[feat] 30 P1: the editor stops masquerading as the running game
AlexZ005 Sep 22, 2026
c87fbb4
[feat] author-kit p2: game cards rendered with the game's own look, o…
AlexZ005 Sep 22, 2026
86d4ee0
[feat] 30 P4: api.pointerRay() is the crosshair ray under a pointer lock
AlexZ005 Sep 22, 2026
713aaba
[docs] author-kit p3: the def schema, every field one line each
AlexZ005 Sep 22, 2026
7745a0c
[feat] 30 P2: Test play, and the round resets when the last player le…
AlexZ005 Sep 22, 2026
7484009
[feat] 30 P3: free-cursor games, and no editor grid in play
AlexZ005 Sep 23, 2026
dd59c8b
[feat] 30 P4: api.storage, and the Store Value / Stored Value nodes
AlexZ005 Sep 23, 2026
11b1afc
Merge origin/feat/30-author-kit into feat/30-core-games
AlexZ005 Sep 23, 2026
2e0bd74
Merge origin/feat/30-game-flow into feat/30-core-games
AlexZ005 Sep 23, 2026
39f6671
[feat] 30 visuals-core p0: towers finished, and it remembers your bes…
AlexZ005 Sep 23, 2026
7536ef9
[feat] 30 visuals-core p1: stars room is a space room with a start sc…
AlexZ005 Sep 23, 2026
ecb1429
[feat] 30 visuals-core p2: jam room is a game
AlexZ005 Sep 23, 2026
f641be1
Merge feat/30-author-kit (#240) into feat/1.17
AlexZ005 Sep 23, 2026
e88a31e
Merge feat/30-game-flow (#241) into feat/1.17
AlexZ005 Sep 23, 2026
4ba12f9
Merge feat/30-editor-modes (#239) into feat/1.17
AlexZ005 Sep 23, 2026
0b57079
Merge feat/30-core-games (#242) into feat/1.17
AlexZ005 Sep 23, 2026
e5bab0f
[fix] integrate: pointerRay asks the one playCursor leaf; baseline ra…
AlexZ005 Sep 23, 2026
b56743e
[fix] integrate: api.editorMode() for modules; flyTo(…, 0) cannot par…
AlexZ005 Sep 23, 2026
1302727
[fix] integrate: the game suites follow the new games; the review not…
AlexZ005 Sep 23, 2026
2ea91c3
[docs] 1.17.0 "Games that look finished": changelog, CLAUDE.md, MODUL…
AlexZ005 Sep 23, 2026
5de8a84
[feat] 30b P0: game sounds and game music (C5) - procedural sfx set, …
AlexZ005 Sep 23, 2026
552d090
[feat] 30b P1: haptics (C4) - silent in Edit, api.hapticPattern, tap/…
AlexZ005 Sep 23, 2026
f47d9f2
[feat] 30b P2: effects and announce (C6) - pooled particle bursts, ap…
AlexZ005 Sep 23, 2026
616d6d2
[fix] 30b P0: the one-eye light helper — helpers leave three's XR eye…
AlexZ005 Sep 23, 2026
4b46f71
[feat] 30b P1: Interact and Play draw no editor scaffolding
AlexZ005 Sep 23, 2026
8677f38
[fix] 30b P2: grips by mode — Edit moves the world in game scenes, In…
AlexZ005 Sep 23, 2026
35079f9
[feat] 30b P3: walk like a game — Interact collides, falls and climbs…
AlexZ005 Sep 23, 2026
a09a247
[feat] 30b P4: games enter Interact in VR, left Y switches modes, and…
AlexZ005 Sep 23, 2026
af38e55
[fix] 30b P5: module content follows the VR world (Untangle's dots sp…
AlexZ005 Sep 23, 2026
57a623f
[feat] 30b P3: the game UI in VR (C2) - the HUD menu as a world board…
AlexZ005 Sep 23, 2026
fbf517d
[feat] 30b P4: hold the trigger and sweep (C3) - tip and laser sweep …
AlexZ005 Sep 23, 2026
e89aed5
[docs] 30b P5: MODULES.md - game feel (sound, music, haptics, effects…
AlexZ005 Sep 23, 2026
ee0378a
[docs] 30b P5: refresh static/llms-full.txt from MODULES.md (npm run …
AlexZ005 Sep 23, 2026
770f93e
[fix] 30b: the first burst of a session was lost; the timing-bound ch…
AlexZ005 Sep 23, 2026
da87d8a
Merge origin/feat/30b-vr-modes into feat/30b-core-games (on top of fe…
AlexZ005 Sep 23, 2026
8b604de
[feat] 30b core-games P0: game feel as flow nodes - announce, game so…
AlexZ005 Sep 23, 2026
accd772
[feat] 30b core-games P1: towers rings are milestones, stars room lig…
AlexZ005 Sep 23, 2026
4602922
[feat] 30b core-games P2: the jam room is a vr cockpit - every instru…
AlexZ005 Sep 23, 2026
9fb5c7c
[fix] 30b core-games P3: what the shots showed - no banner over a res…
AlexZ005 Sep 23, 2026
508a89f
[feat] 30c-levels p1: kit references, a scene spawn point, and a scen…
AlexZ005 Sep 23, 2026
43f95d5
[feat] 30c-levels p2: three walkable general-tab levels built from th…
AlexZ005 Sep 23, 2026
7f46cfe
Merge feat/30b-vr-modes (#244) into feat/1.17
AlexZ005 Sep 23, 2026
496460f
Merge feat/30b-vr-play (#245) into feat/1.17
AlexZ005 Sep 23, 2026
c94a6f1
Merge feat/30b-core-games (#246) into feat/1.17
AlexZ005 Sep 23, 2026
46b48ed
Merge feat/30c-level-templates (#247) into feat/1.17
AlexZ005 Sep 23, 2026
32bab84
[fix] integrate: a move whose rotation is Euler.toArray() lands on th…
AlexZ005 Sep 23, 2026
af0e619
[fix] integrate: placing a kit piece is undoable, by reference
AlexZ005 Sep 23, 2026
7b9f827
[fix] integrate: the suites follow the round-2 games; the level defs …
AlexZ005 Sep 23, 2026
c086a03
[fix] integrate: the character capsule is a query shape, never an obs…
AlexZ005 Sep 23, 2026
4226a5d
[docs] 1.17.0 round 2 + 3: changelog, CLAUDE.md, MODULES.md
AlexZ005 Sep 23, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
125 changes: 125 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,131 @@
per release, newest first. HTML comments like this one are stripped before
rendering, so maintainer notes stay out of the user-facing window. -->

## 1.17.0 — Games that look finished 🎨

### 🖐️ Dragging, clicking and selecting that do what you meant

- 🖐️ **Dragging in games no longer throws on Quest.** Every press in play logged a
`setPointerCapture` InvalidStateError (about a hundred in one Untangle session) and leaving play
could end in "Something went wrong": the editor's orbit controls stayed mounted in play and
captured the pointer under a pointer lock. They stand down while you play now, and the capture
is guarded.
- 🔀 **Edit and Interact.** A new cell at the end of the bottom bar (or the **I** key) switches
the editor between Edit — every click selects, so every object can be moved — and Interact,
where clicks and drags work the way they do in play (piano keys play, crates carry) without
starting the game. Module click handlers say which modes they run in; by default a game piece
answers in Interact and Play and an Edit click selects it.
- 👻 **Click through glass.** A see-through wall or a shell marked "Click-through in the viewport"
(Inspector ▸ Object) no longer steals the click from what is behind it, and clicking the same
spot again (after the double-click window) cycles down through everything under the cursor.
- 🧩 **Every module's content is in the object list.** A new "Module content" section lists the
pieces a module builds outside the scene (the Untangle board, a piano, a dungeon) by name;
click a row to frame it, hide it locally, or open the module's toolbox.

### 🎮 Games start when you press Start

- ▶️ **Test play.** A game no longer paints its menu over the editor with live buttons. A small
"Game · menu" chip says the scene is a game, and ▶ Test play resets it to its menu, enters
Play and puts the Start screen in front of you (also on the play button's right-click menu).
The HUD editor's eye still previews the screens, inert.
- 🔁 **The round resets when the last player leaves.** Alone, leaving Play returns the game to its
menu at once; with others, when the last player has been out for ten seconds.
- 🖱️ **Free-cursor games.** A scene can play with the real mouse cursor and no pointer lock
(Untangle and the Jam Room do): the cursor aims, clicks fire On Click, press-drag carries. The
editor grid no longer shows in Play.
- 💾 **Games remember things.** `api.storage` for modules and the new **Store Value** / **Stored
Value** nodes keep a best score or your unlocked levels on this device (never shared, never
saved into the scene). The HUD action "Save best score" wires one up.
- 🔇 **A quieter console.** The PCFSoftShadowMap deprecation, the router pushState warning and
rapier's init warning are gone.

### 🎨 Seven games that look finished

- 🏗️ **Towers remembers your best height** — and looks finished: a sky, a tiled floor, wooden
crates, glowing height rings, turning stars; Round over shows this round and your best.
- 🌌 **Stars Room is a space room** — a starfield behind glass, crystal stars, a start screen
with Start round or Free play, a two-minute round, your best round saved.
- 🎸 **Jam Room is a game** — a small studio; press Start, then ▶ on the Transport, and keep the
band going for eight bars. Played with the mouse, your best tempo saved.
- 🏟️ **Football** is a floodlit glass stadium with a live scoreboard.
- 🏰 **Dungeon Realms** is torch-lit stone under a vault, with glowing gems, animated portals and
a Start menu you can click.
- 🌅 **Waves** is a sunset arena with a crystal tower that dims with your health, portals,
readable enemies and hit flashes.
- 🪢 **Untangle, finished:** a real drag (press-drag-release, or click then click), a redrawn
board, 30 levels per mode that unlock as you solve them (your progress stays on this device,
with a Reset), and a new 3D mode — untangle the graph around a globe.
- Every game has a Start screen, Pause on **P**, and a restart.

### 🥽 Games in a headset

- 🎮 **Play in VR puts you in Interact.** A game opens in Interact in a headset: your grips grab
and knock things instead of the world, the stick WALKS you (walls stop you, gravity holds you,
small steps climb), and there is no flying or teleporting unless the scene allows it. The left
**Y** button switches to Edit and back (a tick in your hand and a small wrist label say which),
and the game can put you on its start spot. In Edit, grips move and scale the world again —
in game scenes too.
- 👁️ **No more light helper in one eye.** Editor helpers drew into the left eye only in a
headset. Now they are in both eyes in Edit and gone in Interact and Play — together with the
grid, collider wireframes and selection outlines.
- 📋 **The game menu in VR.** A game's menu, pause and results screens float in front of you and
answer your laser and trigger (or a poke); the score and timer sit on your left wrist and,
if you like, in a strip at the top of your view.
- 🎹 **Hold the trigger and sweep.** Hold the trigger and brush across piano keys, drum steps,
pads or buttons — each one you pass fires once.
- 🌍 **Module content follows the world.** Grab and turn the world and the Untangle board (and
every module's content) turns with it.

### 🔊 Games that sound and feel like games

- 🔔 20 built-in game sounds, 7 music loops (quiet under the sound effects, only while you
play), a big centred banner for moments like "GOAL!" or "Floor 3", sparkle / confetti / smoke /
spark bursts, and controller vibration patterns (in Interact and Play only). Settings ▸ Sound
has a "Game sounds" and a "Music" volume.
- 🧩 New Game nodes: **Announce**, **Game Sound**, **Effect Burst**, **Controller Buzz**,
**Game Music** and the **On Grab** trigger.
- 🏗️ **Towers** tells you when your tower reaches each ring (a banner, sparkles at the ring,
a chime), and the gold ring at the top is a fanfare with confetti. **Stars Room** sparkles where
you hit a star and pays a coin when it lights. **The Jam Room is a VR cockpit**: stand in the
middle and every instrument is in reach; a sweep also stomps the pedals and flips the mixer
mutes (Music FX 0.2.0).
- ⚽ **Football plays like football**: your first touch kicks a match off, 3-2-1, GOAL! with
confetti and a crowd, the conceding team kicks off, first to 5 or 3:00 with a golden goal;
swing a controller through the ball to kick it; the consoles stand outside the court.
- 🏰 **Dungeon Realms is lit everywhere**, with real wall torches, footsteps, gem chimes, a
"Floor N" banner and dungeon music; you can no longer walk through pillars, crates or chests.
- 🔫 **Waves is a VR shooter**: a gun in your hand (Blaster, Scatter, Beam), an ability on your
grip (Shield, Slow-mo, Pulse), five levels of rigged grunts, runners and tanks walking at the
crystal, a menu with How to play / Loadout / Options, and a Start board you shoot in a headset.
- 🪢 **Untangle** drags with a controller's trigger (laser or tip), lets you hold and turn the
globe in one hand, and lost its drone: one sound per event and a quiet puzzle loop.

### 🧱 Kits and levels

- 🧱 Four new packs in Explorer ▸ Packs — **Modular Architecture**, **Nature & Terrain**,
**Props & Interiors** and **Sci-fi & Modern** — over 120 pieces that snap to the 1 m grid (CC0,
made with Meshy.ai).
- 🗺️ Three walkable example levels in Templates ▸ General: **Castle Courtyard**, **Forest
Clearing** and **Tavern Interior**. Kit pieces are saved as references to their pack, so a
level of 150 pieces is about 25 KB. Configure Scene ▸ Physics ▸ Play mode ▸ Spawn point.
- ↩️ Placing a kit piece is undoable (it was "too large for undo history").
- 🛠️ **Fixed:** moves made with the gizmo, Align to ground or an Explorer drop were refused by
peers (a rotation sent with its order letters); loading a scene while the simulation runs no
longer leaves the old physics world behind.

### 🧰 For authors

- 🧱 **Game and template defs can say more:** rounded boxes, capsules, rings, planes,
ico/dodecahedra; spot, directional (shadows fitted to the scene) and hemisphere lights; glass,
clearcoat, sheen and toon materials; animation and particle presets by name; click-through
shells; custom skies with a gradient, fog and a solid ground. Games-tab cards are rendered with
each game's own lighting.
- 🔤 **Centred HUD text is centred.** A single-line HUD text sat flush left inside its box
whatever its alignment said.
- 🧩 SDK: `registerClickHandler(fn, {modes})`, `api.registerListedGroup(name, {label})`,
`api.storage`, `api.editorMode()`, and `api.pointerRay()` is the crosshair ray under a pointer lock and the
cursor's ray in a free-cursor game.

## 1.16.0 — Waves, and one world to keep 🌊

### 🎮 A new game, and a Games tab that can move again
Expand Down
Loading
Loading