summaryrefslogtreecommitdiff
path: root/engine/menus/intro_menu.asm
diff options
context:
space:
mode:
Diffstat (limited to 'engine/menus/intro_menu.asm')
-rw-r--r--engine/menus/intro_menu.asm1133
1 files changed, 1133 insertions, 0 deletions
diff --git a/engine/menus/intro_menu.asm b/engine/menus/intro_menu.asm
new file mode 100644
index 00000000..c85b56f6
--- /dev/null
+++ b/engine/menus/intro_menu.asm
@@ -0,0 +1,1133 @@
+MainMenu_NewGame:
+NewGame:
+ xor a
+ ld [wDebugFlags], a
+ call ResetWRAM
+ call ClearTilemapEtc
+ call OakSpeech
+ call InitializeWorld
+
+ ld a, SPAWN_HOME
+ ld [wDefaultSpawnpoint], a
+
+ ld a, MAPSETUP_WARP
+ ldh [hMapEntryMethod], a
+ jp FinishContinueFunction
+
+ResetWRAM:
+ xor a
+ ldh [hBGMapMode], a
+ call _ResetWRAM
+ ret
+
+_ResetWRAM:
+ ld hl, wVirtualOAM
+ ld bc, wOptions - wVirtualOAM
+ xor a
+ call ByteFill
+
+ ld hl, wGameData
+ ld bc, wGameDataEnd - wGameData
+ xor a
+ call ByteFill
+
+ ldh a, [rLY]
+ ldh [hUnusedBackup], a
+ call DelayFrame
+ ldh a, [hRandomSub]
+ ld [wPlayerID], a
+
+ ldh a, [rLY]
+ ldh [hUnusedBackup], a
+ call DelayFrame
+ ldh a, [hRandomAdd]
+ ld [wPlayerID + 1], a
+
+ ld hl, wPartyCount
+ call .InitList
+
+ xor a
+ ld [wCurBox], a
+ ld [wSavedAtLeastOnce], a
+
+ call SetDefaultBoxNames
+
+ ld a, BANK(sBoxCount)
+ call OpenSRAM
+ ld hl, sBoxCount
+ call .InitList
+ call CloseSRAM
+
+ ld hl, wNumItems
+ call .InitList
+
+ ld hl, wNumKeyItems
+ call .InitList
+
+ ld hl, wNumBalls
+ call .InitList
+
+ ld hl, wNumPCItems
+ call .InitList
+
+ xor a
+ ld [wRoamMon1Species], a
+ ld [wRoamMon2Species], a
+ ld [wRoamMon3Species], a
+ ld a, -1
+ ld [wRoamMon1MapGroup], a
+ ld [wRoamMon2MapGroup], a
+ ld [wRoamMon3MapGroup], a
+ ld [wRoamMon1MapNumber], a
+ ld [wRoamMon2MapNumber], a
+ ld [wRoamMon3MapNumber], a
+
+ ld a, BANK(sMysteryGiftItem)
+ call OpenSRAM
+ ld hl, sMysteryGiftItem
+ xor a
+ ld [hli], a
+ dec a
+ ld [hl], a
+ call CloseSRAM
+
+ call LoadOrRegenerateLuckyIDNumber
+ call InitializeMagikarpHouse
+
+ xor a
+ ld [wMonType], a
+
+ ld [wJohtoBadges], a
+ ld [wKantoBadges], a
+
+ ld [wCoins], a
+ ld [wCoins + 1], a
+
+if START_MONEY >= $10000
+ ld a, HIGH(START_MONEY >> 8)
+endc
+ ld [wMoney], a
+ ld a, HIGH(START_MONEY) ; mid
+ ld [wMoney + 1], a
+ ld a, LOW(START_MONEY)
+ ld [wMoney + 2], a
+
+ xor a
+ ld [wWhichMomItem], a
+
+ ld hl, wMomItemTriggerBalance
+ ld [hl], HIGH(MOM_MONEY >> 8)
+ inc hl
+ ld [hl], HIGH(MOM_MONEY) ; mid
+ inc hl
+ ld [hl], LOW(MOM_MONEY)
+
+ call InitializeNPCNames
+
+ farcall InitDecorations
+
+ farcall DeletePartyMonMail
+
+ call ResetGameTime
+ ret
+
+.InitList:
+; Loads 0 in the count and -1 in the first item or mon slot.
+ xor a
+ ld [hli], a
+ dec a
+ ld [hl], a
+ ret
+
+SetDefaultBoxNames:
+ ld hl, wBoxNames
+ ld c, 0
+.loop
+ push hl
+ ld de, .Box
+ call CopyName2
+ dec hl
+ ld a, c
+ inc a
+ cp 10
+ jr c, .less
+ sub 10
+ ld [hl], "1"
+ inc hl
+
+.less
+ add "0"
+ ld [hli], a
+ ld [hl], "@"
+ pop hl
+ ld de, 9
+ add hl, de
+ inc c
+ ld a, c
+ cp NUM_BOXES
+ jr c, .loop
+ ret
+
+.Box:
+ db "BOX@"
+
+InitializeMagikarpHouse:
+ ld hl, wBestMagikarpLengthFeet
+ ld a, $3
+ ld [hli], a
+ ld a, $6
+ ld [hli], a
+ ld de, .Ralph
+ call CopyName2
+ ret
+
+.Ralph:
+ db "RALPH@"
+
+InitializeNPCNames:
+ ld hl, .Rival
+ ld de, wRivalName
+ call .Copy
+
+ ld hl, .Mom
+ ld de, wMomsName
+ call .Copy
+
+ ld hl, .Red
+ ld de, wRedsName
+ call .Copy
+
+ ld hl, .Green
+ ld de, wGreensName
+
+.Copy:
+ ld bc, NAME_LENGTH
+ call CopyBytes
+ ret
+
+.Rival: db "???@"
+.Red: db "RED@"
+.Green: db "GREEN@"
+.Mom: db "MOM@"
+
+InitializeWorld:
+ call ShrinkPlayer
+ farcall SpawnPlayer
+ farcall _InitializeStartDay
+ ret
+
+LoadOrRegenerateLuckyIDNumber:
+ ld a, BANK(sLuckyIDNumber)
+ call OpenSRAM
+ ld a, [wCurDay]
+ inc a
+ ld b, a
+ ld a, [sLuckyNumberDay]
+ cp b
+ ld a, [sLuckyIDNumber + 1]
+ ld c, a
+ ld a, [sLuckyIDNumber]
+ jr z, .skip
+ ld a, b
+ ld [sLuckyNumberDay], a
+ call Random
+ ld c, a
+ call Random
+
+.skip
+ ld [wLuckyIDNumber], a
+ ld [sLuckyIDNumber], a
+ ld a, c
+ ld [wLuckyIDNumber + 1], a
+ ld [sLuckyIDNumber + 1], a
+ jp CloseSRAM
+
+MainMenu_Continue:
+Continue:
+ farcall TryLoadSaveFile
+ jr c, .FailToLoad
+ call LoadStandardMenuHeader
+ call DisplaySaveInfoOnContinue
+ ld a, $1
+ ldh [hBGMapMode], a
+ ld c, 20
+ call DelayFrames
+ call ConfirmContinue
+ jr nc, .Check1Pass
+ call CloseWindow
+ jr .FailToLoad
+
+.Check1Pass:
+ call Continue_CheckRTC_RestartClock
+ jr nc, .Check2Pass
+ call CloseWindow
+ jr .FailToLoad
+
+.Check2Pass:
+ ld a, $8
+ ld [wMusicFade], a
+ ld a, LOW(MUSIC_NONE)
+ ld [wMusicFadeID], a
+ ld a, HIGH(MUSIC_NONE)
+ ld [wMusicFadeID + 1], a
+ call ClearBGPalettes
+ call CloseWindow
+ call ClearTilemap
+ ld c, 20
+ call DelayFrames
+ farcall JumpRoamMons
+ farcall MysteryGift_CopyReceivedDecosToPC ; Mystery Gift
+ farcall ClockContinue
+ ld a, [wSpawnAfterChampion]
+ cp SPAWN_LANCE
+ jr z, .SpawnAfterE4
+ ld a, MAPSETUP_CONTINUE
+ ldh [hMapEntryMethod], a
+ jp FinishContinueFunction
+
+.FailToLoad:
+ ret
+
+.SpawnAfterE4:
+ ld a, SPAWN_NEW_BARK
+ ld [wDefaultSpawnpoint], a
+ call PostCreditsSpawn
+ jp FinishContinueFunction
+
+SpawnAfterRed:
+ ld a, SPAWN_MT_SILVER
+ ld [wDefaultSpawnpoint], a
+
+PostCreditsSpawn:
+ xor a
+ ld [wSpawnAfterChampion], a
+ ld a, MAPSETUP_WARP
+ ldh [hMapEntryMethod], a
+ ret
+
+ConfirmContinue:
+.loop
+ call DelayFrame
+ call GetJoypad
+ ld hl, hJoyPressed
+ bit A_BUTTON_F, [hl]
+ jr nz, .PressA
+ bit B_BUTTON_F, [hl]
+ jr z, .loop
+ scf
+ ret
+
+.PressA:
+ ret
+
+Continue_CheckRTC_RestartClock:
+ call CheckRTCStatus
+ and %10000000 ; Day count exceeded 16383
+ jr z, .pass
+ farcall RestartClock
+ ld a, c
+ and a
+ jr z, .pass
+ scf
+ ret
+
+.pass
+ xor a
+ ret
+
+FinishContinueFunction:
+.loop
+ xor a
+ ld [wDontPlayMapMusicOnReload], a
+ ld hl, wGameTimerPause
+ set GAMETIMERPAUSE_TIMER_PAUSED_F, [hl]
+ farcall OverworldLoop
+ ld a, [wSpawnAfterChampion]
+ cp SPAWN_RED
+ jr z, .AfterRed
+ jp Reset
+
+.AfterRed:
+ call SpawnAfterRed
+ jr .loop
+
+DisplaySaveInfoOnContinue:
+ call CheckRTCStatus
+ and %10000000
+ jr z, .clock_ok
+ lb de, 4, 8
+ call DisplayContinueDataWithRTCError
+ ret
+
+.clock_ok
+ lb de, 4, 8
+ call DisplayNormalContinueData
+ ret
+
+DisplayNormalContinueData:
+ call Continue_LoadMenuHeader
+ call Continue_DisplayBadgesDex
+ call Continue_PrintGameTime
+ call LoadFontsExtra
+ call UpdateSprites
+ ret
+
+DisplayContinueDataWithRTCError:
+ call Continue_LoadMenuHeader
+ call Continue_DisplayBadgesDex
+ call Continue_UnknownGameTime
+ call LoadFontsExtra
+ call UpdateSprites
+ ret
+
+Continue_LoadMenuHeader:
+ xor a
+ ldh [hBGMapMode], a
+ ld hl, .MenuHeader_Dex
+ ld a, [wStatusFlags]
+ bit STATUSFLAGS_POKEDEX_F, a
+ jr nz, .show_menu
+ ld hl, .MenuHeader_NoDex
+
+.show_menu
+ call _OffsetMenuHeader
+ call MenuBox
+ call PlaceVerticalMenuItems
+ ret
+
+.MenuHeader_Dex:
+ db MENU_BACKUP_TILES ; flags
+ menu_coords 0, 0, 15, 9
+ dw .MenuData_Dex
+ db 1 ; default option
+
+.MenuData_Dex:
+ db 0 ; flags
+ db 4 ; items
+ db "PLAYER <PLAYER>@"
+ db "BADGES@"
+ db "#DEX@"
+ db "TIME@"
+
+.MenuHeader_NoDex:
+ db MENU_BACKUP_TILES ; flags
+ menu_coords 0, 0, 15, 9
+ dw .MenuData_NoDex
+ db 1 ; default option
+
+.MenuData_NoDex:
+ db 0 ; flags
+ db 4 ; items
+ db "PLAYER <PLAYER>@"
+ db "BADGES@"
+ db " @"
+ db "TIME@"
+
+Continue_DisplayBadgesDex:
+ call MenuBoxCoord2Tile
+ push hl
+ decoord 13, 4, 0
+ add hl, de
+ call Continue_DisplayBadgeCount
+ pop hl
+ push hl
+ decoord 12, 6, 0
+ add hl, de
+ call Continue_DisplayPokedexNumCaught
+ pop hl
+ ret
+
+Continue_PrintGameTime:
+ decoord 9, 8, 0
+ add hl, de
+ call Continue_DisplayGameTime
+ ret
+
+Continue_UnknownGameTime:
+ decoord 9, 8, 0
+ add hl, de
+ ld de, .three_question_marks
+ call PlaceString
+ ret
+
+.three_question_marks
+ db " ???@"
+
+Continue_DisplayBadgeCount:
+ push hl
+ ld hl, wJohtoBadges
+ ld b, 2
+ call CountSetBits
+ pop hl
+ ld de, wNumSetBits
+ lb bc, 1, 2
+ jp PrintNum
+
+Continue_DisplayPokedexNumCaught:
+ ld a, [wStatusFlags]
+ bit STATUSFLAGS_POKEDEX_F, a
+ ret z
+ push hl
+ ld hl, wPokedexCaught
+if NUM_POKEMON % 8
+ ld b, NUM_POKEMON / 8 + 1
+else
+ ld b, NUM_POKEMON / 8
+endc
+ call CountSetBits
+ pop hl
+ ld de, wNumSetBits
+ lb bc, 1, 3
+ jp PrintNum
+
+Continue_DisplayGameTime:
+ ld de, wGameTimeHours
+ lb bc, 2, 3
+ call PrintNum
+ ld [hl], "<COLON>"
+ inc hl
+ ld de, wGameTimeMinutes
+ lb bc, PRINTNUM_LEADINGZEROS | 1, 2
+ jp PrintNum
+
+OakSpeech:
+ farcall InitClock
+ call RotateFourPalettesLeft
+ call ClearTilemap
+
+ ld de, MUSIC_ROUTE_30
+ call PlayMusic
+
+ call RotateFourPalettesRight
+ call RotateThreePalettesRight
+ xor a
+ ld [wCurPartySpecies], a
+ ld a, POKEMON_PROF
+ ld [wTrainerClass], a
+ call Intro_PrepTrainerPic
+
+ ld b, SCGB_TRAINER_OR_MON_FRONTPIC_PALS
+ call GetSGBLayout
+ call Intro_RotatePalettesLeftFrontpic
+
+ ld hl, OakText1
+ call PrintText
+ call RotateThreePalettesRight
+ call ClearTilemap
+
+ ld a, MARILL
+ ld [wCurSpecies], a
+ ld [wCurPartySpecies], a
+ call GetBaseData
+
+ hlcoord 6, 4
+ hlcoord 6, 4 ; TriHard
+ call PrepMonFrontpic
+
+ xor a
+ ld [wTempMonDVs], a
+ ld [wTempMonDVs + 1], a
+
+ ld b, SCGB_TRAINER_OR_MON_FRONTPIC_PALS
+ call GetSGBLayout
+ call Intro_WipeInFrontpic
+
+ ld hl, OakText2
+ call PrintText
+ ld hl, OakText4
+ call PrintText
+ call RotateThreePalettesRight
+ call ClearTilemap
+
+ xor a
+ ld [wCurPartySpecies], a
+ ld a, POKEMON_PROF
+ ld [wTrainerClass], a
+ call Intro_PrepTrainerPic
+
+ ld b, SCGB_TRAINER_OR_MON_FRONTPIC_PALS
+ call GetSGBLayout
+ call Intro_RotatePalettesLeftFrontpic
+
+ ld hl, OakText5
+ call PrintText
+ call RotateThreePalettesRight
+ call ClearTilemap
+
+ xor a
+ ld [wCurPartySpecies], a
+ ld a, CAL
+ ld [wTrainerClass], a
+ call Intro_PrepTrainerPic
+
+ ld b, SCGB_TRAINER_OR_MON_FRONTPIC_PALS
+ call GetSGBLayout
+ call Intro_RotatePalettesLeftFrontpic
+
+ ld hl, OakText6
+ call PrintText
+ call NamePlayer
+ ld hl, OakText7
+ call PrintText
+ ret
+
+OakText1:
+ text_far _OakText1
+ text_end
+
+OakText2:
+ text_far _OakText2
+ text_asm
+ ld a, MARILL
+ call PlayMonCry
+ call WaitSFX
+ ld hl, OakText3
+ ret
+
+OakText3:
+ text_far _OakText3
+ text_end
+
+OakText4:
+ text_far _OakText4
+ text_end
+
+OakText5:
+ text_far _OakText5
+ text_end
+
+OakText6:
+ text_far _OakText6
+ text_end
+
+OakText7:
+ text_far _OakText7
+ text_end
+
+NamePlayer:
+ call MovePlayerPicRight
+ ld hl, NameMenuHeader
+ call ShowPlayerNamingChoices
+ ld a, [wMenuCursorY]
+ dec a
+ jr z, .NewName
+ ld de, wPlayerName
+ call StorePlayerName
+ farcall ApplyMonOrTrainerPals
+ call MovePlayerPicLeft
+ ret
+
+.NewName:
+ ld b, NAME_PLAYER
+ ld de, wPlayerName
+ farcall NamingScreen
+
+ call RotateThreePalettesRight
+ call ClearTilemap
+
+ call LoadFontsExtra
+ call WaitBGMap
+
+ xor a
+ ld [wCurPartySpecies], a
+ ld a, CAL
+ ld [wTrainerClass], a
+ call Intro_PrepTrainerPic
+
+ ld b, SCGB_TRAINER_OR_MON_FRONTPIC_PALS
+ call GetSGBLayout
+ call RotateThreePalettesLeft
+
+ ld hl, wPlayerName
+ ld de, PlayerNameArray
+ call InitName
+ ret
+
+INCLUDE "data/player_names.asm"
+
+ShowPlayerNamingChoices:
+ call LoadMenuHeader
+ call VerticalMenu
+ ld a, [wMenuCursorY]
+ dec a
+ call CopyNameFromMenu
+ call CloseWindow
+ ret
+
+StorePlayerName:
+ ld hl, wStringBuffer2
+ ld bc, NAME_LENGTH
+ call CopyBytes
+ ret
+
+ShrinkPlayer:
+ ldh a, [hROMBank]
+ push af
+
+ ld a, 32 ; fade time
+ ld [wMusicFade], a
+ ld de, MUSIC_NONE
+ ld a, e
+ ld [wMusicFadeID], a
+ ld a, d
+ ld [wMusicFadeID + 1], a
+
+ ld de, SFX_ESCAPE_ROPE
+ call PlaySFX
+ pop af
+ rst Bankswitch
+
+ ld c, 8
+ call DelayFrames
+
+ ld hl, Shrink1Pic
+ ld b, BANK(Shrink1Pic)
+ call ShrinkFrame
+
+ ld c, 8
+ call DelayFrames
+
+ ld hl, Shrink2Pic
+ ld b, BANK(Shrink2Pic)
+ call ShrinkFrame
+
+ ld c, 8
+ call DelayFrames
+
+ hlcoord 6, 5
+ ld b, 7
+ ld c, 7
+ call ClearBox
+
+ ld c, 3
+ call DelayFrames
+
+ call Intro_PlaceChrisSprite
+ call LoadFontsExtra
+
+ ld c, 50
+ call DelayFrames
+
+ call RotateThreePalettesRight
+ call ClearTilemap
+ ret
+
+MovePlayerPicRight:
+ hlcoord 6, 4
+ ld de, $1
+ jr MovePlayerPic
+
+MovePlayerPicLeft:
+ hlcoord 13, 4
+ ld de, -1
+MovePlayerPic:
+ ld c, $8
+.loop
+ push bc
+ push hl
+ push de
+ xor a
+ ldh [hBGMapMode], a
+ lb bc, 7, 7
+ predef PlaceGraphic
+ xor a
+ ldh [hBGMapThird], a
+ call WaitBGMap
+ call DelayFrame
+ pop de
+ pop hl
+ add hl, de
+ pop bc
+ dec c
+ jr nz, .loop
+ ret
+
+Intro_RotatePalettesLeftFrontpic:
+ ld hl, IntroFadePalettes
+ ld b, IntroFadePalettes.End - IntroFadePalettes
+.loop
+ ld a, [hli]
+ call DmgToCgbBGPals
+ ld c, 10
+ call DelayFrames
+ dec b
+ jr nz, .loop
+ ret
+
+IntroFadePalettes:
+ dc 1, 1, 1, 0
+ dc 2, 2, 2, 0
+ dc 3, 3, 3, 0
+ dc 3, 3, 2, 0
+ dc 3, 3, 1, 0
+ dc 3, 2, 1, 0
+.End
+
+Intro_WipeInFrontpic:
+ ld a, $77
+ ldh [hWX], a
+ call DelayFrame
+ ld a, %11100100
+ call DmgToCgbBGPals
+.loop
+ call DelayFrame
+ ldh a, [hWX]
+ sub $8
+ cp -1
+ ret z
+ ldh [hWX], a
+ jr .loop
+
+Intro_PrepTrainerPic:
+ ld de, vTiles2
+ farcall GetTrainerPic
+ xor a
+ ldh [hGraphicStartTile], a
+ hlcoord 6, 4
+ lb bc, 7, 7
+ predef PlaceGraphic
+ ret
+
+ShrinkFrame:
+ ld de, vTiles2
+ ld c, 7 * 7
+ predef DecompressGet2bpp
+ xor a
+ ldh [hGraphicStartTile], a
+ hlcoord 6, 4
+ lb bc, 7, 7
+ predef PlaceGraphic
+ ret
+
+Intro_PlaceChrisSprite:
+ ld de, ChrisSpriteGFX
+ lb bc, BANK(ChrisSpriteGFX), 12
+ ld hl, vTiles0
+ call Request2bpp
+
+ ld hl, wVirtualOAMSprite00
+ ld de, .sprites
+ ld a, [de]
+ inc de
+
+ ld c, a
+.loop
+ ld a, [de]
+ inc de
+ ld [hli], a ; y
+ ld a, [de]
+ inc de
+ ld [hli], a ; x
+ ld a, [de]
+ inc de
+ ld [hli], a ; tile id
+ xor a ; PAL_OW_RED
+ ld [hli], a
+ dec c
+ jr nz, .loop
+ ret
+
+.sprites
+ db 4
+ ; y pxl, x pxl, tile offset
+ db 9 * 8 + 4, 9 * 8, 0
+ db 9 * 8 + 4, 10 * 8, 1
+ db 10 * 8 + 4, 9 * 8, 2
+ db 10 * 8 + 4, 10 * 8, 3
+
+IntroSequence:
+ callfar Copyright_GFPresents
+ jr c, StartTitleScreen
+ callfar GoldSilverIntro
+
+ ; fallthrough
+
+StartTitleScreen:
+ call TitleScreen
+ call DelayFrame
+.loop
+ call RunTitleScreen
+ jr nc, .loop
+
+ call ClearSprites
+ call ClearBGPalettes
+
+ ld hl, rLCDC
+ res rLCDC_SPRITE_SIZE, [hl] ; 8x8
+ call ClearTilemap
+ xor a
+ ldh [hLCDCPointer], a
+ ld b, SCGB_DIPLOMA
+ call GetSGBLayout
+ call UpdateTimePals
+ ld a, [wIntroSceneFrameCounter]
+ cp $5
+ jr c, .ok
+ xor a
+.ok
+ ld e, a
+ ld d, 0
+ ld hl, .dw
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp hl
+
+.dw
+ dw MainMenu
+ dw DeleteSaveData
+ dw IntroSequence
+ dw IntroSequence
+ dw ResetClock
+
+INCLUDE "engine/movie/title.asm"
+
+RunTitleScreen:
+ call Function63fe
+ ld a, [wJumptableIndex]
+ bit 7, a
+ jr nz, .done_title
+ call TitleScreenScene
+ ld a, $1
+ ldh [hOAMUpdate], a
+ farcall PlaySpriteAnimations
+ xor a
+ ldh [hOAMUpdate], a
+ call Function64b1
+ call DelayFrame
+ and a
+ ret
+
+.done_title
+ scf
+ ret
+
+Function63fe:
+IF DEF(_GOLD)
+ ldh a, [hVBlankCounter]
+ and $7
+ ret nz
+ENDC
+ ld hl, wLYOverrides + $5f
+ ld a, [hl]
+ dec a
+ ld bc, 2 * SCREEN_WIDTH
+ call ByteFill
+ ret
+
+TitleScreenScene:
+ ld e, a
+ ld d, 0
+ ld hl, .scenes
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp hl
+
+.scenes
+ dw TitleScreenTimer
+ dw TitleScreenMain
+ dw TitleScreenEnd
+
+.Unreferenced_NextScene:
+ ld hl, wJumptableIndex
+ inc [hl]
+ ret
+
+TitleScreenTimer:
+; Next scene
+ ld hl, wJumptableIndex
+ inc [hl]
+
+; Start a timer
+ ld hl, wTitleScreenTimer
+IF DEF(_GOLD)
+ ld de, 84 * 60 + 16
+ELIF DEF(_SILVER)
+ ld de, 73 * 60 + 36
+ENDC
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ret
+
+TitleScreenMain:
+; Run the timer down.
+ ld hl, wTitleScreenTimer
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld a, e
+ or d
+ jr z, .end
+
+ dec de
+ ld [hl], d
+ dec hl
+ ld [hl], e
+
+; Save data can be deleted by pressing Up + B + Select.
+ call GetJoypad
+ ld hl, hJoyDown
+ ld a, [hl]
+ and D_UP + B_BUTTON + SELECT
+ cp D_UP + B_BUTTON + SELECT
+ jr z, .delete_save_data
+
+; Clock can be reset by pressing Down + B + Select.
+ ld a, [hl]
+ and D_DOWN + B_BUTTON + SELECT
+ cp D_DOWN + B_BUTTON + SELECT
+ jr z, .clock_reset
+ ld a, [hl]
+ and START | A_BUTTON
+ jr nz, .incave
+ ret
+
+.incave
+ ld a, 0
+ jr .done
+
+.delete_save_data
+ ld a, 1
+
+.done
+ ld [wIntroSceneFrameCounter], a
+
+; Return to the intro sequence.
+ ld hl, wJumptableIndex
+ set 7, [hl]
+ ret
+
+.end
+; Next scene
+ ld hl, wJumptableIndex
+ inc [hl]
+
+; Fade out the title screen music
+ xor a ; MUSIC_NONE
+ ld [wMusicFadeID], a
+ ld [wMusicFadeID + 1], a
+ ld hl, wMusicFade
+ ld [hl], 8 ; 1 second
+
+ ld hl, wTitleScreenTimer
+ inc [hl]
+ ret
+
+.clock_reset
+ ld a, 4
+ ld [wIntroSceneFrameCounter], a
+
+; Return to the intro sequence.
+ ld hl, wJumptableIndex
+ set 7, [hl]
+ ret
+
+TitleScreenEnd:
+; Wait until the music is done fading.
+
+ ld hl, wTitleScreenTimer
+ inc [hl]
+
+ ld a, [wMusicFade]
+ and a
+ ret nz
+
+ ld a, 2
+ ld [wIntroSceneFrameCounter], a
+
+; Back to the intro.
+ ld hl, wJumptableIndex
+ set 7, [hl]
+ ret
+
+DeleteSaveData:
+ farcall _DeleteSaveData
+ jp Init
+
+ResetClock:
+ farcall _ResetClock
+ jp Init
+
+Function64b1:
+ ; If bit 0 or 1 of [wTitleScreenTimer] is set, we don't need to be here.
+ ld a, [wTitleScreenTimer]
+ and %00000011
+ ret nz
+IF DEF(_GOLD)
+ ld bc, wSpriteAnim10
+ ld hl, SPRITEANIMSTRUCT_FRAME
+ add hl, bc
+ ld l, [hl]
+ ld h, 0
+ add hl, hl
+ add hl, hl
+ ld de, .Data_64e0
+ add hl, de
+ ; If bit 2 of [wTitleScreenTimer] is set, get the second dw; else, get the first dw
+ ld a, [wTitleScreenTimer]
+ and %00000100
+ srl a
+ srl a
+ ld e, a
+ ld d, 0
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ and a
+ ret z
+ ld e, a
+ ld d, [hl]
+ELIF DEF(_SILVER)
+ depixel 15, 11, 4, 0
+ENDC
+ ld a, SPRITE_ANIM_INDEX_GS_TITLE_TRAIL
+ call InitSpriteAnimStruct
+ ret
+
+IF DEF(_GOLD)
+.Data_64e0:
+; frame 0 y, x; frame 1 y, x
+ db 11 * 8 + 4, 10 * 8, 0 * 8, 0 * 8
+ db 11 * 8 + 4, 13 * 8, 11 * 8 + 4, 11 * 8
+ db 11 * 8 + 4, 13 * 8, 11 * 8 + 4, 15 * 8
+ db 11 * 8 + 4, 17 * 8, 11 * 8 + 4, 15 * 8
+ db 0 * 8, 0 * 8, 11 * 8 + 4, 15 * 8
+ db 0 * 8, 0 * 8, 11 * 8 + 4, 11 * 8
+ENDC
+
+Copyright:
+ call ClearTilemap
+ call LoadFontsExtra
+ ld de, CopyrightGFX
+ ld hl, vTiles2 tile $60
+ lb bc, BANK(CopyrightGFX), 30
+ call Request2bpp
+ hlcoord 2, 7
+ ld de, CopyrightString
+ jp PlaceString
+
+CopyrightString:
+ ; ©1995-2000 Nintendo
+ db $60, $61, $62, $63, $7a, $7b, $7c, $7d
+ db $65, $66, $67, $68, $69, $6a
+
+ ; ©1995-2000 Creatures inc.
+ next $60, $61, $62, $63, $7a, $7b, $7c, $7d
+ db $6b, $6c, $6d, $6e, $6f, $70, $71, $72
+
+ ; ©1995-2000 GAME FREAK inc.
+ next $60, $61, $62, $63, $7a, $7b, $7c, $7d
+ db $73, $74, $75, $76, $77, $78, $79, $71, $72
+
+ db "@"
+
+GameInit::
+ call ClearWindowData
+ farcall TryLoadSaveData
+ jp IntroSequence