SUBROUTINE BULCOL C C THIS SUBROUTINE CONTROLS COLLISIONS BETWEEN BULLETS AND TARGETS. C IMPLICIT INTEGER(A - Z) PARAMETER MAXCNT = 24 C SCREEN BOUNDARIES PARAMETER LMAR = 2, RMAR = 30, TMAR = 2, BMAR = 23, GMAR = 18 C DIRECTIONALS PARAMETER HALT = 0, UP = 1, DOWN = 2, LEFT = 4, RIGHT = 8 PARAMETER UPL = 10, UPR = 9, DOWNL = 12, DOWNR = 11 C DISPLAYABLE CHARACTERS PARAMETER GUNCHR="166, CBODY="140, MSHCHR="146, BULCHR="170 PARAMETER SPICHR="173, FLECHR="175, SCOCHR="142, PSNCHR="052 PARAMETER CLHEAD="074, CRHEAD="076, CDHEAD="126 PARAMETER SHFIN="17, SHFOUT="16, SPACE="40 C QIO FUNCTION CODES PARAMETER IOATA="1410, IOWVB="11000, SFSMC="2440 C INTEGER*4SCORE, FRESCO, TIMER, SEED, FLETIM, SPITIM, SCOTIM, CNTTI *M DIMENSION PRL(6), CX(MAXCNT, 12), CY(MAXCNT, 12) DIMENSION CLEN(MAXCNT), CDIR(MAXCNT), CRISE(MAXCNT), CBOT(MAXCNT) BYTE CNTBRD(BMAR, RMAR), MSHBRD(BMAR, RMAR), PSNBRD(BMAR, RMAR) COMMON/DIRCOM/DIRCOD, FIRCOD COMMON/CNTCOM/PRL, SCORE, TIMER, SEED, CX, CY, CLEN, CDIR, CRISE, *CBOT, GUNX, GUNY, FRESCO, CNTBRD, MSHBRD, PSNBRD, BULACT, BULX, BU *LY, FLETIM, FLEACT, FLEX, FLEY, SPITIM, SPIACT, SPIX, SPIY, SPILR, * SCOTIM, SCOACT, SCOX, SCOY, SCODIR, GUNCNT, CNTTIM, BOARD, CNTWAV C C VT100 DISPLAY CONTROL PARAMETER DEFINITIONS C CCURSOR POSITION REPORT CCURSOR UP CCURSOR DOWN CCURSOR FORWARD CCURSOR BACK CDOUBLE WIDTH LINE PARAMETER CUP = 1, CUU = 2, CUD = 3, CUF = 4, CUB = 5, DECDWL = 6, * DECDHL = 7, DECRC = 8, DECSC = 9, DECSWL = 10, ED = 11, EL = 12, *SGR = 13, NEL = 14, SCS = 15, SM = 16, RM = 17, ANSI = 18, CPP=19 BYTE THREE, SIX, NINE DATA THREE,SIX,NINE / "063,"066,"071 / C C CHECK IF CURRENT BULLET LOCATION COLLIDES WITH MUSHROOM C IF (.NOT.(MSHBRD(BULX, BULY) .GT. 0)) GOTO 2000 BULACT = 0 MSHBRD(BULX, BULY) = MSHBRD(BULX, BULY) - 1 IF (.NOT.(MSHBRD(BULX, BULY) .EQ. 0)) GOTO 2020 PSNBRD(BULX, BULY) = 0 SCORE = SCORE + 1 2020 CONTINUE C C CHECK IF CURRENT BULLET LOCATION COLLIDES WITH CENTIPEDE(S) C 2000 CONTINUE DO 2040 I = 1, MAXCNT CLOOP THROUGH CENTIPEDE TABLE ENTRIES IF (.NOT.(CLEN(I) .EQ. 0)) GOTO 2060 CUNUSED ENTRY GOTO 2040 2060 CONTINUE DO 2080 J = 1, CLEN(I) CLOOP THROUGH LINKS FOR THIS ENTRY IF (.NOT.(BULX .EQ. CX(I, J).AND.BULY .EQ. CY(I, J))) GOTO 210 *0 CCOLLISION BULACT = 0 CCREATE MUSHROOM IN MUSHROOM TABLE MSHBRD(BULX, BULY) = 4 CCLEAR CENTIPEDE BOARD AT THIS LOC CNTBRD(BULX, BULY) = 0 IF (.NOT.(J .EQ. 1)) GOTO 2120 CCOLLISION WITH CENTIPEDE HEAD CINCREMENT SCORE SCORE = SCORE + 100 C'SHORTEN' CENTIPEDE CLEN(I) = CLEN(I) - 1 IF (.NOT.(CLEN(I) .GT. 0)) GOTO 2140 CIF LENGTH NOT ZERO DO 2160 K = 1, CLEN(I) CUPDATE LINKS IN CENTIPEDE TABLE CX(I, K) = CX(I, K + 1) CY(I, K) = CY(I, K + 1) 2160 CONTINUE CDISPLAY NEW CENTIPEDE HEAD IF (.NOT.(CDIR(I) .EQ. LEFT)) GOTO 2180 CALL UVT100(CPP, CX(I, 1), CY(I, 1), CLHEAD) GOTO 2190 2180 CONTINUE IF (.NOT.(CDIR(I) .EQ. RIGHT)) GOTO 2200 CALL UVT100(CPP, CX(I, 1), CY(I, 1), CRHEAD) GOTO 2190 2200 CONTINUE CALL UVT100(CPP, CX(I, 1), CY(I, 1), CDHEAD) 2190 CONTINUE 2140 CONTINUE GOTO 2130 2120 CONTINUE CCOLLISION WITH CENTIPEDE BODY CINCREMENT SCORE SCORE = SCORE + 10 NEWLEN = CLEN(I) - J CLEN(I) = J - 1 IF (.NOT.(NEWLEN .GT. 0)) GOTO 2220 DO 2240 K = 1, MAXCNT CFIND EMPTY SLOT IN CENTIPEDE TABLE IF (.NOT.(CLEN(K) .GT. 0)) GOTO 2260 GOTO 2240 2260 CONTINUE DO 2280 L = 1, NEWLEN CMOVE NEW CENTIPEDE LINKS TO THIS SLOT CX(K, L) = CX(I, L + J) CY(K, L) = CY(I, L + J) 2280 CONTINUE CNEW CENTIPEDE LENGTH CLEN(K) = NEWLEN CNEW CENTIPEDE DIRECTION OF MOTION CDIR(K) = CDIR(I) CNEW CENTIPEDE ASCEND OR DESCEND CRISE(K) = CRISE(I) CNEW CENTIPEDE HIT BOTTOM FLAG CBOT(K) = CBOT(I) IF (.NOT.(CDIR(K) .EQ. LEFT)) GOTO 2300 CDISPLAY NEW CENTIPEDE HEAD CALL UVT100(CPP, CX(K, 1), CY(K, 1), CLHEAD) GOTO 2310 2300 CONTINUE IF (.NOT.(CDIR(K) .EQ. RIGHT)) GOTO 2320 CALL UVT100(CPP, CX(K, 1), CY(K, 1), CRHEAD) GOTO 2310 2320 CONTINUE CALL UVT100(CPP, CX(K, 1), CY(K, 1), CDHEAD) 2310 CONTINUE GOTO 2250 2240 CONTINUE 2250 CONTINUE 2220 CONTINUE 2130 CONTINUE 2100 CONTINUE 2080 CONTINUE C C CHECK IF CURRENT BULLET LOCATION COLLIDES WITH SPIDER C 2040 CONTINUE IF (.NOT.(SPIACT .EQ. 1.AND.BULX .EQ. SPIX.AND.BULY .EQ. SPIY)) GO *TO 2340 BULACT = 0 SPIACT = 0 CSCHEDULE NEXT SPIDER SPITIM = TIMER + 30 ITMP = GUNX - SPIX IF (.NOT.(ITMP .LT. 0)) GOTO 2360 ITMP = 0 2360 CONTINUE IF (.NOT.(ITMP .LT. 2)) GOTO 2380 CINCREMENT SCORE SCORE = SCORE + 900 CALL UVT100(CPP, BULX, BULY, NINE) GOTO 2390 2380 CONTINUE IF (.NOT.(ITMP .LT. 4)) GOTO 2400 SCORE = SCORE + 600 CALL UVT100(CPP, BULX, BULY, SIX) GOTO 2390 2400 CONTINUE SCORE = SCORE + 300 CALL UVT100(CPP, BULX, BULY, THREE) 2390 CONTINUE CDISPLAY POINTS FOR KILL CWAIT 200 MILLISECONDS CALL WAIT(200, 1) C C CHECK IF CURRENT BULLET LOCATION COLLIDES WITH FLEA C 2340 CONTINUE IF (.NOT.(FLEACT .EQ. 1.AND.FLEX .EQ. BULX.AND.FLEY .EQ. BULY)) GO *TO 2420 BULACT = 0 FLEACT = 0 ICOUNT = 0 DO 2440 I = GMAR, BMAR CNEXT SCHEDULED FLEA TIME DEPENDS DO 2460 J = LMAR, RMAR CON NUMBER OF MUSHROOMS IN PLAYER ZONE IF (.NOT.(MSHBRD(I, J) .GT. 0)) GOTO 2480 ICOUNT = ICOUNT + 1 2480 CONTINUE 2460 CONTINUE 2440 CONTINUE IF (.NOT.(ICOUNT .LT. 5)) GOTO 2500 CSCHEDULE NEXT FLEA FLETIM = FLETIM + 20 GOTO 2510 2500 CONTINUE FLETIM = FLETIM + 200 2510 CONTINUE CINCREMENT SCORE SCORE = SCORE + 200 C C CHECK IF CURRENT BULLET LOCATION COLLIDES WITH SCORPION C 2420 CONTINUE IF (.NOT.(SCOACT .EQ. 1.AND.SCOX .EQ. BULX.AND.SCOY .EQ. BULY)) GO *TO 2520 BULACT = 0 SCOACT = 0 CSCHEDULE NEXT SCORPION SCOTIM = SCOTIM + 200 CINCREMENT SCORE SCORE = SCORE + 1000 C C IF BULLET HIT SOMETHING, DISPLAY APPROPRIATE CHARACTER C 2520 CONTINUE IF (.NOT.(BULACT .EQ. 0)) GOTO 2540 CALL UVT100(CPP, BULX, BULY, SPACE) IF (.NOT.(MSHBRD(BULX, BULY) .GT. 0)) GOTO 2560 CALL UVT100(CPP, BULX, BULY, MSHCHR) 2560 CONTINUE IF (.NOT.(PSNBRD(BULX, BULY) .EQ. 1)) GOTO 2580 CALL UVT100(CPP, BULX, BULY, PSNCHR) 2580 CONTINUE 2540 CONTINUE RETURN END