diff options
Diffstat (limited to 'engine/battle/anim_hp_bar.asm')
-rwxr-xr-x | engine/battle/anim_hp_bar.asm | 421 |
1 files changed, 421 insertions, 0 deletions
diff --git a/engine/battle/anim_hp_bar.asm b/engine/battle/anim_hp_bar.asm new file mode 100755 index 00000000..561cba42 --- /dev/null +++ b/engine/battle/anim_hp_bar.asm @@ -0,0 +1,421 @@ +HP_BAR_MAX_PIXELS EQU $30 + +AnimateHPBar_: ; d62d (3:562d) + call Functiond665 + jr c, .asm_d64b + call Functiond676 +.asm_d635 + push bc + push hl + call Functiond6e8 + pop hl + pop bc + push af + push bc + push hl + call Functiond736 + call Functiond7cf + pop hl + pop bc + pop af + jr nc, .asm_d635 + ret + +.asm_d64b + call Functiond676 +.asm_d64e + push bc + push hl + call Functiond6fb + pop hl + pop bc + ret c + push af + push bc + push hl + call Functiond74f + call Functiond7cf + pop hl + pop bc + pop af + jr nc, .asm_d64e + ret + +Functiond665: ; d665 (3:5665) + ld a, [wCurHPAnimMaxHP + 1] + and a + jr nz, .asm_d674 + ld a, [wCurHPAnimMaxHP] + cp HP_BAR_MAX_PIXELS + jr nc, .asm_d674 + and a + ret + +.asm_d674 + scf + ret + +Functiond676: ; d676 (3:5676) + push hl + ld hl, wCurHPAnimMaxHP + 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 + ld [wCurHPBarPixels], a + ld a, [wCurHPAnimNewHP] + ld c, a + ld a, [wCurHPAnimNewHP + 1] + ld b, a + ld a, [wCurHPAnimMaxHP] + ld e, a + ld a, [wCurHPAnimMaxHP + 1] + ld d, a + call ComputeHPBarPixels + ld a, e + ld [wNewHPBarPixels], a + push hl + ld hl, wCurHPAnimOldHP + 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 + jr c, .asm_d6c7 + ld a, [wCurHPAnimOldHP] + ld [wCurHPAnimLowHP], a + ld a, [wCurHPAnimNewHP] + ld [wCurHPAnimHighHP], a + ld bc, $1 + jr .asm_d6df + +.asm_d6c7 + ld a, [wCurHPAnimOldHP] + ld [wCurHPAnimHighHP], a + ld a, [wCurHPAnimNewHP] + ld [wCurHPAnimLowHP], a + ld a, e + xor $ff + inc a + ld e, a + ld a, d + xor $ff + ld d, a + ld bc, rIE +.asm_d6df + ld a, d + ld [wCurHPAnimDeltaHP], a + ld a, e + ld [wCurHPAnimDeltaHP + 1], a + ret + +Functiond6e8: ; d6e8 (3:56e8) + ld hl, wCurHPBarPixels + ld a, [wNewHPBarPixels] + cp [hl] + jr nz, .asm_d6f3 + scf + ret + +.asm_d6f3 + ld a, c + add [hl] + ld [hl], a + call Functiond83f + and a + ret + +Functiond6fb: ; d6fb (3:56fb) + ld hl, wCurHPAnimOldHP + ld a, [hli] + ld e, a + ld a, [hli] + ld d, a + ld a, e + cp [hl] + jr nz, .asm_d70d + inc hl + ld a, d + cp [hl] + jr nz, .asm_d70d + scf + ret + +.asm_d70d + ld l, e + ld h, d + add hl, bc + ld a, l + ld [wCurHPAnimOldHP], a + ld a, h + ld [wCurHPAnimOldHP + 1], a + push hl + push de + push bc + ld hl, wCurHPAnimMaxHP + ld a, [hli] + ld e, a + ld a, [hli] + ld d, a + ld a, [hli] + ld c, a + ld a, [hli] + ld b, a + ; BUG: This routine is meant to make the HP bar move at + ; the same rate regardless of how many HP the Pokemon has. + ; In actuality, this causes Pokemon with more than 48 HP + ; to gain or lose HP at the rate of 1 HP per BGMap update + ; rather than 1 pixel on the HUD. + ; To fix, move the "ld a, e" above the "pop de". + call ComputeHPBarPixels ; returns to e + pop bc + pop de ; overloads e + pop hl + ld a, e ; expects result from ComputeHPBarPixels + ld hl, wCurHPBarPixels + cp [hl] + jr z, Functiond6fb + ld [hl], a + and a + ret + +Functiond736: ; d736 (3:5736) + call Functiond78a + ld d, $6 + ld a, [wWhichHPBar] + and $1 + ld b, a + ld a, [wCurHPBarPixels] + ld e, a + ld c, a + push de + call Functiond777 + pop de + call Functiond7ba + ret + +Functiond74f: ; d74f (3:574f) + call Functiond78a + ld a, [wCurHPAnimOldHP] + ld c, a + ld a, [wCurHPAnimOldHP + 1] + ld b, a + ld a, [wCurHPAnimMaxHP] + ld e, a + ld a, [wCurHPAnimMaxHP + 1] + ld d, a + call ComputeHPBarPixels + ld c, e + ld d, $6 + ld a, [wWhichHPBar] + and $1 + ld b, a + push de + call Functiond777 + pop de + call Functiond7ba + ret + +Functiond777: ; d777 (3:5777) + ld a, [wWhichHPBar] + cp $2 + jr nz, .asm_d786 + ld a, $28 + add l + ld l, a + ld a, $0 + adc h + ld h, a +.asm_d786 + call DrawBattleHPBar + ret + +Functiond78a: ; d78a (3:578a) + ld a, [wWhichHPBar] + and a + ret z + cp $1 + jr z, .asm_d798 + ld de, $16 + jr .asm_d79b + +.asm_d798 + ld de, $15 +.asm_d79b + push hl + add hl, de + ld a, $7f + ld [hli], a + ld [hli], a + ld [hld], a + dec hl + ld a, [wCurHPAnimOldHP] + ld [wStringBuffer2 + 1], a + ld a, [wCurHPAnimOldHP + 1] + ld [wStringBuffer2], a + ld de, wStringBuffer2 + lb bc, 2, 3 + call PrintNum + pop hl + ret + +Functiond7ba: ; d7ba (3:57ba) + ldh a, [hCGB] + and a + ret z + ld hl, wCurHPAnimPal + call SetHPPal + ld a, [wCurHPAnimPal] + ld c, a + ld a, $2 + ld hl, $520b + rst FarCall + ret + +Functiond7cf: ; d7cf (3:57cf) + ldh a, [hCGB] + and a + jr nz, .asm_d7db + call DelayFrame + call DelayFrame + ret + +.asm_d7db + ld a, [wWhichHPBar] + and a + jr z, .asm_d82f + cp $1 + jr z, .asm_d833 + ld a, [wCurPartyMon] + cp $3 + jr nc, .asm_d7f0 + ld c, $0 + jr .asm_d7f2 + +.asm_d7f0 + ld c, $1 +.asm_d7f2 + push af + cp $2 + jr z, .asm_d805 + cp $5 + jr z, .asm_d805 + ld a, $2 + ldh [hBGMapMode], a + ld a, c + ldh [hBGMapThird], a + call DelayFrame +.asm_d805 + ld a, $1 + ldh [hBGMapMode], a + ld a, c + ldh [hBGMapThird], a + call DelayFrame + pop af + cp $2 + jr z, .asm_d819 + cp $5 + jr z, .asm_d819 + ret + +.asm_d819 + inc c + ld a, $2 + ldh [hBGMapMode], a + ld a, c + ldh [hBGMapThird], a + call DelayFrame + ld a, $1 + ldh [hBGMapMode], a + ld a, c + ldh [hBGMapThird], a + call DelayFrame + ret + +.asm_d82f + ld c, $0 + jr .asm_d835 + +.asm_d833 + ld c, $1 +.asm_d835 + call DelayFrame + ld a, c + ldh [hBGMapThird], a + call DelayFrame + ret + +Functiond83f: ; d83f (3:583f) + ld a, [wCurHPAnimMaxHP] + ld c, a + ld b, $0 + ld hl, $0 + ld a, [wCurHPBarPixels] + cp HP_BAR_MAX_PIXELS + jr nc, .asm_d88b + and a + jr z, .asm_d886 + call AddNTimes + ld b, $0 +.asm_d857 + ld a, l + sub HP_BAR_MAX_PIXELS % $100 + ld l, a + ld a, h + sbc HP_BAR_MAX_PIXELS / $100 + ld h, a + jr c, .asm_d864 + inc b + jr .asm_d857 + +.asm_d864 + push bc + ld bc, $80 + add hl, bc + pop bc + ld a, l + sub HP_BAR_MAX_PIXELS % $100 + ld l, a + ld a, h + sbc HP_BAR_MAX_PIXELS / $100 + ld h, a + jr c, .asm_d875 + inc b +.asm_d875 + ld a, [wCurHPAnimLowHP] + cp b + jr nc, .asm_d882 + ld a, [wCurHPAnimHighHP] + cp b + jr c, .asm_d882 + ld a, b +.asm_d882 + ld [wCurHPAnimOldHP], a + ret + +.asm_d886 + xor a + ld [wCurHPAnimOldHP], a + ret + +.asm_d88b + ld a, [wCurHPAnimMaxHP] + ld [wCurHPAnimOldHP], a + ret |