.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