pokecrystal/engine/battle/anim_hp_bar.asm

425 lines
5.9 KiB
NASM
Raw Normal View History

2018-06-24 14:09:41 +00:00
_AnimateHPBar:
2016-03-02 03:31:21 +00:00
call .IsMaximumMoreThan48Pixels
jr c, .MoreThan48Pixels
call .ComputePixels
.ShortAnimLoop:
2015-12-14 16:12:18 +00:00
push bc
push hl
call ShortAnim_UpdateVariables
2015-12-14 16:12:18 +00:00
pop hl
pop bc
push af
push bc
push hl
call ShortHPBarAnim_UpdateTiles
call HPBarAnim_BGMapUpdate
2015-12-14 16:12:18 +00:00
pop hl
pop bc
pop af
2016-03-02 03:31:21 +00:00
jr nc, .ShortAnimLoop
2015-12-14 16:12:18 +00:00
ret
.MoreThan48Pixels:
2016-03-02 03:31:21 +00:00
call .ComputePixels
.LongAnimLoop:
2015-12-14 16:12:18 +00:00
push bc
push hl
call LongAnim_UpdateVariables
2015-12-14 16:12:18 +00:00
pop hl
pop bc
ret c
push af
push bc
push hl
call LongHPBarAnim_UpdateTiles
call HPBarAnim_BGMapUpdate
2015-12-14 16:12:18 +00:00
pop hl
pop bc
pop af
2016-03-02 03:31:21 +00:00
jr nc, .LongAnimLoop
2015-12-14 16:12:18 +00:00
ret
2018-06-24 14:09:41 +00:00
.IsMaximumMoreThan48Pixels:
ld a, [wCurHPAnimMaxHP + 1]
2015-12-14 16:12:18 +00:00
and a
jr nz, .player
ld a, [wCurHPAnimMaxHP]
cp HP_BAR_LENGTH_PX
2015-12-14 16:12:18 +00:00
jr nc, .player
and a
ret
.player
scf
ret
2018-06-24 14:09:41 +00:00
.ComputePixels:
2015-12-14 16:12:18 +00:00
push hl
ld hl, wCurHPAnimMaxHP
2015-12-14 16:12:18 +00:00
ld a, [hli]
ld e, a
ld a, [hli]
ld d, a
ld a, [hli]
ld c, a
ld a, [hli]
ld b, a
pop hl
call ComputeHPBarPixels
ld a, e
2016-03-02 03:31:21 +00:00
ld [wCurHPBarPixels], a
2015-12-14 16:12:18 +00:00
ld a, [wCurHPAnimNewHP]
2015-12-14 16:12:18 +00:00
ld c, a
ld a, [wCurHPAnimNewHP + 1]
2015-12-14 16:12:18 +00:00
ld b, a
ld a, [wCurHPAnimMaxHP]
2015-12-14 16:12:18 +00:00
ld e, a
ld a, [wCurHPAnimMaxHP + 1]
2015-12-14 16:12:18 +00:00
ld d, a
call ComputeHPBarPixels
ld a, e
2016-03-02 03:31:21 +00:00
ld [wNewHPBarPixels], a
2015-12-14 16:12:18 +00:00
push hl
ld hl, wCurHPAnimOldHP
2015-12-14 16:12:18 +00:00
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
ld a, e
sub c
ld e, a
ld a, d
sbc b
ld d, a
2016-03-02 03:31:21 +00:00
jr c, .negative
ld a, [wCurHPAnimOldHP]
ld [wCurHPAnimLowHP], a
ld a, [wCurHPAnimNewHP]
ld [wCurHPAnimHighHP], a
2015-12-14 16:12:18 +00:00
ld bc, 1
2016-03-02 03:31:21 +00:00
jr .got_direction
2015-12-14 16:12:18 +00:00
2016-03-02 03:31:21 +00:00
.negative
ld a, [wCurHPAnimOldHP]
ld [wCurHPAnimHighHP], a
ld a, [wCurHPAnimNewHP]
ld [wCurHPAnimLowHP], a
2015-12-14 16:12:18 +00:00
ld a, e
xor $ff
inc a
ld e, a
ld a, d
xor $ff
ld d, a
2016-03-02 03:31:21 +00:00
ld bc, -1
.got_direction
2015-12-14 16:12:18 +00:00
ld a, d
ld [wCurHPAnimDeltaHP], a
2015-12-14 16:12:18 +00:00
ld a, e
ld [wCurHPAnimDeltaHP + 1], a
2015-12-14 16:12:18 +00:00
ret
2018-06-24 14:09:41 +00:00
ShortAnim_UpdateVariables:
2016-03-02 03:31:21 +00:00
ld hl, wCurHPBarPixels
ld a, [wNewHPBarPixels]
2015-12-14 16:12:18 +00:00
cp [hl]
2016-03-02 03:31:21 +00:00
jr nz, .not_finished
2015-12-14 16:12:18 +00:00
scf
ret
2016-03-02 03:31:21 +00:00
.not_finished
2015-12-14 16:12:18 +00:00
ld a, c
add [hl]
ld [hl], a
call ShortHPBar_CalcPixelFrame
2015-12-14 16:12:18 +00:00
and a
ret
2018-06-24 14:09:41 +00:00
LongAnim_UpdateVariables:
2016-03-02 03:31:21 +00:00
.loop
ld hl, wCurHPAnimOldHP
2015-12-14 16:12:18 +00:00
ld a, [hli]
ld e, a
ld a, [hli]
ld d, a
ld a, e
cp [hl]
2016-03-02 03:31:21 +00:00
jr nz, .next
2015-12-14 16:12:18 +00:00
inc hl
ld a, d
cp [hl]
2016-03-02 03:31:21 +00:00
jr nz, .next
2015-12-14 16:12:18 +00:00
scf
ret
2016-03-02 03:31:21 +00:00
.next
2015-12-14 16:12:18 +00:00
ld l, e
ld h, d
add hl, bc
ld a, l
ld [wCurHPAnimOldHP], a
2015-12-14 16:12:18 +00:00
ld a, h
ld [wCurHPAnimOldHP + 1], a
2015-12-14 16:12:18 +00:00
push hl
push de
push bc
ld hl, wCurHPAnimMaxHP
2015-12-14 16:12:18 +00:00
ld a, [hli]
ld e, a
ld a, [hli]
ld d, a
ld a, [hli]
ld c, a
ld a, [hli]
ld b, a
; This routine is buggy. The result from ComputeHPBarPixels is stored
; in e. However, the pop de opcode deletes this result before it is even
; used. The game then proceeds as though it never deleted that output.
2016-03-09 01:02:30 +00:00
; To fix, uncomment the line below.
2015-12-14 16:12:18 +00:00
call ComputeHPBarPixels
2016-03-09 01:02:30 +00:00
; ld a, e
2015-12-14 16:12:18 +00:00
pop bc
pop de
pop hl
2016-03-09 01:02:30 +00:00
ld a, e ; Comment or delete this line to fix the above bug.
2016-03-02 03:31:21 +00:00
ld hl, wCurHPBarPixels
2015-12-14 16:12:18 +00:00
cp [hl]
2016-03-02 03:31:21 +00:00
jr z, .loop
2015-12-14 16:12:18 +00:00
ld [hl], a
and a
ret
2018-06-24 14:09:41 +00:00
ShortHPBarAnim_UpdateTiles:
call HPBarAnim_UpdateHPRemaining
ld d, HP_BAR_LENGTH
ld a, [wWhichHPBar]
2015-12-14 16:12:18 +00:00
and $1
ld b, a
2016-03-02 03:31:21 +00:00
ld a, [wCurHPBarPixels]
2015-12-14 16:12:18 +00:00
ld e, a
ld c, a
push de
call HPBarAnim_RedrawHPBar
2015-12-14 16:12:18 +00:00
pop de
call HPBarAnim_PaletteUpdate
2015-12-14 16:12:18 +00:00
ret
2018-06-24 14:09:41 +00:00
LongHPBarAnim_UpdateTiles:
call HPBarAnim_UpdateHPRemaining
ld a, [wCurHPAnimOldHP]
2015-12-14 16:12:18 +00:00
ld c, a
ld a, [wCurHPAnimOldHP + 1]
2015-12-14 16:12:18 +00:00
ld b, a
ld a, [wCurHPAnimMaxHP]
2015-12-14 16:12:18 +00:00
ld e, a
ld a, [wCurHPAnimMaxHP + 1]
2015-12-14 16:12:18 +00:00
ld d, a
call ComputeHPBarPixels
ld c, e
ld d, HP_BAR_LENGTH
ld a, [wWhichHPBar]
2015-12-14 16:12:18 +00:00
and $1
ld b, a
push de
call HPBarAnim_RedrawHPBar
2015-12-14 16:12:18 +00:00
pop de
call HPBarAnim_PaletteUpdate
2015-12-14 16:12:18 +00:00
ret
2018-06-24 14:09:41 +00:00
HPBarAnim_RedrawHPBar:
ld a, [wWhichHPBar]
2015-12-14 16:12:18 +00:00
cp $2
jr nz, .skip
ld a, 2 * SCREEN_WIDTH
2015-12-14 16:12:18 +00:00
add l
ld l, a
ld a, 0
2015-12-14 16:12:18 +00:00
adc h
ld h, a
.skip
call DrawBattleHPBar
ret
2018-06-24 14:09:41 +00:00
HPBarAnim_UpdateHPRemaining:
ld a, [wWhichHPBar]
2015-12-14 16:12:18 +00:00
and a
ret z
cp $1
jr z, .load_15
ld de, SCREEN_WIDTH + 2
2015-12-14 16:12:18 +00:00
jr .loaded_de
.load_15
ld de, SCREEN_WIDTH + 1
2015-12-14 16:12:18 +00:00
.loaded_de
push hl
add hl, de
ld a, " "
ld [hli], a
ld [hli], a
2015-12-14 16:12:18 +00:00
ld [hld], a
dec hl
ld a, [wCurHPAnimOldHP]
2018-01-23 22:39:09 +00:00
ld [wStringBuffer2 + 1], a
ld a, [wCurHPAnimOldHP + 1]
2018-01-23 22:39:09 +00:00
ld [wStringBuffer2], a
ld de, wStringBuffer2
2015-12-14 16:12:18 +00:00
lb bc, 2, 3
call PrintNum
pop hl
ret
2018-06-24 14:09:41 +00:00
HPBarAnim_PaletteUpdate:
ldh a, [hCGB]
2015-12-14 16:12:18 +00:00
and a
ret z
ld hl, wCurHPAnimPal
2015-12-14 16:12:18 +00:00
call SetHPPal
ld a, [wCurHPAnimPal]
2015-12-14 16:12:18 +00:00
ld c, a
2017-12-24 17:47:30 +00:00
farcall ApplyHPBarPals
2015-12-14 16:12:18 +00:00
ret
2018-06-24 14:09:41 +00:00
HPBarAnim_BGMapUpdate:
ldh a, [hCGB]
2015-12-14 16:12:18 +00:00
and a
jr nz, .cgb
call DelayFrame
call DelayFrame
ret
.cgb
ld a, [wWhichHPBar]
2015-12-14 16:12:18 +00:00
and a
jr z, .load_0
cp $1
jr z, .load_1
2018-01-23 22:39:09 +00:00
ld a, [wCurPartyMon]
2015-12-14 16:12:18 +00:00
cp $3
jr nc, .bottom_half_of_screen
2015-12-14 16:12:18 +00:00
ld c, $0
jr .got_third
2015-12-14 16:12:18 +00:00
.bottom_half_of_screen
2015-12-14 16:12:18 +00:00
ld c, $1
.got_third
2015-12-14 16:12:18 +00:00
push af
cp $2
jr z, .skip_delay
cp $5
jr z, .skip_delay
ld a, $2
ldh [hBGMapMode], a
2015-12-14 16:12:18 +00:00
ld a, c
ldh [hBGMapThird], a
2015-12-14 16:12:18 +00:00
call DelayFrame
.skip_delay
ld a, $1
ldh [hBGMapMode], a
2015-12-14 16:12:18 +00:00
ld a, c
ldh [hBGMapThird], a
2015-12-14 16:12:18 +00:00
call DelayFrame
pop af
cp $2
jr z, .two_frames
cp $5
jr z, .two_frames
ret
.two_frames
inc c
ld a, $2
ldh [hBGMapMode], a
2015-12-14 16:12:18 +00:00
ld a, c
ldh [hBGMapThird], a
2015-12-14 16:12:18 +00:00
call DelayFrame
ld a, $1
ldh [hBGMapMode], a
2015-12-14 16:12:18 +00:00
ld a, c
ldh [hBGMapThird], a
2015-12-14 16:12:18 +00:00
call DelayFrame
ret
.load_0
ld c, $0
jr .finish
.load_1
ld c, $1
.finish
call DelayFrame
ld a, c
ldh [hBGMapThird], a
2015-12-14 16:12:18 +00:00
call DelayFrame
ret
2018-06-24 14:09:41 +00:00
ShortHPBar_CalcPixelFrame:
ld a, [wCurHPAnimMaxHP]
2015-12-14 16:12:18 +00:00
ld c, a
ld b, 0
ld hl, 0
2016-03-02 03:31:21 +00:00
ld a, [wCurHPBarPixels]
cp HP_BAR_LENGTH_PX
jr nc, .return_max
2015-12-14 16:12:18 +00:00
and a
jr z, .return_zero
call AddNTimes
2017-12-13 03:58:20 +00:00
2015-12-14 16:12:18 +00:00
ld b, 0
; This routine is buggy. If [wCurHPAnimMaxHP] * [wCurHPBarPixels] is
; divisible by HP_BAR_LENGTH_PX, the loop runs one extra time.
; To fix, uncomment the line below.
2015-12-14 16:12:18 +00:00
.loop
ld a, l
sub HP_BAR_LENGTH_PX
2015-12-14 16:12:18 +00:00
ld l, a
ld a, h
sbc $0
ld h, a
2017-12-13 03:58:20 +00:00
; jr z, .done
2015-12-14 16:12:18 +00:00
jr c, .done
inc b
jr .loop
.done
push bc
ld bc, $80
add hl, bc
pop bc
ld a, l
sub HP_BAR_LENGTH_PX
2015-12-14 16:12:18 +00:00
ld l, a
ld a, h
sbc $0
ld h, a
jr c, .no_carry
inc b
.no_carry
ld a, [wCurHPAnimLowHP]
2015-12-14 16:12:18 +00:00
cp b
jr nc, .finish
ld a, [wCurHPAnimHighHP]
2015-12-14 16:12:18 +00:00
cp b
jr c, .finish
ld a, b
.finish
ld [wCurHPAnimOldHP], a
2015-12-14 16:12:18 +00:00
ret
.return_zero
xor a
ld [wCurHPAnimOldHP], a
2015-12-14 16:12:18 +00:00
ret
.return_max
ld a, [wCurHPAnimMaxHP]
ld [wCurHPAnimOldHP], a
2015-12-14 16:12:18 +00:00
ret