DECLARE FUNCTION decr$ (x$)
CLS
INPUT "Encrypted file >", infile$
INPUT "Produce xrf file (y/n)"; f$
'INPUT "Was it text only (y/n)"; t$
IF f$ = "y" THEN xrf = 1
outfile$ = infile$ + ".dc"
fullfile$ = infile$ + ".src"
xref$ = infile$ + ".xrf"
infile$ = infile$ + ".gs"

TYPE RoomRecord
    'picture  AS STRING * 4
    'Space    AS STRING * 1
    exits    AS STRING * 20
    descr    AS STRING * 1440
END TYPE

OPEN fullfile$ FOR OUTPUT AS #2
DIM v$(0 TO 300), cmd$(100), o$(300), c(100, 2), type$(6)

'GOTO testrooms

REM first, get the vocab
IF xrf THEN OPEN "xrefv.544" FOR OUTPUT AS #4: CLOSE #4

OPEN infile$ + "5" FOR INPUT AS #1
currentword = 0
WHILE EOF(1) = 0
   PRINT #2, currentword; ": ";
   currentword = currentword + 1
   IF xrf THEN
       OPEN "xrefv." + MID$(STR$(1000 + currentword), 3) FOR OUTPUT AS #4
       CLOSE #4
   END IF
   FOR word = 1 TO 4
       word$ = ""
       w$ = INPUT$(20, #1)
       D$ = decr$(w$)
       IF LEFT$(D$, 1) = CHR$(9) THEN D$ = " "
       n = INSTR(D$, " ")
       IF n = 0 THEN word$ = D$
       IF n <> 0 THEN word$ = LEFT$(D$, n - 1)
       IF word$ <> "" THEN PRINT #2, word$; ", ";
       IF word = 1 THEN v$(currentword) = word$
   NEXT
   PRINT #2, CHR$(13);
WEND
cr$ = CHR$(13)
cr2$ = cr$ + cr$
cr3$ = cr$ + cr$ + cr$
PRINT #2, " ": PRINT #2, "-----------------------": PRINT #2, " ": CLOSE #1
maxwords = currentword

REM Vocab entered, now get object names
OPEN infile$ + "4" FOR INPUT AS #1
object = 1
WHILE EOF(1) = 0
   IF xrf THEN
       OPEN "xrefo." + MID$(STR$(1000 + object), 3) FOR OUTPUT AS #4
       CLOSE #4
   END IF
   w$ = INPUT$(24, #1)
   room$ = decr$(LEFT$(w$, 3))
   name$ = decr$(MID$(w$, 4))
   name$ = LEFT$(name$, INSTR(name$ + " ", " ") - 1)
   o$(object) = name$
   PRINT #2, "Object"; object; ", the "; name$; " starts in room"; room$
   object = object + 1
WEND
PRINT #2, " ": PRINT #2, "-------------------"; : PRINT #2, " ": CLOSE #1

o$(0) = "object"
maxobjects = object - 1

TYPE MsgRecord
    Message    AS STRING * 400
END TYPE

DIM TheMsg AS MsgRecord

OPEN infile$ + "3" FOR RANDOM AS #1 LEN = LEN(TheMsg)
records = LOF(1) / LEN(TheMsg)

n = 400
FOR currentrecord = 1 TO records
   IF xrf THEN
       OPEN "xrefm." + MID$(STR$(1000 + currentrecord), 3) FOR OUTPUT AS #4
       CLOSE #4
   END IF
   GET #1, currentrecord, TheMsg
   outmsg$ = decr$(TheMsg.Message)
   'n = INSTR(outmsg$, "<")
   outmsg$ = LEFT$(outmsg$, n)
   PRINT #2, "Message"; currentrecord
   PRINT #2, outmsg$
NEXT
PRINT #2, " ": PRINT #2, "-----------------": PRINT #2, " ": CLOSE #1
maxmsg = records

IF xrf THEN
   FOR flagnum = 1 TO 104
       OPEN "xreff." + MID$(STR$(1000 + flagnum), 3) FOR OUTPUT AS #4
       CLOSE #4
   NEXT
END IF

REM Vocab, objects, messages done, now do cmds

READ opnum
WHILE opnum <> 999
   opnum = opnum - 500
   READ cmd$(opnum), c(opnum, 1), c(opnum, 2)
   READ opnum
WEND
type$(2) = "Room #"
type$(3) = "Mess #"
type$(4) = "Flag #"
type$(5) = " "
f$(1) = "xrefo."
f$(2) = "xrefr."
f$(3) = "xrefm."
f$(4) = "xreff."

indented = 0
OPEN infile$ + "1" FOR INPUT AS #1
startloop:
WHILE EOF(1) = 0
   INPUT #1, num

skipinp:

   IF num = 501 THEN
       INPUT #1, w1, w2
       w1$ = "*": w2$ = "*"
       IF w1 <= 300 THEN w1$ = v$(w1)
       IF w2 <= 300 THEN w2$ = v$(w2)
       commandnum = commandnum + 1
       PRINT cr2$; "COMMAND "; commandnum; w1$; " "; w2$
       PRINT #2, " ": PRINT #2, " "
       PRINT #2, "COMMAND "; commandnum; w1$; " "; w2$
       currentcommand$ = w1$ + " " + w2$
       IF xrf THEN
           OPEN "xrefv." + MID$(STR$(1000 + w1), 3) FOR APPEND AS #4
           PRINT #4, commandnum; currentcommand$
           CLOSE #4
           OPEN "xrefv." + MID$(STR$(1000 + w2), 3) FOR APPEND AS #4
           PRINT #4, commandnum; currentcommand$
           CLOSE #4
       END IF
       GOTO endloop
   END IF

   IF num < 500 OR num > 599 THEN PRINT #2, num: GOTO skipcr
   IF cmd$(num - 500) = "" THEN
       PRINT "Unknown Opcode "; num
       INPUT "Opcode Name"; cmd$(num - 500)
       INPUT "Type of 1, 2"; c(num - 500, 1), c(num - 500, 2)
   END IF

   IF num = 542 OR num = 543 THEN indented = 1:
   IF indented = 0 AND num <> 541 THEN PRINT #2, "   ";
   PRINT cmd$(num - 500);
   PRINT #2, cmd$(num - 500);
   IF num = 542 OR num = 543 GOTO skipcr
   IF num = 540 THEN           'rem SOUND
       x = 1
       WHILE x <> 0 OR y <> 0
       INPUT #1, x, y
           PRINT #2, "("; x; y; ")";
           PRINT "("; x; y; ")";
       WEND
       PRINT #2, " "
       INPUT #1, num
       GOTO skipcr
   END IF
   IF num = 539 THEN           'rem LINK
       PRINT #2, CHR$(34); : PRINT CHR$(34);
       FOR x = 1 TO 8
           INPUT #1, num
           PRINT #2, CHR$(num); : PRINT CHR$(num);
       NEXT
       PRINT #2, CHR$(34): PRINT CHR$(34)
       GOTO skipcr
   END IF

   indented = 0
   t1 = c(num - 500, 1)
   t2 = c(num - 500, 2)
   IF t1 > 0 THEN
   INPUT #1, num
       IF t1 = 1 THEN PRINT o$(num); : PRINT #2, o$(num); " ";
       IF t1 > 1 THEN PRINT type$(t1); num; : PRINT #2, type$(t1); num;
       IF xrf AND t1 <> 5 THEN
           OPEN f$(t1) + MID$(STR$(1000 + num), 3) FOR APPEND AS #4
           PRINT #4, commandnum; currentcommand$
           CLOSE #4
       END IF
       IF t2 > 0 THEN
           INPUT #1, num
           IF t2 = 1 THEN PRINT o$(num); : PRINT #2, o$(num); " "
           IF t2 > 1 THEN PRINT type$(t2); num; : PRINT #2, type$(t2); num;
           IF xrf AND t2 <> 5 THEN
               OPEN f$(t1) + MID$(STR$(1000 + num), 3) FOR APPEND AS #4
               PRINT #4, commandnum; currentcommand$
               CLOSE #4
           END IF
       END IF
   END IF
   PRINT #2, " "
skipcr:
endloop:
WEND
PRINT #2, "--------------------------": CLOSE #1

testrooms:

DIM theRoom AS RoomRecord
OPEN infile$ + "2" FOR RANDOM AS #1 LEN = LEN(theRoom)
records = LOF(1) / LEN(theRoom)

FOR currentrecord = 1 TO records
   IF xrf THEN
       OPEN "xrefr." + MID$(STR$(1000 + currentword), 3) FOR OUTPUT AS #4
       CLOSE #4
   END IF
   GET #1, currentrecord, theRoom
   pic$ = theRoom.picture
   exits$ = decr$(theRoom.exits)
   outroom$ = decr$(theRoom.descr)
   'PRINT pic$
   'PRINT exits$
   'PRINT outroom$
   n = INSTR(outroom$, "<")
   PRINT #2, "Room #"; currentrecord
   PRINT #2, "Picture #"; pic$
   PRINT #2, "Exits :"; exits$; "!"
   PRINT #2, " "
   'PRINT #2, outroom$
   outroom$ = outroom$ + CHR$(13)
   opos = 1: npos = INSTR(outroom$, CHR$(13))
   WHILE npos >= opos
       PRINT #2, MID$(outroom$, opos, npos - opos)
       opos = npos + 1
       npos = INSTR(opos, outroom$, CHR$(13))
   WEND
NEXT
maxrooms = records

CLOSE
'   OPEN f$(t1) + MID$(STR$(1000 + num), 3) FOR APPEND AS #4

IF xrf = 0 THEN END

OPEN xref$ FOR OUTPUT AS #2

FOR currentword = 1 TO maxwords
   PRINT #2, v$(currentword)
   OPEN "xrefv." + MID$(STR$(1000 + currentword), 3) FOR INPUT AS #1
   WHILE EOF(1) = 0
       LINE INPUT #1, l$
       PRINT #2, l$
   WEND
   CLOSE #1
   KILL "xrefv." + MID$(STR$(1000 + currentword), 3)
NEXT

OPEN "xrefv.544" FOR INPUT AS #1
PRINT #2, "*"
WHILE EOF(1) = 0
   LINE INPUT #1, l$
   PRINT #2, l$
WEND
CLOSE #1
KILL "xrefv.544"

FOR currentobject = 1 TO maxobjects
   PRINT #2, "Object"; currentobject; "the "; o$(currentobject)
   OPEN f$(1) + MID$(STR$(1000 + currentobject), 3) FOR INPUT AS #1
   WHILE EOF(1) = 0
       LINE INPUT #1, l$
       PRINT #2, l$
   WEND
   CLOSE #1
   KILL f$(1) + MID$(STR$(1000 + currentobject), 3)
NEXT

FOR currentmsg = 1 TO maxmsg
   PRINT #2, "Message"; currentmsg
   OPEN f$(3) + MID$(STR$(1000 + currentmsg), 3) FOR INPUT AS #1
   WHILE EOF(1) = 0
       LINE INPUT #1, l$
       PRINT #2, l$
   WEND
   CLOSE #1
   KILL f$(3) + MID$(STR$(1000 + currentmsg), 3)
NEXT

FOR currentroom = 1 TO maxrooms
   PRINT #2, "Room"; currentroom
   OPEN f$(2) + MID$(STR$(1000 + currentroom), 3) FOR INPUT AS #1
   WHILE EOF(1) = 0
       LINE INPUT #1, l$
       PRINT #2, l$
   WEND
   CLOSE #1
   KILL f$(2) + MID$(STR$(1000 + currentroom), 3)
NEXT

FOR currentflag = 1 TO 104
   OPEN f$(4) + MID$(STR$(1000 + currentflag), 3) FOR INPUT AS #1
   IF LOF(1) <> 0 THEN
       PRINT #2, "Flag"; currentflag
       WHILE EOF(1) = 0
           LINE INPUT #1, l$
           PRINT #2, l$
       WEND
   END IF
   CLOSE #1
   KILL f$(4) + MID$(STR$(1000 + currentflag), 3)
NEXT

END

REM 1st is #, 2nd is opcode, 3rd& 4th type of argument
REM 0 = none       3 = message
REM 1 = object     4 = flag
REM 2 = room       5 = number

DATA 501, "Command ", 0, 0
DATA 502, "NOTAT ",2,0
DATA 503, "AT> ",2,0
DATA 504, "AT< ", 2,0
DATA 505, "AT ", 2, 0
DATA 506, "EXIST ", 1, 2
DATA 507, "GONE ", 1, 2
DATA 508, "PRESENT ",1,0
DATA 509, "NOTEXIST ",1,0
DATA 510, "FLAG= ", 4, 5
DATA 511, "FLAG<> ",4,5
DATA 512, "FLAG> ",4,5
DATA 513, "FLAG< ",4,5
DATA 514, "FFLAG= ",4,4
DATA 515, "FFLAG<> ",4,4
DATA 516, "FFLAG> ",4,4
DATA 517, "FFLAG< ",4,4
DATA 518, "RAND ",5,5
DATA 519, "CLS ",0,0
DATA 520, "DROP ", 0,0
DATA 521, "DUMP ", 0,0
DATA 522, "END ", 0, 0
DATA 523, "INVEN ",0, 0
DATA 524, "LOAD ",0,0
DATA 525, "PRESSKEY ", 0,0
DATA 526, "QUIT ", 0, 0
DATA 527, "SAVE ",0,0
DATA 528, "SHOW ", 0, 0
DATA 529, "FLAGSET ",4, 5
DATA 530, "FLAGADD ",4,5
DATA 531, "FFLAGADD ",4,4
DATA 532, "FLAGDEC ", 4,5
DATA 533, "GOTO ", 2, 0
DATA 534, "OBJ ",1, 2
DATA 535, "PAUSE ", 5,0
DATA 536, "PRINT ", 3, 0
DATA 537, "RANDSET ", 4, 5
DATA 538, "SHOWF ",4,0
DATA 539, "LINK ", 0,0
DATA 540, "SOUND ",0,0
DATA 541, "< ", 0, 0
DATA 542, "Do ", 0, 0
DATA 543, "If ", 0, 0
DATA 544, "* ", 0, 0
DATA 545, "GRAPH ",5,0

DATA 999, "XXXX ", 0, 0

END

FUNCTION decr$ (x$)
word$ = ""
FOR letter = 1 TO LEN(x$)
   c = ASC(MID$(x$, letter, 1))
   IF c <> 32 THEN
       c = (c + 9) MOD 256
       word$ = word$ + CHR$(c)
   END IF
NEXT
decr$ = word$
END FUNCTION