pokered/engine/hp_bar.asm

270 lines
4.4 KiB
NASM
Raw Normal View History

2016-06-12 00:24:04 +00:00
HPBarLength:
call GetPredefRegisters
2014-05-22 22:13:20 +00:00
; calculates bc * 48 / de, the number of pixels the HP bar has
; the result is always at least 1
2016-06-12 00:24:04 +00:00
GetHPBarLength:
2014-05-22 22:13:20 +00:00
push hl
xor a
ld hl, H_MULTIPLICAND
ld [hli], a
ld a, b
ld [hli], a
ld a, c
ld [hli], a
ld [hl], $30
call Multiply ; 48 * bc (hp bar is 48 pixels long)
ld a, d
and a
jr z, .maxHPSmaller256
srl d ; make HP in de fit into 1 byte by dividing by 4
rr e
srl d
rr e
ld a, [H_MULTIPLICAND+1]
ld b, a
ld a, [H_MULTIPLICAND+2]
srl b ; divide multiplication result as well
rr a
srl b
rr a
ld [H_MULTIPLICAND+2], a
ld a, b
ld [H_MULTIPLICAND+1], a
.maxHPSmaller256
ld a, e
ld [H_DIVISOR], a
ld b, $4
call Divide
ld a, [H_MULTIPLICAND+2]
ld e, a ; e = bc * 48 / de (num of pixels of HP bar)
pop hl
and a
ret nz
ld e, $1 ; make result at least 1
ret
; predef $48
2016-06-12 00:24:04 +00:00
UpdateHPBar:
2014-06-16 20:25:46 +00:00
UpdateHPBar2:
2014-05-22 22:13:20 +00:00
push hl
ld hl, wHPBarOldHP
ld a, [hli]
ld c, a ; old HP into bc
ld a, [hli]
ld b, a
ld a, [hli]
ld e, a ; new HP into de
ld d, [hl]
pop hl
push de
push bc
call UpdateHPBar_CalcHPDifference
ld a, e
ld [wHPBarHPDifference+1], a
ld a, d
ld [wHPBarHPDifference], a
pop bc
pop de
call UpdateHPBar_CompareNewHPToOldHP
ret z
ld a, $ff
jr c, .HPdecrease
ld a, $1
.HPdecrease
ld [wHPBarDelta], a
call GetPredefRegisters
2014-05-22 22:13:20 +00:00
ld a, [wHPBarNewHP]
ld e, a
ld a, [wHPBarNewHP+1]
ld d, a
.animateHPBarLoop
push de
ld a, [wHPBarOldHP]
ld c, a
ld a, [wHPBarOldHP+1]
ld b, a
call UpdateHPBar_CompareNewHPToOldHP
jr z, .animateHPBarDone
jr nc, .HPIncrease
dec bc ; subtract 1 HP
ld a, c
ld [wHPBarNewHP], a
ld a, b
ld [wHPBarNewHP+1], a
call UpdateHPBar_CalcOldNewHPBarPixels
ld a, e
sub d ; calc pixel difference
jr .asm_fa7e
.HPIncrease
inc bc ; add 1 HP
ld a, c
ld [wHPBarNewHP], a
ld a, b
ld [wHPBarNewHP+1], a
call UpdateHPBar_CalcOldNewHPBarPixels
ld a, d
sub e ; calc pixel difference
.asm_fa7e
call UpdateHPBar_PrintHPNumber
and a
jr z, .noPixelDifference
call UpdateHPBar_AnimateHPBar
.noPixelDifference
ld a, [wHPBarNewHP]
ld [wHPBarOldHP], a
ld a, [wHPBarNewHP+1]
ld [wHPBarOldHP+1], a
pop de
jr .animateHPBarLoop
.animateHPBarDone
pop de
ld a, e
ld [wHPBarOldHP], a
ld a, d
ld [wHPBarOldHP+1], a
or e
jr z, .monFainted
call UpdateHPBar_CalcOldNewHPBarPixels
ld d, e
.monFainted
call UpdateHPBar_PrintHPNumber
ld a, $1
call UpdateHPBar_AnimateHPBar
jp Delay3
; animates the HP bar going up or down for (a) ticks (two waiting frames each)
; stops prematurely if bar is filled up
; e: current health (in pixels) to start with
2016-06-12 00:24:04 +00:00
UpdateHPBar_AnimateHPBar:
2014-05-22 22:13:20 +00:00
push hl
.barAnimationLoop
push af
push de
ld d, $6
call DrawHPBar
ld c, 2
2014-05-22 22:13:20 +00:00
call DelayFrames
pop de
ld a, [wHPBarDelta] ; +1 or -1
add e
cp $31
jr nc, .barFilledUp
ld e, a
pop af
dec a
jr nz, .barAnimationLoop
pop hl
ret
.barFilledUp
pop af
pop hl
ret
; compares old HP and new HP and sets c and z flags accordingly
2016-06-12 00:24:04 +00:00
UpdateHPBar_CompareNewHPToOldHP:
2014-05-22 22:13:20 +00:00
ld a, d
sub b
ret nz
ld a, e
sub c
ret
; calcs HP difference between bc and de (into de)
2016-06-12 00:24:04 +00:00
UpdateHPBar_CalcHPDifference:
2014-05-22 22:13:20 +00:00
ld a, d
sub b
jr c, .oldHPGreater
jr z, .testLowerByte
.newHPGreater
ld a, e
sub c
ld e, a
ld a, d
sbc b
ld d, a
ret
.oldHPGreater
ld a, c
sub e
ld e, a
ld a, b
sbc d
ld d, a
ret
.testLowerByte
ld a, e
sub c
jr c, .oldHPGreater
jr nz, .newHPGreater
ld de, $0
ret
2016-06-12 00:24:04 +00:00
UpdateHPBar_PrintHPNumber:
2014-05-22 22:13:20 +00:00
push af
push de
2015-02-08 06:18:42 +00:00
ld a, [wHPBarType]
2014-05-22 22:13:20 +00:00
and a
2015-07-25 03:27:59 +00:00
jr z, .done ; don't print number in enemy HUD
; convert from little-endian to big-endian for PrintNumber
2014-05-22 22:13:20 +00:00
ld a, [wHPBarOldHP]
2015-07-25 03:27:59 +00:00
ld [wHPBarTempHP + 1], a
ld a, [wHPBarOldHP + 1]
ld [wHPBarTempHP], a
2014-05-22 22:13:20 +00:00
push hl
2015-02-08 00:24:16 +00:00
ld a, [hFlags_0xFFF6]
2014-05-22 22:13:20 +00:00
bit 0, a
jr z, .asm_fb15
ld de, $9
2015-07-25 03:27:59 +00:00
jr .next
2014-05-22 22:13:20 +00:00
.asm_fb15
ld de, $15
2015-07-25 03:27:59 +00:00
.next
2014-05-22 22:13:20 +00:00
add hl, de
push hl
2015-08-05 21:20:29 +00:00
ld a, " "
2014-05-22 22:13:20 +00:00
ld [hli], a
ld [hli], a
ld [hli], a
pop hl
2015-07-25 03:27:59 +00:00
ld de, wHPBarTempHP
2015-07-28 01:48:44 +00:00
lb bc, 2, 3
2014-05-22 22:13:20 +00:00
call PrintNumber
call DelayFrame
pop hl
2015-07-25 03:27:59 +00:00
.done
2014-05-22 22:13:20 +00:00
pop de
pop af
ret
; calcs number of HP bar pixels for old and new HP value
; d: new pixels
; e: old pixels
2016-06-12 00:24:04 +00:00
UpdateHPBar_CalcOldNewHPBarPixels:
2014-05-22 22:13:20 +00:00
push hl
ld hl, wHPBarMaxHP
ld a, [hli] ; max HP into de
ld e, a
ld a, [hli]
ld d, a
ld a, [hli] ; old HP into bc
ld c, a
ld a, [hli]
ld b, a
ld a, [hli] ; new HP into hl
ld h, [hl]
ld l, a
push hl
push de
call GetHPBarLength ; calc num pixels for old HP
2014-05-22 22:13:20 +00:00
ld a, e
pop de
pop bc
push af
call GetHPBarLength ; calc num pixels for new HP
2014-05-22 22:13:20 +00:00
pop af
ld d, e
ld e, a
pop hl
ret