Post by dan1101 on Nov 24, 2021 7:42:34 GMT -5
If you do an internet search on the history of computer games, you will find a handful of games frequently mentioned as milestones in the early development of computers. Among these games are Spacewar!, Colossal Cave Adventure, and Star Trek.
Star Trek was written by a teen-aged California high school student named Michael Mayfield in 1971, years before personal/desktop computers existed. The game was widely circulated and modified by dozens of other programmers, at dozens of mostly academic computer centers. Eventually, it was expanded and modified by Bob Leedom in 1974, and his version was published by David Ahl in the million-selling book BASIC Computer Games in 1978. Leedom’s version was renamed Super Star Trek. It featured alphabetic rather than numeric commands and verbal responses from members of the Star Trek crew. Leedom’s version of Star Trek is the one I have ported to Liberty BASIC and present here.
In approaching this project, and as a learning exercise, I decided to spend the time to dig deep into the code and rewrite portions of the game engine to simplify, clarify, and untangle the spaghetti code. Some parts of the code were truly baffling, in particular the distance and direction calculator, which remains confusing, though more or less functional.
I did make one significant change in the way the game works. I changed the damage system to a much simpler percentile approach. The ship’s systems now operate on a damage scale of zero to 100 percent, with 100 being fully functional. Any system below 90 percent will not be fully operational. Other than this, the game plays very much like the original. I kept almost all of the player interface intact. I made one or two other minor modifications, but the experience of playing this version of Super Star Trek should be very close to the original game.
There may well still be bugs and glitches, and if so, please feel free to post corrections or contact me with your discoveries.
For any of you youngsters who are curious what a “computer game” was like in the early days of computing, try a game of Super Star Trek. You can read about the history of the game here: en.wikipedia.org/wiki/Star_Trek_(1971_video_game)
Cheers!
REM SUPER STARTREK - MAY 16,1978 - REQUIRES 24K MEMORY
REM
REM **** **** STAR TREK **** ****
REM **** SIMULATION OF A MISSION OF THE STARSHIP ENTERPRISE,
REM **** AS SEEN ON THE STAR TREK TV SHOW.
REM **** ORIGIONAL PROGRAM BY MIKE MAYFIELD, MODIFIED VERSION
REM **** PUBLISHED IN DEC'S "101 BASIC GAMES", BY DAVE AHL.
REM **** MODIFICATIONS TO THE LATTER (PLUS DEBUGGING) BY BOB
REM **** LEEDOM - APRIL & DECEMBER 1974,
REM **** WITH A LITTLE HELP FROM HIS FRIENDS . . .
REM **** COMMENTS, EPITHETS, AND SUGGESTIONS SOLICITED --
REM **** SEND TO: R. C. LEEDOM
REM **** WESTINGHOUSE DEFENSE & ELECTRONICS SYSTEMS CNTR.
REM **** BOX 746, M.S. 338
REM **** BALTIMORE, MD 21203
REM ****
REM **** CONVERTED TO MICROSOFT 8 K BASIC 3/16/78 BY JOHN GORDERS
REM **** LINE NUMBERS FROM VERSION STREK7 OF 1/12/75 PRESERVED AS
REM **** MUCH AS POSSIBLE WHILE USING MULTIPLE STATEMENTS PER LINE
REM **** SOME LINES ARE LONGER THAN 72 CHARACTERS; THIS WAS DONE
REM **** BY USING "?" INSTEAD OF "PRINT" WHEN ENTERING LINES
REM ****
REM %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
REM
REM Re-written for Liberty BASIC by Dan Sims October/November 2021
REM
REM %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
REM
REM Credit is given at the top of this listing to the original coders,
REM particularly to Mike Mayfield, the creator of the game. However, this program
REM is essentially a re-write of the game. I have kept most the user interface
REM and game play the same, while largely rebuilding the game engine to
REM take advantage of the power of a modern BASIC interpreter, unhindered by the
REM restrictions of trying to fit the game into 24K of memory.
REM I removed the line numbers and replaced them with comprehensible labels,
REM and re-named most of the variables to make the code easier to understand and debug.
REM
REM If you would like a copy of the original (1978) unaltered code, contact me on the
REM Liberty BASIC Community Forum, where I am "dan1101"
REM It is also available from numerous Retro Programming sites around the interwebs
REM Okay. Here we go!
GOSUB [SHOW.ASCII.ENTERPRISE]
K$=""
WHILE K$<>"Y" AND K$<>"N"
INPUT " WOULD YOU LIKE INSTRUCTIONS? (Y OR N)";K$
K$=LEFT$(UPPER$(K$),1)
WEND
IF K$="Y" THEN GOSUB [INSTRUCTIONS]
[New.Game]
RESTORE
Global I, SectROW, SectCOL
DIM Commands$(9), Systems$(8), Objects$(5), QuadNAME$(16), RomanNumeral$(4)
DIM G(8,8),C(9,2),K(3,3),N(3),Explored(8,8),Damage(8)
For I=1 to 9:Read In$:Commands$(I)=In$:Next I
For I=1 to 8:Read In$:Systems$(I)=In$:Next I
For I=1 to 5:Read In$:Objects$(I)=In$:Next I
For I=1 to 16:Read In$:QuadNAME$(I)=In$:Next I
For I=1 to 4:Read In$:RomanNumeral$(I)=In$:Next I
For I=1 to 9:For J=1 to 2: Read In:C(I,J)=In:Next J:Next I
For I=1 to 8:Damage(I)=100:Next I
MissionStartDate=INT(RND(1)*20+20)*100
Stardate=MissionStartDate
MissionLength=25+INT(RND(1)*10)
Docked=0
EnergyMAX=3000
Energy=EnergyMAX
TorpedoesMAX=10
Torpedoes=TorpedoesMAX
KlingonEnergy=200
Bases=0
Klingons=0
[Populate.Galaxy]
REM Location (quadrant and sector) of Enterprise is randomized
QuadROW=FNR(1)
QuadCOL=FNR(1)
SectROW=FNR(1)
SectCOL=FNR(1)
FOR I=1 TO 8
FOR J=1 TO 8
KlingonsLocal=0
Explored(I,J)=0
R1=RND(1)
IF R1>.80 THEN KlingonsLocal=1:Klingons=Klingons+1
IF R1>.95 THEN KlingonsLocal=KlingonsLocal+1:Klingons=Klingons+1
IF R1>.98 THEN KlingonsLocal=KlingonsLocal+1:Klingons=Klingons+1
BasesLocal=0
R1=RND(1)
IF R1>.95 THEN
BasesLocal=1
Bases=Bases+1
END IF
REM Add from 1 to 8 stars to each quadrant
StarsLocal=FNR(1)
REM Create three-digit Code for this quadrant in galactic matrix
G(I,J)=KlingonsLocal*100+BasesLocal*10+StarsLocal
NEXT J
NEXT I
REM If there are too many total Klingons in Galaxy, extend Mission time
IF Klingons>=MissionLength THEN MissionLength=Klingons+1
REM Guarantee at least two Starbases in Galaxy
WHILE Bases<2
BaseROW=FNR(1)
BaseCOL=FNR(1)
IF G(BaseROW,BaseCOL)<10 THEN
G(BaseROW,BaseCOL)=G(BaseROW,BaseCOL)+10
Bases=Bases+1
END IF
WEND
InitialKlingons=Klingons
Shields=0
[Mission.Briefing]
Plural$=""
PluralWord$=" IS "
IF Bases>1 THEN
Plural$="S"
PluralWord$=" ARE "
End If
PRINT
PRINT" STARDATE: ";Stardate
PRINT
PRINT" YOUR ORDERS ARE AS FOLLOWS:"
PRINT
PRINT" DESTROY THE ";Klingons;" KLINGON WARSHIPS WHICH HAVE INVADED"
PRINT" THE GALAXY BEFORE THEY CAN ATTACK FEDERATION HEADQUARTERS"
PRINT" ON STARDATE ";MissionStartDate+MissionLength;" THIS GIVES YOU ";MissionLength;" DAYS. THERE";PluralWord$
PRINT" ";Bases;" STARBASE";Plural$;" IN THE GALAXY FOR RESUPPLYING YOUR SHIP"
PRINT
Gosub [New.Quadrant]
[Top.Loop]
Gosub [Check.For.Victory.Or.Failure]
Gosub [Check.If.Docked]
Gosub [Short.Range.Sensors]
PRINT
JumpEnergy=0
A$=""
INPUT" COMMAND ";A$
A$=LEFT$(UPPER$(A$),3)
Command=0
FOR Count=1 TO 9
IF A$=Commands$(Count) then Command=Count
Next Count
SELECT CASE Command
CASE 1: Gosub [Navigation]
CASE 2: Gosub [Short.Range.Sensors]
CASE 3: Gosub [Long.Range.Sensors]
CASE 4: Gosub [Phaser.Control]
CASE 5: Gosub [Photon.Torpedoes]
CASE 6: Gosub [Shield.Control]
CASE 7: Gosub [Damage.Control.Report]
CASE 8: Gosub [Library.Computer]
CASE 9: GOTO [Failure]
END SELECT
If Command<1 OR Command>9 THEN
PRINT
PRINT" <<< ENTER ONE OF THE FOLLOWING: >>>"
PRINT
PRINT" NAV (TO SET COURSE)"
PRINT" SRS (FOR SHORT RANGE SENSOR SCAN)"
PRINT" LRS (FOR LONG RANGE SENSOR SCAN)"
PRINT" PHA (TO FIRE PHASERS)"
PRINT" TOR (TO FIRE PHOTON TORPEDOES)"
PRINT" SHE (TO RAISE OR LOWER SHIELDS)"
PRINT" DAM (FOR DAMAGE CONTROL REPORTS)"
PRINT" COM (TO CALL ON LIBRARY-COMPUTER)"
PRINT" XXX (TO RESIGN YOUR COMMAND)"
PRINT
End If
Goto [Top.Loop]
[Navigation]
Print
Print " 4 3 2"
Print " \ | /"
Print " ..."
Print " 5 ---*--- 1"
Print " ..."
Print " / | \"
Print " 6 7 8"
Print
INPUT" COURSE (0-9) ";Course
IF Course=9 THEN Course=1
IF Course<1 OR Course>9 THEN
PRINT" LT. SULU REPORTS, 'INCORRECT COURSE DATA, SIR!'"
Return
End If
MaxWarp$="8"
IF Damage(1)<90 THEN MaxWarp$="0.2"
PRINT" WARP FACTOR (0-";MaxWarp$;") ? ";
INPUT Warp
IF Warp<=0 THEN Return
IF Damage(1)<90 AND Warp>.2 THEN
PRINT
PRINT" WARP ENGINES ARE DAMAGED. ONLY IMPULSE ENGINES ARE"
PRINT" AVAILABLE FOR MOVEMENT. (MAXIUM SPEED = WARP 0.2)"
PRINT
Return
End If
IF Warp>8 THEN
PRINT
PRINT" CHIEF ENGINEER SCOTT REPORTS 'THE ENGINES WON'T TAKE";
PRINT" WARP ";Warp;"!'"
PRINT
Return
End If
REM Strategy Spoiler Alert:
REM Each time you move, regardless of distance, there is a 33% chance
REM one or more of the ships damaged systems may be repaired, at least partially.
REM If you are badly damaged, make small movements within the quadrant
REM until damaged systems eventually come back on line.
If RND(1)> 0.33 then Gosub [Damage.Repair]
JumpEnergy=INT((Warp*8)+0.5)
IF (Energy-JumpEnergy)<0 THEN
PRINT" ENGINEERING REPORTS 'INSUFFICIENT ENERGY AVAILABLE"
PRINT" FOR MANEUVERING AT WARP ";Warp;"!'"
PRINT
IF Shields<(JumpEnergy-Energy) OR Damage(7)<90 THEN Return
PRINT" DEFLECTOR CONTROL ROOM ACKNOWLEDGES ";Shields;" UNITS OF ENERGY"
PRINT" PRESENTLY DEPLOYED TO SHIELDS."
Return
End If
A$=" "
Z1=INT(SectROW)
Z2=INT(SectCOL)
GOSUB [Insert.A$.in.Quadrant$]
X1=C(INT(Course),1)+(C(INT(Course)+1,1)-C(INT(Course),1))*(Course-INT(Course))
X2=C(INT(Course),2)+(C(INT(Course)+1,2)-C(INT(Course),2))*(Course-INT(Course))
X=SectROW
Y=SectCOL
Q4=QuadROW
Q5=QuadCOL
Collision=0
FOR I = 1 to JumpEnergy
SectROW=SectROW+X1
SectCOL=SectCOL+X2
IF SectROW<1 OR SectROW>=9 OR SectCOL<1 OR SectCOL>=9 THEN
Gosub [Exceeded.Quadrant]
Return
End If
S8=INT(SectROW)*24+(INT(SectCOL)*3)-26
IF MID$(Quadrant$,S8,2)<>" " THEN
Collision=1
SectROW=INT(SectROW-X1)
SectCOL=INT(SectCOL-X2)
PRINT" WARP ENGINES SHUT DOWN AT ";
PRINT" SECTOR ";SectROW;",";SectCOL;" DUE TO BAD NAVAGATION"
Hit=100*RND(1)+50
ChanceOfDamage=0.3
Gosub [Check.For.Damaged.Systems]
Gosub [Move.Enterprise]
Gosub [Klingons.Moving]
Gosub [Klingons.Firing]
Return
End If
NEXT I
Gosub [Move.Enterprise]
Gosub [Klingons.Moving]
Gosub [Klingons.Firing]
Return
[Move.Enterprise]
A$="<*>"
Z1=INT(SectROW)
Z2=INT(SectCOL)
GOSUB [Insert.A$.in.Quadrant$]
GOSUB [Energy.Expended]
T8=1
IF Warp<1 THEN T8=0.1*INT(10*Warp)
Stardate=Stardate+T8
Gosub [Check.For.Victory.Or.Failure]
Return
[Check.For.Damaged.Systems]
If RND(1)<=ChanceOfDamage THEN
PRINT
PRINT" DAMAGE CONTROL REPORTS NO DAMAGE"
PRINT
Return
End If
R1=FNR(1)
If Collision=0 then
Distance=FND(1)
ELSE
Distance=1
End If
NewDamage=(Hit*(1/Distance))+Hit*(Hit/(Shields+1))
If NewDamage>100 then NewDamage=100
If NewDamage<0 then NewDamage=0
Damage(R1)=INT(Damage(R1)-NewDamage)
If Damage(R1)<0 then Damage(R1)=0
G2$=Systems$(R1)
PRINT
PRINT" ** DAMAGE CONTROL REPORTS: ";G2$;" NOW AT ";INT(Damage(R1));"% **"
PRINT
Return
[Damage.Repair]
For I=1 to 8
If Damage(I)<90 then
Damage(I)=Damage(I)+RND(1)*40
If Damage(I)>=100 then
Damage(I)=100
PRINT " DAMAGE CONTROL REPORTS: ";Systems$(I);" NOW FULLY REPAIRED"
ELSE
PRINT " DAMAGE CONTROL REPORT: ";Systems$(I);" IMPROVED TO ";INT(Damage(I));"%"
End If
End If
Next I
Return
[Exceeded.Quadrant]
X=8*QuadROW+X+JumpEnergy*X1
Y=8*QuadCOL+Y+JumpEnergy*X2
QuadROW=INT(X/8)
QuadCOL=INT(Y/8)
SectROW=INT(X-QuadROW*8)
SectCOL=INT(Y-QuadCOL*8)
IF SectROW=0 THEN QuadROW=QuadROW-1:SectROW=8
IF SectCOL=0 THEN QuadCOL=QuadCOL-1:SectCOL=8
PerimeterFlag=0
IF QuadROW<1 THEN PerimeterFlag=1:QuadROW=1:SectROW=1
IF QuadROW>8 THEN PerimeterFlag=1:QuadROW=8:SectROW=8
IF QuadCOL<1 THEN PerimeterFlag=1:QuadCOL=1:SectCOL=1
IF QuadCOL>8 THEN PerimeterFlag=1:QuadCOL=8:SectCOL=8
IF PerimeterFlag=1 THEN
PRINT
PRINT" LT. UHURA REPORTS MESSAGE FROM STARFLEET COMMAND:"
PRINT" 'PERMISSION TO ATTEMPT CROSSING OF GALACTIC PERIMETER"
PRINT" IS HEREBY *DENIED*. SHUT DOWN YOUR ENGINES.'"
PRINT
PRINT" CHIEF ENGINEER SCOTT REPORTS 'WARP ENGINES SHUT DOWN"
PRINT" AT SECTOR ";SectROW;", ";SectCOL;" OF QUADRANT ";QuadROW;", ";QuadCOL;".'"
PRINT
End If
IF 8*QuadROW+QuadCOL=8*Q4+Q5 THEN
Gosub [Move.Enterprise]
End If
Stardate=Stardate+1
Gosub [Check.For.Victory.Or.Failure]
GOSUB [Energy.Expended]
Gosub [New.Quadrant]
Return
[Energy.Expended]
Energy=(Energy-JumpEnergy)-10
IF Energy>=0 THEN RETURN
PRINT" SHIELD CONTROL SUPPLIES ENERGY TO COMPLETE THE MANEUVER."
REM Can only arrive here if Energy is a NEGATIVE number
Shields=Shields+Energy: REM Energy shortfall is taken from Shields
REM A NEGATIVE Energy number is ADDED to Shields
Energy=0
IF Shields<0 THEN Shields=0
RETURN
[New.Quadrant]
REM New quadrant is created when Enterprise enters
Docked=0
Collision=0
Z4=QuadROW
Z5=QuadCOL
KlingonsLocal=0
BasesLocal=0
StarsLocal=0
Explored(QuadROW,QuadCOL)=G(QuadROW,QuadCOL)
QuadName=Z4
If Z5>4 then QuadName=QuadName+8
G2$=QuadNAME$(QuadName)
AddNumeralFlag=1
Gosub [Append.Numeral]
PRINT
IF MissionStartDate=Stardate THEN
PRINT" YOUR MISSION BEGINS WITH YOUR STARSHIP LOCATED"
PRINT" IN THE GALACTIC QUADRANT, '";G2$;"'."
ELSE
PRINT" NOW ENTERING ";G2$;" QUADRANT . . ."
END IF
FOR I=1 TO 3
K(I,1)=0
K(I,2)=0
K(I,3)=0
NEXT I
REM Extracting number of Klingons, Bases, and Stars from Galactic Matrix G(QuadROW,QuadCOL)
PRINT
KlingonsLocal=INT(G(QuadROW,QuadCOL)*.01)
BasesLocal=INT(G(QuadROW,QuadCOL)*.1)-10*KlingonsLocal
StarsLocal=G(QuadROW,QuadCOL)-100*KlingonsLocal-10*BasesLocal
IF KlingonsLocal>0 THEN
PRINT
PRINT" *** COMBAT AREA *** CONDITION RED ***"
IF Shields<200 THEN PRINT" ***** SHIELDS DANGEROUSLY LOW *****"
PRINT
END IF
[Create.Local.Quadrant.String]
Quadrant$=Space$(192)
REM Enterprise is placed in quadrant first, other contents scattered around it
A$="<*>"
Z1=SectROW
Z2=SectCOL
GOSUB [Insert.A$.in.Quadrant$]
IF KlingonsLocal>0 THEN
FOR I=1 TO KlingonsLocal
GOSUB [Find.Empty.Sector]
REM R1 is row and R2 is column of an empty sector found by [Find.Empty.Sector]
A$="+K+"
Z1=R1
Z2=R2
GOSUB [Insert.A$.in.Quadrant$]
K(I,1)=R1
K(I,2)=R2
K(I,3)=KlingonEnergy*(0.5+RND(1))
NEXT I
End If
IF BasesLocal>0 THEN
GOSUB [Find.Empty.Sector]
A$=">!<"
Z1=R1
Z2=R2
BaseROW=R1
BaseCOL=R2
GOSUB [Insert.A$.in.Quadrant$]
End If
FOR I=1 TO StarsLocal
GOSUB [Find.Empty.Sector]
A$=" * "
Z1=R1
Z2=R2
GOSUB [Insert.A$.in.Quadrant$]
NEXT I
Return
[Long.Range.Sensors]
IF Damage(3)<90 THEN
PRINT" LONG RANGE SENSORS ARE INOPERABLE"
Return
End If
PRINT" LONG RANGE SCAN FOR QUADRANT ";QuadROW;",";QuadCOL
O1$=" -------------------"
PRINT O1$
PRINT" ";
FOR I=QuadROW-1 TO QuadROW+1
N(1)=-1
N(2)=-2
N(3)=-3
FOR J=QuadCOL-1 TO QuadCOL+1
IF I>0 AND I<9 AND J>0 AND J<9 THEN
N(J-QuadCOL+2)=G(I,J)
Explored(I,J)=G(I,J)
End If
NEXT J
FOR L=1 TO 3
PRINT": ";
IF N(L)<0 THEN
PRINT"*** ";
ELSE
PRINT RIGHT$(STR$(N(L)+1000),3);" ";
End If
NEXT L
PRINT":"
PRINT O1$
PRINT" ";
NEXT I
Return
[Phaser.Control]
IF Damage(4)<90 THEN
PRINT" PHASERS INOPERATIVE"
Return
End If
IF KlingonsLocal=0 THEN
Gosub[No.Klingons.Here]
Return
End If
IF Damage(8)<90 THEN PRINT" COMPUTER FAILURE HAMPERS ACCURACY"
PRINT" PHASERS LOCKED ON TARGET; ";
[Input.Phaser.Power]
PRINT" ENERGY AVAILABLE = ";Energy;" UNITS"
INPUT" NUMBER OF UNITS TO FIRE ";Phasers
IF Phasers<=0 THEN Return
IF Energy-Phasers<0 THEN Goto [Input.Phaser.Power]
Energy=Energy-Phasers
IF Damage(7)<90 THEN
PRINT " DAMAGE TO SHIELD CONTROL INTERFERES WITH PHASER POWER"
Phasers=Phasers*RND(1)
End If
H1=INT(Phasers/KlingonsLocal)
FOR I=1 TO 3
IF K(I,3)>0 THEN
Hit=INT((H1/FND(0))*(RND(1)+2))
IF Hit<=.15*K(I,3) THEN
PRINT" SENSORS SHOW NO DAMAGE TO ENEMY AT ";K(I,1);",";K(I,2)
PRINT" KLINGON'S SHIELDS ABSORBED THE DAMAGE"
ELSE
K(I,3)=K(I,3)-Hit
PRINT
PRINT " ";Hit;" UNIT HIT ON KLINGON AT SECTOR ";K(I,1);",";K(I,2)
IF K(I,3)<=0 THEN
PRINT
PRINT" *** KLINGON DESTROYED ***"
PRINT
Gosub [Check.For.Victory.Or.Failure]
KlingonsLocal=KlingonsLocal-1
Klingons=Klingons-1
Z1=K(I,1)
Z2=K(I,2)
A$=" "
GOSUB [Insert.A$.in.Quadrant$]
K(I,3)=0
G(QuadROW,QuadCOL)=G(QuadROW,QuadCOL)-100
Explored(QuadROW,QuadCOL)=G(QuadROW,QuadCOL)
ELSE
PRINT
PRINT" (SENSORS SHOW ";INT(K(I,3));" UNITS REMAINING)"
End If
End If
End If
NEXT I
GOSUB [Klingons.Firing]
Return
[No.Klingons.Here]
PRINT
PRINT" SCIENCE OFFICER SPOCK REPORTS 'SENSORS SHOW NO ENEMY SHIPS"
PRINT" IN THIS QUADRANT'"
PRINT
RETURN
[Photon.Torpedoes]
IF Torpedoes<1 THEN PRINT" ALL PHOTON TORPEDOES EXPENDED":Return
IF Damage(5)<90 THEN PRINT" PHOTON TUBES ARE NOT OPERATIONAL":Return
IF KlingonsLocal=0 THEN
Gosub [No.Klingons.Here]
Return
End If
PRINT
Print " 4 3 2"
Print " \ | /"
Print " ..."
print " 5 ---*--- 1"
Print " ..."
Print " / | \"
Print " 6 7 8"
Print
INPUT" PHOTON TORPEDO COURSE (1-9) ";Trajectory
IF Trajectory=9 THEN Trajectory=1
IF Trajectory<1 or Trajectory>=9 THEN
PRINT
PRINT" ENSIGN CHEKOV REPORTS, 'INCORRECT COURSE DATA, SIR!'"
PRINT
Return
End If
Collision=0
Gosub [Track.Torpedo]
If Collision=0 then
Print " TORPEDO MISSED"
ELSE
Target=0
Gosub [What.Was.Hit]
SELECT CASE Target
CASE 1:Gosub [Klingon.Was.Hit]
CASE 2:Gosub [Star.Was.Hit]
CASE 3:Gosub [Starbase.Was.Hit]
End Select
End If
Gosub [Klingons.Moving]
Gosub [Klingons.Firing]
Return
[Track.Torpedo]
X1=C(INT(Trajectory),1)+(C(INT(Trajectory)+1,1)-C(INT(Trajectory),1))*(Trajectory-INT(Trajectory))
X2=C(INT(Trajectory),2)+(C(INT(Trajectory)+1,2)-C(INT(Trajectory),2))*(Trajectory-INT(Trajectory))
Energy=Energy-2
Torpedoes=Torpedoes-1
X=SectROW
Y=SectCOL
PRINT" TORPEDO TRACK:"
Missed=0
WHILE Collision=0 AND Missed=0
X=X+X1
Y=Y+X2
X3=INT(X+.5)
Y3=INT(Y+.5)
IF X3<1 OR X3>8 OR Y3<1 OR Y3>8 THEN
Missed=1
ELSE
PRINT" ";X3;",";Y3
A$=" "
Z1=X3
Z2=Y3
GOSUB [Look.For.A$.In.Quadrant$]
Collision=1-Found
End If
WEND
Return
[What.Was.Hit]
Z1=X3
Z2=Y3
For Object=1 to 3
A$=Objects$(Object)
Gosub [Look.For.A$.In.Quadrant$]
If Found=1 then Target=Object
Next Object
Return
[Klingon.Was.Hit]
PRINT" *** KLINGON DESTROYED ***"
KlingonsLocal=KlingonsLocal-1
Klingons=Klingons-1
Gosub [Check.For.Victory.Or.Failure]
REM Determine WHICH Klingon was hit
FOR Kling=1 TO 3
IF X3=K(Kling,1) AND Y3=K(Kling,2) THEN
Gosub [Delete.Object.At.X3.Y3]
K(Kling,1)=0
K(Kling,2)=0
K(Kling,3)=0
End If
NEXT Kling
Return
[Star.Was.Hit]
PRINT
PRINT" STAR AT ";X3;",";Y3;" ABSORBED TORPEDO ENERGY."
Return
[Starbase.Was.Hit]
PRINT
PRINT" *** STARBASE DESTROYED ***"
BasesLocal=BasesLocal-1
Bases=Bases-1
Gosub [Check.For.Victory.Or.Failure]
PRINT
PRINT" STARFLEET COMMAND IS REVIEWING YOUR RECORD TO CONSIDER"
PRINT" COURT MARTIAL!"
Docked=0
Gosub [Delete.Object.At.X3.Y3]
Return
[Delete.Object.At.X3.Y3]
Z1=X3
Z2=Y3
A$=" "
GOSUB [Insert.A$.in.Quadrant$]
G(QuadROW,QuadCOL)=KlingonsLocal*100+BasesLocal*10+StarsLocal
Explored(QuadROW,QuadCOL)=G(QuadROW,QuadCOL)
Return
[Shield.Control]
IF Damage(7)<90 THEN
PRINT" SHIELD CONTROL INOPERABLE"
Return
End If
PRINT" ENERGY AVAILABLE = ";Energy+Shields;
INPUT" NUMBER OF UNITS TO SHIELDS ";NewShields
IF NewShields<0 OR Shields=NewShields THEN
PRINT" <SHIELDS UNCHANGED>"
Return
End If
IF NewShields>=Energy+Shields THEN
PRINT
PRINT" SHIELD CONTROL REPORTS 'THIS IS NOT THE FEDERATION TREASURY.'"
PRINT" <SHIELDS UNCHANGED>"
PRINT
Return
End If
Energy=Energy+Shields-NewShields
Shields=NewShields
PRINT
PRINT" DEFLECTOR CONTROL ROOM REPORT:"
PRINT" 'SHIELDS NOW AT ";INT(Shields);" UNITS PER YOUR COMMAND.'"
PRINT
Return
[Damage.Control.Report]
If Damage(6)<90 AND Docked=0 then
PRINT
PRINT" DAMAGE CONTROL REPORT NOT AVAILABLE"
PRINT
RETURN
End If
PRINT
PRINT" DEVICE STATE OF REPAIR"
FOR DamageList=1 TO 8
G2$=Systems$(DamageList)
PRINT" ";
PRINT G2$;Space$(25-LEN(G2$));INT(Damage(DamageList));"%"
NEXT DamageList
PRINT
RETURN
[Check.For.Needed.Repairs]
RepairTime=0
FOR I=1 TO 8
IF Damage(I)<90 THEN RepairTime=RepairTime+.1
NEXT I
IF RepairTime=0 THEN Return
Gosub [Damage.Control.Report]
RepairTime=RepairTime+.5*RND(1)
IF RepairTime>=1 THEN RepairTime=.9
PRINT
PRINT" TECHNICIANS STANDING BY TO EFFECT REPAIRS TO YOUR SHIP;"
PRINT" ESTIMATED TIME TO REPAIR: ";.01*INT(100*RepairTime);" STARDATES"
INPUT " WILL YOU AUTHORIZE THE REPAIR ORDER (Y/N) ";A$:A$=LEFT$(UPPER$(A$),1)
IF A$<>"Y" THEN Return
FOR I=1 TO 8
Damage(I)=100
NEXT I
Stardate=Stardate+RepairTime+.1
Return
[Klingons.Moving]
FOR Klings=1 TO KlingonsLocal
IF K(Klings,3)>0 THEN
A$=" "
Z1=K(Klings,1)
Z2=K(Klings,2)
GOSUB [Insert.A$.in.Quadrant$]
GOSUB [Find.Empty.Sector]
K(Klings,1)=Z1
K(Klings,2)=Z2
A$="+K+"
GOSUB [Insert.A$.in.Quadrant$]
End If
NEXT Klings
Return
[Klingons.Firing]
IF KlingonsLocal<=0 THEN RETURN
IF Docked=1 THEN
PRINT" STARBASE SHIELDS PROTECT THE ENTERPRISE"
RETURN
End If
FOR I=1 TO 3
IF K(I,3)>0 THEN
Hit=INT((K(I,3)/FND(1))*(2+RND(1)))
K(I,3)=K(I,3)-(K(I,3)/(3+RND(1)))
PRINT
PRINT " ";Hit;" UNIT HIT ON ENTERPRISE FROM SECTOR ";K(I,1);",";K(I,2)
Shields=Shields-Hit
Gosub [Check.For.Victory.Or.Failure]
PRINT
PRINT" <SHIELDS DOWN TO ";Shields;" UNITS>"
IF Hit>=20 THEN
ChanceOfDamage=0.15
Gosub [Check.For.Damaged.Systems]
End If
End If
NEXT I
RETURN
[Check.If.Docked]
Docked=0
A$=">!<"
FOR I=SectROW-1 TO SectROW+1
FOR J=SectCOL-1 TO SectCOL+1
If I<0 or I>8 or J<0 or J>8 then [Out.Of.Sector]
REM Thanks Anatoly!
Z1=I
Z2=J
GOSUB [Look.For.A$.In.Quadrant$]
IF Found=1 THEN Docked=1
[Out.Of.Sector]
NEXT J
NEXT I
[Yes.Docked]
If Docked=0 then AlreadyDocked=0
If Docked=1 then
C$="DOCKED"
If AlreadyDocked=0 then
Shields=0
Energy=EnergyMAX
Torpedoes=TorpedoesMAX
End If
PRINT
PRINT " *** ENTERPRISE IS DOCKED AT STARBASE (SECTOR ";INT(SectROW);",";INT(SectCOL);") ***"
If AlreadyDocked=0 then PRINT" *** SHIELDS DROPPED FOR DOCKING PURPOSES ***"
Gosub [Check.For.Needed.Repairs]
AlreadyDocked=1
End If
Return
[Short.Range.Sensors]
IF Damage(2)<90 THEN
PRINT
PRINT" *** SHORT RANGE SENSORS ARE OUT ***"
PRINT
RETURN
End If
C$="GREEN"
IF Energy<EnergyMAX*.1 THEN C$="YELLOW"
IF KlingonsLocal>0 THEN C$="*RED*"
AddNumeralFlag=1
Z4=QuadROW
Z5=QuadCOL
QuadName=Z4
If Z5>4 then QuadName=QuadName+8
G2$=QuadNAME$(QuadName)
Gosub [Append.Numeral]
PRINT
PRINT" SHORT RANGE SENSOR SCAN FOR QUADRANT ";G2$
O1$=" ---------------------------------":PRINT O1$
FOR Count=1 TO 8
FOR J=(Count-1)*24+1 TO (Count-1)*24+22 STEP 3
PRINT" ";MID$(Quadrant$,J,3);
NEXT J
SELECT CASE Count
CASE 1: PRINT" STARDATE ";INT(Stardate*10)*.1
CASE 2: PRINT" CONDITION ";C$
CASE 3: PRINT" QUADRANT ";INT(QuadROW);",";INT(QuadCOL)
CASE 4: PRINT" SECTOR ";INT(SectROW);",";INT(SectCOL)
CASE 5: PRINT" PHOTON TORPEDOES ";INT(Torpedoes)
CASE 6
PRINT" TOTAL ENERGY ";
If Docked=1 then
PRINT EnergyMAX
ELSE
PRINT INT(Energy+Shields)
End If
CASE 7: PRINT" SHIELDS ";INT(Shields)
CASE 8: PRINT" KLINGONS REMAINING ";INT(Klingons)
END SELECT
NEXT Count
PRINT O1$
RETURN
[Library.Computer]
IF Damage(8)<90 THEN
PRINT" COMPUTER DISABLED"
Return
End If
PRINT
PRINT" 0 = CUMULATIVE GALACTIC RECORD"
PRINT" 1 = STATUS REPORT"
PRINT" 2 = PHOTON TORPEDO DATA"
PRINT" 3 = STARBASE NAV DATA"
PRINT" 4 = DIRECTION/DISTANCE CALCULATOR"
PRINT" 5 = GALAXY 'REGION NAME' MAP"
PRINT
CompCommand=0
INPUT" COMPUTER ACTIVE AND AWAITING COMMAND ";CompCommand
CompCommand=INT(CompCommand)
IF CompCommand<0 OR CompCommand>5 THEN
PRINT
PRINT " UNRECOGNIZED COMPUTER INSTRUCTION"
Return
END IF
SELECT CASE CompCommand
CASE 0
NamesOnlyFlag=0
Gosub [Display.Galactic.Chart]
CASE 1: Gosub [Status.Report]
CASE 2: Gosub [Torpedo.Calculator]
CASE 3: Gosub [Starbase.Calculator]
CASE 4: Gosub [Point.To.Point.Calculator]
CASE 5
NamesOnlyFlag=1
Gosub [Display.Galactic.Chart]
END SELECT
Return
[Display.Galactic.Chart]
If NamesOnlyFlag=0 then
PRINT
PRINT" COMPUTER RECORD OF GALAXY FOR QUADRANT ";QuadROW;",";QuadCOL
PRINT
ELSE
PRINT
PRINT" THE GALAXY"
End If
PRINT" 1 2 3 4 5 6 7 8"
O1$=" ----- ----- ----- ----- ----- ----- ----- -----"
PRINT O1$
FOR I=1 TO 8:PRINT " ";I;
IF NamesOnlyFlag=1 THEN
Z4=I
Z5=1
G2$=QuadNAME$(Z4)
J0=INT(15-.5*LEN(G2$))
PRINT TAB(J0);" ";G2$;
G2$=QuadNAME$(Z4+8)
J0=INT(39-.5*LEN(G2$))
PRINT TAB(J0);" ";G2$;
ELSE
FOR J=1 TO 8
PRINT" ";
IF Explored(I,J)=0 THEN
PRINT"***";
ELSE
PRINT RIGHT$(STR$(Explored(I,J)+1000),3);
End If
NEXT J
End If
PRINT
PRINT O1$
NEXT I
PRINT
Return
[Status.Report]
PRINT
PRINT " STATUS REPORT:"
PRINT
Plural$=""
IF Klingons>1 THEN Plural$="S"
PRINT" KLINGON";Plural$;" LEFT: ";Klingons
PRINT" MISSION MUST BE COMPLETED IN ";INT((MissionStartDate+MissionLength-Stardate)*10)/10;" STARDATES"
Plural$=""
IF Bases>1 THEN Plural$="S"
IF Bases<1 THEN
PRINT" YOUR STUPIDITY HAS LEFT YOU ON YOUR ON IN"
PRINT" THE GALAXY -- YOU HAVE NO STARBASES LEFT!"
ELSE
PRINT" THE FEDERATION IS MAINTAINING ";Bases;" STARBASE";Plural$;" IN THE GALAXY"
End If
GOSUB [Damage.Control.Report]
Return
[Torpedo.Calculator]
IF KlingonsLocal=0 THEN
Gosub[No.Klingons.Here]
Return
End If
Plural$=""
IF KlingonsLocal>1 THEN Plural$="S"
PRINT" FROM ENTERPRISE TO KLINGON BATTLE CRUSER";Plural$;": "
FOR Klingy=1 TO 3
IF K(Klingy,3)>0 THEN
Row=SectROW
Column=SectCOL
TargetRow=K(Klingy,1)
TargetColumn=K(Klingy,2)
Gosub [Calculate.Distance.And.Direction]
End If
Next Klingy
Return
[Starbase.Calculator]
IF BasesLocal>0 THEN
PRINT" FROM ENTERPRISE TO STARBASE: "
Row=SectROW
Column=SectCOL
TargetRow=BaseROW
TargetColumn=BaseCOL
Gosub [Calculate.Distance.And.Direction]
ELSE
PRINT
PRINT" MR. SPOCK REPORTS, 'SENSORS SHOW NO STARBASES IN THIS QUADRANT.'"
PRINT
End If
Return
[Point.To.Point.Calculator]
PRINT
PRINT" DIRECTION/DISTANCE CALCULATOR:"
PRINT" YOU ARE AT SECTOR ";SectROW;",";SectCOL
PRINT
PRINT" PLEASE ENTER:"
INPUT" INITIAL COORDINATE ROW: ";Row
INPUT" INITIAL COORDINATE COLUMN: ";Column
INPUT" TARGET COORDINATE ROW: ";TargetRow
INPUT" TARGET COORDINATE COLUMN: ";TargetColumn
If Row<0 or Row>8 or Column<0 or Column>8 or TargetRow<0 or TargetRow>8 or TargetColumn<0 or TargetColumn>8 then Return
Gosub [Calculate.Distance.And.Direction]
Return
[Calculate.Distance.And.Direction]
RowDifference=Row-TargetRow
ColumnDifference=Column-TargetColumn
REM Differences become sides of a triangle to calulate length (and later angle if needed) of hypotenuse
Opposite=ABS(RowDifference)
Adjacent=ABS(ColumnDifference)
Hypotenuse=INT(SQR(Opposite^2+Adjacent^2)*100)/100
If RowDifference=0 then
Hypotenuse=ABS(ColumnDifference)
If ColumnDifference<0 then
Direction=1
ELSE
Direction=5
End If
Goto [Print.Distance.And.Direction]
End If
If ColumnDifference=0 then
Hypotenuse=ABS(RowDifference)
If RowDifference<0 then
Direction=7
ELSE
Direction=3
End If
Goto [Print.Distance.And.Direction]
End If
REM Using TAN X = Opposite over Adjacent
AngleRadians = ATN(Opposite/Adjacent)
AngleDegrees = AngleRadians*57.2958
REM Determine which quarter of the grid to use
North=0:South=0:East=0:West=0
If RowDifference<0 then
South=1
ELSE
North=1
End If
If ColumnDifference<0 then
East=1
ELSE
West=1
End If
NE=North*East
NW=North*West
SE=South*East
SW=South*West
Quarter=NE*1+NW*2+SW*3+SE*4
REM Converts degrees to the eight "game directions" (each of which is 45 degrees)
Select Case Quarter
Case 1
Direction=1
Add=AngleDegrees/45
If AngleDegrees>45 then
Direction=2
Add=(AngleDegrees-45)/AngleDegrees
End If
Case 2
Direction=3
Add=(90-AngleDegrees)/45
If AngleDegrees<45 then
Direction=4
Add=(45-AngleDegrees)/45
End If
Case 3
Direction=5
Add=AngleDegrees/45
If AngleDegrees>45 then
Direction=6
Add=(AngleDegrees-45)/AngleDegrees
End If
Case 4
Direction=7
Add=(90-AngleDegrees)/45
If AngleDegrees<45 then
Direction=8
Add=(45-AngleDegrees)/45
End If
End Select
Direction=Direction+Add
[Print.Distance.And.Direction]
PRINT" DIRECTION = ";INT(Direction*100)/100
PRINT" DISTANCE = ";Hypotenuse;" SECTORS"
Return
[Find.Empty.Sector]
Found=0
WHILE Found=0
R1=FNR(1)
R2=FNR(1)
A$=" "
Z1=R1
Z2=R2
GOSUB [Look.For.A$.In.Quadrant$]
WEND
RETURN
[Look.For.A$.In.Quadrant$]
Found=0
Z1=INT(Z1+.5)
Z2=INT(Z2+.5)
S8=(Z2-1)*3+(Z1-1)*24+1
IF MID$(Quadrant$,S8,3)=A$ THEN Found=1
RETURN
[Insert.A$.in.Quadrant$]
S8=INT(Z2-.5)*3+INT(Z1-.5)*24+1
IF S8=1 THEN Quadrant$=A$+RIGHT$(Quadrant$,189)
IF S8=190 THEN Quadrant$=LEFT$(Quadrant$,189)+A$
If S8<>1 AND S8<>190 THEN Quadrant$=LEFT$(Quadrant$,S8-1)+A$+RIGHT$(Quadrant$,190-S8)
RETURN
[Append.Numeral]
IF AddNumeralFlag=1 THEN
SELECT CASE Z5
CASE 1,5: G2$=G2$+" I"
CASE 2,6: G2$=G2$+" II"
CASE 3,7: G2$=G2$+" III"
CASE 4,8: G2$=G2$+" IV"
END SELECT
END IF
RETURN
[Check.For.Victory.Or.Failure]
IF Klingons=0 THEN Goto [Victory]
If Shields<0 then Goto [Enterprise.Destroyed]
IF Stardate>MissionStartDate+MissionLength THEN Goto [Out.Of.Time]
IF Energy+Shields<5 OR (Energy<5 AND Damage(7)<90) THEN Goto [Out.Of.Energy]
If Bases=0 then Goto [All.Starbases.Destroyed]
Return
[Victory]
PRINT
PRINT" IT IS STARDATE ";INT(Stardate*10)/10
PRINT
PRINT" CONGRATULATIONS, CAPTAIN! THE LAST KLINGON BATTLE CRUISER"
PRINT" MENACING THE FEDERATION HAS BEEN DESTROYED."
PRINT
PRINT " YOUR MISSION BEGAN ON STARDATE "; MissionStartDate
PRINT " YOU WERE GIVEN ";MissionLength;" STARDATES TO COMPLETE THE MISSION"
PRINT " YOU COMPLETED YOUR MISSION WITH ";INT(MissionLength-(Stardate-MissionStartDate));" STARDATES TO SPARE"
PRINT
PRINT" YOUR EFFICIENCY RATING IS ";INT(1000*(InitialKlingons/(Stardate-MissionStartDate))^2)
GOTO [Play.Again]
[Out.Of.Energy]
PRINT
PRINT" *** FATAL ERROR: ENERGY DEPLETED ***"
PRINT
PRINT" YOU'VE JUST STRANDED YOUR SHIP IN SPACE! "
PRINT
PRINT" YOU HAVE INSUFFICIENT MANEUVERING ENERGY. SHIELD CONTROL IS"
PRINT" PRESENTLY INCAPABLE OF CROSS-CIRCUITING TO ENGINE ROOM!!"
GOTO [Failure]
[Out.Of.Time]
PRINT
PRINT " *** MISSION TIME EXPIRED ***"
PRINT
PRINT" YOUR MISSION BEGAN ON STARDATE ";MissionStartDate
PRINT" YOU WERE GIVEN ";MissionLength;" STARDATES TO COMPLETE THE MISSION"
Goto [Failure]
[All.Starbases.Destroyed]
PRINT
PRINT " YOU HAVE DESTROYED THE FEDERATION'S LAST STARBASE IN THE GALAXY"
PRINT
PRINT" THAT DOES IT, CAPTAIN!! YOU ARE HEREBY RELIEVED OF COMMAND"
PRINT" AND SENTENCED TO 99 STARDATES AT HARD LABOR ON CYGNUS 12!!"
GOTO [Failure]
[Enterprise.Destroyed]
PRINT
PRINT" *** THE ENTERPRISE HAS BEEN DESTROYED ***"
PRINT" *** THE FEDERATION WILL BE CONQUERED! ***"
[Failure]
PRINT
PRINT" IT IS STARDATE ";INT(Stardate*10)/10
PRINT
PRINT " ***** YOUR MISSION HAS FAILED. *****"
PRINT
PRINT" THERE WERE ";Klingons;" KLINGON BATTLE CRUISERS LEFT AT"
PRINT" THE END OF YOUR MISSION."
[Play.Again]
PRINT:PRINT
IF Bases=0 THEN Goto [Game.Over]
PRINT
PRINT" THE FEDERATION IS IN NEED OF A NEW STARSHIP COMMANDER"
PRINT" FOR A SIMILAR MISSION -- IF THERE IS A VOLUNTEER,"
INPUT" LET HIM STEP FORWARD AND ENTER 'AYE' ";K$
K$=UPPER$(K$)
IF K$="AYE" THEN
Gosub [SHOW.ASCII.ENTERPRISE]
GOTO [New.Game]
END IF
[Game.Over]
PRINT
PRINT "*** END OF GAME ***"
END
[SHOW.ASCII.ENTERPRISE]
PRINT
PRINT
PRINT" ,------*------,"
PRINT" ,------------- '--- ------'"
PRINT" '-------- --' / /"
PRINT" ,---' '-------/ /--,"
PRINT" '----------------'"
PRINT
PRINT" THE USS ENTERPRISE --- NCC-1701"
PRINT
RETURN
DATA "NAV","SRS","LRS","PHA","TOR","SHE","DAM","COM","XXX"
DATA "WARP ENGINES","SHORT RANGE SENSORS","LONG RANGE SENSORS","PHASER CONTROL"
DATA "PHOTON TUBES","DAMAGE CONTROL SYSTEM","SHIELD CONTROL","LIBRARY-COMPUTER"
DATA "+K+", " * ", ">!<", "<*>", " "
DATA "ANTARES","RIGEL","PROCYON","VEGA","CANOPUS","ALTAIR","SAGITTARIUS","POLLUX"
DATA "SIRIUS","DENEB","CAPELLA","BETELGEUSE","ALDEBARAN","REGULUS","ARCTURUS","SPICA"
DATA " I"," II"," III"," IV"
DATA 0,1,-1,1,-1,0,-1,-1,0,-1,1,-1,1,0,1,1,0,1
[Functions]
REM Returns distance between Enterprise at SectROW,SectCOL and Klingon at K(I,1),K(I,2)
Function FND(D)
FND=SQR((K(I,1)-SectROW)^2+(K(I,2)-SectCOL)^2)
End Function
REM Returns an integer from 1 to 8 inclusive
Function FNR(R)
FNR=INT(RND(R)*7.98+1.01)
End Function
[INSTRUCTIONS]
REM INSTRUCTIONS FOR "SUPER STARTREK" MAR 5, 1978
PRINT
PRINT
PRINT TAB(10);"*************************************"
PRINT TAB(10);"* *"
PRINT TAB(10);"* INSTRUCTIONS FOR *"
PRINT TAB(10);"* *"
PRINT TAB(10);"* * * SUPER STAR TREK * * *"
PRINT TAB(10);"* *"
PRINT TAB(10);"* MAR 5, 1978 *"
PRINT TAB(10);"* *"
PRINT TAB(10);"* Updated Nov 2021 *"
PRINT TAB(10);"* *"
PRINT TAB(10);"*************************************"
PRINT
PRINT" 1. WHEN YOU SEE \COMMAND ?\ PRINTED, ENTER ONE OF THE LEGAL"
PRINT" COMMANDS (NAV,SRS,LRS,PHA,TOR,SHE,DAM,COM, OR XXX)."
PRINT
PRINT" 2. IF YOU SHOULD TYPE IN AN ILLEGAL COMMAND, YOU'LL GET A SHORT"
PRINT" LIST OF THE LEGAL COMMANDS PRINTED OUT."
PRINT
PRINT" 3. SOME COMMANDS REQUIRE YOU TO ENTER DATA (FOR EXAMPLE, THE"
PRINT" 'NAV' COMMAND COMES BACK WITH 'COURSE (1-9) ?'.) IF YOU"
PRINT" TYPE IN ILLEGAL DATA (LIKE NEGATIVE NUMBERS), THAT COMMAND"
PRINT" WILL BE ABORTED"
PRINT
PRINT" THE GALAXY IS DIVIDED INTO AN 8 X 8 QUADRANT GRID,"
PRINT" AND EACH QUADRANT IS FURTHER DIVIDED INTO AN 8 X 8 SECTOR GRID."
PRINT
PRINT" YOU WILL BE ASSIGNED A STARTING POINT SOMEWHERE IN THE"
PRINT" GALAXY TO BEGIN A TOUR OF DUTY AS COMMANDER OF THE STARSHIP:"
PRINT
PRINT" <*> ENTERPRISE <*>"
PRINT
PRINT" YOUR MISSION: TO SEEK AND DESTROY THE FLEET OF KLINGON WARSHIPS"
PRINT" WHICH ARE MENACING THE UNITED FEDERATION OF PLANETS."
PRINT
PRINT" Page 1 of 6"
PRINT
INPUT" HIT ENTER TO CONTINUE";K$
PRINT
PRINT
PRINT" YOU HAVE THE FOLLOWING COMMANDS AVAILABLE TO YOU AS CAPTAIN"
PRINT" OF THE STARSHIP ENTERPRISE:"
PRINT
PRINT
PRINT" -- COMMANDS --"
PRINT
PRINT" NAV (TO SET COURSE)"
PRINT" SRS (FOR SHORT RANGE SENSOR SCAN)"
PRINT" LRS (FOR LONG RANGE SENSOR SCAN)"
PRINT" PHA (TO FIRE PHASERS)"
PRINT" TOR (TO FIRE PHOTON TORPEDOES)"
PRINT" SHE (TO RAISE OR LOWER SHIELDS)"
PRINT" DAM (FOR DAMAGE CONTROL REPORTS)"
PRINT" COM (TO CALL ON LIBRARY-COMPUTER)"
PRINT" XXX (TO RESIGN YOUR COMMAND)"
PRINT
PRINT" Page 2 of 6"
PRINT
INPUT" HIT ENTER FOR DETAILED DESCRIPTIONS OF THESE COMMANDS";K$
PRINT
PRINT
PRINT" \NAV\ COMMAND = WARP ENGINE CONTROL --"
PRINT
PRINT" COURSE IS IN A CIRCULAR NUMERICAL 4 3 2"
PRINT" VECTOR ARRANGEMENT AS SHOWN. . . ."
PRINT" INTEGER AND REAL VALUES MAY BE ..."
PRINT" USED. (THUS COURSE 1.5 IS HALF- 5 ---*--- 1"
PRINT" WAY BETWEEN 1 AND 2) ..."
PRINT" . . ."
PRINT" VALUES MAY APPROACH 9.0, WHICH 6 7 8"
PRINT" ITSELF IS EQUIVALENT TO 1.0"
PRINT" COURSE"
PRINT
PRINT" COURSE VALUES GREATER THAN 9 OR LESS THAN 1"
PRINT" WILL ABORT THE NAVIGATION COMMAND."
PRINT
PRINT" ONE WARP FACTOR IS THE SIZE OF "
PRINT" ONE QUADTANT. THEREFORE, TO GET"
PRINT" FROM QUADRANT 6,5 TO 5,5, YOU WOULD"
PRINT" USE COURSE 3, WARP FACTOR 1."
PRINT
PRINT" ***** IMPORTANT NOTE *****"
PRINT
PRINT" NOTE THAT THE NAVIGATION COORDINATES ARE ENTERED"
PRINT" WITH THE Y AXIS (ROW) ENTERED FIRST"
PRINT" AND THE X AXIS (COLUMN) ENTERED SECOND"
PRINT
PRINT" Page 3 of 6"
PRINT
INPUT" HIT ENTER TO CONTINUE";K$
PRINT
PRINT
PRINT" \SRS\ COMMAND = SHORT RANGE SENSOR SCAN"
PRINT
PRINT" SHOWS YOU A SCAN OF YOUR PRESENT QUADRANT."
PRINT
PRINT" SYMBOLOGY ON YOUR SENSOR SCREEN IS AS FOLLOWS:"
PRINT" <*> = YOUR STARSHIP'S POSITION"
PRINT" +K+ = KLINGON BATTLE CRUISER"
PRINT" >!< = FEDERATION STARBASE (REFUEL/REPAIR/RE-ARM HERE!)"
PRINT" * = STAR"
PRINT
PRINT" A CONDENSED 'STATUS REPORT' WILL ALSO BE PRESENTED."
PRINT
PRINT" \LRS\ COMMAND = LONG RANGE SENSOR SCAN"
PRINT
PRINT" SHOWS CONDITIONS IN SPACE FOR ONE QUADRANT ON EACH SIDE"
PRINT" OF THE ENTERPRISE (WHICH IS IN THE MIDDLE OF THE SCAN)"
PRINT" THE SCAN IS CODED IN THE FORM \###\, WHERE THE UNITS DIGIT"
PRINT" IS THE NUMBER OF STARS, THE TENS DIGIT IS THE NUMBER OF"
PRINT" STARBASES, AND THE HUNDREDS DIGIT IS THE NUMBER OF"
PRINT" KLINGONS."
PRINT
PRINT" EXAMPLE - 207 = 2 KLINGONS, NO STARBASES, & 7 STARS."
PRINT
PRINT" Page 4 of 6"
PRINT
INPUT" HIT ENTER TO CONTINUE";K$
PRINT
PRINT
PRINT" \PHA\ COMMAND = PHASER CONTROL."
PRINT
PRINT" ALLOWS YOU TO DESTROY THE KLINGON BATTLE CRUISERS BY "
PRINT" ZAPPING THEM WITH SUITABLY LARGE UNITS OF ENERGY TO"
PRINT" DEPLETE THEIR SHIELD POWER. THE CLOSER TO THE TARGET,"
PRINT" THE GREATER THE IMPACT OF PHASERS"
PRINT
PRINT" \TOR\ COMMAND = PHOTON TORPEDO CONTROL"
PRINT
PRINT" TORPEDO COURSE IS THE SAME AS USED IN WARP ENGINE CONTROL"
PRINT" IF YOU HIT THE KLINGON VESSEL, HE IS DESTROYED AND"
PRINT" CANNOT FIRE BACK AT YOU. IF YOU MISS, YOU ARE SUBJECT TO"
PRINT" HIS PHASER FIRE. IN EITHER CASE, YOU ARE ALSO SUBJECT TO "
PRINT" THE PHASER FIRE OF ALL OTHER KLINGONS IN THE QUADRANT."
PRINT" THE KLINGON FLEET IS NOT EQUIPPED WITH PHOTON TORPEDOES."
PRINT
PRINT" THE LIBRARY-COMPUTER (\COM\ COMMAND) HAS AN OPTION TO "
PRINT" COMPUTE TORPEDO TRAJECTORY FOR YOU (OPTION 2)"
PRINT
PRINT" \SHE\ COMMAND = SHIELD CONTROL"
PRINT
PRINT" DEFINES THE NUMBER OF ENERGY UNITS TO BE ASSIGNED TO THE"
PRINT" SHIELDS. ENERGY IS TAKEN FROM TOTAL SHIP'S ENERGY. NOTE"
PRINT" THAT THE STATUS DISPLAY TOTAL ENERGY INCLUDES SHIELD ENERGY"
PRINT" IF YOUR SHIELDS ARE AT ZERO, A SINGLE HIT FROM KLINGON"
PRINT" PHASERS WILL DESTROY THE ENTERPRISE"
PRINT
PRINT" \DAM\ COMMAND = DAMMAGE CONTROL REPORT"
PRINT
PRINT" GIVES THE STATE OF REPAIR OF ALL SYSTEMS ON A SCALE OF ZERO"
PRINT" TO 100%. ANY SYSTEM BELOW 90% IS NOT FULLY FUNCTIONAL."
PRINT" DAMAGED SYSTEMS ARE REPAIRED GRADUALLY OVER TIME, OR CAN BE"
PRINT" FULLY REPAIRED QUICKLY AT A STARBASE."
PRINT
PRINT" Page 5 of 6"
PRINT
INPUT" HIT ENTER TO CONTINUE";K$
PRINT
PRINT
PRINT" \COM\ COMMAND = LIBRARY-COMPUTER"
PRINT
PRINT" THE LIBRARY-COMPUTER CONTAINS SIX OPTIONS:"
PRINT
PRINT" OPTION 0 = CUMULATIVE GALACTIC RECORD"
PRINT" THIS OPTION SHOWS COMPUTER MEMORY OF THE RESULTS OF ALL"
PRINT" PREVIOUS SHORT AND LONG RANGE SENSOR SCANS"
PRINT
PRINT" OPTION 1 = STATUS REPORT"
PRINT" THIS OPTION SHOWS THE NUMBER OF KLINGONS, STARDATES,"
PRINT" AND STARBASES REMAINING IN THE GAME."
PRINT
PRINT" OPTION 2 = PHOTON TORPEDO DATA"
PRINT" WHICH GIVES DIRECTIONS AND DISTANCE FROM THE ENTERPRISE"
PRINT" TO ALL KLINGONS IN YOUR QUADRANT"
PRINT
PRINT" OPTION 3 = STARBASE NAV DATA"
PRINT" THIS OPTION GIVES DIRECTION AND DISTANCE TO ANY "
PRINT" STARBASE WITHIN YOUR QUADRANT"
PRINT
PRINT" OPTION 4 = DIRECTION/DISTANCE CALCULATOR"
PRINT" THIS OPTION ALLOWS YOU TO ENTER COORDINATES FOR"
PRINT" DIRECTION/DISTANCE CALCULATIONS"
PRINT
PRINT" OPTION 5 = GALACTIC /REGION NAME/ MAP"
PRINT" THIS OPTION PRINTS THE NAMES OF THE SIXTEEN MAJOR "
PRINT" GALACTIC REGIONS REFERRED TO IN THE GAME."
PRINT
PRINT" Page 6 of 6"
PRINT
INPUT" HIT ENTER TO BEGIN YOUR MISSION";K$
PRINT
RETURN