Upcoming release:

=======
v6.6: new feature release (12 May 2026)

- A describe property can now hold the value 2, or a routine returning 2, to say that the object isn't described at all (not by the describe property, nor should it be shown in any other way). This differs from returning 1/true, in that returning 2 won't make the Look routine think it has printed an object, so it won't necessarily print "You can ALSO see..." when listing the remaining objects. (Issue #164)
- Storing 0 in a describe property would make the object be listed as usual by the Look routine, if the object belonged to a class that had a describe routine returning 0 (correct!), but would exempt the object from being listed if it didn't belong to a class that had a describe routine (wrong!). This has been corrected - 0 always means the same as not giving a value at all for describe. (Issue #163)
- If a property had the value n, where n is 0 or a small positive number, and code called PrintOrRun for this property, PrintOrRun should have returned n. Instead it has always returned 1 in this scenario. This bug has been fixed. In the library, the describe property is the only property that is affected by this change.
- Added support for compiling PunyInform games to z4 format. 
- Updated a few ROUTINE debug messages to the new format (they were missed when we switched to the new format).
- Rearranged messages in messages.h, so infrequently used messages are more consistently at the end of the routine, to (a) aid interpreters that use virtual memory by reducing the typical footprint of this big routine in VM, and (b) make frequently used messages faster to find.
- grammar property routines can now (and should), set parser_one = -1 when returning (- verb), or parser_one = 1 when returning (verb), to ensure the return value can't be misinterpreted. Failure to set parser_one will lead to a warning being printed, if the game is compiled in DEBUG mode, with RUNTIME_ERRORS > 0.
- Optimized MoveFloatingObjects.

=======
v6.5: new feature release (12 Apr 2026)

- New message MSG_SHOUT_NOSUCHTHING ("You can't see any such thing."), printed by the Shout action, if the player types SHOUT AT x, where x isn't recognized as a nearby actor or object.
- Message MSG_PARSER_NOSUCHTHING ("You can't see any such thing.") has changed from being a simple message (a string) to being a complex message (code). This means you can no longer use a string to replace it - it can only be replaced by a complex message.
- Optimized the FastSpaces routine, used for statusline and more.
- Optimized the UnsignedCompare routine, the most used routine (called by ofclass).
- Use the same, optimized UnsignedCompare for the library and the veneer.
- Implemented 33% faster way to call methods in RunRoutines.
- Fixed a bug in howto/talk_menu.inf (one topic tried to activate another topic using a topic ID, but that ID didn't exist).
- Removed a pointless variable in cheap scenery extension.
- Improved the error message when trying GET ALL BUT X AND Y (too complex)
- Optimized the search for a light source (New global last_light_source holds the last used light source, if any)
- Printing numbers correctly when printing parsed pattern (thanks joelburton)
- Renamed ResetInputAction to _ResetInputAction
- New routine IsARoutine(value) to (quickly) decide if a value can be a routine address.
- New routine IsAString(value) to (quickly) decide if a value can be a string address.

=======
v6.4.1: bug fix release (8 Mar 2026)

Important to note when upgrading:
- Until now, `parse_name` routines were not called if the first input word wasn't in the dictionary (i.e. the word value was 0). Now `parse_name` is called in these instances.  Make sure you don't have parse_name routines which accept 0 as a synonym. E.g. it could look in an array of synonyms, and the array may contain the value 0 at times, to make room for synonyms that will be put there at a certain point in the game. 

Bugfixes:
- Statusline code couldn't compile with certain combinations of constants defined.
- If an input word wasn't recognized, _ParseNounPhrase would still check if it had the noun flag, i.e. it would look at adress 6 in the header, and accept it as a noun if bit 7 was set. One effect of this was that an unknown word in player input would be recognized as the direction "in" if routines started at or above address $8000.
- The parse_name routine of the Directions object would look for an unrecognized word in user input in its arrays of direction words. This would match empty entries, e.g. the short form of 'in' (which doesn't exist, so it's set to 0).
- If an input word was recognized, and it didn't have the noun flag, _ParseNounPhrase would conclude it can't be the name of an object. This was a mistake - a `parse_name` routine may still want to recognize the word as a synonym for the object. E.g. if the player names a cube "drop", the player should then be able to do "get drop".  (example from Balances.inf, available at if-archive).
- If an input word wasn't recognized, an object's `name` array would still be scanned for the word (which would then be 0).

=======
v6.4: new feature release (3 Mar 2026)

- Changed score/moves statusline to use ":" as a separator instead of "/", and for screens ~40 characters wide, print "Sc:0 Mv:0" rather than "Score: 0/0".
- Changed score/moves statusline to print score + moves information as far to the right as possible, on narrow screens  ( less than 67 characters wide, for a score+moves statusline).
- Changed the threshold values for screen width when DrawStatusLine switches between different layouts, to adhere to a simple principle: Regardless of screen size, make sure room names up to 21 characters in length can always be printed on the statusline without score, moves, or time overwriting any part of the room name.
- Fixed a time statusline display bug - if hour was between 1 and 9, the rightmost character in the statusline could show a character that was part of the room name.

=======
v6.3.1: bugfix release (27 Dec 2025)

- Optimized _ParseNounPhrase and _IsSentenceDivider routines a little.
- Made automatic assignment of reactive attribute faster, for games that don't use custom common properties for a lot of objects.
- Updated tests/runtests.rb to accept Frotz not always appending ".qzl" to save file names.
- Fixed: Debug verb 'routines' didn't print anything in z5 when calling GamePreRoutine and GamePostRoutine.
- Changed format of routine names printed by debug verb 'routines' to match Inform 6 output (which is used for methods being called in z5 in PunyInform as well), e.g. from (small rock).before() to [ "small rock".before() ].
- Fixed that Oops-message prints the original word that wasn't understood, even if player changed the word using 'oops'. (Issue #151)
- Fixed so a full stop and 'then' always separate commands (unlike comma and 'and' which can be used to separate commands OR objects in a list). (Issue #157)

=======
v6.3: new feature release (5 Dec 2025)

- Extended meta-verb 'places' now lists one location per line, as this is faster, smaller, and more similar to the meta-verb 'objects'
- Extended meta-verb 'objects' will now also list objects that have been removed from the game (i.e. have no parent).
- Extended meta-verb 'objects' now relies on the entry point routine IsARoom (if provided) to decide whether a certain object is a room or not.
- Optimized WordAddress() and WordLength(), for z5.
- "GET ALL" won't try to take objects in a closed container.
- "GET X FROM Y", where Y is a closed (transparent) container, now fires the action, unless X is "ALL", so before-routines can react. Unless a before-routine blocks the action, the action routine will block it. "GET ALL FROM Y" is still blocked by the parser, so the player doesn't get one message per item in the container. (Issue #147)

=======
v6.2: bug fix and new feature release (26 Nov 2025)

- Verb 'places' (part of the extended meta-verbs) now performs a more thorough check to decide if an object is a room, and game author can control the process using an IsARoom entry point routine.
- Entry point routine DebugIsARoom has changed name to IsARoom, and is used for debug verbs 'rooms' and 'goto' *and* for extended meta-verb 'places'.
- Routine _RoomLike (Used by verbs 'goto', 'rooms'  and 'places') now requires an object to provide the description property, to be seen as a possible room.
- Updated howto/statusline_teleport.inf to work in z3 format as well.
- New script tests/compile_all.rb to check that all .inf files compile without errors or warnings.

=======
v6.1.1: bug fix and optimization release (13 Nov 2025)

- Removed _RoomLike warning when _return_code not used.
- Optimized 'goto' and 'rooms' debug verbs for speed.

=======
v6.1: bug fix and new feature release (13 Nov 2025)

- Optimized grammar for 'consult' verb.
- Debug verb 'rooms' now takes an optional substring to search for in room names, e.g. "rooms way" will show rooms like "Hallway Junction"
- Changed debug verb 'goto' to perform matching exactly like 'rooms', ignoring any asterisks at start or end of string, e.g. "goto way" moves the player to the first room that has "way" anywhere in its name.
- Added entry point for DEBUG mode only: DebugIsARoom(obj, verdict). Library will call it when the player uses debug verbs 'goto' or 'rooms', to decide if an object is a room. The verdict parameter is 0 if the library thinks it's not a room, 1 if it thinks it's a room. Return: 0 to accept the library's decision, 1 to say it's a room, 2 to say it's not a room.
- Fixed parser bug, where "e.n" could be parsed as "n.n"
- Optimized MoveFloatingObjects

=======
v6.0.2: bug fix release (11 Sep 2025)

- Optimized scope routines. (Issue #155)
- Updated Testbench, Microphone object, to reflect that ##AskFor action is transformed to an order to ##Give by the parser.
- Added Mini-Cluedo demonstration game as statusline_teleport.inf to howto folder.

=======
v6.0.1: bug fix release (28 Aug 2025)

- Bugfix: Set scope_routine=0 in parser before performing action, or scope can get messed up
- If the ##Restart action was performed, while a transcript was being output, the library forgot that it had an active transcript, and would print a warning if the player tried to enter a comment with '*'.
- Made WordValue routine faster.
- Fixed minor problems and cleaned up howto/talk_menu.inf

=======
v6.0: bug fix and new feature release (8 Aug 2025)

- New function: OzmooColoursAvailable(), returns true if Ozmoo's eight extra colours are available. 
- Added constants for the eight extra colours supported by Ozmoo: CLR_OZMOO_ORANGE, CLR_OZMOO_BROWN, CLR_OZMOO_LIGHT_RED, CLR_OZMOO_DARK_GREY, CLR_OZMOO_MEDIUM_GREY, CLR_OZMOO_LIGHT_GREEN, CLR_OZMOO_LIGHT_BLUE, CLR_OZMOO_LIGHT_GREY. 
- Added a global clr_talk_menu to ext_talk_menu.inf, to let game programmer set the menu colour. 
- Updated howto/colours.inf and howto/talk_menu.inf.
- Messages MSG_SHOW_DEFAULT, MSG_GIVE_DEFAULT (e.g. "John doesn't seem interested.") has been adapted to actors having pluralname.
- Messages MSG_ASKFOR_DEFAULT, MSG_ASKTO_DEFAULT, MSG_ORDERS_WONT (e.g. "John has better things to do.") has been adapted to actors having pluralname.
- Messages MSG_LOCK_KEY_DOESNT_FIT, MSG_UNLOCK_KEY_DOESNT_FIT (e.g. "The silver key doesn't seem to fit the lock.") has been adapted to handle attempted keys having pluralname. 
- Message MSG_REMOVE_NOT_HERE (e.g. "But the fork isn't there now.") has been adapted to handle objects having pluralname. 
- Debug verb GOTO will now only consider target objects which seem to be rooms, i.e. don't have attributes or properties which aren't meaningful for rooms.
- Debug verb GOTO will now accept an '*' character at the end as a wildcard, e.g. "GOTO HALL*" can be used to go to the first room that starts with "HALL"
- Fixed: The cheap scenery object didn't have the reactive attribute in games with OPTIONAL_MANUAL_REACTIVE, which made it not reset itobj and themobj when the player changed rooms.
- New print rule: ObjIs, prints e.g. "the ball is" or "the barrels are".
- Fixed too long statusline when screen width was 55+ and OPTIONAL_SL_NO_MOVES was defined (Issue #144).
- Changed RemoveSub, so "get me from [obj]" is transformed to <<Exit [obj]>>
- New feature: The short_name routine of an object can decide how to print the name based on if the name printing is done in the context of a (The) print rule. The short_name routine does this by checking if caps_mode == true.
- The default player object is now printed as "You" when printed with a (The) print rule. (Issues #139, #145)
- Fixed: If you invoke an action in Initalise, and compile with Strict mode, you would get a message for a programming error, since real_location wasn't set, and BeforeRoutines() and AfterRoutines() would try to access properties of this object. Now these routines will be skipped if real_location isn't set.
- Fixed: If inside a closed container, with no inside_description, we lacked a newline before listing the contents. (Issue #150).
- Changed so MSG_LOOK_BEFORE_ROOMNAME (doesn't normally print anything, typically used to print a newline for authors who want that) is only printed in two scenarios: (A) when the player typed something that was translated to a ##Look action, and (B) when the player moved using the ##Go action. From now on, calls to <Look> in code don't cause this message to be printed.
- Changed _UpdateDarkness so a newline is printed before <Look> is called, when a lamp is switched on. (Issue #148)
- When listing objects with PrintContents, extend the rule that we don't show a container/supporter which the player is in, to we don't show a container/supporter which indirectly contains the player.
- Dropped global newline_flag and made Look routine shorter, simpler and faster.
- Changed the way talk_menu detects if it's used with PunyInform or the standard library, as old way broke if flags extensions was also used.
- Added code to howto/colours.inf and howto/talk_menu-inf to avoid a bug in some interpreters, where default background colour is not restored on restart.
- Fixed: If the player asks to empty the SACK_OBJECT, and the player is at max capacity, an object is placed in the sack object, and is subsequently removed along with everything else. (Issue #146)
- Moved arrays _InsertMessages and _PutOnMessages to static memory, to reduce dynamic memory.
- Made code to print the banner shorter.
- Changed so actions Empty/EmptyT don't abort the processing if one object can't be removed from the source container, or it can't be put in the target.
- Micro-optimization for speed in MoveFloatingObjects for z5.
- Changed to use Grammar Version 3, a more compact way of storing grammar (requires Inform v6.43). (Issue #132)
- PunyInform now handles setting the meta-flag on individual actions (requires Inform v6.43). (Issue #133)
- Fixed incorrect usage of @get_char in ext_talk_menu and ext_quote_box, which made them fail on Infocom's Apple II v5 interpreter. (Issue #152)
- Optimized _ParseAndPerformAction, putting multiple_objects-->0 in a local.
- Removed message MSG_REMOVE_CLOSED and the code in RemoveSub that called it, since the check was superfluous. (Issue #147)
- Added new optional feature OPTIONAL_GUESS_KEY which, if OPTIONAL_GUESS_MISSING_NOUN is defined, lets the parser automatically pick out the right key for a lock. (Issue #149)
- Updated Game Author's Guide, fixing some advice that hadn't aged well, and adding more tips on optimizing for size.
- Fixed bug in cheap_scenery: If the cheap scenery object was addressed by an action without first having been matched by any words (should not normally happen, but there are ways), the before routine would typically crash. (Issue #153)

=======
v5.14.1: bug fix release (25 June 2025)

- Fixed: The message MSG_TAKE_BELONGS (e.g. "The staff seems to belong to Gandalf.") was missing a line break at the end.
- Fixed: The message MSG_TAKE_PART_OF (e.g. "The button seems to be part of the machine.") was missing a line break at the end.
- Fixed issue #143 (comma instead of full stop in Library of Horror)

=======
v5.14: bug fix and new feature release (10 June 2025)

- Added a task to the DrawStatusLine routine - DrawStatusLine(true) must print the correct number of newline characters needed at the start of the game to make sure the first text isn't accidentally covered by the statusline (Issue #141).
- New print rule: SingularS, which prints an "s" if the argument is a singular object and not the player. I.e. print (The) obj, " contain", (SingularS) obj, " some wine.";
- The way to call the _UpdateDarkness procedure has changed. It used to be _UpdateDarkness(p_look), where you'd set p_look to true if you wanted the procedure to print a room description if a transition from darkness to light was made. The call is now _UpdateDarkness(p_silent), and you set p_silent to true if you want to routine to not print anything. If you set it to false, or don't give it a value, the routine performs a Look if going from dark to light, and prints a message if going from light to dark.
- howto/change_player.inf has been changed to call _UpdateDarkness in the new way.
- Fixed: Game name and version info was printed with no newline or space between, if constant Headline was undefined (Issue #140).
- New message: The message MSG_NOW_DARK is now printed when the player's location suddenly goes dark (Issue #142).
- Fixed: Message MSG_SEARCH_IN_IT_ISARE used when searching ("The sofa contains a photo.") didn't consider the pluralname attribute of the container. (Issue #138)
- Fixed: Object lists didn't consider the pluralname attribute in extra information like "(which is closed)" (Issue #138).
- Fixed: The message MSG_TAKE_BELONGS (e.g. "The staff seems to belong to Gandalf.") didn't adapt the sentence properly if the first object was an object with pluralname set (Issue #137).
- Fixed: The message MSG_TAKE_PART_OF (e.g. "The button seems to be part of the machine.") didn't adapt the sentence properly if the first object was an object with pluralname set (Issue #137).
- Improved the default abbreviations
- Fixed: howto/change_player.inf lacked a call to MoveFloatingObjects.

=======
v5.13.3: bug fix release (27 April 2025)

- Fixed: A game without OPTIONAL_EXTENDED_METAVERBS couldn't be compiled.

=======
v5.13.2: bug fix release (27 April 2025)

- Fixed: Set correct version# in globals.h (displayed when game starts).

=======
v5.13.1: bug fix release (27 April 2025)

- Fixed: Starting a line with asterisk to make a comment in a transcript was broken for z5+

=======
v5.13: bug fix and new feature release (27 April 2025)

- Fixed: Calling property routines with 0 arguments in z3 actually sent 1 argument, with the value zero. This could cause problems in Infocom's Z-code interpreters.
- Added support for adding commentents in transcripts using asterisk+any text
- Added a compiler flag to minimal.inf ( $LONG_DICT_FLAG_BUG=0 ), to fix issue with plural flag being ignored on long dictionary words. This requires compiler version 6.42+ to work.
- Changed the manual to say PunyInform now requires Inform v6.42+ (You can still get away with v6.36 if you don't use the compiler flag mentioned above though).
- Made copying of remaining commandline parse buffer faster in z5.

=======
v5.12: bug fix and new feature release (21 January 2025)

- Fixed a mistake from PunyInform v1.6: TestScope would return true for any object if meta=1, which is neither useful nor consistent with I6lib.
- Fixed: incomplete sentences with multiple preposition lists didn't produce an error message
- Made ext_flags.h 32 bytes shorter (if you use AnyFlagIsSet and AnyFlagIsClear).
- Made sure error message about too many floating objects isn't obscured by statusline in z5.
- Reset matching object count when _ParseNounPhrase starts.
- Changed two objectloops in Look routine, so they use the fast way of iterating over objects in another object.
- Made the parser give lower priority to an object the actor isn't in, when the action is ##Exit.
- Fixed: Using a number as a synonym for an object gave weird responses from the parser.
- talk_menu extension: A relative reference to a topic to be activated can now be negative as well as positive. If it's negative, the number has to preceded by TM_ACTIVATE, and the number has to be in parentheses. E.g. TM_ACTIVATE (-1)
- talk_menu extension: A topic can now inactivate another topic, by specifying TM_INACTIVATE followed by either a positive or negative relative reference (e.g. (-1) means the previous topic), or an absolute ID 300-600.
- Statusline prints spaces to cover parts of long room name which could show between Score and Moves, and to the right of Moves.
- New debug verb for talk_menu: tmtest - Looks for incorrect entries in talk_menu arrays. Type "tmtest" or e.g.  "tmtest bob" to use it.

=======
v5.11: bug fix and new feature release (14 December 2024)

- talk_menu: A TM_MAYBE_ADD_LIST line can now specify a flag instead of an array to decide if the sub-array should be included.
- cheap_scenery: If you want to set the default message to be used for interactions with cheap scenery items (CS_DEFAULT_MSG), it can now be set to a routine (Until now, it could only be a string).
- Fixed that parser_all_found wasn't always reset when parsing a new command, which gave confusing error messages.
- Fixed: _InitObjects was called too late in main() in puny.h, resulting in games using PlayerTo() in Initialise not getting any floating objects in location, including the cheap scenery object.
- Fixed: Orders to NPCs should only be single objects
- Fixed: tkers submitted a pull request to improve the consult grammar rule
- Fixed bugs in cheap_scenery routines CSHasNoun, CSHasAdjective and CSHasWord, which were introduced in v4.5, but have never worked properly.
- Documented cheap_scenery routines CSHasNoun, CSHasAdjective and CSHasWord, so users will know that they're there, and how to use them.

=======
v5.10: bug fix and new feature release (24 November 2024)

Important to note when upgrading:
- ext_talk_menu: Procedure TMPrintLine has changed. If you redefine it in your own source, you need to copy the procedure from ext_talk_menu.h and modify it to suit your needs.
- ext_talk_menu: A relative topic reference could previously be a number between 1 and 29. From now on it can be in the range 1-20.

Changes:
- Bugfix: Parser will no longer confuse an out_to property value with a parse_name routine, if the value isn't a valid routine address.
- Bugfix: PlayerTo(obj, 2) used to always print a long description, while it should print a short description if the game was in superbrief mode or the game was in brief mode and the player had already visited the location. Fixed now.
- Added option in ext_talk_menu to conditionally add sub-arrays of topics. Updated howto/talk_menu.inf to use this.
- Bugfix: Arrays which_object and multiple_objects in globals.h were one word too small, leading to buffer overruns when the parser handles multiple objects.
- Bugfix: howto/adjectives.inf had a bug which broke matching for AdjObject objects which didn't have an adj_name property.
- talk_menu now uses pagination of topics even in z3 format.
- Fixed a buffer overrun error when wrong value given to parser_two for _ParseNounPhrase.
- Added a buffer overrun check when copying data into multiple_objects.

=======
v5.9: bug fix and new feature release (17 November 2024)

- New debug verbs FOREST, ROOMS, GOTO <name>/<number>. 
- Debug verb TREE can now take a number as argument, e.g. "tree 10"
- Format of output of debug verb TREE has been updated.
- Debug verb GONEAR will now stop the player from going to an object without parent.
- Added runtime error message when buffer is overrun (can only happen in debug mode, when doing "goto <room name>".

=======
v5.8: bug fix and new feature release (9 November 2024)

- Fixed: PrintOrRun() would read a property value before checking if the property holds an array. This would give an error in strict mode, if the property held an array.
- Fixed: An empty, closed, transparent container would get the following text in a list: "(which is closed) (which is open but empty)"
- The open/closed status of a transparent container is now always printed by PrintContents.
- Flags extension: A negative flag ID now performs the opposite modification or check, e.g. SetFlag(F1,-F2) sets F1 and clears F2. FlagIsClear(-F1,F2) returns true if F1 is set and F2 is clear.
- PrintContents will now merge open/closed status and contents, e.g. "(which is open) (which contains a ball)" becomes "(which is open and contains a ball)".

=======
v5.7: bug fix and new feature release (28 Sep 2024)

- Added support for GPR_NOUN, GPR_HELD, GPR_MULTI* and GPR_CREATURE return
  values from ParseToken, see test-gprheld.inf
- The parser can now handle a specified number of similar objects in inputs
  such as "take two coins", "drop 1 coin"
- Made code for printing the full score shorter.
- Optimization in PrintOrRun routine (Issue #130).
- Improved responses for plurals matching the held parse token.

=======
v5.6: bug fix and new feature release (25 Aug 2024)

- Dropping an item in darkness now forces a scope update, so the item isn't still in scope.
- Removed superfluous code in DropSub.
- Rearranged and cleaned up parts of the manual.
- New library message: MSG_EMPTY_NOT_CONTAINER, e.g. "The ball can't contain things."
- The text "(which is open)" is no longer displayed in tall inventory for permanently open, non-empty containers (e.g. a bucket). (Issue #127)
- The text "(which is empty)" in an inventory listing has been changed to "(which is open but empty)", and is now only displayed for openable containers.
- New globals to say what the action input by the player was: input_action, input_noun, input_second, input_direction. 
- Changed so action_to_be is set to NULL (-1) before action is performed.
- New test file for input_action.
- New public routines: DoorDir(door_object) and DoorTo(door_object), returning the effective values of these properties, even for simple doors.
- Changed TryToTakeNoun routine to fire before and after routines for Take action, unless called from TakeSub. (Issue #128)
- Changed TransferSub to add before and after stage for ##Take when applicable, and fire after stage for ##Transfer when action managed to move the noun to second.

=======
v5.5.2: bug fix and optimization release (29 Jul 2024)

- Saved some bytes in parser.h and puny.h. 
- Removed unnecessary initialization of task_done array.
- Fixed a bug where UnknownVerb wasn't called for dictionary words
  that didn't have the verb flag. Only non-dictionary words were called.
- Rewrote pronoun/pronouns grammar to work the same for both v3 and v5, and to work with new compiler versions.
- runtest.rb now supports an optional compiler path argument
- Saved 18 bytes in messages.h (Issue #122)
- Made cheap scenery extension compatible with the standard library again (this was accidentally lost when making cheap scenery distinguish between singular and plural nouns).
- Stopped AfterLife from running after Quit (Issue #124).

=======
v5.5.1: bug fix and optimization release (13 Jul 2024)

- The following verbs were truncated (all in z3, some also in z5+) when using the VerbName print rule: consult, discard, disrobe, noscript, objects, purchase, squeeze, superbrief, swallow, transcript, transfer, uncover, unscript, verbose, version. 
- Saved 96-144 bytes in z3 by printing verbs smarter in VerbName.
- Saved 130 bytes in parser.h
- Made scope calculation slightly faster

=======
v5.5: bug fix and new feature release (8 Jun 2024)

- The z5+ statusline routine (DrawStatusline) has been changed to print a full line of reversed spaces before printing the actual text on the statusline. This means that the statusline flashes briefly every move (only visible on slow platforms), and it means the statusline is slightly slower (~0.10 s vs 0.09 s, on a C64). This change has been made to increase compatibility with older interpreters, as some of them don't support the get_cursor opcode, which is required for the old statusline routine. The most important interpreters that don't support it are MaxZip on classic MacOS and Infocom's Amiga-interpreter.
- There is a new constant OPTIONAL_NON_FLASHING_STATUSLINE. Define it in z5+ games if you want to use the old, non-flashing statusline routine.
- Optimized: automatic setting of reactive attribute is now 20% faster and shorter (total time for a full-size z3 game is typically 1.5 s)
- Optimized: Finding floating objects at game start is faster and shorter
- Optimized the z3 versions of _CopyInputArray and _CopyParseArray routines in parser.
- The Flags extension would define the symbol TM_NOT_PUNY if the extension was used without the PunyInform library. This was the wrong name, and wasn't used for anything, so it's been removed.

=======
v5.4: bug fix and new feature release (10 Apr 2024)

- Fixed: Added DisallowTakeAnimate support for GET ALL.
- Made talk_menu adapt better to narrow screens for z5 by providing alternate, 
  shorter, customizable messages to end conversation and to show next page of 
  topics.
- Made talk menu not include message to show next page of topics when built
  for z3.

=======
v5.3.1: bug fix release (5 Jan 2024)

- Fixed: add_to_scope didn't work properly.
- Optimized: Don't force a scope update when calling a property routine if the
  property value is 0 or NULL.

=======
v5.3: bug fix and new feature release (19 Dec 2023)

- action and action_to_be is now set to NULL when game starts, instead of 0,
  which means action ##Take.
- action_to_be is updated when the player types a direction.
- Disambiguation of a complex noun phrase where a parse_name didn't
  consume all words failed without a response.
- Improved grammar for 'remove' when removing clothing.
- The variable scope_reason is now supported, and can be checked in InScope.
  TALKING_REASON is not supported - PARSING_REASON is used instead.
- InScope is now always consulted when deciding whether to recalculate scope
  or reuse the cached scope copy.

=======
v5.2: bug fix and new feature release (26 Nov 2023)

- Quote boxes weren't centered on screen in z5+ games, like they should.
- Parse buffer is emptied when leaving a menu in ext_menu in z3, so ending it
  with "q" can never be misunderstood as the player trying to quit the game.
- ext_menu ends with <<Look>>; but this can now be skipped by defining the
  constant M_NO_LOOK. 
- Saved 34 bytes in cheap scenery extension.
- Added option to assign an ID to a cheap scenery object.
- New procedure in cheap scenery: CSPerformAction(action, ID, second) -
  Works like <action noun second>; but for a cheap scenery object.
  Give second as -(object) to flip the order, so the cheap scenery object gets
  to be second.
- Global cs_parse_name_id in cheap scenery extension has been removed. 
  Instead, give the object an ID in the cheap scenery list.
- Fixed bug in cheap scenery: If an entry using CS_PARSE_NAME starts with
  CS_THEM, the object was still considered an IT-object if it had a parse_name
  routine and it didn't set parser_action = ##PluralFound.
- Fixed parser bug: If all matched objects had concealed, and 2+ objects 
  matched, the parser would ask a disambiguation question.
- New global in cheap scenery: cs_match_id. Can be used to check ID of matched
  cheap scenery object in location before-routines etc.
- Enter action has a new message: MSG_ENTER_HELD, which is used when trying to
  enter something which is (possibly indirectly) held by the player.

=======
v5.1: bug fix and new feature release (10 Oct 2023)

- Ifdefs instead of stubs for entry point routines, saving up to 178 bytes,
  and adding performance.
- Fixed bug in CSTEST action in cheap scenery, which said a reaction string or 
  routine was expected after a CS_PARSE_NAME + routine, when there was in fact
  no problem.
- Optimized routines _CopyInputArray and _CopyParseArray for z5.
- Let action routines return a message# to be printed, and have 
  PerformPreparedAction print this, saving 344 bytes.
- Moved NotifyOff-, NotifyOn- and Oops-messages to messages.h.
- TenSpaces array is now private (_TenSpaces) and resides in static memory.
- Saved 6 bytes in z3 and 20 bytes in z5 in _ParseToken, while improving 
  performance.
- Saved 12 bytes in z5 in NumberWord (used by OPTIONAL_ALLOW_WRITTEN_NUMBERS),
  while improving performance.
- Fixed parser bug which gave a strange message for "get blue book and all 
  books but blue."
- Created internal parser routine _ObjInMultipleObjects, reducing logic 
  duplication and saving 48 bytes in z3 and 64 bytes in z5.
- Made StartDaemon faster and 15 bytes shorter for z5.
- Made StopDaemon faster and a few bytes shorter for z5.
- Saved 15 bytes in _ParsePattern for z5.
- Made resetting of task_done array in main shorter and faster in z5.
- Made FastSpaces routine tolerate negative argument.
- Made quote box extension faster and smaller in z5, by using FastSpaces 
  routine.
- Created routine _CheckForAndObject in parser, to save 18 bytes.
- Updated abbreviations, saving 108 bytes for a minimal game using the
  built-in abbreviations.

=======
v5.0.1: bug fix release (25 Sep 2023)

- Bugfix: Cheap scenery would match adjectives without a noun following them.
- Modified library_of_horror.inf to use the recently added cheap scenery
  option to mark some objects or words as "them"-words.
- Optimized library_of_horror.inf to produce a smaller Z-code file.

=======
v5.0: bug fix and new feature release (10 Sep 2023)

Important to note when upgrading:
- If you use talk menu: Split up your talk_array into one array per actor. End
  each array with TM_END. Instead of giving each actor a talk_start property, 
  give them a talk_array property, with the name of their own talk array as 
  the value.
- If you use talk_menu, remove any calls to InitTalk(), as they are no longer
  needed.
- If you use talk menu and have replaced the TMPrintLine routine, copy the 
  latest version from ext_talk_menu.h and modify it to your liking.
- Cheap scenery entries that use the standard form of adjective + noun will 
  now match any combination of these words, e.g. noun adjective noun. Re-test 
  your cheap scenery objects.
- Cheap scenery now matches the object that matches the highest number of
  words in player input, rather than the first object that matches any word.
  Re-test your cheap scenery objects.

Changes:
- Improved _PatternLength to count preposition alternatives correctly.
- Change in talk menu: Split up talk_array into one array per actor. End each 
  array with TM_END. Instead of giving each actor a talk_start property, give 
  them a talk_array property, with their own talk array as the value.
- Change in talk menu: The user definable routine TMPRintLine takes different
  arguments than before, the code has changed, and it now prints quote marks
  around lines by default.
- Change in talk menu: Routines _TMCallOrPrint, _SetTopic, ActivateTopic,
  InActivateTopic, GetTopicStatus, RunTalk and TalkSub have been altered.
- Change in talk menu: Routine InitTalk has been removed.
- Change in talk menu: The debug action TalkSetup has been removed, along with
  the grammar to activate it.
- Updated howto/talk_menu.inf to reflect the changes in talk menu.
- Optimized word matching in cheap scenery extension for z5.
- Optimized the cheap scenery extension for code size.
- Changed the standard adjective + noun form for cheap scenery entries to
  match any combination of these words.
- Changed cheap scenery so the longest match ( = matching the highest number
  of consecutive words in player input) is used, rather than the first match.
  In case of a tie, the first match of this length is used.
- Changed cheap scenery so "them" will refer to the cheap scenery object if
  a plural word was used, e.g. "x shelves", or if entry begins with CS_THEM,
  or if it has a parse_name routine which sets parser_action = ##PluralFound.
- Bugfix: You could refer to the cheap scenery object with "it" even after 
  moving to a new room, e.g. "x window. e. open it"
- New cheap scenery feature: CS_MAYBE_ADD_LIST [function] [object] [propery]
  adds the list if the function returns true.
- New debug verb for cheap scenery: 'cstest'. Checks the integrity of all
  cheap_scenery arrays in the game.
- Improved error printing in cheap scenery: The property name is now printed
  as well (useful when including extra lists of cheap scenery, not necessarily
  stored in the cheap_scenery property).
- Made flags functions FlagIsSet and FlagIsClear slightly shorter.
- New function in flags extension: AnyFlagIsSet(flag1, flag2, flag3) - 
  returns true if any of two or three flags are set.
- New function in flags extension: AnyFlagIsClear(flag1, flag2, flag3) - 
  returns true if any of two or three flags are clear.

=======
v4.7: bug fix and new feature release (27 Aug 2023)

- The default message in the cheap scenery extension can now be changed by
  setting CS_DEFAULT_MSG to a string before including the extension. This
  is mainly to support extensions that need to replace it.
- Moved two more messages from parser.h to messages.h, so they can be
  customized: MSG_PARSER_NO_IT and MSG_PARSER_CANT_SEE_IT.
- New file: howto/adjectives.inf, with a class to add adjectives and many 
  synonyms to objects in all Z-code versions.
- Added an optional call to ChooseObjectsFinal when a noun token matches
  a list of indistinguishable objects. If ChooseObjectsFinal reduces this
  to a single match, then it is accepted. In effect this means that we
  pick and use one random item from a set of indistinguishable objects.
- In addition to the PUNYINFORM_MAJOR_VERSION and PUNYINFORM_MINOR_VERSION
  constants, there is now a third version constant for PunyInform: 
  PUNYINFORM_PATCH_VERSION. It is normally 0, but if we need to make a
  patch release between major/minor releases, we set this to a number > 0.
  If it's 0, it is not printed in the banner.
- Changed MoveFloatingObjects to use location rather than real_location, i.e.
  floating objects can also exist in the thedark location (like in I6lib).
- Added functionality in MoveFloatingObjects to accept a class ID in a 
  found_in array, i.e. if location belongs to this class, the object is 
  present (like in I6lib).
- Added functionality in MoveFloatingObjects to accept a regular object in a
  found_in array, and if this object's parent is location, the floating object
  should also be present (like in I6lib).
- Changed MoveFloatingObjects to only move an object to location if it's not 
  already there, in order not to disturb the order of the objects more than 
  necessary (like in I6lib). 
- Added functionality in MoveFloatingObjects so a floating object that is held
  by the player is no longer considered to be floating (like in I6lib).
- Optimized IndirectlyContains function for speed.
- Improved pattern matching so that shorter patterns are preferred, which
  provides better responses when using OPTIONAL_GUESS_MISSING_NOUN (issue 112)

=======
v4.6: bug fix and new feature release (24 May 2023)

- Fixed bug where time_left wasn't set correctly and runtime error check to
  see if timer object provides time_left wasn't performed if timer was set
  to 0.
- Runtime errors now include the error number + text message when 
  RUNTIME_ERRORS is set to 2. This should make it easier to refer to the
  error, and find it in the documentation.
- In DEBUG mode, the flags extension would print a warning about using flag 0,
  but treat it as an error and abort the operation.
- Consolidated runtime error messages in extensions, making builds with
  RUNTIME_ERRORS smaller, and the error messages adhere to the same form.
- Changed so check if maximum # of timers/daemons is about to be exceeded is
  performed even when RUNTIME_ERRORS is 0, to avoid array overrun.
- Cleaned up support for coloured text.
- _ReadPlayerInput() now supports two arguments: p_no_prompt (not new) stops
  the routine from printing a prompt, and p_no_statusline (new) stops the
  routine from printing the statusline under z5 (It's safe to call it
  with this parameter even under z3 though).
- The YesOrNo() routine no longer causes the statusline to be redrawn.
- New library routine for z5: ClearScreen(window); where window can be
  WIN_ALL (default), WIN_MAIN or WIN_STATUS. Also sets colours if clr_on is
  set to true.
- New library procedure: ChangeFgColour(colour); Changes the foreground
  colour variable clr_fg and, if clr_on is true, instructs the interpreter to
  change the foreground colour accordingly. For z3, this routine exists but
  does nothing.

=======
v4.5: bug fix and new feature release (22 April 2023)

- An R is added after the library version in the banner if RUNTIME_ERRORS > 0.
- Fixed talk_menu bug: activating a relative topic# would also set the flag
  with that number.
- Fixed talk_menu bug where talk menu could behave erratically for games 
  larger than half the allowed size for the Z-code version.
- talk_menu now allows a topic to have multiple IDs
- talk_menu functions can now match multiple topics. For maximum performance,
  authors can turn this off at any time with talk_menu_multi_mode = false;
  When reading the current status of a topic, the status of the first
  matching topic will be returned.
- Change in functionality: talk_menu will no longer consider it an error if
  it tries to activate a topic and it turns out the topic is stale. Not 
  finding a topic is still an error.
- Made DEBUG REACTIVE command return a lot less false positives (i.e.
  locations which provide an exit that's an alias of one of the reactive
  properties, like react_before.
- Fixed _FixIncompleteSentenceOrComplain bug when completing sentences that
  match patterns that include the topic token
- You can now specify up to 9 adjectives + 9 nouns for a cheap scenery object,
  by entering 10*adjectives+nouns and then the words, e.g. 
  23 'small' 'green 'ant' 'insect' 'animal' "It's so small!".
- SceneryReply gets the first adjective and the first noun for the matched
  cheap scenery object as parameters word1 and word2.
- Breaks backward compatibility: A cheap scenery object having the value
  CS_NO_ADJ ( =1 ) as its first value, would get word1 = 1 when SceneryReply
  was called. It will now get word1 = 0, to make the behaviour coherent with
  when the first value is 2-9 (object has multiple nouns but no adjectives).
- New cheap scenery routines, meant to be used in SceneryReply: 
  CSHasAdjective(x) returns true if x is one the adjectives for the last
  matched cheap scenery object. CSHasNoun(x) does the same thing for nouns.
  CSHasWord(x) returns true if x is either an adjective or noun for the
  object. Programmers can use values 200-600 as markers to trigger certain
  behaviours in SceneryReply.
- New talk menu routine: TMPrintLine, prints a line spoken by the player or 
  an NPC. Author can define their own version before including talk menu.
- talk menu: Author can add a string or routine before and/or after the 
  player's line, to convey non-verbal events and reactions. Add one of the
  following constnants just after the topic: TM_ADD_BEFORE, TM_ADD_AFTER,
  TM_ADD_BEFORE_AND_AFTER, then add the strings/routines before and/or after
  the player's line.
- talk_menu: A string can now be used as an effect of a topic.
- talk_menu: To mute a line by the player or an NPC, replace it with
  TM_NO_LINE.

=======
v4.4: bug fix and new feature release (18 March 2023)

- Replaced some veneer routines with shorter versions (optimized and not 
  printing error messages) when building a game without DEBUG or Strict mode,
  and with RUNTIME_ERRORS set to 0.
- Optimized DrawStatusline, making it 9% faster and a few bytes smaller.
- Minor optimization in parser, making it a little faster and smaller.
- Fixed serious bug in talk menu extension - if you specified a routine to be
  run if a certain option was selected, and the story file was larger than 
  half the maximum story file size for the Z-code version, it would result
  in runtime errors.
- Extended howto/talk_menu.inf to demostrate how to customize the messages
  printed by the talk_menu extension.
- Made the dashes array in talk_menu static.
- Functions in flags extension can now take up to three flags in a call, e.g.
  if(FlagIsSet(F_BOB, F_STEVE, F_LINDA)) returns true if all three flags are
  set. To make this work, flag number 0 has been deprecated. Old code using
  flag 0 will still work, but will produce a warning in debug mode.
- Fixed a bug in _PrintPatternSyntax to handle patterns with routine calls
- Optimized code to run react_before, react_after and each_turn, making it
  100+ bytes smaller.
- New optional feature OPTIONAL_MANUAL_SCOPE_BOOST, speeding up turns for
  games with manual scope updates, where the player will often have many 
  non-reactive objects in scope. More info in the manual. 
- Fixed a bug where a wide list would print "which contains is ..." for
  a container placed on a supporter.
- Default value of MAX_SCOPE is changed from 32 to 50.
- Game author's guide has been updated and content reordered. *Every* author
  should read chapter 1-3.

=======
v4.3: bug fix and new feature release (2 February 2023)

- Non-existent constants MSG_LOCK_YOU_CANT, MSG_UNLOCK_YOU_CANT and 
  MSG_WEAR_YOU_CANT were mistakenly referred to in messages.h, instead of the
  constants that should have been used.
- Added runtime error for when a door fails to define door_to or door_dir.
- Error message when you try to start a timer and the object lacks the
  time_out property now prints the offending object.
- Routine RunTimeError was renamed to _RunTimeError, to reflect that it's
  not a routine game programmers are likely to call.
- Updated library messages to reflect when the noun has pluralname:
  - That's hardly portable => That's/They're hardly portable
  - That's not something you can open/close/enter/lock/unlock/wear => You 
    can't [verb] that/those
  - That's fixed in place => That's/They're fixed in place
  - That's plainly inedible => That's/They're plainly inedible 
  - It's already open => It's/They're already open
  - It seems to be locked => It's/They're locked
  - You can't put things on top of that => You can't put things on top of 
    that/those
- Fixed a lot of minor issues in the manual.

=======
v4.2: bug fix and new feature release (21 January 2023)

- Added entry point routine ChooseObjectsFinal, letting the programmer
  influence the final choice of object.
- Added a demo game howto/indistinguishable.inf to show how a game can
  have (a small number of) indistinguishable objects.
- Fixed visibility_ceiling bug which prevented correct calls in PlayerTo
  and removed the visiblity_ceiling global.
- Improved parsing of multiexcept so disambiguation doesn't give the same
  priority to objects in/on the second noun phrase in the grammar.
- Fixed bad parsing of 'get Xs and Y' patterns, i.e. where the Xs is a word
  in plural form, possibly referring to several objects. 
- Fixed warnings and confusing text in test programs.
- Changed weight of ChooseObjects score to make it always trump library score.
  This is how it works in the standard library too.
- Added an optional suffix to the library version, e.g. "dev" for v4.1dev.
- Added suggestion to Game Author's Guide to initialize the talk_menu 
  extension manually.
- Internal routine _CheckNoun was renamed to _ParseNounPhrase. The constant
  to make it print debug information was renamed to DEBUG_PARSENOUNPHRASE.

=======
v4.1: bug fix and new feature release (19 November 2022)

- Routines _CheckNoun, _CheckPatterns renamed to _ParseNounPhrase, 
  _PrintGrammarPattern.
- _ParseNounPhrase routine has been made smaller and faster.
- Fixed a bug where patterns containing prepositions that didn't match
  at all didn't produce any response from the parser.
- Allow author to define timer_order as a common property if they want, when
  using OPTIONAL_ORDERED_TIMERS.  
- Fixed a bug where direction variables were incorrectly set for 
  non-directional nouns when the parser was perfoming an action for a list 
  of objects, i.e. "TAKE EAST AND BOOK".
- Added OPTIONAL_LANGUAGE_NUMBER to support the routine LanguageNumber(n), to
  print e.g. "twenty-five".
- Added OPTIONAL_LIST_TOGETHER to support list_together property (but 
  indistinguishable objects are still not supported).
- Added howto/list_together.inf
- Improved differentiation between directions and objects that caused a bug
  in the Cloak of Darkness game ("x floor" referred both to down and floor)

=======
v4.0: bug fix and new feature release (11 May 2022)

- Fixed 'ask actor to topic' conversion to 'actor, topic' (issue 107)
- Library now runs _NoteObjectAcquisitions whenever child(player) has changed,
  so forgetting to set update_moved typically doesn't cause problems.
- Stopped 'again' from triggering an endless loop after an empty input line
- Fixed 'ask George to look' and similar to generate the <verb> order callback
- Bugfix: Setting second to the first word in topic for ##Tell
- Parser won't try to auto-take object for a held token, if the object has
  static, scenery or animate, except animate objects which have been made
  takeable through the use of a DisallowTakeAnimate routine. This allows before
  routines to react to "eat whale", "attack troll with steamroller" etc.
- Cheap scenery description routines are now reaction routines, which work like
  before routines, allowing them to trap all actions on the object.
- Support for global no_implicit_actions, to let game tell library not to use
  implicit actions.
- _ImplicitGrabIfNotHeld routine has been renamed to ImplicitGrabIfNotHeld
  and has been documented in the manual and quickref document.
- _ImplicitDisrobeIfWorn routine has been renamed to ImplicitDisrobeIfWorn
  and has been documented in the manual and quickref document.
- 'look north' etc. now works

=======
v3.6: bug fix and new feature release (12 April 2022)

- ext_talk_menu has a new global variable talk_menu_talking. A routine in
  talk_array can set it to false to end the conversation prematurely.
- Added strict mode indicator for v5 (issue 104)
- Improved 'take off' for objects not being worn (issue 103)
- Added a way for SceneryReply routine (used with cheap scenery extension)
  to tell different inline parse_name routines apart.
- Added howto/cheapscenerydemo.inf to show how to use Cheap Scenery.
- Added 'enter' and 'exit' for in_dir, out_dir in rooms (issue 105)
- Minor optimisations for speed and size in handling of ordered timers.
- Fixed GuessMissingNoun bug for phrases with missing noun without second.
- Added feel, fondle and grope as synonyms to touch.
- Fixed pattern scoring bug when some patterns contained the scope token.
- Added messages for empty inputs (issue 106)
- Minor optimizations for speed and size in parser.

=======
v3.5: bug fix and new feature release (14 February 2022)

- Don't print the option to UNDO if the player has won the game, only if they
  lost.
- If the game defines DEATH_MENTION_UNDO, print the option to undo even if the
  player won.
- Don't print the option to UNDO if the interpreter says it doesn't support it.
- Slight optimization of Directions.parse_name for z5.
- Fix routine _ListObjsMsg in grammar.h, which was called with one argument
  but didn't have any local variables, as this caused a warning in Infocom's
  terps for Motorola 68K platforms.
- Fixed grammar property bug, where -verb responses has a bad parser offset
- The grammar property is now checking the parser_one variable to make sure
  that -verb replies are parsed correctly regardless of memory allocation.
- New extension: ext_talk_menu.h, for menu-driven conversations.
- New example game: howto/talk_menu.inf
- PunyInform now expects the Inform compiler to be version 6.36.

=======
v3.4: bug fix and new feature release (2 January 2022)

- _IsSentenceDivider was using dictionary words directly for 'then' and 'and'
  although there are constants to be used. Fixed.
- Slight optimization in Direction.parse_name
- ext_menu.h got a new constant EXT_MENU_STDLIB_MODE - if defined, item_width
  should be set to half the name length of the item, just the way DoMenu works
  in the standard library (issue 96)
- Fixed bad messsage for enter action with missing preposition (issue 95)
- Fixed missing "(which is empty)" for container holding only scenery or
  concealed objects (issue 99).
- Added grammar for "look on table" (issue 97).
- Improved "search (supporter)" message to use is/are more correctly.
- Improved PrintContents to use is/are more correctly for supporters.
- Changed workflag-parameter for PrintContents to be called p_style. It can be
  omitted or 0, or you can add one or more bit values. The ones currently
  supported are ISARE_BIT (print "is" or "are" before list), WORKFLAG_BIT
  (only print objects which have workflag set), and NEWLINE_BIT (print each
  object indented, on a new line). Existing calls to PrintContents don't have
  to be changed.
- Added new mode for calling PrintContents: p = PrintContents(1, obj). Returns:
    0 if there are no printable objects in/on p_obj
    1 if there's exactly one printable object and it doesn't have pluralname
    2 if there are 2+ printable objects or one object with pluralname
- New routine _IsAreString(p) to return string "is " or "are ". Used by
  _PrintContents. Note: Not a public routine.
- Added comments to all messages in messages.h which receive one or two
  arguments.
- More precise error messages failing with a missing preposition.
- Game code can change the inventory format by setting inventory_format to
  0 (tall) or 1 (wide).
- New constant OPTIONAL_FLEXIBLE_INVENTORY enables "i tall/wide" to switch
  inventory format.
- New public routine FastSpaces(n) to print n space characters efficiently.
- ext_cheap_scenery has a new option: Give CS_PARSE_NAME (=2) as the adjective
  value and a routine that works like a parse_name routine as the noun value
  to allow for long names and names with certain rules. However, two items in
  the cheap_scenery list can never compete - the first one that matches at
  least one word wins.
- ext_cheap_scenery has a new option: Give CS_ADD_LIST (=3) as the adjective
  value and an object as the noun value and a property name as the description
  value, to include a list of cheap scenery objects in the current list.
- New optimization tip added to Game Author's Guide.

=======
v3.3: bug fix and new feature release (18 December 2021)

- Added a 'score' verb for games with no score, which just prints a message
  saying there is no score in this game.
- Exclude code to call LibraryMessages unless it's defined.
- Stopped the parser from trying to pick up object for Held grammar token
  when actor isn't player.
- Added an example of how to add random comments to a game
  (howto/comments.inf).
- Fix so noun is the first recognized word in topic, and second is the actor,
  when action == ##NotUnderstood
- Fix so that NPC's can't use wildcards, such as "take all"
- Fixed bug which made parser not recognize NPC name if player first did
  "go (direction)" or asked an NPC to do it, e.g. "John, go east"
  "John, take the sweater".
- Set lower priority in parser for objects that aren't held when issuing an
  action that expects a held object.
- Set lower priority in parser for held objects when issuing a Take command,
  even for NPCs.
- Implemented ChooseObjects
- Improved parsing of complex disambiguation messages such as
  'get blue book and books' and 'get blue book and all books except blue'
- Fixed bad call to each_turn when aborting a disambiguation question

=======
v3.2: bug fix release (11 November 2021)

- Updated techreport.
- Added markdown version of QuickRef document.
- Don't print "(providing light)" for animated objects with light attribute.
- Added missing ##Going after rule call when moving between rooms.
- Fixed bad NPC order handling (##NotUnderstood and ##Answer callbacks).
- Fixed scope token handling of pattern with more than one object.
  Now the scope modification is only valid during the parsing of the
  scope token, and then reset to normal scoping rules.
- _UpdateScope changed so it remembers if the last calculated scope was
  for a scope routine.
- ext_menu.h and ext_quote_box.h now force a resplit for the statusline
  upon exit.
- Fixed bad is/are for MSG_SEARCH_CANT_SEE_CLOSED (issue 92)
- Fixed ThatorThose response for the player object (issue 91)
- Fixed bug in howto/change_player.inf that was introduced in v3.0 and
  made nothing work as it should with the PC swapping.
- Made non-transparent actors have their possessions in scope.
- Fixed setup of noun/second for NPC orders.
- Added error message when addressing a misspelled or missing NPC.
- Added an error message when player is giving a too vague specification
  of an object in an order to an NPC.
- Optimized parser to gain some speed and make it a little smaller.
- Made Banner() smaller by checking if Story and Headline are defined.
- Optimized lookmode messages, to make minimal library smaller AND
  allow for more generic abbreviations which will benefit games better.
- Updated the abbreviations.
- Updated quickref document.
- Fixed parser bug which would sometimes make it print "I think you wanted to
  (verb) *someone*" when it should have been *something*.

=======
v3.1: bug fix and new feature release (23 October 2021)

- Fixed two incorrect direction names in howto/custom_directions.inf.
- Changed so library doesn't check if header says it's a timed game
  before updating time, if STATUSLINE_TIME has been defined.
- Fixed noun/second setup for Consult, Answer and Ask action.
- Added UNDO to end of game message.
- Fixed so we don't risk duplicates in scope when InScope is used.
- OPTIONAL_GUESS_MISSING_NOUN function would sometimes reveal a concealed
  object.
- removed ObjectIsInvisible which is no longer needed. Use TestScope instead.
- Remove duplicates from match list when player specifies same object twice
  for a multi token.
- When parse_name returned -1 wn was not reset.
- Optimized _CheckNoun to save 70 bytes.
- Optimized code order to let virtual memory systems shift out parts of the
  library for long times, for speed.
- Added support for ParseNoun, at the cost of ~20 bytes if you use it, and no
  cost if you don't. Called *before* parse_name, unlike I6lib.
- Fixed error reporting from ParseToken with TT_SCOPE parameter.
- Fixed that actions sometimes didn't print a message in large games.
- Fixed compile-time error if SACK_OBJECT and OPTIONAL_NO_DARKNESS were defined.
- Implemented the grammar property as described in DM4.
- Fixed a bad noun flag test in _CheckNoun.
- Fixed bad num_words value after disambiguation question.
- Fixed a side effect from the num_words fix above (issue 90)
- Fixed error reporting from general parse routines.
- Fixed bug in scope routines that match multiple nouns.
- Fixed that a direction instead of a disambiguation reply didn't work.
- Fixed so that parser_action can be set to PluralFound in parse_name.
- Optimized disambiguation code to save ~70 bytes.

=======
v3.0: bug fix and new feature release (20 September 2021)

- Part of the message MSG_RESTART_RESTORE_OR_QUIT was compiled even if
  the message had been replaced by the game, wasting space and printing a
  warning.
- Fixed some action routines which didn't set scope_modified when they
  should.
- Fixed bug which made for incorrect display when player didn't carry
  anything, if MSG_INVENTORY_DEFAULT had been replaced.
- ##Wait now runs after-routines.
- ##Inv now runs after-routines, even if the player is empty-handed.
- Optimized running of after-routines in action routines, saving ~140
  bytes.
- Changed so "routines on" doesn't print double messages under z5+.
- Added code so parse_name calls are also printed after "routines on",
  under all Z-code versions.
- Added constant CUSTOM_PLAYER_OBJECT - set it to your own player object,
  and the library won't create the default selfobj.
- Optimized parsing of directions, saving 84 bytes in minimal config.
- Removed deprecated arrays abbr_direction_array and
  full_direction_array.
- Added file howto/custom_directions.inf to show how one can create a
  custom set of directions, complementing or replacing the standard
  directions.
- Fixed pattern offset bug in error handling of incomplete noun lists,
  leading to better error message for input like "take ball and"
- Added documentation on statusline to manual.
- Actions defined by ext_waittime.h now run AfterRoutines() as well.
- Changed direction_properties_array to be a byte array instead of a
  table. This means it must be accessed with "->" instead of "-->", and
  the first entry does not hold the number of elements.
- Changed direction_name_array to be a word arrary instead of a table.
  This means the first entry does not hold the number of elements.
- Slight updates to game author's guide, hopefully making it clearer.
- Fixed parser problems when player refers to multiple directions in one
  command, like "take e and w" or "push e w", since direction object
  can't remember different matches.
- Fixed so Directions object remembers the correct direction even when
  the parsed sentence contains an object that begins with a direction,
  like "look to the east of the north statue" (in a game where the look
  verb has been extended to allow this).
- Changed compiler requirements to Inform 6.35

=======
v2.8.3: bug fix release (26 August 2021)

- Fixed compilation error when building with OPTIONAL_NO_DARKNESS.

=======
v2.8.2: mistake, identical to v2.8.1 (26 August 2021).

=======
v2.8.1: bug fix release (26 August 2021)

- The library version is now printed correctly at start of game and when player
  enters VERSION. Documentation updated.

=======
v2.8: bug fix and new feature release (26 August 2021)

- Slight updates to Game Author's Guide
- Fixed a bug in _UserFilter which caused problems when using a filter function
  for second.
- Added howto/pushdir.inf to show how to program items that can be pushed to
  other locations.
- Removed the common property "number".
- Changed all message identifiers ending with "_SUCCESS" to end with
  "_DEFAULT" - MSG_ANSWER_SUCCESS, MSG_ASK_SUCCESS, MSG_ASKFOR_SUCCESS,
  MSG_ASKTO_SUCCESS, MSG_ATTACK_SUCCESS, MSG_CLOSE_SUCCESS,
  MSG_DISROBE_SUCCESS, MSG_EAT_SUCCESS, MSG_ENTER_SUCCESS, MSG_EXIT_SUCCESS,
  MSG_GIVE_SUCCESS, MSG_INSERT_SUCCESS, MSG_INVENTORY_SUCCESS,
  MSG_KISS_SUCCESS, MSG_LISTEN_SUCCESS, MSG_LOCK_SUCCESS, MSG_OPEN_SUCCESS,
  MSG_PULL_SUCCESS, MSG_PUSH_SUCCESS, MSG_PUTON_SUCCESS, MSG_REMOVE_SUCCESS,
  MSG_SAVE_SUCCESS, MSG_SCORE_SUCCESS, MSG_SHOUT_SUCCESS, MSG_SHOUTAT_SUCCESS,
  MSG_SHOW_SUCCESS, MSG_SMELL_SUCCESS, MSG_SWITCH_OFF_SUCCESS,
  MSG_SWITCH_ON_SUCCESS, MSG_TAKE_SUCCESS, MSG_TELL_SUCCESS,
  MSG_THROW_SUCCESS, MSG_TOUCH_SUCCESS, MSG_TURN_SUCCESS, MSG_UNLOCK_SUCCESS,
  MSG_WAIT_SUCCESS, MSG_WAKE_SUCCESS, MSG_WAKEOTHER_SUCCESS, MSG_WEAR_SUCCESS
- Changed so complex library messages shared by multiple identifiers are now
  omitted if all identifiers have been replaced by custom messages.
- Changed InsertSub and PutOnSub to call a common routine, to save bytes.
- Fixed bug: TryToTakeNoun would return true, signalling that take failed,
  if original supporter/container's after routine returned true for ##LetGo.
- Added support for "move object to floor" (gets translated to
  "get object. drop it")
- MSG_REMOVED_CLOSED has changed from "The (object) is closed." to
  "You can't, since the (object) is closed."
- MSG_ENTER_NOT_OPEN, MSG_EXIT_NOT_OPEN, MSG_INSERT_NOT_OPEN,
  MSG_GO_DOOR_CLOSED, MSG_EMPTY_IS_CLOSED, MSG_REMOVE_CLOSED now print
  "are closed" for pluralname objects.
- TransferSub no longer tries to drop something if it couldn't be picked up.
- TransferSub now runs AfterRoutines().
- New messages: MSG_INSERT_ANIMATE, MSG_PUTON_ANIMATE, MSG_TRANSFER_ALREADY.
- Removed message MSG_EMPTY_CANT_CONTAIN.

=======
v2.7: bug fix and new feature release (19 July 2021)

- Removed the text "revealing..." when opening a container from the inside.
- Added grammar for "shout (topic) at (creature)", triggering the Answer action
  ('to' was recognized before, 'at' is a new synonym)
- Added a new action ShoutAt, triggered by "shout to/at (noun)"
- Added grammar for "jump in (noun)", triggering the Enter action. ('into' was
  recognized before, 'in' is a new synonym)
- New constants OPTIONAL_SL_NO_SCORE and OPTIONAL_SL_NO_MOVES to hide score and
  moves from the statusline in z5+ games. Defining NO_SCORE will define
  OPTIONAL_SL_NO_SCORE automatically.
- Added routines NumberWords and WordValue (described in DM4)
- Moved PronounNotice routine to a better place in parser.h, considering
  virtual memory handling in Ozmoo and other 8-bit terps.

=======
v2.6: bug fix and new feature release (8 June 2021)

- Fixed a pronoun update bug when trying to talk to inamimate objects.
- Added rule to not include held objects when disambiguate for the take action
- Added 'sniff' as a synonym to 'smell'
- Made statusline drawing faster in ext_menu.h (only affects z5+).
- Made RunRoutines() faster for all common properties.
- Try to set scope_modified in the correct places in the library files.
- Changed so 'shout' is not a synonym of 'say' but has its own grammar and has
  'scream' and 'yell' as synonyms. "shout hello to John" still triggers the
  ##Answer action. "shout hello" or just "shout" triggers the new ##Shout
  action.
- Made the noun guessing code faster and shorter.
- Made 'place' a synonym of 'put'.
- Now printing all prepositions when complaining that the input is incomplete
- Parsing "go" (without a direction or object) correctly.
- Fixed so that noun filters are applied when parsing pronouns.
- Improved message for incomplete sentences ('take ladder and')
- Improved messages for putting things in/on itself.
- Fixed broken 'again me' response (issue 81)
- Fixed shortname for Directions ('put sweater in s')
- Changed PushDir to use the ADirection filter for the direction argument
- Fixed that consult_words sometimes held a value when it shouldn't.

=======
v2.5: bug fix and new feature release (14 May 2021)

- Changed the library messages for searching a container or supporter
  (MSG_SEARCH_IN_IT_ISARE, MSG_SEARCH_ON_IT_ISARE)
- The (undocumented) routine SearchInOnNoun() was removed.
- Fixed warning in ext_cheap_scenery when SceneryReply is not defined.
- Changed so "actions" debug verb doesn't print object name when noun or second
  is a number.
- Changed 'moved' and scoring to work like I6, added _NoteObjectAcquisitions
  Note: Game author must set update_moved to true when moving objects into
  player's inventory!
- Fixed: MoveFloatingObjects didn't set scope_modified.
- Fixed bug: QuoteBox cleared the screen in z5, even when the second parameter
  was set as to not wait for keypress, making the quote box disappear
  immediately.
- Fixed a bug that made it impossible to customize
  MSG_PARSER_BAD_PATTERN_PREFIX and MSG_PARSER_BAD_PATTERN_SUFFIX.
- Messages MSG_PARSER_BAD_PATTERN_PREFIX and MSG_PARSER_BAD_PATTERN_SUFFIX
  were changed to be complex messages instead of static strings.
- Fixed bug in ext_quote_box.h which made quote box stay on screen forever.
- Changed newlines before and after quote box.
- PunyInform Technical report added (documentation/techreport.pdf)
- Fixed a bug in scoring objects with the scored attribute. (Bug was introduced
  in v2.5)
- Changed MSG_TAKE_ALREADY_HAVE from a static string to a complex message,
  merging it with another message.
- Fixed a bug where patterns with 'topic' got too much impact (issue 77)
- Game Author's Guide has been updated with more material on optimization,
  thanks to Hugo Labrande.

=======
v2.4: bug fix and new feature release (20 April 2021)

- Fixed bug in ext_quote_box (which crashed some interpreters in z3 just after
  quote box was printed.)
- Fixed bad parsning of topic followed by multiple preposition alternatives.
- Merged a library message into another, to save some bytes.
- Removed before and after for thedark.
- Changed so before and after are run for real_location rather than
  location.
- Reworked howto/semidark.inf to work without using thedark.before().
- Added climb and climb up/over to grammar, new action Climb.
- Improved parser response when refering to objects outside scope (issue 75)
- Fixed so cant_go property can hold a routine or string, not just a string.
- Reordered properties to put those that have to be fast at the end.
- Improved detection of pluralword flag when parsing a noun phrase
- Improved selection of incomplete patterns ("show XXX" with missing obj)
- Fixed consult_from bug (would only work the first time)
- Switched to fixed-width font for quote box in z3.
- Added a second parameter for QuoteBox() to not wait for keypress after quote
  box.
- Fixed bug in detection of multiple words from the room's name property

=======
v2.3: bug fix and new feature release (8 April 2021)

- Made use of reactive attribute for add_to_scope as well, and (optionally)
  for parse_name.
- Better parser response when a dictionary word failed to parse a noun
- Made _UpdateScope code shorter
- Fixed scope bug: add_to_scope was not run for the objects in an add_to_scope
  list.
- Added objects in the dark to scope.
- Added AddToScope as a synonym for PlaceInScope.
- The death/win message is now printed in bold in z5.
- Removed full stop after You have won/died messages.

=======
v2.2: bug fix release (27 March 2021)

- Changed so BeforeRoutines() is not executed for meta verbs (issue 74)
- Fixed 'take all except X' offset error
- Fixed take multiple bug (would silently ignore held objects)
- Changed when scope_modified is set, for PutOn, Insert, Take, Drop and Purloin
- Made ExamineSub return correctly after printing "There's nothing special
  about (the item)."
- The banner now has an empty line first, just as in I6 lib.
- OPTIONAL_PRINT_SCENERY_CONTENTS will no longer cause Look to print contents of
  objects which have concealed attribute, unless they *also* have scenery.
- The global "turns" now holds -1 until the first turn begins, at which time
  it's set to 0.
- NO_SCORE constant is now supported and saves 310+ bytes if defined.
- Optimized matching of directions.
- Removed superfluous global scope_copy_is_good
- Better parser response when grammar missing (e.g. Extend 'close' replace;)
- Better parser responses when trying to parse unknown words
- Better parser responses to bad input such as 'i blue' and 'open all'
- Better parser response when list of nouns found where it isn't allowed

=======
v2.1: bug fix and new feature release (5 March 2021)

- New entry point routine: DisallowTakeAnimate. Have it return false if the
  player should be able to pick up noun.
- Implicit actions only occur when the actor==player, to stop for example
  "bob, give me knife" from doing unexpected things with the knife.
- Made GetScopeCopy faster.
- Removed unnecessary check for duplicates in ScopeWithin.
- Made UpdateScope avoid adding duplicates when called after a scope routine
  which has already added objects.
- Optimized checking of react_before and react_after.
- Added attribute reactive which must be set for all objects providing
  react_before, react_after or each_turn. By default it is set automatically at
  game start, but an author can define OPTIONAL_MANUAL_REACTIVE to set it
  manually. The use of this attribute speeds up the game.
- Added debug verb "debug reactive" which shows objects which need to get or
  lose attribute reactive.
- Fixed bug in handling fake directions, which made code like <GO FAKE_N_OBJ>
  break every time.
- Optimized loops in BeforeRoutine, AfterRoutines and RunEachTurn.
- Optimized so scope_copy can often be reused several times.
- Moved oops, again and score notifications messages to messages.inf
- Fixed "x me.g.g" bug (disallowing complex again commands)
- Fixed pattern filter bug that stopped some commands from reaching phase 2.
- Fixed bug that didn't restore scope after using a scope=XXX grammar token.

=======
v2.0: bug fix and new feature release (17 February 2021)

- Added OPTIONAL_SIMPLE_DOORS for an easier way to create doors, which also
  saves space if you have more than six doors.
- Referring to undefined pronouns now give better responses (issue 68)
- Fixed something/someone response when second missing (issue 70)
- Changed to allow multiexpect to respond without filtering (issue 71)
- Changed to show concealed/scenery items in inventory lists (issue 72)
- Added new Game User's Guide
- Fixed creature testing bug (issue 73)
- Changed so the capacity property is an alias of nw_to, to save a common
  property. This leads to capacity not having a proper default value. To read
  the capacity property, call ObjectCapacity(object). The default value is the
  value of the constant DEFAULT_CAPACITY, which is 100 unless the game code
  defines it.
- Added optional undo support
- Added OPTIONAL_SCORED to support the 'scored' attribute for places and
  objects. NOTE: Games that use scored will now need to define this!
- Added a line to summary in FullScoreSub, for "noteworthy actions". This sums
  up score added in code, like "score = score + 10;".
- Moved messages from FullScoreSub to messages.h

=======
v1.9: bug fix and new feature release (17 January 2021)

- Fixed bad quit message (issue 56)
- Print a newline before calling Initialise for v5 games, so first line of
  text isn't covered by statusline.
- Added code to howto/change_player.inf so all would-be PCs accept gifts from
  the player.
- Made scope update at turn start rely on scope_modified_flag.
- Fixed bug where "get off (supporter)" would not let the supporter's after
  routine react to the Exit action.
- Changed MSG_OPEN_SUCCESS to also reveal the contents of the container being
  opened, if the container is non-transparent.
- Added constant OPTIONAL_NO_DARKNESS which removes handling of light and dark.
- Fixed bug with scope not being updated when the player is in a dark
  container and opens it.
- Fixed bug in BeforeParsing call
- Fixed inconsistent message format (issue 58)
- Added auto-disrobe action for actions Drop, ThrowAt, Insert and PutOn.
- Put auto-take message in messages.h as MSG_AUTO_TAKE.
- DROP ALL and PUT ALL IN BOX will no longer include worn objects.
- Stopped 'held' and 'creature' no match all and all-but sentences.
- Changed PrintMsg to be a global variable, to save 150+ bytes. Doesn't affect
  anything from a game programmer's point of view.
- Fixed issue 60 (parsing error with multiple sentences containing directions)
- Removed empty lines before room descriptions to fit more on small screens
- Fixed bug in matching of 'creature' token.
- Added OPTIONAL_ORDERED_TIMERS, allowing programmer to decide order of
  different timers/daemons.
- Changed multiexcept token to generate before/after calls for all objects
- "put me in box" is changed to "enter box" (a before routine can capture any of
  the actions). Same with "put me on chair".
- Added 'them' as a pronoun for pluralname objects
- Rewrote CheckNoun to improve Disambiguation (issue 63)
- New feature: To make sure debug verbs like purloin can match an object which
  has a parse_name routine and may not have a parent, define a routine
  DebugParseNameObject(object) which returns true if the object is such an
  object. (See manual, under Debugging)
- Fixed bad restore failed message (issue 64)
- Added MSG_LOOK_BEFORE_ROOMNAME to be able to customize look descriptions
- Fixed code that was needed for some debug commands but was never compiled.
- Fixed problem with compiler not finding DebugAttribute when compiling for v5
  with strict error-checking.

=======
v1.8: bug fix and new feature release (27 November 2020)

- fixed location test in GoSub for vehicle movements in the dark
- Fixed that 'a' (character) was used instead of 'a//' (dictionary word) when
  skipping articles to set noun and second to dictionary words for Ask etc.
- fixed bad parser message for incomplete sentences in patterns that
  use routine filters
- fixed bug in ScopeWithin
- fixed bug in call to TT_PARSER_ROUTINE
- improved _GrabIfNotHeld and related unit tests (issue 40)
- The cheap scenery extension doesn't let through the Search action any more
  in its before rule, which allows the game author to give a custom response
  for that action instead.
- The cheap scenery extension now allows for the SceneryReply routine to check
  which cheap scenery "object" was matched - it gets the two words specified
  for the "object" as two parameters. See example in ext_cheap_scenery.h
- If a switchable object has a string for description, or a routine which
  returns true, "examine [object]" will no longer add a text saying whether the
  object is currently switched on or off.
- Fixed broken "restore failed" message when RestoreSub is called after game has
  ended.
- Removed extra space after "You have won/died"
- Added scoring notifications even on the final turn of the game, just before
  you win/die/lose.
- Moved all processing that happens at the end of a turn to a routine called
  EndTurnSequence(). This can be called by a WAIT command to simulate that
  turns happen, should anyone want to implement a WAIT command.
- Added checks so each_turn processing is stopped if an each_turn routine
  ends the game, or if a daemon or timer ends the game. Also, TimePasses()
  isn't called if a timer, daemon or each_turn has ended the game.
- Changed so turns / clock is advanced before timers, daemons, each_turn
  and TimePasses() at the end of the turn.
- Now printing the score at the end of the game, tests also added (issue 49).
- Changed to use sys_statusline_flag to detect that it's a game with time on
  the statusline.
- Added that Look will print what is in/on containers/supporters which have
  either scenery or concealed, if constant OPTIONAL_PRINT_SCENERY_CONTENTS
  is defined.
- Fixed bug where "Score" or "Time" would not be printed on statusline if the
  room name was too long.
- Started using same message for MSG_INSERT_NOT_CONTAINER and
  MSG_EMPTY_CANT_CONTAIN.
- Fixed bug where numbers and parse routines got a bad pattern score.
- Fixed bug where 12:xx AM was printed as 0:xx AM on statusline.
- Added extension ext_waittime.h
- Added constants STATUSLINE_TIME and STATUSLINE_SCORE, to include only the
  code needed for the type of statusline used in the game.
- Fixed bug which put location in scope in darkness.
- Made TheDark object more flexible by adding properties before and after.
- Fixed bug in centering menus on screen, in ext_menu.h. Issue #55.
- Added howto/semidark.inf, a demonstration of how one can implement almost dark
  rooms.

=======
v1.7: bug fix and new feature release (4 November 2020)

- added a test suite for regression checks
- selfobj (the default player object) now has describe property, but not the
  unsupported before_implicit.
- Objects which have scenery or concealed no longer get the chance to be
  printed by Look, even if they have initial, when_open, describe etc.
- Added a code example in howto folder for having multiple player characters.
- Replaced THEN_WORD with THEN1__WD for I6 compatibility
- Fixed bug in MoveFloatingObjects which caused objects to disappear if one
  floating object had absent attribute.
- Made 'unknown word' messages customizable
- Fixed dropping objects from supporters bug
- Improved incomplete switch command replies
- Added OPTIONAL_SHIP_DIRECTIONS which makes PunyInform recognize 'fore', 'f',
  'aft', 'a', 'port', 'p', 'starboard', 'sb' as synonyms for north, south,
  west, east.
- Added globals normal_directions_enabled and ship_directions_enabled to select
  which directions currently work.
- Fixed InScope bug and added test files to verify that it is working.
- The parser can now handle input like 'get all but <object>'
  getallfrom.inf test added to check this and similar patterns.
- PunyInform now informs when the score goes down, and well as up.

=======
v1.6: bugfix release (21 September 2020)

- GET ALL FROM [supporter] could make parser complain that the supporter isn't
  open.
- GET ALL FROM [object] would not take anything unless the object was a static
  or scenery object.
- Missing full stop in parser error message "I don't understand that sentence."
- creature_object wasn't properly handled by the parser.
- Simplifed the parser by making use of the meta attribute of all debug verbs
- When add_to_scope held a list of objects, each object *and all siblings* were
  added to scope.
- Now inp1/inp2 are updated in PerformAction
- Changed unknown verb response to make reply clearer
- Removed testlights.inf and nada.inf since they were more confusing than
  useful.
- Fixed 'drop X' parsing bug when X present but not held.
- Fake action ##Going is now sent to destination room's before routine
  just before the player enters.
- Look now sets the action to ##Look when calling AfterRoutines, even if Look
  was called by the Go action or some other action.
- There was code in scope.h which would not compile if DEBUG_SCOPE was defined
  but not DEBUG.
- Fixed so DROP with a single object doesn't print the object name first,
  unless it's a plural or ALL which happens to yield a single object.
- Made plurals trigger that object names are printed, so "TAKE BALLS" may print
  "red ball: Taken."
- Fixed a noun parsing bug which typically made purloin not work at all if any
  room provided a sw_to property.
- Made purloin safer by not allowing you to pick up yourself or something
  you're in.
- GET ALL FROM BOX issued a ##Remove action for the first item and then a
  ##Take action for each of the remaining objects.
- Changed sw_to / parse_name printing to use a new buffer called printbuffer,
  not to interfere with parser's use of buffer2.
- held (GrabIfNotHeld) didn't check implicit take status properly.
- Fixed an error where "drop books" when not holding any books still referred
  to the first book in scope
- Fixed wn offset error in GetNextNoun which caused problems with plurals
- wrong word order in disambiguation caused parse_name to fail
- Fixed error where multiinside silently ignored some inputs
- Fixed: bad combinations of adjectives and nouns messed up disambiguation code
- Improved disambiguation for plurals to make "get all red" work
- Now allowing more than one word inputs in disambiguation
- Changed disambiguation prompt
- If bag is in box which is on table, and player is on table and types
  ENTER BAG, (s)he now gets "You have to enter the box first." instead of
  "You have to leave the table first."
- Added a "howto" directory, for small games demonstrating how to do implement
  various clever objects and behaviours.
- Added a howto-game with an object which has an initial description and shows
  its own contents both in room descriptions and when being examined.
- Fixed double error messages when auto-taking objects.
- Fixed bug in Library of Horror which could give player more than max score.
- Changed so LibraryMessages can only replace messages which the game has
  declared constants for, and it *has to* replace them. This also means
  it doesn't matter what LibraryMessages returns.
- Improved minimal.inf to be clearer on what goes where.

=======
v1.5: new feature, optimization and bugfix release

- Before including globals.h, the game can now define the constant
  INITIAL_LOCATION_VALUE and set it to the object where the player should
  start. This makes sure location is set right when the game starts, so
  interpreters that display a statusline immediately (like the Gameboy
  interpreter) don't run into problems. If the game defines this constant,
  there is no need to set the location in the Initialise routine.
- Printing the game banner has been moved to a routine named Banner(), just
  like in I6 lib.
- A game can now make the library skip the game banner when the game starts, by
  returning 2 from Initialise(), just like in I6 lib.
- An extra newline was printed in Look if the player was in/on an object which
  didn't provide an inside_description.
- A newline was missing in Look when a room description was not printed (when
  brief or superbrief lookmode was enabled).
- The statusline showed the real location in z3, when the player was in
  darkness.
- Run AfterRoutines() after taking inventory and it's not empty, just like
  I6 lib.
- Changed so location.after() is printed if debug verb "routines" has been
  entered, regardless of whether location provides such a routine.
- with_key can now be a routine. The object which is currently being tested as
  key is held in second. with_key returns an object id, or false if nothing
  fits.
- Fixed bug: Insert and PutOn checked the capacity of the object inserted
  rather than the container/supporter.
- Skipped compilation of code to automatically put things in sack object if
  SACK_OBJECT has not been defined.
- Made many library messages safer, in that they will work even if adding new
  grammar which use a different verb word.
- Optimized check for correct key in Lock and Unlock.
- Slight optimization in Look.

=======
v1.4: new feature (and bug fix) release

- Optimized to skip parser phase 2 when possible for speed gains
- Updated Library of Horror to use the new constant DIRECTION_COUNT.
- Stop checking ObjectIsInvisible() for every object during parsing, since it's
  slow and shouldn't be necessary.
- Fixed bug when it/him/her was not in sight, introduced when we started to
  skip phase 2.
- Changed synonym 'yourself' for player to 'self', to harmonize with I6 lib,
  and because it makes sense.
- Improved parsing of delimiters between direction commands.
- "take obj" bug when already held has been fixed.
- Faster direction matches which appeared in v1.3 breaks old Infocom
  interpreters, due to lack of support for printing to memory. Changed
  implementation to not break. It is also smaller, but it gets less easy to
  change direction words.
- the pattern score was wrong when 'all' was used to match a multi token.
- Smaller, faster code in PrintVerb.
- _FindBarrier() was made shorter, and faster when set not to print.
- Changed grammar of 'get' to match I6 lib. "get on object" and
  "get out of object" now work.
- Remove 'embrace' from PrintVerb when optional verbset is not enabled.
- Fixed that PutOnSub didn't call before- or after-rules for Receiver, and
  that InsertSub didn't call before-rule for receiver.
- Added global receive_action to let receiving object know which action is
  happening.
- Made _PrintContents() public, thus changing the name to PrintContents().
  Changed the use of workflag to only print objects which have workflag set,
  just like WriteListFrom in I6 lib. Changed so initial string can be set to 0.
- Fixed bug in Search message.
- Added checks to see if objects can be touched to many action routines.
- Added call to AfterRoutines in WearSub.
- Changed a lot of checks in action routines from if(AfterRoutines() == 1) to
  just if(AfterRoutines()) and from if(keep_silent == 1) to if(keep_silent) to
  save 30 bytes.
- Fixed TryToTakeNoun() so it clears concealed attribute when an object is
  picked up.
- Changed so the invent property is consulted whenever a list of objects is
  presented by PrintContents, most notably also affecting object listings in
  room descriptions.
- Added calls to object parent's before and after rules (if container or
  supporter) with LetGo action when taking object.
- Changed so debug verb 'routines' prints calls to before routines and
  after routines even if object doesn't provide them.
- Added printing to calls to before and after rules for fake actions Receiver
  and LetGo for when debug verb 'routines' has been entered.
- A game programmer can check the version of PunyInform being used by looking
  at the values of constants PUNYINFORM_MAJOR_VERSION and
  PUNYINFORM_MINOR_VERSION.

=======
v1.3: new feature (and bug fix) release (26 July 2020)

- Extended 'all' so that 'take all Xs except/but Y [one]' works.
- Fixed bug in cloak.inf which gave a point even if "hang cloak on hook"
  failed.
- Added call to AfterRoutines in PutOnSub.
- Made parser a little quicker by not checking if an object is visible once
  per word in player input.
- Unified some messages, to save space.
- Fixed error in order of directions. (ne, nw, se, sw came in the wrong order,
  causing errors when some of these directions were translated to/from fake
  direction objects.)
- Changed the role of initial for rooms to match I6 lib.
- Fixed a bug where an already scored room would be scored again if moved into
  using PlayerTo().
- Marked all objects held by the player as moved and not concealed when game
  starts.
- Added GetOff action ("get off X").
- Fixed a noun caching bug that made 'throw X at Y' go wrong
- added num_words as described in DM4
- Split up extra verbs in normal verbs and metaverbs. New constant:
  OPTIONAL_EXTENDED_METAVERBS
- Fixed so "it" can not refer to Directions.
- Changed default name of Directions object from "unknown direction" to
  "direction", since it looks more sensible in most situations.
- Fixed so PutOn requires the noun to be held.
- Removed extra error message if the player fails to auto-take noun in
  InsertSub.
- Changed so the location's add_to_scope property isn't checked, since this
  causes aliasing problems, and isn't supported by I6 lib either.
- Fixed a bug that made PronounNotice calls in before rules go unnoticed.
- Fixed bug where direction properties came in the wrong order unless
  OPTIONAL_FULL_DIRECTIONS was defined.
- The player object was renamed to selfobj to mimic I6 lib, and it got an
  empty parse_name property, and it got extra synonyms - now it has 'me',
  'myself' and 'yourself'.
- Fixed bug with words in "name" property of location.
- New constant DIRECTION_COUNT holding # of directions (8 or 12).
- Avoid checking if Directions is visible, since it always should be. Good for
  parser speed.
- Check direction matches faster in z3.
- Moved some action subs in grammar.h to put them in alphabetic order.

=======
v1.2.1: bug fix release (19 July 2020)

- The library version is now printed correctly at start of game and when player
  enters VERSION.

=======
v1.2: bug fix release (18 July 2020)

- Messages for pushing, pulling and turning scenery objects were missing.
- You could use action Drop/Insert/PutOn with something worn without taking
  it off first.
- "(worn)" was never shown in inventory.
- Library message for inventory slightly changed.
- Fixed bugs in handling of low priority scenery/concealed objects in
  disambiguation
- Take improved so it's not possible to take things which are part of other
  things or held by an NPC.
- TAKE ALL doesn't try to take other people's belongings or things that are
  part of other things anymore.
- "(putting x into [sack_object])" now has a newline at the end, and is
  printed by PrintMsg, so it can be modified by game.
- ObjectIsUntouchable() now has a flag to check if an object is takable too,
  like in the standard library.
- Added TouchCeiling() to help TAKE ALL.
- Changed so TAKE ALL tries to pick up all things in TouchCeiling plus things
  in/on normal containers/supporters in the touchceiling.
- Made game name bold in z5 games.
- Improved 'all' so that 'take all from/off X' works.
- Added 'get all from/off X' to grammar.
- Added a second parameter to LibraryMessages routine, to allow for messages
  requiring two parameters.
- Made LoopOverScope safer by having it loop over a copy of the scope array.

=======
1.1: bug fix release (12 July 2020)

- Parsing failed for big story files because of bad pointer comparisons
- A programming error lead to bad parsing results on older interpreters
- Reimplemented darkness handling as described in DM4
- Fixed various bugs in conversation code (ask X about Y etc)
- Changed to 'buffer' and 'parse' for the player input and parsing
  arrays, since DM4 is describing them and renaming them breaks some
  existing Inform code and extensions needlessly.
- Examine now works as in the standard library: containers without a
  description get a Search action, switchable objects show a message to
  say if they're on or off, after and react_after are run afterwards.
  Examining in darkness shows a message that it's dark.
- The contents of a closed transparent container are now printed in Look.
- Objects providing light now get "(providing light)" appended in Look.
- The message "[Actor] has better things to do." is now a regular library
  message, so it can be customized.
- Disambiguation bug fixed (only appeared in complex situations)
- "drop all but x" should now give a reasonable error message. ("but" is
  not supported.)
- Reordered the version info to mimic the standard library.

=======
1.0: first public release (5 July 2020)
