SUBROUTINE MANTI C C * DEAL WITH ANTI-MATTER C C C MOVE ANTI-MATTER PODS C INCLUDE 'TRKCOMMON.FTN' REAL LAUNCH INTEGER SCAN,WHOM,CREW,HYPER,TORPS,IPX(22),IPY(22) LOGICAL*1 THRU,XSHIP,CLOAK,CLON,FBASE,OK,DESTRY BYTE MESSAG,INITLS,CHAR C C * THE FOLLOWING DATA DESCIBES THE EXPLOSION PATTERN FOR C ANTI-MATTER PODS C DATA IPX/0,-1,0,1,-2,-1,0,1,2,-1,0,1,0,0,0,-3,3,2,2,-2,-2,0/ DATA IPY/2,1,1,1,0,0,0,0,0,-1,-1,-1,-2,3,-3,0,0,-2,2,2,-2,-3/ C DO 20002 I=1,8 I10006 = IPOD(I) IF (I10006.LT.1.OR.I10006.GT.3) GO TO 20002 GO TO (10008,10016,10027), I10006 C C * LAUNCH POD C 10008 CALL MOVE(XCORD(I),YCORD(I),X1,Y1,DPOD(I),10.,CHAR,IMAXX,IMAXY 1 ,IUNIV(I)) IX=X1 IY=Y1 KX=XCORD(I) KY=YCORD(I) C C * MAKE SURE IT CLEARS THE SHIP C IF (KX.NE.IX.OR.KY.NE.IY) GOTO 10009 CALL MOVE(X1,Y1,X,Y,DPOD(I),10.,CHAR,IMAXX,IMAXY,IUNIV(I)) GO TO 10010 10009 X=X1 Y=Y1 10010 IX=X IY=Y IF (CHAR.NE.'.') GOTO 10012 C C * SUCCESSUL LAUNCH C CALL UNIVIN(IX,IY,'@',IUNIV(I)) IF (CLON(I).AND..NOT.CLOAK(I).AND.IDAMGE(I,4).EQ.0) CLOAK(I)=.TRUE. XPOD(I)=X YPOD(I)=Y IPOD(I)=2 WPOD(I)=5. PODUNI(I)=IUNIV(I) CALL SENT(I,28) GO TO 20002 10012 CALL SENT(I,23) IPOD(I)=0 GO TO 20002 C C * POD IS ON THE MOVE C 10016 IX=XPOD(I) IY=YPOD(I) CALL UNIV(IX,IY,CHAR,PODUNI(I)) IF (CHAR.NE.'@') GOTO 10017 CALL MOVE(XPOD(I),YPOD(I),X,Y,DPOD(I),WPOD(I),CHAR,IMAXX,IMAXY, 1 PODUNI(I)) IF (CHAR.NE.'.'.AND.CHAR.NE.'+'.AND.CHAR.NE.'^') GOTO 10020 CALL UNIVIN(IX,IY,'.',PODUNI(I)) IX=X IY=Y CALL UNIVIN(IX,IY,'@',PODUNI(I)) XPOD(I)=X YPOD(I)=Y GO TO 20002 10020 IF (RAN(I1,I2).LE.5) GOTO 10023 DPOD(I)=DPOD(I)+90. GO TO 20002 10023 DPOD(I)=DPOD(I)-90. GOTO 20002 10017 CALL SENT(I,24) IPOD(I)=0 GO TO 20002 C C * DETONATE POD C 10027 IX=XPOD(I) IY=YPOD(I) CALL UNIV(IX,IY,CHAR,PODUNI(I)) IF (CHAR.NE.'@') GOTO 10028 IPOD(I)=0 WPOD(I)=0 CALL SENT(I,29) CALL UNIVIN(IX,IY,'.',PODUNI(I)) C C CHECK ALL LOCATIONS IN EXPLOSION PATTERN & DO DAMAGE IF NEEDED C DO 10500 L1=1,22 KX=IX+IPX(L1) IF (KX.GE.IMAXX+1) KX=KX-IMAXX IF (KX.LT.1) KX=KX+IMAXX KY=IY+IPY(L1) IF (KY.GE.IMAXY+1) KY=KY-IMAXY IF (KY.LT.1) KY=KY+IMAXY CALL UNIV(KX,KY,CHAR,PODUNI(I)) IF (CHAR.EQ.'H'.OR.CHAR.EQ.'R'.OR.CHAR.EQ.'B') GOTO 10500 C C HIT A BLACK HOLE C IF (CHAR.NE.'#') GO TO 10053 CALL SENT(I,31) SCORE(I)=SCORE(I)+1000. CALL UNIVIN(KX,KY,'.',PODUNI(I)) 10055 IIX=RAN(I1,I2)*IMAXX+1. IF (IIX .GT. IMAXX) IIX = IMAXX IIY=RAN(I1,I2)*IMAXY+1. IF (IIY .GT. IMAXY ) IIY = IMAXY CALL UNIV(IIX,IIY,CHAR,PODUNI(I)) IF (CHAR.NE.'.') GO TO 10055 DO 10054, J=1,IHOLE(PODUNI(I)) LX=HX(PODUNI(I),J) LY=HY(PODUNI(I),J) CALL UNIV(LX,LY,CHAR,PODUNI(I)) IF (CHAR.EQ.'#') GOTO 10054 C IF (LX.NE.KX.AND.LY.NE.KY) CALL VFY (8) HX(PODUNI(I),J)=IIX HY(PODUNI(I),J)=IIY CALL UNIVIN(IIX,IIY,'#',PODUNI(I)) 10054 CONTINUE CALL UNIV(IIX,IIY,CHAR,PODUNI(I)) IF (CHAR.EQ.'#') GOTO 10500 WRITE (5,10056) KX,KY 10056 FORMAT (' MANTI -- Failed to reseed black hole at ',I3,',',I3) C CALL VFY(8) GOTO 10500 C C HIT A SHIP C 10053 IF (CHAR.LT.'1'.OR.CHAR.GT.'8') GOTO 10501 DECODE (1,10502,CHAR) IZ 10502 FORMAT (I1) IF (DOCKED(IZ)) GOTO 10001 D=((XCORD(IZ)-XPOD(I))**2 + (YCORD(IZ)-YPOD(I))**2 ) **.5 IF (D.GT.4) GO TO 10001 IS=7.-D E=1500. - D* 300. IF (.NOT.XSHIP(IZ)) GO TO 10074 CALL SENT(IZ,30) E=E*-1 CALL DAMAGE(IZ,E,500) IF (ENERGY(IZ).GT.0) GO TO 10080 IF (I.EQ.IZ) GO TO 10083 CALL SENT(I,22) SCORE(I)=SCORE(I)+2000. 10083 CALL RESET(IZ) 10080 IF (I.EQ.IZ) GO TO 10001 SCORE(I)=SCORE(I)+E CALL SENT(I,32) GOTO 10001 10074 CALL SENT(I,21) GO TO 10001 10028 CALL SENT(I,24) IPOD(I)=0 10001 GOTO 10500 C C * FIGURE FREIGHTER DAMAGE C 10501 IF (CHAR.NE.'F') GOTO 10500 DECODE (1,10502,CHAR) IZ IF (FLOAD(PODUNI(I),IZ).EQ.0) GOTO 20001 D=((XCORD(IZ)-XPOD(I))**2 + (YCORD(IZ)-YPOD(I))**2 ) **.5 IF (D.GT.4) GO TO 20001 IS=7.-D E=1500. - D* 300. CALL SENT(IZ,40) IF (FNEAR(PODUNI(I),IZ)) GOTO 20100 CALL FRDAM(IZ,DESTRY,E,PODUNI(I)) IF (.NOT.DESTRY) GOTO 20001 SCORE(I) = SCORE(I) + 500 IX = FXCORD(PODUNI(I),IZ) IY = FYCORD(PODUNI(I),IZ) CALL UNIVIN(IX,IY,'.',PODUNI(I)) GOTO 20001 20100 CALL DAMAGE(IZ,E,500.) SCAN(IZ)=SCAN(IZ)-IS IF (SCAN(IZ) .LT. 0 ) SCAN(IZ)=0 IDAMGE(IZ,3)=100-(SCAN(IZ)*10) IF (ENERGY(IZ).GT.0) GO TO 20080 IF (I.EQ.IZ) GO TO 20083 CALL SENT(I,22) SCORE(I)=SCORE(I)+2000 20083 CALL RESET(IZ) 20080 IF (I .EQ. IZ ) GO TO 20001 SCORE(I)=SCORE(I)+E CALL SENT(I,32) 20074 CALL SENT(I,21) GO TO 20001 20028 CALL SENT(I,24) IPOD(I)=0 20001 CONTINUE C C BOTTOM OF EXPLOSION LOOP C 10500 CONTINUE C C BOTTOM OF MAIN LOOP C 20002 CONTINUE RETURN END