mirror of
https://gitlab.com/xCrystal/pokecrystal-board.git
synced 2024-09-09 09:51:34 -07:00
eb1e3636bb
Use explicit ldh instruction to access HRAM locations, don't rely on optimizing ld
2133 lines
33 KiB
NASM
2133 lines
33 KiB
NASM
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, IntroTilemap001
|
|
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, IntroTilemap002
|
|
debgcoord 0, 0
|
|
call Intro_DecompressRequest2bpp_64Tiles
|
|
ldh a, [rSVBK]
|
|
push af
|
|
ld a, BANK(wBGPals1)
|
|
ldh [rSVBK], a
|
|
ld hl, IntroPalette2
|
|
ld de, wBGPals1
|
|
ld bc, 16 palettes
|
|
call CopyBytes
|
|
ld hl, IntroPalette2
|
|
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, IntroTilemap003
|
|
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, IntroTilemap004
|
|
debgcoord 0, 0
|
|
call Intro_DecompressRequest2bpp_64Tiles
|
|
ldh a, [rSVBK]
|
|
push af
|
|
ld a, BANK(wBGPals1)
|
|
ldh [rSVBK], a
|
|
ld hl, IntroPalette1
|
|
ld de, wBGPals1
|
|
ld bc, 16 palettes
|
|
call CopyBytes
|
|
ld hl, IntroPalette1
|
|
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, IntroTilemap005
|
|
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, IntroTilemap006
|
|
debgcoord 0, 0
|
|
call Intro_DecompressRequest2bpp_64Tiles
|
|
ldh a, [rSVBK]
|
|
push af
|
|
ld a, BANK(wBGPals1)
|
|
ldh [rSVBK], a
|
|
ld hl, IntroPalette2
|
|
ld de, wBGPals1
|
|
ld bc, 16 palettes
|
|
call CopyBytes
|
|
ld hl, IntroPalette2
|
|
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, IntroTilemap003
|
|
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, IntroTilemap004
|
|
debgcoord 0, 0
|
|
call Intro_DecompressRequest2bpp_64Tiles
|
|
|
|
ldh a, [rSVBK]
|
|
push af
|
|
ld a, BANK(wBGPals1)
|
|
ldh [rSVBK], a
|
|
|
|
ld hl, IntroPalette1
|
|
ld de, wBGPals1
|
|
ld bc, 16 palettes
|
|
call CopyBytes
|
|
|
|
ld hl, IntroPalette1
|
|
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, $c ; $980c
|
|
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, IntroTilemap007
|
|
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, IntroTilemap008
|
|
debgcoord 0, 0
|
|
call Intro_DecompressRequest2bpp_64Tiles
|
|
ldh a, [rSVBK]
|
|
push af
|
|
ld a, BANK(wBGPals1)
|
|
ldh [rSVBK], a
|
|
ld hl, IntroPalette2
|
|
ld de, wBGPals1
|
|
ld bc, 16 palettes
|
|
call CopyBytes
|
|
ld hl, IntroPalette2
|
|
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, IntroTilemap003
|
|
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, IntroTilemap004
|
|
debgcoord 0, 0
|
|
call Intro_DecompressRequest2bpp_64Tiles
|
|
ldh a, [rSVBK]
|
|
push af
|
|
ld a, BANK(wBGPals1)
|
|
ldh [rSVBK], a
|
|
ld hl, IntroPalette1
|
|
ld de, wBGPals1
|
|
ld bc, 16 palettes
|
|
call CopyBytes
|
|
ld hl, IntroPalette1
|
|
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, IntroTilemap009
|
|
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, IntroTilemap010
|
|
debgcoord 0, 0
|
|
call Intro_DecompressRequest2bpp_64Tiles
|
|
call Intro_LoadTilemap
|
|
ldh a, [rSVBK]
|
|
push af
|
|
ld a, BANK(wBGPals1)
|
|
ldh [rSVBK], a
|
|
ld hl, IntroPalette5
|
|
ld de, wBGPals1
|
|
ld bc, 16 palettes
|
|
call CopyBytes
|
|
ld hl, IntroPalette5
|
|
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, IntroTilemap011
|
|
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, IntroTilemap012
|
|
debgcoord 0, 0
|
|
call Intro_DecompressRequest2bpp_64Tiles
|
|
ldh a, [rSVBK]
|
|
push af
|
|
ld a, BANK(wBGPals1)
|
|
ldh [rSVBK], a
|
|
ld hl, IntroPalette4
|
|
ld de, wBGPals1
|
|
ld bc, 16 palettes
|
|
call CopyBytes
|
|
ld hl, IntroPalette4
|
|
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, IntroTilemap013
|
|
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, IntroTilemap014
|
|
debgcoord 0, 0
|
|
call Intro_DecompressRequest2bpp_64Tiles
|
|
call Intro_LoadTilemap
|
|
ldh a, [rSVBK]
|
|
push af
|
|
ld a, BANK(wBGPals1)
|
|
ldh [rSVBK], a
|
|
ld hl, IntroPalette5
|
|
ld de, wBGPals1
|
|
ld bc, 16 palettes
|
|
call CopyBytes
|
|
ld hl, IntroPalette5
|
|
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, IntroTilemap015
|
|
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, IntroTilemap017
|
|
debgcoord 0, 0
|
|
call Intro_DecompressRequest2bpp_64Tiles
|
|
ldh a, [rSVBK]
|
|
push af
|
|
ld a, BANK(wBGPals1)
|
|
ldh [rSVBK], a
|
|
ld hl, IntroPalette3
|
|
ld de, wBGPals1
|
|
ld bc, 16 palettes
|
|
call CopyBytes
|
|
ld hl, IntroPalette3
|
|
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, rSCX - $ff00
|
|
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"
|
|
|
|
IntroTilemap004:
|
|
INCBIN "gfx/intro/004.tilemap.lz"
|
|
|
|
IntroTilemap003:
|
|
INCBIN "gfx/intro/003.tilemap.lz"
|
|
|
|
IntroPalette1:
|
|
INCLUDE "gfx/intro/intro_1.pal"
|
|
|
|
IntroUnownsGFX:
|
|
INCBIN "gfx/intro/unowns.2bpp.lz"
|
|
|
|
IntroPulseGFX:
|
|
INCBIN "gfx/intro/pulse.2bpp.lz"
|
|
|
|
IntroTilemap002:
|
|
INCBIN "gfx/intro/002.tilemap.lz"
|
|
|
|
IntroTilemap001:
|
|
INCBIN "gfx/intro/001.tilemap.lz"
|
|
|
|
IntroTilemap006:
|
|
INCBIN "gfx/intro/006.tilemap.lz"
|
|
|
|
IntroTilemap005:
|
|
INCBIN "gfx/intro/005.tilemap.lz"
|
|
|
|
IntroTilemap008:
|
|
INCBIN "gfx/intro/008.tilemap.lz"
|
|
|
|
IntroTilemap007:
|
|
INCBIN "gfx/intro/007.tilemap.lz"
|
|
|
|
IntroPalette2:
|
|
INCLUDE "gfx/intro/intro_2.pal"
|
|
|
|
IntroCrystalUnownsGFX:
|
|
INCBIN "gfx/intro/crystal_unowns.2bpp.lz"
|
|
|
|
IntroTilemap017:
|
|
INCBIN "gfx/intro/017.tilemap.lz"
|
|
|
|
IntroTilemap015:
|
|
INCBIN "gfx/intro/015.tilemap.lz"
|
|
|
|
IntroPalette3:
|
|
INCLUDE "gfx/intro/intro_3.pal"
|
|
|
|
IntroSuicuneCloseGFX:
|
|
INCBIN "gfx/intro/suicune_close.2bpp.lz"
|
|
|
|
IntroTilemap012:
|
|
INCBIN "gfx/intro/012.tilemap.lz"
|
|
|
|
IntroTilemap011:
|
|
INCBIN "gfx/intro/011.tilemap.lz"
|
|
|
|
IntroPalette4:
|
|
INCLUDE "gfx/intro/intro_4.pal"
|
|
|
|
IntroSuicuneJumpGFX:
|
|
INCBIN "gfx/intro/suicune_jump.2bpp.lz"
|
|
|
|
IntroSuicuneBackGFX:
|
|
INCBIN "gfx/intro/suicune_back.2bpp.lz"
|
|
|
|
IntroTilemap010:
|
|
INCBIN "gfx/intro/010.tilemap.lz"
|
|
|
|
IntroTilemap009:
|
|
INCBIN "gfx/intro/009.tilemap.lz"
|
|
|
|
IntroTilemap014:
|
|
INCBIN "gfx/intro/014.tilemap.lz"
|
|
|
|
IntroTilemap013:
|
|
INCBIN "gfx/intro/013.tilemap.lz"
|
|
|
|
IntroPalette5:
|
|
INCLUDE "gfx/intro/intro_5.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"
|