1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-05-17 16:38:40 +03:00
inform7/resources/Changes/Changes to Inform.txt
2022-08-18 21:52:01 +01:00

3566 lines
236 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[Chapter: Introduction] Preface
Note (added in August 2022): This book describes changes to the Inform language up to the end of its period as a closed-source project. Developments after that point are logged in release notes on the Inform source code repository, and most of the content below has been migrated there, too. This ebook is therefore now only of historical use.
Inform is a project under active development, both by its original authors and by users who contribute extensions. Besides that, it belongs to an ecosystem of related tools and projects, and they develop, too.
So Inform is periodically reissued in new versions, or "builds". Builds of Inform are identified by four-character codes: number, letter, number, number. Builds are always accompanied by a detailed if sometimes technical "change log", laying out what's new. You're now reading a collection of these change logs, going backwards in time to build 4S08, which was really the first version of Inform 7 considered solid enough for regular rather than experimental use.
Note: Throughout this document, bug numbers in the seven-digit form "0000123" refer to tickets at the Inform bug tracker: http://inform7.com/mantis/. Suggestion numbers, also large but not starting with a 0, refer to tickets at Inform's Uservoice forum, a public venue for suggestions to be made about future features: http://inform7.uservoice.com/.
[Chapter: Build 6M62] About build 6M62 (December 2015)
This is for the most part a maintenance release of Inform, incorporating fixes for nearly 300 issues reported with the previous build. All bugs reported before 3 September 2015 (and most later ones) have been removed. Fans of bugs need not despair, however, as the code has internally been much rewritten, so new ones will doubtless appear.
A modest selection of minor improvements to the underlying language can be found below, but little is fundamentally altered.
The Mac OS X user interface application sees two new developments in this release. One is the new concept of an "extension project", intended for writers of Inform extensions, which manages the extension source text better, and can automatically test the extension's examples of usage, which should make maintenance easier. The other development is that the previous Skein and Transcript panels have been merged together into one, simply called Testing, with a much clearer and simpler user interface. As in the past, some of these developments are likely to appear on other platforms in due course, but users should expect this to take a little time.
Many users gave up their time to report bugs in 2014/15, and we're grateful to all of them, but a particular tip of the hat goes to Daniel Fremont, who not only tested many obscure corners of the language but also combed through the documentation for out-of-date usages. It is thanks to Daniel that we learned that repeating the sentence "Foo is a room." 117030 times would crash the compiler, and that the documentation made what he called "a 300 sextillion kg error in the mass of Jupiter" (in our defence, that makes less difference than you might expect); and, at Daniel's urging, we did indeed "pick a consistent spelling for 'discombobulate'".
[x] Minor new features in the language
* Usage of the "stored action" kind has been streamlined considerably. For one thing, it can now be called simply "action". As when "indexed text" and "text" became the same thing, so too "action" and "stored action" are now synonymous. Constant actions no longer need to be written using the "action of" phrase, so for example these usages are now legal:
The best idea yet is an action that varies.
When play begins:
now the best idea yet is pushing the button.
Previously one had to call it a stored action that varies, and one had to say "now the best idea yet is the action of pushing the button". The "action of..." phrase still exists, to keep old source text working, but it now has the following comically redundant definition in the Standard Rules:
To decide what action is the action of (A - action): (- {A} -).
* In past builds, switch-like ifs were valid only for simpler kinds of value such as numbers; they can now switch on any value, and in particular on texts. For example:
if the new password text is:
-- "xyzzy": say "Nothing happens.";
-- "password": say "Would you care to accept a position at the NSA?";
-- otherwise: say "Accepted."
* Two minor improvements to the handling of named constants, which are relatively new in the language.
(a) The number of blank rows in a table can now be specified using a named constant, like so:
The spare capacity is always 10.
Table of Stuff
whatever (a number)
with spare capacity blank rows
The named constant must, of course, hold a non-negative integer. Note that it is allowed to be 0, which adds no blank rows. Inform doesn't allow completely empty tables, so if, as in this case, there are no explicit rows and the name comes out to 0 as well, Inform quietly gives the table a single row of blanks, but does compile it. (See bug report 0001724.)
(b) Map connections can now be made to or from rooms referred to by named constants, not explicitly as usual. Thus:
The Lounge is a room.
The designated room is always the Lounge.
The Exit Area is east of the designated room.
places the Exit Area east of the Lounge.
* When one action is converted to another one inside the Standard Rules, as most often happens when "removing X from Y" is converted to "taking X", and the action then succeeds, the after rulebook for the original action is now followed. For example,
Some coins and some bills are in the tip jar.
After removing something from the tip jar:
say "Alice is shocked at your bold impropriety."
will now work as might be expected from its wording. (This was filed as bug report 0001476, but it was really a feature request.)
* A new Understand token "[any things]" is a sort of cross-breed between "[any ...]" and "[things]", in that it behaves like "[things]" (accepting a multiple object) but with no restriction on scope, that is, applying to anything however distant or invisible, as with "any". (This was suggestion 751340.)
* A new text substitution for adaptive text:
[regarding N]
makes it easier to write responses such as the parser error internal rule (Q):
"[if number understood is 0]None[otherwise]Only [number understood in
words][end if] of those [regarding the number understood][are] available."
which inflects the verb to agree with the number.
* A subtle change to the rules on kind inference: if a temporary value X is created with "let", in the shape
let X be V;
then Inform gives X whatever kind V has - for example, "let X be 10" will make X a number, and so on. Traditionally, though, if V is any kind of object, X has the kind "object", not something more specific. This is so that sensible-looking source text like this:
let X be Peter;
now X is Jane;
...won't cause a problem message. If X is given the kind "man", the kind of Peter, then the "now" can't be allowed because Jane has kind "woman". In previous builds, then, Inform gave X the kind "object".
The change is that it now gives X the right top-level kind of object, instead of "object" itself. In the case of "let X be Peter", X will now be given the kind "thing", because Peter has the kind "man", but man is a kind of person, which is a kind of thing, and thing is a kind of object. More generally, where X would once have been an "object", it will now be one of "thing", "room", "region" or "direction". This removes a number of small annoyances (see for example bug report 0001501).
* Most phrase definitions are not case sensitive, but an exception is made for text substitutions where there are different definitions depending on whether the first word is capitalised or not. This enables "[the X]" and "[The X]" to have different meanings. In the new build, case sensitivity has been extended to cover all text substitutions whose definition is a single letter. This means that "[S]" will no longer be misread as if it were "[s]", the notation for an optional "s"; so source text such as
let S be 10;
say "S is [S].";
will no longer peculiarly say "S is s." or "S is .", but will say "S is 10." (Prompted by bug report 0001492.)
* In past builds, the adjective "empty" couldn't usefully be applied to relations created in sentences in the usual way; for example, given
Noticing relates various people to one person.
the condition "the noticing relation is empty" and the instruction "now the noticing relation is empty" weren't allowed. They now are. (Prompted by bug report 0001416.)
* A new rulebook has been added:
multiple action processing rules
This is called when a command would produce a multiple action, such as TAKE ALL. Rules in it can then take the opportunity to look at the list of objects to which the action would apply, and can change or rearrange this.
* "Understand" can now apply to descriptions of values. For example,
Understand "glowing" as something lit.
now works; previously this could only be done with the circumlocution
Understand "glowing" as a thing when the item described is lit.
(Prompted by bug report 0001796.)
* The following rules have been added to the Standard Rules:
(a) The "describe what's on mentioned supporters in room descriptions rule" improves the look of room descriptions when a non-scenery, non-undescribed supporter is holding up one item that has an initial appearance and another that hasn't, and is for some reason mentioned in that first item's initial appearance; this parallels the existing handling of scenery supporters.
(b) The "exclude indirect possessions from take all rule" means that TAKE ALL won't try to take items which are inside open containers already being carried, and so forth. (See bug report 0001474.)
* The following existing rules in the Standard Rules have changed:
(a) The "standard taking rule" has been extended to add:
if the actor is the player, now the noun is handled.
This ensures that even items only fleetingly carried are "handled"; in previous builds, a successful taking action might not result in an object being "handled" if it were then lost again before the end of the same turn. (This can happens as a result of implicit takes. See bug report 0001460.)
(b) The "immediately undo rule" has a new response (F) which reports that the interpreter's UNDO capacity has been exhausted. (See bug 0001689.)
(c) The following existing responses in existing rules have been made adaptive (see bug report 0001715). Old and new definitions are as follows -
basic visibility rule response (A)
"It is pitch dark, and you can't see a thing."
"[It] [are] pitch dark, and [we] [can't see] a thing."
block climbing rule response (A)
"I don't think much is to be achieved by that."
"Little [are] to be achieved by that."
parser nothing error internal rule response (B)
"There are none at all available!"
"[There] [adapt the verb are from the third person plural] none
at all available!"
(d) The "announce items from multiple object lists rule" now has a new response (A), which is responsible for the traditional format of the text dividing up replies relating to different objects (see bug report 0001762). This has the value
"[current item from the multiple object list]: [run paragraph on]"
and is responsible for e.g. "yellow marble: " and "red marble: " in -
yellow marble: Taken.
red marble: Taken.
Being a response, it's now customisable. For example,
The announce items from multiple object lists rule response (A) is "[current
action]: [run paragraph on]".
leads to
taking the yellow marble: Taken.
taking the red marble: Taken.
* The implementation of integer square root and cube root has been improved, so that Glulx's floating-point operations are used if available. This is faster and normally more accurate. (See bug report 0001547.)
* When releasing with an existing story file, this file can now be named:
Release along with an existing story file called "Zork1_sg.z5".
(Previously it had to be "Story.z8".)
* A clarification: a list is sayable if and only if its contents are sayable. In previous builds lists were always sayable, but would produce meaningless output if the contents weren't sayable (for example, for a list of topics).
* A clarification: creating kinds of direction is not allowed, and it now produces a problem message rather than failing more obscurely. (See bug 0001588.)
* A clarification: in past builds the documentation said that literal patterns could contain up to 4 parts; internally, the limit was 16, but would not always work correctly for high values; the limit is now set at 8.
* The "phrase" token works differently. This was undocumented and unsupported, and was to have been removed entirely in this build; but the extension "Hypothetical Questions by Jesse McGrew" turned out to use it regardless of its unofficial status, and the popular "Consolidated Multiple Actions by John Clemens" made use of this in turn. We have therefore retained it, a little reluctantly. Even so, its use has been somewhat restricted: it can't accept control constructs such as if, while, repeat, otherwise, now, or say. On the other hand it expands in a more predictable fashion, without generating braces which are problematic to deal with. It nevertheless remains an unsupported feature of Inform, and there's no guarantee it won't change.
[x] Inform for Mac OS X
Firstly, the Mac OS X application has made the transition to 64 bit only. This change only adversely affects users who are still running OS X 10.6.8 on 32 bit hardware. Users of Inform on OS X 10.7 and above are still fully compatible (because by definition they are already running on 64 bit hardware). Similarly, users still running OS X 10.6.8 on 64 bit hardware should remain compatible. This change is made to help improve stability and smooth future development.
New to this version is the Testing panel (which replaces the old Skein and Transcript panels of previous versions). The Testing panel is designed to help ensure the story consistently responds as expected while the development of the source continues. The Testing panel consists of knots - all commands that have on previous occasions been played in the story with their associated response text. Knots are displayed in a branching fashion - knots lower down the panel are later in the story than those nearer the top. Each knots response text can be ticked (blessed) to signify that it is correct (i.e. as expected). Any deviation from the blessed text in future plays of the story will be shown on the knot with a red star, and the differences highlighted in the response text itself. Each knot has a menu of options. Knots can be dragged and dropped onto other knots to be copied or moved, even onto other projects. Undo is supported. A Help section of the Testing panel describes each element. The Play All button allows all knots to be automatically played in the story.
Also new to this version are Extension Projects. Extension Projects are designed to help developers of Inform extensions. An Extension Project can be created from an existing extension or from scratch. The extensions source can be edited, its examples of use' played and tested individually, or all its examples tested automatically. The extension can then be installed or exported as required.
A smaller improvement is that the story is now only recompiled on Go!' if needed, for example because its source text has changed.
Bug fixed (0000089): 'More...' overlay is not properly hidden.
Bug fixed (0000378): Bug with CocoaGlk and the Automap extension.
Bug fixed (0000538): Problems with Skein and Transcript panels - now rewritten and replaced with the new Testing panel.
Bug fixed (0000545): Problems with Skein and Transcript panels - now rewritten and replaced with the new Testing panel.
Bug fixed (0001076): Invisible characters in source text editor.
Bug fixed (0001093): glk_buffer_to_title_case_uni crashes in Mac IDE interpreter.
Bug fixed (0001111): CocoaGlk: The built-in interpreter becomes unresponsive after RESTART.
Bug fixed (0001189): CocoaGlk crash when measuring an unhinted style.
Bug fixed (0001404): Crash with VoiceOver enabled.
Bug fixed (0001437): Issues with 10.6.8 resolved.
Bug fixed (0001481): Issues with 10.6.8 resolved.
Bug fixed (0001641): Double-clicking the "Go!" button causes an I6 error.
[x] Inform for Windows
The progress bar shown when compiling a story (or downloading extensions) is now rather more prominent, and shown in the middle of the window.
The toolbar icons have been updated to match the OS X front end. This has also involved removing the "Stop" button from the main toolbar. Instead this can now be found as a button on the "Story" tab.
Two bugs have been fixed: 0001418 and 0001511.
[x] Inform for Linux
The GUI code is no longer hosted on SourceForge. The place to go is now GitHub (https://github.com/ptomato/gnome-inform7). The location for official downloads — the Inform website — has not changed.
Inform on Linux can be used in with a GUI in French and Spanish, following a bug fix. Those wishing to help translate the GUI into other languages can now visit Transifex (https://www.transifex.com/ptomato/gnome-inform7/).
* Packaging issues fixed; thanks to Vincent Petry and Bart Massey for contributing these fixes.
* Trying to open a nonexistent story from the recently-opened list will now remove that story from the list (0001732).
* Bug fixed (0001612) whereby the Public Library had stopped working.
* Bug fixed (0001446) whereby extensions marked "for Glulx only" were installed incorrectly when downloaded from the Public Library.
* Bug fixed (0001497) whereby code pasted into the story caused extra indentation to be inserted.
* Bug fixed (0001757) whereby some Inform 6 code was highlighted incorrectly.
* The correct version of Glulx Text Effects is included with this release (0001447).
* A few bugs fixed that caused crashes in certain circumstances: 0001286, 0001406.
[Chapter: Maintenance in build 6M62]
[x] Source text and punctuation
Bug fixed (0001520) whereby a source text opening with a colon would throw an internal error rather than a problem message.
Problem messages added (see 0001521) to catch various punctuation accidents: colons at ends of paragraphs or sentences, and semicolons at ends of sentences or following colons or full stops.
Bugs fixed (0001523, 0001529) whereby instances and rules whose names included brackets would sometimes throw internal errors rather than problem messages.
Bug fixed (0001797) whereby a plural consisting entirely of a bracketed text, such as "The plural of wug is (nothing).", would throw an internal error rather than a problem message.
[x] Extensions
Bug fixed (0001537) whereby overlong extension or author names in Include sentences would cause Inform to issue a problem message (correctly) and then end in exit code 2 or 11 rather than 1.
[x] Assertions and creations
Bug fixed (0001610, 0001617) whereby source texts making very repeated use of creation sentences would crash (e.g., at least 117030 copies of the sentence "Foo is a room.").
Bug fixed (0001588) whereby attempts to create nameless instances of subkinds of "direction" would crash Inform by repeating the same problem message until the stack ran out.
Bug fixed (0001600) whereby creating objects with very long names would lead to unexpected problem messages about quotation marks.
Bug fixed (0001571) whereby constants left undefined would sometimes lead to I6 errors rather than problem messages.
Bug fixed (0001572) whereby constants defined indirectly in terms of themselves would throw an internal error rather than producing a clear problem message.
Bug fixed (0001539) whereby names containing long I6 inclusions (which is a very odd thing to try to do) would sometimes lead to internal errors.
Bug fixed (0001411, 0001532, 0001686) whereby a sentence using a relative clause to equate things would in some cases (e.g. "Zog is a person that is false.") produce an internal error.
Bug fixed (0001643) whereby changing the meaning of the verb "to be", not perhaps the wisest course in any event, would fail to produce the problem message for inconsistent verb definitions.
Bug fixed (0001558) whereby "There is an object." was rejected, rather than doing something not very useful (creating a thing called "thing" and placing it nowhere) as it should.
Bug fixed (0001587) whereby assemblies which create qualified common nouns would sometimes produce a bogus problem message about circular kind definitions.
Bug fixed (0001662) whereby adjective definitions using object names in their domains could under some circumstances produce a "cannot establish position P" internal error.
Bug fixed (0001667) whereby a sentence creating something "(called the)" or "(called a)" would produce an internal error not a problem message.
Bug fixed (0001672) whereby a nonsensical assertion like "Edible has bar" could crash Inform rather than produce a problem message.
Bug fixed (0001675) whereby a redeclaration of, say, a scene as a variable could sometimes cause an internal error not a problem message.
Bug fixed (0001658) whereby assertions about map directions, which are vague about the origin, could throw an internal error if the subject of discussion had changed to something which wasn't an object (e.g. by creating a new kind).
Bug fixed (0001693) whereby assertions about map directions which give the destination as a value other than an object would (usually) be ignored rather than throwing a problem message.
Bug fixed (0001683) whereby the map might come out with confused connections if directions were declared in an unusual order, mixed in with sentences making map connections using them.
Bug fixed (0001691) whereby some sentences creating things would be allowed even though they were said to be never or seldom true: for example, "In the Dining Room is never a door."
Bug fixed (0001580) whereby bare existential sentences with multiple objects, such as "There are X and Y", giving no relationships between X, Y and anything else, would result in nothing being created.
Bug fixed (0001593) whereby implications whose premiss is a negated adjective would sometimes have their sense reversed: e.g. "Something not lit is usually edible" would be read as if it said "Something lit is usually edible".
Bug fixed (0001685) whereby assertions in the form "Home contains X with P.", where P is a property, would sometimes have P ignored.
Bug fixed (0001456) whereby adjectives could be defined over topics, but with unfortunate consequences. There's now a problem to defend against this.
[x] Model world
Bug fixed (0001560) whereby creating 10000 or more objects in a single story would result in a "far too many relatees" error. There is now no upper limit, except of course the boundary between sanity and madness.
Bug fixed (0001665) whereby creating infinitely large assemblies of things connected to other things would pause for a very long time after issuing the problem message. Technically not a hang, but not a good use of our limited time on this Earth either.
Bug fixed (0001670) whereby implicit contradictions in one-to-various or various-to-one relationships caused by assembly might not result in problem messages being issued.
Bug fixed (0001671) whereby recursive assemblies of non-object instances would sometimes fail to recurse as they should, thus halting early. (In practice this would mean that circular assemblies of this kind wouldn't result in problem messages.)
Bug fixed - or really, convention changed (0001586) - so that if a room is made using "X is D of Y", where D is a direction with no reverse, then X is assumed likely to be a room in the absence of other evidence. Previously this happened only if D had a reverse. (This was because the convention was that assumptions were made only about the destination Y: when D had a reverse direction, un-D, the above sentence implied also "Y is un-D of X", and so X was also a destination.)
Bug fixed (0001639) whereby timed events occurring close to midnight would sometimes never arrive if the clock had been altered to jump from before them to after midnight between turns, e.g., by replacing the advance time rule.
Bug fixed (0001597) whereby putting a region initially inside a room was being allowed - it should of course produce a problem message, and now does.
A problem message has been added (see 0001687) to catch the inevitably disastrous consequences of making "container" a kind of "supporter" or vice versa; similarly (0001692) for making "door" a kind of "backdrop" or vice versa.
Bug fixed (0001607) whereby a proper-named person would, if his/her printed name were changed at run-time, sometimes be given the capitalised form of the original name in some responses.
Bug fixed (0001603) whereby an item marked "undescribed" would nevertheless be described if it both provided an initial appearance text and was found on a supporter. (See the "initial appearance on supporters rule".)
Bug fixed (0001493) whereby an item hidden through the use of the "deciding the concealed possessions of" activity would nevertheless be mentioned in the bracketed part of a list of objects, as in, "You can see an aquarium (in which are some pebbles and a goldfish) here.": in previous builds the pebbles would have been included even if the activity had said otherwise.
Run-time problem added (0001463) for testing the adjacency relation with regions rather than rooms. (Previously this simply gave unhelpful answers.)
[x] Properties
Bug fixed (0001528) whereby "of" used with an either-or property would sometimes be rejected with internal errors rather than problem messages.
Bug fixed (0001538) whereby adjective names containing brackets or quotes were rejected with internal errors rather than problem messages.
Bug fixed (0001524) whereby properties with very long names might crash Inform on declaration.
Bug fixed (0001540) whereby absurdly long property names caused internal errors not problems.
Bug fixed (0001772) whereby attempts to assign by something like "now V is P", where V is a variable of kind K and P is a property holding K, now produce problem messages rather than failing to compile through I6.
Bug fixed (0001564) whereby a verb which means a property would cause run-time problems when tested or asserted with "now", if the owner of the property was something other than an object.
Bug fixed (0001530) whereby a nonsensical property value could be given in a property list and it would be ignored rather than reported.
Bugs fixed (0001530, 0001657) whereby a property list giving a value which involved "with" might lead to an internal error.
Bug fixed (0001620) whereby giving a nameless property to a single instance of a non-object kind such as "scene" or "narrative viewpoint" would lead to an internal error. (It's legal to do this, and now works.)
Bug fixed (0001673) whereby giving a condition to something whose name contained the word "from" could lead to an internal error.
Bug fixed (0001652) whereby a property list attached to something which can't have properties could in some cases lead to an internal error not a problem message.
[x] Relations
Bug fixed (0001540) whereby absurdly long relation names caused internal errors not problems.
Bug fixed (0001552) whereby some forms of implicit reference to relationships such as "equality" could cause an internal error.
Bug fixed (0001676) whereby trying to use a relation's bare name as a description of things in a list would lead to an internal error rather than a problem message.
Bug fixed (0001583) whereby typechecking of the universal relation would sometimes give unexpected results when applied to other unusual relations (such as provision).
Bug fixed (0001583) whereby the provision relation can now be tested a little more freely with properties identified by variable.
Bug fixed (0001550) whereby some indirect uses of some built-in relations could produce meaningless results; they now produce a run-time problem.
Bug fixed (0001553) whereby various-to-one relations cannot always relate 0 to something, or other values internally stored as 0 at run-time.
[x] Actions
Bug fixed (0001525) whereby deficiencies in action descriptions assigned to named behaviours would sometimes be reported at the wrong line of the source.
Bug fixed (0001651) whereby a description of actions consisting only of an article would throw an internal error not a problem message.
Bug fixed (0001660) whereby certain very malformed descriptions of actions would throw an internal error not a problem message.
Bug fixed (0001496) whereby actions written as constants, for example in entries in a table, and which contained arbitrary text topics, would sometimes have those text topics lost when tried at run-time.
Bug fixed (0001469) whereby Inform would sometimes wrongly decide which form of asking was intended (asking for, or about?) in a phrase like "asking or telling Bob about...".
Bug fixed (0001789) whereby Inform would guess past participles of action names wrongly in the case of present participles like "playing", "slaying", "preying" or "toying", where the vowel A, E or I occurs before YING. These now correctly produce "played", "slayed", "preyed" and "toyed".
[x] Rules and rulebooks
Bug fixed (0001527) whereby rulebook variables declared with nonsensical kinds would produce an internal error not a problem message.
Bug fixed (0001629) whereby a rule with "in... while..." clauses might lead to an internal error not a problem message if not understood.
Bug fixed (0001666) whereby a timed event rule whose name consisted only of an article such as "the" or "a" would cause an internal error.
Bug fixed (0001591) whereby a rule with a "during..." clause describing the scenes to which it applied would not have this scene description properly checked, so that nonsensical clauses like "during three scenes" or "during a scene which is in the paper bag" would be accepted but then either throw I6 errors or fail at run-time.
Bug fixed (0001541) whereby rulebooks could be declared with indefinite kinds such as "value based rulebook". There's now a problem message.
Bug fixed (0001642) whereby rules would sometimes be allowed to "substitute for" other rules with incompatible kinds.
Bug fixed (0001470) whereby rules based on actions whose actor's name included a participle (say, "tough-looking coach") would sometimes be misread.
Bug fixed (0001508) whereby the syntax for declaring first/last rules for rulebooks with names beginning with "for" could be slightly erratic.
Bug fixed (0001748) whereby rulebooks couldn't produce something referred to using an indefinite article, e.g., "an object-based rulebook producing a list of texts" was being refused because of the "a".
[x] Lists
Bug fixed (0001618, 0001619) whereby a long list of constant action names could slow Inform's parser down to a crawl, or in extreme cases cause Inform to halt as having allocated too much memory.
Bug fixed (0001723) whereby an attempt at run-time to resize a list to a negative size would print a brief error into the transcript, but not throw a formal run-time problem message.
Bug fixed (0001503) whereby, under unusual circumstances, it's possible for removal of an item from a list to lead, some time later, to memory allocation or other heap-related errors.
Bug fixed (0001741) whereby lists of constant stored actions would sometimes not be allowed, with the actions being rejected as non-constant.
[x] Tables
Bug fixed (0001595) whereby including a large number of tables, with some of them nameless, would sometimes cause I6 errors due to I7 accidentally using the same I6 identifier twice.
Bug fixed (0001464) whereby a table entry holding an action which used a variable parameter somewhere would be accepted by I7 but then lead to I6 errors; it now produces a problem message.
Bug fixed (0001519) whereby trying to create a value defined by a table outside of that table would throw a problem message if it happened before the table in the source, but not if it happened after.
Bug fixed (0001542) whereby amending a table used to define things would sometimes produce the amended property values, sometimes the old ones. This is now ruled illegal, and there's a problem message accordingly.
Bug fixed (0001664) whereby a failed table amendment might produce an internal error not a problem.
Bug fixed (0001653, 0001654) whereby a duplicated column name in a multiple table continuation might produce an apparent hang not a problem.
Bug fixed (0001555) whereby sorting a table in order of a column holding real numbers would sort in order of increasing positive reals, then of decreasing negative ones, rather than in the obvious numerical order.
Bug fixed (0001706) whereby names of phrases used as constants in table cells would sometimes result in the kind of the table column being inferred too vaguely (as "phrase value -> value"), rather than using their actual kinds, so that it would then be difficult to use the column for anything without throwing kind-checking problems.
[x] Scenes
Bug fixed (0001711) whereby a sentence like "Scene A ends when Scene B ends interestingly" occurring before the declaration of Scene B's interesting end would throw a problem message saying the ending in question was unknown.
[x] Kinds and typechecking
Bug fixed (0001601) whereby a kind with a very long name would cause a crash once either a notation or some instances were created for it.
Problem messages improved (0001575) in being clearer about names not yet defined.
Bug fixed (0001509, 0001778) to do with matching a list of K against a list of L when L is a kind of K.
Bug fixed (0001495, 0001425, 0001448) whereby Inform would allow a text value to be assigned to a topic variable, but the result would be an I6 error about a nonexistent routine called TEXT_TY_to_UNDERSTANDING_TY, or in some cases a Glulx virtual machine error. Such assignments aren't legal, and there's now a problem message for it.
Bug fixed (0001648) whereby long expressions of what look arithmetic but don't in fact contain meaningful terms would cause Inform to run very slowly, or eventually run out of memory, rather than produce a problem message quickly.
Bug fixed (0001570) whereby adjective Definitions could define over kinds of kinds such as "sayable value", leading to problems later since this isn't type-safe. There's now a problem message.
[x] Phrases and functional programming
A local variable can't have the same name as a non-object kind. This was previously only sometimes enforced, due to a bug: it's now always enforced.
Bug fixed (0001526) whereby a phrase token containing a quantifier, such as "N - three numbers", would produce an internal error not a problem message.
Bug fixed (0001576) whereby a phrase with more than 10 tokens in its definition could crash the compiler.
Bug fixed (0001567) whereby the functions with mathematical names (such as "abs function") could not be used as constants, because a mysterious problem message would appear claiming that their definitions in the Standard Rules were unrecognised.
Bug fixed (0001613) to do with generic programming and the interpretation of kind variables when a phrase is used as a value which itself involves those variables: see the bug report for more.
Bug fixed (0001533) whereby Inform would fail to recover after a problem message involving a function kind declared with codomain equal to an undeclared kind variable, and would issue an internal error as well.
Bug fixed (0001674) whereby an implicitly circular adjective definition such as "Definition: a big number is big if it is 123." would crash Inform rather than produce a problem message.
Bug fixed (0001645) whereby duplicated cases in an "if ... is: --" switch would be allowed without warning. (They now cause a problem message, since they can never be useful.)
Bug fixed (0001646) whereby named constants couldn't be used as cases in an "if ... is: --" switch.
Bug fixed (0001583) whereby conditions using the present perfect or past perfect forms of some verbs would not be understood - for example, "X had provided Y".
Bug fixed (0001514) whereby "value", or other kinds of kinds, could be accepted where definite kinds were expected, resulting in undefined behaviour at run-time.
[x] Equations, units and arithmetic
Bug fixed (0001417) whereby arithmetic producing a dimensionless result after calculating with dimensioned operands would sometimes wrongly use integer rather than real arithmetic, so that, for example, 1500m divided by 10m would print out as 1.12552 × 10^9 not 150.0m.
Bug fixed (0001569) whereby Inform would sometimes crash after issuing a problem message in the event of dimensionally impossible arithmetic in the optional parts of an action description.
Bug fixed (0001625) whereby more part names could be given than there were parts to name.
Bug fixed (0001625) whereby multiple part names might be slow to parse.
Bug fixed (0001625) whereby cumulatively over-long part names would be rejected with a misleadingly worded problem message.
Bug fixed (0001625) whereby multiple part names could be identical. These now produce problem messages.
Bug fixed (0001561) whereby attempting to scale units by non-positive amounts produced an internal error not a problem message.
Bug fixed (0001589) whereby an equation defining three or more variables as having the same kind (e.g. "where a, b, and c are numbers") might lead to internal errors.
Bug fixed (0001562) whereby giving a notation to specify an arithmetic kind of value, with example value as an integer but scale factor a real number, would silently ignore the scale factor. There's now a problem message saying how to fix this to get the intended effect.
Bug fixed (0001649) whereby an equation with no name and no number would throw an internal error, not a problem message.
Bug fixed (0001644) whereby incrementing a variable containing an unusual arithmetic kind of value could in some cases cause an internal error.
Bug fixed (0001573, 0001574) whereby equations whose solution would require fourth or higher-degree roots would produce a spurious problem message about that power not being a constant number, or which would calculate out with the wrong answer by mixing real and integer arithmetic.
Bug fixed (0001582) whereby equations working out I^R, where I is a number and R a real number, would sometimes assign this to a number variable without converting it back from real arithmetic.
[x] Understanding
Bug fixed (0001414) whereby "[something related by R]" would, for a few exotic relations R such as "provision", throw an internal error. There's now a problem message.
Bug fixed (0001451) whereby AGAIN on the first turn would not produce a sensible reply on Glulx, though it would on Z.
Bug fixed (0001500) whereby the low-level I6 routine UnknownVerb would be called only if the actor in a command was the player. (This didn't affect regular English-language stories, where I7 doesn't use UnknownVerb.)
Bug fixed (0001604) whereby malformed instructions for people other than the player would sometimes result in no response at all.
Bug fixed (0001661) whereby an "[any any thing]" token, with unexpected extra quantification, would give an internal error not a problem message.
Bug fixed (0001694) whereby the "after reading a command" rulebook was run after some disambiguation questions are asked and answered, but not others. It should now consistently be run.
Bug fixed (0001475) whereby the use of a command involving "[text]", followed by THEN and another command in the same piece of typing, would cause that text to become a row of spaces.
Bug fixed (0001568) whereby the use of the "if the player consents" phrase, which asks for a yes/no answer, would invalidate the contents of the "player's command" variable.
[x] Glulx issues, file I/O, figures, sounds
The implementation of the Memcpy utility has been made faster on Glulx.
Bug fixed (0001429) to do with file input/output disrupting the Glulx output channel, since writing to a file would fail properly to reset the channel when finished. (Thanks to Dannii Willis for the patch to fix this.)
Bug fixed (0001506 but see also 0001502) to do with sound channels not being properly identified after a restore or restart.
[x] I6 template layer and inclusions
Bug fixed (0001578) whereby seemingly inconsistent combinations of use options ("Use scoring and no scoring") could lead to I6 errors.
Bug fixed (0001631) whereby I6 inclusions of more than about 600000 characters at a time would produce internal errors rather than problems.
Bug fixed (0001759) whereby use in an I6 inclusion of "ÿ", the largely mythical letter needed only by the band Queensrÿche and its devotees, would result in a spurious I6 error ("MAX_QTEXT_SIZE exceeded").
Problem message added (0001535) to do with using I6 inline definitions for named functions without I6 functions backing them up.
Problem message added (0001594) for overlong I6 definitions of adjectives and the like.
Problem message added (0001596) for broken attempts at template hacking.
[x] Text, spacing and printing
Bug fixed (0001397) whereby text substitutions for adapting modal verbs required the modified verb to take the third person, not the infinitive: which for regular English verbs made no difference, but meant that you had to write "[might are]" instead of "[might be]", for example.
Bug fixed (0001577) whereby ridiculously nested multi-part text substitutions could crash Inform rather than produce a problem message.
Bug fixed (0001599) whereby "say" statements including comma-separated lists of more than 4097 terms to be printed would lead to an internal error. There's now no limit on this: enjoy.
Bug fixed (0001637) whereby assigning a text to itself could corrupt its value, e.g., writing "now T is T" where T holds text which Inform has had to store in written-out form. (This could also happen with stored actions and some other kinds of value, but was most likely seen with text.)
Bug fixed (0001663) whereby attempting to display the empty text as a boxed quotation could crash Inform. (There's now a problem message instead.)
Bug fixed (0001606) whereby the you-can-also-see rule would, if running in the second person perfect tense, produce "You has been able to see..." instead of "You have been able to see..."
[x] Indexing
Bug fixed (0001428) whereby the coloured folder links in the Extensions panel wouldn't work - i.e., they could be clicked on, but wouldn't show the relevant location in the file system.
[x] Testing commands
Bug fixed (0001430) whereby "Test <case> with ..." would cause I6 errors if the case name were given in quotes. There's now an explanatory problem.
Bug fixed (0001491) whereby the ACTIONS command's output would produce gibberish when printing out some actions involving "[text]".
[x] Releasing, bibliographic data, and cBlorb
Bug fixed (0001413, 0001499) whereby releasing along with a named file would in some cases cause an internal error.
Bug fixed (0001713) whereby releasing with an image or audio file whose filename ends in a space or full stop might, on Windows, cause its file format (e.g. JPEG versus PNG, or AIFF versus OGG) to be wrongly guessed.
Bug fixed (0001494) whereby releasing with an existing story file wasn't working.
[x] Extension maintenance
"Glulx Image Centering" updated to version 4, to maintain compatibility with other extensions.
[x] Examples maintenance
Two new examples, "Western Art History 305" and "The Best Till Last", demonstrate the use of the multiple action processing rulebook.
[x] Interpreter maintenance
Inform comes with browser interpreters built in, so that it can act on release instructions such as "Release along with an interpreter.", which tell Inform to make a website in which the current story is immediately playable.
Parchment has been updated to 2015-09-25, fixing a bug (0001426).
Quixe has been updated to 2.1.2, as compared with 1.3.1 in the last two releases of Inform. This is quite a large improvement, since it takes in four successive releases of Quixe.
[Chapter: Build 6L38] About build 6L38 (August 2014)
Unlike its predecessor, build 6L02, this release of Inform is aimed almost entirely at maintenance: it fixes around 150 bugs, most of them minor and related to recent changes. Users of 6L02 should be able to upgrade with no preparation needed; users of earlier builds, though, would be well advised to read the notes on the big changes in 6L02 before proceeding.
But there is one major development, all the same: for the first time Inform is released for a mass-market mobile operating system - Android.
[x] Minor new features in the language
It was realised soon after the release of 6L02 that the text substitutions "[those]" and "[Those]" were ambiguous, since if they're applied to an object which is a man or woman then they would have to be different in the accusative and nominative cases. Consider the two texts:
"But [we] [aren't] holding [regarding the noun][those]."
"But [regarding the noun][those] [aren't] available."
and suppose the noun is Andrew. Then "[those]" needs to expand as "him" in the first case but as "he" in the second. To distinguish these,
"[those in the nominative]"
"[those in the accusative]"
and similarly for Those. But what should plain "[those]" and "[Those]" do? We note that the Standard Rules used "[those]" in 7 responses, all accusative, and "[Those]" in a further 12, all nominative. Accordingly, Inform now defines "[those]" as equivalent to "[those in the accusative]" and "[Those]" as "[Those in the nominative]". This fixes bug 0001232, and though it's not a perfect solution, it's intended to be something we might revisit when Inform has a better idea of noun cases (as it will need for, say, adaptive German). Note that "nominative" and "accusative" are the two values of the kind "grammatical case"; "nominative" existed in 6L02, but "accusative" is new in this build.
The real square root function can now be applied to any numerical quantity for which the dimensions (in physics terms) are a perfect square. Thus, if we're using the Metric Units extension,
the real square root of 4 sq m
produces the length "2.0m". This also means that equations such as:
Equation - Pythagoras's Theorem
a = root (b^2+c^2)
where a is a length, b is a length, c is a length.
can be solved for "a"; this previously failed because "root" could be applied only to dimensionless numbers. (See also bug report 0001264.)
The following are now equivalent:
[1] A food is a kind of thing which is edible.
[2] A food is a kind of edible thing.
(Previously [1] was allowed, but [2] was disallowed.)
Action descriptions like the following are now rejected:
Instead of taking seven things: ...
Instead of taking the teddy bear on the dresser: ...
The first case is rejected because a single noun can't be "seven things", and the second because "the teddy bear", a proper noun, is being used as if it were a common noun. ("a thing on the dresser" would be fine.) Previous builds of Inform allowed these, but compiled misleading tests: e.g. the latter would simply test whether the teddy bear was on the dresser, regardless of whether or not it was the thing taken.
It is now officially illegal to create something new with one of the following reserved names:
action, condition, list-entry, now-condition, phrase, property-value, storage, table-reference, variable
These all have internal meanings and it's unlikely to be safe to create anything with these names, though in some cases one might be lucky. (The example "Greater Variety", for instance, created a table column named "action" in 6L02 and got away with it; this column has been renamed. See bug report 0001347.)
It is now officially illegal to define a phrase which looks like "X is (a relationship) Y". For example,
To decide whether (X - testval) is less than (Y - testval):
is now disallowed, because there's already a meaning of "To be less than". (See bug report 0001230.)
When replacing a heading from an extension, it is now possible to put the heading name in quotation marks for clarity. For example:
Section - Another Questions fix (in place of "Section 4 - Phrase used to ask questions in closed mode" in Questions by Michael Callaghan)
(Without quotation marks, the grammar is ambiguous, because of the "in" in the name of the heading. See bug report 0001239.)
It's now legal to test actions against kinds of actions in a more flexible way. For example:
Attacking is aggressive behaviour. Examining is inquisitive behaviour.
[1] Before aggressive behaviour: ...
[2] Before doing something other than aggressive behaviour: ...
[3] Before aggressive behaviour or inquisitive behaviour: ...
[4] Before aggressive behaviour or jumping: ...
Previously only rule [1] would have been allowed. (This was prompted by bug report 0001244, though that was arguably a suggestion in disguise.)
The "backtrace" problem messages arising from ambiguous possible phrases, which list what Inform was trying to read, have been redesigned a little.
The default contents of the following two responses have changed:
list writer internal rule response (R)
list writer internal rule response (T)
in each case to remove an open bracket at the beginning; this open bracket is instead displayed using list writer internal rule response (A) first. The practical effect of this is that only two changes are needed to make the list writer always use, say, square brackets instead of round ones:
The list writer internal rule response (A) is " [bracket]".
The list writer internal rule response (B) is "[close bracket]".
(See bug report 0001344, to which this is related.)
I6 template files can now be installed in Inform's external resources folder, in a subfolder called "I6T". Inform first looks for these in Project.materials/I6T, then in (external)/I6T, and lastly in its own built-in reservoir. This is a change nobody actually asked for, but it makes everything consistent since the same convention is followed for Language bundles, website Templates and Extensions.
[x] Inform for Mac OS X
6L02 introduced an almost entirely rewritten user interface, and inevitably there were a few bugs: the Installed Extensions list redrew awkwardly, flashing content (0001238); entering full screen mode could leave the Find dialog stranded behind (0001252); save panels from the Welcome window were not sufficiently explanatory (0001273); clicking on extension names to bring up their documentation worked badly (0001237); unchecking the "bind up into a Blorb file on release" option on the Settings pane had no effect (0001306); Inform crashed on launch under Snow Leopard (0001271); IFIDs were not persistent, defeating their purpose (0001278); headings at the top of the source text were not correctly rendered on screen (0001331). These are all fixed.
[x] Inform for Windows
A new option, "Generate Inform 6 debugging information", has been added to the preferences dialog. This option controls whether the command line used to run Inform 6 specifies that the debugging output file should be created, and defaults to "off".
The Extensions tab is now implemented, providing access to the Public Library.
"Create new project" buttons are present in the documentation, next to example projects.
The elastic tab-stops option is now "Auto-space table columns" in the preferences dialog, to match better how things work on OS X.
Bugs 0000210 and 0001362 have been fixed.
[x] Inform for Linux
We would like to thank Vincent Petry, who has helpfully contributed packages for OpenSUSE Linux.
[x] Inform for Android
For the first time, this build of Inform is available for Android: specifically, for Android 2.1 (Eclair) or later.
[Chapter: Maintenance in build 6L38]
Around 100 bug fixes are made in this build, and once again all known issues have been resolved.
The following lists only the more significant bug fixes: it excludes those categorised by the bug tracker as "cosmetic", mostly small improvements to problem messages, or which affect only the documentation. I'm nevertheless grateful to all those who submitted these bugs, and in particular this build benefits from reports 0001229, 0001234, 0001246, 0001251, 0001259, 0001262, 0001263, 0001281, 0001289, 0001295, 0001299, 0001303, 0001308, 0001311, 0001316, 0001318, 0001321, 0001324, 0001327, 0001333, 0001334, 0001341, 0001342, 0001345, 0001352, 0001388.
(A special mention to 0001336 and 0001337 for some close proof-reading of the manuals, and another to 0001275 for pointing out that we confused the Swedish country code (SE) with its language code (SV) when putting together icons to indicate the language of play, which resulted in the flag of San Salvador making an appearance.)
[x] Uncategorisable
Bug fixed (0001339) whereby a really large source text might compile to I6 code containing spurious space characters which, with bad luck, might fall in the middle of a keyword and thus cause I6 errors. (This is only ever known to have occurred on a 3.6 million word source.)
[x] Headings
Bug fixed (0001249) whereby headings with multiple bracketed stipulations
Section - Fruit (for use with Locksmith by Emily Short) (not for release) (for Glulx only)
would produce spurious problem messages.
[x] Assertions and creations
Bug fixed (0001309) whereby assertions to set rule responses would be misread if the rule names included the word "with" or "having".
Bug fixed (0001247) whereby assertions moving rules in rulebooks would sometimes be misread if the rule or rulebook names included the word "in".
Bug fixed (0001373) whereby "The Attic is above the Parlor" would work, but "The Attic is a room above the Parlor" would make a connection the wrong way (up from the Attic to the Parlor rather than vice versa).
Bug fixed (0001290) whereby some attempts to make map connections to constant values which aren't objects would be ignored (which is fair enough) but with no problem message (which isn't).
Bug fixed (0001260) whereby an oddly-phrased sentence such as
X with the printed name "Cross" is a thing.
would be read even more oddly as a declaration that all things have this printed name.
Bug fixed (0001361) whereby the assertion "X is on top of Y" would sometimes be read as "X is on (top of Y)".
[x] Model world
Bug fixed (0001292) whereby the reaching inside/outside rules would not properly set the "person reaching" variable if the test were run other than via an action.
Bug fixed (0001363) whereby "the direction of D from R" would produce a bogus result for a one-sided door.
Bug fixed (0001243) whereby making scenery parts of a person would lead to a strangely worded problem message.
Bug fixed (0001359) whereby the text substitution "[the player's surroundings]" would produce empty text before play begins.
[x] Properties
Bug fixed (0001228) whereby attempts to refer to an impossible property of an object (a property, that is, which can only belong to an object of a different kind) would not always be caught at compile time.
[x] Relations
Bug fixed (0001364) whereby a relation defined by a condition involving a test which, to resolve, would require the expansion of a text substitution, would fail with an internal error. (Such a relation is quite legal and now compiles properly.)
Bug fixed (0001285) whereby route-finding through a various-to-one relation would fail to work in some configurations of the relationship. (That's probably being generous - when it did work, that was mostly luck.)
[x] Rules and rulebooks
Bug fixed (0001329) whereby a condition limiting the applicability of a rule might not be properly type-checked, causing internal errors in some cases.
Bug fixed (0001280) whereby an attempt to put just a "value" into a rule's preamble would cause an unclear problem message.
Bug fixed (0001323) whereby rules such as...
Before doing something other than listening to or examining the creature:
...would be misunderstood as (listening) to (or examining the creature) rather than (listening to or examining) (the creature).
Bug fixed (0001296) whereby
[1] Instead of taking the rock or looking: ... [2] Instead of looking or taking the rock: ...
[1] was reported as a problem (the actions can't mix because "looking" can't apply to the rock), but [2] wasn't. To avoid ambiguities, both forms are illegal.
Problem message improved (0001389) for getting the 'for...' and 'when...' clauses attached to a rule about actions in the wrong order.
Bug fixed (0001328) whereby rules based on a parameter which happens to end with the word "rule" would sometimes have the parameter ignored, making them more widely applicable than intended.
[x] Lists
Bug fixed (0001387) whereby Inform wasn't preventing constant lists or texts from being modified using text replacement, list sorting and so forth. All such attempts now result in problem messages.
[x] Tables
Bug fixed (0001322, 0001338) whereby creating objects via a table which contained additional blank rows would generate spurious I6 errors.
Bug fixed (0001360) whereby attempting to access a table row, where no row was selected, could cause TableLookUpEntry() to crash at run time. There's now a run-time problem message instead.
Bug fixed (0001255) whereby looking up texts, lists, etc., in a table which contained a blank row before the match would sometimes cause memory out of range crashes at run time.
Bug fixed (0001250) whereby it was possible to create the same column in two different tables with different kinds, provided that both columns started out empty; this resulted in mysterious type-checking problem messages.
Bug fixed (0001390) whereby attempting to read a blank entry of a table as if it held a value would throw a run-time problem (as it should) but then also in some circumstances crash the virtual machine.
[x] Equations, units and arithmetic
Bug fixed (0001302) whereby real-valued constants of some kinds, notably those defined by the Metric Units extension, couldn't be written with a minus sign.
Bug fixed (0001268) whereby local variables were not being promoted implicitly from "number" to "real number" when used in an equation. (The documentation half-promised that this would happen; well, now it does.)
Bug fixed (0001310) whereby comparisons between values of a kind other than "real number", but nevertheless stored as floating-point quantities, would wrongly be made using integer comparisons.
Bug fixed (0001257) whereby comparisons between real numbers and numbers would not always implicitly promote the numbers to reals before making the comparison.
[x] Understanding
Bug fixed (0001369) whereby a declaration of "Understand... as a mistake", with no error message text supplied, would sometimes crash Inform.
Bug fixed (0001265) whereby an "Understand... when..." condition would throw a problem about referring to the current action even when it in fact tested whether actions had taken place in the past.
Bug fixed (0001313) whereby a runtime error is thrown when the player's command is matched against the text "me", which doesn't qualify, on early turns only.
Bug fixed (0001325) whereby the Understand token "[any K]", where K is a kind of value but not a kind of object, could sometimes produce an internal error.
Bug fixed (0001301) whereby single-letter elements of literal patterns would fail to parse at the command line under Glulx if written in upper case. (Thus a command such as "heat the water by 5c" would work, but not "heat the water by 5C".) Note that this only affected commands typed by hand, because the TEST command flattens to lower case automatically.
[x] Text, spacing and printing
Bug fixed (0001242) whereby "blouse" and its derivations pluralized as "blmice", not "blouses".
Bug fixed (0001231, but see also 0001396) whereby the text substitution "[A list of...]" would only capitalise the first word of the output if it were an article, so for example it could produce "four gold coins" rather than "Four gold coins". And similarly for "[The list of...]", which could be fooled by proper nouns in lower case.
Bug fixed (0001258) whereby printing unusual indefinite articles using the "[A ...]" text substitution would produce a "library error 2" at run-time.
Bug fixed (0001319) whereby a text substitution defined with a slash to indicate alternate phrasings on the opening word would lose its case sensitivity.
Bug fixed (0001291) whereby string comparisons in the background would cause "[first time]..." text substitutions to behave unexpectedly when used in certain properties of rooms or things.
Bug fixed (0001370) whereby the string "[one of]..." compares as equal to the empty text "" before being first printed, even if it's never possible for it to be empty. For comparison purposes, it now is equal to the text value it will have when next printed.
Bug fixed (0001368) whereby spurious line breaks would sometimes appear in room descriptions including paragraphs arising from "writing a paragraph about" rules.
Bug fixed (0001365) whereby grouping items under a given text would not always work if that text included substitutions. It now does, and automatically performs the substitution at grouping time.
Bug fixed (0001344) whereby two oddball cases in the list-writer printed a close round bracket ")" directly, rather than printing it with the list writer internal rule response (B).
Bug fixed (0001283) whereby the past tenses of regular English verbs ending -ay, -ey or -oy were incorrect: thus play was plaied, annoy was annoied, and so forth.
Bug fixed (0001396) to do with capitalising "ÿ" in the Z-machine (Queensrÿche fans, beware).
[x] Indexing
Bug fixed (0001300) whereby the text "This text is not actually used" is actually used in the Actions detail view.
Bug fixed (0001335) whereby the adjective "substituted" was wrongly defined in the Lexicon index.
Bug fixed (0001332) whereby the Contents index was miscounting the number of words under some headings.
[x] Testing commands
Bug fixed (0001256) whereby the RESPONSES testing command would list responses from some extensions in more than one numbered chunk.
Bug fixed (0001236) whereby run-time problem messages would sometimes be hidden on screen if they occurred during the expansion of a text substitution.
[x] Releasing, bibliographic data, and cBlorb
Bug fixed (0001293) to make HTML generated by cBlorb slightly better at passing validators.
Bug fixed (0001253) whereby releasing along with the "introductory booklet" or "introductory postcard" had stopped working.
[x] Extension maintenance
Glulx Text Effects by Emily Short (now maintained by Dannii Willis) has been updated to give comprehensive support for all Glk text features, and to simplify how colours are set, by using web (CSS) colours like #8800FF. See the extension documentation for more details. An issue to do with deprecated phrases in the examples has been resolved (see 0001367). This update is not fully backwards compatible, but any changes will be easy to make.
Metric Units: removed documentation references to the limitations which existed before we switched to floating-point arithmetic in 6L02.
Epistemology by Eric Eve: Updated to version 8. This fixes a bug (which has oddly only just come to light after all this time, unless its a by-product of 6L02) by which backdrops werent being marked as seen. It also adds an (A) to label the response of the report epistemic status rule.
[x] Examples maintenance
Examples in the documentation which contained ampersands now paste correctly into the source panel (see 0001312).
Small revisions have been made to the examples Lethal Concentration 1 and 2 (see 0001341), Persephone (see 0001346), Terror of the Sierra Madre (0001340), Olfactory Settings (see 0001305).
The example "Lollipop Guild" has been rewritten to demonstrate removing implicit takes from a different action (since eating no longer mandates these); and it is more dentist-friendly into the bargain.
The tiny example "We" has been removed: responses and adaptive text have overtaken it (see 0001245).
The example "Greater Variety" has been renamed "Variety 2" to emphasise its sequelness (see 0001284).
[Chapter: Build 6L02] About build 6L02 (April 2014)
This release is a major reform of a now-mature language which is widely used, and it has been over three years in the making. It has the following main objectives: to clarify and better enforce the syntax of the language (which is now formally documented); to have much greater linguistic flexibility, enabling stories to be written in any person and tense, and paving the way for translation to non-English languages; to remove phrases and features which have been deprecated for some years; to remove procedural rules, which were little used or understood and incurred a significant speed cost at run-time, in favour of simpler ways to substitute rule behaviour; to remove assumptions about the kind of narrative being written (i.e., that Inform is always making a "game" which is "won" or "lost" and has a "score"); to reform the rules handling "blocked" actions, such as listening; to redesign the Index, the in-application documentation, and the extensions index; to reform the handling of text, unifying "text" and "indexed text", and improving their performance; to introduce a simple but powerful system of "responses" allowing authors to change stock replies in the Standard Rules and other extensions, including third-party ones (and also to make it easy to translate these to non-English languages); and to implement full floating-point arithmetic in numerical kinds of value, at least on the Glulx virtual machine.
This will be a disruptive release. Existing source texts which use deprecated features will no longer work, and the improved syntax checking means that Inform will catch problems it previously missed. It should also be noted that the run-time implementation is different in numerous ways: story files are a little larger but will run a little faster. We believe that almost all Inform projects will be able to migrate to the new system with reasonable ease - for example, "Bronze", a large story written in the very early days of Inform 7, took about an hour's work to adapt. Nevertheless, authors of large existing Inform projects may want to be cautious in their approach to what is, we stress once again, an across-the-board reform of the language.
This release also refines the user interface for the Inform application. As in Inform 7's earliest days, new features are being piloted on Mac OS X, but will make their way to Windows and Linux soon - Toby Nelson, David Kinder and Philip Chimento are all working on these refinements. Search facilities are improved, but the big new feature is the Public Library, which automatically matches the user's collection of extensions against those on the Inform website, and allows the user to download or update them singly or en masse at the click of a button. There are no user accounts, no passwords; no data is held about Inform users at the server; and everything is free.
The existence of the Public Library will, we hope, be good news for extension writers - it will now be much easier to get your extensions out to users. We've always had a set of community standards for extensions, and Mark Musante, the Inform project's extensions librarian, has put in a good deal of work in recent years to look after all this. We now want to go further with that. The Inform website holds hundreds of extensions going back several years, but some of those are out of date, and many will contain deprecated phrases now removed from the language. So the rule is that the Public Library will contain only those extensions from the website which comply with the guidelines and which work properly on the 2014 Inform - we don't want new users, especially, to download obsolete code. Firstly, extensions should always use Responses to reply to the player's commands: this will make them more flexible and easier to translate to natural languages other than English. (At present German IF authors, say, have to "fork" extensions in order to translate them, and we want to avoid the need for that.) Secondly, these responses should where appropriate use adaptive text substitutions so that they will work in any person and tense, and will correctly cope with plural or proper nouns in all situations. An extension which does all this is called "adaptive". As from this build, all built-in extensions are adaptive, and we hope for quite a rapid takeup from third-party extension writers, too, since there is much to be gained and the changes are quite simple to make. Since adaptive versions of extensions will be incompatible with older builds of Inform, we are making arrangements to keep old non-adaptive versions of extensions online at the Inform website (just as older released builds are always available for download): those won't be on the Public Library, but they'll still be available for direct download just as they are now.
Note that a number of existing extensions to provide adaptive text facilities, such as Plurality by Emily Short, will now be redundant. But our build is indebted to this early work, particularly by Aaron Reed and David Fisher.
Lastly, a small announcement: for the first time since 1993, the default story file format for new projects created with Inform is the Glulx virtual machine, not Infocom's Z-machine. The Z-machine design is 35 years old this year, and it has done heroic service, but the time has finally come to move on. (Inform can still compile almost all of the examples to Z, but you'll have to choose Z explicitly in the project's settings to get this, and there's no longer much reason to do so.)
[Chapter: The Inform application] Materials becomes .materials
Inform projects are traditionally accompanied by folders of resources: thus, "Example.inform" would be accompanied by "Example Materials". From 2014, this folder is now called "Example.materials" instead.
This was a change imposed on us by Apple's sandboxing security requirements: we would otherwise have been unable to have Inform available at the Mac App Store. But it applies across all platforms.
[x] Inform on Mac OS X
Andrew Hunter's original Inform application for OS X has been substantially rewritten and refined by Toby Nelson, who takes over as its maintainer from this build. Much work has been undertaken to modernise the application, to make it more stable, consistent, user friendly, and feature-rich. This was also an opportunity to introduce new features to Inform's "reference design" for the first time in some years, features which we hope to bring to Inform's other platforms later.
The price for this is that Inform runs only on Snow Leopard 10.6.8 or later, which means that it requires an Intel-processor Mac for the first time. That includes almost every computer manufactured by Apple in the last eight years, but we know it will leave a few Inform users out, and we're sorry for that. The rapid pace of change in Apple's operating systems is such that it has become difficult to have any kind of good user experience on 10.9 while still functioning on 10.5.
Mac App Store: Inform is now code-signed, i.e., digitally authenticated as being the work of an identifiable developer, and this means that Gatekeeper, the Apple security system in OS 10.8 and 10.9, no longer advises the user that the app is potentially dangerous to run. Inform is also sandboxed, which gives the user the assurance that it cannot access private data or make illicit communications. Our intention is to offer Inform both as a direct download from inform7.com (for OS 10.6.8 or later) and on the Mac App Store (for OS 10.8.3 or later), in versions which are identically featured and, of course, both free. Inform's App Store debut will be in a few weeks' time. This should be a help for users in education, where school IT departments are wary of allowing teaching staff to download apps from non-trusted sources.
Design: Inform now has a new clean modern look, with new application icons, document icons, toolbar buttons, images, and Retina screen support. It provides a full-screen mode for users of 10.7 or later (suggestion 3011916). The centrepiece of the toolbar is now a status window like the one used by Xcode and iTunes: this displays the task currently progressing, or the task most recently completed, and can control whether the story is running.
Launcher: Inform used to provide a three-button splash screen, but this has been replaced by a much more feature-rich "launcher" window. This can be toggled open or closed with Command-L: is shows a list of recent projects, lets you open or create new projects and extensions, provides sample projects for new users to play with, has links to useful resources and advice, and so on.
Search: The previous find systems have been replaced with more modern and feature-rich "Find" and "Find in Files" dialogs. "Find" (Command-F) searches the current page (whatever currently has focus). "Find in Files" (Command-Shift-F) is similar to "Find", but searches across chosen locations: Source, Extensions, Documentation (Main text, Examples, Phrase definitions) in any combination. Two search gadgets on the toolbar, one for source, one for documentation, provide quick access to this. Shortcuts are standardised, e.g. Shift-Command-G is now the shortcut for "Find Previous". Search results are much better displayed and sorted (for example, results in the Recipe Book are tinted yellow) and clicking on them jumps more accurately to their location. Documentation search is carefully scoped to search only what's relevant. Finally, both "Find" and "Find in Files" offer fully-featured regular expression search and replace.
Editing: A new text and syntax-highlighting engine has made syntax colouring and styling more accurate, much faster and less prone to crashing or hanging.
Extensions: A new pane, "Extensions", details what extensions are installed, and offers the new Public Library. This compares versions of extensions available at the Inform website against the installed extensions: it shows what's new and what needs updating. Updates and new installations can be made with a single click, or extensions can be installed en masse, with options to download all items or update all outdated versions.
Preferences: The app Preferences are much more clearly laid out, and give a fuller range of options on syntax colouring and styling.
These are the main highlights, but there are small enhancements throughout, and we suggest making a general tour.
(Suggestions 876091, 860939, 3011916, 839957, 846303, 847455, 789525 and probably others, too.)
Bug fixed (0000062): Find text in dialog no longer cleared when frontmost application changes.
Bug fixed (0000092): Open Recent fixed for user extensions.
Bug fixed (0000093): Auto indentation fixed
Bug fixed (0000118): Fixed crash when exiting.
Bug fixed (0000140): Check spelling as you type content menu option works as advertised.
Bug fixed (0000155): Tab-indenting and block commenting hotkeys work in extensions now.
Bug fixed (0000163): Fixed syntax highlighting of substitutions (square brackets).
Bug fixed (0000190): Install extension warning added.
Bug fixed (0000197): The Z-machine interpreter's command history fixed.
Bug fixed (0000200): The new project dialogs reworked, working correctly now.
Bug fixed (0000201): Fix for strange characters appearing in transcript.
Bug fixed (0000227): Fixed crash on Undo
Bug fixed (0000295): Breakpoints are not allowed in Inform 7 projects.
Bug fixed (0000297): Vertical scroll bar rendered underneath the right border if a pane is closed almost to nothing.
Bug fixed (0000298): I6 panes resize correctly.
Bug fixed (0000301): User can click on a raw ni file to view.
Bug fixed (0000310): A recursive printed name no longer crashes.
Bug fixed (0000317): Find all no longer crashes Inform.
Bug fixed (0000361): Elastic tabs now update properly
Bug fixed (0000385): Replace All now works correctly.
Bug fixed (0000424): Opening an extension twice doesnt open two windows any more.
Bug fixed (0000425): Built-in extensions are no longer flagged as needing installing by the editor.
Bug fixed (0000426): Better help behaviour/messaging when requesting help while an extension window is active.
Bug fixed (0000427): IDE scrolls to error lines in extensions.
Bug fixed (0000428): Subcomments fixed.
Bug fixed (0000429): Contents are shown for stories without titles
Bug fixed (0000430): Fixed quotation marks on title for Contents page
Bug fixed (0000478): Toolbar search boxes can scroll text
Bug fixed (0000496): Tab Indentation is now shown correctly when opening a project.
Bug fixed (0000544): IDE removes the leading "the" when installing extensions.
Bug fixed (0000562): When multiple extensions are open, the keyboard shortcuts for switching windows now do select a story window.
Bug fixed (0000667): IDE always recompiles the game now.
Bug fixed (0000702): Name of elastic tabs has changed, and is now found in Editing Preferences ('Auto-space table columns').
Bug fixed (0000764): Long @opcode names are now coloured properly
Bug fixed (0000773): Extensions page is not open automatically on Lion.
Bug fixed (0000866): Text searching no longer causes a hang.
Bug fixed (0000910): Three dots are no longer converted to a single ellipsis character.
Bug fixed (00001048): Syntax highlighting long delay has been reduced significantly.
Bug fixed (00001090): Different line endings (CR/LF combinations) are handled better.
Bug fixed (00001173): Documentation is up to date.
Bug fixed (00001175): Documentation searches starting with a comma are now correct.
[x] Inform for Windows
Elastic tabstops are now available as an option in the Format menu. When elastic tabstops are enabled, tabstops are automatically sized so that columns in tables line up.
The font settings are now respected in the HTML based panes (that is, the index, errors and documentation) when Internet Explorer 9 is installed.
The front-end attempts to sensibly replace spaces with tabs in text that is pasted or dropped on the source tab: if a table is detected its elements are separated by tabs, and leading spaces are also converted to tabs.
The Glulx interpreters in the game tab now support the additions to Glk in versions 0.7.1, 0.7.2 and 0.7.3 of the Glk specification.
The front-end now calls the Inform 6 compiler with the 'k' switch, which enables generation of the Infix debugging information file.
Bug fixed (0000659) whereby the extensions menu could show only 200 installed extensions; it can now show 1000.
Bug fixed (0000859) whereby the Save As... menu item, although available during the time when a story is being compiled, didn't work properly then.
Bug fixed (0000919) whereby whitespace is sometimes trimmed when material is cut and pasted in the source text.
Bug fixed (0000733) whereby changing font to an exotically encoded font (e.g. for music notation) could in some circumstances crash the interface.
When editing the blessed Transcript, the effect of Enter and Ctrl+Enter has been reversed: the former puts in a carriage return, the latter ends editing. (See bug 0000532.)
There is now an Edit > Headings menu item for navigating the source when it's showing only one heading's-worth. (See bug 0000540.)
[x] Inform for Linux
The Transcript pane has arrived. This means that the Gnome front-end finally has all the same major features as the OS X and Windows front-ends. Also, finishing the Transcript led to many small bug fixes in the Skein, both structural and cosmetic.
The Spanish translation of the interface has been kindly updated as of 2012 by Jhames Bolumbero, and Stéphane Aulery has contributed a French translation.
The "indent wrapped lines" feature from the OS X and Windows front-ends has been added. This makes it easier to read the Story code when entire paragraphs are indented.
Inform project folders are now displayed in the file manager with Inform icons instead of regular folder icons, and the Materials folder has its own icon as well.
Instead of Ctrl+(Alt+)Left and Ctrl+(Alt+)Right for navigating between sections, the shortcuts now use the , and . keys as in the OS X front-end, so as not to conflict with the well-known Ctrl+Left and Ctrl+Right shortcuts for jumping to the next or previous word.
Matteo Settenvini contributed an improvement where application settings are stored using the Gnome platform's newer GSettings API, rather than the obsolete GConf which caused some problems (e.g. bug 0000600).
Attempted to make the program's error messages more understandable and clearer about how to solve the error.
Sound effects now play correctly in the Game panel, when playing a Glulx project which contains them. (See bug 0000464.)
Bug fixed (0000483) whereby editing extensions might lead to corruption.
Bugs fixed (0000678, 0000717) to improve the refresh speed of the Skein display when there's a large skein; bug fixed (0000677) to do with labels appearing in the wrong places.
Bugs fixed (0000522, 0000692) in the Extension installation process.
Bug fixed (0000529) whereby HTML links in Glulx games did not always work in the Game panel.
Bug fixed (0000653) whereby story files released in unblorbed form would incorrectly have Strict Debug checking left on.
Bug fixed (0000654) whereby the setting for the user's preferred glulx interpreter would sometimes be forgotten when Gnome Inform was quit and then restarted.
Bug fixed (0000676) whereby Find and Replace didn't get case sensitivity correct.
Bug fixed (0000681) whereby the interface would hang on reloading a source text which had been edited and saved in some other application while also open in Gnome Inform. Also, moved the notification displayed when this happens to the status bar, in order to be less intrusive.
Bug fixed (0000691) whereby the interface might crash if a Glulx project being played tried (in error) to use a picture which did not exist.
Bug fixed (0000702) changing "Elastic Tabs" to "Elastic Tabstops" as per the request of elastic tabstops' inventor, Nick Gravgaard.
Bug fixed (0000725) whereby the Contents tab displayed the headings hierarchy with incorrect structural indentation.
Bug fixed (0000731) whereby Gnome Inform crashed when changing the panel in which the Game ran, under some circumstances.
When opening a project which has been renamed so that the folder name no longer ends with ".inform", Gnome Inform now offers to put the ".inform" back again. (See bug 0000738.)
Bug fixed whereby Gnome Inform crashed when the debug log was not available to open. (Discovered through bug 0000999.)
Bug fixed (0001087) whereby a failure in opening a project from the welcome splash screen would quit the application instead of returning to the splash screen.
Bug fixed (0001109) whereby Gnome Inform crashed when encountering an empty directory in the user's installed extensions area.
Bug fixed (0001123) whereby Gnome Inform crashed when running a story where input was entered in more than one Glulx window.
Bug fixed (0001135) whereby Gnome Inform occasionally crashed when starting a story.
Bug fixed (0001187) whereby Glulx text effects persisted from one run of a story to the next.
Bug fixed (0001206) whereby headings surrounded by whitespace-only lines (rather than empty lines) were not included in the Contents pane.
The default spellchecking language is now English, rather than the user's system language. (See bug 0001209).
Bug fixed whereby Gnome Inform crashed when there was an error opening a project, instead of displaying an error message.
Bug fixed whereby Gnome Inform crashed when encountering an unknown command line option.
Bug fixed whereby the Documentation pane didn't load on the left-hand side.
Bug fixed whereby "paste code" icons on the Index pages didn't paste any code.
Bug fixed whereby closing the welcome splash screen did not quit the application.
In addition, many minor and cosmetic bug fixes to the build process, and removed legacy code that was required for compatibility with the now obsolete Debian Lenny operating system.
[x] Inform for Command-Line Linux
The number of supported architectures has dropped to four: Linux on x86_64, i386, ppc (32-bit), and arm6hf (e.g. Raspberry Pi). There are no longer ports to s390 or s390x, no armv5tel, and no Solaris support. There are no more separate downloads for the various architectures, either: the single I7_6L01_Linux_all.tar.gz is universal.
The Cheesy Perl IDE has been updated in the following ways: Any files found in the Extensions directory which lack an .i7x extension will have one added. Any project "Whatever Materials" folder will be renamed "Whatever.materials". Inform will no longer compile to z5 or z6; existing games using either of those settings will have their compilation targets changed to z8.
A bug identified by Simon Andersson, where i7 couldn't find its components if installed to a non-default location, has been fixed.
[Chapter: Documentation and Index] Books
The documentation has of course been extended and modified to cover the changes in this new build of Inform, but beyond that:
From this build, the Inform documentation (the manuals "Writing with Inform" and "The Recipe Book") are released in EPUB format for the first time, and can be read on tablets such as iPads, or in ebook applications such as Apple's iBooks. The documentation HTML, which used to be coded in late-1990s idioms and was difficult to do much with, now passes XHTML 1.1 Strict and uses CSS for styling. (See suggestion 751034.)
A new "General Index" tab in the Documentation pane features an extensive A-Z index, hand-prepared by Andrew Plotkin: it's a refinement of the one he has for some years maintained online, and unlike a mechanical search tool it's based on human understanding of the material.
The other conspicious change is that the contents page for the documentation now presents the two books, Writing With Inform and The Recipe Book, side by side. Informal surveys had suggested that many readers never found the Recipe Book at all: we wanted to change that. New "expand all" buttons make it possible to see the entire detailed contents page at once. (See suggestions 860937 and 783273.)
The PURLOIN testing command is now documented for the first time. (See suggestion 752104.)
The syntax analysis layer in Inform was completely rewritten for this build, and as a side-benefit from that, we are for the first time publishing a complete specification of the language, mechanically generated from the source code for the compiler (along with an extensive commentary).
[x] The Index
The Index has been redesigned. It had gradually grown in coverage and depth, build after build, with a variety of designs used to navigate around it. In this build we've bitten the bullet and imposed a new design to recognise that each of the major Index sections (Contents, Actions and so on) has multiple "elements", and that we have a two-level hierarchy, not one. There's greater use of mouse-over highlighting to advertise links; note the dark grey bar to the left of the section banners, which takes the reader to a new Welcome home page - the so-called "Periodic Table" page, because it shows every element.
We have tried to make each element of the Index a little more detailed and a little clearer visually. For example, the Contents listing itemises how many words of source text fall under each heading. Indexed rules include a new icon which reveals their Responses (see below).
There are far too many changes to itemise, but the following are noted because they arose from Uservoice suggestions:
Command aliases are now indexed in individual actions. (See suggestion 937641.)
The Alphabetical action chart now tabulates requirements on light and nouns. (See suggestion 3265911.)
The Actions detail view now includes persuasion and unsuccessful attempt rules. (See suggestion 884661.)
[Chapter: The Inform language] Text
Previous builds of Inform supported two incompatible kinds of value for holding and dealing with text: "text" and "indexed text". "Indexed text" was much more flexible, but incurred speed and memory costs. Despite quite complicated semantics which allowed text to be converted into indexed text, with many such changes occurring silently so far as the author was concerned, this all made text handling more complicated than it needed to be. The author needed to remember to make some properties and variables indexed, others not, and so on; and some kinds of manipulation were impossible.
What does this mean? The short answer is: you can stop typing the word "indexed" and everything will be fine. For example:
let T be an indexed text;
let T be "Jinxed wizards pluck ivy from my quilt";
now doesn't need the first line in order to make T possible to alter or manipulate, and similarly for kind declarations in table columns. Inform still understands the term "indexed text", but it is synonymous with "text", and it has been removed from the Standard Rules throughout. Thus, for example, the phrase definition:
To decide what indexed text is line number (N - a number) in (T - indexed
text): ...
has been rewritten as the more generally applicable:
To decide what text is line number (N - a number) in (T - text): ...
and many other existing phrases can similarly be applied in a wider setting.
Most textual properties in past builds of the Standard Rules were declared as "text", not "indexed text". So, for example, the following would have failed to compile, and could not have worked:
The Grange is a room. A green Citroen, a fisherman, a brace of pheasants
and a topiary duck are here.
The player carries an E-bomb.
After dropping the E-bomb:
say "There is an almighty explosion!";
remove the E-bomb from play;
repeat with item running through things:
replace the text "e" in the printed name of the item with "*".
It now does the following:
Grange
You can see a green Citroen, a fisherman, a brace of pheasants and a
topiary duck here.
>drop all
(the E-bomb)
There is an almighty explosion!
>l
Grange
You can see a gr**n Citro*n, a fish*rman, a brac* of ph*asants and a
topiary duck here.
Similarly, it's now easy to find the length of names:
When play begins:
repeat with item running through things:
say "[item]: [number of words in the printed name of
the item] word[s]."
produces
yourself: 1 word.
E-bomb: 2 words.
green Citroen: 2 words.
fisherman: 1 word.
brace of pheasants: 3 words.
topiary duck: 2 words.
In particular, this means that many I6-level hacks used to determine the lengths of strings - such as those used by the "Basic Screen Effects" extension in past builds - can go.
From the language design point of view, there are really no disadvantages, but there is one complication. What should this do?
let X be (put either text or indexed text here);
now the score is 10;
now X is "Your score is [score].";
increase the score by 5;
say X;
In all past builds of Inform, this prints "Your score is 15." if X is a text, but "Your score is 10." if it's an indexed text. The difference hangs on when "[score]" is substituted: a text could hold unsubstituted material which would be substituted later (when printed), but an indexed text couldn't.
The new rule is as follows:
permanent substitution occurs immediately if the text refers to a local
variable which will soon no longer exist, and otherwise
permanent substitution occurs when the text is changed for the first time,
and otherwise
temporary substitution is made each time the text is printed.
Thus the above would print "Your score is 15." ("score" is referred to, but it's a global variable) but this:
now the score is 10;
let X be "Your score is [score in words].";
replace the text "e" in X with "*";
increase the score by 5;
say X;
prints "Your scor* is t*n.", not "Your scor* is fift**n.", because a permanent substitution occurred when the replacement was made.
On the whole we think this is what people would expect, and it means that existing code such as:
now the right hand status line is "Time: [time of day]";
continues to work as before.
But there may be times when people will want to fix the text now. So there's a new phrase:
substituted form of (T - text)
which produces T with all substitution made - which will leave most texts alone, but change "It's [time of day]." into "It's 9:13 AM.", and so on. A new adjective for texts, "substituted" vs "unsubstituted", will tell us whether a text is carrying a [bombshell] or not.
The rarely-used use option:
Use maximum indexed text length of at least N.
is now renamed:
Use maximum text length of at least N.
The maximum, of course, applies only if the text is in its substituted form.
That's it for the changes as seen by the writer of I7 source text, and the remainder of this section of the log gives some technical details for I6 hackers only.
At the I6 level, of course, things are drastically changed. The price we pay for the benefits above is that the old T/IT division was more efficient in its use of time and memory, because it made the user hand-optimise code by constantly choosing between T (fast and small) and IT (slow and large). The new text format is a hybrid, which involves some compromise.
(i) There's always a heap now. In past builds, I7 would only compile the storage for a run-time pool of available memory ("the heap"), and the code to deal with it, if it was actually needed. Technically that's still true, but since text has to use the heap now, and text is ubiquitous, in practice there's always a heap. This costs memory space.
There's something a little ironic about typing about 8K of memory usage in programs as complex as those compiled by Inform, especially since I do it while listening to a Crazy Horse song on a copy of iTunes currently claiming 442 MB of unpaged memory. But memory concerns are not frivolous, given that IF needs to run in a browser now. To mitigate this, reference-counting in the heap means that many fewer copies of data are stored than in past builds, and so Inform generally needs a smaller heap to handle lists, texts, and so on. For large source texts involving lots of list-handling and hacking with text, the new system may actually need less memory at run-time, and will also run substantially faster. The worst case scenario is a very large source text, pushing the limits of the Z-machine, but which never did any text-hacking and never used lists: that kind of story file may now have to move to Glulx. (This is exactly the fate of "Bronze", for example.)
(ii) In past builds, a valid I7 text had to be either a packed string or a pointer to a routine. For example, the I6 code:
x = "deerstalker";
y = Elementary;
...
[ Elementary; print "You know my methods, Watson. Apply them."; ];
creates what used to be valid I7 texts, but no longer. If you need to define a new text in I6 code being used with I7, you have several options. In an inclusion, or a template file, just use (+ and +). For example, at one point the Standard Rules says:
Include (-
with saved_short_name (+ "yourself" +),
-) when defining yourself.
The effect of (+ and +) is that "yourself" is compiled by I7 into a valid text, rather than being left for I6 to get wrong.
If you can't do that, and you need a text variable, try this:
Array MyTextVariable --> PACKED_TEXT_STORAGE EMPTY_TEXT_PACKED;
(Don't use "": write EMPTY_TEXT_PACKED.) That's if it starts out blank; alternatively something like:
Array MyTextVariable --> PACKED_TEXT_STORAGE "briar pipe";
Then "MyTextVariable" is a valid I7 text.
If you have a constant piece of text, on the other hand, you can protect it from accidental damage and speed up its use slightly by writing:
Array MyTextConstant --> CONSTANT_PACKED_TEXT_STORAGE "Lestrade";
Don't mess with CONSTANT_PERISHABLE_TEXT_STORAGE and UNPACKED_TEXT_STORAGE.
(iii) If you need to change the value of a text variable, use BlkValueCopy:
BlkValueCopy(to, from);
where "to" and "from" are both texts. Note that "to" must already be a valid text: it's not sufficient for "to" to point to 2 words of memory somewhere. For example,
BlkValueCopy(to, EMPTY_TEXT_VALUE);
(iv) If you really need to generate texts on the fly, you can do so with:
x = BlkValueCreate(TEXT_TY);
which will be created empty. However, if so, then to prevent memory leaks you must subsequently:
BlkValueFree(x);
Don't mess with BlkValueDestroy.
(v) To print a text, use one of these:
TEXT_TY_Say(x);
print (TEXT_TY_Say) x;
Some old extensions call a routine called I7_String(x); this still exists, and does the same as TEXT_TY_Say. Another routine in past builds was called PrintText(x), and although this still exists, it has been renamed
PrintI6Text(x)
since it prints a packed string or calls an I6 routine, but won't work on the new I7 text value.
[x] Story viewpoint and story tense
A conspicuous difference between interactive fiction and a traditional novel is the point of view from which it's told. Inform usually produces text like:
You can see a grey cat in the basket.
where a novel would usually write:
He could see a grey cat in the basket.
Traditional IF is second person singular, and present tense, whereas most novels are told in the third person singular, and past tense. But these are just conventions - a few novels, for example, use the so-called present historic ("Napoleon looks up at the sky and sighs. Must Ney always be so doubting?"), and plenty are told in the first person singular ("I always get the shakes before a drop."). Inform now allows this too. The two values:
story viewpoint
story tense
control the style of the text produced. The story viewpoint has to be one of the values:
first person singular
second person singular
third person singular
first person plural
second person plural
third person plural
(from a kind called "narrative viewpoint"), while the story tense is one of:
past tense
present tense
future tense
(from a kind called "tense"). Combining these gives 18 possibilities in all.
Note that these settings change only the person and tense used by the texts produced by Inform as responses to commands; for example, they might change the dialogue
>EAST
You can't go that way.
to
>EAST
I couldn't go that way.
So in order to maintain the narrative voice, the author's own source text has to be written to match. For example:
The Taj Mahal is a room. "You stand and admire the Taj Mahal."
When play begins:
now the story viewpoint is first person plural;
now the story tense is past tense.
In short, tense and viewpoint switching is neat, but it isn't magic. (It can, however, be changed dynamically during play.)
If we want to write text which will work in whatever the current tense is, the following turn out to be useful little conveniences:
"[here]" produces "here" in the present tense, and "there" otherwise;
"[now]" produces "now" in the present tense, and "then" otherwise.
[x] Adaptive text
Paying attention to the tense and viewpoint is one reason why text might need to adapt. Another is that it might need to adapt according to whether nouns are singular or plural. For example, the following rule isn't ideal:
Instead of taking:
say "[The noun] is pinned down by Dr Zarkov's force field."
Most of the time it's fine ("The V-ray is pinned down by Dr Zarkov's force field"), but then:
> GET ME
You is pinned down by Dr Zarkov's force field.
> GET CONDENSERS
The condensers is pinned down by Dr Zarkov's force field.
The correction is very easy:
Instead of taking:
say "[The noun] [are] pinned down by Dr Zarkov's force field."
The result is much better: "The V-ray is pinned down..."; "You are..."; "The condensers are...". In fact, it's also convenient because it adapts to the story viewpoint and story tense: "The condensers will be pinned down..."; "He was pinned down...".
Note that "[are]" is not a specially-written text substitution. In fact Inform can do this with any verb that it has a definition of. For example,
"[The noun] [carry] too much static charge."
would also adapt itself - "The V-ray carries too much static charge", and so on. The Standard Rules know many such verbs already, and can adapt all of them. Here is section SR4/1 of the SR, at time of writing:
To seem is a verb. To pick is a verb. To lack is a verb. To put is a verb.
To need is a verb. To eat is a verb. To lead is a verb. To go is a verb.
To arrive is a verb. To get is a verb. To look is a verb. To see is a verb.
To find is a verb. To search is a verb. To discover is a verb.
To switch is a verb. To close is a verb. To talk is a verb.
To provoke is a verb. To wave is a verb. To lock is a verb. To give is a verb.
To open is a verb. To touch is a verb. To take is a verb. To may is a verb.
To wait is a verb. To feel is a verb. To happen is a verb. To push is a verb.
To pull is a verb. To turn is a verb. To achieve is a verb. To squeeze is a verb.
To smell is a verb. To sniff is a verb. To hear is a verb. To listen is a verb.
To taste is a verb. To jump is a verb. To rub is a verb. To pass is a verb.
Negative forms like "[are not]" are also available:
"[The noun] [cannot touch] the ionizer terminal."
might produce "The V-ray will not be able to touch the ionizer terminal.", for example.
As these examples hint, the verb adapts itself to the most recently printed object name. All of this only works if the previous object's name is printed from a substitution. So:
"[The condensers] [are] working."
will work -- correctly forming "The condensers are working.", "The condensers will be working." or "The condensers were working.", according to the story tense -- but
"The condensers [are] working."
probably won't work. Inform doesn't have any way to understand the raw text outside of the text substitution marks "[" and "]".
That object's identity is a value stored in "prior named object", which it's very occasionally useful to change by hand:
now the prior named object is the noun;
say "Oh, [are] [they]?"
which will produce "Oh, is it?", "Oh, are they?", or equivalents in other tenses, depending on whether the noun is singular or plural, even though the noun wasn't explicitly named in the text. Occasionally it's even useful to clear the prior named object altogether:
now the prior named object is nothing;
say "There [are] no room."
This forces the "[are]" to take a singular form - "is", "was", "will be". We need to do this because "There" in English is a sort of meaningless placeholder noun; it doesn't represent any object.
Something else to be careful with is the use of lists. If we write this:
"[The condensers] and [the V-ray] [are] smashed by Voltan's birdmen."
then Inform is likely to print:
The condensers and the V-ray is smashed by Voltan's birdmen.
because it looks at the most recently named object - the V-ray, singular - to decide whether to use "is" or "are". On the other hand, Inform gets this right:
"[The list of things on the bench] [are] smashed by Voltan's birdmen."
Because Inform constructs the list itself, it's able to appreciate that the things listed are jointly the subject of the verb, and it uses that information to decide on "is" or "are". So:
The condensers and the V-ray are smashed by Voltan's birdmen.
The Atomic Furnace shovel is smashed by Voltan's birdmen.
If we need an adaptive message with a verb which doesn't belong to Inform's built-in set, all we need do is declare it. For example:
To retrofit is a verb.
defines a verb without telling Inform what it means. Inform will throw a Problem message if we try to write text like "Flash retrofits the meteor beam" because, after all, it doesn't know what "retrofit" means. But it does still know how to print it, so this works:
"[The actor] [retrofit] the Mecha-Mole."
which might come out as "Dale retrofits the Mecha-Mole", or "Barin's archers retrofitted the Mecha-Mole", and so on.
This is especially neat for writing a single response to an action which works regardless of who the actor was. For example, the Standard Rules include:
say "[The actor] [put] [the noun] on [the second noun]."
And this can make either:
You put the revolver on the table.
General Lee puts the revolver on the table.
In second-person-singular IF, the player is always "you". Many messages look like so:
"You have twenty minutes remaining."
where the subject, or the object, of the sentence is "you". But what if we want to have this text adapt itself to multiple narrative viewpoints? The solution is to use the following:
"[We]" or "[we]"
"[Us]" or "[us]"
"[Our]" or "[our]"
"[Ours]" or "[ours]"
"[Ourselves]" or "[ourselves]"
For example:
"[We] [carry] the Queen's warrant."
"The birds drop pebbles on [us]. Right on [our] heads!"
"[Ours] [are] the burdens of office, which [we] take on [ourselves]."
(Notice that all five of these forms are differently worded, in English. That's the reason why we use the plural to write them - the traditional second person plural forms would be "you", "you", "your", "yours" and "yourself", so we wouldn't know if "[you]" was supposed to be the subject or the object of the verb. So the convention with all of these adaptive forms is that we use "we" and its variations. That's also why the verbs are written in the plural - "[are]", not "[is]"; "[carry]", not "[carries]".)
We have similar adaptive pronouns for objects other than the player:
"[They]" or "[they]"
"[Them]" or "[them]"
"[Their]" or "[their]"
"[Theirs]" or "[theirs]"
"[Themselves]" or "[themselves]"
For example:
Instead of examining in the Netherworld:
say "[regarding the noun][They] [have] no clear outline in this
misty netherworld."
produces:
> EXAMINE ME
You have no clear outline in this misty netherworld.
> EXAMINE MARK
He has no clear outline in this misty netherworld.
> EXAMINE DRUMS
They have no clear outline in this misty netherworld.
Note that we have to say "[regarding the noun]", not just start in with "[They]", because nothing has been named so far in the sentence - so Inform doesn't know what object it refers to. "[regarding the noun]" prints nothing, and simply tells the printing part of Inform that the subject has changed.
This isn't always needed:
"[We] [have] a look at [the noun], but [they] [are] just too big."
works fine, because printing "[the noun]" changes the subject to that, and then "[they]" agrees with it automatically. The text might come out, for example, as:
I had a look at Peter Rabbit, but he was just too big.
You have a look at the chessmen, but they are just too big.
We have a look at ourselves, but we are just too big.
There's also the peculiar impersonal non-object for English sentences like "It is raining" or "There are books":
"[It]" or "[it]"
"[There]" or "[there]"
These look pointless - but consider the two texts
"[We] [take] [the noun]. It [rain] harder."
"[We] [take] [the noun]. [It] [rain] harder."
The first one risks printing "We took the scissors. It rain harder.", because it makes "[rain]" agree with "scissors", which are plural. But the second text makes "[rain]" agree with "[it]". And, as a convenience:
"[It's]" or "[it's]"
"[There's]" or "[there's]"
do the obvious thing using the current story tense.
Next up, demonstratives: "[Those]" or "[those]" adapt as needed. For example,
"[We] really [are not] tall enough to reach [regarding the noun][those]."
might expand to
You really are not tall enough to reach that.
He really was not tall enough to reach those.
They really will not be tall enough to reach her.
with "[those]" expanding to "that", "those", "her" and so on as needed.
We can also adapt using "[Possessive]" or "[possessive]":
"[regarding the noun][Possessive] height"
might adapt to, say, "Our height" or "Alice's height" as appropriate.
For any verb V which Inform knows, we can form modal auxiliaries as follows:
"[can V]" or "[cannot V]" or "[can't V]"
"[could V]" or "[could not V]" or "[couldn't V]"
"[may V]" or "[may not V]" or "[mayn't V]"
"[might V]" or "[might not V]" or "[mightn't V]"
"[must V]" or "[must not V]" or "[mustn't V]"
"[should V]" or "[should not V]" or "[shouldn't V]"
"[would V]" or "[would not V]" or "[wouldn't V]"
For example, "Dale [cannot go] to the Cave." might adapt as "Dale could not have gone to the Cave." Most of the English modal verbs are defective in that they do not exist in all tenses or parts of speech - that's why you can't say "to must" or "I am musting" or "I will must" - so there are limits to how good Inform's adaption is, in some of these cases. The modal "can" even uses rewording: Inform says "Dale will be able to go to the Cave." to avoid having to say the impossible "Dale will can go to the Cave."
Finally, we can adapt English contracted forms of verbs:
"[aren't]"
"[don't]"
"[haven't]"
"[won't]"
So, for example:
Instead of taking something:
say "[The noun] [are] pinned down by Dr Zarkov's force field.
[They] [aren't] free to move. [They] [can't] move, and [they]
[shouldn't] move. [They] [won't] move. [They] [haven't] a chance
to move. Anyhow, [they] [don't] move."
can (depending on the viewpoint) produce variations like these:
The condensers are pinned down by Dr Zarkov's force field. They aren't
free to move. They can't move, and they shouldn't move. They won't
move. They haven't a chance to move. Anyhow, they don't move.
You were pinned down by Dr Zarkov's force field. You weren't free to
move. You couldn't move, and you shouldn't move. You wouldn't move. You
hadn't a chance to move. Anyhow, you didn't move.
(See suggestion 751226.)
[x] Verbs as values
Each verb known to Inform is also a value of the new kind "verb". For example:
showme the verb contain;
showme the verb might;
showme the verb provoke;
produces:
verb: verb contain
verb: verb might
verb: verb provoke
As this demonstrates, if V is the infinitive form of the verb, then "verb V" is a value of the kind "verb".
Two adjectives are provided for use with verbs: "modal" (or "non-modal") to pick out verbs like might, could, should, and so on; and "meaningful" (or "meaningless") to pick out verbs which have a defined meaning as an Inform relation. For example, in the Standard Rules, the verb contain is meaningful, the verb might is modal, and the verb provoke is meaningless.
If V has a meaning as a relation of objects, then "meaning of V" produces that relation. For example,
showme the meaning of the verb contain;
showme the meaning of the verb provoke;
produces:
"meaning of the verb contain" = relation of objects: containment relation
"meaning of the verb provoke" = relation of objects: equality relation
(As this demonstrates, if a verb has no meaning, or its meaning doesn't relate to objects, we get just the equality relation.)
In fact, Inform even defines a verb "to mean": it's meaningful, and its meaning is the meaning relation. Thus:
if the verb mean means the meaning relation...
is true. More usefully, we can search our vocabulary like this:
showme the list of verbs meaning the containment relation;
which produces:
"list of verbs meaning the containment relation" = list of verbs: {verb contain}
One use for verbs as values is that it enables adaption to other tenses or numbers. For example,
"we [adapt the verb provoke in the future tense from the first person plural]"
produces the text "we will provoke". In general, we can use:
"[adapt V]"
"[adapt V in T]"
"[adapt V from VP]"
"[adapt V in T from VP]"
"[negate V]"
"[negate V in T]"
"[negate V from VP]"
"[negate V in T from VP]"
for any tense T or viewpoint VP; these default to the current story tense and the current story viewpoint if not supplied. The verb doesn't have to be named explicitly, so for example:
To decide which text is the rendering of (V - verb) (this is verb rendering):
decide on "[negate V in the past perfect tense]".
When play begins:
showme verb rendering applied to the list of meaningful verbs.
produces:
"verb rendering applied to the list of meaningful verbs" = list of texts:
{"had not had", "had not related", "had not meant", "had not provided",
"had not contained", "had not supported", "had not incorporated", "had not
enclosed", "had not carried", "had not held", "had not worn", "had not
been able to see", "had not been able to touch", "had not concealed", "had
not unlocked"}
Lastly, we can obtain:
"[infinitive of V]"
"[past participle of V]"
"[present participle of V]"
For example, "[present participle of the verb incorporate]" is "incorporating".
[x] Non-English Inform
Intensive work has gone into making both the adaptive text system and Inform's syntax analyser flexible enough to work in languages other than English. For example, an experimental stab at French Inform has adaptive pronouns such as "[celui]", "[il]", "[le]", "[lui]", "[son]" and "[le sien]"; it supports tenses not existing in English, such as the past historic; and it can conjugate the whole gamut of French verbs, which are very much harder than English ones. For example, once the experimental French Inform extension is included, the sentence:
In French craindre is a verb.
will automatically create a text substitution "[craignis]" which can come out in about 100 different forms: "a crainte" (a female person has been feared), "craignirent" (third-person plural past historic active), and so on.
Inform's adaptive linguistics are specified by programming the new Inform syntax analysis layer using a grammar called Preform. French, for example, takes about 2200 lines of Preform grammar just to handle verbs properly. Preform is not documented in the main Inform manual, and it remains experimental, but see the newly published syntax specification.
Internationalising Inform 7 remains a long-term goal, but these are major steps towards it. The scheme is that a translator creates an extension called, say, French Language, and that this contains some material similar to that in I6's "language definition files" together with Preform grammar, translations of responses in the Standard Rules, creations of unusual tenses, and so on. The draft "French Language" extension, which is still incomplete in that it doesn't translate the Responses, is published alongside this build for the benefit of anybody interested.
[x] Responses
Many of the short texts written by Inform in play do not appear in the source text for the story, and come instead from extensions, and especially from the Standard Rules. They are often replies to commands:
> INV
You are carrying nothing.
Such texts are called "responses". The Inform 6 jargon here was "library messages", and a crude low-level way to alter these using I6 code was up to now the best way to customise the dialogue appearing in play. (In practice most authors used Inform 7 extensions to do this for them, but those extensions in turn relied on horrible I6 hacks.)
Inform now provides a flexible way for any extension to make its responses customisable, and every built-in extension has been rewritten to do so. We expect many third-party extensions to follow suit.
For example, many of the smaller rules in the SR are capable of producing one or two standard responses. These are now labelled with the rule's name and then a bracketed letter - (A), (B), (C), ... as needed so that every response has its own unique name. For example, the SR lays down:
Carry out taking inventory (this is the print empty inventory rule):
if the first thing held by the player is nothing,
say "[We] [are] carrying nothing." (A) instead.
which makes the familiar text "You are carrying nothing." a response named:
print empty inventory rule response (A)
These names are actually values, belonging to the kind "response". Because of that, if we try this:
say "Hmm: [print empty inventory rule response (A)]"
Inform will produce
Hmm: print empty inventory rule response (A)
since we gave Inform a value to print, and that's just what it then did. But:
say "Hmm: [text of print empty inventory rule response (A)]"
produces "Hmm: You are carrying nothing.", unless of course the response has been changed.
It's very easy to change responses:
The print empty inventory rule response (A) is "Your hands are, like,
totally empty. Lame."
and we can even do this dynamically during play:
now the print empty inventory rule response (A) is "Your hands ...";
just as if we were setting a variable.
In practice we can't change these responses unless we know what they're called. One way to find out is just to read through the extensions we're using, but that's a laborious process. A more practical answer is to type:
> RESPONSES
which replies by listing the sets of responses currently available; for example, it says that RESPONSES 1 is the set of responses for the Standard Rules. We can then type exactly that:
> RESPONSES 1
Standard Rules:
block vaguely going rule response (A): "You'll have to say which
compass direction to go in."
print the final prompt rule response (A): "> [run paragraph on]"
...
and so on. This lists all of the responses, rule by rule, along with their current texts.
A more selective trick is to make use of the new activity "issuing the response text of". If we write:
Before issuing the response text of a response (called R): say "[R]: ".
we get dialogue like:
>WAIT
standard report waiting rule response (A): Time passes.
>NORTH
can't go that way rule response (A): You can't go that way.
(See suggestion 751870.)
[x] Variables and named constants
The customary way to create a variable in Inform is write something like:
The wolf count is a number which varies.
(Or "a number variable", equivalently.) This creates it and gives it the default value for whatever its kind is -- 0, in this case. So to give it a definite value takes a second sentence:
The wolf count is 31.
This is all rather a lot of typing, so a new way to do both steps in one is:
The wolf count is initially 31.
This creates "wolf count" as a number which varies, if it hasn't already been created, and gives it the initial value 31.
In the case of objects, it can be ambiguous what the kind is; Inform treats this situation in the same way it does when working out the kind of columns in tables, by being permissive rather than restrictive. For example:
Peter is a man. The accursed one is initially Peter.
This creates "accursed one" as an object which varies, to be on the safe side. Inform can see that it currently contains a "man" (Peter), but it doesn't know if the variable will later need to hold something else -- a woman called Jane, say, or even a black hat. If in fact the variable must be more restrictive, it's legal to write:
Peter is a man. The accursed one is initially Peter.
The accursed one is a man that varies.
thus telling Inform exactly what is intended.
It's also now possible to create named constants:
The speed limit is always 55.
makes "speed limit" a number constant. Any attempt to set this elsewhere, or change its value, will result in a Problem message, and moreover it can be used in contexts where variables wouldn't be allowed. For example,
The list of significant speeds is initially {30, the speed limit, 90}.
is legal, since the braced list is a constant, and produces
"list of significant speeds" = list of numbers: {30, 55, 90}
Similarly a named constant can be used as a table entry, and as the value of a property, so for example:
A person has a number called maximum comfort speed.
The maximum comfort speed of Trevor is the speed limit.
means that the SHOWME TREVOR testing command produces, among other data,
maximum comfort speed: 55
[x] Floating-point arithmetic
Inform has a new kind of value, "real number", which is only available for projects set to Glulx. "real number" behaves very like the "float" type in C, C++, Java and similar programming languages, since, like them, it follows the IEEE-754 binary32 standard for floating-point arithmetic.
It may seem odd to be creating a second kind of number, having just gone to great effort to unify two kinds of text, but the difference here is that arithmetic is fundamentally different for floating-point numbers.
Real numbers are typed much the way that they would be in science or mathematics textbooks. Thus:
let gamma be 0.5772156649;
let Avogadro's number be 6.022141 x 10^23;
(Inform will instead use notations like 4.32E-22 if the use option "Use engineering notation" is on, but by default it's off.)
The fundamental trade-off with computer representations of real numbers is that we compromise on the accuracy of numbers, but not their size, which can be enormously large or small. The range we can hold is roughly:
1.18 x 10^38 to 3.4 x 10^38
The mathematical constants "pi" and "e" are built in to Inform, but must be typed in lower case.
Numbers can always be used where real numbers are expected: for example, "cosine of 2" does the same as "cosine of 2.0" and produces -0.41615. The standard arithmetic operations work on numbers unless one of the values worked on is a real number, in which case the real-number calculation is done instead. Thus "3 / 2" is 1, because the whole number 2 goes into 3 only once, but "3 / 2.0" and "3.0 / 2" both produce the real number 1.5.
On the other hand, real numbers can't be used in place of numbers, so e.g.:
word number 1.6 in "The Great Wall of China"
is not allowed. But conversion can be made explicitly: "1.6 to the nearest whole number" produces the number 2.
For details on real arithmetic, and on how infinities and non-numbers are represented, see "Writing With Inform".
Text substitutions make it easy to print real numbers in the form needed:
"The semicircle is roughly [pi to 3 decimal places] paces around."
"[1.23457 x 10^8 in decimal notation]"
"[the reciprocal of 137 in scientific notation]"
and so on. Real numbers can similarly appear in Understand grammar. An extensive suite of mathematical functions is provided:
real square root of X [unlike "square root of", which produces a number]
floor of X
ceiling of X
absolute value of X
reciprocal of X
X to the power Y
exponential of X
logarithm of X [which is a natural log]
logarithm to base Y of X
X degrees [which converts X from degrees to radians]
sine of X
cosine of X
tangent of X
arcsine of X
arccosine of X
arctangent of X
hyperbolic sine of X
hyperbolic cosine of X
hyperbolic tangent of X
hyperbolic arcsine of X
hyperbolic arccosine of X
hyperbolic arctangent of X
And these conform to IEEE-754 in the usual way.
Inform has always been able to create arithmetic kinds of value; for example:
Weight is a kind of value. 10 kg specifies a weight.
Now that there are two ways to perform arithmetic, Inform needs to decide which to use in each case. It decides on the basis of whether floating-point numbers are used in the notation. Above, for example, "10 kg" looks like a whole number of kilograms, so Inform uses number arithmetic. But this:
Weight is a kind of value. 1.0 kg specifies a weight.
looks real, so Inform uses real number arithmetic. This allows, for example,
1.9891 x 10^30 kg [the mass of the Sun]
9.109383 x 10^31 kg [the mass of an electron]
and enables reasonably accurate scientific calculations to be made. The built-in extension Metric Units has been completely rewritten to use real arithmetic throughout.
Inform has for some years supported "equations" - calculations written out as formulae - but up to now they have used only the basic four functions on a calculator: addition, subtraction, multiplication, division.
In this build, arithmetic phrases can be used in abbreviated form in equations. For example:
let x be given by sin x = 1 where x is a real number;
works out x as pi divided by 4, which is to say, 90 degrees. The Phrasebook entries on the mathematical functions give their abbreviations, but here they all are as a list:
abs, root, ceiling, floor, int, log, exp, sin, cos, tan,
arcsin, arccos, arctan, sinh, cosh, tanh, arcsinh, arccosh, arctanh
("root" automatically means the real-number form of square root operation.) As an example, here's the definition of arcsinh given in the Standard Rules:
To decide which real number is the hyperbolic arcsine of (R - a real number)
(this is the arcsinh function inverse to sinh):
let x be given by x = log(R + root(R^2 + 1)) where x is a real number;
decide on x.
The final bracketed clause "this is the arcsinh function inverse to sinh" tells Inform two useful things - to call this "arcsinh" in equations, and that it can solve implicit equations like "arcsinh x = 1" using the inverse function, viz., by performing "x = sinh 1". It's quite legal to create new mathematical functions in this way.
[x] Miscellaneous minor changes to the language
** It's conventional for web pages to provide "alt-text" for significant images displayed, so that partially sighted or blind users can get an idea of what is being shown. Inform adopts the March 2014 extensions to the Blorb format and the Babel standard in order to provide such text for figures and sounds. The author simply adds short paraphrases in brackets, like so:
Fugue is the file "Bach.ogg" ("A church organ playing a Bach fugue.").
Figure 2 is the file "butterfly.jpg" ("A red admiral butterfly.").
Release along with cover art ("A cathedral at sunset.").
** In previous builds it has been legal to mark headings with "(not for release)" to say that the material inside shouldn't be included on a release; it's now legal to do the reverse, using "(for release only)" to mark material which is only included on a release. (See suggestion 999953.)
** The I6 code generated by Inform now includes comments noting which paragraphs of the template originate which I6 code. This makes no difference to the effect of the code, but may help debuggers and template hackers. (Not suggested on Uservoice, but by Andrew Plotkin in the Inform 6 maintenance mailing list.)
** In previous builds all commands starting with a given verb could be removed:
Understand the "take" command as something new.
It's now also legal to clear out all the commands leading to a given action:
Understand nothing as taking.
Note that other senses of "take" - for taking off clothes, for example - would be unchanged, as would other senses of "get" - for getting out of rooms, etc. (See suggestion 751396.)
** When defining phrases, Inform has for some years allowed "one/two/--" to mean that the word in question can be "one", "two", or omitted altogether. The same is now true when giving slashed alternatives in Understand grammar. Thus:
Understand "brief underwood/urquhart/--" as briefing.
matches BRIEF, BRIEF UNDERWOOD, or BRIEF URQUHART. (See suggestion 751366.)
** A new use option, "Use unabbreviated object names", instructs Inform not to recognise names in the source text other than in full. For example,
West of the Kitchen is the Roaring Range. South of the Range is the Pantry.
is ordinarily read by Inform as constructing three rooms (Kitchen, Roaring Range, Pantry); but with this use option set, it makes four (Kitchen, Roaring Range, Range, Pantry), in two disconnected pieces of map. Namespace purists have asked for this option, which makes Inform behave a little more like a conventional programming language; but it is very much off by default.
Note that this has no effect on what commands are recognised in play, and affects only how Inform reads the source text of the project. (See suggestion 751458.)
** New phrases have been added to make it easier to see the contents of tables as they change:
To showme the contents of (T - table name): ...
To say the/-- current table row: ...
To say row (N - number) in/from (T - table name): ...
To say (TC - table column) in/from (T - table name): ...
These are intended to authors with testing, not for players to see. The typical output for a full table is:
Table of Frogs
(row 1) | 13 | fish |
(row 2) | 21 | toad |
while a column comes out as a comma-separated list "fish, toad". (See suggestion 751330.)
** In past builds, if authors wanted an action to have a past participle then this had to be specified by hand:
Photographing is an action with past participle photographed, applying
to one thing.
The "with" was optional. It is now compulsory, but in any case, past participles are automatically generated using the adaptive linguistics tricks discussed above - in most cases "-ing" is replaced with "-ed", but Inform knows some 460 irregular exceptions, such as caught, fled, crossbred, taken, woven. In all likelihood, past participle declarations can simply be removed from existing source text.
** The RULES ALL testing command now works better, fixing a bug causing it not always to list all inapplicable rules, and giving a brief reason why such rules are inapplicable.
** Rulebooks were previously limited to 10 named outcomes (each); there is now no limit.
** The construction "list of D", where D is a description, now allows the description to include references to "let" and loop variables. Thus for example:
let L be the list of things in Downton Abbey;
always worked, but
let the place be Downton Abbey;
let L be the list of things in the place;
only now works. (See suggestion 751032.)
** Inform's understanding of the "-where" words has been improved: that is, the words somewhere, anywhere, nowhere and everywhere. Inform considers anywhere to be the same as somewhere, so there are really three cases here.
In previous builds, "somewhere" and "nowhere" meant, roughly speaking, "a room" and "no room". Sometimes this was sensible ("if somewhere is visited, ..."), but it gave sentences like these a strange reading:
if the marble is somewhere, ...
if the marble is nowhere, ...
with the first asking if the marble is a room (no) and the second if it is not a room (yes). Past builds did understand "if B is everywhere", in the case where B was a backdrop, but that was a special case.
In the new build, "-where" words as objects of the copular form of "to be" refer to the room which something is in. To put that another way, sentences such as
if somewhere is visited, ...
mean just what they did before; but
if the marble is somewhere, ...
if the marble is nowhere, ...
now tests whether the marble is (indirectly) in a room. This is the same test which used to be called "on-stage" and "off-stage", which still work fine, but we prefer the new wording in the documentation. These are linguistically more interesting than adjectives, and we could write, for example:
if the marble is somewhere dark, ...
if the marble is somewhere which is not dark, ...
Note that the place referred to by "somewhere" is the room which ultimately contains the marble. For example, if a glowing marble is in a closed wooden box on a table at the bottom of the Coal Mine, then it is still "somewhere dark", even though there's light inside the box. Note also that:
if the Coal Mine is somewhere dark, ...
continues be true, and that the meaning of "to be in" has not changed. Thus
if the marble is in a dark room, ...
if the marble is in somewhere dark, ...
both continue to talk about what the marble is immediately inside - the wooden box, which is not a room, so both are false.
It's legal to use the -where words in assertions, too:
Godot is a man. Godot is nowhere.
in which case Godot begins off-stage - not in any of the rooms. At the opposite extreme:
The stars are a backdrop which is everywhere.
(Only backdrops can be everywhere.) Moreover, these can be changed with "now":
now the Lady is nowhere;
duplicates the effect of the old phrase "remove the Lady from play", which, again, we now prefer not to use, but which still works. This works for backdrops too:
After sleeping:
say "It's a bright new day!";
now the stars are nowhere.
After waiting:
say "Darkness falls rapidly here.";
now the stars are everywhere.
Writing "now the marble is somewhere" is not allowed, since this is too vague about where.
(See the discussion following suggestion 1286087.)
** On Glulx-compiled projects, you can now have up to 256 temporary values ("let" and "repeat" variables, etc.) at a time. Previously the limit was 15, and for Z-compiled projects it still is, since this is a restriction from the virtual machine itself. (See bug report 0001092, a blatant and successful attempt to pitch a suggestion under cover of the bug report database.)
** The Understand tokens
[anything]
[anybody]
[anyone]
[anywhere]
are now equivalent to "[any thing]", "[any person]" and "[any room]". Note that "[anything]" was previously read as equivalent to "[something]", and "[anybody]" and "[anyone]" as "[someone]": the crucial difference is that "[any thing]" matches any named thing anywhere in the story, whereas "[something]" is restricted to the player's vicinity.
** Five new values have been added to the kind "command parser error", specifically:
can't again the addressee error
comma can't begin error
can't see whom to talk to error
can't talk to inanimate things error
didn't understand addressee's last name error
This routes five of the parser's errors through the "printing a parser error" activity for the first time. (See bug report 0000525.)
** Last and very much least, it is now legal to write a sentence like:
"Madame Fanny has rules." is a text.
though there is really no good reason to do so. (See problem 0000685 from the bug tracker.)
[x] Removal of procedural rules
In June 2010 it was announced that Inform's procedural rules would be withdrawn in the next major release. We have had some minor releases in between, but the time has now come.
Procedural rules were originally designed to provide a last-resort way to alter the working of the Standard Rules (and of other extensions) by allowing certain rules to be ignored, substituted and so on. In practice, they caused confusion in use, and incurred significant run-time overheads in terms of both memory and running time.
There is therefore no longer a "procedural rulebook", and attempts to create rules such as this:
Procedural rule: ignore the print final score rule.
will produce problem messages.
The functionality provided by procedural rules wasn't needed often, but it remains useful to have a last-resort mechanism. The following is available instead:
The print final score rule does nothing.
The rule continues to be listed in any rulebook it would normally be listed in, but now it doesn't do anything. More usefully, we can attach a condition:
The print final score rule does nothing if the score is 0.
The print final score rule does nothing unless the score is 100.
We can also substitute a rule of our own:
This is the print fancy final score rule:
say "Oh my, you scored a mammoth [score]!"
The print fancy final score rule substitutes for the print final score rule.
and once again a condition can be applied:
The print fancy final score rule substitutes for the print final score
rule when the score is greater than 100.
The following phrases, which could be used only in procedural rules, have been removed from the built-in set:
ignore (rule)
reinstate (rule)
reject the result of (rule)
accept the result of (rule)
substitute (rule) for (rule)
restore the original (rule)
move (rule) to before (rule)
move (rule) to after (rule)
Anybody who never used procedural rules will never notice that these have gone, but one other related change might affect them. There used to be two subtly different ways to make a rule or rulebook apply:
follow the print fancy final score rule;
consider the print fancy final score rule;
The difference was arcane and had to do with procedural rules, which were taken into consideration for "follow" but not "consider". This difference has now vanished, and to avoid confusion "consider" is being withdrawn. In all cases it can simply be replaced by "follow".
What do we gain by these changes? The language becomes simpler, and the new syntax is easier to read; run-time memory and stack usage is reduced for everyone, even people not using procedural rules in the first place; and, similarly, there are significant run-time savings in speed (in one test, of about 15%). It's also now possible to index the effects of rule manipulation, making it possible to see from the Rules Index page what has been altered. (See suggestions 751182 and 837651.)
[x] Removal of deprecated phrases
In June 2010 it was announced that a number of Inform's built-in phrases would be withdrawn in the next major release. That day has dawned.
This means there is every chance that upgrading to the new build will cause existing source text, including perhaps in extensions, to cause Problems. (They will either cause Problem messages or will work as normal - they won't behave differently in a secretive, difficult-to-detect way.)
Before upgrading, we recommend that any user concerned about this should try adding the following to source text:
Use no deprecated features.
In builds from 6E59 onwards, this causes Inform to produce Problem messages for any of the usages we are now withdrawing, and points to documentation on how to make the change. That advice has now been removed from the documentation, but is reproduced below instead.
award (number) point/points
Use "increase the score by 5" or similar instead.
change (a stored value) to (value)
change (object) to (enumerated value)
change (object) to (property)
change the/-- player to (object)
Use "now the score is 10" or similar instead; that is, try "now ... is"
in place of "change ... to".
consider (rule)
Use "follow" instead (see above).
delete (a table entry)
Use "blank out" instead of "delete".
end the game in death
Instead, use: end the story saying "You have died";
end the game in victory
Instead, use: end the story finally saying "You have won";
end the game saying (text)
Use the word "story" instead of "game".
if (a condition) then (a phrase)
Use a comma instead of "then", or use a colon and put the phrase
on the next line, indented one stop inward.
if game ended in death:
Use: if the story has ended and the story has not ended finally, ...
if game ended in victory:
Use: if the story has ended finally, ...
if game is in progress:
Use: if the story has not ended, ...
if game is over:
Use: if the story has ended, ...
if in (object):
Use "if the location is the Hall of Mists" or similar instead.
Note: don't use "if the player is in the Hall of Mists", because
that will fail if the player is inside a container in the Hall.
if it is after (time):
Use "if the time of day is after 6:00 PM" or similar instead.
if it is before (time):
Use "if the time of day is before 6:00 PM" or similar instead.
if using the/-- (use option):
Use "if the American dialect option is active" or similar instead.
resume the game
Use "resume the story" instead.
say "[contents of object]"
say "[the contents of object]"
Use "[list of things carried by Darcy]" or similar instead.
set pronouns from possessions of the player
Use the following:
repeat with item running through things held by the player:
set pronouns from the item.
while (a condition) repeatedly (a phrase)
while (a condition), (a phrase)
Use the block version of "while" instead:
while a person (called Muggins) is in the Hall:
move Muggins to the Y2 Rock Room.
[Chapter: The Standard Rules] Actions and the world model
In describing actions, Inform now distinguishes between:
(a) doing something other than taking the apple
(b) doing something other than taking to the apple
To see the difference, suppose the action is "going north". In all builds of Inform, that fails (b): it certainly isn't performing an action on the apple. But in past builds, it also failed (a), because Inform couldn't distinguish the two meanings. In the new build, "doing something other than taking the apple" matches absolutely any action (by the player) which is not "taking the apple", so it does indeed match "going north".
(See bug report 0000784, though I think this was really a suggestion.)
If an action takes place as a result of persuasion, "after" rules are now called on the persuasion action as well as the generated action. For example:
Persuasion rule for asking Bob to try doing something: rule succeeds.
After asking Bob to try waiting:
say "You asked Bob to wait!"; continue the action.
After Bob waiting: say "Bob did wait!"; continue the action.
now results in the following in response to "BOB, WAIT":
[asking Bob to try waiting]
[(1) Bob waiting]
Bob did wait!
Bob waits.
[(1) Bob waiting - succeeded]
You asked Bob to wait!
[asking Bob to try waiting - succeeded]
(Previously, the "After asking Bob to try waiting" rule could never have effect.)
The property "publically-named" has been respelled "publicly-named". The spelling "publically", which GN habitually uses, is in fact archaic; it has also been corrected in the Inform manuals.
(See suggestion 905217.)
The following rules have been renamed and moved:
the block tasting rule
the block smelling rule
the block listening rule
the block jumping rule
the block waving hands rule
the block rubbing rule
Each rule has become a Report rule, not a Check rule; and "block" in the name has become "report" - for example, we now have the "report tasting rule". These are all cases where the Standard Rules printed a message suggesting that the action had taken place but with no interesting effect; but because the messages were produced by Check rules blocking the action, it was considered to have failed rather than succeeded. It now succeeds.
This change will cause a few existing source texts to fail because they explicitly removed the old rules, for instance like so:
The block smelling rule is not listed in any rulebook.
In some cases sentences like this won't be needed any more, and in others they can simply be replaced by:
The report smelling rule is not listed in any rulebook.
Note that as a result of these changes, other actors can also succeed in these actions, and this means there are new "library messages" to report that: for example,
> JUMP
You jump on the spot.
> CLARK, JUMP
Clark Gable jumps on the spot.
The second version here is new. Note also that Inform's default response used to be "You jump on the spot, fruitlessly." - we have removed "fruitlessly". Similarly, on waving hands, the player is no longer "feeling foolish".
Because the rubbing action now succeeds, people can now in principle rub each other. This of course is not unknown in real life, but it's socially loaded enough that we shouldn't allow it without the author's intervention. So there is a new rule:
can't rub another person rule
to block this ("Keep your hands to yourself.").
(See suggestion 750970.)
The "singing" action has been removed from the Standard Rules. In cases where it was useful, it was a nuisance to modify in order to make its responses appropriate - simply writing a singing action fresh is easier and clearer. The main case for removing it was that beginners often forgot to do anything about the "singing" action at all, so that singing would be possible in the most unlikely circumstances -- swimming underwater, creeping up on somebody, and so on.
(Again, see suggestion 750970.)
The "swearing strongly" and "swearing mildly" actions have been removed from the Standard Rules, and by default, Inform story files no longer respond to swear-words at all. This change is made partly because they weren't useful enough actions to belong in the Standard Rules core set, and partly because of concerns about the use of Inform in education.
(See suggestion 873945.)
The "dropping" action has a new rule:
can't drop body parts rule
which provides a better response to attempts to do so ("You can't drop part of yourself." rather than "You haven't got that.").
(See suggestion 751260.)
The "entering" action has a new rule:
can't enter if this exceeds carrying capacity rule
which means that if the player puts an apple on a table with carrying capacity 1, then tries to stand on the table, she will be prevented on the grounds that there's not enough room.
(See bug report 0001062.)
The "eating" action no longer requires the noun to be carried. This allows people to graze on giant mushrooms, eat berries straight from the bush, and so on, and it also gets over awkward situations over commands like "EAT SOUP" when the soup is a thing on a dining table. What now happens is that an implicit taking action occurs if the food is portable, but not otherwise. (Because of the rule ordering, it also only happens if the supposed food is in fact edible.) For realism's sake, we also, by default, block the eating of food carried by other people.
There are two new rules:
can't eat other people's food rule
can't eat portable food without carrying it rule
and there's also a new "library message" covering the first of these.
(See suggestion 750956.)
The "can't put onto something being carried rule" has been removed. There are already ways in which it's possible for a supporter to continue to hold something up while being carried -- for instance, the tray created thus:
The tray is a portable supporter. On the tray is a bottle of absinthe.
can be picked up. The effect of removing this rule is that it's now possible to, say, put a glass onto the tray while still holding the tray, which seems reasonable enough.
(See suggestion 1564863.)
In effect, we're now saying that it's within the rules of the world model for people to carry supporters which are in use as such. Initial situations like this one:
The player is carrying the tray. On the tray is a bottle of absinthe.
are therefore now allowed; in previous builds the tray would have been assumed to be fixed in place, being a supporter, but now it's assumed to be portable, being carried.
Supported items can now have initial appearances, or rather, their initial appearances are now made use of. For example:
An old oak tree-stump is here. A golden acorn is on the tree-stump.
"A gleaming gold acorn shines out from the gnarled wood of [the tree-stump]."
enables the following:
A gleaming gold acorn shines out from the gnarled wood of the old oak tree-stump.
>get acorn
Taken.
>look
Forest Glade
You can see an old oak tree-stump here.
This is enabled by a new rule:
initial appearance on supporters rule
If unwanted, the new behaviour can be removed by removing this rule.
(See suggestion 1615745.)
The "taking off" action, for removing articles of clothing, used to mandate that the article in question be carried. This sounded sensible, since after all you could hardly take off a hat which was already on the floor. But it had the unfortunate side-effect that typing REMOVE HAT in this situation would cause an implicit action of taking the hat before going on to tell the player that he can't remove it because he's not wearing it. Taking off now doesn't require the article to be carried as part of the specification, and instead it includes the disambiguation hint:
Does the player mean taking off something worn: it is very likely.
(See suggestion 2899370.)
A new activity, "printing inventory details", exactly parallels the existing activity "printing room description details" - but, of course, it prints additional information about items in inventory listings, not in room descriptions. For example:
> INVENTORY
a flaming branch (providing light)
The bracketed addition here was added by this activity.
As example rules:
Rule for printing inventory details: stop.
gets rid of these addenda; and
Rule for printing inventory details of something edible:
say " (yummy!)[run paragraph on]".
adds a new one.
(See suggestion 868581.)
[x] Implicit taking
"Implicit taking" is what happens in situations like this one:
In the wooden bread-bin is a croissant.
> EAT CROISSANT
(first taking the croissant)
Delicious.
Although the command doesn't directly call for a taking action, it's implicit, and Inform pauses the eating action while a taking action is tried first.
The business of this is carried out by an activity called "implicitly taking". This has existed for some time, but only as hook on which to hang rules. That is, you could modify how implicit taking was done, but you couldn't change the circumstances under which it was done. This is no longer true, and you can now write rules like this:
Check an actor eating (this is the can't eat portable food without
carrying it rule):
if the noun is portable and the actor is not carrying the noun:
carry out the implicitly taking activity with the noun;
if the actor is not carrying the noun, stop the action.
which is, in fact, how the Standard Rules makes the dialogue above happen. Note that if the activity doesn't succeed in taking the item, it's expected to print some text explaining this, which is why we don't need to say anything further.
This reform also means that the following rules:
can't insert what's not held rule
can't put what's not held rule
now generate implicit takes properly, using the activity, rather than simply imitating this (as they did in previous builds).
The implementation of the activity has changed as part of this process. It used to be empty by default - containing no rules, that is, except any which the user chose to add. But it now contains a "for" rule as the last rule in "for implicitly taking":
standard implicit taking rule
This prints the text "(first taking ...)" and then silently tries the taking action. (See suggestion 1207603.)
[x] Story conclusion and scoring
In previous builds, Inform produced story files which kept score (and showed the score in the status line, and so on) by default: it only removed scoring if the option
Use no scoring.
was used. This was a hangover to the days when all IF was game-based, and we now think it's out of date. So by default Inform now has no score; the new option
Use scoring.
has to be used to put it back. If this isn't done, and the source text ever changes the "score" variable, Inform issues a problem message; so in practice Inform won't silently compile existing source text which expects scoring but doesn't get it.
In story files with no scoring, Inform previously defaulted to showing the turn count in the right hand part of the status line. We don't think this is useful any more, either, so the right hand status line is now blank for no-scoring stories (by default). The status line's appearance for scoring stories is unchanged.
(This implements suggestions 1564911 and 1565295.)
[x] Miscellaneous minor changes to the Standard Rules
** It has always been the case that if the author doesn't specify the room where the player begins, Inform assumes the player begins in the first room created. In past builds, however, it was possible for that to be a room created in an extension, since "Include..." sentences tend to come early on. In this build, Inform gives preference to the main source text, and will only put the player (by default) into a room created by an extension if there are no rooms created by the main source text. In practice this rarely arose because very few extensions need to create rooms, but for those which do, it could lead to quite some confusion.
** The property "mentioned" is used to mark items which have been named already in the course of a room description, but it used to apply only to naming after the room's main description was printed. It now applies either since the beginning of the turn, or since the current looking action began to be carried out, whichever is more recent. So:
The Grange is a room. "Welcome to the home of [the fisherman]."
The fisherman and the green net are here.
produces:
Welcome to the home of the fisherman.
You can see a green net here.
rather than "You can see the fisherman and a green net here."
The following restores the previous behaviour:
A first before printing the locale description rule:
repeat with item running through things:
now the item is not mentioned.
Whereas the following makes the new behaviour even stronger:
The declare everything unmentioned rule is not listed in the carry out looking rulebook.
so that "mentioned" would mean "named somewhere since the start of this turn". (See suggestion 831441.)
** In previous builds of Inform, the rules on touchability applied rather oddly to two-sided doors. This only really showed up when non-players were trying actions outside the player's location, but that case led to a number of bug reports (0000886, 0001163, 0001164). These anomalies have been removed, and doors are now subject to the same rules on touch and reach as anything else. I'm noting that here because a few source texts just might depend on the old way: the example "Rope" had to be modified because it relied on trying an opening action on a door a long way from the player (at the other end of the rope), which worked in the old build because Inform wasn't checking for touchability. In the new build, "reaching inside" rules had to be added to make the door touchable.
** Previous builds of Inform had two actions to handle swear-words typed in at the command prompt, for mild and strong obscenities, respectively. These had to be handled a little coyly in the Index to avoid Inform being considered a "mature audiences only" program, which would get in the way of classroom use. But they were also inappropriate for many games, and added nothing of any great value to the world model; they have now been withdrawn.
(This doesn't implement suggestion 873945 from the forum as such, but it does resolve the unsatisfactory situation this drew attention to; see also suggestion 751338.)
** There's a new rule, the -
exclude people from drop all rule
which does just what it says, using the "deciding whether all includes" activity. (See the maintenance section below under 0000433.)
** There's a new rule, the -
can't push from within rule
which stops people getting into vehicles which are also pushable between rooms and then pushing them in some direction from the inside. One can imagine a few such vehicles - a bobsleigh, maybe, or a punt - but they would probably be better modelled a different way in any case. (See bug report 0000630.)
** New rules:
can't exceed carrying capacity when taking off rule
can't exceed carrying capacity when giving rule
defend against sneaky ways to exceed peoples' carrying capacity. (See bug reports 0000787, 0000788, 0000804.)
[Chapter: Other features] Extensions
Inform builds projects from both the source text typed by the author and from Extensions; one of these, the Standard Rules, is always included; others are added as authors please. About 20 are "built-in" to Inform, meaning that they are stored inside the application and always available. Others must be "installed", and each Inform user will have a folder somewhere on his computer which contains these. Users typically download these from inform7.com and then use an Install Extension menu option in the application, which then squirrels the file away. Installed extensions are then available to any projects that user may be working on.
It is now also possible to have extensions available to just one project. These must be stored in the Extensions subfolder of the .materials folder, but otherwise are arranged much the same as installed extensions - there's an outer folder for each author's name, and extensions are named with a ".i7x" extension within. For example:
Mourning Hypercritical.inform
Mourning Hypercritical.materials
Extensions
John Siracusa
Fixing The Finder.i7x
When Inform needs to find an extension, it looks here first, then in the installed area, then in its built-in area. That means that you can make your own revised or hacked version of an extension, put it in the .materials area, and then have it take precedence over the installed or built-in one.
We expect this to be useful in several situations: (i) for people who want to have all of their extensions somewhere where a source-control utility like Subversion can conveniently get at them; (ii) for people who want to keep snapshots of extensions as they were at a given point in time; (iii) for people who like to circumvent the Inform application's source editing window and keep all of their source text for a large project in a string of extensions instead; and (iv) for extension authors who want to have an experimental, not-ready-for-release version of their extension to play with in a test project, without disturbing their installed stable version. (See suggestion 751172.)
Extensions are now required to be filenamed with a ".i7x" extension. This was previously usual but not required, and unextended filenames caused problems with the Subversion source control system. (See suggestion 834467.)
[x] Releasing
There's a new "release along with" option:
Release along with an introductory postcard.
which bundles Andrew Plotkin's IF postcard as part of a release.
(See suggestion 1240511.)
There's also the release option:
Release along with the file "filename".
This includes the named file, but without listing it as a browsable item on any generated website. For example,
Release along with a file of "Butterfly painting" called "butterfly.jpg".
Release along with the file "butterfly.jpg".
do exactly the same thing as each other except that the first lists "Butterfly painting" on the sidebar menu of a released website, and the second doesn't. We can also file it away in a subfolder:
Release along with the file "butterfly.jpg" in "hidden_images".
so that it ends up as
Release/hidden_images/butterfly.jpg
rather than
Release/butterfly.jpg
The new release options:
Release along with Javascript "whatever.js".
Release along with style sheet "how_may_you.css".
cause Inform to add inclusions of these scripts (of which there can be any number) to any web page generated in the release; and automatically also achieve the effect of:
Release along with the file "whatever.js".
Release along with the file "how_may_you.css".
thus copying them into place.
The new release options:
Release along with separate figures.
Release along with separate sounds.
cause any figures or sounds created by the project to be copied into the Release folder explicitly: in fact, to Release/Figures and Release/Sounds respectively. This makes them more accessible to hybrid website/IF projects than if they were only embedded in the Glulx story file, and thus invisible to external Javascript or HTML.
Bibliographic data for a project is now allowed to contain Unicode text substitutions. Thus:
Include Unicode Character Names by Graham Nelson.
The story headline is "Adventures in [']68[unicode 8211]79".
The story description is "This is a sentence[unicode 8212]with a parenthetical in dashes[unicode 8212]because 8212 is the Unicode number for an em-dash. But for example, 'pawn to [unicode black chess bishop]4' draws in a black chess bishop, so it works with names, too."
(This was absolutely a suggestion, not a bug, in spite of generating bug reports 0000913 and 0000926.)
[Chapter: Maintenance] Core Inform maintenance
More than 400 bug fixes are made in this build, addressing almost every known defect in its predecessors.
The following lists only the more significant bug fixes: it excludes those categorised by the bug tracker as "cosmetic", mostly small improvements to problem messages, or which affect only the documentation. I'm nevertheless grateful to all those who submitted these bugs, and in particular this build benefits from reports 0000409, 0000461, 0000527, 0000661, 0000674, 0000679, 0000701, 0000782, 0000785, 0000789, 0000791, 0000796, 0000797, 0000798, 0000805, 0000815, 0000816, 0000820, 0000821, 0000822, 0000823, 0000833, 0000854, 0000862, 0000864, 0000867, 0000869, 0000875, 0000881, 0000893, 0000917, 0000920, 0000933, 0000936, 0000941, 0000944, 0000948, 0000952, 0000964, 0000965, 0000984, 0000985, 0000996, 0001009, 0001022, 0001027, 0001028, 0001030, 0001032, 0001043, 0001053, 0001058, 0001066, 0001071, 0001068, 0001074, 0001082, 0001089, 0001096, 0001098, 0001102, 0001115, 0001118, 0001140, 0001141, 0001173, 0001174, 0001180, 0001182, 0001194, 0001196, 0001198, 0001201, 0001205, 0001208, 0001211, 0001220. See also suggestion 4858913.
[x] Uncategorisable
Bug fixed (0000999) whereby, on some platforms, an accented character in the directory path to an Inform project would cause translation to fail, usually with a problem message about failure to create the debugging log, or the .materials folder.
Bug fixed (0000916) whereby "any" could not be use used as a determiner, e.g. in a condition such as "if any animal is in the Observatory".
Bug fixed (0000479) - or, clarification made, perhaps - so that "almost all" will no longer apply to a situation in which all but one item qualifies when there are four or fewer items.
Bug fixed (0000480) whereby the determiners "all but" and "all except" were not being recognised, contrary to the documentation's claim that they are legal. (They are.)
Bug fixed (0001060) whereby the determiners "less than" and "greater than" measured <= and >=, not < and >. ("More than" and "fewer than" did work. They're now synonymous in the context of determiners.)
Bug fixed (0000632) whereby certain awkward double relationships involving known objects would be misread, e.g. in the cases of
(1) things enclosing the player that encloses something
(2) things that enclose something enclosed by the player
Now (1) chooses the x such that x -> player -> (a thing), whereas (2) chooses the x such that player -> x -> (a thing).
Bug fixed (0001065), if it's a bug exactly, to move problem message text from "stdout" to "stderr" when I7 is being run as a command-line tool.
Bug fixed (0000863) whereby Inform would fail with I6 errors if the system clock were set to a date before AD 2000; which sounds harmless enough, but on laptops with failed batteries, or after some kinds of hard crash, it's not unknown for Mac OS X to boot into the year 1969.
[x] Source text and punctuation
Bug fixed (0000412) whereby a semicolon placed at the end of a sentence consisting otherwise of a double-quoted text, and followed by another sentence, which Inform therefore (correctly) read as one joined-up but incorrectly written sentence, led to an unhelpful problem message.
Bug fixed (0000553, 0001056) whereby the apostrophe quotation mark rule would not be applied properly with letters from extended Latin alphabets.
Bug fixed (0000588) whereby a missed full stop after one sentence ending with a double-quoted text and before another one referring to the same thing, e.g.:
"It has printed name "Large cavern" It is west from Low passageway."
...could lead to an internal error.
[x] Headings
Bug fixed (0000553) whereby apostrophes written ['] couldn't be used inside the double-quoted story title at the start of the source text.
Bug fixed (0000635) whereby sections couldn't be marked both as unindexed and also "in place of" other sections.
[x] Extensions
Bug fixed (0000377) whereby extension documentation which contains paste buttons would sometimes omit the closure "-)" of any I6 inclusion syntax included in the source text being demonstrated.
Bug fixed (0000379) whereby extensions could contain spurious sentences after the "ends here" line, sometimes leading to internal errors; a problem message is now issued.
Bug fixed (0000847) whereby run-time problems arising in extensions would be reported only as being in "the source text", rather than identifying which extension is at fault.
Bug fixed (0000781) whereby documentation would not be correctly generated for extensions whose title, or author name, included certain non-ASCII characters.
Problem message added (0001126) to catch the case of a heading replacement subordinate to another heading replacement, so that its destination is at best ambiguous.
[x] Assertions and creations
Bug fixed (0000549) whereby using "Here" to place something abstract, e.g., "X is a kind of value. Here is an X.", would produce an internal error. It now produces a philosophical sort of problem message.
Bug fixed (0000582) whereby incorrect assertions in the form
Let A be the B that relates to C by D.
(which really could hardly be more wrong) might in some cases lead to a compiler crash rather than a problem message.
Bug fixed (0000671) whereby incorrect assertions like
The description of Y during X is "".
(incorrect because properties can't be given values specific to the duration of scenes) might, in the case where X is ambiguous, lead to an internal error instead of a problem message.
Bug fixed (0000703) whereby creating a new value whose name coincides with that of an existing variable would sometimes lead to an internal error as well a problem message.
Bug fixed (0000735) whereby declaring "Every X incorporates a Y", when Y is not a kind, led to an unhelpful problem message.
Bug fixed (0000778) whereby Inform issued an internal error when trying to implicitly create a rulebook via a relation it has to an existing rulebook (which is entirely legal).
Bug fixed (0000794) whereby creating one half of a pair of opposed directions in an implicit way crashed the compiler.
Bug fixed (0001117) and problem message improved for circular creations which cause something to be indirectly a part of itself.
Bug fixed (0000932) and problem messages added for assertions involving "nothing", such as "Nothing is in the box.", and for "nothing" said to be "here", as in "Here is nothing."
Bug fixed (0001083 mentions this) whereby calling a room (say) "storage" or some other keyword with an internal meaning might lead to problems.
Bug fixed (0001038) whereby an assembly of a part of a nameless object could crash Inform while it was trying to work out a name for the part.
Bug fixed (0001116) whereby creations such as the following would fail:
A colour is a kind of value. The colours are red and blue.
A tile is a kind of thing. A tile has a colour.
Workshop is a room. Workshop contains a red tile.
Bug fixed (0000888) whereby declarations like so:
The filter is a description of numbers that varies.
would be misread as an attempt to set a "description" property value.
Bug fixed (0000521) whereby multiple sentences in succession of the form "South is nowhere. East is nowhere.", etc., would sometimes give problem messages for all but the first.
Bug fixed (0001040), or you could argue this is a small feature added, so that
Ideal Home Exhibition is a region. A kitchen is a kind of room.
A kitchen is always in the Ideal Home Exhibition.
will work. ("All kitchens are in the Ideal Home Exhibition" already worked; this hangs on the difference between "always" as a measure of likelihood and "always" as quantification.)
Bug fixed (0001128, 0001169) whereby assembled objects attached to proper-named objects would sometimes cause I6 run-time errors on trying to print their capitalised names.
Bug fixed (0000803) whereby plurals would be oversensitive about articles, in that "The plural of a vertex is vertices." would fail to pluralise "vertex". This is now equivalent to "The plural of vertex is vertices."
Bug fixed (0000769) whereby it was possible to redefine an existing constant value (say, a rulebook) as also being a kind of value, in such a way that problem messages would crop up later and a bit misleadingly, rather than straight away.
Bug fixed (0000861) whereby directions would sometimes have their uses as objects and as relative clauses confused, so that e.g.:
A direction can be planar. A direction is usually planar.
Up, down, inside, outside are not planar.
would cause Inform to think "inside , outside" was a reference to something being inside ", outside".
Bug fixed (0000924) whereby the source could define verbs with capitalised words ("To Hoover implies..."), but these verbs wouldn't then be parsed correctly. There's now a problem message to catch this.
Bug fixed (0001219) whereby attempted proper nouns misread as spatial locations would sometimes produce internal errors rather than problem messages.
Bug fixed (0001217) whereby "action of X", when used as a noun phrase in an assertion, would require the word "trying" to be used if the actor in question wasn't the player, whereas in other contexts Inform would allow "trying" to be omitted. For example, the following would work only if "trying" were inserted between "Pete" and "waiting":
The best idea yet is a stored action that varies.
The best idea yet is the action of Pete waiting.
Bug fixed (0001156) whereby a contradiction would be reported between "A K is always improper-named.", where K is a kind of object, and "X is a K", where X has no article; Inform correctly inferred that X is probably proper-named, but then incorrectly didn't overrule this with the certain knowledge it ought to have about all Ks being improper-named.
Bug fixed (0000693) whereby naming a room Something would lead to confusion with the determiner "something".
Bug fixed (0000638, 0001142) whereby assertions about "the player" wouldn't always refer to Fred if the sentence "The player is a man called Fred" occurred in certain places in the source.
Bug fixed (0000655) to do with assemblies applying to a player which had been changed to a named character with a kind more specific than "person": for example, if "The player is a man called Robert." then assemblies applying to men but not people in general might not properly be applied to Robert, and even if they were, they might be misnamed.
Bug fixed (0000824) whereby "There is... called..." would sometimes get confused by prepositions in the first clause.
[x] Model world
Bug fixed (0000589) whereby defining a one-sided door so that its exit direction was the same as its entry direction caused a misworded problem message.
Bug fixed (0000852, 0001007) whereby it was possible for the player to be created as, changed into, or made a part of something else. This is not allowed, and breaks many assumptions. There's now a problem message and a runtime problem.
Bug fixed (0001031) whereby it was possible to have the player get on top of a supporter, or inside a container, and then move that off-stage, leaving the player indirectly in limbo. This is not allowed, and now produces the run-time problem "Attempt to move the player off-stage". (That unfortunately breaks version 5 and earlier of the extension "Transit System by Emily Short", so you'll need version 6 or better.)
Infelicity fixed (0000598) whereby an attempt by an actor to enter himself failed the "can't enter what's already entered rule", rather than the "can't enter what's not enterable rule".
Bug fixed (0000723) whereby "resume the story" could not undo a story end once the final question ("Would you like to RESTART, RESTORE a saved game, ...") had been asked.
Bug fixed (0000602) whereby UNDO would be forbidden on the second command if the first command produced an out-of-world action; but OOW actions can indeed be undone, so this was needlessly restrictive.
Bug fixed (0000376) whereby implicit searches through possible enclosing objects (that is, those which satisfy the enclosure relation) would search only things, not rooms.
Bug fixed (0000604) whereby a player in a vehicle being driven by another character would move rooms without "location" being immediately updated, causing problems in some cases for light, two-sided doors and so on.
Bug fixed (0001168) whose report begins "If an object is on a supporter inside a closed transparent container that is part of a backdrop..." and goes on that way, but concerns the rules on touchability.
Bug fixed (0000806) whereby if an action is tried in the before rules for an exiting action, and that first action causes a transition from darkness into light, then the report of the player's new location after the exiting will spuriously mention darkness and then immediately correct itself.
Bug fixed (0000807) whereby if the player begins the story as a named character who is in darkness inside a closed container, then darkness remains even when he or she emerges.
Bug fixed (0000827) whereby the missing nouns supplied by default for the commands LISTEN and SMELL would always be the location, even if the player is within a sealed container in that location. They now supply the outermost object which the player can touch from the inside.
Bug fixed (0001164) whereby non-player people can sometimes not touch a two-sided door when on the other side of it from the player.
Bug fixed (0000870) whereby the phrase "direction of D from R" would give misleading answers if D is a two-sided door whose facing directions are not opposite to each other, e.g., for:
The red rock stair is east of the Orchard and above the Undertomb.
"direction of the red rock stair from the Undertomb" would evaluate to "west", not "down" as it probably should (and now does).
Bug fixed (0000565) whereby changing the player from a nameless default "yourself" to somebody else renders that other person unable to refer to "former self" in commands.
Bug fixed (0001042) to clarify the meaning of "X is regionally in R" when X is a backdrop or two-sided door: it's now true if and only if X is in any one of the rooms contained in the region R. In particular, note that a two-sided door can be regionally in two different regions at once.
Bug fixed (0000694) to make the "front side" and "back side" of a door the first and second rooms it connects to in source text sequence, rather than in inference priority sequence (which is often but not always the same).
Bug fixed (0001069) whereby an object can be said to be "here" more than once in the source text, which may implicitly lead to contradictions, since "here" may have a different meaning in different sentences.
[x] Properties
Bug fixed (0000374) whereby Inform wasn't properly checking that condition properties shared between different, not-inheriting-from-each-other kinds were being consistently defined for each kind.
Bug fixed (0000435) whereby Inform's problem message for giving a property the same name as its own kind was unhelpful. ("Movie has a theme called theme.")
Bug fixed (0000517) whereby Inform's problem message for trying to give an object a nameless number or text property was unhelpful.
Bug fixed (0001103) whereby creating a nameless property whose kind is a proper subkind of object would fail.
Bug fixed (0000567) whereby attempts to give one of the three properties mentioned, privately-named or pushable between rooms to a kind of value as well as a kind of object would lead to I6 errors. (For complicated run-time reasons this would be rather difficult; a specific problem message now catches this. No other properties are affected.)
Bug fixed (0000590) whereby Inform's problem message for giving a property an unspecific kind (such as "relation") did not reference the source text at fault.
Bug fixed (0000669) whereby declaring an either/or property with the name of an article (such as "a" or "the") would lead to an internal error as well as a (deserved) problem message.
Bug fixed (0000712) whereby usages such as "the X of a random Y", where Y is not a kind but a single object, or a non-existent object, would lead to an internal error as well as a (deserved) problem message.
Bug fixed (0001154) to do with adding relations as properties fixed. (This looks like, but is not quite, 0000582, which is also fixed.)
Bug fixed (0000539) whereby adding properties to new enumerated kinds, i.e., before any values were enumerated, would wrongly cause a problem message saying that the kind couldn't have properties. (Bug 0000523 was, though not obviously, a duplicate.)
Bug fixed (0001063) whereby adjectives defined by measuring property values would sometimes fail if the kind in question was (e.g.) a list. For example, "Definition: a thing is fooey if its foo is {28, 34}." would perform the wrong test.
Bug fixed (0001192) whereby testing such adjectives on constant values might fail, either giving a wrong answer or throwing I6 errors.
Bug fixed (0000854) whereby defining the same adjective twice over the same domain now throws a problem message if both definitions occur in the source text, or both in the same extension. If not, the source text version always prevails. This means you can, for example, write
Definition: a number is positive if it is -6.
in the source text, and override the definition in the Standard Rules, if you really, really want to. But you can't write:
Definition: A thing is a doggie-snack if it is edible.
Definition: A thing is a doggie-snack if it is the newspaper.
Bug fixed (0000434, 0000498) whereby declaring that a further kind can have an existing either/or property, but giving them the wrong way around, would disrupt the working of the property on the original kind.
Bug fixed (0000935) whereby it was possible to make kind-unsafe property assertions in relation to the kinds room, container, supporter and thing. For example, the following is actually incorrect, because Inform isn't told either implicitly or explicitly that "House" is a room, and so it's a thing; but the bug meant that no problem message was produced, and instead an unsafe value was stored in "home of Martha".
The Garden is a room. A person has a room called the home.
Martha is a woman. The home of Martha is House.
Bug fixed (0000459) whereby the values of "printed name", for anonymous objects, would sometimes mysteriously fail to be equal to each other even when their texts looked the same.
Bug fixed (0000533) whereby defining an adjective over two domains, one a specific object of kind K and another a kind L which is not K or a kind of K, would produce a spurious problem message about the domain being unrecognised.
Bug fixed (0000576), or problem message improved, really, for certain attempts to use the same adjective both as an either/or property and as one value in a many-valued condition.
[x] Relations
Bug fixed (0000515) whereby making use of various-to-one relations of things to values could sometimes lead the compiler to crash when constructing the initial state of play, though only in unusual cases.
Bug fixed (0000779) whereby problem messages, arising from a description value involving a relationship to another value held only in a local variable about to go out of scope, were unhelpful.
Bug fixed (0000925) whereby a relation set up with a wrongly named property would sometimes crash rather than issue a problem message.
Bug fixed (0000568, 0000581, 0001113) whereby relations would in some cases be looked up back to front as seen by phrases like "the X which relates to Y by R".
Bug fixed (0000578) whereby fast route finding, if enabled, would sometimes get the wrong answer when searching a source-defined relation.
Bug fixed (0000670) whereby relations involving specific kinds of object would not be very well defended against usage with the wrong kind of object at run-time. For example, if:
Application relates various devices to one thing.
The verb to be applied to implies the application relation.,
then at run-time "now the noun is applied to the second noun" (say) would produce mysteriously wrong results, I6 programming errors, etc., if the noun and second noun were objects other than a device and a thing. It is now safe to read the relation for any kind of object, but the result is "false" if the kind is wrong. It causes a run-time problem to write the relation for the wrong kinds.
Bug fixed (0000994) whereby relations asserted between values which, though nouns, could also be used adjectivally, would fail. For example,
Faction is a kind of value. The factions are friendly, passive, hostile.
Hating relates various factions to various factions.
The verb to hate implies the hating relation.
A person has a faction.
Hostile hates friendly.
would produce a spurious problem message on the last sentence, because Inform misconstrued "hostile" and "friendly" as adjectives applying to people, not as nouns of kind "faction".
Bug fixed (0000726) whereby relations used as property values, as initial values of global variables, etc., would not be mutable.
[x] Actions
Bug fixed (0000512) whereby, when an action failed at the Instead stage, the "reason the action failed" would sometimes wrongly implicate another rulebook when looked at from entirely outside the action machinery.
Bug fixed (0000560) whereby creating action or rulebook variables without specifying their names would cause an internal error rather than a problem message.
Bug fixed (0000583) whereby "Instead of jumping for fewer than 4 turns" (say) wouldn't be accepted, but "...less than..." would. Both are legal.
Bug fixed (0000401) whereby attaching variables to actions, and marking them as "(matched as X)", would result in them being matchable in practice only if the kind of the variable was "object" or one of its subkinds.
Bug fixed (0000908) whereby a description of an action using an optional matched-by clause would not be accepted as part of the definition of a kind of action. For example, this would fail to define "leaving town":
Going west from Example is leaving town.
Bug fixed (0001148) whereby a description of an action applied to a region would sometimes be tested on objects by seeing if the object was in that region, rather than seeing if it was equal to it.
Bug fixed (0001044), or perhaps it's more of a clarification of the design: it's legal, though probably unwise, for an out-of-world action to "try" an in-world action, and that action will indeed be in-world, and subject to the full in-world action processing. This slightly affects the GONEAR testing command, which runs as out-of-world but tries looking; it therefore now runs (e.g.) the after rules for looking, which previous builds did not. However, it doesn't run the "every turn" rules.
Bug fixed (0000872) whereby the "standard implicit taking rule" would print clarifying text like "(the fox first taking the eggs)" if an implicit take was caused by something like "try the fox eating the eggs" even when the fox could not be seen by the player at the time.
Bug fixed (0000506, 0000937) whereby a requested action which, when accepted, caused an action to be transferred back to the player by conversion, would sometimes run the wrong check and carry out rules. (E.g., on the command DAPHNE, ASK ME FOR BRENNA, with Daphne and Brenna both being people, there would mysteriously be no text indicating that Brenna has not in fact been taken.)
Bug fixed (0001099, 0001107) whereby a calling in a condition which fails can leave the variable in question holding a kind-unsafe value. For example,
if attacking a device (called the mechanism): ...
when the current action is "attacking Peter", the condition will fail because Peter is not a device, but the "mechanism" variable would hold Peter anyway - despite its kind being "device". It now reverts to "nothing" in this case.
Bug fixed (0000956) whereby a description of an action containing a name which could refer either to a variable or a constant would always be resolved in favour of the constant, which could lead to some strange effects: notably, the rule here -
Player Alice is a person.
Instead of examining the player: ...
would fire on examining Alice, because "player" could refer either to the global variable, or to player Alice. Inform already gave priority to local variables, and now gives priority to global ones too.
Problem message added (0001186) to catch conditions like this:
if we have examined the grail for the fifth time:
which are impossible to satisfy since "we have examined the grail" is false until it's true, and then stays true forever, so that there cannot be five distinct periods of time in which it's true. Since this does not conform to our ordinary English understanding of this condition, and since the condition cannot be useful, a problem message seems the best response. (Previously there was a hacky workaround for this, giving the condition a different meaning, but it had too many demerits and caused confusion as to what "for the fifth time" meant.)
Due to a mistype in its catalogue of irregular English verbs, Inform previously believed the participles "spinning" and "spining" had past forms "spinned" and "spun" respectively; it now realises they are "spun" and "spined".
[x] Activities
Bug fixed (0001083) whereby an activity rule applied to an internal keyword such as "storage" would cause an internal error.
Bug fixed (0000884) whereby a rule with a while condition which refers to an activity with a non-thing kind attached would fail to compile.
Bug fixed (0000885) whereby a rule with a while condition relating to an activity would handle "(called X)" in a bogus way; in fact, for the moment anyway, Inform can't handle this, and it now issues a problem message saying so.
Bug fixed (0000453) whereby Inform would allow the creation of activities on values of an indefinite kind, such as:
Enunciating something is an activity on values.
Bug fixed (0001112) whereby the list-writing activities would sometimes fail to say "nothing" when a list of objects was empty only because none of the (at least one) possible candidates qualified, rather than because there were no candidates. (For example, when opening a container to reveal only invisible scenery objects, this bug caused odd messages like "You open the box, revealing .")
Bug fixed (0000634) whereby, similarly, when such a list was "nothing" the "prefacing with is/are" option would sometimes be ignored.
[x] Rules and rulebooks
Bug fixed (0000513) whereby passing the number 0 (only) to a number based rulebook (only) using "consider" would in some cases pass a different number instead.
Bug fixed (0000543, 0000484) whereby a rule referencing the past in terms of a temporary value which didn't exist in the past would produce a problem message, correctly, but then crash.
Bug fixed (0000619) whereby Inform crashed when comparing the specificity of two rules, in quite unusual circumstances.
Bug fixed (0001077) whereby Inform produced an I6 error if a rule name included the @ character. (Which is perfectly legal, if odd.)
Problem message added (0001139) to be more explanatory about why "This is the rule:" is not allowed.
Bug fixed (0000894) whereby large numbers of rules attached to the same rulebook and having usage tests - say, 5000 copies of "Before eating when yourself is yourself: do nothing." - would in some cases cause memory usage and/or running time to spike dramatically, though Inform would still produce correct code in the end.
Bug fixed (0001181) whereby attempting to place a rule before or after itself in a rulebook would cause an internal error, rather than a problem message.
Bug fixed (0000763) whereby attempting to change the default outcome of some action-specific check, carry out or report rulebooks would not in fact change their default outcomes (though for others it would).
Bug fixed (0000500) whereby rules which ambiguously contain "when" in their conditions, but where it isn't in fact a condition but part of a noun, would cause problem messages.
Bug fixed (0001006) whereby the "no outcome" rulebook outcome couldn't be printed using "say".
Bug fixed (0000550) whereby some name-clashes between rulebook variables and other named constants would be disallowed unnecessarily, which made it possible for the Standard Rules not to compile in some cases.
[x] Lists
Bug fixed (0000662) whereby duplicate problem messages would sometimes be issued for unrecognized list elements.
Bug fixed (0000836, 0001190) whereby phrases dealing with lists which were never in fact used, since the source never contained any lists, would fail to compile in I6.
Bug fixed (0001052) whereby sorting would sometimes get the wrong answer with high values due to numerical overflows; this would probably not have been seen on Glulx, but could more easily happen on Z.
Bug fixed (0001047) whereby use of a temporary variable in a list constant passed out of its scope would result in an internal error rather than a problem message.
Bug fixed (0000968) whereby the list L in a "repeat with X running through L" loop would be recalculated each time around, which besides being a little inefficient would also go wrong if the expression for L was not deterministic - e.g., if it made a random selection, or if it altered as a result of side effects of what was being done in the loop body.
[x] Tables
Bug fixed (0000444) whereby Inform would sometimes ignore an explicit kind declaration for a column and impose the kind "object" if that declared kind was a subkind of object (such as "person").
Bug fixed (0000446) whereby Inform would not allow some kinds of value in parenthetical kind declarations for columns, wrongly considering them to be bad syntax.
Bug fixed (0000448, 0001049) to do with Inform not always correctly inferring the kind stored in a column when its only examples had differing kinds (e.g. man, woman) which could only be implicitly united under a single kind (e.g. thing).
Bug fixed (0000931) whereby the kind of a column would be weakened to "object", etc., if it were given only as a general description in the top row, rather than an explicit declaration in the heading.
Bug fixed (0000537) to do with Inform being over-finicky about the kind of a column indicated only by a rule used as a value.
Bug fixed (0000571) whereby tables could not be given alphanumeric names such as Table C2, which was a bit embarrassing, given that the documentation used exactly that as an example Table name.
Bug fixed (0000587) whereby long text entries in certain tables were sometimes truncated; this showed up in use of the Basic Help Menu extension, but was not otherwise related to it.
Bug fixed (0000690) whereby names of kinds could sometimes appear where names of things were expected, in table cells, with no problem being reported.
Bug fixed (0000716) whereby the problem message for an empty table would sometimes be followed by an internal error if that table in fact also had a continuation table.
Bug fixed (0000718) whereby the problem message for an empty table lacked a reference to the source location.
Bug fixed (0001010) whereby an internal error rather than a problem message resulted from an improper column name - e.g. one using brackets, commas, consisting only of an article, etc.
Bug fixed (0000707) to do with looking up text vs indexed text entries in tables, though this is now moot since text and indexed text are now the same kind.
Bug fixed (0000624) whereby blanking out entries containing stored actions would sometimes obscurely fail.
Bug fixed (0001195) whereby blanking out entries corresponding to values in another column would sometimes zero them, not blank them.
Bug fixed (0001222) whereby a table column whose name consists only of an article would result in an internal error, not a problem message.
Bug fixed (0000939) - or maybe it's a suggestion - providing a problem message for the table column name "location", since people sometimes wrongly use this thinking it will determine the initial position of things; whereas in fact it overrides the meaning of many of the Standard Rules.
Bug fixed (0000407, 0000708) whereby looking text, stored actions, etc., up in a table containing blanks would sometimes cause the Z-machine to throw a "programming error", or cause Glulx to halt.
Bug fixed (0000683) whereby the run-time problem for accessing a nonexistent table entry would sometimes not appear in time to prevent an illegal memory access.
Bug fixed (0000801) whereby an attempt to set an entry which was a list, or indexed text, etc., corresponding to another value, would sometimes fail with a "deep copy failed" error at run-time.
Bug fixed (0000802) whereby text allocation would allocate too little memory. Though not really to do with tables, it manifested itself only when looking up indexed text in a table.
Bug fixed (0000696) whereby items created by table would sometimes not allow figure names as property values if those figures had yet to be declared.
[x] Scenes
Bug fixed (0000856, and cf. 0001147) whereby a rule firing "When a scene ends" would fire twice if a scene ended in a specialised way. To clarify, the following shows what ought to happen, but previously the "happen last" text appeared twice.
Once Upon a Time is a scene.
Once Upon a Time begins when play begins.
Once Upon a Time ends bouncily when jumping.
When Once Upon a Time ends:
say "This should happen second.";
When Once Upon a Time ends bouncily:
say "This should happen first.";
When a scene ends:
say "This should happen last.";
Problem message improved (see bug report 0000575) for attempts to mix scene ending conditions.
[x] Kinds and typechecking
Bug fixed (0000445) whereby the run-time problem message for attempts to set a variable to the wrong kind of value would be issued with the text of a quite different problem message as explanation.
Bug fixed (0000493) whereby text didn't always dynamically expand as it should in Glulx projects.
Bug fixed (0000497, 0000617) whereby Inform checks the kinds of what a relation relates better, so that problems can be reported earlier and in a more explanatory way.
Bug fixed (0000644) whereby some legal if exotic kinds such as
a phrase (phrase number -> (phrase number -> number)) -> nothing
would fail to be recognised and lead to a spurious problem message.
Bug fixed (0000727) whereby Inform produced an internal error when invited to create a "let" variable whose value was the name of a property having a complex kind (such as "relation of things to numbers").
Bug fixed (0000728) whereby problem messages would sometimes talk about the misworded name of a relation as if it were a property, because in fact that misworded name was the correctly worded name of the property used to store the relation data; such problems have been clarified.
Bug fixed (0000739) whereby problems for concatenated phrases which involved a potential mismatch of kinds at an intermediate stage were not as helpful as they might be.
Bug fixed (0000750) whereby problems involving kind mismatches of the basis of a rule were not as helpful as they might be.
Big fixed (0000751) whereby some assignments of property names to variables holding property names led to mis-compiled I6 code.
Bug fixed (0000809) whereby use of a phrase which produces an object, in a context where some more specific kind of object is required, would produce I6 errors if the phrase usage in question involved double-quoted text as one of its arguments.
Bug fixed (0000967) whereby Inform would sometimes allow conditions like
Instead of going to a room when the room is not visited: ...
in which "the room" intends to refer back to the one implicitly referred to by "a room", but where Inform misread it as:
Instead of going to a room when a room is not visited: ...
with misleading results. Inform now issues a problem message in such cases. (See suggestion 754190. It would, of course, be better to attempt to understand "the room" in line with the writer's expectations, but this begins to take us into the notorious "donkey anaphora" problem in structural linguistics. The sentence above is not very hard, but we're wary of trickier cases. So for now, at least, this kind of anaphoric reference produces an explanatory Problem message.)
Bugs fixed (0000906, 0000907, 0000911) and problem messages added to stop people making the fundamental spatial kinds "thing", "direction", "region" and "room" not fundamental any more: for example, "A room is a kind of door." has chaotic results since it means in particular that a room is also a thing. (It also causes the indexing code to hang, which was the specific cause of 0000911.)
Bug fixed (0001110) whereby one implicit reference to a loop which contains another, such as "whether or not a random thing unlocks a door", would under some circumstances fail to kind-check properly, and in others might crash the compiler.
Bug fixed (0001097, 0001121) whereby it was possible to increment or decrement non-arithmetic kinds of value, generating either bad I6 code or an internal error; there's now a problem message to pick this up.
Bug fixed (0000366, 0001004), relatedly, whereby Inform would allow instructions to change lists or texts which are constant: "remove 2 from {1, 2, 3}", for instance. There's a problem message for this, too.
Bug fixed (0000834) whereby a case value "-- V" in an "if" construction would not always be typechecked if it were defined by a polymorphic phrase whose arguments were wrong; in particular if V is some text making no sense but containing the word "before" or "after" in the middle, then Inform would throw an internal error rather than explain why this is wrong.
Bug fixed (0000759, 0001095) whereby phrases in the Standard Rules to do with rules would not accept nothing-based rulebooks, so that e.g. "follow the after reading a command rules" would not work.
Bug fixed (0000838) whereby global variables and properties couldn't be created of the kind "rulebook outcome" unless their explicit values were given.
Bug fixed (0000839) whereby "rulebook outcome" wasn't listed in the Kinds index. In fact this was intentional, since users aren't really intended to make use of "rulebook outcome"; but in view of 0000838...
Bug fixed (0000621) whereby the kind of a rule, treated as a constant, was sufficiently vague that "let" (for example) couldn't use it as a value.
Bug fixed (0000452) whereby oddball conditions like "if an object is an object" would throw a run-time problem claiming that Inform "can't implicitly repeat through the values of this kind".
Bug fixed (0001070) whereby "nowhere" used as a value of kind "description of rooms" would sometimes be read as if it were "somewhere"; and, relatedly, problem message added to catch attempts to quantify over a range within a single value, such as writing "three rooms".
Bug fixed (0000436) whereby text, stored action, list, etc., variables created inside loops and given no explicit value would not be found to be initialised to their default values on iterations after the first.
Problem messages improved or added to clarify that descriptions can't be used as first-class literal values (yet); see bug reports 0000899, 0000887, 0000888, 0000889, 0000891.
[x] Phrases and functional programming
A refined method for resolving ambiguous phrase usage gets several cases of apparent name clashes better (e.g., 0000599, 0000613).
Bug fixed (0000360) whereby the problem message for a case of an "if" missing its colon wasn't as helpful as it might be.
Infelicity fixed (0000442) whereby the generated I6 code for some deferred propositional tests included spurious commas, which looked strange, and were ignored by I6 anyway.
Bug fixed (0000490) whereby the problem message for using a local variable which had gone out of scope wasn't as helpful as it might be.
Bug fixed (0000491) whereby the problem message for using too many local variables in a phrase would in some cases be followed by a spurious internal error too.
Bug fixed (0000501) whereby the problem message for indenting a Python-style phrase entirely right of the margin wasn't as helpful as it might be.
Bug fixed (0000557) whereby the problem message for an "otherwise:" used to follow a single-line rather than blocked "if" wasn't as helpful as it might be.
Bug fixed (0000628) whereby the problem message for a malformed "every turn" condition was reported at the wrong line of the source text.
Bug fixed (0000777) whereby Inform crashed at the I6 stage if asked to define a phrase with a synonym consisting of a double-quotation mark.
Bug fixed (0000813) whereby use of "[any thing]" as a value of kind "topic" in a phrase argument would issue a misleading problem message about the past tense if used other than in a rule definition. (The correct behaviour is to issue no problem at all: this is quite legal.)
Bug fixed (0000877) whereby a mysterious internal error about "binding and substitution" would sometimes appear in response to conditions which require multiple substitutions when their logical form is being simplified: e.g. "if X which is related-in-some-way to Y is Z" where the nature of the relation implies knowledge about X given Y.
Bug fixed (0001153) whereby a complex "now", involving searching or systematic changes, which involed a text substitution in some way, would sometimes lead to a "Too late for further text substitutions" internal error. Such phrases now correctly compile.
Bug fixed (0001057) involving the use of "called" to identify phrase arguments whose kind involved parentheses.
"Bug" fixed (0000473, 0000946) whereby phrases to decide a condition would have the kind "phrase X -> nothing" - really this was a poor design decision, not a bug as such; anyway, the kind is now "phrase X -> truth state". (It's consequently legal to return in such phrases with "decide on T" for a truth state T, as an alternative to "decide yes" or "decide no".)
Bug fixed (0000688) whereby a phrase to decide a value, which in fact took no decision, would result in the value internally stored as 0, which was not always kind-safe. It now results in the default value for the kind in question.
Bug fixed (0000825, 0000830) whereby ambiguous phrases such as "dispatch based on item", given multiple definitions to go on where one involved a qualified description, e.g.:
To dispatch based on (X - a thing): say "Fail."
To dispatch based on (X - a thing that is yourself): say "Pass."
...would result in correct code being generated the first time they arise, but not subsequent times, when the qualified case (here "thing that is yourself") would be overlooked.
Bug fixed (0001079) to clarify that it's not legal to overload the return kind of a phrase, so that:
To decide what number is my special value: decide on 4.
To decide what person is my special value: decide on the player.
is a conflict which now produces a problem message.
Bug fixed (0000591) whereby the use of slashes to give alternative wording would cause the definitions of say phrases to lose case sensitivity.
Bug fixed (0000584) whereby the condition "if ... for 0 turns" would be miscompiled to something which is always true when the condition holds, rather than only true if it has only just become true.
Bug fixed (an offshoot of 0000818) whereby adjectives used as filters on lists would sometimes be read as applying to the wrong kind of value, if no kind was explicitly given.
Bug fixed (0000362, 0000747) whereby phrases with inline I6 definitions could nevertheless be given names as constants; this resulted in I6 compilation errors. It now causes an explanatory problem message.
Bug fixed (0000753, and see also 0000648) whereby phrases could be given definitions whose kinds could not in practice be determined through their usage, e.g. "To decide what value is bar: ...".
Bug fixed (0000904) whereby phrases involving kind variables could be invoked with kinds which could not be worked out by supplying them with the empty list written as a constant.
Bug fixed (0000768, 0000771) whereby a phrase to decide a topic, which returned what looked like constant text, would indeed return that and not a topic at all.
Bug fixed (0000452) - or, really, it suggested that Inform should have tighter syntax, which is now provided - so that using a kind variable as if it were a noun produces a problem message. For example, "if K is L" throws this problem; but "if a K is an L" doesn't, because "a K" is a description matching multiple values, whereas "K" on its own looks as if it might be a single value.
Bug fixed (related to 0001001) whereby definitions which give a return kind in terms of unset kind variables weren't being rejected - for example,
To decide which K is acclaimed by (x - value of kind J): do nothing.
does not determine K, and presumably the author meant J. This now produces a problem message.
Bug fixed (0000998) whereby phrases marked with "instead" wouldn't always quit their rules if they required run-time kind checking to perform.
Bug fixed (0000873) whereby a generic phrase whose tokens contained stipulations about property provision, as in this example:
To say foo (C - sayable value that provides the property
indefinite article):
...would not always correctly be applied.
Bug fixed (0001080) whereby a selection of overlapping phrase definitions distinguished only by descriptions of one or more tokens would sometimes be given incorrect mutual precedences.
Bug fixed (0000799) whereby the looking-up of a random value involving callings would result in those callings not being made, e.g., after
let foo be a random person in a room (called bar);
"foo" would be set but not "bar". They now both are.
Bug fixed (0000368) whereby phrases whose tokens were required to be specific other phrases would not always be correctly called.
Bug fixed (0000817) whereby descriptions of phrases would not always be accepted as filters on lists of phrases.
Bug fixed (0000463) whose circumstances were obscure, but which seemed to occur when named say phrases were used as terms in a relation.
Bug fixed (0000469) whereby "break" did not, as claimed, escape the innermost loop but would instead escape an "if X is... -- V: ..." construction (i.e., a switch case) if that were innermost.
Bug fixed (0001101) whereby local variables with the same name as a kind would be misunderstood in descriptions of actions.
Bug fixed (related to 0001101) whereby local variables were allowed to have some pretty strange names - punctuation, say.
Bug fixed (0000410) whereby rules taking effect on some condition which involves rulebook variables would sometimes cause spurious problem messages when in the presence of other rules in the same rulebook of an apparently similar logical priority.
Bug fixed (0000417) whereby two rule headers in a row, where the first therefore had no body to define it, would misleadingly be legal.
Bug fixed (0000900) to do with misreading ambiguous names of variables: see bug 0000956 below, though they aren't quite duplicates.
Bug fixed (0001106) whereby "(called X)" could be added after a token in a phrase which wanted only the name of a kind, not an instance of that kind.
Problem message added to catch creations of variables which have such a short life-span that they vanish immediately they're made - as in the following example (if X does not already exist):
if the location is the Casimir Effect Demo Area, let X be 1;
[x] Equations, units and arithmetic
Bug fixed (0001021) whereby square roots of integers with the top non-sign-bit set would be incorrectly evaluated as -1.
Bug fixed (0000850) to do with rounding negative numbers to the nearest value.
Bug fixed (0000548) to do with choosing an appropriate literal notation to print negative values of a unit.
Bug fixed (0000441) whereby arithmetic performed on times could push them out of range. This arose semi-intentionally, because Inform slightly improperly but conveniently uses the same kind for times of day as for durations, and a duration of "minus 10 minutes" makes sense but a time of day of -10 doesn't. Inform now renormalises the result of all arithmetic on times to force them into range.
Accuracy slightly improved when printing awkwardly-scaled units using only 16-bit integer arithmetic (see 0000547).
Problem message added (0000399) to catch attempts to solve an equation for a constant rather than a variable.
Problem message added (0000737) to catch integer scalings of units so wide that they can't safely be represented in the 16-bit Z-machine.
[x] Understanding
Bug fixed (0000561, 0000485) whereby Problems in conditions attached to Understand sentences would misreport type-checking errors.
Bug fixed (0000564) whereby Problems from sentences like "Understand "fooble" as the player." would be unhelpful.
Bugs fixed (0000647, 0001075) whereby using a "[something related by...]" token in an Understand sentence produced an internal error rather than problem messages when the relation was to a value rather than a thing. (0001075 occurs slightly differently, but was fixed at the same time.)
Bug fixed (0000698) whereby sentences like "Understand the P property as describing X" sometimes caused internal errors rather than problem messages if P is a value rather than either/or property.
Bug fixed (0000808) whereby placing items in scope could cause a hang at run-time when trying to match the name of something visible only if something is visible.
Bug fixed (0000957) whereby a too-many-activities run time problem could be generated from Understand grammar such as:
Understand "[person] spot" as the parking spot.
since this would mean that no object name could be parsed without checking to see whether it was the parking spot by this rule; but then, first the text must be checked to see if it begins "[person]"; and that would mean parsing an object name, which... and so on. Inform now checks that the "[person]" condition applies before rather than after parsing for it, which means that in the case of the parking spot object - which is not a person - no recursion occurs, and all is well.
Bug fixed (0000719) whereby the token "[something related by reversed wearing]" or "[something related by reversed carrying]" (but no others) would fail, in some cases causing a hang.
Bug fixed (0000636) whereby, at run-time, the response to incomplete commands (and where no "does the player mean" rule supplied suggestions) would be unhelpful ("I didn't understand...") rather than asking a clarificatory question.
Bug fixed (0001160) whereby, relatedly but differently, incomplete commands endin with multiple bogus prepositions (e.g. "DROP ROCK ON INTO") gave strange replies ("What do you want to drop the rock on those things?").
Bug fixed (0000767) whereby testing whether a command includes a snippet would sometimes fail if that snippet contained alternatives marked with a slash, and where the test occurred in a rule condition rather than in a phrase.
Bug fixed (0000814) whereby passing a topic as a phrase argument, which contains one of the special tokens such as "[someone]", would produce a spurious problem message about "[text]" not being allowed.
Bug fixed (0000437) - or, arguably, small feature added - so that it's now legal to have a range of aliases for objects or values, in which some aliases produce values, and others don't. For example:
Colour is a kind of value. The colours are red and blue.
A cube is a kind of thing.
Understand "[colour]" as a cube.
Understand "box" as a cube.
allows "red", "blue" and "box" all to refer to any cube. Previously, this would have thrown a problem message as being inconsistent, because one alias works out a value ("[colour]") and another doesn't ("box").
Bug fixed (0000433, 0001054) whereby the "deciding whether all includes" wasn't being consulted when only one object qualified for "all". It's arguable whether this is a bug, but the change makes the activity stronger, and better able to reject "DROP ALL" inferring the player when there's nothing else around, for example.
Bug fixed (0000865) whereby the snippet "player's command" would sometimes omit words added to the command as a result of followup disambiguation questions.
Bug fixed (0000765) whereby use of the token "[any D]", where D is a description of a kind which is otherwise not called for by any other token, would result in an I6 compilation error.
Bug fixed (0000700) to do with the names of things described by numerical properties.
Bug fixed (0000633, 0000943) whereby apparently unnecessary disambiguation questions were issued when trying to parse "put X in/on Y", with "does the player mean" rules not being properly consulted.
Bug fixed (0001002) whereby "does the player mean" rules would not always be consulted if a command ended with a full stop ("examine green." instead of "examine green", say).
Bug fixed (0000744) whereby "does the player mean" rules would not always be consulted on an ambiguous noun where the second token of the line consisted of "[text]" rather than an object.
Bug fixed (0000835) whereby what look like numbers, followed by a full stop, would sometimes not be read as objects even when that's what they are - e.g., if "one" could mean issue 1 of a magazine, "take one." would fail even though "take one" would work.
Bug fixed (0001011) whereby verbless commands with full stops dividing them could, sooner or later, cause crashes or hangs at run-time.
Bug fixed (0000642, 0000959) whereby matching text against tokens involving the names of objects could cause the value of "noun" to be corrupted, thus causing rulebook processing to go wrong.
Bug fixed (0000489) whereby literal patterns set up with an optional minus sign in front, and which could have two or more parts, would have the minus sign accepted but ignored by Understand tokens.
Bug fixed (0000680) whereby disambiguation questions would sometimes give the choices of object in the opposite order to that expected.
Bug fixed (0000396) whereby apparently incomplete commands beginning with a direction (and thus with a "go" implied) could be wrongly reported back by the parser error "I only understood you as far as..."; the text of which has also been improved in this case.
Bug fixed (0000800) whereby "GET ALL FROM X" would sometimes produce a peculiar reply if nothing was in X, but exactly one item had been explicitly placed in scope by a "deciding the scope" rule in the source text.
Bug fixed (0001134) whereby some "PERSON, SOMETHING" commands would not properly interrupt a disambiguation question.
Bug fixed (0000942), or at any rate the algorithm improved, so that Inform is better able to parse ambiguously worded properties by which objects are to be understood.
Bug fixed (0000460) whereby parsing names identified by number properties would sometimes, when it failed, cause a misleading choice of parser error.
Infelicity fixed (0001216) whereby I7 compiled references to the I6 variable "parser_trace" even in Release builds, where it's always 0.
Problem and run-time problem message added (in response to 0000580) to tell the player why one can't have "[text]" followed by something more flexible than fixed wording.
Problem message added (0000745) for an attempt to "Understand the command ... as ..." with a multiple-word command given. Previously this was accepted but did nothing, which could mislead authors.
Problem message added (0000555) to help prevent newcomers from writing sentences like:
Understand "yourself" as Bob while asking Bob to try doing anything.
where the condition depends on an action which has yet to be fully parsed, so that the condition can never meaningfully test anything.
Problem message added (0001204) to catch multiple uses of the "things" tokens in a single command line, as in:
Understand "put [things] in [things]" as inserting it into.
[x] Glulx issues, file I/O, figures, sounds
Bug fixed (0000756) whereby asking an "if the player consents" question would not update the status line first on Glulx, even though it would do on the Z-machine. (It now does on both.)
The template's embedded copy of "infglk.h" is now updated to one which was generated automatically for Glk API 0.7.4. (See bug 0001215, though this really wasn't a bug.)
[x] I6 template layer and inclusions
Bug fixed (0000487) whereby the problem message for a reference to an unknown I7 noun in (+ ... +) markers inside an I6 inclusion gives a source text reference to the wrong place.
Bug fixed (0000748) whereby a Z/Glulx opcode written in I6's @notation and placed on column 1 of its file would cause an internal error rather than a problem message.
Bug fixed (0000882) whereby the "ineffectual" use option had the effect of causing code to fail to compile in I6; it should of course have no effect.
Infelicity fixed (0000754) whereby the Parser.i6t routine I7_ExtendedTryNumber was never called. It's now removed.
Infelicity fixed (0000757) whereby some template code in letter (E) of Parser.i6t was redundantly duplicated.
Infelicity fixed (0000760) whereby calls to FollowRulebook in Parser.i6t were written misleadingly.
Infelicity fixed (0000626) whereby usages of the deprecated I6 syntax "for (;;)" were still used in the template code.
Problem messages added in place of internal errors for misapplication of certain undocumented internal syntaxes. (See e.g. bugs 0000775 and 0000831.)
Bug fixed (0000883) whereby problem messages citing an I6 inclusion (-...-) would, in the words of the reporter, "shortchange the author one smiley cyclops".
Bug fixed (0001104) whereby I6 code inserted after the last named part of a template file would lead to a problem message rather than the code actually being inserted.
Bug fixed (0000832) whereby use options with numerical values spelled out in words rather than numerals would be 0, not the value given.
Bug fixed (0000618) whereby Inform wasn't checking that the meaning of a "Use ... translates as ..." is meant to be just a single fragment of I6.
[x] Text, spacing and printing
Bug fixed (0000849) whereby Inform wouldn't complain at out of place "[otherwise]" or "[otherwise if]" substitutions.
Bug fixed (0000845, 0000912) whereby Unicode output on Glulx would bypass glulx's filter mechanism, which Inform doesn't use directly, but which authors willing to do some glulx assembly in I6 inclusions might use.
Bug fixed (0000384) whereby looking up a value decided by a rulebook could cause a spurious newline to be printed; this manifested itself in blanking out the status line, for example.
Bug fixed (0000743) whereby silent actions tried while a line of printed text was still incomplete would sometimes produce newlines even when they generated no text themselves, having worked.
Bug fixed (0000715) - or if not a bug, this was a request to clarify and make consistent the handling of tabs and newlines inside quoted text. The change made is that two or more newlines followed by tabs or spaces are now interpreted as a paragraph break, just as they would be if they weren't followed by tabs or spaces. So, for example:
say "Hello
there."
was always read as a paragraph break inside the text; and
say "Hello
indented a little."
is now also read that way. (The white space following the newlines is soaked up.)
Bug fixed (0000605) whereby use of character class escapes in ranges in regular expressions would match either their meaning or their letter code, so e.g. "<x\p>" would match an "x", a punctuation character, or a "p". It now matches just "x" or the punctuation character.
Bug fixed (0001155) whereby the "printing the name of" activity would sometimes get confused about indefinite articles if a rule needed to use the indefinite article of something else in the course of its work.
Bug fixed (0001046) whereby relations arising from properties of the kinds "room", "region" or "direction" would not be searched properly by an implicit search.
[x] Indexing
Bug fixed (0000502) whereby the World page didn't properly map backdrops in their locations.
Bug fixed (0000577) whereby Inform would halt with a file-system error if the Index subfolder of a project had been manually removed between runs. Inform now repairs the thing with the silent patience of a saint.
Bug fixed (0000826) whereby the Contents page of the index would take too much memory and time to render, especially on Windows, if there were more than 1000 or so figures. Inform now displays thumbnails only for the first 50 figures by default, but provides the use option "Use index figure thumbnails of at least X." to raise this as needed.
[x] Testing commands
Bug fixed (0000871) whereby the RULES ALL testing command wouldn't list some rules whose conditions of applicability failed.
Bug fixed (0000505) whereby the RULES testing command wouldn't list rules with no applicability tests. This was actually a deliberate decision, the idea being that you didn't need to be told, but I now think the added verbosity is worth it for the sake of consistency.
Bug fixed (0000356) whereby the RELATIONS testing command would give wrong answers or, in some cases, crash on a one K to various texts relation.
Bug fixed (0000860) whereby "does the player mean" rules would not always be run for some commands in a TEST script.
[x] Releasing, bibliographic data, and cBlorb
I'm grateful to David Griffith for supplying a little code to allow cBlorb to produce I6 constant declarations like those generated by the older tool perlblorb, for the benefit of I6 projects developed outside the I7 framework.
Bug fixed (0000551) whereby releasing with source text after including some extensions (notably the GPL3 licence one) caused cblorb release errors.
Bug fixed (0000597) whereby releasing with source text including a multiline footnote with extra white space would lead to badly formatted website.
Bug fixed (0000615) whereby releasing a project whose title ends in a question mark failed (though on Windows only).
Bug fixed (0000714) whereby releasing with an existing Z-code story file caused I6 errors related to "VPH_Class".
Bug fixed, or suggestion adopted (0000746), to do with values of the bibliographic variables "release number", "story headline" and "story genre" when these are not set by the source text.
[x] Extension maintenance
All of the built-in extensions have been made adaptive (see above).
A new extension, Inanimate Listeners by Emily Short, has been added to the built-in selection to provide for objects like microphones which, though inanimate, can be talked to.
(See suggestion 750934.)
A new extension, Skeleton Keys by Emily Short, has been added to the built-in selection to provide the built-in implementation of locking (a one thing to various things relation) with a more generous but memory-consuming implementation (various things to various things). This means that it is possible to have multiple keys that open the same lock. It is compatible with, but does not require, the new version 12 of Locksmith by Emily Short.
(See suggestion 819431.)
Metric Units by Graham Nelson has been completely rewritten to use real arithmetic, and now performs more accurate physical calculations.
A new extension, Approximate Metric Units by Graham Nelson, is essentially the previous version of Metric Units under a new name, and performs calculations with scaled integer arithmetic as before.
Complex Listing by Emily Short: misleading code in second example improved.
Bug fixed (0000929) making lists of rooms fail to "prepare" in Complex Listing by Emily Short.
Bug fixed (0001003) causing period removal to fail in Punctuation Removal by Emily Short (on Glulx only, and with different symptoms on different interpreters).
[x] Examples maintenance
Nine new Examples have been added to demonstrate new features: "Fun With Participles", "Greater Variety", "History Lab", "Narrative Register", "Olfactory Settings", "Relevant Relations", "Responsive", "Variety" and "Wesponses". Contrariwise, "Odins" has been removed, since it demonstrated adaptive text tricks now done much more easily with features built in to the language.
Of the 447 Examples in the previous build, some 114 have been slightly tweaked to make better use of modern Inform syntax; procedural rules have been removed, and so forth. An itemised list would be tiresome.
The sense of "Verbosity" has been reversed: it used to demonstrate how to make room descriptions verbose, but now that conventions have changed, it instead demonstrates how to make them not verbose.
Bug fixed (0000687) whereby the beverages in "Disenchantment Bay 12" would respond to OPEN with a run-time problem.
Bug fixed (0000689) whereby the hats in "Hatless 3" would sometimes appear to miss one of the quartet out, because the remaining hat would be placed on the player's head instead.
Bug fixed (0000697) whereby the "Circle Of Misery" baggage carousel was inadvertently portable.
Bug fixed (0000720) in "Lanista 2" whereby a run-time problem was produced just as the player died upon the sands.
Infelicity fixed (0000721) in "Odyssey" to remove side-effects on "every turn".
"Bogart", "Persephone" and "What Not To Wear" given slightly better modified inventory rules, in case people borrow these for their own stories. (Suggestion 5252251).
Minor bugs, turned up by 0000967, removed from "U-Stor-It", "Otranto", "Reflections", "Shipping Trunk", "Trachypachidae Maturin 1803".
Bug fixed (0001055) whereby TAKE ALL in "Low Light" would pick up the shadow.
Bug fixed (0001146) whereby "MRE" allowed multiple foods to interfere with each other's nutritional value.
Bug fixed (0001176) whereby the light-meter in "Unblinking" did not always disappear after use.
Bugs fixed (0001202, 0001212) to do with commentary in "Terror of the Sierra Madre" and "The Facts Were These".
Finally, from the department of might-have-been, Emily Short's epic espionage game Counterfeit Monkey came out: http://www.emshort.com/counterfeit_monkey Which we mention here since it began life in 2008 as what was going to be a three-star Inform example.
[x] Interpreter maintenance
Inform comes with browser interpreters built in, so that it can act on release instructions such as "Release along with an interpreter.", which tell Inform to make a website in which the current story is immediately playable.
** Parchment, by Dannii Willis (the interpreter for projects with the Z-machine setting):
Updated to "Parchment for Inform 7 (2014-04-21)". This replaces the old Gnusto interpreter core with a new one, ifvms.js, which is both faster and smaller, and is now licenced under a new BSD licence (rather than the GPL as it was before.)
Any updates to Parchment made between builds of Inform 7 can be found at: https://github.com/curiousdannii/parchment/
** Quixe, by Andrew Plotkin (the interpreter for projects with the Glulx setting):
Updated version to "Quixe for Inform 7 (v. 1.3.1)". Supports accelerated functions, access to real date and time, line input terminator keys, line input echo control, and resource streams; also various bug fixes and optimizations.
Any updates to Quixe made between builds of Inform 7 can be found at: http://eblong.com/zarf/glulx/quixe/
** Vorple, by Juhana Leinonen (a Z-machine interpreter for projects using the Vorple suite of extensions for multimedia):
This is included with the main Inform distribution for the first time, as part of what we hope will be much greater integration in future. See vorple-if.com for more.
[Chapter: Earlier builds] What was new in builds 6E59 and 6G60 (June and December 2010)
///floating:apr10.jpg/// As this release was being prepared, the world's largest census was taken, in India; the Eyjafjallajökull volcano in Iceland cut off air routes to Europe; in Ireland, pubs in Limerick opened on Good Friday, and a grey seal which had escaped from London Zoo was found in the seaside town of Skerries; element 117, ununseptium, was created inside atomic reactors; the Vatican declared that the Turin Shroud was not a forgery, but a mystery beyond human artistry; Lactococcus lactis became Wisconsin's official State Microbe following the passing of Assembly Bill 556 (Wisconsin's State Dance, incidentally, is the polka); Lady Gaga became the first singer to break one billion plays on YouTube, while Rukidi IV of Toro came of age and inherited his kingdom; and Cambridge had its revenge in the 156th Boat Race, defeating Oxford.
In the world of Inform, the Release mechanism was improved, with better feedback and a new ability to generate websites in which the project can be played in-browser. The system of kinds was made much more flexible and expressive, and phrase definitions gained in power as a result. A new chapter on Advanced Phrases was added to the manual, covering functional and generic programming. Properties, assemblies and relations were all reworked to be applicable much more consistently across the whole range of values, rather than being restricted only to objects, simplifying the language. Limits on the lengths of names of relations, verbs, prepositions, and directions were all lifted. The documentation and the Phrasebook index were revised and harmonised.
The 6G60 build followed six months later, to correct bugs and improve the Index, but the language itself did not change.
///6E59.txt///
[x] What was new in build 5Z71 (April 2009)
///floating:apr09.jpg/// As this release was being prepared, the Indian Ocean island of Mayotte voted to rejoin France, which in turn rejoined NATO; Sweden, Vermont and Iowa legalised gay marriage; Fermilab discovered the Y(4140) particle, composed (some said) of charm and anticharm; the Proctor and Gamble soap opera "Guiding Light" was cancelled after 72 years of family struggles, uplifting sermons, and the legendary Reva, twice believed dead but in fact an amnesiac taken in by the Amish who returned to find her husband living with a clone of her called Dolly, who in remorse took her own life with aging serum, leaving Reva free to become a San Cristobelian Queen and travel in time, and... so on; Oxford, with its heaviest rowing crew in centuries, won the annual Boat Race against Cambridge; and Barack Obama's first hundred days coincided with a hundred days of hair-tearing by the makers of the new Inform website.
In the world of Inform, miscellaneous benefits came out of a substantial internal reform in logic and the handling of kinds of value. Many of those lifted niggling restrictions - see the full change log for details. Build 5Z71 uses around a third as much memory as 5U92, does much less file-handling, is a little faster, and can handle projects unlimited in size. Dimensional checking became much more flexible, allowing Inform authors to model the world with quantitative physics, and a new built-in extension, "Metric Units by Graham Nelson", defines all the kinds of value needed. Equations, imitating those in books and papers, were added to the language. The release mechanism was also rewritten, allowing much better CSS-friendly websites to be produced by the Release button. The Recipe Book was expanded and rewritten in its coverage of actions and commands. Lastly but most visibly, the Index was redesigned and the Problem messages relaid to incorporate links to relevant documentation. All 132 issues arising from bug reports since build 5U92 were closed out.
///5Z71.txt///
[x] What was new in build 5U92 (September 2008)
///floating:sep08.jpg/// As this release was being prepared, King Tupou V of Tonga was crowned, but Nepal became a Republic; climbers were lost to avalanches on K2 and Mont Blanc; Australia became perplexed at winning fewer Olympic medals than Great Britain; the most wanted man in Greece, who had escaped from prison by helicopter, was recaptured; a 50-foot spider spent a week crawling at 2 mph across the Liverpool skyline, spraying random passers-by with water; and many journalists had to learn how to spell "Ossetia" at a time when they would rather have been watching the sports channels.
In the world of Inform, a set of related improvements was made to the way adjectives, nouns and verbs combine in descriptions. This lifted many restrictions which made talking about values less flexible than talking about objects, and showed the language gradually becoming more general. In addition, directions could now be created freely. All 110 issues arising from bug reports since build 5T18 were closed out.
///5U92.txt///
[x] What was new in build 5T18 (April 2008)
///floating:apr08.jpg/// As this release was being prepared, the Grand Canyon was deliberately flooded, while Sweden's largest lake was lowered by 15cm; in London, Heathrow Terminal 5's state-of-the-art automated baggage system went live; gold prices broke £500 per troy ounce, while Pernod Ricard bought Absolut Vodka for $9 billion; in London, Heathrow Terminal 5's state-of-the-art automated baggage system began to fail, with many cancellations; Vietnam banned pet hamsters; in Nashville, King Crimson began recording again, but in Princeton our greatest translator of Homer, Robert Fagles, died; and in Milan, 15,000 items of lost luggage arrived from Heathrow Terminal 5's state-of-the-art automated baggage system, so that they could be sorted by human beings instead.
In the world of Inform, build 5T18 finally made the long-awaited reform of "block structure", allowing Python-like syntax for grouped phrases, and made miscellaneous other improvements throughout. The Standard Rules were redrafted and formally advanced to version 2, and the standing I6 code used by I7 - the "template" - was completely rewritten. The first steps were made towards an official system for translating I7 into languages of play other than English, something which had previously been done but only with great difficulty. Certain run-time algorithms were optimised for speed, and all 162 open bug reports as of 26 April 2008 were closed out.
Besides the new examples, new material was added to the Recipe Book to give more guidance on designing new commands (see the Commands chapter), on the looking action and on conversation.
///5T18.txt///
[x] What was new in build 5J39 (December 2007)
///floating:nov07.jpg/// As this release was being prepared, the American footballer Antonio Cromartie scored a touchdown with a continuous run of 109.88 yards, a league record unlikely ever to be broken on a pitch 110 yards long; the UK government burned two CDs with unencrypted bank details for every family with children, put them into the unregistered post, and then panicked when they never arrived; a pilot project in Fairfield, Texas, began converting carbon emissions from a power station into (edible) baking soda; there were wildfires in Malibu, floods in Tabasco and Rift Valley Fever in the Rift Valley; and a cruise liner struck an iceberg in the Antarctic and sank, but everyone was saved.
In the world of Inform, build 5J39 introduced lists as first-class values. For any kind of value K, "list of K" was now also a kind of value, and rich support was provided for building and iterating over lists, dynamically resized as necessary.
///5J39.txt///
[x] What was new in build 5G67 (November 2007)
///floating:oct07.jpg/// As this release was being prepared, the 50th anniversary of Sputnik 1 was marked, while Japan's Selene satellite entered lunar orbit; miraculously, all three thousand men trapped underground in an Elandsrand gold mine were rescued; Jason Lewis completed a circumnavigation by bicycle, pedal boat and kayak; the Chicago Marathon ran to a photo finish; the US conceded that it had mistakenly kidnapped a German car salesman; squirrels were declared once again safe to eat in New Jersey; and Albus Dumbledore was outed by J. K. Rowling.
In the world of Inform, build 5G67 extended the range of values which can be handled to include truth states, indexed text and stored actions. Inform was made compatible with Apple's newly-released Mac OS X Leopard (10.5), including suitable QuickLook and Finder plugins for dynamic icons and cover flow showing the contents of ".inform" project bundles. Philip Chimento joined the Inform team as the author of the Gnome user interface for Linux, building on Adam Thornton's work with the underlying tools, and the first easy-to-install packages for Fedora and Ubuntu were made available. This "what's new" chapter was added to the documentation, and further work went into improving the Recipe Book with a view to making it easier to extract general solutions for general problems. All 110 open bug reports were closed: there are now once again no known issues.
///5G67.txt///
[x] What was new in build 4X60 (August 2007)
///floating:aug07.jpg/// As this release was being prepared, Russian submersibles planted a flag on the North Pole, 4.2 km underwater; there was a crackdown on counterfeit toothpaste in Mozambique; forest fires threatened Dubrovnik, while Minnesota flooded; there was a single, unconfirmed sighting of the Yangtse River Dolphin, thought extinct since 2004; the Unix court case, SCO v. Novell, found for Novell; the quarterback of the Atlanta Falcons pled guilty to "conspiracy to sponsor a dog"; and Peter Stoychev of Bulgaria broke the speed record for swimming the English Channel.
In the world of Inform, build 4X60 introduced the Recipe Book to the in-application documentation, and made a number of internal reforms, notably improving the speed of table handling at run-time.
///4X60.txt///
[x] What was new in build 4W37 (July 2007)
///floating:jul07.jpg/// As this release was being prepared, Chinese archaeologists remotely sensed an unknown chamber in the Tomb of the Terracotta Army; Corporal Willie Apiata became the only living New Zealander to hold the Victoria Cross, won in Afghanistan; the Ghanaian cedi became the strongest African currency; Live Earth concerts were held worldwide, and the Boeing 787 was unveiled; the US Congress passed the "Honest Leadership and Open Government Act"; prolonged dust storms swept Mars, while floods in Tewkesbury submerged the whole town save only the 12th-century Abbey.
In the world of Inform, build 4W37 made miscellaneous improvements mostly centred around parsing the names of objects. A significant change not linked below, since it was an excision, was the removal of the former "player-character" kind of person: any person can now be the protagonist.
///4W37.txt///
[x] What was new in build 4U65 (April 2007)
///floating:apr07.jpg/// As this release was prepared, the US Supreme Court ruled that greenhouse gases were a pollutant; the Paris-Strasbourg TGV set a new world record railway speed of 357 mph, three-quarters the cruising speed of a Boeing 737; Charles Simonyi, author of Microsoft Word, became an astronaut; the genome of the macaque monkey was published; 80,000 people attended Wrestlemania 23 at Ford Field, Detroit; and Kryptonite, Superman's fictional mineral, was unearthed in a Serbian mine.
In the world of Inform, 4U65 saw a reform to the handling of actions, making it easier for actions to handle all actors equally, and the introduction of variables shared in common amongst rules which collaborate to perform a task between them. This allowed almost the entire world model of 70 built-in actions, previously hand-coded in Inform 6, to be moved into much more legible Inform 7 source text. 4U67, a Mac OS X variant, was identical except for user interface improvements.
///4U65.txt///
[x] What was new in build 4S08 (March 2007)
///floating:mar07.jpg/// As this release was prepared, the fence dividing Cyprus was dismantled at last - just as, for lack of such a fence, Switzerland accidentally invaded Liechtenstein; Mr Stark of California became the first Congressman in US history to declare his non-belief in God; the UK legislated for a 60% cut in carbon emissions by 2050; enigmatic lakes were imaged on Titan, and heavy snow fell in Kashmir; Martha Jones became Doctor Who's first black companion (if we don't count Frobisher the penguin); and the Bornean Clouded Leopard was declared a new species.
In the immortal words of Robert Heinlein: "Bugs, Mr. Rico! Zillions of 'em! I'm a-burnin' 'em down!" Build 4S08 saw the first release of I7 for Linux, and there were useful reforms of the default value for kinds of value and of the paragraph breaking algorithm, but this was primarily a maintenance release. This release closed all 335 open bug reports, and marked the end of the experimental early days since the original Public Beta release.
///4S08.txt///