SUBROUTINE MANTI # # * DEAL WITH ANTI-MATTER # # # MOVE ANTI-MATTER PODS # INCLUDE COMMON.RAT COMMON /DOLOOP/ SHIPS INTEGER SHIPS(8) BYTE CHAR PARAMETER XSIZE = 20 #EXPLOSION SIZE INTEGER IPX(XSIZE), IPY(XSIZE) # # * THE FOLLOWING DATA DESCIBES THE EXPLOSION PATTERN FOR # ANTI-MATTER PODS # DATA IPX/-1,-1,-1, 0, 0, 1, 1, 1,-3,-2,-2,-2, 0, 0, 0, 0, 2, 2, 2, 3/ DATA IPY/ 1, 0,-1, 1,-1, 1, 0,-1, 0, 2, 0,-2, 3, 2,-2,-3, 2, 0,-2, 0/ INTEGER*2 HYPERX(6), HYPERY(6) DATA HYPERX / 20, 50, 80, 20, 50, 80 / DATA HYPERY / 75, 70, 75, 25, 30, 25 / CALL PERM(SHIPS, I1, I2) DO ISHP = 1, 8 [ I = SHIPS(ISHP) IF (IPODST(I) == 1) [ # pod launch requested CALL MOVE(XCORD(I),YCORD(I),X1,Y1,DPOD(I),10.,CHAR,UNIV,EMPTY) IX=X1 IY=Y1 KX=XCORD(I) KY=YCORD(I) # make sure it clears the ship IF ((KX == IX) & (KY == IY)) CALL MOVE(X1,Y1,X,Y,DPOD(I),10.,CHAR,UNIV,EMPTY) ELSE [ X=X1 Y=Y1 ] IX=X IY=Y IF (CHAR == EMPTY) [ # successul launch UNIV(IX,IY)='@' XPOD(I)=X YPOD(I)=Y WPOD(I)=5. # move at warp 5 IPODST(I)=2 CALL SENT(I,28) # pod launched ] ELSE [ CALL SENT(I,23) # pod blocked IPODST(I)=0 ] ] IF (IPODST(I) == 2) [ # pod is on the move IX=XPOD(I) IY=YPOD(I) IF (UNIV(IX,IY) != '@') [ CALL SENT(I,24) # pod destroyed IPODST(I)=4 ] ELSE [ CALL MOVE(XPOD(I),YPOD(I),X,Y,DPOD(I),WPOD(I),CHAR,UNIV,EMPTY) SWITCH ( CHAR ) [ CASE EMPTY, '+', '^': UNIV(IX,IY)=EMPTY IX=X IY=Y UNIV(IX,IY)='@' XPOD(I)=X YPOD(I)=Y #IF IT HIT A TORP, REQUEST DETONATION IF ( (CHAR=='+') | (CHAR=='^') ) IPODST(I) = 3 CASE 'H': KX = HYPERX(HYPER(I)) KY = HYPERY(HYPER(I)) DO II=(KX-1), (KX+1) [ DO IJ=(KY-1), (KY+1) [ IF (UNIV(II,IJ) == EMPTY) [ UNIV(II,IJ)='@' UNIV(IX,IY)=EMPTY XPOD(I)=II YPOD(I)=IJ XPOD(I)=XPOD(I)+.5 YPOD(I)=YPOD(I)+.5 IPODST(I) = 3 BREAK 2 ] ] ] CASE 'R': REPEAT [ KX=RAN(I1,I2)*100.+1. KY=RAN(I1,I2)*100.+1. ] UNTIL (UNIV(KX,KY) == EMPTY) XPOD(I)=KX YPOD(I)=KY XPOD(I)=XPOD(I)+.5 YPOD(I)=YPOD(I)+.5 UNIV(IX,IY)=EMPTY UNIV(KX,KY)='@' IPODST(I) = 3 DEFAULT: # hit something solid, deflect pod & maybe detonate DPOD(I)= DPOD(I)+ (RAN(I1,I2)-0.5)*360. IF( RAN(I1,I2) < .25 ) IPODST(I) = 3 ] ] ] IF (IPODST(I) == 3) [ # pod detonation requested IX=XPOD(I) IY=YPOD(I) IF (UNIV(IX,IY) != '@') [ CALL SENT(I,24) # pod destroyed IPODST(I)=4 ] ELSE [ IPODST(I)=4 UNIV(IX,IY) = EMPTY CALL SENT(I,29) # pod detonated DO L1=1, XSIZE [ #check each char cell in explosion pattern KX=IX+IPX(L1) IF (KX >= 101) KX=KX-100 IF (KX < 1) KX=KX+100 KY=IY+IPY(L1) IF (KY >= 101) KY=KY-100 IF (KY < 1) KY=KY+100 CHAR=UNIV(KX,KY) # what did explosion hit? SWITCH ( CHAR ) [ CASE '1' - '8': CONTINUE #handle hits on ships by distance later CASE 'H': CONTINUE CASE 'B': # randomly relocate the base if within 1 unit IF ( L1 <= 8 ) [ UNIV(KX,KY)=EMPTY REPEAT [ IIX=RAN(I1,I2)*100.+1. IIY=RAN(I1,I2)*100.+1. ] UNTIL (UNIV(IIX, IIY) == EMPTY) UNIV(IIX,IIY)='B' ] CASE BHOLE: CALL SENT(I,31) # ieeeee! UNIV(KX,KY)=EMPTY REPEAT [ IIX=RAN(I1,I2)*100.+1. IIY=RAN(I1,I2)*100.+1. ] UNTIL (UNIV(IIX, IIY) == EMPTY) HOLX=IIX HOLY=IIY UNIV(IIX,IIY)=BHOLE CASE '@': # chain reaction - detonate other pod CALL PFIND( IP, KX, KY ) IPODST(IP) = 3 DEFAULT: # everything else get's destroyed UNIV(KX,KY)=EMPTY ] ] #end of explosion pattern loop # # figure ship damage DO IZ = 1, 8 [ D = DSTNCE(XCORD(IZ),YCORD(IZ),XPOD(I),YPOD(I)) IF (D > 4) NEXT # ship's out of range IS=7.-D E=1500. - D* 300. IF (SHPACT(IZ)) [ IF (I != IZ) CALL SENT(I,32) # pod hit alien CALL SENT(IZ,30) # pod explosion! SCAN(IZ) = MAX( SCAN(IZ)-IS, 0 ) CALL DAMAGE(I,IZ,E,500.) ] ELSE CALL SENT(I,21) # hit ghost ship ] ] ] ELSE [ CONTINUE # other pod status requires no action ] ] RETURN END SUBROUTINE PFIND( IOWNR, IPX, IPY ) INCLUDE COMMON.RAT # # * FIND OUT WHO OWNS THE POD AT A GIVEN X, Y # DO ISHP = 1, 8 [ IF ( IPODST(ISHP) == 2 ) [ IX = XPOD(ISHP) IY = YPOD(ISHP) IF ( (IX==IPX) & (IY==IPY)) [ IOWNR = ISHP RETURN ] ] ] IOWNR = 0 #GHOST POD? RETURN END