-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstartrek.bas
More file actions
820 lines (820 loc) · 26 KB
/
Copy pathstartrek.bas
File metadata and controls
820 lines (820 loc) · 26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
REM SUPER STARTREK - MAY 16, 1978 - REQUIRES 24K MEMORY @category Games
REM **** STAR TREK ****
REM **** SIMULATION OF A MISSION OF THE STARSHIP ENTERPRISE,
REM **** AS SEEN ON THE STAR TREK TV SHOW.
REM **** ORIGINAL PROGRAM BY MIKE MAYFIELD, MODIFIED VERSION
REM **** PUBLISHED IN DEC'S "101 BASIC GAMES", BY DAVE AHL.
REM **** MODIFICATIONS BY BOB LEEDOM - APR & DEC 1974.
REM **** CONVERTED TO MICROSOFT 8K BASIC 3/16/78 BY JOHN GORDERS.
REM **** PORTED TO FULL BASIC (ISO/IEC 10279) - 2026.
REM
REM Notes on this port:
REM - Line numbers preserved as labels exactly where the original used them.
REM - "ON i GOTO L1,L2,..." used directly (ELSE handles the out-of-range
REM computer-menu fall-through).
REM - "IF cond THEN <line>" is supported, but the explicit "THEN GOTO <line>"
REM form is retained here for readability.
REM - Inline FOR loops split across lines (parser requires newline after FOR).
REM
OPTION BASE 1
RANDOMIZE
REM Pre-declare names whose first lexical reference is a read inside a
REM subroutine target or DEF FN body. Without these the analyzer warns
REM FB0308 (implicit declaration); behaviour is unchanged either way.
LET G2$ = ""
LET I = 0
LET S1 = 0
LET S2 = 0
LET R2 = 0
LET Z3 = 0
10 PRINT
PRINT
PRINT
PRINT
PRINT
PRINT
PRINT
PRINT
PRINT
PRINT
220 PRINT " ,------*------,"
221 PRINT " ,------------- '--- ------'"
222 PRINT " '-------- --' / /"
223 PRINT " ,---' '-------/ /--,"
224 PRINT " '----------------'"
225 PRINT
226 PRINT " THE USS ENTERPRISE --- NCC-1701"
227 PRINT
PRINT
PRINT
PRINT
PRINT
270 LET Z$=" "
330 DIM G(8,8), C(9,2), K(3,3), NB(3), Z(8,8), D(8)
370 LET T = INT(RND(1)*20+20)*100
LET T0 = T
LET T9 = 25 + INT(RND(1)*10)
LET D0 = 0
LET E = 3000
LET E0 = E
440 LET P = 10
LET P0 = P
LET S9 = 200
LET S = 0
LET B9 = 2
LET K9 = 0
LET X$ = ""
LET X0$ = " IS "
470 DEF FND(D) = SQR((K(I,1)-S1)^2 + (K(I,2)-S2)^2)
475 DEF FNR(R) = INT(RND(R)*7.98 + 1.01)
480 REM INITIALIZE ENTERPRISE'S POSITION
490 LET Q1 = FNR(1)
LET Q2 = FNR(1)
LET S1 = FNR(1)
LET S2 = FNR(1)
530 FOR I = 1 TO 9
LET C(I,1) = 0
LET C(I,2) = 0
NEXT I
540 LET C(3,1) = -1
LET C(2,1) = -1
LET C(4,1) = -1
LET C(4,2) = -1
LET C(5,2) = -1
LET C(6,2) = -1
600 LET C(1,2) = 1
LET C(2,2) = 1
LET C(6,1) = 1
LET C(7,1) = 1
LET C(8,1) = 1
LET C(8,2) = 1
LET C(9,2) = 1
670 FOR I = 1 TO 8
LET D(I) = 0
NEXT I
710 LET A1$ = "NAVSRSLRSPHATORSHEDAMCOMXXX"
810 REM SETUP WHAT EXISTS IN GALAXY . . .
815 REM K3 = # KLINGONS, B3 = # STARBASES, S3 = # STARS
820 FOR I = 1 TO 8
FOR J = 1 TO 8
LET K3 = 0
LET Z(I,J) = 0
LET R1 = RND(1)
850 IF R1 > 0.98 THEN LET K3 = 3 : LET K9 = K9 + 3 : GOTO 980
860 IF R1 > 0.95 THEN LET K3 = 2 : LET K9 = K9 + 2 : GOTO 980
870 IF R1 > 0.80 THEN LET K3 = 1 : LET K9 = K9 + 1
980 LET B3 = 0
IF RND(1) > 0.96 THEN LET B3 = 1 : LET B9 = B9 + 1
1040 LET G(I,J) = K3*100 + B3*10 + FNR(1)
NEXT J
NEXT I
IF K9 > T9 THEN LET T9 = K9 + 1
1100 IF B9 <> 0 THEN GOTO 1200
1150 IF G(Q1,Q2) < 200 THEN LET G(Q1,Q2) = G(Q1,Q2) + 120 : LET K9 = K9 + 1
1160 LET B9 = 1
LET G(Q1,Q2) = G(Q1,Q2) + 10
LET Q1 = FNR(1)
LET Q2 = FNR(1)
1200 LET K7 = K9
IF B9 <> 1 THEN LET X$ = "S" : LET X0$ = " ARE "
1230 PRINT "YOUR ORDERS ARE AS FOLLOWS:"
1240 PRINT " DESTROY THE"; K9; "KLINGON WARSHIPS WHICH HAVE INVADED"
1252 PRINT " THE GALAXY BEFORE THEY CAN ATTACK FEDERATION HEADQUARTERS"
1260 PRINT " ON STARDATE"; T0+T9; " THIS GIVES YOU"; T9; "DAYS. THERE"; X0$;
1272 PRINT " "; B9; "STARBASE"; X$; " IN THE GALAXY FOR RESUPPLYING YOUR SHIP"
1280 PRINT
1300 LET I = RND(1)
1310 REM HERE ANY TIME NEW QUADRANT ENTERED
1320 LET Z4 = Q1
LET Z5 = Q2
LET K3 = 0
LET B3 = 0
LET S3 = 0
LET G5 = 0
LET D4 = 0.5 * RND(1)
LET Z(Q1,Q2) = G(Q1,Q2)
1390 IF Q1 < 1 OR Q1 > 8 OR Q2 < 1 OR Q2 > 8 THEN GOTO 1600
1430 GOSUB 9030
PRINT
IF T0 <> T THEN GOTO 1490
1460 PRINT "YOUR MISSION BEGINS WITH YOUR STARSHIP LOCATED"
1470 PRINT "IN THE GALACTIC QUADRANT, '"; G2$; "'."
GOTO 1500
1490 PRINT "NOW ENTERING "; G2$; " QUADRANT . . ."
1500 PRINT
LET K3 = INT(G(Q1,Q2) * 0.01)
LET B3 = INT(G(Q1,Q2) * 0.1) - 10*K3
1540 LET S3 = G(Q1,Q2) - 100*K3 - 10*B3
IF K3 = 0 THEN GOTO 1590
1560 PRINT "COMBAT AREA CONDITION RED"
IF S > 200 THEN GOTO 1590
1580 PRINT " SHIELDS DANGEROUSLY LOW"
1590 FOR I = 1 TO 3
LET K(I,1) = 0
LET K(I,2) = 0
NEXT I
1600 FOR I = 1 TO 3
LET K(I,3) = 0
NEXT I
LET Q$ = Z$ & Z$ & Z$ & Z$ & Z$ & Z$ & Z$ & LEFT$(Z$, 17)
1660 REM POSITION ENTERPRISE, THEN PLACE "K3" KLINGONS, "B3" BASES, "S3" STARS.
1680 LET A$ = "<*>"
LET Z1 = S1
LET Z2 = S2
GOSUB 8670
IF K3 < 1 THEN GOTO 1820
1720 FOR I = 1 TO K3
GOSUB 8590
LET A$ = "+K+"
LET Z1 = R1
LET Z2 = R2
GOSUB 8670
LET K(I,1) = R1
LET K(I,2) = R2
LET K(I,3) = S9 * (0.5 + RND(1))
NEXT I
1820 IF B3 < 1 THEN GOTO 1910
1880 GOSUB 8590
LET A$ = ">!<"
LET Z1 = R1
LET B4 = R1
LET Z2 = R2
LET B5 = R2
GOSUB 8670
1910 FOR I = 1 TO S3
GOSUB 8590
LET A$ = " * "
LET Z1 = R1
LET Z2 = R2
GOSUB 8670
NEXT I
1980 GOSUB 6430
1990 IF S + E > 10 THEN IF E > 10 OR D(7) = 0 THEN GOTO 2060
2020 PRINT
PRINT "** FATAL ERROR ** YOU'VE JUST STRANDED YOUR SHIP IN "
2030 PRINT "SPACE"
PRINT "YOU HAVE INSUFFICIENT MANEUVERING ENERGY,";
2040 PRINT " AND SHIELD CONTROL"
PRINT "IS PRESENTLY INCAPABLE OF CROSS";
2050 PRINT "-CIRCUITING TO ENGINE ROOM!!"
GOTO 6220
2060 INPUT "COMMAND"; A$
2080 FOR I = 1 TO 9
IF LEFT$(A$, 3) <> MID$(A1$, 3*I-2, 3) THEN GOTO 2155
ON I GOTO 2300, 1980, 4000, 4260, 4700, 5530, 5690, 7290, 6270
2155 REM continue command-dispatch loop
NEXT I
2160 PRINT "ENTER ONE OF THE FOLLOWING:"
2180 PRINT " NAV (TO SET COURSE)"
2190 PRINT " SRS (FOR SHORT RANGE SENSOR SCAN)"
2200 PRINT " LRS (FOR LONG RANGE SENSOR SCAN)"
2210 PRINT " PHA (TO FIRE PHASERS)"
2220 PRINT " TOR (TO FIRE PHOTON TORPEDOES)"
2230 PRINT " SHE (TO RAISE OR LOWER SHIELDS)"
2240 PRINT " DAM (FOR DAMAGE CONTROL REPORTS)"
2250 PRINT " COM (TO CALL ON LIBRARY-COMPUTER)"
2260 PRINT " XXX (TO RESIGN YOUR COMMAND)"
PRINT
GOTO 1990
2290 REM COURSE CONTROL BEGINS HERE
2300 INPUT "COURSE (0-9)"; C1
IF C1 = 9 THEN LET C1 = 1
2310 IF C1 >= 1 AND C1 < 9 THEN GOTO 2350
2330 PRINT " LT. SULU REPORTS, 'INCORRECT COURSE DATA, SIR!'"
GOTO 1990
2350 LET X$ = "8"
IF D(1) < 0 THEN LET X$ = "0.2"
2360 PRINT "WARP FACTOR (0-"; X$; ")";
INPUT W1
IF D(1) < 0 AND W1 > 0.2 THEN GOTO 2470
2380 IF W1 > 0 AND W1 <= 8 THEN GOTO 2490
2390 IF W1 = 0 THEN GOTO 1990
2420 PRINT " CHIEF ENGINEER SCOTT REPORTS 'THE ENGINES WON'T TAKE";
2430 PRINT " WARP "; W1; "!'"
GOTO 1990
2470 PRINT "WARP ENGINES ARE DAMAGED. MAXIMUM SPEED = WARP 0.2"
GOTO 1990
2490 LET N = INT(W1*8 + 0.5)
IF E - N >= 0 THEN GOTO 2590
2500 PRINT "ENGINEERING REPORTS 'INSUFFICIENT ENERGY AVAILABLE"
2510 PRINT " FOR MANEUVERING AT WARP"; W1; "!'"
2530 IF S < N - E OR D(7) < 0 THEN GOTO 1990
2550 PRINT "DEFLECTOR CONTROL ROOM ACKNOWLEDGES"; S; "UNITS OF ENERGY"
2560 PRINT " PRESENTLY DEPLOYED TO SHIELDS."
2570 GOTO 1990
2580 REM KLINGONS MOVE/FIRE ON MOVING STARSHIP . . .
2590 FOR I = 1 TO K3
IF K(I,3) = 0 THEN GOTO 2695
LET A$ = " "
LET Z1 = K(I,1)
LET Z2 = K(I,2)
GOSUB 8670
GOSUB 8590
LET K(I,1) = Z1
LET K(I,2) = Z2
LET A$ = "+K+"
GOSUB 8670
2695 REM end of klingon-move loop
NEXT I
2700 GOSUB 6000
LET D1 = 0
LET D6 = W1
IF W1 >= 1 THEN LET D6 = 1
2770 FOR I = 1 TO 8
IF D(I) >= 0 THEN GOTO 2885
2790 LET D(I) = D(I) + D6
IF D(I) > -0.1 AND D(I) < 0 THEN LET D(I) = -0.1 : GOTO 2885
2800 IF D(I) < 0 THEN GOTO 2885
2810 IF D1 <> 1 THEN LET D1 = 1 : PRINT "DAMAGE CONTROL REPORT: ";
2840 PRINT TAB(8);
LET R1 = I
GOSUB 8790
PRINT G2$; " REPAIR COMPLETED."
2885 REM end of damage-progress loop
NEXT I
IF RND(1) > 0.2 THEN GOTO 3070
2910 LET R1 = FNR(1)
IF RND(1) >= 0.6 THEN GOTO 3000
2930 LET D(R1) = D(R1) - (RND(1)*5 + 1)
PRINT "DAMAGE CONTROL REPORT: ";
2960 GOSUB 8790
PRINT G2$; " DAMAGED"
PRINT
GOTO 3070
3000 LET D(R1) = D(R1) + RND(1)*3 + 1
PRINT "DAMAGE CONTROL REPORT: ";
3030 GOSUB 8790
PRINT G2$; " STATE OF REPAIR IMPROVED"
PRINT
3060 REM BEGIN MOVING STARSHIP
3070 LET A$ = " "
LET Z1 = INT(S1)
LET Z2 = INT(S2)
GOSUB 8670
3110 LET X1 = C(C1,1) + (C(C1+1,1) - C(C1,1)) * (C1 - INT(C1))
LET X = S1
LET Y = S2
3140 LET X2 = C(C1,2) + (C(C1+1,2) - C(C1,2)) * (C1 - INT(C1))
LET Q4 = Q1
LET Q5 = Q2
3170 FOR I = 1 TO N
LET S1 = S1 + X1
LET S2 = S2 + X2
IF S1 < 1 OR S1 >= 9 OR S2 < 1 OR S2 >= 9 THEN GOTO 3500
3240 LET S8 = INT(S1)*24 + INT(S2)*3 - 26
IF MID$(Q$, S8, 2) = " " THEN GOTO 3365
3320 LET S1 = INT(S1 - X1)
LET S2 = INT(S2 - X2)
PRINT "WARP ENGINES SHUT DOWN AT ";
3350 PRINT "SECTOR"; S1; ","; S2; "DUE TO BAD NAVIGATION"
GOTO 3370
3365 REM continue warp-step loop
NEXT I
3360 LET S1 = INT(S1)
LET S2 = INT(S2)
3370 LET A$ = "<*>"
LET Z1 = INT(S1)
LET Z2 = INT(S2)
GOSUB 8670
GOSUB 3910
LET T8 = 1
3430 IF W1 < 1 THEN LET T8 = 0.1 * INT(10*W1)
3450 LET T = T + T8
IF T > T0 + T9 THEN GOTO 6220
3470 REM SEE IF DOCKED, THEN GET COMMAND
3480 GOTO 1980
3490 REM EXCEEDED QUADRANT LIMITS
3500 LET X = 8*Q1 + X + N*X1
LET Y = 8*Q2 + Y + N*X2
LET Q1 = INT(X/8)
LET Q2 = INT(Y/8)
LET S1 = INT(X - Q1*8)
3550 LET S2 = INT(Y - Q2*8)
IF S1 = 0 THEN LET Q1 = Q1 - 1 : LET S1 = 8
3590 IF S2 = 0 THEN LET Q2 = Q2 - 1 : LET S2 = 8
3620 LET X5 = 0
IF Q1 < 1 THEN LET X5 = 1 : LET Q1 = 1 : LET S1 = 1
3670 IF Q1 > 8 THEN LET X5 = 1 : LET Q1 = 8 : LET S1 = 8
3710 IF Q2 < 1 THEN LET X5 = 1 : LET Q2 = 1 : LET S2 = 1
3750 IF Q2 > 8 THEN LET X5 = 1 : LET Q2 = 8 : LET S2 = 8
3790 IF X5 = 0 THEN GOTO 3860
3800 PRINT "LT. UHURA REPORTS MESSAGE FROM STARFLEET COMMAND:"
3810 PRINT " 'PERMISSION TO ATTEMPT CROSSING OF GALACTIC PERIMETER"
3820 PRINT " IS HEREBY *DENIED*. SHUT DOWN YOUR ENGINES.'"
3830 PRINT "CHIEF ENGINEER SCOTT REPORTS 'WARP ENGINES SHUT DOWN"
3840 PRINT " AT SECTOR"; S1; ","; S2; "OF QUADRANT"; Q1; ","; Q2; ".'"
3850 IF T > T0 + T9 THEN GOTO 6220
3860 IF 8*Q1 + Q2 = 8*Q4 + Q5 THEN GOTO 3370
3870 LET T = T + 1
GOSUB 3910
GOTO 1320
3900 REM MANEUVER ENERGY S/R **
3910 LET E = E - N - 10
IF E >= 0 THEN RETURN
3930 PRINT "SHIELD CONTROL SUPPLIES ENERGY TO COMPLETE THE MANEUVER."
3940 LET S = S + E
LET E = 0
IF S <= 0 THEN LET S = 0
3980 RETURN
3990 REM LONG RANGE SENSOR SCAN CODE
4000 IF D(3) < 0 THEN PRINT "LONG RANGE SENSORS ARE INOPERABLE" : GOTO 1990
4030 PRINT "LONG RANGE SCAN FOR QUADRANT"; Q1; ","; Q2
4040 LET O1$ = "-------------------"
PRINT O1$
4060 FOR I = Q1-1 TO Q1+1
LET NB(1) = -1
LET NB(2) = -2
LET NB(3) = -3
FOR J = Q2-1 TO Q2+1
4120 IF I > 0 AND I < 9 AND J > 0 AND J < 9 THEN LET NB(J-Q2+2) = G(I,J) : LET Z(I,J) = G(I,J)
NEXT J
FOR L = 1 TO 3
PRINT ": ";
IF NB(L) < 0 THEN PRINT "*** "; : GOTO 4235
4210 PRINT RIGHT$(STR$(NB(L)+1000), 3); " ";
4235 REM continue LRS row
NEXT L
PRINT ":"
PRINT O1$
NEXT I
GOTO 1990
4250 REM PHASER CONTROL CODE BEGINS HERE
4260 IF D(4) < 0 THEN PRINT "PHASERS INOPERATIVE" : GOTO 1990
4265 IF K3 > 0 THEN GOTO 4330
4270 PRINT "SCIENCE OFFICER SPOCK REPORTS 'SENSORS SHOW NO ENEMY SHIPS"
4280 PRINT " IN THIS QUADRANT'"
GOTO 1990
4330 IF D(8) < 0 THEN PRINT "COMPUTER FAILURE HAMPERS ACCURACY"
4350 PRINT "PHASERS LOCKED ON TARGET; ";
4360 PRINT "ENERGY AVAILABLE ="; E; "UNITS"
4370 INPUT "NUMBER OF UNITS TO FIRE"; X
IF X <= 0 THEN GOTO 1990
4400 IF E - X < 0 THEN GOTO 4360
4410 LET E = E - X
IF D(7) < 0 THEN LET X = X * RND(1)
4450 LET H1 = INT(X / K3)
FOR I = 1 TO 3
IF K(I,3) <= 0 THEN GOTO 4675
4480 LET H = INT((H1 / FND(0)) * (RND(1) + 2))
IF H > 0.15 * K(I,3) THEN GOTO 4530
4500 PRINT "SENSORS SHOW NO DAMAGE TO ENEMY AT "; K(I,1); ","; K(I,2)
GOTO 4675
4530 LET K(I,3) = K(I,3) - H
PRINT H; "UNIT HIT ON KLINGON AT SECTOR"; K(I,1); ",";
4550 PRINT K(I,2)
IF K(I,3) <= 0 THEN PRINT "*** KLINGON DESTROYED ***" : GOTO 4580
4560 PRINT " (SENSORS SHOW"; K(I,3); "UNITS REMAINING)"
GOTO 4675
4580 LET K3 = K3 - 1
LET K9 = K9 - 1
LET Z1 = K(I,1)
LET Z2 = K(I,2)
LET A$ = " "
GOSUB 8670
4650 LET K(I,3) = 0
LET G(Q1,Q2) = G(Q1,Q2) - 100
LET Z(Q1,Q2) = G(Q1,Q2)
IF K9 <= 0 THEN GOTO 6370
4675 REM continue phaser target loop
NEXT I
GOSUB 6000
GOTO 1990
4690 REM PHOTON TORPEDO CODE BEGINS HERE
4700 IF P <= 0 THEN PRINT "ALL PHOTON TORPEDOES EXPENDED" : GOTO 1990
4730 IF D(5) < 0 THEN PRINT "PHOTON TUBES ARE NOT OPERATIONAL" : GOTO 1990
4760 INPUT "PHOTON TORPEDO COURSE (1-9)"; C1
IF C1 = 9 THEN LET C1 = 1
4780 IF C1 >= 1 AND C1 < 9 THEN GOTO 4850
4790 PRINT "ENSIGN CHEKOV REPORTS, 'INCORRECT COURSE DATA, SIR!'"
4800 GOTO 1990
4850 LET X1 = C(C1,1) + (C(C1+1,1) - C(C1,1)) * (C1 - INT(C1))
LET E = E - 2
LET P = P - 1
4860 LET X2 = C(C1,2) + (C(C1+1,2) - C(C1,2)) * (C1 - INT(C1))
LET X = S1
LET Y = S2
4910 PRINT "TORPEDO TRACK:"
4920 LET X = X + X1
LET Y = Y + X2
LET X3 = INT(X + 0.5)
LET Y3 = INT(Y + 0.5)
4960 IF X3 < 1 OR X3 > 8 OR Y3 < 1 OR Y3 > 8 THEN GOTO 5490
5000 PRINT " "; X3; ","; Y3
LET A$ = " "
LET Z1 = X
LET Z2 = Y
GOSUB 8830
5050 IF Z3 <> 0 THEN GOTO 4920
5060 LET A$ = "+K+"
LET Z1 = X
LET Z2 = Y
GOSUB 8830
IF Z3 = 0 THEN GOTO 5210
5110 PRINT "*** KLINGON DESTROYED ***"
LET K3 = K3 - 1
LET K9 = K9 - 1
IF K9 <= 0 THEN GOTO 6370
5150 FOR I = 1 TO 3
IF X3 = K(I,1) AND Y3 = K(I,2) THEN GOTO 5195
5180 NEXT I
LET I = 3
5195 LET K(I,3) = 0
GOTO 5430
5210 LET A$ = " * "
LET Z1 = X
LET Z2 = Y
GOSUB 8830
IF Z3 = 0 THEN GOTO 5280
5260 PRINT "STAR AT"; X3; ","; Y3; "ABSORBED TORPEDO ENERGY."
GOSUB 6000
GOTO 1990
5280 LET A$ = ">!<"
LET Z1 = X
LET Z2 = Y
GOSUB 8830
IF Z3 = 0 THEN GOTO 4760
5330 PRINT "*** STARBASE DESTROYED ***"
LET B3 = B3 - 1
LET B9 = B9 - 1
5360 IF B9 > 0 OR K9 > T - T0 - T9 THEN GOTO 5400
5370 PRINT "THAT DOES IT, CAPTAIN!! YOU ARE HEREBY RELIEVED OF COMMAND"
5380 PRINT "AND SENTENCED TO 99 STARDATES AT HARD LABOR ON CYGNUS 12!!"
5390 GOTO 6270
5400 PRINT "STARFLEET COMMAND REVIEWING YOUR RECORD TO CONSIDER"
5410 PRINT "COURT MARTIAL!"
LET D0 = 0
5430 LET Z1 = X
LET Z2 = Y
LET A$ = " "
GOSUB 8670
5470 LET G(Q1,Q2) = K3*100 + B3*10 + S3
LET Z(Q1,Q2) = G(Q1,Q2)
GOSUB 6000
GOTO 1990
5490 PRINT "TORPEDO MISSED"
GOSUB 6000
GOTO 1990
5520 REM SHIELD CONTROL
5530 IF D(7) < 0 THEN PRINT "SHIELD CONTROL INOPERABLE" : GOTO 1990
5560 PRINT "ENERGY AVAILABLE ="; E + S;
INPUT "NUMBER OF UNITS TO SHIELDS"; X
5580 IF X < 0 OR S = X THEN PRINT "<SHIELDS UNCHANGED>" : GOTO 1990
5590 IF X <= E + S THEN GOTO 5630
5600 PRINT "SHIELD CONTROL REPORTS 'THIS IS NOT THE FEDERATION TREASURY.'"
5610 PRINT "<SHIELDS UNCHANGED>"
GOTO 1990
5630 LET E = E + S - X
LET S = X
PRINT "DEFLECTOR CONTROL ROOM REPORT:"
5660 PRINT " 'SHIELDS NOW AT"; INT(S); "UNITS PER YOUR COMMAND.'"
GOTO 1990
5680 REM DAMAGE CONTROL
5690 IF D(6) >= 0 THEN GOTO 5910
5700 PRINT "DAMAGE CONTROL REPORT NOT AVAILABLE"
IF D0 = 0 THEN GOTO 1990
5720 LET D3 = 0
FOR I = 1 TO 8
IF D(I) < 0 THEN LET D3 = D3 + 0.1
NEXT I
IF D3 = 0 THEN GOTO 1990
5780 PRINT
LET D3 = D3 + D4
IF D3 >= 1 THEN LET D3 = 0.9
5810 PRINT "TECHNICIANS STANDING BY TO EFFECT REPAIRS TO YOUR SHIP;"
5820 PRINT "ESTIMATED TIME TO REPAIR:"; 0.01 * INT(100 * D3); "STARDATES"
5840 INPUT "WILL YOU AUTHORIZE THE REPAIR ORDER (Y/N)"; A$
5860 IF A$ <> "Y" THEN GOTO 1990
5870 FOR I = 1 TO 8
IF D(I) < 0 THEN LET D(I) = 0
NEXT I
LET T = T + D3 + 0.1
5910 PRINT
PRINT "DEVICE STATE OF REPAIR"
FOR R1 = 1 TO 8
GOSUB 8790
PRINT G2$; LEFT$(Z$, 25 - LEN(G2$)); INT(D(R1)*100) * 0.01
NEXT R1
PRINT
IF D0 <> 0 THEN GOTO 5720
5980 GOTO 1990
5990 REM KLINGONS SHOOTING
6000 IF K3 <= 0 THEN RETURN
6010 IF D0 <> 0 THEN PRINT "STARBASE SHIELDS PROTECT THE ENTERPRISE" : RETURN
6040 FOR I = 1 TO 3
IF K(I,3) <= 0 THEN GOTO 6205
6060 LET H = INT((K(I,3) / FND(1)) * (2 + RND(1)))
LET S = S - H
LET K(I,3) = K(I,3) / (3 + RND(0))
6080 PRINT H; "UNIT HIT ON ENTERPRISE FROM SECTOR"; K(I,1); ","; K(I,2)
6090 IF S <= 0 THEN GOTO 6240
6100 PRINT " <SHIELDS DOWN TO"; S; "UNITS>"
IF H < 20 THEN GOTO 6205
6120 IF RND(1) > 0.6 OR H/S <= 0.02 THEN GOTO 6205
6140 LET R1 = FNR(1)
LET D(R1) = D(R1) - H/S - 0.5*RND(1)
GOSUB 8790
6170 PRINT "DAMAGE CONTROL REPORTS "; G2$; " DAMAGED BY THE HIT'"
6205 REM continue klingon-fire loop
NEXT I
RETURN
6210 REM END OF GAME
6220 PRINT "IT IS STARDATE"; T
GOTO 6270
6240 PRINT
PRINT "THE ENTERPRISE HAS BEEN DESTROYED. THE FEDERATION ";
6250 PRINT "WILL BE CONQUERED"
GOTO 6220
6270 PRINT "THERE WERE"; K9; "KLINGON BATTLE CRUISERS LEFT AT"
6280 PRINT "THE END OF YOUR MISSION."
6290 PRINT
PRINT
IF B9 = 0 THEN GOTO 6360
6310 PRINT "THE FEDERATION IS IN NEED OF A NEW STARSHIP COMMANDER"
6320 PRINT "FOR A SIMILAR MISSION -- IF THERE IS A VOLUNTEER,"
6330 INPUT "LET HIM STEP FORWARD AND ENTER 'AYE'"; A$
IF A$ = "AYE" THEN GOTO 10
6360 END
6370 PRINT "CONGRATULATIONS, CAPTAIN! THE LAST KLINGON BATTLE CRUISER"
6380 PRINT "MENACING THE FEDERATION HAS BEEN DESTROYED."
PRINT
6400 PRINT "YOUR EFFICIENCY RATING IS"; 1000 * (K7/(T-T0))^2
GOTO 6290
6420 REM SHORT RANGE SENSOR SCAN & STARTUP SUBROUTINE
6430 FOR I = S1-1 TO S1+1
FOR J = S2-1 TO S2+1
6450 IF INT(I+0.5) < 1 OR INT(I+0.5) > 8 OR INT(J+0.5) < 1 OR INT(J+0.5) > 8 THEN GOTO 6545
6490 LET A$ = ">!<"
LET Z1 = I
LET Z2 = J
GOSUB 8830
IF Z3 = 1 THEN GOTO 6580
6545 REM continue starbase-adjacency scan
NEXT J
NEXT I
LET D0 = 0
GOTO 6650
6580 LET D0 = 1
LET C$ = "DOCKED"
LET E = E0
LET P = P0
6620 PRINT "SHIELDS DROPPED FOR DOCKING PURPOSES"
LET S = 0
GOTO 6720
6650 IF K3 > 0 THEN LET C$ = "*RED*" : GOTO 6720
6660 LET C$ = "GREEN"
IF E < E0*0.1 THEN LET C$ = "YELLOW"
6720 IF D(2) >= 0 THEN GOTO 6770
6730 PRINT
PRINT "*** SHORT RANGE SENSORS ARE OUT ***"
PRINT
RETURN
6770 LET O1$ = "---------------------------------"
PRINT O1$
FOR I = 1 TO 8
6820 FOR J = (I-1)*24 + 1 TO (I-1)*24 + 22 STEP 3
PRINT " "; MID$(Q$, J, 3);
NEXT J
6830 ON I GOTO 6850, 6900, 6960, 7020, 7070, 7120, 7180, 7240
6850 PRINT " STARDATE "; INT(T*10)*0.1
GOTO 7260
6900 PRINT " CONDITION "; C$
GOTO 7260
6960 PRINT " QUADRANT "; Q1; ","; Q2
GOTO 7260
7020 PRINT " SECTOR "; S1; ","; S2
GOTO 7260
7070 PRINT " PHOTON TORPEDOES "; INT(P)
GOTO 7260
7120 PRINT " TOTAL ENERGY "; INT(E + S)
GOTO 7260
7180 PRINT " SHIELDS "; INT(S)
GOTO 7260
7240 PRINT " KLINGONS REMAINING"; INT(K9)
7260 REM end of SRS row
NEXT I
PRINT O1$
RETURN
7280 REM LIBRARY COMPUTER CODE
7290 IF D(8) < 0 THEN PRINT "COMPUTER DISABLED" : GOTO 1990
7320 INPUT "COMPUTER ACTIVE AND AWAITING COMMAND"; A
IF A < 0 THEN GOTO 1990
7350 PRINT
LET H8 = 1
REM Out-of-range command falls through to the menu printed below.
ON A+1 GOTO 7540, 7900, 8070, 8500, 8150, 7400 ELSE REM show menu
7360 PRINT "FUNCTIONS AVAILABLE FROM LIBRARY-COMPUTER:"
7370 PRINT " 0 = CUMULATIVE GALACTIC RECORD"
7372 PRINT " 1 = STATUS REPORT"
7374 PRINT " 2 = PHOTON TORPEDO DATA"
7376 PRINT " 3 = STARBASE NAV DATA"
7378 PRINT " 4 = DIRECTION/DISTANCE CALCULATOR"
7380 PRINT " 5 = GALAXY 'REGION NAME' MAP"
PRINT
GOTO 7320
7390 REM SETUP TO CHANGE CUM GAL RECORD TO GALAXY MAP
7400 LET H8 = 0
LET G5 = 1
PRINT " THE GALAXY"
GOTO 7550
7530 REM CUM GALACTIC RECORD
7540 PRINT
PRINT " ";
7544 PRINT "COMPUTER RECORD OF GALAXY FOR QUADRANT"; Q1; ","; Q2
7546 PRINT
7550 PRINT " 1 2 3 4 5 6 7 8"
7560 LET O1$ = " ----- ----- ----- ----- ----- ----- ----- -----"
7570 PRINT O1$
FOR I = 1 TO 8
PRINT I;
IF H8 = 0 THEN GOTO 7740
7630 FOR J = 1 TO 8
PRINT " ";
IF Z(I,J) = 0 THEN PRINT "***"; : GOTO 7725
7700 PRINT RIGHT$(STR$(Z(I,J)+1000), 3);
7725 REM continue galactic-record row
NEXT J
GOTO 7850
7740 LET Z4 = I
LET Z5 = 1
GOSUB 9030
LET J0 = INT(15 - 0.5*LEN(G2$))
PRINT TAB(J0); G2$;
7800 LET Z5 = 5
GOSUB 9030
LET J0 = INT(39 - 0.5*LEN(G2$))
PRINT TAB(J0); G2$;
7850 PRINT
PRINT O1$
NEXT I
PRINT
GOTO 1990
7890 REM STATUS REPORT
7900 PRINT " STATUS REPORT:"
LET X$ = ""
IF K9 > 1 THEN LET X$ = "S"
7940 PRINT "KLINGON"; X$; " LEFT: "; K9
7960 PRINT "MISSION MUST BE COMPLETED IN"; 0.1 * INT((T0+T9-T)*10); "STARDATES"
7970 LET X$ = "S"
IF B9 < 2 THEN LET X$ = ""
IF B9 < 1 THEN GOTO 8010
7980 PRINT "THE FEDERATION IS MAINTAINING"; B9; "STARBASE"; X$; " IN THE GALAXY"
7990 GOTO 5690
8010 PRINT "YOUR STUPIDITY HAS LEFT YOU ON YOUR OWN IN"
8020 PRINT " THE GALAXY -- YOU HAVE NO STARBASES LEFT!"
GOTO 5690
8060 REM TORPEDO, BASE NAV, D/D CALCULATOR
8070 IF K3 <= 0 THEN GOTO 4270
8080 LET X$ = ""
IF K3 > 1 THEN LET X$ = "S"
8090 PRINT "FROM ENTERPRISE TO KLINGON BATTLE CRUISER"; X$
8100 LET H8 = 0
FOR I = 1 TO 3
IF K(I,3) <= 0 THEN GOTO 8485
8110 LET W1 = K(I,1)
LET X = K(I,2)
8120 LET C1 = S1
LET A = S2
GOSUB 8210
8485 REM end of klingon-nav loop
NEXT I
GOTO 1990
8150 PRINT "DIRECTION/DISTANCE CALCULATOR:"
8160 PRINT "YOU ARE AT QUADRANT "; Q1; ","; Q2; " SECTOR "; S1; ","; S2
8170 PRINT "PLEASE ENTER"
INPUT " INITIAL COORDINATES (X,Y)"; C1, A
8200 INPUT " FINAL COORDINATES (X,Y)"; W1, X
GOSUB 8210
GOTO 1990
8210 REM D/D COMPUTATION SUBROUTINE (formerly inlined at 8220)
8220 LET X = X - A
LET A = C1 - W1
IF X < 0 THEN GOTO 8350
8250 IF A < 0 THEN GOTO 8410
8260 IF X > 0 THEN GOTO 8280
8270 IF A = 0 THEN LET C1 = 5 : GOTO 8290
8275 GOTO 8280
8280 LET C1 = 1
8290 IF ABS(A) <= ABS(X) THEN GOTO 8330
8310 PRINT "DIRECTION ="; C1 + (((ABS(A)-ABS(X)) + ABS(A)) / ABS(A))
GOTO 8460
8330 PRINT "DIRECTION ="; C1 + (ABS(A) / ABS(X))
GOTO 8460
8350 IF A > 0 THEN LET C1 = 3 : GOTO 8420
8360 IF X <> 0 THEN LET C1 = 5 : GOTO 8290
8410 LET C1 = 7
8420 IF ABS(A) >= ABS(X) THEN GOTO 8450
8430 PRINT "DIRECTION ="; C1 + (((ABS(X)-ABS(A)) + ABS(X)) / ABS(X))
GOTO 8460
8450 PRINT "DIRECTION ="; C1 + (ABS(X) / ABS(A))
8460 PRINT "DISTANCE ="; SQR(X^2 + A^2)
RETURN
8500 IF B3 = 0 THEN GOTO 8510
PRINT "FROM ENTERPRISE TO STARBASE:"
LET W1 = B4
LET X = B5
LET C1 = S1
LET A = S2
GOSUB 8210
GOTO 1990
8510 PRINT "MR. SPOCK REPORTS, 'SENSORS SHOW NO STARBASES IN THIS";
8520 PRINT " QUADRANT.'"
GOTO 1990
8580 REM FIND EMPTY PLACE IN QUADRANT (FOR THINGS)
8590 LET R1 = FNR(1)
LET R2 = FNR(1)
LET A$ = " "
LET Z1 = R1
LET Z2 = R2
GOSUB 8830
IF Z3 = 0 THEN GOTO 8590
8600 RETURN
8660 REM INSERT IN STRING ARRAY FOR QUADRANT
8670 LET S8 = INT(Z2 - 0.5)*3 + INT(Z1 - 0.5)*24 + 1
8675 IF LEN(A$) <> 3 THEN PRINT "ERROR" : STOP
8680 IF S8 = 1 THEN LET Q$ = A$ & RIGHT$(Q$, 189) : RETURN
8690 IF S8 = 190 THEN LET Q$ = LEFT$(Q$, 189) & A$ : RETURN
8700 LET Q$ = LEFT$(Q$, S8 - 1) & A$ & RIGHT$(Q$, 190 - S8)
RETURN
8780 REM PRINTS DEVICE NAME
8790 IF R1 = 1 THEN LET G2$ = "WARP ENGINES" : RETURN
8794 IF R1 = 2 THEN LET G2$ = "SHORT RANGE SENSORS" : RETURN
8796 IF R1 = 3 THEN LET G2$ = "LONG RANGE SENSORS" : RETURN
8798 IF R1 = 4 THEN LET G2$ = "PHASER CONTROL" : RETURN
8800 IF R1 = 5 THEN LET G2$ = "PHOTON TUBES" : RETURN
8802 IF R1 = 6 THEN LET G2$ = "DAMAGE CONTROL" : RETURN
8804 IF R1 = 7 THEN LET G2$ = "SHIELD CONTROL" : RETURN
8806 LET G2$ = "LIBRARY-COMPUTER"
RETURN
8820 REM STRING COMPARISON IN QUADRANT ARRAY
8830 LET Z1 = INT(Z1 + 0.5)
LET Z2 = INT(Z2 + 0.5)
LET S8 = (Z2 - 1)*3 + (Z1 - 1)*24 + 1
LET Z3 = 0
8890 IF MID$(Q$, S8, 3) <> A$ THEN RETURN
8900 LET Z3 = 1
RETURN
9010 REM QUADRANT NAME IN G2$ FROM Z4,Z5 (=Q1,Q2)
9020 REM CALL WITH G5=1 TO GET REGION NAME ONLY
9030 IF Z5 > 4 THEN GOTO 9120
9032 IF Z4 = 1 THEN LET G2$ = "ANTARES" : GOTO 9210
IF Z4 = 2 THEN LET G2$ = "RIGEL" : GOTO 9210
IF Z4 = 3 THEN LET G2$ = "PROCYON" : GOTO 9210
IF Z4 = 4 THEN LET G2$ = "VEGA" : GOTO 9210
IF Z4 = 5 THEN LET G2$ = "CANOPUS" : GOTO 9210
IF Z4 = 6 THEN LET G2$ = "ALTAIR" : GOTO 9210
IF Z4 = 7 THEN LET G2$ = "SAGITTARIUS" : GOTO 9210
IF Z4 = 8 THEN LET G2$ = "POLLUX" : GOTO 9210
9120 IF Z4 = 1 THEN LET G2$ = "SIRIUS" : GOTO 9210
IF Z4 = 2 THEN LET G2$ = "DENEB" : GOTO 9210
IF Z4 = 3 THEN LET G2$ = "CAPELLA" : GOTO 9210
IF Z4 = 4 THEN LET G2$ = "BETELGEUSE" : GOTO 9210
IF Z4 = 5 THEN LET G2$ = "ALDEBARAN" : GOTO 9210
IF Z4 = 6 THEN LET G2$ = "REGULUS" : GOTO 9210
IF Z4 = 7 THEN LET G2$ = "ARCTURUS" : GOTO 9210
IF Z4 = 8 THEN LET G2$ = "SPICA"
9210 IF G5 = 1 THEN RETURN
IF Z5 = 1 OR Z5 = 5 THEN LET G2$ = G2$ & " I" : RETURN
IF Z5 = 2 OR Z5 = 6 THEN LET G2$ = G2$ & " II" : RETURN
IF Z5 = 3 OR Z5 = 7 THEN LET G2$ = G2$ & " III" : RETURN
IF Z5 = 4 OR Z5 = 8 THEN LET G2$ = G2$ & " IV" : RETURN
RETURN