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 CALL GETADR(PRL,TOMBST) CALL WTQIO(IOWVB,5,2,,,PRL) DO I = 1,3 [ #RING BELL THREE TIMES CALL GETADR(PRL,BELL) CALL WTQIO(IOWVB,5,2,,,PRL) ] 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) CALL GETADR(PRL,SPACE) CALL WTQIO(IOWVB,5,2,,,PRL) ] ] ] # # 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) CALL GETADR(PRL,EATCHR(EATCNT)) CALL WTQIO(IOWVB,5,2,,,PRL) CALL WAIT(1,2) CALL UVT100(CUP,ROW,COL) CALL GETADR(PRL,PMAN) CALL WTQIO(IOWVB,5,2,,,PRL) LROW = LPRISR LCOL = LPRISC CALL UVT100(CUP,LROW,LCOL) #MOVE HIM TO PRISON CALL GETADR(PRL,LMAN(BAD)) CALL WTQIO(IOWVB,5,2,,,PRL) 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) CALL GETADR(PRL,EATCHR(EATCNT)) CALL WTQIO(IOWVB,5,2,,,PRL) CALL WAIT(1,2) CALL UVT100(CUP,ROW,COL) CALL GETADR(PRL,PMAN) CALL WTQIO(IOWVB,5,2,,,PRL) CROW = CPRISR CCOL = CPRISC CALL UVT100(CUP,CROW,CCOL) #MOVE HIM TO PRISON CALL GETADR(PRL,CMAN(BAD)) CALL WTQIO(IOWVB,5,2,,,PRL) 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) CALL GETADR(PRL,EATCHR(EATCNT)) CALL WTQIO(IOWVB,5,2,,,PRL) CALL WAIT(1,2) CALL UVT100(CUP,ROW,COL) CALL GETADR(PRL,PMAN) CALL WTQIO(IOWVB,5,2,,,PRL) FROW = FPRISR FCOL = FPRISC CALL UVT100(CUP,FROW,FCOL) #MOVE HIM TO PRISON CALL GETADR(PRL,FMAN(BAD)) CALL WTQIO(IOWVB,5,2,,,PRL) 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) CALL GETADR(PRL,EATCHR(EATCNT)) CALL WTQIO(IOWVB,5,2,,,PRL) CALL WAIT(1,2) CALL UVT100(CUP,ROW,COL) CALL GETADR(PRL,PMAN) CALL WTQIO(IOWVB,5,2,,,PRL) NROW = NPRISR NCOL = NPRISC CALL UVT100(CUP,NROW,NCOL) #MOVE HIM TO PRISON CALL GETADR(PRL,NMAN(BAD)) CALL WTQIO(IOWVB,5,2,,,PRL) NPRISN = 1 #MARK HIM IN PRISON NTIM = TIMER + PRITIM #CALCULATE IN PRISON TIME ] ] RETURN END