DEFINE(DIG0,48) # ASCII '0' SUBROUTINE MTORPS # # * MOVE ALL ACTIVE TORPEDOES # INCLUDE COMMON.RAT COMMON /DOLOOP/ SHIPS INTEGER SHIPS(8) BYTE CHAR LOGICAL*1 MYTORP CALL PERM(SHIPS, I1, I2) DO ISHP = 1, 8 [ I = SHIPS(ISHP) DO K=1, 10 [ IX=TLOCS(I,K,1) IY=TLOCS(I,K,2) # # * MAKE SURE THE TORPEDO IS STILL THERE AND ACTIVE # IF ((UNIV(IX,IY) == '+') & (TDIR(I,K) >= 0.)) [ CALL MOVE(TLOCS(I,K,1),TLOCS(I,K,2),X,Y,TDIR(I,K),10.,CHAR,UNIV,EMPTY) KX=X KY=Y IF (CHAR != EMPTY) [ IF ( !MYTORP(I,KX,KY,CHAR) ) [ CALL THIT(I,KX,KY,CHAR,TDIR(I,K),500.) UNIV(IX,IY)=EMPTY TDIR(I,K)=-1. ] ] ELSE [ UNIV(IX,IY)=EMPTY UNIV(KX,KY)='+' TLOCS(I,K,1)=X TLOCS(I,K,2)=Y ] ] ELSE [ TDIR(I,K)=-1. ] ] ] RETURN END LOGICAL*1 FUNCTION MYTORP( MYSHP, IX, IY, CHAR ) # IS "CHAR" AT SQUARE "IX,IY" A TORP THAT BELONGS TO "MYSHP"? INTEGER*2 MYSHP, IX, IY BYTE CHAR INCLUDE COMMON.RAT IF ( CHAR == '^' ) [ #CHECK IF IT'S MYSHP'S HOMER DO J = 1, MAXHOM [ IF ( WHOM(MYSHP,J) <= 0 ) NEXT #HOMER J ISN'T ACTIVE JX = XHOM(MYSHP,J) JY = YHOM(MYSHP,J) IF ( (JX==IX) & (JY==IY) ) RETURN .TRUE. ] ] ELSE IF ( CHAR == '+' ) [ #CHECK IF IT'S MYSHP'S TORP DO J = 1, MAXTRP [ IF ( TDIR(MYSHP,J) < 0 ) NEXT #TORP J ISN'T ACTIVE JX = TLOCS(MYSHP,J,1) JY = TLOCS(MYSHP,J,2) IF ( (JX==IX) & (JY==IY) ) RETURN .TRUE. ] ] RETURN .FALSE. END SUBROUTINE TORPI # # * FIRE TORPEDOES # INCLUDE COMMON.RAT COMMON /DOLOOP/ SHIPS INTEGER SHIPS(8) BYTE CHAR LOGICAL*1 MYTORP CALL PERM(SHIPS, I1, I2) DO ISHP = 1, 8 [ I = SHIPS(ISHP) IF (LAUNCH(I) >= 0.) [ CALL MOVE(XCORD(I),YCORD(I),X1,Y1,LAUNCH(I),10.,CHAR,UNIV,EMPTY) IX=X1 IY=Y1 KX=XCORD(I) KY=YCORD(I) # * MAKE SURE IT MOVED OUT OF THE FIRER'S SQUARE IF ((KX == IX) & (KY == IY)) [ CALL MOVE(X1,Y1,X,Y,LAUNCH(I),10.,CHAR,UNIV,EMPTY) ] ELSE [ X=X1 Y=Y1 ] IX=X IY=Y IF (CHAR == EMPTY) [ UNIV(IX,IY)='+' ITORP = IT(I) IF (TDIR(I,ITORP) >= 0.) [ # ERASE OLD TORP THAT WAS STILL ACTIVE KX=TLOCS(I,ITORP,1) KY=TLOCS(I,ITORP,2) IF (UNIV(KX,KY) == '+') [ UNIV(KX,KY)=EMPTY ] ] TLOCS(I,ITORP,1)=X TLOCS(I,ITORP,2)=Y TDIR(I,ITORP)=LAUNCH(I) IT(I)=ITORP+1 IF (IT(I) > 10) [ IT(I)=1 ] LAUNCH(I)= -1. ] ELSE [ # * HIT SOMETHING IF ( !MYTORP(I,IX,IY,CHAR) ) [ CALL THIT(I,IX,IY,CHAR,LAUNCH(I),500.) LAUNCH(I)= -1. ] ] ] ] RETURN END SUBROUTINE THIT( ISHP, IX, IY, CHAR, DIREC, ENER ) # # * HANDLE TORPEDO HITS # INCLUDE COMMON.RAT BYTE CHAR IF ((CHAR == 'H') | (CHAR == 'R')) [ # * TORPEDO HIT ON HYPER SPACE PORT CONTINUE # ] ELSE IF ((CHAR >= '1') & (CHAR <= '8')) [ # * TORPEDO HIT ON SHIP KHSHP = CHAR-DIG0 IF (SHPACT(KHSHP)) [ IF (KHSHP != ISHP) CALL SENT(ISHP,5) #torp hit alien CALL SENT(KHSHP,4) #torp hit us CALL DAMAGE(ISHP,KHSHP,ENER,DIREC) ] ELSE CALL SENT(ISHP,21) #torp hit ghost ] ELSE IF (CHAR == BHOLE) # * TORPEDO HIT ON BLACK HOLE - THE HOLE PREVAILS! ; ELSE IF (CHAR == '*') [ CALL SENT(ISHP,13) # torpedo hit star ] ELSE IF (CHAR == 'B') [ CALL SENT(ISHP,12) # base under attack SCORE(ISHP)=SCORE(ISHP)-200. ] ELSE IF ((CHAR == '+' ) | (CHAR == '^')) [ CALL SENT(ISHP,20) # torpedo hit torpedo UNIV(IX,IY)=EMPTY ] ELSE IF (CHAR == '@') [ CALL SENT(ISHP,26) # torpedo hit anti-matter pod CALL PFIND( IP, IX, IY ) #WHICH POD? IF ( IP != 0 ) IPODST(IP) = 3 #REQUEST DETONATION ] ELSE IF (CHAR < 0) [ CALL SENT(ISHP, 34) # torpedo hit energy net UNIV(IX, IY) = EMPTY ] ELSE [ # * ANYTHING ELSE GETS DESTROYED UNIV (IX,IY) = EMPTY ] RETURN END SUBROUTINE TFIND( IOWNR, ITRPX, ITRPY ) INCLUDE COMMON.RAT # # * FIND OUT WHO OWNS THE TORPEDO AT A GIVEN X, Y # DO ISHP = 1, 8 [ DO ITRP = 1, MAXTRP [ IF (TDIR(ISHP,ITRP) >= 0.) [ IX = TLOCS(ISHP,ITRP,1) IY = TLOCS(ISHP,ITRP,2) IF ((IX == ITRPX) & (IY == ITRPY)) [ IOWNR = ISHP RETURN ] ] ] DO ITRP=1, MAXHOM [ IF (WHOM(ISHP,ITRP) != 0) [ IX = XHOM(ISHP,ITRP) IY = YHOM(ISHP,ITRP) IF ((IX == ITRPX) & (IY == ITRPY)) [ IOWNR = ISHP RETURN ] ] ] ] IOWNR = 0 #GHOST TORP? RETURN END