aboutsummaryrefslogtreecommitdiffstats
path: root/engine/movie/gamefreak.asm
diff options
context:
space:
mode:
Diffstat (limited to 'engine/movie/gamefreak.asm')
-rwxr-xr-xengine/movie/gamefreak.asm243
1 files changed, 243 insertions, 0 deletions
diff --git a/engine/movie/gamefreak.asm b/engine/movie/gamefreak.asm
new file mode 100755
index 00000000..78e48384
--- /dev/null
+++ b/engine/movie/gamefreak.asm
@@ -0,0 +1,243 @@
+LoadShootingStarGraphics:
+ ld a, $f9
+ ld [rOBP0], a
+ ld a, $a4
+ ld [rOBP1], a
+ ld de, AnimationTileset2 + $30 ; star tile (top left quadrant)
+ ld hl, vChars1 + $200
+ lb bc, BANK(AnimationTileset2), $01
+ call CopyVideoData
+ ld de, AnimationTileset2 + $130 ; star tile (bottom left quadrant)
+ ld hl, vChars1 + $210
+ lb bc, BANK(AnimationTileset2), $01
+ call CopyVideoData
+ ld de, FallingStar
+ ld hl, vChars1 + $220
+ lb bc, BANK(FallingStar), (FallingStarEnd - FallingStar) / $10
+ call CopyVideoData
+ ld hl, GameFreakLogoOAMData
+ ld de, wOAMBuffer + $60
+ ld bc, GameFreakLogoOAMDataEnd - GameFreakLogoOAMData
+ call CopyData
+ ld hl, GameFreakShootingStarOAMData
+ ld de, wOAMBuffer
+ ld bc, GameFreakShootingStarOAMDataEnd - GameFreakShootingStarOAMData
+ jp CopyData
+
+AnimateShootingStar:
+ call LoadShootingStarGraphics
+ ld a, SFX_SHOOTING_STAR
+ call PlaySound
+
+; Move the big star down and left across the screen.
+ ld hl, wOAMBuffer
+ lb bc, $a0, $4
+.bigStarLoop
+ push hl
+ push bc
+.bigStarInnerLoop
+ ld a, [hl] ; Y
+ add 4
+ ld [hli], a
+ ld a, [hl] ; X
+ add -4
+ ld [hli], a
+ inc hl
+ inc hl
+ dec c
+ jr nz, .bigStarInnerLoop
+ ld c, 1
+ call CheckForUserInterruption
+ pop bc
+ pop hl
+ ret c
+ ld a, [hl]
+ cp 80
+ jr nz, .next
+ jr .bigStarLoop
+.next
+ cp b
+ jr nz, .bigStarLoop
+
+; Clear big star OAM.
+ ld hl, wOAMBuffer
+ ld c, 4
+ ld de, 4
+.clearOAMLoop
+ ld [hl], 160
+ add hl, de
+ dec c
+ jr nz, .clearOAMLoop
+
+; Make Gamefreak logo flash.
+ ld b, 3
+.flashLogoLoop
+ ld hl, rOBP0
+ rrc [hl]
+ rrc [hl]
+ ld c, 10
+ call CheckForUserInterruption
+ ret c
+ dec b
+ jr nz, .flashLogoLoop
+
+; Copy 24 instances of the small stars OAM data.
+; Note that their coordinates put them off-screen.
+ ld de, wOAMBuffer
+ ld a, 24
+.initSmallStarsOAMLoop
+ push af
+ ld hl, SmallStarsOAM
+ ld bc, SmallStarsOAMEnd - SmallStarsOAM
+ call CopyData
+ pop af
+ dec a
+ jr nz, .initSmallStarsOAMLoop
+
+; Animate the small stars falling from the Gamefreak logo.
+ xor a
+ ld [wMoveDownSmallStarsOAMCount], a
+ ld hl, SmallStarsWaveCoordsPointerTable
+ ld c, 6
+.smallStarsLoop
+ ld a, [hli]
+ ld e, a
+ ld a, [hli]
+ ld d, a
+ push bc
+ push hl
+ ld hl, wOAMBuffer + $50
+ ld c, 4
+.smallStarsInnerLoop ; introduce new wave of 4 small stars OAM entries
+ ld a, [de]
+ cp $ff
+ jr z, .next2
+ ld [hli], a ; Y
+ inc de
+ ld a, [de]
+ ld [hli], a ; X
+ inc de
+ inc hl
+ inc hl
+ dec c
+ jr nz, .smallStarsInnerLoop
+ ld a, [wMoveDownSmallStarsOAMCount]
+ cp 24
+ jr z, .next2
+ add 6 ; should be 4, but the extra 2 aren't visible on screen
+ ld [wMoveDownSmallStarsOAMCount], a
+.next2
+ call MoveDownSmallStars
+ push af
+
+; shift the existing OAM entries down to make room for the next wave
+ ld hl, wOAMBuffer + $10
+ ld de, wOAMBuffer
+ ld bc, $50
+ call CopyData
+
+ pop af
+ pop hl
+ pop bc
+ ret c
+ dec c
+ jr nz, .smallStarsLoop
+ and a
+ ret
+
+SmallStarsOAM:
+ db $00,$00,$A2,$90
+SmallStarsOAMEnd:
+
+SmallStarsWaveCoordsPointerTable:
+ dw SmallStarsWave1Coords
+ dw SmallStarsWave2Coords
+ dw SmallStarsWave3Coords
+ dw SmallStarsWave4Coords
+ dw SmallStarsEmptyWave
+ dw SmallStarsEmptyWave
+
+; The stars that fall from the Gamefreak logo come in 4 waves of 4 OAM entries.
+; These arrays contain the Y and X coordinates of each OAM entry.
+
+SmallStarsWave1Coords:
+ db $68,$30
+ db $68,$40
+ db $68,$58
+ db $68,$78
+
+SmallStarsWave2Coords:
+ db $68,$38
+ db $68,$48
+ db $68,$60
+ db $68,$70
+
+SmallStarsWave3Coords:
+ db $68,$34
+ db $68,$4C
+ db $68,$54
+ db $68,$64
+
+SmallStarsWave4Coords:
+ db $68,$3C
+ db $68,$5C
+ db $68,$6C
+ db $68,$74
+
+SmallStarsEmptyWave:
+ db $FF
+
+MoveDownSmallStars:
+ ld b, 8
+.loop
+ ld hl, wOAMBuffer + $5c
+ ld a, [wMoveDownSmallStarsOAMCount]
+ ld de, -4
+ ld c, a
+.innerLoop
+ inc [hl] ; Y
+ add hl, de
+ dec c
+ jr nz, .innerLoop
+; Toggle the palette so that the lower star in the small stars tile blinks in
+; and out.
+ ld a, [rOBP1]
+ xor %10100000
+ ld [rOBP1], a
+
+ ld c, 3
+ call CheckForUserInterruption
+ ret c
+ dec b
+ jr nz, .loop
+ ret
+
+GameFreakLogoOAMData:
+ db $48,$50,$8D,$00
+ db $48,$58,$8E,$00
+ db $50,$50,$8F,$00
+ db $50,$58,$90,$00
+ db $58,$50,$91,$00
+ db $58,$58,$92,$00
+ db $60,$30,$80,$00
+ db $60,$38,$81,$00
+ db $60,$40,$82,$00
+ db $60,$48,$83,$00
+ db $60,$50,$93,$00
+ db $60,$58,$84,$00
+ db $60,$60,$85,$00
+ db $60,$68,$83,$00
+ db $60,$70,$81,$00
+ db $60,$78,$86,$00
+GameFreakLogoOAMDataEnd:
+
+GameFreakShootingStarOAMData:
+ db $00,$A0,$A0,$10
+ db $00,$A8,$A0,$30
+ db $08,$A0,$A1,$10
+ db $08,$A8,$A1,$30
+GameFreakShootingStarOAMDataEnd:
+
+FallingStar:
+ INCBIN "gfx/intro_credits/falling_star.2bpp"
+FallingStarEnd: