10 ********** INITIALIZATION **********
20 *** CURSOR CONTROL CHARACTERS ***
30 U0=193 &* UP.
40 D0=32  &* DOWN.
50 R0=195 &* RIGHT.
60 L0=196 &* LEFT.
70 T0=200 &* TOP.
80 B0=007 &* BELL.
90 C0=027 &* CLEAR DOESN'T WORK.
100 S0=022 &* SYNC IDLE.
110 E0=210 &* ERASE END OF LINE.
120 M0=41 &* CR.
130 DIM I(10)
140 I(1)=U0,I(2)=D0,I(3)=R0
150 I(4)=L0,I(5)=T0,I(6)=C0
160 I(7)=B0,I(8)=S0,I(9)=E0
170 I(10)=M0
180 CHANGE I TO C$
190 X$=C$(:6,1)
200 U$=X$+C$(:1,1),D$=C$(:2,1),R$=X$+C$(:3,1)
210 L$=X$+C$(:4,1),T$=X$+C$(:5,1)
220 B$=C$(:7,1),S$=C$(:8,1),E$=X$+C$(:9,1)
230 C$=C$(:10,1)
240 T$=T$+T$
250 *** FRIENDLY SHIPS ***
260 DIM Z(9,2) &* SHIP COORDINATES.
270 Z9=9 &* MAX NUMBER OF FRIENDLY SHIPS.
280 *** UNFRIENDLY SHIPS ***
290 DIM Q(30,3)
300 Q9=30 &* MAX NUMBER OF UNFRIENDLY SHIPS.
310 *** BLACK HOLES ***
320 DIM W(20,2)
330 W9=10 &* MAX NUMBER OF BLACK HOLES.
340 *** COORDINATE INDICES ***
350 X=1
360 Y=2
370 *** PLAYING BOARD ***
380 DIM P(80,30) &* (X,Y) COORDINATES.
390 MAT P=ZER
400 X9=79 &* MAX VALUE OF X(MUST BE ODD).
410 Y9=23 &* MAX VALUE OF Y(MUST BE ODD).
420 K8=X9/2
430 K9=Y9/2
440 X0=MIN(X9,Y9)/2
450 *** SQUARE CODES ***
460 P0=0 &* EMPTY.
470 P1=1 &* FRIENDLY SKIP = 10 + SHIP #.
480 P2=2 &* UNFRIENDLY SHIP.
490 P3=3 &* BLACK HOLE.
500 P4=4 &* SHIELD.
510 *** FUNCTIONS ***
520 DEF FNR(X)=INT(RND(1)*X+1) &* RANDOM NUMBER FROM 1 TO X.
530 PRINT "TYPE DIFFICULTY FACTOR (21-)";
540 INPUT C8
550 IF C8<21 GOTO 530
560 GOSUB 810
570 GOSUB 1930
580 GOTO 3760
590 ******************************
600 *** RANDOM DISPERSAL OF PLAYING PIECES.
610 * N1 = # OBJECTS, N2=OBJECT CODE
 2
620 FOR I=1 TO N1
630 T1=FNR(INT(X9/2))*2  &* X COORD.
640 T2=FNR(Y9)
650 IF P(T1,T2)<>P0 GOTO 630
660 ON N2 GOTO 670 , 710 , 750
670 Z(I,X)=T1
680 Z(I,Y)=T2
690 P(T1,T2)=10+I &* FRIENDLY CODE.
700 GOTO 780
710 Q(I,X)=T1
720 Q(I,Y)=T2
730 P(T1,T2)=N2 &* UNFRIENDLY.
740 GOTO 780
750 W(I,X)=T1
760 W(I,Y)=T2
770 P(T1,T2)=N2 &* BLACK HOLE.
780 NEXT I
790 RETURN
800 ******************************
810 *** INITIAL DISPERSAL OF PLAYING PIECES.
820 N1=Q9 &* UNFRIENDLIES.
830 N2=P2
840 GOSUB 600
850 N1=Z9 &* FRIENDLIES.
860 N2=P1
870 Z8=Z9
880 GOSUB 600
890 N1=W9 &* BLACK HOLES.
900 N2=P3
910 GOSUB 600
920 RETURN
930 ******************************
940 *** CLEAR SCREEN.
950 PRINT T$''E$
960 FOR I=1 TO Y9
970 PRINT E$
980 NEXT I
990 GOSUB 5240
1000 RETURN
1010 ******************************
1020 *** INITIALIZE OUTPUT.
1030 O$=''
1040 A1=0
1050 RETURN
1060 ******************************
1070 *** ADD CHARACTER TO OUTPUT STRING.
1080 * C = CHAR TO ADD
1090 X$=$(C)
1100 A2=LEN(X$)
1110 IF A2+A1<128 THEN 1170
1120 GOSUB 1220
1130 O$=X$
1140 A1=A2
1150 RETURN
1160 ******************************
1170 O$=O$+X$
1180 A1=A1+A2
1190 RETURN
1200 RETURN
1210 ******************************
1220 *** FLUSH OUTPUT STRING.
1230 PRINT O$''S$
1240 RETURN
1250 ******************************
1270 * (D1,D2)=DESIRED COORDS.
1280 Z1=D1-W1 &* DELTA X.
1290 Z2=D2-W2 &* DELTA Y.
1300 W1=D1    &* NEW COORD.
1310 W2=D2
1320 GOSUB 1020
1330 IF Z2>0 GOTO 1380
1340 Z2=-Z2
1350 V0=U$ &* UP.
1360 V2=2
1370 GOTO 1400
1380 V0=D$ &* DOWN.
1390 V2=1
1400 IF Z1>0 GOTO 1440
1410 Z1=-Z1
1420 H0=L$ &* LEFT.
1430 GOTO 1450
1440 H0=R$ &* RIGHT.
1450 IF F2=0 GOTO 1620
1460 F2=0
1470 S=Z1*2+Z2*V2
1480 H=4+(W1-1)*2+W2
1490 C=1+(W1-1)*2+Z2*V2
1500 IF H<S GOTO 1520
1510 IF C>=S GOTO 1620
1520 Z1=W1-1
1530 H0=R$
1540 IF H>=C GOTO 1590
1550 Z2=W2
1560 V0=D$
1570 X$=T$
1580 GOTO 1600
1590 X$=C$
1600 C=X$
1610 GOSUB 1070
1620 IF Z1=0 GOTO 1800
1630 IF Z2=0 GOTO 1860
1640 F=MIN(Z1,Z2) &* MOVE IN UNISON FACTOR.
1650 F1=INT(Z1/F+.000001)
1660 F3=INT(Z2/F+.000001)
1670 Z1=Z1-F1*F &* CALC LEFTOVERS.
1680 Z2=Z2-F3*F
1690 FOR I=1 TO F
1700 C=H0 &* HORIZONTAL.
1710 FOR B1=1 TO F1
1720 GOSUB 1070
1730 NEXT B1
1740 C=V0 &* VERTICAL.
1750 FOR B2=1 TO F3
1760 GOSUB 1070
1770 NEXT B2
1780 NEXT I
1790 GOTO 1620
1800 C=V0
1810 FOR I=1 TO Z2
1820 GOSUB 1070
1830 NEXT I
1840 GOSUB 1220
1850 RETURN
1860 C=H0
1870 FOR I=1 TO Z1
1880 GOSUB 1070
1890 NEXT I
1900 GOSUB 1220
1910 RETURN
1920 ******************************
1930 *** SHOW ALL SHIPS AND SHIELDS.
1940 GOSUB 940
1950 FOR I2=1 TO Y9
1960 FOR I1=1 TO X9
1970 GOSUB 2010
1980 NEXT I1
1990 NEXT I2
2000 RETURN
2010 P=P(I1,I2) &* GET PIECE CODE.
2020 IF P=P0 GOTO 2120 &* DON'T SHOW NOTHING.
2030 IF P=P3 GOTO 2120
2040 Z='#'
2050 IF P=P2 GOTO 2100
2060 Z='='
2070 IF P=P4 GOTO 2100
2080 X$=STR(P-10)
2090 Z=X$(:2) &* FRIENDLY
2100 F2=1
2110 GOSUB 2140
2120 RETURN
2130 ******************************
2140 *** SHOW ITEM Z AT (I1,I2)
2150 D1=I1
2160 D2=I2 &* PASS COORDINATES.
2170 GOSUB 1260
2180 PRINT Z''S$
2190 W1=W1+1
2200 RETURN
2210 ******************************
2220 *** SIMS SHIP FIRE.
2230 M5='*'
2240 * FROM (G1,G2) AT VECTOR (H1,H2)
2250 I1=0
2260 I2=0
2270 P6=0
2280 K5=2*SQR(X9*X9+Y9*Y9)
2290 D1=G1 &* PASS COORD FOR POSITIONING.
2300 D2=G2
2310 F2=1
2320 GOSUB 1260
2330 ** CALC NEW COORDS.
2340 K5=K5-1
2350 IF K5<1 THEN 1200
2360 J1=H1
2370 J2=H2
2380 IF M5<>'@' GOTO 2440
2390 GOSUB 5290
2400 J1=J1+H1
2410 J2=J2+H2
2420 H1=J1
2430 H2=J2
2440 IF ABS(J1)<=1 THEN 2480
2450 I=ABS(J1)
2460 J1=J1/I
2470 J2=J2/I
2480 IF ABS(J2)<=1 THEN 2520
2490 I=ABS(J2)
2500 J1=J1/I
2510 J2=J2/I
2520 G1=G1+J1
2530 G2=G2+J2
2540 *** OFFSCREEN?
2550 IF I1<>INT(G1+.5) GOTO 2570
2560 IF I2=INT(G2+.5) GOTO 2330
2570 I1=INT(G1+.5)
2580 I2=INT(G2+.5)
2590 IF I1<1 THEN 3090
2600 IF I1>X9 THEN 3090
2610 IF I2<1 THEN 3090
2620 IF I2>Y9 THEN 3090
2630 Z=M5
2640 GOSUB 2140
2650 PRINT L$' 'S$ &* ERASE ITEM.
2660 P6=P(I1,I2)
2670 IF P6=P0 THEN 2330
2680 PRINT B$''S$
2690 IF I2<1.5 GOTO 2710
2710 PRINT L$''L$"-"M5"-"L$''S$
2720 IF I2>Y9-.5 GOTO 2740
2730 PRINT D$''L$''L$"/"R$"\"L$''U$''S$
2740 PRINT S$''S$''S$''S$''S$''S$''S$''S$''S$''S$
2750 IF I2<1.5 GOTO 2770
2760 PRINT U$''L$''L$" "R$" "L$''D$''S$
2770 PRINT L$''L$"   "L$''S$
2780 IF I2>Y9-.5 GOTO 2800
2790 PRINT D$''L$''L$" "R$" "U$''L$''S$
2800 *
2810 G5=I1
2820 G6=I2
2830 P=P6 &* FIND OUT WHAT TO DO.
2840 IF P<10 GOTO 2920
2850 Z(P-10,X)=0 &* MARK DESTROYED.
2860 Z8=Z8-1
2870 IF Z8>.5 GOTO 2900
2880 PRINT T$''E$"ADIEU MON CAPITAN"
2890 STOP
2900 P(I1,I2)=P0
2910 GOTO 3090
2920 IF P<>P3 GOTO 2950
2930 PRINT L$' 'S$ &* MARK HIT HOLE.
2940 GOTO 3090
2950 IF P=P4 GOTO 2900
2960 FOR I=1 TO Q9 &* CHECK WHICH USHIP WAS HIT
2970 IF Q(I,X)<>I1 GOTO 3060
2980 IF Q(I,Y)<>I2 GOTO 3060
2990 FOR P=I+1 TO Q9
3000 Q(P-1,X)=Q(P,X)
3010 Q(P-1,Y)=Q(P,Y)
3020 NEXT P
3030 Q9=Q9-1
3040 IF Q9<.5 GOTO 5510
3050 GOTO 2900
3060 NEXT I
3070 PRINT "USHIP NOT FOUND--PRG ERR"I1;I2;P
3080 STOP
3090 RETURN
3100 ******************************
3110 * GENERATE METEOR
3120 IF FNR(10)<9 THEN 1200
3130 H1=3-FNR(5)
3140 H2=3-FNR(5) &* MOVEMENT VECTOR.
3150 IF H1<>0 THEN 3170
3160 IF H2=0 THEN 3110
3170 G1=FNR(4) &* RANDOM POSITION ON EDGE.
3180 ON G1 GOTO 3190 , 3230 , 3270 , 3310
3190 IF H1<1 THEN 3110
3200 G1=1
3210 G2=INT(Y9/10+FNR(Y9-Y9/5))
3220 GOTO 3340
3230 IF H1>1 THEN 3110
3240 G1=X9
3250 G2=INT(Y9/10+FNR(Y9-Y9/5))
3260 GOTO 3340
3270 IF H2<1 THEN 3110
3280 G1=INT(X9/10+FNR(X9-X9/5))
3290 G2=1

3300 GOTO 3340
3310 IF H2<1 THEN 3110
3320 G1=INT(X9/10+FNR(X9-X9/5))
3330 G2=Y9
3340 M5='@'
3350 GOSUB 2240
3360 IF FNR(20)<3 GOTO 3110
3370 RETURN
3380 ******************************
3390 IF FNR(10)<9 THEN 1200
3400 H1=2*(2-FNR(3))
3410 H2=2-FNR(3)
3420 IF ABS(H1)+ABS(H2)<.5 THEN 1200
3430 I=FNR(W9)
3440 G1=W(I,X)
3450 IF G1=0 THEN 1200
3460 G2=W(I,Y)
3470 M5='.'
3480 GOSUB 2240
3490 RETURN
3500 ******************************
3510 *** GET DIRECTION.
3520 * X$ = DIRECTION STRING.
3530 X5=LEN(X$)
3540 H1=0
3550 H2=0
3560 FOR I=1 TO X5
3570 T=X$(:I,1)
3580 IF T='U' GOTO 3650
3590 IF T='D' GOTO 3670
3600 IF T='R' GOTO 3690
3610 IF T='L' GOTO 3710
3620 PRINT T$''TAB(30)"ILLEGAL DIRECTION"TAB(60)"*"
3630 H1=.5
3640 RETURN
3650 H2=H2-1
3660 GOTO 3720
3670 H2=H2+1
3680 GOTO 3720
3690 H1=H1+1
3700 GOTO 3720
3710 H1=H1-1
3720 NEXT I
3730 H1=H1*2
3740 RETURN
3750 ************************************
3760 *
3770 L6=PCH('-')
3780 L6=40
3790 GOTO 3810
3800 L6=MAX(FNR(20),10)
3810 GOSUB 3910
3820 GOSUB 3390
3830 GOSUB 3110
3840 L6=L6-L7
3850 IF X1='NO' GOTO 3870
3860 IF L6>.0001 GOTO 3810
3870 GOSUB 3110
3880 GOSUB 5450
3890 GOTO 3800
3900 ******************************
3910 *** ACCEPT AND EXECUTE COMMAND.
3920 L7=0
3930 GOSUB 5240
3940 IF FNR(C8)>=6  GOTO 4070
3950 FOR X2=1 TO Z9
3960 IF Z(X2,X)<>0 GOTO 4050
3970 PRINT T$''TAB(30)"REINFORCEMENTS HAVE ARRIVED"TAB(60)"*"
3980 Z8=Z8+1
3990 GOSUB 5240
4000 L6=L6+7
4010 G1=FNR(INT(X9/2))*2
4020 G2=FNR(Y9)
4030 IF P(G1,G2)=0 GOTO 4830
4040 GOTO 4010
4050 NEXT X2
4060 **********
4070 PRINT T$''E$''L6''S$
4080 L7=0
4090 INPUT X1
4100 GOSUB 5240
4110 PRINT E$''S$
4120 IF X1='NO' GOTO 1200
4130 IF X1<>'WHERE' THEN 4160
4140 GOSUB 1930
4150 GOTO 3910
4160 L7=2
4170 IF X1='FIRE' GOTO 4310
4180 L7=3
4190 IF X1='SHIP' GOTO 4310
4200 L7=.5
4210 IF X1='LOWER' GOTO 4310
4220 L7=1
4230 IF X1='SHIELD' GOTO 4310
4240 IF X1<>'SH' GOTO 4270
4250 X1='SHIELD'
4260 GOTO 4310
4270 INPUT **
4280 PRINT T$''TAB(30)"ILLEGAL COMMAND"TAB(60)"*"
4290 GOTO 4070
4300 **********
4310 IF L7<=L6 GOTO 4350
4320 PRINT T$''TAB(30)"YOU DON'T HAVE"L7" UNITS"TAB(60)"*"
4330 INPUT **
4340 GOTO 4070
4350 INPUT X2,X$,**
4360 GOSUB 5240
4370 IF X2<1 GOTO 5170
4380 IF X2>Z9 GOTO 5170
4390 IF Z(X2,X)=0 GOTO 5170
4400 IF X1='FIRE' GOTO 4440
4410 IF X1='SHIELD' GOTO 4530
4420 IF X1='SHIP' GOTO 4520
4430 IF X1='LOWER' GOTO 4530
4440 GOSUB 3510
4450 IF H1=.5 GOTO 4070
4460 IF ABS(H1)>2 THEN 5150
4470 IF ABS(H2)>1 THEN 5150
4480 G1=Z(X2,X) &* SET SHIP COORDS.
4490 G2=Z(X2,Y)
4500 GOSUB 2220
4510 RETURN
4520 *
4530 GOSUB 3510
4540 IF H1=.5 GOTO 4070
4550 G1=Z(X2,X)+H1
4560 G2=Z(X2,Y)+H2
4570 IF G1<1 GOTO 5190
4580 IF G1>X9 GOTO 5190
4590 IF G2<1 GOTO 5190
4600 IF G2>Y9 GOTO 5190
4610 IF P(G1,G2)=P0 GOTO 5030
4620 P=P(G1,G2) &* FIND OUT WHAT'S THERE.
4630 IF X1='SHIELD' GOTO 5110   &* CAN'T PUT SHIELD THERE.
4650 IF P=P4 GOTO 5210
4660 IF P>10 GOTO 5210
4670 IF P=P2 GOTO 5210
4680 I1=Z(X2,X) &* GET COORDS FOR MOVE.
4690 I2=Z(X2,Y)
4700 Z(X2,X)=0
4710 Z8=Z8-1
4720 Z(X2,Y)=0 &* MOVE SHIP INTO HOLE.
4730 P(I1,I2)=P0
4740 X$=' '
4750 Z=X$
4760 PRINT B$''S$ &* BEEP.
4770 GOSUB 2140
4780 IF Z8<.5 GOTO 2880
4790 RETURN
4800 I1=Z(X2,X)
4810 I2=Z(X2,Y) &* GET COORDS.
4820 P(I1,I2)=P0 &* SHIP NOT THERE ANYMORE.
4830 Z(X2,X)=G1
4840 Z(X2,Y)=G2 &* SET NEW COORDS.
4850 P(G1,G2)=10+X2
4860 IF L7=0 GOTO 4910
4870 IF L7=0 GOTO 4910
4880 Z=' '
4890 GOSUB 2140
4900 **********
4910 I1=G1 &* SHOW SHIP'S NEW SPOT.
4920 I2=G2
4930 X$=STR(X2)
4940 Z=X$(:2)
4950 GOSUB 2140
4960 IF L7=0 GOTO 3910
4970 RETURN
4980 **********
4990 IF P<>P4 GOTO 3910
5000 I1=G1
5010 I2=G2
5020 GOTO 4730
5030 IF X1='SHIP' GOTO 4800
5040 IF X1='LOWER' GOTO 5130
5050 P(G1,G2)=P4 &* MOVE SHIELD TO SPT.
5060 I1=G1 &* SHOW IT.
5070 I2=G2
5080 Z='='
5090 GOSUB 2140
5100 RETURN
5110 PRINT T$''TAB(30)"ILLEGAL SHIELD LOCATION"TAB(60)"*"
5120 GOTO 4070
5130 PRINT T$''TAB(30)"NONE THERE"TAB(60)"*"
5140 GOTO 4070
5150 PRINT T$''TAB(30)"ILLEGAL FIRE DIRECTION"TAB(60)"*"
5160 GOTO 4070
5170 PRINT T$''TAB(30)"ILLEGAL SHIP"TAB(60)"*"
5180 GOTO 4070
5190 PRINT T$''TAB(30)"SORRY...OFFSCREEN"TAB(60)"*"
5200 GOTO 4070
5210 PRINT T$''TAB(30)"ILLEGA SHIP LOCATION"TAB(60)"*"
5220 GOTO 4070
5230 ****************************
5240 PRINT T$''S$
5250 W1=1
5260 W2=0
5270 RETURN
5290 * CALC PULL ON OBJECT AT (G1,G2).
5300 J1=0
5310 J2=0
5320 FOR I=1 TO W9 &* FOR ALL HOLES.
5330 IF W(I,X)=0 GOTO 5420
5340 M1=(W(I,X)-G1)/2
5350 M2=W(I,Y)-G2 &* DIFFERENCE VECTOR.
5360 M3=M1**2+M2**2 &* DISTANCE SQUARED.
5370 M4=SQR(M3) &* CALC DISTANCE TO OBJECT.
5380 IF M4=0 GOTO 5420
5390 M3=M3/X0**2
5400 J1=J1+M1/M4*M3*2
5410 J2=J2+M2/M4*M3
5420 NEXT I
5430 RETURN
5440 ******************************
5450 Q8=0
5460 FOR I=1 TO Q9
5470 IF Q(I,X)=0 GOTO 5500
5480 Q8=1
5490 GOTO 5530
5500 NEXT I
5510 PRINT T$''E$"YOU GOT 'EM ALL--BACK TO WORK NOW"
5520 STOP
5530 Q6=MAX(7,FNR(20))
5540 I1=FNR(Z9) &* FIND ONE CLOSEST TO SHIP.
5550 IF Z(I1,X)=0 GOTO 5540
5560 IF FNR(C8)<20 GOTO 5680
5570 I2=Z(I1,Y)
5580 I1=Z(I1,X)
5590 K0=999999999
5600 FOR I=1 TO Q9
5610 IF Q(I,X)=0 GOTO 5660
5620 K8=((Q(I,X)-I1)/2)**2 + (Q(I,Y)-I2)**2
5630 IF K8>=K0 GOTO 5660
5640 Q7=I
5650 K0=K8
5660 NEXT I
5670 GOTO 5940
5680 Q7=FNR(Q9)
5690 IF Q(Q7,X)=0 GOTO 5680
5700 K0=999999999
5710 IF Q9<1.5 THEN 5940
5720 I1=Q(Q7,X)
5730 I2=Q(Q7,Y)
5740 FOR I=1 TO Q9
5750 IF Q(I,X)=0 GOTO 5770
5760 Q(I,3)=((Q(I,X)-I1)/2)**2 + (Q(I,Y)-I2)**2
5770 NEXT I
5780 P=0
5790 K0=9999999
5800 K9=0 &* FIND CLOSEST.
5810 FOR I=1 TO Q9
5820 IF Q(I,X)=0 GOTO 5870
5830 IF I=Q7 GOTO 5870
5840 IF Q(I,3)>=K0 GOTO 5870
5850 K0=Q(I,3)
5860 K9=I
5870 NEXT I
5880 IF K9=0 GOTO 5930
5890 P=P+1
5900 I(P)=K9
5910 Q(K9,3)=9999999 &* ELIMINATE FROM FUTURE CONSIDERATION.
5930 Q7=I(FNR(MIN(P,3))) &* 3 CLOSEST.
5940 Q1=0
5950 GOSUB 7270
5960 G1=Q(Q7,X)
5970 G2=Q(Q7,Y)
5980 Q4=2-FNR(3)
5990 Q5=2-FNR(3)
6000 IF Q4<>0 GOTO 6020
6010 IF Q5=0 GOTO 5980
6020 H1=Q4*2
6030 H2=Q5
6040 G3=G1 &* SAVE OLD COORDS.
6050 G4=G2
6060 G3=G3+H1 &* CALC PATH.
6070 G4=G4+H2
6080 *** CHECK IF OFFSCREEN.
6090 IF G3<1 GOTO 6320
6100 IF G3>X9 GOTO 6320
6110 IF G4<1 GOTO 6320
6120 IF G4>Y9 GOTO 6320
6130 P=P(G3,G4) &* GET WHAT'S AT COORDS.
6140 IF P=P2 GOTO 6320 &* QSHIP.
6150 IF Q1<.5 GOTO 6170
6160 IF P=P4 GOTO 6180
6170 IF P<10 GOTO 6060
6180 K5=SQR( ( (G3-G1)/2 )**2 + (G4-G2)**2 )
6190 IF K5>MIN(X0,FNR(C8)) GOTO 6350
6200 Q1=0
6210 GOSUB 2220
6220 Q6=Q6-1
6230 IF Q6<1 THEN 1200
6240 G1=Q(Q7,X)
6250 G2=Q(Q7,Y)
6260 G3=G5
6270 G4=G6
6280 IF P6>10 GOTO 5540
6290 GOSUB 7270
6300 IF P6=P4 GOTO 6740
6310 GOTO 6940
6320 IF Q1=1 GOTO 6350
6330 IF FNR(C8)>20   GOTO 5980
6340 **********
6350 K5=1
6360 IF FNR(C8)<20 GOTO 5540
6370 G1=Q(Q7,X)
6380 G2=Q(Q7,Y)
6390 GOSUB 7270
6400 G3=(K8-G1)/2
6410 G4=K9-G2
6420 M=SQR( G3**2 + G4**2 )
6430 IF Q1>.5 GOTO 6560
6440 H1=2*SGN(G3)
6450 H2=SGN(G4)
6460 Q1=1
6470 IF FNR(C8)<20 GOTO 6560
6480 IF FNR(100)<10  GOTO 6040
6490 IF ABS(G3)<.01 GOTO 6040
6500 IF ABS(G4)<.01 GOTO 6040
6510 P6=DEG(ATN(ABS(G4/G3)))
6520 IF P6<-2 GOTO 6560
6530 IF P6<2  GOTO 6040
6540 P6=P6-45
6550 GOTO 6520
6560 K1=0
6570 K2=0
6580 IF M<2 GOTO 5700
6590 K8=G3/M
6610 M1=MIN(M,X0)
6620 P6=1/MAX(ABS(K8),ABS(K9))
6630 M1=M1-1
6640 IF M1<1 GOTO 6920
6650 IF M1<P6 GOTO 6920
6660 G3=INT(2*K1 +  2*INT( K8*M1+.5 ) + G1 + .000001 )
6670 G4=INT(K2 +  K9*M1 + G2 + .500001 )
6680 IF G3<1 GOTO 6630
6690 IF G3>X9 GOTO 6630
6700 IF G4<1 GOTO 6630
6710 IF G4>Y9 GOTO 6630
6720 IF P(G3,G4)<>P0 GOTO 6630
6730 GOTO 7070
6740 IF FNR(C8)<20 GOTO 5700
6750 GOSUB 7270
6760 G3=(K8-G1)/2
6770 G4=K9-G2
6780 M=SQR( G3**2 + G4**2 )
6790 H1=2*SGN(G3)
6800 H2=SGN(G4)
6810 Q1=1
6820 IF ABS(G3)<.01 GOTO 6040
6830 IF ABS(G4)<.01 GOTO 6040
6840 P6=DEG(ATN(ABS(G4/G3)))
6850 IF P6<-2 GOTO 6890
6860 IF P6<2  GOTO 6040
6870 P6=P6-45
6880 GOTO 6850
6890 G3=G5
6900 G4=G6
6910 GOTO 7070
6920 GOTO 5700
6930 **********
6940 K5=1
6950 G1=Q(Q7,X)
6960 G2=Q(Q7,Y)
6970 Q1=0
6980 K5=K5+1
6990 IF K5>30 GOTO 5700
7000 G3=G1+2*(2-FNR(5))
7010 G4=G2+2-FNR(5)
7020 IF G3<1 GOTO 6980
7030 IF G3>X9 GOTO 6980
7040 IF G4<1 GOTO 6980
7050 IF G4>Y9 GOTO 6980
7060 IF P(G3,G4)<>P0 GOTO 6980
7070 *** MOVE QSHIP.
7080 Z=' '
7090 I1=G1
7100 I2=G2
7110 P(G1,G2)=P0
7120 F2=1
7130 GOSUB 2140
7140 Z='#'
7150 I1=G3
7160 I2=G4
7170 GOSUB 2140
7180 Q(Q7,X)=G3
7190 Q(Q7,Y)=G4
7200 P(G3,G4)=P2
7210 Q6=Q6-1
7220 IF Q6<1 THEN 1200
7230 IF Q1<.5 GOTO 5700
7240 IF FNR(C8)<20 GOTO 5700
7250 GOTO 5940
7260 ****************************************
7270 K0=9999999999
7280 *** FIND CLOSEST S SHIP.

   y
7300 I2=Q(Q7,Y)
7310 FOR I=1 TO Z9
7320 IF Z(I,X)=0 GOTO 7370
7330 K8=((Z(I,X)-I1)/2)**2 + (Z(I,Y)-I2)**2
7340 IF K8>=K0 GOTO 7370
7350 K0=K8
7360 K9=I
7370 NEXT I
7380 K8=Z(K9,X)
7390 K9=Z(K9,Y)
7400 RETURN
7410 ******************************

