diff --git a/README.md b/README.md index cd7d8a0c1..6d491a051 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Inform 7 -v10.1.0-alpha.1+6T95 'Krypton' (3 January 2022) +v10.1.0-alpha.1+6T96 'Krypton' (4 January 2022) ## About Inform 7 diff --git a/build.txt b/build.txt index 237e1ea80..2ac815d5a 100644 --- a/build.txt +++ b/build.txt @@ -1,3 +1,3 @@ Prerelease: alpha.1 -Build Date: 3 January 2022 -Build Number: 6T95 +Build Date: 4 January 2022 +Build Number: 6T96 diff --git a/docs/BasicInformKit/S-dfn.html b/docs/BasicInformKit/S-dfn.html index 25c4ce19c..3d4b75596 100644 --- a/docs/BasicInformKit/S-dfn.html +++ b/docs/BasicInformKit/S-dfn.html @@ -56,7 +56,7 @@ MathJax = {

Miscellaneous constant definitions, usually providing symbolic names for otherwise inscrutable numbers, which are used throughout the template layer.

-
+

§1. Z-Machine Definitions. The Z-machine contains certain special constants and variables at fixed position in its "header"; the addresses of these are given below. See @@ -445,43 +445,7 @@ creation sequence in the Standard Rules.) Constant DOES_THE_PLAYER_MEAN_RB = 34; Constant MULTIPLE_ACTION_PROCESSING_RB = 35; -

§13. Kind IDs. These are filled in automatically by Inform, and have the same names as are used -in the Inform source (and in the Load-.i6t sections): for instance NUMBER_TY. -

- -

§14. Parser Error Numbers. The traditional ways in which the I6 library's parser, which we adopt here -more or less intact, can give up on a player's command. See the {\it Inform -Designer's Manual}, 4th edition, for details. -

- -
-Constant STUCK_PE         = 1;
-Constant UPTO_PE          = 2;
-Constant NUMBER_PE        = 3;
-Constant ANIMA_PE         = 4;
-Constant CANTSEE_PE       = 5;
-Constant TOOLIT_PE        = 6;
-Constant NOTHELD_PE       = 7;
-Constant MULTI_PE         = 8;
-Constant MMULTI_PE        = 9;
-Constant VAGUE_PE         = 10;
-Constant EXCEPT_PE        = 11;
-Constant VERB_PE          = 12;
-Constant SCENERY_PE       = 13;
-Constant ITGONE_PE        = 14;
-Constant JUNKAFTER_PE     = 15;
-Constant TOOFEW_PE        = 16;
-Constant NOTHING_PE       = 17;
-Constant ASKSCOPE_PE      = 18;
-Constant NOTINCONTEXT_PE  = 19;
-Constant BLANKLINE_PE     = 20; Not formally a parser error, but used by I7 as if
-Constant ANIMAAGAIN_PE    = 21;
-Constant COMMABEGIN_PE    = 22;
-Constant MISSINGPERSON_PE = 23;
-Constant ANIMALISTEN_PE   = 24;
-Constant TOTALK_PE        = 25;
-
-

§15. Scope Searching Reasons. The parser makes use of a mechanism for searching through the objects currently +

§13. Scope Searching Reasons. The parser makes use of a mechanism for searching through the objects currently "in scope", which basically means visible to the actor who would perform the action envisaged by the command being parsed. It is sometimes useful to behave differently depending on why this scope searching is being done, so @@ -500,7 +464,7 @@ in numbering. Constant LOOPOVERSCOPE_REASON = 5; Constant TESTSCOPE_REASON = 6; -

§16. Token Types. Tokens are the indecomposable pieces of a grammar line making up a possible +

§14. Token Types. Tokens are the indecomposable pieces of a grammar line making up a possible reading of a command; some are literal words, others stand for "any named object in scope", and so on. The following codes identify the possibilities. The *_TOKEN constants must not be altered without modifying the I6 compiler @@ -528,7 +492,7 @@ to match (so, basically, they must not be altered at all). Constant TOPIC_TOKEN = 9; Constant ENDIT_TOKEN = 15; Value used to mean "end of grammar line" -

§17. GPR Return Values. GRP stands for "General Parsing Routine", an I6 routine which acts as a +

§15. GPR Return Values. GRP stands for "General Parsing Routine", an I6 routine which acts as a grammar token: again, see the {\it Inform Designer's Manual}, 4th edition, for details.

@@ -556,7 +520,7 @@ here regardless. Constant GPR_MULTIINSIDE = GPR_NOUN + 5; Constant GPR_CREATURE = GPR_NOUN + 6; -

§18. List Styles. These constants make up bitmaps of the options in use when listing objects. +

§16. List Styles. These constants make up bitmaps of the options in use when listing objects.

@@ -579,7 +543,7 @@ here regardless.
 Constant EXTRAINDENT_BIT    = $$0010000000000000; New in I7: extra indentation of 1 level
 Constant CFIRSTART_BIT      = $$0100000000000000; Capitalise first article in list
 
-

§19. Lengths Of Time. Inform measures time in minutes. +

§17. Lengths Of Time. Inform measures time in minutes.

@@ -589,7 +553,7 @@ here regardless.
 Constant TWELVE_HOURS = 720;
 Constant TWENTY_FOUR_HOURS = 1440;
 
-

§20. Empty Text. The I6 compiler does not optimise string compilation: if it needs to compile +

§18. Empty Text. The I6 compiler does not optimise string compilation: if it needs to compile the (packed, read-only) string "exemplum" twice, it will compile two copies. This is slightly wasteful on memory, though in practice the loss is not enough for us to care. But we do want to avoid this in I7 because, to make @@ -605,21 +569,21 @@ and properties: we give it a name as follows. Constant EMPTY_TEXT_PACKED ""; Array EMPTY_TEXT_VALUE --> CONSTANT_PACKED_TEXT_STORAGE EMPTY_TEXT_PACKED; -

§21. Empty Table. Similarly: the default value for the "table" kind of value, a Table +

§19. Empty Table. Similarly: the default value for the "table" kind of value, a Table containing no rows and no columns.

 Array TheEmptyTable --> 0 0;
 
-

§22. Empty Set. The falsity proposition describes the empty set of objects, and is the +

§20. Empty Set. The falsity proposition describes the empty set of objects, and is the zero value for the "description" kind of value.

 [ Prop_Falsity reason obj; return 0; ];
 
-

§23. Template Attributes. An I6 attribute is equivalent to an I7 "either/or property", though the +

§21. Template Attributes. An I6 attribute is equivalent to an I7 "either/or property", though the latter are not always translated into I6 attributes because the Z-machine has only a limited number of attributes to use. Here, we define attributes used by the template. @@ -682,7 +646,7 @@ are not visible to I7 source text as storage. Attribute workflag2; new in I7 and also temporary workspace Constant list_filter_permits = privately_named; another I7 listwriter convenience -

§24. Template Properties. As remarked above, these more often correspond to value properties in I7. +

§22. Template Properties. As remarked above, these more often correspond to value properties in I7. To an experienced I6 user, though, the death toll of abolished I6 properties in I7 is breathtaking: in alphabetical order, after, cant_go, daemon, each_turn, invent, life, number, orders, @@ -741,31 +705,7 @@ future use. Property inside_description; not used by I7, but an interesting hook in the locale code Property short_name_indef 0; not used by I7, but an interesting hook in the listmaker -

§25. Fake Actions. Though sometimes useful for I6 coding tricks, fake actions — action numbers -not corresponding to any action, but different from those of valid actions, -and useable with a number of action syntaxes — are not conceptually present -in I7 source text. They can only really exist at the I6 level because I6 is -typeless; in I7 terms, there is no convenient kind of value which could -represent both actions and fake actions while protecting each from confusion -with the other. -

- -

See the {\it Inform Designer's Manual}, 4th edition, for what these are -used for. -

- -

The following fake actions from the I6 library have been dropped here: -##LetGo, ##Receive, ##ThrownAt, ##Prompt, ##Places, ##Objects, -##Order, ##NotUnderstood. -

- -
-Fake_Action ListMiscellany;
-Fake_Action Miscellany;
-Fake_Action PluralFound;
-Fake_Action TheSame;
-
-

§26. Formal Parameters. These are needed for efficient run-time ambiguity resolution. +

§23. Formal Parameters. These are needed for efficient run-time ambiguity resolution.

@@ -780,7 +720,7 @@ used for.
 Global formal_par7;
 Global unicode_temp;
 
-

§27. Template Configuration. To minimise the need for conditional compilation in the template, the +

§24. Template Configuration. To minimise the need for conditional compilation in the template, the constant KIT_CONFIGURATION_BITMAP must be generated by the user (i.e., by I7). It's made up of these bits:

diff --git a/docs/CommandParserKit/S-prs.html b/docs/CommandParserKit/S-prs.html index 8dca00974..c34ff804b 100644 --- a/docs/CommandParserKit/S-prs.html +++ b/docs/CommandParserKit/S-prs.html @@ -56,9 +56,40 @@ MathJax = {

The parser for turning the text of the typed command into a proposed action by the player.

-
+
-

§1. Grammar Line Variables. This is the I6 library parser in mostly untouched form: reformatted for template +

§1. Parser Error Numbers. The traditional ways in which the I6 library's parser, which we adopt here +more or less intact, can give up on a player's command. +

+ +
+Constant STUCK_PE         = 1;
+Constant UPTO_PE          = 2;
+Constant NUMBER_PE        = 3;
+Constant ANIMA_PE         = 4;
+Constant CANTSEE_PE       = 5;
+Constant TOOLIT_PE        = 6;
+Constant NOTHELD_PE       = 7;
+Constant MULTI_PE         = 8;
+Constant MMULTI_PE        = 9;
+Constant VAGUE_PE         = 10;
+Constant EXCEPT_PE        = 11;
+Constant VERB_PE          = 12;
+Constant SCENERY_PE       = 13;
+Constant ITGONE_PE        = 14;
+Constant JUNKAFTER_PE     = 15;
+Constant TOOFEW_PE        = 16;
+Constant NOTHING_PE       = 17;
+Constant ASKSCOPE_PE      = 18;
+Constant NOTINCONTEXT_PE  = 19;
+Constant BLANKLINE_PE     = 20; Not formally a parser error, but used by I7 as if
+Constant ANIMAAGAIN_PE    = 21;
+Constant COMMABEGIN_PE    = 22;
+Constant MISSINGPERSON_PE = 23;
+Constant ANIMALISTEN_PE   = 24;
+Constant TOTALK_PE        = 25;
+
+

§2. Grammar Line Variables. This is the I6 library parser in mostly untouched form: reformatted for template file use, and with paragraph divisions, but otherwise hardly changed at all. It is a complex algorithm but one which is known to produce good results for the most part, and it is well understood from (at time of writing) fifteen @@ -80,6 +111,7 @@ be read or written by the parser.

+Global etype;                       parser error number if command not recognised
 Global best_etype;                  Preferred error number so far
 Global nextbest_etype;              Preferred one, if ASKSCOPE_PE disallowed
 
@@ -116,7 +148,7 @@ be read or written by the parser.
 Global usual_grammar_after;         Point from which usual grammar is parsed (it may vary from
                                     the above if user's routines match multi-word verbs)
 
-

§2. Grammar Token Variables. More globals, but dealing at the level of individual tokens now. +

§3. Grammar Token Variables. More globals, but dealing at the level of individual tokens now.

@@ -160,7 +192,7 @@ be read or written by the parser.
 Constant comma_word = 'comma,';     An "untypeable word" used to substitute
                                     for commas in parse buffers
 
-

§3. Match List Variables. The most difficult tokens to match are those which refer to objects, since +

§4. Match List Variables. The most difficult tokens to match are those which refer to objects, since there is such a variety of names which can be given to any individual object, and we don't of course know which object or objects are meant. We store the possibilities (up to MATCH_LIST_WORDS, anyway) in a data structure called the match list. @@ -175,7 +207,7 @@ possibilities (up to MATCH_LI Global match_length; How many words long are these matches? Global match_from; At what word of the input do they begin? -

§4. Words. The player's command is broken down into a numbered sequence of words, which +

§5. Words. The player's command is broken down into a numbered sequence of words, which break at spaces or certain punctuation (see the DM4). The numbering runs upwards from 1 to WordCount(). The following utility routines provide access to words in the current command; because buffers have different @@ -244,7 +276,7 @@ as two commands in succession), return NextWord(); ]; -

§5. Snippets. Although the idea is arguably implicit in I6, the formal concept of +

§6. Snippets. Although the idea is arguably implicit in I6, the formal concept of "snippet" is new in I7. A snippet is a value which represents a word range in the command most recently typed by the player. These words number consecutively upwards from 1, as noted above. The correspondence between @@ -320,7 +352,7 @@ $$ C = 100 + N $$ rfalse; ]; -

§6. Unpacking Grammar Lines. Grammar lines are sequences of tokens in an array built into the story file, +

§7. Unpacking Grammar Lines. Grammar lines are sequences of tokens in an array built into the story file, but in a format which differs depending on the virtual machine in use, so the following code unpacks the data into more convenient if larger arrays which are VM-independent. @@ -368,7 +400,7 @@ which are VM-independent. found_tdata = (token+1)-->0; ]; -

§7. Keyboard Primitive. This is the primitive routine to read from the keyboard: it usually delegates +

§8. Keyboard Primitive. This is the primitive routine to read from the keyboard: it usually delegates this to a routine specific to the virtual machine being used, but sometimes uses a hacked version to allow TEST commands to work. (When a TEST is running, the text in the walk-through provided is fed into the buffer as if it had @@ -383,7 +415,7 @@ been typed at the keyboard.) return VM_ReadKeyboard(a_buffer, a_table); ]; -

§8. Reading the Command. The Keyboard routine actually receives the player's words, putting the +

§9. Reading the Command. The Keyboard routine actually receives the player's words, putting the words in a_buffer and their dictionary addresses in a_table. It is assumed that the table is the same one on each (standard) call. Much of the code handles the OOPS and UNDO commands, which are not actions and @@ -533,7 +565,7 @@ yes/no questions and the like, without invoking the rest of the parser. IMMEDIATELY_UNDO_RM('E'); new_line; ]; -

§9. Parser Proper. The main parser routine is something of a leviathan, and it has traditionally +

§10. Parser Proper. The main parser routine is something of a leviathan, and it has traditionally been divided into 11 lettered parts:

@@ -569,7 +601,7 @@ fairly thorough description of its output, which is written into the parser_results-->INP2_PRES = 0; meta = false; -

§10. Parser Letter A. Get the input, do OOPS and AGAIN. +

§11. Parser Letter A. Get the input, do OOPS and AGAIN.

@@ -734,7 +766,7 @@ fairly thorough description of its output, which is written into the
     }
     else usual_grammar_after = 0;
 
-

§11. Parser Letter B. Is the command a direction name, and so an implicit GO? If so, go to (K). +

§12. Parser Letter B. Is the command a direction name, and so an implicit GO? If so, go to (K).

@@ -774,7 +806,7 @@ fairly thorough description of its output, which is written into the
 
     } end of first-word-not-a-verb
 
-

§12. Parser Letter C. Is anyone being addressed? +

§13. Parser Letter C. Is anyone being addressed?

@@ -856,7 +888,7 @@ fairly thorough description of its output, which is written into the
     #Endif; DEBUG
     jump BeginCommand;
 
-

§13. Parser Letter D. Get the verb: try all the syntax lines for that verb. +

§14. Parser Letter D. Get the verb: try all the syntax lines for that verb.

@@ -921,7 +953,7 @@ fairly thorough description of its output, which is written into the
     multiflag is used here to prevent inappropriate MULTI_PE errors
     in addition to its unrelated duties passing information to action routines
 
-

§14. Parser Letter E. Break down a syntax line into analysed tokens. +

§15. Parser Letter E. Break down a syntax line into analysed tokens.

@@ -957,7 +989,7 @@ fairly thorough description of its output, which is written into the
 
         wn = verb_wordnum+1;
 
-

§15. Parser Letter F. Look ahead for advance warning for multiexcept/multiinside. +

§16. Parser Letter F. Look ahead for advance warning for multiexcept/multiinside.

There are two special cases where parsing a token now has to be affected by @@ -1086,7 +1118,7 @@ and similarly for multiinside etype = STUCK_PE; wn = verb_wordnum+1; -

§16. Parser Letter G. Parse each token in turn (calling ParseToken to do most of the work). +

§17. Parser Letter G. Parse each token in turn (calling ParseToken to do most of the work).

The pattern gradually accumulates what has been recognised so far, @@ -1294,7 +1326,7 @@ so that it may be reprinted by the parser later on. The grammar is exhausted: every line has failed to match. -

§17. Parser Letter H. Cheaply parse otherwise unrecognised conversation and return. +

§18. Parser Letter H. Cheaply parse otherwise unrecognised conversation and return.

(Errors are handled differently depending on who was talking. If the command @@ -1339,7 +1371,7 @@ fake action ##NotUnderstood rtrue; } -

§18. Parser Letter I. Print best possible error message. +

§19. Parser Letter I. Print best possible error message.

@@ -1417,7 +1449,7 @@ fake action ##NotUnderstood    say__p = 1;
     EndActivity(PRINTING_A_PARSER_ERROR_ACT);
 
-

§19. Parser Letter J. Retry the whole lot. +

§20. Parser Letter J. Retry the whole lot.

@@ -1428,7 +1460,7 @@ fake action ##NotUnderstood    ...being careful not to go all the way back, to avoid infinite repetition
     of a deferred command causing an error.
 
-

§20. Parser Letter K. Last thing: check for THEN and further instructions(s), return. +

§21. Parser Letter K. Last thing: check for THEN and further instructions(s), return.

@@ -1452,12 +1484,12 @@ fake action ##NotUnderstood    best_etype = UPTO_PE;
     jump GiveError;
 
-

§21. End of Parser Proper.

+

§22. End of Parser Proper.

 ]; end of Parser__parse
 
-

§22. Internal Rule. As a hook on which to hang responses. +

§23. Internal Rule. As a hook on which to hang responses.

@@ -1465,7 +1497,7 @@ fake action ##NotUnderstood[ PARSER_N_ERROR_INTERNAL_R; ];
 [ PARSER_COMMAND_INTERNAL_R; ];
 
-

§23. Parse Token. The main parsing routine above tried a sequence of "grammar lines" in turn, +

§24. Parse Token. The main parsing routine above tried a sequence of "grammar lines" in turn, matching each against the text typed until one fitted. A grammar line is itself a sequence of "grammar tokens". Here we have to parse the tokens.

@@ -1547,7 +1579,7 @@ break down others into elementary tokens l o i j k and_parity single_object desc_wn many_flag token_allows_multiple prev_indef_wanted; -

§24. Parse Token Letter A. Analyse token; handle all not involving object lists, break down others. +

§25. Parse Token Letter A. Analyse token; handle all not involving object lists, break down others.

@@ -1682,7 +1714,7 @@ break down others into elementary tokens
 
     token = given_tdata;
 
-

§25. Parse Token Letter B. Begin parsing an object list. +

§26. Parse Token Letter B. Begin parsing an object list.

@@ -1702,7 +1734,7 @@ break down others into elementary tokens
 
     many_flag = false; and_parity = true; dont_infer = false;
 
-

§26. Parse Token Letter C. Parse descriptors (articles, pronouns, etc.) in the list. +

§27. Parse Token Letter C. Parse descriptors (articles, pronouns, etc.) in the list.

@@ -1753,7 +1785,7 @@ break down others into elementary tokens
 
   .TryAgain2;
 
-

§27. Parse Token Letter D. Parse an object name. +

§28. Parse Token Letter D. Parse an object name.

@@ -1899,7 +1931,7 @@ break down others into elementary tokens
    wn = oops_from + match_length;
     wn = match_from + match_length;
 
-

§28. Parse Token Letter E. Parse connectives (AND, BUT, etc.) and go back to (C). +

§29. Parse Token Letter E. Parse connectives (AND, BUT, etc.) and go back to (C).

@@ -1939,7 +1971,7 @@ break down others into elementary tokens
 
     wn--;   Word marker back to first not-understood word
 
-

§29. Parse Token Letter F. Return the conclusion of parsing an object list. +

§30. Parse Token Letter F. Return the conclusion of parsing an object list.

@@ -1984,7 +2016,7 @@ break down others into elementary tokens
 
 ]; end of ParseToken__
 
-

§30. Descriptors. In grammatical terms, a descriptor appears at the front of an English noun +

§31. Descriptors. In grammatical terms, a descriptor appears at the front of an English noun phrase and clarifies the quantity or specific identity of what is referred to: for instance, {\it my} mirror, {\it the} dwarf, {\it that} woman. (Numbers, as in {\it four} duets, are also descriptors in linguistics: @@ -2034,7 +2066,7 @@ or indefinite article. return 0; ]; -

§31. Parsing Descriptors. The Descriptors() routine parses the descriptors at the head of a noun +

§32. Parsing Descriptors. The Descriptors() routine parses the descriptors at the head of a noun phrase, leaving the current word marker wn at the first word of the noun phrase's body. It is allowed to set up for a plural only if allow_p is set; it returns a parser error number, or 0 if no error occurred. @@ -2109,7 +2141,7 @@ is set; it returns a parser error number, or 0 if no error occurred. @pull indef_wanted; @pull indef_type; @pull indef_mode; ]; -

§32. Preposition Chain. A small utility for runs of prepositions. +

§33. Preposition Chain. A small utility for runs of prepositions.

@@ -2123,7 +2155,7 @@ is set; it returns a parser error number, or 0 if no error occurred.
     return -1;
 ];
 
-

§33. Creature. Will this object do for an I6 creature token? (In I7 terms, this affects +

§34. Creature. Will this object do for an I6 creature token? (In I7 terms, this affects the tokens "[someone]", "[somebody]", "[anyone]" and "[anybody]".)

@@ -2135,7 +2167,7 @@ the tokens "[someone]", "[somebody]", "[anyone]" and "[anybody]".) rfalse; ]; -

§34. Noun Domain. NounDomain does the most substantial part of parsing an object name. +

§35. Noun Domain. NounDomain does the most substantial part of parsing an object name. It is given two "domains" — usually a location and then the actor who is looking — and a context (i.e. token type), and returns:

@@ -2544,7 +2576,7 @@ because we want to allow duplicates). [ PARSER_CLARIF_INTERNAL_R; ]; -

§35. Adjudicate. The Adjudicate routine tries to see if there is an obvious choice, when +

§36. Adjudicate. The Adjudicate routine tries to see if there is an obvious choice, when faced with a list of objects (the match_list) each of which matches the player's specification equally well. To do this it makes use of the context (the token type being worked on). @@ -2787,7 +2819,7 @@ routines to clear up this mess, so we can't economise on working them out). ]; Adjudicate -

§36. ReviseMulti. ReviseMulti revises the multiple object which already exists, in the +

§37. ReviseMulti. ReviseMulti revises the multiple object which already exists, in the light of information which has come along since then (i.e., the second parameter). It returns a parser error number, or else 0 if all is well. This only ever throws things out, never adds new ones. @@ -2835,7 +2867,7 @@ This only ever throws things out, never adds new ones. return 0; ]; -

§37. Match List. The match list is an array, match_list-->, which holds the current best +

§38. Match List. The match list is an array, match_list-->, which holds the current best guesses at what object(s) a portion of the command refers to. The global number_matched is set to the current length of the match_list.

@@ -2896,7 +2928,7 @@ or "panic". rfalse; ]; -

§38. ScoreMatchL. ScoreMatchL scores the match list for quality in terms of what the player +

§39. ScoreMatchL. ScoreMatchL scores the match list for quality in terms of what the player has vaguely asked for. Points are awarded for conforming with requirements like "my", and so on. Remove from the match list any entries which fail the basic requirements of the descriptors. (The scoring system used to @@ -3002,7 +3034,7 @@ evaluate the possibilities is discussed in detail in the DM4.) } ]; -

§39. BestGuess. BestGuess makes the best guess it can out of the match list, assuming that +

§40. BestGuess. BestGuess makes the best guess it can out of the match list, assuming that everything in the match list is textually as good as everything else; however it ignores items marked as \(-1\), and so marks anything it chooses. It returns \(-1\) if there are no possible choices. @@ -3028,7 +3060,7 @@ It returns \(-1\) if there are no possible choices. return i; ]; -

§40. SingleBestGuess. SingleBestGuess returns the highest-scoring object in the match list +

§41. SingleBestGuess. SingleBestGuess returns the highest-scoring object in the match list if it is the clear winner, or returns \(-1\) if there is no clear winner.

@@ -3043,7 +3075,7 @@ if it is the clear winner, or returns \(-1\) if there is no clear winner. return earliest; ]; -

§41. Identical. Identical decides whether or not two objects can be distinguished from each +

§42. Identical. Identical decides whether or not two objects can be distinguished from each other by anything the player can type. If not, it returns true. (This routine is critical to the handling of plurals, and the list-writer requires it to be an equivalence relation between objects: but it is, @@ -3105,7 +3137,7 @@ for some function \(f\).) rtrue; ]; -

§42. Print Command. PrintCommand reconstructs the command as it presently reads, from the +

§43. Print Command. PrintCommand reconstructs the command as it presently reads, from the pattern which has been built up.

@@ -3170,7 +3202,7 @@ the preposition n } ]; -

§43. CantSee. The CantSee routine returns a good error number for the situation where +

§44. CantSee. The CantSee routine returns a good error number for the situation where the last word looked at didn't seem to refer to any object in context.

@@ -3213,7 +3245,7 @@ Thus game objects always triumph over scenery.) return e; ]; -

§44. Multiple Object List. The MultiAdd routine adds object o to the multiple-object-list. This is +

§45. Multiple Object List. The MultiAdd routine adds object o to the multiple-object-list. This is only allowed to hold MATCH_LIST_WORDS minus one objects at most, at which point it ignores any new entries (and sets a global flag so that a warning may later be printed if need be). @@ -3259,7 +3291,7 @@ out anything without the given attribute } ]; -

§45. Scope. The scope of an actor is the set of objects which he can refer to in typed +

§46. Scope. The scope of an actor is the set of objects which he can refer to in typed commands, which is normally the same as the set of visible objects; but this can be modified. This is how I7 handles tokens like "[any room]".

@@ -3327,7 +3359,7 @@ scope. (In I6, room names were not normally parsed.) if (ats_flag == 1) { if (HasLightSource(obj)==1) ats_hls = 1; } ]; -

§46. Scope Level 0. The two ways of starting up the scope machinery other than via the parser +

§47. Scope Level 0. The two ways of starting up the scope machinery other than via the parser code above.

@@ -3353,7 +3385,7 @@ code above. parser_one = x; scope_reason = y; actor = a; actors_location = al; ]; -

§47. SearchScope. Level 1. The method is: +

§48. SearchScope. Level 1. The method is: