Dialog release announcements

Dialog version 0m/03 (library 0.46) introduces some compatibility-breaking changes, so please keep on reading!

Darkness

The first important change is that when the lights go out, reachable objects remain in scope. Since time immemorial, darkness in text adventures has been incapacitating. Inform 6 established (or perpetuated?) the practice of moving the player object to a separate room (called “thedark”), so they could still interact with their possessions but not with the objects around them.

The Dialog standard library (until now) accomplished the same thing by modifying the scope, i.e. the set of objects that the player is allowed to refer to. A lack of light wouldn’t actually move the player into a separate room, but objects in the current room would be considered out of scope (except when held or worn by the player). This was, in hindsight, equally surprising and problematic.

The design choice may have been sensible three or four decades ago, but times have changed: There is now a general consensus that, unless there’s a compelling reason to do otherwise, games ought to be merciful—impossible to put in an unwinnable state. But this is incompatible with a world model where things go out of scope in darkness, because e.g. putting a flashlight on a table and turning it off would make it impossible for the player to get it back. In practice, authors would have to remember to call things back into scope in darkness, in order to keep their games merciful.

So to remedy this, I’m now changing the default scope. The new rule is essentially: “Everything that the player can see or reach is in scope.”

To summarize:

  1. The new rule is more realistic and less surprising.
  2. The new rule can be implemented with cleaner code.
  3. The new rule is merciful by default.

But beware: If you have a puzzle that relies on things being unreachable in the dark, you will have to add some code to prevent sequence-breaking. You’ll need things like:

(prevent [open/search #secretcompartment])
        ~(player can see)
        You can't see well enough to do that in the dark.

The words “dark” and “darkness” are no longer automatically added as synonyms for the current room when it is dark. However, a new library-provided object called #darkness (responding to those words) is added to the scope instead. It is intangible, so the player can’t do much with it by default, but examining it invokes (narrate darkness) which usually prints “You are surrounded by darkness”.

The manual contains the complete set of rules for light and darkness and for reachability, visibility and scope.

Layered clothing

The other big new thing in this version is support for layered clothing. I want to acknowledge the work of @MultidimensionalStep; this thread has been a source of inspiration.

My approach starts with the novel idea that clothes can be worn #under other clothes. To implement this, I had to make two compatibility-breaking changes to the rules for visibility and reachability:

  • Light can no longer reach #under an opaque object.

  • Objects #under other objects are reachable except when they have an ancestor that is #wornby a non-player character.

Games that do not use the #under relation should be unaffected by these changes.

Get the full story in the new section on Clothing in the manual.

Other improvements (Library)

  • (look $) now falls back on (descr $) by default.

  • Searching animate objects is now prevented by default.

Other improvements (Compiler)

  • Improved typo detection for predicate names (e.g. warn if they only appear once in the source code).

  • Don’t include the standard library in the total linecount when deciding whether the story is big enough to need metadata.

  • Print a better error message when the output isn’t a regular file.

12 Likes