Record the shipping plan and four sound-research todos

Discussion-only session, no code. HANDOFF gets a new LATER section holding the
decisions: paid $2.99 both stores with no ads, a web demo capped at the end of
chapter 1, the CHALLENGE (Hawk-Eye as a free earned continue) and the
short-form video campaign — plus what must NOT be built, because selling
weapons or adding a meta currency would fight settled design decisions.

OPEN gains item 11: the ball machine's squeak, burning zombies, the machine-gun
burst and the boss sound set all need a source chosen before implementing.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
wuwiandClaude Opus 5 committed 2026-07-31 19:52:31 +02:00
1 parent a7835d367c
commit faec897d80
1 file changed
+78 -4
+78 -4
View File
@@ -5,10 +5,11 @@ everything they specified is shipped, and what still matters from them is record
long history, `~/.claude/projects/.../memory/splatter-tennis-history.md` is auto-loaded; for the long history, `~/.claude/projects/.../memory/splatter-tennis-history.md` is auto-loaded; for the
detail of any individual change, read the git log. detail of any individual change, read the git log.
Last updated 2026-07-30, after Oliver's fourth playtest round. **Start with "How to work on this" Last updated 2026-07-31. **Start with "How to work on this", "OPEN — leftovers" and "LATER —
and "OPEN — leftovers"** (both just above the CLOSED sections) — the first tells you how his feedback shipping it"** (all three just above the CLOSED sections) — the first tells you how Oliver's feedback
should be handled, the second is everything known to be outstanding. All four playtest rounds are should be handled, the second is everything known to be outstanding in the game, the third is the
closed below them, newest first. **Awaiting his next phone playtest.** demo/store/campaign plan, which is decided but entirely unbuilt. All four playtest rounds are closed
below them, newest first. **Awaiting his next phone playtest.**
## What this is ## What this is
SNES-style pseudo-3D tennis (Super Tennis reference) that transitions into a zombie splatter game SNES-style pseudo-3D tennis (Super Tennis reference) that transitions into a zombie splatter game
@@ -468,6 +469,79 @@ Nothing here is broken; these are known gaps and unverified risks.
that catches your shots. Recorded so the ideas are not lost, not as a to-do. that catches your shots. Recorded so the ideas are not lost, not as a to-do.
10. **`ump_no_deal` does not exist.** Oliver asked for its removal; `ump_no_appeal` was removed as the 10. **`ump_no_deal` does not exist.** Oliver asked for its removal; `ump_no_appeal` was removed as the
closest match. Worth one confirmation that no other line is still unwanted. closest match. Worth one confirmation that no other line is still unwanted.
11. **Four sounds are missing and need RESEARCH first** (find/choose the source before implementing —
every existing sfx is either synthesised in `audio.js` or a wav in `assets/audio/`):
- the **ball machine** while it moves — a squeaking wheel/castor, so the furniture announces
itself. It already telegraphs its shot (`machWind` 0.9 s); this is the *approach* cue.
- **burning zombies** — fire is an epidemic now (`burnSpread`, `burnTime` 3 s), so this is a
looping crackle plus something the body does, and it has to layer without turning a lit-up
wave into noise.
- the **melee gun** — i.e. the machine-gun burst (`mgRate` 12/s during a horde, `mgPickupLen` 8 s
from a tin). At 12 rounds/s a per-pellet sample will machine-gun the mixer, not just the wave.
- **boss sounds** — footfall, wind-up, throw, wound, death. Three designs in `BOSS_ART`; decide
whether they share one set or get one each before recording anything.
---
# LATER — shipping it: demo, stores, campaign
Decided in discussion 2026-07-31 with Oliver. **None of this is built.** Recorded here so the
decisions survive; the ordering below is roughly the order to do it in.
**The model: paid, $2.99, no ads.** Both stores. No ad SDK, no consent/CMP flow, no ATT prompt, no
tracking — which keeps the store card at "Data Not Collected", keeps review trivial, and keeps a
zero-dependency project zero-dependency. *Maybe* later: a free build capped at chapter 1 with an IAP
to unlock all chapters. That is a fallback, not the plan — paid→free is a normal move, free→paid is
not, so launch paid.
**Ads are rejected**, with one exception held in reserve: rewarded video on the CHALLENGE (below),
never an interstitial. An interstitial after death would land exactly in the "one more run" gap that
`EATEN_RESTART` exists to protect, and would end sessions rather than annoy.
1. **The capped web demo.** The public web build stops at the **end of chapter 1** — after the first
chapter boss is beaten (`G.runGames >= 10`, `bossEvery`), on the chapter-2 card, ending on a WIN,
not a wall: "CHAPTER 2 — continue on the App Store." The cut must sit *after* everything a promo
clip promises (transition, first horde, a duel, weapons, the boss), because the web build's whole
job is converting a 15-second clip into "I played it".
Implementation is ~10 lines: a check on the chapter-2 card plus a build flag the store build sets
to skip it. **Build no protection around it** — it is client-side JS on a static host, trivially
bypassable, and nobody who would pay $2.99 will open devtools. DRM here is pure cost.
Consider leaving **desktop uncapped** (`matchMedia('(pointer: coarse)')`, already used for
`autoAssist`): nothing to cannibalise there, and an uncapped desktop build is what gets linked.
2. **Store readiness.** Wrap the PWA (Capacitor/PWABuilder). Unknowns to check *before* committing:
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.
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
(challenges per set), so the limit is diegetic rather than a paywall excuse.
Build it as an **earned** mechanic, not a purchase. It is good design on its own, and it is the
only slot in the game that could ever carry a rewarded video if the model changes. Note it does
change what a run *means* — right now the run summary is the whole game — so it needs a playtest
on feel before it is assumed good.
4. **Short-form video campaign.** The only free channel that reaches people who have never heard of
the game; the algorithm serves cold, so every post is a free lottery ticket. Format: vertical
(portrait is already primary — no letterboxing, unlike most game footage), open mid-rally on what
looks like an ordinary SNES tennis game, reveal the transition at ~3-5 s. Sound matters: the
recorded umpire over splatter is what earns an unmute. Volume over polish — 20-30 clips, one
export cross-posted to TikTok/Reels/Shorts. **No devlog content** (it reaches developers, who do
not buy games).
Clips the game already contains: the transition (the flagship), a boss walking on, the ball boy
calmly mopping blood, a flame ball starting an epidemic across a lined-up wave, parrying a boss's
volley back into him, a horde, the death + run summary.
A capture helper on `window.T` to jump straight into a given beat (the transition timeline is on
`G.transT`) would make clean takes cheap — not yet built.
**Expectations, so nobody is surprised:** with no marketing, 20-100 units in year one is the honest
central estimate (~$40-210 net, i.e. under Apple's fee at the low end). The monetization model is
worth maybe $200 either way; the video channel is worth ~100x that. Ship paid because it is cheap and
protects the design, not because it will earn.
**Explicitly NOT to be built** (these fight settled decisions, see the invariants above):
- **selling weapons or tins** — weapons are *only ever won*, in the duel; a shop deletes the duel's
reason to exist and `healPerDuel` with it.
- **a meta-progression currency** — permadeath and the run summary *are* the meta layer.
--- ---