summaryrefslogtreecommitdiff
path: root/battle/link_result.asm
diff options
context:
space:
mode:
Diffstat (limited to 'battle/link_result.asm')
-rwxr-xr-xbattle/link_result.asm162
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