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  REM
220  GOTO O-10 OF 230,870,1230,1710,1710,1950,2110,2110,2650,2920
230  REM  ----- (11) PROBE CONTROL -----
240  K=0
250  FOR J=1 TO I1
260  IF I[J]#I[I]+20 THEN 410
270  IF K THEN 310
280  PRINT 
290  PRINT "PROBE BEARNG RANGE  COURSE TIME  PROX UNITS   DIST    TARGET"
300  K=1
310  GOSUB 3710
320  R=SQR(X*X+Y*Y)
330  PRINT J;INT(B);INT(R);TAB(21);INT(C[J]);INT((10000-K[J])*D1);
340  PRINT INT(L[J]);INT(F[J]);
350  IF J[J]=0 THEN 400
360  V=I[J[J]]
370  GOSUB 3600
380  PRINT INT(SQR((X[J]-X[J[J]])^2+(Y[J]-Y[J[J]])^2)+.5);TAB(55);V$
390  GOTO 410
400  PRINT 0;TAB(55);"NONE"
410  NEXT J
420  PRINT 
430  IF K THEN 460
440  PRINT "SULU:  WHAT PROBES?"
450  GOTO 3470
460  PRINT "CHEKOV:  DETONATE ALL PROBES?"
470  PRINT N$":  [YES OR NO] ";
480  ENTER T2,T,X$
490  PRINT 
500  IF LEN(X$)=0 THEN 580
510  IF X$[1,1]="N" THEN 580
520  PRINT "CHEKOV:  AYE, "O$"."
530  FOR J=1 TO I1
540  IF I[J]#I[I]+20 THEN 560
550  K[J]=10000
560  NEXT J
570  GOTO 3470
580  PRINT "   CONTROL PROBE [#] ";
590  ENTER T2,T,J
600  PRINT 
610  IF T<0 THEN 3320
620  IF J<1 OR J>I1 THEN 3320
630  IF I[J]#I[I]+20 THEN 3320
640  PRINT "CHEKOV:  DETONATE IT?"
650  PRINT N$":  [YES OR NO] ";
660  ENTER T2,T,X$
670  PRINT 
680  IF LEN(X$)=0 THEN 720
690  IF X$[1,1]="N" THEN 720
700  K[J]=10000
710  GOTO 3470
720  PRINT "   LOCK IT ONTO [WHOM?] ";
730  GOSUB 3480
740  IF V1>10 THEN 780
750  PRINT "CHEKOV:  LOCKING."
760  J[J]=V1
770  GOTO 3470
780  PRINT "   SET IT TO COURSE [0-360] ";
790  ENTER T2,T,C
800  PRINT 
810  IF T<0 THEN 3320
820  IF C<0 OR C >= 360 THEN 3320
830  PRINT "SULU:  SETTING IN NEW COURSE."
840  D[J]=C
850  J[J]=0
860  GOTO 3470
870  REM  ----- (12) *POSITION REPORT -----
880  REM  (LONGEST NAME)
890  L=0
900  FOR J=1 TO N
910  V=I[J]
920  IF V=0 OR V>10 THEN 960
930  GOSUB 3600
940  IF LEN(V$)<L THEN 960
950  L=LEN(V$)
960  NEXT J
970  REM  (REPORT)
980  PRINT 
990  PRINT TAB(L)"   WARP COURSE BEARING RANGE"
1000  FOR J=1 TO I1
1010  V=I[J]
1020  IF V=0 OR V>10 THEN 1200
1030  GOSUB 3600
1040  PRINT TAB(L-LEN(V$));V$": ";
1050  PRINT  USING 1060;INT(10*A[J]+.5)*.1,INT(C[J]+.5)
1060  IMAGE #,3D.D,6D,2X
1070  IF J=I THEN 1120
1080  GOSUB 3710
1090  R=SQR(X*X+Y*Y)
1100  PRINT " "INT(B+.5);INT(R+.5);
1110  GOTO 1190
1120  IF J[J]=0 THEN 1190
1130  V=I[ABS(J[J])]
1140  GOSUB 3600
1150  IF J[J]>0 THEN 1180
1160  PRINT "ELUDING "V$;
1170  GOTO 1190
1180  PRINT "PURSUING "V$;
1190  PRINT 
1200  NEXT J
1210  I=0
1220  GOTO 3470
1230  REM  ----- (13) *POSITION DISPLAY -----
1240  IF Z[I,2] THEN 3400
1250  PRINT "   DISPLAY TO [100-5000] ";
1260  ENTER T3,T,Z
1270  PRINT 
1280  IF T<0 THEN 1300
1290  IF Z >= 100 AND Z <= 5000 THEN 1320
1300  PRINT "SPOCK:  DESIGNATE BETWEEN 100 AND 5000."
1310  GOTO 1250
1320  X=Z/10
1330  Y=Z/6
1340  FOR K=1 TO 21
1350  Y$[K,K]=" "
1360  Z$[K,K]="-"
1370  NEXT K
1380  FOR K=6 TO -6 STEP -1
1390  IF ABS(K)=6 THEN 1420
1400  X$=Y$
1410  GOTO 1430
1420  X$=Z$
1430  FOR L=1 TO I1
1440  IF  NOT I[L] OR I=L THEN 1580
1450  IF K#INT((Y[L]-Y[I])/Y+.5) THEN 1580
1460  Z=INT((X[L]-X[I])/X+10.5)
1470  IF Z<1 OR Z>21 THEN 1580
1480  GOTO INT((I[L]-1)*.1)+1 OF 1490,1520,1540,1560
1490  V=I[L]
1500  GOSUB 3600
1510  GOTO 1570
1520  V$="#"
1530  GOTO 1570
1540  V$="*"
1550  GOTO 1570
1560  V$=":"
1570  X$[Z,Z]=V$[1,1]
1580  NEXT L
1590  IF K#0 THEN 1610
1600  X$[11,11]="+"
1610  FOR L=21 TO 1 STEP -1
1620  IF X$[L,L]#" " THEN 1660
1630  NEXT L
1640  PRINT LIN(-1);
1650  GOTO 1670
1660  PRINT X$[1,L]
1670  NEXT K
1680  PRINT 
1690  I=0
1700  GOTO 3470
1710  REM  ----- (14 AND 15) PURSUE OR RUN -----
1720  IF Z[I,1] THEN 3380
1730  IF O=15 THEN 1760
1740  PRINT "   CHEKOV, PURSUE [WHOM?] ";
1750  GOTO 1770
1760  PRINT "   CHEKOV, RUN FROM [WHOM?] ";
1770  GOSUB 3480
1780  IF V1>10 THEN 3320
1790  PRINT "   WARP FACTOR [-8 TO 8] ";
1800  ENTER T3,T,Z
1810  PRINT 
1820  IF T<0 THEN 3320
1830  IF ABS(Z) >= 1 AND Z[I,4] THEN 3420
1840  B[I]=Z
1850  J=V1
1860  GOSUB 3710
1870  PRINT "CHEKOV:  AYE, "O$", COMING TO COURSE";
1880  IF O=15 THEN 1920
1890  PRINT INT(B)
1900  J[I]=J
1910  GOTO 3470
1920  J[I]=-J
1930  PRINT INT(FNC(B+180))
1940  GOTO 3470
1950  REM  ----- (16) MANUAL HELM -----
1960  PRINT "   HELMSMAN, COME TO COURSE [0-360] ";
1970  ENTER T3,T,Z
1980  PRINT 
1990  IF T<0 THEN 3320
2000  IF Z<0 OR Z>360 THEN 3360
2010  D[I]=Z
2020  J[I]=0
2030  PRINT "   WARP FACTOR [-8 TO 8] ";
2040  ENTER T3,T,Z
2050  PRINT 
2060  IF T<0 THEN 3320
2070  IF ABS(Z) >= 1 AND Z[I,4] THEN 3420
2080  B[I]=Z
2090  PRINT "SULU:  AYE, "O$"."
2100  GOTO 3470
2110  REM  ----- (17 AND 18) DAMAGE/SCAN REPORT -----
2120  IF O=18 THEN 2170
2130  J=I
2140  V=I[I]
2150  GOSUB 3600
2160  GOTO 2220
2170  IF Z[I,2] THEN 3400
2180  PRINT "   SPOCK, SCAN [WHOM?] ";
2190  GOSUB 3480
2200  IF V1>10 THEN 3360
2210  J=V1
2220  PRINT 
2230  PRINT "DAMAGES TO "V$":"
2240  PRINT 
2250  RESTORE 2260
2260  DATA "COMPUTER INOPERABLE","SENSORS ANNIHILATED"
2270  DATA "PROBE LAUNCHER SHOT","WARP DRIVE DISABLED"
2280  DATA "ENGINEERING JETTISONED"
2290  FOR K=1 TO 5
2300  READ X$
2310  IF Z[J,K]=0 THEN 2330
2320  PRINT X$".  ";
2330  NEXT K
2340  PRINT "SURVIVORS:"Z[J,6]
2350  PRINT 
2360  PRINT "PHASERS: ";
2370  FOR K=1 TO K1
2380  IF M[J,K]<0 THEN 2410
2390  PRINT INT(Q[J,K]);
2400  GOTO 2420
2410  PRINT " XX   ";
2420  NEXT K
2430  PRINT 
2440  PRINT "  TUBES: ";
2450  FOR K=1 TO K2
2460  IF T[J,K]<0 THEN 2490
2470  PRINT INT(V[J,K]);
2480  GOTO 2500
2490  PRINT " XX   ";
2500  NEXT K
2510  PRINT 
2520  PRINT "SHIELDS: ";
2530  FOR K=1 TO 4
2540  PRINT INT(S[J,K]*S[J,K+4]);
2550  NEXT K
2560  PRINT 
2570  PRINT 
2580  PRINT "  EFFICIENCY:"E[J]
2590  PRINT "REGENERATION:"G[J]
2600  PRINT "FUEL REMAINING:"INT(F[J]+.5)
2610  PRINT "FUEL CAPACITY:"INT(H[J]+.5)
2620  PRINT 
2630  I=((O=18) AND  NOT Z9)
2640  GOTO 3470
2650  REM  ----- (19) POWER DISTRIBUTION -----
2660  PRINT 
2670  PRINT "SCOTT:  REGENERATION RATE IS"G[I]
2680  MAT W=ZER[4]
2690  PRINT "   DESIGNATE SHIELD DRAIN (X,X,X,X)."
2700  PRINT N$":  SHIELD DRAINS ARE [0-1] ";
2710  MAT  INPUT W
2720  FOR K=1 TO 4
2730  IF W[K] >= 0 AND W[K] <= 1 THEN 2770
2740  PRINT "MINIMUM DRAIN FOR SHIELDS IS ZERO (0), MAXIMUM IS ONE (1)."
2750  PRINT "TRY AGAIN."
2760  GOTO 2690
2770  S[I,K]=W[K]
2780  NEXT K
2790  MAT W=ZER[K1]
2800  PRINT "SCOTT:  DESIGNATE PHASER DRAIN/DISCHARGE (X,X,X,X)."
2810  PRINT N$":  CHARGE/DISCHARGE RATES ARE [-10 TO 10] ";
2820  MAT  INPUT W
2830  FOR K=1 TO K1
2840  IF W[K] >= -10 AND W[K] <= 10 THEN 2880
2850  PRINT "FOR PHASERS, MAXIMUM DISCHARGE IS -10, MAXIMUM CHARGE IS 10."
2860  PRINT "TRY AGAIN."
2870  GOTO 2800
2880  R[I,K]=W[K]
2890  NEXT K
2900  PRINT 
2910  GOTO 3470
2920  REM  ----- (20) FIRING PARAMETERS -----
2930  PRINT 
2940  PRINT "CHEKOV:  RESET TUBES, "O$"?"
2950  PRINT N$":  [YES OR NO] ";
2960  ENTER T2,T,X$
2970  PRINT 
2980  IF X$[1,1]="" THEN 3180
2990  IF X$[1,1]="N" THEN 3180
3000  PRINT "   SET LAUNCH SPEED TO [0-12] ";
3010  ENTER T2,T,Q1
3020  PRINT 
3030  IF T<0 THEN 3060
3040  IF Q1<0 OR Q1>12 THEN 3060
3050  T[I,K2+1]=Q1
3060  PRINT "   ...TIME DELAY TO [0-10] ";
3070  ENTER T2,T,Q2
3080  PRINT 
3090  IF T<0 THEN 3120
3100  IF Q2<0 OR Q2>10 THEN 3120
3110  T[I,K2+2]=Q2
3120  PRINT "   ...PROXIMITY DELAY TO [0-500] ";
3130  ENTER T2,T,Q3
3140  PRINT 
3150  IF T<0 THEN 3180
3160  IF Q3<0 OR Q3>500 THEN 3180
3170  T[I,K2+3]=Q3
3180  PRINT "CHEKOV:  RESET PHASERS, "O$"?"
3190  PRINT N$":  [YES OR NO] ";
3200  ENTER T2,T,X$
3210  PRINT 
3220  IF X$[1,1]="" THEN 3470
3230  IF X$[1,1]="N" THEN 3470
3240  PRINT "   RESET FIRING PERCENTAGE TO [0-100] ";
3250  ENTER T3,T,X
3260  PRINT 
3270  IF T<0 THEN 3320
3280  IF X<0 OR X>100 THEN 3360
3290  M[I,K1+2]=X
3300  GOTO 3470
3310  REM     ----- ERROR MESSAGES -----
3320  PRINT "**TIME**"
3330  GOTO 3470
3340  PRINT "CHEKOV:  WHAT?"
3350  GOTO 3470
3360  PRINT "SPOCK:  BAD PARAMETER(S)."
3370  GOTO 3470
3380  PRINT "SPOCK:  IMPOSSIBLE, "O$", OUR COMPUTER IS INOPERABLE."
3390  GOTO 3470
3400  PRINT "SPOCK:  OUR SENSORS ARE DAMAGED."
3410  GOTO 3470
3420  PRINT "SCOTT:  WARP DRIVE IS DEAD."
3430  GOTO 3470
3440  REM
3450  REM     ----- EXIT -----
3460  REM
3470  CHAIN "*TREK07"
3480  REM          ----- NAME COMPARISON SUBROUTINE -----
3490  ENTER T3,T,X$
3500  PRINT 
3510  IF LEN(X$)=0 THEN 3580
3520  FOR V1=2 TO 10
3530  V=I[V1]
3540  IF  NOT V OR V>10 THEN 3570
3550  GOSUB 3600
3560  IF X$[1,1]=V$[1,1] THEN 3590
3570  NEXT V1
3580  V1=11
3590  RETURN 
3600  REM          ----- NAME SELECTION SUBROUTINE -----
3610  RESTORE 3620
3620  DATA "BISMARK","CENTAUR","DRADDOCK","FORBIN","KREIGER","SHLURG"
3630  DATA "TRAKKA","VARNOR","WARRIOR"
3640  IF V>1 THEN 3670
3650  V$=P$
3660  RETURN 
3670  FOR V2=2 TO V
3680  READ V$
3690  NEXT V2
3700  RETURN 
3710  REM          ----- BEARING SUBROUTINE -----
3720  X=X[J]-X[I]
3730  Y=Y[J]-Y[I]
3740  IF X=0 THEN 3770
3750  B=ATN(Y/X)*57.2958
3760  GOTO 3780
3770  B=90
3780  IF X >= 0 AND Y >= 0 THEN 3820
3790  B=B+180
3800  IF X<0 THEN 3820
3810  B=B+180
3820  RETURN 
3830  REM          ----- SLOT I SUBROUTINE -----
3840  FOR I3=1 TO I2
3850  IF I[I3]=0 THEN 3910
3860  NEXT I3
3870  PRINT 
3880  PRINT "GAME WILL TERMINATE BECAUSE OF INABILITY TO COPE WITH"
3890  PRINT "ALL THE JUNK (VESSELS, PROBES, TORPEDOES, ETC) IN SPACE."
3900  STOP 
3910  I[I3]=1000
3920  A[I3]=B[I3]=C[I3]=D[I3]=E[I3]=F[I3]=J[I3]=K[I3]=L[I3]=0
3930  X[I3]=X[I]
3940  Y[I3]=Y[I]
3950  FOR I1=I2 TO 1 STEP -1
3960  IF I[I1]>0 THEN 3990
3970  NEXT I1
3980  I[I3]=0
3990  RETURN 
4000  END 
