Document splash screen animation

This commit is contained in:
mid-kid 2020-08-22 15:49:21 +02:00
parent 2b2c1ac649
commit 733664b18f
3 changed files with 88 additions and 66 deletions

View File

@ -221,7 +221,7 @@ DoAnimFrame:
ret ret
.GameFreakLogo: .GameFreakLogo:
callfar PlaceGameFreakLogo callfar GameFreakLogoSpriteAnim
ret ret
.GSIntroStar .GSIntroStar

View File

@ -969,7 +969,7 @@ Intro_PlacePlayerSprite:
NUM_TITLESCREENOPTIONS EQU const_value NUM_TITLESCREENOPTIONS EQU const_value
IntroSequence: IntroSequence:
callfar Copyright_GameFreakPresents callfar SplashScreen
jr c, StartTitleScreen jr c, StartTitleScreen
farcall CrystalIntro farcall CrystalIntro

View File

@ -1,7 +1,8 @@
Copyright_GameFreakPresents: SplashScreen:
; Play the copyright screen and GameFreak Presents sequence. ; Play the copyright screen and GameFreak Presents sequence.
; Return carry if user cancels animation by pressing a button. ; Return carry if user cancels animation by pressing a button.
; Reinitialize everything
ld de, MUSIC_NONE ld de, MUSIC_NONE
call PlayMusic call PlayMusic
call ClearBGPalettes call ClearBGPalettes
@ -21,13 +22,19 @@ Copyright_GameFreakPresents:
call SetPalettes call SetPalettes
ld c, 10 ld c, 10
call DelayFrames call DelayFrames
; Draw copyright screen
callfar Copyright callfar Copyright
call WaitBGMap call WaitBGMap
ld c, 100 ld c, 100
call DelayFrames call DelayFrames
call ClearTilemap call ClearTilemap
; Stop here if not in GBC mode
farcall GBCOnlyScreen farcall GBCOnlyScreen
call .GetGFLogoGFX
; Play GameFreak logo animation
call GameFreakPresentsInit
.joy_loop .joy_loop
call JoyTextDelay call JoyTextDelay
ldh a, [hJoyLast] ldh a, [hJoyLast]
@ -36,22 +43,22 @@ Copyright_GameFreakPresents:
ld a, [wJumptableIndex] ld a, [wJumptableIndex]
bit 7, a bit 7, a
jr nz, .finish jr nz, .finish
call PlaceGameFreakPresents call GameFreakPresentsScene
farcall PlaySpriteAnimations farcall PlaySpriteAnimations
call DelayFrame call DelayFrame
jr .joy_loop jr .joy_loop
.pressed_button .pressed_button
call .StopGamefreakAnim call GameFreakPresentsEnd
scf scf
ret ret
.finish .finish
call .StopGamefreakAnim call GameFreakPresentsEnd
and a and a
ret ret
.GetGFLogoGFX: GameFreakPresentsInit:
ld de, GameFreakLogoGFX ld de, GameFreakLogoGFX
ld hl, vTiles2 ld hl, vTiles2
lb bc, BANK(GameFreakLogoGFX), 28 lb bc, BANK(GameFreakLogoGFX), 28
@ -86,28 +93,28 @@ Copyright_GameFreakPresents:
call InitSpriteAnimStruct call InitSpriteAnimStruct
ld hl, SPRITEANIMSTRUCT_YOFFSET ld hl, SPRITEANIMSTRUCT_YOFFSET
add hl, bc add hl, bc
ld [hl], $a0 ld [hl], 160
ld hl, SPRITEANIMSTRUCT_0C ld hl, SPRITEANIMSTRUCT_0C
add hl, bc add hl, bc
ld [hl], $60 ld [hl], 96
ld hl, SPRITEANIMSTRUCT_0D ld hl, SPRITEANIMSTRUCT_0D
add hl, bc add hl, bc
ld [hl], $30 ld [hl], 48
xor a xor a
ld [wJumptableIndex], a ld [wJumptableIndex], a
ld [wIntroSceneFrameCounter], a ld [wIntroSceneFrameCounter], a
ld [wIntroSceneTimer], a ld [wIntroSceneTimer], a
ldh [hSCX], a ldh [hSCX], a
ldh [hSCY], a ldh [hSCY], a
ld a, $1 ld a, 1
ldh [hBGMapMode], a ldh [hBGMapMode], a
ld a, $90 ld a, 144
ldh [hWY], a ldh [hWY], a
lb de, %11100100, %11100100 lb de, %11100100, %11100100
call DmgToCgbObjPals call DmgToCgbObjPals
ret ret
.StopGamefreakAnim: GameFreakPresentsEnd:
farcall ClearSpriteAnims farcall ClearSpriteAnims
call ClearTilemap call ClearTilemap
call ClearSprites call ClearSprites
@ -115,27 +122,27 @@ Copyright_GameFreakPresents:
call DelayFrames call DelayFrames
ret ret
PlaceGameFreakPresents: GameFreakPresentsScene:
jumptable .scenes, wJumptableIndex jumptable .scenes, wJumptableIndex
.scenes .scenes
dw GameFreakPresentsScene0 dw GameFreakPresents_WaitSpriteAnim
dw GameFreakPresentsScene1 dw GameFreakPresents_PlaceGameFreak
dw GameFreakPresentsScene2 dw GameFreakPresents_PlacePresents
dw GameFreakPresentsScene3 dw GameFreakPresents_DelayEnd
PlaceGameFreakPresents_NextScene: GameFreakPresents_NextScene:
ld hl, wJumptableIndex ld hl, wJumptableIndex
inc [hl] inc [hl]
ret ret
GameFreakPresentsScene0: GameFreakPresents_WaitSpriteAnim:
ret ret
GameFreakPresentsScene1: GameFreakPresents_PlaceGameFreak:
ld hl, wIntroSceneTimer ld hl, wIntroSceneTimer
ld a, [hl] ld a, [hl]
cp $20 cp 32
jr nc, .PlaceGameFreak jr nc, .PlaceGameFreak
inc [hl] inc [hl]
ret ret
@ -146,7 +153,7 @@ GameFreakPresentsScene1:
decoord 5, 10 decoord 5, 10
ld bc, .end - .GAME_FREAK ld bc, .end - .GAME_FREAK
call CopyBytes call CopyBytes
call PlaceGameFreakPresents_NextScene call GameFreakPresents_NextScene
ld de, SFX_GAME_FREAK_PRESENTS ld de, SFX_GAME_FREAK_PRESENTS
call PlaySFX call PlaySFX
ret ret
@ -157,10 +164,10 @@ GameFreakPresentsScene1:
.end .end
db "@" db "@"
GameFreakPresentsScene2: GameFreakPresents_PlacePresents:
ld hl, wIntroSceneTimer ld hl, wIntroSceneTimer
ld a, [hl] ld a, [hl]
cp $40 cp 64
jr nc, .place_presents jr nc, .place_presents
inc [hl] inc [hl]
ret ret
@ -171,7 +178,7 @@ GameFreakPresentsScene2:
decoord 7, 11 decoord 7, 11
ld bc, .end - .presents ld bc, .end - .presents
call CopyBytes call CopyBytes
call PlaceGameFreakPresents_NextScene call GameFreakPresents_NextScene
ret ret
.presents .presents
@ -179,10 +186,10 @@ GameFreakPresentsScene2:
.end .end
db "@" db "@"
GameFreakPresentsScene3: GameFreakPresents_DelayEnd:
ld hl, wIntroSceneTimer ld hl, wIntroSceneTimer
ld a, [hl] ld a, [hl]
cp $80 cp 128
jr nc, .finish jr nc, .finish
inc [hl] inc [hl]
ret ret
@ -192,7 +199,7 @@ GameFreakPresentsScene3:
set 7, [hl] set 7, [hl]
ret ret
PlaceGameFreakLogo: GameFreakLogoSpriteAnim:
ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX
add hl, bc add hl, bc
ld e, [hl] ld e, [hl]
@ -206,95 +213,110 @@ PlaceGameFreakLogo:
jp hl jp hl
.scenes: .scenes:
dw GameFreakLogoScene1 dw GameFreakLogo_Init
dw GameFreakLogoScene2 dw GameFreakLogo_Bounce
dw GameFreakLogoScene3 dw GameFreakLogo_Ditto
dw GameFreakLogoScene4 dw GameFreakLogo_Transform
dw GameFreakLogoScene5 dw GameFreakLogo_Done
GameFreakLogoScene1: GameFreakLogo_Init:
ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX
add hl, bc add hl, bc
inc [hl] inc [hl]
ret ret
GameFreakLogoScene2: GameFreakLogo_Bounce:
ld hl, SPRITEANIMSTRUCT_0C ; Bounce with a height of 0C, 0C / 48 times.
; By default, this is twice, with a height of 96 pixels and 48 pixels.
; Sine offset starts at 48 (32+32/2, or pi+pi/2), so it starts at the maximum
; value of the sine wave (i.e. the top of the screen).
ld hl, SPRITEANIMSTRUCT_0C ; jump height
add hl, bc add hl, bc
ld a, [hl] ld a, [hl]
and a and a
jr z, .asm_e4747 jr z, .done
; Load the sine offset, make sure it doesn't reach the negative part of the wave
ld d, a ld d, a
ld hl, SPRITEANIMSTRUCT_0D ld hl, SPRITEANIMSTRUCT_0D ; sine offset
add hl, bc add hl, bc
ld a, [hl] ld a, [hl]
and %111111 and $3f ; full circle = 2*pi = 2*32
cp %100000 cp 32
jr nc, .asm_e4723 jr nc, .no_negative
add %100000 add 32
.asm_e4723 .no_negative
ld e, a ld e, a
farcall BattleAnim_Sine_e farcall BattleAnim_Sine_e ; e = d * sin(e * pi/32)
ld hl, SPRITEANIMSTRUCT_YOFFSET ld hl, SPRITEANIMSTRUCT_YOFFSET
add hl, bc add hl, bc
ld [hl], e ld [hl], e
ld hl, SPRITEANIMSTRUCT_0D
; Decrement the sine offset
ld hl, SPRITEANIMSTRUCT_0D ; sine offset
add hl, bc add hl, bc
ld a, [hl] ld a, [hl]
dec [hl] dec [hl]
and $1f and $1f ; a%32 == 0
ret nz ret nz
ld hl, SPRITEANIMSTRUCT_0C
; If the ditto's reached the ground, decrement the jump height and play the sfx
ld hl, SPRITEANIMSTRUCT_0C ; jump height
add hl, bc add hl, bc
ld a, [hl] ld a, [hl]
sub $30 sub 48
ld [hl], a ld [hl], a
ld de, SFX_DITTO_BOUNCE ld de, SFX_DITTO_BOUNCE
call PlaySFX call PlaySFX
ret ret
.asm_e4747 .done
ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX
add hl, bc add hl, bc
inc [hl] inc [hl]
ld hl, SPRITEANIMSTRUCT_0D ld hl, SPRITEANIMSTRUCT_0D
add hl, bc add hl, bc
ld [hl], $0 ld [hl], 0
ld de, SFX_DITTO_POP_UP ld de, SFX_DITTO_POP_UP
call PlaySFX call PlaySFX
ret ret
GameFreakLogoScene3: GameFreakLogo_Ditto:
ld hl, SPRITEANIMSTRUCT_0D ; Wait a little, then start transforming
ld hl, SPRITEANIMSTRUCT_0D ; frame count
add hl, bc add hl, bc
ld a, [hl] ld a, [hl]
cp $20 cp 32
jr nc, .asm_e4764 jr nc, .start_transform
inc [hl] inc [hl]
ret ret
.asm_e4764 .start_transform
ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX
add hl, bc add hl, bc
inc [hl] inc [hl]
ld hl, SPRITEANIMSTRUCT_0D ld hl, SPRITEANIMSTRUCT_0D
add hl, bc add hl, bc
ld [hl], $0 ld [hl], 0
ld de, SFX_DITTO_TRANSFORM ld de, SFX_DITTO_TRANSFORM
call PlaySFX call PlaySFX
ret ret
GameFreakLogoScene4: GameFreakLogo_Transform:
ld hl, SPRITEANIMSTRUCT_0D ld hl, SPRITEANIMSTRUCT_0D ; frame count
add hl, bc add hl, bc
ld a, [hl] ld a, [hl]
cp $40 cp 64
jr z, .asm_e47a3 jr z, .done
inc [hl] inc [hl]
; Fade ditto's palettes while it's transforming
srl a srl a
srl a srl a
ld e, a ld e, a
ld d, $0 ld d, 0
ld hl, GameFreakDittoPaletteFade ld hl, GameFreakDittoPaletteFade
add hl, de add hl, de
add hl, de add hl, de
@ -312,12 +334,12 @@ GameFreakLogoScene4:
ldh [hCGBPalUpdate], a ldh [hCGBPalUpdate], a
ret ret
.asm_e47a3 .done
ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX
add hl, bc add hl, bc
inc [hl] inc [hl]
call PlaceGameFreakPresents_NextScene call GameFreakPresents_NextScene
GameFreakLogoScene5: GameFreakLogo_Done:
ret ret
GameFreakDittoPaletteFade: GameFreakDittoPaletteFade: