pokecrystal-board/engine/title.asm

484 lines
6.5 KiB
NASM
Raw Normal View History

_TitleScreen: ; 10ed67
2015-11-11 20:38:57 -08:00
call ClearBGPalettes
call ClearSprites
call ClearTileMap
; Turn BG Map update off
xor a
ld [hBGMapMode], a
; Reset timing variables
2015-10-24 16:49:19 -07:00
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
2015-11-20 08:47:52 -08:00
hlbgcoord 0, 0
ld bc, 20 bgrows
xor a
call ByteFill
; Fill tile palettes:
; BG Map 1:
; line 0 (copyright)
2015-11-20 08:47:52 -08:00
hlbgcoord 0, 0, VBGMap1
ld bc, 1 bgrows
ld a, 7 ; palette
call ByteFill
; BG Map 0:
; Apply logo gradient:
; lines 3-4
2015-11-20 08:47:52 -08:00
hlbgcoord 0, 3
ld bc, 2 bgrows
ld a, 2
call ByteFill
; line 5
2015-11-20 08:47:52 -08:00
hlbgcoord 0, 5
ld bc, 1 bgrows
ld a, 3
call ByteFill
; line 6
2015-11-20 08:47:52 -08:00
hlbgcoord 0, 6
ld bc, 1 bgrows
ld a, 4
call ByteFill
; line 7
2015-11-20 08:47:52 -08:00
hlbgcoord 0, 7
ld bc, 1 bgrows
ld a, 5
call ByteFill
; lines 8-9
2015-11-20 08:47:52 -08:00
hlbgcoord 0, 8
ld bc, 2 bgrows
ld a, 6
call ByteFill
; 'CRYSTAL VERSION'
2015-11-20 08:47:52 -08:00
hlbgcoord 5, 9
ld bc, NAME_LENGTH ; length of version text
ld a, 1
call ByteFill
; Suicune gfx
2015-11-20 08:47:52 -08:00
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
2015-11-20 08:47:52 -08:00
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
2015-11-20 08:47:52 -08:00
hlbgcoord 3, 0, VBGMap1
lb bc, 1, 13
ld d, $c
ld e, $10
call DrawTitleGraphic
; Initialize running Suicune?
ld d, $0
2015-10-19 13:49:29 -07:00
call LoadSuicuneFrame
; Initialize background crystal
2015-10-19 13:49:29 -07:00
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
2015-11-20 12:15:32 -08:00
ld de, UnknBGPals
2015-10-19 13:49:29 -07:00
ld bc, 4 * 32
call CopyBytes
ld hl, TitleScreenPalettes
ld de, BGPals
2015-10-19 13:49:29 -07:00
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
2015-12-26 18:59:03 -08:00
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
2015-11-20 12:15:32 -08:00
ld [UnknBGPals + 2], a
; Play starting sound effect
call SFXChannelsOff
ld de, SFX_TITLE_SCREEN_ENTRANCE
2013-10-08 10:10:36 -07:00
call PlaySFX
ret
; 10eea7
2015-10-19 13:49:29 -07:00
SuicuneFrameIterator: ; 10eea7
2015-11-20 12:15:32 -08:00
ld hl, UnknBGPals + 2
ld a, [hl]
ld c, a
inc [hl]
2015-10-19 13:49:29 -07:00
; Only do this once every eight frames
and (1 << 3) - 1
ret nz
2015-10-19 13:49:29 -07:00
ld a, c
2015-10-19 13:49:29 -07:00
and 3 << 3
sla a
swap a
ld e, a
ld d, $0
2015-10-19 13:49:29 -07:00
ld hl, .Frames
add hl, de
ld d, [hl]
xor a
ld [hBGMapMode], a
2015-10-19 13:49:29 -07:00
call LoadSuicuneFrame
ld a, $1
ld [hBGMapMode], a
ld a, $3
ld [hBGMapThird], a
ret
; 10eece
2015-10-19 13:49:29 -07:00
.Frames: ; 10eece
db $80 ; VTiles4 tile $00
db $88 ; VTiles4 tile $08
db $00 ; VTiles5 tile $00
db $08 ; VTiles5 tile $08
; 10eed2
2015-10-19 13:49:29 -07:00
LoadSuicuneFrame: ; 10eed2
hlcoord 6, 12
2015-10-19 13:49:29 -07:00
ld b, 6
2015-11-20 08:47:52 -08:00
.bgrows
2015-10-19 13:49:29 -07:00
ld c, 8
.col
ld a, d
ld [hli], a
inc d
dec c
2015-10-19 13:49:29 -07:00
jr nz, .col
ld a, SCREEN_WIDTH - 8
add l
ld l, a
2015-10-19 13:49:29 -07:00
ld a, 0
adc h
ld h, a
2015-10-19 13:49:29 -07:00
ld a, 8
add d
ld d, a
dec b
2015-11-20 08:47:52 -08:00
jr nz, .bgrows
ret
; 10eeef
DrawTitleGraphic: ; 10eeef
; input:
; hl: draw location
; b: height
; c: width
; d: tile to start drawing from
2015-11-20 08:47:52 -08:00
; e: number of tiles to advance for each bgrows
.bgrows
push de
push bc
push hl
2015-10-19 13:49:29 -07:00
.col
ld a, d
ld [hli], a
inc d
dec c
2015-10-19 13:49:29 -07:00
jr nz, .col
pop hl
2015-10-19 13:49:29 -07:00
ld bc, SCREEN_WIDTH
add hl, bc
pop bc
pop de
ld a, e
add d
ld d, a
dec b
2015-11-20 08:47:52 -08:00
jr nz, .bgrows
ret
; 10ef06
2015-10-19 13:49:29 -07:00
InitializeBackground: ; 10ef06
ld hl, Sprites
2015-10-19 13:49:29 -07:00
ld d, -$22
ld e, $0
2015-10-19 13:49:29 -07:00
ld c, 5
.loop
push bc
2015-10-19 13:49:29 -07:00
call .InitColumn
pop bc
ld a, $10
add d
ld d, a
dec c
2015-10-19 13:49:29 -07:00
jr nz, .loop
ret
; 10ef1c
2015-10-19 13:49:29 -07:00
.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
2015-07-20 19:18:18 -07:00
rept 2
inc e
2015-07-20 19:18:18 -07:00
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]
2015-10-19 13:49:29 -07:00
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
2015-07-20 19:18:18 -07:00
rept 3
inc hl
2015-07-20 19:18:18 -07:00
endr
dec c
jr nz, .loop
ret
; 10ef46
TitleSuicuneGFX: ; 10ef46
2014-04-01 21:37:12 -07:00
INCBIN "gfx/title/suicune.w128.2bpp.lz"
; 10f326
TitleLogoGFX: ; 10f326
2014-04-01 21:37:12 -07:00
INCBIN "gfx/title/logo.w160.t4.2bpp.lz"
; 10fcee
TitleCrystalGFX: ; 10fcee
2014-04-01 21:37:12 -07:00
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