.FILE 'DUMP.ASM' .TITLE " <<< D U M P S T E R M A N >>>" ************************************************************************** * * * COPYRIGHT (C) 1988 WILLIAMS ELECTRONICS GAMES, INC. * * ALL RIGHTS RESERVED. * * * ************************************************************************** .WIDTH 132 .OPTION B,D,L .MNOLIST * GET THE SYSTEM STUFF .INCLUDE "\video\MPROCEQU.ASM" ;MPROC equates .INCLUDE "\video\DISPEQU.ASM" ;Display processor equates .INCLUDE "\video\GSP.INC" ;GSP assembler equates .INCLUDE "\video\SYS.INC" ;Zunit system equates .INCLUDE "\video\MACROS.HDR" ;Macros, Yeah! * LOCAL STUFF .INCLUDE "NARCEQU.ASM" ;NARC Equates .INCLUDE "IMGTBL.GLO" ;Image Label Equates .INCLUDE "NARCTEQU.ASM" ;TODD JIZZ .INCLUDE "NARCDUMP.TBL" ;Image Label Equates .GLOBAL HEADBUTT,ZCHK .GLOBAL DUMPCRM1,OIDATA .TEXT * *DUMPSTER MAN DISPATCHER * *DUMPDISP: *DUMPDIS1: * MOVE @DUMPCNT,A0,W ;HOW MANY DUMP BABIES? * MOVE @DUMPMAX,A1,W * CMP A0,A1 * JRLS DUMPDIS4 ;DON'T NEED MORE * * CLR A5 * MOVI >0E50,A14 ;OID * CALLR DUMPCOLD * DEC A11 * JAEQ SUCIDE ;CASH IT IN FOLKS *DUMPDIS4: * SLOOP 30,DUMPDIS1 ;WAIT FOR THEM TO DIE * *DUMPSTER MAN COLD START *A5=Y:X *A6=Z *A14=OID DUMPCOLD: MOVE A5,A9 MOVE A14,A10 CREATE 0E5H,DUMPMAN RETS * *DUMPSTER MAN PROCESS *A9=XY COORD *A10=OID * DUMPMAN: MOVE A9,A9 JRNE DUMPWST ;ALREADY GOT COORDINATE MOVE @WORLDTL,A1,W ;COME FROM EDGE OF SCREEN CALLA RANDOM MOVE A0,A0 JRN DUMP2X ADDI 512,A1 ;START HIM AT RIGHT SCREEN EDGE DUMP2X: ZEXT A1 ;Y COORDINATE MOVE @PLYMIN,B0,W MOVE @PLYMAX,B1,W CALLA RANGRAND SUBI 93,A0 SLL 16,A0 ADD A0,A1 MOVE A1,A9 * *WARM START DUMPMAN *A9=STARTING COORD. *A10=OID DUMPWST: MOVE @DUMPCNT,A0,W ;HOW MANY DUMP BABIES? MOVE @DUMPMAX,A1,W CMP A0,A1 JALS SUCIDE ;DON'T NEED MORE MOVE @DUMPSHT,A0,W ;SHOTS TO TAKE MOVE A0,A1 CALLA RANDU ADD A1,A0 MOVE A0,*A13(ETEMP3),W ;SETUP SHOT COUNT MOVE A9,A1 ;GET Y:X COORD MOVI [1,1],A5 ;SET SPEED MOVI DUMPTAB,A6 MOVI DUMPINIT,A14 ;DUMP ENEMY INIT MMTM SP,A10 ;SAVE YOUR OID CALLA ENINITUL ;CREATE DUMP MMFM SP,A10 JAEQ SUCIDE ;CREATE ERROR, EXIT MOVE A10,*A8(OID),W MOVE @DUMPCNT,A0,W INC A0 MOVE A0,@DUMPCNT,W ;INCREMENT DUMP COUNT MOVE A8,A0 CALLA DELSHAD * *DUMPSTER MAN PROCESS * GCAN0: CLR A0 MOVE A0,*A13(ETEMP1),W ;HAS NO CAN MOVE A0,*A13(ETEMP2),L ;NO CAN YET MOVI DUMPWLK,A9 ;ANIMATION SCRIPT GCAN01 CALLR GETCAN ;TARGET CAN IN A11 JREQ GPLAYR ;GO HEAD BUTT PLAYER MOVE *A8(OID),A0,W BTST 0,A0 JRNE GPLAYR ;ALWAYS GET PLAYER SUBTYPE ODD MOVE @DUMPBTT,A0,W ;GET BUTT PROB SRL 1,A0 CALLA RANDPER ;HEAD BUTT ODDS JRC GPLAYR GCANLP: CALLA ZCHK MOVK 4,A1 JSRP FRANIM JRNC GCANL1 MOVI DUMPWLK,A9 JRUC GCANLP GCANL1: SRL 1,A0 MOVE A0,A10 ;SAVE SLEEP TIME CALLR CKPLAYR ;CLOSE TO PLAYER ??? JRNC GCANLL ;NO, GET CAN MOVE @DUMPBTT,A0,W CALLA RANDPER JRC GPLAYR ;GO GET IM.... GCANLL: MOVE A11,A0 ;IS THE CAN STILL THERE?? MOVE @BACKSLST,A1,L CALLA ON_SLIST JRNC GCAN01 ;CAN IS MISSING GET ANOTHER CALLR CKCAN ;ARE WE THERE YET ? JRNC GCANL3 ;NOPE... MOVE *A8(OXVEL),A0,L ;NO X VEL ? JREQ GCANL3 ;GIVE HIM XVEL CLR A0 MOVE A0,*A8(OZVEL),L ;COOL VELOCITY MOVE A0,*A8(OYVEL),L ;COOL VELOCITY CALLA SHVELCPY ;DO IT FOR SHADOW CMPI 25,A3 JRLO GCANL4 ;TOO CLOSE MOVE A1,A1 ;TEST SIGN OF A1 JRN GCANL20 ;ADJUST YOUR FLIP TO GET CAN CALLA NOYFLP JRUC PKCAN GCANL20: CALLA YFLP JRUC PKCAN ;WE'RE CLOSE, TIME TO GRAB IT GCANL3: CALLR DMPDIR ;GET DIRECTION AND VELOCITY GCANL4: SLEEP 2 DSJ A10,GCANLL JRUC GCANLP ;NOPE, KEEP GOING * *HIT BY SOMETHING WHILE WALKING *A8=OBJECT *A13=PROCESS DWHIT: CLR A0 ;RESET HIT FLAG MOVE A0,*A13(EFLAGS),W MOVE *A8(OXPOS),A1,W ;KNOCK HIM A BIT SUBK 2,A1 MOVE A1,*A8(OXPOS),W SRAM 2,*A8(OXVEL),L ;SLOW HIM DOWN SRAM 2,*A8(OYVEL),L SRAM 2,*A8(OZVEL),L CALLA SHVELCPY ;COPY VELOCITIES TO SHADOW MOVI DUMPHIT,A9 MOVK 1,A1 JSRP FRANIM ;RUN YOUR HIT UNTIL DONE SLLM 2,*A8(OXVEL),L ;SPEED HIM BACK UP SLLM 2,*A8(OYVEL),L SLLM 2,*A8(OZVEL),L CALLA SHVELCPY ;COPY VELOCITIES TO SHADOW RETP * *HIT WHILE PICKING UP * DPHIT: CLR A1 MOVE A1,*A13(ETEMP1),W ;CHANGE STATUS WORD, CAN IS THROWN MOVE A1,*A13(ETEMP2),L ;NO MORE CAN ATTACHED CREATE 0E1h,AIRCAN ;LET CAN FLY MOVE *A13(ETEMP4),*A0(ETEMP4),L JRUC DWHIT * *THROW THE CAN *A8=DUMPSTER MAN *A11=THE CAN * *PICK UP THE CAN * PKCAN: MOVE *A11(OPLINK),A0,L ;IS THERE A PROCESS JRNZ GCAN0 ;BR = YES, DON'T BOTHER WITH THIS MOVE A11,A0 CALLA ISBB JRNC GCAN0 ;BR = CAN IS NOT CORRECT CLR A0 ;RESET HIT FLAG MOVE A0,*A13(EFLAGS),W MOVK 1,A0 MOVE A0,*A13(ETEMP1) ;PICKING UP STAGE MOVE A11,*A13(ETEMP2),L ;STORE CAN TARGET MOVE *A11(OCVECT),*A13(ETEMP4),L MOVI DUMCOLL,A1 MOVE A1,*A11(OCVECT),L CALLA PSTOP ;STOP DUMPSTER MAN MOVI DUMPICK,A9 ;PICK UP ANIMATION MOVI PKOFFTAB,A10 ;OFFSET TABLE FOR CAN MOVE A11,A0 MOVI BACKSLST,A1 CALLA DELSUPP MOVI ENEMIES,A1 CALLA ADDSUPP CALLA DELBB ;PULL BLOCK OFF BACKGROUND LIST SWAP A11,A8 CALLA SHADST ;GIVE CAN A SHADOW SWAP A11,A8 MOVI CPICKSND,A0 CALLA ONESND PKCAN0: MOVE *A13(EFLAGS),A0,W ;CHECK IF HIT JREQ PKCAN1 JSRP DPHIT ;HIT WHILE PICKING UP JRUC GCAN0 ;GRAB IT AGAIN PKCAN1: MOVE *A11(OYPOS),A1,W ;GET CURRENT CAN X,Y POS MOVE *A11(OXPOS),A0,W MOVE *A10+,A2,W ;ADD DELTAS MOVE *A8(OFLAGS),A5,W BTST B_FLIPH,A5 JRZ PKCAN2 ;NO FLIP NEG A2 ;NEGATE DELTA X FOR FLIP PKCAN2: MOVE *A11(OZPOS),A5,W CLR A7 MOVE *A10+,A3,W JREQ PKCAN3 MOVE *A8(OZPOS),A6,W SUB A5,A6 SUBI 7,A6 ;ADJUST Z? JREQ PKCAN3 ;NOPE, ZERO MOVK 1,A7 JRNN PKCAN3 NEG A7 PKCAN3: ADD A7,A5 MOVE A5,*A11(OZPOS),W ADD A2,A0 ADD A3,A1 ADD A7,A1 MOVE A0,*A11(OXPOS),W MOVE A1,*A11(OYPOS),W MOVE *A11(OSHAD),A4,L ;UPDATE SHADOW X JREQ PKCAN00 MOVE *A4(OXPOS),A0,W ADD A2,A0 MOVE A0,*A4(OXPOS),W MOVE *A4(OZPOS),A5,W ADD A7,A5 MOVE A5,*A4(OZPOS),W ;UPDATE SHADOW Z MOVE *A4(OYPOS),A0,W ADD A7,A0 MOVE A0,*A4(OYPOS),W ;UPDATE SHADOW Y PKCAN00: CLR A1 JSRP FRANIM ;RUN UNTIL PICKED UP JRNC PKCAN0 * *WALK WITH THE CAN * MOVK 2,A0 MOVE A0,*A13(ETEMP1) ;WALK WITH CAN STAGE MOVI DUMPTHWLK,A9 MOVI COFFTAB,A10 ;CARRY OFFSET TABLE CARRYL: MOVI 200,A5 MOVI 50,A6 CALLA GETCPLY MOVE *A0(POBJ),A0,L ;PLAYER OBJECT CALLA XZCHK ;ARE WE IN POSITION JRC THC00 ;YES, THROW IT CALLR DMPDIR ;NO GET DIRECTION MOVE *A8(OXVEL),A1,L ;COPY VELOCITY TO CAN MOVE A1,*A11(OXVEL),L MOVE *A8(OZVEL),A1,L MOVE A1,*A11(OZVEL),L MOVE A1,*A11(OYVEL),L SWAP A8,A11 CALLA SHVELCPY ;GET CAN SHADOW SWAP A8,A11 MOVE *A10+,A0,W ;ADD OFFSET FOR X POSITION MOVE *A8(OFLAGS),A1,W BTST B_FLIPH,A1 JRNE CARRY02A NEG A0 CARRY02A: ADDRM A0,*A11(OXPOS),W MOVE *A11(OSHAD),A4,L JREQ CARRY03 ADDRM A0,*A4(OXPOS),W CARRY03: MOVE *A10+,A0,W ;ADD OFFSET FOR Y POSITION ADDRM A0,*A11(OYPOS),W CLR A1 JSRP FRANIM ;RELOAD FRANIM AT END JRNC CARRY1 MOVI DUMPTHWLK,A9 MOVI COFFTAB,A10 ;CARRY OFFSET TABLE CARRY1: JRUC CARRYL * *THROW THE CAN * THC00 MOVK 3,A0 MOVE A0,*A13(ETEMP1) ;THROWING STAGE CALLA PSTOP ;STOP DUMPSTER MAN SWAP A8,A11 CALLA PSTOP ;STOP THE CAN SWAP A8,A11 CALLA GETCPLY CALLA FACEPLYR ;FACE THE DUDE MOVI THOFFTAB,A10 ;OFFSET TABLE FOR CAN THROW MOVI DUMPTHRW,A9 ;THROW ANIMATION THCAN0: MOVE *A13(EFLAGS),A0,W ;CHECK IF HIT JREQ THCAN1 SLEEP 8 THCAN1: MOVE *A11(OYPOS),A1,W ;GET CURRENT CAN X,Y POS MOVE *A11(OXPOS),A0,W MOVE *A10+,A2,W ;ADD DELTAS MOVE *A10+,A3,W ADD A2,A0 ADD A3,A1 MOVE A0,*A11(OXPOS),W MOVE A1,*A11(OYPOS),W MOVE *A11(OSHAD),A4,L ;UPDATE SHADOW X JREQ THCAN00 MOVE *A4(OXPOS),A0,W ADD A2,A0 MOVE A0,*A4(OXPOS),W THCAN00: CMPI DUMPFLY,A9 JRNE THCAN01 CALLR FLYCAN ;LAUNCH THE DUDE THCAN0A: CLR A1 MOVE A1,*A13(ETEMP1),W ;CHANGE STATUS WORD, CAN IS THROWN MOVE A1,*A13(ETEMP2),L ;NO MORE CAN ATTACHED CLR A1 JSRP FRANIM ;RUN ANIMATION OUT JRC GCAN0 MOVE *A13(EFLAGS),A0,W ;CHECK IF HIT JREQ THCAN0A JSRP DWHIT ;HIT WHILE PICKING UP JRUC GCAN0 ;GO GET ANOTHER THCAN01 CLR A1 JSRP FRANIM ;RUN UNTIL THROWN JRNC THCAN0 JRUC GCAN0 ;GO GET ANOTHER ONE * *GET PLAYER AND HEAD BUTT *A8=DUMPMAN OBJECT GPLAYR: MOVI 500,A0 ;GET TIME OUT VALUE CALLA RANDU ADDI 250,A0 MOVE A0,A11 GPLAYR0: MOVI DUMPWLK,A9 GPLAYR1: MOVK 4,A1 JSRP FRANIM MOVE A0,A10 ;SAVE SLEEP TIME JRC GPLAYR0 GPLAYRL: CALLA ZCHK ;STAY IN BOUNDS CALLA GETCPLY MOVE *A0(PFLAGS),A7,L MOVI 25,A5 MOVI 15,A6 MOVE *A0(POBJ),A0,L ;PLAYER OBJECT CALLA XZCHK ;ARE WE IN POSITION JRNC GPLAYR2 ;NO, GET DIRECTION BTST BJUMP2,A7 ;PLAYER IN AIR ? JRNE GPLAYR2 ;YES, NO BUTT MOVE A2,A2 JRNN GPLAYR2 ;DONT DO IT IN BACK CMPI 15,A3 JRHS DMPBUTT ;NOT TOO CLOSE MOVE *A8(OXVEL),A0,L ;NO X VEL ? JREQ GPLAYR2 ;GIVE HIM XVEL CLR A0 MOVE A0,*A8(OZVEL),L ;COOL VELOCITY MOVE A0,*A8(OYVEL),L ;COOL VELOCITY CALLA SHVELCPY ;DO IT FOR SHADOW JRUC GPLAYR20 GPLAYR2: BTST BJUMP2,A7 ;PLAYER IN AIR ? JRZ GPLYR20 ;NO MOVI 15,A0 ;YES, BE STUPID? CALLA RANDPER JRNC GPLAYR20 ;YIP GPLYR20: CALLR DMPDIR ;NO GET DIRECTION GPLAYR20: SLEEP 1 DSJS A11,GPLAYR3 ;TIME OUT CHECK JRUC GCAN0 ;GO FOR A CAN GPLAYR3: DSJ A10,GPLAYRL JRUC GPLAYR1 DMPBUTT: MOVE A1,A1 ;FLIP THE DUDE PROPERLY JRN DMPBTT0 CALLA NOYFLP JRUC DMPBTT1 DMPBTT0: CALLA YFLP DMPBTT1: CALLA PSTOP ;STOP THE DUDE CALLA GETCPLY MOVE A0,A2 CALLA HEADBUTT MOVI DUMPBUTT,A9 ;GET ANIMATION DMPBUT2: MOVK 1,A1 JSRP FRANIM ;BUTT HIM CALLA RANDOM JRN GPLAYR0 ;GET HIM AGAIN MOVI CHEADYEA,A0 CALLA ONESND JRUC GCAN0 ;GO FOR A CAN ************************************************************************** *DUMPSTER MAN SOUNDS * * * CHANNEL #0 CVSD SOUNDS * * CHANNEL #1 DAC A * * CHANNEL #2 DAC B * * CHANNEL #3 MUSIC * * * *SOUND DESCRIPTION= PRIORITY,TIME,SOUND CODE,(PRIORITY),(TIME),(SOUND CODE),0 *SOUND ENDS IN 0000. *PRIORITY WORD = 1111IENNPPPPPPPP; I=1=NON-INTERRUPTABLE, E=1=NON-INT BY EQUAL *NN=CHANNEL #(0-3); *PP=PRIORITY (00-FF), FF=HIGHEST. *TIME WORD =TTTT (0000-7FFF X 16MS). *SOUND WORD =8SSS SSS=SOUND CODE(000-FFF). *SOUND WORD =4SSS SSS=SOUND CODE (ZERO TIME SOUND CODE) *CAN HIT SOUND CNHTSND .WORD >F020,>12,>804F,01,>8002,0 *CAN THROW SOUND CNTHSND .WORD >F020,>08,>801B,0 *CAN FLY SOUND CNFLSND .WORD >F320,>10,>8093,0 *PICK UP SOMETHING CPICKSND .WORD >F020,>64,>8012,0 *HIT BY BULLET CBULHITR .WORD >F01F|>800,>38,>8023,0 ;BULLET HITS *THE "AFTER HEAD BUTT" GROWL CHEADYEA .WORD >F01F,>46,>8026,0 * *LET IT FLY * FLYCAN: CALLA GETCPLY MOVE *A0(POBJ),A7,L ;PLAYER OBJECT MOVE *A7(OXPOS),A2 ;FORM DELTAS MOVE *A7(OZPOS),A3 MOVE *A8(OXPOS),A0 MOVE *A8(OZPOS),A1 SUB A0,A2 MOVE A2,A4 ;SAVE DELTA X SUB A1,A3 MOVK 10,A0 ;ADD RANDOM OFFSET TO X CALLA SRAND ADD A0,A3 MOVK 10,A0 ;ADD RANDOM OFFSET TO Z CALLA SRAND ADD A0,A2 ABS A4 CMPI 50,A4 ;SHORT DISTANCE ? JRHS FLYC1 SLL 12,A2 SLL 12,A3 MOVI >18000,A0 JRUC FLYC3 FLYC1: CMPI 100,A4 ;SHORT DISTANCE ? JRHS FLYC2 SLL 11,A2 SLL 11,A3 MOVI ->10000,A0 JRUC FLYC3 FLYC2: SLL 10,A2 SLL 10,A3 MOVI ->30000,A0 FLYC3: MOVE A2,*A11(OXVEL),L ;LOAD UP CAN MOVE A3,*A11(OZVEL),L ADD A3,A0 ;ADD ZVEL TO YVEL MOVE A0,*A11(OYVEL),L SWAP A11,A8 CALLA SHVELCPY SWAP A11,A8 MOVI CNTHSND,A0 ;MAKE YOUR GRUNT CALLA ONESND CREATE 0E1h,AIRCAN ;LET CAN FLY MOVE *A13(ETEMP4),*A0(ETEMP4),L RETS * *OFFSET TABLE FOR LIFTING CAN *DX,DY PKOFFTAB: .WORD 0,0,0,0,0,0,0,0,0,-10,0,-20,0,-20,-10,-16,-10,-7,-10,-7 * *OFFSET TABLE FOR THROWING CAN *DX,DY THOFFTAB: .WORD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 * *OFFSET TABLE FOR CARRYING CAN *DX,DY COFFTAB: .WORD 3,3,1,1,0,0,0,0,1,1,-2,-2,-3,-3,0,0,0,0 * *CAN IN THE AIR *A11 = CAN OBJECT * AIRCAN: MOVE A11,A8 MOVE A8,A0 MOVI ENEMIES,A1 CALLA DELSUPP MOVI ENEMY_BULLETS,A1 CALLA ADDSUPP AIRCANL: SLEEP 3 CLR A0 MOVE *A8(OZPOS),A1,W ;CHECK IF Z LEGAL MOVE @PLZMIN,A2,W ADDI 10,A2 MOVE @PLZMAX,A3,W SUBI 10,A3 CMP A2,A1 ;CHECK LOWER BOUND JRLT ZBAD CMP A3,A1 JRLT ZOK2 ZBAD: MOVE A0,*A8(OZVEL),L ;ZERO ZV'S OF CAN AND SHADOW MOVE *A8(OSHAD),A4,L JREQ ZOK2 MOVE A0,*A4(OZVEL),L MOVE A0,*A4(OYVEL),L ZOK2: MOVE *A8(OYVEL),A0,L ;EFFECT OF GRAVITY ADDI >5000,A0 MOVE A0,*A8(OYVEL),L JRN AIRCANL ;IF YV IS UP DONT STOP IT CALLA DFRMGRND JRNN AIRCANL ;IN THE AIR STILL MOVE *A8(OYVEL),A0,L ;EFFECT OF GRAVITY CMPI >10000,A0 JRLS CANLAND SRA 3,A0 ;BOUNCE VELOCITY NEG A0 MOVE A0,*A8(OYVEL),L ;CUT DOWN Y MOVE *A8(OZVEL),A1,L ;CUT DOWN Z SRA 1,A1 MOVE A1,*A8(OZVEL),L MOVE *A8(OXVEL),A0,L ;CUT DOWN X SRA 1,A0 MOVE A0,*A8(OXVEL),L MOVE *A8(OSHAD),A4,L ;CUT DOWN X OF SHADOW JRZ AIRCNLL MOVE A0,*A4(OXVEL),L MOVE A1,*A4(OZVEL),L AIRCNLL: MOVI CNHTSND,A0 ;MAKE YOUR SOUND CALLA ONESND JRUC AIRCANL CANLAND: CALLA PSTOP ;STOP THE SUCKER MOVE A8,A0 ;OBJECT IN A0 FOR SETZPOS CALLA SETZPOS ;ADJUST THE MUTHA CALLA DELSHAD ;GET RID OF SHADOW MOVI CNHTSND,A0 ;MAKE YOUR SOUND CALLA ONESND MOVE A8,A0 MOVE *A13(ETEMP4),*A0(OCVECT),L MOVI ENEMY_BULLETS,A1 CALLA DELSUPP MOVI BACKSLST,A1 CALLA ADDSUPP MOVK 1,A1 ;PUT HIM BACK IN BACKGROUND JIVE CALLA ADDBB *AIRCANX: JAUC SUCIDE ;BAG IT.... * *GET A GARBAGE CAN *DUMPSTER MAN IN A8 *CAN RETURNED IN A11 *RETURNS EQ IF NO CAN FOUND * GETCAN: MMTM SP,A0 MOVE @BACKSLST,A11,L JREQ GETCANX ;NOBODY HOME... GETCAN0: MOVE *A11(OIMG),A0,L ;IS IT A CAN ? CMPI LAMPTOP,A0 JREQ GETCANL CMPI LAMPOST,A0 JREQ GETCANL ;NO MOVE *A11(OID),A0,W SRL 8,A0 SLL 8,A0 ;CHECK FOR GNARLY NO-NO OBJECTS CMPI BGDCID,A0 JREQ GETCANL CMPI BGGDCID,A0 JREQ GETCANL CMPI BGWCID,A0 JREQ GETCANL MMTM SP,A8 MOVE A11,A8 CALLA DFRMGRND ;ITS ON THE GROUND? MMFM SP,A8 ABS A1 CMPI 10,A1 JRHI GETCANL ;NOPE MOVE A11,A11 ;RETURN NE JRUC GETCANX GETCANL: MOVE *A11(OSLINK),A11,L JRNE GETCAN0 GETCANX: MMFM SP,A0 RETS * *CHECK FOR CAN INTERSECTION *CALLING PARAMETERS: *A8=DUMPSTER MAN *A11=CAN HE IS GOING FOR *RETURNS: *CARRY SET IF HE IS CLOSE TO CAN *A1=DELTA X *A2=DELTA Y *A3=ABS DELTA X *A4=ABS DELTA Z CKCAN: MMTM SP,A0,A8 MOVE *A8(OXPOS),A3,W MOVE *A8(OSIZEX),A2,W ;CHECK CENTERS SRL 1,A2 ADD A2,A3 MOVE *A8(OZPOS),A4,W MOVE *A11(OXPOS),A1,W MOVE *A11(OSIZEX),A2,W ;CHECK CENTERS SRL 1,A2 ADD A2,A1 MOVE *A11(OZPOS),A2,W SUB A4,A2 SUB A3,A1 MOVE A1,A3 MOVE A2,A4 ABS A3 ABS A4 CMPI 30,A3 JRNC CKCANX MOVE A2,A2 JRNN CKCANF CMPI 14,A4 JRUC CKCANX CKCANF: CLRC ;FAIL TEST CKCANX: MMFM SP,A0,A8 RETS * *CHECK IF DUMPMAN CLOSE TO PLAYER *RETURNS A7=PLAYER TO GO AFTER, CARRY SET IF IN RANGE CKPLAYR: MMTM SP,A0,A1,A2,A3,A4,A5,A6 MOVI P1DATA,A7 ;OTHERWISE PLAYER ONE MOVE *A7(POBJ),A0,L ;GET EXPECTED PLAYERS OBJECT JREQ CKPL1 ;ZERO INDICATES DEAD MOVI 45,A5 ;CHECK IF WERE CLOSE MOVI 30,A6 CALLA XZCHK JRC CKPLX CKPL1: MOVI P2DATA,A7 MOVE *A7(POBJ),A0,L ;GET EXPECTED PLAYERS OBJECT JREQ CKPLX0 ;PLAYER 2 DEAD MOVI 30,A5 ;CHECK IF WERE CLOSE MOVI 20,A6 CALLA XZCHK JRC CKPLX CKPLX0: CLRC CKPLX: MMFM SP,A0,A1,A2,A3,A4,A5,A6 RETS * *GET DIRECTION FOR DUMPSTER MAN *A1=DELTA X *A2=DELTA Z *A3=ABS DX *A4=ABS DZ *A8=OBJECT * DMPDIR: MOVE A3,A14 ;SAVE ABS DX MOVE @DUMPSPD,A3,W ;X VELOCITY SLL 8,A3 ;NORMALIZE IT MOVE A3,A4 SRL 1,A4 ;Z VELOCITY ABS A1 ;NEGATE FOR NEGATIVE X JRN DMPDIR1 NEG A3 DMPDIR1: ADDI 7,A2 ;ADD IN FUDGE FACTOR ABS A2 ;NEGATE FOR NEGATIVE Z JRN DMPDIR2 NEG A4 DMPDIR2: * CMPI 10,A1 ;CLEAR IF REAL CLOSE * JRHI DMPDIR3 * CLR A3 DMPDIR3: CMPI 6,A2 ;CLEAR IF REAL CLOSE JRHI DMPDIR4 CLR A4 DMPDIR4: MOVE A4,*A8(OYVEL),L MOVE A4,*A8(OZVEL),L CMPI 30,A14 ;DONT CHANGE XVEL IF CLOSE (ANTI STAIRSTEP) JRHS DMPDIR5 MOVE *A8(OXVEL),A14,L JREQ DMPDIR5 MOVE A14,A3 DMPDIR5: MOVE A3,*A8(OXVEL),L ;STORE VELOCITY DMPDIR6: CALLA SHVELCPY MOVE A3,A3 ;TEST X VELOCITY JAN YFLP JAUC NOYFLP * *DUMPSTER MAN COLLSION ROUTINE *A0 = PTR TO DUMPSTER MAN OBJECT *A8 = PTR TO OBJECT THAT SMASHED HIM * *HIT BY A BULLET * DMPBUL: MOVE A0,B0 ;MAKE BULLET HIT SOUND MOVI CBULHITR,A0 CALLA ONESND MOVE B0,A0 MOVE *A0(OPLINK),A3,L MOVE *A3(ETEMP3),A1,W ;DECREMENT HIT COUNT CMPI 3,A1 JRHS DUMPB0 *MAKE A BLOOD SPLAT MMTM SP,A0,A1,A3,A8 MOVE *A8(OYPOS),A9,W MOVE *A0(OID),A11,W MOVE A0,A8 CREATE 0EDH,SPLATBOX MMFM SP,A0,A1,A3,A8 DUMPB0: DEC A1 MOVE A1,*A3(ETEMP3),W JRGT DMPBL00 ;NOT DEAD YET... MOVE *A8(OXVEL),A1,L ;GIVE HIM BULLET VELOCITY SRA 2,A1 MOVE A1,*A0(OXVEL),L MOVE *A0(OSHAD),A2,L JREQ DMPBL000 MOVE A1,*A2(OXVEL),L DMPBL000 CALLR DMPCLNUP ;HE IS DEAD CALLA SHADST MOVI 0EDh,A1 MOVI DMPBDIE,A7 CALLA GETPRC ;CREATE A NEW ENEMY DEATH PROCESS MOVE A11,A11 ;GOT A CAN? JREQ DMPCOLX ;NOPE... CREATE 0E1h,AIRCAN ;LET CAN FLY MOVE *A3(ETEMP4),*A0(ETEMP4),L JRUC DMPCOLX DMPBL00 MOVK 12,A2 ;FIND BULLET DIRECTION MOVE *A8(OXVEL+>10),A1,W JRNN DMPBUL1 NEG A2 DMPBUL1: MOVE *A0(OXPOS),A1,W ;KNOCK HIM A BIT ADD A2,A1 MOVE A1,*A0(OXPOS),W MOVE *A0(OSHAD),A4,L JREQ DMPBUL2 MOVE *A4(OXPOS),A1,W ;KNOCK SHADOW ADD A2,A1 MOVE A1,*A4(OXPOS),W DMPBUL2: MOVE *A0(OPLINK),A5,L MOVE *A5(ETEMP2),A5,L JREQ DMPCOLX ;NO... MOVE *A5(OXPOS),A1,W ;KNOCK HIM A BIT ADD A2,A1 MOVE A1,*A5(OXPOS),W MOVE *A5(OSHAD),A4,L JREQ DMPBUL3 MOVE *A4(OXPOS),A1,W ;KNOCK SHADOW ADD A2,A1 MOVE A1,*A4(OXPOS),W DMPBUL3: DMPCOL0: MOVK 1,A2 ;SIGNAL DUDE IS HIT MOVE *A0(OPLINK),A1,L MOVE A2,*A1(EFLAGS),L DMPCOLX: CLRC ;TELL COLLISION SCANNER NOT TO DELETE RETS * *DUMPSTER MAN HIT BY ROCKET *A0 = PTR TO DUMPSTER MAN OBJECT *A8 = PTR TO OBJECT THAT SMASHED HIM * DMPROK: DMPEXP: MOVE *A0(OPLINK),A5,L CALLR DMPCLNUP MOVI 0EDh,A1 MOVI DMPDIE,A7 CALLA GETPRC ;CREATE A NEW ENEMY DEATH PROCESS CALLA SHADST CALLR EXPVEL MOVE A11,A11 ;GOT A CAN? JREQ DMPCOLX ;NOPE... SWAP A11,A8 CALLR EXPVEL SWAP A11,A8 DMPEXP1: CREATE 0E1h,AIRCAN ;LET CAN FLY MOVE *A5(ETEMP4),*A0(ETEMP4),L JRUC DMPCOLX * *DUMPMAN DIE HIT BY A BULLET * DMPBDIE: MOVI DUMPDIE0,A9 ;DO YOUR DEATH ANIMATION MOVK 1,A1 JSRP FRANIM MOVI [1,1],A9 CREATE 0DFh,ESINK ;CREATE THE DEADMAN SINK JAUC SUCIDE ;DIE * *MISC. DEATH CHORES FOR DUMPMAN * DMPCLNUP: MOVE @DUMPCNT,A1,W ;DECREMENT DUMPSTER COUNT DEC A1 MOVE A1,@DUMPCNT,W MOVI DUMCOLL,A14 MOVE A14,*A0(OCVECT),L ;COLLISION POINTER NULL FOR NOW MOVE *A8(OID),A11,W ;GET ENEMY ID FOR POINTS MOVE A8,A6 MOVE A0,A8 CALLA SCRKIL ;SCORE YOUR POINTS CALLA OIDATA JRC DMPCLN1 CALLA PUT2x5K ;DO A LITTLE FELLER DMPCLN1 MOVE *A8(OPLINK),A0,L MOVE *A0(ETEMP2),A11,L ;GOT A CAN? JAUC KILL ;KILL YOUR OLD PROCESS * *EXPLOSION VELOCITY *A8=OBJECT, A6=SHIT THAT HIT YOU * EXPVEL: CALLA PSTOP ;BLOW DUDE INTO THE AIR MOVI >60000,A0 ;GET RANDOM Y VELOCITY CALLA RANDU ADDI >20000,A0 MOVE A0,A3 NEG A3 MOVI >40000,A0 ;GET RANDOM X VELOCITY CALLA RANDU ADDI >18000,A0 ;ADD IN BIAS MOVE *A6(OXVEL+>10),A14 ;GET ROCKET VELOCITY JREQ DMPEX1 JRNN DMPEX2 NEG A0 JRUC DMPEX2 DMPEX1: ;ZERO VELOCITY CASE, (EXPLOSION) SUBI >18000,A0 ;REMOVE BIAS CALLA GETCPNT SWAP A6,A8 MOVE A1,A2 ;A2=DUMPSTER MAN CENTER CALLA GETCPNT SWAP A6,A8 ;A1=EXPLOSION CENTER SUBXY A1,A2 JRXNN DMPEX2 NEG A0 DMPEX2: MOVE A0,*A8(OXVEL),L MOVE A3,*A8(OYVEL),L MOVE *A8(OSHAD),A4,L JREQ DMPEXP0 MOVE A0,*A4(OXVEL),L DMPEXP0: RETS * *DUMPSTER MAN DIE * DMPDIE: CREATE 0EDH,DMPFALL ;FALL DUDE DMPDIE0: MOVI DUMPBLO,A9 ;DO YOUR BLO UP ANIMATION DMPDIEL: CLR A1 JSRP FRANIM JRC DMPDIE0 CALLA DFRMGRND JRN DMPDIE1 JREQ DMPDIE1 MOVE *A8(OYVEL+>10),A2 ;CHECK VELOCITY TO START DEATH EARLY? JRN DMPDIEL SLL 4,A2 CMP A2,A1 JRGT DMPDIEL DMPDIE1: MOVI DUMPDIE,A9 ;DO YOUR DEATH ANIMATION MOVK 1,A1 JSRP FRANIM MOVI [1,1],A9 CREATE 0DFh,ESINK ;CREATE THE DEADMAN SINK JAUC SUCIDE ;DIE DMPFALL: DMPFAL2: SLEEP 3 MOVE *A8(OYVEL),A0,L ;EFFECT OF GRAVITY ADDI >5000,A0 MOVE A0,*A8(OYVEL),L CALLA DFRMGRND JRNN DMPFAL2 ;IN THE AIR STILL CALLA PSTOP ;STOP THE SUCKER MOVE A8,A0 ;OBJECT IN A0 FOR SETZPOS CALLA SETZPOS ;ADJUST THE MUTHA DIE * *HORIZONTAL FLIP OF OBJECT *A8=OBJECT *FLIPS OBJECT ABOUT Y AXIS HFLIP: MMTM SP,A1,A4 MOVE *A8(OFLAGS),A4,L XORI M_FLIPH,A4 ;FLIP THE DUDE MOVE *A8(OIMG),A1,L CALLA ANI MMFM SP,A1,A4 RETS * *STFOBJ INITIALIZING DATA * .LONG OXVEL,OYVEL,OXVAL,OYVAL * .WORD OZPOS,OZVEL * .LONG OIMG,OZSIZ,OCVECT * .WORD OFLAGS,OID DUMPINIT .LONG 0,0,0,0 .WORD 0,0 .LONG bwlk4_vda,LOFZ,DMPCOL .WORD DMAWNZ,>E05 .LONG DUMPBLIP DMPCOL: .WORD B1OID+BULLETID .LONG DMPBUL .WORD B2OID+BULLETID .LONG DMPBUL .WORD B1OID+ROCKETID .LONG DMPROK .WORD B2OID+ROCKETID .LONG DMPROK .WORD B1OID+EXPLODID .LONG DMPEXP .WORD B2OID+EXPLODID .LONG DMPEXP .WORD BEOID+EXPLODID .LONG DMPEXP .WORD 0 .LONG DUMRTSG * *ANIMATION TABLES * DUMPTAB .LONG 0 * *********************************************** *DUMPSTER MAN ANIMATIONS *********************************************** * *DUMPSTER MAN WALK * DUMPWLK: .long bwlk4_vda .word 5 .long bwlk5_vda .word 5 .long bwlk6_vda .word 5 .long bwlk8_vda .word 5 DUMPWLK2: .long bwlk9_vda .word 5 .long bwlk10_vda .word 5 .long bwlk12_vda .word 5 .long bwlk13_vda .word 5 .long bwlk14_vda .word 5 .long 0 * *DUMPSTER MAN HIT * DUMPHIT: .long bdie1 .word 6 .long bdie2 .word 6 .long bdie3 .word 6 .long 0 * *DUMPSTER MAN BLOW UP THROUGH THE AIR * DUMPBLO: .long bdie1 .word 8 .long bdie2 .word 8 .long bdie3 .word 8 .long bdie4 .word 8 .long bdie5 .word 8 .long bdie6 .word 8 .LONG 0 *DUMPDIE 0 DUMPDIE0: .long bdie1 .word 4 .long bdie2 .word 4 .long bdie3 .word 4 * .long bdie4 * .word 4 * .long bdie5 * .word 4 * .long bdie6 * .word 4 * *DUMPSTER MAN DIE * DUMPDIE: .long bdie7 .word 4 .long bdie9 .word 4 .long bdie10 .word 4 .long bdie11 .word 4 .long bdie12 .word 4 .long bdie14 .word 10 .long 0 * *DUMPSTER MAN PICKUP * DUMPICK: .long pick2 .word 6 .long pick3 .word 6 .long pick4 .word 6 .long pick6 .word 6 .long pick7 .word 6 .long pick8 .word 6 .long pick9 .word 6 .long pick10 .word 6 .long pick11 .word 6 .long 0 * *DUMPSTER MAN THROW * .long dmthr1 .word 6 .long dmthr2 .word 6 .long dmthr3 .word 6 .long dmthr4 .word 6 DUMPTHRW: .long dmthr5 .word 6 .long dmthr7 .word 6 DUMPFLY: .long dmthr8 .word 6 .long dmthr9 .WORD 6 .long dmthr10 .word 6 .long dmthr11 .word 6 .long dmthr12 .word 6 .long 0 * *dumpster man head butt * DUMPBUTT: .long pick2 .word 6 .long pick9 .word 6 .long pick2 .word 6 .long 0 * *DUMPSTER MAN THROW WALK * DUMPTHWLK: .long dmthr1 .word 6 .long dmthr2 .word 6 .long dmthr3 .word 6 .long dmthr4 .word 6 .long dmthra .word 6 .long dmthrb .word 6 .long dmthrc .word 6 .long 0 * *dumpster man shake * DUMPSHAK: .long pick7 .word 4 .long pick9 .word 4 .long pick10 .word 4 .long pick11 .word 4 .long pick10 .word 4 .long pick9 .word 4 .long 0 * *DUMPSTER MAN CRIME SCENE * DUMPCRM1: move @(WORLDTLX+16),A0,W addi 150,A0 move @PLYMIN,A1,W addi 5,A1 sll 16,A1 movx A0,A1 clr A6 movi DUMPINIT,A14 calla ESINITLL clr A0 move A0,*A8(OBLIPIMG),L calla PSTOP calla NOYFLP movi >1C000,A0 move A0,*A8(OXVEL),L movi DUMPWLK2,A9 movk 1,A1 jsrp FRANIM SOUND1 CNTHSND movi DUMPWLK,A9 movk 1,A1 jsrp FRANIM CRM1X: MOVI ENEMIES,A1 MOVE A8,A0 CALLA DELSUPP move *A8(OPAL),A1,W move A1,@CRIMEPAL,W CALLA DELSOBJ retp .END