SUBROUTINE INIT IMPLICIT INTEGER(A - Z) C C THIS SUBROUTINE INITIALIZES THE MSTATE TABLE BY EXAMINING THE C PACMAN MAZE (BOARD). THE MSTATE TABLE HAS THE SAME INDICES C AS THE MAZE, WITH THE FOLLOWING BIT ASSIGNMENTS FOR EACH BYTE C IN MSTATE: C BIT 1 - SET IF LEGAL TO MOVE UP C BIT 2 - SET IF LEGAL TO MOVE DOWN C BIT 4 - SET IF LEGAL TO MOVE LEFT C BIT 10 - SET IF LEGAL TO MOVE RIGHT C BIT 20 - SET IF DOT PRESENT C BIT 40 - SET IF ENERGIZER PRESENT C BIT 100 - SET IF TUNNEL LOCATION C BIT 200 - SET IF DECISION LOCATION 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 MAZE DRAWING CHARACTERS PARAMETER LRCOR="152, URCOR="153, ULCOR="154, LLCOR="155 PARAMETER CROSS="156, HORIZ="161, DOOR="162, TRIGHT="164 PARAMETER TLEFT="165, TUP="166, TDOWN="167, VERT="170 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) BYTE LN01(CMAR), LN02(CMAR), LN03(CMAR), LN04(CMAR), LN05(CMAR), L *N06(CMAR), LN07(CMAR), LN08(CMAR), LN09(CMAR), LN10(CMAR), LN11(CM *AR), LN12(CMAR), LN13(CMAR), LN14(CMAR), LN15(CMAR), LN16(CMAR), L *N17(CMAR), LN18(CMAR), LN19(CMAR), LN20(CMAR), LN21(CMAR), LN22(CM *AR), LN23(CMAR), LN24(CMAR) C COMMONS COMMON/MAZCOM/LN01, LN02, LN03, LN04, LN05, LN06, LN07, LN08, LN09 *, LN10, LN11, LN12, LN13, LN14, LN15, LN16, LN17, LN18, LN19, LN20 *, LN21, LN22, LN23, LN24 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 MAZE(CMAR, RMAR) EQUIVALENCE(MAZE, LN01) DOTCNT = 0 C C LOOP THROUGH EACH COLUMN AND ROW OF MAZE C DO 2000 C = 1, CMAR DO 2020 R = 1, RMAR IF (.NOT.(MAZE(C, R) .GE. LRCOR.AND.MAZE(C, R) .LE. VERT)) GOT *O 2040 CNO BITS TO SET IF THIS IS A 'WALL' MSTATE(C, R) = 0 GOTO 2050 2040 CONTINUE IF (.NOT.(MAZE(C, R) .EQ. TUNCHR)) GOTO 2060 CTHIS IS A TUNNEL LOCATION CSET TUNNEL BIT, AND SET CALL SETBIT(MSTATE(C, R), TUNNEL) IF (.NOT.(R .EQ. 1)) GOTO 2080 CDIRRECTIONAL BIT FOR C'WRAPAROUND' IF THIS IS CALL SETBIT(MSTATE(C, R), UP) GOTO 2090 2080 CONTINUE IF (.NOT.(R .EQ. RMAR)) GOTO 2100 CAT THE BORDER OF THE MAZE. CALL SETBIT(MSTATE(C, R), DOWN) 2100 CONTINUE 2090 CONTINUE IF (.NOT.(C .EQ. 1)) GOTO 2120 CALL SETBIT(MSTATE(C, R), LEFT) GOTO 2130 2120 CONTINUE IF (.NOT.(C .EQ. CMAR)) GOTO 2140 CALL SETBIT(MSTATE(C, R), RIGHT) 2140 CONTINUE 2130 CONTINUE 2060 CONTINUE IF (.NOT.(MAZE(C, R) .EQ. DOTCHR)) GOTO 2160 CTHIS IS A DOT POSITION CSET THE DOT BIT CALL SETBIT(MSTATE(C, R), DOT) CINCREMENT DOT COUNT DOTCNT = DOTCNT + 1 2160 CONTINUE IF (.NOT.(MAZE(C, R) .EQ. EGZCHR)) GOTO 2180 CTHIS IS AN ENERGIZER POSITION CSET THE DOT BIT CALL SETBIT(MSTATE(C, R), EGZ) CINCREMENT DOT COUNT DOTCNT = DOTCNT + 1 C C CHECK THE ADJACENT LOCATIONS IN MAZE AND C SET THE DIRECTIONAL BITS ACCORDINGLY C 2180 CONTINUE TMP = 0 IF (.NOT.(R+1 .GT. RMAR)) GOTO 2200 CALL SETBIT(MSTATE(C, R), DOWN) TMP = TMP + 1 GOTO 2210 2200 CONTINUE IF (.NOT.(MAZE(C, R+1) .LT. LRCOR.OR.MAZE(C, R+1) .GT. VERT) *) GOTO 2220 CALL SETBIT(MSTATE(C, R), DOWN) TMP = TMP + 1 2220 CONTINUE 2210 CONTINUE IF (.NOT.(R-1 .LT. 1)) GOTO 2240 CALL SETBIT(MSTATE(C, R), UP) TMP = TMP + 1 GOTO 2250 2240 CONTINUE IF (.NOT.(MAZE(C, R-1) .LT. LRCOR.OR.MAZE(C, R-1) .GT. VERT) *) GOTO 2260 CALL SETBIT(MSTATE(C, R), UP) TMP = TMP + 1 2260 CONTINUE 2250 CONTINUE IF (.NOT.(C+1 .GT. CMAR)) GOTO 2280 CALL SETBIT(MSTATE(C, R), RIGHT) TMP = TMP + 1 GOTO 2290 2280 CONTINUE IF (.NOT.(MAZE(C+1, R) .LT. LRCOR.OR.MAZE(C+1, R) .GT. VERT) *) GOTO 2300 CALL SETBIT(MSTATE(C, R), RIGHT) TMP = TMP + 1 2300 CONTINUE 2290 CONTINUE IF (.NOT.(C-1 .LT. 1)) GOTO 2320 CALL SETBIT(MSTATE(C, R), LEFT) TMP = TMP + 1 GOTO 2330 2320 CONTINUE IF (.NOT.(MAZE(C-1, R) .LT. LRCOR.OR.MAZE(C-1, R) .GT. VERT) *) GOTO 2340 CALL SETBIT(MSTATE(C, R), LEFT) TMP = TMP + 1 C C IF MORE THAN TWO DIRECTION BITS ARE SET, C THIS IS A 'DECISION' POINT. C 2340 CONTINUE 2330 CONTINUE IF (.NOT.(TMP .GT. 2)) GOTO 2360 CALL SETBIT(MSTATE(C, R), DECISN) 2360 CONTINUE 2050 CONTINUE 2020 CONTINUE 2000 CONTINUE END