DEFINE(DIG0,48) # ASCII '0' SUBROUTINE MSHIPS INCLUDE COMMON.RAT COMMON /DOLOOP/ SHIPS INTEGER SHIPS(8),HSPLOC(2,6) # BYTE CHAR,SHIP,TRAIL DATA HSPLOC/20,75, 50,70, 80,75, 20,25, 50,30, 80,25/ # CALL PERM(SHIPS, I1, I2) DO I = 1, 8 [ ISHP = SHIPS(I) # move 'em in permuted order IF (SHPACT(ISHP)) [ IF (CLOAK(ISHP)) [ # max warp restricted if you're cloaked WARP(ISHP)= MIN( WARP(ISHP), 4. ) ENERGY(ISHP)=ENERGY(ISHP)-CDRAIN ] SHIP = ISHP + DIG0 ENERGY(ISHP)=ENERGY(ISHP)-WARP(ISHP)/2 IF (NET(ISHP)) [ TRAIL = -ISHP ENERGY(ISHP) = ENERGY(ISHP) - NDRAIN*WARP(ISHP)/10. ] ELSE [ TRAIL = EMPTY ] TRUDIR = DIR(ISHP) TRUWRP = WARP(ISHP) IF (TRBEAM(ISHP) != 0 & SHPACT(TRBEAM(ISHP))) [ ENERGY(ISHP) = ENERGY(ISHP) - TDRAIN # calc the effect of his beam on his own movement CALL DIRDIS(XCORD(ISHP),YCORD(ISHP), XCORD(TRBEAM(ISHP)),YCORD(TRBEAM(ISHP)),TDIR,TDIS) CALL POLADD(TRUDIR, TRUWRP, TDIR, 8./SQRT(MAX(1.,TDIS-6.)), TRUDIR, TRUWRP) ] DO ITRAC = 1, 8 # calc effect of everyone elses beams on his movement IF ( SHPACT(ITRAC) & TRBEAM(ITRAC)==ISHP & ITRAC!=ISHP ) [ CALL DIRDIS(XCORD(ISHP),YCORD(ISHP),XCORD(ITRAC),YCORD(ITRAC), TDIR,TDIS) CALL POLADD(TRUDIR, TRUWRP, TDIR, 8./SQRT(MAX(1., TDIS-6.)), TRUDIR, TRUWRP) ] IF (TRUWRP > 10.) TRUWRP = 10. IX=XCORD(ISHP) IY=YCORD(ISHP) CALL MOVE(XCORD(ISHP),YCORD(ISHP),X,Y,TRUDIR,TRUWRP,CHAR,UNIV,EMPTY) KX=X KY=Y IF (CHAR <= '8' & CHAR >= '1') [ KSHP = CHAR-DIG0 # we have rammed a ship (KSHP) ENERGY(ISHP)=ENERGY(ISHP)-100. IF (SHPACT(KSHP)) [ ENERGY(KSHP)=ENERGY(KSHP)-100. CALL SENT(KSHP,10) # "collision" ] WARP(ISHP)=0. WARP(KSHP)=0. CALL SENT(ISHP,9) # "rammed alien" # ] ELSE IF (CHAR == 'B') [ # rammed (docked) a base CALL SENT(ISHP,1) # "docked" TORPS(ISHP)= MAXTRP WARP(ISHP)=0. ENERGY(ISHP)=10000. SHIELD(ISHP)=0. # give him a new pod if old one exploded IF ( IPODST(ISHP) == 4 ) IPODST(ISHP)=0 SCAN(ISHP)=9 # replentish inactive homers NHOM(ISHP) = 0 DO II=1, MAXHOM [ IF ( WHOM(ISHP,II) == 0 ) NHOM(ISHP) = NHOM(ISHP) + 1 ] TRBEAM(ISHP) = 0 #turn off his tractor beam ] ELSE IF (CHAR == '*') [ # hit a star CALL SENT(ISHP,2) # "hit a star" ENERGY(ISHP)=ENERGY(ISHP)-200. WARP(ISHP)=0. # ] ELSE IF ((CHAR == '+' ) | (CHAR == '^')) [ # hit a torpedo CALL TFIND(KSHP,KX,KY) IF (KSHP != 0 & (KSHP != ISHP)) [ CALL SENT(ISHP,4) # "torpedo hit us" IF (CHAR == '^') [ V=300. ] ELSE [ V=500. ] CALL DAMAGE(KSHP,ISHP,V,500.) CALL SENT(KSHP,5) # "torpedo hit alien" UNIV(KX,KY)=EMPTY ] ] ELSE IF (CHAR == 'H') [ # hit a hyperspace port 10 CONTINUE CALL SENT(ISHP,17) # "hyperspace" KX = HSPLOC(1,HYPER(ISHP)) KY = HSPLOC(2,HYPER(ISHP)) # # put the ship near the destination port if possible DO II=(KX-1), (KX+1) [ DO IJ=(KY-1), (KY+1) [ IF (UNIV(II,IJ) == EMPTY) [ UNIV(II,IJ)=SHIP UNIV(IX,IY)=TRAIL XCORD(ISHP)=II YCORD(ISHP)=IJ XCORD(ISHP)=XCORD(ISHP)+.5 YCORD(ISHP)=YCORD(ISHP)+.5 GOTO 102 ] ] ] # if we are here we didn't find an empty spot ( very unlikely) CALL SENT(ISHP,18) # "port blocked" 102 WARP(ISHP)=0. # ] ELSE IF (CHAR == BHOLE) [ # run into the "black hole" ( nice flying) 20 CONTINUE CALL SENT(ISHP,15) # "we are being drawn into ..." CALL RESET(ISHP) ] ELSE IF (CHAR == 'R') [ # hit a random hyperspace port 30 CONTINUE CALL SENT(ISHP,19) # "random hyperspace" # find a new empty location REPEAT [ KX=RAN(I1,I2)*100.+1. KY=RAN(I1,I2)*100.+1. ] UNTIL (UNIV(KX,KY) == EMPTY) XCORD(ISHP)=KX YCORD(ISHP)=KY XCORD(ISHP)=XCORD(ISHP)+.5 YCORD(ISHP)=YCORD(ISHP)+.5 WARP(ISHP)=0. UNIV(IX,IY)=TRAIL UNIV(KX,KY)=SHIP ] ELSE IF (CHAR == '@') [ # bumped into an anti-matter pod CALL SENT(ISHP,27) # "metal object near" CALL DAMAGE(0,ISHP,250.,500.) ] ELSE IF (CHAR < 0) [ # bumped into energy net ENERGY(ISHP) = ENERGY(ISHP) - 200 IF (CHAR == -ISHP) [ # it's his own net, move him thru it REPEAT [ X2 = X Y2 = Y CALL MOVE(X2,Y2,X,Y,TRUDIR,8.,CHAR,UNIV,EMPTY) ] UNTIL (UNIV(IFIX(X), IFIX(Y)) != -ISHP) KX = X KY = Y CHAR = UNIV(KX, KY) IF (CHAR == 'H') GOTO 10 IF (CHAR == BHOLE) GOTO 20 IF (CHAR == 'R') GOTO 30 IF (CHAR == EMPTY) [ XCORD(ISHP) = X YCORD(ISHP) = Y UNIV(IX,IY) = TRAIL UNIV(KX, KY) = SHIP ] ELSE [ CALL SENT(ISHP, 36) # "net blocked" WARP(ISHP) = 0. ] ] ELSE [ CALL SENT(ISHP, 33) # "hit net" DIR(ISHP) = TRUDIR - 180. IF (DIR(ISHP) < 0.) DIR(ISHP) = DIR(ISHP) + 360. ] ] ELSE [ XCORD(ISHP)=X YCORD(ISHP)=Y IF (UNIV(IX,IY) != -ISHP) UNIV(IX,IY)=TRAIL UNIV(KX,KY)=SHIP ] IF (ENERGY(ISHP) <= 0.) [ CALL SENT(ISHP,16) # "dylithium crystals ..." CALL RESET(ISHP) ] ] ] RETURN END SUBROUTINE RESET(ISHP) # # * RE-INCARNATE DESTROYED SHIPS # INCLUDE COMMON.RAT COMMON /ACCUM/ ACCUME LOGICAL*1 ACCUME SHPACT(ISHP) = .FALSE. #SHIP NOT ACTIVE ENERGY(ISHP) = 10000. #RESET ENERGY WARP(ISHP) = 0. #STOP MOVEMENT TORPS(ISHP) = MAXTRP #REFILL TORPS SHIELD(ISHP) = 0. #DROP SHIELDS SCAN(ISHP) = 9 #SET FULL SCAN VISIBILITY CLOAK(ISHP) = .FALSE. #TURN OFF CLOAKING DEVICE NET(ISHP) = .FALSE. #TURN OFF ENERGY NET TRBEAM(ISHP) = 0 #TURN OFF HIS TRACTOR BEAM DO I = 1, 8 IF (TRBEAM(I) == ISHP) TRBEAM(I) = 0 #TURN OFF OTHER'S BEAMS ON HIM IF ( ACCUME) [ SCORE(ISHP)=SCORE(ISHP)-1000. ] ELSE [ SCORE(ISHP)=0. ] CALL SENT(ISHP,3) #SEND HIM THE DEATH MESSAGE IX=XCORD(ISHP) IY=YCORD(ISHP) UNIV(IX,IY)=EMPTY #REMOVE HIS SHIP DO I = 1, MAXHOM [ #CLEAN UP HIS ACTIVE HOMERS IF ( WHOM(ISHP,I) != 0 ) [ IX = XHOM(ISHP,I) IY = YHOM(ISHP,I) IF ( UNIV(IX,IY) == '^' ) UNIV(IX,IY) = EMPTY ] WHOM(ISHP,I)=0 #RESET HOMERS TO IDLE ] NHOM(ISHP) = MAXHOM #REPLENTISH HOMERS DO I = 1, 100 #CLEAN UP HIS ENERGY NETS DO J = 1, 100 IF (UNIV(J, I) == -ISHP) UNIV(J, I) = EMPTY # IF POD ISN'T IDLE OR DESTROYED, ERASE IT IF ( (IPODST(ISHP)!=0) & (IPODST(ISHP)!=4) ) [ IX = XPOD(ISHP) #CLEAN UP HIS ANTI-MATTER POD IY = YPOD(ISHP) IF ( UNIV(IX,IY) == '@' ) UNIV(IX,IY) = EMPTY ] IPODST(ISHP) = 0 #RESET POD STATUS TO IDLE # DEPOSIT HIS SHIP IN A RANDOM EMPTY SPOT REPEAT [ IX=RAN(I1,I2)*100.+1. IY=RAN(I1,I2)*100.+1. ] UNTIL (UNIV(IX,IY) == EMPTY) UNIV(IX, IY) = ISHP + DIG0 XCORD(ISHP)=IX YCORD(ISHP)=IY XCORD(ISHP)=XCORD(ISHP)+.5 YCORD(ISHP)=YCORD(ISHP)+.5 RETURN END