2171 lines
41 KiB
NASM
2171 lines
41 KiB
NASM
.FILE 'COBRA.ASM'
|
||
|
||
.TITLE 'ROBO-RAMA GAME PROGRAM'
|
||
.WIDTH 132
|
||
.OPTION B,D,L,T
|
||
.MNOLIST
|
||
|
||
;
|
||
; INITIATED: 2/12/90
|
||
; MODIFIED: FOREVER....
|
||
; SOFTWARE: EUGENE JARVIS
|
||
;
|
||
; COPYRIGHT (C) 1990 WILLIAMS ELECTRONICS GAMES, INC.
|
||
;
|
||
; GET THE SYSTEM STUFF
|
||
|
||
.INCLUDE "MPROC.EQU" ;MPROC EQUATES
|
||
.INCLUDE "DISP.EQU" ;DISPLAY PROC. EQUATES
|
||
.INCLUDE "\VIDEO\SYS\SYS.INC" ;Z UNIT SYSTEM EQUATES
|
||
.INCLUDE "\VIDEO\SYS\MACROS.HDR" ;MACROS DEFINITIONS
|
||
.INCLUDE "IMGTBL.GLO"
|
||
.INCLUDE "ROBO.EQU"
|
||
.INCLUDE "COBRA.TBL"
|
||
|
||
;
|
||
;SYMBOLS EXTERNALLY DEFINED
|
||
;
|
||
;SOUNDS
|
||
.REF HASND,HA2SND,NOWAY,AWWSND,OUCH,EXP3HI,BUBL,SHKSND,YAMOFF
|
||
.REF VICMSC
|
||
|
||
.REF COBRAKIL
|
||
; .REF DIGOFF
|
||
.REF BOSSON,STATUS
|
||
.REF ECON,ORB_LIT,FRANIM,BIG3,SCRADD2,P1DATA,P2DATA,ENDON
|
||
.REF PSTOP,ADPCS4,HALT,FLP
|
||
.REF GET_VALID_XY,GAMSTATE,WAVEYX,BEGINOBJ,BEGINOBJ2,EHALT
|
||
.REF RANDPER,RANDOM,RANGRAND,DRINF,SET_GATE_2,GET_WVADDR,DEXIT
|
||
.REF RANDU,SRAND,PLYROBJS
|
||
.REF FINDPAL,PALSET,DELPAL,GETFPAL
|
||
.REF GETPLYR,SCORPLAY,BOOM4,ORBBNDCK
|
||
.REF SMLEXP,BOOM2,BOOM4
|
||
.REF STFVEL,COLCYC,KILL_BULL
|
||
.REF VMAX,SPTPRC
|
||
;
|
||
;SYMBOLS DEFINED IN THIS FILE
|
||
;
|
||
.DEF COBST,COBBUL,O_COB,CKPLYR,CHKFREE
|
||
|
||
.BSS PALSN1,16*16*2 ;ALLOCATE 2 X COLOR AREA IN RAM
|
||
.BSS PALSN2,16*16*2 ;ALLOCATE 2 X COLOR AREA IN RAM
|
||
.BSS COBWOUND,16 ;COBRA WOUND COUNT
|
||
.BSS COBFLG,16
|
||
|
||
OBJPTR .SET >0 ;IMAGE OBJECT POINTER
|
||
AFRAME .SET >28 ;CURRENT ANIMATION FRAME
|
||
DAMAGEL .SET >30 ;DAMAGE LEVEL
|
||
|
||
.TEXT
|
||
O_COB
|
||
CREATE 0,COBST
|
||
RETS
|
||
|
||
|
||
*
|
||
*START UP COBRAS
|
||
*
|
||
COBST
|
||
CLR A0 ;CLEAR OUT STATE
|
||
MOVE A0,@COBFLG,W
|
||
MOVE A0,@COBWOUND,W
|
||
MOVI NJHG,A8
|
||
MOVI PALSN1,A9
|
||
MOVI [58,63],A10
|
||
MOVK 3,A11
|
||
CREATE CYCPID,COLCYC ;SNAKE COLOR CYCLER
|
||
|
||
MOVI SNKPAL2,A8
|
||
MOVI PALSN1,A9
|
||
MOVI [58,63],A10
|
||
MOVK 3,A11
|
||
CREATE CYCPID,COLCYC ;SNAKE COLOR CYCLER
|
||
|
||
MOVI >1C0,A8
|
||
MOVI NJHG,A9 ;PALETTE
|
||
MOVE @WORLDTLX,A10,L ;GET STARTING COORD
|
||
ADDI >2290000,A10
|
||
MOVE @WORLDTLY,A11,L
|
||
ADDI >6E0000,A11
|
||
CREATE COBPIDM,GETCOBRA ;MAIN COBRA PROCESS
|
||
|
||
MOVI >1C1,A8
|
||
MOVI SNKPAL2,A9 ;PALETTE
|
||
MOVE @WORLDTLX,A10,L ;GET STARTING COORD
|
||
ADDI >2E20000,A10
|
||
MOVE @WORLDTLY,A11,L
|
||
ADDI >6E0000,A11
|
||
CREATE COBPIDM,GETCOBRA ;MAIN COBRA PROCESS
|
||
DIE
|
||
*
|
||
*START A COBRA
|
||
*A8=ZPOS
|
||
*A9=PALETTE
|
||
*A10,A11=OXVAL,OYVAL
|
||
*PDATA=XVEL
|
||
*PDATA+>20=YVEL
|
||
*PDATA+>40=XACC
|
||
*PDATA+>60=YACC
|
||
*PDATA+>80=LINK TO SNAKE STRUCTURE
|
||
GETCOBRA
|
||
CLR A0
|
||
MOVE A0,*A13(PDATA),L ;CLEAR OUT INIT VELOCITY
|
||
MOVE A0,*A13(PDATA+>20),L
|
||
MOVE A10,A0
|
||
MOVE A11,A1
|
||
MOVE A8,A11
|
||
CALLR COBINIT ;INITIALIZE COBRA
|
||
MOVE A13,A8
|
||
ADDI PDATA+>100,A8
|
||
MOVE *A8,A11,L ;GET POINTER TO HEAD PIECE
|
||
CALLR BODST ;GET YOUR BODY FLOWING
|
||
COBWAIT
|
||
SLEEP 2
|
||
MOVE @EHALT,A0
|
||
JRNZ COBWAIT ;WAIT FOR PLAYER TO ENTER
|
||
MOVK 1,A0 ;TELL TURMELL BOSS IS ON!
|
||
MOVB A0,@BOSSON
|
||
SLEEP 90
|
||
CALLA GETPLYR ;FIND PLAYER TO SEEK
|
||
MOVE A0,A11
|
||
CALLR GETCOBV ;GET ROBOT BOSS VELOCITY
|
||
COBLP:
|
||
MOVI 50,A0
|
||
CALLA RANDPER ;ANIMATE BOSS??
|
||
JRNC COB0
|
||
|
||
*DO SOME ANIMATION HERE
|
||
CMPI 15,A0
|
||
JRHS COBA1
|
||
MOVK 5,A10
|
||
MOVI TUNGO,A9
|
||
JRUC COBANI
|
||
COBA1
|
||
CMPI 30,A0
|
||
JRHS COBA2
|
||
MOVK 5,A10
|
||
MOVI BLINK,A9
|
||
JRUC COBANI
|
||
COBA2
|
||
MOVK 7,A10
|
||
MOVI BITE,A9
|
||
COBANI
|
||
CREATE COBPIDA,ANISEQ
|
||
COB0
|
||
MOVI 50,A0 ;GET NEW VELOCITY?
|
||
CALLA RANDPER
|
||
JRNC COB1 ;NO
|
||
CALLR GETCOBV
|
||
MOVI 40,A0 ;GET NEW PLAYER TO SEEK
|
||
CALLA RANDPER
|
||
JRNC COB1 ;NO
|
||
CALLA GETPLYR
|
||
MOVE A0,A11
|
||
COB1
|
||
CALLR COBLADE
|
||
CALLR FINDPLAY ;PLAYER IN RANGE?
|
||
MOVI 250,A0 ;PROBABILITY OF FIRE IN RANGE
|
||
JRC COB1A ;YES, BLAST 'EM
|
||
MOVI 30,A0 ;RANDOM FIRE ?
|
||
COB1A
|
||
CALLA RANDPER
|
||
JRNC COB2 ;NO DICE
|
||
MOVE *A8,A8,L ;MAKE SURE WE'RE ON SCREEN
|
||
CALLA GETANIXY
|
||
MOVE @WORLDTLX,A4,L ;ADJUST FOR SCREEN RELATIVE
|
||
MOVE @WORLDTLY,A5,L
|
||
SUB A4,A3
|
||
SUB A5,A2
|
||
CMPI >300000,A3
|
||
JRLT COB2 ;OFF TO THE LEFT
|
||
CMPI >1600000,A3
|
||
JRGT COB2 ;OFF TO THE RIGHT
|
||
CMPI >010000,A2
|
||
JRLT COB2 ;OFF THE TOP
|
||
CMPI >740000,A2
|
||
JRGT COB2 ;OFF THE BOTTOM
|
||
JSRP COBFLAM
|
||
COB2
|
||
CALLR COBVEL
|
||
MOVE @COBFLG,A0,W
|
||
JRNE COBBLOP ;BLOW THE DUDE UP WERE DEAD
|
||
SLEEP 2
|
||
JRUC COBLP
|
||
*
|
||
*ACCELERATE, DAMP, AND CLIP COBRA VELOCITY
|
||
*
|
||
COBVEL
|
||
MOVE *A13(PDATA+>40),A2,L ;GET ACCELERATIONS
|
||
MOVE *A13(PDATA+>60),A3,L
|
||
MOVE *A13(PDATA),A0,L ;GET VELOCITIES
|
||
MOVE *A13(PDATA+>20),A1,L
|
||
MOVE A2,A6
|
||
MOVE A3,A7
|
||
ADD A0,A2
|
||
ADD A1,A3
|
||
MOVE A2,A0
|
||
MOVE A3,A1
|
||
SRA 3,A2 ;SUB OUT DAMPING FACTOR
|
||
SRA 3,A3
|
||
SUB A2,A0
|
||
SUB A3,A1
|
||
*IN BOUNDS ?
|
||
MOVE A13,A8
|
||
ADDI PDATA+>100,A8 ;GET STORE AREA
|
||
MOVE *A8,A8,L ;GET FIRST OBJECT
|
||
CALLA GETANIXY ;RET A2=YVAL,A3=XVAL
|
||
MOVE @WORLDTLX,A4,L ;ADJUST FOR SCREEN RELATIVE
|
||
MOVE @WORLDTLY,A5,L
|
||
SUB A4,A3
|
||
SUB A5,A2
|
||
CMPI >300000,A3
|
||
JRGT MVV02 ;NOT TO THE LEFT
|
||
; ABS A0
|
||
ABS A6
|
||
MVV02
|
||
CMPI >1600000,A3
|
||
JRLT MVV03 ;NOT TO THE RIGHT
|
||
; ABS A0
|
||
; NEG A0
|
||
ABS A6
|
||
NEG A6
|
||
MVV03
|
||
CMPI >00010000,A2
|
||
JRGT MVV04
|
||
; ABS A1
|
||
ABS A7
|
||
MVV04
|
||
CMPI >B80000,A2
|
||
JRLT MVV05
|
||
; ABS A1
|
||
; NEG A1
|
||
ABS A7
|
||
NEG A7
|
||
MVV05
|
||
MOVE A0,*A13(PDATA),L
|
||
MOVE A1,*A13(PDATA+>20),L
|
||
MOVE A6,*A13(PDATA+>40),L
|
||
MOVE A7,*A13(PDATA+>60),L
|
||
MOVE A13,A8
|
||
ADDI PDATA+>100,A8 ;GET STORE AREA
|
||
CALLA STFVEL ;STUFF VELOCITY IN ALL PARTS
|
||
RETS
|
||
*
|
||
*FIND A PLAYER IN RANGE
|
||
*RET CS IF PLAYER IN RANGE OF FLAME
|
||
*
|
||
FINDPLAY
|
||
MMTM SP,A8
|
||
MOVE *A8,A8,L ;GET OBJECT
|
||
CALLA GETANIXY ;RET A2=YVAL,A3=XVAL
|
||
SRA 16,A2
|
||
SRA 16,A3
|
||
MOVE @PLYROBJS,A0,L
|
||
JREQ FNDPLY1
|
||
MOVE *A0(OXPOS),A1,W
|
||
SUB A3,A1
|
||
ABS A1
|
||
CMPI 24,A1
|
||
JRHI FNDPLY1
|
||
MOVE *A0(OYPOS),A1,W
|
||
SUB A2,A1
|
||
SUBI 130,A1
|
||
ABS A1
|
||
CMPI 24,A1
|
||
JRLS FNDPLYES
|
||
FNDPLY1
|
||
MOVE @PLYROBJS+32,A0,L
|
||
JREQ FNDPLYX ;PLAYER STILL ACTIVE
|
||
MOVE *A0(OXPOS),A1,W
|
||
SUB A3,A1
|
||
ABS A1
|
||
CMPI 24,A1
|
||
JRHI FNDPLYX
|
||
MOVE *A0(OYPOS),A1,W
|
||
SUB A2,A1
|
||
SUBI 130,A1
|
||
ABS A1
|
||
CMPI 24,A1
|
||
JRHI FNDPLYX
|
||
FNDPLYES
|
||
SETC
|
||
JRUC FNDPLYXX
|
||
FNDPLYX
|
||
CLRC
|
||
FNDPLYXX
|
||
MMFM SP,A8
|
||
RETS
|
||
*
|
||
*FLAME THE DUDE
|
||
*
|
||
COBFLAM:
|
||
*STOP HIM
|
||
MOVE A13,A8
|
||
ADDI PDATA+>100,A8 ;GET STORE AREA
|
||
CLR A0 ;STOP THE SNAKE
|
||
CLR A1
|
||
MOVE A0,*A13(PDATA),L
|
||
MOVE A1,*A13(PDATA+>20),L
|
||
CALLA STFVEL ;STUFF VELOCITY IN ALL PARTS
|
||
*OPEN MOUTH
|
||
CALLR KLANISNK ;KILL OTHER ANIMATIONS OF THIS SNAKE
|
||
MOVK 3,A10
|
||
MOVI SNKFLAM,A9
|
||
CREATE COBPIDA,ANISEQ
|
||
*MAKE A FLAME
|
||
SOUND1 FLAMO ;MAKE FLAME SOUND
|
||
MOVE *A8,A8,L ;GET OBJECT
|
||
CALLA GETANIXY ;RET A2=YVAL,A3=XVAL
|
||
MOVE A3,A0
|
||
MOVE A2,A1
|
||
MOVI FLM1,A2 ;(OIMG)
|
||
MOVI >1CF,A3 ;(OZPOS)
|
||
MOVI DMAWNZ,A4 ;(OFLAGS) NON-ZERO VALUE
|
||
MOVI CLSNEUT,A5 ;(OID) INITIALLY HARMLESS
|
||
CLR A6 ;(XV)
|
||
CLR A7 ;(YV)
|
||
CALLA BEGINOBJ2
|
||
MOVI FLAME,A9
|
||
MOVK 1,A1
|
||
JSRP FRANIM ;DO YOUR THING
|
||
MOVI CLSENMY|TYPCOB|SUBCOBFLM,A5 ;(OID)
|
||
MOVE A5,*A8(OID),W ;MAKE HIM DEADLY NOW
|
||
|
||
; MOVI >9A,A5 ;(OZPOS)
|
||
; MOVE A5,*A8(OZPOS),W
|
||
; MOVE A8,A0 ;RE-SORT THIS OBJECT
|
||
; CALLA DELOBJ
|
||
; MOVE @OFREE,A0,L ; GET OBJECT BACK
|
||
; MOVE *A0,A2,L
|
||
; MOVE A2,@OFREE,L ; ADJUST POINTER TO FREE LIST
|
||
; move *A0(OFLAGS),A4,W ;SET STUPID BIT
|
||
; ORI M_INUSE,A4
|
||
; move A4,*A0(OFLAGS),W
|
||
; CALLA INSOBJ
|
||
|
||
MOVI FLAME2,A9
|
||
MOVK 1,A1
|
||
JSRP FRANIM ;DO YOUR THING
|
||
MOVE A8,A0
|
||
CALLA DELPAL ;BAIL OUT
|
||
CALLA DELOBJ
|
||
MOVE A13,A8
|
||
ADDI PDATA+>100,A8 ;GET STORE AREA
|
||
MOVK 5,A10
|
||
MOVI SNKFLAMX,A9 ;RETURN TO NORMAL POSE
|
||
CREATE COBPIDA,ANISEQ
|
||
RETP
|
||
*
|
||
*SHOOT A BLADE AT YOU
|
||
*A11= PLAYER TO SHOOT
|
||
*
|
||
COBLADE:
|
||
MMTM SP,A8
|
||
CALLA CKPLYR ;MAKE SURE WE GOT A LIVE ONE
|
||
MOVI 15,A0
|
||
MOVE *A11(OYPOS),A1,W
|
||
MOVE @WORLDTLY+>10,A2,W
|
||
ADDI >6E,A2
|
||
CMP A2,A1
|
||
JRHS COBLD0
|
||
SLL 2,A0 ;MORE LIKELY TO SHOOT IN BACK
|
||
COBLD0
|
||
CALLA RANDPER
|
||
JRNC COBLDX
|
||
|
||
MOVI 50,A0 ;GET GOAL X,Y
|
||
CALLA SRAND
|
||
SLL 16,A0
|
||
MOVE A0,A1
|
||
MOVI 50,A0
|
||
SLL 16,A0
|
||
CALLA SRAND
|
||
MOVE *A11(OXVAL),A6,L
|
||
MOVE *A11(OYVAL),A7,L ;GET DESTINATION COORD
|
||
ADD A0,A6
|
||
ADD A1,A7
|
||
|
||
MOVI >780000,A1
|
||
MOVI >600000,A0
|
||
MOVE @RAND,A2,L
|
||
JRNN COBLD1 ;SNAKE 1 OR 2?
|
||
MOVI >1280000,A0 ;SNAKE 1
|
||
COBLD1
|
||
MOVE @WORLDTLX,A2,L ;GET STARTING COORD
|
||
MOVE @WORLDTLY,A3,L
|
||
ADD A2,A0
|
||
ADD A3,A1
|
||
|
||
SUB A0,A6 ;FIND DELTA
|
||
SUB A1,A7
|
||
SRA 6,A6
|
||
SRA 6,A7
|
||
|
||
MMTM SP,A0
|
||
MOVI >60000,A0 ;LIMIT VELOCITIES
|
||
CALLA VMAX
|
||
MMFM SP,A0
|
||
|
||
MOVI BLB1A,A2 ;(OIMG)
|
||
MOVI 231,A3 ;(OZPOS)
|
||
MOVI DMAWNZ,A4 ;(OFLAGS) NON-ZERO VALUE
|
||
MOVI CLSENMY|TYPCBALL,A5 ;(OID)
|
||
CALLA BEGINOBJ2
|
||
CREATE 0,SPTPRC ;SPITBALL PROCESS
|
||
MOVE A0,*A8(OPLINK),L ;FIX PROCESS LINK
|
||
COBLDX
|
||
MMFM SP,A0
|
||
RETS
|
||
|
||
*
|
||
*KILL OTHER ANIMATIONS OF COBRA
|
||
*A8=COBRA
|
||
*
|
||
KLANISNK ;KILL OTHER ANIMATIONS OF THIS SNAKE
|
||
MMTM SP,A0,A2,A4
|
||
MOVI ACTIVE,A2,L
|
||
KLANXT:
|
||
MOVE *A2,A2,L ;GET NEXT
|
||
JREQ KLASC ;ALL DONE
|
||
KLANXT1
|
||
MOVE *A2(PROCID),A4
|
||
CMPI COBPIDA,A4 ;MATCH?
|
||
JRNE KLANXT ;NO
|
||
MOVE *A2(PA8),A0,L ;OUR SNAKE?
|
||
CMP A0,A8
|
||
JRNE KLANXT ;NO...CONTINUE SEARCH
|
||
MOVE A2,A0
|
||
MOVE *A2,A2,L ;GET FORWARD LINK
|
||
CALLA KILL
|
||
MOVE A2,A2 ;ANY MORE?
|
||
JRNE KLANXT1 ;YES...CONTINYA
|
||
KLASC
|
||
MMFM SP,A0,A2,A4
|
||
RETS
|
||
*
|
||
*GET COBRA VELOCITY
|
||
*PD+>40=XACC, PD+>60=YACC
|
||
*
|
||
GETCOBV
|
||
MOVI 500,A0
|
||
CALLA RANDPER
|
||
JRNC GETCOBVR ;GET A RANDOM VELOCITY
|
||
MOVE A13,A4
|
||
ADDI PDATA+>100,A4 ;GET STORE AREA
|
||
MOVE *A4,A4,L ;GET FIRST OBJECT
|
||
MOVE *A4(OXVAL),A0,L ;TRACK THE DUDE DOWN
|
||
ADDI >10000,A0,L
|
||
MOVE *A4(OYVAL),A1,L
|
||
ADDI >600000,A1,L
|
||
MOVE *A11(OXVAL),A2,L
|
||
MOVE *A11(OYVAL),A3,L
|
||
SUB A1,A3
|
||
SUB A0,A2
|
||
SRA 8,A2
|
||
SRA 8,A3
|
||
MOVE A2,*A13(PDATA+>40),L
|
||
MOVE A3,*A13(PDATA+>60),L
|
||
RETS
|
||
GETCOBVR
|
||
MOVI >8000,A0
|
||
CALLA SRAND
|
||
MOVE A0,*A13(PDATA+>40),L
|
||
MOVI >8000,A0
|
||
CALLA SRAND
|
||
MOVE A0,*A13(PDATA+>60),L
|
||
RETS
|
||
*
|
||
*CHECKS IF PLAYER ACTIVE, IF NOT GETS A NEW ONE IN A11
|
||
*
|
||
CKPLYR
|
||
PUSH A0
|
||
MOVE @PLYROBJS,A0,L
|
||
CMP A11,A0
|
||
JREQ CKPLYRX ;PLAYER STILL ACTIVE
|
||
MOVE @PLYROBJS+32,A0,L
|
||
CMP A11,A0
|
||
JREQ CKPLYRX ;PLAYER STILL ACTIVE
|
||
CALLA GETPLYR
|
||
CKPLYRX
|
||
MOVE A0,A11 ;SET Z BIT
|
||
MMFM SP,A0
|
||
RETS
|
||
*
|
||
*INITIALIZE COBRA
|
||
*A0=XPOS,A1=YPOS,A11=OZPOS,A9=PALETTE
|
||
*
|
||
COBINIT
|
||
MMTM SP,A2,A3,A12,A13
|
||
MOVI COBITAB,A12 ;INIT ROBOT BOSS TABLE
|
||
MMTM SP,A0,A1 ;SAVE XY COORDS
|
||
MOVE A9,A0
|
||
CALLA GETFPAL
|
||
MOVE A0,A9 ;SAVE PALETTE #
|
||
MOVE A13,A8
|
||
ADDI PDATA+>100,A8
|
||
CREATE COBPID,STICKP ;STICK TOGETHER HEAD
|
||
MOVE A8,A13
|
||
MMFM SP,A0,A1
|
||
MMTM SP,A0,A1
|
||
COBILP
|
||
MMFM SP,A0,A1
|
||
MOVE *A12+,A4,W ;GET (OFLAGS)
|
||
JREQ COBIDON ;END OF LIST
|
||
MMTM SP,A0,A1
|
||
BTST B_FLIPH,A4
|
||
JRZ COBI1
|
||
SUBI >50000,A0 ;BRING RIGHT SIDE BACK A FEW
|
||
COBI1
|
||
MOVE *A12+,A5,W ;GET (OID)
|
||
MOVE *A12+,A6,W ;GET ANI FRAME #
|
||
MOVB A6,*A13(AFRAME) ;STORE FRAME POINTER
|
||
DEC A6
|
||
MOVI COBANITB1-COBANITB,A7
|
||
MPYU A6,A7 ;ADJUST FOR LENGTH OF ENTRY
|
||
ADDI COBANITB,A7 ;ADD TABLE BASE
|
||
MOVE *A7,A2,L ;GET OIMG POINTER
|
||
CLR A6 ;(OXVEL)
|
||
CLR A7 ;(OYVEL)
|
||
MOVI >C0,A3 ;(OZPOS)
|
||
CALLA BEGINOBJ2 ;STUFF OBJ
|
||
MOVE *A12,A3,W ;LAST PIECE, LIGHTNING?
|
||
JRNE COBI1A ;NO
|
||
INC A11 ;MAKE Z HIGHER PRIORITY
|
||
JRUC COBI2 ;DONT MESS WITH PALETTE
|
||
COBI1A
|
||
MOVE A9,*A8(OPAL),W ;STUFF PALETTE
|
||
COBI2
|
||
MOVE A11,*A8(OZPOS),W ;STUFF Z
|
||
MOVE A13,*A8(OPLINK),L ;LINK OBJECT TO BLOCK STRUCTURE
|
||
MOVE A8,*A13,L ;SAVE POINTER TO GUY
|
||
CLR A7
|
||
MOVE A7,*A13(DAMAGEL),W ;INIT DAMAGE LEVEL
|
||
ADDI >40,A13 ;INCREMENT IT ALONG
|
||
JRUC COBILP
|
||
COBIDON
|
||
CLR A14
|
||
MOVE A14,*A13,L ;ZERO OUT LAST POINTER TO MARK END
|
||
MMFM SP,A2,A3,A12,A13
|
||
RETS
|
||
*
|
||
*GET YOUR COBRA BODY
|
||
*A0=XVAL,A1=YVAL
|
||
*A11=HEAD OBJECT
|
||
*A9=OPAL
|
||
*
|
||
BODST:
|
||
MMTM SP,A0,A1,A8,A10,A11,A12,A13
|
||
MOVE A11,A12
|
||
MOVE A0,A10
|
||
MOVE A1,A11
|
||
CREATE COBPIDS,BODPRC ;MASTER BODY PROCESS
|
||
MOVE A0,A8
|
||
ADDI PDATA+>80,A8 ;STORAGE AREA FOR SNAKE STUFF
|
||
MOVE A8,*A0(PA8),L
|
||
MOVE A8,*A13(PDATA+>80),L ;LINK TO HEAD PROCESS
|
||
MOVE A12,*A0(PDATA),L ;SAVE POINTER TO HEAD
|
||
MOVE A13,*A0(PDATA+>20),L ;SAVE POINTER TO HEAD PROCESS
|
||
MOVE A0,*A8+,L ;SAVE POINTER TO PROCESS
|
||
CLR A0
|
||
MOVE A0,*A8+,L ;NULL POINTER AT START
|
||
MOVE A8,A13
|
||
MOVI >1BF,A12 ;INIT Z
|
||
MOVE A9,-*SP,W ;SAVE PALETTE
|
||
MOVI 24,A9 ;NUMBER OF DUDES...
|
||
BODILP
|
||
MOVE A10,A0
|
||
MOVE A11,A1
|
||
CLR A6 ;(OXVEL)
|
||
CLR A7 ;(OYVEL)
|
||
MOVI SNKBLL,A2 ;(OIMG)
|
||
CMPI 1,A9
|
||
JRNE BODIL1
|
||
MOVI SNKBLL1A,A2
|
||
BODIL1
|
||
MOVI >9E,A3 ;(OZPOS)
|
||
MOVI DMAWNZ,A4 ;(OFLAGS) NON-ZERO VALUE
|
||
MOVI CLSENMY|TYPCOB|SUBCOBBOD,A5 ;(OID)
|
||
CALLA BEGINOBJ2
|
||
|
||
MOVE A13,*A8(OPLINK),L
|
||
MOVE A8,*A13+,L ;SAVE POINTER TO GUY
|
||
MOVE *SP,A1,W
|
||
MOVE A1,*A8(OPAL),W ;GET PROPER PALETTE
|
||
MOVE A12,*A8(OZPOS),W ;SET Z
|
||
DEC A12
|
||
MOVE *A8(OID),A0,W
|
||
ADD A9,A0
|
||
MOVE A0,*A8(OID),W ;ADD IN SECTION # IN SUBTYPE
|
||
DSJ A9,BODILP
|
||
MOVE A9,*A13,L ;ZERO OUT AT END
|
||
ADDK 16,SP ;BLOW OFF PALETTE WORD,PROCESS POINTER
|
||
MMFM SP,A0,A1,A8,A10,A11,A12,A13
|
||
RETS
|
||
*
|
||
*COBRA BODY PROCESS
|
||
*PDATA=HEAD POINTER ON FRONT SECTION
|
||
*A8=POINTER TO COBRA STRUCTURE
|
||
*PDATA=HEAD OBJET
|
||
*PDATA+>20=HEAD PROCESS
|
||
*
|
||
BODPLP
|
||
MOVE A8,A9
|
||
MOVE A8,A10
|
||
ADDI >20,A9
|
||
BODP10
|
||
MOVE *A9+,A0,L ;FIND THE START
|
||
JREQ BODP10
|
||
SUBI >40,A9
|
||
*GET THE FRONT DISTANCE
|
||
BODPLP0
|
||
MOVE *A9(>20),A8,L
|
||
MOVE *A9,A0,L
|
||
JRNE BODV02 ;NOT THE LEADER
|
||
MOVE *A13(PDATA),A0,L ;GET THE HEAD COORD
|
||
MOVE *A0(OXVAL),A1,L ;GET X,Y COORDS
|
||
MOVE *A0(OYVAL),A2,L
|
||
ADDI >10000,A2 ;ADJUST Y
|
||
ADDI >C0000,A1 ;ADJUST X
|
||
JRUC BODV02A
|
||
BODV02
|
||
MOVE *A0(OXVAL),A1,L ;GET X,Y COORDS
|
||
MOVE *A0(OYVAL),A2,L
|
||
BODV02A
|
||
MOVE *A9(>40),A0,L
|
||
JREQ BODPLX ;THIS IS THE TAIL, DONT MOVE !!!!
|
||
|
||
MOVE *A0(OXVAL),A3,L ;GET X,Y COORDS
|
||
MOVE *A0(OYVAL),A4,L
|
||
ADD A1,A3
|
||
SRA 1,A3 ;GET X MIDPOINT
|
||
ADD A2,A4
|
||
SRA 1,A4 ;GET Y MIDPOINT
|
||
; MOVE *A8(OXVAL),A1,L ;FIND DELTA X,Y
|
||
; MOVE *A8(OYVAL),A2,L
|
||
; SUB A1,A3
|
||
; SUB A2,A4
|
||
BODV3
|
||
MOVE A3,*A8(OXVAL),L ;GRAB THE MIDPOINT
|
||
MOVE A4,*A8(OYVAL),L
|
||
BODPL
|
||
ADDI >20,A9
|
||
JRUC BODPLP0
|
||
BODPLX
|
||
MOVE A10,A8
|
||
RETS
|
||
*
|
||
*BODY PROCESS
|
||
*
|
||
BODPRC
|
||
; CALLR BODPLP
|
||
; CALLR BODPLP
|
||
CALLR BODPLP
|
||
CALLR BODPLP
|
||
SLOOP 1,BODPRC
|
||
*
|
||
*CLEAN UP SNAKE BODY MESS
|
||
*A8=SNAKE BODY PIECE
|
||
*
|
||
BODCLEAN
|
||
MOVE *A8(OPLINK),A0,L ;LINK AROUND DUDE IN CHAIN
|
||
MOVE *A0(PDATA+>40),A1,L
|
||
MOVE *A0(PDATA+>20),A2,L
|
||
JREQ BODCLN0 ;TEST FOR NULL LINK
|
||
MOVE A1,*A2(PDATA+>40),L
|
||
BODCLN0
|
||
MOVE A1,A1
|
||
JREQ BODCLN00
|
||
MOVE A2,*A1(PDATA+>20),L
|
||
BODCLN00
|
||
CALLA KILL ;KILLS PROCESS IN A0
|
||
BODCLN1
|
||
MOVE A8,A0
|
||
CALLA DELPAL ;NEEDED? NOT IF IN PLYR PAL!
|
||
CALLA DELOBJ
|
||
RETS
|
||
*
|
||
*BULLET SUBTYPE SHIFT TABLE
|
||
*SUBLZR 01 ;REGULAR LAZER SHOTS
|
||
*SUBSPRY 02 ;SPRAY SUB TYPE
|
||
*SUBSPEW 03 ;SPEW TYPE WEAPON (3)
|
||
*SUBGRND 04 ;GRENADE
|
||
*SUBNOSTP 05 ;NON STOPPING BULLET
|
||
*
|
||
BULSHTAB
|
||
.WORD 1,1,1,1,0,3,1,1 ;VELOCITY FUNCTION
|
||
.WORD 1,1,2,3,5,5,1,1 ;DAMAGE LEVEL
|
||
.WORD >100,>100,>200,>300,>500,>500,>100,>100 ;SCORE LEVEL
|
||
*
|
||
*COBRA HIT BY BULLET
|
||
*A8=COBRA PIECE HIT
|
||
*A0=BULLET THAT HIT US
|
||
*
|
||
COBBUL
|
||
MMTM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11
|
||
MOVE @COBFLG,A1,W
|
||
JRNE COBBULX ;FORGET IT HE'S BLOWING
|
||
MOVB *A8(OID),A2
|
||
CMPI SUBCOBHD,A2 ;CHECK FOR FLAME
|
||
JRHI COBBULX ;FLAME, CAN IT
|
||
|
||
MOVE A0,-*SP,L
|
||
SOUND1 SNKSCR ;BLOW UP SOUND
|
||
MOVE *SP+,A0,L
|
||
|
||
MOVB *A0(OID),A4 ;ISOLATE SUBTYPE
|
||
SLL 4,A4
|
||
ADDI BULSHTAB,A4 ;VARIABLE SHIFT BASED ON SUBTYPE
|
||
MOVE *A4(>100),A1,W
|
||
CALLA SCORPLAY ;SCORE APPROPRIATE POINTS
|
||
MOVE *A4(>80),A1,W
|
||
CMPI SUBCOBHD,A2 ;CHECK FOR HEAD SHOT
|
||
JREQ COBBULHD
|
||
|
||
MOVE @COBWOUND,A2,W ;ADD IN DAMAGE
|
||
ADD A1,A2
|
||
MOVE A2,@COBWOUND,W
|
||
CLR A10
|
||
SLL 29,A2
|
||
SRL 29,A2
|
||
JRNE COBBUL1
|
||
MOVK 1,A10 ;SCALEUP EVERY 8TH
|
||
COBBUL1
|
||
MOVE *A4,A1,W ;GET VEL SHIFT
|
||
MOVE *A8(OPLINK),A7,L
|
||
SUBI >40,A7 ;GET UPPER JOINTS
|
||
MOVB *A8(OID),A2
|
||
CMPI 13,A2 ;GET RING # SUBTYPE
|
||
JRHS COBBULX1 ;TOO HIGH UP, DON'T BUMP IT AROUND
|
||
|
||
CALLR ADDV
|
||
CALLR ADDV
|
||
CALLR ADDV
|
||
COBBULX1
|
||
CALLR BULEXP
|
||
CREATE COBPID,SCALEUP
|
||
COBBULX
|
||
MMFM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11
|
||
RETS
|
||
*
|
||
*ADD BULLET VELOCITY TO SNAKE SECTIONS
|
||
*A0=BULLET
|
||
*A1=SHIFT COUNT
|
||
*
|
||
ADDV
|
||
MOVE *A7+,A3,L
|
||
JREQ ADDVX
|
||
MOVE *A3(OID),A2,W
|
||
ANDI >0000FF00,A2
|
||
|
||
.IF DEBUG
|
||
CMPI CLSENMY|TYPCOB,A2 ;(OID)
|
||
JREQ ADDV1
|
||
LOCKUP
|
||
EINT
|
||
ADDV1
|
||
.ENDIF
|
||
|
||
MOVE *A7,A2,L
|
||
JREQ ADDVX ;BOTTOM LINK CAN IT
|
||
MOVE *A3(OXVAL),A4,L
|
||
MOVE *A0(OXVEL),A2,L ;GIVE IT A PUSH
|
||
SLL A1,A2
|
||
ADD A2,A4
|
||
MOVE A4,*A3(OXVAL),L
|
||
MOVE *A3(OYVAL),A4,L
|
||
MOVE *A0(OYVEL),A2,L ;GIVE IT A PUSH
|
||
SLL A1,A2
|
||
ADD A2,A4
|
||
MOVE A4,*A3(OYVAL),L
|
||
ADDVX
|
||
RETS
|
||
*
|
||
*MOVE INTENSIFIED SECTION UP THE SNAKE
|
||
*A8=SECTION HIT
|
||
*A10=MAKE SPARK AT TOP
|
||
*
|
||
SCALEUP
|
||
MOVE *A8(OPLINK),A9,L
|
||
JRUC SCUP1
|
||
SCUPLP
|
||
MOVI DMAWNZ,A0,W
|
||
MOVE A0,*A8(OFLAGS),W ;OFF OLDIE
|
||
|
||
MOVE -*A9,A8,L ;ON NEW GUY
|
||
JREQ SCALEX
|
||
SCUP1
|
||
MOVE *A8(OID),A2,W
|
||
ANDI >0000FF00,A2
|
||
|
||
.IF DEBUG
|
||
CMPI CLSENMY|TYPCOB,A2
|
||
JREQ SCUP2
|
||
LOCKUP
|
||
EINT
|
||
SCUP2
|
||
.ENDIF
|
||
|
||
MOVI DMACNZ,A0,W ;INTENSIFY FIRST SECTION
|
||
MOVE A0,*A8(OFLAGS),W
|
||
MOVI >3939,A0 ;BRIGHT WHITE IN PALETTE
|
||
MOVE A0,*A8(OCONST),W
|
||
SLOOP 1,SCUPLP
|
||
SCALEX
|
||
MOVE A10,A10 ;FLASH HEAD?
|
||
JREQ SCALEXX ;NOPE...
|
||
MOVE -*A9,A0,L ;GET BODY PROCESS
|
||
MOVE *A0(PDATA+>20),A0,L ;GET HEAD PROCESS
|
||
MOVE A0,A8
|
||
ADDI PDATA+>100,A8
|
||
MOVK 2,A10
|
||
CALLR LITFLP
|
||
MOVI LITNING,A9
|
||
CREATE COBPIDA,ANISEQ
|
||
SCALEXX
|
||
DIE
|
||
*
|
||
*FLIP THE LIGHTNING ON DIE COBRA
|
||
*
|
||
LITFLP
|
||
MMTM SP,A0,A8
|
||
ADDI (LITE-1)*64,A8
|
||
MOVE *A8,A8,L
|
||
CALLA RANDOM
|
||
CALLA FLP
|
||
MMFM SP,A0,A8
|
||
RETS
|
||
*
|
||
*HEAD IS HIT BY BULLET
|
||
*A0=BULLET
|
||
*A1=INJURY COUNT
|
||
COBBULHD
|
||
CALLR RTALK
|
||
*CHECK BULLET SUBTYPE
|
||
MOVB *A0(OID),A1
|
||
CMPI SUBGRND,A1
|
||
JRNE COBBULHD1
|
||
MOVI COBHDPT,A1 ;BONUS SCORE FOR GRENADE TO HEAD
|
||
CALLA SCORPLAY
|
||
MOVI 50,A1
|
||
COBBULHD1
|
||
MOVE @COBWOUND,A2,W ;ADD IN DAMAGE
|
||
ADD A1,A2
|
||
MOVE A2,@COBWOUND,W
|
||
MOVE @COBRAKIL,A1
|
||
MOVE @STATUS,A0
|
||
CMPI 3,A0
|
||
JRZ TWOP
|
||
SUBI 250,A1
|
||
CMP A1,A2
|
||
JRUC ONEP
|
||
TWOP CMP A1,A2 ;2000
|
||
ONEP JRLO COBBULHD2
|
||
MOVK 1,A2
|
||
MOVE A2,@COBFLG,W ;ITS BLOWING FOLKS, CAN EVERYTHING
|
||
MOVB A2,@ENDON
|
||
|
||
CREATE 0,COBTIM ;TIME THE FINAL BASH
|
||
COBBULHD2
|
||
MMFM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11
|
||
CALLR COBEXP
|
||
JRUC EXJUMP ;JUMP SUCKER ON EXPLOSION HIT
|
||
COBBULHDX
|
||
MMFM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11
|
||
RETS
|
||
*
|
||
*JUMP COBRA ON EXPLOSION HIT
|
||
*A8=OBJECT HIT
|
||
*
|
||
EXJUMP
|
||
MMTM SP,A0,A1,A2,A4,A7,A8
|
||
*FIND COBRA PROCESS
|
||
CALLR FINDHDPRC ;FIND HEAD PROCESS
|
||
JREQ JMPEX
|
||
*CHECK NON-RANDOM VELOCITY
|
||
MOVB *A0(OID),A4 ;ISOLATE SUBTYPE
|
||
SLL 4,A4
|
||
ADDI BULSHTAB,A4 ;VARIABLE SHIFT BASED ON SUBTYPE
|
||
MOVE *A4,A4,W
|
||
JREQ EXJ1
|
||
*GET BULLET VELOCITY
|
||
MOVE *A0(OYVEL),A1,L
|
||
SLL A4,A1
|
||
SRA 2,A1
|
||
MOVE A1,*A2(PDATA+>20),L ;YVEL
|
||
MOVE *A0(OXVEL),A0,L
|
||
SLL A4,A0
|
||
SRA 2,A0
|
||
MOVE A0,*A2(PDATA+>00),L ;XVEL
|
||
JRUC EXJ2
|
||
*GET RANDOM VELOCITY
|
||
EXJ1
|
||
MOVI >20000,A0
|
||
CALLA RANDU
|
||
ADDI >40000,A0
|
||
NEG A0
|
||
MOVE A0,A1
|
||
MOVE A1,*A2(PDATA+>20),L ;RANDOM YVEL
|
||
MOVI >20000,A0
|
||
CALLA SRAND
|
||
MOVE A0,*A2(PDATA+>00),L ;RANDOM XVEL
|
||
*DO A STFVEL
|
||
EXJ2
|
||
PUSH A8
|
||
MOVE A2,A8
|
||
ADDI PDATA+>100,A8 ;GET STORE AREA
|
||
CALLA STFVEL ;STUFF VELOCITY IN ALL PARTS
|
||
CALLR HEADLIT
|
||
MOVE *SP+,A8,L
|
||
*START HEAD FLASH PROCESS
|
||
CREATE COBPID,HEADFL
|
||
MOVE A2,*A0(PA8),L ;HEAD PROCESS BLOCK PTR
|
||
JMPEX:
|
||
MMFM SP,A0,A1,A2,A4,A7,A8
|
||
RETS
|
||
*
|
||
*FIND HEAD PROCESS TO OBJECT IN A8
|
||
*RET PROC IN A2
|
||
*
|
||
FINDHDPRC:
|
||
MMTM SP,A0,A4
|
||
MOVI ACTIVE,A2,L
|
||
FNDNXT:
|
||
MOVE *A2,A2,L ;GET NEXT
|
||
JREQ FNDHDX ;ALL DONE
|
||
MOVE *A2(PROCID),A4
|
||
CMPI COBPIDM,A4 ;MATCH?
|
||
JRNE FNDNXT ;NO
|
||
MOVE *A8(OPLINK),A0,L
|
||
SUB A2,A0
|
||
CMPI PRCSIZ,A0
|
||
JRHI FNDNXT ;NOT OUR SNAKE
|
||
FNDHDX:
|
||
MOVE A2,A2
|
||
MMFM SP,A0,A4
|
||
RETS
|
||
|
||
COBBODPT .EQU >100
|
||
COBHDPT .EQU >200
|
||
*
|
||
*HEAD LIGHTNING
|
||
*A8=HEAD DATA STRUCT
|
||
*
|
||
HEADLIT
|
||
MMTM SP,A0,A1,A7,A9,A10
|
||
MOVK 2,A10
|
||
MOVI LITNING,A9
|
||
CREATE COBPIDA,ANISEQ
|
||
MMFM SP,A0,A1,A7,A9,A10
|
||
RETS
|
||
*
|
||
*FLASH THE HEAD
|
||
*A8=HEAD PROCESS
|
||
*
|
||
HEADFL
|
||
MOVE A8,A9
|
||
ADDI PDATA+>100,A9
|
||
MOVI >3939,A2 ;BRIGHT WHITE IN PALETTE
|
||
HEADFLP0
|
||
MOVE *A9,A0,L
|
||
JREQ HEADFL0
|
||
MOVE *A0(OFLAGS),A1,W
|
||
ANDI >FFF0,A1
|
||
ORI DMACNZ,A1
|
||
MOVE A1,*A0(OFLAGS),W
|
||
MOVE A2,*A0(OCONST),W
|
||
ADDI >40,A9
|
||
JRUC HEADFLP0
|
||
HEADFL0
|
||
SLEEP 1
|
||
MOVE A8,A9
|
||
ADDI PDATA+>100,A9
|
||
HEADFLP1
|
||
MOVE *A9,A0,L
|
||
JREQ HEADFL1
|
||
MOVE *A0(OFLAGS),A1,W
|
||
ANDI >FFF0,A1
|
||
ORI DMAWNZ,A1
|
||
MOVE A1,*A0(OFLAGS),W
|
||
ADDI >40,A9
|
||
JRUC HEADFLP1
|
||
HEADFL1
|
||
DIE
|
||
*
|
||
*FLATFACE BULLET EXPLOSION
|
||
*A0=BULLET
|
||
*A8=FACE PART
|
||
*
|
||
BULEXP
|
||
MMTM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9
|
||
MOVE *A0(OYVAL),A1,L
|
||
MOVE *A0(OXVAL),A0,L
|
||
MOVI EXPb1,A2 ;(OIMG)
|
||
MOVI 231,A3 ;(OZPOS)
|
||
MOVI DMAWNZ,A4 ;(OFLAGS) NON-ZERO VALUE
|
||
MOVI CLSNEUT,A5 ;(OID)
|
||
CLR A6 ;XV
|
||
CLR A7 ;YV
|
||
CALLA BEGINOBJ2
|
||
MOVI SMLEXP,A9
|
||
BULEXP1
|
||
CREATE 0,BEXPRC
|
||
MOVE A0,*A8(OPLINK),L ;FIX PROCESS LINK
|
||
MMFM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9
|
||
RETS
|
||
*
|
||
*BULLET EXPLOSION
|
||
*A8=OBJECT
|
||
*A9=ANIMATION
|
||
BEXPRC
|
||
; MOVI BOMBSND,A0 ;AUDIO BOMB EXPLODE
|
||
; CALLA ONESND
|
||
MOVK 1,A1
|
||
JSRP FRANIM
|
||
MOVE A8,A0 ;KILL THE SHIT AND DIE
|
||
CALLA DELOBJ
|
||
CALLA DELPAL
|
||
JAUC SUCIDE
|
||
*
|
||
*A0=BULLET
|
||
*A8=BODY PART HIT
|
||
*
|
||
COBEXP
|
||
MMTM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9
|
||
MOVE *A0(OYVAL),A1,L
|
||
MOVE *A0(OXVAL),A0,L
|
||
MOVE *A8(OZPOS),A3,W ;OZPOS
|
||
INC A3
|
||
MOVI EXPb1,A2 ;(OIMG)
|
||
MOVI DMAWNZ,A4 ;(OFLAGS) NON-ZERO VALUE
|
||
MOVI CLSNEUT,A5 ;(OID)
|
||
CLR A6 ;XV
|
||
CLR A7 ;YV
|
||
CALLA BEGINOBJ2
|
||
MOVI BOOM2,A9
|
||
CREATE 0,BEXPRC
|
||
MOVE A0,*A8(OPLINK),L ;FIX PROCESS LINK
|
||
MMFM SP,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9
|
||
RETS
|
||
*
|
||
*COBRA BLOW ANIMATION
|
||
*A8=POINTER TO OBJECT POINTER BLOCK
|
||
*A9=ANI SEQ TABLE ADDR
|
||
*A10=SLEEP TIME
|
||
*A11=LOOP COUNT
|
||
ANILP
|
||
MMTM A12,A9
|
||
ANILPL
|
||
MOVE A10,A0
|
||
JSRP ANIBSEQ
|
||
JRNC ANILPL
|
||
MMFM A12,A9
|
||
DEC A11
|
||
JRNE ANILP
|
||
RETP
|
||
*
|
||
*COBRA BLOW TIMER
|
||
*
|
||
COBTIM
|
||
SLEEP 150
|
||
MOVK 2,A0
|
||
MOVE A0,@COBFLG
|
||
SLEEP 150
|
||
MOVK 3,A0
|
||
MOVE A0,@COBFLG
|
||
SLEEP 200
|
||
MOVK 4,A0
|
||
MOVE A0,@COBFLG
|
||
DIE
|
||
*
|
||
*RUN THE SCALES UP FOR SPECIAL EFFECT
|
||
*A9 = BODY STRUCTURE POINTER
|
||
COBSCAL
|
||
*FIND THE BASE OF SNAKE MY FRIEND
|
||
ADDI >40,A9
|
||
COBSCL1
|
||
MOVE *A9+,A8,L
|
||
JRNE COBSCL1
|
||
MOVE *A9(->40),A8,L ;THIS IS IT
|
||
COBSBLP
|
||
CLR A10
|
||
CREATE COBPID,SCALEUP ;RUN A LOT OF THEM
|
||
MOVE @COBFLG,A0,W ;BAG IT IF TIMER UP
|
||
CMPI 1,A0
|
||
JRHI COBSCLX
|
||
SLOOP 3,COBSBLP
|
||
COBSCLX
|
||
DIE
|
||
*
|
||
*SPARK COBRA HEAD
|
||
*A8=HEAD STRUCT POINTER
|
||
*
|
||
COBSPARK
|
||
MOVI LITNING,A9
|
||
CALLR LITFLP ;RANDOM LIGHTNING FLIP
|
||
COBSPKL
|
||
MOVE @COBFLG,A0,W ;BAG IT IF TIMER UP
|
||
CMPI 1,A0
|
||
JRHI COBSPKX
|
||
MOVI 1,A0
|
||
JSRP ANIBSEQ
|
||
JRNC COBSPKL
|
||
JRUC COBSPARK
|
||
COBSPKX
|
||
MOVI LITEND,A9
|
||
MOVI 1,A0
|
||
JSRP ANIBSEQ
|
||
DIE
|
||
*
|
||
*ANIMATE COBRA BLOW
|
||
*A8=HEAD STRUCT POINTER
|
||
*
|
||
COBLOANI
|
||
MOVK 2,A10
|
||
MOVI TUNGO,A9
|
||
CREATE COBPIDA,ANISEQ
|
||
MOVK 5,A10
|
||
MOVI BLINK,A9
|
||
CREATE COBPIDA,ANISEQ
|
||
MOVK 5,A10
|
||
MOVI BITE,A9
|
||
CREATE COBPIDA,ANISEQ
|
||
SLEEP 22
|
||
MOVE @COBFLG,A0,W ;BAG IT IF TIMER UP
|
||
CMPI 1,A0
|
||
JRLS COBLOANI
|
||
DIE
|
||
*
|
||
*BLOW THE DUDE UP FOLKS
|
||
*A8=SNAKE DATA BLOCK
|
||
*A11=TIME COUNTER
|
||
*PDATA=XVEL
|
||
*PDATA+>20=YVEL
|
||
*PDATA+>40=XACC
|
||
*PDATA+>60=YACC
|
||
*PDATA+>80=LINK TO SNAKE STRUCTURE
|
||
*
|
||
COBBLOP:
|
||
MOVE A13,A8
|
||
ADDI PDATA+>100,A8
|
||
CREATE COBPIDA,COBLOANI ;ANIMATE THE BLOWUP
|
||
MOVE *A13(PDATA+>80),A9,L ;GET BODY POINTER
|
||
CREATE COBPIDA,COBSCAL ;RUN THE SCALES
|
||
CREATE COBPIDA,COBSPARK ;SPARK THE HEAD
|
||
MOVK 10,A10 ;TIME/VELOCITY SEGMENT
|
||
MOVI VELTAB,A11
|
||
SOUND1 SHKSND
|
||
COBBLOPL
|
||
; MOVI 30,A0
|
||
; CALLA RANDPER
|
||
; JRNC COBBLOP0 ;MAKE RATTLE SOUND
|
||
; SOUND1 SHKSND
|
||
;COBBLOP0
|
||
MOVI >22,A0
|
||
CALLA RANDPER
|
||
JRNC COBBLOP1
|
||
MOVI >20000000,A2 ;SCALE FACTOR
|
||
MOVE *A11+,A0,L
|
||
CMPI >FFFFFFFF,A0
|
||
JRNE COBB1
|
||
MOVI VELTAB,A11 ;LOOP THE TABLE
|
||
MOVE *A11+,A0,L
|
||
COBB1
|
||
MPYS A2,A0
|
||
SLL 1,A0
|
||
MOVE A0,*A13(PDATA+>40),L
|
||
MOVE *A11+,A0,L
|
||
MPYS A2,A0
|
||
SLL 1,A0
|
||
MOVE A0,*A13(PDATA+>60),L
|
||
|
||
MOVE *A11+,A0,L
|
||
MPYS A2,A0
|
||
SLL 1,A0
|
||
MOVE A0,*A13(PDATA),L
|
||
MOVE *A11+,A0,L
|
||
MPYS A2,A0
|
||
SLL 1,A0
|
||
MOVE A0,*A13(PDATA+>20),L
|
||
COBBLOP1
|
||
CALLR COBVEL1
|
||
SLEEP 1
|
||
MOVE @COBFLG,A0,W
|
||
CMPI 2,A0 ;CHECK TIME
|
||
JRLO COBBLOPL ;NOT YET READY TO MOVE ON
|
||
*MOVE HIM TO CENTER
|
||
; SOUND1 DIGOFF
|
||
SOUND1 RATL
|
||
MOVE *A8,A9,L
|
||
MOVE *A9(OXVAL),A0,L
|
||
MOVE @WORLDTLX,A1,L ;ADJUST FOR WORLD COORD
|
||
SUB A1,A0
|
||
MOVE @WORLDTLY,A2,L
|
||
MOVE *A9(OYVAL),A1,L
|
||
SUB A2,A1
|
||
SUBI >800000,A1
|
||
SUBI >640000,A0
|
||
NEG A1
|
||
NEG A0
|
||
SRA 5,A1
|
||
MOVE A1,*A13(PDATA+>20),L
|
||
SRA 5,A0
|
||
MOVE A0,*A13(PDATA),L
|
||
CALLA STFVEL
|
||
MOVI BUGEYE,A9,L ;BUG EYES BEFORE BLOW UP !!!!
|
||
CALLR ANIBOSS
|
||
SLEEP 24
|
||
|
||
*CREATE EXPLOSION BURST
|
||
SOUND1 EXP3HI ;BLOW UP SOUND
|
||
MOVE A8,A10
|
||
MOVI 28,A11
|
||
HEADBLOP
|
||
MOVE *A13(PDATA+>20),A7,L
|
||
MOVE *A13(PDATA),A6,L
|
||
MOVI >18000,A0
|
||
CALLA SRAND
|
||
ADD A0,A7
|
||
MOVI >18000,A0
|
||
CALLA SRAND
|
||
ADD A0,A6
|
||
MOVE *A10,A8,L
|
||
CALLA GETANIXY
|
||
ADDI >180000,A2 ;ADJUST VERTICAL
|
||
MOVE A2,A1
|
||
MOVE A3,A0
|
||
MOVI EXPb1,A2 ;(OIMG)
|
||
MOVI >1F0,A3 ;(OZPOS)
|
||
MOVI DMAWNZ,A4 ;(OFLAGS) NON-ZERO VALUE
|
||
MOVI CLSNEUT,A5 ;(OID)
|
||
CALLA BEGINOBJ2
|
||
MOVI BOOM4,A9
|
||
CREATE 0,BEXPRC
|
||
MOVE A0,*A8(OPLINK),L ;FIX PROCESS LINK
|
||
MOVE A0,A1
|
||
MOVI 10,A0
|
||
CALLA RANDU
|
||
MOVE A0,*A1(PTIME),W ;A LITTLE RANDOM
|
||
DSJ A11,HEADBLOP
|
||
|
||
MMTM SP,A12
|
||
MOVI 5,A11
|
||
HEADBLOW
|
||
MOVE *A13(PDATA+>20),A7,L
|
||
MOVE *A13(PDATA),A6,L
|
||
MOVI >20000,A0
|
||
CALLA SRAND
|
||
ADD A0,A7
|
||
MOVI >20000,A0
|
||
CALLA SRAND
|
||
ADD A0,A6
|
||
MOVE *A10,A8,L
|
||
MOVE *A8(OPAL),A12,W
|
||
CALLA GETANIXY
|
||
MOVE A2,A1
|
||
MOVE A3,A0
|
||
MOVI SNK1A,A2 ;(OIMG)
|
||
MOVI >1F0,A3 ;(OZPOS)
|
||
MOVI DMAWNZ,A4 ;(OFLAGS) NON-ZERO VALUE
|
||
MOVI CLSNEUT,A5 ;(OID)
|
||
MMTM SP,A0,A1,A2,A3,A4,A5,A6,A7
|
||
CALLA BEGINOBJ2
|
||
MOVE A12,*A8(OPAL),W
|
||
CREATE 0,HDBLOPRC
|
||
MMFM SP,A0,A1,A2,A3,A4,A5,A6,A7
|
||
MOVI DMAWNZ+M_FLIPH,A4
|
||
SUBI >50000,A0 ;ADJUST FLIPPED X
|
||
CALLA BEGINOBJ2
|
||
MOVE A12,*A8(OPAL),W
|
||
CREATE 0,HDBLOPRC
|
||
|
||
DSJ A11,HEADBLOW
|
||
MMFM SP,A12
|
||
|
||
SLEEP 10
|
||
|
||
*DISAPPEAR FIRST PIECE
|
||
MOVE A10,A9
|
||
MOVE *A9,A8,L
|
||
MOVI >FFF0,A0
|
||
MOVE *A8(OFLAGS),A1,W ;BLANK HIM OUT
|
||
AND A0,A1
|
||
MOVE A1,*A8(OFLAGS),W
|
||
COBB2
|
||
*DELETE OTHER HEAD PIECES
|
||
ADDI >40,A9
|
||
MOVE *A9,A8,L
|
||
JREQ COBB3
|
||
CLR A1
|
||
MOVE A1,*A9,L ;ZERO IT OUT
|
||
MOVE A8,A0
|
||
CALLA DELPAL ;DELETE THE PIECE
|
||
CALLA DELOBJ
|
||
JRUC COBB2
|
||
COBB3
|
||
|
||
|
||
*BLEED THE SUCKER
|
||
*GET NECK PIECE
|
||
SOUND1 BUBL
|
||
MOVE *A13(PDATA+>80),A9,L ;GET BODY POINTER
|
||
ADDI >40,A9 ;ADJUST FOR FIRST HEAD SECTION
|
||
CREATE COBPID,SPEWPRC
|
||
BLEEDLP
|
||
MOVI 40,A0
|
||
CALLA RANDPER
|
||
JRNC BLEED1
|
||
|
||
MOVI >10000,A0
|
||
CALLA SRAND
|
||
MOVE A0,*A13(PDATA+>40),L
|
||
MOVI >10000,A0
|
||
CALLA SRAND
|
||
MOVE A0,*A13(PDATA+>60),L
|
||
BLEED1
|
||
CALLA COBVEL1
|
||
SLEEP 2
|
||
MOVE @COBFLG,A0,W ;BAG IT IF TIMER UP
|
||
CMPI 2,A0
|
||
JRLS BLEEDLP
|
||
*BLOW UP THE SECTIONS
|
||
SOUND1 YAMOFF
|
||
MOVE *A13(PDATA+>80),A9,L ;GET BODY POINTER
|
||
ADDI >40,A9
|
||
BLOSLP
|
||
CALLR BLOSECT
|
||
MOVI 40,A0
|
||
CALLA RANDPER
|
||
JRNC BLOS1
|
||
|
||
MOVI >10000,A0
|
||
CALLA SRAND
|
||
MOVE A0,*A13(PDATA+>40),L
|
||
MOVI >10000,A0
|
||
CALLA SRAND
|
||
MOVE A0,*A13(PDATA+>60),L
|
||
BLOS1
|
||
CALLA COBVEL1
|
||
SLEEP 4
|
||
ADDI >20,A9
|
||
MOVE *A9(>20),A0,L
|
||
JRNE BLOSLP
|
||
|
||
MOVE *A13(PDATA+>80),A9,L ;GET BODY POINTER
|
||
ADDI >40,A9
|
||
BLOS1L
|
||
MOVE *A9+,A0,L ;DELETE THE WHOLE FUCKER
|
||
JREQ BLOS2
|
||
MOVE A0,A10
|
||
CALLA DELPAL ;KILL THE SNAKE BODY + PROCESS
|
||
CALLA DELOBJ
|
||
JRUC BLOS1L
|
||
BLOS2
|
||
MOVI COBPIDS,A0 ;KILL OLD PROCESSES
|
||
CLR A1
|
||
NOT A1
|
||
CALLA KILALL
|
||
*BOIL SOME BLOOD DUDES
|
||
MOVE *A10(OYPOS),A1,W
|
||
SUBK 10,A1
|
||
SLL 16,A1
|
||
MOVE *A10(OXPOS),A10,W
|
||
ADDK >10,A10
|
||
MOVY A1,A10 ;SAVE Y:X POS IN A10
|
||
MOVI 70,A11
|
||
BOILP0
|
||
MOVI 5,A9
|
||
BOILP
|
||
SOUND1 BUBL ;BUBBLE SOUND
|
||
CREATE 0,BOIL ;BOIL YOUR BLOOD
|
||
DSJS A9,BOILP
|
||
SLEEP 2
|
||
DSJS A11,BOILP0
|
||
|
||
SLEEP 20
|
||
CREATE 0,PUTGRATE ;PUT OUT THE GRATE, DUDES
|
||
SOUND1 YAMOFF
|
||
SOUND1 EXP3HI ;BLOW UP SOUND
|
||
|
||
MOVI 30,A11
|
||
BASEBLOP
|
||
MOVI >18000,A0
|
||
CALLA SRAND
|
||
MOVE A0,A6
|
||
MOVI >18000,A0
|
||
CALLA SRAND
|
||
MOVE A0,A7
|
||
|
||
MOVX A10,A0
|
||
SLL 16,A0
|
||
MOVY A10,A1
|
||
ADDI >1A0000,A1
|
||
MOVI EXPb1,A2 ;(OIMG)
|
||
MOVI >1F0,A3 ;(OZPOS)
|
||
MOVI DMAWNZ,A4 ;(OFLAGS) NON-ZERO VALUE
|
||
MOVI CLSNEUT,A5 ;(OID)
|
||
CALLA BEGINOBJ2
|
||
MOVI BOOM4,A9
|
||
CREATE 0,BEXPRC
|
||
MOVE A0,*A8(OPLINK),L ;FIX PROCESS LINK
|
||
MOVE A0,A1
|
||
MOVI 10,A0
|
||
CALLA RANDU
|
||
MOVE A0,*A1(PTIME),W ;A LITTLE RANDOM
|
||
DSJ A11,BASEBLOP
|
||
|
||
MOVI VICMSC,A0
|
||
CALLA ONESND
|
||
|
||
SLEEP 120
|
||
MOVI DEXPID,A0
|
||
CLR A1
|
||
NOT A1
|
||
CALLA EXISTP
|
||
JRNZ SKIP
|
||
CREATE DEXPID,CEXIT
|
||
SKIP
|
||
CLR A0
|
||
MOVB A0,@ENDON
|
||
DIE
|
||
DEXPID .EQU 6666H
|
||
CEXIT CREATE 0,DEXIT
|
||
SLEEP 10
|
||
DIE
|
||
*
|
||
*PUT THE GRATE OUT THERE
|
||
*
|
||
PUTGRATE
|
||
SLEEP 20
|
||
MOVI >550000,A0
|
||
CALLR GRATESUB
|
||
MOVI >10D0000,A0
|
||
CALLR GRATESUB
|
||
DIE
|
||
GRATESUB
|
||
MOVI >6A0000,A1
|
||
MOVI FLRGRD,A2 ;(OIMG)
|
||
MOVI >40,A3 ;(OZPOS)
|
||
MOVI DMAWNZ,A4 ;(OFLAGS) NON-ZERO VALUE
|
||
MOVI CLSNEUT,A5 ;(OID) INITIALLY HARMLESS
|
||
CLR A6 ;(XV)
|
||
CLR A7 ;(YV)
|
||
JAUC BEGINOBJ
|
||
*
|
||
*HEAD BLOW PROCESS
|
||
*A8=OBJECT
|
||
*
|
||
HDBLOPRC
|
||
SLEEP 40
|
||
MOVE A8,A0
|
||
CALLA DELPAL
|
||
CALLA DELOBJ
|
||
DIE
|
||
*
|
||
*BOIL BLOOD AT FIXED SPOT
|
||
*A10=Y:X COORD
|
||
*
|
||
BOIL
|
||
MOVI >8000,A0
|
||
CALLA SRAND
|
||
MOVE A0,A6
|
||
MOVI >8000,A0
|
||
CALLA SRAND
|
||
MOVE A0,A7
|
||
|
||
MOVX A10,A0
|
||
SLL 16,A0
|
||
MOVY A10,A1
|
||
|
||
MOVI bldclt1,A2 ;(OIMG)
|
||
MOVI >1F0,A3 ;(OZPOS)
|
||
MOVI DMAWNZ,A4 ;(OFLAGS) NON-ZERO VALUE
|
||
MOVI CLSNEUT,A5 ;(OID) INITIALLY HARMLESS
|
||
CALLA BEGINOBJ2
|
||
|
||
MOVI OVALBLD2,A9 ;DO IT
|
||
MOVK 1,A1
|
||
JSRP FRANIM
|
||
MOVE A8,A0
|
||
CALLA DELPAL ;KILL THE SNAKE BODY + PROCESS
|
||
CALLA DELOBJ
|
||
DIE
|
||
|
||
*
|
||
*BLOW UP A NECK SECTION
|
||
*A9=POINTER TO SECTION TO BLOW
|
||
*
|
||
BLOSECT
|
||
MMTM SP,A8,A9,A10,A11
|
||
SOUND1 EXP3HI ;BLOW UP SOUND
|
||
MOVE *A9,A0,L
|
||
MOVE *A0(OZPOS),A1,W
|
||
MOVE *A0(OFLAGS),A2,W
|
||
ANDI >FFF0,A2
|
||
MOVE A2,*A0(OFLAGS),W
|
||
MOVE A1,-*SP,W ;SAVE THE Z
|
||
MOVE *A9,A8,L
|
||
CALLA GETANIXY
|
||
ADDI >180000,A2 ;ADJUST VERTICAL
|
||
ADDI >100000,A3 ;ADJUST X
|
||
CLR A6
|
||
CLR A7
|
||
MOVE A2,A1
|
||
MOVE A3,A0
|
||
MOVI EXPb1,A2 ;(OIMG)
|
||
; MOVE *SP,A3,W ;(OZPOS)
|
||
MOVI >1D0,A3 ;
|
||
MOVI DMAWNZ,A4 ;(OFLAGS) NON-ZERO VALUE
|
||
MOVI CLSNEUT,A5 ;(OID)
|
||
CALLA BEGINOBJ2
|
||
|
||
MOVI BOOMC,A9 ;DO IT
|
||
CREATE 0,BEXPRC
|
||
MOVE A0,*A8(OPLINK),L ;FIX PROCESS LINK
|
||
ADDK >10,SP
|
||
MMFM SP,A8,A9,A10,A11
|
||
RETS
|
||
BOOMC:
|
||
.LONG EXPb4
|
||
.WORD 4
|
||
.LONG EXPb5
|
||
.WORD 4
|
||
.LONG EXPb6
|
||
.WORD 4
|
||
.LONG EXPb7
|
||
.WORD 3
|
||
.LONG EXPb8
|
||
.WORD 3
|
||
.LONG EXPb9
|
||
.WORD 3
|
||
.LONG 0
|
||
*
|
||
*SPEW BLOOD OUT OF THE NECK
|
||
*
|
||
SPEWPRC
|
||
MOVE *A9,A10,L
|
||
SPEWLP
|
||
MOVK 10,A0
|
||
CALLR CHKFREE
|
||
JRNE SPEWL0
|
||
CREATE 0,SPEW
|
||
CREATE 0,SPEW
|
||
CREATE 0,SPEW
|
||
CREATE 0,SPEW
|
||
CREATE 0,SPEW
|
||
SPEWL0
|
||
SLEEP 5
|
||
MOVE @COBFLG,A0,W ;BAG IT IF TIMER UP
|
||
CMPI 2,A0
|
||
JRLS SPEWLP
|
||
DIE
|
||
*
|
||
*CHECK FOR A0 FREE PROCESSES
|
||
*RET EQ IF THEY ARE FREE, NE IF FAIL
|
||
CHKFREE
|
||
MMTM SP,A0
|
||
MOVI OFREE,A1,L
|
||
CHKFREL
|
||
MOVE *A1,A1,L
|
||
JREQ CHKFREX
|
||
DSJS A0,CHKFREL
|
||
CHKFREX
|
||
MOVE A0,A0
|
||
MMFM SP,A0
|
||
RETS
|
||
*
|
||
*SPINNING VELOCITY TABLE
|
||
*XVEL,YVEL,XACC,YACC
|
||
VELTAB
|
||
.LONG >00040000,>00000000,>00010000,>00000000
|
||
.LONG >00040000,>00040000,>00010000,>00010000
|
||
.LONG >00000000,>00040000,>00000000,>00010000
|
||
.LONG >FFFC0000,>00040000,>FFFF0000,>00010000
|
||
.LONG >FFFC0000,>00000000,>FFFF0000,>00000000
|
||
.LONG >FFFC0000,>FFFC0000,>FFFF0000,>FFFF0000
|
||
.LONG >00000000,>FFFC0000,>00000000,>FFFF0000
|
||
.LONG >00040000,>FFFC0000,>00010000,>FFFF0000
|
||
.LONG >FFFFFFFF
|
||
*
|
||
*ACCELERATE, DAMP, AND CLIP COBRA VELOCITY
|
||
*
|
||
COBVEL1
|
||
MOVE *A13(PDATA+>40),A2,L ;GET ACCELERATIONS
|
||
MOVE *A13(PDATA+>60),A3,L
|
||
MOVE *A13(PDATA),A0,L ;GET VELOCITIES
|
||
MOVE *A13(PDATA+>20),A1,L
|
||
MOVE A2,A6
|
||
MOVE A3,A7
|
||
ADD A0,A2
|
||
ADD A1,A3
|
||
MOVE A2,A0
|
||
MOVE A3,A1
|
||
SRA 3,A2 ;SUB OUT DAMPING FACTOR
|
||
SRA 3,A3
|
||
SUB A2,A0
|
||
SUB A3,A1
|
||
*IN BOUNDS ?
|
||
MOVE A13,A8
|
||
ADDI PDATA+>100,A8 ;GET STORE AREA
|
||
MOVE *A8,A8,L ;GET FIRST OBJECT
|
||
CALLA GETANIXY ;RET A2=YVAL,A3=XVAL
|
||
MOVE @WORLDTLX,A4,L ;ADJUST FOR SCREEN RELATIVE
|
||
MOVE @WORLDTLY,A5,L
|
||
SUB A4,A3
|
||
SUB A5,A2
|
||
CMPI >300000,A3
|
||
JRGT MVVV02 ;NOT TO THE LEFT
|
||
ABS A0
|
||
ABS A6
|
||
MVVV02
|
||
CMPI >1600000,A3
|
||
JRLT MVVV03 ;NOT TO THE RIGHT
|
||
ABS A0
|
||
NEG A0
|
||
ABS A6
|
||
NEG A6
|
||
MVVV03
|
||
CMPI >10000,A2
|
||
JRGT MVVV04
|
||
ABS A1
|
||
ABS A7
|
||
MVVV04
|
||
CMPI >980000,A2
|
||
JRLT MVVV05
|
||
ABS A1
|
||
NEG A1
|
||
ABS A7
|
||
NEG A7
|
||
MVVV05
|
||
MOVE A0,*A13(PDATA),L
|
||
MOVE A1,*A13(PDATA+>20),L
|
||
MOVE A6,*A13(PDATA+>40),L
|
||
MOVE A7,*A13(PDATA+>60),L
|
||
MOVE A13,A8
|
||
ADDI PDATA+>100,A8 ;GET STORE AREA
|
||
CALLA STFVEL ;STUFF VELOCITY IN ALL PARTS
|
||
RETS
|
||
*
|
||
*SPEW BLOOD OUT OF NECK
|
||
*A8=BLOOD OBJECT
|
||
*A9=ANI SCRIPT
|
||
*A10=NECK PIECE TO FOLLOW
|
||
*PDATA=LOOP TIME
|
||
*PDATA+>20=X OFFSET FROM NECK
|
||
*PDATA+>40=Y OFFSET
|
||
SPEW
|
||
MOVI >C0000,A0
|
||
CALLA SRAND
|
||
MOVE A0,A1
|
||
ADDI >FFF80000,A1
|
||
MOVE A1,*A13(PDATA+>40),L
|
||
|
||
MOVI >C0000,A0
|
||
CALLA SRAND
|
||
ADDI >C0000,A0
|
||
MOVE A0,*A13(PDATA+>20),L
|
||
|
||
CLR A6
|
||
CLR A7
|
||
MOVE *A10(OXVAL),A2,L
|
||
ADD A2,A0
|
||
MOVE *A10(OYVAL),A3,L
|
||
ADD A3,A1
|
||
MOVI bldclt1,A2 ;(OIMG)
|
||
MOVI >1F0,A3 ;(OZPOS)
|
||
MOVI DMAWNZ,A4 ;(OFLAGS) NON-ZERO VALUE
|
||
MOVI CLSNEUT,A5 ;(OID) INITIALLY HARMLESS
|
||
CALLA BEGINOBJ2
|
||
|
||
MOVI OVALBLD2,A9 ;DO IT
|
||
SPWLP1
|
||
MOVI 4,A11
|
||
MOVK 4,A1
|
||
JSRP FRANIM
|
||
JRC SPEWDIE
|
||
SPWLP
|
||
CALLA GETANIXY
|
||
MOVE *A10(OXVAL),A0,L
|
||
SUB A0,A3
|
||
MOVE *A13(PDATA+>20),A1,L
|
||
SUB A3,A1
|
||
MOVE *A8(OXVAL),A0,L
|
||
ADD A1,A0
|
||
MOVE A0,*A8(OXVAL),L
|
||
|
||
MOVE *A10(OYVAL),A0,L
|
||
SUB A0,A2
|
||
MOVE *A13(PDATA+>40),A1,L
|
||
SUB A2,A1
|
||
MOVE *A8(OYVAL),A0,L
|
||
ADD A1,A0
|
||
MOVE A0,*A8(OYVAL),L
|
||
SLEEP 1
|
||
DSJS A11,SPWLP
|
||
JRUC SPWLP1
|
||
SPEWDIE
|
||
MOVE A8,A0 ;BAIL OUT
|
||
CALLA DELPAL
|
||
CALLA DELOBJ
|
||
DIE
|
||
OVALBLD2:
|
||
;OVAL BLOOD EXPLOSION
|
||
.LONG bldclt1
|
||
.WORD 3
|
||
.LONG bldclt2
|
||
.WORD 3
|
||
.LONG bldclt3
|
||
.WORD 3
|
||
.LONG bldclt4
|
||
.WORD 3
|
||
.LONG bldclt5
|
||
.WORD 3
|
||
.LONG bldclt6
|
||
.WORD 3
|
||
.LONG bldclt7
|
||
.WORD 3
|
||
.LONG bldclt8
|
||
.WORD 3
|
||
.LONG 0
|
||
*
|
||
*BLOW THE HEAD
|
||
*HEAD BLOOD GUSH W/GROUND EXPLODES AND SCREEN SHAKE
|
||
*BLOW NECK DOWN TO NOTHING AS IT SWINGS
|
||
*FADE OUT AND DIE
|
||
|
||
|
||
*
|
||
*
|
||
*BOD SECTION IS HISTORY
|
||
*
|
||
;COBBUL2
|
||
; MOVI COBBODPT,A1 ;AMOUNT OF SCORE FOR ORB
|
||
; CALLA SCORPLAY
|
||
; CALLA BODCLEAN
|
||
; CREATE 0,BODBLO
|
||
*
|
||
*GALAGA EXPLOSION PROCESS
|
||
*A8=ORB
|
||
*
|
||
BODBLO:
|
||
CLR A6
|
||
CLR A7
|
||
CALLA GETANIXY
|
||
; ADDI 0350000H,A2 ;A1=Y OFFSET
|
||
MOVE A2,A1
|
||
MOVE A3,A0
|
||
MOVI 199,A3 ;259
|
||
MOVI DMAWNZ|M_NOCOLL|M_FLIPV,A4 ;NON-ZERO VALUE
|
||
MOVI CLSNEUT|TYPNEUT,A5
|
||
MOVI EXPb1,A2
|
||
CALLA BEGINOBJ2
|
||
|
||
;CREATE EXPLOSION, AND THEN DIE
|
||
MOVI BOOM4,A9
|
||
MOVK 1,A1
|
||
JSRP FRANIM
|
||
MOVE A8,A0
|
||
CALLA DELOBJ
|
||
DIE
|
||
*
|
||
*STICK TOGETHER PROCESS
|
||
*
|
||
STICKP
|
||
CALLR STICKER
|
||
SLOOP 6,STICKP
|
||
*
|
||
*HOLD BIG GUY TOGETHER
|
||
*A8=BIG GUY DATA BLOCK
|
||
*FOLLOW FIRST PIECE
|
||
STICKER
|
||
MMTM SP,A8,A12,A13
|
||
MOVE A8,A9
|
||
MOVE *A8,A10,L ;FIRST PIECE INDEX
|
||
MOVE *A10(OIMG),A1,L
|
||
MOVE *A10(OSIZE),A2,L
|
||
MOVE *A10(OFLAGS),A4,W
|
||
CALLA GANIOF ;GET X Y ANI OFFSET
|
||
MOVE A6,A12 ;SAVE X ANIOFF
|
||
MOVE A7,A13 ;SAVE Y ANIOFF
|
||
JRUC STICK2
|
||
STICKL
|
||
MOVE *A8(OIMG),A1,L
|
||
MOVE *A8(OSIZE),A2,L
|
||
MOVE *A8(OFLAGS),A4,W
|
||
CALLA GANIOF ;GET X Y ANI OFFSET
|
||
BTST B_FLIPH,A4
|
||
JREQ STICK1
|
||
ADDI >50000,A6 ;ADJUST FLIP KLUDGE
|
||
STICK1
|
||
MOVE *A10(OXVAL),A0,L
|
||
ADD A12,A0
|
||
SUB A6,A0
|
||
MOVE A0,*A8(OXVAL),L
|
||
MOVE *A10(OYVAL),A1,L
|
||
ADD A13,A1
|
||
SUB A7,A1
|
||
MOVE A1,*A8(OYVAL),L
|
||
STICK2
|
||
ADDI >40,A9
|
||
MOVE *A9,A8,L ;GET NEXT INDEX
|
||
JRNE STICKL ;DONE STICKING
|
||
MMFM SP,A8,A12,A13
|
||
RETS
|
||
*
|
||
*ANISEQ
|
||
*A8=POINTER TO OBJECT POINTER BLOCK
|
||
*A9=ANI SEQ TABLE ADDR
|
||
*A10=SLEEP TIME
|
||
ANISEQ
|
||
ANISEQL
|
||
MOVE A10,A0
|
||
JSRP ANIBSEQ
|
||
JRNC ANISEQL
|
||
DIE
|
||
*
|
||
*ANIMATE BOSS MONSTER FRAME
|
||
*A0=SLEEP TIME, 0= NO SLEEP
|
||
*A8=POINTER TO OBJECT POINTER BLOCK
|
||
*A9=ANIMATION SEQUENCE ADDR
|
||
*RET CS IF SEQ ENDED
|
||
ANIBSEQ
|
||
MOVE *A9,A1,W ;NULL FRAME?
|
||
JREQ ANIBSQX ;YES, ITS ALL OVER
|
||
|
||
CALLR ANIBOSS
|
||
CALLA PRCSLP
|
||
CLRC
|
||
RETP
|
||
ANIBSQX
|
||
SETC
|
||
RETP
|
||
*
|
||
*ANIMATE BOSS MONSTER
|
||
*A8=POINTER TO OBJECT POINTER BLOCK
|
||
*A9=ANIMATION TABLE ADDR
|
||
*RETS A9 POINTING TO NEXT FRAME
|
||
ANIBOSS
|
||
MMTM SP,A0,A1,A2,A3,A4,A7,A8,A10
|
||
MOVE A8,A10
|
||
ANIBSL
|
||
MOVB *A9,A7 ;GET PART NUMBER
|
||
ADDK 8,A9 ;INCREMENT POINTER
|
||
DEC A7
|
||
SLL 6,A7
|
||
ADD A10,A7
|
||
MOVE *A7,A8,L ;GET OBJECT POINTER
|
||
MOVB *A9,A1 ;GET NEW FRAME NUMBER
|
||
ABS A1
|
||
MOVB A1,*A7(AFRAME)
|
||
|
||
DEC A1 ;ELIMINATE 0 CASE
|
||
MOVI COBANITB1-COBANITB,A2
|
||
MPYU A2,A1 ;ADJUST FOR LENGTH OF ENTRY
|
||
ADDI COBANITB,A1 ;ADD TABLE BASE
|
||
MOVE *A7(DAMAGEL),A3,W ;GET DAMAGE LEVEL
|
||
SRL 1,A3
|
||
SLL 5,A3 ;ADJUST FOR LONG WORD
|
||
ADD A3,A1
|
||
MOVE *A1,A1,L ;GET OIMG
|
||
MOVE *A8(OFLAGS),A4,W ;GET FLAGS
|
||
CALLA ANI ;ANIMATE IT
|
||
ADDK 8,A9 ;INCREMENT POINTER
|
||
MOVB *A9(-8),A1 ;WAS LAST ENTRY NEG?
|
||
JRNN ANIBSL ;NOPE, STILL GOING
|
||
ANIBDON
|
||
MMFM SP,A0,A1,A2,A3,A4,A7,A8,A10
|
||
RETS
|
||
*
|
||
*ANIMATION SCRIPTS
|
||
*
|
||
*ANIMATION TABLE
|
||
*PART #, ANI FRAME
|
||
*NEG=END OF FRAME
|
||
*
|
||
*OPEN MOUTH
|
||
*
|
||
BITE
|
||
.BYTE LFTMTH,MOUTHO1,RTMTH,-MOUTHO1
|
||
.BYTE LFTMTH,MOUTHO2,RTMTH,-MOUTHO2
|
||
.BYTE LFTMTH,MOUTHO1,RTMTH,-MOUTHO1
|
||
BITECL
|
||
.BYTE LFTMTH,MOUTHCL,RTMTH,-MOUTHCL
|
||
.WORD 0
|
||
*
|
||
*PUT YOUR HEAD DOWN
|
||
*
|
||
;HEADDN
|
||
; .BYTE LFTMTH,MOUTHCL,RTMTH,MOUTHCL ;MOUTH CLOSED
|
||
; .BYTE LFTHEAD,SNKDWN,RTHEAD,SNKDWN ;HEAD DOWN
|
||
; .BYTE LFTTNG,TONGUE0,RTTNG,TONGUE0 ;TUNG IN
|
||
; .BYTE LFTEYE,MOUTHCL,RTEYE,-MOUTHCL ;EYES GONE
|
||
; .WORD 0
|
||
*
|
||
*PUT YOUR HEAD UP
|
||
*
|
||
;HEADUP
|
||
; .BYTE LFTHEAD,HEAD,RTHEAD,-HEAD ;HEAD BACK
|
||
; .BYTE LFTEYE,SNKEYE2,RTEYE,-SNKEYE2 ;EYES OPEN
|
||
; .WORD 0
|
||
*
|
||
*OPEN MOUTH AND BUGEYE
|
||
*
|
||
SNKFLAM
|
||
.BYTE LITE,LITE0 ;LIGHTNING OFF
|
||
.BYTE LFTTNG,TONGUE0,RTTNG,TONGUE0 ;TUNG IN
|
||
.BYTE LFTMTH,MOUTHO1,RTMTH,-MOUTHO1 ;OPEN MOUTH
|
||
.BYTE LFTMTH,MOUTHO2,RTMTH,-MOUTHO2
|
||
BUGEYE
|
||
.BYTE LFTEYE,SNKEYE3,RTEYE,-SNKEYE3 ;EYES BUGGED
|
||
.BYTE LFTEYE,SNKEYE3,RTEYE,-SNKEYE3 ;EYES BUGGED
|
||
.BYTE LFTEYE,SNKEYE2,RTEYE,-SNKEYE2 ;EYES OPEN
|
||
.BYTE LFTEYE,SNKEYE3,RTEYE,-SNKEYE3 ;EYES BUGGED
|
||
.BYTE LFTEYE,SNKEYE3,RTEYE,-SNKEYE3 ;EYES BUGGED
|
||
.BYTE LFTEYE,SNKEYE2,RTEYE,-SNKEYE2 ;EYES OPEN
|
||
.BYTE LFTEYE,SNKEYE3,RTEYE,-SNKEYE3 ;EYES BUGGED
|
||
.BYTE LFTEYE,SNKEYE3,RTEYE,-SNKEYE3 ;EYES BUGGED
|
||
.WORD 0
|
||
*
|
||
*CLOSE MOUTH AND NORMAL EYE
|
||
*
|
||
SNKFLAMX
|
||
.BYTE LFTEYE,SNKEYE2,RTEYE,SNKEYE2 ;EYES OPEN
|
||
.BYTE LFTMTH,MOUTHO1,RTMTH,-MOUTHO1
|
||
.BYTE LFTMTH,MOUTHCL,RTMTH,-MOUTHCL
|
||
.WORD 0
|
||
*
|
||
*BLINK EYES
|
||
*
|
||
BLINK
|
||
.BYTE LFTEYE,SNKEYE1,RTEYE,-SNKEYE1 ;EYES 1/2 OPEN
|
||
.BYTE LFTEYE,SNKEYE0,RTEYE,-SNKEYE0 ;EYES CLOSED
|
||
.BYTE LFTEYE,SNKEYE1,RTEYE,-SNKEYE1 ;EYES 1/2 OPEN
|
||
.BYTE LFTEYE,SNKEYE2,RTEYE,-SNKEYE2 ;EYES OPEN
|
||
.WORD 0
|
||
TUNGO
|
||
.BYTE LFTTNG,TONGUE0,RTTNG,-TONGUE0 ;TUNG IN
|
||
.BYTE LFTTNG,TONGUE1,RTTNG,-TONGUE1 ;TUNG 1/4 OUT
|
||
.BYTE LFTTNG,TONGUE2,RTTNG,-TONGUE2 ;TUNG 1/2 OUT
|
||
.BYTE LFTTNG,TONGUE3,RTTNG,-TONGUE3 ;TUNG 3/4 OUT
|
||
.BYTE LFTTNG,TONGUE4,RTTNG,-TONGUE4 ;TUNG OUT
|
||
.BYTE LFTTNG,TONGUE3,RTTNG,-TONGUE3 ;TUNG 3/4 OUT
|
||
.BYTE LFTTNG,TONGUE2,RTTNG,-TONGUE2 ;TUNG 1/2 OUT
|
||
.BYTE LFTTNG,TONGUE1,RTTNG,-TONGUE1 ;TUNG 1/4 OUT
|
||
.BYTE LFTTNG,TONGUE0,RTTNG,-TONGUE0 ;TUNG IN
|
||
.WORD 0
|
||
LITNING
|
||
.BYTE LITE,-LITE1
|
||
.BYTE LITE,-LITE2
|
||
.BYTE LITE,-LITE3
|
||
.BYTE LITE,-LITE4
|
||
.BYTE LITE,-LITE5
|
||
.BYTE LITE,-LITE6
|
||
.BYTE LITE,-LITE7
|
||
.BYTE LITE,-LITE8
|
||
LITEND
|
||
.BYTE LITE,-LITE0
|
||
.WORD 0
|
||
.EVEN
|
||
*
|
||
*ANIMATION NUMBERS
|
||
*
|
||
HEAD .SET 1
|
||
SNKEYE0 .SET 2
|
||
SNKEYE1 .SET 3
|
||
SNKEYE2 .SET 4
|
||
SNKEYE3 .SET 5
|
||
MOUTHCL .SET 6
|
||
MOUTHO1 .SET 7
|
||
MOUTHO2 .SET 8
|
||
TONGUE0 .SET 9
|
||
TONGUE1 .SET 10
|
||
TONGUE2 .SET 11
|
||
TONGUE3 .SET 12
|
||
TONGUE4 .SET 13
|
||
LITE0 .SET 14
|
||
LITE1 .SET 15
|
||
LITE2 .SET 16
|
||
LITE3 .SET 17
|
||
LITE4 .SET 18
|
||
LITE5 .SET 19
|
||
LITE6 .SET 20
|
||
LITE7 .SET 21
|
||
LITE8 .SET 22
|
||
;SNKDWN .SET 23
|
||
*
|
||
*PART NUMBERS
|
||
*
|
||
LFTHEAD .SET 1
|
||
RTHEAD .SET 2
|
||
LFTEYE .SET 3
|
||
RTEYE .SET 4
|
||
LFTMTH .SET 5
|
||
RTMTH .SET 6
|
||
LFTTNG .SET 7
|
||
RTTNG .SET 8
|
||
LITE .SET 9
|
||
*
|
||
*TABLE OF COBRA ANIMATIONS
|
||
*0-255; 0=NULL
|
||
*FLAGS(16), OIMG(32) DAMAGE LEVEL 1-6
|
||
*
|
||
COBANITB
|
||
* 1 HEAD
|
||
.LONG SNK1,SNK1A
|
||
COBANITB1
|
||
* 2 EYE CLOSED
|
||
.LONG SNKI1,SNKI1
|
||
* 3 EYE 1/2 OPEN
|
||
.LONG SNKI2,SNKI2
|
||
* 4 EYE OPEN
|
||
.LONG SNKI3,SNKI3
|
||
* 5 EYE BUGGED BRIGHT
|
||
.LONG SNKI4,SNKI4
|
||
* 6 MOUTH CLOSED
|
||
.LONG SNKNULL,SNKNULL
|
||
* 7 MOUTH 1/2 OPEN
|
||
.LONG SNKM1,SNKM1
|
||
* 8 MOUTH OPEN
|
||
.LONG SNKM2,SNKM2
|
||
* 9 NO TONGUE
|
||
.LONG SNKNULL,SNKNULL
|
||
* 10 SHORT TONGUE
|
||
.LONG SNKTNG1,SNKTNG1
|
||
* 11 1/2 TONGUE
|
||
.LONG SNKTNG2,SNKTNG2
|
||
* 12 3/4 TONGUE
|
||
.LONG SNKTNG3,SNKTNG3
|
||
* 13 FULL TONGUE
|
||
.LONG SNKTNG4,SNKTNG4
|
||
* 14 NO LIGHTNING
|
||
.LONG LTSK0,LTSK0
|
||
* 15 LIGHTNING 1
|
||
.LONG LTSK1,LTSK1
|
||
* 16 LIGHTNING 2
|
||
.LONG LTSK2,LTSK2
|
||
* 17 LIGHTNING 3
|
||
.LONG LTSK3,LTSK3
|
||
* 18 LIGHTNING 4
|
||
.LONG LTSK4,LTSK4
|
||
* 19 LIGHTNING 5
|
||
.LONG LTSK5,LTSK5
|
||
* 20 LIGHTNING 6
|
||
.LONG LTSK6,LTSK6
|
||
* 21 LIGHTNING 7
|
||
.LONG LTSK7,LTSK7
|
||
* 22 LIGHTNING 8
|
||
.LONG LTSK8,LTSK8
|
||
* 23 SNAKE LOOK DOWN
|
||
; .LONG SNLDN1,SNLDN1A
|
||
*
|
||
*INITIALIZE ROBOT BOSS TABLE
|
||
*
|
||
COBITAB:
|
||
*PART 1 LEFT HEAD
|
||
.WORD DMAWNZ ;FLAGS
|
||
.WORD CLSENMY|TYPCOB|SUBCOBHD ;TYPE
|
||
.WORD HEAD ;ANIMATION #
|
||
*PART 2 RIGHT HEAD
|
||
.WORD DMAWNZ+M_FLIPH
|
||
.WORD CLSENMY|TYPCOB|SUBCOBHD
|
||
.WORD HEAD
|
||
*PART 3 LEFT EYE
|
||
.WORD DMAWNZ+M_PIXSCAN
|
||
.WORD CLSENMY|TYPCOB|SUBCOBHD
|
||
.WORD SNKEYE1
|
||
*PART 4 RIGHT EYE
|
||
.WORD DMAWNZ+M_PIXSCAN+M_FLIPH
|
||
.WORD CLSENMY|TYPCOB|SUBCOBHD
|
||
.WORD SNKEYE1
|
||
*PART 5 LEFT MOUTH
|
||
.WORD DMAWNZ
|
||
.WORD CLSENMY|TYPCOB|SUBCOBHD
|
||
.WORD MOUTHCL
|
||
*PART 6 RIGHT MOUTH
|
||
.WORD DMAWNZ+M_FLIPH
|
||
.WORD CLSENMY|TYPCOB|SUBCOBHD
|
||
.WORD MOUTHCL
|
||
*PART 7 LEFT TONGUE
|
||
.WORD DMAWNZ
|
||
.WORD CLSENMY|TYPCOB|SUBCOBHD
|
||
.WORD TONGUE1
|
||
*PART 8 RIGHT TONGUE
|
||
.WORD DMAWNZ+M_FLIPH
|
||
.WORD CLSENMY|TYPCOB|SUBCOBHD
|
||
.WORD TONGUE1
|
||
*PART 9 LIGHTNING
|
||
.WORD DMAWNZ+M_FLIPH
|
||
.WORD CLSNEUT
|
||
.WORD LITE0
|
||
.WORD 0 ;END OF LIST
|
||
*
|
||
*FLAMER ANIMATION
|
||
*
|
||
FLAME
|
||
.LONG FLM1
|
||
.WORD 3
|
||
.LONG FLM2
|
||
.WORD 3
|
||
.LONG FLM3
|
||
.WORD 3
|
||
.LONG FLM4
|
||
.WORD 3
|
||
.LONG FLM5
|
||
.WORD 3
|
||
.LONG FLM6A
|
||
.WORD 3
|
||
.LONG FLM7A
|
||
.WORD 3
|
||
.LONG FLM8A
|
||
.WORD 3
|
||
.LONG FLM9A
|
||
.WORD 3
|
||
.LONG 0
|
||
FLAME2
|
||
.LONG FLM10A
|
||
.WORD 3
|
||
.LONG FLM11A
|
||
.WORD 3
|
||
.LONG FLM12A
|
||
.WORD 3
|
||
.LONG 0
|
||
*
|
||
*RANDOM TALK
|
||
*
|
||
RTALK
|
||
MMTM SP,A0
|
||
MOVI 160,A0
|
||
CALLA RANDPER
|
||
JRNC RTALKX
|
||
MOVI (RTLKTEND-RTLKTAB)/32,A0
|
||
CALLA RANDU
|
||
DEC A0
|
||
SLL 5,A0
|
||
ADDI RTLKTAB,A0
|
||
MOVE *A0,A0,L
|
||
CALLA ONESND
|
||
RTALKX
|
||
MMFM SP,A0
|
||
RETS
|
||
RTLKTAB
|
||
.LONG HASND,HA2SND,NOWAY,AWWSND,OUCH,RATL
|
||
RTLKTEND
|
||
|
||
*
|
||
*COBRA SOUNDS
|
||
*
|
||
RATL .WORD >FBFB-10H,>1E,>809C,0 ;RATTLE
|
||
FLAMO .WORD >FBFB-10H,>1E,>80AD,0 ;FIRE SPLAT
|
||
SNKSCR .WORD >F3EF-10H,>10,>80B5,0 ;SNAKE SCREAM DEATH
|
||
|
||
DIGOFF .WORD >F0FF|>800-10H,>01,>8000,0 ;TURN SOUND SIDE OFF
|
||
|
||
|
||
|
||
|
||
|
||
|
||
.END
|
||
|
||
|
||
|
||
|