SUBROUTINE CURLY IMPLICIT INTEGER(A - Z) C C THIS SUBROUTINE CONTROLS THE MOTION OF CURLY. C CURLY MOVES AT 83% OF TOP SPEED. HE FOLLOWS PACMAN CLOSELY C MAKING A DECISION TO CHANGE DIRECTION AT EVERY OPPORTUNITY, C AND ALWAYS FOLLOWING PACMAN THROUGH AN INTERSECTION WHEN PACMAN C JUST PRECEDED HIM THROUGH IT. (PACMAN CANNOT 'SHAKE' HIM EASILY) 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 = CDIR IF (.NOT.(CPRISN .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.(CTIM+PRITIM .LE. TIMER)) GOTO 2040 CIF TIME TO GET OUT, CERASE US FROM IN PRISON CALL UVT100(CPP, CPRISR, CPRISC, SPACE) CROW = RDOOR CCOL = CDOOR CMOVE HIM TO PRISON DOOR CALL UVT100(CPP, CROW, CCOL, CMAN(STATE)) CNO LONGER IN PRISON CPRISN = 0 CNO MOTION YET CDIR = 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 CDIR = OLDDIR RETURN C C IF THIS IS A TUNNEL LOCATION, TEST IF MOTION ALLOWED THIS CYCLE C 2060 CONTINUE IF (.NOT.(TSTBIT(MSTATE(CCOL, CROW), TUNNEL) .EQ. 1)) GOTO 2080 IF (.NOT.(MOVE(CYCLE, 3) .EQ. 0)) GOTO 2100 CDIR = OLDDIR RETURN 2100 CONTINUE C C ELSE IF THIS IS LAST INTERSECTION PACMAN TRAVERSED, FOLLOW HIM C GOTO 2090 2080 CONTINUE IF (.NOT.(CCOL .EQ. PACDSC.AND.CROW .EQ. PACDSR)) GOTO 2120 CDIR = PACDSD C C ELSE IF THIS IS A DECISION BIT, CALL C DECIDE TO DETERMINE DIRECTION TO GO. C GOTO 2090 2120 CONTINUE IF (.NOT.(TSTBIT(MSTATE(CCOL, CROW), DECISN) .EQ. 1)) GOTO 2140 CALL DECIDE(CCOL, CROW, CDIR) C C IF WE HAVE RUN INTO A WALL, FIND A NEW DIRECTION C 2140 CONTINUE 2090 CONTINUE IF (.NOT.(TSTBIT(MSTATE(CCOL, CROW), CDIR) .EQ. 0)) GOTO 2160 CALL WALL(CCOL, CROW, CDIR) C C IF MOTION IS PROHIBITED THIS CYCLE, RESET OLD DIRECTION AND RETURN C 2160 CONTINUE IF (.NOT.(MOVE(CYCLE, CDIR) .EQ. 0.OR.MOVE(CYCLE, 7) .EQ. 0)) GOTO * 2180 CDIR = OLDDIR RETURN C C ALL READY TO MOVE C 2180 CONTINUE CCURSOR TO CURRENT LOCATION IF (.NOT.(TSTBIT(MSTATE(CCOL, CROW), DOT) .EQ. 1)) GOTO 2200 CREWRITE DOT CALL UVT100(CPP, CROW, CCOL, DOTCHR) GOTO 2210 2200 CONTINUE IF (.NOT.(TSTBIT(MSTATE(CCOL, CROW), EGZ) .EQ. 1)) GOTO 2220 CREWRITE ENERGIZER CALL UVT100(CPP, CROW, CCOL, EGZCHR) GOTO 2210 2220 CONTINUE IF (.NOT.(FRUIT .EQ. 1.AND.CCOL .EQ. FRUCOL.AND.CROW .EQ. FRUROW)) * GOTO 2240 CREWRITE FRUIT CALL UVT100(CPP, CROW, CCOL, FRUCHR(BOARD)) GOTO 2210 2240 CONTINUE CREWRITE SPACE CALL UVT100(CPP, CROW, CCOL, SPACE) 2210 CONTINUE IF (.NOT.(CDIR .EQ. LEFT)) GOTO 2260 CCOL = CCOL - 1 GOTO 2270 2260 CONTINUE IF (.NOT.(CDIR .EQ. UP)) GOTO 2280 CROW = CROW - 1 GOTO 2270 2280 CONTINUE IF (.NOT.(CDIR .EQ. RIGHT)) GOTO 2300 CCOL = CCOL + 1 GOTO 2270 2300 CONTINUE IF (.NOT.(CDIR .EQ. DOWN)) GOTO 2320 CROW = CROW + 1 2320 CONTINUE 2270 CONTINUE IF (.NOT.(CCOL .GT. CMAR)) GOTO 2340 CCOL = 1 GOTO 2350 2340 CONTINUE IF (.NOT.(CCOL .LT. 1)) GOTO 2360 CCOL = CMAR 2360 CONTINUE 2350 CONTINUE IF (.NOT.(CROW .GT. RMAR)) GOTO 2380 CROW = 1 GOTO 2390 2380 CONTINUE IF (.NOT.(CROW .LT. 1)) GOTO 2400 CROW = RMAR 2400 CONTINUE 2390 CONTINUE CALL UVT100(CPP, CROW, CCOL, CMAN(STATE)) CTEST FOR COLLISION CALL COLIDE RETURN END