--- title: "Star Trek" id: 51994 type: "computer_media" slug: "star-trek" url: "http://localhost/computer_media/star-trek/" markdown_url: "http://localhost/computer_media/star-trek.md" published_at: "2023-08-28T01:20:44+00:00" modified_at: "2026-03-30T21:45:49+00:00" author: "David Anderson" featured_image: url: "http://localhost/wp-content/uploads/2023/08/Star-Trek-command-screen.png" excerpt: "A fully playable Star Trek game with custom sprite graphics, synthesized sound effects, procedural galaxy generation, and a mid-game save feature awaits your command." category: - name: "Archived Media" slug: "archived-media" taxonomy: "category" url: "http://localhost/category/archived-media/" post_tag: - name: "Downloadable" slug: "downloadable" taxonomy: "post_tag" url: "http://localhost/tag/downloadable/" - name: "T.S. Services" slug: "t-s-services" taxonomy: "post_tag" url: "http://localhost/tag/t-s-services/" - name: "TS 2068" slug: "ts2068" taxonomy: "post_tag" url: "http://localhost/tag/ts2068/" model: - name: "Timex/Sinclair 2068" slug: "ts-2068" taxonomy: "model" url: "http://localhost/model/ts-2068/" indiv: - name: "Don Barnard" slug: "barnard-don" taxonomy: "indiv" url: "http://localhost/indiv/barnard-don/" - name: "James N. Brown" slug: "james-n-brown" taxonomy: "indiv" url: "http://localhost/indiv/james-n-brown/" - name: "Mike James" slug: "mike-james" taxonomy: "indiv" url: "http://localhost/indiv/mike-james/" genre: - name: "Game" slug: "game" taxonomy: "genre" url: "http://localhost/type/game/" media_contents: - id: 51212 title: "CATS Library Tape 1" type: "computer_media" url: "http://localhost/computer_media/cats-library-tape-1/" media_type: "Program" programmers: - name: "Don Barnard" slug: "barnard-don" taxonomy: "indiv" url: "http://localhost/indiv/barnard-don/" - name: "James N. Brown" slug: "james-n-brown" taxonomy: "indiv" url: "http://localhost/indiv/james-n-brown/" - name: "Mike James" slug: "mike-james" taxonomy: "indiv" url: "http://localhost/indiv/mike-james/" download_url: "https://archive.org/download/timex-sinclair-software-archive/Star%20Trek%20%28198x%29%28T.%20S.%20Services%29%28US%29%28TS2068%29%28Cassette%29.zip" producer_company: - id: 51967 title: "T. S. Services" type: "company" url: "http://localhost/company/t-s-services/" images: - url: "http://localhost/wp-content/uploads/2023/08/Star-Trek-command-screen.png" - url: "http://localhost/wp-content/uploads/2023/08/Star-Trek-open-screen.png" - url: "http://localhost/wp-content/uploads/2023/08/Star-Trek-incoming-mesg.png" - url: "http://localhost/wp-content/uploads/2023/08/Star-Trek.jpg" related_products: - id: 51968 title: "Star Trek" type: "product" url: "http://localhost/product/star-trek-3/" media_type_tags: "Game" --- # Star Trek 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: 1. Lines 1–35: Title screen, credits, UDG setup (via `GO SUB 9490`), and sound initialization (`GO SUB 9600`). 2. Lines 40–275: Optional multi-page instruction sequence with hardcopy (`COPY`) support at each page break. 3. Lines 276–1305: Variable initialization, galaxy generation, and mission briefing. 4. Lines 1310–3980: Main game loop — quadrant entry, movement, collision detection, and energy management. 5. Lines 4000–5490: Weapon systems: long-range sensors, phasers, and photon torpedoes. 6. Lines 5530–5980: Shield control and damage control subsystems. 7. Lines 6000–6420: Klingon firing, end-of-game conditions, and short-range sensor scan display. 8. Lines 7280–8520: Library computer (six options: galactic record, status, torpedo data, starbase nav, direction/distance calculator, region name map). 9. Lines 8580–8900: Quadrant string utilities — finding empty sectors, inserting objects, and comparing positions. 10. Lines 9010–9300: Quadrant name lookup using computed `GO TO`. 11. Lines 9490–9595: UDG definition and separator string initialization. 12. Lines 9600–9899: Sound effect subroutines. 13. 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 index `R1`. - Lines 9030/9120: `GO TO 9030+(Z4*10)` and `GO TO 9120+(Z4*10)` — select a star region name based on quadrant row, then `GO 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=1` or `S8=190` have already handled the edge cases at lines 8680–8690, resulting in a redundant (but harmless) string replacement. - Line 9507 has a stray colon (`9507:`) before `RESTORE 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. ## 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=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 "": 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 "": 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 " ": 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=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 ```