-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathBank $A3.asm
10369 lines (8924 loc) · 437 KB
/
Bank $A3.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
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
;;; $8000..8686: Common to all enemy banks ;;;
{
; See bank $A0
}
;;; $8687..88EF: Waver ;;;
{
;;; $8687: Palette - enemy $D63F (waver) ;;;
{
$A3:8687 dw 3800, 72FA, 55B0, 2845, 1801, 6210, 496B, 38C6, 2C63, 241F, 1C17, 142F, 0C47, 3BE0, 2680, 1580
}
;;; $86A7..DA: Instruction lists - waver ;;;
{
;;; $86A7: Instruction list - steady - facing left ;;;
{
$A3:86A7 dx 0001,884A,
812F ; Sleep
}
;;; $86AD: Instruction list - steady - facing right ;;;
{
$A3:86AD dx 0001,88B3,
812F ; Sleep
}
;;; $86B3: Instruction list - spinning - facing left ;;;
{
$A3:86B3 dx 0008,885B,
0008,8871,
0008,881E,
0008,8834,
86E3, ; Set spin finished flag
812F ; Sleep
}
;;; $86C7: Instruction list - spinning - facing right ;;;
{
$A3:86C7 dx 0008,88C4,
0008,88DA,
0008,8887,
0008,889D,
86E3, ; Set spin finished flag
812F ; Sleep
}
}
;;; $86DB: Instruction list pointers ;;;
{
; Indexed by [enemy $0FAC]
$A3:86DB dw 86A7, 86AD, 86B3, 86C7
}
;;; $86E3: Instruction - set spin finished flag ;;;
{
$A3:86E3 AE 54 0E LDX $0E54 [$7E:0E54]
$A3:86E6 A9 01 00 LDA #$0001 ;\
$A3:86E9 9D B0 0F STA $0FB0,x[$7E:0FB0] ;} Enemy spin finished flag = 1
$A3:86EC 6B RTL
}
;;; $86ED: Initialisation AI - enemy $D63F (waver) ;;;
{
$A3:86ED AE 54 0E LDX $0E54 [$7E:0E54]
$A3:86F0 A9 80 01 LDA #$0180 ;\
$A3:86F3 29 00 FF AND #$FF00 ;|
$A3:86F6 EB XBA ;|
$A3:86F7 9D AA 0F STA $0FAA,x[$7E:0FAA] ;|
$A3:86FA A9 80 01 LDA #$0180 ;} Enemy X velocity = 1.80h
$A3:86FD 29 FF 00 AND #$00FF ;|
$A3:8700 EB XBA ;|
$A3:8701 9D A8 0F STA $0FA8,x[$7E:0FA8] ;/
$A3:8704 BD B4 0F LDA $0FB4,x[$7E:0FB4] ;\
$A3:8707 29 01 00 AND #$0001 ;} If [enemy parameter 1] & 1 = 0:
$A3:870A D0 24 BNE $24 [$8730] ;/
$A3:870C A9 80 01 LDA #$0180 ;\
$A3:870F 49 FF FF EOR #$FFFF ;|
$A3:8712 1A INC A ;|
$A3:8713 29 00 FF AND #$FF00 ;|
$A3:8716 EB XBA ;|
$A3:8717 22 EA AF A0 JSL $A0AFEA[$A0:AFEA] ;|
$A3:871B 9D AA 0F STA $0FAA,x[$7E:0FEA] ;|
$A3:871E A9 80 01 LDA #$0180 ;} Enemy X velocity = -1.80h
$A3:8721 49 FF FF EOR #$FFFF ;|
$A3:8724 1A INC A ;|
$A3:8725 29 FF 00 AND #$00FF ;|
$A3:8728 EB XBA ;|
$A3:8729 22 EA AF A0 JSL $A0AFEA[$A0:AFEA] ;|
$A3:872D 9D A8 0F STA $0FA8,x[$7E:0FE8] ;/
$A3:8730 9E B2 0F STZ $0FB2,x[$7E:0FB2]
$A3:8733 9E AC 0F STZ $0FAC,x[$7E:0FAC] ; Enemy instruction list index = 0
$A3:8736 9E B0 0F STZ $0FB0,x[$7E:0FB0] ; Enemy $0FB0 = 0
$A3:8739 A9 A7 86 LDA #$86A7 ;\
$A3:873C 9D 92 0F STA $0F92,x[$7E:0F92] ;} Enemy instruction list pointer = $86A7
$A3:873F BD B4 0F LDA $0FB4,x[$7E:0FB4] ;\
$A3:8742 29 01 00 AND #$0001 ;} Enemy new instruction list index = [enemy parameter 1] & 1
$A3:8745 9D B2 0F STA $0FB2,x[$7E:0FB2] ;/
$A3:8748 20 FE 87 JSR $87FE [$A3:87FE] ; Set waver instruction list
$A3:874B 6B RTL
}
;;; $874C: Main AI - enemy $D63F (waver) ;;;
{
$A3:874C AE 54 0E LDX $0E54 [$7E:0E54]
$A3:874F BD A8 0F LDA $0FA8,x[$7E:0FA8] ;\
$A3:8752 85 12 STA $12 [$7E:0012] ;|
$A3:8754 BD AA 0F LDA $0FAA,x[$7E:0FAA] ;} Move enemy right by [enemy X velocity]
$A3:8757 85 14 STA $14 [$7E:0014] ;|
$A3:8759 22 AB C6 A0 JSL $A0C6AB[$A0:C6AB] ;/
$A3:875D 90 37 BCC $37 [$8796] ; If collided with wall:
$A3:875F BD A9 0F LDA $0FA9,x[$7E:1029] ;\
$A3:8762 85 12 STA $12 [$7E:0012] ;|
$A3:8764 49 FF FF EOR #$FFFF ;|
$A3:8767 1A INC A ;|
$A3:8768 29 00 FF AND #$FF00 ;|
$A3:876B EB XBA ;|
$A3:876C 22 EA AF A0 JSL $A0AFEA[$A0:AFEA] ;|
$A3:8770 9D AA 0F STA $0FAA,x[$7E:102A] ;; Negate enemy X velocity
$A3:8773 A5 12 LDA $12 [$7E:0012] ;|
$A3:8775 49 FF FF EOR #$FFFF ;|
$A3:8778 1A INC A ;|
$A3:8779 29 FF 00 AND #$00FF ;|
$A3:877C EB XBA ;|
$A3:877D 22 EA AF A0 JSL $A0AFEA[$A0:AFEA] ;|
$A3:8781 9D A8 0F STA $0FA8,x[$7E:1028] ;/
$A3:8784 BD B2 0F LDA $0FB2,x[$7E:1032] ;\
$A3:8787 49 01 00 EOR #$0001 ;} Enemy new instruction list index ^= 1
$A3:878A 29 01 00 AND #$0001 ;\
$A3:878D 9D B2 0F STA $0FB2,x[$7E:1032] ;} Enemy new instruction list index &= 1 (steady)
$A3:8790 20 FE 87 JSR $87FE [$A3:87FE] ; Set waver instruction list
$A3:8793 4C CF 87 JMP $87CF [$A3:87CF] ; Go to BRANCH_MERGE
$A3:8796 A9 04 00 LDA #$0004 ;\
$A3:8799 8D 32 0E STA $0E32 [$7E:0E32] ;|
$A3:879C BD AE 0F LDA $0FAE,x[$7E:0FAE] ;} A = 4 * -sin([enemy angle] * pi / 80h)
$A3:879F 29 FF 00 AND #$00FF ;|
$A3:87A2 22 C6 B0 A0 JSL $A0B0C6[$A0:B0C6] ;/
$A3:87A6 85 14 STA $14 [$7E:0014] ;\
$A3:87A8 64 12 STZ $12 [$7E:0012] ;} Move enemy down by [A]
$A3:87AA 22 86 C7 A0 JSL $A0C786[$A0:C786] ;/
$A3:87AE 90 12 BCC $12 [$87C2] ; If collided with block:
$A3:87B0 AE 54 0E LDX $0E54 [$7E:0E54]
$A3:87B3 BD AE 0F LDA $0FAE,x[$7E:0FEE] ;\
$A3:87B6 18 CLC ;|
$A3:87B7 69 80 00 ADC #$0080 ;} Enemy angle = ([enemy angle] + 80h) % 100h
$A3:87BA 29 FF 00 AND #$00FF ;|
$A3:87BD 9D AE 0F STA $0FAE,x[$7E:0FEE] ;/
$A3:87C0 80 0D BRA $0D [$87CF]
$A3:87C2 AE 54 0E LDX $0E54 [$7E:0E54] ; Else (not collided with block):
$A3:87C5 BD AE 0F LDA $0FAE,x[$7E:0FAE] ;\
$A3:87C8 18 CLC ;|
$A3:87C9 69 02 00 ADC #$0002 ;} Enemy angle += 2
$A3:87CC 9D AE 0F STA $0FAE,x[$7E:0FAE] ;/
; BRANCH_MERGE
$A3:87CF AE 54 0E LDX $0E54 [$7E:0E54]
$A3:87D2 BD AE 0F LDA $0FAE,x[$7E:0FAE] ;\
$A3:87D5 29 7F 00 AND #$007F ;|
$A3:87D8 C9 38 00 CMP #$0038 ;} If [enemy angle] % 80h = 38h:
$A3:87DB D0 0C BNE $0C [$87E9] ;/
$A3:87DD BD B2 0F LDA $0FB2,x[$7E:0FB2] ;\
$A3:87E0 09 02 00 ORA #$0002 ;} Enemy new instruction list index |= 2 (spinning)
$A3:87E3 9D B2 0F STA $0FB2,x[$7E:0FB2] ;/
$A3:87E6 20 FE 87 JSR $87FE [$A3:87FE] ; Set waver instruction list
$A3:87E9 BD B0 0F LDA $0FB0,x[$7E:0FB0] ;\
$A3:87EC F0 0F BEQ $0F [$87FD] ;} If [enemy spin finished flag] != 0:
$A3:87EE 9E B0 0F STZ $0FB0,x[$7E:0FB0] ; Enemy spin finished flag = 0
$A3:87F1 BD B2 0F LDA $0FB2,x[$7E:0FB2] ;\
$A3:87F4 29 01 00 AND #$0001 ;} Enemy new instruction list index &= 1 (steady)
$A3:87F7 9D B2 0F STA $0FB2,x[$7E:0FB2] ;/
$A3:87FA 20 FE 87 JSR $87FE [$A3:87FE] ; Set waver instruction list
$A3:87FD 6B RTL
}
;;; $87FE: Set waver instruction list ;;;
{
$A3:87FE AE 54 0E LDX $0E54 [$7E:0E54]
$A3:8801 BD B2 0F LDA $0FB2,x[$7E:0FB2] ;\
$A3:8804 DD AC 0F CMP $0FAC,x[$7E:0FAC] ;} If [enemy new instruction list index] = [enemy instruction list index]: return
$A3:8807 F0 14 BEQ $14 [$881D] ;/
$A3:8809 9D AC 0F STA $0FAC,x[$7E:0FAC] ; Enemy instruction list index = [enemy new instruction list index]
$A3:880C 0A ASL A ;\
$A3:880D A8 TAY ;|
$A3:880E B9 DB 86 LDA $86DB,y[$A3:86DD] ;} Enemy instruction list pointer = [$86DB + [enemy instruction list index] * 2]
$A3:8811 9D 92 0F STA $0F92,x[$7E:0F92] ;/
$A3:8814 A9 01 00 LDA #$0001 ;\
$A3:8817 9D 94 0F STA $0F94,x[$7E:0F94] ;} Enemy instruction timer = 1
$A3:881A 9E 90 0F STZ $0F90,x[$7E:0F90] ; Enemy timer = 0
$A3:881D 60 RTS
}
;;; $881E: Spritemaps - waver ;;;
{
$A3:881E dx 0004, 0000,08,2122, 01F8,08,2121, 8000,F8,2102, 81F0,F8,2100
$A3:8834 dx 0004, 01ED,FC,2124, 0005,00,2116, 0005,F8,2106, 81F5,F8,2104
$A3:884A dx 0003, 01ED,FD,2126, 01F5,FD,2127, 81FD,F8,2107
$A3:885B dx 0004, 01EC,FC,2129, 0004,00,211B, 0004,F8,210B, 81F4,F8,2109
$A3:8871 dx 0004, 0000,08,212E, 01F8,08,212D, 8000,F8,210E, 81F0,F8,210C
$A3:8887 dx 0004, 01F8,08,6122, 0000,08,6121, 81F0,F8,6102, 8000,F8,6100
$A3:889D dx 0004, 000B,FC,6124, 01F3,00,6116, 01F3,F8,6106, 81FB,F8,6104
$A3:88B3 dx 0003, 000B,FD,6126, 0003,FD,6127, 81F3,F8,6107
$A3:88C4 dx 0004, 000C,FC,6129, 01F4,00,611B, 01F4,F8,610B, 81FC,F8,6109
$A3:88DA dx 0004, 01F8,08,612E, 0000,08,612D, 81F0,F8,610E, 8000,F8,610C
}
}
;;; $88F0..8C0E: Metaree ;;;
{
;;; $88F0: Palette - enemy $D67F (metaree) ;;;
{
$A3:88F0 dw 3800, 4D1F, 38B6, 246E, 1448, 47FF, 2EFA, 1616, 0132, 6F39, 5A73, 41AD, 2D08, 1863, 7FFF, 0041
}
;;; $8910: Instruction list - idling ;;;
{
$A3:8910 dx 000A,8B65,
000A,8BB9,
000A,8BDE,
000A,8BEA,
80ED,8910 ; Go to $8910
}
;;; $8924: Instruction list - prepare to launch attack ;;;
{
$A3:8924 dx 0010,8B65,
0008,8B94,
8956, ; Set attack ready flag
812F ; Sleep
}
;;; $8930: Instruction list - launched attack ;;;
{
$A3:8930 dx 8173 ; Enable off-screen processing
$A3:8932 dx 0002,8BB9,
0002,8BDE,
0002,8BEA,
0002,8B65,
80ED,8932 ; Go to $8932
}
;;; $8946: Unused. Instruction list - stop animating ;;;
{
$A3:8946 dx 817D, ; Disable off-screen processing
0001,8B65,
812F ; Sleep
}
;;; $894E: Metaree instruction list pointers ;;;
{
; Indexed by [enemy $0FAE]
$A3:894E dw 8910, 8924, 8930, 8946
}
;;; $8956: Instruction - set attack ready flag ;;;
{
$A3:8956 AE 54 0E LDX $0E54 [$7E:0E54]
$A3:8959 A9 01 00 LDA #$0001
$A3:895C 9D B0 0F STA $0FB0,x[$7E:1030]
$A3:895F 6B RTL
}
;;; $8960: Initialisation AI - enemy $D67F (metaree) ;;;
{
$A3:8960 AE 54 0E LDX $0E54 [$7E:0E54]
$A3:8963 9E AC 0F STZ $0FAC,x[$7E:102C] ; Enemy new instruction list index = 0
$A3:8966 9E AE 0F STZ $0FAE,x[$7E:102E] ; Enemy instruction list index = 0
$A3:8969 9E B0 0F STZ $0FB0,x[$7E:1030] ; Enemy attack ready flag = 0
$A3:896C A9 10 89 LDA #$8910 ;\
$A3:896F 9D 92 0F STA $0F92,x[$7E:1012] ;} Enemy instruction list pointer = $8910 (idling)
$A3:8972 A9 87 89 LDA #$8987 ;\
$A3:8975 9D AA 0F STA $0FAA,x[$7E:102A] ;} Enemy function = $8987 (idling)
$A3:8978 6B RTL
}
;;; $8979: Main AI - enemy $D67F (metaree) ;;;
{
$A3:8979 AE 54 0E LDX $0E54 [$7E:0E54]
$A3:897C 7C AA 0F JMP ($0FAA,x)[$A3:8987]; Go to [enemy function]
}
;;; $897F: Unused. Metaree function pointers ;;;
{
$A3:897F dw 8987, 89D4, 89F3, 8A5C
}
;;; $8987: Metaree function - idling ;;;
{
; BUG: This routine fails to check if the metaree is above Samus before activating it
; Aside from launching the metaree when it arguably shouldn't, this causes the metaree to shoot off-screen / burrow in mid-air (see $89AC)
$A3:8987 AE 54 0E LDX $0E54 [$7E:0E54]
$A3:898A BD 7A 0F LDA $0F7A,x[$7E:0FFA] ;\
$A3:898D 38 SEC ;|
$A3:898E ED F6 0A SBC $0AF6 [$7E:0AF6] ;|
$A3:8991 10 04 BPL $04 [$8997] ;|
$A3:8993 49 FF FF EOR #$FFFF ;} If |[enemy X position] - [Samus X position]| < 48h:
$A3:8996 1A INC A ;|
;|
$A3:8997 C9 48 00 CMP #$0048 ;|
$A3:899A B0 0F BCS $0F [$89AB] ;/
$A3:899C 20 AC 89 JSR $89AC [$A3:89AC] ; Determine metaree Y velocity
$A3:899F FE AC 0F INC $0FAC,x[$7E:102C] ; Enemy new instruction list index = 1 (prepare to launch attack)
$A3:89A2 20 B2 8A JSR $8AB2 [$A3:8AB2] ; Set metaree instruction list pointer
$A3:89A5 A9 D4 89 LDA #$89D4 ;\
$A3:89A8 9D AA 0F STA $0FAA,x[$7E:102A] ;} Enemy function = $89D4 (prepare to launch attack)
$A3:89AB 6B RTL
}
;;; $89AC: Determine metaree Y velocity ;;;
{
; This subroutine assumes [Samus' Y position] >= [enemy Y position]
; If this is not the case, then due to the unsigned nature of division,
; the resulting enemy velocity will be some large value (~AAh) that makes the metaree shoot off-screen in an instant and/or hit the ground from many tiles away
$A3:89AC AD FA 0A LDA $0AFA [$7E:0AFA] ;\
$A3:89AF 38 SEC ;|
$A3:89B0 FD 7E 0F SBC $0F7E,x[$7E:0FFE] ;|
$A3:89B3 8D 04 42 STA $4204 ;|
$A3:89B6 E2 20 SEP #$20 ;|
$A3:89B8 A9 18 LDA #$18 ;|
$A3:89BA 8D 06 42 STA $4206 ;|
$A3:89BD C2 20 REP #$20 ;|
$A3:89BF EA NOP ;|
$A3:89C0 EA NOP ;|
$A3:89C1 EA NOP ;} Enemy Y velocity = 4 + ([Samus Y position] - [enemy Y position]) / 18h % 100h
$A3:89C2 EA NOP ;|
$A3:89C3 EA NOP ;|
$A3:89C4 EA NOP ;|
$A3:89C5 EA NOP ;|
$A3:89C6 AD 14 42 LDA $4214 ;|
$A3:89C9 29 FF 00 AND #$00FF ;|
$A3:89CC 18 CLC ;|
$A3:89CD 69 04 00 ADC #$0004 ;|
$A3:89D0 9D B2 0F STA $0FB2,x[$7E:1032] ;/
$A3:89D3 60 RTS
}
;;; $89D4: Metaree function - prepare to launch attack ;;;
{
$A3:89D4 BD B0 0F LDA $0FB0,x[$7E:1030] ;\
$A3:89D7 F0 19 BEQ $19 [$89F2] ;} If [enemy attack ready flag] = 0: return
$A3:89D9 9E B0 0F STZ $0FB0,x[$7E:1030] ; Enemy attack ready flag = 0
$A3:89DC AE 54 0E LDX $0E54 [$7E:0E54]
$A3:89DF FE AC 0F INC $0FAC,x[$7E:102C] ; Enemy new instruction list index = 2 (launched attack)
$A3:89E2 20 B2 8A JSR $8AB2 [$A3:8AB2] ; Set metaree instruction list pointer
$A3:89E5 A9 F3 89 LDA #$89F3 ;\
$A3:89E8 9D AA 0F STA $0FAA,x[$7E:102A] ;} Enemy function = $89F3 (launched attack)
$A3:89EB A9 5B 00 LDA #$005B ;\
$A3:89EE 22 CB 90 80 JSL $8090CB[$80:90CB] ;} Queue sound 5Bh, sound library 2, max queued sounds allowed = 6 (skree launches attack)
$A3:89F2 6B RTL
}
;;; $89F3: Metaree function - launched attack ;;;
{
$A3:89F3 AE 54 0E LDX $0E54 [$7E:0E54]
$A3:89F6 A9 15 00 LDA #$0015 ;\
$A3:89F9 9D A8 0F STA $0FA8,x[$7E:1028] ;} Enemy burrow timer = 15h
$A3:89FC BD B2 0F LDA $0FB2,x[$7E:1032] ;\
$A3:89FF 85 14 STA $14 [$7E:0014] ;} $14 = [enemy Y velocity]
$A3:8A01 64 12 STZ $12 [$7E:0012] ; $12 = 0
$A3:8A03 BD 86 0F LDA $0F86,x[$7E:1006] ;\
$A3:8A06 09 03 00 ORA #$0003 ;} A = enemy properties = [enemy properties] | 3
$A3:8A09 9D 86 0F STA $0F86,x[$7E:1006] ;/
$A3:8A0C AE 54 0E LDX $0E54 [$7E:0E54]
$A3:8A0F 22 8A BF A0 JSL $A0BF8A[$A0:BF8A] ; Check for downwards "solid" block collision
$A3:8A13 B0 2D BCS $2D [$8A42] ; If collision: go to BRANCH_COLLISION
$A3:8A15 AE 54 0E LDX $0E54 [$7E:0E54]
$A3:8A18 BD 7E 0F LDA $0F7E,x[$7E:0FFE] ;\
$A3:8A1B 18 CLC ;|
$A3:8A1C 7D B2 0F ADC $0FB2,x[$7E:1032] ;} Enemy Y position += [enemy Y velocity]
$A3:8A1F 9D 7E 0F STA $0F7E,x[$7E:0FFE] ;/
$A3:8A22 A9 02 00 LDA #$0002 ;\
$A3:8A25 8D 24 0E STA $0E24 [$7E:0E24] ;} $0E24 = 2 (X velocity)
$A3:8A28 BD 7A 0F LDA $0F7A,x[$7E:0FFA] ;\
$A3:8A2B CD F6 0A CMP $0AF6 [$7E:0AF6] ;} If [enemy X position] >= [Samus X position]:
$A3:8A2E 30 06 BMI $06 [$8A36] ;/
$A3:8A30 A9 FE FF LDA #$FFFE ;\
$A3:8A33 8D 24 0E STA $0E24 [$7E:0E24] ;} $0E24 = -2 (X velocity)
$A3:8A36 BD 7A 0F LDA $0F7A,x[$7E:0FFA] ;\
$A3:8A39 18 CLC ;|
$A3:8A3A 6D 24 0E ADC $0E24 [$7E:0E24] ;} Enemy X position += (X velocity)
$A3:8A3D 9D 7A 0F STA $0F7A,x[$7E:0FFA] ;/
$A3:8A40 80 19 BRA $19 [$8A5B] ; Return
; BRANCH_COLLISION
$A3:8A42 AE 54 0E LDX $0E54 [$7E:0E54]
$A3:8A45 A9 01 00 LDA #$0001 ;\
$A3:8A48 9D 94 0F STA $0F94,x[$7E:1014] ;} Enemy instruction timer = 1
$A3:8A4B 9E 90 0F STZ $0F90,x[$7E:1010] ; Enemy timer = 0
$A3:8A4E A9 5C 8A LDA #$8A5C ;\
$A3:8A51 9D AA 0F STA $0FAA,x[$7E:102A] ;} Enemy function = $8A5C (burrowing)
$A3:8A54 A9 5C 00 LDA #$005C ;\
$A3:8A57 22 CB 90 80 JSL $8090CB[$80:90CB] ;} Queue sound 5Ch, sound library 2, max queued sounds allowed = 6 (skree hits the ground)
$A3:8A5B 6B RTL
}
;;; $8A5C: Metaree function - burrowing ;;;
{
; I have no idea why BRANCH_DELETE does any of those three assignments
$A3:8A5C AE 54 0E LDX $0E54 [$7E:0E54]
$A3:8A5F DE A8 0F DEC $0FA8,x[$7E:1028] ; Decrement enemy burrow timer
$A3:8A62 F0 2E BEQ $2E [$8A92] ; If [enemy burrow timer] = 0: go to BRANCH_DELETE
$A3:8A64 BD A8 0F LDA $0FA8,x[$7E:1028] ;\
$A3:8A67 C9 08 00 CMP #$0008 ;} If [enemy burrow timer] = 8:
$A3:8A6A D0 1F BNE $1F [$8A8B] ;/
$A3:8A6C AE 54 0E LDX $0E54 [$7E:0E54]
$A3:8A6F A0 FA 8B LDY #$8BFA ;\
$A3:8A72 22 27 80 86 JSL $868027[$86:8027] ;} Spawn metaree particle - down-right enemy projectile
$A3:8A76 A0 08 8C LDY #$8C08 ;\
$A3:8A79 22 27 80 86 JSL $868027[$86:8027] ;} Spawn metaree particle - up-right enemy projectile
$A3:8A7D A0 16 8C LDY #$8C16 ;\
$A3:8A80 22 27 80 86 JSL $868027[$86:8027] ;} Spawn metaree particle - down-left enemy projectile
$A3:8A84 A0 24 8C LDY #$8C24 ;\
$A3:8A87 22 27 80 86 JSL $868027[$86:8027] ;} Spawn metaree particle - up-left enemy projectile
$A3:8A8B AE 54 0E LDX $0E54 [$7E:0E54]
$A3:8A8E FE 7E 0F INC $0F7E,x[$7E:0FFE] ; Increment enemy Y position
$A3:8A91 6B RTL ; Return
; BRANCH_DELETE
$A3:8A92 AE 54 0E LDX $0E54 [$7E:0E54]
$A3:8A95 BD 96 0F LDA $0F96,x[$7E:1016] ;\
$A3:8A98 1D 98 0F ORA $0F98,x[$7E:1018] ;} Enemy spawn VRAM tiles index = [enemy palette index] | [enemy VRAM tiles index]
$A3:8A9B 9F 06 70 7E STA $7E7006,x[$7E:7086];/
$A3:8A9F A9 00 0A LDA #$0A00 ;\
$A3:8AA2 9D 96 0F STA $0F96,x[$7E:1016] ;} Enemy palette index = A00h (palette 5)
$A3:8AA5 9E 98 0F STZ $0F98,x[$7E:1018] ; Enemy VRAM tiles index = 0
$A3:8AA8 BD 86 0F LDA $0F86,x[$7E:1006] ;\
$A3:8AAB 09 00 02 ORA #$0200 ;} Flag enemy for deletion
$A3:8AAE 9D 86 0F STA $0F86,x[$7E:1006] ;/
$A3:8AB1 6B RTL
}
;;; $8AB2: Set metaree instruction list pointer ;;;
{
$A3:8AB2 AE 54 0E LDX $0E54 [$7E:0E54]
$A3:8AB5 BD AC 0F LDA $0FAC,x[$7E:102C] ;\
$A3:8AB8 DD AE 0F CMP $0FAE,x[$7E:102E] ;} If [enemy new instruction list index] != [enemy instruction list index]:
$A3:8ABB F0 14 BEQ $14 [$8AD1] ;/
$A3:8ABD 9D AE 0F STA $0FAE,x[$7E:102E] ; Enemy instruction list index = [enemy new instruction list index]
$A3:8AC0 0A ASL A ;\
$A3:8AC1 A8 TAY ;|
$A3:8AC2 B9 4E 89 LDA $894E,y[$A3:8950] ;} Enemy instruction list pointer = [$894E + [enemy instruction list index] * 2]
$A3:8AC5 9D 92 0F STA $0F92,x[$7E:1012] ;/
$A3:8AC8 A9 01 00 LDA #$0001 ;\
$A3:8ACB 9D 94 0F STA $0F94,x[$7E:1014] ;} Enemy instruction timer = 1
$A3:8ACE 9E 90 0F STZ $0F90,x[$7E:1010] ; Enemy timer = 0
$A3:8AD1 60 RTS
}
;;; $8AD2: Unused ;;;
{
$A3:8AD2 dw 8ADC, 8AE6, 8AF0, 8AFA, 8B04
$A3:8ADC dw 0001,0000,FFFE,0008,000C
$A3:8AE6 dw 0001,0000,FFFC,0008,0008
$A3:8AF0 dw 0001,0004,0000,0002,000C
$A3:8AFA dw 0001,0000,0000,0008,0008
$A3:8B04 dw 0001,FFFC,0000,0002,000C
}
;;; $8B0E: RTL ;;;
{
$A3:8B0E 6B RTL
}
;;; $8B0F: Enemy shot - enemy $D67F (metaree) ;;;
{
$A3:8B0F AE 54 0E LDX $0E54 [$7E:0E54]
$A3:8B12 BD 98 0F LDA $0F98,x[$7E:1118] ;\
$A3:8B15 8D 2A 0E STA $0E2A [$7E:0E2A] ;} Metaree particle VRAM tiles index = [enemy VRAM tiles index]
$A3:8B18 BD 96 0F LDA $0F96,x[$7E:1116] ;\
$A3:8B1B 8D 2C 0E STA $0E2C [$7E:0E2C] ;} Metaree particle palette index = [enemy palette index]
$A3:8B1E 22 2D 80 A3 JSL $A3802D[$A3:802D] ; Normal enemy shot AI
$A3:8B22 AE 54 0E LDX $0E54 [$7E:0E54]
$A3:8B25 BD 8C 0F LDA $0F8C,x[$7E:110C] ;\
$A3:8B28 D0 3A BNE $3A [$8B64] ;} If [enemy health] != 0: return
$A3:8B2A AE 54 0E LDX $0E54 [$7E:0E54]
$A3:8B2D AD 2A 0E LDA $0E2A [$7E:0E2A] ;\
$A3:8B30 9D 98 0F STA $0F98,x ;} Enemy VRAM tiles index = [metaree particle VRAM tiles index]
$A3:8B33 AD 2C 0E LDA $0E2C [$7E:0E2C] ;\
$A3:8B36 9D 96 0F STA $0F96,x ;} Enemy palette index = [metaree particle palette index]
$A3:8B39 BD A8 0F LDA $0FA8,x ; A = [enemy burrow timer] <-- A isn't used, zero'd by enemy death routine anyway
$A3:8B3C AE 54 0E LDX $0E54 [$7E:0E54]
$A3:8B3F A0 FA 8B LDY #$8BFA ;\
$A3:8B42 22 27 80 86 JSL $868027[$86:8027] ;} Spawn metaree particle - down-right enemy projectile
$A3:8B46 A0 08 8C LDY #$8C08 ;\
$A3:8B49 22 27 80 86 JSL $868027[$86:8027] ;} Spawn metaree particle - up-right enemy projectile
$A3:8B4D A0 16 8C LDY #$8C16 ;\
$A3:8B50 22 27 80 86 JSL $868027[$86:8027] ;} Spawn metaree particle - down-left enemy projectile
$A3:8B54 A0 24 8C LDY #$8C24 ;\
$A3:8B57 22 27 80 86 JSL $868027[$86:8027] ;} Spawn metaree particle - up-left enemy projectile
$A3:8B5B AE 54 0E LDX $0E54 [$7E:0E54]
$A3:8B5E 9E 98 0F STZ $0F98,x ; Enemy VRAM tiles index = 0
$A3:8B61 9E 96 0F STZ $0F96,x ; Enemy palette index = 0
$A3:8B64 6B RTL
}
;;; $8B65: Metaree spritemaps ;;;
{
$A3:8B65 dx 0009, 0004,F5,6122, 0004,FD,6123, 0004,05,6124, 01F4,05,2124, 01F4,FD,2123, 01F4,F5,2122, 0000,03,2121, 01F8,03,2120, 81F8,F3,2100
$A3:8B94 dx 0007, 0005,03,6127, 01F3,03,2127, 0005,FB,6126, 01F3,FB,2126, 0005,F3,6125, 01F3,F3,2125, 81F8,F3,2102
$A3:8BB9 dx 0007, 81F5,03,2106, 81F5,F3,2104, 0000,03,2121, 81F8,F3,2100, 0000,03,212A, 0000,FB,2129, 0000,F3,2128
$A3:8BDE dx 0002, 81F8,03,210E, 81F8,F3,210C
$A3:8BEA dx 0007, 81FB,03,210A, 81FB,F3,2108, 01F8,03,2120, 81F8,F3,2100, 01F8,03,612A, 01F8,FB,6129, 01F8,F3,6128
}
}
;;; $8C0F..9009: Fireflea ;;;
{
;;; $8C0F: Palette - enemy $D6BF (fireflea) ;;;
{
$A3:8C0F dw 3800, 02FF, 01BF, 000F, 0008, 01BF, 011B, 00BA, 0011, 7F5A, 5D45, 40C3, 2462, 53E9, 3AC6, 1961
}
;;; $8C2F: Instruction list - fireflea ;;;
{
$A3:8C2F dw 0002,8EA5,
0001,8EB6,
0002,8EC7,
0001,8EB6,
0002,8EA5,
0001,8EB6,
0002,8EC7,
0001,8EB6,
0002,8ED8,
0001,8EE9,
0002,8EFA,
0001,8EE9,
0002,8F0B,
0001,8F1C,
0002,8F2D,
0001,8F1C,
0002,8F3E,
0001,8F4F,
0002,8F60,
0001,8F4F,
0002,8F71,
0001,8F82,
0002,8F93,
0001,8F82,
0002,8FA4,
0001,8FB5,
0002,8FC6,
0001,8FB5,
0002,8FD7,
0001,8FE8,
0002,8FF9,
0001,8FE8,
0002,8FA4,
0001,8FB5,
0002,8FC6,
0001,8FB5,
0002,8F71,
0001,8F82,
0002,8F93,
0001,8F82,
0002,8F3E,
0001,8F4F,
0002,8F60,
0001,8F4F,
0002,8F0B,
0001,8F1C,
0002,8F2D,
0001,8F1C,
0002,8ED8,
0001,8EE9,
0002,8EFA,
0001,8EE9,
80ED,8C2F ; Go to $8C2F
}
;;; $8D03: Fireflea data ;;;
{
; Unused
$A3:8D03 dw 1000, 2000, 4000, 6000, 8000, A000, C000, E000
; Unused
$A3:8D13 dw 0001, 2001, 4001, 6001, 8001
; Movement radii. Indexed by [enemy parameter 2 high] * 2
$A3:8D1D dw 0008, 0010, 0018, 0020, 0028, 0030, 0038, 0040
}
;;; $8D2D: Initialisation AI - enemy $D6BF (fireflea) ;;;
{
$A3:8D2D AE 54 0E LDX $0E54 [$7E:0E54]
$A3:8D30 A9 2F 8C LDA #$8C2F ;\
$A3:8D33 9D 92 0F STA $0F92,x[$7E:0F92] ;} Enemy instruction list pointer = $8C2F
$A3:8D36 BD B4 0F LDA $0FB4,x[$7E:0FB4] ;\
$A3:8D39 29 FF 00 AND #$00FF ;} $12 = [enemy parameter 1 low]
$A3:8D3C 85 12 STA $12 [$7E:0012] ;/
$A3:8D3E 29 02 00 AND #$0002 ;\
$A3:8D41 D0 0A BNE $0A [$8D4D] ;} If [enemy parameter 1 low] & 2 = 0 (vertical line pattern):
$A3:8D43 20 75 8D JSR $8D75 [$A3:8D75] ; Set fireflea speed
$A3:8D46 20 9C 8D JSR $8D9C [$A3:8D9C] ; Set fireflea radius
$A3:8D49 20 D7 8D JSR $8DD7 [$A3:8DD7] ; Set fireflea Y extrema
$A3:8D4C 6B RTL ; Return
$A3:8D4D 20 5D 8D JSR $8D5D [$A3:8D5D] ; Set fireflea centre
$A3:8D50 20 6A 8D JSR $8D6A [$A3:8D6A] ; Set initial fireflea angle
$A3:8D53 20 75 8D JSR $8D75 [$A3:8D75] ; Set fireflea speed
$A3:8D56 20 9C 8D JSR $8D9C [$A3:8D9C] ; Set fireflea radius
$A3:8D59 20 AE 8D JSR $8DAE [$A3:8DAE] ; Set initial circling fireflea position
$A3:8D5C 6B RTL
}
;;; $8D5D: Set fireflea centre ;;;
{
$A3:8D5D BD 7A 0F LDA $0F7A,x[$7E:0F7A] ;\
$A3:8D60 9D B0 0F STA $0FB0,x[$7E:0FB0] ;} Enemy X centre = [enemy X position]
$A3:8D63 BD 7E 0F LDA $0F7E,x[$7E:0F7E] ;\
$A3:8D66 9D B2 0F STA $0FB2,x[$7E:0FB2] ;} Enemy Y centre = [enemy Y position]
$A3:8D69 60 RTS
}
;;; $8D6A: Set initial fireflea angle ;;;
{
$A3:8D6A BD B5 0F LDA $0FB5,x[$7E:0FB5] ;\
$A3:8D6D 29 FF 00 AND #$00FF ;|
$A3:8D70 EB XBA ;} Enemy angle = [enemy parameter 1 high] * 100h
$A3:8D71 9D AE 0F STA $0FAE,x[$7E:0FAE] ;/
$A3:8D74 60 RTS
}
;;; $8D75: Set fireflea speed ;;;
{
$A3:8D75 BD B6 0F LDA $0FB6,x[$7E:0FB6] ;\
$A3:8D78 29 FF 00 AND #$00FF ;|
$A3:8D7B 0A ASL A ;|
$A3:8D7C 0A ASL A ;} Y = [enemy parameter 2 low] * 8 (linear speed table index)
$A3:8D7D 0A ASL A ;|
$A3:8D7E A8 TAY ;/
$A3:8D7F A5 12 LDA $12 [$7E:0012] ;\
$A3:8D81 29 01 00 AND #$0001 ;} If [$12] & 1 = 0:
$A3:8D84 D0 04 BNE $04 [$8D8A] ;/
$A3:8D86 C8 INY ;\
$A3:8D87 C8 INY ;|
$A3:8D88 C8 INY ;} Y += 4 (negated speed)
$A3:8D89 C8 INY ;/
$A3:8D8A 98 TYA ;\
$A3:8D8B 9F 04 78 7E STA $7E7804,x[$7E:7804];} Enemy speed table index = [Y]
$A3:8D8F B9 87 81 LDA $8187,y[$A3:820B] ;\
$A3:8D92 9D AA 0F STA $0FAA,x[$7E:0FAA] ;|
$A3:8D95 B9 89 81 LDA $8189,y[$A3:820D] ;} Enemy angle delta = [$8187 + [Y]].[$8187 + [Y] + 2]
$A3:8D98 9D A8 0F STA $0FA8,x[$7E:0FA8] ;/
$A3:8D9B 60 RTS
}
;;; $8D9C: Set fireflea radius ;;;
{
$A3:8D9C BD B7 0F LDA $0FB7,x[$7E:0FB7] ;\
$A3:8D9F 29 FF 00 AND #$00FF ;|
$A3:8DA2 0A ASL A ;|
$A3:8DA3 A8 TAY ;} Enemy radius = [$8D1D + [enemy parameter 2 high] * 2] & FFh
$A3:8DA4 B9 1D 8D LDA $8D1D,y[$A3:8D21] ;|
$A3:8DA7 29 FF 00 AND #$00FF ;|
$A3:8DAA 9D AC 0F STA $0FAC,x[$7E:0FAC] ;/
$A3:8DAD 60 RTS
}
;;; $8DAE: Set initial circling fireflea position ;;;
{
; This seems to be missing a division by 100h of the enemy angle,
; which is of little consequence as the main AI sets the position every frame anyway
$A3:8DAE BD AC 0F LDA $0FAC,x[$7E:0FAC] ;\
$A3:8DB1 8D 32 0E STA $0E32 [$7E:0E32] ;|
$A3:8DB4 BD AE 0F LDA $0FAE,x[$7E:0FAE] ;|
$A3:8DB7 22 B2 B0 A0 JSL $A0B0B2[$A0:B0B2] ;} Enemy X position = [enemy X centre] + [enemy radius] * cos([enemy angle] * pi / 80h)
$A3:8DBB 18 CLC ;|
$A3:8DBC 7D B0 0F ADC $0FB0,x[$7E:0FB0] ;|
$A3:8DBF 9D 7A 0F STA $0F7A,x[$7E:0F7A] ;/
$A3:8DC2 BD AC 0F LDA $0FAC,x[$7E:0FAC] ;\
$A3:8DC5 8D 32 0E STA $0E32 [$7E:0E32] ;|
$A3:8DC8 BD AE 0F LDA $0FAE,x[$7E:0FAE] ;|
$A3:8DCB 22 C6 B0 A0 JSL $A0B0C6[$A0:B0C6] ;} Enemy Y position = [enemy Y centre] + [enemy radius] * -sin([enemy angle] * pi / 80h)
$A3:8DCF 18 CLC ;|
$A3:8DD0 7D B2 0F ADC $0FB2,x[$7E:0FB2] ;|
$A3:8DD3 9D 7E 0F STA $0F7E,x[$7E:0F7E] ;/
$A3:8DD6 60 RTS
}
;;; $8DD7: Set Y fireflea extrema ;;;
{
$A3:8DD7 BD 7E 0F LDA $0F7E,x[$7E:103E] ;\
$A3:8DDA 38 SEC ;|
$A3:8DDB FD AC 0F SBC $0FAC,x[$7E:106C] ;} Enemy minimum Y position = [enemy Y position] - [enemy radius]
$A3:8DDE 9F 00 78 7E STA $7E7800,x[$7E:78C0];/
$A3:8DE2 BD 7E 0F LDA $0F7E,x[$7E:103E] ;\
$A3:8DE5 18 CLC ;|
$A3:8DE6 7D AC 0F ADC $0FAC,x[$7E:106C] ;} Enemy maximum Y position = [enemy Y position] + [enemy radius]
$A3:8DE9 9F 02 78 7E STA $7E7802,x[$7E:78C2];/
$A3:8DED 60 RTS
}
;;; $8DEE: Main AI - enemy $D6BF (fireflea) ;;;
{
$A3:8DEE AE 54 0E LDX $0E54 [$7E:0E54]
$A3:8DF1 BD B4 0F LDA $0FB4,x[$7E:0FB4] ;\
$A3:8DF4 29 02 00 AND #$0002 ;} If [enemy parameter 1 low] & 2 != 0 (circle pattern):
$A3:8DF7 F0 3B BEQ $3B [$8E34] ;/
$A3:8DF9 BD AC 0F LDA $0FAC,x[$7E:0FAC] ;\
$A3:8DFC 8D 32 0E STA $0E32 [$7E:0E32] ;|
$A3:8DFF BD AE 0F LDA $0FAE,x[$7E:0FAE] ;|
$A3:8E02 29 00 FF AND #$FF00 ;|
$A3:8E05 EB XBA ;} Enemy X position = [enemy X centre] + [enemy radius] * cos([enemy angle] * pi / 8000h)
$A3:8E06 22 B2 B0 A0 JSL $A0B0B2[$A0:B0B2] ;|
$A3:8E0A 18 CLC ;|
$A3:8E0B 7D B0 0F ADC $0FB0,x[$7E:0FB0] ;|
$A3:8E0E 9D 7A 0F STA $0F7A,x[$7E:0F7A] ;/
$A3:8E11 BD AC 0F LDA $0FAC,x[$7E:0FAC] ;\
$A3:8E14 8D 32 0E STA $0E32 [$7E:0E32] ;|
$A3:8E17 BD AE 0F LDA $0FAE,x[$7E:0FAE] ;|
$A3:8E1A 29 00 FF AND #$FF00 ;|
$A3:8E1D EB XBA ;} Enemy Y position = [enemy Y centre] + [enemy radius] * -sin([enemy angle] * pi / 8000h)
$A3:8E1E 22 C6 B0 A0 JSL $A0B0C6[$A0:B0C6] ;|
$A3:8E22 18 CLC ;|
$A3:8E23 7D B2 0F ADC $0FB2,x[$7E:0FB2] ;|
$A3:8E26 9D 7E 0F STA $0F7E,x[$7E:0F7E] ;/
$A3:8E29 BD AE 0F LDA $0FAE,x[$7E:0FAE] ;\
$A3:8E2C 18 CLC ;|
$A3:8E2D 7D A9 0F ADC $0FA9,x[$7E:0FA9] ;} Enemy angle += [enemy angle delta] * 100h
$A3:8E30 9D AE 0F STA $0FAE,x[$7E:0FAE] ;/
$A3:8E33 6B RTL ; Return
$A3:8E34 BF 04 78 7E LDA $7E7804,x[$7E:7904];\
$A3:8E38 A8 TAY ;} Y = [enemy speed table index]
$A3:8E39 18 CLC ;\
$A3:8E3A BD 80 0F LDA $0F80,x[$7E:1080] ;|
$A3:8E3D 79 89 81 ADC $8189,y[$A3:81CD] ;|
$A3:8E40 9D 80 0F STA $0F80,x[$7E:1080] ;} Enemy Y position += [$8187 + [Y]].[$8187 + [Y] + 2]
$A3:8E43 BD 7E 0F LDA $0F7E,x[$7E:107E] ;|
$A3:8E46 79 87 81 ADC $8187,y[$A3:81CB] ;|
$A3:8E49 9D 7E 0F STA $0F7E,x[$7E:107E] ;/
$A3:8E4C BD 7E 0F LDA $0F7E,x[$7E:107E] ;\
$A3:8E4F DF 00 78 7E CMP $7E7800,x[$7E:7900];|
$A3:8E53 30 0A BMI $0A [$8E5F] ;|
$A3:8E55 BD 7E 0F LDA $0F7E,x[$7E:107E] ;} If [enemy minimum Y position] <= [enemy Y position] < [enemy maximum Y position]:
$A3:8E58 DF 02 78 7E CMP $7E7802,x[$7E:7902];|
$A3:8E5C 10 01 BPL $01 [$8E5F] ;/
$A3:8E5E 6B RTL ; Return
$A3:8E5F BF 04 78 7E LDA $7E7804,x[$7E:7904];\
$A3:8E63 49 04 00 EOR #$0004 ;} Enemy speed table index ^= 4 (negate speed)
$A3:8E66 9F 04 78 7E STA $7E7804,x[$7E:7904];/
$A3:8E6A 6B RTL
}
;;; $8E6B: Enemy touch - enemy $D6BF (fireflea) ;;;
{
; This code is pretty buggy
; If the enemy is killed by $8023, then it will run the enemy death routine, which clears enemy RAM
; The call at $8E6F then runs the enemy death routine *again*,
; where the enemy death explosion enemy projectile will be referencing this cleared enemy RAM,
; which will cause the explosion to spawn to position (0, 0) with garbage drop chances
; The number of enemies killed will also be incremented one extra time
; If the enemy is not killed by $8023, then the enemy death routine will be run with A = [enemy health] (from $A0:A480),
; in death animation > 4, which gets corrected to 0 (small explosion), so that works out fine by chance
; $177E is used to index $88:B070 by FX code, the table is 6 entries long, so the max index should be Ah
; If you do place 6 fireflea in a room (which vanilla does not do) and kill them all,
; the screen will get bright again because it reads beyond the table,
; which happens to result in a large value that results in the backdrop colour not being solid white
$A3:8E6B 22 23 80 A3 JSL $A38023[$A3:8023] ; Normal enemy touch AI
$A3:8E6F 22 AF A3 A0 JSL $A0A3AF[$A0:A3AF] ; Enemy death (with garbage in A)
$A3:8E73 AD 7E 17 LDA $177E [$7E:177E] ;\
$A3:8E76 18 CLC ;|
$A3:8E77 69 02 00 ADC #$0002 ;} If [fireflea darkness level] < Ch:
$A3:8E7A C9 0E 00 CMP #$000E ;|
$A3:8E7D 10 03 BPL $03 [$8E82] ;/
$A3:8E7F 8D 7E 17 STA $177E [$7E:177E] ; Fireflea darkness level += 2
$A3:8E82 6B RTL
}
;;; $8E83: Power bomb reaction - enemy $D6BF (fireflea) ;;;
{
$A3:8E83 22 37 80 A3 JSL $A38037[$A3:8037] ; Normal enemy power bomb AI
$A3:8E87 80 04 BRA $04 [$8E8D] ; Go to fireflea shared shot reaction
}
;;; $8E89: Enemy shot - enemy $D6BF (fireflea) ;;;
{
$A3:8E89 22 2D 80 A3 JSL $A3802D[$A3:802D] ; Normal enemy shot AI
}
;;; $8E8D: Fireflea shared shot reaction ;;;
{
; See $8E6B for note about fireflea darkness level
$A3:8E8D AE 54 0E LDX $0E54 [$7E:0E54]
$A3:8E90 BD 8C 0F LDA $0F8C,x[$7E:100C] ;\
$A3:8E93 D0 0F BNE $0F [$8EA4] ;} If [enemy health] = 0:
$A3:8E95 AD 7E 17 LDA $177E [$7E:177E] ;\
$A3:8E98 18 CLC ;|
$A3:8E99 69 02 00 ADC #$0002 ;} If [fireflea darkness level] < Ch:
$A3:8E9C C9 0E 00 CMP #$000E ;|
$A3:8E9F 10 03 BPL $03 [$8EA4] ;/
$A3:8EA1 8D 7E 17 STA $177E [$7E:177E] ; Fireflea darkness level += 2
$A3:8EA4 6B RTL
}
;;; $8EA5: Fireflea spritemaps ;;;
{
$A3:8EA5 dx 0003, 81F8,F8,3100, 0001,F6,3121, 01F7,F6,3120
$A3:8EB6 dx 0003, 81F8,F8,3100, 0001,F6,3123, 01F7,F6,3122
$A3:8EC7 dx 0003, 81F8,F8,3100, 0001,F6,3125, 01F7,F6,3124
$A3:8ED8 dx 0003, 81F8,F8,3102, 0001,F6,3121, 01F7,F6,3120
$A3:8EE9 dx 0003, 81F8,F8,3102, 0001,F6,3123, 01F7,F6,3122
$A3:8EFA dx 0003, 81F8,F8,3102, 0001,F6,3125, 01F7,F6,3124
$A3:8F0B dx 0003, 81F8,F8,3104, 0001,F6,3127, 01F7,F6,3126
$A3:8F1C dx 0003, 81F8,F8,3104, 0001,F6,3129, 01F7,F6,3128
$A3:8F2D dx 0003, 81F8,F8,3104, 0001,F6,312B, 01F7,F6,312A
$A3:8F3E dx 0003, 81F8,F8,3106, 0001,F6,3127, 01F7,F6,3126
$A3:8F4F dx 0003, 81F8,F8,3106, 0001,F6,3129, 01F7,F6,3128
$A3:8F60 dx 0003, 81F8,F8,3106, 0001,F6,312B, 01F7,F6,312A
$A3:8F71 dx 0003, 81F8,F8,3108, 0001,F6,3127, 01F7,F6,3126
$A3:8F82 dx 0003, 81F8,F8,3108, 0001,F6,3129, 01F7,F6,3128
$A3:8F93 dx 0003, 81F8,F8,3108, 0001,F6,312B, 01F7,F6,312A
$A3:8FA4 dx 0003, 81F8,F8,310A, 0001,F6,312D, 01F7,F6,312C
$A3:8FB5 dx 0003, 81F8,F8,310A, 0001,F6,312F, 01F7,F6,312E
$A3:8FC6 dx 0003, 81F8,F8,310A, 0001,F6,311F, 01F7,F6,311E
$A3:8FD7 dx 0003, 81F8,F8,310C, 0001,F6,312D, 01F7,F6,312C
$A3:8FE8 dx 0003, 0001,F6,312F, 01F7,F6,312E, 81F8,F8,310C
$A3:8FF9 dx 0003, 0001,F6,311F, 01F7,F6,311E, 81F8,F8,310C
}
}
;;; $900A..94D5: Skultera ;;;
{
;;; $900A: Palette - enemy $D6FF (skultera) ;;;
{
$A3:900A dw 3800, 72FA, 55B0, 2845, 1801, 6210, 496B, 38C6, 2C63, 241F, 1C17, 142F, 0C47, 03FF, 0237, 00D1
}
;;; $902A: Instruction list - swimming left ;;;
{
$A3:902A dw 90A0 ; Enemy layer = 2
$A3:902C dw 000E,928A,
000E,92A5,
000E,92C0,
80ED,902C ; Go to $902C
}
;;; $903C: Instruction list - turning right ;;;
{
$A3:903C dw 000D,92DB,
000A,92F6,
0008,9311,
0006,9327,
0006,933D,
0008,934E,
000A,9364,
000D,937F,
90AA, ; Set turn finished flag
812F ; Sleep
}
;;; $9060: Instruction list - swimming right ;;;
{
$A3:9060 dw 9096 ; Enemy layer = 6
$A3:9062 dw 000E,939A,
000E,93B5,
000E,93D0,
80ED,9062 ; Go to $9062
}
;;; $9072: Instruction list - turning left ;;;
{
$A3:9072 dw 000D,93EB,
000A,9406,
0008,9421,
0006,9437,
0006,944D,
0008,945E,
000A,9474,
000D,948F,
90AA, ; Set turn finished flag
812F ; Sleep
}
;;; $9096: Instruction - enemy layer = 6 ;;;
{
$A3:9096 AE 54 0E LDX $0E54 [$7E:0E54]
$A3:9099 A9 06 00 LDA #$0006
$A3:909C 9D 9A 0F STA $0F9A,x[$7E:0FDA]
$A3:909F 6B RTL
}
;;; $90A0: Instruction - enemy layer = 2 ;;;
{
$A3:90A0 AE 54 0E LDX $0E54 [$7E:0E54]
$A3:90A3 A9 02 00 LDA #$0002
$A3:90A6 9D 9A 0F STA $0F9A,x[$7E:0FDA]
$A3:90A9 6B RTL
}
;;; $90AA: Instruction - set turn finished flag ;;;
{
$A3:90AA AE 54 0E LDX $0E54 [$7E:0E54]
$A3:90AD A9 01 00 LDA #$0001 ;\
$A3:90B0 9F 02 78 7E STA $7E7802,x[$7E:7842];} Enemy turn finished flag = 1
$A3:90B4 6B RTL
}
;;; $90B5: Initialisation AI - enemy $D6FF (skultera) ;;;
{
$A3:90B5 AE 54 0E LDX $0E54 [$7E:0E54]
$A3:90B8 A9 2A 90 LDA #$902A ;\
$A3:90BB 9D 92 0F STA $0F92,x[$7E:0F92] ;} Enemy instruction list pointer = $902A (swimming left)
$A3:90BE A9 32 91 LDA #$9132 ;\
$A3:90C1 9D A8 0F STA $0FA8,x[$7E:0FA8] ;} Enemy function = $9132 (swimming left)
$A3:90C4 BD B5 0F LDA $0FB5,x[$7E:0FB5] ;\
$A3:90C7 29 FF 00 AND #$00FF ;} If [enemy parameter 1 high] = 0:
$A3:90CA D0 0C BNE $0C [$90D8] ;/
$A3:90CC A9 60 90 LDA #$9060 ;\
$A3:90CF 9D 92 0F STA $0F92,x[$7E:0F92] ;} Enemy instruction list pointer = $9060 (swimming right)
$A3:90D2 A9 AB 91 LDA #$91AB ;\
$A3:90D5 9D A8 0F STA $0FA8,x[$7E:0FA8] ;} Enemy function = $91AB (swimming right)
$A3:90D8 BD B4 0F LDA $0FB4,x[$7E:0FB4] ;\
$A3:90DB 29 FF 00 AND #$00FF ;|
$A3:90DE 0A ASL A ;|
$A3:90DF 0A ASL A ;} Y = [enemy parameter 1 low] * 8 (linear speed table index)
$A3:90E0 0A ASL A ;|
$A3:90E1 A8 TAY ;/
$A3:90E2 B9 87 81 LDA $8187,y[$A3:8207] ;\
$A3:90E5 9D AC 0F STA $0FAC,x[$7E:0FAC] ;|
$A3:90E8 B9 89 81 LDA $8189,y[$A3:8209] ;} Enemy right velocity = [$8187 + [Y]].[$8187 + [Y] + 2]
$A3:90EB 9D AA 0F STA $0FAA,x[$7E:0FAA] ;/
$A3:90EE B9 8B 81 LDA $818B,y[$A3:820B] ;\