Shell / Menu / Dialog UI¶
The out-of-cockpit interface: the menu-bar state machine and the dialog/widget core
that render and drive every menu screen, dialog box, and button. Re-carved from a nominal
range that was ~85% foreign into its two true clusters (menu core 0x40B8A0–0x40D79C,
dialog core 0x487A3A–0x48D200) plus scattered screen entries.
Provenance: Ghidra static analysis of the game executable with FA.SMS symbols applied; recorded in the symbol database and applied to the Ghidra project. Progress: reconstruction matrix. Markers follow spec-authoring.md: confirmed · inferred · unknown.
Menu bar and dialogs¶
- Menu core (
0x40B8A0–0x40D79C): the menu-bar state machine —MenuStartUp,MenuLoadFont(MENUFONT.PIC / MFONT320.PIC),MenuMouseSelect(hit-test), andMenuDrawDropdown(draw an opened submenu with background save/restore), over a_firstMenulinked list with palette-remap chrome. - Dialog/widget core (
0x487A3A–0x48D200): the DIALOG lifecycle — record hit-test and dispatch, and every_Draw*widget renderer (check/toggle/list-box/scrollbar) with edit/rocker/slider input. Many_Draw*handlers are label-only in FA.SMS and materialise on apply.
Functions¶
Full record: db/symbols/shell-ui.csv.
| VA | Symbol | Role |
|---|---|---|
0x40BD30 |
MenuStartUp |
initialise the menu bar |
0x40C160 |
MenuLoadFont |
load the menu font PIC |
0x40C670 |
MenuMouseSelect |
hit-test the mouse over the bar/items |
0x40C990 |
MenuDrawDropdown |
draw an opened submenu |
0x40BF60 |
MenuMeasureItemWidth |
measure the widest menu label |
Open Questions¶
1. DLG record types — mapped¶
The .DLG record types 1/3/4/5/7/8 are now field-mapped in DLG.md § Per-type
record fields (recovered under #258 from
DialogUpdate, _DrawListBox, and the scrollbar helpers). Only a few engine-scratch interior
bytes of the largest records remain unnamed (tracked as the residual .DLG gap under #54).
Status: resolved — re-static (#258; residual scratch fields under #54).
Related¶
- formats/DLG.md / formats/MNU.md — the dialog and menu formats.
- renderer.md — the
G_*rasterizer the UI draws through. - campaign.md — the campaign/mission screens the shell hosts.