SUBROUTINE COLIDE IMPLICIT INTEGER(A - Z) C C THIS SUBROUTINE IS CALLED TO DETERMINE IF PACMAN HAS COLLIDED WITH C A MONSTER, AND IF SO, WHETHER HE HAS EATEN IT OR VICE-VERSA. C APPROPRIATE ACTION IS TAKEN DEPENDING ON WHO HAS EATEN WHOM. C C C VT100 DISPLAY CONTROL PARAMETER DEFINITIONS C CCURSOR POSITION AND PRINT CCURSOR POSITION REPORT CCURSOR UP CCURSOR DOWN CCURSOR FORWARD CCURSOR BACK CDOUBLE WIDTH LINE PARAMETER CUP = 1, CUU = 2, CUD = 3, CUF = 4, CUB = 5, DECDWL = 6, * DECDHL = 7, DECRC = 8, DECSC = 9, DECSWL = 10, ED = 11, EL = 12, *SGR = 13, NEL = 14, SCS = 15, SM = 16, RM = 17, ANSI = 18, CPP=19 C BIT SETTINGS FOR DIRECTIONALS AND MSTATE TABLE PARAMETER HALT = 0, UP = 1, DOWN = 2, LEFT = 4, RIGHT = 8 PARAMETER DOT=16, EGZ=32, TUNNEL=64, DECISN="200 PARAMETER SHFIN="17, SHFOUT="16, SPACE="40 C DISPLAYABLE CHARACTERS PARAMETER PMAN="52, EGZCHR="146, DOTCHR="176, TUNCHR="137 C BOARD STATE PARAMETER GOOD = 1, BAD = 2, BLINK = 3, EATEN = 4 C QIO FUNCTION CODES PARAMETER IOWVB="11000 C INTEGER*4SCORE, TIMER, STATIM, LTIM, CTIM, FTIM, NTIM, FRUON, FRUO *FF INTEGER*2PRL(6), EATSCO(4), FRUSCO(6), FRUDSR(20), FRUDSC(20) BYTE LMAN(3), CMAN(3), FMAN(3), NMAN(3), EATCHR(4), FRUCHR(6) BYTE MOVE(24, 9), FRUTBL(20) C COMMONS COMMON/PACCOM/FDIR, NDIR, LDIR, CDIR, CYCLE, MOVE, SCORE, DOTCNT, *COL, ROW, LCOL, LROW, CCOL, CROW, FCOL, FROW, NCOL, NROW, CYCTIM, *TIMER, BOARD, STATE, STATIM, LTIM, CTIM, FTIM, NTIM, LPRISN, CPRIS *N, FPRISN, NPRISN, LPRISR, LPRISC, CPRISR, CPRISC, FPRISR, FPRISC, * NPRISR, NPRISC, RDOOR, CDOOR, PRITIM, GOODTM, BLNKTM, EATCNT, EAT *CHR, EATSCO, EXTRA, LMAN, CMAN, FMAN, NMAN, PACCNT, INIROW, INICOL *, GAMOVR, FRUIT, FRUTIM, FRULTH, FRUON, FRUOFF, FRUSCO, FRUCHR, FR *UCOL, FRUROW, FRUCNT, FRUDSR, FRUDSC, PRL, FRUTBL, PACDSC, PACDSR, * PACDSD, FRUBRD PARAMETER TOMBST="147, BELL=7 C C IF STATE IS BAD (PACMAN IS EATEN) AND A COLLISION HAS OCCURRED, C PERFORM LOGIC FOR PACMAN EATEN BY MONSTER C IF (.NOT.(STATE .EQ. BAD)) GOTO 2000 IF (.NOT.((COL .EQ. LCOL.AND.ROW .EQ. LROW).OR.(COL .EQ. CCOL.AN *D.ROW .EQ. CROW).OR.(COL .EQ. FCOL.AND.ROW .EQ. FROW).OR.(COL .EQ. * NCOL.AND.ROW .EQ. NROW))) GOTO 2020 CALL UVT100(CPP, ROW, COL, TOMBST) ! DISPLAY TOMBSTONE DO 2040 I = 1, 2 CRING BELL TWICE TIMES CALL UVT100(CPP, ROW, COL, BELL) 2040 CONTINUE CALL BUFFER(2) ! FLUSH THE BUFFER CALL WAIT(2, 2) ! CONTEMPLATE DEFEAT FOR 2 SEC STATE = EATEN ! SET STATE TO 'EATEN' PACCNT = PACCNT - 1 ! DECREMENT PACMAN COUNT IF (PACCNT .LE. 0) THEN GAMOVR = 1 ! IF NO PACMEN LEFT, GAME IS OVER ELSE CALL UVT100(CPP, ROW, COL, SPACE) ! ELSE REWRITE A SPACE ENDIF 2020 CONTINUE C C IF THE STATE IS NOT BAD (PACMAN IS EATING) AND A COLLISION HAS C OCCURRED, INCREMENT THE SCORE, SEND THE MONSTER TO PRISON, C DISPLAY THE EATING SYMBOL, AND WAIT ONE SECOND FOR CONTEMPLATION C GOTO 2010 2000 CONTINUE IF (.NOT.((COL .EQ. LCOL).AND.(ROW .EQ. LROW))) GOTO 2080 EATCNT = EATCNT + 1 SCORE = SCORE + EATSCO(EATCNT) IF (SCORE .GE. 10000.AND.EXTRA .EQ. 0) THEN PACCNT = PACCNT + 1 EXTRA = 1 ENDIF IF (EATCNT .GT. 4) THEN STATE = BAD EATCNT = 0 ENDIF CALL UVT100(CPP, ROW, COL, EATCHR(EATCNT)) CALL BUFFER(2) ! FLUSH THE BUFFER CALL WAIT(1, 2) CALL UVT100(CPP, ROW, COL, PMAN) LROW = LPRISR LCOL = LPRISC CALL UVT100(CPP, LROW, LCOL, LMAN(BAD)) ! MOVE HIM TO PRISON LPRISN = 1 ! MARK HIM IN PRISON LTIM = TIMER + PRITIM ! CALCULATE IN PRISON TIME 2080 CONTINUE IF (.NOT.((COL .EQ. CCOL).AND.(ROW .EQ. CROW))) GOTO 2140 EATCNT = EATCNT + 1 SCORE = SCORE + EATSCO(EATCNT) IF (SCORE .GE. 10000.AND.EXTRA .EQ. 0) THEN PACCNT = PACCNT + 1 EXTRA = 1 ENDIF IF (EATCNT .GT. 4) THEN STATE = BAD EATCNT = 0 ENDIF CALL UVT100(CPP, ROW, COL, EATCHR(EATCNT)) CALL BUFFER(2) ! FLUSH THE BUFFER CALL WAIT(1, 2) CALL UVT100(CPP, ROW, COL, PMAN) CROW = CPRISR CCOL = CPRISC CMOVE HIM TO PRISON CALL UVT100(CPP, CROW, CCOL, CMAN(BAD)) CMARK HIM IN PRISON CPRISN = 1 CCALCULATE IN PRISON TIME CTIM = TIMER + PRITIM 2140 CONTINUE IF (.NOT.((COL .EQ. FCOL).AND.(ROW .EQ. FROW))) GOTO 2200 EATCNT = EATCNT + 1 SCORE = SCORE + EATSCO(EATCNT) IF (SCORE .GE. 10000.AND.EXTRA .EQ. 0) THEN PACCNT = PACCNT + 1 EXTRA = 1 ENDIF IF (EATCNT .GT. 4) THEN STATE = BAD EATCNT = 0 ENDIF CALL UVT100(CPP, ROW, COL, EATCHR(EATCNT)) CALL BUFFER(2) ! FLUSH THE BUFFER CALL WAIT(1, 2) CALL UVT100(CPP, ROW, COL, PMAN) FROW = FPRISR FCOL = FPRISC CMOVE HIM TO PRISON CALL UVT100(CPP, FROW, FCOL, FMAN(BAD)) CMARK HIM IN PRISON FPRISN = 1 CCALCULATE IN PRISON TIME FTIM = TIMER + PRITIM 2200 CONTINUE IF (.NOT.((COL .EQ. NCOL).AND.(ROW .EQ. NROW))) GOTO 2260 EATCNT = EATCNT + 1 SCORE = SCORE + EATSCO(EATCNT) IF (SCORE .GE. 10000.AND.EXTRA .EQ. 0) THEN PACCNT = PACCNT + 1 EXTRA = 1 ENDIF IF (EATCNT .GT. 4) THEN STATE = BAD EATCNT = 0 ENDIF CALL UVT100(CPP, ROW, COL, EATCHR(EATCNT)) CALL BUFFER(2) ! FLUSH THE BUFFER CALL WAIT(1, 2) CALL UVT100(CPP, ROW, COL, PMAN) NROW = NPRISR NCOL = NPRISC CALL UVT100(CPP, NROW, NCOL, NMAN(BAD)) ! MOVE HIM TO PRISON NPRISN = 1 ! MARK HIM IN PRISON NTIM = TIMER + PRITIM ! CALCULATE IN PRISON TIME 2260 CONTINUE 2010 CONTINUE RETURN END