10  COM S$[28],N$[72],N,Y,D[3],L[3],I[3],Y[4,2],V[3,2],S[4,2],W[4],E[4],K[4]
20  COM P[4,12],F[4,9],C[4],Q[4,8],T[4,30],O[4],A[4,5],A1,H5,U,W0,F3,O,G
30  COM W,V9,N1,U[4],S
40  FILES *YTREKL
50  DEF FNT()=(3.14159*)/180
60  DEF FNN()=FND((ATN()*180)/3.14159)
70  DEF FNE()=-((>360)*360)
80  DEF FND()=+((<0)*360)
90  DEF FNV()=FND(ABS(-((>315)*360)-315)-45)
100  DEF FNU()=5*(9-ABS())
110  DIM B$[20],D$[10],X$[24],W$[15],C$[10]
120  D$="0123456789"
130  W$="   "
140  MAT Z=ZER
150  IF A1=7 THEN 430
160  IF A1=8 THEN 880
170  REM  ****  COMMAND:  REQUEST COMPUTER ASSISTED TARGETING  ****
180  IF  NOT A[1,5] THEN 210
190  PRINT "COMPUTER DISABLED"
200  GOTO 1240
210  PRINT "COMPUTER:  COMPUTE COURSE DATA FOR [WHOM]";
220  INPUT B$
230  IF LEN(B$)>7 THEN 270
240  FOR C3=2 TO N
250  IF B$=S$[C3*7-6,C3*7-7+LEN(B$)] THEN 290
260  NEXT C3
270  PRINT "SHIP NNT FOUND"
280  GOTO 1240
290  S=C3
300  PRINT TAB(16)'14"COURSE"TAB(29)"BEARING"TAB(41)"RANGE"
310  FOR S8=S[S,1]^3-64 TO S[S,1]^3+64 STEP 64
320  S9=((ABS(S8)^(1/3)) MIN 8)*SGN(S8)
330  PRINT "W/F="S9;
340  FOR Y8=Y[S,1]-FNU(S9) TO Y[S,1]+FNU(S9) STEP FNU(S9)
350  Y9=FND(FNE(Y8))
360  GOSUB 1630
370  PRINT TAB(15);FNV(Y9);TAB(28);FNE(V+Y3);TAB(40);D[S-1]
380  NEXT Y8
390  PRINT 
400  NEXT S8
410  CHAIN "*YTREKB"
420  REM  ****  COMMAND:  FIRE PHASERS  ****
430  PRINT "HELM:  FIRE PHASERS [1-3]";
440  INPUT B$
450  PRINT "SPREAD [10-45]";
460  INPUT C7
470  IF C7<10 OR C7>45 THEN 1230
480  C4=0
490  FOR G5=1 TO LEN(B$)
500  GOSUB 1280
510  IF C3>3 OR C3 <= 0 THEN 760
520  IF P[1,C3*4-2]<0 THEN 600
530  C2=P[1,C3*4-3]*P[1,C3*4-1]
540  IF C2 <= 0 THEN 600
550  S=P[1,C3*4]
560  IF S <= 0 THEN 630
570  GOSUB 1510
580  IF V <= (C3*120-60) AND V >= (C3*120-180) THEN 630
590  IF C3=1 AND (V <= 60 OR V >= 300) THEN 630
600  W$[3,3]=D$[C3+1,C3+1]
610  X$[LEN(X$)+1,LEN(X$)+4]=W$
620  GOTO 760
630  C4=C4+1
640  FOR C5=1 TO C4
650  IF C3=Z[C5] THEN 760
660  NEXT C5
670  Z[C4]=C3
680  IF S>0 THEN 720
690  GOSUB 1720
700  F[1,C4*3-1]=FNE(ABS(S)+Y3)
710  GOTO 730
720  F[1,C4*3-1]=FNE(V+Y3)
730  F[1,C4*3]=C2
740  P[1,C3*4-3]=0
750  F[1,C4*3-2]=C7
760  NEXT G5
770  GOSUB 1360
780  PRINT #1;7
790  FOR C=1 TO 9 STEP 4
800  PRINT #1;P[1,C]
810  NEXT C
820  FOR C=3 TO 9 STEP 3
830  PRINT #1;F[1,C-2],FNV(F[1,C-1]),F[1,C]
840  NEXT C
850  B$="PHASER"
860  GOTO 1200
870  REM  ****  COMMAND:  FIRE PHOTON TORPEDOES  ****
880  PRINT "HELM:  FIRE TORPEDOES [1-6]";
890  INPUT B$
900  C4=0
910  MAT Z=ZER
920  FOR G5=1 TO LEN(B$)
930  GOSUB 1280
940  IF C3=0 OR C3>6 THEN 1130
950  IF T[1,C3*5-1] <= 0 OR T[1,C3*5-3] <= 0 THEN 1050
960  C4=C4+1
970  FOR C5=1 TO C4
980  IF C3=Z[C5] THEN 1130
990  NEXT C5
1000  Z[C4]=C3
1010  S=T[1,C3*5]
1020  IF S <= 0 THEN 1080
1030  GOSUB 1510
1040  IF V <= 90 OR V >= 270 THEN 1110
1050  W$[3,3]=D$[C3+1,C3+1]
1060  X$[LEN(X$)+1,LEN(X$)+4]=W$
1070  GOTO 1130
1080  GOSUB 1720
1090  T[1,C3*5-2]=FNE(ABS(S)+Y3)
1100  GOTO 1120
1110  T[1,C3*5-2]=FNE(V+Y3)
1120  T[1,C3*5-4]=0
1130  NEXT G5
1140  GOSUB 1360
1150  PRINT #1;8
1160  FOR C=3 TO 28 STEP 5
1170  PRINT #1;T[1,C-2],FNV(T[1,C])
1180  NEXT C
1190  B$="TORPEDOE"
1200  IF  NOT LEN(X$) THEN 1250
1210  PRINT "COMPUTER:  "B$"(S)"X$" UNABLE TO FIRE"
1220  GOTO 1250
1230  PRINT "BAD PARAMETERS"
1240  GOSUB 1360
1250  A1=0
1260  CHAIN "*YTREKF"
1270  REM  ****  NUMBER DEFINITION SUBROUTINE  ****
1280  FOR M5=1 TO 10
1290  IF B$[G5,G5]=D$[M5,M5] THEN 1330
1300  NEXT M5
1310  C3=0
1320  RETURN 
1330  C3=M5-1
1340  RETURN 
1350  REM  ****  FILE UPDATE SUBROUTINE  ****
1360  READ #1,Y;S,O2,T2,T1,T0
1370  T8=T2*1440+T1*60+T0
1380  T9=TIM(2)*1440+TIM(1)*60+TIM(0)
1390  IF T9-T8 <= 3 THEN 1430
1400  PRINT "**DEFAULT**"
1410  PRINT #1,Y;-2,O2,T2,T1,T0,S$[1,7]
1420  CHAIN "*YTREKM"
1430  PRINT #1,Y;2,O,TIM(2),TIM(1),TIM(0),S$[1,7]
1440  IF  NOT H5 THEN 1470
1450  PRINT #1;0,FNV(FND(V[H5,1]-V9*180))
1460  Y[1,2]=FND(V[H5,1]-V9*180)
1470  IF U[1] THEN 1490
1480  PRINT #1;2
1490  RETURN 
1500  REM  ****  ATTACK SUBROUTINE  ****
1510  IF S <= 4 THEN 1630
1520  S=S-4
1530  Y4=Y[S,1]
1540  S1=S[S,1]
1550  PRINT S$[S*7-6,S*7]":  COURSE [0-360]";
1560  INPUT Y[S,1]
1570  IF Y[S,1]>360 OR Y[S,1]<0 THEN 1550
1580  Y[S,1]=FND(ABS(Y[S,1]-((Y[S,1]>315)*360)-315)-45)
1590  PRINT TAB(10)"WARP FACTOR [-8 TO 8]";
1600  INPUT S[S,1]
1610  IF ABS(S[S,1])>8 THEN 1590
1620  GOTO 1680
1630  Y4=Y[S,1]
1640  S1=S[S,1]
1650  IF A1#24 THEN 1680
1660  Y[S,1]=Y9
1670  S[S,1]=S9
1680  L2=L[S-1]
1690  I2=I[S-1]
1700  T=V[S-1,1]
1710  T3=V[S-1,2]
1720  Y2=Y[1,1]
1730  S2=S[1,1]
1740  S5=S[1,1]^3
1750  S6=S[1,2]^3
1760  S7=S5+((ABS(S6-S5) MIN 64)*SGN(S6-S5))
1770  S[1,1]=SGN(S7)*ABS(S7)^(1/3)
1780  IF FND(Y[1,2]-Y[1,1])<180 THEN 1810
1790  Y[1,1]=FND(Y[1,1]-(FNU(S[1,1]) MIN (360-FND(Y[1,2]-Y[1,1]))))
1800  GOTO 1820
1810  Y[1,1]=FNE(Y[1,1]+(FNU(S[1,1]) MIN FND(Y[1,2]-Y[1,1])))
1820  IF S <= 0 THEN 1860
1830  S=S-1
1840  GOSUB 2000
1850  S=S+1
1860  Y3=Y[1,1]
1870  Y[1,1]=Y2
1880  S[1,1]=S2
1890  IF S>0 THEN 1910
1900  RETURN 
1910  V=FND(V[S-1,1]-Y3)
1920  L[S-1]=L2
1930  I[S-1]=I2
1940  V[S-1,2]=T3
1950  V[S-1,1]=T
1960  Y[S,1]=Y4
1970  S[S,1]=S1
1980  RETURN 
1990  REM  ****  SUBROUTINE PLOTTING SHIP'S MOVEMENT  ****
2000  L[S]=L[S]-((ABS(S[S+1,1]^3)*100)*COS(FNT(FND(Y[S+1,1]-((S[S+1,1]<0)*180)))))
2010  L[S]=L[S]-((ABS(S[1,1]^3)*100)*SIN(FNT(FND(Y[1,1]-((S[1,1]<0)*180)))))
2020  I[S]=I[S]-((ABS(S[S+1,1]^3)*100)*SIN(FNT(FND(Y[S+1,1]-((S[S+1,1]<0)*180)))))
2030  I[S]=I[S]-((ABS(S[1,1]^3)*100)*COS(FNT(FND(Y[1,1]-((S[1,1]<0)*180)))))
2040  V[S,1]=FNE(FNN(L[S]/I[S])+((I[S]<0)*180))
2050  D[S]=SQR(I[S]^2+L[S]^2)
2060  L[S]=D[S]*SIN(FNT(V[S,1]))
2070  I[S]=D[S]*COS(FNT(V[S,1]))
2080  V[S,2]=FNE(FNN(I[S]/L[S])+((L[S]<0)*180))
2090  RETURN 
2100  END 
