This program is a full implementation of the classic Star Trek text adventure game, adapted with TS-2068-specific features including custom UDG graphics for the Enterprise, Klingon battle cruisers, and Federation starbases, as well as BEEP and SOUND commands for audio feedback. The galaxy is represented as an 8×8 quadrant grid, each subdivided into an 8×8 sector grid, with Klingon ships, starbases, and stars procedurally distributed at startup using random number thresholds. Navigation uses a nine-direction circular course system with fractional warp factors, and combat involves both phaser energy allocation and photon torpedo trajectory tracking through the sector string array. The program supports saving and resuming a game mid-session via SAVE “TREK” LINE 1990, and includes a library computer with six functions including a cumulative galactic map, direction/distance calculator, and region name display.
Program Analysis
Program Structure
The program is organized into well-defined functional blocks, roughly as follows:
- Lines 1–35: Title screen, credits, UDG setup (via
GO SUB 9490), and sound initialization (GO SUB 9600). - Lines 40–275: Optional multi-page instruction sequence with hardcopy (
COPY) support at each page break. - Lines 276–1305: Variable initialization, galaxy generation, and mission briefing.
- Lines 1310–3980: Main game loop — quadrant entry, movement, collision detection, and energy management.
- Lines 4000–5490: Weapon systems: long-range sensors, phasers, and photon torpedoes.
- Lines 5530–5980: Shield control and damage control subsystems.
- Lines 6000–6420: Klingon firing, end-of-game conditions, and short-range sensor scan display.
- Lines 7280–8520: Library computer (six options: galactic record, status, torpedo data, starbase nav, direction/distance calculator, region name map).
- Lines 8580–8900: Quadrant string utilities — finding empty sectors, inserting objects, and comparing positions.
- Lines 9010–9300: Quadrant name lookup using computed
GO TO. - Lines 9490–9595: UDG definition and separator string initialization.
- Lines 9600–9899: Sound effect subroutines.
- Lines 9900–9990: Save-game routine using
SAVE "TREK" LINE 1990.
Quadrant Representation
The entire quadrant is stored as a single string Q$ of 192 characters (8×8 sectors × 3 characters each). Objects are inserted and read back using calculated offsets. The key formula appears at line 8670:
LET S8=INT (Z2-.5)*3+INT (Z1-.5)*24+1
This maps a (column, row) sector coordinate to a 1-based index into Q$. A complementary subroutine at line 8830 reads from Q$ and sets Z3=1 if the substring matches A$, acting as a hit-test. The three-character object codes are UDG sequences: \a\b\c for the Enterprise, \d\e\f for Klingons, \j\k\l for starbases, and " * " for stars.
UDG Graphics
Nine UDGs (A–G, I, J, K, L) are defined at lines 9500–9545 by POKEing pixel data directly into USR "A" through USR "L". Each graphic is three characters wide (a 24-pixel-wide sprite), giving ships and starbases a recognizable multi-character appearance on the sensor display. UDG “I” is set uniformly to value 16 (a single horizontal rule pixel row), used as a vertical divider in the long-range sensor output.
Computed GO TO for Device Names and Quadrant Names
Two subroutines exploit computed GO TO as a dispatch table:
- Line 8790:
GO TO 8790+R1*2— dispatches to one of eight device-name assignments (warp engines, sensors, phasers, etc.) based on the device indexR1. - Lines 9030/9120:
GO TO 9030+(Z4*10)andGO TO 9120+(Z4*10)— select a star region name based on quadrant row, thenGO TO 9220+(Z5*10)appends a Roman numeral suffix based on the column.
The same technique is used at line 6830: GO TO 6840+10+(I*50) dispatches the status display loop to one of eight labeled PRINT lines (6900, 6950, 7000, … 7250).
Galaxy Initialization
At lines 820–1040, each of the 64 quadrants receives a three-digit value G(I,J) = K3*100 + B3*10 + S3 encoding Klingon count (hundreds), starbase count (tens), and star count (units). Klingon placement uses RND thresholds: >0.98 → 3 Klingons, >0.95 → 2, >0.80 → 1. Starbases are placed independently with probability 0.04. If no starbases result, one is forced into a random quadrant (lines 1150–1160), guaranteeing the player always has at least one resupply point.
Navigation and Movement
The nine-direction course system uses a 9×2 array C(9,2) initialized at lines 530–600 with unit direction vectors. Fractional courses are interpolated between adjacent cardinal directions at line 3110:
LET X1=C(C1,1)+(C(INT C1+1,1)-C(C1,1))*(C1-INT (C1))
The ship moves N = INT(W1*8+.5) steps, each step checking the quadrant string for collisions. On crossing a quadrant boundary, lines 3500–3860 recalculate the new quadrant and sector coordinates using full galactic coordinates.
Photon Torpedo Bug
At line 4850, the torpedo X1 direction vector is computed as:
LET X1=C(C1,1)+(C(1+1,1)-C(C1,1))*(C1-INT (C1))
The interpolation references C(1+1,1) (i.e., C(2,1)) instead of C(INT C1+1,1), meaning the fractional interpolation for torpedo direction always uses course 2 as the upper bound rather than the next course above C1. This causes incorrect torpedo trajectories for all fractional courses other than those between 1 and 2.
Sound System
Sound is toggled via a SND flag. When enabled, POKE 23609,25 sets the Spectrum’s system variable for beeper volume. The game uses both BEEP for simple tones (phaser fire, alerts, docking) and the TS2068 SOUND keyword (masked as } per preprocessing rules) for AY chip effects on Klingon destruction (lines 4553, 5108). Subroutine 9675 plays a brief musical fanfare using a sequence of BEEP calls at the title screen.
Save/Resume Feature
Lines 9900–9940 implement a mid-game save by issuing SAVE "TREK" LINE 1990, which saves the entire program with an auto-start at line 1990 (the main command prompt). This preserves all game variables in the saved snapshot, allowing the player to resume exactly where they left off. A second save block at lines 9950–9960 uses LINE 1 (full restart).
Key Variables
| Variable | Purpose |
|---|---|
G(8,8) | Galaxy map: encoded Klingon/starbase/star counts per quadrant |
Z(8,8) | Player’s explored/known galaxy map (same encoding, updated on scan) |
K(3,3) | Klingon positions (col 1,2) and shield energy (col 3) for up to 3 per quadrant |
D(8) | Damage state for 8 ship systems; negative = damaged |
Q$ | 192-char string representing the current quadrant’s 8×8 sector grid |
E | Current ship energy |
S | Shield energy |
T | Current stardate |
K9 | Total Klingons remaining in galaxy |
SND | Sound effects flag (1=on, 0=off) |
CLS | Flag to suppress automatic CLS at command prompt |
Notable Anomalies
- Line 8700 always executes even when
S8=1orS8=190have already handled the edge cases at lines 8680–8690, resulting in a redundant (but harmless) string replacement. - Line 9507 has a stray colon (
9507:) beforeRESTORE 9507, which is syntactically valid but unusual. - Lines 9800–9899 define a subroutine (a rising-then-falling tone sweep) that is never called anywhere else in the program.
- The comment at line 4180 (
REM IF N(L)<0 THEN PRINT "*** ";: GO TO 4230) is dead code left inside a REM statement — the actual N/A logic is handled by lines 4215 and 4225 instead. - Lines 9605–9630 form a sound-initialization subroutine called at line 3 (
GO SUB 9600), but line 9600 does not exist — execution falls through to line 9605, which is the intended entry point. This is the well-known technique of targeting a non-existent line. - The Roman numeral suffix dispatch at lines 9270–9300 duplicates I–IV rather than continuing with V–VIII, meaning quadrants in columns 5–8 are labeled I–IV rather than V–VIII.
Content
Source Code
1 REM *************************** COPYRIGHT BY T.S.S. 1984 ** ALL RIGHT RESERVED. *********************************
2 BORDER 1: PAPER 1: INK 7: CLS : POKE 23658,8
3 GO SUB 9490
10 GO SUB 9600
15 CLS
20 PRINT AT 2,0;"*********************************";TAB 31;"**";TAB 31;"**";TAB 31;"**";TAB 7;"* * STAR TREK * *";TAB 31;"**";TAB 31;"**";TAB 6;"THE KLINGON ENCOUNTER";TAB 31;"**";TAB 31;"**";TAB 31;"**";TAB 31;"**";TAB 31;"*"
25 PRINT "********************************"
28 PRINT " T. S. S E R V I C E S."
30 PRINT " PUBLIC DOMAIN SOFTWARE",,,"THIS PROGRAM COMES TO YOU THROUGH THE COMBINED EFFORTS OF NATHAN BROWN, DON BARNARD, AND JAMES BROWN."
35 GO SUB 9675
40 INPUT " DO YOU NEED INSTRUCTIONS (Y/N)";K$: IF K$="N" THEN GO TO 276
45 IF K$<>"Y" THEN GO TO 40
50 CLS
60 PRINT ,,,," 'STAR TREK' INSTRUCTIONS",,,
70 PRINT ,,"1. WHEN YOU SEE \COMMAND ?\, ENTER ONE OF THE LEGAL COMMANDS (NAV, SRS, LRS, PHA, TOR, SHE, DAM, COM, OR XXX )."
80 PRINT ,,"2. IF YOU SHOULD TYPE IN AN ILLEGAL COMMAND, YOU'LL GET A SHORT LIST OF LEGAL COMMANDS."
90 PRINT ,,"3. SOME COMMANDS REQUIRE YOU TO ENTER DATA. FOR EXAMPLE, THE 'NAV' COMMAND COMES BACK WITH 'COURSE (1-9) ?'. IF YOU TYPE IN ILLEGAL DATA LIKE NEGATIVE NUMBERS, THAT COMMAND WILL BE ABORTED."
93 PRINT #0;"PRESS Z FOR A HARDCOPY": PAUSE 0: IF INKEY$="Z" THEN COPY
94 CLS
100 PRINT ,," THE GALAXY IS DIVIDED INTO AN8 x 8 QUADRANT GRID, AND EACHQUADRANT IS FURTHER DIVIDED INTOAN 8 x 8 SECTOR GRID.",
110 PRINT ,," YOU'LL BE ASSIGNED A STARTINGPOINT SOMEWHERE IN THE GALAXY TOBEGIN YOUR TOUR OF DUTY AS THECOMMANDER OF THE STARSHIP ""ENTERPRISE"".",,,," YOUR MISSION: TO SEEK ANDDESTROY THE FLEET OF KLINGONWARSHIPS WHICH ARE MENACING THEUNITED FEDERATION OF PLANETS."
115 PRINT #0;"PRESS Z FOR A HARDCOPY": PAUSE 0: IF INKEY$="Z" THEN COPY
118 CLS
120 PRINT ,,,," YOU HAVE THE FOLLOWING COMMANDSAVAILABLE TO YOU AS CAPTAIN OFTHE STARSHIP ""ENTERPRISE""."
130 PRINT ,," \NAV\ COMMAND",,,"WARP ENGINE CONTROL: COURSE ISIN A CIRCULAR MUMERICAL ARRANGE-MENT AS SHOWN. INTERGER & REALVALUES MAY BE USED. (COURSE 1.5IS HALFWAY BETWEEN 1 AND 2.)"
140 PRINT "VALUES MAY APPROACH 9.0, WHICHITSELF IS EQUIVALENT TO 1.0.",,,
150 PRINT "ONE WARP FACTOR IS THE SIZE OFONE QUADRANT. THEREFORE, TO GETFROM QUADRANT 6,5 TO 5,5, YOUWOULD USE COURSE 3 WARP FACTOR 1"
155 PRINT #0;"PRESS Z FOR A HARDCOPY": PAUSE 0: IF INKEY$="Z" THEN COPY
156 CLS
160 PRINT ,," 4 3 2 . . . ... 5 ---*--- 1 ""COURSE"" ... . . . 6 7 8"
165 PRINT ,," \SHE\ COMMAND",,,"SHIELD CONTROL: DEFINES THENUMBER OF ENERGY UNITS TO BEASSIGNED TO THE SHIELDS.",,,"ENERGY IS TAKEN FORM THE TOTALSHIPS ENERGY.",,,,"NOTE THAT THE STATUS DISPLAY'STOTAL ENERGY INCLUDES SHIELDENERGY."
170 PRINT #0;"PRESS Z FOR A HARDCOPY": PAUSE 0: IF INKEY$="Z" THEN COPY
171 CLS
180 PRINT ,," \SRS\ COMMAND",,,"SHORT RANGE SENSOR SCAN: SHOWSYOU A SCAN OF YOUR PRESENTQUADRANT."
190 PRINT ,,,,"SYMBOLOGY ON YOUR SENSOR SCREENIS AS FOLLOWS:",,,,"\a\b\c = YOUR STARSHIP'S POSITION ",,"\d\e\f = KLINGON BATTLE CRUISER ",,"\j\k\l = FEDERATION STARBASE"," (REFUEL/REPAIR/RE-ARM HERE!)",," * = STAR"
195 PRINT #0;"PRESS Z FOR A HARDCOPY": PAUSE 0: IF INKEY$="Z" THEN COPY
196 CLS
200 PRINT ,," \LRS\ COMMAND",,,"LONG RANGE SENSOR SCAN: SHOWSCONDITIONS IN SPACE FOR ONEQUADRANT ON EACH SIDE OF THEENTERPRISE, WHICH IS IN THEMIDDLE OF THE SCAN. N/A MEANS THAT AREA OF SPACE HAS NOT BEEN MAPPED YET. ",,,,"THE SCAN IS CODED IN THE FORM\###\, WHERE THE UNITS DIGIT ISTHE NUMBER OF STARS, THE TENSDIGIT IS THE NUMBER OF STARBASESAND THE HUNDREDS DIGIT IS THENUMBER OF KLINGONS."
210 PRINT ,,,,"EXAMPLE - 2 0 7__= 7 STARS ^ ^____= 0 STARBASES \i______= 2 KLINGONS."
215 PRINT #0;"PRESS Z FOR A HARDCOPY": PAUSE 0: IF INKEY$="Z" THEN COPY
216 CLS
220 PRINT ,," \TOR\ COMMAND",,,"PHOTON TORPEDO CONTROL: TORPEDOCOURSE IS THE SAME AS USED INWARP ENGINE CONTROL.",,,"IF YOU HIT THE KLINGON VESSEL,HE IS DESTROYED AND CANNOT FIREBACK AT YOU.",,,,"IF YOU MISS, YOU ARE SUBJECT TOHIS PHASER FIRE.",,,"IN EITHER CASE YOU ARE SUBJECTTO THE PHASER FIRE OF ALL OTHERKLINGONS IN THE QUADRANT."
225 PRINT #0;"PRESS Z FOR A HARDCOPY": PAUSE 0: IF INKEY$="Z" THEN COPY
226 CLS
240 PRINT ,,,," \COM\ COMMAND",,,"THE LIBRARY - COMPUTER CONTAINSSEVEN OPTIONS:"
250 PRINT ,,"OPTION 1 = STATUS REPORT SHOWSTHE NUMBER OF KLINGONS, STAR-DATES, AND STARBASES REMAININGIN THE GAME.",,,,"OPTION 2 = PHOTON TORPEDO DATA GIVES DIRECTIONS AND DISTANCEFROM THE ALL THE KLINGONS TOTHE ENTERPRISE IN THIS QUADRANT."
258 PRINT #0;"PRESS Z FOR A HARDCOPY": PAUSE 0: IF INKEY$="Z" THEN COPY
259 CLS
260 PRINT ,,,,,,,,"OPTION 3 = STARBASE NAV DATAGIVES DIRECTION AND DISTANCE TOANY STARBASE IN YOUR QUADRANT."
270 PRINT ,,"OPTION 4 = DIRECTION/DISTANCECALCULATOR ALLOWS YOU TO ENTERCOORDINATES FOR DIRECTION/ DISTANCE CALCULATIONS."
273 PRINT ,,"OPTION 5 = GALACTIC REGION NAMEMAP PRINTS THE NAMES OF THESIXTEEN MAJOR GALACTIC REGIONSREFERRED TO IN THE GAME.",,,
274 PRINT ,," S-GAME = WILL ALLOW YOU TO SAVE THE GAME AND RESTART AT POINT WHERE YOU STOPPED."
275 PRINT #0;"PRESS Z FOR A HARDCOPY": PAUSE 0: IF INKEY$="Z" THEN COPY
276 CLS : LET CLS=0: LET SRS=0: PRINT AT 18,0;"PREPARE TO BEAM ABOARD AND BEGINYOUR TOUR OF DUTY, CAPTAIN."
280 PRINT AT 0,13;"___ \ ___/ --\___ \ _/...........\____ \_/...................\____ __ ......................._____) /....__..............__/ / .../ \____ ____/ /..../ \_/ ..../ ___/_ \ 1701 ! / ____/"
290 PRINT ,," THE USS ENTERPRISE --- NCC-1701"
293 GO SUB 9750
295 PRINT #1; BRIGHT 1; FLASH 1;" STANDBY FOR ORDERS PRIORITY 1 MESSAGE COMING IN ": FLASH 0
300 LET Z$=" "
310 GO SUB 9750
330 DIM G(8,8): DIM C(9,2): DIM K(3,3): DIM N(3): DIM Z(8,8): DIM D(8): DIM X$(2,3)
370 LET T=INT (RND*20+20)*100: LET T0=T: LET T9=25+INT (RND*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=0: LET K9=0: LET X$(2)=" ": LET X$(1)="IS "
470 DEF FN D(D)=SQR (ABS (K(I,1)-S1)^2+ABS (K(I,2)-S2)^2)
475 DEF FN R(R)=INT ((RND*R)*7.98+1.01)
480 REM *** INITIALIZE ENTERPRISE'S POSITION
490 LET Q1=FN R(1): LET Q2=FN R(1): LET S1=FN R(1): LET S2=FN R(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 W$="NAVSRSLRSPHATORSHEDAMCOMXXX"
810 REM **** SET UP WHAT EXISTS IN GALAXY ****
820 FOR I=1 TO 8: FOR J=1 TO 8: LET K3=0: LET Z(I,J)=0: LET R1=RND
850 IF R1>.98 THEN LET K3=3: LET K9=K9+3: GO TO 980
860 IF R1>.95 THEN LET K3=2: LET K9=K9+2: GO TO 980
870 IF R1>.80 THEN LET K3=1: LET K9=K9+1
980 LET B3=0: IF RND>.96 THEN LET B3=1: LET B9=B9+1
1040 LET G(I,J)=K3*100+B3*10+FN R(1): NEXT J: NEXT I: IF K9>T9 THEN LET T9=K9+1
1100 IF B9<>0 THEN GO TO 1200
1150 IF G(Q1,Q2)<200 THEN LET G(Q1,Q2)=G(Q1,Q2)+100: LET K9=K9+1
1160 LET B9=1: LET G(Q1,Q2)=G(Q1,Q2)+10: LET Q1=FN R(1): LET Q2=FN R(1)
1200 LET K7=K9: IF B9<>1 THEN LET X$(2)="S ": LET X$(1)="ARE"
1210 GO SUB 9750
1230 CLS : PRINT ,,,,,,,,,,,," YOUR ORDERS ARE AS FOLLOWS:"
1240 PRINT ,,,,"DESTROY THE ";K9;" KLINGON WARSHIPS","WHICH HAVE INVADED THE GALAXY "
1250 PRINT "BEFORE THEY CAN DESTROYFEDERATION HEADQUARTERS ";
1260 PRINT " ONSTARDATE ";T0+T9;". THIS GIVES YOU";T9;" DAYS. THERE ";X$(1);" ";
1270 PRINT " ";B9;" STARBASE","IN THE GALAXY FOR RESUPPLYING","YOUR SHIP."
1280 PRINT ,,,, FLASH 1;" HIT ANY KEY WHEN READY TO ACCEPT COMMAND "
1300 LET I=RND: IF INKEY$="" THEN GO TO 1300
1305 CLS
1310 REM **** HERE ANY TIME NEW QUADRANT ENTERED ****
1315 GO SUB 9750
1320 LET Z4=Q1: LET Z5=Q2: LET K3=0: LET B3=0: LET S3=0: LET G5=0: LET D4=.5*RND: LET Z(Q1,Q2)=G(Q1,Q2)
1390 IF Q1<1 OR Q1>8 OR Q2<1 OR Q2>8 THEN GO TO 1600
1430 GO SUB 9030: PRINT : IF T0<>T THEN GO TO 1490
1460 LET D(2)=0: CLS : PRINT ,,,,,,,,,,,,"YOUR MISSION BEGINS WITH YOURSTARSHIP LOCATED ";
1470 PRINT "IN THE GALACTICQUADRANT, """;G$;""".": GO TO 1500
1490 CLS : PRINT " NOW ENTERING QUADRANT",TAB 15-INT LEN G$/2;G$
1500 PRINT : LET K3=INT (G(Q1,Q2)*.01): LET B3=INT (G(Q1,Q2)*.1)-10*K3
1540 LET S3=G(Q1,Q2)-100*K3-10*B3: IF K3=0 THEN GO TO 1590
1545 IF snd=0 THEN GO TO 1560
1550 FOR M=1 TO 20: BEEP .075,12: NEXT M
1560 PRINT FLASH 1; INK 7; PAPER 0;"COMBAT AREA"; INK 7; PAPER 2; FLASH 0;" "; FLASH 1;"CONDITION RED"; INK 0: IF S>200 THEN GO TO 1590
1570 IF SND=0 THEN GO TO 1580
1575 FOR M=1 TO 10: BEEP .075,-11: NEXT M
1580 PRINT ,, FLASH 1;" SHIELDS DANGEROUSLY LOW "
1583 IF SND=0 THEN GO TO 1590
1585 FOR M=1 TO 10: BEEP .075,-20: NEXT M
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$+Z$( TO 17)
1660 REM POSITION ENTERPRISE IN QUADRANT, THEN PLACE "K3" KLINGONS, & "B3" STARBASES, & "S3" STARS ELSEWHERE.
1680 LET A$="\a\b\c": LET Z1=S1: LET Z2=S2: GO SUB 8670: IF K3<1 THEN GO TO 1820
1720 FOR I=1 TO K3: GO SUB 8590: LET A$="\d\e\f": LET Z1=R1: LET Z2=R2
1725 IF SND=1 THEN BEEP .05,48
1780 GO SUB 8670: LET K(I,1)=R1: LET K(I,2)=R2: LET K(I,3)=S9*(0.5+RND): NEXT I
1820 IF B3<1 THEN GO TO 1910
1880 GO SUB 8590: LET A$="\j\k\l": LET Z1=R1: LET B4=R1: LET Z2=R2: LET B5=R2: GO SUB 8670
1910 FOR I=1 TO S3: GO SUB 8590: LET A$=" * ": LET Z1=R1: LET Z2=R2: GO SUB 8670: NEXT I
1980 GO SUB 6430
1990 BORDER 1: PAPER 1: IF S+E>10 AND E>10 OR D(7)=0 THEN GO TO 2060
2013 IF SND=0 THEN GO TO 2020
2015 FOR M=24 TO 0: BEEP .05,-20: BEEP .05,21: NEXT M
2020 CLS : PRINT : PRINT "** FATAL ERROR ** YOU'VE JUST STRANDED YOUR SHIP IN SPACE. YOU HAVE INSUFFICIENT MANUVERINGENERGY, AND SHIELD CONTROL IS PRESENTLY INCAPABLE OF DIVERTINGENERGY TO THE ENGINE ROOM!"
2050 LET A$=" "
2060 INPUT "YOUR COMMAND, SIR? ";A$: IF A$="SRS" THEN LET SRS=1
2065 IF A$="S-GAME" THEN GO TO 9900
2070 IF CLS=0 THEN CLS
2072 LET CLS=0
2075 IF LEN A$<3 THEN CLS : GO TO 2160
2080 RESTORE : FOR I=1 TO 9: READ Z22: IF A$<>W$(3*I-2 TO 3*I) THEN GO TO 2160
2140 GO TO Z22: DATA 2300,1980,4000,4260,4700,5530,5690,7290,6270
2150 REM **COMMAND ENTRY**
2160 NEXT I: RESTORE : PRINT "ENTER ONE OF THE FOLLOWING:",,," NAV (TO SET COURSE)"," SRS (SHORT RANGE SENSOR SCAN)"
2200 PRINT " LRS (LONG RANGE SENSOR SCAN)"," PHA (FIRE PHASERS)"," TOR (FIRE PHOTON TORPEDOS)"
2230 PRINT " SHE (RAISE OR LOWER SHIELDS)"," DAM (DAMAGE CONTROL REPORTS)"
2240 PRINT " COM (CALL LIBRARY COMPUTER)"," XXX (RESIGN COMMAND)","S-GAME (SAVE GAME FROM HERE)"
2250 GO TO 1990
2290 REM COURSE CONTROL BEGINS HERE
2300 PRINT AT 14,1;" 4 3 2 . . . ... 5 ---*--- 1 'COURSE' ... . . . 6 7 8": INPUT "COURSE (1-9)";C1
2305 IF C1=9 THEN LET C1=1
2310 IF C1>=1 AND C1<9 THEN GO TO 2350
2317 IF SND=0 THEN GO TO 2330
2320 FOR M=1 TO 10: BEEP .025,50: NEXT M
2330 PRINT "LT. SULU REPORTS,",,,"""INCORRECT COURSE DATA, SIR.""": GO TO 1990
2350 LET X$(2)=" 8 ": IF D(1)<0 THEN LET X$(2)="0.2"
2360 INPUT ("WARP FACTOR ( 0-";X$(2);")");W1: IF D(1)<0 AND W1>.2 THEN GO TO 2470
2380 IF W1>0 AND W1<=8 THEN GO TO 2490
2390 IF W1=0 THEN GO TO 1990
2420 PRINT "CHIEF ENGINEER SCOTT REPORTS,","""SIRRR! SHE CAN'T TAKE WARP """;W1;"!": GO TO 1990
2470 PRINT "WARP ENGINES ARE DAMAGED.","MAX SPEED = WARP 0.2": GO TO 1990
2490 CLS : LET N=INT (W1*8+.5): IF E-N>=0 THEN GO TO 2590
2500 PRINT "ENGINEERING REPORTS, SIR, INSUFFICIENT ENERGY AVAILABLE FOR MANEUVERING AT WARP ";W1,"SIR!"
2530 IF S<N-E OR D(7)<0 THEN GO TO 1990
2550 PRINT "DEFLECTOR CONTROL ROOM ACKNOWLEGES: ",S,"UNITS OF ENERGY";TAB 0;"PRESENTLY DEPLOYED TO SHIELDS."
2555 IF SND=0 THEN GO TO 2570
2560 FOR M=1 TO S/20: BEEP .005,M-23: NEXT M
2570 GO TO 1990
2580 REM KLINGONS MOVE/FIRE ON MOVING STARSHIP . . .
2590 FOR I=1 TO K3: IF K(I,3)=0 THEN GO TO 2700
2610 LET A$=" ": LET Z1=K(I,1): LET Z2=K(I,2): GO SUB 8670: GO SUB 8590
2660 LET K(I,1)=Z1: LET K(I,2)=Z2: LET A$="\d\e\f": GO SUB 8670
2700 NEXT I: GO SUB 6000: LET D1=0: LET D6=W1: IF W1>=1 THEN LET D6=1
2770 FOR I=1 TO 8: IF D(1)>=0 THEN GO TO 2880
2790 LET D(I)=D(I)+D6: IF D(I)>-.1 AND D(I)<0 THEN LET D(I)=-.1: GO TO 2880
2800 IF D(I)<0 THEN GO TO 2880
2810 IF D1<>1 THEN LET D1=1: PRINT "DAMAGE CONTROL REPORT: ";
2840 PRINT : LET R1=I: GO SUB 8790: PRINT G$;" REPAIRED."
2880 NEXT I: IF RND>.2 THEN GO TO 3070
2910 LET R1=FN R(1): IF RND>=.6 THEN GO TO 3000
2925 IF SND=0 THEN GO TO 2930
2928 FOR M=10 TO 0 STEP -1: BEEP .005,M: NEXT M
2930 LET D(R1)=D(R1)-(RND*5+1): PRINT "DAMAGE CONTROL REPORT:": PRINT
2960 GO SUB 8790: PRINT G$;" DAMAGED": PRINT : GO TO 3070
3000 LET D(R1)=D(R1)+RND*3+1: PRINT "DAMAGE CONTROL REPORT:": PRINT
3030 GO SUB 8790: PRINT G$;TAB 0;"STATE OF REPAIR IMPROVED": PRINT
3035 IF SND=0 THEN GO TO 3060
3040 FOR M=0 TO 10: BEEP .005,M+30: NEXT M
3060 REM BEGIN MOVING STARSHIP
3070 LET A$=" ": LET Z1=INT (S1): LET Z2=INT (S2): GO SUB 8670
3110 LET X1=C(C1,1)+(C(INT C1+1,1)-C(C1,1))*(C1-INT (C1)): LET X=S1: LET Y=S2
3140 LET X2=C(C1,2)+(C(INT 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 GO TO 3500
3240 LET S8=INT (S1)*24+INT (S2)*3-26: IF Q$(S8 TO S8+2)=" " THEN GO TO 3360
3310 PRINT FLASH 1;AT 6,0;" COLLISION ALERT!! ": FLASH 0
3314 IF SND=0 THEN GO TO 3320
3315 FOR M=48 TO -24 STEP -1: BEEP .005,M: NEXT M
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": GO TO 3370
3360 NEXT I: LET S1=INT (S1): LET S2=INT (S2)
3370 LET A$="\a\b\c": LET Z1=INT (S1): LET Z2=INT (S2): GO SUB 8670: GO SUB 3910: LET T8=1
3430 IF W1<1 THEN LET T8=.1*INT (10*W1)
3450 LET T=T+T8: IF T>T0+T9 THEN GO TO 6220
3470 REM SEE IF DOCKED, THEN GET COMMAND
3480 GO TO 1980
3490 REM EXCEDED 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 GO TO 3860
3795 IF SND=0 THEN GO TO 3800
3798 FOR M=48 TO 56: BEEP .025,M-6: BEEP .025,M: NEXT M
3800 PRINT ,,"LT. UHURA REPORTS: SIR... MESSAGE FROM STARFLEET COMMAND:",,
3805 GO SUB 9750
3810 PRINT """PERMISSION TO ATTEMPT CROSSING OF GALACTIC PERIMETER"
3820 PRINT "IS HEREBY *DENIED*";". ",; FLASH 1;"SHUT DOWN YOUR ENGINES."; FLASH 0;""""
3830 PRINT ,,"CHIEF ENGINEER SCOTT REPORTS: ""DAMN IT JIM!!!",,"WARP ENGINES SHUT DOWN ";
3840 PRINT "AT SECTOR";S1;",";S2;" OF QUADRANT ";Q1;",";Q2;"."""
3845 PAUSE 200
3850 IF T>T0+T9 THEN GO TO 6220
3860 IF 8*Q1+Q2=8*Q4+Q5 THEN GO TO 3370
3870 LET T=T+1: GO SUB 3910: GO TO 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": GO TO 1990
4030 PRINT ,,,,"LONG RANGE SENSOR SCAN FOR:"," QUADRANT ";Q1;",";Q2,,,,
4040 LET O$="\g\g\g\g\g\g\g\g\g\g\g\g\g": PRINT O$
4060 FOR I=Q1-1 TO Q1+1: LET N(1)=-1: LET N(2)=-2: LET N(3)=-3: FOR J=Q2-1 TO Q2+1
4065 IF SND<>1 THEN GO TO 4120
4070 BEEP .005,I-5
4120 IF I>0 AND I<9 AND J>0 AND J<9 THEN LET N(J-Q2+2)=G(I,J): LET Z(I,J)=G(I,J)
4180 NEXT J: FOR L=1 TO 3: PRINT "\i";: REM IF N(L)<0 THEN PRINT "*** ";: GO TO 4230
4210 LET A$=STR$ (N(L)+1000)
4215 IF N(L)<0 THEN LET A$="***"
4220 IF N(L)>=0 THEN PRINT A$(2 TO );"";
4225 IF N(L)<0 THEN PRINT A$;"";
4230 NEXT L: PRINT "\i": PRINT O$: NEXT I: GO TO 1990
4250 REM PHASER CONTROL CODE BEGINS HERE
4260 IF D(4)<0 THEN PRINT "PHASERS INOPERATIVE": GO TO 1990
4265 IF K3>0 THEN GO TO 4330
4270 PRINT ,,,,,,,,"SCIENCE OFFICER SPOCK REPORTS:",,,,," ""SENSORS SHOW NO ENEMY SHIPS"," IN THIS QUADRANT""": GO TO 1990
4325 IF SND=0 THEN GO TO 4330
4328 FOR M=48 TO 56 STEP .5: BEEP .005,M: NEXT M
4333 IF SND=0 THEN GO TO 4350
4334 FOR Z=0 TO -5 STEP -1: BEEP .025,Z: NEXT Z
4350 PRINT "PHASERS "; FLASH 1;"LOCKED"; FLASH 0;" ON TARGET, SIR.",,,
4353 IF D(8)<0 THEN PRINT "COMPUTER FAILURE HAMPERS TARGETING ACCURACY."
4355 IF SND=1 THEN PAUSE 1: BEEP .05,48: BEEP .05,49
4360 PRINT "ENERGY AVAILABLE = ";E;" UNITS",,,
4370 INPUT "NUMBER OF UNITS TO FIRE = ";X: IF X<=0 THEN GO TO 1990
4400 IF E-X<0 THEN GO TO 4360
4410 LET E=E-X: IF D(7)<0 THEN LET X=X*RND
4450 LET H1=INT (X/K3): FOR I=1 TO 3: IF K(I,3)<=0 THEN GO TO 4670
4480 LET H=INT ((H1/FN D(0))*(RND+2)): IF H>.15*K(I,3) THEN GO TO 4530
4500 PRINT "SENSORS SHOW NO DAMAGE TO ENEMY AT ";K(I,1);",";K(I,2): GO TO 4670
4530 GO SUB 9700
4535 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 ****",,,
4553 IF K(I,3)<=0 AND SND=1 THEN SOUND 6,20;7,7;8,16;9,16;10,16;12,56;13,8: PAUSE 90: SOUND 8,0;9,0;10,0: GO TO 4580
4555 IF K(I,3)<=0 THEN GO TO 4580
4560 PRINT "(SENSORS SHOW ";K(I,3);" UNITS","REMAINING)",,,,: GO TO 4670
4580 LET K3=K3-1: LET K9=K9-1: LET Z1=K(I,1): LET Z2=K(I,2): LET A$=" ": GO SUB 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 GO TO 6370
4670 NEXT I: GO SUB 6000: GO TO 1990
4690 REM PHOTON TORPEDO CODE BEGINS HERE
4700 IF P<=0 THEN PRINT "ALL PHOTON TORPEDOES EXPENDED": GO TO 1990
4730 IF D(5)<0 THEN PRINT "PHOTON TUBES ARE NOT OPERATIONAL": GO TO 1990
4760 PRINT AT 14,1;" 4 3 2 . . . ... 5 ---*--- 1 'COURSE' ... . . . 6 7 8": INPUT "PHOTON TORPEDO COURSE, SIR?(1-9)";C1
4765 IF C1=9 THEN LET C1=1
4780 IF C1>=1 AND C1<9 THEN GO TO 4850
4790 PRINT "ENSIGN CHEKOV REPORTS,","""INCORRECT COURSE DATA, CAPTAIN!""","""(TOO MUCH ""WOODKA""...SIR)"""
4800 GO TO 1990
4850 LET X1=C(C1,1)+(C(1+1,1)-C(C1,1))*(C1-INT (C1)): LET E=E-2: LET P=P-1
4860 LET X2=C(C1,2)+(C(1+1,2)-C(C1,2))*(C1-INT (C1)): LET X=S1: LET Y=S2
4910 PRINT "TORPEDO AWAY, SIR!";TAB 0;"TORPEDO TRACK: "
4920 LET X=X+X1: LET Y=Y+X2: LET X3=INT (X+.5): LET Y3=INT (Y+.5)
4960 IF X3<1 OR X3>8 OR Y3<1 OR Y3>8 THEN GO TO 5490
4975 IF SND=1 THEN BEEP .005,50
5000 PRINT X3;",";Y3;" : ": LET A$=" ": LET Z1=X: LET Z2=Y: GO SUB 8830
5050 IF Z3<>0 THEN GO TO 4920
5060 LET A$="\d\e\f": LET Z1=X: LET Z2=Y: GO SUB 8830: IF Z3=0 THEN GO TO 5210
5103 IF SND=0 THEN GO TO 5110
5105 FOR M=30 TO 35 STEP .5: BEEP .005,M: NEXT M
5107 IF SND=0 THEN GO TO 5110
5108 SOUND 6,10;7,7;8,16;9,16;10,16;12,56;13,8: PAUSE 90: SOUND 8,0;9,0;10,0
5110 PRINT "**** KLINGON DESTROYED ****": LET K3=K3-1: LET K9=K9-1: IF K9<=0 THEN GO TO 6370
5150 FOR I=1 TO 3: IF X3=K(I,1) AND Y3=K(I,2) THEN GO TO 5190
5180 NEXT I: LET I=3
5190 LET K(I,3)=0: GO TO 5430
5210 LET A$=" * ": LET Z1=X: LET Z2=Y: GO SUB 8830: IF Z3=0 THEN GO TO 5280
5260 PRINT "STAR AT ";X3;",";Y3;" ABSORBED TORPEDO","ENERGY.": GO SUB 6000: GO TO 1990
5280 LET A$="\j\k\l": LET Z1=X: LET Z2=Y: GO SUB 8830: IF Z3=0 THEN GO TO 5490: REM IF Z3=0 THEN GO TO 4760
5323 IF SND=0 THEN GO TO 5330
5325 FOR M=1 TO 10: BEEP .025,60: NEXT M
5330 PRINT "*** STARBASE DESTROYED ***": LET B3=B3-1: LET B9=B9-1
5360 IF B9>0 OR K9>T-T0-T9 THEN GO TO 5400
5370 PRINT "THAT DOES IT, CAPTAIN!! YOU AREHEREBY RELIEVED OF COMMAND";
5380 PRINT " ANDSENTENCED TO 99 STARDATES ATHARD LABOR ON CYGNUS 12!!",,,
5390 GO TO 6270
5400 PRINT "STARFLEET COMMAND REVIEWING YOUR RECORD TO CONSIDER "
5410 PRINT "COURT MARTIAL!": LET D0=0
5415 IF SND=1 THEN GO SUB 9750
5430 LET Z1=X: LET Z2=Y: LET A$=" ": GO SUB 8670
5470 LET G(Q1,Q2)=K3*100+B3*10+S3: LET Z(Q1,Q2)=G(Q1,Q2): GO SUB 6000: GO TO 1990
5490 PRINT "TORPEDO MISSED, SIR...": GO SUB 6000: GO TO 1990
5520 REM SHEILD CONTROL
5530 IF D(7)<0 THEN PRINT "SHEILD CONTROL INOPERABLE": GO TO 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>": GO TO 1990
5590 IF X<=E+S THEN GO TO 5630
5600 PRINT "SHIELD CONTROL REPORTS ""THIS IS NOT THE FEDERATION TREASURY."""
5610 PRINT "<SHIELDS UNCHANGED>": GO TO 1990
5630 LET E=E+S-X: LET S=X: PRINT "DEFLECTOR CONTROL ROOM REPORT:"
5635 IF SND=0 THEN GO TO 5660
5640 FOR M=1 TO S/20: BEEP .005,M+30: NEXT M
5660 PRINT """SHIELDS NOW AT ";INT (S);" UNITS,"," PER YOUR COMMAND, SIR""": GO TO 1990
5680 REM DAMAGE CONTROL
5690 IF D(6)>=0 THEN GO TO 5910
5700 PRINT "DAMAGE CONTROL REPORT:", FLASH 1;"NOT AVAILABLE": IF D0=0 THEN GO TO 1990
5720 LET D3=0: FOR I=1 TO 8: IF D(I)<0 THEN LET D3=D3+.1
5760 NEXT I: IF D3=0 THEN GO TO 1990
5780 PRINT : LET D3=D3+D4: IF D3>=1 THEN LET D3=.9
5810 PRINT "TECHNICIANS STANDING BY TO EFFECT REPAIRS TO YOUR SHIP",,,
5820 PRINT "ESTIMATED TIME TO REPAIR:",.01*INT (100*D3);" STARDATES"
5840 INPUT "WILL YOU AUTHORIZE THE REPAIR ORDER, SIR? (Y/N)";A$
5860 IF A$<>"Y" AND A$<>"y" THEN GO TO 1990
5870 FOR I=1 TO 8: IF D(I)<0 THEN LET D(I)=0
5890 NEXT I: LET T=T+D3+.1
5910 PRINT : PRINT "DEVICE STATE OF REPAIR",,: FOR I=1 TO 8: LET R1=I
5920 GO SUB 8790: PRINT TAB 9-INT LEN G$/2;G$;TAB 24;INT (D(R1)*100)*.01
5925 IF SND=1 THEN BEEP .005,I-13
5930 NEXT I: PRINT L$;"(YOU ARE IN QUADRANT ";Q1;",";Q2;")"
5950 PRINT ;"TOTAL ENERGY LEFT: "; FLASH 1;E+S: FLASH 0: PRINT
5955 IF A$="Y" THEN PRINT TAB 0;"REPAIRS COMPLETED, CAPTAIN... YOU MAY GET UNDER WAY NOW..."
5960 IF D0<>0 THEN GO TO 5720
5980 GO TO 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 GO TO 6200
6060 LET H=INT ((K(I,3)/FN D(1))*(2+RND)): LET S=S-H: LET K(I,3)=K(I,3)/(3+RND)
6067 IF SND=0 THEN GO TO 6080
6070 FOR M=10 TO 20 STEP .5: BEEP .005,M: NEXT M
6080 PRINT H;" UNIT HIT ON ENTERPRISE","FROM SECTOR ";K(I,1);",";K(I,2)
6090 IF S<=0 THEN GO TO 6240
6100 PRINT " <SHIELDS DOWN TO ";S;" UNITS>": IF H<20 THEN GO TO 6200
6120 IF RND>.6 OR H/S<=.02 THEN GO TO 6200
6140 LET R1=FN R(1): LET D(R1)=D(R1)-H/S-.5*RND: GO SUB 8790
6170 PRINT "DAMAGE CONTROL REPORTS:","""";G$;"""": PRINT "DAMAGED BY THE HIT."
6200 NEXT I: RETURN
6210 REM END OF GAME
6220 PRINT "IT IS STARDATE ";T,,,: GO TO 6270
6233 IF SND=0 THEN GO TO 6240
6235 FOR M=0 TO -10 STEP -2: BEEP .025,M: NEXT M
6240 CLS : PRINT : PRINT """ENTERPRISE"" HAS BEEN DESTROYED.",,"THE FEDERATION ";
6250 PRINT "WILL BE CONQUERED",,: GO TO 6220
6270 PRINT "THERE WERE ";K9;" KLINGON BATTLE": PRINT "CRUISERS LEFT AT";
6280 PRINT " THE END OF YOURMISSION."
6290 PRINT : PRINT : IF B9=0 THEN GO TO 6360
6310 PRINT "THE FEDERATION IS IN NEED OF ANEW STARSHIP COMMANDER FOR A ";
6320 PRINT "SIMILAR MISSION... IF THERE IS A VOLUNTEER,"
6330 INPUT "LET HIM STEP FORWARD AND ENTER ""AYE"" ";A$: IF A$="AYE" THEN CLS : GO TO 10
6340 GO TO 6330
6370 PRINT "CONGRATULATIONS, CAPTAIN! THE","LAST KLINGON BATTLE CRUISER"
6380 PRINT "MENACING THE FEDERATION HAS","BEEN DESTROYED.": PRINT
6390 GO SUB 9750
6400 PRINT "YOUR EFFICIENCY RATING IS:",1000*(K7/(T-T0))^2: GO TO 6290
6420 REM SHORT SENSOR SCAN & STARTUP SUBROUTINE
6430 FOR I=S1-1 TO S1+1: FOR J=S2-1 TO S2+1
6450 IF INT (I+.5)<1 OR INT (I+.5)>8 OR INT (J+.5)<1 OR INT (J+.5)>8 THEN GO TO 6540
6490 LET A$="\j\k\l": LET Z1=I: LET Z2=J: GO SUB 8830: IF Z3=1 THEN GO TO 6580
6540 NEXT J: NEXT I: LET D0=0: GO TO 6650
6580 LET D0=1: LET C$="DOCKED": LET E=E0: LET P=P0
6585 IF SND=0 THEN GO TO 6620
6610 FOR M=1 TO 10: BEEP .025,60: NEXT M
6620 PRINT "SHIELDS DROPPED FOR DOCKING": LET S=0: PAUSE 100: GO TO 6720
6650 IF K3>0 THEN LET C$="*RED*": GO TO 6720
6660 LET C$="GREEN": IF E<E0*.1 THEN LET C$="YELLOW"
6720 IF D(2)>=0 THEN GO TO 6773
6730 PRINT : PRINT "* SHORT RANGE SENSORS ARE OUT *": LET SRS=0: PRINT
6770 PRINT ,,,,,, FLASH 1;"PRESS ""S"" KEY FOR STATUS REPORT,OR ANY OTHER KEY TO GIVE COMMAND": PAUSE 0: IF INKEY$="S" THEN GO TO 7890
6771 GO TO 1990
6773 LET SRS=0: GO SUB 9030: CLS : PRINT TAB 15-INT LEN G$/2;G$: PRINT L$;: FOR I=1 TO 8
6830 GO TO 6840+10+(I*50)
6900 PRINT " STARDATE ";INT (T*10)*.1: GO TO 7260
6950 PRINT " CONDITION ";C$: GO TO 7260
7000 PRINT " QUADRANT ";Q1;",";Q2: GO TO 7260
7050 PRINT " SECTOR ";S1;",";S2: GO TO 7260
7100 PRINT " PHOTON TORPEDOES ";INT (P): GO TO 7260
7150 PRINT " TOTAL ENERGY ";INT (E+S): GO TO 7260
7200 PRINT " SHIELDS ";INT (S): GO TO 7260
7250 PRINT " KLINGONS LEFT ";INT (K9)
7260 NEXT I: PRINT L$
7265 PRINT " 1 2 3 4 5 6 7 8"
7267 PRINT S$
7269 IF SND=1 THEN BEEP .05,40
7270 FOR I=1 TO 8: PRINT I;: FOR J=(I-1)*24+1 TO (I-1)*24+22 STEP 3: PRINT Q$(J TO J+2);: IF J<(I-1)*24+22 THEN PRINT " ";
7275 NEXT J: PRINT : NEXT I: PRINT S$: RETURN
7280 REM LIBRARY COMPUTER CODE
7290 IF D(8)<0 THEN PRINT "COMPUTER DISABLED": GO TO 1990
7300 GO TO 7360
7320 INPUT "COMPUTER ACTIVE AND AWAITING YOUR COMMAND, SIR...";A: CLS : IF A<0 OR A>6 THEN GO TO 1990
7325 IF A<6 THEN GO TO 7350
7330 PRINT #0;"SOUND EFFECTS? (Y/N) ": PAUSE 0: IF INKEY$="N" THEN LET SND=0: POKE 23609,0: GO TO 1990
7350 PRINT : LET H8=1: GO TO 7351+A
7351 GO TO 7540
7352 GO TO 7900
7353 GO TO 8070
7354 GO TO 8500
7355 GO TO 8150
7356 GO TO 7400
7357 IF A=6 THEN LET SND=1: POKE 23609,25: GO TO 1990
7360 PRINT "FUNCTIONS AVAILABLE FROM LIBRARY-COMPUTER:"
7365 PRINT
7370 PRINT " 0 = CUMULATIVE GALACTIC RECORD"
7372 PRINT " 1 = STATUS REPORT"
7373 PRINT " 2 = PHOTON TORPEDO DATA"
7376 PRINT " 3 = STARBASE NAV DATA"
7378 PRINT " 4 = DIR/DIST CALCULATOR"
7380 PRINT " 5 = GALAXY ""REGION NAME"" MAP"
7385 PRINT " 6 = SOUND EFFECTS ON/OFF"
7387 PRINT : GO TO 7320
7390 REM SETUP TO CHANGE CUM GAL RECORD TO GALAXY MAP
7400 LET H8=0: LET G5=1: CLS : PRINT " THE GALAXY",,,: GO TO 7550
7530 REM CUM GALACTIC RECORD
7540 CLS
7544 PRINT "COMPUTER RECORD OF GALAXY FORQUADRANT ";Q1;",";Q2;" ";"""***""= UNMAPPED"
7546 PRINT FLASH 1;" (PRESS S TO STOP MAP.) ": FLASH 0
7550 PRINT " 1 2 3 4 5 6 7 8 "
7570 PRINT S$: FOR I=1 TO 8: PRINT I;: IF H8=0 THEN GO TO 7740
7630 FOR J=1 TO 8: IF INKEY$="S" THEN GO TO 1990
7633 IF SND=0 THEN GO TO 7635
7634 BEEP .005,24
7635 PLOT 8,8: DRAW 0,128: PLOT 36,8: DRAW 0,128: PLOT 68,8: DRAW 0,128: PLOT 100,8: DRAW 0,128: PLOT 130,8: DRAW 0,128: PLOT 164,8: DRAW 0,128: PLOT 196,8: DRAW 0,128: PLOT 230,8: DRAW 0,128
7700 LET A$=STR$ (Z(I,J)+1000)
7705 IF A$(2 TO )="000" THEN LET A$(2 TO )="***"
7710 PRINT A$(2 TO );: IF J<8 THEN PRINT " ";
7720 NEXT J:: GO TO 7850
7740 LET Z4=I: LET Z5=1: GO SUB 9030: LET J0=INT 8-LEN G$/2: PRINT TAB J0;G$;
7800 LET Z5=5: GO SUB 9030: LET J0=INT 24-LEN G$/2: PRINT TAB J0;G$
7850 PRINT S$: IF INKEY$="S" THEN GO TO 1990
7855 NEXT I: POKE 23692,6: PRINT " (YOU ARE IN QUADRANT ";Q1;",";Q2;")": PRINT : PRINT
7860 INPUT "DO YOU WANT A HARD COPY, SIR? (Y/N) (CHECK PRINTER FIRST.)";R$
7865 IF R$="Y" THEN COPY
7870 GO TO 1990
7890 REM STATUS REPORT
7900 CLS : PRINT "STATUS REPORT, SIR:",: LET X$(2)="": IF K9>1 THEN LET X$(2)="S"
7940 PRINT "KLINGON";X$(2)( TO 1);" LEFT: ";K9
7960 PRINT "MISSION MUST BE COMPLETED IN ";.1*INT ((T0+T9-T)*10);" STARDATES"
7970 LET X$(2)="S": IF B9<2 THEN LET X$(2)="": IF B9<1 THEN GO TO 8010
7980 PRINT "THE FEDERATION IS MAINTAINING ";B9;" STARBASE";X$(2)( TO 1);" IN THE GALAXY"
7985 PAUSE 100
7990 GO TO 5690
8005 GO SUB 9750
8010 PRINT " YOUR STUPIDITY HAS LEFT YOU ON YOUR OWN IN"
8020 PRINT " THE GALAXY. -- YOU HAVE NO STARBASES LEFT!": GO TO 5690
8060 REM TORPEDO, BASE NAV, D/D CALCULATOR
8070 IF K3<=0 THEN GO TO 4270
8080 LET X$(2)="": IF K3>1 THEN LET X$(2)="S"
8090 LET CLS=1: PRINT "FROM ENTERPRISE TO KLINGON",,,"BATTLE CRUISER";X$(2)
8100 LET H8=0: FOR I=1 TO 3: IF K(I,3)<=0 THEN GO TO 8480
8110 LET W1=K(I,1): LET X=K(I,2)
8120 LET C1=S1: LET A=S2: GO TO 8220
8150 LET CLS=1: PRINT "DIRECTION/DISTANCE CALCULATOR:",,,
8160 PRINT " YOU ARE AT",,," QUADRANT ";Q1;",";Q2;" SECTOR ";S1;",";S2
8170 INPUT AT 8,0;"PLEASE ENTER INITIAL COORDINATESX (THEN ENTER) Y (THEN ENTER) ";C1,A
8200 INPUT AT 10,0;"FINAL COORDINATES","X (THEN ENTER) Y (THEN ENTER) ";W1,X: CLS
8220 LET X=X-A: LET A=C1-W1: IF X<0 THEN GO TO 8350
8250 IF A<0 THEN GO TO 8410
8260 IF X>0 THEN GO TO 8280
8270 IF A=0 THEN LET C1=5: GO TO 8290
8280 LET C1=1
8290 IF ABS (A)<=ABS (X) THEN GO TO 8330
8310 PRINT ,,"DIRECTION =";C1+(((ABS (A)-ABS (X))+ABS (A))/ABS (A)): GO TO 8460
8330 PRINT ,,"DIRECTION =";C1+(ABS (A)/ABS (X)): GO TO 8460
8350 IF A>0 THEN LET C1=3: GO TO 8420
8360 IF X<>0 THEN LET C1=5: GO TO 8290
8410 LET C1=7
8420 IF ABS (A)>=ABS (X) THEN GO TO 8450
8430 PRINT ,,"DIRECTION =";C1+(((ABS (X)-ABS (A))+ABS (X))/ABS (X)): GO TO 8460
8450 PRINT ,,"DIRECTION =";C1+(ABS (X)/ABS (A))
8460 PRINT ,,"DISTANCE = ";SQR ((X*X)+(A*A)): IF H8=1 THEN GO TO 1990
8480 NEXT I: GO TO 1990
8500 LET CLS=1: IF B3<>0 THEN PRINT "FROM ENTERPRISE TO STARBASE:": LET W1=B4: LET X=B5: GO TO 8120
8510 PRINT ,,,,,,,,"SCIENCE OFFICER SPOCK REPORTS:",,," ""SIR, SENSORS SHOW NO"," STARBASES IN THIS QUADRANT!"
8520 GO TO 1990
8580 REM FIND EMPTY PLACE IN QUADRANT (FOR THINGS)
8590 LET R1=FN R(1): LET R2=FN R(1): LET A$=" ": LET Z1=R1: LET Z2=R2: GO SUB 8830: IF Z3=0 THEN GO TO 8590
8600 RETURN
8610 GO SUB 9750
8660 REM INSERT IN STRING ARRAY FOR QUADRANT
8670 LET S8=INT (Z2-.5)*3+INT (Z1-.5)*24+1
8675 IF LEN A$<>3 THEN PRINT FLASH 1;"ERROR": STOP
8680 IF S8=1 THEN LET Q$=A$+Q$(4 TO )
8690 IF S8=190 THEN LET Q$=Q$( TO 189)+A$
8700 LET Q$=Q$( TO S8-1)+A$+Q$(S8+3 TO ): RETURN
8780 REM PRINTS DEVICE NAME
8790 GO TO 8790+R1*2
8792 LET G$="WARP ENGINES": RETURN
8794 LET G$="SHORT RANGE SENSORS": RETURN
8796 LET G$="LONG RANGE SENSORS": RETURN
8798 LET G$="PHASER CONTROL": RETURN
8800 LET G$="PHOTON TUBES": RETURN
8802 LET G$="DAMAGE CONTROL": RETURN
8804 LET G$="SHIELD CONTROL": RETURN
8806 LET G$="LIBRARY-COMPUTER": RETURN
8820 REM STRING COMPARISON IN QUADRANT ARRAY
8830 LET Z1=INT (Z1+.5): LET Z2=INT (Z2+.5): LET S8=(Z2-1)*3+(Z1-1)*24+1: LET Z3=0
8890 IF Q$(S8 TO S8+2)<>A$ THEN RETURN
8900 LET Z3=1: RETURN
9010 REM **** QUADRANT NAME IN G$ FROMZ4,Z5 (=Q1,Q2) ****
9020 REM **** CALL WITH G5=1 TO GET REGION NAME ONLY ****
9030 IF Z5<=4 THEN GO TO 9030+(Z4*10)
9035 GO TO 9120
9040 LET G$="ANTARES": GO TO 9210
9050 LET G$="RIGEL": GO TO 9210
9060 LET G$="PROCYON": GO TO 9210
9070 LET G$="VEGA": GO TO 9210
9080 LET G$="CANOPUS": GO TO 9210
9090 LET G$="ALTAIR": GO TO 9210
9100 LET G$="SAGITTARIUS": GO TO 9210
9110 LET G$="POLLUX": GO TO 9210
9120 GO TO 9120+(Z4*10)
9130 LET G$="SIRIUS": GO TO 9210
9140 LET G$="DENEB": GO TO 9210
9150 LET G$="CAPELLA": GO TO 9210
9160 LET G$="BETELGUESE": GO TO 9210
9170 LET G$="ALDEBARAN": GO TO 9210
9180 LET G$="REGULUS": GO TO 9210
9190 LET G$="ARCTURUS": GO TO 9210
9200 LET G$="SPICA"
9210 IF G5<>1 THEN GO TO 9220+(Z5*10)
9220 RETURN
9230 LET G$=G$+" I": RETURN
9240 LET G$=G$+" II": RETURN
9250 LET G$=G$+" III": RETURN
9260 LET G$=G$+" IV": RETURN
9270 LET G$=G$+" I": RETURN
9280 LET G$=G$+" II": RETURN
9290 LET G$=G$+" III": RETURN
9300 LET G$=G$+" IV": RETURN
9490 CLS : PRINT AT 8,0;"ONE MOMENT, PLEASE... DEFINING THE GRAPHICS..."
9500 RESTORE 9500: DATA 0,255,127,127,2,1,31,7
9501 FOR M=0 TO 7: READ Z28: POKE USR "A"+M,Z28: NEXT M
9502 RESTORE 9502: DATA 0,240,241,255,79,156,254,252
9503 FOR M=0 TO 7: READ Z29: POKE USR "B"+M,Z29: NEXT M
9504 RESTORE 9504: DATA 0,112,254,255,255,112,0,0
9505 FOR M=0 TO 7: READ Z30: POKE USR "C"+M,Z30: NEXT M
9507: RESTORE 9507: DATA 0,24,63,60,24,0,0,0
9508 FOR M=0 TO 7: READ Z31: POKE USR "D"+M,Z31: NEXT M
9509 RESTORE 9509: DATA 0,3,255,0,0,0,0,0
9510 FOR M=0 TO 7: READ Z32: POKE USR "E"+M,Z32: NEXT M
9511 RESTORE 9511: DATA 56,240,224,248,48,240,254,254
9512 FOR M=0 TO 7: READ Z33: POKE USR "F"+M,Z33: NEXT M
9513 RESTORE 9513: DATA 0,0,0,0,255,0,0,0
9515 FOR M=0 TO 7: READ Z34: POKE USR "G"+M,Z34: NEXT M
9517 FOR M=0 TO 7: POKE USR "I"+M,16: NEXT M
9520 RESTORE 9520: DATA 24,189,255,165,165,255,189,24
9525 FOR M=0 TO 7: READ Z25: POKE USR "K"+M,Z25: NEXT M
9530 RESTORE 9530: DATA 129,64,63,210,82,63,64,129
9535 FOR M=0 TO 7: READ Z26: POKE USR "J"+M,Z26: NEXT M
9540 RESTORE 9540: DATA 129,2,252,75,74,252,2,129
9545 FOR M=0 TO 7: READ Z27: POKE USR "L"+M,Z27: NEXT M
9550 LET L$="--------------------------------": LET S$="________________________________"
9595 RETURN
9605 LET SND=1
9625 IF SND=1 THEN POKE 23609,25
9630 RETURN
9667 IF SND=0 THEN RETURN
9668 FOR Z=1 TO 20: BEEP .025,30: NEXT Z
9669 SOUND 7,62;8,15: FOR Z=50 TO 100: SOUND 0,Z: PAUSE 1: NEXT Z: SOUND 6,6;7,7;8,16;9,16;10,16;12,56;13,8: PAUSE 90: SOUND 8,0;9,0;10,0
9670 PAUSE 60: RETURN
9675 FOR Z=4 TO 1 STEP -1: BEEP .05,Z: NEXT Z: BEEP 1,0: BEEP 1.5,10: BEEP .5,9: BEEP .25,5: BEEP .25,2: BEEP .25,7: BEEP .75,12: BEEP .25,12: BEEP 1.5,16
9680 RETURN
9700 REM ***PHASOR FIRE****
9703 IF SND=0 THEN RETURN
9705 FOR M=30 TO 40
9710 BEEP .025,M
9715 NEXT M
9720 RETURN
9750 IF SND=0 THEN RETURN
9755 LET ZZ=RND*30: FOR M=ZZ TO ZZ+10: BEEP .025,M: NEXT M: RETURN
9800 FOR M=55 TO 60
9810 BEEP .025,M: NEXT M
9830 FOR M=60 TO 55 STEP -1
9840 BEEP .025,M: NEXT M
9899 RETURN
9900 REM *****SAVE ROUTINE******
9910 CLS : PRINT FLASH 1;AT 10,7;"SAVING ""STAR TREK"""
9920 SAVE "TREK" LINE 1990
9940 GO TO 1990
9950 CLS : PRINT FLASH 1;AT 10,7;"SAVING ""STAR TREK"""
9960 SAVE "TREK" LINE 1
9990 BEEP 2,30: STOP
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.



