At a glance

Installed by
Field-VM op 0x49 sub-op 0x05, a fixed 14-byte inline header (_DAT_8007B450)
Controller
Walk state machine FUN_801EF2B0 in PROT 0897, fifteen states, jump table 0x801CF65C
Cells
width x height bytes, heap-allocated and filled procedurally
Drawing
One field actor per cell value, repositioned and drawn per cell; the board carries no geometry
On the retail disc
A disc-wide census of every scene script finds no install site
Port
engine-minigames::tile_board + World::tick_tile_board; LEGAIA_TILE_BOARD_DEMO=1 synthesises an install

This is not town movement

Towns use free movement through a separate controller, covered on field locomotion. The board shares the overlay and reads the same pad, but its one-cell steps, per-cell tile actors and procedural fill are its own. It is a puzzle / board minigame surface that the shipped game leaves script-reachable and unused.

The board and its state machine

2 2 2 2 start 2 2 2 2 3 B 4 2 2 2 C 2 2 2 8 2 9 2 2 2 7 2 2 A 2 2 board[row * width + col], one byte per cell 2 wall 3..6 terrain, sets the facing octant 7 trigger: leaves the board 8..0xA event: raises story flags 0xB..0xE animated, cycle on each arrival 0 Init alloc, spawn, fill 1 Fade in scale to 0x1000 2 Walk to cell max 0x20 a step 3 Arrive cycle animated cells 4 Input collide, commit step 8 Event flag writes 7 Trigger 5 Quit prompt Triangle 9..0xC Fade out tile actors shrink away 0xD park, 0xE teardown frees the board; the script resumes
Left, an illustrative board: the fill is procedural, so no two boards match and none of this layout is disc data. Right, the fifteen-state walk machine. State 0 seats the player at column 4, row 0 without moving the actor, so the walk-in walks them there from wherever they stood.

Cell values

ValueMeaning
2wall: a destination cell of 2 rejects the move
3..6walkable terrain; writes the facing octant (v - 3) * 2
7trigger: routes the walk machine to its exit
8..0xAevent tile: consumes the header’s two flag bases, and the walker stops half a step short of its centre
0xB..0xEanimated: every plain arrival steps each one 0xB → 0xC → 0xD → 0xE → 0xB across the whole board
otherplain floor

Each tile is 0x80 world units and the walker sits on the centre: world = (header_origin + cell) * 0x80 + 0x40 on each axis.

One step

  1. A Triangle edge opens the quit prompt.
  2. The held pad is remapped through a quantised 45-degree rotation, so “screen up” follows the octant the scene authored.
  3. One direction is decoded, the destination cell is bounds-checked and tested against 2; a wall or the edge is a bonk and the state stays put.
  4. An accepted step commits the new cell and walks the actor to its centre, each axis clamped to 0x20 a tick.

What an event tile writes

With v = cell - 8 and the header’s two bases A and B, state 8 sets system flag A + v + 1, tests flag B + v, and when that test is clear also sets flag A. Each of the three event cells owns one flag above the base, the base records “an event cell was reached”, and the B bank lets a script pre-mark cells whose reach should not raise it.

The board ends by zeroing a byte in the scene control block. The op-0x49 subsystem actor polls it, retires, and the parked opcode reads that as done and advances past its operand block.

See also

The header layout, the procedural fill, the octant store, the walk legs and the render tail are in docs/subsystems/tile-board.md.