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
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