From 2354c41a96bdf80861338add2f0b3a67b18f160e Mon Sep 17 00:00:00 2001 From: Rangi Date: Tue, 16 Jun 2020 11:44:03 -0400 Subject: crystal_intro.asm -> intro.asm --- engine/movie/crystal_intro.asm | 2132 --------------------------------------- engine/movie/intro.asm | 2135 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 2135 insertions(+), 2132 deletions(-) delete mode 100644 engine/movie/crystal_intro.asm create mode 100644 engine/movie/intro.asm (limited to 'engine') diff --git a/engine/movie/crystal_intro.asm b/engine/movie/crystal_intro.asm deleted file mode 100644 index 9fbd67078..000000000 --- a/engine/movie/crystal_intro.asm +++ /dev/null @@ -1,2132 +0,0 @@ -Copyright_GFPresents: - ld de, MUSIC_NONE - call PlayMusic - call ClearBGPalettes - call ClearTilemap - ld a, HIGH(vBGMap0) - ldh [hBGMapAddress + 1], a - xor a ; LOW(vBGMap0) - ldh [hBGMapAddress], a - ldh [hJoyDown], a - ldh [hSCX], a - ldh [hSCY], a - ld a, $90 - ldh [hWY], a - call WaitBGMap - ld b, SCGB_GAMEFREAK_LOGO - call GetSGBLayout - call SetPalettes - ld c, 10 - call DelayFrames - callfar Copyright - call WaitBGMap - ld c, 100 - call DelayFrames - call ClearTilemap - farcall GBCOnlyScreen - call .GetGFLogoGFX -.joy_loop - call JoyTextDelay - ldh a, [hJoyLast] - and BUTTONS - jr nz, .pressed_button - ld a, [wJumptableIndex] - bit 7, a - jr nz, .finish - call PlaceGameFreakPresents - farcall PlaySpriteAnimations - call DelayFrame - jr .joy_loop - -.pressed_button - call .StopGamefreakAnim - scf - ret - -.finish - call .StopGamefreakAnim - and a - ret - -.GetGFLogoGFX: - ld de, GameFreakLogo - ld hl, vTiles2 - lb bc, BANK(GameFreakLogo), 28 - call Get1bpp - - ldh a, [rSVBK] - push af - ld a, BANK(wDecompressScratch) - ldh [rSVBK], a - - ld hl, IntroLogoGFX - ld de, wDecompressScratch - ld a, BANK(IntroLogoGFX) - call FarDecompress - - ld hl, vTiles0 - ld de, wDecompressScratch - lb bc, 1, 8 tiles - call Request2bpp - - ld hl, vTiles1 - ld de, wDecompressScratch + $80 tiles - lb bc, 1, 8 tiles - call Request2bpp - - pop af - ldh [rSVBK], a - - farcall ClearSpriteAnims - depixel 10, 11, 4, 0 - ld a, SPRITE_ANIM_INDEX_GAMEFREAK_LOGO - call InitSpriteAnimStruct - ld hl, SPRITEANIMSTRUCT_YOFFSET - add hl, bc - ld [hl], $a0 - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld [hl], $60 - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld [hl], $30 - xor a - ld [wJumptableIndex], a - ld [wIntroSceneFrameCounter], a - ld [wIntroSceneTimer], a - ldh [hSCX], a - ldh [hSCY], a - ld a, $1 - ldh [hBGMapMode], a - ld a, $90 - ldh [hWY], a - lb de, %11100100, %11100100 - call DmgToCgbObjPals - ret - -.StopGamefreakAnim: - farcall ClearSpriteAnims - call ClearTilemap - call ClearSprites - ld c, 16 - call DelayFrames - ret - -PlaceGameFreakPresents: - ld a, [wJumptableIndex] - 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 PlaceGameFreakPresents_0 - dw PlaceGameFreakPresents_1 - dw PlaceGameFreakPresents_2 - dw PlaceGameFreakPresents_3 - -PlaceGameFreakPresents_AdvanceIndex: - ld hl, wJumptableIndex - inc [hl] - ret - -PlaceGameFreakPresents_0: - ret - -PlaceGameFreakPresents_1: - ld hl, wIntroSceneTimer - ld a, [hl] - cp $20 - jr nc, .PlaceGameFreak - inc [hl] - ret - -.PlaceGameFreak: - ld [hl], 0 - ld hl, .GAME_FREAK - decoord 5, 10 - ld bc, .end - .GAME_FREAK - call CopyBytes - call PlaceGameFreakPresents_AdvanceIndex - ld de, SFX_GAME_FREAK_PRESENTS - call PlaySFX - ret - -.GAME_FREAK: - ; G A M E _ F R E A K - db 0, 1, 2, 3, 13, 4, 5, 3, 1, 6 -.end - db "@" - -PlaceGameFreakPresents_2: - ld hl, wIntroSceneTimer - ld a, [hl] - cp $40 - jr nc, .place_presents - inc [hl] - ret - -.place_presents - ld [hl], 0 - ld hl, .presents - decoord 7, 11 - ld bc, .end - .presents - call CopyBytes - call PlaceGameFreakPresents_AdvanceIndex - ret - -.presents - db 7, 8, 9, 10, 11, 12 -.end - db "@" - -PlaceGameFreakPresents_3: - ld hl, wIntroSceneTimer - ld a, [hl] - cp $80 - jr nc, .finish - inc [hl] - ret - -.finish - ld hl, wJumptableIndex - set 7, [hl] - ret - -GameFreakLogoJumper: - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - ld e, [hl] - ld d, 0 - ld hl, GameFreakLogoScenes - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl - -GameFreakLogoScenes: - dw GameFreakLogoScene1 - dw GameFreakLogoScene2 - dw GameFreakLogoScene3 - dw GameFreakLogoScene4 - dw GameFreakLogoScene5 - -GameFreakLogoScene1: - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - inc [hl] - ret - -GameFreakLogoScene2: - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - and a - jr z, .asm_e4747 - ld d, a - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld a, [hl] - and %111111 - cp %100000 - jr nc, .asm_e4723 - add %100000 -.asm_e4723 - ld e, a - farcall BattleAnim_Sine_e - ld hl, SPRITEANIMSTRUCT_YOFFSET - add hl, bc - ld [hl], e - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld a, [hl] - dec [hl] - and $1f - ret nz - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld a, [hl] - sub $30 - ld [hl], a - ld de, SFX_DITTO_BOUNCE - call PlaySFX - ret - -.asm_e4747 - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - inc [hl] - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld [hl], $0 - ld de, SFX_DITTO_POP_UP - call PlaySFX - ret - -GameFreakLogoScene3: - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld a, [hl] - cp $20 - jr nc, .asm_e4764 - inc [hl] - ret - -.asm_e4764 - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - inc [hl] - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld [hl], $0 - ld de, SFX_DITTO_TRANSFORM - call PlaySFX - ret - -GameFreakLogoScene4: - ld hl, SPRITEANIMSTRUCT_0D - add hl, bc - ld a, [hl] - cp $40 - jr z, .asm_e47a3 - inc [hl] - srl a - srl a - ld e, a - ld d, $0 - ld hl, GameFreakLogoPalettes - add hl, de - add hl, de - ldh a, [rSVBK] - push af - ld a, BANK(wOBPals2) - ldh [rSVBK], a - ld a, [hli] - ld [wOBPals2 + 12], a - ld a, [hli] - ld [wOBPals2 + 13], a - pop af - ldh [rSVBK], a - ld a, $1 - ldh [hCGBPalUpdate], a - ret - -.asm_e47a3 - ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - inc [hl] - call PlaceGameFreakPresents_AdvanceIndex -GameFreakLogoScene5: - ret - -GameFreakLogoPalettes: -INCLUDE "gfx/intro/gamefreak_logo.pal" - -GameFreakLogo: -INCBIN "gfx/splash/logo1.1bpp" -INCBIN "gfx/splash/logo2.1bpp" - -CrystalIntro: - ldh a, [rSVBK] - push af - ld a, BANK(wGBCPalettes) - ldh [rSVBK], a - ldh a, [hInMenu] - push af - ldh a, [hVBlank] - push af - call .InitRAMAddrs -.loop - call JoyTextDelay - ldh a, [hJoyLast] - and BUTTONS - jr nz, .ShutOffMusic - ld a, [wJumptableIndex] - bit 7, a - jr nz, .done - call IntroSceneJumper - farcall PlaySpriteAnimations - call DelayFrame - jp .loop - -.ShutOffMusic: - ld de, MUSIC_NONE - call PlayMusic - -.done - call ClearBGPalettes - call ClearSprites - call ClearTilemap - xor a - ldh [hSCX], a - ldh [hSCY], a - ld a, $7 - ldh [hWX], a - ld a, $90 - ldh [hWY], a - pop af - ldh [hVBlank], a - pop af - ldh [hInMenu], a - pop af - ldh [rSVBK], a - ret - -.InitRAMAddrs: - xor a - ldh [hVBlank], a - ld a, $1 - ldh [hInMenu], a - xor a - ldh [hMapAnims], a - ld [wJumptableIndex], a - ret - -IntroSceneJumper: - ld a, [wJumptableIndex] - ld e, a - ld d, 0 - ld hl, IntroScenes - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl - -IntroScenes: - dw IntroScene1 - dw IntroScene2 - dw IntroScene3 - dw IntroScene4 - dw IntroScene5 - dw IntroScene6 - dw IntroScene7 - dw IntroScene8 - dw IntroScene9 - dw IntroScene10 - dw IntroScene11 - dw IntroScene12 - dw IntroScene13 - dw IntroScene14 - dw IntroScene15 - dw IntroScene16 - dw IntroScene17 - dw IntroScene18 - dw IntroScene19 - dw IntroScene20 - dw IntroScene21 - dw IntroScene22 - dw IntroScene23 - dw IntroScene24 - dw IntroScene25 - dw IntroScene26 - dw IntroScene27 - dw IntroScene28 - -NextIntroScene: - ld hl, wJumptableIndex - inc [hl] - ret - -IntroScene1: -; Setup the next scene. - call Intro_ClearBGPals - call ClearSprites - call ClearTilemap - xor a - ldh [hBGMapMode], a - ld a, $1 - ldh [rVBK], a - ld hl, IntroUnownAAttrmap - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ld a, $0 - ldh [rVBK], a - ld hl, IntroUnownsGFX - ld de, vTiles2 tile $00 - call Intro_DecompressRequest2bpp_128Tiles - ld hl, IntroPulseGFX - ld de, vTiles0 tile $00 - call Intro_DecompressRequest2bpp_128Tiles - ld hl, IntroUnownATilemap - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ldh a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ldh [rSVBK], a - ld hl, IntroUnownsPalette - ld de, wBGPals1 - ld bc, 16 palettes - call CopyBytes - ld hl, IntroUnownsPalette - ld de, wBGPals2 - ld bc, 16 palettes - call CopyBytes - pop af - ldh [rSVBK], a - xor a - ldh [hSCX], a - ldh [hSCY], a - ld a, $7 - ldh [hWX], a - ld a, $90 - ldh [hWY], a - farcall ClearSpriteAnims - call Intro_SetCGBPalUpdate - xor a - ld [wIntroSceneFrameCounter], a - ld [wIntroSceneTimer], a - call NextIntroScene - ret - -IntroScene2: -; First Unown (A) fades in, pulses, then fades out. - ld hl, wIntroSceneFrameCounter - ld a, [hl] - inc [hl] - cp $80 - jr nc, .endscene - cp $60 - jr nz, .DontPlaySound - push af - depixel 11, 11 - call CrystalIntro_InitUnownAnim - ld de, SFX_INTRO_UNOWN_1 - call PlaySFX - pop af -.DontPlaySound: - ld [wIntroSceneTimer], a - xor a - call CrystalIntro_UnownFade - ret -.endscene - call NextIntroScene - ret - -IntroScene3: -; More setup. Transition to the outdoor scene. - call Intro_ClearBGPals - call ClearSprites - call ClearTilemap - xor a - ldh [hBGMapMode], a - ld a, $1 - ldh [rVBK], a - ld hl, IntroBackgroundAttrmap - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ld a, $0 - ldh [rVBK], a - ld hl, IntroBackgroundGFX - ld de, vTiles2 tile $00 - call Intro_DecompressRequest2bpp_128Tiles - ld hl, IntroBackgroundTilemap - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ldh a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ldh [rSVBK], a - ld hl, IntroBackgroundPalette - ld de, wBGPals1 - ld bc, 16 palettes - call CopyBytes - ld hl, IntroBackgroundPalette - ld de, wBGPals2 - ld bc, 16 palettes - call CopyBytes - pop af - ldh [rSVBK], a - xor a - ldh [hSCX], a - ldh [hSCY], a - ld a, $7 - ldh [hWX], a - ld a, $90 - ldh [hWY], a - call Intro_ResetLYOverrides - call Intro_SetCGBPalUpdate - xor a - ld [wIntroSceneFrameCounter], a - call NextIntroScene - ret - -IntroScene4: -; Scroll the outdoor panorama for a bit. - call Intro_PerspectiveScrollBG - ld hl, wIntroSceneFrameCounter - ld a, [hl] - cp $80 - jr z, .endscene - inc [hl] - ret - -.endscene - call NextIntroScene - ret - -IntroScene5: -; Go back to the Unown. - call Intro_ClearBGPals - call ClearSprites - call ClearTilemap - xor a - ldh [hBGMapMode], a - ldh [hLCDCPointer], a - ld a, $1 - ldh [rVBK], a - ld hl, IntroUnownHIAttrmap - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ld a, $0 - ldh [rVBK], a - ld hl, IntroUnownsGFX - ld de, vTiles2 tile $00 - call Intro_DecompressRequest2bpp_128Tiles - ld hl, IntroPulseGFX - ld de, vTiles0 tile $00 - call Intro_DecompressRequest2bpp_128Tiles - ld hl, IntroUnownHITilemap - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ldh a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ldh [rSVBK], a - ld hl, IntroUnownsPalette - ld de, wBGPals1 - ld bc, 16 palettes - call CopyBytes - ld hl, IntroUnownsPalette - ld de, wBGPals2 - ld bc, 16 palettes - call CopyBytes - pop af - ldh [rSVBK], a - xor a - ldh [hSCX], a - ldh [hSCY], a - ld a, $7 - ldh [hWX], a - ld a, $90 - ldh [hWY], a - farcall ClearSpriteAnims - call Intro_SetCGBPalUpdate - xor a - ld [wIntroSceneFrameCounter], a - ld [wIntroSceneTimer], a - call NextIntroScene - ret - -IntroScene6: -; Two more Unown (I, H) fade in. - ld hl, wIntroSceneFrameCounter - ld a, [hl] - inc [hl] - cp $80 - jr nc, .endscene - cp $60 - jr z, .SecondUnown - cp $40 - jr nc, .StopUnown - cp $20 - jr z, .FirstUnown - jr .NoUnown - -.FirstUnown: - push af - depixel 7, 15 - call CrystalIntro_InitUnownAnim - ld de, SFX_INTRO_UNOWN_2 - call PlaySFX - pop af -.NoUnown: - ld [wIntroSceneTimer], a - xor a - call CrystalIntro_UnownFade - ret - -.SecondUnown: - push af - depixel 14, 6 - call CrystalIntro_InitUnownAnim - ld de, SFX_INTRO_UNOWN_1 - call PlaySFX - pop af -.StopUnown: - ld [wIntroSceneTimer], a - ld a, $1 - call CrystalIntro_UnownFade - ret - -.endscene - call NextIntroScene - ret - -IntroScene7: -; Back to the outdoor scene. - call Intro_ClearBGPals - call ClearSprites - call ClearTilemap - xor a - ldh [hBGMapMode], a - - ld a, $1 - ldh [rVBK], a - ld hl, IntroBackgroundAttrmap - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - - ld hl, IntroPichuWooperGFX - ld de, vTiles0 tile $00 - call Intro_DecompressRequest2bpp_128Tiles - - ld a, $0 - ldh [rVBK], a - ld hl, IntroSuicuneRunGFX - ld de, vTiles0 tile $00 - call Intro_DecompressRequest2bpp_255Tiles - - ld hl, IntroBackgroundGFX - ld de, vTiles2 tile $00 - call Intro_DecompressRequest2bpp_128Tiles - - ld hl, IntroBackgroundTilemap - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - - ldh a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ldh [rSVBK], a - - ld hl, IntroBackgroundPalette - ld de, wBGPals1 - ld bc, 16 palettes - call CopyBytes - - ld hl, IntroBackgroundPalette - ld de, wBGPals2 - ld bc, 16 palettes - call CopyBytes - - pop af - ldh [rSVBK], a - - xor a - ldh [hSCX], a - ldh [hSCY], a - ld a, $7 - ldh [hWX], a - ld a, $90 - ldh [hWY], a - call Intro_ResetLYOverrides - farcall ClearSpriteAnims - depixel 13, 27, 4, 0 - ld a, SPRITE_ANIM_INDEX_INTRO_SUICUNE - call InitSpriteAnimStruct - ld a, $f0 - ld [wGlobalAnimXOffset], a - call Intro_SetCGBPalUpdate - xor a - ld [wIntroSceneFrameCounter], a - ld [wIntroSceneTimer], a - call NextIntroScene - ret - -IntroScene8: -; Scroll the scene, then show Suicune running across the screen. - ld hl, wIntroSceneFrameCounter - ld a, [hl] - inc [hl] - cp $40 - jr z, .suicune_sound - jr nc, .animate_suicune - call Intro_PerspectiveScrollBG - ret - -.suicune_sound - ld de, SFX_INTRO_SUICUNE_3 - call PlaySFX -.animate_suicune - ld a, [wGlobalAnimXOffset] - and a - jr z, .finish - sub $8 - ld [wGlobalAnimXOffset], a - ret - -.finish - ld de, SFX_INTRO_SUICUNE_2 - call PlaySFX - farcall DeinitializeAllSprites - call NextIntroScene - ret - -IntroScene9: -; Set up the next scene (same bg). - xor a - ldh [hLCDCPointer], a - call ClearSprites - hlcoord 0, 0, wAttrmap - ; first 12 rows have palette 1 - ld bc, 12 * SCREEN_WIDTH - ld a, $1 - call ByteFill - ; middle 3 rows have palette 2 - ld bc, 3 * SCREEN_WIDTH - ld a, $2 - call ByteFill - ; last three rows have palette 3 - ld bc, 3 * SCREEN_WIDTH - ld a, $3 - call ByteFill - ld a, $2 - ldh [hBGMapMode], a - call DelayFrame - call DelayFrame - call DelayFrame - ld a, LOW(vBGMap0 + $c) ; $c - ldh [hBGMapAddress], a - call DelayFrame - call DelayFrame - call DelayFrame - xor a - ldh [hBGMapMode], a - ldh [hBGMapAddress], a - ld [wGlobalAnimXOffset], a - xor a - ld [wIntroSceneFrameCounter], a - call NextIntroScene - ret - -IntroScene10: -; Wooper and Pichu enter. - call Intro_RustleGrass - ld hl, wIntroSceneFrameCounter - ld a, [hl] - inc [hl] - cp $c0 - jr z, .done - cp $20 - jr z, .wooper - cp $40 - jr z, .pichu - ret - -.pichu - depixel 21, 16, 1, 0 - ld a, SPRITE_ANIM_INDEX_INTRO_PICHU - call InitSpriteAnimStruct - ld de, SFX_INTRO_PICHU - call PlaySFX - ret - -.wooper - depixel 22, 6 - ld a, SPRITE_ANIM_INDEX_INTRO_WOOPER - call InitSpriteAnimStruct - ld de, SFX_INTRO_PICHU - call PlaySFX - ret -.done - call NextIntroScene - ret - -IntroScene11: -; Back to Unown again. - call Intro_ClearBGPals - call ClearSprites - call ClearTilemap - xor a - ldh [hBGMapMode], a - ldh [hLCDCPointer], a - ld a, $1 - ldh [rVBK], a - ld hl, IntroUnownsAttrmap - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ld a, $0 - ldh [rVBK], a - ld hl, IntroUnownsGFX - ld de, vTiles2 tile $00 - call Intro_DecompressRequest2bpp_128Tiles - ld hl, IntroUnownsTilemap - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ldh a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ldh [rSVBK], a - ld hl, IntroUnownsPalette - ld de, wBGPals1 - ld bc, 16 palettes - call CopyBytes - ld hl, IntroUnownsPalette - ld de, wBGPals2 - ld bc, 16 palettes - call CopyBytes - pop af - ldh [rSVBK], a - xor a - ldh [hSCX], a - ldh [hSCY], a - ld a, $7 - ldh [hWX], a - ld a, $90 - ldh [hWY], a - farcall ClearSpriteAnims - call Intro_SetCGBPalUpdate - xor a - ld [wIntroSceneFrameCounter], a - ld [wIntroSceneTimer], a - call NextIntroScene - ret - -IntroScene12: -; Even more Unown. - call .PlayUnownSound - ld hl, wIntroSceneFrameCounter - ld a, [hl] - inc [hl] - cp $c0 - jr nc, .done - cp $80 - jr nc, .second_half -; first half - ld c, a - and $1f - sla a - ld [wIntroSceneTimer], a - ld a, c - and $e0 - srl a - swap a - call CrystalIntro_UnownFade - ret - -.second_half -; double speed - ld c, a - and $f - sla a - sla a - ld [wIntroSceneTimer], a - ld a, c - and $70 - or $40 - swap a - call CrystalIntro_UnownFade - ret - -.done - call NextIntroScene - ret - -.PlayUnownSound: - ld a, [wIntroSceneFrameCounter] - ld c, a - ld hl, .UnownSounds -.loop - ld a, [hli] - cp -1 - ret z - cp c - jr z, .playsound - inc hl - inc hl - jr .loop -.playsound - ld a, [hli] - ld d, [hl] - ld e, a - push de - call SFXChannelsOff - pop de - call PlaySFX - ret - -.UnownSounds: - dbw $00, SFX_INTRO_UNOWN_3 - dbw $20, SFX_INTRO_UNOWN_2 - dbw $40, SFX_INTRO_UNOWN_1 - dbw $60, SFX_INTRO_UNOWN_2 - dbw $80, SFX_INTRO_UNOWN_3 - dbw $90, SFX_INTRO_UNOWN_2 - dbw $a0, SFX_INTRO_UNOWN_1 - dbw $b0, SFX_INTRO_UNOWN_2 - db -1 - -IntroScene13: -; Switch scenes again. - call Intro_ClearBGPals - call ClearSprites - call ClearTilemap - xor a - ldh [hBGMapMode], a - ld a, $1 - ldh [rVBK], a - ld hl, IntroBackgroundAttrmap - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ld a, $0 - ldh [rVBK], a - ld hl, IntroSuicuneRunGFX - ld de, vTiles0 tile $00 - call Intro_DecompressRequest2bpp_255Tiles - ld hl, IntroBackgroundGFX - ld de, vTiles2 tile $00 - call Intro_DecompressRequest2bpp_128Tiles - ld hl, IntroBackgroundTilemap - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ldh a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ldh [rSVBK], a - ld hl, IntroBackgroundPalette - ld de, wBGPals1 - ld bc, 16 palettes - call CopyBytes - ld hl, IntroBackgroundPalette - ld de, wBGPals2 - ld bc, 16 palettes - call CopyBytes - pop af - ldh [rSVBK], a - xor a - ldh [hSCX], a - ldh [hSCY], a - ld a, $7 - ldh [hWX], a - ld a, $90 - ldh [hWY], a - farcall ClearSpriteAnims - depixel 13, 11, 4, 0 - ld a, SPRITE_ANIM_INDEX_INTRO_SUICUNE - call InitSpriteAnimStruct - ld de, MUSIC_CRYSTAL_OPENING - call PlayMusic - xor a - ld [wGlobalAnimXOffset], a - call Intro_SetCGBPalUpdate - xor a - ld [wIntroSceneFrameCounter], a - ld [wIntroSceneTimer], a - call NextIntroScene - ret - -IntroScene14: -; Suicune runs then jumps. - ldh a, [hSCX] - sub 10 - ldh [hSCX], a - ld hl, wIntroSceneFrameCounter - ld a, [hl] - inc [hl] - cp $80 - jr z, .done - cp $60 - jr z, .jump - jr nc, .asm_e4e1a - cp $40 - jr nc, .asm_e4e33 - ret - -.jump - ld de, SFX_INTRO_SUICUNE_4 - call PlaySFX - -.asm_e4e1a - ld a, $1 - ld [wIntroSceneTimer], a - ld a, [wGlobalAnimXOffset] - cp $88 - jr c, .asm_e4e2c - sub $8 - ld [wGlobalAnimXOffset], a - ret - -.asm_e4e2c - farcall DeinitializeAllSprites - ret - -.asm_e4e33 - ld a, [wGlobalAnimXOffset] - sub $2 - ld [wGlobalAnimXOffset], a - ret - -.done - call NextIntroScene - ret - -IntroScene15: -; Transition to a new scene. - call Intro_ClearBGPals - call ClearSprites - call ClearTilemap - xor a - ldh [hBGMapMode], a - ld a, $1 - ldh [rVBK], a - ld hl, IntroSuicuneJumpAttrmap - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ld a, $0 - ldh [rVBK], a - ld hl, IntroSuicuneJumpGFX - ld de, vTiles2 tile $00 - call Intro_DecompressRequest2bpp_128Tiles - ld hl, IntroUnownBackGFX - ld de, vTiles0 tile $00 - call Intro_DecompressRequest2bpp_128Tiles - ld de, IntroGrass4GFX - ld hl, vTiles1 tile $00 - lb bc, BANK(IntroGrass4GFX), 1 - call Request2bpp - ld hl, IntroSuicuneJumpTilemap - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - call Intro_LoadTilemap - ldh a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ldh [rSVBK], a - ld hl, IntroSuicunePalette - ld de, wBGPals1 - ld bc, 16 palettes - call CopyBytes - ld hl, IntroSuicunePalette - ld de, wBGPals2 - ld bc, 16 palettes - call CopyBytes - pop af - ldh [rSVBK], a - xor a - ldh [hSCX], a - ld a, $90 - ldh [hSCY], a - ld a, $7 - ldh [hWX], a - ld a, $90 - ldh [hWY], a - farcall ClearSpriteAnims - call Intro_SetCGBPalUpdate - depixel 8, 5 - ld a, SPRITE_ANIM_INDEX_INTRO_UNOWN_F - call InitSpriteAnimStruct - depixel 12, 0 - ld a, SPRITE_ANIM_INDEX_INTRO_SUICUNE_AWAY - call InitSpriteAnimStruct - xor a - ld [wIntroSceneFrameCounter], a - ld [wIntroSceneTimer], a - call NextIntroScene - ret - -IntroScene16: -; Suicune shows its face. An Unown appears in front. - ld hl, wIntroSceneFrameCounter - ld a, [hl] - inc [hl] - cp $80 - jr nc, .done - call Intro_Scene16_AnimateSuicune - ldh a, [hSCY] - and a - ret z - add 8 - ldh [hSCY], a - ret -.done - call NextIntroScene - ret - -IntroScene17: -; ... - call Intro_ClearBGPals - call ClearSprites - call ClearTilemap - xor a - ldh [hBGMapMode], a - ld a, $1 - ldh [rVBK], a - ld hl, IntroSuicuneCloseAttrmap - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ld a, $0 - ldh [rVBK], a - ld hl, IntroSuicuneCloseGFX - ld de, vTiles1 tile $00 - call Intro_DecompressRequest2bpp_255Tiles - ld hl, IntroSuicuneCloseTilemap - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ldh a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ldh [rSVBK], a - ld hl, IntroSuicuneClosePalette - ld de, wBGPals1 - ld bc, 16 palettes - call CopyBytes - ld hl, IntroSuicuneClosePalette - ld de, wBGPals2 - ld bc, 16 palettes - call CopyBytes - pop af - ldh [rSVBK], a - xor a - ldh [hSCX], a - ldh [hSCY], a - ld a, $7 - ldh [hWX], a - ld a, $90 - ldh [hWY], a - farcall ClearSpriteAnims - call Intro_SetCGBPalUpdate - xor a - ld [wIntroSceneFrameCounter], a - ld [wIntroSceneTimer], a - call NextIntroScene - ret - -IntroScene18: -; Suicune close up. - ld hl, wIntroSceneFrameCounter - ld a, [hl] - inc [hl] - cp $60 - jr nc, .done - ldh a, [hSCX] - cp $60 - ret z - add 8 - ldh [hSCX], a - ret -.done - call NextIntroScene - ret - -IntroScene19: -; More setup. - call Intro_ClearBGPals - call ClearSprites - call ClearTilemap - xor a - ldh [hBGMapMode], a - ld a, $1 - ldh [rVBK], a - ld hl, IntroSuicuneBackAttrmap - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ld a, $0 - ldh [rVBK], a - ld hl, IntroSuicuneBackGFX - ld de, vTiles2 tile $00 - call Intro_DecompressRequest2bpp_128Tiles - ld hl, IntroUnownsGFX - ld de, vTiles1 tile $00 - call Intro_DecompressRequest2bpp_128Tiles - ld de, IntroGrass4GFX - ld hl, vTiles1 tile $7f - lb bc, BANK(IntroGrass4GFX), 1 - call Request2bpp - ld hl, IntroSuicuneBackTilemap - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - call Intro_LoadTilemap - ldh a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ldh [rSVBK], a - ld hl, IntroSuicunePalette - ld de, wBGPals1 - ld bc, 16 palettes - call CopyBytes - ld hl, IntroSuicunePalette - ld de, wBGPals2 - ld bc, 16 palettes - call CopyBytes - pop af - ldh [rSVBK], a - xor a - ldh [hSCX], a - ld a, $d8 - ldh [hSCY], a - ld a, $7 - ldh [hWX], a - ld a, $90 - ldh [hWY], a - farcall ClearSpriteAnims - ld hl, wSpriteAnimDict - xor a - ld [hli], a - ld [hl], $7f - call Intro_SetCGBPalUpdate - depixel 12, 0 - ld a, SPRITE_ANIM_INDEX_INTRO_SUICUNE_AWAY - call InitSpriteAnimStruct - xor a - ld [wIntroSceneFrameCounter], a - ld [wIntroSceneTimer], a - call NextIntroScene - ret - -IntroScene20: -; Suicune running away. A bunch of Unown appear. - ld hl, wIntroSceneFrameCounter - ld a, [hl] - inc [hl] - cp $98 - jr nc, .finished - cp $58 - ret nc - cp $40 - jr nc, .AppearUnown - cp $28 - ret nc - ldh a, [hSCY] - inc a - ldh [hSCY], a - ret - -.AppearUnown: - sub $18 - ld c, a - and $3 - cp $3 - ret nz - ld a, c - and $1c - srl a - srl a - ld [wIntroSceneTimer], a - xor a - call Intro_Scene20_AppearUnown - ret -; unused - ld a, c - and $1c - srl a - srl a - ld [wIntroSceneTimer], a - ld a, 1 - call Intro_Scene20_AppearUnown - ret - -.finished - call NextIntroScene - ret - -IntroScene21: -; Suicune gets more distant and turns black. - call Intro_ColoredSuicuneFrameSwap - ld c, 3 - call DelayFrames - xor a - ldh [hBGMapMode], a - ld [wIntroSceneFrameCounter], a - ld [wIntroSceneTimer], a - call NextIntroScene - ret - -IntroScene22: - ld hl, wIntroSceneFrameCounter - ld a, [hl] - inc [hl] - cp $8 - jr nc, .done - ret -.done - farcall DeinitializeAllSprites - call NextIntroScene - ret - -IntroScene23: - xor a - ld [wIntroSceneFrameCounter], a - call NextIntroScene - ret - -IntroScene24: -; Fade to white. - ld hl, wIntroSceneFrameCounter - ld a, [hl] - inc [hl] - cp $20 - jr nc, .done - - ld c, a - and $3 - ret nz - - ld a, c - and $1c - sla a - call Intro_Scene24_ApplyPaletteFade - ret - -.done - ld a, $40 - ld [wIntroSceneFrameCounter], a - call NextIntroScene - ret - -IntroScene25: -; Wait around a bit. - ld a, [wIntroSceneFrameCounter] - dec a - jr z, .done - ld [wIntroSceneFrameCounter], a - ret - -.done - call NextIntroScene - ret - -IntroScene26: -; Load the final scene. - call ClearBGPalettes - call ClearSprites - call ClearTilemap - xor a - ldh [hBGMapMode], a - ld a, $1 - ldh [rVBK], a - ld hl, IntroCrystalUnownsAttrmap - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ld a, $0 - ldh [rVBK], a - ld hl, IntroCrystalUnownsGFX - ld de, vTiles2 tile $00 - call Intro_DecompressRequest2bpp_128Tiles - ld hl, IntroCrystalUnownsTilemap - debgcoord 0, 0 - call Intro_DecompressRequest2bpp_64Tiles - ldh a, [rSVBK] - push af - ld a, BANK(wBGPals1) - ldh [rSVBK], a - ld hl, IntroCrystalUnownsPalette - ld de, wBGPals1 - ld bc, 16 palettes - call CopyBytes - ld hl, IntroCrystalUnownsPalette - ld de, wBGPals2 - ld bc, 16 palettes - call CopyBytes - pop af - ldh [rSVBK], a - xor a - ldh [hSCX], a - ldh [hSCY], a - ld a, $7 - ldh [hWX], a - ld a, $90 - ldh [hWY], a - farcall ClearSpriteAnims - call Intro_SetCGBPalUpdate - xor a - ld [wIntroSceneFrameCounter], a - ld [wIntroSceneTimer], a - call NextIntroScene - ret - -IntroScene27: -; Spell out C R Y S T A L with Unown. - ld hl, wIntroSceneTimer - inc [hl] - ld hl, wIntroSceneFrameCounter - ld a, [hl] - inc [hl] - cp $80 - jr nc, .done - - ld c, a - and $f - ld [wIntroSceneTimer], a - ld a, c - and $70 - swap a - call Intro_FadeUnownWordPals - ret - -.done - call NextIntroScene - ld a, $80 - ld [wIntroSceneFrameCounter], a - ret - -IntroScene28: -; Cut out when the music ends, and lead into the title screen. - ld hl, wIntroSceneFrameCounter - ld a, [hl] - and a - jr z, .done - dec [hl] - cp $18 - jr z, .clear - cp $8 - ret nz - - ld de, SFX_INTRO_WHOOSH - call PlaySFX - ret - -.clear - call ClearBGPalettes - ret - -.done - ld hl, wJumptableIndex - set 7, [hl] - ret - -Intro_Scene24_ApplyPaletteFade: -; load the (a)th palette from .FadePals to all wBGPals2 - ld hl, .FadePals - add l - ld l, a - ld a, $0 - adc h - ld h, a - - ldh a, [rSVBK] - push af - ld a, BANK(wBGPals2) - ldh [rSVBK], a - ld de, wBGPals2 - ld b, 8 ; number of BG pals -.loop1 - push hl - ld c, 1 palettes -.loop2 - ld a, [hli] - ld [de], a - inc de - dec c - jr nz, .loop2 - pop hl - dec b - jr nz, .loop1 - pop af - ldh [rSVBK], a - ld a, $1 - ldh [hCGBPalUpdate], a - ret - -.FadePals: -INCLUDE "gfx/intro/fade.pal" - -CrystalIntro_InitUnownAnim: - push de - ld a, SPRITE_ANIM_INDEX_INTRO_UNOWN - call InitSpriteAnimStruct - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld [hl], $8 - ld a, SPRITE_ANIM_FRAMESET_INTRO_UNOWN_4 - call ReinitSpriteAnimFrame - pop de - - push de - ld a, SPRITE_ANIM_INDEX_INTRO_UNOWN - call InitSpriteAnimStruct - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld [hl], $18 - ld a, SPRITE_ANIM_FRAMESET_INTRO_UNOWN_3 - call ReinitSpriteAnimFrame - pop de - - push de - ld a, SPRITE_ANIM_INDEX_INTRO_UNOWN - call InitSpriteAnimStruct - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld [hl], $28 - ld a, SPRITE_ANIM_FRAMESET_INTRO_UNOWN_1 - call ReinitSpriteAnimFrame - pop de - - ld a, SPRITE_ANIM_INDEX_INTRO_UNOWN - call InitSpriteAnimStruct - ld hl, SPRITEANIMSTRUCT_0C - add hl, bc - ld [hl], $38 - ld a, SPRITE_ANIM_FRAMESET_INTRO_UNOWN_2 - call ReinitSpriteAnimFrame - ret - -CrystalIntro_UnownFade: - add a - add a - add a - ld e, a - ld d, $0 - ld hl, wBGPals2 - add hl, de - inc hl - inc hl - ld a, [wIntroSceneTimer] - and %111111 - cp %011111 - jr z, .okay - jr c, .okay - ld c, a - ld a, %111111 - sub c -.okay - - ld c, a - ld b, $0 - ldh a, [rSVBK] - push af - ld a, BANK(wBGPals2) - ldh [rSVBK], a - - push hl - push bc - ld hl, wBGPals2 - ld bc, 8 palettes - xor a - call ByteFill - pop bc - pop hl - - push hl - ld hl, .BWFade - add hl, bc - add hl, bc - ld a, [hli] - ld d, [hl] - ld e, a - pop hl - ld a, e - ld [hli], a - ld a, d - ld [hli], a - - push hl - ld hl, .BlackLBlueFade - add hl, bc - add hl, bc - ld a, [hli] - ld d, [hl] - ld e, a - pop hl - ld a, e - ld [hli], a - ld a, d - ld [hli], a - - push hl - ld hl, .BlackBlueFade - add hl, bc - add hl, bc - ld a, [hli] - ld d, [hl] - ld e, a - pop hl - ld a, e - ld [hli], a - ld a, d - ld [hli], a - - pop af - ldh [rSVBK], a - ld a, $1 - ldh [hCGBPalUpdate], a - ret - -.BWFade: -; Fade between black and white. -hue = 0 -rept 32 - RGB hue, hue, hue -hue = hue + 1 -endr - -.BlackLBlueFade: -; Fade between black and light blue. -hue = 0 -rept 32 - RGB 0, hue / 2, hue -hue = hue + 1 -endr - -.BlackBlueFade: -; Fade between black and blue. -hue = 0 -rept 32 - RGB 0, 0, hue -hue = hue + 1 -endr - -Intro_Scene20_AppearUnown: -; Spawn the palette for the nth Unown - and a - jr nz, .load_pal_2 - - ld hl, .pal1 - jr .got_pointer - -.load_pal_2 - ld hl, .pal2 - -.got_pointer - ld a, [wIntroSceneTimer] - and $7 - add a - add a - add a - ld c, a - ldh a, [rSVBK] - push af - ld a, BANK(wBGPals2) - ldh [rSVBK], a - - push bc - ld de, wBGPals2 - - ld a, c - add e - ld e, a - ld a, $0 - adc d - ld d, a - - ld bc, 1 palettes - call CopyBytes - pop bc - - ld de, wBGPals1 - ld a, c - add e - ld e, a - ld a, $0 - adc d - ld d, a - - ld bc, 1 palettes - call CopyBytes - - pop af - ldh [rSVBK], a - ld a, $1 - ldh [hCGBPalUpdate], a - ret - -.pal1 - RGB 24, 12, 09 - RGB 31, 31, 31 - RGB 12, 00, 31 - RGB 00, 00, 00 - -.pal2 - RGB 24, 12, 09 - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 31, 31, 31 - -Intro_FadeUnownWordPals: - add a - add a - add a - ld e, a - ld d, $0 - ld hl, wBGPals2 - add hl, de -rept 4 - inc hl -endr - ld a, [wIntroSceneTimer] - add a - ld c, a - ld b, $0 - - ldh a, [rSVBK] - push af - ld a, BANK(wBGPals2) - ldh [rSVBK], a - - push hl - ld hl, .FastFadePalettes - add hl, bc - ld a, [hli] - ld d, [hl] - ld e, a - pop hl - ld a, e - ld [hli], a - ld a, d - ld [hli], a - - push hl - ld hl, .SlowFadePalettes - add hl, bc - ld a, [hli] - ld d, [hl] - ld e, a - pop hl - ld a, e - ld [hli], a - ld a, d - ld [hli], a - - pop af - ldh [rSVBK], a - ld a, $1 - ldh [hCGBPalUpdate], a - ret - -.FastFadePalettes: -hue = 31 -rept 8 - RGB hue, hue, hue -hue = hue - 1 - RGB hue, hue, hue -hue = hue - 2 -endr - -.SlowFadePalettes: -hue = 31 -rept 16 - RGB hue, hue, hue -hue = hue - 1 -endr - -Intro_LoadTilemap: - ldh a, [rSVBK] - push af - ld a, BANK(wDecompressScratch) - ldh [rSVBK], a - - ld hl, wDecompressScratch - decoord 0, 0 - ld b, SCREEN_HEIGHT -.row - ld c, SCREEN_WIDTH -.col - ld a, [hli] - ld [de], a - inc de - dec c - jr nz, .col - ld a, BG_MAP_WIDTH - SCREEN_WIDTH - add l - ld l, a - ld a, 0 - adc h - ld h, a - dec b - jr nz, .row - - pop af - ldh [rSVBK], a - ret - -Intro_Scene16_AnimateSuicune: - ld a, [wIntroSceneFrameCounter] - and $3 - jr z, Intro_ColoredSuicuneFrameSwap - cp $3 - jr z, .PrepareForSuicuneSwap - ret - -.PrepareForSuicuneSwap: - xor a - ldh [hBGMapMode], a - ret - -Intro_ColoredSuicuneFrameSwap: - hlcoord 0, 0 - ld bc, SCREEN_HEIGHT * SCREEN_WIDTH -.loop - ld a, [hl] - and a - jr z, .skip - cp $80 - jr nc, .skip - xor $8 - ld [hl], a -.skip - inc hl - dec bc - ld a, c - or b - jr nz, .loop - ld a, $1 - ldh [hBGMapMode], a - ret - -Intro_RustleGrass: - ld a, [wIntroSceneFrameCounter] - cp 36 - ret nc - and $c - srl a - ld e, a - ld d, $0 - ld hl, .RustlingGrassPointers - add hl, de - ld a, [hli] - ld [wRequested2bppSource], a - ld a, [hli] - ld [wRequested2bppSource + 1], a - ld a, LOW(vTiles2 tile $09) - ld [wRequested2bppDest], a - ld a, HIGH(vTiles2 tile $09) - ld [wRequested2bppDest + 1], a - ld a, 4 - ld [wRequested2bppSize], a - ret - -.RustlingGrassPointers: - dw IntroGrass1GFX - dw IntroGrass2GFX - dw IntroGrass3GFX - dw IntroGrass2GFX - -Intro_SetCGBPalUpdate: - ld a, $1 - ldh [hCGBPalUpdate], a - ret - -Intro_ClearBGPals: - ldh a, [rSVBK] - push af - ld a, BANK(wBGPals2) - ldh [rSVBK], a - - ld hl, wBGPals2 - ld bc, 16 palettes - xor a - call ByteFill - - pop af - ldh [rSVBK], a - ld a, $1 - ldh [hCGBPalUpdate], a - call DelayFrame - call DelayFrame - ret - -Intro_DecompressRequest2bpp_128Tiles: - ldh a, [rSVBK] - push af - ld a, BANK(wDecompressScratch) - ldh [rSVBK], a - - push de - ld de, wDecompressScratch - call Decompress - pop hl - - ld de, wDecompressScratch - lb bc, $01, $80 - call Request2bpp - - pop af - ldh [rSVBK], a - ret - -Intro_DecompressRequest2bpp_255Tiles: - ldh a, [rSVBK] - push af - ld a, BANK(wDecompressScratch) - ldh [rSVBK], a - - push de - ld de, wDecompressScratch - call Decompress - pop hl - - ld de, wDecompressScratch - lb bc, $01, $ff - call Request2bpp - - pop af - ldh [rSVBK], a - ret - -Intro_DecompressRequest2bpp_64Tiles: - ldh a, [rSVBK] - push af - ld a, BANK(wDecompressScratch) - ldh [rSVBK], a - - push de - ld de, wDecompressScratch - call Decompress - pop hl - - ld de, wDecompressScratch - lb bc, $01, $40 - call Request2bpp - - pop af - ldh [rSVBK], a - ret - -Intro_ResetLYOverrides: - ldh a, [rSVBK] - push af - ld a, BANK(wLYOverrides) - ldh [rSVBK], a - - ld hl, wLYOverrides - ld bc, wLYOverridesEnd - wLYOverrides - xor a - call ByteFill - - pop af - ldh [rSVBK], a - ld a, LOW(rSCX) - ldh [hLCDCPointer], a - ret - -Intro_PerspectiveScrollBG: - ldh a, [rSVBK] - push af - ld a, BANK(wLYOverrides) - ldh [rSVBK], a - ; Scroll the grass every frame. - ; Scroll the trees every other frame and at half speed. - ; This creates an illusion of perspective. - ld a, [wIntroSceneFrameCounter] - and $1 - jr z, .skip - ; trees in the back - ld hl, wLYOverrides - ld a, [hl] - inc a - ld bc, $5f - call ByteFill -.skip - ; grass in the front - ld hl, wLYOverrides + $5f - ld a, [hl] - inc a - inc a - ld bc, $31 - call ByteFill - ld a, [wLYOverrides + 0] - ldh [hSCX], a - pop af - ldh [rSVBK], a - ret - -IntroSuicuneRunGFX: -INCBIN "gfx/intro/suicune_run.2bpp.lz" - -IntroPichuWooperGFX: -INCBIN "gfx/intro/pichu_wooper.2bpp.lz" - -IntroBackgroundGFX: -INCBIN "gfx/intro/background.2bpp.lz" - -IntroBackgroundTilemap: -INCBIN "gfx/intro/background.tilemap.lz" - -IntroBackgroundAttrmap: -INCBIN "gfx/intro/background.attrmap.lz" - -IntroBackgroundPalette: -INCLUDE "gfx/intro/background.pal" - -IntroUnownsGFX: -INCBIN "gfx/intro/unowns.2bpp.lz" - -IntroPulseGFX: -INCBIN "gfx/intro/pulse.2bpp.lz" - -IntroUnownATilemap: -INCBIN "gfx/intro/unown_a.tilemap.lz" - -IntroUnownAAttrmap: -INCBIN "gfx/intro/unown_a.attrmap.lz" - -IntroUnownHITilemap: -INCBIN "gfx/intro/unown_hi.tilemap.lz" - -IntroUnownHIAttrmap: -INCBIN "gfx/intro/unown_hi.attrmap.lz" - -IntroUnownsTilemap: -INCBIN "gfx/intro/unowns.tilemap.lz" - -IntroUnownsAttrmap: -INCBIN "gfx/intro/unowns.attrmap.lz" - -IntroUnownsPalette: -INCLUDE "gfx/intro/unowns.pal" - -IntroCrystalUnownsGFX: -INCBIN "gfx/intro/crystal_unowns.2bpp.lz" - -IntroCrystalUnownsTilemap: -INCBIN "gfx/intro/crystal_unowns.tilemap.lz" - -IntroCrystalUnownsAttrmap: -INCBIN "gfx/intro/crystal_unowns.attrmap.lz" - -IntroCrystalUnownsPalette: -INCLUDE "gfx/intro/crystal_unowns.pal" - -IntroSuicuneCloseGFX: -INCBIN "gfx/intro/suicune_close.2bpp.lz" - -IntroSuicuneCloseTilemap: -INCBIN "gfx/intro/suicune_close.tilemap.lz" - -IntroSuicuneCloseAttrmap: -INCBIN "gfx/intro/suicune_close.attrmap.lz" - -IntroSuicuneClosePalette: -INCLUDE "gfx/intro/suicune_close.pal" - -IntroSuicuneJumpGFX: -INCBIN "gfx/intro/suicune_jump.2bpp.lz" - -IntroSuicuneBackGFX: -INCBIN "gfx/intro/suicune_back.2bpp.lz" - -IntroSuicuneJumpTilemap: -INCBIN "gfx/intro/suicune_jump.tilemap.lz" - -IntroSuicuneJumpAttrmap: -INCBIN "gfx/intro/suicune_jump.attrmap.lz" - -IntroSuicuneBackTilemap: -INCBIN "gfx/intro/suicune_back.tilemap.lz" - -IntroSuicuneBackAttrmap: -INCBIN "gfx/intro/suicune_back.attrmap.lz" - -IntroSuicunePalette: -INCLUDE "gfx/intro/suicune.pal" - -IntroUnownBackGFX: -INCBIN "gfx/intro/unown_back.2bpp.lz" - -IntroGrass1GFX: -INCBIN "gfx/intro/grass1.2bpp" -IntroGrass2GFX: -INCBIN "gfx/intro/grass2.2bpp" -IntroGrass3GFX: -INCBIN "gfx/intro/grass3.2bpp" -IntroGrass4GFX: -INCBIN "gfx/intro/grass4.2bpp" diff --git a/engine/movie/intro.asm b/engine/movie/intro.asm new file mode 100644 index 000000000..0a88f8ab7 --- /dev/null +++ b/engine/movie/intro.asm @@ -0,0 +1,2135 @@ +Copyright_GFPresents: +; Play the copyright screen and GameFreak Presents sequence. +; Return carry if user cancels animation by pressing a button. + + ld de, MUSIC_NONE + call PlayMusic + call ClearBGPalettes + call ClearTilemap + ld a, HIGH(vBGMap0) + ldh [hBGMapAddress + 1], a + xor a ; LOW(vBGMap0) + ldh [hBGMapAddress], a + ldh [hJoyDown], a + ldh [hSCX], a + ldh [hSCY], a + ld a, $90 + ldh [hWY], a + call WaitBGMap + ld b, SCGB_GAMEFREAK_LOGO + call GetSGBLayout + call SetPalettes + ld c, 10 + call DelayFrames + callfar Copyright + call WaitBGMap + ld c, 100 + call DelayFrames + call ClearTilemap + farcall GBCOnlyScreen + call .GetGFLogoGFX +.joy_loop + call JoyTextDelay + ldh a, [hJoyLast] + and BUTTONS + jr nz, .pressed_button + ld a, [wJumptableIndex] + bit 7, a + jr nz, .finish + call PlaceGameFreakPresents + farcall PlaySpriteAnimations + call DelayFrame + jr .joy_loop + +.pressed_button + call .StopGamefreakAnim + scf + ret + +.finish + call .StopGamefreakAnim + and a + ret + +.GetGFLogoGFX: + ld de, GameFreakLogo + ld hl, vTiles2 + lb bc, BANK(GameFreakLogo), 28 + call Get1bpp + + ldh a, [rSVBK] + push af + ld a, BANK(wDecompressScratch) + ldh [rSVBK], a + + ld hl, IntroLogoGFX + ld de, wDecompressScratch + ld a, BANK(IntroLogoGFX) + call FarDecompress + + ld hl, vTiles0 + ld de, wDecompressScratch + lb bc, 1, 8 tiles + call Request2bpp + + ld hl, vTiles1 + ld de, wDecompressScratch + $80 tiles + lb bc, 1, 8 tiles + call Request2bpp + + pop af + ldh [rSVBK], a + + farcall ClearSpriteAnims + depixel 10, 11, 4, 0 + ld a, SPRITE_ANIM_INDEX_GAMEFREAK_LOGO + call InitSpriteAnimStruct + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], $a0 + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $60 + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld [hl], $30 + xor a + ld [wJumptableIndex], a + ld [wIntroSceneFrameCounter], a + ld [wIntroSceneTimer], a + ldh [hSCX], a + ldh [hSCY], a + ld a, $1 + ldh [hBGMapMode], a + ld a, $90 + ldh [hWY], a + lb de, %11100100, %11100100 + call DmgToCgbObjPals + ret + +.StopGamefreakAnim: + farcall ClearSpriteAnims + call ClearTilemap + call ClearSprites + ld c, 16 + call DelayFrames + ret + +PlaceGameFreakPresents: + ld a, [wJumptableIndex] + 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 PlaceGameFreakPresents_0 + dw PlaceGameFreakPresents_1 + dw PlaceGameFreakPresents_2 + dw PlaceGameFreakPresents_3 + +PlaceGameFreakPresents_AdvanceIndex: + ld hl, wJumptableIndex + inc [hl] + ret + +PlaceGameFreakPresents_0: + ret + +PlaceGameFreakPresents_1: + ld hl, wIntroSceneTimer + ld a, [hl] + cp $20 + jr nc, .PlaceGameFreak + inc [hl] + ret + +.PlaceGameFreak: + ld [hl], 0 + ld hl, .GAME_FREAK + decoord 5, 10 + ld bc, .end - .GAME_FREAK + call CopyBytes + call PlaceGameFreakPresents_AdvanceIndex + ld de, SFX_GAME_FREAK_PRESENTS + call PlaySFX + ret + +.GAME_FREAK: + ; G A M E _ F R E A K + db 0, 1, 2, 3, 13, 4, 5, 3, 1, 6 +.end + db "@" + +PlaceGameFreakPresents_2: + ld hl, wIntroSceneTimer + ld a, [hl] + cp $40 + jr nc, .place_presents + inc [hl] + ret + +.place_presents + ld [hl], 0 + ld hl, .presents + decoord 7, 11 + ld bc, .end - .presents + call CopyBytes + call PlaceGameFreakPresents_AdvanceIndex + ret + +.presents + db 7, 8, 9, 10, 11, 12 +.end + db "@" + +PlaceGameFreakPresents_3: + ld hl, wIntroSceneTimer + ld a, [hl] + cp $80 + jr nc, .finish + inc [hl] + ret + +.finish + ld hl, wJumptableIndex + set 7, [hl] + ret + +GameFreakLogoJumper: + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld e, [hl] + ld d, 0 + ld hl, GameFreakLogoScenes + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +GameFreakLogoScenes: + dw GameFreakLogoScene1 + dw GameFreakLogoScene2 + dw GameFreakLogoScene3 + dw GameFreakLogoScene4 + dw GameFreakLogoScene5 + +GameFreakLogoScene1: + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + inc [hl] + ret + +GameFreakLogoScene2: + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + and a + jr z, .asm_e4747 + ld d, a + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + and %111111 + cp %100000 + jr nc, .asm_e4723 + add %100000 +.asm_e4723 + ld e, a + farcall BattleAnim_Sine_e + ld hl, SPRITEANIMSTRUCT_YOFFSET + add hl, bc + ld [hl], e + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + dec [hl] + and $1f + ret nz + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld a, [hl] + sub $30 + ld [hl], a + ld de, SFX_DITTO_BOUNCE + call PlaySFX + ret + +.asm_e4747 + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + inc [hl] + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld [hl], $0 + ld de, SFX_DITTO_POP_UP + call PlaySFX + ret + +GameFreakLogoScene3: + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + cp $20 + jr nc, .asm_e4764 + inc [hl] + ret + +.asm_e4764 + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + inc [hl] + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld [hl], $0 + ld de, SFX_DITTO_TRANSFORM + call PlaySFX + ret + +GameFreakLogoScene4: + ld hl, SPRITEANIMSTRUCT_0D + add hl, bc + ld a, [hl] + cp $40 + jr z, .asm_e47a3 + inc [hl] + srl a + srl a + ld e, a + ld d, $0 + ld hl, GameFreakLogoPalettes + add hl, de + add hl, de + ldh a, [rSVBK] + push af + ld a, BANK(wOBPals2) + ldh [rSVBK], a + ld a, [hli] + ld [wOBPals2 + 12], a + ld a, [hli] + ld [wOBPals2 + 13], a + pop af + ldh [rSVBK], a + ld a, $1 + ldh [hCGBPalUpdate], a + ret + +.asm_e47a3 + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + inc [hl] + call PlaceGameFreakPresents_AdvanceIndex +GameFreakLogoScene5: + ret + +GameFreakLogoPalettes: +INCLUDE "gfx/intro/gamefreak_logo.pal" + +GameFreakLogo: +INCBIN "gfx/splash/logo1.1bpp" +INCBIN "gfx/splash/logo2.1bpp" + +CrystalIntro: + ldh a, [rSVBK] + push af + ld a, BANK(wGBCPalettes) + ldh [rSVBK], a + ldh a, [hInMenu] + push af + ldh a, [hVBlank] + push af + call .InitRAMAddrs +.loop + call JoyTextDelay + ldh a, [hJoyLast] + and BUTTONS + jr nz, .ShutOffMusic + ld a, [wJumptableIndex] + bit 7, a + jr nz, .done + call IntroSceneJumper + farcall PlaySpriteAnimations + call DelayFrame + jp .loop + +.ShutOffMusic: + ld de, MUSIC_NONE + call PlayMusic + +.done + call ClearBGPalettes + call ClearSprites + call ClearTilemap + xor a + ldh [hSCX], a + ldh [hSCY], a + ld a, $7 + ldh [hWX], a + ld a, $90 + ldh [hWY], a + pop af + ldh [hVBlank], a + pop af + ldh [hInMenu], a + pop af + ldh [rSVBK], a + ret + +.InitRAMAddrs: + xor a + ldh [hVBlank], a + ld a, $1 + ldh [hInMenu], a + xor a + ldh [hMapAnims], a + ld [wJumptableIndex], a + ret + +IntroSceneJumper: + ld a, [wJumptableIndex] + ld e, a + ld d, 0 + ld hl, IntroScenes + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +IntroScenes: + dw IntroScene1 + dw IntroScene2 + dw IntroScene3 + dw IntroScene4 + dw IntroScene5 + dw IntroScene6 + dw IntroScene7 + dw IntroScene8 + dw IntroScene9 + dw IntroScene10 + dw IntroScene11 + dw IntroScene12 + dw IntroScene13 + dw IntroScene14 + dw IntroScene15 + dw IntroScene16 + dw IntroScene17 + dw IntroScene18 + dw IntroScene19 + dw IntroScene20 + dw IntroScene21 + dw IntroScene22 + dw IntroScene23 + dw IntroScene24 + dw IntroScene25 + dw IntroScene26 + dw IntroScene27 + dw IntroScene28 + +NextIntroScene: + ld hl, wJumptableIndex + inc [hl] + ret + +IntroScene1: +; Setup the next scene. + call Intro_ClearBGPals + call ClearSprites + call ClearTilemap + xor a + ldh [hBGMapMode], a + ld a, $1 + ldh [rVBK], a + ld hl, IntroUnownAAttrmap + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ld a, $0 + ldh [rVBK], a + ld hl, IntroUnownsGFX + ld de, vTiles2 tile $00 + call Intro_DecompressRequest2bpp_128Tiles + ld hl, IntroPulseGFX + ld de, vTiles0 tile $00 + call Intro_DecompressRequest2bpp_128Tiles + ld hl, IntroUnownATilemap + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ldh a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ldh [rSVBK], a + ld hl, IntroUnownsPalette + ld de, wBGPals1 + ld bc, 16 palettes + call CopyBytes + ld hl, IntroUnownsPalette + ld de, wBGPals2 + ld bc, 16 palettes + call CopyBytes + pop af + ldh [rSVBK], a + xor a + ldh [hSCX], a + ldh [hSCY], a + ld a, $7 + ldh [hWX], a + ld a, $90 + ldh [hWY], a + farcall ClearSpriteAnims + call Intro_SetCGBPalUpdate + xor a + ld [wIntroSceneFrameCounter], a + ld [wIntroSceneTimer], a + call NextIntroScene + ret + +IntroScene2: +; First Unown (A) fades in, pulses, then fades out. + ld hl, wIntroSceneFrameCounter + ld a, [hl] + inc [hl] + cp $80 + jr nc, .endscene + cp $60 + jr nz, .DontPlaySound + push af + depixel 11, 11 + call CrystalIntro_InitUnownAnim + ld de, SFX_INTRO_UNOWN_1 + call PlaySFX + pop af +.DontPlaySound: + ld [wIntroSceneTimer], a + xor a + call CrystalIntro_UnownFade + ret +.endscene + call NextIntroScene + ret + +IntroScene3: +; More setup. Transition to the outdoor scene. + call Intro_ClearBGPals + call ClearSprites + call ClearTilemap + xor a + ldh [hBGMapMode], a + ld a, $1 + ldh [rVBK], a + ld hl, IntroBackgroundAttrmap + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ld a, $0 + ldh [rVBK], a + ld hl, IntroBackgroundGFX + ld de, vTiles2 tile $00 + call Intro_DecompressRequest2bpp_128Tiles + ld hl, IntroBackgroundTilemap + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ldh a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ldh [rSVBK], a + ld hl, IntroBackgroundPalette + ld de, wBGPals1 + ld bc, 16 palettes + call CopyBytes + ld hl, IntroBackgroundPalette + ld de, wBGPals2 + ld bc, 16 palettes + call CopyBytes + pop af + ldh [rSVBK], a + xor a + ldh [hSCX], a + ldh [hSCY], a + ld a, $7 + ldh [hWX], a + ld a, $90 + ldh [hWY], a + call Intro_ResetLYOverrides + call Intro_SetCGBPalUpdate + xor a + ld [wIntroSceneFrameCounter], a + call NextIntroScene + ret + +IntroScene4: +; Scroll the outdoor panorama for a bit. + call Intro_PerspectiveScrollBG + ld hl, wIntroSceneFrameCounter + ld a, [hl] + cp $80 + jr z, .endscene + inc [hl] + ret + +.endscene + call NextIntroScene + ret + +IntroScene5: +; Go back to the Unown. + call Intro_ClearBGPals + call ClearSprites + call ClearTilemap + xor a + ldh [hBGMapMode], a + ldh [hLCDCPointer], a + ld a, $1 + ldh [rVBK], a + ld hl, IntroUnownHIAttrmap + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ld a, $0 + ldh [rVBK], a + ld hl, IntroUnownsGFX + ld de, vTiles2 tile $00 + call Intro_DecompressRequest2bpp_128Tiles + ld hl, IntroPulseGFX + ld de, vTiles0 tile $00 + call Intro_DecompressRequest2bpp_128Tiles + ld hl, IntroUnownHITilemap + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ldh a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ldh [rSVBK], a + ld hl, IntroUnownsPalette + ld de, wBGPals1 + ld bc, 16 palettes + call CopyBytes + ld hl, IntroUnownsPalette + ld de, wBGPals2 + ld bc, 16 palettes + call CopyBytes + pop af + ldh [rSVBK], a + xor a + ldh [hSCX], a + ldh [hSCY], a + ld a, $7 + ldh [hWX], a + ld a, $90 + ldh [hWY], a + farcall ClearSpriteAnims + call Intro_SetCGBPalUpdate + xor a + ld [wIntroSceneFrameCounter], a + ld [wIntroSceneTimer], a + call NextIntroScene + ret + +IntroScene6: +; Two more Unown (I, H) fade in. + ld hl, wIntroSceneFrameCounter + ld a, [hl] + inc [hl] + cp $80 + jr nc, .endscene + cp $60 + jr z, .SecondUnown + cp $40 + jr nc, .StopUnown + cp $20 + jr z, .FirstUnown + jr .NoUnown + +.FirstUnown: + push af + depixel 7, 15 + call CrystalIntro_InitUnownAnim + ld de, SFX_INTRO_UNOWN_2 + call PlaySFX + pop af +.NoUnown: + ld [wIntroSceneTimer], a + xor a + call CrystalIntro_UnownFade + ret + +.SecondUnown: + push af + depixel 14, 6 + call CrystalIntro_InitUnownAnim + ld de, SFX_INTRO_UNOWN_1 + call PlaySFX + pop af +.StopUnown: + ld [wIntroSceneTimer], a + ld a, $1 + call CrystalIntro_UnownFade + ret + +.endscene + call NextIntroScene + ret + +IntroScene7: +; Back to the outdoor scene. + call Intro_ClearBGPals + call ClearSprites + call ClearTilemap + xor a + ldh [hBGMapMode], a + + ld a, $1 + ldh [rVBK], a + ld hl, IntroBackgroundAttrmap + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + + ld hl, IntroPichuWooperGFX + ld de, vTiles0 tile $00 + call Intro_DecompressRequest2bpp_128Tiles + + ld a, $0 + ldh [rVBK], a + ld hl, IntroSuicuneRunGFX + ld de, vTiles0 tile $00 + call Intro_DecompressRequest2bpp_255Tiles + + ld hl, IntroBackgroundGFX + ld de, vTiles2 tile $00 + call Intro_DecompressRequest2bpp_128Tiles + + ld hl, IntroBackgroundTilemap + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + + ldh a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ldh [rSVBK], a + + ld hl, IntroBackgroundPalette + ld de, wBGPals1 + ld bc, 16 palettes + call CopyBytes + + ld hl, IntroBackgroundPalette + ld de, wBGPals2 + ld bc, 16 palettes + call CopyBytes + + pop af + ldh [rSVBK], a + + xor a + ldh [hSCX], a + ldh [hSCY], a + ld a, $7 + ldh [hWX], a + ld a, $90 + ldh [hWY], a + call Intro_ResetLYOverrides + farcall ClearSpriteAnims + depixel 13, 27, 4, 0 + ld a, SPRITE_ANIM_INDEX_INTRO_SUICUNE + call InitSpriteAnimStruct + ld a, $f0 + ld [wGlobalAnimXOffset], a + call Intro_SetCGBPalUpdate + xor a + ld [wIntroSceneFrameCounter], a + ld [wIntroSceneTimer], a + call NextIntroScene + ret + +IntroScene8: +; Scroll the scene, then show Suicune running across the screen. + ld hl, wIntroSceneFrameCounter + ld a, [hl] + inc [hl] + cp $40 + jr z, .suicune_sound + jr nc, .animate_suicune + call Intro_PerspectiveScrollBG + ret + +.suicune_sound + ld de, SFX_INTRO_SUICUNE_3 + call PlaySFX +.animate_suicune + ld a, [wGlobalAnimXOffset] + and a + jr z, .finish + sub $8 + ld [wGlobalAnimXOffset], a + ret + +.finish + ld de, SFX_INTRO_SUICUNE_2 + call PlaySFX + farcall DeinitializeAllSprites + call NextIntroScene + ret + +IntroScene9: +; Set up the next scene (same bg). + xor a + ldh [hLCDCPointer], a + call ClearSprites + hlcoord 0, 0, wAttrmap + ; first 12 rows have palette 1 + ld bc, 12 * SCREEN_WIDTH + ld a, $1 + call ByteFill + ; middle 3 rows have palette 2 + ld bc, 3 * SCREEN_WIDTH + ld a, $2 + call ByteFill + ; last three rows have palette 3 + ld bc, 3 * SCREEN_WIDTH + ld a, $3 + call ByteFill + ld a, $2 + ldh [hBGMapMode], a + call DelayFrame + call DelayFrame + call DelayFrame + ld a, LOW(vBGMap0 + $c) ; $c + ldh [hBGMapAddress], a + call DelayFrame + call DelayFrame + call DelayFrame + xor a + ldh [hBGMapMode], a + ldh [hBGMapAddress], a + ld [wGlobalAnimXOffset], a + xor a + ld [wIntroSceneFrameCounter], a + call NextIntroScene + ret + +IntroScene10: +; Wooper and Pichu enter. + call Intro_RustleGrass + ld hl, wIntroSceneFrameCounter + ld a, [hl] + inc [hl] + cp $c0 + jr z, .done + cp $20 + jr z, .wooper + cp $40 + jr z, .pichu + ret + +.pichu + depixel 21, 16, 1, 0 + ld a, SPRITE_ANIM_INDEX_INTRO_PICHU + call InitSpriteAnimStruct + ld de, SFX_INTRO_PICHU + call PlaySFX + ret + +.wooper + depixel 22, 6 + ld a, SPRITE_ANIM_INDEX_INTRO_WOOPER + call InitSpriteAnimStruct + ld de, SFX_INTRO_PICHU + call PlaySFX + ret +.done + call NextIntroScene + ret + +IntroScene11: +; Back to Unown again. + call Intro_ClearBGPals + call ClearSprites + call ClearTilemap + xor a + ldh [hBGMapMode], a + ldh [hLCDCPointer], a + ld a, $1 + ldh [rVBK], a + ld hl, IntroUnownsAttrmap + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ld a, $0 + ldh [rVBK], a + ld hl, IntroUnownsGFX + ld de, vTiles2 tile $00 + call Intro_DecompressRequest2bpp_128Tiles + ld hl, IntroUnownsTilemap + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ldh a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ldh [rSVBK], a + ld hl, IntroUnownsPalette + ld de, wBGPals1 + ld bc, 16 palettes + call CopyBytes + ld hl, IntroUnownsPalette + ld de, wBGPals2 + ld bc, 16 palettes + call CopyBytes + pop af + ldh [rSVBK], a + xor a + ldh [hSCX], a + ldh [hSCY], a + ld a, $7 + ldh [hWX], a + ld a, $90 + ldh [hWY], a + farcall ClearSpriteAnims + call Intro_SetCGBPalUpdate + xor a + ld [wIntroSceneFrameCounter], a + ld [wIntroSceneTimer], a + call NextIntroScene + ret + +IntroScene12: +; Even more Unown. + call .PlayUnownSound + ld hl, wIntroSceneFrameCounter + ld a, [hl] + inc [hl] + cp $c0 + jr nc, .done + cp $80 + jr nc, .second_half +; first half + ld c, a + and $1f + sla a + ld [wIntroSceneTimer], a + ld a, c + and $e0 + srl a + swap a + call CrystalIntro_UnownFade + ret + +.second_half +; double speed + ld c, a + and $f + sla a + sla a + ld [wIntroSceneTimer], a + ld a, c + and $70 + or $40 + swap a + call CrystalIntro_UnownFade + ret + +.done + call NextIntroScene + ret + +.PlayUnownSound: + ld a, [wIntroSceneFrameCounter] + ld c, a + ld hl, .UnownSounds +.loop + ld a, [hli] + cp -1 + ret z + cp c + jr z, .playsound + inc hl + inc hl + jr .loop +.playsound + ld a, [hli] + ld d, [hl] + ld e, a + push de + call SFXChannelsOff + pop de + call PlaySFX + ret + +.UnownSounds: + dbw $00, SFX_INTRO_UNOWN_3 + dbw $20, SFX_INTRO_UNOWN_2 + dbw $40, SFX_INTRO_UNOWN_1 + dbw $60, SFX_INTRO_UNOWN_2 + dbw $80, SFX_INTRO_UNOWN_3 + dbw $90, SFX_INTRO_UNOWN_2 + dbw $a0, SFX_INTRO_UNOWN_1 + dbw $b0, SFX_INTRO_UNOWN_2 + db -1 + +IntroScene13: +; Switch scenes again. + call Intro_ClearBGPals + call ClearSprites + call ClearTilemap + xor a + ldh [hBGMapMode], a + ld a, $1 + ldh [rVBK], a + ld hl, IntroBackgroundAttrmap + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ld a, $0 + ldh [rVBK], a + ld hl, IntroSuicuneRunGFX + ld de, vTiles0 tile $00 + call Intro_DecompressRequest2bpp_255Tiles + ld hl, IntroBackgroundGFX + ld de, vTiles2 tile $00 + call Intro_DecompressRequest2bpp_128Tiles + ld hl, IntroBackgroundTilemap + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ldh a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ldh [rSVBK], a + ld hl, IntroBackgroundPalette + ld de, wBGPals1 + ld bc, 16 palettes + call CopyBytes + ld hl, IntroBackgroundPalette + ld de, wBGPals2 + ld bc, 16 palettes + call CopyBytes + pop af + ldh [rSVBK], a + xor a + ldh [hSCX], a + ldh [hSCY], a + ld a, $7 + ldh [hWX], a + ld a, $90 + ldh [hWY], a + farcall ClearSpriteAnims + depixel 13, 11, 4, 0 + ld a, SPRITE_ANIM_INDEX_INTRO_SUICUNE + call InitSpriteAnimStruct + ld de, MUSIC_CRYSTAL_OPENING + call PlayMusic + xor a + ld [wGlobalAnimXOffset], a + call Intro_SetCGBPalUpdate + xor a + ld [wIntroSceneFrameCounter], a + ld [wIntroSceneTimer], a + call NextIntroScene + ret + +IntroScene14: +; Suicune runs then jumps. + ldh a, [hSCX] + sub 10 + ldh [hSCX], a + ld hl, wIntroSceneFrameCounter + ld a, [hl] + inc [hl] + cp $80 + jr z, .done + cp $60 + jr z, .jump + jr nc, .asm_e4e1a + cp $40 + jr nc, .asm_e4e33 + ret + +.jump + ld de, SFX_INTRO_SUICUNE_4 + call PlaySFX + +.asm_e4e1a + ld a, $1 + ld [wIntroSceneTimer], a + ld a, [wGlobalAnimXOffset] + cp $88 + jr c, .asm_e4e2c + sub $8 + ld [wGlobalAnimXOffset], a + ret + +.asm_e4e2c + farcall DeinitializeAllSprites + ret + +.asm_e4e33 + ld a, [wGlobalAnimXOffset] + sub $2 + ld [wGlobalAnimXOffset], a + ret + +.done + call NextIntroScene + ret + +IntroScene15: +; Transition to a new scene. + call Intro_ClearBGPals + call ClearSprites + call ClearTilemap + xor a + ldh [hBGMapMode], a + ld a, $1 + ldh [rVBK], a + ld hl, IntroSuicuneJumpAttrmap + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ld a, $0 + ldh [rVBK], a + ld hl, IntroSuicuneJumpGFX + ld de, vTiles2 tile $00 + call Intro_DecompressRequest2bpp_128Tiles + ld hl, IntroUnownBackGFX + ld de, vTiles0 tile $00 + call Intro_DecompressRequest2bpp_128Tiles + ld de, IntroGrass4GFX + ld hl, vTiles1 tile $00 + lb bc, BANK(IntroGrass4GFX), 1 + call Request2bpp + ld hl, IntroSuicuneJumpTilemap + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + call Intro_LoadTilemap + ldh a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ldh [rSVBK], a + ld hl, IntroSuicunePalette + ld de, wBGPals1 + ld bc, 16 palettes + call CopyBytes + ld hl, IntroSuicunePalette + ld de, wBGPals2 + ld bc, 16 palettes + call CopyBytes + pop af + ldh [rSVBK], a + xor a + ldh [hSCX], a + ld a, $90 + ldh [hSCY], a + ld a, $7 + ldh [hWX], a + ld a, $90 + ldh [hWY], a + farcall ClearSpriteAnims + call Intro_SetCGBPalUpdate + depixel 8, 5 + ld a, SPRITE_ANIM_INDEX_INTRO_UNOWN_F + call InitSpriteAnimStruct + depixel 12, 0 + ld a, SPRITE_ANIM_INDEX_INTRO_SUICUNE_AWAY + call InitSpriteAnimStruct + xor a + ld [wIntroSceneFrameCounter], a + ld [wIntroSceneTimer], a + call NextIntroScene + ret + +IntroScene16: +; Suicune shows its face. An Unown appears in front. + ld hl, wIntroSceneFrameCounter + ld a, [hl] + inc [hl] + cp $80 + jr nc, .done + call Intro_Scene16_AnimateSuicune + ldh a, [hSCY] + and a + ret z + add 8 + ldh [hSCY], a + ret +.done + call NextIntroScene + ret + +IntroScene17: +; ... + call Intro_ClearBGPals + call ClearSprites + call ClearTilemap + xor a + ldh [hBGMapMode], a + ld a, $1 + ldh [rVBK], a + ld hl, IntroSuicuneCloseAttrmap + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ld a, $0 + ldh [rVBK], a + ld hl, IntroSuicuneCloseGFX + ld de, vTiles1 tile $00 + call Intro_DecompressRequest2bpp_255Tiles + ld hl, IntroSuicuneCloseTilemap + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ldh a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ldh [rSVBK], a + ld hl, IntroSuicuneClosePalette + ld de, wBGPals1 + ld bc, 16 palettes + call CopyBytes + ld hl, IntroSuicuneClosePalette + ld de, wBGPals2 + ld bc, 16 palettes + call CopyBytes + pop af + ldh [rSVBK], a + xor a + ldh [hSCX], a + ldh [hSCY], a + ld a, $7 + ldh [hWX], a + ld a, $90 + ldh [hWY], a + farcall ClearSpriteAnims + call Intro_SetCGBPalUpdate + xor a + ld [wIntroSceneFrameCounter], a + ld [wIntroSceneTimer], a + call NextIntroScene + ret + +IntroScene18: +; Suicune close up. + ld hl, wIntroSceneFrameCounter + ld a, [hl] + inc [hl] + cp $60 + jr nc, .done + ldh a, [hSCX] + cp $60 + ret z + add 8 + ldh [hSCX], a + ret +.done + call NextIntroScene + ret + +IntroScene19: +; More setup. + call Intro_ClearBGPals + call ClearSprites + call ClearTilemap + xor a + ldh [hBGMapMode], a + ld a, $1 + ldh [rVBK], a + ld hl, IntroSuicuneBackAttrmap + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ld a, $0 + ldh [rVBK], a + ld hl, IntroSuicuneBackGFX + ld de, vTiles2 tile $00 + call Intro_DecompressRequest2bpp_128Tiles + ld hl, IntroUnownsGFX + ld de, vTiles1 tile $00 + call Intro_DecompressRequest2bpp_128Tiles + ld de, IntroGrass4GFX + ld hl, vTiles1 tile $7f + lb bc, BANK(IntroGrass4GFX), 1 + call Request2bpp + ld hl, IntroSuicuneBackTilemap + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + call Intro_LoadTilemap + ldh a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ldh [rSVBK], a + ld hl, IntroSuicunePalette + ld de, wBGPals1 + ld bc, 16 palettes + call CopyBytes + ld hl, IntroSuicunePalette + ld de, wBGPals2 + ld bc, 16 palettes + call CopyBytes + pop af + ldh [rSVBK], a + xor a + ldh [hSCX], a + ld a, $d8 + ldh [hSCY], a + ld a, $7 + ldh [hWX], a + ld a, $90 + ldh [hWY], a + farcall ClearSpriteAnims + ld hl, wSpriteAnimDict + xor a + ld [hli], a + ld [hl], $7f + call Intro_SetCGBPalUpdate + depixel 12, 0 + ld a, SPRITE_ANIM_INDEX_INTRO_SUICUNE_AWAY + call InitSpriteAnimStruct + xor a + ld [wIntroSceneFrameCounter], a + ld [wIntroSceneTimer], a + call NextIntroScene + ret + +IntroScene20: +; Suicune running away. A bunch of Unown appear. + ld hl, wIntroSceneFrameCounter + ld a, [hl] + inc [hl] + cp $98 + jr nc, .finished + cp $58 + ret nc + cp $40 + jr nc, .AppearUnown + cp $28 + ret nc + ldh a, [hSCY] + inc a + ldh [hSCY], a + ret + +.AppearUnown: + sub $18 + ld c, a + and $3 + cp $3 + ret nz + ld a, c + and $1c + srl a + srl a + ld [wIntroSceneTimer], a + xor a + call Intro_Scene20_AppearUnown + ret +; unused + ld a, c + and $1c + srl a + srl a + ld [wIntroSceneTimer], a + ld a, 1 + call Intro_Scene20_AppearUnown + ret + +.finished + call NextIntroScene + ret + +IntroScene21: +; Suicune gets more distant and turns black. + call Intro_ColoredSuicuneFrameSwap + ld c, 3 + call DelayFrames + xor a + ldh [hBGMapMode], a + ld [wIntroSceneFrameCounter], a + ld [wIntroSceneTimer], a + call NextIntroScene + ret + +IntroScene22: + ld hl, wIntroSceneFrameCounter + ld a, [hl] + inc [hl] + cp $8 + jr nc, .done + ret +.done + farcall DeinitializeAllSprites + call NextIntroScene + ret + +IntroScene23: + xor a + ld [wIntroSceneFrameCounter], a + call NextIntroScene + ret + +IntroScene24: +; Fade to white. + ld hl, wIntroSceneFrameCounter + ld a, [hl] + inc [hl] + cp $20 + jr nc, .done + + ld c, a + and $3 + ret nz + + ld a, c + and $1c + sla a + call Intro_Scene24_ApplyPaletteFade + ret + +.done + ld a, $40 + ld [wIntroSceneFrameCounter], a + call NextIntroScene + ret + +IntroScene25: +; Wait around a bit. + ld a, [wIntroSceneFrameCounter] + dec a + jr z, .done + ld [wIntroSceneFrameCounter], a + ret + +.done + call NextIntroScene + ret + +IntroScene26: +; Load the final scene. + call ClearBGPalettes + call ClearSprites + call ClearTilemap + xor a + ldh [hBGMapMode], a + ld a, $1 + ldh [rVBK], a + ld hl, IntroCrystalUnownsAttrmap + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ld a, $0 + ldh [rVBK], a + ld hl, IntroCrystalUnownsGFX + ld de, vTiles2 tile $00 + call Intro_DecompressRequest2bpp_128Tiles + ld hl, IntroCrystalUnownsTilemap + debgcoord 0, 0 + call Intro_DecompressRequest2bpp_64Tiles + ldh a, [rSVBK] + push af + ld a, BANK(wBGPals1) + ldh [rSVBK], a + ld hl, IntroCrystalUnownsPalette + ld de, wBGPals1 + ld bc, 16 palettes + call CopyBytes + ld hl, IntroCrystalUnownsPalette + ld de, wBGPals2 + ld bc, 16 palettes + call CopyBytes + pop af + ldh [rSVBK], a + xor a + ldh [hSCX], a + ldh [hSCY], a + ld a, $7 + ldh [hWX], a + ld a, $90 + ldh [hWY], a + farcall ClearSpriteAnims + call Intro_SetCGBPalUpdate + xor a + ld [wIntroSceneFrameCounter], a + ld [wIntroSceneTimer], a + call NextIntroScene + ret + +IntroScene27: +; Spell out C R Y S T A L with Unown. + ld hl, wIntroSceneTimer + inc [hl] + ld hl, wIntroSceneFrameCounter + ld a, [hl] + inc [hl] + cp $80 + jr nc, .done + + ld c, a + and $f + ld [wIntroSceneTimer], a + ld a, c + and $70 + swap a + call Intro_FadeUnownWordPals + ret + +.done + call NextIntroScene + ld a, $80 + ld [wIntroSceneFrameCounter], a + ret + +IntroScene28: +; Cut out when the music ends, and lead into the title screen. + ld hl, wIntroSceneFrameCounter + ld a, [hl] + and a + jr z, .done + dec [hl] + cp $18 + jr z, .clear + cp $8 + ret nz + + ld de, SFX_INTRO_WHOOSH + call PlaySFX + ret + +.clear + call ClearBGPalettes + ret + +.done + ld hl, wJumptableIndex + set 7, [hl] + ret + +Intro_Scene24_ApplyPaletteFade: +; load the (a)th palette from .FadePals to all wBGPals2 + ld hl, .FadePals + add l + ld l, a + ld a, $0 + adc h + ld h, a + + ldh a, [rSVBK] + push af + ld a, BANK(wBGPals2) + ldh [rSVBK], a + ld de, wBGPals2 + ld b, 8 ; number of BG pals +.loop1 + push hl + ld c, 1 palettes +.loop2 + ld a, [hli] + ld [de], a + inc de + dec c + jr nz, .loop2 + pop hl + dec b + jr nz, .loop1 + pop af + ldh [rSVBK], a + ld a, $1 + ldh [hCGBPalUpdate], a + ret + +.FadePals: +INCLUDE "gfx/intro/fade.pal" + +CrystalIntro_InitUnownAnim: + push de + ld a, SPRITE_ANIM_INDEX_INTRO_UNOWN + call InitSpriteAnimStruct + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $8 + ld a, SPRITE_ANIM_FRAMESET_INTRO_UNOWN_4 + call ReinitSpriteAnimFrame + pop de + + push de + ld a, SPRITE_ANIM_INDEX_INTRO_UNOWN + call InitSpriteAnimStruct + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $18 + ld a, SPRITE_ANIM_FRAMESET_INTRO_UNOWN_3 + call ReinitSpriteAnimFrame + pop de + + push de + ld a, SPRITE_ANIM_INDEX_INTRO_UNOWN + call InitSpriteAnimStruct + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $28 + ld a, SPRITE_ANIM_FRAMESET_INTRO_UNOWN_1 + call ReinitSpriteAnimFrame + pop de + + ld a, SPRITE_ANIM_INDEX_INTRO_UNOWN + call InitSpriteAnimStruct + ld hl, SPRITEANIMSTRUCT_0C + add hl, bc + ld [hl], $38 + ld a, SPRITE_ANIM_FRAMESET_INTRO_UNOWN_2 + call ReinitSpriteAnimFrame + ret + +CrystalIntro_UnownFade: + add a + add a + add a + ld e, a + ld d, $0 + ld hl, wBGPals2 + add hl, de + inc hl + inc hl + ld a, [wIntroSceneTimer] + and %111111 + cp %011111 + jr z, .okay + jr c, .okay + ld c, a + ld a, %111111 + sub c +.okay + + ld c, a + ld b, $0 + ldh a, [rSVBK] + push af + ld a, BANK(wBGPals2) + ldh [rSVBK], a + + push hl + push bc + ld hl, wBGPals2 + ld bc, 8 palettes + xor a + call ByteFill + pop bc + pop hl + + push hl + ld hl, .BWFade + add hl, bc + add hl, bc + ld a, [hli] + ld d, [hl] + ld e, a + pop hl + ld a, e + ld [hli], a + ld a, d + ld [hli], a + + push hl + ld hl, .BlackLBlueFade + add hl, bc + add hl, bc + ld a, [hli] + ld d, [hl] + ld e, a + pop hl + ld a, e + ld [hli], a + ld a, d + ld [hli], a + + push hl + ld hl, .BlackBlueFade + add hl, bc + add hl, bc + ld a, [hli] + ld d, [hl] + ld e, a + pop hl + ld a, e + ld [hli], a + ld a, d + ld [hli], a + + pop af + ldh [rSVBK], a + ld a, $1 + ldh [hCGBPalUpdate], a + ret + +.BWFade: +; Fade between black and white. +hue = 0 +rept 32 + RGB hue, hue, hue +hue = hue + 1 +endr + +.BlackLBlueFade: +; Fade between black and light blue. +hue = 0 +rept 32 + RGB 0, hue / 2, hue +hue = hue + 1 +endr + +.BlackBlueFade: +; Fade between black and blue. +hue = 0 +rept 32 + RGB 0, 0, hue +hue = hue + 1 +endr + +Intro_Scene20_AppearUnown: +; Spawn the palette for the nth Unown + and a + jr nz, .load_pal_2 + + ld hl, .pal1 + jr .got_pointer + +.load_pal_2 + ld hl, .pal2 + +.got_pointer + ld a, [wIntroSceneTimer] + and $7 + add a + add a + add a + ld c, a + ldh a, [rSVBK] + push af + ld a, BANK(wBGPals2) + ldh [rSVBK], a + + push bc + ld de, wBGPals2 + + ld a, c + add e + ld e, a + ld a, $0 + adc d + ld d, a + + ld bc, 1 palettes + call CopyBytes + pop bc + + ld de, wBGPals1 + ld a, c + add e + ld e, a + ld a, $0 + adc d + ld d, a + + ld bc, 1 palettes + call CopyBytes + + pop af + ldh [rSVBK], a + ld a, $1 + ldh [hCGBPalUpdate], a + ret + +.pal1 + RGB 24, 12, 09 + RGB 31, 31, 31 + RGB 12, 00, 31 + RGB 00, 00, 00 + +.pal2 + RGB 24, 12, 09 + RGB 31, 31, 31 + RGB 31, 31, 31 + RGB 31, 31, 31 + +Intro_FadeUnownWordPals: + add a + add a + add a + ld e, a + ld d, $0 + ld hl, wBGPals2 + add hl, de +rept 4 + inc hl +endr + ld a, [wIntroSceneTimer] + add a + ld c, a + ld b, $0 + + ldh a, [rSVBK] + push af + ld a, BANK(wBGPals2) + ldh [rSVBK], a + + push hl + ld hl, .FastFadePalettes + add hl, bc + ld a, [hli] + ld d, [hl] + ld e, a + pop hl + ld a, e + ld [hli], a + ld a, d + ld [hli], a + + push hl + ld hl, .SlowFadePalettes + add hl, bc + ld a, [hli] + ld d, [hl] + ld e, a + pop hl + ld a, e + ld [hli], a + ld a, d + ld [hli], a + + pop af + ldh [rSVBK], a + ld a, $1 + ldh [hCGBPalUpdate], a + ret + +.FastFadePalettes: +hue = 31 +rept 8 + RGB hue, hue, hue +hue = hue - 1 + RGB hue, hue, hue +hue = hue - 2 +endr + +.SlowFadePalettes: +hue = 31 +rept 16 + RGB hue, hue, hue +hue = hue - 1 +endr + +Intro_LoadTilemap: + ldh a, [rSVBK] + push af + ld a, BANK(wDecompressScratch) + ldh [rSVBK], a + + ld hl, wDecompressScratch + decoord 0, 0 + ld b, SCREEN_HEIGHT +.row + ld c, SCREEN_WIDTH +.col + ld a, [hli] + ld [de], a + inc de + dec c + jr nz, .col + ld a, BG_MAP_WIDTH - SCREEN_WIDTH + add l + ld l, a + ld a, 0 + adc h + ld h, a + dec b + jr nz, .row + + pop af + ldh [rSVBK], a + ret + +Intro_Scene16_AnimateSuicune: + ld a, [wIntroSceneFrameCounter] + and $3 + jr z, Intro_ColoredSuicuneFrameSwap + cp $3 + jr z, .PrepareForSuicuneSwap + ret + +.PrepareForSuicuneSwap: + xor a + ldh [hBGMapMode], a + ret + +Intro_ColoredSuicuneFrameSwap: + hlcoord 0, 0 + ld bc, SCREEN_HEIGHT * SCREEN_WIDTH +.loop + ld a, [hl] + and a + jr z, .skip + cp $80 + jr nc, .skip + xor $8 + ld [hl], a +.skip + inc hl + dec bc + ld a, c + or b + jr nz, .loop + ld a, $1 + ldh [hBGMapMode], a + ret + +Intro_RustleGrass: + ld a, [wIntroSceneFrameCounter] + cp 36 + ret nc + and $c + srl a + ld e, a + ld d, $0 + ld hl, .RustlingGrassPointers + add hl, de + ld a, [hli] + ld [wRequested2bppSource], a + ld a, [hli] + ld [wRequested2bppSource + 1], a + ld a, LOW(vTiles2 tile $09) + ld [wRequested2bppDest], a + ld a, HIGH(vTiles2 tile $09) + ld [wRequested2bppDest + 1], a + ld a, 4 + ld [wRequested2bppSize], a + ret + +.RustlingGrassPointers: + dw IntroGrass1GFX + dw IntroGrass2GFX + dw IntroGrass3GFX + dw IntroGrass2GFX + +Intro_SetCGBPalUpdate: + ld a, $1 + ldh [hCGBPalUpdate], a + ret + +Intro_ClearBGPals: + ldh a, [rSVBK] + push af + ld a, BANK(wBGPals2) + ldh [rSVBK], a + + ld hl, wBGPals2 + ld bc, 16 palettes + xor a + call ByteFill + + pop af + ldh [rSVBK], a + ld a, $1 + ldh [hCGBPalUpdate], a + call DelayFrame + call DelayFrame + ret + +Intro_DecompressRequest2bpp_128Tiles: + ldh a, [rSVBK] + push af + ld a, BANK(wDecompressScratch) + ldh [rSVBK], a + + push de + ld de, wDecompressScratch + call Decompress + pop hl + + ld de, wDecompressScratch + lb bc, $01, $80 + call Request2bpp + + pop af + ldh [rSVBK], a + ret + +Intro_DecompressRequest2bpp_255Tiles: + ldh a, [rSVBK] + push af + ld a, BANK(wDecompressScratch) + ldh [rSVBK], a + + push de + ld de, wDecompressScratch + call Decompress + pop hl + + ld de, wDecompressScratch + lb bc, $01, $ff + call Request2bpp + + pop af + ldh [rSVBK], a + ret + +Intro_DecompressRequest2bpp_64Tiles: + ldh a, [rSVBK] + push af + ld a, BANK(wDecompressScratch) + ldh [rSVBK], a + + push de + ld de, wDecompressScratch + call Decompress + pop hl + + ld de, wDecompressScratch + lb bc, $01, $40 + call Request2bpp + + pop af + ldh [rSVBK], a + ret + +Intro_ResetLYOverrides: + ldh a, [rSVBK] + push af + ld a, BANK(wLYOverrides) + ldh [rSVBK], a + + ld hl, wLYOverrides + ld bc, wLYOverridesEnd - wLYOverrides + xor a + call ByteFill + + pop af + ldh [rSVBK], a + ld a, LOW(rSCX) + ldh [hLCDCPointer], a + ret + +Intro_PerspectiveScrollBG: + ldh a, [rSVBK] + push af + ld a, BANK(wLYOverrides) + ldh [rSVBK], a + ; Scroll the grass every frame. + ; Scroll the trees every other frame and at half speed. + ; This creates an illusion of perspective. + ld a, [wIntroSceneFrameCounter] + and $1 + jr z, .skip + ; trees in the back + ld hl, wLYOverrides + ld a, [hl] + inc a + ld bc, $5f + call ByteFill +.skip + ; grass in the front + ld hl, wLYOverrides + $5f + ld a, [hl] + inc a + inc a + ld bc, $31 + call ByteFill + ld a, [wLYOverrides + 0] + ldh [hSCX], a + pop af + ldh [rSVBK], a + ret + +IntroSuicuneRunGFX: +INCBIN "gfx/intro/suicune_run.2bpp.lz" + +IntroPichuWooperGFX: +INCBIN "gfx/intro/pichu_wooper.2bpp.lz" + +IntroBackgroundGFX: +INCBIN "gfx/intro/background.2bpp.lz" + +IntroBackgroundTilemap: +INCBIN "gfx/intro/background.tilemap.lz" + +IntroBackgroundAttrmap: +INCBIN "gfx/intro/background.attrmap.lz" + +IntroBackgroundPalette: +INCLUDE "gfx/intro/background.pal" + +IntroUnownsGFX: +INCBIN "gfx/intro/unowns.2bpp.lz" + +IntroPulseGFX: +INCBIN "gfx/intro/pulse.2bpp.lz" + +IntroUnownATilemap: +INCBIN "gfx/intro/unown_a.tilemap.lz" + +IntroUnownAAttrmap: +INCBIN "gfx/intro/unown_a.attrmap.lz" + +IntroUnownHITilemap: +INCBIN "gfx/intro/unown_hi.tilemap.lz" + +IntroUnownHIAttrmap: +INCBIN "gfx/intro/unown_hi.attrmap.lz" + +IntroUnownsTilemap: +INCBIN "gfx/intro/unowns.tilemap.lz" + +IntroUnownsAttrmap: +INCBIN "gfx/intro/unowns.attrmap.lz" + +IntroUnownsPalette: +INCLUDE "gfx/intro/unowns.pal" + +IntroCrystalUnownsGFX: +INCBIN "gfx/intro/crystal_unowns.2bpp.lz" + +IntroCrystalUnownsTilemap: +INCBIN "gfx/intro/crystal_unowns.tilemap.lz" + +IntroCrystalUnownsAttrmap: +INCBIN "gfx/intro/crystal_unowns.attrmap.lz" + +IntroCrystalUnownsPalette: +INCLUDE "gfx/intro/crystal_unowns.pal" + +IntroSuicuneCloseGFX: +INCBIN "gfx/intro/suicune_close.2bpp.lz" + +IntroSuicuneCloseTilemap: +INCBIN "gfx/intro/suicune_close.tilemap.lz" + +IntroSuicuneCloseAttrmap: +INCBIN "gfx/intro/suicune_close.attrmap.lz" + +IntroSuicuneClosePalette: +INCLUDE "gfx/intro/suicune_close.pal" + +IntroSuicuneJumpGFX: +INCBIN "gfx/intro/suicune_jump.2bpp.lz" + +IntroSuicuneBackGFX: +INCBIN "gfx/intro/suicune_back.2bpp.lz" + +IntroSuicuneJumpTilemap: +INCBIN "gfx/intro/suicune_jump.tilemap.lz" + +IntroSuicuneJumpAttrmap: +INCBIN "gfx/intro/suicune_jump.attrmap.lz" + +IntroSuicuneBackTilemap: +INCBIN "gfx/intro/suicune_back.tilemap.lz" + +IntroSuicuneBackAttrmap: +INCBIN "gfx/intro/suicune_back.attrmap.lz" + +IntroSuicunePalette: +INCLUDE "gfx/intro/suicune.pal" + +IntroUnownBackGFX: +INCBIN "gfx/intro/unown_back.2bpp.lz" + +IntroGrass1GFX: +INCBIN "gfx/intro/grass1.2bpp" +IntroGrass2GFX: +INCBIN "gfx/intro/grass2.2bpp" +IntroGrass3GFX: +INCBIN "gfx/intro/grass3.2bpp" +IntroGrass4GFX: +INCBIN "gfx/intro/grass4.2bpp" -- cgit v1.2.3