re: the black gap between screens is NOT a load -- measured, three legs
sylpheed-port's BLOCKED ask #2. The gap was the one quantity in the transition with no rule: measured at 0, 3 and 2 frames across three transitions, and I had proposed it might be a load, which would make it emulator- and storage-dependent and unauthorable. Leg 1, bundle size runs the wrong way. If the gap were the incoming bundle arriving, the biggest bundle would gap longest. Build 4 is 12 278 666 B and gaps ZERO frames; build 5 is 6 977 437 B and gaps 3 and 2. Leg 2, ran title->menu a second time from cold. The outgoing ramp is byte-identical (63, 127, 191, 255) and the gap is 3 frames in BOTH runs. Leg 3, and the two runs are not a null comparison -- which is the objection leg 2 invites. The captures refute it themselves: press-to-first-change differs by ~12 frames between them (~25 against ~10). Something in this transition really is cache-sensitive and moved by 0.4 s, while the gap did not move at all. The control comes from inside the measurement rather than from an assumption that conditions differed. So the gap is deterministic to the frame and not a load. It is also not constant across transitions (0, 3, 2, 3) and not in the fade group -- the port reports 866 keyframes across 16 screens with 0 untimed. A deterministic game quantity with no rule found; black_hold_units stays 0, and "not a load" must not become a reason to author a constant. The load proposal in screen-transitions.md is marked refuted rather than deleted. Also fills in docs/game/navigation.md, which the standing brief asks me to keep and which I had not touched while measuring four transitions: a player-side section on what a screen change looks like, and three scripting traps -- that `pkill -f xenia_canary` kills the shell that ran it (cost a launch today, and the same trap is already in METHOD for pgrep), that screen_id.py reports `menu` during the attract loop, and that it cannot tell EXTRAS from the main menu. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wuu56cE8vJGTBtn1ppsk8v
This commit is contained in:
@@ -252,6 +252,36 @@ side the cursor is on before pressing Ⓐ.**
|
||||
|
||||
---
|
||||
|
||||
## 4b. What a screen change looks like ✅ measured, three of them
|
||||
|
||||
Every screen carries a full-screen black quad (`pteff00.prm`) that paints last.
|
||||
A screen change is that quad ramping to opaque on the way out, and the **incoming**
|
||||
screen's own copy of it starting opaque and clearing on the way in — so a
|
||||
transition is two screens' quads, not one shared effect. The outgoing ramp's length
|
||||
is on the disc and matches the game **three for three**; the black between them
|
||||
does not, and is not a constant.
|
||||
|
||||
| you press | going | outgoing ramp | black between | incoming clears over |
|
||||
|---|---|---|---|---|
|
||||
| Ⓑ | main menu → title | 5 frames | **none — they cross-fade** | 8 frames |
|
||||
| Ⓐ | title → main menu | 4 frames | ~3 frames | 5 frames |
|
||||
| Ⓑ | EXTRAS → main menu | 5 frames | **2 frames, fully blank** | 5 frames |
|
||||
|
||||
⚠️ **Ⓑ is not "the cancel animation".** Ⓑ out of the main menu cross-fades — the
|
||||
title is already drawing while the menu is still fading — while Ⓑ out of EXTRAS
|
||||
goes properly black first. Same button, two different-looking moves, and if you are
|
||||
scripting against "the screen goes black" one of them will not do it.
|
||||
|
||||
⚠️ **Ⓐ off the title is slow to start.** About 25 rendered frames (~0.8 s) pass
|
||||
between a delivered press and anything changing on screen; the other two start
|
||||
immediately. A script that presses and then looks 0.5 s later sees the title still
|
||||
up and can conclude the press was dropped.
|
||||
|
||||
Timings are in *rendered frames* at ~30 Hz, from the emulator's own draw stream, so
|
||||
they do not stretch when the emulator runs slow —
|
||||
[`screen-transitions.md`](../re/screen-transitions.md) ·
|
||||
[`data/fade-three-transitions.txt`](../re/data/fade-three-transitions.txt).
|
||||
|
||||
## 5. Flying
|
||||
|
||||
Not started, and the game teaches it better than we could: **play the in-game
|
||||
@@ -277,3 +307,18 @@ Traps that read as bugs but are not, all measured ✅:
|
||||
* **A trace consumer that exits stalls the emulator**, which also reads as a dead
|
||||
pad.
|
||||
* Cold boot is slow; ~25 s once the shader and code caches are warm.
|
||||
* **`pkill -f xenia_canary` kills the shell that ran it**, because `-f` matches
|
||||
the whole command line and your own `bash -c` contains the pattern. The script
|
||||
dies before the emulator does, silently, with no output at all. Kill by process
|
||||
**name**: `ps -o pid= -C xenia_canary | xargs -r kill -9`. (The same trap is in
|
||||
`METHOD.md` for `pgrep` wait-loops; it cost another launch on 2026-08-30.)
|
||||
* **`screen_id.py` reports `menu` during the attract loop.** Two boots on
|
||||
2026-08-30 logged `menu` at t=106 s and t=418 s while the game was still in the
|
||||
intro movie. A wait-loop that breaks on `menu` will act on the wrong screen; the
|
||||
loops here break on `title` for that reason.
|
||||
* **`screen_id.py` cannot tell EXTRAS from the main menu** — both are dark blue
|
||||
`GP_TITLE` screens and it answers `menu` for either. Use
|
||||
[`which_title_screen.py`](../../tools/re-capture/which_title_screen.py), which
|
||||
separates them by ~11 RMSE against ~18 within-class, and read the **margin**: a
|
||||
margin under ~1 means "neither", which is what you get on a screen outside
|
||||
`GP_TITLE` entirely.
|
||||
|
||||
Reference in New Issue
Block a user