-
Notifications
You must be signed in to change notification settings - Fork 10
/
bankC.inc
4585 lines (4433 loc) · 111 KB
/
bankC.inc
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
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
ORG $8000
BANK_START $FC
; ---------------------------------------------------------------------------
; ----------------I-N-E-R-F-A-C-E--M-A-I-N--E-N-G-I-N-E----------------------
; ---------------------------------------------------------------------------
SECTION_START C00
; =============== S U B R O U T I N E =======================================
_game_start:
JSR _game_start_init ; here we get after start new game
; =============== S U B R O U T I N E =======================================
_MAIN_LOOP:
LDA _main_sub_idx ; main game GUI/control loop
CMP #$02 ; works only during the game
BEQ loc_13600B
RTS
loc_13600B:
JSR _wait_for_nmi ; once per frame
JSR _states_select ; selector of current GUI state
LDA _obj_active_flags ; according to requests of engine
AND #$01
BEQ loc_13601B
JSR _far_heavy_traffic_report_test ; if heli in flight, test traffic as well
loc_13601B:
LDA _game_state_idx ; execute selected state
SWITCH
SW_PTR _state00_hud_redraw
SW_PTR _state01_constr_palette_redraw
SW_PTR _state02_map_scroll
SW_PTR _state03_map_scroll_mode_set
SW_PTR _state04_game_field_redraw
SW_PTR _state05_constr_palette_update
SW_PTR _state06_screen_refresh
SW_PTR _state07_buttons_push
SW_PTR _state08_build
SW_PTR _state09_hud_build_name_draw
SW_PTR _state0A_power_build_menu
SW_PTR _state0B_gui_ctrl_menu
SW_PTR _state0C_RCI_meter_redraw
SW_PTR _state0D_hud_date_redraw
SW_PTR _state0E_idle_state
SW_PTR _state0F_hud_money_redraw
SW_PTR _state10_budget_screen
SW_PTR _state11_hud_popul_redraw
SW_PTR _state12_airport_build_menu
SW_PTR _state13_msg_wnd_display
SW_PTR _state14_presents_build_menu
SW_PTR _state15_game_cursor_area_switch
SW_PTR _state16_hud_city_name_redraw
SW_PTR _state17_common
; =============== S U B R O U T I N E =======================================
_state00_hud_redraw:
JSR _hud_static_draw ; redraw static part of the HUD (buttons, extnts)
BCS loc_1360DD ; C=1 if ppu buffers aren't empty yet
LDA _gui_active_controls_flags ; set flag for top side of HUD redraw complete signal
ORA #$01
STA _gui_active_controls_flags
LDA #$FF
STA _hud_date_redraw_req ; set dynamic parts of the HUD redraw requests
STA _hud_money_redraw_req ; chanining the drawing process
STA _hud_popul_redraw_req
STA _hud_city_name_redraw_req
loc_1360DD:
JMP _state17_common
; FIX: moved here from bankD to collect free space in one place
;
; =============== S U B R O U T I N E =======================================
_state01_constr_palette_redraw:
JSR _constr_palette_redraw ; redraw leftmost part of HUD/GUI, a
BCS loc_150019 ; cinstruction palette
LDA #$3A
STA _MMC5_CHR_BANKSA+2 ; restore cursor sprites CHR bank
LDA #$FF
STA _hud_build_name_draw_req ; erquest to update build name and price
LDA _gui_active_controls_flags ; raise the GUI activity flag
ORA #$02
STA _gui_active_controls_flags
LDA #$FF
STA _RCI_meter_redraw_req ; also redraw RCI meters request
loc_150019:
JMP _state17_common
; =============== S U B R O U T I N E =======================================
_state02_map_scroll:
LDA _gui_active_controls_flags ; first we need to redraw GUI areas with
AND #$03 ; map one by one. will clear the corresponding
BEQ .mini_map_wait_for_scrolls ; bit if done, start to scroll only when
LSR ; both pards are redrawn
BCC .mini_map_hor_queue
JSR _replace_hud_with_map ; first replace HUD area with map
BCS .j_state17_common0
LDA _gui_active_controls_flags ; clear HUD activity flag
AND #$FE
STA _gui_active_controls_flags
JMP _state17_common
.mini_map_hor_queue:
JSR _replace_constr_palette_with_map; then replace constr palette
BCS .j_state17_common0
LDA _gui_active_controls_flags ; clear second flag, now we ready to scroll
AND #$FD
STA _gui_active_controls_flags
.j_state17_common0:
JMP _state17_common
.mini_map_wait_for_scrolls:
LDA #$36
STA _MMC5_CHR_BANKSA+2 ; set CHR bank for arrow sprites
JSR _map_scroll_mode_minimap_draw
JSR _map_scroll_mode_arrows_draw
LDA _cur_screen_tile._COL
ORA _cur_screen_tile._ROW
AND #$01
BNE .mini_map_continue_scroll ; skip input test on odd scrolls
LDA _pad0_held
AND #$40
BNE .button_B_held ; test if we still keep B held
LDA #$00
STA _scr_mode_idx ; if not, exit mini-map mode
JSR _scroll_msg_reset
JMP _state17_common
.mini_map_continue_scroll:
LDA _tmp70 ; now test what scrolls are in progress
AND #$03 ; to update positions
BEQ .mini_map_continue_vert_scroll
LSR ; do horizontal scroll
BCC .mini_map_continue_left_scroll
INC _cur_screen_tile._COL ; scroll to right adjust pos
LDA _cur_screen_tile._COL
CMP #$40
BCC .mini_map_scroll_done ; wrap to 0
LDA #$00
STA _cur_screen_tile._COL
BEQ .mini_map_scroll_done
.mini_map_continue_left_scroll:
DEC _cur_screen_tile._COL ; scroll to left
BPL .mini_map_scroll_done
LDA #$3F
STA _cur_screen_tile._COL ; wrap to 3F
JMP .mini_map_scroll_done
.mini_map_continue_vert_scroll:
LDA _tmp70 ; do vertical scrolls
AND #$0C
BEQ .mini_map_scroll_done
AND #$04
BEQ .mini_map_continue_down_scroll
INC _cur_screen_tile._ROW ; scroll up
LDA _cur_screen_tile._ROW
CMP #$3C
BCC .mini_map_scroll_done
LDA #$00
STA _cur_screen_tile._ROW
BEQ .mini_map_scroll_done
.mini_map_continue_down_scroll:
DEC _cur_screen_tile._ROW ; scroll down
BPL .mini_map_scroll_done
LDA #$3B
STA _cur_screen_tile._ROW
.mini_map_scroll_done:
LDA #$00
STA _tmp70
JMP _state17_common ; clear states when fine scroll is over
.button_B_held:
LDA _pad0_held ; now get actual input and refresh
AND #$0F ; scroll directions and refill new map data
BEQ loc_13617C ; test if we held any D-PAd buttons
; JSR _buffers_test_flush ; if yes, test if buffers are empty.
; BCC loc_13617F
JSR _buffers_test_flush ; OPTIMIZED, merged
BEQ loc_13617F
loc_13617C:
JMP _state17_common
loc_13617F:
LDA _pad0_held ; all is done, start to refill map data
AND #$0F
STA _tmp70
AND #$03
BEQ .map_fill_vertical ; horizontal scrolls test
LSR
BCS .map_fill_left
LDA _cur_map_wnd_pos._COL ; right scroll boundary test
BEQ loc_1361BD
LDA _cur_game_cursor_area
BEQ loc_1361A4
LDA _constr_cursor_tile._COL
CLC
ADC _cur_building_size ; adjust scroll position with constr cursor size info
CMP #$19
BCS loc_1361A4
LDA _cur_game_cursor_scr_pos._COL
CLC
ADC #$08
STA _cur_game_cursor_scr_pos._COL
loc_1361A4:
LDA #$FF ; draw scroll line with common routine
STA _tmp71 ; set vertical draw flag,
LDA #$F8 ; fine scroll delta
STA _tmp72
LDA #$1F
STA _tmp73 ; colump position to draw
JSR _map_scroll_line_draw
DEC _cur_map_wnd_pos._COL
DEC _cur_screen_tile._COL
BPL loc_1361BD
LDA #$3F
STA _cur_screen_tile._COL
loc_1361BD:
JMP _state17_common
.map_fill_left:
LDA _cur_map_wnd_pos._COL
CMP #$35
BCS loc_1361E7
LDA _cur_game_cursor_area
BEQ loc_1361D4
LDA _cur_game_cursor_scr_pos._COL
CMP #$40
BCC loc_1361D4
SBC #$08
STA _cur_game_cursor_scr_pos._COL
loc_1361D4:
LDA #$FF
STA _tmp71
LDA #$19
STA _tmp72
LDA #$00
STA _tmp73
JSR _map_scroll_line_draw
INC _cur_map_wnd_pos._COL
INC _cur_screen_tile._COL
loc_1361E7:
JMP _state17_common
.map_fill_vertical:
LDA _pad0_held ; vertical scrolls test
AND #$0C
BEQ loc_136250 ; extract up/down buttons
LSR
LSR
LSR
BCS .map_fill_up
LDA _cur_map_wnd_pos._ROW ; scroll down bounds test
BEQ loc_136226
LDA _cur_game_cursor_area
BEQ loc_13620D
LDA _constr_cursor_tile._ROW
CLC
ADC _cur_building_size
CMP #$15
BCS loc_13620D
LDA _cur_game_cursor_scr_pos._ROW
CLC
ADC #$08
STA _cur_game_cursor_scr_pos._ROW
loc_13620D:
LDA #$00 ; draw bottom horizontal line
STA _tmp71
LDA #$F8
STA _tmp72
LDA #$16
STA _tmp73
JSR _map_scroll_line_draw
DEC _cur_map_wnd_pos._ROW
DEC _cur_screen_tile._ROW
BPL loc_136226
LDA #$3B
STA _cur_screen_tile._ROW
loc_136226:
JMP _state17_common
.map_fill_up:
LDA _cur_map_wnd_pos._ROW ; the same for up
CMP #$37
BCS loc_136250
LDA _cur_game_cursor_area
BEQ loc_13623D
LDA _cur_game_cursor_scr_pos._ROW
CMP #$40
BCC loc_13623D
SBC #$08
STA _cur_game_cursor_scr_pos._ROW
loc_13623D:
LDA #$00
STA _tmp71
LDA #$15
STA _tmp72
LDA #$15
STA _tmp73
JSR _map_scroll_line_draw
INC _cur_map_wnd_pos._ROW
INC _cur_screen_tile._ROW
loc_136250:
JMP _state17_common
;loc_136253: ; REDUNDANT
; JMP _state17_common
; =============== S U B R O U T I N E =======================================
_state03_map_scroll_mode_set:
LDA #$01
STA _scr_mode_idx ; simply set the scroll request
JMP _state17_common ; why?
; =============== S U B R O U T I N E =======================================
_state07_buttons_push:
LDA _cur_game_cursor_scr_pos._ROW ; we already know this is buttons
CMP #$38 ; if below 38, this is const palette
BCS .constr_button_push ; otherwize this in config/info buttons
LDA _pad0_press ; config windows activates differently
AND #$80 ;
STA _game_msg_wnd_active_flag ; upper side of the screen activate the
JMP _state17_common ; menu windows
.constr_button_push:
PUSHB _constr_palette_press_idx ; backup idx by now
JSR _is_constr_palette_item_active ; test if button is active
PLA ; restore idx
BCS .j_apu_se_error ; beep error if yes
TAX ; put idx in X lol
CMP _constr_palette_selected_idx ; now test if we press the same button twice
BEQ .button_push_twice_test ; for some buttons this is allowed
STA _cur_constr_palette_selected_idx; for the rest - dont
STA _constr_palette_selected_idx
; JSR _apu_se_consrt_palette_click ; of first click to button
APUA_SE _SE_IDX_BCLICK
LDA _cur_game_cursor_scr_pos._COL
STA _constr_palette_area_cursor_pos._COL
LDA _cur_game_cursor_scr_pos._ROW
STA _constr_palette_area_cursor_pos._ROW
LDA _building_sizes_list,X ; apply selected tool
STA _cur_building_size
loc_13629E:
LDA #$FF
STA _hud_build_name_draw_req ; set request to update tool name on HUD
CPX #$0B ; special cases for multi-tool buttons
BNE loc_13629F
STA _power_build_menu_req ; power stations menu show first
BEQ .j_state17_common1
loc_13629F:
CPX #$0C
BNE loc_1362A9
STA _airport_build_menu_req ; ports menu show
BEQ .j_state17_common1
loc_1362A9:
CPX #$0D
BNE .j_state17_common1
STA _presents_build_menu_req ; or presents menu
FJSRA _presents_wnd_generate,PRGC,PRG2
JMP _state17_common
;.j_apu_se_error:
; JSR _apu_se_error
; APUA_SE _SE_IDX_ERROR
;.j_state17_common1:
; JMP _state17_common
.button_push_twice_test:
; OPTIMIZED
CPX #$0B
BCC .j_apu_se_error
CPX #$0E
BCC loc_13629E ; wrap to existing code
.j_apu_se_error:
APUA_SE _SE_IDX_ERROR
.j_state17_common1:
JMP _state17_common
; REDUNDANT
; CMP #$0B ; test if we need to push twice a particular button
; BNE loc_1362CE ; or beep if any other button pushed
; LDA #$FF
; STA _power_build_menu_req
; STA _hud_build_name_draw_req
; JMP _state17_common
;loc_1362CE:
; CMP #$0C
; BNE loc_1362DC
; LDA #$FF
; STA _airport_build_menu_req
; STA _hud_build_name_draw_req
; JMP _state17_common
;loc_1362DC:
; CMP #$0D
; BNE .j_apu_se_error
; FJSRA _presents_wnd_generate,PRGC,PRG2; present menu is a special case, we need to make it first
; LDA #$FF
; STA _presents_build_menu_req
; STA _hud_build_name_draw_req
; JMP _state17_common
; -
; =============== S U B R O U T I N E =======================================
_is_constr_palette_item_active:
ASL
TAX
LDY _palette_activity_flags,X ; list of flag bytes with its corresponding bits
LDA _palette_activity_flags+1,X
AND _constr_palette_flags,Y ; filled in constr palette update routine
BEQ loc_136300
SEC
RTS
loc_136300:
CLC
RTS
_palette_activity_flags:
.BYTE $03,$08
.BYTE $03,$02
.BYTE $02,$80
.BYTE $02,$20
.BYTE $02,$08
.BYTE $02,$02
.BYTE $01,$80
.BYTE $01,$20
.BYTE $01,$08
.BYTE $01,$02
.BYTE $00,$80
.BYTE $00,$20
.BYTE $00,$08
.BYTE $00,$02
; =============== S U B R O U T I N E =======================================
_state08_build:
LDA _build_game_field_update_req ; can build something only if game
BEQ loc_136325 ; already draw previous builds
JMP _state17_common
loc_136325:
LDA _constr_palette_selected_idx ; index 0 - bulldoze area
BNE .other_builds
JMP _bulldoze_area
.other_builds:
CMP #$04
BEQ _build_garden_area ; index 4 - gardens selected
BCS _bulid_large_buildings ; all above 4 - buildings
; REDUNDANT, merged
; LDA _pad0_held ; here we start to build single tiled objects
; CMP _pad0_prev_held ; areas - roads, rails, electrics
; BNE .something_changed ; buttons changes, test if we need to do something
; LDA _constr_cursor_tile._COL ; as well as cursor position changed
; CMP _prev_constr_cursor_tile._COL
; BNE .something_changed
; LDA _constr_cursor_tile._ROW
; CMP _prev_constr_cursor_tile._ROW
JSR _prev_tile_test ; the rest is for single tiles
BEQ _store_prev_cursor_and_exit
JSR _get_cur_building_price ; calc price, of tile to build, position where
JSR _get_cur_constr_cursor_map_tile ; to build, then choose what exactly tile we
FJSRA _get_new_map_single_tile,PRG7,PRGD ; need to build according to nearest
BCC loc_136358 ; tiles and special rules (bending roads, etc)
JMP .cant_build_anything_beep ; if not possible, beep
loc_136358:
; REDUNDANT, merged
; JSR _build_cur_constr_cursor_area ; put this tile to the map
; JSR _rebend_bulding_nearest_tiles ; re-bend surrounding tiles (roads, electrics)
; JSR _get_build_invalidate_area ; invalidate area request for new building
; LDA #$FF
; STA _hud_money_redraw_req ; also update request for decreased money
JSR _build_something ; OPTIMIZED, merged
APUA_SE _SE_IDX_SBUILD
; LDA _constr_cursor_tile._COL ; REDUNDANT, will be stored in _store_prev_constr_cursor
; STA _prev_constr_cursor_tile._COL ; double building
; LDA _constr_cursor_tile._ROW ; also wrong, no store opcode here
; !FALLTHROUGH!
; =============== S U B R O U T I N E =======================================
_store_prev_cursor_and_exit:
JSR _store_prev_constr_cursor
JMP _state17_common
; OPTIMIZED, merged code
; =============== S U B R O U T I N E =======================================
_build_something:
JSR _build_cur_constr_cursor_area ; put this tile to the map
JSR _rebend_bulding_nearest_tiles ; re-bend surrounding tiles (roads, electrics)
JSR _get_build_invalidate_area ; invalidate area request for new building
LDA #$FF
STA _hud_money_redraw_req ; also update request for decreased money
RTS
; OPTIMIZED, merged code
; =============== S U B R O U T I N E =======================================
_prev_tile_test:
LDA _pad0_held ; here we start to build single tiled objects
CMP _pad0_prev_held ; areas - roads, rails, electrics
BNE .something_changed ; buttons changes, test if we need to do something
LDA _constr_cursor_tile._COL ; as well as cursor position changed
CMP _prev_constr_cursor_tile._COL
BNE .something_changed
LDA _constr_cursor_tile._ROW
CMP _prev_constr_cursor_tile._ROW
.something_changed:
RTS
; =============== S U B R O U T I N E =======================================
_build_garden_area:
; REDUNDANT, merged
; LDA _pad0_held
; CMP _pad0_prev_held
; BNE loc_136389
; LDA _constr_cursor_tile._COL
; CMP _prev_constr_cursor_tile._COL
; BNE loc_136389
; LDA _constr_cursor_tile._ROW
; CMP _prev_constr_cursor_tile._ROW
JSR _prev_tile_test
BEQ _store_prev_cursor_and_exit ; jump up to common code
;loc_136389:
; REDUNDANT, merged
; JSR _get_cur_building_price ; garden area not need much complex bending
; JSR _get_cur_constr_cursor_map_tile ; logic, just test if we could build something
; FJSRA _is_build_available_here,PRG7,PRGD
JSR _is_it_possible_to_build ; OPTIMIZED, merged
BCS .cant_build_anything_beep
; REDUNDANT, merged
; JSR _build_cur_constr_cursor_area ; put garden tile
; JSR _rebend_bulding_nearest_tiles
; JSR _get_build_invalidate_area
; LDA #$FF
; STA _hud_money_redraw_req
JSR _build_something ; OPTIMIZED, merged
APUA_SE _SE_IDX_SBUILD
; JSR _store_prev_constr_cursor
; JMP _state17_common
JMP _store_prev_cursor_and_exit
; =============== S U B R O U T I N E =======================================
_is_it_possible_to_build:
JSR _get_cur_building_price ; garden area not need much complex bending
JSR _get_cur_constr_cursor_map_tile ; logic, just test if we could build something
FJSRA _is_build_available_here,PRG7,PRGD
RTS
; =============== S U B R O U T I N E =======================================
_bulid_large_buildings:
LDA _pad0_press ; not using held code, press only so we
BPL .large_build_exit ; don't need to prevent from build to prev tile
LDA _constr_palette_selected_idx ; test if we build a presents
CMP #$0D
BNE loc_1363BE
LDA _constr_palette_flags ; test if prize button enabled
AND #$02
BNE .cant_build_anything_beep
loc_1363BE:
; JSR _get_cur_building_price ; REDUNDANT, merged
; JSR _get_cur_constr_cursor_map_tile
; FJSRA _is_build_available_here,PRG7,PRGD
JSR _is_it_possible_to_build ; OPTIMIZED, merged
BCS .cant_build_anything_beep
; REDUNDANT, merged
; JSR _build_cur_constr_cursor_area
; JSR _rebend_bulding_nearest_tiles
; JSR _get_build_invalidate_area
; LDA #$FF
; STA _hud_money_redraw_req
JSR _build_something ; OPTIMIZED, merged
APUA_SE _SE_IDX_LBUILD
JSR _bank_build_year_init ; special case when we build a bank
JSR _present_remove_from_list ; special case for presents built
LDA _constr_palette_selected_idx
CMP #$0D
BNE .large_build_exit
LDA #$FF
STA _hud_build_name_draw_req ; also refresh present name on HUD
BNE .large_build_exit ; for other buildings here are no changes
.cant_build_anything_beep:
APUA_SE _SE_IDX_ERROR
.large_build_exit:
; JSR _store_prev_constr_cursor ; REDUNDANT, we dont test it here
JMP _state17_common
; =============== S U B R O U T I N E =======================================
_bulldoze_area:
; REDUNDANT, this routine is actually redundant, because the bulldoze price
; is calculated later in _do_bulldoze routine and overwrites this value
; JSR _get_cur_building_price
; NOTE: there is no test for previous tile already set, so when you bulldoze
; the large buildings, and keep holding the A button, you'll erase immediately
; rubble tile!
JSR _prev_tile_test ; FIX, to avoid mentioned above
BEQ .skip ; -
JSR _do_bulldoze ; attempt to bulldoze
BCS .fail
JSR _rebend_bulldoze_nearest_tiles ; fix conjuncted tiles
JSR _get_bulldoze_invalidate_area ; also invalidate area after bulldoze
LDA #$FF
STA _hud_money_redraw_req ; again money redraw
LDX _cur_bulldoze_size
DEX
BEQ .no_corrupt_anim ; if more than simgle tile selected
INC _corruption_anim_req ; set corrup anim request
APUA_SE _SE_IDX_DESTROY ; play destroy sound
BNE .skip
; JMP _state17_common
.no_corrupt_anim:
APUA_SE _SE_IDX_BULLDOZE ; for single tiles just play simple sound
BNE .skip
; JMP _state17_common
.fail:
LDA _bulldoze_error_beep_flag
BNE .skip
APUA_SE _SE_IDX_ERROR ; when no bulldoze, play error sound if needed
.skip:
; JMP _state17_common
JMP _store_prev_cursor_and_exit ; FIX, to support mentioned above
; =============== S U B R O U T I N E =======================================
_store_prev_constr_cursor:
LDA _constr_cursor_tile._COL
STA _prev_constr_cursor_tile._COL
LDA _constr_cursor_tile._ROW
STA _prev_constr_cursor_tile._ROW
RTS
; =============== S U B R O U T I N E =======================================
_state04_game_field_redraw:
JSR _game_field_redraw ; redraw the game field area
JMP _state17_common
; =============== S U B R O U T I N E =======================================
_state05_constr_palette_update:
JSR _constr_palette_update ; update button state for constr palette
JMP _state17_common ; drawn previously as a static bitmap
; =============== S U B R O U T I N E =======================================
_state06_screen_refresh:
; JSR _buffers_test_flush
; BCS loc_136472
JSR _buffers_test_flush ; OPTIMIZED, merged
BNE loc_136472
; REDUNDANT, merged
; LDA _cur_map_wnd_pos._COL ; does only a chain of requests
; STA _update_rect_left ; to update game field and hud info
; CLC ; calculate game field area to refresh
; ADC #$18 ;
; STA _update_rect_right
; LDA _cur_map_wnd_pos._ROW
; STA _update_rect_top
; CLC
; ADC #$14
; STA _update_rect_bottom
; LDA #$FF
; STA _full_game_field_redraw_req ; set full game field refresh request
JSR _full_game_field_refresh_set ; OPTIMIZED, merged
LDA #$00
STA _screen_refresh_req ; clear this request
LDA #$FF ; set hud dinamic params refresh requests flags
STA _RCI_meter_redraw_req ; all will be refreshed one by one
STA _hud_date_redraw_req
STA _hud_popul_redraw_req
STA _hud_city_name_redraw_req
STA _hud_money_redraw_req
JSR _seasonal_pal_load ; update palette
loc_136472:
JMP _state17_common
; =============== S U B R O U T I N E =======================================
_full_game_field_refresh_set:
LDA _cur_map_wnd_pos._COL ; does only a chain of requests
STA _update_rect_left ; to update game field and hud info
CLC ; calculate game field area to refresh
ADC #$18 ;
STA _update_rect_right
LDA _cur_map_wnd_pos._ROW
STA _update_rect_top
CLC
ADC #$14
STA _update_rect_bottom
LDA #$FF
STA _full_game_field_redraw_req ; set full game field refresh request
RTS
; =============== S U B R O U T I N E =======================================
_state0A_power_build_menu:
; JSR _buffers_test_flush ; self-describing routine
; BCS loc_136482
JSR _buffers_test_flush ; OPTIMIZED, merged
BNE loc_136482
JSR _power_build_menu
LDA #$00
STA _power_build_menu_req ; when done, clear request
loc_136482:
JMP _state17_common
; =============== S U B R O U T I N E =======================================
_state0B_gui_ctrl_menu:
JSR _spr_clear
LDA #$00
STA _wnd_lvl_idx
LDA _gui_ctrl_menu_press_idx ; load selected menu wnd idx
STA _wnd_idx
CMP #$05
BEQ _game_msg_wnd_display ; a special case, game hint wnd
CMP #$06
BNE .regular_config_menu
JSR _goto_start ; also special case for goto button
LDA #$00
STA _game_msg_wnd_active_flag
JMP _state17_common
.regular_config_menu:
ASL
TAX
LDA _city._menu_pos,X ; read dinamic settings for wnd positions
STA _wnd_left_tile
INX
LDA _city._menu_pos,X
STA _wnd_top_tile
JSR _gui_ctrl_menu_icon_push_draw ; push button animate
JSR _wnd_draw ; draw window
JSR _gui_ctrl_menu_input ; generic menu input test
BCS loc_1364C9
JSR _wnd_erase ; menu cancelled
JSR _gui_ctrl_menu_icon_release_draw
LDA #$00
STA _game_msg_wnd_active_flag
JMP _state17_common
loc_1364C9:
LDX _wnd_idx ; if selection is done
CPX #$03 ; test if this were a info maps menu
; BEQ loc_1364DA ; REDUNDANT, case for confog menus which
; LDA #$00 ; returning an option indexes upon item selections
; STA _game_msg_wnd_active_flag ; however, there are no other such menus here except
; JSR _game_chr_common_reload ; info screens menu
; JMP _state17_common
;loc_1364DA:
STA _scr_res_idx ; store info screen index and open common
LDA #$02 ; routine to draw this screen
STA _scr_mode_idx
JSR _pal_fade_out
FJSRA _scr_res_common,SRAM,PRG9
LDA #$00
STA _game_msg_wnd_active_flag ; restore the full game screen, other parameters and
JSR _game_chr_common_reload ; continue to the game
JSR _full_screen_redraw
JSR _scroll_msg_reset
LDA #$00
STA _scr_mode_idx
STA _screen_pal_cur_spr_idx
JSR _seasonal_pal_load
JSR _pal_fade_in
JMP _state17_common
; =============== S U B R O U T I N E =======================================
_state13_msg_wnd_display:
INC _game_msg_wnd_active_flag ; automatic lock if we get here by engine request
; =============== S U B R O U T I N E =======================================
_game_msg_wnd_display:
; WHERE BUG? sometimes scroller line not cleared completely, at least one letter
; may appear. can't reproduce it for sure, very hard to catch and seems random
;
JSR _clear_scroll_area ; otherwise lock is set manually in other code
JSR _wait_for_nmi ; maybe we should wait here untill buffers are empty instead?
LDA #$05 ; it is possible to incomplete dequeue process for 1 frame?
STA _gui_ctrl_menu_press_idx
JSR _gui_ctrl_menu_icon_push_draw ; special push draw for hint message
FJSRA _game_msg_handler,PRG4,PRG3 ; display hint window, index already set or =0
JSR _gui_ctrl_menu_icon_release_draw; release pushed button
JSR _scroll_msg_reset ; clear scroller messages
LDA _debug_scroll_msg_flags ; also test if we triggered debug, so we reload
CMP #$03 ; scroller active with a special value
BNE loc_136530
STA _scroll_msg_active_flag
loc_136530:
LDA #$00
STA _game_msg_wnd_active_flag ; clear requests
STA _game_msg_awaits_flag
JMP _state17_common
; =============== S U B R O U T I N E =======================================
_clear_scroll_area:
LDA _cur_screen_tile._ROW ; calculate current position
LSR ; of scroll area
CLC ; then fill it with 32 spaces to
ADC #$1B ; clear scroller
CMP #$1E
BCC loc_1500BA
SBC #$1E
loc_1500BA:
LDX #$20
MULXA
STA _ptr0
TXA
CLC
ADC #$20
STA _ptr0+1
PPUQSTART
PPUQMOVB _ptr0,OP_NOP,0
PPUQMOVB _ptr0+1,OP_NOP,0
LDA #$20
TAY
PPUQMOVA
LDA #$DF
loc_1500E7:
PPUQMOVA
DEY
BNE loc_1500E7
PPUQEND
RTS
; =============== S U B R O U T I N E =======================================
_state0C_RCI_meter_redraw:
; JSR _buffers_test_flush
; BCS loc_136548
JSR _buffers_test_flush ; OPTIMIZED, merged
BNE loc_136548
JSR _RCI_meters_draw
LDA #$00
STA _RCI_meter_redraw_req
loc_136548:
JMP _state17_common
; =============== S U B R O U T I N E =======================================
_state0D_hud_date_redraw:
; JSR _buffers_test_flush
; BCS loc_13655C
JSR _buffers_test_flush ; OPTIMIZED, merged
BNE loc_13655C
; FJSRA _hud_date_draw,PRG7,PRG3
JSR _hud_date_draw
LDA #$00
STA _hud_date_redraw_req
loc_13655C:
JMP _state17_common
; =============== S U B R O U T I N E =======================================
_state0E_idle_state:
; JSR _buffers_test_flush
; BCS loc_136582
JSR _buffers_test_flush ; OPTIMIZED, merged
BNE loc_136582
INC _map_bg_anim_counter ; increase animation counter for
; REDUNDANT, merged
; LDA _cur_map_wnd_pos._COL ; map bg objects
; STA _update_rect_left
; CLC
; ADC #$18
; STA _update_rect_right
; LDA _cur_map_wnd_pos._ROW
; STA _update_rect_top
; CLC
; ADC #$14
; STA _update_rect_bottom
; LDA #$FF
; STA _full_game_field_redraw_req
JSR _full_game_field_refresh_set ; OPTIMIZED, merged
LDA #$00
STA _game_core_stop_flag ; idle state periodically refreshes the game field
loc_136582:
JMP _state17_common
; =============== S U B R O U T I N E =======================================
_state0F_hud_money_redraw:
; JSR _buffers_test_flush
; BCS loc_136595
JSR _buffers_test_flush ; OPTIMIZED, merged
BNE loc_136595
; FJSRA _hud_money_draw,PRGC,PRG3
JSR _hud_money_draw
LDA #$00
STA _hud_money_redraw_req
loc_136595:
JMP _state17_common
; =============== S U B R O U T I N E =======================================
_state10_budget_screen:
; JSR _buffers_test_flush
; BCS loc_1365C8
JSR _buffers_test_flush ; OPTIMIZED, merged
BNE loc_1365C8
LDA #$02
STA _scr_res_idx
STA _scr_mode_idx
JSR _pal_fade_out
FJSRA _scr_res_common,SRAM,PRG9 ; displays the budget screen
JSR _full_screen_redraw
LDA #$00
STA _scr_mode_idx
STA _screen_pal_cur_spr_idx
JSR _seasonal_pal_load
JSR _pal_fade_in
JSR _scroll_msg_reset
LDA #$00
STA _budget_scr_draw_req
STA _cur_game_cursor_area
loc_1365C8:
JMP _state17_common
; =============== S U B R O U T I N E =======================================
_state11_hud_popul_redraw:
; JSR _buffers_test_flush
; BCS loc_1365DC
JSR _buffers_test_flush ; OPTIMIZED, merged
BNE loc_1365DC
; FJSRA _hud_popul_draw,PRG7,PRG3
JSR _hud_popul_draw
LDA #$00
STA _hud_popul_redraw_req
loc_1365DC:
JMP _state17_common
; =============== S U B R O U T I N E =======================================
_state12_airport_build_menu:
; JSR _buffers_test_flush
; BCS loc_1365EC
JSR _buffers_test_flush ; OPTIMIZED, merged
BNE loc_1365EC
JSR _airport_build_menu
LDA #$00
STA _airport_build_menu_req
loc_1365EC:
JMP _state17_common
; =============== S U B R O U T I N E =======================================
_state16_hud_city_name_redraw:
; JSR _buffers_test_flush
; BCS loc_136600
JSR _buffers_test_flush ; OPTIMIZED, merged
BNE loc_136600
; FJSRA _hud_city_name_draw,PRG7,PRG3
JSR _hud_city_name_draw
LDA #$00
STA _hud_city_name_redraw_req
loc_136600:
; JMP _state17_common ; REDUNDANT
; !FALLTHROUGH!
; =============== S U B R O U T I N E =======================================
_state17_common:
JSR _game_cursor_input_control ; do common background work
JSR _spr_finish
JSR _auto_goto_test
FJSRA _constr_palette_state_update,PRG7,PRG3
LDA _ppu_queue_pos_tail ; calc ppu queues buffers fill
SEC ; then use it in overall test for
SBC _ppu_queue_pos_head ; idle state
STA _ptr0
LDA _extnt_queue_pos_tail
SEC
SBC _extnt_queue_pos_head
STA _ptr0+1
LDA _gui_active_controls_flags ; test for idle state, checking if
EOR #$03 ; any of critical state flags arent
ORA _ptr0 ; clear, so mean there is some pending
ORA _ptr0+1 ; requests still
ORA _hud_redraw_req
ORA _constr_palette_redraw_req
; ORA byte_3B ; REDUNDANT, never written
ORA _constr_palette_update_req
ORA _hud_build_name_draw_req
ORA _RCI_meter_redraw_req
ORA _hud_date_redraw_req
ORA _hud_popul_redraw_req
ORA _hud_city_name_redraw_req
ORA _game_core_stop_flag
ORA _hud_money_redraw_req
ORA _scroll_msg_active_flag
; STA byte_37 ; REDUNDANT, never read!
ORA _build_game_field_update_req
ORA _screen_refresh_req
ORA _game_msg_wnd_active_flag
ORA _budget_scr_draw_req
STA _game_core_state ; any of these flags gives priority to this thread
JMP _MAIN_LOOP
; =============== S U B R O U T I N E =======================================
_states_select:
LDA _budget_scr_draw_req
BEQ loc_136610
LDA #_state10_budget_screen_sidx
JMP .set_game_state_idx
loc_136610:
LDA _scr_mode_idx ; full map scroll mode request
CMP #$01
BNE loc_13661B
LDA #_state02_map_scroll_sidx
JMP .set_game_state_idx
loc_13661B:
LDA _game_msg_wnd_active_flag
BEQ loc_136625
LDA #_state0B_gui_ctrl_menu_sidx
JMP .set_game_state_idx
loc_136625:
LDA _build_game_field_update_req ; one of two game field redraw requests, set and
BEQ loc_13662E ; clear usually at the same time, but the first one
LDA #_state04_game_field_redraw_sidx; is set when you build something and has a priority
JMP .set_game_state_idx ; or idle screen updates
loc_13662E:
LDA _hud_redraw_req ; keep state of hud redraw till the end
; REDUNDANT
; BEQ loc_136637
; LDA #_state00_hud_redraw_sidx
; JMP .set_game_state_idx
;loc_136637:
BNE loc_136637 ; OPTIMIZED
LDA _constr_palette_redraw_req ; also keep state of pal redraw till the end
; REDUNDANT
; BEQ loc_136640
; LDA #_state01_constr_palette_redraw_sidx
; JMP .set_game_state_idx ; full redraw constr palette frame
;loc_136640:
BNE loc_136640 ; OPTIMIZED