SUBROUTINE BULCOL # # THIS SUBROUTINE CONTROLS COLLISIONS BETWEEN BULLETS AND TARGETS. # IMPLICIT INTEGER (A-Z) INCLUDE SY:CNTPED.CMN INCLUDE SY:UVT100.DAT BYTE THREE,SIX,NINE % DATA THREE,SIX,NINE / "063,"066,"071 / # # CHECK IF CURRENT BULLET LOCATION COLLIDES WITH MUSHROOM # IF (MSHBRD(BULX,BULY) > 0) [ BULACT = 0 MSHBRD(BULX,BULY) = MSHBRD(BULX,BULY) - 1 IF (MSHBRD(BULX,BULY) == 0) [ PSNBRD(BULX,BULY) = 0 SCORE = SCORE + 1 ] ] # # CHECK IF CURRENT BULLET LOCATION COLLIDES WITH CENTIPEDE(S) # DO I = 1,MAXCNT [ #LOOP THROUGH CENTIPEDE TABLE ENTRIES IF (CLEN(I) == 0) NEXT #UNUSED ENTRY DO J = 1,CLEN(I) [ #LOOP THROUGH LINKS FOR THIS ENTRY IF (BULX == CX(I,J) .AND. BULY == CY(I,J)) [ #COLLISION BULACT = 0 MSHBRD(BULX,BULY) = 4 #CREATE MUSHROOM IN MUSHROOM TABLE CNTBRD(BULX,BULY) = 0 #CLEAR CENTIPEDE BOARD AT THIS LOC IF (J == 1) [ #COLLISION WITH CENTIPEDE HEAD SCORE = SCORE + 100 #INCREMENT SCORE CLEN(I) = CLEN(I) - 1 #'SHORTEN' CENTIPEDE IF (CLEN(I) > 0) [ #IF LENGTH NOT ZERO DO K = 1,CLEN(I) [ #UPDATE LINKS IN CENTIPEDE TABLE CX(I,K) = CX(I,K+1) CY(I,K) = CY(I,K+1) ] CALL UVT100(CUP,CX(I,1),CY(I,1)) #DISPLAY NEW CENTIPEDE HEAD IF (CDIR(I) == LEFT) OUTBUF(LEN+1) = CLHEAD ELSE IF (CDIR(I) == RIGHT) OUTBUF(LEN+1) = CRHEAD ELSE OUTBUF(LEN+1) = CDHEAD LEN = LEN + 1 ] ] ELSE [ #COLLISION WITH CENTIPEDE BODY SCORE = SCORE + 10 #INCREMENT SCORE NEWLEN = CLEN(I) - J CLEN(I) = J - 1 IF (NEWLEN > 0) [ DO K = 1,MAXCNT [ #FIND EMPTY SLOT IN CENTIPEDE TABLE IF (CLEN(K) > 0) NEXT DO L = 1,NEWLEN [ #MOVE NEW CENTIPEDE LINKS TO THIS SLOT CX(K,L) = CX(I,L+J) CY(K,L) = CY(I,L+J) ] CLEN(K) = NEWLEN #NEW CENTIPEDE LENGTH CDIR(K) = CDIR(I) #NEW CENTIPEDE DIRECTION OF MOTION CRISE(K) = CRISE(I) #NEW CENTIPEDE ASCEND OR DESCEND CBOT(K) = CBOT(I) #NEW CENTIPEDE HIT BOTTOM FLAG CALL UVT100(CUP,CX(K,1),CY(K,1)) IF (CDIR(K) == LEFT) #DISPLAY NEW CENTIPEDE HEAD OUTBUF(LEN+1) = CLHEAD ELSE IF (CDIR(K) == RIGHT) OUTBUF(LEN+1) = CRHEAD ELSE OUTBUF(LEN+1) = CDHEAD LEN = LEN + 1 BREAK ] ] ] ] ] ] # # CHECK IF CURRENT BULLET LOCATION COLLIDES WITH SPIDER # IF (SPIACT == 1 .AND. BULX == SPIX .AND. BULY == SPIY) [ BULACT = 0 SPIACT = 0 SPITIM = TIMER + 30 #SCHEDULE NEXT SPIDER ITMP = GUNX - SPIX IF (ITMP < 0) ITMP = 0 CALL UVT100(CUP,BULX,BULY) IF (ITMP < 2) [ #INCREMENT SCORE SCORE = SCORE + 900 OUTBUF(LEN+1) = NINE ] ELSE IF (ITMP < 4) [ SCORE = SCORE + 600 OUTBUF(LEN+1) = SIX ] ELSE [ SCORE = SCORE + 300 OUTBUF(LEN+1) = THREE ] LEN = LEN + 1 CALL GETADR(PRL,OUTBUF) PRL(2) = LEN CALL WTQIO(IOWVB,5,2,,,PRL) LEN = 0 CALL WAIT(200,1) #PAUSE 200 MILLISECONDS ] # # CHECK IF CURRENT BULLET LOCATION COLLIDES WITH FLEA # IF (FLEACT == 1 .AND. FLEX == BULX .AND. FLEY == BULY) [ BULACT = 0 FLEACT = 0 ICOUNT = 0 DO I = GMAR,BMAR [ #NEXT SCHEDULED FLEA TIME DEPENDS DO J = LMAR,RMAR [ #ON NUMBER OF MUSHROOMS IN PLAYER ZONE IF (MSHBRD(I,J) > 0) ICOUNT = ICOUNT + 1 ] ] IF (ICOUNT < 5) #SCHEDULE NEXT FLEA FLETIM = FLETIM + 20 ELSE FLETIM = FLETIM + 200 SCORE = SCORE + 200 #INCREMENT SCORE ] # # CHECK IF CURRENT BULLET LOCATION COLLIDES WITH SCORPION # IF (SCOACT == 1 .AND. SCOX == BULX .AND. SCOY == BULY) [ BULACT = 0 SCOACT = 0 SCOTIM = SCOTIM + 200 #SCHEDULE NEXT SCORPION SCORE = SCORE + 1000 #INCREMENT SCORE ] # # IF BULLET HIT SOMETHING, DISPLAY APPROPRIATE CHARACTER # IF (BULACT == 0) [ CALL UVT100(CUP,BULX,BULY) OUTBUF(LEN+1) = SPACE IF (MSHBRD(BULX,BULY) > 0) OUTBUF(LEN+1) = MSHCHR IF (PSNBRD(BULX,BULY) == 1) OUTBUF(LEN+1) = PSNCHR LEN = LEN + 1 ] RETURN END