00001 REM Source: Robert C. Leedom and David H. Ahl. "Super Star Trek".
00002 REM         The Best of Creative Computing Volume I (published 1976).
00003 REM         AtariArchives.org. <http://www.atariarchives.org/bcc1/>
00004 REM         accessed 2012/1/15.
00005 REM Ported to DEC BASIC-10 by David Meyer <[email protected]>.
00009 REM (Version "STREKX", 1/17/12 jdm)
00010 REM (VERSION "STREK7", 1/12/75 RCL)
00020 REM
00030 REM
00040 REM ***  *** STAR TREK *** ***
00050 REM *** SIMULATION OF A MISSION OF THE STARSHIP ENTERPRISE.
00060 REM *** AS SEEN ON THE STAR TREK TV SHOW.
00070 REM *** ORIGINAL PROGRAM BY MIKE MAYFIELD, MODIFIED VERSION
00080 REM *** PUBLISHED IN DEC'S "101 BASIC GAMES", BY DAVE AHL.
00090 REM *** MODIFICATIONS TO THE LATTER (PLUS DEBUGGING) BY
00100 REM *** BOB LEEDOM -- APRIL & DECEMBER 1974,
00110 REM *** WITH A LITTLE HELP FROM HIS FRIENDS . . .
00120 REM *** COMMENTS, EPITHETS, AND SUGGESTIONS SOLICITED --
00130 REM *** ADDRESS TO: R.C.LEEDOM
00140 REM *** WESTINGHOUSE DEFENSE & ELECTRONIC SYSTEMS CNTR.
00150 REM *** BOX 745, M.S. 338 BALTIMORE, MD 21203
00160 RANDOMIZE
00170 PRINT TAB(15); "* * * STAR TREK * * *"
00180 PRINT
00190 PRINT " DO YOU NEED INSTRUCTIONS (YES/NO)";
00200 DIM A$(20)
00210 INPUT A$
00220 IF A$<>"YES" THEN GOTO 0240
00230 CHAIN "STINSTX"
00240 REM PROGRAM BEGINS HERE . . . . .
00250 DIM Z$(72),Q$(72),R$(72),S$(72)
00260 DIM G1$(150),G2$(16),G3$(3),G4$(3)
00270 FOR I=1 TO 72
00280 LET Z$(I,1)=" "
00290 LET Q$(I,1)=" "
00300 LET R$(I,1)=" "
00310 LET S$(I,1)=" "
00320 NEXT I
00330 DIM O(8,8),C(9,2),K(3,3),N(3),Z(8,8)
00340 DIM O1$(40),C$(10)
00350 DIM A1$(20),T$(6)
00360 DIM D$(96),O3$(60)
00370 LET T=INT(RND+20+20)*100
00380 LET T0=T
00390 LET T9=30
00400 LET D0=0
00410 LET E0=3000
00420 LET E=E0
00430 LET P=10
00440 LET P0=P
00450 LET S9=200
00460 LET S=0
00470 DEF FND(D)=SQR((K(I,1)-S1)^2+(K(I,2)-S2)^2)
00480 REM INITIALIZE ENTERPRISE'S POSITION
00490 LET Q1=INT(RND*8+1)
00500 LET Q2=INT(RND*8+1)
00510 LET S1=INT(RND*8+1)
00520 LET S2=INT(RND*8+1)
00530 MAT C=ZER
00540 LET C(3,1)=-1
00550 LET C(2,1)=-1
00560 LET C(4,1)=-1
00570 LET C(4,2)=-1
00580 LET C(5,2)=-1
00590 LET C(6,2)=-1
00600 LET C(1,2)=1
00610 LET C(2,2)=1
00620 LET C(6,1)=1
00630 LET C(7,1)=1
00640 LET C(8,1)=1
00650 LET C(8,2)=1
00660 LET C(9,2)=1
00670 DIM D(8)
00680 FOR I=1 TO 8
00690 LET D(1)=0
00700 NEXT I
00710 LET A1$="NSLPTSDCX"
00720 LET D$="WARP ENGINESS R. SENSORSL T SENSORSPHASER CNTRL"
00730 LET D$=D$+"PHOTON TUBESDAMAGE CNTRLSHIELD CNTRLCOMPUTER"
00740 LET G4$="III"
00750 LET G1$="ANTARES. SIRIUS.RIGEL.DENEB.PROCYON.CAPELLA.VEGA."
00760 LET G1$=G1$, "BETELGEUSE.CANOPUS.ALDEBARAN.ALTAIR.REGULUS."
00770 LET G1$=G1$,"SAGITTARIUS.ARCTURUS.POLLUX.SPICA."
00780 LET B9=0
00790 LET K9=0
00800 LET A1$="NSLPTSDCX"
00810 REM SET UP WHAT EXISTS IN GALAXY ...
00820 FOR I=1 TO 8
00830 FOR J=1 TO 8
00840 LET R1=RND
00850 IF R1>. 98 THEN GOTO 0900
00860 IF R1>. 95 THEN GOTO 0930
00870 IF R1>. 8 THEN GOTO 0960
00880 LET K3=0
00890 GOTO 0980
00900 LET K3=3
00910 LET K9=K9+3
00920 GOTO 0980
00930 LET K3=2
00940 LET K9=K9+2
00950 GOTO 0980
00960 LET K3=1
00970 LET K9=K9+1
00980 LET R1=RND
00990 OF R1>. 96 THEN GOTO 1020
01000 LET B3=0
01010 GOTO 1040
01020 LET B3=1
01030 LET B9=B9+1
01040 LET S3=INT(RND*8+1)
01050 LET G(I,J)=K3*100+B3*10+S3
01060 REM K3=#KLINGONS B3=#STARBASES S3=#STARS
01070 LET Z(I,J)=0
01080 NEXT J
01090 NEXT I
01100 LET K7=K9
01110 DIM X$(2),X0$(5)
01120 LET X$=""
01130 LET X0$=" IS"
01140 IF B9<>0 THEN GOTO 1200
01150 LET B9=1
01160 IF G(6,3)>200 THEN GOTO 1190
01170 LET G(6,3)=G(6,3)+100
01180 LET K9=K9+1
01190 LET G(6,3)=G(6,3)+10
01200 IF B9=1 THEN GOTO 1230
01210 LET X$="S"
01220 LET X0$="ARE"
01230 PRINT "YOUR ORDERS ARE AS FOLLOWS:"
01240 PRINT " DESTROY THE "K9" KLINGON WARSHIPS WHICH HAVE INVADED"
01250 PRINT " THE GALAXY BEFORE THEY CAN ATTACK FEDERATION HEADQUARTERS"
01260 PRINT " ON STARDATE"T0+T9"; THIS GIVES YOU"T9" DAYS. THERE"X0$
01270 PRINT " "B9" STARBASE";X$" IN THE GALAXY FOR RESUPPLYING YOUR SHIP."
01280 PRINT
01290 PRINT "HIT 'RETURN' WHEN READY TO ASSUME COMMAND ---"
01300 INPUT AB
01310 REM HERE ANY TIME NEW QUADRANT ENTERED
01320 Z4=Q1
01330 Z5=Q2
01340 K3=0
01350 B3=0
01360 S3=0
01370 G5=0
01380 D4=.5*RND
01390 IF Q1<1 THEN GOTO 1600
01400 IF Q1>8 THEN GOTO 1600
01410 Q2<1 THEN GOTO 1600
01420 Q2>8 THEN GOTO 1600
01430 GOSUB 9030
01440 PRINT
01450 IF T<>T0 THEN 1490
01460 PRINT"YOUR MISSION BEGINS WITH YOUR STARSHIP LOCATED"
01470 PRINT"IN THE GALACTIC QUADRANT, '";G2$;"'."
01480 GOTO 1500
01490 PRINT"NOW ENTERING ";G2$;" QUADRANT . . ."
01500 PRINT
01510 X=G(Q1,Q2)*.01
01520 K3=INT(X)
01530 B3=INT((X-K3)*10)
01540 S3=G(Q1,Q2)-INT(G(Q1,Q20*.1)*10
01550 IF K3=0 THEN GOTO 1590
01560 PRINT "COMBAT AREA      CONDITION RED"
01570 IF S>200 THEN GOTO 1590
01580 PRINT "   SHIELDS DANGEROUSLY LOW"
01590 MAT K=2ER
01600 FOR I=1 TO 3
01610   LET R(I,J)=0
01620 NEXT I
01630 LET Q$=Z$
01640 LET Q$=Z$
01650 LET Q$=Z$(1,40)
01660 REM POSITION ENTERPRISE IN QUADRANT, THEN PLACE "K3" KLINGONS,
01670 REM "B3" STARBASES, & "S3" STARS ELSEWHERE.
01680 A$="<*>"
01690 Z1=S1
01700 Z2=S2
01710 GOSUB 8670
01720 FOR I=1 TO K3
01730   GOSUB 8590
01740   LET A$="+K+"
01750   LET Z1=R1
01760   LET Z2=R2
01770   GOSUB 8670
01780   LET K(I,1)=R1
01790   LET K(I,2)=R2
01800   LET K(I,3)=S9
01810 NEXT I
01820 FOR I=1 TO S3
01830   GOSUB 8590
01840   LET A$=">!<"
01850   LET Z1=R1
01860   LET B4=R1
01870   GOSUB 8670
01880   LET Z2=R2
01890   LET B5=R2
01900 NEXT I
01910 FOR I=1 TO S3
01920   GOSUB 8590
01930   LET A$=" * "
01940   LET Z1=R1
01950   LET Z2=R2
01960   GOSUB 8670
01970   NEXT I
01980 GOSUB 6430
01990 IF S+E>10 THEN GOTO 2020
02000 IF E>10 THEN GOTO 2060
02010 IF D(7)=0 THENGOTO 2060
02020 PRINT "** FATAL ERROR **   YOU'VE JUST STRANDED YOUR SHIP IN SPACE!!"
02030 PRINT "YOU HAVE INSUFFICIENT MANEUVERING ENERGY, AND SHIELD CONTROL,"
02040 PRINT "IS PRESENTLY INCAPABLE OF CROSS-CIRCUITING TO ENGINE ROOM!!"
02050 GOTO 6220
02060 PRINT "COMMAND"
02070 INPUT A$
02080 FOR I=1 TO 9
02090 IF A$(1,10)<>AL$(1,1) THEN GOTO 2160
02100 IF I<>2 THEN GOTO 2140
02110 IF LON<A$><2 THEN GOTO 2140
02120 IF A$(2,2)="R" THEN GOTO 2140
02130 LET I-6
02140 ON I THEN GOTO 2300,1980,4000,4260,4700,5530,5690,7290
02150 IF A$="XXX" THEN GOTO 6270
02160 NEXT I
02170 PRINT "ENTER ONE OF THE FOLLOWING:"
02180 PRINT"  NAV  (TO SET COURSE)"
02190 PRINT"  SRS  (FOR SHORT RANGE SENSOR SCAN)"
02200 PRINT"  LRS  (FOR LONG RANGE SENSOR SCAN)"
02210 PRINT"  PHA  (TO FIRE PHASERS)"
02220 PRINT"  TOR  (TO FIRE PHOTON TORPEDOES)"
02230 PRINT"  SHE  (TO RAISE OR LOWER SHIELDS)"
02240 PRINT"  DAM  (FOR DAMAGE CONTROL REPORTS)"
02250 PRINT"  COM  (TO CALL ON LIBRARY-COMPUTER)"
02260 PRINT"  XXX  (TO RESIGN YOUR COMMAND)"
02270 PRINT
02280 GOTO 1990
02290 REM COURSE CONTROL BEGINS HERE
02300 PRINT "COURSE (0-9)";
02310 INPUT C1
02320 IF C1>=1 THEN GOTO 2350
02330 PRINT"   LT. SULU REPORTS, 'INCORRECT COURSE DATA, SIR!'"
02340 IF W1>0 THEN GOTO 2420
02350 IF C1<9 THEN GOTO 2380
02360 IF C1>9 THEN GOTO 2330
02370 LET C1=1
02380 PRINT "WARP FACTOR (0-0)",
02390 INPUT W1
02410 IF W1<=8 THENGOTO 2450
02420 PRINT "   CHIEF ENGINEER SCOTT REPORTS 'THE ENGINES WON'T TAKE";
02430 PRINT " WARP ";W1;"!'"
02440 GOTO 1990
02450 IF D(1)>=0 THEN GOTO 2490
02460 IF W1<=.2 THEN 2490
02470 PRINT "WARP ENGINES ARE DAMAGED.  MAXIUM SPEED = WARP 0.2"
02480 GOTO 2300
02490 LET N=INT(W1*8+.5)
02500 IF E-N>=0 THEN GOTO 2590
02510 PRINT"ENGINEERING REPORTS   'INSUFFICIENT ENERGY AVAILABLE"
02520 PRINT"                       FOR MANEUVERING AT WARP";W1;"!'"
02530 IF S<N-E THEN GOTO 1990
02540 D(7)<0 THEN GOTO 1990
02550 PRINT "DEFLECTOR CONTROL ROOM ACKNOWLEDGES";S;"UNITS OF ENERGY"
02560 PRINT "                         PRESENTLY DEPLOYED TO SHIELDS."
02570 GOTO 5530
02580 REM KLINGONS MOVE/FIRE ON MOVING STARSHIP . . .
02590 FOR I=1 TO K3
02600   IF K(I,3)=0 THEN GOTO 2700
02610   LET A$="   "
02620   LET Z1=K(I,1)
02630   LET Z2=K(I,2)
02640   GOSUB 8670
02650   GOSUB8590
02660   LET K(I,1)=Z1
02670   LET K(I,2)=Z2
02680   LET A$="+K+"
02690   GOSUB 8670
02700 NEXT I
02710 GOSUB 6000
02720 LET D1=0
02730 LET D6=W1
02740 IF W1>=1 THEN GOTO 2770
02750 LET D6=1
02760 REM MAKE REPAIRS TO SHIP
02770 FOR I=1 TO 8
02780   IF D(I)>=0 THEN GOTO 2880
02790   LET D(I)=D(I)+D6
02800   IF D(I)<0 THEN GOTO 2880
02810   IF D1=1 THEN GOTO 2840
02820   LET D1=1
02830   PRINT"DAMAGE CONTROL REPORT:  ";
02840 PRINT TAB(8);
02850 R1=I
02860 GOSUB 8790
02870 PRINT " REPAIR COMPLETED."
02880 NEXT I
02890 REM DAMAGE/IMPROVEMENT DURING SOME YES
02900 IF RND>.2 THEN GOTO 3070
02910 LET R1=INT(RND+0=1)
02920 IF RND>=.6 THEN GOTO 3000
02930 LET D(R1)=D(R1)-(RND*5+1)
02940 PRINT
02950 PRINT "DAMAGE CONTROL REPORT:  ";
02960 GOSUB 8790
02970 PRINT " DAMAGED"
02980 PRINT
02990 GOTO 3070
03000 LET D(R1)=D(R1)+RND*3+1
03010 PRINT
03020 PRINT "DAMAGE CONTROL REPORT:  ";
03030 GOSUB 8790
03040 PRINT " STATE OF REPAIR IMPROVED"
03050 PRINT
03060 REM BEGIN MOVING STARSHIP
03070 LET A$="   "
03080 LET Z1=INT(S1)
03090 LET Z2=INT(S2)
03100 GOSUB 8670
03110 X1=C(C1,1)+(C(C1+1,1)-C(C1,1))*(C1-INT(C1))
03120 X=S1
03130 Y=S2
03140 X2=C(C1,2)+(C(C1+1,2)-C(C1,2))*(C1-INT(C1))
03150 Q4=Q1
03160 Q5=Q2
03170 FOR I=1 TO N
03180   LET S1=S1+X1
03190   LET S2=S2+X2
03200   IF S1<1 THEN GOTO 3500
03210   IF S1>=9 THEN GOTO 3500
03220   IF S2<1 THEN GOTO 3500
03230   IF S2>=9 THEN GOTO 3500
03240   LET S8=INT(S1)*24+INT(S2)*3-26
03250   IF S8>2 THEN GOTO 3200
03260   IF Q$(S0,S8+2)="   " THEN GOTO 3360
03270   GOTO 3320
03280   IF S$>144 THEN GOTO 3310
03290   IF R$(S0-72,S0-70)="   " THEN GOTO 3360
03300   GOTO 3320
03310   IF S$(S0-144,S0-142)="   " THEN GOTO 3360
03320   LET S1=S1-X1
03330   LET S2=S2-X2
03340   PRINT "WARP ENGINES SHUT DOWN AT SECTOR";S1;",";S2;"DUE TO BAD