# Prism Light: changelog

## 1.0.2 (2026-10-16): mobile pass

Tested as emulated phones and a tablet (iPhone SE, iPhone 15, Pixel 7, Galaxy Fold, iPad mini), in portrait and landscape, with notch safe areas simulated.

**Controls**
- Portrait reaches the whole bay. A portrait screen only holds about 35 degrees of sea, while ships come in from ±78 degrees, so on a phone held upright the flanks were out of sight and out of reach. The keeper's view now swings round the lighthouse after the beam. A finger held near the left or right edge keeps sweeping the beam outward, and you can tap any ship's ring or hazard's diamond, even one pinned to the screen edge, to swing to it. Visible bearings went from ±30 degrees to ±80; touch reach went from ±50 to ±86.
- Edge sweeps, keys and the stick stop at ±100 degrees, so the beam can't be spun round over the land.
- Focus holds its finger, so a sliding thumb doesn't drop it, and lights up while held. Focus and aim work at the same time with two fingers.
- Rotating the phone mid-night refits the camera and canvas. Mobile browsers don't always fire a resize event on rotation, so the size is also checked every frame.
- On touch devices the start screen shows touch instructions.

**Layout**
- Touch targets are at least 44 px: the corner buttons, the facet wheel and the start-screen pickers.
- On narrow portrait phones the corner buttons sit in a 2×2 block. The tally sits below the measured night panel, so it can't collide with it however the title wraps.
- On short landscape screens the harbour master's radio sits top-left, off the beam and the dock.
- The pause and dawn sheets centre when they fit, scroll from the top when they don't, and keep their buttons pinned in reach. They respect the notch and the home indicator.
- Rings pinned to the screen edge stay clear of the top panels and the dock.

**Frame rate**
- No shaders compile during play. Wreckers' false lights used to add and remove a point light, and the Kraken's light toggled with her visibility. Either changed the light count, which recompiles every lit material: a stall on a phone when the first false light appeared (night 4) and when the Kraken rose (night 5). The lights are now permanent and dim to zero.
- Lane planning no longer hitches. A* reuses its arrays and runs on a typed-array heap, routes are cached, and every scripted lane is planned on the loading screen. Spawns went from 12–36 ms (desktop) to under 1 ms, and replans to 1–4 ms.
- Kelp no longer creates a new rotation object per frond per frame.
- On touch devices the HUD panels drop the backdrop blur over the 3D view, which a mobile GPU re-blurs every frame, in favour of slightly denser panels.

**Tools**
- `tools/mobileaudit.mjs` (layout), `tools/touchtest.mjs` (touch controls through the browser's own touch input; 18/18 in both orientations), `tools/reach.mjs` (visible and reachable bearings per screen) and `tools/mobileprof.mjs` (draw calls, triangles, mid-game shader compiles and simulation time per night on the low preset).

## 1.0.1 (2026-10-16)

- Ships float on the water you see. In the storm, hulls sank up to 3.5 m into the drawn sea. There were three causes:
  - Pitch was inverted, so bows dipped into rising water.
  - Ships over 20 m rode only 70% of the swell.
  - Far from the cape, the sea mesh is too coarse to draw the shortest swell waves that the ships were riding.
- The fixes:
  - Each hull is now fitted to the water at bow, midships and stern, and rides up over any crest that would swamp it.
  - Each swell wave fades out where the mesh can't draw it, in the shader and in the ships' copy of the sea alike.
  - The ships' copy now includes the shallow-water damping.
  - The depth texture is read at texel centres.
- `tools/boatcheck.mjs` measures the drawn sea against every hull on every night. On night 5 the worst case went from 3.5 m to 0.66 m of spray (freeboards are 3 to 4.8 m). Nights 1 to 3 stay under 0.25 m.
- Added `vendor/addons/utils/SkeletonUtils.js`, which `GLTFLoader.js` imports. It was missing from the site copy, which stopped the game from loading.
- `tools/cine.mjs` and `tools/trailer-shots.js` render the trailer's shots in the engine.

## 1.0.0 (2026-10-15)

- First release. Five nights and the Endless Watch on Kelda Head, the north cape of Lumen Reach.
- The six-facet lens: Halo, Ember, Rime, Volt, Venom and Void, one Prism Forge element each.
- Ships plan their own lanes between the reefs (A* on a 12 m grid) and keep a bearing that drains in the dark.
- Hazards: fog banks, rogue waves, waterspouts, kelp tangles and wreckers' false lights.
- Night-migrating thrush flocks that the beam can trap, and that only darkness frees.
- Wrecks put lifeboats in the water; the beam leads them home.
- The Glassmire Kraken wakes on the last night and catches a hull before it strikes.
- Blender: the fleet remodelled from Synty POLYGON Pirate and Wolf Pack Games hulls with night fittings; the lighthouse, the lens and the coast modelled from scratch; Kelda Cove built from Synty docks and shanties; a low-poly Swainson's thrush.
- Sound from the SFX library (see assets/sfx-report.json), two synthesized music loops.
- The Island V5 loader recipe with a full shader warm-up, quality presets, adaptive resolution on low, touch and gamepad controls.
- Tooling: an autopilot (`?auto=1`), fixed-step driving through `window.__pl.advance`, and `tools/play.mjs`, which played and recorded all five nights.
