SUBROUTINE NELLIE IMPLICIT INTEGER(A - Z) C C THIS SUBROUTINE CONTROLS THE MOTION OF NELLIE. C NELLIE 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 = NDIR IF (.NOT.(NPRISN .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.(NTIM+PRITIM .LE. TIMER)) GOTO 2040 CIF TIME TO GET OUT, CERASE US FROM IN PRISON CALL UVT100(CPP, NPRISR, NPRISC, SPACE) NROW = RDOOR NCOL = CDOOR CMOVE HIM TO PRISON DOOR CALL UVT100(CPP, NROW, NCOL, NMAN(STATE)) CNO LONGER IN PRISON NPRISN = 0 CNO MOTION YET NDIR = 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 NDIR = OLDDIR RETURN C C IF THIS IS A TUNNEL LOCATION, TEST IF MOTION ALLOWED THIS CYCLE C 2060 CONTINUE IF (.NOT.(TSTBIT(MSTATE(NCOL, NROW), TUNNEL) .EQ. 1)) GOTO 2080 IF (.NOT.(MOVE(CYCLE, 3) .EQ. 0)) GOTO 2100 NDIR = OLDDIR RETURN 2100 CONTINUE C C ELSE IF THIS IS A DECISION BIT, CALL DECIDE TO DETERMINE DIRECTION C TO GO. (ONLY DO THIS IF ON SAME ROW OR COLUMN, OR, FOR FIRST TWO C BOARDS, 50% OF THE TIME, OR FOR THE NEXT TWO BOARDS, 75% OF THE C TIME, OR FOR LATER BOARDS, 92% OF THE TIME). C GOTO 2090 2080 CONTINUE IF (.NOT.(TSTBIT(MSTATE(NCOL, NROW), DECISN) .EQ. 1)) GOTO 2120 IF (.NOT.(NCOL .EQ. COL.OR.NROW .EQ. ROW)) GOTO 2140 CALL DECIDE(NCOL, NROW, NDIR) GOTO 2150 2140 CONTINUE IF (.NOT.(BOARD .LT. 3.AND.MOVE(CYCLE, 3) .EQ. 0)) GOTO 2160 CALL DECIDE(NCOL, NROW, NDIR) GOTO 2150 2160 CONTINUE IF (.NOT.(BOARD .GT. 2.AND.BOARD .LT. 5.AND.MOVE(CYCLE, 6) .EQ. *1)) GOTO 2180 CALL DECIDE(NCOL, NROW, NDIR) GOTO 2150 2180 CONTINUE IF (.NOT.(BOARD .GT. 4.AND.MOVE(CYCLE, 5) .EQ. 1)) GOTO 2200 CALL DECIDE(NCOL, NROW, NDIR) 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(NCOL, NROW), NDIR) .EQ. 0)) GOTO 2220 CALL WALL(NCOL, NROW, NDIR) C C IF MOTION IS PROHIBITED THIS CYCLE, RESET OLD DIRECTION AND RETURN C 2220 CONTINUE IF (.NOT.(MOVE(CYCLE, NDIR) .EQ. 0.OR.MOVE(CYCLE, 7) .EQ. 0)) GOTO * 2240 NDIR = OLDDIR RETURN C C ALL READY TO MOVE C 2240 CONTINUE CCURSOR TO CURRENT LOCATION IF (.NOT.(TSTBIT(MSTATE(NCOL, NROW), DOT) .EQ. 1)) GOTO 2260 CALL UVT100(CPP, NROW, NCOL, DOTCHR) CREWRITE DOT GOTO 2270 2260 CONTINUE IF (.NOT.(TSTBIT(MSTATE(NCOL, NROW), EGZ) .EQ. 1)) GOTO 2280 CALL UVT100(CPP, NROW, NCOL, EGZCHR) CREWRITE ENERGIZER GOTO 2270 2280 CONTINUE IF (.NOT.(FRUIT .EQ. 1.AND.NCOL .EQ. FRUCOL.AND.NROW .EQ. FRUROW)) * GOTO 2300 CALL UVT100(CPP, NROW, NCOL, FRUCHR(BOARD)) CREWRITE FRUIT GOTO 2270 2300 CONTINUE CALL UVT100(CPP, NROW, NCOL, SPACE) CREWRITE SPACE 2270 CONTINUE IF (.NOT.(NDIR .EQ. LEFT)) GOTO 2320 NCOL = NCOL - 1 GOTO 2330 2320 CONTINUE IF (.NOT.(NDIR .EQ. UP)) GOTO 2340 NROW = NROW - 1 GOTO 2330 2340 CONTINUE IF (.NOT.(NDIR .EQ. RIGHT)) GOTO 2360 NCOL = NCOL + 1 GOTO 2330 2360 CONTINUE IF (.NOT.(NDIR .EQ. DOWN)) GOTO 2380 NROW = NROW + 1 2380 CONTINUE 2330 CONTINUE IF (.NOT.(NCOL .GT. CMAR)) GOTO 2400 NCOL = 1 GOTO 2410 2400 CONTINUE IF (.NOT.(NCOL .LT. 1)) GOTO 2420 NCOL = CMAR 2420 CONTINUE 2410 CONTINUE IF (.NOT.(NROW .GT. RMAR)) GOTO 2440 NROW = 1 GOTO 2450 2440 CONTINUE IF (.NOT.(NROW .LT. 1)) GOTO 2460 NROW = RMAR 2460 CONTINUE 2450 CONTINUE CALL UVT100(CPP, NROW, NCOL, NMAN(STATE)) CTEST FOR COLLISION CALL COLIDE RETURN END