.FILE 'POW2.ASM (ORBITING LASER)' .TITLE 'ROBO-RAMA GAME PROGRAM' .WIDTH 132 .OPTION B,D,L,T .MNOLIST ; ; INITIATED: APRIL 26,1989 ; MODIFIED: ! ; SOFTWARE: MARK TURMELL & ROBERT ASHWORTH ; ; 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" ; ;SOUND HEADERS USED ; .REF WOO2 ; ;SYMBOLS EXTERNALLY DEFINED ; .REF PUTA7,FLASHME .REF GETANIXY,AFONT0 .REF GPALOBJ,STFOBJ,INSOBJ,ADJSTWTL .REF FRANIM,KILOBJ,KILALL .REF SCRTST .REF DELOBJ .REF GETCOS .REF GETSIN .REF DO_BND .REF EXISTP .REF KILL .REF ICNFLG ; ;SYMBOLS DEFINED IN THIS FILE ; .DEF POW2ON,LSHIT .DEF LASRX,LASRY,ALIGNXY ; ;UNINITIALIZED RAM DEFINITIONS ; .BSS LASRX,32 .BSS LASRY,32 ; ;EQUATES ; ADLTA .EQU (411775/(160/2)) ; LASER/BLADES DATA STRUCTURE ; PTRX .EQU PDATA ;UHW ;LAST X PTRY .EQU PDATA+16 ;UHW ;LAST Y ANIMTIK .EQU PDATA+32 ;UHL ;FRAME SLEEP TIME THETA .EQU PDATA+64 ;SHL ;CURRENT PROGRESSION DELTA .EQU PDATA+96 ;SHL ;DELTA ANGLE LEG .EQU PDATA+128 ;UHL LEG OF PLAYER WHO COLLECTED ME ; ; ;EQUATES FOR THIS FILE ; ; .TEXT ; POW2ON: ;FROM COLLISION ROUTINE! MOVE A0,A9 ;LEG PTR OF WHO GOT ME ; MOVE *A0(OPLINK),A0,L ; MOVK 1,A1 ; MOVB A1,*A0(LSRFLG) ;HELPER ON FLAG FOR THIS PLAYER; MOVE A8,A0 CALLA DELOBJ MOVI WOO2,A0 CALLA ONESND MOVK 1,A11 ;1 ORBITING OBJECT ALL1: CREATE LSRPID,LASER DSJS A11,ALL1 RETS ; DO LASER MOVEMENT LOGIC ;A11 = OFFSET FOR VECTOR POINT FOR STARTING POSITION OF LASER LASER: ;A9=LEG IMG PNTR OF PLAYER WHO TOUCHED ME MOVE *A9(OPLINK),A7,L MOVK 1,A0 MOVB A0,*A7(BNDTYP) MOVB A0,@ICNFLG CALLA DO_BND CLR A0 MOVB A0,*A13(ANIMTIK) MOVI ADLTA,A0 MOVE A0,*A13(DELTA),L CALLA SETPOINT ; ENCIRCLE: ; MAKE LASER MOVE IN A CIRCLE AROUND PLAYER CALLA ANILASER ;ANIMATE LASER CALLR ALIGNXY ;KEEP OBJECT ALIGNED WITH PLAYER MOVE *A13(THETA),A2,L ;PROGRESSIVE THETA MOVE *A13(DELTA),A0,L ;NEXT DELTA ANGLE ADD A2,A0 CALLA GETCOS MOVE A0,A11 MOVK 2,A0 MPYS A0,A11 MOVE A14,*A13(THETA),L MOVE A14,A0 CALLA GETSIN MOVE A0,A3 MOVK 2,A0 MPYS A0,A3 MOVE A3,A10 MOVE *A8(OXVAL),A3,L MOVE *A8(OYVAL),A4,L ADD A11,A3 ADD A10,A4 MOVE A3,*A8(OXVAL),L MOVE A4,*A8(OYVAL),L SLOOP 1,ENCIRCLE ANILASER: ;ANIMATE LASER MOVB *A13(ANIMTIK),A0 DEC A0 MOVB A0,*A13(ANIMTIK) JRNN NOTNEXT ;FALLS HERE IF NEGATIVE MOVK 4,A1 JSRP FRANIM ;1 FRAME STEP MOVB A0,*A13(ANIMTIK) ;SAVE SLEEP TIME BETWEEN FRAMES JRNC NOTNEXT MOVI FLASER,A9 NOTNEXT: CALLA GETANIXY MOVE A2,@LASRY,L MOVE A3,@LASRX,L RETS ; LASERDIE: MOVE A11,*A8(OXVEL),L MOVE A10,*A8(OYVEL),L ;TURN HELPER WHITE, FLOAT AWAY ; CLR A0 ; MOVE A0,*A8(OID) FLYER: ; CALLR ANILASER ;DO ANIMATION MOVI [>23,>21],A2 MOVI [>FC,>171],A3 CALLA SCRTSTG JRNZ LSER MOVI 006060000H,A9 CREATE 0,FLASHME SLOOP 10,FLYER LSER: CLR A0 MOVE A0,@LASRX,L MOVE A0,@LASRY,L MOVE A8,A0 CALLA DELOBJ ;KILL IMAGE CLR A1 NOT A1 ;MASK FOR PROCESS EXIST ROUTINE MOVK 2,A3 ;ASSUME CHAINSAW'S BOUNDARY ;MAKE THIS SMARTER! MOVE *A13(PROCID),A2,W ;SAVE CURRENT PROCESS ID MOVI DUM_ID,A0 MOVE A0,*A13(PROCID),W ;REPLACE ID FOR THIS PROCESS MOVI CHNSWPID,A0 ;CHAINSAW PROCESS CALLA EXISTP JRNZ SETAREA ;BR = DOES EXIST MOVK 1,A3 ;ASSUME CHNSW'S BOUNDARY ;WHAT? MOVI LSRPID,A0 ;LASER PROCESS ID CALLA EXISTP JRNZ SETAREA ;BR = DOES EXIST CLR A3 ;ASSUME NORMAL BOUNDARY SETAREA: MOVE *A13(LEG),A0,L MOVE *A0(OPLINK),A7,L MOVB A3,*A7(BNDTYP) CLR A2 MOVB A2,*A7(PRVBND) CALLA DO_BND DIE ALIGNXY: ; KEEP LASER WITHIN X CENTERPOINT OF PLAYER ; PARMS: ; ; A8 = PTR TO PLINDX ; MOVE *A13(PTRX),A4,W ;OLD X,Y VALUES MOVE *A13(PTRY),A5,W MOVE A8,A10 MOVE *A13(LEG),A8,L CALLA GETANIXY ;Y/X POSITION RETURNED IN A2,A3 MOVE A10,A8 SWAP A2,A3 SRL 16,A2 SRL 16,A3 MOVE A4,A4 JRZ PK DIFF: CMP A4,A2 JREQ DOY JRGT ADDX ;NEW X POS > OLD X POS SUBX: SUB A2,A4 MOVE *A8(OXPOS),A6 SUB A4,A6 MOVE A6,*A8(OXPOS) JRUC DOY ADDX: SUB A2,A4 NEG A4 MOVE *A8(OXPOS),A6 ADD A4,A6 MOVE A6,*A8(OXPOS) DOY: CMP A5,A3 JREQ PK ;NO DIFFERENCES IN X,Y BYE! JRGT ADDY ;NEW Y POS > OLD Y POS SUBY: SUB A3,A5 MOVE *A8(OYPOS),A6 SUB A5,A6 MOVE A6,*A8(OYPOS) JRUC PK ADDY: SUB A3,A5 NEG A5 MOVE *A8(OYPOS),A6 ADD A5,A6 MOVE A6,*A8(OYPOS) PK: MOVE A2,*A13(PTRX),W MOVE A3,*A13(PTRY),W RETS SETPOINT: MOVI INITAB,A14 CALLA GPALOBJ ;ALLOCATE A COLOR PALETTE CALLA STFOBJ ;STUFF OBJECT DATA MOVE A13,*A0(OPLINK),L CALLA ADJSTWTL ;PUT US IN THE WORLD CALLA INSOBJ ;INSERT OBJECT INTO LIST MOVE A0,A10 ;A9=CORRECT LEG PTR MOVE A9,*A13(LEG),L ;A7=A7 ALREADY? MOVE *A9(OPLINK),A7,L ;LEGS HAVE SAME OPLINK AS TORSO! ;A7 NOW EQUALS TORSO PROC OF PLAYER WHO PICKED UP HELPER ICON MOVE A0,*A7(LSRPTR),L ;THIS OKAY? MOVE A9,A8 CALLA GETANIXY ;Y/X POSITION RETURNED IN A2,A3 MOVE A10,A8 ADDI [5,0],A2 MOVE A2,*A8(OYVAL),L SUBI [7,0],A3 MOVE A3,*A8(OXVAL),L CLR A0 MOVE A0,*A13(PTRX),W ;OLD X,Y VALUES MOVE A0,*A13(PTRY),W MOVE A0,*A13(THETA),L MOVI FLASER,A9 RETS LSHIT: ;CALLED FROM COLLISION ROUTINE ;ALSO CALLED FROM ROBO WHEN PLAYER DIES ;A8=HELPER IMG PNTR MMTM SP,A0,A7,A13 ;PUSHING ENOUGH STUFF HERE? CLR A0 MOVE A0,*A8(OID) MOVE *A8(OPLINK),A13,L ;GET PROCESS ID BACK ;HELPER TO FLY OFF ;RESET HERE MOVE *A13(LEG),A0,L ;GET LEG I SURROUND MOVE *A0(OPLINK),A0,L ;GET PLAYER PROC CLR A7 MOVE A7,*A0(LSRPTR),L ;ZERO PLAYER PROC LASER PNTR MOVE A13,A0 MOVI LASERDIE,A7 CALLA PUTA7 ;THIS HLPR WILL NOW WAKE UP AT A7 ADDR MMFM SP,A0,A7,A13 RETS INITAB: .LONG 0,0,HLPR1 .WORD 171,DMAWNZ,CLSPLYR|TYPLSR ;171 .LONG 0,0 ; ;ANIMATION TABLE FOR LASER ; FLASER: .LONG HLPR1 .WORD 3 .LONG HLPR2 .WORD 3 .LONG HLPR3 .WORD 3 .LONG HLPR4 .WORD 3 .LONG HLPR5 .WORD 3 .LONG HLPR6 .WORD 3 .LONG 0 .END