narc/NARC/NARCLOWN.ASM

1865 lines
35 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 'NARCLOWN.ASM'
.TITLE " <<< c l o w n - S L A S H E R >>>"
**************************************************************************
* *
* 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 "IMGTBL.GLO"
.INCLUDE "NARCEQU.ASM" ;NARC Equates
.INCLUDE "NARCTEQU.ASM" ;TODD JIZZ
.INCLUDE "NARCLOWN.TBL" ;Image Label Equates
.GLOBAL PORSCHE1
.GLOBAL ZCHK,XZCNTCK,CARCHK
.GLOBAL CLWNDISP,CLNSNDST
* .GLOBAL HKCOLL
.GLOBAL CLWNCRM1,OIDATA
.TEXT
*
*CLOWN DISPATCHER
*
*CLWNDISP:
* CREATE 0CDH,CLWAIT
* RETS
*CLWAIT:
* SLEEP 30
* CREATE 0E1H,CLNSND
*CLWNDIS1:
* MOVE @KNAPCNT,A0,W ;HOW MANY CLWN BABIES?
* CMPI 1,A0
* JRHS CLWNDIS4 ;DON'T NEED MORE
* MOVI >0E60,A14
* CLR A5
* CALLR CLWNCOLD
*CLWNDIS4:
* SLOOP 30,CLWNDIS1 ;WAIT FOR THEM TO DIE
*
*CLOWN ENTRY SOUND PROCESS
*
CLNSNDST
CREATE INDPID,CLNSND
RETS
CLNSND:
SLEEP 4 ;WAIT FOR CLOWNS TO COME OUT
MOVE @KNAPCNT,A0,W
JREQ CLNSND
MOVI CLTUNSND,A0,L ;PLAY CLOWN TUNE... THEIR COMING
CALLA ONESND
SLEEP 300
MOVI CLAFSND,A0,L
CALLA ONESND
JAUC SUCIDE
*
*CLOWN COLD START
*A5=Y:X COORDINATE
*A14=SUBTYPE B0-3
CLWNCOLD:
MOVE A14,A10
MOVE A5,A9
CREATE >0E60,CLOWN
MOVE A10,A1
SLL 28,A1
SRL 22,A1
ADDI CLNPTAB,A1
ADDI ETEMP4,A0 ;LOAD ETEMP4,5,6
MOVE *A1+,*A0+,W
MOVE *A1+,*A0+,W
MOVE *A1,*A0,W
RETS
*
*CLOWN PROCESS
*A9=XY COORD
*A10= OID
*ETEMP4=JUMP PROB
*ETEMP4+>10=GIRL PROB
*ETEMP5=GIVEUP PROB
*
CLOWN:
MOVE @KNAPCNT,A0,W ;HOW MANY CLOWNS?
MOVE @CLWNMAX,A1,W
CMP A0,A1
JALS SUCIDE ;DON'T NEED MORE
MOVE A9,A9 ;PRESET COORD?
JRNE CLWN2XX ;YES, USE IT
MOVE @WORLDTL,A1,W ;COME FROM EDGE OF SCREEN
CALLA RANDOM
MOVE A0,A0
JRN CLWN2X
ADDI 512,A1 ;START HIM AT RIGHT SCREEN EDGE
CLWN2X:
ZEXT A1
MOVE @PLYMIN,B0,W
MOVE @PLYMAX,B1,W
CALLA RANGRAND
SUBI 74,A0
SLL 16,A0
ADD A0,A1
MOVE A1,A9
CLWN2XX:
MOVE *A13(ETEMP4),A0,W ;GET JUMP PROB
CALLA RANDPER
JRNC CLWN1X
JSRP JUMPER ;LETS DO A JUMPER
CMPI P1DATA,A11
JREQ GPLAYR ;WERE AFTER PLAYER
CMPI P2DATA,A11
JREQ GPLAYR
JRUC GHOOKR ;WERE AFTER HOOKERS
CLWN1X:
MOVE A9,A1 ;GET Y:X COORD
MOVI [1,1],A5 ;SET SPEED
MOVI CLWNTAB,A6
MOVI CLWNINIT,A14 ;CLOWN ENEMY INIT
MMTM SP,A10
CALLA ESINITUL ;CREATE CLOWN
MMFM SP,A10
JAEQ SUCIDE ;CREATE ERROR, EXIT
CALLR CLNSETUP
JRUC CLOWNST
*
*CLOWN PROBABILITY TABLE
*
JMPROB .SET >00 ;JUMP PROB
GRLPROB .SET >10 ;GET GIRL PROB
QTPROB .SET >20 ;QUIT PROB
CLNPTAB:
.WORD 500,750,750,0 ;NORMAL DUDE
.WORD 500,700,000,0 ;DOESN'T GIVE UP
.WORD 500,1000,750,0 ;GIRL GETTER
.WORD 1000,700,750,0 ;JUMPER
*
*CLOWN SETUP
*A8=OBJECT
*A10=OID
*A13=PROCESS
*
CLNSETUP:
MMTM SP,A0,A1 ;PUSH REGGIES
MOVE A10,*A8(OID),W ;SAVE OBJECT ID
CLR A0
MOVE A0,*A13(ETEMP2),L ;NO GIRL YET...
MOVE @CLWNSHT,A0,W ;SHOTS TO TAKE
MOVE A0,A1
CALLA RANDU
ADD A1,A0
MOVE A0,*A13(ETEMP3),W ;SETUP SHOT COUNT
MOVE @KNAPCNT,A0,W
INC A0
MOVE A0,@KNAPCNT,W ;INCREMENT CLOWN COUNT
MMFM SP,A0,A1
RETS
*
*ETEMP2=GOT HOOKER FLAG
*ETEMP3=SHOT COUNT
*ETEMP4=JUMPER PROB
*ETEMP4+>10=GIRL PROB
*ETEMP5=GIVEUP PROB
CLOWNST:
CLR A0
MOVE A0,*A13(ETEMP2),L ;NO GIRL YET...
MOVE *A13(ETEMP4+>10),A0,W ;GET HOOKER %
CALLA RANDPER
JRC GHOOKR
*
*GET NEAREST PLAYER AND STAB HIM
*A8=CLOWN OBJECT
*
GPLAYR:
MOVI CLWNWLK,A9
CALLA RANDOM
JRN GPLAYR1
MOVI CLWNRUN,A9
GPLAYR1:
CALLA GETCHOK ;IF CLOSE HOOKER, BAG HER
JRNE GHOOKR
CMPI CLWNRE,A9
JRHS GPLAYR ;INVALID ANIMATION, RESET...
MOVK 4,A1
JSRP FRANIM
MOVE A0,A10 ;SAVE SLEEP TIME
JRC GPLAYR
GPLAYRL:
CALLA GETCPLY ;GET CLOSEST PLAYER
MOVE *A0(PFLAGS),A7,L
MOVI 25,A5
MOVI 15,A6
MOVE *A0(POBJ),A0,L ;PLAYER OBJECT
BTST BDEAD,A7 ;PLAYER DOWN?
JREQ GPLYRL1 ;NOPE
MOVI 7,A6
CLR A1 ;NO X OFFSET
MOVI -5,A3
CALLA XZCNTCK ;CENTERED XZ CHECK
JRUC GPLYRL2
GPLYRL1:
CALLA XZCHK ;ARE WE IN POSITION
GPLYRL2:
JRNC GPLAYR2 ;NO, GET DIRECTION
GPLAYRL0
BTST BJUMP2,A7 ;IN AIR ?
JRNE GPLAYR20 ;YES, BE STUPID
CMPI 15,A3
JRHS CLSTAB ;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:
CMPI 80,A3 ;CLOSE ENOUGH TO JUMP?
JRHS GPLAYR3
CMPI 80,A4
JRHS GPLAYR3
MOVI 10,A0
CALLA RANDPER
JRNC GPLAYR3
JSRP JUMPLIL ;DO A LITTLE JUMP
JRUC GPLAYRL
GPLAYR3:
CALLR CLWNDIR ;NO GET DIRECTION
GPLAYR20:
SLEEP 1
DSJ A10,GPLAYRL
JRUC GPLAYR1
*
*XZCNTCK
*X CHECK IS ON OBJECT CENTERS NOT ANIMATION POINT
*CALLING PARAMETERS:
*A0=OBJECT SEEKED
*A1= X OFFSET FROM SEEKED OBJECT
*A3= Z OFFSET
*A5=X RANGE
*A6=Z RANGE
*A8=OBJECT SEEKING
*RETURNS:
*CARRY SET IF HE IS CLOSE ENOUGH
*A1=DELTA X
*A2=DELTA Z
*A3=ABS DELTA X
*A4=ABS DELTA Z
XZCNTCK:
MOVE *A0(OSIZEX),A2,W
SRL 1,A2
ADD A1,A2
MOVE *A0(OXPOS),A1,W
ADD A2,A1
MOVE *A0(OZPOS),A2,W
ADD A3,A2
MOVE *A8(OSIZEX),A4,W
SRL 1,A4
MOVE *A8(OXPOS),A3,W
ADD A4,A3
MOVE *A8(OZPOS),A4,W
SUB A4,A2
SUB A3,A1
MOVE A1,A3
MOVE A2,A4
ABS A3
ABS A4
CMP A5,A3
JRNC XZCNTX
CMP A6,A4
XZCNTX:
RETS
*
*CLOWN BLOOD START
*A8=CLOWN, A0=PLAYER DATA
*
CLBLOOD:
MMTM SP,A8,A11
MOVE *A8(OID),A11,W
MOVE *A8(OYPOS),A9,W
ADDI 25,A9 ;ADJUST FOR KNIFE POSITION
MOVE *A0(PFLAGS),A8,L
BTST BSWALK,A8
JREQ CLBLD0
ADDI 8,A9 ;LOWER BLOOD FOR SQUAT WALK
CLBLD0:
MOVE *A0(POBJ),A8,L
CREATE 0EDH,SPLATBOX
MOVI 15,A8
MOVE A8,*A0(PTIME),W ;DELAY START OF BLOOD
MMFM SP,A8,A11
RETS
*STAB THE SUCKER, GACY BABY
CLSTAB:
MOVE A1,A1 ;FLIP THE DUDE PROPERLY
JRN CLSTAB0
CALLA NOYFLP
JRUC CLSTAB1
CLSTAB0:
CALLA YFLP
CLSTAB1:
CALLA PSTOP ;STOP THE DUDE
CALLA GETCPLY
MOVE A0,A2 ;GIVE PLAYER KNIFE HIT
CALLA KNIFEHIT
MOVE *A0(PFLAGS),A1,L
BTST BDEAD,A1 ;PLAYER LYING DOWN?
JREQ STABHI ;NO, UPRIGHT...
*STAB HIM LOW DOWN
MOVE *A0(POBJ),A2,L ;FLIP THE DUDE OPPOSITE TO PLAYER
MOVE *A2(OFLAGS),A1,L
BTST B_FLIPH,A1
JRZ CSTBLO1
CALLA NOYFLP
JRUC CSTBLO2
CSTBLO1:
CALLA YFLP
CSTBLO2:
MOVE *A8(OSIZEY),A1,W ;ALREADY LOW?
CMPI 50,A1
JRLS STABLO1 ;YES...
MOVI CLWNKST1,A9
MOVK 1,A1
JSRP FRANIM
STABLO1:
MOVI CLWNKST2,A9
MOVI CLSTBSND,A0
CALLA ONESND
MOVK 1,A1
JSRP FRANIM ;STAB BEFORE SPURT
CALLA GETCPLY
MOVE *A0(PFLAGS),A1,L
BTST BDEAD,A1 ;PLAYER LYING DOWN?
JREQ STABLO2 ;NO, UPRIGHT NO BLOOD WE MISSED
MOVI >007A000C,A9 ;Y:X OFFSET
CREATE 0EDH,SPLATS
STABLO2:
MOVI CLWNKST3,A9
JRUC CLSTAB5
*MAKE SOME BLOOD
STABHI:
CALLR CLBLOOD
CMPI CLWNSTBE,A9 ;JUST FINISHED REG STAB?
JRNE CLSTAB2
MOVI 500,A0
CALLA RANDPER ;GO FOR A REPEAT?
JRNC CLSTAB2 ;NOPE
MOVI STABREP,A2
JRUC CLSTAB3
CLSTAB2:
MOVI STABTAB,A2
MOVI 4,A0
CALLA RANDU
DEC A0
SLL 6,A0
ADD A0,A2
CLSTAB3:
MOVE *A2+,A9,L ;GET ANIMATION
MOVE *A2+,A0,L ;GET SOUND
CLSTAB4:
CALLA ONESND
CLSTAB5:
MOVK 1,A1
JSRP FRANIM ;STAB HIM
MOVI 800,A0
CALLA RANDPER
MOVK 1,A10
JRC GPLAYRL ;GET HIM AGAIN
*LAUGH IT UP
LAFITUP:
MOVI CLAFSND,A0 ;LAUGH IT UP
CALLA ONESND
MOVI CLWNLAF,A9
MOVK 1,A1
JSRP FRANIM
MOVE *A13(ETEMP5),A0,W ;GET QUIT PROB
CALLA RANDPER
JRNC CLOWNST ;GET HIM AGAIN...
*RUN AWAY
MOVE @CLWNSPD,A1,W ;GET VELOCITY
SLL 9,A1 ;NORMALIZE IT
MOVE @RAND,A0,W
JRN RUN0
NEG A1
RUN0:
MOVE A1,*A8(OXVEL),L
CALLA SHVELCPY ;DO IT FOR SHADOW
MOVE A1,A1 ;TEST X VELOCITY
JRN RUN1
CALLA NOYFLP
JRUC RUN2
RUN1:
CALLA YFLP
RUN2:
MOVI 20,A0
CALLA RANDU
MOVE A0,A10
RUNLP:
MOVI CLWNRUN,A9
MOVK 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 350,A1
JRHS RUNLP1 ;BAG IT TOO FAR OUT
DSJS A10,RUNLP
JRUC CLOWNST
*CALL IT QUITS- TOO FAR OFF
RUNLP1:
MOVE @KNAPCNT,A0,W
DEC A0
MOVE A0,@KNAPCNT,W ;DECREMENT CLOWN COUNT
MOVE A8,A0
CALLA DELENEMY ;OFF ENEMY
JAUC SUCIDE ;BAG IT...
*
*STAB ACTION/SOUND TABLE
*
STABTAB:
.LONG CLWNSTAB,CLSTBSND ;REGULAR STAB
.LONG CLWNSTBF,CLSLHSND ;FOREHAND STAB
.LONG CLWNSTBB,CLSLHSND ;BACKHAND STAB
.LONG CLWNSTOH,CLSTBSND ;OVERHEAD SMASH
STABREP:
.LONG CLWNSTB2,CLSTBSND ;QUICKIE REGULAR STAB
*
*JUMP FROM THE GROUND
*A8=CLOWN
*A1=DX, A2=DZ
JUMPLIL:
CALLA SHADST
SLL 10,A1 ;GET XVEL
MOVE A1,*A8(OXVEL),L
SLL 10,A2
MOVE A2,*A8(OZVEL),L
ADDI ->30000,A2
MOVE A2,*A8(OYVEL),L
CALLA SHVELFLP ;SHADOW VELOCITY AND FLIP
JRUC JUMPRC ;DO YOUR JUMP DUDE...
*
*JUMPING CLOWN
*
JUMPER:
* MOVE A9,A1 ;GOT A COORD?
* JRNE JUMPER00 ;YES...
*MAKE YOUR OWN COORDINATE
MOVI 350,A0
CALLA RANDU
ADDI 75,A0
MOVE @WORLDTL,A1,W
ADD A0,A1 ;SET INITIAL X
ZEXT A1
MOVE @PLYMIN,A0 ;GET INITIAL Y
SLL 16,A0
ADD A0,A1
JUMPER00:
MOVI [1,1],A5 ;SET SPEED
MOVI CLWNTAB,A6
MOVI CLWNINIT,A14 ;CLOWN ENEMY INIT
MMTM SP,A10,A11
CALLA ENINITLL ;CREATE CLOWN
MMFM SP,A10,A11
JAEQ SUCIDE ;CREATE ERROR, EXIT
CALLR CLNSETUP ;SETUP SOME STUFF, INC KNAPCNT ETC.
MOVE @PLZMIN,A1,W
MOVE A1,*A8(OZPOS),W
MOVE *A8(OSHAD),A0,L
JREQ JUMPER0
CALLA SHADCPY ;RESET SHADOW AND Z FOR PLZMIN
JUMPER0:
MOVE *A8(OYPOS),A0,W ;SET UP Y HEIGHT
SUBI 100,A0
MOVE A0,*A8(OYPOS),W ;SET UP Y HEIGHT
MOVE *A13(ETEMP4+>10),A0,W ;GET HOOKER %
CALLA RANDPER
JRNC JMPLAY
CALLA GETHOK ;GET CLOSEST HOOKER IN A0
JREQ JMPLAY ;NO HOOKERS AROUND...GET THE PLAYER...
MOVE A0,A11 ;SAVE HOOKER OBJECT
JRUC JMPVEL
JMPLAY:
CALLA SELCTPLY
MOVE A11,A0
CALLA GETPLYR
MOVE *A0(POBJ),A0,L ;GET TARGET
*COMPUTE JUMP VELOCITIES
JMPVEL:
MOVE *A0(OXVAL),A1,L ;COMPUTE X VELOCITY
MOVE *A8(OXVAL),A2,L
MOVE *A0(OXVEL),A3,L
SUB A2,A1
SRA 6,A1
ADD A1,A3
MOVI >C0000,A2 ;CHECK CLOWN VELOCITY LIMITS
CMP A2,A3
JRLT JMPV1
MOVE A2,A3
JMPV1
NEG A2
CMP A2,A3
JRGT JMPV2
MOVE A2,A3
JMPV2
MOVE A3,*A8(OXVEL),L
CALLA FLP ;FLIP
MOVE *A0(OZVAL),A1,L ;COMPUTE Z VELOCITY
MOVE *A8(OZVAL),A2,L
MOVE *A0(OZVEL),A3,L
SUB A2,A1
SRA 6,A1
ADD A3,A1
JRNN JUMPER1
CLR A1 ;NO NEGATIVE Z VELOCITY
JUMPER1:
MOVE A1,*A8(OZVEL),L
ADDI ->10000,A1 ;GET Y VELOCITY
MOVE A1,*A8(OYVEL),L
CALLA SHVELCPY ;COPY VELOCITY TO SHADOW
JUMPRC:
MOVI CLWNJMP,A9 ;JUMP ON THE DUDE
JUMP0:
MOVK 4,A1
JSRP FRANIM
JRNC JUMP1
MOVI CLWNJMP0,A9 ;HOLDING FRAME
JRUC JUMP0
*FALLING GRAVITY PROCESS
JUMP1:
SLEEP 3
CALLR ZCHK ;MAKE SURE Z IN BOUNDS
MOVE *A8(OYVEL),A0,L ;EFFECT OF GRAVITY
ADDI >5000,A0
MOVE A0,*A8(OYVEL),L
JRN JUMP0 ;UPWARD VEL, NO LAND
CALLA DFRMGRND
CMPI 0,A1
JRGT JUMP0 ;IN THE AIR STILL
* MOVI CLWNJMP1,A9 ;LANDING FRAMES
* MOVK 1,A1
* JSRP FRANIM
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
RETP
*
*CHECK Z FOR BOUNDS
*A8=OBJECT
*CLEARS ZV IF OUT OF RANGE
*
ZCHK:
MMTM SP,A0,A1,A2,A3,A4
MOVE *A8(OZPOS),A4,W ;CHECK IF Z LEGAL
MOVE @PLZMIN,A2,W
SUB A2,A4 ;CHECK LOWER BOUND
JRGE ZOK2
ZBAD:
MOVE *A8(OYVEL),A1,L
MOVE *A8(OZVEL),A3,L
SUB A3,A1 ;REMOVE ZVEL FROM YVEL
MOVE *A8(OYPOS),A3,W
SUB A4,A3 ;CORRECT OYPOS ALSO
CLR A0
MOVE A1,*A8(OYVEL),L
MOVE A0,*A8(OZVEL),L
MOVE A3,*A8(OYPOS),W
MOVE A2,*A8(OZPOS),W
MOVE *A8(OSHAD),A0,L ;SET Z POSITION
JREQ ZOK2
CALLA SHADCPY ;RESET SHADOW AND Z FOR PLZMIN
ZOK2:
MMFM SP,A0,A1,A2,A3,A4
RETS
*
*GO GET HOOKER
*
GHOOKR:
GHOOKR0:
MOVI CLWNWLK,A9
CALLA RANDOM
JRN GHOOKR1
MOVI CLWNRUN,A9
GHOOKR1:
CMPI CLWNRE,A9
JRHS GHOOKR ;INVALID ANIMATION, RESET...
MOVK 4,A1
JSRP FRANIM
MOVE A0,A10 ;SAVE SLEEP TIME
JRC GHOOKR0
GHOOKRL:
CALLA GETCHOK ;GET CLOSEST HOOKER IN A0
JRNE GPLAYR10 ;FOUND A CLOSIE
CALLA GETHOK ;GET CLOSEST HOOKER IN A0
JREQ GPLAYR ;NO HOOKERS AROUND...GET THE PLAYER...
GPLAYR10
MOVE A0,A11 ;SAVE HOOKER OBJECT
MOVI 25,A5
MOVI 10,A6
CALLA XZCHK ;ARE WE IN POSITION
JRNC GHOOKR2 ;NO, GET DIRECTION
CMPI 15,A3
JRHS GOTHER ;NOT TOO CLOSE
MOVE *A8(OXVEL),A0,L ;NO X VEL ?
JREQ GHOOKR2 ;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 GHOOKR20
GHOOKR2:
CMPI 80,A3 ;CLOSE ENOUGH TO JUMP?
JRHS GHOOKR3
CMPI 80,A4
JRHS GHOOKR3
MOVI 20,A0
CALLA RANDPER
JRNC GHOOKR3
JSRP JUMPLIL ;DO A SPECIAL LITTLE JUMP
JRUC GHOOKRL
GHOOKR3:
CALLR CLWNDIR ;NO GET DIRECTION
GHOOKR20:
SLEEP 1
DSJ A10,GHOOKRL
JRUC GHOOKR1
*
*STAB THE SUCKER OR DRAG HER OFF... GACY BABY
*A11=HOOKER OBJECT
*
GOTHER:
*PICK HER UP
CALLA PSTOP ;STOP THE CLOWN
*** MOVI 100,A0
*** CALLA RANDPER
*** JRNC STABHER ;STAB HER FIRST
MOVI 1,A1
MOVE A1,*A13(ETEMP2),W ;SET FLAG WE GOT HER
MMTM SP,A8
MOVE A11,A8
CALLA DELENEMY
MMFM SP,A8
MOVE *A11(OPLINK),A0,L ;KILL HER OBJECT
CALLA KILL ;KILL HER PROCESS
DECW @HOOKCNT
MOVI CLSTBSND,A0
CALLA ONESND
MOVI CLNLIFT,A9 ;TAKE HER AWAY
MOVK 1,A1
JSRP FRANIM
CLWNCARL:
MOVI >0001C000,A1
MOVE *A8(OFLAGS),A0,W
BTST B_FLIPH,A0
JREQ CLWNCAR0
NEG A1 ;ADJUST VELOCITY FOR DIRECTION
CLWNCAR0:
MOVE A1,*A8(OXVEL),L
CALLA SHVELCPY ;COPY VELOCITY TO SHADOW
MOVI 250,A0
CALLA RANDPER
JRNC CLNCAR00
MOVI HYELSND,A0 ;LAUGH IT UP DUDE !!!
CALLA ONESND
CLNCAR00:
MOVI CLNCARY,A9 ;TAKE HER AWAY
MOVK 1,A1
JSRP FRANIM
MOVI 25,A0
CALLA RANDPER
JRNC CLWNCAR1
MOVE *A8(OFLAGS),A1,W ;GIVE HIM A FLIP NOW AND THEN
XORI M_FLIPH,A1
MOVE A1,*A8(OFLAGS),W
CLWNCAR1:
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 512,A1
JRHS RUNLP1 ;BAG IT TOO FAR OUT
JRUC CLWNCARL
*STAB HER TO DEATH
*A11=HOOKER OBJECT
*STABHER:
* MOVE A1,A1 ;FLIP THE DUDE PROPERLY
* JRN HKSTAB0
* CALLA NOYFLP
* JRUC HKSTAB1
*HKSTAB0:
* CALLA YFLP
*HKSTAB1:
* CALLA PSTOP ;STOP THE DUDE
**CHANGE HER PROCESS
* MOVI SPLTCOLBOX,A14
* MOVE A14,*A11(OCVECT),L ;COLLISION POINTER CHANGE TO BLOOD
* MOVK 1,A10 ;DEAD INDICATOR
* MOVE *A11(OPLINK),A4,L
* MOVE *A4(PSPTR),A1,L ;GET PROCESS STACK POINTER
* ADDI 4*32,A1
* MOVI HOOKFIT,A2 ;GET NEW WAKEUP ADDR (CLOWN UNFLIP)
* MOVE *A8(OFLAGS),A3,W ;CHECK CLOWN FLIP
* BTST B_FLIPH,A3
* JREQ HKSTAB10
* MOVI HOOKFIT1,A2 ;WAKEUP FOR CLOWN FLIP
*HKSTAB10:
* MOVI 250,A0 ;IS HOOKER DEAD?
* CALLA RANDPER
* JRNC HKSTAB11 ;NO
* MOVI HOOKDIE,A2 ;KILL HER
* MOVI SPLTCOLANI,A14
* MOVE A14,*A11(OCVECT),L ;COLLISION POINTER NULL FOR NOW
* CLR A10
*HKSTAB11:
* MOVE A2,*A1,L
* MOVI 1,A2 ;DELAY FOR DEFENSE
* MOVE A2,*A4(PTIME),W ;SET WAKEUP TIME
**STAB HER
**MAKE SOME BLOOD
* MMTM SP,A8,A11
* MOVE *A8(OID),A11,W
* MOVE *A8(OYPOS),A9,W
* ADDI 25,A9 ;ADJUST FOR KNIFE POSITION
* MOVE *SP,A8,L ;PUT IN OBJECT
* CREATE 0EDH,SPLATBOX
* MOVI 1,A8
* MOVE A8,*A4(PTIME),W ;DELAY START OF BLOOD
* MMFM SP,A8,A11
* CMPI CLWNSTBE,A9 ;JUST FINISHED REG STAB?
* JRNE HKSTAB2
* MOVI 500,A0
* CALLA RANDPER ;GO FOR A REPEAT?
* JRNC HKSTAB2 ;NOPE
* MOVI STABREP,A2
* JRUC HKSTAB3
*HKSTAB2:
* MOVI STABTAB,A2
* MOVI 4,A0
* CALLA RANDU
* DEC A0
* SLL 6,A0
* ADD A0,A2
*HKSTAB3:
* MOVE *A2+,A9,L ;GET ANIMATION
* MOVE *A2+,A0,L ;GET SOUND
* CALLA ONESND
* MOVK 1,A1
* JSRP FRANIM ;STAB HER
* MOVE A10,A10
* JRNZ GHOOKRL ;GET HER AGAIN
*
**SHE IS DEAD... STAB HER LOW OR LAUGH
* MOVI 500,A0
* CALLA RANDPER
* JRC LAFITUP
* MOVI 2,A0
* CALLA RANDU
* ADDK 1,A0
* MOVE A0,A10 ;FORM STAB COUNT
*
**STAB HER LOW
* MOVI CLWNKST1,A9 ;GO DOWN ON HER
* MOVK 1,A1
* JSRP FRANIM
*STABHL01:
* MOVI CLWNKST2,A9
* MOVI CLSTBSND,A0
* CALLA ONESND
* MOVK 1,A1
* JSRP FRANIM ;STAB BEFORE SPURT
* MOVI >007A000C,A9 ;Y:X OFFSET
* CREATE 0EDH,SPLATS
* MOVI CLWNKST3,A9
* MOVK 1,A1
* JSRP FRANIM ;STAB HER
* MOVI 100,A0
* CALLA RANDPER
* JRC LAFITUP ;LAUGH IT UP
* DEC A10
* JRNE STABHL01
* JRUC CLOWNST ;START ALL OVER
*
**
**HOOKER FIGHT (BEING STABBED)
**A8= OBJECT
*HOOKFIT:
* CALLA PSTOP ;STOP MOVING
* CALLA YFLP ;ADJUST FLIP
* MOVI 6,A0 ;GET RANDOM JUMP
* CALLA RANDU
* ADDI 4,A0
* JRUC HOOKFITL
*
*HOOKFIT1:
* CALLA PSTOP ;STOP MOVING
* CALLA NOYFLP
* MOVI 6,A0
* CALLA RANDU
* ADDI -10,A0
*
*HOOKFITL:
* MOVE A13,A12
* ADDI PRCSIZ,A12 ;RESET STACK
* MOVE *A8(OXPOS),A1,W
* ADD A0,A1
* MOVE A1,*A8(OXPOS),W
* MOVE *A8(OSHAD),A2,L
* JREQ HOOKFIT2
* MOVE *A2(OXPOS),A1,W ;COPY TO SHADOW
* ADD A0,A1
* MOVE A1,*A2(OXPOS),W
*HOOKFIT2:
* MOVI HKFIGHT,A9 ;DO YOUR ANIMATION
*HOOKFT2L:
* MOVI 0,A1
* JSRP FRANIM
* JRC HOOKFIT3
*
* MOVI 5,A0
* CALLA RANDU
* ADDI -3,A0
*
* MOVE *A8(OXPOS),A1,W ;A LITTLE RANDOM MOTION FOLKS
* ADD A0,A1
* MOVE A1,*A8(OXPOS),W
* MOVE *A8(OSHAD),A2,L
* JREQ HOOKFT2L
* MOVE *A2(OXPOS),A1,W ;COPY TO SHADOW
* ADD A0,A1
* MOVE A1,*A2(OXPOS),W
* JRUC HOOKFT2L
*HOOKFIT3
* MOVE *A8(OYPOS),A6,W
* SLL 16,A6
* MOVE *A8(OXPOS),A5,W
* MOVY A6,A5
* MOVE *A8(OZPOS),A6,W
*
* CALLA DELENEMY
* DECW @HOOKCNT
* MOVI HOOKEOID|>00100000,A14 ;HOOKER ID
* CALLA HOOKCOLD ;START A HOOKER UP
* JAUC SUCIDE ;ITS ALL OVER...WE GOT AWAY
*
*HOOKER DEAD
*A8=OBJECT
*
*HOOKDIE:
* CALLA PSTOP ;STOP MOVING
* MOVI SPLTCOLBOX,A14 ;MAKE 'EM BLEED...
* MOVE A14,*A8(OCVECT),L ;COLLISION POINTER
* DECW @HOOKCNT
* MOVI >00004000,A0
* MOVE A0,*A8(OYVEL),L
* MOVE A0,*A8(OZVEL),L
* CALLA SHVELCPY ;COPY VELOCITY TO SHADOW
* MOVI HKDIE,A9
* MOVK 1,A1
* JSRP FRANIM
* MOVI DUMCOLL,A14
* MOVE A14,*A8(OCVECT),L ;COLLISION POINTER NULL FOR NOW
* CALLA PSTOP
* SLEEP 120
* MOVI [1,1],A9
* CREATE 0DFh,ESINK ;CREATE THE DEADMAN SINK
* JAUC SUCIDE ;DIE
**************************************************************************
*CLOWN 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)
*CLOWN TUNE SOUND
CLTUNSND .WORD >F3C0,>40,>809A,0
*CLOWN STAB SOUND
CLSTBSND .WORD >F01F,>08,>803A,0
*CLOWN SLASH SOUND
CLSLHSND .WORD >F01F,>08,>804B,0
*CLOWN LAUGH SOUND
CLAFSND .WORD >F020,>10,>804C,0
*CLOWN HIT BY BULLET SOUND
CLBULSND .WORD >F31F,>08,>8096,0
*CLOWN DIE BY BULLET SOUND
CLBDSND .WORD >F020,>08,>8013,0
*CLOWN DIE BY ROCKET
CLRDSND .WORD >F028,>10,>803D,20,>8042,0
*HOOKER MUFFLED YELL
HYELSND .WORD >F020,>10,>8039,0
*HIT BY CAR SOUND
CLCARSND .WORD >F026,>08,>8044,>20,>8042,0
*
*GET HOOKER
*A0=HOOKER FOUND
*NE=NO HOOKER FOUND, EQ=HOOKER FOUND
GETHOK:
MMTM SP,A1
MOVE @ENEMIES,A0,L
JREQ GETHKX ;NOBODY HOME
GETHOKL:
MOVE *A0(OID),A1,W ;GET ID
SRL 4,A1 ;GET RID OF SUBTYPE
SLL 4,A1
CMPI HOOKEOID,A1
JREQ GETHKXX
GETHOKL1
MOVE *A0(OSLINK),A0,L
JRNE GETHOKL
JRUC GETHKX
GETHKXX:
MOVE *A0(OCVECT),A1,L ;GET ID
CMPI SPLTCOLANI,A1 ;NO DEAD BROADS PLEASE
JREQ GETHOKL1
MOVE A1,A1 ;RETURN NE, GOT ONE...
GETHKX:
MMFM SP,A1
RETS
*
*GET CLOSE HOOKER
*A8=CLOWN
GETCHOK:
MMTM SP,A1
MOVE @ENEMIES,A0,L
JREQ GETCHKX ;NOBODY HOME
GETCHOKL:
MOVE *A0(OID),A1,W ;GET ID
SRL 4,A1 ;GET RID OF SUBTYPE
SLL 4,A1
CMPI HOOKEOID,A1
JRNE GETCHKL
MOVE *A0(OCVECT),A1,L ;GET ID
CMPI SPLTCOLANI,A1 ;NO DEAD BROADS PLEASE
JREQ GETCHKL
MOVI 30,A5
MOVI 15,A6
CALLA XZCHK
JRC GETCHKXX ;GOT A CLOSE ONE
GETCHKL:
MOVE *A0(OSLINK),A0,L
JRNE GETCHOKL
JRUC GETCHKX
GETCHKXX:
MOVE A1,A1 ;RETURN NE, GOT ONE...
GETCHKX:
MMFM SP,A1
RETS
*
*GET DIRECTION FOR CLOWN
*A1=DELTA X
*A2=DELTA Z
*A3=ABS DX
*A4=ABS DZ
*A8=OBJECT
*
CLWNDIR:
MOVE A3,A14 ;SAVE ABS DX
MOVE @CLWNSPD,A3,W ;X VELOCITY
SLL 8,A3 ;NORMALIZE IT
MOVE A3,A4
SRL 1,A4 ;Z VELOCITY
ABS A1 ;NEGATE FOR NEGATIVE X
JRN CLNDIR1
NEG A3
CLNDIR1:
ABS A2 ;NEGATE FOR NEGATIVE Z
JRN CLNDIR2
NEG A4
CLNDIR2:
CMPI 4,A2 ;CLEAR IF REAL CLOSE
JRHI CLNDIR4
CLR A4
CLNDIR4:
MOVE *A8(OZPOS),A2,W ;IF OFF SCREEN, COME ON BACK
MOVE @PLZMIN,A1,W
CMP A1,A2
JRGE CLNDIR44
MOVI >1000,A4
CLNDIR44:
MOVE A4,*A8(OYVEL),L
MOVE A4,*A8(OZVEL),L
CMPI 30,A14 ;DONT CHANGE XVEL IF CLOSE (ANTI STAIRSTEP)
JRHS CLNDIR5
MOVE *A8(OXVEL),A14,L
JREQ CLNDIR5
MOVE A14,A3
CLNDIR5:
MOVE A3,*A8(OXVEL),L ;STORE VELOCITY
JAUC SHVELFLP
*
*CLOWN COLLSION ROUTINE
*A0 = PTR TO CLOWN OBJECT
*A8 = PTR TO OBJECT THAT SMASHED HIM
*
*HIT BY A BULLET
*
CLWNBUL:
MOVE *A0(OPLINK),A3,L
MOVE *A3(ETEMP3),A1,W ;DECREMENT HIT COUNT
CMPI 3,A1
JRHS CLWNB0
*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
CLWNB0:
DEC A1
MOVE A1,*A3(ETEMP3),W
JRGT CLNBUL0 ;NOT DEAD YET...
*DEATH BY BULLET
MOVE *A8(OXVEL),A1,L ;GIVE HIM BULLET VELOCITY
SRA 2,A1
MOVE A1,*A0(OXVEL),L
MOVE *A0(OSHAD),A2,L
JREQ CLNBL000
MOVE A1,*A2(OXVEL),L
CLNBL000
CALLR CLNCLNUP ;HE IS DEAD
MOVI CLBDSND,A0 ;MAKE BULLET DIE SOUND
CALLA ONESND
MOVI 0EDh,A1
MOVI CLNDIE1,A7
CALLA GETPRC ;CREATE A NEW ENEMY DEATH PROCESS
JRUC CLNCOLX
CLNBUL0:
MOVK 12,A2 ;FIND BULLET DIRECTION
CLNBUL00:
MOVE *A8(OXVEL+>10),A1,W
JRNN CLNBUL1
NEG A2
CLNBUL1:
MOVE A0,A8
MOVE *A8(OXPOS),A1,W ;KNOCK HIM A BIT
ADD A2,A1
MOVE A1,*A8(OXPOS),W
MOVK 10,A0
CALLA SRAND
MOVE *A8(OZPOS),A3,W ;HIT HIM IN Z ALSO
ADD A0,A3
* JRN CLNBL1A
MOVE A3,*A8(OZPOS),W
MOVE *A8(OYPOS),A5,W
ADD A0,A5
MOVE A5,*A8(OYPOS),W
CALLR ZCHK
*CLNBL1A:
MOVE *A8(OSHAD),A0,L
JREQ CLNBUL2
CALLA SHADCPY
CLNBUL2:
MOVI CLBULSND,A0 ;CLOWN BULLET HIT SOUND
CALLA ONESND
CLNCOLX:
CLRC ;TELL COLLISION SCANNER NOT TO DELETE
RETS
*
*CLOWN HIT BY A CAR
*A0 = PTR TO CLOWN OBJECT
*A8 = PTR TO OBJECT THAT SMASHED HIM
*
CLWNCAR:
CALLR CARCHK ;CHECK IF PLAYER CAR RAN HIM OVER
JRNC CLNCOLX
PUSH A0
MOVI CLCARSND,A0
CALLA ONESND
PULL A0
JRUC CLWNEXP
*
*CHECK IF PLAYER CAR RAN HIM OVER
*A0 = PTR TO CLOWN OBJECT
*A8 = PTR TO OBJECT THAT SMASHED HIM
*CS IF CAR KILLED HIM
CARCHK
MOVE *A8(OXVEL),A1,L ;GIVE HIM BULLET VELOCITY
ABS A1
CMPI >20000,A1
JRHS CARCHKX ;CAR GOING FAST DIE
MOVE *A8(OID),A1,W
SRL 4,A1
SLL 4,A1
CMPI TRAN1OID,A1 ;PORSCHE SPIN CHECK?
JRNE CARCH1 ;NO, CAN IT
MOVE *A8(OIMG),A1,L
CMPI PORSCHE1,A1
JRNE CARCHKX
CARCH1
CLRC
RETS
CARCHKX
SETC
RETS
*
*CLOWN HIT BY ROCKET
*A0 = PTR TO CLOWN OBJECT
*A8 = PTR TO OBJECT THAT SMASHED HIM
*
CLWNROK:
CLWNEXP:
CALLR CLNCLNUP
MOVI 0EDh,A1
MOVI CLNDIE,A7
CALLA GETPRC ;CREATE A NEW ENEMY DEATH PROCESS
CALLR EXPVEL
MOVI CLRDSND,A0 ;ROCKET DEATH SOUND
CALLA ONESND
JRUC CLNCOLX
*
*MISC. DEATH CHORES FOR CLOWN
*
CLNCLNUP:
MOVE @KNAPCNT,A1,W ;DECREMENT CLOWN COUNT
DEC A1
MOVE A1,@KNAPCNT,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
MOVE *A8(OPLINK),A0,L
MOVE *A0(ETEMP2),A0,L ;GOT A GIRL?
JREQ CLNCLN1 ;NO
CALLA SCRKIL ;4X SCORE FOR GIRL SAVED
CALLA SCRKIL
CALLA SCRKIL
CALLR OIDATA ;GET PLAYER DATA FROM OID
JRC CLNCLN2 ;NOT A PLAYER KILL
CALLA PUT10K ;DO A FLOATER
JRUC CLNCLN2
CLNCLN1
CALLR OIDATA ;GET PLAYER DATA FROM OID
JRC CLNCLN2 ;NOT PLAYER KILL
CALLA PUT2x5K ;DO A FLOATER
CLNCLN2
MOVE *A8(OPLINK),A0,L
MOVE *A0(ETEMP2),A11,L ;GOT A GIRL?
JAUC KILL ;KILL YOUR OLD PROCESS
*
*CHANGE OID IN A11 TO PDATA IN A2
*CS IF NO PLAYER
OIDATA:
SRL 4,A11
SLL 4,A11 ;MASK OFF WEAPON
ZEXT A11 ;MUST CLEAR HONORABLE HIGH WORD
CMPI B1OID,A11 ;FIND CORRECT PLAYER DATA AREA
JRNE OIDATA1
MOVI P1DATA,A2
JRUC OIDATA2
OIDATA1
CMPI B2OID,A11
JRNE OIDATA3
MOVI P2DATA,A2
OIDATA2
CLRC
RETS
OIDATA3
SETC
RETS
*
*EXPLOSION VELOCITY
*A8=OBJECT, A6=SHIT THAT HIT YOU
*
EXPVEL:
MOVE A8,A0
CALLA DELSHAD
CALLA SHADST ;MAKE SURE ONLY ONE SHADOW
CALLA PSTOP ;BLOW DUDE INTO THE AIR
MOVI >50000,A0 ;GET RANDOM Y VELOCITY
CALLA RANDU
ADDI >28000,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
MOVE A3,*A8(OYVEL),L
MOVE *A8(OSHAD),A4,L
JREQ CLNEXP0
MOVE A0,*A4(OXVEL),L
CLNEXP0:
RETS
*
*CLOWN SPIN
*A9 = SPIN ANIMATION TABLE INDEX
*A10 = SLEEP TIME
*A11 = DIRECTION
*
CLNSPIN:
MOVE *A8(OFLAGS),A4,W
CLNSP00:
ADD A11,A9
MOVE *A9,A1,L ;GET NEXT ANIMATION
JRN CLNSPN1 ;REGULAR FRAME
CMPI >100,A1 ;A CHANGE IN FLIP?
JRLO CLNSP000 ;YES
SUBI >1000,A1 ;NO, THIS IS A JUMP - REMOVE BIAS
ADD A1,A9
JRUC CLNSP00 ;JUMP AT END
CLNSP000:
XOR A1,A4 ;CHANGE YOUR FLAGS FOLKS
JRUC CLNSP00 ;GET NEXT FRAME BOYS
CLNSPN1:
MOVE *A8(OXPOS),A6,W ;SAVE OLD CENTER X,Y COORDS
MOVE *A8(OSIZEX),A5,W
SRL 1,A5
ADD A5,A6
MOVE *A8(OYPOS),A7,W
MOVE *A8(OSIZEY),A5,W
SRL 1,A5
ADD A5,A7
CALLA ANI
MOVE *A8(OSIZEX),A5 ;POSITION NEW CENTER
SRL 1,A5
SUB A5,A6
MOVE *A8(OSIZEY),A5
SRL 1,A5
SUB A5,A7
MOVE A6,*A8(OXPOS),W ;RESTORE COORDS
MOVE A7,*A8(OYPOS),W
MOVE *A8(OYVEL),A0,L ;EFFECT OF GRAVITY
ADDI >3600,A0
MOVE A0,*A8(OYVEL),L
JRN CLNSPNL ;NEGATIVE Y VELOCITY
CALLA DFRMGRND ;HAVE WE LANDED?
JRLE CLNSPNX ;YES
CLNSPNL:
MOVE A10,A0 ;VARIABLE SLEEP
CALLA PRCSLP
JRUC CLNSPIN
CLNSPNX:
RETP
*
*HOOKST
*A8=DYING CLOWN
*A5,A6,A14 SMASHED
HOOKST
MOVI HOOKEOID|15|>00100000,A14 ;HOOKER ID
MOVE *A8(OYPOS),A6,W
SLL 16,A6
MOVE *A8(OXPOS),A5,W
MOVY A6,A5
MOVE *A8(OZPOS),A6,W
JAUC HOOKCOLD ;START A HOOKER UP
*
*CLOWN DIE
*A8= CLOWN
*
CLNDIE:
MOVE A11,A11 ;CARRYING A HOOKER
JREQ CLNDI0 ;NO
CALLR HOOKST
CLNDI0:
MOVI 2,A10 ;SLEEP TIME
MOVI 32,A11 ;DIRECTION
MOVI CLWNBLO,A9 ;DO YOUR BLO UP ANIMATION
CLNDI00:
JSRP CLNSPIN ;SPIN 'EM AND CROAK 'EM
MOVE *A8(OYVEL),A0,L ;CHECK LANDING VELOCITY
CMPI >40000,A0
JRLS CLNLND ;WE HAVE LANDED
MOVI >70000000,A1
MPYS A1,A0
NEG A0
NEG A11 ;REVERSE DIRECTION
INC A10 ;INCREASE SLEEP TIME
MOVE A0,*A8(OYVEL),L
SRAM 1,*A8(OXVEL),L ;CUT DOWN X VEL
CALLA SHVELCPY
JRUC CLNDI00
CLNLND:
CALLA PSTOP ;STOP THE SUCKER
MOVE A8,A0 ;OBJECT IN A0 FOR SETZPOS
CALLA SETZPOS ;ADJUST THE MUTHA
MOVE *A8(OFLAGS),A0,W ;GET YOUR FLAGS
BTST B_FLIPH,A0
JRNE CLNLND1
BTST B_FLIPV,A0
JREQ CLNLND1X
*HOLD LL CONSTANT
CLNLND2X:
MOVI CLNDTAB,A9
CALLR FNDFRM
CLND2L:
MOVE *A8(OFLAGS),A4,W
MOVE *A9+,A1,L ;GET NEXT ANIMATION
JREQ CLNLNDX ;WERE DONE BOYS
MOVE *A8(OYPOS),A7,W
MOVE *A8(OSIZEY),A5,W
ADD A5,A7
CALLA ANI
MOVE *A8(OSIZEY),A5
SUB A5,A7
MOVE A7,*A8(OYPOS),W
SLEEP 4
JRUC CLND2L
CLNLND1:
BTST B_FLIPV,A0
JREQ CLNLND2X
*HOLD LR CONSTANT
CLNLND1X:
MOVI CLNDTAB,A9
CALLR FNDFRM
CLND1L:
MOVE *A8(OFLAGS),A4,W
MOVE *A9+,A1,L ;GET NEXT ANIMATION
JREQ CLNLNDX ;WERE DONE BOYS
MOVE *A8(OXPOS),A6,W ;SAVE LR COORDS.
MOVE *A8(OSIZEX),A5,W
ADD A5,A6
MOVE *A8(OYPOS),A7,W
MOVE *A8(OSIZEY),A5,W
ADD A5,A7
CALLA ANI
MOVE *A8(OSIZEX),A5 ;CALC NEW UL
SUB A5,A6
MOVE *A8(OSIZEY),A5
SUB A5,A7
MOVE A6,*A8(OXPOS),W ;RESTORE COORDS
MOVE A7,*A8(OYPOS),W
SLEEP 4
JRUC CLND1L
*
*FIND YOUR FRAME
*A8=OBJECT, A9=TABLE OF FRAMES
*RET: A9 POINTS TO FRAME
*
FNDFRM:
MMTM SP,A0,A1
FNDFRML:
MOVE *A8(OIMG),A0,L
MOVE *A9,A1,L
CMP A1,A0
JREQ FNDFRMX
ADDI 32,A9
JRUC FNDFRML
FNDFRMX:
MMFM SP,A0,A1
RETS
*
*DIEING AFTER SPIN TABLES
*
CLNDTAB:
.LONG cldie1,cldie2,cldie3,cldie4,cldie5,cldie6,cldie7,0
*
*FALL DOWN DEAD
*A8=CLOWN OBJECT
*
CLNDIE1:
MOVI SPLTCOLBOX,A14 ;MAKE 'EM BLEED...
MOVE A14,*A8(OCVECT),L ;COLLISION POINTER
MOVE A11,A11 ;CARRYING A HOOKER
JREQ CLNDIE2 ;NO
MOVI CLNDROP,A9 ;PUT HER DOWN
MOVK 1,A1
JSRP FRANIM
CALLR HOOKST ;START HER UP
CLNDIE2
MOVE A8,A0
CALLA DELSHAD
CALLA SHADST ;ONLY ONE SHADOW, PLEASE
MOVI CLWNDIE,A9 ;DO YOUR DEATH ANIMATION
MOVK 1,A1
JSRP FRANIM
*
*SINK INTO THE GROUND
*A8=CLOWN OBJECT
*
CLNLNDX:
MOVI [1,1],A9
CREATE 0DFh,ESINK ;CREATE THE DEADMAN SINK
JAUC SUCIDE ;DIE
*
*STFOBJ INITIALIZING DATA
* .LONG OXVEL,OYVEL,OXVAL,OYVAL
* .WORD OZPOS,OZVEL
* .LONG OIMG,OZSIZ,OCVECT
* .WORD OFLAGS,OID
CLWNINIT
.LONG 0,0,0,0
.WORD 0,0
.LONG clwlk2,LOFZ,CLWNCOL
.WORD DMAWNZ,CLOWNOID
.LONG CLWNBLIP
CLWNCOL:
.WORD B1OID+BULLETID
.LONG CLWNBUL
.WORD B2OID+BULLETID
.LONG CLWNBUL
.WORD B1OID+ROCKETID
.LONG CLWNROK
.WORD B2OID+ROCKETID
.LONG CLWNROK
.WORD B1OID+EXPLODID
.LONG CLWNEXP
.WORD B2OID+EXPLODID
.LONG CLWNEXP
.WORD BEOID+EXPLODID
.LONG CLWNEXP
.WORD TRAN1OID+CBODYID
.LONG CLWNCAR
* .WORD CAR1OID+CBODYID
* .LONG CLWNEXP
.WORD 0
.LONG DUMRTSG
*
*ANIMATION TABLES
*
***********************************************
*CLOWN ANIMATIONS
***********************************************
*
*CLOWN WALK
*
CLWNWLK:
.long clwlk2
.word 5
.long clwlk3
.word 5
.long clwlk4
.word 5
.long clwlk5
.word 5
.long clwlk6
.word 5
.long clwlk7
.word 5
CLWNTAB .LONG 0
*
*CLOWN RUN
*
CLWNRUN:
.long clrun1
.word 4
.long clrun2
.word 4
.long clrun3
.word 4
.long clrun4
.word 4
.long clrun5
.word 4
.long clrun6
.word 4
.long 0
CLWNRE:
*
*CLOWN HIT
*
*CLWNHIT:
* .long cldie2
* .word 6
* .long clhit1
* .word 6
* .long 0
*
*CLOWN DUCK
*
CLWNDUK:
.long clduk1
.word 6
.long clduk3
.word 6
.long clduk1
.word 6
.long 0
*
*CLOWN DIE
*
CLWNDIE:
.long cldie1
.word 4
.long cldie2
.word 4
.long cldie3
.word 4
.long cldie4
.word 4
.long cldie5
.word 4
.long cldie6
.word 4
.long cldie7
.word 10
.long 0
*
*CLOWN BLOW UP
*
CLWNBLO:
.LONG CLWNBLOE-CLWNBLO+>1000
.long cldie2
.long cldie3
.long cldie4
.long cldie5
.long cldie6
.long cldie7
.LONG M_FLIPV
.long cldie6
.long cldie5
.long cldie4
.long cldie3
.long cldie2
.long cldie1
.LONG M_FLIPH
CLWNBLOE:
.LONG CLWNBLO-CLWNBLOE+>1000
*
*CLOWN KNIFE THROW
*
CLWNTHRW:
.long throw3
.word 5
.long throw4
.word 5
.long throw5
.word 5
.long throw6
.word 5
.long throw7
.word 5
.long 0
*
*CLOWN STANDING STAB
*
CLWNSTAB: ;start stab
.long stab1
.word 6
.long stab5
.word 6
CLWNSTB2: ;ACTUAL STAB
.long stab2
.word 6
.long stab4
.word 6
CLWNSTB3: ;END THE STAB
.long stab5
.word 6
.long 0
CLWNSTBE: ;REALLY THE END OF STAB
*
*CLOWN KNEELING STAB
*
CLWNKST1: ;START STAB
.long stab1
.word 6
.long stab5
.word 6
.long 0
CLWNKST2 ;STRIKE
.long stab7
.word 6
.long stab8
.word 6
.LONG 0
CLWNKST3
.long stab9
.word 9
.long stab8
.word 6
.long 0
CLWNKST4: ;WITHDRAW
.long stab7
.word 6
.long stab5
.word 6
.long 0
*
*CLOWN KILL SUPER STAB ATTACK
*FOREHAND-BACKHAND
CLWNSTBF:
.long kill1
.word 6
.long kill3
.word 6
.long kill4
.word 6
.long kill5
.word 6
.LONG 0
CLWNSTBB:
.long kill8
.word 6
.long kill9
.word 6
.long kill10
.word 6
.LONG 0
*OVERHEAD SMASH
CLWNSTOH:
.long kill1
.word 4
.long kill7
.word 4
.long kill11
.word 4
.long kill12
.word 4
.long kill14
.word 4
.long kill11
.word 4
* .long kill1
* .word 4
.long 0
*
*CLOWN LAUGH
*
CLWNLAF:
.long laugh1
.word 6
.long laugh2
.word 6
.long laugh3
.word 6
.long laugh4
.word 6
.long laugh5
.word 6
.long laugh6
.word 6
.long laugh7
.word 6
.long laugh8
.word 6
.long laugh3
.word 6
.long laugh8
.word 6
.long laugh7
.word 6
.long laugh6
.word 6
.long laugh5
.word 6
.long 0
*
*CLOWN JUMP
*
CLWNJMP:
.long cljmp6
.word 4
.long cljmp3
.word 4
.long cljmp7
.word 4
.long cljmp8
.word 4
.long cljmp9
.word 4
CLWNJMP0:
.long cljmp10
.word 4
.long 0
*CLWNJMP1:
* .long cljmp11
* .word 4
* .long cljmp12
* .word 4
* .long 0
*
*clown and hooker stuff
*
*hooker fighting
*
HKFIGHT:
.long hkfgt8
.word 4
.long hkfgt7
.word 4
.long hkfgt8
.word 4
.long hkfgt7
.word 4
.long hkfgt5
.word 4
.long hkfgt6
.word 4
.long hkfgt4
.word 4
.long hkfgt6
.word 4
.long hkfgt5
.word 4
.long hkfgt6
.word 4
.long hkfgt4
.word 4
.long hkfgt6
.word 4
.long hkfgt5
.word 4
.long hkfgt7
.word 4
.long hkfgt8
.word 4
.long 0
*
*clown lift up hooker
*
CLNLIFT:
.long lift1
.word 6
.long lift2
.word 6
.long lift3
.word 6
.long lift4
.word 6
.long 0
*
*clown carry hooker
*
CLNCARY:
.long carry1
.word 5
.long carry2
.word 5
.long carry3
.word 5
.long carry4
.word 5
.long carry5
.word 5
.long carry6
.word 5
.long carry7
.word 5
.long 0
*
*hooker die
*
HKDIE:
.long hkdie1
.word 4
.long hkdie2
.word 4
.long hkdie3
.word 4
.long hkdie4
.word 4
.long hkdie5
.word 4
.long hkdie6
.word 4
.long 0
*
CLNDROP
.long lift4
.word 2
.long lift3
.word 3
.long 0
*
*CLOWN CRIME SCENE
*
CLWNCRM1:
move @(WORLDTLX+16),A0,W
addi 150,A0
move @PLYMIN,A1,W
addi 5,A1
sll 16,A1
movx A0,A1
clr A6
movi CLWNINIT,A14
calla ESINITLL
clr A0
move A0,*A8(OBLIPIMG),L
SOUND1 HYELSND
calla PSTOP
calla NOYFLP
movi >1C000,A0
move A0,*A8(OXVEL),L
movi CLNLIFT,A9
movk 1,A1
jsrp FRANIM
SOUND1 CLAFSND
movi CLNCARY,A9
movk 1,A1
jsrp FRANIM
movi CLNCARY,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