Classic Computer Magazine Archive A.N.A.L.O.G. ISSUE 59 / APRIL 1988 / PAGE 23





The Wizard

             PART 2

The compiler module.

by Clayton Walnum

    Last time we learned how to use The Wizard's editor module to create our adventure database. You'll be happy to know that the hard part-understanding the editor-is now behind us. Using the compiler, believe it or not, is a simple process, requiring little more than the ability to type the word RUN.
    The only error messages the compiler will give you are "missing item" messages. These occur when an item referenced in a command hasn't been entered into the item list yet. Why does The Wizard's compiler handle only this one type of error? Is it stupid? No! Those of you who have done a lot of programming know that the first time you try to compile source code, you're sure to get syntax errors. This is because the data the compiler is trying to process was created in a "free form" manner, using a text editor. You can type anything you like with a text editor; it doesn't care if you're meeting the requirements of the compiler or not.
    The Wizard's editor takes the information you give it and automatically stores it in the proper form for the compiler, guaranteeing that no syntax errors exist. This doesn't mean your adventure will run perfectly the first time you compile it. In fact, you'll be extremely lucky if it does. Like any other compiler, this one can't tell you when you've made a "logic" error. An adventure program is complicated, and you'll need to fine-tune the game, editing and recompiling several times before everything's just the way you want it.
    You'll probably have to add commands and items, change some text here and there, and generally smooth over the game before it'll be ready to spring on your friends.

Typing instructions.
    There are three listings at the end of this article, only two of which are actually required to run the compiler. Listing 1 is the adventure "frame," a series of BASIC instructions that are common to every adventure game created with The Wizard. The lines of code found in this listing are combined with the lines the compiler creates from your adventure database. Type in Listing 1 using "BASIC Editor II" to check your work, and save the file to disk under the filename WIZFRAME.BAS.
    Listing 2 is the compiler itself. You should also type this in using "BASIC Editor II" to check your work. Save the program to disk under the filename WIZCOMP.BAS.
    Listing 3 is a short adventure game that was created using The Wizard. To play the game, you must merge it with Listing 1 (the frame). As previously stated, Listing 3 is optional; it isn't required in order to use the compiler. But, since the sample adventure demonstrates many of the things you can do with The Wizard, I suggest you go the extra step, and play the game.
    Note that in Listing 3 (which is, by the way, the code generated by the compiler), most of the text is encrypted. This keeps people from listing the program to find clues.

Compiling an adventure.
    Last time, we created a database for an adventure called "Diamond For Sale." Now that you've typed in the compiler and the adventure frame, we can compile that example.
    To compile an adventure, you must first make sure that a copy of the adventure frame (Listing 1) is on the same disk as your adventure data. Then simply load the compiler and run it, making sure that your adventure data disk is in drive 1. The compiler will read the data and create a BASIC listing, printing short messages to the screen as it works. Once the compiler has completed the construction of the listing, it will automatically merge it with the adventure frame, then save a copy of the completed game to disk. When all the work has been completed, the screen cursor will be positioned over the word RUN. Simply press RETURN to test play your new adventure game.
    Try the compile process on the database we created in Part 1, and you'll have a ready-to-run adventure.
    All files written to your disk will have the filename you chose when you first created your game; only the extensions will vary. For example, in the case of the Diamond For Sale adventure, all the associated files will be named DIAMOND.ext, where "ext" will vary depending on the file. The lines created by the compiler will be found in the file DIAMOND.LNS, and the complete game (the file DIAMOND.LNS merged with the adventure frame) will be found in the file DIAMOND.BAS. The other files for the Diamond adventure on the disk were created by the editor and are as follows:


DIAMOND.NAM .......................................... Your name
DIAMOND.ITM .............................................. Item data
DIAMOND.RMS .......................................... Room data
DIAMOND.COM ..............................  Simple commands
DIAMOND.MOV ........................  Movement commands
DIAMOND.CHG ..................................  Item commands
DIAMOND.FAT ...................................  Fatal commands
DIAMOND.FIN ....................................  Final commands
DIAMOND.INT ............................................... Intro text
FILENAMEDAT................................ Adventure filename

Odds and ends.
    As mentioned previously, the compiler will give you only one type of error message, an "item missing" warning. When you get one of these, the compiler will stop, and you must then reload The Wizard's editor to enter the missing item into the adventure database. Be forewarned, though, that the compiler catches only some missing items. If, while play-testing a game, you get the message NO SUCH ITEM for a command (assuming, of course, you expected the command to give you a different response), you'll have found an item missing from your database. You'll need to go back to the editor, enter that item into the database, then recompile the game.
    During a game, there's room on the screen to display only five items each for the player's inventory and the room's visible items. Ordinarily this isn't a problem, because if a player tries to pick something up when his inventory is full, or tries to drop something in a room that has no space, he'll get a warning from the game, and the command will not be performed. But a problem can arise when a command (an item command) creates an item in the room or player's inventory. What if they're already full?
    The item will be created anyway, and an asterisk will be added to the end of the item list (either the visible items or the player's inventory), warning the player that not all items are listed on the screen. To see all items, the player only has to pick up an item if the asterisk is on the room's list, or drop an item if the asterisk is on the inventory list.
    Another problem (one I should have warned you about last time when describing the editor), is quote characters in the intro text. You must make sure to use single, not double quotes. This is because the intro text is stored in strings, and string declarations don't work very well if you stick double quotes in the middle of them.
    There are four commands built into the game, commands the player will be able to use without you, the game designer, having to enter them into the editor. They are: GET item (the player supplies the "item"), DROP item, SAVE GAME and LOAD GAME. The SAVE and LOAD commands give the player the option of using a disk drive or cassette.
    Finally, when typing commands during a game, the player should type complete words, not abbreviations. I know that some adventure games allow you to type LOO TRE for LOOK TREE, etc., but that won't work for most commands in a game created by The Wizard. Three-letter abbreviations will work for the GET and DROP commands, but I don't recommend using them, since you may use them somewhere else accidentally and get confusing results.


   Listing 1.
BASIC listing.

EI 1 GOTO 10000
RO 3 A=USR(ADR(D$),ADR(AS),LEN(A$)):? A$:
   A$="":RETURN
EP 4 POSITION N9,N19:? "Okay":RETURN
TD 5 POKE N16,112:POKE 53774,112:RETURN
KO 45 N=N0:S=N0:E=N0:W=N0:U=N0:D=N0:GOSUB
    R*N10:POSITION N12,N2:GOSUB N3:? A$:A
   $="":RETURN
ZH 900 RESTORE 12001:FOR X=N1 TO NN-SI:RE
   AD A$,A:Q=N13-LEN(A$):I$(X*N13-N12,X*N
   13-Q)=A$:I(X)=A:NEXT X
PV 901 RESTORE 12205:FOR X=N1 TO 72:READ
   A:CC$(X)=CHR$(A):NEXT X
QM 902 FOR X=N1 TO 37:READ A:D$(X)=CHR$(A
   ):NEXT X:REM D$(23,23)=CHR$(N0)
AA 903 FOR X=N1 TO 79:READ A:E$(X)=CHR$(A
   ):NEXT X
ZO 904 FOR X=N1 TO 35:READ A:L$(X)=CHR$(A
   ):NEXT X:RETURN
YH 950 IF LEN(A$)>N0 THEN GOSUB N3
VH 953 IF  NOT UL THEN 1100
WI 955 A=U5R(ADR(E$),N12,N2,24):GOSUB 45
LE 960 A=USR(ADR(E$),N12,N4,N23):POSITION
    N12,N4:IF N+S+E+W+D+U=N0 THEN ? "None
   ":GOTO 970
DG 962 IF N THEN ? "N ";
IJ 963 IF S THEN ? "S ";
UM 964 IF E THEN ? "E ";
MP 965 IF W THEN ? "W ";
KS 966 IF U THEN ? "U ";
YE 967 IF D THEN ? "D "
EU 970 A=USR(ADR(E$),N12,N6,N13):A=USR(AD
   R(E$),N12,N7,N13):A=USR(ADR(E$),N12,N8
   ,N13)
TN 971 A=USR(ADR(E$),N12,N9,N13l:A=USR(AD
   R(E$),N1l,N10,N14)
CN 972 ROW=N6:QZ=N0:FOR X=N1 TO NN:IF ABS
   (I(X))<>R THEN 974
CG 973 QZ=QZ+N1:IF ROW<N11 THEN A$=I$(X*N
   13-N12,X*N13):POSITION N12,ROW:GOSUB N
   3:IT=N1:ROW=ROW+N1:NEXT X
IN 974 NEXT X:IF QZ>N5 THEN POSITION N11,
   N10:? "*"
YH 976 IF NOT IT THEN POSITION N12,ROW:?
    "Nothing"
QE 979 A=USR(ADR(E$),N12,N12,N13):A=USR(A
   DR(E$),N12,N13,N13):A=USR(ADR(E$),N12,
   N14,N13)
PO 980 A=USR(ADR(E$),N12,N15,N13):A=USR(A
   DR(E$),N12,N16,N13)
LE 981 ROW=NI2:FOR X=N1 TO NN:IF I(X)<>-N
   1 THEN NEXT X:GOTO 984
CO 982 A$=I$(X*N13-N12,X*N13):POSITION N1
   2,ROW:GOSUB N3:ROW=ROW+N1:INV=N1:NEXT
   X
IO 984 IF  NOT INV THEN POSITION N12,ROW:
   ? "Nothing"
DA 1100 IT=N0:INV=N0:UL=N0
IL 1260 POKE 752,N0:POSITION N8,N21:SOUND
    N0,N20,N10,N8:FOR X=N1 TO N10:NEXT X:
   SOUND N0,N0,N0,N0
CW 1265 TRAP 1260:INPUT IN$:POKE 752,N1
VV 1280 A=USR(ADR(E$),N9,N18,N25):A=USR(A
   DR(E$),N9,N19,N25):A=USR(ADR(E$),N9,N2
   1,N25):POSITION N9,N18:? IN$
FO 1281 IF LEN(IN$)<N2 THEN 1285
EX 1282 B=USR(ADR(L$),LEN(IN$),ADR(IN$)):
   IF B=N0 THEN POSITION N9,N19:? "WHAT?"
   :GOTO N950
OV 1283 A=ADR(D$):POKE A+N17,N33:POKE A+N
   20,N24:POKE A+N21,105:POKE A+N32,61:A=
   USR(ADR(D$),ADR(IN$),LEN(IN$))
SA 1284 POKE A+N17,61:POKE A+N20,56:POKE
   A+N21,233:POKE A+N32,N33
VL 1285 POSITION N9,N19
ZA 1490 IF LEN(IN$)=N1 THEN VS=IN$:GOTO 1
   781
OB 1500 V$=IN$(N1,8):N$=IN$(B+N2,LEN(IN$)
   )
OQ 1510 IF LEN(V$)=N2 THEN V$(N3)="!"
SS 1520 IF IN$="TBWF!HBNF" THEN 9110
IM 1540 IF IN$="MPBE!HBNF" THEN 9010
SU 1560 IF LEN(V$)<N2 OR LEN(N$)<N3 THEN
   ? "WHAT?":GOTO N950
OE 1580 IF LEN(V$)=N2 THEN V$(N3)=" "
AJ 1620 Y=USR(ADR(CC$),ADR(N$),ADR(IT$),L
   EN(IT$))
SS 1640 Z=USR(ADR(CC$),ADR(V$),ADR(VB$),L
   EN(VB$))
LZ 1720 IF  NOT Y THEN ? "No such noun.":
GOTO N950
PS 1730 IF NOT Z THEN ? "No such verb.":
   GOTO N950
PP 1760 IF Z=N1 THEN 2560
QL 1763 IF Z=N2 THEN 2740
BK 1765 A=ASC(V$):A=A-65:GOTO 5902+A*100
JM 1781 REM
ES 1860 IF V$="N" AND N THEN R=N:GOTO 196
   0
RK 1865 IF V$="S" AND S THEN R=S:GOTO 196
   0
JJ 1870 IF V$="E" AND E THEN R=E:GOTO 196
   0
AK 1880 IF V$="W" AND W THEN R=W:GOTO 196
   0
UU 1900 IF V$="U" AND U THEN R=U:GOTO 196
   0
GM 1920 IF V$="D" AND D THEN R=D:GOTO 196
   0
XC 1940 ? "No such direction!":GOTO M950
FS 1960 IF NOT F THEN GOSUB N4
JU 1970 F=N0:UL=N1:GOTO N950
ES 2000 REM ********* GET *********
EJ 2560 IF I(Y)=-N1 THEN ? "You already h
   ave it!":GOTO M950
PE 2580 IF I(Y)<N0 THEN ? "You can't get
   that!":GOTO N950
VO 2600 IF ABS(I(Y))<>R THEN ? "It's not
   here.":GOTO N950
TL 2620 LOCATE N12,N16,A:COLOR A:PLOT N12
   ,N16
YQ 2630 IF A<>32 THEN POSITION N9,N19:? "
   You can't carry anymore!":GOTO N950
HA 2660 GOSUB N4:I(Y)=-N1:UL=NI:GOTO N950
LL 2680 GOTO N6760
MD 2730 REM ******** DROP *********
MS 2740 IF I(Y)<>-N1 THEN ? "You don't ha
   ve it!":? :? :GOTO N950
FU 2750 LOCATE N12,N10,A:COLOR A:PLOT N12
   ,N10
WF 2755 POSITION N9,N19:IF A<>32 THEN ? "
   There's no more room!":GOTO N950
IP 2761 IF R<>N19 OR I(Y)<>-N1 OR Y<>N15
   OR FT THEN 2840
LI 2840 GOSUB N4
OI 2842 I(Y)=R:UL=NI:GOTO N950
F1 6401 GOTO N9000
FQ 6801 GOTO N9000
FD 7101 GOTO N9000
FF 7201 GOTO N9000
FN 7601 GOTO N9000
FC 8001 GOTO N9000
FO 8601 GOTO N9000
SX 9000 IF VS="MPPL" THEN ? "You see noth
   ing important":GOTO N950
VK 9005 ? "You can't do that!":GOTO N950
PD 9010 TRAP 9100
5B 9020 POSITION N9,N19:? "LOAD FROM TAPE
    OR DISK";:INPUT Z$:IF Z5="D" THEN 906
   0
GK 9030 IF Z$<>"T" THEN ? :GOTO 6820
PA 9040 POSITION N9,N19:? "CUE, PRESS RET
   URN TWICE.":OPEN #N1,N4,N0,"K:":GET #N
   1,A:CLOSE #N1
EI 9050 OPEN #N1,N4,N6,"C:":GOTO 9070
OO 9060 OPEN #N1,N4,N6,"D:ADVENTUR.DAT":A
   $=""
IX 9070 INPUT #NI,R
DP 9080 FOR X=N1 TO NN:INPUT #N1,A:I(X)=A
   :NEXT X
SQ 9090 CLOSE #NI:UL=N1:? :? :TRAP 1260:G
   OTO N950
AS 9100 POSITION N9,N19:? "NO GAME DATA S
   AVED!":CLOSE #N1:GOTO 1100
XA 9110 POSITION N9 N19:? "SAVE TO TAPE O
   R DISK";:INPUT Z$:IF Z$="D" THEN Z$=",
   ":GOTO 9150
VK 9120 IF Z$<>"T" THEN 7060
LO 9130 POSITION N9,N19:? "CUE, PRESS RET
   URN TWICE.":OPEN #N1,N4,N0,"K:":GET #N
   1,A:CLOSE #N1:Z$=","
GS 9140 OPEN #N1,N8,N0,"C:":GOTO 9160
ZB 9150 OPEN #N1,N8,N0,"D:ADVENTUR.DAT"
PQ 9160 PRINT #NI;R
ZW 9170 FOR X=N1 TO NN-SI:PRINT #N1;I(X):
   NEXT X
FW 9180 CLOSE #Nl:? :? :AS="":GOTO 1100
HW 10000 N1=1:N2=2:N3=3:N4=4:N5=5:N6=6:N7
   =7:N8=8:N9=9:N10=10:N11=11:N12=12:N13=
   13:N14=14:N15=15:N16=16:N17=17:N18=18
LP 10002 N19=19:N20=20:N21=21:N22=22:N23=
   23:N24=24:N25=25:N26=26:N27=27:N28=28:
   N29=29:N30=30:N31=31:N32=32:N33=33
VB 10004 N34=34:N35=35:N36=36:N37=37:N38=
   38:N39=39:N48=40:N41=41:N42=42:N43=43:
   N44=44:N45=45:N46=46:N47=47
ZN 10006 N48=48:N49=49:N50=50:N950=950:N9
   000=9000
PN 10009 GRAPHICS N0:POKE 559,N0:POKE 82,
   N2:POKE 752,N1:DL=PEEK(560)+PEEK(561)*
   256+N4
OP 10010 POKE DL+N7,N7:POKE DL+N11,N6:POK
   E DL+N12,N6:POKE DL+N13,N6
LO 16020 POKE DL+NZ4,65:POKE DL+N25,PEEK(
   560):POKE DL+N26,PEEK(561):POKE 710,N0
ZP 10025 DIM NA$(N18),T$(N18)
YL 10030 RESTORE 12200:READ NA$,T$
KQ 10040 POSITION N9-INT(LEN(TS)/N2),N6:?
    T$:POSITION N28,N9:? "BY":POSITION N2
   9-INT(LEN(NA$)/N2),N10:? NA$
ES 10050 POSITION N7,N18:? "Programmed by
    THE WIZARD":POKE 559,N34
WO 10100 DIM VB$(NV*N3),I$(NN*N13)A$(160
   ),IN$(N26),V$(N10),N$(N10),CC$(77),D$(
   37),Z$(N1)
QF 10110 DIM IT$(NN*N3),I(NN),E$(85),L$(3
   5),FA$(NI9),SA$(NI5),VA$(N11),TA$(N10)
   ,INTRO$(L)
VZ 10113 R=NS:UL=N1
SB 10120 I$(NI)=" ":I$(NN*N13)=" ":I$(N2)
   =I$
YJ 10300 GOSUB 900:A$=""
WT 10400 GRAPHICS N0:POKE 710,N0:POKE 709
   ,N10:POKE 752,N1
GU 10410 POSITION N2,N4:? INTRO$:POSITION
    N13,N22:? ""
PD 10420 OPEN #N1,N4,N0,"K:":GET #N1,A:CL
   OSE #NI
HS 11000 GRAPHICS N0:GOSUB N5:POKE 559,N0
   :DL=PEEK(560)+256*PEEK*561)+N4:POKE DL
   -N1,71:POKE DL+N2,N6
HK 11010 POKE DL+N19,130:POKE DL+N24,65:P
   OKE DL+N25,PEEK(560):POKE DL+N26,PEEK(
   561)
AY 11020 POKE 82,N0:POKE 708,136:POKE 709
   ,N10:POKE 710,N0:POKE 712,112:POKE 752
   ,N1
LG 11022 RESTORE 11024:FOR X=N0 TO N19:RE
   AD A:POKE 1536+X,A:NEXT X
EI 11024 DATA 72,138,72,169,0,162,6,141,1
   0,212,141,23,208,142,24,208,104,170,10
   4,64
RV 11026 POKE 512,N0:POKE 513,N6:POKE 542
   86,192
FB 11030 POSITION N9-INT(LEN(T$)/N2),N0:?
    T$
WQ 11040 POSITION N1 N2:? ":":PO
   SITION N1,N4:? ":"
WS 11050 POSITION N1,N6:? ":"
VT 11080 POSITION N1,N12:? ":"
YA 11090 POSITION N1,N21:? "":POKE
    559,N34:GOTO N950
UF 12205 DATA 104,104,133,204,104,133,203
   ,104,133,206,194,133,205,104,104,133,2
   07,162,0,142,255,6,134,213,232
QF 12210 DATA 160,0,177,203,209,205,208,8
   ,200,192,3,208,245,134,212,96,173,255,
   6,24,105,3,197,207,240
GA 12220 DATA 16,141,255,6,165,205,24,105
   ,3,133,205,144,217,230,206,176,213,169
   ,0,133,212,96
CP 12230 DATA 216,104,104,133,204,104,133
   ,203,104,104,133,285,160,0,177,203,201
   ,61,240,11,56,233,1,145,263
PV 12240 DATA 200,196,205,208,240,96,169,
   33,248,244,208,242
DL 12250 DATA 104,104,104,141,253,6,104,1
   04,141,254,6,104,104,141,255,6,165,88,
   133,203,165,89,133,204,174
SK 12260 DATA 254,6,224,0,240,14,165,203,
   24,105,40,133,203,144,2,230,204,202,20
   8,242,165,203,24,109,253,6,133
XW 12270 DATA 203,144,2,230,204,56,165,20
   3,233,1,133,203,176,2,198,204,172,255,
   6,169,9,145,203,136,208,251,96
IY 12280 DATA 104,104,104,141,255,6,104,1
   33,204,104,133,203,160,0,177,203,201,3
   2,240,8,200,284,255,6,208
AP 12290 DATA 244,160,0,132,212,169,0,133
   ,213,96
JY 13000 GRAPHICS N0:POKE 752,N1:POKE 710
   ,N0:POSITION N19-LEN(A$)/N2,N4:GOSUB N
   3
SY 13010 POSITION N8,N8:? "This adventure
    is over!":POSITION N7,N12:? "Do you w
    ant to play again?"
OX 13020 OPEN #N1,N4,N0,"K:":GET #N1,A:CL
   OSE #N1
LQ 13030 IF A=ASC("Y") THEN RUN
OP 13840 IF A=ASC("N"7 THEN GRAPHICS 0:EN
   D
YX 13050 GOTO 13020


   Listing 2.
BASIC listing.

UA 10 REM ****************************
IT 20 REM *        THE WIZARD        *
HH 30 REM *      COMPILER MODULE     *
KV 40 REM *            BY            *
JS 50 REM *      CLAYTON WALNUM      *
BF 60 REM ****************************
VT 70 GRAPHICS 0:POKE 710,0
WT 80 N1=1:N2=2:N3=3:N4=4:N5=5:N6=6:N7=7:
   N8=8:N9=9:N10=10
LT 90 N11=11:N12=12:N13=13:M14=14:N15=15:
   N16=16:N17=17:N18=18:N19=19:N20=20:GOT
   O 3020
GY 100 RESTORE 3130:FOR X=N1 TO 72:READ A
   :CC$(X)=CHR$(A):NEXT X
MV 110 FOR X=N1 TO 26:READ A:TR$(X)=CHR$(
   A):NEXT X
JO 120 FOR X=N1 TO 100:READ A:SS$(X)=CHR$
   (A):NEXT X
TD 130 FOR X=N1 TO 37:READ A:E$(X)=CHR$(A
   ):NEXT X:RETURN
PM 140 A=USR(ADR(TRS7,ADR(NS),LENCNS)):RE
TURN
PS 150 A=USRCADR(SS$),ADR(C$),ADR(IT$),LE
   N(IT$),N13):IF  NOT A THEN 3270
ZJ 160 RETURN
WY 170 GOSUB 140:L$(LEN(L$)+N1)=Q$:N$=N$(
   N1,A+N1):GOSUB 180:L$(LEN(L$)+N1)=N$:L
   $(LEN(L$)+N1)=QS:RETURN
AF 180 A=USR(ADR(E$),ADR(N$),LEN(N$)):RET
   URN
YU 190 A=USR(ADR(CC$),ADR(N$),ADR(IT$),LE
   N(IT$)):RETURN
RX 200 LV=LV-64:L(LV)=L(LV)+N2:L$(N1)=STR
   $(5900+LV*100+L(LV)):RETURN
IE 210 INPUT #N1;CM$:N$=CM$(N1,N3):GOSUB
   180:GOSUB 190:RETURN
KC 220 C$(CNT*N3-N2,CNT*N3)=N$:VCNT=VCNT+
   N1:CNT=CNT+N1:IF CNT>28 THEN GOSUB 255
   0
LO 230 IT$(VCNT*N3-N2 VCNT*N3)=N$:RETURN
WG 240 L$(N5)=" IF IN$=":N$=CM$(N1,N15):G
   OSUB 170:RETURN
MN 250 C$=CM$(N16,28):GOSUB 150
JK 260 IF CM$(81,81)="I" THEN L$(LEN(L$)+
   N1)=" AND I(N":L$(LEN(L$)+N1)=STR$(A):
   L$(LEN(L$)+N1)=")=-N1":GOTO 280
YC 270 L$(LEN(L$)+N1)=" AND ABS(I(N":L$(L
   EN(L$)+N1)=STR$(A):L$(LEN(L$)+N1)="))=
   R"
RF 280 L$(LEN(L$)+N1)=" THEN A$=":N$=CM$(
   30,54):GOSUB 170:RETURN
NM 290 L$(LEN(L$)+N1)=" THEN A$=":N$=CM$(
   55,79):GOSUB 170:RETURN
EC 360 REM ****************************
BP 316 REM *        ROOM LINES        *
EG 320 REM ****************************
QV 330 F$(LEN(F$)-N2)="RMS":OPEN #N1,N4,N
   0,F$
RM 340 FOR X=N1 TO N6:D(X)=N0:NEXT X
WM 350 TRAP 3230:INPUT #N1;RMS$
UG 360 ? "CREATING ROOM LINE"
HY 370 ROOM=ASC(RMS$):ROOM=ROOM+N4:L$(N1)
   =STR$(ROOM*N10)
NT 380 L$(LEN(L$)+N1)=" A$=":N$=RMS$1N2,2
   5):GOSUB 170
ZT 390 FOR X=N1 TO N6:IF ASC(RMS$(26+X,26
   +X))=N0 THEN NEXT X:GOTO 420
DZ 400 L$(LEN(L$)+N1)=":":R=ASC(RMS$(26+X
   ))+N4:IF R>34 THEN R=R-30:D(X)=-R
FR 410 L$(LEN(L$)+N1)=DIR$(X,X):L$(LEN(L$
   )+N1)="=N":L$(LEN(L$)+N1)-STR$(R):NEXT
    X
SJ 420 L$(LEN(L$)+N1)=":RETURN":? #N2;L$
EJ 430 REM ****************************
ZT 440 REM *   POS RESTRICTED EXITS   *
EN 450 REM ****************************
CO 460 FOR Y=N1 TO N6:IF D(Y)>-N1 THEN NE
   XT Y:GOTO 340
LU 470 ? "CREATING POS RESTRICTED LINE"
ME 480 L$(N1)=STR$(1780+ROOM*N2):L$(LEN(L
   $)+N1)=" IF R=N":L$(LEN(L$)+N1)=STR$(R
   OOM)
WP 490 L$(LEN(L$)+N1)=" AND IN$=":L$(LEN(
   L$)+N1)=Q$:L$(LEN(L$)+N1)=DIR$(Y,Y):L$
  (LEN(L$)+N1)=Q$
OJ 500 C$=RMS$(33,45):GOSUB 150
YE 510 IF RM5$(96,96)="R" THEN L$(LEN(L$)
   +N1)=" AND ABS(I(N":L$(LEN(L$)+N1)=STR
   $(A):L$(LEN(L$)+N1)="))=R":GOTO 530
TV 520 L$(LEN(L$)+N1)=" AND I(N":L$(LEN(L
   $)+N1)=STR$(A):L$(LEN(L$)+N1)=")=-N1"
LV 530 L$(LEN(L$)+N1)=" THEN A$=":N$=RMS$
   (46,70):GOSUB 170
55 540 L$(LEN(L$)+N1)=":R=N":L$(LEN(L$)+N
   1)=STR$(-D(Y))
JT 550 L$(LEN(L$)+N1)=":UL=N1:G.N950":? #
   N2;L$
YM 560 REM ***************************
UA 570 REM *   NEG RESTRICTED EXITS  *
YQ 580 REM ***************************
RT 590 IF RMS$(71,71)=" " THEN 340
MK 600 L$(N1)=STR$(1781+ROOM*N2):L$(LEN(L
   $)+N1)=" IF R=N":L$(LEN(L$)+N1)=STR$(R
   OOM)
UK 610 ? "CREATING NEG RESTRICTED LINE"
WD 620 L$(LEN(L$)+N1)=" AND IN$=":L$(LEN(
   L$)+N1)=Q$:L$(LEN(L$)+N1)=DIR$(Y,Y):L$
   (LEN(L$)+N1)=Q$
UJ 630 L$(LEN(L$)+N1)=" THEN A$=":N$=RMS$
   (71,95):GOSUB 170
DJ 640 L$(LEN(L$)+N1)=":G.N950":? #N2;L$:
   GOTO 340
YL 650 REM ***************************
LM 660 REM *        ITEM DATA        *
YP 670 REM ***************************
VZ 680 CLOSE #N1:FI$(LEN(FI$)-N2)="ITM":O
   PEN #N1,N4,N0,FI$:LS="":I=N0
NS 690 I=I+NI:IF I>ICHT THEN 1150
WT 700 INPUT #NI;I$
XD 710 ? "CREATING ITEM DATA LINE"
XM 720 IF I$(N17,N17)="" THEN SI=SI+N1:G
   OTO 690
WU 730 L$(N1)=STR$(12000+I):L$(LEN(L$)+N1
   )=" DATA ":N$=I$(N1,N13):GOSUB 140
WS 740 N$=N$(N1,A+N1):GOSUB 180:L$(LEN(L$
   )+N1)=N$
TV 750 L$(LEN(L$)+N1)=",":IF I$(N18,21)="
   NONE" THEN 770
HB 760 IF (I$(N18,N20)<>"GET" AND I$(33,3
   5)<>I$(N14,N16)3 OR I$(N17,N17)="C" TH
   EN R=0:GOTO 780
AL 770 R=ASC(I$(N17))+N4:IF R>34 THEN R=-
   R+30
QW 780 L$(LEN(L$)+N1)=STR$(R):? #N2;L$
EY 790 REM ****************************
PN B00 REM *   ACCESS TO ITEMS LINES  *
EJ 810 REM ****************************
TQ 820 IF I$(N18,N20)="GET" OR I$(N18,21)
   ="NONE" OR I$(N17,N17)="C" THEN 690
SD 830 LV=ASC(I$(N18)):IF LV=32 THEN 690
QX 840 GOSUB 200:L$(N5)="IF INS<>"
YE 850 ? "CREATING POS ACCESS LINE"
AU 860 N$=I$(N18,32):GOSUB 170
RS 870 L$(LEN(L$)+N1)=" OR I(N":L$(LEN(L$
   )+N1)=STR$(I-SI):L$(LEN(L$)+N1)=")"
BG 880 IF I$(N17,N17)="A" THEN 910
DC 890 L$(LEN(L$)+N1)=" OR R<>N":R=ASC(I$
   (N17))+N4:IF R>34 THEN R=R-30
GX 900 L$(LEN(L$)+N1)=STR$(R)
BW 910 IF I$(33,36)="NONE" THEN 950
HA 920 C$=I$(33,45):GOSUB 150
HF 930 IF I$(96,96)="I" THEN L$(LEN(L$)+N
   1)=" OR I(N":L$(LEN(L$)+N1)=STR$(A):L$
   (LEN(L$)+N1)=")<>-N1":GOTO 950
QZ 940 L$(LEN(L$)+N1)=" OR ABS(I(N":L$(LE
   N(L$)+N1)=STR$(A):L$(LEN(L$)+N1)="))<>
   R"
JF 950 L$(LEN(L$)+N1)=" THEN ":L$(LEN(L$)
   +N1)=STR$(VAL(L$)+N2):? #N2;L$
QH 960 L$(N1)=STR$(VAL(L$)+N1):L$(N5)=" A
   $=":N$=I$(46,70):GOSUB 170
BT 970 L$(LEN(L$)+N1)=":I(N":L$(LEN(L$)+N
   1)=STR$(I-SI):L$(LEN(L$)+N1)=")="
TS 980 IF I$(N17,N17)="A" THEN L$(LEN(L$)
   +N1)="R":GOTO 1010
AR 990 R=ASC(I$(N17))+N4:IF R>34 THEN R=-
   R+30
MT 1000 L$(LEN(L$)+N1)=STR$(R)
ZB 1010 L$(LEN(L$)+N1)=":UL=N1:G.N950":?
   #N2;L$
KP 1020 L$(N1)=STR$(VAL(L$)+N1):L$(N5)="
   REM":? #N2;L$
GO 1030 ? "CREATING NEG ACCESS LINE"
UR 1040 IF I$(71,71)=" " THEN 690
CJ 1050 LV=ASC(I$(N18)):GOSUB 200
SV 1060 L$(N5)="IF INS=":N$=I$(N18,32):GO
   SUB 170
ND 1070 L$(LEN(L$)+N1)=" AND R=N":R=ASC(I
   $(N17))+N4:IF R>34 THEN R=R-30
NR 1080 L$(LEN(L$)+N1)=STR$(R)
WT 1090 L$(LEN(L$)+N1)=" AND NOT I(N":L$(
   LEN(L$)+N1)=STR$(I-SI):L$(LEN(L$)+Nl)=
   ") THEN A$="
SU 1100 N$=I$(71,95):GOSUB 170
MH 1110 L$(LEN(L$)+N1)=":G.N950":? #N2;L$
   :GOTO 690
QE 1120 REM ****************************
OX 1130 REM *       COMMAND LINES      *
QK 1140 REM ****************************
LU 1150 CLOSE #NI:FI$(LEN(FI$)-N2)="COM":
   OPEN #N1,N4,N0,FI$:TRAP 3310
WM 1160 INPUT #Nl;CM$:LV=ASC(CM$(N1)):GOS
   UB 200
PC 1170 ? "CREATING COMMAND LINE"
YD 1180 GOSUB 240
ZI 1190 IF ASC(CM$(29))=N0 THEN 1210
EA 1200 L$(LEN(L$)+N1)=" AND R=N":L$(LEN(
   L$)+N1)=STR$(ASC(CMS$(29))+N4)
GG 1210 IF CM$(N16,N19)="NONE" THEN GOSUB
   280:GOTO 1230
YA 1220 GOSUB 250
AK 1230 L$(LEN(L$)+N1)=":G.N950":? #N2;L$
VS 1240 IFCM$(55,55)=" " OR CMS$(N16,N19)
   ="NONE" THEN 1160
TQ 1250 LV=ASC(CM$(N1)):GOSUB 200:GOSUB 2
   40
AI 1260 IF ASC(CM$(29))=N0 THEN GOTO 1280
EV 1270 L$(LEN(L$)+N1)=" AND R=N":L$(LEN(
   L$)+N1)=STR$(ASC(CM$(29))+N4)
TU 1280 L$(LEN(L$)+N1)=" THEN A$=":N$=CM$
   (55,79):GOSUB 170
MD 1290 L$(LEN(L$)+N1)=":G.N950":? #N2;L$
   :GOTO 1160
II 1300 REM ***************************
BJ 1310 REM *   FATAL COMMAND LINES   *
IO 1320 REM ***************************
JU 1330 FI$(LEN(FI$)-N2)="FAT":CLOSE #N1:
   OPEN #N1,N4,N0,FI$:TRAP 3350
MR 1340 INPUT #N1;CM$:IF CM$="" THEN 2320
IY 1350 ? "CREATING 'FATAL' LINE"
KF 1360 LV=ASC(CM$(N1)):GOSUB 200
YE 1370 GOSUB 240
AN 1380 IF ASC(CM$(29))=N0 THEN 1400
SA 1390 L$(LEN(L$)+N1)=" AND R=":L$(LEN(L
   $)+N1)=STR$(ASC(CM$(29))+N4)
CZ 1400 IF CM$(N16,N19)="NONE" THEN 1400
YB 1410 GOSUB 250
IY 1420 L$(LEN(L$)+N1)=":G.13000":? #N2;L
   $
VR 1430 IF CM$(55,55)=" " OR CM$(N16,N19)
   ="NONE" THEN 1340
KB 1440 LV=ASC(CM$(N1)):GOSUB 200
YA 1450 GOSUB 240
RT 1460 L$(LEN(L$)+N1)=" AND R=":L$(LEN(L
   $)+N1)=STR$(ASC(CM$(29))+N4)
TV 1470 L$(LEN(L$)+N1)=" THEN A$=":N$=CM$
   (55,79):GOSUB 170
MC 1480 L$(LEN(L$)+N1)=":G.N956":? #N2;L$
   :GOTO 1340
DN 1490 REM **************************
WY 1500 REM *      MOVE COMMANDS     *
CL 1510 REM **************************
KY 1520 FI$(LEN(FI$)-N2)="MOV":CLOSE #N1:
   OPEN #N1,N4,N0,FI$:TRAP 3370
WL 1530 INPUT #N1;CM$:LV=ASC(CM$(N1)):GOS
   UB 200
YO 1540 ? "CREATING MOVEMENT LINE"
YC 1550 GOSUB 240
LM 1560 IF ASC(CM$(29))=N0 THEN 1580
FB 1570 L$(LEN(L$)+N1)=" AND R=N":L$(LEN(
   L$)+N1)=STR$(ASC(CM$(29))+N4)
JC 1580 IF CM$(N16,N19)="NONE" THEN GOSUB
   280:GOTO 1600
ZB 1590 GOSUB 250
TA 1600 L$(LEN(L$)+Nl)=":R=N":L$(LEN(L$)+
   N1=STR$(ASC(CM$(80))+N4):L$(LEN(L$)+N
   1)=":UL=N1:G.N95O":? #N2;L$
XP 1610 IF CM$(55,55)=" " OR CM$(N16,N19)
   ="NONE" THEN 1530
JZ 1620 LV=ASC(CM$(N1)):GOSUB 200
KY 1630 GOSUB 240
KB 1640 IF ASC(CM$(29))=N0 THEN 1660
RU 1650 L$(LEN(L$)+N1)=" AND R=":L$(LEN(L
   $)+N1=STR$(ASC(CM$(29))+N4)
AU 1660 GOSUB 290
NW 1670 L$(LEN(L$)+N1)=":G.N950":? #N2;L$
   :GOTO 1530
DI 1680 REM **************************
SG 1690 REM *      ITEM COMMANDS     *
CM 1700 REM **************************
KV 1710 FI$(LEN(FI$)-N2)="CHG":CLOSE #N1:
   OPEN #N1,N4,N0,FI$:TRAP 3390
WM 1720 INPUT #N1;CM$:LV=ASC(CM$(N1)):GOS
   UB 200
VG 1730 ? "CREATING ITEM COMMAND LINE"
BA 1740 L$(N5)=" IF IN$<>":N$=CM$(N1,N15)
   :GOSUB 170
RN 1750 IF CM$(N16,N19)="NONE" THEN 1770
LS 1760 L$(LEN(L$)+N1)=" OR I(":C$=CM$(N
   16,28):GOSUB 150:L$(LEN(L$)+N1)=STR$(A
   ):L$(LEN(L$)+N1)="<>-N1"
KY 1770 IF CM$(122,125)="NONE" THEN 1800
OG 1780 L$(LEN(L$)+N1)=" OR I(N":C$=CM$(1
   22,134):GOSUB 150
DT 1790 L$(LEN(L$)+N1)=STR$(A):L$(LEN(L$)
   +N1)=")<>-N1"
MM 1800 IF CM$(81,84]="NONE" THEN 1830
VG 1810 L$(LEN(L$)+N1)=" OR I(N":C$=CM$(8
   1,93):GOSUB 150
PW 1820 L$(LEN(L$)+N1)=STR$(A):L$(LEN(L$)
   +N1)=")<>N0"
LG 1830 IF ASC(CM$(29))=N0 THEN 1850
OQ 1840 L$(LEN(L$)+N1)=" OR R<>N":L$(LEN(
   L$)+N1)=STR$(ASC(CM$(29))+N4)
BL 1850 L$(LEN(L$)+N1)=" THEN ":L$(LEN(L$
   )+N1)=STR$(VAL(L$)+N2):? #N2;L$
BK 1860 L$(N1)=STR$(VAL(LS)+N1)
NG 1870 IF CM$(81,84)="NONE" THEN 1920
QK 1880 L$(N5)=" I(N":C$=CM$(81,93):GOSUB
   150
JN 1890 L$(N8)=STR$(A):L$(LEN(L$)+N1)=")=
   ":IF CM$(95,95)="N" AND CM$(94,94)="R"
   THEN L$(LEN(L$)+N1)="-R:":GOTO 1920
MP 1900 IF CM$(94,94)="R" THEN L$(LEN(L$)
   +N1)="R":GOTO 1920
GE 1910 L$(LEN(L$)+N1)="-N1:"
BR 1920 IF CM$(96,99)="NONE" THEN 1980
LA 1930 C$=CM$(96,108):GOSUB 150
SF 1940 L$(LEN(L$)+N1)="I(N":L$(LEN(L$)+N
   1)=STR$(A):L$(LEN(L$)+N1)=")=N0:"
KJ 1950 IF CM$(109,112)="NONE" THEN 1980
VQ 1960 L$(LEN(L$)+N1)="I(N":C$=CM$(109,1
   21):GOSUS 150
KR 1970 L$(LEN(L$)+N1)=STR$(A):L$(LEN(L$)
   +N1)=")=N0:"
FW 1980 L$(LEN(L$)+N1)="UL=N1:A$=":N$=CM$
   (30,54):GOSUB 170
SQ 1990 L$(LEN(L$)+N1)=":G.N950":? #N2;L$
KK 2000 L$(NI)=STR$(VAL(L$)+N1):L$(N5)="
   REM":? #N2;L$
OQ 2010 IF CM$(55,55)=" " THEN 1720
BD 2020 LV=ASC(CM$(N1)):GOSUB 200:? "CREA
   TING NEG ITEM COMMAND LINE"
UW 2030 L$(N5)=" IF IN$=":N$=CM$(N1,N15):
   GOSUB 170
CJ 2040 L$(LEN(L$)+N1)=" AND ":IF CM$(122
   ,125)<>"NONE" THEN L$(LEN(L$)+N1)="("
XE 2050 L$(LEN(L$)+N1)=" I(N":C$=CM$(NI6,
   28):GOSUB 150:L$(LEN(L$)+N1)=STR$(A)
HW 2060 L$(LEN(L$)+N1)=")<>-N1":IF CM$(12
   2,125)="NONE" THEN 2080
TH 2070 L$(LEN(L$)+N1)=" OR I(N":C$=CM$(1
   22,134):GOSUB 150:L$(LEN(L$)+N1)=STR$(
   A):L$(LEN(L$)+N1)=")<>-N1)"
TR 2080 L$(LEN(L$)+N1)=" THEN A$=":N$=CM$
   (55,79):GOSUB 170
PK 2090 L$(LEN(L$)+N1)=":G.N958":? #N2;L$
   :GOTO 1720
IF 2100 REM ***************************
UJ 2110 REM *      FINAL COMMANDS     *
IL 2120 REM ***************************
VJ 2130 FI$(LEN(FI$)-N2)="FIN":CLOSE #N1:
   OPEN #N1,N4,N0,FI$:TRAP 3330
WH 2140 INPUT #N1;CM$:LV=ASC(CM$(N1)):GOS
   UB 200
BQ 2150 ? "CREATING GAME END LINE"
XY 2160 GOSUB 240
IY 2170 IF ASC(CM$(29))=N0 THEN 2190
EX 2180 L$(LEN(L$)+N1)=" AND R=N":L$(LEN(
   L$)+N1)=STR$(ASC(CM$(29))+N4)
FC 2190 IF CM$(N16,N19)="NONE" THEN GOSUB
    280:GOTO 2210
XV 2200 GOSUB 250
ZF 2210 L$(LEN(L$)+N1)=":G.13000":? #2;L$
TJ 2220 IF CM$(55,55)=" " OR CM$(N16,N19)
   ="NONE" THEN 2140
JV 2230 LV=ASC(CM$(N1)):GOSUB 200
XU 2240 GOSUB 240
HW 2250 IF ASC(CM$(29))=N0 THEN 2270
RQ 2260 L$(LEN(L$)+N1)=" AND R=":L$(LEN(L
   $)+N1)=STR$(ASC(CM$(29))+N4)
AQ 2270 G0SUB 290
KE 2280 L$(LEN(L$)+N1)=":G.N950":? #N2;L$
   :GOTO 2140
JI 2290 REM ***************************
EO 2300 REM *  CREATE SEARCH STRINGS  *
IN 2310 REM ***************************
JA 2320 ? "CREATING VERB TABLE LINE"
PY 2330 FI$(LEN(FI$)-N2)="FAT":C$="":CNT=
   N1:VCNT=N2:IT$="HFUESP"
GM 2340 L$(N1)="10210 ":L$(N7)="VB$(N1)="
   :L$[N15)=Q$:L$(N16)=IT$
US 2350 CLOSE #N1:OPEN #N1,N4,N0,FI$:TRAP
    2380:LCNT=N0:? "FATAL"
UG 2360 GOSUB 210:IF A THEN 2360
AD 2370 GOSUB 220:GOTO 2360
WU 2380 FI$(LEN(FI$)-N2)="COM":CLOSE #NI:
   OPEN #N1,N4,N0,FI$:TRAP 2410:? "COMMAN
   D"
XV 2390 GOSUB 210:IF A THEN 2390
CB 2400 GOSUB 220:GOTO 2390
BJ 2410 FI$(LEN(FI$)-N2)="ITM":CLOSE #NI:
   OPEN #N1,N4,N0,FI$:TRAP 2450:? "ITEM"
SW 2420 INPUT #N1;I$:IF I$(N18,21)="NONE"
   THEN 2420
SH 2430 N$=I$(N18,N20):GOSUB 180:GOSUB 19
   0:IF A THEN 2420
XE 2440 GOSUB 220:GOTO 2420
NG 2450 FI$(LEN(FI$)-N2)="MOV":CLOSE #N1:
   OPEN #N1,N4,N0,FI$:TRAP 2480:? "MOVE"
VJ 2460 GOSUB 210:IF A THEN 2460
BB 2470 GOSUB 220:GOTO 2460
QD 2480 FI$(LEN(FI$)-N2) ="FIN":CLOSE #N1:
   OPEN #Nl,N4,N0,FI$:TRAP 2510:? "FINAL
   "
YY 2490 GOSUB 210:IF A THEN 2490
CZ 2500 GOSUB 220:GOTO 2490
RL 2510 FI$(LEN(FI$)-N2)="CHG":CLOSE #N1:
   OPEN #Nl,N4,N0,FI$:TRAP 2540:? "CHANGE
   "
YF 2520 GOSUB 210:IF A THEN 2490
XZ 2530 GOSUB 220:GOTO 2520
LJ 2540 L$(LEN(L$)+N1)=C$:L$(LEN(L$)+N1)=
   Q$:? #N2;L$:GOTO 2580
PY 2550 L$(LEN(L$)+N1)=C$:L$(LEN(L$)+N1)=
   Q$:? #N2;L$
TS 2560 LCNT=LCNT+N1:L$(N1)=STR$(10210+LC
   NT):L$(N6)=" VB$("
QH 2570 L$(N11)=STR$(LCNT*84):L$(LEN(L$)+
   Nll=")=":L$(LEN(L$)+N1)=Q$:CNT=N1:C$="
   ":RETURN
TW 2580 FI$(LEN(FI$)-N2)="ITM":CLOSE #N1:
   OPEN #N1,4,0,FI$:L$(N1)="10280 IT$=":L
   $(LEN(L$)+N1)=Q$
KV 2590 ? "CREATING ITEM TABLE LINE"
WL 2600 FOR I=N1 TO ICNT:INPUT #Nl;I$:N$=
   I$(N14,N16):GOSUB 180
EU 2610 IF I$(N17,N17)="" THEN SI$(LEN(S
   I$)+N1)=N$:NEXT I:GOTO 2660
UG 2620 IF INT(I/30)<>30 THEN 2650
UG 2630 L$(LEN(L$)+N1)=N$:L$(LEN(LS)+N1)=
   Q$:? #N2;L$:L$(Nl)="10281 IT$(91)="
UG 2640 L$(LEN(L$)+N1)=Q$:NEXT I:GOTO 266
   0
ZD 2650 L$(LEN(L$)+N1)=N$:NEHT I
XG 2660 L$(LEN(L$)+N1)=SI$:L$(LEN(L$)+N1)
   =Q$:? #N2;L$:CLOSE #Nl
DG 2670 REM **************************
FG 2680 REM *       MISC LINES       *
DM 2690 REM **************************
CV 2700 ? "CREATING MISC LINES"
KU 2710 TRAP 2720:FI$(LEN(FI$)-N2)="INT":
   CLOSE #N1:OPEN #Nl,N4,N0,FI$:GET #N1,L
   H:GET #N1,LL:L=LH*78+LL:CLOSE #N1
YK 2720 L$(N1)="10060 NN=":L$(N10)=STR$(I
   CNT):L$(LEN(L$)+N1)=":NV=":L$(LEN(L$)+
   N1)=STR$(VCNT)
GT 2730 L$(LEN(L$)+N1)=":SI=":L$(LEN(L$)+
   N1)=STR$(SI):IF L=N0 THEN L=N1
KR 2740 L$(LEN(L$)+N1)=":L=":L$(LEN(L$)+N
   1)=STR$(L):? #N2;L$
WR 2750 FI$(LEN(FI$)-N2)="NAM":CLOSE #N1:
   OPEN #N1,N4,N0,FI$
DS 2760 INPUT #Nl;N$:INPUT #N1;T$:CLOSE #
   N1
IM 2770 L$(N1)="12280 DATA ":L$(Nl2)=N$
TV 2780 FOR X=N1 TO LEN(T$):IF T$(X,X)>="
   A" AND T$(X,X)<="Z" THEN T$(X,X)=CHR$(
   ASC(T$(X,X))+32)
MO 2790 NEXT X
KE 2800 L$(LEN(L$)+N1)=",":L$(LEN(L$)+N1)
   =T$:? #N2;L$
EP 2810 L$(N1)="9060 OPEN#N1,N4,N0,":L$(N
   20)=Q$:L$(21)="D:":L$(23)=NA$:L$(LEN(L
   $)+N1)=".DAT"
IZ 2820 REM ***************************
XI 2830 REM *          INTRO          *
JF 2840 REM ***************************
EC 2850 TRAP 2900:FI$(LEN(FI$)-N2)="INT":
   OPEN #Nl,N4,N0,FI$:GET #N1,LH:GET #N1,
   LL:L=LH*78+LL
XP 2860 FOR X=N1 TO LH+N1:INPUT #Nl;N$:L$
   (N1)=STR$(l0129+X):L$(N6)=" INTRO$("
RZ 2870 L$(N14)=STR$(X*78-77):L$(LEN(L$)+
   N1)=")=":L$(LEN(L$)+N1)=Q$
SP 2880 REM IF X=LH+N1 THEN GOSUB 200:N$=
   N$(N1,A+N1)
ZD 2890 L$(LEN(L$)+N1)=N$:L$(LEN(L$)+N1)=
   Q$:? #N2;L$:NEXT X
CX 2960 CLOSE #N2
CU 2910 REM **************************
TN 2920 REM *     CREATE PROGRAM     *
DA 2930 REM **************************
HH 2940 GRAPHICS N0:POKE 710,N0:? :? :? "
   LOAD ";CHR$(34);"D:WIZFRAME.BAS";CHR$(
   34)
LV 2950 FI$(LEN(FI$)-N2)="LNS":? :? :? "E
   NTER ";CHR$(34):FI$;CHRS(34)
DU 2960 FI$(LEN(FI$)-N2)="BAS":? :? :? "S
   AVE ";CHRS(34);Fl$;CHRSC34):? :? :? "P
   OKE 842,12":? :? :? "RUN"
OE 2970 POSITION N0,N0:POKE 842,13
QC 2980 STOP
DS 2990 REM **************************
OF 3800 REM *       INITIALIZE       *
CD 3010 REM **************************
RF 3020 DIM F$(N15),FI$(N15),R$(N2),D(N6)
   ,RMS$(96),L$(120),DIR$(N6),C$(90),Q$(N
   1),I$(96),IT$(650),L(26)
CJ 3030 DIM CM$(134),N$(78),TS(N18),TR$(2
   6),VB$(N11),NN$(N12),CC$(72),SS$(100),
   S1$(650),NA$(N8),E$(37)
J8,3040 F$="D:":DIR$="NSEWUD":Q$=CHR$(34)
XZ 3050 OPEN #Nl,N4,N0,"D:FILENAME.DAT":I
   NPUT #N1;NA$:CLOSE #Nl:F$(N3)=NA$:F$(L
   EN(F$)+N1)=".LNS"
HD 3060 OPEN #N1,N8,N0,F$:CLOSE #N1:OPEN
   #N2,N9,N0,F$
JA 3070 FOR X=N1 TO 26:L(X)=N0:NEXT X:ICN
   T=N0:SI=N0
CD 3080 FI$=F$:FI$(LEN(FI$)-N2)="ITM":OPE
   N #Nl,N4,N0,FI$
UC 3090 TRAP 3128:FOR X=N1 TO 58:INPUT #N
   1;I$:ICNT=ICNT+N1
IB 3100 IF I$(N17,N17)="" THEN SI$(LEN(S
   I$)+N1)=I$(N1,N13):SI=SI+N1:NEXT X:GOT
   0 3120
IX 3110 IT$((X-SI)*N13-N12,(X-SI)*N13)=I$
   (N1,N13):NEXT X
YA 3120 POP :CLOSE #N1:IT$(LEN(IT$)+N1)=S
   I$:SI$="":SI=N0:GOSUB 100:GOTO 330
AZ 3130 DATA 104,104,133,204,104,133,283,
   104,133,286,104,133,205,104,104,133,28
   7,162,0,142,255,6,134,213,232
KY 3140 DATA 160,0,177,203,209,205,288,8,
   200,192,3,288,245,134,212,96,173,255,6
   ,24,105,3,197,287,240
SB 3150 DATA 16,141,255,6,165,205,24,105,
   3,133,205,144,217,230,206,176,213,169,
   0,133,212,96
VX 3160 DATA 184,104,133,209,164,133,208,
   104,184,168,136,240,6,177,208,261,32,2
   40,247,132,212,169,0,133,213,96
EB 3170 DATA 184,104,133,204,184,133,263,
   104,133,206,104,133,205,184,141,1,6,10
   4,141,0,6,104,184,133,207
KT 3180 DATA 162,0,142,2,6,142,3,6,134,21
   3,232,168,0,177,283,209,205,208,8,200,
   196,287,268,245,134
DR 3190 DATA 212,96,173,2,6,24,101,207,14
   1,2,6,144,3,238,3,6,173,2,6,285,0,6,28
   8,8,173
JP 3200 DATA 3,6,205,1,6,240,13,165,205,2
   4,101,287,133,285,144,288,230,206,176,
   196,169,8,133,212,96
XY 3218 DATA 216,104,164,133,284,184,133,
   203,104,184,133,205,160,8,177,203,201,
   33,240,11
RA 3228 DATA 24,105,1,145,203,200,196,205
   ,288,248,96,169,61,240,244,288,242
FH 3230 IF PEEK(1957=136 THEN GOTO 680
MN 3240 ? "ERROR ";PEEK(195);" AT LINE ";
   PEEK(186)+PEEK(187)*256:END
LF 3250 IF PEEK(195)=136 THEN GOTO 1150
RG 3260 GOTO 3240
AA 3270 GRAPHICS N0:POKE 710,N0:POKE 752,
   N1:SOUND N0,75,N12,N8:FOR ?t=N1 TO 50:N
   EXT 3{ :SOUND N0,N0,N0,N0
OG 3280 POSITION N6,N8:? "TROUBLE WITH IT
   EMS!":POSITION N6,N10:? "NO ";Q$;C$;Q$
   ;" FOUND!"
YC 3290 POSITION N6,N12:? "PRESS ANY KEY"
AK 3300 CLOSE #N1:OPEN #N1,N4,N0,"K:":GET
   #N1,A:CLOSE #N1:END
TK 3310 IF PEEK(195)=136 THEN 1330
QW 3320 GOTO 3240
TO 3330 IF PEEK(195)=136 THEN 2320
RC 3340 GOTO 3240
UY 3350 IF PEEK(195)=136 THEN 1520
RI 3360 GOTO 3240
WG 3370 IF PEEK(195)=136 THEN 1710
RO 3380 GOTO 3240
TE 3390 IF PEEK(195)=136 THEN 2130
QS 3400 GOTO 3240


   Listing 3.
BASIC listing.

JJ 50 A$="Jo!b!dbcjo":W=N6:RETURN
IQ 60 AS="Jo!uif!gspou!zbse":N=N7:W=N8:RE
   TURN
JF 70 A$="Jo!b!gjfme":S=N6:RETURN
NT 80 A$="Jo!b!gpsftu":N=N9:S=N8:E=N6:W=N
   9:RETURN
VI 90 A$="Jo!b!gpsftu":N=N8:S=N8:E=N9:W=N
   10:RETURN
UQ 100 A$="Cftjef!b!ijmm":E=N9:RETURN
KJ 110 A$="Jo!b!dbwf":E=N10:RETURN
GJ 120 A$="Jotjef!uif!tife":W=N7:RETURN
AV 6302 IF IN$<>"EJBM!45.65.38" OR I(N3)
   OR R<>N5 THEN 6304
TP 6303 A$="Uif!dpncjobujpo!xpslt/":I(N3)
   =-5:UL=N1:GOTO N950
ZR 6304 IF IN$<>"EJH!HSPVOE" OR I(N15) OR
    R<>N11 OR I(N6)<>-N1 THEN 6306
YU 6305 A$="Zpv!ejh!tpnfuijoh!vq=":I(N15)
   =-11:UL=N1:GOTO N950
WK 6306 IF IN$="EJH!HSPVOE" AND R=N11 AND
     NOT I(N15) THEN A$="Zpv!offe!tpnfuij
   oh/":GOTO N950
CJ 6502 IF IN$<>"GJMM!MBOUFSO" OR I(N2)<>
   -N1 OR I(N10)<>-N1 OR I(N20)<>N0 THEN
   6504
MQ 6503 I(20)=-N1:I(N2)=N0O:UL=N1:A$="Plbz
   -!ju(t!gvmm/":GOTO N950
XH 6504 IF IN$="GJMM!MBOUFSO" AND (I(N2)<
   >-N1 OR I(N10)<>-N1) THEN A$="Opu!zfu/
   ":GOTO N950
RC 6602 IF IN$="HP!TIFE" AND R=N7 AND ABS
   (I(N18))=R THEN A$="Plbz":R=N12:UL=N1:
   GOTO N950
JH 6604 IF IN$="HP!TIFE" AND R=7 THEN A$=
   "Ju(t!dmptfe!vq!ujhiu/":GOTO N950
IC 6606 IF INS="HP!DBWF" AND R=N10 AND AB
   S(I(N14))=R THEN A$="Plbz":R=N11:UL=N1
   :GOTO N950
ZX 6608 IF IN$="HP!DBWF" AND R=10 THEN A$
   ="Zpv!dbotu!ep!uibu!zfu/":GOTO N950
HL 7102 IF IN$="MPPL!QBSSPU" AND R=N5 THE
   N A$="Ju!mpplt!mjlf!b!gbsspu/":GOTO N9
   50
OR 7104 IF IN$="MPPL!DBCJOFU" AND R=N5 TH
   EN A$="Ju!ibt!b!mpdl/":GOTO N950
QI 7106 IF IN$="MPPL!MPDL" AND R=N5 THEN
   A$="Jutt!b!dpncjobujpo!mpdl/":GOTO N95
   0
CB 7108 IF IN$="MPPL!TIFE" AND R=N7 AND A
   BS(I(N19))=R THEN A$="Tpnfpof!cpbsefe!
   ju!vq/":GOTO N950
AQ 7110 IF IN$="MPPL!MBOUFSO" AND I(N2)=-
   N1 THEN A$="Ju!offet!gjmmjoh/":GOTO N9
   50
MF 7112 IF IN$="MPPL!MBOUFSO" THEN A$="Zp
   v!epoIu!ibwf!ju/":GOTO N950
DO 7114 IF IN$="MPPL!LFSPTFOF" AND I(N10)
   =-N1 THEN A$="Mbcfm;!GPS!MBOUFSOT":GOT
   O N950
LI 7116 IF IN$="MPPL!LFSPTFOF" THEN A$="Z
   pv!ibwf!up!ibwf!ju!gjstu":GOTO N950
BL 7118 IF IN$="MPPL!EPPS" AND R=N7 AND A
   BS(I(N19))=R THEN A$="Uifsf(t!b!cpbse!
   pwfs!ju/":GOTO N950
OZ 7120 IF IN$="MPPL!SVCCMF" AND R=N10 TH
   EN A$="Uifsf(t!tpnf!cpvmefst/":GOTO N9
   50
SN 7122 IF IN$="MPPL!DBWF" AND R=N11 THEN
    A$="Uif!hspvoeCt!ejtuvscfe/":GOTO N95
   0
KL 7124 IF IN$<>"MJHIU!MBOUFSO" OR I(N20)
   <>-N1 OR I(N4)<>-N1 OR I(N21)<>N0 THEN
    7126
GL 7125 I(21)=-N1:I(N20)=N0:UL=N1:A$="ZpV
   !mjhiu!uif!mboufso/":GOTO N950
HW 7126 IF IN$="MJHIU!MBOUFSO" AND (I(N20
   )<>-N1 OR I(N4)<>-N1) THEN A$="Zpv!off
   e!tpnfuijoh!npsf/":GOTO N950
VK 7128 IF IN$="MPPL!DIFTU" AND R=N11 AND
    I(N2)=-N1 THEN A$="Zpv!gpvoe!uif!nbh
   bXXXXXXXjoft=":GOTO 13000
RW 7130 IF IN$="MPPL!DIFTU" AND R=11 THEN
   A$="Zpv!db0Cu!rvjuf!tff///":GOTO N950
Hn 7402 IF IN$<>"PQFO!DBCJOFU" OR I(N2) 0
   R R<>NS OR ABS(I(N3))<>R THEN 7404
GO 7403 A$="UifsfCt!tpnfuijoh!jotjef=":I(
   N2)=5:UL=N1:GOTO N950
YH 7404 IF IN$="PQFO!DBCJOFU" AND R=N5 AN
   D  NOT I(N2) THEN AS="Ju(t!mpdlfe!vq/"
   :GOTO N950
GF 7702 IF IN$<>"SBLF!MFBWFT" OR I(N6) OR
   R<>N6 OR I(N9)<>-N1 THEN 7704
TO 7703 A$="Uifsf(t!tpnfuijoh!ifsf/":I(N6
   )=6:UL=N1:GOTO N950
SS 7704 IF IN$="SBLF!MFBWFT" AND R=N6 AND
     NOT I(N6) THEN A$="Zpv!dbo(u///zfu/"
   :GOTO N950
LX 7706 IF IN$<>"SFNPWF!CPBSE" OR I(N11)<
   >-N1 OR I(N18)<>N0 OR R<>N7 THEN 7708
XF 7707 I(18)=-R:I(N19)=N0:UL=N1:A$="///x
jui!uif!ujsf!jspo/":GOTO N958
EX 7708 IF IN$="SFNPWF!CPBSE" AND I(N11)<
   >-N1 THEN A$="Opu!opx/":GOTO N950
OB 7802 IF IN$<>"TNBTI!CPVMEFS" OR I(N14)
    OR R<>N10 OR I(N8)<>-N1 THEN 7804
XE 7803 A$="Zpv!tnbti!ju!up!gfccmft=":I(N
14)=10:UL=NI:GOTO N950
NK 7804 IF IN$="TNBTI!CPVMEFS" AND R=N10
   AND  NOT I(N14) THEN A$="Zpv!dbo(u///b
   u!uif!npnfou":GOTO N950
IV 7902 IF IN$="UBML!QBSSPU" AND R=N5 THE
   N A$="If!tbzt-(EjbM!45.65.38(":GOTO N9
   50
MN 10060 NN=25:NV=14:SI=0:L=286
TU 10130 INTRO$(1)="Somewhere out in the
   wilds, a chest   of old ANALOG Magazin
   es has been      hi"
PK 10131 INTRO$(79)="dden.  These collect
   or's items are just what you need to
   round out your coll"
TY 10132 INTRO$(157)="ection, something y
   ou've been     trying to do for years.
     If you can   find t"
AK 10133 INTROS(235)="hem, you'll be the
   envy of the entire neighborhood!
                       "1
ER 10200 IT$="QBSMBOPQFNBUMFBTIPTIFTMFSBL
   LFSUJSCPVTNBDBWDIFDBCMPDPMECPBGVMMJU45
   .SVCEPPHSP"
TL 10210 VB$(N1)="HFUESPMPPUBMPQFEJBSBL!!
   !TNBEJHSFNHP!MJHGJM"
TH 12001 DATA QBSSPU,-5
CV 12002 DATA MBOUFSO,0
OV 12003 DATA PQFO!MPDL,0
XT 12004 DATA NBUDIFT,5
HI 12005 DATA MFBWFT,-6
BW 12006 DATA TIPWFM,0
ZX 12007 DATA TIFE,-7
VT 12008 DATA TMFEHFIBNNFS,12
ZH 12009 DATA SBLF,12
XI 12010 DATA LFSPTFOF,12
EQ 12011 DATA UJSF!JSPO,5
BI 12012 DATA CPVMEFS,-41
YO 12013 DATA TNBMM!SPDLT,0
OF 12014 DATA DBWF,0
UR 12015 DATA DIFTU,0
CM 12016 DATA DBCJOFU,-5
TE 12017 DATA MPDL,0
FQ 12018 DATA PME!CPBSE,0
XG 12019 DATA CPBSEFE!EPPS,-7
UB 12020 DATA GVMM!MBOUFSO,0
DJ 12021 DATA MJU!MBOUFSO,0
RW 12022 DATA 45.65.38,0
LC 12023 DATA SVCCMF,-10
ZO 12024 DATA EPPS,0
BE 12025 DATA HSPVOE,0
FW 12200 DATA CLAYTON WALNUM,Magazine hun
   t