smashtv/BACKUP/BOUNCERS.ASM

647 lines
12 KiB
NASM
Raw Permalink Blame History

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

.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