diff --git a/HANDOFF.md b/HANDOFF.md index d5a409f..ffffecd 100644 --- a/HANDOFF.md +++ b/HANDOFF.md @@ -460,6 +460,24 @@ screen that unmounts the overlay flashes the live court through between menus. C only; `START GAME` and `BACK` are their own buttons. The tutorial is a data table (`TUT` in main.js) of Marvin poses, an optional picture already in `assets/`, and his lines — adding a page is a row. +**Menu and tutorial art is generated DIRECTLY, not through `_regen.py`.** That pipeline keys magenta +and slices figures out of a sheet; these are whole illustrated panels with backgrounds, so they go +through `generate_image.py` and a downscale/quantise pass, the same route the court tiles took. Two +things learned making them: + +- **Quantise these at 128 colours, not 64.** The panels are big flat fields with a few saturated + accents (the ball, fire, blood), which is exactly where a small palette shows — 64 turned the + tennis ball beige. +- **Find a generated plate by its BRIGHT BORDER, never by the corner colour.** One button plate came + back on a near-black margin and the other on a transparency CHECKERBOARD, which differs from + itself everywhere and matched the entire canvas. The threshold has to adapt per image too: the + checkerboard's own greys are brighter than the darker plate's border. + +The button plates are blank on purpose — **the lettering stays Silkscreen on top of the art**. +Generated type is a lottery and would not match the rest of the HUD. `btn_start` is a BOTTOM band of +a taller plate: by there the drips have run out to the ends and the centre is clear enough to print +over, and the plate's own bottom border comes with it. + **The menu theme starts on the FIRST TAP, never at boot** (`go()` calls `menuMusic`). A title screen that plays at you before you touch it is rude, and on a phone the autoplay policy would have held it silent until that tap regardless. diff --git a/assets/btn_start.png b/assets/btn_start.png new file mode 100644 index 0000000..1a8f0a7 Binary files /dev/null and b/assets/btn_start.png differ diff --git a/assets/btn_tut.png b/assets/btn_tut.png new file mode 100644 index 0000000..2184258 Binary files /dev/null and b/assets/btn_tut.png differ diff --git a/assets/tut_aim.png b/assets/tut_aim.png new file mode 100644 index 0000000..ba74808 Binary files /dev/null and b/assets/tut_aim.png differ diff --git a/assets/tut_duel.png b/assets/tut_duel.png new file mode 100644 index 0000000..c94f7f9 Binary files /dev/null and b/assets/tut_duel.png differ diff --git a/assets/tut_rack.png b/assets/tut_rack.png new file mode 100644 index 0000000..d2cb8a8 Binary files /dev/null and b/assets/tut_rack.png differ diff --git a/assets/tut_serve.png b/assets/tut_serve.png new file mode 100644 index 0000000..7ec8f52 Binary files /dev/null and b/assets/tut_serve.png differ diff --git a/index.html b/index.html index 3ef920e..a3032d9 100644 --- a/index.html +++ b/index.html @@ -93,6 +93,15 @@ font: 400 12px Silkscreen, monospace; letter-spacing: 1px; cursor: pointer; -webkit-tap-highlight-color: transparent; } .btn.go { border-color: #e0cc72; color: #e0cc72; } + /* The two menu buttons wear generated plates. The LETTERING stays Silkscreen on top rather than + being drawn into the art: generated type is a lottery and would not match the rest of the HUD. + A text-shadow is what keeps it readable where a drip runs behind it. */ + .btn.plate, .btn.plate2 { border: none; padding: 16px 10px; background-size: 100% 100%; + background-repeat: no-repeat; image-rendering: pixelated; + text-shadow: 0 2px 0 rgba(0,0,0,0.85); } + .btn.plate { background-image: url('assets/btn_start.png?v=92'); color: #f4e6a6; } + .btn.plate2 { background-image: url('assets/btn_tut.png?v=92'); color: #cfd8e6; } + #menu .logo { width: min(280px, 70vw); margin-bottom: 22px; } .btn.back { font-size: 10px; padding: 9px 10px; color: #8a96ab; } /* a row, not a stacked tile: three 3:2 tiles stacked fill a phone twice over, and the art still reads at this size. -webkit-tap-highlight-color kills iOS's blue flash over the pixel art. */ @@ -112,8 +121,10 @@ #tutorial .say { flex: 1; } #tutorial .say p { margin: 0 0 10px; font: 400 10px Silkscreen, monospace; color: #dfe6f2; line-height: 1.9; } #tutorial .say em { color: #e0cc72; font-style: normal; } - #tutorial .shot { display: block; max-width: 100%; max-height: 108px; margin: 0 0 8px; - image-rendering: pixelated; } + /* the panel is 2:1 and it is the point of the page, so it gets the full card width above the + Marvin row rather than being squeezed into the text column beside him */ + #tutorial .shot { display: block; width: min(360px, 88vw); margin: 0 auto 12px; + image-rendering: pixelated; border: 2px solid #2a3140; } #tutorial .dots { margin: 14px 0 10px; font: 400 10px Silkscreen, monospace; color: #5a6270; letter-spacing: 3px; } #tutorial .acts { display: flex; gap: 8px; width: min(340px, 84vw); margin: 0 auto; } #tutorial .acts .btn { margin: 0; flex: 1; } @@ -139,9 +150,10 @@
@@ -167,6 +180,6 @@