diff options
author | PikalaxALT <PikalaxALT@gmail.com> | 2015-12-17 22:31:16 -0500 |
---|---|---|
committer | PikalaxALT <PikalaxALT@gmail.com> | 2015-12-17 22:31:16 -0500 |
commit | d644406f61983be78339a0e9f366e8d34c209c6c (patch) | |
tree | feb8188bd644c8642b41d72d7fccfa274696064d /engine/scrolling_menu.asm | |
parent | fe4ef4e5951e855174cbff3da308b342b0b5bd09 (diff) |
More menu stuff
Diffstat (limited to 'engine/scrolling_menu.asm')
-rwxr-xr-x | engine/scrolling_menu.asm | 544 |
1 files changed, 544 insertions, 0 deletions
diff --git a/engine/scrolling_menu.asm b/engine/scrolling_menu.asm new file mode 100755 index 000000000..c5a671ce6 --- /dev/null +++ b/engine/scrolling_menu.asm @@ -0,0 +1,544 @@ +_InitScrollingMenu:: ; 245af + xor a + ld [wMenuJoypad], a + ld [hBGMapMode], a + inc a + ld [hInMenu], a + call InitScrollingMenuCursor + call ScrollingMenu_InitFlags + call ScrollingMenu_ValidateSwitchItem + call ScrollingMenu_InitDisplay + call ApplyTilemap + xor a + ld [hBGMapMode], a + ret +; 245cb + +_ScrollingMenu:: ; 245cb +.loop + call ScrollingMenuJoyAction + jp c, .exit + call z, .zero + jr .loop +; 245d6 + +.exit: ; 245d6 + call MenuClickSound + ld [wMenuJoypad], a + ld a, 0 + ld [hInMenu], a + ret +; 245e1 + +.zero: ; 245e1 + call ScrollingMenu_InitDisplay + ld a, 1 + ld [hBGMapMode], a + ld c, 3 + call DelayFrames + xor a + ld [hBGMapMode], a + ret +; 245f1 + +ScrollingMenu_InitDisplay: ; 245f1 + xor a + ld [hBGMapMode], a + ld hl, Options + ld a, [hl] + push af + set NO_TEXT_SCROLL, [hl] + call ScrollingMenu_UpdateDisplay + call ScrollingMenu_PlaceCursor + call ScrollingMenu_CheckCallFunction3 + pop af + ld [Options], a + ret +; 24609 + +ScrollingMenuJoyAction: ; 24609 +.loop + call ScrollingMenuJoypad + ld a, [hJoyLast] + and D_PAD + ld b, a + ld a, [hJoyPressed] + and BUTTONS + or b + bit 0, a ; A + jp nz, .a_button + bit 1, a ; B + jp nz, .b_button + bit 2, a ; Select + jp nz, .select + bit 3, a ; Start + jp nz, .start + bit 4, a ; Right + jp nz, .d_right + bit 5, a ; Left + jp nz, .d_left + bit 6, a ; Up + jp nz, .d_up + bit 7, a ; Down + jp nz, .d_down + jr .loop +; 24640 + +.unreferenced: ; unreferenced + ld a, -1 + and a + ret +; 24644 + +.a_button: ; 24644 + call PlaceHollowCursor + ld a, [wMenuCursorY] + dec a + call ScrollingMenu_GetListItemCoordAndFunctionArgs + ld a, [MenuSelection] + ld [CurItem], a + ld a, [MenuSelectionQuantity] + ld [wItemQuantityBuffer], a + call ScrollingMenu_GetCursorPosition + dec a + ld [wScrollingMenuCursorPosition], a + ld [CurItemQuantity], a + ld a, [MenuSelection] + cp -1 + jr z, .b_button + ld a, A_BUTTON + scf + ret +; 2466f + +.b_button: ; 2466f + ld a, B_BUTTON + scf + ret +; 24673 + +.select: ; 24673 + ld a, [wMenuData2Flags] + bit 7, a + jp z, xor_a_dec_a + ld a, [wMenuCursorY] + dec a + call ScrollingMenu_GetListItemCoordAndFunctionArgs + ld a, [MenuSelection] + cp -1 + jp z, xor_a_dec_a + call ScrollingMenu_GetCursorPosition + dec a + ld [wScrollingMenuCursorPosition], a + ld a, SELECT + scf + ret +; 24695 + +.start: ; 24695 + ld a, [wMenuData2Flags] + bit 6, a + jp z, xor_a_dec_a + ld a, START + scf + ret +; 246a1 + +.d_left: ; 246a1 + ld hl, w2DMenuFlags2 + bit 7, [hl] + jp z, xor_a_dec_a + ld a, [wMenuData2Flags] + bit 3, a + jp z, xor_a_dec_a + ld a, D_LEFT + scf + ret +; 246b5 + +.d_right: ; 246b5 + ld hl, w2DMenuFlags2 + bit 7, [hl] + jp z, xor_a_dec_a + ld a, [wMenuData2Flags] + bit 2, a + jp z, xor_a_dec_a + ld a, D_RIGHT + scf + ret +; 246c9 + +.d_up: ; 246c9 + ld hl, w2DMenuFlags2 + bit 7, [hl] + jp z, xor_a + ld hl, wMenuScrollPosition + ld a, [hl] + and a + jr z, .xor_dec_up + dec [hl] + jp xor_a + +.xor_dec_up + jp xor_a_dec_a +; 246df + +.d_down: ; 246df + ld hl, w2DMenuFlags2 + bit 7, [hl] + jp z, xor_a + ld hl, wMenuScrollPosition + ld a, [wMenuData2_ScrollingMenuHeight] + add [hl] + ld b, a + ld a, [wScrollingMenuListSize] + cp b + jr c, .xor_dec_down + inc [hl] + jp xor_a + +.xor_dec_down + jp xor_a_dec_a +; 246fc + +ScrollingMenu_GetCursorPosition: ; 246fc + ld a, [wMenuScrollPosition] + ld c, a + ld a, [wMenuCursorY] + add c + ld c, a + ret +; 24706 + +Function24706: ; 24706 (9:4706) + call MenuBoxCoord2Tile + ld de, SCREEN_WIDTH + add hl, de + ld de, 2 * SCREEN_WIDTH + ld a, [wMenuData2_ScrollingMenuHeight] +.asm_24713 + ld [hl], " " + add hl, de + dec a + jr nz, .asm_24713 + ret + +InitScrollingMenuCursor: ; 2471a + ld hl, wMenuData2_ItemsPointerAddr + ld a, [hli] + ld h, [hl] + ld l, a + ld a, [wMenuData2_ItemsPointerBank] + call GetFarByte + ld [wScrollingMenuListSize], a + ld a, [wMenuData2_ScrollingMenuHeight] + ld c, a + ld a, [wMenuScrollPosition] + add c + ld c, a + ld a, [wScrollingMenuListSize] + inc a + cp c + jr nc, .skip + ld a, [wMenuData2_ScrollingMenuHeight] + ld c, a + ld a, [wScrollingMenuListSize] + inc a + sub c + jr nc, .store + xor a + +.store + ld [wMenuScrollPosition], a + +.skip + ld a, [wMenuScrollPosition] + ld c, a + ld a, [wMenuCursorBuffer] + add c + ld b, a + ld a, [wScrollingMenuListSize] + inc a + cp b + jr c, .asm_2475a + jr nc, .asm_24763 + +.asm_2475a + xor a + ld [wMenuScrollPosition], a + ld a, $1 + ld [wMenuCursorBuffer], a + +.asm_24763 + ret +; 24764 + +ScrollingMenu_InitFlags: ; 24764 + ld a, [wMenuData2Flags] + ld c, a + ld a, [wScrollingMenuListSize] + ld b, a + ld a, [wMenuBorderTopCoord] + add $1 + ld [w2DMenuCursorInitY], a + ld a, [wMenuBorderLeftCoord] + add $0 + ld [w2DMenuCursorInitX], a + ld a, [wMenuData2_ScrollingMenuHeight] + cp b + jr c, .asm_24786 + jr z, .asm_24786 + ld a, b + inc a + +.asm_24786 + ld [w2DMenuNumRows], a + ld a, $1 + ld [w2DMenuNumCols], a + ld a, $8c + bit 2, c + jr z, .asm_24796 + set 0, a + +.asm_24796 + bit 3, c + jr z, .asm_2479c + set 1, a + +.asm_2479c + ld [w2DMenuFlags1], a + xor a + ld [w2DMenuFlags2], a + ld a, $20 + ld [w2DMenuFlags3], a + ld a, $c3 + bit 7, c + jr z, .asm_247b0 + add $4 + +.asm_247b0 + bit 6, c + jr z, .asm_247b6 + add $8 + +.asm_247b6 + ld [w2DMenuFlags4], a + ld a, [w2DMenuNumRows] + ld b, a + ld a, [wMenuCursorBuffer] + and a + jr z, .asm_247c8 + cp b + jr z, .asm_247ca + jr c, .asm_247ca + +.asm_247c8 + ld a, $1 + +.asm_247ca + ld [wMenuCursorY], a + ld a, $1 + ld [wMenuCursorX], a + xor a + ld [wCursorCurrentTile], a + ld [wCursorCurrentTile + 1], a + ld [wCursorOffCharacter], a + ret +; 247dd + +ScrollingMenu_ValidateSwitchItem: ; 247dd + ld a, [wScrollingMenuListSize] + ld c, a + ld a, [wSwitchItem] + and a + jr z, .done + dec a + cp c + jr c, .done + xor a + ld [wSwitchItem], a + +.done + ret +; 247f0 + +ScrollingMenu_UpdateDisplay: ; 247f0 + call ClearWholeMenuBox + ld a, [wMenuData2Flags] + bit 4, a ; place arrows + jr z, .okay + ld a, [wMenuScrollPosition] + and a + jr z, .okay + ld a, [wMenuBorderTopCoord] + ld b, a + ld a, [wMenuBorderRightCoord] + ld c, a + call Coord2Tile + ld [hl], "▲" + +.okay + call MenuBoxCoord2Tile + ld bc, SCREEN_WIDTH + 1 + add hl, bc + ld a, [wMenuData2_ScrollingMenuHeight] + ld b, a + ld c, $0 +.loop + ld a, [wMenuScrollPosition] + add c + ld [wScrollingMenuCursorPosition], a + ld a, c + call ScrollingMenu_GetListItemCoordAndFunctionArgs + ld a, [MenuSelection] + cp -1 + jr z, .cancel + push bc + push hl + call ScrollingMenu_CallFunctions1and2 + pop hl + ld bc, 2 * SCREEN_WIDTH + add hl, bc + pop bc + inc c + ld a, c + cp b + jr nz, .loop + ld a, [wMenuData2Flags] + bit 4, a ; place arrows + jr z, .done + ld a, [wMenuBorderBottomCoord] + ld b, a + ld a, [wMenuBorderRightCoord] + ld c, a + call Coord2Tile + ld [hl], "▼" + +.done + ret + +.cancel + ld a, [wMenuData2Flags] + bit 0, a ; call function on cancel + jr nz, .call_function + ld de, .string_2485f + call PlaceString + ret + +.string_2485f + db "CANCEL@" + +.call_function + ld d, h + ld e, l + ld hl, wMenuData2_ScrollingMenuFunction1 + jp CallPointerAt +; 2486e + +ScrollingMenu_CallFunctions1and2: ; 2486e + push hl + ld d, h + ld e, l + ld hl, wMenuData2_ScrollingMenuFunction1 + call CallPointerAt + pop hl + ld a, [wMenuData2_ScrollingMenuWidth] + and a + jr z, .done + ld e, a + ld d, $0 + add hl, de + ld d, h + ld e, l + ld hl, wMenuData2_ScrollingMenuFunction2 + call CallPointerAt + +.done + ret +; 2488b + +ScrollingMenu_PlaceCursor: ; 2488b + ld a, [wSwitchItem] + and a + jr z, .done + ld b, a + ld a, [wMenuScrollPosition] + cp b + jr nc, .done + ld c, a + ld a, [wMenuData2_ScrollingMenuHeight] + add c + cp b + jr c, .done + ld a, b + sub c + dec a + add a + add $1 + ld c, a + ld a, [wMenuBorderTopCoord] + add c + ld b, a + ld a, [wMenuBorderLeftCoord] + add $0 + ld c, a + call Coord2Tile + ld [hl], "▷" + +.done + ret +; 248b8 + +ScrollingMenu_CheckCallFunction3: ; 248b8 + ld a, [wMenuData2Flags] + bit 5, a ; call function 3 + ret z + bit 1, a ; call function 3 if not switching items + jr z, .call + ld a, [wSwitchItem] + and a + ret nz + +.call + ld a, [wMenuCursorY] + dec a + call ScrollingMenu_GetListItemCoordAndFunctionArgs + ld hl, wMenuData2_ScrollingMenuFunction3 + call CallPointerAt + ret +; 248d5 + +ScrollingMenu_GetListItemCoordAndFunctionArgs: ; 248d5 + push de + push hl + ld e, a + ld a, [wMenuScrollPosition] + add e + ld e, a + ld d, $0 + ld hl, wMenuData2_ItemsPointerAddr + ld a, [hli] + ld h, [hl] + ld l, a + inc hl ; items + ld a, [wMenuData2_ScrollingMenuSpacing] + cp 1 + jr z, .got_spacing + cp 2 + jr z, .pointless_jump +.pointless_jump + add hl, de +.got_spacing + add hl, de + ld a, [wMenuData2_ItemsPointerBank] + call GetFarByte + ld [MenuSelection], a + ld [CurItem], a + inc hl + ld a, [wMenuData2_ItemsPointerBank] + call GetFarByte + ld [MenuSelectionQuantity], a + pop hl + pop de + ret +; 2490c |