10  DIM G[8,8],M[8,8],Q[8,8],K[9,3]
20  DIM A$[50],C$[72],D$[10],L$[4],I$[15]
30  READ D$,L$,A$,O2,O3,O4,O5,O8,E1,K1
40  REM WRITTEN BY JOE ALTMAIER SOMETIME IN THE LATE 70S
42  REM TSB E VERSION 8/06
55  DATA ".123456789",".BE"," .  + 'O'/^\>!<***",2,3,4,5,8,10,12
60  DEF FNO(Q)=Q<O1 OR Q>O8
65  DEF FNR(X)=INT(RND(O1)*X)+O1
70  F1=F2=F3=O1=1
80  I1=I2=O0=0
90  A1=1
110  REM GALAXY STARTUP
120  FOR I=O1 TO O8
130  FOR J=O1 TO O8
140  G[I,J]=RND(O1)^O2
150  IF I>O2 OR J>O2 THEN 180
160  G[I,J]=G[I,J]+O3
170  GOTO 200
180  IF RND(O1)>.125 THEN 200
190  G[I,J]=G[I,J]+10
200  NEXT J
210  NEXT I
220  G[O1,O1]=G[O1,O1]+20
230  MAT M=G
240  REM SHIP STARTUP
250  READ X,Y,X1,Y1,E,P,S,H
260  DATA 5,5,3,3,1000,10,0,55
265  PRINT "DIFFICULTY FACTOR(1-10)";
270  INPUT M
275  M=M/10
280  GOTO 1660
290  REM PRINT NEW SCREEN
300  IF F1=O0 THEN 700
310  FOR I=O1 TO O8
320  FOR J=O1 TO O8
330  PRINT A$[(Q[J,I]+O1)*O3-O2,(Q[J,I]+O1)*O3];
480  NEXT J
485  PRINT " ";
490  REM PRINT VITAL INFO
500  IF I<O3 THEN 620
510  GOTO I-O2 OF 520,540,560,580,600,630
520  PRINT "HULL TEMP "INT(H)
530  GOTO 630
540  PRINT "ENERGY    "E
550  GOTO 630
560  PRINT "PHOTONS   "P
570  GOTO 630
580  PRINT "SHIELDS   "S
590  GOTO 630
600  PRINT "QUADRANT  "X;Y
610  GOTO 630
620  PRINT
630  NEXT I
635  PRINT
640  F1=O0
690  REM VICTORY/DEATH
700  IF E1=O0 AND K1=O0 THEN 9800
710  IF S<O0 THEN 9950
720  IF H>400 THEN 9900
730  H=H-H/(LOG(10)/LOG(H))/10
990  REM COMMAND INPUT
1000  INPUT C$
1005  REM C$=UPS$(C$)
1010  REM I=POS("MPTELSGAR",C$[O1,O1])
1030  REM GOTO I OF 1100,2100,2500,3000,3500,4000,4500,5000,5500
1032  C$=C$[O1,O1]
1033  IF C$="M" THEN 1100
1034  IF C$="P" THEN 2100
1035  IF C$="T" THEN 2500
1036  IF C$="E" THEN 3000
1037  IF C$="L" THEN 3500
1038  IF C$="S" THEN 4000
1039  IF C$="G" THEN 4500
1040  IF C$="A" THEN 5000
1041  IF C$="R" THEN 5500
1050  PRINT "MOVE        PHASER      TORPEDO"
1060  PRINT "ENERGY AL.  LONG SCAN   SHORT SCAN"
1070  PRINT "REPORT      AUTO SCAN   GALACTIC RECORD"
1080  GOTO 6000
1090  REM MOVING
1100  PRINT "COURSE(1-9),WARP(0-3)";
1110  INPUT C,W
1115  IF W>O3 OR W<O0 THEN 1100
1120  F1=A1
1130  GOSUB 9000
1140  IF S1=O0 THEN 1500
1144  REM CHECK IF GOT THAT FAR
1145  IF (W*O8*I1)^O2+(W*O8*I2)^O2<(S1-X1)^O2+(S2-Y1)^O2 THEN 1500
1150  PRINT "COLLISION WITH ";
1160  GOTO Q[S1,S2] OF 1180,6000,1210,1240,1340
1170  PRINT "**ERROR**"
1180  PRINT "STAR."
1190  H=H+1000/(S+O1)*100
1200  GOTO 1350
1210  PRINT "KLINGON!"
1220  GOTO 1350
1240  PRINT "BASE. ";
1250  IF F3=O0 THEN 1280
1260  PRINT "BACK AGAIN?  SORRY, WE'RE CLOSED."
1270  GOTO 1350
1280  PRINT "DOCKING."
1290  E=E+2000
1300  P=P+O5
1310  H=55
1320  F3=O1
1330  GOTO 1350
1340  PRINT "ENEMY BASE!"
1350  S1=S1-I1
1360  S2=S2-I2
1370  IF Q[S1,S2]=O0 THEN 1430
1380  IF Q[S1,S2]#O2 THEN 1350
1390  F1=O0
1400  GOTO 6000
1430  Q[X1,Y1]=O0
1435  X1=INT(S1+.5)
1440  Y1=INT(S2+.5)
1445  Q[X1,Y1]=O2
1450  GOTO 6000
1490  REM CLEAR PATH
1500  S1=INT(X1+W*O8*I1+.5)
1510  S2=INT(Y1+W*O8*I2+.5)
1520  IF FNO(S1)=O0 AND FNO(S2)=O0 THEN 1370
1590  REM CHANGE QUADRANT
1600  F3=O0
1605  IF FNO(S1)=O0 THEN 1630
1610  X=X+INT((S1-O1)/O8)
1620  IF FNO(S2)=O0 THEN 1640
1630  Y=Y+INT((S2-O1)/O8)
1640  X1=S1+O8-INT((S1+7)/O8)*O8
1650  Y1=S2+O8-INT((S2+7)/O8)*O8
1655  REM CREATE NEW QUADRANT
1660  MAT Q=ZER
1665  K2=O0
1670  X1=INT(X1+.5)
1680  Y1=INT(Y1+.5)
1690  Q[X1,Y1]=O2
1700  IF FNO(X)=O1 OR FNO(Y)=O1 THEN 6000
1710  C1=G[X,Y]
1712  M[X,Y]=C1
1715  REM ENEMY BASE
1720  IF C1<20 THEN 1850
1730  Q[O4,O4]=Q[O4,O5]=Q[O5,O4]=Q[O5,O5]=O5
1740  IF Q[X1,Y1]#O5 THEN 1790
1750  X1=X1-I1
1760  Y1=Y1-I2
1770  GOTO 1740
1790  X1=INT(X1+.5)
1800  Y1=INT(Y1+.5)
1810  Q[X1,Y1]=O2
1820  GOTO 1900
1840  REM BASE
1850  IF C1<10 THEN 1900
1860  R1=FNR(O8)
1870  R2=FNR(O8)
1880  IF Q[R1,R2]#O0 THEN 1860
1890  Q[R1,R2]=O4
1895  REM STARS
1900  C2=(C1-INT(C1))*10
1910  FOR I=O1 TO C2
1920  R1=FNR(O8)
1930  R2=FNR(O8)
1940  IF Q[R1,R2]#O0 THEN 1920
1950  Q[R1,R2]=O1
1960  NEXT I
1965  REM KLINGONS
1970  C3=C1-C2/10-INT(C1/10)*10
1980  FOR I=O1 TO C3
1990  R1=FNR(O8)
2000  R2=FNR(O8)
2010  IF Q[R1,R2]#O0 THEN 1990
2020  Q[R1,R2]=O3
2030  K[I,O1]=R1
2040  K[I,O2]=R2
2050  K[I,O3]=1000
2060  NEXT I
2070  K2=C3
2080  GOTO 6000
2090  REM PHASERING
2100  PRINT "AVAILABLE ENERGY"E"HOW MANY UNITS TO FIRE";
2110  INPUT U
2120  IF U>E OR U<O0 THEN 2100
2130  E=E-U
2140  PRINT INT(E+.5)"LEFT. ";
2150  Q=K2
2160  FOR I=O1 TO K2
2170  IF I>K2 THEN 2260
2180  H1=U/SQR((X1-K[I,O1])^O2+(Y1-K[I,O2])^O2)
2190  K[I,O3]=K[I,O3]-H1
2200  IF K[I,O3]>O0 THEN 2250
2210  Q[K[I,O1],K[I,O2]]=O0
2220  GOSUB 9200
2230  PRINT "KILLED"Q-K2"KLINGONS!";
2240  GOTO 2170
2250  NEXT I
2260  IF Q=K2 THEN 2290
2270  PRINT
2280  GOTO 6000
2290  PRINT "NONE KILLED"
2300  GOTO 6000
2490  REM TORPEDOING
2500  IF P#O0 THEN 2530
2510  PRINT "OUT OF TORPEDOES."
2520  GOTO 6000
2530  P=P-O1
2540  PRINT "DIRECTION(1-9)";
2550  INPUT C
2560  GOSUB 9000
2570  IF S1=O0 THEN 2950
2580  F1=A1
2590  C1=Q[S1,S2]
2610  PRINT "HIT A";
2620  GOTO C1 OF 2630,2630,2650,2810,2850
2630  PRINT " STAR."
2640  F1=O0
2645  GOTO 6000
2650  PRINT " KLINGON!"
2653  Q[S1,S2]=O0
2655  S1=INT(S1+.5)
2657  S2=INT(S2+.5)
2660  FOR I=O1 TO K2
2670  IF K[I,1]#S1 OR K[I,O2]#S2 THEN 2780
2680  GOSUB 9200
2760  GOTO 6000
2780  NEXT I
2790  PRINT "PROGRAM CONFUSED."
2800  GOTO 6000
2810  PRINT " STARBASE! YOU FOOL!"
2815  Q[S1,S2]=O0
2820  G[X,Y]=G[X,Y]-10
2830  M[X,Y]=G[X,Y]
2840  GOTO 6000
2850  PRINT " AN ENEMY BASE!"
2860  E1=E1-O1
2870  IF E1<O1 THEN 2880
2874  F1=O0
2876  GOTO 6000
2880  PRINT " IT IS DESTROYED!"
2890  G[X,Y]=G[X,Y]-20
2900  M[X,Y]=G[X,Y]
2910  Q[O4,O4]=Q[O4,O5]=Q[O5,O4]=Q[O5,O5]=O0
2920  GOTO 6000
2950  PRINT "MISSED!"
2960  GOTO 6000
2990  REM ENERGY ALLOCATION
3000  E=E+S
3010  PRINT "AVAILABLE ENERGY"E"HOW MANY UNITS TO SHIELDS";
3020  INPUT S
3025  IF S<O0 THEN 3010
3030  IF E-S<O0 THEN 3010
3040  E=E-S
3050  PRINT E"UNITS LEFT."
3060  GOTO 6000
3490  REM LONG RANGE SCAN
3500  FOR I=Y-O1 TO Y+O1
3510  IF FNO(I)=O0 THEN 3540
3520  PRINT " .  .  ."
3530  GOTO 3640
3540  FOR J=X-O1 TO X+O1
3550  C2=O4
3555  C3=O1
3560  IF FNO(J)=O1 THEN 3610
3570  C1=G[J,I]
3580  M[J,I]=C1
3590  C2=INT(C1/10)+O1
3600  C3=INT(C1-(C2-O1)*10)+O1
3610  PRINT L$[C2,C2];D$[C3,C3];" ";
3620  NEXT J
3630  PRINT
3640  NEXT I
3650  GOTO 6000
3990  REM SHORT RANGE SCAN
4000  F1=O1
4010  GOTO 6000
4490  REM GALACTIC MAP
4500  FOR I=O1 TO O8
4510  FOR J=O1 TO O8
4520  C1=M[J,I]
4530  C2=INT(C1/10)+O1
4540  C3=INT(C1-(C2-O1)*10)+O1
4550  PRINT L$[C2,C2];D$[C3,C3];" ";
4560  NEXT J
4570  PRINT
4580  NEXT I
4590  GOTO 6000
4990  REM AUTO SCAN TOGGLE
5000  A1=O1-A1
5010  F1=A1
5020  GOTO 6000
5490  REM REPORT OF SHIP STATUS
5500  PRINT "SHIELDS  "S"QUADRANT "X;Y
5510  PRINT "HULL TEMP"INT(H)"ENERGY"E" PHOTONS"P
5515  PRINT "KLINGONS "K1"ENEMY BASE"E1"LEVEL"INT(M*10)
5520  GOTO 6000
5990  REM KLINGON FIRING
6000  IF K2=O0 THEN 6100
6005  FOR I=O1 TO K2
6010  H1=INT((K[I,O3]/10)+.5)
6020  K[I,O3]=K[I,O3]-H1
6025  IF S<1 THEN 6040
6030  H=H+(H1/(S+10))*100
6040  S=S-H1
6050  PRINT "INCOMING!"H1
6070  NEXT I
6080  PRINT
6090  REM KLINGON FILTERING
6100  FOR I=O1 TO O8
6110  FOR J=O1 TO O8
6120  C1=G[I,J]
6130  IF C1 >= 20 OR C1<10 THEN 6220
6140  FOR J2=I-O1 TO I+O1
6150  IF FNO(J2) THEN 6200
6160  FOR J3=J-O1 TO J+O1
6170  IF FNO(J3) THEN 6190
6180  M[J2,J3]=G[J2,J3]
6190  NEXT J3
6200  NEXT J2
6210  GOTO 6520
6220  IF I=X AND J=Y THEN 6520
6225  C2=C1-INT(C1/10)*10
6230  S1=S2=O0
6240  IF C2<O1 THEN 6520
6250  FOR J2=I-O1 TO I+O1
6260  IF FNO(J2) THEN 6470
6270  FOR J3=J-O1 TO J+O1
6280  IF FNO(J3) THEN 6460
6285  IF J2=X AND J3=Y THEN 6460
6290  C3=G[J2,J3]
6300  IF C3<10 OR C3 >= 20 THEN 6430
6310  G[I,J]=C1-O1
6320  M[I,J]=G[I,J]
6330  C3=C3+O1
6340  G[J2,J3]=C3
6350  PRINT "KLINGON ATTACKING"J2;J3;
6360  IF C3-INT(C3/10)*10 >= O3 THEN 6390
6365  PRINT
6370  M[J2,J3]=G[J2,J3]
6380  GOTO 6520
6390  PRINT "AHRGH!"
6400  G[J2,J3]=C3-10
6410  M[J2,J3]=G[J2,J3]
6420  GOTO 6520
6430  IF C3-INT(C3/10)*10 >= O3 THEN 6460
6440  S1=J2
6450  S2=J3
6460  NEXT J3
6470  NEXT J2
6480  IF S1=O0 THEN 6520
6484  IF I#O1 OR J#O1 THEN 6490
6486  IF C2>6 THEN 6500
6488  GOTO 6520
6490  IF RND(O1)>M/O3 THEN 6520
6500  G[I,J]=C1-O1
6510  G[S1,S2]=G[S1,S2]+O1
6520  NEXT J
6530  NEXT I
6540  REM KLINGON GENERATION
6550  IF E1=O0 THEN 300
6560  IF X=O1 AND Y=O1 THEN 300
6570  IF INT(G[O1,O1]-20)=9 THEN 300
6580  IF RND(O1)>M THEN 300
6590  G[O1,O1]=G[O1,O1]+O1
6600  K1=K1+O1
6610  GOTO 300
8990  REM COLLISION SUBROUTINE
9000  I1=COS((C-O1)*.785398)
9010  I2=-SIN((C-O1)*.785398)
9020  S1=X1
9030  S2=Y1
9040  S1=S1+I1
9050  S2=S2+I2
9060  IF FNO(INT(S1+.5))=O1 OR FNO(INT(S2+.5))=O1 THEN 9100
9070  IF Q[S1,S2]=O0 THEN 9040
9080  IF Q[S1,S2]=O2 THEN 9040
9090  RETURN
9100  S1=O0
9110  RETURN
9190  REM DELETE KLINGON
9200  FOR J2=I TO K2-O1
9210  FOR J3=O1 TO O3
9220  K[J2,J3]=K[J2+O1,J3]
9230  NEXT J3
9240  NEXT J2
9250  G[X,Y]=G[X,Y]-O1
9260  M[X,Y]=G[X,Y]
9270  K2=K2-O1
9280  K1=K1-O1
9290  F1=A1
9300  RETURN
9790  REM VICTORY
9800  PRINT
9810  PRINT "YOU HAVE PURGED THE GALAXY OF KLINGONS!"
9820  PRINT "YOU WILL BE AWARDED THE MEDAL OF VALOR";
9830  IF H <= 500 AND S >= O0 THEN 9999
9840  PRINT ", POSTHUMOUSELY."
9850  STOP
9890  REM DEATH
9900  PRINT "YOU MELTED! WHAT A HORRIBLE END!"
9920  STOP
9950  PRINT "SHIELDS HAVE BUCKLED! YOUR SHIP IS GONE!"
9999  END
