kep-hack/engine/battle/read_trainer_party.asm
emaskyesmogon 392f7abb97 Yellow Trainer Arrays
Allows more freedom in enemy design
2022-09-02 20:34:43 -06:00

145 lines
3 KiB
NASM

ReadTrainer:
; don't change any moves in a link battle
ld a, [wLinkState]
and a
ret nz
; set [wEnemyPartyCount] to 0, [wEnemyPartySpecies] to FF
; XXX first is total enemy pokemon?
; XXX second is species of first pokemon?
ld hl, wEnemyPartyCount
xor a
ld [hli], a
dec a
ld [hl], a
; get the pointer to trainer data for this class
ld a, [wTrainerClass] ; get trainer class
dec a
add a
ld hl, TrainerDataPointers
ld c, a
ld b, 0
add hl, bc ; hl points to trainer class
ld a, [hli]
ld h, [hl]
ld l, a
ld a, [wTrainerNo]
ld b, a
; At this point b contains the trainer number,
; and hl points to the trainer class.
; Our next task is to iterate through the trainers,
; decrementing b each time, until we get to the right one.
.outer
dec b
jr z, .IterateTrainer
.inner
ld a, [hli]
and a
jr nz, .inner
jr .outer
; if the first byte of trainer data is FF,
; - each pokemon has a specific level
; (as opposed to the whole team being of the same level)
; - if [wLoneAttackNo] != 0, one pokemon on the team has a special move
; else the first byte is the level of every pokemon on the team
.IterateTrainer
ld a, [hli]
cp $FF ; is the trainer special?
jr z, .SpecialTrainer ; if so, check for special moves
ld [wCurEnemyLVL], a
.LoopTrainerData
ld a, [hli]
and a ; have we reached the end of the trainer data?
jp z, .AddAdditionalMoveData
ld [wcf91], a ; write species somewhere (XXX why?)
ld a, ENEMY_PARTY_DATA
ld [wMonDataLocation], a
push hl
call AddPartyMon
pop hl
jr .LoopTrainerData
.SpecialTrainer
; if this code is being run:
; - each pokemon has a specific level
; (as opposed to the whole team being of the same level)
; - if [wLoneAttackNo] != 0, one pokemon on the team has a special move
ld a, [hli]
and a ; have we reached the end of the trainer data?
jr z, .AddAdditionalMoveData
ld [wCurEnemyLVL], a
ld a, [hli]
ld [wcf91], a
ld a, ENEMY_PARTY_DATA
ld [wMonDataLocation], a
push hl
call AddPartyMon
pop hl
jr .SpecialTrainer
.AddAdditionalMoveData
; does the trainer have additional move data?
ld a, [wTrainerClass]
ld b, a
ld a, [wTrainerNo]
ld c, a
ld hl, SpecialTrainerMoves
.loopAdditionalMoveData
ld a, [hli]
cp $ff
jr z, .FinishUp
cp b
jr nz, .asm_39c46
ld a, [hli]
cp c
jr nz, .asm_39c46
ld d, h
ld e, l
.writeAdditionalMoveDataLoop
ld a, [de]
inc de
and a
jp z, .FinishUp
dec a
ld hl, wEnemyMon1Moves
ld bc, wEnemyMon2 - wEnemyMon1
call AddNTimes
ld a, [de]
inc de
dec a
ld c, a
ld b, 0
add hl, bc
ld a, [de]
inc de
ld [hl], a
jr .writeAdditionalMoveDataLoop
.asm_39c46
ld a, [hli]
and a
jr nz, .asm_39c46
jr .loopAdditionalMoveData
.FinishUp
; clear wAmountMoneyWon addresses
xor a
ld de, wAmountMoneyWon
ld [de], a
inc de
ld [de], a
inc de
ld [de], a
ld a, [wCurEnemyLVL]
ld b, a
.LastLoop
; update wAmountMoneyWon addresses (money to win) based on enemy's level
ld hl, wTrainerBaseMoney + 1
ld c, 2 ; wAmountMoneyWon is a 3-byte number
push bc
predef AddBCDPredef
pop bc
inc de
inc de
dec b
jr nz, .LastLoop ; repeat wCurEnemyLVL times
ret