pokecrystal/engine/movie/credits.asm

613 lines
9.1 KiB
NASM
Raw Normal View History

SECTION "Credits", ROMX
2013-02-26 05:51:05 +00:00
2018-06-24 14:09:41 +00:00
Credits::
2015-12-15 01:06:41 +00:00
bit 6, b ; Hall Of Fame
ld a, $0
2015-12-15 01:06:41 +00:00
jr z, .okay
ld a, $40
2015-12-15 01:06:41 +00:00
.okay
2015-10-24 23:49:19 +00:00
ld [wJumptableIndex], a
ldh a, [rSVBK]
push af
ld a, BANK(wGBCPalettes)
ldh [rSVBK], a
2015-11-12 04:38:57 +00:00
call ClearBGPalettes
call ClearTilemap
call ClearSprites
ld hl, wCreditsBlankFrame2bpp
ld c, (wCreditsBlankFrame2bppEnd - wCreditsBlankFrame2bpp) / 2
2018-08-26 17:23:40 +00:00
ld de, `22222222 ; eight pixels, each color #2 (dark)
; Fill wCreditsBlankFrame2bpp with 4x4=16 tiles, all solid dark color
; (the same color used for the four border frame mons' backgrounds)
2015-12-15 01:06:41 +00:00
.load_loop
ld a, e
ld [hli], a
ld a, d
ld [hli], a
dec c
2015-12-15 01:06:41 +00:00
jr nz, .load_loop
ld de, CreditsBorderGFX
2017-12-28 12:32:33 +00:00
ld hl, vTiles2 tile $20
2018-01-15 00:43:35 +00:00
lb bc, BANK(CreditsBorderGFX), 9
call Request2bpp
ld de, CopyrightGFX
2017-12-28 12:32:33 +00:00
ld hl, vTiles2 tile $60
2018-01-15 00:43:35 +00:00
lb bc, BANK(CopyrightGFX), 29
call Request2bpp
ld de, TheEndGFX
2017-12-28 12:32:33 +00:00
ld hl, vTiles2 tile $40
2018-01-15 00:43:35 +00:00
lb bc, BANK(TheEndGFX), 16
call Request2bpp
ld a, $ff
2015-12-15 01:06:41 +00:00
ld [wCreditsBorderFrame], a
xor a
2015-12-15 01:06:41 +00:00
ld [wCreditsBorderMon], a
2015-12-15 01:06:41 +00:00
call Credits_LoadBorderGFX
ld e, l
ld d, h
2017-12-28 12:32:33 +00:00
ld hl, vTiles2
2015-12-15 01:06:41 +00:00
lb bc, BANK(CreditsMonsGFX), 16
call Request2bpp
2015-12-15 01:06:41 +00:00
call ConstructCreditsTilemap
xor a
2015-12-15 01:06:41 +00:00
ld [wCreditsLYOverride], a
2018-01-23 22:39:09 +00:00
ld hl, wLYOverrides
ld bc, $100
xor a
call ByteFill
2018-08-25 18:34:25 +00:00
ld a, LOW(rSCX)
ldh [hLCDCPointer], a
call GetCreditsPalette
call SetDefaultBGPAndOBP
; BUG: Credits sequence changes move selection menu behavior (see docs/bugs_and_glitches.md)
ldh a, [hVBlank]
push af
ld a, $5
ldh [hVBlank], a
ld a, TRUE
ldh [hInMenu], a
xor a
ldh [hBGMapMode], a
2018-01-23 22:39:09 +00:00
ld [wCreditsPos], a
2020-04-17 14:52:59 +00:00
ld [wCreditsPos + 1], a
2018-01-23 22:39:09 +00:00
ld [wCreditsTimer], a
2015-12-15 01:06:41 +00:00
.execution_loop
call Credits_HandleBButton
call Credits_HandleAButton
jr nz, .exit_credits
2015-12-15 01:06:41 +00:00
call Credits_Jumptable
call DelayFrame
2015-12-15 01:06:41 +00:00
jr .execution_loop
2015-12-15 01:06:41 +00:00
.exit_credits
2015-11-12 04:38:57 +00:00
call ClearBGPalettes
xor a
ldh [hLCDCPointer], a
ldh [hBGMapAddress], a
pop af
ldh [hVBlank], a
pop af
ldh [rSVBK], a
ret
2018-06-24 14:09:41 +00:00
Credits_HandleAButton:
ldh a, [hJoypadDown]
2015-12-15 01:06:41 +00:00
and A_BUTTON
ret z
2015-10-24 23:49:19 +00:00
ld a, [wJumptableIndex]
bit 7, a
ret
2018-06-24 14:09:41 +00:00
Credits_HandleBButton:
ldh a, [hJoypadDown]
2015-12-15 01:06:41 +00:00
and B_BUTTON
ret z
2015-10-24 23:49:19 +00:00
ld a, [wJumptableIndex]
bit 6, a
ret z
2018-01-23 22:39:09 +00:00
ld hl, wCreditsPos
ld a, [hli]
cp $d
2015-12-15 01:06:41 +00:00
jr nc, .okay
ld a, [hli]
and a
ret z
2015-12-15 01:06:41 +00:00
.okay
2018-01-23 22:39:09 +00:00
ld hl, wCreditsTimer
ld a, [hl]
and a
ret z
dec [hl]
ret
2018-06-24 14:09:41 +00:00
Credits_Jumptable:
2015-10-24 23:49:19 +00:00
ld a, [wJumptableIndex]
and $f
ld e, a
ld d, 0
2015-12-15 01:06:41 +00:00
ld hl, .Jumptable
add hl, de
add hl, de
ld a, [hli]
ld h, [hl]
ld l, a
jp hl
2018-06-24 14:09:41 +00:00
.Jumptable:
2015-12-27 02:59:03 +00:00
dw ParseCredits
dw Credits_Next
dw Credits_Next
dw Credits_PrepBGMapUpdate
dw Credits_UpdateGFXRequestPath
dw Credits_RequestGFX
dw Credits_LYOverride
dw Credits_Next
dw Credits_Next
dw Credits_Next
dw Credits_UpdateGFXRequestPath
dw Credits_RequestGFX
dw Credits_LoopBack
2015-12-15 01:06:41 +00:00
2018-06-24 14:09:41 +00:00
Credits_Next:
2015-10-24 23:49:19 +00:00
ld hl, wJumptableIndex
inc [hl]
ret
2018-06-24 14:09:41 +00:00
Credits_LoopBack:
2015-10-24 23:49:19 +00:00
ld hl, wJumptableIndex
ld a, [hl]
and $f0
ld [hl], a
ret
2018-06-24 14:09:41 +00:00
Credits_PrepBGMapUpdate:
xor a
ldh [hBGMapMode], a
2015-12-15 01:06:41 +00:00
jp Credits_Next
2018-06-24 14:09:41 +00:00
Credits_UpdateGFXRequestPath:
2015-12-15 01:06:41 +00:00
call Credits_LoadBorderGFX
ld a, l
2018-01-23 22:39:09 +00:00
ld [wRequested2bppSource], a
ld a, h
2018-01-23 22:39:09 +00:00
ld [wRequested2bppSource + 1], a
2017-12-28 12:32:33 +00:00
ld a, LOW(vTiles2)
2018-01-23 22:39:09 +00:00
ld [wRequested2bppDest], a
2017-12-28 12:32:33 +00:00
ld a, HIGH(vTiles2)
2018-01-23 22:39:09 +00:00
ld [wRequested2bppDest + 1], a
2015-12-15 01:06:41 +00:00
jr Credits_RequestGFX
2018-06-24 14:09:41 +00:00
Credits_RequestGFX:
xor a
ldh [hBGMapMode], a
ld a, 8
ld [wRequested2bppSize], a
2015-12-15 01:06:41 +00:00
jp Credits_Next
2018-06-24 14:09:41 +00:00
Credits_LYOverride:
ldh a, [rLY]
cp $30
2015-12-15 01:06:41 +00:00
jr c, Credits_LYOverride
ld a, [wCreditsLYOverride]
dec a
dec a
2015-12-15 01:06:41 +00:00
ld [wCreditsLYOverride], a
2018-01-23 22:39:09 +00:00
ld hl, wLYOverrides + $1f
2015-12-15 01:06:41 +00:00
call .Fill
2018-01-23 22:39:09 +00:00
ld hl, wLYOverrides + $87
2015-12-15 01:06:41 +00:00
call .Fill
jp Credits_Next
2018-06-24 14:09:41 +00:00
.Fill:
ld c, $8
2015-12-15 01:06:41 +00:00
.loop
ld [hli], a
dec c
2015-12-15 01:06:41 +00:00
jr nz, .loop
ret
2018-06-24 14:09:41 +00:00
ParseCredits:
2015-10-24 23:49:19 +00:00
ld hl, wJumptableIndex
2013-02-26 05:51:05 +00:00
bit 7, [hl]
jp nz, .done
2013-02-26 05:51:05 +00:00
; Wait until the timer has run out to parse the next command.
2018-01-23 22:39:09 +00:00
ld hl, wCreditsTimer
2013-02-26 05:51:05 +00:00
ld a, [hl]
and a
jr z, .parse
2013-02-26 05:51:05 +00:00
; One tick has passed.
dec [hl]
jp .done
2013-02-26 05:51:05 +00:00
.parse
; First, let's clear the current text display,
; starting from line 5.
xor a
ldh [hBGMapMode], a
2013-02-26 05:51:05 +00:00
hlcoord 0, 5
ld bc, SCREEN_WIDTH * 12
2013-02-26 05:51:05 +00:00
ld a, " "
call ByteFill
2013-02-26 05:51:05 +00:00
; Then read the script.
2013-02-26 05:51:05 +00:00
.loop
call .get
2013-02-26 05:51:05 +00:00
; Commands:
2013-11-28 05:55:32 +00:00
cp CREDITS_END
2013-02-26 05:51:05 +00:00
jp z, .end
cp CREDITS_WAIT
jr z, .wait
cp CREDITS_SCENE
jr z, .scene
cp CREDITS_CLEAR
jr z, .clear
cp CREDITS_MUSIC
jr z, .music
cp CREDITS_WAIT2
jr z, .wait2
cp CREDITS_THEEND
jr z, .theend
2013-02-26 05:51:05 +00:00
; If it's not a command, it's a string identifier.
2013-02-26 05:51:05 +00:00
push af
ld e, a
ld d, 0
ld hl, CreditsStringsPointers
2013-02-26 05:51:05 +00:00
add hl, de
add hl, de
2013-02-26 05:51:05 +00:00
ld a, [hli]
ld d, [hl]
ld e, a
pop af
2013-02-26 05:51:05 +00:00
; Strings spanning multiple lines have special cases.
2013-02-26 05:51:05 +00:00
cp COPYRIGHT
jr z, .copyright
2013-02-26 05:51:05 +00:00
cp STAFF
jr c, .staff
2013-02-26 05:51:05 +00:00
; The rest start from line 6.
hlcoord 0, 6
jr .print
2013-02-26 05:51:05 +00:00
.copyright
hlcoord 2, 6
jr .print
2013-02-26 05:51:05 +00:00
.staff
hlcoord 0, 6
2013-02-26 05:51:05 +00:00
.print
; Print strings spaced every two lines.
call .get
ld bc, SCREEN_WIDTH * 2
2013-02-26 05:51:05 +00:00
call AddNTimes
call PlaceString
jr .loop
2013-02-26 05:51:05 +00:00
.theend
; Display "The End" graphic.
2015-12-15 01:06:41 +00:00
call Credits_TheEnd
2013-02-26 05:51:05 +00:00
jr .loop
2013-02-26 05:51:05 +00:00
.scene
; Update the scene number and corresponding palette.
call .get
2015-12-15 01:06:41 +00:00
ld [wCreditsBorderMon], a ; scene
2013-02-26 05:51:05 +00:00
xor a
2015-12-15 01:06:41 +00:00
ld [wCreditsBorderFrame], a ; frame
2013-02-26 05:51:05 +00:00
call GetCreditsPalette
call SetDefaultBGPAndOBP ; update hw pal registers
2013-02-26 05:51:05 +00:00
jr .loop
2013-02-26 05:51:05 +00:00
.clear
; Clear the banner.
ld a, $ff
2015-12-15 01:06:41 +00:00
ld [wCreditsBorderFrame], a ; frame
2013-02-26 05:51:05 +00:00
jr .loop
2013-02-26 05:51:05 +00:00
.music
; Play the credits music.
ld de, MUSIC_CREDITS
push de
ld de, MUSIC_NONE
2013-10-08 17:21:15 +00:00
call PlayMusic
2013-02-26 05:51:05 +00:00
call DelayFrame
pop de
2013-10-08 17:21:15 +00:00
call PlayMusic
2013-02-26 05:51:05 +00:00
jp .loop
2013-02-26 05:51:05 +00:00
.wait2
; Wait for some amount of ticks.
call .get
2018-01-23 22:39:09 +00:00
ld [wCreditsTimer], a
2013-02-26 05:51:05 +00:00
jr .done
2013-02-26 05:51:05 +00:00
.wait
; Wait for some amount of ticks, and do something else.
call .get
2018-01-23 22:39:09 +00:00
ld [wCreditsTimer], a
2013-02-26 05:51:05 +00:00
xor a
ldh [hBGMapThird], a
2013-02-26 05:51:05 +00:00
ld a, 1
ldh [hBGMapMode], a
2013-02-26 05:51:05 +00:00
.done
2015-12-15 01:06:41 +00:00
jp Credits_Next
2013-02-26 05:51:05 +00:00
.end
; Stop execution.
2015-10-24 23:49:19 +00:00
ld hl, wJumptableIndex
2013-02-26 05:51:05 +00:00
set 7, [hl]
2015-12-15 01:06:41 +00:00
ld a, 32
2018-01-23 22:39:09 +00:00
ld [wMusicFade], a
ld a, LOW(MUSIC_POST_CREDITS)
2018-01-23 22:39:09 +00:00
ld [wMusicFadeID], a
ld a, HIGH(MUSIC_POST_CREDITS)
2018-01-23 22:39:09 +00:00
ld [wMusicFadeID + 1], a
2013-02-26 05:51:05 +00:00
ret
.get
2018-01-23 22:39:09 +00:00
; Get byte wCreditsPos from CreditsScript
2013-02-26 05:51:05 +00:00
push hl
push de
2018-01-23 22:39:09 +00:00
ld a, [wCreditsPos]
2013-02-26 05:51:05 +00:00
ld e, a
ld a, [wCreditsPos + 1]
2013-02-26 05:51:05 +00:00
ld d, a
ld hl, CreditsScript
add hl, de
2013-02-26 05:51:05 +00:00
inc de
ld a, e
2018-01-23 22:39:09 +00:00
ld [wCreditsPos], a
2013-02-26 05:51:05 +00:00
ld a, d
ld [wCreditsPos + 1], a
2013-02-26 05:51:05 +00:00
ld a, [hl]
pop de
pop hl
ret
2018-06-24 14:09:41 +00:00
ConstructCreditsTilemap:
2013-10-02 04:53:35 +00:00
xor a
ldh [hBGMapMode], a
2013-10-02 04:53:35 +00:00
ld a, $c
ldh [hBGMapAddress], a
2015-12-15 01:06:41 +00:00
2013-10-02 04:53:35 +00:00
ld a, $28
hlcoord 0, 0
2015-12-15 01:06:41 +00:00
ld bc, SCREEN_HEIGHT * SCREEN_WIDTH
2013-10-02 04:53:35 +00:00
call ByteFill
2015-12-15 01:06:41 +00:00
2013-10-02 04:53:35 +00:00
ld a, $7f
hlcoord 0, 4
2015-12-15 01:06:41 +00:00
ld bc, (SCREEN_HEIGHT - 4) * SCREEN_WIDTH
2013-10-02 04:53:35 +00:00
call ByteFill
2015-12-15 01:06:41 +00:00
hlcoord 0, 4
2013-10-02 04:53:35 +00:00
ld a, $24
2015-12-15 01:06:41 +00:00
call DrawCreditsBorder
hlcoord 0, 17
2013-10-02 04:53:35 +00:00
ld a, $20
2015-12-15 01:06:41 +00:00
call DrawCreditsBorder
hlcoord 0, 0, wAttrmap
2015-12-15 01:06:41 +00:00
ld bc, 4 * SCREEN_WIDTH
2013-10-02 04:53:35 +00:00
xor a
call ByteFill
2015-12-15 01:06:41 +00:00
hlcoord 0, 4, wAttrmap
2015-12-15 01:06:41 +00:00
ld bc, SCREEN_WIDTH
2013-10-02 04:53:35 +00:00
ld a, $1
call ByteFill
2015-12-15 01:06:41 +00:00
hlcoord 0, 5, wAttrmap
2015-12-15 01:06:41 +00:00
ld bc, 12 * SCREEN_WIDTH
2013-10-02 04:53:35 +00:00
ld a, $2
call ByteFill
2015-12-15 01:06:41 +00:00
hlcoord 0, 17, wAttrmap
2015-12-15 01:06:41 +00:00
ld bc, SCREEN_WIDTH
2013-10-02 04:53:35 +00:00
ld a, $1
call ByteFill
2015-12-15 01:06:41 +00:00
2015-12-11 21:59:40 +00:00
call WaitBGMap2
2013-10-02 04:53:35 +00:00
xor a
ldh [hBGMapMode], a
ldh [hBGMapAddress], a
hlcoord 0, 0
2015-12-15 01:06:41 +00:00
call .InitTopPortion
2015-12-11 21:59:40 +00:00
call WaitBGMap2
2013-10-02 04:53:35 +00:00
ret
2018-06-24 14:09:41 +00:00
.InitTopPortion:
2015-12-15 01:06:41 +00:00
ld b, 5
.outer_loop
2013-10-02 04:53:35 +00:00
push hl
2015-12-15 01:06:41 +00:00
ld de, SCREEN_WIDTH - 3
ld c, 4
2013-10-02 04:53:35 +00:00
xor a
2015-12-15 01:06:41 +00:00
.inner_loop
rept 3
2013-10-02 04:53:35 +00:00
ld [hli], a
inc a
2015-12-15 01:06:41 +00:00
endr
2013-10-02 04:53:35 +00:00
ld [hl], a
inc a
add hl, de
dec c
2015-12-15 01:06:41 +00:00
jr nz, .inner_loop
2013-10-02 04:53:35 +00:00
pop hl
2015-07-21 02:18:18 +00:00
rept 4
2013-10-02 04:53:35 +00:00
inc hl
2015-07-21 02:18:18 +00:00
endr
2013-10-02 04:53:35 +00:00
dec b
2015-12-15 01:06:41 +00:00
jr nz, .outer_loop
2013-10-02 04:53:35 +00:00
ret
2013-02-26 05:51:05 +00:00
2018-06-24 14:09:41 +00:00
DrawCreditsBorder:
2015-12-15 01:06:41 +00:00
ld c, SCREEN_WIDTH / 4
.loop
2013-10-02 04:53:35 +00:00
push af
2015-12-15 01:06:41 +00:00
rept 3
2013-10-02 04:53:35 +00:00
ld [hli], a
inc a
2015-12-15 01:06:41 +00:00
endr
2013-10-02 04:53:35 +00:00
ld [hli], a
pop af
dec c
2015-12-15 01:06:41 +00:00
jr nz, .loop
2013-10-02 04:53:35 +00:00
ret
2013-02-26 05:51:05 +00:00
2018-06-24 14:09:41 +00:00
GetCreditsPalette:
2013-02-26 05:51:05 +00:00
call .GetPalAddress
2013-02-26 05:51:05 +00:00
push hl
ld a, 0
call .UpdatePals
pop hl
ret
.GetPalAddress:
2013-02-26 05:51:05 +00:00
; Each set of palette data is 24 bytes long.
2015-12-15 01:06:41 +00:00
ld a, [wCreditsBorderMon] ; scene
2018-01-11 17:00:01 +00:00
and %11
2013-02-26 05:51:05 +00:00
add a
add a ; * 8
add a
ld e, a
ld d, 0
2013-11-24 09:09:17 +00:00
ld hl, CreditsPalettes
2013-02-26 05:51:05 +00:00
add hl, de
add hl, de ; * 3
add hl, de
ret
.UpdatePals:
2013-02-26 05:51:05 +00:00
; Update the first three colors in both palette buffers.
push af
push hl
2018-01-01 14:08:21 +00:00
add LOW(wBGPals1)
2013-02-26 05:51:05 +00:00
ld e, a
ld a, 0
2018-01-01 14:08:21 +00:00
adc HIGH(wBGPals1)
2013-02-26 05:51:05 +00:00
ld d, a
ld bc, 24
call CopyBytes
2013-02-26 05:51:05 +00:00
pop hl
pop af
2018-01-01 14:08:21 +00:00
add LOW(wBGPals2)
2013-02-26 05:51:05 +00:00
ld e, a
ld a, 0
2018-01-01 14:08:21 +00:00
adc HIGH(wBGPals2)
2013-02-26 05:51:05 +00:00
ld d, a
ld bc, 24
call CopyBytes
ret
2013-11-24 09:09:17 +00:00
CreditsPalettes:
INCLUDE "gfx/credits/credits.pal"
2013-02-26 05:51:05 +00:00
2018-06-24 14:09:41 +00:00
Credits_LoadBorderGFX:
2015-12-15 01:06:41 +00:00
ld hl, wCreditsBorderFrame
ld a, [hl]
cp $ff
2015-12-15 01:06:41 +00:00
jr z, .init
2013-11-24 09:09:17 +00:00
2018-01-11 17:00:01 +00:00
and %11
ld e, a
inc a
2018-01-11 17:00:01 +00:00
and %11
ld [hl], a
2015-12-15 01:06:41 +00:00
ld a, [wCreditsBorderMon]
2018-01-11 17:00:01 +00:00
and %11
add a
add a
add e
add a
ld e, a
2013-11-24 09:09:17 +00:00
ld d, 0
2015-12-15 01:06:41 +00:00
ld hl, .Frames
add hl, de
ld a, [hli]
ld h, [hl]
ld l, a
ret
2013-11-24 09:09:17 +00:00
2015-12-15 01:06:41 +00:00
.init
ld hl, wCreditsBlankFrame2bpp
ret
2018-06-24 14:09:41 +00:00
.Frames:
2013-11-24 09:09:17 +00:00
dw CreditsPichuGFX
2015-12-15 01:06:41 +00:00
dw CreditsPichuGFX + 16 tiles
dw CreditsPichuGFX + 32 tiles
dw CreditsPichuGFX + 48 tiles
2013-11-24 09:09:17 +00:00
dw CreditsSmoochumGFX
2015-12-15 01:06:41 +00:00
dw CreditsSmoochumGFX + 16 tiles
dw CreditsSmoochumGFX + 32 tiles
dw CreditsSmoochumGFX + 48 tiles
2013-11-24 09:09:17 +00:00
dw CreditsDittoGFX
2015-12-15 01:06:41 +00:00
dw CreditsDittoGFX + 16 tiles
dw CreditsDittoGFX + 32 tiles
dw CreditsDittoGFX + 48 tiles
2013-11-24 09:09:17 +00:00
dw CreditsIgglybuffGFX
2015-12-15 01:06:41 +00:00
dw CreditsIgglybuffGFX + 16 tiles
dw CreditsIgglybuffGFX + 32 tiles
dw CreditsIgglybuffGFX + 48 tiles
2018-06-24 14:09:41 +00:00
Credits_TheEnd:
ld a, $40
hlcoord 6, 9
2015-12-15 01:06:41 +00:00
call .Load
hlcoord 6, 10
2018-06-24 14:09:41 +00:00
.Load:
2015-12-15 01:06:41 +00:00
ld c, 8
.loop
ld [hli], a
inc a
dec c
2015-12-15 01:06:41 +00:00
jr nz, .loop
ret
2017-12-27 01:02:00 +00:00
CreditsBorderGFX: INCBIN "gfx/credits/border.2bpp"
CreditsMonsGFX: ; used only for BANK(CreditsMonsGFX)
2017-12-27 01:02:00 +00:00
CreditsPichuGFX: INCBIN "gfx/credits/pichu.2bpp"
CreditsSmoochumGFX: INCBIN "gfx/credits/smoochum.2bpp"
CreditsDittoGFX: INCBIN "gfx/credits/ditto.2bpp"
CreditsIgglybuffGFX: INCBIN "gfx/credits/igglybuff.2bpp"
INCLUDE "data/credits_script.asm"
INCLUDE "data/credits_strings.asm"