home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
SIMTEL
/
CPMUG
/
CPMUG020.ARK
/
STRTRK_1.BAS
< prev
next >
Wrap
BASIC Source File
|
1985-02-10
|
33KB
|
1,201 lines
REM---------------------------------------------------------
REM S T A R T R E K
REM---------------------------------------------------------
REM--->DISTRIBUTION/MODIFICATION HISTORY:
REM
REM LATEST (1/18/78) REVISION BY:
REM
REM JOHN R. PIERCE (408)-649-3896
REM
REM ORIGINALLY OBTAINED FROM CP/M USERS GROUP
REM VOLUME 3, NO SPECIFIC CREDITS
REM
REM
REM TO BE COMPILED WITH BASIC-E VER 2.1,
REM AND EXECUTED WITH RUN-E VER 2.3
REM
MAX.BADDY = 4
DIM GALAXY(8,8), GALAXY$(8,8), C(9,2), BADDY(MAX.BADDY,3), GMAP(8,8)
DIM DAMAGE(8), QUAD.NAME$(16), SEGMENT$(4), DAM$(8)
DIM PRINT.QUAD(3)
REM -- ADM-3a Control Sequences (or lack thereof)
ESC$ = CHR$(27)
NULL$=CHR$(0)
BELL$=CHR$(7)
BLOT$="*"
REM -- ADM-3a don't have blinks and reverses, so NULL's
IVB$="" REM S/B Inverse Video w/ blink
BLNK$="" REM S/B Normal Video w/ Blink
UNDL$="" REM S/B Underline mode (or something equally spastic)
INVR$="" REM S/B Inverse Video, no blink
NORM$="" REM S/B Video Restore code (Normal Brightness, no blink)
EMPTY$="."
BASE$="B"
ENTERPRISE$="E"
STAR$="*"
CRUD$="?"
NUM.GAMES = 0
DASH$="------------------------"
PRINT
PRINT TAB(20);"S T A R T R E K"
PRINT
240 PRINT
NUM.GAMES = NUM.GAMES + 1
IF NUM.GAMES > INT(RND*2)+2 THEN \
NUM.GAMES=0 :\
PRINT "What are you, some kind of Sado-masochist ??" :\
PRINT
INPUT " Enter your name, Captain "; CAPTAIN$
PRINT
PRINT "Welcome aboard Captain ";CAPTAIN$
PRINT TAB(15);"Do you want instructions";
INPUT ANS$
RANDOMIZE
IF LEFT$(ANS$,1)="Y" OR LEFT$(ANS$,1) = "y" THEN GOSUB 999999
REM - CLEAR ADM-3a'S SCREEN
FOR I=1 TO 48 : PRINT CHR$(10); : NEXT
PRINT CHR$(30);
PRINT "Mr. Spock: ";
PRINT "STAND BY"
LET T=INT(RND*20+20)*100
T0=T
T9=26+INT(RND*8+1)
FIRST.TIME.FLAG=1
ON INT(RND^2*3)+1 GOTO 400, 410, 420
400 ENEMY$="Klingon"
ENEMYC$="KLINGON"
GOTO 500
410 ENEMY$="Romulan"
ENEMYC$="ROMULAN"
GOTO 500
420 ENEMY$="Tholian"
ENEMYC$="THOLIAN"
500 REM
BAD.GUY$=LEFT$(ENEMY$,1)
DOCKED=0
ENERGY.NORMAL=3000
ENERGY=ENERGY.NORMAL
TORPS=10
TORPS.NORMAL=TORPS
SHIELD.NORMAL=200
SHIELDS=SHIELD.NORMAL * 2
FOR I=1 TO 8
FOR J=1 TO 8
GALAXY$(I,J)=EMPTY$
NEXT J
NEXT I
REM-----------F U N C T I O N S---------------------
DEF FN8=INT(RND*8+1)
DEF FNROUND(D)=INT(D+.5)
DEF FND=SQR((ABS(BADDY(I,1)-SX))^2+(ABS(BADDY(I,2)-SY))^2)
REM *** INITIALIZE ENTERPRISE'S POSITION
QX=FN8
QY=FN8
EX=FN8
EY=FN8
SX=EX
SY=EY
C(3,1)=-1
C(2,1)=-1
C(4,1)=-1
C(4,2)=-1
C(5,2)=-1
C(6,2)=-1
C(1,2)=1
C(2,2)=1
C(6,1)=1
C(7,1)=1
C(8,1)=1
C(8,2)=1
C(9,2)=1
FOR I=1 TO 8
LET DAMAGE(I)=(INT(RND*30+1)/10)
NEXT I
DAM$(1)="Warp Engines"
DAM$(2)="Short Range Sensors"
DAM$(3)="Long Range Sensors"
DAM$(4)="Phasor Control"
DAM$(5)="Photon Torpedo Tubes"
DAM$(6)="Damage Control"
DAM$(7)="Shield Control"
DAM$(8)="Computer"
QUAD.NAME$(01)="ANTARES"
QUAD.NAME$(02)="SIRIUS"
QUAD.NAME$(03)="RIGEL"
QUAD.NAME$(04)="DENEB"
QUAD.NAME$(05)="PROCYON"
QUAD.NAME$(06)="CAPELLA"
QUAD.NAME$(07)="VEGA"
QUAD.NAME$(08)="BETELGEUSE"
QUAD.NAME$(09)="CANOPUS"
QUAD.NAME$(10)="ALDEBARAN"
QUAD.NAME$(11)="ALTAIR"
QUAD.NAME$(12)="REGULUS"
QUAD.NAME$(13)="SAGITTARIUS"
QUAD.NAME$(14)="ARCTURUS"
QUAD.NAME$(15)="POLLUX"
QUAD.NAME$(16)="SPICA"
SEGMENT$(1)=" I"
SEGMENT$(2)=" II"
SEGMENT$(3)=" III"
SEGMENT$(4)=" IV"
TOT.BASES=0
TOT.BAD.GUYS=0
REM *** SET UP WHAT EXISTS IN GALAXY.
FOR I=1 TO 8
FOR J=1 TO 8
R1=RND
IF R1>.993 THEN \
BAD.GUYS=4 :\
GOTO 900
IF R1>.98 THEN \
BAD.GUYS=3 :\
GOTO 900
IF R1>.93 THEN \
BAD.GUYS=2 :\
GOTO 900
IF R1>.85 THEN \
BAD.GUYS=1 :\
GOTO 900
BAD.GUYS=0
900 REM
TOT.BAD.GUYS=TOT.BAD.GUYS+BAD.GUYS
IF RND>.94 THEN \
BASES=1 :\
ELSE \
BASES=0
TOT.BASES=TOT.BASES+BASES
STARS=INT(RND*7)+1
GALAXY(I,J)=BAD.GUYS*100+BASES*10+STARS
GMAP(I,J)=0
NEXT J
NEXT I
K7=TOT.BAD.GUYS
IF TOT.BASES=0 THEN \
X=FN8 :\
Y=FN8 :\
GALAXY(X,Y)=GALAXY(X,Y)+10 :\
BASES=1 :\
TOT.BASES=BASES
1200 REM
IF TOT.BASES=1 THEN \
A$=" is " :\
B$="" :\
ELSE \
A$=" are " :\
B$="s"
PRINT "Your orders are as follows:"
PRINT "Destroy the ";TOT.BAD.GUYS;ENEMY$;" Warships which have invaded"
PRINT "the Galaxy before they can attack Federation Headquaters"
PRINT "on StarDate ";T0+T9;". This gives you ";T9;"days. There";
PRINT A$
PRINT TOT.BASES;"StarBase";B$;" in the Galaxy for resupplying your ship."
PRINT
PRINT " Type 'GO' when you are ready to assume command."
INPUT JIVE$
IF JIVE$ = "free" OR JIVE$ = "FREE" THEN \
PRINT "Free storage = ";FRE;"Bytes"
1320 REM----------ENTER NEW QUADRANT--------------------
FOR J=1 TO 8
FOR I=1 TO 8
GALAXY$(I,J)=EMPTY$
IF RND > .985 THEN \
GALAXY$(I,J) = CRUD$
NEXT I
NEXT J
BAD.GUYS=0
BASES=0
STARS=0
GALAXY$(EX,EY)=ENTERPRISE$
G5=0
GOSUB 9030 REM GET QUADRANT NAME
PRINT
IF FIRST.TIME.FLAG=1 THEN \
FIRST.TIME.FLAG=0 :\
PRINT "Your mission begins with your Starship located" :\
PRINT "in the Galactic Quadrant: ";QUADRANT$; :\
ELSE \
PRINT "Now entering Quadrant: ";QUADRANT$
PRINT
X=GALAXY(QX,QY)*.01
BAD.GUYS=INT(X)
BASES=INT((X-BAD.GUYS)*10)
STARS=GALAXY(QX,QY)-INT(GALAXY(QX,QY)*.1)*10
IF BAD.GUYS>0 THEN \
PRINT "COMBAT AREA -- ";ENEMYC$;" ALERT"
IF SHIELDS<=SHIELD.NORMAL THEN \
PRINT "Warning: LOW SHIELDS"
FOR X=1 TO MAX.BADDY
FOR Y=1 TO 3
BADDY(X,Y)=0
NEXT Y
NEXT X
REM
IF BAD.GUYS=0 THEN \
GOTO 1705
FOR X=1 TO BAD.GUYS
GOSUB 9500 REM FIND EMPTY SECTOR
GALAXY$(SX,SY)=BAD.GUY$
BADDY(X,1)=SX
BADDY(X,2)=SY
BADDY(X,3)=SHIELD.NORMAL
NEXT X
1705 REM
IF BASES=0 THEN \
GOTO 1710
FOR X=1 TO BASES
GOSUB 9500 REM FIND EMPTY SECTOR
GALAXY$(SX,SY)=BASE$
BX=SX
BY=SY
NEXT X
1710 REM
IF STARS<=0 THEN \
GOTO 1980
FOR X=1 TO STARS
GOSUB 9500 REM FIND EMPTY SECTOR
GALAXY$(SX,SY)=STAR$
NEXT X
1980 GOSUB 6430 REM SHORT RANGE SENSOR RTN
1990 IF SHIELDS+ENERGY<=0 OR (DAMAGE(7)<0 AND ENERGY<=0) THEN \
PRINT " **FATAL ERROR**" :\
PRINT "You've just stranded your ship in space !!!" :\
PRINT "You have insufficient maneuvering energy and" :\
PRINT "Shield Control is presently incapable of Cross-" :\
PRINT "Circuiting to the Engine Room!" :\
GOTO 6260
IF SHIELDS < 0 THEN \
PRINT : PRINT : PRINT :\
PRINT "***************************************************" :\
PRINT "***** E ~ N ~ T ~ E ~ R ~ P ~ R ~ I ~ S ~ E *****" :\
PRINT "***** D ~ E ~ S ~ T ~ R ~ O ~ Y ~ E ~ D *****" :\
PRINT "***************************************************" :\
PRINT :\
PRINT :\
PRINT " Y O U" :\
PRINT " L O S E ! ! !" :\
PRINT : PRINT : PRINT :\
GOTO 6260
2060 REM-----C O M M A N D--------------------------------
IF T>T0+T9 THEN \
GOTO 6220 REM YOU LOSE ASSHOLE!
PRINT CAPTAIN$;": ";
INPUT COMMAND$
COMMAND$ = LEFT$(COMMAND$, 1)
IF COMMAND$="N" OR COMMAND$="n" THEN GOTO 2300
IF COMMAND$="S" OR COMMAND$="s" THEN GOTO 1980
IF COMMAND$="L" OR COMMAND$="l" THEN GOTO 4000
IF COMMAND$="P" OR COMMAND$="p" THEN GOTO 4260
IF COMMAND$="T" OR COMMAND$="t" THEN GOTO 4700
IF COMMAND$="E" OR COMMAND$="e" THEN GOTO 5530
IF COMMAND$="D" OR COMMAND$="d" THEN GOTO 5690
IF COMMAND$="C" OR COMMAND$="c" THEN GOTO 7290
IF COMMAND$="Q" OR COMMAND$="q" THEN GOTO 6270
PRINT "Enter one of the following:"
PRINT "N-avigate"
PRINT "S-hort Range Scan"
PRINT "L-ong Range Scan"
PRINT "P-hasors"
PRINT "T-orpedos"
PRINT "E-ngineering"
PRINT "D-amage Control"
PRINT "C-omputer"
PRINT "Q-uit"
PRINT
GOTO 2060
REM**********> COURSE CONTROL BEGINS HERE.
2300 PRINT "Course (1-9) ";
INPUT COURSE
IF COURSE=0 THEN \
GOTO 1990
IF COURSE>=1 AND COURSE<=9 THEN \
GOTO 2350
PRINT "Lt. Sulu: Incorrect course data, Sir."
PRINT
PRINT "4 5 6"
PRINT " \|/ "
PRINT "3--*--7"
PRINT " /|\ "
PRINT "2 1 8"
PRINT
GOOF1=GOOF1+.1
IF RND+GOOF1>.85 THEN \
PRINT "MISSION ADVISORY: ";:\
PRINT "Captain ";CAPTAIN$;", I strongly suggest you get your act" :\
PRINT "together before the ";ENEMY$;"s blast your ass."
GOTO 2300
2350 REM-----COURSE IS OK-----
PRINT "Warp Factor (0-8) ";
INPUT WARP
IF WARP=0 THEN \
GOTO 1990
IF WARP>=0 AND WARP<=8 THEN \
GOTO 2450 REM WARP OK
PRINT "Engineering Officer Scott:";
PRINT "The engines won't take Warp ";WARP;"!"
GOOF2=GOOF2+.1
IF RND+GOOF2>.85 THEN \
PRINT "Mr. Spock: "; :\
PRINT "Warp ";WARP;"! What a Galactic Jackass!"
GOTO 2350
2450 REM-------
IF DAMAGE(1)>=0 THEN \
GOTO 2490
PRINT DAM$(1);" DAMAGED"
IF WARP>.25 THEN \
PRINT "Maximum Warp: 0.25" :\
GOTO 2350
2490 REM
E.NEEDED=FNROUND(WARP*8)
IF ENERGY-E.NEEDED>=0 THEN GOTO 2590
PRINT "Engineering Officer Scott:";
PRINT "Not enough energy left!"
IF SHIELDS<E.NEEDED-ENERGY THEN \
GOTO 2350 REM ASK FOR NEW WARP
IF DAMAGE(7)<0 THEN \
GOTO 2350
PRINT "Shield Control Room reports ";SHIELDS;" units"
PRINT "of energy presently deployed to Shields."
GOTO 5530 REM SHIELD CONTROL
2590 REM ***** SEE IF TIME FOR A COMMERCIAL.
GOSUB 9600
REM*******> BAD.GUYS MOVE/FIRE ON MOVING STARSHIP . .
IF BAD.GUYS=0 THEN \
GOTO 2750
FOR I=1 TO MAX.BADDY
IF BADDY(I,3) > 0 THEN :\
GALAXY$(BADDY(I,1),BADDY(I,2))=EMPTY$ :\
GOSUB 9500 :\
BADDY(I,1)=SX :\
BADDY(I,2)=SY :\
GALAXY$(BADDY(I,1),BADDY(I,2))=BAD.GUY$
NEXT I
2750 REM
GOSUB 6000 REM BAD.GUYS SHOOT
D1=0
D6=INT(WARP*10)/10
REM****> MAKE REPAIRS TO THE SHIP.
FOR I=1 TO 8
IF DAMAGE(I)>=0.5 THEN GOTO 2880
DAMAGE(I)=DAMAGE(I)+D6
IF DAMAGE(I)<0 THEN GOTO 2880
IF D1=0 THEN \
D1=1 :\
PRINT "Damage Control Report"
PRINT TAB(8);
PRINT DAM$(I);
PRINT TAB(32);"functional"
2880 NEXT I
REM--------> DAMAGE/IMPROVEMENT DURING SOME MOVES
IF RND>.2 THEN GOTO 3070
R1=FN8
IF RND>=.5 THEN GOTO 3000
DAMAGE(R1)=DAMAGE(R1)-INT((RND*5+1)*10)/10
PRINT
PRINT "Damage Control report:"
PRINT DAM$(R1);
IF DAMAGE(R1)<0 THEN \
PRINT TAB(32);BLNK$+BELL$+"DAMAGED"+NORM$ \
ELSE \
PRINT TAB(32);"Deteriorating"
PRINT
GOTO 3070
3000 REM
DAMAGE(R1)=DAMAGE(R1)+INT((RND*3+1)*10)/10
PRINT
PRINT "Damage Control report:"
PRINT DAM$(R1);
PRINT TAB(32);"state of repair improved"
PRINT
3070 REM-----BEGIN MOVING STARSHIP---------------------
GALAXY$(EX,EY)=EMPTY$
T.CRSE=INT(COURSE)
DELTA.X=C(T.CRSE,1)+(C(T.CRSE+1,1)-C(T.CRSE,1))*(COURSE-T.CRSE)
DELTA.Y=C(T.CRSE,2)+(C(T.CRSE+1,2)-C(T.CRSE,2))*(COURSE-T.CRSE)
X=EX
Y=EY
OLD.QX=QX
OLD.QY=QY
FOR I=1 TO E.NEEDED
X=X+DELTA.X
Y=Y+DELTA.Y
EX=FNROUND(X)
EY=FNROUND(Y)
IF EX<1 OR \
EX>8 OR \
EY<1 OR \
EY>8 THEN \
GOTO 3500
IF GALAXY$(EX,EY)=EMPTY$ THEN \
LAST.X=0 :\
LAST.Y=0 :\
GOTO 3360
OBJECT$=GALAXY$(EX,EY)
IF OBJECT$=BAD.GUY$ THEN OBJECT$=ENEMY$
IF OBJECT$=STAR$ THEN OBJECT$="Star"
IF OBJECT$=BASE$ THEN OBJECT$="StarBase"
IF OBJECT$=CRUD$ THEN OBJECT$="Spacecrud"
EX=FNROUND(X-DELTA.X)
EY=FNROUND(Y-DELTA.Y)
PRINT BELL$;"Lt. Sulu:";
PRINT " Emergency Stop!"
PRINT
PRINT "Mr. Spock: ";
PRINT "We almost rammed right into that ";OBJECT$;" at ";
PRINT "Warp ";WARP;"!!"
IF OBJECT$=ENEMY$ THEN \
PRINT " Captain, don't you think that is "; :\
PRINT "a little dangerous??" : PRINT :\
GOTO 3370
GOOF3=GOOF3+.1
IF RND+GOOF3>.75 THEN \
PRINT "Captain ";CAPTAIN$;", don't you think it's time" :\
PRINT "you reconsider that desk job at Federation HQ??"
GOTO 3370
3360 NEXT I
3370 REM------PUT THE ENTERPRISE IN ITS NEW PLACE-----
GALAXY$(EX,EY)=ENTERPRISE$
GOSUB 3910 REM SUBTRACT THE ENERGY NEEDED
T8=1
IF WARP<1 THEN \
T8=.1*INT(10*WARP)
T=T+T8
IF T>T0+T9 THEN GOTO 6220
GOTO 1980 REM SEE IF DOCKED THEN GET COMMAND
3500 REM-----EXCEEDED QUADRANT LIMITS----------------
X=8*QX+X+(E.NEEDED-I)*DELTA.X
Y=8*QY+Y+(E.NEEDED-I)*DELTA.Y
QX=INT(X/8)
QY=INT(Y/8)
EX=INT(X-QX*8)
EY=INT(Y-QY*8)
PERIMETER.FLAG=0
IF EX=0 THEN \
QX=QX-1 :\
EX=8
IF EY=0 THEN \
QY=QY-1 :\
EY=8
IF QX<1 THEN \
QX=1:EX=1 :\
PERIMETER.FLAG=1
IF QX>8 THEN \
QX=8:EX=8 :\
PERIMETER.FLAG=1
IF QY<1 THEN \
QY=1:EY=1 :\
PERIMETER.FLAG=1
IF QY>8 THEN \
QY=8:EY=8 :\
PERIMETER.FLAG=1
IF PERIMETER.FLAG=0 THEN \
GOTO 3860
PRINT "Lt. Uhura:"
PRINT "StarFleet Command reports:"
PRINT "'PERMISSION TO CROSS GALACTIC PERIMETER"
PRINT "IS ";BLNK$;"*DENIED*";NORM$;". SHUT DOWN YOUR ENGINES."
PRINT "Engineering Officer Scott:";
PRINT "WARP ENGINES SHUT DOWN"
PRINT "at Sector ";EX;EY;" of Quadrant ";QX;QY;"."
IF T>T0+T9 THEN GOTO 6220
3860 REM
IF QX=OLD.QX AND QY=OLD.QY THEN \
GOTO 3370
T=T+1
GOSUB 3910 REM SUBTRACT THE NEEDED ENERGY
GOTO 1320 REM ANNOUNCE THE NEW QUADRANT
3910 REM---------> MANEUVER ENERGY S/R
ENERGY=ENERGY-E.NEEDED-10
IF ENERGY>=0 THEN GOTO 3980
PRINT "Shield Control supplied energy to complete the maneuver."
IF RND>.6 THEN GOTO 3911
PRINT "Mr. Spock: ";
PRINT "Captain ";CAPTAIN$;": ";
IF RND>.5 THEN \
PRINT "That was extremely close even for the Enterprise" :\
ELSE \
PRINT "Were going to need those Shields before long, you know.'"
3911 REM
SHIELDS=SHIELDS+ENERGY
ENERGY=0
IF SHIELDS<0 THEN \
SHIELDS=0
3980 RETURN
4000 REM-----------> LONG RANGE SENSOR SCAN CODE
IF DAMAGE(3)<0 THEN \
PRINT DAM$(3);" Damaged" :\
GOTO 1990
PRINT DAM$(3);" Scan for Quadrant ";QX;QY
PRINT
FOR J=QY-1 TO QY+1
Q=0
FOR I=QX-1 TO QX+1
Q=Q+1
IF I<1 OR I>8 OR J<1 OR J>8 THEN \
PRINT.QUAD(Q)=0 :\
ELSE \
PRINT.QUAD(Q)=GALAXY(I,J) :\
GMAP(I,J)=GALAXY(I,J)
NEXT I
FOR Q=1 TO 3
IF PRINT.QUAD(Q)=0 THEN :\
PRINT TAB(Q*6); "***"; :\
GOTO 4040
YYY=Q*6
IF PRINT.QUAD(Q)<100 THEN YYY=YYY+1
IF PRINT.QUAD(Q)<10 THEN YYY=YYY+1
PRINT TAB(YYY);PRINT.QUAD(Q);
4040 NEXT Q
PRINT : PRINT
NEXT J
PRINT
GOTO 1990
4260 REM----------> PHASER CONTROL BEGINS HERE
SX=EX
SY=EY
IF BAD.GUYS=0 THEN \
PRINT "Mr. Spock: "; :\
PRINT "Sensors show no enemy ships in this Quadrant" :\
GOTO 1990
IF DAMAGE(4)<0 THEN \
PRINT DAM$(4);" Damaged" :\
GOTO 1990
IF DAMAGE(8)<0 THEN \
PRINT DAM$(8);" Malfunction reduces accuracy"
PRINT "Phasors locked on target; "
4360 PRINT "Energy available = ";ENERGY
PRINT "Number of units to fire: ";
INPUT RATE.OF.FIRE
IF RATE.OF.FIRE<=0 THEN GOTO 1990
IF RATE.OF.FIRE>ENERGY THEN GOTO 4360
IF DOCKED <> 1 THEN \
ENERGY=ENERGY-RATE.OF.FIRE
GOSUB 6000 REM BAD.GUYS SHOOT
IF DAMAGE(8)<0 OR DAMAGE(4)<1 THEN \
DRAIN=RND/2+.5 :\
RATE.OF.FIRE=RATE.OF.FIRE*DRAIN :\
DRAIN=INT((1-DRAIN)*100) :\
PRINT "Mr. Spock: "; :\
PRINT DRAIN;"% of Phasor power was diverted to Damage Control"
TOTAL.HIT=INT(RATE.OF.FIRE/BAD.GUYS)
FOR I=1 TO MAX.BADDY
IF BADDY(I,3)<=0 THEN GOTO 4670
HIT=INT((TOTAL.HIT/FND)*(RND+1.5))
IF HIT<.15*BADDY(I,3) THEN \
PRINT "Sensors show no damage "; :\
PRINT "to enemy at ";BADDY(I,1);BADDY(I,2) :\
GOTO 4670
BADDY(I,3)=BADDY(I,3)-HIT*(RND+.3)
PRINT HIT;" unit hit on ";ENEMY$;" at Sector ";
PRINT BADDY(I,1);BADDY(I,2)
IF BADDY(I,3)<=0 THEN GOTO 4580
IF RND>.5 THEN \
PRINT "Sensors show ";BADDY(I,3);" units remaining"
GOTO 4670
4580 PRINT BELL$; BLNK$;" << ";ENEMYC$;" DESTROYED >>";NORM$
BAD.GUYS=BAD.GUYS-1
TOT.BAD.GUYS=TOT.BAD.GUYS-1
GALAXY$(BADDY(I,1),BADDY(I,2))=EMPTY$
GALAXY(QX,QY)=BAD.GUYS*100+BASES*10+STARS
IF GMAP(QX,QY)<>0 THEN \
GMAP(QX,QY)=GALAXY(QX,QY)
IF TOT.BAD.GUYS <=0 THEN GOTO 6370
4670 NEXT I
GOTO 1990
4700 REM---------> PHOTON TORPEDO CODE BEGINS
SX=EX
SY=EY
IF DAMAGE(5)<0 THEN \
PRINT DAM$(5);" Damaged" :\
GOTO 1990
IF TORPS<=0 THEN \
PRINT "All Photon Torpedoes expended" :\
GOTO 1990
GOSUB 6000 REM BAD.GUYS SHOOT
4760 PRINT "Torpedo Course (1-9) ";
INPUT COURSE
IF COURSE<1 OR COURSE>9 THEN \
PRINT "Ensign Chekov:"; :\
PRINT "Incorrect course data, Sir!" :\
ON FNROUND(RND)+1 GOTO 1990, 4760
T.CRSE=INT(COURSE)
DELTA.X=C(T.CRSE,1)+(C(T.CRSE+1,1)-C(T.CRSE,1))*(COURSE-T.CRSE)
DELTA.Y=C(T.CRSE,2)+(C(T.CRSE+1,2)-C(T.CRSE,2))*(COURSE-T.CRSE)
ENERGY=ENERGY-2
X=SX
Y=SY
TORPS=TORPS-1
PRINT "TORPEDO TRACK---> ";
4920 X=X+DELTA.X
Y=Y+DELTA.Y
ROUND.X=FNROUND(X)
ROUND.Y=FNROUND(Y)
IF ROUND.X<1 OR \
ROUND.X>8 OR \
ROUND.Y<1 OR \
ROUND.Y>8 THEN \
PRINT "Torpedo missed" :\
GOTO 5500
PRINT " ";ROUND.X;ROUND.Y;
IF GALAXY$(ROUND.X,ROUND.Y)=EMPTY$ THEN \
GOTO 4920
IF GALAXY$(ROUND.X,ROUND.Y)=BAD.GUY$ THEN \
GOTO 5100
IF GALAXY$(ROUND.X,ROUND.Y)=STAR$ THEN \
GOTO 5210
IF GALAXY$(ROUND.X,ROUND.Y)=BASE$ THEN \
GOTO 5280
IF GALAXY$(ROUND.X,ROUND.Y)=CRUD$ THEN \
GOTO 4920
GOTO 4920 REM DEFENSIVE PROGRAMMING
5100 REM-----HIT A BAD.GUY--------------------------
PRINT BELL$;BLNK$;"<< ";ENEMYC$;" DESTROYED >>";NORM$
ON FN8 GOTO 5177, 5177, 5177, 5177, 5177, 5176, 5178, 5178
5176 REM
PRINT "Excellent work with the Torpedoes, Captain."
GOTO 5177
5178 REM
PRINT "Mr. Spock: ";
PRINT "Very good shooting, Captain ";CAPTAIN$
5177 REM
GALAXY$(X,Y)=EMPTY$
BAD.GUYS=BAD.GUYS-1
TOT.BAD.GUYS=TOT.BAD.GUYS-1
IF TOT.BAD.GUYS<=0 THEN GOTO 6370
FOR I=1 TO MAX.BADDY
IF BADDY(I,3) <=0 THEN \
GOTO 5180
IF ROUND.X = BADDY(I,1) AND \
ROUND.Y = BADDY(I,2) THEN GOTO 5190
5180 NEXT I
GOTO 5430 REM - DEFENSIVE PROGRAMMING
5190 BADDY(I,3)=0
GOTO 5430
5210 REM-----HIT A STAR------------------------
PRINT "Star at ";ROUND.X;ROUND.Y;" absorbed Torpedo energy"
IF RND<=.7 THEN :\
PRINT "Command Inquiry: "; :\
PRINT "Was it you intention to waste a valuable" :\
PRINT "Torpedo on that star, Captain?"
GOTO 5500
5280 REM------HIT A STARBASE-------------------
PRINT BELL$;IVB$;">> STARBASE DESTROYED << ";NORM$
BASES=BASES-1
TOT.BASES=TOT.BASES-1
GALAXY$(X,Y)=EMPTY$
IF TOT.BASES <= 0 THEN :\
PRINT "Mr. Spock: "; :\
PRINT "Captain ";CAPTAIN$; :\
PRINT " I'm afraid that you have blown it" :\
GOTO 6270
PRINT "StarFleet Command is reviewing your record to consider"
PRINT "a General Court-Martial."
DOCKED=0
5430 REM-------END OF ENTERPRISE SHOOTING-------
GALAXY(QX,QY)=BAD.GUYS*100+BASES*10+STARS
IF GMAP(QX,QY)<>0 THEN \
GMAP(QX,QY)=GALAXY(QX,QY)
5500 REM
IF RND>.7 THEN \
GOSUB 6000 REM BAD.GUYS MAY SHOOT AGAIN
GOTO 1990
5530 REM---------SHIELD CONTROL STARTS HERE-----------------
IF DAMAGE(7)<0 THEN \
PRINT DAM$(7);" Damaged" :\
GOTO 1990
IF DOCKED = 1 THEN \
PRINT "Mr. Spock: You can't deploy shields this"; :\
PRINT " close to a StarBase!!" :\
GOTO 1990
5560 PRINT "Energy available=";ENERGY+SHIELDS
PRINT "Divert to Shields ";
INPUT DIVERTED
IF DIVERTED<0 OR DIVERTED=SHIELDS THEN \
PRINT "Shields unchanged" :\
GOTO 1990
IF DIVERTED>SHIELDS+ENERGY THEN \
PRINT "Can't divert" :\
GOTO 5560
ENERGY=ENERGY+SHIELDS-DIVERTED
SHIELDS=DIVERTED
PRINT "Deflector Control Room report: ";
PRINT "Shields now at ";SHIELDS
GOTO 1990
5690 REM------------DAMAGE CONTROL STARTS HERE----------------
IF DOCKED=1 THEN GOTO 5710
IF DAMAGE(6)<0 THEN \
PRINT DAM$(6);" Damaged" :\
GOTO 1990
GOSUB 5910 REM PRINT DAMAGE RPT
GOTO 1990
5710 REM----------D O C K E D------------------------------
GOSUB 5910 REM PRINT DAMAGE REPORT
D3=0
FOR I=1 TO 8
IF DAMAGE(I)>=.7 THEN GOTO 5760
D3=D3+.5
5760 NEXT I
IF D3=0 THEN GOTO 1990
D3=D3+(.5*RND)
IF D3>1 THEN \
D3=RND
REM
PRINT "Techs standing by to repair the Ship."
PRINT "Estimated time: ";D3;"StarDates"
PRINT "Authorize (Y/N) ";
INPUT A$
IF LEFT$(A$,1)<>"Y" AND LEFT$(A$,1)<>"y" THEN GOTO 1990
FOR I=1 TO 8
5815 REM
IF DAMAGE(I)<=.7 THEN \
DAMAGE(I)=DAMAGE(I)+1 :\
GOTO 5815
NEXT I
T=T+D3+.1
GOSUB 5910 REM PRINT DAMAGE RPT
GOTO 1990
5910 REM-----PRINT DAMAGE RPT---------------------
PRINT
PRINT " Device";TAB(27);"Condition"
FOR X=1 TO 8
PRINT DAM$(X);TAB(30);DAMAGE(X)
NEXT X
PRINT
RETURN
6000 REM-------------BAD.GUYS SHOOTING ROUTINE------------
SX=EX
SY=EY
IF BAD.GUYS<=0 THEN GOTO 6210
IF DOCKED=1 THEN \
PRINT "StarBase Shields protect the Enterprise" :\
RETURN
FOR I=1 TO MAX.BADDY
IF BADDY(I,3)<=0 THEN :\
GOTO 6200
HIT=INT((BADDY(I,3)/FND)*(2+RND))
SHIELDS=SHIELDS-INT(HIT*RND)
PRINT BELL$;"---> ";HIT;" unit hit on Enterprise from Sector ";
PRINT BADDY(I,1);BADDY(I,2)
GOOF4=GOOF4+.1
IF RND+GOOF4>.7 THEN \
PRINT "Shields down to ";SHIELDS;"units"
IF HIT<20 OR \
HIT/SHIELDS<.02 THEN \
GOTO 6200
GOSUB 6100 REM DAMAGE RTN
IF SHIELDS<0 THEN \
GOTO 6150
6200 NEXT I
6210 RETURN
6100 REM------DAMAGE TO ENTERPRISE--------------------------
TEMP=SHIELDS
IF SHIELDS<=0 THEN TEMP=1
NEW.DAMAGE=HIT/TEMP+.5*RND
NEW.DAMAGE=INT(NEW.DAMAGE*10)/10
R1=FN8
DAMAGE(R1)=DAMAGE(R1)-NEW.DAMAGE
PRINT "Damage Control Reports"
IF DAMAGE(R1)<0 THEN \
PRINT DAM$(R1);TAB(32);BLNK$;" DAMAGED" :\
ELSE \
PRINT DAM$(R1);TAB(32);" deteriorating"
RETURN
6150 PRINT
PRINT "The Enterprise has been DESTROYED."
PRINT " The Federation will be conquered."
6220 REM
6260 PRINT "It is StarDate ";T
6270 PRINT "There were ";TOT.BAD.GUYS;ENEMY$;" Battle Cruisers left at the"
PRINT " end of your mission."
6290 PRINT
PRINT
PRINT "The Federation is in need of a new StarShip Commander"
PRINT "For a similar Mission -- If there is a volunteer,"
PRINT "let him step forward, and enter 'AYE'.";
INPUT A$
IF LEFT$(A$,1)="A" OR LEFT$(A$,1)="a" THEN 240
PRINT "StarBase to Enterprise: ";
PRINT "We are terminating communications"
STOP
6370 PRINT "CONGRATULATIONS, Captain! The last ";ENEMY$;" Battle Cruiser"
PRINT "menacing the Federation has been Destroyed."
PRINT
EFF=(K7/(T-T0))*1000
PRINT "Your efficiency rating is ";EFF
PRINT
IF EFF < RND*100+900 THEN GOTO 6290
PRINT "Mr. Spock: "
PRINT " Confidentially speaking, Captain ";CAPTAIN$;", I believe"
PRINT " that the performance you have just given on the "
PRINT " field of battle has been so commendable as to virtually"
PRINT " assure that your name will come up on the Federation"
PRINT " Navy promotion list quite soon. Even though I am an"
PRINT " unemotional Vulcan, I was profoundly stirred by your"
PRINT " demonstration of skill and judgment"
PRINT
GOTO 6290
6430 REM------------SHORT RANGE SENSOR AND STARTUP SUBRTN.----------
SX=EX
SY=EY
FOR J=SY-1 TO SY+1
FOR I=SX-1 TO SX+1
IF I<1 OR I>8 OR \
J<1 OR J>8 THEN \
GOTO 6540
IF GALAXY$(I,J)=BASE$ THEN \
GOTO 6580
6540 NEXT I
NEXT J
DOCKED=0
GOTO 6650
6580 DOCKED=1
CONDITION$="Docked"
IF LAST.X=EX AND LAST.Y=EY THEN \
GOTO 6720
LAST.X=EX
LAST.Y=EY
TEMP=ENERGY.NORMAL-333+100*FN8
IF TEMP>ENERGY THEN \
ENERGY=TEMP
TEMP=TORPS.NORMAL-3+FN8
IF TEMP>TORPS THEN \
TORPS=TEMP
PRINT "Mr. Spock: ";
PRINT "Captain ";CAPTAIN$;":"
PRINT "We have dropped our shields for docking"
PRINT "We are reloading ";TORPS;" Torpedoes"
PRINT "Our energy is being replenished to ";ENERGY;" units"
SHIELDS=0
GOTO 6720
6650 REM-----GET CONDITION CODE-----------------
CONDITION$="Green"
IF ENERGY<ENERGY.NORMAL/10 THEN \
CONDITION$=BLNK$+"Yellow"+NORM$
IF BAD.GUYS=1 THEN \
CONDITION$=INVR$+"Orange "+NORM$
IF BAD.GUYS>1 THEN \
CONDITION$=IVB$+"* R E D * "+NORM$
6720 REM-----SENSOR OK?-----------------
IF DAMAGE(2)<0 THEN \
PRINT :\
PRINT DAM$(2);" DAMAGED !!! <---" :\
PRINT
6770 REM----------------------------
PRINT DASH$
J=1
GOSUB 6800
PRINT
J=2
GOSUB 6800
PRINT TAB(25);"StarDate";TAB(50);T
J=3
GOSUB 6800
PRINT TAB(25);"Condition";TAB(50);CONDITION$
J=4
GOSUB 6800
PRINT TAB(25);"Quadrant";TAB(50);QX;QY
J=5
GOSUB 6800
PRINT TAB(25);"Sector";TAB(50);EX;EY
J=6
GOSUB 6800
PRINT TAB(25);"Total energy";TAB(50);ENERGY+SHIELDS
J=7
GOSUB 6800
PRINT TAB(25);"Photon Torpedoes";TAB(50);TORPS
J=8
GOSUB 6800
PRINT TAB(25);"Shields";TAB(50);SHIELDS
PRINT DASH$
RETURN
6800 REM-------PRINT A LINE OF THE QUADRANT------
IF DAMAGE(2) < 0 THEN :\
GOTO 6805
FOR I=1 TO 8
PRINT GALAXY$(I,J);" ";
NEXT I
RETURN
6805 FOR I=1 TO 8
IF GALAXY$(I,J)=ENTERPRISE$ THEN :\
PRINT "E "; :\
ELSE :\
PRINT "? ";
NEXT
RETURN
7290 REM-----------LIBRARY COMPUTER CODE BEGINS HERE -------
IF DAMAGE(8)<0 THEN \
PRINT DAM$(8);" Damaged" :\
GOTO 1990
7320 REM
INPUT "Enter Computer code: "; COMPUTER.CODE
IF COMPUTER.CODE<1 OR COMPUTER.CODE>6 THEN \
GOSUB 7450 :\
GOTO 7320
ON COMPUTER.CODE GOTO 7400, 7900, 8070, 8500, 8150, 7350
GOSUB 7450 REM PRINT WHAT'S AVAILABLE
GOTO 7320
7350 GOSUB 9030
PRINT QUADRANT$ : PRINT
GOTO 1990
7450 PRINT "Functions available from Library Computer:"
PRINT " 1 - Cumulative Galactic Record"
PRINT " 2 - Status Report"
PRINT " 3 - Photon Torpedo data"
PRINT " 4 - StarBase Navigation data"
PRINT " 5 - Direction/Distance Calculator"
PRINT " 6 - Galaxy 'Region Name' map"
RETURN
7400 REM ------- CUMULATIVE GALACTIC RECORD CODE BEGINS.------
PRINT TAB(14);"T H E G A L A X Y"
FOR X=1 TO 8
PRINT TAB(X*6); X;
NEXT X
PRINT
PRINT
FOR J=1 TO 8
PRINT J;
FOR I=1 TO 8
GM = GMAP(I,J)
IF GM = 0 THEN :\
PRINT TAB(I*6); "???"; :\
GOTO 7420
XXX=I*6
IF GM<100 THEN XXX=XXX+1
IF GM<10 THEN XXX=XXX+1
IF QX=I AND QY=J THEN \
A$="<" :\
ELSE \
A$=" "
PRINT TAB(XXX); GM; A$;
7420 NEXT I
PRINT
NEXT J
GOTO 1990
7900 REM ---------- STATUS REPORT RTN ------------------
PRINT
PRINT TAB(15);"STATUS REPORT"
X$=""
IF TOT.BAD.GUYS=1 THEN GOTO 7940
X$="s"
7940 PRINT TOT.BAD.GUYS;ENEMY$+X$+" left"
PRINT "Mission must be completed in ";(T0+T9)-T;" StarDates"
IF TOT.BASES=0 THEN PRINT "No StarBases left" : GOTO 7941
IF TOT.BASES=1 THEN PRINT "1 StarBase left" : GOTO 7941
PRINT TOT.BASES;" StarBases left"
7941 PRINT "Current efficiency rating: ";((K7-TOT.BAD.GUYS)/(T-T0))*1000
GOTO 1990
8070 REM---------- TORPEDO DATA, BASE NAV, D/D CALCULATOR------
H8=0
FOR I=1 TO MAX.BADDY
IF BADDY(I,3)<=0 THEN GOTO 8480
W1=BADDY(I,1)
X=BADDY(I,2)
8120 C1=SX
A=SY
GOTO 8220
8150 PRINT "Direction/Distance Calculator:"
PRINT " You are at Quadrant (";QX;QY;") Sector (";SX;SY;")"
PRINT " Please enter --->"
PRINT " Initial Coordinates (x,y) ";
INPUT C1,A
PRINT " Final Coordinates (x,y) ";
INPUT W1,X
8220 X=X-A
A=C1-W1
IF X<0 THEN GOTO 8350
IF A<0 THEN GOTO 8410
IF X>0 THEN GOTO 8280
IF A=0 THEN GOTO 8370
8280 C1=1
8290 IF ABS(A)<=ABS(X) THEN GOTO 8330
V5=C1+(((ABS(A)-ABS(X))+ABS(A))/ABS(A))
PRINT TAB(10);"Direction = ";V5
GOTO 8460
8330 PRINT TAB(10);"Direction = ";C1+(ABS(A)/ABS(X))
GOTO 8460
8350 IF A>0 THEN GOTO 8390
IF X=0 THEN GOTO 8410
8370 C1=5
GOTO 8290
8390 C1=3
GOTO 8420
8410 C1=7
8420 IF ABS(A)>=ABS(X) THEN GOTO 8450
PRINT TAB(10);"Direction = ";C1+((ABS(X)-ABS(A))+ABS(X))/ABS(X)
GOTO 8460
8450 PRINT TAB(10);"Direction = ";C1+(ABS(X)/ABS(A))
8460 PRINT TAB(10);"Distance = ";SQR(X*X+A*A)
IF H8=1 THEN GOTO 1990
8480 NEXT I
GOTO 1990
8500 IF BASES<>0 THEN GOTO 8530
PRINT "Mr. Spock: 'Sensors show no StarBases in this Quadrant.'"
GOTO 1990
8530 PRINT "From Enterprise to StarBase:"
W1=BX
X=BY
GOTO 8120
9030 REM-----FIND QUADRANT NAME$--------------------------
QUAD=INT((QX-1)/4)+2*QX-1
QUAD.REM=QX
IF QUAD.REM>4 THEN \
QUAD.REM=QUAD.REM-4
QUADRANT$=QUAD.NAME$(QUAD)+SEGMENT$(QUAD.REM)
RETURN
9250 STOP
999999 REM-----PRINT THE INSTRUCTIONS---------------------
PRINT
PRINT "Why don't you print the file 'TREKINST'?"
PRINT "It's about 10 pages long !!!"
PRINT
FOR I=1 TO 500 : NEXT REM TIME DELAY
RETURN
9500 REM-------FIND EMPTY SECTOR-------------------------
SX=FN8
SY=FN8
IF GALAXY$(SX,SY)=EMPTY$ THEN \
RETURN
GOTO 9500
9600 REM-------COMMERCIALS-------------------------------
IF RND>.1 THEN RETURN REM - ONLY 10% CHANCE OF ANY COMMERCIAL
PRINT
PRINT " . . . . And now,"
PRINT " a word from our sponsors"
PRINT
NO.OF.COMMERCIALS = 3
NUM=INT(RND*NO.OF.COMMERCIALS)+1
ON NUM GOTO 9700, 9800, 9900
9700 PRINT "*********************************************************"
PRINT "* *"
PRINT "* IIIIIIII BBBBBB MMM MMM *"
PRINT "* II BB BB MMM MMM *"
PRINT "* II BB BB MM M M MM *"
PRINT "* II BBBBB MM M MM *"
PRINT "* II BB BB MM MM *"
PRINT "* II BB BB MM MM *"
PRINT "* II BB BB MM MM *"
PRINT "* IIIIIIII BBBBBB MMMM MMMM *"
PRINT "* *"
PRINT "* This episode of S T A R T R E K *"
PRINT "* is brought to you by IBM *"
PRINT "* *"
PRINT "* Not just DATA -- *"
PRINT "* But REALITY! *"
PRINT "* *"
PRINT "*********************************************************"
GOSUB 9950 REM - DELAY
RETURN
9800 PRINT "*********************************************************"
PRINT "* *"
PRINT "* StarTrek is brought to you by . . . . *"
PRINT "* *"
PRINT "* ========== *"
PRINT "* !++++++++! TTTTT A N N GGG *"
PRINT "* ========== T A A NN N G *"
PRINT "* ! ! T AAAAA N NN G G *"
PRINT "* !--------! T A A N N GGG *"
PRINT "* ! TANG ! *"
PRINT "* ! TANG ! Spock: Spock to Captain Kirk. Klingon *"
PRINT "* ! TANG ! Battle cruisers sighted. Condition *"
PRINT "* ! ! RED. Appearance on Bridge requested *"
PRINT "* ! Orange ! *"
PRINT "* ! flavor ! Kirk: Not now, Spock. I'm drinking *"
PRINT "* !--------! my TANG! *"
PRINT "* ========== *"
PRINT "* *"
PRINT "* Drink TANG ***** Captain Kirk does. **** *"
PRINT "* *"
PRINT "*********************************************************"
GOSUB 9950 REM DELAY
RETURN
9900 PRINT "*********************************************************"
PRINT "* *"
PRINT "* STARTREK is brought to you by: *"
PRINT "* *"
PRINT "* ---- FFFF OO RRR DDD *"
PRINT "* + + F O O R R D D *"
PRINT "* + + FFF O O RRR D D *"
PRINT "* + + F OO R R DDD *"
PRINT "* + QQQQ + F *"
PRINT "* + ! ! + *"
PRINT "* + ! ! + *"
PRINT "* + ! ! + *"
PRINT "* + ! ! + *"
PRINT "* +! !+ *"
PRINT "* +--+ *"
PRINT "* !//! *"
PRINT "* !//! FORD has a Better Idea. *"
PRINT "* !//! *"
PRINT "* -++- (FORD of Parma, Ohio) *"
PRINT "* -- *"
PRINT "* *"
PRINT "*********************************************************"
GOSUB 9950
RETURN
9950 REM --------- TIME DELAY --------------------------------
FOR I=1 TO 700
NEXT
RETURN
END