2246 lines
41 KiB
NASM
2246 lines
41 KiB
NASM
.FILE 'TANK.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 "\VIDEO\SYS\SYS.INC" ;Z UNIT SYSTEM EQUATES
|
||
.INCLUDE "\VIDEO\SYS\MACROS.HDR" ;MACROS DEFINITIONS
|
||
.INCLUDE "IMGTBL.GLO"
|
||
.INCLUDE "ROBO.EQU"
|
||
; .INCLUDE "MARK.EQU"
|
||
|
||
;
|
||
;SOUNDS EXTERNAL
|
||
;
|
||
.REF EXP3,MISS2
|
||
|
||
;SYMBOLS EXTERNALLY DEFINED
|
||
;
|
||
.REF TANKDIFF,TANKDIFF2,TNKHITS
|
||
.REF BEGINOBJ2,BEGINOBJ,RANGRAND,FRANIM,INTO16
|
||
.REF P2DATA,P1DATA,SCRADD2,GET_WVADDR,DO_DIFF2,RANDPER
|
||
.REF GAMSTATE,WAVEYX,DEXIT,CIRCUIT,GETFPAL,ECON
|
||
.REF KEEPXY,RAMXY,WAVE_RAM,HALT,EHALT,XYSKOBJ
|
||
.REF GETADIR2,TOID_ON,PCNT,GETUGH
|
||
.REF SET_GATE_2,DRINF,SMLEXP
|
||
.REF WAVE,ADPCS1,PCTOT
|
||
.REF BOOM2,DELPAL,PLYROBJS,BOOM3
|
||
.REF FROMDR,GET_VALID_XY,ENON
|
||
.REF BULL_EXP_LIST,RECOIL
|
||
;
|
||
;SYMBOLS DEFINED IN THIS FILE
|
||
;
|
||
.DEF GETHDR,KILL_TK,KILL_TS,ABALL,WAY,FRANIM_DIE
|
||
.DEF SPAWN_TNK,KILL_TNK,ONSCRN_TNK,TURN_TANK,TNK_DN
|
||
.DEF TNK_CNT,KILL_TORSO,ADRIVER,KILL_CBALL,CVRT,DOBLO
|
||
.DEF CVRT2,MEBNCS,BULL_TOP,KILL_CBALL2,MAXTNK
|
||
.DEF TTORSO,KILL_TNKR,TSO_EXP,TSO_EXP2
|
||
.DEF FLASHME,GET_STANDT2
|
||
;
|
||
;UNINITIALIZED RAM DEFINITIONS
|
||
;
|
||
.BSS SCNTR,8 ;SIMPLE CNTR FOR RANDOMNESS
|
||
.BSS MAXTNK,8 ;MAX NUMBER OF TANKS ALLOWED ON SCRN
|
||
.BSS TNK_CNT,16 ;TOTAL TANKS ON SCREEN
|
||
.BSS TMP,16
|
||
.BSS TNK_DN,16
|
||
.BSS MEBNCS,16
|
||
;
|
||
;EQUATES FOR THIS FILE
|
||
;
|
||
;TANK DATA STRUCTURE
|
||
;
|
||
ADRIVER .EQU PDATA ;UHB A DRIVER OR NOT?
|
||
ABSORBT .EQU PDATA+8 ;UHB-SHOTS ABSORBED
|
||
DIR .EQU PDATA+16 ;UHW 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
|
||
REACT .EQU PDATA+224 ;UHB
|
||
BUMP .EQU PDATA+232 ;UHB
|
||
DELYDT .EQU PDATA+240 ;UHB
|
||
WAY01 .EQU PDATA+248 ;UHB
|
||
MYTSO .EQU PDATA+256 ;UHL TORSO POINTER ABOVE ME
|
||
;
|
||
;
|
||
;TORSO DATA STRUCTURE
|
||
;
|
||
KPTANK .EQU PDATA ;UHL
|
||
ABSORB .EQU PDATA+32 ;UHB-SHOTS ABSORBED
|
||
TDIR .EQU PDATA+40 ;UHW OBJECT DIRECTION
|
||
TCFLAGS .EQU PDATA+56 ;UHW CONTROL FLAGS FOR OBJECT
|
||
TSK_DIR .EQU PDATA+72 ;UHW SEEK DIR FOR SPIN
|
||
KPTANKO .EQU PDATA+88 ;UHL
|
||
MODE .EQU PDATA+120 ;UHB
|
||
TCNTR .EQU PDATA+128 ;UHB
|
||
SPDLY .EQU PDATA+136 ;UHB
|
||
FIRED .EQU PDATA+144 ;UHB
|
||
TPNTR .EQU PDATA+152 ;UHB
|
||
TOIDLR .EQU PDATA+160 ;UHB 0=LEFT OF TOID,1=RGT OF TOID
|
||
;
|
||
;LEVEL .EQU PDATA+86 ;UHW DIFFICULTY LEVEL FOR SPEEDS ETC.
|
||
;
|
||
;EQUATES
|
||
;
|
||
TOTBNCS .EQU 1 ;# OF BOUNCES TANK BULLETS HAVE IN THEM
|
||
;TOTHIT .EQU 25 ;HITS IT TAKES TO DESTROY TORSO
|
||
TOIDHIT .EQU 51 ;HITS IT TAKES TO DESTROY TORSO ON MUTOID MAN
|
||
HITTNK .EQU 3 ;HITS IT TAKES TO DESTROY TANK
|
||
;
|
||
HSPEED .EQU 012000H
|
||
HBSPEED .EQU 04000H
|
||
|
||
.TEXT
|
||
;
|
||
SPAWN_TNK:
|
||
;SPAWN TANK IS CALLED FROM 'WAVE OVERLORD' CODE WHICH DISPERSES
|
||
;BAD GUYS THROUGHOUT A WAVE
|
||
; MOVE @TNK_DN,A0
|
||
; JRNZ TANK_OU
|
||
MOVE @HALT,A0
|
||
JRNZ TANK_OUT
|
||
MOVE @TNK_CNT,A2 ;MOVE BYTE (# TANKS ON SCRN) TO A2
|
||
MOVB @MAXTNK,A3
|
||
CMP A3,A2 ;TANKS MAXED OUT?
|
||
JRGE TANK_OUT ;
|
||
|
||
MOVE @CIRCUIT,A0
|
||
JRZ YES
|
||
CMPI 2,A0
|
||
JRNZ POP
|
||
YES
|
||
MOVB A3,@ENON ;INDICATES ENEMY TO NEUTRAL IS ON!
|
||
POP
|
||
CREATE TNKPID,ATNK ;START ONE TANK
|
||
TANK_OUT:
|
||
RETS
|
||
|
||
ONSCRN_TNK:
|
||
;A2=# OF TANKS TO CREATE ON SCREEN
|
||
MOVB A2,@ENON ;INDICATES ENEMY TO NEUTRAL IS ON!
|
||
OH1 PUSH A2 ;CREATE A BUNCH OF THEM
|
||
CREATE TNKPID,OTNK
|
||
PULL A2
|
||
DSJNE A2,OH1
|
||
MOVE @CIRCUIT,A0
|
||
JRZ RTO
|
||
CMPI 2,A0
|
||
JRZ RTO
|
||
CLR A0
|
||
MOVB A0,@ENON
|
||
RTO
|
||
RETS
|
||
|
||
OTNK:
|
||
;OTNK IS CALLED AT THE START OF A WAVE TO PLACE X # OF TANKS ON SCREEN
|
||
;AT THE BEGINNING OF A WAVE
|
||
|
||
CLR A0
|
||
MOVB A0,*A13(REACT)
|
||
MOVB A0,*A13(BUMP)
|
||
MOVK 1,A0
|
||
MOVE A0,*A13(DIR)
|
||
|
||
CLR A11 ;A11 CLR=SKIP CIRCLE TABLE ALIGNMENT
|
||
CALLA GET_VALID_XY ;MAKE SURE NEW TANK 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
|
||
;A0,A1 ARE SETUP.
|
||
CALLA IH1 ;INIT TANK (BEGINOBJ)
|
||
CALLA BEGINOBJ2
|
||
|
||
; MOVE @WAVE,A0
|
||
; CMPI 10,A0
|
||
; JRC NOCHNG
|
||
;HIGH WAVE, CHANGE PAL
|
||
;CHANGE TO OTHER PAL
|
||
; MOVI GLDP,A0
|
||
; CALLA GETFPAL ;GET A COLOR MAP ASSIGNMENT
|
||
; MOVE A0,*A8(OPAL),W ;STORE THE NEW PALETTE
|
||
;NOCHNG
|
||
|
||
CALLA SETUP_TNK ;INC CNT, SET DIR, SET DEATH FLAG, ETC
|
||
MOVI HSPEED,A1 ;TANK SPEED
|
||
CALLA DO_DIFF2 ;SET UP HIS RAM SPEED AREA
|
||
CALLA GET_DIS ;SET DISTANCE CNT FOR THIS DIR
|
||
CALLA GET_STAND ;TANK STANDS AND SPINS UNTIL A MATCH
|
||
;THIS GETS CORRECT OIMG, OFLAGS
|
||
JRUC LUP_TOP
|
||
ATNK:
|
||
;YES A NEW TANK WILL APPEAR
|
||
;UPDATE WAVE_INFO RAM TABLE TO REFLECT THIS NEW ENTRY!
|
||
;THIS TANK WAS SPAWNED FROM 'WAVE OVERLORD' CODE
|
||
CLR A0
|
||
MOVB A0,*A13(REACT)
|
||
MOVB A0,*A13(BUMP)
|
||
MOVB A0,*A13(ABSORBT)
|
||
CALLA INIT_TNK ;INITIAL TANK PARAMS (BEGINOBJ)
|
||
JRNC AZ
|
||
DIE
|
||
AZ
|
||
CALLA SETUP_TNK ;INC CNT, SET DIR, SET DEATH FLAG, ETC
|
||
MOVI HSPEED,A1 ;TANK SPEED
|
||
CALLA DO_DIFF2
|
||
|
||
MOVI 20,A0
|
||
MOVE A0,*A13(DELYDT)
|
||
|
||
MOVE *A13(DIR),A0
|
||
CALLA INTO16
|
||
CALLA GET_RUN ;GET FIRST FRANIM PNTR FOR
|
||
;THIS TANKS DIRECTION
|
||
;
|
||
; LOOP TOP FOR TANKS
|
||
;
|
||
LUP_TOP:
|
||
CLR A0
|
||
MOVB A0,@TOID_ON
|
||
MOVE A13,A10
|
||
CREATE TNKPID,TTORSO
|
||
MOVK 1,A0
|
||
MOVB A0,*A13(ADRIVER)
|
||
LUP_TP:
|
||
;TOP OF TANK LOGIC
|
||
MOVE @EHALT,A0
|
||
JRZ MV ;BR=HALT ALL TANKS!!
|
||
;PLAYER IS WALKING INTO ARENA
|
||
CLR A0
|
||
MOVE A0,*A8(OXVEL),L
|
||
MOVE A0,*A8(OYVEL),L
|
||
SLEEP 2
|
||
JRUC LUP_TP
|
||
MV:
|
||
MOVB *A13(REACT),A0
|
||
CMPI 2,A0
|
||
JRNE MV2
|
||
;TANK HAS JUST COLLIDED WITH ANOTHER TANK.
|
||
;BACK UP
|
||
;THEN SPIN AS I WAS GOING TO
|
||
;
|
||
SLEEP 20
|
||
MOVI HBSPEED,A1 ;TANK SPEED BACKWARDS
|
||
CALLA DO_DIFF2 ;SET UP HIS RAM SPEED AREA
|
||
MOVE *A13(DIR),A0
|
||
SLL 3,A0
|
||
ADDI REVTBL,A0
|
||
MOVB *A0,A0
|
||
CALLA INTO16
|
||
MOVI 15,A0
|
||
MOVE A0,*A13(DIS)
|
||
MOVK 1,A0
|
||
MOVB A0,*A13(REACT)
|
||
MV2:
|
||
MOVE *A13(CFLAGS),A0
|
||
BTST 0,A0
|
||
JRZ NOSPN
|
||
;THIS TANK IS SPINNING, DO SPIN
|
||
MOVE *A13(SK_DIR),A1
|
||
MOVE *A13(DIR),A0,W
|
||
CALLA WAY
|
||
JRC DIT ;INC
|
||
;DEC=CLRC
|
||
MOVI 0,A1
|
||
MOVB A1,*A13(WAY01)
|
||
JRUC DIT0
|
||
DIT MOVK 1,A1
|
||
MOVB A1,*A13(WAY01)
|
||
DIT0
|
||
MOVE A0,*A13(DIR),W
|
||
CALLA GET_STAND ;DOES ANI OF CORRECT VIEW
|
||
MOVE *A13(SK_DIR),A1
|
||
MOVE *A13(DIR),A0,W
|
||
CMP A0,A1
|
||
JREQ GOODNEWS
|
||
;ANI IN NEW STAND/SPIN DIR
|
||
SLEEP 4
|
||
JRUC LUP_TP
|
||
|
||
GOODNEWS:
|
||
MOVI 300,A0
|
||
CALLA RANDPER
|
||
JRNC REGU
|
||
;PAUSE TANK BEFORE IT MOVES
|
||
SLEEP 20
|
||
MOVB *A13(DELYDT),A0
|
||
JRNZ REGU
|
||
MOVB *A13(BUMP),A0
|
||
JRNZ REGU
|
||
MOVI 400,A0
|
||
CALLA RANDPER
|
||
JRC MORE
|
||
REGU SLEEP 20
|
||
CALLA GET_RUN ;ZEROS STAND FLAG ALSO
|
||
CALLA GET_DIS ;SEND FOR THIS DISTANCE
|
||
|
||
; 01
|
||
; 16 02
|
||
; 15 03
|
||
; 14 04
|
||
; 13 05
|
||
; 12 06
|
||
; 11 07
|
||
; 10 08
|
||
; 09
|
||
|
||
MOVI HSPEED,A1 ;TANK SPEED
|
||
CALLA DO_DIFF2 ;SET UP HIS RAM SPEED AREA
|
||
MOVE *A13(DIR),A0
|
||
CALLA INTO16 ;GET PROPER VELOCITY FOR THIS DIR
|
||
|
||
SLEEP 1
|
||
JRUC LUP_TP
|
||
|
||
NOSPN: MOVE *A13(DIS),A0 ;UPDATE DISTANCE COUNT
|
||
DEC A0
|
||
MOVE A0,*A13(DIS) ;STUFF NEW COUNT
|
||
JRNZ DOTNK ;BR=CONTINUE CURRENT DIRECTION
|
||
;TIME TO GET NEW DISTANCE
|
||
|
||
MOVB *A13(BUMP),A0
|
||
JRNZ TRN
|
||
|
||
MOVI [>23+60,>21+55],A2
|
||
MOVI [>FC-40,>171-55],A3
|
||
CALLA SCRTSTG
|
||
JRZ CONT ;BR=NOT INTO WALL
|
||
;ALMOST ABOUT TO RUN INTO A WALL
|
||
;A0= 3
|
||
; 1 2
|
||
; 4
|
||
|
||
MOVE *A13(DIR),A1
|
||
SLL 3,A1
|
||
ADDI TABL1,A1
|
||
MOVB *A1,A1
|
||
CMP A0,A1
|
||
JRNE CONT
|
||
;WALL IS RIGHT IN FRONT OF TANK
|
||
|
||
MOVI 10,A0
|
||
MOVE A0,*A13(DIS)
|
||
JRUC DOTNK
|
||
|
||
CONT CLR A0
|
||
MOVE A0,*A8(OXVEL),L
|
||
MOVE A0,*A8(OYVEL),L
|
||
MOVB *A13(REACT),A0
|
||
JRZ NSP1
|
||
;THIS TANK JUST BACKED UP FROM A HIT WITH ANOTHER TANK
|
||
|
||
MOVK 1,A1
|
||
MOVE A1,*A13(CFLAGS)
|
||
|
||
NSP1
|
||
; MOVB *A13(BUMP),A0
|
||
; JRNZ TRN
|
||
|
||
MORE SLEEP 20
|
||
;SPIN TANK SOME MORE
|
||
CALLA GET_DIS
|
||
CALLA GET_SK
|
||
|
||
SLEEP 1
|
||
JRUC LUP_TP
|
||
DOTNK:
|
||
;CHECK FOR WALL BORDERS!
|
||
MOVB *A13(DELYDT),A0
|
||
JRZ KS
|
||
DEC A0
|
||
MOVB A0,*A13(DELYDT)
|
||
JRUC DOANI
|
||
KS MOVI [>23+50,>21+45],A2
|
||
MOVI [>FC-20,>171-45],A3
|
||
CALLA SCRTSTG
|
||
JRZ DOANI ;BR=NOT INTO WALL
|
||
;A0=WALL HIT
|
||
; 3
|
||
;1 2
|
||
; 4
|
||
MOVB *A13(BUMP),A1
|
||
JRNZ DOANI
|
||
MOVB A0,*A13(BUMP)
|
||
;HAVE TANK GO BACKWARDS
|
||
CLR A0
|
||
MOVE A0,*A8(OXVEL),L
|
||
MOVE A0,*A8(OYVEL),L
|
||
MOVI 0,A0
|
||
MOVB A0,*A13(DELYDT)
|
||
SLEEP 20
|
||
MOVI HBSPEED,A1 ;TANK SPEED BACKWARDS
|
||
CALLA DO_DIFF2 ;SET UP HIS RAM SPEED AREA
|
||
MOVE *A13(DIR),A0
|
||
SLL 3,A0
|
||
ADDI REVTBL,A0
|
||
MOVB *A0,A0
|
||
CALLA INTO16
|
||
|
||
MOVI 15,A0 ;20
|
||
MOVE A0,*A13(DIS)
|
||
SLEEP 1
|
||
JRUC LUP_TP
|
||
|
||
REVTBL .BYTE 0,09,0,11,0,13,0,15,0,01,0,03,0,05,0,07,0
|
||
.EVEN
|
||
|
||
TRN:
|
||
DEC A0
|
||
SLL 5,A0
|
||
MOVI NEWANG,A1
|
||
ADD A0,A1
|
||
MOVE *A1,A1,L
|
||
MOVB *A1,A1
|
||
CMPI 14,A1
|
||
JRLO TRN1
|
||
|
||
.IF DEBUG
|
||
LOCKUP
|
||
EINT
|
||
.ENDIF
|
||
MOVK 1,A1
|
||
|
||
TRN1 MOVE A1,*A13(SK_DIR)
|
||
;TANK WILL SEEK TO A 45 DEGREE ANGLE
|
||
MOVK 1,A0 ;TANK WILL SPIN TO SK_DIR
|
||
MOVE A0,*A13(CFLAGS)
|
||
MOVI 5,A0
|
||
MOVB A0,*A13(DELYDT)
|
||
CLR A0
|
||
MOVE A0,*A8(OXVEL),L
|
||
MOVE A0,*A8(OYVEL),L
|
||
MOVB A0,*A13(BUMP)
|
||
SLEEP 20
|
||
JRUC LUP_TP
|
||
|
||
NEWANG .LONG HITL,HITR,HITT,HITB
|
||
TABL1 .BYTE 3,0,0,0,2,0,0,0,4,0,0,0,1
|
||
;
|
||
HITL .BYTE 05 ;,03,07,09,01,05,03,07
|
||
HITR .BYTE 13 ;,15,11,09,01,15,13,11
|
||
HITT .BYTE 09 ;,07,11,13,05,09,07,11
|
||
HITB .BYTE 01 ;,03,15,13,05,01,03,15
|
||
.EVEN
|
||
|
||
; 01
|
||
; 16 02
|
||
; 15 03
|
||
; 14 04
|
||
; 13 05
|
||
; 12 06
|
||
; 11 07
|
||
; 10 08
|
||
; 09
|
||
|
||
|
||
;DO FRANIM ANIMATION ON THIS MOVING TANK
|
||
DOANI
|
||
MOVE *A8(OXVEL),A0,L
|
||
MOVE *A8(OYVEL),A1,L
|
||
OR A0,A1
|
||
CMPI 0,A1
|
||
JRNE D1
|
||
SLEEP 2
|
||
MOVK 1,A0
|
||
MOVE A0,*A13(DIS)
|
||
JRUC LUP_TP
|
||
D1
|
||
CLR A1
|
||
JSRP FRANIM
|
||
JRNC CHECK_NEXT ;BR=NOT AT END OF SCRIPT YET
|
||
CALLA GET_RUN
|
||
|
||
CHECK_NEXT:
|
||
|
||
JRUC LUP_TP
|
||
|
||
GET_SK:
|
||
MOVE *A13(DIR),A1
|
||
GS CLR B0
|
||
MOVK 8,B1
|
||
CALLA RANGRAND
|
||
DEC A0
|
||
SLL 3,A0
|
||
ADDI BTAB,A0
|
||
MOVB *A0,A0
|
||
CMP A0,A1
|
||
JREQ GS
|
||
MOVE A0,*A13(SK_DIR)
|
||
;TANK WILL SEEK TO A 45 DEGREE ANGLE
|
||
|
||
MOVK 1,A0 ;TANK WILL SPIN TO SK_DIR
|
||
MOVE A0,*A13(CFLAGS)
|
||
RETS
|
||
;
|
||
BTAB .BYTE 1,5,9,13,1,5,9,13 ;3,7,11,15
|
||
.BYTE 1,5,9,13,1,5,9,13 ;3,7,11,15
|
||
.EVEN
|
||
|
||
SETUP_TNK:
|
||
;DIR IS BASED ON WHAT DOOR HE IS ENTERING THROUGH!
|
||
;IF THIS IS AN ONSCREEN TANK, THEN ANY DIR IS OKAY!
|
||
;
|
||
CALLA GET_SK
|
||
;
|
||
; UPDATE TNK COUNT
|
||
;
|
||
MOVE @TNK_CNT,A0
|
||
INC A0
|
||
MOVE A0,@TNK_CNT
|
||
|
||
MOVI TANK,A2
|
||
CALLA 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 TANK
|
||
DEC A1
|
||
MOVE A1,*A0(16),W
|
||
JRNZ BZ
|
||
|
||
;END OF THIS WAVES TANK CNT
|
||
MOVK 1,A1
|
||
MOVE A1,@TNK_DN
|
||
|
||
; CREATE 0,DEXIT
|
||
;
|
||
BZ
|
||
RETS
|
||
;
|
||
GET_DIS:
|
||
MOVI 25,B0
|
||
MOVI 50,B1
|
||
CALLA RANGRAND
|
||
MOVE A0,*A13(DIS) ;TIME BEFORE WE GET NEW VELOCITIES
|
||
RETS
|
||
|
||
WAY:
|
||
;SPIN LEFT OR RIGHT
|
||
;A1=SEEK DIR
|
||
;A0=DIR IMAGE IS FACING NOW
|
||
;812
|
||
;7 3
|
||
;654
|
||
; 01
|
||
; 16 02
|
||
; 15 03
|
||
; 14 04
|
||
; 13 05
|
||
; 12 06
|
||
; 11 07
|
||
; 10 08
|
||
; 09
|
||
SUB A0,A1
|
||
MOVE A1,A2
|
||
ABS A1
|
||
CMPI 9,A1 ;5
|
||
JRLT N0
|
||
NEG A2
|
||
N0: BTST 31,A2
|
||
JRZ IC
|
||
INHERE: DEC A0
|
||
JRP TDEC
|
||
MOVK 16,A0 ;8
|
||
TDEC CLRC ;MEANS DEC
|
||
RETS
|
||
IC: INC A0 ;ROTATE TOWARD PLAYER
|
||
CMPI 17,A0 ;9
|
||
JRNE T1
|
||
MOVK 1,A0
|
||
T1: SETC ;MEANS INC
|
||
RETS
|
||
|
||
GET_RUN:
|
||
;GET FRANIM BASE ADDRESS FOR THIS TANKS DIRECTION
|
||
;
|
||
MOVE *A13(DIR),A4
|
||
DEC A4
|
||
SLL 5,A4 ;*32 FOR LONG WORD LOOKUP TABLE
|
||
ADDI WALK_LIST,A4 ;CALCULATE OFFSET IN TABLE
|
||
MOVE *A4,A9,L ;MOVE TABLE VALUE INTO A9
|
||
;NEW ANIMATION SCRIPT
|
||
MOVE *A13(CFLAGS),A0
|
||
ANDI 0FFFEH,A0 ;
|
||
MOVE A0,*A13(CFLAGS) ;ZERO STANDING/SPIN FLAG
|
||
RETS
|
||
|
||
; 01
|
||
; 16 02
|
||
; 15 03
|
||
; 14 04
|
||
; 13 05
|
||
; 12 06
|
||
; 11 07
|
||
; 10 08
|
||
; 09
|
||
SPINFRMS:
|
||
.LONG TNK12A,TNK115A,TNK11A,TNK10A,TNK9A,TNK85A,TNK8A,TNK7A
|
||
.LONG TNK6A,TNK7A,TNK8A,TNK85A,TNK9A,TNK10A,TNK11A,TNK115A
|
||
TSPINFRMS:
|
||
.LONG MTK12,MTK115,MTK11,MTK10,MTK9,MTK85,MTK8,MTK7
|
||
.LONG MTK6,MTK7,MTK8,MTK85,MTK9,MTK10,MTK11,MTK115
|
||
TK_SPINFLGS:
|
||
.WORD DMAWNZ,DMAWNZ+M_FLIPH,DMAWNZ+M_FLIPH,DMAWNZ+M_FLIPH
|
||
.WORD DMAWNZ+M_FLIPH,DMAWNZ+M_FLIPH,DMAWNZ+M_FLIPH
|
||
.WORD DMAWNZ+M_FLIPH
|
||
.WORD DMAWNZ,DMAWNZ,DMAWNZ
|
||
.WORD DMAWNZ,DMAWNZ,DMAWNZ
|
||
.WORD DMAWNZ,DMAWNZ
|
||
|
||
GET_STAND:
|
||
;ANI ONTO SCREEN THIS TANKS STANDING POSITION
|
||
MOVE *A13(DIR),A0 ;CURRENT DIR TANK IS FACING
|
||
DEC A0
|
||
ANDI 0FH,A0
|
||
MOVE A0,A2
|
||
SLL 5,A0
|
||
ADDI SPINFRMS,A0
|
||
MOVE *A0,A1,L ;NEW OIMG
|
||
SLL 4,A2
|
||
ADDI TK_SPINFLGS,A2
|
||
MOVE *A2,A4,W ;NEW OFLAGS
|
||
CALLA ANI
|
||
RETS
|
||
GET_STANDT:
|
||
;ANI ONTO SCREEN THIS TANKS STANDING POSITION
|
||
MOVE *A13(TDIR),A0 ;CURRENT DIR TANK IS FACING
|
||
GET_STANDT2:
|
||
DEC A0
|
||
ANDI 0FH,A0
|
||
MOVE A0,A2
|
||
SLL 5,A0
|
||
ADDI TSPINFRMS,A0
|
||
MOVE *A0,A1,L ;NEW OIMG
|
||
SLL 4,A2
|
||
ADDI TK_SPINFLGS,A2
|
||
MOVE *A2,A4,W ;NEW OFLAGS
|
||
CALLA ANI
|
||
RETS
|
||
|
||
SX: .LONG -020000H,01880000H,0CA0000H,0CA0000H
|
||
SY: .LONG 0540000H,0540000H,-280000H,0E80000H ;-22
|
||
SD: .WORD 5,13,9,1
|
||
|
||
INIT_TNK:
|
||
;INITIAL TANK POSITION,IMAGE SHAPE,AGE ETC....
|
||
;DO STFOBF AND GET A0 PNTR
|
||
MOVI 1,B0 ;DOORS 2-4 ONLY!
|
||
MOVI 4,B1
|
||
CALLA RANGRAND ;TIE THIS IN WITH DIFFICULTY!
|
||
MOVE A0,A1
|
||
SLL 5,A1
|
||
ADDI DRINF,A1
|
||
MOVE *A1,A1,L
|
||
MOVB *A1,A1
|
||
JRZ G
|
||
CMPI 06,A1
|
||
JRGE G
|
||
;DOOR THIS GUY WILL BE SENT TO IS CLOSING RIGHT NOW. SO SEND HIM TO DOOR 4
|
||
SETC
|
||
RETS
|
||
|
||
MOVI 4,A0 ;DOOR 4
|
||
G MOVE A0,@TMP
|
||
;DOOR IS IN TMP
|
||
;NOW CHECK TO SEE IF THERE IS ROOM IN FRONT OF THIS DOOR TO BRING OUT A TANK
|
||
;IF NOT, DIE. OTHERWISE BRING HIM OUT.
|
||
DEC A0
|
||
MMTM SP,A0
|
||
MOVI UPLFT,A1 ;TOP/LEFT RANGE
|
||
SLL 5,A0
|
||
ADD A0,A1
|
||
MOVE *A1,A1,L ;PACKED X/Y OF UPPER LEFT
|
||
;
|
||
MOVI DNRGT,A2
|
||
ADD A0,A2
|
||
MOVE *A2,A2,L ;PACKED X/Y OF LOWER RIGHT
|
||
MOVI CLSNEUT|TYPTANK,A3
|
||
MOVB @MAXTNK,A0
|
||
CMPI 1,A0
|
||
JRZ ABC
|
||
;MULTIPLE TANKS ON SCREEN!
|
||
MOVI CLSENMY|TYPTANK,A3
|
||
MOVK 1,A0
|
||
MOVB A0,@ECON
|
||
ABC
|
||
CALLA ANYIN
|
||
JRNC NO
|
||
;THERE WERE TANKS INSIDE THE SPECIFIED BOX.
|
||
MMFM SP,A2
|
||
; SETC
|
||
RETS
|
||
NO
|
||
MMFM SP,A2
|
||
MOVI SD,A1
|
||
SLL 4,A2
|
||
ADD A2,A1
|
||
MOVE *A1,A1
|
||
MOVE A1,*A13(DIR)
|
||
MOVI SX,A1
|
||
SLL 1,A2
|
||
ADD A2,A1
|
||
MOVE *A1,A0,L
|
||
MOVI SY,A1
|
||
ADD A2,A1
|
||
MOVE *A1,A1,L
|
||
MMTM SP,A0,A1
|
||
MOVE @TMP,A0
|
||
MOVI >1F,A1
|
||
CALLA SET_GATE_2
|
||
MMFM SP,A0,A1
|
||
MOVI 20,A3
|
||
MOVE A3,*A13(DIS) ;CHANGE BASED ON TANKS SPEED?
|
||
CALLA IH1
|
||
CALLA BEGINOBJ
|
||
|
||
; MOVE @WAVE,A0
|
||
; CMPI 10,A0
|
||
; JRC NOCHNG0
|
||
;HIGH WAVE, CHANGE PAL
|
||
;CHANGE TO OTHER PAL
|
||
; MOVI GLDP,A0
|
||
; CALLA GETFPAL ;GET A COLOR MAP ASSIGNMENT
|
||
; MOVE A0,*A8(OPAL),W ;STORE THE NEW PALETTE
|
||
;NOCHNG0
|
||
CLRC
|
||
RETS
|
||
ANYIN:
|
||
;A1=UPPER LEFT OF BOX PACKED Y/X
|
||
;A2=LOWER RIGHT OF BOX PACKED Y/X
|
||
;A3=OID OF OBJECT TO CHECK
|
||
;RETURNS C SET IF SOMETHING WAS FOUND IN THIS BOX
|
||
;C CLEAR IF NOT
|
||
|
||
MOVI OBJLST,A0
|
||
LP MOVE *A0,A0,L
|
||
JREQ CLC
|
||
MOVE *A0(OID),A5,W
|
||
ANDI 0FFFFH,A5
|
||
CMP A5,A3
|
||
JRNE LP
|
||
;NOW SEE IF THIS OID IS IN CHOSEN AREA
|
||
MOVE *A0(OXVAL),A5,L
|
||
MOVE *A0(OYVAL),A6,L
|
||
MOVE @WAVEYX,A7,L
|
||
;A2=PACKED OFFSETS
|
||
MOVX A7,A4
|
||
SLL 16,A4
|
||
SUB A4,A5 ;ADJUSTED A0 XVAL!
|
||
ANDI 0FFFF0000H,A7
|
||
SUB A7,A6 ;ADJUSTED A1 YVAL!
|
||
;A5,A6 ARE ADJUSTED X/Y VALS FOR THIS IMAGE
|
||
SRL 16,A5
|
||
MOVX A5,A6
|
||
;A6=PACKED Y/X OF IMAGE
|
||
CMPXY A6,A1
|
||
JRXGE LP
|
||
JRYGE LP
|
||
CMPXY A6,A2
|
||
JRXLE LP
|
||
JRYLE LP
|
||
;HIT
|
||
SET SETC
|
||
RETS
|
||
CLC CLRC
|
||
RETS
|
||
|
||
UPLFT .LONG [50,0],[50,250],[0,95],[150,95]
|
||
DNRGT .LONG [190,120],[190,440],[80,310],[250,310]
|
||
|
||
IH1: ;ENTER HERE IF ON SCRN TANK
|
||
MOVI TNK10A,A2 ;DOES NOT MATTER
|
||
MOVI 130,A3 ;119
|
||
MOVI CLSNEUT|TYPTANK,A5
|
||
MOVB @MAXTNK,A4
|
||
CMPI 1,A4
|
||
JRZ IH2
|
||
MOVI CLSENMY|TYPTANK,A5
|
||
IH2 CLR A6
|
||
CLR A7
|
||
MOVI DMAWNZ,A4 ;NON-ZERO VALUE
|
||
RETS
|
||
|
||
TURN_TANK:
|
||
;CK REACTING FLAG
|
||
;STOP TANK
|
||
;START SPIN
|
||
MMTM SP,A1,A7
|
||
MOVE A0,A7
|
||
MOVE *A8(OPLINK),A0,L
|
||
MOVE *A0(CFLAGS),A1
|
||
BTST 0,A1
|
||
JRNZ RT
|
||
;CK TO SEE IF DIR OF THIS TANK IS GOING AWAY FROM TANK IT COLLIDED WITH.
|
||
MOVE *A0(DIR),A1
|
||
CMPI 1,A1
|
||
JRNE Z1
|
||
;UP
|
||
MOVE *A7(OYPOS),A7
|
||
MOVE *A8(OYPOS),A9
|
||
CMP A9,A7
|
||
JRNC RT
|
||
JRUC Z4
|
||
Z1 CMPI 5,A1
|
||
JRNE Z2
|
||
MOVE *A7(OXPOS),A7
|
||
MOVE *A8(OXPOS),A9
|
||
; ADDI 20,A9
|
||
CMP A9,A7
|
||
JRC RT
|
||
JRUC Z4
|
||
Z2 CMPI 9,A1
|
||
JRNE Z3
|
||
MOVE *A7(OYPOS),A7
|
||
MOVE *A8(OYPOS),A9
|
||
CMP A9,A7
|
||
JRC RT
|
||
JRUC Z4
|
||
Z3 CMPI 13,A1
|
||
JRNE Z4
|
||
MOVE *A7(OXPOS),A7
|
||
MOVE *A8(OXPOS),A9
|
||
; ADDI 20,A9
|
||
CMP A9,A7
|
||
JRNC RT
|
||
Z4
|
||
;THIS TANK IS NOT ALREADY REACTING TO A COLLISION
|
||
MOVE A0,A9
|
||
CREATE 0,MODS
|
||
MOVE A9,A0
|
||
MOVK 2,A1
|
||
MOVB A1,*A0(REACT)
|
||
CLR A1
|
||
MOVE A1,*A8(OXVEL),L
|
||
MOVE A1,*A8(OYVEL),L
|
||
MOVE *A0(DIR),A1
|
||
DEC A1
|
||
SLL 5,A1
|
||
ADDI NEWANGS,A1
|
||
MOVE *A1,A1,L
|
||
MOVB *A1,A1
|
||
MOVE A1,*A0(SK_DIR)
|
||
;TANK WILL SEEK TO A 45 DEGREE ANGLE
|
||
CLR A0
|
||
MOVB A0,*A13(DELYDT)
|
||
RT MMFM SP,A1,A7
|
||
RETS
|
||
MODS SLEEP 2
|
||
MOVE *A9(CFLAGS),A0
|
||
BTST 0,A0
|
||
JRNZ MODS
|
||
CLR A0
|
||
MOVB A0,*A9(REACT)
|
||
DIE
|
||
|
||
; 01
|
||
; 16 02
|
||
; 15 03
|
||
; 14 04
|
||
; 13 05
|
||
; 12 06
|
||
; 11 07
|
||
; 10 08
|
||
; 09
|
||
|
||
NEWANGS .LONG THIT12,0,THIT2,0,THIT3,0,THIT5,0
|
||
.LONG THIT6,0,THIT8,0,THIT9,0,THIT10,0
|
||
THIT9 .BYTE 05 ;,03,07,05 ;05,03,07
|
||
THIT3 .BYTE 13 ;,15,11,13 ;15,13,11
|
||
THIT12 .BYTE 09 ;,07,11,09 ;09,07,11
|
||
THIT6 .BYTE 01 ;,03,15,01 ;01,03,15
|
||
THIT2 .BYTE 13 ;,11,09,13
|
||
THIT5 .BYTE 13 ;,01,15,13
|
||
THIT8 .BYTE 01 ;,03,05,01
|
||
THIT10 .BYTE 09 ;,05,07,09
|
||
.EVEN
|
||
|
||
KILL_TNK:
|
||
MMTM SP,A1
|
||
MOVE A0,A10
|
||
MOVE *A0(OID),A9,W ;KILLERS OID
|
||
;WILL BE BOGUS IF SOMETHING OTHER THAN A BULLET STRUCK TANK!
|
||
MOVE *A0(OPLINK),A1,L
|
||
|
||
MOVE *A8(OPLINK),A0,L
|
||
MOVB *A0(ADRIVER),A1
|
||
JRNE OKT
|
||
ANDI F_SUBT,A9
|
||
DEC A9
|
||
SLL 3,A9
|
||
ADDI PUNISHT,A9
|
||
MOVB *A9,A9
|
||
MOVB *A0(ABSORBT),A1
|
||
ADD A9,A1
|
||
MOVB A1,*A0(ABSORBT)
|
||
CMPI HITTNK,A1
|
||
;IF LESS THAN, START COLOR CYCLE PROCESS HERE
|
||
JRLT OKTF
|
||
;ABSORBED ENOUGH HITS TO DESTROY IT
|
||
MOVI EXP3,A0
|
||
CALLA ONESND
|
||
;COME IN HERE IF SMART BOMB
|
||
;A8=TANK IMAGE PTR
|
||
;A10=KILLER PNTR
|
||
CREATE 0,TNK_EXP
|
||
;TANK_EXP WHEN IT WAKES UP
|
||
MOVE *A8(OPLINK),A0,L
|
||
CALLA KILL ;KILLS PROCESS IN A0
|
||
MOVE A8,A0
|
||
CALLA DELOBJ
|
||
CLR A0
|
||
MOVB A0,@ENON
|
||
OKT MMFM SP,A1
|
||
RETS
|
||
OKTF PUSH A9
|
||
MOVI 018180000H,A9
|
||
CREATE 0,FLASHME
|
||
PULL A9
|
||
MMFM SP,A1
|
||
RETS
|
||
KILL_TK
|
||
;COME IN HERE IF SMART BOMB
|
||
;A8=TANK IMAGE PTR
|
||
CREATE 0,KILL_TK2
|
||
;TANK_EXP WHEN IT WAKES UP
|
||
MOVE *A8(OPLINK),A0,L
|
||
CALLA KILL ;KILLS PROCESS IN A0
|
||
MOVI CLSNEUT|TYPNEUT,A0
|
||
MOVE A0,*A8(OID)
|
||
CLR A0
|
||
MOVE A0,*A8(OXVEL),L
|
||
MOVE A0,*A8(OYVEL),L
|
||
MOVE *A8(OYPOS),A0
|
||
ADDI 034H,A0
|
||
MOVE A0,*A8(OYPOS)
|
||
RETS
|
||
KILL_TK2
|
||
MOVI BOOM3,A9
|
||
MOVK 1,A1
|
||
JSRP FRANIM
|
||
MOVE A8,A0
|
||
CALLA DELOBJ
|
||
CLR A0
|
||
MOVB A0,@ENON
|
||
DIE
|
||
|
||
FLASHME:
|
||
;A9=COLOR TO FLASH WITH
|
||
;A8=IMAGE PNTR TO FLASH
|
||
;FLASH MORE?
|
||
MOVE *A8(OPAL),A10,L
|
||
OR A10,A9
|
||
CMP A9,A10 ;>18180000,A9
|
||
JREQ DI
|
||
; MOVE A9,A0 ;>18180000,A0 ;COLOR NUMBER
|
||
MOVE A9,*A8(OPAL),L
|
||
MOVE *A8(OFLAGS),A0,W
|
||
ORI 8,A0
|
||
MOVE A0,*A8(OFLAGS),W
|
||
SLEEP 2
|
||
ANDI 0FFFFH,A10
|
||
MOVE A10,*A8(OPAL),L
|
||
MOVE *A8(OFLAGS),A0,W
|
||
ANDI 0FFF7H,A0
|
||
ORI 2,A0
|
||
MOVE A0,*A8(OFLAGS),W
|
||
DI DIE
|
||
|
||
PUNISHT: .BYTE 3,3,5,20,20
|
||
.EVEN
|
||
|
||
KILL_TNKR
|
||
;IF RING HIT TANK, COME HERE
|
||
MMTM SP,A1,A7
|
||
MOVE *A0(OPLINK),A0,L
|
||
MOVB *A0(MYPLYR),A10 ;A10=1 OR 2
|
||
MOVI EXP3,A0
|
||
CALLA ONESND
|
||
CREATE 0,TNK_EXP2
|
||
;TANK_EXP WHEN IT WAKES UP
|
||
;IF THIS TANK HAS ADRIVER, THEN KILL IT ALSO!
|
||
MOVE *A8(OPLINK),A0,L
|
||
MOVB *A0(ADRIVER),A1
|
||
JRZ OOF
|
||
;YES I DO!
|
||
;KILL TORSO ALSO!
|
||
MOVE *A0(MYTSO),A1,L
|
||
MOVE *A1(OPLINK),A0,L
|
||
CALLA KILL
|
||
MOVE A1,A0
|
||
CALLA DELOBJ
|
||
MOVE *A8(OPLINK),A0,L
|
||
OOF CALLA KILL ;KILLS PROCESS IN A0
|
||
MOVE A8,A0
|
||
CALLA DELOBJ
|
||
CLR A0
|
||
MOVB A0,@ENON
|
||
MMFM SP,A1,A7
|
||
RETS
|
||
|
||
TNK_EXP2:
|
||
MOVE A10,A0
|
||
JRUC TE2
|
||
TNK_EXP:
|
||
;A10=KILLER IMAGE PNTR
|
||
MOVE *A10(OPLINK),A0,L
|
||
MOVB *A0(MYPLYR),A0
|
||
TE2
|
||
MOVI P1DATA,A2 ;PLAYER 1 SCORE SELECT
|
||
CMPI 1,A0
|
||
JREQ CGA
|
||
CMPI 2,A0
|
||
JRNZ CGAZ
|
||
MOVI P2DATA,A2
|
||
CGA
|
||
MOVI TNKPT,A1 ;AMOUNT OF SCORE
|
||
CALLA SCRADD2 ;DO IT!
|
||
|
||
CGAZ MOVE @TNK_CNT,A3 ;DELETE A BNCR FROM CNT
|
||
DEC A3
|
||
MOVE A3,@TNK_CNT
|
||
|
||
CLR A6
|
||
CLR A7
|
||
|
||
CALLA GETANIXY
|
||
ADDI 0350000H,A2 ;A1=Y OFFSET
|
||
MOVE A2,A1
|
||
MOVE A3,A0
|
||
MOVI 199,A3 ;259
|
||
MOVI DMAWNZ|M_NOCOLL|M_FLIPV,A4 ;NON-ZERO VALUE
|
||
MOVI CLSNEUT|TYPNEUT,A5
|
||
MOVI EXPb1,A2
|
||
|
||
;PUT ON ANOTHER LIST OTHER THAN OBJLST!
|
||
;THE LIST WITH THE HIGHEST PRIORITY
|
||
CALLA BEGINOBJ2
|
||
MOVI BOOM2,A9
|
||
FRANIM_DIE
|
||
MOVK 1,A1
|
||
JSRP FRANIM
|
||
MOVE A8,A0
|
||
CALLA DELOBJ
|
||
DIE
|
||
|
||
TTORSO:
|
||
;A10=A13 OF TANK THAT CREATED THIS TORSO
|
||
;TURN ON TORSO WITH SAME X/Y AS CURRENT A8
|
||
MOVB @TOID_ON,A0
|
||
JRZ TR1
|
||
;A9=0 IF ON LEFT OF MUTOID MAN,1=RIGHT
|
||
MOVB A9,*A13(TOIDLR)
|
||
MOVE A9,*A13(TDIR)
|
||
TR1 CLR A0
|
||
MOVB A0,*A13(ABSORB)
|
||
MOVB A0,*A13(MODE)
|
||
MOVK 1,A0
|
||
MOVB A0,*A13(SPDLY)
|
||
MOVB A0,*A13(TCNTR)
|
||
MOVE A10,*A13(KPTANK),L ;TANK PROC
|
||
MOVE A8,*A13(KPTANKO),L ;TANK OBJECT PNTR
|
||
;OR MUTOID LEFT SIDE TANK OBJECT
|
||
CALLA GETANIXY
|
||
CLR A6
|
||
CLR A7
|
||
MOVE A2,A1
|
||
MOVE A3,A0
|
||
MOVI 143,A3 ;133
|
||
MOVI DMAWNZ,A4
|
||
MOVI CLSENMY|TYPTORSO,A5
|
||
MOVI MTK10,A2
|
||
CALLA BEGINOBJ2
|
||
|
||
MOVE @TOID_ON,A0
|
||
JRZ NOCHNGA
|
||
|
||
; MOVE @WAVE,A0
|
||
; CMPI 10,A0
|
||
; JRC NOCHNGA
|
||
;HIGH WAVE, CHANGE PAL
|
||
;CHANGE TO OTHER PAL
|
||
MOVI PURPTK,A0
|
||
CALLA GETFPAL ;GET A COLOR MAP ASSIGNMENT
|
||
MOVE A0,*A8(OPAL),W ;STORE THE NEW PALETTE
|
||
|
||
NOCHNGA
|
||
MOVE *A8(OPAL),A0,L
|
||
ANDI 0FFFFH,A0
|
||
MOVE A0,*A8(OPAL),L
|
||
MOVB @TOID_ON,A0
|
||
JRNE FEFE
|
||
MOVE *A13(KPTANK),A0,L
|
||
MOVE A8,*A0(MYTSO),L
|
||
FEFE
|
||
MOVI 35,B0
|
||
MOVI 80,B1
|
||
CALLA RANGRAND
|
||
MOVB A0,*A13(TCNTR)
|
||
TLP_TOP:
|
||
;MODE 0=ROTATE WITH TANK. TORSO WILL ALWAYS POINT AT DIR TANK IS FACING.
|
||
;MODE 1=JUST SITTING ON TOP OF TANK, NOT CARING WHAT DIR TORSO IS FACING.
|
||
;MODE 2=ACTIVELY SEEKING A DIR TO SHOOT, THEN FIRE AT END OF SEEK.
|
||
;MODE 3=ACTIVELY SEEKING TO DIR TANK IS FACING.
|
||
;MODE 4=AIM TOWARD PLAYER
|
||
;MODE 5=CONTINUE TO FIRE IN CURRENT DIRECTION
|
||
;MODE 6=OSCILLATE AND FIRE
|
||
CALLA SIT ;ALIGN TORSO EVERY FRAME
|
||
|
||
MOVE @HALT,A0
|
||
JRZ DOG1
|
||
;NEED TO START THESE GUYS BACK UP AFTER YOU DIE
|
||
;CHECK NDSP1 STOP OBJ FLAGS! (NOMOV?)
|
||
SLEEP 2
|
||
JRUC TLP_TOP
|
||
DOG1
|
||
MOVE @EHALT,A0
|
||
JRZ MVZ ;BR=HALT ALL TANKS!!
|
||
;PLAYER IS WALKING INTO ARENA
|
||
SLEEP 2
|
||
JRUC TLP_TOP
|
||
|
||
MVZ
|
||
MOVB @TOID_ON,A0
|
||
JRNZ NOSPNT
|
||
MOVE *A13(KPTANK),A0,L
|
||
MOVE *A0(CFLAGS),A1,W
|
||
; BTST 0,A1
|
||
JRZ NOSPNT
|
||
MOVB *A13(MODE),A1
|
||
JRZ NOSPNT
|
||
CMPI 4,A1 ;AIM AT PLAYER
|
||
JREQ NOSPNT
|
||
CMPI 5,A1 ;SHOOTING AT PLAYER
|
||
JREQ NOSPNT
|
||
CMPI 6,A1 ;SHOOTING AT PLAYER
|
||
JREQ NOSPNT
|
||
MOVB *A13(SPDLY),A1
|
||
CMPI 7,A1
|
||
JRLT AF
|
||
MOVI 5,A1
|
||
AF
|
||
DEC A1
|
||
MOVB A1,*A13(SPDLY)
|
||
JRNN TAG
|
||
;THE TANK UNDER THIS TORSO IS SPINNING
|
||
MOVK 4,A0 ;SHOULD MATCH TANK ROTATION SLEEP TIME
|
||
MOVB A0,*A13(SPDLY)
|
||
|
||
MOVB *A13(WAY01),A1
|
||
;WAS *A0!
|
||
|
||
JRNZ INCIT
|
||
|
||
;TANK IS DEC TO LEFT!
|
||
DECIT MOVE *A13(TDIR),A0,W
|
||
CALLA INHERE
|
||
MOVE A0,*A13(TDIR),W
|
||
JRUC OUT
|
||
INCIT
|
||
;TANK IS ROTATING TO RIGHT
|
||
MOVE *A13(TDIR),A0,W
|
||
CALLA IC
|
||
MOVE A0,*A13(TDIR),W
|
||
OUT CALLA GET_STANDT ;DOES ANI OF CORRECT VIEW
|
||
JRUC TAG
|
||
|
||
NOSPNT MOVB *A13(MODE),A0
|
||
JRNZ NZ
|
||
CALLA MODECHNG
|
||
CALLA STIK
|
||
JRUC TAG
|
||
NZ CMPI 1,A0
|
||
JRNZ SK
|
||
;JUST SITTING HERE
|
||
CALLA MODECHNG
|
||
JRUC TAG
|
||
|
||
SK CMPI 2,A0
|
||
JRNE SK2
|
||
;SEEK TO SKDIR, SHOOT(UNLESS MODE=3), THEN CHANGE MODE
|
||
SKIN1: MOVB *A13(SPDLY),A0
|
||
ANDI 0FFH,A0
|
||
CMPI 7,A0
|
||
JRLT SC
|
||
MOVK 1,A0
|
||
SC
|
||
DEC A0
|
||
MOVB A0,*A13(SPDLY)
|
||
JRNZ TAG
|
||
MOVE *A13(TSK_DIR),A1
|
||
MOVE *A13(TDIR),A0,W
|
||
CALLA WAY
|
||
MOVE A0,*A13(TDIR),W
|
||
CALLA GET_STANDT ;DOES ANI OF CORRECT VIEW
|
||
MOVE A10,A10
|
||
JREQ NSPRAY
|
||
MOVE A13,A9
|
||
CREATE 0,CBALL ;CANNON BALL
|
||
NSPRAY MOVE *A13(TSK_DIR),A1
|
||
MOVE *A13(TDIR),A0,W
|
||
CMP A0,A1
|
||
JREQ GDNEWS
|
||
MOVI 4,A0
|
||
MOVB A0,*A13(SPDLY)
|
||
JRUC TAG
|
||
GDNEWS:
|
||
;HAVE SEEKED TO CORRECT SKDIR
|
||
;SHOOT
|
||
CLR A10
|
||
MOVB *A13(MODE),A0
|
||
CMPI 4,A0
|
||
JRNE GG
|
||
MOVI 500,A0 ;800
|
||
CALLA RANDPER
|
||
JRC AP
|
||
;SWEEPING OSCILLATE BULLETS
|
||
DOSWP MOVK 6,A0
|
||
MOVB A0,*A13(MODE)
|
||
MOVK 6,B0
|
||
MOVK 20,B1
|
||
CALLA RANGRAND
|
||
MOVE @TANKDIFF,A1
|
||
ADD A1,A0
|
||
MOVB A0,*A13(FIRED)
|
||
MOVK 1,A0
|
||
MOVB A0,*A13(SPDLY)
|
||
CLR A0
|
||
MOVB A0,*A13(TPNTR)
|
||
JRUC TAG
|
||
|
||
AP
|
||
;NORMAL FIRE AT PLAYER
|
||
MOVK 5,A0
|
||
MOVB A0,*A13(MODE)
|
||
MOVK 4,B0 ;2
|
||
MOVK 7,B1
|
||
CALLA RANGRAND
|
||
MOVE @TANKDIFF,A1
|
||
ADD A1,A0
|
||
MOVB A0,*A13(FIRED)
|
||
MOVK 1,A0
|
||
MOVB A0,*A13(SPDLY)
|
||
JRUC TAG
|
||
|
||
GG:
|
||
MOVI 200,A0 ;800
|
||
CALLA RANDPER
|
||
JRC GG2
|
||
;80% BE SMART
|
||
;BE SMART
|
||
MOVK 4,A0
|
||
MOVB A0,*A13(MODE)
|
||
JRUC TAG
|
||
GG2
|
||
MOVK 1,A0
|
||
MOVB A0,*A13(MODE)
|
||
JRUC TAG
|
||
SK2 CMPI 3,A0
|
||
JRNE AIM
|
||
;SEEK TO DIR OF TANK UNDER THIS TORSO
|
||
|
||
|
||
MOVB @TOID_ON,A0
|
||
JRNZ GG2
|
||
|
||
MOVB *A13(SPDLY),A0
|
||
ANDI 0FFH,A0
|
||
DEC A0
|
||
MOVB A0,*A13(SPDLY)
|
||
JRNN TAG
|
||
MOVE *A13(KPTANK),A1,L
|
||
MOVE *A1(DIR),A1,W
|
||
MOVE *A13(TDIR),A0,W
|
||
CALLA WAY
|
||
MOVE A0,*A13(TDIR),W
|
||
CALLA GET_STANDT ;DOES ANI OF CORRECT VIEW
|
||
; MOVE A13,A9
|
||
; CREATE 0,CBALL ;CANNON BALL
|
||
MOVE *A13(KPTANK),A1,L
|
||
MOVE *A1(DIR),A1,W
|
||
MOVE *A13(TDIR),A0,W
|
||
CMP A0,A1
|
||
JREQ GDNEWS2
|
||
MOVI 4,A0
|
||
MOVB A0,*A13(SPDLY)
|
||
JRUC TAG
|
||
GDNEWS2:
|
||
;NOW LINED UP WITH TANK DIR
|
||
;SET MODE TO STICK
|
||
CLR A0
|
||
MOVB A0,*A13(MODE)
|
||
MOVI 04FH,A0 ;AF
|
||
MOVB A0,*A13(TCNTR)
|
||
|
||
TAG SLEEP 1
|
||
JRUC TLP_TOP
|
||
AIM
|
||
CMPI 4,A0
|
||
JRNZ FIRE
|
||
;MODE=4
|
||
;
|
||
MOVB @SCNTR,A3
|
||
INC A3
|
||
MOVB A3,@SCNTR
|
||
ANDI 01,A3
|
||
SLL 5,A3
|
||
MOVI PLYROBJS,A2
|
||
ADD A3,A2
|
||
MOVE *A2,A0,L ;GET FIRST ENTRY
|
||
JRNZ PX
|
||
XORI 32,A3
|
||
ADDI PLYROBJS,A3
|
||
MOVE *A3,A0,L
|
||
|
||
PX CALLA XYSKOBJ
|
||
MOVE A5,A1
|
||
MOVE A6,A2
|
||
CALLA GETHDR
|
||
SLL 3,A0
|
||
ADDI CVRT,A0
|
||
MOVB *A0,A0
|
||
;DIR TO FACE IN A0
|
||
|
||
;A0=DIR TO SEEK TO FACE PLAYER
|
||
MOVE *A13(TDIR),A1
|
||
;
|
||
CMPI 17,A1
|
||
JRC OKAYZ
|
||
;FIX BUG
|
||
CLR A1
|
||
MOVE A1,*A13(TDIR)
|
||
OKAYZ
|
||
|
||
CMP A0,A1
|
||
JREQ AIM2
|
||
;NOT =
|
||
MOVE A0,*A13(TSK_DIR),W
|
||
JRUC SKIN1
|
||
AIM2
|
||
MOVE A13,A9
|
||
CREATE 0,CBALL
|
||
; MOVE *A13(TDIR),A9,W
|
||
; CREATE 0,RECOIL
|
||
|
||
MOVI 400,A0
|
||
CALLA RANDPER
|
||
JRC DOSWP ;DO SWEEP BULLETS
|
||
MOVI 400,A0
|
||
CALLA RANDPER
|
||
MOVK 4,A0
|
||
JRC AIM3 ;DO SWEEP BULLETS
|
||
MOVK 3,A0
|
||
AIM3 MOVB A0,*A13(MODE)
|
||
JRUC TAG
|
||
FIRE
|
||
CMPI 5,A0
|
||
JRNZ OSC
|
||
;CONTINUALLY FIRE IN CURRENT DIRECTION
|
||
MOVB *A13(SPDLY),A0
|
||
DEC A0
|
||
MOVB A0,*A13(SPDLY)
|
||
JRNN TAG
|
||
MOVK 5,A0
|
||
MOVB A0,*A13(SPDLY)
|
||
MOVB *A13(FIRED),A0
|
||
DEC A0
|
||
MOVB A0,*A13(FIRED)
|
||
JREQ RESET
|
||
;FIRE A BULLET
|
||
MOVE A13,A9
|
||
CREATE 0,CBALL
|
||
; MOVE *A13(TDIR),A9,W
|
||
; CREATE 0,RECOIL
|
||
JRUC TAG
|
||
RESET
|
||
MOVI 900,A0
|
||
CALLA RANDPER
|
||
JRC SLW
|
||
;SEEK PLAYER AGAIN
|
||
MOVK 4,A0
|
||
MOVB A0,*A13(MODE)
|
||
JRUC TAG
|
||
|
||
SLW MOVK 1,A0
|
||
MOVB A0,*A13(MODE)
|
||
JRUC TAG
|
||
OSC:
|
||
CMPI 6,A0
|
||
JRNE SWING
|
||
;OSCILLATE AND FIRE
|
||
MOVB *A13(SPDLY),A0
|
||
DEC A0
|
||
MOVB A0,*A13(SPDLY)
|
||
JRNN TAG
|
||
MOVE @TANKDIFF2,A0
|
||
; MOVK 8,A0 ;TIE IN TO LEVEL OF DIFFICULTY!
|
||
MOVB A0,*A13(SPDLY)
|
||
MOVB *A13(FIRED),A0
|
||
DEC A0
|
||
MOVB A0,*A13(FIRED)
|
||
JREQ RESET
|
||
;FIRE A BULLET
|
||
MOVE A13,A9
|
||
CREATE 0,CBALL
|
||
; MOVE *A13(TDIR),A9,W
|
||
; CREATE 0,RECOIL
|
||
;NOW ANGLE OFF
|
||
MOVB *A13(TPNTR),A0
|
||
INC A0
|
||
MOVB A0,*A13(TPNTR)
|
||
CMPI 9,A0
|
||
JRLT AB
|
||
MOVK 1,A0
|
||
MOVB A0,*A13(TPNTR)
|
||
AB SLL 5,A0
|
||
ADDI WAYTBL,A0
|
||
MOVE *A0,A0,L
|
||
JUMP A0
|
||
WAYTBL .LONG 0,INCIT,INCIT,DECIT,DECIT,DECIT,DECIT,INCIT,INCIT
|
||
|
||
SWING:
|
||
;SWING AROUND AND AROUND SPRAYING BULLETS
|
||
JRUC TAG
|
||
MODECHNG:
|
||
MOVB *A13(TCNTR),A0
|
||
ANDI 0FFH,A0
|
||
CMPI 200,A0
|
||
JRLT AV
|
||
MOVI 50,A0
|
||
AV
|
||
DEC A0
|
||
MOVB A0,*A13(TCNTR)
|
||
JRNN EX
|
||
;TCNTR UP, MAYBE RESET MODE
|
||
MOVI 35,B0
|
||
MOVI 80,B1
|
||
CALLA RANGRAND
|
||
MOVB A0,*A13(TCNTR)
|
||
MOVI 700,A0
|
||
CALLA RANDPER
|
||
JRNC EX ;NO CHANGE OF MODE
|
||
;COULD BE IN SIT MODE OR STICK MODE
|
||
MOVI 1,B0
|
||
MOVI 13,B1 ;4
|
||
CALLA RANGRAND
|
||
CMPI 5,A0
|
||
JRLT AK
|
||
MOVK 4,A0
|
||
AK:
|
||
CMPI 1,A0
|
||
JREQ SHOOT
|
||
MOVB A0,*A13(MODE)
|
||
CMPI 3,A0
|
||
JREQ EX
|
||
MOVE *A13(TDIR),A1
|
||
MOVI 4,B0
|
||
MOVI 15,B1
|
||
CALLA RANGRAND
|
||
ADD A0,A1
|
||
CMPI 17,A1
|
||
JRLT AGN
|
||
SUBI 16,A1
|
||
AGN MOVE A1,*A13(TSK_DIR)
|
||
MOVK 1,A10
|
||
EX
|
||
MOVB @TOID_ON,A0
|
||
JRNZ RTY1
|
||
MOVB *A13(MODE),A0
|
||
CMPI 3,A0
|
||
JRNE RTY1
|
||
MOVK 1,A0 ;JUST SIT
|
||
MOVB A0,*A13(MODE)
|
||
RTY1 RETS
|
||
|
||
SHOOT
|
||
;SHOOT
|
||
MOVE A13,A9
|
||
CREATE 0,CBALL
|
||
MOVK 1,A0
|
||
MOVB A0,*A13(MODE)
|
||
RETS
|
||
|
||
STIK
|
||
MOVB @TOID_ON,A0
|
||
JRNZ RTY
|
||
MOVE *A13(KPTANK),A0,L
|
||
MOVE *A0(DIR),A0,W
|
||
MOVE A0,*A13(TDIR),W
|
||
DEC A0
|
||
ANDI 0FH,A0
|
||
MOVE A0,A2
|
||
SLL 5,A0
|
||
ADDI TSPINFRMS,A0
|
||
MOVE *A0,A1,L ;NEW OIMG
|
||
SLL 4,A2
|
||
ADDI TK_SPINFLGS,A2
|
||
MOVE *A2,A4,W ;NEW OFLAGS
|
||
CALLA ANI
|
||
RTY RETS
|
||
SIT:
|
||
MOVE A8,A0
|
||
MOVE *A13(KPTANKO),A8,L
|
||
CALLA GETANIXY
|
||
;A2=Y,A3=X
|
||
MOVE *A0(OFLAGS),A4,W
|
||
MOVB @TOID_ON,A7
|
||
JRZ ADF
|
||
ADDI 0360000H,A2 ;Y
|
||
MOVB *A13(TOIDLR),A7
|
||
JRZ SUBT
|
||
;THIS TORSO ON RIGHT
|
||
ADDI 0160000H,A3 ;X
|
||
JRUC ADF
|
||
SUBT SUBI 0160000H,A3 ;X
|
||
ADF CALLA GANISAG ;ADJUSTS TORSO
|
||
MOVE A0,A8
|
||
RETS
|
||
XOFSET: .LONG 070000H,0F0000H,0140000H,0160000H,01A0000H,0180000H,0140000H
|
||
.LONG 0E0000H,090000H,040000H,020000H,020000H,0,0,010000H,040000H
|
||
YOFSET: .LONG 020000H,020000H,020000H,020000H,0B0000H,0110000H,0120000H
|
||
.LONG 0170000H,0180000H,0170000H,0120000H,0110000H,0B0000H,020000H
|
||
.LONG 010000H,020000H
|
||
|
||
XVL: .LONG 0,0B333H,019999H,019999H,019999H,019999H,019999H,0B333H,0
|
||
.LONG -0B333H,-019999H,-019999H,-019999H,-019999H,-019999H,-0B333H
|
||
YVL: .LONG -019999H,-019999H,-019999H,-0CCCCH,0,0CCCCH,019999H,019999H,019999H
|
||
.LONG 019999H,019999H,0CCCCH,0,-0CCCCH,-019999H,-019999H
|
||
XVL2: .LONG 0,0E8F5H,02147AH,02147AH,02147AH,02147AH,02147AH,0E8F5H,0
|
||
.LONG -0E8F5H,-02147AH,-02147AH,-02147AH,-02147AH,-02147AH,-0E8F5H
|
||
YVL2: .LONG -02147AH,-02147AH,-02147AH,-010A3CH,0,010A3CH,02147AH,02147AH,02147AH
|
||
.LONG 02147AH,02147AH,010A3CH,0,-010A3CH,-02147AH,-02147AH
|
||
|
||
; 01
|
||
; 16 02
|
||
; 15 03
|
||
; 14 04
|
||
; 13 05
|
||
; 12 06
|
||
; 11 07
|
||
; 10 08
|
||
; 09
|
||
CBALL:
|
||
;A9=TORSOS' A13 THAT FIRED THIS BALL
|
||
MOVI TOTBNCS,A0
|
||
MOVE A0,@MEBNCS
|
||
MOVI CNNBLL,A10 ;CBALL
|
||
MOVI DMAWNZ,A11 ;FLAGS
|
||
MOVE *A9(KPTANKO),A0,L
|
||
MOVE *A0(OXVEL),A6,L ;RETAIN TANK VELOCITY
|
||
MOVE *A0(OYVEL),A7,L
|
||
; CLR A6
|
||
; CLR A7
|
||
CLR A5 ;MEANS CHECK DOORS FOR THIS BALL
|
||
; MOVB A8,*A13(SHWFLG)
|
||
MOVE *A9(TDIR),A2,W
|
||
MOVB @TOID_ON,A0
|
||
JRZ CBG
|
||
MOVK 1,A0
|
||
MOVE A0,@MEBNCS
|
||
MOVI CNNBLL2,A10 ;CBALL
|
||
|
||
MOVB *A9(TOIDLR),A0
|
||
JRZ CL
|
||
;THIS IS TORSO TO RGT, MAKE SURE HE WILL NOT FIRE 14,15,16,1, OR 2
|
||
CMPI 14,A2
|
||
JRNC DIEC
|
||
CMPI 2,A2
|
||
JRNC CBG
|
||
DIEC DIE
|
||
|
||
FBLI .LONG 0,WBUL6,WBUL7,WBUL8,WBUL85,WBUL9,WBUL85,WBUL8
|
||
.LONG WBUL7,WBUL6,WBUL7,WBUL8,WBUL85,WBUL9,WBUL85,WBUL8
|
||
.LONG WBUL7
|
||
FBLF .LONG 0,DMAWNZ+(M_FLIPV),DMAWNZ+(M_FLIPV)+(M_FLIPH)
|
||
.LONG DMAWNZ+(M_FLIPV)+(M_FLIPH),DMAWNZ+(M_FLIPV)+(M_FLIPH)
|
||
.LONG DMAWNZ+(M_FLIPV)+(M_FLIPH),DMAWNZ+(M_FLIPH),DMAWNZ+(M_FLIPH)
|
||
.LONG DMAWNZ+(M_FLIPH),DMAWNZ+(M_FLIPH)
|
||
.LONG DMAWNZ,DMAWNZ,DMAWNZ,DMAWNZ,DMAWNZ,DMAWNZ+(M_FLIPV)
|
||
.LONG DMAWNZ+(M_FLIPV),DMAWNZ+(M_FLIPV)
|
||
; 01
|
||
; 16 02
|
||
; 15 03
|
||
; 14 04
|
||
; 13 05
|
||
; 12 06
|
||
; 11 07
|
||
; 10 08
|
||
; 09
|
||
ABALL
|
||
;ENTER HERE FROM WLMAN
|
||
;A6 AND A7 SHOULD BE CLEARED
|
||
;A2=TDIR
|
||
; CLR A0
|
||
; MOVB A0,*A13(SHWFLG)
|
||
MOVK TOTBNCS,A0
|
||
MOVE A0,@MEBNCS
|
||
MOVE A9,A2
|
||
SLL 5,A9
|
||
MOVI FBLI,A6
|
||
ADD A9,A6
|
||
MOVE *A6,A10,L
|
||
ADDI FBLF,A9
|
||
MOVE *A9,A11,L
|
||
CLR A6
|
||
CLR A7
|
||
DEC A2
|
||
SLL 5,A2
|
||
MOVI XVL2,A3
|
||
ADD A2,A3
|
||
MOVE *A3,A3,L
|
||
ADD A3,A6
|
||
MOVI YVL2,A3
|
||
JRUC INHR0
|
||
CL
|
||
; CMPI 17,A2
|
||
; JREQ DIEC
|
||
CMPI 5,A2
|
||
JRC DIEC
|
||
CBG
|
||
DEC A2
|
||
SLL 5,A2
|
||
MOVI XVL,A3
|
||
ADD A2,A3
|
||
MOVE *A3,A3,L
|
||
ADD A3,A6
|
||
MOVI YVL,A3
|
||
|
||
;RECOIL
|
||
PUSH A7
|
||
MOVE *A9(TDIR),A9,W
|
||
CREATE 0,RECOIL
|
||
PULL A7
|
||
|
||
INHR0 ADD A2,A3
|
||
MOVE *A3,A3,L
|
||
ADD A3,A7
|
||
MOVE *A8(OXVAL),A0,L
|
||
MOVE *A8(OYVAL),A1,L
|
||
MOVI XOFSET,A3
|
||
ADD A2,A3
|
||
MOVE *A3,A3,L
|
||
ADD A3,A0
|
||
MOVI YOFSET,A3
|
||
ADD A2,A3
|
||
MOVE *A3,A3,L
|
||
ADD A3,A1
|
||
MOVE A10,A2 ;A10=IMAGE
|
||
; MOVE A5,A10
|
||
;YVAL IN A1
|
||
MOVI CLSENMY|TYPCBALL,A5
|
||
MOVE A11,A4
|
||
;ID IN A5
|
||
MOVI 159,A3 ;133
|
||
;ZPOS IN A3
|
||
;XVEL IN A6
|
||
;YVEL IN A7
|
||
CALLA BEGINOBJ2
|
||
|
||
MOVI MISS2,A0
|
||
CALLA ONESND
|
||
|
||
CLR A0
|
||
MOVB A0,*A13(BNCS)
|
||
MOVB A0,*A13(FDLY)
|
||
MOVB A0,*A13(LAST) ;LAST WALL HIT
|
||
CLR A10 ;INDICATES NO FRANIM OF THIS BULLET
|
||
MOVB @TOID_ON,A0
|
||
JRZ BULL_TOP
|
||
MOVI CLSENMY|TYPCBL2,A5
|
||
MOVE A5,*A8(OID)
|
||
|
||
C1L SLEEP 1
|
||
;MUST NOW DO EXPLODE CHECK ALSO!
|
||
L_TOP:
|
||
CALLR CLOSE ;CHECK TO SEE IF WE SHOULD EXPLODE BULLET!
|
||
JRC BULLEXP ;SET=EXP
|
||
MOVI [>1E,>21],A2
|
||
MOVI [>FC,>171],A3
|
||
CALLA SCRTSTG
|
||
JRZ C1L
|
||
;
|
||
;A0=1,2,3 OR 4 WHICH IS RETURNED FROM SCRTSTG!
|
||
;
|
||
MOVB *A13(LAST),A1
|
||
CMP A0,A1
|
||
JREQ C1L
|
||
MOVB A0,*A13(LAST)
|
||
MOVE A0,A11 ;KEEP B_DIR 1,2,3,OR 4
|
||
; NOW CHECK TO SEE IF BULLET IS PASSING THROUGH A GATE
|
||
CMPI 4,A0
|
||
JRNE AXEL
|
||
MOVB *A13(BNCS),A1
|
||
INC A1
|
||
MOVB A1,*A13(BNCS)
|
||
MOVE @MEBNCS,A0
|
||
CMP A0,A1
|
||
JRZ BULLGN
|
||
;
|
||
DO_BNCL:
|
||
;DO BOUNCE OF THIS BULLET
|
||
MOVB *A13(LAST),A0
|
||
CMPI 3,A0
|
||
JRLT DNL
|
||
MOVE *A8(OYVEL),A0,L
|
||
NEG A0
|
||
MOVE A0,*A8(OYVEL),L
|
||
JRUC C1L
|
||
DNL
|
||
MOVE *A8(OXVEL),A0,L
|
||
NEG A0
|
||
MOVE A0,*A8(OXVEL),L
|
||
JRUC C1L
|
||
|
||
CK_BNCL:
|
||
MOVB *A13(BNCS),A1
|
||
INC A1
|
||
MOVB A1,*A13(BNCS)
|
||
MOVE @MEBNCS,A0
|
||
CMP A0,A1
|
||
JRZ REGEXP
|
||
JRUC DO_BNCL
|
||
;
|
||
;CHECK TO SEE IF BULLET IS WITHIN EDGES OF DOOR
|
||
;
|
||
AXEL: MOVE A0,A1
|
||
SLL 5,A0
|
||
ADDI DRINF,A0
|
||
MOVE *A0,A0,L
|
||
MOVB *A0,A0
|
||
JREQ CK_BNCL
|
||
MOVE A1,A0
|
||
|
||
CALLA YESWALL
|
||
JRC CK_BNCL
|
||
; JRC REGEXP ;PROJECTILE HIT WALL NOT A DOORWAY
|
||
|
||
SLEEP 60 ;LET BULLET EXIT SCREEN
|
||
JRUC BULLGN
|
||
|
||
BULLEXP
|
||
; CLR A4
|
||
; MOVE A4,*A8(OXVEL),L
|
||
; MOVE A4,*A8(OYVEL),L
|
||
|
||
MOVI SMLEXP,A9
|
||
JRUC FRANIM_DIE
|
||
; MOVK 1,A1 ;COMMAND PASSED TO FRANIM
|
||
; JSRP FRANIM
|
||
;
|
||
; DELETE OBJECT FROM OBJLST
|
||
;
|
||
; MOVE A8,A0
|
||
; 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
|
||
|
||
|
||
BULL_TOP:
|
||
MOVI [>1E,>21],A2
|
||
MOVI [>FC,>171],A3
|
||
CALLA SCRTSTG
|
||
JRZ C1
|
||
;
|
||
;A0=1,2,3 OR 4 WHICH IS RETURNED FROM SCRTSTG!
|
||
;
|
||
MOVE A10,A10 ;INDICATES NO DOOR CHECKS! A10=0=CK DOORS=FRANIM
|
||
JRNZ BULLGN
|
||
MOVB *A13(LAST),A1
|
||
CMP A0,A1
|
||
JREQ C1
|
||
MOVB A0,*A13(LAST)
|
||
MOVE A0,A11 ;KEEP B_DIR 1,2,3,OR 4
|
||
; NOW CHECK TO SEE IF BULLET IS PASSING THROUGH A GATE
|
||
CMPI 4,A0
|
||
JRNE AXE
|
||
MOVB *A13(BNCS),A1
|
||
INC A1
|
||
MOVB A1,*A13(BNCS)
|
||
MOVE @MEBNCS,A0
|
||
CMP A0,A1
|
||
JRZ BULLGN
|
||
;
|
||
DO_BNC:
|
||
;DO BOUNCE OF THIS BULLET
|
||
MOVB *A13(LAST),A0
|
||
CMPI 3,A0
|
||
JRLT DN
|
||
MOVE *A8(OYVEL),A0,L
|
||
NEG A0
|
||
MOVE A0,*A8(OYVEL),L
|
||
JRUC C1
|
||
DN
|
||
MOVE *A8(OXVEL),A0,L
|
||
NEG A0
|
||
MOVE A0,*A8(OXVEL),L
|
||
JRUC C1
|
||
CK_BNC:
|
||
MOVB *A13(BNCS),A1
|
||
INC A1
|
||
MOVB A1,*A13(BNCS)
|
||
MOVE @MEBNCS,A0
|
||
CMP A0,A1
|
||
JRZ REGEXP
|
||
JRUC DO_BNC
|
||
;
|
||
;CHECK TO SEE IF BULLET IS WITHIN EDGES OF DOOR
|
||
;
|
||
AXE: MOVE A0,A1
|
||
SLL 5,A0
|
||
ADDI DRINF,A0
|
||
MOVE *A0,A0,L
|
||
MOVB *A0,A0
|
||
JREQ CK_BNC
|
||
MOVE A1,A0
|
||
|
||
CALLA YESWALL
|
||
JRC CK_BNC
|
||
; JRC REGEXP ;PROJECTILE HIT WALL NOT A DOORWAY
|
||
|
||
SLEEP 20 ;LET BULLET EXIT SCREEN
|
||
JRUC BULLGN
|
||
;
|
||
; PUT IN SEPERATE SLEEP VALUE HERE
|
||
;
|
||
C1:
|
||
MOVE A10,A10
|
||
JRZ C2
|
||
MOVB *A13(FDLY),A0
|
||
DEC A0
|
||
MOVB A0,*A13(FDLY)
|
||
JRNZ C2
|
||
MOVK 04,A1
|
||
JSRP FRANIM
|
||
JRNC C3
|
||
MOVE A10,A9 ;RESET A9 LIST PNTR
|
||
MOVK 3,A0
|
||
MOVB A0,*A13(FDLY)
|
||
C3
|
||
MOVB A0,*A13(FDLY)
|
||
JRUC BULL_TOP
|
||
C2 SLEEP 1 ;SLEEP 2 MAYBE?
|
||
JRUC BULL_TOP
|
||
;
|
||
YESWALL:
|
||
;
|
||
; COLLISION WITH WALL
|
||
;
|
||
MOVE @WORLDTL,A5,L
|
||
CMPI 3,A0
|
||
JRNE HZCK
|
||
MOVX A5,A4
|
||
SLL 16,A4
|
||
MOVE *A8(OXVAL),A0,L
|
||
SUB A4,A0
|
||
CMPI GATELFT,A0
|
||
JRLT NO1
|
||
CMPI GATERGT,A0
|
||
JRGE NO1
|
||
JRUC KEEP_GOING
|
||
;CHECK HORZ DOORWAYS
|
||
HZCK: MOVE *A8(OYVAL),A0,L
|
||
CLR A4
|
||
MOVY A5,A4
|
||
SUB A4,A0
|
||
CMPI GATETOP,A0
|
||
JRLT NO1
|
||
CMPI GATEBOT,A0
|
||
JRLT KEEP_GOING ;CHECK GATE STATE NOW
|
||
NO1:
|
||
SETC
|
||
RETS
|
||
|
||
KEEP_GOING:
|
||
;NOW CHECK TO SEE IF BULLET IS COLLIDING WITH TOP GATE.
|
||
CLRC ;INDICATES KEEP ON GOING THROUGH GATE
|
||
RETS
|
||
|
||
BULLGN
|
||
; ANYTHING ELSE TO DO HERE? WHEN DELETING AN OBJECT?
|
||
CLR A4
|
||
MOVE A4,*A8(OXVEL),L
|
||
MOVE A4,*A8(OYVEL),L
|
||
;
|
||
; DELETE OBJECT FROM OBJLST
|
||
;
|
||
MOVE A8,A0
|
||
CALLA DELOBJ
|
||
;DYG
|
||
DIE
|
||
;
|
||
KILL_CBALL:
|
||
;ALSO USED FOR SHRAPNEL FROM FAT MAN
|
||
MMTM SP,A1
|
||
MOVE *A8(OPLINK),A0,L
|
||
JREQ RET
|
||
CLR A1
|
||
MOVE A1,*A8(OPLINK),L
|
||
CALLA KILL
|
||
MOVE A8,A0
|
||
; CALLA DELPAL ;NEEDED? NO!!!!
|
||
CALLA DELOBJ
|
||
RET
|
||
MMFM SP,A1
|
||
RETS
|
||
KILL_CBALL2:
|
||
MMTM SP,A1,A7
|
||
MOVE *A8(OPLINK),A0,L
|
||
JREQ RET2
|
||
CLR A1
|
||
MOVE A1,*A8(OPLINK),L
|
||
CALLA KILL
|
||
CREATE 0,BULLEXP
|
||
RET2
|
||
MMFM SP,A1,A7
|
||
RETS
|
||
|
||
REGEXP:
|
||
;REGULAR EXPLOSION HERE
|
||
CLR A4
|
||
MOVE A4,*A8(OXVEL),L
|
||
MOVE A4,*A8(OYVEL),L
|
||
;CHANGE THE ID
|
||
MOVI CLSNEUT|TYPNEUT,A0
|
||
MOVE A0,*A8(OID)
|
||
MOVI BULL_EXP_LIST,A2 ;MOVE BASE TABLE ADDRESS INTO A2
|
||
;A11=WALL 1,2,3 OR 4 WHICH WAS RETURNED FROM SCRTSTG
|
||
DEC A11
|
||
SLL 5,A11 ;BDIR*32 FOR LONG WORD LOOKUP TABLE
|
||
ADD A11,A2 ;CALCULATE OFFSET IN TABLE
|
||
MOVE *A2,A9,L ;MOVE TABLE VALUE INTO A4
|
||
;POSSIBLY PLACE THIS OBJECT ON ANOTHER LIST
|
||
;EXPLODE BULLET NOW!
|
||
JRUC FRANIM_DIE
|
||
; MOVK 1,A1 ;COMMAND PASSED TO FRANIM
|
||
; JSRP FRANIM
|
||
; NOW DELETE OBJECT FROM OBJLST
|
||
;
|
||
; DELETE OBJECT FROM OBJLST
|
||
;
|
||
; MOVE A8,A0
|
||
; CALLA DELOBJ
|
||
; DIE
|
||
; 01
|
||
; 16 02
|
||
; 15 03
|
||
; 14 04
|
||
; 13 05
|
||
; 12 06
|
||
; 11 07
|
||
; 10 08
|
||
; 09
|
||
;701
|
||
;6 2
|
||
;543
|
||
|
||
CVRT .BYTE 0,5,13,9,1,7,11,3,15,6,12,2,16,8,10,4
|
||
CVRT2 .BYTE 0,05,13,09,01,07,11,03,15
|
||
.EVEN
|
||
|
||
; 04
|
||
; 12 11
|
||
; 08 07
|
||
; 16 15
|
||
; 02 01
|
||
; 10 09
|
||
; 06 05
|
||
; 14 13
|
||
; 03
|
||
|
||
;GETHDR - RETURNS 1 OF 16 DIRECTIONS BASED ON OBJECTS X,Y VELOCITIES
|
||
;PARAMS:
|
||
; A1 = OBJ X VELOCITY
|
||
; A2 = OBJ Y VELOCITY
|
||
;RETURNS:
|
||
; A0 = 4,B,7,F,1,9,5,D,3,E,6,A,2,10,8,C = CW DIRECTION STARTING AT 12 O'CLOCK
|
||
; 4
|
||
; 2 1
|
||
; 3
|
||
GETHDR:
|
||
MOVE A1,A3
|
||
MOVE A2,A4
|
||
ABS A3 ;ABSOLUTE X VELOCITY
|
||
ABS A4 ;ABSOLUTE Y VELOCITY
|
||
MOVE A3,A5
|
||
ADD A4,A5 ;SUM Y+X
|
||
JRNE GAD1 ;BR = THERE IS A DIRECTION HERE!
|
||
CLR A3 ;STANDING CASE
|
||
JRUC SETDVAL
|
||
GAD1:
|
||
MOVK 3,A5
|
||
MOVK 3,A7
|
||
MPYU A3,A5 ;CALC 3*X
|
||
MPYU A4,A7 ;CALC 3*Y
|
||
CMP A7,A3 ;XV>3*YV ?
|
||
JRHS GADX ;BR = CHECK X VELOCITY CASE
|
||
CMP A5,A4 ;YV>3*XV ?
|
||
JRHS GADY ;BR = CHECK Y VELOCITY CASE
|
||
;
|
||
;DIAGONAL XY VELOCITY CASE
|
||
;4 POSSIBLE QUADRANTS 0-3
|
||
; 3 2
|
||
; 1 0
|
||
MOVE A1,A3 ;SAVE X,Y VELOCITIES
|
||
MOVE A2,A4
|
||
SRL 31,A1 ;X VEL
|
||
SRL 31,A2 ;Y VEL
|
||
SLL 1,A2
|
||
ADD A1,A2
|
||
;WE NOW HAVE THE QUADRANT NOW CHECK FOR 1 OF 3 DIRECTIONS WITHIN QUADRANT
|
||
;IN A2
|
||
ABS A3 ;X UNSIGNED COMPARE
|
||
ABS A4 ;Y
|
||
CMP A3,A4 ;Y>X?
|
||
JRGT DIFF ;BR = YES
|
||
SUB A4,A3
|
||
CMPI >2800,A3 ;-4000?
|
||
JRLT INRNGE ;WITHIN RANGE, USE QUADRANT K
|
||
ADDK 9,A2 ;RANGE LO
|
||
JRUC SETRNGE
|
||
DIFF:
|
||
SUB A3,A4
|
||
CMPI >2800,A4 ;+4000
|
||
JRLT INRNGE ;WITHIN RANGE USE QUADRANT K
|
||
ADDK >D,A2 ;RANGE HI
|
||
JRUC SETRNGE
|
||
INRNGE:
|
||
ADDK 5,A2
|
||
SETRNGE:
|
||
MOVE A2,A3
|
||
JRUC SETDVAL
|
||
;X VELOCITY CASE
|
||
GADX:
|
||
MOVK 1,A3 ;DISCRETE RYTE
|
||
MOVE A1,A1
|
||
JRNN SETDVAL ;
|
||
MOVK 2,A3 ;LEFT
|
||
JRUC SETDVAL
|
||
;Y VELOCITY CASE
|
||
GADY:
|
||
MOVK 3,A3 ;DISCRETE DOWN
|
||
MOVE A2,A2
|
||
JRNN SETDVAL
|
||
MOVK 4,A3 ;UP
|
||
;HAVE OFFSET IN A3
|
||
SETDVAL:
|
||
MOVE A3,A0
|
||
RETS
|
||
|
||
KILL_TORSO:
|
||
MMTM SP,A1
|
||
MOVE A0,A10
|
||
MOVE *A0(OID),A9,W ;KILLERS OID
|
||
;WILL BE BOGUS IF SOMETHING OTHER THAN A BULLET STRUCK TANK!
|
||
MOVE *A8(OPLINK),A0,L
|
||
ANDI F_SUBT,A9
|
||
DEC A9
|
||
SLL 3,A9
|
||
ADDI PUNISH,A9
|
||
MOVB *A9,A9
|
||
MOVB *A0(ABSORB),A1
|
||
ADD A9,A1
|
||
MOVB A1,*A0(ABSORB)
|
||
MOVB @TOID_ON,A9
|
||
JRZ CTP
|
||
CMPI TOIDHIT,A1
|
||
JRUC CTP2
|
||
CTP MOVE @TNKHITS,A9
|
||
CMP A9,A1
|
||
; CMPI TOTHIT,A1
|
||
;IF LESS THAN, START COLOR CYCLE PROCESS HERE
|
||
CTP2 JRLT OKFL
|
||
;ABSORBED ENOUGH HITS TO DESTROY IT
|
||
CREATE 0,TORSO_EXP
|
||
;TANK_EXP WHEN IT WAKES UP
|
||
MOVE *A8(OPLINK),A0,L
|
||
MOVE *A0(KPTANK),A1,L
|
||
CLR A7
|
||
MOVB A7,*A1(ADRIVER)
|
||
CALLA KILL ;KILLS PROCESS IN A0
|
||
MOVE A8,A0
|
||
CALLA DELOBJ
|
||
|
||
CALLA GETUGH
|
||
OK MMFM SP,A1
|
||
RETS
|
||
KILL_TS
|
||
;SMART BOMB
|
||
;A8=TORSO IMG PTR
|
||
CREATE 0,KILL_TS2
|
||
;TANK_EXP WHEN IT WAKES UP
|
||
MOVE *A8(OPLINK),A0,L
|
||
MOVE *A0(KPTANK),A1,L
|
||
CLR A7
|
||
MOVB A7,*A1(ADRIVER)
|
||
CALLA KILL ;KILLS PROCESS IN A0
|
||
CLR A0
|
||
MOVE A0,*A8(OXVEL),L
|
||
MOVE A0,*A8(OYVEL),L
|
||
MOVI CLSNEUT|TYPNEUT,A0
|
||
MOVE A0,*A8(OID)
|
||
MOVE *A8(OYPOS),A0
|
||
ADDI 040H,A0
|
||
MOVE A0,*A8(OYPOS)
|
||
RETS
|
||
KILL_TS2
|
||
MOVI BOOM3,A9
|
||
JRUC FRANIM_DIE
|
||
; MOVK 1,A1
|
||
; JSRP FRANIM
|
||
; MOVE A8,A0
|
||
; CALLA DELOBJ
|
||
; DIE
|
||
|
||
OKFL
|
||
; MOVE *A0(KPTANKO),A8,L
|
||
PUSH A9
|
||
MOVI 018180000H,A9
|
||
CREATE 0,FLASHME
|
||
PULL A9
|
||
MMFM SP,A1
|
||
RETS
|
||
|
||
PUNISH: .BYTE 2,2,5,20,20
|
||
.EVEN
|
||
|
||
TORSO_EXP:
|
||
;A10=KILL IMAGE PNTR
|
||
MOVE *A10(OPLINK),A0,L
|
||
MOVB *A0(MYPLYR),A0
|
||
TSO_EXP:
|
||
;A0=1 OR 2
|
||
MOVI TNKPT,A1 ;AMOUNT OF SCORE
|
||
DOBLO
|
||
MOVI P1DATA,A2 ;PLAYER 1 SCORE SELECT
|
||
CMPI 1,A0
|
||
JREQ TX1
|
||
;ADD TO WHICH SCORE
|
||
CMPI 2,A0
|
||
JRNZ TX1A
|
||
MOVI P2DATA,A2 ;PLAYER 1 SCORE SELECT
|
||
TX1
|
||
CALLA SCRADD2 ;DO IT!
|
||
TX1A
|
||
;A8=PNTR TO OBJECT TO BLOW UP
|
||
CLR A6
|
||
CLR A7
|
||
TSO_EXP2
|
||
MOVB @PCTOT,A2
|
||
CMPI 019H,A2
|
||
JRGE NOT
|
||
;HAVE ROOM FOR PIECES
|
||
CREATE 0,ADPCS1
|
||
NOT DIE
|
||
|
||
; 01
|
||
; 16 02
|
||
; 15 03
|
||
; 14 04
|
||
; 13 05
|
||
; 12 06
|
||
; 11 07
|
||
; 10 08
|
||
; 09
|
||
WALK_LIST:
|
||
.LONG TNK01,0,0,0,TNK05,0,0,0
|
||
.LONG TNK09,0,0,0,TNK13,0,0,0
|
||
;
|
||
;TANK ANIMATION TABLES
|
||
;
|
||
TNK01:
|
||
.LONG TNK12A
|
||
.WORD FLIPBITS|05,0
|
||
.LONG TNK12B
|
||
.WORD 05
|
||
.LONG 0
|
||
TNK05:
|
||
.LONG TNK9A
|
||
.WORD FLIPBITS|05,(M_FLIPH)
|
||
.LONG TNK9B
|
||
.WORD 05
|
||
.LONG 0
|
||
TNK09:
|
||
.LONG TNK6A
|
||
.WORD FLIPBITS|05,0
|
||
.LONG TNK6B
|
||
.WORD 05
|
||
.LONG 0
|
||
TNK13:
|
||
.LONG TNK9A
|
||
.WORD FLIPBITS|05,0
|
||
.LONG TNK9B
|
||
.WORD 05
|
||
.LONG 0
|
||
|
||
.END
|
||
|
||
|
||
|
||
|