-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathRBOSS.ASM
2577 lines (2450 loc) · 48.6 KB
/
RBOSS.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
.TITLE 'ROBOT BOSS MODULE'
.WIDTH 132
.OPTION B,D,L,T
.MNOLIST
;
; INITIATED: JAN 9, 1990
; MODIFIED: FOREVER....
; SOFTWARE: EUGENE JARVIS
;
; COPYRIGHT (C) 1990 WILLIAMS ELECTRONICS GAMES, INC.
;
;
; GET THE SYSTEM STUFF
.INCLUDE "MPROC.EQU" ;MPROC EQUATES
.INCLUDE "DISP.EQU" ;DISPLAY PROC. EQUATES
.INCLUDE "\VIDEO\SYS\SYS.INC" ;Z UNIT SYSTEM EQUATES
.INCLUDE "\VIDEO\SYS\MACROS.HDR" ;MACROS DEFINITIONS
.INCLUDE "IMGTBL.GLO"
.INCLUDE "ROBO.EQU"
.INCLUDE "FLATFACE.TBL"
;
;SOUNDS
;
.REF EXP3HI,MISS,VICMSC,OUCH,EXP3,EXP3HIA
.REF AWWSND,EESND,ONOSND,HA2SND,WPWPSND,WPSSND
.REF AWWSND2,MCSPK8
;
;SYMBOLS EXTERNALLY DEFINED
;
.REF RINGS,STATUS,CLNPAL
.REF ECON,FRANIM,BOOM2,BIG3,SCRADD2,P1DATA,P2DATA,CHEERS
.REF PSTOP,BOSSON,DEXIT,FLASHME
.REF GET_VALID_XY,GAMSTATE,WAVEYX,BEGINOBJ,BEGINOBJ2,EHALT
.REF RANDPER,RANDOM,RANGRAND,DRINF,SET_GATE_2,GET_WVADDR
.REF RANDU,SRAND,PLYROBJS,SCORPLAY,GETPLYR,OFSCRTST
.REF GETPLYR,OFSCRTST,ORBBNDCK
.REF FINDPAL,PALSET,GETFPAL
.REF SMLEXP,BOOM2,DOSHK0
.REF EXPTLXY,EXPLRXY,CLUSTER,SHAKER
.REF BOOM4,PCNT,CKPLYR,HALT
*
*SYMBOLS DEFINED IN THIS FILE
*
.DEF O_FACE
.DEF FLATFACE,FACBUL,FACEON,PUSHFC,BLOE2,STFVEL,COLCYC
.DEF VMAX,SPTPRC
;
.BSS SNDCNT,16
.BSS RBFLG,16 ;RBOSS FLAG 0=HEAD,1=BLOWING,2=SKULL
.BSS FACEON,16
.BSS FACEXV,32 ;XVEL,YVEL
.BSS FACEYV,32
.BSS PAL1,16*16*2 ;ALLOCATE 2 X COLOR AREA IN RAM
.BSS PAL3,64*16*2
.BSS FACSTOR,35*16*4 ;FACE POINTER AREA
.BSS SKLFFLG,16 ;SKULL FIRE FLAG
.BSS RBANIFLG,16 ;ANIMATION IN PROGRESS FLAG
.BSS RBMODE,16 ;MODE FLAG
.BSS CANFLG,16 ;CANNON ON FLAG
.BSS PUMLCNT,16
*BOSS ENEMY DATA OBJECT BLOCK STRUCT
*
OBJPTR .SET >0 ;IMAGE OBJECT POINTER
HITCNT .SET >20 ;IMAGE HIT COUNTER
AFRAME .SET >28 ;CURRENT ANIMATION FRAME
DAMAGEL .SET >30 ;DAMAGE LEVEL
*>040=IMAGE 1 ETC.
*
O_FACE
CREATE TYPFACE,FLATFACE
RETS
BOSSIT
;SHAKE SCREEN
MOVI EXP3HI,A0
CALLA ONESND
CALLA DOSHK0
SLEEP 5
CALLA DOSHK0
SLEEP 5
MOVI EXP3HI,A0
CALLA ONESND
CALLA DOSHK0
SLEEP 5
CALLA DOSHK0
MOVI EXP3HI,A0
CALLA ONESND
SLEEP 5
CALLA DOSHK0
CREATE 0,OCH
DIE
OCH SLEEP 23
MOVI NOWAY2,A0
CALLA ONESND
DIE
* ROBOT BOSS PROCESS
* A8=OBJECT BLOCK CONTAINING OBJECT POINTERS
* A9=ANIMATION SCRIPT FLAG
* A11=PLAYER TO SEEK
* A13=PROCESS
* PDATA+>40=XACC
* PDATA+>50=YACC
*
FLATFACE
CREATE 0,BOSSIT
;FIRST FREE UP SOME PALS!
;GET RID OF UNEEDED PALS!
; SLEEP 8*60 ;FROM BEGIN OF SCROLL TO APPEAR ON SCREEN!
SLEEP 15 ;8
; MOVI DLST3,A1
; CALLA UNGET
CALLA CLNPAL
MOVK 1,A0
MOVE A0,@FACEON,W
MOVB A0,@BOSSON
CLR A0
MOVE A0,@CANFLG,W
MOVE A0,@RBMODE,W
MOVE A0,@RBFLG,W
MOVE A0,@FACEXV,L
MOVE A0,@FACEYV,L
MOVE A0,@SKLFFLG,W
MOVE A0,*A13(PDATA),W ;CLEAR ANIMATION POINTER
MOVE @WORLDTLX,A0,L ;GET STARTING COORD
ADDI >2E00000,A0
MOVE @WORLDTLY,A1,L
ADDI >800000,A1
CLR A11 ;DAMAGE LEVEL
CALLR RBINIT ;INITIALIZE FACE
SLEEP 3
MMTM SP,A8,A9,A10,A11
MOVI FCE1,A8 ;PAL NAME
MOVI PAL1,A9 ;RAM AREA
; .BSS PAL1,16*16*2 ;ALLOCATE 2 X COLOR AREA IN RAM
MOVI [53,61],A10 ;BEGIN/END COLOR #
MOVK 3,A11 ;RATE IN TICKS
CREATE CYCPID,COLCYC ;COLOR CYCLER ON
MMFM SP,A8,A9,A10,A11
SLEEP 2
; MOVI DLST,A1
; CALLA UNGET
CALLA CLNPAL
RBWAIT
SLEEP 2
MOVE @EHALT,A0
JRNZ RBWAIT ;WAIT FOR PLAYER TO ENTER
; MOVI DLST2,A1
; CALLA UNGET
CALLA CLNPAL
MOVE @STATUS,A0
CMPI 3,A0
JRZ P2A
CMPI 2,A0
JRZ P1A
MOVK 1,A9
MOVI 190,A10 ;TIME RINGS ARE ON
CREATE RNGPID,RINGS ;PLACE RING AROUND PLAYER X
JRUC P2OUT
P2A
MOVK 1,A9
MOVI 190,A10 ;TIME RINGS ARE ON
CREATE RNGPID,RINGS ;PLACE RING AROUND PLAYER X
P1A
MOVK 2,A9
MOVI 190,A10 ;TIME RINGS ARE ON
CREATE RNGPID,RINGS ;PLACE RING AROUND PLAYER X
P2OUT
MOVK 1,A0 ;REDO THIS CRAP FOR TURMELL BUG
MOVE A0,@FACEON,W
MOVB A0,@BOSSON
CALLA GETPLYR ;FIND PLAYER TO SEEK
MOVE A0,A11
CALLR GETRBV ;GET ROBOT BOSS VELOCITY
RBLP:
MOVI 10,A0
CALLA RANDPER ;ANIMATE BOSS??
JRNC RBOSS0
*DO SOME ANIMATION HERE
MOVE @RAND,A0,W
ZEXT A0,W ;GET RID OF SIGN EXTEND
SRL 13,A0
SLL 6,A0
ADDI ANIANITB,A0
MOVE *A0+,A9,L
MOVE *A0,A10,L
CREATE TYPFACE,ANISEQ
RBOSS0
MOVI 150,A0 ;FOLLOW WITH EYES?
CALLA RANDPER
JRNC RBOSS01 ;NO
MOVE @RBANIFLG,A0,W
JRNE RBOSS01
CALLR FOLOEYE ;FOLLOW HIS EYES!!!!
RBOSS01
MOVI 200,A0 ;GET NEW VELOCITY?
CALLA RANDPER
JRNC MVV01 ;NO
CALLR GETRBV
MOVI 40,A0 ;GET NEW PLAYER TO SEEK
CALLA RANDPER
JRNC MVV01 ;NO
CALLA GETPLYR
MOVE A0,A11
MVV01
MOVI >28,A0 ;CHANGE CHASE MODE
CALLA RANDPER
JRNC MVV01A ;NO
CLR A1
CMPI 21,A0
JRLS MVV010
INC A1
MVV010
MOVE A1,@RBMODE,W
MVV01A
MOVE *A13(PDATA+>40),A2,W ;GET ACCELERATIONS
MOVE *A13(PDATA+>50),A3,W
MOVE @FACEXV,A0,L
MOVE @FACEYV,A1,L
MOVE A0,A4
MOVE A1,A5
ABS A4
ABS A5
ADD A4,A5
CMPI >20000,A5 ;>30000,A5
JRHS MVV01B
SLL 2,A2 ;INCREASE THRUST FOR LOW VELOCITY
SLL 2,A3
MVV01B
ADD A0,A2
ADD A1,A3
MOVE A2,A0
MOVE A3,A1
CMPI >40000,A5 ;MORE DAMP FOR HIGHER VELOCITY
JRHS MVV01C
SRA 1,A2
SRA 1,A3
MVV01C
SRA 3,A2 ;SUB OUT DAMPING FACTOR
SRA 3,A3
SUB A2,A0
SUB A3,A1
MOVE *A8,A8,L ;GET FIRST OBJECT
CALLA GETANIXY ;RET A2=YVAL,A3=XVAL
MOVE @WORLDTLX,A4,L ;ADJUST FOR SCREEN RELATIVE
MOVE @WORLDTLY,A5,L
SUB A4,A3
SUB A5,A2
MMTM SP,A2,A3
*ARE WE EMBEDDED IN SIDE?
CMPI >580000,A3
JRHS MVV02 ;NOT TO THE LEFT
SUBI >580000,A3 ;BRING HIM IN BOUNDS
JRUC MVV02A
MVV02
CMPI >1400000,A3
JRLS MVV03 ;NOT TO THE RIGHT
SUBI >1400000,A3
MVV02A
NEG A3
MOVE A3,A0
MVV03
CMPI >1B0000,A2
JRHS MVV04
SUBI >1B0000,A2
JRUC MVV04A
MVV04 CMPI >880000,A2
JRLS MVV05
SUBI >880000,A2
MVV04A
NEG A2
MOVE A2,A1
*CHECK FOR OUT AFTER VELOCITY ADD
MVV05
MMFM SP,A2,A3
ADD A0,A3
ADD A1,A2
CMPI >580000,A3
JRHS MVV06 ;NOT TO THE LEFT
CLR A0
MVV06
CMPI >1400000,A3
JRLS MVV07 ;NOT TO THE RIGHT
CLR A0
MVV07
CMPI >1B0000,A2
JRHS MVV08
CLR A1
MVV08 CMPI >880000,A2
JRLS MVV09
CLR A1
MVV09
MOVE A0,@FACEXV,L
MOVE A1,@FACEYV,L
MOVI FACSTOR,A8
CALLR STFVEL ;STUFF VELOCITY IN ALL PARTS
MOVE @HALT,A0,W
JRNE RBOSS1 ;DONT FIRE UPON HALT
CALLR GETDMGE
SRL 1,A0
ANDI >000000F0,A0
ADDI FIRETAB,A0
MOVE *A0,A0,W ;GET FIRE PROBABILITY BASED ON DAMAGE TABLE
CALLA RANDPER
JRNC RBOSS1
CALLR BOSSFIRE
RBOSS1
SLEEP 2
JRUC RBLP
;MAYBE SOME GALAGAS
DLST2 .LONG YBG,WHITE,ORANGE,BLUE,GREEN,0
DLST .LONG GALP,GALP2,NUORB
DLST3 .LONG TKCOL1,GRNTG,PRZ,0; PALS TO WIPE
*FIRE PROB TABLE
FIRETAB .WORD 15,20,20,25,25,30,35,40
.WORD 40,40,40,40,50,50,60,60
*
*SKULL PROCESS
*
SKULPRC
MOVI FACSTOR,A8
MOVI SKEYE,A9 ;GET EYBALLS ANIMATING
MOVI 2,A10
CREATE TYPFACE,SKSEQ
CALLA GETPLYR ;FIND PLAYER TO SEEK
MOVE A0,A11
CALLR GETRBV ;GET SKULL VELOCITY
MOVK 1,A0
MOVE A0,@RBMODE,W ;MAKE SKULL HARDER TO PUSH
SKLP:
MOVI 100,A0 ;GET NEW VELOCITY?
CALLA RANDPER
JRNC SKV01 ;NO
CALLR GETRBV
MOVI 20,A0 ;GET NEW PLAYER TO SEEK
CALLA RANDPER
JRNC SKV01 ;NO
CALLA GETPLYR
MOVE A0,A11
SKV01
MOVE *A13(PDATA+>40),A2,W ;GET ACCELERATIONS
MOVE *A13(PDATA+>50),A3,W
MOVE @FACEXV,A0,L
MOVE @FACEYV,A1,L
ADD A0,A2
ADD A1,A3
MOVE A2,A0
MOVE A3,A1
SRA 4,A2 ;SUB OUT DAMPING FACTOR
SRA 4,A3
SUB A2,A0
SUB A3,A1
MOVE *A8,A8,L ;GET FIRST OBJECT
CALLA GETANIXY ;RET A2=YVAL,A3=XVAL
MOVE @WORLDTLX,A4,L ;ADJUST FOR SCREEN RELATIVE
MOVE @WORLDTLY,A5,L
SUB A4,A3
SUB A5,A2
MMTM SP,A2,A3
*ARE WE EMBEDDED IN SIDE?
CMPI >580000,A3
JRHS SKV02 ;NOT TO THE LEFT
SUBI >580000,A3 ;BRING HIM IN BOUNDS
JRUC SKV02A
SKV02
CMPI >1400000,A3
JRLS SKV03 ;NOT TO THE RIGHT
SUBI >1400000,A3
SKV02A
NEG A3
MOVE A3,A0
SKV03
CMPI >1B0000,A2
JRHS SKV04
SUBI >1B0000,A2
JRUC SKV04A
SKV04 CMPI >880000,A2
JRLS SKV05
SUBI >880000,A2
SKV04A
NEG A2
MOVE A2,A1
*CHECK FOR OUT AFTER VELOCITY ADD
SKV05
MMFM SP,A2,A3
ADD A0,A3
ADD A1,A2
CMPI >580000,A3
JRHS SKV06 ;NOT TO THE LEFT
CLR A0
SKV06
CMPI >1400000,A3
JRLS SKV07 ;NOT TO THE RIGHT
CLR A0
SKV07
CMPI >1B0000,A2
JRHS SKV08
CLR A1
SKV08 CMPI >880000,A2
JRLS SKV09
CLR A1
SKV09
MOVE A0,@FACEXV,L
MOVE A1,@FACEYV,L
MOVI FACSTOR,A8
CALLR STFVEL ;STUFF VELOCITY IN ALL PARTS
MOVE @HALT,A0,W
JRNE SKULP1 ;DONT FIRE UPON HALT
MOVI 52,A0 ;32 ;SHOOT DUDES OUT OF MOUTH??
CALLA RANDPER
JRNC SKULP1
MOVE @SKLFFLG,A0,W
JRNE SKULP1
MOVK 1,A0
MOVE A0,@SKLFFLG,W
CREATE TYPFACE,SKULFIRE
SKULP1
MOVI 25,A0 ;ANIMATE MOUTH??
CALLA RANDPER
JRNC SKULP2
MOVI SKMOUTH,A9,L
MOVK 20,A10
CREATE TYPFACE,ANISEQ
SKULP2
SLEEP 2
JRUC SKLP
GETSKV RETS
*
*SKULL FIRES PHOTON AT YOU
*A8=SKULL DATA BLOCK
*A11=PLAYER SKULL IS AFTER
*
SKULFIRE
CALLA CKPLYR ;MAKE SURE PLAYER IS ALIVE
JREQ SKLFX
MOVI MISS,A0
CALLA ONESND
MOVI >FFE00000,A4 ;X POS OFFSET
MOVI >200000,A5 ;Y POS OFFSET
CALLR SKLFSUB
MOVI >100000,A4 ;X POS OFFSET
MOVI >200000,A5 ;Y POS OFFSET
CALLR SKLFSUB
*BLINK OFF THE EYES
MOVI CLSENMY|TYPFACE|SUBER,A0
CLR A1
NOT A1
CALLA EXISTOBJ
MOVI >8000,A2
MOVE A2,*A0(OFLAGS),W
MOVE A0,A8
MOVI CLSENMY|TYPFACE|SUBEL,A0
CALLA EXISTOBJ
MOVE A2,*A0(OFLAGS),W
MOVE A0,A9
SLEEP 30
*TURN ON EYES
MOVI DMAWNZ+M_PIXSCAN,A2
MOVE A2,*A9(OFLAGS),W
MOVI DMAWNZ+M_PIXSCAN+M_FLIPH,A2
MOVE A2,*A8(OFLAGS),W
CLR A2
MOVE A2,@SKLFFLG,W ;DONE FIRING
SKLFX
DIE
SKLFSUB
MOVE *A11(OXVAL),A6,L
MOVE *A11(OYVAL),A7,L
MOVI FACSTOR,A8
MOVE *A8,A8,L ;GET OBJ POINTER TO FIRST PART
CALLA GETANIXY
MOVE A2,A1
MOVE A3,A0
ADD A4,A0
ADD A5,A1
SUB A0,A6 ;FIND DELTA
SUB A1,A7
SRA 5,A6 ;SHIFT TO CALC VELOCITY
SRA 5,A7
MOVE A2,A1
MOVE A3,A0
ADD A4,A0
ADDI >200000,A0 ;X ADJUST
MMTM SP,A0
MOVI >60000,A0 ;LIMIT VELOCITIES
CALLA VMAX
MMFM SP,A0
MOVI photon1,A2 ;(OIMG)
MOVI 231,A3 ;(OZPOS)
MOVI DMAWNZ,A4 ;(OFLAGS) NON-ZERO VALUE
; MOVI CLSENMY|TYPCBALL,A5 ;(OID)
MOVI CLSENMY|TYPCBALL,A5 ;(OID)
; MOVI CLSENMY|TYPCBL2,A5 ;(OID)
CALLA BEGINOBJ2
CREATE 0,PHOTPRC ;PHOTON PROCESS
MOVE A0,*A8(OPLINK),L ;FIX PROCESS LINK
RETS
BULLEXP
MOVE *A8(OIMG),A1,L ;ADJUST ANIMATION POINT TO TOPLEFT
MOVE *A1(>20),A2
NEG A2
MOVE *A8(OXPOS),A3,W
ADD A2,A3
MOVE A3,*A8(OXPOS),W
MOVE *A1(>30),A2
NEG A2
MOVE *A8(OYPOS),A3,W
ADD A2,A3
MOVE A3,*A8(OYPOS),W
MOVI MEDEXP,A9
MOVK 1,A1 ;COMMAND PASSED TO FRANIM
JSRP FRANIM
;
; DELETE OBJECT FROM OBJLST
;
MOVE A8,A0
; CALLA DELPAL
CALLA DELOBJ
DIE
CLOSE
;OBJECT IN A8 CLOSE TO RANDOM PLAYER
;
MOVB @PCNT,A1
ANDI 01,A1
SLL 5,A1
MOVI PLYROBJS,A0,L
ADD A1,A0
MOVE *A0,A0,L
JRNZ BLO1
XORI 32,A1
ADDI PLYROBJS,A1,L
MOVE *A1,A0,L
JRNZ BLO1
NOEXP
CLRC
RETS
BLO1 MOVE *A8(OXPOS),A1
MOVE *A0(OXPOS),A2
;A0=PLAYER PNTR
ADDI 10,A2
SUB A1,A2
ABS A2
CMPI 16,A2 ;LEFT OF PLAYER
JRHI NOEXP
YSEXP
;A0=PLAYER PNTR
MOVE *A8(OYPOS),A1
MOVE *A0(OYPOS),A2
ADDI 15,A2
SUB A1,A2
ABS A2
CMPI 10H,A2 ;OVER PLYRS HEAD
JRHI NOEXP
YSEXP2
SETC
RETS
*
*PHOTON FLY PROCESS
*A8=PHOTON OBJECT
*A9=ANIMATION
*A10=COUNT
*PDATA=XACC, PDATA+>20=YACC
*
PHOTPRC:
MOVI MISS,A0
CALLA ONESND
MOVI >400,A0 ;GET XACC
CALLA SRAND
MOVE A0,*A13(PDATA),L
MOVI >400,A0 ;GET YACC
CALLA SRAND
MOVE A0,*A13(PDATA+>20),L
MOVK 24,A10
PHOTP00
MOVI PHOTFLY,A9
PHOTP0
MOVE *A8(OXVEL),A0,L ;DO SOME ACCELERATION
MOVE *A13(PDATA),A1,L
ADD A1,A0
MOVE A0,*A8(OXVEL),L
MOVE *A8(OYVEL),A0,L
MOVE *A13(PDATA+>20),A1,L
ADD A1,A0
MOVE A0,*A8(OYVEL),L
CALLR CLOSE ;CHECK TO SEE IF WE SHOULD EXPLODE BULLET!
JRC BULLEXP ;SET=EXP
SLEEP 1
CALLA ORBBNDCK ;BOUNCE BALLS OF WALL
MOVK 4,A1
JSRP FRANIM ;ANIMATE THE SUCKER
JRNC PHOTP0
DEC A10
JRGE PHOTP00
JRUC BULLEXP
; MOVE A8,A0
; CALLA DELOBJ
; CALLA DELPAL
; DIE
*
*FOLLOW PLAYER WITH EYES
*A11=PLAYER TO FOLLOW
*A8=BOSS DATA STRUCT
*
FOLOEYE
MOVE *A8,A4,L ;GET BOSS COORD
MOVE *A4(OXPOS),A0,W
MOVE *A4(OYPOS),A1,W
MOVE *A11(OXPOS),A2,W
MOVE *A11(OYPOS),A3,W
SUB A3,A1 ;GET YOUR DELTA'S DUDES
SUB A2,A0
MOVE A1,A3
MOVE A0,A2
ABS A0
ABS A1
CMP A0,A1 ;DX OR DY BIGGER
JRLS FOLOX ;DX BIGGER
MOVI EYESUP,A9
MOVE A3,A3
JRNN FOLOXX
MOVI EYESDWN,A9
JRUC FOLOXX
FOLOX
MOVI EYESLFT,A9
MOVE A2,A2
JRNN FOLOXX
MOVI EYESRT,A9
FOLOXX
CALLR ANIBOSS
RETS
*
*FLATFACE FIRES SHIT AT YOU
*A8=FLATFACE DATA BLOCK
*A11=PLAYER FLATFACE IS AFTER
BOSSFIRE
MMTM SP,A0,A1,A7
CALLA CKPLYR ;MAKE SURE PLAYER IS ALIVE
JREQ BSSFIRX
MOVI TYPFACE,A1
MOVI FIREP,A7
MOVI 320,A0 ;275
CALLA RANDPER
JRNC BOSSFIR1
MOVE @CANFLG,A0,W ;CANNON ALREADY ON?
JRNE BOSSFIR1 ;YES, DON'T FIRE
MOVI BOSSCAN,A7
BOSSFIR1
CALLA GETPRC
CALLA GETSPK
BSSFIRX
MMFM SP,A0,A1,A7
RETS
*
*SHOOT A CANNON VOLLEY AT YOU
*A8=BOSS DATA BLOCK PTR
*A11= PLAYER TO SHOOT
*
BOSSCAN
*OPEN YOUR MOUTH, DUDE !
MOVK 1,A0
MOVE A0,@CANFLG,W ;NO MORE CANNONS
MOVI BITE,A9
CALLR ANIBOSS
MOVI 10,A0
CALLA RANDU
ADDK 9,A0
BSSCNLP
CALLR CANST
DSJS A0,BSSCNLP
SLEEP 18
MOVI BITECL,A9 ;CLOSE YOUR MOUTH
CALLR ANIBOSS
SLEEP 37
CLR A0
MOVE A0,@CANFLG,W
DIE
*
*START A CANNON
*A8=BOSS DATA BLOCK PTR
*A11= PLAYER TO SHOOT
*
CANST
*FIRE OUT A BALL
MMTM SP,A0,A8
CALLA CKPLYR ;MAKE SURE PLAYER IS ALIVE
JREQ CANSTX
MOVI >50,A0 ;GET GOAL X,Y
CALLA SRAND
MOVE A0,A1
MOVI >50,A0
CALLA SRAND
MOVE *A11(OXPOS),A6,W
MOVE *A11(OYPOS),A7,W
ADD A0,A6
ADD A1,A7
MOVE *A8,A4,L ;GET OBJ POINTER TO FIRST PART
MOVE *A4(OYPOS),A1,W ;RANDOMIZE START A BIT
MOVK 5,A0
CALLA SRAND
ADD A0,A1
MOVK 5,A0
CALLA SRAND
MOVE *A4(OXPOS),A2,W
ADD A2,A0
ADDI >28,A0 ;ADJUST START COORD X ,Y
ADDI >40,A1
SUB A0,A6 ;FIND DELTA
SUB A1,A7
SLL 10,A6 ;SHIFT TO CALC VELOCITY
SLL 10,A7
MOVE A6,A2
MOVE A7,A3
ABS A2
ABS A3
ADD A2,A3
CMPI >28000,A3 ;IF VELOCITY TOO HIGH, HALVE IT
JRLS CANST1
SRA 1,A6
SRA 1,A7
CANST1
SLL 16,A0 ;ADJUST POSITION
SLL 16,A1
MOVI CNNBLL,A2 ;(OIMG)
MOVI 231,A3 ;(OZPOS)
MOVI DMAWNZ,A4 ;(OFLAGS) NON-ZERO VALUE
MOVI CLSENMY|TYPCBL2,A5 ;(OID)
CALLA BEGINOBJ2
CREATE 0,CANPRC ;SPITBALL PROCESS
MOVE A0,*A8(OPLINK),L ;FIX PROCESS LINK
CANSTX
MMFM SP,A0,A8
RETS
*
*CANNON BALL FLY PROCESS
*A8=CANNON OBJECT
*A10=COUNT
*PDATA=XACC, PDATA+>20=YACC
CANPRC:
MOVI 100,A10
CANPRCL
CALLA CLOSE ;CHECK TO SEE IF WE SHOULD EXPLODE BULLET!
JRC BULLEXP ;SET=EXP
MOVI [>1E,>21],A2
MOVI [>FC,>171],A3
CALLA SCRTSTG
JRNE BULLEXP
SLEEP 2
DSJS A10,CANPRCL
MOVE A8,A0
; CALLA DELPAL
CALLA DELOBJ
DIE
*
*SHOOT A FIREBALL AT YOU
*A8=BOSS DATA BLOCK PTR
*A11= PLAYER TO SHOOT
*
FIREP:
*OPEN YOUR MOUTH, DUDE !
MOVI BITE,A9
CALLR ANIBOSS
*FIRE OUT A BALL
MOVI 50,A0 ;GET GOAL X,Y
CALLA SRAND
MOVE A0,A1
MOVI 50,A0
CALLA SRAND
MOVE *A11(OXPOS),A6,W
MOVE *A11(OYPOS),A7,W
ADD A0,A6
ADD A1,A7
MOVE *A8,A4,L ;GET OBJ POINTER TO FIRST PART
MOVE *A4(OXPOS),A0,W
MOVE *A4(OYPOS),A1,W
ADDI >28,A0 ;ADJUST START COORD X ,Y
ADDI >40,A1
SUB A0,A6 ;FIND DELTA
SUB A1,A7
SLL 10,A6 ;SHIFT TO CALC VELOCITY
SLL 10,A7
MMTM SP,A0
MOVI >60000,A0 ;LIMIT VELOCITIES
CALLA VMAX
MMFM SP,A0
SLL 16,A0 ;ADJUST POSITION
SLL 16,A1
MOVI BLB1A,A2 ;(OIMG)
MOVI 231,A3 ;(OZPOS)
MOVI DMAWNZ,A4 ;(OFLAGS) NON-ZERO VALUE
MOVI CLSENMY|TYPCBALL,A5 ;(OID)
PUSH A8
CALLA BEGINOBJ2
CREATE 0,SPTPRC ;SPITBALL PROCESS
MOVE A0,*A8(OPLINK),L ;FIX PROCESS LINK
PULL A8
SLEEP 18
MOVI BITECL,A9 ;CLOSE YOUR MOUTH
CALLR ANIBOSS
DIE
*
*LIMIT VELOCITIES
*CALLING PARAMS: A0=LIMIT,A6=XV,A7,YV
*RET A6,A7 UNDER LIMIT A6+A7 < A0
VMAX
MMTM SP,A2,A3,A4,A5
MOVE A7,A5
MOVE A6,A4
SRA 3,A5
SRA 3,A4
VMAXL
MOVE A6,A2
MOVE A7,A3
ABS A2
ABS A3
ADD A2,A3
CMP A3,A0
JRHS VMAXX
SUB A4,A6
SUB A5,A7
JRUC VMAXL
VMAXX
MMFM SP,A2,A3,A4,A5
RETS
*
*SPIT BALL FLY PROCESS
*A8=SPIT BALL OBJECT
*A9=ANIMATION
*A10=COUNT
*PDATA=XACC, PDATA+>20=YACC
SPTPRC:
MOVI MISS,A0
CALLA ONESND
MOVI >400,A0 ;GET XACC
CALLA SRAND
MOVE A0,*A13(PDATA),L
MOVI >400,A0 ;GET YACC
CALLA SRAND
MOVE A0,*A13(PDATA+>20),L
MOVK 10,A10 ;6
FIREP00
MOVI SPITFLY,A9
FIREP0
MOVE *A8(OXVEL),A0,L ;DO SOME ACCELERATION
MOVE *A13(PDATA),A1,L
ADD A1,A0
MOVE A0,A1
ABS A1
CMPI >50000,A1 ;MAX IT OUT
JRHS FIREP01
MOVE A0,*A8(OXVEL),L
FIREP01
MOVE *A8(OYVEL),A0,L
MOVE *A13(PDATA+>20),A1,L
ADD A1,A0
MOVE A0,A1
ABS A1
CMPI >50000,A1 ;MAX IT OUT
JRHS FIREP02
MOVE A0,*A8(OYVEL),L
FIREP02
CALLR CLOSE ;CHECK TO SEE IF WE SHOULD EXPLODE BULLET!
JRC BULLEXP ;SET=EXP
SLEEP 1
CALLA ORBBNDCK ;BOUNCE BALLS OF WALL
MOVK 4,A1
JSRP FRANIM ;ANIMATE THE SUCKER
JRNC FIREP0
DEC A10
JRGE FIREP00
JRUC BULLEXP
; MOVE A8,A0
; CALLA DELOBJ
; CALLA DELPAL
; DIE
*
*GET ROBOT BOSS VELOCITY
*A11=PLAYER TO SEEK
*RETURNS PDATA+>40 XACC; PDATA+>50 YACC
*
GETRBV
MOVI 50,A0
CALLA SRAND
MOVE A0,A1
MOVI 50,A0
CALLA SRAND
MOVE *A11(OXPOS),A2,W
MOVE *A11(OYPOS),A3,W
ADD A0,A2
ADD A1,A3
MOVE *A8,A4,L ;GET POINTER TO A PIECE
MOVE *A4(OXPOS),A0,W
MOVE *A4(OYPOS),A1,W
SUB A0,A2
SUB A1,A3
SLL 6,A2
SLL 6,A3
MOVE A2,*A13(PDATA+>40),W
MOVE A3,*A13(PDATA+>50),W
RETS
*
*CHECK ROBOT BOSS OUT OF BOUNDS
*A0,A1,A2,A3 DESTROYED
*
RBBNDCK:
PUSH A8
MOVE *A8,A8,L ;GET FIRST OBJECT
MOVI [>2E,>2A],A2 ;BOUNDS CHECK
MOVI [>98,>116],A3
CALLR OFPNTTST ;IS IT IN BOUNDS ?
JRNE MV0
MMFM SP,A8 ;ON SCREEN O.K.
RETS
MV0
MOVE *A8(OXVEL),A1,L
MOVE *A8(OYVEL),A2,L
DEC A0
JRNE MV01
ABS A1 ;MAKE XV POSITIVE
JRUC MV00
MV01
DEC A0
JRNE MV02
ABS A1 ;MAKE XV NEGATIVE
NEG A1
JRUC MV00
MV02
ABS A2
DEC A0
JREQ MV00 ;UP CASE
NEG A2 ;DOWN WALL CASE
MV00
MOVE A1,A0
MOVE A2,A1
MMFM SP,A8
CALLR STFVEL ;STUFF THE SUCKER WITH NEW VELS
RETS
*
*CHEAP COLOR CYCLER
*CYCLES ANY NUMBER OF COLORS