SUBROUTINE DECIDE(DECCOL,DECROW,DECDIR) IMPLICIT INTEGER (A-Z) # # THIS SUBROUTINE DECIDES WHICH DIRECTION TO MOVE A MONSTER. # IT IS CALLED ONLY WHEN THE MONSTER IS AT A DECISION POINT, # THAT IS IT HAS MORE THAN ONE DIRECTION TO GO NOT COUNTING # THE DIRECTION IT CAME FROM. IT ASSIGNS AN ORDER OF PRECEDENCE # TO THE FOUR POSSIBLE DIRECTIONS OF MOTION. THE DIRECTION IT CAME # FROM IS ALWAYS ASSIGNED THE LOWEST PRECEDENCE, WHICH EFFECTIVELY # ELIMINATES IT AS THERE IS ALWAYS AT LEAST ONE OTHER DIRECTION # AVAILABLE. ONCE IT HAS ASSIGNED THE PREFERENCES, IT CHOOSES THE # FIRST ONE THAT IS LEGAL AT ITS CURRENT POSITION AND RETURNS. # # IT ASSIGNS THE ORDER OF PREFERENCE AS FOLLOWS: # IT ASSIGNS (UP VS. DOWN) AND (LEFT VS. RIGHT) PRECEDENCE # BASED ON WHICH DIRECTION MOVES IT TOWARDS PACMAN. # IN ASSIGNING PRECEDENCE TO (HORIZONTAL VS. VERTICAL) IT # ESSENTIALLY TRIES TO 'SQUARE OFF' THE DISTANCE BETWEEN ITSELF # AND PACMAN, THAT IS, IF PACMAN IS FARTHER AWAY IN THE VERTICAL # DIRECTION IT WILL GIVE PRECEDENCE TO (UP/DOWN), ELSE IT GIVES # PRECEDENCE TO (LEFT/RIGHT). # INCLUDE/NL SY:PACMAN.CMN BYTE PREF(4,8),HTAB(2,2),VTAB(2,2),OPPSIT(0:8) DATA PREF / LEFT,UP,DOWN,RIGHT, #PREF IS AN ORDER OF LEFT,DOWN,UP,RIGHT, #PRECEDENCE TABLE RIGHT,UP,DOWN,LEFT, RIGHT,DOWN,UP,LEFT, UP,LEFT,RIGHT,DOWN, DOWN,LEFT,RIGHT,UP, UP,RIGHT,LEFT,DOWN, DOWN,RIGHT,LEFT,UP / DATA HTAB / 1,2,3,4 / #HTAB AND VTAB ARE USED DATA VTAB / 5,6,7,8 / #TO INDEX PREF OPPSIT(LEFT) = RIGHT OPPSIT(RIGHT) = LEFT OPPSIT(UP) = DOWN OPPSIT(DOWN) = UP # # CALCULATE HORIZONTAL AND VERTICAL DISTANCES TO PACMAN. # USE THEM TO DETERMINE HORIZONTAL VERSUS VERTICAL PREFERENCES # AND LEFT VERSUS RIGHT AND UP VERSUS DOWN PREFERENCES. # LVERSR = 2 #RIGHT OVER LEFT PREFERENCE HDIST = COL - DECCOL IF (HDIST < 0) [ #PACMAN IS TO OUR LEFT HDIST = -HDIST LVERSR = 1 #LEFT OVER RIGHT PRECEDENCE ] UVERSD = 2 #DOWN OVER UP PREFERENCE VDIST = ROW - DECROW IF (VDIST < 0) [ #PACMAN IS BELOW US VDIST = -VDIST UVERSD = 1 #UP OVER DOWN PREFERENCE ] VDIST = VDIST * 2 #MAKE DISTANCES EQUIVALENT # # USE THE ABOVE PREFERENCES TO INDEX PREFERENCE TABLE. CHOOSE THE # FIRST DIRECTION IN PREF THAT IS LEGAL, EXCEPT IGNORE THE # DIRECTION OPPOSITE TO OUR CURRENT DIRECTION. # IF (VDIST > HDIST) #VERTICAL PREFERENCE PREFXX = VTAB(UVERSD,LVERSR) ELSE #HORIZONTAL PREFERENCE PREFXX = HTAB(UVERSD,LVERSR) IF (STATE == BAD) [ #MONSTERS ARE CHASING... DO I = 1,4 [ IF (PREF(I,PREFXX) == OPPSIT(DECDIR)) NEXT #CAN'T SELECT OPPOSITE DIR. IF (TSTBIT(MSTATE(DECCOL,DECROW),PREF(I,PREFXX)) == 1) [ DECDIR = PREF(I,PREFXX) #THIS DIRECTION IS LEGAL BREAK #SELECT IT AND RETURN ] ] ] ELSE [ #MONSTERS ARE BEING CHASED... DO I = 4,1,-1 [ #USE REVERSE PREFERENCE IF (PREF(I,PREFXX) == OPPSIT(DECDIR)) NEXT IF (TSTBIT(MSTATE(DECCOL,DECROW),PREF(I,PREFXX)) == 1) [ DECDIR = PREF(I,PREFXX) BREAK ] ] ] RETURN END