SUBROUTINE CNTMOV C C THIS SUBROUTINE CONTROLS THE MOTION OF CENTIPEDES. CENTIPEDES C MOVE ACROSS THE SCREEN UNTIL THEY HIT EITHER THE EDGE OR A C MUSHROOM. AT THIS POINT THEY DROP DOWN A ROW AND REVERSE DIRECTION, C UNLESS THE MUSHROOM IS POISONED. A POISON MUSHROOM CAUSES THEM C TO DROP STRAIGHT DOWN UNTIL THE NEXT TO THE LAST ROW OF THE DISPLAY, C AT WHICH POINT THEY RESUME NORMAL MOTION. 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 CALL BUFFER(1) ! START BUFFERING OUTPUT DO 2000 I = 1, MAXCNT CSEARCH CENTIPEDE TABLE IF (.NOT.(CLEN(I) .EQ. 0)) GOTO 2020 CNOT AN ACTIVE CENTIPEDE GOTO 2000 2020 CONTINUE CCURRENT COORDINATES OF HEAD NEWX = CX(I, 1) COF CENTIPEDE NEWY = CY(I, 1) IF (.NOT.(CLEN(I) .GT. 1)) GOTO 2040 CIF CENTIPEDE HAS A BODY... C C REPLACE CENTIPEDE HEAD WITH CENTIPEDE BODY C CDISPLAY BODY CHARACTER CALL UVT100(CPP, NEWX, NEWY, CBODY) C C BLANK OUT OLD TAIL OF CENTIPEDE C 2040 CONTINUE TMPX = CX(I, CLEN(I)) TMPY = CY(I, CLEN(I)) IF (.NOT.(CNTBRD(TMPX, TMPY) .GT. 0)) GOTO 2060 CDECREMENT CENTIPEDE COUNT CNTBRD(TMPX, TMPY) = CNTBRD(TMPX, TMPY) - 1 2060 CONTINUE IF (.NOT.(CNTBRD(TMPX, TMPY) .EQ. 0)) GOTO 2080 CIF NO OTHER CENTIPEDE HERE... IF (.NOT.(MSHBRD(TMPX, TMPY) .EQ. 0)) GOTO 2100 CALL UVT100(CPP, TMPX, TMPY, SPACE) GOTO 2110 2100 CONTINUE IF (.NOT.(PSNBRD(TMPX, TMPY) .EQ. 0)) GOTO 2120 CALL UVT100(CPP, TMPX, TMPY, MSHCHR) GOTO 2110 2120 CONTINUE CALL UVT100(CPP, TMPX, TMPY, PSNCHR) 2110 CONTINUE C C ADVANCE HEAD OF CENTIPEDE C 2080 CONTINUE IF (.NOT.(CDIR(I) .EQ. LEFT)) GOTO 2140 CMOTION IS TO LEFT CCHECK FOR BUMPING INTO SOMETHING NEWY = NEWY - 1 IF (.NOT.(NEWY .LT. LMAR.OR.MSHBRD(NEWX, NEWY) .GT. 0.OR.CNTBR *D(NEWX, NEWY) .GT. 0)) GOTO 2160 CNEW MOTION IS TO RIGHT CDIR(I) = RIGHT IF (.NOT.(PSNBRD(NEWX, NEWY) .EQ. 1.AND.NEWY .GE. LMAR)) GOT *O 2180 CHIT POISON MUSHROOM CDIR(I) = DOWN CDESCEND CRISE(I) = 1 C'UNPOISON' MUSHROOM PSNBRD(NEWX, NEWY) = 0 CALL UVT100(CPP, NEWX, NEWY, MSHCHR) 2180 CONTINUE CRESTORE Y-COORDINATE NEWY = NEWY + 1 CASCEND OR DESCEND ONE ROW NEWX = NEWX + CRISE(I) 2160 CONTINUE GOTO 2150 2140 CONTINUE IF (.NOT.(CDIR(I) .EQ. RIGHT)) GOTO 2200 CMOTION IS TO RIGHT CCHECK FOR BUMPING INTO SOMETHING NEWY = NEWY + 1 IF (.NOT.(NEWY .GT. RMAR.OR.MSHBRD(NEWX, NEWY) .GT. 0.OR.CNTBR *D(NEWX, NEWY) .GT. 0)) GOTO 2220 CNEW MOTION IS TO LEFT CDIR(I) = LEFT IF (.NOT.(PSNBRD(NEWX, NEWY) .EQ. 1.AND.NEWY .LE. RMAR)) GOT *O 2240 CHIT POISON MUSHROOM CDIR(I) = DOWN CDESCEND CRISE(I) = 1 C'UNPOISON' MUSHROOM PSNBRD(NEWX, NEWY) = 0 CALL UVT100(CPP, NEWX, NEWY, MSHCHR) 2240 CONTINUE CRESTORE Y-COORDINATE NEWY = NEWY - 1 CASCEND OR DESCEND ONE ROW NEWX = NEWX + CRISE(I) 2220 CONTINUE GOTO 2150 2200 CONTINUE IF (.NOT.(CDIR(I) .EQ. DOWN)) GOTO 2260 CMOTION IS DOWN NEWX = NEWX + 1 IF (.NOT.(NEWX .GT. BMAR)) GOTO 2280 CREVERT TO NORMAL MOTION IF (.NOT.(NEWY .LT. 20)) GOTO 2300 CLEFT HALF OF BOARD - RIGHT MOTION NEWY = NEWY + 1 CDIR(I) = RIGHT GOTO 2310 2300 CONTINUE CRIGHT HALF OF BOARD - LEFT MOTION NEWY = NEWY - 1 CDIR(I) = LEFT 2310 CONTINUE GOTO 2290 2280 CONTINUE CZIGZAG BETWEEN TWO COLUMNS IF (.NOT.((NEWY/2)*2 .EQ. NEWY)) GOTO 2320 NEWY = NEWY - 1 GOTO 2330 2320 CONTINUE NEWY = NEWY + 1 2330 CONTINUE IF (.NOT.(NEWY .LT. LMAR)) GOTO 2340 NEWY = LMAR GOTO 2350 2340 CONTINUE IF (.NOT.(NEWY .GT. RMAR)) GOTO 2360 NEWY = RMAR 2360 CONTINUE 2350 CONTINUE 2290 CONTINUE 2260 CONTINUE 2150 CONTINUE IF (.NOT.(NEWX .GT. BMAR)) GOTO 2380 CIF WE HAVE DESCENDED OFF BOTTOM COF BOARD, START ASCENDING NEWX = BMAR - 1 CRISE(I) = - 1 CBOT(I) = 1 GOTO 2390 2380 CONTINUE IF (.NOT.(NEWX .LT. GMAR.AND.CRISE(I) .EQ. -1)) GOTO 2400 CIF ASCENDED TO TOP COF PLAYER ZONE, START DESCENDING NEWX = GMAR + 1 CRISE(I) = 1 C C UPDATE CENTIPEDE COORDINATES AND CENTIPEDE BOARD C 2400 CONTINUE 2390 CONTINUE DO 2420 J = CLEN(I), 2, - 1 CX(I, J) = CX(I, J - 1) CY(I, J) = CY(I, J - 1) 2420 CONTINUE CX(I, 1) = NEWX CY(I, 1) = NEWY CNTBRD(NEWX, NEWY) = CNTBRD(NEWX, NEWY) + 1 C C DISPLAY NEW CENTIPEDE HEAD C IF (.NOT.(CDIR(I) .EQ. LEFT)) GOTO 2440 CALL UVT100(CPP, NEWX, NEWY, CLHEAD) GOTO 2450 2440 CONTINUE IF (.NOT.(CDIR(I) .EQ. RIGHT)) GOTO 2460 CALL UVT100(CPP, NEWX, NEWY, CRHEAD) GOTO 2450 2460 CONTINUE CALL UVT100(CPP, NEWX, NEWY, CDHEAD) 2450 CONTINUE CALL BUFFER(2) ! FLUSH OUTPUT BUFFER CALL BUFFER(0) ! CANCEL BUFFERING CCHECK FOR PLAYER'S GUN MOTION CALL GUNMOV IF (.NOT.(FIRCOD .GT. 0)) GOTO 2480 CCHECK FOR FIRED BULLET CALL FIRE 2480 CONTINUE IF (.NOT.(BULACT .EQ. 1)) GOTO 2500 CPROCESS BULLET MOTION CALL BULLET 2500 CONTINUE CALL BUFFER(1) ! RESTART BUFFERING 2000 CONTINUE CALL BUFFER(0) ! CANCEL BUFFERING RETURN END