Commit Graph
135 Commits
Author SHA1 Message Date
wuwiandClaude Opus 5.5 74aa209753 Give the machine, fire, gun and boss their missing sounds
All four synthesized in audio.js like every other weapon: a squeaking
castor, a court-wide crackle clock plus a throttled catch, a real gun
crack, and one shared boss voice (stomp per stride, wind-up breath,
bark, pain, death roar) pitched by body size. Closes OPEN 13 pending
the phone verdict. v355.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23 09:16:27 +02:00
wuwiandClaude Opus 5 d05b49909e Correct the stale #netd note in PROJECT.md
Every #net* hash opens the lobby since THE NETPLAY LOBBY; it does not host.
Cost a verification round this session.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-11 21:29:07 +02:00
wuwiandClaude Opus 5 78946015b4 Give the friend's racket a sound and the duel a rematch
Two netplay-only finds from Oliver's two-phone session.

THE FRIEND'S STRIKE was silent: every other opponent is simulated locally
and cracks through gameplay's shared return path, but the friend's swing
runs on their phone alone and arrives as a 'shot' message that wrote the
ball and nothing else. netApplyShot now plays the same sample at the same
volume, pitched off the pace that was actually sent (strikeRate, read after
the ball is written). Both netplay modes, not just the death match.

THE REMATCH: the summary's only netplay door was THE CLUBHOUSE, so playing
the same friend again meant two trips through the lobby and a fresh code.
The relay cannot re-pair, so the rematch is the socket that is still open —
one 'again' frame and both phones reset the run under the decisions the room
already carries (same side, same mode, same court, host serves). netAgain
keeps G.net across restartRun(true) and replays netFresh, netStart's own
tail split out so pairing and rematch cannot drift into two courts. Applied,
never echoed; a 2 s window swallows the second frame when both tap at once;
a dead line refuses and falls through to the clubhouse.

Also: the dev server runs with SPLAT_AUTH= (server.py always said local dev
should), which the shared password had been 401-ing. audio.sfxTest is a new
test seam in netTest's shape. 146 tests.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-11 21:28:31 +02:00
wuwi a09856f8c9 Streamline mobile menus and refresh splash logo 2026-09-07 13:26:17 +02:00
wuwi a399e4929c Fix match AI short-ball contact and recovery 2026-09-07 10:53:14 +02:00
wuwi fe64242090 Add opt-in phone gameplay recording and JSON export 2026-09-07 10:19:38 +02:00
wuwi ede1f48152 Sharpen league and Climb difficulty and give Gore a front door 2026-09-07 09:53:49 +02:00
wuwi e3faeb0a3a Strengthen final-league placement and returns 2026-09-04 09:11:12 +02:00
wuwi bfc70d7388 Make the opponent level matter in the cup 2026-09-03 16:41:02 +02:00
wuwiandClaude Fable 5 57650160a6 The shields glint instead of burning
A chimney of rising embers on a trophy read as a fire. Three points ON the
shield now, dark for most of a long cycle and flaring for a fraction of it,
with delays and durations that share no common multiple — so a glint lands
somewhere on the row every couple of seconds and never in the same rhythm.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 15:56:08 +02:00
wuwiandClaude Fable 5 80eb60d181 The cup board: the league ranks, the level breaks the tie
Oliver wanted to rank the level a league was taken at. The challenge held: xp
comes only from playing, so a board that rewards a low level rewards not
playing — it would pay you to avoid the three rooms the season leans on. It
also inverts every other number in the game, freezes after five entries, and
makes the player who played more look worse.

So the league ranks and the level decides between everyone who got equally far,
where "lower is better" reads naturally. BOARDS.u carries subLow; server
rank_key is the other half, and the same key decides whether a submission beats
the row already standing. The level is written once at the promotion — before
the league moves, because it is the level that WON the cup — mirrored like the
rest of the profile, and inscribed under the shield it belongs to. Earned
shields smoulder while they are on screen: five CSS embers each, no loop.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 15:51:38 +02:00
wuwiandClaude Fable 5 5927664905 The difficulty screen drops its LAST too, and the class with it
It was the last place still breaking the wizard's own rule — a question screen
carries no memory of its own answer. Three names, three pip counts, nothing
else. `.last` has no users left, so the rule is gone from the stylesheet.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 15:23:40 +02:00
wuwiandClaude Fable 5 e09ce992e2 The wall drops its corner chips
LAST remembered what you played last time, which a gallery of six posters does
not need to do for you, and 18 RUNGS was a number about a mode on the screen
for choosing between modes. Both gone. The difficulty screen keeps its LAST —
there it is the only thing saying what you last set.

The dead sub-poster branch in buildSub went with them: nothing has fanned out
into sub-posters since the cup left the ZOMBIE TENNIS pocket.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 15:17:19 +02:00
wuwiandClaude Fable 5 cb3074f99d PROJECT.md records the text reduction
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 14:42:18 +02:00
wuwiandClaude Fable 5 4c0ede33db The screen titles go upright, and Bungee ships subset
10 KB instead of 119 — the face carries only the characters this game sets, and
the command to redo it is in PROJECT.md. The header strip's titles take it at
23px: a strip at the top of a screen is signage, not an announcement, so it
stops leaning. Bangers keeps what it was always for — the primary button, the
ceremonies, and everything the canvas shouts. The poster wall's rooms go back
to acid beside it, with the scale carrying the hierarchy.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 13:48:48 +02:00
wuwiandClaude Fable 5 3324fe9cda Every screen deals itself in, every time
The entrance is no longer a one-off on the boot: dealStage re-arms the class at
the funnel every stage change already passes, so the title screen flies its
plaque and buttons in whenever you arrive at it. The sub-menus join in — their
header, content and footer arrive one after the other instead of the panel
dropping in as one slab — and the poster wall deals its three rooms rather than
its list, since a moving child inside a moving parent starts at twice the
offset and reads as a stutter.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 13:25:26 +02:00
wuwiandClaude Fable 5 aab83dacdc The menu deals itself in
The splash's elements fly in from the left on the boot, 70ms apart, on the same
easeOutBack overshoot the canvas modals have always used. It hangs off
:not(.busy), so taking the loading state off IS the trigger and it never plays
again — returning from a run should not make you wait for a flourish you have
seen. Reduced motion turns it off.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 13:22:16 +02:00
wuwiandClaude Fable 5 380f98f3a3 The boot shows nothing, and every screen opens at its top
Two things the phone found. The splash's loading state was applied by main.js —
but this is a module script, so the browser paints the markup, placeholders and
all, before it runs: LEVEL 1 stood there and then snapped to the real values.
The busy class ships in index.html now and main.js only takes it off; the
keyboard hints hide with it.

And #intro is the one scroller the menus share, so a scroll earned deep in the
stats screen outlived it: going back put the splash up scrolled, with its
buttons off screen. go() resets it, at the funnel every stage change passes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 13:19:26 +02:00
wuwiandClaude Fable 5 3d9400cd25 The season log records the button labels
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 13:14:15 +02:00
wuwiandClaude Fable 5 c1365cb467 The season log records the stacked doors
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 13:09:00 +02:00
wuwiandClaude Fable 5 0f2ea2b05e The season log records the measures pass
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 12:19:17 +02:00
wuwiandClaude Fable 5 e2cb13e46d The season log records the sections
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 11:46:30 +02:00
wuwiandClaude Fable 5 5c7521f867 THE SEASON, phases 1-4: the front door is the fixture, and the club remembers
The tournament is the canonical path, so the game finally says so. The splash's
primary button names the next cup fixture and enters the draw; the poster wall
moved one tap down and deals three named rooms (the season, the training, out of
competition) with the cup at the top. Two profile fields remember every attempt
— rounds ever reached per league, and the body that put you out — so a lost cup
is a line on the board instead of a null event, and the training court offers
that body first, marked. The promotion names what waits in the new league.

Overlays consolidated in the same pass: three modal drawers became one box with
a masthead, hairline-separated rows and a real footer button (any tap still
dismisses), and the run-end summary wears the same box — headline, xp, mark, and
the fixture with ENTER THE DRAW beside PLAY AGAIN. The cup's own exit is a
ceremony now: OUT IN THE QUARTER-FINAL, your best standing beside it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 11:14:25 +02:00
wuwiandClaude Fable 5 063b01d2a5 The season: the tournament becomes the story — the plan of record
Oliver's read: the modes feel decoupled, the menus and end screens enforce no
story-line. Settled in discussion: the tournament is the canonical path and
everything else is Beiwerk, a cup attempt is one evening (no resume, no
seeding), classic stays a side room. The spine — the splash names the next
fixture, the club remembers your attempts, the side modes are described in cup
terms, every ending hands over, and the season opens inside the promotion.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 10:50:59 +02:00
wuwiandClaude Fable 5 41f1b6815f The copy audit: the climb card stops calling itself a death match, the machine gets named, the drill decrypts, the duel names both stakes
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-30 17:25:41 +02:00
wuwiandClaude Fable 5 bfb3631ec3 The rules cards get zones: boxed rows, threat colour only for the threat, the blood pool as pips
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-30 16:54:05 +02:00
wuwiandClaude Fable 5 00f121bec7 The walk-on gets its own face: mugshot masthead, the measure, the round strip — no more wall of text
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-30 16:22:20 +02:00
wuwiandClaude Fable 5 7fb595ca22 The look stops lying: the fallback never reports done, and the women's frame gets room to stand tall
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-30 16:16:54 +02:00
wuwiandClaude Fable 5 a38c804069 Training pays a quarter, and the level bar wears its endpoints
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-30 15:58:34 +02:00
wuwiandClaude Fable 5 7d39032907 The weapon licence, the peer line, and the steward gets his vest back
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-30 15:52:51 +02:00
wuwiandClaude Fable 5 7e2649c888 The level is you, in the league: quicker legs, a wider window, and a curve that pays on the way up
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-30 13:28:24 +02:00
wuwiandClaude Fable 5 7dc72009eb The leagues are cleared for main — the verdict is in
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-29 16:55:55 +02:00
wuwiandClaude Fable 5 7a9b61fc6b The boot gate learns about the profile: skeleton plaque, locked splash, a 4s cap
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-29 16:55:00 +02:00
wuwiandClaude Fable 5 a5a681f9f2 The cup climbs: easy to hard, deterministic — the shuffle retires with its screen
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-29 16:49:36 +02:00
wuwiandClaude Fable 5 dbfd085493 The draw screen retires: the league cup rolls inside the run, ENTER THE DRAW moves onto the setup button
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-29 16:46:34 +02:00
wuwiandClaude Fable 5 1a39c9fdcb The plaque floats mid-court on glass, the blood pool breathes, and the 94vw card stops scrolling sideways
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-29 16:36:48 +02:00
wuwiandClaude Fable 5 689550d2d5 The climb: the arcade runs the whole earned ladder, the tempo follows the territory, the court is yours
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-29 16:24:43 +02:00
wuwiandClaude Fable 5 041827c4dc The league has its court: the tournament setup shows the home venue, not a choice
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-29 16:12:20 +02:00
wuwiandClaude Fable 5 d4780de76d The setup grows a league face: badge, felled tally, the band's roster — and a bigger ribbon
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-29 16:10:31 +02:00
wuwiandClaude Fable 5 77e6418e8e The way-up ribbon, final form: horizontal over the border, dissolving through a Bayer pixel fade
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-29 16:03:26 +02:00
wuwiandClaude Fable 5 6ea06ee42b The way-up ribbon hangs over the border — sized to stay out of the neighbouring poster
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-29 15:57:10 +02:00
wuwiandClaude Fable 5 fa6db7f77b The leagues, the polish round: the way-up ribbon, upright chevrons, the breathing badges, the card counts up
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-29 15:51:59 +02:00
wuwiandClaude Fable 5 87ac3294bc The leagues, the plaque round: the meta speaks — the player plaque, the goal line, the way-up tag, the centred ceremony
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-29 15:30:24 +02:00
wuwiandClaude Fable 5 787877bce6 The leagues, phase 4: the duel learns, tin tiers by league, level buffs, the board wears the badge
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-29 12:53:12 +02:00
wuwiandClaude Fable 5 76d88030e5 The leagues, phase 3: the character card, the honours collection, the skill trail
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-29 12:48:34 +02:00
wuwiandClaude Fable 5 16bf5b9fed The leagues, phase 2: five bands, pace tiers, locked courts, the members' ground, the promotion ceremony
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-29 12:43:23 +02:00
wuwiandClaude Fable 5 9133c0d351 The leagues, phase 1: the profile clock ticks — xp, levels, the identity screen, the server mirror
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-29 12:22:33 +02:00
wuwiandClaude Fable 5 bc10216d0b The leagues: the meta-progression plan of record — five leagues, XP by play, tin-tier gore coupling
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-29 11:55:27 +02:00
wuwiandClaude Fable 5 98b01fea5a The trail reads as motion, never as residue: the ghosts fade with the sprint
The lingering doubles were a real bug, not a taste problem: racketAI's
!incoming return kept the last chase's vx/vz on the body, so the speed
ghosts trailed a zombie that had already stopped. The velocity dies with
the chase now (tested). The look is halved with it: ghost alphas
0.22/0.10 -> 0.11/0.05, trailK 0.05 -> 0.035 — a hint of speed in the
corner of the eye, never a second body.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-28 16:36:19 +02:00
wuwiandClaude Fable 5 4ea9af5442 The surprise is an opening, not a free point: THE READ turned down a notch
Oliver, same day: 'die Gegner sind jetzt etwas zuu einfach.' The habit takes
four same-lane shots to learn (was three) and the wrong-foot costs about a
third less on every dial: surpRead 0.85->0.6, surpSlow 0.45->0.3, surpFlub
0.35->0.22. The whiff-window test pin rides down with it (0.25->0.15); the
slower-than-the-coach pin still holds.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-28 16:34:38 +02:00