Locke's thief submenu shipped in v0.9 (#55) — Steal / Filch / Bestow, priced, in battle. The field Skills page for it did not, and it was the one acceptance criterion missed. The recon is worth keeping rather than redoing.
- The skills page is a 7-row list, and
zSkillsTextColor is 7 bytes wedged into direct page $79-$7f (menu_ram.inc:189), immediately followed by z80, z81… whose names are their addresses — so growing the array shifts all of them.
z80 is defined and never referenced anywhere in the tree. Renaming it into the scope gives the 8th row with zero address movement. That is the hard part already solved.
- Remaining:
_c34d78 and its cpx #$0007 bound, a SKILLS_LIST_THIEF entry, an 8th SkillsCursorPos (arithmetic is y = 8n − 4 for BG3A row n; row 19 → y 148), SkillsOptionsWindow2 grown from {7,10}, an 8th SkillsOptionTbl slot, and a DrawThiefMenu mirroring Ot6BlitzPageDraw.
One thing could not be settled statically and needs a measured screenshot first: SkillsOptionsWindow1 {1,1},{7,4} and Window2 {1,7},{7,10} on BG2A do not reconcile with the BG3A text rows 3/5/9/11/13/15/17 under any single row-grid model — Dance at row 17 lands outside Window2 on every reading. Take that screenshot before resizing anything. The row-7 gap (cursor y=52) is the seam between the two windows, not free space.
Locke's thief submenu shipped in v0.9 (#55) — Steal / Filch / Bestow, priced, in battle. The field Skills page for it did not, and it was the one acceptance criterion missed. The recon is worth keeping rather than redoing.
zSkillsTextColoris 7 bytes wedged into direct page$79-$7f(menu_ram.inc:189), immediately followed byz80,z81… whose names are their addresses — so growing the array shifts all of them.z80is defined and never referenced anywhere in the tree. Renaming it into the scope gives the 8th row with zero address movement. That is the hard part already solved._c34d78and itscpx #$0007bound, aSKILLS_LIST_THIEFentry, an 8thSkillsCursorPos(arithmetic isy = 8n − 4for BG3A rown; row 19 → y 148),SkillsOptionsWindow2grown from{7,10}, an 8thSkillsOptionTblslot, and aDrawThiefMenumirroringOt6BlitzPageDraw.One thing could not be settled statically and needs a measured screenshot first:
SkillsOptionsWindow1 {1,1},{7,4}andWindow2 {1,7},{7,10}on BG2A do not reconcile with the BG3A text rows 3/5/9/11/13/15/17 under any single row-grid model — Dance at row 17 lands outside Window2 on every reading. Take that screenshot before resizing anything. The row-7 gap (cursor y=52) is the seam between the two windows, not free space.