smashtv/FATMAN.ASM

982 lines
18 KiB
NASM
Raw Permalink Normal View History

2021-04-06 15:09:56 -07:00
.FILE 'FATMAN.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 EXTERNAL
;
.REF EXP3HI,EXP1,GDTH1,UGH2,UGH3
;
;SYMBOLS EXTERNALLY DEFINED
;
.REF GET_VALID_DOOR,SPINFLGS,FRANIM_DIE
.REF BEGINOBJ2,BEGINOBJ,RANGRAND,FRANIM,INTO,BIG2,FATHITS
.REF P1DATA,SCRADD2,GET_WVADDR,DO_DIFF2,RANDPER,SHAKER,SHK_ON
.REF GAMSTATE,WAVEYX,P2DATA
.REF KEEPXY,RAMXY,WAVE_RAM,HALT,EHALT
.REF GETANIXY,PLYROBJS,FLASHME
.REF SET_GATE_2,DRINF
.REF WAVE,CVRT2,GETFPAL
.REF BOOM3
.REF FROMDR,PCNT
.REF INFOTBL,GETADIR2,XYSKOBJ,BULL_TOP,MEBNCS
.REF ADPCS2,PCTOT
;
;SYMBOLS DEFINED IN THIS FILE
;
.DEF SPAWN_FAT,ONSCRN_FAT,MAXFAT,FAT_CNT,MAXFAT,GETUGH
.DEF KILL_F1,PUSH_FT,KILL_F2,YKIL_FT,KILL_F2_NO
;
;UNINITIALIZED RAM DEFINITIONS
;
.BSS SCNTR,8
.BSS MAXFAT,8 ;MAX NUMBER OF FAT ALLOWED ON SCRN
.BSS FAT_CNT,16 ;TOTAL FAT ON SCREEN
.BSS TMP,16
; .BSS FAT_DN,16
;
;EQUATES FOR THIS FILE
;
;FAT DATA STRUCTURE
;
;DELYDT .EQU PDATA ;UHB-OBJECT AGE
INDEX .EQU PDATA+8 ;UHB-INDEX 0,1,2,3,4
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
ABSRB .EQU PDATA+224 ;UHB
;
;TANK/SHRAPNEL BULLET DATA STRUCTURE
;
BNCS .EQU PDATA ;UHB
LAST .EQU PDATA+8 ;UHB
FDLY .EQU PDATA+16 ;UHB ;FRANIM DELAY
;
HSPEED .EQU 08000H
;MAXHIT .EQU 10
.TEXT
SPAWN_FAT:
;SPAWN FAT IS CALLED FROM 'WAVE OVERLORD' CODE WHICH DISPERSES
;BAD GUYS THROUGHOUT A WAVE
MOVE @FAT_CNT,A2 ;MOVE BYTE (# FAT ON SCRN) TO A2
MOVB @MAXFAT,A3
CMP A3,A2 ;FAT MAXED OUT?
JRGT FAT_OUT ;
MOVE @HALT,A0
JRNZ FAT_OUT
CREATE FATPID,AFAT ;START ONE FAT
FAT_OUT:
RETS
ONSCRN_FAT:
;A2=# OF FATMEN TO CREATE ON SCREEN
MOVE A2,A10
OH1 PUSH A10 ;CREATE A BUNCH OF THEM
CREATE FATPID,OFAT
PULL A10
DSJS A10,OH1
RETS
OFAT:
;OFAT IS CALLED AT THE START OF A WAVE TO PLACE X # OF FAT ON SCREEN
;AT THE BEGINNING OF A WAVE
DEC A10 ;INDEX 0,1,2,3,4
MOVB A10,*A13(INDEX)
; MOVK 1,A0
; MOVE A0,*A13(DIR)
SLL 5,A10
MOVI DIRTBL,A0
ADD A10,A0
MOVE *A0,A0
MOVE A0,*A13(DIR)
ADDI CRNRYX,A10
MOVE *A10,A0,L
MOVE A0,A1
SLL 16,A0 ;A0=X
ANDI 0FFFF0000H,A1 ;A1=Y
;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.
CALLR IH1 ;INIT FAT (BEGINOBJ)
CALLA BEGINOBJ2
MOVE *A8(OPAL),A0,L
ANDI 0FFFFH,A0
MOVE A0,*A8(OPAL),L
CALLR SETUP_FAT ;INC CNT, SET DIR, SET DEATH FLAG, ETC
MOVI HSPEED,A1 ;FAT SPEED
CALLA DO_DIFF2 ;SET UP HIS RAM SPEED AREA
CALLR GET_DIS ;SET DISTANCE CNT FOR THIS DIR
CALLR GET_STAND ;FAT STANDS AND SPINS UNTIL A MATCH
;THIS GETS CORRECT OIMG, OFLAGS
MOVE @WAVE,A0
CMPI 8,A0
JRLO APAA
;CHANGE TO PURPLE PAL
MOVI BP,A0
CALLA GETFPAL ;GET A COLOR MAP ASSIGNMENT
MOVE A0,*A8(OPAL),W ;STORE THE NEW PALETTE
APAA
JRUC LUP_TOP
AFAT:
;YES A NEW FAT WILL APPEAR
;UPDATE WAVE_INFO RAM TABLE TO REFLECT THIS NEW ENTRY!
;THIS FAT WAS SPAWNED FROM 'WAVE OVERLORD' CODE
;
CALLR INIT_FAT ;INITIAL FAT PARAMS (BEGINOBJ)
CALLR SETUP_FAT ;INC CNT, SET DIR, SET DEATH FLAG, ETC
MOVI HSPEED,A1
CALLA DO_DIFF2
MOVE *A13(DIR),A0
CALLA INTO
CALLR GET_RUN ;GET FIRST FRANIM PNTR FOR
;THIS FAT DIRECTION
MOVK 3,A0 ;FAT WILL SPIN TO SK_DIR
MOVE A0,*A13(CFLAGS)
MOVE @WAVE,A0
CMPI 7,A0
JRLO APA
;CHANGE TO PURPLE PAL
MOVI BP,A0
CALLA GETFPAL ;GET A COLOR MAP ASSIGNMENT
MOVE A0,*A8(OPAL),W ;STORE THE NEW PALETTE
APA
;
;
; LOOP TOP FOR FATMAN
;
LUP_TOP:
;TOP OF FAT LOGIC
MOVE @HALT,A0
JRNZ GOTOP0
MOVE @EHALT,A0
JRZ MV ;BR=HALT ALL FAT!!
;PLAYER IS WALKING INTO ARENA
CLR A0
MOVE A0,*A8(OXVEL),L
MOVE A0,*A8(OYVEL),L
SLEEP 2
JRUC LUP_TOP
MV:
MOVE *A13(CFLAGS),A0
BTST 0,A0
JRZ NOSPN
;THIS FAT MAN IS SPINNING, DO SPIN
MOVE *A13(SK_DIR),A1
MOVE *A13(DIR),A0,W
CALLR WAY
MOVE *A13(SK_DIR),A1
MOVE *A13(DIR),A0,W
CMP A0,A1
JREQ GOODNEWS
;ANI IN NEW STAND/SPIN DIR
; CALLA GET_STAND
GOTOP SLEEP 5
JRUC LUP_TOP
GOTOP0 SLEEP 5
MOVK 15,A0 ;5
MOVE A0,*A13(DIS)
JRUC LUP_TOP
SHKX .BYTE 01,-2,0,1,-1,-1,1,-1,1,1,-1
SHKY .BYTE -1,1,2,-1,1,-1,-2,1,0,-2,2
.EVEN
GOODNEWS:
MOVE *A13(DIS),A0
JRNZ GD2
;THIS GUY TO EXPLODE
SLEEP 40 ;SHAKE A BIT!
MOVK 10,A9
LPS MOVE A9,A0
SLL 3,A0
MOVI SHKX,A1
ADD A0,A1
MOVB *A1,A1
ADDI SHKY,A0
MOVB *A0,A0
MOVE *A8(OXPOS),A2,W
ADD A1,A2
MOVE A2,*A8(OXPOS),W
MOVE *A8(OYPOS),A2,W
ADD A0,A2
MOVE A2,*A8(OYPOS),W
SLEEP 2
DSJS A9,LPS
MOVE *A13(DIR),A9
CLR A10
CREATE 0,SHRAPNL
MOVK 1,A10
CREATE 0,SHRAPNL
MOVK 2,A10
CREATE 0,SHRAPNL
MOVK 3,A10
CREATE 0,SHRAPNL
MOVK 4,A10
CREATE 0,SHRAPNL
CREATE 0,FAT_EXP ;BULLETS DIR WILL BE IN A10
;FAT_EXP WHEN IT WAKES UP
MOVE A13,A0
CALLA KILL ;KILLS PROCESS IN A0
MOVE A8,A0
CALLA DELOBJ
DIE
YKIL_FT MMTM SP,A1,A2,A7,A9
;KILL FATGUY! WITH BULLETS
MOVB @PCTOT,A2
CMPI 019H,A2
JRGE FE0
;HAVE ROOM FOR PIECES
PUSH A0
CREATE 0,ADPCS2
PULL A0
FE0
MMFM SP,A1,A2,A7,A9
JRUC KILL_F1
PUSH_FT
;A8=FAT IMG PNTR, A0=KILLER IMG PNTR
MMTM SP,A1,A2,A7,A9
MOVE *A8(OPLINK),A1,L
MOVB *A1(ABSRB),A2
INC A2
MOVB A2,*A1(ABSRB)
MOVE @FATHITS,A7
CMP A7,A2
JRNE PFT
MOVB @PCTOT,A2
CMPI 019H,A2
JRGE FE
;HAVE ROOM FOR PIECES
PUSH A0
CREATE 0,ADPCS2
PULL A0
FE
MMFM SP,A1,A2,A7,A9
JRUC KILL_F1
GETUGH
MOVI UGH2,A0 ;SQUEAL!
MOVB @PCNT,A1
ANDI 1,A1
JRZ YAG
MOVI UGH3,A0 ;OOF
YAG
CALLA ONESND
RETS
PFT
;FLASH THIS GUY
PUSH A0
CALLA GETUGH
MOVI 03F3F0000H,A9
CREATE 0,FLASHME
PULL A0
MOVE *A0(OPLINK),A1,L
;WILL BE BOGUS IF SOMETHING OTHER THAN A BULLET STRUCK FAT
MOVE *A1(BLTDIR),A2
SLL 3,A2
MOVI YAD,A0
ADD A2,A0
MOVB *A0,A10 ;A10=AMOUT TO ADD TO Y OF FATMAN
MOVE *A8(OYPOS),A0,W
MOVE *A8(OXPOS),A1,W
SLL 16,A0
MOVX A1,A0 ;GET TOP LEFT OF OBJECT
MOVE @WORLDTL,A1,L
SUBXY A1,A0 ;SUBTRACT OUT WORLD BASE
MOVX A0,A1
SLL 16,A1 ;A1=X,A0=Y
ADD A10,A0
CMPI >280000,A0
JRLT SKP
CMPI >E10000,A0
JRGE SKP
;OKAY
MOVE *A8(OYPOS),A0,W
ADD A10,A0
MOVE A0,*A8(OYPOS)
SKP
ADDI XAD,A2
MOVB *A2,A2 ;A1=AMOUNT TO ADD TO X OF FAT
ADD A2,A1
CMPI >200000,A1
JRLT SKP2
CMPI >15C0000,A1
JRGE SKP2
MOVE *A8(OXPOS),A0
ADD A0,A2
MOVE A2,*A8(OXPOS)
SKP2
; MOVI GDTH1,A0
; CALLA ONESND
MMFM SP,A1,A2,A7,A9
RETS
YAD: .BYTE 0,-6,-6,0,6,6,6,0,-6
XAD: .BYTE 0,0,6,6,6,0,-6,-6,-6
.EVEN
KILL_F1 ;KILL FAT GUY BECAUSE OF SMART BOMB OR COLLISION WITH RING
;OR BULLETS
;EXTER HERE FROM COLLISION ROUTINE - RINGS KILL FATMAN
;ENTER HERE WITH SMART BOMB
;A8=FAT IMG PNTR
MMTM SP,A1,A2,A7
MOVE *A0(OPLINK),A0,L
MOVB *A0(MYPLYR),A0
MOVI P1DATA,A2
CMPI 1,A0
JREQ J5
CMPI 2,A0
JRNZ J55
MOVI P2DATA,A2
J5
;A2=P1DATA OR P2DATA
MOVI FATPT,A1 ;AMOUNT OF SCORE
CALLA SCRADD2 ;DO IT!
J55 MOVE *A8(OPLINK),A0,L
CALLA KILL ;KILLS PROCESS IN A0
MOVE A8,A0
; CALLA DELPAL ;NEEDED? NOT IF IN PLYR PAL!
CALLA DELOBJ
CREATE 0,FEXP
;EXP3
; CALLA GETUGH
MOVI EXP3HI,A0
CALLA ONESND
MMFM SP,A1,A2,A7
RETS
KILL_F2 ;KILL FAT GUY BECAUSE OF SMART BOMB
;ENTER HERE WITH SMART BOMB
;A8=FAT IMG PNTR
;A9=P1/P2DATA
MOVE A9,A2
;A2=P1DATA OR P2DATA
MOVI FATPT,A1 ;AMOUNT OF SCORE
CALLA SCRADD2 ;DO IT!
KILL_F2_NO
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 @FAT_CNT,A3 ;DELETE A FAT FROM CNT
DEC A3
MOVE A3,@FAT_CNT
CREATE 0,KILL_F3
RETS
KILL_F3
MOVE *A8(OYPOS),A2
ADDI 05H,A2 ;A2=Y OFFSET
MOVE A2,*A8(OYPOS)
MOVI BOOM3,A9 ;BOOM3 CHANGES PALETTE TO EXPLOSION!
JAUC FRANIM_DIE
; MOVK 1,A1
; JSRP FRANIM
; MOVE A8,A0
; CALLA DELPAL ;NEEDED? NOT IF IN PLYR PAL!
; CALLA DELOBJ
; DIE
FAT_EXP:
;ONLY NORMAL EXPLODE HAS CHUNKS
MOVB @PCTOT,A2
CMPI 018H,A2
JRGE FEXP
;HAVE ROOM FOR PIECES
CREATE 0,ADPCS2
MOVB @SHK_ON,A0
JRNZ FEXP
MOVI 7,A10
CALLA SHAKER
FEXP
MOVI EXP3HI,A0 ;FAT GUY EXPLODE
CALLA ONESND
MOVE @FAT_CNT,A3 ;DELETE A FAT FROM CNT
DEC A3
MOVE A3,@FAT_CNT
;TURN ON FIRE BALL EXP ALSO
CREATE 0,BIG2
DIE
;KILL
GD2
MOVE *A13(CFLAGS),A0
CMPI 3,A0
JREQ GD3
CALLR GET_RUN ;ZEROS STAND FLAG ALSO
CALLR GET_DIS ;SEND FOR THIS DISTANCE
MOVE *A13(DIR),A0
CALLA INTO ;GET PROPER VELOCITY FOR THIS DIR
SLEEP 1
JRUC LUP_TOP
GD3
MOVK 2,A0
MOVE A0,*A13(CFLAGS)
SLEEP 1
JRUC LUP_TOP
NOSPN:
MOVE *A13(DIS),A0 ;UPDATE DISTANCE COUNT
DEC A0
MOVE A0,*A13(DIS) ;STUFF NEW COUNT
JRNZ ADOT ;BR=CONTINUE CURRENT DIRECTION
MOVE *A13(CFLAGS),A0
CMPI 2,A0
JRNE AP
;GUY WALKED IN THRU DOOR, NOW TURN ACCORDINGLY
CALLR GET_DIS
MOVB *A13(INDEX),A0
SLL 3,A0
ADDI SKINDX2,A0
JRUC INHERE
;TIME TO SEEK TOWARD PLAYER AND EXPLODE
;START SEEK
AP
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 GETADIR2
SLL 3,A0
ADDI CVRT,A0
INHERE:
MOVB *A0,A0
MOVE A0,*A13(SK_DIR)
MOVK 1,A0 ;FAT WILL SPIN TO SK_DIR
MOVE A0,*A13(CFLAGS)
CLR A0
MOVE A0,*A8(OXVEL),L
MOVE A0,*A8(OYVEL),L
SLEEP 1
JRUC LUP_TOP
; 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
CVRT .BYTE 0,3,7,5,1,4,6,2,8
.EVEN
; 04
; 12 11
; 08 07
; 16 15
; 02 01
; 10 09
; 06 05
; 14 13
; 03
ADOT
; MOVB *A13(DELYDT),A0
; JRZ KS
; DEC A0
; MOVB A0,*A13(DELYDT)
; JRUC DOANI
;KS
MOVE *A8(OYPOS),A0,W
MOVE *A8(OXPOS),A1,W
SLL 16,A0
MOVX A1,A0 ;GET TOP LEFT OF OBJECT
MOVE @WORLDTL,A1,L
SUBXY A1,A0 ;SUBTRACT OUT WORLD BASE
MOVX A0,A1
SLL 16,A1 ;A1=X,A0=Y
MOVE *A13(DIR),A2,W
CMPI 1,A2
JREQ U1
CMPI 3,A2
JREQ U2
CMPI 5,A2
JREQ U3
;LFT
CMPI >200000,A1
JRGE DOANI
MOVK 1,A0
JRUC CRCT
U1: CMPI >280000,A0
JRGE DOANI
MOVK 3,A0
JRUC CRCT
U2: CMPI >15C0000,A1
JRLT DOANI
MOVK 5,A0
JRUC CRCT
U3: CMPI >DD0000,A0 ;E1
JRLT DOANI
MOVK 7,A0
CRCT:
;CORRECT WALL HIT
MOVE A0,*A13(SK_DIR),W
;FAT MAN WILL SEEK TO A 45 DEGREE ANGLE
MOVK 1,A0 ;FAT WILL SPIN TO SK_DIR
MOVE A0,*A13(CFLAGS)
CLR A0
MOVE A0,*A8(OXVEL),L
MOVE A0,*A8(OYVEL),L
; MOVI 20,A1
; MOVB A1,*A13(DELYDT)
SLEEP 1
JRUC LUP_TOP
CRNRYX: .LONG [40,40],[40,360],[235,40],[235,360]
.LONG [70,90],[90,300],[190,110],[180,310],[200,240]
DIRTBL .LONG 1,1,1,1,3,1,1,1,1
SKFAT .BYTE 3,5,1,7,3,7,3,5,1
SKINDX: .BYTE 0,3,1,2,4,5,6,7,8
SKINDX2:
.BYTE 1,3,7,5,5,7,3,1,3
.EVEN
;DO FRANIM ANIMATION ON THIS MOVING FAT
DOANI CLR A1
JSRP FRANIM
JRNC CHECK_NEXT ;BR=NOT AT END OF SCRIPT YET
CALLR GET_RUN
CHECK_NEXT:
JRUC LUP_TOP
GET_SK:
MOVB *A13(INDEX),A0
SLL 3,A0
ADDI SKFAT,A0
MOVB *A0,A0
MOVE A0,*A13(SK_DIR)
MOVK 1,A0 ;FAT WILL SPIN TO SK_DIR
MOVE A0,*A13(CFLAGS)
; MOVI 40,A1
; MOVB A1,*A13(DELYDT)
RETS
SETUP_FAT:
;DIR IS BASED ON WHAT DOOR HE IS ENTERING THROUGH!
;IF THIS IS AN ONSCREEN FAT, THEN ANY DIR IS OKAY!
;
CALLR GET_SK
;
; UPDATE FAT COUNT
;
CLR A0
MOVB A0,*A13(ABSRB)
MOVE @FAT_CNT,A0
INC A0
MOVE A0,@FAT_CNT
MOVI FAT,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 FAT
DEC A1
MOVE A1,*A0(16),W
RETS
;
GET_DIS:
MOVI 30,B0
MOVI 100,B1
CALLA RANGRAND
MOVE A0,*A13(DIS) ;TIME BEFORE WE GET NEW VELOCITIES
RETS
YVTBL .LONG 0,Y1,Y2,Y3,Y4,Y5,Y6,Y7,Y8
XVTBL .LONG 0,X1,X2,X3,X4,X5,X6,X7,X8
X8: .LONG 0,-10000H,-1C000H,-20000H,-20000H
Y8: .LONG -18000H,-1C000H,-1A000H,-10000H,0
;Y8: .LONG -18000H,-1C000H,10000H,-10000H,0
;
X1: .LONG -20000H,-10000H,0,10000H,20000H ;UP
Y1: .LONG -10000H,-18000H,-1C000H,-18000H,-10000H
X2: .LONG 0,10000H,1C000H,20000H,20000H
Y2: .LONG -18000H,-1C000H,-1A000H,-10000H,0
X3: .LONG 10000H,20000H,23000H,20000H,10000H
Y3: .LONG -20000H,-10000H,0,10000H,20000H
X4: .LONG 0,10000H,1C000H,20000H,20000H
Y4: .LONG 18000H,1C000H,1A000H,10000H,0
X5: .LONG -20000H,-10000H,0,10000H,20000H
Y5: .LONG 10000H,18000H,1C000H,18000H,10000H
X6: .LONG 0,-10000H,-1C000H,-20000H,-20000H
Y6: .LONG 18000H,1C000H,1A000H,10000H,0
X7: .LONG -10000H,-20000H,-23000H,-20000H,-10000H
Y7: .LONG -20000H,-10000H,0,10000H,20000H
SHRAPNL:
;TURN ON OBJECT AT CORRECT XY
;GET VELOCITY BASED ON DIRECTION IN A9 INDEX INTO TABLE WITH A10
SLL 5,A9
MOVI YVTBL,A0
ADD A9,A0
MOVE *A0,A7,L
ADDI XVTBL,A9 ;GET VELOCITY TABLE
MOVE *A9,A6,L
SLL 5,A10
ADD A10,A6
MOVE *A6,A6,L
ADD A10,A7
MOVE *A7,A7,L
CALLA GETANIXY
* A2 = APOINT OYVAL, 32 BITS *
* A3 = APOINT OXVAL, 32 BITS *
MOVE A2,A1
MOVE A3,A0
MOVI 133,A3 ;159
MOVI DMAWNZ|M_PIXSCAN,A4
MOVI CLSENMY|TYPCBALL,A5
MOVI MTL1,A2
CALLA BEGINOBJ2
MOVI SHRAP,A9
MOVI SHRAP,A10
MOVK 1,A0
MOVB A0,*A13(FDLY) ;FRANIM DELAY
JAUC BULL_TOP
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
GET_RUN:
;GET FRANIM BASE ADDRESS FOR THIS FAT MANS DIRECTION
;
MOVE *A13(DIR),A4
ANDI 0FH,A4 ;TAKE OUT
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
SPINFRMS:
.LONG new12c,fms105,f9wc,fms75,f6wc,fms75,f9wc,fms105
;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
GET_STAND:
;ANI ONTO SCREEN THIS fat mans STANDING POSITION
MOVE *A13(DIR),A0 ;CURRENT DIR FAT IS FACING
DEC A0
; ANDI 07H,A0 ;TAKE OUT
MOVE A0,A2
SLL 5,A0
ADDI SPINFRMS,A0
MOVE *A0,A1,L ;NEW OIMG
SLL 4,A2
ADDI SPINFLGS,A2
MOVE *A2,A4,W ;NEW OFLAGS
CALLA ANI
RETS
INIT_FAT:
;INITIAL FAT 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
SLL 3,A2
MOVI SKINDX,A1
ADD A2,A1
MOVB *A1,A1
MOVB A1,*A13(INDEX)
SLL 1,A2
MOVI SD,A1
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 >17,A1
CALLA SET_GATE_2
MMFM SP,A0,A1
CALLR IH1
CALLA BEGINOBJ
MOVE *A8(OPAL),A0,L
ANDI 0FFFFH,A0
MOVE A0,*A8(OPAL),L
MOVI 20,A3 ;ENOUGH TO GET OUT OF DOOR
MOVE @WAVE,A0
CMPI 4,A0
JREQ IH9
CMPI 6,A0
JREQ IH9
IH8 MOVE A3,*A13(DIS) ;CHANGE BASED ON FAT SPEED?
RETS
IH9
MOVB @PCNT,A0
ANDI 03H,A0
JRNE IH8
MOVI 90,A3 ;ENOUGH TO GET OUT OF DOOR
MOVE A3,*A13(DIS) ;CHANGE BASED ON FAT SPEED?
RETS
IH1: ;ENTER HERE IF ON SCRN FAT
MOVI f6wa,A2 ;DOES NOT MATTER
MOVI 159,A3
MOVI DMAWNZ,A4 ;NON-ZERO VALUE
MOVI CLSENMY|TYPFAT,A5
CLR A6
CLR A7
RETS
SX: .LONG -040000H,01960000H,0CA0000H,0CA0000H
SY: .LONG 0830000H,0830000H,20000H,01100000H ;114
SD: .WORD 3,7,5,1
;812
;7 3
;654
WALK_LIST:
.LONG UP,UP,RGT,RGT,DN,DN,LFT,LFT,RGT
.LONG UP,UP,RGT,RGT,DN,DN,LFT,LFT,RGT
.LONG UP,UP,RGT,RGT,DN,DN,LFT,LFT,RGT
;
;MAN(FAT) ANIMATION TABLES
;
DN
.LONG f6wa
.WORD FLIPBITS|05,0
.LONG f6wb
.WORD 5
.LONG f6wc
.WORD 5
.LONG f6wd
.WORD 5
.LONG f6we
.WORD 5
.LONG f6wd
.WORD 5
.LONG f6wc
.WORD 5
.LONG f6wb
.WORD 5
.LONG 0
RGT
.LONG f9wa
.WORD FLIPBITS|05,(M_FLIPH)
.LONG f9wb
.WORD 5
.LONG f9wc
.WORD 5
.LONG f9wd
.WORD 5
.LONG f9we
.WORD 5
.LONG f9wd
.WORD 5
.LONG f9wc
.WORD 5
.LONG f9wb
.WORD 5
.LONG 0
LFT
.LONG f9wa
.WORD FLIPBITS|05,0
.LONG f9wb
.WORD 5
.LONG f9wc
.WORD 5
.LONG f9wd
.WORD 5
.LONG f9we
.WORD 5
.LONG f9wd
.WORD 5
.LONG f9wc
.WORD 5
.LONG f9wb
.WORD 5
.LONG 0
UP
.LONG new12a
.WORD FLIPBITS|05,0
.LONG new12b
.WORD 5
.LONG new12c
.WORD 5
.LONG new12d
.WORD 5
.LONG new12e
.WORD 5
.LONG new12d
.WORD 5
.LONG new12c
.WORD 5
.LONG new12b
.WORD 5
.LONG 0
SHRAP .LONG MTL1
.WORD 3
.LONG MTL2
.WORD 3
.LONG MTL3
.WORD 3
.LONG MTL4
.WORD 3
.LONG MTL5
.WORD 3
.LONG MTL6
.WORD 3
.LONG MTL7
.WORD 3
.LONG MTL8
.WORD 3
.LONG MTL9
.WORD 3
.LONG MTL10
.WORD 3
.LONG 0
.END