SUBROUTINE DECIDE(DECCOL, DECROW, DECDIR) IMPLICIT INTEGER(A - Z) C C THIS SUBROUTINE DECIDES WHICH DIRECTION TO MOVE A MONSTER. IT IS C CALLED ONLY WHEN THE MONSTER IS AT A DECISION POINT, THAT IS IT C HAS MORE THAN ONE DIRECTION TO GO NOT COUNTING THE DIRECTION IT C CAME FROM. IT ASSIGNS AN ORDER OF PRECEDENCE TO THE FOUR POSSIBLE C DIRECTIONS OF MOTION. THE DIRECTION IT CAME FROM IS NOT A LEGAL C DIRECTION ON THE FIRST TWO BOARDS, AND CAN ONLY BE SELECTED HALF THE C TIME ON THE THIRD AND FOURTH BOARDS. AFTER THAT, IT IS ALWAYS A C LEGAL DIRECTION. ONCE IT HAS ASSIGNED THE PREFERENCES, IT CHOOSES C THE FIRST ONE THAT IS LEGAL AT ITS CURRENT POSITION AND RETURNS. C C IT ASSIGNS THE ORDER OF PREFERENCE AS FOLLOWS: C IT ASSIGNS (UP VS. DOWN) AND (LEFT VS. RIGHT) PRECEDENCE C BASED ON WHICH DIRECTION MOVES IT TOWARDS PACMAN. C IN ASSIGNING PRECEDENCE TO (HORIZONTAL VS. VERTICAL) IT C ESSENTIALLY TRIES TO 'SQUARE OFF' THE DISTANCE BETWEEN ITSELF C AND PACMAN, THAT IS, IF PACMAN IS FARTHER AWAY IN THE VERTICAL C DIRECTION IT WILL GIVE PRECEDENCE TO (UP/DOWN), ELSE IT GIVES C PRECEDENCE TO (LEFT/RIGHT). C 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 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/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 BYTE PREF(4, 8), HTAB(2, 2), VTAB(2, 2), OPPSIT(0:8) DATA DCYCLE/0/ CPREF IS AN ORDER OF CPRECEDENCE TABLE DATA PREF/LEFT, UP, DOWN, RIGHT, LEFT, DOWN, UP, RIGHT, RIGHT, UP, * DOWN, LEFT, RIGHT, DOWN, UP, LEFT, UP, LEFT, RIGHT, DOWN, DOWN, L *EFT, RIGHT, UP, UP, RIGHT, LEFT, DOWN, DOWN, RIGHT, LEFT, UP/ CHTAB AND VTAB ARE USED DATA HTAB/1, 2, 3, 4/ CTO INDEX PREF DATA VTAB/5, 6, 7, 8/ DCYCLE = DCYCLE + 1 IF (.NOT.(DCYCLE .GT. 4)) GOTO 2000 CKEEP TRACK OF FOUR CYCLES DCYCLE = 1 2000 CONTINUE OPPSIT(LEFT) = RIGHT OPPSIT(RIGHT) = LEFT OPPSIT(UP) = DOWN OPPSIT(DOWN) = UP C C CALCULATE HORIZONTAL AND VERTICAL DISTANCES TO PACMAN. C USE THEM TO DETERMINE HORIZONTAL VERSUS VERTICAL PREFERENCES C AND LEFT VERSUS RIGHT AND UP VERSUS DOWN PREFERENCES. C CRIGHT OVER LEFT PREFERENCE LVERSR = 2 HDIST = COL - DECCOL IF (.NOT.(HDIST .LT. 0)) GOTO 2020 CPACMAN IS TO OUR LEFT HDIST = - HDIST CLEFT OVER RIGHT PRECEDENCE LVERSR = 1 2020 CONTINUE CDOWN OVER UP PREFERENCE UVERSD = 2 VDIST = ROW - DECROW IF (.NOT.(VDIST .LT. 0)) GOTO 2040 CPACMAN IS BELOW US VDIST = - VDIST CUP OVER DOWN PREFERENCE UVERSD = 1 2040 CONTINUE CMAKE DISTANCES EQUIVALENT VDIST = VDIST*2 C C USE THE ABOVE PREFERENCES TO INDEX PREFERENCE TABLE. CHOOSE THE C FIRST DIRECTION IN PREF THAT IS LEGAL, EXCEPT IGNORE THE DIRECTION C OPPOSITE TO OUR CURRENT DIRECTION UNDER CERTAIN CIRCUMSTANCES. C IF (.NOT.(VDIST .GT. HDIST)) GOTO 2060 CVERTICAL PREFERENCE... IF (.NOT.(DCYCLE .GT. 1.OR.DECCOL .EQ. COL.OR.DECROW .EQ. ROW)) *GOTO 2080 PREFXX = VTAB(UVERSD, LVERSR) C (EXCEPT HORIZ. 25% OF TIME) GOTO 2090 2080 CONTINUE PREFXX = HTAB(UVERSD, LVERSR) 2090 CONTINUE GOTO 2070 2060 CONTINUE CHORIZONTAL PREFERENCE... IF (.NOT.(DCYCLE .GT. 1.OR.DECCOL .EQ. COL.OR.DECROW .EQ. ROW)) *GOTO 2100 PREFXX = HTAB(UVERSD, LVERSR) C (EXCEPT VERT. 25% OF TIME) GOTO 2110 2100 CONTINUE PREFXX = VTAB(UVERSD, LVERSR) 2110 CONTINUE 2070 CONTINUE IF (.NOT.(STATE .EQ. BAD)) GOTO 2120 CMONSTERS ARE CHASING... DO 2140 I = 1, 4 IF (.NOT.(PREF(I, PREFXX) .EQ. OPPSIT(DECDIR))) GOTO 2160 IF (.NOT.(BOARD .LT. 3)) GOTO 2180 CPREVENT OPPOSITE DIRECTION CON FIRST TWO BOARDS GOTO 2140 2180 CONTINUE IF (.NOT.(BOARD .LT. 5.AND.DCYCLE .GT. 1)) GOTO 2200 CQUARTER OF TIME ON NEXT TWO GOTO 2140 2200 CONTINUE IF (.NOT.(DCYCLE .GT. 2)) GOTO 2220 CHALF TIME ON ALL OTHERS GOTO 2140 2220 CONTINUE 2190 CONTINUE 2160 CONTINUE IF (.NOT.(TSTBIT(MSTATE(DECCOL, DECROW), PREF(I, PREFXX)) .EQ. * 1)) GOTO 2240 CTHIS DIRECTION IS LEGAL DECDIR = PREF(I, PREFXX) CSELECT IT AND RETURN GOTO 2150 2240 CONTINUE 2140 CONTINUE 2150 CONTINUE GOTO 2130 2120 CONTINUE CMONSTERS ARE BEING CHASED... DO 2260 I = 4, 1, - 1 CUSE REVERSE PREFERENCE IF (.NOT.(PREF(I, PREFXX) .EQ. OPPSIT(DECDIR))) GOTO 2280 IF (.NOT.(BOARD .LT. 3)) GOTO 2300 CPREVENT OPPOSITE DIRECTION CON FIRST TWO BOARDS GOTO 2260 2300 CONTINUE IF (.NOT.(BOARD .LT. 5.AND.DCYCLE .GT. 1)) GOTO 2320 CQUARTER OF TIME ON NEXT TWO GOTO 2260 2320 CONTINUE IF (.NOT.(DCYCLE .GT. 2)) GOTO 2340 CHALF TIME ON ALL OTHERS GOTO 2260 2340 CONTINUE 2310 CONTINUE 2280 CONTINUE IF (.NOT.(TSTBIT(MSTATE(DECCOL, DECROW), PREF(I, PREFXX)) .EQ. * 1)) GOTO 2360 DECDIR = PREF(I, PREFXX) GOTO 2270 2360 CONTINUE 2260 CONTINUE 2270 CONTINUE 2130 CONTINUE RETURN END