narc/NARC/NARCDUMP.ASM

1263 lines
24 KiB
NASM
Raw Normal View History

2021-04-06 14:36:38 -07:00
.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