1
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
4
<title>DM4 §A3: Library routines</title>
5
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
6
<link rel="stylesheet" type="text/css" href="dm4.css">
10
<a href="index.html">home</a> /
11
<a href="contents.html">contents</a> /
12
<a href="app.html">appendices</a> /
13
<a href="sa2.html" title="§A2: Library properties">prev</a> /
14
<a href="sa4.html" title="§A4: Library message numbers">next</a> /
15
<a href="dm4index.html">index</a>
18
<a id="p429" name="p429"></a>
19
<h2>§A3 Library routines</h2>
21
<p class="normal">The Inform library files contain about three hundred
22
routines, almost all of which are “private” in the sense
23
that they are difficult for designers to use, not useful anyway, and
24
subject to change without notice as the library is maintained and
25
rewritten. The routines in this appendix are those which are “open
26
to the public”. Designers are encouraged to make use of them.</p>
28
<p class="lynxonly"></p>
30
<tr class="r1"><td class="c1"><code>Achieved(tasknum)</code> </td>
31
<td class="c2"><i>see</i> <a href="s22.html">§22</a></td></tr>
33
<p class="normal">Signals to the library that task number <code>tasknum</code>
34
has been achieved, so that points may be awarded if it has not been
36
<i>No return value</i></p>
38
<p class="lynxonly"></p>
40
<tr class="r1"><td class="c1"><code>AfterRoutines()</code> </td>
41
<td class="c2"><i>see</i> <a href="s6.html">§6</a></td></tr>
43
<p class="normal">This should be called in the action routine, such
44
as <code>TakeSub</code>, of a group 2 action, such as <code>Take</code>,
45
once the action has taken place but before anything is printed. It
46
runs through the <code>after</code> rules as laid out in
47
<a href="s6.html">§6</a>.<br>
48
<i>Routine returns</i> <code>true</code> if
49
the action has been interrupted by some other rule, <code>false</code>
52
<p class="lynxonly"></p>
54
<tr class="r1"><td class="c1"><code>AllowPushDir()</code> </td>
55
<td class="c2"><i>see</i> <a href="s15.html">§15</a></td></tr>
57
<p class="normal">Used only inside the <code>before</code> rule for a
58
<code>PushDir</code> action, this routine signals to the library that
59
the attempt to push an object from one place to another should be allowed.<br>
60
<i>No return value</i></p>
62
<p class="lynxonly"></p>
64
<tr class="r1"><td class="c1"><code>Banner()</code> </td>
65
<td class="c2"><i>see</i> <a href="s21.html">§21</a></td></tr>
67
<p class="normal">Prints the game banner. Normally unnecessary, but
68
should be used soon after if your game suppresses the banner at the
69
<code>Initialise</code> stage.<br>
70
<i>No return value</i></p>
72
<p class="lynxonly"></p>
74
<tr class="r1"><td class="c1"><code>ChangePlayer(obj,flag)</code> </td>
75
<td class="c2"><i>see</i> <a href="s21.html">§21</a></td></tr>
77
<p class="normal">Cause the player at the keyboard to play as the given
78
object <code>obj</code>, which must provide a <code>number</code>
79
property. If the <code>flag</code> is <code>true</code>, then subsequently print
80
messages like “(as Ford Prefect)” in room description
81
headers. This routine, however, prints nothing itself.<br>
82
<i>No return value</i></p>
84
<p class="lynxonly"></p>
86
<tr class="r1"><td class="c1"><code>CommonAncestor(obj1,obj2)</code> </td>
87
<td class="c2"><i>see</i> <a href="s3.html">§3</a></td></tr>
89
<p class="normal">A routine used internally by the library when working
90
out visibilities, and which might as well be available for public use.
91
Returns the nearest object in the object tree which (directly or
92
indirectly) contains both <code>obj1</code> and <code>obj2</code>, or
93
else returns <code>nothing</code> if no such object exists. For
94
instance if Bedquilt contains bottle and the player is carrying a lamp,
95
the common ancestor of lamp and bottle is Bedquilt.<br>
96
<i>Routine returns</i> The common ancestor or
97
<code>nothing</code>.</p>
99
<p class="lynxonly"></p>
100
<a id="p430" name="p430"></a>
102
<tr class="r1"><td class="c1"><code>DictionaryLookup(word,length)</code> </td>
103
<td class="c2"><i>see</i> <a href="s34.html">§34</a></td></tr>
105
<p class="normal">Takes the word stored character by character in the
106
array <code>word->0</code>, <code>word->1</code>, …,
107
<code>word->(length-1)</code> and looks it up in the story file's
109
<i>Routine returns</i> The dictionary value
110
(e.g., <code>'t'</code>, <code>'a'</code>, <code>'k'</code>,
111
<code>'e'</code> will return <code>'take'</code>) or zero if the word
112
isn't in the dictionary.</p>
114
<p class="lynxonly"></p>
116
<tr class="r1"><td class="c1"><code>GetGNAOfObject(obj)</code> </td>
117
<td class="c2"><i>see</i> <a href="s37.html">§37</a></td></tr>
119
<p class="normal">Determines the gender-number-animation of the short
120
name of the given object <code>obj</code>.<br>
121
<i>Routine returns</i> The GNA, which is
122
a number between 0 and 11: see table of GNA values in
123
<a href="s34.html">§34</a>.</p>
125
<p class="lynxonly"></p>
127
<tr class="r1"><td class="c1"><code>HasLightSource(obj)</code> </td>
128
<td class="c2"><i>see</i> <a href="s19.html">§19</a></td></tr>
130
<p class="normal">Determines whether or not <code>obj</code> “has light”,
131
i.e., casts light outward to objects containing <code>obj</code>: see
132
<a href="s19.html">§19</a> for a more exact definition.<br>
133
<i>Routine returns</i> <code>true</code>
134
or <code>false</code>.</p>
136
<p class="lynxonly"></p>
138
<tr class="r1"><td class="c1"><code>IndirectlyContains(obj1,obj2)</code> </td>
139
<td class="c2"><i>see</i> <a href="s3.html">§3</a></td></tr>
141
<p class="normal">The condition <code>obj2 in obj1</code> only tests whether
142
<code>obj2</code> is directly contained in <code>obj1</code>, so
143
that <code>lamp in player</code> would fail if the lamp were in a
144
rucksack carried by the player. <code>IndirectlyContains(player,lamp)</code>
145
would return <code>true</code>. Formally, the test is whether
146
<code>obj2</code> is a child of <code>obj1</code>, or is a child of
147
a child of <code>obj1</code>, or … and so on. See also the
148
library routine <code>CommonAncestor</code> above.<br>
149
<i>Routine returns</i> <code>true</code> or
150
<code>false</code>.</p>
152
<p class="lynxonly"></p>
154
<tr class="r1"><td class="c1"><code>IsSeeThrough(obj)</code> </td>
155
<td class="c2"><i>see</i> <a href="s19.html">§19</a></td></tr>
157
<p class="normal">Determines whether or not <code>obj</code> “is
158
see-through”, i.e., allows light to pass through it. An object is
159
see-through if it has <code>transparent</code>, or <code>supporter</code>,
160
or <code>enterable</code> (unless it is also a closed <code>container</code>).<br>
161
<i>Routine returns</i> <code>true</code>
162
or <code>false</code>.</p>
164
<p class="lynxonly"></p>
166
<tr class="r1"><td class="c1"><code>Locale(obj,tx1,tx2)</code> </td>
167
<td class="c2"><i>see</i> <a href="s26.html">§26</a></td></tr>
169
<p class="normal">Prints out the paragraphs of room description which
170
would appear if <code>obj</code> were the room: i.e., prints out
171
descriptions of objects in <code>obj</code> according to the usual rules.
172
After describing the objects which have their own paragraphs, a list
173
is given of the remaining ones. The string <code>tx1</code> is printed
174
if there were no previous paragraphs, and the string <code>tx2</code>
175
otherwise. (For instance, you might want “On the ledge you can
176
see” and “On the ledge you can also see”.) After
177
the list, nothing else is printed, not even a full stop.<br>
178
<i>Routine returns</i> The number of objects
179
printed in the list, possibly zero.</p>
181
<p class="lynxonly"></p>
182
<a id="p431" name="p431"></a>
184
<tr class="r1"><td class="c1"><code>LoopOverScope(R,actor)</code> </td>
185
<td class="c2"><i>see</i> <a href="s32.html">§32</a></td></tr>
187
<p class="normal">Calls routine <code>R(obj)</code> for each object
188
<code>obj</code> in scope for the given <code>actor</code>. If no
189
<code>actor</code> is given, the actor is assumed to be the player.<br>
190
<i>No return value</i></p>
192
<p class="lynxonly"></p>
194
<tr class="r1"><td class="c1"><code>LTI_Insert(position,character)</code> </td>
195
<td class="c2"><i>see</i> <a href="s36.html">§36</a></td></tr>
197
<p class="normal">Inserts the given <code>character</code> at the given
198
<code>position</code> in the standard library array <code>buffer</code>
199
used to hold the text typed by the player, moving subsequent text along
200
to make room. (This is protected against overflowing the buffer.)<br>
201
<i>No return value</i></p>
203
<p class="lynxonly"></p>
205
<tr class="r1"><td class="c1"><code>MoveFloatingObjects()</code> </td>
206
<td class="c2"><i>see</i> <a href="s8.html">§8</a></td></tr>
208
<p class="normal">“Floating objects” is Inform library jargon
209
for “objects which use <code>found_in</code> to be present in
210
several locations at once”. This routine adjusts the positions
211
of objects across the whole game, ensuring that they are consistent
212
with the current states of the property <code>found_in</code> and
213
the attribute <code>absent</code>, and should be called after any
214
game event which has changed these states.<br>
215
<i>No return value</i></p>
217
<p class="lynxonly"></p>
219
<tr class="r1"><td class="c1"><code>NextWord()</code> </td>
220
<td class="c2"><i>see</i> <a href="s28.html">§28</a></td></tr>
222
<p class="normal">Finds the next dictionary word in the player's input,
223
that is, the word at position <code>wn</code> in the input, moving the
224
word number <code>wn</code> on by one. (The first word is at position 1.)<br>
225
<i>Routine returns</i> The dictionary value,
226
or 0 if the word is not in the dictionary or if the word stream has
227
run out, or the constant <code>THEN1__WD</code> if the “word”
228
was a full stop, or the constant <code>COMMA_WORD</code> if it was
231
<p class="lynxonly"></p>
233
<tr class="r1"><td class="c1"><code>NextWordStopped()</code> </td>
234
<td class="c2"><i>see</i> <a href="s28.html">§28</a></td></tr>
236
<p class="normal">Finds the next dictionary word in the player's input,
237
that is, the word at position <code>wn</code> in the input, moving
238
the word number <code>wn</code> on by one. (The first word is at position 1.)<br>
239
<i>Routine returns</i> The dictionary value,
240
or 0 if the word is not in the dictionary, or the constant <code>THEN1__WD</code>
241
if the “word” was a full stop, or the constant <code>COMMA_WORD</code>
242
if it was a comma, or −1 if the word stream has run out.</p>
244
<p class="lynxonly"></p>
246
<tr class="r1"><td class="c1"><code>NounDomain(o1,o2,type)</code></td>
248
<p class="normal">This routine is one of the keystones of the parser,
249
but see also <code>ParseToken</code> below: the objects given are the
250
domains to search through when parsing, almost always the location
251
and the actor, and the <code>type</code> indicates a token. The only
252
tokens safely usable are: <code>NOUN_TOKEN</code>, for
253
<span class="grammartoken"><code>noun</code></span>, <code>HELD_TOKEN</code>,
254
for <span class="grammartoken"><code>held</code></span> and <code>CREATURE_TOKEN</code>,
255
for <span class="grammartoken"><code>creature</code></span>. The routine
256
parses the best single object name it can from the current position of
258
<i>Routine returns</i> <code>nothing</code>
259
for “no match”, or the object matched for a success, or
260
the constant <code>REPARSE_CODE</code> to indicate that it had to ask
261
a clarifying question: this
262
<a id="p432" name="p432"></a>
263
reconstructed the input drastically and
264
the parser must begin all over again. <code>NounDomain</code> should
265
only be used by general parsing routines and these should always return
266
<code>GPR_REPARSE</code> if <code>NounDomain</code> returned
267
<code>REPARSE_CODE</code>, thus passing the buck upwards.</p>
269
<p class="lynxonly"></p>
271
<tr class="r1"><td class="c1"><code>ObjectIsUntouchable(obj,flag)</code> </td>
272
<td class="c2"><i>see</i> <a href="s32.html">§32</a></td></tr>
274
<p class="normal">Determines whether any solid barrier, that is, any
275
<code>container</code> that is not <code>open</code>, lies between
276
the player and <code>obj</code>. If <code>flag</code> is <code>true</code>,
277
this routine never prints anything; otherwise it prints a message like
278
“You can't, because … is in the way.” if any barrier
280
<i>Routine returns</i> <code>true</code> if
281
a barrier is found, <code>false</code> if not.</p>
283
<p class="lynxonly"></p>
285
<tr class="r1"><td class="c1"><code>OffersLight(obj)</code> </td>
286
<td class="c2"><i>see</i> <a href="s19.html">§19</a></td></tr>
288
<p class="normal">Determines whether or not <code>obj</code> “offers
289
light”, i.e., contains light so that its contents are visible
290
to each other: see <a href="s19.html">§19</a> for a more exact
292
<i>Routine returns</i> <code>true</code> or <code>false</code>.</p>
294
<p class="lynxonly"></p>
296
<tr class="r1"><td class="c1"><code>ParseToken(tokentype,tokendata)</code> </td>
297
<td class="c2"><i>see</i> <a href="s31.html">§31</a></td></tr>
299
<p class="normal">This is the library's own “general parsing routine”,
300
and parses the word stream against the specified token. Because some
301
of these tokens require too much setting-up work to parse, and anyway
302
are not very useful, only two token types are open to the public. If
303
<code>tokentype</code> is <code>ELEMENTARY_TT</code>, then <code>tokendata</code>
304
must have one of the following values: <code>NOUN_TOKEN</code>,
305
<code>HELD_TOKEN</code>, <code>MULTI_TOKEN</code>, <code>MULTIHELD_TOKEN</code>,
306
<code>MULTIEXCEPT_TOKEN</code>, <code>MULTIINSIDE_TOKEN</code>,
307
<code>CREATURE_TOKEN</code> and <code>NUMBER_TOKEN</code>. Alternatively,
308
<code>tokentype</code> can be <code>SCOPE_TT</code> and <code>tokendata</code>
309
must then be a “scope routine”.<br>
310
<i>Routine returns</i> <code>GPR_FAIL</code> if
311
parsing fails; <code>GPR_PREPOSITION</code> if a match is made but results
312
in no data; <code>GPR_NUMBER</code> if a match is made, resulting in
313
a number; <code>GPR_MULTIPLE</code> if a match is made, resulting in
314
a multiple object; <code>GPR_REPARSE</code> if the parser has had to
315
rewrite the text being parsed and would now like parsing to begin again
316
from scratch; otherwise, an object which the parser has matched against
319
<p class="lynxonly"></p>
321
<tr class="r1"><td class="c1"><code>PlaceInScope(obj)</code> </td>
322
<td class="c2"><i>see</i> <a href="s32.html">§32</a></td></tr>
324
<p class="normal">Used in “scope routines” (only) when
325
<code>scope_stage</code> is set to 2 (only). Places <code>obj</code> in
326
scope for the token currently being parsed. No other objects are placed
327
in scope as a result of this, unlike the case of <code>ScopeWithin</code>.<br>
328
<i>No return value</i></p>
330
<p class="lynxonly"></p>
332
<tr class="r1"><td class="c1"><code>PlayerTo(obj,flag)</code> </td>
333
<td class="c2"><i>see</i> <a href="s21.html">§21</a></td></tr>
335
<p class="normal">Moves the player to <code>obj</code>, which can either
336
be a location or something <code>enterable</code>. If <code>flag</code>
337
is <code>false</code>, then run a <code>Look</code> action to print
338
out a room description: but if <code>flag</code> is <code>true</code>,
339
print nothing, and if <code>flag</code> is 2, print a room description
340
but abbreviate it if the room has been visited before.<br>
341
<i>No return value</i></p>
343
<p class="lynxonly"></p>
344
<a id="p433" name="p433"></a>
346
<tr class="r1"><td class="c1"><code>PronounNotice(obj)</code> </td>
347
<td class="c2"><i>see</i> <a href="s33.html">§33</a></td></tr>
349
<p class="normal">Resets the pronouns to the object <code>obj</code>.
350
This means that all pronouns which can match against the object are
351
set equal to it: for instance, “Aunt Jemima” would match
352
<code>'her'</code> but not <code>'it'</code>, “the grapes”
353
would match <code>'them'</code> and so on.<br>
354
<i>No return value</i></p>
356
<p class="lynxonly"></p>
358
<tr class="r1"><td class="c1"><code>PronounValue(pronoun)</code> </td>
359
<td class="c2"><i>see</i> <a href="s33.html">§33</a></td></tr>
361
<p class="normal">Finds the current setting of <code>pronoun</code>, which
362
has to be the dictionary value of a legal pronoun in the current language:
363
in the case of English, that means <code>'it'</code>, <code>'him'</code>,
364
<code>'her'</code> or <code>'them'</code>.<br>
365
<i>Routine returns</i> The setting, or
366
<code>nothing</code> if it is unset.</p>
368
<p class="lynxonly"></p>
370
<tr class="r1"><td class="c1"><code>ScopeWithin(obj)</code> </td>
371
<td class="c2"><i>see</i> <a href="s32.html">§32</a></td></tr>
373
<p class="normal">Used in “scope routines” (only) when
374
<code>scope_stage</code> is set to 2 (only). Places the contents
375
of <code>obj</code> in scope for the token currently being parsed,
376
and applies the rules of scope recursively so that contents of see-through
377
objects are also in scope, as is anything added to scope.<br>
378
<i>No return value</i></p>
380
<p class="lynxonly"></p>
382
<tr class="r1"><td class="c1"><code>SetPronoun(pronoun,obj)</code> </td>
383
<td class="c2"><i>see</i> <a href="s33.html">§33</a></td></tr>
385
<p class="normal">Changes the current setting of <code>pronoun</code>,
386
which has to be the dictionary value of a legal pronoun in the current
387
language: in the case of English, that means <code>'it'</code>,
388
<code>'him'</code>, <code>'her'</code> or <code>'them'</code>.<br>
389
<i>No return value</i></p>
391
<p class="lynxonly"></p>
393
<tr class="r1"><td class="c1"><code>SetTime(time,rate)</code> </td>
394
<td class="c2"><i>see</i> <a href="s20.html">§20</a></td></tr>
396
<p class="normal">Set the game clock (a 24-hour clock) to the given
397
<code>time</code> (in seconds since the start of the day), to run
398
at the given rate <i>r</i>: <i>r</i> = 0 means it does not run, if
399
<i>r</i> > 0 then <i>r</i> seconds pass every turn, if <i>r</i> <
400
0 then −<i>r</i> turns pass every second.<br>
401
<i>No return value</i></p>
403
<p class="lynxonly"></p>
405
<tr class="r1"><td class="c1"><code>StartDaemon(obj)</code> </td>
406
<td class="c2"><i>see</i> <a href="s20.html">§20</a></td></tr>
408
<p class="normal">Makes the daemon of the object <code>obj</code> active,
409
so that its <code>daemon</code> routine will be called at the end
411
<i>No return value</i></p>
413
<p class="lynxonly"></p>
415
<tr class="r1"><td class="c1"><code>StartTimer(obj,period)</code> </td>
416
<td class="c2"><i>see</i> <a href="s20.html">§20</a></td></tr>
418
<p class="normal">Makes the timer of the object <code>obj</code> active.
419
Its <code>time_left</code> property is set initially to <code>period</code>,
420
then decreased by 1 at the end of every turn in which it was positive.
421
At the end of the turn when it was zero, the timer is stopped and
422
the object's <code>time_out</code> property is called.<br>
423
<i>No return value</i></p>
425
<p class="lynxonly"></p>
426
<a id="p434" name="p434"></a>
428
<tr class="r1"><td class="c1"><code>StopDaemon(obj)</code> </td>
429
<td class="c2"><i>see</i> <a href="s20.html">§20</a></td></tr>
431
<p class="normal">Makes the daemon of the object <code>obj</code> no
432
longer active, so that its <code>daemon</code> routine will no
433
longer be called at the end of every turn.<br>
434
<i>No return value</i></p>
436
<p class="lynxonly"></p>
438
<tr class="r1"><td class="c1"><code>StopTimer(obj)</code> </td>
439
<td class="c2"><i>see</i> <a href="s20.html">§20</a></td></tr>
441
<p class="normal">Makes the timer of the object <code>obj</code> no
442
longer active, so that its <code>time_left</code> routine will no
443
longer be decreased and <code>time_out</code> will not be called
444
as originally scheduled.<br>
445
<i>No return value</i></p>
447
<p class="lynxonly"></p>
449
<tr class="r1"><td class="c1"><code>TestScope(obj,actor)</code> </td>
450
<td class="c2"><i>see</i> <a href="s32.html">§32</a></td></tr>
452
<p class="normal">Tests whether the object <code>obj</code> is in scope
453
to the given <code>actor</code>. If no <code>actor</code> is given,
454
the actor is assumed to be the player.<br>
455
<i>Routine returns</i> <code>true</code> or
456
<code>false</code>.</p>
458
<p class="lynxonly"></p>
460
<tr class="r1"><td class="c1"><code>TryNumber(wordnum)</code> </td>
461
<td class="c2"><i>see</i> <a href="s28.html">§28</a></td></tr>
463
<p class="normal">Tries to parse the word at <code>wordnum</code> as
464
a non-negative number, recognising decimal numbers and English ones
465
from “one” to “twenty”.<br>
466
<i>Routine returns</i> −1000 if it fails
467
altogether, or the number, except that values exceeding 10000 are rounded
470
<p class="lynxonly"></p>
472
<tr class="r1"><td class="c1"><code>UnsignedCompare(a,b)</code></td>
474
<p class="normal">The usual <code>></code> condition performs
475
a signed comparison, and occasionally, usually when comparing addresses
476
in memory of routines or strings, you need an unsigned comparison.<br>
477
<i>Routine returns</i> Returns 1 if <i>a</i>
478
> <i>b</i>, 0 if <i>a</i> = <i>b</i> and −1 if <i>a</i> <
479
<i>b</i>, regarding <i>a</i> and <i>b</i> as unsigned numbers between
480
0 and 65535. (That is, regarding <code>-1</code> as 65535, <code>-2</code>
481
as 65534, …, <code>-32768</code> as 32768.)</p>
483
<p class="lynxonly"></p>
485
<tr class="r1"><td class="c1"><code>WordAddress(wordnum)</code> </td>
486
<td class="c2"><i>see</i> <a href="s28.html">§28</a></td></tr>
488
<p class="normal">Find where word number <code>wordnum</code> from what
489
the player typed is stored.<br>
490
<i>Routine returns</i> The <code>-></code>
491
array holding the text of the word.</p>
493
<p class="lynxonly"></p>
495
<tr class="r1"><td class="c1"><code>WordInProperty(word,obj,prop)</code> </td>
496
<td class="c2"><i>see</i> <a href="s34.html">§34</a></td></tr>
498
<p class="normal">Tests whether <code>word</code> is one of the dictionary
499
values listed in the array given as the property <code>prop</code> of object
500
<code>obj</code>. (Most often used to see if a given dictionary word is
501
one of the <code>name</code> values.)<br>
502
<i>Routine returns</i> <code>true</code> or <code>false</code>.</p>
504
<p class="lynxonly"></p>
505
<a id="p435" name="p435"></a>
507
<tr class="r1"><td class="c1"><code>WordLength(wordnum)</code> </td>
508
<td class="c2"><i>see</i> <a href="s28.html">§28</a></td></tr>
510
<p class="normal">Find the length (number of letters) of the word
511
numbered <code>wordnum</code> from what the player typed.<br>
512
<i>Routine returns</i> The length.</p>
514
<p class="lynxonly"></p>
516
<tr class="r1"><td class="c1"><code>WriteListFrom(obj,st)</code> </td>
517
<td class="c2"><i>see</i> <a href="s27.html">§27</a></td></tr>
519
<p class="normal">Write a list of <code>obj</code> and its siblings,
520
with the style being <code>st</code>. To list all the objects inside
521
<code>X</code>, list from <code>child(X)</code>. The style is made
522
up by adding together some of the following constants:</p>
523
<p class="lynxonly"></p>
524
<div class="inset"><table>
525
<tr><td><code>NEWLINE_BIT</code></td><td>New-line after each entry</td></tr>
526
<tr><td><code>INDENT_BIT</code></td><td>Indent each entry according to depth</td></tr>
527
<tr><td><code>FULLINV_BIT</code></td><td>Full inventory information after entry</td></tr>
528
<tr><td><code>ENGLISH_BIT</code></td><td>English sentence style, with commas and ‘and’</td></tr>
529
<tr><td><code>RECURSE_BIT</code></td><td>Recurse downwards with usual rules</td></tr>
530
<tr><td><code>ALWAYS_BIT</code></td><td>Always recurse downwards</td></tr>
531
<tr><td><code>TERSE_BIT</code></td><td>More terse English style</td></tr>
532
<tr><td><code>PARTINV_BIT</code></td><td>Only brief inventory information after entry</td></tr>
533
<tr><td><code>DEFART_BIT</code></td><td>Use the definite article in list</td></tr>
534
<tr><td><code>WORKFLAG_BIT</code></td><td>At top level (only), only list objects which have the <code>workflag</code> attribute</td></tr>
535
<tr><td><code>ISARE_BIT</code></td><td>Prints “ is " or “ are " before list</td></tr>
536
<tr><td><code>CONCEAL_BIT</code></td><td>Misses out <code>concealed</code> or <code>scenery</code> objects</td></tr>
539
<p class="lynxonly"></p>
541
<tr class="r1"><td class="c1"><code>YesOrNo()</code></td>
543
<p class="normal" style="margin-bottom:1em">Assuming that a question has already been printed,
544
wait for the player to type “yes”, “y”, “no”
545
or “n”.<br>
546
<i>Routine returns</i> <code>true</code>
547
for “yes” or “y”, <code>false</code> for
548
“no” or “n”.</p>
552
<a href="index.html">home</a> /
553
<a href="contents.html">contents</a> /
554
<a href="app.html">appendices</a> /
555
<a href="sa2.html" title="§A2: Library properties">prev</a> /
556
<a href="sa4.html" title="§A4: Library message numbers">next</a> /
557
<a href="dm4index.html">index</a>