ref: 7c3a90bf0181127fab4cd98ad4a3173a2984f51e
dir: /engine/titlescreen.asm/
; copy text of fixed length NAME_LENGTH (like player name, rival name, mon names, ...) CopyFixedLengthText: ld bc, NAME_LENGTH jp CopyData SetDefaultNamesBeforeTitlescreen: ld hl, NintenText ld de, wPlayerName call CopyFixedLengthText ld hl, SonyText ld de, wRivalName call CopyFixedLengthText xor a ld [hWY], a ld [wLetterPrintingDelayFlags], a ld hl, wd732 ld [hli], a ld [hli], a ld [hl], a ld a, BANK(Music_TitleScreen) ld [wAudioROMBank], a ld [wAudioSavedROMBank], a DisplayTitleScreen: call GBPalWhiteOut ld a, $1 ld [H_AUTOBGTRANSFERENABLED], a xor a ld [hTilesetType], a ld [hSCX], a ld a, $40 ld [hSCY], a ld a, $90 ld [hWY], a call ClearScreen call DisableLCD call LoadFontTilePatterns ld hl, NintendoCopyrightLogoGraphics ld de, vTitleLogo2 + $100 ld bc, $50 ld a, BANK(NintendoCopyrightLogoGraphics) call FarCopyData2 ld hl, GamefreakLogoGraphics ld de, vTitleLogo2 + $100 + $50 ld bc, $90 ld a, BANK(GamefreakLogoGraphics) call FarCopyData2 ld hl, PokemonLogoGraphics ld de, vTitleLogo ld bc, $600 ld a, BANK(PokemonLogoGraphics) call FarCopyData2 ; first chunk ld hl, PokemonLogoGraphics+$600 ld de, vTitleLogo2 ld bc, $100 ld a, BANK(PokemonLogoGraphics) call FarCopyData2 ; second chunk ld hl, Version_GFX ld de,vChars2 + $600 - (Version_GFXEnd - Version_GFX - $50) ld bc, Version_GFXEnd - Version_GFX ld a, BANK(Version_GFX) call FarCopyDataDouble call ClearBothBGMaps ; place tiles for pokemon logo (except for the last row) coord hl, 2, 1 ld a, $80 ld de, SCREEN_WIDTH ld c, 6 .pokemonLogoTileLoop ld b, $10 push hl .pokemonLogoTileRowLoop ; place tiles for one row ld [hli], a inc a dec b jr nz, .pokemonLogoTileRowLoop pop hl add hl, de dec c jr nz, .pokemonLogoTileLoop ; place tiles for the last row of the pokemon logo coord hl, 2, 7 ld a, $31 ld b, $10 .pokemonLogoLastTileRowLoop ld [hli], a inc a dec b jr nz, .pokemonLogoLastTileRowLoop call DrawPlayerCharacter ; put a pokeball in the player's hand ld hl, wOAMBuffer + $28 ld a, $74 ld [hl], a ; place tiles for title screen copyright coord hl, 2, 17 ld de, .tileScreenCopyrightTiles ld b, $10 .tileScreenCopyrightTilesLoop ld a, [de] ld [hli], a inc de dec b jr nz, .tileScreenCopyrightTilesLoop jr .next .tileScreenCopyrightTiles db $41,$42,$43,$42,$44,$42,$45,$46,$47,$48,$49,$4A,$4B,$4C,$4D,$4E ; ©'95.'96.'98 GAME FREAK inc. .next call SaveScreenTilesToBuffer2 call LoadScreenTilesFromBuffer2 call EnableLCD IF DEF(_RED) ld a,CHARMANDER ; which Pokemon to show first on the title screen ENDC IF DEF(_BLUE) ld a,SQUIRTLE ; which Pokemon to show first on the title screen ENDC ld [wTitleMonSpecies], a call LoadTitleMonSprite ld a, (vBGMap0 + $300) / $100 call TitleScreenCopyTileMapToVRAM call SaveScreenTilesToBuffer1 ld a, $40 ld [hWY], a call LoadScreenTilesFromBuffer2 ld a, vBGMap0 / $100 call TitleScreenCopyTileMapToVRAM ld b, SET_PAL_TITLE_SCREEN call RunPaletteCommand call GBPalNormal ld a, %11100100 ld [rOBP0], a ; make pokemon logo bounce up and down ld bc, hSCY ; background scroll Y ld hl, .TitleScreenPokemonLogoYScrolls .bouncePokemonLogoLoop ld a, [hli] and a jr z, .finishedBouncingPokemonLogo ld d, a cp -3 jr nz, .skipPlayingSound ld a, SFX_INTRO_CRASH call PlaySound .skipPlayingSound ld a, [hli] ld e, a call .ScrollTitleScreenPokemonLogo jr .bouncePokemonLogoLoop .TitleScreenPokemonLogoYScrolls: ; Controls the bouncing effect of the Pokemon logo on the title screen db -4,16 ; y scroll amount, number of times to scroll db 3,4 db -3,4 db 2,2 db -2,2 db 1,2 db -1,2 db 0 ; terminate list with 0 .ScrollTitleScreenPokemonLogo: ; Scrolls the Pokemon logo on the title screen to create the bouncing effect ; Scrolls d pixels e times call DelayFrame ld a, [bc] ; background scroll Y add d ld [bc], a dec e jr nz, .ScrollTitleScreenPokemonLogo ret .finishedBouncingPokemonLogo call LoadScreenTilesFromBuffer1 ld c, 36 call DelayFrames ld a, SFX_INTRO_WHOOSH call PlaySound ; scroll game version in from the right call PrintGameVersionOnTitleScreen ld a, SCREEN_HEIGHT_PIXELS ld [hWY], a ld d, 144 .scrollTitleScreenGameVersionLoop ld h, d ld l, 64 call ScrollTitleScreenGameVersion ld h, 0 ld l, 80 call ScrollTitleScreenGameVersion ld a, d add 4 ld d, a and a jr nz, .scrollTitleScreenGameVersionLoop ld a, vBGMap1 / $100 call TitleScreenCopyTileMapToVRAM call LoadScreenTilesFromBuffer2 call PrintGameVersionOnTitleScreen call Delay3 call WaitForSoundToFinish ld a, MUSIC_TITLE_SCREEN ld [wNewSoundID], a call PlaySound xor a ld [wUnusedCC5B], a ; Keep scrolling in new mons indefinitely until the user performs input. .awaitUserInterruptionLoop ld c, 200 call CheckForUserInterruption jr c, .finishedWaiting call TitleScreenScrollInMon ld c, 1 call CheckForUserInterruption jr c, .finishedWaiting callba TitleScreenAnimateBallIfStarterOut call TitleScreenPickNewMon jr .awaitUserInterruptionLoop .finishedWaiting ld a, [wTitleMonSpecies] call PlayCry call WaitForSoundToFinish call GBPalWhiteOutWithDelay3 call ClearSprites xor a ld [hWY], a inc a ld [H_AUTOBGTRANSFERENABLED], a call ClearScreen ld a, vBGMap0 / $100 call TitleScreenCopyTileMapToVRAM ld a, vBGMap1 / $100 call TitleScreenCopyTileMapToVRAM call Delay3 call LoadGBPal ld a, [hJoyHeld] ld b, a and D_UP | SELECT | B_BUTTON cp D_UP | SELECT | B_BUTTON jp z, .doClearSaveDialogue jp MainMenu .doClearSaveDialogue jpba DoClearSaveDialogue TitleScreenPickNewMon: ld a, vBGMap0 / $100 call TitleScreenCopyTileMapToVRAM .loop ; Keep looping until a mon different from the current one is picked. call Random and $f ld c, a ld b, 0 ld hl, TitleMons add hl, bc ld a, [hl] ld hl, wTitleMonSpecies ; Can't be the same as before. cp [hl] jr z, .loop ld [hl], a call LoadTitleMonSprite ld a, $90 ld [hWY], a ld d, 1 ; scroll out callba TitleScroll ret TitleScreenScrollInMon: ld d, 0 ; scroll in callba TitleScroll xor a ld [hWY], a ret ScrollTitleScreenGameVersion: .wait ld a, [rLY] cp l jr nz, .wait ld a, h ld [rSCX], a .wait2 ld a, [rLY] cp h jr z, .wait2 ret DrawPlayerCharacter: ld hl, PlayerCharacterTitleGraphics ld de, vSprites ld bc, PlayerCharacterTitleGraphicsEnd - PlayerCharacterTitleGraphics ld a, BANK(PlayerCharacterTitleGraphics) call FarCopyData2 call ClearSprites xor a ld [wPlayerCharacterOAMTile], a ld hl, wOAMBuffer ld de, $605a ld b, 7 .loop push de ld c, 5 .innerLoop ld a, d ld [hli], a ; Y ld a, e ld [hli], a ; X add 8 ld e, a ld a, [wPlayerCharacterOAMTile] ld [hli], a ; tile inc a ld [wPlayerCharacterOAMTile], a inc hl dec c jr nz, .innerLoop pop de ld a, 8 add d ld d, a dec b jr nz, .loop ret ClearBothBGMaps: ld hl, vBGMap0 ld bc, $400 * 2 ld a, " " jp FillMemory LoadTitleMonSprite: ld [wcf91], a ld [wd0b5], a coord hl, 5, 10 call GetMonHeader jp LoadFrontSpriteByMonIndex TitleScreenCopyTileMapToVRAM: ld [H_AUTOBGTRANSFERDEST + 1], a jp Delay3 LoadCopyrightAndTextBoxTiles: xor a ld [hWY], a call ClearScreen call LoadTextBoxTilePatterns LoadCopyrightTiles: ld de, NintendoCopyrightLogoGraphics ld hl, vChars2 + $600 lb bc, BANK(NintendoCopyrightLogoGraphics), (GamefreakLogoGraphicsEnd - NintendoCopyrightLogoGraphics) / $10 call CopyVideoData coord hl, 2, 7 ld de, CopyrightTextString jp PlaceString CopyrightTextString: db $60,$61,$62,$61,$63,$61,$64,$7F,$65,$66,$67,$68,$69,$6A ; ©'95.'96.'98 Nintendo next $60,$61,$62,$61,$63,$61,$64,$7F,$6B,$6C,$6D,$6E,$6F,$70,$71,$72 ; ©'95.'96.'98 Creatures inc. next $60,$61,$62,$61,$63,$61,$64,$7F,$73,$74,$75,$76,$77,$78,$79,$7A,$7B ; ©'95.'96.'98 GAME FREAK inc. db "@" INCLUDE "data/title_mons.asm" ; prints version text (red, blue) PrintGameVersionOnTitleScreen: coord hl, 7, 8 ld de, VersionOnTitleScreenText jp PlaceString ; these point to special tiles specifically loaded for that purpose and are not usual text VersionOnTitleScreenText: IF DEF(_RED) db $60,$61,$7F,$65,$66,$67,$68,$69,"@" ; "Red Version" ENDC IF DEF(_BLUE) db $61,$62,$63,$64,$65,$66,$67,$68,"@" ; "Blue Version" ENDC NintenText: db "NINTEN@" SonyText: db "SONY@"