diff options
author | Marcus Huderle <huderlem@gmail.com> | 2017-06-19 14:25:38 -0700 |
---|---|---|
committer | Marcus Huderle <huderlem@gmail.com> | 2017-06-19 14:25:38 -0700 |
commit | f2f69fdfe13dd92ec986b238e976165ea4c9c8bb (patch) | |
tree | 3cd0fa3a58fc4c33cefb2d038cb5ccfad70bd7d9 /engine | |
parent | dab06603a1c4e647eac9c75a62782e4b9a4dc170 (diff) |
Move titlescreen routines into their own file
Diffstat (limited to 'engine')
-rwxr-xr-x | engine/titlescreen.asm | 468 |
1 files changed, 468 insertions, 0 deletions
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
|