.FILE 'WLMAN.ASM' .TITLE 'ROBO-RAMA GAME PROGRAM' .WIDTH 132 .OPTION B,D,L,T .MNOLIST ; ; INITIATED: JAN 6, 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" ; ;SOUNDS .REF EXP3HI ; ;SYMBOLS EXTERNALLY DEFINED ; .REF GET_STANDT2,WAY .REF FRANIM,GAMSTATE,EHALT,BOOM2,GETFPAL,GET_WVADDR,BEGINOBJ2 .REF WAVEYX,PCNT,RANGRAND,PLYROBJS,HALT .REF XYSKOBJ,GETHDR,CVRT,ABALL,RANDPER,DOBLO,P1DATA,P2DATA .REF TSO_EXP2,FLASHME,GETUGH ; ;SYMBOLS DEFINED IN THIS FILE ; .DEF KILL_WLMN,ONSCRN_WLMN,RECOIL,DIOFF ; ;UNINITIALIZED RAM DEFINITIONS ; ; ;EQUATES/STRUCURES FOR THIS FILE TO FOLLOW ; HITWLM .EQU 35 ;61 ; ;WLMAN DATA STRUCTURE ; SPDLY .EQU PDATA ;UHB WAY01 .EQU PDATA+8 ;UHB TDIR .EQU PDATA+16 ;UHW TSK_DIR .EQU PDATA+32 ;UHW MODE .EQU PDATA+48 ;UHB FIRED .EQU PDATA+56 ;UHB SLOW .EQU PDATA+64 ;UHB ABSRB .EQU PDATA+72 ;UHB LEVEL .EQU PDATA+80 ;DIFFICULTY LEVEL FOR SPEEDS ETC. ; ; .TEXT ; WX .LONG [117,0],[285,0] WY .LONG [-25,0],[-25,0] ; ONSCRN_WLMN: ;A2=# OF ORBS TO CREATE ON SCREEN AT START OF WAVE MOVE A2,A10 OH1 PUSH A10 ;CREATE A BUNCH OF THEM CREATE WLMNPID,OWLMN PULL A10 DSJNE A10,OH1 RETS ; OWLMN: ;A10=1 OR 2 ;A0 & A1 ARE SET UP ;ADD IN OFFSETS FOR THIS PARTICULAR ARENA DEC A10 SLL 5,A10 MOVI WX,A0 ADD A10,A0 MOVE *A0,A0,L MOVI WY,A1 ADD A10,A1 MOVE *A1,A1,L ; 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 WLMN (BEGINOBJ) CALLA BEGINOBJ2 ;STUFF OBJ ;CHANGE TO PURPLE PALETTE MOVI PURPTK,A0 CALLA GETFPAL ;GET A COLOR MAP ASSIGNMENT ANDI 0FFFFH,A0 MOVE A0,*A8(OPAL),L ;STORE THE NEW PALETTE CALLR SETUP_WLMN ;INC WLMN_CNT CLR A0 MOVB A0,*A13(MODE) MOVB A0,*A13(SPDLY) MOVB A0,*A13(FIRED) MOVB A0,*A13(ABSRB) MOVK 9,A0 MOVE A0,*A13(TDIR) ; ; LOOP TOP FOR WLMNS ; LUP_TOP: ;TOP OF WLMN LOGIC MOVE @HALT,A0 JRNZ WZ MOVE @EHALT,A0 JRZ MV ;BR=HALT ALL WLMNS!! ;PLAYER IS WALKING INTO ARENA SO DO NOT ALLOW MOVEMENT! WZ SLEEP 2 JRUC LUP_TOP MV: ;SEE IF ANY PLAYER IS WITHIN X DISTANCE. ;IF SO, SEEK TO MOST APPROPRIATE ANGLE AND X% OF TIME FIRE FLAMES AT PLAYER. ;STOP/SLEEP TLP_TOP: MOVB *A13(MODE),A1 JREQ SIT CMPI 1,A1 JREQ SPN CMPI 2,A1 JREQ SHT ; JRUC $ SIT MOVI 120,B0 MOVI 250,B1 CALLA RANGRAND CMPI 150,A0 JRNC SPP ;NO SITTING MOVI 2,A0 SPP CALLA PRCSLP MOVK 1,B0 MOVK 3,B1 CALLA RANGRAND DEC A0 MOVB A0,*A13(MODE) CMPI 1,A0 JREQ R1 CMPI 2,A0 JRNE TAG ;SHOOT MOVK 2,A0 MOVB A0,*A13(FIRED) JRUC TAG R1 ;WILL SPIN TO PLAYER MOVB @PCNT,A3 INC A3 MOVB A3,@PCNT ANDI 01,A3 SLL 5,A3 MOVI PLYROBJS,A2 ADD A3,A2 MOVE *A2,A0,L ;GET FIRST ENTRY JRNZ PX XORI 32,A3 ADDI PLYROBJS,A3 MOVE *A3,A0,L PX CALLA XYSKOBJ MOVE A5,A1 MOVE A6,A2 CALLA GETHDR SLL 3,A0 ADDI CVRT,A0 MOVB *A0,A0 ;DIR TO FACE IN A0 ;A0=DIR TO SEEK TO FACE PLAYER MOVE *A13(TDIR),A1 CMP A0,A1 JREQ AIM2 ;NOT = ; CMPI 5,A0 ; JRLT $ ; CMPI 14,A0 ; JRLT TYU ; MOVK 13,A0 ;TYU MOVE A0,*A13(TSK_DIR),W MOVE A0,A1 MOVE *A13(TDIR),A0,W CALLA WAY JRC DIT ;INC ;DEC=CLRC CLR A1 MOVB A1,*A13(WAY01) JRUC DIT0 DIT MOVK 1,A1 MOVB A1,*A13(WAY01) DIT0 JRUC TAG ;DIE OFF DIOFF: ;CALLED FROM ENDWAVE CREATE 0,TSO_EXP2 SLEEP 2 MOVE A8,A0 CALLA DELOBJ DIE AIM2 ;ALREADY HERE! MOVK 2,A0 MOVB A0,*A13(MODE) MOVK 4,B0 MOVK 10,B1 CALLA RANGRAND MOVB A0,*A13(FIRED) JRUC TAG SPN MOVB *A13(SPDLY),A1 CMPI 7,A1 JRLT AF MOVI 2,A1 AF DEC A1 MOVB A1,*A13(SPDLY) JRNN TAG MOVK 2,A0 MOVB A0,*A13(SPDLY) MOVB *A13(WAY01),A1 JRNZ INCIT ;TANK IS DEC TO LEFT! DECIT MOVE *A13(TDIR),A0,W DEC A0 ; CMPI 4,A0 ; JREQ OUT2 ; CALLA INHERE MOVE A0,*A13(TDIR),W JRUC OUT INCIT ;TANK IS ROTATING TO RIGHT MOVE *A13(TDIR),A0,W INC A0 ; CMPI 14,A0 ; JREQ OUT2 ; CALLA IC MOVE A0,*A13(TDIR),W OUT MOVE *A13(TDIR),A0 PUSH A0 CALLA GET_STANDT2 ;DOES ANI OF CORRECT VIEW PULL A0 MOVE *A13(TSK_DIR),A1 CMP A0,A1 JRNE TAG ;REACHED CORRECT SEEK ANGLE. ;SHOOT AT PLAYER NOW MOVI 300,A0 CALLA RANDPER JRC OUT3 ;DON'T FIRE OUT2 MOVK 2,A0 MOVB A0,*A13(MODE) MOVK 1,B0 MOVK 3,B1 CALLA RANGRAND MOVB A0,*A13(FIRED) JRUC TAG SHT ; MOVB *A13(SLOW),A0 ; CALLA PRCSLP SLEEP 6 MOVE *A13(TDIR),A9 CREATE 0,ABALL CREATE 0,RECOIL MOVB *A13(FIRED),A0 ANDI 0FH,A0 DEC A0 MOVB A0,*A13(FIRED) JRNZ TAG OUT3 CLR A0 MOVB A0,*A13(MODE) ; MOVB @PCNT,A0 ; ANDI 01,A0 ; SLL 4,A0 ; ADDI SLOCNT,A0 ; MOVE *A0,A0 ; MOVE A0,*A13(SLOW) ; JRUC TAG TAG SLEEP 1 JRUC LUP_TOP ;SLOCNT .WORD 03,0AH RECOIL MOVE A9,A0 SLL 4,A0 MOVI XCHG,A1 ADD A0,A1 MOVE *A1,A10,W ;X MOD MOVI YCHG,A2 ADD A0,A2 MOVE *A2,A9,W MOVE *A8(OYPOS),A0 ADD A9,A0 MOVE A0,*A8(OYPOS) MOVE *A8(OXPOS),A0 ADD A10,A0 MOVE A0,*A8(OXPOS) SLEEP 2 MOVE *A8(OYPOS),A0 SUB A9,A0 MOVE A0,*A8(OYPOS) MOVE *A8(OXPOS),A0 SUB A10,A0 MOVE A0,*A8(OXPOS) DIE XCHG: .WORD 0,0,-1,-2,-2,-2,-2,-2,-1,0,1,2,2,2,2,2,1 YCHG: .WORD 0,2,2,2,1,0,-1,-2,-2,-2,-2,-2,-1,0,1,2,2 ;WAY: ;SPIN LEFT OR RIGHT ;A1=SEEK DIR ;A0=DIR IMAGE IS FACING NOW ;812 ;7 3 ;654 ; 01 ; 16 02 ; 15 03 ; 14 04 ; 13 05 ; 12 06 ; 11 07 ; 10 08 ; 09 ; SUB A0,A1 ; MOVE A1,A2 ; ABS A1 ; CMPI 9,A1 ;5 ; JRLT N0 ; NEG A2 ;N0: BTST 31,A2 ; JRZ IC ;INHERE: DEC A0 ; JRP TDEC ; MOVK 16,A0 ;8 ;TDEC CLRC ;MEANS DEC ; RETS ;IC: INC A0 ;ROTATE TOWARD PLAYER ; CMPI 17,A0 ;9 ; JRNE T1 ; MOVK 1,A0 ;T1: SETC ;MEANS INC ; RETS ; IH1: ;ENTER HERE IF ON SCRN TANK ;STUFF NEEDED SHIT ;A0=OXVAL ;A1=OYVAL MOVI MTK6,A2 ;(OIMG) DOES NOT MATTER MOVI 230,A3 ;(OZPOS) MOVI DMAWNZ,A4 ;(OFLAGS) NON-ZERO VALUE MOVI CLSNEUT|TYPWLMN,A5 ;(OID) CLR A6 ;(OXVEL) CLR A7 ;(OYVEL) RETS ; SETUP_WLMN: MOVI WLMN,A2 CALLA GET_WVADDR ; MOVE *A0(32),A1,W ;GET DIFFICULTY LEVEL FOR THIS WLMN ; MOVE A1,*A13(LEVEL),W MOVE *A0(16),A1,W ;DEC WAVE RAM CNT FOR THIS WLMN DEC A1 MOVE A1,*A0(16),W RETS KILL_WLMN: ;CALLED FROM COLL2.ASM WHEN A WLMN COLLIDES WITH SOMETHING. ;VICTIM PNTR IN A8 ;A8=WLMN IMAGE PTR MMTM SP,A1,A7,A10 MOVE *A8(OPLINK),A10,L MOVE *A0(OID),A7,W ;KILLERS OID ;WILL BE BOGUS IF SOMETHING OTHER THAN A BULLET STRUCK TANK! ANDI F_SUBT,A7 DEC A7 SLL 3,A7 ADDI PUNISHT,A7 MOVB *A7,A7 MOVB *A10(ABSRB),A1 ANDI 0FFH,A1 ADD A7,A1 MOVB A1,*A10(ABSRB) CMPI HITWLM,A1 ;IF LESS THAN, START COLOR CYCLE PROCESS HERE JRLT KPY ;ABSORBED ENOUGH HITS TO DESTROY IT MOVE *A0(OPLINK),A10,L CREATE 0,WLMN_EXP ;BULLETS DIR WILL BE IN A10 MOVE *A8(OPLINK),A0,L CALLA KILL ;KILLS PROCESS IN A0 MOVE A8,A0 CALLA DELOBJ MMFM SP,A1,A7,A10 RETS KPY PUSH A9 CALLA GETUGH MOVI 018180000H,A9 CREATE 0,FLASHME PULL A9 MMFM SP,A1,A7,A10 RETS PUNISHT: .BYTE 3,3,5,20,20 .EVEN WLMN_EXP: ;WLMN MUST KNOW WHO SHOT IT! MOVI EXP3HI,A0 CALLA ONESND MOVB *A10(MYPLYR),A0 ; JAUC TSO_EXP ;A0=1 OR 2 MOVI WALPT,A1 ;AMOUNT OF SCORE JAUC DOBLO .END