.FILE 'NARCDOG.ASM' .TITLE " <<< N A R C -- PIT BULLS >>>" ************************************************************************** * * * 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 "NARCTEQU.ASM" ;TODD JIZZ .INCLUDE "NARCDOG.TBL" .TEXT .GLOBAL ZCHK,XZCNTCK,SWAPAL0,CARCHK,BOZCHK .GLOBAL doggry,blackd,dog * *PITBULL DISPATCHER * *DOGDISP: * MOVI 9,A0 * MOVE A0,@DOGMAX,W ;MAX DOG COUNT * CLR A0 * MOVE A0,@DOGCNT,W * MOVI >0300,A0 * MOVE A0,@DOGSPD,W ;DOG SPEED * CREATE 0,DOGDIS3 * RETS *DOGDIS3: * CLR A5 * MOVI >00450E10,A14 * CALLR DOGCOLD * SLOOP 320,DOGDIS3 ;WAIT FOR THEM TO DIE * *DOG COLD START *A5=Y:X COORD; IF ZERO THEN MAKE-UP COORDINATE *A6=0:Z COORD *A14= 0; FIX NUMBER:RANDOM NUMBER; 0E; ENEMY TYPE:ENEMY SUBTYPE (BYTE FIELDS) * DOGCOLD: MOVE A14,A10 ;SAVE OID SLL 28,A10 SRL 28,A10 MOVI >30,A0 MPYU A0,A10 ADDI DGTAB,A11 ;FORM TABLE REFERENCE BASE ADDR MOVE A14,A10 ;SAVE OID MOVE A14,A2 SLL 8,A2 ;GET FIXED COUNT SRL 28,A2 MOVE A14,A0 SLL 12,A0 ;GET RANDOM COUNT SRL 28,A0 JRZ DOGCLD0 ;BR = NO RANDOM GUYS CALLA RANDU ADD A0,A2 DOGCLD0: *GET PACK STARTING POINT MOVE A5,A9 JRNE DOGCLD1 ;ALREADY GOT A STARTING POINT MOVE @WORLDTL,A9,W ;COME FROM EDGE OF SCREEN SUBI 150,A9 CALLA RANDOM JRN DOGCLD1 ADDI 680,A9 ;START HIM AT RIGHT SCREEN EDGE DOGCLD1: ZEXT A9 ;Y COORDINATE MOVE @PLYMIN,B0,W MOVE @PLYMAX,B1,W CALLA RANGRAND SUBI 38,A0 ;ADJUST FOR UL SLL 16,A0 ADD A0,A9 CREATE DOGPID,DOG1X ;MAKE 'EM DSJS A2,DOGCLD1 MOVE *A11,A11,L ;GET PALETTE SLL 28,A10 SRL 28,A10 ADDI >DD0,A10 ;START A DOGEYE MOVE A10,A1 MOVI DOGEYE,A7 CALLA GETPRC RETS * *DOG TYPE TABLE * DGTAB .LONG dog ;type zero .WORD 4 .LONG doggry ;gray type .WORD 3 .LONG blackd ;black type .WORD 2 * *DISPATCH YOUR DOGS *A9=Y:X COORD *A10=OID DOG1X: MOVE @DOGCNT,A0,W MOVE @DOGMAX,A1,W CMP A0,A1 JALE SUCIDE ;TOO MANY DOGS... DOG2X MOVI 30,A0 CALLA SRAND ZEXT A0,W ADDXY A0,A9 ;ADD IN X SPREAD MOVE A9,A1 MOVI DOGINIT,A14 ;DOG ENEMY INIT * A1 = Y:X INITIAL ENEMY POSITION * A10 = OID MMTM A12,A10,A11 ;GET BACK JIVE CALLA ESINITUL ;CREATE DOG JAEQ SUCIDE ;CREATE ERROR, EXIT MMFM A12,A10,A11 ;GET BACK JIVE MOVE A10,*A8(OID),W ;SAVE OBJECT ID MOVE *A11+,A0,L ;DGTAB STUFF CALLA SWAPAL0 MOVE *A11,A0,W MOVE A0,*A13(ETEMP3),W ;SLEEPTIME CLR A1 MOVE A1,*A13(ETEMP4),W ;CLEAR FLIP FLAG MOVE @DOGCNT,A0,W INC A0 MOVE A0,@DOGCNT,W ;INCREMENT THE GLOBAL DOG COUNT CALLA GETCPLY CALLA XZCHK ;GET INITIAL DIRECTION CALLR DOGD0 MOVI DOGRUN,A9 ;GET ANIMATION SCRIPT MOVK 6,A0 CALLA RANDU ;RANDOM STARTING POINT MOVI 48,A1 MPYU A0,A1 ADD A1,A9 JRUC GPLAYR1 * *DO SOME GROWLING * GRRRR0 CALLA PSTOP MOVI DRAG,A9 CALLA RANDOM MOVI DGRR1SND,A0 ;GROWL IT UP JRN GRRRRL0 MOVI TUG,A9 MOVI DGBRKSND,A0 ;BARK IT UP GRRRRL0 CALLA ONESND GRRRRL CLR A1 JSRP FRANIM JRC GRRRR0 CALLA GETCPLY CALLA FACEPLYR MOVI 160,A0 CALLA RANDPER JRNC GRRRRL JRUC GPLAYR * *GET NEAREST PLAYER AND BITE HIM *A8=DOG OBJECT * GPLAYR: MOVI 15,A0 CALLA RANDPER JRC GRRRR0 MOVI DOGRUN,A9 ;GET ANIMATION SCRIPT GPLAYR1: CMPI DOGRUNX,A9 JRHS GPLAYR ;INVALID ANIMATION, RESET... MOVK 4,A1 JSRP FRANIM JRC GPLAYR MOVE *A13(ETEMP3),A0,W ;VARIABLE SLEEP TIME CALLA PRCSLP CALLR DOGSND GPLAYR2 CALLA GETCPLY ;GET CLOSEST PLAYER MOVE *A0(PFLAGS),A7,L BTST BINVINC,A7 ;DUDE INVINCIBLE? JREQ GPLAYR6 ;NO, GO FER IT!! MOVE *A0(PENERGY+16),A1,W CMPI IENERGY,A1 JRNE GPLAYR6 ;A PHONY INVINCIBLE * BTST BBUYIN,A7 * JRNE GPLAYR6 ;BUYIN GO AFTER HIM ANYWAY * BTST BDEAD,A7 * JRNE GPLAYR6 * BTST BDHOLD,A7 ;WOUNDED IGNORE IT * JRNE GPLAYR6 MOVI P2DATA,A2 ;GET THE OTHER PLAYER CMP A2,A0 JRNE GPLAYR3 MOVI P1DATA,A2 GPLAYR3 MOVE A2,A0 MOVE *A0(POBJ),A2,L ;GET EXPECTED PLAYERS OBJECT JRZ GPLAYR4 ;INACTIVE... BAG IT MOVE *A0(PFLAGS),A7,L BTST BINVINC,A7 ;DUDE INVINCIBLE? JREQ GPLAYR6 ;NO, GOFERIT! MOVE *A0(PENERGY+16),A1,W CMPI IENERGY,A1 JRNE GPLAYR6 ;A PHONY INVINCIBLE GPLAYR4 CALLA ZCHK ;KEEP HIM IN BOUNDS MOVE *A13(ETEMP4),A0,W ;ALREADY FLIPPED? JRNE GPLAYR4A MOVE *A8(OFLAGS),A4,W ;FLIP THE SUCKER XORI M_FLIPH,A4 MOVE *A8(OIMG),A1,L ;GET THE CURRENT IMAGE POINTER CALLA ANI ;SETUP THE "NEW" IMAGE MOVK 1,A0 MOVE A0,*A13(ETEMP4),W ;SET FLIP FLAG GPLAYR4A MOVE @DOGSPD,A3,W ;X VELOCITY MOVE *A13(ETEMP1),A4 ZEXT A4,W MPYU A4,A3 SRL 8,A3 ;NORMALIZE IT MOVE *A8(OFLAGS),A1,W BTST B_FLIPH,A1 JRZ GPLAYR5 NEG A3 GPLAYR5 MOVE A3,*A8(OXVEL),L JRUC GPLAYR1 GPLAYR6 CLR A1 MOVE A1,*A13(ETEMP4),W MOVE *A0(POBJ),A0,L ;PLAYER OBJECT MOVI 30,A5 MOVI 10,A6 BTST BDEAD,A7 ;PLAYER DOWN? JREQ GPLYRL1 ;NOPE MOVI 7,A6 ; CLR A1 ;NO X OFFSET MOVI 10,A3 ;Z IN FRONT MOVI 45,A5 CALLA XZCNTCK ;CENTERED XZ CHECK JRNC GPLYRL3 ;NOT CLOSE CMPI 35,A3 ;DOG AT THE END OF DUDE'S BODY JRLS DOGBITE ;NO MOVI >90,A0 ;TRY A DRAG? CALLA RANDPER JRC DOGBITE ;ITS OUR LUCKY DAY JRUC GPLYRL3 GPLYRL1: CALLA XZCHK ;ARE WE IN POSITION? GPLYRL2: JRC DOGBITE ;HE'S WITHIN RANGE GPLYRL3: CALLA ZCHK ;KEEP HIM IN BOUNDS MOVI 400,A0 CALLA RANDPER JRNC GPLAYR1 CALLR DOGDIR ;NO GET DIRECTION JRUC GPLAYR1 *TRY FOR A SOUND DOGSND MOVI 15,A0 ;MAKE A SOUND? CALLA RANDPER JRNC GPLYR20 ;NOPE..... MOVI DGRR1SND,A0 ;GROWL IT UP CALLA ONESND GPLYR20 MOVI 60,A0 ;MAKE A SOUND? CALLA RANDPER JRNC GPLYR30 ;NOPE..... MOVI DGBRKSND,A0 ;BARK IT UP CALLA ONESND GPLYR30 RETS ************************************************************************** *DOG 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) *DOG GROWL DGRWLSND .WORD >F415,>20,>8050,0 *DOG GROWL DGRR1SND .WORD >F415,>60,>8050,0 *DOG BARK DGBRKSND .WORD >F415,>0C,>8051,0 *DOG WHIMPER DGWMPSND .WORD >F416,>20,>8052,0 *DOG HITS THE GROUND DGHTSND .WORD >F015,>08,>804E,0 *DOG BOUNCE SOUND DGBCSND .WORD >F015,>04,>8053,0 *DOG HITS THE CAR DGCARSND .WORD >F016,>A,>8044,>20,>8052,0 * *DOGBITE *LETS BITE THE DUDE *A0=CLOSEST PLAYER DATA AREA *A1=DELTA X *A2=DELTA Z *A3=ABS DX *A4=ABS DZ *A8=DOG OBJECT *A13=DOG PROCESS * DOGBITE: MOVI 250,A0 CALLA RANDPER JRNC DGBT0 MOVI DGRR1SND,A0 JRUC DGBT1 DGBT0 MOVI DGRWLSND,A0 ;GROWL IT UP DGBT1 CALLA ONESND MOVE A1,A1 ;FLIP THE DUDE PROPERLY JRN DOGBIT0 CALLA NOYFLP JRUC DOGBIT1 DOGBIT0: CALLA YFLP DOGBIT1: CALLA PSTOP ;STOP THE DUDE *GET VELOCITY *FLY, CHECK FOR BITE *LAND *CHECK FOR LIE DOWN BTST BDEAD,A7 ;PLAYER DOWN? JREQ DOGBIT2 ;NOPE CMPI 35,A3 ;DOG AT THE END OF DUDE'S BODY JRHS DOGDRG ;NO DGBT2 MOVI 7,A0 CALLA RANDU SLL 5,A0 ADDI LOWBTAB,A0 MOVE *A0,A9,L JRUC BITSHT2 *LOW ATTACK TABLE LOWBTAB .LONG GRR1,GRR2,TEAR1,TEAR2,TUG,DRAG,TUG,GRR2 *DRAG HIM AWAY DOGDRG: CALLA GETCPLY ;SAVE PLAYER STUFF MOVE A0,A10 DOGDRG0 MOVI DRAG,A9 ;DRAG ANIMATION DOGDRGL MOVK 4,A1 JSRP FRANIM MOVE A0,A11 ;SAVE SLEEP TIME JRC DOGDRG0 DOGDRG1 MOVE *A10(PFLAGS),A7,L BTST BDEAD,A7 ;PLAYER STILL DOWN? JREQ GPLAYR ;NOPE MOVI 16,A0 CALLA RANDPER ;QUIT DRAGGING ? JRC GPLAYR ;YIP, ITS GETTING OLD MOVE *A10(POBJ),A0,L ;PLAYER OBJECT CLR A1 ;NO X OFFSET MOVI 10,A3 ;Z IN FRONT CALLA XZCNTCK ;STILL IN RANGE CMPI 45,A3 JRHS GPLAYR PUSH A0 MOVI >18000,A0 ;GET RANDOM DRAG FACTOR CALLA RANDU ADDI >8000,A0 MOVE A0,A3 PULL A0 MOVE A1,A1 JRN DOGDRG2 NEG A3 DOGDRG2 MOVE *A0(OXVAL),A2,L ADD A3,A2 MOVE A2,*A0(OXVAL),L MOVE *A0(OSHAD),A4,L ;DRAG HIS STUPID SHADOW JREQ DOGDRG3 ;NO SHADOW... MOVE A2,*A4(OXVAL),L DOGDRG3 MOVE *A10(PLOBJ),A0,L ;GET OTHER HALF MOVE *A0(OXVAL),A2,L ADD A3,A2 MOVE A2,*A0(OXVAL),L MOVE *A8(OXVAL),A2,L ADD A3,A2 MOVE A2,*A8(OXVAL),L SLEEP 1 DSJ A11,DOGDRG1 JRUC DOGDRGL DOGBIT2: *CHECK FOR A JUMP SHOT BTST BJUMP2,A7 ;IN AIR ? JREQ DOGBIT3 ;NO MOVI 200,A0 CALLA RANDPER ;JUMPER? JRC DOGJMP ;NOPE *SHORT JUMP *GET TAKEOFF FRAMES DOGBIT3 MOVI QKLEAP,A9 ;WERE IN BACK DO SIDE ATTACK MOVE A2,A2 ;TEST DELTA Z JRNN BITSHT0 CALLA SHADST ;START A SHADOW FOR UNSHADOWED FRAMES MOVI QKATTACK,A9 BITSHT0 MOVK 1,A1 JSRP FRANIM ;DO YOUR TAKEOFF MOVI >30000,A0 CALLA RANDU MOVE *A8(OFLAGS),A1,W BTST B_FLIPH,A0 JRZ BITSHT1 NEG A0 BITSHT1 MOVE A0,*A8(OXVEL),L BITSHT2: CALLA GETCPLY MOVE *A0(PFLAGS),A7,L BTST BJUMP2,A7 ;IN AIR ? JREQ BITSHT3 BTST BDEAD,A7 ;PLAYER DOWN? JRNE BITSHT3 ;YES MOVE A0,A10 ;SAVE PLAYER DATA PTR MOVE *A0(PLOBJ),A0,L ;PLAYER OBJECT LEGS MOVE *A0(OYPOS),A2,W MOVE *A0(OSIZEY),A1,W ADD A1,A2 MOVE *A8(OYPOS),A1,W ADDI 8,A1 ;FUDGE FACTOR CMP A1,A2 ;ARE WE HIGH ENOUGH TO BITE JRLS BITSHT3X ;NO... MOVI 35,A5 MOVI 10,A6 CALLA XZCHK ;ARE WE IN XZ POSITION? JRNC BITSHT3X ;NOPE... MOVE A10,A0 BITSHT3 MOVE @WAVE,A1,W CMPI 1,A1 ;WAVE 1? JRNE BITSHT3A ;NO CALLA BOZCHK JRNC BITSHT3A ;NO BOZO TARGET MOVE A0,A10 MOVI 200,A0 CALLA RANDPER JRNC BITSHT3X ;BITE SOME OF THE TIME MOVE A10,A0 BITSHT3A MOVE A0,A2 CALLA KNIFEHIT CALLR DGBLOOD ;MAKE DOG BITE BLEED BITSHT3X: MOVE A8,A0 ;GET RID OF SHADOW FOLKS CALLA DELSHAD MOVK 1,A1 ;DO YOUR LANDING FRAMES JSRP FRANIM JRUC GPLAYR ;START OVER AGAIN *DOG JUMP SHOT AT PLAYER DOGJMP: MOVI FATTACK,A9 MOVE A2,A2 ;TEST DELTA Z JRN DOGJMP0 MOVI LEAP,A9 ;WERE IN BACK DO SIDE ATTACK DOGJMP0 MOVK 1,A1 JSRP FRANIM ;DO YOUR TAKEOFF MOVE A9,*A13(ETEMP2),L ;SAVE RESTART POINT CALLA GETCPLY MOVE A0,A11 ;SAVE DUDES POINTER MOVE *A0(POBJ),A0,L ;PLAYER OBJECT CALLA XZCHK MOVE *A0(OXVEL),A5,L ;GET PLAYER VELOCITY MOVE *A0(OZVEL),A6,L SLL 11,A1 ;ADJUST X VELOCITY SLL 11,A2 ;GET ZVEL MOVI 500,A0 CALLA RANDPER JRNC DOGJMP1 ADD A5,A1 ;ADD PLAYER VELOCITY ADD A6,A2 DOGJMP1: MOVI >30000,A0 ;GET Y VELOCITY CALLA RANDU ADDI >FFFA0000,A0 MOVE A1,*A8(OXVEL),L MOVE A2,*A8(OZVEL),L ADD A2,A0 MOVE A0,*A8(OYVEL),L CALLA SHADST CALLA SHVELCPY CLR A10 ;BITE FLAG MOVE A1,A1 ;FLIP THE DUDE PROPERLY JRN DOGJMP2 CALLA NOYFLP JRUC JUMP1 DOGJMP2: CALLA YFLP JUMP1: MOVE *A13(ETEMP2),A9,L ;GET RESTART POINT JUMPL: MOVK 4,A1 JSRP FRANIM JRC JUMP1 SLEEP 3 MOVE A10,A10 JREQ JUMP2 ;ALEADY BEEN BITTEN *CHECK FOR BITE MOVE *A11(PLOBJ),A0,L ;PLAYER OBJECT LEGS MOVI 8,A4 ;Y OFFSET MOVI 20,A5 ;XRANGE MOVI 10,A6 CALLA XYZCK ;ARE WE IN POSITION JRC JMPBIT ;BITE THE DUDE MOVE *A11(POBJ),A0,L ;PLAYER OBJECT MOVI 8,A4 ;Y OFFSET MOVI 20,A5 ;XRANGE MOVI 10,A6 CALLA XYZCK ;ARE WE IN POSITION JRNC JUMP2 JMPBIT INC A10 MOVE A11,A2 ;GIVE PLAYER KNIFE HIT CALLA KNIFEHIT MOVE A11,A0 CALLR DGBLOOD ;MAKE DOG BITE BLEED JUMP2 CALLA ZCHK ;MAKE SURE Z IN BOUNDS MOVE *A8(OYVEL),A0,L ;EFFECT OF GRAVITY ADDI >0B000,A0,L MOVE A0,*A8(OYVEL),L MOVE *A8(OZVEL),A1,L ;REMOVE Z COMPONENT SUB A1,A0 JRN JUMPL ;UPWARD VEL, NO LAND CALLA DFRMGRND CMPI 10,A1 JRGT JUMPL ;IN THE AIR STILL *LANDING ANIMATION CALLR FNANI ;FIND NEXT ANIMATION CALLA PSTOP ;STOP THE SUCKER MOVE A8,A0 ;OBJECT IN A0 FOR SETZPOS CALLA SETZPOS ;ADJUST THE MUTHA CALLA DELSHAD ;RESET YOUR SHADOW * CALLA SHADST MOVK 1,A1 ;DO YOUR LANDING FRAMES JSRP FRANIM JRUC GPLAYR ;START OVER AGAIN * *FIND NEXT ANIMATION *A9=SCRIPT, RETURNED WITH NEXT ANIMATION * FNANI: PUSH A0 FNANIL MOVE *A9+,A0,L JREQ FNANIX ADDK 16,A9 JRUC FNANIL FNANIX PULL A0 RETS * *CHECK X Y Z *A0=OBJECT SEEKED *A4=Y OFFSET *A5=XRANGE *A6=ZRANGE *RETURNS CARRY IF IN RANGE *A1,A2,A3,A4 AS XZCHK XYZCK: MOVE *A0(OFLAGS),A2,W SLL 28,A2 JREQ XYZFL ;OBJECT NOT ACTIVE MOVE *A0(OYPOS),A2,W MOVE *A0(OSIZEY),A1,W ADD A2,A1 MOVE *A8(OYPOS),A3,W ADD A4,A3 ;FUDGE FACTOR CMP A3,A1 ;ARE WE IN Y RANGE ? JRHS XYZFL ;OUT OF RANGE CMP A3,A2 JRLS XYZFL CALLA XZCHK ;ARE WE IN POSITION RETS XYZFL CLRC RETS * *DOG BLOOD START *A8=DOG, A0=PLAYER DATA * DGBLOOD: MMTM SP,A8,A9,A11 MOVE *A8(OID),A11,W MOVE *A8(OYPOS),A9,W ADDI 5,A9 ;ADJUST FOR KNIFE POSITION MOVE *A0(PFLAGS),A7,L BTST BDEAD,A7 ;PLAYER DOWN? JREQ DGBLD00 MOVI >007A000C,A9 ;Y:X OFFSET CREATE 0EDH,SPLATS JRUC DGBLD1 DGBLD00 BTST BSWALK,A7 JREQ DGBLD0 ADDI 15,A9 ;LOWER BLOOD FOR SQUAT WALK DGBLD0: MOVE *A0(POBJ),A8,L CREATE 0EDH,SPLATBOX DGBLD1 MMFM SP,A8,A9,A11 RETS * *BLINK DOG EYE *A11=PALETTE *A10=PID DOGEYE: SLEEP 1 MOVE A10,A0 CLR A1 NOT A1 CALLA EXISTP JRNE DEDIE ;ALREADY EXISTS SLL 28,A10 SRL 22,A10 ADDI ICOLTAB,A10 DOG0LP MOVE A10,A9 DOGILP: MOVE @DOGCNT,A0 JREQ DEDIE MOVE A11,A0 CALLA FINDPAL JREQ DEDIE MOVE A0,A8 ;KEEP PALETTE POSITION SLL 24,A8 SRL 16,A8 ADDI 241,A8 ;ADD IN EYE COLOR VALUE MOVE A8,A1 MOVK 1,A2 MOVE A9,A0 CALLA PALSET SLEEP 5 ADDK 16,A9 MOVE *A9,A0,W JREQ DOG0LP JRUC DOGILP DEDIE JAUC SUCIDE * * R G B *DOG EYE COLOR TABLE *0=END ICOLTAB .WORD 1 ;BLACK .word (31*32*32)+(0 *32)+( 0 ) ;RED .word (31*32*32)+(31*32)+( 31 ) ;WHITE .WORD 0 *GREY GUY WITH RED/GOLD .word (31*32*32)+(0 *32)+( 0 ) .word (31*32*32)+(31*32)+( 0) .word (31*32*32)+(0 *32)+( 0 ) .WORD 0 *BLACK GUY WITH BLUE GLOWERS .word (31*32*32)+(31*32)+( 31 ) ;WHITE .word (0*32*32)+(0 *32)+( 20 ) .word (0*32*32)+(0 *32)+( 31 ) .WORD 0 ICOLTEND * *GET DIRECTION FOR DOG *A1=DELTA X *A2=DELTA Z *A3=ABS DX *A4=ABS DZ *A8=OBJECT *A13=PROCESS DOGDIR: MOVI 200,A0 CALLA RANDPER JRNC DOGD1 DOGD0 MOVI >4000,A0 ;GET RANDOM VELOCITY FACTOR CALLA RANDU ADDI >BFFF,A0 MOVE A0,*A13(ETEMP1),W DOGD1 MOVE A3,A14 ;SAVE ABS DX MOVE @DOGSPD,A3,W ;X VELOCITY MOVE *A13(ETEMP1),A4 ZEXT A4,W MPYU A4,A3 SRL 8,A3 ;NORMALIZE IT MOVE A3,A4 MOVE *A8(OID),A0,W ;INCREASE VELOCITY FOR SUBTYPES SLL 28,A0 SRL 28,A0 ;MASK THE STUFF OUT JREQ DOGD2 SRL 1,A4 DEC A0 JRNE DOGD10 SRL 1,A4 DOGD10 ADD A4,A3 DOGD2 MOVE A3,A4 SRL 1,A4 ;Z VELOCITY ABS A1 ;NEGATE FOR NEGATIVE X JRN DOGDIR1 NEG A3 DOGDIR1: ABS A2 ;NEGATE FOR NEGATIVE Z JRN DOGDIR2 NEG A4 DOGDIR2: CMPI 4,A2 ;CLEAR ZVEL IF REAL CLOSE JRHI DOGDIR4 CLR A4 DOGDIR4: MOVE *A8(OZPOS),A2,W ;IF OFF SCREEN, COME ON BACK MOVE @PLZMIN,A1,W CMP A1,A2 JRGE DOGDIR44 MOVI >1000,A4 DOGDIR44: MOVE A4,*A8(OYVEL),L MOVE A4,*A8(OZVEL),L CMPI 30,A14 ;DONT CHANGE XVEL IF CLOSE (ANTI STAIRSTEP) JRHS DOGDIR5 MOVE *A8(OXVEL),A14,L JREQ DOGDIR5 MOVE A14,A3 DOGDIR5: MOVE A3,*A8(OXVEL),L ;STORE VELOCITY JAUC SHVELFLP * *EXPLOSION VELOCITY *A8=OBJECT, A6=SHIT THAT HIT YOU * EXPVEL: CALLA PSTOP ;BLOW DUDE INTO THE AIR MOVI >50000,A0 ;GET RANDOM Y VELOCITY CALLA RANDU ADDI >1C000,A0 MOVE A0,A3 NEG A3 MOVI >30000,A0 ;GET RANDOM X VELOCITY CALLA RANDU ADDI >C000,A0 ;ADD IN BIAS MOVE *A6(OXVEL+>10),A14 ;GET ROCKET VELOCITY JREQ CLNEX1 JRNN CLNEX2 NEG A0 JRUC CLNEX2 CLNEX1: ;ZERO VELOCITY CASE, (EXPLOSION) SUBI >18000,A0 ;REMOVE BIAS CALLA GETCPNT SWAP A6,A8 MOVE A1,A2 ;A2=CLOWN CENTER CALLA GETCPNT SWAP A6,A8 ;A1=EXPLOSION CENTER SUBXY A1,A2 JRXNN CLNEX2 NEG A0 CLNEX2: MOVE A0,*A8(OXVEL),L MOVI >6000,A0 ;GET RANDOM Z VELOCITY CALLA SRAND MOVE A0,*A8(OZVEL),L ADD A0,A3 MOVE A3,*A8(OYVEL),L CALLA SHVELCPY CLNEXP0: RETS * *ROCKET, EXPLOSION KILL *A0 = PTR TO DOG OBJECT *A8 = PTR TO OBJECT THAT SMASHED HIM * DOGCOL0 MOVE *A8(OID),A11,W ;GET ENEMY ID FOR POINTS MOVE A8,A6 MOVE A0,A8 CALLA SCRKIL CALLR EXPVEL MOVI DUMCOLL,A0 MOVE A0,*A8(OCVECT),L ;COLLISION POINTER NULL FOR NOW MOVE *A8(OPLINK),A0,L MOVI 0EDh,A1 MOVI CHIFLY,A7 CALLA XFERPROC ;CREATE A CHIHUAHUA FLYER DOGCOLX CLRC ;TELL COLLISION SCANNER NOT TO DELETE RETS * *FLY CHIHUAHUA FLY * CHIFLY: MOVE A8,A0 ;DONT CREATE 2 SHADOWS CALLA DELSHAD CALLA SHADST CALLA SHVELCPY CHIFLY00: MOVI CHIBLO,A9 ;FLIP HIM OVER MOVK 4,A1 JSRP FRANIM MOVE *A8(OYPOS),A10,W MOVE @CHIBLO,A1,L MOVE *A8(OFLAGS),A4,L XORI M_FLIPV,A4 CALLA RANDOM ANDI M_FLIPH,A0 ;RANDOM HFLIP XOR A0,A4 CALLA ANI MOVE A10,*A8(OYPOS),W ;RESET YOUR Y COORD FOR IN PLACE FLIP CHIFLY0: MOVI CHIBLO,A9 ;DO YOUR BLO UP ANIMATION * CLR A10 CHIFLYL: * DEC A10 * JRNN CHIFLY1 * MOVK 1,A10 MOVK 4,A1 JSRP FRANIM JRC CHIFLY0 CHIFLY1 CALLA ZCHK SLEEP 3 MOVE *A8(OYVEL),A0,L ;EFFECT OF GRAVITY ADDI >5000,A0 MOVE A0,*A8(OYVEL),L MOVE *A8(OZVEL),A1,L ;SUBTRACT OUT Z COMPONENT SUB A1,A0 JRN CHIFLYL ;CANT LAND WITH NEGATIVE Y VEL. CALLA DFRMGRND JRNN CHIFLYL ;STILL GOING CMPI >1A000,A0 JRLS DOGLAND SRA 1,A0 ;BOUNCE VELOCITY NEG A0 MOVE *A8(OZVEL),A1,L ;CUT DOWN Z SRA 1,A1 MOVE A1,*A8(OZVEL),L ADD A1,A0 MOVE A0,*A8(OYVEL),L ;CUT DOWN Y MOVE *A8(OXVEL),A0,L ;CUT DOWN X SRA 1,A0 MOVE A0,*A8(OXVEL),L CALLA SHVELCPY MOVI DGBCSND,A0 ;MAKE DOG BOUNCE SOUND CALLA ONESND JRUC CHIFLY00 DOGLAND: MOVI DGHTSND,A0 ;MAKE DOG HIT SOUND CALLA ONESND CALLA PSTOP ;STOP THE SUCKER MOVE A8,A0 ;OBJECT IN A0 FOR SETZPOS CALLA SETZPOS ;ADJUST THE MUTHA DECW @DOGCNT ;CUT DOWN DOGGIES MOVI [1,1],A9 CREATE 0DFh,ESINK ;CREATE THE DEADMAN SINK JAUC SUCIDE ;DIE * *DOG HIT BY A CAR *A0 = PTR TO DOG OBJECT *A8 = PTR TO OBJECT THAT SMASHED HIM * DOGCAR: CALLA CARCHK JRNC DOGCOLX PUSH A0 MOVI DGCARSND,A0 ;FAST CAR DO IT CALLA ONESND PULL A0 JRUC DOGCOL0 * *DOG BULLET COLLISION ROUTINE *A0 = PTR TO DOG OBJECT *A8 = PTR TO OBJECT THAT SMASHED HIM DOGBUL MOVE *A8(OID),A11,W ;GET ENEMY ID FOR POINTS MOVE A8,A10 ;SAVE BULLET MOVE A0,A8 ;PASS WASTED GUYS POINTER CALLA SCRKIL MOVI DUMCOLL,A14 MOVE A14,*A0(OCVECT),L ;COLLISION POINTER NULL FOR NOW CALLA DFRMGRND ;IS HE IN THE AIR? CMPI 4,A1 JRLT DOGBUL1 MOVI 4,A2 MOVE *A8(OXVEL+>10),A0,W ;GIVE HIM A SHOVE MOVE *A10(OXVEL),A1 JRNN DOGBUL0 NEG A2 DOGBUL0: ADD A2,A0 MOVE A0,*A8(OXVEL+>10),W MOVI CHIFLY,A7 JRUC DOGBUL2 DOGBUL1: MOVI CHICHI,A7 DOGBUL2: MOVE *A8(OPLINK),A0,L MOVI 0EDh,A1 CALLA XFERPROC ;CREATE A CHIHUAHUA CLRC ;TELL COLLISION SCANNER NOT TO DELETE RETS * *CHIHUAHUA RUN OFF SCREEN *A8=OBJECT CHICHI: CALLA PSTOP MOVE A8,A0 ;DONT CREATE 2 SHADOWS CALLA DELSHAD CALLA SHADST MOVI DGWMPSND,A0 CALLA ONESND MOVI 3,A1 ;FLIP HIM AROUND AND SCAMPER AWAY CALLA GETCPLY ;GET CLOSEST PLAYER MOVE *A0(POBJ),A0,L ;PLAYER OBJECT CALLA XZCHK MOVI >20000,A0 CALLA RANDU ADDI >20000,A0 MOVE A1,A1 JRN CHICHI0 NEG A0 CALLA YFLP JRUC CHICHI2 CHICHI0 CALLA NOYFLP CHICHI2 MOVE A0,*A8(OXVEL),L CALLA SHVELCPY CHILP MOVI LILDOG,A9 MOVI 1,A1 JSRP FRANIM MOVE @WORLDTL,A0,W ;CHECK FOR FAR OFF SCREEN ADDI 256,A0 ;NORMALIZE FOR SCREEN CENTER MOVE *A8(OXPOS),A1,W SUB A0,A1 ABS A1 CMPI 300,A1 JRLS CHILP ;NOT GONE YET MOVE @DOGCNT,A0,W DEC A0 MOVE A0,@DOGCNT,W MOVE A8,A0 ;GET OBJECT DESCRIPTOR CALLA DELENEMY ;DELETE OBJECT AND QUIT JAUC SUCIDE * *STFOBJ INITIALIZING DATA * .LONG OXVEL,OYVEL,OXVAL,OYVAL * .WORD OZPOS,OZVEL * .LONG OIMG,OZSIZ,OCVECT * .WORD OFLAGS,OID DOGINIT .LONG 0,0,0,0 .WORD 0,0 .LONG dog3,LOFZ,DOGCOLL .WORD DMAWNZ,DOGOID .LONG DOGBLIP *COLLISION TABLE DOGCOLL .WORD B1OID|BULLETID .LONG DOGBUL .WORD B1OID|EXPLODID .LONG DOGCOL0 .WORD B1OID|ROCKETID .LONG DOGCOL0 .WORD B2OID|BULLETID .LONG DOGBUL .WORD B2OID|EXPLODID .LONG DOGCOL0 .WORD B2OID|ROCKETID .LONG DOGCOL0 .WORD BEOID|EXPLODID .LONG DOGCOL0 .WORD TRAN1OID+CBODYID .LONG DOGCAR .WORD TRAN2OID+CBODYID .LONG DOGCAR .WORD TRAN2OID+WSHLDID .LONG DOGCAR .WORD C1OID+CBODYID .LONG DOGCAR .WORD 0 .LONG DUMRTSG *DDUMCL0 ;DOG DUMCOLL * .WORD 0 * .LONG DUMRTSG *DDUMCL1 * .WORD 0 * .LONG DUMRTSG *LOFFREDO FRAME TABLES *NORMAL TABLE ENTRY: * .LONG FRAME1 * .WORD SLEEPT,FLIP_FACTOR * .LONG FRAME2 * . * . * . *SPECIAL ENTRY(FOR STORED OFFSETS AND PROCESSES) * .LONG FRAME1 * .WORD -SLEEPT,XOFF,YOFF,PROC. ID * .LONG PROCESS STARTING ADDRESS * .WORD FLIP_FACTOR * .LONG FRAME2 * *DOG RUN * DOGRUN: .LONG dog3 .WORD 4 .LONG dog4 .WORD 4 .LONG dog1 .WORD 4 .LONG leap1 .WORD 4 .LONG leap2 .WORD 4 .LONG dog2 .WORD 4 .LONG 0 DOGRUNX: * *ATTACKING SEQUENCES * *QUICK FRONTAL ATTACK * QKATTACK: .LONG atack1 .WORD 6 .LONG atack2 .WORD 6 .LONG atack3 .WORD 9 .LONG 0 .LONG atack2 .WORD 6 .LONG atack1 .WORD 6 .LONG 0 * *DOG QUICK LEAP (SIDE BITE) * QKLEAP: .LONG leap1 .WORD 4 .LONG leap2 .WORD 4 .LONG leap3 .WORD 8 .LONG 0 .LONG leap2 .WORD 6 .LONG leap1 .WORD 6 .LONG 0 * *LEAP (LUNGE AT PLAYER) * LEAP: *TAKEOFF .LONG leap1 .WORD 3 .LONG leap2 .WORD 3 .LONG leap3 .WORD 3 .LONG 0 *IN AIR .LONG atack12 .WORD 3 .LONG atack12 .WORD 3 .LONG atack13 .WORD 3 .LONG atack13 .WORD 3 .LONG atack14 .WORD 3 .LONG atack14 .WORD 3 .LONG 0 *LANDING .LONG leap3 .WORD 5 .LONG leap1 .WORD 5 .LONG 0 * *FRONTAL LEAP ATTACK * FATTACK: .LONG atack1 .WORD 3 .LONG atack2 .WORD 3 .LONG 0 *IN AIR .LONG atack3 .WORD 3 .LONG atack4 .WORD 3 .LONG atack10 .WORD 3 .LONG atack5 .WORD 3 .LONG atack6 .WORD 3 .LONG atack7 .WORD 3 .LONG atack8 .WORD 3 .LONG atack4 .WORD 3 .LONG atack5 .WORD 3 .LONG atack6 .WORD 3 .LONG atack5 .WORD 3 .LONG atack3 .WORD 3 .LONG 0 *LAND .LONG atack2 .WORD 3 .LONG atack1 .WORD 3 .LONG 0 * *TUG * TUG: .LONG drag2 .WORD 6 .LONG drag3 .WORD 6 .LONG drag1 .WORD 6 .LONG drag4 .WORD 6 .LONG 0 * *GRRR ...LOW ATTACK * GRR1: .LONG leap1 .WORD 5 .LONG leap3 .WORD 5 .LONG leap2 .WORD 5 GRR2: .LONG growl1 .WORD 5 .LONG growl2 .WORD 5 .LONG 0 * *TEAR ATTACK * TEAR1: .LONG tear1 .WORD 5 .LONG tear2 .WORD 5 .LONG tear3 .WORD 5 .LONG tear4 .WORD 5 .LONG tear5 .WORD 5 .LONG tear6 .WORD 5 .LONG tear4 .WORD 5 .LONG tear2 .WORD 5 .LONG 0 TEAR2: .LONG tear2 .WORD 5 .LONG tear3 .WORD 3 .LONG tear4 .WORD 2 .LONG tear5 .WORD 5 .LONG tear6 .WORD 5 .LONG tear5 .WORD 3 .LONG tear4 .WORD 2 .LONG tear3 .WORD 3 .LONG tear2 .WORD 2 .LONG 0 * *DOG DRAG OFF CORPSE * DRAG: .LONG drag4 .WORD 8 .LONG drag5 .WORD 8 .LONG drag6 .WORD 8 .LONG drag7 .WORD 8 .LONG 0 * *LITTLE DOGGIE RUN AWAY * LILDOG: .LONG smdog1 .WORD 3 .LONG smdog2 .WORD 3 .LONG smdog3 .WORD 3 .LONG smdog4 .WORD 3 .LONG smdog5 .WORD 3 .LONG smdog6 .WORD 3 .LONG 0 CHIBLO: .LONG smdog1 .WORD 5 .LONG smdog4 .WORD 5 .LONG smdog2 .WORD 5 .LONG smdog6 .WORD 5 .LONG smdog3 .WORD 5 .LONG smdog5 .WORD 5 .LONG 0