Two results and one retraction, all from the same session. REFUTED: 'an ~8-10 s idle returns to the title' does not apply to the main menu. Held untouched it stayed put for >= 60 s, correlation never leaving 0.9245-0.9249. That timer is real but belongs to the TITLE. It was the only reason 'B leaves the main menu' was classed as authored, so Q5's B rule is upgraded to measured-ordering: B is delivered (canary logs vk=5801) and is the only input in >= 100 s before the return. The PRESS (A) plate: the boot title presents build 4 WITHOUT the plate first -- green-glyph 154, against 159 on the committed no-plate capture and 753/977/1493 on plate titles -- and the plate arrives after. That is the port's third option. RETRACTED: four durations taken the same day. classify_array costs 1503 ms per frame; running it per frame against an 8 fps x11grab drained the pipe at 0.64 fps, so every classified frame was stale and increasingly so. It manufactured 'plate 24.66 s after the title art', 'B->title 15.58 s', 'B->title 25.60 s' and 'A->menu 20.26 s'. The tell: a transition, a press and a fade do not share a duration, and the two B figures GREW across a longer run. A backlog preserves ordering and destroys durations, which is why the sequence results above stand and every timing does not. The ring's period is unaffected and that was checked, not assumed -- ring_period ran at 15.03 fps against a requested 15. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KNR5Y79D1T4bBr6gJQaWFP
256 lines
12 KiB
Markdown
256 lines
12 KiB
Markdown
# Playing the game: every screen, and how you move through it
|
||
|
||
**Written from the player's chair.** What is on screen, what you press, what
|
||
happens. This is the document you would hand someone who has never seen the game
|
||
and wants to reach a mission — or who needs to script that journey.
|
||
|
||
Internal names (`ptbtn03`, `GP_LOAD`, build numbers) appear only as footnotes,
|
||
because they are how *we* find things, not what the game shows anyone.
|
||
|
||
**Status:** filling in. §1–§4 now carry what the committed oracle frames actually
|
||
show; what is still ❔ is what no capture answers. This page exists to be filled
|
||
in by playing, not to look finished.
|
||
|
||
> ## ⚠️ Fill this in from the real game
|
||
>
|
||
> The oracle is **Xenia Canary running the actual title**, captured. Not
|
||
> `sylpheed-cli`, not the Explorer, not any renderer of ours — those are tools
|
||
> for verifying our decoding, they are hypotheses under test, and they have been
|
||
> wrong. A row here with no capture behind it is a guess wearing a table cell.
|
||
>
|
||
> Describe what you *saw*. "The cursor starts on the second item" is worth more
|
||
> than any amount of reasoning about the layout data.
|
||
|
||
Confidence: ✅ seen in a capture · 🟡 inferred · ❔ unknown.
|
||
|
||
---
|
||
|
||
## 1. From power-on to the main menu
|
||
|
||
| # | What you see | What you do | What happens |
|
||
|---|---|---|---|
|
||
| 1 | **SQUARE ENIX** in white on black, the two dots in red, `™` after it ✅ | nothing | fades on to the next logo |
|
||
| 2 | **GAME ARTS**, **SETA** and **studio anima** stacked on black ✅ | nothing | fades on into the cinematic |
|
||
| 3 | The opening cinematic | **Ⓐ** skips it ✅ | ends into the title |
|
||
| 4 | **Title screen** — the wordmark appears **first, with no prompt**; `PRESS Ⓐ BUTTON` fades in a beat later, above the 2006/2007 Square Enix copyright line ✅ | press **Ⓐ** | goes to the main menu ✅ |
|
||
| 5 | **Main menu** | — | see §2 |
|
||
|
||
Both logo screens are **still pictures the game draws**, not video — neither is a
|
||
`.wmv` on the disc. Captures:
|
||
[publisher](../re/captures/title-builds/live-splash-publisher.png) ·
|
||
[developer](../re/captures/title-builds/live-splash-developer.png) ·
|
||
[title](../re/captures/title-builds/live-title-press-a.png).
|
||
|
||
⚠️ **One Ⓐ skips the cinematic**, and it is worth a lot of time: the title
|
||
arrived at **57 s** with the skip against **193 s** without it ✅.
|
||
|
||
⚠️ **The title screen has two states that look identical.** The one that ends
|
||
the boot accepts Ⓐ. The one the attract loop returns to, after the game has sat
|
||
untouched and looped back, **accepts nothing** — Ⓐ, START, B, BACK, X, Y, dozens
|
||
of presses, no response. Nothing on screen distinguishes them ✅. If you are
|
||
scripting: use the *first* title after boot, and do not press anything during the
|
||
boot.
|
||
|
||
⚠️ **The title is not input-ready for about ten seconds** after it appears ✅.
|
||
And even then Ⓐ registers roughly half the time, with nothing yet found that
|
||
predicts which ✅ — budget retries.
|
||
|
||
---
|
||
|
||
## 2. Main menu
|
||
|
||
Five options in a vertical stack, roughly centred, with a highlighted state on
|
||
the focused one.
|
||
|
||
> ✅ **The focused option carries a small ring to the left of its label, and the
|
||
> ring turns — continuously, about once every 2.2 s.** It has a bright head, so
|
||
> you can see it go round. It is the **only** thing moving on this screen once it
|
||
> has settled: the labels, the bracket and the footer are all completely still
|
||
> (temporal std exactly 0.000 over 20 s). Ⓑ
|
||
> [five frames, 4 s apart](../re/captures/focus-ring/ring-single-frames-4s-apart.png) ·
|
||
> [the measurement](../re/focus-ring-spin-measured.md)
|
||
|
||
| position | label | what it opens |
|
||
|---|---|---|
|
||
| 1 | **NEW GAME** | a **DIFFICULTY** prompt, then **SELECT DATA** ✅ |
|
||
| 2 | **LOAD GAME** | the save-slot list ✅ |
|
||
| 3 | **TUTORIAL** | the lesson list ✅ |
|
||
| 4 | **OPTIONS** | the settings menu ✅ |
|
||
| 5 | **EXTRAS** | a three-item submenu ✅ |
|
||
|
||
Read off [`live-main-menu.png`](../re/captures/title-builds/live-main-menu.png);
|
||
destinations off
|
||
[`q4-destinations.png`](../re/captures/menu-nav/q4-destinations.png) and
|
||
[`newgame-difficulty.png`](../re/captures/newgame-path/newgame-difficulty.png).
|
||
|
||
The screen is the title art gone dim, with the wordmark ghosted behind the list
|
||
and a bracket of glowing rule-lines drawn around it. The focused item is bright
|
||
white with a **spinning ring** to its left; the others are dim blue. Every item
|
||
carries a small dot-in-circle at the left end of its underline — that is on all
|
||
five all the time and is *not* the cursor.
|
||
|
||
**Moving around ✅**
|
||
|
||
| you press | what happens |
|
||
|---|---|
|
||
| ⬆ / ⬇ | one item, and it **wraps** at both ends |
|
||
| ⬅ / ➡ | nothing |
|
||
| Ⓐ | opens the focused item |
|
||
| Ⓑ | 🟡 back to the title — see the warning below |
|
||
|
||
❔ **Which item is focused when the menu opens is not fixed.** Four boots of the
|
||
same harness opened on `TUTORIAL`, `TUTORIAL`, `NEW GAME`, `NEW GAME`. Do not
|
||
assume the top item, and do not assume the middle one either.
|
||
|
||
> ⚠️ **The main menu is the one screen whose footer does not offer Ⓑ.** It reads
|
||
> `⊙ : Select Ⓐ : OK` — every submenu adds `Ⓑ : Back`. Measured: **zero**
|
||
> red-Ⓑ glyph pixels anywhere in the frame, on two captures, with the same
|
||
> detector finding the glyph on `EXTRAS` and `DIFFICULTY` ✅.
|
||
> ✅ **But Ⓑ does leave it, and the objection that stood here is refuted
|
||
> (2026-08-29).** This page used to say the title "returns on its own after
|
||
> ~8–10 s idle", so an observer could not tell Ⓑ from the timer. That timer
|
||
> belongs to the **title**, not to this screen: the main menu was held untouched
|
||
> for **≥ 60 s** and never moved. Ⓑ is delivered and is the only input in ≥ 100 s
|
||
> before the return, so the ordering is measured — the *latency* is not
|
||
> ([the measurement](../re/menu-idle-and-b-2026-08-29.md)).
|
||
|
||
*Internals: `GP_TITLE.pak` build 5; buttons `ptbtn01`–`ptbtn05` top to bottom.*
|
||
|
||
---
|
||
|
||
## 3. The rest of the menus
|
||
|
||
One section each, in the shape of §2: what is on screen, what the cursor does,
|
||
what each choice leads to, and what a wrong choice shows you.
|
||
|
||
### New game ✅
|
||
Ⓐ on `NEW GAME` does **not** start a mission. It opens **DIFFICULTY** —
|
||
`EASY` / `NORMAL` / `HARD` / `BACK`, opening focused on **NORMAL** ✅ — and Ⓐ
|
||
there opens **SELECT DATA**, a save-slot picker headed
|
||
`Current Storage: Dummy HDD` that asks you to choose a file for the auto-save.
|
||
Pick one and a movie plays ✅.
|
||
[DIFFICULTY](../re/captures/difficulty-screen.png)
|
||
|
||
### Load game ✅
|
||
A vertical list of numbered slots, **8 rows visible**, scrolling as a carousel —
|
||
one capture shows the order `19, 20, 01, 02, 03, 04` with `01` focused, so the
|
||
list runs past the end and back round to the start ✅. Each row shows
|
||
`Difficulty`, `Flight Time` and `Clear Ratio`; a **Details** panel to the right
|
||
gives `STAGE`, `Game Status`, `Points` and `Times Cleared`, and an empty slot
|
||
leaves every one of those blank ✅. `Current Storage: Dummy HDD` sits along the
|
||
top.
|
||
|
||
Its footer offers more than the other menus:
|
||
`⊙ : Select Ⓐ : OK Ⓑ : Back Ⓧ : Delete Ⓨ : Select Storage` ✅.
|
||
[capture](../re/captures/menu-nav/q4-destinations.png) (left panel)
|
||
|
||
❔ Still open: the overwrite / delete confirmation, and where its cursor starts.
|
||
|
||
Known: `title → LOAD GAME → slot 01 → YES → READY ROOM → TAKE OFF` reaches
|
||
flight ✅.
|
||
|
||
### Tutorial ✅
|
||
A list of lessons in two headed groups, with a one-line description shown on the
|
||
left for whichever is focused ✅ — e.g. `BASIC CONTROLS` reads
|
||
*"Learn how to move and attack"*. Opens focused on the first entry.
|
||
|
||
| group | lessons |
|
||
|---|---|
|
||
| **Level 1** | `BASIC CONTROLS`, `HEADS-UP DISPLAY`, `RADAR` |
|
||
| **Level 2** | `SUPPLY AND SPECIAL MOVES`, `RADIO ORDERS`, `ADVANCED CONTROLS` |
|
||
| — | `BACK` |
|
||
|
||
[capture](../re/captures/menu-nav/q4-destinations.png) (middle panel)
|
||
|
||
### Options ✅ (one level in)
|
||
`GAME SETTINGS` · `CONTROL SETTINGS` · `SOUND SETTINGS` · `SCREEN SETTINGS` ·
|
||
`BACK`, opening focused on the first ✅.
|
||
[capture](../re/captures/menu-nav/q4-destinations.png) (right panel)
|
||
|
||
❔ Still open: what is inside each of the four, what each setting ranges over, and
|
||
whether a change needs confirming.
|
||
|
||
### Extras ✅
|
||
Three items: `MISSION SELECT` · `MOVIE THEATER` · `BACK`, opening focused on
|
||
`MISSION SELECT` ✅. The cursor wraps here too — it is a menu rule, not a
|
||
per-screen one ✅.
|
||
[capture](../re/captures/title-builds/live-extras.png)
|
||
|
||
❔ `MOVIE THEATER` has never been opened.
|
||
|
||
### Mission select ✅ — and the "stuck cursor" is explained
|
||
The stage list on the left (**8 rows visible of 16**, with a scrollbar), a detail
|
||
panel showing the stage's name, a picture, `High Score` and `Best Time`, and a
|
||
**Wide Area Space Map** on the right with the named systems on it. The chosen
|
||
difficulty is printed top-right. Footer:
|
||
`⊙ : Select Ⓐ : OK Ⓑ : Back Ⓨ : Difficulty` ✅.
|
||
|
||
⚠️ **"Stage select would not move" — sixteen d-pad presses never left Stage 01 —
|
||
is now explained: the other fifteen stages were LOCKED** ✅. A locked row is
|
||
drawn *dimmer than an unfocused one*: measured, the labels sit at three distinct
|
||
brightnesses — focused **254**, unlocked **183**, locked **104** — and on a save
|
||
with the story unlocked the same rows read 183, with the cursor able to reach
|
||
**Stage16** at the bottom of the scrolled list.
|
||
[the measurement](../re/menu-navigation-semantics.md#-mission-select-the-cursor-was-stuck-because-the-stages-were-locked) ·
|
||
[locked](../re/captures/mission-select-stage01-only.png) ·
|
||
[unlocked](../re/captures/mission-select-all-story-unlocked.png) ·
|
||
[at Stage16](../re/captures/mission-select-ends-at-stage16.png)
|
||
|
||
So: if you are scripting a run, **check what the save has unlocked** before
|
||
concluding the list is broken. ❔ Whether the list wraps past Stage16, and
|
||
whether a locked row is skipped or simply unreachable, is not settled.
|
||
|
||
### Briefing and Ready Room ❔
|
||
❔ What you read, what you choose, and what finally launches the mission.
|
||
|
||
### Hangar / Arsenal ❔
|
||
❔ How a weapon is fitted, how one is bought, what a purchase prompt says.
|
||
|
||
---
|
||
|
||
## 4. Prompts, confirmations and alerts
|
||
|
||
The interrupting layer — and the thing most likely to break a scripted run,
|
||
because it looks like a menu and does not behave like one.
|
||
|
||
| prompt | when | where the cursor starts | notes |
|
||
|---|---|---|---|
|
||
| `Save game?` | after a mission | **YES** ✅ | |
|
||
| `Do you want to develop this weapon?` | Arsenal, on purchase | ❔ | |
|
||
| overwrite / delete confirmation | saving, loading | ❔ | |
|
||
| "not enough points" or similar refusal | Arsenal | ❔ | ❔ does it need dismissing |
|
||
|
||
⚠️ **A short d-pad tap is ignored inside a prompt.** Sixty milliseconds moves the
|
||
cursor on a menu and does *nothing* in a dialog ✅. So a script that works
|
||
through the menus will silently accept the default in every prompt it meets —
|
||
which is how you end up overwriting a save you meant to keep. **Confirm which
|
||
side the cursor is on before pressing Ⓐ.**
|
||
|
||
---
|
||
|
||
## 5. Flying
|
||
|
||
Not started, and the game teaches it better than we could: **play the in-game
|
||
tutorials and write down what they say.** They are the game's own explanation of
|
||
its controls, which is exactly the document we want.
|
||
|
||
To fill in: the control map, and whether there is more than one scheme · throttle
|
||
and boost · targeting — ⚠️ target select is Ⓐ pressed **twice**; a sweep that
|
||
only ever tapped once concluded targeting was automatic, and was wrong ✅ ·
|
||
switching weapons · the pause menu and what it offers · what the HUD tells you,
|
||
element by element · how a mission ends, win or lose, and what you see next.
|
||
|
||
---
|
||
|
||
## 6. If you are scripting this
|
||
|
||
Traps that read as bugs but are not, all measured ✅:
|
||
|
||
* **F10 opens Xenia's own menu bar**, and while any emulator UI is up the game
|
||
is handed an empty keystroke before any pad driver is asked. The controller
|
||
looks dead and is not.
|
||
* **A signed-in profile is required** — `--create_profile_if_none`.
|
||
* **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.
|