diff options
Diffstat (limited to 'home/menu.asm')
-rw-r--r-- | home/menu.asm | 591 |
1 files changed, 591 insertions, 0 deletions
diff --git a/home/menu.asm b/home/menu.asm new file mode 100644 index 00000000..3e04af8c --- /dev/null +++ b/home/menu.asm @@ -0,0 +1,591 @@ +; Functions used in displaying and handling menus. + + +LoadMenuDataHeader:: + call CopyMenuDataHeader + call PushWindow + ret + +CopyMenuDataHeader:: + ld de, wMenuDataHeader + ld bc, wMenuDataHeaderEnd - wMenuDataHeader + call CopyBytes + ld a, [hROMBank] + ld [wMenuDataBank], a + ret +; 0x1d4b + +StoreTo_wMenuCursorBuffer:: ; 1d4b + ld [wMenuCursorBuffer], a + ret +; 1d4f + + +MenuTextBox:: ; 1d4f + push hl + call LoadMenuTextBox + pop hl + jp PrintText +; 1d57 + +ret_1d57:: ; 1d57 +; unreferenced + ret +; 1d58 + +LoadMenuTextBox:: ; 1d58 + ld hl, .MenuDataHeader + call LoadMenuDataHeader + ret +; 1d5f + +.MenuDataHeader ; 1d5f + db $40 ; tile backup + db 12, 0 ; start coords + db 17, 19 ; end coords + dw VTiles0 + db 0 ; default option +; 1d67 + +MenuTextBoxBackup:: ; 1d67 + call MenuTextBox + call CloseWindow + ret +; 1d6e + +LoadStandardMenuDataHeader:: ; 1d6e + ld hl, .MenuDataHeader + call LoadMenuDataHeader + ret +; 1d75 + +.MenuDataHeader ; 1d75 + db $40 ; tile backup + db 0, 0 ; start coords + db 17, 19 ; end coords + dw 0 + db 1 ; default option +; 1d7d + +Call_ExitMenu:: ; 1d7d + call ExitMenu + ret +; 1d81 + +VerticalMenu:: + xor a + ld [hBGMapMode], a + call MenuBox + call UpdateSprites + call PlaceVerticalMenuItems + call ApplyTilemap + call CopyMenuData2 + ld a, [wMenuData2Flags] + bit 7, a + jr z, .cancel + call InitVerticalMenuCursor + call StaticMenuJoypad + call MenuClickSound + bit 1, a + jr z, .okay +.cancel + scf + ret + +.okay + and a + ret +; 0x1dab + +GetMenu2:: ; 1dab + call LoadMenuDataHeader + call VerticalMenu + call CloseWindow + ld a, [wMenuCursorY] + ret +; 1db8 + +CopyNameFromMenu:: + push hl + push bc + push af + ld hl, wMenuData2Pointer + ld a, [hli] + ld h, [hl] + ld l, a + inc hl + inc hl + pop af + call GetNthString + ld d, h + ld e, l + call CopyName1 + pop bc + pop hl + ret +; 0x1dcf + + +YesNoBox:: ; 1dcf + lb bc, SCREEN_WIDTH - 6, 7 + +PlaceYesNoBox:: ; 1dd2 + jr _YesNoBox + +PlaceGenericTwoOptionBox:: ; 1dd4 + call LoadMenuDataHeader + jr InterpretTwoOptionMenu + +_YesNoBox:: ; 1dd9 +; Return nc (yes) or c (no). + push bc + ld hl, YesNoMenuDataHeader + call CopyMenuDataHeader + pop bc +; This seems to be an overflow prevention, but +; it was coded wrong. + ld a, b + cp SCREEN_WIDTH - 6 + jr nz, .okay ; should this be "jr nc"? + ld a, SCREEN_WIDTH - 6 + ld b, a + +.okay + ld a, b + ld [wMenuBorderLeftCoord], a + add 5 + ld [wMenuBorderRightCoord], a + ld a, c + ld [wMenuBorderTopCoord], a + add 4 + ld [wMenuBorderBottomCoord], a + call PushWindow + +InterpretTwoOptionMenu:: ; 1dfe + call VerticalMenu + push af + ld c, $f + call DelayFrames + call CloseWindow + pop af + jr c, .no + ld a, [wMenuCursorY] + cp 2 ; no + jr z, .no + and a + ret + +.no + ld a, 2 + ld [wMenuCursorY], a + scf + ret +; 1e1d + +YesNoMenuDataHeader:: ; 1e1d + db $40 ; tile backup + db 5, 10 ; start coords + db 9, 15 ; end coords + dw .MenuData2 + db 1 ; default option +; 1e25 + +.MenuData2 ; 1e25 + db $c0 ; flags + db 2 + db "YES@" + db "NO@" +; 1e2e + +OffsetMenuDataHeader:: ; 1e2e + call _OffsetMenuDataHeader + call PushWindow + ret +; 1e35 + +_OffsetMenuDataHeader:: ; 1e35 + push de + call CopyMenuDataHeader + pop de + ld a, [wMenuBorderLeftCoord] + ld h, a + ld a, [wMenuBorderRightCoord] + sub h + ld h, a + ld a, d + ld [wMenuBorderLeftCoord], a + add h + ld [wMenuBorderRightCoord], a + ld a, [wMenuBorderTopCoord] + ld l, a + ld a, [wMenuBorderBottomCoord] + sub l + ld l, a + ld a, e + ld [wMenuBorderTopCoord], a + add l + ld [wMenuBorderBottomCoord], a + ret +; 1e5d + +DoNthMenu:: ; 1e5d + call MenuFunc_1e7f + call MenuWriteText + call Function1eff + call Function1f23 + call GetMenuJoypad + call MenuClickSound + ret +; 1e70 + +SetUpMenu:: ; 1e70 + call MenuFunc_1e7f ; ??? + call MenuWriteText + call Function1eff ; set up selection pointer + ld hl, w2DMenuFlags1 + set 7, [hl] + ret + +MenuFunc_1e7f:: + call CopyMenuData2 + call GetMenuIndexSet + call Function1ea6 + call MenuBox + ret + +MenuWriteText:: + xor a + ld [hBGMapMode], a + call GetMenuIndexSet ; sort out the text + call Function1eda ; actually write it + call Function2e31 + ld a, [hOAMUpdate] + push af + ld a, $1 + ld [hOAMUpdate], a + call ApplyTilemap + pop af + ld [hOAMUpdate], a + ret +; 0x1ea6 + +Function1ea6:: ; 1ea6 + ld a, [wMenuBorderLeftCoord] + ld c, a + ld a, [wMenuBorderRightCoord] + sub c + ld c, a + ld a, [wMenuData2Items] + add a + inc a + ld b, a + ld a, [wMenuBorderTopCoord] + add b + ld [wMenuBorderBottomCoord], a + ret +; 1ebd + +GetMenuIndexSet:: ; 1ebd + ld hl, wMenuData2IndicesPointer + ld a, [hli] + ld h, [hl] + ld l, a + ld a, [wWhichIndexSet] + and a + jr z, .skip + ld b, a + ld c, -1 +.loop + ld a, [hli] + cp c + jr nz, .loop + dec b + jr nz, .loop + +.skip + ld d, h + ld e, l + ld a, [hl] + ld [wMenuData2Items], a + ret +; 1eda + +Function1eda:: ; 1eda + call MenuBoxCoord2Tile + ld bc, 2 * SCREEN_WIDTH + 2 + add hl, bc +.loop + inc de + ld a, [de] + cp -1 + ret z + ld [MenuSelection], a + push de + push hl + ld d, h + ld e, l + ld hl, wMenuData2DisplayFunctionPointer + call .__wMenuData2DisplayFunction__ + pop hl + ld de, 2 * SCREEN_WIDTH + add hl, de + pop de + jr .loop +; 1efb + +.__wMenuData2DisplayFunction__ ; 1efb + ld a, [hli] + ld h, [hl] + ld l, a + jp [hl] +; 1eff + +Function1eff:: ; 1eff + call InitVerticalMenuCursor + ld hl, wMenuJoypadFilter + ld a, [wMenuData2Flags] + bit 3, a + jr z, .disallow_select + set START_F, [hl] + +.disallow_select + ld a, [wMenuData2Flags] + bit 2, a + jr z, .disallow_left_right + set D_LEFT_F, [hl] + set D_RIGHT_F, [hl] + +.disallow_left_right + ret +; 1f1a + + +Function1f1a:: ; 1f1a + call ScrollingMenuJoypad + ld hl, wMenuJoypadFilter + and [hl] + jr Function1f2a +; 1f23 + +Function1f23:: ; 1f23 + xor a + ld [wMenuJoypad], a + call StaticMenuJoypad +; 1f2a + +Function1f2a:: ; 1f2a + bit A_BUTTON_F, a + jr nz, .a_button + bit B_BUTTON_F, a + jr nz, .b_start + bit START_F, a + jr nz, .b_start + bit D_RIGHT_F, a + jr nz, .d_right + bit D_LEFT_F, a + jr nz, .d_left + xor a + ld [wMenuJoypad], a + jr .done + +.d_right + ld a, D_RIGHT + ld [wMenuJoypad], a + jr .done + +.d_left + ld a, D_LEFT + ld [wMenuJoypad], a + jr .done + +.a_button + ld a, A_BUTTON + ld [wMenuJoypad], a + +.done + call GetMenuIndexSet + ld a, [wMenuCursorY] + ld l, a + ld h, $0 + add hl, de + ld a, [hl] + ld [MenuSelection], a + ld a, [wMenuCursorY] + ld [wMenuCursorBuffer], a + and a + ret + +.b_start + ld a, B_BUTTON + ld [wMenuJoypad], a + ld a, -1 + ld [MenuSelection], a + scf + ret +; 1f79 + +PlaceMenuStrings:: ; 1f79 + push de + ld hl, wMenuData2PointerTableAddr + ld a, [hli] + ld h, [hl] + ld l, a + ld a, [MenuSelection] + call GetNthString + ld d, h + ld e, l + pop hl + call PlaceString + ret +; 1f8d + +PlaceNthMenuStrings:: ; 1f8d + push de + ld a, [MenuSelection] + call GetMenuDataPointerTableEntry + inc hl + inc hl + ld a, [hli] + ld d, [hl] + ld e, a + pop hl + call PlaceString + ret +; 1f9e + +Function1f9e:: ; 1f9e +; unreferenced + call GetMenuDataPointerTableEntry + inc hl + inc hl + ld a, [hli] + ld d, [hl] + ld e, a + ret +; 1fa7 + +MenuJumptable:: ; 1fa7 + ld a, [MenuSelection] + call GetMenuDataPointerTableEntry + ld a, [hli] + ld h, [hl] + ld l, a + jp [hl] +; 1fb1 + +GetMenuDataPointerTableEntry:: ; 1fb1 + ld e, a + ld d, $0 + ld hl, wMenuData2PointerTableAddr + ld a, [hli] + ld h, [hl] + ld l, a + add hl, de + add hl, de + add hl, de + add hl, de + ret +; 1fbf + +ClearWindowData:: ; 1fbf + ld hl, wWindowStackPointer + call .bytefill + ld hl, wMenuDataHeader + call .bytefill + ld hl, wMenuData2Flags + call .bytefill + ld hl, w2DMenuCursorInitY + call .bytefill + + ld a, [rSVBK] + push af + ld a, $7 + ld [rSVBK], a + + xor a + ld hl, wWindowStackBottom + ld [hld], a + ld [hld], a + ld a, l + ld [wWindowStackPointer], a + ld a, h + ld [wWindowStackPointer + 1], a + + pop af + ld [rSVBK], a + ret +; 1ff0 + +.bytefill: ; 1ff0 + ld bc, $0010 + xor a + call ByteFill + ret +; 1ff8 + +MenuClickSound:: ; 1ff8 + push af + and A_BUTTON | B_BUTTON + jr z, .nosound + ld hl, wMenuFlags + bit 3, [hl] + jr nz, .nosound + call PlayClickSFX +.nosound + pop af + ret +; 2009 + + +PlayClickSFX:: ; 2009 + push de + ld de, SFX_READ_TEXT_2 + call PlaySFX + pop de + ret +; 0x2012 + +MenuTextBoxWaitButton:: ; 2012 + call MenuTextBox + call WaitButton + call ExitMenu + ret +; 201c + +Place2DMenuItemName:: ; 201c + ld [hBuffer], a + ld a, [hROMBank] + push af + ld a, [hBuffer] + rst Bankswitch + + call PlaceString + pop af + rst Bankswitch + + ret +; 202a + +_2DMenu:: ; 202a + ld a, [hROMBank] + ld [wMenuData2_2DMenuItemStringsBank], a + callba _2DMenu_ + ld a, [wMenuCursorBuffer] + ret +; 2039 + +InterpretBattleMenu:: ; 2039 + ld a, [hROMBank] + ld [wMenuData2_2DMenuItemStringsBank], a + callba _InterpretBattleMenu + ld a, [wMenuCursorBuffer] + ret +; 2048 + +InterpretMobileMenu:: ; 2048 + ld a, [hROMBank] + ld [wMenuData2_2DMenuItemStringsBank], a + callba _InterpretMobileMenu + ld a, [wMenuCursorBuffer] + ret +; 2057 |