diff options
author | mid-kid <esteve.varela@gmail.com> | 2018-03-14 13:28:36 +0100 |
---|---|---|
committer | mid-kid <esteve.varela@gmail.com> | 2018-03-14 13:28:36 +0100 |
commit | 97c511cd2f271252cbc9e9746668081422231ca5 (patch) | |
tree | 35ef1cb72e871ef34e2b0011e514edae2b9cbcb7 /engine/menus/menu.asm | |
parent | baa0dc5a963a79843b37888bcfe1d2dfe833ade9 (diff) |
Organize the engine/ directory, take 2
Renamed `game` to `games` and `menu` to `menus`.
Moved some functions from `engine/routines/` to their fitting subdirectories.
Made two new subdirectories:
* engine/rtc: Contains all RTC-related things. Menus, hardware, misc
functions.
* engine/items: Contains all item-related things. Pack, item effects,
other item handlers.
Diffstat (limited to 'engine/menus/menu.asm')
-rwxr-xr-x | engine/menus/menu.asm | 841 |
1 files changed, 841 insertions, 0 deletions
diff --git a/engine/menus/menu.asm b/engine/menus/menu.asm new file mode 100755 index 000000000..51de2e1a4 --- /dev/null +++ b/engine/menus/menu.asm @@ -0,0 +1,841 @@ +_2DMenu_:: ; 2400e + ld hl, CopyMenuData + ld a, [wMenuData_2DMenuItemStringsBank] + rst FarCall + + call Draw2DMenu + call UpdateSprites + call ApplyTilemap + call Get2DMenuSelection + ret +; 24022 + +_InterpretBattleMenu:: ; 24022 + ld hl, CopyMenuData + ld a, [wMenuData_2DMenuItemStringsBank] + rst FarCall + + call Draw2DMenu + farcall MobileTextBorder + call UpdateSprites + call ApplyTilemap + call Get2DMenuSelection + ret +; 2403c + +_InterpretMobileMenu:: ; 2403c + ld hl, CopyMenuData + ld a, [wMenuData_2DMenuItemStringsBank] + rst FarCall + + call Draw2DMenu + farcall MobileTextBorder + call UpdateSprites + call ApplyTilemap + call Init2DMenuCursorPosition + ld hl, w2DMenuFlags1 + set 7, [hl] +.loop + call DelayFrame + farcall Function10032e + ld a, [wcd2b] + and a + jr nz, .quit + call MobileMenuJoypad + ld a, [wMenuJoypadFilter] + and c + jr z, .loop + call Mobile_GetMenuSelection + ret + +.quit + ld a, [w2DMenuNumCols] + ld c, a + ld a, [w2DMenuNumRows] + call SimpleMultiply + ld [wMenuCursorBuffer], a + and a + ret +; 24085 + + + +Draw2DMenu: ; 24085 + xor a + ld [hBGMapMode], a + call MenuBox + call Place2DMenuItemStrings + ret +; 2408f + +Get2DMenuSelection: ; 2408f + call Init2DMenuCursorPosition + call StaticMenuJoypad + call MenuClickSound +Mobile_GetMenuSelection: ; 24098 + ld a, [wMenuDataFlags] + bit 1, a + jr z, .skip + call GetMenuJoypad + bit SELECT_F, a + jr nz, .quit1 + +.skip + ld a, [wMenuDataFlags] + bit 0, a + jr nz, .skip2 + call GetMenuJoypad + bit B_BUTTON_F, a + jr nz, .quit2 + +.skip2 + ld a, [w2DMenuNumCols] + ld c, a + ld a, [wMenuCursorY] + dec a + call SimpleMultiply + ld c, a + ld a, [wMenuCursorX] + add c + ld [wMenuCursorBuffer], a + and a + ret + +.quit1 + scf + ret + +.quit2 + scf + ret +; 240cd + +Get2DMenuNumberOfColumns: ; 240cd + ld a, [wMenuData_2DMenuDimensions] + and $f + ret +; 240d3 + +Get2DMenuNumberOfRows: ; 240d3 + ld a, [wMenuData_2DMenuDimensions] + swap a + and $f + ret +; 240db + +Place2DMenuItemStrings: ; 240db + ld hl, wMenuData_2DMenuItemStringsAddr + ld e, [hl] + inc hl + ld d, [hl] + call GetMenuTextStartCoord + call Coord2Tile + call Get2DMenuNumberOfRows + ld b, a +.row + push bc + push hl + call Get2DMenuNumberOfColumns + ld c, a +.col + push bc + ld a, [wMenuData_2DMenuItemStringsBank] + call Place2DMenuItemName + inc de + ld a, [wMenuData_2DMenuSpacing] + ld c, a + ld b, 0 + add hl, bc + pop bc + dec c + jr nz, .col + pop hl + ld bc, 2 * SCREEN_WIDTH + add hl, bc + pop bc + dec b + jr nz, .row + ld hl, wMenuData_2DMenuFunctionAddr + ld a, [hli] + ld h, [hl] + ld l, a + or h + ret z + ld a, [wMenuData_2DMenuFunctionBank] + rst FarCall + ret +; 2411a + + +Init2DMenuCursorPosition: ; 2411a (9:411a) + call GetMenuTextStartCoord + ld a, b + ld [w2DMenuCursorInitY], a + dec c + ld a, c + ld [w2DMenuCursorInitX], a + call Get2DMenuNumberOfRows + ld [w2DMenuNumRows], a + call Get2DMenuNumberOfColumns + ld [w2DMenuNumCols], a + call .InitFlags_a + call .InitFlags_b + call .InitFlags_c + ld a, [w2DMenuNumCols] + ld e, a + ld a, [wMenuCursorBuffer] + ld b, a + xor a + ld d, 0 +.loop + inc d + add e + cp b + jr c, .loop + sub e + ld c, a + ld a, b + sub c + and a + jr z, .reset1 + cp e + jr z, .okay1 + jr c, .okay1 +.reset1 + ld a, 1 +.okay1 + ld [wMenuCursorX], a + ld a, [w2DMenuNumRows] + ld e, a + ld a, d + and a + jr z, .reset2 + cp e + jr z, .okay2 + jr c, .okay2 +.reset2 + ld a, 1 +.okay2 + ld [wMenuCursorY], a + xor a + ld [wCursorOffCharacter], a + ld [wCursorCurrentTile], a + ld [wCursorCurrentTile + 1], a + ret +; 24179 + +.InitFlags_a: ; 24179 + xor a + ld hl, w2DMenuFlags1 + ld [hli], a + ld [hld], a + ld a, [wMenuDataFlags] + bit 5, a + ret z + set 5, [hl] + set 4, [hl] + ret +; 2418a + +.InitFlags_b: ; 2418a + ld a, [wMenuData_2DMenuSpacing] + or $20 + ld [w2DMenuCursorOffsets], a + ret +; 24193 + +.InitFlags_c: ; 24193 + ld hl, wMenuDataFlags + ld a, A_BUTTON + bit 0, [hl] + jr nz, .skip + or B_BUTTON +.skip + bit 1, [hl] + jr z, .skip2 + or SELECT +.skip2 + ld [wMenuJoypadFilter], a + ret +; 241a8 + + +_StaticMenuJoypad:: ; 241a8 + call Place2DMenuCursor +_ScrollingMenuJoypad:: ; 241ab + ld hl, w2DMenuFlags2 + res 7, [hl] + ld a, [hBGMapMode] + push af + call MenuJoypadLoop + pop af + ld [hBGMapMode], a + ret +; 241ba + +MobileMenuJoypad: ; 241ba + ld hl, w2DMenuFlags2 + res 7, [hl] + ld a, [hBGMapMode] + push af + call Move2DMenuCursor + call Do2DMenuRTCJoypad + jr nc, .skip_joypad + call _2DMenuInterpretJoypad +.skip_joypad + pop af + ld [hBGMapMode], a + call GetMenuJoypad + ld c, a + ret +; 241d5 + + +Unreferenced_Function241d5: ; 241d5 + call Place2DMenuCursor +.loop + call Move2DMenuCursor + call HDMATransferTileMapToWRAMBank3 ; BUG: This function is in another bank. + ; Pointer in current bank (9) is bogus. + call .loop2 + jr nc, .done + call _2DMenuInterpretJoypad + jr c, .done + ld a, [w2DMenuFlags1] + bit 7, a + jr nz, .done + call GetMenuJoypad + ld c, a + ld a, [wMenuJoypadFilter] + and c + jr z, .loop + +.done + ret + +.loop2 + call Menu_WasButtonPressed + ret c + ld c, 1 + ld b, 3 + call AdvanceMobileInactivityTimerAndCheckExpired ; BUG: This function is in another bank. + ; Pointer in current bank (9) is bogus. + ret c + farcall Function100337 + ret c + ld a, [w2DMenuFlags1] + bit 7, a + jr z, .loop2 + and a + ret +; 24216 + + +MenuJoypadLoop: ; 24216 +.loop + call Move2DMenuCursor + call .BGMap_OAM + call Do2DMenuRTCJoypad + jr nc, .done + call _2DMenuInterpretJoypad + jr c, .done + ld a, [w2DMenuFlags1] + bit 7, a + jr nz, .done + call GetMenuJoypad + ld b, a + ld a, [wMenuJoypadFilter] + and b + jr z, .loop + +.done + ret +; 24238 + +.BGMap_OAM: ; 24238 + ld a, [hOAMUpdate] + push af + ld a, $1 + ld [hOAMUpdate], a + call WaitBGMap + pop af + ld [hOAMUpdate], a + xor a + ld [hBGMapMode], a + ret +; 24249 + +Do2DMenuRTCJoypad: ; 24249 +.loopRTC + call RTC + call Menu_WasButtonPressed + ret c + ld a, [w2DMenuFlags1] + bit 7, a + jr z, .loopRTC + and a + ret +; 24259 + +Menu_WasButtonPressed: ; 24259 + ld a, [w2DMenuFlags1] + bit 6, a + jr z, .skip_to_joypad + callfar PlaySpriteAnimationsAndDelayFrame + +.skip_to_joypad + call JoyTextDelay + call GetMenuJoypad + and a + ret z + scf + ret +; 24270 + +_2DMenuInterpretJoypad: ; 24270 + call GetMenuJoypad + bit A_BUTTON_F, a + jp nz, .a_b_start_select + bit B_BUTTON_F, a + jp nz, .a_b_start_select + bit SELECT_F, a + jp nz, .a_b_start_select + bit START_F, a + jp nz, .a_b_start_select + bit D_RIGHT_F, a + jr nz, .d_right + bit D_LEFT_F, a + jr nz, .d_left + bit D_UP_F, a + jr nz, .d_up + bit D_DOWN_F, a + jr nz, .d_down + and a + ret + +.set_bit_7 ; 24299 + ld hl, w2DMenuFlags2 + set 7, [hl] + scf + ret + +.d_down + ld hl, wMenuCursorY + ld a, [w2DMenuNumRows] + cp [hl] + jr z, .check_wrap_around_down + inc [hl] + xor a + ret + +.check_wrap_around_down + ld a, [w2DMenuFlags1] + bit 5, a + jr nz, .wrap_around_down + bit 3, a + jp nz, .set_bit_7 + xor a + ret + +.wrap_around_down + ld [hl], $1 + xor a + ret + +.d_up + ld hl, wMenuCursorY + ld a, [hl] + dec a + jr z, .check_wrap_around_up + ld [hl], a + xor a + ret + +.check_wrap_around_up + ld a, [w2DMenuFlags1] + bit 5, a + jr nz, .wrap_around_up + bit 2, a + jp nz, .set_bit_7 + xor a + ret + +.wrap_around_up + ld a, [w2DMenuNumRows] + ld [hl], a + xor a + ret + +.d_left + ld hl, wMenuCursorX + ld a, [hl] + dec a + jr z, .check_wrap_around_left + ld [hl], a + xor a + ret + +.check_wrap_around_left + ld a, [w2DMenuFlags1] + bit 4, a + jr nz, .wrap_around_left + bit 1, a + jp nz, .set_bit_7 + xor a + ret + +.wrap_around_left + ld a, [w2DMenuNumCols] + ld [hl], a + xor a + ret + +.d_right + ld hl, wMenuCursorX + ld a, [w2DMenuNumCols] + cp [hl] + jr z, .check_wrap_around_right + inc [hl] + xor a + ret + +.check_wrap_around_right + ld a, [w2DMenuFlags1] + bit 4, a + jr nz, .wrap_around_right + bit 0, a + jp nz, .set_bit_7 + xor a + ret + +.wrap_around_right + ld [hl], $1 + xor a + ret +; 24318 + +.a_b_start_select ; 24318 + xor a + ret +; 2431a + +Move2DMenuCursor: ; 2431a + ld hl, wCursorCurrentTile + ld a, [hli] + ld h, [hl] + ld l, a + ld a, [hl] + cp "▶" + jr nz, Place2DMenuCursor + ld a, [wCursorOffCharacter] + ld [hl], a +Place2DMenuCursor: ; 24329 + ld a, [w2DMenuCursorInitY] + ld b, a + ld a, [w2DMenuCursorInitX] + ld c, a + call Coord2Tile + ld a, [w2DMenuCursorOffsets] + swap a + and $f + ld c, a + ld a, [wMenuCursorY] + ld b, a + xor a + dec b + jr z, .got_row +.row_loop + add c + dec b + jr nz, .row_loop + +.got_row + ld c, SCREEN_WIDTH + call AddNTimes + ld a, [w2DMenuCursorOffsets] + and $f + ld c, a + ld a, [wMenuCursorX] + ld b, a + xor a + dec b + jr z, .got_col +.col_loop + add c + dec b + jr nz, .col_loop + +.got_col + ld c, a + add hl, bc + ld a, [hl] + cp "▶" + jr z, .cursor_on + ld [wCursorOffCharacter], a + ld [hl], "▶" + +.cursor_on + ld a, l + ld [wCursorCurrentTile], a + ld a, h + ld [wCursorCurrentTile + 1], a + ret +; 24374 + +_PushWindow:: ; 24374 + ld a, [rSVBK] + push af + ld a, BANK(wWindowStack) + ld [rSVBK], a + + ld hl, wWindowStackPointer + ld e, [hl] + inc hl + ld d, [hl] + push de + + ld b, $10 + ld hl, wMenuFlags +.loop + ld a, [hli] + ld [de], a + dec de + dec b + jr nz, .loop + +; If bit 6 or 7 of the menu flags is set, set bit 0 of the address +; at 7:[wWindowStackPointer], and draw the menu using the coordinates from the header. +; Otherwise, reset bit 0 of 7:[wWindowStackPointer]. + ld a, [wMenuFlags] + bit 6, a + jr nz, .bit_6 + bit 7, a + jr z, .not_bit_7 + +.bit_6 + ld hl, wWindowStackPointer + ld a, [hli] + ld h, [hl] + ld l, a + set 0, [hl] + call MenuBoxCoord2Tile + call .copy + call MenuBoxCoord2Attr + call .copy + jr .done + +.not_bit_7 + pop hl ; last-pushed register was de + push hl + ld a, [hld] + ld l, [hl] + ld h, a + res 0, [hl] + +.done + pop hl + call .ret ; empty function + ld a, h + ld [de], a + dec de + ld a, l + ld [de], a + dec de + ld hl, wWindowStackPointer + ld [hl], e + inc hl + ld [hl], d + + pop af + ld [rSVBK], a + ld hl, wWindowStackSize + inc [hl] + ret +; 243cd + +.copy ; 243cd + call GetMenuBoxDims + inc b + inc c + call .ret ; empty function + +.row + push bc + push hl + +.col + ld a, [hli] + ld [de], a + dec de + dec c + jr nz, .col + + pop hl + ld bc, SCREEN_WIDTH + add hl, bc + pop bc + dec b + jr nz, .row + + ret +; 243e7 + +.ret ; 243e7 + ret +; 243e8 + +_ExitMenu:: ; 243e8 + xor a + ld [hBGMapMode], a + + ld a, [rSVBK] + push af + ld a, BANK(wWindowStack) + ld [rSVBK], a + + call GetWindowStackTop + ld a, l + or h + jp z, Error_Cant_ExitMenu + ld a, l + ld [wWindowStackPointer], a + ld a, h + ld [wWindowStackPointer + 1], a + call PopWindow + ld a, [wMenuFlags] + bit 0, a + jr z, .loop + ld d, h + ld e, l + call RestoreTileBackup + +.loop + call GetWindowStackTop + ld a, h + or l + jr z, .done + call PopWindow + +.done + pop af + ld [rSVBK], a + ld hl, wWindowStackSize + dec [hl] + ret +; 24423 + +Unreferenced_Function24423: ; 24423 + ld a, [wVramState] + bit 0, a + ret z + xor a ; sScratch + call GetSRAMBank + hlcoord 0, 0 + ld de, sScratch + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + call CopyBytes + call CloseSRAM + call OverworldTextModeSwitch + xor a ; sScratch + call GetSRAMBank + ld hl, sScratch + decoord 0, 0 + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT +.loop + ld a, [hl] + cp $61 + jr c, .next + ld [de], a +.next + inc hl + inc de + dec bc + ld a, c + or b + jr nz, .loop + call CloseSRAM + ret +; 2445d + +Error_Cant_ExitMenu: ; 2445d + ld hl, .Text_NoWindowsAvailableForPopping + call PrintText + call WaitBGMap +.InfiniteLoop: + jr .InfiniteLoop +; 24468 + +.Text_NoWindowsAvailableForPopping: ; 24468 + text_jump UnknownText_0x1c46b7 + db "@" +; 2446d + +_InitVerticalMenuCursor:: ; 2446d + ld a, [wMenuDataFlags] + ld b, a + ld hl, w2DMenuCursorInitY + ld a, [wMenuBorderTopCoord] + inc a + bit 6, b + jr nz, .skip_offset + inc a +.skip_offset + ld [hli], a +; w2DMenuCursorInitX + ld a, [wMenuBorderLeftCoord] + inc a + ld [hli], a +; w2DMenuNumRows + ld a, [wMenuDataItems] + ld [hli], a +; w2DMenuNumCols + ld a, 1 + ld [hli], a +; w2DMenuFlags1 + ld [hl], $0 + bit 5, b + jr z, .skip_bit_5 + set 5, [hl] +.skip_bit_5 + ld a, [wMenuFlags] + bit 4, a + jr z, .skip_bit_6 + set 6, [hl] +.skip_bit_6 + inc hl +; w2DMenuFlags2 + xor a + ld [hli], a +; w2DMenuCursorOffsets + ln a, 2, 0 + ld [hli], a +; wMenuJoypadFilter + ld a, A_BUTTON + bit 0, b + jr nz, .skip_bit_1 + add B_BUTTON +.skip_bit_1 + ld [hli], a +; wMenuCursorY + ld a, [wMenuCursorBuffer] + and a + jr z, .load_at_the_top + ld c, a + ld a, [wMenuDataItems] + cp c + jr nc, .load_position +.load_at_the_top + ld c, 1 +.load_position + ld [hl], c + inc hl +; wMenuCursorX + ld a, 1 + ld [hli], a +; wCursorOffCharacter, wCursorCurrentTile + xor a + ld [hli], a + ld [hli], a + ld [hli], a + ret +; 244c3 |