.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