smashtv/BACKUP/BOUNCERS.ASM

647 lines
12 KiB
NASM
Raw Normal View History

2021-04-06 15:09:56 -07:00
.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