SUBROUTINE CURLY IMPLICIT INTEGER (A-Z) # # THIS SUBROUTINE CONTROLS THE MOTION OF CURLY. # CURLY MOVES AT 83% OF TOP SPEED. HE FOLLOWS PACMAN CLOSELY # MAKING A DECISION TO CHANGE DIRECTION AT EVERY OPPORTUNITY, # AND ALWAYS FOLLOWING PACMAN THROUGH AN INTERSECTION WHEN PACMAN # JUST PRECEDED HIM THROUGH IT. (PACMAN CANNOT 'SHAKE' HIM EASILY) # INCLUDE/NL SY:UVT100.DAT INCLUDE/NL SY:PACMAN.CMN # # TEST IF WE ARE IN PRISON # OLDDIR = CDIR IF (CPRISN == 1) [ #IF IN PRISON... IF (STATE != BAD) #DONT ESCAPE IF PACMAN IS RETURN #EATING MONSTERS IF (CTIM+PRITIM <= TIMER) [ #IF TIME TO GET OUT, CALL UVT100(CUP,CPRISR,CPRISC) #ERASE US FROM IN PRISON CALL GETADR(PRL,SPACE) CALL WTQIO(IOWVB,5,2,,,PRL) CROW = RDOOR CCOL = CDOOR CALL UVT100(CUP,CROW,CCOL) #MOVE HIM TO PRISON DOOR CALL GETADR(PRL,CMAN(STATE)) CALL WTQIO(IOWVB,5,2,,,PRL) CPRISN = 0 #NO LONGER IN PRISON CDIR = HALT #NO MOTION YET ] ELSE #NOT YET TIME TO GET OUT RETURN ] # # IF PACMAN IS IN AN EATING MOOD (STATE IS 'GOOD' OR 'BLINK'), # ALL MONSTERS MOVE AT 67% OF TOP SPEED. TEST FOR THIS CONDITION. # IF (STATE != BAD .AND. MOVE(CYCLE,9) == 0) [ CDIR = OLDDIR RETURN ] # # IF THIS IS A TUNNEL LOCATION, TEST IF MOTION ALLOWED THIS CYCLE # IF (TSTBIT(MSTATE(CCOL,CROW),TUNNEL) == 1) [ IF (MOVE(CYCLE,3) == 0) [ CDIR = OLDDIR RETURN ] ] # # ELSE IF THIS IS LAST INTERSECTION PACMAN TRAVERSED, FOLLOW HIM # ELSE IF (CCOL == PACDSC .AND. CROW == PACDSR) CDIR = PACDSD # # ELSE IF THIS IS A DECISION BIT, CALL # DECIDE TO DETERMINE DIRECTION TO GO. # ELSE IF (TSTBIT(MSTATE(CCOL,CROW),DECISN) == 1) CALL DECIDE(CCOL,CROW,CDIR) # # IF WE HAVE RUN INTO A WALL, FIND A NEW DIRECTION # IF (TSTBIT(MSTATE(CCOL,CROW),CDIR) == 0) CALL WALL(CCOL,CROW,CDIR) # # IF MOTION IS PROHIBITED THIS CYCLE, RESET OLD DIRECTION AND RETURN # IF (MOVE(CYCLE,CDIR) == 0 .OR. MOVE(CYCLE,7) == 0) [ CDIR = OLDDIR RETURN ] # # ALL READY TO MOVE # CALL UVT100(CUP,CROW,CCOL) #CURSOR TO CURRENT LOCATION IF (TSTBIT(MSTATE(CCOL,CROW),DOT) == 1) [ CALL GETADR(PRL,DOTCHR) CALL WTQIO(IOWVB,5,2,,,PRL) #REWRITE DOT ] ELSE IF (TSTBIT(MSTATE(CCOL,CROW),EGZ) == 1) [ CALL GETADR(PRL,EGZCHR) CALL WTQIO(IOWVB,5,2,,,PRL) #REWRITE ENERGIZER ] ELSE IF (FRUIT == 1 .AND. CCOL == FRUCOL .AND. CROW == FRUROW) [ CALL GETADR(PRL,FRUCHR(BOARD)) CALL WTQIO(IOWVB,5,2,,,PRL) #REWRITE FRUIT ] ELSE [ CALL GETADR(PRL,SPACE) CALL WTQIO(IOWVB,5,2,,,PRL) #REWRITE SPACE ] IF (CDIR == LEFT) CCOL = CCOL - 1 ELSE IF (CDIR == UP) CROW = CROW -1 ELSE IF (CDIR == RIGHT) CCOL = CCOL + 1 ELSE IF (CDIR == DOWN) CROW = CROW + 1 IF (CCOL > CMAR) CCOL = 1 ELSE IF (CCOL < 1) CCOL = CMAR IF (CROW > RMAR) CROW = 1 ELSE IF (CROW < 1) CROW = RMAR CALL UVT100(CUP,CROW,CCOL) CALL GETADR(PRL,CMAN(STATE)) CALL WTQIO(IOWVB,5,2,,,PRL) CALL COLIDE #TEST FOR COLLISION RETURN END