.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