.FILE 'POW1.ASM (BLADE ATTACK)' .TITLE 'ROBO-RAMA GAME PROGRAM' .WIDTH 132 .OPTION B,D,L,T .MNOLIST ; ; INITIATED: APRIL 26,1989 ; MODIFIED: ! ; SOFTWARE: MARK TURMELL ; ; 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 ICON,BLDS,YAMOFF,TING ; ;SYMBOLS EXTERNALLY DEFINED ; .REF ALIGNXY .REF GETANIXY,AFONT0 .REF GPALOBJ,STFOBJ,INSOBJ,ADJSTWTL .REF FRANIM,KILOBJ .REF SCRTSTG,PUTA7 .REF DELOBJ .REF GETCOS .REF GETSIN .REF DO_BND .REF EXISTP .REF KILALL .REF KILL,ICNFLG ; ;SYMBOLS DEFINED IN THIS FILE ; .DEF POW1ON,CHAINHIT,FLYSLUP,CHAINHIT2,PCNT ; ;UNINITIALIZED RAM DEFINITIONS ; .BSS PCNT,8 ; ;EQUATES ; MAXHITS .EQU 5 ;MAXIMUM HITS PER CHNSW CAN TAKE ADLTA .EQU (411775/(160/3)) ;RADIUS OF CIRCLE ; ;EQUATES FOR THIS FILE ; ; .TEXT ; POW1ON: ;CHECK HERE FOR COLL2 USAGE OF THESE REGISTERS! DO_BND?!?! MMTM SP,A1,A7 MOVE A0,A9 MOVE *A0(OPLINK),A0,L MOVB *A0(PNUM),A10 ;A10=1 OR 2 MOVK 1,A1 MOVB A1,*A0(BLDFLG) ;BLADES ON FLAG FOR THIS PLAYER MOVB A1,@ICNFLG ;ICON GOT FLAG CREATE 0,DOSAWS ;PASS PLAYER PNTR WHO TOUCHED ME MOVE A8,A0 CALLA DELOBJ MOVI BLDS,A0 CALLA ONESND MMFM SP,A1,A7 RETS ; DOSAWS: ;A9=PLAYER PNTR WHO TOUCHED ME MOVE A10,A8 MOVE *A9(OPLINK),A10,L MOVK 2,A1 ;BLADES INTO BNDTYP MOVB A1,*A10(BNDTYP) MOVE A10,A7 ;DO BND NEEDS PLYR PRC IN A7 CALLA DO_BND MOVK 5,A11 ;5 ORBITING OBJECTS SAWLUP: SLEEP >B CREATE CHNSWPID,CHAINSAW DSJS A11,SAWLUP ; MOVI BLDS,A0 ; CALLA ONESND DIE ; ; DO CHNSW MOVEMENT LOGIC ;A11 = OFFSET FOR STARTING POSITION OF CHNSW ;A10=THIS PLAYER PROCESS PTR ;A8=PNUM 1 OR 2 CHAINSAW: CLR A0 MOVB A8,*A13(MYPLYR) ;PLAYER # I SURROUND MOVE A10,*A13(PLYRPC),L ;KEEP PLAYER PROCESS PTR MOVB A0,*A13(HITS) MOVB A0,*A13(ANIMTIK) MOVI ADLTA,A0 MOVE A0,*A13(DELTA),L CALLA SETPOINT ; ENCIRCLE: ; MAKE CHNSW MOVE IN A CIRCLE AROUND PLAYER CALLR ANICHNSW ;ANIMATE CHNSW ; MOVB @PCNT,A0 ; ANDI 1,A0 ; JRZ IP CALLA ALIGNXY ;KEEP OBJECT ALIGNED WITH PLAYER ;IP MOVE *A13(THETA),A2,L ;PROGRESSIVE THETA MOVE *A13(DELTA),A0,L ;NEXT DELTA ANGLE ADD A2,A0 CALLA GETCOS MOVE A0,A11 MOVK 5,A0 MPYS A0,A11 MOVE A14,*A13(THETA),L MOVE A14,A0 CALLA GETSIN MOVE A0,A3 MOVK 5,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 FLYSLUP2: ;COLLISION ROUTINE SENDS BLADE HERE NEG A11 NEG A10 MOVE A11,*A8(OXVEL),L MOVE A10,*A8(OYVEL),L MOVI TING,A0 CALLA ONESND JRUC FLY1 FLYSLUP: ;COLLISION ROUTINE SENDS BLADE HERE MOVE A11,*A8(OXVEL),L MOVE A10,*A8(OYVEL),L FLY1: CALLR ANICHNSW ;ANIMATE FAST SAW MOVI [>23,>21],A2 MOVI [>FC,>171],A3 CALLA SCRTSTG JRNZ CHNSWDIE SLOOP 1,FLY1 CHNSWDIE: MOVE A8,A0 CALLA DELOBJ ;KILL CHAINSAW IMAGE CLR A1 NOT A1 ;MASK FOR PROCESS EXIST ROUTINE MOVK 2,A3 ;ASSUME CHAINSAW'S BOUNDARY ; ;MAKE THIS JUST A CHECK OF A FLAG FOR EFFICIENCY! ; 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 DNBL ;BR = STILL A BLADE AROUND ;TURN OFF BLADE SOUND MOVI YAMOFF,A0 CALLA ONESND ;RESET BLADE FLAG FOR THIS PLAYER MOVE *A13(PLYRPC),A7,L ;GET PLAYER PRC THESE BLADES SURROUND CLR A0 MOVB A0,*A7(BLDFLG) MOVK 1,A3 ;ASSUME HELPER BOUNDARY MOVE *A13(PLYRPC),A7,L ;GET PLAYER PRC THESE BLADES SURROUND MOVI LSRPID,A0 ;CHNSW PROCESS ID CLR A1 NOT A1 CALLA EXISTP JRNZ SETBND ;BR = DOES EXIST CLR A3 ;ASSUME NORMAL BOUNDARY JRUC SET2 SETBND: ;SOMEONE HAS A HELPER, IS IT ME? MOVE *A0(TORSO),A1,L ;PLAYER THIS HELPER SURROUNDS MOVE *A1(OPLINK),A1,L CMP A1,A7 JREQ SET2 ;BR=YES! I HAVE HELPER ALSO! CLR A3 SET2 MOVB A3,*A7(BNDTYP) CLR A2 MOVB A2,*A7(PRVBND) CALLA DO_BND DNBL DIE ; ;ANIMATE CHNSW ROUTINE ; ANICHNSW: 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 BLADES,A9 NOTNEXT: 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,A8 MOVE A8,A10 ;A9=PLAYER WHO TURNED ME ON MOVE *A9(OPLINK),A0,L MOVE *A0(TSO_PTR),A8,L MOVE A8,*A13(TORSO),L ;PLACE TORSO PTR INTO BLADE PDATA CALLA GETANIXY ;Y/X POSITION RETURNED IN A2,A3 MOVE A10,A8 SUBI [13,0],A2 SUBI [4,0],A3 MOVE A2,*A8(OYVAL),L ;INITIAL POSITION OFFSET OF OBJECT 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 BLADES,A9 RETS CHAINHIT2: ;CALLED FROM COLLISION ROUTINE MOVE *A8(OPLINK),A0,L ;GET PROCESS ID BACK ;BLADE TO FLY OFF ;RESET HERE MOVI FLYSLUP2,A7 CALLA PUTA7 ;THIS BLADE WILL NOW WAKE UP AT A7 ADDR RETS ; CHAINHIT: ;CALLED FROM COLLISION ROUTINE MMTM SP,A1,A13 MOVE *A8(OPLINK),A13,L ;GET PROCESS ID BACK MOVB *A13(HITS),A1 INC A1 MOVB A1,*A13(HITS) CMPI MAXHITS,A1 JRLT HO ;BLADE TO FLY OFF ;RESET HERE MOVE A13,A0 MOVI FLYSLUP,A7 CALLA PUTA7 ;THIS BLADE WILL NOW WAKE UP AT A7 ADDR HO MMFM SP,A1,A13 RETS INITAB: .LONG 0,0,BLD1 .WORD 170,DMAWNZ,CLSPLYR|TYPPRSM .LONG 0,0 ; ;ANIMATION TABLE FOR CHAINSAW ; BLADES .LONG BLD4 .WORD 1 .LONG BLD3 .WORD 1 .LONG BLD2 .WORD 1 .LONG BLD1 .WORD 1 .LONG 0 .END