10  COM D$[11]
20  COM A$[20],B$[20],C$[20],M$[20],N$[20],O$[20],P$[20]
30  COM Q$[20],R$[20],S$[20],V$[20],X$[72],Y$[72],Z$[72]
40  COM A[50],B[50],C[50],D[50],E[50],F[50],G[10],H[10],I[50],J[50]
50  COM K[50],L[50],M[10,6],N[10,4],O[10],P[10,4],Q[10,4],R[10,4]
60  COM S[10,8],T[10,9],U[10,6],V[10,6],W[10],X[50],Y[50],Z[10,10]
70  COM A,D1,D2,I,I1,I2,K1,K2,K3,K4,N,N1,N2,O,O1,O2,P1,P2,P3,P4
80  COM T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,Z9
90  REM
100  REM    TREK73:  AN ADVANCED STAR TREK BATTLE SIMULATION
110  REM  PROGRAMED BY WILLIAM K. CHAR AND ASSOCIATES, WILSON
120  REM  EDP, 400 MANSELL, SAN FRAN, CA 94134, (415) 239-6460
130  REM  26 NOVEMBER 1973 ***FOR AUTHORIZED PERSONNEL ONLY***
140  REM
150  REM        MODIFIED BY DAVID SHAYER - SMHS - 6/04/80
160  REM
170  DEF FNA()=*.0174533
180  DEF FNB()=*57.2958
190  DEF FNC()=-INT(*.00277778)*360
200  DEF FNR()=INT(*RND(1))+1
210  DEF FNS()=SQR((X[I]-X[J])^2+(Y[I]-Y[J])^2)
220  GOTO 270
230  CHAIN "*TREK07"
240  STOP 
250  REM          ENEMY STRATEGY BY WILLIAM CHAR
260  REM          MAIN VERSION, 25 NOVEMBER 1973
270  R=9.E+32
280  J1=0
290  FOR J=2 TO I1
300  IF I[J]=0 OR I[J]>10 THEN 340
310  IF FNS(X)>R OR Z[J,6]=0 THEN 340
320  R=FNS(X)
330  J1=J
340  NEXT J
350  J=J1
360  IF J<1 OR J>10 THEN 410
370  M=V=I[J1]
380  GOSUB 2970
390  GOSUB 3080
400  B2=FNC(B-C[I])
410  REM     ----- RESUMPTION OF NORMAL PLAY -----
420  REM  (PROBE NEAR?)
430  FOR J=1 TO I1
440  IF I[J]=I+20 THEN 470
450  IF I[J]=0 OR I[J]<21 OR I[J]>30 THEN 470
460  GOTO 490
470  NEXT J
480  GOTO 690
490  GOSUB 3080
500  IF FNS(X)>1200 THEN 600
510  FOR K=1 TO K1
520  IF M[I,K]<0 THEN 590
530  M[I,K]=J
540  GOSUB 3700
550  IF F=0 THEN 590
560  M[I,K]=M[I,K]+100
570  PRINT "SPOCK:  M5 COMPUTER LOCKING PHASER ON PROBE #"J
580  GOTO 2330
590  NEXT K
600  A[I]=2+FNR(6)
610  IF  NOT Z[I,4] THEN 630
620  A[I]=.99
630  C[I]=FNC(B+90)
640  J[I]=0
650  PRINT  USING 660;C[I],A[I]
660  IMAGE "CHEKOV:  M5 COMPUTER COMING TO COURSE ",3D," WARP ",D.D,"."
670  GOTO 820
680  REM  (TORPEDOES NEAR?)
690  FOR J=1 TO I1
700  IF I[J]=I+30 THEN 730
710  IF I[J]=0 OR I[J]<31 OR I[J]>40 THEN 730
720  GOTO 750
730  NEXT J
740  GOTO 820
750  GOSUB 3080
760  A[I]=4+FNR(4)
770  IF  NOT Z[I,4] THEN 790
780  A[I]=.99
790  C[I]=FNC(B+90)
800  J[I]=0
810  PRINT  USING 660;C[I],A[I]
820  J=J1
830  IF J<1 OR J>10 THEN 230
840  IF R>3800 THEN 1930
850  IF R>1200 THEN 1240
860  REM  --CLOSE RANGE--
870  REM  (PHASERS LOCKED?)
880  L=0
890  FOR K=1 TO K1
900  IF M[I,K]<0 OR M[I,K]=J THEN 930
910  M[I,K]=J
920  L=L+1
930  NEXT K
940  IF  NOT L THEN 970
950  PRINT "SPOCK:  M5 COMPUTER LOCKING PHASERS ON THE "V$"."
960  REM  (FIRE PHASERS?)
970  L=0
980  FOR K=1 TO K1
990  IF M[I,K]<0 THEN 1040
1000  GOSUB 3700
1010  IF F<10 THEN 1040
1020  M[I,K]=M[I,K]+100
1030  L=L+1
1040  NEXT K
1050  IF L THEN 2330
1060  J=J1
1070  REM  (ENEMY BEHIND)
1080  IF B2>135 AND B2<225 THEN 2370
1090  REM  (LAUNCH PROBE?)
1100  IF B2<90 OR B2>270 THEN 1130
1110  IF Z[I,3]=0 AND F[I]>10 AND ABS(A[J]) <= 1 THEN 2470
1120  REM  (SELF-DESTRUCT?)
1130  IF F[I]<10 AND G[I]<4 AND K[I]<10000-20/D1 THEN 2620
1140  REM  (SET COURCE)
1150  IF J[I]=J AND A[I]+ABS(A[J])<3 THEN 1350
1160  B[I]=ABS(A[J])
1170  J[I]=J
1180  IF Z[I,4]=0 THEN 230
1190  B[I]=.99
1200  REM  (TIME TO RUN?)
1210  IF ABS(B[I])<1 THEN 1350
1220  B[I]=-.99
1230  GOTO 230
1240  REM  --MEDIUM RANGE--
1250  REM  (TUBES LOCKED?)
1260  L=0
1270  FOR K=1 TO K2
1280  IF T[I,K]<0 OR T[I,K]=J THEN 1310
1290  T[I,K]=J
1300  L=L+1
1310  NEXT K
1320  IF  NOT L THEN 1350
1330  PRINT "SPOCK:  M5 COMPUTER LOCKING TUBES ON THE "V$"."
1340  REM  (FIRE TORPEDOES?)
1350  FOR J=2 TO N
1360  IF J=I OR I[J]>10 THEN 1410
1370  GOSUB 3070
1380  B1=FNC(B-C[I])
1390  IF B1<5 OR B1>335 THEN 1490
1400  IF SQR((X[I]-X[J])^2+(Y[I]-Y[J])^2)<300 THEN 1490
1410  NEXT J
1420  L=0
1430  FOR K=1 TO K2
1440  IF T[I,K]<1 OR V[I,K]<1 THEN 1480
1450  T[I,K]=T[I,K]+100
1460  L=L+1
1470  IF L>FNR(6) THEN 2680
1480  NEXT K
1490  J=J1
1500  IF R>2800 THEN 1550
1510  FOR K=1 TO K2
1520  IF (T[J,K]=I OR T[J,K]=I+100) AND V[J,K]=10 AND ABS(A[J]) >= 4.5 THEN 2370
1530  NEXT K
1540  REM  (TO RUN, OR NOT TO RUN)
1550  IF Z[I,4]=0 THEN 1650
1560  IF ABS(A[J]) >= 1 THEN 2910
1570  FOR K=1 TO K1
1580  IF M[I,K] >= 0 THEN 1650
1590  NEXT K
1600  FOR K=1 TO K2
1610  IF T[I,K] >= 0 THEN 1650
1620  NEXT K
1630  GOTO 2910
1640  REM  (PURSUED, BEHIND, LOW POWER:  JETTISON ENGINEERING)
1650  IF F[I]>10 OR G[I]>4 THEN 1680
1660  IF J[J]*A[J]>0 AND Z[I,3]=0 AND Z[I,5]=0 THEN 2730
1670  REM  (PURSUED, BEHIND, SLOW:  LAUNCH PROBE)
1680  IF B2<90 OR B2>270 THEN 1710
1690  IF J[J]*A[J]>0 AND F[I]>10 AND Z[I,3]=0 THEN 2470
1700  REM  (SCAN?)
1710  IF B2>135 AND B2<225 THEN 2880
1720  REM  (ENEMY DESTRUCTING?)
1730  IF K[J]>10000-10/D1 THEN 2370
1740  REM  (SET COURSE)
1750  IF B[I]>ABS(A[J])+1 AND J[I]=J THEN 1940
1760  A[I]=8 MIN ABS(A[J])+1+FNR(2)
1770  IF Z[I,4]=0 THEN 1790
1780  B[I]=.99
1790  GOTO FNR(2) OF 1800,1880
1800  REM  DIRECT COURSE
1810  J[I]=0
1820  GOTO FNR(2) OF 1830,1850
1830  K=1
1840  GOTO 1860
1850  K=-1
1860  D[I]=FNC(D[J]+((45+FNR(10))*K))
1870  GOTO 2090
1880  REM  PARALLEL COURSE
1890  D[I]=D[J]
1900  J[I]=0
1910  GOTO 2090
1920  REM  --DISTANT RANGE--
1930  REM  (LOW POWER?)
1940  IF (F[I]<10 AND G[I]<4.5) OR Z[I,4] THEN 2910
1950  REM  (ENEMY DESTRUCTING?)
1960  IF K[J]>10000-10/D1 THEN 2370
1970  REM  (ATTACK?)
1980  J[I]=J
1990  IF F[I]<5 THEN 2050
2000  IF B2>60 AND B2<300 THEN 2060
2010  IF B[I]>ABS(A[J])+2 THEN 2090
2020  B[I]=8 MIN ABS(A[J])+2+FNR(2)
2030  PRINT "SULU:  M5 COMPUTER ATTACKING THE "V$"."
2040  GOTO 230
2050  IF B[I]<1 THEN 2090
2060  B[I]=0
2070  GOTO 2090
2080  REM  (TUBES LOADED?)
2090  L=0
2100  FOR K=1 TO K2
2110  IF T[I,K]<0 OR V[I,K] >= 10 THEN 2180
2120  Q=10-V[I,K] MIN F[I]
2130  F[I]=F[I]-Q
2140  H[I]=H[I]-Q
2150  V[I,K]=V[I,K]+Q
2160  IF V[I,K]#10 THEN 2180
2170  L=L+1
2180  NEXT K
2190  IF  NOT L THEN 2300
2200  PRINT "SULU:  M5 COMPUTER LOADING TUBES."
2210  PRINT "SCOTT:  TUBE UNITS NOW ";
2220  FOR K=1 TO K2
2230  IF T[I,K]<0 THEN 2260
2240  PRINT INT(V[I,K]);
2250  GOTO 2270
2260  PRINT " -- ";
2270  NEXT K
2280  GOTO 230
2290  REM  (SCAN)
2300  GOTO 2880
2310  REM     ----- COMMAND EXECUTION -----
2320  REM  (FIRING PHASERS)
2330  M[I,K1+1]=10
2340  M[I,K1+2]=100
2350  GOTO 230
2360  REM  (TAKE EVASIVE ACTION)
2370  PRINT "SCOTT:  M5 COMPUTER TAKING EVASIVE ACTION."
2380  B[I]=2+FNR(6)
2390  D[I]=FNR(360)
2400  IF Z[I,4] THEN 2430
2410  J[I]=0
2420  GOTO 230
2430  J[I]=J
2440  B[I]=.99
2450  GOTO 230
2460  REM  (LAUNCH PROBE)
2470  GOSUB 3190
2480  PRINT  USING 2490;I3,V$
2490  IMAGE "SCOTT:  M5 COMPUTER LAUNCHING PROBE #",2D," TOWARD THE ",10A,"."
2500  A[I3]=B[I3]=2
2510  F[I3]=30 MIN F[I]
2520  F[I]=F[I]-F[I3]
2530  H[I]=H[I]-F[I3]
2540  I[I3]=I[I]+20
2550  J[I3]=J
2560  K[I3]=10000-15/D1
2570  L[I3]=200+FNR(300)
2580  X[I3]=X[I3]+A[I3]*100*COS(FNA(B))*D1
2590  Y[I3]=Y[I3]+A[I3]*100*SIN(FNA(B))*D1
2600  GOTO 230
2610  REM  (SELF-DESTRUCT)
2620  PRINT "SPOCK:  M5 COMPUTER IS OVERLOADING WHAT REMAINS OF OUR ANTI-"
2630  PRINT "   MATTER PODS--OBVIOUSLY A SUICIDAL GESTURE.  DETONATION"
2640  PRINT "   IN 20 SECONDS."
2650  K[I]=10000-20/D1
2660  GOTO 230
2670  REM  (FIRE TORPEDOES)
2680  T[I,K2+1]=12
2690  T[I,K2+2]=10
2700  T[I,K2+3]=100+FNR(200)
2710  GOTO 230
2720  REM  (JETTISON ENGINEERING)
2730  PRINT "SCOTT:  THE M5 COMPUTER JUST JETTISONED OUR ENGINEERING."
2740  PRINT "   ,"O$"."
2750  GOSUB 3190
2760  A[I3]=A[I]
2770  B[I3]=0
2780  B[I]=.9*SGN(A[I])
2790  C[I3]=D[I3]=C[I]
2800  F[I3]=F[I]
2810  F[I]=G[I]=H[I]=0
2820  I[I3]=I[I]+10
2830  K[I3]=10000-15/D1
2840  PRINT "SULU:  M5 COMPUTER RETREATING."
2850  Z[I,3]=Z[I,4]=Z[I,5]=1
2860  GOTO 230
2870  REM  (SCAN)
2880  PRINT "SPOCK:  M5 COMPUTER SCANNING THE "V$"."
2890  GOTO 230
2900  REM  (RUN)
2910  IF B[I]<0 THEN 230
2920  PRINT "SULU:  M5 COMPUTER RETREATING."
2930  B[I]=-.99
2940  J[I]=J
2950  GOTO 230
2960  REM          ----- NAME SELECTION SUBROUTINE -----
2970  RESTORE 2980
2980  DATA "BISMARK","CENTAUR","DRADDOCK","FORBIN","KREIGER","SHLURG"
2990  DATA "TRAKKA","VARNOR","WARRIOR"
3000  IF V>1 THEN 3030
3010  V$=P$
3020  RETURN 
3030  FOR V2=2 TO V
3040  READ V$
3050  NEXT V2
3060  RETURN 
3070  REM          ----- BEARING SUBROUTINE -----
3080  X=X[J]-X[I]
3090  Y=Y[J]-Y[I]
3100  IF X=0 THEN 3130
3110  B=ATN(Y/X)*57.2958
3120  GOTO 3140
3130  B=90
3140  IF X >= 0 AND Y >= 0 THEN 3180
3150  B=B+180
3160  IF X<0 THEN 3180
3170  B=B+180
3180  RETURN 
3190  REM          ----- SLOT I SUBROUTINE -----
3200  FOR I3=1 TO I2
3210  IF I[I3]=0 THEN 3270
3220  NEXT I3
3230  PRINT 
3240  PRINT "GAME WILL TERMINATE BECAUSE OF INABILITY TO COPE WITH"
3250  PRINT "ALL THE JUNK (VESSELS, PROBES, TORPEDOES, ETC) IN SPACE."
3260  STOP 
3270  I[I3]=1000
3280  A[I3]=B[I3]=C[I3]=D[I3]=E[I3]=F[I3]=J[I3]=K[I3]=L[I3]=0
3290  X[I3]=X[I]
3300  Y[I3]=Y[I]
3310  FOR I1=I2 TO 1 STEP -1
3320  IF I[I1]>0 THEN 3340
3330  NEXT I1
3340  I[I3]=0
3350  RETURN 
3360  REM          ----- PHASER TRACKING SUBROUTINE -----
3370  J=M[I,K]
3380  IF J<100 THEN 3400
3390  J=J-100
3400  IF J=0 THEN 3440
3410  IF I[J]=0 THEN 3470
3420  GOSUB 3070
3430  N[I,K]=FNC(B-C[I])
3440  IF N[I,K]<125 OR N[I,K]>235 OR Z[I,5] THEN 3460
3450  M[I,K]=J
3460  RETURN 
3470  V=I[I]
3480  IF V>1 THEN 3510
3490  GOSUB 2960
3500  PRINT "   PHASER  "K"DISENGAGING."
3510  M[I,K]=0
3520  RETURN 
3530  REM          ----- TORPEDO TRACKING SUBROUTINE -----
3540  J=T[I,K]
3550  IF J<100 THEN 3570
3560  J=J-100
3570  IF J=0 THEN 3610
3580  IF I[J]=0 THEN 3640
3590  GOSUB 3070
3600  U[I,K]=FNC(B-C[I])
3610  IF U[I,K]<135 OR U[I,K]>225 OR Z[I,5] THEN 3630
3620  T[I,K]=J
3630  RETURN 
3640  V=I[I]
3650  IF V>1 THEN 3680
3660  GOSUB 2960
3670  PRINT "   TUBE  "K"DISENGAGING."
3680  T[I,K]=0
3690  RETURN 
3700  REM          ----- PHASER HIT FACTOR SUBROUTINE -----
3710  F=0
3720  F1=M[I,K1+2]*Q[I,K]*.01
3730  GOSUB 3070
3740  F2=1000
3750  G2=SQR((X[I]-X[J])^2+(Y[I]-Y[J])^2)
3760  IF G2>F2 THEN 3810
3770  F3=M[I,K1+1]
3780  G3=FNC(C[I]+N[I,K]-B)
3790  IF G3>F3 AND 360-G3>F3 THEN 3810
3800  F=INT(F1*SQR(1-G2/F2)*45/F3)
3810  RETURN 
3820  REM          ----- TORPEDO TRAJECTORY PLOTTING SUBROUTINE -----
3830  GOSUB 3070
3840  N3=ABS(A[J])/T[I,K2+1]*SIN(FNA(ABS(A[J])-B))
3850  N4=FNB(ATN(N3/SQR(1-N3)))
3860  N5=(B+N4+360)/360
3870  N6=(N5-INT(N5))*360
3880  IF N6<135 OR N6>225 OR Z[I,5] THEN 3900
3890  N6=-1
3900  RETURN 
3910  END 
