summaryrefslogtreecommitdiff
path: root/engine/events/poke_seer.asm
blob: 9ad8d71dd5e001b984a29a354857a857d7c4cb84 (plain)
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
	const_def
	const SEER_INTRO
	const SEER_CANT_TELL
	const SEER_MET_AT
	const SEER_TIME_LEVEL
	const SEER_TRADED
	const SEER_CANCEL
	const SEER_EGG
	const SEER_LEVEL_ONLY

	const_def
	const SEERACTION_MET
	const SEERACTION_TRADED
	const SEERACTION_CANT_TELL_1
	const SEERACTION_CANT_TELL_2
	const SEERACTION_LEVEL_ONLY

PokeSeer:
	ld a, SEER_INTRO
	call PrintSeerText
	call JoyWaitAorB

	ld b, PARTY_LENGTH
	farcall SelectMonFromParty
	jr c, .cancel

	ld a, [wCurPartySpecies]
	cp EGG
	jr z, .egg

	call IsAPokemon
	jr c, .no_mon

	call ReadCaughtData
	call SeerAction
	ret

.cancel
	ld a, SEER_CANCEL
	call PrintSeerText
	ret

.no_mon
	ret

.egg
	ld a, SEER_EGG
	call PrintSeerText
	ret

SeerAction:
	ld a, [wSeerAction]
	ld hl, SeerActions
	rst JumpTable
	ret

SeerActions:
	dw SeerAction0
	dw SeerAction1
	dw SeerAction2
	dw SeerAction3
	dw SeerAction4

SeerAction0:
	ld a, SEER_MET_AT
	call PrintSeerText
	ld a, SEER_TIME_LEVEL
	call PrintSeerText
	call SeerAdvice
	ret

SeerAction1:
	call GetCaughtOT
	ld a, SEER_TRADED
	call PrintSeerText
	ld a, SEER_TIME_LEVEL
	call PrintSeerText
	call SeerAdvice
	ret

SeerAction2:
	ld a, SEER_CANT_TELL
	call PrintSeerText
	ret

SeerAction3:
	ld a, SEER_CANT_TELL
	call PrintSeerText
	ret

SeerAction4:
	ld a, SEER_LEVEL_ONLY
	call PrintSeerText
	call SeerAdvice
	ret

ReadCaughtData:
	ld a, MON_CAUGHTDATA
	call GetPartyParamLocation
	ld a, [hli]
	ld [wSeerCaughtData], a
	ld a, [hld]
	ld [wSeerCaughtGender], a
	or [hl]
	jr z, .error

	ld a, SEERACTION_TRADED
	ld [wSeerAction], a

	ld a, MON_ID
	call GetPartyParamLocation
	ld a, [wPlayerID]
	cp [hl]
	jr nz, .traded

	inc hl
	ld a, [wPlayerID + 1]
	; cp [hl]
	jr nz, .traded

	ld a, SEERACTION_MET
	ld [wSeerAction], a

.traded
	call GetCaughtLevel
	call GetCaughtOT
	call GetCaughtName
	call GetCaughtTime
	call GetCaughtLocation
	and a
	ret

.error
	ld a, SEERACTION_CANT_TELL_1
	ld [wSeerAction], a
	ret

GetCaughtName:
	ld a, [wCurPartyMon]
	ld hl, wPartyMonNicknames
	ld bc, MON_NAME_LENGTH
	call AddNTimes
	ld de, wSeerNickname
	ld bc, MON_NAME_LENGTH
	call CopyBytes
	ret

GetCaughtLevel:
	ld a, "@"
	ld hl, wSeerCaughtLevelString
	ld bc, 4
	call ByteFill

	; caught level
	; Limited to between 1 and 63 since it's a 6-bit quantity.
	ld a, [wSeerCaughtData]
	and CAUGHT_LEVEL_MASK
	jr z, .unknown
	cp CAUGHT_EGG_LEVEL ; egg marker value
	jr nz, .print
	ld a, EGG_LEVEL ; egg hatch level

.print
	ld [wSeerCaughtLevel], a
	ld hl, wSeerCaughtLevelString
	ld de, wSeerCaughtLevel
	lb bc, PRINTNUM_LEFTALIGN | 1, 3
	call PrintNum
	ret

.unknown
	ld de, wSeerCaughtLevelString
	ld hl, .unknown_level
	ld bc, 4
	call CopyBytes
	ret

.unknown_level
	db "???@"

GetCaughtTime:
	ld a, [wSeerCaughtData]
	and CAUGHT_TIME_MASK
	jr z, .none

	rlca
	rlca
	dec a
	ld hl, .times
	call GetNthString
	ld d, h
	ld e, l
	ld hl, wSeerTimeOfDay
	call CopyName2
	and a
	ret

.none
	ld de, wSeerTimeOfDay
	call UnknownCaughtData
	ret

.times
	db "Morning@"
	db "Day@"
	db "Night@"

UnknownCaughtData:
	ld hl, .unknown
	ld bc, NAME_LENGTH
	call CopyBytes
	ret

.unknown
	db "Unknown@"

GetCaughtLocation:
	ld a, [wSeerCaughtGender]
	and CAUGHT_LOCATION_MASK
	jr z, .Unknown
	cp LANDMARK_EVENT
	jr z, .event
	cp LANDMARK_GIFT
	jr z, .fail
	ld e, a
	farcall GetLandmarkName
	ld hl, wStringBuffer1
	ld de, wSeerCaughtLocation
	ld bc, 17
	call CopyBytes
	and a
	ret

.Unknown:
	ld de, wSeerCaughtLocation
	jp UnknownCaughtData

.event
	ld a, SEERACTION_LEVEL_ONLY
	ld [wSeerAction], a
	scf
	ret

.fail
	ld a, SEERACTION_CANT_TELL_2
	ld [wSeerAction], a
	scf
	ret

GetCaughtOT:
	ld a, [wCurPartyMon]
	ld hl, wPartyMonOTs
	ld bc, NAME_LENGTH
	call AddNTimes
	ld de, wSeerOT
	ld bc, NAME_LENGTH
	call CopyBytes

; this routine is useless in Western localizations
	ld hl, .male
	ld a, [wSeerCaughtGender]
	bit 7, a
	jr z, .got_grammar
	ld hl, .female

.got_grammar
	ld de, wSeerOTGrammar
	ld a, "@"
	ld [de], a
	ret

.male
	db "@"
.female
	db "@"

PrintSeerText:
	ld e, a
	ld d, 0
	ld hl, SeerTexts
	add hl, de
	add hl, de
	ld a, [hli]
	ld h, [hl]
	ld l, a
	call PrintText
	ret

SeerTexts:
	dw SeerSeeAllText
	dw SeerCantTellAThingText
	dw SeerNameLocationText
	dw SeerTimeLevelText
	dw SeerTradeText
	dw SeerDoNothingText
	dw SeerEggText
	dw SeerNoLocationText

SeerSeeAllText:
	text_far _SeerSeeAllText
	text_end

SeerCantTellAThingText:
	text_far _SeerCantTellAThingText
	text_end

SeerNameLocationText:
	text_far _SeerNameLocationText
	text_end

SeerTimeLevelText:
	text_far _SeerTimeLevelText
	text_end

SeerTradeText:
	text_far _SeerTradeText
	text_end

SeerNoLocationText:
	text_far _SeerNoLocationText
	text_end

SeerEggText:
	text_far _SeerEggText
	text_end

SeerDoNothingText:
	text_far _SeerDoNothingText
	text_end

SeerAdvice:
	ld a, MON_LEVEL
	call GetPartyParamLocation
	ld a, [wSeerCaughtLevel]
	ld c, a
	ld a, [hl]
	sub c
	ld c, a

	ld hl, SeerAdviceTexts
	ld de, 3
.next
	cp [hl]
	jr c, .print
	jr z, .print
	add hl, de
	jr .next

.print
	inc hl
	ld a, [hli]
	ld h, [hl]
	ld l, a
	call PrintText
	ret

SeerAdviceTexts:
; level, text
	dbw 9,   SeerMoreCareText
	dbw 29,  SeerMoreConfidentText
	dbw 59,  SeerMuchStrengthText
	dbw 89,  SeerMightyText
	dbw 100, SeerImpressedText
	dbw 255, SeerMoreCareText

SeerMoreCareText:
	text_far _SeerMoreCareText
	text_end

SeerMoreConfidentText:
	text_far _SeerMoreConfidentText
	text_end

SeerMuchStrengthText:
	text_far _SeerMuchStrengthText
	text_end

SeerMightyText:
	text_far _SeerMightyText
	text_end

SeerImpressedText:
	text_far _SeerImpressedText
	text_end

GetCaughtGender:
	ld hl, MON_CAUGHTGENDER
	add hl, bc

	ld a, [hl]
	and CAUGHT_LOCATION_MASK
	jr z, .genderless
	cp LANDMARK_EVENT
	jr z, .genderless

	ld a, [hl]
	and CAUGHT_GENDER_MASK
	jr nz, .male
	ld c, CAUGHT_BY_GIRL
	ret

.male
	ld c, CAUGHT_BY_BOY
	ret

.genderless
	ld c, CAUGHT_BY_UNKNOWN
	ret