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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
|
IsPlayerTalkingToPikachu::
ld a, [wd436]
and a
ret z
ldh a, [hSpriteIndexOrTextID]
cp $f
ret nz
call InitializePikachuTextID
xor a
ldh [hSpriteIndexOrTextID], a
ld [wd436], a
ret
InitializePikachuTextID::
ld a, TEXT_PIKACHU_ANIM ; display
ldh [hSpriteIndexOrTextID], a
xor a
ld [wPlayerMovingDirection], a
ld a, $1
ld [wAutoTextBoxDrawingControl], a
call DisplayTextID
xor a
ld [wAutoTextBoxDrawingControl], a
ret
DoStarterPikachuEmotions:
ld e, a
ld d, 0
add hl, de
add hl, de
ld e, [hl]
inc hl
ld d, [hl]
.loop
ld a, [de]
inc de
cp $ff
jr z, .done
ld c, a
ld b, 0
ld hl, StarterPikachuEmotionsJumptable
add hl, bc
add hl, bc
ld a, [hli]
ld h, [hl]
ld l, a
call JumpToAddress
jr .loop
.done
ret
StarterPikachuEmotionsJumptable:
dw StarterPikachuEmotionCommand_nop ; 0
dw StarterPikachuEmotionCommand_text ; 1
dw StarterPikachuEmotionCommand_pcm ; 2
dw StarterPikachuEmotionCommand_emote ; 3
dw StarterPikachuEmotionCommand_movement ; 4
dw StarterPikachuEmotionCommand_pikapic ; 5
dw StarterPikachuEmotionCommand_subcmd ; 6
dw StarterPikachuEmotionCommand_delay ; 7
dw StarterPikachuEmotionCommand_nop2 ; 8
dw StarterPikachuEmotionCommand_9 ; 9
dw StarterPikachuEmotionCommand_nop3 ; a
StarterPikachuEmotionCommand_nop:
StarterPikachuEmotionCommand_nop3:
ret
StarterPikachuEmotionCommand_text:
ld a, [de]
ld l, a
inc de
ld a, [de]
ld h, a
inc de
push de
call PrintText
pop de
ret
StarterPikachuEmotionCommand_pcm:
ld a, [de]
inc de
push de
ld e, a
nop
call PlayPikachuSoundClip_
pop de
ret
PlayPikachuSoundClip_:
cp $ff
ret z
callfar PlayPikachuSoundClip
ret
StarterPikachuEmotionCommand_emote:
ld a, [wUpdateSpritesEnabled]
push af
ld a, $ff
ld [wUpdateSpritesEnabled], a
ld a, [de]
inc de
push de
call ShowPikachuEmoteBubble
pop de
pop af
ld [wUpdateSpritesEnabled], a
ret
ShowPikachuEmoteBubble:
ld [wWhichEmotionBubble], a
ld a, $f ; Pikachu
ld [wEmotionBubbleSpriteIndex], a
predef EmotionBubble
ret
StarterPikachuEmotionCommand_movement:
ld a, [de]
inc de
ld l, a
ld a, [de]
inc de
ld h, a
push de
ld b, BANK(DoStarterPikachuEmotions)
call ApplyPikachuMovementData_
pop de
ret
StarterPikachuEmotionCommand_delay:
ld a, [de]
inc de
push de
ld c, a
call DelayFrames
pop de
ret
StarterPikachuEmotionCommand_subcmd:
ld a, [de]
inc de
push de
ld e, a
ld d, 0
ld hl, .Subcommands
add hl, de
add hl, de
ld a, [hli]
ld h, [hl]
ld l, a
call JumpToAddress
pop de
ret
.Subcommands:
dw LoadPikachuSpriteIntoVRAM
dw LoadFontTilePatterns
dw Pikachu_LoadCurrentMapViewUpdateSpritesAndDelay3
dw WaitForTextScrollButtonPress
dw PikachuPewterPokecenterCheck
dw PikachuFanClubCheck
dw PikachuBillsHouseCheck
StarterPikachuEmotionCommand_nop2:
IF DEF(_DEBUG)
push hl
ld hl, wd732
bit 1, [hl]
pop hl
ret z
push de
ld d, a
ld a, [wCurMap]
cp REDS_HOUSE_2F
ld a, d
pop de
ret nz
push de
call Pikachu_LoadCurrentMapViewUpdateSpritesAndDelay3
call LoadFontTilePatterns
ld hl, ExpressionText
call PrintText
call Pikachu_LoadCurrentMapViewUpdateSpritesAndDelay3
pop de
ret
ExpressionText:
text_far _ExpressionText
text_end
ELSE
ret
ENDC
StarterPikachuEmotionCommand_9:
push de
call StarterPikachuEmotionCommand_turnawayfromplayer
call UpdateSprites
pop de
ret
StarterPikachuEmotionCommand_turnawayfromplayer:
ld a, [wSpritePlayerStateData1FacingDirection]
xor $4
ld [wSpritePikachuStateData1FacingDirection], a
ret
DeletedFunction_fcffb:
; Inexplicably empty.
REPT 5
nop
ENDR
IF DEF(_DEBUG)
push hl
ld hl, wd732
bit 1, [hl]
pop hl
ret z
push de
ld d, a
ld a, [wCurMap]
cp REDS_HOUSE_2F
ld a, d
pop de
ret nz
ld a, [wExpressionNumber]
inc a
cp (PikachuEmotion33_id - PikachuEmotionTable) / 2
jr c, .valid
ldpikaemotion a, PikachuEmotion1
.valid
ld [wExpressionNumber], a
ret
HallOfFamePCForever:
callfar HallOfFamePC
call WaitForTextScrollButtonPress
jr HallOfFamePCForever
ELSE
ret
ENDC
PlaySpecificPikachuEmotion:
ld a, e
jr load_expression
TalkToPikachu::
call MapSpecificPikachuExpression
jr c, load_expression
call GetPikaPicAnimationScriptIndex
call DeletedFunction_fcffb
load_expression:
ld [wExpressionNumber], a
ld hl, PikachuEmotionTable
call DoStarterPikachuEmotions
ret
pikaemotion_def: MACRO
\1_id:
dw \1
ENDM
PikachuEmotionTable:
pikaemotion_def PikachuEmotion0
pikaemotion_def PikachuEmotion1
pikaemotion_def PikachuEmotion2
pikaemotion_def PikachuEmotion3
pikaemotion_def PikachuEmotion4
pikaemotion_def PikachuEmotion5
pikaemotion_def PikachuEmotion6
pikaemotion_def PikachuEmotion7
pikaemotion_def PikachuEmotion8
pikaemotion_def PikachuEmotion9
pikaemotion_def PikachuEmotion10
pikaemotion_def PikachuEmotion11
pikaemotion_def PikachuEmotion12
pikaemotion_def PikachuEmotion13
pikaemotion_def PikachuEmotion14
pikaemotion_def PikachuEmotion15
pikaemotion_def PikachuEmotion16
pikaemotion_def PikachuEmotion17
pikaemotion_def PikachuEmotion18
pikaemotion_def PikachuEmotion19
pikaemotion_def PikachuEmotion20
pikaemotion_def PikachuEmotion21 ; used a fishing rod
pikaemotion_def PikachuEmotion22
pikaemotion_def PikachuEmotion23
pikaemotion_def PikachuEmotion24
pikaemotion_def PikachuEmotion25
pikaemotion_def PikachuEmotion26 ; wake up pikachu in pewter pokemon center
pikaemotion_def PikachuEmotion27
pikaemotion_def PikachuEmotion28
pikaemotion_def PikachuEmotion29
pikaemotion_def PikachuEmotion30
pikaemotion_def PikachuEmotion31
pikaemotion_def PikachuEmotion32
pikaemotion_def PikachuEmotion33
PikachuEmotion33:
db $ff
MapSpecificPikachuExpression:
ld a, [wCurMap]
cp POKEMON_FAN_CLUB
jr nz, .notFanClub
ld hl, wd492
bit 7, [hl]
ldpikaemotion a, PikachuEmotion29
jr z, .play_emotion
call CheckPikachuFollowingPlayer
ldpikaemotion a, PikachuEmotion30
jr nz, .play_emotion
jr .check_pikachu_status
.notFanClub
ld a, [wCurMap]
cp PEWTER_POKECENTER
jr nz, .notPewterPokecenter
call CheckPikachuFollowingPlayer
ldpikaemotion a, PikachuEmotion26
jr nz, .play_emotion
jr .check_pikachu_status
.notPewterPokecenter
callfar Func_f24ae
ld a, e
cp $ff
jr nz, .play_emotion
jr .check_pikachu_status ; useless
.check_pikachu_status
call IsPlayerPikachuAsleepInParty
ldpikaemotion a, PikachuEmotion11
jr c, .play_emotion
callfar CheckPikachuFaintedOrStatused ; same bank
ldpikaemotion a, PikachuEmotion28
jr c, .play_emotion
ld a, [wCurMap]
cp POKEMON_TOWER_1F
jr c, .notInLavenderTower
cp POKEMON_TOWER_7F + 1
ldpikaemotion a, PikachuEmotion22
jr c, .play_emotion
.notInLavenderTower
ld a, [wd49c]
and a
jr z, .mood_based_emotion
dec a
ld c, a
ld b, $0
ld hl, .Emotions
add hl, bc
ld a, [hl]
jr .play_emotion
.mood_based_emotion
and a
ret
.play_emotion
scf
ret
.Emotions:
dpikaemotion PikachuEmotion18
dpikaemotion PikachuEmotion21
dpikaemotion PikachuEmotion23
dpikaemotion PikachuEmotion24
dpikaemotion PikachuEmotion25
IsPlayerPikachuAsleepInParty:
xor a
ld [wWhichPokemon], a
.loop
ld a, [wWhichPokemon]
ld c, a
ld b, 0
ld hl, wPartySpecies
add hl, bc
ld a, [hl]
cp $ff
jr z, .done
cp STARTER_PIKACHU
jr nz, .curMonNotStarterPikachu
callfar IsThisPartymonStarterPikachu
jr nc, .curMonNotStarterPikachu
ld a, [wWhichPokemon]
ld hl, wPartyMon1Status
ld bc, wPartyMon2 - wPartyMon1
call AddNTimes
ld a, [hl]
and SLP
jr z, .done
jr .curMonSleepingPikachu
.curMonNotStarterPikachu
ld a, [wWhichPokemon]
cp PARTY_LENGTH - 1
jr z, .done
inc a
ld [wWhichPokemon], a
jr .loop
.curMonSleepingPikachu
scf
ret
.done
and a
ret
INCLUDE "data/pikachu/pikachu_emotions.asm"
PikachuWalksToNurseJoy:
ld a, $40
ldh [hPikachuSpriteVRAMOffset], a
call LoadPikachuSpriteIntoVRAM
call .GetMovementData
and a
jr z, .skip
call ApplyPikachuMovementData
.skip
xor a
ldh [hPikachuSpriteVRAMOffset], a
ret
.GetMovementData:
ld a, [wSpritePikachuStateData2MapY]
ld e, a
ld a, [wSpritePikachuStateData2MapX]
ld d, a
ld a, [wYCoord]
add 4
cp e
jr z, .pikachu_at_same_y_as_player
jr nc, .pikachu_above_player
ld hl, .PikaMovementData1
ld a, 1
ret
.pikachu_above_player
xor a
ret
.pikachu_at_same_y_as_player
ld a, [wXCoord]
add 4
cp d
jr c, .pikachu_to_right_of_player
ld hl, .PikaMovementData2
ld a, 2
ret
.pikachu_to_right_of_player
ld hl, .PikaMovementData3
ld a, 3
ret
.PikaMovementData1:
db $00 ; init
db $36 ; look up
db $2b ; walk up left
db $34 ; hop up right
db $3f ; ret
.PikaMovementData2:
db $00 ; init
db $36 ; look up
db $34 ; hop up right
db $3f ; ret
.PikaMovementData3:
db $00 ; init
db $36 ; look up
db $33 ; hop up left
db $3f ; ret
|