SHOW:
|
|
- or go back to the newest paste.
1 | getBadgeLevel ; 3fdd | |
2 | ; outputs b = badgeLevel | |
3 | ld hl,D857 ; JohtoBadges | |
4 | ld b,02 | |
5 | call CountSetBits | |
6 | ld e,a | |
7 | ld d,00 | |
8 | ld hl,3FEF ; badgeLevelTable | |
9 | add hl,de | |
10 | ld a,(hl) | |
11 | ld b,a | |
12 | ret | |
13 | ||
14 | badgeLevelTable ; 3fef | |
15 | db 14 | |
16 | db 1E | |
17 | db 26 | |
18 | db 2D | |
19 | db 36 | |
20 | db 3C | |
21 | db 3F | |
22 | db 49 | |
23 | db 52 | |
24 | db 54 | |
25 | db 56 | |
26 | db 58 | |
27 | db 5A | |
28 | db 5C | |
29 | db 5E | |
30 | db 60 | |
31 | db 64 | |
32 | ||
33 | RareCandy: ; 03:6f14 | |
34 | ;(...) | |
35 | call GetPartyParamLocation | |
36 | jp rcpatch ; jump from ef24 | |
37 | jp nc,Functionee83 ; no effect if carry flag is clear | |
38 | ;(...) | |
39 | ||
40 | rcpatch: ; 03:7a30 | |
41 | ; cap at current badge level instead of at level 100 | |
42 | push bc | |
43 | push af | |
44 | push de | |
45 | push hl | |
46 | call 3FDD ; getBadgeLevel | |
47 | pop hl | |
48 | pop de | |
49 | pop af | |
50 | ld a,(hl) | |
51 | cp b ; compare to b = badgeLevel instead of to 100 | |
52 | pop bc | |
53 | jp 6F27 | |
54 | ||
55 | calcExpCap: ; 01:7600 | |
56 | ; calculate maximum experience allowed given (hl)=species as input | |
57 | ; outputs hQuotient = maximum experience allowed | |
58 | ld a,(CF60) ; CurSpecies | |
59 | push af ; save (CF60) to restore CurSpecies later | |
60 | ld a,(hl) | |
61 | ld (CF60),a ; load species of Pokemon we're dealing with into CurSpecies | |
62 | call GetBaseData ; load base data of Pokemon identified by CurSpecies into RAM, including growth rate | |
63 | ; Growth Rates: | |
64 | ; 0: exp = level^3 | |
65 | ; 4: exp = level^3 * 4 / 5 (fast) | |
66 | ; 5: exp = level^3 * 5 / 4 (slow) | |
67 | call 3FDD ; getBadgeLevel | |
68 | xor a | |
69 | ld (FF00+B4),a ; hMultiplicand | |
70 | ld (FF00+B5),a ; hMultiplicand | |
71 | ld a,b ; badgeLevel | |
72 | ld (FF00+B6),a ; hMultiplicand | |
73 | ld (FF00+B7),a ; hMultiplier | |
74 | push af | |
75 | call Multiply ; 3119 | |
76 | pop af | |
77 | ld (FF00+B7),a | |
78 | call Multiply ; we now have badgeLevel^3 at FFB3-FFB6, but FFB3 is never higher than 00 | |
79 | ld a,(D24C) ; BaseGrowthRate | |
80 | and a | |
81 | jr z,finish ; if growth rate is 0 then exp = level^3 | |
82 | cp 5 | |
83 | jr z,slowExpGroup | |
84 | fastExpGroup: ; multiply by 4 and divide by 5 | |
85 | ld a,4 | |
86 | ld (FF00+B7),a | |
87 | call Multiply ; again, result is at FFB3-FFB6 | |
88 | ld a,5 | |
89 | ld b,4 ; dividend is 4 bytes long (or 3) | |
90 | ld (FF00+B7),a ; hDivisor | |
91 | call Divide ; hDividend is FFB3-FFB6 | |
92 | jr, finish | |
93 | slowExpGroup: ; multiply by 5 and divide by 4 | |
94 | ld a,5 | |
95 | ld (FF00+B7),a | |
96 | call Multiply ; again, result is at FFB3-FFB6 | |
97 | ld a,4 | |
98 | ld b,4 ; dividend is 4 bytes long (or 3) | |
99 | ld (FF00+B7),a ; hDivisor | |
100 | call Divide ; hDividend is FFB3-FFB6 | |
101 | finish: | |
102 | pop af ; restore CurSpecies | |
103 | ld (CF60),a ; CurSpecies | |
104 | call GetBaseData ; restore base data of original Pokemon | |
105 | ret | |
106 | ||
107 | DayCareMan: | |
108 | ;(...) | |
109 | jr z,72A4 | |
110 | jp dcmpatch ; jump from 7289 | |
111 | nop | |
112 | nop | |
113 | nop | |
114 | nop | |
115 | ld hl,DF16 | |
116 | ;(...) | |
117 | ||
118 | dcmpatch: ; 01:7500 | |
119 | ; cap at current badge level instead of at level 100 | |
120 | push bc | |
121 | push af | |
122 | push de | |
123 | push hl | |
124 | ld hl,DF0C ; species | |
125 | call calcExpCap ; output hQuotient = maximum experience allowed, given (hl)=species as input | |
126 | ld a,(FF00+B6) ; cap LSB | |
127 | ld hl,DF16 | |
128 | ld b,(hl) ; current exp LSB | |
129 | cp b | |
130 | jr z,checkMiddleByte | |
131 | pop hl | |
132 | pop de | |
133 | pop af | |
134 | pop bc | |
135 | jp 728E ; if they are not equal, cap hasn't been reached | |
136 | checkMiddleByte: | |
137 | ld a,(FF00+B5) | |
138 | dec hl | |
139 | ld b,(hl) | |
140 | cp b | |
141 | jr z,checkMSB | |
142 | pop hl | |
143 | pop de | |
144 | pop af | |
145 | pop bc | |
146 | jp 728E ; if they are not equal, cap hasn't been reached | |
147 | ld a,(FF00+B4) | |
148 | dec hl | |
149 | ld b,(hl) | |
150 | cp b | |
151 | jr z,capReached ; if every byte is equal, cap has been reached, so stop experience growth | |
152 | pop hl | |
153 | pop de | |
154 | pop af | |
155 | pop bc | |
156 | jp 728E ; if they are not equal, cap hasn't been reached | |
157 | capReached: | |
158 | pop hl | |
159 | pop de | |
160 | pop af | |
161 | pop bc | |
162 | jp 72A4 | |
163 | ||
164 | DayCareLady: | |
165 | ;(...) | |
166 | jr z,72C6 | |
167 | jp dclpatch ; jump from 72ab | |
168 | nop | |
169 | nop | |
170 | nop | |
171 | nop | |
172 | ld hl,DF4F | |
173 | ;(...) | |
174 | ||
175 | dclpatch: 01:7580 | |
176 | ; cap at current badge level instead of at level 100 | |
177 | push bc | |
178 | push af | |
179 | push de | |
180 | push hl | |
181 | ld hl,DF45 ; species | |
182 | call calcExpCap ; output hQuotient = maximum experience allowed, given (hl)=species as input | |
183 | ld a,(FF00+B6) ; cap LSB | |
184 | ld hl,DF4F | |
185 | ld b,(hl) ; current exp LSB | |
186 | cp b | |
187 | jr z,checkMiddleByte | |
188 | pop hl | |
189 | pop de | |
190 | pop af | |
191 | pop bc | |
192 | jp 72B0 ; if they are not equal, cap hasn't been reached | |
193 | checkMiddleByte: | |
194 | ld a,(FF00+B5) | |
195 | dec hl | |
196 | ld b,(hl) | |
197 | cp b | |
198 | jr z,checkMSB | |
199 | pop hl | |
200 | pop de | |
201 | pop af | |
202 | pop bc | |
203 | jp 72B0 ; if they are not equal, cap hasn't been reached | |
204 | ld a,(FF00+B4) | |
205 | dec hl | |
206 | ld b,(hl) | |
207 | cp b | |
208 | jr z,capReached ; if every byte is equal, cap has been reached, so stop experience growth | |
209 | pop hl | |
210 | pop de | |
211 | pop af | |
212 | pop bc | |
213 | jp 72B0 ; if they are not equal, cap hasn't been reached | |
214 | capReached: | |
215 | pop hl | |
216 | pop de | |
217 | pop af | |
218 | pop bc | |
219 | jp 72C6 | |
220 | ||
221 | - | getExpCapInBattle: ; get maximum experience allowed based on current badge level and Pokemon's growth rate |
221 | + | getExpCapInBattle: ; 01:7680 |
222 | ; get maximum experience allowed based on current badge level and Pokemon's growth rate | |
223 | ; outputs hQuotient = maximum experience allowed | |
224 | push af | |
225 | push bc | |
226 | push de | |
227 | push hl | |
228 | - | ld hl,(DCAF); PartyMon1Species - (PartyMonNSpecies - PartyMonN-1Species) = PartyMon1Species - 30 |
228 | + | |
229 | ld hl,DCAF; PartyMon1Species - (PartyMonNSpecies - PartyMonN-1Species) = PartyMon1Species - 30 | |
230 | ld bc,0030 ; PartyMonNSpecies - PartyMonN-1Species | |
231 | inc a | |
232 | loop: ; make hl point to species of current party Pokemon | |
233 | add hl,bc | |
234 | dec a | |
235 | jr nz,loop | |
236 | call calcExpCap ; 01:7600 | |
237 | ; calculate maximum experience allowed given (hl)=species as input | |
238 | pop hl | |
239 | pop de | |
240 | pop bc | |
241 | pop af | |
242 | ret | |
243 | - | getFinalExperienceInBattle: ; calculate the experience that the Pokemon is going to receive |
243 | + | |
244 | getFinalExperienceInBattle: ; 0F:7f50 | |
245 | ; calculate the experience that the Pokemon is going to receive | |
246 | push af | |
247 | push bc | |
248 | push de | |
249 | - | ld hl,(DCB9); PartyMon1Exp - (PartyMonNExp - PartyMonN-1Exp) = PartyMon1Exp - 30 |
249 | + | |
250 | ld a,(D109) ; CurPartyMon | |
251 | ld hl,DCB9; PartyMon1Exp - (PartyMonNExp - PartyMonN-1Exp) = PartyMon1Exp - 30 | |
252 | ld bc,0030 ; PartyMonNExp - PartyMonN-1Exp | |
253 | inc a | |
254 | loop: ; make hl point to experience LSB of current party Pokemon | |
255 | add hl,bc | |
256 | dec a | |
257 | jr nz,loop | |
258 | ld e,(hl) | |
259 | dec hl | |
260 | ld d,(hl) | |
261 | - | callba getExpCapInBattle ; hQuotient = maximum experience allowed |
261 | + | |
262 | ld h,(hl) ; hde = Pokemon's current experience | |
263 | push hl | |
264 | ; ld hl,7680 ; ld a,01 ; rst 08 | |
265 | callba getExpCapInBattle ; 01:7680 | |
266 | ; outputs hQuotient = maximum experience allowed | |
267 | pop hl | |
268 | ld a,(FF00+B6) | |
269 | sub e | |
270 | ld (FF00+B6),a | |
271 | ld a,(FF00+B5) | |
272 | sbc d | |
273 | ld (FF00+B5),a | |
274 | ld a,(FF00+B4) | |
275 | sbc h | |
276 | ld (FF00+B4),a ; Cap - Current = Maximum experience the Pokemon can gain not to surpass the cap | |
277 | ld a,(FF00+B5) | |
278 | ld hl,D086 | |
279 | ld b,(hl) ; exp about to gain MSB | |
280 | cp b | |
281 | jr z, checkLSB | |
282 | jr nc, finish ; exp about to gain is not higher than cap | |
283 | ld (D086),a ; else, overwrite exp about to win with cap | |
284 | ld a,(FF00+B6) | |
285 | ld (D087),a | |
286 | checkLSB: | |
287 | ld a,(FF00+B6) | |
288 | ld hl,D087 | |
289 | ld b,(hl) ; exp about to gain LSB | |
290 | cp b | |
291 | jr nc, finish ; exp about to gain is not higher than cap | |
292 | ld (D087),a ; else, overwrite exp about to win with cap | |
293 | finish: | |
294 | pop hl | |
295 | pop de | |
296 | pop bc | |
297 | pop af | |
298 | ld a,(d109) ; original 0F:6f02 | |
299 | jp 6F05 | |
300 | ||
301 | exppatch: | |
302 | ;(...) | |
303 | ; at this point D086-D087 contains experience the Pokemon is about to gain | |
304 | jp getFinalExperienceInBattle ; jump from 0F:6f02 | |
305 | ;(...) |