
DIM p(50)
DIM f$(50)
DIM back(50)
DIM l$(25)
DIM r$(25)
DIM row(25)
DIM colname$(16)

REM Electric Guildsman General Reader
REM Copyright 1994 Jim Vassilakos

OPEN "i", 1, "colors.cmd"
FOR a = 0 TO 15
LINE INPUT #1, a$
colname$(a) = LCASE$(RIGHT$(a$, LEN(a$) - 4))
NEXT a
CLOSE

p(1) = 1
f$(1) = "main.mnu"
back(1) = 0
topp = 1: REM number of menus encountered

n = 1
10 REM read mnu file
SHELL "call egacolor 00 10"
SHELL "call egacolor 07 46"
OPEN "i", 1, f$(n)
CLS
q = 0: count = 0
DO UNTIL EOF(1)
   count = count + 1
   LINE INPUT #1, a$
   i = INSTR(a$, "@")
   l = LEN(a$)
   IF i = 1 THEN
      FOR y = 0 TO 15
      IF LCASE$(RIGHT$(a$, l - 1)) = colname$(y) THEN COLOR y
      NEXT y
      count = count - 1
   END IF
   IF i > 1 THEN
      q = q + 1
      l$(q) = LEFT$(a$, i - 1)
      r$(q) = RIGHT$(a$, l - i)
      row(q) = count
      a$ = l$(q)
   END IF
   IF i <> 1 THEN PRINT a$
LOOP
CLOSE
hip = q: REM the number of possible choices

15 REM make arrow
LOCATE row(p(n)), 2
COLOR 12
PRINT CHR$(196); CHR$(26);

20 REM get input
GOSUB 60
IF k2 = 0 AND k1 = 27 THEN GOTO 1000: REM esc
IF k2 = 0 AND (k1 = 81 OR k1 = 113) THEN GOTO 1000: REM Q/q
IF k2 = 1 AND (k1 = 72 OR k1 = 80) THEN GOTO 25: REM up/down
IF k2 = 1 AND (k1 = 75 OR k1 = 77) THEN GOTO 25: REM left/right
IF k2 = 0 AND k1 = 13 THEN GOTO 45: REM enter
IF k2 = 0 AND k1 = 32 THEN GOTO 45: REM space
GOTO 20

25 REM up & down arrow movement
LOCATE row(p(n)), 2
PRINT "  "
IF k1 = 72 THEN p(n) = p(n) - 1: REM up
IF k1 = 80 THEN p(n) = p(n) + 1: REM down
IF k1 = 75 THEN p(n) = p(n) - 1: REM left
IF k1 = 77 THEN p(n) = p(n) + 1: REM right
IF p(n) > hip THEN p(n) = hip
IF p(n) < 1 THEN p(n) = 1
GOTO 15

45 REM select
ext$ = RIGHT$(r$(p(n)), 3)
IF ext$ = "exe" THEN
   e$ = "call " + r$(p(n))
   SHELL e$
END IF
IF ext$ = "txt" THEN
   e$ = "call less " + r$(p(n))
   SHELL e$
END IF
IF ext$ <> "mnu" THEN GOTO 10
REM determine if we've been there before
there = 0
FOR z = 1 TO topp
   IF r$(p(n)) = f$(z) THEN there = z
NEXT z
REM yes we have
IF there <> 0 THEN n = there
REM no we haven't, so let's make a new place
IF there = 0 THEN
   topp = topp + 1
   back(topp) = n
   f$(topp) = r$(p(n))
   p(topp) = 1
   n = topp
END IF
GOTO 10

60 REM read keyboard
k1 = 0: k2 = 0
62 k$ = INKEY$
IF k$ = "" THEN GOTO 62
SOUND 10000, .1
k1 = ASC(k$)
IF k1 <> 13 THEN GOTO 63
FOR note = 1 TO 10
SOUND note * 200, .1
NEXT note
63 IF k1 <> 0 THEN GOTO 64
k1 = ASC(RIGHT$(k$, 1))
k2 = 1
64 RETURN

1000 REM quit
IF back(n) = 0 GOTO 1010
n = back(n)
GOTO 10
1010 COLOR 13
CLS
PRINT "Have a Nice Day!"
END

