SUBROUTINE NELLIE IMPLICIT INTEGER (A-Z) # # THIS SUBROUTINE CONTROLS THE MOTION OF NELLIE. # NELLIE MOVES AT 83% OF TOP SPEED, AND MAKES DIRECTION-CHANGING # DECISIONS AT DECISION POINTS APPROXIMATELY HALF THE TIME. # INCLUDE/NL SY:UVT100.DAT INCLUDE/NL SY:PACMAN.CMN # # TEST IF WE ARE IN PRISON # OLDDIR = NDIR IF (NPRISN == 1) [ #IF IN PRISON... IF (STATE != BAD) #DONT ESCAPE IF PACMAN IS RETURN #EATING MONSTERS IF (NTIM+PRITIM <= TIMER) [ #IF TIME TO GET OUT, CALL UVT100(CUP,NPRISR,NPRISC) #ERASE US FROM IN PRISON CALL GETADR(PRL,SPACE) CALL WTQIO(IOWVB,5,2,,,PRL) NROW = RDOOR NCOL = CDOOR CALL UVT100(CUP,NROW,NCOL) #MOVE HIM TO PRISON DOOR CALL GETADR(PRL,NMAN(STATE)) CALL WTQIO(IOWVB,5,2,,,PRL) NPRISN = 0 #NO LONGER IN PRISON NDIR = 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) [ NDIR = OLDDIR RETURN ] # # IF THIS IS A TUNNEL LOCATION, TEST IF MOTION ALLOWED THIS CYCLE # IF (TSTBIT(MSTATE(NCOL,NROW),TUNNEL) == 1) [ IF (MOVE(CYCLE,3) == 0) [ NDIR = OLDDIR RETURN ] ] # # ELSE IF THIS IS A DECISION BIT, CALL DECIDE TO DETERMINE DIRECTION # TO GO. (ONLY DO THIS IF ON SAME ROW OR COLUMN, OR, FOR FIRST TWO # BOARDS, 50% OF THE TIME, OR FOR THE NEXT TWO BOARDS, 75% OF THE # TIME, OR FOR LATER BOARDS, 92% OF THE TIME). # ELSE IF (TSTBIT(MSTATE(NCOL,NROW),DECISN) == 1) [ IF (NCOL == COL .OR. NROW == ROW) CALL DECIDE(NCOL,NROW,NDIR) ELSE IF (BOARD < 3 .AND. MOVE(CYCLE,3) == 0) CALL DECIDE(NCOL,NROW,NDIR) ELSE IF (BOARD > 2 .AND. BOARD < 5 .AND. MOVE(CYCLE,6) == 1) CALL DECIDE(NCOL,NROW,NDIR) ELSE IF (BOARD > 4 .AND. MOVE(CYCLE,5) == 1) CALL DECIDE(NCOL,NROW,NDIR) ] # # IF WE HAVE RUN INTO A WALL, FIND A NEW DIRECTION # IF (TSTBIT(MSTATE(NCOL,NROW),NDIR) == 0) CALL WALL(NCOL,NROW,NDIR) # # IF MOTION IS PROHIBITED THIS CYCLE, RESET OLD DIRECTION AND RETURN # IF (MOVE(CYCLE,NDIR) == 0 .OR. MOVE(CYCLE,7) == 0) [ NDIR = OLDDIR RETURN ] # # ALL READY TO MOVE # CALL UVT100(CUP,NROW,NCOL) #CURSOR TO CURRENT LOCATION IF (TSTBIT(MSTATE(NCOL,NROW),DOT) == 1) [ CALL GETADR(PRL,DOTCHR) CALL WTQIO(IOWVB,5,2,,,PRL) #REWRITE DOT ] ELSE IF (TSTBIT(MSTATE(NCOL,NROW),EGZ) == 1) [ CALL GETADR(PRL,EGZCHR) CALL WTQIO(IOWVB,5,2,,,PRL) #REWRITE ENERGIZER ] ELSE IF (FRUIT == 1 .AND. NCOL == FRUCOL .AND. NROW == 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 (NDIR == LEFT) NCOL = NCOL - 1 ELSE IF (NDIR == UP) NROW = NROW -1 ELSE IF (NDIR == RIGHT) NCOL = NCOL + 1 ELSE IF (NDIR == DOWN) NROW = NROW + 1 IF (NCOL > CMAR) NCOL = 1 ELSE IF (NCOL < 1) NCOL = CMAR IF (NROW > RMAR) NROW = 1 ELSE IF (NROW < 1) NROW = RMAR CALL UVT100(CUP,NROW,NCOL) CALL GETADR(PRL,NMAN(STATE)) CALL WTQIO(IOWVB,5,2,,,PRL) CALL COLIDE #TEST FOR COLLISION RETURN END