I wish I was a real programmer. There’s a project I’d like to tackle, but it would take me years and drive me bonkers.

I can handle basic programming concepts well enough to write interactive fiction, but my games use one or another sophisticated library and compiler developed by a real programmer, and when finished they run on an interpreter program that was, again, written by a real programmer. The interpreter is what communicates with the computer’s operating system. I’m doing the easy stuff; the interpreter does the hard stuff.

Tonight I was looking around the Web at the state of interpreters for various platforms. It’s, you guessed it, a maze of twisty little passages, all different. For starters, there’s Twisty, a Z-machine for the Android. Judging by the list of bugs on the SourceForge page, Twisty seems to be languishing. And in any case, it’s a Z-machine.

The Z-machine is Read more

Mouse Club

My mother had a mouse living in her garage, so she went out and bought a trap. Granted, mice can carry various diseases. Also, it got into a bag of seed for the bird-feeder and made a mess. And what if it had got into the house?

Mom is 88 years old. The real issue wasn’t disease vectors or birdseed. The real issue was that the mouse freaked her out. When you’re 88 and suffer from chronic insomnia for reasons having to do with medication, being freaked out is not a good thing.

Today I drove over and emptied out the trap. I felt very bad about the death of the mouse. It’s a cruel thing, trying to get a bite of tasty fresh peanut butter and having a huge hideous device clamp shut on your head.

I feel worse about the deaths of animals than about the deaths of human beings. Animals live in a world that we made. There are few wild spaces left where they can get away from us, and we have huge advantages. It’s an unequal contest.

Maybe the mouse was a mom. I didn’t see any teats, but I wasn’t looking closely. Maybe there are going to be baby mice starving in the rafters. I’ll try not to think about that.

Danger Signals

The parallels between Germany in the 1920s and early 1930s and the United States today are inexact, certainly, but they’re cause for concern.

After World War I, Germany was a shambles. Unemployment was high, national morale low, the government ineffective. Hitler had initially made serious mistakes (he was thrown into prison at one point), but he was a brilliant and unscrupulous political strategist, and before too long he had risen to the top.

What’s easy to forget today is that millions of Germans loved Hitler. Not all of them, certainly. But he promised to make Germany great again, and the promises struck a deep chord. Indeed, if he hadn’t been an insane megalomaniac, if he had known when to stop, he probably would have succeeded.

We also tend to forget that, until the outbreak of World War II, Hitler was widely admired in the United States, especially by wealthy industrialists. Anti-Semitism was by no means confined to the Nazi Party: A newspaper owned by Read more

Turning Readers into Players

We’d all like to see a lot more people playing and enjoying interactive fiction. The question is, how do we move in that direction?

Okay, maybe “all” is an overstatement. I’m sure there are a few people who enjoy being part of a tiny, obscure community because it helps them feel special. And to be fair, if Stephen King and Dean Koontz were writing IF, nobody would ever pay a bit of attention to my games … so there are pros and cons. Nonetheless, it seems to me that fostering a greater public awareness of IF would be a good thing.

Here’s a portion of a post on the newsgroup from David Cornelson that’s worth pondering: “I think Interactive Fiction’s number one marketing problem is that we haven’t been able to reach the ‘literate game player’. One of the reasons this is so difficult is Read more

Boys Behaving Badly

So I’m stopped at a stop light, along with several other vehicles, and in the rear-view mirror I see a guy walking forward down the line of cars behind me. (Well, actually they were mostly pickup trucks, a fact that may be significant.) He exchanged a few words with the guy in the cab of the pickup right behind me. That guy hopped out of his truck, heated words were exchanged, and fists flew. After a couple of blows they toppled over into the bushes on the median strip, still swinging.

All this in the rear-view mirror. In broad daylight, in suburbia. Not the time or place where you expect to see fighting. I have no idea what they were fighting about. Could have been pure road rage between strangers, though it couldn’t have been a fender-bender, as the vehicles were all stationary prior to the incident. Maybe the first guy thought the second guy had stolen his girlfriend and wanted to make a point. Or maybe it was a long-simmering disagreement about drug money. Who knows?

The light turned green, and I drove away. My first impulse was to get out of there, in case either of them had a gun. But other people were getting out of their cars, maybe to get a better view of what was going on in the bushes (understandable — I was curious myself) or maybe to try to separate the combatants.

The latter would have been pointless. The guys were both Read more

It’s Not About You

I’ve been contemplating the fact that I enjoy writing interactive fiction more than I enjoy playing it. Designing my own model world, and then working through the challenges of implementing it, is fun. All too often, the games I play turn out to be less fun than I’d like. Quite often I quit halfway through a game and never get back to it.

So what is it that makes playing IF less enjoyable than reading a novel?

To be fair, I sometimes put down novels without finishing them too. I read about 2/3 of Tristram Shandy, and about half of Vanity Fair. But those are exceptions. Generally, when I start a novel, I’m enjoying it enough that I’ll read the whole thing.

I’ve tried a number of games that had good story premises, solid code, and very reasonable prose. I didn’t finish them either. So the quality of the game is not the problem.

Part of the problem is that I’m not very good at solving puzzles. For instance, I stopped playing “Broken Legs” halfway through. The premise was fresh and amusing, and the writing was certainly strong enough to put the premise across. But the puzzles were Read more

A Quick I6 Tip: Local Routine Arrays

I know, I know — most IF authors could care less about Inform 6. But this is kind of cool, so I thought I’d share it with anyone who actually does still use I6. You can create local arrays of routines, like this:

routine_array [; "Fred!"; ]
   [; "Wilma!"; ]
   [; "Barney!"; ]
   [; "Betty!"; ],

You’ll note that there are no commas after the routines, until the end (when presumably you’re about to declare another property), and they have no individual names. Having set it up this way, you can access the elements of the array like this:

   y = some_object.&routine_array-->x;

This is potentially useful because it lets you encapsulate different kinds of behavior and then switch among them at run-time. You could do the same thing with a switch statement, but this way of doing it is likely to be easier to read and debug than a massive block of code in a switch. Fewer indents, if nothing else.

Since I6 doesn’t force the elements of arrays to be of a single type, you can also build property lists like this that contain routines, double-quoted strings, and object IDs. You then use:

   if (y ofclass Routine) y();
   else if (y ofclass String) print_ret (string) y;

…and so on, in order to use the elements in the array.

A Little Knowledge

This is about the perils of migrating from one programming language to another. Probably all programmers who are more experienced than I at using multiple languages (which would be most programmers, I’m sure) have run into this type of problem, but it’s a new one for me. It only took me half an hour of commenting out blocks of code to find it, and it’s a good one.

I’ve used TADS 3 extensively, and more recently than I’ve used Inform 6. So it’s all too easy to type a T3 statement out of habit rather than use the I6 equivalent. Some of these mistakes will produce warning or error messages from the compiler. But this one doesn’t:

if (self.location == sandy_beach)

That’s correct T3 (although no ‘self’ is required), but it’s disastrous I6. The correct I6 statement is:

if (self in sandy_beach)

The bad code compiles in I6 (arguably it shouldn’t, because no object has a location property to reference), but when the program attempts to evaluate that line at run-time, Read more


Writing a nonlinear interactive story is a lot of work. Making it realistic is even more work.

I’ve started working on a story (using Inform 6) whose plot splits neatly into two parts. The first part is basically puzzle-free — but it’s not devoid of relevant events. At least two, and possibly as many as four, things need to happen in the first part of the story in order to set up the second part properly. And yes, there will be some puzzles in the second part.

The simplest way to structure a narrative in which several events need to take place is to make it linear. Set up some “gatekeeper” functionality of some sort that will prevent event B from happening until after event A is safely out of the way, delay event C until event B is finished, and so on. But the gatekeeper functions can seem rather contrived and artificial. Besides, if you structure it that way the story isn’t quite interactive. It’s on rails. The rails may be somewhat wide-gauge and wobbly, but they’re still there.

In a truly nonlinear interactive story, the author may prefer to let the significant events happen in various orders — A-B-C, or C-A-B, or B-A-C, and so on. But if the story involves realistic characters (and we hope it does), they may react or behave Read more

Getting Back to Basics

If I keep harping on this, it’s because I’m happy. I want to share the excitement. Inform 6 is just ever so much nicer to use than Inform 7! I can’t even begin to tell you.

If you just wandered in from the music industry, you will have no idea what I’m talking about. This is about writing interactive fiction.

Inform 6 is, I suppose, old-school. It lacks the depth and complexity of TADS 3, and it lacks the cute veneer of Inform 7’s “natural language” syntax. There’s no integrated development environment, either. On the other hand, it is a full-featured development system for IF. It’s not a bogged-down “for dummies” system like Adrift or AGT.

Last night I found a terrific freeware text editor for Windows called Notpad++. This is an important piece of the puzzle. Notepad++ has a standard multi-tabbed interface (which Inform 7’s IDE doesn’t have, because Inform 7 won’t let you separate your source code into multiple files), plus  Read more