Richard Lowe Jr
Richard Lowe Jr Home

College: STRTRK Program

Prev

Next

At the time this game seemed incredibly complicated, yet I understood it from a simple glance.
20	RANDOMIZE  :DIM M%(400%),I%(4%,2%),K0%(1%),R0%(1%),Q(24%,8%),T7$(8%)=14%,P0(15%),
	D0(4%),G%(10%,10%),S0$(10%,10%)=1%,J%(1%),K%(1%),T8(10%),T$(10%)=1%,T(2%)
!-------------------------------!
! MATRIX FUNCTION		!
!-------------------------------!
30	DEF FNM%(Q1%,Q2%,T%)=(((Q2%-1%)*10%)+(Q1%-1%))*4%+T%
!-------------------------------!
! RANDOM INTEGER FUNCTION	!
!-------------------------------!
40	DEF FNR%(L,H)=INT((H-(L-1))*RND(0)+L)
!-------------------------------!
! RANDOM FLOATING FUNCTION	!
!-------------------------------!
50	DEF FNR(L,H,D%)=INT(((H-L)*RND(0)+L)*10.0^D%)/10.0^D%
!-------------------------------!
! GALAXY MATRIX LOAD (FUNCTION)	!
!-------------------------------!
60	DEF FNI%(N%)
70		L%=FNM%(FNR%(1,10),FNR%(1,10),I%(N%,1%)):
		IF M%(L%)=9% GOTO 70 ELSE

		M%(L%)=M%(L%)+1%:
		I%(N%,2%)=I%(N%,2%)-1%:
		IF I%(N%,2%)=0% THEN I%=I%+1%
80	FNEND

90	DATA	'*',0.40, 'B',0.60, 'K',0.55, 'R',0.55, 'G',0.55,
		'O',1.42, 'T',0.55, 'E',0.40
92	DATA	'STAR',BASE','KLINGON','ROMULAN','GHOSTSHIP',
		'BLACK HOLE','PHOTON TORPEDO','ENTERPRISE','DESTROYED'

100	RESTORE:READ T$(I%),T8(I%) FOR I%=1% TO 8%
	:	READ T7$(I%)  FOR I%=1% TO 8%:READ D$
	:	U0$='':U0$=U0$+CHR$(45%) FOR I%=1% TO 40%

!-------------------------------!
! RUN ENTERY POINT		!
!-------------------------------!
110	OPEN 'KB:' AS FILE #2%:SLEEP FNR%(5,7)

120	&#2%,CHR$(10%); FOR I%=1% TO 3%:&#2%,'SPACE, THE'+
	' FINAL FRONTIER.':&#2%,'THIS IS THE VOYAGE OF T'+
	'HE STARSHIP "ENTERPRISE".';"  IT'S FIVE YEAR MISSION,"
130	&#2%,'TO EXPLORE STRANGE NEW WORLDS, TO SEEK OUT'+
	' NEW LIFE AND NEW CIVILIZATIONS,':&#2%,'TO BOLD'+
	'LY GO WHERE NO MAN HAS GONE BEFORE.':&#2%,CHR$(10%)
140	&#2%,SPACE$(24%)+'S T A R  T R E K':&#2%,CHR$(10%);:
	&#2%,SPACE$(25%)+'--------------':

!     COMMENCE INITIALIZATION OF MATRICES     !

150	M%(J%)=0%     FOR J%=1% TO 400%			\
	G%(J%,K%)=-1% FOR J%=1% TO 10% FOR K%=1% TO 10% \

!     GENERATE N0. OF TYPES BASES,KLINGONS,ROMULANS & STARS     !

160	I%(1%,1%)=2%:I%(1%,2%)=FNR%(3,5)		 \

	I%(2%,1%)=3%:K0%(0%),K0%(1%),I%(2%,2%)=FNR%(5,14)\

	I%(3%,1%)=4%:R0%(0%),R0%(1%),I%(3%,2%)=FNR%(5,14)\

	I%(4%,1%)=1%:I%(4%,2%)=FNR%(170,220)		 \

!     SORT TYPES IN DESCENDING ORDER     !

170	M%=4%
180	M%=M%/2%:
	IF M%=0% GOTO 220 ELSE
	K%=4%-M%:J%=1%
190	I%=J%
200	L%=I%+M%:
	IF I%(I%,2%)>I%(L%,2%) THEN
	T%=I%(I%,1%):N%=I%(I%,2%):
	I%(I%,1%)=I%(L%,1%):I%(I%,2%)=I%(L%,2%):
	I%(L%,1%)=T%:I%(L%,2%)=N%:
	I%=I%-M%:IF I%>0% GOTO 200
210	J%=J%+1%:
	IF J%>K% GOTO 180 ELSE GOTO 190

!     LOAD  GALAXY MATRIX     !

220	I%=1%
230	ON I% GOTO 240,250,260,270,280

240	L0%=FNI%(1%)
250	L0%=FNI%(2%)
260	L0%=FNI%(3%)
270	L0%=FNI%(4%):GOTO 230

280	N%=K0%(0%)+R0%(0%):T(2%)=0:
	T(0%)=FNR(634,1679,2%):
	T(1%)=FNR(N%-0.5,N%+1.5,2%)

290	SLEEP FNR%(9,12):&#2%,CHR$(10%)+CHR$(10%):&#2%,USING
	'ORDERS:     STARDATE  ####.##',T(0%):&#2%,CHR$(10%);:
	&#2%,'     AS COMMANDER OF THE FEDRATION STARSHIP '+
	'ENTERPRISE, YOUR MISSION':&#2%,'SHOULD YOU DECIDE TO ACC';
300	&#2%,'EPT IT, IS TO DESTROY THE UNHOLY KLINGON-ROMULAN':
	&#2%,USING'ALLIANCE.  A FLEET OF ## KLINGONS AND ## ROMUL'+
	'ANS (## ALL TOGETHER )',K0%(0%),R0%(0%),N%
310	&#2%,USING 'HAVE INVADED THIS PORTION OF THE GALAXY.  Y'+
	'OU HAVE ###.## STARDATES',T(1%):&#2%,USING 'TO COM'+
	'PLETE YOUR MISSION, UNTIL STARDATE ####.##',T(0%)+T(1%);:
	&#2%,CHR$(46%):&#2%:SLEEP FNR%(9,10)

320	!     INTILIZE SHIP'S VARIABLE    !

322	E0=5000.0			! ENERGY

324	P0%=15%				! PHOTON TORPEDOES

326	M0%=500%			! CREW

328	D0(I%)=0.0 FOR I%=1% TO 4%	! DEFLECTOR SHIELDS

330	Q1%=FNR%(1,10)			! X QUADRANT COORDINATE

338	Q2%=FNR%(1,10)			! Y QUADRANT COORDINATE

339	Z9%,N0%,H%,H0%=0%:W=.53:I=.2:U=0! MAINTENANCE (VAR)

!     INTILIZE ENTERPRISE PORTION OF QUADRANT MATRIX     !

340		Q(1%,0%)=8
	:	Q(1%,1%)=FNR(1,10,0%)
	:	Q(1%,2%)=FNR(1,10,0%)
	:	Q(1%,I%)=0 FOR I%=3% TO 8%


!     MAIN MODULE SECTION II     !


!-------------------------------!
! TOLERANCE (FUNCTION)		!
!-------------------------------!
342	DEF FNT(T%,T0%,L%,L0%,O%)
	:	O=T8(T%)+T8(T0%)
	:	IF T%=10% AND O% AND(T0%=1% OR T0%=2% OR T0%=5%) THEN
		O=O+6.67*Q(1%,4%)
	:	IF O>3.0 THEN O=3.0
344		IF T%=10% AND O% AND(T0%=3% OR T0%=4%) THEN O=0.0
346		IF (T%=6% OR T0%=6%) AND O% THEN O=0.0
348		X=Q(L%,1%)-Q(L0%,1%)
	:	Y=Q(L%,2%)-Q(L0%,2%)
	:	FNT=SQR(X*X+Y*Y)-O:
	FNEND
!-------------------------------!
! ROUND INTEGER (FUNCTION)	!
!-------------------------------!
352	DEF FNR0%(R)
	:	FNR0%=INT(ABS(R)+.5)
	:	IF R<.5 THEN FNR0%=1% ELSE
		IF R>10.5 THEN FNR0%=10%
354	FNEND
!-------------------------------!
! CONDITION (FUNCTION)		!
!-------------------------------!
356	DEF FNC0$
	:	C0$='GREEN'
	:	IF E0<200.0 THEN C0$='YELLOW' ELSE
		IF Q(0%,3%)<>0 OR Q(0%,4%)<>0 THEN
		C0$='ORANGE'
357		IF Q(0%,7%)<>0 THEN C0$='RED'
		ELSE IF B% THEN C0$=''
358		FNC0$=C0$:
	FNEND
!-------------------------------!
! BOUNDARY (FUNCTION)		!
!-------------------------------!
360	DEF FNB0%(X0%,X1%)
	:	IF X0%<>1% THEN J%(0%)=X0%-1% ELSE
		J%(0%)=X0%
362		IF X0%<>10% THEN J%(1%)=X0%+1% ELSE
		J%(1%)=X0%
364		IF X1%<>1% THEN K%(0%)=X1%-1% ELSE
		K%(0%)=X1%
366		IF X1%<>10% THEN K%(1%)=X1%+1% ELSE
		K%(1%)=X1%
368	FNEND
!-------------------------------!
! POSITION ANALYSIS (FUNCTION)	!
!-------------------------------!
370	DEF FNL%(L%)
	:	FNL%=1024%
	:	IF Q=1 OR Q=2 OR Q=4 GOTO 378 ELSE
		X=Q(L%,1%):Y=Q(L%,2%)
	:	IF (X>=.5 AND X<=10.5) AND (Y>=.5 AND Y<=10.5) GOTO 378
372		J%=Q1%:K%=Q2%

	:	IF X<.5 THEN J%=J%-1% ELSE IF X>10.5 THEN J%=J%+1%
374		IF Y<.5 THEN K%=K%-1% ELSE IF Y>10.5 THEN K%=K%+1%
376		IF J%=0% OR J%=11% OR K%=0% OR K%=11% THEN
		FNL%=32% ELSE FNL%=256%
378	FNEND
!-------------------------------!
! CLEAR (FUNCTION)		!
!-------------------------------!
380	DEF FNC7(O%,T%,T0)
	:	IF (T% AND 1024%) THEN M%(FNM%(J%,K%,3%))=
		M%(FNM%(J%,K%,3%))+1%
382		M%=INT(Q(0%,0%))+1%:Q(0%,0%)=Q(0%,0%)-1
	:	IF T0<5 THEN M%(FNM%(Q1%,Q2%,T0
		))=M%(FNM%(Q1%,Q2%,T0))-1%
	:	IF T%<>1024% AND T0=3 THEN K0%(1%)=K0%(1%)-1%
		ELSE IF T0=4 THEN R0%(1%)=R0%(1%)-1%
384		FOR L%=0% TO 8%
	:	Q(O%,L%)=Q(M%,L%):Q(M%,L%)=0
	:	NEXT L%:Q(0%,T0)=Q(0%,T0)-1:
	FNEND
!-------------------------------!
! SCAN LOADER (FUNCTION)	!
!-------------------------------!
390	DEF FNL0$(L)
	:	FOR I%=1% UNTIL Q(I%,0%)=0
	:	IF Q(I%,0%)=L THEN 
		S0$(FNR0%(Q(I%,2%)),FNR0%(Q(I%,1%)))=
		T$(INT(Q(I%,0%)))
394		NEXT I%:
	FNEND
!-------------------------------!
! RECTANGULAR - POLAR (FUNCTION)!
!-------------------------------!
400	DEF FNA0(J,K,S):
	IF J=0 THEN IF K>0 THEN A=90
	       ELSE IF K<0 THEN A=270
	       ELSE IF K=0 THEN A=0
402	IF J<>0 THEN A=ATN(K/J)*57.29578
	:      IF J<0 THEN A=A+180
	       ELSE IF K=0 THEN A=360
	       ELSE IF K<0 THEN A=A+360
404	       IF S=-1 THEN A=A-360.
406	FNA0=A
408	FNEND
!-------------------------------!
! DAMAGE CONTROL (FUNCTION)	!
!-------------------------------!
410	DEF FND$(D%)='NO DAMAGE!'
!-------------------------------!
! COORDINATE UPDATE (FUNCTION)	!
!-------------------------------!
412	DEF FNU%(Q%)
	:	Q=Q(Q%,0%):IF Q=8 OR Q=3 OR Q=5
		OR Q=6 OR Q=7 THEN A0=Q(Q%,3%):X0,X1,Y0,Y1=0
	:	A1=Q(Q%,5%):M0=Q(Q%,4%):M1=Q(Q%,6%):A%,M%=-1%
	:	GOSUB 416:GOSUB 422:GOSUB 426:GOSUB 430
	:	GOSUB 434:GOTO 440
414		GOTO 442

416		IF ABS(A1-A0)>5. AND M0>.1 THEN A=A0+90*SGN(A1-A0):RETURN
418		A%=0%:IF A1<0 THEN A1,A0=A1+360 ELSE IF  A1=360 THEN
		A1,A0=0 ELSE A0=A1
420		RETURN

422		IF ABS(M1-M0)<=.05 THEN M0=M1:M%=0%:RETURN
424		M=.15382*SGN(M1-M0)*I:RETURN

426		X=M0*COS(A0*.017453):Y=M0*SIN(A0*.017453)
	:	IF A% THEN X0=W*COS(A*.017453)*M0*I
	:	Y0=W*SIN(A*.017453)*M0*I
428	RETURN

430		IF M% THEN X1=M*COS(A0*.017453)
	:	Y1=M*SIN(A0*.017453)
432	RETURN

434		X=X+X0+X1:Y=Y+Y0+Y1
	:	IF M% THEN M0=SQR(X*X+Y*Y)
436		IF A% THEN A0=FNA0(X,Y,SGN(A1))
438		Q(Q%,1%)=Q(Q%,1%)+I*(X+.5*X0+.5*X1)
	:	Q(Q%,2%)=Q(Q%,2%)-I*(Y+.5*Y0+.5*Y1):
	RETURN

440		Q(Q%,3%)=A0:Q(Q%,5%)=A1
	:	Q(Q%,4%)=M0:Q(Q%,6%)=M1
	:	IF Q=8 THEN E0=E0-100*(I*(ABS(A%*W)+ABS(M%*M)))

442	FNEND
!-------------------------------!
! MESSAGE CONTROL (FUNCTION)	!
!-------------------------------!
444	DEF FNC%(O%,J%):&#2%
	:	IF(J% AND 1024%) THEN T1%=T0%:T2%=C0%:T3%=T%:T4%=C%
446		IF(J% AND 2048%) THEN T1%=T%:T2%=C%:T3%=T0%:T4%=C0%

448		ON O% GOTO 450,452,454,456,458,460,462,464,466,468,
		470,472,474,476,478,480,482,484

450		&#2%,'KLINGON COLLIDED WITH STAR':&#2%,'KLNGN '+D$
	:	J%=256%:GOTO 486

452		&#2%,'GHOSTSHIP COLLIDED WITH STAR!':&#2%,'GHOST'+
		'SHIP '+D$:J%=256%:GOTO 486

454		L$=FNL$(T1%,T2%,0%):&#2%,D$:J%=256%:GOTO 486

456		&#2%,'KLINGON COLLIDED WITH BASE!':&#2%,'KLNGN '+D$
	:	&#2%,'BASE '+D$:J%=256%:GOTO 486

458		&#2%,'GHOSTSHIP COLLIDED WITH BASE!':&#2%,'GHOST'
		+'SHIP '+D$:&#2%,'BASE '+D$:J%=256%:GOTO 486

460		&#2%,'PHOTON TORPEDO HIT ON BASE!':&#2%,'BASE '+D$
	:	J%=256%:GOTO 486

462		&#2%,'KLINGON COLLIDED WITH KLINGON!':&#2%,'KLNGNS '+D$
	:	J%=256%:GOTO 486

464		&#2%,'KLINGON COLLIDED WITH ROMULAN!':&#2%,'KLNGN '+D$
	:	&#2%,'ROMLN '+D$:J%=256%:GOTO 486

466		&#2%,'KLINGON COLLIDED WITH GHOSTSHIP!':&#2%,'KLNGN '+D$
	:	J%=256%:GOTO 486

468		&#2%,'KLINGON ENTERING BLACK HOLE!':&#2%,'KLNGN '+D$
	:	J%=128%:GOTO 486

470		&#2%,'TORP HIT ON ';:L$=FNL$(T1%,T2%,0%):&#2%:&#2%,'KLNGN '+D$
	:	J%=256%:GOTO 486

472		&#2%,'GHOSTSHIP COLLIDED WITH ROMULAN!':&#2%,'GHOST'+
		'SHIP '+D$:&#2%,'ROMLN '+D$:J%=256%:GOTO 486

474		&#2%,'ROMULAN ENTERING BLACK HOLE!':&#2%,'ROMLN '+D$
	:	J%=128%:GOTO 486

476		&#2%,'TORP HIT ON ';:L$=FNL$(T1%,T2%,0%):&#2%:&#2%,'ROMLN '+D$
	:	J%=256%:GOTO 486

478		&#2%,'GHOSTSHIP ENTERING BLACK HOLE!':&#2%,'GHOST'+
		'SHIP '+D$:J%=256%:GOTO 486

480		&#2%,'TORP HIT ON ';:L$=FNL$(T1%,T2%,0%):&#2%:&#2%,'GHOSTSHIP '+D$
	:	J%=256%:GOTO 486

482		J%=128%:GOTO 486

484		&#2%,'TORPEDO    COLLISION WITH TOREDO   !'
	:	J%=256%:GOTO 486

486		C7=FNC7(T2%,256%,T1%):C%=C%-1%
	:	IF (J% AND 256%) THEN C7=FNC7(T4%,256%,T3%)
488	FNEND
!-------------------------------!
! CONTROL MAIN (PARA ENDING)	!
!-------------------------------!
590		ON ERROR GOTO 30000:C6%=0%
600	GOSUB 800:
		GOSUB 2000:&#2%:O0=0

601		T(2%)=T(2%)+O0*.0087
	:	IF (K0%(1%)=0% AND R0%(1%)=0%) OR E0<=0
		OR (T(1%)-T(2%))<=0 OR M0%<=0% OR Z9% THEN
		GOSUB 20000 ELSE IF (C6%=2% OR C6%=3% OR 
		C6%=15% OR C6%=16%) THEN &#2%
602		C6%=0%:GOSUB 700
603		FOR O0=I TO U STEP I
	:	IF Q(1%,4%)<1 THEN F%=INT(Q(0%,0%))+1%
		ELSE F%=1%
605		FOR O0%=1% TO F%
	:	U%=FNU%(O0%)
	:	IF(FNL%(O0%) AND 256%) GOTO 740 ELSE
		IF(FNL%(O0%) AND 32%) GOTO 724
606		NEXT O0%
	:	IF FNS5%(O0) GOTO 609 ELSE
		IF(H% OR H0% OR N0%) THEN GOSUB 1040
607		IF Q(1%,4%)<1. GOTO 624
608		IF P7% THEN GOSUB 5200
609		NEXT O0
	:	GOTO 601
!-------------------------------!
! ***************************** !
!-------------------------------!
610	DEF FNS5%(G)
	:	C=(G-INT(G))*10
	:	IF C=2 OR C=4 OR C=6 OR C=8 THEN
		FNS5%=0% ELSE FNS5%=-1%
612	FNEND

614	DEF FNL$(A%,M%,S%)
	:	&#2%,USING T7$(A%)+' AT ##.#',Q(M%,1%);
	:	&#2%,CHR$(44%);:&#2%,USING '##.# ',Q(M%,2%);
	:	IF S% THEN &#2%,USING '- SPEED:    #.####'+
		'     BEARING:    ####',Q(M%,4%),Q(M%,3%);
618	FNEND

624		FOR C%=1% TO INT(Q(0%,0%))
	:	T%=INT(Q(C%,0%))
	:	FOR C0%=C%+1% UNTIL Q(C0%,0%)=0
	:	T0%=INT(Q(C0%,0%))
	:	ON T0% GOTO 626,632,638,646,652,
		658,664
626		IF (T%=1% OR T%=2% OR T%=4% OR T%=6%) OR
		FNT(T%,T0%,C%,C0%,O%)>=0 GOTO 672 ELSE
		IF T%=8% THEN Z9%=-1%:GOTO 601
628		IF T%=3% THEN S%=FNC%(1%,1024%) ELSE
		IF T%=5% THEN S%=FNC%(2%,1024%) ELSE
		S%=FNC%(3%,1024%)
630		GOTO 674

632		IF (T%=1% OR T%=2% OR T%=4% OR T%=6%) OR
		FNT(T%,T0%,C%,C0%,0%)>=0 THEN GOTO 672 ELSE
		IF T%=8% GOTO 1500
634		IF T%=3% THEN S%=FNC%(4%,1024%) ELSE
		IF T%=5% THEN S%=FNC%(5%,1024%) ELSE
		S%=FNC%(6%,1024%)
636		GOTO 674

638		IF FNT(T%,0%,C%,C0%,0%)>=0 GOTO 672 ELSE
		IF T%=8% THEN &#2%:&#2%,'ENTERPRISE COLLISION WITH'+
		' KLINGON!':D0(I%)=0FOR I%=1%TO4%
	:	C=FNC7(C0%,256%,3):&#2%,'SHEILDS DESTROYED'
	:	Q(1%,4%),Q(1%,6%)=0:H%,H0%=0%:GOSUB 2000:&#2%:GOTO 601
640		IF T%=1% THEN S%=FNC%(1%,2048%) ELSE
		IF T%=2% THEN S%=FNC%(4%,2048%) ELSE
		IF T%=3% THEN S%=FNC%(7%,1024%) ELSE
		IF T%=4% THEN S%=FNC%(8%,1024%) ELSE
		IF T%=5% THEN S%=FNC%(9%,1024%)
642		IF T%=6% THEN S%=FNC%(10%,1024%) ELSE
		IF T%=7% THEN S%=FNC%(11%,1024%)
644		GOTO 674

646		IF(T%=1%ORT%=2%ORT%=4%)OR FNT(T%,T0%,C%,C0%,0%)>=0
		GOTO672ELSEIFT%=8%THEN&#2%,'ENTERPRISE COLLISION'+
		' WITH ROMULAN!':D0(I%)=0FORI%=1%TO4%:C=FNC7(C0%,256%,4)
	:	&#2%,'SHEILDS '+D$:Q(1%,4%),Q(1%,6%)=0:H%,H0%=0%:GOSUB 2000:&#2%:GOTO 601
648		IF T%=3% THEN S%=FNC%(8%,2048%) ELSE
		IF T%=5% THEN S%=FNC%(12%,1024%) ELSE
		IF T%=6% THEN S%=FNC%(13%,1024%) ELSE
		IF T%=7% THEN S%=FNC%(14%,1024%) 
650		GOTO 674

652		IF T%=5% OR FNT(T%,T0%,C%,C0%,0%)>=0 GOTO 672 ELSE
		IF T%=8% GOTO 1700
654		IF T%=1% THEN S%=FNC%(2%,2048%) ELSE
		IF T%=2% THEN S%=FNC%(5%,2048%) ELSE
		IF T%=3% THEN S%=FNC%(9%,2048%) ELSE
		IF T%=4% THEN S%=FNC%(12%,2048%) ELSE
		IF T%=6% THEN S%=FNC%(15%,1024%) ELSE
		S%=FNC%(17%,1024%)
656		GOTO 674

658		IF (T%=1% OR T%=2% OR T%=6% OR T%=8%) OR FNT(T%,T0%,
		C%,C0%,0%)>=0 GOTO 672
660		IF T%=3% THEN S%=FNC%(10%,2048%) ELSE
		IF T%=4% THEN S%=FNC%(13%,2048%) ELSE
		IF T%=5% THEN S%=FNC%(15%,2048%) ELSE
 		S%=FNC%(16%,1024%)
662		GOTO 674

664		IF FNT(T%,T0%,C%,C0%,0%)>=0 GOTO 672 ELSE
		IF T%=8% THEN &#2%:&#2%,'PHOTON TORPEDO HIT ON'
		+' ENTERPRISE':GOSUB 2500:GOTO 672
666		IF T%=1% THEN S%=FNC%(3%,2048%) ELSE
		IF T%=2% THEN S%=FNC%(6%,2048%) ELSE
		IF T%=3% THEN S%=FNC%(11%,2048%) ELSE
		IF T%=4% THEN S%=FNC%(14%,2048%) ELSE
		IF T%=5% THEN S%=FNC%(16%,2048%) ELSE
		IF T%=6% THEN S%=FNC%(17%,2048%)
668		IF T%=7% THEN S%=FNC%(18%,1024%)
670		GOTO 674

672		NEXT C0%
674		NEXT C%
676		GOTO 608
!-------------------------------!
! COMMAND (SUBROUTINE)		!
!-------------------------------!
700		WAIT(1%):W0$=SYS(CHR$(3%)):INPUT #2%,C6%
	:	W0$=SYS(CHR$(2%)):WAIT(0%)
704		U=TIME(0%):&#2%,'COMMAND ? ';:IF C6%<>0%
		THEN U=2:GOTO 716
708		INPUT #2%,C6%
712		U=TIME(0%)-U

716		V0=TIME(0%):
		ON C6% GOSUB 1000,2000,3000,4000,5000,
		6000,7000,8000,9000,10000,11000,12000,
		13000,14000,15000,16000,17000,18000

720		U=U+(TIME(0%)-V0)*.272:
	RETURN

!     NEW QUADRANT (SUBROUTINE)     !

724		IF Q=3 OR Q=5 THEN 
		&#2%:&#2%,T7$(Q)+' EXCEEDS GALACTIC BOUNDRIES!'
	:	&#2%,T7$(Q)+' DESTORYED!':O=FNC7(O0%,256%,Q):GOTO 606
728		IF Q=6 OR Q=7 THEN O=FNC7(O0%,256%,Q):GOTO 606

732		&#2%:&#2%,'GALACTIC LIMITS EXCEEDED!'
	:	&#2%,'SPACE-TIME WRINKLE!'
	:	Q1%=FNR%(1,10):Q2%=FNR%(1,10)

	:	Q(1%,1%)=FNR(1,10,1%):Q(1%,2%)=FNR(1,10,1%)
	:	Q(1%,4%),Q(1%,6%)=.05:Q(1%,3%),Q(1%,5%)=
		FNR(0,360,0%):H%,H0%,N0%=0%
736		&#2%,FND$(16%):&#2%,USING 'NOW IN QUADRANT ##',Q1%;
	:	&#2%,CHR$(44%);:&#2%,USING '##',Q2%:GOTO 752

	!     CHANGING QUADRANTS     !

740		IF Q=5 OR Q=6 OR Q=7 THEN O=FNC7(O0%,256%,Q):GOTO 606
744		IF Q=3 THEN &#2%:&#2%,USING 'KLINGON AT ##.#',Q(O0%,1%);
	:	&#2%,CHR$(44%);:&#2%,USING '##.# ESCAPED!',Q(O0%,2%)
	:	O=FNC7(O0%,1024%,Q):GOTO 606

748		&#2%:&#2%,USING 'LEAVING  QUADRANT ##',Q1%;:&#2%,CHR$(44%);
	:	&#2%,USING '##',Q2%:Q1%=J%:Q2%=K%
	:	&#2%,USING 'ENTERING QUADRANT ##',Q1%;:&#2%,CHR$(44%);
	:	&#2%,USING '##',Q2%

752		GOSUB 800:IF Q(1%,4%)<1.0 THEN
		GOSUB 2000:&#2%
756		GOTO 601

!     CLEAR & LOAD QUADRANT (Q1%,Q2%)     !

800		X=Q(1%,1%)
	:	Y=Q(1%,2%):P7%,P8%=0%
	:	IF X>10.5 THEN Q(1%,1%)=X-10.0 ELSE
		IF X<.5 THEN Q(1%,1%)=X+10.0
820		IF Y>10.5 THEN Q(1%,2%)=Y-10.0 ELSE
		IF Y<.5 THEN Q(1%,2%)=Y+10.0

	!     ENTERPRISE POSTION REORDERED     !

830		FOR L%=0% TO 24%
	:	IF L%=1% GOTO 840 ELSE
		Q(L%,L0%)=0 FOR L0%=0% TO 8%
840		NEXT L%

	!     LOAD STATUS MATIX     !

850		Q(0%,1%)=M%(FNM%(Q1%,Q2%,1%))
	:	Q(0%,2%)=M%(FNM%(Q1%,Q2%,2%))
	:	Q(0%,3%)=M%(FNM%(Q1%,Q2%,3%))
	:	Q(0%,4%)=M%(FNM%(Q1%,Q2%,4%))

860		IF FNR%(1,10)=5% THEN
		Q(0%,5%)=1
870		IF FNR%(1,12)=6% THEN
		Q(0%,6%)=1

880		Q(0%,0%)=Q(0%,0%)+Q(0%,L%) FOR L%=1% TO 6%	! SUM OF ALL OBJECTS !

	!     LOAD QUADRANT MATRIX     !

890		C%=1%
	:	FOR L%=1% TO 6%
	:	IF Q(0%,L%)<>0 THEN

		GOSUB 910 FOR L0%=1% TO INT(Q(0%,L%))

900		NEXT L%:IF Q(0%,6%)<>0 THEN I%=INT(Q(0%,0%))+1%
	:	Q(I%,4%),Q(I%,6%)=FNR(.15,.3,2%):Q(I%,3%),Q(I%,5%)=FNR(0,360,0%)
902	RETURN

910		C%=C%+1%
	:	Q(C%,0%)=L%
920		Q(C%,1%)=FNR(1,10,0%)
	:	Q(C%,2%)=FNR(1,10,0%)
	:	FOR L2%=1% TO C%-1%
	:	T=FNT(L%,INT(Q(L2%,0%)),C%,L2%,-1%)
	:	IF T<0.0 GOTO 920
930		NEXT L2%
	:	RETURN

!     COURSE SET (SUBROUTINE)     !

1000		INPUT #2%,'NEW BEARING?? ';Q(1%,5%)
	:	INPUT #2%,'WARP FACTOR?? ';Q(1%,6%)
	:	IF Q(1%,5%)<>Q(1%,3%) THEN H%=-1%
1005		IF Q(1%,6%)<>Q(1%,4%) THEN H0%=-1%
1010		IF (Q(1%,4%)<1 AND Q(1%,6%)>=1) THEN N0%=128% ELSE
		IF (Q(1%,6%)<1 AND Q(1%,4%)>=1) THEN N0%=256% ELSE
		N0%=0%
1020	RETURN

1040		IF Q(1%,3%)=Q(1%,5%) AND H% THEN &#2%,USING
		'A DESIRED BEARING OF #### HAS BEEN OBTAINED',
		Q(1%,5%):H%=0%
1060		IF Q(1%,4%)=Q(1%,6%) AND H0% THEN &#2%,USING
		'A DESIRED SPEED OF ##.### HAS BEEN OBTAINED',
		Q(1%,6%):H0%=0%
1080		IF(N0% AND 128% AND Q(1%,4%)>=1) THEN
		&#2%,'ENTERING HYPERSPACE!':N0%=0%
1100		IF(N0% AND 256% AND Q(1%,4%)<1) THEN
		GOSUB 2000:&#2%:N0%=0%
1120	RETURN

!     BASE DOCKING (SUBROUTINE)     !

1500		IF Q(1%,4%)<=.22 GOTO 1600 ELSE
		&#2%,'ENTERPRISE COLLISION WITH BASE!'
	:	D0(I%)=0 FOR I%=1% TO 4%
	:	&#2%,'SHEILDS '+D$:&#2%,FND$(16%)
	:	Q(1%,4%),Q(1%,6%)=0:C7=FNC7(C0%,256%,2%)
	:	GOSUB 2000:&#2%:GOTO 601

1600		&#2%,'DOCKED!!':E0=5000:P0%=15%
	:	IF M0%<500% THEN &#2%,'NO REENFORCEMENTS' ELSE
		&#2%,'TEMPORARY MAINTANENCE CREW BOARDED!'
1620		Q(1%,4%),Q(1%,6%)=0
	:	Q(1%,1%)=Q(C0%,1%)-COS(Q(1%,3%)*.017453)
	:	Q(1%,2%)=Q(C0%,2%)+SIN(Q(1%,3%)*.017453)
	:	GOSUB 2000:&#2%:GOTO 601

2000		IF Q(1%,4%)>=1 THEN &#2%,'IMPOSSIBLE - HYPERSPACE!':RETURN
2010		S0$(S%,S0%)=CHR$(46%) FOR S0%=1% TO 10%
		FOR S%=1% TO 10%:L$=FNL0$(1):L$=FNL0$(7)
	:	L$=FNL0$(5):L$=FNL0$(2):L$=FNL0$(3)
	:	L$=FNL0$(4):L$=FNL0$(8):B%=0%
	:	IF Q(0%,6%)<>0 THEN GOSUB 2360
2060		IF B% THEN &#2%,'SHORT RANGE SENSOR SCAN'+
		' FOR QUADRANT **,**' ELSE &#2%,USING 'S'+
		'HORT RANGE SENSOR SCAN FOR QUADRANT ##',
		Q1%;:&#2%,CHR$(44%);:&#2%,USING '##',Q2%
2080		&#2%,U0$
	:	FOR Y%=1% TO 10%
	:	&#2%,USING '!  ',S0$(Y%,X%); FOR X%=1% TO 10%
	:	ON Y% GOSUB 2140,2160,2180,2220,2240,2260,2280,
		2300,2320,2340
	:	NEXT Y%:&#2%,U0$;

	!     UPDATE GALATIC MAP     !

2120		G%(Q2%,Q1%)=M%(FNM%(Q1%,Q2%,1%))+M%(FNM%(
		Q1%,Q2%,2%))*10%+M%(FNM%(Q1%,Q2%,3%))*100%+
		M%(FNM%(Q1%,Q2%,4%))*1000%:B%=0%:RETURN

2140		&#2%,USING '   STARDATE ####.##   LEFT'+
		' ##.##',T(0%)+T(2%),T(1%)-T(2%):RETURN
2160		&#2%,'   CONDITION: '+FNC0$:RETURN
2180		IF B% THEN &#2%,'   SHIP POSTION **.*,**.*' ELSE
		&#2%,USING '   SHIP POSTION ##.#',Q(1%,1%);
	:	&#2%,CHR$(44%);:&#2%,USING '##.#',Q(1%,2%)
2200		RETURN
2220		&#2%,USING '   ENERGY:  ####.#',E0:RETURN
2240		&#2%,USING '   PHOTON TORPEDOES: ##',P0%:RETURN
2260		&#2%,USING '   KLINGONS LEFT:  ##',K0%(1%):RETURN
2280		&#2%,USING '   ROMULANS LEFT:  ##',R0%(1%):RETURN
2300		&#2%,'   DFLCTR POWER:';:&#2%,USING ' ####.',
		D0(I%); FOR I%=1% TO 4%:&#2%:RETURN
2320		IF B% THEN &#2%,'   BEARING:  ****' ELSE
		&#2%,USING '   BEARING:  ####',INT(Q(1%,3%))
2325		RETURN
2340		IF B% THEN &#2%,'   SPEED:  *.** PARSECS'+
		'/STARMINUTE' ELSE
		&#2%,USING '   SPEED:  #.## PARSECS/STAR'+
		'MINUTE',Q(1%,4%)
2345		RETURN

	!     BLACK HOLE     !

2360		IF FNT(10%,6%,1%,L0%,0%)>=1.42 GOTO 2400
2380		S0$(S%,S0%)=CHR$(79%) FOR S0%=1% TO 10%
		FOR S%=1% TO 10%:B%=-1%:RETURN

2400		B0%=FNB0%(FNR0%(Q(L0%,1%)),FNR0%(Q(L0%,2%)))
	:	S0$(S%,S0%)=CHR$(79%) FOR S0%=J%(0%) TO J%(1%)
		FOR S%=K%(0%) TO K%(1%):S0$(FNR0%(Q(1%,2%)),
		FNR0%(Q(1%,1%)))=T$(8%):RETURN

!     LONG RANGE SCANNER (SUBROUTINE)     !

3000		&#2%,USING '     LONG RANGE SENSOR SCAN AROUND'+
		'  QUADRANT ##',Q1%;:&#2%,CHR$(44%);:&#2%,USING
		'##',Q2%:B0%=FNB0%(Q1%,Q2%):U$=SPACE$(13%)+LEFT(
		U0$,(J%(1%)-(J%(0%)-1%))*8%):&#2%,U$:&#2%,SPACE$(13%);

3020		FOR L%=K%(0%) TO K%(1%):
		FOR L0%=J%(0%) TO J%(1%):
		G%(L%,L0%)=M%(FNM%(L0%,L%,1%))+M%(
		FNM%(L0%,L%,2%))*10%+M%(FNM%(L0%,L%,
		3%))*100%+M%(FNM%(L0%,L%,4%))*1000%
3040		&#2%,USING '  #### :',G%(L%,L0%);:
		NEXT L0%:&#2%:&#2%,U$;:
		IF L%<>K%(1%) THEN &#2%:&#2%,SPACE$(13%);
3060			NEXT L%:
	RETURN

!     PHASERS (SUBROUTINE)     !

4000	RETURN

!     PHOTON TORPEDOE (SUBROUTINE)     !

5000		IF P0%=0% THEN &#2%,'PHOTON TORPEDOES EXPENDED'
	:	RETURN
5010		&#2%,'PHOTON TORPEDOES'
	:	INPUT #2%,'HOW MANY TO FIRE??  (3 MAX): ';N%
	:	IF N%<1% OR N%>3% THEN N%=3%
5020		FOR I%=1% TO N%
	:	IF P0%=0% GOTO 5000 ELSE
		P8%=P8%+1%:P7%=P7%+1%
	:	&#2%,USING 'BEARING FOR TORPEDO ## ? ',P8%;
5030		INPUT #2%,P0(P8%):P0%=P0%-1%
	:	NEXT I%:
	RETURN

	!     PHOTON TORPEDO CALLING ROUTINE     !

5200		P7%=P7%-1%:L%=INT(Q(0%,0%))+2%:Q(0%,0%)=Q(0%,0%)+1
	:	Q(0%,7%)=Q(0%,7%)+1:Q(L%,0%)=7
	:	&#2%,USING 'TORPEDO DECK: TORPEDO ## LAUNCHED',
		P8%-P7%:M=Q(1%,4%):A=Q(1%,3%)
5210		X=M*COS(A*.017453)+.4*COS(P0(P8%-P7%)*.017453)
	:	Y=M*SIN(A*.017453)+.4*SIN(P0(P8%-P7%)*.017453)
	:	Q(L%,4%),Q(L%,6%)=SQR(X*X+Y*Y)
	:	A,Q(L%,3%),Q(L%,5%)=FNA0(X,Y,0%)
5220		Q(L%,1%)=Q(1%,1%)+COS(A*.017453)*.951
	:	Q(L%,2%)=Q(1%,2%)-SIN(A*.017453)*.951:
	RETURN

!     PULSOR BEAM (SUBROUTINE)     !

6000	RETURN

!     TRAVEL (SUBROUTINE)     !

7000	RETURN

!     STATUS REPORT (SUBROUTINE)     !

8000		&#2%,'STATUS REPORT-'
	:	&#2%,USING 'DAYS LEFT: ####.###     ENERGY: ####.###',
		T(1%)-T(2%),E0
	:	&#2%,USING 'SPEED:    ####.###    BEARING:  #####',
		Q(1%,4%),Q(1%,3%);:
	RETURN

!     DAMAGE CONTROL REPORT (SUBROUTINE)     !

9000	RETURN

!     EVASIVE MANEUVER (SUBROUTINE)     !

10000	RETURN

!     EMERGENCY EVASIVE MANEUVER (SUBROUTINE)     !

11000	RETURN

!     RAISE DEFLECTORS (SUBROUTINE)     !

12000		&#2%,'RAISE DEFLECTOR SHIELDS'
	:	FOR D%=1% TO 4%
	:	&#2%,USING 'ENERGY FOR DEFLECTORS # ='+
		' ####. ADD?? ',D%,D0(D%);
	:	INPUT #2%,D0:D0(D%)=D0(D%)+ABS(2.*D0)
	:	E0=E0-D0:NEXT D%:
	RETURN

!     LOWER SHIELDS (SUBROUTINE)     !

13000		&#2%,'DROP DEFLECTORS'
	:	D0=0.
	:	FOR D%=1% TO 4%
	:	D0=D0+D0(D%):D0(D%)=0.
	:	NEXT D%
	:	E0=E0+(D0/2.0):
	RETURN

!     OPEN COMMUNICATIONS (SUBROUTINE)

14000	RETURN

!     SHORT RNAGE TRACK (SUBROUTINE)     !

15000		&#2%,'SHORT RANGE TRACK'
	:	FOR I%=2% TO INT(Q(0%,0%))+1%
	:	N%=INT(Q(I%,0%))
	:	IF(N%=3% OR N%=5% OR N%=6% OR N%=7%) THEN
		L$=FNL$(N%,I%,-1%):&#2%
15020		NEXT I%
	:	L$=FNL$(8%,1%,-1%):
	RETURN

!     GALACTIC UPDATE (SUBROUTINE)     !

16000		&#2%,'GALACTIC UPDATE'
	:	FOR G%=1% TO 10%
	:	IF G%=Q2% AND Q1%=1% THEN
		&#2%,USING '####E',G%(G%,1%); ELSE
		&#2%,USING '#### ',G%(G%,1%);
16060		FOR G0%=2% TO 10%
	:	IF Q1%=G0% AND Q2%=G% THEN
		&#2%,USING ' ####E',G%(G%,G0%);
		ELSE &#2%,USING ' #### ',G%(G%,G0%);
16080		NEXT G0%
	:	IF G%<>10% THEN &#2%
16090		NEXT G%:
	RETURN

17000	!     LOAD MAP OF QUADRANT     !

17020	&#2%,USING 'LOAD MAP OF QUADRANT ##',Q1%;:
	&#2%,CHR$(44%);:&#2%,USING '##',Q2%
17040	FOR Y%=0% TO 8%:
	&#2%,USING '##  ',Y%;:
	FOR X%=0% UNTIL X%<>0% AND Q(X%,0%)=0:
	&#2%,USING ' ####.## ',Q(X%,Y%);:
	NEXT X%:&#2%:NEXT Y%
17060	RETURN

18000		INPUT #2%,'ACCEL, INTERVAL?  ';W,I:RETURN

!     ERROR SUBROUTINE     !

20000		J%=K0%(1%):K%=R0%(1%):L%=K0%(0%):M%=R0%(0%)
	:	T0=T(1%)-T(2%):IF (J%=0% AND K%=0%) THEN &#2%,
		'VICTORY!!' ELSE IF Z9% THEN &#2%,'COLLISION WITH STAR!'
		ELSE IF E0<=0 THEN &#2%,'OUT OF ENEGRY! SHIP DESTROYED'
20010		IF T0<=0 THEN &#2%,'TIME UP!' ELSE IF M0%<=0% THEN &#2%,
		'CREW WIPED OUT!'
20020		&#2%,CHR$(10%):&#2%,USING 'IT IS STARDATE #####.##',T(0%)+
		T(2%);:&#2%,CHR$(46%):R%=((L%+M%-(J%+K%))/(L%+M%))*1000%
	:	IF R%<360% THEN GOSUB 20100 ELSE IF R%<667% THEN GOSUB 20200
		ELSE IF R%<1000% THEN GOSUB 20300 ELSE GOSUB 20400
20030		&#2%,CHR$(10%)+CHR$(10%);:&#2%,USING 'YOU STARTED WITH'+
		' ## ENEMIES, DESTROYED ALL BUT ##',L%+M%,J%+K%
	:	&#2%,USING '## ROMULANS AND ## KLINGONS REMAIN',K%,J%
	:	&#2%,USING 'RATING = #####',R%:&#2%,'LAST UPDATE 03/18/77'
20040		&#2%,CHR$(10%)+'END OF EXECUTION'
	:	&#2%,'CPU TIME:  25.30 ELAPSED TIME: 14:36.85'
	:	&#2%,'EXIT':&#2%,CHR$(10%)+CHR$(46%):D$=
		SYS(CHR$(5%)):GOTO 32767

20100		&#2%,'DEFEAT!':&#2%,'THE ENEMY FLEET WILL CONQUER THE FED'+
		'ERATION.  YOUR DEMISE SIGNALS':&#2%,'THE END OF THE FEDERATION AND'+
		' THE CIVILIZED FREE WORLD! POSTERITY WILL'
20110		&#2%,'CURSE YOUR NAME AS THEY SLAVE UNDER THE WHIP OF THE ROMULAN'+
		' SLIME DEMONS!':RETURN

20200		&#2%,"IT'S BEEN A HARD BATTLE WITH INCONCLUSIVE RESULTS."
	:	&#2%,'YOUR SACRIFICE HAS BEEN WORTHY BUT BY NO MEANS DEFINITIVE.':RETURN

20300		&#2%,'THE ENEMY RANKS HAVE BEEN DECIMATED, LESS THAN'
	:	&#2%,"A THIRD REMAIN.  YOU WILL BE GIVEN A HERO'S BURIAL.":RETURN

20400		&#2%,'THE ENEMY IS TOTALLY DESTROYED,  THE FEDERATION IS SAVED.'
	:	&#2%,'CONGRATULATIONS,  YOU HAVE BEEN ELECTED FEDRATION PRESIDENT!'
	:	&#2%,CHR$(12%)+SPACE$(14%)+"D. L. H. SBVC '77":RETURN

30000		IF ERR=15 THEN W0$=SYS(CHR$(2%)):WAIT(0%):RESUME 704
30010		IF ERR=28 GOTO 32767 ELSE &#2%,'WHAT?? '
	:	IF ERL=700 THEN U=2 ELSE IF ERL=708 THEN U=TIME(0%)-U
		ELSE U=U+(TIME(0%)-V0)*.272
30020	RESUME 603
32767	END

Unless otherwise noted, all photos and text is Copyright © Richard G Lowe, Jr.