mirror of
https://github.com/pret/pokered.git
synced 2024-10-24 07:25:21 +00:00
166 lines
3.6 KiB
NASM
Executable file
166 lines
3.6 KiB
NASM
Executable file
ReadTrainer:
|
|
|
|
; don't change any moves in a link battle
|
|
ld a, [wLinkState]
|
|
and a
|
|
ret nz
|
|
|
|
; set [wEnemyPartyCount] to 0, [wEnemyPartyMons] 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, [wCurOpponent]
|
|
sub $C9 ; convert value from pokemon to trainer
|
|
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?
|
|
jr z, .FinishUp
|
|
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, .AddLoneMove
|
|
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
|
|
.AddLoneMove
|
|
; does the trainer have a single monster with a different move
|
|
ld a, [wLoneAttackNo] ; Brock is 01, Misty is 02, Erika is 04, etc
|
|
and a
|
|
jr z, .AddTeamMove
|
|
dec a
|
|
add a
|
|
ld c, a
|
|
ld b, 0
|
|
ld hl, LoneMoves
|
|
add hl, bc
|
|
ld a, [hli]
|
|
ld d, [hl]
|
|
ld hl, wEnemyMon1Moves + 2
|
|
ld bc, wEnemyMon2 - wEnemyMon1
|
|
call AddNTimes
|
|
ld [hl], d
|
|
jr .FinishUp
|
|
.AddTeamMove
|
|
; check if our trainer's team has special moves
|
|
|
|
; get trainer class number
|
|
ld a, [wCurOpponent]
|
|
sub OPP_ID_OFFSET
|
|
ld b, a
|
|
ld hl, TeamMoves
|
|
|
|
; iterate through entries in TeamMoves, checking each for our trainer class
|
|
.IterateTeamMoves
|
|
ld a, [hli]
|
|
cp b
|
|
jr z, .GiveTeamMoves ; is there a match?
|
|
inc hl ; if not, go to the next entry
|
|
inc a
|
|
jr nz, .IterateTeamMoves
|
|
|
|
; no matches found. is this trainer champion rival?
|
|
ld a, b
|
|
cp SONY3
|
|
jr z, .ChampionRival
|
|
jr .FinishUp ; nope
|
|
.GiveTeamMoves
|
|
ld a, [hl]
|
|
ld [wEnemyMon5Moves + 2], a
|
|
jr .FinishUp
|
|
.ChampionRival ; give moves to his team
|
|
|
|
; pidgeot
|
|
ld a, SKY_ATTACK
|
|
ld [wEnemyMon1Moves + 2], a
|
|
|
|
; starter
|
|
ld a, [wRivalStarter]
|
|
cp STARTER3
|
|
ld b, MEGA_DRAIN
|
|
jr z, .GiveStarterMove
|
|
cp STARTER1
|
|
ld b, FIRE_BLAST
|
|
jr z, .GiveStarterMove
|
|
ld b, BLIZZARD ; must be squirtle
|
|
.GiveStarterMove
|
|
ld a, b
|
|
ld [wEnemyMon6Moves + 2], a
|
|
.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
|