narc/NARC/NARCDOG.ASM

1321 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 '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