DEFINE(DIG0,48) # ASCII '0' SUBROUTINE PHASER # # * FIRE PHASERS # INCLUDE COMMON.RAT COMMON /DOLOOP/ SHIPS INTEGER SHIPS(8) REAL DX(3),DY(3) BYTE CHAR CALL PERM(SHIPS, I1, I2) DO ISHP = 1, 8 [ I = SHIPS(ISHP) IF (PHA(I) >= 0.) [ # # * FIRE 3 BAND WIDE BEAM (NOTE EACH BAND HAS ITS OWN HIT OR MISS MESSAGE) # DX(2)=XCORD(I) DY(2)=YCORD(I) IF (((PHA(I) >= 45.) & (PHA(I) < 135.)) | ((PHA(I) >= 225.) & (PHA(I) < 315.))) [ DX(1)=DX(2)-1. DX(3)=DX(2)+1. DY(1)=DY(2) DY(3)=DY(2) ] ELSE [ DX(1)=DX(2) DX(3)=DX(2) DY(1)=DY(2)-1. DY(3)=DY(2)+1. ] DO IZ=1, 3, 2 [ IF (DX(IZ) >= 101.) [ DX(IZ)=DX(IZ)-100. ] ELSE IF (DX(IZ) < 1.) [ DX(IZ)=DX(IZ)+100. ] IF (DY(IZ) >= 101.) [ DY(IZ)=DY(IZ)-100. ] ELSE IF (DY(IZ) < 1.) [ DY(IZ)=DY(IZ)+100. ] ] KX = XCORD(I) KY = YCORD(I) NMISS = 0 DO IZ=1, 3 [ X1=DX(IZ) Y1=DY(IZ) DO IIT=1, 10 [ CALL MOVE(X1,Y1,X,Y,PHA(I),10.,CHAR,UNIV,EMPTY) IX = X IY = Y IF ((CHAR != EMPTY) & ((KX != IX) | (KY != IY))) [ BREAK ] ELSE [ X1=X Y1=Y ] ] IF ((CHAR >= '1') & (CHAR <= '8')) [ # hit on ship K = CHAR-DIG0 IF (SHPACT(K)) [ DIST = DSTNCE(XCORD(I),YCORD(I),X,Y) EN=900./(4.+DIST) # make sure we don't shoot ourselves IF (K != I) [ CALL SENT(I,6) # phaser hit alien CALL SENT(K,14) # phaser attack CALL DAMAGE(I,K,EN,PHA(I)) ] ] ELSE [ CALL SENT(I,21) # hit ghost ship ] ] ELSE IF ((CHAR == '+' ) ) [ CALL SENT(I,7) # phaser hit torpedo ] ELSE IF ((CHAR == '^')) [ CALL SENT(I,7) # phaser hit torpedo (seeker) IF (RAN(I1,I2) > .5) UNIV(IX,IY)=EMPTY ] ELSE IF (CHAR == '*') [ CALL SENT(I,11) # phaser hit star ] ELSE IF (CHAR == 'B') [ CALL SENT(I,12) # base under attack ] ELSE IF (CHAR == '@') [ CALL SENT(I,25) # phaser hit anti-matter pod ] ELSE IF (CHAR < 0) [ CALL SENT(I, 35) # phaser hit energy net ] ELSE [ NMISS = NMISS+1 ] ] PHA(I)=-1. IF (NMISS == 3) CALL SENT(I,8) # phaser missed ] ] RETURN END