682 lines
23 KiB
QBasic
682 lines
23 KiB
QBasic
520 REM
|
|
530 REM
|
|
540 REM **** **** STAR TREK **** ****
|
|
550 REM **** Simulation of a mission of the starship ENTERPRISE
|
|
560 REM **** as seen on the Star Trek tv show
|
|
570 REM **** Original program in Creative Computing
|
|
580 REM **** Basic Computer Games by Dave Ahl
|
|
590 REM **** Modifications by Bob Fritz and Sharon Fritz
|
|
600 REM **** for the IBM Personal Computer, October-November 1981
|
|
610 REM **** Bob Fritz, 9915 Caninito Cuadro, San Diego, Ca., 92129
|
|
620 REM **** (714) 484-2955
|
|
630 REM ****
|
|
640 PRINT:PRINT:PRINT:PRINT:PRINT:PRINT:PRINT:PRINT:PRINT:PRINT:PRINT
|
|
650 E1$= " ,-----------------, _"
|
|
660 E2$= " `---------- ----',-----/ \----,"
|
|
670 E3$= " | | '- --------'"
|
|
680 E4$= " ,--' '------/ /--,"
|
|
690 E5$= " '-----------------'"
|
|
691 PRINT
|
|
700 E6$= " THE USS ENTERPRISE --- NCC-1701"
|
|
720 PRINT E1$
|
|
730 PRINT E2$
|
|
740 PRINT E3$
|
|
750 PRINT E4$
|
|
760 PRINT E5$
|
|
770 PRINT
|
|
780 PRINT E6$
|
|
790 PRINT:PRINT: PRINT:PRINT:PRINT:PRINT:PRINT
|
|
811 RANDOMIZE
|
|
960 dim D(8)
|
|
961 dim C(9,2)
|
|
962 dim K(3,3)
|
|
963 dim N(3)
|
|
965 DIM G(8,8)
|
|
966 DIM Z(8,8)
|
|
970 T=INT(RND(1)*20+20)*100:T0=T:T9=25+INT(RND(1)*10):D0=0:E=3000:E0=E
|
|
980 P=10:P0=P:S9=200:S=0:B9=0:K9=0:X$="":X0$=" is "
|
|
990 rem DEF FND(D)=SQR((K(I,1)-S1)^2+(K(I,2)-S2)^2)
|
|
1000 rem DEF FNR(R)=INT(RND(1)(R)*7.98+1.01)
|
|
1010 REM initialize enterprise's position
|
|
1020 Q1=INT(RND(1)*7.98+1.01):Q2=INT(RND(1)*7.98+1.01):S1=INT(RND(1)*7.98+1.01):S2=INT(RND(1)*7.98+1.01)
|
|
1030 FOR I=1 TO 9
|
|
1031 C(I,1)=0:C(I,2)=0
|
|
1032 NEXT I
|
|
1040 C(3,1)=-1:C(2,1)=-1:C(4,1)=-1:C(4,2)=-1:C(5,2)=-1:C(6,2)=-1
|
|
1050 C(1,2)=1:C(2,2)=1:C(6,1)=1:C(7,1)=1:C(8,1)=1:C(8,2)=1:C(9,2)=1
|
|
1060 FOR I=1 TO 8
|
|
1061 D(I)=0
|
|
1062 NEXT I
|
|
1070 A1$="NAVSRSLRSPHATORSHIDAMCOMRES"
|
|
1080 REM set up what exists in galaxy
|
|
1090 REM k3=#klingons b3=#starbases s3=#stars
|
|
1100 FOR I=1 TO 8
|
|
1101 FOR J=1 TO 8
|
|
1102 K3=0:Z(I,J)=0:R1=RND(1)
|
|
1110 IF R1<=0.9799999 THEN goto 1120
|
|
1111 K3=3:K9=K9+3: GOTO 1140
|
|
1120 IF R1<=0.95 THEN goto 1130
|
|
1121 K3=2:K9=K9+2: GOTO 1140
|
|
1130 IF R1<=0.8 THEN goto 1140
|
|
1131 K3=1:K9=K9+1
|
|
1140 B3=0:IF RND(1)<=0.96 THEN goto 1150
|
|
1141 B3=1:B9=B9+1
|
|
1150 G(I,J)=K3*100+B3*10+INT(RND(1)*7.98+1.01)
|
|
1151 NEXT J
|
|
1152 NEXT I
|
|
1153 IF K9<=T9 THEN goto 1160
|
|
1154 T9=K9+1
|
|
1160 IF B9<>0 THEN 1190
|
|
1170 IF G(Q1,Q2)>=200 THEN 1180
|
|
1171 G(Q1,Q2)=G(Q1,Q2)+100:K9=K9+1
|
|
1180 B9=1:G(Q1,Q2)=G(Q1,Q2)+10:Q1=INT(RND(1)*7.98+1.01):Q2=INT(RND(1)*7.98+1.01)
|
|
1190 K7=K9:IF B9=1 THEN 1200
|
|
1191 X$="s":X0$=" are "
|
|
1200 PRINT" Your orders are as follows: "
|
|
1210 PRINT" Destroy the ";K9;" Klingon warships which have invaded"
|
|
1220 PRINT" the galaxy before they can attack Federation headquarters"
|
|
1230 PRINT" on stardate ";T0+T9;". This gives you ";T9;" days. there";X0$
|
|
1240 PRINT" ";B9;" starbase";X$;" in the galaxy for resupplying your ship"
|
|
1261 PRINT:INPUT"hit return when ready to accept command";i$
|
|
1270 REM here any time new quadrant entered
|
|
1280 Z4=Q1:Z5=Q2:K3=0:B3=0:S3=0:G5=0:D4=0.5*RND(1):Z(Q1,Q2)=G(Q1,Q2)
|
|
1290 IF Q1<1 OR Q1>8 OR Q2<1 OR Q2>8 THEN 1410
|
|
1300 GOSUB 5040
|
|
1301 PRINT:IF T0 <>T THEN 1330
|
|
1310 PRINT"Your mission begins with your starship located"
|
|
1320 PRINT"in the galactic quadrant, '";G2$;"'.":GOTO 1340
|
|
1330 PRINT"Now entering ";G2$;" quadrant. . ."
|
|
1340 PRINT:K3=INT(G(Q1,Q2)*0.01):B3=INT(G(Q1,Q2)*0.1)-10*K3
|
|
1350 S3=G(Q1,Q2)-100*K3-10*B3:IF K3=0 THEN 1400
|
|
1360 PRINT "COMBAT AREA!! Condition";
|
|
1370 PRINT " RED "; : PRINT
|
|
1380 GOSUB 5290
|
|
1381 IF S>200 THEN 1400
|
|
1390 PRINT" SHIELDS DANGEROUSLY LOW"; : PRINT
|
|
1400 FOR I=1 TO 3
|
|
1401 K(I,1)=0:K(I,2)=0
|
|
1402 NEXT I
|
|
1410 FOR I=1 TO 3
|
|
1411 K(I,3)=0
|
|
1412 NEXT I
|
|
1413 Q$=" "*192
|
|
1420 REM position enterprise in quadrant, then place "k3" klingons,&
|
|
1430 REM "b3" starbases & "s3" stars elsewhere.
|
|
1440 A$="\e/":Z1=S1:Z2=S2
|
|
1441 GOSUB 4830
|
|
1442 IF K3<1 THEN 1470
|
|
1450 FOR I=1 TO K3
|
|
1451 GOSUB 4800
|
|
1452 A$=chr$(187)+"K"+chr$(171):Z1=R1:Z2=R2
|
|
1460 GOSUB 4830
|
|
1461 K(I,1)=R1:K(I,2)=R2:K(I,3)=S9*(0.5+RND(1))
|
|
1462 NEXT I
|
|
1470 IF B3<1 THEN 1500
|
|
1480 GOSUB 4800
|
|
1481 A$="("+chr$(174)+")":Z1=R1:B4=R1:Z2=R2:B5=R2
|
|
1490 GOSUB 4830
|
|
1500 FOR I=1 TO S3
|
|
1501 GOSUB 4800
|
|
1502 A$=" * ":Z1=R1:Z2=R2
|
|
1503 GOSUB 4830
|
|
1504 NEXT I
|
|
1510 GOSUB 3720
|
|
1520 IF S+E<=10 THEN 1530
|
|
1521 IF E>10 OR D(7)>=0 THEN 1580
|
|
1530 PRINT"*** FATAL ERROR ***";
|
|
1531 GOSUB 5290
|
|
1540 PRINT"You've just stranded your ship in "
|
|
1550 PRINT"space":PRINT"You have insufficient maneuvering energy,";
|
|
1560 PRINT" and shield control":PRINT"is presently incapable of cross";
|
|
1570 PRINT"-circuiting to engine room!!":GOTO 3480
|
|
1580 INPUT"command ";A$
|
|
1590 FOR I=1 TO 9
|
|
1591 IF MID$(A$,1,3)<> MID$(A1$,3*I-2,3) THEN 1610
|
|
1600 ON I GOTO 1720,1510,2440,2530,2750,3090,3180,3980,3510
|
|
1610 NEXT I
|
|
1611 PRINT"Enter one of the following:"
|
|
1620 PRINT" NAV (to set course)"
|
|
1630 PRINT" SRS (for short range sensor scan)"
|
|
1640 PRINT" LRS (for long range sensor scan)"
|
|
1650 PRINT" PHA (to fire phasers)"
|
|
1660 PRINT" TOR (to fire photon torpedoes)"
|
|
1670 PRINT" SHI (to raise or lower shields)"
|
|
1680 PRINT" DAM (for damage control reports)"
|
|
1690 PRINT" COM (to call on library-computer)"
|
|
1700 PRINT" RES (to resign your command)":PRINT:GOTO 1520
|
|
1710 REM course control begins here
|
|
1720 INPUT"Course (1-9) ";C2$:C1=VAL(C2$):IF C1<>9 THEN 1730
|
|
1721 C1=1
|
|
1730 IF C1>=1 AND C1<9 THEN 1750
|
|
1740 PRINT" Lt. Sulu reports, 'Incorrect course data, sir!'":GOTO 1520
|
|
1750 X$="8":IF D(1)>=0 THEN 1760
|
|
1751 X$="0.2"
|
|
1760 PRINT"Warp factor(0-";X$;") ";:INPUT C2$:W1=VAL(C2$):IF D(1)<0 AND W1>0.2 THEN 1810
|
|
1770 IF W1>0 AND W1<8 THEN 1820
|
|
1780 IF W1=0 THEN 1520
|
|
1790 PRINT" Chief Engineer Scott reports 'The engines won't take";
|
|
1800 PRINT" warp ";W1;"!":GOTO 1520
|
|
1810 PRINT"Warp engines are damaged. Maximum speed = warp 0.2":GOTO 1520
|
|
1820 N1=INT(W1*8+0.5):IF E-N1>=0 THEN 1900
|
|
1830 PRINT"Engineering reports 'Insufficient energy available"
|
|
1840 PRINT" for maneuvering at warp ";W1;"!'"
|
|
1850 IF S<N1-E OR D(7)<0 THEN 1520
|
|
1860 PRINT"Deflector control room acknowledges ";S;" units of energy"
|
|
1870 PRINT" presently deployed to shields."
|
|
1880 GOTO 1520
|
|
1890 REM klingons move/fire on moving starship . . .
|
|
1900 FOR I=1 TO K3
|
|
1901 IF K(I,3)=0 THEN 1930
|
|
1910 A$=" ":Z1=K(I,1):Z2=K(I,2)
|
|
1911 GOSUB 4830
|
|
1912 GOSUB 4800
|
|
1920 K(I,1)=Z1:K(I,2)=Z2:A$=chr$(187)+"K"+chr$(171)
|
|
1921 GOSUB 4830
|
|
1930 NEXT I
|
|
1931 REM GOSUB 4810
|
|
1932 D1=0:D6=W1:IF W1<1 THEN 1940
|
|
1933 D6=1
|
|
1940 FOR I=1 TO 8
|
|
1941 IF D(I)>=0 THEN 1990
|
|
1950 D(I)=min(0,D(I)+D6):IF D(I)<=-0.1 or D(I)>=0 THEN 1960
|
|
1951 D(I)=-0.1
|
|
1952 GOTO 1990
|
|
1960 IF D(I)<0 THEN 1990
|
|
1970 IF D1=1 THEN 1980
|
|
1971 D1=1:PRINT"DAMAGE CONTROL REPORT: ";
|
|
1980 PRINT TAB(8);:R1=I
|
|
1981 GOSUB 4890
|
|
1982 PRINT G2$;" Repair completed."
|
|
1990 NEXT I
|
|
1991 IF RND(1)>0.2 THEN 2070
|
|
2000 R1=INT(RND(1)*7.98+1.01):IF RND(1)>=0.6 THEN 2040
|
|
2010 IF K3=0 THEN 2070
|
|
2020 D(R1)=D(R1)-(RND(1)*5+1):PRINT"DAMAGE CONTROL REPORT: ";
|
|
2030 GOSUB 4890
|
|
2031 PRINT G2$;" damaged":PRINT:GOTO 2070
|
|
2040 D(R1)=min(0,D(R1)+RND(1)*3+1):PRINT"DAMAGE CONTROL REPORT: ";
|
|
2050 GOSUB 4890
|
|
2051 PRINT G2$;" State of repair improved":PRINT
|
|
2060 REM begin moving starship
|
|
2070 A$=" " :Z1=INT(S1):Z2=INT(S2)
|
|
2071 GOSUB 4830
|
|
2079 Z1=INT(C1):C1=C1-Z1
|
|
2080 X1=C(Z1,1)+(C(Z1+1,1)-C(Z1,1))*C1:X=S1:Y=S2
|
|
2090 X2=C(Z1,2)+(C(Z1+1,2)-C(Z1,2))*C1:Q4=Q1:Q5=Q2
|
|
2100 FOR I=1 TO N1
|
|
2101 S1=S1+X1:S2=S2+X2:IF S1<1 OR S1>=9 OR S2<1 OR S2>=9 THEN 2220
|
|
2110 S8=INT(S1)*24+INT(S2)*3-26:IF MID$(Q$,S8+1,2)=" " THEN 2140
|
|
2120 S1=INT(S1-X1):S2=INT(S2-X2):PRINT"Warp engines shut down at ";
|
|
2130 PRINT "sector ";S1;",";S2;" due to bad navigation.":GOTO 2150
|
|
2140 NEXT I
|
|
2141 S1=INT(S1):S2=INT(S2)
|
|
2150 A$="\e/"
|
|
2160 Z1=INT(S1):Z2=INT(S2)
|
|
2161 GOSUB 4830
|
|
2162 GOSUB 2390
|
|
2163 T8=1
|
|
2170 IF W1>=1 THEN 2180
|
|
2171 T8=0.1*INT(10*W1)
|
|
2180 T=T+T8:IF T>T0+T9 THEN 3480
|
|
2190 REM see if docked then get command
|
|
2200 GOTO 1510
|
|
2210 REM exceeded quadrant limits
|
|
2220 X=8*Q1+X+N1*X1:Y=8*Q2+Y+N1*X2:Q1=INT(X/8):Q2=INT(Y/8):S1=INT(X-Q1*8)
|
|
2230 S2=INT(Y-Q2*8):IF S1<>0 THEN 2240
|
|
2231 Q1=Q1-1:S1=8
|
|
2240 IF S2<>0 THEN 2250
|
|
2241 Q2=Q2-1:S2=8
|
|
2250 X5=0:IF Q1>=1 THEN 2260
|
|
2251 X5=1:Q1=1:S1=1
|
|
2260 IF Q1<=8 THEN 2270
|
|
2261 X5=1:Q1=8:S1=8
|
|
2270 IF Q2>=1 THEN 2280
|
|
2271 X5=1:Q2=1:S2=1
|
|
2280 IF Q2<=8 THEN 2290
|
|
2281 X5=1:Q2=8:S2=8
|
|
2290 IF X5=0 THEN 2360
|
|
2300 PRINT"Lt. Uhura reports message from Starfleet Command:"
|
|
2310 PRINT" 'Permission to attempt crossing of galactic perimeter"
|
|
2320 PRINT" is hereby *DENIED*. Shut down your engines.'"
|
|
2330 PRINT"Chief Engineer Scott reports 'Warp engines shut down"
|
|
2340 PRINT" at sector ";S1;",";S2;" of quadrant ";Q1;",";Q2".'"
|
|
2350 IF T>T0 THEN 3480
|
|
2360 IF 8*Q1+Q2=8*Q4+Q5 THEN 2150
|
|
2370 T=T+1
|
|
2371 GOSUB 2390
|
|
2372 GOTO 1280
|
|
2380 REM maneuver energy s/r **
|
|
2390 E=E-N1-10:IF E<=0 THEN 2400
|
|
2391 RETURN
|
|
2400 PRINT"Shield control supplies energy to complete the maneuver."
|
|
2410 S=S+E:E=0:IF S<=0 THEN 2420
|
|
2411 S=0
|
|
2420 RETURN
|
|
2430 REM long range sensor scan code
|
|
2440 IF D(3)>=0 THEN 2450
|
|
2441 PRINT"Long Range Sensors are inoperable":GOTO 1520
|
|
2450 PRINT"Long Range Scan for quadrant ";Q1;",";Q2
|
|
2460 PRINT "-"*19
|
|
2470 FOR I=Q1-1 TO Q1+1
|
|
2471 N(1)=-1:N(2)=-2:N(3)=-3
|
|
2472 FOR J=Q2-1 TO Q2+1
|
|
2480 IF I<=0 or I>=9 or J<=0 or J>=9 THEN 2490
|
|
2481 N(J-Q2+2)=G(I,J)
|
|
2482 REM added so long range sensor scans are added to computer database
|
|
2483 z(i,j)=g(i,j)
|
|
2490 NEXT J
|
|
2491 FOR L=1 TO 3
|
|
2492 PRINT"| ";
|
|
2493 IF N(L)>=0 THEN 2500
|
|
2494 PRINT"*** ";:GOTO 2510
|
|
2500 PRINT MID$(STR$(N(L)+1000),2,3);" ";
|
|
2510 NEXT L
|
|
2511 PRINT"|"
|
|
2512 PRINT "-"*19
|
|
2513 NEXT I
|
|
2514 GOTO 1520
|
|
2520 REM phaser control code begins here
|
|
2530 IF D(4)>=0 THEN 2540
|
|
2531 PRINT"Phasers Inoperative":GOTO 1520
|
|
2540 IF K3>0 THEN 2570
|
|
2550 PRINT"Science Officer Spock reports 'Sensors show no enemy ships"
|
|
2560 PRINT" in this quadrant'":GOTO 1520
|
|
2570 IF D(8)>=0 THEN 2580
|
|
2571 PRINT"Computer failure hampers accuracy"
|
|
2580 PRINT"Phasers locked on target ";
|
|
2590 PRINT"Energy available = ";E;" units"
|
|
2600 INPUT"Numbers of units to fire ";X:IF X<=0 THEN 1520
|
|
2610 IF E-X<0 THEN 2590
|
|
2620 E=E-X
|
|
2621 GOSUB 5420
|
|
2622 IF D(7)<0 THEN 2630
|
|
2623 X=X*RND(1)
|
|
2630 H1=INT(X/K3)
|
|
2631 FOR I=1 TO 3
|
|
2632 IF K(I,3)<=0 THEN 2730
|
|
2640 KSQ1 = (K(I,1)-S1)*(K(I,1)-S1)
|
|
2641 KSQ2 = (K(I,2)-S2)*(K(I,2)-S2)
|
|
2642 H= SQR( KSQ1 + KSQ2 )
|
|
2646 H = H1 / H
|
|
2647 H = INT(H * (RND(1)+2))
|
|
2648 IF H>0.15*K(I,3) THEN 2660
|
|
2650 PRINT"Sensors show no damage to enemy at ";K(I,1);",";K(I,2):GOTO 2730
|
|
2660 K(I,3)=K(I,3)-H:PRINT H;"Unit hit on Klingon at sector ";K(I,1);",";
|
|
2670 PRINT K(I,2):IF K(I,3)> 0 THEN GOTO 2700
|
|
2680 PRINT "**** KLINGON DESTROYED ****"
|
|
2690 GOTO 2710
|
|
2700 PRINT" (Sensors show ";K(I,3);" units remaining)":GOTO 2730
|
|
2710 K3=K3-1:K9=K9-1:Z1=K(I,1):Z2=K(I,2):A$=" "
|
|
2711 GOSUB 4830
|
|
2720 K(I,3)=0:G(Q1,Q2)=G(Q1,Q2)-100:Z(Q1,Q2)=G(Q1,Q2):IF K9<=0 THEN 3680
|
|
2730 NEXT I
|
|
2731 GOSUB 3350
|
|
2732 GOTO 1520
|
|
2740 REM photon torpedo code begins here
|
|
2750 IF P>0 THEN 2760
|
|
2751 PRINT"All photon torpedoes expended":GOTO 1520
|
|
2760 IF D(5)>=0 THEN 2770
|
|
2761 PRINT"Photon tubes are not operational":GOTO 1520
|
|
2770 INPUT"Photon torpedo course (1-9) ";C2$:C1=VAL(C2$):IF C1<>9 THEN 2780
|
|
2771 C1=1
|
|
2780 IF C1>=1 AND C1<9 THEN 2810
|
|
2790 PRINT"Ensign Chekov reports, 'Incorrect course data, sir!'"
|
|
2800 GOTO 1520
|
|
2810 Z1=INT(C1):C1=C1-Z1
|
|
2811 X1=C(Z1,1)+(C(Z1+1,1)-C(Z1,1))*C1:E=E-2:P=P-1
|
|
2820 X2=C(Z1,2)+(C(Z1+1,2)-C(Z1,2))*C1:X=S1:Y=S2
|
|
2821 GOSUB 5360
|
|
2830 PRINT"Torpedo track:"
|
|
2840 X=X+X1:Y=Y+X2:X3=INT(X+0.5):Y3=INT(Y+0.5)
|
|
2850 IF X3<1 OR X3>8 OR Y3<1 OR Y3>8 THEN 3070
|
|
2860 PRINT" ";X3;",";Y3:A$=" ":Z1=X:Z2=Y
|
|
2861 GOSUB 4990
|
|
2870 IF Z3<>0 THEN 2840
|
|
2880 A$=chr$(187)+"K"+chr$(171):Z1=X:Z2=Y
|
|
2881 GOSUB 4990
|
|
2882 IF Z3=0 THEN 2940
|
|
2890 PRINT"**** KLINGON DESTROYED ****"
|
|
2900 K3=K3-1:K9=K9-1:IF K9<=0 THEN 3680
|
|
2910 FOR I=1 TO 3
|
|
2911 IF X3=K(I,1) AND Y3=K(I,2) THEN 2930
|
|
2920 NEXT I
|
|
2921 I=3
|
|
2930 K(I,3)=0:GOTO 3050
|
|
2940 A$=" * ":Z1=X:Z2=Y
|
|
2941 GOSUB 4990
|
|
2942 IF Z3=0 THEN 2960
|
|
2950 PRINT"Star at ";X3;",";Y3;" absorbed torpedo energy."
|
|
2951 GOSUB 3350
|
|
2952 GOTO 1520
|
|
2960 A$="("+chr$(174)+")":Z1=X:Z2=Y
|
|
2961 GOSUB 4990
|
|
2962 IF Z3<>0 THEN 2970
|
|
2963 PRINT "Torpedo absorbed by unknown object at ";x3;",";y3
|
|
2964 goto 1520
|
|
2970 PRINT"*** STARBASE DESTROYED ***"
|
|
2980 B3=B3-1 : B9=B9-1
|
|
2990 IF B9>0 OR K9>T-T0-T9 THEN 3030
|
|
3000 PRINT"THAT DOES IT, CAPTAIN!! You are hereby relieved of command"
|
|
3010 PRINT"and sentenced to 99 stardates of hard labor on CYGNUS 12!!"
|
|
3020 GOTO 3510
|
|
3030 PRINT"Starfleet reviewing your record to consider"
|
|
3040 PRINT"court martial!":D0=0
|
|
3050 Z1=X:Z2=Y:A$=" "
|
|
3051 GOSUB 4830
|
|
3060 G(Q1,Q2)=K3*100+B3*10+S3:Z(Q1,Q2)=G(Q1,Q2)
|
|
3061 GOSUB 3350
|
|
3062 GOTO 1520
|
|
3070 PRINT"Torpedo missed"
|
|
3071 GOSUB 3350
|
|
3072 GOTO 1520
|
|
3080 REM shield control
|
|
3090 IF D(7)>=0 THEN 3100
|
|
3091 PRINT"Shield control inoperable":GOTO 1520
|
|
3100 PRINT"Energy available = ";E+S :INPUT "Number of units to shields? ";X
|
|
3110 IF X>=0 and S<>X THEN 3120
|
|
3111 PRINT"<shields unchanged>":GOTO 1520
|
|
3120 IF X<E+S THEN 3150
|
|
3130 PRINT"Shield Control reports: This is not the federation treasury."
|
|
3140 PRINT"<shields unchanged>":goto 1990
|
|
3150 E=E+S-X:S=X:PRINT"Deflector Control Room report:"
|
|
3160 PRINT" 'Shields now at ";INT(S);" units per your command.'":GOTO 1520
|
|
3170 REM damage control
|
|
3180 IF D(6)>=0 THEN 3290
|
|
3190 PRINT"Damage control report not available":IF D0=0 THEN 1520
|
|
3200 D3=0:FOR I=1 TO 8
|
|
3201 IF D(I)>=0 THEN 3210
|
|
3202 D3=D3+1
|
|
3210 NEXT I
|
|
3211 IF D3=0 THEN 1520
|
|
3220 PRINT:D3=D3+D4:IF D3<1 THEN 3230
|
|
3221 D3=0.9
|
|
3230 PRINT"Technicians standing by to effect repairs to your ship;"
|
|
3240 PRINT"estimated time to repair: ";0.01*INT(100*D3);" stardates"
|
|
3250 INPUT"Will you authorize the repair order (Y/N)? ";A$
|
|
3260 IF A$<>"y" AND A$<> "Y" THEN 1520
|
|
3270 FOR I=1 TO 8
|
|
3271 IF D(I)>=0 THEN 3280
|
|
3272 D(I)=0
|
|
3280 NEXT I
|
|
3281 T=T+D3+0.1
|
|
3290 PRINT:PRINT"Device state of repair"
|
|
3291 FOR R1=1 TO 8
|
|
3300 GOSUB 4890
|
|
3301 PRINT G2$;tab(25);
|
|
3310 GG2=INT(D(R1)*100)*0.01:PRINT GG2
|
|
3320 NEXT R1
|
|
3321 PRINT:IF D0<>0 THEN 3200
|
|
3330 GOTO 1520
|
|
3340 REM klingons shooting
|
|
3350 IF K3>0 THEN 3360
|
|
3351 RETURN
|
|
3360 IF D0=0 THEN 3370
|
|
3361 PRINT"Starbase shields protect the ENTERPRISE"
|
|
3362 RETURN
|
|
3370 FOR I=1 TO 3
|
|
3371 IF K(I,3)<=0 THEN 3460
|
|
3380 ksq1 = (K(I,1)-S1)*(K(I,1)-S1)
|
|
3381 ksq2 = (K(I,2)-S2)*(K(I,2)-S2)
|
|
3382 H=( K(I,3) / SQR( ksq1 + ksq2 ) )*(2+RND(1))
|
|
3383 h = int(h)
|
|
3384 S=S-H:K(I,3)=K(I,3)/(3+RND(1))
|
|
3390 PRINT "ENTERPRISE HIT!"
|
|
3400 GOSUB 5480
|
|
3401 PRINT H;" Unit hit on ENTERPRISE from sector ";K(I,1);",";K(I,2)
|
|
3410 IF S<=0 THEN 3490
|
|
3420 PRINT" <shields down to ";S;" units>":IF H<20 THEN 3460
|
|
3430 IF RND(1)>0.6 OR H/S<=0.02 THEN 3460
|
|
3440 R1=INT(RND(1)*7.98+1.01):D(R1)=D(R1)-H/S-0.5*RND(1)
|
|
3441 GOSUB 4890
|
|
3450 PRINT"Damage control reports '";G2$;" damaged by the hit'"
|
|
3460 NEXT I
|
|
3461 RETURN
|
|
3470 REM end of game
|
|
3480 PRINT"It is stardate";T:GOTO 3510
|
|
3490 PRINT:PRINT"the ENTERPRISE has been destroyed. The Federation ";
|
|
3500 PRINT"will be conquered":GOTO 3480
|
|
3510 PRINT"There were ";K9;" Klingon battle cruisers left at"
|
|
3520 PRINT"the end of your mission"
|
|
3530 PRINT:PRINT:IF B9=0 THEN 3670
|
|
3540 PRINT"The Federation is in need of a new starship commander"
|
|
3550 PRINT"for a similar mission -- if there is a volunteer,"
|
|
3560 INPUT"let him or her step forward and enter 'AYE' ";X$:IF X$="AYE" THEN 520
|
|
3670 END
|
|
3680 PRINT"Congratulations, Captain! the last Klingon battle cruiser"
|
|
3690 PRINT"menacing the Federation has been destroyed.":PRINT
|
|
3700 PRINT"Your efficiency rating is ";:cc1 = k7/(t-t0):PRINT 1000*cc1*cc1:GOTO 3530
|
|
3710 REM short range sensor scan & startup subroutine
|
|
3720 A$="("+chr$(174)+")":Z3=0
|
|
3721 FOR I=S1-1 TO S1+1
|
|
3722 FOR J=S2-1 TO S2+1
|
|
3730 IF INT(I+0.5)<1 OR INT(I+0.5)>8 OR INT(J+0.5)<1 OR INT(J+0.5)>8 or Z3=1 THEN 3760
|
|
3750 Z1=I:Z2=J
|
|
3751 GOSUB 4990
|
|
3760 NEXT J
|
|
3761 NEXT I
|
|
3762 IF Z3=1 THEN 3770
|
|
3763 D0=0:GOTO 3790
|
|
3770 D0=1:C$="docked":E=E0:P=P0
|
|
3780 PRINT"Shields dropped for docking purposes":S=0:GOTO 3810
|
|
3790 IF K3<=0 THEN 3800
|
|
3791 C$="*red*":GOTO 3810
|
|
3800 C$="GREEN":IF E>=E0*0.1 THEN 3810
|
|
3801 C$="YELLOW"
|
|
3810 IF D(2)>=0 THEN 3830
|
|
3820 PRINT:PRINT"*** Short Range Sensors are out ***":PRINT
|
|
3821 RETURN
|
|
3830 PRINT "-"*33
|
|
3832 FOR I=1 TO 8
|
|
3840 FOR J=(I-1)*24 TO (I-1)*24+21 STEP 3
|
|
3850 IF MID$(Q$,J+1,3)<>" " THEN 3860
|
|
3851 PRINT " . ";:GOTO 3861
|
|
3860 PRINT " ";MID$(Q$,J+1,3);
|
|
3861 NEXT J
|
|
3870 ON I GOTO 3880,3900,3910,3920,3930,3940,3950,3960
|
|
3880 PRINT" Stardate ";
|
|
3890 TT= T*10 : TT=INT(TT)*0.1:PRINT TT :GOTO 3970
|
|
3900 PRINT" Condition ";C$:GOTO 3970
|
|
3910 PRINT" Quadrant ";Q1;",";Q2:GOTO 3970
|
|
3920 PRINT" Sector ";S1;",";S2:GOTO 3970
|
|
3930 PRINT" Photon torpedoes ";INT(P):GOTO 3970
|
|
3940 PRINT" Total energy ";INT(E+S):GOTO 3970
|
|
3950 PRINT" Shields ";INT(S):GOTO 3970
|
|
3960 PRINT" Klingons remaining ";INT(K9)
|
|
3970 NEXT I
|
|
3971 PRINT "-"*33
|
|
3972 RETURN
|
|
3980 REM library computer code
|
|
3990 CM1$="GALSTATORBASDIRREG"
|
|
4000 IF D(8)>=0 THEN 4010
|
|
4001 PRINT"Computer Disabled":GOTO 1520
|
|
4010 rem KEY 1, "GAL RCD"+CHR$(13)
|
|
4020 rem KEY 2, "STATUS"+CHR$(13)
|
|
4030 rem KEY 3, "TOR DATA"+CHR$(13)
|
|
4040 rem KEY 4, "BASE NAV"+CHR$(13)
|
|
4050 rem KEY 5, "DIR/DIST"+CHR$(13)
|
|
4060 rem KEY 6, "REG MAP"+CHR$(13)
|
|
4070 rem KEY 7,CHR$(13):KEY 8,CHR$(13):KEY 9,CHR$(13):KEY 10,CHR$(13)
|
|
4071 gosub 4130
|
|
4080 INPUT"Computer active and awaiting command ";CM$:H8=1
|
|
4090 FOR K1= 1 TO 6
|
|
4100 IF MID$(CM$,1,3)<>MID$(CM1$,3*K1-2,3) THEN 4120
|
|
4110 ON K1 GOTO 4250,4400,4490,4750,4550,4210
|
|
4120 NEXT K1
|
|
4121 gosub 4130
|
|
4122 goto 4080
|
|
4130 PRINT"Functions available from library-computer:"
|
|
4140 PRINT" GAL = Cumulative galactic record"
|
|
4150 PRINT" STA = Status report"
|
|
4160 PRINT" TOR = Photon torpedo data"
|
|
4170 PRINT" BAS = Starbase nav data"
|
|
4180 PRINT" DIR = Direction/distance calculator"
|
|
4190 PRINT" REG = Galaxy 'region name' map":PRINT
|
|
4191 return
|
|
4200 REM setup to change cum gal record to galaxy map
|
|
4210 H8=0:G5=1:PRINT" the galaxy":GOTO 4290
|
|
4250 PRINT:PRINT" ";
|
|
4270 PRINT "Computer record of galaxy for quadrant ";Q1;",";Q2
|
|
4280 PRINT
|
|
4290 PRINT" 1 2 3 4 5 6 7 8"
|
|
4300 O1$=" ----- ----- ----- ----- ----- ----- ----- -----"
|
|
4310 PRINT O1$
|
|
4311 FOR I=1 TO 8
|
|
4312 PRINT I;" ";:IF H8=0 THEN 4350
|
|
4320 FOR J=1 TO 8
|
|
4321 PRINT" ";:IF Z(I,J)<>0 THEN 4330
|
|
4322 PRINT"***";:GOTO 4340
|
|
4330 ZLEN = len(str$(z(i,j)+1000)
|
|
4331 PRINT MID$(STR$(Z(I,J)+1000),zlen-2,3);
|
|
4340 NEXT J
|
|
4341 GOTO 4370
|
|
4350 Z4=I:Z5=1
|
|
4351 GOSUB 5040
|
|
4352 J0=INT(15-0.5*LEN(G2$)):PRINT TAB(J0);G2$;
|
|
4360 Z5=5
|
|
4361 GOSUB 5040
|
|
4362 J0=INT(40-0.5*LEN(G2$)):PRINT TAB(J0);G2$;
|
|
4370 PRINT:PRINT O1$
|
|
4371 NEXT I
|
|
4372 PRINT
|
|
4373 rem 'POKE 1229,0 POKE 1237,1
|
|
4380 GOTO 1520
|
|
4390 REM status report
|
|
4400 PRINT" Status Report":X$="":IF K9<=1 THEN 4410
|
|
4402 X$="s"
|
|
4410 PRINT"Klingon";X$;" left: ";K9
|
|
4420 PRINT"Mission must be completed in ";0.1*INT((T0+T9-T)*10);" stardates"
|
|
4430 X$="s":IF B9>=2 THEN 4440
|
|
4431 X$="":IF B9<1 THEN 4460
|
|
4440 PRINT"The federation is maintaining ";B9;" starbase";X$;" in the galaxy"
|
|
4450 GOTO 3180
|
|
4460 PRINT"Your stupidity has left you on your own in"
|
|
4470 PRINT" the galaxy -- you have no starbases left!":GOTO 3180
|
|
4480 REM torpedo, base nav, d/d calculator
|
|
4490 IF K3<=0 THEN 2550
|
|
4500 X$="":IF K3<=1 THEN 4510
|
|
4501 X$="s"
|
|
4510 PRINT"From ENTERPRISE to Klingon battle cruiser";X$
|
|
4520 H8=0:FOR I=1 TO 3
|
|
4521 IF K(I,3)<=0 THEN 4740
|
|
4530 W1=K(I,1):X=K(I,2)
|
|
4540 C1=S1:A=S2:GOTO 4590
|
|
4550 PRINT"Direction/Distance Calculator:"
|
|
4560 PRINT"You are at quadrant ";Q1;",";Q2;" sector ";S1;",";S2
|
|
4570 PRINT"Please enter ":INPUT" initial coordinates (x,y) ";C1,A
|
|
4580 INPUT" Final coordinates (x,y) ";W1,X
|
|
4590 X=X-A:A=C1-W1:aa=abs(a):ax=abs(x):IF X<0 THEN 4670
|
|
4600 IF A<0 THEN 4690
|
|
4610 IF X>0 THEN 4630
|
|
4620 IF A<>0 THEN 4630
|
|
4621 C1=5:GOTO 4640
|
|
4630 C1=1
|
|
4640 IF AA<=AX THEN 4660
|
|
4650 PRINT"Direction1 = ";:cc1=(AA-AX+AA)/AA:PRINT c1+cc1:GOTO 4730
|
|
4660 PRINT"Direction2 = ";:cc1=C1+(AA/AX):PRINT cc1:GOTO 4730
|
|
4670 IF A<=0 THEN 4680
|
|
4671 C1=3:GOTO 4700
|
|
4680 IF X=0 THEN 4690
|
|
4681 C1=5:GOTO 4640
|
|
4690 C1=7
|
|
4700 IF AA>=AX THEN 4720
|
|
4710 PRINT"Direction3 = ";:cc1=(AX-AA+AX)/AX:PRINT c1+cc1:GOTO 4730
|
|
4720 PRINT"Direction4 = ";:CC1=C1+(AX/AA):PRINT CC1
|
|
4730 PRINT"Distance = ";:cc1=SQR(x*X+A*A):PRINT cc1:IF H8=1 THEN 1520
|
|
4740 NEXT I
|
|
4741 GOTO 1520
|
|
4750 IF B3=0 THEN 4770
|
|
4752 PRINT"From ENTERPRISE to Starbase:":W1=B4:X=B5
|
|
4760 GOTO 4540
|
|
4770 PRINT"Mr. Spock reports, 'Sensors show no starbases in this";
|
|
4780 PRINT"quadrant.'":GOTO 1520
|
|
4790 REM find empty place in quadrant (for things)
|
|
4800 R1=INT(RND(1)*7.98+1.01):R2=INT(RND(1)*7.98+1.01):A$=" ":Z1=R1:Z2=R2
|
|
4801 GOSUB 4990
|
|
4802 IF Z3=0 THEN 4800
|
|
4810 RETURN
|
|
4820 REM insert in string array for quadrant
|
|
4830 S8=INT(Z2-0.5)*3+INT(Z1-0.5)*24+1
|
|
4840 IF LEN(A$)=3 THEN 4850
|
|
4841 PRINT"ERROR":STOP
|
|
4850 IF S8<>1 THEN 4860
|
|
4851 Q$=A$+MID$(Q$,4,189):RETURN
|
|
4860 IF S8<>190 THEN 4870
|
|
4861 Q$=MID$(Q$,1,189)+A$:RETURN
|
|
4870 Q$=MID$(Q$,1,S8-1)+A$+MID$(Q$,s8+3,192-s8-2):RETURN
|
|
4880 REM prints device name
|
|
4890 ON R1 GOTO 4900,4910,4920,4930,4940,4950,4960,4970
|
|
4900 G2$="Warp Engines":RETURN
|
|
4910 G2$="Short Range Sensors":RETURN
|
|
4920 G2$="Long Range Sensors":RETURN
|
|
4930 G2$="Phaser Control":RETURN
|
|
4940 G2$="Photon Tubes":RETURN
|
|
4950 G2$="Damage Control":RETURN
|
|
4960 G2$="Shield Control":RETURN
|
|
4970 G2$="Library-Computer":RETURN
|
|
4980 REM string comparison in quadrant array
|
|
4990 Z1=INT(Z1+0.5):Z2=INT(Z2+0.5):S8=(Z2-1)*3+(Z1-1)*24:Z3=0
|
|
5000 IF MID$(Q$,S8+1,3)=A$ THEN 5010
|
|
5001 RETURN
|
|
5010 Z3=1:RETURN
|
|
5020 REM quadrant name in g2$ from z4,z5 (=q1,q2)
|
|
5030 REM call with g5=1 to get region name only
|
|
5040 IF Z5<=4 THEN 5140
|
|
5041 ON Z4 GOTO 5060,5070,5080,5090,5100,5110,5120,5130
|
|
5050 GOTO 5140
|
|
5060 G2$="Antares":GOTO 5230
|
|
5070 G2$="Rigel":GOTO 5230
|
|
5080 G2$="Procyon":GOTO 5230
|
|
5090 G2$="Vega":GOTO 5230
|
|
5100 G2$="Canopus":GOTO 5230
|
|
5110 G2$="Altair":GOTO 5230
|
|
5120 G2$="Sagittarius":GOTO 5230
|
|
5130 G2$="Pollux":GOTO 5230
|
|
5140 ON Z4 GOTO 5150,5160,5170,5180,5180,5200,5210,5220
|
|
5150 G2$="Sirius":GOTO 5230
|
|
5160 G2$="Deneb":GOTO 5230
|
|
5170 G2$="Capella":GOTO 5230
|
|
5180 G2$="Betelgeuse":GOTO 5230
|
|
5190 G2$="Aldebaran":GOTO 5230
|
|
5200 G2$="Regulus":GOTO 5230
|
|
5210 G2$="Arcturus":GOTO 5230
|
|
5220 G2$="Spica"
|
|
5230 IF G5=1 THEN 5240
|
|
5231 ON Z5 GOTO 5250,5260,5270,5280,5250,5260,5270,5280
|
|
5240 RETURN
|
|
5250 G2$=G2$+" i":RETURN
|
|
5260 G2$=G2$+" ii":RETURN
|
|
5270 G2$=G2$+" iii":RETURN
|
|
5280 G2$=G2$+" iv":RETURN
|
|
5290 rem red alert sound
|
|
5291 return
|
|
5300 FOR J= 1 TO 4
|
|
5310 FOR K=1000 TO 2000 STEP 20
|
|
5320 rem SOUND K,0.01*18.2
|
|
5330 NEXT K
|
|
5340 NEXT J
|
|
5350 RETURN
|
|
5360 rem torpedo sound
|
|
5361 return
|
|
5370 FOR J = 1500 TO 100 STEP -20
|
|
5380 rem SOUND J,0.01*18.2
|
|
5390 rem SOUND 3600-J,.01*18.2
|
|
5400 NEXT J
|
|
5410 RETURN
|
|
5420 rem phaser sound
|
|
5421 return
|
|
5430 FOR J= 1 TO 40
|
|
5440 rem SOUND 800,.01*18.2
|
|
5450 rem SOUND 2500,.008*18.2
|
|
5460 NEXT J
|
|
5470 RETURN
|
|
5480 rem alarm sound
|
|
5481 return
|
|
5490 FOR SI = 1 TO 3
|
|
5500 FOR J= 800 TO 1500 STEP 20
|
|
5510 rem SOUND J,.01 *18.2
|
|
5520 NEXT J
|
|
5530 FOR K = 1500 TO 800 STEP -20
|
|
5540 rem SOUND K, .01 *18.2
|
|
5550 NEXT K
|
|
5560 NEXT SI
|
|
5570 RETURN
|