summaryrefslogtreecommitdiff
path: root/engine/movie/intro.asm
diff options
context:
space:
mode:
Diffstat (limited to 'engine/movie/intro.asm')
-rwxr-xr-xengine/movie/intro.asm470
1 files changed, 470 insertions, 0 deletions
diff --git a/engine/movie/intro.asm b/engine/movie/intro.asm
new file mode 100755
index 00000000..9a13c96f
--- /dev/null
+++ b/engine/movie/intro.asm
@@ -0,0 +1,470 @@
+const_value = -1
+ const MOVE_NIDORINO_RIGHT
+ const MOVE_GENGAR_RIGHT
+ const MOVE_GENGAR_LEFT
+
+ANIMATION_END EQU 80
+
+const_value = 3
+ const GENGAR_INTRO_TILES1
+ const GENGAR_INTRO_TILES2
+ const GENGAR_INTRO_TILES3
+
+PlayIntro:
+ xor a
+ ld [hJoyHeld], a
+ inc a
+ ld [H_AUTOBGTRANSFERENABLED], a
+ call PlayShootingStar
+ call PlayIntroScene
+ call GBFadeOutToWhite
+ xor a
+ ld [hSCX], a
+ ld [H_AUTOBGTRANSFERENABLED], a
+ call ClearSprites
+ call DelayFrame
+ ret
+
+PlayIntroScene:
+ ld b, SET_PAL_NIDORINO_INTRO
+ call RunPaletteCommand
+ ldPal a, BLACK, DARK_GRAY, LIGHT_GRAY, WHITE
+ ld [rBGP], a
+ ld [rOBP0], a
+ ld [rOBP1], a
+ xor a
+ ld [hSCX], a
+ ld b, GENGAR_INTRO_TILES1
+ call IntroCopyTiles
+ ld a, 0
+ ld [wBaseCoordX], a
+ ld a, 80
+ ld [wBaseCoordY], a
+ lb bc, 6, 6
+ call InitIntroNidorinoOAM
+ lb de, 80 / 2, MOVE_NIDORINO_RIGHT
+ call IntroMoveMon
+ ret c
+
+; hip
+ ld a, SFX_INTRO_HIP
+ call PlaySound
+ xor a
+ ld [wIntroNidorinoBaseTile], a
+ ld de, IntroNidorinoAnimation1
+ call AnimateIntroNidorino
+; hop
+ ld a, SFX_INTRO_HOP
+ call PlaySound
+ ld de, IntroNidorinoAnimation2
+ call AnimateIntroNidorino
+ ld c, 10
+ call CheckForUserInterruption
+ ret c
+
+; hip
+ ld a, SFX_INTRO_HIP
+ call PlaySound
+ ld de, IntroNidorinoAnimation1
+ call AnimateIntroNidorino
+; hop
+ ld a, SFX_INTRO_HOP
+ call PlaySound
+ ld de, IntroNidorinoAnimation2
+ call AnimateIntroNidorino
+ ld c, 30
+ call CheckForUserInterruption
+ ret c
+
+; raise
+ ld b, GENGAR_INTRO_TILES2
+ call IntroCopyTiles
+ ld a, SFX_INTRO_RAISE
+ call PlaySound
+ lb de, 8 / 2, MOVE_GENGAR_LEFT
+ call IntroMoveMon
+ ld c, 30
+ call CheckForUserInterruption
+ ret c
+
+; slash
+ ld b, GENGAR_INTRO_TILES3
+ call IntroCopyTiles
+ ld a, SFX_INTRO_CRASH
+ call PlaySound
+ lb de, 16 / 2, MOVE_GENGAR_RIGHT
+ call IntroMoveMon
+; hip
+ ld a, SFX_INTRO_HIP
+ call PlaySound
+ ld a, (FightIntroFrontMon2 - FightIntroFrontMon) / BYTES_PER_TILE
+ ld [wIntroNidorinoBaseTile], a
+ ld de, IntroNidorinoAnimation3
+ call AnimateIntroNidorino
+ ld c, 30
+ call CheckForUserInterruption
+ ret c
+
+ lb de, 8 / 2, MOVE_GENGAR_LEFT
+ call IntroMoveMon
+ ld b, GENGAR_INTRO_TILES1
+ call IntroCopyTiles
+ ld c, 60
+ call CheckForUserInterruption
+ ret c
+
+; hip
+ ld a, SFX_INTRO_HIP
+ call PlaySound
+ xor a
+ ld [wIntroNidorinoBaseTile], a
+ ld de, IntroNidorinoAnimation4
+ call AnimateIntroNidorino
+; hop
+ ld a, SFX_INTRO_HOP
+ call PlaySound
+ ld de, IntroNidorinoAnimation5
+ call AnimateIntroNidorino
+ ld c, 20
+ call CheckForUserInterruption
+ ret c
+
+ ld a, (FightIntroFrontMon2 - FightIntroFrontMon) / BYTES_PER_TILE
+ ld [wIntroNidorinoBaseTile], a
+ ld de, IntroNidorinoAnimation6
+ call AnimateIntroNidorino
+ ld c, 30
+ call CheckForUserInterruption
+ ret c
+
+; lunge
+ ld a, SFX_INTRO_LUNGE
+ call PlaySound
+ ld a, (FightIntroFrontMon3 - FightIntroFrontMon) / BYTES_PER_TILE
+ ld [wIntroNidorinoBaseTile], a
+ ld de, IntroNidorinoAnimation7
+ jp AnimateIntroNidorino
+
+AnimateIntroNidorino:
+ ld a, [de]
+ cp ANIMATION_END
+ ret z
+ ld [wBaseCoordY], a
+ inc de
+ ld a, [de]
+ ld [wBaseCoordX], a
+ push de
+ ld c, 6 * 6
+ call UpdateIntroNidorinoOAM
+ ld c, 5
+ call DelayFrames
+ pop de
+ inc de
+ jr AnimateIntroNidorino
+
+UpdateIntroNidorinoOAM:
+ ld hl, wOAMBuffer
+ ld a, [wIntroNidorinoBaseTile]
+ ld d, a
+.loop
+ ld a, [wBaseCoordY]
+ add [hl]
+ ld [hli], a ; Y
+ ld a, [wBaseCoordX]
+ add [hl]
+ ld [hli], a ; X
+ ld a, d
+ ld [hli], a ; tile
+ inc hl
+ inc d
+ dec c
+ jr nz, .loop
+ ret
+
+InitIntroNidorinoOAM:
+ ld hl, wOAMBuffer
+ ld d, 0
+.loop
+ push bc
+ ld a, [wBaseCoordY]
+ ld e, a
+.innerLoop
+ ld a, e
+ add 8
+ ld e, a
+ ld [hli], a ; Y
+ ld a, [wBaseCoordX]
+ ld [hli], a ; X
+ ld a, d
+ ld [hli], a ; tile
+ ld a, OAM_BEHIND_BG
+ ld [hli], a ; attributes
+ inc d
+ dec c
+ jr nz, .innerLoop
+ ld a, [wBaseCoordX]
+ add 8
+ ld [wBaseCoordX], a
+ pop bc
+ dec b
+ jr nz, .loop
+ ret
+
+IntroClearScreen:
+ ld hl, vBGMap1
+ ld bc, BG_MAP_WIDTH * SCREEN_HEIGHT
+ jr IntroClearCommon
+
+IntroClearMiddleOfScreen:
+; clear the area of the tile map between the black bars on the top and bottom
+ coord hl, 0, 4
+ ld bc, SCREEN_WIDTH * 10
+
+IntroClearCommon:
+ ld [hl], 0
+ inc hl
+ dec bc
+ ld a, b
+ or c
+ jr nz, IntroClearCommon
+ ret
+
+IntroPlaceBlackTiles:
+ ld a, 1
+.loop
+ ld [hli], a
+ dec c
+ jr nz, .loop
+ ret
+
+IntroMoveMon:
+; d = number of times to move the mon (2 pixels each time)
+ ld a, e
+ cp MOVE_NIDORINO_RIGHT
+ jr z, .moveNidorinoRight
+ cp MOVE_GENGAR_LEFT
+ jr z, .moveGengarLeft
+; move Gengar right
+ ld a, [hSCX]
+ dec a
+ dec a
+ jr .next
+.moveNidorinoRight
+ push de
+ ld a, 2
+ ld [wBaseCoordX], a
+ xor a
+ ld [wBaseCoordY], a
+ ld c, 6 * 6
+ call UpdateIntroNidorinoOAM
+ pop de
+.moveGengarLeft
+ ld a, [hSCX]
+ inc a
+ inc a
+.next
+ ld [hSCX], a
+ push de
+ ld c, 2
+ call CheckForUserInterruption
+ pop de
+ ret c
+ dec d
+ jr nz, IntroMoveMon
+ ret
+
+IntroCopyTiles:
+ coord hl, 13, 7
+
+CopyTileIDsFromList_ZeroBaseTileID:
+ ld c, 0
+ predef_jump CopyTileIDsFromList
+
+PlayMoveSoundB:
+; unused
+ predef GetMoveSoundB
+ ld a, b
+ jp PlaySound
+
+LoadIntroGraphics:
+ ld hl, FightIntroBackMon
+ ld de, vChars2
+ ld bc, FightIntroBackMonEnd - FightIntroBackMon
+ ld a, BANK(FightIntroBackMon)
+ call FarCopyData2
+ ld hl, GameFreakIntro
+ ld de, vChars2 + (FightIntroBackMonEnd - FightIntroBackMon)
+ ld bc, GameFreakIntroEnd - GameFreakIntro
+ ld a, BANK(GameFreakIntro)
+ call FarCopyData2
+ ld hl, GameFreakIntro
+ ld de, vChars1
+ ld bc, GameFreakIntroEnd - GameFreakIntro
+ ld a, BANK(GameFreakIntro)
+ call FarCopyData2
+ ld hl, FightIntroFrontMon
+ ld de, vChars0
+ ld bc, FightIntroFrontMonEnd - FightIntroFrontMon
+ ld a, BANK(FightIntroFrontMon)
+ jp FarCopyData2
+
+PlayShootingStar:
+ ld b, SET_PAL_GAME_FREAK_INTRO
+ call RunPaletteCommand
+ callba LoadCopyrightAndTextBoxTiles
+ ldPal a, BLACK, DARK_GRAY, LIGHT_GRAY, WHITE
+ ld [rBGP], a
+ ld c, 180
+ call DelayFrames
+ call ClearScreen
+ call DisableLCD
+ xor a
+ ld [wCurOpponent], a
+ call IntroDrawBlackBars
+ call LoadIntroGraphics
+ call EnableLCD
+ ld hl, rLCDC
+ res 5, [hl]
+ set 3, [hl]
+ ld c, 64
+ call DelayFrames
+ callba AnimateShootingStar
+ push af
+ pop af
+ jr c, .next ; skip the delay if the user interrupted the animation
+ ld c, 40
+ call DelayFrames
+.next
+ ld a, BANK(Music_IntroBattle)
+ ld [wAudioROMBank], a
+ ld [wAudioSavedROMBank], a
+ ld a, MUSIC_INTRO_BATTLE
+ ld [wNewSoundID], a
+ call PlaySound
+ call IntroClearMiddleOfScreen
+ call ClearSprites
+ jp Delay3
+
+IntroDrawBlackBars:
+; clear the screen and draw black bars on the top and bottom
+ call IntroClearScreen
+ coord hl, 0, 0
+ ld c, SCREEN_WIDTH * 4
+ call IntroPlaceBlackTiles
+ coord hl, 0, 14
+ ld c, SCREEN_WIDTH * 4
+ call IntroPlaceBlackTiles
+ ld hl, vBGMap1
+ ld c, BG_MAP_WIDTH * 4
+ call IntroPlaceBlackTiles
+ ld hl, vBGMap1 + BG_MAP_WIDTH * 14
+ ld c, BG_MAP_WIDTH * 4
+ jp IntroPlaceBlackTiles
+
+EmptyFunc4:
+ ret
+
+IntroNidorinoAnimation0:
+ db 0, 0
+ db ANIMATION_END
+
+IntroNidorinoAnimation1:
+; This is a sequence of pixel movements for part of the Nidorino animation. This
+; list describes how Nidorino should hop.
+; First byte is y movement, second byte is x movement
+ db 0, 0
+ db -2, 2
+ db -1, 2
+ db 1, 2
+ db 2, 2
+ db ANIMATION_END
+
+IntroNidorinoAnimation2:
+; This is a sequence of pixel movements for part of the Nidorino animation.
+; First byte is y movement, second byte is x movement
+ db 0, 0
+ db -2, -2
+ db -1, -2
+ db 1, -2
+ db 2, -2
+ db ANIMATION_END
+
+IntroNidorinoAnimation3:
+; This is a sequence of pixel movements for part of the Nidorino animation.
+; First byte is y movement, second byte is x movement
+ db 0, 0
+ db -12, 6
+ db -8, 6
+ db 8, 6
+ db 12, 6
+ db ANIMATION_END
+
+IntroNidorinoAnimation4:
+; This is a sequence of pixel movements for part of the Nidorino animation.
+; First byte is y movement, second byte is x movement
+ db 0, 0
+ db -8, -4
+ db -4, -4
+ db 4, -4
+ db 8, -4
+ db ANIMATION_END
+
+IntroNidorinoAnimation5:
+; This is a sequence of pixel movements for part of the Nidorino animation.
+; First byte is y movement, second byte is x movement
+ db 0, 0
+ db -8, 4
+ db -4, 4
+ db 4, 4
+ db 8, 4
+ db ANIMATION_END
+
+IntroNidorinoAnimation6:
+; This is a sequence of pixel movements for part of the Nidorino animation.
+; First byte is y movement, second byte is x movement
+ db 0, 0
+ db 2, 0
+ db 2, 0
+ db 0, 0
+ db ANIMATION_END
+
+IntroNidorinoAnimation7:
+; This is a sequence of pixel movements for part of the Nidorino animation.
+; First byte is y movement, second byte is x movement
+ db -8, -16
+ db -7, -14
+ db -6, -12
+ db -4, -10
+ db ANIMATION_END
+
+GameFreakIntro:
+ INCBIN "gfx/intro_credits/gamefreak_presents.2bpp"
+ INCBIN "gfx/intro_credits/gamefreak_logo.2bpp"
+ ds 16, $00 ; blank tile
+GameFreakIntroEnd:
+
+FightIntroBackMon:
+ INCBIN "gfx/intro_credits/gengar.2bpp"
+FightIntroBackMonEnd:
+
+FightIntroFrontMon:
+
+IF DEF(_RED)
+ INCBIN "gfx/intro_credits/red_nidorino_1.2bpp"
+FightIntroFrontMon2:
+ INCBIN "gfx/intro_credits/red_nidorino_2.2bpp"
+FightIntroFrontMon3:
+ INCBIN "gfx/intro_credits/red_nidorino_3.2bpp"
+ENDC
+
+IF DEF(_BLUE)
+ INCBIN "gfx/intro_credits/blue_jigglypuff_1.2bpp"
+FightIntroFrontMon2:
+ INCBIN "gfx/intro_credits/blue_jigglypuff_2.2bpp"
+FightIntroFrontMon3:
+ INCBIN "gfx/intro_credits/blue_jigglypuff_3.2bpp"
+ENDC
+
+FightIntroFrontMonEnd:
+
+ ds 16, $00 ; blank tile