SUBROUTINE INIT IMPLICIT INTEGER (A-Z) # # THIS SUBROUTINE INITIALIZES THE MSTATE TABLE BY EXAMINING THE # PACMAN MAZE (BOARD). THE MSTATE TABLE HAS THE SAME INDICES # AS THE MAZE, WITH THE FOLLOWING BIT ASSIGNMENTS FOR EACH BYTE # IN MSTATE: # BIT 1 - SET IF LEGAL TO MOVE UP # BIT 2 - SET IF LEGAL TO MOVE DOWN # BIT 4 - SET IF LEGAL TO MOVE LEFT # BIT 10 - SET IF LEGAL TO MOVE RIGHT # BIT 20 - SET IF DOT PRESENT # BIT 40 - SET IF ENERGIZER PRESENT # BIT 100 - SET IF TUNNEL LOCATION # BIT 200 - SET IF DECISION LOCATION # INCLUDE/NL SY:PACMAN.CMN BYTE MAZE(CMAR,RMAR) EQUIVALENCE (MAZE,LN01) DOTCNT = 0 # # LOOP THROUGH EACH COLUMN AND ROW OF MAZE # DO C = 1,CMAR [ DO R = 1,RMAR [ IF (MAZE(C,R) >= LRCOR .AND. MAZE(C,R) <= VERT) MSTATE(C,R) = 0 #NO BITS TO SET IF THIS IS A 'WALL' ELSE [ IF (MAZE(C,R) == TUNCHR) [ #THIS IS A TUNNEL LOCATION CALL SETBIT(MSTATE(C,R),TUNNEL) #SET TUNNEL BIT, AND SET IF (R == 1) #DIRRECTIONAL BIT FOR CALL SETBIT(MSTATE(C,R),UP) #'WRAPAROUND' IF THIS IS ELSE IF (R == RMAR) #AT THE BORDER OF THE MAZE. CALL SETBIT(MSTATE(C,R),DOWN) IF (C == 1) CALL SETBIT(MSTATE(C,R),LEFT) ELSE IF (C == CMAR) CALL SETBIT(MSTATE(C,R),RIGHT) ] IF (MAZE(C,R) == DOTCHR) [ #THIS IS A DOT POSITION CALL SETBIT(MSTATE(C,R),DOT) #SET THE DOT BIT DOTCNT = DOTCNT + 1 #INCREMENT DOT COUNT ] IF (MAZE(C,R) == EGZCHR) [ #THIS IS AN ENERGIZER POSITION CALL SETBIT(MSTATE(C,R),EGZ) #SET THE DOT BIT DOTCNT = DOTCNT + 1 #INCREMENT DOT COUNT ] # # CHECK THE ADJACENT LOCATIONS IN MAZE AND # SET THE DIRECTIONAL BITS ACCORDINGLY # TMP = 0 IF (R+1 > RMAR) [ CALL SETBIT(MSTATE(C,R),DOWN) TMP = TMP + 1 ] ELSE IF (MAZE(C,R+1) < LRCOR .OR. MAZE(C,R+1) > VERT) [ CALL SETBIT(MSTATE(C,R),DOWN) TMP = TMP + 1 ] IF (R-1 < 1) [ CALL SETBIT(MSTATE(C,R),UP) TMP = TMP + 1 ] ELSE IF (MAZE(C,R-1) < LRCOR .OR. MAZE(C,R-1) > VERT) [ CALL SETBIT(MSTATE(C,R),UP) TMP = TMP + 1 ] IF (C+1 > CMAR) [ CALL SETBIT(MSTATE(C,R),RIGHT) TMP = TMP + 1 ] ELSE IF (MAZE(C+1,R) < LRCOR .OR. MAZE(C+1,R) > VERT) [ CALL SETBIT(MSTATE(C,R),RIGHT) TMP = TMP + 1 ] IF (C-1 < 1) [ CALL SETBIT(MSTATE(C,R),LEFT) TMP = TMP + 1 ] ELSE IF (MAZE(C-1,R) < LRCOR .OR. MAZE(C-1,R) > VERT) [ CALL SETBIT(MSTATE(C,R),LEFT) TMP = TMP + 1 ] # # IF MORE THAN TWO DIRECTION BITS ARE SET, # THIS IS A 'DECISION' POINT. # IF (TMP > 2) CALL SETBIT(MSTATE(C,R),DECISN) ] ] ] END