diff options
Diffstat (limited to 'engine/pokemon/health.asm')
-rwxr-xr-x | engine/pokemon/health.asm | 716 |
1 files changed, 358 insertions, 358 deletions
diff --git a/engine/pokemon/health.asm b/engine/pokemon/health.asm index 2d81b8d..8456623 100755 --- a/engine/pokemon/health.asm +++ b/engine/pokemon/health.asm @@ -1,358 +1,358 @@ -INCLUDE "constants.asm"
-
-SECTION "HealParty", ROMX[$4d6f], BANK[$03]
-
-HealParty: ; 03:4d6f
- ld hl, wPartySpecies
- ld de, wPartyMons
-
-.party_loop
- ld a, [hli]
- cp -1
- jr z, .party_done
- push hl
- push de
-
-; Clear the status
- ld hl, MON_STATUS
- add hl, de
- xor a
- ld [hli], a
- ld [hl], a
-
-; Reset the PP
- ld hl, MON_MOVES
- add hl, de
- ld b, NUM_MOVES
-
-.move_loop
- push hl
- push bc
- ld a, [hl]
- and a
- jr z, .next_move
- dec a
- push hl
- ld hl, Moves
- ld bc, MOVE_DATA_SIZE
- call AddNTimes
- ld a, BANK(Moves)
- call GetFarByte
- pop hl
- ld bc, MON_PP - MON_MOVES
- add hl, bc
- ld b, a
- ld a, [hl]
- and PP_UP_MASK
- add b
- ld [hl], a
-
-.next_move
- pop bc
- pop hl
- inc hl
- dec b
- jr nz, .move_loop
-
-; Reset the HP
- pop de
- push de
- ld hl, MON_MAXHP
- add hl, de
- ld b, h
- ld c, l
- dec bc
- dec bc
- ld a, [hli]
- ld [bc], a
- inc bc
- ld a, [hl]
- ld [bc], a
- pop de
- pop hl
- push hl
- ld hl, PARTYMON_STRUCT_LENGTH
- add hl, de
- ld d, h
- ld e, l
- pop hl
- jr .party_loop
-
-.party_done
- xor a
- ld [wWhichPokemon], a
- ld [wce37], a
- ld a, [wPartyCount]
- ld b, a
-
-.pp_up
- push bc
- call ApplyPPUp
- pop bc
- ld hl, wWhichPokemon
- inc [hl]
- dec b
- jr nz, .pp_up
- ret
-
-SECTION "HP Bar", ROMX[$4e3c], BANK[$03]
-
-ComputeHPBarPixels: ; 03:4e3c
- push hl
- xor a
- ldh [hMultiplicand], a
- ld a, b
- ldh [hMultiplicand + 1], a
- ld a, c
- ldh [hMultiplicand + 2], a
- ld a, HP_BAR_LENGTH_PX
- ldh [hMultiplier], a
- call Multiply
- ; We need de to be under 256 because hDivisor is only 1 byte.
- ld a, d
- and a
- jr z, .divide
- ; divide de and hProduct by 4
- srl d
- rr e
- srl d
- rr e
- ldh a, [hProduct + 2]
- ld b, a
- ldh a, [hProduct + 3]
- srl b
- rr a
- srl b
- rr a
- ldh [hDividend + 3], a
- ld a, b
- ldh [hDividend + 2], a
-.divide
- ld a, e
- ldh [hDivisor], a
- ld b, 4
- call Divide
- ldh a, [hQuotient + 2]
- ld e, a
- pop hl
- and a
- ret nz
- ld e, 1
- ret
-
-UpdateHPBar: ; 03:4e7c
- ld a, [wHPBarOldHP]
- ld c, a
- ld a, [wHPBarOldHP + 1]
- ld b, a
- ld a, [wHPBarNewHP]
- ld e, a
- ld a, [wHPBarNewHP + 1]
- ld d, a
- 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, -1
- jr c, .hp_decrease
- ld a, 1
-.hp_decrease
- ld [wHPBarDelta], a
- ld a, [wHPBarNewHP]
- ld e, a
- ld a, [wHPBarNewHP + 1]
- ld d, a
-.animate_hp_bar_loop
- push de
- ld a, [wHPBarOldHP]
- ld c, a
- ld a, [wHPBarOldHP + 1]
- ld b, a
- call UpdateHPBar_CompareNewHPToOldHP
- jr z, .animate_hp_bar_done
- jr nc, .hp_increase
-
-;hp_decrease
- dec bc
- ld a, c
- ld [wHPBarNewHP], a
- ld a, b
- ld [wHPBarNewHP + 1], a
- call UpdateHPBar_CalcOldNewHPBarPixels
- ld a, e
- sub d
- jr .apply
-.hp_increase
- inc bc
- ld a, c
- ld [wHPBarNewHP], a
- ld a, b
- ld [wHPBarNewHP + 1], a
- call UpdateHPBar_CalcOldNewHPBarPixels
- ld a, d
- sub e
-.apply
- call UpdateHPBar_PrintHPNumber
- and a
- jr z, .no_pixel_difference
- call UpdateHPBar_AnimateHPBar
-.no_pixel_difference
- ld a, [wHPBarNewHP]
- ld [wHPBarOldHP], a
- ld a, [wHPBarNewHP + 1]
- ld [wHPBarOldHP + 1], a
- pop de
- jr .animate_hp_bar_loop
-.animate_hp_bar_done
- pop de
- ld a, e
- ld [wHPBarOldHP], a
- ld a, d
- ld [wHPBarOldHP + 1], a
- or e
- jr z, .mon_fainted
- call UpdateHPBar_CalcOldNewHPBarPixels
- ld d, e
-.mon_fainted
- call UpdateHPBar_PrintHPNumber
- ld a, 1
- call UpdateHPBar_AnimateHPBar
- jp WaitBGMap
-
-; 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
-UpdateHPBar_AnimateHPBar: ; 03:4F11
- push hl
-
-.bar_animation_loop
- push af
- push de
- ld d, HP_BAR_LENGTH
- ld a, [wHPBarType]
- and BATTLE_HP_BAR
- ld b, a
- call DrawBattleHPBar
- ld c, 2
- call DelayFrames
- pop de
- ld a, [wHPBarDelta]
- add e
- cp HP_BAR_LENGTH_PX + 1
- jr nc, .bar_filled_up
- ld e, a
- pop af
- dec a
- jr nz, .bar_animation_loop
- pop hl
- ret
-.bar_filled_up
- pop af
- pop hl
- ret
-
-; compares old HP and new HP and sets c and z flags accordingly
-UpdateHPBar_CompareNewHPToOldHP: ; 03:4F37
- ld a, d
- sub b
- ret nz
- ld a, e
- sub c
- ret
-
-; calcs HP difference between bc and de (into de)
-UpdateHPBar_CalcHPDifference: ; 03:4F3D
- ld a, d
- sub b
- jr c, .old_hp_greater
- jr z, .test_lower_byte
-.new_hp_greater
- ld a, e
- sub c
- ld e, a
- ld a, d
- sbc b
- ld d, a
- ret
-.old_hp_greater
- ld a, c
- sub e
- ld e, a
- ld a, b
- sbc d
- ld d, a
- ret
-.test_lower_byte
- ld a, e
- sub c
- jr c, .old_hp_greater
- jr nz, .new_hp_greater
- ld de, 0
- ret
-
-UpdateHPBar_PrintHPNumber: ; 03:4F5B
- push af
- push de
- ld a, [wHPBarType]
- and a
- jr z, .done
- ld a, [wHPBarOldHP]
- ld [wHPBarTempHP + 1], a
- ld a, [wHPBarOldHP + 1]
- ld [wHPBarTempHP], a
- push hl
- ld de, SCREEN_WIDTH + 1
- add hl, de
- push hl
- ld a, " "
- ld [hli], a
- ld [hli], a
- ld [hli], a
- pop hl
- ld de, wHPBarTempHP
- lb bc, 2, 3
- call PrintNumber
- call DelayFrame
- pop hl
-.done
- pop de
- pop af
- ret
-
-; calcs number of HP bar pixels for old and new HP value
-; d: new pixels
-; e: old pixels
-UpdateHPBar_CalcOldNewHPBarPixels: ; 03:4F8B
- push hl
- ld hl, wHPBarMaxHP
- ld a, [hli]
- ld e, a
- ld a, [hli]
- ld d, a
- ld a, [hli]
- ld c, a
- ld a, [hli]
- ld b, a
- ld a, [hli]
- ld h, [hl]
- ld l, a
- push hl
- push de
- call ComputeHPBarPixels
- ld a, e
- pop de
- pop bc
- push af
- call ComputeHPBarPixels
- pop af
- ld d, e
- ld e, a
- pop hl
- ret
+INCLUDE "constants.asm" + +SECTION "HealParty", ROMX[$4d6f], BANK[$03] + +HealParty: ; 03:4d6f + ld hl, wPartySpecies + ld de, wPartyMons + +.party_loop + ld a, [hli] + cp -1 + jr z, .party_done + push hl + push de + +; Clear the status + ld hl, MON_STATUS + add hl, de + xor a + ld [hli], a + ld [hl], a + +; Reset the PP + ld hl, MON_MOVES + add hl, de + ld b, NUM_MOVES + +.move_loop + push hl + push bc + ld a, [hl] + and a + jr z, .next_move + dec a + push hl + ld hl, Moves + ld bc, MOVE_DATA_SIZE + call AddNTimes + ld a, BANK(Moves) + call GetFarByte + pop hl + ld bc, MON_PP - MON_MOVES + add hl, bc + ld b, a + ld a, [hl] + and PP_UP_MASK + add b + ld [hl], a + +.next_move + pop bc + pop hl + inc hl + dec b + jr nz, .move_loop + +; Reset the HP + pop de + push de + ld hl, MON_MAXHP + add hl, de + ld b, h + ld c, l + dec bc + dec bc + ld a, [hli] + ld [bc], a + inc bc + ld a, [hl] + ld [bc], a + pop de + pop hl + push hl + ld hl, PARTYMON_STRUCT_LENGTH + add hl, de + ld d, h + ld e, l + pop hl + jr .party_loop + +.party_done + xor a + ld [wWhichPokemon], a + ld [wce37], a + ld a, [wPartyCount] + ld b, a + +.pp_up + push bc + call ApplyPPUp + pop bc + ld hl, wWhichPokemon + inc [hl] + dec b + jr nz, .pp_up + ret + +SECTION "HP Bar", ROMX[$4e3c], BANK[$03] + +ComputeHPBarPixels: ; 03:4e3c + push hl + xor a + ldh [hMultiplicand], a + ld a, b + ldh [hMultiplicand + 1], a + ld a, c + ldh [hMultiplicand + 2], a + ld a, HP_BAR_LENGTH_PX + ldh [hMultiplier], a + call Multiply + ; We need de to be under 256 because hDivisor is only 1 byte. + ld a, d + and a + jr z, .divide + ; divide de and hProduct by 4 + srl d + rr e + srl d + rr e + ldh a, [hProduct + 2] + ld b, a + ldh a, [hProduct + 3] + srl b + rr a + srl b + rr a + ldh [hDividend + 3], a + ld a, b + ldh [hDividend + 2], a +.divide + ld a, e + ldh [hDivisor], a + ld b, 4 + call Divide + ldh a, [hQuotient + 2] + ld e, a + pop hl + and a + ret nz + ld e, 1 + ret + +UpdateHPBar: ; 03:4e7c + ld a, [wHPBarOldHP] + ld c, a + ld a, [wHPBarOldHP + 1] + ld b, a + ld a, [wHPBarNewHP] + ld e, a + ld a, [wHPBarNewHP + 1] + ld d, a + 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, -1 + jr c, .hp_decrease + ld a, 1 +.hp_decrease + ld [wHPBarDelta], a + ld a, [wHPBarNewHP] + ld e, a + ld a, [wHPBarNewHP + 1] + ld d, a +.animate_hp_bar_loop + push de + ld a, [wHPBarOldHP] + ld c, a + ld a, [wHPBarOldHP + 1] + ld b, a + call UpdateHPBar_CompareNewHPToOldHP + jr z, .animate_hp_bar_done + jr nc, .hp_increase + +;hp_decrease + dec bc + ld a, c + ld [wHPBarNewHP], a + ld a, b + ld [wHPBarNewHP + 1], a + call UpdateHPBar_CalcOldNewHPBarPixels + ld a, e + sub d + jr .apply +.hp_increase + inc bc + ld a, c + ld [wHPBarNewHP], a + ld a, b + ld [wHPBarNewHP + 1], a + call UpdateHPBar_CalcOldNewHPBarPixels + ld a, d + sub e +.apply + call UpdateHPBar_PrintHPNumber + and a + jr z, .no_pixel_difference + call UpdateHPBar_AnimateHPBar +.no_pixel_difference + ld a, [wHPBarNewHP] + ld [wHPBarOldHP], a + ld a, [wHPBarNewHP + 1] + ld [wHPBarOldHP + 1], a + pop de + jr .animate_hp_bar_loop +.animate_hp_bar_done + pop de + ld a, e + ld [wHPBarOldHP], a + ld a, d + ld [wHPBarOldHP + 1], a + or e + jr z, .mon_fainted + call UpdateHPBar_CalcOldNewHPBarPixels + ld d, e +.mon_fainted + call UpdateHPBar_PrintHPNumber + ld a, 1 + call UpdateHPBar_AnimateHPBar + jp WaitBGMap + +; 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 +UpdateHPBar_AnimateHPBar: ; 03:4F11 + push hl + +.bar_animation_loop + push af + push de + ld d, HP_BAR_LENGTH + ld a, [wHPBarType] + and BATTLE_HP_BAR + ld b, a + call DrawBattleHPBar + ld c, 2 + call DelayFrames + pop de + ld a, [wHPBarDelta] + add e + cp HP_BAR_LENGTH_PX + 1 + jr nc, .bar_filled_up + ld e, a + pop af + dec a + jr nz, .bar_animation_loop + pop hl + ret +.bar_filled_up + pop af + pop hl + ret + +; compares old HP and new HP and sets c and z flags accordingly +UpdateHPBar_CompareNewHPToOldHP: ; 03:4F37 + ld a, d + sub b + ret nz + ld a, e + sub c + ret + +; calcs HP difference between bc and de (into de) +UpdateHPBar_CalcHPDifference: ; 03:4F3D + ld a, d + sub b + jr c, .old_hp_greater + jr z, .test_lower_byte +.new_hp_greater + ld a, e + sub c + ld e, a + ld a, d + sbc b + ld d, a + ret +.old_hp_greater + ld a, c + sub e + ld e, a + ld a, b + sbc d + ld d, a + ret +.test_lower_byte + ld a, e + sub c + jr c, .old_hp_greater + jr nz, .new_hp_greater + ld de, 0 + ret + +UpdateHPBar_PrintHPNumber: ; 03:4F5B + push af + push de + ld a, [wHPBarType] + and a + jr z, .done + ld a, [wHPBarOldHP] + ld [wHPBarTempHP + 1], a + ld a, [wHPBarOldHP + 1] + ld [wHPBarTempHP], a + push hl + ld de, SCREEN_WIDTH + 1 + add hl, de + push hl + ld a, " " + ld [hli], a + ld [hli], a + ld [hli], a + pop hl + ld de, wHPBarTempHP + lb bc, 2, 3 + call PrintNumber + call DelayFrame + pop hl +.done + pop de + pop af + ret + +; calcs number of HP bar pixels for old and new HP value +; d: new pixels +; e: old pixels +UpdateHPBar_CalcOldNewHPBarPixels: ; 03:4F8B + push hl + ld hl, wHPBarMaxHP + ld a, [hli] + ld e, a + ld a, [hli] + ld d, a + ld a, [hli] + ld c, a + ld a, [hli] + ld b, a + ld a, [hli] + ld h, [hl] + ld l, a + push hl + push de + call ComputeHPBarPixels + ld a, e + pop de + pop bc + push af + call ComputeHPBarPixels + pop af + ld d, e + ld e, a + pop hl + ret |