pokepinball/engine/high_scores_screen.asm
Raymond Dodge d1f4c7fab7 Use labels instead of constants for HRAM
Use explicit ldh instruction to access HRAM locations, don't rely on optimizing ld
2024-03-17 09:27:05 -05:00

1757 lines
28 KiB
NASM

HandleHighScoresScreen: ; 0xca7f
ld a, [wScreenState]
rst JumpTable ; calls JumpToFuncInTable
HighScoresScreenFunctions: ; 0xca83
dw Func_ca8f
dw Func_cb14
dw Func_ccac
dw Func_ccb6
dw Func_cd6c
dw ExitHighScoresScreen
Func_ca8f: ; 0xca8f
ld hl, wHighScoreId
call GenRandom
ld [hli], a
call GenRandom
ld [hli], a
call GenRandom
ld [hli], a
call GenRandom
ld [hli], a
ld hl, wRedHighScore5Points + $5
ld a, [wHighScoresStage]
and a
jr z, .asm_caae
ld hl, wBlueHighScore5Points + $5
.asm_caae
ld b, $5
.asm_cab0
ld de, wScore + $5
ld c, $6
.asm_cab5
ld a, [de]
cp [hl]
jr c, .asm_cad0
jr nz, .asm_cac2
dec de
dec hl
dec c
jr nz, .asm_cab5
jr .asm_cad0
.asm_cac2
dec hl
dec c
jr nz, .asm_cac2
ld a, l
sub $7
ld l, a
jr nc, .asm_cacd
dec h
.asm_cacd
dec b
jr nz, .asm_cab0
.asm_cad0
ld a, b
ld [wHighScoreNameRow], a
xor a
ld [wHighScoreNameColumn], a
inc b
ld hl, wRedHighScore4Id + 3
ld de, wRedHighScore5Id + 3
ld a, [wHighScoresStage]
and a
jr z, .asm_caeb
ld hl, wBlueHighScore4Id + 3
ld de, wBlueHighScore5Id + 3
.asm_caeb
ld a, $5
.asm_caed
cp b
jr c, .asm_cb02
push af
jr nz, .asm_caf6
ld hl, wHighScoreId + $3
.asm_caf6
ld c, $d
.asm_caf8
ld a, [hld]
ld [de], a
dec de
dec c
jr nz, .asm_caf8
pop af
dec a
jr nz, .asm_caed
.asm_cb02
ld a, [wHighScoreNameRow]
cp $5
ld a, $1
jr nz, .asm_cb0c
xor a
.asm_cb0c
ld [wHighScoreIsEnteringName], a
ld hl, wScreenState
inc [hl]
ret
Func_cb14: ; 0xcb14
ld a, $43
ldh [hLCDC], a
ld a, $e0
ld [wBGP], a
ld a, $e1
ld [wOBP0], a
ld [wOBP1], a
xor a
ldh [hSCX], a
ldh [hNextFrameHBlankSCX], a
ldh [hSCY], a
ldh [hNextFrameHBlankSCY], a
ld a, $e
ldh [hLYC], a
ldh [hLastLYC], a
ld a, $82
ldh [hNextLYCSub], a
ldh [hLYCSub], a
ld hl, hSTAT
set 6, [hl]
ld hl, rIE
set 1, [hl]
ld a, $3
ldh [hStatIntrRoutine], a
ldh a, [hGameBoyColorFlag]
and a
jr z, .asm_cb51
ld a, [wHighScoresStage]
inc a
.asm_cb51
ld hl, HighScoresVideoDataPointers
call LoadVideoData
call ClearSpriteBuffer
ld a, $20
ld [wHighScoreNameEntryAsteriskBlinkCounter], a
call Func_d211
hlCoord 0, 14, vBGMap
ld de, wRedHighScore5Id + $3
call Func_d2cb
hlCoord 0, 14, vBGWin
ld de, wBlueHighScore5Id + $3
call Func_d2cb
ld a, [wHighScoresStage]
and a
jr z, .asm_cb7f
ld hl, hLCDC
set 3, [hl]
.asm_cb7f
call SetAllPalettesWhite
ld a, [wHighScoreIsEnteringName]
and a
jr z, .asm_cbbd
ld a, [wHighScoreNameRow]
and a
jr nz, .asm_cb9b
ld a, Bank(Music_EndCredits)
call SetSongBank
ld de, MUSIC_END_CREDITS
call PlaySong
jr .asm_cba6
.asm_cb9b
ld a, Bank(Music_NameEntry)
call SetSongBank
ld de, MUSIC_NAME_ENTRY
call PlaySong
.asm_cba6
call EnableLCD
ld bc, $0009
call Func_d68a
ld bc, $03c9
call Func_d68a
call FadeIn
ld hl, wScreenState
inc [hl]
ret
.asm_cbbd
ld a, Bank(Music_HiScore)
call SetSongBank
ld de, MUSIC_HI_SCORE
call PlaySong
call EnableLCD
ld bc, $0009
call Func_d68a
ld bc, $03c9
call Func_d68a
call FadeIn
ld hl, wScreenState
inc [hl]
ld hl, wScreenState
inc [hl]
ret
HighScoresVideoDataPointers: ; 0xcbe3
dw HighScoresVideoData_GameBoy
dw HighScoresRedStageVideoData_GameBoyColor
dw HighScoresBlueStageVideoData_GameBoyColor
HighScoresVideoData_GameBoy: ; 0xcbe9
VIDEO_DATA_TILES HighScoresBaseGameBoyGfx, vTilesOB, $1800
VIDEO_DATA_TILEMAP HighScoresTilemap, vBGMap, $400
VIDEO_DATA_TILEMAP HighScoresTilemap2, vBGWin, $400
dw HighScoresTilemap + $3c0
db Bank(HighScoresTilemap)
dw vBGMap
dw ($40 << 2)
dw HighScoresTilemap + $280
db Bank(HighScoresTilemap)
dw vBGMap + $200
dw ($40 << 2)
dw HighScoresTilemap2 + $3c0
db Bank(HighScoresTilemap2)
dw vBGWin
dw ($40 << 2)
dw HighScoresTilemap2 + $280
db Bank(HighScoresTilemap2)
dw vBGWin + $200
dw ($40 << 2)
db $FF, $FF ; terminators
HighScoresRedStageVideoData_GameBoyColor: ; 0xcc1c
VIDEO_DATA_TILES HighScoresBaseGameBoyGfx, vTilesOB, $1800
VIDEO_DATA_TILEMAP HighScoresTilemap, vBGMap, $400
VIDEO_DATA_TILEMAP HighScoresTilemap2, vBGWin, $400
VIDEO_DATA_TILEMAP_BANK2 HighScoresTilemap4, vBGMap, $400
VIDEO_DATA_TILEMAP_BANK2 HighScoresTilemap5, vBGWin, $400
dw HighScoresTilemap + $3c0
db Bank(HighScoresTilemap)
dw vBGMap
dw ($40 << 2)
dw HighScoresTilemap + $280
db Bank(HighScoresTilemap)
dw vBGMap + $200
dw ($40 << 2)
dw HighScoresTilemap2 + $3c0
db Bank(HighScoresTilemap2)
dw vBGWin
dw ($40 << 2)
dw HighScoresTilemap2 + $280
db Bank(HighScoresTilemap2)
dw vBGWin + $200
dw ($40 << 2)
VIDEO_DATA_PALETTES HighScoresRedStagePalettes, $80
db $FF, $FF
HighScoresBlueStageVideoData_GameBoyColor: ; 0xcc64
VIDEO_DATA_TILES HighScoresBaseGameBoyGfx, vTilesOB, $1800
VIDEO_DATA_TILEMAP HighScoresTilemap, vBGMap, $400
VIDEO_DATA_TILEMAP HighScoresTilemap2, vBGWin, $400
VIDEO_DATA_TILEMAP_BANK2 HighScoresTilemap4, vBGMap, $400
VIDEO_DATA_TILEMAP_BANK2 HighScoresTilemap5, vBGWin, $400
dw HighScoresTilemap + $3c0
db Bank(HighScoresTilemap)
dw vBGMap
dw ($40 << 2)
dw HighScoresTilemap + $280
db Bank(HighScoresTilemap)
dw vBGMap + $200
dw ($40 << 2)
dw HighScoresTilemap2 + $3c0
db Bank(HighScoresTilemap2)
dw vBGWin
dw ($40 << 2)
dw HighScoresTilemap2 + $280
db Bank(HighScoresTilemap2)
dw vBGWin + $200
dw ($40 << 2)
VIDEO_DATA_PALETTES HighScoresBlueStagePalettes, $80
db $FF, $FF ; terminators
Func_ccac: ; 0xccac
call Func_d18b
call Func_d1d2
call Func_d211
ret
Func_ccb6: ; 0xccb6
call Func_d4cf
call AnimateHighScoresArrow
ldh a, [hNewlyPressedButtons]
bit BIT_A_BUTTON, a
jr z, .asm_ccd1
lb de, $00, $01
call PlaySoundEffect
ld hl, wScreenState
inc [hl]
ld hl, wScreenState
inc [hl]
ret
.asm_ccd1
bit 1, a
jr z, .asm_cce4
lb de, $00, $01
call PlaySoundEffect
ld hl, wScreenState
inc [hl]
ld hl, wScreenState
inc [hl]
ret
.asm_cce4
bit 3, a
jr z, .asm_ccfb
call Func_1a43
ldh a, [hGameBoyColorFlag]
ld [wd8f0], a
lb de, $00, $01
call PlaySoundEffect
ld hl, wScreenState
inc [hl]
ret
.asm_ccfb
ldh a, [hJoypadState]
cp (SELECT | D_UP)
ret nz
ldh a, [hNewlyPressedButtons]
and (SELECT | D_UP)
ret z
lb de, $00, $01
call PlaySoundEffect
call ClearSpriteBuffer
ld bc, $473b
ld a, SPRITE_HIGH_SCORES_DELETE_DATA
call LoadSpriteData
.waitForDeleteScoresConfirmation
rst AdvanceFrame
ldh a, [hNewlyPressedButtons]
bit BIT_B_BUTTON, a
jr z, .asm_cd24
lb de, $00, $01
call PlaySoundEffect
ret
.asm_cd24
bit 0, a
jr z, .waitForDeleteScoresConfirmation
lb de, $00, $01
call PlaySoundEffect
call CopyInitialHighScores
ld a, BANK(HighScoresTilemap)
ld hl, HighScoresTilemap + $40
deCoord 0, 2, vBGMap
ld bc, $01c0
call LoadVRAMData
ld a, BANK(HighScoresTilemap2)
ld hl, HighScoresTilemap2 + $40
deCoord 0, 2, vBGWin
ld bc, $01c0
call LoadVRAMData
hlCoord 0, 14, vBGMap
ld de, wRedHighScore5Id + $3
call Func_d361
hlCoord 0, 14, vBGWin
ld de, wBlueHighScore5Id + $3
call Func_d361
ld hl, wRedHighScore1Points
ld de, sHighScores
ld bc, $0082
call SaveData
ret
Func_cd6c: ; 0xcd6c
ldh a, [hFrameCounter]
and $1f
call z, Func_1a43
call Func_cf7d
call Func_cfa6
ldh a, [hNewlyPressedButtons]
bit BIT_A_BUTTON, a
jr z, .asm_cdbb
lb de, $00, $01
call PlaySoundEffect
ld a, [wHighScoresPrintSendSelection]
and a
jr nz, .asm_cda1
ld a, [wd86e]
and a
jr z, .asm_cdbb
call ClearSpriteBuffer
ld bc, $473b
ld a, SPRITE_HIGH_SCORES_PRINTING
call LoadSpriteData
call Func_d042
jr .asm_cdc6
.asm_cda1
ld a, [wd8f0]
and a
jr z, .asm_cdbb
ld de, MUSIC_NOTHING
call PlaySong
rst AdvanceFrame
call Func_cdce
push af
ld de, MUSIC_HI_SCORE
call PlaySong
pop af
jr nc, .asm_cdc6
.asm_cdbb
ldh a, [hNewlyPressedButtons]
bit BIT_B_BUTTON, a
ret z
lb de, $00, $01
call PlaySoundEffect
.asm_cdc6
xor a
ld [rRP], a
ld hl, wScreenState
dec [hl]
ret
Func_cdce: ; 0xcdce
push af
ld a, $0
ld [$abf6], a
pop af
call ClearSpriteBuffer
call Func_1be3
call SendHighScores
push af
ld a, $1
ld [$abf6], a
pop af
di
ld a, [wd8ea]
cp $0
jp nz, .asm_ceb6
ld a, [wd8e9]
cp $1
jr z, .asm_ce23
push af
ld a, $2
ld [$abf6], a
pop af
ld b, $82
ld hl, wRedHighScore1Points
call Func_1cf8
ld a, [wd8ea]
cp $0
jp nz, .asm_ceb6
push af
ld a, $3
ld [$abf6], a
pop af
ld hl, wc4c0
call Func_1dda
ld a, [wd8ea]
cp $0
jp nz, .asm_ceb6
jr .asm_ce4d
.asm_ce23
push af
ld a, $4
ld [$abf6], a
pop af
ld hl, wc4c0
call Func_1dda
ld a, [wd8ea]
cp $0
jr nz, .asm_ceb6
push af
ld a, $5
ld [$abf6], a
pop af
ld b, $82
ld hl, wRedHighScore1Points
call Func_1cf8
ld a, [wd8ea]
cp $0
jr nz, .asm_ceb6
.asm_ce4d
push af
ld a, $6
ld [$abf6], a
pop af
call Func_ceca
rst AdvanceFrame
ld hl, wc4cc
ld b, $5
.asm_ce5d
push bc
push hl
ld d, h
ld e, l
ld hl, wRedHighScore5Id + $3
call Func_cfcb
pop hl
pop bc
ld de, $000d
add hl, de
dec b
jr nz, .asm_ce5d
push af
ld a, $7
ld [$abf6], a
pop af
ld hl, wBottomMessageText + $0d
ld b, $5
.asm_ce7c
push bc
push hl
ld d, h
ld e, l
ld hl, wBlueHighScore5Id + $3
call Func_cfcb
pop hl
pop bc
ld de, $000d
add hl, de
dec b
jr nz, .asm_ce7c
push af
ld a, $8
ld [$abf6], a
pop af
hlCoord 0, 14, vBGMap
ld de, wRedHighScore5Id + $3
call Func_d361
hlCoord 0, 14, vBGWin
ld de, wBlueHighScore5Id + $3
call Func_d361
ld hl, wRedHighScore1Points
ld de, sHighScores
ld bc, $0082
call SaveData
and a
ret
.asm_ceb6
push af
ld a, $9
ld [$abf6], a
pop af
call Func_ceca
rst AdvanceFrame
push af
ld a, $a
ld [$abf6], a
pop af
scf
ret
Func_ceca: ; 0xceca
ld a, [rLY]
and a
jr nz, Func_ceca
ei
ret
SendHighScores: ; 0xced1
; Sends high scores, and plays the animation for sending the high scores.
ld hl, SendHighScoresAnimationData
ld de, wSendHighScoresAnimationFrameCounter
call InitAnimation
ld bc, $4800
ld a, [wSendHighScoresAnimationFrame]
call LoadSpriteData
ld bc, $473b
ld a, SPRITE_SENDING_HIGH_SCORES_TEXT
call LoadSpriteData
call CleanSpriteBuffer
rst AdvanceFrame
ld a, $1
ld [wd8e9], a
ld b, $b4 ; maximum attempts to send high scores
.attemptToSendHighScoresLoop
push bc
xor a
ldh [hNumFramesSinceLastVBlank], a
.asm_cefa
ld b, $2
ld c, $56
ld a, [$ff00+c]
and b
jr z, .asm_cf09
ldh a, [hNumFramesSinceLastVBlank]
and a
jr z, .asm_cefa
jr .asm_cf0e
.asm_cf09
call Func_1c50
jr .continueAttempts
.asm_cf0e
ld hl, SendHighScoresAnimationData
ld de, wSendHighScoresAnimation
call UpdateAnimation
jr nc, .continueAttempts
ld bc, $4800
ld a, [wSendHighScoresAnimationFrame]
call LoadSpriteData
ld bc, $473b
ld a, SPRITE_SENDING_HIGH_SCORES_TEXT
call LoadSpriteData
call CleanSpriteBuffer
call Func_1ca1
ld a, [wSendHighScoresAnimationIndex]
cp $6
jr nz, .continueAttempts
ld hl, SendHighScoresAnimationData
ld de, wSendHighScoresAnimationFrameCounter
call InitAnimation
.continueAttempts
pop bc
ld a, [wd8ea]
cp $0
ret z
dec b
jr nz, .attemptToSendHighScoresLoop
ret
SendHighScoresAnimationData: ; 0xcf4b
; Each entry is [sprite id][duration]
db $0C, SPRITE_SEND_HIGH_SCORES_0
db $06, SPRITE_SEND_HIGH_SCORES_1
db $0A, SPRITE_SEND_HIGH_SCORES_2
db $0C, SPRITE_SEND_HIGH_SCORES_3
db $0A, SPRITE_SEND_HIGH_SCORES_4
db $06, SPRITE_SEND_HIGH_SCORES_5
db $00 ; terminator
Func_cf58: ; 0xcf58
cp SPRITE_HIGH_SCORES_ERROR_DIALOGS_COUNT + 1
ret z
push af
lb de, $00, $02
call PlaySoundEffect
call ClearSpriteBuffer
rst AdvanceFrame
pop af
ld bc, $473b
add SPRITE_HIGH_SCORES_ERROR_DIALOGS - 1
call LoadSpriteData
.asm_cf6f
rst AdvanceFrame
ldh a, [hNewlyPressedButtons]
bit BIT_A_BUTTON, a
jr z, .asm_cf6f
lb de, $00, $01
call PlaySoundEffect
ret
Func_cf7d: ; 0xcf7d
ld a, [wNewlyPressedButtonsPersistent]
ld b, a
ld a, [wHighScoresPrintSendSelection]
bit 6, b
jr z, .asm_cf95
and a
ret z
dec a
ld [wHighScoresPrintSendSelection], a
lb de, $00, $03
call PlaySoundEffect
ret
.asm_cf95
bit 7, b
ret z
cp $1
ret z
inc a
ld [wHighScoresPrintSendSelection], a
lb de, $00, $03
call PlaySoundEffect
ret
Func_cfa6: ; 0xcfa6
ld bc, $473b
ld a, SPRITE_HIGH_SCORES_PRINT_SEND_DIALOG_TEXT
call LoadSpriteData
ld a, [wd8f0]
and a
jr z, .asm_cfb6
ld a, $2
.asm_cfb6
ld e, a
ld a, [wd86e]
add e
xor $3
add SPRITE_HIGH_SCORES_PRINT_SEND_DIALOG_DISABLED
call LoadSpriteData
ld a, [wHighScoresPrintSendSelection]
add SPRITE_HIGH_SCORES_PRINT_SEND_DIALOG_SELECTION
call LoadSpriteData
ret
Func_cfcb: ; 0xcfcb
ld a, e
ld [$ff8c], a
ld a, d
ld [$ff8d], a
push hl
ld b, $5
.asm_cfd4
ld a, [$ff8c]
ld e, a
ld a, [$ff8d]
ld d, a
call Func_d005
call Func_d017
jr c, .asm_cfe5
dec b
jr nz, .asm_cfd4
.asm_cfe5
inc b
pop de
ld hl, $fff3
add hl, de
ld a, $5
.asm_cfed
cp b
ret c
push af
jr nz, .asm_cff8
ld a, [$ff8c]
ld l, a
ld a, [$ff8d]
ld h, a
.asm_cff8
ld c, $d
.asm_cffa
ld a, [hld]
ld [de], a
dec de
dec c
jr nz, .asm_cffa
pop af
dec a
jr nz, .asm_cfed
ret
Func_d005: ; 0xd005
ld c, $7
.asm_d007
ld a, [de]
cp [hl]
jr nz, .asm_d010
dec de
dec hl
dec c
jr nz, .asm_d007
.asm_d010
ld a, c
ld [$ff8e], a
call Func_d035
ret
Func_d017: ; 0xd017
ld c, $6
.asm_d019
ld a, [de]
cp [hl]
jr c, .asm_d02b
jr nz, .asm_d030
dec de
dec hl
dec c
jr nz, .asm_d019
ld a, [$ff8e]
and a
jr nz, .asm_d02b
ld b, $5
.asm_d02b
call Func_d035
scf
ret
.asm_d030
call Func_d035
and a
ret
Func_d035: ; 0xd035
ld a, e
sub c
ld e, a
jr nc, .asm_d03b
dec d
.asm_d03b
ld a, l
sub c
ld l, a
jr nc, .asm_d041
dec h
.asm_d041
ret
Func_d042: ; 0xd042
ldh a, [hJoypadState]
ld [wda86], a
ld b, a
ld a, $80
bit BIT_D_LEFT, b
jr z, .asm_d052
ld a, $7f
jr .asm_d058
.asm_d052
bit BIT_D_RIGHT, b
jr z, .asm_d058
ld a, $10
.asm_d058
ld [wd8a7], a
ld a, $e0
ld [wd8aa], a
ld a, BANK(HighScoresTilemap)
ld hl, HighScoresTilemap + $3c0
ld de, wSendHighScoresTopBarTilemap
ld bc, $0040
call FarCopyData
ld a, $0
hlCoord 0, 2, vBGMap
ld de, wSendHighScoresTopBarTilemap + $40
ld bc, $01c0
call LoadVRAMData
ld a, BANK(HighScoresTilemap)
ld hl, HighScoresTilemap + $280
ld de, wSendHighScoresTopBarTilemap + $200
ld bc, $0040
call FarCopyData
call Func_d6b6
call Func_d0e3
ret c
ld a, [wda86]
bit 2, a
jr z, .asm_d0a2
ld de, wRedHighScore1Id
call Func_d107
call Func_d0f5
ret c
.asm_d0a2
ld a, BANK(HighScoresTilemap2)
ld hl, HighScoresTilemap2 + $3c0
ld de, wSendHighScoresTopBarTilemap
ld bc, $0040
call FarCopyData
ld a, $0
hlCoord 0, 2, vBGWin
ld de, wSendHighScoresTopBarTilemap + $40
ld bc, $01c0
call LoadVRAMData
ld a, BANK(HighScoresTilemap2)
ld hl, HighScoresTilemap2 + $280
ld de, wSendHighScoresTopBarTilemap + $200
ld bc, $0040
call FarCopyData
call Func_d6b6
call Func_d0e3
ret c
ld a, [wda86]
bit 2, a
ret z
ld de, wBlueHighScore1Id
call Func_d107
call Func_d0f5
ret
Func_d0e3: ; 0xd0e3
ld a, BANK(HighScoresBaseGameBoyGfx)
ld hl, HighScoresBaseGameBoyGfx + $800
call Func_1a21
ld a, [wd86d]
and a
ret z
call Func_cf58
scf
ret
Func_d0f5: ; 0xd0f5
ld a, BANK(HighScoresHexadecimalCharsGfx)
ld hl, HighScoresHexadecimalCharsGfx
call Func_1a21
ld a, [wd86d]
and a
ret z
call Func_cf58
scf
ret
Func_d107: ; 0xd107
ld hl, wSendHighScoresTopBarTilemap
ld a, $c0
ld b, $20
.clear
rept 32
ld [hli], a
endr
dec b
jr nz, .clear
ld hl, wSendHighScoresTopBarTilemap
ld b, $5
.loop
ld c, $4
.inner
ld a, [de]
swap a
call Func_d159
ld a, [de]
call Func_d159
inc de
inc hl
dec c
jr nz, .inner
ld a, l
add $4c
ld l, a
jr nc, .no_carry_1
inc h
.no_carry_1
ld a, e
add $9
ld e, a
jr nc, .no_carry_2
inc d
.no_carry_2
dec b
jr nz, .loop
ret
Func_d159: ; 0xd159
and $f
sla a
sla a
xor $80
ld [hli], a
inc a
ld [hli], a
inc a
push bc
push hl
ld bc, $001e
add hl, bc
ld [hli], a
inc a
ld [hli], a
pop hl
pop bc
ret
ExitHighScoresScreen: ; 0xd171
call FadeOut
call DisableLCD
ld hl, hSTAT
res 6, [hl]
ld hl, rIE
res 1, [hl]
ld a, SCREEN_TITLESCREEN
ld [wCurrentScreen], a
xor a
ld [wScreenState], a
ret
Func_d18b: ; 0xd18b
ldh a, [hPressedButtons]
ld b, a
ld a, [wHighScoreNameRow]
ld e, a
sla e
sla e
add e
sla e
add e
ld e, a
ld a, [wHighScoreNameColumn]
add e
ld e, a
ld d, $0
ld hl, wRedHighScore1Name
ld a, [wHighScoresStage]
and a
jr z, .asm_d1ae
ld hl, wBlueHighScore1Name
.asm_d1ae
add hl, de
ld a, [hl]
bit 4, b
jr z, .asm_d1bd
inc a
cp $38
jr nz, .asm_d1c7
ld a, $a
jr .asm_d1c7
.asm_d1bd
bit 5, b
ret z
dec a
cp $9
jr nz, .asm_d1c7
ld a, $37
.asm_d1c7
ld [hl], a
call Func_d46f
lb de, $00, $03
call PlaySoundEffect
ret
Func_d1d2: ; 0xd1d2
ldh a, [hNewlyPressedButtons]
ld b, a
ld a, [wHighScoreNameColumn]
bit BIT_A_BUTTON, b
jr z, .asm_d1fc
inc a
cp $3
jr nz, .asm_d202
lb de, $07, $45
call PlaySoundEffect
xor a
ld [wHighScoreIsEnteringName], a
ld hl, wScreenState
inc [hl]
ld hl, wRedHighScore1Points
ld de, sHighScores
ld bc, $0082
call SaveData
ret
.asm_d1fc
bit 1, b
ret z
and a
ret z
dec a
.asm_d202
ld [wHighScoreNameColumn], a
ld a, $20
ld [wHighScoreNameEntryAsteriskBlinkCounter], a
lb de, $00, $01
call PlaySoundEffect
ret
Func_d211: ; 0xd211
; related to high scores name entry?
ld a, [wHighScoreIsEnteringName]
and a
ret z
ldh a, [hJoypadState]
and (D_RIGHT | D_LEFT)
jr z, .asm_d221
; current name entry character changed; hide asterisk to show new letter
xor a
ld [wHighScoreNameEntryAsteriskBlinkCounter], a
ret
.asm_d221
ld a, [wHighScoreNameEntryAsteriskBlinkCounter]
inc a
ld [wHighScoreNameEntryAsteriskBlinkCounter], a
bit 5, a
ret z
ld a, [wHighScoreNameRow]
ld e, a
ld d, $0
ld hl, SpritePixelYOffsets_Names
add hl, de
ld c, [hl]
ld a, [wHighScoreNameColumn]
ld e, a
ld d, $0
ld hl, SpritePixelXOffsets_Names
add hl, de
ld b, [hl]
ld a, SPRITE_HIGH_SCORES_NAME_ENTRY_ASTERISK
call LoadSpriteData
ret
SpritePixelYOffsets_Names: ; 0xd247
db $10, $28, $40, $58, $70
SpritePixelXOffsets_Names: ; 0xd24c
db $18, $20, $28
AnimateHighScoresArrow: ; 0xd24f
; Handles the animation of the arrow in the bottom
; corner of the high scores screens.
ld a, [wHighScoresArrowAnimationCounter]
inc a
cp $28
jr c, .noOverflow
xor a
.noOverflow
ld [wHighScoresArrowAnimationCounter], a
ld a, [wHighScoresStage]
and a
ld c, $77
ld a, SPRITE_HIGH_SCORES_ARROW_RIGHT
ld hl, HighScoresRightArrowSpritePixelXOffsets
jr z, .asm_d26d
ld a, SPRITE_HIGH_SCORES_ARROW_LEFT
ld hl, HighScoresLeftArrowSpritePixelXOffsets
.asm_d26d
push af
ld a, [wHighScoresArrowAnimationCounter]
ld e, a
ld d, $0
add hl, de
ld b, [hl]
pop af
call LoadSpriteData
ret
HighScoresRightArrowSpritePixelXOffsets: ; 0xd27b
; Controls the animation of the right-arrow in the bottom corner of the
; high scores screen.
db $87, $87, $8A, $8A, $8A, $8A, $8A, $8A
db $89, $89, $88, $88, $88, $88, $88, $88
db $88, $88, $88, $88, $88, $88, $88, $88
db $88, $88, $88, $88, $88, $88, $88, $88
db $88, $88, $88, $88, $88, $88, $88, $88
HighScoresLeftArrowSpritePixelXOffsets: ; 0xd2a3
db $02, $02, $FF, $FF, $FF, $FF, $FF, $FF
db $00, $00, $01, $01, $01, $01, $01, $01
db $01, $01, $01, $01, $01, $01, $01, $01
db $01, $01, $01, $01, $01, $01, $01, $01
db $01, $01, $01, $01, $01, $01, $01, $01
Func_d2cb: ; 0xd2cb
ld b, $5
.asm_d2cd
push bc
push hl
dec de
dec de
dec de
dec de
ld a, l
add $5
ld l, a
ld b, $3
.asm_d2d9
ld a, [de]
call Func_d348
dec de
dec hl
dec b
jr nz, .asm_d2d9
pop hl
push hl
ld a, l
add $6
ld l, a
ld bc, $0c01
.asm_d2eb
ld a, [de]
swap a
and $f
call Func_d30e
inc hl
dec b
ld a, [de]
and $f
call Func_d30e
dec de
inc hl
dec b
jr nz, .asm_d2eb
xor a
call Func_d317
pop hl
ld bc, hSCY
add hl, bc
pop bc
dec b
jr nz, .asm_d2cd
ret
Func_d30e: ; 0xd30e
jr nz, Func_d317
ld a, b
dec a
jr z, Func_d317
ld a, c
and a
ret nz
; fall through
Func_d317: ; 0xd317
push de
push af
call Func_d336
pop af
ld c, $0
sla a
add e
ld [hl], a
cp $fe
jr z, .asm_d328
inc a
.asm_d328
push hl
push af
ld a, l
add $20
ld l, a
jr nc, .asm_d331
inc h
.asm_d331
pop af
ld [hl], a
pop hl
pop de
ret
Func_d336: ; 0xd336
ld e, $6c
ld a, b
cp $3
ret z
cp $6
ret z
cp $9
ret z
cp $c
ret z
ld e, $58
ret
Func_d348: ; 0xd348
ld c, $0
sla a
add $90
ld [hl], a
cp $fe
jr z, .asm_d354
inc a
.asm_d354
push hl
push af
ld a, l
add $20
ld l, a
jr nc, .asm_d35d
inc h
.asm_d35d
pop af
ld [hl], a
pop hl
ret
Func_d361: ; 0xd361
ld b, $5
.asm_d363
push bc
push hl
dec de
dec de
dec de
dec de
ld a, l
add $5
ld l, a
ld b, $3
.asm_d36f
ld a, [de]
call Func_d3e2
dec de
dec hl
dec b
jr nz, .asm_d36f
pop hl
push hl
ld a, l
add $6
ld l, a
ld bc, $0c01
.asm_d381
ld a, [de]
swap a
and $f
call Func_d3a4
inc hl
dec b
ld a, [de]
and $f
call Func_d3a4
dec de
inc hl
dec b
jr nz, .asm_d381
xor a
call Func_d3ad
pop hl
ld bc, hSCY
add hl, bc
pop bc
dec b
jr nz, .asm_d363
ret
Func_d3a4: ; 0xd3a4
jr nz, Func_d3ad
ld a, b
dec a
jr z, Func_d3ad
ld a, c
and a
ret nz
; fall through
Func_d3ad: ; 0xd3ad
push de
push af
call Func_d3d0
pop af
ld c, $0
sla a
add e
call PutTileInVRAM
cp $fe
jr z, .asm_d3c0
inc a
.asm_d3c0
push hl
push af
ld a, l
add $20
ld l, a
jr nc, .asm_d3c9
inc h
.asm_d3c9
pop af
call PutTileInVRAM
pop hl
pop de
ret
Func_d3d0: ; 0xd3d0
ld e, $6c
ld a, b
cp $3
ret z
cp $6
ret z
cp $9
ret z
cp $c
ret z
ld e, $58
ret
Func_d3e2: ; 0xd3e2
ld c, $0
sla a
add $90
call PutTileInVRAM
cp $fe
jr z, .asm_d3f0
inc a
.asm_d3f0
push hl
push af
ld a, l
add $20
ld l, a
jr nc, .asm_d3f9
inc h
.asm_d3f9
pop af
call PutTileInVRAM
pop hl
ret
CopyInitialHighScores: ; 0xd3ff
ld hl, InitialHighScores
ld de, wRedHighScore1Points
call CopyInitialHighScoresForStage
ld hl, InitialHighScores
ld de, wBlueHighScore1Points
CopyInitialHighScoresForStage: ; 0xd40e
; input: hl = address of high score entries
; de = destination address for high score entries to be copied
ld b, $5 ; 5 high score entries to copy
.copyHighScoreEntry
ld c, $6 ; high score points are 6 bytes long
.copyPoints
ld a, [hli]
ld [de], a
inc de
dec c
jr nz, .copyPoints
ld c, $3 ; name is 3 bytes
.copyName
ld a, [hli]
sub $37
ld [de], a
inc de
dec c
jr nz, .copyName
ld c, $4
.asm_d424 ; TODO: what are these 4 bytes used for?
ld a, [hli]
ld [de], a
inc de
dec c
jr nz, .asm_d424
dec b
jr nz, .copyHighScoreEntry
ret
INCLUDE "data/initial_high_scores.asm" ; 0xd42e
Func_d46f: ; 0xd46f
ld a, [wHighScoreNameRow]
ld d, a
sla a
add d
ld d, a
ld e, $0
srl d
rr e
srl d
rr e
srl d
rr e
ld a, [wHighScoreNameColumn]
add e
ld e, a
hlCoord 3, 2, vBGMap
ld a, [wHighScoresStage]
and a
jr z, .asm_d496
hlCoord 3, 2, vBGWin
.asm_d496
add hl, de
push hl
ld a, [wHighScoreNameRow]
ld e, a
sla e
sla e
add e
sla e
add e
ld e, a
ld a, [wHighScoreNameColumn]
add e
ld e, a
ld d, $0
ld hl, wRedHighScore1Name
ld a, [wHighScoresStage]
and a
jr z, .asm_d4b8
ld hl, wBlueHighScore1Name
.asm_d4b8
add hl, de
ld a, [hl]
sla a
add $90
pop hl
call PutTileInVRAM
ld de, $0020
add hl, de
cp $fe
jr z, .asm_d4cb
inc a
.asm_d4cb
call PutTileInVRAM
ret
Func_d4cf: ; 0xd4cf
ldh a, [hNewlyPressedButtons]
ld b, a
ld a, [wHighScoresStage]
bit 4, b
jr z, .asm_d4e3
and a
ret nz
lb de, $00, $03
call PlaySoundEffect
jr .asm_d4f0
.asm_d4e3
bit 5, b
ret z
and a
ret z
lb de, $00, $03
call PlaySoundEffect
jr .asm_d537
.asm_d4f0
call ClearSpriteBuffer
call Func_d57b
ld a, $a5
ldh [hWX], a
xor a
ldh [hWY], a
ld a, $2
ldh [hSCX], a
ld hl, hLCDC
set 5, [hl]
ld b, $27
.asm_d508
push bc
ld a, $27
sub b
bit 0, b
call nz, TransitionHighScoresPalettes
ld hl, hWX
dec [hl]
dec [hl]
dec [hl]
dec [hl]
ld hl, hSCX
inc [hl]
inc [hl]
inc [hl]
inc [hl]
rst AdvanceFrame
pop bc
dec b
jr nz, .asm_d508
xor a
ldh [hSCX], a
ld hl, hLCDC
res 5, [hl]
set 3, [hl]
ld a, $1
ld [wHighScoresStage], a
call Func_d5d0
ret
.asm_d537
call ClearSpriteBuffer
call Func_d57b
ld a, $7
ldh [hWX], a
xor a
ldh [hWY], a
ld a, $a0
ldh [hSCX], a
ld hl, hLCDC
set 5, [hl]
res 3, [hl]
ld b, $27
.asm_d551
push bc
ld a, b
bit 0, b
call nz, TransitionHighScoresPalettes
ld hl, hWX
inc [hl]
inc [hl]
inc [hl]
inc [hl]
ld hl, hSCX
dec [hl]
dec [hl]
dec [hl]
dec [hl]
rst AdvanceFrame
pop bc
dec b
jr nz, .asm_d551
xor a
ldh [hSCX], a
ld hl, hLCDC
res 5, [hl]
xor a
ld [wHighScoresStage], a
call Func_d5d0
ret
Func_d57b: ; 0xd57b
ld a, $f0
ldh [hSCY], a
xor a
ldh [hNextFrameHBlankSCX], a
ld a, $10
ldh [hNextFrameHBlankSCY], a
rst AdvanceFrame
ld a, BANK(HighScoresTilemap)
ld hl, HighScoresTilemap
deCoord 0, 0, vBGMap
ld bc, $0040
call LoadVRAMData
ld a, BANK(HighScoresTilemap)
ld hl, HighScoresTilemap + $200
deCoord 0, 16, vBGMap
ld bc, $0040
call LoadVRAMData
ld a, BANK(HighScoresTilemap2)
ld hl, HighScoresTilemap2
deCoord 0, 0, vBGWin
ld bc, $0040
call LoadVRAMData
ld a, BANK(HighScoresTilemap2)
ld hl, HighScoresTilemap2 + $200
deCoord 0, 16, vBGWin
ld bc, $0040
call LoadVRAMData
ld b, $10
.asm_d5c1
push bc
ld hl, hSCY
inc [hl]
ld hl, hNextFrameHBlankSCY
dec [hl]
rst AdvanceFrame
pop bc
dec b
jr nz, .asm_d5c1
ret
Func_d5d0: ; 0xd5d0
ld b, $10
.asm_d5d2
push bc
ld hl, hSCY
dec [hl]
ld hl, hNextFrameHBlankSCY
inc [hl]
rst AdvanceFrame
pop bc
dec b
jr nz, .asm_d5d2
ld a, BANK(HighScoresTilemap)
ld hl, HighScoresTilemap + $3c0
deCoord 0, 0, vBGMap
ld bc, $0040
call LoadVRAMData
ld a, BANK(HighScoresTilemap)
ld hl, HighScoresTilemap + $280
deCoord 0, 16, vBGMap
ld bc, $0040
call LoadVRAMData
ld a, BANK(HighScoresTilemap2)
ld hl, HighScoresTilemap2 + $3c0
deCoord 0, 0, vBGWin
ld bc, $0040
call LoadVRAMData
ld a, BANK(HighScoresTilemap2)
ld hl, HighScoresTilemap2 + $280
deCoord 0, 16, vBGWin
ld bc, $0040
call LoadVRAMData
ld bc, $0009
call Func_d68a
xor a
ldh [hSCY], a
ldh [hNextFrameHBlankSCX], a
ldh [hNextFrameHBlankSCY], a
ret
TransitionHighScoresPalettes: ; 0xd626
; When switching between the Red and Blue field high scores, the palettes
; of the rows smoothly transition between red and blue.
ld c, a
ldh a, [hGameBoyColorFlag]
and a
ret z
ld a, c
srl a
sub $2
cp $10
ret nc
ld c, a
ld b, $0
sla c
add c
ld c, a
ld hl, HighScoresPalettesTransition
add hl, bc
ld a, [hli]
ld c, a
ld a, [hli]
ld b, a
ld a, [hl]
ld h, b
ld l, c
ld de, $0008
ld bc, $0038
push af
call Func_7dc
pop af
ld de, $0040
ld bc, $0008
call Func_7dc
ret
HighScoresPalettesTransition: ; 0xd65a
; When switching between the Red and Blue field high scores, the palette
; of the rows fades between red and blue. This table defines the transition
; of those palettes.
dwb HighScoresTransitionPalettes1, Bank(HighScoresTransitionPalettes1)
dwb HighScoresTransitionPalettes2, Bank(HighScoresTransitionPalettes2)
dwb HighScoresTransitionPalettes3, Bank(HighScoresTransitionPalettes3)
dwb HighScoresTransitionPalettes4, Bank(HighScoresTransitionPalettes4)
dwb HighScoresTransitionPalettes5, Bank(HighScoresTransitionPalettes5)
dwb HighScoresTransitionPalettes6, Bank(HighScoresTransitionPalettes6)
dwb HighScoresTransitionPalettes7, Bank(HighScoresTransitionPalettes7)
dwb HighScoresTransitionPalettes8, Bank(HighScoresTransitionPalettes8)
dwb HighScoresTransitionPalettes9, Bank(HighScoresTransitionPalettes9)
dwb HighScoresTransitionPalettes10, Bank(HighScoresTransitionPalettes10)
dwb HighScoresTransitionPalettes11, Bank(HighScoresTransitionPalettes11)
dwb HighScoresTransitionPalettes12, Bank(HighScoresTransitionPalettes12)
dwb HighScoresTransitionPalettes13, Bank(HighScoresTransitionPalettes13)
dwb HighScoresTransitionPalettes14, Bank(HighScoresTransitionPalettes14)
dwb HighScoresTransitionPalettes15, Bank(HighScoresTransitionPalettes15)
dwb HighScoresTransitionPalettes16, Bank(HighScoresTransitionPalettes16)
Func_d68a: ; 0xd68a
push bc
ld hl, wPokedexFlags
ld bc, (NUM_POKEMON << 8)
.asm_d691
bit 1, [hl]
jr z, .asm_d696
inc c
.asm_d696
inc hl
dec b
jr nz, .asm_d691
ld a, c
pop bc
cp NUM_POKEMON
ret nz
ld hl, vBGMap
add hl, bc
call ShowDexCompletionCrown
ld hl, vBGWin
add hl, bc
; fall through
ShowDexCompletionCrown: ; 0xd6aa
ld a, $56
call PutTileInVRAM
inc hl
ld a, $57
call PutTileInVRAM
ret
Func_d6b6: ; 0xd6b6
ld hl, wPokedexFlags
ld bc, (NUM_POKEMON << 8)
.asm_d6bc
bit 1, [hl]
jr z, .asm_d6c1
inc c
.asm_d6c1
inc hl
dec b
jr nz, .asm_d6bc
ld a, c
cp NUM_POKEMON
ret nz
ld hl, wSendHighScoresTopBarTilemap + $9
ld a, $56 ; a crown is shown when Dex is completed
ld [hli], a
ld a, $57
ld [hli], a
ret