summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xengine/anim_hp_bar.asm421
-rw-r--r--main.asm9
-rw-r--r--wram.asm14
3 files changed, 437 insertions, 7 deletions
diff --git a/engine/anim_hp_bar.asm b/engine/anim_hp_bar.asm
new file mode 100755
index 00000000..c599a942
--- /dev/null
+++ b/engine/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, [wd007]
+ 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, [wd007]
+ and $1
+ ld b, a
+ push de
+ call Functiond777
+ pop de
+ call Functiond7ba
+ ret
+
+Functiond777: ; d777 (3:5777)
+ ld a, [wd007]
+ 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, [wd007]
+ 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)
+ ld 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)
+ ld a, [hCGB]
+ and a
+ jr nz, .asm_d7db
+ call DelayFrame
+ call DelayFrame
+ ret
+
+.asm_d7db
+ ld a, [wd007]
+ and a
+ jr z, .asm_d82f
+ cp $1
+ jr z, .asm_d833
+ ld a, [wd005]
+ 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
+ ld [hBGMapMode], a
+ ld a, c
+ ld [hBGMapThird], a
+ call DelayFrame
+.asm_d805
+ ld a, $1
+ ld [hBGMapMode], a
+ ld a, c
+ ld [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
+ ld [hBGMapMode], a
+ ld a, c
+ ld [hBGMapThird], a
+ call DelayFrame
+ ld a, $1
+ ld [hBGMapMode], a
+ ld a, c
+ ld [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
+ ld [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
diff --git a/main.asm b/main.asm
index f94f17bb..3f90698a 100644
--- a/main.asm
+++ b/main.asm
@@ -407,12 +407,10 @@ INCLUDE "engine/health.asm"
INCLUDE "event/overworld.asm"
INCLUDE "engine/items.asm"
INCLUDE "engine/player_step.asm"
-
-AnimateHPBar_:
-IF DEF(GOLD)
- dr $d62d, $d892
+INCLUDE "engine/anim_hp_bar.asm"
TryAddMonToParty::
+IF DEF(GOLD)
dr $d892, $da73
FillPP::
@@ -454,9 +452,6 @@ Functionf900:
ENDC
IF DEF(SILVER)
- dr $d62b, $d890
-
-TryAddMonToParty::
dr $d890, $da71
FillPP::
diff --git a/wram.asm b/wram.asm
index 51da7a5c..88a11934 100644
--- a/wram.asm
+++ b/wram.asm
@@ -2531,6 +2531,20 @@ wd0ce:: ds 1 ; d0ce
wTilesetPalettes:: dw ; d0cf
wd0d1:: ds 1 ; d0d1
wd0d2:: ds 1 ; d0d2
+
+wCurHPAnim::
+wCurHPAnimMaxHP:: dw ; d0d3
+wCurHPAnimOldHP:: dw ; d0d5
+wCurHPAnimNewHP:: dw ; d0d7
+wCurHPAnimPal:: db ; d0d9
+wCurHPBarPixels:: db ; d0da
+wNewHPBarPixels:: db ; d0db
+wCurHPAnimDeltaHP:: dw ; d0dc
+wCurHPAnimLowHP:: db ; d0de
+wCurHPAnimHighHP:: db ; d0df
+wCurHPAnimEnd::
+ ds wCurHPAnim - @
+
wBuffer1:: ds 1 ; d0d3
wBuffer2:: ds 1 ; d0d4
wBuffer3:: ds 1 ; d0d5