diff options
Diffstat (limited to 'battle/link_result.asm')
-rwxr-xr-x | battle/link_result.asm | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/battle/link_result.asm b/battle/link_result.asm new file mode 100755 index 000000000..5739bbdc0 --- /dev/null +++ b/battle/link_result.asm @@ -0,0 +1,162 @@ +DetermineLinkBattleResult: ; 2b930 + callba UpdateEnemyMonInParty + ld hl, PartyMon1HP + call .CountMonsRemaining + push bc + ld hl, OTPartyMon1HP + call .CountMonsRemaining + ld a, c + pop bc + cp c + jr z, .even_number_of_mons_remaining + jr c, .defeat + jr .victory + +.even_number_of_mons_remaining + call .BothSides_CheckNumberMonsAtFullHealth + jr z, .drawn + ld a, e + cp $1 + jr z, .victory + cp $2 + jr z, .defeat + ld hl, PartyMon1HP + call .CalcPercentHPRemaining + push de + ld hl, OTPartyMon1HP + call .CalcPercentHPRemaining + pop hl + ld a, d + cp h + jr c, .victory + jr z, .compare_lo + jr .defeat + +.compare_lo + ld a, e + cp l + jr z, .drawn + jr nc, .defeat + +.victory + ld a, [wBattleResult] + and $f0 + ld [wBattleResult], a + ret + +.defeat + ld a, [wBattleResult] + and $f0 + add $1 + ld [wBattleResult], a + ret + +.drawn + ld a, [wBattleResult] + and $f0 + add $2 + ld [wBattleResult], a + ret + +.CountMonsRemaining: ; 2b995 + ld c, 0 + ld b, 3 + ld de, PARTYMON_STRUCT_LENGTH - 1 +.loop + ld a, [hli] + or [hl] + jr nz, .not_fainted + inc c + +.not_fainted + add hl, de + dec b + jr nz, .loop + ret + +.CalcPercentHPRemaining: ; 2b9a6 + ld de, 0 + ld c, $3 +.loop2 + ld a, [hli] + or [hl] + jr z, .next + dec hl + xor a + ld [hDividend + 0], a + ld a, [hli] + ld [hDividend + 1], a + ld a, [hli] + ld [hDividend + 2], a + xor a + ld [hDividend + 3], a + ld a, [hli] + ld b, a + ld a, [hld] + srl b + rr a + srl b + rr a + ld [hDivisor], a + ld b, $4 + call Divide + ld a, [hQuotient + 2] + add e + ld e, a + ld a, [hQuotient + 1] + adc d + ld d, a + dec hl + +.next + push de + ld de, $2f + add hl, de + pop de + dec c + jr nz, .loop2 + ret + +.BothSides_CheckNumberMonsAtFullHealth: ; 2b9e1 + ld hl, PartyMon1HP + call .CheckFaintedOrFullHealth + jr nz, .finish ; we have a pokemon that's neither fainted nor at full health + ld hl, OTPartyMon1HP + call .CheckFaintedOrFullHealth + ld e, $1 + ret + +.finish + ld hl, OTPartyMon1HP + call .CheckFaintedOrFullHealth + ld e, $0 + ret nz ; we both have pokemon that are neither fainted nor at full health + ld e, $2 + ld a, $1 + and a + ret + +.CheckFaintedOrFullHealth: ; 2ba01 + ld d, 3 +.loop3 + ld a, [hli] + ld b, a + ld a, [hli] + ld c, a + or b + jr z, .fainted_or_full_health + ld a, [hli] + cp b + ret nz + ld a, [hld] + cp c + ret nz + +.fainted_or_full_health + push de + ld de, PARTYMON_STRUCT_LENGTH - 2 + add hl, de + pop de + dec d + jr nz, .loop3 + ret |