From 870d85fc2713703f6dbc760df5b2c54328f0c9c3 Mon Sep 17 00:00:00 2001 From: luckytyphlosion <10688458+luckytyphlosion@users.noreply.github.com> Date: Tue, 3 Jul 2018 13:27:51 -0400 Subject: Merge branch 'master' of https://github.com/pret/pokegold-spaceworld --- engine/pokemon/health.asm | 716 +++++++++++++++++++++++----------------------- 1 file changed, 358 insertions(+), 358 deletions(-) (limited to 'engine/pokemon') 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 -- cgit v1.2.3