1  REM ADAPTED FROM INTEREX 2730_L074 FILE TREK
2  REM MODIFIED FOR PTBASIC BY WTN 1/23 - STRINGS HAVE BEEN
3  REM REPLACED WITH CODE AND PRINTS, ADDED NUMBER PRINT CODE,
4  REM CHANGED NUMBER PRINTS AND OTHER STUFF FOR BETTER FORMATTING,
5  REM CHANGED RESIGNATION OPTION TO AVOID ACCIDENTAL TERMINATION
10  REM **** STAR TREK - SPACE WAR SIMULATION ****
20  REM FOR FURTHER INFORMATION, SEE 'BYTE',MARCH 1977
30  REM 
40  REM 
50  REM 
60  REM 
70  DEF FNA(X)=INT(X*RND(1)+1)
80  DIM G[8,8]
85  DIM M[8,8]
86  GOSUB 3600
90  LET T0=T=(FNA(20)+20)*100
100  LET E=3000
110  LET P=15
120  LET S=0
130  REM LET X$="------------------------"
131  REM STRINGS REPLACED WITH LOGIC AND PRINTS
140  DEF FND(D)=SQR(ABS(K[I,1]-S1)^2+ABS(K[I,2]-S2)^2)
150  LET Q1=Q2=S1=S2=FNA(8)
160  DIM C[9,2]
161  FOR I=1 TO 9
162  LET C[I,1]=C[I,2]=1
163  NEXT I
170  LET C[2,1]=C[3,1]=C[4,1]=C[4,2]=C[5,2]=C[6,2]=-1
180  LET C[1,1]=C[3,2]=C[5,1]=C[7,2]=C[9,1]=0
181  FOR I=1 TO 8
182  FOR J=1 TO 8
183  LET M[I,J]=0
184  NEXT J
185  NEXT I
190  DIM D[6]
191  FOR I=1 TO 6
192  LET D[I]=0
193  NEXT I
200  LET B9=K9=0
210  FOR I=1 TO 8
220  FOR J=1 TO 8
230  LET K3=B3=0
240  IF RND(1)<.8 THEN 270
250  LET K3=FNA(3)
260  LET K9=K9+K3
270  IF RND(1)<.96 THEN 300
280  LET B3=1
290  LET B9=B9+1
300  LET S3=FNA(5)
310  LET G[I,J]=K3*100+B3*10+S3
320  NEXT J
330  NEXT I
331  REM
340  IF K9=0 OR B9=0 THEN 200
350  GOTO 3570
360  IF Q1 >= 1 THEN 380
370  LET S1=Q1=1
380  IF Q1 <= 8 THEN 400
390  LET S1=Q1=8
400  IF Q2 >= 1 THEN 420
410  LET S2=Q2=1
420  IF Q2 <= 8 THEN 440
430  LET S2=Q2=8
440  LET X=G[Q1,Q2]/100
450  LET K3=INT(X)
460  LET B3=INT((X-K3)*10)
470  LET S3=G[Q1,Q2]-((B3*10)+(K3*100))
475  IF K3=0 THEN 520
480  PRINT "COMBAT AREA","CONDITION RED"
500  IF S>(K3*100) THEN 520
510  PRINT "  SHIELDS DANGEROUSLY LOW"
520  DIM K[3,3],Q[8,8]
521  FOR I=1 TO 3
522  FOR J=1 TO 3
523  LET K[I,J]=0
524  NEXT J
525  NEXT I
530  FOR I=1 TO 8
531  FOR J=1 TO 8
532  LET Q[I,J]=0
533  NEXT J
534  NEXT I
540  LET Q[S1,S2]=1
550  FOR I=1 TO K3
560  GOSUB 3500
570  LET Q[R1,R2]=2
580  LET K[I,1]=R1
590  LET K[I,2]=R2
600  LET K[I,3]=200
610  NEXT I
620  IF B3=0 THEN 650
630  GOSUB 3500
640  LET Q[R1,R2]=4
650  FOR I=1 TO S3
660  GOSUB 3500
670  LET Q[R1,R2]=3
680  NEXT I
690  GOSUB 2600
700  PRINT "COMMAND ";
710  INPUT A
720  IF A<1 OR A>5 OR A#INT(A) THEN 780
730  LET R1=A+1
740  IF D[R1] >= 0 THEN 780
750  GOSUB 3420
760  PRINT " NOT OPERATIONAL"
770  GOTO 700
780  IF A=0 THEN 890
781  IF A=1 THEN 1520
782  IF A=2 THEN 1640
783  IF A=3 THEN 1800
784  IF A=4 THEN 2200
785  IF A=5 THEN 3010
786  IF A=6 THEN 3550
790  PRINT 
800  PRINT "0=SET COURSE";TAB(20);"4  3  2"
810  PRINT "1=LONG RANGE SCAN";TAB(21);"\ ^ /"
820  PRINT "2=PHASER CNTL";TAB(22);"\^/"
830  PRINT "3=TORPEDO CNTL";TAB(18);"5 ------- 1"
840  PRINT "4=SHIELDS";TAB(22);"/^\"
850  PRINT "5=LIBRARY COMPUTER";TAB(21);"/ ^ \"
860  PRINT "6=RESIGNATION";TAB(20);"6  7  8"
870  PRINT 
880  GOTO 700
890  PRINT "COURSE(1-9) ";
900  INPUT C1
910  IF C1<1 OR C1 >= 9 THEN 700
920  PRINT "WARP FACTOR (0-8) ";
930  INPUT W1
940  IF W1 <= 0 OR W1>8 THEN 700
950  IF D[1] >= 0 OR W1 <= .5 THEN 980
960  PRINT "ENGINES ARE DAMAGED, MAXIMUM SPEED = WARP .5"
970  GOTO 920
980  IF E-(W1*8)>0 THEN 1030
990  IF S<1 THEN 2470
1000  PRINT "YOU ONLY HAVE ";
1001  LET Z9=E
1002  GOSUB 9500
1003  PRINT " UNITS--SUGGEST YOU CROSS-CIRCUIT"
1010  PRINT "FROM SHIELDS, WHICH HAVE ";
1011  LET Z9=S
1012  GOSUB 9500
1013  PRINT " UNITS"
1020  GOTO 700
1030  FOR I=1 TO 6
1040  IF D[I] >= 0 THEN 1060
1050  LET D[I]=D[I]+1
1060  NEXT I
1070  IF FNA(10)#5 OR W1<2 THEN 1120
1080  LET R1=FNA(6)
1090  LET D[R1]=D[R1]-FNA(5)
1100  PRINT 
1105  PRINT 
1106  PRINT "DAMAGE CONTROL REPORTS '";
1107  GOSUB 3420
1110  PRINT " DAMAGED.'"
1112  PRINT 
1120  LET N=INT(W1*8)
1130  LET Q[S1,S2]=0
1140  LET X=S1
1150  LET Y=S2
1160  LET C2=INT(C1)
1170  LET X1=C[C2,1]+(C[C2+1,1]-C[C2,1])*(C1-C2)
1180  LET X2=C[C2,2]+(C[C2+1,2]-C[C2,2])*(C1-C2)
1190  FOR I=1 TO N
1200  LET S1=S1+X1
1210  LET S2=S2+X2
1220  IF S1<1 OR S1>8 OR S2<1 OR S2>8 THEN 1360
1230  IF Q[INT(S1),INT(S2)]=0 THEN 1270
1240  LET S1=S1-X1
1250  LET S2=S2-X2
1260  GOTO 1280
1270  NEXT I
1280  LET S1=INT(S1)
1290  LET S2=INT(S2)
1300  LET Q[S1,S2]=1
1310  LET E=E-N
1320  IF W1<1 THEN 690
1330  LET T=T+1
1340  IF T>T0+30 THEN 2500
1350  GOTO 690
1360  LET X=Q1*8+X+X1*N
1370  LET Y=Q2*8+Y+X2*N
1380  LET Q1=INT(X/8)
1390  LET Q2=INT(Y/8)
1400  LET S1=INT(X-Q1*8+.5)
1410  LET S2=INT(Y-Q2*8+.5)
1420  IF S1>0 THEN 1450
1430  LET Q1=Q1-1
1440  LET S1=8
1450  IF S2>0 THEN 1480
1460  LET Q2=Q2-1
1470  LET S2=8
1480  LET T=T+1
1490  LET E=E-N+5
1500  IF T>T0+30 THEN 2500
1510  GOTO 360
1520  PRINT "----------------------"
1530  FOR I=Q1-1 TO Q1+1
1540  DIM N[3]
1541  LET N[1]=N[2]=N[3]=0
1550  FOR J=Q2-1 TO Q2+1
1560  IF I<1 OR I>8 OR J<1 OR J>8 THEN 1580
1570  LET N[J-Q2+2]=G[I,J]
1571  LET M[I,J]=G[I,J]
1580  NEXT J
1590  PRINT ":"N[1]":"N[2]":"N[3]":"
1600  PRINT "----------------------"
1610  NEXT I
1620  GOTO 700
1630  REM 
1640  IF K3=0 THEN 2350
1650  PRINT "ENERGY AVAILABLE =";E
1660  PRINT "NUMBER OF UNITS TO FIRE ";
1670  INPUT X
1680  IF X<1 THEN 700
1690  IF E-X<0 THEN 1660
1700  LET E=E-X
1705  LET X3=X/K3
1710  FOR I=1 TO 3
1720  IF K[I,3]=0 THEN 1780
1730  LET H=INT(X3/FND(0))
1740  LET K[I,3]=K[I,3]-H
1750  LET Z9=H
1751  GOSUB 9500
1752  PRINT " UNIT HIT ON KLINGON"
1760  IF K[I,3]>0 THEN 1780
1770  GOSUB 2050
1780  NEXT I
1790  GOTO 2030
1800  IF P>0 THEN 1830
1810  PRINT "ALL PHOTON TORPEDOES EXPENDED"
1820  GOTO 700
1830  PRINT "TORPEDO COURSE (1-9) ";
1840  INPUT C1
1850  IF C1<1 OR C1 >= 9 THEN 700
1860  LET C2=INT(C1)
1870  LET X1=C[C2,1]+(C[C2+1,1]-C[C2,1])*(C1-C2)
1880  LET X2=C[C2,2]+(C[C2+1,2]-C[C2,2])*(C1-C2)
1890  LET X=S1
1900  LET Y=S2
1910  LET P=P-1
1920  PRINT 
1930  LET X=X+X1
1940  LET Y=Y+X2
1950  IF X<1 OR X>8 OR Y<1 OR Y>8 THEN 2180
1960  IF Q[INT(X),INT(Y)]=0 AND Q[INT(X+.5),INT(Y+.5)]=0 THEN 1930
1970  FOR I=1 TO 3
1980  IF INT(X)=K[I,1] AND INT(Y)=K[I,2] THEN 2020
1990  IF INT(X+.5)=K[I,1] AND INT(Y+.5)=K[I,2] THEN 2020
2000  NEXT I
2010  GOTO 2120
2020  GOSUB 2050
2030  GOSUB 2370
2040  GOTO 700
2050  LET K[I,3]=Q[K[I,1],K[I,2]]=0
2060  PRINT "***KLINGON DESTROYED***"
2070  LET K3=K3-1
2080  LET K9=K9-1
2090  IF K9=0 THEN 2550
2100  LET G[Q1,Q2]=G[Q1,Q2]-100
2110  RETURN 
2120  IF Q[INT(X),INT(Y)]=4 OR Q[INT(X+.5),INT(Y+.5)]=4 THEN 2150
2130  PRINT "IT IS ILLOGICAL TO ATTEMPT TO DESTROY A STAR"
2140  GOTO 2180
2150  PRINT "***STARBASE DESTROYED***"
2160  PRINT "YOU ARE HEREBY RELIEVED OF COMMAND AND ASSIGNED"
2161  PRINT "TO CLEANING THE ANTI-MATTER PODS UNTIL FURTHER NOTICE!!!"
2170  GOTO 2530
2180  PRINT "TORPEDO MISSED"
2190  GOTO 2030
2200  PRINT "ENERGY AVAILABLE = ";E+S
2210  PRINT "NUMBER OF UNITS TO SHIELDS ";
2220  INPUT X
2230  IF X<0 THEN 700
2240  IF E+S-X<0 THEN 2210
2250  LET E=E+S-X
2260  LET S=X
2270  GOTO 700
2280  PRINT 
2281  PRINT "DEVICE"TAB(20)"STATE OF REPAIR"
2290  FOR R1=1 TO 6
2300  GOSUB 3420
2310  PRINT TAB(19);
2311  PRINT D[R1]
2320  NEXT R1
2330  PRINT 
2340  GOTO 700
2350  PRINT "SHORT RANGE SENSORS REPORT NO KLINGONS IN THIS QUADRANT"
2360  GOTO 700
2369  REM C2=0 IF DOCKED, REPLACES C$
2370  IF C2=0 THEN 2460
2380  IF K3=0 THEN 2460
2390  FOR I=1 TO 3
2400  IF K[I,3]=0 THEN 2450
2410  LET H=INT(K[I,3]/FND(0)+1)
2420  LET S=S-H
2430  LET Z9=H
2431  GOSUB 9500
2432  PRINT " UNIT HIT ON ENTERPRISE"
2440  IF S<0 THEN 2520
2450  NEXT I
2460  RETURN 
2470  PRINT "**FATAL ERROR**"
2480  PRINT "THE ENTERPRISE IS DEAD IN SPACE AND MUST BE EVACUATED"
2490  GOTO 2530
2500  PRINT 
2501  PRINT "IT IS STARDATE";T
2510  GOTO 2530
2520  PRINT 
2521  PRINT "***THE ENTERPRISE HAS BEEN DESTROYED***"
2530  PRINT 
2531  PRINT "THE FEDERATION WILL BE CONQUERED!!!"
2540  GOTO 3560
2550  PRINT 
2560  PRINT "THE LAST KLINGON BATTLE CRUISER HAS BEEN DESTROYED!!"
2570  PRINT "THE FEDERATION HAS BEEN SAVED!!"
2580  PRINT 
2590  GOTO 3560
2600  FOR I=S1-1 TO S1+1
2610  FOR J=S2-1 TO S2+1
2620  IF I<1 OR I>8 OR J<1 OR J>8 THEN 2640
2630  IF Q[I,J]=4 THEN 2670
2640  NEXT J
2650  NEXT I
2660  GOTO 2730
2670  REM LET C$="DOCKED"
2671  REM USE C9 - 0 DOCKED, 1 GREEN, 2 *RED*, 3 YELLOW
2672  LET C9=0
2680  LET E=3000
2690  LET P=15
2700  LET D[1]=D[2]=D[3]=D[4]=D[5]=D[6]=0
2710  LET S=0
2720  GOTO 2810
2730  PRINT 
2740  IF K3>0 THEN 2780
2750  IF E<300 THEN 2800
2760  LET C9=1
2770  GOTO 2810
2780  LET C9=2
2790  GOTO 2810
2800  LET C9=3
2810  PRINT "------------------------"
2820  LET Z=0
2830  GOSUB 3330
2840  PRINT 
2850  GOSUB 3330
2860  PRINT "STARDATE    ";T
2870  GOSUB 3330
2880  PRINT "CONDITION    ";
2881  IF C9#0 THEN 2883
2882  PRINT "DOCKED"
2883  IF C9#1 THEN 2885
2884  PRINT "GREEN"
2885  IF C9#2 THEN 2887
2886  PRINT "*RED*"
2887  IF C9#3 THEN 2890
2888  PRINT "YELLOW"
2890  GOSUB 3330
2900  PRINT "ENERGY      ";E
2910  GOSUB 3330
2920  PRINT "TORPEDOES   ";P
2930  GOSUB 3330
2940  PRINT "SHIELDS     ";S
2950  GOSUB 3330
2960  PRINT "KLINGONS    ";K9
2970  GOSUB 3330
2980  PRINT 
2990  PRINT "------------------------"
3000  RETURN 
3010  PRINT "COMPUTER ACTIVE AND AWAITING COMMAND ";
3020  INPUT A
3030  IF A=0 THEN 2280
3031  IF A=1 THEN 3100
3032  IF A=2 THEN 3310
3033  IF A=3 THEN 4000
3040  PRINT "FUNCTIONS AVAILABLE FROM COMPUTER"
3050  PRINT "  0=DAMAGE REPORT"
3060  PRINT "  1=PHOTON TORPEDO DATA"
3070  PRINT "  2=SHORT RANGE SCAN"
3071  PRINT "  3=GALACTIC MAP READOUT"
3080  PRINT 
3090  GOTO 3010
3100  PRINT 
3110  FOR I=1 TO 3
3120  IF K[I,3] <= 0 THEN 3200
3130  LET X=K[I,2]-S2
3140  LET Y=S1-K[I,1]
3150  IF X=0 THEN 3240
3160  LET A=INT(((57.3*ATN(Y/X))/45+1)*100)/100
3170  IF X>0 AND Y<0 THEN 3290
3180  IF X<0 THEN 3220
3190  PRINT "DIRECTION =";A
3200  NEXT I
3210  GOTO 700
3220  LET A=A+4
3230  GOTO 3190
3240  IF Y<0 THEN 3270
3250  LET A=3
3260  GOTO 3190
3270  LET A=7
3280  GOTO 3190
3290  LET A=A+8
3300  GOTO 3190
3310  GOSUB 2600
3320  GOTO 700
3330  REM ****OUTPUT QUADRANT**** 
3340  LET Z=Z+1
3350  FOR I=1 TO 8
3360  LET Z2=Q[Z,I]
3361  IF Z2=1 THEN 3370
3362  IF Z2=2 THEN 3372
3363  IF Z2=3 THEN 3374
3364  IF Z2=4 THEN 3376
3365  PRINT "   ";
3366  GOTO 3380
3370  PRINT "<*>";
3371  GOTO 3380
3372  PRINT "+++";
3373  GOTO 3380
3374  PRINT " * ";
3375  GOTO 3380
3376  PRINT ">!<";
3380  NEXT I
3390  IF Z=1 OR Z=8 THEN 3410
3400  PRINT "     ";
3410  RETURN 
3420  REM ***PRINTS DEVICE NAME***
3421  IF R1#1 THEN 3423
3422  PRINT "WARP ENGINES";
3423  IF R1#2 THEN 3425
3424  PRINT "SCANNERS";
3425  IF R1#3 THEN 3427
3426  PRINT "PHASER BANKS";
3427  IF R1#4 THEN 3429
3428  PRINT "TORPEDO TUBES";
3429  IF R1#5 THEN 3431
3430  PRINT "SHIELD CONTROL";
3431  IF R1#6 THEN 3490
3432  PRINT "COMPUTER";
3490  RETURN 
3500  REM ***PLACEMENT IN QUADRANT ARRAY*** 
3510  LET R1=FNA(8)
3520  LET R2=FNA(8)
3530  IF Q[R1,R2]#0 THEN 3510
3540  RETURN 
3550  PRINT "ENTER 999 IF YOU TRULY WISH TO RESIGN ";
3551  INPUT Z9
3552  IF Z9#999 THEN 700
3553  PRINT "YOUR RESIGNATION HAS BEEN *ACCEPTED*"
3560  STOP 
3570  REM **INSTRUCTIONS ADDED HERE** 
3580  GOTO 440
3600  REM INITIALIZE RND
3605  PRINT 
3610  PRINT "ENTER A NUMBER LESS THAN 1000 ";
3620  INPUT X
3625  PRINT 
3630  IF X<1 OR X>999 THEN 3670
3640  FOR I=1 TO INT(X)
3650  LET Y=RND(1)
3660  NEXT I
3670  RETURN 
4000  REM *** PRINT GALACTIC MAP ***
4010  REM     MAP CONTAINS VALUES FOR ALL QUADRANTS 
4020  REM     SCANNED ON LONG RANGE SCAN, 0 FOR REST
4030  PRINT 
4035  PRINT "---------------------------------------------------------"
4040  FOR I=1 TO 8
4050  PRINT ":"M[I,1]":"M[I,2]":"M[I,3]":"M[I,4];
4060  PRINT ":"M[I,5]":"M[I,6]":"M[I,7]":"M[I,8]":"
4065  PRINT "---------------------------------------------------------"
4070  NEXT I
4080  PRINT 
4090  GOTO 700
9495  REM *** INTEGER PRINT SUBROUTINE ***
9496  REM UP TO 6 DIGITS -999999 TO 999999, NO SPACES PRINTED
9497  REM NUMBER TO PRINT IN Z9, Z8 AND Z7 USED FOR TEMPS
9498  REM IF OUT OF RANGE JUST PRINTS
9499  REM IF NOT INTEGER JUST PRINTS
9500  IF ABS(Z9) <= 999999. THEN 9505
9501  IF Z9=INT(Z9) THEN 9505
9502  PRINT Z9;
9503  RETURN 
9505  IF Z9 >= 0 THEN 9520
9510  PRINT "-";
9520  LET Z8=ABS(Z9)
9530  LET Z8=INT(Z8)
9540  IF Z8<10 THEN 9660
9550  IF Z8<100 THEN 9630
9560  IF Z8<1000 THEN 9600
9561  IF Z8<10000 THEN 9570
9562  IF Z8<100000. THEN 9566
9563  LET Z7=INT(Z8/100000.)
9564  LET Z8=Z8-Z7*100000.
9565  GOSUB 9700
9566  LET Z7=INT(Z8/10000)
9567  LET Z8=Z8-Z7*10000
9568  GOSUB 9700
9570  LET Z7=INT(Z8/1000)
9580  LET Z8=Z8-Z7*1000
9590  GOSUB 9700
9600  LET Z7=INT(Z8/100)
9610  LET Z8=Z8-Z7*100
9620  GOSUB 9700
9630  LET Z7=INT(Z8/10)
9640  LET Z8=Z8-Z7*10
9650  GOSUB 9700
9660  LET Z7=Z8
9670  GOSUB 9700
9680  RETURN 
9695  REM DIGIT PRINT SUBROUTINE, DIGIT IN Z7
9700  IF Z7=1 THEN 9810
9710  IF Z7=2 THEN 9830
9720  IF Z7=3 THEN 9850
9730  IF Z7=4 THEN 9870
9740  IF Z7=5 THEN 9890
9750  IF Z7=6 THEN 9910
9760  IF Z7=7 THEN 9930
9770  IF Z7=8 THEN 9950
9780  IF Z7=9 THEN 9970
9790  PRINT "0";
9800  RETURN 
9810  PRINT "1";
9820  RETURN 
9830  PRINT "2";
9840  RETURN 
9850  PRINT "3";
9860  RETURN 
9870  PRINT "4";
9880  RETURN 
9890  PRINT "5";
9900  RETURN 
9910  PRINT "6";
9920  RETURN 
9930  PRINT "7";
9940  RETURN 
9950  PRINT "8";
9960  RETURN 
9970  PRINT "9";
9980  RETURN 
9999  END 

