.FILE 'LZRORB.ASM' .TITLE 'ROBO-RAMA GAME PROGRAM' .WIDTH 132 .OPTION B,D,L,T .MNOLIST ; ; INITIATED: DECEMBER 20, 1989 ; MODIFIED: FOREVER.... ; SOFTWARE: EUGENE JARVIS ; ; COPYRIGHT (C) 1989 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 "MARK.EQU" ; ;SOUNDS ; .REF EXP1,EXP3,LAZSND,EXP3HI ; ;SYMBOLS EXTERNALLY DEFINED ; ; .REF LASERSPD .REF ECON,ORB_LIT,FRANIM,BIG3,SCRADD2,P1DATA,P2DATA,DEXIT .REF PSTOP,ADPCS4,HALT,BOUND,WAVE .REF GET_VALID_XY,GAMSTATE,WAVEYX,EHALT .REF RANDPER,RANDOM,RANGRAND,DRINF,SET_GATE_2,GET_WVADDR .REF RANDU,SRAND,PLYROBJS .REF FINDPAL,PALSET,DELPAL,GETFPAL ; ;SYMBOLS DEFINED IN THIS FILE ; .DEF SPAWN_ORB,ONSCRN_ORB,ORB_CNT,ORB_DN,MAXORB,OFSCRTST .DEF SCORPLAY,ORBBNDCK,BOOM4 .DEF KILL_O1,ORB_ORB,KILL_LZR,ORBLAZ,ORBBUL,KILL_OB,GETPLYR ; ;UNINITIALIZED RAM DEFINITIONS ; .BSS MAXORB,8 ;MAXIMUM ON SCREEN FOR CURRENT WAVE .BSS ORB_CNT,16 ;ORB CNT ON SCREEN .BSS ORB_DN,16 ;0=NO, 1=YES ; ;EQUATES/STRUCURES FOR THIS FILE TO FOLLOW ; ; ;ORB DATA STRUCTURE ; .TEXT ; ONSCRN_ORB: ;A2=# OF ORBS TO CREATE ON SCREEN AT START OF WAVE CREATE CYCPID,ORB_LIT MOVB A2,@ECON ;YES ENEMY TO ENEMY! OH1 PUSH A2 ;CREATE A BUNCH OF THEM CREATE ORBPID,OORB PULL A2 DSJNE A2,OH1 PUSH A11 MOVI ORBCTB0,A11 MOVE @WAVE,A0 CMPI 1,A0 JRZ OH2 CMPI 2,A0 JRZ OH2 CMPI 8,A0 JRZ OH2 CMPI 13,A0 JRZ OH2 MOVI 700,A0 CALLA RANDPER JRC OH2 MOVI ORBCTB1,A11 OH2 CREATE 0,ORBCOL PULL A11 RETS ORBDLY SLEEP 4*60 MOVI CYCPID,A0 MOVE A0,*A10(PROCID) DIE * *COLOR CYCLE YOUR ORBS *A11=TABLE TO USE ORBCOL SLEEP 4 MOVE A13,A10 CREATE 0,ORBDLY MOVI NUORB,A0 CALLA FINDPAL JREQ ORBCOL SLL 24,A0 ;ISOLATE THE NUMBER SRL 16,A0 CLR A10 MOVE A0,A9 ORBCOLP MOVE A9,A1 ;GET DESTINATION MOVI 24,A2 INC A10 CMPI 3,A10 JRLO ORBCOL1 CLR A10 ORBCOL1 MOVE A10,A0 SLL 5,A0 ADD A11,A0 MOVE *A0,A0,L CALLA PALSET SLEEP 6 JRUC ORBCOLP ORBCTB0 .LONG NUORB2+16,NUORB+16,NUORB3+16 ;BLUE GLOWER ORBCTB1 .LONG NUORB5+16,NUORB4+16,NUORB5+16 ;GREEN-YELLOW GLOWER OORB: ;OORB IS CALLED AT THE START OF A WAVE TO PLACE X # OF ORBS ON SCREEN ;AT THE BEGINNING OF A WAVE ;CLEAR ANY STRUCTURE VARIABLES HERE MOVI 60,A0 MOVI 60,A1 MOVB @BOUND,A2 JRNZ TOPIT CLR A11 ;A11 CLR=SKIP CIRCLE TABLE ALIGNMENT CALLA GET_VALID_XY ;MAKE SURE NEW ORB IS NOT ;OVERLAPPING ANY EXISTING SHAPE ;WHICH IS ALREADY ON SCRN AT START ;A0 & A1 ARE SET UP ;ADD IN OFFSETS FOR THIS PARTICULAR ARENA TOPIT MOVE @GAMSTATE,A2 CMPI INAMODE,A2 JREQ DMD MOVE @WAVEYX,A2,L ;A2=PACKED OFFSETS MOVX A2,A3 SLL 16,A3 ADD A3,A0 ;ADJUSTED A0 XVAL! ANDI 0FFFF0000H,A2 ADD A2,A1 ;ADJUSTED A1 YVAL! ; DMD ;A0,A1 ARE SETUP. CALLR IH1 ;INIT ORB (BEGINOBJ) CALLA BEGINOBJ2 ;STUFF OBJ CALLR SETUP_ORB ;INC ORB_CNT JRUC LUP_TOP SPAWN_ORB: ;CALLED TO SEND OUT 1 ORB FROM A RANDOM DOOR. ;SPAWN ORB IS CALLED FROM 'WAVE OVERLORD' CODE WHICH DISPERSES ;ALL THE BAD GUYS THROUGHOUT A WAVE MOVE @ORB_DN,A0 ;0=STILL SOME TO COME OUT ;1=ALL FINISHED! JRNZ ORB_OUT MOVE @ORB_CNT,A2 ;MOVE BYTE (# ORB ON SCRN) TO A2 MOVB @MAXORB,A3 CMP A3,A2 ;ORBS MAXED OUT? JRGT ORB_OUT ; MOVB A3,@ECON ;YES ENEMY TO ENEMY! CREATE ORBPID,AORB ;START ONE ORB ORB_OUT: RETS ; AORB: ;YES A NEW ORB WILL APPEAR ;THIS ORB WAS SPAWNED FROM 'WAVE OVERLORD' CODE CALLA INIT_ORB CALLR SETUP_ORB ;INC CNT, SET DIR, SET DEATH FLAG, ETC * * ORB PROCESS * A8=OBJECT * A11=PLAYER TO SEEK * A13=PROCESS * PDATA=BULLET HIT COUNT * PDATA+>10=ORB FIRING LASER = LASER PROCESS OR 0 * PDATA+>30=ORB CRASHING >=1 * PDATA+>40=XACC * PDATA+>50=YACC LUP_TOP: CLR A0 MOVE A0,*A13(PDATA),L ;CLEAR BULLET HIT COUNT MOVE A0,*A13(PDATA+>20),L ;CLEAR LASER FIRE AND CRASH FLAGS SLEEP 2 MOVE @EHALT,A0 JRNZ LUP_TOP ;HALT ORBS WHILE PLAYER ENTERS SLEEP 30 CALLA GETPLYR MOVE A0,A11 CALLA GETORBV MV: MOVI 100,A0 ;GET NEW VELOCITY? CALLA RANDPER JRNC MVV01 ;NO CALLR GETORBV MOVI 20,A0 ;GET NEW PLAYER TO SEEK CALLA RANDPER JRNC MVV01 ;NO CALLA GETPLYR MOVE A0,A11 MVV01 MOVE *A13(PDATA+>40),A0,W ;GET ACCELERATIONS MOVE *A13(PDATA+>50),A1,W MOVE *A8(OXVEL),A2,L MOVE *A8(OYVEL),A3,L ADD A0,A2 ADD A1,A3 MOVE A2,A0 MOVE A3,A1 SRA 4,A0 ;SUB OUT DAMPING FACTOR SRA 4,A1 SUB A0,A2 SUB A1,A3 MOVE A2,*A8(OXVEL),L MOVE A3,*A8(OYVEL),L CALLR ORBBNDCK ;CHECK BOUNDARY COLLISION MOVI 09,A0 ;08 CALLA RANDPER JRNC MV1 CALLR GETLZDIR ;GET LAZER DIRECTION SLL 5,A0 ;ADJUST FOR LONG WORDS MOVI LASTAB,A10 ;RANDOM FIRING ANGLE ADD A0,A10 ;GROUPS OF THREE ADD A0,A10 ADD A0,A10 MOVE *A10+,A0,L ;GET FIRING IMAGE MOVE *A10+,A9,L ;GET POSITIONING ANIMATION MOVE *A8(OIMG),A1,L CMP A0,A1 ;ON FIRING IMAGE? JREQ MVV ;YES MOVK 1,A1 ;ROTATE INTO POSITION JSRP FRANIM MVV CALLA PSTOP ;STOP THE ORB ; MOVE @HALT,A0 ; JRNZ MVFIRLP CLR A1 MOVI LZRPID,A1 MOVE *A10,A7,L CALLA GETPRC MOVE A8,*A0(PDATA),L ;TELL LASER WHO FIRED IT MOVE A0,*A13(PDATA+>10),L ;TELL ORB LASER PROCESS MOVI LAZSND,A0 CALLA ONESND MVFIRLP SLEEP 4 MOVE *A13(PDATA+>10),A0,L ;LASER STILL GOING ? JRNE MVFIRLP ;YES CLR A0 ;LASER IS DONE MOVE A0,*A13(PDATA+>20),W CALLR GETORBV ;GET ORB VELOCITY MV1 SLEEP 2 JRUC MV LASTAB .LONG ORB1,ROTSD,LASRR,ORB1,ROTSD,LASRL .LONG ORB4,ROTUP,LASRU,ORB4,ROTUP,LASRD .LONG ORB1,ROTSD,LASRR,ORB1,ROTSD,LASRL .LONG ORB4,ROTUP,LASRU,ORB4,ROTUP,LASRD * *GET LASER DIRECTION *A8=ORB, A11=TARGET *RETURNS A0=0(RT),1(LFT),2(UP),3(DOWN) GETLZDIR: *CALCULATE DELTAX, DELTAY MOVE *A8(OXPOS),A0,W MOVE *A8(OYPOS),A1,W MOVE *A11(OXPOS),A2,W MOVE *A11(OYPOS),A3,W SUB A0,A2 SUB A1,A3 MOVE A2,A4 MOVE A3,A5 ABS A4 ABS A5 CLR A0 CMP A4,A5 JRHI GTLZDR0 MOVE A2,A2 JRNN GTLZDRX MOVK 1,A0 JRUC GTLZDRX GTLZDR0 MOVK 2,A0 MOVE A3,A3 JRN GTLZDRX MOVK 3,A0 GTLZDRX RETS * *GET ORB VELOCITY *A11=PLAYER TO SEEK *RETURNS PDATA+>40 XACC; PDATA+>50 YACC * GETORBV MOVI 50,A0 CALLA SRAND MOVE A0,A1 MOVI 50,A0 CALLA SRAND MOVE *A11(OXPOS),A2,W MOVE *A11(OYPOS),A3,W ADD A0,A2 ADD A1,A3 MOVE *A8(OXPOS),A0,W MOVE *A8(OYPOS),A1,W SUB A0,A2 SUB A1,A3 SLL 6,A2 SLL 6,A3 MOVE A2,*A13(PDATA+>40),W MOVE A3,*A13(PDATA+>50),W RETS * *CHECK ORB OUT OF BOUNDS *A0,A1,A2,A3 DESTROYED ORBBNDCK: MOVI [>3A,>2A],A2 ;BOUNDS CHECK MOVI [>E8,>166],A3 CALLA SCRTSTG JREQ MV0 ;IN BOUNDS O.K. MOVE *A8(OXVEL),A1,L MOVE *A8(OYVEL),A2,L DEC A0 JRNE MV01 ABS A1 ;MAKE XV POSITIVE JRUC MV00 MV01 DEC A0 JRNE MV02 ABS A1 ;MAKE XV NEGATIVE NEG A1 JRUC MV00 MV02 ABS A2 DEC A0 JREQ MV00 ;UP CASE NEG A2 ;DOWN WALL CASE MV00 MOVE A1,*A8(OXVEL),L MOVE A2,*A8(OYVEL),L MV0 RETS INIT_ORB: ;INITIAL ORB POSITION,IMAGE SHAPE,AGE ETC.... ;DO STFOBF AND GET A0 PNTR MOVI 0,B0 ;DOORS 1-4 MOVI 4,B1 CALLA RANGRAND ;TIE THIS IN WITH DIFFICULTY! MOVE A0,A1 SLL 5,A1 ADDI DRINF,A1 MOVE *A1,A1,L MOVB *A1,A1 JRZ G CMPI 06,A1 JRGE G ;DOOR THIS GUY WILL BE SENT TO IS CLOSING RIGHT NOW. SO SEND HIM TO DOOR 4 MOVI 4,A0 ;DOOR 4 G PUSH A0 ;A0=DOOR 1-4 MOVI >1F,A1 ;TIME FOR DOOR TO REMAIN OPEN ;OPEN DOOR CALLA SET_GATE_2 ;NOW PLACE ORB BEHIND APPROPRIATE DOOR PULL A2 MOVI SX,A1 SLL 5,A2 ;INTO DOOR X/Y TABLES ADD A2,A1 MOVE *A1,A0,L MOVI SY,A1 ADD A2,A1 MOVE *A1,A1,L ;A0=OXVAL ;A1=OYVAL PUSH A2 ;INDEX BASED ON DOOR 1-4 CALLR IH1 CALLA BEGINOBJ PULL A2 ;NOW GIVE X/Y VEL FOR THIS ORB MOVI ORBXV,A0 ADD A2,A0 MOVE *A0,A0,L MOVE A0,*A8(OXVEL),L ADDI ORBYV,A2 MOVE *A2,A0,L MOVE A0,*A8(OYVEL),L RETS ;DOOR # ; 3 ;1 2 ; 4 ORBXV: .LONG 0,10000H,-10000H,0,0 ORBYV: .LONG 0,0,0,10000H,-10000H IH1: ;ENTER HERE IF ON SCRN TANK ;STUFF NEEDED SHIT ;A0=OXVAL ;A1=OYVAL MOVI ORB1,A2 ;(OIMG) DOES NOT MATTER ; MOVI NUORB2,A2 ;(OIMG) DOES NOT MATTER MOVI 230,A3 ;(OZPOS) MOVI DMAWNZ,A4 ;(OFLAGS) NON-ZERO VALUE MOVI CLSENMY|TYPORB,A5 ;(OID) CLR A6 ;(OXVEL) CLR A7 ;(OYVEL) RETS SETUP_ORB: ; ; UPDATE ORB COUNT ; MOVE @ORB_CNT,A0 INC A0 MOVE A0,@ORB_CNT MOVI ORB,A2 CALLA GET_WVADDR MOVE *A0(32),A1,W ;GET DIFFICULTY LEVEL FOR THIS ORB ; MOVE A1,*A13(LEVEL),W MOVE *A0(16),A1,W ;DEC WAVE RAM CNT FOR THIS ORB DEC A1 MOVE A1,*A0(16),W JRNZ BZ ;END OF THIS WAVES ORB CNT MOVK 1,A1 MOVE A1,@ORB_DN CREATE 0,DEXIT ;TURNS ON ARROW, ETC. ;CREATE THIS ONLY WHEN ALL ENEMIES ;ARE GONE! ; BZ RETS SX: .LONG 0,-040000H,01960000H,0CA0000H,0CA0000H SY: .LONG 0,0830000H,0830000H,20000H,01140000H * *ORB KILL LAZER *A8=ORB OBJECT *KILL LAZER IF ANY * ORBKILLZR MMTM SP,A0,A1,A2,A7,A8 MOVE *A8(OPLINK),A2,L ;ORB PROCESS MOVE *A2(PDATA+>10),A1,L ;LINK TO LASER PROCESS JREQ KLX ;NO LAZER MOVE *A1(PA8),A8,L ;GET LAZER OBJECT JRUC KILL_LZR1 * *LAZER COLLIDE WITH PLAYER OR ORB * KILL_LZR ;A8=LAZER PNTR ;A0=WHAT I HIT MMTM SP,A0,A1,A2,A7,A8 MOVE *A8(OPLINK),A1,L MOVE *A1(PDATA),A1,L ;DID I HIT MY OWN ORB?? CMP A0,A1 JREQ KLX ;YES, NO ACTION MOVE *A1(OPLINK),A2,L KILL_LZR1 CLR A1 MOVE A1,*A2(PDATA+>10),L ;NULL OUT POINTER TO LASER MOVE A8,A0 CALLA DELOBJ CALLA DELPAL ********************** MOVI >5432,A2 ********************** MOVE *A8(OPLINK),A0,L CALLA KILL KLX MMFM SP,A0,A1,A2,A7,A8 RETS * *CLEAN UP ORB MESS *A8=ORB * ORBCLEAN MOVE *A8(OPLINK),A0,L CALLA KILL ;KILLS PROCESS IN A0 ORBCLN1 CALLR ORBKILLZR ;KILL LASER IF ANY MOVE A8,A0 CALLA DELPAL ;NEEDED? NOT IF IN PLYR PAL! CALLA DELOBJ MOVE @ORB_CNT,A0,W ;DELETE A FAT FROM CNT DEC A0 MOVE A0,@ORB_CNT,W RETS * *ORB HIT BY ORB * ;RESTORE EVERYTHING EXCEPT A0,A8 ;A0=KILLER ;A8=VICTIM ORB_ORB: MMTM SP,A1,A2,A3,A4,A5,A6,A7 CMP A8,A0 ;PROCESS ONLY ONCE JRHS ORBORBX MOVE *A8(OXPOS),A1,W MOVE *A0(OXPOS),A2,W SUB A2,A1 MOVE A1,A2 ABS A2 CMPI 16,A2 JRHI ORBORBX ;NOT CLOSE ENOUGH FOR COLLISION MOVE *A8(OYPOS),A3,W MOVE *A0(OYPOS),A4,W SUB A4,A3 MOVE A3,A4 ABS A4 CMPI 16,A4 JRHI ORBORBX ;NOT CLOSE ENOUGH FOR COLLISION SLL 16,A1 SLL 16,A3 SRA 5,A1 SRA 5,A3 MOVE *A8(OPLINK),A5,L ;ORB PROCESS MOVE *A5(PDATA+>10),A5,L ;LASER LINK JRNE ORBORB1 MOVE *A8(OXVEL),A2,L SRA 1,A2 ADD A2,A1 MOVE A1,*A8(OXVEL),L MOVE *A8(OYVEL),A4,L SRA 1,A4 ADD A4,A3 MOVE A3,*A8(OYVEL),L ORBORB1 MOVE *A0(OPLINK),A6,L ;ORB PROCESS MOVE *A6(PDATA+>10),A6,L ;LASER LINK JRNE ORBORBX ;YES, DONT MOVE NEG A1 MOVE *A0(OXVEL),A2,L SRA 1,A2 ADD A2,A1 MOVE A1,*A0(OXVEL),L NEG A3 MOVE *A0(OYVEL),A4,L SRA 1,A4 ADD A4,A3 MOVE A3,*A0(OYVEL),L ORBORBX MMFM SP,A1,A2,A3,A4,A5,A6,A7 RETS * *ORB HIT BY BULLET *A8=ORB *A0=BULLET THAT HIT US * ORBBUL MMTM SP,A0,A1,A2,A3,A7 MOVE *A8(OPLINK),A7,L ;ORB PROCESS MOVE *A7(PDATA+>10),A1,L ;LASER LINK JRNE ORBBUL1 ;DONT PUSH GUY SHOOTING MOVE *A0(OXVEL),A1,L ;GIVE IT A PUSH MOVE *A8(OXVEL),A2,L SRA 2,A1 ;2,A1 ADD A1,A2 MOVE A2,*A8(OXVEL),L MOVE *A0(OYVEL),A1,L MOVE *A8(OYVEL),A3,L SRA 2,A1 ;2,A1 ADD A1,A3 MOVE A3,*A8(OYVEL),L ORBBUL1 MOVE A0,A1 ;SAVE AO MOVE *A7(PDATA),A0,W ;INCREMENT HIT COUNT INC A0 MOVE A0,*A7(PDATA),W CMPI 3,A0 ;4 JRHS ORBBUL2 ;TOO MANY HITS, BLOW IT UP MOVI 300,A0 CALLA RANDPER JRNC ORBBULX ;IS THE GUY HISTORY??...NO * *ORB IS HISTORY GO INTO CRASH SPIN *KILL LASER IF ANY * ORBBUL2 MOVE *A7(PDATA+>30),A0,W JRNE ORBBULX ;ALREADY CRASHING *DIE GRAY ; MOVI NUORB2,A0 ;DULL GRAY DEATH ; CALLA GETFPAL ; MOVE A0,*A8(OPAL),W MOVE A1,A0 ;RESTORE A0, BULLET OBJECT THAT HIT YOU MOVI ORBPT,A1 ;AMOUNT OF SCORE FOR ORB CALLA SCORPLAY CALLR ORBKILLZR ;KILL LASER IF ANY MOVE *A8(OPLINK),A0,L ;ORB PROCESS MOVI ORBPID,A1,W ;GET ID MOVI ORBCRASH,A7 CALLA XFERPROC ORBBULX MMFM SP,A0,A1,A2,A3,A7 RETS OCRCTB .LONG NUORB4,NUORB5 * *SPIN AND CRASH THE ORB * ORBCRASH MOVI 6,A0 CALLA RANDU ADDI 3,A0 MOVE A0,A10 MOVI SPNORB,A9 ;TRY SPINNING ACTION MOVK 2,A0 ;GET SPIN RATE CALLA RANDU MOVE A0,*A13(PDATA+>30),W ;SET CRASHING FLAG CMPI 1,A0 ;ADJUST TIME FOR FAST SPIN JRNE ORBCRL ADDK 2,A10 ORBCRL MOVE *A13(PDATA+>30),A11,W ;GET SPIN RATE ORBCRL1 SLEEP 1 MOVI [>50,>40],A2 ;BOUNDS CHECK MOVI [>D0,>146],A3 CALLA SCRTSTG JRNE ORBBLO ;HIT A WALL DSJS A11,ORBCRL1 MOVK 4,A1 JSRP FRANIM JRNC ORBCRL MOVI SPNORB,A9 ;TRY SPINNING ACTION DSJS A10,ORBCRL *CLEAN UP THE MESS AND BLOW IT UP !!!! ORBBLO CALLR ORBCLN1 CALLR OEXP2 ;START THE EXPLOSION JAUC SUCIDE ;CAN THE PROCESS KILL_OB ;SMART BOMB DEATH! ;A8=ORB ;A9=P1 OR P2DATA OF WHO SMARTED ME MOVI ORBPT,A1 ;AMOUNT OF SCORE FOR ORB MOVE A9,A2 ;PLAYER CALLA SCRADD2 ;DO IT! CALLR ORBCLEAN CALLR OEXP RETS * *KILL ORB BECAUSE OF COLLISION WITH RING *EXTER HERE FROM COLLISION ROUTINE - RINGS KILL ORB *A8=ORB * KILL_O1 MMTM SP,A1,A2,A7 MOVI ORBPT,A1 ;AMOUNT OF SCORE FOR ORB CALLA SCORPLAY CALLR ORBCLEAN CALLR OEXP2 ;CHUNKS MMFM SP,A1,A2,A7 RETS * *PLAYER SCORE *A0=BULLET OBJECT THAT KILLED *A1=AMOUNT TO ADD (8 DIGIT BCD) * SCORPLAY MMTM SP,A0,A1,A2,A4,A7 ;SCRADD2 IS DIRTY, SAVE THESE MOVE *A0(OPLINK),A0,L MOVB *A0(MYPLYR),A0 ;A0=PLAYER NUMBER *FIND A2=P1DATA OR P2DATA MOVI P1DATA,A2 DEC A0 JREQ SCPL1 MOVI P2DATA,A2 SCPL1 CALLA SCRADD2 ;DO IT! MMFM SP,A0,A1,A2,A4,A7 RETS * *ORB EXPLOSION PROCESS SMART BOMB, RINGS * OEXP MOVI EXP3,A0 CALLA ONESND CREATE 0,BIG3 RETS OEXP2 MOVI EXP1,A0 CALLA ONESND CREATE 0,ORB_EXP CREATE 0,ADPCS4 RETS * *ORB COLLIDES WITH LAZER *A8=ORB IMAGE PTR *A0=LAZER * ORBLAZ: MMTM SP,A1,A2,A7 MOVE *A0(OPLINK),A1,L MOVE *A1(PDATA),A1,L CMP A1,A8 ;MY OWN LASER ? JREQ KILORBX ;YES, DONT DIE CALLR ORBCLEAN CREATE 0,ORB_EXP CREATE 0,ADPCS4 MOVI EXP3HI,A0 CALLA ONESND KILORBX MMFM SP,A1,A2,A7 RETS * *ORB EXPLOSION PROCESS *A8=ORB * ORB_EXP: 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 * *FIRE LASER TO THE RIGHT *A8=FIRING ORB OBJECT *GET A0=OXVAL, A1=OYVAL, A2=OIMG, A3=ZPOS, A4=OFLAGS, A5=OID, A6=XV, A7=YV LASRR MOVE *A8(OXPOS),A0,W ADDK 20,A0 SLL 16,A0 MOVE *A8(OYPOS),A1,W ADDK 6,A1 SLL 16,A1 MOVI HLINE,A2 MOVI 230,A3 MOVI DMAWNZ,A4 MOVI CLSENMY|TYPORBL,A5 CLR A6 CLR A7 CALLA BEGINOBJ2 MOVI >010001,A1 ;SHRINK TO POINT MOVE A1,*A8(OSIZEX),L MOVE A0,A8 * *LASER RIGHT PROCESS *A8=OBJECT *A13=PROC LASRRP MOVI [>23-5,>1A],A2 ;BOUNDS CHECK MOVI [>FC,>171+5],A3 CALLA OFSCRTST ;IS IT IN BOUNDS ? JRNE LASRRDIE ;DIE OFF RIGHT LASER IN WALL MOVE *A8(OSIZEX),A0,W ;GROW THE SUCKER ; MOVE @LASERSPD,A1 ; ADD A1,A0 ;ADDK 3 ADDK 3,A0 MOVE A0,*A8(OSIZEX),W SLOOP 1,LASRRP * *FIRE LASER TO THE LEFT *A8=FIRING ORB OBJECT *GET A0=OXVAL, A1=OYVAL, A2=OIMG, A3=ZPOS, A4=OFLAGS, A5=OID, A6=XV, A7=YV LASRL MOVE *A8(OXPOS),A0,W SLL 16,A0 MOVE *A8(OYPOS),A1,W ADDK 6,A1 SLL 16,A1 MOVI HLINE,A2 MOVI 230,A3 MOVI DMAWNZ,A4 MOVI CLSENMY|TYPORBL,A5 CLR A6 CLR A7 CALLA BEGINOBJ2 MOVI >010001,A1 ;SHRINK TO POINT MOVE A1,*A8(OSIZEX),L MOVE A0,A8 * *LASER LEFT PROCESS *A8=OBJECT *A13=PROC LASRLP MOVI [>23-5,>1A],A2 ;BOUNDS CHECK MOVI [>FC,>171+5],A3 CALLA OFSCRTST JRNE LASRLDIE ;DIE OFF RIGHT LASER IN WALL MOVE *A8(OSIZEX),A0,W ;GROW THE SUCKER ; MOVE @LASERSPD,A1 ; ADD A1,A0 ;ADDK 3 ADDK 3,A0 MOVE *A8(OXPOS),A1,W SUBK 3,A1 MOVE A1,*A8(OXPOS),W ;MOVE OVER TOP LEFT MOVE A0,*A8(OSIZEX),W SLOOP 1,LASRLP * *FIRE LASER UP *A8=FIRING ORB OBJECT *GET A0=OXVAL, A1=OYVAL, A2=OIMG, A3=ZPOS, A4=OFLAGS, A5=OID, A6=XV, A7=YV LASRU MOVE *A8(OXPOS),A0,W ADDK 8,A0 SLL 16,A0 MOVE *A8(OYPOS),A1,W SLL 16,A1 MOVI VLINE,A2 MOVI 230,A3 MOVI DMAWNZ,A4 MOVI CLSENMY|TYPORBL,A5 CLR A6 CLR A7 CALLA BEGINOBJ2 MOVI >010004,A1 ;SHRINK TO POINT MOVE A1,*A8(OSIZEX),L MOVE A0,A8 * *LASER UP PROCESS *A8=OBJECT *A13=PROC LASRUP MOVI [>23-5,>1A],A2 ;BOUNDS CHECK MOVI [>FC,>171+5],A3 CALLA OFSCRTST JRNE LASRUDIE ;DIE OFF RIGHT LASER IN WALL MOVE *A8(OSIZEY),A0,W ;GROW THE SUCKER ; MOVE @LASERSPD,A1 ; ADD A1,A0 ;ADDK 3 ADDK 3,A0 MOVE *A8(OYPOS),A1,W SUBK 3,A1 MOVE A1,*A8(OYPOS),W ;MOVE OVER TOP LEFT MOVE A0,*A8(OSIZEY),W SLOOP 1,LASRUP * *FIRE LASER DOWN *A8=FIRING ORB OBJECT *GET A0=OXVAL, A1=OYVAL, A2=OIMG, A3=ZPOS, A4=OFLAGS, A5=OID, A6=XV, A7=YV LASRD MOVE *A8(OXPOS),A0,W ADDK 7,A0 SLL 16,A0 MOVE *A8(OYPOS),A1,W ADDK 16,A1 SLL 16,A1 MOVI VLINE,A2 MOVI 230,A3 MOVI DMAWNZ,A4 MOVI CLSENMY|TYPORBL,A5 CLR A6 CLR A7 CALLA BEGINOBJ2 MOVI >010004,A1 ;SHRINK TO POINT MOVE A1,*A8(OSIZEX),L MOVE A0,A8 * *LASER DOWN PROCESS *A8=OBJECT *A13=PROC LASRDP MOVI [>23-5,>1A],A2 ;BOUNDS CHECK MOVI [>F2,>171+5],A3 CALLA OFSCRTST JRNE LASRDDIE ;DIE OFF RIGHT LASER IN WALL MOVE *A8(OSIZEY),A0,W ;GROW THE SUCKER ; MOVE @LASERSPD,A1 ; ADD A1,A0 ;ADDK 3 ADDK 3,A0 ; ADDK 3,A0 MOVE A0,*A8(OSIZEY),W SLOOP 1,LASRDP * *RIGHT LASER DIE *A8=OBJECT *A13=PROCESS LASRRDIE: MOVE *A8(OXPOS),A0,W ;SET X COORD TO END MOVE *A8(OSIZEX),A1,W ADD A1,A0 MOVI 1,A1 ;SET WIDTH TO 1 MOVE A1,*A8(OSIZEX),W MOVE A0,*A8(OXPOS),W MOVI SPLSHRT,A9 LASRDIE1 CALLA PSTOP ;STOP LASER MOVE *A13(PDATA),A0,L ;KILL POINTER IN ORB PROCESS MOVE *A0(OPLINK),A0,L CLR A1 MOVE A1,*A0(PDATA+>10),L ;NULL OUT POINTER TO LASER MOVI CLSNEUT,A0,W ;CHANGE TO CLASS NEUTRAL, NO COLLISIONS MOVE A0,*A8(OID),W MOVK 1,A1 JSRP FRANIM MOVE A8,A0 ;KILL THE SHIT AND DIE CALLA DELOBJ CALLA DELPAL JAUC SUCIDE * *LEFT LASER DIE * *A8=OBJECT *A13=PROCESS LASRLDIE: MOVI SPLSHLFT,A9 JRUC LASRDIE1 * *UP LASER DIE * *A8=OBJECT *A13=PROCESS LASRUDIE: MOVI SPLSHUP,A9 JRUC LASRDIE1 * *DOWN LASER DIE * *A8=OBJECT *A13=PROCESS LASRDDIE: MOVE *A8(OYPOS),A0,W ;SET Y COORD TO END MOVE *A8(OSIZEY),A1,W ADD A1,A0 MOVI 1,A1 ;SET LENGTH TO 1 MOVE A1,*A8(OSIZEY),W MOVE A0,*A8(OYPOS),W MOVI SPLSHDWN,A9 JRUC LASRDIE1 * *TEST IF ANY PART OF OBJECT OFF SCREEN *A2=TOP LEFT Y:X *A3=BOT RT Y:X *A8=OBJECT *RETURNS EQ IF ON SCREEN *A0=LEFT=1,RIGHT=2,UP=3,DOWN=4 OFSCRTST MMTM SP,A1,A2,A3,A4 MOVE *A8(OYPOS),A0,W MOVE *A8(OXPOS),A1,W SLL 16,A0 MOVX A1,A0 ;GET TOP LEFT OF OBJECT MOVE @WORLDTL,A1,L SUBXY A1,A0 ;SUBTRACT OUT WORLD BASE MOVE *A8(OSIZE),A1,L ADDXY A0,A1 ;GET LOWER RT OF OBJECT CLR A4 CMPXY A2,A0 JRYLE SCRTFU ;ABOVE... JRXLE SCRTFL ;TO THE LEFT.. CMPXY A3,A1 ;IS IT LOWER THAN LOWER RT? JRXGE SCRTFR ;TO THE RIGHT JRYLT OFSCRTX ;NOT LOWER SCRTFD INC A4 SCRTFU INC A4 SCRTFR INC A4 SCRTFL INC A4 OFSCRTX MOVE A4,A0 MMFM SP,A1,A2,A3,A4 RETS * *GET A RANDOM PLAYER 1 OR 2 *RETURNS A0 WITH RANDOM PLAYER INDEX GETPLYR CALLA RANDOM JRN GETPLYR2 MOVE @PLYROBJS,A0,L JRNE GETPLYRX MOVE @PLYROBJS+32,A0,L GETPLYRX RETS GETPLYR2 MOVE @PLYROBJS+32,A0,L JRNE GETPLYRX MOVE @PLYROBJS,A0,L RETS ; ;FRANIM LISTS FOR ORB ROTATES ; ROTUP: ;ORB ROTATE VERTICAL FROM SIDE TO SIDE ORIENTATION .LONG ORB2 .WORD 5 .LONG ORB3 .WORD 5 .LONG ORB4 .WORD 5 .LONG 0 ROTSD: ;ORB ROTATE TO SIDE FROM TOP ORIENTATION .LONG ORB3 .WORD 5 .LONG ORB2 .WORD 5 .LONG ORB1 .WORD 5 .LONG 0 *LASER SPLASH ON RIGHT SPLSHRT: .LONG OSPLSHV1 .WORD FLIPBITS|3,M_FLIPH .LONG OSPLSHV2 .WORD 3 .LONG OSPLSHV3 .WORD 3 .LONG OSPLSHV4 .WORD 3 .LONG OSPLSHV2 .WORD 3 .LONG OSPLSHV1 .WORD 3 .LONG 0 *LASER SPLASH ON LEFT SPLSHLFT: .LONG OSPLSHV1 .WORD 3 .LONG OSPLSHV2 .WORD 3 .LONG OSPLSHV3 .WORD 3 .LONG OSPLSHV4 .WORD 3 .LONG OSPLSHV2 .WORD 3 .LONG OSPLSHV1 .WORD 3 .LONG 0 *LASER SPLASH UP SPLSHUP: .LONG OSPLSH1H .WORD 3 .LONG OSPLSH2H .WORD 3 .LONG OSPLSH3H .WORD 3 .LONG OSPLSH4H .WORD 3 .LONG OSPLSH2H .WORD 3 .LONG OSPLSH1H .WORD 3 .LONG 0 *LASER SPLASH DOWN SPLSHDWN: .LONG OSPLSH1H .WORD FLIPBITS|3,M_FLIPV .LONG OSPLSH2H .WORD 3 .LONG OSPLSH3H .WORD 3 .LONG OSPLSH4H .WORD 3 .LONG OSPLSH2H .WORD 3 .LONG OSPLSH1H .WORD 3 .LONG 0 *SPIN AROUND THE ORB SPNORB: .LONG ORB1 .WORD FLIPBITS|2,0 .LONG ORB2 .WORD 2 .LONG ORB3 .WORD 2 .LONG ORB4 .WORD 2 .LONG ORB3 .WORD FLIPBITS|2,M_FLIPH .LONG ORB2 .WORD 2 .LONG 0 BOOM4: .LONG EXPb1 .WORD 3 .LONG EXPb2 .WORD 3 .LONG EXPb3 .WORD 4 .LONG EXPb4 .WORD 4 .LONG EXPb5 .WORD 4 .LONG EXPb4 .WORD 4 .LONG EXPb3 .WORD 5 .LONG EXPb2 .WORD 5 .LONG EXPb1 .WORD 5 .LONG 0 .END