! Star Trek Classical translated to RFO Basic!
! Graphics @2013 Aat Don
CONSOLE.TITLE "Star Trek Classical"
GR.OPEN 255,0,0,0,0,1
GR.SCREEN w,h
ScreenWidth=720
ScreenHeight=h/w*ScreenWidth
sX=w/ScreenWidth
sY=h/ScreenHeight
GR.SCALE sX,sY
WAKELOCK 3
DataDir$="../../StarTrek/data/"
GR.BITMAP.LOAD Intro,DataDir$+"Enterprise.png"
GR.BITMAP.LOAD Pl,DataDir$+"Planet.png"
GR.BITMAP.LOAD P2,DataDir$+"SmallEnterprise.png"
GR.BITMAP.LOAD P3,DataDir$+"Klingon.png"
GR.BITMAP.LOAD P4,DataDir$+"StarBase.png"
AUDIO.LOAD AF1,DataDir$+"Opening.mp3"
AUDIO.STOP
AUDIO.PLAY AF1
AUDIO.LOAD AF2,DataDir$+"Phasers.mp3"
AUDIO.LOAD AF3,DataDir$+"Photontorpedo.mp3"
AUDIO.LOAD AF4,DataDir$+"Processing.mp3"
AUDIO.LOAD AF5,DataDir$+"ShieldOn.mp3"
AUDIO.LOAD AF6,DataDir$+"Computerbeep.mp3"
GR.CLS
GR.SET.STROKE 3
GR.TEXT.SIZE 130
GR.TEXT.BOLD 1
GR.COLOR 255,0,255,0,0
GR.TEXT.DRAW g,30,140,"STAR TREK"
! Create some stars
NS=FLOOR(RND()*20+20)
FOR i=1 TO NS
    Rad=FLOOR(RND()*8+2)
    x1=FLOOR(RND()*720)
    y1=FLOOR(RND()*720)
    FOR j=1 TO Rad
      GR.COLOR 255-(j-1)*20,255-(j-1)*20,255-(j-1)*20,255-(j-1)*20,0
      GR.CIRCLE g,x1,y1,j
    Next j
    GR.LINE g,x1-Rad*2,y1,x1+Rad*2,y1
    GR.LINE g,x1,y1-Rad*2,x1,y1+Rad*2
Next i
! Some planet
GR.BITMAP.DRAW Planet,Pl,219,229
GR.TEXT.SIZE 60
GR.COLOR 255,0,0,255,1
GR.TEXT.DRAW g,20,780,"The RFO-BASIC! version."
GR.BITMAP.DRAW EPrise,Intro,-600,0
FOR i=-600 To 720 STEP 10
  j=j-i*0.02
  GR.MODIFY EPrise,"x",i
  GR.MODIFY EPrise,"y",j
  GR.RENDER
NEXT i
! Initialize variables
Z$="                         "
DIM G[8,8],C[9,2],K[3,3],N[3],Z[8,8],D[8]
T=FLOOR(RND()*20+20)*100
T0=T
T9=25+FLOOR(RND()*10)
D0=0
E=3000
E0=E
P=10
P0=P
S9=200
S=0
B9=0
K9=0
X$=""
X0$=" IS "
FN.DEF FNR(R)
	R=FLOOR(RND()*7.98+1.01)
	FN.RTN R
FN.END
! Initialize Enterprise's postion
Q1=FNR(R)
Q2=FNR(R)
S1=FNR(R)
S2=FNR(R)
FOR I=1 TO 9
	C[I,1]=0
	C[I,2]=0
NEXT I
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
	D[I]=0
NEXT I
A1$="NAVSRSLRSPHATORSHEDAMCOMXXX"
! Setup what exists in galaxy
! K3= # Klingons D3= # Starbases S3= # Stars
FOR I=1 TO 8
	FOR J=1 TO 8
		K3=0
		Z[I,J]=0
		R1=RND()
		IF R1>0.98 THEN
			K3=3
			K9=K9+3
			GOTO Label01
		ENDIF
		IF R1>0.95 THEN
			K3=2
			K9=K9+2
			GOTO Label01
		ENDIF
		IF R1>0.8 THEN
			K3=1
			K9=K9+1
		ENDIF
Label01:
		B3=0
		IF RND()>0.96 THEN
			B3=1
			B9=B9+1
		ENDIF
		G[I,J]=K3*100+B3*10+FNR(R)
	NEXT J
NEXT I
IF K9>T9 THEN T9=K9+1
IF B9<>0 THEN GOTO Label02
IF G[Q1,Q2]<200 THEN
	G[Q1,Q2]=G[Q1,Q2]+100
	K9=K9+1
ENDIF
B9=1
G[Q1,Q2]=G[Q1,Q2]+10
Q1=FNR(R)
Q2=FNR(R)
Label02:
K7=K9
IF B9<>1 THEN
	X$="S"
	X0$=" ARE "
ENDIF
GR.COLOR 0,0,0,0,1
GR.RECT fade,0,0,720,780
GR.TEXT.SIZE 30
GR.COLOR 0,255,255,255,1
GR.TEXT.DRAW g1,20,50,"YOUR ORDERS ARE AS FOLLOWS:"
GR.TEXT.ALIGN 2
GR.TEXT.DRAW g2,360,150,"DESTROY THE "+REPLACE$(FORMAT$("##",K9)," ","")+" KLINGON WARSHIPS WHICH"
GR.TEXT.DRAW g3,360,200,"HAVE INVADED THE GALAXY BEFORE THEY CAN"
GR.TEXT.DRAW g4,360,250,"ATTACK FEDERATION HEADQUARTERS ON"
GR.TEXT.DRAW g5,360,300,"STARDATE "+REPLACE$(FORMAT$("####",T0+T9)," ","")+". THIS GIVES YOU "+REPLACE$(FORMAT$("##",T9)," ","")+" DAYS."
GR.TEXT.DRAW g6,360,350,"THERE"+X0$+REPLACE$(FORMAT$("#",B9)," ","")+" STARBASE"+X$+" IN THE GALAXY"
GR.TEXT.DRAW g7,360,400,"FOR RESUPPLYING YOUR SHIP."
FOR i=0 TO 255 STEP 15
  GR.MODIFY fade,"alpha",i
  GR.MODIFY g1,"alpha",i
  GR.MODIFY g2,"alpha",i/2
  GR.MODIFY g2,"y",720-2.2*i
  GR.MODIFY g3,"alpha",i/2
  GR.MODIFY g3,"y",770-2.2*i
  GR.MODIFY g4,"alpha",i/2
  GR.MODIFY g4,"y",820-2.2*i
  GR.MODIFY g5,"alpha",i/2
  GR.MODIFY g5,"y",870-2.2*i
  GR.MODIFY g6,"alpha",i/2
  GR.MODIFY g6,"y",920-2.2*i
  GR.MODIFY g7,"alpha",i/2
  GR.MODIFY g7,"y",970-2.2*i
  GR.RENDER
  PAUSE 100
NEXT i
FOR i=128 TO 255 STEP 15
  GR.MODIFY g2,"alpha",i
  GR.MODIFY g3,"alpha",i
  GR.MODIFY g4,"alpha",i
  GR.MODIFY g5,"alpha",i
  GR.MODIFY g6,"alpha",i
  GR.MODIFY g7,"alpha",i
  GR.RENDER
  PAUSE 200
NEXT i
DO
  AUDIO.ISDONE Done
UNTIL Done
GR.TEXT.ALIGN 1
GR.COLOR 255,255,255,0,1
GR.TEXT.DRAW g,20,600,"Tap screen to accept your mission"
GR.RENDER
GR.BITMAP.DELETE Intro
GR.BITMAP.DELETE Pl
AUDIO.STOP
AUDIO.RELEASE AF1
GR.TEXT.SIZE 25
DO
  GR.TOUCH TOUCHED, tX,tY
UNTIL TOUCHED
DO
  GR.TOUCH TOUCHED, tX,tY
UNTIL !TOUCHED
GR.CLS

! Here any time new quadrant is entered
Label35:
GR.FRONT 1
GR.COLOR 255,255,255,255,1
Z4=Q1
Z5=Q2
K3=0
B3=0
S3=0
G5=0
D4=0.5*RND()
Z[Q1,Q2]=G[Q1,Q2]
IF Q1<1 | Q1>8 | Q2<1 | Q2>8 THEN GOTO Label06
GOSUB SRoutine09
IF T0<>T THEN GOTO Label05
POPUP "YOUR MISSION BEGINS WITH YOUR STARSHIP LOCATED IN THE GALACTIC QUADRANT '"+G2$+"'.",0,-200,1
GOTO Label07
Label05:
POPUP "NOW ENTERING "+G2$+" QUADRANT . . .",0,-200,1
Label07:
K3=FLOOR(G[Q1,Q2]*0.01)
B3=FLOOR(G[Q1,Q2]*0.1)-10*K3
S3=G[Q1,Q2]-100*K3-10*B3
IF K3=0 THEN GOTO Label08
POPUP "COMBAT AREA      CONDITION RED",0,-200,0
IF S>200 THEN GOTO Label08
POPUP "SHIELDS DANGEROUSLY LOW",0,-200,0
Label08:
FOR I=1 TO 3
	K[I,1]=0
	K[I,2]=0
NEXT I
FOR I=1 TO 3
	K[I,3]=0
NEXT I
Q$=Z$+Z$+Z$+Z$+Z$+Z$+Z$+LEFT$(Z$,17)
Label06:
! Position Enterprise in quadrant, then place K3 Klingons and
! B3 Starbases and S3 Stars elsewhere
A$="<E>"
Z1=S1
Z2=S2
GOSUB SRoutine02
IF K3<1 THEN GOTO Label09
FOR I=1 TO K3
	GOSUB SRoutine03
	A$="+K+"
	Z1=R1
	Z2=R2
	GOSUB SRoutine02
	K[I,1]=R1
	K[I,2]=R2
	K[I,3]=S9*(0.5+RND())
NEXT I
Label09:
IF B3<1 THEN GOTO Label10
GOSUB SRoutine03
A$=">B<"
Z1=R1
B4=R1
Z2=R2
B5=R2
GOSUB SRoutine02
Label10:
FOR I=1 TO S3
	GOSUB SRoutine03
	A$=" * "
	Z1=R1
	Z2=R2
	GOSUB SRoutine02
NEXT I

Label23:
GOSUB SRoutine04
CLS
Label15:
IF S+E>10 THEN
	IF E>10 | D[7]=0 THEN	GOTO Label11
ENDIF
GR.FRONT 0
PRINT "** FATAL ERROR **"
PRINT "YOU'VE JUST STRANDED YOUR SHIP IN SPACE."
PRINT "YOU HAVE INSUFFICIENT MANEUVERING ENERGY,"
PRINT "AND SHIELD CONTROL IS PRESENTLY INCAPABLE OF"
PRINT "CROSS-CIRCUITING TO ENGINE ROOM!!"
PRINT
GOTO Label12
Label11:
! Show commands
GR.FRONT 1
GR.COLOR 255,255,0,0,1
GR.RECT g,0,710,719,850
GR.COLOR 255,255,255,0,1
GR.RECT g,0,780,719,830
FOR i=0 TO 8
  GR.COLOR 255,255,255,0,1
  GR.RECT g,i*65+(i+1)*10+20,720,(i+1)*65+(i+1)*10+20,755
  GR.COLOR 255,0,0,0,0
  GR.TEXT.DRAW g,i*65+(i+1)*10+27,745,MID$(A1$,i*3+1,3)
NEXT i
GR.TEXT.DRAW g,290,810,"H  E  L  P"
GR.COLOR 255,255,255,255,0
GR.RENDER
DO
  DO
    GR.TOUCH TOUCHED, tX,tY
  UNTIL TOUCHED
  DO
    GR.TOUCH TOUCHED, tX,tY
  UNTIL !TOUCHED
  tX=ROUND(tX/sx)
  tY=ROUND(tY/sy)
UNTIL tY>720 & tY<830
IF tY>780 THEN GOTO ExplComs
IF tX>0 & tX<101 THEN GOTO Label14
IF tX>100 & tX<176 THEN GOTO Label23
IF tX>175 & tX<251 THEN GOTO Label16
IF tX>250 & tX<326 THEN GOTO Label17
IF tX>325 & tX<401 THEN GOTO Label18
IF tX>400 & tX<476 THEN GOTO Label19
IF tX>475 & tX<551 THEN GOTO Label20
IF tX>550 & tX<626 THEN GOTO Label21
IF tX>625 & tX<720 THEN GOTO Label222
ExplComs:
GR.FRONT 0
CLS
PRINT "Tap one of the following 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 "Tap anywhere on text to resume"
ScrnRet=0
DO
UNTIL ScrnRet=1
GOTO Label23
Label222:
INPUT "Are you sure ?",Answer$,"N"
IF UPPER$(Answer$)="N" THEN GOTO Label23
GOTO Label22
Label14:
! Course control begins here
GR.FRONT 0
PRINT "Enterprise navigation in progress..."
PRINT "        3"
PRINT "      5 + 1"
PRINT "        7"
INPUT "COURSE (0-9)",C1
IF C1=9 THEN C1=1
IF C1>=1 & C1<9 THEN GOTO Label240
POPUP "LT. SULU: 'INCORRECT COURSE DATA, SIR!'",0,-200,0
GR.FRONT 1
GOTO Label23
Label240:
PRINT "COURSE "+REPLACE$(FORMAT$("%.#",C1)," ","")
X$="8"
IF D[1]<0 THEN X$="0.2"
INPUT "WARP FACTOR (0-"+X$+")",W1
IF D[1]<0 & W1>0.2 THEN GOTO Label24
IF W1>0 & W1<=8 THEN GOTO Label25
IF W1=0 THEN GOTO Label23
POPUP "CHIEF ENGINEER SCOTT: 'THE ENGINES WON'T TAKE WARP"+W1+"!'",0,-200,0
GOTO Label23
Label24:
POPUP "WARP ENGINES ARE DAMAGED.  MAXIUM SPEED = WARP 0.2",0,-200,0
GOTO Label23
Label25:
PRINT "WARP FACTOR "+REPLACE$(FORMAT$("%.#",W1)," ","")
N=FLOOR(W1*8+0.5)
IF E-N>=0 THEN GOTO Label26
POPUP "ENGINEERING:'INSUFFICIENT ENERGY AVAILABLE FOR MANEUVERING AT WARP"+W1+"!'",0,-200,0
IF S<N-E | D[7]<0 THEN GOTO Label23
POPUP "DEFLECTOR CONTROL ROOM: "+S+" UNITS OF ENERGY PRESENTLY DEPLOYED TO SHIELDS.",0,-200,0
GOTO Label23
Label26:
! Klingons move/fire on moving starship
FOR I=1 TO K3
	IF K[I,3]=0 THEN GOTO Label27
	A$="   "
	Z1=K[I,1]
	Z2=K[I,2]
	GOSUB SRoutine02
	GOSUB SRoutine03
	K[I,1]=Z1
	K[I,2]=Z2
	A$="+K+"
  AUDIO.STOP
  AUDIO.PLAY AF2
	GOSUB SRoutine02
Label27:
NEXT I
GOSUB SRoutine05
D1=0
D6=W1
IF W1>=1 THEN D6=1
FOR I=1 TO 8
	IF D[I]>=0 THEN GOTO Label28
	D[I]=D[I]+D6
	IF D[I]>-0.1 & D[I]<0 THEN
    D[I]=-0.1
    GOTO Label28
  ENDIF
	IF D[I]<0 THEN GOTO Label28
	IF D1<>1 THEN
    D1=1
		PRINT "DAMAGE CONTROL REPORT:"
	ENDIF
	R1=I
	GOSUB SRoutine06
	PRINT G2$+" REPAIR COMPLETED."
Label28:
NEXT I
IF RND()>0.2 THEN GOTO Label29
R1=FNR(R)
IF RND()>=0.6 THEN GOTO Label30
D[R1]=D[R1]-(RND()*5+1)
PRINT "DAMAGE CONTROL REPORT:"
GOSUB SRoutine06
PRINT G2$+" DAMAGED"
GOTO Label29
Label30:
D[R1]=D[R1]+RND()*3+1
PRINT "DAMAGE CONTROL REPORT:"
GOSUB SRoutine06
PRINT G2$+" STATE OF REPAIR IMPROVED"
Label29:
! Begin moving starship
A$="   "
Z1=FLOOR(S1)
Z2=FLOOR(S2)
GOSUB SRoutine02
X1=C[C1,1]+(C[C1+1,1]-C[C1,1])*(C1-FLOOR(C1))
X=S1
Y=S2
X2=C[C1,2]+(C[C1+1,2]-C[C1,2])*(C1-FLOOR(C1))
Q4=Q1
Q5=Q2
FOR I=1 TO N
	S1=S1+X1
	S2=S2+X2
	IF S1<1 | S1>=9 | S2<1 | S2>=9 THEN
    Br01=1
    F_N.BREAK
  ENDIF
	S8=FLOOR(S1)*24+FLOOR(S2)*3-26
	IF MID$(Q$,S8,2)="  " THEN GOTO Label32
	S1=FLOOR(S1-X1)
	S2=FLOOR(S2-X2)
	PRINT "WARP ENGINES SHUT DOWN AT SECTOR "+REPLACE$(FORMAT$("#",S1)," ","")+","+REPLACE$(FORMAT$("#",S2)," ","")+" DUE TO BAD NAVAGATION"
  Br02=1
  F_N.BREAK
Label32:
NEXT I
IF Br01=1 THEN
  Br01=0
  GOTO Label31
ENDIF
IF Br02=1 THEN
  Br02=0
  GOTO Label33
ENDIF
S1=FLOOR(S1)
S2=FLOOR(S2)
Label33:
A$="<E>"
Z1=FLOOR(S1)
Z2=FLOOR(S2)
GOSUB SRoutine02
GOSUB SRoutine07
T8=1
IF W1<1 THEN T8=0.1*FLOOR(10*W1)
T=T+T8
IF T>T0+T9 THEN GOTO Label12
PRINT
PRINT "Tap anywhere on text to resume"
ScrnRet=0
DO
UNTIL ScrnRet=1
GOTO Label23
Label31:
! Exceeded quadrant limits
X=8*Q1+X+N*X1
Y=8*Q2+Y+N*X2
Q1=FLOOR(X/8)
Q2=FLOOR(Y/8)
S1=FLOOR(X-Q1*8)
S2=FLOOR(Y-Q2*8)
IF S1=0 THEN
	Q1=Q1-1
	S1=8
ENDIF
IF S2=0 THEN
	Q2=Q2-1
	S2=8
ENDIF
X5=0
IF Q1<1 THEN
	X5=1
	Q1=1
	S1=1
ENDIF
IF Q1>8 THEN
	X5=1
	Q1=8
	S1=8
ENDIF
IF Q2<1 THEN
	X5=1
	Q2=1
	S2=1
ENDIF
IF Q2>8 THEN
	X5=1
	Q2=8
	S2=8
ENDIF
IF X5=0 THEN GOTO Label34
GR.FRONT 0
PRINT "LT. UHURA: MESSAGE FROM STARFLEET COMMAND --"
PRINT "PERMISSION TO ATTEMPT CROSSING OF GALACTIC"
PRINT "PERIMETER IS HEREBY DENIED. SHUT DOWN YOUR ENGINES."
PRINT "CHIEF ENGINEER SCOTT:  'WARP ENGINES SHUT DOWN"
PRINT "AT SECTOR "+REPLACE$(FORMAT$("#",S1)," ","")+","+REPLACE$(FORMAT$("#",S2)," ","")+" OF QUADRANT "+REPLACE$(FORMAT$("#",Q1)," ","")+","+REPLACE$(FORMAT$("#",Q2)," ","")+".'"
PAUSE 5000
IF T>T0+T9 THEN GOTO Label12
Label34:
IF 8*Q1+Q2=8*Q4+Q5 THEN GOTO Label33
T=T+1
GOSUB SRoutine07
GOTO Label35
END

SRoutine07:
! Maneuver energy S/R
  E=E-N-10
  IF E>=0 THEN RETURN
  POPUP "SHIELD CONTROL SUPPLIES ENERGY TO COMPLETE THE MANEUVER.",0,-200,1
  S=S+E
  E=0
  IF S<=0 THEN S=0
RETURN

Label16:
! Long range sensor scan code
IF D[3]<0 THEN
  POPUP "LONG RANGE SENSORS ARE INOPERABLE.",0,-200,0
  GOTO Label23
ENDIF
GR.CLS
GR.COLOR 255,0,255,0,0
GR.TEXT.DRAW g,130,50,"LONG RANGE SCAN FOR QUADRANT"+FORMAT$("#",Q1)+","+REPLACE$(FORMAT$("#",Q2)," ","")
GR.SET.STROKE 3
GR.COLOR 255,255,255,0,1
GR.RECT g,110,120,600,590
GR.COLOR 255,0,0,0,1
GR.RECT g,130,140,580,570
GR.COLOR 255,0,255,0,0
GR.RECT g,130,140,580,570
GR.LINE g,130,274,580,274
GR.LINE g,130,418,580,418
GR.LINE g,280,140,280,570
GR.LINE g,430,140,430,570
GR.TEXT.SIZE 60
FOR I=Q1-1 TO Q1+1
	N[1]=-1
  N[2]=-2
	N[3]=-3
	FOR J=Q2-1 TO Q2+1
		IF I>0 & I<9 & J>0 & J<9 THEN
			N[J-Q2+2]=G[I,J]
			Z[I,J]=G[I,J]
		ENDIF
	NEXT J
	FOR L=1 TO 3
		IF N[L]<0 THEN
      GR.TEXT.DRAW g,(L-1)*150+150,(I-Q1+1)*150+220,"***"
			GOTO Label36
		ENDIF
    GR.TEXT.DRAW g,(L-1)*150+150,(I-Q1+1)*150+220,MID$(STR$(N[L]+1000),2,3)
Label36:
	NEXT L
NEXT I
GR.COLOR 255,0,0,0,1
GR.RECT gy,131,i,579,570
GR.COLOR 255,0,255,0,1
GR.LINE gl,131,i,579,i
FOR i=140 TO 570 STEP 10
  GR.MODIFY gy,"top",i
  GR.MODIFY gl,"y1",i
  GR.MODIFY gl,"y2",i
  GR.RENDER
  AUDIO.STOP
  AUDIO.PLAY AF4
  PAUSE 100
NEXT i
GR.SET.STROKE 0
GR.TEXT.SIZE 25
GR.COLOR 255,255,255,255,0
GR.TEXT.DRAW g,10,610,"NNN"
GR.TEXT.DRAW g,380,690,"*** = outside Galaxy"
GR.TEXT.DRAW g,80,630,"number of Stars"
GR.TEXT.DRAW g,80,660,"number of Starbases"
GR.TEXT.DRAW g,80,690,"number of Klingons"
GR.LINE g,20,612,20,690
GR.LINE g,20,690,80,690
GR.LINE g,36,612,36,660
GR.LINE g,36,660,80,660
GR.LINE g,52,612,52,630
GR.LINE g,52,630,80,630
GR.RENDER
PAUSE 1000
GOTO Label15

Label17:
! Phaser control code begins here
IF D[4]<0 THEN
  POPUP "PHASERS INOPERATIVE.",0,-200,0
  GOTO Label23
ENDIF
IF K3>0 THEN GOTO Label37
Label84:
POPUP "SCIENCE OFFICER SPOCK: 'SENSORS SHOW NO ENEMY SHIPS IN THIS QUADRANT'",0,-200,0
GOTO Label23
Label37:
IF D[8]<0 THEN
  POPUP "COMPUTER FAILURE HAMPERS ACCURACY.",0,-200,0
ENDIF
POPUP "PHASERS LOCKED ON TARGET:",0,-200,0
Label370:
POPUP "ENERGY AVAILABLE ="+FORMAT$("###%",E)+" UNITS",0,-200,0
INPUT "NUMBER OF UNITS TO FIRE",X
IF X<=0 THEN GOTO Label23
IF E-X<0 THEN GOTO Label370
AUDIO.STOP
AUDIO.PLAY AF2
E=E-X
IF D[7]<0 THEN X=X*RND()
H1=FLOOR(X/K3)
FOR I=1 TO 3
	IF K[I,3]<=0 THEN GOTO Label38
	H=FLOOR((H1/SQR((K[I,1]-S1)^2+(K[I,2]-S2)^2))*(RND()+2))
	IF H>0.15*K[I,3]THEN GOTO Label39
	POPUP "SENSORS SHOW NO DAMAGE TO ENEMY AT"+FORMAT$("#",K[I,1])+","+REPLACE$(FORMAT$("#",K[I,2])," ","")+".",0,-200,0
	GOTO Label38
Label39:
	K[I,3]=K[I,3]-H
	POPUP REPLACE$(FORMAT$("###%",H)," ","")+" UNIT HIT ON KLINGON AT SECTOR"+FORMAT$("#",K[I,1])+","+REPLACE$(FORMAT$("#",K[I,2])," ","")+".",0,-200,0
	IF K[I,3]<=0 THEN
		POPUP "*** KLINGON DESTROYED ***",0,-200,0
		GOTO Label40
	ENDIF
	POPUP "(SENSORS SHOW"+FORMAT$("#%",K[I,3])+" UNITS REMAINING)",0,-200,0
  GOTO Label38
Label40:
	K3=K3-1
	K9=K9-1
	Z1=K[I,1]
	Z2=K[I,2]
	A$="   "
	GOSUB SRoutine02
	K[I,3]=0
	G[Q1,Q2]=G[Q1,Q2]-100
	Z[Q1,Q2]=G[Q1,Q2]
	IF K9<=0 THEN GOTO Label41
Label38:
NEXT I
GOSUB SRoutine05
GOTO Label23

Label18:
! Photon torpedo code begins here
IF P<=0 THEN
	POPUP "ALL PHOTON TORPEDOES EXPENDED.",0,-200,0
	GOTO Label23
ENDIF
IF D[5]<0 THEN
	POPUP "PHOTON TUBES ARE NOT OPERATIONAL.",0,-200,0
	GOTO Label23
ENDIF
Label49:
INPUT "PHOTON TORPEDO COURSE (1-9)",C1
IF C1=9 THEN C1=1
IF C1>=1 & C1<9 THEN GOTO Label42
POPUP "ENSIGN CHEKOV: 'INCORRECT COURSE DATA, SIR!'",0,-200,0
GOTO Label23
Label42:
X1=C[C1,1]+(C[C1+1,1]-C[C1,1])*(C1-FLOOR(C1))
E=E-2
P=P-1
X2=C[C1,2]+(C[C1+1,2]-C[C1,2])*(C1-FLOOR(C1))
X=S1
Y=S2
GR.FRONT 0
CLS
AUDIO.STOP
AUDIO.PLAY AF3
PRINT "TORPEDO TRACK:"
Label44:
X=X+X1
Y=Y+X2
X3=FLOOR(X+0.5)
Y3=FLOOR(Y+0.5)
IF X3<1 | X3>8 | Y3<1 | Y3>8 THEN GOTO Label43
PRINT REPLACE$(FORMAT$("%",X3)," ","")+","+REPLACE$(FORMAT$("%",Y3)," ","")
A$="   "
Z1=X
Z2=Y
GOSUB SRoutine08
IF Z3<>0 THEN GOTO Label44
A$="+K+"
Z1=X
Z2=Y
GOSUB SRoutine08
IF Z3=0 THEN GOTO Label45
PRINT "*** KLINGON DESTROYED ***"
K3=K3-1
K9=K9-1
IF K9<=0 THEN GOTO Label41
FOR I=1 TO 3
  IF X3=K[I,1] & Y3=K[I,2] THEN F_N.BREAK
NEXT I
IF I>3 THEN I=3
K[I,3]=0
GOTO Label47
Label45:
A$=" * "
Z1=X
Z2=Y
GOSUB SRoutine08
IF Z3=0 THEN GOTO Label48
PRINT "STAR AT"+FORMAT$("#",X3)+","+REPLACE$(FORMAT$("#",Y3)," ","")+" ABSORBED TORPEDO ENERGY."
GOSUB SRoutine05
GOTO Label230
Label48:
A$=">!<"
Z1=X
Z2=Y
GOSUB SRoutine08
IF Z3=0 THEN GOTO Label49
PRINT "*** STARBASE DESTROYED ***"
B3=B3-1
B9=B9-1
IF B9>0 | K9>T-T0-T9 THEN GOTO Label50
PRINT "THAT DOES IT, CAPTAIN!! YOU ARE HEREBY RELIEVED OF COMMAND "
PRINT "AND SENTENCED TO 99 STARDATES AT HARD LABOR ON CYGNUS 12!!"
GOTO Label22
Label50:
PRINT "STARFLEET COMMAND REVIEWING YOUR RECORD TO CONSIDER COURT MARTIAL!"
D0=0
Label47:
Z1=X
Z2=Y
A$="   "
GOSUB SRoutine02
G[Q1,Q2]=K3*100+B3*10+S3
Z[Q1,Q2]=G[Q1,Q2]
GOSUB SRoutine05
GOTO Label230
Label43:
PRINT "TORPEDO MISSED."
GOSUB SRoutine05
Label230:
PRINT
PRINT "Tap anywhere on text to resume"
ScrnRet=0
DO
UNTIL ScrnRet=1
GOTO Label23

Label19:
! Shield control
IF D[7]<0 THEN
  POPUP "SHIELD CONTROL INOPERABLE.",0,-200,0
  GOTO Label23
ENDIF
POPUP "ENERGY AVAILABLE = "+FORMAT$("#####",E+S),0,-300,0
INPUT "NUMBER OF UNITS TO SHIELDS",X
IF X<0 | S=X THEN
  POPUP "<SHIELDS UNCHANGED>",0,-200,0
  GOTO Label23
ENDIF
IF X<=E+S THEN GOTO Label51
POPUP "SHIELD CONTROL:  'THIS IS NOT THE FEDERATION TREASURY.'" ,0,-200,0
POPUP "<SHIELDS UNCHANGED>",0,-200,0
GOTO Label23
Label51:
AUDIO.STOP
AUDIO.PLAY AF5
E=E+S-X
S=X
POPUP "DEFLECTOR CONTROL ROOM:'SHIELDS NOW AT"+FORMAT$("####%",FLOOR(S))+" UNITS PER YOUR COMMAND.'",0,-200,0
GOTO Label23

Label20:
! Damage control
CLS
IF D[6]>=0 THEN GOTO Label52
POPUP "DAMAGE CONTROL REPORT NOT AVAILABLE.",0,-200,0
IF D0=0 THEN GOTO Label23
Label53:
D3=0
FOR I=1 TO 8
	IF D[I]<0 THEN D3=D3+0.1
NEXT I
IF D3=0 THEN GOTO Label23
D3=D3+D4
IF D3>=1 THEN D3=0.9
GR.FRONT 0
PRINT
PRINT "TECHNICIANS STANDING BY TO EFFECT REPAIRS TO YOUR SHIP:"
PRINT "ESTIMATED TIME TO REPAIR:"+FORMAT$("###%",0.01*FLOOR(100*D3))+" STARDATES."
INPUT "WILL YOU AUTHORIZE THE REPAIR ORDER (Y/N)",A$,"Y"
IF UPPER$(A$)<>"Y" THEN GOTO Label23
FOR I=1 TO 8
	IF D[I]<0 THEN D[I]=0
NEXT I
T=T+D3+0.1
Label52:
GR.FRONT 0
PRINT"DEVICE             STATE OF REPAIR"
PRINT"------             ---------------"
FOR R1=1 TO 8
	GOSUB SRoutine06
	PRINT G2$+LEFT$(Z$,25-LEN(G2$))+FORMAT$("###%",FLOOR(D[R1]*100)*0.01)
NEXT R1
IF D0<>0 THEN
  PAUSE 5000
  GOTO Label53
ENDIF
PRINT
PRINT "Tap anywhere on text to resume"
ScrnRet=0
DO
UNTIL ScrnRet=1
GOTO Label23

SRoutine05:
! Klingons shooting
  IF K3<=0 THEN RETURN
  IF D0<>0 THEN
    POPUP "STARBASE SHIELDS PROTECT THE ENTERPRISE.",0,-200,0
    RETURN
  ENDIF
  FOR I=1 TO 3
    IF K[I,3]<=0 THEN GOTO Label54
    H=FLOOR((K[I,3]/SQR((K[I,1]-S1)^2+(K[I,2]-S2)^2))*(2+RND()))
    S=S-H
    K[I,3]=K[I,3]/(3+RND())
    POPUP FORMAT$("###%",H)+" UNIT HIT ON ENTERPRISE FROM SECTOR"+FORMAT$("#",K[I,1])+","+REPLACE$(FORMAT$("#",K[I,2])," ","")+".",0,-200,1
    IF S<=0 THEN GOTO Label55
    POPUP "<SHIELDS DOWN TO "+FORMAT$("#####",S)+" UNITS>",0,-200,1
    IF H<20 THEN GOTO Label54
    IF RND()>0.6 | H/S<=0.02 THEN GOTO Label54
    R1=FNR(R)
    D[R1]=D[R1]-H/S-0.5*RND()
    GOSUB SRoutine06
    POPUP "DAMAGE CONTROL: '"+G2$+" DAMAGED BY THE HIT'",0,-200,1
Label54:
  NEXT I
RETURN

Label12:
! End of game
GR.FRONT 0
PRINT "IT IS STARDATE"+FORMAT$("####",T)+"."
GOTO Label22
Label55:
PRINT "**************************"
PRINT "* ENTERPRISE DESTROYED ! *"
PRINT "**************************"
PRINT "THE FEDERATION WILL BE CONQUERED."
GOTO Label12
Label22:
GR.FRONT 0
PRINT "THERE WERE"+FORMAT$("##",K9)+" KLINGON BATTLE CRUISERS LEFT"
PRINT "AT THE END OF YOUR MISSION."
Label57:
PRINT
PRINT "Tap anywhere on text to EXIT"
ScrnRet=0
DO
UNTIL ScrnRet=1
EXIT

Label41:
GR.FRONT 0
PRINT "CONGRATULATIONS, CAPTAIN!  THE LAST KLINGON BATTLE CRUISER"
PRINT "MENACING THE FEDERATION HAS BEEN DESTROYED."
PRINT "YOUR EFFICIENCY RATING IS "+1000*(K7/(T-T0))^2
GOTO Label57

SRoutine04:
GR.FRONT 1
GR.CLS
  FOR I=S1-1 TO S1+1
    FOR J=S2-1 TO S2+1
      IF FLOOR(I+0.5)<1 | FLOOR(I+0.5)>8 | FLOOR(J+0.5)<1 | FLOOR(J+0.5)>8 THEN GOTO Label58
      A$=">B<"
      Z1=I
      Z2=J
      GOSUB SRoutine08
      IF Z3=1 THEN
        F_N.BREAK
      ENDIF
Label58:
    NEXT J
    IF Z3=1 THEN
      F_N.BREAK
    ENDIF
  NEXT I
  IF Z3=1 THEN GOTO Label59
  D0=0
  GOTO Label60
Label59:
  D0=1
  C$="DOCKED"
  E=E0
  P=P0
  POPUP "SHIELDS DROPPED FOR DOCKING PURPOSES.",0,-200,0
  S=0
  GOTO Label61
Label60:
  IF K3>0 THEN
    C$="RED"
    GOTO Label61
  ENDIF
  C$="GREEN"
  IF E<E0*0.1 THEN C$="YELLOW"
Label61:
  IF D[2]>=0 THEN GOTO Label62
  POPUP "*** SHORT RANGE SENSORS ARE OUT ***",0,-200,0
RETURN
Label62:
  GR.COLOR 255,0,0,0,1
  GR.RECT g,0,190,719,651
  GR.COLOR 255,255,255,255,0
  GR.RECT g,10,200,460,650
  FOR xNr=1 TO 8
    GR.COLOR 255,0,0,0,1
    GR.RECT g,xNr*50-5,190,xNr*50+20,210
    GR.COLOR 255,255,255,255,0
    GR.TEXT.DRAW g,xNr*50,210,REPLACE$(FORMAT$("#",xNr)," ","")
  NEXT xNr
  FOR yNr=1 TO 8
    GR.COLOR 255,0,0,0,1
    GR.RECT g,0,yNr*50+185,20,yNr*50+220
    GR.COLOR 255,255,255,255,0
    GR.TEXT.DRAW g,5,yNr*50+210,REPLACE$(FORMAT$("#",yNr)," ","")
  NEXT yNr
  GR.TEXT.DRAW g,490,220,"StarDate"
  GR.TEXT.DRAW g,620,220,REPLACE$(FORMAT$("####",FLOOR(T*10)*0.1)," ","")
  GR.TEXT.DRAW g,490,270,"Condition"
  IF C$="RED" THEN GR.COLOR 255,255,0,0,0
  IF C$="GREEN" THEN GR.COLOR 255,0,255,0,0
  IF C$="YELLOW" THEN GR.COLOR 255,255,255,0,0
  GR.TEXT.DRAW g,620,270,C$
  GR.COLOR 255,255,255,255,0
  GR.TEXT.DRAW g,490,320,"Quadrant"
  GR.TEXT.DRAW g,620,320,REPLACE$(FORMAT$("#",Q1)," ","")+","+REPLACE$(FORMAT$("#",Q2)," ","")
  GR.TEXT.DRAW g,490,370,"Sector"
  GR.TEXT.DRAW g,620,370,REPLACE$(FORMAT$("#",S1)," ","")+","+REPLACE$(FORMAT$("#",S2)," ","")
  GR.TEXT.DRAW g,490,420,"Photon"
  GR.TEXT.DRAW g,490,445,"Torpedoes"
  GR.TEXT.DRAW g,620,445,REPLACE$(FORMAT$("#%",P)," ","")
  GR.TEXT.DRAW g,490,495,"Total"
  GR.TEXT.DRAW g,490,520,"Energy"
  GR.TEXT.DRAW g,620,520,REPLACE$(FORMAT$("####%",FLOOR(E+S))," ","")
  GR.TEXT.DRAW g,490,570,"Shields"
  GR.TEXT.DRAW g,620,570,REPLACE$(FORMAT$("####%",FLOOR(S))," ","")
  GR.TEXT.DRAW g,490,620,"Klingons"
  GR.TEXT.DRAW g,490,645,"remaining"
  GR.TEXT.DRAW g,620,645,REPLACE$(FORMAT$("#%",K9)," ","")
  FOR I=1 TO 8
    FOR J=(I-1)*24+1 TO(I-1)*24+22 STEP 3
      IF MID$(Q$,J+1,1)="E" THEN
        GR.BITMAP.DRAW EP,P2,(MOD((J-1)/3,8)+1)*50-20,220+I*50-50
      ENDIF
      IF MID$(Q$,J+1,1)="K" THEN
        GR.BITMAP.DRAW DP,P3,(MOD((J-1)/3,8)+1)*50-20,220+I*50-50
      ENDIF
      IF MID$(Q$,J+1,1)="B" THEN
        GR.BITMAP.DRAW SP,P4,(MOD((J-1)/3,8)+1)*50-20,220+I*50-50
      ENDIF
      IF MID$(Q$,J+1,1)="*" THEN
        Rad=FLOOR(RND()*8+2)
        x1=FLOOR(RND()*720)
        y1=FLOOR(RND()*720)
        FOR jx=1 TO Rad
          GR.COLOR 255-(jx-1)*20,255-(jx-1)*20,255-(jx-1)*20,255-(jx-1)*20,0
          GR.CIRCLE g,10+(MOD((J-1)/3,8)+1)*50,205+I*50,jx
        Next jx
        GR.LINE g,10+(MOD((J-1)/3,8)+1)*50-Rad*2,205+I*50,10+(MOD((J-1)/3,8)+1)*50+Rad*2,205+I*50
        GR.LINE g,10+(MOD((J-1)/3,8)+1)*50,205+I*50-Rad*2,10+(MOD((J-1)/3,8)+1)*50,205+I*50+Rad*2
      ENDIF
    NEXT J
  NEXT I
  GR.RENDER
RETURN
Label21:
! Library computer code
  IF D[8]<0 THEN
    POPUP "COMPUTER DISABLED.",0,-200,0
    GOTO Label23
  ENDIF
Label78:
  POPUP "COMPUTER ACTIVE AND AWAITING COMMAND",0,-200,0
  INPUT "COMMAND (0-5) (>5=help)",A
  IF A<0 THEN GOTO Label23
  AUDIO.STOP
  AUDIO.PLAY AF6
  PRINT
  H8=1
  IF A=0 THEN GOTO Label72
  IF A=1 THEN GOTO Label73
  IF A=2 THEN GOTO Label74
  IF A=3 THEN GOTO Label75
  IF A=4 THEN GOTO Label76
  IF A=5 THEN GOTO Label77
  GR.FRONT 0
  CLS
  PRINT "FUNCTIONS AVAILABLE FROM LIBRARY-COMPUTER:"
  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
  PRINT "Tap anywhere on text to resume"
  ScrnRet=0
  DO
  UNTIL ScrnRet=1
  GOTO Label78
Label77:
! Setup to change cumulative galactic record to galaxy map 
  H8=0
  G5=1
  GR.FRONT 0
  CLS
  PRINT "         THE GALAXY"
  GOTO Label79
Label72:
! Cumulative galactic record
  GR.FRONT 0
  CLS
  PRINT "COMPUTER RECORD OF GALAXY FOR QUADRANT"+FORMAT$("#",Q1)+","+REPLACE$(FORMAT$("#",Q2)," ","")
Label79:
  PRINT "      1     2     3     4     5     6     7     8"
  O1$="   +-----+-----+-----+-----+-----+-----+-----+-----+"
  PRINT O1$
  FOR I=1 TO 8
    PRINT FORMAT$("#",I);
    IF H8=0 THEN GOTO Label80
    FOR J=1 TO 8
      PRINT "| ";
      IF Z[I,J]=0 THEN
        PRINT "*** ";
        GOTO Label81
      ENDIF
      PRINT MID$(STR$(Z[I,J]+1000),2,3)+" ";
Label81:
      IF J=8 THEN PRINT "|"
    NEXT J
    GOTO Label82
Label80:
    Z4=I
    Z5=1
    GOSUB SRoutine09
    J0=FLOOR(15-0.5*LEN(G2$))
    FOR PQ1=1 TO J0
      PRINT " ";
    NEXT PQ1
    PRINT G2$;
    FOR PQ1=1 TO J0
      PRINT " ";
    NEXT PQ1
    Z5=5
    GOSUB SRoutine09
    J0=FLOOR(7-0.5*LEN(G2$))
    FOR PQ1=1 TO J0
      PRINT " ";
    NEXT PQ1
    PRINT G2$
Label82:
    PRINT O1$
  NEXT I
  PRINT
  PRINT "Tap anywhere on text to resume"
  ScrnRet=0
  DO
  UNTIL ScrnRet=1
  GOTO Label23
Label73:
! Status report
  GR.FRONT 0
  CLS
  PRINT "   STATUS REPORT:"
  PRINT "   -------------"
  X$=""
  IF K9>1 THEN X$="S"
  PRINT FORMAT$("#%",K9)+" KLINGON"+X$+" LEFT."
  PRINT "MISSION MUST BE COMPLETED IN"+FORMAT$("###%",0.1*FLOOR((T0+T9-T)*10))+" STARDATES."
  X$="S"
  IF B9<2 THEN X$=""
  IF B9<1 THEN GOTO Label83
  PRINT "THE FEDERATION IS MAINTAINING"+FORMAT$("#",B9)+" STARBASE"+X$+" IN THE GALAXY."
  GOTO Label20
Label83:
  PRINT "YOUR STUPIDITY HAS LEFT YOU ON YOUR OWN IN THE GALAXY -- YOU HAVE NO STARBASES LEFT!"
  GOTO Label20
Label74:
! Torpedo, Base nav, D/D calculator
  IF K3<=0 THEN GOTO Label84
  X$=""
  IF K3>1 THEN X$="S"
  GR.FRONT 0
  CLS
  PRINT "FROM ENTERPRISE TO KLINGON BATTLE CRUSER"+X$
  H8=0
  FOR I=1 TO 3
    IF K[I,3]<=0 THEN GOTO Label85
    W1=K[I,1]
    X=K[I,2]
Label95:
    C1=S1
    A=S2
    GOTO Label86
Label76:
! Direction/distance calculator
    GR.FRONT 0
    CLS
    PRINT "DIRECTION/DISTANCE CALCULATOR:"
    PRINT "YOU ARE AT QUADRANT"+FORMAT$("#",Q1)+","+REPLACE$(FORMAT$("#",Q2)," ","")+" SECTOR"+FORMAT$("#",S1)+","+REPLACE$(FORMAT$("#",S2)," ","")+"."
    IC01:
    INPUT "PLEASE ENTER INITIAL COORDINATES (X,Y)",xy$
    IF ASCII(LEFT$(xy$,1))<49 | ASCII(LEFT$(xy$,1))>56  | ASCII(RIGHT$(xy$,1))<49 | ASCII(RIGHT$(xy$,1))>56 THEN
      POPUP "Entry ERROR",0,-300,0
      GOTO IC01
    ENDIF
    C1=VAL(LEFT$(xy$,1))
    A=VAL(RIGHT$(xy$,1))
    PRINT "Initial coordinates "+xy$
    IC02:
    INPUT "FINAL COORDINATES (X,Y)",xy$
    IF ASCII(LEFT$(xy$,1))<49 | ASCII(LEFT$(xy$,1))>56  | ASCII(RIGHT$(xy$,1))<49 | ASCII(RIGHT$(xy$,1))>56 THEN
      POPUP "Entry ERROR",0,-300,0
      GOTO IC02
    ENDIF
    W1=VAL(LEFT$(xy$,1))
    X=VAL(RIGHT$(xy$,1))
    PRINT "Final coordinates "+xy$
Label86:
    X=X-A
    A=C1-W1
    IF X<0 THEN GOTO Label87
    IF A<0 THEN GOTO Label88
    IF X>0 THEN GOTO Label89
    IF A=0 THEN
      C1=5
      GOTO Label90
    ENDIF
Label89:
    C1=1
Label90:
    IF ABS(A)<=ABS(X)THEN GOTO Label91
    PRINT "DIRECTION ="+FORMAT$("#",C1+(((ABS(A)-ABS(X))+ABS(A))/ABS(A)))
    GOTO Label92
Label91:
    PRINT "DIRECTION ="+FORMAT$("#",C1+(ABS(A)/ABS(X)))
    GOTO Label92
Label87:
    IF A>0 THEN
      C1=3
      GOTO Label93
    ENDIF
    IF X<>0 THEN
      C1=5
      GOTO Label90
    ENDIF
Label88:
    C1=7
Label93:
    IF ABS(A)>=ABS(X)THEN GOTO Label94
    PRINT "DIRECTION ="+FORMAT$("#",C1+(((ABS(X)-ABS(A))+ABS(X))/ABS(X)))
    GOTO Label92
Label94:
    PRINT "DIRECTION = "+FORMAT$("#",C1+(ABS(X)/ABS(A)))
Label92:
    PRINT "DISTANCE ="+FORMAT$("##",SQR(X^2+A^2))
    IF H8=1 THEN GOTO JumpOut
Label85:
  NEXT I
JumpOut:
  PRINT
  PRINT "Tap anywhere on text to resume"
  ScrnRet=0
  DO
  UNTIL ScrnRet=1
  GOTO Label23
Label75:
  IF B3<>0 THEN
    GR.FRONT 0
    CLS
    PRINT "FROM ENTERPRISE TO STARBASE:"
    W1=B4
    X=B5
    GOTO Label95
  ENDIF
  POPUP "MR. SPOCK:'SENSORS SHOW NO STARBASES IN THIS QUADRANT.'",0,-200,1
  GOTO Label23

SRoutine03:
! Find empty place in quadrant (for things)
	R1=FNR(R)
	R2=FNR(R)
	A$="   "
	Z1=R1
	Z2=R2
	GOSUB SRoutine08
	IF Z3=0 THEN GOTO SRoutine03
RETURN

SRoutine02:
! Insert in string array for quadrant
	S8=FLOOR(Z2-0.5)*3+FLOOR(Z1-0.5)*24+1
	IF S8=1 THEN
		Q$=A$+RIGHT$(Q$,189)
		RETURN
	ENDIF
	IF S8=190 THEN
		Q$=LEFT$(Q$,189)+A$
		RETURN
	ENDIF
	Q$=LEFT$(Q$,S8-1)+A$+RIGHT$(Q$,190-S8)
RETURN

SRoutine06:
! Prints device name
  SW.BEGIN R1
    SW.CASE 1
      G2$="WARP ENGINES"
    SW.BREAK
    SW.CASE 2
      G2$="SHORT RANGE SENSORS"
    SW.BREAK
    SW.CASE 3
      G2$="LONG RANGE SENSORS"
    SW.BREAK
    SW.CASE 4
      G2$="PHASER CONTROL"
    SW.BREAK
    SW.CASE 5
      G2$="PHOTON TUBES"
    SW.BREAK
    SW.CASE 6
      G2$="DAMAGE CONTROL"
    SW.BREAK
    SW.CASE 7
      G2$="SHIELD CONTROL"
    SW.BREAK
    SW.CASE 8
      G2$="LIBRARY-COMPUTER"
    SW.BREAK
  SW.END
RETURN

SRoutine08:
! String comparison in quadrant array
	Z1=FLOOR(Z1+0.5)
	Z2=FLOOR(Z2+0.5)
	S8=(Z2-1)*3+(Z1-1)*24+1
	Z3=0
	IF MID$(Q$,S8,3)<>A$ THEN RETURN
	Z3=1
RETURN

SRoutine09:
! Quadrant name in G2$ from Z4,Z5 (=Q1,Q2)
! Call with G5=1 to get region name only
IF Z5<=4 THEN
  SW.BEGIN Z4
    SW.CASE 1
      G2$="ANTARES"
    SW.BREAK
    SW.CASE 2
      G2$="RIGEL"
    SW.BREAK
    SW.CASE 3
      G2$="PROCYON"
    SW.BREAK
    SW.CASE 4
      G2$="VEGA"
    SW.BREAK
    SW.CASE 5
      G2$="CANOPUS"
    SW.BREAK
    SW.CASE 6
      G2$="ALTAIR"
    SW.BREAK
    SW.CASE 7
      G2$="SAGITTARIUS"
    SW.BREAK
    SW.CASE 8
      G2$="POLLUX"
    SW.BREAK
  SW.END
  GOTO Label113
ENDIF
IF Z4=1 THEN GOTO SRoutine01
IF Z4=2 THEN GOTO Label114
IF Z4=3 THEN GOTO Label115
IF Z4=4 THEN GOTO Label116
IF Z4=5 THEN GOTO Label117
IF Z4=6 THEN GOTO Label118
IF Z4=7 THEN GOTO Label119
IF Z4=8 THEN GOTO Label120

SRoutine01:
  G2$="SIRIUS"
  GOTO Label113
  Label114:
    G2$="DENEB"
    GOTO Label113
  Label115:
    G2$="CAPELLA"
    GOTO Label113
  Label116:
    G2$="BETELGEUSE"
    GOTO Label113
  Label117:
    G2$="ALDEBARAN"
    GOTO Label113
  Label118:
    G2$="REGULUS"
    GOTO Label113
  Label119:
    G2$="ARCTURUS"
    GOTO Label113
  Label120:
    G2$="SPICA"
 Label113:
  IF G5<>1 THEN
    SW.BEGIN Z5
      SW.CASE 1
        G2$=G2$+" I"
      SW.BREAK
      SW.CASE 2
        G2$=G2$+" II"
      SW.BREAK
      SW.CASE 3
        G2$=G2$+" III"
      SW.BREAK
      SW.CASE 4
        G2$=G2$+" IV"
      SW.BREAK
      SW.CASE 5
        G2$=G2$+" I"
      SW.BREAK
      SW.CASE 6
        G2$=G2$+" II"
      SW.BREAK
      SW.CASE 7
        G2$=G2$+" III"
      SW.BREAK
      SW.CASE 8
        G2$=G2$+" IV"
      SW.BREAK
    SW.END
  ENDIF
RETURN

ONCONSOLETOUCH:
  GR.FRONT 1
  ScrnRet=1
CONSOLETOUCH.RESUME
