SUBROUTINE LEFTY IMPLICIT INTEGER(A - Z) C C THIS SUBROUTINE CONTROLS THE MOTION OF LEFTY. LEFTY MOVES C AT 92% OF TOP SPEED, BUT DOES NOT FOLLOW PACMAN VERY WELL. C ON EARLY BOARDS, HE ONLY CHANGES DIRECTION WHEN HE 'SEES' PACMAN. 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 OLDDIR = LDIR IF (.NOT.(LPRISN .EQ. 1)) GOTO 2000 CIF IN PRISON... IF (.NOT.(STATE .NE. BAD)) GOTO 2020 CDONT ESCAPE WHILE PACMAN CIS EATING RETURN 2020 CONTINUE IF (.NOT.(LTIM+PRITIM .LE. TIMER)) GOTO 2040 CIF TIME TO GET OUT, CERASE LEFTY FROM PRISON CALL UVT100(CPP, LPRISR, LPRISC, SPACE) LROW = RDOOR LCOL = CDOOR CMOVE HIM TO PRISON DOOR CALL UVT100(CPP, LROW, LCOL, LMAN(STATE)) CNO LONGER IN PRISON LPRISN = 0 CNO MOTION YET LDIR = HALT CNOT YET TIME TO GET OUT GOTO 2050 2040 CONTINUE RETURN 2050 CONTINUE C C IF PACMAN IS IN 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 LDIR = OLDDIR RETURN C C IF THIS IS A TUNNEL LOCATION, TEST IF MOTION ALLOWED THIS CYCLE C 2060 CONTINUE IF (.NOT.(TSTBIT(MSTATE(LCOL, LROW), TUNNEL) .EQ. 1)) GOTO 2080 IF (.NOT.(MOVE(CYCLE, 3) .EQ. 0)) GOTO 2100 LDIR = OLDDIR RETURN 2100 CONTINUE C C ELSE IF THIS IS A DECISION BIT, AND THE PACMAN IS ON THE SAME ROW C OR COLUMN AS WE ARE, CALL DECIDE TO SEE IF WE CHANGE DIRECTION. C (AFTER THE SECOND BOARD ALSO CALL DECIDE 50% OF THE TIME, AND C AFTER THE FOURTH BOARD, CALL DECIDE 67% OF THE TIME). C GOTO 2090 2080 CONTINUE IF (.NOT.(TSTBIT(MSTATE(LCOL, LROW), DECISN) .EQ. 1)) GOTO 2120 IF (.NOT.(LROW .EQ. ROW.OR.LCOL .EQ. COL)) GOTO 2140 CALL DECIDE(LCOL, LROW, LDIR) GOTO 2150 2140 CONTINUE IF (.NOT.(BOARD .GT. 2.AND.BOARD .LT. 5.AND.MOVE(CYCLE, 3) .EQ. *1)) GOTO 2160 CALL DECIDE(LCOL, LROW, LDIR) GOTO 2150 2160 CONTINUE IF (.NOT.(BOARD .GT. 4.AND.MOVE(CYCLE, 9) .EQ. 1)) GOTO 2180 CALL DECIDE(LCOL, LROW, LDIR) 2180 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(LCOL, LROW), LDIR) .EQ. 0)) GOTO 2200 CALL WALL(LCOL, LROW, LDIR) C C IF MOTION IS PROHIBITED THIS CYCLE, RESET OLD DIRECTION AND RETURN C 2200 CONTINUE IF (.NOT.(MOVE(CYCLE, LDIR) .EQ. 0.OR.MOVE(CYCLE, 5) .EQ. 0)) GOTO * 2220 LDIR = OLDDIR RETURN C C ALL READY TO MOVE C 2220 CONTINUE CCURSOR TO CURRENT LOCATION IF (.NOT.(TSTBIT(MSTATE(LCOL, LROW), DOT) .EQ. 1)) GOTO 2240 CALL UVT100(CPP, LROW, LCOL, DOTCHR) CREWRITE DOT GOTO 2250 2240 CONTINUE IF (.NOT.(TSTBIT(MSTATE(LCOL, LROW), EGZ) .EQ. 1)) GOTO 2260 CALL UVT100(CPP, LROW, LCOL, EGZCHR) CREWRITE ENERGIZER GOTO 2250 2260 CONTINUE IF (.NOT.(FRUIT .EQ. 1.AND.LCOL .EQ. FRUCOL.AND.LROW .EQ. FRUROW)) * GOTO 2280 CALL UVT100(CPP, LROW, LCOL, FRUCHR(BOARD)) CREWRITE FRUIT GOTO 2250 2280 CONTINUE CALL UVT100(CPP, LROW, LCOL, SPACE) CREWRITE SPACE 2250 CONTINUE IF (.NOT.(LDIR .EQ. LEFT)) GOTO 2300 LCOL = LCOL - 1 GOTO 2310 2300 CONTINUE IF (.NOT.(LDIR .EQ. UP)) GOTO 2320 LROW = LROW - 1 GOTO 2310 2320 CONTINUE IF (.NOT.(LDIR .EQ. RIGHT)) GOTO 2340 LCOL = LCOL + 1 GOTO 2310 2340 CONTINUE IF (.NOT.(LDIR .EQ. DOWN)) GOTO 2360 LROW = LROW + 1 2360 CONTINUE 2310 CONTINUE IF (.NOT.(LCOL .GT. CMAR)) GOTO 2380 LCOL = 1 GOTO 2390 2380 CONTINUE IF (.NOT.(LCOL .LT. 1)) GOTO 2400 LCOL = CMAR 2400 CONTINUE 2390 CONTINUE IF (.NOT.(LROW .GT. RMAR)) GOTO 2420 LROW = 1 GOTO 2430 2420 CONTINUE IF (.NOT.(LROW .LT. 1)) GOTO 2440 LROW = RMAR 2440 CONTINUE 2430 CONTINUE CALL UVT100(CPP, LROW, LCOL, LMAN(STATE)) CTEST FOR COLLISION CALL COLIDE RETURN END