carlok — zsh — 88×30

cat _posts/2026-11-03-red-ink-sprint-25-practice-mode-an-exportable-playtest-log-and-an-italian-pass-that-found-english-in-the-hud.md

red-ink sprint 25: practice mode, an exportable playtest log, and an Italian pass that found English in the HUD

red-ink gained a Practice link on the title card, shown once a bout has been won: it opens the opponent’s dossier with Another opponent and Back, a practice fight starts at full health and grants no wins, unlocks or saved progress, and its card says so and offers Fight again or Choose opponent (80d568d). Every finished bout now writes one entry to a playtest log — result, time, hits taken, blocks, dodges, punches thrown and landed, difficulty, who controlled it, block mode and the practice flag — keeping the newest 200 in browser storage, with Export playtest log and a two-tap Clear beside it in the title settings; the export is a JSON download, the clipboard if that fails, and nothing is sent anywhere (a84e6df).

An audit of every visible string with the language set to Italian turned up English in the HUD and menus: Sound on/off, BOUT n / 6, Got it, the touch buttons, the bind and difficulty buttons, the slider and checkbox labels, FIGHTER and the avatar texts, the key and pad strips, the Strike and Defend rows — which had also stopped following a rebind, because they were matched by their English label — the aria labels, and the BLOK comic word, now PARA! (4cb3f45). All of it comes from STR now, the page sets lang on <html>, and the new test walks a deny list of English words over the page while requiring both languages for every entry; the HUD and touch controls fit at 390×844 and 844×390, and the reading of the title stays “Sublevel Three” in both languages.

The same sprint made block a toggle for players who cannot hold a key (bfe6c3a), offered Try Easy on the third straight loss on one bout, paused a fight with “Controller disconnected” when the pad in use is unplugged, put a card with a Reload button in place of a blank page when WebGL is missing or the GPU resets, and built the first-fight hint out of the actual binds or the pad and touch lines (64365e9). The regression now runs in a workflow on every pull request and push to master, and the Pages deploy calls that workflow as a job the build needs, so a failing test stops a deploy (5fe7cb1, b37fe9a). The draw count that had looked like a regression was noise: a worktree of the sprint 23 commit gave 39–42 draws against 41–44 now, and moved by two between its own runs, so the regression carries a budget instead of a fixed number (bf82aa1); the sprint closes at 45 of 45 with the bout table and the step probe unchanged (ac4d0f4, #17).