756cb2520ab898186b2b75c1619cfbc2ba56733a
[projects/chimara/chimara.git] / interpreters / nitfol / nitfol.html
1 <HTML>
2 <HEAD>
3 <!-- This HTML file has been created by texi2html 1.54
4      from nitfol.texi on 24 October 1999 -->
5
6 <TITLE>Nitfol</TITLE>
7
8 </HEAD>
9 <BODY>
10 <H1>Nitfol</H1>
11 <P>
12 <P><HR><P>
13 <H1>Table of Contents</H1>
14 <UL>
15 <LI><A NAME="TOC1" HREF="nitfol.html#SEC1">1  Introduction</A>
16 <LI><A NAME="TOC2" HREF="nitfol.html#SEC2">2  Invoking nitfol</A>
17 <LI><A NAME="TOC3" HREF="nitfol.html#SEC3">3  Features</A>
18 <UL>
19 <LI><A NAME="TOC4" HREF="nitfol.html#SEC4">3.1  Preferences</A>
20 <LI><A NAME="TOC5" HREF="nitfol.html#SEC5">3.2  Infinite undo/redo</A>
21 <LI><A NAME="TOC6" HREF="nitfol.html#SEC6">3.3  Aliases</A>
22 <LI><A NAME="TOC7" HREF="nitfol.html#SEC7">3.4  Abbreviation Expansion</A>
23 <LI><A NAME="TOC8" HREF="nitfol.html#SEC8">3.5  Typo correction</A>
24 <LI><A NAME="TOC9" HREF="nitfol.html#SEC9">3.6  Automapping</A>
25 <LI><A NAME="TOC10" HREF="nitfol.html#SEC10">3.7  Quetzal</A>
26 <LI><A NAME="TOC11" HREF="nitfol.html#SEC11">3.8  Blorb</A>
27 </UL>
28 <LI><A NAME="TOC12" HREF="nitfol.html#SEC12">4  Debugger</A>
29 <LI><A NAME="TOC13" HREF="nitfol.html#SEC13">5  Bugs</A>
30 <LI><A NAME="TOC14" HREF="nitfol.html#SEC14">6  Thanks</A>
31 <LI><A NAME="TOC15" HREF="nitfol.html#SEC15">7  Games Cited</A>
32 </UL>
33 <P><HR><P>
34
35
36 <H1><A NAME="SEC1" HREF="nitfol.html#TOC1">1  Introduction</A></H1>
37
38 <P>
39 Nitfol is a portable interpreter for Z-machine code, the game format used by Infocom and more recently, <A HREF="http://www.gnelson.demon.co.uk/inform.html"><TT>Inform</TT></A>.  Nitfol handles versions one through eight of the format, and attempts to comply with version 1.0 of the Z-machine specification.
40
41 </P>
42 <P>
43 You will need game files to use nitfol.  The "if-archive" contains a large collection of these, available at <A HREF="ftp://ftp.gmd.de/if-archive/games/zcode/"><TT>ftp://ftp.gmd.de/if-archive/games/zcode/</TT></A> or at the USA mirror <A HREF="http://ifarchive.org/indexes/if-archiveXgamesXzcode.html"><TT>http://ifarchive.org/indexes/if-archiveXgamesXzcode.html</TT></A>.
44
45 </P>
46 <P>
47 This manual describes how to use nitfol and how it differs from other Z-machine interpreters.  This manual was written with UNIX-like systems in mind; ignore that which does not apply to your platform.  Comments on and corrections for this manual and nitfol are appreciated and should be sent to <A HREF="mailto:nitfol@my-deja.com"><TT>nitfol@my-deja.com</TT></A>.
48
49 </P>
50
51
52
53 <H1><A NAME="SEC2" HREF="nitfol.html#TOC2">2  Invoking nitfol</A></H1>
54
55 <P>
56 Invoke nitfol with the game filename, and options.  If you omit the game filename, nitfol will prompt you for one.  The following options are recognized:
57
58 </P>
59 <DL COMPACT>
60
61 <DT><CODE>-ignore</CODE>
62 <DD>
63 <DT><CODE>-no-ignore</CODE>
64 <DD>
65 <DT><CODE>-i</CODE>
66 <DD>
67 Ignore Z-machine strictness errors.  Normally nitfol checks for illegal and undefined Z-machine behaviour and alerts the user.  If you're playing someone else's buggy game, this can be annoying and you should use this option.
68
69 <DT><CODE>-fullname</CODE>
70 <DD>
71 <DT><CODE>-no-fullname</CODE>
72 <DD>
73 <DT><CODE>-f</CODE>
74 <DD>
75 For running under Emacs or DDD.  Tells nitfol to give machine-recognizeable markers when stack frames are displayed instead of displaying the line. Only useful if you are using nitfol as an inferior debugger.
76
77 <DT><CODE>-command <VAR>file</VAR></CODE>
78 <DD>
79 <DT><CODE>-x <VAR>file</VAR></CODE>
80 <DD>
81 Read commands from this file.  Load a script from a file for playback in the game.
82
83 <DT><CODE>-pirate</CODE>
84 <DD>
85 <DT><CODE>-no-pirate</CODE>
86 <DD>
87 <DT><CODE>-P</CODE>
88 <DD>
89 Aye, matey.  Make the piracy opcode not branch, letting the game know the game disc is not "genuine." Infocom never used this opcode and neither should you, but if obscurity amuses you...
90
91 <DT><CODE>-quiet</CODE>
92 <DD>
93 <DT><CODE>-no-quiet</CODE>
94 <DD>
95 <DT><CODE>-q</CODE>
96 <DD>
97 Do not print introductory messages.  For GDB compatibility.
98
99 <DT><CODE>-spell</CODE>
100 <DD>
101 <DT><CODE>-no-spell</CODE>
102 <DD>
103 Perform spelling correction.  Normally Z-machine games are unforgiving of typos (though they do have an <CODE>oops</CODE> command). If you type in a word which isn't in the game's dictionary and have typo correction enabled, nitfol will search for a word which is off by one letter by a substitution, deletion, insertion or transposition.
104
105 <DT><CODE>-expand</CODE>
106 <DD>
107 <DT><CODE>-no-expand</CODE>
108 <DD>
109 Expand one letter abbreviations.  Early Z-machine games don't include <KBD>x</KBD> as a synonym for <KBD>examine</KBD> and such.  If the first word in a sentence is one letter long and not recognized by the game, this will attempt to expand it to a full word.
110
111 <DT><CODE>-symbols <VAR>file</VAR></CODE>
112 <DD>
113 <DT><CODE>-s <VAR>file</VAR></CODE>
114 <DD>
115 Specify symbol file for game.  If you want to perform source-level debugging, you will need to specify a symbol file, which contains the names of variables and tells nitfol how source code corresponds to object code.
116
117 <DT><CODE>-tandy</CODE>
118 <DD>
119 <DT><CODE>-no-tandy</CODE>
120 <DD>
121 <DT><CODE>-t</CODE>
122 <DD>
123 Censors some Infocom games.  Some version 3 games perform minor wording changes when this bit is set to appease the sensitivity of Tandy Corporation.
124
125 <DT><CODE>-transcript <VAR>wfile</VAR></CODE>
126 <DD>
127 <DT><CODE>-T <VAR>wfile</VAR></CODE>
128 <DD>
129 Write transcript to this file.  This transcript begins as soon as the game starts.
130
131 <DT><CODE>-debug</CODE>
132 <DD>
133 <DT><CODE>-no-debug</CODE>
134 <DD>
135 <DT><CODE>-d</CODE>
136 <DD>
137 Enter debugger immediatly.  Imitate GDB by not automatically starting the story.
138
139 <DT><CODE>-prompt <VAR>string</VAR></CODE>
140 <DD>
141 Specify debugging prompt.  This is the prompt nitfol prints when it is waiting for a debugging command (as opposed to the &#62; the game story prints when waiting for a game command).  DDD requires this to be <SAMP>`(gdb) '</SAMP>.
142
143 <DT><CODE>-path <VAR>string</VAR></CODE>
144 <DD>
145 Look for games in this directory.  If nitfol cannot find the requested game in the current directory, it looks through the directories listed in the given colon separated string.  The directories specified here are also used to search for gamefiles from saved games.   If this option is not used, nitfol looks at the <CODE>INFOCOM_PATH</CODE> environment variable.
146
147 <DT><CODE>-autoundo</CODE>
148 <DD>
149 <DT><CODE>-no-autoundo</CODE>
150 <DD>
151 Ensure <CODE>@save_undo</CODE> is called every turn.  If a turn passes with no <CODE>@save_undo</CODE> between, this option performs the <CODE>@save_undo</CODE> automagically.  Could cause problems with some games which have a different concept of a turn.
152
153 <DT><CODE>-stacklimit <VAR>number</VAR></CODE>
154 <DD>
155 <DT><CODE>-S <VAR>number</VAR></CODE>
156 <DD>
157 Exit when the stack is this deep.  If a game is infinitely recursing, nitfol will allocate large amounts of memory and take a long time before the problem is reported.  This option makes it fatal to recurse more than the given number of stack frames.  Setting this to 0 makes nitfol allow as many as fit contiguously in memory.  The Z-machine Standards Document recommends games use no more than 1024 words of total stack (frames and pushed data) in ZIP, which roughly works out to 90 routine calls deep.
158
159 <DT><CODE>-alias <VAR>string</VAR></CODE>
160 <DD>
161 <DT><CODE>-a <VAR>string</VAR></CODE>
162 <DD>
163 Specify an alias.  Adds an alias which will be expanded in read lines before tokenisation.  The alias is of the form <VAR>name</VAR> <VAR>value</VAR>; you will need to use quotes around it on the commandline.
164
165 <DT><CODE>-ralias <VAR>string</VAR></CODE>
166 <DD>
167 Specify an recursive alias.  Adds an alias whose result is checked for further alias expansion.  Identical syntax to adding a normal alias.
168
169 <DT><CODE>-unalias <VAR>string</VAR></CODE>
170 <DD>
171 Remove an alias.  Removes an alias previously added by -alias.  Useful for removing aliases in preference files.
172
173 <DT><CODE>-random <VAR>number</VAR></CODE>
174 <DD>
175 <DT><CODE>-r <VAR>number</VAR></CODE>
176 <DD>
177 Set random seed.  Normally the random number generator is initialized with the time of day.  If this option is used with a non-zero argument, the given number will be used to initialize the generator and for <CODE>@random 0</CODE>.
178
179 <DT><CODE>-mapsym <VAR>string</VAR></CODE>
180 <DD>
181 Specify mapping glyphs.  Nitfol draws maps using ASCII characters; you can choose which characters it uses to draw rooms.  Defaults to <SAMP>`*udb@UDB+'</SAMP>, which is, in order: empty room, room with down exit, room with up exit, room with up and down exits, room with player, room with player and up exit, room with player and down exit, room with player and up and down exits, bend symbol.
182
183 <DT><CODE>-mapsize <VAR>number</VAR></CODE>
184 <DD>
185 Specify map size.  Determines the number of lines to be used for the map.
186
187 <DT><CODE>-maploc <VAR>string</VAR></CODE>
188 <DD>
189 Specify map location.  Nitfol creates a Glk window for the map it generates.  The map can be placed <SAMP>`above'</SAMP>, <SAMP>`below'</SAMP>, to the <SAMP>`right'</SAMP>, or the <SAMP>`left'</SAMP>, of the main game window.  Follow this option with one those locations.
190
191 <DT><CODE>-terpnum <VAR>number</VAR></CODE>
192 <DD>
193 Specify interpreter number.  Each port of Infocom's Z-machine interpreter was given a number.  <SAMP>`1'</SAMP> for their own DECSystem-20, <SAMP>`2'</SAMP> for Apple IIe, <SAMP>`3'</SAMP> for Macintosh, <SAMP>`4'</SAMP> for Amiga, <SAMP>`5'</SAMP> for Atari ST, <SAMP>`6'</SAMP> for IBM PC, <SAMP>`7'</SAMP> for Commodore 128, <SAMP>`8'</SAMP> for Commodore 64, <SAMP>`9'</SAMP> for Apple IIc, <SAMP>`10'</SAMP> for Apple IIgs, <SAMP>`11'</SAMP> for Tandy Color.  Giving this option makes nitfol claim to be running on the specified system.  A few games change their behaviour slightly depending on which machine type they run.  By default nitfol claims to be on an Apple IIe, as this makes Beyond Zork not do character graphics.
194
195 <DT><CODE>-terpver <VAR>string</VAR></CODE>
196 <DD>
197 Specify interpreter version.  Infocom's interpreters were given versions, typically a capital letter.  Nitfol defaults to <SAMP>`N'</SAMP>, Frotz uses <SAMP>`F'</SAMP>, and ZIP uses <SAMP>`B'</SAMP>.  Any single character version is allowed.  Multicharacter options are read as a number instead of an ASCII character.  Only known effect upon games is the letter printed by banners and the <SAMP>`version'</SAMP> command.  Version 6 games interpret this as a number instead of a letter.
198
199 </DL>
200
201
202
203 <H1><A NAME="SEC3" HREF="nitfol.html#TOC3">3  Features</A></H1>
204
205
206
207 <H2><A NAME="SEC4" HREF="nitfol.html#TOC4">3.1  Preferences</A></H2>
208
209 <P>
210 If you don't like the default options and don't want to recompile, you can set your preferences by writing a <TT>`.nitfolrc'</TT> in your home directory.
211
212 </P>
213 <P>
214 Each line should be of the form <CODE><VAR>option</VAR>=<VAR>value</VAR></CODE>.  Blank lines and lines starting with a <CODE>#</CODE> are ignored.  If you want to specify different options for different copies of nitfol, you can put those options in a block which will only be read by copies of nitfol with a specific name.
215
216 </P>
217 <P>
218 Here's an example <TT>`.nitfolrc'</TT>:
219
220 <PRE>
221 path=/usr/local/games/infocom
222 alias=v verbose
223 alias=asierra tone cordial. ask sierra about
224 ignore=true
225
226 [strictnitfol]
227 ignore=false
228 spell=false
229 expand=false
230 autoundo=false
231 unalias=v
232 unalias=asierra
233
234 [xnitfol]
235 tandy=true
236 pirate=true
237 </PRE>
238
239 <P>
240 Nitfol will look in <TT>`/usr/local/games/infocom'</TT> for game files.  Copies of nitfol named <TT>`strictnitfol'</TT> will report Z-machine strictness errors, perform strict tokenisation, and not automatically <CODE>@save_undo</CODE>.  All others will ignore strictness errors and have two aliases.  <TT>`xnitfol'</TT> will set the Tandy bit and branch on the piracy opcode.
241
242 </P>
243 <P>
244 Options specified in the preference file may be overruled by environment variables and command line options.
245
246 </P>
247
248
249
250 <H2><A NAME="SEC5" HREF="nitfol.html#TOC5">3.2  Infinite undo/redo</A></H2>
251
252 <P>
253 Multiple <CODE>@restore_undo</CODE> opcodes with no intervening <CODE>@save_undo</CODE> will restore earlier and earlier saved states.  However, Inform games will not do this, so if you want infinite undo, you must enter the commands <CODE>/undo</CODE> and <CODE>/redo</CODE>. The <CODE>/...</CODE> commands are part of the debugger, so you will need to compile in debugger support to use this feature.
254
255 </P>
256 <P>
257 Z-machine games prior to version 5 do not provide undo (none of them provide redo), and some version 5 games don't use it (like <CITE>Wishbringer</CITE>).  If the game performs two <CODE>@read</CODE> opcodes with no intervening <CODE>@save_undo</CODE> or <CODE>@restore_undo</CODE>, nitfol will perform a <CODE>@save_undo</CODE>.
258
259 </P>
260
261
262
263 <H2><A NAME="SEC6" HREF="nitfol.html#TOC6">3.3  Aliases</A></H2>
264
265 <P>
266 If the game has long words which you wish to abbreviate, you can use aliases.  Use the command <CODE>/alias <VAR>name</VAR> <VAR>value</VAR></CODE>.  All instances of <VAR>name</VAR> in line input will be replaced with <VAR>value</VAR>.  <VAR>name</VAR> may not contain whitespace.
267
268 </P>
269 <P>
270 Unlike abbreviation expansion and typo correction, alias expansion modifies the text buffer, inserting the requested text.  This is necessary to allow multiple commands to be given in an alias through the use of periods.
271
272 </P>
273 <P>
274 Aliases are not expanded recursively, so you could do something clever like this:
275
276 <PRE>
277 &#62;<KBD>/alias e w</KBD>
278 <KBD>/alias w e</KBD>
279 <KBD>/alias nw ne</KBD>
280 <KBD>/alias ne nw</KBD>
281 <KBD>/alias sw se</KBD>
282 <KBD>/alias se sw</KBD>
283 </PRE>
284
285 <P>
286 And your east-west movement will be swapped (<KBD>e</KBD> will do a <KBD>w</KBD>, though <KBD>east</KBD> will still do <KBD>east</KBD>).  Aliases expand on all input the game receives using <CODE>@read</CODE>, including transcripts and directions from the automapper.
287
288 </P>
289 <P>
290 If you want the expansion of the alias to be checked for further aliases, you must use the <CODE>/ralias</CODE> command.  This expansion is stopped when an alias would expand itself.
291
292 <PRE>
293 &#62;<KBD>/ralias e w</KBD>
294 <KBD>/ralias w e</KBD>
295 </PRE>
296
297 <P>
298 Would do nothing, as <KBD>e</KBD> is expanded to <KBD>w</KBD>, which is expanded to <KBD>e</KBD>, and then it stops because the rule for expanding <KBD>e</KBD> has already taken place.
299
300 </P>
301
302 <PRE>
303 &#62;<KBD>/ralias hanoi2 move src to extra. move src to dest. move extra to dest</KBD>
304 <KBD>/alias src left</KBD>
305 <KBD>/alias dest center</KBD>
306 <KBD>/alias extra right</KBD>
307 <KBD>hanoi2</KBD>
308 You move the small disc from the left peg to the right peg.
309 You move the medium disc from the left peg to the middle peg.
310 You move the small disc from the right peg to the middle peg.
311 &#62;move left to right
312 You move the large disc from the left peg to the right peg.
313 &#62;<KBD>/alias src center</KBD>
314 <KBD>/alias dest right</KBD>
315 <KBD>/alias extra left</KBD>
316 <KBD>hanoi2</KBD>
317 You move the small disc from the middle peg to the left peg.
318 You move the medium disc from the middle peg to the right peg.
319 You move the small disc from the left peg to the right peg.
320 </PRE>
321
322 <P>
323 Ideally you should be able to define an alias which recursively solves any depth by relying on lower levels being solvable, but this isn't yet possible.  You must keep the expansion of aliases to a reasonable size, since Inform has a fairly small buffer size.
324
325 </P>
326 <P>
327 You can remove aliases using the <CODE>/unalias</CODE> command.
328
329 <PRE>
330 &#62;<KBD>/unalias hanoi2</KBD>
331 </PRE>
332
333 <P>
334 Aliases do not effect <CODE>/...</CODE> commands; if they did, it wouldn't be possible to <CODE>/unalias</CODE>.
335
336 </P>
337
338
339
340 <H2><A NAME="SEC7" HREF="nitfol.html#TOC7">3.4  Abbreviation Expansion</A></H2>
341
342 <P>
343 Early Infocom games don't provide abbreviations like <KBD>x</KBD> for <KBD>examine</KBD>.  If you enable abbreviation expansion, nitfol will attempt to expand one letter words at the beginning of inputs which are not in the game's dictionary.
344
345 </P>
346 <P>
347 Nitfol supports the following expansions (note that some are non-standard):
348
349 </P>
350 <TABLE>
351
352 <TR>c <TD> close
353  <TD> d <TD> down
354  <TD> e <TD> east
355  <TD> g <TD> again
356 <BR>
357 <TR>i <TD> inventory
358  <TD> k <TD> attack
359  <TD> l <TD> look
360  <TD> n <TD> north
361 <BR>
362 <TR>o <TD> oops
363  <TD> p <TD> open
364  <TD> q <TD> quit
365  <TD> r <TD> drop
366 <BR>
367 <TR>s <TD> south
368  <TD> t <TD> take
369  <TD> u <TD> up
370  <TD> w <TD> west
371 <BR>
372 <TR>x <TD> examine
373  <TD> y <TD> yes
374  <TD> z <TD> wait
375 </TABLE>
376
377 From <CITE>Zork I</CITE>:
378
379 <PRE>
380 <STRONG>West of House</STRONG>
381 You are standing in an open field west of a white house, with a
382 boarded front door.
383 There is a small mailbox here.
384
385 &#62;<KBD>x mailbox</KBD>
386 [x -&#62; examine]
387 The small mailbox is closed.
388
389 &#62;<KBD>p it</KBD>
390 [p -&#62; open]
391 Opening the small mailbox reveals a leaflet.
392
393 &#62;<KBD>t leaflet</KBD>
394 [t -&#62; take]
395 Taken.
396 </PRE>
397
398
399
400 <H2><A NAME="SEC8" HREF="nitfol.html#TOC8">3.5  Typo correction</A></H2>
401
402 <P>
403 In the Z-machine, the <CODE>@read</CODE> opcode provides the interpreter with a dictionary to search in order to do tokenisation and word matching.  If you enable typo correction and enter a word not in the provided dictionary, nitfol will search for near misses.
404
405 </P>
406 <P>
407 From <CITE>Curses</CITE>:
408
409 <PRE>
410 &#62;<KBD>ask jemmia about gloves</KBD>
411 [jemmia -&#62; jemima]
412 "Those are my gloves."
413 </PRE>
414
415 <P>
416 Nitfol takes the following steps to correct typos:
417
418 </P>
419
420 <OL>
421 <LI>
422
423 If the entered word is in the dictionary, behave as normal.
424
425 <LI>
426
427 If the length of the word is less than 3 letters long, give up.  We don't want to make assumptions about what so short words might be.
428
429 <LI>
430
431 If the word is the same as a dictionary word with one transposition, assume it is that word.  <KBD>exmaine</KBD> becomes <KBD>examine</KBD>.
432
433 <LI>
434
435 If it is a dictionary word with one deleted letter, assume it is that word.  <KBD>botle</KBD> becomes <KBD>bottle</KBD>.
436
437 <LI>
438
439 If it is a dictionary word with one inserted letter, assume it is that word.  <KBD>tastey</KBD> becomes <KBD>tasty</KBD>.
440
441 <LI>
442
443 If it is a dictionary word with one substitution, assume it is that word.  <KBD>opin</KBD> becomes <KBD>open</KBD>.
444 </OL>
445
446 <P>
447 This behavior can be annoying when nitfol "corrects" intentionally entered words which are similar to dictionary words.  Usually this has no effect upon the game, perhaps slightly changing the game's error message, but may have negative effects when it causes an undesired action.  Games like <CITE>Beyond Zork</CITE> expect you to type words not in their dictionary to name things.  Nitfol might "correct" your entered word to a dictionary word, which the game might complain about.
448
449 </P>
450 <P>
451 If typo correction is getting in your way, run nitfol with <SAMP>`-no-smart'</SAMP>, compile it without applying <SAMP>`-DSMART_TOKENISER'</SAMP>, or edit <TT>`nitfol.opt'</TT> to change the compile-time default.
452
453 </P>
454
455
456
457 <H2><A NAME="SEC9" HREF="nitfol.html#TOC9">3.6  Automapping</A></H2>
458
459 <P>
460 Nitfol has the ability to display an on-screen map showing visited rooms and their connections on the current floor.  Below is a map generated from <CITE>Enchanter</CITE>.
461
462 <PRE>
463                                    *-* *
464                                    |   |
465                    u-*-*-*-*-------*---*
466                    |               |
467        * *   *     |     *---*     |
468        |/ \ /      |    /|\ / \    |
469        *   *       *   / | X * \   *
470       /     \      |  /  |/ v|  \  |
471      /   *   *-*-*-*-*---*---u---*-*-*-@
472     /    |  /      | |\  |\ ^|  /  |    
473  *-*     * *       | | \ | X * /   *-*
474     \    |/        | |  \|/ \ /    |  
475      *   *         * *   *---*     *
476       \ /          | |             |
477        *           u-d-*-----------*-u
478                                    |  
479                                    *
480                                     \
481                                      *
482 </PRE>
483
484 <P>
485 The <SAMP>`*'</SAMP>s designate rooms; the <SAMP>`@'</SAMP> the current room.  Rooms containing staircases are shown with a <SAMP>`u'</SAMP> or <SAMP>`d'</SAMP>, or <SAMP>`b'</SAMP> if the staircase is bi-directional.  If the current room contains a staircase, nitfol draws it with a <SAMP>`U'</SAMP>, <SAMP>`D'</SAMP>, or <SAMP>`B'</SAMP>.  Passageways are shown with lines; the <SAMP>`X'</SAMP>s are crossed lines.  One-way passages are shown as lines with arrows.  Nitfol uses <SAMP>`v'</SAMP>, <SAMP>`^'</SAMP>, <SAMP>`&#60;'</SAMP>, and <SAMP>`&#62;'</SAMP> for arrow heads.
486
487 </P>
488 <P>
489 In Glks which provide mouse events, you can click on rooms and it will display the room name (and number) in the upper left hand corner of the map.  Note that XGlk is slightly broken, so you need to click on the left-hand side of the room.  Clicking on an empty map space clears the name.
490
491 </P>
492 <P>
493 In order to use automapping, you must tell nitfol how to calculate the current location.  You do this by specifying an Inform expression, so you must have debugging enabled.
494
495 </P>
496 <P>
497 Typically the current location is available in a global.  In Z-code versions 3 and prior, the current location is always stored in global zero, so typing <KBD>/automap (global) 0</KBD> should work.  In later versions, you must figure out an expression which evaluates to the current location.
498
499 </P>
500 <P>
501 First, find out where the player object is.  Typically, the player object is named <SAMP>`self'</SAMP>, <SAMP>`cretin'</SAMP>, <SAMP>`self-object'</SAMP>, or the name of the PC.  You can use the <CODE>find</CODE> command to search object names.  If this all fails, try <CODE>object-tree</CODE> to find the location number.
502
503 </P>
504 <P>
505 Once you have found the number of the location, you need to figure out which global keeps track of the location.  You can use the <CODE>globals</CODE> command to search the globals.
506
507 </P>
508 <P>
509 From <CITE>Spider And Web</CITE>:
510
511 <PRE>
512 &#62;<KBD>/find self</KBD>
513 20 "(self object)"
514 25 "yourself" in 91 "End of Alley"
515 26 "yourself" in 48 "chair"
516 <KBD>/globals 91</KBD>
517 G15 G36 G39
518 <KBD>s</KBD>
519
520 <STRONG>Mouth of Alley</STRONG>
521 You're in the entrance of a narrow brick alley, which runs further
522 in to the north. To the south a broad street courses by, congested
523 with traffic and bicycles, although none of them seem to notice you.
524
525 &#62;<KBD>/find self</KBD>
526 20 "(self object)"
527 25 "yourself" in 94 "Mouth of Alley"
528 26 "yourself" in 48 "chair"
529 <KBD>/globals 94</KBD>
530 G15 G36 G39
531 <KBD>/automap (global) 15</KBD>
532 </PRE>
533
534 <P>
535 Obviously we have 3 globals tracking the player location.  Typically there are only two, but some games have more.  In this, we just picked the first one, which is probably the Inform <CODE>location</CODE> variable; another is probably the <CODE>real_location</CODE> variable.  Depending on how you want automapping to behave in the dark, or when dealing with game-specific stuff, you may want to pick a different one.
536
537 </P>
538 <P>
539 To figure out what is in which direction, nitfol checks the current location, tells the game to go north, checks the new location, undoes the north movement, tries to go northeast, and so on.  During all of this, output is disabled.
540
541 </P>
542 <P>
543 Drawing the map is more complicated.  First nitfol looks for cycles in the graph and makes the cycles connect properly.  Then it draws the map.  If parts of the map overlapp, it finds a path connecting the overlapping bits and tries increasing the length of each passage in this path by one, and recalculates cycle connections.  If this solves the problem, it's done; otherwise, it tries increasing the length of two passages, or of one of the passages by two.  If this fails, it gives up.
544
545 </P>
546 <P>
547 This technique isn't perfect.  The implementation of this technique isn't perfect either.  So expect nitfol to misbehave a lot on complex maps, and a little on simple maps.  If you clever ideas on how to improve it, let me know.
548
549 </P>
550 <P>
551 Nitfol makes an effort to simplify the map.  If multiple exits go from the barn to cornfield and you've been to both places, nitfol will draw a single two-way passage if possible.  If both up and west go up the stairs and nitfol knows east returns from the top of the stairs, nitfol will draw it as a simple west-east passage ignoring the up/down.  If east doesn't return from the top of the staircase, nitfol will draw it as up/down, leaving out the west passage.
552
553 </P>
554 <P>
555 If you've been north of a gate, and come up to the gate from the south,
556 and unlock the gate, nitfol will draw it as a one-way passage since last
557 time it was north of the gate, it couldn't go south.
558
559 </P>
560 <P>
561 Some games feature reincarnation, perhaps moving you to a new location.  If movement leads to your death, this makes nitfol think the reincarnation location is in that direction.  Nitfol watches for three asterisks in a row and will assume they mean death instead of a normal passage.
562
563 </P>
564 <P>
565 Some of these problems could be avoided by having nitfol explore each neighboring room, but this would make automapping even slower.
566
567 </P>
568
569
570
571 <H2><A NAME="SEC10" HREF="nitfol.html#TOC10">3.7  Quetzal</A></H2>
572
573 <P>
574 Nitfol uses Quetzal version 1.4 for its save format, so you can use your saves between different computers and interpreters.  More information about Quetzal is available at <A HREF="http://www.geocities.com/SiliconValley/Vista/6631/"><TT>http://www.geocities.com/SiliconValley/Vista/6631/</TT></A>.
575
576 </P>
577 <P>
578 If you specify a save-file on the command-line on UNIX, nitfol uses a <CODE>UNIX</CODE> <CODE>IntD</CODE> chunk to locate the game file associated with the save name.  This chunk is included in save games when nitfol can figure out the current filename.  If you compile nitfol with -D__USE_GNU, -D__USE_BSD, or -D__USE_XOPEN_EXTENDED, nitfol will canonicalize the file name, so you don't have to worry about relative file name specifications no longer working if you invoke nitfol from a different directory.
579
580 </P>
581 <P>
582 On MacOS, nitfol uses alias records from a <CODE>MACS</CODE> <CODE>IntD</CODE> chunk to locate the game file.  This won't work for games built-in to the interpreter.
583
584 </P>
585 <P>
586 If no <CODE>IntD</CODE> chunk is included, nitfol searches the environment variable <CODE>INFOCOM_PATH</CODE> for a game with matching release number, serial number, and checksum.
587
588 </P>
589 <P>
590 Looking for games without an <CODE>IntD</CODE> chunk isn't foolproof, but it should work most of the time.  Serial numbers are basically the date and it's extremely unlikely more than ten games will be compiled on the same day (the only time lots of games are compiled on same day is right before competition time).  Assuming they all have the same release number, there's still only a .0686% chance that at least two of these ten will share the same checksum.  If someone reports this as a problem, I'll make nitfol ensure the game contains a <CODE>save</CODE> opcode right before the restored PC.
591
592 </P>
593
594
595
596 <H2><A NAME="SEC11" HREF="nitfol.html#TOC11">3.8  Blorb</A></H2>
597
598 <P>
599 If you wish to hear sounds or see graphics in your games, they must be packaged in Blorb files.  The Z-machine game may included in the Blorb file or may be specified separately.  Nitfol does not support the traditional Infocom <TT>`.mg1'</TT> and <TT>`.snd'</TT> files.
600
601 </P>
602 <P>
603 Note that graphics are displayed incorrectly, and sound has not yet been tested.
604
605 </P>
606
607
608 <H1><A NAME="SEC12" HREF="nitfol.html#TOC12">4  Debugger</A></H1>
609
610 <P>
611 Nitfol debugging mode tries to imitate the GDB interface.  If you're familiar with that, you should have no problem using nitfol (other than dealing with the current incompleteness).
612
613 </P>
614 <P>
615 You need inform 6.21 or later, as earlier versions don't produce correct infix files without a patch.  You then need to compile infix information for your game.  I recommend doing:
616
617 </P>
618 <P>
619 <CODE>inform -k -~S -~X -~D <VAR>MyGame</VAR>.inf</CODE>
620
621 </P>
622 <P>
623 Then your debug information will be in <TT>`gameinfo.dbg'</TT>.  If you have a command-line on your platform, run nitfol like <CODE>nitfol <VAR>MyGame</VAR>.z5 -symbols gameinfo.dbg</CODE>.  Otherwise, start up your game and type <CODE>/symbol-file gameinfo.dbg</CODE> the first time you get a prompt.
624
625 </P>
626 <P>
627 When the game stops to read a line of text, you can begin that line with <KBD>/</KBD> to give a debug command.  If you want to pass a line beginning with a <KBD>/</KBD> to the game, double the <KBD>/</KBD> and the game will be passed the second one.  When at a <CODE>(nitfol) </CODE> prompt, starting commands with <KBD>/</KBD> is neither necessary nor recommended.
628
629 </P>
630 <P>
631 All expressions are like the ones used in Inform.
632
633 </P>
634 <P>
635 You can perform casts to get the result in the form you want:
636
637 </P>
638 <DL COMPACT>
639
640 <DT><CODE>(number) <VAR>expression</VAR></CODE>
641 <DD>
642 Use <VAR>expression</VAR> as if it were a number.  Useful when you want to know the number of something, not the object, routine, or string information nitfol normally gives.
643 <DT><CODE>(object) <VAR>expression</VAR></CODE>
644 <DD>
645 Use <VAR>expression</VAR> as if it were an object.  Most useful when printing the result, as it will show the object's attributes and properties.
646 <DT><CODE>(routine) <VAR>expression</VAR></CODE>
647 <DD>
648 Use <VAR>expression</VAR> as if it were the packed address of a routine.  Useful if you have the packed address of a routine which you want to set a breakpoint at.
649 <DT><CODE>(string) <VAR>expression</VAR></CODE>
650 <DD>
651 Use <VAR>expression</VAR> as if it were the packed address of a string.  Useful for printing it.
652 <DT><CODE>(global) <VAR>expression</VAR></CODE>
653 <DD>
654 Evaluates to the value of a numbered global.  <CODE>(global) 0</CODE> is the player location for version 3 Infocom games.
655 <DT><CODE>(local) <VAR>expression</VAR></CODE>
656 <DD>
657 Evaluates to the value of a numbered local.  Not terribly useful unless you're debugging something without source.
658 </DL>
659
660 <P>
661 Here are short descriptions of the debugger commands.  See Info file `gdb', node `Top', for more information.  Some of these were taken/adapted from GDB's help.
662
663 </P>
664 <DL COMPACT>
665
666 <DT><CODE>info breakpoints</CODE>
667 <DD>
668 <A NAME="IDX1"></A>
669 <DT><CODE>info breakpoints <VAR>num</VAR></CODE>
670 <DD>
671 <A NAME="IDX2"></A>
672 List breakpoints.  An argument specifies a specific breakpoint to list.
673
674 <DT><CODE>quit</CODE>
675 <DD>
676 <A NAME="IDX3"></A>
677 Exit nitfol.
678
679 <DT><CODE>show language</CODE>
680 <DD>
681 <A NAME="IDX4"></A>
682 Show the current source language.
683
684 <DT><CODE>condition <VAR>num</VAR> <VAR>exp</VAR></CODE>
685 <DD>
686 <A NAME="IDX5"></A>
687 Set a condition for an existing breakpoint.
688
689 <DT><CODE>restore</CODE>
690 <DD>
691 <A NAME="IDX6"></A>
692 Restore a saved game.
693
694 <DT><CODE>break <VAR>linespec</VAR></CODE>
695 <DD>
696 <A NAME="IDX7"></A>
697 <DT><CODE>break <VAR>linespec</VAR> if <VAR>exp</VAR></CODE>
698 <DD>
699 <A NAME="IDX8"></A>
700 Set a breakpoint.  An <CODE>if</CODE> clause specifies a condition.
701
702 <DT><CODE>stepi</CODE>
703 <DD>
704 <A NAME="IDX9"></A>
705 <DT><CODE>stepi <VAR>num</VAR></CODE>
706 <DD>
707 <A NAME="IDX10"></A>
708 Step exactly one instruction.  An argument specifies a repeat count.
709
710 <DT><CODE>restart</CODE>
711 <DD>
712 <A NAME="IDX11"></A>
713 Restart the game.
714
715 <DT><CODE>object-tree</CODE>
716 <DD>
717 <A NAME="IDX12"></A>
718 <DT><CODE>object-tree <VAR>exp</VAR></CODE>
719 <DD>
720 <A NAME="IDX13"></A>
721 Display the object tree.  An argument says which object to use as the root of the tree.
722
723 <DT><CODE>disable display <VAR>num</VAR></CODE>
724 <DD>
725 <A NAME="IDX14"></A>
726 Temporarily disable an automatic display.
727
728 <DT><CODE>select-frame <VAR>num</VAR></CODE>
729 <DD>
730 <A NAME="IDX15"></A>
731 Select a specific stack frame.
732
733 <DT><CODE>alias <VAR>name</VAR> <VAR>value</VAR></CODE>
734 <DD>
735 <A NAME="IDX16"></A>
736 Add an alias
737
738 <DT><CODE>down-silently</CODE>
739 <DD>
740 <A NAME="IDX17"></A>
741 <DT><CODE>down-silently <VAR>num</VAR></CODE>
742 <DD>
743 <A NAME="IDX18"></A>
744 Silently select the child of the selected frame.  An argument specifies how many frames down to go.
745
746 <DT><CODE>frame</CODE>
747 <DD>
748 <A NAME="IDX19"></A>
749 <DT><CODE>frame <VAR>num</VAR></CODE>
750 <DD>
751 <A NAME="IDX20"></A>
752 Show the selected stack frame.  An argument specifies a stack frame to show.
753
754 <DT><CODE>give <VAR>exp</VAR> <VAR>num</VAR></CODE>
755 <DD>
756 <A NAME="IDX21"></A>
757 <DT><CODE>give <VAR>exp</VAR> ~ <VAR>num</VAR></CODE>
758 <DD>
759 <A NAME="IDX22"></A>
760 Give an object an attribute.  With a tilde clears the attribute instead of setting it.
761
762 <DT><CODE>set <VAR>exp</VAR></CODE>
763 <DD>
764 <A NAME="IDX23"></A>
765 Evaluate an expression without printing its value.
766
767 <DT><CODE>print <VAR>exp</VAR></CODE>
768 <DD>
769 <A NAME="IDX24"></A>
770 Evaluates an expression and prints the result.  This can include function calls.
771
772 <DT><CODE>up</CODE>
773 <DD>
774 <A NAME="IDX25"></A>
775 <DT><CODE>up <VAR>num</VAR></CODE>
776 <DD>
777 <A NAME="IDX26"></A>
778 Select the parent of the selected frame.  An argument specifies how many frames up to go.
779
780 <DT><CODE>#  comment</CODE>
781 <DD>
782 <A NAME="IDX27"></A>
783 Enter a comment
784
785 <DT><CODE>continue</CODE>
786 <DD>
787 <A NAME="IDX28"></A>
788 <DT><CODE>continue <VAR>num</VAR></CODE>
789 <DD>
790 <A NAME="IDX29"></A>
791 Continue execution.  An argument sets the ignore count of the current breakpoint.
792
793 <DT><CODE>dumpmem <VAR>file</VAR></CODE>
794 <DD>
795 <A NAME="IDX30"></A>
796 Dump memory to a file
797
798 <DT><CODE>undo</CODE>
799 <DD>
800 <A NAME="IDX31"></A>
801 Undo last move (not last debugger command).
802
803 <DT><CODE>display <VAR>exp</VAR></CODE>
804 <DD>
805 <A NAME="IDX32"></A>
806 Print value of an expression each time the program stops.
807
808 <DT><CODE>move <VAR>exp</VAR> to <VAR>exp</VAR></CODE>
809 <DD>
810 <A NAME="IDX33"></A>
811 Move an object around the object tree.
812
813 <DT><CODE>up-silently</CODE>
814 <DD>
815 <A NAME="IDX34"></A>
816 <DT><CODE>up-silently <VAR>num</VAR></CODE>
817 <DD>
818 <A NAME="IDX35"></A>
819 Select the parent of the selected frame silently.  An argument specifies how many frames up to go.
820
821 <DT><CODE>show copying</CODE>
822 <DD>
823 <A NAME="IDX36"></A>
824 Show licensing information.
825
826 <DT><CODE>recording off</CODE>
827 <DD>
828 <A NAME="IDX37"></A>
829 Stop recording a script.
830
831 <DT><CODE>jump <VAR>linespec</VAR></CODE>
832 <DD>
833 <A NAME="IDX38"></A>
834 Continue execution at a new location.
835
836 <DT><CODE>recording on</CODE>
837 <DD>
838 <A NAME="IDX39"></A>
839 Start recording a script.
840
841 <DT><CODE>ralias <VAR>name</VAR> <VAR>value</VAR></CODE>
842 <DD>
843 <A NAME="IDX40"></A>
844 Add a recursive alias
845
846 <DT><CODE>globals</CODE>
847 <DD>
848 <A NAME="IDX41"></A>
849 <DT><CODE>globals <VAR>exp</VAR></CODE>
850 <DD>
851 <A NAME="IDX42"></A>
852 List all global variables and their values.  With an argument, list all only those with a specific value.
853
854 <DT><CODE>backtrace</CODE>
855 <DD>
856 <A NAME="IDX43"></A>
857 <DT><CODE>backtrace <VAR>num</VAR></CODE>
858 <DD>
859 <A NAME="IDX44"></A>
860 <DT><CODE>backtrace - <VAR>num</VAR></CODE>
861 <DD>
862 <A NAME="IDX45"></A>
863 Display the parent functions of the current frame.  An argument specifies how many frames back to show.  If the argument is negative, start from the first frame instead of the current.
864
865 <DT><CODE>find</CODE>
866 <DD>
867 <A NAME="IDX46"></A>
868 Find objects whose shortnames contain a string.
869
870 <DT><CODE>finish</CODE>
871 <DD>
872 <A NAME="IDX47"></A>
873 An argument specifies a repeat count.
874
875 <DT><CODE>down</CODE>
876 <DD>
877 <A NAME="IDX48"></A>
878 <DT><CODE>down <VAR>num</VAR></CODE>
879 <DD>
880 <A NAME="IDX49"></A>
881 Select the child of the selected frame.  An argument specifies how many frames down to go.
882
883 <DT><CODE>ignore <VAR>num</VAR> <VAR>num</VAR></CODE>
884 <DD>
885 <A NAME="IDX50"></A>
886 Set the ignore count for a breakpoint.
887
888 <DT><CODE>replay off</CODE>
889 <DD>
890 <A NAME="IDX51"></A>
891 Halt replay.
892
893 <DT><CODE>nexti</CODE>
894 <DD>
895 <A NAME="IDX52"></A>
896 <DT><CODE>nexti <VAR>num</VAR></CODE>
897 <DD>
898 <A NAME="IDX53"></A>
899 Step one instruction, stepping over subroutine calls.  Step a specified number of instructions, stepping over subroutine calls.
900
901 <DT><CODE>help</CODE>
902 <DD>
903 <A NAME="IDX54"></A>
904 Print list of commands.
905
906 <DT><CODE>redo</CODE>
907 <DD>
908 <A NAME="IDX55"></A>
909 Redo undid move.  Only works immediately after an <CODE>undo</CODE>.
910
911 <DT><CODE>enable <VAR>num</VAR></CODE>
912 <DD>
913 <A NAME="IDX56"></A>
914 Re-enabled a breakpoint.
915
916 <DT><CODE>until</CODE>
917 <DD>
918 <A NAME="IDX57"></A>
919 Resume execution until the program reaches a line number greater than the current line.
920
921 <DT><CODE>replay</CODE>
922 <DD>
923 <A NAME="IDX58"></A>
924 Replay a recorded script.
925
926 <DT><CODE>unalias <VAR>name</VAR></CODE>
927 <DD>
928 <A NAME="IDX59"></A>
929 Remove an alias
930
931 <DT><CODE>remove <VAR>exp</VAR></CODE>
932 <DD>
933 <A NAME="IDX60"></A>
934 Remove an object from the object tree.
935
936 <DT><CODE>info sources</CODE>
937 <DD>
938 <A NAME="IDX61"></A>
939 List source files.
940
941 <DT><CODE>delete <VAR>num</VAR></CODE>
942 <DD>
943 <A NAME="IDX62"></A>
944 Delete a breakpoint.
945
946 <DT><CODE>symbol-file <VAR>file</VAR></CODE>
947 <DD>
948 <A NAME="IDX63"></A>
949 Load debugging info from a file (usually <TT>`gameinfo.dbg'</TT>).
950
951 <DT><CODE>automap <VAR>exp</VAR></CODE>
952 <DD>
953 <A NAME="IDX64"></A>
954 Start automapping
955
956 <DT><CODE>show warranty</CODE>
957 <DD>
958 <A NAME="IDX65"></A>
959 Show warranty information.
960
961 <DT><CODE>disable <VAR>num</VAR></CODE>
962 <DD>
963 <A NAME="IDX66"></A>
964 Temporarily disable a breakpoint.
965
966 <DT><CODE>undisplay <VAR>num</VAR></CODE>
967 <DD>
968 <A NAME="IDX67"></A>
969 Stop automatically displaying an expression.
970
971 <DT><CODE>enable display <VAR>num</VAR></CODE>
972 <DD>
973 <A NAME="IDX68"></A>
974 Re-enable an automatic display.
975
976 <DT><CODE>step</CODE>
977 <DD>
978 <A NAME="IDX69"></A>
979 <DT><CODE>step <VAR>num</VAR></CODE>
980 <DD>
981 <A NAME="IDX70"></A>
982 Step through program to a different source line.  An argument specifies a repeat count.
983
984 <DT><CODE>info source</CODE>
985 <DD>
986 <A NAME="IDX71"></A>
987 Get information on the current source file.
988
989 <DT><CODE>next</CODE>
990 <DD>
991 <A NAME="IDX72"></A>
992 <DT><CODE>next <VAR>num</VAR></CODE>
993 <DD>
994 <A NAME="IDX73"></A>
995 Step through program, stepping over subroutine calls.  An argument specifies a repeat count.
996
997 </DL>
998
999 <P>
1000 If you're on a UNIX and you don't like the GDB interface, you can compile cheapnitfol and run it as the inferior debugger under Emacs or DDD.  You can also try compiling <CODE>xnitfol</CODE> with <SAMP>`-DSTDOUT_DEBUG'</SAMP> and trying that, but I haven't tested that much.
1001
1002 </P>
1003 <P>
1004 <CODE>ddd <VAR>MyGame</VAR>.z5 --debugger cheapnitfol -s gameinfo.dbg -prompt "(gdb) "</CODE>
1005
1006 </P>
1007
1008
1009 <H1><A NAME="SEC13" HREF="nitfol.html#TOC13">5  Bugs</A></H1>
1010
1011 <P>
1012 A nitfol bug is any behaviour which makes nitfol reliably misbehave, with the exceptions of bugs in Glk libraries.  These include: anything which makes nitfol crash (other than when nitfol reports <SAMP>`FATAL'</SAMP> errors), anything which causes nitfol to contradict the Z-machine standards documents (except for optional enhancements like spelling correction and debug mode), any buffer overflows, and anything which makes nitfol infinite loop other than infinite loops in the game itself.
1013
1014 </P>
1015 <P>
1016 Before reporting a bug, make sure the bug is not listed below and your copy of nitfol is not compiled with <SAMP>`-DFAST'</SAMP>.  Please report the version of nitfol, your system type and a series of commands which reliably cause the bug.
1017
1018 </P>
1019 <P>
1020 Nitfol is lacking:
1021
1022 <UL>
1023 <LI>Graphical font (<CITE>Beyond Zork</CITE>)  (should use images for this)
1024
1025 <LI>Terminating character support (mostly <CITE>Beyond Zork</CITE>)
1026
1027 <LI>Reverse video, full color (should querry Glk more aggressively)
1028
1029 <LI>Unicode support
1030
1031 <LI>keypad character codes
1032
1033 <LI>its own random number generator (relies on system one)
1034
1035 </UL>
1036
1037 <P>
1038 Nitfol does incorrectly:
1039
1040 <UL>
1041 <LI>Play is not paused to wait for sounds to complete in <CITE>The Lurking Horror</CITE>.
1042
1043 <LI>Pictures and text are not placed correctly for v6 games.
1044
1045 <LI>block quotes are placed in the upper window, so <CODE>cheapnitfol</CODE> can't see them.
1046
1047 <LI>Corrupted save files may make nitfol do bad things.
1048
1049 <LI>Should figure out a way to handle buggy games like <CITE>AMFV</CITE> and <CITE>Varicella</CITE> which assume the upper window is 80 columns wide.
1050
1051 <LI>Doesn't catch header writing other than <CODE>@storeb</CODE> and <CODE>@storew</CODE>.
1052
1053 </UL>
1054
1055 <P>
1056 Debugger problems:
1057
1058 <UL>
1059 <LI>Sometimes says there's no code at a location where it could be clever and
1060
1061   find some.
1062 <LI><CODE>ofclass</CODE>, superclass not implemented.
1063
1064 <LI>Should perform more sanity checks everywhere.
1065
1066 <LI>Lots of useful commands not yet implemented.
1067
1068 <LI><VAR>object</VAR>.<VAR>function</VAR> is handled incorrectly, both for assignments and calls.
1069
1070 <LI>Assumes you know what you're doing, so <CODE>quit</CODE>, <CODE>run</CODE>, etc., don't prompt you for confirmation.
1071
1072 </UL>
1073
1074 <P>
1075 Automapping problems:
1076
1077 <UL>
1078 <LI>Doesn't work well for random destinations (the forest in <CITE>Advent</CITE>)
1079
1080 <LI><CODE>@get_cursor</CODE> doesn't return the correct value during automapping since output is disabled.
1081
1082 <LI>Requires too much work for the end-user; should put in stuff to make it figure out the location global in 95% of games.
1083
1084 <LI>Doesn't really work if multiple locations are coded as being in the same room (long road in <CITE>Enchanter</CITE>).
1085
1086 <LI>Doesn't show exits which go nowhere, but change the game.
1087
1088 <LI>Perhaps should use graphics windows when available.
1089
1090 <LI>Movement causing teleportation confuses it.
1091
1092 <LI>Reincarnation handling isn't optimal.
1093
1094 <LI>Still very buggy.
1095
1096 <LI>It's too slow.
1097
1098 <LI>Should realize it can add extra bends (especially in one-way passages).
1099
1100 <LI>Should be able to output nice-looking Postscript.
1101
1102 <LI>Should store map in saved games (wait until automapping code stabilizes).
1103
1104 </UL>
1105
1106
1107
1108 <H1><A NAME="SEC14" HREF="nitfol.html#TOC14">6  Thanks</A></H1>
1109
1110 <P>
1111 The following people have given comments, suggestions, bug reports, answered questions, or helped port nitfol (in alphabetical order):
1112
1113 <UL>
1114 <LI>John Cater
1115
1116 <LI>Paul David Doherty
1117
1118 <LI>Martin Frost
1119
1120 <LI>Doug Jones
1121
1122 <LI>David Picton
1123
1124 <LI>Andrew Plotkin
1125
1126 <LI>Andrew Pontious
1127
1128 <LI>L. Ross Raszewski
1129
1130 <LI>Dan Shiovitz
1131
1132 </UL>
1133
1134
1135
1136 <H1><A NAME="SEC15" HREF="nitfol.html#TOC15">7  Games Cited</A></H1>
1137
1138 <P>
1139 <CITE>Wishbringer</CITE> Copyright &#169; 1985, 1988 Infocom Inc.
1140
1141 </P>
1142 <P>
1143 <BR>
1144 <CITE>Zork I</CITE> Copyright &#169; 1981-1986 Infocom Inc.
1145
1146 </P>
1147 <P>
1148 <BR>
1149 <CITE>Curses</CITE> Copyright &#169; 1993-1994 Graham Nelson.
1150
1151 </P>
1152 <P>
1153 <A HREF="http://ifarchive.org/if-archive/games/zcode/curses.z5"><TT>http://ifarchive.org/if-archive/games/zcode/curses.z5</TT></A>
1154
1155 </P>
1156 <P>
1157 <BR>
1158 <CITE>Beyond Zork</CITE> Copyright &#169; 1987 Infocom Inc.
1159
1160 </P>
1161 <P>
1162 <BR>
1163 <CITE>Enchanter</CITE> Copyright &#169; 1983, 1984, 1986 Infocom Inc.
1164
1165 </P>
1166 <P>
1167 <BR>
1168 <CITE>Varicella</CITE> by Adam Cadre 1999.
1169
1170 </P>
1171 <P>
1172 <A HREF="http://adamcadre.ac/content/vgame.z8"><TT>http://adamcadre.ac/content/vgame.z8</TT></A>
1173
1174 </P>
1175 <P>
1176 <BR>
1177 <CITE>Spider And Web</CITE> Copyright &#169; 1997-1998 Andrew Plotkin.
1178
1179 </P>
1180 <P>
1181 <A HREF="http://ifarchive.org/if-archive/games/zcode/Tangle.z5"><TT>http://ifarchive.org/if-archive/games/zcode/Tangle.z5</TT></A>
1182
1183 </P>
1184 <P><HR><P>
1185 This document was generated on 24 October 1999 using the
1186 <A HREF="http://wwwcn.cern.ch/dci/texi2html/">texi2html</A>
1187 translator version 1.54.</P>
1188 </BODY>
1189 </HTML>