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  I=I+1
230  IF I>10 THEN 460
240  IF I[I]=0 OR I[I]>10 THEN 220
250  IF  NOT Z[I,6] THEN 220
260  M=V=I[I]
270  GOSUB 4430
280  M$=V$
290  IF I[I]>1 THEN 480
300  IF Z9 AND  NOT Z[I,1] AND RND(0)>.5 THEN 470
310  O=0
320  CHAIN A9,D$
330  PRINT '14N$": CODE [1-30] ";
340  ENTER T3,T,O
350  PRINT 
360  IF T>0 OR Z9 THEN 390
370  PRINT "**TIME**"
380  GOTO 220
390  IF Z9 AND  NOT Z[I,1] AND O#12 AND O#13 AND O#17 AND O#18 AND O#29 AND O#30 THEN 470
400  GOTO INT((O-1)*.1)+1 OF 420,430,440,450
410  GOTO 220
420  CHAIN "*TREK01"
430  CHAIN "*TREK02"
440  CHAIN "*TREK03"
450  CHAIN "*TREK04"
460  CHAIN "*TREK06"
470  CHAIN "*TREK05"
480  REM          ENEMY STRATEGY BY WILLIAM CHAR
490  REM          MAIN VERSION, 25 NOVEMBER 1973
500  J1=J=1
510  R=FNS(X)
520  GOSUB 4540
530  B2=FNC(B-C[I])
540  GOTO O1 OF 560,4380,4380,1720,1720
550  GOTO 600
560  B[I]=1
570  D[I]=0
580  GOTO 220
590  REM  -- DEFENSELESS RUSE EFFECTS --
600  GOTO P1 OF 620,660,730,780,780
610  GOTO 850
620  IF .3>RND(1) THEN 650
630  PRINT "SULU:  NO APPARENT CHANGE IN ENEMY'S ACTIONS."
640  GOTO 830
650  P1=2
660  GOTO FNR(2) OF 670,700
670  J[I]=-J
680  B[I]=1
690  GOTO 850
700  J[I]=J
710  B[I]=1
720  GOTO 850
730  PRINT "SULU:  THE "M$" ";
740  IF J[I]>1 THEN 770
750  PRINT "IS TURNING AWAY."
760  GOTO 780
770  PRINT "IS CAUTIOUSLY ADVANCING."
780  IF ABS(A[J])>1 OR R<200 THEN 830
790  FOR K=1 TO 4
800  IF S[J,K] THEN 830
810  NEXT K
820  GOTO 850
830  P1=6
840  REM  -- CORBOMITE BLUFF EFFECTS --
850  GOTO P2 OF 870,1050,1080,1080,1080
860  GOTO 1120
870  X=.4
880  IF R$#"ROMULAN" THEN 900
890  X=.6
900  IF X>RND(1) THEN 980
910  PRINT "UHURA:  MESSAGE COMING IN FROM THE "R$"'S."
920  PRINT N$":  PUT IT ON AUDIO."
930  GOTO FNR(2) OF 940,960
940  PRINT S$":  HA, HA, HA, "N$".  YOU LOSE."
950  GOTO 1100
960  PRINT S$":  I FELL FOR THAT THE LAST TIME WE MET, IDIOT!"
970  GOTO 1100
980  PRINT "SPOCK:  "R$"S GIVING GROUND, CAPTAIN.  OBVIOUSLY, THEY"
990  PRINT "   TAPPED IN AS YOU EXPECTED THEM TO."
1000  PRINT N$":  A LOGICAL ASSUMPTION, MR. SPOCK.  ARE THEY STILL"
1010  PRINT "   RETREATING?"
1020  PRINT "SPOCK:  YES, "O$"."
1030  PRINT N$":  GOOD.  ALL HANDS, STAND BY."
1040  P2=2
1050  J[I]=-J
1060  B[I]=3+FNR(7)
1070  GOTO 1120
1080  IF ABS(A[J])>2 THEN 1100
1090  GOTO 1120
1100  P2=6
1110  REM  -- SURRENDER --
1120  GOTO P3 OF 1160,1310,1340,1340,1340
1130  IF  NOT P3 OR P3=7 OR  NOT R>50 THEN 1440
1140  P3=5
1150  GOTO 1340
1160  X=.5
1170  IF R$#"ROMULAN" THEN 1200
1180  X=.05
1190  PRINT "CHEKOV:  THE "R$"S DO NOT TAKE SURVIVORS."
1200  IF X>RND(1) THEN 1260
1210  GOTO FNR(2) OF 1220,1240
1220  PRINT S$":  PREPARE TO DIE, CHICKEN "N$"!"
1230  GOTO 1420
1240  PRINT "UHURA:  NO REPLY FROM THE "R$"S."
1250  GOTO 1420
1260  PRINT "UHURA:  MESSAGE COMING IN FROM THE "M$"."
1270  PRINT S$":  ON BEHALF OF THE "R$" EMPIRE.  I ACCEPT YOUR SURRENDER"
1280  PRINT "  YOU HAVE FIVE SECONDS TO DROP YOUR SHIELDS, CUT"
1290  PRINT "   WARP, AND PREPARE TO BE BOARDED."
1300  P3=2
1310  J[I]=J
1320  B[I]=2
1330  GOTO 1720
1340  FOR K=1 TO 4
1350  IF S[J,K] THEN 1720
1360  NEXT K
1370  IF R>400 THEN 1390
1380  B[I]=1
1390  IF R>200 OR ABS(A[J])>1 THEN 1720
1400  O1=4
1410  GOTO 1720
1420  P3=7
1430  REM  -- ENEMY SURRENDER CONTEMPLATION --
1440  GOTO P4 OF 1460,1570
1450  GOTO 1660
1460  IF N$[1,4]="KOHN" THEN 1540
1470  FOR L=2 TO 10
1480  IF I[L]<10 AND Z[L,6]>100 THEN 1630
1490  NEXT L
1500  X=.5
1510  IF R$#"ROMULAN" THEN 1530
1520  X=.05
1530  IF X<RND(1) THEN 1630
1540  PRINT S$":  AS MUCH AS I HATE TO, CAPTAIN "N$", WE WILL SURRENDER."
1550  PRINT "   WE ARE DROPPING SHIELDS.  YOU MAY BOARD US."
1560  P4=2
1570  FOR K=1 TO 4
1580  S[I,K]=0
1590  NEXT K
1600  B[I]=0
1610  O1=5
1620  GOTO 1720
1630  PRINT S$":  YOU MUST BE JOKING, CAPTAIN "N$".  WHY DON'T YOU"
1640  PRINT "   SURRENDER?"
1650  P4=6
1660  IF P1>0 AND P1<6 THEN 1720
1670  IF P2>0 AND P2<6 THEN 1720
1680  IF P3>0 AND P3<6 THEN 1720
1690  IF P4>0 AND P4<6 THEN 1720
1700  GOTO 1960
1710  REM  -- UNSPORTSMANLIKE FIRING --
1720  FOR K=1 TO K1
1730  IF M[J,K]>99 THEN 1840
1740  NEXT K
1750  FOR K=1 TO K2
1760  IF T[J,K]>99 THEN 1840
1770  NEXT K
1780  IF P1>0 AND P1<6 THEN 220
1790  IF P2>0 AND P2<6 THEN 220
1800  IF P3>0 AND P3<6 THEN 220
1810  IF P4>0 AND P4<6 THEN 220
1820  IF O1=4 OR O1=5 THEN 220
1830  GOTO 1960
1840  PRINT S$":  HOW DARE YOU FIRE UPON US!  WE ARE RESUMING OUR"
1850  PRINT "   ATTACK!"
1860  O1=0
1870  IF P1=0 THEN 1890
1880  P1=6
1890  IF P2=0 THEN 1910
1900  P2=6
1910  IF P3=0 THEN 1930
1920  P3=8
1930  IF P4=0 THEN 1960
1940  P4=6
1950  REM     ----- RESUMPTION OF NORMAL PLAY -----
1960  FOR J=1 TO I1
1970  IF I[J]=I+20 THEN 2000
1980  IF I[J]=0 OR I[J]<21 OR I[J]>30 THEN 2000
1990  GOTO 2020
2000  NEXT J
2010  GOTO 2100
2020  GOSUB 4550
2030  A[I]=9+FNR(2)
2040  C[I]=FNC(B+90)
2050  J[I]=0
2060  IF  NOT Z[I,4] THEN 2080
2070  A[I]=.99
2080  GOTO 2220
2090  REM  (TORPEDOES NEAR?)
2100  FOR J=1 TO I1
2110  IF I[J]=I+30 THEN 2140
2120  IF I[J]=0 OR I[J]<31 OR I[J]>40 THEN 2140
2130  GOTO 2160
2140  NEXT J
2150  GOTO 2220
2160  GOSUB 4550
2170  A[I]=3+FNR(2)
2180  C[I]=FNC(B+90)
2190  J[I]=0
2200  IF  NOT Z[I,4] THEN 2220
2210  A[I]=.99
2220  J=J1
2230  IF R>3800 THEN 3270
2240  IF R>1200 THEN 2700
2250  REM  --CLOSE RANGE--
2260  REM  (FIRE PHASERS?)
2270  M[I,K1+1]=10
2280  L=0
2290  FOR K=1 TO K1
2300  IF M[I,K]<0 THEN 2350
2310  GOSUB 5170
2320  IF F<10 THEN 2350
2330  M[I,K]=M[I,K]+100
2340  L=L+1
2350  NEXT K
2360  IF L THEN 3810
2370  REM  (PROBE NEAR)
2380  FOR J=1 TO I1
2390  IF I[J]=0 OR I[J]<21 OR I[J]>30 THEN 2410
2400  IF SQR((X[I]-X[J])^2+(Y[I]-Y[J])^2)<1750 THEN 3850
2410  NEXT J
2420  J=J1
2430  REM  (FEDERATION BEHIND)
2440  IF B2>135 AND B2<225 THEN 3850
2450  REM  (PHASERS LOCKED)
2460  L=0
2470  FOR K=1 TO K1
2480  IF M[I,K]<0 OR M[I,K]=J THEN 2510
2490  M[I,K]=J
2500  L=1
2510  NEXT K
2520  IF L THEN 220
2530  REM  (LAUNCH PROBE?)
2540  IF B2<90 OR B2>270 THEN 2570
2550  IF Z[I,3]=0 AND F[1]>10 AND ABS(A[J]) <= 1 THEN 3950
2560  REM  (SELF-DESTRUCT?)
2570  IF F[I]<10 AND G[I]<4 AND K[I]<10000-5/D1 THEN 4090
2580  REM  (SET COURCE)
2590  IF J[I]=J AND A[I]+ABS(A[J])<3 THEN 2700
2600  B[I]=ABS(A[J])
2610  J[I]=J
2620  IF Z[I,4]=0 THEN 220
2630  B[I]=.99
2640  REM  (TIME TO RUN?)
2650  IF ABS(B[I])<1 THEN 2700
2660  B[I]=-.99
2670  GOTO 220
2680  REM  --MEDIUM RANGE--
2690  REM  (FIRE TORPEDOES?)
2700  FOR J=2 TO N
2710  IF J=I OR I[J]>10 THEN 2760
2720  GOSUB 4540
2730  B1=FNC(B-C[I])
2740  IF B1<5 OR B1>335 THEN 2840
2750  IF SQR((X[I]-X[J])^2+(Y[I]-Y[J])^2)<300 THEN 2840
2760  NEXT J
2770  L=0
2780  FOR K=1 TO K2
2790  IF T[I,K]<1 OR V[I,K]<1 THEN 2830
2800  T[I,K]=T[I,K]+100
2810  L=L+1
2820  IF L>FNR(6) THEN 4150
2830  NEXT K
2840  J=J1
2850  REM  (PHASERS LOCKED)
2860  L=0
2870  FOR K=1 TO K1
2880  IF M[I,K]<0 OR M[I,K]=J THEN 2910
2890  M[I,K]=J
2900  L=1
2910  NEXT K
2920  IF L THEN 220
2930  REM  (TO RUN, OR NOT TO RUN)
2940  IF Z[I,4]=0 THEN 3040
2950  IF ABS(A[J]) >= 1 THEN 4380
2960  FOR K=1 TO K1
2970  IF M[I,K] >= 0 THEN 3040
2980  NEXT K
2990  FOR K=1 TO K2
3000  IF T[I,K] >= 0 THEN 3040
3010  NEXT K
3020  GOTO 4380
3030  REM  (PURSUED, BEHIND, LOW POWER:  JETTISON ENGINEERING)
3040  IF F[I]>10 OR G[I]>4 THEN 3070
3050  IF J[J]*A[J]>0 AND Z[I,3]=0 AND Z[I,5]=0 THEN 4200
3060  REM  (PURSUED, BEHIND, SLOW:  LAUNCH PROBE)
3070  IF B2<90 OR B2>270 THEN 3100
3080  IF J[J]*A[J]>0 AND F[I]>10 AND Z[I,3]=0 THEN 3950
3090  REM  (SCAN?)
3100  IF B2>135 AND B2<225 THEN 4350
3110  REM  (FED DESTRUCTING?)
3120  IF K[J]>10000-10/D1 THEN 3850
3130  REM  (SET COURSE)
3140  IF B[I]>ABS(A[J])+1 AND J[I]=J THEN 3280
3150  B[I]=11 MIN ABS(A[J])+1+FNR(2)
3160  IF Z[I,4]=0 THEN 3180
3170  B[I]=.99
3180  GOTO FNR(2) OF 3190,3220
3190  REM  DIRECT COURSE
3200  J[I]=J
3210  GOTO 3440
3220  REM  PARALLEL COURSE
3230  D[I]=D[J]
3240  J[I]=0
3250  GOTO 3440
3260  REM  --DISTANT RANGE--
3270  REM  (LOW POWER?)
3280  IF (F[I]<10 AND G[I]<4.5) OR Z[I,4] THEN 4380
3290  REM  (FED DESTRUCTING?)
3300  IF K[J]>10000-10/D1 THEN 3850
3310  REM  (ATTACK?)
3320  J[I]=J
3330  IF F[I]<5 THEN 3410
3340  IF B2>60 AND B2<300 THEN 3420
3350  IF B[I]>ABS(A[J])+2 THEN 3440
3360  B[I]=11 MIN ABS(A[J])+2+FNR(2)
3370  IF  NOT Z[I,4] THEN 3390
3380  B[I]=.99
3390  PRINT "SULU:  "M$" ATTACKING."
3400  GOTO 3440
3410  IF B[I]<1 THEN 3440
3420  B[I]=0
3430  GOTO 3440
3440  FOR K=1 TO K2
3450  IF ABS(A[J])>3 AND  NOT T[I,K]<0 AND  NOT U[I,K]=-J THEN 3690
3460  IF ABS(A[J])>3 AND  NOT T[I,K]<0 AND  NOT T[I,K]=J THEN 3600
3470  NEXT K
3480  REM  (TUBES LOADED?)
3490  L=0
3500  FOR K=1 TO K2
3510  IF T[I,K]<0 OR V[I,K] >= 10 THEN 3570
3520  Q=10-V[I,K] MIN F[I]
3530  F[I]=F[I]-Q
3540  H[I]=H[I]-Q
3550  V[I,K]=V[I,K]+Q
3560  L=L+1
3570  NEXT K
3580  IF L THEN 220
3590  REM  (TUBES LOCKED?)
3600  L=0
3610  FOR K=1 TO K2
3620  IF T[I,K]<0 OR T[I,K]=J THEN 3650
3630  T[I,K]=J
3640  L=L+1
3650  NEXT K
3660  IF L THEN 220
3670  GOTO 3780
3680  REM  (TUBES LED?)
3690  L=0
3700  FOR K=1 TO K2
3710  IF T[I,K]<0 OR U[I,K]<0 THEN 3750
3720  T[I,K]=0
3730  U[I,K]=-J
3740  L=L+1
3750  NEXT K
3760  IF L THEN 220
3770  REM  (FIRE TORPEDOES)
3780  GOTO 4150
3790  REM     ----- COMMAND EXECUTION -----
3800  REM  (FIRING PHASERS)
3810  M[I,K1+1]=10
3820  M[I,K1+2]=100
3830  GOTO 220
3840  REM  (TAKE EVASIVE ACTION)
3850  PRINT M$" TAKING EVASIVE ACTION."
3860  B[I]=2+FNR(8)
3870  D[I]=FNR(360)
3880  IF Z[I,4] THEN 3910
3890  J[I]=0
3900  GOTO 220
3910  J[I]=J
3920  B[I]=.99
3930  GOTO 220
3940  REM  (LAUNCH PROBE)
3950  GOSUB 4660
3960  PRINT M$" LAUNCHING PROBE"I3
3970  A[I3]=B[I3]=2
3980  F[I3]=30 MIN F[I]
3990  F[I]=F[I]-F[I3]
4000  H[I]=H[I]-F[I3]
4010  I[I3]=I[I]+20
4020  J[I3]=J
4030  K[I3]=10000-15/D1
4040  L[I3]=200+FNR(300)
4050  X[I3]=X[I3]+A[I3]*100*COS(FNA(B))*D1
4060  Y[I3]=Y[I3]+A[I3]*100*SIN(FNA(B))*D1
4070  GOTO 220
4080  REM  (SELF-DESTRUCT)
4090  PRINT "SPOCK:  THE "M$" IS OVERLOADING WHAT REMAINS OF ITS ANTI-"
4100  PRINT "   MATTER PODS--OBVIOUSLY A SUICIDAL GESTURE.  DETONATION"
4110  PRINT "   IN FIVE SECONDS."
4120  K[I]=10000-5/D1
4130  GOTO 220
4140  REM  (FIRE TORPEDOES)
4150  T[I,K2+1]=12
4160  T[I,K2+2]=10
4170  T[I,K2+3]=100+FNR(200)
4180  GOTO 220
4190  REM  (JETTISON ENGINEERING)
4200  PRINT "SPOCK:  SENSORS INDICATE DEBRIS BEING LEFT BY THE "M$"."
4210  PRINT "   INSUFFICIENT MASS?"
4220  GOSUB 4660
4230  A[I3]=A[I]
4240  B[I3]=0
4250  B[I]=.9*SGN(A[I])
4260  C[I3]=D[I3]=C[I]
4270  F[I3]=F[I]
4280  F[I]=G[I]=H[I]=0
4290  I[I3]=I[I]+10
4300  K[I3]=10000-15/D1
4310  L[I3]=500
4320  Z[I,3]=Z[I,4]=Z[I,5]=1
4330  GOTO 220
4340  REM  (SCAN)
4350  PRINT "SPOCK:  WE'RE BEING SCANNED BY THE "M$"."
4360  GOTO 220
4370  REM  (RUN)
4380  IF B[I]<0 THEN 220
4390  PRINT "SULU:  THE "M$" IS RETREATING."
4400  B[I]=-.99
4410  J[I]=J
4420  GOTO 220
4430  REM          ----- NAME SELECTION SUBROUTINE -----
4440  RESTORE 4450
4450  DATA "BISMARK","CENTAUR","DRADDOCK","FORBIN","KREIGER","SHLURG"
4460  DATA "TRAKKA","VARNOR","WARRIOR"
4470  IF V>1 THEN 4500
4480  V$=P$
4490  RETURN 
4500  FOR V2=2 TO V
4510  READ V$
4520  NEXT V2
4530  RETURN 
4540  REM          ----- BEARING SUBROUTINE -----
4550  X=X[J]-X[I]
4560  Y=Y[J]-Y[I]
4570  IF X=0 THEN 4600
4580  B=ATN(Y/X)*57.2958
4590  GOTO 4610
4600  B=90
4610  IF X >= 0 AND Y >= 0 THEN 4650
4620  B=B+180
4630  IF X<0 THEN 4650
4640  B=B+180
4650  RETURN 
4660  REM          ----- SLOT I SUBROUTINE -----
4670  FOR I3=1 TO I2
4680  IF I[I3]=0 THEN 4740
4690  NEXT I3
4700  PRINT 
4710  PRINT "GAME WILL TERMINATE BECAUSE OF INABILITY TO COPE WITH"
4720  PRINT "ALL THE JUNK (VESSELS, PROBES, TORPEDOES, ETC) IN SPACE."
4730  STOP 
4740  I[I3]=1000
4750  A[I3]=B[I3]=C[I3]=D[I3]=E[I3]=F[I3]=J[I3]=K[I3]=L[I3]=0
4760  X[I3]=X[I]
4770  Y[I3]=Y[I]
4780  FOR I1=I2 TO 1 STEP -1
4790  IF I[I1]>0 THEN 4810
4800  NEXT I1
4810  I[I3]=0
4820  RETURN 
4830  REM          ----- PHASER TRACKING SUBROUTINE -----
4840  J=M[I,K]
4850  IF J<100 THEN 4870
4860  J=J-100
4870  IF J=0 THEN 4910
4880  IF I[J]=0 THEN 4940
4890  GOSUB 4540
4900  N[I,K]=FNC(B-C[I])
4910  IF N[I,K]<125 OR N[I,K]>235 OR Z[I,5] THEN 4930
4920  M[I,K]=J
4930  RETURN 
4940  V=I[I]
4950  IF V>1 THEN 4980
4960  GOSUB 4430
4970  PRINT "   PHASER  "K"DISENGAGING."
4980  M[I,K]=0
4990  RETURN 
5000  REM          ----- TORPEDO TRACKING SUBROUTINE -----
5010  J=T[I,K]
5020  IF J<100 THEN 5040
5030  J=J-100
5040  IF J=0 THEN 5080
5050  IF I[J]=0 THEN 5110
5060  GOSUB 4540
5070  U[I,K]=FNC(B-C[I])
5080  IF U[I,K]<135 OR U[I,K]>225 OR Z[I,5] THEN 5100
5090  T[I,K]=J
5100  RETURN 
5110  V=I[I]
5120  IF V>1 THEN 5150
5130  GOSUB 4430
5140  PRINT "   TUBE  "K"DISENGAGING."
5150  T[I,K]=0
5160  RETURN 
5170  REM          ----- PHASER HIT FACTOR SUBROUTINE -----
5180  F=0
5190  F1=M[I,K1+2]*Q[I,K]*.01
5200  GOSUB 4540
5210  F2=1000
5220  G2=SQR((X[I]-X[J])^2+(Y[I]-Y[J])^2)
5230  IF G2>F2 THEN 5280
5240  F3=M[I,K1+1]
5250  G3=FNC(C[I]+N[I,K]-B)
5260  IF G3>F3 AND 360-G3>F3 THEN 5280
5270  F=INT(F1*SQR(1-G2/F2)*45/F3)
5280  RETURN 
5290  END 
