# Original BN Online Client Engine — Extracted Documentation

Searchable subsystem-keyed documentation of the BNO 5-8 client engine, extracted from `BN Online Client 5-8.gmd` via Phase 1.

## Start here by task

| Task | Read |
|------|------|
| "How does the player move?" | [input](input.md) → [collision](collision.md) |
| "How are sprites drawn / what fonts does the engine use?" | [rendering](rendering.md) |
| "How do rooms work and what triggers a room transition?" | [scene-room-model](scene-room-model.md) |
| "How does the client talk to the server?" | [client-networking](client-networking.md) → [decomp/wiki/08-39dll-networking](../../decomp/wiki/08-39dll-networking.md) |
| "What does the original admin model look like (so we can NOT port it)?" | [admin-anti-port](admin-anti-port.md) |
| "What menus / UI does BNO have?" | [ui-and-menus](ui-and-menus.md) |
| "Does the client play any audio?" | [audio](audio.md) (spoiler: no embedded audio) |
| "How does the client save state?" | [save-load](save-load.md) |
| "How are sprites animated?" | [animation](animation.md) |
| "Which Phaser/Pixi feature gaps drove the engine choice?" | [MATRIX](MATRIX.md) → [adr/0001-client-engine](../adr/0001-client-engine.md) |
| "Which assets are in the project?" | [asset-catalog/index.md](asset-catalog/index.md) |
| "Are there unresolved DnD actions?" | [unknown-actions-status](unknown-actions-status.md) (resolved as of Phase 2 plan 02-02) |

## Convention

Cross-refs use relative `.md` links. Per Phase 1 D-19 thin-wrapper pattern: where the `decomp/wiki/` already covers a topic (39dll, GML core functions), this tree links into the wiki rather than duplicating it.

Each subsystem MD carries YAML front-matter with `mvp: yes | no | partial` (D-04) tagging features required for the CLI-08 MVP gate (two players, one room, walk + chat). Phase 6 client work cherry-picks `mvp: yes` features without re-reading 320 objects.

Generated tables under `<!-- AUTOGEN:NAME:start ... -->` markers are produced by `tools/asset-catalog`. Do not hand-edit; re-run `pnpm catalog:client` to refresh.

## Generation pipeline

```
extracted/client-5-8/  ──►  tools/asset-catalog (loadExtracted → buildCrossRefIndex → buildCatalog)
                                    │
                                    ├──►  asset-catalog/index.{json,md}  (mechanical inventory; D-06 three-tier)
                                    │
                                    └──►  AUTOGEN-block rewrites in subsystem MDs (driven by SUBSYSTEM-MAP.json)
                                                │
                                                └──►  rendering.md, input.md, collision.md, ...
                                                        (hand-authored prose preserved across re-runs)
```

`pnpm catalog:client` regenerates everything in one pass. `pnpm catalog:verify` and `node tools/asset-catalog/scripts/lint-docs.mjs docs/extracted-engine` are the CI guards.

## Subsystem index

| Subsystem | mvp | One-liner |
|-----------|-----|-----------|
| [rendering](rendering.md) | yes | Drawing model, fonts, sprite/text primitives |
| [input](input.md) | yes | Per-key keyboard event handling on object 0042-player |
| [collision](collision.md) | yes | collision_rectangle / collision_line + per-object Collision events |
| [animation](animation.md) | no | image_speed / sprite_index swap idiom + Alarm events |
| [scene-room-model](scene-room-model.md) | yes | 16 rooms, room_goto / room_restart, view config |
| [save-load](save-load.md) | no | client-side file_text / ini usage; server saves are Phase 3 |
| [audio](audio.md) | no | Headline finding: no embedded audio in client-5-8/ |
| [ui-and-menus](ui-and-menus.md) | partial | Main_Menu / Online_Lobby / Settings_Menu / Online_Command_Screen |
| [client-networking](client-networking.md) | yes | Scripts 14-84 wrap 39dll; full opcode reverse is Phase 3 |
| [admin-anti-port](admin-anti-port.md) | no | Forcing function for Phase 7 PAR-07; documents what NOT to port |
| [unknown-actions-status](unknown-actions-status.md) | no | DnD action ID 523/525 status (RESOLVED) |
