From f2f69fdfe13dd92ec986b238e976165ea4c9c8bb Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Mon, 19 Jun 2017 14:25:38 -0700 Subject: Move titlescreen routines into their own file --- engine/titlescreen.asm | 468 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 468 insertions(+) create mode 100755 engine/titlescreen.asm (limited to 'engine') diff --git a/engine/titlescreen.asm b/engine/titlescreen.asm new file mode 100755 index 0000000..63c8ce8 --- /dev/null +++ b/engine/titlescreen.asm @@ -0,0 +1,468 @@ +HandleTitlescreen: ; 0xc000 + ld a, [wScreenState] + rst JumpTable ; calls JumpToFuncInTable +TitlescreenFunctions: ; 0xc004 + dw FadeInTitlescreen + dw TitlescreenLoop ; titlescreen loop + dw Func_c10e ; previously saved game menu + dw Func_c1cb ; game start, pokedex, option + dw GoToHighScoresFromTitlescreen ; go to high scores + +FadeInTitlescreen: ; 0xc00e + ld a, $43 + ld [hLCDC], a + ld a, $e4 + ld [wBGP], a + ld a, $d2 + ld [wOBP0], a + ld a, $e1 + ld [wOBP1], a + xor a + ld [hSCX], a + ld [hSCY], a + ld hl, TitlescreenFadeInGfxPointers + ld a, [hGameBoyColorFlag] + call LoadVideoData + ld a, $1 + ld [wTitleScreenGameStartCursorSelection], a + call ClearOAMBuffer + ld a, $2 + ld [wTitleScreenPokeballAnimationCounter], a + call HandleTitlescreenAnimations + call Func_b66 + ld a, $11 + call SetSongBank + ld de, $0004 + call PlaySong + call Func_588 + call Func_bbe ; this does the fading + ld hl, wScreenState + inc [hl] + ret + +TitlescreenFadeInGfxPointers: ; 0xc057 + dw TitlescreenFadeInGfx_GameBoy + dw TitlescreenFadeInGfx_GameBoyColor + +TitlescreenFadeInGfx_GameBoy: ; 0xc05b + VIDEO_DATA_TILES TitlescreenGfx, vTilesOB, $1800 + VIDEO_DATA_TILEMAP TitlescreenTilemap, vBGMap, $240 + db $FF, $FF ; terminators + +TitlescreenFadeInGfx_GameBoyColor: ; 0xc06b + VIDEO_DATA_TILES TitlescreenFadeInGfx, vTilesOB, $1800 + VIDEO_DATA_TILEMAP TitlescreenTilemap, vBGMap, $240 + VIDEO_DATA_BGATTR TitlescreenBGAttributes, vBGMap, $240 + VIDEO_DATA_PALETTES TitlescreenPalettes, $80 + db $FF, $FF ; terminators + +TitlescreenLoop: ; 0xc089 + call Func_c0ee + call HandleTitlescreenAnimations + ld a, [hNewlyPressedButtons] + bit BIT_A_BUTTON, a ; was A button pressed? + jr z, .AButtonNotPressed + ld a, [wTitleScreenCursorSelection] + and a + jr nz, .asm_c0d3 + ; player chose "Game Start" + ld a, [wd7c2] ; if this is non-zero, the main menu will prompt for "continue or new game?". + and a + jr z, .noPreviouslySavedGame + lb de, $00, $01 + call PlaySoundEffect + xor a + ld [wd910], a + ld a, $2 + ld [wd911], a + ld a, $1 + ld [wTitleScreenGameStartCursorSelection], a + ld hl, wScreenState + inc [hl] + ret + +.noPreviouslySavedGame + ld de, $0000 + call PlaySong + rst AdvanceFrame + lb de, $00, $27 + call PlaySoundEffect + ld bc, $0037 + call AdvanceFrames + ld a, $3 + ld [wScreenState], a + ret + +.asm_c0d3 + lb de, $00, $01 + call PlaySoundEffect + ld a, $3 + ld [wScreenState], a + ret + +.AButtonNotPressed + bit BIT_B_BUTTON, a ; was B button pressed? + ret z + lb de, $00, $01 + call PlaySoundEffect + ld a, $4 + ld [wScreenState], a + ret + +Func_c0ee: ; 0xc0ee + ld hl, wTitleScreenCursorSelection + ld c, $2 + call Func_c1fc + ret + +HandleTitlescreenAnimations: ; 0xc0f7 + ld a, [hGameBoyColorFlag] + and a + jr z, .asm_c104 + ld bc, $2040 + ld a, $62 ; seemingly-unused OAM data for titlescreen. It's just blank tiles. + call LoadOAMData +.asm_c104 + call Func_c21d ; does nothing... + call HandleTitlescreenPikachuBlinkingAnimation + call HandleTitlescreenPokeballAnimation + ret + +Func_c10e: ; 0xc10e + call Func_c1a2 + call Func_c1b1 + ld a, [wd910] + cp $6 + ret nz + ld a, [hNewlyPressedButtons] + bit 0, a + jr z, .asm_c17c + ld de, $0000 + call PlaySong + rst AdvanceFrame + lb de, $00, $27 + call PlaySoundEffect + ld bc, $0041 + call AdvanceFrames + ld a, [wTitleScreenGameStartCursorSelection] + and a + jr z, .asm_c177 + call Func_cb5 + call Func_576 + ld a, [wd7c2] + and a + jr z, .asm_c173 + ld hl, sSaveGame + ld de, wPartyMons + ld bc, $04c3 + call LoadSavedData + jr nc, .asm_c173 + xor a + ld [wd7c2], a + ld hl, wPartyMons + ld de, sSaveGame + ld bc, $04c3 + call SaveData + ld a, $1 + ld [wd7c1], a + ld a, SCREEN_PINBALL_GAME + ld [wCurrentScreen], a + ld a, $0 + ld [wScreenState], a + ret + +.asm_c173 + xor a + ld [wd7c1], a +.asm_c177 + ld hl, wScreenState + inc [hl] + ret + +.asm_c17c + bit 1, a + ret z + lb de, $00, $01 + call PlaySoundEffect + ld a, $8 + ld [wd910], a + ld a, $2 + ld [wd911], a +.asm_c18f + call CleanOAMBuffer + rst AdvanceFrame + call Func_c1b1 + ld a, [wd910] + cp $e + jr nz, .asm_c18f + ld hl, wScreenState + dec [hl] + ret + +Func_c1a2: ; 0xc1a2 + ld a, [wd910] + cp $6 + ret nz + ld hl, wTitleScreenGameStartCursorSelection + ld c, $1 + call Func_c1fc + ret + +Func_c1b1: ; 0xc1b1 + call Func_c2df + ld a, [hGameBoyColorFlag] + and a + jr z, .asm_c1c1 + ld bc, $2040 + ld a, $62 + call LoadOAMData +.asm_c1c1 + call Func_c21d + call HandleTitlescreenPikachuBlinkingAnimation + call HandleTitlescreenPokeballAnimation + ret + +Func_c1cb: ; 0c1cb + call Func_cb5 + call Func_576 + ld a, [wTitleScreenCursorSelection] + ld c, a + ld b, $0 + ld hl, Data_c1e4 + add hl, bc + ld a, [hl] + ld [wCurrentScreen], a + xor a + ld [wScreenState], a + ret + +Data_c1e4: ; 0xc1e4 + db SCREEN_FIELD_SELECT + db SCREEN_POKEDEX + db SCREEN_OPTIONS + +GoToHighScoresFromTitlescreen: ; 0xc1e7 + call Func_cb5 + call Func_576 + ld a, SCREEN_HIGH_SCORES + ld [wCurrentScreen], a + ld a, $1 + ld [wScreenState], a + xor a + ld [wda7f], a + ret + +Func_c1fc: ; 0xc1fc + ld a, [hPressedButtons] + ld b, a + ld a, [hl] + bit 6, b + jr z, .asm_c20f + and a + ret z + dec a + ld [hl], a + lb de, $00, $03 + call PlaySoundEffect + ret + +.asm_c20f + bit 7, b + ret z + cp c + ret z + inc a + ld [hl], a + lb de, $00, $03 + call PlaySoundEffect + ret + +Func_c21d: ; 0xc21d +; World's greatest function. + ret + +HandleTitlescreenPikachuBlinkingAnimation: ; 0xc21e + ld a, [wTitleScreenBlinkAnimationFrame] + sla a + ld c, a + ld b, $0 + ld hl, TitleScreenBlinkAnimation + add hl, bc + lb bc, $38, $10 + ld a, [hl] + cp $5a ; blink animation frame 1 OAM id + call nz, LoadOAMData + ld a, [wTitleScreenBlinkAnimationCounter] + dec a + jr nz, .done + inc hl + inc hl ; hl points to next frame in TitleScreenBlinkAnimation array + ld a, [hl] + and a ; reached the end of the animation frames? + jr z, .saveAnimationFrame + ld a, [wTitleScreenBlinkAnimationFrame] + inc a +.saveAnimationFrame + ld [wTitleScreenBlinkAnimationFrame], a + sla a + ld c, a + ld b, $0 + ld hl, (TitleScreenBlinkAnimation + 1) + add hl, bc + ld a, [hl] ; a contains second byte in the current animation frame data + cp $3c ; is this a long-duration animation frame? + jr c, .done + ld c, a + call GenRandom + and $1f + add c +.done + ld [wTitleScreenBlinkAnimationCounter], a + ret + +TitleScreenBlinkAnimation: ; 0xc25f +; Array of animation frames. The animation is looped when it finishes. +; first byte = OAM data id to load +; second byte = number of frames to show this animation. + db $5a, $c8 + db $5b, $04 + db $5c, $04 + db $5b, $04 + db $5a, $3c + db $5b, $03 + db $5c, $03 + db $5b, $03 + db $5a, $03 + db $5b, $03 + db $5c, $03 + db $5b, $03 + db $00 ; terminator + +HandleTitlescreenPokeballAnimation: ; 0xc278 + ld a, [wTitleScreenCursorSelection] + sla a + ld c, a + ld b, $0 + ld hl, TitleScreenPokeballCoordOffsets + add hl, bc + ld a, [hli] + ld c, a + ld a, [hli] + ld b, a + ld e, $0 + ld a, [wScreenState] ; TODO: I think this is the "titlescreen state" byte. + cp $1 + jr nz, .loadOAM ; skip getting the correct animation frame + ld a, [wTitleScreenBouncingBallAnimationFrame] + sla a + ld e, a +.loadOAM + ld d, $0 + ld hl, TitleScreenPokeballAnimation + add hl, de + ld a, [hl] ; a contains OAM id + call LoadOAMData + ld a, [wTitleScreenPokeballAnimationCounter] + dec a + jr nz, .done + ld a, [wTitleScreenBouncingBallAnimationFrame] + sla a + ld c, a + ld b, $0 + ld hl, (TitleScreenPokeballAnimation + 2) ; first frame of actual animation + add hl, bc + ld a, [hl] + and a + jr z, .saveAnimationFrame ; end of list? + ld a, [wTitleScreenBouncingBallAnimationFrame] + inc a +.saveAnimationFrame + ld [wTitleScreenBouncingBallAnimationFrame], a + sla a + ld c, a + ld b, $0 + ld hl, (TitleScreenPokeballAnimation + 1) ; first duration + add hl, bc + ld a, [hl] +.done + ld [wTitleScreenPokeballAnimationCounter], a + ret + +TitleScreenPokeballAnimation: ; 0xc2cc +; first byte = OAM id +; second byte = animation frame duration + db $5D, $02 + db $5E, $06 + db $5F, $02 + db $60, $04 + db $61, $06 + db $5F, $04 + db $00 ; terminator + +TitleScreenPokeballCoordOffsets: ; 0xc2d9 + db $67, $15 + db $73, $15 + db $7F, $15 + +Func_c2df: ; 0xc2df + ld bc, $4446 ; pixel offsets, not data + ld a, [wd910] + cp $6 + jr nz, .asm_c2f0 + ld a, [wTitleScreenGameStartCursorSelection] + add $58 + jr .asm_c2fd + +.asm_c2f0 + ld a, [wd910] + sla a + ld e, a + ld d, $0 + ld hl, Data_c32b + add hl, de + ld a, [hl] +.asm_c2fd + call LoadOAMData + ld a, [wd911] + dec a + jr nz, .asm_c327 + ld a, [wd910] + sla a + ld c, a + ld b, $0 + ld hl, Data_c32b + 2 + add hl, bc + ld a, [hl] + and a + ld a, [wd910] + jr z, .asm_c31d + inc a + ld [wd910], a +.asm_c31d + sla a + ld c, a + ld b, $0 + ld hl, Data_c32b + 1 + add hl, bc + ld a, [hl] +.asm_c327 + ld [wd911], a + ret + +Data_c32b: ; 0xc32b + db $52, $02 + db $53, $02 + db $54, $02 + db $55, $02 + db $56, $02 + db $57, $02 + db $57, $02 + db $00, $00 + db $57, $02 + db $56, $02 + db $55, $02 + db $54, $02 + db $53, $02 + db $52, $02 + db $52, $02 + db $00 -- cgit v1.2.3