pokeyellow/engine/pikachu_pic_animation.asm

1288 lines
20 KiB
NASM
Executable File

GetPikaPicAnimationScriptIndex: ; fd978 (3f:5978)
ld hl, PikachuMoodLookupTable
ld a, [wPikachuMood]
ld d, a
.asm_fd97f
ld a, [hli]
inc hl
cp d
jr c, .asm_fd97f
dec hl
ld e, [hl]
ld hl, PikaPicAnimationScriptPointerLookupTable
ld a, [wPikachuHappiness]
ld d, a
ld bc, 6
.asm_fd990
ld a, [hl]
cp d
jr nc, .asm_fd997
add hl, bc
jr .asm_fd990
.asm_fd997
ld d, 0
add hl, de
ld a, [hl]
ret
PikachuMoodLookupTable:
; First byte: mood threshold
; Second byte: column index in PikaPicAnimationScriptPointerLookupTable
db $28, 1
db $7f, 2
db $80, 3
db $d2, 4
db $ff, 5
PikaPicAnimationScriptPointerLookupTable:
; First byte: happiness threshold
; Remaining bytes: loaded based on Pikachu's mood
db $32, $0e, $0e, $06, $0d, $0d
db $64, $09, $09, $05, $0c, $0c
db $82, $03, $03, $01, $08, $08
db $a0, $03, $03, $04, $0f, $0f
db $c8, $11, $11, $07, $02, $02
db $fa, $11, $11, $10, $0a, $0a
db $ff, $11, $11, $13, $14, $14
StarterPikachuEmotionCommand_pikapic: ; fd9d0 (3f:59d0)
ld a, [H_AUTOBGTRANSFERENABLED]
push af
xor a
ld [H_AUTOBGTRANSFERENABLED], a
ld a, [de]
ld [wExpressionNumber2], a
inc de
push de
call Func_fd9e4
pop de
pop af
ld [H_AUTOBGTRANSFERENABLED], a
ret
Func_fd9e4:
call PlacePikapicTextBoxBorder
callab LoadOverworldPikachuFrontpicPalettes
call ResetPikaPicAnimBuffer
call LoadCurrentPikaPicAnimScriptPointer
call Func_fda9a
call PlacePikapicTextBoxBorder
call RunDefaultPaletteCommand
ret
ResetPikaPicAnimBuffer:
ld hl, wCurPikaMovementData
ld bc, wCurPikaMovementDataEnd - wCurPikaMovementData
xor a
call FillMemory
ld hl, wPikaPicAnimObjectDataBufferSize
ld bc, wPikaPicAnimObjectDataBufferEnd - wPikaPicAnimObjectDataBufferSize
xor a
call FillMemory
call ClearPikaPicUsedGFXBuffer
ld hl, 100
ld a, l
ld [wPikaPicAnimTimer], a
ld a, h
ld [wPikaPicAnimTimer + 1], a
ld a, $07
ld [wPikaSpriteY], a
ld a, $06
ld [wPikaPicTextboxStartY], a
ret
PlacePikapicTextBoxBorder:
xor a
ld [H_AUTOBGTRANSFERENABLED], a
coord hl, 6, 5
lb bc, 5, 5
call TextBoxBorder
call Delay3
call UpdateSprites
ld a, $01
ld [H_AUTOBGTRANSFERENABLED], a
call Delay3
ret
LoadCurrentPikaPicAnimScriptPointer:
ld a, [wExpressionNumber2]
cp $1d
jr c, .valid
ld a, 0
.valid
ld e, a
ld d, 0
ld hl, Pointers_fda5e
add hl, de
add hl, de
ld a, [hli]
ld h, [hl]
ld l, a
call UpdatePikaPicAnimPointer
ret
Pointers_fda5e:
dw Data_fe28a ; 00
dw Data_fe28a ; 01
dw Data_fe2a4 ; 02
dw Data_fe2be ; 03
dw Data_fe2d8 ; 04
dw Data_fe2f2 ; 05
dw Data_fe30c ; 06
dw Data_fe326 ; 07
dw Data_fe340 ; 08
dw Data_fe35a ; 09
dw Data_fe374 ; 0a
dw Data_fe390 ; 0b
dw Data_fe3aa ; 0c
dw Data_fe3c4 ; 0d
dw Data_fe3de ; 0e
dw Data_fe3f8 ; 0f
dw Data_fe412 ; 10
dw Data_fe42c ; 11
dw Data_fe446 ; 12
dw Data_fe460 ; 13
dw Data_fe47a ; 14
dw Data_fe494 ; 15
dw Data_fe4b4 ; 16
dw Data_fe4ce ; 17
dw Data_fe4e8 ; 18
dw Data_fe502 ; 19
dw Data_fe520 ; 1a
dw Data_fe53e ; 1b
dw Data_fe558 ; 1c
dw Data_fe28a ; 1d
Func_fda9a:
.loop
xor a
ld [H_AUTOBGTRANSFERENABLED], a
call RunPikaPicAnimScript
call Func_fdad5
call Func_fdad6
call Func_fdad5
ld a, $01
ld [H_AUTOBGTRANSFERENABLED], a
call PikaPicAnimTimerAndJoypad
and a
jr z, .loop
ret
PikaPicAnimTimerAndJoypad:
call Delay3
call CheckPikaPicAnimTimer
and a
ret nz
call JoypadLowSensitivity
ld a, [hJoyPressed]
and A_BUTTON | B_BUTTON
ret
CheckPikaPicAnimTimer:
ld hl, wPikaPicAnimTimer
dec [hl]
jr nz, .not_done_yet
inc hl
ld a, [hl]
and a
jr z, .timer_expired
dec [hl]
.not_done_yet
xor a
ret
.timer_expired
ld a, $01
ret
Func_fdad5:
ret
Func_fdad6:
ld bc, wPikaPicAnimObjectDataBuffer
ld a, 4
.asm_fdadb
push af
push bc
ld hl, 0
add hl, bc
ld a, [hli]
and a
jr z, .asm_fdb26
ld a, [hli]
ld [wCurPikaPicAnimObject], a
ld a, [hli]
ld [wCurPikaPicAnimObject + 1], a
ld a, [hli]
ld [wCurPikaPicAnimObject + 2], a
ld a, [hli]
ld [wd456], a
ld a, [hli]
ld [wd457], a
ld a, [hli]
ld [wd458], a
ld a, [hli]
ld [wCurPikaPicAnimObject + 3], a
push bc
call Func_fdb7e
pop bc
ld hl, 1
add hl, bc
ld a, [wCurPikaPicAnimObject]
ld [hli], a
ld a, [wCurPikaPicAnimObject + 1]
ld [hli], a
ld a, [wCurPikaPicAnimObject + 2]
ld [hli], a
ld a, [wd456]
ld [hli], a
ld a, [wd457]
ld [hli], a
ld a, [wd458]
ld [hli], a
ld a, [wCurPikaPicAnimObject + 3]
ld [hl], a
.asm_fdb26
pop bc
ld hl, 8
add hl, bc
ld b, h
ld c, l
pop af
dec a
jr nz, .asm_fdadb
ret
PikaPicAnimCommand_object:
ld hl, wPikaPicAnimObjectDataBuffer
ld de, 8
ld c, 4
.loop
ld a, [hl]
and a
jr z, .found
add hl, de
dec c
jr nz, .loop
scf
ret
.found
ld a, [wPikaPicAnimObjectDataBufferSize]
inc a
ld [wPikaPicAnimObjectDataBufferSize], a
ld [hli], a
call GetPikaPicAnimByte
ld [hli], a
call GetPikaPicAnimByte
ld [hl], a
xor a
ld [hli], a
ld [hli], a
call GetPikaPicAnimByte
ld [hli], a
call GetPikaPicAnimByte
ld [hli], a
call GetPikaPicAnimByte
ld [hli], a
and a
ret
PikaPicAnimCommand_deleteobject:
call GetPikaPicAnimByte
ld b, a
ld hl, wPikaPicAnimObjectDataBuffer
ld de, 8
ld c, 4
.search
ld a, [hl]
cp b
jr z, .delete
add hl, de
dec c
jr nz, .search
scf
ret
.delete
xor a
ld [hl], a
ret
Func_fdb7e:
.asm_fdb7e
ld a, [wCurPikaPicAnimObject]
cp $23
jr c, .asm_fdb87
ld a, $04
.asm_fdb87
ld e, a
ld d, $00
ld hl, Pointers_fdbc9
add hl, de
add hl, de
ld a, [hli]
ld h, [hl]
ld l, a
ld a, [wCurPikaPicAnimObject + 1]
ld e, a
ld d, 0
add hl, de
add hl, de
ld a, [hli]
cp $e0
jr z, .asm_fdba1
jr .asm_fdbaa
.asm_fdba1
xor a
ld [wCurPikaPicAnimObject + 1], a
ld [wCurPikaPicAnimObject + 2], a
jr .asm_fdb7e
.asm_fdbaa
push hl
call Func_fdd62
pop hl
ld a, [hl]
and a
jr z, .asm_fdbc8
ld a, [wCurPikaPicAnimObject + 2]
inc a
ld [wCurPikaPicAnimObject + 2], a
cp [hl]
jr nz, .asm_fdbc8
xor a
ld [wCurPikaPicAnimObject + 2], a
ld a, [wCurPikaPicAnimObject + 1]
inc a
ld [wCurPikaPicAnimObject + 1], a
.asm_fdbc8
ret
Pointers_fdbc9:
dw Data_fdc11
dw Data_fdc11
dw Data_fdc29
dw Data_fdc32
dw Data_fdc3b
dw Data_fdc3e
dw Data_fdc41
dw Data_fdc50
dw Data_fdc61
dw Data_fdc6e
dw Data_fdc77
dw Data_fdc84
dw Data_fdc8d
dw Data_fdc98
dw Data_fdca5
dw Data_fdcb2
dw Data_fdcb7
dw Data_fdcc2
dw Data_fdccb
dw Data_fdcd4
dw Data_fdcdf
dw Data_fdce8
dw Data_fdcf1
dw Data_fdcf6
dw Data_fdd01
dw Data_fdd0a
dw Data_fdd13
dw Data_fdd1c
dw Data_fdd27
dw Data_fdd2c
dw Data_fdd35
dw Data_fdd40
dw Data_fdd47
dw Data_fdd54
dw Data_fdd59
dw Data_fdc3b
Data_fdc11:
db $01, $14
db $07, $02
db $01, $01
db $07, $02
db $01, $01
db $07, $08
db $e0
Data_fdc1e:
db $02, $02
db $01, $01
db $02, $02
db $01, $01
db $02, $08
db $e0
Data_fdc29:
db $00, $08
db $08, $08
db $00, $08
db $08, $08
db $e0
Data_fdc32:
db $08, $08
db $00, $08
db $08, $08
db $00, $08
db $e0
Data_fdc3b:
db $01, $00
db $e0
Data_fdc3e:
db $09, $00
db $e0
Data_fdc41:
db $00, $02
db $0e, $04
db $00, $08
db $0e, $04
db $00, $40
db $0e, $04
db $00, $40
db $e0
Data_fdc50:
db $00, $04
db $0f, $04
db $00, $04
db $0f, $04
db $00, $08
db $0f, $04
db $00, $08
db $0f, $04
db $e0
Data_fdc61:
db $10, $01
db $00, $01
db $10, $01
db $00, $40
db $10, $01
db $00, $40
db $e0
Data_fdc6e:
db $00, $08
db $11, $08
db $00, $14
db $11, $08
db $e0
Data_fdc77:
db $00, $02
db $12, $02
db $00, $02
db $12, $40
db $00, $03
db $12, $40
db $e0
Data_fdc84:
db $00, $08
db $13, $40
db $00, $04
db $13, $40
db $e0
Data_fdc8d:
db $14, $08
db $00, $02
db $14, $08
db $00, $02
db $14, $08
db $e0
Data_fdc98:
db $15, $04
db $00, $08
db $15, $04
db $00, $40
db $15, $04
db $00, $40
db $e0
Data_fdca5:
db $00, $02
db $16, $02
db $00, $02
db $16, $02
db $00, $14
db $16, $02
db $e0
Data_fdcb2:
db $00, $08
db $17, $08
db $e0
Data_fdcb7:
db $00, $08
db $17, $03
db $18, $05
db $17, $03
db $00, $05
db $e0
Data_fdcc2:
db $00, $14
db $19, $08
db $00, $14
db $19, $08
db $e0
Data_fdccb:
db $00, $0d
db $1a, $0c
db $00, $64
db $1a, $08
db $e0
Data_fdcd4:
db $00, $05
db $1b, $05
db $00, $05
db $1b, $05
db $00, $64
db $e0
Data_fdcdf:
db $00, $02
db $1c, $02
db $00, $02
db $1c, $02
db $e0
Data_fdce8:
db $00, $05
db $1d, $05
db $00, $05
db $1d, $05
db $e0
Data_fdcf1:
db $1e, $08
db $00, $64
db $e0
Data_fdcf6:
db $00, $0a
db $1f, $03
db $00, $03
db $1f, $03
db $00, $64
db $e0
Data_fdd01:
db $00, $03
db $20, $64
db $00, $08
db $20, $08
db $e0
Data_fdd0a:
db $21, $06
db $00, $06
db $21, $06
db $00, $06
db $e0
Data_fdd13:
db $00, $08
db $22, $0c
db $00, $08
db $22, $0c
db $e0
Data_fdd1c:
db $00, $08
db $09, $02
db $0a, $01
db $0b, $01
db $0c, $64
db $e0
Data_fdd27:
db $00, $08
db $24, $64
db $e0
Data_fdd2c:
db $00, $10
db $25, $10
db $00, $10
db $25, $10
db $e0
Data_fdd35:
db $00, $06
db $26, $06
db $00, $06
db $26, $06
db $00, $64
db $e0
Data_fdd40:
db $00, $06
db $09, $06
db $0a, $64
db $e0
Data_fdd47:
db $00, $14
db $09, $08
db $00, $14
db $09, $08
db $0a, $08
db $0b, $64
db $e0
Data_fdd54:
db $00, $04
db $09, $64
db $e0
Data_fdd59:
db $00, $0c
db $09, $0c
db $00, $0c
db $09, $64
db $e0
Func_fdd62:
and a
ret z
ld e, a
ld d, 0
ld hl, Pointers_fddb8
add hl, de
add hl, de
ld e, [hl]
inc hl
ld d, [hl]
ld a, [de]
ld c, a
inc de
ld a, [de]
ld b, a
inc de
push de
push bc
call Func_fdd98
pop bc
pop de
.asm_fdd7c
push bc
push hl
ld a, [wd456]
ld c, a
.asm_fdd82
ld a, [de]
inc de
cp $ff
jr z, .asm_fdd8a
add c
ld [hl], a
.asm_fdd8a
inc hl
dec b
jr nz, .asm_fdd82
pop hl
ld bc, SCREEN_WIDTH
add hl, bc
pop bc
dec c
jr nz, .asm_fdd7c
ret
Func_fdd98:
push bc
ld a, [wd458]
ld b, a
ld a, [wPikaPicTextboxStartY]
add b
coord hl, 0, 0
ld bc, SCREEN_WIDTH
call AddNTimes
ld a, [wd457]
ld c, a
ld a, [wPikaSpriteY]
add c
ld c, a
ld b, 0
add hl, bc
pop bc
ret
Pointers_fddb8:
dw Data_fde0e
dw Data_fde0f
dw Data_fde2a
dw Data_fde60
dw Data_fde63
dw Data_fde67
dw Data_fde6b
dw Data_fde45
dw Data_fde6b
dw Data_fdfaa
dw Data_fdfc5
dw Data_fdfe0
dw Data_fdffb
dw Data_fe016
dw Data_fde81
dw Data_fde9c
dw Data_fdeb7
dw Data_fded2
dw Data_fdeed
dw Data_fdf08
dw Data_fdf23
dw Data_fdf3e
dw Data_fdf59
dw Data_fdf74
dw Data_fdf8f
dw Data_fdfaa
dw Data_fdfaa
dw Data_fdfaa
dw Data_fdfaa
dw Data_fdfaa
dw Data_fdfaa
dw Data_fdfaa
dw Data_fdfaa
dw Data_fdfaa
dw Data_fdfaa
dw Data_fdfaa
dw Data_fdfaa
dw Data_fdfaa
dw Data_fdfaa
dw Data_fdfaa
dw Data_fdfc5
dw Data_fdfe0
dw Data_fde0f
Data_fde0e:
db $ff ; unused
Data_fde0f: ; fde0f
db 5, 5
db $00, $05, $0a, $0f, $14
db $01, $06, $0b, $10, $15
db $02, $07, $0c, $11, $16
db $03, $08, $0d, $12, $17
db $04, $09, $0e, $13, $18
Data_fde2a: ; fde2a
db 5, 5
db $19, $1e, $23, $28, $2d
db $1a, $1f, $24, $29, $2e
db $1b, $20, $25, $2a, $2f
db $1c, $21, $26, $2b, $30
db $1d, $22, $27, $2c, $31
Data_fde45: ; fde45
db 5, 5
db $ff, $ff, $ff, $ff, $ff
db $ff, $ff, $ff, $ff, $ff
db $ff, $20, $25, $ff, $ff
db $ff, $21, $26, $ff, $ff
db $ff, $ff, $ff, $ff, $ff
Data_fde60: ; fde60
db 1, 1
db $00
Data_fde63: ; fde63
db 2, 1
db $00
db $01
Data_fde67: ; fde67
db 1, 2
db $00, $01
Data_fde6b: ; fde6b
db 2, 2
db $00, $01
db $02, $03
Data_fde71: ; fde71
db 3, 2
db $00, $01
db $02, $03
db $04, $05
Data_fde79: ; fde79
db 2, 3
db $00, $01, $02
db $03, $04, $05
Data_fde81: ; fde81
db 5, 5
db $ff, $ff, $ff, $ff, $ff
db $ff, $ff, $ff, $ff, $ff
db $00, $01, $02, $03, $04
db $ff, $ff, $ff, $ff, $ff
db $ff, $ff, $ff, $ff, $ff
Data_fde9c: ; fde9c
db 5, 5
db $ff, $ff, $ff, $ff, $ff
db $ff, $ff, $ff, $ff, $ff
db $ff, $ff, $ff, $ff, $ff
db $00, $01, $02, $03, $04
db $05, $06, $07, $08, $09
Data_fdeb7: ; fdeb7
db 5, 5
db $00, $01, $ff, $ff, $ff
db $02, $03, $ff, $ff, $ff
db $04, $05, $ff, $ff, $ff
db $ff, $ff, $ff, $ff, $ff
db $ff, $ff, $ff, $ff, $ff
Data_fded2: ; fded2
db 5, 5
db $ff, $ff, $ff, $ff, $ff
db $00, $01, $02, $03, $04
db $05, $06, $07, $08, $09
db $0a, $0b, $0c, $0d, $0e
db $0f, $10, $11, $12, $13
Data_fdeed: ; fdeed
db 5, 5
db $ff, $ff, $ff, $ff, $ff
db $ff, $ff, $ff, $00, $01
db $ff, $ff, $ff, $02, $03
db $ff, $ff, $ff, $ff, $ff
db $ff, $ff, $ff, $ff, $ff
Data_fdf08: ; fdf08
db 5, 5
db $ff, $ff, $ff, $ff, $ff
db $ff, $ff, $ff, $ff, $ff
db $00, $01, $ff, $ff, $ff
db $02, $03, $ff, $ff, $ff
db $ff, $ff, $ff, $ff, $ff
Data_fdf23: ; fdf23
db 5, 5
db $00, $01, $02, $03, $04
db $05, $06, $07, $08, $09
db $0a, $0b, $0c, $0d, $0e
db $0f, $10, $11, $12, $13
db $14, $15, $16, $17, $18
Data_fdf3e: ; fdf3e
db 5, 5
db $ff, $ff, $ff, $ff, $ff
db $ff, $ff, $ff, $ff, $ff
db $00, $01, $02, $03, $04
db $05, $06, $07, $08, $09
db $ff, $ff, $ff, $ff, $ff
Data_fdf59: ; fdf59
db 5, 5
db $ff, $ff, $ff, $ff, $ff
db $ff, $ff, $ff, $ff, $ff
db $00, $01, $ff, $ff, $ff
db $02, $03, $ff, $ff, $ff
db $04, $05, $ff, $ff, $ff
Data_fdf74: ; fdf74
db 5, 5
db $00, $01, $02, $03, $04
db $05, $06, $07, $08, $09
db $0a, $0b, $0c, $0d, $0e
db $0f, $10, $11, $12, $13
db $14, $15, $16, $17, $18
Data_fdf8f: ; fdf8f
db 5, 5
db $19, $1a, $1b, $1c, $1d
db $1e, $1f, $20, $21, $22
db $23, $24, $25, $26, $27
db $28, $29, $2a, $2b, $2c
db $2d, $2e, $2f, $30, $31
Data_fdfaa: ; fdfaa
db 5, 5
db $00, $01, $02, $03, $04
db $05, $06, $07, $08, $09
db $0a, $0b, $0c, $0d, $0e
db $0f, $10, $11, $12, $13
db $14, $15, $16, $17, $18
Data_fdfc5: ; fdfc5
db 5, 5
db $19, $1a, $1b, $1c, $1d
db $1e, $1f, $20, $21, $22
db $23, $24, $25, $26, $27
db $28, $29, $2a, $2b, $2c
db $2d, $2e, $2f, $30, $31
Data_fdfe0: ; fdfe0
db 5, 5
db $32, $33, $34, $35, $36
db $37, $38, $39, $3a, $3b
db $3c, $3d, $3e, $3f, $40
db $41, $42, $43, $44, $45
db $46, $47, $48, $49, $4a
Data_fdffb: ; fdffb
db 5, 5
db $4b, $4c, $4d, $4e, $4f
db $50, $51, $52, $53, $54
db $55, $56, $57, $58, $59
db $5a, $5b, $5c, $5d, $5e
db $5f, $60, $61, $62, $63
Data_fe016: ; fe016
db 5, 5
db $64, $65, $66, $67, $68
db $69, $6a, $6b, $6c, $6d
db $6e, $6f, $70, $71, $72
db $73, $74, $75, $76, $77
db $78, $79, $7a, $7b, $7c
LoadPikaPicAnimGFXHeader:
push hl
ld e, a
ld d, 0
ld hl, PikaPicAnimGFXHeaders
add hl, de
add hl, de
add hl, de
add hl, de
ld a, [hli]
ld c, a
ld a, [hli]
ld b, a
ld a, [hli]
ld e, a
ld a, [hli]
ld d, a
pop hl
ret
RunPikaPicAnimScript:
call Func_fe066
ret c
xor a
ld [wPikaPicAnimPointerSetupFinished], a
.loop
call GetPikaPicAnimByte
ld e, a
ld d, 0
ld hl, Jumptable_fe071
add hl, de
add hl, de
ld a, [hli]
ld h, [hl]
ld l, a
call JumpToAddress
ld a, [wPikaPicAnimPointerSetupFinished]
and a
jr z, .loop
ret
Func_fe066:
ld a, [wPikaPicAnimDelay]
and a
ret z
dec a
ld [wPikaPicAnimDelay], a
scf
ret
Jumptable_fe071:
dw PikaPicAnimCommand_nop ; 00, 0 params
dw PikaPicAnimCommand_writebyte ; 01, 1 param
dw PikaPicAnimCommand_loadgfx ; 02, 1 param
dw PikaPicAnimCommand_object ; 03, 5 params
dw PikaPicAnimCommand_nop4 ; 04, 0 params
dw PikaPicAnimCommand_nop5 ; 05, 0 params
dw PikaPicAnimCommand_deleteobject ; 06, 1 param
dw PikaPicAnimCommand_nop7 ; 07, 0 params
dw PikaPicAnimCommand_nop8 ; 08, 0 params
dw PikaPicAnimCommand_jump ; 09, 1 dw param
dw PikaPicAnimCommand_setduration ; 0a, 1 dw param
dw PikaPicAnimCommand_cry ; 0b, 1 param
dw PikaPicAnimCommand_thunderbolt ; 0c, 0 params
dw PikaPicAnimCommand_waitbgmap ; 0d, 0 params (ret)
dw PikaPicAnimCommand_ret ; 0e, 0 params (ret)
PikaPicAnimCommand_nop:
ret
PikaPicAnimCommand_ret:
ld a, 1
ld [wPikaPicAnimTimer], a
xor a
ld [wPikaPicAnimTimer + 1], a
jr PikaPicAnimCommand_waitbgmap
Func_fe09b:
ret
PikaPicAnimCommand_setduration:
call GetPikaPicAnimByte
ld [wPikaPicAnimTimer], a
call GetPikaPicAnimByte
ld [wPikaPicAnimTimer + 1], a
ret
PikaPicAnimCommand_waitbgmap:
ld a, $ff
ld [wPikaPicAnimPointerSetupFinished], a
ret
PikaPicAnimCommand_writebyte:
call GetPikaPicAnimByte
ld [wPikaPicAnimDelay], a
ret
PikaPicAnimCommand_nop4:
PikaPicAnimCommand_nop5:
PikaPicAnimCommand_nop7:
PikaPicAnimCommand_nop8:
ret
PikaPicAnimCommand_jump:
call GetPikaPicAnimByte
ld l, a
call GetPikaPicAnimByte
ld h, a
call UpdatePikaPicAnimPointer
ret
GetPikaPicAnimByte:
push hl
ld hl, wPikaPicAnimPointer
ld a, [hli]
ld h, [hl]
ld l, a
ld a, [hli]
call UpdatePikaPicAnimPointer
pop hl
ret
UpdatePikaPicAnimPointer:
push af
ld a, l
ld [wPikaPicAnimPointer], a
ld a, h
ld [wPikaPicAnimPointer + 1], a
pop af
ret
PikaPicAnimCommand_loadgfx:
ld a, [wUpdateSpritesEnabled]
push af
ld a, $ff
ld [wUpdateSpritesEnabled], a
ld a, [H_AUTOBGTRANSFERENABLED]
push af
xor a
ld [H_AUTOBGTRANSFERENABLED], a
ld a, [hTilesetType]
push af
xor a
ld [hTilesetType], a
call GetPikaPicAnimByte
ld [wPikaPicAnimCurGraphicID], a
ld a, [wPikaPicAnimCurGraphicID]
call LoadPikaPicAnimGFXHeader
ld a, c
cp a, $ff
jr z, .compressed
call RequestPikaPicAnimGFX
jr .asm_fe109
.compressed
call DecompressRequestPikaPicAnimGFX
.asm_fe109
pop af
ld [hTilesetType], a
pop af
ld [H_AUTOBGTRANSFERENABLED], a
pop af
ld [wUpdateSpritesEnabled], a
ret
RequestPikaPicAnimGFX: ; fe114
push de
ld a, [wPikaPicAnimCurGraphicID]
ld d, a
ld e, c
call CheckIfThereIsRoomForPikaPicAnimGFX
pop de
jr c, .failed
call GetPikaPicVRAMAddressForNewGFX
call CopyVideoDataAlternate
and a
.failed
ret
DecompressRequestPikaPicAnimGFX: ; fe128
push de
ld a, [wPikaPicAnimCurGraphicID]
ld d, a
ld e, 5 * 5
call CheckIfThereIsRoomForPikaPicAnimGFX
pop de
jr c, .failed
ld a, b
call UncompressSpriteFromDE
ld a, BANK(sSpriteBuffer1)
call SwitchSRAMBankAndLatchClockData
ld hl, sSpriteBuffer1
ld de, sSpriteBuffer0
ld bc, SPRITEBUFFERSIZE * 2
call CopyData
call PrepareRTCDataAndDisableSRAM
ld a, [wPikaPicAnimCurGraphicID]
call LookUpTileOffsetForCurrentPikaPicAnimGFX
call GetPikaPicVRAMAddressForNewGFX
ld d, h
ld e, l
call InterlaceMergeSpriteBuffers
.failed
ret
ClearPikaPicUsedGFXBuffer:
ld hl, wPikaPicUsedGFXCount
ld bc, wPikaPicUsedGFXEnd - wPikaPicUsedGFXCount
xor a
call FillMemory
ret
GetPikaPicVRAMAddressForNewGFX:
ld hl, vNPCSprites
push bc
ld b, a
and $f
swap a
ld c, a
ld a, b
and $f0
swap a
ld b, a
add hl, bc
pop bc
ret
CheckIfThereIsRoomForPikaPicAnimGFX:
push bc
push hl
ld hl, wPikaPicUsedGFX
ld c, 8
.loop
ld a, [hl]
and a
jr z, .empty
cp d
jr z, .found
inc hl
inc hl
dec c
jr nz, .loop
scf
ret ; execute hl, then bc
.found
inc hl
ld a, [hl]
ret ; execute hl, then bc
.empty
ld [hl], d
inc hl
ld a, [wPikaPicUsedGFXCount]
add $80
ld [hl], a
ld a, [wPikaPicUsedGFXCount]
add e
ld [wPikaPicUsedGFXCount], a
cp $80
jr z, .asm_fe1a7
jr nc, .failed
.asm_fe1a7
ld a, [hl]
and a
jr .pop_ret
.failed
scf
.pop_ret
pop hl
pop bc
ret
LookUpTileOffsetForCurrentPikaPicAnimGFX:
push bc
push hl
ld b, a
ld hl, wPikaPicUsedGFX
ld c, 8
.loop
ld a, [hli]
cp b
jr z, .found
inc hl
dec c
jr nz, .loop
scf
jr .pop_ret
.found
ld a, [hl]
and a
.pop_ret
pop hl
pop bc
ret
PikaPicAnimCommand_cry:
call GetPikaPicAnimByte
cp $ff
ret z
ld e, a
callab PlayPikachuSoundClip
ret
PikaPicAnimCommand_thunderbolt:
ld a, $1
ld [wMuteAudioAndPauseMusic], a
call DelayFrame
ld a, [wAudioROMBank]
push af
ld a, BANK(SFX_Battle_2F)
ld [wAudioROMBank], a
ld [wAudioSavedROMBank], a
call PikaPicAnimLoadThunderboltAudio
call PlaySound
call PikaPicAnimThunderboltFlashScreen
call WaitForSoundToFinish
pop af
ld [wAudioROMBank], a
ld [wAudioSavedROMBank], a
xor a
ld [wMuteAudioAndPauseMusic], a
ret
PikaPicAnimLoadThunderboltAudio:
ld hl, MoveSoundTable
ld e, THUNDERBOLT
ld d, 0
add hl, de
add hl, de
add hl, de
ld a, BANK(MoveSoundTable)
call GetFarByte
ld b, a
inc hl
ld a, BANK(MoveSoundTable)
call GetFarByte
inc hl
ld [wFrequencyModifier], a
ld a, BANK(MoveSoundTable)
call GetFarByte
ld [wTempoModifier], a
ld a, b
ret
PikaPicAnimThunderboltFlashScreen:
ld hl, Data_fe242
.loop
ld a, [hli]
cp $ff
ret z
ld c, a
ld b, [hl]
inc hl
push hl
call GetDMGBGPalForPikaThunderbolt
pop hl
jr .loop
GetDMGBGPalForPikaThunderbolt:
ld a, b
ld [rBGP], a
call UpdateGBCPal_BGP
call DelayFrames
ret
INCLUDE "data/pikachu_pic_animation.asm"