SUBROUTINE MSHIPS(CDRAIN,HDRAIN) C C ROUTINE TO HANDLE SHIP MOVEMENT FOR MTREK C INCLUDE 'TRKCOMMON.FTN' REAL LAUNCH INTEGER SCAN,WHOM,CREW,HYPER,TORPS LOGICAL*1 THRU,XSHIP,CLOAK,CLON,FBASE,US,FLAG BYTE MESSAG,INITLS,CHAR,SHIP C DO 10001 I=1,8 IF (.NOT.XSHIP(I)) GOTO 10003 IF (CLON(I)) ENERGY(I)=ENERGY(I)-CDRAIN IF (IHOME(I).GT.0) ENERGY(I) = ENERGY(I) - HDRAIN IF (WARP(I).EQ.0.AND.DOCKED(I)) GOTO 20001 DOCKED(I)=.FALSE. IX=XCORD(I) IY=YCORD(I) ENCODE(1,10009,SHIP) I 10009 FORMAT (I1) ENERGY(I)=ENERGY(I)-WARP(I)/2 CALL MOVE(XCORD(I),YCORD(I),X,Y,DIR(I),WARP(I),CHAR,IMAXX,IMAXY, 1 IUNIV(I)) KX=X KY=Y FLAG=.TRUE. DO 10010, J=1,8 IF (ITRAC(J).EQ.I.AND.IUNIV(J).EQ.IUNIV(I)) 1 CALL TRACTR (I,J,X,Y,KX,KY,CHAR,FLAG,IUNIV(I)) 10010 CONTINUE IF (WARP(I).EQ.0.AND.FLAG) GOTO 10013 IF (CHAR.LT.'1'.OR.CHAR.GT.'8') GOTO 10014 C C * WE HAVE RAMMED A SHIP C DECODE(1,10016,CHAR) K 10016 FORMAT (I1) ENERGY(I)=ENERGY(I)-100 IF (.NOT.XSHIP(K)) GOTO 10017 ENERGY(K)=ENERGY(K)-100 CALL SENT(K,10) 10017 WARP(I)=0. WARP(K)=0. CALL SENT(I,9) GO TO 10013 C C * RAMMED (DOCKED) A BASE C 10014 IF (CHAR.NE.'B') GOTO 10020 IU=IUNIV(I) US = .FALSE. IIIX = INT(X) IIIY = INT(Y) IOFF=(IU-1)*20 DO 10021 III=1,20,2 IF (IBASE(I,IOFF+III).EQ.IIIX.AND.IBASE(I,IOFF+III+1).EQ.IIIY) 1 US = .TRUE. 10021 CONTINUE IF (US) GOTO 20000 C C BASE WAS ENEMY (OOPS!) C CALL SENT(I,33) WARP(I)=0 ENERGY(I)=ENERGY(I)-100 GOTO 10013 C C BASE WAS FRIENDLY C 20000 CALL SENT(I,1) 20001 DOCKED(I)=.TRUE. IHOME(I)=0 ITRAC(I)=0 TORPS(I)=ICNTRL(5) WARP(I)=0. ENERGY(I)=10000 IACTN(I)=0 SCAN(I)=10 NHOM(I)=ICNTRL(4) SHIELD(I)=0 DO 10022 ICOMP=1,8 IDAMGE(I,ICOMP)=0 10022 CONTINUE GO TO 10013 10020 IF (CHAR.NE.'*') GOTO 10025 C C * HIT A STAR C CALL SENT(I,2) ENERGY(I)=ENERGY(I)-200 WARP(I)=0. GO TO 10013 10025 IF (CHAR.NE.'+'.AND.CHAR.NE.'^') GOTO 10027 C C * HIT A TORPEDO C CALL SENT(I,4) IF (CHAR.NE.'^') GOTO 10029 V=300. GO TO 10030 10029 V=500. 10030 CALL DAMAGE(I,V,V) CALL TFIND(K,KX,KY,IUNIV(I)) CALL UNIVIN(KX,KY,'.',IUNIV(I)) IF (K.EQ.0.OR.K.EQ.I) GOTO 10013 CALL SENT(K,5) SCORE(K)=SCORE(K)+V IF (ENERGY(I).GT.0) GOTO 10013 CALL SENT(K,22) SCORE(K)=SCORE(K)+2000. CALL RESET(I) C GO TO 10013 10027 IF (CHAR.NE.'H') GOTO 10038 C C * HIT A HYPERSPACE PORT C CALL SENT(I,17) IU=HYPER(I,2) KX=IHYP(IU,HYPER(I,1),1) KY=IHYP(IU,HYPER(I,1),2) C C * PUT THE SHIP NEAR THE DESTINATION PORT IF POSSIBLE C DO 10058 II=(KX-1),(KX+1) DO 10058 IJ=(KY-1),(KY+1) CALL UNIV(II,IJ,CHAR,IU) IF (CHAR.NE.'.') GOTO 10058 CALL UNIVIN(II,IJ,SHIP,IU) CALL UNIVIN(IX,IY,'.',IUNIV(I)) XCORD(I)=II YCORD(I)=IJ XCORD(I)=XCORD(I)+.5 YCORD(I)=YCORD(I)+.5 IUNIV(I)=IU GOTO 100 10058 CONTINUE C C * IF WE ARE HERE WE DIDN'T FIND AN EMPTY SPOT ( VERY UNLIKELY) C CALL SENT(I,18) 100 WARP(I)=0. GO TO 10013 10038 IF (CHAR.NE.'#') GOTO 10066 C C * RUN INTO THE "BLACK HOLE" (NICE FLYING) C CALL SENT(I,15) CALL RESET(I) GO TO 10013 10066 IF (CHAR.NE.'R') GOTO 10068 C C * HIT A RANDOM HYPERSPACE PORT C CALL SENT(I,19) C C * FIND A NEW EMPTY LOCATION C 10072 KX=RAN(I1,I2)*IMAXX+1. IF (KX.GT.IMAXX) KX=IMAXX KY=RAN(I1,I2)*IMAXY+1. IF (KY.GT.IMAXY) KY=IMAXY KU=RAN(I1,I2)*IUNIMX+1. IF (KU.GT.IUNIMX) KU=IUNIMX CALL UNIV(KX,KY,CHAR,KU) IF (CHAR.NE.'.') GOTO 10072 XCORD(I)=KX YCORD(I)=KY XCORD(I)=XCORD(I)+.5 YCORD(I)=YCORD(I)+.5 WARP(I)=0. CALL UNIVIN(IX,IY,'.',IUNIV(I)) CALL UNIVIN(KX,KY,SHIP,KU) IUNIV(I)=KU GO TO 10013 C 10068 IF (CHAR.NE.'@') GOTO 10082 C C * BUMPED INTO AN ANTI-MATTER POD C CALL SENT(I,27) CALL DAMAGE(I,250.,500.) GO TO 10013 C 10082 XCORD(I)=X YCORD(I)=Y CALL UNIVIN(IX,IY,'.',IUNIV(I)) CALL UNIVIN(KX,KY,SHIP,IUNIV(I)) 10084 CONTINUE 10013 CONTINUE IF (ENERGY(I).GT.0) GOTO 10085 CALL SENT(I,16) CALL RESET(I) C 10085 IF (IDAMGE(I,4).GT.0.AND.CLON(I)) CALL CLOK(I) IF (IDAMGE(I,8).GT.0) CALL DRAIN(I) FNEAR(IUNIV(I),I) = .FALSE. IF (FLOAD(IUNIV(I),I).EQ.0) GOTO 10003 IIX=FXCORD(IUNIV(I),I) IIY=FYCORD(IUNIV(I),I) CALL COURSE(XCORD(I),YCORD(I),IIX,IIY,EDIR,EDIS) IF (EDIS.LT.5) FNEAR(IUNIV(I),I) = .TRUE. 10003 CONTINUE 10001 CONTINUE RETURN END