100 REM *** STAR TREK III *** (BC,RC) 11/74 110 REM A(I,J) KLINGON ATTACK AND ORDERS TABLE 120 REM I = KLINGON NUMBER 130 REM IF A(I,0) = 0 THEN A CONTAINS ATTACK INFO: 140 REM J MEAING 150 REM - ------ 160 REM 1 EFFECTIVE DISTANCE TO ENTERPRISE 170 REM 2 HITTING POWER ON E, IF IN RANGE 180 REM 3 IDENTITY OF CLOSEST BASE 190 REM 4 HITTING POWER AGAINST A(I,3) 200 REM 210 REM WHEN A(I,0) " 0, IT IS AN ORDER (SEE ORDER PROCESSING) 220 REM TABLE G IS OUR GALAXY 230 REM FOR EACH POSITION IN THE GALAXY: 240 REM 250 REM =0 EMPTY 260 REM =1 STAR 270 REM =2 ENTERPRISE 280 REM =3 STAR BASE # 1 290 REM =4 STAR BASE # 2 300 REM =5 STAR BASE # 3 310 REM >5, < 16 ARE KLINGONS (1-K1,MAX=10) 320 REM > 15 = "+" PHOTON WEAPONS 330 REM 340 REM G IS X1 BY Y1 350 REM 360 REM C$ CONVERTS (G) TO ASSCOIATED STRING CHAR 370 REM 380 REM 390 REM KLINGON INFO K(I,J) 400 REM 410 REM J MEANING 420 REM - ------- 430 REM 0 ENERGY AVAILABLE 440 REM 1 X 450 REM 2 Y 460 REM 3 MAXIMUM ENERGY AVAILABLE 470 REM 480 REM K1 = INITIAL NUMBER OF KLINGONS 490 REM K2 = NUMBER OF LIVE KLINGONS 500 REM K3 = NUMBER OF STAR BASES FOUND 510 REM 520 REM 530 REM ENTERPRISE INFO 540 REM 550 REM E1 = X CO-ORD 560 REM E2 = Y CO-ORD 570 REM E3 = VX 580 REM E4 = VY 590 REM E5 POWER BEING DELIVERED TO SHIELDS 600 REM E6 POWER DELIVERED TO WARP ENGINES 610 REM E7 CURRENT WARP FACTOR 620 REM E8 =1 IF DOCKED ELSE 0 630 REM E9 NUMBER OF PHOTON TORPEDOES ON BOARD 640 REM 650 REM EFFICIENCY ARRAY -E- 660 REM 670 REM I EFFICIENCY 680 REM - ---------- 690 REM 1 SHIELDS 700 REM 2 WARP ENGINES 710 REM 3 PHASORS 720 REM 4 DILITHIUM CRYSTALS 730 REM 740 REM 750 REM STAR BASE INFO B(I,J) 760 REM 770 REM J USAGE 780 REM - ----- 790 REM 1 X 800 REM 2 Y 810 REM 3 ENERGY AVAILABLE 820 REM 4 MAXIMUM ENERGY AVAILABLE 830 REM 840 REM B1 = NUMBER OF STAR BASES 850 REM B2 = NUMBER OF LIVE STAR BASES 860 REM G1 = GAME NUMBER 870 REM 880 REM 890 REM O(I,J) IS THE KLINGON ORDERS TABLE. WHEN THERE 900 REM ARE *I* KLINGONS IN ATTACK RANGE AND *J* 910 REM KLINGONS IN THE LURK ZONE, THIS ARRAY CONTAINS 920 REM THE ORDERS TO ISSUE TO BOTH. 930 REM THE BOTTOM TWO DIGITS ARE THE INSTRUCTIONS FOR THOSE 940 REM IN RANGE, THE NEXT TWO (THE HUNDREDS AND 950 REM THOUSANDS PLACES ARE FOR THOSE IN LURKING RANGE 960 REM 970 REM 980 REM 990 REM ARRAY H IS A RECORD OF THE HITS UPON ENTERPRISE AND BASES 1000 REM 1010 REM H(I,J): I IS ENTERPRISE + BASES 1020 REM J 1: AMOUNT HIT 1030 REM 2: NUMBER ATTACKING 1040 REM 1050 REM 1060 REM TUNING VARIABLES 1070 REM Z1 SHIELDING FACTOR 1080 REM Z2 TOTAL ENTERPRISE ENERGY 1090 REM Z3 WARP MEMORY COEFF. 1100 REM Z4 WARP OVERHEAT LEVEL COEFF. 1110 REM Z5 WARP OVERHEAT RATE COEFF. 1120 REM Z6 SHIELD RECOVERY FACTOR 1130 REM Z7 CRYSTAL RECOVERY FACTOR 1140 REM Z8 PHASOR RECOVERY FACTOR 1150 REM 1160 REM 1170 REM FNR(N) = RANDOM INTEGER BETWEEN 1 AND N 1180 REM FNM(X) = MIN(X,1) FOR EFFICIENCY CALCULATIONS 1190 REM FNP(X) X=PROBABILITY. RETURNS 1 IF HAPPENED ELSE 0 1200 REM FNU(X) = UNIT(X) 1210 REM FNX(X) COMPUTES WRAP-AROUND X CO-ORDINATE 1220 REM FNY(X) COMPUTES WRAP-AROUND Y CO-ORDINATE 1230 REM 1240 REM *** DEFINITIONS, DIMENSIONS, DATA *** 1250 BASE 0 1260 DEF FNM(X) = X*FNU(1-X) + 1*FNU(X-1) 1270 DEF FNP(P) = FNU(P - RND(0)) 1280 DEF FNR(N) = INT(N*RND(0)) + 1 1290 DEF FNU(X) = SGN(SGN(X) + ABS(SGN(X))) 1300 DEF FNX(X) = X - (X1+1)*INT(X/(X1+1)) 1310 DEF FNY(Y) = Y - (Y1+1)*INT(Y/(Y1+1)) 1320 DIM A(10,5) 1330 DIM B(3,4) 1340 DIM C$(22) 1350 DIM E(4), E$(4) 1360 DIM F(2,1) 1370 DIM G(25,25) 1380 LET X1 = 25 1390 LET Y1 = 25 1400 DIM H(3,2) 1410 DIM K(10,3) 1420 DIM L(20) 1430 DIM O(4,4,1) 1440 DIM P(4, 4) 1450 DIM T(5,4) 1460 DIM X$(2) 1470 DIM Y$(2) 1480 FOR I=0 TO 22 1490 READ C$(I) 1500 NEXT I 1510 DATA ".", "*", "E", "A", "B", "C", "1", "2", "3", "4", "5" 1520 DATA "6", "7", "8", "9", "0", "+", "+", "+", "+", "+", "+" 1530 DATA "+" 1540 READ E$(1), E$(2), E$(3), E$(4) 1550 DATA "SHIELDS", "WARP ENGINES", "PHASORS" 1560 DATA "DILITHIUM CRYSTALS" 1570 FOR I = 1 TO 10 1580 READ L(I) 1590 NEXT I 1600 DATA 735, 9971, 2284 1610 DATA 7, 5140, 6700 1620 DATA 15, 1761, 3805, 4788 1630 READ Z1, Z2, Z3, Z4, Z5, Z6, Z7, Z8 1640 DATA 5, 1200, .8, 8.5, 10, .6, .05, .3 1650 FOR I = 0 TO 4 1660 READ P(I,0), P(I,1), P(I,2), P(I,3), P(I,4) 1670 NEXT I 1680 DATA 00, 01, 02, 03, 04 1690 DATA 10, 11, 0322, 04, 04 1700 DATA 20, 3022, 22, 33, 33 1710 DATA 30, 4022, 33, 33, 44 1720 DATA 40, 40, 33, 44, 44 1730 FOR K = 0 TO 1 1740 FOR I = 0 TO 4 1750 FOR J = 0 TO 4 1760 READ O(I,J,K) 1770 NEXT J 1780 NEXT I 1790 NEXT K 1800 DATA 0000, 0500, 0300, 0300, 0300 1810 DATA 0004, 0504, 0301, 0301, 0301 1820 DATA 0001, 0501, 0301, 0301, 0301 1830 DATA 0001, 0301, 0301, 0501, 0501 1840 DATA 0001, 0501, 0501, 0501, 0501 1850 REM (DOCKED) 1860 DATA 0000, 0500, 0500, 0500, 0500 1870 DATA 0004, 0504, 0504, 0504, 0504 1880 DATA 0004, 0504, 0504, 0504, 0301 1890 DATA 0004, 0504, 0504, 0301, 0301 1900 DATA 0004, 0301, 0301, 0301, 0301 1910 READ X$(0), X$(1), X$(2) 1920 DATA "L", "", "R" 1930 READ Y$(0), Y$(1), Y$(2) 1940 DATA "U", "", "D" 1950 PRINT "WELCOME TO BCSTAR ... THE ULTIMATE SPACE WAR GAME" 1955 PRINT 1960 PRINT "IS THIS YOUR FIRST MISSION"; 1980 INPUT X$ 1990 IF SUBSTR(X$,1,1)="Y" THEN GOSUB 15000 2000 REM 2010 PRINT "GAME #"; 2020 INPUT G1 2030 ON SGN(G1)+2 GO TO 2100,2040,2070 2040 LET G1 = -INT(RND(CLK(0))*10000) 2050 PRINT "GAME";G1 2060 GO TO 2100 2070 IF G1 > 10 THEN 2100 2080 LET X = RND(L(G1)) 2090 GO TO 2110 2100 LET X = RND(-G1) 2110 LET D1 = 1 2120 LET E9 = 6 2130 REM 2140 REM THE GALAXY; LET THERE BE LIGHT 2150 IF ABS(G1) > 10 THEN 2180 2160 LET T1 = L(G1) 2170 GO TO 2190 2180 LET T1 = ABS(G1) 2190 LET N = INT(FNR(X1*Y1/18) + T1/80) 2200 FOR I = 1 TO N 2210 LET G(FNR(X1)-1,FNR(Y1)-1) = 1 2220 NEXT I 2230 REM 2240 REM ENTERPRISE STUFF 2250 LET B3 = 1 2260 GOSUB 13740 2270 LET E1 = X 2280 LET E2 = Y 2290 LET G(E1,E2) = 2 2300 LET E(1) = E(2) = E(3) = E(4) = 1 2310 REM 2320 REM SET UP 1-3 STAR BASES (A,B,C) 2330 LET B1 = B2 = FNR(3) 2340 IF B1 > 1 THEN 2360 2350 LET B1 = B2 = FNR(2) 2360 FOR I = 1 TO B1 2370 GOSUB 13740 2380 LET B(I,1) = X 2390 LET B(I,2) = Y 2400 LET B(I,3) = B(I,4) = 13500 + (FNR(30) - 15)*100 2410 PRINT C$(I+2)" =";B(I,4);" "; 2420 LET G(X,Y) = 2 + I 2430 NEXT I 2440 REM 2450 REM GENERATE THE KLINGONS 2460 LET K1 = K2 = 5 + FNR(3) + (B1 - 2) 2470 LET F(0,0) = F(1,0) = F(2,0) = -1 2480 LET F0 = 1E9 2490 FOR I=1 TO K1 2500 GOSUB 13830 2510 NEXT I 2520 LET K(1,0) = K(1,3) = 1600 2530 PRINT "*** GALAXY INVADED BY";K1;"KLINGONS." 2540 REM 2550 REM 2560 REM ENTERPRISE'S TURN 2570 LET T = T + 1 2580 LET R1 = T1 = N1 = N2 = 0 2590 REM 2600 REM CREATE A REINFORCEMENT KLINGON? 2610 IF FNP( (1/40) + ((B1-B2)/25) ) = 0 THEN 2710 2620 FOR I = 2 TO K1 2630 IF K(I,0) <= 0 THEN 2670 2640 NEXT I 2650 IF K1 = 10 THEN 2710 2660 LET I = K1 = K1 + 1 2670 GOSUB 13830 2680 LET K2 = K2 + 1 2690 REM 2700 REM DOCKED? 2710 LET E8 = 0 2720 IF E7 > 0 THEN 2960 2730 FOR I = E1-1 TO E1+1 2740 LET X = FNX(I) 2750 FOR J = E2-1 TO E2+1 2760 LET Y = FNY(J) 2770 IF G(X,Y) < 3 THEN 2790 2780 IF G(X,Y) < 6 THEN 2840 2790 NEXT J 2800 NEXT I 2810 GO TO 2960 2820 REM 2830 REM *** DOCKED; REPAIRS. *** 2840 LET E8 = 1 2850 LET D1 = G(X,Y) - 2 2860 IF H(0,1) <> 0 THEN 3010 2870 IF H(D1,1) <> 0 THEN 2900 2880 LET E9 = E9 + 1 2890 LET B3 = 1 2900 LET E9 = E9 + 1 2910 IF E9 <= 6 THEN 2980 2920 REM LET E9=6 2930 GO TO 2980 2940 REM 2950 REM *** REPAIR ENTERPRISE IF NOT ATTACKED *** 2960 LET B3 = 1 2970 IF H(0,1) <> 0 THEN 3010 2980 LET E(1) = FNM(E(1) +(RND(0)*Z6)*(E8*2 + 1)) 2990 LET E(3) = FNM(E(3) +(RND(0)*Z8)*(E8*2 + 1)) 3000 LET E(4) = FNM(E(4) + (RND(0)*Z7)*(E8*8 + 1)) 3010 LET T1=E1 3020 LET T2=E2 3030 GOSUB 11760 3040 IF E8 <> 1 THEN 3060 3050 PRINT TAB(6);"DOCKED" 3060 REM 3070 REM COMPUTE NEW WARP EFFICIENCIES 3080 LET W1 = Z3*W1 + (1-Z3)*E7^2 3090 LET W2 = W1 - Z4 3100 LET E(2) = FNM( (100 - Z5*W2)/100) 3110 IF E(2) >= 0 THEN 3150 3120 LET E(2) = 1E-6 3130 REM 3140 REM *** O1: ORDER LIMIT *** 3150 IF T = 1 THEN 3180 3160 LET O1 = 1 3170 GO TO 3220 3180 LET O1 = -3 3190 IF O1 = 3 THEN 5510 3200 LET O1 = O1 + 1 3210 REM CURRENT ENERGY USAGE 3220 LET E = Z2*E(4) 3230 LET E6 = E7*100/E(2) 3240 IF E5 + E6 <= E THEN 3300 3250 LET E7 = E6 = 0 3260 PRINT "*** ENGINES DOWN." 3270 REM 3280 REM *** INFORMATION LINE *** 3290 REM 3300 GOSUB 13520 3310 PRINT USING 3320, T,E7,Y$(E4+1),X$(E3+1); 3320 :##: W#""#""# 3330 PRINT INT(E6);"D";T1;E5;"P";E9; 3340 PRINT " *** ";4-O1;" COMMAND"; 3350 INPUT L$ 3360 LET Z$ = SUBSTR(L$,1,1) 3370 LET L$ = SUBSTR(L$,2) 3380 LET L = LEN(L$) 3390 IF L > 0 THEN 3460 3400 IF Z$ = "X" THEN 5510 3410 IF Z$ = "G" THEN 5330 3420 IF Z$ = "E" THEN 5400 3430 IF Z$ = "O" THEN 4020 3440 IF Z$ = "I" THEN 3310 3450 IF Z$ = "P" THEN 4080 3460 IF Z$ = "D" THEN 4970 3470 IF Z$ = "S" THEN 5110 3480 IF Z$ = "F" THEN 4460 3490 IF Z$ = "W" THEN 4230 3500 IF Z$ = "T" THEN 3610 3510 IF Z$ = "M" THEN 3850 3515 IF Z$ = "H" THEN 14000 3520 REM 3530 REM UNKNOWN ENTRY 3540 PRINT "*** INCORRECT COMMAND: "; 3550 GO TO 3340 3560 REM 3570 REM ************* 3580 REM * TORPEDOES * 3590 REM ************* 3600 REM 3610 IF E9 = 0 THEN 3540 3620 LET E9 = E9 - 1 3630 GOSUB 12460 3640 IF T1 < 1 THEN 3950 3650 IF T1 > 2 THEN 3950 3660 FOR I=0 TO 5 3670 IF T(I,0) = 0 THEN 3690 3680 NEXT I 3690 LET T(I,3) = SGN(X) 3700 LET T(I,4) = SGN(Y) 3710 IF T1 = 2 THEN 3760 3720 LET T(I,0) = 6 3730 LET T(I,1) = E1 3740 LET T(I,2) = E2 3750 GO TO 5510 3760 LET T(I,0) = 4 3770 LET T(I,1) = FNX(E1 + T(I,3)) 3780 LET T(I,2) = FNY(E2 + T(I,4)) 3790 GO TO 5510 3800 REM 3810 REM ******** 3820 REM * MINE * 3830 REM ******** 3840 REM 3850 IF E9 = 0 THEN 3540 3860 LET E9 = E9 - 1 3870 GOSUB 12460 3880 IF T1 < 1 THEN 3950 3890 IF T1 > 2 THEN 3950 3900 LET X = FNX(E1 + SGN(X)*T1) 3910 LET Y = FNY(E2 + SGN(Y)*T1) 3920 IF G(X,Y) <> 0 THEN 3540 3930 LET G(X,Y) = 22 3940 GO TO 5510 3950 LET E9 = E9 + 1 3960 GO TO 3540 3970 REM 3980 REM ******* 3990 REM * OFF * 4000 REM ******* 4010 REM 4020 LET E5 = E6 = E7 = 0 4030 GO TO 3190 4040 REM 4050 REM ************ 4060 REM * POSITION * 4070 REM ************ 4080 PRINT "GALAXY IS";X1;"BY";Y1;" E IS AT";E1;",";E2 4090 FOR I = 1 TO B1 4100 PRINT C$(I+2); 4110 IF B(I,3) <= 0 THEN 4140 4120 PRINT " IS AT";B(I,1);",";B(I,2);" "; 4130 GO TO 4150 4140 PRINT "IS DEAD. "; 4150 NEXT I 4160 PRINT 4170 GO TO 3190 4180 REM 4190 REM *************** 4200 REM * WARP CHANGE * 4210 REM *************** 4220 REM 4230 IF L <> 0 THEN 4250 4240 GO TO 3540 4250 GOSUB 12460 4260 IF T1 < 0 THEN 3540 4270 REM 4280 REM CHECK WARP VALUE 4290 LET E6 = (T1*100)/E(2) 4300 IF E6 <= E - E5 THEN 4330 4310 PRINT "*** MAXIMUM WARP IS"; INT( (E-E5)*E(2)/100 ) 4320 GO TO 3220 4330 LET E7 = T1 4340 LET E3 = SGN(X) 4350 LET E4 = SGN(Y) 4360 IF E7 = 0 THEN 3190 4370 IF ABS(X) + ABS(Y) > 0 THEN 3190 4380 PRINT "*** NO ENERGY TO WARP DRIVE."; 4390 LET E7 = 0 4400 GO TO 3220 4410 REM 4420 REM **************** 4430 REM * FIRE PHASORS * 4440 REM **************** 4450 REM 4460 IF L <> 0 THEN 4480 4470 GO TO 3540 4480 IF L$ = "+" THEN 4740 4490 GOSUB 12460 4500 IF T1 < 0 THEN 3540 4510 IF T1 <> 0 THEN 4530 4520 LET T1 = 10 4530 IF T1 > K1 THEN 3540 4540 LET T3 = T1 4550 LET X = E1 4560 LET Y = E2 4570 LET T1 = K(T3, 1) 4580 LET T2 = K(T3, 2) 4590 GOSUB 12920 4600 LET X = T1 4610 LET Y = T2 4620 GOSUB 13050 4630 IF T1 > 4 THEN 3540 4640 REM 4650 REM THERE'S A KLINGON THERE, ALRIGHT 4660 REM GIVE HIM ALL WE'VE GO LEFT 4670 REM T3 IS THE KLINGON NUMBER 4680 REM 4690 LET T4 = INT(((E-E5-E6)*E(3)) / SQR(X*X + Y*Y)) 4700 PRINT T4;"UNITS DELIVERED,"; 4710 GO TO 4900 4720 REM 4730 REM TARGET "+" 4740 FOR I = E1-4 TO E1+4 4750 LET X = FNX(I) 4760 FOR J = E2-4 TO E2+4 4770 LET Y = FNY(J) 4780 IF G(X,Y) > 15 THEN 4800 4790 GO TO 4820 4800 LET T(G(X,Y)-16,0) = 0 4810 LET G(X,Y) = 0 4820 NEXT J 4830 NEXT I 4840 PRINT "*** ALL PHOTON WEAPONS IN RANGE INERT." 4850 GO TO 5510 4860 REM 4870 REM NOW, LET-S SEE HOW THE KLINGON FARED. DEDUCT THE 4880 REM ENERGY OF THE HIT FROM THE KLINGON-S ENERGY 4890 REM 4900 GOSUB 13290 4910 GO TO 5510 4920 REM 4930 REM ****************** 4940 REM * ADJUST SHIELDS * 4950 REM ****************** 4960 REM 4970 IF L <> 0 THEN 4990 4980 INPUT L$ 4990 GOSUB 12460 5000 IF T1 < 0 THEN 3540 5010 LET E5 = T1 5020 LET T1 = E - E6 5030 IF T1 >= E5 THEN 3190 5040 LET E5 = INT(T1) 5050 GO TO 3190 5060 REM 5070 REM *************** 5080 REM * SENSOR SCAN * 5090 REM *************** 5100 REM 5110 IF L$ = "E" THEN 5170 5120 LET T9 = 0 5130 IF L$ = "A" THEN 5220 5140 IF L$ = "B" THEN 5210 5150 IF L$ = "C" THEN 5200 5160 GO TO 3540 5170 LET T1=E1 5180 LET T2=E2 5190 GO TO 5260 5200 LET T9 = 1 5210 LET T9=T9+1 5220 LET T9=T9+1 5230 IF B(T9,3) <= 0 THEN 3540 5240 LET T1 = B(T9,1) 5250 LET T2 = B(T9,2) 5260 GOSUB 11900 5270 GO TO 3190 5280 REM 5290 REM ******************** 5300 REM * STAR BASE REPORT * 5310 REM ******************** 5320 REM 5330 GOSUB 12040 5340 GO TO 3190 5350 REM 5360 REM ***************** 5370 REM * DAMAGE REPORT * 5380 REM ***************** 5390 REM 5400 REM 5410 FOR I = 1 TO 4 5420 PRINT USING 5430, E(I), E$(I) 5430 :#.### ####################### 5440 NEXT I 5450 PRINT "TOTAL ENERGY AVAILABLE IS"; INT(Z2*E(4)) 5460 GO TO 3190 5470 REM 5480 REM END OF COMMANDS. PERFORM POST- 5490 REM COMMAND PROCESSING 5500 REM 5510 REM *** KLINGON REPAIRS *** 5520 FOR I = 1 TO K1 5530 IF K(I,0) <= 0 THEN 5600 5540 IF K(I,3) < 0 THEN 5590 5550 LET K(I,0) = K(I,0) + K(I,0)/9 5560 IF K(I,0) <= K(I,3) THEN 5600 5570 LET K(I,0) = K(I,3) 5580 GO TO 5600 5590 LET K(I,3) = ABS(K(I,3)) 5600 NEXT I 5610 REM 5620 REM MOVE ENTERPRISE 5630 LET G(E1,E2) = 0 5640 IF E7 = 0 THEN 5700 5650 LET E1 = FNX(E1 + E3*E7) 5660 LET E2 = FNY(E2 + E4*E7) 5670 LET E8 = 0 5680 REM 5690 REM MOVE AND CHECK TORPS 5700 FOR I = 0 TO 5 5710 IF T(I,0) = 0 THEN 5980 5720 IF G(T(I,1),T(I,2)) <> I+16 THEN 5740 5730 LET G(T(I,1),T(I,2)) = 0 5740 LET T(I,1) = FNX(T(I,1) + T(I,3)) 5750 LET T(I,2) = FNY(T(I,2) + T(I,4)) 5760 LET T(I,0) = T(I,0) - 1 5770 LET T9 = G(T(I,1),T(I,2)) 5780 REM 5790 REM TORP HIT ANYTHING? 5800 IF T9 = 0 THEN 5950 5810 IF T9 = 1 THEN 5860 5820 IF T9 > 15 THEN 5950 5830 IF T9 > 5 THEN 5880 5840 IF T9 > 2 THEN 5930 5850 GO TO 5980 5860 LET T(I,0) = 0 5870 GO TO 5980 5880 LET T(I,0) = 0 5890 LET T3 = T9 - 5 5900 PRINT "*** K #";C$(T3+5);" HIT BY TORP-"; 5910 GOSUB 13630 5920 GO TO 5980 5930 LET T(I,0) = 0 5940 GO TO 5980 5950 IF T(I,0) = 0 THEN 5980 5960 IF G(T(I,1),T(I,2)) = 22 THEN 5980 5970 LET G(T(I,1),T(I,2)) = I + 16 5980 NEXT I 5990 REM 6000 REM SEE IF HE RAN INTO ANYTHING 6010 REM 6020 LET T1 = G(E1,E2) 6030 LET G(E1,E2) = 2 6040 IF T1 = 0 THEN 6360 6050 IF T1 > 15 THEN 6100 6060 IF T1 > 5 THEN 6220 6070 ON T1 GO TO 6080,6270,6240,6240,6240 6080 PRINT "*** ENTERPRISE HAS RAMMED A STAR." 6090 GO TO 6250 6100 PRINT "*** ENTERPRISE HAS HIT A"; 6110 IF T1 = 22 THEN 6150 6120 PRINT " TORP-"; 6130 LET T(T1-16,0) = 0 6140 GO TO 6160 6150 PRINT " MINE-"; 6160 IF FNP(.13) = 1 THEN 6200 6170 LET R1 = 5 6180 LET H(O,1) = 750 6190 GO TO 11410 6200 PRINT " NO DAMAGE." 6210 GO TO 6360 6220 PRINT "*** ENTERPRISE HAS RAMMED A KLINGON:" 6230 GO TO 6250 6240 PRINT "*** ENTERPRISE HAS RAMMED A STAR BASE:" 6250 PRINT "ENDING GAME";G1;"ON TURN";T 6260 STOP 6270 PRINT "ERROR # 1" 6280 GO TO 6250 6290 REM KLINGON'S TURN 6300 REM 6310 REM 6320 REM 6330 REM AGE THE ENTERPRISE INFO AND COMPUTE CURRENT EXTRAPOLATED 6340 REM POSITION. 6350 REM 6360 LET F0 = F0 + 1 6370 LET F1 = FNX(F1 + F3) 6380 LET F2 = FNY(F2 + F4) 6390 IF F0 < 3 THEN 6440 6400 LET F8 = 0 6410 REM 6420 REM GATHER INFO AND STUFF ABOUT THE FEDERATION. 6430 REM 6440 LET J5 = 0 6450 FOR I = 1 TO K1 6460 LET A(I,0) = -1 6470 IF K(I,0) <= 0 THEN 7070 6480 LET A(I,0)=A(I,1)= A(I,2)=A(I,3)=A(I,4)=A(I,5)=0 6490 REM 6500 REM LOOK AROUND THE KLINGON AND SEE WHAT-S THERE 6510 REM 6520 FOR J = K(I,2)-4 TO K(I,2)+4 6530 LET Y = FNY(J) 6540 FOR K = K(I,1)-4 TO K(I,1)+4 6550 LET X = FNX(K) 6560 LET T1 = G(X,Y) 6570 IF T1 <= 1 THEN 6970 6580 IF T1 > 5 THEN 6970 6590 REM 6600 REM AH, A FEDERATION SOMETHING. IF THE ENTERPRISE, 6610 REM RECORD HIS POSITION AND VELOCITY 6620 REM 6630 IF T1 <> 2 THEN 6810 6640 LET F0 = 0 6650 LET F1 = T1 = E1 6660 LET F2 = T2 = E2 6670 LET F3 = E3 6680 LET F4 = E4 6690 LET F8 = E8 6700 LET X = K(I,1) 6710 LET Y = K(I,2) 6720 GOSUB 12920 6730 LET A(I,2) = K(I,0)/SQR(T1*T1 + T2*T2) 6740 GOSUB 13050 6750 LET A(I,1) = T1 6760 LET J5 = J5 + A(I,2) 6770 GO TO 6970 6780 REM 6790 REM A STAR BASE, RECORD ITS POSITION 6800 REM 6810 IF F(T1-3,0) >= 0 THEN 6850 6820 LET F(T1-3,0) = X 6830 LET F(T1-3,1) = Y 6840 LET K3 = K3 + 1 6850 LET T3 = T1 - 2 6860 LET T1 = B(T3,1) 6870 LET T2 = B(T3,2) 6880 LET X = K(I,1) 6890 LET Y = K(I,2) 6900 GOSUB 12920 6910 LET T4 = K(I,0)/SQR(T1*T1+T2*T2) 6920 GOSUB 13050 6930 LET A(I,5) = T1 6940 IF A(I,4) > T4 THEN 6970 6950 LET A(I,4) = T4 6960 LET A(I,3) = T3 6970 NEXT K 6980 NEXT J 6990 IF A(I,2) <> 0 THEN 7070 7000 LET X = K(I,1) 7010 LET Y = K(I,2) 7020 LET T1 = F1 7030 LET T2 = F2 7040 GOSUB 12920 7050 GOSUB 13050 7060 LET A(I,1) = T1 7070 NEXT I 7080 REM 7090 REM ***** ORDERS TIME ***** 7100 REM 7110 IF F0 > 0 THEN 7410 7120 REM 7130 REM IF WE CAN OVERPOWER HIM, DO SO 7140 REM 7150 GOSUB 13520 7160 LET T9 = T1 7170 LET T9 = T9 + (FNR(12)-6)*(T9/50) 7180 IF J5 <= T9 THEN 7410 7190 REM 7200 REM HE IS OURS...ATTACK 7210 REM 7220 FOR I = 1 TO K1 7230 IF A(I,0) <> 0 THEN 7320 7240 LET A(I,0) = 1 7250 IF A(I,1) <= 4 THEN 7320 7260 IF A(I,4) > 0 THEN 7310 7270 LET A(I,0) = 3 7280 LET A(I,1) = F1 7290 LET A(I,2) = F2 7300 GO TO 7320 7310 LET A(I,0) = 2 7320 NEXT I 7330 GO TO 9300 7340 REM 7350 REM OK. NEXT MOVE: FLEE THE WEAK ONES. T9 IS THE 7360 REM FLEE/ATTACK THRESHOLD. T8 IS THE 'TOO-OLD' VALUE 7370 REM IF OUR KNOWLEDGE IS TOO OLD, JUST LET THEM SIT. 7380 REM ALSO, IF THE KLINGON IS HEALTHY, COUNT HIM AS NEAR 7390 REM OR ATTACKING RANGE IF HE IS. 7400 REM 7410 LET T9 = 350 + FNR(250)/(F0+1) 7420 LET T8 = 2 + FNR(2) + F8*2 7430 FOR I = 1 TO K1 7440 IF A(I,0) <> 0 THEN 7560 7450 IF K(I,0) > T9 THEN 7560 7460 IF A(I,1) <= 4 THEN 7530 7470 IF A(I,4) <= 0 THEN 7500 7480 LET A(I,0) = 2 7490 GO TO 7560 7500 IF F0 < T8 THEN 7530 7510 LET A(I,0) = 6 7520 GO TO 7560 7530 LET A(I,0) = 4 7540 LET A(I,1) = F1 7550 LET A(I,2) = F2 7560 NEXT I 7570 REM 7580 REM 7590 IF F0 > FNR(2) THEN 8670 7600 FOR I = 1 TO K1 7610 IF A(I,0) <> 0 THEN 7730 7620 IF A(I,1) > 4-F8 THEN 7670 7630 LET N1 = N1 + 1 7640 GO TO 7730 7650 LET N2 = N2 + 1 7660 GO TO 7730 7670 IF A(I,1) > 8 THEN 7730 7680 IF A(I,4) > 0 THEN 7700 7690 GO TO 7650 7700 IF F8 = 0 THEN 7650 7710 LET A(I,0) = 2 7720 GO TO 7650 7730 NEXT I 7740 IF F0 >= T8 THEN 8670 7750 REM 7760 REM 7770 REM "E DOCKED, MORE THAN 1 BASE2 STRATEGY 7780 REM 7790 IF F8 <> 1 THEN 8090 7800 IF K3 <= 1 THEN 8100 7810 LET T9 = 0 7820 LET T8 = 1 + FNR(2) 7830 FOR I = 1 TO K1 7840 IF A(I,1) <> 0 THEN 7930 7850 IF A(I,1) > 4 THEN 7930 7860 LET A(I,0) = 4 7870 LET A(I,3) = 4 7880 LET A(I,5) = A(I,1) 7890 LET A(I,4) = A(I,2) 7900 LET A(I,1) = F1 7910 LET A(I,2) = F2 7920 LET T9 = T9 + 1 7930 NEXT I 7940 FOR I = 2 TO K1 7950 IF T9 >= T8 THEN 8710 7960 IF A(I,0) <> 0 THEN 8020 7970 IF A(I,1) > 8 THEN 8020 7980 LET A(I,0) = 5 7990 LET A(I,1) = F1 8000 LET A(I,2) = F2 8010 LET T9 = T9 + 1 8020 NEXT I 8030 GO TO 8710 8040 REM 8050 REM USE *O* TABLE TO SHCOMPUTE STRATEGY 8060 REM 8070 REM N1 = K-S IN RANGE OF E 8080 REM N2 = LURKING K-S 8090 REM 8100 IF N1 <= 4 THEN 8130 8110 LET N2 = N2 + (N1 - 4) 8120 LET N1 = 4 8130 IF N2 <= 4 THEN 8170 8140 LET N2 = 4 8150 REM 8160 REM 8170 LET T9 = INT(O(N1, N2, F8)/100) 8180 LET T8 = O(N1,N2,F8) - 100*T9 8190 FOR I = 1 TO K1 8200 IF A(I,0) <> 0 THEN 8330 8210 IF A(I,1) > 4 THEN 8250 8220 LET A(I,0) = T8 8230 IF T8 = 1 THEN 8330 8240 GO TO 8270 8250 IF A(I,1) > 8 THEN 8330 8260 LET A(I,0) = T9 8270 IF A(I,2) < A(I,4) THEN 8310 8280 LET A(I,3) = 4 8290 LET A(I,4) = A(I,2) 8300 LET A(I,5) = A(I,1) 8310 LET A(I,1) = F1 8320 LET A(I,2) = F2 8330 NEXT I 8340 REM 8350 REM IF WE HAVE MORE THAN ABOUT 4-5 (T9) ASSIGNED, 8360 REM LET THE REST TO OTHER THINGS 8370 REM 8380 LET T9 = 4 + FNR(2) - K3 8390 LET T8 = N1 + N2 8400 IF T8 >= T9 THEN 8670 8410 REM 8420 REM ASSIGN A CLOSEST KLINGON TO LURK 8430 REM 8440 LET T7 = 100 8450 LET T6 = 0 8460 FOR I = 1 TO K1 8470 IF A(I,0) <> 0 THEN 8510 8480 IF A(I,1) >= T7 THEN 8510 8490 LET T7 = A(I,1) 8500 LET T6 = I 8510 NEXT I 8520 IF T6 = 0 THEN 9300 8530 LET A(T6,0) = 5 8540 LET A(T6,1) = F1 8550 LET A(T6,2) = F2 8560 LET T8 = T8 + 1 8570 GO TO 8400 8580 REM 8590 REM 8600 REM IF WE KNOW OF A BASE, SEND THE REST TO THE FIRST 8610 REM BASE THAT WE KNOW THE ENTERPRISE IS NOT NEAR 8620 REM SO, GET A LIST OF BASES AND THEIR DISTANCE TO THE 8630 REM POSTULATED ENTERPRISAL POSITION. FIND THE ONE 8640 REM THAT IS FARTHEST FROM THE ENTERPRISE AND ASSIGN 8650 REM UP TO ABOUT 2 KLINGONS TO IT. 8660 REM 8670 IF K3 = 0 THEN 9160 8680 REM 8690 REM FIND THE BASE FARTHEST FROM THE ENTERPRISE. 8700 REM 8710 LET T9 = T8 = 0 8720 LET X = F1 8730 LET Y = F2 8740 FOR I = 1 TO B1 8750 IF B(I,3) <= 0 THEN 8840 8760 IF F(I-1,0) < 0 THEN 8840 8770 LET T1 = B(I,1) 8780 LET T2 = B(I,2) 8790 GOSUB 12920 8800 GOSUB 13050 8810 IF T1 <= T8 THEN 8840 8820 LET T8 = T1 8830 LET T9 = I 8840 NEXT I 8850 REM 8860 REM (T9) IS THE BASE FARTHEST FROM THE ENTERPRISE. 8870 REM FOR NOW, ASSIGN ALL REMAINING KLINGONS TO IT. 8880 REM IF THE KLINGONS ARE WITHIN 2 UNITS OF THE BASE, 8890 REM FIRE AT IT. IF THEY ARE FARTHER AWAY, MOVE IN. 8900 REM 8910 IF T9 = 0 THEN 9160 8920 IF T9 <= 3 THEN 8940 8930 PRINT "9202: T9 = ";T9 8940 FOR I = 1 TO K1 8950 IF A(I,0) <> 0 THEN 9110 8960 IF A(I,3) = T9 THEN 8980 8970 GO TO 9080 8980 IF A(I,4) > K(I,0)/2.5 THEN 9020 8990 GO TO 9080 9000 REM ATTACK THE BASE 9010 REM 9020 LET A(I,0) = 2 9030 LET A(I,3) = T9 9040 GO TO 9110 9050 REM 9060 REM MOVE TOWARD THE BASE 9070 REM 9080 LET A(I,0) = 3 9090 LET A(I,1) = B(T9,1) 9100 LET A(I,2) = B(T9,2) 9110 NEXT I 9120 GO TO 9300 9130 REM 9140 REM WE DON-T KNOW ABOUT ANYTHING. RUN AROUND RANDOMLY 9150 REM 9160 FOR I = 1 TO K1 9170 IF A(I,0) <> 0 THEN 9230 9180 LET X = FNR(X1) - 1 9190 LET Y = FNR(Y1) - 1 9200 LET A(I,0) = 3 9210 LET A(I,1) = X 9220 LET A(I,2) = Y 9230 NEXT I 9240 REM 9250 REM --------------------------------------------------- 9260 REM 9270 REM PROCESS KLINGON-S ORDERS 9280 REM 9290 REM 9300 FOR I = 0 TO 3 9310 LET H(I,1) = H(I,2) = 0 9320 NEXT I 9330 REM 9340 FOR I = 1 TO K1 9350 REM 9360 REM THIS CODE PROCESSES THE ORDERS, WHICH ARE STORED IN 9370 REM A(I,0), THE PARAMETERS IN A(I,1), A(I,2),... 9380 REM 9390 REM THE COMMANDS ARE: 9400 REM 9410 REM -1 KLINGON DEAD, IGNORE 9420 REM 0 KLINGON NOT ASSIGNED....ERROR 9430 REM 1 ATTACK THE ENTERPRISE 9440 REM 2: ATTACKING ENERGY 9450 REM 2 ATTACK A STAR BASE 9460 REM 3: STAR BASE NUMBER 9470 REM 4: ATTACKING ENERGY 9480 REM 3 MOVE A CLOSE AS POSSIBLE TO A SQUARE 9490 REM 1: X COORDINATE 9500 REM 2: Y COORDINATE 9510 REM 4 MOVE AWAY FROM A SQUARE 9520 REM 1: X COORDINATE 9530 REM 2: Y COORDINATE 9540 REM 5 MOVE TO 4 15 THEN 10460 10240 NEXT T8 10250 GO TO 10950 10260 REM ***************************** 10270 REM * MOVE AWAY FROM A SQUARE * 10280 REM ***************************** 10290 GOSUB 13120 10300 REM NOW, TRY TO MOVE 4 TIMES IN THE RANDOM DIRECTION 10310 REM FOR EACH POSSIBLE VELOCITY STARTING AT THE FASTEST 10320 REM UNTIL HE MOVES OR RUNS OUT OF LUCK. 10330 LET T1 = -T1 10340 LET T2 = -T2 10350 FOR J = T9 TO 1 STEP -1 10360 FOR K = 1 TO 4 10370 LET X = FNX( K(I,1) + J*SGN(SGN(T1) + FNR(3)-2) ) 10380 LET Y = FNY( K(I,2) + J*SGN(SGN(T2) + FNR(3)-2) ) 10390 IF G(X,Y) = 0 THEN 10630 10400 IF G(X,Y) > 15 THEN 10460 10410 NEXT K 10420 NEXT J 10430 GO TO 10950 10440 REM 10450 REM HIT A MINE 10460 PRINT "*** K #";C$(I+5);" HAS HIT"; 10470 IF G(X,Y) <> 22 THEN 10500 10480 PRINT " A MINE-"; 10490 GO TO 10520 10500 PRINT " A TORP-"; 10510 LET T(G(X,Y)-16,0) = 0 10520 LET T3 = I 10530 IF FNP(.13) = 0 THEN 10560 10540 PRINT " NO DAMAGE." 10550 GO TO 10630 10560 LET T4 = 250 + FNR(500) 10570 LET T3 = I 10580 GOSUB 13290 10590 LET G(X,Y) = 0 10600 IF K(I,0) <= 0 THEN 11060 10610 REM FOUND A PLACE IN THE RIGHT GENERAL DIRECTION. MOV 10620 REM 10630 LET G(K(I,1), K(I,2)) = 0 10640 LET G(X,Y) = 5 + I 10650 LET K(I,1) = X 10660 LET K(I,2) = Y 10670 LET A(I,4) = A(I,4) - T9*150 10680 IF A(I,4) <= 0 THEN 11060 10690 IF A(I,3) = 4 THEN 10710 10700 GO TO 9740 10710 LET A(I,2) = A(I,4) 10720 GO TO 9670 10730 GO TO 11060 10740 REM ***************************************** 10750 REM * MOVE 4-8 UNITS FROM A SQUARE (LURK) * 10760 REM ***************************************** 10770 GOSUB 13120 10780 REM OUR JOB IS TO MOVE TO A ZONE FROM 1 TO 4 SPACES 10790 REM BEYOND SENSOR RANGE OF X,Y. THE SOLUTION TO THIS 10800 REM PROBLEM RESULTS IN SIMPLY CALLING THE APPROACH, 10810 REM RUN, OR SIT STILL COMMAND. APPROACH IF EITHER 10820 REM X OR Y IS MORE THAN 8 AWAY AND RUN IF BOTH X AND 10830 REM Y ARE CLOSER THAN 4. IN ALL OTHER CASES WE ARE 10840 REM ALREADY WHERE WE WANT TO BE. OK, DO IT. 10850 REM 10860 IF ABS(T1) > 8 THEN 9840 10870 IF ABS(T2) > 8 THEN 9840 10880 IF ABS(T1) > 4 THEN 10950 10890 IF ABS(T2) > 4 THEN 10950 10900 GO TO 10330 10910 REM 10920 REM THE KLINGON SITS...HIT A BASE IF ONE IS AROUND 10930 REM 10940 IF A(I,3) = 4 THEN 10710 10950 IF A(I,4) <= 0 THEN 10980 10960 LET A(I,0) = 2 10970 GO TO 9740 10980 IF K(I,O) < 100 THEN 11060 10990 FOR J = 1 TO 4 11000 LET X = FNX(K(I,1) + FNR(3) -2) 11010 LET Y = FNY(K(I,2) + FNR(3) -2) 11020 IF G(X,Y) <> 0 THEN 11050 11030 LET T9 = 1 11040 GO TO 10630 11050 NEXT J 11060 NEXT I 11070 PRINT 11080 REM 11090 REM ------------------------------------------------ 11100 REM 11110 REM PROCESS THE HITS ON FEDERATION PROPERTY 11120 REM 11130 REM PRINT OUT THE HIT LINE 11140 REM 11150 FOR I = 1 TO B1 11160 IF B(I,3) <= 0 THEN 11330 11170 LET H(I,1) = INT(H(I,1)) 11180 PRINT " BASE ";C$(I+2);":";-H(I,1);"/";H(I,2);"="; 11190 LET B(I,3) = INT(B(I,3) - H(I,1)) 11200 IF B(I,3) <= 0 THEN 11270 11210 IF H(I,1) <> 0 THEN 11250 11220 LET B(I,3) = INT(B(I,3) ^ 1.0193) 11230 IF B(I,3) <= B(I,4) THEN 11250 11240 LET B(I,3) = B(I,4) 11250 PRINT B(I,3); 11260 GO TO 11330 11270 PRINT " DEAD. "; 11280 LET K3 = K3 - 1 11290 LET B2 = B2 - 1 11300 IF B2 <> 0 THEN 11320 11310 PRINT "*** ALL BASES DEAD." 11320 LET G(B(I,1),B(I,2)) = 0 11330 NEXT I 11340 PRINT 11350 IF H(O,1) = 0 THEN 2570 11360 REM 11370 REM THE ENTERPRISE HAS BEEN ATTACKED. FIRST, PRINT THE 11380 REM NUMBER OF ASSAILANTS AND THEIR MEANNESS... 11390 REM 11400 LET H(0,1) = INT(H(0,1)) 11410 PRINT "*** E";H(0,1);"/";H(0,2); 11420 REM 11430 REM IF THE DEFLECTORS COULD HANDLE IT, NO DAMAGE 11440 REM 11450 GOSUB 13520 11460 IF T1 < H(0,1) THEN 11560 11470 REM 11480 REM DEFLECTORS HELD 11490 REM 11500 LET E(1) = E(1) * ((T1 - H(0,1))/T1) 11510 PRINT 11520 GO TO 2570 11530 REM 11540 REM DEFLECTORS OVERPOWERED 11550 REM 11560 LET E(1) = E5 = 0 11570 LET H(0,1) = H(0,1) - T1 11580 LET E(4) = (Z2*E(4) - H(0,1)) / Z2 11590 IF E(4) <= 0 THEN 11660 11600 PRINT "=";E(4)*Z2 11610 IF FNP(H(O,1)/Z2) = 0 THEN 2570 11620 PRINT "*** PHASOR DAMAGE" 11630 LET E(3) = E(3) * RND(0) 11640 GO TO 2570 11650 REM *** ENTERPRISE DESTROYED *** 11660 PRINT " *** ENTERPRISE VAPORIZED ***" 11670 PRINT " GAME";G1;", TURN";T;", LIMIT";G3;"." 11680 STOP 11690 REM 11700 REM --------------------------------------------------- 11710 REM **** SUBROUTINES **** 11720 REM ---------------------------------------------------- 11730 REM 11740 REM SENSOR SCAN DISPLAY 11750 REM *** INITIALIZATION *** 11760 REM 11770 PRINT 11780 FOR I = T2-4 TO T2+4 11790 LET Y = FNY(I) 11800 FOR J = T1-4 TO T1+4 11810 LET X = FNX(J) 11820 PRINT " ";C$(G(X,Y)); 11830 NEXT J 11840 PRINT 11850 NEXT I 11860 RETURN 11870 REM 11880 REM SENSOR COORDINATES 11890 REM 11900 PRINT 11910 PRINT USING 11920,FNX(T1-4),FNY(T2-4),FNX(T1+4),FNY(T2-4) 11920 :##,## ##,## 11930 GOSUB 11780 11940 PRINT USING 11950,FNX(T1-4),FNY(T2+4),FNX(T1+4),FNY(T2+4) 11950 :##,## ##,## 11960 IF E8 <> 1 THEN 11980 11970 PRINT TAB(6);"DOCKED" 11980 RETURN 11990 REM DISPLAY THE GALAXY AS HE KNOWS IT 12000 REM 12010 REM FIRST, ADD 1000 TO EACH KNOWN CO-ORDINATE 12020 REM STAR BASES FIRST 12030 REM 12040 FOR I = 1 TO B1 12050 IF B(I,3) <= 0 THEN 12090 12060 LET X = B(I,1) 12070 LET Y = B(I,2) 12080 GOSUB 12350 12090 NEXT I 12100 REM SCAN FOR ENTERPRISE 12110 LET X = E1 12120 LET Y = E2 12130 GOSUB 12350 12140 REM 12150 REM NOW, OUTPUT THE GALAXY 12160 REM 12170 FOR I = 0 TO Y1 12180 FOR J=0 TO X1 12190 LET L$ = " " 12200 IF G(J,I) > 900 THEN 12250 12210 IF G(J,I) > 15 THEN 12260 12220 IF G(J,I) <> 1 THEN 12270 12230 LET L$ = C$(1) 12240 GO TO 12270 12250 LET G(J,I) = G(J,I) - 1000 12260 LET L$ = C$(G(J,I)) 12270 PRINT L$; " "; 12280 NEXT J 12290 PRINT 12300 NEXT I 12310 RETURN 12320 REM 12330 REM ADD 1000 TO ALL POINTS WITHIN 4 UNITS OF X AND Y 12340 REM 12350 FOR J = Y-4 TO Y+4 12360 LET Y2 = FNY(J) 12370 FOR K = X-4 TO X+4 12380 LET X2 = FNX(K) 12390 IF G(X2,Y2) > 900 THEN 12410 12400 LET G(X2,Y2) = G(X2,Y2) + 1000 12410 NEXT K 12420 NEXT J 12430 RETURN 12440 REM 12450 REM INPUT PROCESSING SUBROUTINE. CALLED WITH L$ CONTAINING 12460 LET T1 = 0 12470 LET X = Y = 0 12480 REM TOP OF THE LOOP...GET ONE CHAR 12490 REM 12500 LET I$ = SUBSTR(L$,1,1) 12510 IF LEN(I$) = 1 THEN 12530 12520 RETURN 12530 LET L$ = SUBSTR(L$,2) 12540 REM 12550 REM SKIP IF BLANK OR COMMA 12560 REM 12570 IF I$ = " " THEN 12500 12580 IF I$ = "," THEN 12500 12590 REM 12600 REM PROCESS U, D, L, R 12610 REM 12620 IF I$ <> "U" THEN 12650 12630 LET Y = Y - 1 12640 GO TO 12500 12650 IF I$ <> "D" THEN 12680 12660 LET Y = Y + 1 12670 GO TO 12500 12680 IF I$ <> "L" THEN 12710 12690 LET X = X - 1 12700 GO TO 12500 12710 IF I$ <> "R" THEN 12770 12720 LET X = X + 1 12730 GO TO 12500 12740 REM 12750 REM IT BETTER BE A DIGIT 12760 REM 12770 CHANGE I$ TO I 12780 IF I(1) <= 26 THEN 12820 12790 IF I(1) > 36 THEN 12820 12800 LET T1 = 10*T1 + (I(1) - 27) 12810 GO TO 12500 12820 PRINT "BAD CHARACTER -";I$; 12830 LET T1 = -1 12840 RETURN 12850 REM 12860 REM THIS ROUTINE FINDS THE DISTANCE BETWEEN X,Y AND 12870 REM T1,T2. IT RETURNS THE DIRECTED DISTANCE T1,T2 12880 REM WHICH IS THE SHORTEST VECTOR FROM X,Y TO THE ORIGINAL 12890 REM TARGET. ALL THIS HASSLE IS A RESULT OF THE 2-WAY 12900 REM CYLINDRICAL NATURE OF WARP SPACE. 12910 REM 12920 LET T1 = T1 - X 12930 IF ABS(T1) <= (X1+1)/2 THEN 12950 12940 LET T1 = -SGN(T1)*( (X1+1) - ABS(T1) ) 12950 LET T2 = T2 - Y 12960 IF ABS(T2) <= (Y1+1)/2 THEN 12980 12970 LET T2 = -SGN(T2)*( (Y1+1) - ABS(T2) ) 12980 RETURN 12990 REM 13000 REM THIS ROUTINE RETURNS THE TRAVELING DISTANCE IN T1 13010 REM WHEN CALLED WITH T1, T2 = DIRECTED DISTANCE FROM THE 13020 REM ABOVE SUBROUTINE. THE TRAVELING DISTANCE IS 13030 REM MAX(ABS(T1), ABS(T2)). 13040 REM 13050 LET T1 = ABS(T1) 13060 LET T2 = ABS(T2) 13070 IF T1 >= T2 THEN 13090 13080 LET T1 = T2 13090 RETURN 13100 REM 13110 REM MOVE TOWARDS A POINT 13120 LET X = K(I,1) 13130 LET Y = K(I,2) 13140 LET T1 = A(I,1) 13150 LET T2 = A(I,2) 13160 GOSUB 12920 13170 REM 13180 REM MAXIMUM SPEED 13190 LET T9 = INT(K(I,0)/150) 13200 IF T9 <= 4 THEN 13220 13210 LET T9 = 4 13220 RETURN 13230 REM 13240 REM 13250 REM 13260 REM 13270 REM 13280 REM KLINGON HIT AND DAMAGED 13290 LET K(T3,0) = K(T3,0) - T4 13300 IF K(T3,0) <= 0 THEN 13360 13310 PRINT INT(K(T3,0));"LEFT" 13320 LET K(T3,3) = -K(T3,3) 13330 RETURN 13340 REM 13350 REM KLINGON DESTROYED 13360 LET G(K(T3,1),K(T3,2)) = 0 13370 LET K2 = K2 - 1 13380 PRINT " KLINGON DESTROYED,";K2;"LEFT" 13390 IF K2 <= 0 THEN 13430 13400 RETURN 13410 REM 13420 REM GAME OVER 13430 PRINT "YOU HAVE WON GAME";G1;"IN";T;"MOVES." 13440 PRINT "CONGRATULATIONS." 13450 STOP 13460 REM 13470 REM 13480 REM THIS ROUTINE COMPUTES THE CURRENT LEVEL OF 13490 REM DEFLECTION OF THE ENTERPRISE. THE VALUE IS 13500 REM RETURNED IN *T1* 13510 REM 13520 LET T1 = E(1)*E5*Z1 13530 IF E8 = 0 THEN 13560 13540 REM (DOCKED) 13550 LET T1 = T1 + (B(D1,3)/10) 13560 LET T1 = INT(T1) 13570 RETURN 13580 REM 13590 REM 13600 REM TORPEDO DAMAGE 13610 REM 13620 REM 13630 IF FNP(.13) = 0 THEN 13660 13640 PRINT "NO DAMAGE." 13650 GO TO 13680 13660 LET T4 = 750 13670 GO TO 13290 13680 RETURN 13690 REM 13700 REM 13710 REM FIND A RANDOM EMPTY SPACE 13720 REM 13730 REM 13740 LET X = FNR(X1) - 1 13750 LET Y = FNR(Y1) - 1 13760 IF G(X,Y) <> 0 THEN 13740 13770 RETURN 13780 REM 13790 REM 13800 REM GENERATE A KLINGON 13810 REM 13820 REM 13830 GOSUB 13740 13840 LET K(I,1) = X 13850 LET K(I,2) = Y 13860 LET K(I,0) = K(I,3) = 1000 + ((FNR(10) - 4)*50) 13870 LET G(X,Y) = 5 + I 13880 RETURN 14000 REM *** COMMAND LIST *** 14010 PRINT "COMMAND LIST ... COMING SOON !" 14999 GOTO 3190 15000 REM *** INSTRUCTIONS *** 15010 PRINT 15020 PRINT "1. TO RECEIVE A LIST OF THE AVAILABLE COMMANDS," 15030 PRINT " TYPE 'H', WHEN YOU'RE ASKED FOR A COMMAND." 15040 PRINT "2. WHEN YOU ARE ASKED FOR A GAME #, YOU MAY " 15050 PRINT " RESPOND TWO WAYS:" 15060 PRINT " A. TYPE 0 FOR A RANDOM GAME" 15070 PRINT " B. TYPE ANY NON-ZERO NUMBER FOR THAT " 15080 PRINT " PARTICULAR GAME. THIS WAY YOU CAN" 15085 PRINT " PLAY A GAME OVER AGAIN." 15090 PRINT 15095 PRINT 15100 PRINT "USEFUL FACTS ABOUT THE GAME FOR NOVICES" 15110 PRINT 15120 PRINT " THE GALAXY" 15130 PRINT " THE GALAXY CONSISTS OF A 25 X 25 GRIDTYPE" 15140 PRINT "LAYOUT OF QUADRANTS. THE GALAXY HAS A " 15150 PRINT "WRAP-AROUND EFFECT ALONG ALL THE EDGES." 15160 PRINT "STARS ARE RANDOMLY PLACED WITH THE GALAXY" 15170 PRINT "AND ARE FATAL TO SOMEONE WHO COLLIDES WITH" 15180 PRINT "ONE (YOU CAN WARP OVER ONE, AS LONG AS YOU" 15190 PRINT "DON'T LAND ON ONE)". 15200 PRINT 15210 PRINT " THE KLINGONS" 15220 PRINT " THERE ARE BETWEEN FIVE AND NINE KLINGONS " 15230 PRINT "IN YOUR GALAXY. THEIR SHIPS ARE SIMILAR TO YOURS" 15240 PRINT "BUT THEIR ONLY WEAPON IS THE PHASOR. THEY WILL" 15250 PRINT "ATTACK BOTH YOUR SHIPS AND YOUR BASES. IF THEY" 15260 PRINT "MANAGE TO DESTROY A BASE, THEN THEIR REGENERATION" 15270 PRINT "RATE WILL INCREASE. REMEMBER, IF YOU ONLY" 15280 PRINT "DAMAGE A KLINGON SHIP WITHOUT DESTROYING IT," 15290 PRINT "IT WILL SLOWLY BUILD IT'S STRENGTH BACK UP." 15300 PRINT 15310 PRINT " STAR BASES" 15320 PRINT " THE GALAXY WILL CONTAIN BETWEEN ONE TO THREE" 15330 PRINT "STAR BASES. THESE BASES ARE YOUR ONLY HELP" 15340 PRINT "EXTERNAL TO YOUR SHIP. TO DOCK WITH THESE BASES," 15350 PRINT "YOU MUST SHUT DOWN YOUR ENGINES (I.E.- WARP" 15360 PRINT "SPEED 0) WHILE POSITIONED ALONGSIDE THE BASE." 15370 PRINT "THE BASES SHEILDS WILL GIVE YOU ADDED PROTECTION" 15380 PRINT "AND YOUR SUPPLY OF PHOTON TORPEDOES WILL BE" 15390 PRINT "RESTOCKED. YOU ARE EXPECTED TO PROTECT " 15400 PRINT "YOUR BASES, SINCE THEY ONLY HAVE SHEILDS." 15410 PRINT 15420 PRINT " THE ENTERPRISE" 15430 PRINT " YOUR SHIP IS SUPPLIED WITH THE FOLLOWING" 15440 PRINT "'FACTORY-STANDARD' EQUIPMENT:" 15450 PRINT "1. WARP ENGINES -" 15460 PRINT " YOUR WARP ENGINES WILL HANDLE ANY INTEGER" 15470 PRINT " WARP FACTOR UP TO FOUR AND FIRE IN ANY " 15480 PRINT " DIRECTION. CAUTION: IF THE ENGINES ARE LEFT" 15490 PRINT " ON TOO LONG, THEY MAY OVERHEAT AND SHUT " 15500 PRINT " DOWN. EACH WARP FACTOR USES 100 UNITS" 15510 PRINT " OF ENERGY." 15520 PRINT "2. PHASERS -" 15530 PRINT " YOU MAY FIRE YOUR PHASORS AT ANY KLINGON," 15540 PRINT " WITHIN THE RANGE OF YOUR SCANNERS. ALL" 15550 PRINT " UNUSED ENERGY WILL BE DEVOTED TO YOUR PHASORS." 15560 PRINT " PHASORS LOSE THEIR EFFECTIVENESS OVER LONG RANGES." 15570 PRINT "3. PHOTON TORPEDOES -" 15580 PRINT " TORPEDEO MAY BE FIRED IN ANY DIRECTION AND" 15590 PRINT " USE NO ENERGY TO FIRE. TORPEDEOS MOVE ONE" 15600 PRINT " SPACE PER TURN (EXCEPT THE FIRST, WHICH CAN" 15610 PRINT " MOVE EITHER ONE OR TWO SPACES; THIS IS A USER" 15620 PRINT " OPTION USEFUL FOR ALLOWING TORPS TO JUMP" 15630 PRINT " BASES AND STARS)." 15640 PRINT "4. SHEILDS -" 15650 PRINT " YOUR SHEILDS ARE USED TO PROTECT YOUR SHIP" 15660 PRINT " FROM ENEMY PHASORS (OR YOUR OWN TORPS AND MINES)." 15670 PRINT " WHEN AT FULL EFFECTIVENESS THEY PROVIDE FIVE" 15680 PRINT " TIMES THE ENERGY BEING COMMITTED IN PROTECTION." 15690 PRINT " IF YOUR SHEILDS ARE COMPLETELY DESTROYED, LATER" 15700 PRINT " DAMAGE WILL BE INCURRED ON YOUR DILITHIUM" 15710 PRINT " CRYSTALS. DAMAGE TO THE SHIP'S EQUIPMENT, SHEILDS," 15720 PRINT " OR DILITHIUM CRYSTALS CAN ONLY BE REPAIRED" 15730 PRINT " BY DOCKING OR RETREATING AND WAITING." 15740 PRINT "5. MINES -" 15750 PRINT " MINES CAN BE DROPPED IN ANY DIRECTION EITHER" 15760 PRINT " ONE OR TWO SPACES FROM THE SHIP. THEY WILL" 15770 PRINT " REMAIN THERE UNTIL SOMEONE HIT THEM OR THEY " 15780 PRINT " ARE DESTROYED." 15790 PRINT "6. SCANNERS -" 15800 PRINT " THERE ARE THREE TYPES OF SCANNERS FOR YOUR" 15810 PRINT " USE. THEY ARE:" 15820 PRINT " A. STANDARD SHORT RANGE - SHOWS WHAT S AROUND" 15830 PRINT " THE SHIP. IT IS PRINTED AT THE BEGINNING" 15840 PRINT " OF EACH TURN OR BY THE COMMAND 'SE'." 15850 PRINT " B. BASE SHORT RANGE - SHOWS WHAT'S AROUND A" 15860 PRINT " PARTICULAR BASE. IT IS PRINTED BY USING" 15870 PRINT " THE COMMAND 'SX', WHERE X IS THE BASE'S" 15880 PRINT " LETTER DESIGNATION." 15890 PRINT " C. GALACTIC - SHOWS THE ENTIRE GALAXY. KLINGONS," 15900 PRINT " MINES, AND TORPEDOES THAT ARE OUTSIDE OF " 15910 PRINT " THE RANGE OF ANY OF YOUR SCANNERS ARE NOT" 15920 PRINT " SHOWN." 15930 PRINT "7. INFORMATION LINE -" 15940 PRINT " THE INFORMATION LINE IS SHOWN BY THE COMPUTER" 15950 PRINT " WHENEVER ORDERS ARE ASKED FOR OR THE USER TYPES" 15960 PRINT " 'I'. THE FOLLOWING IS AN EXAMPLE OF AN INFORMATION" 15970 PRINT " LINE AND ITS INTERPRETATION:" 15980 PRINT " 68: W2""D""L 200 D 807 500 P 9 *** 3 COMMAND?" 15990 PRINT " A. THE 68 IS THE NUMBER OF MY TURN." 16000 PRINT " B. W2 INDICATES THAT MY WARP SPEED IS FACTOR 2." 16010 PRINT " C. ""D""L INDICATES MY DIRECTION, WHICH IN THIS" 16020 PRINT " EXAMPLE IS DOWN AND LEFT." 16030 PRINT " D. 200 IS THE AMOUNT OF ENERGY BEING USED" 16040 PRINT " BY THE WARP ENGINES." 16050 PRINT " E. D 807 500 SHOWS MY DEFLECTORS CAN STAND UP" 16060 PRINT " TO 807 UNITS OF FIRE POWER, AND MY" 16070 PRINT " SHEILDS ARE PRESENTLY USING 500 UNITS" 16080 PRINT " OF ENERGY." 16090 PRINT " F. P 9 INDICATES I HAVE 9 TORPEDOES LEFT." 16100 PRINT " G. 3 IS HOW MANY ORDERS I HAVE REMAINING IN" 16110 PRINT " THIS TURN." 16120 PRINT 16130 PRINT " MISC. NOTES" 16140 PRINT "1. THE USER CAN ISSUE UP TO THREE COMMANDS PER" 16150 PRINT " TURN, WITH THE EXCEPTION OF THE FIRST TURN" 16160 PRINT " WHERE THE USER HAS SIX COMMANDS." 16170 PRINT "2. THERE ARE MORE COMMANDS AVAILABLE TO THE USER " 16180 PRINT " FOR A FULL LIST TYPE H AS A COMMAND." 16190 PRINT "3. ALL COMMENTS SHOULD BE SENT THROUGH MAIL" 16200 PRINT " TO USER 4002 OR COMMENTS CAN BE SENT TO" 16210 PRINT " ME THROUGH THE COMMENT PROGRAM." 16220 PRINT 16230 PRINT " GOOD LUCK AND HAPPY HUNTING !!!" 16240 RETURN 16250 END