diff --git a/PROJECT.md b/PROJECT.md index 88e8813..9ff5e61 100644 --- a/PROJECT.md +++ b/PROJECT.md @@ -636,6 +636,38 @@ Each phase ships to staging and gets a phone verdict, and tests ride along with 5. **LATER.** The metal bed (when Oliver has a track: start at the transformation, gore only) and Members' Night (option C). +## Session log: THE STORY, Oliver's first test (2026-10-15, v384, STAGING ONLY) +Oliver: *"after my first test it all made a good impression"*, plus five asks. +- **The metal track** ("Dystopian Survival", 3:36). `assets/audio/metal-loop.mp3` is 0.5-214 s with the + last 10 s cross-faded (equal power, `acrossfade qsin`) into the first 10. The seam sits inside the + fade and the loop is exactly 203.5 s. + - Built with a static ffmpeg in the scratchpad: decode to WAV first, then three `-ss/-t` inputs. Two + `atrim`s of ONE input read out of order yield an empty crossfade. + - It was AAC first; MP3 at Oliver's call. The LAME tag carries the encoder delay and padding, and the + decoder strips them: 8974350 frames measured in Chromium, signal at both ends. `GORE_BED.loopEnd` + pins it anyway. + - `lowcut` is 40 Hz (the old 800 Hz high-pass would gut metal) and `vol` is 0.5: it is mastered at + -14 LUFS against the old bed's -8. + - The open-source Chromium used for tests cannot decode AAC at all, the old beds included. Phones + can; that was never a file defect. +- **The prologue goes straight on** (*"momentan wechselt man kurz in den Gore-Mode, das ist + verwirrend"*). In the story the old transformation stops after the turn: no mob, no "remain + seated", no gore beat. At 5.2 s, `enterSplatter(quiet)` and act I's card and cup take over. + - Because the quiet entry no longer loads the gore bed, the chapter start and the transformation's + run-off call `zombieMusic()` (load if needed, then un-duck) instead of `zombieDuck(false)`. +- **RESET STORY** (test only, `STORE.testReset`) under the splash's build stamp. Two taps within 3 s. + - It resets the story, league, cups and champion flag; the level stays. + - It pushes at once, or `pull()` (forward-only) would hand the old act back. + - Gotcha: `armT` started at 0, which counts as armed in a page younger than 3 s. +- **Screen sounds:** + - Act card: a whoosh and a boom when the title lands. + - Ceremony: applause, and the rack's own `weapon-click2` as each tin lands, at 70% of its drop. + - Act card at the end: applause, a boom for the badge, a rising pock per arcade door. + - Timers are cleared when a screen is tapped away. +- **Chapters are 2×3** (*"statt 2x5 lieber 2x3"*): `STORY.midAt` 3, `length` 6, and `hordeAt` 4. A + chapter's "set" is four games: at the arcade's six the set would land on the act boss, and the horde + would vanish behind him. The test pins one horde after game four. + ## Session log: THE STORY, PHASES 1-4 — built on staging (2026-10-15, branch `story`, v380-v382, STAGING ONLY) Oliver: *"mache alle, ich vertraue. alles erst mal auf staging"*. The plan is in "THE STORY" below. diff --git a/assets/audio/metal-loop.mp3 b/assets/audio/metal-loop.mp3 new file mode 100644 index 0000000..abbd516 Binary files /dev/null and b/assets/audio/metal-loop.mp3 differ diff --git a/index.html b/index.html index 25c4f5b..25016c0 100644 --- a/index.html +++ b/index.html @@ -250,6 +250,10 @@ if (location.hostname !== 'splatter-tennis.wuwi.one' && !window.Capacitor?.isNat #intro .slogan b { color: #c9564a; } /* which build is served — filled in by main.js, empty (and invisible) if the header is missing */ #build { margin: 14px 0 0; font-size: 9px; color: #4a5a52; letter-spacing: 0.5px; } + #mReset { display: block; margin: 6px auto 0; padding: 6px 10px; background: none; border: 1px solid #2c3a33; + color: #6b7a72; font: 400 9px Silkscreen, monospace; letter-spacing: 1px; cursor: pointer; } + #mReset.arm { color: #d9705f; border-color: #d9705f; } + #splash.busy #mReset { display: none; } /* ONE overlay, four panels, swapped by #intro[data-stage]. Keeping the backdrop and the card frame alive across every screen is the point — a screen that unmounts the whole overlay flashes the court through between menus. */ @@ -973,6 +977,8 @@ if (location.hostname !== 'splatter-tennis.wuwi.one' && !window.Capacitor?.isNat
+ + @@ -1195,6 +1201,6 @@ if (location.hostname !== 'splatter-tennis.wuwi.one' && !window.Capacitor?.isNat REC - +