SUBROUTINE COLIDE IMPLICIT INTEGER (A-Z) # # THIS SUBROUTINE IS CALLED TO DETERMINE IF PACMAN HAS COLLIDED WITH # A MONSTER, AND IF SO, WHETHER HE HAS EATEN IT OR VICE-VERSA. # APPROPRIATE ACTION IS TAKEN DEPENDING ON WHO HAS EATEN WHOM. # INCLUDE/NL SY:UVT100.DAT INCLUDE/NL SY:PACMAN.CMN % PARAMETER TOMBST="147, BELL=7 # # IF STATE IS BAD (PACMAN IS EATEN) AND A COLLISION HAS OCCURRED, # PERFORM LOGIC FOR PACMAN EATEN BY MONSTER # IF (STATE == BAD) [ IF ((COL==LCOL .AND. ROW==LROW) .OR. (COL==CCOL .AND. ROW==CROW) .OR. (COL==FCOL .AND. ROW==FROW) .OR. (COL==NCOL .AND. ROW==NROW)) [ CALL UVT100(CUP,ROW,COL) #DISPLAY TOMBSTONE OUTBUF(LEN+1) = TOMBST LEN = LEN + 1 DO I = 1,3 [ #RING BELL THREE TIMES OUTBUF(LEN+1) = BELL LEN = LEN + 1 ] CALL GETADR(PRL,OUTBUF) #UPDATE BOARD DISPLAY PRL(2) = LEN CALL WTQIO(IOWVB,5,2,,,PRL) LEN = 0 CALL WAIT(2,2) #CONTEMPLATE DEFEAT FOR 2 SEC. STATE = EATEN #SET STATE TO 'EATEN' PACCNT = PACCNT - 1 #DECREMENT PACMAN COUNT IF (PACCNT <= 0) #IF NO PACMEN LEFT, GAMOVR = 1 #GAME IS OVER. ELSE [ #ELSE REWRITE A SPACE CALL UVT100(CUP,ROW,COL) OUTBUF(LEN+1) = SPACE LEN = LEN + 1 ] ] ] # # IF THE STATE IS NOT BAD (PACMAN IS EATING) AND A COLLISION HAS # OCCURRED, INCREMENT THE SCORE, SEND THE MONSTER TO PRISON, # DISPLAY THE EATING SYMBOL, AND WAIT ONE SECOND FOR CONTEMPLATION # ELSE [ IF ((COL==LCOL) .AND. (ROW==LROW)) [ EATCNT = EATCNT + 1 SCORE = SCORE + EATSCO(EATCNT) IF (SCORE >= 10000 .AND. EXTRA == 0) [ PACCNT = PACCNT + 1 EXTRA = 1 ] IF (EATCNT > 4) [ STATE = BAD EATCNT = 0 ] CALL UVT100(CUP,ROW,COL) OUTBUF(LEN+1) = EATCHR(EATCNT) LEN = LEN + 1 CALL GETADR(PRL,OUTBUF) PRL(2) = LEN CALL WTQIO(IOWVB,5,2,,,PRL) LEN = 0 CALL WAIT(1,2) CALL UVT100(CUP,ROW,COL) OUTBUF(LEN+1) = PMAN LEN = LEN + 1 LROW = LPRISR LCOL = LPRISC CALL UVT100(CUP,LROW,LCOL) #MOVE HIM TO PRISON OUTBUF(LEN+1) = LMAN(BAD) LEN = LEN + 1 LPRISN = 1 #MARK HIM IN PRISON LTIM = TIMER + PRITIM #CALCULATE IN PRISON TIME ] IF ((COL==CCOL) .AND. (ROW==CROW)) [ EATCNT = EATCNT + 1 SCORE = SCORE + EATSCO(EATCNT) IF (SCORE >= 10000 .AND. EXTRA == 0) [ PACCNT = PACCNT + 1 EXTRA = 1 ] IF (EATCNT > 4) [ STATE = BAD EATCNT = 0 ] CALL UVT100(CUP,ROW,COL) OUTBUF(LEN+1) = EATCHR(EATCNT) LEN = LEN + 1 CALL GETADR(PRL,OUTBUF) PRL(2) = LEN CALL WTQIO(IOWVB,5,2,,,PRL) LEN = 0 CALL WAIT(1,2) CALL UVT100(CUP,ROW,COL) OUTBUF(LEN+1) = PMAN LEN = LEN + 1 CROW = CPRISR CCOL = CPRISC CALL UVT100(CUP,CROW,CCOL) #MOVE HIM TO PRISON OUTBUF(LEN+1) = CMAN(BAD) LEN = LEN + 1 CPRISN = 1 #MARK HIM IN PRISON CTIM = TIMER + PRITIM #CALCULATE IN PRISON TIME ] IF ((COL==FCOL) .AND. (ROW==FROW)) [ EATCNT = EATCNT + 1 SCORE = SCORE + EATSCO(EATCNT) IF (SCORE >= 10000 .AND. EXTRA == 0) [ PACCNT = PACCNT + 1 EXTRA = 1 ] IF (EATCNT > 4) [ STATE = BAD EATCNT = 0 ] CALL UVT100(CUP,ROW,COL) OUTBUF(LEN+1) = EATCHR(EATCNT) LEN = LEN + 1 CALL GETADR(PRL,OUTBUF) PRL(2) = LEN CALL WTQIO(IOWVB,5,2,,,PRL) LEN = 0 CALL WAIT(1,2) CALL UVT100(CUP,ROW,COL) OUTBUF(LEN+1) = PMAN LEN = LEN + 1 FROW = FPRISR FCOL = FPRISC CALL UVT100(CUP,FROW,FCOL) #MOVE HIM TO PRISON OUTBUF(LEN+1) = FMAN(BAD) LEN = LEN + 1 FPRISN = 1 #MARK HIM IN PRISON FTIM = TIMER + PRITIM #CALCULATE IN PRISON TIME ] IF ((COL==NCOL) .AND. (ROW==NROW)) [ EATCNT = EATCNT + 1 SCORE = SCORE + EATSCO(EATCNT) IF (SCORE >= 10000 .AND. EXTRA == 0) [ PACCNT = PACCNT + 1 EXTRA = 1 ] IF (EATCNT > 4) [ STATE = BAD EATCNT = 0 ] CALL UVT100(CUP,ROW,COL) OUTBUF(LEN+1) = EATCHR(EATCNT) LEN = LEN + 1 CALL GETADR(PRL,OUTBUF) PRL(2) = LEN CALL WTQIO(IOWVB,5,2,,,PRL) LEN = 0 CALL WAIT(1,2) CALL UVT100(CUP,ROW,COL) OUTBUF(LEN+1) = PMAN LEN = LEN + 1 NROW = NPRISR NCOL = NPRISC CALL UVT100(CUP,NROW,NCOL) #MOVE HIM TO PRISON OUTBUF(LEN+1) = NMAN(BAD) LEN = LEN + 1 NPRISN = 1 #MARK HIM IN PRISON NTIM = TIMER + PRITIM #CALCULATE IN PRISON TIME ] ] RETURN END