narc/NARC/NARCDUMP.ASM

1263 lines
24 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 '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