SUBROUTINE PACMOV IMPLICIT INTEGER(A - Z) C C THIS SUBROUTINE CONTROLS THE MOVEMENT OF THE PACMAN 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 C MAZE DIMENSIONS PARAMETER RMAR = 24, CMAR = 53 C BIT SETTINGS FOR DIRECTIONALS AND MSTATE TABLE PARAMETER HALT = 0, UP = 1, DOWN = 2, LEFT = 4, RIGHT = 8 PARAMETER DOT=16, EGZ=32, TUNNEL=64, DECISN="200 PARAMETER SHFIN="17, SHFOUT="16, SPACE="40 C DISPLAYABLE CHARACTERS PARAMETER PMAN="52, EGZCHR="146, DOTCHR="176, TUNCHR="137 C BOARD STATE PARAMETER GOOD = 1, BAD = 2, BLINK = 3, EATEN = 4 C INTEGER*4SCORE, TIMER, STATIM, LTIM, CTIM, FTIM, NTIM, FRUON, FRUO *FF INTEGER*2PRL(6), EATSCO(4), FRUSCO(6), FRUDSR(20), FRUDSC(20) BYTE LMAN(3), CMAN(3), FMAN(3), NMAN(3), EATCHR(4), FRUCHR(6) BYTE MSTATE(CMAR, RMAR), MOVE(24, 9), FRUTBL(20) C COMMONS COMMON/MSTCOM/MSTATE COMMON/DIRCOM/NEWDIR, CURDIR COMMON/PACCOM/FDIR, NDIR, LDIR, CDIR, CYCLE, MOVE, SCORE, DOTCNT, *COL, ROW, LCOL, LROW, CCOL, CROW, FCOL, FROW, NCOL, NROW, CYCTIM, *TIMER, BOARD, STATE, STATIM, LTIM, CTIM, FTIM, NTIM, LPRISN, CPRIS *N, FPRISN, NPRISN, LPRISR, LPRISC, CPRISR, CPRISC, FPRISR, FPRISC, * NPRISR, NPRISC, RDOOR, CDOOR, PRITIM, GOODTM, BLNKTM, EATCNT, EAT *CHR, EATSCO, EXTRA, LMAN, CMAN, FMAN, NMAN, PACCNT, INIROW, INICOL *, GAMOVR, FRUIT, FRUTIM, FRULTH, FRUON, FRUOFF, FRUSCO, FRUCHR, FR *UCOL, FRUROW, FRUCNT, FRUDSR, FRUDSC, PRL, FRUTBL, PACDSC, PACDSR, * PACDSD, FRUBRD IF (.NOT.(NEWDIR .EQ. -1)) GOTO 2000 CEXIT PROGRAM RETURN C C TEST THE STATUS OF NEW DIRECTION, AND IF LEGAL AT THIS LOCATION C SET CURRENT DIRECTION EQUAL TO IT. IF CURRENT DIRECTION IS NOT C LEGAL AT THIS LOCATION, SET CURRENT DIRECTION TO 'HALT'. C 2000 CONTINUE OLDDIR = CURDIR IF (.NOT.(TSTBIT(MSTATE(COL, ROW), NEWDIR) .EQ. 1)) GOTO 2020 CNEWDIR LEGAL? CURDIR = NEWDIR 2020 CONTINUE IF (.NOT.(TSTBIT(MSTATE(COL, ROW), CURDIR) .EQ. 0)) GOTO 2040 CCURDIR LEGAL? CURDIR = HALT C C TEST IF WE ATE AN ENERGIZER OR DOT ON OUR LAST MOVE. C IF WE DID, WE MAY NOT BE ALLOWED TO MOVE THIS CYCLE. C 2040 CONTINUE IF (.NOT.(ATEDOT .EQ. 1)) GOTO 2060 ATEDOT = 0 IF (.NOT.(MOVE(CYCLE, 6) .EQ. 0.AND.OLDDIR .EQ. CURDIR)) GOTO 20 *80 RETURN 2080 CONTINUE C C RETURN IF NO MOTION SPECIFIED C 2060 CONTINUE IF (.NOT.(CURDIR .EQ. HALT)) GOTO 2100 RETURN C C ELSE PERFORM ANY REQUIRED MOTION FOR PACMAN. (CHECK IF MOTION C IS ALLOWED THIS CYCLE. IT IS ALWAYS ALLOWED FOR CHANGE OF C DIRECTION, SO THAT PACMAN CANNOT BE CAUGHT IN A CORNER) C 2100 CONTINUE IF (.NOT.(CURDIR .NE. OLDDIR.OR.MOVE(CYCLE, CURDIR) .EQ. 1)) GOTO *2120 CPOSITION CURSOR AND BLANK OUT THIS LOCATION CALL UVT100(CPP, ROW, COL, SPACE) IF (.NOT.(TSTBIT(MSTATE(COL, ROW), DECISN) .EQ. 1)) GOTO 2140 CSAVE THESE CO-ORDS. PACDSC = COL PACDSR = ROW PACDSD = CURDIR 2140 CONTINUE IF (.NOT.(CURDIR .EQ. LEFT)) GOTO 2160 CSET NEW COORDINATES COL = COL - 1 GOTO 2170 2160 CONTINUE IF (.NOT.(CURDIR .EQ. UP)) GOTO 2180 ROW = ROW - 1 GOTO 2170 2180 CONTINUE IF (.NOT.(CURDIR .EQ. RIGHT)) GOTO 2200 COL = COL + 1 GOTO 2170 2200 CONTINUE IF (.NOT.(CURDIR .EQ. DOWN)) GOTO 2220 ROW = ROW + 1 2220 CONTINUE 2170 CONTINUE IF (.NOT.(COL .GT. CMAR)) GOTO 2240 COL = 1 GOTO 2250 2240 CONTINUE IF (.NOT.(COL .LT. 1)) GOTO 2260 COL = CMAR 2260 CONTINUE 2250 CONTINUE IF (.NOT.(ROW .GT. RMAR)) GOTO 2280 ROW = 1 GOTO 2290 2280 CONTINUE IF (.NOT.(ROW .LT. 1)) GOTO 2300 ROW = RMAR 2300 CONTINUE 2290 CONTINUE CDISPLAY PACMAN AT NEW COORDINATES CALL UVT100(CPP, ROW, COL, PMAN) C C TEST IF WE DID ANYTHING USEFUL WITH THIS LATEST MOVE C IF (.NOT.(TSTBIT(MSTATE(COL, ROW), EGZ) .EQ. 1)) GOTO 2320 CJUST ATE ENERGIZER CALL CLRBIT(MSTATE(COL, ROW), EGZ) ! CLEAR ENERGIZER BIT STATE = GOOD ! STATE = MUNCH TIME STATIM = TIMER ! TIME OF STATE CHANGE SCORE = SCORE + 50 ! ADD 50 POINTS IF (.NOT.(SCORE .GE. 10000.AND.EXTRA .EQ. 0)) GOTO 2340 CTEST FOR EXTRA PACMAN CAT 10000 POINTS PACCNT = PACCNT + 1 EXTRA = 1 2340 CONTINUE DOTCNT = DOTCNT - 1 ! DECREMENT DOT COUNT ATEDOT = 1 ! JUST ATE ENERGIZER 2320 CONTINUE IF (.NOT.(TSTBIT(MSTATE(COL, ROW), DOT) .EQ. 1)) GOTO 2360 CJUST ATE DOT CALL CLRBIT(MSTATE(COL, ROW), DOT) ! CLEAR DOT BIT SCORE = SCORE + 10 ! IF SO, ADD 10 POINTS IF (.NOT.(SCORE .GE. 10000.AND.EXTRA .EQ. 0)) GOTO 2380 CTEST FOR EXTRA PACMAN CAT 10000 POINTS PACCNT = PACCNT + 1 EXTRA = 1 2380 CONTINUE DOTCNT = DOTCNT - 1 ! DECREMENT DOT COUNT ATEDOT = 1 ! JUST ATE DOT 2360 CONTINUE IF (.NOT.(FRUIT .EQ. 1.AND.COL .EQ. FRUCOL.AND.ROW .EQ. FRUROW)) * GOTO 2400 FRUIT = 0 ! JUST ATE FRUIT FRUCNT = FRUCNT + 1 ! TOTAL FRUIT EATEN FRUBRD = FRUBRD + 1 ! FRUIT THIS BOARD FRUON = TIMER + FRUTIM !RESET TIMER FOR FRUIT SCORE = SCORE + FRUSCO(BOARD) ! INCREMENT SCORE IF (.NOT.(SCORE .GE. 10000.AND.EXTRA .EQ. 0)) GOTO 2420 PACCNT = PACCNT + 1 EXTRA = 1 2420 CONTINUE IF (.NOT.(FRUCNT .LE. 20)) GOTO 2440 FRUTBL(FRUCNT) = FRUCHR(BOARD) ! DISPLAY EATEN FRUIT CALL UVT100(CPP,FRUDSR(FRUCNT),FRUDSC(FRUCNT),FRUCHR(BOARD)) 2440 CONTINUE 2400 CONTINUE CALL COLIDE ! TEST FOR COLLISION 2120 CONTINUE 2110 CONTINUE END