smashtv/ROBOTS.ASM

1248 lines
24 KiB
NASM
Raw Normal View History

2021-04-06 15:09:56 -07:00
.FILE 'ROBOTS.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"
;
;SOUNDS
;
.REF EXP1,GLSEXP
;
;SYMBOLS EXTERNALLY DEFINED
;
.REF GETFPAL,SETUP_DIR,DO_DIFF2,INTO,BEGINOBJ,BEGINOBJ2
.REF ADJSTWTL,GET_VALID_XY,INFOTBL,BOOM3,PCNT,DRINF,NEW_OV
.REF RANGRAND,FRANIM,ADDRPCS,BOOM2,ZOOM4,GET_VALID_DOOR
.REF P2DATA,P1DATA,SCRADD2,SPINFLGS
.REF GAMSTATE,WAVEYX
.REF HALT,EHALT
.REF SET_GATE_2,RANDPER,KP_LS,KP_RS,KP_TS
.REF WAVE,GET_WVADDR
.REF OVERLORD,KILOBJ,BOOMN
.REF DEXIT,PCTOT,XVEL,YVEL,NEWV
.REF FROMDR,PLYROBJS,PLYRPRCS
;
;SYMBOLS DEFINED IN THIS FILE
;
.DEF KILL_RBT,KILL_R1
.DEF SPWN_RBTA,O_RBTA,RBTA_DN,MAXRBTA,RBTA_CNT,ROBTYP
;
;UNINITIALIZED RAM DEFINITIONS
;
.BSS RBTA_CNT,16 ;TOTAL HULKS ON SCREEN
.BSS RBTA_DN,16
.BSS MAXRBTA,8
.BSS TMP,16
.BSS INDEX,8
.BSS ROBTYP,16
;
;EQUATES FOR THIS FILE
;
;ROBOT SMALL DATA STRUCTURE
;
HAGE .EQU PDATA ;OBJECT AGE
DIR .EQU PDATA+16 ;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
KPAGE .EQU PDATA+224 ;UHW
OSCILLATE .EQU PDATA+240 ;UHW
SKPLYR .EQU PDATA+256 ;UHB PLAYER # TO PURSUE
;IBAT .EQU PDATA+264 ;UHB BAT FLAG 0=OFF, 1=ON
;HITCNT .EQU PDATA+272 ;UGB HIT CNT
CNTRXY .EQU PDATA+280 ;UHB
CIRCPTR .EQU PDATA+288 ;UHL
;
MAXLEVEL .EQU 12
;
HSPEED .EQU 08000H
.TEXT
;RBAT_PLYR:
;STOP HULK FROM MOVING
;DECIDE WHICH OF FOUR SWING ANGLES TO USE
;TELL MAIN LOGIC THIS HULK IS SWINGING
; RETS
; MOVE *A0(OPLINK),A0,L
; MOVB *A0(PNUM),A0
; MOVE *A8(OPLINK),A8,L
; MOVB A0,*A8(IBAT)
; RETS
;
;KILL_RBT:
;A8=RBT IMG PNTR, A0=KILLER IMG PNTR
; MMTM SP,A1,A10,A7
; MOVE A0,A10
;WILL BE BOGUS IF SOMETHING OTHER THAN A BULLET STRUCK HULK!
; MOVE *A8(OPLINK),A0,L
; MOVB *A0(HITCNT),A7
; CMPI 1,A7
; JRUC DIERBT
; JRZ DIERBT
; ADDK 1,A7
; MOVB A7,*A0(HITCNT)
;SPIN AWAY THEN RECOVER
; MOVI CLSNEUT,A0
; MOVE A0,*A8(OID)
; MOVI DMAWNZ|M_NOCOLL,A0
; MOVE A0,*A8(OFLAGS)
; MOVE *A8(OPLINK),A0,L
; MOVI RBT_HIT,A7
; CALLA XFERPROC
; MMFM SP,A10,A7
; RETS
;DIERBT
;RBT_HIT:
;ROBOT SPINS AWAY THEN RECOVERS!
; MOVE *A10(OID),A9,W ;KILLERS OID
; CMPI CLSPLYR|TYPPLBL|SUBSPEW,A9
; JREQ RBT_EXP ;GO TO REGULAR FIRE BOMB EXPLOSION
; CMPI CLSPLYR|TYPPLBL|SUBNOSTP,A9
; JREQ RBT_EXP ;GO TO REGULAR FIRE BOMB EXPLOSION
; MOVE *A10(OPLINK),A10,L
; MOVE *A10(BLTDIR),A10
;8 1 2
;7 3
;6 5 4
;A10 SHOULD BE 1-8!
; DEC A10
; ANDI 07,A10 ;IN CASE A BLADE STRUCK HULK
; SLL 5,A10
; MOVI RNGXL2,A0
; ADD A10,A0
; MOVE *A0,A0,L
; MOVE A0,A6 ;XVEL
; MOVI RNGYL2,A0
; ADD A10,A0
; MOVE *A0,A0,L
; MOVE A0,A7 ;YVEL
; CALLA NEWV
; MOVE @XVEL,A6,L
; MOVE @YVEL,A7,L
;SEND THIS ROBOT SPINNING BACK INTO A WALL
; MOVI RSPIN,A9
; MOVE A6,*A8(OXVEL),L
; MOVE A7,*A8(OYVEL),L
; MOVI RSPIN,A9
; MOVK 1,A1
; JSRP FRANIM
; MOVI CLSENMY|TYPRBTA,A0
; MOVE A0,*A8(OID)
; MOVI DMAWNZ,A0
; MOVE A0,*A8(OFLAGS)
; MOVE *A13(DIR),A0
; CALLA INTO
; SLEEP 1
; JRUC LUP_TOP
KILL_RBT:
;A8=RBT IMG PNTR, A0=KILLER IMG PNTR
MMTM SP,A1,A10,A7
MOVE A0,A10
MOVI CLSNEUT,A0
MOVE A0,*A8(OID)
MOVI DMAWNZ|M_NOCOLL,A0
MOVE A0,*A8(OFLAGS)
MOVE *A8(OPLINK),A0,L
MOVI RBT_EXP,A7
CLR A1
CALLA XFERPROC
MOVE *A8(OPLINK),A0,L
MOVE *A0(CIRCPTR),A0,L
JRZ FO
CALLA KILL
FO MOVE A8,A0
CALLA DELOBJ
MMFM SP,A1,A10,A7
RETS
RBT_EXP:
MOVE *A10(OID),A9,W ;KILLERS OID
MOVE *A10(OPLINK),A10,L
MOVI P1DATA,A2 ;PLAYER 1 SCORE SELECT
MOVB *A10(MYPLYR),A0 ;GET PLAYER #
CMPI 1,A0
JREQ CGA
CMPI 2,A0
JRNZ CGA2
MOVI P2DATA,A2
CGA
MOVI RBTAPT,A1 ;AMOUNT OF SCORE
CALLA SCRADD2 ;DO IT!
CGA2 MOVE @RBTA_CNT,A3 ;DELETE A BNCR FROM CNT
DEC A3
MOVE A3,@RBTA_CNT
MOVE *A10(BLTDIR),A10
MOVE @ROBTYP,A3
JRNZ BIGEXP2A
CMPI CLSPLYR|TYPPLBL|SUBLZR,A9
JREQ SHATR
CMPI CLSPLYR|TYPPLBL|SUBNOSTP,A9
JREQ SHATR
CMPI CLSPLYR|TYPPRSM,A9
JREQ SHATR
BIGEXP:
MOVI BOOMN,A9
BHJ
CLR A6
CLR A7
CALLA GETANIXY
ADDI 01A0000H,A2 ;A2=Y OFFSET
MOVE A2,A1
MOVE A3,A0
MOVI 141,A3 ;259
MOVI DMAWNZ|M_NOCOLL,A4 ;NON-ZERO VALUE
MOVI CLSNEUT|TYPNEUT,A5
MOVI EXPb1,A2
CALLA BEGINOBJ2
MOVI EXP1,A0
CALLA ONESND
BIGEXP2
MOVK 1,A1
JSRP FRANIM
MOVE A8,A0
CALLA DELOBJ
DIE
BIGEXP2A:
;BIGGER ROBOT
MOVI ZOOM4,A9
JRUC BHJ
SHATR
MOVB @PCNT,A2
ANDI 03,A2
JRZ BIGEXP
MOVB @PCTOT,A2
CMPI 030H,A2
JRHI BIGEXP
MOVI GLSEXP,A0
CALLA ONESND
;8 1 2
;7 3
;6 5 4
;A10 SHOULD BE 1-8!
DEC A10
ANDI 07,A10 ;IN CASE A BLADE STRUCK HULK
SLL 5,A10
MOVI RNGXL,A0
ADD A10,A0
MOVE *A0,A0,L
MOVE A0,A6 ;XVEL
MOVI RNGYL,A0
ADD A10,A0
MOVE *A0,A0,L
MOVE A0,A7 ;YVEL
MOVE A6,A9
MOVE A7,A10
JAUC ADDRPCS
SPWN_RBTA:
;SPAWN HULKS IS CALLED FROM 'WAVE OVERLORD' CODE WHICH DISPERSES
;BAD GUYS THROUGHOUT A WAVE
MOVE @RBTA_CNT,A2 ;MOVE BYTE (# HULKS ON SCRN) TO A2
MOVB @MAXRBTA,A3
CMP A3,A2 ;HULKS MAXED OUT?
JRGT HULK_OUT
MOVE @ROBTYP,A0
JRNZ GANG
MOVE @WAVE,A0
CMPI 3,A0
JRC H0
MOVI 60,A0
CALLA RANDPER
JRC GANG
;
H0 CREATE RBTAPID,ARBTA ;START ONE HULK
HULK_OUT:
RETS
GANG:
CLR B0
MOVK 4,B1
CALLA RANGRAND
;ANDI WAVE # AND CAUSE GANGS TO USE DIFFERENT DOORS!
MOVE A0,A1
SLL 5,A1
ADDI DRINF,A1
MOVE *A1,A1,L
MOVB *A1,A1 ;GET KP_LS ETC.
CMPI 1,A1
JRNE GT
;DOOR THIS GANG WANTS TO ORIGINATE IS CLOSING RIGHT NOW!
;SHIFT THIS GANG TO BOTTOM DOOR
MOVK 4,A0
GT MOVI 58,A1
PUSH A0
CALLA SET_GATE_2
PULL A0
DEC A0 ;DOOR TO GANG UP ON!
MOVE A0,A8
MOVI RBTA,A2
CALLA GET_WVADDR
MOVE *A0(16),A0 ;GET HULKS LEFT TO RELEASE THIS WAVE!
CMPI 16,A0 ;MIN HULKS BEFORE GANG
JRLT GH1 ;RELEASE ALL OF THEM!
MOVK 6,B0 ;11 ;# OF HULKS IN A GANG
MOVK 15,B1 ;18
CALLA RANGRAND
GH1:
ANDI 1FH,A0
PUSH A0
CREATE RBTAPID,GRBTA
PULL A0
DSJNE A0,GH1
RETS
;
O_RBTA:
;A2=# OF HULKS TO CREATE ON SCREEN
OH1 PUSH A2 ;CREATE A BUNCH OF THEM
CREATE RBTAPID,ORBTA
PULL A2
DSJNE A2,OH1
RETS
ORBTA:
;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
MOVI RBTA,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 (BEGINOBJ)
CALLA BEGINOBJ2
MOVI 3,A0 ;HULK STARTS FACING RIGHT
MOVE A0,*A13(DIR)
CALLR GET_P
CALLA SETUP_HULK ;INC CNT, SET DIR, SET DEATH FLAG, ETC
MOVI HSPEED,A1
CALLA DO_DIFF2
CALLR JUST_SK
CALLR GET_STAND ;HULK STANDS AND SPINS UNTIL A MATCH
;THIS GETS CORRECT OIMG, OFLAGS
;POSSIBLY SLEEP HERE??!?? TO ALLEVIATE OSCILLATE PROBLEM? AT BEGINNING.
MOVE A13,A10
CREATE RBTAPID,CIRCL
JRUC LUP_TOP
GXL: .LONG -090000H,01900000H,0B00000H,0B00000H
GXR: .LONG -010000H,019A0000H,0D80000H,0D80000H
GYT: .LONG 0690000H,0690000H,-2C0000H,00FF0000H ;6E0000!
GYB: .LONG 07F0000H,07F0000H,-180000H,01140000H
REALO:
SLEEP 2
MOVE *A8(OPLINK),A0,L
MOVE *A0(CIRCPTR),A0,L
JRZ F00
CALLA KILL
F00 MOVE A8,A0
CALLA DELOBJ
MOVE @RBTA_CNT,A3
DEC A3
MOVE A3,@RBTA_CNT
DIE
GRBTA:
;GHULK PUTS X # OF HULKS BEHIND A DOOR IN GANG FORMATION!
;A0=DOOR TO GANG UP ON
SLL 4,A8
MOVI 30,A1
MOVE A1,*A13(DIS)
MOVI SD,A1
ADD A8,A1
MOVE *A1,A1
MOVE A1,*A13(DIR)
SLL 1,A8
MOVI GXL,A1
ADD A8,A1
; MOVE *A1,A0,L ;GET X LEFT BOUNDARY
MOVE *A1,A2,L ;GET X LEFT BOUNDARY
MOVI GXR,A1
ADD A8,A1
MOVE *A1,A3,L ;GET X RIGHT SIDE BOUNDARY
MOVI GYT,A1
ADD A8,A1
; MOVE *A1,A1,L ;GET Y TOP
MOVE *A1,A4,L ;GET Y TOP
MOVI GYB,A1
ADD A8,A1
MOVE *A1,A5,L ;GET Y BOT
MOVE A2,B0
MOVE A3,B1
CALLA RANGRAND
MOVE A0,A6 ;A6 IS X
MOVE A4,B0
MOVE A5,B1
CALLA RANGRAND
MOVE A0,A1 ;A1 IS Y
MOVE A6,A0
CALLR IH1
CALLA BEGINOBJ
; CALLR GET_P
MOVI ORANGE,A0
CALLA GETFPAL ;GET A COLOR MAP ASSIGNMENT
MOVE A0,*A8(OPAL),W ;STORE THE NEW PALETTE
CALLA SETUP_HULK ;INC CNT, SET DIR, SET DEATH FLAG, ETC
CLR B0
MOVK 2,B0
MOVK 4,B1
CALLA RANGRAND
MOVE A0,*A13(LEVEL)
MOVI HSPEED,A1
CALLA DO_DIFF2
MOVE *A13(DIR),A0
CALLA INTO
CALLR GET_STAND
MOVE *A13(CFLAGS),A0 ;INDICATE GANG MEMBER FOR RUN IN
ORI 010H,A0
MOVE A0,*A13(CFLAGS)
SLEEP 2
MOVE A13,A10
CREATE RBTAPID,CIRCL2
JRUC LUP_TOP
ARBTA:
;YES A NEW HULK WILL APPEAR
;UPDATE WAVE_INFO RAM TABLE TO REFLECT THIS NEW ENTRY!
;THIS HULK WAS SPAWNED FROM 'WAVE OVERLORD' CODE
;
CALLA SETUP_HULK ;INC CNT, SET DIR, SET DEATH FLAG, ETC
CALLR INIT_HULK ;INITIAL HULK PARAMS (BEGINOBJ)
JRNC OKZ
;CARRY SET MEANS THIS GUY WILL DIE BECAUSE HE WAS GOING TO COME
;OUT CLOSED DOOR
DIE
GET_P
MOVB @PCNT,A0
ANDI 03H,A0
SLL 5,A0
ADDI RPALS,A0
MOVE *A0,A0,L
;CHANGE HIS PAL
CALLA GETFPAL ;GET A COLOR MAP ASSIGNMENT
MOVE A0,*A8(OPAL),W ;STORE THE NEW PALETTE
RETS
RPALS .LONG GREEN,WHITE,YBG,GREEN
OKZ
CALLR GET_P
MOVI HSPEED,A1
CALLA DO_DIFF2
MOVE *A13(CFLAGS),A0
ORI 02H,A0
MOVE A0,*A13(CFLAGS) ;FROM DOORWAY!
BTST 2,A0 ;CHECK FOR PAUSE DELAY BEHIND DOOR
JRNZ LR
MOVE *A13(DIR),A0
CALLA INTO
LR
CALLR GET_STAND ;GET FIRST FRANIM PNTR FOR
;THIS HULKS DIRECTION
MOVE A13,A10
CREATE RBTAPID,CIRCL
;
; LOOP TOP FOR HULKS
;
LUP_TOP:
;TOP OF HULK LOGIC
MOVE @HALT,A0
JRNZ CONT1
; MOVB *A13(IBAT),A0
; JRZ LP5
;A0=PLAYER 1 OR 2
;THIS HULK IS BATTING
;START BAT SWING
; CLR A1
; MOVE A1,*A8(OXVEL),L
; MOVE A1,*A8(OYVEL),L
; DEC A0
; SLL 5,A0
; ADDI PLYROBJS,A0
; MOVE *A0,A0,L
; MOVE *A0(OYPOS),A2 ;A2=Y OF PLYR I HIT
; MOVE *A0(OXPOS),A1 ;A1=X
; MOVE *A8(OYPOS),A3 ;A3=THIS HULKS' Y
; MOVE *A8(OXPOS),A4 ;A4=THIS HULKS' X
; CMP A3,A2
; JRC SUP ;BR=BAT UPWARD
; CMP A4,A1
; JRC B8O ;BR=8 O'CLOCK SWING NEEDED
;4 O'CLOCK
; MOVK 5,A10
;UI MOVI BAT4O,A9
; MOVK 1,A1
; JSRP FRANIM
; DSJS A10,UI
; JRUC BATDN
;B8O
;8
; MOVI BAT8O,A9
; MOVK 1,A1
; JSRP FRANIM
; MOVI BAT8O,A9
; MOVK 1,A1
; JSRP FRANIM
; JRUC BATDN
;SUP CMP A4,A1
; JRC B10O
;2 O'CLOCK
; MOVI BAT2O,A9
; MOVK 1,A1
; JSRP FRANIM
; MOVI BAT2O,A9
; MOVK 1,A1
; JSRP FRANIM
; JRUC BATDN
;B10O
; MOVI BAT10O,A9
; MOVK 1,A1
; JSRP FRANIM
; MOVI BAT10O,A9
; MOVK 1,A1
; JSRP FRANIM
;BATDN CLR A0
; MOVB A0,*A13(IBAT)
; MOVE *A13(DIR),A0
; CALLA INTO
; SLEEP 1
; JRUC LUP_TOP
;LP5
MOVE *A13(CFLAGS),A0
BTST 2,A0
JREQ DOLOGIC
MOVE @RBTA_DN,A1
JRNE REALO
BTST 3,A0
JRZ DOHULK
;END OF WAVE
;CHECK TO SEE IF DOOR IS IN PROCESS OF CLOSING
;IF SO, DELAY INTO CODE!
ANDI 0FFF3H,A0
MOVE A0,*A13(CFLAGS)
MOVE *A13(DIR),A0
CALLA INTO
;
; DO HULK MOVEMENT LOGIC A8=CURRENT OBJECT POINTER (HULK IMAGE)
;
DOLOGIC:
MOVE @EHALT,A0
JRZ MV ;BR=HALT ALL HULKS!!
;PLAYER IS WALKING INTO ARENA
;MAKE HULK FACE PLAYER AS HE ENTERS
;PUT HULKS INTO STAND MODE
CLR A1
NOT A1
MOVI BUYINPID,A0
CALLA EXISTP
JRNZ DONE_SPIN
CLR A0
MOVE A0,*A8(OXVEL),L
MOVE A0,*A8(OYVEL),L
MOVE *A13(CFLAGS),A0
ORI 01H,A0
MOVE A0,*A13(CFLAGS),W ;SET STAND MODE FOR THIS HULK
MOVE *A13(SK_DIR),A1
MOVE *A13(DIR),A0,W
CMP A0,A1
JREQ DONE ;BR=ALREADY FACING IN CORRECT DIR
CALLR WAY
DONE_SPIN:
SLEEP 2
JRUC LUP_TOP
DONE:
;GET NEW SEEK DIR
;IGNORE (DIS) TIMER AND GET NEW SEEK DIR RIGHT AWAY!
CALLA SETUP_DIR
MOVI HSPEED,A1
CALLA DO_DIFF2
JRUC DONE_SPIN
MV:
;FIRST, DO AGE/LEVEL UPDATE
MOVE *A13(HAGE),A0
ANDI 03FFH,A0
DEC A0
MOVE A0,*A13(HAGE)
JRNZ C7
MOVE *A13(LEVEL),A0
CMPI MAXLEVEL,A0
JREQ C7
INC A0
MOVE A0,*A13(LEVEL)
; CMPI 4,A0
; JRNE MVB
; MOVI GRNTP,A0
; CALLA GETFPAL ;GET A COLOR MAP ASSIGNMENT
; MOVE A0,*A8(OPAL),W ;STORE THE NEW PALETTE
;MVB
MOVI HSPEED,A1
CALLA DO_DIFF2
MOVE *A13(KPAGE),A0
MOVE A0,*A13(HAGE)
C7: MOVE *A13(CFLAGS),A0
BTST 0,A0
JRZ NOSPN
; THIS HULK IS SPINNING, DO SPIN
MOVE *A13(SK_DIR),A1
MOVE *A13(DIR),A0,W
CMP A0,A1
JRNE CONT
; HULK HAS SPUN TO CORRECT DIR, NOW START HIM WALKING AGAIN
; SET DIS CNTR ALSO
; CHECK TO MAKE THIS DIR IS STILL HEADING TOWARD PLAYER!
; IF SO, START RUN WITH CORRECT VELOCITY STUFFED TO COLLIDE WITH PLAYER
; IF NOT, SPIN SOME MORE!
; IF NEW SEEK IS <> OLD SEEK, THEN SET STAND FLAG
MOVE *A13(CFLAGS),A0
BTST 1,A0 ;REGULAR HULK RUN IN FLAG
JRZ R0
; HULK HAS RUN IN, NOW ANGLE HIM OFF RANDOMLY
MOVK 15,A0
MOVE A0,*A13(DIS)
MOVE *A13(CFLAGS),A0
ANDI 0FFFDH,A0
MOVE A0,*A13(CFLAGS)
JRUC GOODNEWS
R0 PUSH A1
CALLA JUST_SK ;WILL STUFF NEW VEL
PULL A1
MOVE *A13(SK_DIR),A0
CMP A0,A1 ;NEW CMP OLD SEEK
JREQ GOODNEWS
;HULK SPUN TO CORRECT DIR THEN CHECKED AGAIN AND THE PLAYER HAD MOVED
MOVE *A13(OSCILLATE),A0
JRNZ GNW
MOVK 1,A0
MOVE A0,*A13(OSCILLATE)
;SET HULK SPIN FLAG AGAIN BECAUSE PLAYER MOVED!
MOVE *A13(CFLAGS),A0
ORI 01H,A0
MOVE A0,*A13(CFLAGS),W
SLEEP 1
JRUC LUP_TOP
GNW MOVK 6,A0
MOVE A0,*A13(DIS)
GOODNEWS:
CLR A0
MOVE A0,*A13(OSCILLATE)
CALLR GET_STAND ;ZEROS STAND FLAG ALSO
SLEEP 1
JRUC LUP_TOP
CONT:
CALLR WAY ;WHICH WAY TO SPIN/THEN ANI STAND VW
CONT1: SLEEP 3
JRUC LUP_TOP
NOSPN: MOVE *A13(DIS),A0 ;UPDATE DISTANCE COUNT
DEC A0
MOVE A0,*A13(DIS) ;STUFF NEW COUNT
JRNZ DOHULK ;BR=CONTINUE CURRENT DIRECTION
MOVE *A13(CFLAGS),A0
BTST 4,A0
JRZ NGNG ;BR=NOT A GANG MEMBER
;GANG MEMBER WHO WANTS TO TURN TOWARD PLAYER
;HE MUST WAIT TILL HE IS ON SCREEN!
MOVE *A8(OYVAL),A5,L
MOVE *A8(OXVAL),A4,L
MOVE @PLYRPRCS,A7,L
JRNZ TOK
;GET BND FROM OTHER PLAYER
MOVE @PLYRPRCS+32,A7,L
TOK MOVE *A7(LFTBND),A0,L
CMP A0,A4
JRLO BAD
MOVE *A7(RGTBND),A0,L
CMP A0,A4
JRHI BAD
MOVE *A7(UPBND),A0,L
CMP A0,A5
JRLO BAD
MOVE *A7(DNBND),A0,L
CMP A0,A5
JRLO OK
BAD MOVK 5,A0
MOVE A0,*A13(DIS) ;STUFF NEW COUNT
JRUC DOHULK ;BR=CONTINUE CURRENT DIRECTION
OK MOVE *A13(CFLAGS),A0
ANDI 0FFEFH,A0
MOVE A0,*A13(CFLAGS)
JRUC T3
NGNG MOVE *A13(CFLAGS),A0
BTST 1,A0
JRZ T3
;THIS HULK JUST RUNNING IN! GIVE THIS ONE A BOGUS SEEK DIR
;IF WITHIN WALLS THEN CONT, OTHERWISE RESET DIS CNTR
MOVE *A13(DIR),A3
DEC A3
SLL 5,A3
ADDI NEWANG,A3
MOVK 1,B0
MOVK 4,B1
CALLA RANGRAND
MOVE *A3,A3,L
DEC A0
SLL 4,A0
ADD A0,A3
MOVE *A3,A0 ;NEW SEEK DIR
MOVE A0,*A13(SK_DIR)
CALLA INTO
JRUC T4
NEWANG: .LONG ANG1,0,ANG3,0,ANG5,0,ANG7
ANG5: .WORD 7,6,4,3
ANG1: .WORD 7,3,8,2
ANG3: .WORD 1,5,2,4
ANG7: .WORD 8,6,1,5
;
;NOW POINT THIS HULK AT CURRENT POSITION OF PLAYER
T3: MOVE *A13(SK_DIR),A7,W
;IF NEW SEEK IS <> OLD SEEK, THEN SET STAND FLAG
CALLA JUST_SK ;WILL STUFF NEW VEL
MOVE *A13(SK_DIR),A0
CMP A0,A7 ;NEW CMP OLD SEEK
JREQ DOHULK
T4: MOVE *A13(CFLAGS),A0 ;SAYS I AM SPINNING
ORI 01H,A0
MOVE A0,*A13(CFLAGS),W
MOVK 2,A0
MOVE A0,*A13(OSCILLATE)
SLEEP 3
JRUC LUP_TOP
DOHULK:
; CLR A1
; JSRP FRANIM
; JRNC CHECK_NEXT ;BR=NOT AT END OF SCRIPT YET
; CALLR GET_STAND
;CHECK_NEXT:
MOVE *A13(LEVEL),A0
SLL 3,A0
ADDI SPTBL,A0
MOVB *A0,A0
CALLA PRCSLP
JRUC LUP_TOP
CIRCL
MOVE A13,*A10(CIRCPTR),L
CRC1
SLEEP 3
MOVB *A10(CNTRXY),A0
INC A0
MOVB A0,*A10(CNTRXY)
CMPI 24,A0
JRC GO0
CLR A0
MOVB A0,*A10(CNTRXY)
GO0
SLL 5,A0
MOVI ADX2,A1
ADD A0,A1
MOVE *A1,A1,L
ADDI ADY2,A0
MOVE *A0,A0,L
MOVE *A8(OYVAL),A2,L
ADD A0,A2
MOVE A2,*A8(OYVAL),L
MOVE *A8(OXVAL),A2,L
ADD A1,A2
MOVE A2,*A8(OXVAL),L
JRUC CRC1
CIRCL2
MOVE A13,*A10(CIRCPTR),L
CRC2
SLEEP 2
MOVB *A10(CNTRXY),A0
INC A0
MOVB A0,*A10(CNTRXY)
CMPI 24,A0
JRC GO0
CLR A0
MOVB A0,*A10(CNTRXY)
GO1
SLL 5,A0
MOVI ADX2,A1
ADD A0,A1
MOVE *A1,A1,L
ADDI ADY2,A0
MOVE *A0,A0,L
MOVE *A8(OYVAL),A2,L
ADD A0,A2
MOVE A2,*A8(OYVAL),L
MOVE *A8(OXVAL),A2,L
ADD A1,A2
MOVE A2,*A8(OXVAL),L
JRUC CRC2
ADX
.LONG 10000H,8000H,8000H,8000H,8000H,4000H,0,-4000H,-8000H
.LONG -8000H,-8000H,-8000H,-10000H,-10000H,-8000H,-8000H,-8000H
.LONG -4000H,0,4000H,8000H,8000H,8000H,8000H
ADY
.LONG 0,4000H,4000H,4000H,4000H,8000H,10000H,8000H,4000H,4000H
.LONG 4000H,4000H,0,-4000H,-4000H,-4000H,-4000H,-8000H,-10000H
.LONG -8000H,-4000H,-4000H,-4000H,-4000H
ADX2
.LONG 20000H,18000H,18000H,18000H,18000H,0C000H,0,-0C000H,-18000H
.LONG -18000H,-18000H,-18000H,-20000H,-20000H,-18000H,-18000H,-18000H
.LONG -0C000H,0,0C000H,18000H,18000H,18000H,18000H
ADY2
.LONG 0,0C000H,0C000H,0C000H,0C000H,18000H,20000H,18000H,0C000H,0C000H
.LONG 0C000H,0C000H,0,-0C000H,-0C000H,-0C000H,-0C000H,-18000H,-20000H
.LONG -18000H,-0C000H,-0C000H,-0C000H,-0C000H
SPTBL .BYTE 5,5,5,5,4,4,4,4,4,3,3,3,3,3,2,2,2
.EVEN
;
SETUP_HULK:
;DIR IS BASED ON WHAT DOOR HE IS ENTERING THROUGH!
;IF THIS IS AN ONSCREEN HULK, THEN ANY DIR IS OKAY!
;
MOVK 5,A0 ;1
MOVE A0,*A13(SK_DIR)
CLR A0
MOVE A0,*A13(CFLAGS)
MOVE A0,*A13(CIRCPTR),L
; MOVB A0,*A13(IBAT) ;NO BATTING AT START!
MOVB A0,*A13(CNTRXY) ;NO BATTING AT START!
; MOVB A0,*A13(HITCNT) ;NO BATTING AT START!
MOVB @INDEX,A0
INC A0
MOVB A0,@INDEX
ANDI 0FH,A0
MOVB A0,*A13(CNTRXY) ;NO BATTING AT START!
MOVI 0,B0
MOVK 20,B1
CALLA RANGRAND ;TIE THIS IN WITH DIFFICULTY!
BTST 0,A0
JRZ O0
MOVB A0,*A13(CNTRXY) ;NO BATTING AT START!
O0 SLL 4,A0
ADDI AGTBL,A0
MOVE *A0,A0
SLL 1,A0 ;TAKE OUT! MODIFY TABLE
MOVE A0,*A13(HAGE)
MOVE A0,*A13(KPAGE)
;
; UPDATE HULK COUNT
;
MOVE @RBTA_CNT,A0
INC A0
MOVE A0,@RBTA_CNT
;CHOOSE PLAYER TO SEEK
ANDI 01,A0
MOVB A0,*A13(SKPLYR)
MOVE A0,A1
SLL 5,A1
ADDI PLYROBJS,A1
MOVE *A1,A1,L
MOVE *A1(OXPOS),A1
JRNZ ZY ;BR=OKAY TO SEEK THIS PLAYER
;PLAYER I AM SEEKING IS IN DIE MODE
XORI 1,A0
MOVB A0,*A13(SKPLYR)
ZY
MOVI RBTA,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 HULK
ANDI 03FFH,A1
DEC A1
MOVE A1,*A0(16),W
JRNZ BZ
;END OF THIS WAVES HULK CNT
MOVK 1,A1
MOVE A1,@RBTA_DN
CREATE 0,DEXIT
BZ
RETS
;
JUST_SK:
CALLR GET_DIS
CALLA SETUP_DIR
RETS
LEVTBL:
.WORD 11,10,9,8,7,7,6,6,5,5,4,4,3,3,3,3
AGTBL: .WORD 80,150,90,110,140,210,250,50,70,125,45,80
.WORD 80,150,90,110,140,210,250,50,70,125,45,80
;
GET_DIS:
MOVK 1,B0
MOVE *A13(LEVEL),A0
SLL 4,A0
ADDI LEVTBL,A0
MOVE *A0,A2
MOVE A2,B1
CALLA RANGRAND
MOVE A0,*A13(DIS) ;TIME BEFORE WE GET NEW VELOCITIES
RETS
WAY:
;A1=SEEK DIR
;A0=DIR IMAGE IS FACING NOW
SUB A0,A1
MOVE A1,A2
ABS A1
CMPI 5,A1
JRLT N0
NEG A2
N0: BTST 31,A2
JRZ IC
DEC A0
JRP T1
MOVK 8,A0
JRUC T1
IC: INC A0 ;ROTATE TOWARD PLAYER
CMPI 9,A0
JRNE T1
MOVK 1,A0
T1: MOVE A0,*A13(DIR),W
CALLA GET_STAND ;DOES ANI OF CORRECT VIEW
RETS
SWAPSK
;SEEK ANOTHER PLAYER ROUTINE
;A10=0 OR 1 FOR WHICH PLAYER DIED
CLR A1
NOT A1
MOVI RBTAPID,A0
CALLA EXISTP
JRZ OUTZ
;FOUND HULK
MOVB *A0(SKPLYR),A1
CMP A1,A10
JRZ YES
MOVI TP2PID,A1
MOVE A1,*A0(PROCID),W
JRUC SWAPSK
YES MOVI TEMPPID,A1
MOVI SWAPIT,A7
CALLA GETA8
CALLA GETA9
CALLA XFERPROC
JRUC SWAPSK
OUTZ
CLR A1
NOT A1
MOVI TP2PID,A0
CALLA EXISTP
JRZ OUTB
;FOUND TEMP HULK
MOVI RBTAPID,A1
MOVE A1,*A0(PROCID),W
JRUC OUTZ
OUTB RETS
SWAPIT
;HULKS FALL INTO HERE IF PLAYER THEY WERE SEEKING HAS DIED. THEY WILL
;NOW SEEK OTHER PLAYER
MOVI RBTAPID,A0
MOVE A0,*A13(PROCID),W
MOVB *A13(SKPLYR),A2
XORI 1,A2
MOVE A2,A1
SLL 5,A1
ADDI PLYROBJS,A1
MOVE *A1,A1,L
JRZ ZCT ;BR=OTHER PLAYER DOES NOT EXIST!
MOVB A2,*A13(SKPLYR)
ZCT
SLEEP 1
JAUC LUP_TOP
GET_STAND:
;ANI ONTO SCREEN THIS HULKS STANDING POSITION
;
MOVE *A13(DIR),A0 ;CURRENT DIR HULK IS FACING
DEC A0
MOVE A0,A2
SLL 5,A0
MOVE @ROBTYP,A1
JRZ ZA
ADDI SPINFRMS2,A0
JRUC ZA2
ZA ADDI SPINFRMS,A0
ZA2 MOVE *A0,A1,L ;NEW OIMG
SLL 4,A2
ADDI SPINFLGS,A2
MOVE *A2,A4,W ;NEW OFLAGS
CALLA ANI
RETS
SX: .LONG -0F0000H,019F0000H,0BE0000H,0BE0000H
SY: .LONG 0630000H,0630000H,-290000H,0FF0000H
;SX: .LONG -080000H,01980000H,0AD0000H,0AD0000H
;SY: .LONG 05D0000H,05D0000H,-220000H,0F80000H
SOX: .LONG 0,0,0100000H,0100000H
SOY: .LONG 0100000H,0100000H,0,0
SD: .WORD 3,7,5,1
INIT_HULK:
;INITIAL HULK POSITION,IMAGE SHAPE,AGE ETC....
;DO STFOBF AND GET A0 PNTR
;
CALLA GET_VALID_DOOR
INC A0
MOVE A0,@TMP
; MOVI 0,B0
; 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
; MOVI 4,A0 ;DOOR 4
;G MOVE A0,@TMP
; DEC A0
; MOVE A0,A2
MOVI SD,A1
SLL 4,A2
ADD A2,A1
MOVE *A1,A1
MOVE A1,*A13(DIR)
MOVI SOX,A1 ;OFFSETS
SLL 1,A2
ADD A2,A1
MOVE *A1,A8,L ;XOFFSET FOR EACH NEW SPACE
MOVI SOY,A1
ADD A2,A1
MOVE *A1,A9,L ;YOFFSET
MOVI SX,A1
ADD A2,A1
MOVE *A1,A0,L
MOVI SY,A1
ADD A2,A1
MOVE *A1,A1,L
ADDI INFOTBL,A2
MOVE *A2,A3,L
MOVE *A3,A4,L ;CORRECT PNTR1 FOR DOOR INFO
JRNE SPC1 ;FIRST SPACE FOR THIS DOOR IS OPEN
AS MOVE A13,*A3,L
MOVE *A13(CFLAGS),A4
ORI 04H,A0
MOVE A0,*A13(CFLAGS)
JRUC STUFFED
SPC1 ADDI 32,A3
ADD A9,A1
ADD A8,A0
MOVE *A3,A4,L
JREQ AS
;3RD SPACE AVAILABLE
MOVE @TMP,A2
CMPI 4,A2
JREQ OV
DEC A2
SLL 5,A2
ADDI DRINF,A2
MOVE *A2,A2,L
MOVB *A2,A2 ;GET KP_LS RS
; .IF DEBUG
CMPI 1,A2
JRNE OV
;DOOR THESE GUYS WANT TO COME OUT OF IS CLOSING
;SEND THEM TO BOTTOM DOOR!
; JRUC $
SETC
RETS
OV
CALLA NEW_OV
;OV
; ADD A9,A1
; ADD A8,A0
; SUBI 32,A3
; CLR A6
; MOVK 2,A5
;SPCFULL:
; MOVE *A3,A2,L
; MOVE A6,*A3,L
; MOVE *A2(CFLAGS),A4
; ORI 08H,A4 ;PAUSE FLAG FOR BEHIND DOORS
; MOVE A4,*A2(CFLAGS)
; ADDI 32,A3
; DSJS A5,SPCFULL
; MMTM SP,A0,A1
; MOVE @TMP,A0
; MOVI >17,A1
; CALLA SET_GATE_2
; MMFM SP,A0,A1
STUFFED:
MOVI 38,A3
MOVE A3,*A13(DIS) ;CHANGE BASED ON HULKS SPEED?
CALLR IH1
CALLA BEGINOBJ
CLRC ;INDICATES GOOD HULK
RETS
IH1: ;ENTER HERE IF ON SCRN HULK
MOVI BRGN6,A2 ;DOES NOT MATTER
MOVI 159,A3
MOVI DMAWNZ+M_FLIPH,A4 ;NON-ZERO VALUE
MOVI CLSENMY|TYPRBTA,A5
CLR A6
CLR A7
RETS
KILL_R1
;A8=HULK IMAGE TO SMART BOMB
;A9=P1DATA OR P2DATA FOR SCORE UPDATE
;ENTER HERE WITH SMART BOMB
CREATE 0,HSMRT ;BULLETS DIR WILL BE IN A10
;HULK_EXP WHEN IT WAKES UP
MOVI CLSNEUT|TYPNEUT,A0
MOVE A0,*A8(OID)
MOVE *A8(OPLINK),A0,L
PUSH A0
MOVE *A0(CIRCPTR),A0,L
JRZ F001
CALLA KILL
F001
PULL A0
CALLA KILL ;KILLS PROCESS IN A0
CLR A0
MOVE A0,*A8(OXVEL),L
MOVE A0,*A8(OYVEL),L
RETS
HSMRT
MOVE @RBTA_CNT,A3 ;DELETE A BNCR FROM CNT
DEC A3
MOVE A3,@RBTA_CNT
MOVE A9,A2
;A2=P1DATA OR P2DATA
MOVI RBTAPT,A1 ;AMOUNT OF SCORE
CALLA SCRADD2 ;DO IT!
MOVI BOOM3,A9
MOVE *A8(OYPOS),A0
ADDI 01AH,A0 ;A2=Y OFFSET
MOVE A0,*A8(OYPOS)
JRUC BIGEXP2
RNGXL:
.LONG 0,018C00H,018C00H,018C00H,0,-18C00H,-18C00H,-18C00H
RNGYL:
.LONG -018000H,-018000H,0,018000H,018000H,018000H,0,-018000H
RNGXL2:
.LONG 0,05C00H,05C00H,05C00H,0,-5C00H,-5C00H,-5C00H
RNGYL2:
.LONG -05000H,-05000H,0,05000H,05000H,05000H,0,-05000H
;
;8 1 2
;7 3
;6 5 4
;
;HULK ANIMATIONS TABLE 2
;
SPINFRMS:
.LONG BRGN12,BRGN10,BRGN9,BRGN8,BRGN6,BRGN8,BRGN9,BRGN10
SPINFRMS2:
.LONG RB12D,RB10D,RB9C,RB8D,RB6D,RB8D,RB9C,RB10D
;SPINFLGS:
; .WORD DMAWNZ,DMAWNZ+M_FLIPH,DMAWNZ+M_FLIPH,DMAWNZ+M_FLIPH,DMAWNZ
; .WORD DMAWNZ,DMAWNZ,DMAWNZ
;SPINFLGS:
; .WORD DMAWNZ,DMAWNZ+M_FLIPH,DMAWNZ+M_FLIPH,DMAWNZ+M_FLIPH,DMAWNZ
; .WORD DMAWNZ,DMAWNZ,DMAWNZ
.END