2014-05-22 22:13:20 +00:00
|
|
|
; creates a set of moves that may be used and returns its address in hl
|
|
|
|
; unused slots are filled with 0, all used slots may be chosen with equal probability
|
|
|
|
AIEnemyTrainerChooseMoves: ; 39719 (e:5719)
|
|
|
|
ld a, $a
|
2014-05-26 21:04:56 +00:00
|
|
|
ld hl, wHPBarMaxHP ; init temporary move selection array. Only the moves with the lowest numbers are chosen in the end
|
2014-05-22 22:13:20 +00:00
|
|
|
ld [hli], a ; move 1
|
|
|
|
ld [hli], a ; move 2
|
|
|
|
ld [hli], a ; move 3
|
|
|
|
ld [hl], a ; move 4
|
|
|
|
ld a, [W_ENEMYDISABLEDMOVE] ; forbid disabled move (if any)
|
|
|
|
swap a
|
|
|
|
and $f
|
|
|
|
jr z, .noMoveDisabled
|
2014-05-26 21:04:56 +00:00
|
|
|
ld hl, wHPBarMaxHP
|
2014-05-22 22:13:20 +00:00
|
|
|
dec a
|
|
|
|
ld c, a
|
|
|
|
ld b, $0
|
|
|
|
add hl, bc ; advance pointer to forbidden move
|
|
|
|
ld [hl], $50 ; forbid (highly discourage) disabled move
|
|
|
|
.noMoveDisabled
|
|
|
|
ld hl, TrainerClassMoveChoiceModifications ; 589B
|
|
|
|
ld a, [W_TRAINERCLASS]
|
|
|
|
ld b, a
|
|
|
|
.loopTrainerClasses
|
|
|
|
dec b
|
|
|
|
jr z, .readTrainerClassData
|
|
|
|
.loopTrainerClassData
|
|
|
|
ld a, [hli]
|
|
|
|
and a
|
|
|
|
jr nz, .loopTrainerClassData
|
|
|
|
jr .loopTrainerClasses
|
|
|
|
.readTrainerClassData
|
|
|
|
ld a, [hl]
|
|
|
|
and a
|
|
|
|
jp z, .useOriginalMoveSet
|
|
|
|
push hl
|
|
|
|
.nextMoveChoiceModification
|
|
|
|
pop hl
|
|
|
|
ld a, [hli]
|
|
|
|
and a
|
|
|
|
jr z, .loopFindMinimumEntries
|
|
|
|
push hl
|
|
|
|
ld hl, AIMoveChoiceModificationFunctionPointers ; $57a3
|
|
|
|
dec a
|
|
|
|
add a
|
|
|
|
ld c, a
|
|
|
|
ld b, $0
|
|
|
|
add hl, bc ; skip to pointer
|
|
|
|
ld a, [hli] ; read pointer into hl
|
|
|
|
ld h, [hl]
|
|
|
|
ld l, a
|
|
|
|
ld de, .nextMoveChoiceModification ; set return address
|
|
|
|
push de
|
|
|
|
jp [hl] ; execute modification function
|
|
|
|
.loopFindMinimumEntries ; all entries will be decremented sequentially until one of them is zero
|
2014-05-26 21:04:56 +00:00
|
|
|
ld hl, wHPBarMaxHP ; temp move selection array
|
2014-06-14 11:12:40 +00:00
|
|
|
ld de, wEnemyMonMoves ; enemy moves
|
2014-05-22 22:13:20 +00:00
|
|
|
ld c, $4
|
|
|
|
.loopDecrementEntries
|
|
|
|
ld a, [de]
|
|
|
|
inc de
|
|
|
|
and a
|
|
|
|
jr z, .loopFindMinimumEntries
|
|
|
|
dec [hl]
|
|
|
|
jr z, .minimumEntriesFound
|
|
|
|
inc hl
|
|
|
|
dec c
|
|
|
|
jr z, .loopFindMinimumEntries
|
|
|
|
jr .loopDecrementEntries
|
|
|
|
.minimumEntriesFound
|
|
|
|
ld a, c
|
|
|
|
.loopUndoPartialIteration ; undo last (partial) loop iteration
|
|
|
|
inc [hl]
|
|
|
|
dec hl
|
|
|
|
inc a
|
|
|
|
cp $5
|
|
|
|
jr nz, .loopUndoPartialIteration
|
2014-05-26 21:04:56 +00:00
|
|
|
ld hl, wHPBarMaxHP ; temp move selection array
|
2014-06-14 11:12:40 +00:00
|
|
|
ld de, wEnemyMonMoves ; enemy moves
|
2014-05-22 22:13:20 +00:00
|
|
|
ld c, $4
|
|
|
|
.filterMinimalEntries ; all minimal entries now have value 1. All other slots will be disabled (move set to 0)
|
|
|
|
ld a, [de]
|
|
|
|
and a
|
|
|
|
jr nz, .moveExisting ; 0x3978a $1
|
|
|
|
ld [hl], a
|
|
|
|
.moveExisting
|
|
|
|
ld a, [hl]
|
|
|
|
dec a
|
|
|
|
jr z, .slotWithMinimalValue
|
|
|
|
xor a
|
|
|
|
ld [hli], a ; disable move slot
|
|
|
|
jr .next
|
|
|
|
.slotWithMinimalValue
|
|
|
|
ld a, [de]
|
|
|
|
ld [hli], a ; enable move slot
|
|
|
|
.next
|
|
|
|
inc de
|
|
|
|
dec c
|
|
|
|
jr nz, .filterMinimalEntries
|
2014-05-26 21:04:56 +00:00
|
|
|
ld hl, wHPBarMaxHP ; use created temporary array as move set
|
2014-05-22 22:13:20 +00:00
|
|
|
ret
|
|
|
|
.useOriginalMoveSet
|
2014-06-14 11:12:40 +00:00
|
|
|
ld hl, wEnemyMonMoves ; use original move set
|
2014-05-22 22:13:20 +00:00
|
|
|
ret
|
|
|
|
|
|
|
|
AIMoveChoiceModificationFunctionPointers: ; 397a3 (e:57a3)
|
|
|
|
dw AIMoveChoiceModification1
|
|
|
|
dw AIMoveChoiceModification2
|
|
|
|
dw AIMoveChoiceModification3
|
|
|
|
dw AIMoveChoiceModification4 ; unused, does nothing
|
|
|
|
|
|
|
|
; discourages moves that cause no damage but only a status ailment if player's mon already has one
|
|
|
|
AIMoveChoiceModification1: ; 397ab (e:57ab)
|
2014-06-14 11:12:40 +00:00
|
|
|
ld a, [wBattleMonStatus]
|
2014-05-22 22:13:20 +00:00
|
|
|
and a
|
2015-03-31 18:40:22 +00:00
|
|
|
ret z ; return if no status ailment on player's mon
|
|
|
|
ld hl, wBuffer - 1 ; temp move selection array (-1 byte offest)
|
|
|
|
ld de, wEnemyMonMoves ; enemy moves
|
|
|
|
ld b, NUM_MOVES + 1
|
2014-05-22 22:13:20 +00:00
|
|
|
.nextMove
|
|
|
|
dec b
|
2015-03-31 18:40:22 +00:00
|
|
|
ret z ; processed all 4 moves
|
2014-05-22 22:13:20 +00:00
|
|
|
inc hl
|
|
|
|
ld a, [de]
|
|
|
|
and a
|
2015-03-31 18:40:22 +00:00
|
|
|
ret z ; no more moves in move set
|
2014-05-22 22:13:20 +00:00
|
|
|
inc de
|
|
|
|
call ReadMove
|
|
|
|
ld a, [W_ENEMYMOVEPOWER]
|
|
|
|
and a
|
|
|
|
jr nz, .nextMove
|
|
|
|
ld a, [W_ENEMYMOVEEFFECT]
|
|
|
|
push hl
|
|
|
|
push de
|
|
|
|
push bc
|
|
|
|
ld hl, StatusAilmentMoveEffects
|
|
|
|
ld de, $0001
|
|
|
|
call IsInArray
|
|
|
|
pop bc
|
|
|
|
pop de
|
|
|
|
pop hl
|
|
|
|
jr nc, .nextMove
|
|
|
|
ld a, [hl]
|
2015-03-31 18:40:22 +00:00
|
|
|
add $5 ; heavily discourage move
|
2014-05-22 22:13:20 +00:00
|
|
|
ld [hl], a
|
|
|
|
jr .nextMove
|
|
|
|
|
|
|
|
StatusAilmentMoveEffects ; 57e2
|
2015-03-31 18:40:22 +00:00
|
|
|
db $01 ; unused sleep effect
|
2014-05-22 22:13:20 +00:00
|
|
|
db SLEEP_EFFECT
|
|
|
|
db POISON_EFFECT
|
|
|
|
db PARALYZE_EFFECT
|
|
|
|
db $FF
|
|
|
|
|
2015-03-31 18:40:22 +00:00
|
|
|
; slightly encourage moves with specific effects.
|
|
|
|
; in particular, stat-modifying moves and other move effects
|
|
|
|
; that fall in-bewteen
|
2014-05-22 22:13:20 +00:00
|
|
|
AIMoveChoiceModification2: ; 397e7 (e:57e7)
|
2015-03-31 18:40:22 +00:00
|
|
|
ld a, [wAILayer2Encouragement]
|
|
|
|
cp $1
|
2014-05-22 22:13:20 +00:00
|
|
|
ret nz
|
2015-03-31 20:22:12 +00:00
|
|
|
ld hl, wBuffer - 1 ; temp move selection array (-1 byte offset)
|
2015-03-31 18:40:22 +00:00
|
|
|
ld de, wEnemyMonMoves ; enemy moves
|
|
|
|
ld b, NUM_MOVES + 1
|
2014-05-22 22:13:20 +00:00
|
|
|
.nextMove
|
|
|
|
dec b
|
2015-03-31 18:40:22 +00:00
|
|
|
ret z ; processed all 4 moves
|
2014-05-22 22:13:20 +00:00
|
|
|
inc hl
|
|
|
|
ld a, [de]
|
|
|
|
and a
|
2015-03-31 18:40:22 +00:00
|
|
|
ret z ; no more moves in move set
|
2014-05-22 22:13:20 +00:00
|
|
|
inc de
|
|
|
|
call ReadMove
|
|
|
|
ld a, [W_ENEMYMOVEEFFECT]
|
|
|
|
cp ATTACK_UP1_EFFECT
|
|
|
|
jr c, .nextMove
|
|
|
|
cp BIDE_EFFECT
|
|
|
|
jr c, .preferMove
|
|
|
|
cp ATTACK_UP2_EFFECT
|
|
|
|
jr c, .nextMove
|
|
|
|
cp POISON_EFFECT
|
|
|
|
jr c, .preferMove
|
|
|
|
jr .nextMove
|
|
|
|
.preferMove
|
2015-03-31 18:40:22 +00:00
|
|
|
dec [hl] ; sligthly encourage this move
|
2014-05-22 22:13:20 +00:00
|
|
|
jr .nextMove
|
|
|
|
|
2015-03-31 18:40:22 +00:00
|
|
|
; encourages moves that are effective against the player's mon (even if non-damaging).
|
|
|
|
; discourage damaging moves that are ineffective or not very effective against the player's mon,
|
|
|
|
; unless there's no damaging move that deals at least neutral damage
|
2014-05-22 22:13:20 +00:00
|
|
|
AIMoveChoiceModification3: ; 39817 (e:5817)
|
2015-03-31 20:22:12 +00:00
|
|
|
ld hl, wBuffer - 1 ; temp move selection array (-1 byte offset)
|
2015-03-31 18:40:22 +00:00
|
|
|
ld de, wEnemyMonMoves ; enemy moves
|
2014-05-22 22:13:20 +00:00
|
|
|
ld b, $5
|
|
|
|
.nextMove
|
|
|
|
dec b
|
2015-03-31 18:40:22 +00:00
|
|
|
ret z ; processed all 4 moves
|
2014-05-22 22:13:20 +00:00
|
|
|
inc hl
|
|
|
|
ld a, [de]
|
|
|
|
and a
|
2015-03-31 18:40:22 +00:00
|
|
|
ret z ; no more moves in move set
|
2014-05-22 22:13:20 +00:00
|
|
|
inc de
|
|
|
|
call ReadMove
|
|
|
|
push hl
|
|
|
|
push bc
|
|
|
|
push de
|
|
|
|
callab AIGetTypeEffectiveness
|
|
|
|
pop de
|
|
|
|
pop bc
|
|
|
|
pop hl
|
2014-05-26 21:04:56 +00:00
|
|
|
ld a, [wd11e]
|
2014-05-22 22:13:20 +00:00
|
|
|
cp $10
|
|
|
|
jr z, .nextMove
|
|
|
|
jr c, .notEffectiveMove
|
2015-03-31 18:40:22 +00:00
|
|
|
dec [hl] ; sligthly encourage this move
|
2014-05-22 22:13:20 +00:00
|
|
|
jr .nextMove
|
2015-03-31 18:40:22 +00:00
|
|
|
.notEffectiveMove ; discourages non-effective moves if better moves are available
|
2014-05-22 22:13:20 +00:00
|
|
|
push hl
|
|
|
|
push de
|
|
|
|
push bc
|
|
|
|
ld a, [W_ENEMYMOVETYPE]
|
|
|
|
ld d, a
|
2014-06-14 11:12:40 +00:00
|
|
|
ld hl, wEnemyMonMoves ; enemy moves
|
2015-04-01 09:23:27 +00:00
|
|
|
ld b, NUM_MOVES + 1
|
2014-05-22 22:13:20 +00:00
|
|
|
ld c, $0
|
|
|
|
.loopMoves
|
|
|
|
dec b
|
|
|
|
jr z, .done
|
|
|
|
ld a, [hli]
|
|
|
|
and a
|
|
|
|
jr z, .done
|
|
|
|
call ReadMove
|
|
|
|
ld a, [W_ENEMYMOVEEFFECT]
|
|
|
|
cp SUPER_FANG_EFFECT
|
2015-03-31 18:40:22 +00:00
|
|
|
jr z, .betterMoveFound ; Super Fang is considered to be a better move
|
2014-05-22 22:13:20 +00:00
|
|
|
cp SPECIAL_DAMAGE_EFFECT
|
2015-03-31 18:40:22 +00:00
|
|
|
jr z, .betterMoveFound ; any special damage moves are considered to be better moves
|
2014-05-22 22:13:20 +00:00
|
|
|
cp FLY_EFFECT
|
2015-03-31 18:40:22 +00:00
|
|
|
jr z, .betterMoveFound ; Fly is considered to be a better move
|
2014-05-22 22:13:20 +00:00
|
|
|
ld a, [W_ENEMYMOVETYPE]
|
|
|
|
cp d
|
|
|
|
jr z, .loopMoves
|
|
|
|
ld a, [W_ENEMYMOVEPOWER]
|
|
|
|
and a
|
2015-03-31 18:40:22 +00:00
|
|
|
jr nz, .betterMoveFound ; damaging moves of a different type are considered to be better moves
|
2014-05-22 22:13:20 +00:00
|
|
|
jr .loopMoves
|
|
|
|
.betterMoveFound
|
|
|
|
ld c, a
|
|
|
|
.done
|
|
|
|
ld a, c
|
|
|
|
pop bc
|
|
|
|
pop de
|
|
|
|
pop hl
|
|
|
|
and a
|
|
|
|
jr z, .nextMove
|
2015-03-31 18:40:22 +00:00
|
|
|
inc [hl] ; sligthly discourage this move
|
2014-05-22 22:13:20 +00:00
|
|
|
jr .nextMove
|
|
|
|
AIMoveChoiceModification4: ; 39883 (e:5883)
|
|
|
|
ret
|
|
|
|
|
|
|
|
ReadMove: ; 39884 (e:5884)
|
|
|
|
push hl
|
|
|
|
push de
|
|
|
|
push bc
|
|
|
|
dec a
|
|
|
|
ld hl,Moves
|
|
|
|
ld bc,6
|
|
|
|
call AddNTimes
|
2014-05-26 21:04:56 +00:00
|
|
|
ld de,W_ENEMYMOVENUM
|
2014-05-22 22:13:20 +00:00
|
|
|
call CopyData
|
|
|
|
pop bc
|
|
|
|
pop de
|
|
|
|
pop hl
|
|
|
|
ret
|
|
|
|
|
|
|
|
; move choice modification methods that are applied for each trainer class
|
|
|
|
; 0 is sentinel value
|
|
|
|
TrainerClassMoveChoiceModifications: ; 3989b (e:589b)
|
|
|
|
db 0 ; YOUNGSTER
|
|
|
|
db 1,0 ; BUG CATCHER
|
|
|
|
db 1,0 ; LASS
|
|
|
|
db 1,3,0 ; SAILOR
|
|
|
|
db 1,0 ; JR__TRAINER_M
|
|
|
|
db 1,0 ; JR__TRAINER_F
|
|
|
|
db 1,2,3,0; POKEMANIAC
|
|
|
|
db 1,2,0 ; SUPER_NERD
|
|
|
|
db 1,0 ; HIKER
|
|
|
|
db 1,0 ; BIKER
|
|
|
|
db 1,3,0 ; BURGLAR
|
|
|
|
db 1,0 ; ENGINEER
|
|
|
|
db 1,2,0 ; JUGGLER_X
|
|
|
|
db 1,3,0 ; FISHER
|
|
|
|
db 1,3,0 ; SWIMMER
|
|
|
|
db 0 ; CUE_BALL
|
|
|
|
db 1,0 ; GAMBLER
|
|
|
|
db 1,3,0 ; BEAUTY
|
|
|
|
db 1,2,0 ; PSYCHIC_TR
|
|
|
|
db 1,3,0 ; ROCKER
|
|
|
|
db 1,0 ; JUGGLER
|
|
|
|
db 1,0 ; TAMER
|
|
|
|
db 1,0 ; BIRD_KEEPER
|
|
|
|
db 1,0 ; BLACKBELT
|
|
|
|
db 1,0 ; SONY1
|
|
|
|
db 1,3,0 ; PROF_OAK
|
|
|
|
db 1,2,0 ; CHIEF
|
|
|
|
db 1,2,0 ; SCIENTIST
|
|
|
|
db 1,3,0 ; GIOVANNI
|
|
|
|
db 1,0 ; ROCKET
|
|
|
|
db 1,3,0 ; COOLTRAINER_M
|
|
|
|
db 1,3,0 ; COOLTRAINER_F
|
|
|
|
db 1,0 ; BRUNO
|
|
|
|
db 1,0 ; BROCK
|
|
|
|
db 1,3,0 ; MISTY
|
|
|
|
db 1,3,0 ; LT__SURGE
|
|
|
|
db 1,3,0 ; ERIKA
|
|
|
|
db 1,3,0 ; KOGA
|
|
|
|
db 1,3,0 ; BLAINE
|
|
|
|
db 1,3,0 ; SABRINA
|
|
|
|
db 1,2,0 ; GENTLEMAN
|
|
|
|
db 1,3,0 ; SONY2
|
|
|
|
db 1,3,0 ; SONY3
|
|
|
|
db 1,2,3,0; LORELEI
|
|
|
|
db 1,0 ; CHANNELER
|
|
|
|
db 1,0 ; AGATHA
|
|
|
|
db 1,3,0 ; LANCE
|
|
|
|
|
2015-04-01 15:27:51 +00:00
|
|
|
INCLUDE "engine/battle/trainer_pic_money_pointers.asm"
|
|
|
|
|
|
|
|
INCLUDE "text/trainer_names.asm"
|
2014-05-22 22:13:20 +00:00
|
|
|
|
2015-04-01 15:27:51 +00:00
|
|
|
INCLUDE "engine/battle/bank_e_misc.asm"
|
2014-05-22 22:13:20 +00:00
|
|
|
|
2015-04-01 15:27:51 +00:00
|
|
|
INCLUDE "engine/battle/read_trainer_party.asm"
|
2014-05-22 22:13:20 +00:00
|
|
|
|
|
|
|
INCLUDE "data/trainer_moves.asm"
|
|
|
|
|
|
|
|
INCLUDE "data/trainer_parties.asm"
|
|
|
|
|
|
|
|
TrainerAI: ; 3a52e (e:652e)
|
|
|
|
;XXX called at 34964, 3c342, 3c398
|
|
|
|
and a
|
|
|
|
ld a,[W_ISINBATTLE]
|
|
|
|
dec a
|
|
|
|
ret z ; if not a trainer, we're done here
|
2015-02-07 10:43:08 +00:00
|
|
|
ld a,[wLinkState]
|
|
|
|
cp LINK_STATE_BATTLING
|
2014-05-22 22:13:20 +00:00
|
|
|
ret z
|
|
|
|
ld a,[W_TRAINERCLASS] ; what trainer class is this?
|
|
|
|
dec a
|
|
|
|
ld c,a
|
|
|
|
ld b,0
|
|
|
|
ld hl,TrainerAIPointers
|
|
|
|
add hl,bc
|
|
|
|
add hl,bc
|
|
|
|
add hl,bc
|
|
|
|
ld a,[wAICount]
|
|
|
|
and a
|
|
|
|
ret z ; if no AI uses left, we're done here
|
|
|
|
inc hl
|
|
|
|
inc a
|
|
|
|
jr nz,.getpointer
|
|
|
|
dec hl
|
|
|
|
ld a,[hli]
|
|
|
|
ld [wAICount],a
|
|
|
|
.getpointer
|
|
|
|
ld a,[hli]
|
|
|
|
ld h,[hl]
|
|
|
|
ld l,a
|
2014-05-24 18:40:38 +00:00
|
|
|
call Random
|
2014-05-22 22:13:20 +00:00
|
|
|
jp [hl]
|
|
|
|
|
|
|
|
TrainerAIPointers: ; 3a55c (e:655c)
|
|
|
|
; one entry per trainer class
|
|
|
|
; first byte, number of times (per Pokémon) it can occur
|
|
|
|
; next two bytes, pointer to AI subroutine for trainer class
|
|
|
|
dbw 3,GenericAI
|
|
|
|
dbw 3,GenericAI
|
|
|
|
dbw 3,GenericAI
|
|
|
|
dbw 3,GenericAI
|
|
|
|
dbw 3,GenericAI
|
|
|
|
dbw 3,GenericAI
|
|
|
|
dbw 3,GenericAI
|
|
|
|
dbw 3,GenericAI
|
|
|
|
dbw 3,GenericAI
|
|
|
|
dbw 3,GenericAI
|
|
|
|
dbw 3,GenericAI
|
|
|
|
dbw 3,GenericAI
|
|
|
|
dbw 3,JugglerAI ; juggler_x
|
|
|
|
dbw 3,GenericAI
|
|
|
|
dbw 3,GenericAI
|
|
|
|
dbw 3,GenericAI
|
|
|
|
dbw 3,GenericAI
|
|
|
|
dbw 3,GenericAI
|
|
|
|
dbw 3,GenericAI
|
|
|
|
dbw 3,GenericAI
|
|
|
|
dbw 3,JugglerAI ; juggler
|
|
|
|
dbw 3,GenericAI
|
|
|
|
dbw 3,GenericAI
|
|
|
|
dbw 2,BlackbeltAI ; blackbelt
|
|
|
|
dbw 3,GenericAI
|
|
|
|
dbw 3,GenericAI
|
|
|
|
dbw 1,GenericAI ; chief
|
|
|
|
dbw 3,GenericAI
|
|
|
|
dbw 1,GiovanniAI ; giovanni
|
|
|
|
dbw 3,GenericAI
|
|
|
|
dbw 2,CooltrainerMAI ; cooltrainerm
|
|
|
|
dbw 1,CooltrainerFAI ; cooltrainerf
|
|
|
|
dbw 2,BrunoAI ; bruno
|
|
|
|
dbw 5,BrockAI ; brock
|
|
|
|
dbw 1,MistyAI ; misty
|
|
|
|
dbw 1,LtSurgeAI ; surge
|
|
|
|
dbw 1,ErikaAI ; erika
|
|
|
|
dbw 2,KogaAI ; koga
|
|
|
|
dbw 2,BlaineAI ; blaine
|
|
|
|
dbw 1,SabrinaAI ; sabrina
|
|
|
|
dbw 3,GenericAI
|
|
|
|
dbw 1,Sony2AI ; sony2
|
|
|
|
dbw 1,Sony3AI ; sony3
|
|
|
|
dbw 2,LoreleiAI ; lorelei
|
|
|
|
dbw 3,GenericAI
|
|
|
|
dbw 2,AgathaAI ; agatha
|
|
|
|
dbw 1,LanceAI ; lance
|
|
|
|
|
|
|
|
JugglerAI: ; 3a5e9 (e:65e9)
|
|
|
|
cp $40
|
|
|
|
ret nc
|
2015-02-08 09:44:41 +00:00
|
|
|
jp AISwitchIfEnoughMons
|
2014-05-22 22:13:20 +00:00
|
|
|
|
|
|
|
BlackbeltAI: ; 3a5ef (e:65ef)
|
|
|
|
cp $20
|
|
|
|
ret nc
|
|
|
|
jp AIUseXAttack
|
|
|
|
|
|
|
|
GiovanniAI: ; 3a5f5 (e:65f5)
|
|
|
|
cp $40
|
|
|
|
ret nc
|
|
|
|
jp AIUseGuardSpec
|
|
|
|
|
|
|
|
CooltrainerMAI: ; 3a5fb (e:65fb)
|
|
|
|
cp $40
|
|
|
|
ret nc
|
|
|
|
jp AIUseXAttack
|
|
|
|
|
|
|
|
CooltrainerFAI: ; 3a601 (e:6601)
|
|
|
|
cp $40
|
|
|
|
ld a,$A
|
2015-02-08 09:44:41 +00:00
|
|
|
call AICheckIfHPBelowFraction
|
2014-05-22 22:13:20 +00:00
|
|
|
jp c,AIUseHyperPotion
|
|
|
|
ld a,5
|
2015-02-08 09:44:41 +00:00
|
|
|
call AICheckIfHPBelowFraction
|
2014-05-22 22:13:20 +00:00
|
|
|
ret nc
|
2015-02-08 09:44:41 +00:00
|
|
|
jp AISwitchIfEnoughMons
|
2014-05-22 22:13:20 +00:00
|
|
|
|
|
|
|
BrockAI: ; 3a614 (e:6614)
|
|
|
|
; if his active monster has a status condition, use a full heal
|
2014-06-14 11:12:40 +00:00
|
|
|
ld a,[wEnemyMonStatus]
|
2014-05-22 22:13:20 +00:00
|
|
|
and a
|
|
|
|
ret z
|
|
|
|
jp AIUseFullHeal
|
|
|
|
|
|
|
|
MistyAI: ; 3a61c (e:661c)
|
|
|
|
cp $40
|
|
|
|
ret nc
|
|
|
|
jp AIUseXDefend
|
|
|
|
|
|
|
|
LtSurgeAI: ; 3a622 (e:6622)
|
|
|
|
cp $40
|
|
|
|
ret nc
|
|
|
|
jp AIUseXSpeed
|
|
|
|
|
|
|
|
ErikaAI: ; 3a628 (e:6628)
|
|
|
|
cp $80
|
|
|
|
ret nc
|
|
|
|
ld a,$A
|
2015-02-08 09:44:41 +00:00
|
|
|
call AICheckIfHPBelowFraction
|
2014-05-22 22:13:20 +00:00
|
|
|
ret nc
|
|
|
|
jp AIUseSuperPotion
|
|
|
|
|
|
|
|
KogaAI: ; 3a634 (e:6634)
|
|
|
|
cp $40
|
|
|
|
ret nc
|
|
|
|
jp AIUseXAttack
|
|
|
|
|
|
|
|
BlaineAI: ; 3a63a (e:663a)
|
|
|
|
cp $40
|
|
|
|
ret nc
|
|
|
|
jp AIUseSuperPotion
|
|
|
|
|
|
|
|
SabrinaAI: ; 3a640 (e:6640)
|
|
|
|
cp $40
|
|
|
|
ret nc
|
|
|
|
ld a,$A
|
2015-02-08 09:44:41 +00:00
|
|
|
call AICheckIfHPBelowFraction
|
2014-05-22 22:13:20 +00:00
|
|
|
ret nc
|
|
|
|
jp AIUseHyperPotion
|
|
|
|
|
|
|
|
Sony2AI: ; 3a64c (e:664c)
|
|
|
|
cp $20
|
|
|
|
ret nc
|
|
|
|
ld a,5
|
2015-02-08 09:44:41 +00:00
|
|
|
call AICheckIfHPBelowFraction
|
2014-05-22 22:13:20 +00:00
|
|
|
ret nc
|
|
|
|
jp AIUsePotion
|
|
|
|
|
|
|
|
Sony3AI: ; 3a658 (e:6658)
|
|
|
|
cp $20
|
|
|
|
ret nc
|
|
|
|
ld a,5
|
2015-02-08 09:44:41 +00:00
|
|
|
call AICheckIfHPBelowFraction
|
2014-05-22 22:13:20 +00:00
|
|
|
ret nc
|
|
|
|
jp AIUseFullRestore
|
|
|
|
|
|
|
|
LoreleiAI: ; 3a664 (e:6664)
|
|
|
|
cp $80
|
|
|
|
ret nc
|
|
|
|
ld a,5
|
2015-02-08 09:44:41 +00:00
|
|
|
call AICheckIfHPBelowFraction
|
2014-05-22 22:13:20 +00:00
|
|
|
ret nc
|
|
|
|
jp AIUseSuperPotion
|
|
|
|
|
|
|
|
BrunoAI: ; 3a670 (e:6670)
|
|
|
|
cp $40
|
|
|
|
ret nc
|
|
|
|
jp AIUseXDefend
|
|
|
|
|
|
|
|
AgathaAI: ; 3a676 (e:6676)
|
|
|
|
cp $14
|
2015-02-08 09:44:41 +00:00
|
|
|
jp c,AISwitchIfEnoughMons
|
2014-05-22 22:13:20 +00:00
|
|
|
cp $80
|
|
|
|
ret nc
|
|
|
|
ld a,4
|
2015-02-08 09:44:41 +00:00
|
|
|
call AICheckIfHPBelowFraction
|
2014-05-22 22:13:20 +00:00
|
|
|
ret nc
|
|
|
|
jp AIUseSuperPotion
|
|
|
|
|
|
|
|
LanceAI: ; 3a687 (e:6687)
|
|
|
|
cp $80
|
|
|
|
ret nc
|
|
|
|
ld a,5
|
2015-02-08 09:44:41 +00:00
|
|
|
call AICheckIfHPBelowFraction
|
2014-05-22 22:13:20 +00:00
|
|
|
ret nc
|
|
|
|
jp AIUseHyperPotion
|
|
|
|
|
|
|
|
GenericAI: ; 3a693 (e:6693)
|
|
|
|
and a ; clear carry
|
|
|
|
ret
|
|
|
|
|
|
|
|
; end of individual trainer AI routines
|
|
|
|
|
|
|
|
DecrementAICount: ; 3a695 (e:6695)
|
|
|
|
ld hl,wAICount
|
|
|
|
dec [hl]
|
|
|
|
scf
|
|
|
|
ret
|
|
|
|
|
|
|
|
Func_3a69b: ; 3a69b (e:669b)
|
|
|
|
ld a,(SFX_08_3e - SFX_Headers_08) / 3
|
|
|
|
jp PlaySoundWaitForCurrent
|
|
|
|
|
|
|
|
AIUseFullRestore: ; 3a6a0 (e:66a0)
|
|
|
|
call AICureStatus
|
|
|
|
ld a,FULL_RESTORE
|
2014-05-26 21:04:56 +00:00
|
|
|
ld [wcf05],a
|
2014-05-22 22:13:20 +00:00
|
|
|
ld de,wHPBarOldHP
|
2014-06-14 11:12:40 +00:00
|
|
|
ld hl,wEnemyMonHP + 1
|
2014-05-22 22:13:20 +00:00
|
|
|
ld a,[hld]
|
|
|
|
ld [de],a
|
|
|
|
inc de
|
|
|
|
ld a,[hl]
|
|
|
|
ld [de],a
|
|
|
|
inc de
|
2014-06-14 11:12:40 +00:00
|
|
|
ld hl,wEnemyMonMaxHP + 1
|
2014-05-22 22:13:20 +00:00
|
|
|
ld a,[hld]
|
|
|
|
ld [de],a
|
|
|
|
inc de
|
|
|
|
ld [wHPBarMaxHP],a
|
2014-06-14 11:12:40 +00:00
|
|
|
ld [wEnemyMonHP + 1],a
|
2014-05-22 22:13:20 +00:00
|
|
|
ld a,[hl]
|
|
|
|
ld [de],a
|
|
|
|
ld [wHPBarMaxHP+1],a
|
2014-06-14 11:12:40 +00:00
|
|
|
ld [wEnemyMonHP],a
|
2015-02-08 09:44:41 +00:00
|
|
|
jr AIPrintItemUseAndUpdateHPBar
|
2014-05-22 22:13:20 +00:00
|
|
|
|
|
|
|
AIUsePotion: ; 3a6ca (e:66ca)
|
|
|
|
; enemy trainer heals his monster with a potion
|
|
|
|
ld a,POTION
|
|
|
|
ld b,20
|
|
|
|
jr AIRecoverHP
|
|
|
|
|
|
|
|
AIUseSuperPotion: ; 3a6d0 (e:66d0)
|
|
|
|
; enemy trainer heals his monster with a super potion
|
|
|
|
ld a,SUPER_POTION
|
|
|
|
ld b,50
|
|
|
|
jr AIRecoverHP
|
|
|
|
|
|
|
|
AIUseHyperPotion: ; 3a6d6 (e:66d6)
|
|
|
|
; enemy trainer heals his monster with a hyper potion
|
|
|
|
ld a,HYPER_POTION
|
|
|
|
ld b,200
|
|
|
|
; fallthrough
|
|
|
|
|
|
|
|
AIRecoverHP: ; 3a6da (e:66da)
|
|
|
|
; heal b HP and print "trainer used $(a) on pokemon!"
|
2014-05-26 21:04:56 +00:00
|
|
|
ld [wcf05],a
|
2014-06-14 11:12:40 +00:00
|
|
|
ld hl,wEnemyMonHP + 1
|
2014-05-22 22:13:20 +00:00
|
|
|
ld a,[hl]
|
|
|
|
ld [wHPBarOldHP],a
|
|
|
|
add b
|
|
|
|
ld [hld],a
|
|
|
|
ld [wHPBarNewHP],a
|
|
|
|
ld a,[hl]
|
|
|
|
ld [wHPBarOldHP+1],a
|
|
|
|
ld [wHPBarNewHP+1],a
|
|
|
|
jr nc,.next
|
|
|
|
inc a
|
|
|
|
ld [hl],a
|
|
|
|
ld [wHPBarNewHP+1],a
|
|
|
|
.next
|
|
|
|
inc hl
|
|
|
|
ld a,[hld]
|
|
|
|
ld b,a
|
2014-06-14 11:12:40 +00:00
|
|
|
ld de,wEnemyMonMaxHP + 1
|
2014-05-22 22:13:20 +00:00
|
|
|
ld a,[de]
|
|
|
|
dec de
|
|
|
|
ld [wHPBarMaxHP],a
|
|
|
|
sub b
|
|
|
|
ld a,[hli]
|
|
|
|
ld b,a
|
|
|
|
ld a,[de]
|
|
|
|
ld [wHPBarMaxHP+1],a
|
|
|
|
sbc b
|
2015-02-08 09:44:41 +00:00
|
|
|
jr nc,AIPrintItemUseAndUpdateHPBar
|
2014-05-22 22:13:20 +00:00
|
|
|
inc de
|
|
|
|
ld a,[de]
|
|
|
|
dec de
|
|
|
|
ld [hld],a
|
|
|
|
ld [wHPBarNewHP],a
|
|
|
|
ld a,[de]
|
|
|
|
ld [hl],a
|
|
|
|
ld [wHPBarNewHP+1],a
|
|
|
|
; fallthrough
|
|
|
|
|
2015-02-08 09:44:41 +00:00
|
|
|
AIPrintItemUseAndUpdateHPBar: ; 3a718 (e:6718)
|
2014-05-22 22:13:20 +00:00
|
|
|
call AIPrintItemUse_
|
2014-06-25 20:58:27 +00:00
|
|
|
hlCoord 2, 2
|
2014-05-22 22:13:20 +00:00
|
|
|
xor a
|
2015-02-08 06:18:42 +00:00
|
|
|
ld [wHPBarType],a
|
2014-06-16 20:57:26 +00:00
|
|
|
predef UpdateHPBar2
|
2014-05-22 22:13:20 +00:00
|
|
|
jp DecrementAICount
|
|
|
|
|
2015-02-08 09:44:41 +00:00
|
|
|
AISwitchIfEnoughMons: ; 3a72a (e:672a)
|
|
|
|
; enemy trainer switches if there are 3 or more unfainted mons in party
|
2014-05-22 22:13:20 +00:00
|
|
|
ld a,[wEnemyPartyCount]
|
|
|
|
ld c,a
|
2014-06-14 11:12:40 +00:00
|
|
|
ld hl,wEnemyMon1HP
|
2014-05-22 22:13:20 +00:00
|
|
|
|
|
|
|
ld d,0 ; keep count of unfainted monsters
|
|
|
|
|
|
|
|
; count how many monsters haven't fainted yet
|
|
|
|
.loop
|
|
|
|
ld a,[hli]
|
|
|
|
ld b,a
|
|
|
|
ld a,[hld]
|
|
|
|
or b
|
|
|
|
jr z,.Fainted ; has monster fainted?
|
|
|
|
inc d
|
|
|
|
.Fainted
|
|
|
|
push bc
|
|
|
|
ld bc,$2C
|
|
|
|
add hl,bc
|
|
|
|
pop bc
|
|
|
|
dec c
|
|
|
|
jr nz,.loop
|
|
|
|
|
|
|
|
ld a,d ; how many available monsters are there?
|
|
|
|
cp 2 ; don't bother if only 1 or 2
|
2014-08-09 05:39:13 +00:00
|
|
|
jp nc,SwitchEnemyMon
|
2014-05-22 22:13:20 +00:00
|
|
|
and a
|
|
|
|
ret
|
|
|
|
|
2014-08-09 05:39:13 +00:00
|
|
|
SwitchEnemyMon: ; 3a74b (e:674b)
|
2014-05-22 22:13:20 +00:00
|
|
|
|
|
|
|
; prepare to withdraw the active monster: copy hp, number, and status to roster
|
|
|
|
|
2014-06-14 11:12:40 +00:00
|
|
|
ld a,[wEnemyMonPartyPos]
|
|
|
|
ld hl,wEnemyMon1HP
|
|
|
|
ld bc,wEnemyMon2 - wEnemyMon1
|
2014-05-22 22:13:20 +00:00
|
|
|
call AddNTimes
|
|
|
|
ld d,h
|
|
|
|
ld e,l
|
2014-06-14 11:12:40 +00:00
|
|
|
ld hl,wEnemyMonHP
|
2014-05-22 22:13:20 +00:00
|
|
|
ld bc,4
|
|
|
|
call CopyData
|
|
|
|
|
|
|
|
ld hl, AIBattleWithdrawText
|
|
|
|
call PrintText
|
|
|
|
|
|
|
|
ld a,1
|
2014-05-26 21:04:56 +00:00
|
|
|
ld [wd11d],a
|
2014-05-22 22:13:20 +00:00
|
|
|
callab EnemySendOut
|
|
|
|
xor a
|
2014-05-26 21:04:56 +00:00
|
|
|
ld [wd11d],a
|
2014-05-22 22:13:20 +00:00
|
|
|
|
2015-02-07 10:43:08 +00:00
|
|
|
ld a,[wLinkState]
|
|
|
|
cp LINK_STATE_BATTLING
|
2014-05-22 22:13:20 +00:00
|
|
|
ret z
|
|
|
|
scf
|
|
|
|
ret
|
|
|
|
|
|
|
|
AIBattleWithdrawText: ; 3a781 (e:6781)
|
|
|
|
TX_FAR _AIBattleWithdrawText
|
|
|
|
db "@"
|
|
|
|
|
|
|
|
AIUseFullHeal: ; 3a786 (e:6786)
|
|
|
|
call Func_3a69b
|
|
|
|
call AICureStatus
|
|
|
|
ld a,FULL_HEAL
|
|
|
|
jp AIPrintItemUse
|
|
|
|
|
|
|
|
AICureStatus: ; 3a791 (e:6791)
|
|
|
|
; cures the status of enemy's active pokemon
|
2014-06-14 11:12:40 +00:00
|
|
|
ld a,[wEnemyMonPartyPos]
|
|
|
|
ld hl,wEnemyMon1Status
|
|
|
|
ld bc,wEnemyMon2 - wEnemyMon1
|
2014-05-22 22:13:20 +00:00
|
|
|
call AddNTimes
|
|
|
|
xor a
|
|
|
|
ld [hl],a ; clear status in enemy team roster
|
2014-06-14 11:12:40 +00:00
|
|
|
ld [wEnemyMonStatus],a ; clear status of active enemy
|
2014-05-26 21:04:56 +00:00
|
|
|
ld hl,W_ENEMYBATTSTATUS3
|
2014-05-22 22:13:20 +00:00
|
|
|
res 0,[hl]
|
|
|
|
ret
|
|
|
|
|
|
|
|
AIUseXAccuracy: ; 0x3a7a8 unused
|
|
|
|
call Func_3a69b
|
2014-05-26 21:04:56 +00:00
|
|
|
ld hl,W_ENEMYBATTSTATUS2
|
2014-05-22 22:13:20 +00:00
|
|
|
set 0,[hl]
|
|
|
|
ld a,X_ACCURACY
|
|
|
|
jp AIPrintItemUse
|
|
|
|
|
|
|
|
AIUseGuardSpec: ; 3a7b5 (e:67b5)
|
|
|
|
call Func_3a69b
|
2014-05-26 21:04:56 +00:00
|
|
|
ld hl,W_ENEMYBATTSTATUS2
|
2014-05-22 22:13:20 +00:00
|
|
|
set 1,[hl]
|
|
|
|
ld a,GUARD_SPEC_
|
|
|
|
jp AIPrintItemUse
|
|
|
|
|
|
|
|
AIUseDireHit: ; 0x3a7c2 unused
|
|
|
|
call Func_3a69b
|
2014-05-26 21:04:56 +00:00
|
|
|
ld hl,W_ENEMYBATTSTATUS2
|
2014-05-22 22:13:20 +00:00
|
|
|
set 2,[hl]
|
|
|
|
ld a,DIRE_HIT
|
|
|
|
jp AIPrintItemUse
|
|
|
|
|
2015-02-08 09:44:41 +00:00
|
|
|
AICheckIfHPBelowFraction: ; 3a7cf (e:67cf)
|
|
|
|
; return carry if enemy trainer's current HP is below 1 / a of the maximum
|
2014-05-22 22:13:20 +00:00
|
|
|
ld [H_DIVISOR],a
|
2014-06-14 11:12:40 +00:00
|
|
|
ld hl,wEnemyMonMaxHP
|
2014-05-22 22:13:20 +00:00
|
|
|
ld a,[hli]
|
|
|
|
ld [H_DIVIDEND],a
|
|
|
|
ld a,[hl]
|
|
|
|
ld [H_DIVIDEND + 1],a
|
|
|
|
ld b,2
|
|
|
|
call Divide
|
|
|
|
ld a,[H_QUOTIENT + 3]
|
|
|
|
ld c,a
|
|
|
|
ld a,[H_QUOTIENT + 2]
|
|
|
|
ld b,a
|
2014-06-14 11:12:40 +00:00
|
|
|
ld hl,wEnemyMonHP + 1
|
2014-05-22 22:13:20 +00:00
|
|
|
ld a,[hld]
|
|
|
|
ld e,a
|
|
|
|
ld a,[hl]
|
|
|
|
ld d,a
|
|
|
|
ld a,d
|
|
|
|
sub b
|
|
|
|
ret nz
|
|
|
|
ld a,e
|
|
|
|
sub c
|
|
|
|
ret
|
|
|
|
|
|
|
|
AIUseXAttack: ; 3a7f2 (e:67f2)
|
|
|
|
ld b,$A
|
|
|
|
ld a,X_ATTACK
|
|
|
|
jr AIIncreaseStat
|
|
|
|
|
|
|
|
AIUseXDefend: ; 3a7f8 (e:67f8)
|
|
|
|
ld b,$B
|
|
|
|
ld a,X_DEFEND
|
|
|
|
jr AIIncreaseStat
|
|
|
|
|
|
|
|
AIUseXSpeed: ; 3a7fe (e:67fe)
|
|
|
|
ld b,$C
|
|
|
|
ld a,X_SPEED
|
|
|
|
jr AIIncreaseStat
|
|
|
|
|
|
|
|
AIUseXSpecial: ; 3a804 (e:6804)
|
|
|
|
ld b,$D
|
|
|
|
ld a,X_SPECIAL
|
|
|
|
; fallthrough
|
|
|
|
|
|
|
|
AIIncreaseStat: ; 3a808 (e:6808)
|
2014-05-26 21:04:56 +00:00
|
|
|
ld [wcf05],a
|
2014-05-22 22:13:20 +00:00
|
|
|
push bc
|
|
|
|
call AIPrintItemUse_
|
|
|
|
pop bc
|
2014-05-26 21:04:56 +00:00
|
|
|
ld hl,W_ENEMYMOVEEFFECT
|
2014-05-22 22:13:20 +00:00
|
|
|
ld a,[hld]
|
|
|
|
push af
|
|
|
|
ld a,[hl]
|
|
|
|
push af
|
|
|
|
push hl
|
|
|
|
ld a,$AF
|
|
|
|
ld [hli],a
|
|
|
|
ld [hl],b
|
|
|
|
callab StatModifierUpEffect
|
|
|
|
pop hl
|
|
|
|
pop af
|
|
|
|
ld [hli],a
|
|
|
|
pop af
|
|
|
|
ld [hl],a
|
|
|
|
jp DecrementAICount
|
|
|
|
|
|
|
|
AIPrintItemUse: ; 3a82c (e:682c)
|
2014-05-26 21:04:56 +00:00
|
|
|
ld [wcf05],a
|
2014-05-22 22:13:20 +00:00
|
|
|
call AIPrintItemUse_
|
|
|
|
jp DecrementAICount
|
|
|
|
|
|
|
|
AIPrintItemUse_: ; 3a835 (e:6835)
|
2014-05-26 21:04:56 +00:00
|
|
|
; print "x used [wcf05] on z!"
|
|
|
|
ld a,[wcf05]
|
|
|
|
ld [wd11e],a
|
2014-05-22 22:13:20 +00:00
|
|
|
call GetItemName
|
|
|
|
ld hl, AIBattleUseItemText
|
|
|
|
jp PrintText
|
|
|
|
|
|
|
|
AIBattleUseItemText: ; 3a844 (e:6844)
|
|
|
|
TX_FAR _AIBattleUseItemText
|
|
|
|
db "@"
|