SUBROUTINE FLUFFY IMPLICIT INTEGER (A-Z) # # THIS SUBROUTINE CONTROLS THE MOTION OF FLUFFY # INCLUDE/NL SY:UVT100.DAT INCLUDE/NL SY:PACMAN.CMN # # TEST IF WE ARE IN PRISON # OLDDIR = FDIR IF (FPRISN == 1) [ #IF IN PRISON... IF (STATE != BAD) #DONT ESCAPE IF PACMAN IS RETURN #EATING MONSTERS IF (FTIM+PRITIM <= TIMER) [ #IF TIME TO GET OUT, CALL UVT100(CUP,FPRISR,FPRISC) #ERASE US FROM IN PRISON CALL GETADR(PRL,SPACE) CALL WTQIO(IOWVB,5,2,,,PRL) FROW = RDOOR FCOL = CDOOR CALL UVT100(CUP,FROW,FCOL) #MOVE HIM TO PRISON DOOR CALL GETADR(PRL,FMAN(STATE)) CALL WTQIO(IOWVB,5,2,,,PRL) FPRISN = 0 #NO LONGER IN PRISON FDIR = 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) [ FDIR = OLDDIR RETURN ] # # IF THIS IS A TUNNEL LOCATION, TEST IF MOTION ALLOWED THIS CYCLE # IF (TSTBIT(MSTATE(FCOL,FROW),TUNNEL) == 1) [ IF (MOVE(CYCLE,3) == 0) [ FDIR = OLDDIR RETURN ] ] # # ELSE IF THIS IS A DECISION BIT, CALL DECIDE TO DETERMINE DIRECTION # TO GO. (ONLY DO THIS 50% OF THE TIME OR WHEN ON SAME ROW OR COLUMN) # ELSE IF (TSTBIT(MSTATE(FCOL,FROW),DECISN) == 1) [ IF (MOVE(CYCLE,3) == 1 .OR. FCOL == COL .OR. FROW == ROW) CALL DECIDE(FCOL,FROW,FDIR) ] # # IF WE HAVE RUN INTO A WALL, FIND A NEW DIRECTION # IF (TSTBIT(MSTATE(FCOL,FROW),FDIR) == 0) CALL WALL(FCOL,FROW,FDIR) # # IF MOTION IS PROHIBITED THIS CYCLE, RESET OLD DIRECTION AND RETURN # IF (MOVE(CYCLE,FDIR) == 0 .OR. MOVE(CYCLE,7) == 0) [ FDIR = OLDDIR RETURN ] # # ALL READY TO MOVE # CALL UVT100(CUP,FROW,FCOL) #CURSOR TO CURRENT LOCATION IF (TSTBIT(MSTATE(FCOL,FROW),DOT) == 1) [ CALL GETADR(PRL,DOTCHR) CALL WTQIO(IOWVB,5,2,,,PRL) #REWRITE DOT ] ELSE IF (TSTBIT(MSTATE(FCOL,FROW),EGZ) == 1) [ CALL GETADR(PRL,EGZCHR) CALL WTQIO(IOWVB,5,2,,,PRL) #REWRITE ENERGIZER ] ELSE IF (FRUIT == 1 .AND. FCOL == FRUCOL .AND. FROW == 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 (FDIR == LEFT) FCOL = FCOL - 1 ELSE IF (FDIR == UP) FROW = FROW -1 ELSE IF (FDIR == RIGHT) FCOL = FCOL + 1 ELSE IF (FDIR == DOWN) FROW = FROW + 1 IF (FCOL > CMAR) FCOL = 1 ELSE IF (FCOL < 1) FCOL = CMAR IF (FROW > RMAR) FROW = 1 ELSE IF (FROW < 1) FROW = RMAR CALL UVT100(CUP,FROW,FCOL) CALL GETADR(PRL,FMAN(STATE)) CALL WTQIO(IOWVB,5,2,,,PRL) CALL COLIDE #TEST FOR COLLISION RETURN END