1 REM ... STTR9.ECB 5 PRINT "&K" 10 PRINT ,"******************************" 20 PRINT ,"** STAR TREK **" 30 PRINT ,"** (STTR9) **" 40 PRINT ,"** SPACE WAR SIMULATION **" 50 PRINT ,"** **" 60 PRINT ,"** PROGRAM BY DAVID PRICE **" 65 PRINT ,"** UNIVACED BY MIKE MCAMIS **" 67 PRINT ,"** FROM BYTE MARCH 1977 **" 69 PRINT ,"******************************" 70 DEF FNA(X)=INT(1+X*RND(0)) 80 DIM C(9,2),G(8,8),D(6),N(3),K(8,8),Q(8,8),D$(12),Z$(5) 81 LET Z$=" EK*B" 90 LET T=(20+FNA(20))*100: LET T0=T 100 LET E=6000 110 LET P=10 120 LET S=5000 130 REM... 140 DEF FND(D)=SQR((K(1,1)-S1)*(K(1,1)-S1)+(K(I,2)-S2)*(K(I,2)-S2)) 150 LET Q1=FNA(8): LET Q2=FNA(8) 160 LET S1=FNA(8): LET S2=FNA(8) 170 DATA 0,-1,-1,-1,0,1,1,1,0,1,1,0,-1,-1,-1,0,1,1 180 FOR I=1 TO 9: READ C(I,1): NEXT I 190 FOR I=1 TO 9: READ C(I,2): NEXT I 200 LET B9=0: LET K9=0 210 FOR I=1 TO 8 220 FOR J=1 TO 8 230 LET K3=0: LET B3=0 240 IF RND(0)<.8 THEN 270 250 LET K3=FNA(3) 260 LET K9=K9+K3 270 IF RND(0)<.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 340 IF K9=0 OR B9=0 THEN 200 ELSE 3570 360 IF Q1>=1 THEN 380 370 LET S1=1: LET Q1=1 380 IF Q1<=8 THEN 440 390 LET S1=1: LET Q1=8 400 IF Q2>=1 THEN 420 410 LET S2=1: LET Q2=1 420 IF Q2<=8 THEN 440 430 LET S2=8: LET 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)) 480 IF K3=0 THEN 520 490 PRINT "COMBAT AREA, CONDITION RED" 500 IF S>(K3*100) THEN 520 510 PRINT "SHIELDS DANGEROUSLY LOW" 520 FOR I=1 TO 8 525 FOR J=1 TO 8: LET K(I,J)=0: LET Q(I,J)=0: NEXT J 530 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 LET T=T+.1 701 IF C$<>"DOCKED" THEN 707 702 LET E=6000 703 LET P=10 704 FOR I=1 TO 6: LET D(I)=0: NEXT I 705 LET S=1000 707 GOSUB 2380 709 PRINT "COMMAND (0-6) ---=>"; 710 INPUT (1,0)A 711 LET A=INT(A) 715 IF A<0 OR A>6 THEN 790 727 IF A=6 THEN 3550 728 IF A=0 THEN 890 730 LET R1=A+1 740 IF D(R1)>=0 THEN 780 750 GOSUB 3420 760 PRINT D$;" NOT OPERATIONAL" 770 GOTO 700 780 ON A GOTO 1520,1640,1800,2200,3010 790 PRINT 800 PRINT "0 = SET COURSE ";TAB(20);" 4 3 2" 810 PRINT "1 = LONG RANGE SCAN ";TAB(21);" \ ^ /" 820 PRINT "2 = PHASER CTRL ";TAB(22);" \^/" 830 PRINT "3 = TORPEDO CTRL ";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-8) ---=>"; 900 INPUT C1 910 IF C1<1 OR C1>8 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 THEN 980 955 IF W1<=.5 THEN 980 960 PRINT "ENGINES 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 ";E;" UNITS---SUGGEST YOU CROSS-CIRCUIT" 1010 PRINT "FROM SHIELDS WHICH HAVE ";S;" UNITS" 1020 GOTO 700 1030 FOR I=1 TO 6 1040 IF D(I)<0 THEN LET D(I)=D(I)+1 1060 NEXT I 1070 IF FNA(10)<8.5 THEN 1120 1075 IF W1<1.2 THEN 1120 1080 LET R1=FNA(6) 1090 LET D(R1)=D(R1)-FNA(5) 1100 GOSUB 3420 1110 PRINT 1113 PRINT "DAMAGE CTRL REPORTS ";D$;" DAMAGED" 1115 PRINT 1120 LET N=INT(W1*8) 1130 LET Q(S1,S2)=0 1140 LET X=S1: 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: LET S2=S2+X2 1220 IF S1<1 OR S1>8 THEN EXIT 1360 1225 IF S2<1 OR S2>8 THEN EXIT 1360 1230 IF Q(INT(S1),INT(S2))=0 THEN 1270 1240 LET S1=S1-X1: LET S2=S2-X2 1260 GOTO 1280 1270 NEXT I 1280 LET S1=INT(S1): 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+50 THEN 2500 1350 GOTO 690 1360 LET X=Q1*8+X+X1*N: LET Y=Q2*8+Y+X2*N 1380 LET Q1=INT(X/8): LET Q2=INT(Y/8) 1400 LET S1=INT(X-Q1*8+.5): 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+50 THEN 2500 1510 GOTO 360 1520 PRINT " (KLINGONS, BASES, STARS)" 1525 PRINT " -------------------------------" 1530 FOR I=Q1-1 TO Q1+1 1540 LET N(1)=0: LET N(2)=0: LET N(3)=0 1550 FOR J=Q2-1 TO Q2+1 1560 IF I<1 OR I>8 THEN 1580 1565 IF J<1 OR J>8 THEN 1580 1570 LET N(J-Q2+2)=G(I,J) 1580 NEXT J 1590 FOR L=1 TO 3 1591 LET X=N(L)/100 1592 LET K4=INT(X) 1593 LET B4=INT((X-K4)*10) 1594 LET S4=N(L)-((B4*10)+(K4*100)) 1595 PRINT " : ";K4;B4;S4; 1596 NEXT L 1597 PRINT " :" 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 1710 FOR I=1 TO 3 1720 IF K(I,3)=0 THEN 1780 1730 LET H=INT(X/K3/(FND(0))) 1740 LET K(I,3)=K(I,3)-H 1750 PRINT H;" UNIT HIT ON KLINGON" 1760 IF K(I,3)>0 THEN 1780 1770 GOSUB 2050 1780 NEXT I 1790 GOTO 700 1800 IF P>0 THEN 1830 1810 PRINT "ALL PHOTON TORPEDOES EXPENDED" 1820 GOTO 700 1830 PRINT "TORPEDO COURSE (1-8.99): ---=>"; 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: LET Y=S2 1910 LET P=P-1 1920 PRINT "TORPEDO TRACK "; 1930 LET X=X+X1: LET Y=Y+X2 1950 IF X<1 OR X>8 THEN 2180 1955 IF Y<1 OR Y>8 THEN 2180 1957 PRINT " (";X;Y;" )"; 1960 IF Q(INT(X),INT(Y))<>0 THEN 1965 1962 IF Q(INT(X+.5),INT(Y+.5))=0 THEN 1930 1963 LET X=INT(X+.5): LET Y=INT(Y+.5) 1965 PRINT 1970 FOR I=1 TO 3 1980 IF INT(X)<>K(I,1) THEN 2000 1982 IF INT(Y)<>K(I,2) THEN 2000 1984 EXIT 2020 2000 NEXT I 2010 GOTO 2120 2020 GOSUB 2050 2040 GOTO 700 2050 LET K(I,3)=0: LET 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))<>3 THEN 2150 2121 IF FNA(10)>5 THEN 2132 2125 PRINT "TORPEDO ABSORBED" 2128 GOTO 700 2132 PRINT "STAR SUPERNOVAED" 2134 LET Q(X,Y)=0 2136 LET G(Q1,Q2)=G(Q1,Q2)-1 2138 GOTO 700 2150 PRINT "***STARBASE DESTROYED***" 2160 PRINT "YOU ARE HEREBY RELIEVED OF DUTY!! CONGRATULATIONS!" 2170 GOTO 2530 2180 PRINT 2181 PRINT "TORPEDO MISSED" 2190 GOTO 700 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 2282 PRINT "DEVICE ... STATE OF REPAIR" 2290 FOR R1=1 TO 6 2300 GOSUB 3420 2310 PRINT D$;TAB(15);D(R1) 2320 NEXT R1 2330 PRINT 2340 GOTO 700 2350 PRINT "SHORT RANGE SENSORS REPORT NO KLINGONS IN THIS QUADRANT" 2360 GOTO 700 2380 IF K3=0 THEN 2460 2381 IF C$<>"DOCKED" THEN 2390 2382 PRINT "STARBASE SHIELDS PROTECT ENTERPRISE" 2383 GOTO 2460 2390 FOR I=1 TO 3 2400 IF K(I,3)=0 THEN 2450 2410 LET H=INT(K(I,3)/1+FND(0)) 2420 LET S=S-H 2430 PRINT H;" UNIT HIT ON ENTERPRISE" 2440 IF S<0 THEN EXIT 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 2502 PRINT "IT IS STARDATE ";T 2510 GOTO 2530 2520 PRINT 2522 PRINT "***THE ENTERPRISE HAS BEEN DESTROYED***" 2530 PRINT 2532 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, YOU WONDERFUL STAR CAPTAIN YOU!" 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 THEN 2640 2625 IF J<1 OR J>8 THEN 2640 2630 IF Q(I,J)=4 THEN EXIT 2670 2640 NEXT J 2650 NEXT I 2660 GOTO 2730 2670 LET C$="DOCKED" 2720 GOTO 2810 2730 PRINT 2740 IF K3>0 THEN 2780 2750 IF E<300 THEN 2800 2760 LET C$="GREEN" 2770 GOTO 2810 2780 LET C$="*RED*" 2790 GOTO 2810 2800 LET C$="YELLOW" 2810 PRINT "------------------------" 2820 LET Z=0 2850 GOSUB 3330 2860 PRINT " STARDATE ";" ";T 2870 GOSUB 3330 2880 PRINT "CONDITION ";" ";C$ 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 "QUADRANT ";Q1;" , ";Q2 2983 GOSUB 3330 2985 PRINT " SECTOR ";S1;" , ";S2 2990 PRINT "------------------------" 3000 RETURN 3010 PRINT "COMPUTER ACTIVE AND AWAITING COMMAND (0-2) ---=>"; 3020 INPUT (1,0)A 3025 IF A<0 OR A>2 THEN 3040 ELSE PRINT 3030 ON (A+1) GOTO 2280,3100,3310 3040 PRINT "FUNCTIONS AVAILABLE FROM COMPUTER" 3045 PRINT 3050 PRINT "0 = DAMAGE REPORT" 3060 PRINT "1 = PHOTON TORPEDO DATA" 3070 PRINT "2 = SHORT RANGE SCAN" 3080 PRINT 3090 GOTO 3010 3100 PRINT 3110 FOR I=1 TO 3 3120 IF K(I,3)<=0 THEN 3305 3130 LET X=K(I,2)-S2 3140 LET Y=S1-K(I,1) 3150 IF X=0 THEN 3240 3170 REM ... 3180 IF X<0 THEN 3220 3185 IF X*Y<0 THEN 3290 3190 PRINT "DIRECTION= ";A 3195 GOTO 3305 3210 EXIT 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 3305 NEXT I 3310 GOSUB 2600 3320 GOTO 700 3330 REM ...** OUTPUT QUADRANT ** 3340 LET Z=Z+1 3350 FOR I=1 TO 8 3370 PRINT " ";Z$(Q(Z,I)+1,Q(Z,I)+1);" "; 3380 NEXT I 3390 IF Z=1 OR Z=8 THEN 3410 3400 PRINT " "; 3410 RETURN 3420 REM ...** PRINTS DEVICE NAME ** 3430 RESTORE 3440 3440 DATA "WARP ENGINES","SCANNERS","PHASER BANKS","TORPEDO TUBES" 3450 DATA "SHIELD CTRL","COMPUTER" 3460 FOR X=1 TO R1 3470 READ D$ 3480 NEXT X 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 3555 PRINT "YOUR RESIGNATION HAS BEEN ACCEPTED" 3560 GOTO 9999 3570 PRINT "DO YOU NEED INSTRUCTIONS (Y OR N) ---=>"; 3580 INPUT (1,0)A$: IF LEN(A$)=0 THEN LET A$="N" 3590 PRINT : LET A$=A$(1,1) 3600 IF A$<>"Y" THEN 3980 3610 PRINT "E = ENTERPRISE" 3620 PRINT "* = STAR" 3630 PRINT "K = KLINGON" 3640 PRINT "B = STARBASE" 3650 PRINT 3660 PRINT "COMMAND 0 = WARP ENGINES" 3670 PRINT "COURSE IS IN A CIRCULAR VECTOR AS SHOWN.";TAB(50);"4 3 2" 3680 PRINT "REAL VALUES MAY BE USED. FOR EXAMPLE";TAB(51);"\ ^ /" 3690 PRINT "1.5 WOULD BE HALFWAY BETWEEN 1 AND 2.";TAB(52);"\^/" 3700 PRINT TAB(48);"5 ------- 1" 3710 PRINT " A WARP FACTOR IS THE SIZE OF ONE QUADRANT.";TAB(52);"/^\" 3720 PRINT TAB(51);"/ ^ \" 3730 PRINT TAB(50);"6 7 8" 3740 PRINT : PAUSE 100 3745 PRINT "COMMAND 1=LONG RANGE SCAN" 3750 PRINT "CODED IN THE FORM XXX WHERE THE UNITS ARE THE NUMBER" 3760 PRINT "OF STARS, TENS THE NUMBER OF STARBASES, AND HUNDREDS" 3770 PRINT "THE NUMBER OF KLINGONS." 3780 PRINT 3785 PRINT "COMMAND 2 = PHASERS" 3790 PRINT "YOU MAY DESTROY THE KLINGON BY USING ENOUGH PHASER" 3800 PRINT "POWER AS TO DEPLETE HIS SHIELDS. KEEP IN MIND THAT WHEN" 3810 PRINT "YOU FIRE AT HIM, HE WILL BE FIRING BACK" 3820 PRINT 3825 PRINT "COMMAND 3 = PHOTON TORPEDOES" 3830 PRINT "COURSE IS THE SAME AS WITH WARP ENGINES. THE LIBRARY" 3840 PRINT "COMPUTER CAN COMPUTE TRAJECTORY FOR YOU (OPTION 1)" 3850 PRINT 3855 PRINT "COMMAND 4 = SHIELDS" 3860 PRINT "DEFINES THE AMOUNT OF ENERGY TO BE ASSIGNED TO THE SHIELDS" 3870 PRINT 3875 PRINT "COMMAND 5 = LIBRARY COMPUTER" 3880 PRINT " OPTION 0 = DAMAGE REPORT" 3890 PRINT " A STATE OF REPAIR LESS THAN ZERO INDICATES THAT" 3900 PRINT " THE DEVICE IS TEMPORARILY DISABLED." 3910 PRINT " OPTION 1 = PHOTON TORPEDO DATA." 3920 PRINT " GIVES DIRECTION TO ALL KLINGONS IN YOUR QUADRANT." 3930 PRINT " OPTION 2 = SHORT RANGE SCAN." 3940 PRINT " ALSO GIVEN AUTOMATICALLY AFTER SUCCESSFUL COMPLETION" 3950 PRINT " OF WARP ENGINE MANEUVERS." 3960 PRINT 3965 PRINT "COMMAND 6 = RESIGNATION" 3966 PRINT 3967 PRINT "WHEN YOU DOCK AT STARBASE, YOUR SUPPLIES OF ENERGY AND" 3968 PRINT "AND PHOTON TORPEDOES ARE REPLENISHED" 3970 PRINT 3980 PRINT 3981 PRINT "IT IS STARDATE";T0;". YOU HAVE UNTIL STARDATE";T0+50;" TO "; 3982 PRINT "DESTROY";K9;" KLINGNON BATTLE CRUISERS AND SAVE THE FEDERATION." 3983 PRINT "GOOD LUCK" 3984 PRINT 3985 GOTO 440 9999 END