pokecrystal/battle/ai/switch.asm

663 lines
7.3 KiB
NASM
Executable File

CheckPlayerMoveTypeMatchups: ; 3484e
; Check how well the moves you've already used
; fare against the enemy's Pokemon. Used to
; score a potential switch.
push hl
push de
push bc
ld a, 10
ld [wc716], a
ld hl, PlayerUsedMoves
ld a, [hl]
and a
jr z, .unknown_moves
ld d, NUM_MOVES
ld e, 0
.loop
ld a, [hli]
and a
jr z, .exit
push hl
dec a
ld hl, Moves + MOVE_POWER
call GetMoveAttr
and a
jr z, .next
inc hl
call GetMoveByte
ld hl, EnemyMonType
call CheckTypeMatchup
ld a, [wTypeMatchup]
cp 10 + 1 ; 1.0 + 0.1
jr nc, .super_effective
and a
jr z, .next
cp 10 ; 1.0
jr nc, .neutral
.not_very_effective
ld a, e
cp 1 ; 0.1
jr nc, .next
ld e, 1
jr .next
.neutral
ld e, 2
jr .next
.super_effective
call .DecreaseScore
pop hl
jr .done
.next
pop hl
dec d
jr nz, .loop
.exit
ld a, e
cp 2
jr z, .done
call .IncreaseScore
ld a, e
and a
jr nz, .done
call .IncreaseScore
jr .done
.unknown_moves
ld a, [BattleMonType1]
ld b, a
ld hl, EnemyMonType1
call CheckTypeMatchup
ld a, [wTypeMatchup]
cp 10 + 1 ; 1.0 + 0.1
jr c, .ok
call .DecreaseScore
.ok
ld a, [BattleMonType2]
cp b
jr z, .ok2
call CheckTypeMatchup
ld a, [wTypeMatchup]
cp 10 + 1 ; 1.0 + 0.1
jr c, .ok2
call .DecreaseScore
.ok2
.done
call .CheckEnemyMoveMatchups
pop bc
pop de
pop hl
ret
; 348de
.CheckEnemyMoveMatchups: ; 348de
ld de, EnemyMonMoves
ld b, NUM_MOVES + 1
ld c, 0
ld a, [wTypeMatchup]
push af
.loop2
dec b
jr z, .exit2
ld a, [de]
and a
jr z, .exit2
inc de
dec a
ld hl, Moves + MOVE_POWER
call GetMoveAttr
and a
jr z, .loop2
inc hl
call GetMoveByte
ld hl, BattleMonType1
call CheckTypeMatchup
ld a, [wTypeMatchup]
; immune
and a
jr z, .loop2
; not very effective
inc c
cp 10
jr c, .loop2
; neutral
rept 5
inc c
endr
cp 10
jr z, .loop2
; super effective
ld c, 100
jr .loop2
.exit2
pop af
ld [wTypeMatchup], a
ld a, c
and a
jr z, .doubledown ; double down
cp 5
jr c, .DecreaseScore ; down
cp 100
ret c
jr .IncreaseScore ; up
.doubledown
call .DecreaseScore
; fallthrough
; 34931
.DecreaseScore: ; 34931
ld a, [wc716]
dec a
ld [wc716], a
ret
; 34939
.IncreaseScore: ; 34939
ld a, [wc716]
inc a
ld [wc716], a
ret
; 34941
CheckAbleToSwitch: ; 34941
xor a
ld [wc717], a
call CheckEnemyHasMonToSwitchTo
ret c
ld a, [EnemySubStatus1]
bit SUBSTATUS_PERISH, a
jr z, .no_perish
ld a, [EnemyPerishCount]
cp 1
jr nz, .no_perish
; Perish count is 1
call CheckEnemyHasMonToSwitchTo
call Function34b77
call Function34b20
call Function34a85
ld a, e
cp 2
jr nz, .not_2
ld a, [wc716]
add $30
ld [wc717], a
ret
.not_2
call CheckEnemyHasMonToSwitchTo
sla c
sla c
ld b, $ff
.loop1
inc b
sla c
jr nc, .loop1
ld a, b
add $30
ld [wc717], a
ret
.no_perish
call CheckPlayerMoveTypeMatchups
ld a, [wc716]
cp 11
ret nc
ld a, [LastEnemyCounterMove]
and a
jr z, .asm_349d2
call Function34a2a
ld a, [wc716]
and a
jr z, .asm_349d2
ld c, a
call Function34aa7
ld a, [wc716]
cp $ff
ret z
ld b, a
ld a, e
cp 2
jr z, .asm_349be
call CheckPlayerMoveTypeMatchups
ld a, [wc716]
cp 10
ret nc
ld a, b
add $10
ld [wc717], a
ret
.asm_349be
ld c, $10
call CheckPlayerMoveTypeMatchups
ld a, [wc716]
cp 10
jr nc, .asm_349cc
ld c, $20
.asm_349cc
ld a, b
add c
ld [wc717], a
ret
.asm_349d2
call CheckPlayerMoveTypeMatchups
ld a, [wc716]
cp 10
ret nc
call CheckEnemyHasMonToSwitchTo
call Function34b77
call Function34b20
call Function34a85
ld a, e
cp $2
ret nz
ld a, [wc716]
add $10
ld [wc717], a
ret
; 349f4
CheckEnemyHasMonToSwitchTo: ; 349f4
ld a, [OTPartyCount]
cp 2
jr c, .only_one
ld d, a
ld e, 0
ld b, 1 << (PARTY_LENGTH - 1)
ld c, 0
ld hl, OTPartyMon1HP
.loop
ld a, [CurOTMon]
cp e
jr z, .next
push bc
ld b, [hl]
inc hl
ld a, [hld]
or b
pop bc
jr z, .next
ld a, c
or b
ld c, a
.next
srl b
push bc
ld bc, PARTYMON_STRUCT_LENGTH
add hl, bc
pop bc
inc e
dec d
jr nz, .loop
ld a, c
and a
jr nz, .more_than_one
.only_one
scf
ret
.more_than_one
and a
ret
; 34a2a
Function34a2a: ; 34a2a
ld hl, OTPartyMon1
ld a, [OTPartyCount]
ld b, a
ld c, 1 << (PARTY_LENGTH - 1)
ld d, 0
xor a
ld [wc716], a
.asm_34a39
ld a, [CurOTMon]
cp d
push hl
jr z, .asm_34a77
push hl
push bc
ld bc, MON_HP
add hl, bc
pop bc
ld a, [hli]
or [hl]
pop hl
jr z, .asm_34a77
ld a, [hl]
ld [CurSpecies], a
call GetBaseData
ld a, [LastEnemyCounterMove]
dec a
ld hl, Moves + MOVE_POWER
call GetMoveAttr
and a
jr z, .asm_34a77
inc hl
call GetMoveByte
ld hl, BaseType
call CheckTypeMatchup
ld a, [wTypeMatchup]
and a
jr nz, .asm_34a77
ld a, [wc716]
or c
ld [wc716], a
.asm_34a77
pop hl
dec b
ret z
push bc
ld bc, PARTYMON_STRUCT_LENGTH
add hl, bc
pop bc
inc d
srl c
jr .asm_34a39
; 34a85
Function34a85: ; 34a85
push bc
ld a, [OTPartyCount]
ld e, a
ld hl, OTPartyMon1HP
ld b, 1 << (PARTY_LENGTH - 1)
ld c, 0
.asm_34a91
ld a, [hli]
or [hl]
jr z, .asm_34a98
ld a, b
or c
ld c, a
.asm_34a98
srl b
push bc
ld bc, PartyMon2HP - (PartyMon1HP + 1)
add hl, bc
pop bc
dec e
jr nz, .asm_34a91
ld a, c
pop bc
and c
ld c, a
; fallthrough
; 34aa7
Function34aa7: ; 34aa7
ld a, $ff
ld [wc716], a
ld hl, OTPartyMon1Moves
ld b, 1 << (PARTY_LENGTH - 1)
ld d, 0
ld e, 0
.asm_34ab5
ld a, b
and c
jr z, .asm_34b00
push hl
push bc
ld b, NUM_MOVES
ld c, 0
.asm_34abf
ld a, [hli]
and a
push hl
jr z, .asm_34aef
dec a
ld hl, Moves + MOVE_POWER
call GetMoveAttr
and a
jr z, .asm_34ae9
inc hl
call GetMoveByte
ld hl, BattleMonType1
call CheckTypeMatchup
ld a, [wTypeMatchup]
cp 10
jr c, .asm_34ae9
ld e, 1
cp 11
jr c, .asm_34ae9
ld e, 2
jr .asm_34aef
.asm_34ae9
pop hl
dec b
jr nz, .asm_34abf
jr .asm_34af0
.asm_34aef
pop hl
.asm_34af0
ld a, e
pop bc
pop hl
cp $2
jr z, .asm_34b0e
cp $1
jr nz, .asm_34b00
ld a, d
or b
ld d, a
jr .asm_34b00
.asm_34b00
push bc
ld bc, PARTYMON_STRUCT_LENGTH
add hl, bc
pop bc
srl b
jr nc, .asm_34ab5
ld a, d
ld b, a
and a
ret z
.asm_34b0e
push bc
sla b
sla b
ld c, $ff
.asm_34b15
inc c
sla b
jr nc, .asm_34b15
ld a, c
ld [wc716], a
pop bc
ret
; 34b20
Function34b20: ; 34b20
push bc
ld hl, OTPartySpecies
ld b, 1 << (PARTY_LENGTH - 1)
ld c, 0
.asm_34b28
ld a, [hli]
cp $ff
jr z, .asm_34b72
push hl
ld [CurSpecies], a
call GetBaseData
ld a, [LastEnemyCounterMove]
and a
jr z, .asm_34b4a
dec a
ld hl, Moves + MOVE_POWER
call GetMoveAttr
and a
jr z, .asm_34b4a
inc hl
call GetMoveByte
jr .asm_34b5d
.asm_34b4a
ld a, [BattleMonType1]
ld hl, BaseType
call CheckTypeMatchup
ld a, [wTypeMatchup]
cp $b
jr nc, .asm_34b6d
ld a, [BattleMonType2]
.asm_34b5d
ld hl, BaseType
call CheckTypeMatchup
ld a, [wTypeMatchup]
cp $b
jr nc, .asm_34b6d
ld a, b
or c
ld c, a
.asm_34b6d
srl b
pop hl
jr .asm_34b28
.asm_34b72
ld a, c
pop bc
and c
ld c, a
ret
; 34b77
Function34b77: ; 34b77
push bc
ld de, OTPartySpecies
ld b, 1 << (PARTY_LENGTH - 1)
ld c, 0
ld hl, OTPartyMon1HP
.loop
ld a, [de]
inc de
cp $ff
jr z, .done
push hl
push bc
ld b, [hl]
inc hl
ld c, [hl]
rept 2
inc hl
endr
srl c
rl b
srl c
rl b
ld a, [hld]
cp c
ld a, [hl]
sbc b
pop bc
jr nc, .next
ld a, b
or c
ld c, a
.next
srl b
pop hl
push bc
ld bc, PARTYMON_STRUCT_LENGTH
add hl, bc
pop bc
jr .loop
.done
ld a, c
pop bc
and c
ld c, a
ret
; 34bb1