SUBROUTINE LEFTY IMPLICIT INTEGER (A-Z) # # THIS SUBROUTINE CONTROLS THE MOTION OF LEFTY # INCLUDE/NL SY:UVT100.DAT INCLUDE/NL SY:PACMAN.CMN OLDDIR = LDIR IF (LPRISN == 1) [ #IF IN PRISON... IF (STATE != BAD) #DONT ESCAPE WHILE PACMAN RETURN #IS EATING IF (LTIM+PRITIM <= TIMER) [ #IF TIME TO GET OUT, CALL UVT100(CUP,LPRISR,LPRISC) #ERASE LEFTY FROM PRISON CALL GETADR(PRL,SPACE) CALL WTQIO(IOWVB,5,2,,,PRL) LROW = RDOOR LCOL = CDOOR CALL UVT100(CUP,LROW,LCOL) #MOVE HIM TO PRISON DOOR CALL GETADR(PRL,LMAN(STATE)) CALL WTQIO(IOWVB,5,2,,,PRL) LPRISN = 0 #NO LONGER IN PRISON LDIR = HALT #NO MOTION YET ] ELSE #NOT YET TIME TO GET OUT RETURN ] # # IF PACMAN IS IN 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) [ LDIR = OLDDIR RETURN ] # # IF THIS IS A TUNNEL LOCATION, TEST IF MOTION ALLOWED THIS CYCLE # IF (TSTBIT(MSTATE(LCOL,LROW),TUNNEL) == 1) [ IF (MOVE(CYCLE,3) == 0) [ LDIR = OLDDIR RETURN ] ] # # ELSE IF THIS IS A DECISION BIT, AND THE PACMAN IS ON THE SAME ROW # OR COLUMN AS WE ARE, CALL DECIDE TO SEE IF WE CHANGE DIRECTION. # ELSE IF (TSTBIT(MSTATE(LCOL,LROW),DECISN) == 1) [ IF (LROW == ROW .OR. LCOL == COL) CALL DECIDE(LCOL,LROW,LDIR) ] # # IF WE HAVE RUN INTO A WALL, FIND A NEW DIRECTION # IF (TSTBIT(MSTATE(LCOL,LROW),LDIR) == 0) CALL WALL(LCOL,LROW,LDIR) # # IF MOTION IS PROHIBITED THIS CYCLE, RESET OLD DIRECTION AND RETURN # IF (MOVE(CYCLE,LDIR) == 0 .OR. MOVE(CYCLE,5) == 0) [ LDIR = OLDDIR RETURN ] # # ALL READY TO MOVE # CALL UVT100(CUP,LROW,LCOL) #CURSOR TO CURRENT LOCATION IF (TSTBIT(MSTATE(LCOL,LROW),DOT) == 1) [ CALL GETADR(PRL,DOTCHR) CALL WTQIO(IOWVB,5,2,,,PRL) #REWRITE DOT ] ELSE IF (TSTBIT(MSTATE(LCOL,LROW),EGZ) == 1) [ CALL GETADR(PRL,EGZCHR) CALL WTQIO(IOWVB,5,2,,,PRL) #REWRITE ENERGIZER ] ELSE IF (FRUIT == 1 .AND. LCOL == FRUCOL .AND. LROW == 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) ] IF (LDIR == LEFT) LCOL = LCOL - 1 ELSE IF (LDIR == UP) LROW = LROW -1 ELSE IF (LDIR == RIGHT) LCOL = LCOL + 1 ELSE IF (LDIR == DOWN) LROW = LROW + 1 IF (LCOL > CMAR) LCOL = 1 ELSE IF (LCOL < 1) LCOL = CMAR IF (LROW > RMAR) LROW = 1 ELSE IF (LROW < 1) LROW = RMAR CALL UVT100(CUP,LROW,LCOL) CALL GETADR(PRL,LMAN(STATE)) CALL WTQIO(IOWVB,5,2,,,PRL) CALL COLIDE #TEST FOR COLLISION RETURN END