From 296d34d8ca56451824c638b1f82dc8b8157bed3e Mon Sep 17 00:00:00 2001 From: Oliver Rieger Date: Tue, 18 Aug 2026 11:52:03 +0200 Subject: [PATCH] The shell's gifts get written down: portrait, haptics, and a thumb the OS stops stealing Co-Authored-By: Claude Fable 5 --- PROJECT.md | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/PROJECT.md b/PROJECT.md index 9629c55..2592f50 100644 --- a/PROJECT.md +++ b/PROJECT.md @@ -3508,7 +3508,33 @@ never an interstitial. An interstitial after death would land exactly in the "on audio behaviour in WKWebView, safe-area (already solved for the browser, may differ in the shell), and 60 fps canvas under WKWebView at `RES` 4 — see OPEN 1, this is the second place that risk lands. Costs: a build step in a deliberately build-step-free project, Apple $99/yr, Google $25 - once. Landscape (OPEN 6) probably has to stop being under-maintained before a store review. + once. Landscape (OPEN 6): retired for the store build by the portrait lock below (Oliver, + 2026-08-18) — locked portrait makes landscape officially not-a-surface, which is cheaper than + fixing it for review; the web build keeps whatever landscape does today. + **What the shell buys GAMEPLAY-wise (2026-08-18)** — the countable list of plugins/config the + zero-dep rule bends for; only haptics touches game code: + - **Portrait lock** — one config line; see above. + - **HAPTICS — the real win**, flatly impossible in iOS Safari. Palette v1 is the stock iOS + primitives (three impact weights, three notification patterns, the selection tick) mapped + onto the EXISTING sound-effect call sites — the SFX taxonomy already decided what deserves + punctuation, so the audio map IS the haptic map. One `haptic(kind)` helper, no-op on the web. + Restraint rule: contact ticks are the metronome, kills punctuate, heavy is rare — a game + that buzzes constantly numbs the hand in minutes. Core Haptics custom curves only if the + stock palette feels flat. Device-only (the simulator has no Taptic Engine); needs its own + phone playtest round before any of it is assumed good. + - **Edge-gesture deferral** — the shell can require two swipes for the home indicator / + app switcher, so a bottom-edge flick (exactly where the one-handed thumb lives) stops + yanking the player out of the game. The web has no say in this. + - **Autoplay allowed in WKWebView** — the umpire speaks on first load, no gesture unlock + (kills LATER item 6's mute-on-first-load risk *inside the app*; the in-app-browser web case + remains). The iPhone mute switch becomes a choice — games usually play through it. + - **Real app storage** — stats, run history and the €2.99 unlock state survive; Safari/PWA + storage can be evicted under pressure. A tester's career may vanish; a customer's must not. + - **Assets in the binary** — instant cold start, no `?v=N` dance in the app. Flip side: app + updates take store review (days), so iteration stays on the web; the app ships snapshots. + - **Skipped on purpose**: Game Center / Play Games (a second leaderboard dilutes the diegetic + world board) and push-notification retention nags (same instinct that rejected + interstitials). Both addable later without regret. 3. **The CHALLENGE — ship it FREE.** Tennis already owns the paid-continue mechanic: Hawk-Eye. On death (`G.mode='eaten'`), the umpire announces a challenge, the replay shows the shambler's foot over the line, and the call is **overturned** — you resume. The sport supplies the cap for free