forked from historicalsource/smashtv
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathHULKS.ASM
4373 lines (4123 loc) · 70.3 KB
/
HULKS.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
.FILE "HULKS.ASM"
.TITLE "ROBO-RAMA GAME PROGRAM"
.WIDTH 132
.OPTION B,D,L,T
.MNOLIST
;
; INITIATED: APRIL 26,1989
; MODIFIED: !
; SOFTWARE: MARK TURMELL
;
; COPYRIGHT (C) 1989 WILLIAMS ELECTRONICS GAMES, INC.
;
;
; GET THE SYSTEM STUFF
.INCLUDE "MPROC.EQU" ;MPROC EQUATES
.INCLUDE "DISP.EQU" ;DISPLAY PROC. EQUATES
.include "sys.inc" ;z unit system equates
.include "macros.hdr" ;macros definitions
.INCLUDE "IMGTBL.GLO"
.INCLUDE "ROBO.EQU"
.INCLUDE "FINGRNT.TBL"
;
;SOUNDS EXTERNAL
;
.REF EXP1,UGH,HEXP,EXP3HI,EXP3,UGH2,UGH3
;
;SYMBOLS EXTERNALLY DEFINED
;
.REF GPALOBJ,GETFPAL,BLOE2,FACEON,ZOOM4,FRANIM_DIE
.REF ADJSTWTL,PCNT,CIRCUIT,GALTYP
.REF RANGRAND,FRANIM
.REF P2DATA,P1DATA,SCRADD2
.REF GAMSTATE,WAVEYX
.REF KEEPXY,RAMXY,WAVE_RAM,HALT,EHALT
.REF GETANIX
.REF SET_GATE_2,RANDPER,KP_LS,KP_RS,KP_TS
.REF WAVE
.REF KILOBJ
.REF DEXIT
.REF FROMDR,PLYROBJS,PLYRPRCS
;
;SYMBOLS DEFINED IN THIS FILE
;
.DEF OVALBLD,SWAPSK,BAT_PLYR,BLOW,NEWV,ARMOFF,ARMOFF2,TWOCHNKS
.DEF CHNKS2,SETUP_DIR,ADDRPCS,BIG3A,NEW_OV
.DEF SPAWN_HULKS,KILL_HULK,ONSCRN_HULKS,HULK_DN,HULK_CNT,BIG2,BIG3
.DEF RED_CARPETX,RED_CARPETY,PIECES,NXT,DRINF,MAXHULK,KILL_H2
.DEF INTO,INFOTBL,GET_WVADDR,DO_DIFF2,GET_VALID_XY,INTO16
.DEF ADDPCS2,ADPCS3,ADPCS1,KILL_H1,PCTOT,GET_VALID_DOOR
.DEF ADPCS2,ADPCS4
.DEF XVEL,YVEL
; .DEF BEGIN_OBJ,GENERIC_INIT,BEGIN_OBJ2
.DEF BOOM2,BOOM3,HULKTYP,SPINFLGS
;
;UNINITIALIZED RAM DEFINITIONS
;
.BSS GENERIC_INIT,7*32-16
.BSS MAXHULK,8 ;MAX NUMBER OF HULKS ALLOWED ON SCRN
.BSS TMP1,32
.BSS TMP2,32
.BSS NXT,8
.BSS LASTPC,32
.BSS PCTOT,8
.BSS HULK_CNT,16 ;TOTAL HULKS ON SCREEN
.BSS TMP,16
.BSS LDOOR_INFO,32*2
.BSS RDOOR_INFO,32*2
.BSS TDOOR_INFO,32*2
.BSS BDOOR_INFO,32*2
.BSS HULK_DN,16
.BSS HULKTYP,16
.BSS PCINFO,(32+16+32)*PCSMAX
;
;EQUATES FOR THIS FILE
;
;FOR STARTING AN OBJECT
XVAL .EQU GENERIC_INIT
YVAL .EQU XVAL+32
IMG .EQU YVAL+32
ZPOS .EQU IMG+32
FLAGS .EQU ZPOS+16
ID .EQU FLAGS+16
XVEL .EQU ID+16
YVEL .EQU XVEL+32
;
;HULK DATA STRUCTURE
;
HAGE .EQU PDATA ;OBJECT AGE
DIR .EQU PDATA+16 ;OBJECT DIRECTION
DIS .EQU PDATA+32 ;OBJECT DISTANCE COUNT
CFLAGS .EQU PDATA+48 ;CONTROL FLAGS FOR OBJECT
SK_DIR .EQU PDATA+64 ;SEEK DIR FOR SPIN
LEVEL .EQU PDATA+80 ;DIFFICULTY LEVEL FOR SPEEDS ETC.
HSPD .EQU PDATA+96
H2SPD .EQU PDATA+128
VSPD .EQU PDATA+160
V2SPD .EQU PDATA+192
KPAGE .EQU PDATA+224 ;UHW
OSCILLATE .EQU PDATA+240 ;UHW
SKPLYR .EQU PDATA+256 ;UHB PLAYER # TO PURSUE
IBAT .EQU PDATA+264 ;UHB BAT FLAG 0=OFF, 1=ON
;
MAXLEVEL .EQU 10
;
HSPEED .EQU 08000H
.TEXT
;
SPAWN_HULKS:
;SPAWN HULKS IS CALLED FROM 'WAVE OVERLORD' CODE WHICH DISPERSES
;BAD GUYS THROUGHOUT A WAVE
; MOVE @HULK_DN,A0
; JRNZ HULK_OUT
MOVE @HULK_CNT,A2 ;MOVE BYTE (# HULKS ON SCRN) TO A2
MOVB @MAXHULK,A3
CMP A3,A2 ;HULKS MAXED OUT?
JRGT HULK_OUT
MOVI 140,A0
CALLA RANDPER
JRC GANG
CREATE HULKPID,AHULK ;START ONE HULK
HULK_OUT:
RETS
DRINF .LONG 0,KP_LS,KP_RS,KP_TS
GANG:
CLR B0
MOVK 4,B1
CALLA RANGRAND
;ANDI WAVE # AND CAUSE GANGS TO USE DIFFERENT DOORS!
MOVE A0,A1
SLL 5,A1
ADDI DRINF,A1
MOVE *A1,A1,L
MOVB *A1,A1 ;GET KP_LS ETC.
CMPI 1,A1
JRNE GT
;DOOR THIS GANG WANTS TO ORIGINATE IS CLOSING RIGHT NOW!
;SHIFT THIS GANG TO BOTTOM DOOR
MOVK 4,A0
GT MOVI 58,A1
PUSH A0
CALLA SET_GATE_2
PULL A0
DEC A0 ;DOOR TO GANG UP ON!
MOVE A0,A8
MOVI HULK,A2
CALLR GET_WVADDR
MOVE *A0(16),A0 ;GET HULKS LEFT TO RELEASE THIS WAVE!
CMPI 16,A0 ;MIN HULKS BEFORE GANG
JRLT GH1 ;RELEASE ALL OF THEM!
MOVK 7,B0 ;# OF HULKS IN A GANG
MOVK 16,B1
CALLA RANGRAND
GH1:
PUSH A0
CREATE HULKPID,GHULK
PULL A0
DSJNE A0,GH1
RETS
ONSCRN_HULKS:
MOVE @CIRCUIT,A0
CMPI 2,A0
JRC REGS
;CIRCUIT 2/3 (LAST TWO!)
MOVE @WAVE,A0
SLL 3,A0
ADDI HTYP,A0
MOVB *A0,A0
MOVE A0,@HULKTYP,W
REGS MOVK 16,A9 ;31 IS HOW MANY MAKE UP CIRCLE AROUND
;PLAYER WALKWAY INTO ARENA
MOVE A9,@TMP
;A2=# OF HULKS TO CREATE ON SCREEN
OH1 PUSH A2 ;CREATE A BUNCH OF THEM
CREATE HULKPID,OHULK
PULL A2
DSJNE A2,OH1
RETS
HTYP
;0=REGULAR HULKS
;2=SNAKE GRUNTS
;3=TECH CREW
.BYTE 0,2,2,0,2,0,0,2,0,2,2,0,0,2,0,0,2,0,0,0,0,0,0,0,0
.EVEN
OHULK:
;OHULK IS CALLED AT THE START OF A WAVE TO PLACE X # OF HULKS ON SCREEN
;AT THE BEGINNING OF A WAVE
MOVE *A13(CFLAGS),A0
ORI 01H,A0
MOVE A0,*A13(CFLAGS),W ;HULK IS IN STANDING MODE AT FIRST
MOVI HULK,A11
CALLA GET_VALID_XY ;MAKE SURE NEW HULK IS NOT
;OVERLAPPING ANY EXISTING SHAPE
;WHICH IS ALREADY ON SCRN AT START
;A0 & A1 ARE SET UP
;ADD IN OFFSETS FOR THIS PARTICULAR ARENA
MOVE @GAMSTATE,A2
CMPI INAMODE,A2
JREQ DMD
MOVE @WAVEYX,A2,L
;A2=PACKED OFFSETS
MOVX A2,A3
SLL 16,A3
ADD A3,A0 ;ADJUSTED A0 XVAL!
ANDI 0FFFF0000H,A2
ADD A2,A1 ;ADJUSTED A1 YVAL!
DMD CALLR IH1 ;INIT HULK (BEGIN_OBJ)
CALLA BEGINOBJ2
MOVI 3,A0 ;HULK STARTS FACING RIGHT
MOVE A0,*A13(DIR)
CALLR SETUP_HULK ;INC CNT, SET DIR, SET DEATH FLAG, ETC
CALLR DO_DIFF
CALLR JUST_SK
CALLR GET_STAND ;HULK STANDS AND SPINS UNTIL A MATCH
;THIS GETS CORRECT OIMG, OFLAGS
;POSSIBLY SLEEP HERE??!?? TO ALLEVIATE OSCILLATE PROBLEM? AT BEGINNING.
JRUC LUP_TOP
GXL: .LONG -400000H,01900000H,0AD0000H,0AD0000H
GXR: .LONG -010000H,01D00000H,0DD0000H,0DD0000H
GYT: .LONG 0600000H,0600000H,-600000H,00F80000H
GYB: .LONG 0880000H,0880000H,-100000H,01480000H
REALO:
MOVE A8,A0
; CALLA DELPAL ;NEEDED? NOT IF IN PLYR PAL!
CALLA DELOBJ
MOVE @HULK_CNT,A3
DEC A3
MOVE A3,@HULK_CNT
DIE
GHULK:
;GHULK PUTS X # OF HULKS BEHIND A DOOR IN GANG FORMATION!
;A0=DOOR TO GANG UP ON
;
SLL 4,A8
MOVI 30,A1
MOVE A1,*A13(DIS)
MOVI SD,A1
ADD A8,A1
MOVE *A1,A1
MOVE A1,*A13(DIR)
SLL 1,A8
MOVI GXL,A1
ADD A8,A1
MOVE *A1,A2,L ;GET X LEFT BOUNDARY
MOVI GXR,A1
ADD A8,A1
MOVE *A1,A3,L ;GET X RIGHT SIDE BOUNDARY
MOVI GYT,A1
ADD A8,A1
MOVE *A1,A4,L ;GET Y TOP
MOVI GYB,A1
ADD A8,A1
MOVE *A1,A5,L ;GET Y BOT
MOVE A2,B0
MOVE A3,B1
CALLA RANGRAND
MOVE A0,A6 ;A6 IS X
MOVE A4,B0
MOVE A5,B1
CALLA RANGRAND
MOVE A0,A1 ;A1 IS Y
MOVE A6,A0
CALLR IH1
CALLA BEGINOBJ
CALLR SETUP_HULK ;INC CNT, SET DIR, SET DEATH FLAG, ETC
CLR B0
MOVK 4,B1
MOVE @GALTYP,A0
JRZ R4
MOVK 1,B0
MOVK 5,B1
R4 CALLA RANGRAND
DEC A0
MOVE A0,*A13(LEVEL)
CALLR DO_DIFF
MOVE *A13(DIR),A0
CALLR INTO
CALLR GET_RUN
MOVE *A13(CFLAGS),A0 ;INDICATE GANG MEMBER FOR RUN IN
ORI 010H,A0
MOVE A0,*A13(CFLAGS)
SLEEP 2
JRUC LUP_TOP
AHULK:
;YES A NEW HULK WILL APPEAR
;UPDATE WAVE_INFO RAM TABLE TO REFLECT THIS NEW ENTRY!
;THIS HULK WAS SPAWNED FROM 'WAVE OVERLORD' CODE
;
CALLR SETUP_HULK ;INC CNT, SET DIR, SET DEATH FLAG, ETC
CALLR INIT_HULK ;INITIAL HULK PARAMS (BEGIN_OBJ)
JRNC OKZ
;CARRY SET MEANS THIS GUY WILL DIE BECAUSE HE WAS GOING TO COME
;OUT CLOSED DOOR
DIE
OKZ
MOVE *A13(LEVEL),A0
CMPI 4,A0 ;4
JRLT OKZ0
;CHANGE TO PURPLE PAL
MOVI GRNTP,A0
MOVE @HULKTYP,A1
JRZ YAH
MOVI SNKGP,A0
CMPI 2,A1
JRZ YAH
MOVI SNKGP,A0
YAH
CALLA GETFPAL ;GET A COLOR MAP ASSIGNMENT
MOVE A0,*A8(OPAL),W ;STORE THE NEW PALETTE
OKZ0 CALLR DO_DIFF
MOVE *A13(CFLAGS),A0
ORI 02H,A0
MOVE A0,*A13(CFLAGS) ;FROM DOORWAY!
BTST 2,A0 ;CHECK FOR PAUSE DELAY BEHIND DOOR
JRNZ LR
MOVE *A13(DIR),A0
CALLR INTO
LR
CALLR GET_RUN ;GET FIRST FRANIM PNTR FOR
;THIS HULKS DIRECTION
;
; LOOP TOP FOR HULKS
;
LUP_TOP:
;TOP OF HULK LOGIC
MOVE @HALT,A0
JRNZ CONT1
MOVB *A13(IBAT),A0
JRZ LP5
;A0=PLAYER 1 OR 2
;THIS HULK IS BATTING
;START BAT SWING
CLR A1
MOVE A1,*A8(OXVEL),L
MOVE A1,*A8(OYVEL),L
DEC A0
SLL 5,A0
ADDI PLYROBJS,A0
MOVE *A0,A0,L
MOVE *A0(OYPOS),A2 ;A2=Y OF PLYR I HIT
MOVE *A0(OXPOS),A1 ;A1=X
MOVE *A8(OYPOS),A3 ;A3=THIS HULKS' Y
MOVE *A8(OXPOS),A4 ;A4=THIS HULKS' X
CMP A3,A2
JRC SUP ;BR=BAT UPWARD
CMP A4,A1
JRC B8O ;BR=8 O'CLOCK SWING NEEDED
;4 O'CLOCK
MOVI BAT4O,A9
MOVE @HULKTYP,A0
JRZ GBAT
MOVI BAT4OS,A9
CMPI 2,A0
JRZ GBAT
;4TH CIRCUIT
MOVI BAT4OS,A9
GBAT MOVE A9,A10
MOVK 1,A1
JSRP FRANIM
MOVE A10,A9
MOVK 1,A1
JSRP FRANIM
JRUC BATDN
B8O
;8
MOVI BAT8O,A9
MOVE @HULKTYP,A0
JRZ GBAT1
MOVI BAT8OS,A9
CMPI 2,A0
JRZ GBAT1
;4TH CIRCUIT
GBAT1 MOVE A9,A10
MOVK 1,A1
JSRP FRANIM
MOVE A10,A9
MOVK 1,A1
JSRP FRANIM
JRUC BATDN
SUP CMP A4,A1
JRC B10O
;2 O'CLOCK
MOVI BAT2O,A9
MOVE @HULKTYP,A0
JRZ GBAT2
MOVI BAT2OS,A9
CMPI 2,A0
JRZ GBAT2
;4TH CIRCUIT
MOVI BAT2O,A9
GBAT2 MOVE A9,A10
MOVK 1,A1
JSRP FRANIM
MOVE A10,A9
MOVK 1,A1
JSRP FRANIM
JRUC BATDN
B10O
MOVI BAT10O,A9
MOVE @HULKTYP,A0
JRZ GBAT3
MOVI BAT10OS,A9
CMPI 2,A0
JRZ GBAT3
;4TH CIRCUIT
MOVI BAT10O,A9
GBAT3 MOVE A9,A10
MOVK 1,A1
JSRP FRANIM
MOVE A10,A9
MOVK 1,A1
JSRP FRANIM
BATDN CLR A0
MOVB A0,*A13(IBAT)
MOVE *A13(DIR),A0
MOVE A10,A9
CALLA INTO
SLEEP 1
JRUC LUP_TOP
LP5 MOVE *A13(CFLAGS),A0
BTST 2,A0
JREQ DOLOGIC
MOVE @HULK_DN,A1
JRNE REALO
BTST 3,A0
JRZ DOHULK
;END OF WAVE
;CHECK TO SEE IF DOOR IS IN PROCESS OF CLOSING
;IF SO, DELAY INTO CODE!
ANDI 0FFF3H,A0
MOVE A0,*A13(CFLAGS)
MOVE *A13(DIR),A0
CALLR INTO
;
; DO HULK MOVEMENT LOGIC A8=CURRENT OBJECT POINTER (HULK IMAGE)
;
DOLOGIC:
MOVE @EHALT,A0
JRZ MV ;BR=HALT ALL HULKS!!
;PLAYER IS WALKING INTO ARENA
;MAKE HULK FACE PLAYER AS HE ENTERS
;PUT HULKS INTO STAND MODE
; MOVE @HALT,A0 ;FOR WHEN PLAYER DIES AND EVERYTHING
;MUST HALT! NO RUNNING OFF SCRN!
; JRNZ DONE_SPIN
CLR A1
NOT A1
MOVI BUYINPID,A0
CALLA EXISTP
JRNZ DONE_SPIN
CLR A0
MOVE A0,*A8(OXVEL),L
MOVE A0,*A8(OYVEL),L
MOVE *A13(CFLAGS),A0
ORI 01H,A0
MOVE A0,*A13(CFLAGS),W ;SET STAND MODE FOR THIS HULK
MOVE *A13(SK_DIR),A1
MOVE *A13(DIR),A0,W
CMP A0,A1
JREQ DONE ;BR=ALREADY FACING IN CORRECT DIR
CALLR WAY
DONE_SPIN:
SLEEP 2
JRUC LUP_TOP
DONE:
;GET NEW SEEK DIR
;IGNORE (DIS) TIMER AND GET NEW SEEK DIR RIGHT AWAY!
CALLR SETUP_DIR
CALLR DO_DIFF
JRUC DONE_SPIN
MV:
;FIRST, DO AGE/LEVEL UPDATE
MOVE *A13(HAGE),A0
ANDI 03FFH,A0
DEC A0
MOVE A0,*A13(HAGE)
JRNZ C7
MOVE *A13(LEVEL),A0
CMPI MAXLEVEL,A0
JREQ C7
INC A0
MOVE A0,*A13(LEVEL)
; CMPI 4,A0
; JRNE MVB
; MOVI GRNTP,A0
; CALLA GETFPAL ;GET A COLOR MAP ASSIGNMENT
; MOVE A0,*A8(OPAL),W ;STORE THE NEW PALETTE
;MVB
CALLR DO_DIFF
MOVE *A13(KPAGE),A0
MOVE A0,*A13(HAGE)
C7: MOVE *A13(CFLAGS),A0
BTST 0,A0
JRZ NOSPN
; THIS HULK IS SPINNING, DO SPIN
MOVE *A13(SK_DIR),A1
MOVE *A13(DIR),A0,W
CMP A0,A1
JRNE CONT
; HULK HAS SPUN TO CORRECT DIR, NOW START HIM WALKING AGAIN
; SET DIS CNTR ALSO
; CHECK TO MAKE THIS DIR IS STILL HEADING TOWARD PLAYER!
; IF SO, START RUN WITH CORRECT VELOCITY STUFFED TO COLLIDE WITH PLAYER
; IF NOT, SPIN SOME MORE!
; IF NEW SEEK IS <> OLD SEEK, THEN SET STAND FLAG
MOVE *A13(CFLAGS),A0
BTST 1,A0 ;REGULAR HULK RUN IN FLAG
JRZ R0
; HULK HAS RUN IN, NOW ANGLE HIM OFF RANDOMLY
MOVK 15,A0
MOVE A0,*A13(DIS)
MOVE *A13(CFLAGS),A0
ANDI 0FFFDH,A0
MOVE A0,*A13(CFLAGS)
JRUC GOODNEWS
R0 PUSH A1
CALLA JUST_SK ;WILL STUFF NEW VEL
PULL A1
MOVE *A13(SK_DIR),A0
CMP A0,A1 ;NEW CMP OLD SEEK
JREQ GOODNEWS
;HULK SPUN TO CORRECT DIR THEN CHECKED AGAIN AND THE PLAYER HAD MOVED
MOVE *A13(OSCILLATE),A0
JRNZ GNW
MOVK 1,A0
MOVE A0,*A13(OSCILLATE)
;SET HULK SPIN FLAG AGAIN BECAUSE PLAYER MOVED!
MOVE *A13(CFLAGS),A0
ORI 01H,A0
MOVE A0,*A13(CFLAGS),W
SLEEP 1
JRUC LUP_TOP
GNW MOVK 6,A0
MOVE A0,*A13(DIS)
GOODNEWS:
CLR A0
MOVE A0,*A13(OSCILLATE)
CALLR GET_RUN ;ZEROS STAND FLAG ALSO
SLEEP 1
JRUC LUP_TOP
CONT:
CALLR WAY ;WHICH WAY TO SPIN/THEN ANI STAND VW
CONT1: SLEEP 3
JRUC LUP_TOP
NOSPN: MOVE *A13(DIS),A0 ;UPDATE DISTANCE COUNT
DEC A0
MOVE A0,*A13(DIS) ;STUFF NEW COUNT
JRNZ DOHULK ;BR=CONTINUE CURRENT DIRECTION
MOVE *A13(CFLAGS),A0
BTST 4,A0
JRZ NGNG ;BR=NOT A GANG MEMBER
;GANG MEMBER WHO WANTS TO TURN TOWARD PLAYER
;HE MUST WAIT TILL HE IS ON SCREEN!
MOVE *A8(OYVAL),A5,L
MOVE *A8(OXVAL),A4,L
MOVE @PLYRPRCS,A7,L
JRNZ TOK
;GET BND FROM OTHER PLAYER
MOVE @PLYRPRCS+32,A7,L
TOK MOVE *A7(LFTBND),A0,L
CMP A0,A4
JRLO BAD
MOVE *A7(RGTBND),A0,L
CMP A0,A4
JRHI BAD
MOVE *A7(UPBND),A0,L
CMP A0,A5
JRLO BAD
MOVE *A7(DNBND),A0,L
CMP A0,A5
JRLO OK
BAD MOVK 5,A0
MOVE A0,*A13(DIS) ;STUFF NEW COUNT
JRUC DOHULK ;BR=CONTINUE CURRENT DIRECTION
OK MOVE *A13(CFLAGS),A0
ANDI 0FFEFH,A0
MOVE A0,*A13(CFLAGS)
JRUC T3
NGNG MOVE *A13(CFLAGS),A0
BTST 1,A0
JRZ T3
;THIS HULK JUST RUNNING IN! GIVE THIS ONE A BOGUS SEEK DIR
;IF WITHIN WALLS THEN CONT, OTHERWISE RESET DIS CNTR
MOVE *A13(DIR),A3
DEC A3
SLL 5,A3
ADDI NEWANG,A3
MOVK 1,B0
MOVK 4,B1
CALLA RANGRAND
MOVE *A3,A3,L
DEC A0
SLL 4,A0
ADD A0,A3
MOVE *A3,A0 ;NEW SEEK DIR
MOVE A0,*A13(SK_DIR)
CALLR INTO
JRUC T4
NEWANG: .LONG ANG1,0,ANG3,0,ANG5,0,ANG7
ANG5: .WORD 7,6,4,3
ANG1: .WORD 7,3,8,2
ANG3: .WORD 1,5,2,4
ANG7: .WORD 8,6,1,5
;
;
;NOW POINT THIS HULK AT CURRENT POSITION OF PLAYER
T3: MOVE *A13(SK_DIR),A7,W
;IF NEW SEEK IS <> OLD SEEK, THEN SET STAND FLAG
CALLA JUST_SK ;WILL STUFF NEW VEL
MOVE *A13(SK_DIR),A0
CMP A0,A7 ;NEW CMP OLD SEEK
JREQ DOHULK
T4: MOVE *A13(CFLAGS),A0 ;SAYS I AM SPINNING
ORI 01H,A0
MOVE A0,*A13(CFLAGS),W
MOVK 2,A0
MOVE A0,*A13(OSCILLATE)
SLEEP 3
JRUC LUP_TOP
DOHULK:
CLR A1
JSRP FRANIM
JRNC CHECK_NEXT ;BR=NOT AT END OF SCRIPT YET
CALLR GET_RUN
CHECK_NEXT:
JRUC LUP_TOP
;
SETUP_HULK:
;DIR IS BASED ON WHAT DOOR HE IS ENTERING THROUGH!
;IF THIS IS AN ONSCREEN HULK, THEN ANY DIR IS OKAY!
;
MOVK 5,A0 ;1
MOVE A0,*A13(SK_DIR)
CLR A0
MOVE A0,*A13(CFLAGS)
MOVB A0,*A13(IBAT) ;NO BATTING AT START!
MOVI 0,B0
MOVK 10,B1
CALLA RANGRAND ;TIE THIS IN WITH DIFFICULTY!
SLL 4,A0
ADDI AGTBL,A0
MOVE *A0,A0
SLL 1,A0 ;TAKE OUT! MODIFY TABLE
MOVE A0,*A13(HAGE)
MOVE A0,*A13(KPAGE)
;
; UPDATE HULK COUNT
;
MOVE @HULK_CNT,A0
INC A0
MOVE A0,@HULK_CNT
;CHOOSE PLAYER TO SEEK
ANDI 01,A0
MOVB A0,*A13(SKPLYR)
MOVE A0,A1
SLL 5,A1
ADDI PLYROBJS,A1
MOVE *A1,A1,L
MOVE *A1(OXPOS),A1
JRNZ ZY ;BR=OKAY TO SEEK THIS PLAYER
;PLAYER I AM SEEKING IS IN DIE MODE
XORI 1,A0
MOVB A0,*A13(SKPLYR)
ZY
MOVI HULK,A2
CALLR GET_WVADDR
MOVE *A0(32),A1,W ;GET DIFFICULTY LEVEL
MOVE A1,*A13(LEVEL),W
MOVE *A0(16),A1,W ;DEC WAVE RAM CNT FOR THIS HULK
DEC A1
MOVE A1,*A0(16),W
JRNZ BZ
;END OF THIS WAVES HULK CNT
MOVK 1,A1
MOVE A1,@HULK_DN
CREATE 0,DEXIT
;
BZ
RETS
GET_WVADDR:
;A2=ENEMY TYPE LOOKING FOR
;IE.HULK,TANK
MOVI WAVE_RAM,A0
HU1: MOVE *A0,A1,W ;TYPE
CMP A2,A1
JREQ YSID
ADDI 6*16,A0
JRUC HU1
YSID: RETS
;
JUST_SK:
CALLR GET_DIS
CALLR SETUP_DIR
RETS
DO_DIFF:
MOVI HSPEED,A1
DO_DIFF2:
MOVE *A13(LEVEL),A0
Z0 JRZ Z1
ADDI 02000H,A1
DEC A0
JRUC Z0
Z1 MOVE A1,*A13(HSPD),L
MOVE A1,A5
SUBI 01000H,A5
MOVE A5,*A13(VSPD),L
MOVK 10,A3
DIVU A3,A1 ;DIVIDE A1 BY 10
MOVK 8,A4
MPYU A4,A1 ;A1 * .8
MOVE A1,*A13(H2SPD),L
DIVU A3,A5
MPYU A4,A5
MOVE A5,*A13(V2SPD),L
RETS
LEVTBL:
; .WORD 9,9,8,8,7,7,6,6,5,5,4,4,3,3,3,3
.WORD 11,10,9,8,7,7,6,6,5,5,4,4,3,3,3,3
AGTBL: .WORD 80,150,90,110,140,210,250,50,70,125,45,80
;AGTBL: .WORD 03,13,23,32,43,53,63,8,18,03,3,7
;
GET_DIS:
MOVK 1,B0
MOVE *A13(LEVEL),A0
SLL 4,A0
ADDI LEVTBL,A0
MOVE *A0,A2
MOVE A2,B1
CALLA RANGRAND
MOVE A0,*A13(DIS) ;TIME BEFORE WE GET NEW VELOCITIES
RETS
WAY:
;A1=SEEK DIR
;A0=DIR IMAGE IS FACING NOW
SUB A0,A1
MOVE A1,A2
ABS A1
CMPI 5,A1
JRLT N0
NEG A2
N0: BTST 31,A2
JRZ IC
DEC A0
JRP T1
MOVK 8,A0
JRUC T1
IC: INC A0 ;ROTATE TOWARD PLAYER
CMPI 9,A0
JRNE T1
MOVK 1,A0
T1: MOVE A0,*A13(DIR),W
CALLA GET_STAND ;DOES ANI OF CORRECT VIEW
RETS
SWAPSK
;SEEK ANOTHER PLAYER ROUTINE
;A10=0 OR 1 FOR WHICH PLAYER DIED
CLR A1
NOT A1
MOVI HULKPID,A0
CALLA EXISTP
JRZ OUTZ
;FOUND HULK
MOVB *A0(SKPLYR),A1
CMP A1,A10
JRZ YES
MOVI TP2PID,A1
MOVE A1,*A0(PROCID),W
JRUC SWAPSK
YES MOVI TEMPPID,A1
MOVI SWAPIT,A7
CALLA GETA8
CALLA GETA9
CALLA XFERPROC
JRUC SWAPSK
OUTZ
CLR A1
NOT A1
MOVI TP2PID,A0
CALLA EXISTP
JRZ OUTB
;FOUND TEMP HULK
MOVI HULKPID,A1
MOVE A1,*A0(PROCID),W
JRUC OUTZ
OUTB RETS
SWAPIT
;HULKS FALL INTO HERE IF PLAYER THEY WERE SEEKING HAS DIED. THEY WILL
;NOW SEEK OTHER PLAYER
MOVI HULKPID,A0
MOVE A0,*A13(PROCID),W
MOVB *A13(SKPLYR),A2
XORI 1,A2
MOVE A2,A1
SLL 5,A1
ADDI PLYROBJS,A1
MOVE *A1,A1,L
JRZ ZCT ;BR=OTHER PLAYER DOES NOT EXIST!
MOVB A2,*A13(SKPLYR)
ZCT
SLEEP 1
JAUC LUP_TOP
SETUP_DIR:
;GET NEW VELOCITIES AND SEEK DIR FOR THIS HULK
;SET SEEK DIR FOR THIS HULK
;MAKE SURE THIS LEG_PTR HAS A VALID VALUE! THE PLAYER MUST BE INITIALIZED!
;DETERMINE WHICH OF TWO PLAYERS THIS HULK IS SEEKING!
;NORMAL
MOVB *A13(SKPLYR),A2
MOVE A2,A1
SLL 5,A1
ADDI PLYROBJS,A1
MOVE *A1,A1,L
JRNZ ZCV
;PLAYER NO LONGER EXISTS! GET OTHER
WIT
CMPI 3,A2
JRLT WIT2
;OH OH! BOTH ARE DEAD
MOVI 0111H,A0
MOVE A0,@EHALT
RETS
WIT2 XORI 1,A2
MOVB A2,*A13(SKPLYR)
SLL 5,A2
ADDI PLYROBJS,A2
MOVE *A2,A1,L
ZCV
MOVE *A1(OXPOS),A0,W
JRZ WIT
MOVE *A1(OYPOS),A2,W
SLL 16,A2
MOVY A2,A0
CALLA GETXY ;A8 TO SEEK A0
INC A0
MOVE A0,*A13(SK_DIR) ;DIR WE WANT TO BE FACING!
;
;NEEDED?!!
;
MOVE @EHALT,A1 ;IN CASE HULKS MOVE SLIGHTLY
JRNE NRM
;FALLS INTO THIS
INTO:
;A0=DIR FROM 1-8
SLL 5,A0
ADDI JTBL,A0
MOVE *A0,A0,L
JUMP A0
JTBL .LONG 0,IN1,IN2,IN3,IN4,IN5,IN6,IN7,IN8
INTO16:
;A0=DIR FROM 1-16
SLL 5,A0
ADDI JTBL16,A0
MOVE *A0,A0,L
JUMP A0
JTBL16 .LONG LK,IN1,LK,IN2,LK,IN3,LK,IN4,LK,IN5,LK,IN6,LK,IN7,LK,IN8,LK
; 01
; 16 02
; 15 03
; 14 04
; 13 05
; 12 06
; 11 07
; 10 08
; 09
;
LK
; LOCKUP
IN1
;IS 0 DIR
MOVE *A13(VSPD),A0,L
NEG A0
CLR A1
MOVE A1,*A8(OXVEL),L
MOVE A0,*A8(OYVEL),L
NRM RETS
IN2
MOVE *A13(V2SPD),A0,L
NEG A0
MOVE *A13(H2SPD),A1,L
MOVE A1,*A8(OXVEL),L
MOVE A0,*A8(OYVEL),L
RETS
IN3
CLR A0
MOVE *A13(HSPD),A1,L
MOVE A1,*A8(OXVEL),L
MOVE A0,*A8(OYVEL),L
RETS
IN4
MOVE *A13(V2SPD),A0,L
MOVE *A13(H2SPD),A1,L
MOVE A1,*A8(OXVEL),L
MOVE A0,*A8(OYVEL),L
RETS
IN5
MOVE *A13(VSPD),A0,L
CLR A1
MOVE A1,*A8(OXVEL),L
MOVE A0,*A8(OYVEL),L
RETS
IN6
MOVE *A13(V2SPD),A0,L
MOVE *A13(H2SPD),A1,L
NEG A1
MOVE A1,*A8(OXVEL),L
MOVE A0,*A8(OYVEL),L
RETS
IN7
CLR A0
MOVE *A13(HSPD),A1,L
NEG A1
MOVE A1,*A8(OXVEL),L
MOVE A0,*A8(OYVEL),L
RETS
IN8
MOVE *A13(H2SPD),A1,L
NEG A1
MOVE *A13(V2SPD),A0,L
NEG A0
MOVE A1,*A8(OXVEL),L
MOVE A0,*A8(OYVEL),L
RETS
GET_RUN:
;GET FRANIM BASE ADDRESS FOR THIS HULKS DIRECTION
;
MOVE *A13(DIR),A4
DEC A4
SLL 5,A4 ;*32 FOR LONG WORD LOOKUP TABLE
MOVE @HULKTYP,A0
JRZ NORM
CMPI 2,A0
JRZ NORM1
;4TH CIRCUIT
JRUC NORM ;SPO
NORM1
MOVE *A13(LEVEL),A0
CMPI 2,A0 ;3
JRLT SLOA
CMPI 5,A0 ;6
JRLT MEDA
ADDI WALK_LISTFA,A4
JRUC SPO
MEDA ADDI WALK_LISTMA,A4
JRUC SPO
SLOA ADDI WALK_LISTA,A4 ;CALCULATE OFFSET IN TABLE
JRUC SPO
NORM MOVE *A13(LEVEL),A0
CMPI 2,A0 ;3
JRLT SLO