SUBROUTINE SPIDER C C THIS SUBROUTINE CONTROLS THE ACTIONS OF A SPIDER 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 REAL X, RAN DIMENSION XLADD(4), YLADD(4), XRADD(4), YRADD(4) DATA XLADD/ - 1, - 1, 1, 1/ DATA YLADD/0, - 1, - 1, 0/ DATA XRADD/ - 1, - 1, 1, 1/ DATA YRADD/0, 1, 1, 0/ C C RANDOMLY SELECT NEW SPIDER MOTION. IF SPIDER UNABLE TO MOVE TO C THAT LOCATION RETURN. CLEAR OUT ANY MUSHROOM AT THAT LOCATION. C X = RAN(SEED) CRANDOM NUMBER IN RANGE 1-4 RANDX = (X*4) + 1 X = RAN(SEED) CRANDOM NUMBER IN RANGE 1-4 RANDY = (X*4) + 1 IF (.NOT.(SPILR .EQ. LEFT)) GOTO 2000 CSPIDER IS TRAVELLING TO LEFT... NEWX = SPIX + XLADD(RANDX) CSELECT A RANDOM MOTION NEWY = SPIY + YLADD(RANDY) IF (.NOT.(NEWY .LT. LMAR)) GOTO 2020 CIF OFF EDGE OF SCREEN, END OF SPIDER CALL UVT100(CPP, SPIX, SPIY, SPACE) SPIACT = 0 CNEXT SPIDER IN 30 CYCLES SPITIM = TIMER + 30 RETURN CCHECK FOR ILLEGAL MOVE 2020 CONTINUE GOTO 2010 2000 CONTINUE IF (.NOT.(SPILR .EQ. RIGHT)) GOTO 2040 CSPIDER IS TRAVELLING RIGHT... NEWX = SPIX + XRADD(RANDX) CSELECT A RANDOM MOTION NEWY = SPIY + YRADD(RANDY) IF (.NOT.(NEWY .GT. RMAR)) GOTO 2060 CIF OFF EDGE OF SCREEN, END OF SPIDER CALL UVT100(CPP, SPIX, SPIY, SPACE) SPIACT = 0 CNEXT SPIDER IN 30 CYCLES SPITIM = TIMER + 30 RETURN CCHECK FOR ILLEGAL MOVE 2060 CONTINUE C C TEST IF LEGAL FOR SPIDER TO MOVE TO NEW LOCATION C 2040 CONTINUE 2010 CONTINUE IF (.NOT.(NEWX .LT. GMAR.OR.NEWX .GT. BMAR)) GOTO 2080 CCAN'T MOVE OUT OF PLAYER'S ZONE RETURN 2080 CONTINUE IF (.NOT.(CNTBRD(NEWX, NEWY) .GT. 0)) GOTO 2100 CCAN'T MOVE INTO CENTIPEDE RETURN 2100 CONTINUE IF (.NOT.(MSHBRD(NEWX, NEWY) .GT. 0)) GOTO 2120 CCAN'T MOVE INTO MUSHROOM CCLEAR MUSHROOM AT THIS LOCATION MSHBRD(NEWX, NEWY) = 0 CALL UVT100(CPP, NEWX, NEWY, SPACE) RETURN C C ERASE SPIDER AT OLD LOCATION AND DISPLAY SPIDER AT NEW LOCATION. C 2120 CONTINUE CALL UVT100(CPP, SPIX, SPIY, SPACE) SPIX = NEWX SPIY = NEWY CALL UVT100(CPP, SPIX, SPIY, SPICHR) RETURN END