-
Notifications
You must be signed in to change notification settings - Fork 20
/
minimap.asm
784 lines (665 loc) · 11.9 KB
/
minimap.asm
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
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
; This file is part of Pwn Adventure Z.
; Pwn Adventure Z is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
; Pwn Adventure Z is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
; You should have received a copy of the GNU General Public License
; along with Pwn Adventure Z. If not, see <http://www.gnu.org/licenses/>.
.include "defines.inc"
.segment "FIXED"
PROC minimap
lda current_bank
pha
lda #^show_minimap
jsr bankswitch
jsr show_minimap & $ffff
pla
jsr bankswitch
rts
.endproc
PROC back_to_game_from_alternate_screen
lda current_bank
pha
lda #0
jsr bankswitch
; Clear sprites
lda #$ff
ldx #0
clearsprites:
sta sprites, x
inx
bne clearsprites
jsr init_player_sprites
jsr load_effect_sprites
jsr update_player_sprite
jsr update_enemy_sprites
jsr update_effect_sprites
LOAD_ALL_TILES $000, title_tiles
jsr init_status_tiles
pla
jsr bankswitch
rts
.endproc
.segment "UI"
PROC show_minimap
ldx #0
palettesaveloop:
lda active_palette, x
sta saved_palette, x
inx
cpx #32
bne palettesaveloop
lda ppu_settings
sta saved_ppu_settings
jsr fade_out
jsr clear_alt_screen
LOAD_ALL_TILES $000, title_tiles
LOAD_ALL_TILES MINIMAP_TILE_BACKGROUND, minimap_background_tiles
LOAD_ALL_TILES MINIMAP_TILE_FOREST, minimap_forest_tiles
LOAD_ALL_TILES MINIMAP_TILE_CAVE_ENTRANCE, minimap_cave_entrace_tile
LOAD_ALL_TILES MINIMAP_TILE_ROCK, minimap_rock_tiles
LOAD_ALL_TILES MINIMAP_TILE_BASE, minimap_base_tiles
LOAD_ALL_TILES MINIMAP_TILE_TOWN, minimap_town_tiles
LOAD_ALL_TILES MINIMAP_TILE_ARROWS, minimap_arrow_tiles
LOAD_ALL_TILES MINIMAP_TILE_LAKE, minimap_lake_tiles
LOAD_ALL_TILES MINIMAP_TILE_INDICATORS, minimap_indicator_tiles
lda #PPUCTRL_ENABLE_NMI | PPUCTRL_NAMETABLE_2000
sta ppu_settings
; Draw map background
LOAD_PTR minimap_top_row
ldx #0
ldy #32 + 1
lda #30
jsr write_tiles
LOAD_PTR minimap_bot_row
ldx #0
ldy #32 + 24
lda #30
jsr write_tiles
lda #32 + 2
sta arg0
mapbackgroundloop:
LOAD_PTR minimap_mid_row
ldx #0
ldy arg0
lda #30
jsr write_tiles
ldy arg0
iny
sty arg0
cpy #32 + 24
bne mapbackgroundloop
; Show options text
lda #0
sta arg0
lda #16 + 13
sta arg1
lda #16 + 13
sta arg3
lda #5
sta arg2
lda #1
sta arg4
jsr set_box_palette
lda #6
sta arg0
lda #16 + 13
sta arg1
lda #16 + 13
sta arg3
lda #15
sta arg2
lda #2
sta arg4
jsr set_box_palette
LOAD_PTR resume_str
ldx #3
ldy #32 + 26
jsr write_string
LOAD_PTR save_str
ldx #14
ldy #32 + 26
jsr write_string
ldx #19
ldy #32 + 26
jsr write_string
ldx #23
ldy #32 + 26
jsr write_string
LOAD_PTR minimap_right_arrow
ldx #1
ldy #32 + 26
lda #1
jsr write_tiles
LOAD_PTR minimap_left_arrow
ldx #10
ldy #32 + 26
lda #1
jsr write_tiles
; Generate map contents. On SNROM this will pull the cache from work RAM, on UNROM this
; will be generated now (which is slower but there is no extra RAM).
jsr render_minimap
; Clear tiles that have not been visited yet
lda #0
sta arg1
visityloop:
lda #0
sta arg0
visitxloop:
lda arg1
asl
asl
sta temp
lda arg0
lsr
lsr
lsr
clc
adc temp
tay
lda arg0
and #7
tax
lda (map_visited_ptr), y
and toggle_mask, x
bne visited
ldx arg0
ldy arg1
lda #MINIMAP_TILE_ROCK + SMALL_BORDER_CENTER ; This tile is blank
jsr write_minimap_tile
visited:
ldx arg0
inx
stx arg0
cpx #26
bne visitxloop
ldy arg1
iny
sty arg1
cpy #22
bne visityloop
; Add sprite for current location
lda cur_screen_y
asl
asl
asl
clc
adc #23
sta sprites
lda #MINIMAP_TILE_INDICATORS
sta sprites + 1
lda #1
sta sprites + 2
lda cur_screen_x
asl
asl
asl
clc
adc #24
sta sprites + 3
; Show quest markers for the current quest step(s)
ldy #0
questyloop:
ldx #0
questxloop:
jsr read_overworld_map
and #$3f
cmp #MAP_START_FOREST_BOSS
beq quest1
cmp #MAP_SEWER_DOWN
beq quest2
cmp #MAP_SEWER_BOSS
beq quest2
cmp #MAP_MINE_DOWN
beq quest3
cmp #MAP_MINE_BOSS
beq quest3
cmp #MAP_CAVE_BOSS
beq quest4
cmp #MAP_DEAD_WOOD_BOSS
beq quest5
cmp #MAP_UNBEARABLE_BOSS
beq quest6
cmp #MAP_SHOP
beq startquest
cmp #MAP_BOSS
beq endquest
jmp questnext & $ffff
quest1:
lda highlighted_quest_steps
and #QUEST_KEY_1
beq questnext
lda #1
jsr highlight_on_map
jmp questnext & $ffff
quest2:
lda highlighted_quest_steps
and #QUEST_KEY_2
beq questnext
lda #2
jsr highlight_on_map
jmp questnext & $ffff
quest3:
lda highlighted_quest_steps
and #QUEST_KEY_3
beq questnext
lda #3
jsr highlight_on_map
jmp questnext & $ffff
quest4:
lda highlighted_quest_steps
and #QUEST_KEY_4
beq questnext
lda #4
jsr highlight_on_map
jmp questnext & $ffff
quest5:
lda highlighted_quest_steps
and #QUEST_KEY_5
beq questnext
lda #5
jsr highlight_on_map
jmp questnext & $ffff
quest6:
lda highlighted_quest_steps
and #QUEST_KEY_6
beq questnext
lda #6
jsr highlight_on_map
jmp questnext & $ffff
startquest:
lda highlighted_quest_steps
and #QUEST_START
beq questnext
lda #7
jsr highlight_on_map
jmp questnext & $ffff
endquest:
lda highlighted_quest_steps
and #QUEST_END
beq questnext
lda #8
jsr highlight_on_map
questnext:
inx
cpx #26
beq questnexty
jmp questxloop & $ffff
questnexty:
iny
cpy #22
beq questdone
jmp questyloop & $ffff
questdone:
LOAD_PTR minimap_palette
jsr fade_in
lda #0
sta selection
waitfordepress:
jsr wait_for_vblank
jsr update_minimap_palette & $ffff
jsr update_controller
lda controller
bne waitfordepress
selectloop:
jsr wait_for_vblank
jsr update_minimap_palette & $ffff
jsr update_controller
lda controller
and #JOY_START | JOY_A
beq notstart
jmp done & $ffff
notstart:
lda controller
and #JOY_B
beq notb
lda #0
sta selection
jmp done & $ffff
notb:
lda controller
and #JOY_LEFT | JOY_RIGHT | JOY_SELECT
beq selectloop
PLAY_SOUND_EFFECT effect_uimove
lda selection
eor #1
sta selection
beq selectresume
jsr wait_for_vblank
jsr update_minimap_palette & $ffff
LOAD_PTR minimap_clear
ldx #1
ldy #32 + 26
lda #1
jsr write_tiles
LOAD_PTR minimap_clear
ldx #10
ldy #32 + 26
lda #1
jsr write_tiles
LOAD_PTR minimap_right_arrow
ldx #12
ldy #32 + 26
lda #1
jsr write_tiles
LOAD_PTR minimap_left_arrow
ldx #28
ldy #32 + 26
lda #1
jsr write_tiles
LOAD_PTR minimap_deselected_palette
lda #1
jsr load_single_palette
LOAD_PTR minimap_selected_palette
lda #2
jsr load_single_palette
jsr prepare_for_rendering
jmp waitfordepress & $ffff
selectresume:
jsr wait_for_vblank
jsr update_minimap_palette & $ffff
LOAD_PTR minimap_right_arrow
ldx #1
ldy #32 + 26
lda #1
jsr write_tiles
LOAD_PTR minimap_left_arrow
ldx #10
ldy #32 + 26
lda #1
jsr write_tiles
LOAD_PTR minimap_clear
ldx #12
ldy #32 + 26
lda #1
jsr write_tiles
LOAD_PTR minimap_clear
ldx #28
ldy #32 + 26
lda #1
jsr write_tiles
LOAD_PTR minimap_selected_palette
lda #1
jsr load_single_palette
LOAD_PTR minimap_deselected_palette
lda #2
jsr load_single_palette
jsr prepare_for_rendering
jmp waitfordepress & $ffff
done:
jsr wait_for_vblank
jsr update_minimap_palette & $ffff
jsr update_controller
lda controller
bne done
lda selection
cmp #1
bne noquit
jsr stop_music
noquit:
PLAY_SOUND_EFFECT effect_select
jsr fade_out
lda saved_ppu_settings
sta ppu_settings
lda selection
cmp #1
beq quit
jsr back_to_game_from_alternate_screen
LOAD_PTR saved_palette
jsr fade_in
lda #0
rts
quit:
jsr save
ldx #20
jsr wait_for_frame_count
jmp start
.endproc
PROC update_minimap_palette
lda vblank_count
and #15
cmp #8
bcs white
lda #2
sta sprites + 2
jmp done & $ffff
white:
lda #1
sta sprites + 2
done:
rts
.endproc
.segment "FIXED"
PROC set_ppu_addr_to_minimap_tile
txa
clc
adc #2
tax
tya
clc
adc #32 + 2
tay
jsr set_ppu_addr_to_coord
rts
.endproc
PROC write_minimap_tile
pha
jsr set_ppu_addr_to_minimap_tile
pla
sta PPUDATA
rts
.endproc
PROC get_minimap_tile_for_type
cmp #MAP_CAVE_START
beq rock
cmp #MAP_BOUNDARY
beq rock
cmp #MAP_CAVE_INTERIOR
beq rock
cmp #MAP_CAVE_CHEST
beq rock
cmp #MAP_CAVE_BOSS
beq rock
cmp #MAP_BLOCKY_TREASURE
beq rock
cmp #MAP_BLOCKY_PUZZLE
beq rock
cmp #MAP_BLOCKY_CAVE
beq rock
cmp #MAP_STARTING_CAVE
beq rock
cmp #MAP_LOST_CAVE
beq rock
cmp #MAP_LOST_CAVE_WALL
beq rock
cmp #MAP_LOST_CAVE_CHEST
beq rock
cmp #MAP_LOST_CAVE_END
beq rock
cmp #MAP_MINE_ENTRANCE
beq rock
cmp #MAP_MINE_DOWN
beq rock
jmp checkforest
rock:
lda #MINIMAP_TILE_ROCK + SMALL_BORDER_CENTER
rts
checkforest:
cmp #MAP_FOREST
beq forest
cmp #MAP_FOREST_CHEST
beq forest
cmp #MAP_DEAD_WOOD
beq forest
cmp #MAP_DEAD_WOOD_CHEST
beq forest
cmp #MAP_DEAD_WOOD_BOSS
beq forest
cmp #MAP_UNBEARABLE
beq forest
cmp #MAP_UNBEARABLE_CHEST
beq forest
cmp #MAP_UNBEARABLE_BOSS
beq forest
cmp #MAP_START_FOREST
beq forest
cmp #MAP_START_FOREST_CHEST
beq forest
cmp #MAP_START_FOREST_BOSS
beq forest
cmp #MAP_SEWER_DOWN
beq forest
cmp #MAP_HOUSE
beq house
cmp #MAP_BOARDED_HOUSE
beq house
cmp #MAP_OUTPOST_HOUSE
beq house
cmp #MAP_SHOP
beq shop
cmp #MAP_SECRET_SHOP
beq shop
cmp #MAP_OUTPOST_SHOP
beq shop
cmp #MAP_PARK
beq park
cmp #MAP_LAKE
beq lake
cmp #MAP_BOSS
beq base
cmp #MAP_BASE_HORDE
beq base
cmp #MAP_BASE_INTERIOR
beq base
cmp #MAP_SEWER_UP
beq sewerormine
cmp #MAP_SEWER
beq sewerormine
cmp #MAP_SEWER_CHEST
beq sewerormine
cmp #MAP_SEWER_BOSS
beq sewerormine
cmp #MAP_MINE_UP
beq sewerormine
cmp #MAP_MINE
beq sewerormine
cmp #MAP_MINE_CHEST
beq sewerormine
cmp #MAP_MINE_BOSS
beq sewerormine
jmp rock
forest:
ldx arg0
ldy arg1
lda arg0
jsr gen8
and #3
beq park
lda #MINIMAP_TILE_FOREST
rts
sewerormine:
lda #MINIMAP_TILE_FOREST
rts
house:
lda #MINIMAP_TILE_TOWN
rts
shop:
lda #MINIMAP_TILE_TOWN + 1
rts
park:
lda #MINIMAP_TILE_FOREST + 1
rts
lake:
lda #MINIMAP_TILE_LAKE + SMALL_BORDER_CENTER
rts
base:
lda #MINIMAP_TILE_BASE + SMALL_BORDER_CENTER
rts
.endproc
PROC highlight_on_map
stx arg0
sty arg1
asl
asl
tay
lda arg1
asl
asl
asl
clc
adc #23
sta sprites, y
lda #MINIMAP_TILE_INDICATORS + 1
sta sprites + 1, y
lda #0
sta sprites + 2, y
lda arg0
asl
asl
asl
clc
adc #24
sta sprites + 3, y
ldx arg0
ldy arg1
rts
.endproc
.data
VAR minimap_top_row
.byte 0,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,0
VAR minimap_mid_row
.byte 0,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,0
VAR minimap_bot_row
.byte 0,7,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,9,0
VAR resume_str
.byte "RESUME", 0
VAR save_str
.byte "SAVE", 0
VAR and_str
.byte "AND", 0
VAR quit_str
.byte "QUIT", 0
VAR minimap_left_arrow
.byte MINIMAP_TILE_ARROWS
VAR minimap_right_arrow
.byte MINIMAP_TILE_ARROWS + 1
VAR minimap_clear
.byte 0
VAR minimap_palette
.byte $0f, $0f, $16, $37
.byte $0f, $21, $21, $21
.byte $0f, $30, $30, $30
.byte $0f, $0f, $27, $37
.byte $0f, $0f, $26, $37
.byte $0f, $0f, $30, $30
.byte $0f, $0f, $21, $21
.byte $0f, $0f, $16, $37
VAR minimap_selected_palette
.byte $0f, $21, $21, $21
VAR minimap_deselected_palette
.byte $0f, $30, $30, $30
.segment "TEMP"
VAR saved_ppu_settings
.byte 0
VAR saved_palette
.byte 0, 0, 0, 0
.byte 0, 0, 0, 0
.byte 0, 0, 0, 0
.byte 0, 0, 0, 0
.byte 0, 0, 0, 0
.byte 0, 0, 0, 0
.byte 0, 0, 0, 0
.byte 0, 0, 0, 0
TILES minimap_background_tiles, 2, "tiles/map/background.chr", 9
TILES minimap_forest_tiles, 2, "tiles/map/forest.chr", 2
TILES minimap_cave_entrace_tile, 2, "tiles/map/cave.chr", 1
TILES minimap_rock_tiles, 2, "tiles/map/rock.chr", 33
TILES minimap_lake_tiles, 2, "tiles/map/lake.chr", 33
TILES minimap_town_tiles, 2, "tiles/map/town.chr", 2
TILES minimap_base_tiles, 2, "tiles/map/base.chr", 15
TILES minimap_arrow_tiles, 2, "tiles/map/arrows.chr", 2
TILES minimap_indicator_tiles, 2, "tiles/map/indicators.chr", 2