1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
|
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
|