pokecrystal-board/engine/title.asm
2015-12-26 21:59:03 -05:00

484 lines
6.5 KiB
NASM

_TitleScreen: ; 10ed67
call ClearBGPalettes
call ClearSprites
call ClearTileMap
; Turn BG Map update off
xor a
ld [hBGMapMode], a
; Reset timing variables
ld hl, wJumptableIndex
ld [hli], a ; cf63 ; Scene?
ld [hli], a ; cf64
ld [hli], a ; cf65 ; Timer lo
ld [hl], a ; cf66 ; Timer hi
; Turn LCD off
call DisableLCD
; VRAM bank 1
ld a, 1
ld [rVBK], a
; Decompress running Suicune gfx
ld hl, TitleSuicuneGFX
ld de, VTiles1
call Decompress
; Clear screen palettes
hlbgcoord 0, 0
ld bc, 20 bgrows
xor a
call ByteFill
; Fill tile palettes:
; BG Map 1:
; line 0 (copyright)
hlbgcoord 0, 0, VBGMap1
ld bc, 1 bgrows
ld a, 7 ; palette
call ByteFill
; BG Map 0:
; Apply logo gradient:
; lines 3-4
hlbgcoord 0, 3
ld bc, 2 bgrows
ld a, 2
call ByteFill
; line 5
hlbgcoord 0, 5
ld bc, 1 bgrows
ld a, 3
call ByteFill
; line 6
hlbgcoord 0, 6
ld bc, 1 bgrows
ld a, 4
call ByteFill
; line 7
hlbgcoord 0, 7
ld bc, 1 bgrows
ld a, 5
call ByteFill
; lines 8-9
hlbgcoord 0, 8
ld bc, 2 bgrows
ld a, 6
call ByteFill
; 'CRYSTAL VERSION'
hlbgcoord 5, 9
ld bc, NAME_LENGTH ; length of version text
ld a, 1
call ByteFill
; Suicune gfx
hlbgcoord 0, 12
ld bc, 6 bgrows ; the rest of the screen
ld a, 8
call ByteFill
; Back to VRAM bank 0
ld a, $0
ld [rVBK], a
; Decompress logo
ld hl, TitleLogoGFX
ld de, VTiles1
call Decompress
; Decompress background crystal
ld hl, TitleCrystalGFX
ld de, VTiles0
call Decompress
; Clear screen tiles
hlbgcoord 0, 0
ld bc, 64 bgrows
ld a, " "
call ByteFill
; Draw Pokemon logo
hlcoord 0, 3
lb bc, 7, 20
ld d, $80
ld e, $14
call DrawTitleGraphic
; Draw copyright text
hlbgcoord 3, 0, VBGMap1
lb bc, 1, 13
ld d, $c
ld e, $10
call DrawTitleGraphic
; Initialize running Suicune?
ld d, $0
call LoadSuicuneFrame
; Initialize background crystal
call InitializeBackground
; Save WRAM bank
ld a, [rSVBK]
push af
; WRAM bank 5
ld a, 5
ld [rSVBK], a
; Update palette colors
ld hl, TitleScreenPalettes
ld de, UnknBGPals
ld bc, 4 * 32
call CopyBytes
ld hl, TitleScreenPalettes
ld de, BGPals
ld bc, 4 * 32
call CopyBytes
; Restore WRAM bank
pop af
ld [rSVBK], a
; LY/SCX trickery starts here
ld a, [rSVBK]
push af
ld a, 5 ; BANK(LYOverrides)
ld [rSVBK], a
; Make alternating lines come in from opposite sides
; ( This part is actually totally pointless, you can't
; see anything until these values are overwritten! )
ld b, 80 / 2 ; alternate for 80 lines
ld hl, LYOverrides
.loop
; $00 is the middle position
ld [hl], +112 ; coming from the left
inc hl
ld [hl], -112 ; coming from the right
inc hl
dec b
jr nz, .loop
; Make sure the rest of the buffer is empty
ld hl, LYOverrides + 80
xor a
ld bc, LYOverridesEnd - (LYOverrides + 80)
call ByteFill
; Let LCD Stat know we're messing around with SCX
ld a, rSCX - rJOYP
ld [hFFC6], a
pop af
ld [rSVBK], a
; Reset audio
call ChannelsOff
call EnableLCD
; Set sprite size to 8x16
ld a, [rLCDC]
set 2, a
ld [rLCDC], a
ld a, +112
ld [hSCX], a
ld a, 8
ld [hSCY], a
ld a, 7
ld [hWX], a
ld a, -112
ld [hWY], a
ld a, $1
ld [hCGBPalUpdate], a
; Update BG Map 0 (bank 0)
ld [hBGMapMode], a
xor a
ld [UnknBGPals + 2], a
; Play starting sound effect
call SFXChannelsOff
ld de, SFX_TITLE_SCREEN_ENTRANCE
call PlaySFX
ret
; 10eea7
SuicuneFrameIterator: ; 10eea7
ld hl, UnknBGPals + 2
ld a, [hl]
ld c, a
inc [hl]
; Only do this once every eight frames
and (1 << 3) - 1
ret nz
ld a, c
and 3 << 3
sla a
swap a
ld e, a
ld d, $0
ld hl, .Frames
add hl, de
ld d, [hl]
xor a
ld [hBGMapMode], a
call LoadSuicuneFrame
ld a, $1
ld [hBGMapMode], a
ld a, $3
ld [hBGMapThird], a
ret
; 10eece
.Frames: ; 10eece
db $80 ; VTiles4 tile $00
db $88 ; VTiles4 tile $08
db $00 ; VTiles5 tile $00
db $08 ; VTiles5 tile $08
; 10eed2
LoadSuicuneFrame: ; 10eed2
hlcoord 6, 12
ld b, 6
.bgrows
ld c, 8
.col
ld a, d
ld [hli], a
inc d
dec c
jr nz, .col
ld a, SCREEN_WIDTH - 8
add l
ld l, a
ld a, 0
adc h
ld h, a
ld a, 8
add d
ld d, a
dec b
jr nz, .bgrows
ret
; 10eeef
DrawTitleGraphic: ; 10eeef
; input:
; hl: draw location
; b: height
; c: width
; d: tile to start drawing from
; e: number of tiles to advance for each bgrows
.bgrows
push de
push bc
push hl
.col
ld a, d
ld [hli], a
inc d
dec c
jr nz, .col
pop hl
ld bc, SCREEN_WIDTH
add hl, bc
pop bc
pop de
ld a, e
add d
ld d, a
dec b
jr nz, .bgrows
ret
; 10ef06
InitializeBackground: ; 10ef06
ld hl, Sprites
ld d, -$22
ld e, $0
ld c, 5
.loop
push bc
call .InitColumn
pop bc
ld a, $10
add d
ld d, a
dec c
jr nz, .loop
ret
; 10ef1c
.InitColumn: ; 10ef1c
ld c, $6
ld b, $40
.loop2
ld a, d
ld [hli], a
ld a, b
ld [hli], a
add $8
ld b, a
ld a, e
ld [hli], a
rept 2
inc e
endr
ld a, $80
ld [hli], a
dec c
jr nz, .loop2
ret
; 10ef32
AnimateTitleCrystal: ; 10ef32
; Move the title screen crystal downward until it's fully visible
; Stop at y=6
; y is really from the bottom of the sprite, which is two tiles high
ld hl, Sprites
ld a, [hl]
cp 6 + $10
ret z
; Move all 30 parts of the crystal down by 2
ld c, 30
.loop
ld a, [hl]
add 2
ld [hli], a
rept 3
inc hl
endr
dec c
jr nz, .loop
ret
; 10ef46
TitleSuicuneGFX: ; 10ef46
INCBIN "gfx/title/suicune.w128.2bpp.lz"
; 10f326
TitleLogoGFX: ; 10f326
INCBIN "gfx/title/logo.w160.t4.2bpp.lz"
; 10fcee
TitleCrystalGFX: ; 10fcee
INCBIN "gfx/title/crystal.w48.interleave.2bpp.lz"
; 10fede
TitleScreenPalettes:
; BG
RGB 00, 00, 00
RGB 19, 00, 00
RGB 15, 08, 31
RGB 15, 08, 31
RGB 00, 00, 00
RGB 31, 31, 31
RGB 15, 16, 31
RGB 31, 01, 13
RGB 00, 00, 00
RGB 07, 07, 07
RGB 31, 31, 31
RGB 02, 03, 30
RGB 00, 00, 00
RGB 13, 13, 13
RGB 31, 31, 18
RGB 02, 03, 30
RGB 00, 00, 00
RGB 19, 19, 19
RGB 29, 28, 12
RGB 02, 03, 30
RGB 00, 00, 00
RGB 25, 25, 25
RGB 28, 25, 06
RGB 02, 03, 30
RGB 00, 00, 00
RGB 31, 31, 31
RGB 26, 21, 00
RGB 02, 03, 30
RGB 00, 00, 00
RGB 11, 11, 19
RGB 31, 31, 31
RGB 00, 00, 00
; OBJ
RGB 00, 00, 00
RGB 10, 00, 15
RGB 17, 05, 22
RGB 19, 09, 31
RGB 31, 31, 31
RGB 00, 00, 00
RGB 00, 00, 00
RGB 00, 00, 00
RGB 31, 31, 31
RGB 00, 00, 00
RGB 00, 00, 00
RGB 00, 00, 00
RGB 31, 31, 31
RGB 00, 00, 00
RGB 00, 00, 00
RGB 00, 00, 00
RGB 31, 31, 31
RGB 00, 00, 00
RGB 00, 00, 00
RGB 00, 00, 00
RGB 31, 31, 31
RGB 00, 00, 00
RGB 00, 00, 00
RGB 00, 00, 00
RGB 31, 31, 31
RGB 00, 00, 00
RGB 00, 00, 00
RGB 00, 00, 00
RGB 31, 31, 31
RGB 00, 00, 00
RGB 00, 00, 00
RGB 00, 00, 00