Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pret
GitHub Repository: pret/pokered
Path: blob/master/engine/pokemon/add_mon.asm
1271 views
1
_AddPartyMon::
2
; Adds a new mon to the player's or enemy's party.
3
; [wMonDataLocation] is used in an unusual way in this function.
4
; If the lower nybble is 0, the mon is added to the player's party, else the enemy's.
5
; If the entire value is 0, then the player is allowed to name the mon.
6
ld de, wPartyCount
7
ld a, [wMonDataLocation]
8
and $f
9
jr z, .next
10
ld de, wEnemyPartyCount
11
.next
12
ld a, [de]
13
inc a
14
cp PARTY_LENGTH + 1
15
ret nc ; return if the party is already full
16
ld [de], a
17
ld a, [de]
18
ldh [hNewPartyLength], a
19
add e
20
ld e, a
21
jr nc, .noCarry
22
inc d
23
.noCarry
24
ld a, [wCurPartySpecies]
25
ld [de], a ; write species of new mon in party list
26
inc de
27
ld a, $ff ; terminator
28
ld [de], a
29
ld hl, wPartyMonOT
30
ld a, [wMonDataLocation]
31
and $f
32
jr z, .next2
33
ld hl, wEnemyMonOT
34
.next2
35
ldh a, [hNewPartyLength]
36
dec a
37
call SkipFixedLengthTextEntries
38
ld d, h
39
ld e, l
40
ld hl, wPlayerName
41
ld bc, NAME_LENGTH
42
call CopyData
43
ld a, [wMonDataLocation]
44
and a
45
jr nz, .skipNaming
46
ld hl, wPartyMonNicks
47
ldh a, [hNewPartyLength]
48
dec a
49
call SkipFixedLengthTextEntries
50
ld a, NAME_MON_SCREEN
51
ld [wNamingScreenType], a
52
predef AskName
53
.skipNaming
54
ld hl, wPartyMons
55
ld a, [wMonDataLocation]
56
and $f
57
jr z, .next3
58
ld hl, wEnemyMons
59
.next3
60
ldh a, [hNewPartyLength]
61
dec a
62
ld bc, wPartyMon2 - wPartyMon1
63
call AddNTimes
64
ld e, l
65
ld d, h
66
push hl
67
ld a, [wCurPartySpecies]
68
ld [wCurSpecies], a
69
call GetMonHeader
70
ld hl, wMonHeader
71
ld a, [hli]
72
ld [de], a ; species
73
inc de
74
pop hl
75
push hl
76
ld a, [wMonDataLocation]
77
and $f
78
ld a, ATKDEFDV_TRAINER ; set enemy trainer mon IVs to fixed average values
79
ld b, SPDSPCDV_TRAINER
80
jr nz, .next4
81
82
; If the mon is being added to the player's party, update the pokedex.
83
ld a, [wCurPartySpecies]
84
ld [wPokedexNum], a
85
push de
86
predef IndexToPokedex
87
pop de
88
ld a, [wPokedexNum]
89
dec a
90
ld c, a
91
ld b, FLAG_TEST
92
ld hl, wPokedexOwned
93
call FlagAction
94
ld a, c ; whether the mon was already flagged as owned
95
ld [wUnusedAlreadyOwnedFlag], a
96
ld a, [wPokedexNum]
97
dec a
98
ld c, a
99
ld b, FLAG_SET
100
push bc
101
call FlagAction
102
pop bc
103
ld hl, wPokedexSeen
104
call FlagAction
105
106
pop hl
107
push hl
108
109
ld a, [wIsInBattle]
110
and a ; is this a wild mon caught in battle?
111
jr nz, .copyEnemyMonData
112
113
; Not wild.
114
call Random ; generate random IVs
115
ld b, a
116
call Random
117
118
.next4
119
push bc
120
ld bc, wPartyMon1DVs - wPartyMon1
121
add hl, bc
122
pop bc
123
ld [hli], a
124
ld [hl], b ; write IVs
125
ld bc, (wPartyMon1HPExp - 1) - (wPartyMon1DVs + 1)
126
add hl, bc
127
ld a, 1
128
ld c, a
129
xor a
130
ld b, a
131
call CalcStat ; calc HP stat (set cur Hp to max HP)
132
ldh a, [hMultiplicand+1]
133
ld [de], a
134
inc de
135
ldh a, [hMultiplicand+2]
136
ld [de], a
137
inc de
138
xor a
139
ld [de], a ; box level
140
inc de
141
ld [de], a ; status ailments
142
inc de
143
jr .copyMonTypesAndMoves
144
.copyEnemyMonData
145
ld bc, wEnemyMon1DVs - wEnemyMon1
146
add hl, bc
147
ld a, [wEnemyMonDVs] ; copy IVs from cur enemy mon
148
ld [hli], a
149
ld a, [wEnemyMonDVs + 1]
150
ld [hl], a
151
ld a, [wEnemyMonHP] ; copy HP from cur enemy mon
152
ld [de], a
153
inc de
154
ld a, [wEnemyMonHP+1]
155
ld [de], a
156
inc de
157
xor a
158
ld [de], a ; box level
159
inc de
160
ld a, [wEnemyMonStatus] ; copy status ailments from cur enemy mon
161
ld [de], a
162
inc de
163
.copyMonTypesAndMoves
164
ld hl, wMonHTypes
165
ld a, [hli] ; type 1
166
ld [de], a
167
inc de
168
ld a, [hli] ; type 2
169
ld [de], a
170
inc de
171
ld a, [hli] ; catch rate (held item in gen 2)
172
ld [de], a
173
ld hl, wMonHMoves
174
ld a, [hli]
175
inc de
176
push de
177
ld [de], a
178
ld a, [hli]
179
inc de
180
ld [de], a
181
ld a, [hli]
182
inc de
183
ld [de], a
184
ld a, [hli]
185
inc de
186
ld [de], a
187
push de
188
dec de
189
dec de
190
dec de
191
xor a
192
ld [wLearningMovesFromDayCare], a
193
predef WriteMonMoves
194
pop de
195
ld a, [wPlayerID] ; set trainer ID to player ID
196
inc de
197
ld [de], a
198
ld a, [wPlayerID + 1]
199
inc de
200
ld [de], a
201
push de
202
ld a, [wCurEnemyLevel]
203
ld d, a
204
callfar CalcExperience
205
pop de
206
inc de
207
ldh a, [hExperience] ; write experience
208
ld [de], a
209
inc de
210
ldh a, [hExperience + 1]
211
ld [de], a
212
inc de
213
ldh a, [hExperience + 2]
214
ld [de], a
215
xor a
216
ld b, NUM_STATS * 2
217
.writeEVsLoop ; set all EVs to 0
218
inc de
219
ld [de], a
220
dec b
221
jr nz, .writeEVsLoop
222
inc de
223
inc de
224
pop hl
225
call AddPartyMon_WriteMovePP
226
inc de
227
ld a, [wCurEnemyLevel]
228
ld [de], a
229
inc de
230
ld a, [wIsInBattle]
231
dec a
232
jr nz, .calcFreshStats
233
ld hl, wEnemyMonMaxHP
234
ld bc, $a
235
call CopyData ; copy stats of cur enemy mon
236
pop hl
237
jr .done
238
.calcFreshStats
239
pop hl
240
ld bc, wPartyMon1HPExp - 1 - wPartyMon1
241
add hl, bc
242
ld b, $0
243
call CalcStats ; calculate fresh set of stats
244
.done
245
scf
246
ret
247
248
LoadMovePPs:
249
call GetPredefRegisters
250
; fallthrough
251
AddPartyMon_WriteMovePP:
252
ld b, NUM_MOVES
253
.pploop
254
ld a, [hli] ; read move ID
255
and a
256
jr z, .empty
257
dec a
258
push hl
259
push de
260
push bc
261
ld hl, Moves
262
ld bc, MOVE_LENGTH
263
call AddNTimes
264
ld de, wMoveData
265
ld a, BANK(Moves)
266
call FarCopyData
267
pop bc
268
pop de
269
pop hl
270
ld a, [wMoveData + MOVE_PP]
271
.empty
272
inc de
273
ld [de], a
274
dec b
275
jr nz, .pploop ; there are still moves to read
276
ret
277
278
; adds enemy mon [wCurPartySpecies] (at position [wWhichPokemon] in enemy list) to own party
279
; used in the cable club trade center
280
_AddEnemyMonToPlayerParty::
281
ld hl, wPartyCount
282
ld a, [hl]
283
cp PARTY_LENGTH
284
scf
285
ret z ; party full, return failure
286
inc a
287
ld [hl], a ; add 1 to party members
288
ld c, a
289
ld b, $0
290
add hl, bc
291
ld a, [wCurPartySpecies]
292
ld [hli], a ; add mon as last list entry
293
ld [hl], $ff ; write new sentinel
294
ld hl, wPartyMons
295
ld a, [wPartyCount]
296
dec a
297
ld bc, wPartyMon2 - wPartyMon1
298
call AddNTimes
299
ld e, l
300
ld d, h
301
ld hl, wLoadedMon
302
call CopyData ; write new mon's data (from wLoadedMon)
303
ld hl, wPartyMonOT
304
ld a, [wPartyCount]
305
dec a
306
call SkipFixedLengthTextEntries
307
ld d, h
308
ld e, l
309
ld hl, wEnemyMonOT
310
ld a, [wWhichPokemon]
311
call SkipFixedLengthTextEntries
312
ld bc, NAME_LENGTH
313
call CopyData ; write new mon's OT name (from an enemy mon)
314
ld hl, wPartyMonNicks
315
ld a, [wPartyCount]
316
dec a
317
call SkipFixedLengthTextEntries
318
ld d, h
319
ld e, l
320
ld hl, wEnemyMonNicks
321
ld a, [wWhichPokemon]
322
call SkipFixedLengthTextEntries
323
ld bc, NAME_LENGTH
324
call CopyData ; write new mon's nickname (from an enemy mon)
325
ld a, [wCurPartySpecies]
326
ld [wPokedexNum], a
327
predef IndexToPokedex
328
ld a, [wPokedexNum]
329
dec a
330
ld c, a
331
ld b, FLAG_SET
332
ld hl, wPokedexOwned
333
push bc
334
call FlagAction ; add to owned pokemon
335
pop bc
336
ld hl, wPokedexSeen
337
call FlagAction ; add to seen pokemon
338
and a
339
ret ; return success
340
341
_MoveMon::
342
ld a, [wMoveMonType]
343
and a ; BOX_TO_PARTY
344
jr z, .checkPartyMonSlots
345
cp DAYCARE_TO_PARTY
346
jr z, .checkPartyMonSlots
347
cp PARTY_TO_DAYCARE
348
ld hl, wDayCareMon
349
jr z, .findMonDataSrc
350
; else it's PARTY_TO_BOX
351
ld hl, wBoxCount
352
ld a, [hl]
353
cp MONS_PER_BOX
354
jr nz, .partyOrBoxNotFull
355
jr .boxFull
356
.checkPartyMonSlots
357
ld hl, wPartyCount
358
ld a, [hl]
359
cp PARTY_LENGTH
360
jr nz, .partyOrBoxNotFull
361
.boxFull
362
scf
363
ret
364
.partyOrBoxNotFull
365
inc a
366
ld [hl], a ; increment number of mons in party/box
367
ld c, a
368
ld b, 0
369
add hl, bc
370
ld a, [wMoveMonType]
371
cp DAYCARE_TO_PARTY
372
ld a, [wDayCareMon]
373
jr z, .copySpecies
374
ld a, [wCurPartySpecies]
375
.copySpecies
376
ld [hli], a ; write new mon ID
377
ld [hl], $ff ; write new sentinel
378
.findMonDataDest
379
ld a, [wMoveMonType]
380
dec a
381
ld hl, wPartyMons
382
ld bc, wPartyMon2 - wPartyMon1 ; $2c
383
ld a, [wPartyCount]
384
jr nz, .addMonOffset
385
; if it's PARTY_TO_BOX
386
ld hl, wBoxMons
387
ld bc, wBoxMon2 - wBoxMon1 ; $21
388
ld a, [wBoxCount]
389
.addMonOffset
390
dec a
391
call AddNTimes
392
.findMonDataSrc
393
push hl
394
ld e, l
395
ld d, h
396
ld a, [wMoveMonType]
397
and a
398
ld hl, wBoxMons
399
ld bc, wBoxMon2 - wBoxMon1 ; $21
400
jr z, .addMonOffset2
401
cp DAYCARE_TO_PARTY
402
ld hl, wDayCareMon
403
jr z, .copyMonData
404
ld hl, wPartyMons
405
ld bc, wPartyMon2 - wPartyMon1 ; $2c
406
.addMonOffset2
407
ld a, [wWhichPokemon]
408
call AddNTimes
409
.copyMonData
410
push hl
411
push de
412
ld bc, wBoxMon2 - wBoxMon1
413
call CopyData
414
pop de
415
pop hl
416
ld a, [wMoveMonType]
417
and a ; BOX_TO_PARTY
418
jr z, .findOTdest
419
cp DAYCARE_TO_PARTY
420
jr z, .findOTdest
421
ld bc, wBoxMon2 - wBoxMon1
422
add hl, bc
423
ld a, [hl] ; hl = Level
424
inc de
425
inc de
426
inc de
427
ld [de], a ; de = BoxLevel
428
.findOTdest
429
ld a, [wMoveMonType]
430
cp PARTY_TO_DAYCARE
431
ld de, wDayCareMonOT
432
jr z, .findOTsrc
433
dec a
434
ld hl, wPartyMonOT
435
ld a, [wPartyCount]
436
jr nz, .addOToffset
437
ld hl, wBoxMonOT
438
ld a, [wBoxCount]
439
.addOToffset
440
dec a
441
call SkipFixedLengthTextEntries
442
ld d, h
443
ld e, l
444
.findOTsrc
445
ld hl, wBoxMonOT
446
ld a, [wMoveMonType]
447
and a
448
jr z, .addOToffset2
449
ld hl, wDayCareMonOT
450
cp DAYCARE_TO_PARTY
451
jr z, .copyOT
452
ld hl, wPartyMonOT
453
.addOToffset2
454
ld a, [wWhichPokemon]
455
call SkipFixedLengthTextEntries
456
.copyOT
457
ld bc, NAME_LENGTH
458
call CopyData
459
ld a, [wMoveMonType]
460
.findNickDest
461
cp PARTY_TO_DAYCARE
462
ld de, wDayCareMonName
463
jr z, .findNickSrc
464
dec a
465
ld hl, wPartyMonNicks
466
ld a, [wPartyCount]
467
jr nz, .addNickOffset
468
ld hl, wBoxMonNicks
469
ld a, [wBoxCount]
470
.addNickOffset
471
dec a
472
call SkipFixedLengthTextEntries
473
ld d, h
474
ld e, l
475
.findNickSrc
476
ld hl, wBoxMonNicks
477
ld a, [wMoveMonType]
478
and a
479
jr z, .addNickOffset2
480
ld hl, wDayCareMonName
481
cp DAYCARE_TO_PARTY
482
jr z, .copyNick
483
ld hl, wPartyMonNicks
484
.addNickOffset2
485
ld a, [wWhichPokemon]
486
call SkipFixedLengthTextEntries
487
.copyNick
488
ld bc, NAME_LENGTH
489
call CopyData
490
pop hl
491
ld a, [wMoveMonType]
492
cp PARTY_TO_BOX
493
jr z, .done
494
cp PARTY_TO_DAYCARE
495
jr z, .done
496
push hl
497
srl a
498
add $2
499
ld [wMonDataLocation], a
500
call LoadMonData
501
farcall CalcLevelFromExperience
502
ld a, d
503
ld [wCurEnemyLevel], a
504
pop hl
505
ld bc, wBoxMon2 - wBoxMon1
506
add hl, bc
507
ld [hli], a
508
ld d, h
509
ld e, l
510
ld bc, -18
511
add hl, bc
512
ld b, $1
513
call CalcStats
514
.done
515
and a
516
ret
517
518