summaryrefslogtreecommitdiff
path: root/src/engine/menus
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/menus')
-rw-r--r--src/engine/menus/card_album.asm4
-rw-r--r--src/engine/menus/config.asm356
-rw-r--r--src/engine/menus/debug.asm125
-rw-r--r--src/engine/menus/debug_main.asm54
-rw-r--r--src/engine/menus/deck_machine.asm6
-rw-r--r--src/engine/menus/deck_selection.asm4
-rw-r--r--src/engine/menus/diary.asm52
-rw-r--r--src/engine/menus/duel_init.asm225
-rw-r--r--src/engine/menus/gift_center.asm100
-rw-r--r--src/engine/menus/give_booster_pack.asm112
-rw-r--r--src/engine/menus/init_menu.asm46
-rw-r--r--src/engine/menus/labels.asm72
-rw-r--r--src/engine/menus/mail.asm536
-rw-r--r--src/engine/menus/main_menu.asm93
-rw-r--r--src/engine/menus/medal.asm60
-rw-r--r--src/engine/menus/naming.asm145
-rw-r--r--src/engine/menus/pc_glossary.asm11
-rw-r--r--src/engine/menus/print_stats.asm242
-rw-r--r--src/engine/menus/start.asm24
-rw-r--r--src/engine/menus/status.asm36
-rw-r--r--src/engine/menus/wait_keys.asm13
21 files changed, 2297 insertions, 19 deletions
diff --git a/src/engine/menus/card_album.asm b/src/engine/menus/card_album.asm
index 4459169..797bc60 100644
--- a/src/engine/menus/card_album.asm
+++ b/src/engine/menus/card_album.asm
@@ -793,7 +793,7 @@ HandleCardAlbumScreen:
call LoadCursorTile
call LoadSymbolsFont
call LoadDuelCardSymbolTiles
- bank1call SetDefaultPalettes
+ bank1call SetDefaultConsolePalettes
lb de, $3c, $ff
call SetupText
lb de, 1, 1
@@ -898,7 +898,7 @@ HandleCardAlbumScreen:
call LoadCursorTile
call LoadSymbolsFont
call LoadDuelCardSymbolTiles
- bank1call SetDefaultPalettes
+ bank1call SetDefaultConsolePalettes
lb de, $3c, $ff
call SetupText
diff --git a/src/engine/menus/config.asm b/src/engine/menus/config.asm
new file mode 100644
index 0000000..2404259
--- /dev/null
+++ b/src/engine/menus/config.asm
@@ -0,0 +1,356 @@
+_PauseMenu_Config:
+ ld a, [wd291]
+ push af
+ ld a, [wLineSeparation]
+ push af
+ xor a
+ ld [wConfigExitSettingsCursorPos], a
+ ld a, 1
+ ld [wLineSeparation], a
+ call InitMenuScreen
+ lb de, 0, 3
+ lb bc, 20, 5
+ call DrawRegularTextBox
+ lb de, 0, 9
+ lb bc, 20, 5
+ call DrawRegularTextBox
+ ld hl, ConfigScreenLabels
+ call PrintLabels
+ call GetConfigCursorPositions
+ ld a, 0
+ call ShowConfigMenuCursor
+ ld a, 1
+ call ShowConfigMenuCursor
+ xor a
+ ld [wCursorBlinkTimer], a
+ call FlashWhiteScreen
+.asm_10588
+ call DoFrameIfLCDEnabled
+ ld a, [wConfigCursorYPos]
+ call UpdateConfigMenuCursor
+ ld hl, wCursorBlinkTimer
+ inc [hl]
+ call ConfigScreenHandleDPadInput
+ ldh a, [hKeysPressed]
+ and B_BUTTON | START
+ jr nz, .asm_105ab
+ ld a, [wConfigCursorYPos]
+ cp $02
+ jr nz, .asm_10588
+ ldh a, [hKeysPressed]
+ and A_BUTTON
+ jr z, .asm_10588
+.asm_105ab
+ ld a, SFX_02
+ call PlaySFX
+ call SaveConfigSettings
+ pop af
+ ld [wLineSeparation], a
+ pop af
+ ld [wd291], a
+ ret
+
+ConfigScreenLabels:
+ db 1, 1
+ tx ConfigMenuTitleText
+
+ db 1, 4
+ tx ConfigMenuMessageSpeedText
+
+ db 1, 10
+ tx ConfigMenuDuelAnimationText
+
+ db 1, 16
+ tx ConfigMenuExitText
+
+ db $ff
+
+; checks the current saved configuration settings
+; and sets wConfigMessageSpeedCursorPos and wConfigDuelAnimationCursorPos
+; to the right positions for those values
+GetConfigCursorPositions:
+ call EnableSRAM
+ ld c, 0
+ ld hl, TextDelaySettings
+.loop
+ ld a, [sTextSpeed]
+ cp [hl]
+ jr nc, .match
+ inc hl
+ inc c
+ ld a, c
+ cp 4
+ jr c, .loop
+.match
+ ld a, c
+ ld [wConfigMessageSpeedCursorPos], a
+ ld a, [sSkipDelayAllowed]
+ and $1
+ rlca
+ ld c, a
+ ld a, [wAnimationsDisabled]
+ and $1
+ or c
+ ld c, a
+ ld b, $00
+ ld hl, DuelAnimationSettingsIndices
+ add hl, bc
+ ld a, [hl]
+ ld [wConfigDuelAnimationCursorPos], a
+ call DisableSRAM
+ ret
+
+; indexes into DuelAnimationSettings
+; 0: show all
+; 1: skip some
+; 2: none
+DuelAnimationSettingsIndices:
+ db 0 ; skip delay allowed = false, animations disabled = false
+ db 0 ; skip delay allowed = false, animations disabled = true (unused)
+ db 1 ; skip delay allowed = true, animations disabled = false
+ db 2 ; skip delay allowed = true, animations disabled = true
+
+SaveConfigSettings:
+ call EnableSRAM
+ ld a, [wConfigDuelAnimationCursorPos]
+ and %11
+ rlca
+ ld c, a
+ ld b, $00
+ ld hl, DuelAnimationSettings
+ add hl, bc
+ ld a, [hli]
+ ld [wAnimationsDisabled], a
+ ld [sAnimationsDisabled], a
+ ld a, [hl]
+ ld [sSkipDelayAllowed], a
+ call DisableSRAM
+ ld a, [wConfigMessageSpeedCursorPos]
+ ld c, a
+ ld b, $00
+ ld hl, TextDelaySettings
+ add hl, bc
+ call EnableSRAM
+ ld a, [hl]
+ ld [sTextSpeed], a
+ ld [wTextSpeed], a
+ call DisableSRAM
+ ret
+
+DuelAnimationSettings:
+; animation disabled, skip delay allowed
+ db FALSE, FALSE ; show all
+ db FALSE, TRUE ; skip some
+ db TRUE, TRUE ; none
+ db FALSE, FALSE ; unused
+
+; text printing delay
+TextDelaySettings:
+ ; slow to fast
+ db 6, 4, 2, 1, 0
+
+UpdateConfigMenuCursor:
+ push af
+ ld a, [wCursorBlinkTimer]
+ and $10
+ jr z, .show
+ pop af
+ jr HideConfigMenuCursor
+.show
+ pop af
+ jr ShowConfigMenuCursor ; can be fallthrough
+
+ShowConfigMenuCursor:
+ push bc
+ ld c, a
+ ld a, SYM_CURSOR_R
+ call DrawConfigMenuCursor
+ pop bc
+ ret
+
+HideConfigMenuCursor:
+ push bc
+ ld c, a
+ ld a, SYM_SPACE
+ call DrawConfigMenuCursor
+ pop bc
+ ret
+
+DrawConfigMenuCursor:
+ push af
+ sla c
+ ld b, $00
+ ld hl, ConfigScreenCursorPositions
+ add hl, bc
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+
+ ld a, [hli]
+ ld c, a
+ ld a, [hli]
+ ld b, a
+ ld a, [bc]
+ add a
+ ld c, a
+ ld b, $00
+ add hl, bc
+ ld a, [hli]
+ ld b, a
+ ld a, [hl]
+ ld c, a
+ pop af
+ call WriteByteToBGMap0
+ ret
+
+ConfigScreenCursorPositions:
+ dw MessageSpeedCursorPositions
+ dw DuelAnimationsCursorPositions
+ dw ExitSettingsCursorPosition
+
+MessageSpeedCursorPositions:
+ dw wConfigMessageSpeedCursorPos
+ db 5, 6
+ db 7, 6
+ db 9, 6
+ db 11, 6
+ db 13, 6
+
+DuelAnimationsCursorPositions:
+ dw wConfigDuelAnimationCursorPos
+ db 1, 12
+ db 7, 12
+ db 15, 12
+
+ExitSettingsCursorPosition:
+ dw wConfigExitSettingsCursorPos
+ db 1, 16
+
+ db 0
+
+ConfigScreenHandleDPadInput:
+ ldh a, [hDPadHeld]
+ and D_PAD
+ ret z
+ farcall GetDirectionFromDPad
+ ld hl, ConfigScreenDPadHandlers
+ jp JumpToFunctionInTable
+
+ConfigScreenDPadHandlers:
+ dw ConfigScreenDPadUp ; up
+ dw ConfigScreenDPadRight ; right
+ dw ConfigScreenDPadDown ; down
+ dw ConfigScreenDPadLeft ; left
+
+ConfigScreenDPadUp:
+ ld a, -1
+ jr ConfigScreenDPadDown.up_or_down
+
+ConfigScreenDPadDown:
+ ld a, 1
+.up_or_down
+ push af
+ ld a, [wConfigCursorYPos]
+ cp 2
+ jr z, .hide_cursor
+ call ShowConfigMenuCursor
+ jr .skip
+.hide_cursor
+; hide "exit settings" cursor if leaving bottom row
+ call HideConfigMenuCursor
+.skip
+ ld a, [wConfigCursorYPos]
+ ld b, a
+ pop af
+ add b
+ cp 3
+ jr c, .valid
+ jr z, .wrap_min
+; wrap max
+ ld a, 2 ; max
+ jr .valid
+.wrap_min
+ xor a ; min
+.valid
+ ld [wConfigCursorYPos], a
+ ld c, a
+ ld b, 0
+ ld hl, Unknown_106ff
+ add hl, bc
+ ld a, [hl]
+ ld [wCursorBlinkTimer], a
+ ld a, [wConfigCursorYPos]
+ call UpdateConfigMenuCursor
+ ld a, SFX_01
+ call PlaySFX
+ ret
+
+Unknown_106ff:
+ db $18 ; message speed, start hidden
+ db $18 ; duel animation, start hidden
+ db $8 ; exit settings, start visible
+
+ConfigScreenDPadRight:
+ ld a, 1
+ jr ConfigScreenDPadLeft.left_or_right
+
+ConfigScreenDPadLeft:
+ ld a, -1
+.left_or_right
+ push af
+ ld a, [wConfigCursorYPos]
+ call HideConfigMenuCursor
+ pop af
+ call .ApplyPosChange
+ ld a, [wConfigCursorYPos]
+ call ShowConfigMenuCursor
+ xor a
+ ld [wCursorBlinkTimer], a
+ ret
+
+; a = 1 for right, -1 for left
+.ApplyPosChange
+ push af
+ ld a, [wConfigCursorYPos]
+ ld c, a
+ add a
+ add c ; *3
+ ld c, a
+ ld b, $00
+ ld hl, .MaxCursorPositions
+ add hl, bc
+ ld a, [hli]
+ ld e, a
+ ld a, [hli]
+ ld d, a
+ ld c, [hl] ; max value
+ ld a, [de]
+ ld b, a
+ pop af
+ add b ; apply pos change
+ cp c
+ jr c, .got_new_pos
+ jr z, .got_new_pos
+ cp $80
+ jr c, .wrap_around
+ ; wrap to last
+ ld a, c
+ jr .got_new_pos
+.wrap_around
+ ; wrap to first
+ xor a
+.got_new_pos
+ ld [de], a
+ ld a, c
+ or a
+ jr z, .skip_sfx
+ ld a, SFX_01
+ call PlaySFX
+.skip_sfx
+ ret
+
+.MaxCursorPositions:
+; x pos variable, max x value
+ dwb wConfigMessageSpeedCursorPos, 4
+ dwb wConfigDuelAnimationCursorPos, 2
+ dwb wConfigExitSettingsCursorPos, 0
diff --git a/src/engine/menus/debug.asm b/src/engine/menus/debug.asm
new file mode 100644
index 0000000..c33e92b
--- /dev/null
+++ b/src/engine/menus/debug.asm
@@ -0,0 +1,125 @@
+DebugLookAtSprite:
+ farcall Func_80cd7
+ scf
+ ret
+
+DebugVEffect:
+ farcall Func_80cd6
+ scf
+ ret
+
+DebugCreateBoosterPack:
+.go_back
+ ld a, [wDebugBoosterSelection]
+ ld hl, Unknown_12919
+ call InitAndPrintMenu
+.input_loop_1
+ call DoFrameIfLCDEnabled
+ call HandleMenuInput
+ jr nc, .input_loop_1
+ ldh a, [hCurMenuItem]
+ cp e
+ jr nz, .cancel
+ ld [wDebugBoosterSelection], a
+ add a
+ ld c, a
+ ld b, $00
+ ld hl, Unknown_127f1
+ add hl, bc
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ xor a
+ call InitAndPrintMenu
+.input_loop_2
+ call DoFrameIfLCDEnabled
+ call HandleMenuInput
+ jr nc, .input_loop_2
+ ldh a, [hCurMenuItem]
+ cp e
+ jr nz, .go_back
+ ld a, [wDebugBoosterSelection]
+ ld c, a
+ ld b, $00
+ ld hl, Unknown_127fb
+ add hl, bc
+ ld a, [hl]
+ add e
+ farcall GenerateBoosterPack
+ farcall OpenBoosterPack
+.cancel
+ scf
+ ret
+
+Unknown_127f1:
+ dw Unknown_1292a
+ dw Unknown_1292a
+ dw Unknown_1293b
+ dw Unknown_1294c
+ dw Unknown_1295d
+
+Unknown_127fb:
+ db BOOSTER_COLOSSEUM_NEUTRAL
+ db BOOSTER_EVOLUTION_NEUTRAL
+ db BOOSTER_MYSTERY_NEUTRAL
+ db BOOSTER_LABORATORY_NEUTRAL
+ db BOOSTER_ENERGY_LIGHTNING_FIRE
+
+DebugCredits:
+ farcall PlayCreditsSequence
+ scf
+ ret
+
+DebugCGBTest:
+ farcall Func_1c865
+ scf
+ ret
+
+DebugSGBFrame:
+ call DisableLCD
+ ld a, [wDebugSGBBorder]
+ farcall SetSGBBorder
+ ld a, [wDebugSGBBorder]
+ inc a
+ cp $04
+ jr c, .asm_1281f
+ xor a
+.asm_1281f
+ ld [wDebugSGBBorder], a
+ scf
+ ret
+
+DebugDuelMode:
+ call EnableSRAM
+ ld a, [sDebugDuelMode]
+ and $01
+ ld [sDebugDuelMode], a
+ ld hl, Unknown_12908
+ call InitAndPrintMenu
+.input_loop
+ call DoFrameIfLCDEnabled
+ call HandleMenuInput
+ jr nc, .input_loop
+ ldh a, [hCurMenuItem]
+ cp e
+ jr nz, .input_loop
+ and $01
+ ld [sDebugDuelMode], a
+ call DisableSRAM
+ scf
+ ret
+
+DebugStandardBGCharacter:
+ ld a, $80
+ ld de, $0
+ lb bc, 16, 16
+ lb hl, 1, 16
+ call FillRectangle
+ ld a, BUTTONS | D_PAD
+ call WaitUntilKeysArePressed
+ scf
+ ret
+
+DebugQuit:
+ or a
+ ret
diff --git a/src/engine/menus/debug_main.asm b/src/engine/menus/debug_main.asm
new file mode 100644
index 0000000..099e195
--- /dev/null
+++ b/src/engine/menus/debug_main.asm
@@ -0,0 +1,54 @@
+; unreferenced debug menu
+Func_12661:
+ xor a
+ ld [wDebugMenuSelection], a
+ ld [wDebugBoosterSelection], a
+ ld a, $03
+ ld [wDebugSGBBorder], a
+.asm_1266d
+ call DisableLCD
+ ld a, $00
+ ld [wTileMapFill], a
+ call EmptyScreen
+ call LoadSymbolsFont
+ lb de, $30, $7f
+ call SetupText
+ call Func_3ca0
+ call Func_12871
+ ld a, $01
+ ld [wLineSeparation], a
+ ld a, [wDebugMenuSelection]
+ ld hl, Unknown_128f7
+ call InitAndPrintMenu
+ call EnableLCD
+.asm_12698
+ call DoFrameIfLCDEnabled
+ call HandleMenuInput
+ jr nc, .asm_12698
+ ldh a, [hCurMenuItem]
+ bit 7, a
+ jr nz, .asm_12698
+ ld [wDebugMenuSelection], a
+ xor a
+ ld [wLineSeparation], a
+ call Func_126b3
+ jr c, .asm_1266d
+ ret
+
+Func_126b3:
+ ldh a, [hCurMenuItem]
+ ld hl, Unknown_126bb
+ jp JumpToFunctionInTable
+
+Unknown_126bb:
+ dw _GameLoop
+ dw DebugDuelMode
+ dw MainMenu_ContinueFromDiary
+ dw DebugCGBTest
+ dw DebugSGBFrame
+ dw DebugStandardBGCharacter
+ dw DebugLookAtSprite
+ dw DebugVEffect
+ dw DebugCreateBoosterPack
+ dw DebugCredits
+ dw DebugQuit
diff --git a/src/engine/menus/deck_machine.asm b/src/engine/menus/deck_machine.asm
index 90f90db..567bcb0 100644
--- a/src/engine/menus/deck_machine.asm
+++ b/src/engine/menus/deck_machine.asm
@@ -172,7 +172,7 @@ Func_af1d:
ld a, $1
ld [wVBlankOAMCopyToggle], a
call LoadSymbolsFont
- bank1call SetDefaultPalettes
+ bank1call SetDefaultConsolePalettes
lb de, $3c, $bf
call SetupText
@@ -797,7 +797,7 @@ ClearScreenAndDrawDeckMachineScreen:
ld [wVBlankOAMCopyToggle], a
call LoadSymbolsFont
call LoadDuelCardSymbolTiles
- bank1call SetDefaultPalettes
+ bank1call SetDefaultConsolePalettes
lb de, $3c, $ff
call SetupText
lb de, 0, 0
@@ -2104,7 +2104,7 @@ HandleAutoDeckMenu:
ld [wVBlankOAMCopyToggle], a
call LoadSymbolsFont
call LoadDuelCardSymbolTiles
- bank1call SetDefaultPalettes
+ bank1call SetDefaultConsolePalettes
lb de, $3c, $ff
call SetupText
lb de, 0, 0
diff --git a/src/engine/menus/deck_selection.asm b/src/engine/menus/deck_selection.asm
index bac7ffa..1ee2404 100644
--- a/src/engine/menus/deck_selection.asm
+++ b/src/engine/menus/deck_selection.asm
@@ -67,7 +67,7 @@ EmptyScreenAndLoadFontDuelAndHandCardsIcons:
call LoadSymbolsFont
call LoadDuelCardSymbolTiles
call LoadHandCardsIcon
- bank1call SetDefaultPalettes
+ bank1call SetDefaultConsolePalettes
lb de, $3c, $bf
call SetupText
ret
@@ -86,7 +86,7 @@ Func_8d78:
call LoadSymbolsFont
call LoadDuelCardSymbolTiles
call LoadHandCardsIcon
- bank1call SetDefaultPalettes
+ bank1call SetDefaultConsolePalettes
lb de, $3c, $bf
call SetupText
ret
diff --git a/src/engine/menus/diary.asm b/src/engine/menus/diary.asm
new file mode 100644
index 0000000..9855203
--- /dev/null
+++ b/src/engine/menus/diary.asm
@@ -0,0 +1,52 @@
+_PauseMenu_Diary:
+ ld a, [wd291]
+ push af
+ call InitMenuScreen
+ lb de, 0, 0
+ lb bc, 20, 12
+ call DrawRegularTextBox
+ ld hl, DiaryScreenLabels
+ call PrintLabels
+ lb bc, 1, 3
+ call DrawPauseMenuPlayerPortrait
+ lb bc, 12, 8
+ call PrintAlbumProgress
+ lb bc, 13, 10
+ call PrintPlayTime
+ lb bc, 16, 6
+ call PrintMedalCount
+ call FlashWhiteScreen
+ ldtx hl, PlayerDiarySaveQuestionText
+ call YesOrNoMenuWithText_SetCursorToYes
+ jr c, .cancel
+ farcall BackupPlayerPosition
+ call SaveAndBackupData
+ ld a, SFX_56
+ call PlaySFX
+ ldtx hl, PlayerDiarySaveConfirmText
+ jr .print_result_text
+.cancel
+ ldtx hl, PlayerDiarySaveCancelText
+.print_result_text
+ call PrintScrollableText_NoTextBoxLabel
+ pop af
+ ld [wd291], a
+ ret
+
+DiaryScreenLabels:
+ db 5, 1
+ tx PlayerDiaryTitleText
+
+ db 7, 4
+ tx PlayerStatusNameText
+
+ db 7, 6
+ tx PlayerDiaryMedalsWonText
+
+ db 7, 8
+ tx PlayerStatusAlbumText
+
+ db 7, 10
+ tx PlayerStatusPlayTimeText
+
+ db $ff
diff --git a/src/engine/menus/duel_init.asm b/src/engine/menus/duel_init.asm
new file mode 100644
index 0000000..a6f15f1
--- /dev/null
+++ b/src/engine/menus/duel_init.asm
@@ -0,0 +1,225 @@
+Duel_Init:
+ ld a, [wd291]
+ push af
+ call DisableLCD
+ call InitMenuScreen
+ ld a, $4
+ ld [wTextBoxFrameType], a
+ lb de, 0, 12
+ lb bc, 20, 6
+ call DrawRegularTextBox
+ ld a, [wNPCDuelDeckID]
+ add a
+ add a
+ ld c, a
+ ld b, $0
+ ld hl, OpponentTitlesAndDeckNames
+ add hl, bc
+ ld a, [hli]
+ ld [wTxRam2], a
+ ld a, [hli]
+ ld [wTxRam2 + 1], a
+ push hl
+ ld a, [wOpponentName]
+ ld [wTxRam2_b], a
+ ld a, [wOpponentName + 1]
+ ld [wTxRam2_b + 1], a
+ ld hl, OpponentTitleAndNameLabel
+ call PrintLabels ; LoadDuelistName
+ pop hl
+ ld a, [hli]
+ ld [wTxRam2], a
+ ld c, a
+ ld a, [hli]
+ ld [wTxRam2 + 1], a
+ or c
+ jr z, .skip_deck_name
+ ld hl, OpponentDeckNameLabel
+ call PrintLabels ; LoadDeckName
+.skip_deck_name
+ lb bc, 7, 3
+ ld a, [wOpponentPortrait]
+ call DrawOpponentPortrait
+ ld a, [wMatchStartTheme]
+ call PlaySong
+ call FlashWhiteScreen
+ call DoFrameIfLCDEnabled
+ lb bc, $2f, $1d ; cursor tile, tile behind cursor
+ lb de, 18, 17 ; x, y
+ call SetCursorParametersForTextBox
+ call WaitForButtonAorB
+ call WaitForSongToFinish
+ call FadeScreenToWhite ; fade out
+ pop af
+ ld [wd291], a
+ ret
+
+OpponentTitleAndNameLabel:
+ db 1, 14
+ tx OpponentTitleAndNameText
+ db $ff
+
+OpponentDeckNameLabel:
+ db 1, 16
+ tx OpponentDeckNameText
+ db $ff
+
+OpponentTitlesAndDeckNames:
+ tx TechText
+ tx SamsPracticeDeckName
+
+ tx EmptyText
+ dw NULL
+
+ tx TechText
+ tx SamsPracticeDeckName
+
+ tx EmptyText
+ dw NULL
+
+ tx EmptyText
+ dw NULL
+
+ tx EmptyText
+ dw NULL
+
+ tx EmptyText
+ dw NULL
+
+ tx EmptyText
+ dw NULL
+
+ tx EmptyText
+ dw NULL
+
+ tx TechText
+ tx LightningAndFireDeckName
+
+ tx TechText
+ tx WaterAndFightingDeckName
+
+ tx TechText
+ tx GrassAndPsychicDeckName
+
+ tx GrandMasterText
+ tx LegendaryMoltresDeckName
+
+ tx GrandMasterText
+ tx LegendaryZapdosDeckName
+
+ tx GrandMasterText
+ tx LegendaryArticunoDeckName
+
+ tx GrandMasterText
+ tx LegendaryDragoniteDeckName
+
+ tx FightingClubMasterText
+ tx FirstStrikeDeckName
+
+ tx RockClubMasterText
+ tx RockCrusherDeckName
+
+ tx WaterClubMasterText
+ tx GoGoRainDanceDeckName
+
+ tx LightningClubMasterText
+ tx ZappingSelfdestructDeckName
+
+ tx GrassClubMasterText
+ tx FlowerPowerDeckName
+
+ tx PsychicClubMasterText
+ tx StrangePsyshockDeckName
+
+ tx ScienceClubMasterText
+ tx WondersofScienceDeckName
+
+ tx FireClubMasterText
+ tx FireChargeDeckName
+
+ tx EmptyText
+ tx ImRonaldDeckName
+
+ tx EmptyText
+ tx PowerfulRonaldDeckName
+
+ tx EmptyText
+ tx InvincibleRonaldDeckName
+
+ tx EmptyText
+ tx LegendaryRonaldDeckName
+
+ tx FightingClubMemberText
+ tx MusclesforBrainsDeckName
+
+ tx FightingClubMemberText
+ tx HeatedBattleDeckName
+
+ tx FightingClubMemberText
+ tx LovetoBattleDeckName
+
+ tx RockClubMemberText
+ tx ExcavationDeckName
+
+ tx RockClubMemberText
+ tx BlisteringPokemonDeckName
+
+ tx RockClubMemberText
+ tx HardPokemonDeckName
+
+ tx WaterClubMemberText
+ tx WaterfrontPokemonDeckName
+
+ tx WaterClubMemberText
+ tx LonelyFriendsDeckName
+
+ tx WaterClubMemberText
+ tx SoundoftheWavesDeckName
+
+ tx LightningClubMemberText
+ tx PikachuDeckName
+
+ tx LightningClubMemberText
+ tx BoomBoomSelfdestructDeckName
+
+ tx LightningClubMemberText
+ tx PowerGeneratorDeckName
+
+ tx GrassClubMemberText
+ tx EtceteraDeckName
+
+ tx GrassClubMemberText
+ tx FlowerGardenDeckName
+
+ tx GrassClubMemberText
+ tx KaleidoscopeDeckName
+
+ tx PsychicClubMemberText
+ tx GhostDeckName
+
+ tx PsychicClubMemberText
+ tx NapTimeDeckName
+
+ tx PsychicClubMemberText
+ tx StrangePowerDeckName
+
+ tx ScienceClubMemberText
+ tx FlyinPokemonDeckName
+
+ tx ScienceClubMemberText
+ tx LovelyNidoranDeckName
+
+ tx ScienceClubMemberText
+ tx PoisonDeckName
+
+ tx FireClubMemberText
+ tx AngerDeckName
+
+ tx FireClubMemberText
+ tx FlamethrowerDeckName
+
+ tx FireClubMemberText
+ tx ReshuffleDeckName
+
+ tx StrangeLifeformText
+ tx ImakuniDeckName
diff --git a/src/engine/menus/gift_center.asm b/src/engine/menus/gift_center.asm
new file mode 100644
index 0000000..23c3e3c
--- /dev/null
+++ b/src/engine/menus/gift_center.asm
@@ -0,0 +1,100 @@
+Unknown_10d98:
+ db 12, 0 ; start menu coords
+ db 8, 14 ; start menu text box dimensions
+
+ db 14, 2 ; text alignment for InitTextPrinting
+ tx PauseMenuOptionsText
+ db $ff
+
+ db 13, 2 ; cursor x, cursor y
+ db 2 ; y displacement between items
+ db 6 ; number of items
+ db SYM_CURSOR_R ; cursor tile number
+ db SYM_SPACE ; tile behind cursor
+ dw NULL ; function pointer if non-0
+
+Unknown_10da9:
+ db 10, 0 ; start menu coords
+ db 10, 12 ; start menu text box dimensions
+
+ db 12, 2 ; text alignment for InitTextPrinting
+ tx Text0351
+ db $ff
+
+ db 11, 2 ; cursor x, cursor y
+ db 2 ; y displacement between items
+ db 5 ; number of items
+ db SYM_CURSOR_R ; cursor tile number
+ db SYM_SPACE ; tile behind cursor
+ dw NULL ; function pointer if non-0
+
+GiftCenterMenu:
+ ld a, 1 << AUTO_CLOSE_TEXTBOX
+ farcall SetOverworldNPCFlags
+ ld a, [wSelectedGiftCenterMenuItem]
+ ld hl, Unknown_10e17
+ farcall InitAndPrintMenu
+.loop_input
+ call DoFrameIfLCDEnabled
+ call HandleMenuInput
+ jr nc, .loop_input
+ ld a, e
+ ld [wSelectedGiftCenterMenuItem], a
+ ldh a, [hCurMenuItem]
+ cp e
+ jr z, .asm_10ddd
+ ld a, $4
+
+.asm_10ddd
+ ld [wd10e], a
+ push af
+ ld hl, Unknown_10df0
+ call JumpToFunctionInTable
+ farcall CloseTextBox
+ call DoFrameIfLCDEnabled
+ pop af
+ ret
+
+Unknown_10df0:
+ dw Func_10dfb
+ dw Func_10dfb
+ dw Func_10dfb
+ dw Func_10dfb
+ dw Func_10dfa
+
+Func_10dfa:
+ ret
+
+Func_10dfb:
+ ld a, [wd10e]
+ add a
+ ld c, a
+ ld b, $00
+ ld hl, Unknown_10e0f
+ add hl, bc
+ ld a, [hli]
+ ld [wTxRam2], a
+ ld a, [hl]
+ ld [wTxRam2 + 1], a
+ ret
+
+Unknown_10e0f:
+ tx SendCardText
+ tx ReceiveCardText
+ tx SendDeckConfigurationText
+ tx ReceiveDeckConfigurationText
+
+Unknown_10e17:
+ db 4, 0 ; start menu coords
+ db 16, 12 ; start menu text box dimensions
+
+ db 6, 2 ; text alignment for InitTextPrinting
+ tx GiftCenterMenuText
+ db $ff
+
+ db 5, 2 ; cursor x, cursor y
+ db 2 ; y displacement between items
+ db 5 ; number of items
+ db SYM_CURSOR_R ; cursor tile number
+ db SYM_SPACE ; tile behind cursor
+ dw NULL ; function pointer if non-0
diff --git a/src/engine/menus/give_booster_pack.asm b/src/engine/menus/give_booster_pack.asm
new file mode 100644
index 0000000..8aa26ea
--- /dev/null
+++ b/src/engine/menus/give_booster_pack.asm
@@ -0,0 +1,112 @@
+GiveBoosterPack:
+ ld c, a
+ ld a, [wd291]
+ push af
+ push bc
+ call DisableLCD
+ call InitMenuScreen
+ xor a
+ ld [wTextBoxFrameType], a
+ pop bc
+ push bc
+ ld b, 0
+ ld hl, BoosterTypes
+ add hl, bc
+ ld a, [hl]
+ ld c, a
+ add a
+ add a
+ ld c, a
+ ld hl, BoosterScenesAndNameTexts
+ add hl, bc
+ ld a, [hli]
+ push hl
+ lb bc, 6, 0
+ call LoadBoosterGfx
+ pop hl
+ ld a, [hli]
+ ld [wTxRam3], a
+ xor a
+ ld [wTxRam3 + 1], a
+ ld a, [hli]
+ ld [wTxRam2], a
+ ld a, [hl]
+ ld [wTxRam2 + 1], a
+ call FlashWhiteScreen
+ call PauseSong
+ ld a, MUSIC_BOOSTER_PACK
+ call PlaySong
+ pop bc
+ ld a, c
+ farcall GenerateBoosterPack
+ ldtx hl, ReceivedBoosterPackText
+ ld a, [wAnotherBoosterPack]
+ cp TRUE
+ jr nz, .first_booster
+ ldtx hl, AndAnotherBoosterPackText
+.first_booster
+ call PrintScrollableText_NoTextBoxLabel
+ call WaitForSongToFinish
+ call ResumeSong
+ ldtx hl, CheckedCardsInBoosterPackText
+ call PrintScrollableText_NoTextBoxLabel
+ call DisableLCD
+ call SetDefaultPalettes
+ call ZeroObjectPositions
+ ld a, $1
+ ld [wVBlankOAMCopyToggle], a
+ ld a, $4
+ ld [wTextBoxFrameType], a
+ farcall OpenBoosterPack
+ farcall WhiteOutDMGPals
+ call DoFrameIfLCDEnabled
+ pop af
+ ld [wd291], a
+ ret
+
+BoosterTypes:
+ db BOOSTER_COLOSSEUM ; BOOSTER_COLOSSEUM_NEUTRAL
+ db BOOSTER_COLOSSEUM ; BOOSTER_COLOSSEUM_GRASS
+ db BOOSTER_COLOSSEUM ; BOOSTER_COLOSSEUM_FIRE
+ db BOOSTER_COLOSSEUM ; BOOSTER_COLOSSEUM_WATER
+ db BOOSTER_COLOSSEUM ; BOOSTER_COLOSSEUM_LIGHTNING
+ db BOOSTER_COLOSSEUM ; BOOSTER_COLOSSEUM_FIGHTING
+ db BOOSTER_COLOSSEUM ; BOOSTER_COLOSSEUM_TRAINER
+ db BOOSTER_EVOLUTION ; BOOSTER_EVOLUTION_NEUTRAL
+ db BOOSTER_EVOLUTION ; BOOSTER_EVOLUTION_GRASS
+ db BOOSTER_EVOLUTION ; BOOSTER_EVOLUTION_FIRE
+ db BOOSTER_EVOLUTION ; BOOSTER_EVOLUTION_WATER
+ db BOOSTER_EVOLUTION ; BOOSTER_EVOLUTION_FIGHTING
+ db BOOSTER_EVOLUTION ; BOOSTER_EVOLUTION_PSYCHIC
+ db BOOSTER_EVOLUTION ; BOOSTER_EVOLUTION_TRAINER
+ db BOOSTER_MYSTERY ; BOOSTER_MYSTERY_NEUTRAL
+ db BOOSTER_MYSTERY ; BOOSTER_MYSTERY_GRASS_COLORLESS
+ db BOOSTER_MYSTERY ; BOOSTER_MYSTERY_WATER_COLORLESS
+ db BOOSTER_MYSTERY ; BOOSTER_MYSTERY_LIGHTNING_COLORLESS
+ db BOOSTER_MYSTERY ; BOOSTER_MYSTERY_FIGHTING_COLORLESS
+ db BOOSTER_MYSTERY ; BOOSTER_MYSTERY_TRAINER_COLORLESS
+ db BOOSTER_LABORATORY ; BOOSTER_LABORATORY_NEUTRAL
+ db BOOSTER_LABORATORY ; BOOSTER_LABORATORY_GRASS
+ db BOOSTER_LABORATORY ; BOOSTER_LABORATORY_WATER
+ db BOOSTER_LABORATORY ; BOOSTER_LABORATORY_PSYCHIC
+ db BOOSTER_LABORATORY ; BOOSTER_LABORATORY_TRAINER
+ db BOOSTER_COLOSSEUM ; BOOSTER_ENERGY_LIGHTNING_FIRE
+ db BOOSTER_COLOSSEUM ; BOOSTER_ENERGY_WATER_FIGHTING
+ db BOOSTER_COLOSSEUM ; BOOSTER_ENERGY_GRASS_PSYCHIC
+ db BOOSTER_COLOSSEUM ; BOOSTER_ENERGY_RANDOM
+
+BoosterScenesAndNameTexts:
+ db SCENE_COLOSSEUM_BOOSTER, SCENE_COLOSSEUM_BOOSTER
+ tx ColosseumBoosterText
+
+ db SCENE_EVOLUTION_BOOSTER, SCENE_EVOLUTION_BOOSTER
+ tx EvolutionBoosterText
+
+ db SCENE_MYSTERY_BOOSTER, SCENE_MYSTERY_BOOSTER
+ tx MysteryBoosterText
+
+ db SCENE_LABORATORY_BOOSTER, SCENE_LABORATORY_BOOSTER
+ tx LaboratoryBoosterText
+
+_PauseMenu_Exit:
+ ret
diff --git a/src/engine/menus/init_menu.asm b/src/engine/menus/init_menu.asm
new file mode 100644
index 0000000..3757050
--- /dev/null
+++ b/src/engine/menus/init_menu.asm
@@ -0,0 +1,46 @@
+; empties screen in preparation to draw some menu
+InitMenuScreen:
+ ld a, $0
+ ld [wTileMapFill], a
+ call EmptyScreen
+ call LoadSymbolsFont
+ lb de, $30, $7f
+ call SetupText
+ call Set_OBJ_8x8
+ xor a
+ ldh [hSCX], a
+ ldh [hSCY], a
+ ld a, [wLCDC]
+ bit LCDC_ENABLE_F, a
+ jr nz, .skip_clear_scroll
+ xor a
+ ldh [rSCX], a
+ ldh [rSCY], a
+.skip_clear_scroll
+ call SetDefaultPalettes
+ call ZeroObjectPositions
+ ld a, $1
+ ld [wVBlankOAMCopyToggle], a
+ ret
+
+; saves all pals to SRAM, then fills them with white.
+; after flushing, it loads back the saved pals from SRAM.
+FlashWhiteScreen:
+ ldh a, [hBankSRAM]
+
+ push af
+ ld a, BANK("SRAM1")
+ call BankswitchSRAM
+ call CopyPalsToSRAMBuffer
+ call DisableSRAM
+ call SetWhitePalettes
+ call FlushAllPalettes
+ call EnableLCD
+ call DoFrameIfLCDEnabled
+ call LoadPalsFromSRAMBuffer
+ call FlushAllPalettes
+ pop af
+
+ call BankswitchSRAM
+ call DisableSRAM
+ ret
diff --git a/src/engine/menus/labels.asm b/src/engine/menus/labels.asm
new file mode 100644
index 0000000..4784bc4
--- /dev/null
+++ b/src/engine/menus/labels.asm
@@ -0,0 +1,72 @@
+; prints $ff-terminated list of text to text box
+; given 2 bytes for text alignment and 2 bytes for text ID
+PrintLabels:
+ ldh a, [hffb0]
+ push af
+ ld a, $02
+ ldh [hffb0], a
+
+ push hl
+.loop_text_print_1
+ ld d, [hl]
+ inc hl
+ bit 7, d
+ jr nz, .next
+ inc hl
+ ld a, [hli]
+ push hl
+ ld h, [hl]
+ ld l, a
+ call PrintTextNoDelay
+ pop hl
+ inc hl
+ jr .loop_text_print_1
+
+.next
+ pop hl
+ pop af
+ ldh [hffb0], a
+.loop_text_print_2
+ ld d, [hl]
+ inc hl
+ bit 7, d
+ ret nz
+ ld e, [hl]
+ inc hl
+ call AdjustCoordinatesForBGScroll
+ call InitTextPrinting
+ ld a, [hli]
+ push hl
+ ld h, [hl]
+ ld l, a
+ call PrintTextNoDelay
+ pop hl
+ inc hl
+ jr .loop_text_print_2
+
+InitAndPrintMenu:
+ push hl
+ push bc
+ push de
+ push af
+ ld d, [hl]
+ inc hl
+ ld e, [hl]
+ inc hl
+ ld b, [hl]
+ inc hl
+ ld c, [hl]
+ inc hl
+ push hl
+ call AdjustCoordinatesForBGScroll
+ farcall Func_c3ca
+ call DrawRegularTextBox
+ call DoFrameIfLCDEnabled
+ pop hl
+ call PrintLabels
+ pop af
+ call InitializeMenuParameters
+ pop de
+ pop bc
+ pop hl
+ ret
diff --git a/src/engine/menus/mail.asm b/src/engine/menus/mail.asm
new file mode 100644
index 0000000..00a63cf
--- /dev/null
+++ b/src/engine/menus/mail.asm
@@ -0,0 +1,536 @@
+; clears all PC packs in WRAM
+; and then gives the 1st pack
+; this doesn't clear in SRAM so
+; it's not done to clear PC pack data
+InitPCPacks:
+ push hl
+ push bc
+ xor a
+ ld [wPCPackSelection], a
+ ld hl, wPCPacks
+ ld c, NUM_PC_PACKS
+.loop_packs
+ ld [hli], a
+ dec c
+ jr nz, .loop_packs
+ ld a, $1
+ call TryGivePCPack
+ pop bc
+ pop hl
+ ret
+
+_PCMenu_ReadMail:
+ ld a, [wd291]
+ push af
+ call InitMenuScreen
+ lb de, $30, $ff
+ call SetupText
+ lb de, 0, 0
+ lb bc, 20, 12
+ call DrawRegularTextBox
+ lb de, 0, 12
+ lb bc, 20, 6
+ call DrawRegularTextBox
+ ld hl, MailScreenLabels
+ call PrintLabels
+ call PrintObtainedPCPacks
+ xor a
+ ld [wCursorBlinkTimer], a
+ call FlashWhiteScreen
+.asm_1079c
+ call DoFrameIfLCDEnabled
+ ld a, [wPCPackSelection]
+ call UpdateMailMenuCursor
+ call BlinkUnopenedPCPacks
+ ld hl, wCursorBlinkTimer
+ inc [hl]
+ call PCMailHandleDPadInput
+ call PCMailHandleAInput
+ ldh a, [hKeysPressed]
+ and B_BUTTON
+ jr z, .asm_1079c
+ ld a, SFX_03
+ call PlaySFX
+ pop af
+ ld [wd291], a
+ ret
+
+; unreferenced?
+Unknown_107c2:
+ db $01, $00, $00, $4a, $21, $b5, $42, $e0
+ db $03, $4a, $29, $94, $52, $fF, $7f, $00
+
+MailScreenLabels:
+ db 1, 0
+ tx MailText
+
+ db 1, 14
+ tx WhichMailWouldYouLikeToReadText
+
+ db 0, 20
+ tx MailNumbersText
+
+ db $ff
+
+PCMailHandleDPadInput:
+ ldh a, [hDPadHeld]
+ and D_PAD
+ ret z
+ farcall GetDirectionFromDPad
+ ld [wPCLastDirectionPressed], a
+ ld a, [wPCPackSelection]
+ push af
+ call HideMailMenuCursor
+.asm_107f2
+ ld a, [wPCPackSelection]
+ add a
+ add a
+ ld c, a
+ ld a, [wPCLastDirectionPressed]
+ add c
+ ld c, a
+ ld b, $00
+ ld hl, PCMailTransitionTable
+ add hl, bc
+ ld a, [hl]
+ ld [wPCPackSelection], a
+ ld c, a
+ ld hl, wPCPacks
+ add hl, bc
+ ld a, [hl]
+ or a
+ jr z, .asm_107f2
+ pop af
+ ld c, a
+ ld a, [wPCPackSelection]
+ cp c
+ jr z, .asm_1081d
+ ld a, SFX_01
+ call PlaySFX
+.asm_1081d
+ call ShowMailMenuCursor
+ xor a
+ ld [wCursorBlinkTimer], a
+ ret
+
+PCMailTransitionTable:
+; up, right, down, left
+ db $0c, $01, $03, $02 ; mail 1
+ db $0d, $02, $04, $00 ; mail 2
+ db $0e, $00, $05, $01 ; mail 3
+ db $00, $04, $06, $05 ; mail 4
+ db $01, $05, $07, $03 ; mail 5
+ db $02, $03, $08, $04 ; mail 6
+ db $03, $07, $09, $08 ; mail 7
+ db $04, $08, $0a, $06 ; mail 8
+ db $05, $06, $0b, $07 ; mail 9
+ db $06, $0a, $0c, $0b ; mail 10
+ db $07, $0b, $0d, $09 ; mail 11
+ db $08, $09, $0e, $0a ; mail 12
+ db $09, $0d, $00, $0e ; mail 13
+ db $0a, $0e, $01, $0c ; mail 14
+ db $0b, $0c, $02, $0d ; mail 15
+
+PCMailHandleAInput:
+ ldh a, [hKeysPressed]
+ and A_BUTTON
+ ret z
+ ld a, SFX_02
+ call PlaySFX
+ call PrintObtainedPCPacks
+ call ShowMailMenuCursor
+ ld a, [wPCPackSelection]
+ ld c, a
+ ld b, $00
+ ld hl, wPCPacks
+ add hl, bc
+ ld a, [hl]
+ ld [wSelectedPCPack], a
+ and $7f
+ ld [hl], a
+ or a
+ ret z
+ add a
+ add a
+ ld c, a
+ ld hl, PCMailTextPages
+ add hl, bc
+ ld a, [hli]
+ push hl
+ ld h, [hl]
+ ld l, a
+ ld a, [wPCPackSelection]
+ call GetPCPackNameTextID
+ call PrintScrollableText_WithTextBoxLabel
+ call TryOpenPCMailBoosterPack
+ call InitMenuScreen
+ lb de, $30, $ff
+ call SetupText
+ lb de, 0, 0
+ lb bc, 20, 12
+ call DrawRegularTextBox
+ ld hl, MailScreenLabels
+ call PrintLabels
+ call PrintObtainedPCPacks
+ call ShowMailMenuCursor
+ call FlashWhiteScreen
+ pop hl
+ inc hl
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ or h
+ jr z, .no_page_two
+ ld a, [wPCPackSelection]
+ call GetPCPackNameTextID
+ call PrintScrollableText_WithTextBoxLabel
+.no_page_two
+ lb de, 0, 12
+ lb bc, 20, 6
+ call DrawRegularTextBox
+ ld hl, MailScreenLabels
+ call PrintLabels
+ call DoFrameIfLCDEnabled
+ ret
+
+PCMailTextPages:
+ ; unused
+ dw NULL
+ dw NULL
+
+ ; mail 1
+ tx Text0401
+ tx Text0402
+
+ ; mail 2
+ tx Text0403
+ tx Text0404
+
+ ; mail 3
+ tx Text0405
+ tx Text0406
+
+ ; mail 4
+ tx Text0407
+ tx Text0408
+
+ ; mail 5
+ tx Text0409
+ tx Text040a
+
+ ; mail 6
+ tx Text040b
+ tx Text040c
+
+ ; mail 7
+ tx Text040d
+ tx Text040e
+
+ ; mail 8
+ tx Text040f
+ tx Text0410
+
+ ; mail 9
+ tx Text0411
+ tx Text0412
+
+ ; mail 10
+ tx Text0413
+ dw NULL
+
+ ; mail 11
+ tx Text0414
+ dw NULL
+
+ ; mail 12
+ tx Text0415
+ dw NULL
+
+ ; mail 13
+ tx Text0416
+ dw NULL
+
+ ; mail 14
+ tx Text0417
+ dw NULL
+
+ ; mail 15
+ tx Text0418
+ dw NULL
+
+TryOpenPCMailBoosterPack:
+ xor a
+ ld [wAnotherBoosterPack], a
+ ld a, [wSelectedPCPack]
+ bit PACK_UNOPENED_F, a
+ jr z, .booster_already_open
+ and $7f
+ add a
+ ld c, a
+ ld b, $00
+ ld hl, PCMailBoosterPacks
+ add hl, bc
+ ld a, [hli]
+ push hl
+ call GiveBoosterPack
+ ld a, $01
+ ld [wAnotherBoosterPack], a
+ pop hl
+ ld a, [hl]
+ or a
+ jr z, .done
+ call GiveBoosterPack
+.done
+ call DisableLCD
+ ret
+
+.booster_already_open
+ call InitMenuScreen
+ lb de, $30, $ff
+ call SetupText
+ ldtx hl, Text0419
+ call PrintScrollableText_NoTextBoxLabel
+ jr .done
+
+PCMailBoosterPacks:
+ db $00, $00 ; unused
+ db BOOSTER_COLOSSEUM_NEUTRAL, $00 ; mail 1
+ db BOOSTER_LABORATORY_PSYCHIC, $00 ; mail 2
+ db BOOSTER_EVOLUTION_GRASS, $00 ; mail 3
+ db BOOSTER_MYSTERY_LIGHTNING_COLORLESS, $00 ; mail 4
+ db BOOSTER_EVOLUTION_FIGHTING, $00 ; mail 5
+ db BOOSTER_COLOSSEUM_FIRE, $00 ; mail 6
+ db BOOSTER_LABORATORY_PSYCHIC, $00 ; mail 7
+ db BOOSTER_LABORATORY_PSYCHIC, $00 ; mail 8
+ db BOOSTER_MYSTERY_WATER_COLORLESS, $00 ; mail 9
+ db BOOSTER_COLOSSEUM_NEUTRAL, BOOSTER_EVOLUTION_NEUTRAL ; mail 10
+ db BOOSTER_MYSTERY_NEUTRAL, BOOSTER_LABORATORY_NEUTRAL ; mail 11
+ db BOOSTER_COLOSSEUM_TRAINER, $00 ; mail 12
+ db BOOSTER_EVOLUTION_TRAINER, $00 ; mail 13
+ db BOOSTER_MYSTERY_TRAINER_COLORLESS, $00 ; mail 14
+ db BOOSTER_LABORATORY_TRAINER, $00 ; mail 15
+
+UpdateMailMenuCursor:
+ ld a, [wCursorBlinkTimer]
+ and $10
+ jr z, ShowMailMenuCursor
+ jr HideMailMenuCursor
+ShowMailMenuCursor:
+ ld a, SYM_CURSOR_R
+ jr DrawMailMenuCursor
+HideMailMenuCursor:
+ ld a, SYM_SPACE
+ jr DrawMailMenuCursor ; can be fallthrough
+DrawMailMenuCursor:
+ push af
+ call GePCPackSelectionCoordinates
+ pop af
+ call WriteByteToBGMap0
+ ret
+
+; prints all the PC packs that player
+; has already obtained
+PrintObtainedPCPacks:
+ ld e, $0
+ ld hl, wPCPacks
+.loop_packs
+ ld a, [hl]
+ or a
+ jr z, .next_pack
+ ld a, e
+ call PrintPCPackName
+.next_pack
+ inc hl
+ inc e
+ ld a, e
+ cp NUM_PC_PACKS
+ jr c, .loop_packs
+ ret
+
+; outputs in de the text ID
+; corresponding to the name
+; of the mail in input a
+GetPCPackNameTextID:
+ push hl
+ add a
+ ld e, a
+ ld d, $00
+ ld hl, .PCPackNameTextIDs
+ add hl, de
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ pop hl
+ ret
+
+.PCPackNameTextIDs:
+ tx Mail1Text
+ tx Mail2Text
+ tx Mail3Text
+ tx Mail4Text
+ tx Mail5Text
+ tx Mail6Text
+ tx Mail7Text
+ tx Mail8Text
+ tx Mail9Text
+ tx Mail10Text
+ tx Mail11Text
+ tx Mail12Text
+ tx Mail13Text
+ tx Mail14Text
+ tx Mail15Text
+
+; prints on screen the name of
+; the PC pack from input in a
+PrintPCPackName:
+ push hl
+ push bc
+ push de
+ push af
+ call GetPCPackNameTextID
+ ld l, e
+ ld h, d
+ pop af
+ call GetPCPackCoordinates
+ ld e, c
+ ld d, b
+ call InitTextPrinting
+ call PrintTextNoDelay
+ pop de
+ pop bc
+ pop hl
+ ret
+
+; prints empty characters on screen
+; corresponding to the PC pack in a
+; this is to create the blinking
+; effect of unopened PC packs
+PrintEmptyPCPackName:
+ push hl
+ push bc
+ push de
+ call GetPCPackCoordinates
+ ld e, c
+ ld d, b
+ call InitTextPrinting
+ ldtx hl, EmptyMailNameText
+ call PrintTextNoDelay
+ pop de
+ pop bc
+ pop hl
+ ret
+
+BlinkUnopenedPCPacks:
+ ld e, $00
+ ld hl, wPCPacks
+.loop_packs
+ ld a, [hl]
+ or a
+ jr z, .next_pack
+ bit PACK_UNOPENED_F, a
+ jr z, .next_pack
+ ld a, [wCursorBlinkTimer]
+ and $0c
+ jr z, .show
+ cp $0c
+ jr nz, .next_pack
+; hide
+ ld a, e
+ call PrintEmptyPCPackName
+ jr .next_pack
+.show
+ ld a, e
+ call PrintPCPackName
+.next_pack
+ inc hl
+ inc e
+ ld a, e
+ cp NUM_PC_PACKS
+ jr c, .loop_packs
+ ret
+
+; outputs in bc the coordinates
+; corresponding to the PC pack in a
+GetPCPackCoordinates:
+ ld c, a
+ ld a, [wPCPackSelection]
+ push af
+ ld a, c
+ ld [wPCPackSelection], a
+ call GePCPackSelectionCoordinates
+ inc b
+ pop af
+ ld [wPCPackSelection], a
+ ret
+
+; outputs in bc the coordinates
+; corresponding to the PC pack
+; that is stored in wPCPackSelection
+GePCPackSelectionCoordinates:
+ push hl
+ ld a, [wPCPackSelection]
+ add a
+ ld c, a
+ ld b, $00
+ ld hl, PCMailCoordinates
+ add hl, bc
+ ld a, [hli]
+ ld b, a
+ ld c, [hl]
+ pop hl
+ ret
+
+PCMailCoordinates:
+ db 1, 2 ; mail 1
+ db 7, 2 ; mail 2
+ db 13, 2 ; mail 3
+ db 1, 4 ; mail 4
+ db 7, 4 ; mail 5
+ db 13, 4 ; mail 6
+ db 1, 6 ; mail 7
+ db 7, 6 ; mail 8
+ db 13, 6 ; mail 9
+ db 1, 8 ; mail 10
+ db 7, 8 ; mail 11
+ db 13, 8 ; mail 12
+ db 1, 10 ; mail 13
+ db 7, 10 ; mail 14
+ db 13, 10 ; mail 15
+
+; gives the pc pack described in a
+TryGivePCPack:
+ push hl
+ push bc
+ push de
+ ld b, a
+ ld c, NUM_PC_PACKS
+ ld hl, wPCPacks
+.searchLoop1
+ ld a, [hli]
+ and $7f
+ cp b
+ jr z, .quit
+ dec c
+ jr nz, .searchLoop1
+ ld c, NUM_PC_PACKS
+ ld hl, wPCPacks
+.findFreeSlotLoop
+ ld a, [hl]
+ and $7f
+ jr z, .foundFreeSlot
+ inc hl
+ dec c
+ jr nz, .findFreeSlotLoop
+ debug_nop
+ jr .quit
+
+.foundFreeSlot
+ ld a, b
+ or PACK_UNOPENED ; mark pack as unopened
+ ld [hl], a
+
+.quit
+ pop de
+ pop bc
+ pop hl
+ ret
diff --git a/src/engine/menus/main_menu.asm b/src/engine/menus/main_menu.asm
new file mode 100644
index 0000000..005c266
--- /dev/null
+++ b/src/engine/menus/main_menu.asm
@@ -0,0 +1,93 @@
+; usually, the game doesn't loop here at all, since as soon as a main menu option
+; is selected, there is no need to come back to the menu.
+; the only exception is after returning from Card Pop!
+_GameLoop:
+ call ZeroObjectPositions
+ ld hl, wVBlankOAMCopyToggle
+ inc [hl]
+ farcall SetIntroSGBBorder
+ ld a, $ff
+ ld [wLastSelectedStartMenuItem], a
+.main_menu_loop
+ ld a, PLAYER_TURN
+ ldh [hWhoseTurn], a
+ farcall Func_c1f8
+ farcall HandleTitleScreen
+ ld a, [wStartMenuChoice]
+ ld hl, MainMenuFunctionTable
+ call JumpToFunctionInTable
+ jr c, .main_menu_loop ; return to main menu
+ jr _GameLoop ; virtually restart game
+
+; this is never reached
+ scf
+ ret
+
+MainMenuFunctionTable:
+ dw MainMenu_CardPop
+ dw MainMenu_ContinueFromDiary
+ dw MainMenu_NewGame
+ dw MainMenu_ContinueDuel
+
+MainMenu_NewGame:
+ farcall Func_c1b1
+ call DisplayPlayerNamingScreen
+ farcall InitSaveData
+ call EnableSRAM
+ ld a, [sAnimationsDisabled]
+ ld [wAnimationsDisabled], a
+ ld a, [sTextSpeed]
+ ld [wTextSpeed], a
+ call DisableSRAM
+ ld a, MUSIC_STOP
+ call PlaySong
+ farcall SetMainSGBBorder
+ ld a, MUSIC_OVERWORLD
+ ld [wDefaultSong], a
+ call PlayDefaultSong
+ farcall DrawPlayerPortraitAndPrintNewGameText
+ ld a, GAME_EVENT_OVERWORLD
+ ld [wGameEvent], a
+ farcall $03, ExecuteGameEvent
+ or a
+ ret
+
+MainMenu_ContinueFromDiary:
+ ld a, MUSIC_STOP
+ call PlaySong
+ call ValidateBackupGeneralSaveData
+ jr nc, MainMenu_NewGame
+ farcall Func_c1ed
+ farcall SetMainSGBBorder
+ call EnableSRAM
+ xor a
+ ld [sPlayerInChallengeMachine], a
+ call DisableSRAM
+ ld a, GAME_EVENT_OVERWORLD
+ ld [wGameEvent], a
+ farcall $03, ExecuteGameEvent
+ or a
+ ret
+
+MainMenu_CardPop:
+ ld a, MUSIC_CARD_POP
+ call PlaySong
+ bank1call DoCardPop
+ farcall WhiteOutDMGPals
+ call DoFrameIfLCDEnabled
+ ld a, MUSIC_STOP
+ call PlaySong
+ scf
+ ret
+
+MainMenu_ContinueDuel:
+ ld a, MUSIC_STOP
+ call PlaySong
+ farcall ClearEvents
+ farcall $04, LoadGeneralSaveData
+ farcall SetMainSGBBorder
+ ld a, GAME_EVENT_CONTINUE_DUEL
+ ld [wGameEvent], a
+ farcall $03, ExecuteGameEvent
+ or a
+ ret
diff --git a/src/engine/menus/medal.asm b/src/engine/menus/medal.asm
new file mode 100644
index 0000000..57803e3
--- /dev/null
+++ b/src/engine/menus/medal.asm
@@ -0,0 +1,60 @@
+ShowMedalReceivedScreen:
+ sub $8
+ ld c, a
+ ld [wWhichMedal], a
+ ld a, [wd291]
+ push af
+ push bc
+ call PauseSong
+ ld a, MUSIC_STOP
+ call PlaySong
+ farcall SetMainSGBBorder
+ call DisableLCD
+ call InitMenuScreen
+ ld a, -6
+ ld [wMedalScreenYOffset], a
+ call LoadCollectedMedalTilemaps
+ pop bc
+ ld a, c
+ add a
+ ld c, a
+ ld b, $0
+ ld hl, MasterMedalNames
+ add hl, bc
+ ld a, [hli]
+ ld [wTxRam2], a
+ ld a, [hl]
+ ld [wTxRam2 + 1], a
+ call FlashWhiteScreen
+ ld a, MUSIC_MEDAL
+ call PlaySong
+ ld a, $ff
+ ld [wMedalDisplayTimer], a
+.flash_loop
+ call DoFrameIfLCDEnabled
+ ld a, [wMedalDisplayTimer]
+ inc a
+ ld [wMedalDisplayTimer], a
+ and $f
+ jr nz, .flash_loop
+ call FlashReceivedMedal
+ ld a, [wMedalDisplayTimer]
+ cp $e0
+ jr nz, .flash_loop
+ ldtx hl, WonTheMedalText
+ call PrintScrollableText_NoTextBoxLabel
+ call WaitForSongToFinish
+ call ResumeSong
+ pop af
+ ld [wd291], a
+ ret
+
+MasterMedalNames:
+ tx GrassClubMapNameText
+ tx ScienceClubMapNameText
+ tx FireClubMapNameText
+ tx WaterClubMapNameText
+ tx LightningClubMapNameText
+ tx PsychicClubMapNameText
+ tx RockClubMapNameText
+ tx FightingClubMapNameText
diff --git a/src/engine/menus/naming.asm b/src/engine/menus/naming.asm
new file mode 100644
index 0000000..53c0c9d
--- /dev/null
+++ b/src/engine/menus/naming.asm
@@ -0,0 +1,145 @@
+DisplayPlayerNamingScreen:
+ ; clear the name buffer.
+ ld hl, wNameBuffer ; c500: name buffer.
+ ld bc, NAME_BUFFER_LENGTH
+ ld a, TX_END
+ call FillMemoryWithA
+
+ ; get player's name
+ ; from the user into hl.
+ ld hl, wNameBuffer
+ farcall InputPlayerName
+
+ farcall WhiteOutDMGPals
+ call DoFrameIfLCDEnabled
+ call DisableLCD
+ ld hl, wNameBuffer
+ ; get the first byte of the name buffer.
+ ld a, [hl]
+ or a
+ ; check if anything typed.
+ jr nz, .no_name
+ ld hl, .default_name
+.no_name
+ ; set the default name.
+ ld de, sPlayerName
+ ld bc, NAME_BUFFER_LENGTH
+ call EnableSRAM
+ call CopyDataHLtoDE_SaveRegisters
+ ; it seems for integrity checking.
+ call UpdateRNGSources
+ ld [sPlayerName+$e], a
+ call UpdateRNGSources
+ ld [sPlayerName+$f], a
+ call DisableSRAM
+ ret
+
+.default_name
+ ; "MARK": default player name.
+ textfw3 "MARK"
+ db TX_END, TX_END, TX_END, TX_END
+
+Unknown_128f7:
+ db 0, 0 ; start menu coords
+ db 16, 18 ; start menu text box dimensions
+
+ db 2, 2 ; text alignment for InitTextPrinting
+ tx DebugMenuText
+ db $ff
+
+ db 1, 2 ; cursor x, cursor y
+ db 1 ; y displacement between items
+ db 11 ; number of items
+ db SYM_CURSOR_R ; cursor tile number
+ db SYM_SPACE ; tile behind cursor
+ dw NULL ; function pointer if non-0
+
+Unknown_12908:
+ db 10, 0 ; start menu coords
+ db 10, 6 ; start menu text box dimensions
+
+ db 12, 2 ; text alignment for InitTextPrinting
+ tx Text037b
+ db $ff
+
+ db 11, 2 ; cursor x, cursor y
+ db 2 ; y displacement between items
+ db 2 ; number of items
+ db SYM_CURSOR_R ; cursor tile number
+ db SYM_SPACE ; tile behind cursor
+ dw NULL ; function pointer if non-0
+
+Unknown_12919:
+ db 0, 0 ; start menu coords
+ db 12, 12 ; start menu text box dimensions
+
+ db 2, 2 ; text alignment for InitTextPrinting
+ tx DebugBoosterPackMenuText
+ db $ff
+
+ db 1, 2 ; cursor x, cursor y
+ db 2 ; y displacement between items
+ db 5 ; number of items
+ db SYM_CURSOR_R ; cursor tile number
+ db SYM_SPACE ; tile behind cursor
+ dw NULL ; function pointer if non-0
+
+Unknown_1292a:
+ db 12, 0 ; start menu coords
+ db 4, 16 ; start menu text box dimensions
+
+ db 14, 2 ; text alignment for InitTextPrinting
+ tx DebugBoosterPackColosseumEvolutionMenuText
+ db $ff
+
+ db 13, 2 ; cursor x, cursor y
+ db 2 ; y displacement between items
+ db 7 ; number of items
+ db SYM_CURSOR_R ; cursor tile number
+ db SYM_SPACE ; tile behind cursor
+ dw NULL ; function pointer if non-0
+
+Unknown_1293b:
+ db 12, 0 ; start menu coords
+ db 4, 14 ; start menu text box dimensions
+
+ db 14, 2 ; text alignment for InitTextPrinting
+ tx DebugBoosterPackMysteryMenuText
+ db $ff
+
+ db 13, 2 ; cursor x, cursor y
+ db 2 ; y displacement between items
+ db 6 ; number of items
+ db SYM_CURSOR_R ; cursor tile number
+ db SYM_SPACE ; tile behind cursor
+ dw NULL ; function pointer if non-0
+
+Unknown_1294c:
+ db 12, 0 ; start menu coords
+ db 4, 12 ; start menu text box dimensions
+
+ db 14, 2 ; text alignment for InitTextPrinting
+ tx DebugBoosterPackLaboratoryMenuText
+ db $ff
+
+ db 13, 2 ; cursor x, cursor y
+ db 2 ; y displacement between items
+ db 5 ; number of items
+ db SYM_CURSOR_R ; cursor tile number
+ db SYM_SPACE ; tile behind cursor
+ dw NULL ; function pointer if non-0
+
+Unknown_1295d:
+ db 12, 0 ; start menu coords
+ db 4, 10 ; start menu text box dimensions
+
+ db 14, 2 ; text alignment for InitTextPrinting
+ tx DebugBoosterPackEnergyMenuText
+ db $ff
+
+ db 13, 2 ; cursor x, cursor y
+ db 2 ; y displacement between items
+ db 4 ; number of items
+ db SYM_CURSOR_R ; cursor tile number
+ db SYM_SPACE ; tile behind cursor
+ dw NULL ; function pointer if non-0
diff --git a/src/engine/menus/pc_glossary.asm b/src/engine/menus/pc_glossary.asm
new file mode 100644
index 0000000..9e28b26
--- /dev/null
+++ b/src/engine/menus/pc_glossary.asm
@@ -0,0 +1,11 @@
+_PCMenu_Glossary:
+ ld a, [wd291]
+ push af
+ call InitMenuScreen
+ lb de, $30, $ff
+ call SetupText
+ call FlashWhiteScreen
+ farcall OpenGlossaryScreen
+ pop af
+ ld [wd291], a
+ ret
diff --git a/src/engine/menus/print_stats.asm b/src/engine/menus/print_stats.asm
new file mode 100644
index 0000000..5ea84a6
--- /dev/null
+++ b/src/engine/menus/print_stats.asm
@@ -0,0 +1,242 @@
+LoadCollectedMedalTilemaps:
+ xor a
+ ld [wd291], a
+ lb de, 0, 8
+ ld a, [wMedalScreenYOffset]
+ add e
+ ld e, a
+ lb bc, 20, 10
+ call DrawRegularTextBox
+ lb de, 6, 9
+ ld a, [wMedalScreenYOffset]
+ add e
+ ld e, a
+ call AdjustCoordinatesForBGScroll
+ call InitTextPrinting
+ ldtx hl, PlayerStatusMedalsTitleText
+ call PrintTextNoDelay
+ ld hl, MedalCoordsAndTilemaps
+ ld a, EVENT_MEDAL_FLAGS
+ farcall GetEventValue
+ or a
+ jr z, .done ; no medals?
+
+; load tilemaps of only the collected medals
+ ld c, NUM_MEDALS
+.loop_medals
+ push bc
+ push hl
+ push af
+ bit 7, a
+ jr z, .skip_medal
+ ld b, [hl]
+ inc hl
+ ld a, [wMedalScreenYOffset]
+ add [hl]
+ ld c, a
+ inc hl
+ ld a, [hli]
+ ld [wCurTilemap], a
+ farcall LoadTilemap_ToVRAM
+.skip_medal
+ pop af
+ rlca
+ pop hl
+ ld bc, $3
+ add hl, bc
+ pop bc
+ dec c
+ jr nz, .loop_medals
+
+ ld a, $80
+ ld [wd4ca], a
+ xor a
+ ld [wd4cb], a
+ farcall LoadTilesetGfx
+ xor a
+ ld [wd4ca], a
+ ld a, $01
+ ld [wd4cb], a
+ ld a, $76
+ farcall SetBGPAndLoadedPal
+.done
+ ret
+
+MedalCoordsAndTilemaps:
+; x, y, tilemap
+ db 1, 10, TILEMAP_GRASS_MEDAL
+ db 6, 10, TILEMAP_SCIENCE_MEDAL
+ db 11, 10, TILEMAP_FIRE_MEDAL
+ db 16, 10, TILEMAP_WATER_MEDAL
+ db 1, 14, TILEMAP_LIGHTNING_MEDAL
+ db 6, 14, TILEMAP_PSYCHIC_MEDAL
+ db 11, 14, TILEMAP_ROCK_MEDAL
+ db 16, 14, TILEMAP_FIGHTING_MEDAL
+
+FlashReceivedMedal:
+ xor a
+ ld [wd291], a
+ ld hl, MedalCoordsAndTilemaps
+ ld a, [wWhichMedal]
+ ld c, a
+ add a
+ add c
+ ld c, a
+ ld b, $00
+ add hl, bc
+ ld b, [hl]
+ inc hl
+ ld a, [wMedalScreenYOffset]
+ add [hl]
+ ld c, a
+ ld a, [wMedalDisplayTimer]
+ bit 4, a
+ jr z, .show
+; hide
+ xor a
+ ld e, c
+ ld d, b
+ lb bc, 3, 3
+ lb hl, 0, 0
+ call FillRectangle
+ ret
+
+.show
+ inc hl
+ ld a, [hl]
+ ld [wCurTilemap], a
+ farcall LoadTilemap_ToVRAM
+ ret
+
+PrintPlayTime:
+ ld a, [wPlayTimeCounter + 2]
+ ld [wPlayTimeHourMinutes], a
+ ld a, [wPlayTimeCounter + 3]
+ ld [wPlayTimeHourMinutes + 1], a
+ ld a, [wPlayTimeCounter + 4]
+ ld [wPlayTimeHourMinutes + 2], a
+; fallthrough
+PrintPlayTime_SkipUpdateTime:
+ push bc
+ ld a, [wPlayTimeHourMinutes + 1]
+ ld l, a
+ ld a, [wPlayTimeHourMinutes + 2]
+ ld h, a
+ call ConvertWordToNumericalDigits
+ pop bc
+ push bc
+ call BCCoordToBGMap0Address
+ ld hl, wDecimalChars
+ ld b, 3
+ call SafeCopyDataHLtoDE
+ ld a, [wPlayTimeHourMinutes]
+ add 100
+ ld l, a
+ ld a, 0
+ adc 0
+ ld h, a
+ call ConvertWordToNumericalDigits
+ pop bc
+ ld a, b
+ add 4
+ ld b, a
+ call BCCoordToBGMap0Address
+ ld hl, wDecimalChars + 1
+ ld b, 2
+ call SafeCopyDataHLtoDE
+ ret
+
+; input:
+; hl = value to convert
+ConvertWordToNumericalDigits:
+ ld de, wDecimalChars
+ ld bc, -100 ; hundreds
+ call .GetNumberSymbol
+ ld bc, -10 ; tens
+ call .GetNumberSymbol
+ ld a, l ; ones
+ add SYM_0
+ ld [de], a
+
+; remove leading zeroes
+ ld hl, wDecimalChars
+ ld c, 2
+.loop_digits
+ ld a, [hl]
+ cp SYM_0
+ jr nz, .done ; reached a non-zero digit?
+ ld [hl], SYM_SPACE
+ inc hl
+ dec c
+ jr nz, .loop_digits
+.done
+ ret
+
+.GetNumberSymbol
+ ld a, SYM_0 - 1
+.loop
+ inc a
+ add hl, bc
+ jr c, .loop
+ ld [de], a
+ inc de
+ ld a, l
+ sub c
+ ld l, a
+ ld a, h
+ sbc b
+ ld h, a
+ ret
+
+; prints album progress in coords bc
+PrintAlbumProgress:
+ push bc
+ call GetCardAlbumProgress
+ pop bc
+; fallthrough
+PrintAlbumProgress_SkipGetProgress:
+ push bc
+ push de
+ push bc
+ ld l, d ; number of different cards collected
+ ld h, $00
+ call ConvertWordToNumericalDigits
+ pop bc
+ call BCCoordToBGMap0Address
+ ld hl, wDecimalChars
+ ld b, 3
+ call SafeCopyDataHLtoDE
+ pop de
+ ld l, e ; total number of cards
+ ld h, $00
+ call ConvertWordToNumericalDigits
+ pop bc
+ ld a, b
+ add 4
+ ld b, a
+ call BCCoordToBGMap0Address
+ ld hl, wDecimalChars
+ ld b, 3
+ call SafeCopyDataHLtoDE
+ ret
+
+; prints the number of medals collected in bc
+PrintMedalCount:
+ push bc
+ farcall TryGiveMedalPCPacks
+ ld a, EVENT_MEDAL_COUNT
+ farcall GetEventValue
+ ld l, a
+ ld h, $00
+ call ConvertWordToNumericalDigits
+ pop bc
+ call BCCoordToBGMap0Address
+ ld hl, wDecimalChars + 2
+ ld b, 1
+ call SafeCopyDataHLtoDE
+ ret
+
+; bc = coordinates
+DrawPauseMenuPlayerPortrait:
+ call DrawPlayerPortrait
+ ret
diff --git a/src/engine/menus/start.asm b/src/engine/menus/start.asm
index 4d46d4a..c2ec77d 100644
--- a/src/engine/menus/start.asm
+++ b/src/engine/menus/start.asm
@@ -30,7 +30,7 @@ HandleTitleScreen:
or a
jr nz, .song_playing
; reset back to the opening sequence
- farcall Func_10ab4
+ farcall FadeScreenToWhite
jr .play_opening
.song_playing
@@ -49,7 +49,7 @@ HandleTitleScreen:
jr z, .loop
ld a, SFX_02
call PlaySFX
- farcall Func_10ab4
+ farcall FadeScreenToWhite
.start_menu
call CheckIfHasSaveData
@@ -105,7 +105,7 @@ HandleStartMenu:
ld a, MUSIC_PC_MAIN_MENU
call PlaySong
call DisableLCD
- farcall Func_10000
+ farcall InitMenuScreen
lb de, $30, $8f
call SetupText
call Func_3ca0
@@ -125,7 +125,7 @@ HandleStartMenu:
ld a, 1 ; start at second menu option
.init_menu
ld hl, wStartMenuParams
- farcall InitAndPrintPauseMenu
+ farcall InitAndPrintMenu
farcall FlashWhiteScreen
.wait_input
@@ -324,10 +324,10 @@ PrintStartMenuDescriptionText:
ld d, a
ld a, [wTotalNumCardsToCollect]
ld e, a
- ld bc, $90e
- farcall Func_1024f
- ld bc, $a10
- farcall Func_101df
+ lb bc, 9, 14
+ farcall PrintAlbumProgress_SkipGetProgress
+ lb bc, 10, 16
+ farcall PrintPlayTime_SkipUpdateTime
ret
; asks the player whether it's okay to delete
@@ -340,7 +340,7 @@ DeleteSaveDataForNewGame:
ret z
call DisableLCD
- farcall Func_10000
+ farcall InitMenuScreen
call Func_3ca0
farcall FlashWhiteScreen
call DoFrameIfLCDEnabled
@@ -365,7 +365,7 @@ AskToContinueFromDiaryWithDuelData:
ret z
call DisableLCD
- farcall Func_10000
+ farcall InitMenuScreen
call Func_3ca0
farcall FlashWhiteScreen
call DoFrameIfLCDEnabled
@@ -403,13 +403,13 @@ ShowCardPopCGBDisclaimer:
DrawPlayerPortraitAndPrintNewGameText:
call DisableLCD
farcall Func_10a9b
- farcall Func_10000
+ farcall InitMenuScreen
call Func_3ca0
ld hl, HandleAllSpriteAnimations
call SetDoFrameFunction
lb bc, 7, 3
farcall $4, DrawPlayerPortrait
- farcall Func_10af9
+ farcall FadeScreenFromWhite
call DoFrameIfLCDEnabled
ldtx hl, IsCrazyAboutPokemonAndPokemonCardCollectingText
call PrintScrollableText_NoTextBoxLabel
diff --git a/src/engine/menus/status.asm b/src/engine/menus/status.asm
new file mode 100644
index 0000000..4397423
--- /dev/null
+++ b/src/engine/menus/status.asm
@@ -0,0 +1,36 @@
+_PauseMenu_Status:
+ ld a, [wd291]
+ push af
+ call InitMenuScreen
+ xor a
+ ld [wMedalScreenYOffset], a
+ call LoadCollectedMedalTilemaps
+ lb de, 0, 0
+ lb bc, 20, 8
+ call DrawRegularTextBox
+ ld hl, StatusScreenLabels
+ call PrintLabels
+ lb bc, 1, 1
+ call DrawPauseMenuPlayerPortrait
+ lb bc, 12, 4
+ call PrintAlbumProgress
+ lb bc, 13, 6
+ call PrintPlayTime
+ call FlashWhiteScreen
+ ld a, A_BUTTON | B_BUTTON | START
+ call WaitUntilKeysArePressed
+ pop af
+ ld [wd291], a
+ ret
+
+StatusScreenLabels:
+ db 7, 2
+ tx PlayerStatusNameText
+
+ db 7, 4
+ tx PlayerStatusAlbumText
+
+ db 7, 6
+ tx PlayerStatusPlayTimeText
+
+ db $ff
diff --git a/src/engine/menus/wait_keys.asm b/src/engine/menus/wait_keys.asm
new file mode 100644
index 0000000..85a6baa
--- /dev/null
+++ b/src/engine/menus/wait_keys.asm
@@ -0,0 +1,13 @@
+; a = keys to escape
+WaitUntilKeysArePressed:
+ push bc
+ ld b, a
+.loop_input
+ push bc
+ call DoFrameIfLCDEnabled
+ pop bc
+ ldh a, [hKeysPressed]
+ and b
+ jr z, .loop_input
+ pop bc
+ ret