SUBROUTINE PACMOV IMPLICIT INTEGER (A-Z) # # THIS SUBROUTINE CONTROLS THE MOVEMENT OF THE PACMAN # INCLUDE/NL SY:UVT100.DAT INCLUDE/NL SY:PACMAN.CMN IF (NEWDIR == -1) #EXIT PROGRAM RETURN # # TEST THE STATUS OF NEW DIRECTION, AND IF LEGAL AT THIS LOCATION # SET CURRENT DIRECTION EQUAL TO IT. IF CURRENT DIRECTION IS NOT # LEGAL AT THIS LOCATION, SET CURRENT DIRECTION TO 'HALT'. # OLDDIR = CURDIR IF (TSTBIT(MSTATE(COL,ROW),NEWDIR) == 1) #NEWDIR LEGAL? CURDIR = NEWDIR IF (TSTBIT(MSTATE(COL,ROW),CURDIR) == 0) #CURDIR LEGAL? CURDIR = HALT # # TEST IF WE ATE AN ENERGIZER OR DOT ON OUR LAST MOVE. # IF WE DID, WE MAY NOT BE ALLOWED TO MOVE THIS CYCLE. # IF (ATEDOT == 1) [ ATEDOT = 0 IF (MOVE(CYCLE,6) == 0 .AND. OLDDIR == CURDIR) RETURN ] # # RETURN IF NO MOTION SPECIFIED # IF (CURDIR == HALT) RETURN # # ELSE PERFORM ANY REQUIRED MOTION FOR PACMAN. (CHECK IF MOTION # IS ALLOWED THIS CYCLE. IT IS ALWAYS ALLOWED FOR CHANGE OF # DIRECTION, SO THAT PACMAN CANNOT BE CAUGHT IN A CORNER) # ELSE IF (CURDIR != OLDDIR .OR. MOVE(CYCLE,CURDIR) == 1) [ CALL UVT100(CUP,ROW,COL) #POSITION CURSOR OUTBUF(LEN+1) = SPACE #BLANK OUT THIS LOC. LEN = LEN + 1 IF (TSTBIT(MSTATE(COL,ROW),DECISN) == 1) [ #SAVE THESE CO-ORDS. PACDSC = COL PACDSR = ROW PACDSD = CURDIR ] IF (CURDIR == LEFT) #SET NEW COORDINATES COL = COL - 1 ELSE IF (CURDIR == UP) ROW = ROW - 1 ELSE IF (CURDIR == RIGHT) COL = COL + 1 ELSE IF (CURDIR == DOWN) ROW = ROW + 1 IF (COL > CMAR) COL = 1 ELSE IF (COL < 1) COL = CMAR IF (ROW > RMAR) ROW = 1 ELSE IF (ROW < 1) ROW = RMAR CALL UVT100(CUP,ROW,COL) #DISPLAY PACMAN AT OUTBUF(LEN+1) = PMAN LEN = LEN + 1 # # TEST IF WE DID ANYTHING USEFUL WITH THIS LATEST MOVE # IF (TSTBIT(MSTATE(COL,ROW),EGZ) == 1) [ #JUST ATE ENERGIZER CALL CLRBIT(MSTATE(COL,ROW),EGZ) #CLEAR ENERGIZER BIT STATE = GOOD #STATE = MUNCH TIME STATIM = TIMER #TIME OF STATE CHANGE SCORE = SCORE + 50 #ADD 50 POINTS IF (SCORE >= 10000 .AND. EXTRA == 0) [ #TEST FOR EXTRA PACMAN PACCNT = PACCNT + 1 #AT 10000 POINTS EXTRA = 1 ] DOTCNT = DOTCNT - 1 #DECREMENT DOT COUNT ATEDOT = 1 #JUST ATE ENERGIZER ] IF (TSTBIT(MSTATE(COL,ROW),DOT) == 1) [ #JUST ATE DOT CALL CLRBIT(MSTATE(COL,ROW),DOT) #CLEAR DOT BIT SCORE = SCORE + 10 #IF SO, ADD 10 POINTS IF (SCORE >= 10000 .AND. EXTRA == 0) [ #TEST FOR EXTRA PACMAN PACCNT = PACCNT + 1 #AT 10000 POINTS EXTRA = 1 ] DOTCNT = DOTCNT - 1 #DECREMENT DOT COUNT ATEDOT = 1 #JUST ATE DOT ] IF (FRUIT == 1 .AND. COL == FRUCOL .AND. ROW == FRUROW) [ FRUIT = 0 #JUST ATE FRUIT FRUCNT = FRUCNT + 1 #TOTAL FRUIT EATEN FRUBRD = FRUBRD + 1 #FRUIT THIS BOARD FRUON = TIMER + FRUTIM #RESET TIMER FOR FRUIT SCORE = SCORE + FRUSCO(BOARD) #INCREMENT SCORE IF (SCORE >= 10000 .AND. EXTRA == 0) [ PACCNT = PACCNT + 1 EXTRA = 1 ] IF (FRUCNT <= 20) [ #DISPLAY EATEN FRUIT FRUTBL(FRUCNT) = FRUCHR(BOARD) CALL UVT100(CUP,FRUDSR(FRUCNT),FRUDSC(FRUCNT)) OUTBUF(LEN+1) = FRUCHR(BOARD) LEN = LEN + 1 ] ] IF (DOTCNT > 0) #IF DOTS REMAIN, CALL COLIDE #TEST FOR COLLISION ] END