-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathBank $A5.asm
5740 lines (5157 loc) · 288 KB
/
Bank $A5.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..E358: Draygon ;;;
{
;;; $8687: Initialisation AI - enemy $DE3F (Draygon body) ;;;
{
; Draygon's making the error of trying to set the instruction list pointer of enemies that haven't yet spawned
; When an enemy spawns, its RAM gets cleared or initialised from enemy header, so these stores have no effect
; The enemies set their own instruction list pointers in their init AI, which match up except for the arms, which use $97E7 instead of $9813
$A5:8687 A2 30 00 LDX #$0030 ;\ <-- Looks like this was supposed to be 60h to load all 3 sprite palettes >_<;
;|
$A5:868A BD 17 A2 LDA $A217,x[$A5:A247] ;|
$A5:868D 9F 20 C3 7E STA $7EC320,x[$7E:C350];} Target sprite palette 1 = [$A217..36]
$A5:8691 CA DEX ;} Target sprite palette 2 colours 0..7 = [$A237..46]
$A5:8692 CA DEX ;|
$A5:8693 10 F5 BPL $F5 [$868A] ;/
$A5:8695 A2 FE 0F LDX #$0FFE ;\
$A5:8698 A9 38 03 LDA #$0338 ;|
;|
$A5:869B 9F 00 20 7E STA $7E2000,x[$7E:2FFE];} $7E:2000..2FFF = 0338h (BG2 tilemap)
$A5:869F CA DEX ;|
$A5:86A0 CA DEX ;|
$A5:86A1 10 F8 BPL $F8 [$869B] ;/
$A5:86A3 AE 54 0E LDX $0E54 [$7E:0E54]
$A5:86A6 A9 00 07 LDA #$0700 ;\
$A5:86A9 0A ASL A ;} Enemy palette index = E00h (palette 7)
$A5:86AA 9D 96 0F STA $0F96,x[$7E:0F96] ;/
$A5:86AD A9 A5 00 LDA #$00A5 ;\
$A5:86B0 8D 8E 17 STA $178E [$7E:178E] ;|
$A5:86B3 A9 42 93 LDA #$9342 ;} Enemy graphics drawn hook = $A5:9342
$A5:86B6 8D 8C 17 STA $178C [$7E:178C] ;/
$A5:86B9 A9 FF FF LDA #$FFFF ;\
$A5:86BC 8D 3C 18 STA $183C [$7E:183C] ;} Enable global off-screen enemy processing
$A5:86BF A9 89 98 LDA #$9889 ;\
$A5:86C2 8D 92 0F STA $0F92 [$7E:0F92] ;} Draygon body instruction list pointer = $9889 (facing left - idle)
$A5:86C5 A9 44 99 LDA #$9944 ;\
$A5:86C8 8D D2 0F STA $0FD2 [$7E:0FD2] ;} Draygon eye instruction list pointer = $9944 >_<;
$A5:86CB A9 FC 99 LDA #$99FC ;\
$A5:86CE 8D 12 10 STA $1012 [$7E:1012] ;} Draygon tail instruction list pointer = $99FC >_<;
$A5:86D1 A9 13 98 LDA #$9813 ;\
$A5:86D4 8D 52 10 STA $1052 [$7E:1052] ;} Draygon arms instruction list pointer = $9813 >_<;
$A5:86D7 A9 00 04 LDA #$0400 ;\
$A5:86DA 8D 9A 17 STA $179A [$7E:179A] ;} Enemy BG2 tilemap size = 400h
$A5:86DD A9 1B 87 LDA #$871B ;\
$A5:86E0 9D A8 0F STA $0FA8,x[$7E:0FA8] ;} Enemy function = $871B (fight intro)
$A5:86E3 22 34 DF 88 JSL $88DF34[$88:DF34] ; Spawn Draygon main screen layers HDMA object
$A5:86E7 A9 0C 00 LDA #$000C ;\
$A5:86EA 85 A9 STA $A9 [$7E:00A9] ;} Room loading interrupt command = Draygon's room - begin HUD drawing
$A5:86EC 22 65 D8 88 JSL $88D865[$88:D865] ; Spawn BG3 scroll HDMA object
$A5:86F0 A9 01 00 LDA #$0001 ;\
$A5:86F3 8F 0A 88 7E STA $7E880A[$7E:880A] ;} Set "turret 5" as destroyed
$A5:86F7 22 E2 A7 90 JSL $90A7E2[$90:A7E2] ; Disable mini-map and mark boss room map tiles as explored
$A5:86FB 6B RTL
}
;;; $86FC: Main AI - enemy $DE3F (Draygon body) ;;;
{
$A5:86FC AE 54 0E LDX $0E54 [$7E:0E54]
$A5:86FF FC A8 0F JSR ($0FA8,x)[$A5:871B]; Execute [enemy function]
$A5:8702 AD 7A 0F LDA $0F7A [$7E:0F7A] ;\
$A5:8705 8D BA 0F STA $0FBA [$7E:0FBA] ;|
$A5:8708 8D FA 0F STA $0FFA [$7E:0FFA] ;} Draygon X positions = [Draygon body X position]
$A5:870B 8D 3A 10 STA $103A [$7E:103A] ;/
$A5:870E AD 7E 0F LDA $0F7E [$7E:0F7E] ;\
$A5:8711 8D BE 0F STA $0FBE [$7E:0FBE] ;|
$A5:8714 8D FE 0F STA $0FFE [$7E:0FFE] ;} Draygon Y positions = [Draygon body Y position]
$A5:8717 8D 3E 10 STA $103E [$7E:103E] ;/
$A5:871A 6B RTL
}
;;; $871B: Draygon body function - fight intro - initial delay ;;;
{
$A5:871B 20 AA 87 JSR $87AA [$A5:87AA] ; Handle firing wall turret
$A5:871E AE 54 0E LDX $0E54 [$7E:0E54]
$A5:8721 AD AA 0F LDA $0FAA [$7E:0FAA] ;\
$A5:8724 C9 00 01 CMP #$0100 ;} If [Draygon body function timer] >= 100h: go to BRANCH_DONE
$A5:8727 10 2D BPL $2D [$8756] ;/
$A5:8729 AD AA 0F LDA $0FAA [$7E:0FAA] ; >_<;
$A5:872C D0 24 BNE $24 [$8752] ; If [Draygon body function timer] = 0:
$A5:872E AE 30 03 LDX $0330 [$7E:0330] ;\
$A5:8731 A9 00 06 LDA #$0600 ;|
$A5:8734 95 D0 STA $D0,x [$7E:00D0] ;|
$A5:8736 A9 00 94 LDA #$9400 ;|
$A5:8739 95 D2 STA $D2,x [$7E:00D2] ;|
$A5:873B A9 B1 00 LDA #$00B1 ;|
$A5:873E 95 D4 STA $D4,x [$7E:00D4] ;} Queue transfer of $B1:9400..99FF to VRAM $6D00..6FFF (evir tiles)
$A5:8740 A9 00 6D LDA #$6D00 ;|
$A5:8743 95 D5 STA $D5,x [$7E:00D5] ;|
$A5:8745 AD 30 03 LDA $0330 [$7E:0330] ;|
$A5:8748 18 CLC ;|
$A5:8749 69 07 00 ADC #$0007 ;|
$A5:874C 8D 30 03 STA $0330 [$7E:0330] ;/
$A5:874F 20 D9 A0 JSR $A0D9 [$A5:A0D9] ; Spawn fight intro evir sprite objects
$A5:8752 EE AA 0F INC $0FAA [$7E:0FAA] ; Increment Draygon body function timer
$A5:8755 60 RTS ; Return
; BRANCH_DONE
$A5:8756 A9 8B 87 LDA #$878B ;\
$A5:8759 8D A8 0F STA $0FA8 [$7E:0FA8] ;} Draygon body function = $878B (dance)
$A5:875C 9C AA 0F STZ $0FAA [$7E:0FAA] ; Draygon body function timer = 0
$A5:875F AD 7A 0F LDA $0F7A [$7E:0F7A] ;\
$A5:8762 8F 00 78 7E STA $7E7800[$7E:7800] ;} Draygon left side reset X position = [Draygon body X position]
$A5:8766 18 CLC ;\
$A5:8767 69 A0 02 ADC #$02A0 ;} Draygon right side reset X position = [Draygon body X position] + 2A0h
$A5:876A 8F 04 78 7E STA $7E7804[$7E:7804] ;/
$A5:876E AD 7E 0F LDA $0F7E [$7E:0F7E] ;\
$A5:8771 8F 02 78 7E STA $7E7802[$7E:7802] ;} Draygon reset Y position = [Draygon body Y position]
$A5:8775 AF 00 78 7E LDA $7E7800[$7E:7800] ;\
$A5:8779 8D 7A 0F STA $0F7A [$7E:0F7A] ;|
$A5:877C AF 02 78 7E LDA $7E7802[$7E:7802] ;} >_<;
$A5:8780 8D 7E 0F STA $0F7E [$7E:0F7E] ;/
$A5:8783 A9 18 00 LDA #$0018 ;\
$A5:8786 8F 1E 78 7E STA $7E781E[$7E:781E] ;} Draygon swoop Y acceleration = 18h
$A5:878A 60 RTS
}
;;; $878B: Draygon body function - fight intro - dance ;;;
{
$A5:878B 20 AA 87 JSR $87AA [$A5:87AA] ; Handle firing wall turret
$A5:878E AE 54 0E LDX $0E54 [$7E:0E54]
$A5:8791 AD AA 0F LDA $0FAA [$7E:0FAA] ;\
$A5:8794 C9 D0 04 CMP #$04D0 ;} If [Draygon body function timer] < 4D0h:
$A5:8797 10 07 BPL $07 [$87A0] ;/
$A5:8799 20 3E A1 JSR $A13E [$A5:A13E] ; Handle Draygon fight intro dance
$A5:879C EE AA 0F INC $0FAA [$7E:0FAA] ; Increment Draygon body function timer
$A5:879F 60 RTS ; Return
$A5:87A0 A9 F4 87 LDA #$87F4 ;\
$A5:87A3 8D A8 0F STA $0FA8 [$7E:0FA8] ;} Draygon body function = $87F4 (swoop right)
$A5:87A6 9C AA 0F STZ $0FAA [$7E:0FAA] ; Draygon body function timer = 0
$A5:87A9 60 RTS
}
;;; $87AA: Handle firing wall turret ;;;
{
$A5:87AA AD B6 05 LDA $05B6 [$7E:05B6] ;\
$A5:87AD 29 3F 00 AND #$003F ;} If [frame counter] % 40h != 0: return
$A5:87B0 D0 29 BNE $29 [$87DB] ;/
$A5:87B2 22 11 81 80 JSL $808111[$80:8111] ; Generate random number
$A5:87B6 29 03 00 AND #$0003 ;\
$A5:87B9 18 CLC ;|
$A5:87BA 69 02 00 ADC #$0002 ;} X = (2 + [random number] % 4) * 2
$A5:87BD 0A ASL A ;|
$A5:87BE AA TAX ;/
$A5:87BF 0A ASL A ;\
$A5:87C0 A8 TAY ;} Y = [X] * 2
$A5:87C1 BF 00 88 7E LDA $7E8800,x[$7E:8808];\
$A5:87C5 D0 14 BNE $14 [$87DB] ;} If [$7E:8800 + [X]] != 0 (turret destroyed): return
$A5:87C7 B9 DC 87 LDA $87DC,y[$A5:87EC] ;\
$A5:87CA 85 12 STA $12 [$7E:0012] ;} $12 = [$87DC + [Y]] (X position)
$A5:87CC B9 DE 87 LDA $87DE,y[$A5:87EE] ;\
$A5:87CF 85 14 STA $14 [$7E:0014] ;} $14 = [$87DC + [Y] + 2] (Y position)
$A5:87D1 A0 5E 8E LDY #$8E5E ;\
$A5:87D4 A9 03 00 LDA #$0003 ;} Spawn Draygon's wall turret projectile enemy projectile with speed 3px/frame
$A5:87D7 22 27 80 86 JSL $868027[$86:8027] ;/
$A5:87DB 60 RTS
; X/Y positions to spawn turret projectiles. First two entries are unused... and last entry is made unused by init AI
$A5:87DC dw 0040,0060,
0038,00C0,
0034,012F, ; Left turret
01CC,0101, ; Top right turret
01CC,015E, ; Bottom right turret
01BC,0188
}
;;; $87F4: Draygon body function - swoop right - setup ;;;
{
$A5:87F4 20 AA 87 JSR $87AA [$A5:87AA] ; Handle firing wall turret
$A5:87F7 AE 54 0E LDX $0E54 [$7E:0E54]
$A5:87FA 20 17 88 JSR $8817 [$A5:8817] ; Calculate Draygon swoop Y positions
$A5:87FD A9 B1 88 LDA #$88B1 ;\
$A5:8800 8D A8 0F STA $0FA8 [$7E:0FA8] ;} Draygon body function = $88B1 (descending)
$A5:8803 A9 D1 97 LDA #$97D1 ;\
$A5:8806 8D 92 0F STA $0F92 [$7E:0F92] ;} Draygon body instruction list pointer = $97D1 (facing right - reset)
$A5:8809 A9 01 00 LDA #$0001 ;\
$A5:880C 8D 94 0F STA $0F94 [$7E:0F94] ;} Draygon body instruction timer = 1
$A5:880F A9 01 00 LDA #$0001 ;\
$A5:8812 8F 00 80 7E STA $7E8000[$7E:8000] ;} Draygon facing direction = right
$A5:8816 60 RTS
}
;;; $8817: Calculate Draygon swoop Y positions ;;;
{
$A5:8817 A9 80 01 LDA #$0180 ;\
$A5:881A 8D 28 0E STA $0E28 [$7E:0E28] ;} $0E28 = 180h (unused)
$A5:881D AD 28 0E LDA $0E28 [$7E:0E28] ; >_<;
$A5:8820 8D 24 0E STA $0E24 [$7E:0E24] ; $0E24 = 180h (swoop Y position)
$A5:8823 9C 22 0E STZ $0E22 [$7E:0E22] ; $0E22 = 0 (swoop Y speed)
$A5:8826 9C 26 0E STZ $0E26 [$7E:0E26] ; $0E26 = 0 (swoop Y position index)
; LOOP
$A5:8829 AE 54 0E LDX $0E54 [$7E:0E54] ; >_<;
$A5:882C AF 1E 78 7E LDA $7E781E[$7E:781E] ;\
$A5:8830 18 CLC ;|
$A5:8831 6D 22 0E ADC $0E22 [$7E:0E22] ;} (Swoop Y speed) += [Draygon swoop Y acceleration]
$A5:8834 8D 22 0E STA $0E22 [$7E:0E22] ;/
$A5:8837 EB XBA ;\
$A5:8838 29 FF 00 AND #$00FF ;|
$A5:883B 49 FF FF EOR #$FFFF ;|
$A5:883E 1A INC A ;|
$A5:883F 18 CLC ;} If (swoop Y position) - (swoop Y speed) / 100h >= [Draygon reset Y position]:
$A5:8840 6D 24 0E ADC $0E24 [$7E:0E24] ;|
$A5:8843 CF 02 78 7E CMP $7E7802[$7E:7802] ;|
$A5:8847 30 20 BMI $20 [$8869] ;/
$A5:8849 8D 24 0E STA $0E24 [$7E:0E24] ; (Swoop Y position) -= (swoop Y speed) / 100h
$A5:884C AE 26 0E LDX $0E26 [$7E:0E26] ;\
$A5:884F 9F 02 90 7E STA $7E9002,x[$7E:9002];} $7E:9002 + (swoop Y position index) = (swoop Y position)
$A5:8853 EE 26 0E INC $0E26 [$7E:0E26] ;\
$A5:8856 EE 26 0E INC $0E26 [$7E:0E26] ;|
$A5:8859 EE 26 0E INC $0E26 [$7E:0E26] ;} (Swoop Y position index) += 4
$A5:885C EE 26 0E INC $0E26 [$7E:0E26] ;/
$A5:885F AD 26 0E LDA $0E26 [$7E:0E26] ;\
$A5:8862 C9 00 08 CMP #$0800 ;} If (swoop Y position index) < 800h: go to LOOP
$A5:8865 30 C2 BMI $C2 [$8829] ;/
$A5:8867 80 FE BRA $FE [$8867] ; Crash
$A5:8869 AF 00 78 7E LDA $7E7800[$7E:7800] ;\
$A5:886D 30 0A BMI $0A [$8879] ;} If [Draygon left side reset X position] >= 0: (this condition is always false... and the code of the two branches is equivalent anyway)
$A5:886F 38 SEC ;\
$A5:8870 ED F6 0A SBC $0AF6 [$7E:0AF6] ;} $2C = |[Samus X position] - [Draygon left side reset X position]| (X distance to Samus)
$A5:8873 22 67 B0 A0 JSL $A0B067[$A0:B067] ;/
$A5:8877 80 0C BRA $0C [$8885]
$A5:8879 22 67 B0 A0 JSL $A0B067[$A0:B067] ;\ Else ([Draygon left side reset X position] < 0):
$A5:887D 18 CLC ;|
$A5:887E 6D F6 0A ADC $0AF6 [$7E:0AF6] ;} $2C = |[Samus X position] - [Draygon left side reset X position]| (X distance to Samus)
$A5:8881 22 67 B0 A0 JSL $A0B067[$A0:B067] ;/
$A5:8885 85 2C STA $2C [$7E:002C]
$A5:8887 64 2A STZ $2A [$7E:002A]
$A5:8889 AD 26 0E LDA $0E26 [$7E:0E26] ;\
$A5:888C 4A LSR A ;|
$A5:888D 4A LSR A ;} $2E = (swoop Y position index) / 4 (swoop duration)
$A5:888E 85 2E STA $2E [$7E:002E] ;/
$A5:8890 64 30 STZ $30 [$7E:0030] ;\
$A5:8892 22 61 B7 A0 JSL $A0B761[$A0:B761] ;|
$A5:8896 A5 2C LDA $2C [$7E:002C] ;|
$A5:8898 8D AE 0F STA $0FAE [$7E:0FAE] ;} Draygon X speed = (X distance to Samus) / (swoop duration)
$A5:889B A5 2A LDA $2A [$7E:002A] ;|
$A5:889D 8D B0 0F STA $0FB0 [$7E:0FB0] ;/
$A5:88A0 AD 7E 0F LDA $0F7E [$7E:0F7E] ;\
$A5:88A3 AE 26 0E LDX $0E26 [$7E:0E26] ;} $7E:9002 + (swoop Y position index) = [Draygon Y position]
$A5:88A6 9F 02 90 7E STA $7E9002,x[$7E:91A2];/
$A5:88AA 8E AA 0F STX $0FAA [$7E:0FAA] ; Draygon swoop Y position index = (swoop Y position index)
$A5:88AD 8E AC 0F STX $0FAC [$7E:0FAC] ; Draygon swoop duration * 4 = (swoop Y position index)
$A5:88B0 60 RTS
}
;;; $88B1: Draygon body function - swoop right - descending ;;;
{
$A5:88B1 20 AA 87 JSR $87AA [$A5:87AA] ; Handle firing wall turret
$A5:88B4 20 1C 93 JSR $931C [$A5:931C] ; Handle short Draygon breath bubbles
$A5:88B7 AC 54 0E LDY $0E54 [$7E:0E54]
$A5:88BA AE AA 0F LDX $0FAA [$7E:0FAA] ;\
$A5:88BD E0 68 00 CPX #$0068 ;} If [Draygon swoop Y position index] = 68h:
$A5:88C0 D0 0C BNE $0C [$88CE] ;/
$A5:88C2 A9 06 9C LDA #$9C06 ;\
$A5:88C5 8D 52 10 STA $1052 [$7E:1052] ;} Draygon arms instruction list pointer = $9C06 (facing right - near swoop apex)
$A5:88C8 A9 01 00 LDA #$0001 ;\
$A5:88CB 8D 54 10 STA $1054 [$7E:1054] ;} Draygon arms instruction timer = 1
$A5:88CE BF 02 90 7E LDA $7E9002,x[$7E:91A2];\
$A5:88D2 99 7E 0F STA $0F7E,y[$7E:0F7E] ;} Draygon Y position = [$7E:9002 + [Draygon swoop Y position index]]
$A5:88D5 CE AA 0F DEC $0FAA [$7E:0FAA] ;\
$A5:88D8 CE AA 0F DEC $0FAA [$7E:0FAA] ;|
$A5:88DB CE AA 0F DEC $0FAA [$7E:0FAA] ;} Draygon swoop Y position index -= 4
$A5:88DE CE AA 0F DEC $0FAA [$7E:0FAA] ;/
$A5:88E1 AD AA 0F LDA $0FAA [$7E:0FAA] ;\
$A5:88E4 F0 14 BEQ $14 [$88FA] ;} If [Draygon swoop Y position index] != 0:
$A5:88E6 AD 7C 0F LDA $0F7C [$7E:0F7C] ;\
$A5:88E9 18 CLC ;|
$A5:88EA 6D B0 0F ADC $0FB0 [$7E:0FB0] ;|
$A5:88ED 8D 7C 0F STA $0F7C [$7E:0F7C] ;} Draygon X position += [Draygon X speed]
$A5:88F0 AD 7A 0F LDA $0F7A [$7E:0F7A] ;|
$A5:88F3 6D AE 0F ADC $0FAE [$7E:0FAE] ;|
$A5:88F6 8D 7A 0F STA $0F7A [$7E:0F7A] ;/
$A5:88F9 60 RTS ; Return
$A5:88FA A9 22 89 LDA #$8922 ;\
$A5:88FD 8D A8 0F STA $0FA8 [$7E:0FA8] ;} Draygon body function = $8922 (apex)
$A5:8900 60 RTS
}
;;; $8901: Unused. ;;;
{
; Fire goop?
$A5:8901 AD B6 05 LDA $05B6 [$7E:05B6] ;\
$A5:8904 29 0F 00 AND #$000F ;} If [frame counter] % 10h != 0: return
$A5:8907 D0 18 BNE $18 [$8921] ;/
$A5:8909 A9 FE 98 LDA #$98FE ;\
$A5:890C 8D 92 0F STA $0F92 [$7E:0F92] ;} Draygon body instruction list pointer = $98FE (facing left - fire goop)
$A5:890F AF 00 80 7E LDA $7E8000[$7E:8000] ;\
$A5:8913 F0 06 BEQ $06 [$891B] ;} If [Draygon facing direction] != left:
$A5:8915 A9 90 9C LDA #$9C90 ;\
$A5:8918 8D 92 0F STA $0F92 [$7E:0F92] ;} Draygon body instruction list pointer = $9C90 (facing right - fire goop)
$A5:891B A9 01 00 LDA #$0001 ;\
$A5:891E 8D 94 0F STA $0F94 [$7E:0F94] ;} Draygon body instruction timer = 1
$A5:8921 60 RTS
}
;;; $8922: Draygon body function - swoop right - apex ;;;
{
$A5:8922 20 AA 87 JSR $87AA [$A5:87AA] ; Handle firing wall turret
$A5:8925 AE 54 0E LDX $0E54 [$7E:0E54]
$A5:8928 A9 A0 02 LDA #$02A0 ;\
$A5:892B 38 SEC ;|
$A5:892C ED 7A 0F SBC $0F7A [$7E:0F7A] ;|
$A5:892F 85 2C STA $2C [$7E:002C] ;|
$A5:8931 64 2A STZ $2A [$7E:002A] ;|
$A5:8933 AD AC 0F LDA $0FAC [$7E:0FAC] ;|
$A5:8936 4A LSR A ;|
$A5:8937 4A LSR A ;} Draygon X speed = (2A0h - [Draygon X position]) / (Draygon swoop duration)
$A5:8938 85 2E STA $2E [$7E:002E] ;|
$A5:893A 64 30 STZ $30 [$7E:0030] ;|
$A5:893C 22 61 B7 A0 JSL $A0B761[$A0:B761] ;|
$A5:8940 A5 2C LDA $2C [$7E:002C] ;|
$A5:8942 8D AE 0F STA $0FAE [$7E:0FAE] ;|
$A5:8945 A5 2A LDA $2A [$7E:002A] ;|
$A5:8947 8D B0 0F STA $0FB0 [$7E:0FB0] ;/
$A5:894A A9 51 89 LDA #$8951 ;\
$A5:894D 8D A8 0F STA $0FA8 [$7E:0FA8] ;} Draygon body function = $8951 (ascending)
$A5:8950 60 RTS
}
;;; $8951: Draygon body function - swoop right - ascending ;;;
{
; [random number] % 2: 0 = goop, 1 = swoop
$A5:8951 20 AA 87 JSR $87AA [$A5:87AA] ; Handle firing wall turret
$A5:8954 AC 54 0E LDY $0E54 [$7E:0E54]
$A5:8957 AE AA 0F LDX $0FAA [$7E:0FAA] ;\
$A5:895A E0 68 00 CPX #$0068 ;} If [Draygon swoop Y position index] = 68h:
$A5:895D D0 0C BNE $0C [$896B] ;/
$A5:895F A9 DA 9B LDA #$9BDA ;\
$A5:8962 8D 52 10 STA $1052 [$7E:1052] ;} Draygon arms instruction list pointer = $9BDA (facing right - idle)
$A5:8965 A9 01 00 LDA #$0001 ;\
$A5:8968 8D 54 10 STA $1054 [$7E:1054] ;} Draygon arms instruction timer = 1
$A5:896B BF 02 90 7E LDA $7E9002,x[$7E:9002];\
$A5:896F 99 7E 0F STA $0F7E,y[$7E:0F7E] ;} Draygon Y position = [$7E:9002 + [Draygon swoop Y position index]]
$A5:8972 EE AA 0F INC $0FAA [$7E:0FAA] ;\
$A5:8975 EE AA 0F INC $0FAA [$7E:0FAA] ;|
$A5:8978 EE AA 0F INC $0FAA [$7E:0FAA] ;} Draygon swoop Y position index += 4
$A5:897B EE AA 0F INC $0FAA [$7E:0FAA] ;/
$A5:897E AD AA 0F LDA $0FAA [$7E:0FAA] ;\
$A5:8981 CD AC 0F CMP $0FAC [$7E:0FAC] ;} If [Draygon swoop Y position index] != [Draygon swoop duration * 4]:
$A5:8984 F0 14 BEQ $14 [$899A] ;/
$A5:8986 AD 7C 0F LDA $0F7C [$7E:0F7C] ;\
$A5:8989 18 CLC ;|
$A5:898A 6D B0 0F ADC $0FB0 [$7E:0FB0] ;|
$A5:898D 8D 7C 0F STA $0F7C [$7E:0F7C] ;} Draygon X position += [Draygon X speed]
$A5:8990 AD 7A 0F LDA $0F7A [$7E:0F7A] ;|
$A5:8993 6D AE 0F ADC $0FAE [$7E:0FAE] ;|
$A5:8996 8D 7A 0F STA $0F7A [$7E:0F7A] ;/
$A5:8999 60 RTS ; Return
$A5:899A 9C AA 0F STZ $0FAA [$7E:0FAA] ; Draygon swoop Y position index = 0
$A5:899D AD E5 05 LDA $05E5 [$7E:05E5] ;\
$A5:89A0 29 01 00 AND #$0001 ;} If [random number] % 2 != 0:
$A5:89A3 F0 07 BEQ $07 [$89AC] ;/
$A5:89A5 A9 B3 89 LDA #$89B3 ;\
$A5:89A8 8D A8 0F STA $0FA8 [$7E:0FA8] ;} Draygon body function = $89B3 (swoop left)
$A5:89AB 60 RTS ; Return
$A5:89AC A9 8E 8C LDA #$8C8E ;\
$A5:89AF 8D A8 0F STA $0FA8 [$7E:0FA8] ;} Draygon body function = $8C8E (goop left)
$A5:89B2 60 RTS
}
;;; $89B3: Draygon body function - swoop left - setup ;;;
{
; Uses $0E26(!) which was calculated as part of:
; $8817: Calculate Draygon swoop Y positions
; $0FAC contains the same value and is part of enemy RAM instead of a random temporary >_<;
$A5:89B3 20 AA 87 JSR $87AA [$A5:87AA] ; Handle firing wall turret
$A5:89B6 AE 54 0E LDX $0E54 [$7E:0E54]
$A5:89B9 AF 04 78 7E LDA $7E7804[$7E:7804] ;\
$A5:89BD 38 SEC ;|
$A5:89BE ED F6 0A SBC $0AF6 [$7E:0AF6] ;} $2C = |[Samus X position] - [Draygon right side reset X position]| (X distance to Samus)
$A5:89C1 22 67 B0 A0 JSL $A0B067[$A0:B067] ;|
$A5:89C5 85 2C STA $2C [$7E:002C] ;/
$A5:89C7 64 2A STZ $2A [$7E:002A]
$A5:89C9 AD 26 0E LDA $0E26 [$7E:0E26] ;\
$A5:89CC 4A LSR A ;|
$A5:89CD 4A LSR A ;} $2E = (swoop Y position index) / 4 (swoop duration)
$A5:89CE 85 2E STA $2E [$7E:002E] ;/
$A5:89D0 64 30 STZ $30 [$7E:0030] ;\
$A5:89D2 22 61 B7 A0 JSL $A0B761[$A0:B761] ;|
$A5:89D6 A5 2C LDA $2C [$7E:002C] ;|
$A5:89D8 8D AE 0F STA $0FAE [$7E:0FAE] ;} Draygon X speed = (X distance to Samus) / (swoop duration)
$A5:89DB A5 2A LDA $2A [$7E:002A] ;|
$A5:89DD 8D B0 0F STA $0FB0 [$7E:0FB0] ;/
$A5:89E0 A9 00 8A LDA #$8A00 ;\
$A5:89E3 8D A8 0F STA $0FA8 [$7E:0FA8] ;} Draygon body function = $8A00 (descending)
$A5:89E6 A9 BB 97 LDA #$97BB ;\
$A5:89E9 8D 92 0F STA $0F92 [$7E:0F92] ;} Draygon body instruction list pointer = $97BB (facing left - reset)
$A5:89EC A9 01 00 LDA #$0001 ;\
$A5:89EF 8D 94 0F STA $0F94 [$7E:0F94] ;} Draygon body instruction timer = 1
$A5:89F2 A9 00 00 LDA #$0000 ;\
$A5:89F5 8F 00 80 7E STA $7E8000[$7E:8000] ;} Draygon facing direction = left
$A5:89F9 AD AC 0F LDA $0FAC [$7E:0FAC] ;\
$A5:89FC 8D AA 0F STA $0FAA [$7E:0FAA] ;} Draygon swoop Y position index = [Draygon swoop duration * 4]
$A5:89FF 60 RTS
}
;;; $8A00: Draygon body function - swoop left - descending ;;;
{
$A5:8A00 20 AA 87 JSR $87AA [$A5:87AA] ; Handle firing wall turret
$A5:8A03 20 1C 93 JSR $931C [$A5:931C] ; Handle short Draygon breath bubbles
$A5:8A06 AC 54 0E LDY $0E54 [$7E:0E54]
$A5:8A09 AE AA 0F LDX $0FAA [$7E:0FAA] ;\
$A5:8A0C E0 68 00 CPX #$0068 ;} If [Draygon swoop Y position index] = 68h:
$A5:8A0F D0 0C BNE $0C [$8A1D] ;/
$A5:8A11 A9 13 98 LDA #$9813 ;\
$A5:8A14 8D 52 10 STA $1052 [$7E:1052] ;} Draygon arms instruction list pointer = $9813 (facing left - near swoop apex)
$A5:8A17 A9 01 00 LDA #$0001 ;\
$A5:8A1A 8D 54 10 STA $1054 [$7E:1054] ;} Draygon arms instruction timer = 1
$A5:8A1D BF 02 90 7E LDA $7E9002,x[$7E:91A2];\
$A5:8A21 99 7E 0F STA $0F7E,y[$7E:0F7E] ;} Draygon Y position = [$7E:9002 + [Draygon swoop Y position index]]
$A5:8A24 CE AA 0F DEC $0FAA [$7E:0FAA] ;\
$A5:8A27 CE AA 0F DEC $0FAA [$7E:0FAA] ;|
$A5:8A2A CE AA 0F DEC $0FAA [$7E:0FAA] ;} Draygon swoop Y position index -= 4
$A5:8A2D CE AA 0F DEC $0FAA [$7E:0FAA] ;/
$A5:8A30 AD AA 0F LDA $0FAA [$7E:0FAA] ;\
$A5:8A33 F0 14 BEQ $14 [$8A49] ;} If [Draygon swoop Y position index] != 0:
$A5:8A35 AD 7C 0F LDA $0F7C [$7E:0F7C] ;\
$A5:8A38 38 SEC ;|
$A5:8A39 ED B0 0F SBC $0FB0 [$7E:0FB0] ;|
$A5:8A3C 8D 7C 0F STA $0F7C [$7E:0F7C] ;} Draygon X position -= [Draygon X speed]
$A5:8A3F AD 7A 0F LDA $0F7A [$7E:0F7A] ;|
$A5:8A42 ED AE 0F SBC $0FAE [$7E:0FAE] ;|
$A5:8A45 8D 7A 0F STA $0F7A [$7E:0F7A] ;/
$A5:8A48 60 RTS ; Return
$A5:8A49 A9 50 8A LDA #$8A50 ;\
$A5:8A4C 8D A8 0F STA $0FA8 [$7E:0FA8] ;} Draygon body function = $8A50 (apex)
$A5:8A4F 60 RTS
}
;;; $8A50: Draygon body function - swoop left - apex ;;;
{
$A5:8A50 20 AA 87 JSR $87AA [$A5:87AA] ; Handle firing wall turret
$A5:8A53 AE 54 0E LDX $0E54 [$7E:0E54]
$A5:8A56 AF 00 78 7E LDA $7E7800[$7E:7800] ;\
$A5:8A5A 30 0A BMI $0A [$8A66] ;} If [Draygon left side reset X position] >= 0: (this condition is always false... and the code of the two branches is equivalent anyway)
$A5:8A5C AD 7A 0F LDA $0F7A [$7E:0F7A] ;\
$A5:8A5F 38 SEC ;} $2C = |[Samus X position] - [Draygon left side reset X position]| (X distance to Samus)
$A5:8A60 EF 00 78 7E SBC $7E7800[$7E:7800] ;/
$A5:8A64 80 08 BRA $08 [$8A6E]
$A5:8A66 49 FF FF EOR #$FFFF ;\ Else ([Draygon left side reset X position] < 0):
$A5:8A69 1A INC A ;|
$A5:8A6A 18 CLC ;} $2C = |[Samus X position] - [Draygon left side reset X position]| (X distance to Samus)
$A5:8A6B 6D 7A 0F ADC $0F7A [$7E:0F7A] ;/
$A5:8A6E 85 2C STA $2C [$7E:002C]
$A5:8A70 64 2A STZ $2A [$7E:002A]
$A5:8A72 AD AC 0F LDA $0FAC [$7E:0FAC] ;\
$A5:8A75 4A LSR A ;|
$A5:8A76 4A LSR A ;} $2E = (Draygon swoop duration)
$A5:8A77 85 2E STA $2E [$7E:002E] ;/
$A5:8A79 64 30 STZ $30 [$7E:0030] ;\
$A5:8A7B 22 61 B7 A0 JSL $A0B761[$A0:B761] ;|
$A5:8A7F A5 2C LDA $2C [$7E:002C] ;|
$A5:8A81 8D AE 0F STA $0FAE [$7E:0FAE] ;} Draygon X speed = (X distance to Samus) / (swoop duration)
$A5:8A84 A5 2A LDA $2A [$7E:002A] ;|
$A5:8A86 8D B0 0F STA $0FB0 [$7E:0FB0] ;/
$A5:8A89 A9 90 8A LDA #$8A90 ;\
$A5:8A8C 8D A8 0F STA $0FA8 [$7E:0FA8] ;} Draygon body function = $8A90 (ascending)
$A5:8A8F 60 RTS
}
;;; $8A90: Draygon body function - swoop left - ascending ;;;
{
; [random number] % 2: 0 = goop, 1 = swoop
$A5:8A90 20 AA 87 JSR $87AA [$A5:87AA] ; Handle firing wall turret
$A5:8A93 20 1C 93 JSR $931C [$A5:931C] ; Handle short Draygon breath bubbles
$A5:8A96 AC 54 0E LDY $0E54 [$7E:0E54]
$A5:8A99 AE AA 0F LDX $0FAA [$7E:0FAA] ;\
$A5:8A9C E0 68 00 CPX #$0068 ;} If [Draygon swoop Y position index] = 68h:
$A5:8A9F D0 0C BNE $0C [$8AAD] ;/
$A5:8AA1 A9 E7 97 LDA #$97E7 ;\
$A5:8AA4 8D 52 10 STA $1052 [$7E:1052] ;} Draygon arms instruction list pointer = $97E7 (facing left - idle)
$A5:8AA7 A9 01 00 LDA #$0001 ;\
$A5:8AAA 8D 54 10 STA $1054 [$7E:1054] ;} Draygon arms instruction timer = 1
$A5:8AAD BF 02 90 7E LDA $7E9002,x[$7E:9002];\
$A5:8AB1 99 7E 0F STA $0F7E,y[$7E:0F7E] ;} Draygon Y position = [$7E:9002 + [Draygon swoop Y position index]]
$A5:8AB4 EE AA 0F INC $0FAA [$7E:0FAA] ;\
$A5:8AB7 EE AA 0F INC $0FAA [$7E:0FAA] ;|
$A5:8ABA EE AA 0F INC $0FAA [$7E:0FAA] ;} Draygon swoop Y position index += 4
$A5:8ABD EE AA 0F INC $0FAA [$7E:0FAA] ;/
$A5:8AC0 AD AA 0F LDA $0FAA [$7E:0FAA] ;\
$A5:8AC3 CD AC 0F CMP $0FAC [$7E:0FAC] ;} If [Draygon swoop Y position index] != [Draygon swoop duration * 4]:
$A5:8AC6 F0 14 BEQ $14 [$8ADC] ;/
$A5:8AC8 AD 7C 0F LDA $0F7C [$7E:0F7C] ;\
$A5:8ACB 38 SEC ;|
$A5:8ACC ED B0 0F SBC $0FB0 [$7E:0FB0] ;|
$A5:8ACF 8D 7C 0F STA $0F7C [$7E:0F7C] ;} Draygon X position -= [Draygon X speed]
$A5:8AD2 AD 7A 0F LDA $0F7A [$7E:0F7A] ;|
$A5:8AD5 ED AE 0F SBC $0FAE [$7E:0FAE] ;|
$A5:8AD8 8D 7A 0F STA $0F7A [$7E:0F7A] ;/
$A5:8ADB 60 RTS ; Return
$A5:8ADC AD E5 05 LDA $05E5 [$7E:05E5] ;\
$A5:8ADF 29 01 00 AND #$0001 ;} If [random number] % 2 != 0:
$A5:8AE2 F0 18 BEQ $18 [$8AFC] ;/
$A5:8AE4 A9 F4 87 LDA #$87F4 ;\
$A5:8AE7 8D A8 0F STA $0FA8 [$7E:0FA8] ;} Draygon body function = $87F4 (swoop right)
$A5:8AEA 9C AA 0F STZ $0FAA [$7E:0FAA] ; Draygon swoop Y position index = 0
$A5:8AED AF 00 78 7E LDA $7E7800[$7E:7800] ;\
$A5:8AF1 8D 7A 0F STA $0F7A [$7E:0F7A] ;} Draygon X position = [Draygon left side reset X position]
$A5:8AF4 AF 02 78 7E LDA $7E7802[$7E:7802] ;\
$A5:8AF8 8D 7E 0F STA $0F7E [$7E:0F7E] ;} Draygon Y position = [Draygon reset Y position]
$A5:8AFB 60 RTS ; Return
$A5:8AFC A9 0A 8B LDA #$8B0A ;\
$A5:8AFF 8D A8 0F STA $0FA8 [$7E:0FA8] ;} Draygon body function = $8B0A (goop right)
$A5:8B02 AF 00 78 7E LDA $7E7800[$7E:7800] ;\
$A5:8B06 8D 7A 0F STA $0F7A [$7E:0F7A] ;} Draygon X position = [Draygon left side reset X position]
$A5:8B09 60 RTS
}
;;; $8B0A: Draygon body function - goop right - setup ;;;
{
$A5:8B0A 20 AA 87 JSR $87AA [$A5:87AA] ; Handle firing wall turret
$A5:8B0D A9 B0 FF LDA #$FFB0 ;\
$A5:8B10 8D 7A 0F STA $0F7A [$7E:0F7A] ;} Draygon X position = -50h
$A5:8B13 A9 80 01 LDA #$0180 ;\
$A5:8B16 8D 7E 0F STA $0F7E [$7E:0F7E] ;} Draygon Y position = 180h
$A5:8B19 A9 00 00 LDA #$0000 ;\
$A5:8B1C 8D B0 0F STA $0FB0 [$7E:0FB0] ;|
$A5:8B1F A9 01 00 LDA #$0001 ;} Draygon X speed = 1.0
$A5:8B22 8D AE 0F STA $0FAE [$7E:0FAE] ;/
$A5:8B25 A9 00 00 LDA #$0000 ;\
$A5:8B28 8F 1A 78 7E STA $7E781A[$7E:781A] ;} Draygon goop Y oscillation angle = 0
$A5:8B2C A9 06 9C LDA #$9C06 ;\
$A5:8B2F 8D 52 10 STA $1052 [$7E:1052] ;} Draygon arms instruction list pointer = $9C06 (facing right - near swoop apex)
$A5:8B32 A9 01 00 LDA #$0001 ;\
$A5:8B35 8D 54 10 STA $1054 [$7E:1054] ;} Draygon arms instruction timer = 1
$A5:8B38 A9 52 8B LDA #$8B52 ;\
$A5:8B3B 8D A8 0F STA $0FA8 [$7E:0FA8] ;} Draygon body function = $8B52 (move until Samus in range)
$A5:8B3E A9 D1 97 LDA #$97D1 ;\
$A5:8B41 8D 92 0F STA $0F92 [$7E:0F92] ;} Draygon body instruction list pointer = $97D1 (facing right - reset)
$A5:8B44 A9 01 00 LDA #$0001 ;\
$A5:8B47 8D 94 0F STA $0F94 [$7E:0F94] ;} Draygon body instruction timer = 1
$A5:8B4A A9 01 00 LDA #$0001 ;\
$A5:8B4D 8F 00 80 7E STA $7E8000[$7E:8000] ;} Draygon facing direction = right
$A5:8B51 60 RTS
}
;;; $8B52: Draygon body function - goop right - move until Samus in range ;;;
{
$A5:8B52 20 AA 87 JSR $87AA [$A5:87AA] ; Handle firing wall turret
$A5:8B55 20 1C 93 JSR $931C [$A5:931C] ; Handle short Draygon breath bubbles
$A5:8B58 AD 7A 0F LDA $0F7A [$7E:0F7A] ;\
$A5:8B5B 38 SEC ;|
$A5:8B5C ED F6 0A SBC $0AF6 [$7E:0AF6] ;|
$A5:8B5F 22 67 B0 A0 JSL $A0B067[$A0:B067] ;} If |[Draygon X position] - [Samus X position]| < D0h:
$A5:8B63 C9 D0 00 CMP #$00D0 ;|
$A5:8B66 10 0E BPL $0E [$8B76] ;/
$A5:8B68 A9 AE 8B LDA #$8BAE ;\
$A5:8B6B 8D A8 0F STA $0FA8 [$7E:0FA8] ;} Draygon body function = $8BAE (firing goops)
$A5:8B6E A9 10 00 LDA #$0010 ;\
$A5:8B71 8F 06 78 7E STA $7E7806[$7E:7806] ;} Draygon goop counter = 10h
$A5:8B75 60 RTS ; Return
$A5:8B76 A9 20 00 LDA #$0020 ;\
$A5:8B79 8D 32 0E STA $0E32 [$7E:0E32] ;|
$A5:8B7C AF 1A 78 7E LDA $7E781A[$7E:781A] ;|
$A5:8B80 22 B2 B0 A0 JSL $A0B0B2[$A0:B0B2] ;} Draygon Y position = 180h + 20h * cos([Draygon goop Y oscillation angle] * pi / 80h)
$A5:8B84 18 CLC ;|
$A5:8B85 69 80 01 ADC #$0180 ;|
$A5:8B88 8D 7E 0F STA $0F7E [$7E:0F7E] ;/
$A5:8B8B AF 1A 78 7E LDA $7E781A[$7E:781A] ;\
$A5:8B8F 18 CLC ;|
$A5:8B90 69 01 00 ADC #$0001 ;} Draygon goop Y oscillation angle = ([Draygon goop Y oscillation angle] + 1) % 100h
$A5:8B93 29 FF 00 AND #$00FF ;|
$A5:8B96 8F 1A 78 7E STA $7E781A[$7E:781A] ;/
$A5:8B9A AD 7C 0F LDA $0F7C [$7E:0F7C] ;\
$A5:8B9D 18 CLC ;|
$A5:8B9E 6D B0 0F ADC $0FB0 [$7E:0FB0] ;|
$A5:8BA1 8D 7C 0F STA $0F7C [$7E:0F7C] ;} Draygon X position += [Draygon X speed]
$A5:8BA4 AD 7A 0F LDA $0F7A [$7E:0F7A] ;|
$A5:8BA7 6D AE 0F ADC $0FAE [$7E:0FAE] ;|
$A5:8BAA 8D 7A 0F STA $0F7A [$7E:0F7A] ;/
$A5:8BAD 60 RTS
}
;;; $8BAE: Draygon body function - goop right - firing goops ;;;
{
$A5:8BAE 20 AA 87 JSR $87AA [$A5:87AA] ; Handle firing wall turret
$A5:8BB1 AD 66 0A LDA $0A66 [$7E:0A66] ;\
$A5:8BB4 D0 63 BNE $63 [$8C19] ;} If [Samus X speed divisor] != 0: go to BRANCH_SAMUS_GOOPED
$A5:8BB6 AD E5 05 LDA $05E5 [$7E:05E5] ;\
$A5:8BB9 29 0F 00 AND #$000F ;} If [random number] % 10h = 0:
$A5:8BBC D0 17 BNE $17 [$8BD5] ;/
$A5:8BBE AF 06 78 7E LDA $7E7806[$7E:7806] ;\
$A5:8BC2 3A DEC A ;} Decrement Draygon goop counter
$A5:8BC3 8F 06 78 7E STA $7E7806[$7E:7806] ;/
$A5:8BC7 F0 4B BEQ $4B [$8C14] ; If [Draygon goop counter] = 0: go to BRANCH_DONE
$A5:8BC9 A0 90 9C LDY #$9C90 ;\
$A5:8BCC 8C 92 0F STY $0F92 [$7E:0F92] ;} Draygon body instruction list pointer = $9C90 (facing right - fire goop) <-- ok sure, we'll use the Y register this time
$A5:8BCF A9 01 00 LDA #$0001 ;\
$A5:8BD2 8D 94 0F STA $0F94 [$7E:0F94] ;} Draygon body instruction timer = 1
$A5:8BD5 A9 20 00 LDA #$0020 ;\
$A5:8BD8 8D 32 0E STA $0E32 [$7E:0E32] ;|
$A5:8BDB AF 1A 78 7E LDA $7E781A[$7E:781A] ;|
$A5:8BDF 22 B2 B0 A0 JSL $A0B0B2[$A0:B0B2] ;} Draygon Y position = 180h + 20h * cos([Draygon goop Y oscillation angle] * pi / 80h)
$A5:8BE3 18 CLC ;|
$A5:8BE4 69 80 01 ADC #$0180 ;|
$A5:8BE7 8D 7E 0F STA $0F7E [$7E:0F7E] ;/
$A5:8BEA AF 1A 78 7E LDA $7E781A[$7E:781A] ;\
$A5:8BEE 18 CLC ;|
$A5:8BEF 69 01 00 ADC #$0001 ;} Draygon goop Y oscillation angle = ([Draygon goop Y oscillation angle] + 1) % 100h
$A5:8BF2 29 FF 00 AND #$00FF ;|
$A5:8BF5 8F 1A 78 7E STA $7E781A[$7E:781A] ;/
$A5:8BF9 AD 7C 0F LDA $0F7C [$7E:0F7C] ;\
$A5:8BFC 18 CLC ;|
$A5:8BFD 6D B0 0F ADC $0FB0 [$7E:0FB0] ;|
$A5:8C00 8D 7C 0F STA $0F7C [$7E:0F7C] ;} Draygon X position += [Draygon X speed]
$A5:8C03 AD 7A 0F LDA $0F7A [$7E:0F7A] ;|
$A5:8C06 6D AE 0F ADC $0FAE [$7E:0FAE] ;|
$A5:8C09 8D 7A 0F STA $0F7A [$7E:0F7A] ;/
$A5:8C0C 30 05 BMI $05 [$8C13]
$A5:8C0E C9 A0 02 CMP #$02A0 ;\
$A5:8C11 10 01 BPL $01 [$8C14] ;} If [Draygon X position] >= 2A0h: go to BRANCH_DONE
$A5:8C13 60 RTS ; Return
$A5:8C14 AD 66 0A LDA $0A66 [$7E:0A66]
$A5:8C17 F0 07 BEQ $07 [$8C20]
; BRANCH_SAMUS_GOOPED
$A5:8C19 A9 19 8E LDA #$8E19 ;\
$A5:8C1C 8D A8 0F STA $0FA8 [$7E:0FA8] ;} Draygon body function = $8E19 (chase Samus)
$A5:8C1F 60 RTS ; Return
; BRANCH_DONE
$A5:8C20 A9 DA 9B LDA #$9BDA ;\
$A5:8C23 8D 52 10 STA $1052 [$7E:1052] ;} Draygon arms instruction list pointer = $9BDA (facing right - idle)
$A5:8C26 A9 01 00 LDA #$0001 ;\
$A5:8C29 8D 54 10 STA $1054 [$7E:1054] ;} Draygon arms instruction timer = 1
$A5:8C2C A9 33 8C LDA #$8C33 ;\
$A5:8C2F 8D A8 0F STA $0FA8 [$7E:0FA8] ;} Draygon body function = $8C33 (move until off-screen)
$A5:8C32 60 RTS
}
;;; $8C33: Draygon body function - goop right - move until off-screen ;;;
{
$A5:8C33 20 1C 93 JSR $931C [$A5:931C] ; Handle short Draygon breath bubbles
$A5:8C36 A9 20 00 LDA #$0020 ;\
$A5:8C39 8D 32 0E STA $0E32 [$7E:0E32] ;|
$A5:8C3C AF 1A 78 7E LDA $7E781A[$7E:781A] ;|
$A5:8C40 22 B2 B0 A0 JSL $A0B0B2[$A0:B0B2] ;} Draygon Y position = 180h + 20h * cos([Draygon goop Y oscillation angle] * pi / 80h)
$A5:8C44 18 CLC ;|
$A5:8C45 69 80 01 ADC #$0180 ;|
$A5:8C48 8D 7E 0F STA $0F7E [$7E:0F7E] ;/
$A5:8C4B AF 1A 78 7E LDA $7E781A[$7E:781A] ;\
$A5:8C4F 18 CLC ;|
$A5:8C50 69 01 00 ADC #$0001 ;} Draygon goop Y oscillation angle = ([Draygon goop Y oscillation angle] + 1) % 100h
$A5:8C53 29 FF 00 AND #$00FF ;|
$A5:8C56 8F 1A 78 7E STA $7E781A[$7E:781A] ;/
$A5:8C5A AD 7C 0F LDA $0F7C [$7E:0F7C] ;\
$A5:8C5D 18 CLC ;|
$A5:8C5E 6D B0 0F ADC $0FB0 [$7E:0FB0] ;|
$A5:8C61 8D 7C 0F STA $0F7C [$7E:0F7C] ;} Draygon X position += [Draygon X speed]
$A5:8C64 AD 7A 0F LDA $0F7A [$7E:0F7A] ;|
$A5:8C67 6D AE 0F ADC $0FAE [$7E:0FAE] ;|
$A5:8C6A 8D 7A 0F STA $0F7A [$7E:0F7A] ;/
$A5:8C6D 30 05 BMI $05 [$8C74]
$A5:8C6F C9 A0 02 CMP #$02A0 ;\
$A5:8C72 10 01 BPL $01 [$8C75] ;} If [Draygon X position] >= 2A0h: go to BRANCH_DONE
$A5:8C74 60 RTS ; Return
; BRANCH_DONE
$A5:8C75 A9 B3 89 LDA #$89B3 ;\
$A5:8C78 8D A8 0F STA $0FA8 [$7E:0FA8] ;} Draygon body function = $89B3 (swoop left)
$A5:8C7B A9 50 02 LDA #$0250 ;\
$A5:8C7E 8D 7A 0F STA $0F7A [$7E:0F7A] ;} Draygon X position = 250h
$A5:8C81 A9 B0 FF LDA #$FFB0 ;\
$A5:8C84 8D 7E 0F STA $0F7E [$7E:0F7E] ;} Draygon Y position = -50h
$A5:8C87 AD AC 0F LDA $0FAC [$7E:0FAC] ;\
$A5:8C8A 8D AA 0F STA $0FAA [$7E:0FAA] ;} Draygon swoop Y position index = [Draygon swoop duration * 4]
$A5:8C8D 60 RTS
}
;;; $8C8E: Draygon body function - goop left - setup ;;;
{
$A5:8C8E AF 04 78 7E LDA $7E7804[$7E:7804] ;\
$A5:8C92 8D 7A 0F STA $0F7A [$7E:0F7A] ;} Draygon X position = [Draygon right side reset X position]
$A5:8C95 A9 80 01 LDA #$0180 ;\
$A5:8C98 8D 7E 0F STA $0F7E [$7E:0F7E] ;} Draygon Y position = 180h
$A5:8C9B A9 00 00 LDA #$0000 ;\
$A5:8C9E 8D B0 0F STA $0FB0 [$7E:0FB0] ;|
$A5:8CA1 A9 01 00 LDA #$0001 ;} Draygon X speed = 1.0
$A5:8CA4 8D AE 0F STA $0FAE [$7E:0FAE] ;/
$A5:8CA7 A9 00 00 LDA #$0000 ;\
$A5:8CAA 8F 1A 78 7E STA $7E781A[$7E:781A] ;} Draygon goop Y oscillation angle = 0
$A5:8CAE A9 06 9C LDA #$9C06 ;\
$A5:8CB1 8D 52 10 STA $1052 [$7E:1052] ;} Draygon arms instruction list pointer = $9C06 (facing right - near swoop apex)
$A5:8CB4 A9 01 00 LDA #$0001 ;\
$A5:8CB7 8D 54 10 STA $1054 [$7E:1054] ;} Draygon arms instruction timer = 1
$A5:8CBA A9 D4 8C LDA #$8CD4 ;\
$A5:8CBD 8D A8 0F STA $0FA8 [$7E:0FA8] ;} Draygon body function = $8CD4 (move until Samus in range)
$A5:8CC0 A9 BB 97 LDA #$97BB ;\
$A5:8CC3 8D 92 0F STA $0F92 [$7E:0F92] ;} Draygon body instruction list pointer = $97BB (facing left - reset)
$A5:8CC6 A9 01 00 LDA #$0001 ;\
$A5:8CC9 8D 94 0F STA $0F94 [$7E:0F94] ;} Draygon body instruction timer = 1
$A5:8CCC A9 00 00 LDA #$0000 ;\
$A5:8CCF 8F 00 80 7E STA $7E8000[$7E:8000] ;} Draygon facing direction = left
$A5:8CD3 60 RTS
}
;;; $8CD4: Draygon body function - goop left - move until Samus in range ;;;
{
$A5:8CD4 20 AA 87 JSR $87AA [$A5:87AA] ; Handle firing wall turret
$A5:8CD7 20 1C 93 JSR $931C [$A5:931C] ; Handle short Draygon breath bubbles
$A5:8CDA AD 7A 0F LDA $0F7A [$7E:0F7A] ;\
$A5:8CDD 38 SEC ;|
$A5:8CDE ED F6 0A SBC $0AF6 [$7E:0AF6] ;|
$A5:8CE1 22 67 B0 A0 JSL $A0B067[$A0:B067] ;} If |[Draygon X position] - [Samus X position]| < D0h:
$A5:8CE5 C9 D0 00 CMP #$00D0 ;|
$A5:8CE8 10 0E BPL $0E [$8CF8] ;/
$A5:8CEA A9 30 8D LDA #$8D30 ;\
$A5:8CED 8D A8 0F STA $0FA8 [$7E:0FA8] ;} Draygon body function = $8D30 (firing goops)
$A5:8CF0 A9 10 00 LDA #$0010 ;\
$A5:8CF3 8F 06 78 7E STA $7E7806[$7E:7806] ;} Draygon goop counter = 10h
$A5:8CF7 60 RTS ; Return
$A5:8CF8 A9 20 00 LDA #$0020 ;\
$A5:8CFB 8D 32 0E STA $0E32 [$7E:0E32] ;|
$A5:8CFE AF 1A 78 7E LDA $7E781A[$7E:781A] ;|
$A5:8D02 22 B2 B0 A0 JSL $A0B0B2[$A0:B0B2] ;} Draygon Y position = 180h + 20h * cos([Draygon goop Y oscillation angle] * pi / 80h)
$A5:8D06 18 CLC ;|
$A5:8D07 69 80 01 ADC #$0180 ;|
$A5:8D0A 8D 7E 0F STA $0F7E [$7E:0F7E] ;/
$A5:8D0D AF 1A 78 7E LDA $7E781A[$7E:781A] ;\
$A5:8D11 18 CLC ;|
$A5:8D12 69 01 00 ADC #$0001 ;} Draygon goop Y oscillation angle = ([Draygon goop Y oscillation angle] + 1) % 100h
$A5:8D15 29 FF 00 AND #$00FF ;|
$A5:8D18 8F 1A 78 7E STA $7E781A[$7E:781A] ;/
$A5:8D1C AD 7C 0F LDA $0F7C [$7E:0F7C] ;\
$A5:8D1F 38 SEC ;|
$A5:8D20 ED B0 0F SBC $0FB0 [$7E:0FB0] ;|
$A5:8D23 8D 7C 0F STA $0F7C [$7E:0F7C] ;} Draygon X position -= [Draygon X speed]
$A5:8D26 AD 7A 0F LDA $0F7A [$7E:0F7A] ;|
$A5:8D29 ED AE 0F SBC $0FAE [$7E:0FAE] ;|
$A5:8D2C 8D 7A 0F STA $0F7A [$7E:0F7A] ;/
$A5:8D2F 60 RTS
}
;;; $8D30: Draygon body function - goop left - firing goops ;;;
{
$A5:8D30 AD 66 0A LDA $0A66 [$7E:0A66] ;\
$A5:8D33 D0 63 BNE $63 [$8D98] ;} If [Samus X speed divisor] != 0: go to BRANCH_SAMUS_GOOPED
$A5:8D35 AD E5 05 LDA $05E5 [$7E:05E5] ;\
$A5:8D38 29 0F 00 AND #$000F ;} If [random number] % 10h = 0:
$A5:8D3B D0 17 BNE $17 [$8D54] ;/
$A5:8D3D AF 06 78 7E LDA $7E7806[$7E:7806] ;\
$A5:8D41 3A DEC A ;} Decrement Draygon goop counter
$A5:8D42 8F 06 78 7E STA $7E7806[$7E:7806] ;/
$A5:8D46 F0 4B BEQ $4B [$8D93] ; If [Draygon goop counter] = 0: go to BRANCH_DONE
$A5:8D48 A0 FE 98 LDY #$98FE ;\
$A5:8D4B 8C 92 0F STY $0F92 [$7E:0F92] ;} Draygon body instruction list pointer = $98FE (facing left - fire goop) <-- ok sure, we'll use the Y register this time
$A5:8D4E A9 01 00 LDA #$0001 ;\
$A5:8D51 8D 94 0F STA $0F94 [$7E:0F94] ;} Draygon body instruction timer = 1
$A5:8D54 A9 20 00 LDA #$0020 ;\
$A5:8D57 8D 32 0E STA $0E32 [$7E:0E32] ;|
$A5:8D5A AF 1A 78 7E LDA $7E781A[$7E:781A] ;|
$A5:8D5E 22 B2 B0 A0 JSL $A0B0B2[$A0:B0B2] ;} Draygon Y position = 180h + 20h * cos([Draygon goop Y oscillation angle] * pi / 80h)
$A5:8D62 18 CLC ;|
$A5:8D63 69 80 01 ADC #$0180 ;|
$A5:8D66 8D 7E 0F STA $0F7E [$7E:0F7E] ;/
$A5:8D69 AF 1A 78 7E LDA $7E781A[$7E:781A] ;\
$A5:8D6D 18 CLC ;|
$A5:8D6E 69 01 00 ADC #$0001 ;} Draygon goop Y oscillation angle = ([Draygon goop Y oscillation angle] + 1) % 100h
$A5:8D71 29 FF 00 AND #$00FF ;|
$A5:8D74 8F 1A 78 7E STA $7E781A[$7E:781A] ;/
$A5:8D78 AD 7C 0F LDA $0F7C [$7E:0F7C] ;\
$A5:8D7B 38 SEC ;|
$A5:8D7C ED B0 0F SBC $0FB0 [$7E:0FB0] ;|
$A5:8D7F 8D 7C 0F STA $0F7C [$7E:0F7C] ;} Draygon X position -= [Draygon X speed]
$A5:8D82 AD 7A 0F LDA $0F7A [$7E:0F7A] ;|
$A5:8D85 ED AE 0F SBC $0FAE [$7E:0FAE] ;|
$A5:8D88 8D 7A 0F STA $0F7A [$7E:0F7A] ;/
$A5:8D8B 10 05 BPL $05 [$8D92]
$A5:8D8D C9 B0 FF CMP #$FFB0 ;\
$A5:8D90 30 01 BMI $01 [$8D93] ;} If [Draygon X position] < -50h: go to BRANCH_DONE
$A5:8D92 60 RTS ; Return
$A5:8D93 AD 66 0A LDA $0A66 [$7E:0A66]
$A5:8D96 F0 07 BEQ $07 [$8D9F]
; BRANCH_SAMUS_GOOPED
$A5:8D98 A9 19 8E LDA #$8E19 ;\
$A5:8D9B 8D A8 0F STA $0FA8 [$7E:0FA8] ;} Draygon body function = $8E19 (chase Samus)
$A5:8D9E 60 RTS ; Return
; BRANCH_DONE
$A5:8D9F A9 E7 97 LDA #$97E7 ;\
$A5:8DA2 8D 52 10 STA $1052 [$7E:1052] ;} Draygon arms instruction list pointer = $97E7 (facing left - idle)
$A5:8DA5 A9 01 00 LDA #$0001 ;\
$A5:8DA8 8D 54 10 STA $1054 [$7E:1054] ;} Draygon arms instruction timer = 1
$A5:8DAB A9 B2 8D LDA #$8DB2 ;\
$A5:8DAE 8D A8 0F STA $0FA8 [$7E:0FA8] ;} Draygon body function = $8DB2 (move until off-screen)
$A5:8DB1 60 RTS
}
;;; $8DB2: Draygon body function - goop left - move until off-screen ;;;
{
$A5:8DB2 20 1C 93 JSR $931C [$A5:931C] ; Handle short Draygon breath bubbles
$A5:8DB5 AD 66 0A LDA $0A66 [$7E:0A66] ;\
$A5:8DB8 D0 3F BNE $3F [$8DF9] ;} If [Samus X speed divisor] != 0: go to BRANCH_SAMUS_GOOPED
$A5:8DBA A9 20 00 LDA #$0020 ;\
$A5:8DBD 8D 32 0E STA $0E32 [$7E:0E32] ;|
$A5:8DC0 AF 1A 78 7E LDA $7E781A[$7E:781A] ;|
$A5:8DC4 22 B2 B0 A0 JSL $A0B0B2[$A0:B0B2] ;} Draygon Y position = 180h + 20h * cos([Draygon goop Y oscillation angle] * pi / 80h)
$A5:8DC8 18 CLC ;|
$A5:8DC9 69 80 01 ADC #$0180 ;|
$A5:8DCC 8D 7E 0F STA $0F7E [$7E:0F7E] ;/
$A5:8DCF AF 1A 78 7E LDA $7E781A[$7E:781A] ;\
$A5:8DD3 18 CLC ;|
$A5:8DD4 69 01 00 ADC #$0001 ;} Draygon goop Y oscillation angle = ([Draygon goop Y oscillation angle] + 1) % 100h
$A5:8DD7 29 FF 00 AND #$00FF ;|
$A5:8DDA 8F 1A 78 7E STA $7E781A[$7E:781A] ;/
$A5:8DDE AD 7C 0F LDA $0F7C [$7E:0F7C] ;\
$A5:8DE1 38 SEC ;|
$A5:8DE2 ED B0 0F SBC $0FB0 [$7E:0FB0] ;|
$A5:8DE5 8D 7C 0F STA $0F7C [$7E:0F7C] ;} Draygon X position -= [Draygon X speed]
$A5:8DE8 AD 7A 0F LDA $0F7A [$7E:0F7A] ;|
$A5:8DEB ED AE 0F SBC $0FAE [$7E:0FAE] ;|
$A5:8DEE 8D 7A 0F STA $0F7A [$7E:0F7A] ;/
$A5:8DF1 10 05 BPL $05 [$8DF8]
$A5:8DF3 C9 B0 FF CMP #$FFB0 ;\
$A5:8DF6 30 08 BMI $08 [$8E00] ;} If [Draygon X position] < -50h: go to BRANCH_DONE
$A5:8DF8 60 RTS ; Return
; BRANCH_SAMUS_GOOPED
$A5:8DF9 A9 19 8E LDA #$8E19 ;\
$A5:8DFC 8D A8 0F STA $0FA8 [$7E:0FA8] ;} Draygon body function = $8E19 (chase Samus)
$A5:8DFF 60 RTS ; Return
; BRANCH_DONE
$A5:8E00 A9 F4 87 LDA #$87F4 ;\
$A5:8E03 8D A8 0F STA $0FA8 [$7E:0FA8] ;} Draygon body function = $87F4 (swoop right)
$A5:8E06 A9 B0 FF LDA #$FFB0 ;\
$A5:8E09 8D 7A 0F STA $0F7A [$7E:0F7A] ;} Draygon X position = -50h
$A5:8E0C A9 B0 FF LDA #$FFB0 ;\
$A5:8E0F 8D 7E 0F STA $0F7E [$7E:0F7E] ;} Draygon Y position = -50h
$A5:8E12 AD AC 0F LDA $0FAC [$7E:0FAC] ;\
$A5:8E15 8D AA 0F STA $0FAA [$7E:0FAA] ;} Draygon swoop Y position index = [Draygon swoop duration * 4]
$A5:8E18 60 RTS
}
;;; $8E19: Draygon body function - chase Samus ;;;
{
$A5:8E19 20 AA 87 JSR $87AA [$A5:87AA] ; Handle firing wall turret
$A5:8E1C AD 66 0A LDA $0A66 [$7E:0A66] ;\
$A5:8E1F D0 07 BNE $07 [$8E28] ;} If [Samus X speed divisor] = 0:
$A5:8E21 A9 54 91 LDA #$9154 ;\
$A5:8E24 8D A8 0F STA $0FA8 [$7E:0FA8] ;} Draygon body function = $9154 (fly straight up)
$A5:8E27 60 RTS ; Return
$A5:8E28 AD 86 0F LDA $0F86 [$7E:0F86] ;\
$A5:8E2B 09 00 04 ORA #$0400 ;} Set Draygon body as intangible
$A5:8E2E 8D 86 0F STA $0F86 [$7E:0F86] ;/
$A5:8E31 A0 08 00 LDY #$0008 ; Y = 8
$A5:8E34 AF 00 80 7E LDA $7E8000[$7E:8000] ;\
$A5:8E38 D0 03 BNE $03 [$8E3D] ;} If [Draygon facing direction] = left:
$A5:8E3A A0 F8 FF LDY #$FFF8 ; Y = -8
$A5:8E3D 98 TYA ;\
$A5:8E3E 18 CLC ;|
$A5:8E3F 6D 7A 0F ADC $0F7A [$7E:0F7A] ;|
$A5:8E42 38 SEC ;|
$A5:8E43 ED F6 0A SBC $0AF6 [$7E:0AF6] ;} If |[Draygon X position] + [Y] - [Samus X position]| < 8:
$A5:8E46 22 67 B0 A0 JSL $A0B067[$A0:B067] ;|
$A5:8E4A C9 08 00 CMP #$0008 ;|
$A5:8E4D 10 12 BPL $12 [$8E61] ;/
$A5:8E4F AD 7E 0F LDA $0F7E [$7E:0F7E] ;\
$A5:8E52 38 SEC ;|
$A5:8E53 ED FA 0A SBC $0AFA [$7E:0AFA] ;|
$A5:8E56 22 67 B0 A0 JSL $A0B067[$A0:B067] ;} If |[Draygon Y position] - [Samus Y position]| < 8:
$A5:8E5A C9 08 00 CMP #$0008 ;|
$A5:8E5D 10 02 BPL $02 [$8E61] ;/
$A5:8E5F 80 48 BRA $48 [$8EA9] ; Go to BRANCH_GRAB
$A5:8E61 AD F6 0A LDA $0AF6 [$7E:0AF6] ;\
$A5:8E64 38 SEC ;|
$A5:8E65 ED 7A 0F SBC $0F7A [$7E:0F7A] ;|
$A5:8E68 85 12 STA $12 [$7E:0012] ;|
$A5:8E6A AD FA 0A LDA $0AFA [$7E:0AFA] ;} A = angle from Draygon position to Samus position
$A5:8E6D 38 SEC ;|
$A5:8E6E ED 7E 0F SBC $0F7E [$7E:0F7E] ;|
$A5:8E71 85 14 STA $14 [$7E:0014] ;|
$A5:8E73 22 AE C0 A0 JSL $A0C0AE[$A0:C0AE] ;/
$A5:8E77 49 FF 00 EOR #$00FF ;\
$A5:8E7A 1A INC A ;|
$A5:8E7B 18 CLC ;|
$A5:8E7C 69 40 00 ADC #$0040 ;} $0E20 = (40h - [A]) % 100h (angle using the common maths convention)
$A5:8E7F 29 FF 00 AND #$00FF ;|
$A5:8E82 8D 20 0E STA $0E20 [$7E:0E20] ;/
$A5:8E85 85 12 STA $12 [$7E:0012] ;\
$A5:8E87 A9 02 00 LDA #$0002 ;|
$A5:8E8A 85 14 STA $14 [$7E:0014] ;} ($16.$18, $1A.$1C) = (2 * |cos([$0E20] * pi / 80h)|, 2 * |sin([$0E20] * pi / 80h)|)
$A5:8E8C 22 43 B6 A0 JSL $A0B643[$A0:B643] ;/
$A5:8E90 A5 16 LDA $16 [$7E:0016] ;\
$A5:8E92 8D 24 0E STA $0E24 [$7E:0E24] ;|
$A5:8E95 A5 18 LDA $18 [$7E:0018] ;} $0E24.$0E26 = [$16].[$18] (X speed)
$A5:8E97 8D 26 0E STA $0E26 [$7E:0E26] ;/
$A5:8E9A A5 1A LDA $1A [$7E:001A] ;\
$A5:8E9C 8D 28 0E STA $0E28 [$7E:0E28] ;|
$A5:8E9F A5 1C LDA $1C [$7E:001C] ;} $0E28.$0E2A = [$1A].[$1C] (Y speed)
$A5:8EA1 8D 2A 0E STA $0E2A [$7E:0E2A] ;/
$A5:8EA4 22 91 B6 A0 JSL $A0B691[$A0:B691] ; Move enemy according to angle and X/Y speeds
$A5:8EA8 60 RTS ; Return
; BRANCH_GRAB
$A5:8EA9 A0 45 98 LDY #$9845 ; Draygon arms instruction list pointer = $9845 (facing left - grab)
$A5:8EAC AF 00 80 7E LDA $7E8000[$7E:8000] ;\
$A5:8EB0 F0 03 BEQ $03 [$8EB5] ;} If [Draygon facing direction] != left:
$A5:8EB2 A0 38 9C LDY #$9C38 ; Draygon arms instruction list pointer = $9C38 (facing right - grab)
$A5:8EB5 8C 52 10 STY $1052 [$7E:1052]
$A5:8EB8 A9 01 00 LDA #$0001 ;\
$A5:8EBB 8D 54 10 STA $1054 [$7E:1054] ;} Draygon arms instruction timer = 1
$A5:8EBE A9 0D 00 LDA #$000D ;\
$A5:8EC1 22 84 F0 90 JSL $90F084[$90:F084] ;|
$A5:8EC5 29 FF FF AND #$FFFF ;} If grapple beam is active: go to BRANCH_RETREAT
$A5:8EC8 D0 3F BNE $3F [$8F09] ;/
$A5:8ECA A0 00 00 LDY #$0000 ;\
$A5:8ECD AF 00 80 7E LDA $7E8000[$7E:8000] ;|
$A5:8ED1 F0 03 BEQ $03 [$8ED6] ;|
$A5:8ED3 A0 01 00 LDY #$0001 ;} A = [Draygon facing direction]
;|
$A5:8ED6 98 TYA ;/
$A5:8ED7 22 3B E2 90 JSL $90E23B[$90:E23B] ; Set Samus into the grabbed by Draygon pose
$A5:8EDB A9 00 01 LDA #$0100 ;\
$A5:8EDE 8F 0C 78 7E STA $7E780C[$7E:780C] ;} Draygon spiral X position = 100h
$A5:8EE2 A9 80 01 LDA #$0180 ;\
$A5:8EE5 8F 0E 78 7E STA $7E780E[$7E:780E] ;} Draygon spiral Y position = 180h
$A5:8EE9 A9 00 00 LDA #$0000 ;\
$A5:8EEC 8F 0A 78 7E STA $7E780A[$7E:780A] ;} Draygon spiral X radius = 0.0
$A5:8EF0 8F 12 78 7E STA $7E7812[$7E:7812] ;/
$A5:8EF4 A9 C0 00 LDA #$00C0 ;\
$A5:8EF7 8F 10 78 7E STA $7E7810[$7E:7810] ;} Draygon spiral angle = C0h
$A5:8EFB A9 00 08 LDA #$0800 ;\
$A5:8EFE 8F 16 78 7E STA $7E7816[$7E:7816] ;} Draygon spiral angle delta = 800h
$A5:8F02 A9 1E 8F LDA #$8F1E ;\
$A5:8F05 8D A8 0F STA $0FA8 [$7E:0FA8] ;} Draygon body function = $8F1E (grabbed Samus)
$A5:8F08 60 RTS ; Return
; BRANCH_RETREAT
$A5:8F09 A9 10 8F LDA #$8F10 ;\
$A5:8F0C 8D A8 0F STA $0FA8 [$7E:0FA8] ;} Draygon body function = $8F10 (repelled by grapple)
$A5:8F0F 60 RTS
}
;;; $8F10: Draygon body function - repelled by grapple ;;;
{