pokecrystal-board/engine/menus/start_menu.asm
2024-02-11 00:16:00 +01:00

518 lines
8.2 KiB
NASM

; StartMenu.Items indexes
const_def
const STARTMENUITEM_POKEDEX ; 0
const STARTMENUITEM_POKEMON ; 1
const STARTMENUITEM_PACK ; 2
const STARTMENUITEM_STATUS ; 3
const STARTMENUITEM_SAVE ; 4
const STARTMENUITEM_OPTION ; 5
const STARTMENUITEM_EXIT ; 6
const STARTMENUITEM_POKEGEAR ; 7
const STARTMENUITEM_QUIT ; 8
StartMenu::
call ClearMenuAndWindowData
ld a, FALSE
ld [wText2bpp], a
ld de, SFX_MENU
call PlaySFX
farcall ReanchorBGMap_NoOAMUpdate
ld hl, wStatusFlags2
bit STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl]
ld hl, .MenuHeader
jr z, .GotMenuData
ld hl, .ContestMenuHeader
.GotMenuData:
call LoadMenuHeader
call .SetUpMenuItems
ld a, [wStartMenuLastCursorPosition]
ld [wMenuCursorPosition], a
call .DrawMenuAccount
call DrawVariableLengthMenuBox
call .DrawBugContestStatusBox
call SafeUpdateSprites
call HDMATransferTilemapAndAttrmap_Menu
farcall LoadFont_NoOAMUpdate
call .DrawBugContestStatus
call UpdateTimePals
jr .Select
.Reopen:
call UpdateSprites
call UpdateTimePals
call .SetUpMenuItems
ld a, [wStartMenuLastCursorPosition]
ld [wMenuCursorPosition], a
.Select:
call .GetInput
jr c, .Exit
call ._DrawMenuAccount
ld a, [wMenuCursorPosition]
ld [wStartMenuLastCursorPosition], a
call PlayClickSFX
call PlaceHollowCursor
call .OpenMenu
; Menu items have different return functions.
; For example, saving exits the menu.
ld hl, .MenuReturns
ld e, a
ld d, 0
add hl, de
add hl, de
ld a, [hli]
ld h, [hl]
ld l, a
jp hl
.MenuReturns:
dw .Reopen
dw .Exit
dw .ExitMenuCallFuncCloseText
dw .ExitMenuRunScriptCloseText
dw .ExitMenuRunScript
dw .ReturnEnd
dw .ReturnRedraw
.Exit:
ldh a, [hOAMUpdate]
push af
ld a, 1
ldh [hOAMUpdate], a
call LoadFrame
pop af
ldh [hOAMUpdate], a
.ReturnEnd:
call ExitMenu
.ReturnEnd2:
call CloseText
call UpdateTimePals
ret
.GetInput:
; Return carry on exit, and no-carry on selection.
xor a
ldh [hBGMapMode], a
call ._DrawMenuAccount
call SetUpMenu
ld a, $ff
ld [wMenuSelection], a
.loop
call .PrintMenuAccount
call GetScrollingMenuJoypad
ld a, [wMenuJoypad]
cp B_BUTTON
jr z, .b
cp A_BUTTON
jr z, .a
jr .loop
.a
call PlayClickSFX
and a
ret
.b
scf
ret
.ExitMenuRunScript:
call ExitMenu
ld a, MENURETURN_SCRIPT
ld [wMenuReturn], a
ret
.ExitMenuRunScriptCloseText:
call ExitMenu
ld a, MENURETURN_SCRIPT
ld [wMenuReturn], a
jr .ReturnEnd2
.ExitMenuCallFuncCloseText:
call ExitMenu
ld hl, wQueuedScriptAddr
ld a, [hli]
ld h, [hl]
ld l, a
ld a, [wQueuedScriptBank]
rst FarCall
jr .ReturnEnd2
.ReturnRedraw:
call .Clear
jp .Reopen
.Clear:
call ClearBGPalettes
call Call_ExitMenu
call ReloadTilesetAndPalettes
call .DrawMenuAccount
call DrawVariableLengthMenuBox
call .DrawBugContestStatus
call UpdateSprites
call FinishExitMenu
ret
.MenuHeader:
db MENU_BACKUP_TILES ; flags
menu_coords 10, 0, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1
dw .MenuData
db 1 ; default selection
.ContestMenuHeader:
db MENU_BACKUP_TILES ; flags
menu_coords 10, 2, SCREEN_WIDTH - 1, SCREEN_HEIGHT - 1
dw .MenuData
db 1 ; default selection
.MenuData:
db STATICMENU_CURSOR | STATICMENU_WRAP | STATICMENU_ENABLE_START ; flags
dn 0, 0 ; rows, columns
dw wMenuItemsList
dw .MenuString
dw .Items
.Items:
; entries correspond to STARTMENUITEM_* constants
dw StartMenu_Pokedex, .PokedexString, .PokedexDesc
dw StartMenu_Pokemon, .PartyString, .PartyDesc
dw StartMenu_Pack, .PackString, .PackDesc
dw StartMenu_Status, .StatusString, .StatusDesc
dw StartMenu_Save, .SaveString, .SaveDesc
dw StartMenu_Option, .OptionString, .OptionDesc
dw StartMenu_Exit, .ExitString, .ExitDesc
dw StartMenu_Pokegear, .PokegearString, .PokegearDesc
dw StartMenu_Quit, .QuitString, .QuitDesc
.PokedexString: db "#DEX@"
.PartyString: db "#MON@"
.PackString: db "PACK@"
.StatusString: db "<PLAYER>@"
.SaveString: db "SAVE@"
.OptionString: db "OPTION@"
.ExitString: db "EXIT@"
.PokegearString: db "<POKE>GEAR@"
.QuitString: db "QUIT@"
.PokedexDesc:
db "#MON"
next "database@"
.PartyDesc:
db "Party <PKMN>"
next "status@"
.PackDesc:
db "Contains"
next "items@"
.PokegearDesc:
db "Trainer's"
next "key device@"
.StatusDesc:
db "Your own"
next "status@"
.SaveDesc:
db "Save your"
next "progress@"
.OptionDesc:
db "Change"
next "settings@"
.ExitDesc:
db "Close this"
next "menu@"
.QuitDesc:
db "Quit and"
next "be judged.@"
.OpenMenu:
ld a, [wMenuSelection]
call .GetMenuAccountTextPointer
ld a, [hli]
ld h, [hl]
ld l, a
jp hl
.MenuString:
push de
ld a, [wMenuSelection]
call .GetMenuAccountTextPointer
inc hl
inc hl
ld a, [hli]
ld d, [hl]
ld e, a
pop hl
call PlaceString
ret
.MenuDesc:
push de
ld a, [wMenuSelection]
cp $ff
jr z, .none
call .GetMenuAccountTextPointer
rept 4
inc hl
endr
ld a, [hli]
ld d, [hl]
ld e, a
pop hl
call PlaceString
ret
.none
pop de
ret
.GetMenuAccountTextPointer:
ld e, a
ld d, 0
ld hl, wMenuDataPointerTableAddr
ld a, [hli]
ld h, [hl]
ld l, a
rept 6
add hl, de
endr
ret
.SetUpMenuItems:
xor a
ld [wWhichIndexSet], a
call .FillMenuList
ld hl, wStatusFlags
bit STATUSFLAGS_POKEDEX_F, [hl]
jr z, .no_pokedex
ld a, STARTMENUITEM_POKEDEX
call .AppendMenuList
.no_pokedex
ld a, [wPartyCount]
and a
jr z, .no_pokemon
ld a, STARTMENUITEM_POKEMON
call .AppendMenuList
.no_pokemon
ld a, [wLinkMode]
and a
jr nz, .no_pack
ld hl, wStatusFlags2
bit STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl]
jr nz, .no_pack
ld a, STARTMENUITEM_PACK
call .AppendMenuList
.no_pack
ld hl, wPokegearFlags
bit POKEGEAR_OBTAINED_F, [hl]
jr z, .no_pokegear
ld a, STARTMENUITEM_POKEGEAR
call .AppendMenuList
.no_pokegear
ld a, STARTMENUITEM_STATUS
call .AppendMenuList
ld a, [wLinkMode]
and a
jr nz, .no_save
ld hl, wStatusFlags2
bit STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl]
ld a, STARTMENUITEM_QUIT
jr nz, .write
ld a, STARTMENUITEM_SAVE
.write
call .AppendMenuList
.no_save
ld a, STARTMENUITEM_OPTION
call .AppendMenuList
ld a, STARTMENUITEM_EXIT
call .AppendMenuList
ld a, c
ld [wMenuItemsList], a
ret
.FillMenuList:
xor a
ld hl, wMenuItemsList
ld [hli], a
ld a, -1
ld bc, wMenuItemsListEnd - (wMenuItemsList + 1)
call ByteFill
ld de, wMenuItemsList + 1
ld c, 0
ret
.AppendMenuList:
ld [de], a
inc de
inc c
ret
.DrawMenuAccount:
jp ._DrawMenuAccount
.PrintMenuAccount:
call .IsMenuAccountOn
ret z
call ._DrawMenuAccount
decoord 0, 14
jp .MenuDesc
._DrawMenuAccount:
call .IsMenuAccountOn
ret z
hlcoord 0, 13
lb bc, 5, 10
call ClearBox
hlcoord 0, 13
ld b, 3
ld c, 8
jp TextboxAttributes1bpp
.IsMenuAccountOn:
ld a, [wOptions2]
and 1 << MENU_ACCOUNT
ret
.DrawBugContestStatusBox:
ld hl, wStatusFlags2
bit STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl]
ret z
farcall StartMenu_DrawBugContestStatusBox
ret
.DrawBugContestStatus:
ld hl, wStatusFlags2
bit STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl]
jr nz, .contest
ret
.contest
farcall StartMenu_PrintBugContestStatus
ret
StartMenu_Exit:
; Exit the menu.
ld a, 1
ret
StartMenu_Quit:
; Retire from the bug catching contest.
ld hl, .StartMenuContestEndText
call StartMenuYesNo
jr c, .DontEndContest
ld a, BANK(BugCatchingContestReturnToGateScript)
ld hl, BugCatchingContestReturnToGateScript
call FarQueueScript
ld a, 4
ret
.DontEndContest:
ld a, 0
ret
.StartMenuContestEndText:
text_far _StartMenuContestEndText
text_end
StartMenu_Save:
; Save the game.
call BufferScreen
farcall SaveMenu
jr nc, .saved
ld a, 0
ret
.saved
ld a, 1
ret
StartMenu_Option:
; Game options.
call FadeToMenu
farcall Option
ld a, 6
ret
StartMenu_Status:
; Player status.
call FadeToMenu
farcall TrainerCard
call CloseSubmenu
ld a, 0
ret
StartMenu_Pokedex:
ld a, [wPartyCount]
and a
jr z, .empty
call FadeToMenu
farcall Pokedex
call CloseSubmenu
.empty
ld a, 0
ret
StartMenu_Pokegear:
call FadeToMenu
farcall PokeGear
call CloseSubmenu
ld a, 0
ret
StartMenu_Pack:
call FadeToMenu
farcall Pack
ld a, [wPackUsedItem]
and a
jr nz, .used_item
call CloseSubmenu
ld a, 0
ret
.used_item
call ExitAllMenus
ld a, 4
ret
StartMenu_Pokemon:
ld a, [wPartyCount]
and a
jr z, .return
call FadeToMenu
farcall Party
jr nc, .quit
.return
call CloseSubmenu
ld a, 0
ret
.quit
ld a, b
push af
call ExitAllMenus
pop af
ret