SUBROUTINE CNTMOV # # THIS SUBROUTINE CONTROLS THE MOTION OF CENTIPEDES. CENTIPEDES # MOVE ACROSS THE SCREEN UNTIL THEY HIT EITHER THE EDGE OR A # MUSHROOM. AT THIS POINT THEY DROP DOWN A ROW AND REVERSE DIRECTION, # UNLESS THE MUSHROOM IS POISONED. A POISON MUSHROOM CAUSES THEM # TO DROP STRAIGHT DOWN UNTIL THE NEXT TO THE LAST ROW OF THE DISPLAY, # AT WHICH POINT THEY RESUME NORMAL MOTION. # IMPLICIT INTEGER (A-Z) INCLUDE SY:CNTPED.CMN INCLUDE SY:UVT100.DAT DO I = 1,MAXCNT [ #SEARCH CENTIPEDE TABLE IF (CLEN(I) == 0) #NOT AN ACTIVE CENTIPEDE NEXT NEWX = CX(I,1) #CURRENT COORDINATES OF HEAD NEWY = CY(I,1) #OF CENTIPEDE IF (CLEN(I) > 1) [ #IF CENTIPEDE HAS A BODY... # # REPLACE CENTIPEDE HEAD WITH CENTIPEDE BODY # CALL UVT100(CUP,NEWX,NEWY) CALL GETADR(PRL,CBODY) CALL WTQIO(IOWVB,5,2,,,PRL) #DISPLAY BODY CHARACTER ] # # BLANK OUT OLD TAIL OF CENTIPEDE # TMPX = CX(I,CLEN(I)) TMPY = CY(I,CLEN(I)) IF (CNTBRD(TMPX,TMPY) > 0) #DECREMENT CENTIPEDE COUNT CNTBRD(TMPX,TMPY) = CNTBRD(TMPX,TMPY) - 1 IF (CNTBRD(TMPX,TMPY) == 0) [ #IF NO OTHER CENTIPEDE HERE... CALL UVT100(CUP,TMPX,TMPY) IF (MSHBRD(TMPX,TMPY) == 0) CALL GETADR(PRL,SPACE) ELSE IF (PSNBRD(TMPX,TMPY) == 0) CALL GETADR(PRL,MSHCHR) ELSE CALL GETADR(PRL,PSNCHR) CALL WTQIO(IOWVB,5,2,,,PRL) ] # # ADVANCE HEAD OF CENTIPEDE # IF (CDIR(I) == LEFT) [ #MOTION IS TO LEFT NEWY = NEWY - 1 #CHECK FOR BUMPING INTO SOMETHING IF (NEWY < LMAR .OR. MSHBRD(NEWX,NEWY) > 0 .OR. CNTBRD(NEWX,NEWY) > 0) [ CDIR(I) = RIGHT #NEW MOTION IS TO RIGHT IF (PSNBRD(NEWX,NEWY) == 1 .AND. NEWY >= LMAR) [ CDIR(I) = DOWN #HIT POISON MUSHROOM CRISE(I) = 1 #DESCEND PSNBRD(NEWX,NEWY) = 0 #'UNPOISON' MUSHROOM CALL UVT100(CUP,NEWX,NEWY) CALL GETADR(PRL,MSHCHR) CALL WTQIO(IOWVB,5,2,,,PRL) ] NEWY = NEWY + 1 #RESTORE Y-COORDINATE NEWX = NEWX + CRISE(I) #ASCEND OR DESCEND ONE ROW ] ] ELSE IF (CDIR(I) == RIGHT) [ #MOTION IS TO RIGHT NEWY = NEWY + 1 #CHECK FOR BUMPING INTO SOMETHING IF (NEWY > RMAR .OR. MSHBRD(NEWX,NEWY) > 0 .OR. CNTBRD(NEWX,NEWY) > 0) [ CDIR(I) = LEFT #NEW MOTION IS TO LEFT IF (PSNBRD(NEWX,NEWY) == 1 .AND. NEWY <= RMAR) [ CDIR(I) = DOWN #HIT POISON MUSHROOM CRISE(I) = 1 #DESCEND PSNBRD(NEWX,NEWY) = 0 #'UNPOISON' MUSHROOM CALL UVT100(CUP,NEWX,NEWY) CALL GETADR(PRL,MSHCHR) CALL WTQIO(IOWVB,5,2,,,PRL) ] NEWY = NEWY - 1 #RESTORE Y-COORDINATE NEWX = NEWX + CRISE(I) #ASCEND OR DESCEND ONE ROW ] ] ELSE IF (CDIR(I) == DOWN) [ #MOTION IS DOWN NEWX = NEWX + 1 IF (NEWX > BMAR) [ #REVERT TO NORMAL MOTION IF (NEWY < 20) [ #LEFT HALF OF BOARD - RIGHT MOTION NEWY = NEWY + 1 CDIR(I) = RIGHT ] ELSE [ #RIGHT HALF OF BOARD - LEFT MOTION NEWY = NEWY - 1 CDIR(I) = LEFT ] ] ELSE [ #ZIGZAG BETWEEN TWO COLUMNS IF ((NEWY/2)*2 == NEWY) NEWY = NEWY - 1 ELSE NEWY = NEWY + 1 IF (NEWY < LMAR) NEWY = LMAR ELSE IF (NEWY > RMAR) NEWY = RMAR ] ] IF (NEWX > BMAR) [ #IF WE HAVE DESCENDED OFF BOTTOM NEWX = BMAR - 1 #OF BOARD, START ASCENDING CRISE(I) = -1 CBOT(I) = 1 ] ELSE IF (NEWX < GMAR .AND. CRISE(I) == -1) [ #IF ASCENDED TO TOP NEWX = GMAR + 1 #OF PLAYER ZONE, START DESCENDING CRISE(I) = 1 ] # # UPDATE CENTIPEDE COORDINATES AND CENTIPEDE BOARD # DO J = CLEN(I),2,-1 [ CX(I,J) = CX(I,J-1) CY(I,J) = CY(I,J-1) ] CX(I,1) = NEWX CY(I,1) = NEWY CNTBRD(NEWX,NEWY) = CNTBRD(NEWX,NEWY) + 1 # # DISPLAY NEW CENTIPEDE HEAD # CALL UVT100(CUP,NEWX,NEWY) IF (CDIR(I) == LEFT) CALL GETADR(PRL,CLHEAD) ELSE IF (CDIR(I) == RIGHT) CALL GETADR(PRL,CRHEAD) ELSE CALL GETADR(PRL,CDHEAD) CALL WTQIO(IOWVB,5,2,,,PRL) CALL GUNMOV #CHECK FOR PLAYER'S GUN MOTION IF (FIRCOD > 0) CALL FIRE #CHECK FOR FIRED BULLET IF (BULACT == 1) CALL BULLET #PROCESS BULLET MOTION ] RETURN END