diff options
Diffstat (limited to 'src/engine/menus')
-rw-r--r-- | src/engine/menus/card_album.asm | 4 | ||||
-rw-r--r-- | src/engine/menus/config.asm | 356 | ||||
-rw-r--r-- | src/engine/menus/debug.asm | 125 | ||||
-rw-r--r-- | src/engine/menus/debug_main.asm | 54 | ||||
-rw-r--r-- | src/engine/menus/deck_machine.asm | 6 | ||||
-rw-r--r-- | src/engine/menus/deck_selection.asm | 4 | ||||
-rw-r--r-- | src/engine/menus/diary.asm | 52 | ||||
-rw-r--r-- | src/engine/menus/duel_init.asm | 225 | ||||
-rw-r--r-- | src/engine/menus/gift_center.asm | 100 | ||||
-rw-r--r-- | src/engine/menus/give_booster_pack.asm | 112 | ||||
-rw-r--r-- | src/engine/menus/init_menu.asm | 46 | ||||
-rw-r--r-- | src/engine/menus/labels.asm | 72 | ||||
-rw-r--r-- | src/engine/menus/mail.asm | 536 | ||||
-rw-r--r-- | src/engine/menus/main_menu.asm | 93 | ||||
-rw-r--r-- | src/engine/menus/medal.asm | 60 | ||||
-rw-r--r-- | src/engine/menus/naming.asm | 145 | ||||
-rw-r--r-- | src/engine/menus/pc_glossary.asm | 11 | ||||
-rw-r--r-- | src/engine/menus/print_stats.asm | 242 | ||||
-rw-r--r-- | src/engine/menus/start.asm | 24 | ||||
-rw-r--r-- | src/engine/menus/status.asm | 36 | ||||
-rw-r--r-- | src/engine/menus/wait_keys.asm | 13 |
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 |