.FILE 'CHASER.ASM' .TITLE 'ROBO-RAMA GAME PROGRAM CHASER' .WIDTH 132 .OPTION B,D,L,T .MNOLIST ; ; INITIATED: APRIL 13,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 TING,EXP1,LEGOSND ; ;SYMBOLS EXTERNALLY DEFINED ; .REF GETADIR,CIRCUIT,PLYROBJS,DOCHS,BLOW .REF BEGINOBJ,SET_GATE_2 .REF RANGRAND,RANDPER,EHALT,WAVE ; ;SYMBOLS DEFINED IN THIS FILE ; .DEF STRT_CHSR,HIT_CHSR,SCRL,KILL_CHSR,KC2 ; ;EQUATES FIRST ORIGINATED IN THIS FILE ; MAXPCS .EQU 1 LSTPC .EQU MAXPCS-1 ; ;DATA STRUCTURE OF MASTER PIECE POINTER ; BLDVW .EQU PDATA ;UHB BLADE VIEW 0-3 CDELAY .EQU PDATA+8 ;UHB DELAY BEFORE UPDATING DLY .EQU PDATA+16 ;UHL DLY VEL UPDATE FOR THIS CNT GDIE .EQU PDATA+48 ;UHB GONNA DIE FLAG NONO .EQU PDATA+56 ;UHB 1=COMING OUT,0=DO NOT ENTER SAFE AREA ; ; ;UNINITIALIZED RAM DEFINITIONS ; .BSS TRAM1,32*MAXPCS+32 .BSS SCRL,8 .BSS TRAM2,32*MAXPCS SX: .LONG -080000H,01980000H,0C20000H,0C20000H SY: .LONG 0700000H,0700000H,-20000H,0F00000H CIDS: .LONG CID1,CID2,CID3 ;CIRCUIT INFO FOR CHASER DOOR CID1: .WORD 3,2,1,3,2,1,2,1,1,1 ;WAVE 1-10 (DOOR CHASER COMES FROM) CID2: .WORD 1,1,2,1,2,1,1,1,1,1,1,3,1,1,1,2,1,2 CID3: .WORD 1,1,2,1,2,1,1,1,1,1,1,3,1,1,1,2,1,2,1,1,1,1 HIT_CHSR MMTM SP,A1 MOVE *A0(OPLINK),A10,L ;WILL BE BOGUS IF SOMETHING OTHER THAN A BULLET STRUCK HULK! MOVE *A8(OPLINK),A0,L MOVE A10,*A0(DLY),L MOVI TING,A0 CALLA ONESND MMFM SP,A1 RETS KILL_CHSR MMTM SP,A1 MOVE *A8(OPLINK),A0,L MOVB *A0(GDIE),A1 JRNE NX ; MOVK 1,A1 MOVB A1,*A0(GDIE) CREATE KCHAS,KCHS NX MMFM SP,A1 RETS KC2 ;COMES HERE IF RING HIT CHASER MMTM SP,A1 MOVE *A8(OPLINK),A0,L MOVB *A0(GDIE),A1 JRNE NX2 ; MOVK 1,A1 MOVB A1,*A0(GDIE) CREATE 0,KCHS1 NX2 MMFM SP,A1 RETS KCHS SLEEP 30 KCHS1 MOVE *A8(OPLINK),A0,L CALLA KILL MOVI EXP1,A0 CALLA ONESND CLR A1 NOT A1 MOVI CHSR2PID,A0 CALLA EXISTP JRNZ NXO ;DID NOT FIND AGAIN PROC CREATE CHSR2PID,AGAIN NXO CLR A0 MOVE A0,*A8(OXVEL),L MOVE A0,*A8(OYVEL),L MOVE A0,*A8(OID) JAUC BLOW AGAIN SLEEP 60*4 ;6 ;SEND OUT ANOTHER ROUND OF THESE CHASER GUYS CREATE CHSR2PID,DOCHS MOVI LEGOSND,A0 ;LETS GO CALLA ONESND DIE STRT_CHSR: ;A9=0 OR 32 MOVE @CIRCUIT,A0 SLL 5,A0 ADDI CIDS,A0 MOVE *A0,A0,L MOVE @WAVE,A1 DEC A1 SLL 4,A1 ADD A1,A0 MOVE *A0,A0,W ;COME OUT OF DOOR OTHER THAN EXIT DOORS MOVE A0,A8 MOVI 25,A1 ;OPEN TIME CALLA SET_GATE_2 MOVI TRAM1,A11 CMPI 32,A9 JRNE TRW MOVI TRAM2,A11 TRW MOVI PLYROBJS,A0 ADD A9,A0 MOVE *A0,A0,L MOVE A0,*A11,L ;MOVE OBJECT BLOCK PTR INTO TOP OF RAM STACK MOVI MAXPCS,A9 ;CHASER LENGTH MOVK 1,A10 LPA: CREATE CHSRPID,CHASER INC A10 CMP A9,A10 JRLE LPA DIE ;JERK: .LONG [0,5],[0,-5],[5,0],[-5,0] CHASER: DEC A8 ;A8=DOOR 1-4 SLL 5,A8 MOVI SX,A0 ADD A8,A0 MOVE *A0,A0,L ;X ADDI SY,A8 MOVE *A8,A1,L ;Y MOVI BLD1,A2 MOVI 159,A3 MOVI DMAWNZ,A4 ;NON-ZERO VALUE MOVI CLSNEUT|TYPCHSR,A5 CLR A6 CLR A7 MOVE A7,*A13(DLY),L CALLA BEGINOBJ MOVE A10,A0 SLL 5,A0 ;A11=TRAM PTR ADD A11,A0 MOVE A8,*A0,L MOVK 1,A0 MOVB A0,*A13(CDELAY) MOVB A0,*A13(NONO) MOVB A0,*A13(BLDVW) CLR A0 MOVB A7,*A13(GDIE) SLEEP 2 LPTP: ;CHECK MAGIC BOXES ;DO NOT ALLOW ENTRY ; MOVI [>43,>41],A2 ; MOVI [>DC,>151],A3 ; CALLA SCRTSTG ; JRZ C32 ; ;A0=1,2,3 OR 4 WHICH IS RETURNED FROM SCRTSTG! ; ; DEC A0 ; SLL 5,A0 ; ADDI JERK,A0 ; MOVE *A0,A0,L ; MOVY A0,A1 ; SRL 16,A1 ; CLR A2 ; MOVX A0,A2 ; MOVE *A8(OXPOS),A3 ; ADD A2,A3 ; MOVE A3,*A8(OXPOS) ; MOVE *A8(OYPOS),A3 ; ADD A1,A3 ; MOVE A3,*A8(OYPOS) ; ; ;C32 MOVB @SCRL,A0 JRZ LOO CLR A0 MOVE A0,*A8(OXVEL),L MOVE A0,*A8(OYVEL),L JRUC NO_SK LOO MOVE *A13(DLY),A0,L JRZ LPO ;BULLET HAS HIT BLADE CLR A1 MOVE A1,*A13(DLY),L MOVE *A0(BLTDIR),A0 SLL 4,A0 MOVI CHSX,A1 ADD A0,A1 MOVE *A1,A1,W MOVE *A8(OXPOS),A2 ADD A1,A2 MOVE A2,*A8(OXPOS) MOVI CHSY,A1 ADD A0,A1 MOVE *A1,A1,W MOVE *A8(OYPOS),A0 ADD A1,A0 MOVE A0,*A8(OYPOS) LPO MOVB *A13(CDELAY),A1 ANDI 07H,A1 DEC A1 MOVB A1,*A13(CDELAY) JRNE NO_SK MOVI 15,A1 MOVB A1,*A13(CDELAY) MOVE A10,A1 LPTP2 DEC A1 MOVE A1,A0 SLL 5,A0 ADD A11,A0 MOVE *A0,A0,L ;OBJ TO SK JRZ LPTP2 CALLR PLTLINE MOVE A5,*A8(OXVEL),L MOVE A6,*A8(OYVEL),L NO_SK ;UPDATE VIEW OF BLADE MOVB *A13(BLDVW),A0 ANDI 07H,A0 INC A0 MOVB A0,*A13(BLDVW) CMPI 4,A0 ;4 JRNE KP_GO CLR A0 MOVB A0,*A13(BLDVW) KP_GO MOVI CHSRIMG,A1 SLL 5,A0 ADD A0,A1 MOVE *A1,A1,L ;GET NEW OIMG FOR THIS CHASER PIECE MOVE *A8(OFLAGS),A4 CALLA ANI SLEEP 3 JRUC LPTP CHSX .WORD 0,0,6,5,6,0,-5,-6,-6 CHSY .WORD 0,-5,-6,0,6,5,6,0,-6 ;8 1 2 ;7 3 ;6 5 4 ;A10 SHOULD BE 1-8! CHSRIMG: .LONG BLB4,BLB3 .LONG BLB2,BLB1 .LONG BLB4,BLB3 .LONG BLB2,BLB1 ; PLTLINE - MAKE AN OBJECT TRAVEL FROM PNT. A TO PNT. B ; ; A8 = OBJECT SEEKING ; A0 = OBJECT SEEKED ; RETURNS: ; A5 = X VEL UHL ; A6 = Y VEL UHL PLTLINE: MOVE *A0(OXPOS),A5,W MOVE *A0(OYPOS),A6,W ; ADDI 15,A6 MOVE *A8(OXPOS),A3,W MOVE *A8(OYPOS),A4,W SUB A3,A5 ;FIND DIFFERENCE SUB A4,A6 MOVE A6,A3 ; MOVE A5,A1 ABS A5 ABS A6 ADD A5,A6 ;CALC SUM ABS(DX+DY) SLL 16,A1 ;SHIFT TO ACCOMODATE FRACTIONAL VELOCITY SLL 16,A3 DIVS A6,A1 ;GENERATE SPEED RATIOS DIVS A6,A3 MOVI 8,A2 MOVK 3,A5 ;MULTIPLY BY VELOCITY FACTOR MPYU A2,A5 MPYS A5,A3 MPYS A1,A5 ;FINAL X VEL SRA 4,A3 SRA 4,A5 MOVE A3,A6 ;FINAL Y VEL RETS .END