mirror of
https://github.com/pret/pokegold.git
synced 2026-03-21 17:34:16 -05:00
* Sync sprite and battle anim consts/labels * Add `; 00` comments * Renamed to `SpriteAnimFunc_` and `BattleAnimFunc_`
345 lines
6.4 KiB
NASM
345 lines
6.4 KiB
NASM
SplashScreen:
|
|
; Play the copyright screen and GameFreak Presents sequence.
|
|
; Return carry if user cancels animation by pressing a button.
|
|
|
|
; Reinitialize everything
|
|
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, SCREEN_HEIGHT_PX
|
|
ldh [hWY], a
|
|
call WaitBGMap
|
|
ld b, SCGB_GAMEFREAK_LOGO
|
|
call GetSGBLayout
|
|
call SetPalettes
|
|
ld c, 10
|
|
call DelayFrames
|
|
|
|
; Draw copyright screen
|
|
callfar Copyright
|
|
call WaitBGMap
|
|
ld c, 100
|
|
call DelayFrames
|
|
call ClearTilemap
|
|
|
|
; Play GameFreak logo animation
|
|
call GameFreakPresentsInit
|
|
.loop
|
|
call GameFreakPresentsFrame
|
|
jr nc, .loop
|
|
|
|
; high bits of wJumptableIndex are recycled for some flags
|
|
; this was set if user canceled by pressing a button
|
|
ld a, [wJumptableIndex]
|
|
bit 6, a
|
|
jr nz, .canceled
|
|
|
|
; clear carry flag from GameFreakPresents_PlayFrame
|
|
and a
|
|
ret
|
|
|
|
.canceled
|
|
scf
|
|
ret
|
|
|
|
GameFreakPresentsInit:
|
|
ld de, GameFreakLogoGFX
|
|
ld hl, vTiles1
|
|
lb bc, BANK(GameFreakLogoGFX), 28
|
|
call Get1bpp
|
|
|
|
ld de, GameFreakLogoStarsGFX
|
|
ld hl, vTiles1 tile 28
|
|
lb bc, BANK(GameFreakLogoStarsGFX), 5
|
|
call Request2bpp
|
|
|
|
farcall ClearSpriteAnims
|
|
|
|
ld hl, wSpriteAnimDict
|
|
ld a, SPRITE_ANIM_DICT_GS_SPLASH
|
|
ld [hli], a
|
|
ld a, $8d
|
|
ld [hl], a
|
|
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, SCREEN_HEIGHT_PX
|
|
ldh [hWY], a
|
|
lb de, %00100100, %11111000
|
|
call DmgToCgbObjPals
|
|
ret
|
|
|
|
GameFreakPresentsFrame:
|
|
; Play one frame of GameFreakPresents sequence.
|
|
; Return carry when the sequence completes or is canceled.
|
|
|
|
call JoyTextDelay
|
|
ldh a, [hJoyLast]
|
|
and BUTTONS
|
|
jr nz, .pressed_button
|
|
|
|
; high bits of wJumptableIndex are recycled for some flags
|
|
; this is set when the sequence finished
|
|
ld a, [wJumptableIndex]
|
|
bit 7, a
|
|
jr nz, .finish
|
|
|
|
farcall PlaySpriteAnimations
|
|
|
|
call GameFreakPresentsScene
|
|
call DelayFrame
|
|
|
|
; ensure carry is cleared
|
|
and a
|
|
ret
|
|
|
|
.pressed_button
|
|
; high bits of wJumptableIndex are recycled for some flags
|
|
ld hl, wJumptableIndex
|
|
set 6, [hl]
|
|
|
|
.finish
|
|
callfar ClearSpriteAnims
|
|
call ClearTilemap
|
|
call ClearSprites
|
|
|
|
ld c, 16
|
|
call DelayFrames
|
|
|
|
scf
|
|
ret
|
|
|
|
GameFreakPresentsScene:
|
|
jumptable .scenes, wJumptableIndex
|
|
|
|
.scenes
|
|
dw GameFreakPresents_Star
|
|
dw GameFreakPresents_PlaceLogo
|
|
dw GameFreakPresents_LogoSparkles
|
|
dw GameFreakPresents_PlacePresents
|
|
dw GameFreakPresents_WaitForTimer
|
|
dw GameFreakPresents_SetDoneFlag
|
|
|
|
GameFreakPresents_NextScene:
|
|
ld hl, wJumptableIndex
|
|
inc [hl]
|
|
ret
|
|
|
|
GameFreakPresents_Wait64Frames: ; unreferenced
|
|
ld c, 64
|
|
call DelayFrames
|
|
call GameFreakPresents_NextScene
|
|
ret
|
|
|
|
GameFreakPresents_Star:
|
|
; tell GameFreakPresents_PlaceLogo we haven't finished yet
|
|
xor a
|
|
ld [wIntroSceneFrameCounter], a
|
|
|
|
depixel 10, 11, 4, 0
|
|
ld a, SPRITE_ANIM_OBJ_GS_GAMEFREAK_LOGO_STAR
|
|
call InitSpriteAnimStruct
|
|
|
|
ld hl, SPRITEANIMSTRUCT_VAR1
|
|
add hl, bc
|
|
ld [hl], $80
|
|
|
|
ld de, SFX_GAME_FREAK_LOGO_GS
|
|
call PlaySFX
|
|
|
|
call GameFreakPresents_NextScene
|
|
ret
|
|
|
|
GameFreakPresents_PlaceLogo:
|
|
; Draw the Game Freak logo (may be initially invisible due to palette)
|
|
|
|
; wait until the star animation completed
|
|
; this counter is set in DoSpriteAnimFrame.GSIntroStar in engine/sprite_anims/functions.asm
|
|
ld a, [wIntroSceneFrameCounter]
|
|
and a
|
|
ret z
|
|
|
|
depixel 10, 11, 4, 0
|
|
ld a, SPRITE_ANIM_OBJ_GAMEFREAK_LOGO
|
|
call InitSpriteAnimStruct
|
|
|
|
call GameFreakPresents_NextScene
|
|
|
|
; set timer for GameFreakPresents_LogoSparkles
|
|
ld a, 128
|
|
ld [wIntroSceneTimer], a
|
|
ret
|
|
|
|
GameFreakPresents_LogoSparkles:
|
|
ld hl, wIntroSceneTimer
|
|
ld a, [hl]
|
|
and a
|
|
jr z, .done
|
|
dec [hl]
|
|
|
|
; add first text when timer passes half
|
|
cp 63
|
|
call z, GameFreakPresents_PlaceGameFreak
|
|
|
|
; add sparkles continuously
|
|
call GameFreakPresents_Sparkle
|
|
ret
|
|
|
|
.done
|
|
; go to the next scene
|
|
ld [hl], 128
|
|
call GameFreakPresents_NextScene
|
|
ret
|
|
|
|
GameFreakPresents_PlaceGameFreak:
|
|
hlcoord 5, 12
|
|
ld de, .game_freak
|
|
call PlaceString
|
|
ret
|
|
|
|
.game_freak
|
|
db $80, $81, $82, $83, $8d, $84, $85, $83, $81, $86
|
|
db "@"
|
|
|
|
GameFreakPresents_PlacePresents:
|
|
hlcoord 7, 13
|
|
ld de, .presents
|
|
call PlaceString
|
|
|
|
call GameFreakPresents_NextScene
|
|
|
|
; set timer for GameFreakPresents_WaitForTimer
|
|
ld a, 128
|
|
ld [wIntroSceneTimer], a
|
|
ret
|
|
|
|
.presents
|
|
db $87, $88, $89, $8a, $8b, $8c
|
|
db "@"
|
|
|
|
GameFreakPresents_SetDoneFlag:
|
|
; Tell GameFreakPresents_PlayFrame and TitleScreenFrame that we're finished.
|
|
|
|
ld hl, wJumptableIndex
|
|
set 7, [hl]
|
|
ret
|
|
|
|
GameFreakPresents_WaitForTimer:
|
|
ld hl, wIntroSceneTimer
|
|
ld a, [hl]
|
|
and a
|
|
jr z, .done
|
|
dec [hl]
|
|
ret
|
|
.done
|
|
call GameFreakPresents_NextScene
|
|
ret
|
|
|
|
GameFreakPresents_UpdateLogoPal:
|
|
; called from DoSpriteAnimFrame.GameFreakLogo
|
|
; OBP1 was initialized at end of GameFreakPresents_Init
|
|
|
|
; once we reached the final state, leave it alone
|
|
ldh a, [rOBP1]
|
|
cp %10010000
|
|
ret z
|
|
|
|
; wait 16 frames before next change
|
|
ld a, [wIntroSceneTimer]
|
|
and $f
|
|
ret nz
|
|
|
|
; rotate OBP1 by one color slot (2 bits)
|
|
; DMG: logo is white, then light gray, then dark gray
|
|
; CGB: logo is white, then yellow
|
|
ldh a, [rOBP1]
|
|
rrca
|
|
rrca
|
|
call DmgToCgbObjPal1
|
|
ret
|
|
|
|
GameFreakPresents_Sparkle:
|
|
; Initialize and configure a sparkle sprite.
|
|
|
|
; run only every second frame
|
|
ld d, a
|
|
and 1
|
|
ret nz
|
|
|
|
; shift over so our index is still changing by 1 each time
|
|
ld a, d
|
|
srl a
|
|
|
|
; set up a new sparkle sprite
|
|
push af
|
|
depixel 11, 11
|
|
ld a, SPRITE_ANIM_OBJ_GS_GAMEFREAK_LOGO_SPARKLE
|
|
call InitSpriteAnimStruct
|
|
pop af
|
|
|
|
; take the bottom 4 bits of a as an index into
|
|
; sparkle_vectors (16 entries)
|
|
and %00001111
|
|
ld e, a
|
|
ld d, 0
|
|
ld hl, .sparkle_vectors
|
|
add hl, de
|
|
add hl, de
|
|
|
|
; set the angle and distance for this sprite
|
|
ld e, l
|
|
ld d, h
|
|
ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX
|
|
add hl, bc
|
|
ld a, [de]
|
|
ld [hl], a ; angle
|
|
inc de
|
|
ld hl, SPRITEANIMSTRUCT_VAR1
|
|
add hl, bc
|
|
ld [hl], 0
|
|
inc hl ; SPRITEANIMSTRUCT_VAR2
|
|
ld a, [de]
|
|
ld [hl], a ; distance
|
|
ret
|
|
|
|
.sparkle_vectors
|
|
; values control final position of each sparkle
|
|
; position is automatically animated along the vector
|
|
; each entry emits two sparkles in opposite directions
|
|
; angle (6 bits) and distance (tiles?)
|
|
db $00, $03
|
|
db $08, $04
|
|
db $04, $03
|
|
db $0c, $02
|
|
db $10, $02
|
|
db $18, $03
|
|
db $14, $04
|
|
db $1c, $03
|
|
db $20, $02
|
|
db $28, $02
|
|
db $24, $03
|
|
db $2c, $04
|
|
db $30, $04
|
|
db $38, $03
|
|
db $34, $02
|
|
db $3c, $04
|
|
|
|
GameFreakLogoGFX:
|
|
INCBIN "gfx/splash/gamefreak_presents.1bpp"
|
|
INCBIN "gfx/splash/gamefreak_logo.1bpp"
|
|
|
|
GameFreakLogoStarsGFX:
|
|
INCBIN "gfx/splash/logo_star.2bpp"
|
|
INCBIN "gfx/splash/logo_sparkle.2bpp"
|