Programming

Infocom Source Code and Resources

Github screenshot
Last month, Jason Scott, Internet Archivist and director of the terrific Get Lamp interactive fiction documentary, posted an entire hard drive's worth of Infocom source code on GitHub. I thought I'd share a few observations and links to resources that might be helpful to others in exploring this code and the history of Infocom.

The GitHub repositories include the original ZIL source code to thirty classic interactive fiction games from the '80s: Zork, Planetfall, Hitchhiker's Guide to the Galaxy, and my personal favorites, the mystery stories Deadline, Suspect and The Witness. There are also unpublished fragments including the lost Hitchhiker's sequel Restaurant at the End of the Universe, Stu Galley's unreleased Checkpoint game, and an ill-fated tie-in to James Cameron's movie The Abyss.  

Deadline screenshotThe games are written in a defunct proprietary Lisp-like language called ZIL (Zork Implementation Language). Sadly, I'm not aware of any working compilers that can compile this code, though I understand There are efforts underway to redevelop a ZIL compiler and most of the Infocom games are now compilable. Which is cool since the Z-Machine is the basis of the underlying architecture and virtual machine code systems for games written in Inform.  Infocom published a manual for ZIL for internal use that is available online. Zarf has also posted a helpful article on ZIL. To me ZIL is kind of like assembly language (with (parentheses)), but the code is still fascinating.

The original MDL mainframe version of Zork (also known as Dungeon) was later translated into Fortran and then machine translated into C. These are higher-level languages than ZIL, but still hard slogging. Luckily, Zork was later ported to Inform6 and Inform7.

Some years ago Volker Lanz wrote and published equivalent version of Deadline in Inform6, but it requires an old version of Inform and as far as I can tell there's no compiled binary version of the game. Most likely the author was concerned that this might have been too close for comfort as copyright violation. It will be interesting to see if anyone translates any of these Infocom games into a modern equivalent in Inform 7. 

Scott had previously posted several Infocom file cabinets --digitized versions of Infocom printed materials including design documents, internal memos, sales reports, logo designs, photos, advertisements, etc which provide a fascinating glimpse into the internal operations of Infocom during it's hey day.

No one seems to have complained about the posting of the Infocom source code, but if it's of interest, I'd get it quick.

For those interested in the history of Infocom and the impact of it's games, I strongly recommend the well-written student research project The History of Infocom (PDF) as well as Jimmy Maher's excellent articles at The Digital Antiquarian.

And for further historical context, here's a link to the Infocom Documentary Scott released along with Get Lamp:


Updating to Inform7 Build 6L02

Screen Shot 2014-05-08 at 12.09.31 AM

I'm super excited about the new Inform7 Build 6L02 that came out earlier this week.  But as with prior releases, you may find a few "gotchas" as well as new things to think about.  In particular, this is a major (massive?) release -- the first in nearly 3 years.  And there are many improvements that look awesome.  Nonetheless, I thought I'd make a quick note of a few things I've seen in the changelog for people to keep in mind as they update their own code.

  • This release deprecates several old features and capabilities.  Most of these look fairly obscure and are not likely to have been intentionally used by many people.  However, I still found about a dozen cases of deprecated syntax, in the form of code written as:
    Change the right hand status line to .... 
    instead of:
    Now the right hand status line is ....     
  • If you want to check for this and other statements that may no longer work from within the "old" 6G60 Build, you can add the code:
    Use no deprecated features.
  • Of course, the reason I was using the deprecated form was because I cut and paste some example code from one of several extension I used.  Many popular extensions have already been updated and in other cases, it's fairly easy to update them yourself.  However, for some reason I couldn't get Aaron Reed's Player Experience Upgrade to compile properly.  Aaron has already updated most if not all of the individual extensions like Smarter Parser, Extended Grammer, Poor Man's mis-type etc.  Since a lot of core functions in Inform7 have been updated rendering the Player Experience Upgrade somewhat obsolete, so it's easiest to just to include the individual extensions you want to use.  That worked fine for me.

    Note: There's a longer discussion about other code changes that may be necessary to get your code to compile on the Intfiction forum.  And there's also a list of third party extension compatability list.  
     
  • I also ran into what appears to be a known issue regarding having a blank table that gets filled in later, such as is used with Emily Short's Menus extension, which I happen to use.  It seems there's been a change that has been described in the Intfiction forum.  The example program "Tabulation" is also unfortunately out of date, so it took me a bit of trial and error experimentation to get this to work properly.  The Menus extension also has a "consider" rule which must now be changed to "follow". I have no idea what it does, but it's a trivial change. If anyone needs the updated version of the "Tabulation" program, let me know.      

  • Scoring is now off by default.  So if you're doing an old-school game with scoring (like I am) then you need to add:

    Use scoring.

  • Indexed Text is gone.  Or at least, you don't have to declare some things as text and others as Indexed Text. Indexed Text still works, but it's not needed.  I haven't had a chance to try this out yet and I have a ton of code that works around all kinds of crazy things with Indexed Text and Tables.  Hopefully it will all work the same as before and I can start eliminating some of the hoops I was jumping through previously.

  • You can now declare variables with an initial value in one line, instead of two. So where you used to write:
    DialSpins is a number that varies.DialSpins is 1.

          You can now write:

                    DialSpins is initially 1.

  • You can now declare constants using the form:
    The Drink Limit is always 3.
  • There is now support for floating point arithmetic, in the form of what are called "real numbers" (as opposed to plain "numbers" which are integers).  Honestly, the last programming language I used that did not have floating point was Wozniak's Integer Basic on the Apple ][.  And that was pretty much eclipsed by the built-in Applesoft Basic when the Apple ][+ shipped in 1979.  So even though I don't actually use any floating point math in my game, this always struck me as an odd ommission.  Now Inform7 can sit proudly with the big boys at the great programming language bar.  You can add sine, cosine, arctangent, square root, and reciprocal functions of Pi and e to your heart's content.  No doubt someone will write a Bitcoin simulator extension pretty soon.
      
  • The Mac IDE has had a major re-write and has undergone a major rewrite improving the architecture, fixing many bugs, modernizing the UI and expanding the features. It also has a cool "London Underground" welcome screen.  The documentation has been updated including a new Zarf-supplied index as well as new examples.  The manuals is also now available for download in ePub format and the Recipe book is now much more "front and center" in the IDE.  

  • The Mac IDE appears to be much faster and more stable in dealing with large blocks of code when it needs to redo the syntax highlighting.  This used to be the bain of my existence whenever I was commenting out or moving code.  I am eager not to have to worry about the order in which I put comment braces.  (Really, there's no need to re-highlight the code that's off screen is there?)  Also the command history is supposed to work better on the Mac.  I never found it to be reliable in the past. 
     
  • The Index in the IDE provides a much more detailed view of the innards of your game including a library card view of the Bibliographic information, separate views of tables and figures and a much more detailed introspection of the Actions, Kinds, Phrasebook, Rules and Scenes in your game.  I think it will take several days or even weeks to appreciate the depth of information provided here.  But this looks very powerful indeed.
     
    Screen Shot 2014-05-08 at 12.10.14 AM

  • There's a also new Public Library of extensions accessible directly from within the Mac IDE.  So you don't have to download and manage the extensions by hand.  It appears that the IDE will automagically let you update extensions with the click of a button.  That sounds like a great feature, though I'm assuming that "undo" will let you back out any updates that cause problems.  The IDE can also automatically download all 67 up-to-date Inform7 extensions. (Twenty of the extension are built-in, such as Emily Short's Basic Help Menu and Basic Screen Effects, and Eric Eve's Epistemology and so on.)  
  • Extensions can now be made "adaptive" with a little more work on the part of the extension author.  What this means is there's a more generalized underlying mechanism for properly adding the correct viewpoint of the player, the grammatical tense to verbs, the plurality of nouns and so on.  (For those familiar with Emily Short's work, this is a bit like the Plurality extension on steroids.)  So if you're writing a game with a 1st person viewpoint set in the past or whatever, then the text emitted by extensions will no longer clash with the prose you've written.  If you're writing extensions, this is pretty cool.  And even for old-school second person present-tense games, your code can be much smarter about dealing with objects.  Emily Short has a very helpful post that describes in more detail things extension writers will need to keep in mind when updating their work.

  • Standard messages to the user are now neutral and much easier to customize rather than being old-school adventure game oriented.
     
  • Around 400 bugs have been fixed including some items that were really feature suggestions.  

This just scratches the surface of a few of the new capabilities in Inform7 6L02.  Nonetheless, a few questions remain:

  • When will the remaining extensions be updated?  I'm eager to see this happen, but obviously, this may take some time for extension authors.
  • How much work will be required to clean up all my ugly Indexed Text code?  
  • Will Aaron Reed update his fantastic book to show off some of the new features?  Heck, I've bought two copies already and I'd buy two more.  Even a softcopy update would be great.

For more info, head over the Inform7 site.  And if you have tips in using some of the new Inform7 features, feel free to add a comment below.  (And if I got some things wrong here, please let me know that also!)


UCSC IFOG - Interactive Storytelling

IFOG panel

UC Santa Cruz recently held their second Inventing the Future of Games (IFOG) conference at the Computer History Museum in Mountain View.  While the conference definitely has a lot of thoughtful discussion, it's not overly academic, in that it draws speakers and participants from the commercial gaming industry.  This is of course, much smaller than the Game Developer Conference (GDC), but still drew top talent.  The nice part about a smaller conference like this is you can actually ask questions of the speakers and get to meet them on the breaks.

Michael Mateas from UCSC Center for Games & Playable Media gave a great opening presentation, getting to the heart of the tensions between game playing and storytelling and encouraging developers to get over the debate and just focus on good games.  Mateas called out several interesting game development platforms and tools as well as some interesting creative games.  He also emphasized that there isn't one unified theory of gaming -- instead there are lots of interesting & divergent approaches that can be taken. 

Warren Spector, one of the longest tenured game designers, gave a wonderful keynote that compared gaming to other media including movies, television, comics and urged designers not to borrow too heavily from other media.  While there are plenty of parallels, gaming is truly unique and it continues to evolve as its own distinct form.  While I'm inclined to agree that the world might not need another First-Person Shooter Wolfenstein game, I still appreciate the thrill of a good Sci-Fi Nazi shooting game.  Spector was critical of our current level of artificial intelligence in games and suggested that designers go beyond traditional combat AI to focus on better interaction.   

IFOG Aaron ReedThe conference also had a demo area that featured interesting new tools and interactive fiction projects, including Aaron Reed and his latest storytelling project, 18 Cadence.  I would have liked to see short "lightning" presentations on some of these projects, or even updates or challenges from a broader range of indie or student game designers. But it was still nice to have the demo area.

Several panel sessions were held that enabled designers to get up and talk for 10-15 minutes on loosely interrelated topics.  I thought all of these panels were good, but the format seemed a bit odd to me -- they weren't quite full-blown presentations but there also wasn't much interaction between the panelists.  Perhaps shorter up front presentations would have enabled more discussion between the panelists and the audience. But I can appreciate the fact that the organizers were able to pack in quite a lot high quality content using this format.  My head was practically spinning by the end of the day.

I've posted some additional photos on PicasaWeb below from several of the presentations and panels.  

One of the highlights of the conference was an afternoon panel session called "Tools & Authorship for Next Generation Narratives."  This featured three distinct presentations from Asa Kalama of Disney, independent game designer Stéphane Bura and Emily Short from Linden Labs.  Emily Short's contributions in the area of Interactive Fiction are almost legendary.  Not only did she help on the development and documentation of Inform7 but she is also renowned for the groundbreaking games she has created. She spoke about her work on Versu, a new interactive storytelling platform that she has developed at Linden Labs.  I've posted a video (slightly edited for YouTube) which provides more detail.

Overall IFOG was a fantastic conference and I applaud UCSC and all of the speakers for putting on this event. I hope they will continue IFOG on an annual basis.  If you were able to attend the conference, please feel free to add comments about what you liked best or would like to see at future conferences.


IF Theory Reader

  IF Theory

Those who have been in the IF community for a long time probably know all about the history of the IF Theory Book.  It was originally started ten years ago by Emily Short and Dennis Jerz, got sidetracked for a number of reasons, and then was finally updated and published by Kevin Jackson-Meade and J Robinson Wheeler last year.  But what may have gotten overlooked amidst all of the delays is how darned good the book is.

I can appreciate the dilemma of the original crew behind the IF Theory book. My own IF project has lost steam in the past year owing to an overly busy work life.  But having taken a break from Inform7 coding for longer than I would like, I've been diving back into the IF Theory Reader, as it's now known.  While I had read several of the articles in the book elsewhere on the web, having them all compiled in one place is a tremendous resource.

The book weighs in at over 400 pages and includes articles by some of the best IF authors in the post-commercial period including Nick Montfort, Andrew Plotkin, Michael Gentry, Gareth Rees, Emily Short, Jon Ingold, Duncan Stevens, J Robinson Wheeler, Robb Sherwin and Stephen Granade among others.

And despite the title which makes the book sound rather academic, many of the articles provide practical techniques for improving the quality of one's writing, whether it's dialog, descriptions, puzzles, pacing, geography or even how to build a good hint system.  If you are looking for theory, Graham Nelson's pieces are phenomenal.  (Not that I understood much of them, but they are still entertaining.) You can view the full table of contents at IFWiki

The IF Theory Reader stands up there with Aaron Reed's Creating Interactive Fiction with Inform 7Inform Designer's Manual and Twisty Little Passages.  These are all essential readings for any would be IF author. 

The IF Theory Reader is available from Lulu for $13 in paperback and as a free PDF.  I wasn't able to find a free ePub or Mobi version suitable for eReaders, but you can always convert the PDF to other formats using Calibre.  


Using Scrivener for IF

Scrivener Z-Machine

Although I managed to get my game The Z-Machine Matter to a intro-level prototype stage a while back, I realized I needed to take a different approach for the next stage of implementation.  I realized I need to take a step back from the mechanics and programming and focus more on the characters and story.  Maybe better IF writers can mix and match plot and character development while coding in Inform7, but I found I needed to get out of programming mode in order to focus on the story.

The Z-Machine Matter is an old-school murder mystery --an homage to Infocom's "Witness" and "Deadline" among others.  The classic "cozy" murder mystery has more structure to it than the average novel and for that reason, I believe it lends itself quite nicely to IF.  To make the story work, you've got to haveclear motives for each of the characters, the requisite means & opportunity, evidence, alibis, clues and, of course, a few red herrings to keep the reader guessing.  Scrivener makes it easy to define templates that encourage a consistency and thoroughness when you define characters, locations, puzzles and so on.  The templates are flexible though, so you're not locked into them. 

Although there's nothing I've written using Scrivener that couldn't be written with Microsoft Word or even a generic text editor, I have found that Scrivener's structured approach and tools lend itself to what is needed in defining the key characters, puzzles that are so important in IF.  While it's relatively easy to get started with Scrivener, there's a richness (and complexity) to it with plenty of menus, submenus, obscure icons and advanced features.  The good news is, you can safely ignore most of these bells & whistles and just focus on the things that matter in your story.

Scrivener is available for Mac and Windows for $45 with an iPad version in development.  However, I found the tutorial to be overly quirky and completely inadequate.  So I highly recommend the eBook Writing a Novel with Scrivener by David Hewson which can give you an easier introduction to writing a complex work of fiction with Scrivener for just another $6.  Hewson also makes available a free Scrivener template for novel writing which is a good starting point for creating your own template for Interactive Fiction.

If you've used Scrivener or other tools for writing IF, please let me know your thoughts by adding a comment below.


Parser Say "Happy New Year!"

Stout_cheers

It was a quiet New Year's eve, just before dinner and I managed to get a few hours of programming time on my long neglected IF murder mystery game. As I was working away, I noticed a couple of email notifications on Inform7 suggestions I had voted on.  Just as I was busily working away on my game, there were others, perhaps many others, around the world working on their own IF projects.  

No doubt there are people working on new games, writing code, creating extensions, writing hints and walkthroughs and feelies.  Others, like the Inform7 team, appear to be toiling away on bug fixes and new features for an upcoming release.  And hopefully there are newcomers, perhaps intrigued by the iOS Lost Treasures of Infocom or otherwise have stumbled upon IFComp and are taking a look at Inform7, TADS, Quest or other IF tools with the thoughts of creating their own games.  To all of you, I say "Happy New Year!"

I don't have many personal connections to the IF community, but if I did, I'd buy everyone a drink as a thank you for all that the IF community does.  There are so many people who have put in countless hours in projects that we all benefit from whether it's the Inform7 compiler, the IDEs, library extensions, documentation, historical essays, interpreters, Kindle & iOS ports, classic retro games, fantastic modern games, lively forums, competitions... You could not hope for a better, warmer and more inviting community. (Ok, with the possible exception of mean reviews, but even that seems to be getting better.)

Thank you!  I wish everyone a wonderful year and the best of success with your IF projects in 2013.

If there's something you're grateful for in 2012, please feel free to add a comment.


Adding a Clues command

Invisiclues1

Most of my effort on The Z-Machine Matter has been spent on cleaning up the writing and incorporating feedback from IntroComp.  But last weekend, I had an idea and decided to implement a new feature.  Since part of the game involves finding clues, I thought it might be worthwhile to have a command CLUES that tells the player how many items there are still to find in the current location.  For newbie players, this would enable them to get some idea on where to focus their efforts without resorting to the full built-in HELP system.  I also implemented a change to the status line so that the current location includes a * to indicate that there are items to find.  

While not a particularly complicated piece of code, as with most of my work with Inform7, it took several failed attempts to figure out a way to implement this.  I'm sure it's not the prettiest code, but it works.

For each room, I create a list called discoveries that includes all of the interesting objects that are hidden in that room.  It might be something on a book case, in a locked drawer etc.  

[ Each room has its own potential discoveries. ] 

A room has a list of things called discoveries. 
[ Set up interesting clues for each room ]

When play begins:
    now the left hand status line is "Hotel Room *"; 
    now discoveries of Hotel Room is {gun, bible, postcard};
    now discoveries of Hotel Bathroom is {matchbook}.

Then whenever an object is examined or taken, I check if it's in the discoveries list and remove it.  

Carry out examining something (called the item):
    now the item is found;
    if item is listed in discoveries of location:
        remove item from discoveries of location.

[ Taking something also makes it found ]
Carry out taking something (called the item):
    now the item is found;
    if item is listed in discoveries of location:
        remove item from discoveries of location.

 

And then every turn, I check if there's a need to update the * on the status line.  

[ Check the status line after every turn. Show a * if there are undiscovered items.  Avoid flicker if nothing has changed. ]
Every turn:
    if discoveries of location is empty:
        if last status location is not "[the player's surroundings] ":
            now the left hand status line is "[the player's surroundings] ";
        else:
            if last status location is not "[the player's surroundings] *":
                 now the left hand status line is "[the player's surroundings] *". 

And finally, here's the code for the Clues command.

Understand "clues" or "clue" as asking for clues.
Asking for clues is an action out of world.

Carry out asking for clues:
let L be discoveries of location;
let N be the number of entries in L;
if L is empty:
    say "You've found all the items in the [location].";
else:
    if N is 1:
        say "There is 1 item left to find in the [location].";
    else:
        say "There are [N] items left to find in the [location].";

I've also posted a short Inform7 project you can download if you want to try it out yourself. It's a plain text file, so it might be easiest to cut & paste this into the Inform7 IDE.


Thank you IntroComp!

Now that IntroComp is over, I want to extend my thanks to Jacqueline the organizer as well as to all those who submitted games or voted.  Congratulations to the winners: Choice of Zombies, Speculative Fiction and Choice of The Petal Throne.

Even with today's great tools like Inform7, Tads, Hugo, Alan, ChoiceScript, it still takes a lot of effort (and gumption!) to create Interactive Fiction.  Hopefully this year's crop of entrants will have received feedback & motivation to help them finish their games.  

Creating IF is quite different from as writing a novel or conventional game programming. You've got to get the right blend of prose and interaction to make it work.  My respect for those who have successfully completed IF projects is immense.

While some of the feedback on my game The Z-Machine Matter has been encouraging, it's also been a humbling experience.  The first published reviews for The Z-Machine Matter were pretty harsh and I felt like I let people down.  But some of the more detailed later reviews were very insightful and pointed out areas of the game that could be improved, whether it was the writing, pacing or some of the IF references that became a distraction.

There are definitely some coding issues I chose to ignore in my IntroComp entry and these need to be addressed in order for the game to be more robust.  There's also a need to improve the writing to convey more of the atmosphere of the story.  Likely I will need to do some pruning in the scope of the game and the various objects to make things more manageable.  

But overall it has been a great experience and I appreciate all the feedback.  For anyone who has played the game I encourage you to send me the SCRIPT transcript file as well as any additional comments or suggestions.  I've found this the best way for me to see the game through the player's eyes.

Now I've got to figure out how I can spend weekends for the next few months boning up on Inform7 and writing in order to improve the game.  Or maybe I should just spend it finishing LA Noire...


Recent Alpha Updates

Small Cover

Based on feedback from testers, I've added several new capabilities to The Z-Machine Matter. This includes the previously described Keyword interface to accomodate both objects and locations as well as new commands TOPICS, SUSPECTS, CONFRONT and hopefully elimination of some parser ambiguities.  The game is chugging along now at over 58,000 words, 174 objects and 44 rooms.  With still plenty of work to be done.

Several testers have given me feedback that it's difficult to know what topics are valid for ASK and TELL commands with the non-player characters, so I've implemented a very basic TOPICS command that suggests some topics.  Right now, the TOPICS command is largely (but not completely) static, but over time I'll dynamically suggest topics based on game play to help move things forward.    

I've recently implemented a new command called SUSPECTS that tells you which of the NPCs are suspects.  Both the TOPICS and SUSPECTS commands provide a mechanism to help the player along but fall short of really giving away any significant hints in the game play.  For those who get really stuck, there's always the built-in HELP system.  I figured these new commands are a good way to provide a ramp for players who want a little advice but don't want full-blown hints.

I've also added the ability to accuse a character of lying using commands in the form:

> CONFRONT Alan
> ACCUSE Beverley of lying
> TELL Charlie he's lying

The logic on how the characters respond depends on what evidence you've uncovered in the game.  Each of the suspects has something they're hiding, and so if you find out what that is, you'll get different answers to some questions.  

I've also expended some efforts to eliminate many of the annoying ambiguities that arise in Inform.  The worst case is when ambiguity arises when you ask about an object and the parser asks if you mean some new undiscovered object.  These messages tend to act as spoilers telling the player about objects they haven't even seen yet.  For example, I have two different newspapers, the San Moreno Informer and the LA Times in different areas of the game.  

Most of the time, it's not a problem, but if you ask someone about newspaper, Inform won't know which one you mean, even if you've not yet encountered one of those objects.  I've eliminated the ambiguity, by implementing several "Does the player mean" rules such as:

[ Disambiguate other newspapers ]

Does the player mean quizzing about the Informer newspaper when last thing examined is the Informer newspaper: it is very likely. 
Does the player mean quizzing about the Informer newspaper when location is not in the Blakely Estate: it is very likely. 
Does the player mean quizzing about the Informer newspaper when it is visible and The Times Newspaper is not visible: it is likely. 

That said, I'm not sure outguessing the parser is always a good idea.  It seems to lead to some occasional odd behavior.  Maybe the best solution may be to just eliminate ambiguously named objects from the get go, but that sometimes leads to awkwardly named objects.  And even though I have two differently named newspapers in different areas of the game, it's entirely reasonable that a player would simply refer to either one as newspaper and expect the game to figure out which one is appropriate.  

Alpha testers, feel free to contact me to get the latest version.  And if someone wants to do a code review to help me that would be awesome!  

Update: Also, if you've contacted me about alpha testing and not gotten a response, please check your spam folder or send me another email.  Thanks!


Keyword Interface, Topics and more

Z-machine-mac-zoom

One of the great things about working in Inform7 is the ability to incorporate extensions and code fragments from other authors.  I can't say I always understand exactly how to use these extensions, but for the most part, they work great.  

Above is a screenshot of The Z-Machine Matter running in the Mac Zoom interpreter showing off the use of Aaron Reed's Keyword Interface extension.   The idea is to highlight important objects or locations making it easier for newcomers to know what to interact with. You can also see Eric Eve's Exit Lister extension at the top left of the status area.  

Using extensions is easy.  First include the code in your source:

Section - Extensions 
Include Exit Lister by Eric Eve.        
Include Keyword Interface by Aaron Reed.
Include Menus by Emily Short.     

[ Extensions to help with parsing.  They also make the game larger ]
Include Extended Grammar by Aaron Reed. 
Include Small Kindnesses by Aaron Reed.
Include Smarter Parser by Aaron Reed.
Include Poor Man's Mistype by Aaron Reed.    

Then in the case of Keyword Interface, you just put text format directives [o] [x] to highlight certain objects or [d] [x] for directions or locations.

Section - The Front Hall
[ Beverley meets Dollar in the Front Hall ]

The Front Hall is north of the Front Steps.  "The front hall opens onto a large adobe walled room with a tall ceiling.  To the [north] you can see a [d]hallway[x] running east and beyond that a kitchen area.  There is a spiral staircase that leads up to the second floor.  To the [west] is the [d]hall closet[x].[first time][paragraph break]A beautiful blonde woman in her early twenties greets you.  She has a glass in her hand.  'Hello there...  I'm Beverley Hugo.  You must be Mr Dollar, the insurance investigator the police said would be coming.'[only]"

Understand "hall closet", "closet" as west when location is Front Hall. Understand "hallway" as north when location is Front Hall.  

Understand "upstairs", "stairs", "second floor", "second floor landing" as up when location is front hall.  

Similarly, I've used other extensions like Assumed Conversers by Michael Martin and Menus by Emily Short, and a half dozen others to give The Z-Machine Matter a lot more fit & finish than I could otherwise code on my own.  

One of my Alpha testers suggested implementing a TOPICS command to make it more obvious how to interact with the other characters in the game.  There are full-blown conversation extensions out there, but to keep it simple, I just borrowed a couple of lines of code inspired by Implied Conversers and was able to get something going in under an hour.  How cool is that?

Alpha testers, if you can fire up the latest version that's much appreciated.  It's available at the usual Box.net location or let me know via email if you'd like me to send it to you.