Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pret
GitHub Repository: pret/pokered
Path: blob/master/engine/items/town_map.asm
1271 views
1
DEF NOT_VISITED EQU $fe
2
3
DEF BIRD_BASE_TILE EQU $04
4
5
DisplayTownMap:
6
call LoadTownMap
7
ld hl, wUpdateSpritesEnabled
8
ld a, [hl]
9
push af
10
ld [hl], $ff
11
push hl
12
ld a, $1
13
ldh [hJoy7], a
14
ld a, [wCurMap]
15
push af
16
ld b, $0
17
call DrawPlayerOrBirdSprite
18
hlcoord 1, 0
19
ld de, wNameBuffer
20
call PlaceString
21
ld hl, wShadowOAMSprite00
22
ld de, wShadowOAMBackupSprite00
23
ld bc, 4 * 4
24
call CopyData
25
ld hl, vSprites tile BIRD_BASE_TILE
26
ld de, TownMapCursor
27
lb bc, BANK(TownMapCursor), (TownMapCursorEnd - TownMapCursor) / $8
28
call CopyVideoDataDouble
29
xor a
30
ld [wWhichTownMapLocation], a
31
pop af
32
jr .enterLoop
33
34
.townMapLoop
35
hlcoord 0, 0
36
lb bc, 1, 20
37
call ClearScreenArea
38
ld hl, TownMapOrder
39
ld a, [wWhichTownMapLocation]
40
ld c, a
41
ld b, 0
42
add hl, bc
43
ld a, [hl]
44
.enterLoop
45
ld de, wTownMapCoords
46
call LoadTownMapEntry
47
ld a, [de]
48
push hl
49
call TownMapCoordsToOAMCoords
50
ld a, $4
51
ld [wOAMBaseTile], a
52
ld hl, wShadowOAMSprite04
53
call WriteTownMapSpriteOAM ; town map cursor sprite
54
pop hl
55
ld de, wNameBuffer
56
.copyMapName
57
ld a, [hli]
58
ld [de], a
59
inc de
60
cp "@"
61
jr nz, .copyMapName
62
hlcoord 1, 0
63
ld de, wNameBuffer
64
call PlaceString
65
ld hl, wShadowOAMSprite04
66
ld de, wShadowOAMBackupSprite04
67
ld bc, 4 * 4
68
call CopyData
69
.inputLoop
70
call TownMapSpriteBlinkingAnimation
71
call JoypadLowSensitivity
72
ldh a, [hJoy5]
73
ld b, a
74
and PAD_A | PAD_B | PAD_UP | PAD_DOWN
75
jr z, .inputLoop
76
ld a, SFX_TINK
77
call PlaySound
78
bit B_PAD_UP, b
79
jr nz, .pressedUp
80
bit B_PAD_DOWN, b
81
jr nz, .pressedDown
82
xor a
83
ld [wTownMapSpriteBlinkingEnabled], a
84
ldh [hJoy7], a
85
ld [wAnimCounter], a
86
call ExitTownMap
87
pop hl
88
pop af
89
ld [hl], a
90
ret
91
.pressedUp
92
ld a, [wWhichTownMapLocation]
93
inc a
94
cp TownMapOrderEnd - TownMapOrder ; number of list items + 1
95
jr nz, .noOverflow
96
xor a
97
.noOverflow
98
ld [wWhichTownMapLocation], a
99
jp .townMapLoop
100
.pressedDown
101
ld a, [wWhichTownMapLocation]
102
dec a
103
cp -1
104
jr nz, .noUnderflow
105
ld a, TownMapOrderEnd - TownMapOrder - 1 ; number of list items
106
.noUnderflow
107
ld [wWhichTownMapLocation], a
108
jp .townMapLoop
109
110
INCLUDE "data/maps/town_map_order.asm"
111
112
TownMapCursor:
113
INCBIN "gfx/town_map/town_map_cursor.1bpp"
114
TownMapCursorEnd:
115
116
LoadTownMap_Nest:
117
call LoadTownMap
118
ld hl, wUpdateSpritesEnabled
119
ld a, [hl]
120
push af
121
ld [hl], $ff
122
push hl
123
call DisplayWildLocations
124
call GetMonName
125
hlcoord 1, 0
126
call PlaceString
127
ld h, b
128
ld l, c
129
ld de, MonsNestText
130
call PlaceString
131
call WaitForTextScrollButtonPress
132
call ExitTownMap
133
pop hl
134
pop af
135
ld [hl], a
136
ret
137
138
MonsNestText:
139
db "'s NEST@"
140
141
LoadTownMap_Fly::
142
call ClearSprites
143
call LoadTownMap
144
call LoadPlayerSpriteGraphics
145
call LoadFontTilePatterns
146
ld de, BirdSprite
147
ld hl, vSprites tile BIRD_BASE_TILE
148
lb bc, BANK(BirdSprite), 12
149
call CopyVideoData
150
ld de, TownMapUpArrow
151
ld hl, vChars1 tile $6d
152
lb bc, BANK(TownMapUpArrow), (TownMapUpArrowEnd - TownMapUpArrow) / $8
153
call CopyVideoDataDouble
154
call BuildFlyLocationsList
155
ld hl, wUpdateSpritesEnabled
156
ld a, [hl]
157
push af
158
ld [hl], $ff
159
push hl
160
hlcoord 0, 0
161
ld de, ToText
162
call PlaceString
163
ld a, [wCurMap]
164
ld b, $0
165
call DrawPlayerOrBirdSprite
166
ld hl, wFlyLocationsList
167
decoord 18, 0
168
.townMapFlyLoop
169
ld a, " "
170
ld [de], a
171
push hl
172
push hl
173
hlcoord 3, 0
174
lb bc, 1, 15
175
call ClearScreenArea
176
pop hl
177
ld a, [hl]
178
ld b, BIRD_BASE_TILE
179
call DrawPlayerOrBirdSprite
180
hlcoord 3, 0
181
ld de, wNameBuffer
182
call PlaceString
183
ld c, 15
184
call DelayFrames
185
hlcoord 18, 0
186
ld [hl], "▲"
187
hlcoord 19, 0
188
ld [hl], "▼"
189
pop hl
190
.inputLoop
191
push hl
192
call DelayFrame
193
call JoypadLowSensitivity
194
ldh a, [hJoy5]
195
ld b, a
196
pop hl
197
and PAD_A | PAD_B | PAD_UP | PAD_DOWN
198
jr z, .inputLoop
199
bit B_PAD_A, b
200
jr nz, .pressedA
201
ld a, SFX_TINK
202
call PlaySound
203
bit B_PAD_UP, b
204
jr nz, .pressedUp
205
bit B_PAD_DOWN, b
206
jr nz, .pressedDown
207
jr .pressedB
208
.pressedA
209
ld a, SFX_HEAL_AILMENT
210
call PlaySound
211
ld a, [hl]
212
ld [wDestinationMap], a
213
ld hl, wStatusFlags6
214
set BIT_FLY_WARP, [hl]
215
ASSERT wStatusFlags6 + 1 == wStatusFlags7
216
inc hl
217
set BIT_USED_FLY, [hl]
218
.pressedB
219
xor a
220
ld [wTownMapSpriteBlinkingEnabled], a
221
call GBPalWhiteOutWithDelay3
222
pop hl
223
pop af
224
ld [hl], a
225
ret
226
.pressedUp
227
decoord 18, 0
228
inc hl
229
ld a, [hl]
230
cp $ff
231
jr z, .wrapToStartOfList
232
cp NOT_VISITED
233
jr z, .pressedUp ; skip past unvisited towns
234
jp .townMapFlyLoop
235
.wrapToStartOfList
236
ld hl, wFlyLocationsList
237
jp .townMapFlyLoop
238
.pressedDown
239
decoord 19, 0
240
dec hl
241
ld a, [hl]
242
cp $ff
243
jr z, .wrapToEndOfList
244
cp NOT_VISITED
245
jr z, .pressedDown ; skip past unvisited towns
246
jp .townMapFlyLoop
247
.wrapToEndOfList
248
ld hl, wFlyLocationsList + NUM_CITY_MAPS
249
jr .pressedDown
250
251
ToText:
252
db "To@"
253
254
BuildFlyLocationsList:
255
ld hl, wFlyAnimUsingCoordList
256
ld [hl], $ff
257
inc hl
258
ld a, [wTownVisitedFlag]
259
ld e, a
260
ld a, [wTownVisitedFlag + 1]
261
ld d, a
262
lb bc, 0, NUM_CITY_MAPS
263
.loop
264
srl d
265
rr e
266
ld a, NOT_VISITED
267
jr nc, .notVisited
268
ld a, b ; store the map number of the town if it has been visited
269
.notVisited
270
ld [hl], a
271
inc hl
272
inc b
273
dec c
274
jr nz, .loop
275
ld [hl], $ff
276
ret
277
278
TownMapUpArrow:
279
INCBIN "gfx/town_map/up_arrow.1bpp"
280
TownMapUpArrowEnd:
281
282
LoadTownMap:
283
call GBPalWhiteOutWithDelay3
284
call ClearScreen
285
call UpdateSprites
286
hlcoord 0, 0
287
ld b, $12
288
ld c, $12
289
call TextBoxBorder
290
call DisableLCD
291
ld hl, WorldMapTileGraphics
292
ld de, vChars2 tile $60
293
ld bc, WorldMapTileGraphicsEnd - WorldMapTileGraphics
294
ld a, BANK(WorldMapTileGraphics)
295
call FarCopyData2
296
ld hl, MonNestIcon
297
ld de, vSprites tile $04
298
ld bc, MonNestIconEnd - MonNestIcon
299
ld a, BANK(MonNestIcon)
300
call FarCopyDataDouble
301
hlcoord 0, 0
302
ld de, CompressedMap
303
.nextTile
304
ld a, [de]
305
and a
306
jr z, .done
307
ld b, a
308
and $f
309
ld c, a
310
ld a, b
311
swap a
312
and $f
313
add $60
314
.writeRunLoop
315
ld [hli], a
316
dec c
317
jr nz, .writeRunLoop
318
inc de
319
jr .nextTile
320
.done
321
call EnableLCD
322
ld b, SET_PAL_TOWN_MAP
323
call RunPaletteCommand
324
call Delay3
325
call GBPalNormal
326
xor a
327
ld [wAnimCounter], a
328
inc a
329
ld [wTownMapSpriteBlinkingEnabled], a
330
ret
331
332
CompressedMap:
333
INCBIN "gfx/town_map/town_map.rle"
334
335
ExitTownMap:
336
; clear town map graphics data and load usual graphics data
337
xor a
338
ld [wTownMapSpriteBlinkingEnabled], a
339
call GBPalWhiteOut
340
call ClearScreen
341
call ClearSprites
342
call LoadPlayerSpriteGraphics
343
call LoadFontTilePatterns
344
call UpdateSprites
345
jp RunDefaultPaletteCommand
346
347
DrawPlayerOrBirdSprite:
348
; a = map number
349
; b = OAM base tile
350
push af
351
ld a, b
352
ld [wOAMBaseTile], a
353
pop af
354
ld de, wTownMapCoords
355
call LoadTownMapEntry
356
ld a, [de]
357
push hl
358
call TownMapCoordsToOAMCoords
359
call WritePlayerOrBirdSpriteOAM
360
pop hl
361
ld de, wNameBuffer
362
.loop
363
ld a, [hli]
364
ld [de], a
365
inc de
366
cp "@"
367
jr nz, .loop
368
ld hl, wShadowOAM
369
ld de, wShadowOAMBackup
370
ld bc, OAM_COUNT * 4
371
jp CopyData
372
373
DisplayWildLocations:
374
farcall FindWildLocationsOfMon
375
call ZeroOutDuplicatesInList
376
ld hl, wShadowOAM
377
ld de, wTownMapCoords
378
.loop
379
ld a, [de]
380
cp $ff
381
jr z, .exitLoop
382
and a
383
jr z, .nextEntry
384
push hl
385
call LoadTownMapEntry
386
pop hl
387
ld a, [de]
388
cp $19 ; Cerulean Cave's coordinates
389
jr z, .nextEntry ; skip Cerulean Cave
390
call TownMapCoordsToOAMCoords
391
ld a, $4 ; nest icon tile no.
392
ld [hli], a
393
xor a
394
ld [hli], a
395
.nextEntry
396
inc de
397
jr .loop
398
.exitLoop
399
ld a, l
400
and a ; were any OAM entries written?
401
jr nz, .drawPlayerSprite
402
; if no OAM entries were written, print area unknown text
403
hlcoord 1, 7
404
ld b, 2
405
ld c, 15
406
call TextBoxBorder
407
hlcoord 2, 9
408
ld de, AreaUnknownText
409
call PlaceString
410
jr .done
411
.drawPlayerSprite
412
ld a, [wCurMap]
413
ld b, $0
414
call DrawPlayerOrBirdSprite
415
.done
416
ld hl, wShadowOAM
417
ld de, wShadowOAMBackup
418
ld bc, OAM_COUNT * 4
419
jp CopyData
420
421
AreaUnknownText:
422
db " AREA UNKNOWN@"
423
424
TownMapCoordsToOAMCoords:
425
; in: lower nybble of a = x, upper nybble of a = y
426
; out: b and [hl] = (y * 8) + 24, c and [hl+1] = (x * 8) + 24
427
push af
428
and $f0
429
srl a
430
add 24
431
ld b, a
432
ld [hli], a
433
pop af
434
and $f
435
swap a
436
srl a
437
add 24
438
ld c, a
439
ld [hli], a
440
ret
441
442
WritePlayerOrBirdSpriteOAM:
443
ld a, [wOAMBaseTile]
444
and a
445
ld hl, wShadowOAMSprite36 ; for player sprite
446
jr z, WriteTownMapSpriteOAM
447
ld hl, wShadowOAMSprite32 ; for bird sprite
448
449
WriteTownMapSpriteOAM:
450
push hl
451
452
; Subtract 4 from c (X coord) and 4 from b (Y coord). However, the carry from c
453
; is added to b, so the net result is that only 3 is subtracted from b.
454
lb hl, -4, -4
455
add hl, bc
456
457
ld b, h
458
ld c, l
459
pop hl
460
461
WriteAsymmetricMonPartySpriteOAM:
462
; Writes 4 OAM blocks for a helix mon party sprite, since it does not have
463
; a vertical line of symmetry.
464
lb de, 2, 2
465
.loop
466
push de
467
push bc
468
.innerLoop
469
ld a, b
470
ld [hli], a
471
ld a, c
472
ld [hli], a
473
ld a, [wOAMBaseTile]
474
ld [hli], a
475
inc a
476
ld [wOAMBaseTile], a
477
xor a
478
ld [hli], a
479
inc d
480
ld a, 8
481
add c
482
ld c, a
483
dec e
484
jr nz, .innerLoop
485
pop bc
486
pop de
487
ld a, 8
488
add b
489
ld b, a
490
dec d
491
jr nz, .loop
492
ret
493
494
WriteSymmetricMonPartySpriteOAM:
495
; Writes 4 OAM blocks for a mon party sprite other than a helix. All the
496
; sprites other than the helix one have a vertical line of symmetry which allows
497
; the X-flip OAM bit to be used so that only 2 rather than 4 tile patterns are
498
; needed.
499
xor a
500
ld [wSymmetricSpriteOAMAttributes], a
501
lb de, 2, 2
502
.loop
503
push de
504
push bc
505
.innerLoop
506
ld a, b
507
ld [hli], a ; Y
508
ld a, c
509
ld [hli], a ; X
510
ld a, [wOAMBaseTile]
511
ld [hli], a ; tile
512
ld a, [wSymmetricSpriteOAMAttributes]
513
ld [hli], a ; attributes
514
xor OAM_XFLIP
515
ld [wSymmetricSpriteOAMAttributes], a
516
inc d
517
ld a, 8
518
add c
519
ld c, a
520
dec e
521
jr nz, .innerLoop
522
pop bc
523
pop de
524
push hl
525
ld hl, wOAMBaseTile
526
inc [hl]
527
inc [hl]
528
pop hl
529
ld a, 8
530
add b
531
ld b, a
532
dec d
533
jr nz, .loop
534
ret
535
536
ZeroOutDuplicatesInList:
537
; replace duplicate bytes in the list of wild pokemon locations with 0
538
ld de, wBuffer
539
.loop
540
ld a, [de]
541
inc de
542
cp $ff
543
ret z
544
ld c, a
545
ld l, e
546
ld h, d
547
.zeroDuplicatesLoop
548
ld a, [hl]
549
cp $ff
550
jr z, .loop
551
cp c
552
jr nz, .skipZeroing
553
xor a
554
ld [hl], a
555
.skipZeroing
556
inc hl
557
jr .zeroDuplicatesLoop
558
559
LoadTownMapEntry:
560
; in: a = map number
561
; out: lower nybble of [de] = x, upper nybble of [de] = y, hl = address of name
562
cp FIRST_INDOOR_MAP
563
jr c, .external
564
ld bc, 4
565
ld hl, InternalMapEntries
566
.loop
567
cp [hl]
568
jr c, .foundEntry
569
add hl, bc
570
jr .loop
571
.foundEntry
572
inc hl
573
jr .readEntry
574
.external
575
ld hl, ExternalMapEntries
576
ld c, a
577
ld b, 0
578
add hl, bc
579
add hl, bc
580
add hl, bc
581
.readEntry
582
ld a, [hli]
583
ld [de], a
584
ld a, [hli]
585
ld h, [hl]
586
ld l, a
587
ret
588
589
INCLUDE "data/maps/town_map_entries.asm"
590
591
INCLUDE "data/maps/names.asm"
592
593
MonNestIcon:
594
INCBIN "gfx/town_map/mon_nest_icon.1bpp"
595
MonNestIconEnd:
596
597
TownMapSpriteBlinkingAnimation::
598
ld a, [wAnimCounter]
599
inc a
600
cp 25
601
jr z, .hideSprites
602
cp 50
603
jr nz, .done
604
; show sprites when the counter reaches 50
605
ld hl, wShadowOAMBackup
606
ld de, wShadowOAM
607
ld bc, (OAM_COUNT - 4) * 4
608
call CopyData
609
xor a
610
jr .done
611
.hideSprites
612
ld hl, wShadowOAM
613
ld b, OAM_COUNT - 4
614
ld de, $4
615
.hideSpritesLoop
616
ld [hl], $a0
617
add hl, de
618
dec b
619
jr nz, .hideSpritesLoop
620
ld a, 25
621
.done
622
ld [wAnimCounter], a
623
jp DelayFrame
624
625