SUBROUTINE FLUFFY IMPLICIT INTEGER(A - Z) C C THIS SUBROUTINE CONTROLS THE MOTION OF FLUFFY. C FLUFFY MOVES AT 83% OF TOP SPEED, AND MAKES DIRECTION-CHANGING C DECISIONS AT DECISION POINTS APPROXIMATELY HALF THE TIME. C 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 QIO FUNCTION CODES PARAMETER IOWVB="11000 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/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 C C TEST IF WE ARE IN PRISON C OLDDIR = FDIR IF (.NOT.(FPRISN .EQ. 1)) GOTO 2000 CIF IN PRISON... IF (.NOT.(STATE .NE. BAD)) GOTO 2020 CDONT ESCAPE IF PACMAN IS CEATING MONSTERS RETURN 2020 CONTINUE IF (.NOT.(FTIM+PRITIM .LE. TIMER)) GOTO 2040 CIF TIME TO GET OUT, CERASE US FROM IN PRISON CALL UVT100(CPP, FPRISR, FPRISC, SPACE) FROW = RDOOR FCOL = CDOOR CMOVE HIM TO PRISON DOOR CALL UVT100(CPP, FROW, FCOL, FMAN(STATE)) CNO LONGER IN PRISON FPRISN = 0 CNO MOTION YET FDIR = HALT CNOT YET TIME TO GET OUT GOTO 2050 2040 CONTINUE RETURN 2050 CONTINUE C C IF PACMAN IS IN AN EATING MOOD (STATE IS 'GOOD' OR 'BLINK'), C ALL MONSTERS MOVE AT 67% OF TOP SPEED. TEST FOR THIS CONDITION. C 2000 CONTINUE IF (.NOT.(STATE .NE. BAD.AND.MOVE(CYCLE, 9) .EQ. 0)) GOTO 2060 FDIR = OLDDIR RETURN C C IF THIS IS A TUNNEL LOCATION, TEST IF MOTION ALLOWED THIS CYCLE C 2060 CONTINUE IF (.NOT.(TSTBIT(MSTATE(FCOL, FROW), TUNNEL) .EQ. 1)) GOTO 2080 IF (.NOT.(MOVE(CYCLE, 3) .EQ. 0)) GOTO 2100 FDIR = OLDDIR RETURN 2100 CONTINUE C C ELSE IF THIS IS A DECISION BIT, CALL DECIDE TO DETERMINE DIRECTION C TO GO. (ONLY DO WHEN ON SAME ROW OR COLUMN, OR, ON FIRST TWO BOARDS, C 50% OF THE TIME, ON NEXT TWO BOARDS, 67% OF THE TIME, AND ON LATER C BOARDS, 83% OF THE TIME). C GOTO 2090 2080 CONTINUE IF (.NOT.(TSTBIT(MSTATE(FCOL, FROW), DECISN) .EQ. 1)) GOTO 2120 IF (.NOT.(FCOL .EQ. COL.OR.FROW .EQ. ROW)) GOTO 2140 CALL DECIDE(FCOL, FROW, FDIR) GOTO 2150 2140 CONTINUE IF (.NOT.(BOARD .LT. 3.AND.MOVE(CYCLE, 3) .EQ. 1)) GOTO 2160 CALL DECIDE(FCOL, FROW, FDIR) GOTO 2150 2160 CONTINUE IF (.NOT.(BOARD .GT. 2.AND.BOARD .LT. 5.AND.MOVE(CYCLE, 7) .EQ. *1)) GOTO 2180 CALL DECIDE(FCOL, FROW, FDIR) GOTO 2150 2180 CONTINUE IF (.NOT.(BOARD .GT. 4.AND.MOVE(CYCLE, 9) .EQ. 1)) GOTO 2200 CALL DECIDE(FCOL, FROW, FDIR) 2200 CONTINUE 2150 CONTINUE C C IF WE HAVE RUN INTO A WALL, FIND A NEW DIRECTION C 2120 CONTINUE 2090 CONTINUE IF (.NOT.(TSTBIT(MSTATE(FCOL, FROW), FDIR) .EQ. 0)) GOTO 2220 CALL WALL(FCOL, FROW, FDIR) C C IF MOTION IS PROHIBITED THIS CYCLE, RESET OLD DIRECTION AND RETURN C 2220 CONTINUE IF (.NOT.(MOVE(CYCLE, FDIR) .EQ. 0.OR.MOVE(CYCLE, 7) .EQ. 0)) GOTO * 2240 FDIR = OLDDIR RETURN C C ALL READY TO MOVE C 2240 CONTINUE CCURSOR TO CURRENT LOCATION IF (.NOT.(TSTBIT(MSTATE(FCOL, FROW), DOT) .EQ. 1)) GOTO 2260 CALL UVT100(CPP, FROW, FCOL, DOTCHR) CREWRITE DOT GOTO 2270 2260 CONTINUE IF (.NOT.(TSTBIT(MSTATE(FCOL, FROW), EGZ) .EQ. 1)) GOTO 2280 CALL UVT100(CPP, FROW, FCOL, EGZCHR) CREWRITE ENERGIZER GOTO 2270 2280 CONTINUE IF (.NOT.(FRUIT .EQ. 1.AND.FCOL .EQ. FRUCOL.AND.FROW .EQ. FRUROW)) * GOTO 2300 CALL UVT100(CPP, FROW, FCOL, FRUCHR(BOARD)) CREWRITE FRUIT GOTO 2270 2300 CONTINUE CALL UVT100(CPP, FROW, FCOL, SPACE) CREWRITE SPACE 2270 CONTINUE IF (.NOT.(FDIR .EQ. LEFT)) GOTO 2320 FCOL = FCOL - 1 GOTO 2330 2320 CONTINUE IF (.NOT.(FDIR .EQ. UP)) GOTO 2340 FROW = FROW - 1 GOTO 2330 2340 CONTINUE IF (.NOT.(FDIR .EQ. RIGHT)) GOTO 2360 FCOL = FCOL + 1 GOTO 2330 2360 CONTINUE IF (.NOT.(FDIR .EQ. DOWN)) GOTO 2380 FROW = FROW + 1 2380 CONTINUE 2330 CONTINUE IF (.NOT.(FCOL .GT. CMAR)) GOTO 2400 FCOL = 1 GOTO 2410 2400 CONTINUE IF (.NOT.(FCOL .LT. 1)) GOTO 2420 FCOL = CMAR 2420 CONTINUE 2410 CONTINUE IF (.NOT.(FROW .GT. RMAR)) GOTO 2440 FROW = 1 GOTO 2450 2440 CONTINUE IF (.NOT.(FROW .LT. 1)) GOTO 2460 FROW = RMAR 2460 CONTINUE 2450 CONTINUE CALL UVT100(CPP, FROW, FCOL, FMAN(STATE)) CTEST FOR COLLISION CALL COLIDE RETURN END