pokecrystal-board/engine/battle/link_result.asm

163 lines
2.3 KiB
NASM
Raw Normal View History

2018-06-24 07:09:41 -07:00
DetermineLinkBattleResult:
2017-12-24 09:47:30 -08:00
farcall UpdateEnemyMonInParty
2018-01-23 14:39:09 -08:00
ld hl, wPartyMon1HP
call .CountMonsRemaining
push bc
2018-01-23 14:39:09 -08:00
ld hl, wOTPartyMon1HP
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
2018-01-23 14:39:09 -08:00
ld hl, wPartyMon1HP
call .CalcPercentHPRemaining
push de
2018-01-23 14:39:09 -08:00
ld hl, wOTPartyMon1HP
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
2018-04-05 08:44:02 -07:00
ld [wBattleResult], a ; WIN
ret
.defeat
ld a, [wBattleResult]
and $f0
2018-04-05 08:44:02 -07:00
add LOSE
ld [wBattleResult], a
ret
.drawn
ld a, [wBattleResult]
and $f0
2018-04-05 08:44:02 -07:00
add DRAW
ld [wBattleResult], a
ret
2018-06-24 07:09:41 -07:00
.CountMonsRemaining:
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
2018-06-24 07:09:41 -07:00
.CalcPercentHPRemaining:
ld de, 0
ld c, $3
.loop2
ld a, [hli]
or [hl]
jr z, .next
dec hl
xor a
ldh [hDividend + 0], a
ld a, [hli]
ldh [hDividend + 1], a
ld a, [hli]
ldh [hDividend + 2], a
xor a
ldh [hDividend + 3], a
ld a, [hli]
ld b, a
ld a, [hld]
srl b
rr a
srl b
rr a
ldh [hDivisor], a
ld b, $4
call Divide
ldh a, [hQuotient + 3]
add e
ld e, a
ldh a, [hQuotient + 2]
adc d
ld d, a
dec hl
.next
push de
ld de, $2f
add hl, de
pop de
dec c
jr nz, .loop2
ret
2018-06-24 07:09:41 -07:00
.BothSides_CheckNumberMonsAtFullHealth:
2018-01-23 14:39:09 -08:00
ld hl, wPartyMon1HP
call .CheckFaintedOrFullHealth
jr nz, .finish ; we have a pokemon that's neither fainted nor at full health
2018-01-23 14:39:09 -08:00
ld hl, wOTPartyMon1HP
call .CheckFaintedOrFullHealth
2018-04-05 08:44:02 -07:00
ld e, $1 ; victory
ret
.finish
2018-01-23 14:39:09 -08:00
ld hl, wOTPartyMon1HP
call .CheckFaintedOrFullHealth
2018-04-05 08:44:02 -07:00
ld e, $0 ; drawn
ret nz ; we both have pokemon that are neither fainted nor at full health
2018-04-05 08:44:02 -07:00
ld e, $2 ; defeat
ld a, $1 ; not drawn
and a
ret
2018-06-24 07:09:41 -07:00
.CheckFaintedOrFullHealth:
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