pokeyellow/engine/menu/main_menu.asm
2015-12-31 15:04:19 -05:00

297 lines
5.3 KiB
NASM
Executable File

MainMenu: ; 5ba6 (1:5ba6)
; Check save file
call InitOptions
xor a
ld [wOptionsInitialized],a
inc a
ld [wSaveFileStatus],a
call CheckForPlayerNameInSRAM
jr nc,.mainMenuLoop
predef LoadSAV
.mainMenuLoop
ld c,20
call DelayFrames
xor a ; LINK_STATE_NONE
ld [wLinkState],a
ld hl,wPartyAndBillsPCSavedMenuItem
ld [hli],a
ld [hli],a
ld [hli],a
ld [hl],a
ld [wAnimationID],a
ld hl,wd72e
res 6,[hl]
call ClearScreen
call RunDefaultPaletteCommand
call LoadTextBoxTilePatterns
call LoadFontTilePatterns
ld hl,wd730
set 6,[hl]
ld a,[wSaveFileStatus]
cp a,1
jr z,.noSaveFile
; there's a save file
coord hl, 0, 0
lb bc, 6, 13
call TextBoxBorder
coord hl, 2, 2
ld de,ContinueText
call PlaceString
jr .next2
.noSaveFile
coord hl, 0, 0
lb bc, 4, 13
call TextBoxBorder
coord hl, 2, 2
ld de,NewGameText
call PlaceString
.next2
ld hl,wd730
res 6,[hl]
call UpdateSprites
xor a
ld [wCurrentMenuItem],a
ld [wLastMenuItem],a
ld [wMenuJoypadPollCount],a
inc a
ld [wTopMenuItemX],a
inc a
ld [wTopMenuItemY],a
ld a,A_BUTTON | B_BUTTON | START
ld [wMenuWatchedKeys],a
ld a,[wSaveFileStatus]
ld [wMaxMenuItem],a
call HandleMenuInput
bit 1,a ; pressed B?
jp nz,DisplayTitleScreen ; if so, go back to the title screen
ld c,20
call DelayFrames
ld a,[wCurrentMenuItem]
ld b,a
ld a,[wSaveFileStatus]
cp a,2
jp z,.skipInc
; If there's no save file, increment the current menu item so that the numbers
; are the same whether or not there's a save file.
inc b
.skipInc
ld a,b
and a
jr z,.choseContinue
cp a,1
jp z,StartNewGame
call DisplayOptionMenu
ld a,1
ld [wOptionsInitialized],a
jp .mainMenuLoop
.choseContinue
call DisplayContinueGameInfo
ld hl,wd126
set 5,[hl]
.inputLoop
xor a
ld [hJoyPressed],a
ld [hJoyReleased],a
ld [hJoyHeld],a
call Joypad
ld a,[hJoyHeld]
bit 0,a
jr nz,.pressedA
bit 1,a
jp nz,.mainMenuLoop ; pressed B
jr .inputLoop
.pressedA
call GBPalWhiteOutWithDelay3
call ClearScreen
ld a,PLAYER_DIR_DOWN
ld [wPlayerDirection],a
ld c,10
call DelayFrames
ld a,[wNumHoFTeams]
and a
jp z,SpecialEnterMap
ld a,[wCurMap] ; map ID
cp a,HALL_OF_FAME
jp nz,SpecialEnterMap
xor a
ld [wDestinationMap],a
ld hl,wd732
set 2,[hl] ; fly warp or dungeon warp
call SpecialWarpIn
jp SpecialEnterMap
InitOptions: ; 5bff (1:5bff)
ld a,1 ; no delay
ld [wLetterPrintingDelayFlags],a
ld a,3 ; medium speed
ld [wOptions],a
ld a,64 ; audio?
ld [wd498], a
ret
Func_5cc1: ; 5cc1 (1:5cc1)
; unused?
ld a, $6d
cp $80
ret c ; will always be executed
ld hl, NotEnoughMemoryText
call PrintText
ret
NotEnoughMemoryText: ; 5ccd (1:5ccd)
TX_FAR _NotEnoughMemoryText
db "@"
StartNewGame: ; 5cd2 (1:5cd2)
ld hl, wd732
res 1, [hl]
call OakSpeech
ld a, $8
ld [wPlayerMovingDirection], a
ld c, 20
call DelayFrames
; enter map after using a special warp or loading the game from the main menu
SpecialEnterMap: ; 5ce4 (1:5ce4)
xor a
ld [hJoyPressed], a
ld [hJoyHeld], a
ld [hJoy5], a
ld [wd72d], a
ld hl, wd732
set 0, [hl] ; count play time
call ResetPlayerSpriteData
ld c, 20
call DelayFrames
call Func_5cc1
ld a, [wEnteringCableClub]
and a
ret nz
jp EnterMap
ContinueText: ; 5d06 (1:5d06)
db "CONTINUE", $4e
NewGameText: ; 5d0f (1:5d0f)
db "NEW GAME", $4e
db "OPTION@"
DisplayContinueGameInfo: ; 5d1f (1:5d1f)
xor a
ld [H_AUTOBGTRANSFERENABLED], a
coord hl, 4, 7
lb bc, 8, 14
call TextBoxBorder
coord hl, 5, 9
ld de, SaveScreenInfoText
call PlaceString
coord hl, 12, 9
ld de, wPlayerName
call PlaceString
coord hl, 17, 11
call PrintNumBadges
coord hl, 16, 13
call PrintNumOwnedMons
coord hl, 13, 15
call PrintPlayTime
ld a, 1
ld [H_AUTOBGTRANSFERENABLED], a
ld c, 30
jp DelayFrames
PrintSaveScreenText: ; 5d58 (1:5d58)
xor a
ld [H_AUTOBGTRANSFERENABLED], a
coord hl, 4, 0
lb bc, 8, 14
call TextBoxBorder
call LoadTextBoxTilePatterns
call UpdateSprites
coord hl, 5, 2
ld de, SaveScreenInfoText
call PlaceString
coord hl, 12, 2
ld de, wPlayerName
call PlaceString
coord hl, 17, 4
call PrintNumBadges
coord hl, 16, 6
call PrintNumOwnedMons
coord hl, 13, 8
call PrintPlayTime
ld a, $1
ld [H_AUTOBGTRANSFERENABLED], a
ld c, 30
jp DelayFrames
PrintNumBadges: ; 5d97 (1:5d97)
push hl
ld hl, wObtainedBadges
ld b, $1
call CountSetBits
pop hl
ld de, wNumSetBits
lb bc, 1, 2
jp PrintNumber
PrintNumOwnedMons: ; 5daa (1:5daa)
push hl
ld hl, wPokedexOwned
ld b, wPokedexOwnedEnd - wPokedexOwned
call CountSetBits
pop hl
ld de, wNumSetBits
lb bc, 1, 3
jp PrintNumber
PrintPlayTime: ; 5dbd (1:5dbd)
ld de, wPlayTimeHours + 1
lb bc, 1, 3
call PrintNumber
ld [hl], $6d
inc hl
ld de, wPlayTimeMinutes + 1
lb bc, LEADING_ZEROES | 1, 2
jp PrintNumber
SaveScreenInfoText: ; 5dd2 (1:5dd2)
db "PLAYER"
next "BADGES "
next "#DEX "
next "TIME@"
DisplayOptionMenu: ; 5df2 (1:5df2)
callab DisplayOptionMenu_ ; 10:5c70
ret
CheckForPlayerNameInSRAM: ; 5dfb (1:5dfb)
; Check if the player name data in SRAM has a string terminator character
; (indicating that a name may have been saved there) and return whether it does
; in carry.
ld a, SRAM_ENABLE
ld [MBC1SRamEnable], a
ld a, $1
ld [MBC1SRamBankingMode], a
ld [MBC1SRamBank], a
ld b, NAME_LENGTH
ld hl, sPlayerName
.loop
ld a, [hli]
cp "@"
jr z, .found
dec b
jr nz, .loop
; not found
xor a
ld [MBC1SRamEnable], a
ld [MBC1SRamBankingMode], a
and a
ret
.found
xor a
ld [MBC1SRamEnable], a
ld [MBC1SRamBankingMode], a
scf
ret