*** Change log for Inform 7 *** Versions of Inform 7 are identified by "build number", a combination of digit, letter, and two digits: for instance, 2P75 comes after 2P74 and long after 2G14, but before 2Q02 and long before 3A07. This log briefly notes the changes in Inform from the first Public Beta. All changes apply to all platforms unless otherwise noted. The log is reverse-ordered, so that more recent builds appear earlier. Minor changes to documentation are not listed. 5U92 (10 September 2008) This build makes a set of related improvements to the way adjectives, nouns and verbs combine in descriptions. This lifts many restrictions which made talking about values less flexible than talking about objects, and shows the language gradually becoming more general. This brings only subtle (if nice to have) improvements for authors, but improves the coherence of the design of Inform. In addition, directions can now be created freely, fulfilling the last outstanding promise made in the January 2007 consultation document. There are miscellaneous minor improvements, and five months' worth of maintenance changes. All 110 issues arising from bug reports received up to 7 September 2008 were closed out. INFORM FOR WINDOWS Added a preferences dialog, allowing the tab size in the source panel to be set. Drag and drop in the source panels now follows the usual Windows conventions: by default the operation is a move, and holding down the 'Ctrl' key during the drag makes it a copy. Fixed a bug in the built-in Glulx interpreter that generated spurious timer events. Accented characters in the user's name should no longer cause the compiler to crash. INFORM FOR LINUX Internationalized all the strings in the user interface, so that translators can if they wish translate these. (A Spanish translation has been started, thanks to Ángel Eduardo.) The Documentation text will now still be visible when using a light-on-dark desktop theme. The dialog that appears when you start the program can now be closed, in case you started the program by accident. Bugs fixed that caused some preferences to revert to their default values every time the application started. Bug fixed that caused a crash when deleting some items from the Skein. Various minor bugs and crashes fixed. NATURAL LANGUAGE Descriptions and adjectives have each been expanded in scope, so that many kinds of value can now be handled in ways which previously only worked for objects. Specifically: Either/or and value properties can now be given to any kind of value with named, enumerated outcomes. So for instance: A scene can be thrilling or dull. A scene has a text called cue speech. or: Colour is a kind of value. The colours are red, blue and green. A colour has a number called frequency. The frequency of a colour is usually 130. As with objects, the names of either/or properties act as adjectives describing a scene. Descriptions can now talk about values as well as objects. So: if N is an even number, ... if the score is positive, ... let L be the list of thrilling scenes; repeat with S running through non-recurring scenes: ... if more than three scenes are dull, ... all now work. Repeating through and listing require that the possible range of the kind of value is finite - so you can't write let L be the list of numbers; (which would have to be infinite). See the chart at the bottom of the redesigned Kinds index page to see when repeating and listing are allowed. The same adjective can now have multiple independent meanings, and there is no difficulty provided that these apply to different things. Thus a definition of "fancy" for a colour would not obstruct a definition of "fancy" for a door, for instance. The Standard Rules now define the following adjectives for values as built-in: even, odd, positive, negative - for numbers empty, non-empty - for texts, indexed texts, tables, rulebooks, activities, and lists recurring, non-recurring, going on - for scenes (Note the six independent definitions of "empty" depending on context.) "Recurring" used to be an adjective which could be used only when creating a scene, as in: Train Stopping is a recurring scene. It is now an either/or property, which means we can change it at run-time: now Train Stopping is non-recurring; Now that scenes can be described in flexible ways, we can use the "during ..." clause of a rule flexibly, too. For instance: Before going north during a dull non-recurring scene, ... (Previously "during" could only name a single explicit scene.) There is now a short-hand way to define the antonym of an adjective, that is, the name of its opposite. For instance, the Standard Rules include: Definition: a number is even rather than odd if the remainder after dividing it by 2 is 0. The optional part here is "rather than odd", which saves us writing: Definition: a number is odd if it is not even. (Note that different meanings of an adjective can have different opposites. We could, if we wanted, write Definition: a stored action is empty rather than purposeful if ... and then the opposite of "empty" would be "purposeful" in the context of stored actions, but "non-empty" for the other cases above.) Inform has always supported a convenient quick way to create a property, sometimes specific to a single thing, which have three or more named possibilities: A fruit can be citrus, berry, melon, or pome. This actually makes a property called "fruit condition" and creates a new kind of value whose possibilities are enumerated as "citrus", "berry" and so on. The author often never needs to use the name "fruit condition", because the adjectives "citrus", "berry", ..., are convenient enough by themselves. But because Inform forms the property name in this way, there's a collision if two different ranges are created: A fruit can be unripened, ripe, overripe, or mushy. A fruit can be citrus, berry, melon, or pome. In previous builds this prevented two such conditions from existing at once for the same thing or kind. Inform now allows any number of conditions to exist independently of each other; if the author supplies an explicit name, that's used, and otherwise Inform automatically makes names. Thus: A fruit can be early, summer or late. A fruit can be unripened, ripe, overripe, or mushy (this is its squishiness property). A fruit can be citrus, berry, melon, or pome. creates three properties, called "fruit condition", "squishiness" and "fruit condition 2" respectively. This means that an extension author can write, say, A vehicle can be brand new, roadworthy, battered or wrecked (this is its serviceability property). without "using up" the eventual user's ability to make his own "vehicle condition". Conditions like these can be created for anything which can have a property, and in particular for scenes and enumerated kinds of value as well as for objects (see above). It is now possible to use "there", as in "there is" or "there are", to talk about whether or not something exists. Here are some examples in assertion sentences: There is a room called the Shadow World. There is a box in the Shadow World. There is a jigsaw puzzle in the box. A coin is a kind of thing. There are two coins on the crate. Incrimination relates various things to various people. The verb to incriminate (he incriminates, they incriminate, he incriminated, it is incriminated, he is incriminating) implies the incrimination relation. There is a man called Mr Darcy. There is a pair of boxer shorts which incriminates Mr Darcy. There is a fishing rod incriminating Mr Darcy. And here are some examples in conditions: if there is a man, ... if there are vehicles, ... if there is nothing in the box, ... if there are three coins in the box, ... if there are exactly three coins in the box, ... if there are at least three coins in the box, ... if there is something incriminating Mr Darcy, ... if there is nothing incriminating Mr Darcy, ... if there are fewer than two things which incriminate Mr Darcy, ... Note that if there are three coins in the box, ... if there are at least three coins in the box, ... have the same meaning: if the number of coins in the box is four, then there do exist three coins in the box, which is what these are testing. "Exactly" is more precise: if there are exactly three coins in the box, ... As some of these examples suggest, the handling of "nothing" has been improved so that it can be used in a wider range of contexts, and a few bugs have been fixed in the process. For instance, the following now works: now nothing incriminates Mr Darcy; And similarly for "nowhere", "nobody", "no-one" and even "no one" - now nobody in the Temple is surprised; if nowhere is dark, ... if no one is in the Temple Annexe, ... It has always been legal to use "not all" in a condition - for instance, if not all of the coins are in the box, ... "Not every" has been added, so that this has the same meaning: if not every coin is in the box, ... And similarly, we can now if we wish write if not more than four coins are in the box, ... or (equivalently) if not fewer than six coins are in the box, ... if not less than six coins are in the box, ... Those are the only determiners to which "not" can be applied. So this, for instance, continues not to be allowed: if not some of the coins are in the box, ... There was previously a hard limit of 32 on the maximum number of relations "in groups" which could be created in any single compilation: this has been removed and there is now no limit. The relation which tests whether two things are equal now has a name: it is the "equality" relation. So for instance it's now possible to define - The verb to be identical to implies the equality relation. (There's no obvious reason for doing this, but it was anomalous that it couldn't be done before.) When a verb is created in the form "to be able to...", as the Standard Rules does with the line: The verb to be able to see (he is seen) implies the visibility relation. then the following prepositional forms can be used: "to be able to see" "to be unable to see" "to be able to be seen by" "to be unable to be seen by" The last of these, "to be unable to be seen by", did not work in previous builds, having been overlooked. So it is now possible to write, e.g., if Peter is unable to be seen by Paul, ... if Peter had not been unable to be seen by Paul, ... DIRECTIONS Directions have been reformed. In earlier builds it was difficult to create new directions (and the documentation officially said that this could not be done at all); I6 hacks were needed, and the results sometimes failed. Directions can now be created freely, or at any rate pairs of them can: Turnwise is a direction. The opposite of turnwise is widdershins. Widdershins is a direction. The opposite of widdershins is turnwise. - To create a direction, a simple sentence in the form "X is a direction." must be given. - Each direction has to have a value for the "opposite" property, which has to be another direction; these must be in matched opposing pairs. - The maximum length of a direction name used to be 1 (i.e., they had to be single words); now it is 3. - The maximum number of directions used to be 16; now it is 100. - New directions are exactly as good as old ones: for instance we can write "to be mapped turnwise of", or use route-finding through new directions. - Each direction automatically makes a relation, the "mapping-turnwise relation" (or similar), which is the meaning of "to be mapped turnwise of". This enables us to define prepositional forms; for instance, the Standard Rules includes the line: The verb to be above implies the mapping-up relation. - The I6 implementation beneath the surface is new: there are no "n_to", "s_to", etc., I6 properties any longer; the "door_dir" property for doors now holds a direction object, not a direction property as it did in the I6 library; the map is stored in a flat array instead. See the template file "WorldModel.i6t". MINOR NEW FEATURES Scenes can now be said - that is, if X is a scene, then "[X]" now expands to the name of the scene. It is now possible to have "let" and global variables of the kind of value "sound-name", which hold sound effects. (The default value for this is a special silent sound, the playing of which has no effect, but which is present in all compilations regardless of whether they use sounds or not.) And similarly for "figure-name" and "external-file". "Scene", which up to now could be held in a global but not a local variable (an oversight) can now be either. Truth states (both of them) can now be understood, so actions can be made which are applicable to them, and "[truth state]" is a valid Understand token. The Understand token "[a time]" matches a time of day, such as "10:15 AM" or "midnight". But the "time" kind of value can hold relative times as well as absolute ones -- for instance, 10 minutes is a time, but it is not recognised by "[a time]" since it isn't a specific moment in the day. A new Understand token called "[a time period]" has been added for this, so for instance Understand "wait for [a time period]" as ... would match WAIT FOR AN HOUR or WAIT FOR TWO HOURS 12 MINUTES. The handling of mixed-case notations has been improved - for instance, given Acidity is a kind of value. pH 7 specifies an acidity. the "p" will always be printed in lower case, and the "H" upper case. Printing back always respects the case in the original specification; but parsing is always case-insensitive. Repeating through tables used to carry the risk that if something in the body of the loop changed the row selection, the loop would break, since it used the row selection itself as an iterating variable. This has been corrected. A "repeat through" loop can now be nested inside other "repeat through" loops; the body of the loop can change the row selection without harm; moreover, a "repeat through" loop preserves the row selection, so that on exit, the same row (if any) is selected as was selected before the loop began. When tables are sorted "in random order", blank rows are now automatically moved to the bottom. The non-blank rows occur in a uniformly random order at the top of the table. When "Include ... instead of ..." is used to replace a part or segment from the I6 template, a subsequent "include... instead..." on the same part or segment now overrides an earlier one. (In 5T18 both would be applied, but this almost never led to valid I6 code, and it's hard to think of circumstances when users would want that behaviour.) It continues to be the case that "Include ... after ..." and "... before ..." allow multiple inclusions attached to the same part or segment. INTERFACE TO I6 INTERNALS There are now two ways to specify that an adjective is defined at the I6 level: Definition: a rulebook is empty rather than non-empty if I6 routine "RulebookEmpty" says so (it contains no rules, so that following it does nothing and makes no decision). The part in brackets does nothing, but is the text used in the Phrasebook index for the user's benefit; it should be a brief definition. The I6 routine should take one parameter, the value on which the adjective is being tested, and should return true or false as appropriate. Definition: a rulebook is exciting if I6 condition "excitement_array-->*1==1" says so (it is really wild). The condition is given as a "schema", in which the escape "*1" is expanded to the value on which the adjective is being tested. (This is usually faster than calling a routine, but in case of side-effects, the *1 should occur only once in the condition, just as with a C macro.) The "translates into I6 as" verb now has another possible use: for Understand tokens. This is how the Standard Rules sets up the new "[a time period]" token, for instance: The Understand token a time period translates into I6 as "RELATIVE_TIME_TOKEN". (The I6 routine of this name can be found in the Time.i6t template file.) This might be of use to extensions which want to add very rich parsing possibilities which break existing conventions. PERFORMANCE The run-time storage of relations, kind membership and the map has been made slightly more efficient. The gain has been used to make projects with "use memory economy" in force run a little faster - previously, memory economy blocked Inform from generating faster searches through objects by using precompiled linked lists. That still leaves a memory saving of around 2.5K in a completely full Z-machine story file. This is not as ridiculous as it sounds, since the Z-machine has only 64K of dynamic memory to play with, and this tends to be the limiting factor on the size of projects which Z can handle. A minimal I7 project needs 24K of this, so a saving of 2.5K out of the remaining 40K represents room for maybe a 6% larger design. (Of course for Glulx projects this is all irrelevant - there are really no size limits at all.) Some users observed that the 5T18 build compiled more slowly, and this was a large enough effect to make a considerable difference to novel-sized projects (with 200,000-word source texts). This proved to be an accidental side-effect of internal consistency checks only really needed when debugging Inform itself. This has been fixed, and large projects should once again compile at roughly the same speed as in 5J39 and previous builds. MAINTENANCE Problem messages added for attempts to write constant values in notations where the second or subsequent numerical element runs out of the legal range, or where the total value exceeds the maximum or minimum range which Glulx can hold. (There was already a similar check for Z-machine projects - for Glulx, of course, the bounds are larger.) Similarly, run-time parsing of values in such notations is also checked more carefully to see that it remains in range. Finally, the Kinds page of the Index now quotes the maximum possible value for both Z-machine and Glulx use. (It previously quoted this only for Z, thus giving a misleading answer if Glulx was used.) Problem message added to explain what's wrong when the source text tries to provide command grammar for a word reserved as an Inform testing command, such as SHOWME. (And the indexing of these reserved commands on the Actions index page has also been improved.) Problem message improved when "try" is applied to something which ought to be a valid action, but which isn't for type-checking purposes - for instance, try taking 22; Problem message added (in place of an internal error) to catch cases where a verb is missing from a condition so that it otherwise forms a description with no obvious subject: if the player not carrying a thing, ... (which of course is missing an "is".) Problem message added to block the use of "called" when it is being used only to rename one specific item, e.g., if the Z-Boson Destructorator (called the gun) is carried, ... Previously this sometimes worked, but sometimes didn't, and in any case wasn't ideal from a stylistic point of view. Problem message added to block the use of implications based on information not available at compile-time, such as: A room in the Garden is usually lighted. (Previously this disregarded the relation information - the "in the Garden" part - and therefore wrongly read the sentence as "A room is usually lighted", a valid but different implication.) Problem message added to catch attempts to equate two kinds of variable, as in: The stored actions variable is a truth state that varies. (This has happened because the user didn't realise that "stored actions variable" was a general category of variables, and thus not a good name to choose for a specific one. In 5T18 it produced an internal error.) Problem message added to object to saying that things are to be defined by a table, but also saying how many there are (which may of course be in conflict with the number of rows in the table): Three berries on the bush are defined by the Table of Tasty Berries. The word "three" is either redundant or contradicts what the Table says, and the problem message says it should be removed, e.g., by writing: Some berries on the bush are defined by the Table of Tasty Berries. Run-time problem message added to explain why only things can be moved during play (not for instance rooms, regions or directions). (Although people very seldom try this deliberately, they do sometimes accidentally ask for it because of misunderstandings about short forms of names of rooms.) Bug fixed whereby a small number of rules formed like this one: Before printing the name of an object: say "Print." would cause a spurious internal error; and similarly for rules such as Before listening to nothing: ... which can't in fact be useful (because "listening" always takes a noun), but ought not to trip over the compiler; and similarly for clauses such as: Instead of going east by nothing: ... in which optional details are added to an action (and these can indeed be useful: this example means going east on foot, i.e., with no vehicle). This was all one single bug, and was the one most experienced by users of 5T18 - apologies. Bug fixed whereby and "[end if]" adjacent to an "[or]" in text, as here: "[one of][if the location is Lab]Lab[end if][or]blah[at random]" would cause an I6 compilation error. This was another very popular one. Bug fixed whereby "try" with an action which applies to a topic would not work if applied to a snippet variable, so, for instance, try asking Bob about the topic understood; would fail. Bug fixed whereby large rulebooks would in some cases misfile rules which depended on a single action _not_ being the current one, such as: Before doing something other than examining to the mercenary: ... (While this was a serious bug, it occurred only rarely, depending on complicated combinations of other rules also being in force.) Bugs fixed to do with table columns holding indexed text, so that some attempts to look for corresponding values, or to search for values, or to copy a non-blank value into a blank, would fail with spurious run-time problem messages. Bug fixed whereby sections replacing those in extensions: Section 1 - New foo (in place of Section 1 - Foo in Bar by Tina Banana) were not in fact always doing so in 5T18; and relatedly, when such heading tricks were used, were sometimes causing source text to be lost from the main text, resulting in spurious problem messages complaining that no room had been created. (It had, but in a sentence wrongly removed.) Bug fixed whereby paragraph spacing would go wrong - usually with the expected gap between paragraphs going missing - in cases where a text substitution is defined which itself includes a "[paragraph break]" substitution. For instance, redefining: To say p -- running on: say paragraph break. ought to give "[p]" exactly the same effect as "[paragraph break]", but in 5T18 the spacing after "[p]" would in some cases go missing. Bug fixed whereby "resume the game", a phrase to be used in the "when play ends" rulebook to cause it not to end but to carry on after all, had stopped working. Particular apologies for this: we hadn't realised that nothing in the 5T18 test suite verified its behaviour. Bug fixed whereby the "carrying capacity" for a container or supporter could not be read without run-time problem messages if it was not set explicitly in the source text. (It should have, and now does, default to 100.) Bug fixed whereby a container called "sack" would sometimes wrongly be treated as if it were a player's holdall, if it were carried alongside a genuine player's holdall. Bug fixed whereby a rule depending on something having happened for a small number of times only would not always apply if the action is silent, e.g., Instead of taking the top hat less than three times: say "The top hat resists!" ...would fail to apply if the top hat were being taken silently as a result of a command like WEAR HAT. (Apologies: this bug was introduced inadvertently as part of a bug fix made in 5T18, and did not occur in earlier builds.) Bug fixed whereby the Standard Rules read A door is never pushable between rooms. instead of A backdrop is never pushable between rooms. (Both are true. In 5T18, the sentence was given for doors twice and for backdrops not at all.) Bug fixed whereby the Standard Rules wrongly put the "switch the story transcript off rule" in the "carry out switching the story transcript on rulebook", not the one for "...off", so that in 5T18 the transcript once started couldn't be stopped. Bug fixed whereby table sorting might fail if the table contained consecutive blank rows within the body of non-blank rows. Bug fixed whereby the phrase let maximum score be a number; which fails because "maximum score" is already a global variable, so can't be a temporary one as well, would give both a problem message and also an internal error. It now just gives the problem message. Bug fixed whereby source text such as: The Lab is a room. The barrel is a vehicle in the Lab. Sir John is a man in the barrel. The player is Sir John. The player is in the barrel. would create a bogus "yourself" object in the barrel, other than Sir John. Bug fixed whereby Understand grammar using "[any ...]" would wrongly match all items within those specified, as well as the items themselves. For instance, "[any adjacent room]" would match not just the rooms, but also their contents. Apologies for this bug, which was introduced by accident in the template rewrite for 5T18. Bug fixed whereby rules depending on actions which involve the text of the player's command would sometimes throw internal errors if they also required the use of named "Understand" tokens which weren't used in any of the ordinary command verb grammar. For instance: Understand "i7" or "inform" or "inform 7" as "[inform]". After asking Edsger about "[inform]": say "Projects promoting programming in 'natural language' are intrinsically doomed to fail." Bug fixed whereby "does the player mean" rules would sometimes disambiguate the second noun of an action as if it were the first, in cases where the action uses "[things inside]" or "[other things]" as the first token (which the inserting action does, in particular). The documentation does warn that this might not work; it will now sometimes work, with care. Bug fixed whereby a table with a number but not a name (say, "Table 5") could not be referred to elsewhere in the source in the same form (e.g., "The utensils are defined by Table 5"). Bug fixed whereby "does the player mean" rules would not be applicable to going actions implied by commands consisting of a direction alone, such as SOUTH. Bug fixed whereby, in complicated circumstances, two ordinarily identical things are wrongly considered still identical even after one has changed its property value for a property declared as describing them. (But only where this property is inherited from a mutual kind, which in turn has other "Understand" grammar defining it.) Bug fixed whereby releasing a project with both a website and auxiliary files would produce links in the website which, though working for some browsers, failed for others, and which were local "file:" links rather than "http:", so that the result would not work when uploaded. Bug fixed whereby an UNDO which takes us back to a position where the player is in darkness would print the location as "(darkness object)" rather than running the appropriate activity to describe darkness. Bug fixed whereby "Use authorial modesty" did not always work when given in the main source text of a work by an author wanting to be modest about his own extensions, included from it. Bug fixed whereby negative values of literals would sometimes be printed incorrectly (e.g., "-10.123" might be printed "-10.00-123"). Bug fixed whereby in rare cases the text of previous commands might be mingled with the text of a literal value being read in the current command. Bug fixed whereby conditions for start and end of scenes would not properly work if they needed to manipulate indexed text, lists or stored actions, either throwing spurious problem messages or simply failing to match. Bug fixed whereby, similarly, conditions for start and end of scenes would throw spurious internal errors if they contained table lookups. Bug fixed whereby complex specifications of "in the presence of" people which involve callings or manipulate similarly complicated values would cause internal errors. Bug fixed whereby relations applied to kinds rather than instances would in some cases throw an internal error rather than generate a problem message as being too unspecific: A supporter usually allows sitting. Bug fixed whereby memory allocation would sometimes fail, in Glulx, when existing memory was sufficient but too fragmented to hold a large single block of data. Bug fixed whereby Inform would refuse to create "let" variables called "nd", "st" or "th". (Exercise for the reader: can you guess why?) Bug fixed whereby "Understand ... when ..." sentences would sometimes, if the condition was invalid, throw an internal error as well as a problem message. Bug fixed whereby the sentence Here is everywhere. would crash Inform rather than produce an outraged problem message. (Yes, somebody tried this.) Bug fixed whereby extension documentation would be wrongly punctuated around displayed example source text which contained explicit I6 inclusions, with a spurious "-)" to close the I6 inclusion, added at the wrong point. Bug fixed whereby spurious "details" icons appeared after the names of kinds in the Lexicon index. Bug fixed to do with the status line sometimes disappearing on the Z-machine. Bug fixed to do with cursor movements in unusual font sizes in v6 of the Z-machine. On Glulx works only, the "emphasised" type style now has the style hints weight 0 and oblique 1 set automatically when Glulx starts up: the point of this is that I7 uses this style to implement the text substitution "[italic type]". (Yes, yes, so the 5T18 change log made the same promise. But with any luck it will work this time.) EXAMPLES AND EXTENSIONS Examples: Added "Fabrication" to demonstrate the use of values which themselves have properties. Added "Bowler Hats and Baby Geese" to demonstrate the use of scenes with properties. Added "Elsie" to demonstrate a sliding door that closes automatically after being open for one turn. Added "Versailles" to demonstrate a mirror the player can look into. Added "Pizza Prince" to demonstrate a near-infinite supply from which the player can go on taking instances. Added "Extra Supplies" to demonstrate a supply from which the player can take one instance at a time. Added "North by Northwest" to demonstrate compass directions between the usual set, and how to deal with the nine-character limit on names. Added "The World of Charles S. Roberts" to demonstrate a hexagonal direction system. Modified "Copper River", "One Short Plank", "Mr. Burns' Repast", "Yolk of Gold", "Depth", and "Xylan" to use the new "there is..." syntax in places where the old syntax seemed a bit stilted. Modified "Solitude" to correct some errors in the comments caused by an over-zealous search and replace when truth states were introduced. Modified "Copper River" to list all objects explicitly while taking inventory, even if they are otherwise referred to as "assorted dull items". Modified "Bumping into Walls" to get rid of some inelegant grammar in the definition of viable directions, which is no longer necessary because of syntax improvements. Rewrote "Fore" completely to take advantage of new direction-defining abilities, rather than presenting the rather hackish methodology originally on offer. Extensions: "Glulx Text Effects" updated to deal with an indentation bug. The version number is now 3. "Glulx Entry Points" updated to handle a bug introduced by the treatment of templates. The version number is now 6. "Locksmith" edited to bring conditional syntax in line with the new Pythonesque standard, and (more importantly) to give explicit names to a couple of rules that still lacked them. Version number is now 7. Recipe Book: Expanded the contents of the section on ending the game to lay out more of the ways in which the final text can be altered. 5T18 (30 April 2008) This build is founded on a major reform of the infrastructure supporting Inform. It contains miscellaneous new features to complete the work of implementing the less speculative proposals planned in the January 2007 consultation document. (A second consultation document will be published later this year to lay out future plans.) The interface application contains a new Source view for OS X which should handle large projects much better: it will follow on other platforms in subsequent builds. The first steps are made towards an official system for translating I7 into languages of play other than English, something which has previously been done but only with great difficulty. Certain run-time algorithms have been optimised for speed, and all 162 bug reports received up to 26 April 2008 have been closed out. INFORM FOR MAC OS X The Source panel is now divided into two side-by-side views: Contents and Source. These are alongside each other, but only one is visible at a time, and each slides out of the way to make room for the other as needed. The Contents view shows a contents page for the source text, automatically generated from its headings. A slider can be used to control how much detail is shown. Clicking any heading slides back into the contents view, but showing only the material under that heading (and its subheadings, if any). This makes very large source texts much more manageable, and also provides a useful overview of an entire project. INFORM FOR WINDOWS The Contents view has also been partially implemented on Windows. On selecting this pane from the source tab, a window slides in from the left showing some or all of the headings in the source, depending on the slider at the bottom of the window. Clicking on a heading causes the contents pane to slide back and the source tab to jump to the chosen heading. A spell checker has been added, using the "hunspell" project from OpenOffice.org. Only words that will appear as text in the game are checked. Currently this is accessed through the new "Check Spelling" Edit menu item: checking spelling as the user types will be implemented later. Copying tables from the documentation to the source tab via the clipboard or through drag and drop should now work correctly: the table will be pasted with tabs rather than spaces between columns. If the registry DWORD value "HKCU\Software\David Kinder\Inform\Window\Watch File Changes" exists and is set to zero, then the application will not notify the user if the "source.ni" file is changed by another program. INFORM FOR LINUX The long-awaited Skein tab has been added to the GNOME application; all features that are relevant without an accompanying Transcript tab are fully-functional. The Game tab now runs Glulxe 0.4.3. GtkSourceView 2.0 adopted, which means several fixes for the syntax highlighting. Thanks to Zachary Amsden for submitting a patch which did much of the work. - Most importantly, nested comments are now highlighted correctly. - Inform 6 code is highlighted as in the OS X application. - Words like "if" and "otherwise" are no longer highlighted burgundy. - Syntax highlighting in general should be somewhat faster. Fixed various, minor bugs, some of which were tracked down and patched by Alan De Smet and Jonathan Liu. Jonathan Liu has contributed a package for Arch Linux i686. IF, REPEAT, WHILE The preferred syntax for "if", "repeat" and "while" phrases has been changed to a Python-style format using colons ":" and indentation to mark that lines in the definition of a phrase or rule are being grouped together. This implements most of proposal (6.22) from the January 2007 consultation document. For instance, what was previously written thus: ... if the actor is holding a player's holdall (called the sack) begin; let the transferred item be nothing; repeat with the possible item running through things carried by the actor begin; if the possible item is not lit and the possible item is not the sack, let the transferred item be the possible item; end repeat; ... end if; can now be written thus: ... if the actor is holding a player's holdall (called the sack): let the transferred item be nothing; repeat with the possible item running through things carried by the actor: if the possible item is not lit and the possible item is not the sack, let the transferred item be the possible item; ... We believe this is more consistent with the shape of definitions as a whole, which also take the form "preamble: item 1; item 2; ..." It also seems much closer to how books or newspapers represent lists of instructions or recipes, for instance. The new syntax is now used in Inform's documentation and examples. We think it's clearer and more logical, though groups of the kind shown above are surprisingly uncommon in I7 source text, because so much which would need a loop in another programming language is done implicitly in I7. (There are fewer than 600 grouped phrases in the entire Inform documentation, an average of only 1.5 per example.) But the new syntax is _not_ compulsory. Each individual phrase or rule can be written to use either the old syntax or the new syntax (but not both in the course of the same definition). Thus, there is no need to change any existing source text - it will all compile exactly as before. Going over to the new syntax is entirely optional, and there is no intention at present to withdraw the old one. A few notes about the arrangements: - A rule or phrase using "new" syntax is required to start each phrase of the definition on a new line. (But phrases are allowed to be longer than a single line, and can wrap in any way the author wants: see the "repeat with..." phrase above for an example.) - Indentation must be made with a sequence of tab characters; spaces are ignored (as they already are with table columns). - Indentation must begin on tab stop 1, i.e., one tab stop in from the left margin, and must advance by a single tab stop for each block which begins after an "if", "repeat" or "while". - Indentation must not exceed 9 tab stops. - An "otherwise" or "otherwise if ..." clause in an "if" should be given the same indentation as the "if" it belongs to. For instance, if the yellow door is open: now the duckling is happy; otherwise if the red door is open: now the duckling is sad; otherwise: now the duckling is ambivalent. A new form of "if" provides a form of switch statement: this is only allowed in the "new" syntax above. For example: if N is: -- 1: say "1."; -- 2: say "2."; -- otherwise: say "Else."; if the dangerous item is: -- the electric hairbrush: say "Mind your head."; -- the silver spoon: say "Steer clear of the cutlery drawer." This implements proposal (6.22c) from the January 2007 consultation document, though with slightly different punctuation syntax. Finally on "if": in every form except that last one, "unless" can now be used in place of "if" and with the same effect except that the sense of the condition is reversed. For instance: unless N is 3, say "N is not 3."; unless the yellow door is open: now the duckling is happy; otherwise unless the red door is locked: now the duckling is sad; otherwise: say "The yellow door is closed and the red one unlocked."; If written in old-style syntax, "unless" should be ended with "end unless", not "end if". This implements proposal (6.24) from the January 2007 consultation document. Inside "repeat" and "while" loops, the new phrases "next" and "break" can be used to go directly to the next iteration, and to exit the loop immediately, respectively. ("Next" is called "continue" in a fair number of programming languages, and Inform issues a specific problem message to help people who forget this.) Thus: repeat with X running from 1 to 10: if X is 4, next; say "[X] "; if X is 7, break; prints the text "1 2 3 5 6 7". This implements proposal (6.23) from the January 2007 consultation document. The text substitution "[unless ...]" means the same as "[if ...]" but with the sense reversed, paralleling the use of "unless" and "if" as phrases. The text substitutions "[otherwise]" and "[otherwise if...]", for use within "[if]...[end if]", can now be written "[else]" and "[else if...]": this is to be consistent, since "otherwise" can be written "else" in regular code too. UNDERSTANDING When an item or room is created, Inform automatically makes its name something the player can type to refer to it. For instance, The Wabe is a room. The blue peacock and the sundial are in the Wabe. means that the player can type EXAMINE BLUE PEACOCK or PUSH SUNDIAL or SHOWME WABE, and so on. This is almost always a good thing, but a nuisance if something's true identity is not known to the player. So: The secret document is a privately-named thing in the drawer. The printed name of the secret document is "[if the secret document is handled]secret document[otherwise]dusty paper". Understand "dusty" and "paper" as the secret document. Understand "secret" and "document" as the secret document when the secret document is handled. After taking the secret document for the first time: say "Heavens! It is the secret document!" ...uses the new property "privately-named" to make the secret document something whose name is only what Understand... explicitly says: the name it happens to have in the source text is ignored. (Privately-named is a property which affects how Inform creates the object, and it can't be given or taken away during play.) When a kind is created, and the source text constructs multiple duplicate items of that kind, Inform generates a plural of the kind's name in order to understand commands referring to these multiples. For instance, given... The Lake is a room. A duck is a kind of animal. Four ducks are in the Lake. ...the player can type TAKE DUCKS to try to pick up all four. It is now also possible to teach Inform new plural forms of name. For instance: Understand "birds" and "ruddy ducks" as the plural of duck. Now TAKE BIRDS and TAKE DUCKS are equivalent. Plurals can even, strange as it may seem, be given for single things: The magpie is in the Lake. Understand "birds" as the plural of the magpie. Now TAKE BIRDS tries to take all four ducks and the magpie too. This implements proposal (6.49) from the January 2007 consultation document. When Inform receives a command like TAKE ALL, it forms up a list of the eligible objects and then generates actions for each in turn. This can now be inspected and changed. For instance, let L be the multiple object list; sets L to this list. (If there is no multiple object, say if the command was TAKE PEAR, the list will be empty: it won't be a list of size 1.) Correspondingly, we can set it: alter the multiple object list to L; Of course if Inform is already working through the actions, it is too late cleanly to change this list, but the following... The magic rule is listed before the generate action rule in the turn sequence rules. A¬†thing has a number called dramatic potential. This is the magic rule: let L be the multiple object list; if the number of entries in L is greater than 1: sort L in dramatic potential order; alter the multiple object list to L. ...does a little rearrangement after the parser has finished but before actions have started to be generated. The meaning of the phrase place X in scope used to depend on whether X was a room or not: for rooms, only the contents would be put in scope, and not X itself. This meant there was no way to put the actual names of rooms in scope, and was in any case an unnecessary complication. As from this build, the following possibilities: place X in scope place X in scope, but not its contents place the contents of X in scope do what they appear to suggest, whether X is a room or not. (If X is a room, the new "place the contents of X in scope" does exactly what the old "place X in scope" did, so it should be easy to correct existing source text if necessary - but e.g. in the Inform examples we didn't need to make any corrections at all.) The "printing a parser error" activity can now override a further parser error, like so: Rule for printing a parser error when parser error is noun did not make sense in that context: say "If you must use 'any thing', you deserve all you get." instead. This error message appears only when an "[any ...]" token failing is the most interesting error the parser can generate, and several users have noticed that up to now there's been no way to rephrase it. TABLES Tables can now have amendments as well as continuations. That is, just as one can already write Table of Semi-Precious Minerals (continued) to add extra rows to an existing table, one can now also write: Table of Semi-Precious Minerals (amended) to change those rows. The amended table must have exactly the columns of the original and in the same order. Moreover, each row in the amended table must match exactly one row in the original. For instance: Table of Plans moment outcome 10 AM "takeover of Mars" 11:30 AM "canals reflooded" 11:45 AM "chocolate bar production doubled" Table of Plans (amended) moment outcome 11:45 AM "volcanic cave production doubled" creates a three-row Table of Plans, with reference to the chocolate bars struck out. Amendment rows may be given in any order. The process of matching a row begins at the left-most column: Inform tries to see if any single row in the original table has a matching entry. If none do, a Problem is issued. If more than one do, Inform then looks at the second column, and so on. Thus: Enthusiasm is a kind of value. The enthusiasms are pumped, wired and languid. Table of Mental States feeling extent consequence pumped 1 "you feel able to run for your life" pumped 2 "you feel able to run for President" wired 1 "you feel able to run" languid 1 "you feel" Table of Mental States (amended) feeling extent consequence pumped 2 "you feel able to run for the Nebraska State Legislature" ...the amendment here is made to the second row of the original table. For the present, at least, the columns used for matching may only contain: numbers, times, objects, action names, activities, figure names, sound names, truth states and any new kinds of value or units which have been declared. FAST ROUTE-FINDING The ability to find routes through the map, and other relations, makes it possible to write quite sophisticated conditions concisely: but these sometimes run slowly, because they call for large amounts of computation. Two especially bad cases are provided by having dozens of characters constantly route-finding through the map in order to meander about; and having dozens of articles of clothing all partially revealing each other, overlying and underlying, so that it becomes a complicated matter to establish what can be worn on top of what else. For finding routes in the map, there are now two use options: Use fast route-finding. Use slow route-finding. This chooses between two algorithms, neither of which is best in all cases. If neither is specified, "fast" is used on the Glulx VM, and "slow" on the Z-machine. In general, "fast" is very much faster if there is a large map in which frequent route-finding goes on; but it comes at a sufficient memory cost that, for a large map, it won't be able to fit into the Z-machine, which is very short of memory. On Glulx projects, memory is only an issue if we mind that the story file and saved games will be a little larger, which could just possibly matter for very small mobile devices. "Slow" is the same algorithm used in previous builds of Inform, and it has very low memory overheads: for many maps, especially fairly small ones, and where route-finding is only an occasional need, it is not detectably slower than "fast". (For those interested, "slow" is a variation on Prim's minimal spanning tree algorithm, while "fast" is a form of the Floyd-Warshall algorithm.) For finding routes through relations, the same two options are available, but because we tend to create many relations which never use route-finding the default is always "slow". To make route-finding for a given relation "fast", we have to declare it that way: Overlying relates various garments to various garments with fast route-finding. Overlapping relates various garments to each other with fast route-finding. (For instance, changing the "overlying" and "underlying" relations in the example "What Not To Wear" to "fast" enormously improves performance when there are large wardrobes to choose from.) The "with fast route-finding" note can only be added to various-to-various relations: although route-finding through various-to-one and one-to-various relations is fully supported, it exploits the relative simplicity of these problems to use a more efficient algorithm than either the "fast" or "slow" ones described above. EXTENSIONS Up to now, extensions have had filenames without a dot "." followed by trailing text identifying their file type (i.e., without a "filename extension", to use a completely different meaning of the word). There are some merits to this, but the demerits have won out. Inform now recognises the suffix ".i7x" (read: "I7 extension") for these filenames, and we will gradually move to this form for files downloaded from the website. Headings can now provide source text to be used if a given extension is included in the current run; or alternatively, if it isn't. For instance: Chapter 2a (for use with Locksmith by Emily Short) specifies that everything under this heading (and its subheadings, if any) will be ignored unless the extension Locksmith by Emily Short is included. Conversely, Chapter 2b (for use without Locksmith by Emily Short) will be ignored unless it isn't included. This allows extension writers to give variant implementations depending on what other extensions are in use. Headings can also replace portions of extensions which have been included. For instance: Section 6 - Hacked locking (in place of Section 1 - Regular locking in Locksmith by Emily Short) places the source text under the new heading in the place of the old (which is thrown away). If there should be two or more headings of the same name in the given extension, the first is the one replaced; if two or more headings attempt to replace the same heading in the given extension, the final attempt in source text order is the one which succeeds; and finally, heading dependencies like the above are scanned in a top-down way. Thus, if we have Chapter 2a (for use with Locksmith by Emily Short) ... Section 1 - Hacked marbles (in place of Section 4 in Marbles by Peter Wong) ... and we don't include Locksmith, then the replacement of Section 4 of Marbles is not made, because Section 1 - Hacked marbles is subordinate to the Chapter 2a heading which we've told Inform to ignore. The extensions machinery has been made more robust, fixing a number of obscure bugs not actually experienced in practice by any users, and changing existing conventions as follows: - It is now possible for an extension to contain accented characters in author name and title: thus, Include √âtude Pour La F√™netre by Fran√ßoise Gau√ü. should work. (Accents are removed for console output; the file of the extension must have the actual name it claims, as with any other extension.) - The word "and" is permitted in the title of an extension. - The maximum lengths of extension title and author name, previously 31 characters each, have been raised to 50 characters each: but these are now more rigorously checked. (Previously, an extension breaking these limits would work on some platforms but not others: it would produce installation error messages on the Extensions documentation page, but these were easy to overlook by accident. An extension with overlong title or author name will now produce a Problem message when included.) - It is now possible to give an optional line of additional credits for an extension, so that collaborators or earlier versions can get a name-check. For instance: Version 1 of Banana and Mango Peeling by Jesse McGrew begins here. "Allows banana splits." "based on War and Peace by Leo Tolstoy, translated by Donald Rumsfeld" This last paragraph is the optional extra, which we suggest can be used in cases where, for instance, old I6 code has been wrapped up in new form - this is where to say who wrote the original. - Installation errors are now more prominently displayed on the Extensions documentation page. - Problem messages added and improved for checking that 'begins here' and 'ends here' sentences for extensions being used are correct. (Checking of 'ends here' sentences, in particular, was very lax previously because of a bug in the extension manager: apologies for this, because it means there are now a few extensions in circulation which have improperly written 'ends here' sentences, but which are otherwise correct, and will now be rejected. But the corrections needed will be very simple.) MINOR NEW FEATURES It is now possible to define two different versions of the same text substitution, one in which the first letter is capitalised, the other in which it is lower case: these then have different meanings. (Inform already did this where the first word was The, A or An, and used this so that "[the noun]" had a different effect from "[The noun]": what is new is that the same rule now applies to any first word.) When lists of objects are printed with the text substitution "[list of ...]" (for instance, "[list of open containers]") such lists are now always grouped and printed using plurals. (In previous builds, they would be if the objects involved were all inside or on top of a given parent object, but not otherwise. It's arguable that this is a bug fix rather than a new feature.) The substitution "[A list of ...]" now capitalises the first indefinite article in the list, just as "[The list of ...]" does for the first definite one. (This was something we forgot to implement, and the fact that it wasn't there was reported as a bug, but properly speaking it was a missing feature before and is a new one now.) A backdrop can now be dynamically moved to any set of rooms. For instance, suppose rooms have the either/or property "wet", and that "stream" is a backdrop. Then - When play begins: move the stream backdrop to all wet rooms. - sets the stream to be present in any wet room, and of course absent in any dry one. The form of words: move the ... backdrop to all ... is deliberately meant to look unlike the simpler ways to move things, to emphasise that this is possible only for backdrops. The stream's position is ordinarily checked only after movements, for efficiency's sake. So if the player is in a room which suddenly changes from dry to wet, the stream will not magically appear (though it will be there if the player goes out and comes in again). If this is not good enough, the phrase "update backdrop positions" can be used to ensure the accuracy of all backdrop locations after a dramatic change - Instead of pulling the lever: now the Cave is wet; remove the lever from play; update backdrop positions; say "The old rusty lever pulls away, and the thin cave wall goes with it, so that a stream bursts into the cave." This implements proposal (6.54) from the January 2007 consultation document. When creating new verbs or prepositions, the word "reversed" can be used to reverse the sense of a relation. For instance, The verb to be embedded in implies the reverse incorporation relation. The word "nothing" can now, in simple ways at least, be used in conditions to mean the non-existence of something. For instance - if nothing is in the box, say "Nothing is in the box."; if the box contains nothing, say "Nothing is in the box."; An exception is made for "is" alone, that is, for testing equality: otherwise if X is nothing, ... would mean "if there is no thing that is equal to X" The verb "to incorporate" has been added to the built-in stock; that is, the following is now part of the Standard Rules: The verb to incorporate (he incorporates, they incorporate, he incorporated, it is incorporated, he is incorporating) implies the incorporation relation. Thus X incorporates Y if and only if Y is a part of X. It was slightly anomalous that no such built-in verb existed already (analogous to "to contain" and "to support"), and several extension-writers have found it a useful linguistic device and had to define it themselves. A new activity "printing the announcement of light" has been added, in parallel with "printing the announcement of darkness". The assertion-maker has been slightly improved, so that relative clauses like the one in the third sentence here work (rather than producing problem messages): A person can be asleep or awake. The Spinning Tower is a room. Sleeping Beauty is a woman who is asleep in the Spinning Tower. Test scripts (for TEST) can now contain exotic characters, and follow the same apostrophe conventions as other text: thus ' becomes " except where used as a contraction, but ['] forces a genuine single quote. On Glulx works only, the "emphasised" type style now has the style hints weight 0 and oblique 1 set automatically when Glulx starts up: the point of this is that I7 uses this style to implement the text substitution "[italic type]". The new activity "printing a number of" activity allows customisation of the entries in lists which give a number of duplicate objects. For instance, Rule for printing a number of blocks when the listing group size is 3: say "all three blocks". In both this activity and also the existing "grouping together" activity, the number variable "listing group size" contains what it says. This implements proposal (6.44) from the January 2007 consultation document. It has always been possible to test the (most recent) outcome of a scene, if it's a scene which has named possible endings, as here: Hindenburg Ride is a scene. Hindenburg Ride begins when play begins. Hindenburg Ride ends disastrously when a random chance of 1 in 7 succeeds. We can test what happened thus: if Hindenburg Ride ended disastrously, ... We can now also test what didn't happen: if Hindenburg Ride did not end disastrously, ... Note that this is true only when the scene has ended, but ended differently. In the definition of a phrase which has options, the name of an option can be used as a condition: now, "not" followed by the name of an option can also be used as a condition, testing the obvious thing. Thus: To hunt the wumpus, fiendishly: if fiendishly, say "Hunting fiendishly."; if not fiendishly, say "Hunting normally." ...prints one of these two texts, according to whether the "fiendishly" option is set, i.e., according to which of these is used: hunt the wumpus; hunt the wumpus, fiendishly; The (+ ... +) construction for using I7 source text within an I7 inclusion (or within a template file - see below) now allows an adjective name to be given, and translates it to the name of the I6 routine testing that adjective. A new feature so minor that with any luck nobody will notice or make use of it. I7 has a global variable called "the container in question", used in reaching inside and reaching outside rules to mean the barrier being reached through. A much nicer way to do this is: Rule for reaching inside a container (called the barrier): ... where one then calls it "barrier". The only reason that "the container in question" exists is because reaching rules go back to the very early days of I7, before the "called" mechanism exists. Well: the new feature is that a parallel "supporter in question" now also exists, because it's illogical to have the one without the other, and its absence was reported as a bug. But please don't use either. EXAMPLES Recipe Book: "Varying What Is Read" revised to account for many more types of parsing issue. Three new sections, "Designing New Commands", "Writing New Commands", and "Modifying Existing Commands" added at the beginning of the Commands chapter. These are meant to help people find technical features scattered throughout Writing with Inform, and also to offer some design guidance. "Modifying Existing Commands" tries to avoid overlap with the guidelines in the Advanced Action chapter and instead exists to point readers to the resources there and also in the Activities and Rulebooks chapters. "Looking" substantially revised to reflect new behavior. "Actions on Multiple Objects" added to the Commands chapter. "The Flow of Conversation" added to the Other Characters chapter to offer some general guidance about drafting conversation. Examples: Added "Escape from the Seraglio" to demonstrate a way to vary printing of text such as "grapes: ..." when acting on multiple items at once. Added "The Left Hand of Autumn" to demonstrate printing more sophisticated descriptions of multiple objects when all are examined at once. Added "Noisemaking" to demonstrate adding a new stage to action processing, during which other characters can observe and react to what the player has done. Added "Delicious, Delicious Rocks" to demonstrate adding a new stage to action processing, during which the player's action is sanity-checked before any implicit takes, etc., are generated."" Added "Provenance Unknown" to demonstrate how PUSH TELEVISION WEST might be converted to pushing the cart on which the television rests. Added "Low Light" to demonstrate an object that is visible and manipulable only when a bright light source is on. Added "Kiwi" to demonstrate a kind of shelf whose contents can only be seen if the player is standing on something. Added "Jamaica 1688" to demonstrate how to modify the final question of the game. Added "Trieste" added as a simple test and demonstration of table amendments. Added "Formicidae" added to demonstrate changing the order of the multiple object list. Added "WXPQ" added to demonstrate replacing the "That noun doesn't make sense in this context." parser error. Added "Copper River" added to demonstrate the idea of "interesting" and "dull" objects: the game determines which items are currently important to the puzzles or narrative and mentions those in the room description, while suppressing everything else. Added "Priority Lab" added to offer a sandbox for trying out priority ordering in room descriptions, and some debugging tools. Added "Casino Banal" added to demonstrate more advanced uses of priority ordering. Added "Zorb" to demonstrate making some changes to the circumstances in which the player can push objects between rooms. Added "Vouvray" to demonstrate plural names at the beginning of the Kinds chapter. Added "Prolegomena" to demonstrate the printing a number... activity. Added "Quiz Show" to demonstrate asking open-ended questions of the player, which can be answered only on the subsequent turn. Added "Orange Cones" to demonstrate moving backdrops to conditionally-specified rooms. Changes to "Alias", "Air Conditioning is Standard", "A Haughty Spirit", and "Dinner is Served" to reflect new strictness about properties such as enterable and transparent. (These were all effectively minor bugs that had previously gone unnoticed.) Changes to "What Not To Wear", to reflect new strictness and to make some running speed improvements. More speed improvements are necessary. Change to "Pink and Blue" so that it works under Glulx as well as on the Z-machine. "Second Oldest" corrected for a typo in the middle initial of Dennis Jerz. "Frizz" adjusted so that instead of laboriously putting the wet and dry glove rules into various rulebooks, it now more elegantly creates a "post-check" rulebook between the check and carry out phases, and relies on that. "Equipment List" modified to remove a bug in the divided-wide style of inventory listing. "Switch" modified to demonstrate an actual switch statement now that one is available (but still to show how the same thing can be accomplished with otherwise if... or with a table of alternates) Updated "Instant EXAMINE and LOOK" into a playable example, now called "Timeless", with modifications reflecting the new action sequence rules. "Patient Zero" revised to remove several bugs to do with exit descriptions and nondescript item listing. "DIAGNOSE command" converted to a complete, runnable example (now called "Red Cross"). "Responding to questions starting with WHO, WHAT, etc." converted to a complete, runnable example (now called "Query") "Examining everything at once" converted to a complete, runnable example (now called "Beekeeper's Apprentice"). "Hotel Stechelberg" converted to a complete, runnable example. "Replacing standard action report rules" converted to a complete, runnable example (now called "We"). "Laura" slightly updated to mention the privately-named feature and to mention some of the more advanced parsing features that can be found in the Understanding chapter. "Puff of Orange Smoke" updated to use the privately-named feature. "Verbosity" edited to mention the syntax for checking current verbosity levels during play. "First Name Basis" adjusted to demonstrate plural names for a kind. Adjustments made to "Money for Nothing", "Bic", "Chronic Hinting Syndrome", "Dubai", "Patient Zero", "Bribery", "Search and Seizure", "Lakeside Living", "Lemonade", "Modern Conveniences", "Trying Taking Manhattan", "Rock Garden", "Otranto", "Savannah", "Stately Gardens", "Tilt 2", "Tilt 3", "Thirst 2", and "Noisy Cricket" to clean up code using "unless". EXTENSIONS "Standard Rules" advanced to version 2: see below. "Locksmith" edited to make it easier to change the output text; version number advanced to 6. "Plurality" advanced to version 6, and a bug fixed whereby is-are did not print the correct output in the case where the object was the player. SOURCE PUBLICATION Internally, Inform is written according to the "literate programming" dogma of Donald Knuth, which means that its programs are written in such a way that they can be both executed by computers and also read by human readers. We intend to publish the entire source (online) in the course of Inform's 15th anniversary year, 2008. The result is likely to make a roughly 2000pp book, though of course a reference book rather than something anyone will want to read cover to cover. This build sees the first step, with publication on the Inform website of drafts of Appendices A and B - the Standard Rules (A) and the Template (B) - which between them contain the most interesting 600pp of the material for people interested in modifying the internal workings of Inform. INTERNAL REFORMS The Standard Rules have been revised throughout: they are now more logically constructed, easier to read and better presented (for instance, in the Phrasebook index, which has a slightly new look). They advance formally to version 2. While much altered internally, they are almost exactly the same from the user's point of view, except that: - The property "inventory listing" for things has been withdrawn. (A fossil from the days of Inform 6: in I7's more rule-oriented way of looking at things, gadgets like this one are more an obstruction than a help, and it was striking that not one of the hundreds of examples ever used this property. And users often found it misleading that the property didn't play well with the activity "printing the name of something".) - The either/or property "transparent/opaque" is now a property only of containers, not of all things. (It only ever had any effect for containers anyway, and for some things it makes no good sense - a transparent animal is perhaps a jellyfish, but a transparent man, in the non-metaphorical sense?) - The either/or property "enterable" is now a property only of containers and supporters. (Again, it did nothing for any other things before.) - An action which fails because the player is in darkness, and it needs light, is now deemed to fail the "basic visibility rule", not the "can't act in the dark rule". (This brings it into line with the "basic accessibility rule", which is given as the reason for failure when the actor cannot touch something which is required to be in reach.) - The somewhat vaguely named "non-player character action rule" is now called the "requested actions require persuasion rule". - Implicit taking has been reformed: in past builds, the implementation of the taking action looked as if implicit takes were unlike ordinary actions, but this wasn't really so. The action variable "thing implicitly taken" has been abolished, and so have the following three rules: standard set taking variables rule avoid unnecessary implicit taking rule don't report successful implicit takes rule Four obscure variant syntaxes, intended primarily for use by the Standard Rules, have been combined into one. The following examples show the change: Open translates into Inform as open. --> The open property translates into I6 as "open". The I6 library object name of yourself is "selfobj". --> The yourself object translates into I6 as "selfobj". The adjust light rule corresponds to routine ADJUST_LIGHT_R. --> The adjust light rule translates into I6 as "ADJUST_LIGHT_R". Quitting the game is an action corresponding to Quit, out of world and applying to nothing. --> Quitting the game is an action, out of world and applying to nothing. The quitting the game action translates into I6 as "Quit". In addition, one can now write: The whatever variable translates into I6 as "whtvr". which was not previously possible to specify. Problem messages have been added to defend this combination verb better against malformed requests, though it is still intended only for low-level extensions. (As a result, "to correspond" is no longer reserved and people can define this as a verb of their own now; "to translate", of course, is still reserved. The "I6 library object name" property has been abolished. Old-style tabular action definitions, in terms of lists of I6 routine names, have also been withdrawn.) I7 projects no longer use the old I6 library: for fifteen years now, every story file made by Inform has included "Parser.h", "VerbLib.h" and "Grammar.h", but no longer. This is not as momentous as it sounds. I7 began by using library 6/9, then adapted to 6/10 and 6/11, but it always required minor modifications, indicated the suffix "N": thus, the latest releases of I7 have used library 6/11N. This was intended for dual use by I6 and I7 projects, but I7's use of the library had become increasingly strained. In 5J39, library 6/11N contained around 400 conditional compilations causing it to produce different code when used by I6 and I7: in some cases, drastically different. Almost half of the lines in 6/11N were ignored by I7, as were many of the concepts and features familiar to I6 users. It seemed to the authors that 6/11N was living a lie: it wasn't really the same library when used by both systems, and the continuing pretence was only making the code more and more baroque. Its form was only holding back further development. In this new build, the material from 6/11N which was still in use has been moved into the "template layer", where it joins the other I6 code used by I7. This somewhat simplifies the I7 architecture. Library 6/11N is still included in the current build, for the benefit of anyone using it with purely I6 projects in the Inform 7 user interface. In any case much of the significant code in the I6 library lives on, almost unmodified, in a new home. "Parser.i6t" in the new template, for instance, is more or less the supposedly abandoned "parserm.h" from Library 6/11N. The template layer consists of a set of about 35 mainly short files, or "segments", with the extension ".i6t". Each segment has a name and is divided up into one or more named parts. This has enabled the Include (- ... -) syntax for inserting raw I6 code to be considerably strengthened. For instance - Include (- ... -) before "Flowers.i6t". Include (- ... -) instead of "Flowers.i6t". Include (- ... -) after "Rhizomes" in "Flowers.i6t". With these new forms of Include, the given I6 code can be placed before, instead of, or after any named segment or named part of a segment. - Multiple such inclusions can be made for the same segment or part, and if so, all will take effect; - Inclusions requested before, or after, a segment or part which has been replaced with "instead of" will take effect and appear before or after the code which appears instead of it. - The existing but deprecated syntax Include (- ... -) before the library. has been withdrawn; the new syntax Include (- ... -) after "Definitions.i6t". should have the same effect. - The existing (and still fine!) syntax Include (- ... -). is, for what it's worth, equivalent to Include (- ... -) after "I6 Inclusions" in "Output.i6t". - Template code can now use the same (+ ... +) notation to evaluate I7 expressions that inline definitions can; they also have access to a wide range of internal-use-only commands which shouldn't be used except in the built-in template files, but one command is safe to use: {-segment:NAME} places the whole of the template file NAME in this position. The file should be named as something like "MyStuff.i6t" -- it's a leafname, not a pathname -- and Inform looks for template files first in the subfolder "I6T" of a project's "Materials" folder, if that exists, and only then in its built-in stock. This means that (a) you can if you wish replace the built-in templates with your own, putting those in Materials/I6T, and (b) you can if you wish include chunks of I6 code generated by external utilities - Perl scripts, lex and yacc, etc. - by compiling those to suitable template files in Materials/I6T and then using an inclusion like Include (- {-segment:MyStuff.i6t} -). All this allows for fine control in modifying the template, though we hope that users won't go in for template modification much or often. The template layer is gradually being tidied up: an annotated version, explaining what each part does, will be published later this year. In the mean time, those who do hack the template are warned that they may need to alter their code to keep it working with future builds. One application of template layer hacking might be to provide extensions which translate the language of play. At present, I7 is not configurable enough to translate the language of writing, but as from this build it should be much more viable to translate the language of the story file. To demonstrate this, a new extension, "English by David Fisher", is built in. This extension implements English, and there's no need for anyone to include it in their story files since English is already the language of play by default: but it serves as a model which translators can imitate. It should be fairly straightforward to convert existing I6 language definition files into extensions following this model. The authors suggest that these could be named in the style "Language by Translator's Name" - say, "Latin by Adam Thornton". OPTIMISATION We would like to thank Jesse McGrew for writing a profiling version of the Z-machine interpreter dumb-frotz: a great help. (It appears, incidentally, that if dumb-frotz has a 3GHz Xeon CPU core to itself, it can interpret at around 13.5 MHz; a just-in-time compiler can manage 19.7 MHz, probably the world speed record for the Z-machine. Realistically, when interpreting the Z-machine over the next couple of years, we can expect about 10 MHz, but we should divide by about five to get likely speeds on portable devices such as the iPhone, with CPUs at about 600 MHz.) The running time of large rulebooks (with 16 or more rules) has been improved. The recent discussion on RAIF about before, instead or after rules being inefficient in large numbers - because these rulebooks become large - led us to investigate how large an effect this really was. The answer was that it wasn't as dramatic as some people had feared, but was well worth addressing: this shaved about 24% off the running time of "Bronze" played right through to a solution. (The representation of rulebooks is now such that there is very little or no possible speed advantage to moving a before/instead/after rule into the check/carry out/report rulebooks, so this shouldn't be a factor in deciding where to put rules in future.) As of this build, activity rulebooks are "processed" rather than "followed". This means that they do not run the procedural rules individually as fresh contexts for rules in their own right: instead, they remain subject to procedural rules applying to whatever larger thing is going on -- i.e., in almost all cases, the current action. This change made no difference to the behaviour of any test in the test suite, and removed a further 16% from the running time of "Bronze". (The change will not so significantly affect projects which don't use procedural rules, of course.) Miscellaneous other adjustments, such as replacing heavily-used veneer routines with hand-coded assembly language versions better aimed at likely I7 rather than I6 use cases, should save about 10% of running time on most projects. At the end of this period of optimisation, "Bronze" ran about 2.5 times faster than at the start, but this was an extreme case: most examples saw more modest improvements. MAINTENANCE Inform has been made more sensitive to the casing of prepositions. So, for instance, if the location is In Hallway, ... will now check to see if "location" is the room "In Hallway", rather than taking "is in" to be a reference to containment, because the capital I is suspicious. The "map region" property now exists for every room, even when there are no regions. (Its value is "nothing" if a room isn't in a region.) The point of this is to allow extensions which provide extra features for region-using works to compile. So, not quite a new feature, not quite a bug fix. The ancient I6 library reply: > PUSH SUNDIAL EAST Is that the best you can think of? has been reworded: > PUSH SUNDIAL EAST The sundial cannot be pushed from place to place. (The original message has too much of a narrative tone, particularly for modern IF, and most authors prefer a more neutral message.) Bug fixed whereby "if X can see Y" did not properly work if the player were in darkness. (Fixing this slightly changes the way we report a situation where the player is in an opaque container, without a light source, and asks someone outside the container to close it: we can now only witness that the container closes, and we don't actually see who closes it.) Bug fixed whereby if two phrase definitions have identical wordings, it would be the earlier whose definition was applied, not the later. (It ought to be the later, firstly because the documentation says so, and secondly because this enables definitions in the Standard Rules to be overridden more easily - because the SR are always read earlier than anything else.) Bug fixed whereby the rules [A] and [B] in the following would be regarded wrongly as being only equally specific: A flowerpot is a kind of thing. A flowerpot can be unbroken or broken. A Ming Vase is a kind of flowerpot. [Yes, I know, it isn't. Never mind.] Instead of attacking an unbroken flowerpot: ... [A] Instead of attacking an unbroken Ming Vase: ... [B] In fact, [B] is more specific and should therefore have priority over [A], because all Ming Vases are flowerpots but not vice versa, and this is now fixed. Bug fixed whereby a skipped line for a paragraph break would in some circumstances be omitted between subsequent paragraphs in a room description. Bug fixed whereby excessive skipped lines (two or three superfluous ones) would sometimes appear after out-of-world actions have reported. Bug fixed whereby action, activity and rulebook variables could not be used as text substitutions when supplied to phrases with indexed text arguments. Bug fixed whereby phrases with indexed text arguments would be unable to compile if they also required run-time disambiguation for other arguments, and would produce I6 errors instead. Bug fixed whereby use of indexed text which used text substitutions, but didn't print on screen, would sometimes nevertheless cause incorrect paragraph spacing in what was printed next. Bug fixed whereby constructing indexed text from other text, in a way which required use of text substitution, which itself needed to construct some indexed text, would produce garbled results. Bug fixed whereby using "exactly matches the text" would behave the same as "matches the text", that is, would not check the "exactly" part: this worked for regular expression matching, but not for plain text matching, because we forgot to implement this case. (Sorry. Of course, "exactly matches the text" means the same as "is", so people probably weren't convenienced too much.) Bug fixed whereby constant lists occurring in code, in works which otherwise contain no indexed texts, lists or stored actions, would fail to compile through I6. Bug fixed whereby abstract use of "...is listed in..." in source text which contains no actual lists would fail to compile through I6. Bug fixed whereby constant lists used in expressions other than assignments would not always have the correct contents. Bug fixed whereby constant lists used to initialise a "list of objects" would fail if the objects in question had a specific kind made explicit by other assertions. Bug fixed whereby constant lists of texts, when assigned to global variables, properties or table entries whose kind of value is "list of indexed text" rather than "list of text", would be incorrect. Bug fixed whereby constant lists of lists of numbers, where some of the numbers were negative, would have garbled contents. Bugs fixed whereby constant lists of text which included at least one text substitution in one of the texts would sometimes fail to compiled through I6, or else would produce odd results at run-time. Run time problem added for attempts to use "entry N of L", where L is a list and N is an index out of range. Bug fixed whereby changing a list to the empty list explicitly like so - now L is {}; ...would result in forgetting the kind of value stored in L if it were subsequently to be filled again, so that saying the contents might produce cryptic numbers instead of the proper values. Bug fixed whereby if X is listed in {1, 2, 3}, say "Hello."; would be misparsed because the commas inside the braces would be confused with the one outside. Bug fixed whereby a phrase to decide a list (or indexed text), but which depended on arguments requiring run-time type checking, would either fail to compile through I6 or (more rarely) produce bogus results. Bug fixed whereby use of lists, indexed text, stored actions, "(called ...)", or certain other unusual constructions, would fail to compile through I6 if they were made within "Definition:"s of adjectives or "when" conditions of relations or of "Understand ..." lines. Bug fixed whereby variables could not be declared to have kind "list of K that varies", where K is a either a kind of object (e.g. "list of rooms") or a new kind of value. Bug fixed whereby creating a kind called "link" would cause I6 errors. Bug fixed whereby type-checking would incorrectly allow The secret word is a text which varies. The secret word is "xyzzy". Before consulting the book about the secret word: say "Magic!" ...which should not be allowed because matching against variable text like this has to be done using indexed text, and can't be done by direct methods. (Type-checking did correctly allow this for constant text.) Bug fixed whereby type-checking would fail to find the correct interpretation of a "try ..." action, where the action applied to a value and the value was in turn calculated arithmetically, e.g. try hanging around until the time of day plus 6 minutes; where "hanging around until" is an action applying to a time. Bug fixed whereby type-checking would not properly be applied to relative clauses incorrectly applied to descriptions, so that repeat with X running through members of D who are male: would apparently work if D is a description that varies - but only because Inform is misreading "D who are male" as itself a description, which it isn't, because only a person can be male: a description can't. Bug fixed whereby type-checking would not correctly interpret, e.g., let the irrelevant fact be whether or not 1 is 3; as a new variable "irrelevant fact", and would instead overlay it on an existing one, the result being mayhem. Bug fixed whereby a "your former self" person would sometimes be picked up by, for instance, repeats through all people or lists of people in cases where the source text specifies a particular person as the player-character, so that no "yourself" object ought to exist. Bug fixed whereby the list-writer would not group together similar items into a numbered collection if they were people who were carrying things. Thus: A thug is a kind of person. A knife is a kind of thing. Every thug carries a knife. Five thugs are in the Alley. would report "You can see a thug, a thug, a thug, a thug and a thug here." Bug fixed whereby the text substitution "[the player's command]" would have too few words to it during an "after reading a command" rule taking place after the parser has asked a question like "Which do you mean, ...?"; and similarly where it would hold the word "again" or "g" rather than the command being repeated if the player had typed AGAIN or G. Bug fixed whereby matching the player's command against a topic would sometimes give wrong answers at the start of play, or after a very short command in the previous turn. Bug fixed whereby the parser will no longer say "You can only do that to something animate" if the supposedly animate object's name as typed wasn't recognised at all: it now says "You can't see any such thing." in the usual way. (This seems to have been a curiosity in I6 going back at least ten years.) Bug fixed whereby an implicit take (by someone else) generated by a requested action would fail to be recognised as another form of request. Bug fixed whereby an "instead" or sometimes also a "before" rule like this: Instead of an actor jumping: say "[The actor] prepares to leap." ...would sometimes be applied before the persuasion rules had decided whether or not the actor in question would even try. Bug fixed whereby a relation between two kinds of value which aren't objects would sometimes have its second term wrongly interpreted as an object just the same - for instance, Divisibility relates a number (called N) to a number (called M) when the remainder after dividing M by N is 0. - did not work because M was wrongly thought an object. It works now. Bug fixed whereby conditions containing fairly elaborate double-negatives would sometimes fail to compile, producing I6 errors: for instance, if no hat is not enclosed by a person, ... Bug fixed whereby run-time type checking was not properly defending relations between specific kinds of object, so that a condition would sometimes be misapplied to objects not of the that kind, resulting in spurious run-time problems (albeit only if the relation were being tested for objects to which it really doesn't apply). Run-time problems added for attempts to remove the player from play (a logical impossibility) or to remove doors from play (which would make a mess of the map), and for attempts to change the player to someone who has been removed from play. Bug fixed whereby, on Glulx, an attempt to expand the heap by dynamic memory allocation might fail if the current heap were completely full (i.e., with not even the smallest block of memory free): in some cases, a run-time hang would result. Bug fixed whereby the count of how many turns over which a category of actions has been happening would sometimes be wrong if the action qualified only when a certain condition held, which did not hold at the start of the action but did hold at the end. For instance, suppose we have: A thing can be examined or unexamined. Carry out examining something: now the noun is examined. After examining an examined thing for the third turn: say "Not again!" If the player types EXAMINE BOX, never having done so before, then this does not qualify as "examining an examined thing": but previous builds would have counted it towards the three turns needed for the rule to fire because, at the very end of the action, the description "examining an examined thing" would indeed match, the box by then having acquired the "examined" property. Bug fixed whereby the count of turns is not fooled by multiple actions in a single turn: suppose we have the rule Before taking for the third turn: say "Not again!" and suppose the player types TAKE ALL, picking up a dozen items. In previous builds, the rule would treat these as different turns, but now they are treated as the same turn. Bug fixed whereby "when" clauses in the preambles of rules for actions were not always allowed to see the action variables for the actions they belonged to: e.g., Check going when the room gone to is dark: ... would not compile even though "room gone to" is a variable belonging to the action "going", which owns the "check going" rulebook. A "when" clause for a rule can now see exactly the variables which the rule's definition can see. Bug fixed whereby "asking ... to ..." actions would not work in rules which counted them: for instance, Instead of asking Daphne to take the snack for the second time: ... would never fire. It now does; note that the count is of the number of times the action has been requested. If Daphne first takes the snack on her own initiative, and then the player asks her, that doesn't fire the rule. The count has further been reformed by ensuring that silent actions can never count towards the number of turns in such a rule; silent actions are never the main point of what is happening in a turn. Bug fixed whereby "[one of]...[or]...[in random order]" would fail on the Z-machine if there were 13 or more alternatives, and could cause spurious programming errors on Glulx. Bug fixed whereby making something a part of a door would in some cases cause a bogus problem message claiming to find two apparently unrelated sentences contradictory. Bug fixed (or, arguably, specification clarified) so that when one thing makes another, and the new item derives its name from the old, then a "printed name" for the original is transferred to the new. For instance: An oak tree is a kind of thing. Some leaves are a kind of thing. Some leaves are part of every oak tree. The printed name of an oak tree is usually "a mighty oak". Oak1 is an oak tree in Stage. ...now results in leaves called "a mighty oak's leaves", not "Oak1's leaves", because the printed name "a mighty oak" transfers from Oak1. Bug fixed whereby if a character were asked to do something with multiple objects (say with the command HELEN, GET ALL) then it would be assumed that agreement to perform the action with the first item would extend to the rest of the list, too. Persuasion rules are now properly checked for each item in the list in turn. Bug fixed whereby rules predicated on a list of two or more actions, where an action name before the last could be read as both a complete action name and also an abbreviation for a different one, would have both interpretations applied instead of only the complete one: for example, if actions called "franking" and "franking it with" both existed, then "Instead of franking or taking" would be misread as applying to any of the "franking", "franking it with" or "taking" actions - whereas "Instead of franking" and "Instead of taking or franking" would not be misread in this way. Bug fixed whereby the "in" would be misinterpreted if it occurred in the name of a rule being explicitly placed in a rulebook, as here: The new can't travel in what's not a vehicle rule is listed instead of the can't travel in what's not a vehicle rule in the check going rules. Bug fixed whereby some extension namespace clashes would fail to be reported correctly on the dictionary page where three or more different extensions all defined the same term. Bugs fixed whereby names with exotic ingredients such as ~, ^, @ would either be misprinted or misparsed, or both. Bug fixed whereby a "Definition:" would fail with an internal error if applied to just an "object" rather than a named kind such as "thing". For instance - Definition: An object is weaponlike if it is the knife. Bug fixed whereby "now X is P of Y", where X is a variable and P is a property whose kind is a unit with the same name, would sometimes wrongly try to set P for X as well even when X is a variable of kind P rather than an object having P as a property. On the Z-machine this produced a spurious programming error; on Glulx, it sometimes crashed. Bug fixed whereby asserting that a property is set to its own kind of value, rather than a specific value, would cause an internal error rather than produce a sensible problem message. Bug fixed whereby the use of a specific named object combined with adjectives, in a context where only the object is expected, might cause an internal error rather than issue a problem message. Bug fixed whereby paragraph breaks in the middle of phrase definitions would sometimes incorrectly be allowed, if the material just before the paragraph break ended in a semicolon. Bug fixed whereby the "does the player mean" rules did not properly work for requests made by the player for other people to do things. Bug fixed whereby making an assertion about a form of named construction (a type which is not a kind of value) would cause an internal error. For instance, A condition is usually true. Bug fixed whereby a "when" condition in a relation which makes a calling so as to refer to an earlier result to decide a later one, would produce I6 errors and fail to compile. Bugs fixed, or really, syntax clarified as to when qualifiers such as "always" and "usually" can be used in assertions: these are allowed on either side of the verb in most assertions, but not on both (for which a problem message has been added), and not in assertions admitting no doubt (such as "Looking is an action applying to nothing"). Previously Inform would silently allow, though ignore, some such usages. Similarly, "worn", "carried" and "here" can now only be used in assertions using the verb "to be". Similarly, "of", "from" and "and" now lose their grammatical meanings as introducers of clauses in assertions if they are unexpectedly written with an upper-case O, F or A, respectively. Thus On the shelf is Of Mice And Men and The Girl From Ipanema. places two objects on the shelf, with the obvious names, and doesn't get sidetracked into thinking the shelf contains (for instance) an item called "Of Mice" together with some "men". Bug fixed whereby optional clauses matched against action variables would sometimes not work for actions which apply to nothing. For instance, The jumping action has an object called the situation (matched as "at"). Instead of jumping at the Place, ... was not being recognised. Bug fixed whereby a rule like Check taking: say "You can't, because [if Fred is visible]Fred might see.[otherwise]I say so." instead. ...might only halt the action, as the "instead" implies, if the "otherwise" branch is taken through the text. Bug fixed - well, anyway, sensitivity improved - so that when a kind of value is defined with a table, the names of the possible values in column 1 are no longer so likely to cause namespace clashes with things or rooms defined elsewhere. Bug fixed whereby when a table is used to define a kind of value or a set of objects, a bracketed kind of value declaration in a table column name would not be recognised. (For instance, if a table column is headed "alpha (number)" then the name is "alpha" and the values have to be numbers.) Bug fixed whereby properties which are defined by column names in tables used to define objects (or values), for which the entry in row 1 happens to be text which has substitutions, would then only allow other texts with substitutions as values - not plain text. Bug fixed whereby giving a value as "object" in a table used to define objects would result in peculiar problem messages at best, and an internal error at worst. Bug fixed to do with writing tables containing numbers to files in projects using Glulx. Bug fixed whereby conditions based on actions would sometimes fail to compile with I6 errors if the actions involved items or people which were specified by local ("let" or "called") or global variables rather than named explicitly. Bug fixed whereby declared plurals (with "The plural of ... is ...") would only sometimes be used by room descriptions. Bug fixed whereby, contrary to the claim in Inform's problem messages, a Table could not be created which was named with a number alone ("Table 6"). Bug fixed whereby, if a room or thing existed whose name included a number (say, "Room 101"), then now X is a random number between 1 and 101; would sometimes be rejected as a compound condition for "now", because the "and" had been misinterpreted. Bug fixed whereby extension documentation would sometimes mis-space braces "{" and "}". Story files running on Glulx interpreters now properly check the "unicode" gestalt before trying to use Unicode character printing: such checks will only fail on old and now deprecated interpreters. Bug fixed whereby the Phrasebook index would be garbled if words in the lexicon includes the characters "<" or ">". Bug fixed whereby names containing "from" would sometimes have their original articles taken as part of the name itself: for instance, The telegram from Klaxor is in the Breakfast Nook. would produce a proper noun, "The telegram from Klaxor", rather than parsing it as "the" (definite article) + "telegram from Klaxor". (That this bug was not more widely felt is chiefly because another mechanism in Inform tended to compensate for it.) Bug fixed whereby "called" names were sometimes unable to contain the words "with" or "having": for instance, this failed - The golf ball is in a container called the flask and cap with flange. Bug fixed whereby consecutive articles would on rare occasions be allowed in noun phrases ("a the tree", say). Bug fixed whereby RESTORE would not always work as a reply to the final question ("Would you like to RESTART, RESTORE a saved game or QUIT?"). Problem message added, in place of a disastrous compiler hang (apologies), for the incorrect syntax if one person (called the dude - a person) is in Home, ... where the user thinks he has to give the kind of value for "dude" - which he doesn't and indeed can't, since it's necessarily the kind of value of the person in question. Problem message added to pick up mistakes when people type sentences like Jumping when the actor is on the trampoline is high-jumping. which don't do what they expect (the only legal reading of this asks to put an object called "jumping when the actor" on top of another one called "trampoline is high-jumping", and it seems unlikely that this is what the writer intended). Problem message added to catch maps which have more than two rooms connecting to a two-sided door. (There was already a problem to catch a door connecting to more than two rooms.) Problem message added (in place of I6 error) for use of "otherwise if..." after the "otherwise" clause in an "if". Problem message added to catch "if ..., repeat ... begin;" where the "begin" is ambiguous as to which of "if" and "repeat" it belongs to. Problem message added (in place of I6 error) for too many 'Understand "verb ..." as...' sentences for the same "verb". Problem message added to catch attempts to create "topics that vary", a form of global variable that isn't allowed. Problem message added (in place of internal error) for writing "[a topic]" as a grammar token, in I6 style, instead of "[text]", the I7 way to do the same thing; and similarly for "[an object]" instead of "[thing]". Problem message added (in place of internal error) to catch certain complicated and completely wrong ways to define relations. Problem message added (in place of internal error) for writing a rule based on an action applying to a value, where the name of the kind of value is written instead of a specific value. Problem message added to catch attempts to make impossibly unspecific requests using cardinality quantifiers with now: "now almost all of the doors are open", "now six things are edible", and so on. Problem message added for creating a property name consisting only of the word "presence" (since this causes ambiguities with "...in the presence of..."). Problem message added for using "if V is a C listed in T", where V is a value, C is a column in a table T, and unfortunately V is of a kind incompatible with the contents of C - for instance, a number when C holds only text. Problem message added for creating constant lists of values where the lists aren't recognised because one or more of the entries doesn't make sense. Problem message added to catch contradictory declarations like: Eleven is a 10 that varies. Problem message added to catch attempts to use punctuation characters in Understand ... sentences which can't be matched by the parser anyway, so that the sentences appear to the user to be being ignored. Problem message added to catch bizarre sentences like 5 is an activity. (Or rather, to give them one problem message and not a cascade.) Last and thoroughly least, but in response to a genuine bug report form, code added to protect NI from the "Year 2038" bug. This is the point at which 32-bit integer representations of time in non-leap-seconds since January 1 1970 begin to overflow. NI itself handles time correctly, but it uses C library calls on all its platforms which follow Unix conventions (including on Windows), which means they behave incorrectly on computers whose system clock is set to later than 2038. Work progresses but there is as yet no agreed solution to the Year 2038 bug. When there is, we will recompile NI against the improved C libraries then existing. In the mean time, users are advised to avoid time travel beyond 18 January 2038. 5J39 (1 December 2007) This build introduces lists as first-class values. For any kind of value K, "list of K" is now also a kind of value, and rich support is provided for building and iterating over lists, which are dynamically resized as necessary. Otherwise little is new, but once again all known bugs have been fixed. INFORM FOR WINDOWS If you try to create a new project in the same place as an existing one, you are warned before the existing project is overwritten. If you try to create a project in a directory that doesn't exist, the application will try to create it. Text can be copied, cut and pasted when editing the expected text in the transcript window. For any kind of value K, "list of K" is now also a kind of value. Lists resize automatically, can be iterated through, sorted, searched, reversed or rotated, and they have a notation enabling constant lists to be written down concisely: for instance, let L be {2, 3, 5, 7, 11}; gives the temporary variable L the kind of value "list of numbers", and sets it initially to this sequence of five values, whereas let M be the list of open doors; gives M the kind of value "list of objects", and sets its initial contents to be all the doors which are currently open. (Lists can also be used in global variables, in properties, or table entries, and can include each other: "list of lists of numbers", say, is a kind of value.) Values can be added or removed at any point in a list; lists can be merged, or compared for differences; and examples are presented to show the use of lists as queues, stacks, rings, sets, arrays, and so forth. (All memory management is automatic and all bounds are automatically checked.) See the new Chapter 20 ("Lists"). Examples: "Eyes, Fingers, Toes" added to demonstrate a multi-number safe using lists to create a log of dialed numbers. "Great Portland Street" added to demonstrate a game-show using lists to create a set of actions performed. "Robo" added to demonstrate a programmable robot that will replay the player's behavior. "Robo 2" added to demonstrate a robot that can learn multiple stored action scripts with command names determined by the player. "Rock Garden" reformatted to give the general material at the top. "The Fibonacci Sequence" added to demonstrate using lists as arrays. "I Didn't Come All The Way From Great Portland Street" added to demonstrate using lists as sets. "Lugubrious Pete's Delicatessen" added to demonstrate using lists as queues. "Sieve of Eratosthenes" added to demonstrate using lists as sieves. "Circle of Misery" added to demonstrate using lists as ring buffers. "Lanista 1" corrected to fix a truncated sentence in the commentary. "Leopard-skin" added to demonstrate a log of stored actions. "What Makes You Tick" added to demonstrate building a fishing rod from component parts. "Your Mother Doesn't Work Here" added to demonstrate using a list as a stack to plan character behavior. The previous restriction whereby TEST scripts could not exceed 255 characters in length has been withdrawn. The new maximum is 9999 (a cap intended only to catch accidental runaway cases where the closing quote has been forgotten). Problem message added to prevent the UNDO command being used in a TEST script (which can't safely be done since it undoes progress in the test itself), and also to prevent individual commands in TEST scripts from exceeding 100 characters (since the I6 library would choke on those). Problem message improved for namespace clashes between variable names and descriptions. Problem message added (in place of previous I6 errors) when a description of an action, used as a condition, refers both to the past and to values in the present (by means of "called"). Problem message improved for an ambiguity in rule premisses as between a description of an actor followed by an action, and an action name with no actor attached. (This arose in the case of "standing using ...", where "standing" had also been defined so as to describe certain people: was the action here "standing using", done by nobody in particular, or "using", done by a person matching "standing"?) Bug fixed whereby pastes of Example text for examples including backslashes (such as those arising from the introduction of regular expression matching) and, in some cases, other unusual characters would cause the text to be pasted incomplete - so that it did not work as it was claimed to do. Bug fixed whereby two or more consecutive double-quoted texts in a single table entry would lead to an internal error rather than a problem message; something which can happen easily if pasted text converts tabs to spaces, when two adjacent table columns are both supposed to contain text. Bug fixed whereby a rule whose premiss involved clauses of several different sorts, one of them "when", could sometimes produce an internal error. Bug fixed - or, really, feature added, but the lack of it was regarded as peculiar - whereby an action description used in a rule was not allowed to give the name of a kind of value to mean "any value of this kind": for instance, "Instead of dialing something to a code symbol", where "code symbol" is a kind of value and "dialing it to" is an action applying to one thing and one code symbol. Bug fixed whereby "[']" for apostrophe wasn't being allowed in titles given as the opening text of a bibliographic heading. Bug fixed whereby indexed text and stored action variables were not working properly if they belonged to rulebooks, activities or actions. Bug fixed whereby "if there is a [table-reference]" was not working in the case of columns holding indexed text. Bug fixed whereby spurious "no such entry" run-time problems would occur if a table with a column holding indexed text was created with blank rows. Bug fixed whereby ambiguous phrases requiring run-time checking on some arguments would sometimes go wrong if other arguments were stored actions or indexed text. Bug fixed whereby if several "let" variables in a single phrase needed to be indexed text or stored actions, they would sometimes have their kinds of value rearranged between them, with occasionally bizarre results. Bug fixed whereby the dynamic memory allocator would print up debugging information such as "1+128+256+512+1024+2048+4096+8192+16384+65536" after successfully allocating memory via Glulx's @malloc mechanism. Apologies for this. Bug fixed whereby a compound phrase which looks as if it might be in the form "total ...", counting the total of some property - but which isn't - would generate an internal error rather than being rejected in favour of some other interpretation. Bug fixed whereby a rule predicated on a condition about something being listed (or not) in a table would cause I6 errors. Bug fixed whereby an internal error rather than a problem message would sometimes be issued when a condition was used which had no active verb but could be taken as a description of things (typically arising if "is" had been mistyped as "in"). Infelicity fixed whereby the problem message about minus signs being wrongly used in unit constants could be repeated (sometimes quite a few times) for the same mistake. Problem message added (rather than I6 error or mysteriously incorrect behaviour) for the case of a phrase so ambiguous that at compile-time it is not possible to tell how many values it takes as arguments. The problem explains this, shows the phrases it cannot choose between, and invites the author to reword one of them. Bug fixed whereby the old I6 debugging commands CHANGES and ROUTINES, which are no longer implemented in I7, still had their grammar visible in I7-compiled games, so that it was possible (but usually quickly fatal) to try using these commands. 5G67 (10 November 2007) This build presents substantially richer support for handling text: for the first time, arbitrary and manipulable strings of text are first-class values in Inform. Substantial internal reforms, notably a new implementation of the type-checker (now the third such), lead also to other improvements: notably the ability to store and play back entire actions, and a form of boolean type for the first time - "truth state". Finally, Inform is now available for three new operating systems: Mac OS X Leopard (10.5), and Fedora and Ubuntu Linux. We welcome Philip Chimento to the Inform team as the author of the Gnome user interface for Linux. MAC OS X Mac OS 10.5 (Leopard) incompatibilities corrected; support added for QuickLook viewing of Inform projects, and for content-reflecting icons. Bug fixed whereby replay and double-clicking in the skein sometimes failed to do anything. Provisos such as "(for Glulx only)" are now removed from extension titles when making filenames for newly installed extensions. The '+' button now works when adding Inform 6 extensions: in previous versions the only way to install a new Inform 6 extension was by dragging it to the window. Additionally, a bug has been fixed that was making it hard to add ORLib as a complete directory: in this new release it should be possible to just drag the ORLib directory to the Extensions pane and then use it by switching it on in the Settings tab of an Inform 6 project. CocoaGlk 1.0.4 adopted, which includes a number of fixes: Fixed an issue that could cause a crash if a text grid window ends up with a negative size Fixed a problem that was causing games to crash under Leopard Various stream calls will now produce a warning when they are passed a NULL stream instead of crashing with an error. (The old behaviour was technically correct, but gwindows was passing in NULL streams quite often) Fixed an issue that was causing script files to be left empty until the user typed "script off" Other minor changes: (I6 projects) "Add breakpoint" in the main menu now works in either pane Extensions are now displayed in alphabetical order The "Open Extensions" menu can now view built-in extensions Bug fixed whereby Glulx games were not saving transcripts correctly WINDOWS Fixed an intermittent crash in the I7 application, where it would stop with a dialog complaining about a "pure virtual function call". Thanks to Maryam Gousheh-Forgeot for helping track this problem down. Added a headings menu to the source tab, following the similar menu on OS X. The menu initially shows the top-level headings in the source. Select a heading to go to it, or click on an arrow to see the sub-headings below that heading. INDEXED TEXT A new kind of value, "indexed text", exists to hold text which can be internally examined or changed. Ordinary text values are automatically converted to indexed text format when necessary. For instance, if character number 1 in "[score]" is "7", ... implicitly converts the text of the current score to indexed form, allowing it to be looked at character-by-character, and then examines the first character: so the test passes if the first digit of the score is a 7. Memory is dynamically allocated to allow for such manipulations in a way transparent to the user (and on the Glulx virtual machine 3.1.0 or better, Inform story files can allocate arbitrarily large memory heaps). See the new Chapter 19, "Advanced Text", in the documentation. Indexed text can be accessed by character, word, line or paragraph, with further options to allow for punctuation; and we can search text to see if it contains any other text, and if so, how many times. Moreover, indexed texts can be matched against regular expressions, with replacement also possible. For instance: if V is indexed text, then replace the regular expression "\d+" in V with "roughly \0" inserts the word "roughly" in front of any number in V. The regular expression language supported by Inform is essentially that of Perl (once multiline mode, a Perl eccentricity, and hooks to embedded Perl code have been removed) and Inform's algorithm has been verified against Perl's own compliance tests: see the notes in section 19.6 for details. A particularly interesting text to manipulate is the command most recently typed by the player. Inform stores such text in a kind of value called a "snippet", and - like "text" - this automatically converts to indexed text when necessary. Moreover, rules in the "reading a command" activity are allowed to rewrite the text and reparse the command - for instance, After reading a command: let T be indexed text; let T be the player's command; replace the text "\p" in T with ""; change the text of the player's command to T. removes any punctuation characters from what the player has typed. Indexed text table columns can be written to, and read in from, external files. STORED ACTION A new kind of value, "stored action", holds actions - not action names, but fully-specified actions, including the information about who does what and with what. (The default value is the player waiting.) If V is any value of this kind, then try V try silently V silently try V all work in the obvious way. The phrase current action returns the action currently under way. Stored actions can do anything that actions can do: in particular, they remember, if necessary, the exact wording of the player's command at the time they were stored - so that actions like "looking up 'x100' in the code book" can be stored and tried later on. Stored actions can be used in "let" variables, in table columns, in global variables, and also in properties. See the new section 12.20 in "Writing with Inform". To make an explicit stored action, we use the form of words "action of ...": for example, The best idea yet is a stored action that varies. The best idea yet is the action of pushing the button. When making comparisons, we can of course compare any two stored action values: let C be the current action; if C is the action of pushing the button, ... Although "action of ..." specifies an exact action, we can omit this if we want to write a vague description of an action instead - but only when writing it in a condition: if C is taking something, ... if C is doing something to the lever, ... (If we had written if C is the action of taking something, ... Inform would have thrown up a Problem, because "taking something" is not a single, definite action, so cannot be a stored action.) The constituent parts of a stored action can be accessed with the phrases: action-name part of S noun part of S second noun part of S actor part of S As a convenient abbreviation for testing these, the condition S involves X is true if the object X appears as any of the noun, second noun or actor in S, and false otherwise. The "try" and "action of" constructions are now allowed to specify explicit text in place of a topic in actions such as asking. (Beginners to Inform often think this must be possible, but up to now it hasn't been, because of the difference between a snippet and a text, etc.) For instance, Instead of asking Biggles about "German flying machines": try asking Biggles about "aircraft". The kind of value "action-name", used to denote not a complete action but simply what form of action it is ("taking", "throwing it at", etc.) can now be said for the first time. The premiss for a rule about actions can now make use of variables which exist only inside action rules: for instance, Check an actor waving when the noun is not held by the actor: ... which was previously not allowed because the second mention of "the actor" referred to an action variable which, in a strict reading of the Inform syntax, existed only inside the rule (i.e., after the colon). This seemed an unnatural restriction. The change log for build 4U65 claimed that: the can't go through concealed doors rule has been renamed the can't go through undescribed doors rule. This turns out to have been completely untrue. We meant to, but forgot. The name change has now been effected. (For the reason why, see 4U65.) Lastly, either a bug fix or a redefinition, according to taste: an action description using "... in ..." refers to the room where the action is to happen; up to now this has always meant the room where the player is, but that went contrary to the principle that actions ought to treat people equally. "... in ..." clauses now refer to the room which is the actor's location. Thus Instead of an actor going east in the Vast Nothingness, ... now has effect if the actor tries this in the V. N., not if the player happens to be there at a time when the actor (who might be anywhere) tries going east. This sounds a complicated change, but it's clearly much more logical, and we doubt if anyone relied on the old behaviour. OTHER CHANGES TO DO WITH KINDS OF VALUE A new kind of value, "truth state", represents one of two possible values: the constants "true" and "false". (By default, truth state variables and properties are false.) We can convert any condition to a truth state thus: let victory be whether or not all the treasures are in the cabinet; We can then examine a truth state by comparing it against true or false: if victory is true, ... In fact, this kind of value is not new, but is merely coming out into the open. If we try to write (say) To decide what truth state is time is short: ... then Inform will tell us to rewrite it in the more traditional form: To decide if time is short: ... A phrase to decide if something-or-other is exactly the same thing as a phrase to decide a truth state, and indeed, if we want to then we can use "decide on T", where T is a truth state, in its definition. For instance: To decide if time is short: if the time of day is after 10 PM, decide on true; ... decide on whether or not Jennifer is hurried. "Decide on true" is exactly equivalent to the more normally used "decide yes", and of course it is optional. The last line is more interesting since it effectively delegates the answer to another condition. >--> The kind of value "object-based-rulebook" has been withdrawn: instead, such a value is now called an "object-based rulebook" and is a special case of a "rulebook". (The double hyphen was generally found to be clumsy, and often led to mistakes.) The deprecated kind of value "string-of-text", which behaved identically to "text" in recent builds, has been withdrawn. It was mentioned in one example ("Panache") through a historical accident, but was otherwise undocumented. A "let" variable can now optionally be created by giving its kind of value rather than its initial value - the initial value is then the default value for that kind. For instance, let T be an indexed text; creates a "let" variable called "T" to hold indexed text, and which is initially holding the blank text "". A table column name can now optionally give its kind of value in brackets. Thus "darts tally (a number)" would create a column called "darts tally" whose contents were required to be numbers. A phrase to decide a value is now checked to make sure that doesn't try to return a type which is not a value (something which typically produced problem messages in earlier builds, too, but less helpful ones). Where a value property is declared for one kind of object as holding a value of kind of value X, and for another as holding kind of value Y, X and Y now have to agree: previously they were allowed to differ as long as they were each kinds of object, but this was not quite type-safe, and led to subtle bugs. In previous builds of Inform, values of units had to be positive or zero: thus defining An elevation is a kind of value. 100 cubits specifies an elevation. creates a kind of value where -10 cubits, say, would not be a legal expression. Owing to a bug, however, no problem message was produced, and the minus sign was simply ignored - the value "-10 cubits" was read as if it were "10 cubits". This bug has been fixed, and a new convention adopted: if the initial specification of the unit is negative, then negative values are permitted, and otherwise not. Thus: An elevation is a kind of value. -100 cubits specifies an elevation. means that (say) "6 cubits" and "-3 cubits" are both legal. When U is a numerical value - a number or a unit, that is - the phrase "random U from X to Y" now gives truer results for very large ranges in the Glulx virtual machine. Bug fixed whereby "random U from X to Y" would sometimes seed the random number generator as a side-effect when X was greater than Y. This is now a symmetrical phrase - "a random number from 5 to 2" now has the same effect as "a random number from 2 to 5". (The phrase "seed the random-number generator with..." is the proper way to seed the RNG.) If U is a unit, the phrases "random U", "U after X" and "U before X" have been withdrawn - these don't really make sense for unbounded ranges. (What is a random height? It's a question which can only be answered in context - a random height for buildings is quite unlike a random height for people.) Problem message added to catch literal numbers (and literal units) which are too numerically large to fit into the Z-machine: for instance, An RGB value is a kind of value. 255-255-255 specifies an RGB value. Scarlet is an RGB value which varies. Scarlet is 255-0-0. ...is fine in projects compiled for Glulx, but would overflow the 16-bit word size on the Z-machine. Bug fixed whereby nameless properties ("conditions" - not in the sense of "if", but in the sense of something being in good or bad condition, say) specified for kinds but only at the "usually" level of certainty would sometimes have such sentences ignored. Problem message added for unit specifications which overlap or make ambiguous existing ways to write constant kinds of value; for instance, "250" specifies a weight. clearly clashes with Inform's existing notation for text. Problem message added to catch the case of multiple initialisations of the same variable, for instance, Foobar is a number which varies. Foobar is 1. Foobar is 2. Bug fixed whereby no problem was detected if a property required to hold one kind of object as a value (for instance, a property holding a room) was initialised by an assertion with another kind of object altogether (for instance, a container). Bug fixed whereby spurious typechecking problems would be produced if the same kind of value was used both as a self-named property of one kind of thing, and also as the value of other-named properties of other kinds. Bug fixed whereby conditions used for the start and end of a scene would not always be fully typechecked, if it appeared at least syntactically valid. For instance, Fairytale Wedding begins when the player is kissing the frog. looks superficially right, but in fact involves comparing an object (the player) with an action (kissing the frog) - something we may one day legalise in Inform, but which at present should be rejected. In builds before this one, it compiled but to a condition which was always false. A number of subtle bugs have been fixed in handling ambiguous multiple-phrase text; if a phrase can be read as A or B, then A wins if - it has more fixed words; - they have the same number of fixed words, but A has more tokens; - taking fixed words alone, A is lexicographically earlier; - A is a subschema of B in the sense that each value of a token in B can be coerced to the corresponding kind of value in A; - A was created earlier than B in the source text; - fixed words of A occur earlier than B in the actual text parsed. In practice these changes cured some bugs, but did not change the interpretation of any text in the examples, and we expect they will probably not be noticed as changes by users. The final rule is notable for making phrases "right associative" when iterated, so for instance two minutes before three minutes before 12:00 AM is read as two minutes before (three minutes before 12:00 AM) rather than (two minutes before three minutes) before 12:00 AM and thus evaluates to 11:55 PM, not 11:59 PM. MISCELLANEOUS OTHER CHANGES >--> In order to reduce namespace clashes, a fairly significant change has been made to the way Inform reads noun phrases in the source text. Objects can, of course, be referred to using abbreviated names: for instance, if we write The Great Hall of Infinity is a room. then we can also write The Panjandrum is a man in the Hall. where "Hall" is a read as referring to the Great Hall of Infinity. This convention of course remains. However, the same is no longer allowed with names of kinds. Thus: A Scrabble piece is a kind of thing. The Q is a piece. will no longer work: the second assertion must be written out in full as The Q is a Scrabble piece. This led to tiny changes in six of the Examples (and detected a typo in a seventh), but in all cases the change was easily made and the result more legible or no worse than the original, so we hope that users will not find this change to the rules too inconvenient. The point of it is so that text such as: Beautiful scenery is a kind of thing. A wall is a kind of thing. A wall is usually scenery. will now work: previously the "scenery" in "A wall is usually scenery" was taken as referring to the "beautiful scenery" kind, not the built-in "scenery" property. (And so on for many other cases.) >--> An ambiguity has been removed from the syntax for actions. The convention when indicating an action by a character other than the player is that the full form reads like so: Miss Hodges trying taking the lime Inform, however, allows the usually redundant word "trying" to be omitted where this leads to no ambiguity. The change is that, for safety's sake, Inform now forbids this abbreviation where the object's name includes a participle (or indeed any word ending in "...ing"). This prevents, for instance, Mr Geoffrey Taking from being read as an action rather than a noun phrase, or (a case which actually arose for one of our users) newspaper cutting being read as the newspaper itself doing some cutting. >--> The accessibility rules have had one anomalous case removed. Previously, an object in another room was considered inaccessible, yet an object out of play was not. The only reason this rarely caused trouble was that actions involving such objects were seldom generated, because the parser's scope rules would prevent it from recognising commands referring to them. But it could occasionally happen, if a command such as TAKE ALL fired off a run of actions, and the outcome of an earlier take caused the object from a later take to be moved out of play; and with stored actions this sort of thing becomes much more likely to happen. At any rate the anomaly has been removed, but this had the consequence that a few examples which used physical things to represent abstract concepts went wrong. For instance, An emotion is a kind of thing. Envy and gratitude are emotions. is likely to produce a world in which "envy" and "gratitude" both exist as physical things but are permanently out of play. If we then write Understand "experience [any emotion]" as experiencing. then commands like EXPERIENCE ENVY will be recognised, but what happens next depends on how the action is defined. If like so: Experiencing is an action applying to one thing. then I7 will now strictly apply the rule that the thing must be touchable, that is, with no physical barriers between it and the player: which means EXPERIENCE ENVY will now fail accessibility. To get around this, define Experiencing is an action applying to one visible thing. instead: this weakens the requirement to the point where being allowed to refer to the object is enough. ("Visible" here means visible in the sense of parser scoping rules, not with one's own eyes: they are almost always the same thing, but "[any emotion]" overrode that.) >--> Another change which will probably make little difference, but which clears up an ambiguity: given two descriptions in the form (adjectives) plus (kind), which are of different kinds, and where Inform cannot prove that either is necessarily a special case of the other, then the one with more adjectives is now considered more specific - and this affects rule ordering. So, for instance, Instead of examining an open door: ... (A) Instead of examining a vehicle: ... (B) rule (A) is now considered more specific than (B), whereas in previous builds they were equally specific and so would appear in rulebooks in source text order. (This change made no difference to the behaviour of any of the examples, or any other of our test cases: it's pretty esoteric, but we are trying to reduce the number of ways source text ordering is used, where sensible.) We can now give unusual or alternative names for the understanding of either/or properties, when these are used to describe objects. For instance, if we have: The box is a container which is carried by the player. It is openable and closed. Understand the open property as referring to the box. then EXAMINE OPEN BOX will work only if the box is open, and so forth. But we can now add: Understand "opened" as open. Understand "shut/sealed" or "tightly sealed" as closed. and now EXAMINE TIGHTLY SEALED BOX, etc., will work only when the box is closed. "now T is X", to change the value of a table entry T to a value X, now works as might be expected. (This case seems to have been overlooked before: it wasn't intentionally left out of the design, and consistency clearly requires it.) Previous restrictions on the use of "let" names, phrase parameters and table entries in text being written or appended to external files have been lifted. Thus: The currently erased jotter is an object that varies. To erase (pad - a jotter): now the currently erased jotter is the pad; write "[heading of the currently erased jotter][paragraph break]" to the text file of the pad. can now be done more simply thus: To erase (pad - a jotter): now the currently erased jotter is the pad; write "[heading of the pad][paragraph break]" to the text file of the pad. This affects both "write ... to ..." and "append ... to ...". The location of external files written or read by Glulx story files now uses the same convention on both OS X and Windows. (In 4X60, Inform for OS X differed from this.) Such ".glkdata" files are now always stored in the same folder as the project "Whatever.inform", unless the user has created a "Files" subfolder of a "Whatever Materials" folder, in which case that will be used as the location. The Kinds index now presents the initial state of either/or properties associated with kinds in a more legible way, avoiding double negatives. Thus Not normally portable not fixed in place. (which admittedly looks worse without the italic) is now written Usually fixed in place not portable. The SHOWME testing command is now more detailed, and shows what properties an item or room currently possesses. For instance: >showme guide Guide to Desert Fauna - book location: in Death Valley unlit; inedible; opaque; portable; singular-named; improper-named printed name: Guide to Desert Fauna printed plural name: books contents: Table of Critters (This brings it roughly into line with the old I6 verb SHOWOBJ, but has much more legible output, since property values can be printed better.) The syntax of phrases to access tables has tended to be annoyingly picky about prepositions: it has been liberalised a little, so that one can now write "from T" equivalently to "in T" in phrases like choose a random row from the Table of Soft Fruit Similarly, in the phrases with the form "choose ... row ...", either the definite or indefinite article can be used, or omitted altogether: there will be times when any of these may seem clearest. So any of these (for instance) will be allowed: choose a random row from T choose the row with citrus entry of 5 from T choose blank row from T Use options can now specify numerical values, along with default values which the source text can choose to raise: this should help extension-writers who want to provide "enough" storage for the user's needs, since the user can now use such an option to tell the extension exactly how much he does need. Bibliographic data text normally doesn't recognise text substitutions, for obvious reasons: it has to be literal text supplied to outside programs. (The story title, author's name, and so on.) It is now allowed to contain just one text substitution: ['] for a literal apostrophe. (This allows titles like "Summer of [']69" to be handled properly.) The previous maximum of 500 I6 inclusions and use options used all at once in any single source text has now been removed. Inform now chooses further contrasting colours for World Index maps which include more than 10 different regions, and now cycles through its colours rather than reverting to grey for subsequent regions when the shades run out. Bug fixed whereby complicated descriptions involving the contents of a region would fail to work: for instance, "the number of rooms in R", where R is the name of a region, or "a random room in R", would return 0 and nothing respectively. Bug fixed whereby releasing along with a custom website was not working (NI was issuing the wrong instructions to cBlorb, the packaging agent. Standard websites did work: only those with custom templates failed.) Bug fixed whereby assemblies which involved properties as well as kinds would sometimes not always have those properties set, particularly if multiple assemblies took place with similar circumstances. For instance: A box is a kind of container. An open box is in every room. A closed box is in every room. Bug fixed whereby a player's holdall which is a part of the player - rather than being carried or worn by the player - will now function correctly. (This was requested by someone wanting to implement "a robot or marsupial".) Bug fixed whereby recent changes to table-handling caused properties of values to be wrongly read and written. (Typically a property of V would be confused with a property of the value whose numerical form at run-time was one less than V's.) Bug fixed whereby route-finding (and counting shortest distances) through one-to-various relations would give wrong results, usually false claiming that no route existed. Bug fixed whereby the phrase "direction of (D - door) from (R1 - room)" didn't work at all, really (it returned the I6 direction property, not the compass direction object - an elementary I6 mistake). >--> Bug fixed whereby after rules were being applied to out of world actions, in spite of the documentation's clear statement that they would not be. It is just possible that some authors might have relied on this working: to give after-effects to out of world actions, use the report rules. Bug fixed whereby "change ... to ..." would sometimes cause I6 errors where the thing changed was a variable holding an object, and the value changed to was something other than an enumerated property-value constant. Bug fixed whereby "if ...; otherwise if ... begin;" would cause I6 errors rather than produce a Problem message (to point out that "begin" should not be used with "otherwise if ..." clauses). Bug fixed whereby placing items by referring to the currently discussed room as "here" would sometimes give strange results if (i) the current subject of discussion when the sentence is first read is not what will prove to be a room, and also (ii) the room being discussed most recently was created some time ago and other rooms had been created since then. The new interpretation of "here" should be more robust and predictable. Bug fixed whereby restrictions applied to headings, such as Volume 1 - not for release Volume 1 - for Glulx only would be ignored (but only for Volume headings, not for headings of any other level). Bug fixed whereby implications (such as "A locked thing is usually lockable.", an implication in the Standard Rules) are ignored if the thing to which they apply cannot have the property which is given as the consequence; previously, a somewhat mysterious problem message would be produced. Bug fixed whereby implications would sometimes override definite statements made negatively (e.g. "A locked thing is usually openable" overriding "The safe is locked. The safe is not openable"); again, the symptom was usually a mysterious problem message. Bug fixed whereby the use of a relation in an indirect clause with a value of a kind which is also used as a property, and has the same name as that property, would cause I6 errors. Bug fixed whereby grammar using a newly defined token for a value belonging to a new kind of value, would cause I6 errors. Bug fixed whereby giving alternatives in grammar for understanding specific times of day (e.g. 'Understand "lunch" or "lunch time" as 11:30 am.') would cause an internal error. Bug fixed whereby a few malformed assertions involving impossible callings (e.g. 'X (called Y) and X has Y.') produced an internal error rather than a problem message. Problem message added for attempts to create multiple objects with a single 'called' clause ('Bill and Ben are men in the Garden.'). Bug fixed (or, in a sense, feature added) so that "X is a backdrop which is everywhere" will now successfully create an omnipresent backdrop; previously one had to write "X is a backdrop. X is everywhere." Bug fixed whereby actions sometimes continued and reported even if the carry out rules had already killed the player. Bug fixed whereby messages about doors opening and closing were grammatically incorrect if the doors had a plural name: e.g. "The double doors opens" instead of "The double doors open". Bug fixed whereby 'Understand ... as a mistake' would produce the mistake reply even when the text was being addressed to another person, rather than being intended as a command by the player. Bug fixed whereby tokens for understanding names which involved various-to-one relationships to other objects would not work in concert with specific additional names made using 'Understand'. For example, Understand "[something related by loyalty]" as a team. Understand "Glasgow Rangers" as a team. would correctly match the token, but not the additional name, which would be ignored. Bug fixed whereby "now the player is X" would be read differently from "change the player to X", and would not properly change perspective. Bug fixed whereby an assertion sentence setting the description of the player caused a contradiction with the default setting for this made in the Standard Rules. For instance, The description of the player is "Frankly harrassed-looking." is now legal again. (It was legal in early builds of Inform, too.) Slight anomaly resolved (it wasn't really a bug) in the determination of which items are concealed, using the "deciding the concealed possessions" activity: previously the activity would test items belonging to the player even though a subsequent rule would force them to be unconcealed regardless of the activity's decision - an actor can't conceal something from himself, since concealment in I7 by definition means concealment from the view of other people. Now, the activity is not asked about such items. Bug fixed whereby "( -" was sometimes read as "(-", opening a passage of literal I6 code, which was unfortunate if it had actually been part of a calculation ("let X be ( -1 * count )", say). Various bugs fixed to do with the use of the I6 string escape characters \, @, ~, ^ in I7 source text and quoted text (for instance, these followed by digits would in some cases cause I6 compilation errors). Problem message added to catch situations where the source text would require ridiculous lengths of time to parse, using Inform's normal algorithms: this is something which seems only ever to have happened to one user, through the accidental omission of lots of punctuation, but it had the effect of Inform apparently never completing compilation, which is inconvenient to recover from on some platforms. Problem message added to clarify why some mixtures of actions like 'dropping the CD or inserting the CD into the jewel box' are not allowed as the premiss of a rule; and bug fixed whereby other illegal mixtures, such as 'inserting the CD into the jewel box or dropping the CD' were previously miscompiling rather than producing a problem. Problem message added to help diagnose a common mistake with 'if' phrases, missing out the 'begin' at the end. Problem message added to explain why sentences like Understand "take [things]" as "drop [things]". are not allowed. Problem message added to explain why sentences like Understand "trevor, look" as looking. are not allowed. Problem message to catch attempts to use "carry out", "report" or "check" rules applied to named action patterns rather than specific actions; previously these would sometimes be allowed provided that some subset of their names coincided with the name of some actual action (but with unhappy results, since the rule would end up applying to that action, which would certainly not have been what the user intended). The problem message produced by sentences like The coin is in the strongbox. (where "coin" is a kind of thing, so that this is too vague) has been lifted in the case of writing sentences like One coin is in the strongbox. since, after all, higher multiplicities like Two coins are in the strongbox. have always been allowed. Problem message added for trying to define the same test name to mean two different tests. Problem message added for trying to use a kind of thing to relate multiple objects to single values in single sentences. (Ideally this would work, but there are awkward implementation reasons why it doesn't, for the moment, and the problem message replaces a less polite internal error.) Problem message clarified when trying to make a property which must hold an object of a given kind, when no objects of that kind exist anywhere, so that this property can never have a legal value. Problem message added for contradictory indications of where something initially is, for instance, Fred is in the Kitchen. Fred is in the Dining Room. (How we overlooked this obvious case in four years of testing...) Problem message added for an Understand attempting to give a name to an object qualified by a relative clause or properties. (The same effect can be achieved by other means - the problem message explains how.) Problem message added for an attempt to test if a vaguely described past action succeeded. (Previously these apparently compiled, but gave usually wrong answers.) Problem message added to give more helpful diagnosis if an action definition incorrectly gives a past participle longer than a single word. Problem message added (rather than an internal error) for using a relation which relates objects to values in a "[something related by...]" token in an 'Understand' sentence. Bug fixed whereby the parser would give slightly misleading replies if pronouns other than "her" were used in commands before they had ever been set. Bug fixed whereby scenery items, never mentioned in room descriptions, could nevertheless silently become pronoun values. (Thus "it" might mean the sky in a room where the sky was scenery.) Bug fixed whereby the parser would reply "That noun did not make sense in this context." in response to certain scope-filtering tokens where nonsense had been typed, but without a proper paragraph break. Bug fixed whereby duplicate problem messages would result from a phrase defined with alternate wordings, but also defined incorrectly. (The problems would be repeated for each possible wording.) Bug fixed whereby the "Use serial comma" option did not result in a serial comma being used in clarification questions like Which do you mean, the fish, the fowl, the chalk, or the cheese? Documentation bug fixed whereby the "return to contents" links in Writing with Inform would sometimes return to the contents of the Recipe Book instead. Examples: "Xot" added to demonstrate storing an erroneous command and replaying it later, as seen in Infocom's HHGttG. "Terracottissima Maxima" added to demonstrate understanding an indexed text property. "Fido" added to demonstrate a dog that the player is allowed to name and re-name. "Pre-alpha" added to demonstrate a beta-testing command that allows the player to preface any line with a punctuation mark to show it is a comment. "Blackout" added to demonstrate replacing letters in a printed name under certain circumstances. "Identity Theft" added to demonstrate asking the player for a name at the start of play. "Mr. Burns' Repast" added to demonstrate a fish that renames itself depending on how the player refers to it. "Endurance" added to demonstrate a way of modeling time so that it depends flexibly on the actions undertaken during a turn. "Uncommon Ground" tweaked to repair a couple of cosmetic flaws held over from earlier versions of the extension "Panache" corrected to remove a reference to the elderly (and now withdrawn) type "string-of-text" "Disenchantment Bay 12" corrected to remove a reference to the captain as "transparent", which was a holdover from a time (before the first public beta of Inform) when characters could be opaque or transparent and this quality would determine whether their possessions could be seen. "Straw Into Gold" added to demonstrate a character whose name is concealed until the player guesses it. "Celadon" added to demonstrate extending DROP to apply even to objects the player is carrying inside a container or on a supporter. "Northstar" added to demonstrate modifying the player's command using a regular expression, so that ASK JOSH TO TAKE INVENTORY will be understood as JOSH, TAKE INVENTORY. "Burning", "Gelato", "Originals", "Solitude", "Stately Gardens", "Tilt 2", and "Tilt 3" revised to make use of the new truth state kind of value. "Cactus Will Outlive Us All" added to demonstrate stored actions and characters who respond when they occur. "Anteaters" added to demonstrate stored actions that include topics. "Bosch" added to demonstrate an alternative full score system using stored actions. "Kyoto" revised to reflect the current state of the actions rules. "Dinner is Served" revised to change the way closed containers are described. "Chronic Hinting Syndrome" "Ferragamo Again", "Being Peter", "The Problem with Edith", and "Introduction to Juggling" revised to reflect new restrictions about acting on out-of-play objects. "Broughton" revised to fix a very tiny bug in which "greeting" was not specified as a subject. "Lucy" added to demonstrate redirecting the ASK command to a new topic other than the one the player typed. "Fine Laid" added to demonstrate redirecting most actions from one object to another. "Mirror, Mirror" revised to use indexed text rather than an external file, which means that it can be used in z-machine games as well. "Actor's Studio" added to demonstrate a video camera that records actions occurring in its presence, then plays them back later. "Capital City" added to demonstrate capitalized text in the status line. "Rocket Man" added to demonstrate sentence- and title-casing for any to-say phrase. "Rubies" added to demonstrate a scoreboard of high-scoring players. "Witnessed", "Sand", "Modern Conveniences", "Hot Glass Looks Like Cold Glass", "Model Shop", "Nickel and Dimed" slightly changed to spell out kind names in full rather than use abbreviations. "Situation Room" added to provide 24-hour time printing. "Tamed" revised to get rid of the magician's booth being closed. "Starry Void" added to demonstrate a simple case of a room whose exterior is visible from another room. "The Cow Exonerated" added to demonstrate matches for starting fires, using indexed text to make the reporting more elegant. "Savannah" added to demonstrate liquid used to put out fires. "Slouching" added to demonstrate sitting, standing, and lying down postures for the player and other characters. "Costa Rican Ornithology", "Crusoe", "Farewell", "Juggling", "Nickel and Dimed", "Money for Nothing", "Aftershock", "Channel 2" edited to make it easier to extract the generalizable portions for use in other games. "Four Cheeses" edited for portability and to clean up a few clumsy phrasings due to the age of the example. "Bogart" edited for portability and to remove a special-case bug. "What Not To Wear" added to demonstrate a more complete clothing system combining layers with a concept of different regions of the body, for whole classes of shirts, trousers, etc. "Port Royal 1" and "Port Royal 2" edited for length and clarity. Extensions: "Basic Screen Effects" edited for a small bug that prevented the "show current quotation" phrase from being available under Glulx. Version advanced to 5. "Glulx Entry Points" changed to treat glulx replacement command as indexed text, which means that it can be edited more flexibly or even constructed through multiple hyperlinks. Version advanced to 3. "Locksmith" changed to make the "you lack a key..." message more flexible and keyed to individual objects. Version advanced to 4. Minor one-line addition to the documentation of "Basic Help Menu" to clarify how to replace the enclosed menu with one of our own. 4X60 (23 August 2007) This build adds 19 new examples and modernises a dozen others, and presents a new volume of built-in documentation: the Inform Recipe Book. It also provides new features for variable text, improves and extends table-handling, allows Glulx-format games to read and write files and communicate with external programs, and allows extensions to create more readable and useful documentation. (Windows only) Added support for Glulx mouse events and hyperlinks to the game tab. (Windows only) The justification style hint is now supported when running a Glulx game in the game tab. As a result, games using Emily Short's "Glulx Image Centering" will now work when run within the application. A new manual, The Inform Recipe Book, has been added to the application. It sits alongside the previous manual (Writing with Inform) and presents the examples thematically, with connecting advice and comparisons of techniques to achieve a wide range of IF effects. This should make the (now 357) examples much easier to browse and to borrow from. The "[one of]" text substitution previously provided by Jon Ingold's extension "Text Variations", which built on code by Andrew Plotkin and Roger Firth, has now been adopted into Inform's core language. Examples of its use include: say "You flip the coin. [one of]Heads[or]Tails[purely at random]."; say "[one of]The phone rings[or]The phone rings a second time[or]The phone rings again[stopping]."; say "You turn the light switch [one of]off[or]on[cycling]. Nothing happens."; say "The newspaper headline is: [one of]War Casualties [or]Terrorists[or]Banks[sticky random] [one of]Continue To Expand [or]Lose Out[sticky random]."; say "The light changes randomly again; now it's [one of]green [or]amber[or]red[at random]."; say "Zorro strides by, [one of]looking purposeful[or]grim-faced[or]deep in thought[or]suppressing a yawn[or]scratching his ribs[or]trying to conceal that he has cut himself shaving[as decreasingly likely outcomes]."; say "You dip into the chapter on [one of]fish[or]mammals[or]birds [or]reptiles such as the black salamander[in random order]." See the new section 5.6 in the documentation: note that "[as decreasingly likely outcomes]" and "[in random order]" are new options, the former using a tapering probability distribution, the latter a random permutation. >--> It should be noted that the new implementation of this substitution is completely different to the one provided by the extension. The previous method involved printing all the text to a buffer array, then hash-coding it and taking choices based on this hash, which meant that the same sequence of choices occurring twice in the same text would be effectively the same (because of having the same hash code); thus "This is [one of]A[or]B[at random] versus [one of]A[or]B[at random]." could never print "This is A versus A." or "This is B versus B." The new implementation treats each "[one of]..." individually. To get around this, define To say A-or-B: say "[one of]A[or]B[at random]". and then change the text to "This is [A-or-B] versus [A-or-B]." Furthermore, there is no buffer array, no hash code, and it is no longer possible to extract state information by deliberately printing the text with an incomplete "[one of]" construction. (To quote the Text Variations documentation: "a terrible way to solve that kind of problem", so we don't feel too bad about withdrawing it.) Thus the phrases "the index of the last buffer" and "the index of the buffer" no longer exist. In any case, the new implementation polices the use of the construction so that leaving it incomplete is no longer possible. "[one of]" must be matched by one of its possible conclusions "[purely at random]", "[stopping]", ..., or problem messages will be generated; similarly, "[or]" can only legally be used inside the construction. On the other hand, the new implementation does allow the construction to be nested, both explicitly in a single text and also implicitly (where a text substitution inside one of the options itself does something which also involves a "[one of]"), where the old implementation would silently have failed. As an explicit example: "[one of]A palace on the [one of]Nile[or]Euphrates[purely at random] delta[or]A hovel by the [one of]Tigris[or]Rhine[purely at random] river[purely at random]." In practice, if a work in progress used "Text Variations" and did not try to use "the index of the last buffer" then there is a good chance that simply deleting the line Include Text Variations by Jon Ingold. will be the only change required. We thank Jon Ingold and his collaborators for donating their design. The extension "Text Variations" will continue to be available from the website for the time being, but marked as no longer needed or compatible with builds from here onwards. We suggest that users uninstall it once they are sure that any works in progress continue to work without. This change implements proposal (6.20) from the January 2007 consultation document. The run-time code for handling tables has been rewritten to improve its reliability and efficiency. A number of minor bugs have been fixed in the process, notably a failure to sort correctly on tables which contain mixed blank and non-blank rows, and a rarely occurring problem to do with storing the number 32739 in table entries under the Z-machine. Table sorting is now carried out using a hybrid algorithm: insertion sort from 1 to 11 rows, and in-place mergesort for 12 rows and up. This is much faster on even medium-sized tables (e.g. about ten times faster on tables of 200 rows), and is also stable in all cases: that is, if two rows have the same value in the X column of a table, and that table is then sorted (forwards or backwards) on the X column, then they will stay the same side as each other. As a consequence, all sorts are idempotent, that is, performing the same sort operation twice always results in the second operation making no changes at all. (The previous algorithm was idempotent but, owing to a bug, not in all cases stable.) Insertion/in-place mergesort was chosen because we needed stability, O(n log n) average running time (together with good performance on nearly-sorted tables, which are the commonest usage cases in actual Inform source text), O(1) storage overhead (the Z-machine is extremely short of table space), and reasonably predictable stack usage. Projects compiled for Glulx rather than the Z-machine now have the ability to make use of external files. Like sound effects and figures, these are declared and given names before use: The File of Glaciers is called "ice". This creates a new named constant "File of Glaciers" (whose kind of value is "external-file") for use in file contexts. (The prefix "binary file" rather than "file" can be used to make the file binary in the Glk sense, but the default is to use text files for all purposes.) Each file is considered to be owned by some project, identified by its IFID. By default, a newly declared file is owned by its own project, but we can also specify that we want to use somebody else's file, either explicitly or vaguely: The file of Spectral Sequences (owned by project "4122DDA8-A153-46BC-8F57-42220F9D8795") is called "adams". The file of Boundaries (owned by another project) is called "milnor". We can write or append to a file owned by anyone, but can only read a file whose ownership matches this description. External files are indexed in the Contents index, alongside figures and sound effects. Files sometimes exist, and sometimes do not: they are sometimes complete, sometimes only partly written. (For a file shared between two games running simultaneously, one might try to read a file the other is still in the middle of writing.) We can test this with: if the file of Invariants exists... if ready to read the file of Invariants... A file cannot be ready if it does not exist, so the latter is a stronger condition. Tables can be saved to external files, and loaded them back in again, during play: all file-handling is done automatically. The user only needs to use the phrases: read the File of Glaciers into the Table of Antarctic Features; write the File of Glaciers from the Table of Antarctic Features; Blank entries are preserved; it is legal to write a small file into a large table, and if so, all unwritten entries are blanked; a run-time problem is shown if the file contains more rows or columns than will fit into the table which it is being loaded into; similarly, a run-time problem is shown on trying to write a table which contains data not safely exchangeable with other story files (or other compilations of itself). Text can also be saved to a file, and again all file-handling is automatic: write "Jackdaws love my big sphinx of quartz." to the file of Abecedary Wisdom; append "Jinxed wizards pluck ivy from the big quilt." to the file of Abecedary Wisdom; The quoted text can, of course, contain substitutions, so can be long and complex if need be. On an append, the file is created if it does not already exist. Text from a file is printed back with the text substitution: "[text of the File of Abecedary Wisdom]" To copy one file to another, for instance, write "[text of the file of Abecedary Wisdom]" to the file of Secondary Wisdom; >--> The implications to do with lockability have been improved: A locked thing is usually lockable. A locked container is usually closed. A locked door is usually closed. A lockable container is usually openable. A lockable door is usually openable. Thus writing "The ballot box is a locked container." will now deduce that the box is probably lockable, closed but openable. These are only guesses by Inform, and can be overridden by giving explicit instructions to the contrary: "The ballot box is a locked unopenable container." Definitions of adjectives, which previously had to refer to their subjects only by the pronoun "it" (or in some cases "his", "her", etc.), can now make callings. For instance: Definition: a direction (called thataway) is viable if the room thataway from the location is a room. is a good deal easier to read than Definition: a direction is viable if the room it from the location is a room. which was previously the only way to write this. Only a single calling can be made, and it must refer to the specific object to which the definition applies. A new rule in the Standard Rules, the "can only take things rule", prevents the taking of objects which are not things - for instance, rooms or directions. (Such an action can never normally be generated by the grammar for typed commands, but if Understand sentences are written to open the possibility then the player will see ugly "programming error" messages: the new rule prints a more suitable reply.) Extension documentation can now request "paste into the source text" icons like those found in the main documentation and its examples. If an indented paragraph of quoted source text begins with an asterisk and then a colon, like so... *: A dog is a kind of animal. ...then the asterisk-and-colon are replaced in the final documentation by a paste icon: clicking this will insert the copy which follows into the source text. The text to be pasted is considered to begin after the colon, and to continue until the next unindented text, i.e., it can run for many quoted paragraphs, but as soon as the quotation is broken the paste extent will end. Any tables within the quoted range should be safely rendered with tabs in between the columns. Large extensions which need to include a large amount of documentation can now subdivide it using headings and/or subheadings, like so: Chapter: Pesky Meddling Kids Section: Dog Food A suitable table of contents with navigation links will be automatically added to the extension documentation, if so. The Extensions chapter of the documentation has, appropriately enough, been extended: it now opens up a limited number of previously restricted syntaxes to public use. These will only be useful to experienced Inform 6 programmers. Fixed a further namespace clash: a "let" name can now coincide with the column name of a table. (This was preventing John Clemens's extension "Scheduled Activities" from working in recent builds.) Extensions: "Basic Screen Effects" very slightly updated so that the documentation is clearer about the lack of colored letters in Glulx, and suggests that the author turn to Glulx Text Effects for these capabilities instead; also given a new example to demonstrate forcing the player to type what we want him to type (since this is becoming something of a frequently-asked question); chapter and section headings and paste-able examples added. "Basic Help Menu", "Glulx Text Effects", "Locksmith", "Menus", "Punctuation Removal" tagged so that the example can be pasted. "Complex Listing", "Plurality" tagged and given chapter and section headings. Examples: "Radio Daze" example from Jon Ingold's Text Variations extension brought into the main documentation. "Camp Bethel" added to demonstrate several other common applications of text alternatives. "Chanel version 1" added to demonstrate paired "[i]...[/i]" and "[b]...[/b]" italic and boldface tags, similar to HTML's. "Blink" added to demonstrate creating one's own text variations keyed to values, using the special terminology explained in the Extensions chapter. "Uncommon Ground" added to demonstrate creating one's own text variations keyed to the identity of the player character. "Labyrinth of Ghosts" added to demonstrate recording the deaths of all previous players of the story file by storing them in a file. "Alien Invasion Part 23" added to demonstrate saving preference files from one game in a series for use in the next episode. "Flathead News Network" added to demonstrate communicating with a simple Unix script running in the background, in order to provide live news headlines (drawn from RSS feeds) inside a story file. "Ferragamo Again", "Straw Boater" slightly cleaned up to be better filed in the Recipe Book. "Cinco" edited to fix a particularly bone-headed bug that vitiated the whole point of the example. "When?" adjusted to slightly improve the way the example is described. "Modern Conveniences" added to demonstrate standard kitchen and bathroom appliances. "Do Pass Go" added to demonstrate a pair of dice. "Mirror, Mirror" added to demonstrate remembering the current room description by preserving it in an external file. "The Unbuttoned Elevator Affair" added as an example of a simpler lift than the elaborate one in "Dubai". "Further Reasons Why All Poets Are Liars" added as an example of using action variables for an action which moves a box around internal positions inside a location; a much thinner version of this example, "A pushable box", has been removed. "M. Melmoth's Duel" added, similarly to replace "Tinted wallpaper". "The Second Oldest Problem" added to demonstrate using action variables to make the going action react to moving between dark rooms. "Saint Eligius" added to demonstrate an additional comment added to a room description when the player first enters. "Baritone, Bass" added to demonstrate defining the character at the start of play. "Bic" added to demonstrate testing whether any defined objects are missing description properties. "Meet Market" added to demonstrate relations involving multiple values. "Depth" rewritten to improve the simulated geometry used to test whether an item could fit inside a container. "Patient Zero," "Today Tomorrow," "Reporting rules for other characters' behavior," "Uptown Girls", "Full Moon" edited to take advantage of new text variation features. "Belfry", "Bikini Atoll", "Dearth and the Maiden", "Hayes Code", "Lies", "Safety", "Undertomb" and "Weathering" all made into formal numbered examples rather than, as in previous builds, appearing in the running text of the manual. Bug fixed (or, if you prefer, feature added) whereby sentences providing alternative names for times of day, like: Understand "lunch time" as 11:30 am. ...now work as might be expected. Bug fixed whereby Understand ... as a person would fail with I6 errors. (Apologies for this: an oversight in 4W37's abolition of the player-character kind, which had the same flaw, but nobody noticed because it was so little used.) Bug fixed whereby "if S is not happening", for S a scene, would incorrectly think that a completed once-only scene was still happening. Bug fixed whereby implications would in some cases be ignored in circumstances which it would be tiresome to write out, but to do with multiple things being simultaneously present, some qualifying and some not. Bug fixed whereby using I7 to rerelease an existing I6 story file in blorbed format with bibliographic data would fail because of the lack of a room (needed to initialise certain room variables). Bug fixed whereby a few either/or properties could not be changed in play without spurious run-time problems being produced. (In particular, "now X is transparent" or "now X is opaque" caused problems.) Bug fixed whereby declaring that the player is a person who happens to be initially somewhere other than in the earliest-created room, or outside the map altogether, would cause programming errors or other strange phenomena at run-time. Bug fixed where a player attempting to UNLOCK a door which is "locked" but which, unbeknownst to the player, has no matching key, would cause a run-time problem complaining about the lack of a "matching key" property. Problem message added for trying to use "[something related by...]" to understand something which can have no relations. 4W37 (27 July 2007) This build adds 21 new examples and provides miscellaneous new features. Chief among these are substantial improvements to the parsing of names: nouns can now be recognized by their number or unit properties, and also by their relations, so that 'Understand "bottle of [something related by containment]" as the bottle' will parse BOTTLE OF SAND if and only if the sand is contained in the bottle. We have also made a tentative beginning on support for sound effects to match the existing support for illustrations. As usual a number of bugs are fixed, and although a few issues still remain (the current tally of open issues stands at 13, as compared with a peak of about 330 earlier this year) none are severe and most users seem to find that Inform is fairly reliable, so recent effort has gone into advancing the language rather than maintaining the compiler. INFORM FOR WINDOWS All tabs (save the settings tab) have a row of buttons at the top of the tab, allowing navigation and access to common functionality, similar to the OS X application. Fixed a bug preventing the installation of an extension with brackets in its name. Added support for multiple windows to the game tab. Any combination of text, grid and graphics windows can be opened by a game running within the application. Added support for graphics windows to the game tab. As a result, games using Emily Short's "Simple Graphical Window" and "Location Images" extensions will now work when run within the application. Added support for timer events to the game tab. Combined with the above, games using the "Graphical Window Animation" extension will now work when run within the application. If saving a project fails, the application now shows an error message. If the project was being saved as part of being closed, then after the error you get a chance to save to a different place. GENERAL >--> The kind "player-character" has been abolished. Previously, this was a kind of person able to be the player's persona in the model world: for most games, there was only one player-character in existence, the one automatically created by Inform and called "yourself". From this point onwards, any "person" can be the player, and indeed "player" is now a person variable, not a player-character variable. This means that the player object can now be any man, woman or animal in the source text, and these can be switched between freely in play. Moreover, we can much more simply specify who the protagonist is: Lord Bowler is a man in the Pavilion. The player is Lord Bowler. If we do not specify the player's identity, the "yourself" is still created and used as before. This change will affect only works which create "player-characters" in their source text: to adapt them to work again, it should be enough simply to change every usage of the kind name "player-character" to "person", "man", "woman" or "animal" as appropriate. This change implements proposal (6.56) from the January 2007 consultation document. >--> Up to now, all scenes have been able to take place many times: if a scene ends, and then later on its starting conditions once again hold, then it will start all over again. This is sometimes very useful, but also a source of confusion, and it has led to people writing "S begins when ... for the first time" over and over to stop S from recurring. As from this build, a scene can be declared either as recurring or not when it is first created. So for instance: Hourly Patrol is a recurring scene. Apocalyptic End is a scene. makes one of each kind of scene. (An ordinary scene can also be declared as a "non-recurring scene" for clarity's sake.) Note that any scene declared as just "scene", and in particular any scene declared in source text for previous builds of Inform, is now non-recurring: so if you need a scene to recur in a work-in-progress, you need to insert the word "recurring" into its definition. This change implements proposal (6.52) from the January 2007 consultation document, though in a slightly different way from that proposed. Partial sound support has been added to Inform: see the new sections 19.6 and 19.7 of the documentation. As with picture support, Inform provides the groundwork and leaves it for more sophisticated extensions to go into more elaborate facilities. The present state of completion is that Inform can, on all platforms, read Ogg Vorbis or AIFF sound files from the Materials/Sounds folder for a project, and embed them correctly into a Blorbed Glulx story file, compiling correct code for the Glulx machine to play the sounds back at the appropriate moment. However, these sounds will only be audible in Windows Inform, or when playing a released Glulx story file in Windows Glulxe or Spatterlight for OS X: Glulx support for sound has been implemented in the glulx interpreter used in both Inform and Zoom for OS X, so that placeholder text is printed instead. Sound support was proposal (6.61) from the January 2007 document. Up to now, the only properties which could be used as part of an object's name for parsing purposes were either/or properties and enumerated named properties. This restriction has been almost completely lifted: we can now understand properties whose kind is number, time, or a unit. For example: An aspect ratio is a kind of value. 16:9 specifies an aspect ratio. A television is a kind of thing. A television has an aspect ratio. The widescreen TV is a television in the Office. The fifties TV is a television in the Office. The widescreen TV is 16:9. The fifties TV is 4:3. Understand the aspect ratio property as referring to a television. ...allows us to type EXAMINE 16:9 TV, for instance. In addition, further grammar used to specify unusual values is now recognised in such situations: for instance if we wrote... Understand "European standard" as 16:9. the EXAMINE EUROPEAN STANDARD TV would also work. (Previously this did not work, because the implementation was incomplete.) Finally, a problem message has been added for the (now fairly few) cases where the property still does have a kind which cannot be parsed: previously no problem was issued in cases Inform could not handle, and the feature simply did not work. (This change did not appear in the January document, but has been much requested since.) A new form of grammar token has been added to enable names of objects (and rooms) to include names of other objects (and rooms) related to them. For instance, if we write: A box is a kind of container. Understand "box of [something related by containment]" as a box. The Toyshop is a room. The red box is a box in the Toyshop. Some crayons are in the red box. then TAKE BOX OF CRAYONS will work, because CRAYONS matches against "[something related by containment]" for the red box - or it does for as long as the crayons are there. We can have similar matches against relations of all kinds, but have to name the relation explicitly, using its one-word name. We can also reverse the sense: A box is a kind of container. Understand "box in [something related by reversed containment]" as a box. The Toyshop is a room. The crate and the hammock are in the Toyshop. In the crate is a box. In the hammock is a box. makes TAKE THE BOX IN THE HAMMOCK work. (Where more than one object matches the criterion, for instance if the original box contained both crayons and chalk, any of the names can be used.) Inform normally decides whether an object has a singular or plural name, or whether it has a proper name, by looking at how it is first introduced. This mainly works well, but people have also asked for more explicit control, especially to cope with changes in an object during play. Accordingly, there are now two new either/or properties for all things: A thing can be plural-named or singular-named. A thing can be proper-named or improper-named. This change implements proposal (6.46) from the January 2007 document. The phrase for changing the exits of a room can now accept "nothing" or, equivalently, "nowhere" as the new exit, thus allowing map connections to be explicitly deleted in play. For instance: change the east exit of Stage to nowhere; Bugs in type-checking to do with the handling of "nothing" have been removed. Some authors have recently asked for the facility to make extensions go uncredited in the VERSION command output, since this might give away story details, or generally produce verbosely self-laudatory output. A new "authorial modesty" use option has been created for this purpose. Inform has to tread a careful line here, because people make extensions available under a Creative Commons licence which requires that they be credited: so you can only be modest about your own work. If the sentence: Use authorial modesty. is found in an extension, then its credit line is omitted from the VERSION output of any game using it. If the same sentence is found in the main source text of a work, then credits are omitted for every extension with the same author's name as the work itself. (In other words, it credits everyone else's extensions, but suppresses mention of your own.) The "say" phrase "[list of extension credits]" uses the same convention, but the new "say" phrase: "[complete list of extension credits]" ignores all these efforts at modesty and prints the whole list. (An otherwise modest author might want to print this posthumously after the end of play, for instance, or in response to a secret debugging command.) The the ambient odour rule, the ambient sound rule and the block vaguely going rule now apply to actions by all actors, not just the player, so that (for instance) the command XERXES, LISTEN will be read as a request to listen to the ambient location, rather than printing out a parseresque objection such as "What do you want Xerxes to listen to?" The grammar "switch on [something]" has been added to the standard rules, and has the same effect as "switch [something] on". This is more consistent with switching off. The maximum length for an extension rubric has been increased from 250 to 500 characters. (Rubrics exceeding that length are silently truncated in extension documentation.) It is now allowed to create a temporary value (i.e., a local variable) with "let" whose name coincides with that of a thing, room or property. Previously this triggered problem messages, and was a particular problem for extensions and the Standard Rules, which had to avoid "let" names that might hit any of the things created by the user. (For instance, several people reported it as a bug that creating a property called "target" caused problems - this was because the Standard Rules use a "let" variable called "target" in places.) The resolution of noun phrases has been slightly changed so that a single-word kind of value name will take precedence over the name of a thing or room in an assertion sentence. For instance: The scene script is in the wardrobe. Grand Finale is a scene. would previously have read "scene" as a reference to the scene script, a physical thing, not the kind of value "scene". (This in practice makes it easier to have rooms and things whose names include the names of kinds such as "number", "time" and so on.) Examples: "Lanista" parts 1 and 2 added to demonstrate randomized combat, first in a simple form and then with weaponry and an ATTACKING IT WITH action "Night and Day" added to demonstrate recurring sequences of scenes "Candy" added to demonstrate making a randomly selected item poisonous "Puff of Orange Smoke" added to demonstrate redirecting all actions from one object to another "Disappointment Bay" examples changed to the more geographically accurate Disenchantment Bay; typo fixed in the final, finished example "Entrapment" modified to correct a bug due to changed handling of actions in recent releases of Inform "Terror of the Sierra Madre", which demonstrates player-switching, greatly simplified as a result of the abolition of player-character "Exit Strategy", demonstrating how to set up non-recurring scenes, removed (since all scenes are now non-recurring unless otherwise stated) "Pine 3", "Pine 4", "The Prague Job", and "Space Patrol" modified to reflect the usage of "recurring" scenes "Snip" modified to remove bugs and make use of the new ability to understand unit properties; "Snip Snip" withdrawn, as the hack it demonstrates is no longer needed and the same functionality was achieved instead by a single line added to "Snip" "Totality" (example about scheduling an eclipse) given a "test me" script, and a syntax bug removed "Dinner is Served" revised to work better when the object reached for is the second noun rather than the noun, and also to have less cryptic syntax; the test for the example has been extended "Tilt" added to demonstrate an implementation of a deck of cards using individual card objects, in which ranks and suits of cards are automatically parsed "Tilt 2" added to demonstrate an implementation of poker hands, where the cards in a player's inventory are described according to their value; illustrates use of a complex rulebook "Tilt 3" added to demonstrate use of text colors to make poker suit symbols appear in red, under both Glulx and the Z-machine "Aspect" added to demonstrate the automatic parsing of unit properties "Channel" added to demonstrate the automatic parsing of number properties "Channel 2" added to demonstrate a combination of advanced parsing features, in the creation of tunable televisions "Cheese-makers" added to demonstrate a TALK TO action tied to a scene-structured plot "Alias" added to demonstrate telephone-number-sized units functioning under Glulx "Claims Adjustment" added to demonstrate a camera that produces instant photographs of things; the photographs can then be referred to as in X PHOTOGRAPH OF APPLE "Puncak Jaya" added to demonstrate characters who can be referred to in their absence "Cinco" added to demonstrate containers referred to by their contents "Originals" added to demonstrate disambiguating objects from models of those objects "Removal" simplified to use action variables rather than the more complicated source "Gopher-wood" added to demonstrate the use of the proper-named attribute to change someone's name during play "Carnivale" added to demonstrate the simple scoping case of a large object that should be visible from other rooms "Rock Garden" added to demonstrate the simple scoping case of multiple rooms that can see into one another (as opposed to the rather more complex "Stately Gardens" which autogenerates a lot of room description as well) "Latin Lessons" added to demonstrate supplying a missing noun when the action is being performed by someone other than the player "Uber-Complete Clavier" (the big Unicode test) slightly changed so that it can now be compiled for Glulx as well as the Z-machine Paragraph breaking adjusted in "In Fire or in Flood", "Misadventure", "Goat-Cheese and Sage Chicken", "Owen's Law" Minor typos removed from "Wight", "Alpaca Farm", "Apples" Extensions: "Glulx Text Effects" modified to make it easier to set custom colors for text in Glulx; this appropriates the color-management source from the extension "Simple Graphical Window" by Emily Short, so those using Simple Graphical Window should update to version 4 of the extension in order to avoid overlap. Advanced to version 2. "Punctuation Removal" revised to include a phrase that corrects instances of "mr.", "mrs.", etc., to "mr", "mrs", and the like, to get around parsing frustrations commonly encountered with these titles. Also added the means to remove apostrophes as well as the other punctuation marks; example added for parsing such phrases as "Jack's tie" if and only if Jack is currently wearing the tie object. Version number advanced to 3. A bug fixed in "Complex Listing to deal with the marking of regions"; version number advanced to version 5. Bug fixed in the screen-width-determining routine of "Basic Screen Effects". Bug fixed whereby past tense conditions in the form "in ... for the first time" would sometimes have the temporal requirement ignored, particular in the preambles to rules like: Every turn when in the Hall of Mists for the first time; Bug fixed whereby actions by people other than the player would sometimes disrupt action-based rules counting the number of turns during which a particular condition had been true, causing this count to spuriously reset to 0. Bug fixed whereby rules which depend on action taking place at the same time as a compound condition would sometimes produce spurious problem messages: for instance, Check turning the dial to when the number understood < 0 or the number understood > 99: ...is valid but generated a problem message in 4U67. Bug fixed whereby "otherwise if ... begin" (which is incorrect since otherwise if divides the existing code block, rather than beginning a new one) led to I6 errors rather than a problem message. Bug fixed whereby using "(called ...)" to create temporary named values at a time in the past such that they could not survive to the present would lead to I6 errors rather than a problem message. Bug fixed whereby rules taking effect if "doing something to ..." and some description would sometimes false take effect when the action took a non-object as its noun, when the value which happened to have been typed coincided with the internal object number of an item matching the description. Bug fixed whereby changing player to someone else and then back again, and then using the short name of the player, would crash both the Z and Glulx virtual machines at run-time. Bug fixed whereby I7 would crash if told to understand empty text as something. (This is not allowed, and a problem message has been added.) Bug fixed whereby scenes predicated on past tense actions ("Mayhem begins when we have waited") would cause an internal error. Bug fixed whereby the condition "we have taken inventory" gave false positives after the first turn. Bug fixed whereby nameless variables attached to activities gave internal errors rather than a problem message. Bug fixed whereby creating an object called "nowhere" caused a crash rather than a problem message. Bug fixed whereby grammar introducting alternative textual names for numbers (e.g. 'Understand "a/b/c" as 2.') could lead to I6 errors. Bug fixed whereby vaguely named properties in adjective definitions would result in internal errors rather than a problem message. Bug fixed whereby naming actions which happen to include "with" can create spurious out-of-play things (doing no harm, but doing no good either): for instance, "Unlocking the box with the key is bizarre behaviour." would create an object called "Unlocking the box", in addition to doing what it was supposed to do. Bug fixed whereby matching the player's command against text rather than a topic would cause an interpreter crash at run-time. Bug fixed whereby verbs defined as auxiliaries required participles to be named unnecessarily, contrary to the documentation: thus "The verb to be able to approach implies the approachability relation." would fail for no good reason. A bug introduced by the actions rewrite in 4U65 caused player's holdall objects not to work properly if they were being worn rather than carried (as in the documentation's example "Sackcloth"). This is fixed: apologies. In past builds the grammar token "[a number]", in Understand sentences, has required the number in question to be something which can be stored in a signed 16-bit variable, that is, to be between -32768 and 32767. This is correct for story files running on all versions of the Z-machine, but the Glulx virtual machine has 32-bit variables, so for Glulx the restriction is unnecessary. It has now been lifted: thus on Glulx, we can parse numbers in the range -2147483648 to 2147483647 inclusive. The Inform 6 debugging verb DAEMONS (aka TIMERS), which is undocumented and meaningless in I7 since this lacks either daemons or timers in the crude I6 sense, could under some circumstances crash if tried in an I7 game. The verb is now removed altogether. 4U67 (7 May 2007) This build, for Mac OS X only, is identical to 4U65 except for the OS X user interface, in which the secondary controls in the various different panels have been harmonised into new-style bar icons. (In addition, new forward and back arrows provide the long-requested "browser-style history buttons".) We are releasing this now rather than waiting because it also fixes the minor but annoying bug to do with selecting detail pages in the Actions index (see the 4U65 release notes). 4U65 (27 April 2007) This build once again fixes all bugs reported up to 22 April, but in fact few were found in 4S08; and it removes a hole in the type-checking system, to do with phrases to make decisions, but this will have affected few users. The main aim is an across-the-board reform of how actions are handled and implemented in Inform. Proposals (6.33), (6.35), (6.37) and (6.39) from the January 2007 consultation document are all carried through. It is now much easier to create actions which work equally for all actors, and which need a complicated interaction of rules to work. INFORM 7 FOR MAC OS X >--> A minor bug in the OS X application means that viewing the new details pages for actions in the index will cause the application to think we have switched to the Documentation panel, with the effect that the tabs normally present for switching between index pages will disappear: switching panel and going back to the Index will cure this. Apologies for the inconvenience: the bug will be fixed in the next release. Fixed bug in 4S08 for OS X only which caused Inform to create spurious empty Materials folders in cases where this was not really necessary (although this did no harm, and could not damage any existing Materials folder). INFORM 7 FOR LINUX i7 now has the -r story-directory and -c story-directory command-line options. These force it into non-interactive mode, where it compiles or releases the story file and exits. They can be combined with -s (for settings) and -p (for prefix of installed inform7 package); see the man page for details. It is hoped that these options will be useful for IDE authors. INFORM 7 FOR WINDOWS Skein and Transcript improvements: A single click on a red badge in the skein is enough to go to the knot in the transcript, rather than a double click as before. Any knot can be shown in the transcript by selecting "Show in transcript" from the context menu or clicking on a red badge, not just knots in the current thread. A knot selected in the above way is now indicated in the transcript by having a thin blue border around it. The last played knot is now indicated in the transcript by having a yellow border around it. The thick line in the skein now always shows the thread that is visible in the transcript. The new menu item "Play All Blessed" plays through all threads that end in a knot with an expected transcript. If the expected text in the transcript tab is double clicked on, the window goes into edit mode, in which the expected text can be amended. When editing the expected text in the transcript tab, holding Ctrl+Enter adds a carriage return to the expected text. RULEBOOKS Variables can now be given to rulebooks. For instance: The every turn rulebook has a number called accumulated bonus. creates a variable called "accumulated bonus", which holds a number. Such variables are initialised to the default values for the relevant kind when the rulebook starts, and are accessible only within rules belonging to that rulebook (or which have historically belonged to it, but been displaced by a "listed in... instead" sentence). Rulebook variables have a namespace of their own: so their names can freely clash with those of things, rooms, etc.) If the rulebook should recursively start again within itself, each new run-through of the rulebook has its own set of variables. In short, they behave exactly like "let" values except that they last for a whole rulebook, not an individual rule or To phrase. (This was (6.33) in the January document.) As we can now add a potentially unlimited number of new clauses to the descriptions of actions to say whether or not rules apply (see below), Inform must refine its method for sorting rules in order of how specific they are. The rules on "going" are unchanged and we believe that no pair of existing rules not using the new features will have their orderings changed in any rulebook. Rules which do use new clauses are now subject to a new sorting principle, "III.2.4 - Action/Where/Other Optional Clauses". This follows the standard conventions. ACTIVITIES Variables can also now be given to activities. These are created just before the "before" rules for the activity begin, and destroyed when the "after" rules end (or when the activity is abandoned, though this is a rare occurrence). They are visible to the rules for that activity, and nowhere else, and again they have their own namespace; again, if the activity should happen a second time within its first run, that second occurrence gets its own copies of the variables. A simple example of an activity variable: Analysing something is an activity. The analysing activity has a text called first impression. Before analysing: now the first impression is "unremarkable". Rule for analysing someone: now the first impression is "living tissue". After analysing something (called the sample): say "Your professional opinion of [the sample] is that it is [first impression]." Instead of examining something (called the sample): carry out the analysing activity with the sample. If an activity is called X, we can now also refer to it as "the X activity" for clarity's sake. (As with rulebooks called Y, which can already be called "the Y rulebook". This has been done in order to make the syntax for creating activity variables more explicit in its intentions.) ACTIONS Variables can also now be given to actions. These are created just before the "before" rules for the action begin, and destroyed when the action ends (by whatever means that should happen). If one action is interrupted by another, the new action gets its own copies of these variables. The names of action variables are visible only within rules in action-based rulebooks ("before", "carry out", etc.). But note that every action's variables are visible to every such rule - as has to be true, because we can have "before" rules which take effect for many different actions, for instance, and such rules might need access to any of their variables. In consequence, there is only one namespace for all action variables: if two different actions name a variable "item", say, clashes will occur. As a result, action variables should be named in a way marking out to which action they belong, and we recommend including the past participle of the action name - so for instance, "vehicle gone by", "door gone through", "sticky item taken", etc. A simple example of an action variable: The singing action has a text called the lyric sung. Before singing: now the lyric sung is "Destruction of the empty spaces is my one and only crime." The block singing rule is not listed in any rulebook. Carry out singing: say "You cheerfully warble: [quotation mark] [lyric sung][quotation mark][paragraph break]". One more warning: since any action-based rule can see all the action variables, it's possible to refer to the variables for an action which is not actually happening. For instance: Before doing something when the lyric sung is "Yesterday..." would compile without problems, but fail at run-time when any action other than singing was tried. In the above example, the variable "lyric sung" was set in a before rule. In practice, though, it might be needed by other before rules, and then the order of operation of before rules would become uncomfortably important. To get around this, a new rulebook has been created: the "setting action variables" rulebook. For instance, we could write: Setting action variables for singing: now the lyric sung is "Mystifying eyes." This rulebook is run through before even the before rules, and could be used to detect the context and set variables accordingly: but it does not have any power to stop or change the action, and its rules should ideally say nothing and do nothing other than set rulebook variables, please. (Such a rulebook must work for any actor, not just the player: so if the idea is to set variables based on the local situation where the action will take place, look to see where the "actor" is, not where the "player" is.) There is a new kind of value built into Inform: "action-name". (As its hyphenated name suggests, this is primarily intended for internal use, but there are no restrictions on it.) An action-name identifies the particular action but none of the nouns attached: it corresponds to numerical Inform 6 values such as ##Go. When an action called X is created, the constant value "the X action" is also created: thus "the looking action", "the putting it on action", etc., are all valid constant values of this kind. (For those who wish to make variables properties, table columns, etc., of this kind, the default value is "the waiting action", that being a sort of zero among actions.) It is now legal to declare a "specification text" for an action, analogously with kinds, and this is used in the Actions index. ACTION-BASED RULES Inform source text describes actions with so-called "action patterns", and these specify among other things who the actor must be. Up to now, there have only been two ways to specify the actor, as in these examples: taking a container X trying taking a container The former means the actor must be the player: the latter allows any description X so long as X is not the player. Thus, someone trying taking a container allows the actor to be any person in play except the player. This made it impossible to write a single rule applying to any actor equally. A new third form has been added to allow for this: an actor taking a container For instance, we could write: Instead of an actor jumping: ... This implements proposal (6.35) in the January document. The second form of actor description above is often found to be clumsy: Before X trying taking a container... try X trying eating the cake... Here the word "trying" is cumbersome. In a few cases it is needed to make the text unambiguous, and if the description of the actual action is the name of a kind of action, it is positively a good thing: Before X trying risky behaviour... but very often it is a nuisance. The word is now optional provided that: (a) the actor is described using a description ("someone", say, or "Captain Haddock") or a variable name; (b) the eventual action is something explicit (like "taking...") rather than a named kind of action (like "risky behaviour"); (c) the action is being used in a "try" (or other phrase with an action as its parameter) or as the premiss for a rule. In other cases, "trying" will remain obligatory, but in practice they will be very few. The Examples for 4S08 contained some 120 uses of "trying" between them: this reform enabled every "trying" to be removed except one, Instead of someone trying disorderly conduct in the presence of the policeman: where it would clearly not be grammatical to remove it anyway. As mentioned above, every action variable is visible from every action rule. But so far they have all been specific in nature to particular actions: for instance "lyric sung" makes no sense for non-singing actions. But we can also make general action variables, also visible from all action rules, by creating variables for the "action-processing rulebook". This is really a concept which has always existed - "noun" and "second noun" are exactly such variables. Joining them henceforth is "actor": the person trying the action. >--> Thus if existing source text contains references to something called simply "actor", perhaps in a work of IF about the theatre, it may now fail to work. (Something like "stage actor" or indeed "thespian" would of course work instead. When we made this change it affected only one of the Inform examples: Ballroom, which was previously using "actor" as a let value in just such a rule - we changed it to read "dancer" instead.) Although the following is a bug fix, it is worth recording as a change in behaviour. The room description at the end of a going action to a new location is not technically the result of a looking action. (It doesn't quite do a LOOK: for instance, it suppresses the body text for a room visited before, and the paragraph spacing is different, etc.) In principle, then, during such a room description the action ought still to be "going", but that means that a rule such as After printing the name of a person while looking: ... would not take effect, which is clearly incorrect. This bug has been fixed and such a rule now takes effect. It has always been the case up to now that the "going" action had a special status in Inform: it allowed special clauses such as "... through ..." (for the door gone through) not allowed for any other action, and this behaviour was hard-wired into the syntax of the language. The ability to create such clauses is now available to any action. For instance, the following adds "...into..." and "...onto..." to Inform's syntax for writing rules about dropping: The dropping action has an object called the container dropped into (matched as "into"). The dropping action has an object called the supporter dropped onto (matched as "onto"). Rule for setting action variables for dropping: if the actor is in a container (called C), now the container dropped into is C; if the actor is on a supporter (called C), now the supporter dropped onto is C. What's new here is the "(matched as...)" clause attached to the action variable. We have declared that "... into X" should test to see if the action variable "container dropped into" matches X, and similarly for "onto". As a result, we can now write: Instead of dropping something onto something, say "Don't drop things onto platforms or ledges." Instead of dropping something into an open container, say "Don't drop things into open containers." (Note that these clauses are only descriptions of the action: it makes no sense to write try dropping A onto B; since the question of whether or not B is dropped onto depends on where the player is, and is not something we can choose. Note that this is exactly the same position as "going" was in before: for instance, try going east from the Ballroom; was and is not allowed, because the question of whether it's from the Ballroom or not depends on where the player happens to be.) This change implements proposal (6.37) in the January document. In previous builds, Inform has used a messy compromise in its handling of check, carry out and report rules. These sometimes look to the user as if they are single rulebooks: as if "check", for instance, is on a par with "before" (which is indeed a single rulebook). In fact, for efficiency reasons, there are individual check rulebooks for each action, as shown by the diagram at 12.2 in the documentation. Up to now, it has been legal to write a rule like Check doing something: ... even though this clearly can't belong to any rulebook in the diagram at 12.2. What was actually happening was that the checking stage used _both_ a single generic "check" rulebook _and_ a family of rulebooks with names like "check taking". Rules defined in the Standard Rules would always go into the individual rulebooks, but most (not quite all) rules created by the user would end up in the generic "check" rulebook. While this gave a pretty convincing illusion that all was well, it led to violations of the rule-sorting principle that specific rules come before generic ones ("check doing something" would come before "check taking an open container in the presence of a vehicle when the time of day is 11:13 AM", say), and attempts to explicitly list rules into these rulebooks could have odd consequences because of misunderstandings between "check" and "check taking", say. Moreover, for implementation reasons, the actions in the Standard Rules created check, carry out and report rulebooks with funny properties which no other rulebooks had. All of this has been abolished: - the position is now strictly as shown in the diagram at section 12.2: there are now no generic "check", "carry out" or "report" rules. - all such rules are now placed into rulebooks specific to the actions they belong to. Thus, e.g., Check an actor going: ... is filed in the "check going" rulebook. - problem messages now result from creating rules such as Carry out doing something: ... Report dropping or taking a container: ... which cannot be filed into single unambiguous rulebooks; - the Standard Rules now use the same action-creating syntax and semantics as anyone else. The one respect in which "check A", "carry out A" and "report A" rulebooks are unlike other rulebooks is that rules in them do not check that the action is indeed A. This is partly because there is no need (if we are looking at the check taking rulebook, the action must be taking) but mostly so that a single rule can be explicitly placed in the check (etc) rules for more than one action at once. For instance, if we write: Check an actor taking (this is the hypothetical rule): ... and then say The hypothetical rule is listed in the check removing it from rulebook. the rule can be effective in both rulebooks: if it tested to see that the action was taking, it would never have any effect in the check removing it from rulebook, and thus it would be impractical to share rules between more than one of these rulebooks - which would be inconvenient to the Standard Rules, and also to extensions wanting to consider or abide by rules from one action while processing another. We appreciate that this will cause a small amount of pain (we had to change 7 not-specifically-action-worded rules in the Inform examples) but we think the pain is worth it for the simplification resulting, and most such rules are fairly easy to recast. For instance, Carry out doing something: ... can probably become Instead of doing something: ... continue the action. without any practical change in the outcome. Detailed index pages on individual actions now appear in the Index. We hope these give a truer picture of what happens to any given action, by showing every rule which can affect it, and making the sequence more explicit. Problem message added to catch action descriptions which name unknown actors (e.g. "Xerxes the Otherwise Never Mentioned examining the bucket" was being read as simply "examining the bucket"). THE BUILT-IN ACTIONS Inform provides about 70 built-in actions which form part of the model world. (That is, not counting out-of-world actions such as saving the game.) In previous builds these have been implemented using a special action definition syntax reserved for use of the Standard Rules only, and consisting essentially of tables of rule names against I6 identifiers: all the rules involved were implemented by I6 code. This was bad because it meant that the built-in actions were treated as special in all sorts of ways (not a very clean design technique) and because it was quite hard to work out how the built-in actions worked, since one needed to be able to puzzle out the I6 code at the bottom of all this. On the other hand, it had the advantage of speed, since Inform did not have to read and compile the built-in action rules from I7 source text. As discussed in the January document at (6.39), there are trade-offs here, but we have now bitten the bullet and reimplemented all of the (not out of world) actions in I7 source text. THE GOING ACTIONS The "going" action is the second most complex in Inform ("looking" probably takes the palm) and the re-implementation in I7 has turned up two bugs which have also been fixed. In addition, numerous rules have been renamed or removed: - the can't go through concealed doors rule has been renamed the can't go through undescribed doors rule ("undescribed" being the I7 word for what I6 called "concealed"); - the following rules have been abolished: set up going rule check to see if in a vehicle rule determine direction property rule print textual map connections rule consult routine map connections rule determine what's through door rule These all clumsily worked out what we now regard as action variables, except for the textual and routine map connections rules, which were to provide backwards compatibility with traditional I6 use of the map properties, which I7 doesn't recognise or use; however, we retain the determine map connection rule whose purpose now is to recalculate the "room gone to" variable immediately before the "can't go" check. (This is done because people often use before rules to modify the map, in order to make dynamic map structures which respond to movement.) - in the check rules, the can't go that way rule has been moved to after the rules checking on undescribed and closed doors: after all how is one to know that a door leads nowhere if it is closed? But if you do succeed in opening such a door and try going through it, the traditional I6 response "You can't, since the X leads nowhere." has been restored in place of I7's recent practice of simply saying "You can't go that way." A bug has been fixed which caused a person other than the player getting off something to be reported as if he were getting out of it. THE LOOKING ACTIONS The following rules have been abolished: consult LookRoutine entry point rule standard searching rule The former provided vestigial I6 support; the latter in all cases did nothing. THE OBJECT MOVEMENT ACTIONS Under the taking action, actors other than the player can now also use a "player's holdall" (if carried) to overcome carrying capacity limits. The following rules have been abolished: default inventory style rule check let-go-before rule check let-go-after rule check receive-before for supporter rule check receive-after for supporter rule check receive-before for container rule check receive-after for container rule These provided vestigial I6 library support and are irrelevant for I7. The following rules for the removing it from action have been abolished: can't remove from closed containers rule check after-rules for taking too rule standard report removing rule They had no effect in 4S08, having been pre-empted for some time by the automatic conversion of removing to taking: they had been left in the Standard Rules by accident but could never have any effect. Similarly: the can't insert component parts rule was redundant in 4S08 and has been removed. THE ACTIONS WHICH CHANGE THE STATE OF THINGS When the opening action by the player is successful, Inform shows the contents of what was opened, provided it was opaque (so that the contents were previously not visible) and provided that the player is not inside it. The rule causing this was called the reveal any newly visible exterior rule which is a misleading - it has been renamed the reveal any newly visible interior rule THE ACTIONS INVOLVING OTHER PEOPLE The following rules have been abolished: check life property for giving rule check life property for showing rule check life property for waking rule check life property for throwing at rule check life property for attacking rule check life property for kissing rule check life property for answering rule check life property for telling rule check life property for asking rule check thrown-at rule These provided vestigial I6 library support and are irrelevant for I7. As for the do-nothing actions (see below), these are now also handled symmetrically for all actors. (Thus, for instance, the block attacking rule now blocks any actor attacking any other.) THE DO NOTHING ACTIONS The actions indexed as "Actions which always do nothing unless rules intervene", which consist only of a single checking rule to block them, behaved asymmetrically in previous builds since they blocked the action for the player, but allowed it to run through untouched and with no rules applying for any other actor. This could result in odd transcripts such as: > SING Your singing is abominable. > PETER, SING > ...because no rules at all fire for Peter trying singing, so the action succeeds by default, and nothing is said or done. In this build, the blocking rules for do-nothing actions now block all actors. Thus: > PETER, SING Peter is unable to do that. or with ACTIONS switched on: > PETER, SING [asking Peter to try singing] [(1) Peter trying singing] [(1) Peter trying singing - failed the block singing rule] Peter is unable to do that. [asking Peter to try singing - succeeded] This affects the actions: Saying yes, Saying no, Burning, Waking up, Thinking, Smelling, Listening to, Tasting, Cutting, Jumping, Tying it to, Drinking, Saying sorry, Swearing obscenely, Swearing mildly, Swinging, Rubbing, Setting it to, Waving hands, Buying, Singing, Climbing, Sleeping >--> While this is much more logical, and means that every (non-out-of-world) action in the Standard Rules now works equally for all actors, it does mean that a rule in the form: After Peter trying singing: ... will no longer work, because Peter's singing action will be blocked and never reach the "after" stage. To get around this: Instead of Peter trying singing: ... the rule succeeds. Note the last line, forcing the action to be considered a success: actions stopped by instead rules are normally deemed to fail, but making this succeed means that no "Peter is unable to do that." text will be printed. PHRASES Inform has been made a little stricter in when it allows certain phrases to be used. For instance, the phrase "decide on X", which chooses a value X, is now only allowed in a phrase "To decide which ..." - of course it didn't make sense anywhere else, but this is now policed. Similarly, "decide yes" is now restricted to phrases which need to decide if something is or isn't true, and so on. (We're pretty certain that this new check only rejects uses which do not at all achieve what they look as they ought to do.) Similarly, "decide on X" now checks the kind of X to see if it matches the required kind. This may produce problems either at compile time, or at run-time. Note in particular that "nothing" is forbidden as a value to decide on if we are required to produce a particular kind of object such as, say, a "room", but is allowed if we are only required to produce an "object". (This agrees with the conventions used for variables.) Finally, phrases to decide a value now return the default value of the appropriate kind if execution runs through to the end of the definition without having reach any "decide on X" phrase. Problem message added to explain why two bracketed phrase terms immediately next to each other, with no word in between, is against the rules - e.g. "To combine (X - a number) (Y - a number)". (Previously Inform would allow the definition, but then never recognise it in source text, which was not a very helpful way of rejecting it.) Bug fixed whereby setting up a phrase "To decide what X is ..." might read X as a description of a thing rather than a kind of value in cases where X is both the name of such a kind, and also part of the name of a thing. (For instance, if there is an object somewhere called "number puzzle", then a phrase "To decide what number is ..." was being misread as if its type had to be always the number puzzle object, not a number.) PROPERTIES Two changes have been made to the way that assertions about either/or properties of kinds are read. To demonstrate, consider the sentence in the Standard Rules which reads A thing is usually inedible. What if we want to contradict this? In previous builds, we could write: A thing is never inedible. This worked, but owing to a bug, A thing is always edible. did not work - this bug has now been fixed. In either of these sentences, we undo the sentence in the Standard Rules by writing a sentence which is more definite - certain ("never", "always") rather than merely likely ("usually"). But what if we don't want extra certainty? In previous builds, writing A thing is usually edible. would have no effect, because when two inferences are drawn about the same property which contradict but which are each uncertain, the original first-drawn inference is allowed to stand, and the second is ignored. This convention has been reversed in the case of inferences drawn about properties of kinds: A later uncertain assertion about a property of a kind beats an earlier uncertain assertion about the same property. Problem message added for saying that a kind has an either/or property without previously having said that it can have that property. This would usually not work anyway, but in previous builds, saying "K is usually openable." would make it so: Inform now insists that we write "K can be openable. K is usually openable.", as the documentation implies. (The examples A Haughty Spirit and Disappointment Bay 12 needed to be corrected in just this way.) Problem message added (rather than internal error) to reject implications where the implied outcome is a value property rather than a simple either/or property like open/closed. Problem message added to explain why "D can be X or Y" makes no sense if D is something qualified by adjectives - e.g. "An open door can be rickety or sturdy" makes no sense because the door still has to have the property even at times when it is not open. (Previously Inform simply ignored the adjectives, and assigned the property to the underlying kind.) Bug fixed whereby saying "now X is P" could be misconstrued if P refers to a property but does so inexplicitly: for instance, "now X is the colour of the button" would try to change X to be equal to this colour whereas "now X is green" would simply change the colour of X. Both forms now change the properties, not the identity, of X. Bug fixed whereby large numbers of either/or properties created for things, followed by an either/or property being created for rooms, would sometimes lead to bogus programming errors at run time. Bug fixed whereby creating a new either/or property but giving its antonym as an existing one would sometimes wrongly be allowed, leading to peculiar run-time problem messages. (E.g. writing "The Catwalk can be flaming or unlit." causes this, because "unlit" is already the antonym of "lit", a property of things.) Bug fixed whereby certain complicated forms of property assignment in assertions could cause an internal error (e.g., "Blinky is an ephemeral ghost with reaction "Boo!"."). EXAMPLES New example "Croft" added to demonstrate action variables. The now usually unnecessary word "trying" (see above) has been removed from most of the examples involving actions. MISCELLANEOUS Problem messages added for creating table columns whose names are articles or existing values such as literal numbers. Problem message added (rather than internal error) for initialising a K that varies (where K is a kind) to the value "nothing". This is legal for an object that varies (though in 4S08 a bug blocked this), but not where the variable always has to hold something of a given kind. Problem message added (rather than internal error) for an attempt to total the column of a table rather than a property. Problem message added (rather than eventual I6 errors) for defining plurals using quotation marks, e.g., writing 'The plural of "coin" is monies.' rather than 'The plural of coin is monies.' Better problem message added for close square brackets used wrongly as literals in quoted text. Bug fixed whereby continuations of tables would sometimes wrongly be reported as containing columns not found in the original tables, and would sometimes (even when they worked) have their columns incorrectly matched up to the original table, in cases where the columns had been reordered. Bug fixed whereby a compound sentence asserting a relationship both with a new specific object and also a new object described only generically by naming its kind, as in: The big box contains a container and Peter. ...would fail complaining of an overly complicated relationship. Bug fixed whereby the word "visible", redundantly used in a grammar token as in e.g. Understand "inspect [any visible thing]" as examining. would cause a hang because I6 scope loops can't be nested. Bug fixed whereby hanging dependent clauses which depended on local variables would sometimes be construed unexpectedly. (This really only affected descriptions which were not very useful anyway, e.g., "the number of things worn by X which fit Y", which is not good style since it in fact evaluates the number of things worn by an X-which-fits-Y - that is, the "which fit Y" clause appends to X and not the things.) Bug fixed whereby the "after reading a command" rulebook would sometimes fail to be able to replace matched text in a command in cases where it had been rewritten as a result of a "Which do you mean...?" question. Bug fixed whereby the character @ could not be parsed at run-time, and an attempt to write something like 'Understand "@" as the giant at-symbol' would produce I6 errors. Bug fixed whereby expressions containing more than one bracketed subexpression would sometimes be misparsed: e.g. "let a be (x + y) / (x - y)" would produce spurious problem messages despite being legal syntax. Bug fixed whereby Definitions involving looking up entries in tables would sometimes compile through I7 but cause I6 errors. Bug fixed whereby calculations of the other side of a door, or the direction taken by a door, would sometimes be incorrect in darkness. Bug fixed whereby problems to do with variable initialisation were reported at the correct sentences but under the wrong headings. --------------------------------------------------------------------------- 4S08 (25 March 2007) This build represents a substantial update in five respects: it fixes all known bugs - some 335 bug reports have been acted on since 4K41 and the database of open bug report forms is now empty for the first time since the public beta was released as 3K27; it introduces the first batch of improvements proposed in the January 2007 consultation document (called simply "the January document" below); it makes the first real reform of paragraph-spacing since 3K27; it makes the first tentative steps towards Inform 7 for Linux, though at present as a command-line system without the graphical user interface; and it is accompanied by more supporting materials than previous builds, notably free-standing documentation and a formal grammar. Inevitably it has a lengthy change log, which is grouped thematically below. Enough minor changes have been made to the interpretations of syntax that authors of any large work in progress will find at least one or two things they need to change. Possible trouble-spots are marked with an arrow >-->. INFORM 7 FOR LINUX Inform 7 is now available for Linux for the i386, ppc, armv5tel, and s390 architectures. All compilers and interpreters supplied as part of the Inform 7 package are statically linked and should have no dependencies beyond stdio. The i7 shell itself is written in Perl, but does not require any modules not customarily shipped as part of the Perl distribution. The only additional dependency is the uuidgen program; this is part of the ext2tools package and has so far been present as part of the default installation on all systems we have examined. Installation instructions can be found in the file INSTALL, and operational instructions in README or the manual page installed by the Inform installer. Users on Intel 386-and-descendants machines should download the package I7_4S01_Linux_i386.tar.gz. All users on other architectures should download I7_4S01_Linux_all.tar.gz. The difference between these two is simply whether or not non-i386 compilers and interpreters are bundled - the "all" version will function perfectly well for Intel users, but it is substantially larger to download. The correct set for your architecture will be detected at installation time. INFORM 7 FOR MAC OS X The OS X application contains a number of bug fixes in the CocoaGlk layer, that is, to the underlying interpreters used in the Game panel. INFORM 7 FOR WINDOWS Pasting text into the source panel should no longer lose any trailing carriage returns. Echo streams are supported in the game panel's Glk implementation. Skein and transcript improvements: Knots that have been played in a game session are coloured yellow, and all other knots are coloured green. Knots with blessed text are lighter than those without. If the last played text for a knot does not match the blessed text, the node is shown with a red badge. Double clicking the red badge goes to the appropriate point in the transcript tab. The skein's context menu has been reworked to match the OS X application. A confirmation dialog appears when deleting a locked knot. Threads are automatically locked when blessed or when a label is added or changed. Bug fixed whereby blue "link to documentation" icons were, in the most recent Windows build, in some cases off by one or two sections. SUPPORTING DOCUMENTATION As from this build, we are uploading the "Writing with Inform" documentation in two plainer formats than those already available: plain text, and a zipped archive of minimally-tagged HTML files. We hope that this will make reference easier for those using screen-reading software, in particular. (This was (6.7) in the January document.) We are also uploading a PDF document extracted from the NI source code which specifies the formal grammar read by NI (or rather, that part of it not already specified in the Phrasebook index): in the January document we expressed scepticism that this would really be useful, but responders disagreed. We continue to be sceptical, but it wasn't too hard to generate the document, so here it is. EXAMPLES AND EXTENSIONS INCLUDED WITH INFORM Examples: Added "Apples" to demonstrate "asking which do you mean" rules. Added "Ahem" to demonstrate phrases with alternate elements (the 300th example to be written). Added "Pages" to demonstrate phrases pertaining to specific values Added "Hover" to demonstrate interior descriptions of vehicles placed before the rest of a room description. Added "Walls and Noses" to demonstrate advanced modification of the disambiguation question. Added "Electrified" to demonstrate modification of the action-processing rule sequence. Added "Straw Boater" to demonstrate testing for the default text "". Added "Ferragamo Again" to demonstrate phrases applying to specific objects. Added "Mattress King" to demonstrate modifying the action to push things between rooms. Added "Lollipop Guild" to demonstrate turning off implicit takes when eating an object that is fixed in place. Modified "Abolition" to reflect changes in the handling of "to" in action names. Corrected "Neighborhood Watch" to add a check for cases where the door is already locked or unlocked. Assorted minor changes to examples to handle spacing changes. Extensions: Locksmith: advanced to version 3 and made modifications due to the new spacing mechanisms. Glulx Image Centering: Corrected documentation. Rideable Vehicles: advanced to version 2. Rules added for people other than the player to mount and dismount vehicles; rule names given to the existing rules, so that they may be more easily revised or replaced by the user of the extension. >--> Plurality: advanced to version 5, and forms of phrases changed to is-are (etc) rather than is/are. This will require authors using Plurality to do a search and replace to change formats. (Sorry.) >--> Complex Listing: advanced to version 4, and forms of phrases change to is-are (etc) rather than is/are. This will require authors using Complex Listing to do a search and replace to change formats. (Sorry.) Behavior of "[prepared list]" changed to use no articles, just as "[list..." uses no articles now in Inform by default. More flexible phrasings added to several phrases, so that "prepare list..." is accepted as well as "prepare a list...", and "register the things..." is accepted alongside "register things...". Menus: advanced to version 2. Added options allowing up and down arrows to function properly under Glulx. KINDS OF VALUE When Inform has to initialise variables or property values, but the source gives no value, it uses a default value for the appropriate kind of value. For instance, a number is 0 unless otherwise specified, and a text is the empty text "". The Kinds index (in which a number of minor bugs have been fixed) now tabulates the default values used for each kind of value which can be stored in variables or properties. (This and related changes following cover (6.34) in the January document.) It is now legal to declare a "specification text" for a kind of value, analogously with kinds of object, and this is used in the Kinds index. New scene "Entire Game" created which, as the name implies, contains the whole of play except for the posthumous restart, restore or quit conversation. (This is the default value for scenes.) The constant "nothing" now means the absence of an object, in the context of testing an object-valued variable or property to see if it holds the default value for "object", and is also useful when looking at the result of things like "best route from the Drawbridge to the Keep" (if there is in fact no route). Problem message added to explain more fully when an action name is used as a new value (for instance, if we write "Lamp strength is a kind of value. The lamp strengths are burning and gone out.", then "burning" would clash with the name of the action). Bug fixed (in consequence of above) whereby creating but not initialising a scene variable or property caused an internal error. Bug fixed whereby comparison of a text with "" often gave false negatives. NAMED VALUES >--> When ambiguous values occur, local variable names (created by 'called' or by 'let') are now given priority over other possibilities. When a "(called...)" name appears in a rule, any article used will not be taken as an immutable part of the name. For instance, "Instead of examining a door (called the portal): ..." will now create a temporary value called just "portal", not "the portal". Of course, "the portal" can still be used to describe this value, but now being parsed as "the" + "portal", and this means that text substitutions "[a portal]" and "[the portal]" can differ. Problem message added to forbid the use of "(called ...)" when giving a complex range of things to be repeated through: this was accidentally allowed in previous builds, and produced subtly incorrect results. Problem message added (in place of internal error) to catch attempts to use local values created by 'let' or 'repeat' or 'called' in past-tense references which pertain to times when they did not exist. Problem message added to report contradictions of kind when a variable is declared more than once and each time as a kind of object. Bug fixed whereby conditions involving negated existential quantifiers, and giving called names to the results, would sometimes incorrectly fail. (For instance, "a person who is not wearing anything" would work but "a person (called the extrovert) who is not wearing anything" would fail. The negated existential here is the clothing being worn - which is required not to exist.) Bug fixed whereby "a random D", where D is a description including a "(called ...)" clause, would (although legal) cause I6 errors. Bug fixed whereby variables set up with non-existent kinds ("Z is a bogosity that varies") would sometimes produce internal errors rather than a problem message. TEXT >--> Inform has a fairly delicate mechanism for placing paragraph breaks automatically at "the right" points in text produced by various different rules. Its aim is to save the writer from having to think about this. Four main defects have been found in the original Public Beta algorithm, and in this build we address all of them. We believe the result is a better system, but it does mean that the dodges people have used up to now to compensate for faults of the old algorithm will need to be removed or changed. (We had to remove a dozen or so spurious "[line break]"s from the Examples, for instance: the end result was much less intervention in how paragraphs were being broken, and this suggests that the automatic system is now more trustworthy.) This addresses proposal (6.45) in the January document. When defining a new text substitution, it is now legal to add "-- running on" as a note at the end of the preamble. The effect of this is that any newline implied by the immediately preceding text is ignored. Thus To say note -- running on: say "(1)". can be used in text such as "I prefer to avoid footnotes.[note]" without a newline being forced after the full stop under the "sentence ending punctuation at the end of literal passages of text implies a newline" convention. This has been applied to the following character-level text substitutions in the Standard Rules: [unicode N] [bracket] [close bracket] [apostrophe] ['] [quotation mark] [line break] [conditional paragraph break] [paragraph break] [run paragraph on] [bold type] [italic type] [roman type] [fixed letter spacing] [variable letter spacing] As a result, [line break] now does just and only what it suggests: prints a line break, regardless of circumstances, and with no side-effects for subsequent paragraph breaking. [paragraph break] is now the better way to force a paragraph break, and various bugs have been fixed so that it can more reliably be used in mid-string, in table entries, in values, more than once in the same quoted text, etc. A new form of paragraph break has been created for one special circumstance: printing clarificatory text after a command, when we are guessing what was meant. For instance: > N (first opening the Wicket Gate) Conventional spacing here is that text should immediately follow on the next line, unless we are going to a different room and looking around, in which case a line break should be added. We can get this spacing convention using the text substitution "[command clarification break]"; for instance: say "(first opening [the noun])[command clarification break]"; Another change made to the paragraph breaking mechanism removes the previous discrepancy between the effect of printing an object property which does contain a text substitution, and one that doesn't; and similarly for texts used as values in miscellaneous other circumstances. Finally, the text substitution "[no line break]" suppresses a line break which might otherwise arise under the sentence-ending punctuation rule as it applies to literal text in a "say", so: say "This is not the end![no line break]"; leaves the printing position after the exclamation mark. >--> The meaning of the text substitution "[list of ...]" has been changed so that it now lists the items referred to without articles: for instance, it might produce "apple, orange and nectarine" rather than "an apple, an orange and a nectarine". (Which is what would have been produced in previous builds: to obtain the articled list, use "[a list of ...]" or "[the list of ...]" according to whether indefinite or definite articles are wanted. This was (6.21) in the January document.) The text substitution ['] is now synonymous with [apostrophe], and makes extended runs of Cockney dialogue easier to type ("put down that bleedin['] [']eavy Joanna", and so forth). Problem message added for using 'say' (or a text substitution) to print a value of a kind which cannot be printed up (such as a parsing topic). (This already produced a problem message, but a generic unhelpful one.) Problem message added for using a comma inside a text substitution, which in previous builds concatenated the items in the substitution - but that was almost invariably not what people expected, and it was being reported as a bug. (Thus previously "[1, 3]" was a legal substitution and printed up "13", for example.) Bug fixed whereby text substitutions which ended with one digit and were immediately followed by another digit in literal text would be corrupted. (For instance, in "[if x is 2]2".) Bug fixed whereby the little-used but legal "say X, Y, Z" comma-separated list form of "say" would lose some text substitutions occurring in terms in the list before the final one. Bug fixed whereby replacing or cutting snippets in the player's command could cause spurious line breaks to be printed if the new text contained text substitutions. Bug fixed whereby long texts containing almost the maximum legal number of text substitutions could crash NI. Bug fixed whereby improperly closed double-quoted text, e.g., "'fish"' (note the mismatch of quotation marks) could produce I6 errors rather than a problem message. Bug fixed whereby specifying literals involving double-quotes could cause I6 errors (e.g., writing: 5'10" specifies a height). Still not a good idea since it throws syntax-colouring, but it's not meant to be illegal. Bug fixed whereby the activity "printing the name of something" now applies to the player - previously, it applied to everything except the player. PROPERTIES >--> The ability to create a property without specifying its kind (by writing, say, "A room has a property called history.") has been withdrawn. This was an undocumented syntax which gave the property the kind "miscellaneous-value", whose use has for some time been deprecated. (In almost all cases, the property will be storing either objects or text, and should be given a kind accordingly. The Standard Rules no longer use properties or variables of this kind, and this change improves the reporting of problems in assertions using the properties in question.) >--> We can now test to see if an object provides a property using the syntax if O provides the property P so for instance "if the noun provides the property lockable" - which a container or door would pass, but which a person would not, and so on. This was previously allowed as "if O has a/an P", but that was too ambiguous and has been withdrawn. (It made grammatical sense only for value properties P. "if the noun has a lockable" not only read badly, but due to a bug (now fixed) it also compiled to an incorrect test.) An indefinite article is now permitted in a negated assertion which sets the converse of an either/or property: thus "X is not a P" is permitted, just as "X is not P" would be. Grammatically this is incorrect if P is an adjective, which is what the original design of Inform intended, but people occasionally use nouns in an adjectival sort of way - for instance, "A monkey can be a hairy critter. The ape is a monkey in the Serengeti. The ape is not a hairy critter." (Here P is "hairy critter".) We continue to think this is poor style, but since the assertion would be allowed if in the positive sense, it seemed better to legalise it in the negative sense as well. Problem message added for writing 'X can have P' rather than 'X has P' to create a property, since this is a common mistake and currently produces rather unhelpful problem messages. Problem message rather than I6 errors for using a non-constant value (say, a variable) as the initial value of a property. Problem message rather than I6 errors for creating a property with a name consisting solely of an article (e.g.: "A thing has a number called the."), and similarly for property names containing commas or quoted text. Problem message added to clarify what kind of contradiction has occurred when the same property is set to different values in different sentences. Problem message added to report that new either/or properties or possible conditions (created by 'X can be Y or Z'-style sentences) clash with existing meanings - something which previously led to peculiar errors. Run-time problem messages now result from attempting to change (with "now") either/or properties for objects which are not permitted to have them. Run-time problem messages now result from attempting to read or write value properties for the "nothing" non-object. (Previously writes were ignored and reads produced 0, but this was unsafe for kinds of value where 0 was not valid, and in any case allowing people to treat "nothing" as an object seems unwise.) Bug fixed whereby "now X is Y" would compile I6 code which failed at run-time if X is a K that varies (K being some new kind of value) and Y is one possible value of K, in circumstances where K is also a property of objects. For instance, suppose we have colours blue and red, and colour is a property of cars. Suppose "jalopy" is a car that varies, "hue" a colour that varies. Then "now the jalopy is blue" and "now the hue is blue" are semantically very different - one changes a property, the other assigns a value - and this difference was being missed, hence the bug. Bug fixed whereby tests of whether something has an either/or property would compile to code failing at run-time (whereas value properties would work). Bug fixed whereby I6 errors might result from heavily ambiguous source texts where confusion could occur between wording of one phrase which does not include a property and another which does, where that property usage is itself incorrect. Bug fixed whereby giving a property of something with an additional clause requiring it to be somewhere (e.g. "the Portable Lamp in the Yard") would cause an internal error rather than produce a problem message. Bug fixed (see KINDS OF VALUE) whereby creating but not initialising a scene property caused an internal error. DEFINED ADJECTIVES In "Definition:" sentences, it's now possible to refer to the object to which the definition applies as "he", "she" or "they", or indeed "him", "her" or "them", and no longer only as "it". Thus "Definition: a person is other if he is not the player." is legal, as is, and let's not squabble over the rightness of this, "Definition: a person is other if they are not the player." The accusative forms mean that "Definition: a person is a target if the player can see him.", etc., should also work now. A problem message has been added to forbid ambiguous settings of properties for adjective-qualified kinds, as in "The description of an open door is ...": such a sentence looks as if it might create a rule which would dynamically check the door during play, but in fact being an assertion it only looks at the initial state. (In previous builds, a bug caused this to set the description for every door, initially open or not: rather than fix this, it seemed better to forbid this form of assertion entirely, since if it worked it would still not do what it looked as if it did.) Similarly, a problem message has been added to forbid assertions at compile time about adjective-qualified kinds where the adjective cannot be determined until run-time (because it is created with "Definition:" and involves some computation to decide whether an object satisfies it or not). Problem message rather than I6 errors for using "change O to P" where O is an object and P is a defined adjective (rather than a property), so that it is not logically possible to change P by merely saying so. Run-time problem messages now result from attempting to change (with "now") adjectival properties which cannot be forced to come true, since their truth is governed by a fixed definition. Bug fixed whereby definitions of adjectives based on testing a property to see if it equals some specific value (e.g. "Definition: A container is standard if its carrying capacity is 7.") would in fact test a range of values with this as boundary (e.g. capacity <= 7). Bug fixed whereby definitions of adjectives with a specific object as domain (e.g. "Definition: the Ballroom is dusty if...") would not always be given priority over definitions with a more general kind as domain (e.g. "Definition: a room is dusty if..."). HEADINGS Problem message added to report that a heading stops before the end of its line, something which generally happens when a full stop has been misread. Bug fixed whereby an author name including a comma would be mis-spaced in the banner (for instance if the first line is: "Trio" by Rod, Jane and Freddy). Bug fixed whereby a heading which followed a long comment without an intervening skipped line would sometimes wrongly be rejected as containing a line break. ASSERTION SYNTAX When ambiguous assertion sentences occur, where more than one word is in principle valid as the primary verb, we now assume that "to have" is the most likely verb, followed by "to be", and then the other built-in verbs. This replaces the previous doctrine that the earliest valid verb in the sentence was the true one. For instance, "The last support is a thing that varies." is now read with "is" as the primary verb, not "support". Problem message added to catch what look like mistaken uses of the pronoun "they". (E.g., in "A and B are things. They are portable.", I7 can't cope with "they" as meaning the collection of A and B, and would previously latch onto some other meaning, e.g., either A or B alone.) Problem message added for using 'every' on the wrong side of the verb in an assertion sentence (mostly to take the opportunity to explain how to reword such a sentence so that it works). Problem message added (in place of internal error) to catch misreadings of 'of' leading to misunderstood property values in assertions, e.g. in "The dining room is a room in the house east of the kitchen." Problem message added (in place of internal error) to catch relative clauses which seem to express a location in a way too complicated to follow, e.g. "Sleeping Beauty is a woman who is asleep in the Spinning Tower." Bug fixed whereby listing complicated descriptions of things which involved at least one negated property would cause I6 errors. Bug fixed whereby negated relative phrases would mistakenly be read as positive, so that for instance "The broken box is a container which is not openable." would, very unfortunately, make an openable container. Bug fixed whereby implications in the form of "An X is usually Y", where X involves a kind and also properties, would in fact cause all things of that kind to be Y, whether they matched or not. (For instance, "an open container is usually lockable" would cause all containers not otherwise described to be lockable.) Bug fixed whereby "some" as an article would be confused with "some" as a determiner in such a way that the actual object being referred to was lost: this especially happened with singular mass nouns, e.g. "some clay", where "if the player is carrying some clay" would be misread as "if the player is carrying something" if the clay was a single thing, not a kind. Bug fixed whereby the assertion "X is here." might fail if X had already been defined before the room denoted by "here" had been declared; and also another case in which the room, having been mentioned long ago, is only recently made the subject of discussion again. Bug fixed whereby descriptions with multiple relative clauses, some of them ambiguous, could result in an interpretation which is none of the possibilities an English speaker would choose. (This is difficult to define, but for instance, "a random woman who is not Zoe in the location of Zoe" was being interpreted in such a way that "in the location of Zoe" was being applied neither to the random woman, nor to Zoe. Inform now applies it to Zoe. This affects only a handful of sentences - e.g., it makes no difference to any sentence in any of the examples - and only to sentences which are fairly evidently risky in the first place.) Bug fixed whereby object names containing "with" could, in the middle of lists, crash NI. PLURALS The previous requirement that a plural definition sentence had to appear before it could be used has been lifted. Such definitions now apply throughout the source text, wherever they appear. This avoids traps like the following: "Clothing is a kind of thing. The plural of clothing is clothes. Clothes are wearable." In previous builds, this would have created an object called "Clothes", which is wearable but is not of the kind "clothing", and a kind called "clothing" with the plural "clothings". Bug fixed whereby non-specific references to properties in "every turn" rules would be taken to be properties of the I6 library placeholder object, usually leading to strange I6 veneer errors: they are now assumed to be properties of the player. Thus for instance A person can be poised or flustered. Before jumping: now the player is flustered. Before waiting: now the player is poised. Every turn when flustered: say "You feel flustered." ...now works as expected. Bug fixed whereby ordinal numbers were being taken as counting determiners for noun phrases, so for instance "2nd Room" was being read as if it had the same meaning as "two rooms". This led to confusion when room names (in particular) began with an ordinal, e.g., "2nd Floor Balcony". Bug fixed whereby words which indicate plurals will not always be recognised as such if the object whose name is being parsed has a complex range of possible names (i.e., if I7 is obliged to compile a parse_name routine to handle it). RELATIONS, PARTS AND REGIONS >--> Some people have had problems with the relation "in", when applying it to regions. Inside Inform, there are two forms of "in": there is object containment - the ball is in the box, the box is in the Summer House - and also region containment - the ball is in the Garden Area, the Summer House is in the Garden Area. These two forms of "in" are not as similar as they look - object containment has the property that a given X can be "in" Y for at most one possible Y, and Inform makes heavy use of this in optimising searches and loops; but region containment does not, becase the Summer House could be in the Garden Area and also in the super-region the Outside World, say. In practice, Inform always reads "X in Y" as object containment except when Y is the literal name of a region. Up to now, there has been no way to describe the hidden internal relation for region containment: in this build, we provide "regionally in" to allow users to clarify what sense they mean. Thus "repeat with P running through the rooms regionally in R begin; ..." makes clear that we are talking about all rooms in R (and not, for instance, rooms immediately in R rather than in some subregion of R). "A part of" is now synonymous with "part of": for instance, one can now write "if the tail is a part of the fish", with the same effect as "if the tail is part of the fish". Problem message added to prevent foundational errors involving an object being indirectly a part of itself ("X is a part of Y. Y is a part of X.", and so on). Problem message added to report that a region has been placed inside more than one other region. (This is forbidden because it could lead to configurations whereby regions overlap, whereas they are required always to include each other or else be disjoint.) Problem message added for an attempt to declare an already-existing object as a region. (This is never necessary, and when it occurs it is almost always a symptom of an inadvertent clash of names.) Run-time problem message added for attempts to find routes or count steps through relations not permitting this. (Previously such attempts would be allowed but, not very helpfully, invariably come back as finding no possible route. This was misleading.) Bug fixed whereby finding best routes through the map from A to B would fail with a programming error at run-time if A or B were nothing: Inform now works in these cases, returning the information that no route exists. (Similarly for counting steps, and for finding routes through relations.) Bug fixed whereby the built-in relations were not being given names as values, so that for instance Inform would fail to understand "containment relation" even though there is a relation called "containment". Bug fixed whereby relations defined by a condition would, if defined between different kinds of thing, sometimes lose track of what kinds they were defined over: so that run-time type-checking errors could be produced because the definition was applied to objects of the wrong kind. Bug fixed whereby some tests amounting to seeing whether a given room is in a given region, in the course of a condition, would fail. Bug fixed whereby a backdrop asserted as being in more than one region would only appear in the first region asserted (though also in any rooms it was asserted as being in: the bug applied only to multiple regions). TABLES "Increment" and "decrement" are now synonyms for "increase" and "decrease". Moreover, they can now also be used on table entries (e.g. "increase pollen count entry by 2"). "Choose the row with..." is now synonymous with "choose row with...". Problem message added for placing blank entries in the first column of a table which is creating named objects or values, something which makes no sense since the first column provides the names. Problem message added to report duplicated table names (which are not continuations of each other). Problem message for using a table reference at a time when no row has been selected has been clarified to explain why text substitution can make this time not the time which several users thought. Problem message for using a table reference in a condition set in the past tense and thus relating to a time when no row had been chosen. Problem message for using a table reference in a complex condition which requires loops over objects in ways very likely resulting from a misunderstanding (and which in any case can't be compiled safely if taken at their literal meanings). Problem message added for "Some X are defined by the Table of T" where X is something unrecognised, and another for where X describes a specific object rather than a kind. (It needs to be a kind of object or value.) Bug fixed whereby repeating through a table "in reverse order" (not in reverse order of any specific column, just in reverse order of its natural order) would produce I6 errors. Bug fixed whereby sorting a table would (almost) always move blank rows to the top: it now invariably moves blank rows to the bottom, regardless of the direction or column of sorting, as the documentation implies it should. Bug fixed whereby any continuation of a table was being treated as if written under the same heading in the source text as the start of the table: which meant that any problem messages, and also any object name disambiguation, would be handled at the wrong position. Bug fixed whereby "change TE to V", where TE is a table entry and V is some value to be put there, was not being type-checked - so that one could, for instance, change a textual entry to a number, with subsequently unfortunate results. (This is particularly insidious in the case of changing a topic entry to a textual string, which can't safely be done at run-time, and will crash the interpreter during later parsing.) Bug fixed whereby the condition "if S is a topic listed in T", where S is a snippet (e.g. "the player's command") and T has a topic column, would produce programming errors at run-time rather than perform the necessary matching. Bug fixed whereby the condition "if there is an X of Y in T", to see if the X column of table T ever contains Y, failed to compile if T was expressed in a way not using the word "table" (for instance, if T was a table-name which varies). Bug fixed whereby naming a table in such a way that the first word of the name was an article (e.g. "Table of A Students") would make that table subsequently difficult to refer to. Bug fixed whereby some properties given by columns in tables which define a batch of objects would, if they seemed always to contain other objects, sometimes cause an internal error and so fail to compile. Bug fixed whereby references to entries in tables in the past could produce internal errors. Bug fixed whereby defining a quoted text as an enumerated value of a kind of value using a table (a foolish but just about legal thing to do) caused I6 errors. TO... PHRASES >--> Phrase declarations can also now give literal values as the only possible match. For instance, defining: To hazard (N - a number): say "[N]! That's Numberwang." To hazard (N - 14): say "[N]... oh, sorry, Julie, that's NOT Numberwang." means that using a phrase like hazard X; will produce the exceptional message if X is 14, and the standard one otherwise. For instance, if we tried this with X repeating through a loop, we might see: 13! That's Numberwang. 14... oh, sorry, Julie, that's NOT Numberwang. 15! That's Numberwang. If we had not defined the general case ("To hazard (N - a number)"), then attempting to use hazard X; for any value of X other than 14 would have produced a run-time problem. (This was (6.29) in the January document.) Phrase declarations can now give alternatives for any single literal word using slashes (using the same convention that grammar tokens follow). For instance, To pour (N - a number) gallon/gallons: ... makes the phrase match with either "gallon" or "gallons" as the last word; except that "say" is never permitted as the first word of a phrase, just as now, because "To say ..." declares a text substitution instead. (This was (6.26) in the January document.) >--> Because of this, all existing To... definitions containing words with a slash in them, such as "and/or", will need to be changed. In particular the text substitution "[is/are a list of...]" and similar forms have been changed to "[is-are a list of...]", and the same principle (exchanging slashes for hyphens) has also been followed for the extensions: see above. Problem message added to prevent source text trying to redefine "now ..." by creating "To now X is 2" and similar constructions - these tend not to work, and are highly misleading when they do. IF AND OTHERWISE An additional problem message has been added to catch a subtle syntax mistake which previously led in some cases to I6 errors. This is to do with the possible interpretations of "otherwise if", as shown by the following: Report going from Alpha to Omega: if Omega is visited begin; say "You retrace your steps, but it's just not the same."; otherwise if turn count < 2, say "Unhesitatingly, you set out."; end if. This is actually illegal, because "otherwise (phrase)" can only occur immediately following an "if (condition), (phrase)": the form of otherwise used to divide up cases within a blocked if (such as the "Omega is visited" one) is just "otherwise if (condition)". The new problem message intercepts this mistake. The correct text would be: Report going from Alpha to Omega: if Omega is visited begin; say "You retrace your steps, but it's just not the same."; otherwise if turn count < 2; say "Unhesitatingly, you set out."; end if. (While at first sight the incorrect syntax looks innocuous enough - why not simply allow both forms? - this becomes ambiguous if the statement does indeed follow a simple "if" within the larger "if" block.) The problem message arising from "if C", where C is not recognised as a condition, has been made more helpful in the case where C is a compound condition. (For instance: "I was expecting that 'score is 1 or 2 or lemon sherbet explodes in the dark' would be a condition, but I couldn't make sense of it that way. 'score is 1' was okay; '2' only made sense as a value, which can't be used as a condition; 'lemon sherbet explodes in the dark' did not make sense; and nor did the condition make sense as all one text.") Problem message rather than I6 errors for using "otherwise ..." as following immediately on an "if ... begin" block opening. (It would be legal to use "otherwise", or to use "otherwise ..." after a non-blocked "if".) Bug fixed whereby "if ..." might fail to yield problem messages where a complicated condition included arithmetic performed on named values which do not exist. Bug fixed whereby giving more than one "otherwise;" clause in an "if" block did not provoke any problem message. (It now does.) CONDITION SYNTAX When a phrase can be used as a condition (i.e. when it is a phrase "to decide if..."), "not" followed by that phrase can also be used as a condition. In particular, "when not in darkness", "if not using the memory economy option", etc., now work. "Can not" is now synonymous with "cannot": for instance, "if the player can not see the fish" is equivalent to "if the player cannot see the fish", and similarly for "if the player can not be seen by the fish". Problem message added to catch accidental omissions of verbs in some descriptive conditions (say, writing "if small key inside box" instead of "if small key is inside box": it would open the door to too many ambiguities to allow these customary omissions in general). Bug fixed whereby tests of whether "A is unable to B" would be parsed as if they were "A is able to B", i.e., with the negation lost: for instance, "...when Peter is unable to see the bridge" would be read as if "...when Peter is able to see the bridge". Bug fixed whereby testing whether something unlocks something else would compile through I7 but then cause I6 errors. MISCELLANEOUS SYNTAX An explanatory problem message, rather than an internal error, now results from using 'total ... of' in a way too complicated to handle. Bug fixed whereby clashes of names as between ordinary phrases and arithmetic phrases could result in unhelpful problem messages on legal source text: for instance, creating a property called "times played" and then evaluating "total times played of all tracks" would be confused with trying to multiply "total" by "played of all tracks", even though this interpretation made no sense. A name-space clash causing the Standard Rules to conflict with any kind whose name included the word "item" has been removed. RULES AND RULEBOOKS Problem message rather than internal error for the case of a rule which happens when an activity is being applied to X, but X is not a description of something. Problem message rather than I6 errors for attempting to write an inline I6 definition of a rule. (Only allowed when defining "To..." phrases.) Problem message added for a rule whose name contains a comma. (No, really. People have tried to do this.) Bug fixed whereby saying that a named rule is listed first, in a rulebook already containing other named rules, would sometimes have no effect. Bug fixed whereby declaring that a new named rule should be listed instead of an existing (and built-in) action rule, e.g. the "can't go that way rule", would sometimes cause the new rule not to have the same implied actor conventions as the old one - for instance, even though the "can't go that way rule" applies to all actors, its replacement might only apply to the player, so that NPCs were able to walk through walls. Bug fixed whereby the result of a rule was not allowed to be another rule, so that "rule succeeds with result X" would fail in the case of X being a rule - while printing a problem message explicitly claiming that a rule was one of the legal alternatives here. Bug fixed whereby rules attached to actions happening "for the first time" (or with similar stipulations) would sometimes, in the case of complex actions, fire more than once during the same turn. This bug has been seen particularly in response to "After going from X to Y for the first time", where the rule fired both after the going, and then also after the subsequent looking action in the same turn. Typo fixed in Rules index: it should be "action-processing rules", not "action processing rules". (Some people thought this rulebook could not legally be referred to as a value - actually it can, but this typo caused them to get the name wrong. Apologies.) ACTIONS >--> The relationship between the actions "getting off" and "exiting" has been reversed. Suppose the player is on a chair, a supporter. In previous builds, EXIT would cause the exiting action directly, but GET OFF CHAIR would cause the getting off action, which would quickly convert into an exiting action. This worked fine, but meant that a rule like: Instead of getting off the sticky chair, say "You can't! It's too sticky." would only apply to one of the two commands, anomalously. In this build, it is exiting which converts to getting off (provided that the actor is indeed on a supporter). (This also fixes a bug to do with NPCs and the convert get off to exit where possible rule, which no longer exists.) The problem message for mis-describing an action with the form "A or B or ..." now itemises the listed actions to say which are valid and which not, and also warns if one of these is a named kind of action (which is not allowed in a list like this). It also handles the case of "doing something except A or B or ...". Problem message added for past-tense references to the "noun" or "second noun" which certainly will not do what their authors intend, because the values of these quantities have changed over time. Problem message added for complicated past-tense references to the "going" action. (The old problem message amounted to "I don't understand this", the new one "I do understand this, but I'm still not going to do it".) Problem message added for describing a "going" action in terms of objects which are of the wrong kind to make sense - going from or to a non-room- or-region, through a non-door, with or by a non-thing. This only catches cases which the compiler can spot, involving specific named items, but this is more useful than it sounds (especially if a room name includes the word "by" in lower case, and Inform has wrongly taken this as a preposition). Bug fixed whereby moving the player during the course of a rule attached to an action being carried out by somebody else would cause any resultant looking action to apply to that other person, rather than the player, so that instead of a description of the player's new room we might either see nothing or something like "Miss Marple looks around.", depending on where the third party is at that point in the action. Bug fixed whereby somebody arriving in the player's room as a result of a "going" action would always be described as arriving from the opposite direction as that of initial travel - so if he had gone east, he would now be said to have arrived from the west, for instance. This is fine for untwisted, two-way routes, but not otherwise. Inform now only does this where the reverse journey can be made in the reverse direction, possibly via a two-way door; and otherwise simply says that the person "arrives". Bug fixed whereby a spurious "You must name an object." error would be printed in response to a command requesting somebody to carry out an action which applied only to a single topic. Bug fixed whereby "try looking" would sometimes fail with a spurious "You must name an object." error if it occurred during an action which applied to a value rather than a thing. Bug fixed whereby an action caused by "try" would sometimes not have the appropriate "... understood" values correct if the action applied to a value rather than a thing. Bug fixed whereby an action whose name takes the form "... to something" could be referred to without the "to". As a special case and because of its status as an optionally-nouned action, this is still allowed for "listening" (properly speaking the action is called "listening to"), but forbidden for new actions. Bug fixed whereby lists of actions would sometimes, in certain orders and where ambiguity between different length actions occurred, wrongly cause problem messages. For instance, "Instead of taking off or dropping the jodhpurs" would fail (note ambiguity between "taking" and "taking off") whereas "Instead of dropping or taking off the jodhpurs" would work. Bug fixed whereby ambiguities caused by abbreviation of action names (for instance if we have actions "weighing" and "weighing it with", what do we say that the rule "Before weighing" applies to?) are now resolved in favour of the least abbreviated name (here, "weighing"). Bug fixed whereby tests of intransitive past tense actions (e.g. "we have woken up", no object, rather than "we have taken the box") were performed incorrectly, usually producing false negatives. Bug fixed whereby action reporting would suddenly cease after a NPC tried an action involving a door or backdrop. (The mystically-named "untouchable silence" bug, which Khelwood posted a (correct) fix to RAIF for.) Bug fixed in the implementation of the ACTIONS testing command whereby the information that a tried action had just failed would sometimes be destroyed by the act of printing things information out. Bug fixed whereby some complicated check, carry out or report rules would fail to appear in the Actions index. Bug fixed whereby check rules applying to the final action performed would be posthumously applied also to the attempt at restoring the game produced by typing RESTORE in reply to the post-game question "Would you like to RESTART, RESTORE a saved game or QUIT?" SCENES >--> A small but quite important change has been made to the scene changing mechanism which affects the order in which things happen when there are multiple scene endings. For instance: Home is a room. The cube and the ball are here. Shape Choice is a scene. Shape Choice begins when play begins. Shape Choice ends roundly when the player carries the ball. Shape Choice ends squarely when the player carries the cube. Consequence is a scene. Consequence begins when Shape Choice ends. When Consequence begins: if Shape Choice ended roundly, say "Roundly."; if Shape Choice ended squarely, say "Squarely." Suppose the cube is taken. This used to cause the following sequence of events: Shape Choice ended Consequence began Shape Choice ended roundly It was necessary for Shape Choice to end the regular way before the exotic way, so that consequent rules could happen, but the ordering was unfortunate, because it meant that the rule in the source above happened at a time when it wasn't known whether the scene had ended roundly or squarely - only that it had ended. Since it's very useful to know how the previous scene ended in order to begin the next one, this is unfortunate. The change means that the sequence is now: Shape Choice ended Shape Choice ended roundly Consequence began and so the rule above works after all, printing "Roundly." It is now possible (optional, that is) to use a "the" in giving a rule for a scene beginning or ending: thus "When the Afternoon begins:" is now synonymous with "When Afternoon begins:". Two new phrases for scenes have been added: "the time since S ended" and "the time when S ended", exactly parallel to "the time since S began" and "the time when S began". (Previously, the "began" time was being interpreted as the most recent time at which S either ended or began - this was a bug, and has been fixed.) New scene "Entire Game" created: see KINDS OF VALUE. Bug fixed whereby a scene which begins "when play begins" and also when a condition holds now begins in either case (previously, the condition was being ignored, and some users thought it was illegal to specify a condition in this case - actually it was a bug). Bug fixed whereby begin/end conditions of scenes would not be properly disambiguated if relying on an ambiguously phrased phrase to decide the outcome, resulting in I6 errors for what was correct source text. Bug fixed whereby begin/end conditions of certain forms, such as past tense actions, were rejected altogether with spurious problem messages. Bug fixed whereby if scene A is set to end when scene B ends, but in fact B ends at a time when A has never started, ending rules for A would be erroneously run anyway. Bug fixed whereby creating a scene that varies called X could sometimes also create a scene called X. (Except for cluttering the index, this would only be harmful if the name of X happened to end with "scene", but of course people do tend to name such things "current scene", etc., so...) Bug fixed (see KINDS OF VALUE) whereby creating but not initialising a scene property or variable caused an internal error. WHEN PLAY BEGINS Bug fixed whereby attempting to enter a closed container which in fact already enclosed the actor (but indirectly so) would fail the "can't enter closed containers rule" rather than the "can't enter what's already entered rule", resulting in a slightly misleading reply. Bug fixed whereby calculations of visibility made during "when play begins" rules would be incorrect because the player object had not yet been put into its starting position. Bug fixed whereby changing the player to a new player-character and then moving that PC during "when play begins" rule to a container or supporter would have the final movement disregarded. OBJECT MOVEMENTS >--> Scenery is now usually "fixed in place". This makes little difference since it can't normally be taken, but in previous builds it usually had the "portable" property, and this meant that (for instance) "repeat with the item running through the portable things in the location ..." would unexpectedly include scenery. Bug fixed whereby moving an object from room to room (say, by writing "now the row-boat is in the Rapids") would cause the location to be wrongly set internally if the object contained the player (because an I6 PlayerTo call would never occur), which would make certain room descriptions print wrongly. Bug fixed whereby "remove D from play", where D is only a vague description of things, would compile I6 code which failed at run-time rather then produce a problem message. LIGHT Bug fixed whereby another person in the same room, openly carrying a light source, was not counted as lighting that room. UNDERSTANDING In previous builds, the activity "reading a command" has happened only around the original command being typed. If the player types TAKE POLISH, the activity winds up: if, later, the parser asks a follow-up question such as "Which do you mean, the Polish sausage or the shoe polish?", this question is not framed by the activity. That remains the case, but if the question results in a rewritten command, Inform now - exceptionally - follows the "after reading a command" rulebook for a second time. Problem message rather than internal error for confusing an activity with an action in an "Understand ... as ..." sentence. Bug fixed whereby, if we give define a noun as a legal command by writing e.g. "Understand "[something]" as examining." and then the player types something unrecognisable, the parser replies "You can't see any such thing." (presuming we were intending to type a noun) rather than "That's not a verb I recognise." (presuming a verb - which seems more likely). Bug fixed whereby the message "** Warning: grammar properties might not work correctly **" would occasionally appear when a game began playing (but not in a released version). USE OPTIONS The "the" in the condition "using the ...option name... option" has been made optional: for instance, "if using no scoring option" is now allowed. Bug fixed whereby using memory economy did not suppress all the RULES ALL text, thus not economising as much as it might. EXTENSIONS Problem message added to explain that extension names should be unquoted in Include sentences. Bug fixed whereby extensions ending without documentation would sometimes produce a spurious problem message on their end lines, unless these were followed by at least one one blank line. PUBLISHING Bug fixed whereby releasing along with a website stopped working in 4K40/1. Particular apologies for this. Bugs fixed whereby Unicode translations were not properly preserved in released websites, notably in title, blurb and source text when written as HTML. WORLD INDEX Problem message added to clarify that mapping hints can only be given laterally (so e.g. "Index map with Overlook mapped above Great Plain" does not work). Bug fixed causing "yourself" (the player) to appear twice in the World index in some situations. Bug fixed whereby disconnected areas of map would sometimes appear on vastly distant vertical levels from each other, with peculiar resulting map legends. (See e.g. the map for "Port Royal 2" under 4K41 or earlier.) PROBLEM MESSAGES Bug fixed whereby some problem messages concerning phrases would be reported as being in the text under the final heading in the source text, rather than the headings under which they actually occurred. Bug fixed whereby problems occurring in text substitutions inside quoted text which forms a whole sentence (e.g., as an implicit room description) were reported as being at peculiar sentences. A number of problem messages which users reported as unclear have been reworded. --------------------------------------------------------------------------- 4K41 (23 January 2007) 4K40 contained a bug making it unreliable under Mac OS X on G4 or G5 processors: 4K41 is believed to fix this, with our apologies for the inconvenience. In all other respects it is identical to 4K40 and Mac OS X users with Intel processors need not download again. 4K40 (23 January 2007) (Mac OS X only) The Skein's appearance has been redesigned, and an illustrated tutorial to the new-look Skein now appears as section 1.8 of the documentation for the OS X application. (We hope that similar changes will be made shortly in the Windows application.) (Mac OS X only) The Skein panel now has a Layout... button for customising the width and height proportions of the skein display. (Windows only) Documentation links from the Index tab now work with Internet Explorer 7. (Windows only) The size, italic, text colour and background colour style hints are now supported when running a Glulx game in the game tab. New activities "clarifying the parser's choice of something" and "asking which do you mean" allow customisation of the familiar messages: (the mahogany inlaid box) and Which do you mean, the mahogany inlaid box or the icebox? Extensions: Punctuation Removal made bi-platform (and version number advanced to 2). Version 4 of Plurality by Emily Short now responds correctly to male/female settings even if the items in question are not of the man/woman kind, and adds several further tokens. Examples: Magneto's Revenge fixed to use "the person reaching" rather than "the person asked". Changes to Waning Moon, Air Conditioning is Standard, and Fifty Times Fifty Ways to correct typos. Veronica added to demonstrate leaving a region. Numberless added to demonstrate two ways to emulate a switch statement. Pine4 given a tiny fix to make its articles behave better. The rules for the sorting of grammar lines in the grammar for command verbs have been slightly changed. Few users should notice any difference, but one change means that grammar added to cover "mistakes" should now no longer be able to "mask" grammar for non-mistaken commands, something which had been reported previously as a bug. Problem message added for attempting to use "Understand the command ... as ... when ...", where some condition follows the "when": this has never been supported, but in previous builds the "when" clause was silently ignored. Problem message added for attempting to use the "[text]" token in a table entry or a ... matches ... condition, where it is not allowed. A new rule called the "very unlikely to mean taking what's already carried rule" improves the parser's handling of TAKE SPLODGE when there are several splodges in different places, some of them carried. Blue "help" icon added to "Does the player mean..." in the Rules index. A long-standing bug fixed whereby things introduced without an article would sometimes be given one, rather than being consider proper nouns (or mass nouns): for instance, in "The player carries a small key, a tent, and Variety Magazine.", the source text clearly suggests that Variety Magazine is a proper noun, and I7 now recognises this. Two bugs fixed to do with "when..." clauses attached to rules in unusual situations - both bugs having appeared only in 4F59. One related to rules in the form "check A when B", where A is an action including the word "it" (such as "telling it about") and B a condition; the other to "when" clauses attached to object-based rulebooks known never to run during activities, notably the reaching inside rules. In each case spurious problem messages were generated. Bug fixed so that things are no longer "lockable" by default. (Instead, locked containers and locked doors are lockable by default.) Bug fixed whereby an instruction like "Understand "[any actor]" as James Bond." would generate I6 code failing to compile through I6. Bug fixed whereby one token to match an object making use of another one would sometimes find the result corrupted: for instance, Understand "leg of [person]" as a leg. would get confused between the leg and the person whose leg it is said to be. Bug fixed whereby some combinations of name words and tokens to match the names of objects did not work. Bug fixed whereby meaningless text would sometimes match a "[number]" token when parsing. Moreover, "[number]" has been improved so that it now matches any literal decimal between -32768 and 32767 inclusive (i.e., the full 16-bit range of signed integers supported by the Z-machine) rather than duplicating the peculiar behaviour of the I6 number-parser, which worked only on non-negative numbers up to 10000. Bug fixed which caused too many things (and rooms) to have plural forms of their names recognised: for instance, a "red chair" would be referrable to in the plural as "red chairs" even if it was the only one, and this would cause ambiguity if a second object were in the same place and with its main singular name coincidentally "chairs". The convention now is that an object can be referred to in the plural with a name inherited from its kind if and only if it has no name of its own. (This change sounds substantial, but in fact did not change the behaviour of any of the examples.) Bug fixed whereby large numbers of identical objects could cause mysterious things to happen if ever 64 of them are in the same place at the same time. (In fact an I6 library bug: thank due to Martin Bays for his fix, which is patch L61125.) Bug fixed in which two things without names of their own were sometimes considered "indistinguishable" by the I6 parser, and therefore grouped into a plural (e.g., "six red blocks"), when in fact they were distinguishable by virtue of having a visible property which differed between the two (e.g., some being red, some being blue). Bug fixed causing documentation of examples in extensions to have any Inform 6 fragments in (- ... -) brackets lose the -). In particular, this affected the example in Menus by Emily Short. A limit on the number of different "in the presence of..." clauses allowed in a single source text has been removed. (Previously it stood at 100: now there is no limit.) A limit on the number of different noun- and scope-filtering tokens allowed in a single source text has been removed. (Previously it stood at 100: now there is no limit.) A limit on the number of new kinds of value which could be created by a single source text has been removed. (Previously it stood at 400: now there is no limit.) Two bugs fixed causing crashes in unlikely circumstances after a problem has been encountered. --------------------------------------------------------------------------- 4F59 (21 December 2006) The main purpose of this build is to publish a redesigned system for phrase and rule declarations, fixing a number of miscellaneous bugs, removing some exceptions and clarifying ambiguities in the existing design. Chapter 18 of the documentation is substantially rewritten as a result, and the Rules page of the index has been redesigned. We believe that the new design is much less ambiguous and, as a result, more fully explained than the old, but the removal of some of these ambiguities does mean that minor changes to some existing source text will be needed. If you have a work in progress nearing its completion, you may need to test that the new rules system does not change its behaviour. Phrases can be defined by "To ...:" (declaring a new phrase to be used in the definitions of other phrases), by "Definition:" (defining adjectives), by "At ...:" (declaring events to happen at given times) or as rules to go into rulebooks (for instance, "Instead of taking:" goes into the "instead" rulebook). In order to make it easier to tell immediately which of these four forms is intended: (i) Rulebook names are now forbidden to begin with the words "To", "At" or "Definition". (So far as we are aware, nobody has ever done this, so this should not cause inconvenience.) (ii) Events happening at a fixed time are written "At 3:02 AM:" or similar: events happening at some time not yet determined are now written "At the time when the clock chimes:" rather than, as in previous builds, just "When the clock chimes:". This removes the confusing ambiguity with scene start/end rules (e.g. "When Scene IV begins:") and with "When play begins:", etc. When Inform adds rules to rulebooks, it sorts them so that more specifically applicable rules (say, "instead of taking the fish") come before vaguer ones ("instead of taking or dropping something"). The method of sorting used was largely unchanged from 3K27 to 4B91, but has now sharpened in the following ways: (i) being "in" a room is considered more specific than in a region, (ii) and in a subregion more specific than in a super-region, (iii) "during..." clauses are now taken account of, (iv) "in the presence of..." clauses are now taken account of, (v) rules attached to a wider range of actions ("taking or dropping") are less specific than rules attached to a narrower range ("taking"), (vi) rules with longer or more complicated "when" conditions are considered more specific than those with shorter, (vii) rules applying in a limited range of turns or for a limited number of times are considered more specific than other such rules if the number of turns in which the rule could apply is smaller. Though these changes may change the effect of some complicated source texts now standing, they should only really affect cases where rules were previously considered equally applicable. When the Index shows the contents of a rulebook, it now uses a graphical notation to show which rules are considered more specific than which others. Hovering the mouse over one of the icons used in this notation causes a "tool tip" to be displayed which explains on what basis the decision was taken. The special verb "to be listed", used to specify how named rules are listed in rulebooks, is now more flexible. The existing syntax remains: The summer breeze rule is listed in the every turn rules. The summer breeze rule is listed after the chirping magpie rule in the every turn rules. The summer breeze rule is listed before the chirping magpie rule in the every turn rules. And the following possibilities are added: The summer breeze rule is listed first in the every turn rules. The summer breeze rule is listed last in the every turn rules. The can't eat unless edible rule is not listed in the check eating rules. The can't eat unless edible rule is not listed in any rulebook. The refined palate rule is listed instead of the can't eat unless edible rule in the check eating rules. The last three possibilities allow rules to be abolished for the whole game without the need for procedural rules. (A rule abolished in this way still exists, it merely isn't found in rulebooks at the start of play.) This will make extensions which carry out large-scale library changes more efficient. A "when/while" clause can now be attached to a rule in an object-based rulebook not derived from an activity. (These used to be the only rulebooks whose rules were not allowed a "when" clause, so the change removes an unnecessary exception.) The synonym "final" for "last", in the context of rulebook placements, has been withdrawn - it was an unnecessary complication. Thus "The last chirping magpie rule:" still works, but "The final chirping magpie rule:" does not. The new text substitution "[otherwise if ...]" has been added: this can be used in text, between "[if ...]" and "[end if]" substitutions, in just the same way that the phrase "otherwise if ..." can be used between "if ..." and "end if" phrases. A new rulebook, "does the player mean", has been added to give the parser clues on how to disambiguate commands. (This offers facilities analogous to those provided by ChooseObjects in Inform 6, but applying to whole actions and not to nouns alone.) See the new section 16.16 in the documentation. Changes to the examples are as follows: Masochism Deli added to demonstrate "does the player mean..." rules. Flotation added to demonstrate an object-based rulebook and named outcomes. Being Peter added to demonstrate an action-based rulebook with named outcomes. Bronze, 3 AM, MRE, Mr Spruce's Non-Modal Question, Chronic Hinting Syndrome, Fifty Times Fifty Ways, Happy Hour, Lakeside Living, Lemonade, Noisy Cricket, Patient Zero, Y Ask Y modified to show "otherwise if" better. Barter Barter, Bribery, Bruneseau's Journey, The Dark Ages Revisited, Emma, Fragment of a Greek Tragedy, Mimicry, Minimal Movement, Nickel and Dimed, Stately Gardens, Under Contract, Waning Moon modified to get rid of now-unnecessary procedural rules and use "is not listed..." instead. Aftershock, Crusoe, Get Axe, The Hang of Thursdays, Panache, Swigmore U, Uptempo, Zqlran Era 8 modified to get rid of now-unnecessary procedural rules and use "is listed instead of..." instead. Instant Examine and Look modified to get rid of procedural rule in favor of a first rule in the turn sequence rules. Commentary added to explain how the procedural rule might be used and why the first-rule method might be preferable. No Place Like Home reassigned to the Awarding Points section, as being more relevant there. Strictly Ballroom corrected for a missing word. Up and Up modified to use after going rather than before, as this is more reliable. Beneath the Surface improved to make the chair a supporter. Witnessed 1 expanded to include new "does the player mean..." rules, improving parsing behavior of the example. The Night Before added to demonstrate "does the player mean..." rules to lower the parsing significance of body parts belonging to the player compared to those of other people; Hudsucker Industries substantially updated to simplify logic, provide better parsing behavior using "does the player mean..." rules, and allow the player to refer to sorted letters by property. Costa Rican Ornithology given slightly more explanation of the topic column, since this appears before the format has been fully introduced. We, and the two gas diffusion examples, moved to a new location. We given slightly more commentary to point users at extensions for changing library messages if they want to do so wholesale. No Relation edited to discuss how Instead of going by... applies to vehicles and other objects. Morning After edited for a typo in the commentary. Uptown Girls edited for a typo in the source text. File extension for blorbed Glulx-format releases changed from ".zblorb" to ".gblorb". (Apologies: an oversight.) The horizontal compass directions can no longer automatically be referred to by the word "wall", so that "examine the north wall" no longer generates the action of examining north. This was an old Infocom convention, carried over into Inform 6 for some years, but which causes problems more often than it confers benefits. Bug fixed by which (on Windows only) accented letters sometimes caused confusion with digits. Bug fixed by which a rule which applied e.g. "for the third to eighth time" (an explicit range of iterations) would generate code which failed to compile in I6. Bug fixed in which rules "listed after" or "listed before" might give spurious problems if the rulebook named had a name including the word "with". Bug fixed whereby the Glulx interpreter was not checked to see if it could provide pictures before being instructed so to do, which produced problems with some text-only Glulx interpreters. --------------------------------------------------------------------------- 4B91 (10 November 2006) (Windows only) Images now appear in the game tab when running a Glulx game, rather than the place holder "[Image n]" text. (This brings the Windows application into line with the OS X one.) (Windows only) The right-click menu for the source tab now includes a sub-menu to change the size of the text. (Windows only) Ctrl-Delete and Ctrl-Backspace in the source tab no longer confuse the undo logic. (Windows only) The cursor arrow keys now work in the game tab. (Windows only) The toolbar should no longer appear corrupted on 24-bit displays. (Windows only) When running Glulx games in the game tab, the stylehint_Proportional flag is now respected. (Windows only) When running Glulx games in the game tab, glk_window_clear() now works. On both the Mac OS X and Windows applications, documentation searches now cover the examples as well as the main text, and search results are more clearly displayed. The Glulx story file format is fully supported by Inform for textual works, and we have therefore documented it as a choice available for designers: see section 2.13, now retitled "Limits and the Settings panel". The commonest source of problems with Glulx to date has been to do with screen effects such as coloured text and menus, and in particular to do with the extension "Basic Screen Effects", which works only for the Z-machine formats. Because of this, and because we expect that people will want to write other extensions providing unusual effects, two new features have been added: - An extension can describe itself, in its top line declaration, to be for a limited range of story file formats. This is displayed in the "Installed Extensions" documentation chapter, and an attempt to use an extension with a story file format which does not match will produce an explanatory problem message. - Individual headings can specify that they contain material to be used only with certain story file formats. This allows extensions, in particular, to provide different implementations of the same idea - for instance, a Glulx version and a Z-machine version - so that the user will get the same behaviour whatever the current project Settings. See the new section 21.6: "Extensions and story file formats". The use of illustrations is now officially supported. This was implemented in 3Z95 but documented only in the change log; for this build a new chapter on illustrations, Chapter 19, has now been added to the documentation. The "Release along with an existing story file" option has been improved, and is now fully documented for the first time: see the new section 20.15, "Republishing existing works of IF". This enables Inform 6 users, or those with old games compiled using Informs 1 to 6, to repackage them with cover art and bibliographic data for modern interpreters such as Zoom, Spatterlight or Windows Frotz. "When play ends" rules are now run when play ends "in victory"; previously, they were run on every other outcome but not this one. This is a change in the design rather than a bug fix, so it may cause existing source text to change its behaviour: if you are using "when play ends" rules in a work in progress, you may want to test to see if victory is still presented as you would wish it. If a scene is created with a name such as "Grand Finale", one can now write rules for "When the Grand Finale begins: ...", etc., equivalently to "When Grand Finale begins: ...". (This is in effect a bug fix, since the same text would previously have created a spurious rule called 'Grand Finale begins' which was never invoked, rather mysteriously.) The syntax "otherwise if" (or "else if") is now allowed. This divides up an "if ... begin; ...; end if", for instance as follows: if the player is in the Garden begin; say "The wind rustles the long grass."; otherwise if the player is in the Gazebo; say "The wind catches at the canvas roof of the Gazebo."; end if. There can be any number of "otherwise if"s within an "if... end if". (Note the lack of a "begin" at the end of each "otherwise if" - the "if" is all one block of phrases.) This new syntax is somewhat experimental, so will be documented in the next build rather than this one. Problem messages have been added for use of '[if ...]' inside an existing '[if ...]', and for '[otherwise]' or '[end if]' used with no matching '[if ...]'. Extensions: Basic Screen Effects revised to compile correctly under both Glulx and Z-machine; documentation updated; version number advanced to 3. (Thanks to Eric Eve for his contributions.) Plurality revised to include additional management for pronoun behavior (providing wrappers for Inform 6's MANUAL PRONOUNS constant and the PronounNotice() routine), and to print "you" when the item described is the player, in it/them phrases; documentation updated; version number advanced to 2. Punctuation Removal revised to indicate that it is for the Z-machine only. Examples: "Garibaldi" altered to reflect that colored lettering can be used only under the Z-machine. "Scooby" reworded slightly to avoid a conflict with the new "otherwise if". The limit on the size of a single I6 code inclusion, previously 10K, has been substantially raised (to 200K): this for the benefit of one or two complex extensions needing to incorporate very long hand-coded I6 routines. Problem message added for actions applying to two non-object values at once, and bug fixed which (sometimes) caused this to generate a spurious problem message on the wrong action. Problem message added for "...an X with L", where L is a literal value such as a number, rather than the previous internal error. Problem message added for "X is a value that varies", which doesn't say what kind of value it is, rather than the previous internal error. Problem message added for relations created between kinds of value with an infinite range, in those cases where this is forbidden because the run-time storage needed would be impracticable. Problem message added for compiled descriptions which contain local variables (which will no longer exist when these descriptions need to be used: this resulted in enigmatic "subtype of oversized local" internal errors). Problem message added for calling a variable simply "variable", as in "The favourite son is a variable." Bug fixed in which I7 could sometimes crash on being asked to place rule A after or before rule B in rulebook R, when B is not in fact in R: an explanatory problem message has been added to respond to this. Bug fixed in which a room could not be called simply "Void". Bug fixed in which boxed quotations would sometimes produce array lookup errors. (A bug introduced only in 3V01: apologies.) Bug fixed in which text containing an "[if ...]" and then an "[otherwise]" but no "[end if]" and finally a substitution containing an ambiguity not soluble at compile time would sometimes generate I6 code missing a label definition, causing I6 to reject the output of I7. Bug fixed in which number variables initialised to negative numbers would be created with the wrong value. Bug fixed in which attempts to match a snippet against a non-topic would crash the virtual machine: they now produce a new run-time problem. Bug fixed in which reaching inside rules affected removing differently from taking. Bug fixed in which RELATIONS testing command gives incorrect output for some object-to-value relationships. Bug fixed in which actions applying to two values, and using the word "with" in their names, were not always possible to categorise as named actions. Bug fixed whereby "(with nouns reversed)" did not work when applied to actions whose names consisted of a single word. Bug fixed to do with "P of the X of Y", e.g., "price of the bag of sweets", being misread. Bug fixed whereby "let Name be Value" would sometimes create Name with the wrong kind of value (e.g. a time instead of an object) in cases where the Value part was susceptible to multiple interpretations. Bug fixed causing a value consisting of the lone word "entry" to cause an internal error. Bug fixed whereby setting a description for generic player-characters would cause I6 to fail to compile I7's output. Bug fixed whereby a test scenario specifying that the player must be "in the Holding Cell", etc., would crash due to misreading "holding" as the start of a requirement about what is being held; also, if a capital H is used for Holding, then this ambiguity no longer arises. Bug fixed in which the problem message for an object whose name is purely textual would be followed by a spurious internal error. Bug fixed in which a wrongly phrased condition followed by a "try ..." would sometimes produce an internal error as well as the intended problem message. Bug fixed in which an "accidental clash of names" problem would similarly sometimes cause an internal error as well. Bug fixed in which, once again, a problem reported in a "let X be Y" phrase might also lead to a bogus internal error later. Bug fixed in which 'Definition:' at the end of the source, with no definition, would crash Inform. Bug fixed in which a nameless new phrase, defined by just 'To:', would cause an internal error. Bug fixed causing a close quotation mark to be omitted when quoting an incorrect "Understand..." sentence in certain problem messages. Bug fixed in which definitions wrongly referring to properties would cause the right problem message to be reported, but on the wrong sentence. Bug fixed in which I6 library (as included in 3Z95) failed to compile for purely I6 projects. --------------------------------------------------------------------------- 3Z95 (14 September 2006) (Mac OS X only) A new toolbar gadget, Headings, provides a breadcrumb-style drop-down menu to navigate the headings and subheadings in the source. A new toolbar button, Index, (re-)makes the current project, but shows the revised index rather than the ensuing game. It's useful when, for instance, laying out rooms and map connections, as it allows for an easier comparison of the source text with the World map. A new chapter (Chapter 5: Text) has been created in the documentation: this is made up of material previously in the middle of Chapter 4, with a variety of sections (on Unicode, quotations, "say" and text substitutions) pulled in from surrounding chapters. More detailed material has been added to the chapter on Rulebooks to cover the distinction between object- and action-based rulebooks. Review sections added to chapters 2, 5, 6, 7, 8 and 9. The unsupported types "object-specification" and "object-specification-unsub" have been withdrawn. In all cases where a phrase takes a description of a set of objects - for instance as what to list in a "[list of S]", or as what to repeat through in a "repeat with X running through S" - this is now called simply "description". Moreover, the operations "random S", "number of S", "total P of S" and "(superlative) S" - such as "number of men", "a random man", "total carrying capacity of men", "the heaviest man" - are all now defined as phrases like any other, rather than being special constructions inside Inform. (This should ease slightly odd problems experienced by a few people where Inform's parser could not cope with phrases whose names were too similar to these four constructions.) Finally, although "description" is not a kind of value, it is legal to use "description" in new phrases: To enumerate (collection - a description): repeat with the item running through the collection begin; say "-- [The item]."; end repeat. We could then "enumerate lighted rooms", say. Note that "collection" here stands for whatever description is used when the phrase is invoked: it can in turn be used wherever a description is needed. We could, for instance, evaluate "the total carrying capacity of the collection". Actions can now require three levels of access to something in order to work, rather than two: - "Visible" and "touchable" (the default) are as before, and "carried" has been added. (E.g., "Assaying is an action applying to one carried thing.") Carried implies touchable which implies visible, in this sense. - A new accessibility rule, the "carrying requirements rule", checks that this requirement is met. - Should it fail, a new activity, "implicitly taking something", will attempt to have the actor silently take the item(s) required. - Should this in turn fail, the action as a whole will fail the "carrying requirements rule". - In Understand sentences, the tokens "[something held]" and "[things held]" have been withdrawn. If used, they now produce an explanatory Problem message which lays out what must change. In most cases, what will be needed is for the action's declaration to include the carrying requirement, and then these tokens to revert to plain "[something]" or "[things]"; but new tokens "[something preferably held]" and "[things preferably held]" have been created which, though they can match anything visible, will prefer items held when ambiguous names are used. These changes make little difference to the player's perception of what is happening. They have two advantages: first, it is conceptually clearer for the action to be where realism constraints are declared, rather than in grammar for parsing, and it ensures that all grammar using the same action follows the same rules; second, it moves implicit taking from the I6 library into more modern I7 terms, thus making it much easier to adapt and modify the behaviour of implicit taking: this has been a frequent request. The actions "throwing X at Y" and "showing X to Y" now require Y only to be visible, not to be touchable. (We envisage daggers thrown across chasms, security passes shown through windows, and so forth.) The "blowing" action, intended for woodwind instruments and perhaps the occasional siphon, has been withdrawn from the built-in set: it no longer seems to us part of the essential core of actions. We have similarly removed praying, digging, jumping over, filling and swimming. (Our main concern with these was that, besides being of marginal use, they tended to result in inappropriate text being produced in the few cases where they were relevant.) Finally, "remove X" (as distinct from "remove X from Y") is no longer understood as referring to the taking action. (It caused confusions with removing in the sense of removing an item of clothing, and hardly anybody ever used it.) Further work has been carried out on providing Glulx support. We now believe that any work written without the explicit use of Z-code assembly language (or extensions themselves containing such) should compile, run and release correctly in with "Glulx" selected on the Settings panel. Moreover, there is (as yet limited) support for displaying images, which Inform calls "Figures", following an analogy with book conventions. To use these: - Place an image file, which must be a JPEG or PNG, in a subfolder called Figures of the Materials folder for the project. Suppose this is "Woodlands.png". - Add the sentence: Figure of Woodlands is the file "Woodlands.png". to the source text. (Figure names can consist of any text so long as they start with the word "Figure": "Figure 3 - Woodlands", for instance, or "Figure W" would have been just as good.) - The phrase display the Figure of Woodlands; will now show the image, when the work is compiled to Glulx. When compiled to the Z-machine (which is the default setting on the Settings panel, of course), nothing will happen: the phrase will do nothing. The phrase option display the Figure of Woodlands, one time only; causes the image to be shown only the first time this phrase is reached. - A list of figures, with thumbnails and dimensions, appears in the Contents index; a warning triangle is shown for any images in the wrong format, or which are missing from the Figures folder. - When a Glulx work is released as a blorb (the default setting for the way releases occur), any such images are automatically included. - The new kind of value "figure-name" can be used to define phrases which work with Glulx pictures: To do something funny with (F - a figure-name): ... Figure names compile to resource ID numbers as used in the final released blorb; these will usually be integers 2, 3, 4, ..., since picture resource number 1 is reserved for the cover art. - We would like to thank John Cater for contributing his infglk.h definitions to the project: these definitions are included in the I6 source code compiled by I7 on any project set to Glulx. In line with the existing text substitutions "[the Thing]", "[The Thing]", "[a Thing]", "[an Entity]", for the name of something together with the given article and casing, "[A Thing]" and "[An Entity]" have been added, providing for a capitalised indefinite article. Technically a new feature rather than a bug fix: if an object is established as a proper noun, in that its name as specified by "called" does not begin with a standard English article - for instance "A man called your local vicar is in the Belfry", where "your local vicar" is treated as a proper noun - then this name will be capitalised if the object's name is printed with "[The whatever]", "A whatever" or "An whatever". (Thus "Your local vicar" would be printed instead of "your local vicar".) Kinds can now have plural names. This will relatively seldom be useful, but the result is that the text "A house is a kind of thing. Some windows are a kind of thing. Some windows are part of every house." - will now result in a house's windows being deemed to have plural names (which for instance means they will produce better messages with the Plurality extension). Conversely, fewer plural names are now understood by the run-time parser: an over-eagerness to recognise plurals of the names of unique, one-off items was sometimes leading to name clashes and consequently misinterpreted input. Examples: "Alpaca Farm" -- modified for new held rules "Ballpark" -- added commentary to better explain the function of the table "Beachfront" -- added commentary to explain the order of operations of the rules "Beneath the Surface" -- modified to account for changes to the held token "Big Sky Country" -- modified to account for the removal of the DIG action "Bruneseau's Journey" -- modified for the fact that BLOW has been removed "Bumping into Walls" -- substantially simplified entire example to demonstrate simpler handling of the problem "Cloak of Darkness" -- modified for new held rules "Crane's Leg 1" and "Crane's Leg 2" -- removed "a thing has a thing called the ideal" and replaced this with a relation and some discussion of why it is better to use relations than object properties "Curare" -- added to demonstrate a possible use of descriptions "Dig" -- removed, since it showed how to get around a problem that is no longer a problem "Down Below" -- added a demonstration of >FLIP grammar for the light switch, and corrected a bug that would have allowed the switch to be interacted-with from rooms other than the basement "Lakeside Living" -- modified to account for the removal of the swimming action "Model Shop" -- added a few extra lines showing how to make alternative names for the created buttons "Morning After" -- comment added to explain the meaning of "carry out" "Pine" -- modified to account for the removal of the swimming action "Polarity" -- comment added to explain "first carry out going rule" "Reflections" -- modified to account for the removal of the blowing action "Revenge of the Fussy Table" -- redundancy removed from one definition "Space Patrol - Stranded on Jupiter!" -- modified to account for the removal of the DIG action "Tamed" -- modified also to model the case of a room whose exterior is visible in another room (ie, nested locations) "3 AM" -- modified to reflect the changes to the held token "Trachypachidae Maturin 1803" -- modified to reflect changes in the held token "Transmutation" -- added example on group relations, thanks to Jesse McGrew "Under Contract" -- modified for the fact that various actions have been removed "The Unexamined Life" -- modified to reflect changes in the held token "A View of Green Hills" -- comment added explaining what noun means in this context "Waterskin" -- modified to reflect removal of blowing action "Would you...?" -- more comment added explaining the behavior of edible things "Zodiac" -- added missing line to the first version of the scenario "Zorn of Zorna" -- modified to reflect removal of blowing action A new information-only example has been added to the chapter on Rulebooks, giving a Backus-Naur form grammar for Inform's rule preambles Worked Examples: "Bronze" -- modified to reflect myriad changes to action definitions and held tokens "Glass", "When in Rome 1", "When in Rome 2" -- modified to remove a few responses to now-undefined actions "Damnatio Memoriae" -- modified to reflect changes to held tokens; fixed minor bug about thinking on the first turn "Reliques of Tolti-Aph" -- modified to reflect action changes Extensions: "Complex Listing" modified to deal with the new specification type, and advanced to version 3. Please note that "register things marked for listing" is now not necessary in most cases: see the documentation. The SCENES testing command now summarises the current situation when scene tracing is switched on - the story so far, as it were. Changes in the type-checker should cause Inform to compile slightly more efficient code: it also checks a few more cases, and notably that the parameters of an action in a "try" phrase are genuinely of the right kind of value for the action in question. Bug fixed in which phrases to decide if something-or-other would sometimes not properly be parsed where they naturally begin with "the": so that, for instance, the condition "if the action requires a touchable noun..." would sometimes fail because of the "the". Bug fixed to do with spurious paragraphs such as "On the mantelpiece is a brass clock." being produced in room descriptions when the mantelpiece is scenery, and the brass clock has already been mentioned. Bug fixed whereby the creation of three things X, Y and Z with text in the pattern "an X of Y and a Z" would sometimes cause Z to be created with no article, i.e., as if its name were a proper noun - ignoring the "a". Bug fixed whereby testing if "X is in R", where X is a thing and R is a region, would always come up negative even if X was in a room inside that region. It now makes the obviously intended test. Bug fixed to do with incorrect casing when printing a literal value in a pattern which includes words already occurring earlier in the source with different casing from that in the pattern. Bug fixed causing programming errors to appear at run-time when attempting to push an enterable container between rooms while within it (by punting down a river, perhaps). Bug fixed causing occasional hangs, under Glulx only, when the player character in inside or on something and also has component parts. Bug fixed causing snippet replacement to leave the wrong number of words behind, under Glulx only. (Windows only) Clicking on a link in a problem report that points to an extension does not open a new window if the extension is already open in another window. Problem messages added for duplicate definitions of verbs or prepositional usages. Problem messages to do with misphrased property declarations improved. --------------------------------------------------------------------------- 3V01 (2 August 2006) Rather than being a bug-fixing build, this build carries out a number of significant internal reforms, some outwardly visible and some not. For the first time, compilation to the Glulx virtual machine rather than the Z-machine is possible. As the option on the Settings panel for a project suggests, we had always intended this to be a possibility, but too much was involved to get Glulx working in time for the public beta. In the future, we hope that Glulx will provide a solidly reliable platform for larger and for multimedia works: at present, though, our aim is simply to allow larger works to be compiled: and there are a few restrictions on screen effects, with some code (particularly to do with coloured text) not yet working. Glulx support in this build is experimental at best: we ask users not to send bug report forms yet, and would advise that people avoid publishing works compiled to Glulx rather than Z. With that said, we do believe that worthwhile progress is being made. The most important change in adapting to Glulx was the switch to an Inform 6 library derived from library 6/11, the current biplatform I6 library: up until now, Inform 7 has used a heavily adapted I6 library referred to as "6/10N", derived from both 6/9 and 6/10. The new library, "6/11N", is the work of Jesse McGrew: our intention, once Glulx support is stabilised a little, is that this will eventually become library 6/12 - that is, the standard I6 library for use by both I6 and I7 authors alike. This should finally bring together branches of work on the I6 library which have been divergent for three years now. For the most part, the change of library will be invisible to I7 users, but the adoption of various I6 bug-fixes and improvements between 6/9 and 6/11 should subtly improve the behaviour of Inform story files at run-time. Inform now reacts more helpfully to various overflows in Inform 6: thus, if Inform generates code which overflows the size of the Z-machine or breaks one of Inform 6's memory settings, rather more useful pages of advice are displayed. As promised, the deprecated "means" and "means that" features have been withdrawn, and removed from Chapter 19 of the documentation. The meanings of "in" and "on" have been made stricter: in past builds, the test "if A is in B" would pass if, e.g., A was being carried by a person B: this now fails. "A is in B" requires B to be a room or container; or else requires A to be a room or region, and B a region. Similarly, "A is on B" now requires B to be a supporter. The point of these reforms is that the built-in relations (well, all relations, really) ought to test as the same relation that they assert: asserting "The spanner is in the box." implies that "the box" is definitely not a person, so it is wrong for "if the spanner is in Fred" to succeed where Fred clearly is a person. Because it is, nevertheless, useful to be able to test "by whatever means A is immediately carried by B", the meaning of "to hold" has been changed to this relation. This accords with the meaning of the existing construction "the holder of A": thus "B holds A" if and only if B is "the holder of" A, and one can talk about "things held by B", and so on. In previous builds, "to hold" was synonymous with "to carry", and implied that the holder was a person: clearly, this is no longer true. A bucket can "hold" sand, a table can "hold" place settings, and so on. Note that, as with "holder of", the parts of something are also deemed to be "held" by it. Examples: Minor changes have been made to a small number of examples to reflect this stricter sense of "in"; Two new examples, "Bees" and "Zqlran", demonstrate a random maze and and an exotic time notation respectively. Bug fixed so that "now" is able to change variables and properties, e.g. by writing "now the score is 132" or "now the carrying capacity of the player is 10". (In general, the "now" mechanism for asserting things has been rewritten, and should be more capable all round.) When Inform deals with descriptions such as "the people who are in lighted rooms", it compiles code using Inform 6's "objectloop" construct. The running speed of the result depends in part on the form of objectloop used, and in general it is fastest to try to minimise the size of the set of the objects looped through. Inform 7 now does a better job of minimising this set, and tries to avoid circumstances in which it is forced to loop through every object in searching for a match to a pattern. (It is possible that, in a limited number of cases, a description such as "if a woman (called the shopper) is in a shop, ..." will now result in a different woman being written into the "shopper" value than would have happened under previous builds - still a woman who is in a shop, but maybe not the same one. This might possibly affect Transcripts being used for testing.) Because this optimisation trades memory space for time, it is switched off if "use memory economy" has been requested. Values of kind "rule" can now be said - the result being to print their names: e.g., "can't turn scenery rule". This will probably only be useful for debugging, or the writing of surrealist competition pieces. The scene icons missing in build 3T38 for OS X have been restored. The crash occurring in build 3T38 for Windows to do with "a, b, and c" has been fixed. Bug in listing installed extension documentation fixed. Problem messages in the EPS map-maker generally tidied up. --------------------------------------------------------------------------- 3T38 (10 July 2006) (Windows only) Boxed quotations are now correctly displayed in the game tab. (Windows only) Extensions can be created, opened and edited within the application. (Windows only) If an error occurs in an extension, clicking on the link in the problem report opens that extension. (Windows only) The file dialog for installing extensions now allows multiple files to be selected at once. (Windows only) Undo and redo in the source tab now works correctly with Unicode characters. (Windows only) Added a "Trim skein" button to the skein tab, which removes all unlocked skein knots. The "means" and "means that" syntaxes are being withdrawn. These were always rather crude word-substitution devices: to quote the documentation, "now deprecated... may be withdrawn". In this release, the Standard Rules no longer use the syntaxes even internally, and this prevents a number of slightly odd side-effects related to the words "above" and "below". In the next release, the ability to use the "means" and "means that" syntaxes will be removed altogether. Two new relations are built in to Inform to handle doors and locks; the verbal forms "to be through D" and "to unlock D" express these. This mimics syntax previously achieved using "means that", but works in a much tidier way, and is more flexible: for instance, "things which unlock the Great Gate" is now a legal description. Type-checking extended further into the descriptions D used in constructions such as "total P of D" or "a random D", and into complicated descriptions given as part of the conditions for rules to apply. (For instance, "Instead of taking a container in 100" - clearly absurd, as how can a container be inside a number? - now produces a problem message.) Examples: "Uptempo" given a better "fast time rule". In some 21 of the examples, the syntax "-- has a property called --" has been rewritten to be more specific about what kind of value is involved. (For instance, to say "-- has some text called --" if the property will hold text.) This is better style, and allows Inform to check usage more carefully. Unnecessary Inform 6 general parsing routines are no longer compiled for kinds of value which are not ever parsed: under some circumstances this can save a significant amount of space at run-time. Problem message added for grammar token trying to understand a kind of value which cannot be parsed, such as 'rule' or 'scene'. Improved problem messages for property declarations, and allowed property declarations to create properties whose values have to objects of a given kind. Improved problem message for when "Understand the command..." goes bad. Improved problem message for incorrect usage of "... condition" names. Added problem message if a verb is defined with two present plurals (as this can't be right, and usually means that someone has tried to define the past tense using "they" rather than "he", "she" or "it"). Added problem message for an attempt to "change O to A", where O is an object and A is an adjective the truth of which can be tested, but not changed (e.g. "change O to visible"). Added problem message for creating a kind of value containing "of". (This never worked, due to all kinds of grammatical ambiguities, but used to fail with an inexplicable problem message: now it fails with an apology.) Extended the range of what can be negated using "now", so that, e.g., "now Elizabeth does not love anyone" is now allowed. (An obvious feature whose absence was reported as a bug, but technically it's new.) Removed spurious problem message claiming that certain "after" rules would have no effect. Fixed bug whereby arbitrary text could, under some circumstances, match the "[number]" token of grammar. Fixed bug under which rules applying to actions done for the Nth time might fail to apply if these actions had been interrupted by other actions earlier in the same turn (e.g., to implicitly take something before moving on to do something with it). Fixed bug whereby specifying that one of the named built-in rules belongs to another rulebook (i.e., as well as its usual one) would result in one of the two rulebooks being a partial duplicate of the other. Fixed bug causing "item described" (and the thing implicitly meant by a bare property name) in a text with substitutions to refer to the wrong thing, when this text is being printed from within another text with substitutions. Fixed bug in which tests such as "if not visited" sometimes lost the sense of the "not" and instead tested "if visited". Fixed bug whereby route-finding and counting steps through reciprocal various-to-various relations would sometimes give incorrect results if the relation had been changed from its initial state at run-time. Fixed bug by which "everything" was not always equivalent to "every thing", and similarly for "everyone", "everybody" and "everywhere". Fixed bug to do with parsing times of day around midnight and midday. Fixed obscure bug to do with editing the player's command. (Well, in fact Jesse McGrew fixed it.) Fixed bug in which a property is being declared as possible but whose name coincides with a participle of one of the containment verbs. (E.g., "A weapon can be worn.") Fixed bug whereby a rule about "doing something" (unspecified) to some specific kind of noun would result in run-time errors if the current action did not take a noun, e.g., when looking. Fixed bug whereby setting the printed plural name of a kind might lead to a failure to compile through Inform 6 (due to a duplicated "plural" property). Fixed two unrelated bugs to do with apostrophes inside commands leading to grammar declarations which failed to compile through Inform 6. Fixed bug causing spurious problem messages with garbled text: this affected the examples "Table Foosball" and "Air Conditioning is Standard". (We believe the bug only manifested itself under Mac OS X running on an Intel processor.) Fixed bug causing scene begin/end conditions to go wrong if they tried to use the "location of X" phrase. Fixed bug causing problems with scene begin/end conditions to be reported at the wrong sentence of the source text. Spurious newline after "That noun did not make sense in this context." removed. --------------------------------------------------------------------------- 3R85 (26 June 2006, a rapid replacement for a mis-uploaded 3R84) (Mac OS X only) Direct "Install Extension..." option added to the File menu. (Mac OS X only) Extension documentation auto-updated when any file added to the extensions area, even if dragged by hand in the Finder. (Mac OS X only) Bug fixed that was causing Inform projects sometimes to appear as directories, and to fail to open on double-clicking. (Windows only) Differences between the game's current text and the blessed text in the transcript tab are now underlined. (Windows only) The transcript is now saved in the same format as the OS X application. (This means that any blessed transcript text saved from an earlier version will have to be recreated.) (Windows only) The source tab now correctly colours nested comments. (Windows only) Entering a carriage return with the shift key held down no longer results in text that the compiler rejects. (Windows only) Setting the focus on the game tab by clicking in it with the mouse now keeps the input cursor on the input line being edited. (Windows only) Added a warning dialog to the "Bless All" button on the transcript tab. (Windows only) The bless buttons on the transcript tab are now disabled if there is nothing to do. (Windows only) If the registry DWORD value "HKCU\Software\David Kinder\Inform\Start\Open Last Project" exists and is not set to zero, then when starting the application just opens the last project, rather than displaying the splash screen. If the registry DWORD value "HKCU\Software\David Kinder\Inform\Window\Clean Up Indexes" exists and is set to zero, then when closing a project the index files are not deleted. (Based on patches by Dan Shiovitz.) Documentation on newly installed extensions, not yet used, is now much fuller. This breaks the impasse of "can't use this until I read the documentation, can't read the documentation until I use this". Examples: "Abolition of love": removed comment that shouldn't have been there "Bruneseau's Journey" slightly modified for tidiness Minor errors exposed by the improved type-checker fixed in "Prague", "Glass", "Crusoe", and "Underlying" Extra commentary and new material added to "Laura" to explain parsing of complex phrases better "Would you...?" added to demonstrate checking for the existence of a property "First Name Basis" added to demonstrate how to assign synonyms to objects "Tiny Garden" added to demonstrate a very simple implementation of continuous space "Equipment List" added to demonstrate and explain variant inventory styles "Tense Boxing" added to demonstrate past and present tense rules more completely "Grilling" added to demonstrate a supporter from which the player cannot take things "Removal" added to demonstrate a revised taking report "Nameless" added to demonstrate an ASK verb that works on objects, like SHOW "Stone" added to demonstrate rules used as properties of things Extensions: "Basic Screen Effects": minor errors exposed by the new type-checker fixed "Locksmith": added yet more rule names; substantially updated to provide better defaulting and add a "keychain" kind; advanced to Version 2. "Rideable Vehicles": added rules to prevent mounting when already mounted, and to convert the exiting action to dismounting; added example. Two new adjectives, "on-stage" and "off-stage", have been added to the stock of those built in to Inform. See 7.9 in the documentation, "Removing things from play", for more on this; in particular, note that the previous reference in 7.9 to testing whether a thing is "somewhere" has been withdrawn. (This led to numerous difficulties with ambiguity, and in any case was not very explanatory.) We now test whether a thing is "on-stage" or "off-stage". Type-checking for conditions has been substantially rewritten. This mainly affects "if", "when" and "now", but other phrases too, and generally makes Inform stricter: for instance, "if the time since Escalating Danger began is greater than 1" used to work - but now I7 points out that a time cannot be compared with a number, and insists on "1 minute" rather than "1". This picked up minor errors in "Glass", "Reliques of Tolti-Aph" and the examples "Underlying" and "The Prague Job". The check removing rules have been rewritten. Previously, these duplicated the check taking rules, almost right down the line: in effect the two actions did the same thing, though being reported slightly differently. In the new version, a new rule called the "convert remove to take rule" actually converts the action from removing into taking at an early stage: the practical effect of this is that any before or instead rules written to cover taking now also cover removing. This is good because it means one no longer needs to remember to cover both these actions to be sure of handling the case of an actor picking something up. The scope of the "removing" action is changed so that if something is part of X, then it is in scope for "remove -- from X": previously, only the things inside X qualified. Being in scope for the action does not mean that the attempt to remove the part will succeed, of course, and it will normally fail the "can't take component parts rule": but being in scope does mean that the designer can write rules to allow removal after all. Problem messages improved for mysterious problems arising from trying to use local "let" variables in substituted text which turns up elsewhere in the source, i.e., in places where those variables do not exist. Problem message added if two rules are being added with the same name. Fixed bug which caused negated conditions in the past and perfect tenses to fail: I7 would read, e.g., "if the box had not been open" as "if the box had been not open", which would generally be true much more easily. Fixed bug whereby actions declared without any mention of what they applied to (e.g., "Requesting help is an action out of world." rather than "Requesting help is an action out of world applying to nothing.") would sometimes lead to spurious incompatibility Problem messages when grammar is defined for the action. To clarify: from now on, an action which does not say what it applies to, applies to nothing. (This is tacitly assumed by some of the extensions source text already.) Fixed bug in which I7 allowed names with double-quoted text in, only to crash at the I6 stage; when the cause was actually a misunderstanding of the punctuation rules by the user. Fixed bug to do with names beginning with the word "kind", such as "kind gentleman". Fixed bug which caused properties declared by the "(called ...)" text in a new relation to have not quite the right type, causing odd type-checking problems elsewhere. Fixed bug in which negatively phrased implications would sometimes be read as if positive (e.g., "Scenery is never cold" is an implication not an inference because it concerns all things which have a given property at the start of play, not all things of a known kind; and it was being misread as if "Scenery is always cold"). Fixed bug to do with initialising variables whose kind of value is "miscellaneous-value" or "string-of-text" (though the author of Inform wishes people wouldn't use hacky internal kinds of value with hyphens in the name, really). Fixed bug in which spurious problem messages occasionally occur when giving grammar which specifies only one of two required things to which an action will apply; and generally improved the previously uninformative "not compatible" grammar Problem message. Fixed bug in which "now" does not always set properties correctly. Fixed bug whereby Problems in the final chunk of a text with substitutions used explicitly as a value were not always reported. Fixed bug to do with relative clauses in property values (which are not allowed, but used to cause an internal error rather than a proper problem.) Fixed bug in which errors on grammar verbs were sometimes reported quoting the previous Understand... sentence in the source, not the one in which the error occurred. Fixed bug in sentence-breaking, whereby text ending with sentence-closing punctuation, immediately followed by a single word sentence in which the word was capitalised, would cause that single word to be ignored. Fixed bug whereby "else" was not always equivalent to "otherwise". Fixed bug to do with permissions for the "initially carried" property. --------------------------------------------------------------------------- 3P53 (9 June 2006) (Windows only) The Transcript tab is now added - a major feature, and the only one omitted from the Windows application in the first public beta release. (There is one caveat: the transcript does not yet underline differences when the game text does not match the blessed text.) (Windows only) Switched to using the NullSoft Installer System to create the installer. If you have a previous version installed, you should uninstall it from "Add or Remove Programs" in the Control Panel before installing this version. (Windows only) The "Install Extension" menu item no longer rejects extensions with Unix-style line endings. (Windows only) The "Install Extension" menu item shows the installed extensions documentation page after a successful install of an extension. (Windows only) Clicking on an item in the search results window now always brings the appropriate tab to the front. (Windows only) Compiling a game no longer steals the input focus from the Source tab. (Windows only) It is no longer possible to put the edit windows into "smart quotes" mode. (Windows only) The Game and Build menus have been merged. (Mac OS X only) Mechanism for installing extensions now added: simply click the [+] button in the Extensions panel of the application Preferences. Installed extensions may also be edited using "Open Extension >" in the File menu. (Mac OS X only) The 'Standard' library is now standard for Inform 6 projects. (Mac OS X only) Projects with a setting for a version of the Inform 6 compiler that is not installed no longer crash the application (and choose a sensible alternative version). (Mac OS X only) I6 compiler used internally is now bi-platform 6.31, not 6.30. Improved "Help" menu offers short-cuts to the Recipe Book and the Installed Extensions documentation. Examples: "The Abolition of Love" added, as a thorough exploration of all the kinds of relations which can be set and unset. "Beachfront" added to demonstrate finding an object in a room which was not there before; "Van Helsing" added to demonstrate a character who follows the player from room to room. "Exit Strategy" added to demonstrate the beginning of scenes once in more detail, and to describe what it means when the scene change machinery is stuck (and how to diagnose and fix the problem). "Otranto": dealt with a bug such that a rope tied to a door did not restrict the player's movement appropriately. "Tamed": typo fixed. "Up and Up": minor fix for a description assigned to the wrong object. "Day One": waiting added to the selection of acceptable activities for which Freitag will not glare at the player. "Stately Gardens": typo fixed. "Sybil 1": additional comments and code to demonstrate some expanded forms of keyword matching. "Port Royal 3": fixed a typo that was causing part of the source not to copy properly into the code window. "Odyssey": minor syntax improvement to get rid of ugly legacy form. Extensions: Basic Screen Effects (now version 2): modified so that local variable names are less likely ever to conflict with globals or other names in the author's work; "clear only the status line" added; "left alignment depth" variable added, allowing the author to print status elements at a different spacing than 14 spaces from the left edge of the screen; Menus: added arrow and escape keys as viable means of input; rule names added to several rules to make modification easier; local variable names made less likely to conflict. Plurality: changed "acts plural" phrase to apply to all objects, not just "things". Complex Listing (now version 2): corrected erroneous documentation; added "enumerated listing" option. Made a general rewrite of the type-checking machinery: the new version is more extensively tested than the old (and produces slightly better Problem messages), but otherwise there should be no perceptible change. Made it possible to unset a wider range of relations with "now". For instance, if "loving" is a one-to-one relation, then "now Elizabeth does not love Darcy" is now allowed, if sad. Added a new text substitution "[conditional paragraph break]". Problem message added for tables defined with names which already have a meaning, leading to ambiguity (e.g., "Table of Three", since "three" is a number), with specific checking for clashes between table and kind named (e.g. "Table of Rooms"). Problem message added for use of 'either' on a list of 3 or more possibilities. Problem message added where "number of ..." or "total ...", etc., are used with a determiner which makes this nonsensical ("number of at least three rooms", etc.). Problem message added for contradictory redefinition of global variables. (Non-contradictory redefinitions are superfluous but legal.) Problem message added for incorrect uses of "with", and an explanation supplied (where previously an internal error would sometimes occur). Fixed bug whereby '(called ...)' used incorrectly in a scene beginning or ending condition could cause an internal error, and added a suitable Problem message. New phrase option for "list the contents of...": "with extra indentation", which increases the left margin by 1 level of indentation - which simulates the way that the standard inventory listing looks. References to tables can now refer to the table in question using a local or global variable, or a phrase to decide which table to look at. Fixed bug whereby certain names consisting only of an article would lead to an internal error (thus producing the record-holder for shortest source text breaking I7: "A is a room."); and similarly for a name which includes parentheses "(" or ")", also not allowed. Fixed bug: it's now possible to release a game with a website and cover art in PNG format, where previously the website assumed JPGs were used (although the compiled game itself was fine all along). Fixed bug to do with return values from activities being lost (with thanks to Jesse McGrew, who provided the solution). Fixed bug whereby a complex listing early in a "say" would cause a conditional [if] to go wrong later in the "say". Fixed bug in the debugging command RELATIONS causing it to print some relations the wrong way round, and to omit some relationships with reciprocal various-to-various relations. Fixed bug whereby released story files still contained some debugging verbs. Also accidentally left in was the I6 verb FULLSCORE: this no longer works, and is deprecated now that there are better ways to achieve the same effect. In this build, the action and corresponding grammar are removed, leaving it open for designers to provide their own versions if they choose to do so. Fixed bug in which "X are not Y" would sometimes complain of unproductive negative even if Y is such that not-Y is unambiguous, whereas "X is not Y" would work in similar circumstances. Fixed bug where attempts to unlock something with the wrong key produced the wrong pronouns in the failure message. Fixed bug where "each turn" and "check" rules were confused in the Rules index, and straightened out the spacing of this index. --------------------------------------------------------------------------- 3M43 (21 May 2006) (Windows only) Search highlighting in the documentation tab doesn't keep applying to further pages as you nagivate around. (Windows only) If nothing is found when searching, a dialog appears as feedback. (Windows only) Replacing text in the source tab no longer goes into an infinite loop if the new text contains the old text as a substring. (Windows only) If the registry string value "HKCU\Software\David Kinder\Inform\Window\Font Name" is set, its value is used as the application font. (Windows only) If the registry DWORD value "HKCU\Software\David Kinder\Inform\Window\Font Size" is set, its value is used as the application font point size. Fixed example "Pink or Blue" to deal correctly with one-letter inputs. Added a few words of explanation to example "Crusoe" to help people find the bit of the action that needs replacing. Twelve new Examples added, as straightforward demonstrations: "Escape" - the most basic imaginable window. "Down Below" - the most basic light switch. "Replanting" - changing the results of trying to take an immovable object. "Up and Up" - a travel description printed before moving between rooms. "Neighborhood Watch" - a door lockable without a key but only on one side. "Slightly Wrong" - a room whose description is unusual on the first visit. "Laura" - use of a printed name and understand to get around particularly awkward-named objects. "Tamed" - enterable containers and supporters and to explain a few details of when we might say something was transparent. "Grace" - preventing the player from traveling to a distant location without a vehicle. "Verbosity" - using full-length room descriptions. "Infiltration" - how to change a room description on each of several visits. "MRE" - various timing things, heavily commented. Minor changes to examples "Finishing School" and "Lean and Hungry" to address the complaint that general rules were being written but only really made sense for specific individual NPCs. Minor changes to "Garibaldi" examples to correct a terrible error (the Medlab being called Sickbay, in violation of the game's nominal setting). Typo removed from example "Get Me to the Church on Time". Correction of "Hagia Sophia" example to try exiting the chair silently. Review sections added to chapters 3 and 17 of the documentation. By popular demand (two people asked for this) "now X is not P" is now legal, where P is an either/or property: thus "now the four-poster bed is not scenery", for instance. Extended "let" to allow "rule" as one of the kinds of value allowed. Changed rules on the ' character so that it is not translated into " when it begins text and is immediately followed by s and a space. (This so that the apostrophe in "[The Kitchen]'s decor is awful." is not converted to a double-quote.) Improved behaviour of "called", so that sentences involving relationships with objects which are "called" now work: for instance, "The white door is north of a room called the Hot and Cold Room." Unexpectedly capitalised articles following "called" are now no longer read as articles. Thus, "South of the Passageway is a room called The Great Hall of Infinity." will preserve the capitalised "The" in the room's name. Adjusted priorities in parsing so that table column names are considered less likely to be intended than kind names. (This affects works where a kind has its instances created by a table, since column 1 of that table will quite likely have the same name as the kind.) When things are created by table (as in the example to do with Tour de France jerseys), any articles in front of their names are now recognised, just as if they had been created by regular sentences. Fixed crash on "Yourself is nowhere" (sic). Fixed crash sometimes occurring in indexing of rulebooks attached to scenes. Fixed crash (or sometimes other misbehaviour) on an over-complicated say. Fixed compiler hang when complicated assemblies never end. Fixed failure to check incorrect usage of 'called' in defining one-to-one relations which are not reciprocated. Fixed failure to report improper usages of the (supposedly internal use only!) syntax "...an action corresponding to...". Fixed failure to reject matches of vague descriptions against specific ones in type checking, so that (e.g.) "an open door" would be accepted against "(D - a door)" in a phrase definition. Fixed a bug in which complicated creations of kinds sometimes ignored their adjectives: e.g., 'A radiant panel is a kind of backdrop which is lit.' would sometimes silently ignore the "lit" part. Fixed a bug - well, arguably clarified an ambiguous specification - so that a printed name for a kind is now inherited by things (or rooms) of that kind. Restored the (nowhere documented and theoretically unofficial) debugging command RULES to working again. --------------------------------------------------------------------------- 3L95 (14 May 2006) (Windows only) If compilation fails, index pages from the previous compilation are kept. (Windows only) Invalid characters cannot now be entered into the new project name field. (Windows only) The File/Revert menu item has been removed, as it was misleading quite a few people. (Windows only) Characters input with the AltGr key held down (such as ']' on a Spanish keyboard) can now be entered in the Source and Game panels. (Windows only) Inform 6 code is coloured grey in the Source tab. (Windows only) The application now works with IE7 installed. (Windows only) The installer would sometimes fail to reinstall a new version if the old version was not uninstalled, leading to an incorrect install and two entries in "Add and Remove Programs". This should now be fixed. (Windows only) The application should now cope if the "My Documents" path is something like "G:\". (Windows only) Replace now works if the string being searched for is only a case insensitive match. (Windows only) The Source tab now has the standard edit context menu available if you right click on it with the mouse. (Windows only) Fixed mis-addressing of the blue "go to documentation" links, which always linked two pages after the one intended. (Mac OS X only) Added a "Prune" button to the skein, with a slider control for the severity of pruning required. (Mac OS X only) Added a font size option in the Preferences, affecting all the panels simultaneously. (Mac OS X only) Removed the spurious error on the extensions contents page about incorrect extension "Standard Rules.zip". Various minor clarifications added to documentation, and new section 3.24 ("Directions") added. As the beginnings of a process of adding reviews at the end of each chapter, brief notes are added to the ends of chapters 9 and 10. Fixed bug in extension Plurality by Emily Short which involved noticing the plurality of items mentioned by the player but not printed in the text. Added two new Examples: "Feline Behavior" and "Panache". Minor changes to Examples: Being Prepared, Model Shop, Ballpark: added comments. Crane's Leg I and Eddystone: modified because of type-checking bug. U-Stor-It: fixed bug to do with cards appearing on all of the chests. Fussy Table: added understanding of "chair" as a chair. Yolk of Gold: rearranged rule order. Added the implication that something locked is usually lockable. This in practice means that doors and containers described as being locked at the start of play are considered to be something which the player could in principle lock or unlock, given the correct key. (In the absence of information about that key, the player will still not be able to lock or unlock them, but will get a more realistic reply from the game in response to attempts to unlock.) Added "persons" as an alternative plural of "person" (the usual one being "people"). Fixed nested comments: thus "[This [even so] is all one comment.]" Improved the "hawk is a handsaw" problem message. Improved the problem messages for incorrectly specified rules. Improved problem messages for "now ..." used with a condition which cannot be directly arranged during play, such as "now Scene IV is happening", and for "now ... and ...". Improved problem messages for assertions where it seems possible that the wrong primary verb has been construed. Problem message for understand followed by an incorrect action corrected (it was previously recommended as correct usage something which wasn't). More explicit problem message for an attempt to create a "part" of a room. Added run-time problem message for using the bare condition "in R" where R is neither a room nor a region. Fixed bug whereby an assertion containing three or more consecutive property adjectives ("a red rough square block is on the table") would have only the first two acted upon. Fixed bug in which rules whose premiss contained an unrecognised action plus the explicit word "rule" would activate every turn, rather than produce a problem message. Fixed bug to do with rules beginning "Check/report/carry out", then an action name including "it", then a conditional clause with "when" or "while". Fixed bug in which using a "To say ..." phrase in the middle of a complex say would cause it to lose track of conditional saying, sometimes resulting in both "[if ...]" and "[otherwise]" parts being printed. Fixed bug in previous fix for failure to object to names of things or rooms containing literal double-quoted text (which then failed to compile through I6). Fixed bug to do with assigning properties to a null object when "it" is currently undefined. Fixed bug to do with incorrect sorting of rules as between a rule specifying "going ... in..." and one specifying "going ... from...", where there are at least three such defined in a particular order. Fixed bug in which run-time type-checking did not resolve which phrase definition to use where they differed only in properties of objects (for instance, distinguishing "To recite (something - closed container)" and "To recite (something - open container)"). Fixed bug which very occasionally caused a "bad check-against in run-time type check" internal error. Fixed crash if a Table is improperly named (or not named at all), and added checking to enforce the rules on Table names. Fixed bug confusing ordinal and cardinal numbers in assertions (so that "The third man is here." would be misread as if "Three men are here."). Fixed bug if a region is created whose name begins with a direction or other indication of location ("East of Eden is a region.", say, or "On the Prairie is a region."). Fixed crash if a room is created only by implication and with no name. Fixed failure of sentences like "East of the Garden is the Gazebo." to establish which room is currently under discussion (the Garden): this meant that some source text in the documentation and website failed. Fixed bug in which if pronouns would sometimes be assigned to implicitly created things: for instance, in "A nose is part of every person. ... George is a man. He wears a shirt and a pair of pants.", "he" was incorrectly thought to refer to George's nose rather than George. Fixed bug (or arguably added feature) so that named rules can be property values, that is, so that a property can have "rule" as its kind of value. Fixed bug in which values that vary, such as "location", were allowed by I7 as table entries, only to fail to compile through I6; and added problem message for the special case of "player". Fixed bug in which initialising a value that varies to itself, or to another value that varies, was not reported as a problem, and fell through to fail in I6. Fixed bug in which attempts to manipulate the properties of kinds would sometimes not be reported as problems, and fall through to fail in I6. Fixed bug in which properties of indefinitely described objects, used as the subjects of verbs, failed to compile in I6. Fixed bug in which, in some circumstances, the character "@" used in text failed to compile in I6 (making it hard to write email addresses). Fixed bug in which "(called ...)" used improperly in adjective definitions was not reported as a problem, and fell through to I6. Fixed bug in which doors described both as one- and two-sided would not be picked up as a problem. Fixed bug in which explicitly starting the player in a container which is not contained in any room would fall through to an error in I6. Added a very limited ability to cope with "if X has P greater than N", where P is a property, and fixed bug whereby uses of "to have P" resulted in internal errors: those which cannot be compiled now result in better problem messages. --------------------------------------------------------------------------- 3K56 (4 May 2006) (Mac OS X only) Support for OS 10.3.9 restored. (Mac OS X only) Build number now correct in Finder's Information window for the application file. Changed the "tieing" action to "tying". (Inform's British author thought this was an American spelling, and vice versa. Sorry.) This entailed changes to examples Otranto, Brown, Snip, Snip Snip, and Under Contract. Bug in U-Stor-It example fixed, and Disappointment Bay 12 slightly improved. Tidied up documentation of Basic Screen Effects and Plurality extensions. Fixed the "South is a dead end with printed name "Collapsed Dead End"." bug causing the Undertomb example in the main text to fail to compile. Fixed problem with the "Early Childhood 4" example. Fixed compiler hang to do with misunderstood sentences setting the kind of a kind to itself. Fixed internal error on "now X is P", where X is a thing and P an property which isn't an either/or property. Fixed problems with defining a kind which includes the word "object". Fixed internal error on sentences using "to have" incorrectly. Fixed internal error on assertions giving inexplicit information about the kinds of things (asserting kind(f(x)) = y where f(x) is unknown). Fixed failure to object to malformed sentences caused by misunderstanding of the punctuation convention about quoted text ending sentences. Fixed failure to object to names of things or rooms containing literal double-quoted text (which then failed to compile through I6). Fixed failure to object to negative assertions in the form "The P is not X.", where P is a property taking a value. --------------------------------------------------------------------------- 3K27 (30 April 2006) First Public Beta build, and the baseline for this log.