26.8. What was new in build 4X60 (23 August 2007)

| Chapter 26: What's New in Inform? |

| 26.8. What was new in build 4X60 (23 August 2007)

As this release was being prepared, Russian submersibles planted a flag on the North Pole, 4.2 km underwater; there was a crackdown on counterfeit toothpaste in Mozambique; forest fires threatened Dubrovnik, while Minnesota flooded; there was a single, unconfirmed sighting of the Yangtse River Dolphin, thought extinct since 2004; the Unix court case, SCO v. Novell, found for Novell; the quarterback of the Atlanta Falcons pled guilty to "conspiracy to sponsor a dog"; and Peter Stoychev of Bulgaria broke the speed record for swimming the English Channel.

In the world of Inform, build 4X60 introduced the Recipe Book to the in-application documentation, and made a number of internal reforms, notably improving the speed of table handling at run-time.

See Text with random alternatives for a new "[one of]...[at random]" text substitution, adopted into the core language from an earlier implementation in the extension Text Variations by Jon Ingold

See Files for reading and writing external files in projects using the Glulx virtual machine: most tables can be "serialised" (i.e. stored to an external file) this way, and files can also hold general text

See Defining new adjectives for the ability to name the subjects of adjective definitions, rather than having to use the sometimes grammatically clunky pronoun "it"

See Examples and headings in extension documentation for the new ability to supply extensions with structured, multi-part documentation rather than a single run of only a few paragraphs

See Segmented substitutions for how to define multi-part text substitutions using Inform 6 code, a practice reserved for Extensions

See Invocation labels, counters and storage for documentation on some of Inform's previously closed internal syntaxes for specifying complex phrases, which are now opened up for the use of Extensions

See To say one of for how Extensions can contribute additional "[one of]..." constructions

429
| Example Alien Invasion Part 23 Keeping a preference file that could be loaded by any game in a series. |
RB

298
| Example Baritone, Bass Letting the player pick a gender (or perhaps other characteristics) before starting play. |
RB

58
| Example Bic Testing to make sure that all objects have been given descriptions. |
RB

444
| Example Blink Making a "by atmosphere" token, allowing us to design our own text variations such as "[one of]normal[or]gloomy[or]scary[by atmosphere]". |
RB

67
| Example Camp Bethel Creating characters who change their behavior from turn to turn, and a survey of other common uses for alternative texts. |
RB

443
| Example Chanel Version 1 Making paired italic and boldface tags like those used by HTML for web pages. |
RB

129
| Example Do Pass Go A pair of dice which can be rolled, and are described with their current total when not carried, and have individual scores when examined. |
RB

434
| Example Flathead News Network Using external files, together with a simple Unix script running in the background, to provide live news headlines inside a story file. |
RB

198
| Example Further Reasons Why All Poets Are Liars The young William Wordsworth, pushing a box about in his room, must struggle to achieve a Romantic point of view. |
RB

430
| Example Labyrinth of Ghosts Remembering the fates of all previous explorers of the labyrinth. |
RB

178
| Example M. Melmoth's Duel Three basic ways to inject random or not-so-random variations into text. |
RB

238
| Example Meet Market A case in which relations give characters multiple values of the same kind. |
RB

406
| Example Mirror, Mirror The sorcerer's mirror can, when held up high, form an impression of its surroundings which it then preserves. |
RB

438
| Example Modern Conveniences Exemplifying the kind of source we might use in writing extensions for kitchen and bathroom appliances. |
RB

379
| Example Saint Eligius Adding a first look rule that comments on locations when we visit them for the first time, inserting text after objects are listed but before any "every turn" rules might occur. |
RB

199
| Example The Second Oldest Problem Adapting the going action so that something special can happen when going from a dark room to another dark room. |
RB

8
| Example The Unbuttoned Elevator Affair A simple elevator connecting two floors which is operated simply by walking in and out, and has no buttons or fancy doors. |
RB

445
| Example Uncommon Ground Making a "by viewpoint" token, allowing us to design our own text variations such as "[show to yourself]quaint[to Lolita]thrilling[to everyone else]squalid[end show]" depending on the identity of the player at the moment. |
RB

    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.

Previous | Contents | Next