.FILE 'BOUNCERS.ASM' .TITLE 'ROBO-RAMA GAME PROGRAM' .WIDTH 132 .OPTION B,D,L,T .MNOLIST ; ; INITIATED: APRIL 26,1989 ; MODIFIED: ! ; SOFTWARE: MARK TURMELL & ROBERT ASHWORTH ; ; 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" ; .INCLUDE "\VIDEO\SYS\SND.EQU" ; ;SYMBOLS EXTERNALLY DEFINED ; .REF RANGRAND,GETCPNT,FRANIM,DELPAL,GPALOBJ,SCRADD2 .REF P1DATA,PEXPLSND,ONESND .REF ADJSTWTL ; ;SYMBOLS DEFINED IN THIS FILE ; .DEF SPAWN_BNCRS,DELETE_ME,KILL_BOUNCER,BOBJ2A .DEF BEGIN_OBJ,GENERIC_INIT,BEGIN_OBJ2 .DEF XVAL,YVAL,IMG,ZPOS,FLAGS,ID,XVEL,YVEL .DEF BOOM2,ONSCRN_BNCRS ; ;UNINITIALIZED RAM DEFINITIONS ; .BSS BNCR_CNT,8 ;TOTAL BNCRS ON SCREEN .BSS GENERIC_INIT,7*32-16 ; ;EQUATES FIRST ORIGINATED IN THIS FILE ; 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 BLFT .EQU 0 BRGT .EQU 070H MAXBNCR .EQU 10 ;MAX NUMBER OF BNCRS ALLOWED BNCRAGE .EQU 60*60 ;MAX AGE OF BNCRS (IN TICKS) HSPEED .EQU >10000 ;PIXELS PER FIELD UPDATE VSPEED .EQU >10000 ;PIXELS PER FIELD VERTICAL NUPBND .EQU >00390000+>200000 NDNBND .EQU >00DF0000->200000 NLFTBND .EQU >001A0000+>300000 NRGTBND .EQU >01640000->300000 ; ;BULLETS STRUCTURE ; BV .EQU 0 BXO .EQU 32 BYO .EQU 64 BF .EQU 96 ; ;BNCR PDATA STRUCTURE ; ;AGE .EQU PDATA ;WORD DIR .EQU PDATA+16 ;WORD BDELAY .EQU PDATA+32 ;WORD KILLME .EQU PDATA+48 ;WORD ************************************************************************** .TEXT KILL_BOUNCER: MOVE *A8(OPLINK),A0,L MOVK 1,A7 MOVE A7,*A0(KILLME) RETS DEC_BNCR: MOVB @BNCR_CNT,A3 ;DELETE A BNCR FROM CNT DEC A3 MOVB A3,@BNCR_CNT RETS SPAWN_BNCRS: MOVB @BNCR_CNT,A2 ;MOVE BYTE (# GRUNTS ON SCRN) TO A2 CMPI MAXBNCR,A2 ;GRUNTS MAXED OUT? JRZ BNCR_OUT ; CREATE 0,BOUNCER ;START ONE BOUNCER BNCR_OUT: RETS ONSCRN_BNCRS: RETS ; 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 BNCRPID,OBNCR PULL A2 DSJNE A2,OH1 RETS OBNCR: ;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 ; CLR 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 BEGIN_OBJ2 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 JRUC LUP_TOP BOUNCER: ; CALLR INIT_BNCR ;INITIAL BNCR PARAMS (SHAPE ETC..) CALLR SETUP_BNCR ;STUFF NECESSARY FIELD FOR INIT LUP_TOP: MOVE *A13(KILLME),A0 JRZ NO_DELETE MOVI P1DATA,A2 ;PLAYER 1 SCORE SELECT MOVI >25,A1 ;AMOUNT OF SCORE TO ADD PER BNCR CALLA SCRADD2 ;DO IT! CALLR DELETE_ME CALLR DEC_BNCR CREATE 0,BNCR_EXP DIE NO_DELETE: ; AGE IS NOT ZERO! ;DO WE NEED TO FIRE HORIZONTALLY AT PLAYER??? MOVE *A13(BDELAY),A1 JRZ MAYBE DEC A1 MOVE A1,*A13(BDELAY) JRUC NO ;BR=DON'T EVEN THINK ABOUT SHOOTING MAYBE: PUSH A8 ;SAVE OBJECT POINTER ; MOVE @KEEP_TORSO_PTR,A8,L MOVE *A8(OXPOS),A7 ;XPOS OF PLAYER FOR LATER CHECK CALLA GETCPNT PULL A8 ;RESTORE BOUNCER POINTER SRL 16,A1 SUBI 10,A1 ;A1 = CENTER POINT OF PLAYER MOVE *A8(OYPOS),A5 ;BOUNCER Y POSITION CMP A5,A1 JRLT NO ;BR=BOUNCER IS ABOVE PLAYER ADDI 20,A5 CMP A5,A1 JRGT NO ;BR=BOUNCER IS BELOW PLAYER ; A HIT ; START SPIN PRIOR TO FIRE MOVI 18,A1 ;DELAY BEFORE THIS BOUNCER FIRES AGAIN MOVE A1,*A13(BDELAY) CLR A0 MOVE A0,*A8(OXVEL),L MOVE A0,*A8(OYVEL),L MOVE *A13(DIR),A4 MOVE *A8(OXPOS),A6 ;X POSITION OF BOUNCER CMP A6,A7 ;A7 IS PLAYER OXPOS, A6 IS BOUNCER JRLT SPLFT ;BR=BOUNCER WILL SPIN TO LEFT TO FIRE ; BOUNCER WILL SPIN TO RIGHT ; NEED TO CHANGE A9 TO POINT TO APPROPRIATE FRANIM TBL (1 OF 2!) ; WE ALSO NEED TO ZERO VELOCITIES MOVI UP_RGT,A9 CMPI 2,A4 JREQ STUFFA9 MOVI DN_RGT,A9 JRUC STUFFA9 SPLFT: MOVI UP_LFT,A9 CMPI 2,A4 JREQ STUFFA9 MOVI DN_LFT,A9 STUFFA9: MOVK 1,A1 JRUC ANI_BNCR ;SKIP BOUNDARY CHECK NO: ;COMPARE FOR TOP/BOT BOUNDARIES MOVE *A8(OYVAL),A5,L ;Y POSITION OF BOUNCER MOVE *A13(DIR),A1 ;GET GRUNT DIRECTION CMPI 2,A1 ;IS HE MOVING UP?? JRNE CHKDN ;BR=HE IS FACING DOWN ; CMPI UPBND,A5 JRHI ANI_BNCR JRUC DO_FLP CHKDN: ; CMPI DNBND,A5 ;GET DOWN BOUNDARY JRLO ANI_BNCR ;BR=PLAYER LOWER THAN BOUNDARY DO_FLP: ;FLIP_DIR REVERSES PLUS STARTS NEW FRANIM LIST (A9) CALLR FLIP_DIR ;REVERSE HIS DIRECTION MOVK 1,A1 JRUC ANI_SPIN ;ANIM WILL LOOP TIL DONE WITH TABLE ANI_BNCR: CLR A1 ;FOR NORMAL WALKING, WE WANT FRANIM ;TO COME BACK AFTER EACH STEP SO THAT ;WE CAN BE CHECKING TO SEE IF WE NEED ;TO SHOOT OR FOR BOUNDARIES! ;OR!!! ANI_SPIN: ;ENTRY FROM SET SPIN (NONSTOP FRANIM) JSRP FRANIM JRNC CHECK_NEXT ;BR=NOT AT END OF SCRIPT YET CALLR STF4WLK ;RESTORE WALKING SCRIPT ; CHECK_NEXT: ;GET NEXT TABLE ENTRY JRUC LUP_TOP ; SETUP_BNCR: MOVI BNCRAGE,A3 ;SET AGE LIMIT OF OBJECT ; MOVE A3,*A13(AGE) CALLR GET_DIR ;INITIAL DIRECTION OF PLAYER CALLR STF4WLK ;STUFF A9 FOR WALKING DIR CLR A0 MOVE A0,*A13(BDELAY) MOVE A0,*A13(KILLME) ; UPDATE BNCR COUNT MOVB @BNCR_CNT,A0 INC A0 MOVB A0,@BNCR_CNT RETS FLIP_DIR: MOVE *A13(DIR),A1 ;REVERSE DIRECTION FROM PREVIOUS XORI 1,A1 MOVE A1,*A13(DIR) MOVI UP_DN,A9 CMPI 3,A1 JREQ SETPTRA MOVI DN_UP,A9 SETPTRA: CLR A0 MOVE A0,*A8(OXVEL),L MOVE A0,*A8(OYVEL),L RETS STF4WLK: MOVI T_PWK_UP,A9 ;ASSUME UP MOVE *A13(DIR),A0 CMPI 2,A0 JREQ SETPTR MOVI T_PWK_DN,A9 SETPTR: ; START HIM WALKING IN PROPER DIR WITH VELOCITY ; DIR IS IN A0 SLL 5,A0 ;*32 FOR EACH TABLE ENTRY MOVI X1_OFFSET,A1,L ;BASE TABLE ADDRESS ADD A0,A1 ;ADJUSTED OFFSET FOR TABLE ENTRY MOVE *A1,A3,L ;A3 CONTAINS CORRECT X VELOCITY MOVI Y1_OFFSET,A1,L ;BASE TABLE ADDRESS ADD A0,A1 ;ADJUSTED OFFSET FOR TABLE ENTRY MOVE *A1,A4,L ;A4 CONTAINS CORRECT Y VELOCITY MOVE A3,*A8(OXVEL),L ;UPDATE X,Y VELOCITIES MOVE A4,*A8(OYVEL),L RETS GET_DIR: ; GET DIR 3 OR 4 AND STUFF IT MOVI 3,B0 ;CHOOSE RANDOM INITIAL DIRECTION MOVI 4,B1 ;EITHER UP OR DOWN (3 OR 4) CALLA RANGRAND DEC A0 MOVE A0,*A13(DIR) RETS ;ROTATE HIS BODY TO MATCH DIRECTION DELETE_ME: ; ; DELETE OBJECT FROM OBJLST ; MOVE A8,A0 CALLA DELPAL CALLA DELOBJ RETS INIT_BNCR: ;INITIAL BNCR POSITION,IMAGE SHAPE,AGE ETC.... ; DO STFOBF AND GET A0 PNTR ;RANDOM POSITIONING FOR BNCRS X/Y WITHIN SCREEN BOUNDARIES ; MOVE A0,A8 ; MOVI UPBND,B0 ; MOVI DNBND,B1 CALLA RANGRAND MOVE A0,A1 ;A1=YVAL ; MOVI LFTBND,B0 ; MOVI RGTBND,B1 CALLA RANGRAND ;A0=XVAL MOVI CLSENMY|TYPBNCR,A5 ;A5=ID MOVI DMAWNZ,A4 ;DRAW NON-ZERO BITS ;A4=FLAGS MOVI T12ORN1,A2 ;BNCR IMAGE ;A2=IMG MOVI 159,A3 ;A3=ZPOS CLR A6 ;A6=XVEL CLR A7 ;A7=YVEL CALLA BEGIN_OBJ RETS BNCR_EXP: CALLR BEGIN_EXP MOVI PEXPLSND,A0 CALLA ONESND MOVI BOOM2,A9 MOVK 1,A1 JSRP FRANIM CALLR DELETE_ME DIE BEGIN_EXP: MOVE *A8(OXVAL),A0,L ;A0=XVAL MOVE *A8(OYVAL),A1,L ;A1=YVAL MOVI CLSNEUT|TYPNEUT,A5 ;A5=ID MOVI DMAWNZ|M_NOCOLL,A4 ;DRAW NON-ZERO BITS ;A4=FLAGS MOVI EXPb1,A2 ;A2=IMG MOVI 159,A3 ;A3=ZPOS CLR A6 ;A6=XVEL CLR A7 ;A7=YVEL ;PUT ON ANOTHER LIST CALLA BEGIN_OBJ RETS FLAMES: CALLR BEGIN_BLT ; FLAMES1: ; TEST FOR WALL BORDERS MOVI [>3C,>1A],A2 MOVI [>EA,>178],A3 CALLA SCRTSTG JRZ FLAMES2 ; DEL OBJ ; NOW DELETE OBJECT FROM OBJLST CALLR DELETE_ME DIE FLAMES2: SLEEP 1 JRUC FLAMES1 BEGIN_BLT: ; NOW STUFF CORRECT BULLET AND CORRECT FLIP INFO ; A10 = 0 FOR LEFT BULLET OR 112 FOR RGT BULLET MOVI BINFO,A0 ADD A10,A0 MOVE *A0(BV),A6,L ;A6=XVEL MOVE *A0(BXO),A2,L MOVE *A0(BYO),A7,L MOVE *A0(BF),A4 ;A4=FLAGS MOVE *A8(OXVAL),A0,L ADD A2,A0 ;A0=XVAL MOVE *A8(OYVAL),A1,L ADD A7,A1 ;A1=YVAL MOVI CLSENMY|TYPBNBL,A5 ;BOUNCER BULLET ID ;A5=ID MOVI BULLETSIDE,A2 ;A2=IMG MOVI 159,A3 ;A3=ZPOS CLR A7 ;A7=YVEL CALLA BEGIN_OBJ2 RETS ; BEGIN_OBJ: ;MAKE MORE EFFIECIENT MOVE A0,@XVAL,L MOVE A1,@YVAL,L MOVE A2,@IMG,L MOVE A3,@ZPOS MOVE A4,@FLAGS MOVE A5,@ID MOVE A6,@XVEL,L MOVE A7,@YVEL,L MOVI GENERIC_INIT,A14 ;DEFINE OBJECT PARAMS CALLA GPALOBJ ;ALLOCATE A COLOR PALETTE CALLA STFOBJ ;STUFF OBJECT DATA MOVE A13,*A0(OPLINK),L CALLA ADJSTWTL ;PUT US IN THE WORLD CALLA INSOBJ ;INSERT OBJECT INTO LIST MOVE A0,A8 RETS ; BEGIN_OBJ2: MOVE A0,@XVAL,L MOVE A1,@YVAL,L MOVE A2,@IMG,L MOVE A3,@ZPOS MOVE A4,@FLAGS MOVE A5,@ID MOVE A6,@XVEL,L MOVE A7,@YVEL,L BOBJ2A: MOVI GENERIC_INIT,A14 ;DEFINE OBJECT PARAMS CALLA GPALOBJ ;ALLOCATE A COLOR PALETTE CALLA STFOBJ ;STUFF OBJECT DATA MOVE A13,*A0(OPLINK),L CALLA INSOBJ ;INSERT OBJECT INTO LIST MOVE A0,A8 RETS BINFO: ; .LONG XVEL, .LONG XOFFSET, .LONG YOFFSET, .WORD FLAGS .LONG -060000H,080000H,090000H .WORD DMAWNZ .LONG 060000H,0230000H,090000H .WORD DMAWNZ+M_FLIPH ; X1_OFFSET: .LONG -HSPEED,HSPEED,0,0 ; Y1_OFFSET: .LONG 0,0,-VSPEED,VSPEED ; ;BOUNCER WALK ANIMATION TABLES ; T_PWK_UP: .LONG T12ORN1 .WORD FLIPBITS|6,0 .LONG T12ORN2 .WORD 6 .LONG T12ORN3 .WORD 6 .LONG T12ORN4 .WORD 6 .LONG T12ORN5 .WORD 6 .LONG 0 T_PWK_DN: .LONG T12ORN1 .WORD FLIPBITS|6,(M_FLIPV) .LONG T12ORN2 .WORD 6 ;FLIPBITS|6,(M_FLIPV) .LONG T12ORN3 .WORD 6 ;FLIPBITS|6,(M_FLIPV) .LONG T12ORN4 .WORD 6 ;FLIPBITS|6,(M_FLIPV) .LONG T12ORN5 .WORD 6 ;FLIPBITS|6,(M_FLIPV) .LONG 0 ; ;BOUNCER ROTATE ANIMATIONS TABLE ; UP_LFT: .LONG T10ORN1 .WORD FLIPBITS|4,0 .LONG T3OSH1 .WORD FLIPBITS|18,(M_FLIPH) .LONG T3OSH2 .WORD SPAWNP|FLIPBITS|8 .WORD BLFT,0,0 .LONG FLAMES .WORD M_FLIPH .LONG T3OSH1 .WORD FLIPBITS|18,(M_FLIPH) .LONG T3OSH2 .WORD SPAWNP|FLIPBITS|8 .WORD BLFT,0,0 .LONG FLAMES .WORD M_FLIPH .LONG T10ORN1 .WORD FLIPBITS|4,0 .LONG 0 ; UP_RGT: .LONG T2ORN1 .WORD FLIPBITS|4,0 .LONG T3OSH1 .WORD FLIPBITS|18,0 .LONG T3OSH2 .WORD SPAWNP|8 .WORD BRGT,0,0 .LONG FLAMES .LONG T3OSH1 .WORD FLIPBITS|18,0 .LONG T3OSH2 .WORD SPAWNP|8 .WORD BRGT,0,0 .LONG FLAMES .LONG T2ORN1 .WORD FLIPBITS|4,0 .LONG 0 ; DN_LFT: .LONG T10ORN1 .WORD FLIPBITS|4,(M_FLIPV) .LONG T3OSH1 .WORD FLIPBITS|18,(M_FLIPH) .LONG T3OSH2 .WORD SPAWNP|FLIPBITS|8 .WORD BLFT,0,0 .LONG FLAMES .WORD M_FLIPH .LONG T3OSH1 .WORD FLIPBITS|18,(M_FLIPH) .LONG T3OSH2 .WORD SPAWNP|FLIPBITS|8 .WORD BLFT,0,0 .LONG FLAMES .WORD M_FLIPH .LONG T10ORN1 .WORD FLIPBITS|4,(M_FLIPV) .LONG 0 ; DN_RGT: .LONG T2ORN1 .WORD FLIPBITS|4,(M_FLIPV) .LONG T3OSH1 .WORD FLIPBITS|18,0 .LONG T3OSH2 .WORD SPAWNP|8 .WORD BRGT,0,0 .LONG FLAMES .LONG T3OSH1 .WORD FLIPBITS|18,0 .LONG T3OSH2 .WORD SPAWNP|8 .WORD BRGT,0,0 .LONG FLAMES .LONG T2ORN1 .WORD FLIPBITS|4,(M_FLIPV) .LONG 0 ; UP_DN: .LONG T2ORN1 .WORD FLIPBITS|4,0 .LONG T3ORN1 .WORD FLIPBITS|4,0 .LONG T2ORN1 .WORD FLIPBITS|4,(M_FLIPV) .LONG 0 ; DN_UP: .LONG T10ORN1 .WORD FLIPBITS|4,(M_FLIPV) .LONG T3ORN1 .WORD FLIPBITS|4,(M_FLIPH) .LONG T10ORN1 .WORD FLIPBITS|4,0 .LONG 0 BOOM2: .LONG EXPb1 .WORD 3 .LONG EXPb2 .WORD 3 .LONG EXPb3 .WORD 4 .LONG EXPb4 .WORD 4 .LONG EXPb5 .WORD 4 .LONG EXPb6 .WORD 4 .LONG EXPb7 .WORD 5 .LONG EXPb8 .WORD 5 .LONG EXPb9 .WORD 5 .LONG 0 .END