narc/NARC/NARCDOG.ASM

1321 lines
24 KiB
NASM
Raw Permalink Normal View History

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