27

Pushed through another five or six testing transcripts today. I am always freshly stunned by how much time this takes, even when most of the bugs/missing features are not really that dire.

However, it was worth doing. Sam Kabo Ashwell found another Horrible Bug — he has a gift for this, I feel — by means of which it was possible to put the hart’s conversation into an unrecoverable loop and stall the whole scene. I think this is now no longer possible in version 27. Sobering that these things are still being found, though. Ugh.

Also, added quite a lot of new dialogue; we approach 400 quips, and will probably top that by the time all is said and done. Happy in particular needed a bit more fleshing out, especially on peripheral topics.

Thanks again to everyone who has contributed testing transcripts so far; I imagine that human-based testing will continue through the weekend.

Partway through the evening I had had enough of staring at Inform and decided I would prefer to stare at Adobe Illustrator instead; so I have given the website a makeover. This mostly involved designing a new template file and then spending a while fiddling around with CSS in the amusing fantasy that I know what I’m doing with CSS. My CSS projects always begin with me looking at csszengarden and having Coleridge-on-dope-style dreams about being the Kubla Khan of web design. They always end with me having composed another identikit webpage with links down one side and a banner along the top.

Version 25

Uploaded release 25 of Alabaster, after working through some more beta transcripts. The most notable changes were

  • systematically added handling of “maybe” and “I don’t know” as responses to most yes/no questions; sometimes “maybe” moves the conversation forward, sometimes it doesn’t, but it should now always be recognized as a reply.
  • went through and made sure this time that quips starting with “if” also recognize “whether”. (I know, I thought I had already done that, but apparently not. Probably I need to set up some systematic way of testing synonyms in quip names.)
  • fixed a stupid error that prevented some quips from being recognized under some circumstances, and particularly messed up elegant responses to the riddle. (They were recognized if phrased with ‘ask about…’ but not if the answers were phrased as ‘guess blood’ or ‘suggest blood’, which are more elegant possibilities really.)

Testers report that even the fairly advanced endings are not hard to reach. This doesn’t bother me especially, as I had never envisioned the game as being all that hard.

Meanwhile, OmniGraffle is completely choking on the .dot file now — I think it has just gotten too long — so I haven’t generated an up-to-date conversation graph. This is vexing. Good thing that the project is nearly done.

Alabaster Continued

Added a new “autopilot” testing command that plays through the game on its own by selecting randomly from available quips (though on average preferring ones that belong to the current conversation thread). Ran the game through it a number of times.

As tests go, this is merely mediocre — it doesn’t really simulate the behavior of a real player, but it also isn’t as thoroughly systematic as automated testing sometimes can be. Still, it did expose several bugs and infelicities, so I guess it was worth doing.

Things I still need to do before official release:

  • figure out why the game sometimes hangs under Filfre (what do we know about Filfre, anyway? Is it fairly reliable? I have reports of it failing consistently in one place, but I can’t reproduce this under Zoom.)
  • do some profiling and streamline the performance
  • get a few more human beta-testers through the thing (will look some up if no more volunteers appear on their own)
  • (most vexing): figure out why sometimes, apparently randomly, I get a runtime “too many activities” error after printing the name of a fact

Grrr.

Visualizing conversation

When I was first working on Inform 7, one of the things I was a bit skeptical about was the map index. Yeah, it was cute, but did I need it? As a real IF designer, wasn’t I perfectly capable of keeping my own notes and maps? And wouldn’t it perhaps exert an undue influence on designers to use a square-grid map, just because that’s what indexes best?

The latter point may be a fair complaint (though at the same time I am kind of in favor of comprehensible map layouts). But I was totally wrong about the first point. When I wrote the early speed-IF version of Bronze, I was able to put it together quickly only because I could add rooms, refer to the map, see where the holes still were, add, recompile…

Primitive as it is, the graphing ability of Alabaster is proving reasonably useful too. The graph isn’t especially pretty — I don’t know whether I’d get something better out of Graphviz than I can get out of OmniGraffle and a .dot file — but it conveys a lot of useful information. In particular, it’s possible to glance at the graph and find bugs that might take hours of testing to detect in the game. Colored nodes show where conversation dead-ends. Lines that go to the wrong places show where some connection has been screwed up in the system.

The main problem is that this image is (a) insufficiently eye-candy-ish and (b) too big. With Alabaster we’re approaching 300 conversation quips, and I suspect we’ll exceed that number before it’s done. Which isn’t really surprising — that’s about on a scale with Galatea, and though Alabaster has fewer avenues of conversation, each individual one can be pursued in more depth, so the balance comes out similar. I think this will turn out to be a fairly normal, not-at-all-extraordinary size for a conversation game. So clearly the fact that the graph is getting ugly is a problem.

I’ve been thinking on and off about what I want to do about that. I’m eager enough to finish primary coding on the game that I haven’t gone off to investigate new graphing options — the current graph provides enough diagnostics to do what I need it for — but I’ve been thinking on and off about what I think it a conversation-visualizer should look like and do in an ideal world. The fact that Processing 1.0 was just released has also been affecting my thinking. Wouldn’t it be neat to be able to view a conversation tree as a dynamic structure, something you could zoom into or away from; or to be able to pull one piece of the conversation tree away by itself to view it in more detail; or to switch visualization modes and instead see a chart of which facts and subjects were most important, or which quips functioned as gate-keepers by providing access to large portions of the rest of the conversation tree? In fact, mightn’t such a tool actually be useful for optimization problems too (since it would make it easier to discover where the conversation tree could profitably be broken into chunks for the purpose of limiting the search range)?

But I’m focusing on finishing the primary coding, oh yes.

LICK TREE. PURCHASE ANTLERS.

This is mostly to put in a plug for Juhana Leinonen’s new extension “Object Response Tests” (linked from here). The extension implements an ANALYZE verb that systematically runs through standard rules actions (and new actions, if you choose) on any object in your game, exposing infelicitous responses, incorrect plurals and articles, and all those other little flaws that can escape even a good human beta-tester.

I spent a lot of yesterday evening thus: extract a complete list of in-world objects from the world index of Alabaster; write a test script to run through and ANALYZE each of them in turn; revise responses I didn’t like; run the test script again…

Unsurprisingly, this is a lot more thorough than even (what tried to be) a fairly rigorous testing by hand. It’s also a lot more fun. (Though I find it has the perhaps-unhealthy effect of making me lavish a lot more time on commands no one is ever going to try, like DRINK UNDERGROWTH or STAND ON CHIN or TIE FACE TO SKY. There’s something about seeing the same library messages over and over that makes me want to spice them up with randomized elements.)

More seriously: the huntsman seems to be getting a bit more character as I go along. I picture him as a loner who has never been quite comfortable with the other villagers or with the court, who doesn’t feel at home anywhere, and who has not much left to lose. (This justifies a wider variety of endings for him, of course — he’s more likely to be willing to run away from his home kingdom if he hasn’t got a wife and kids he’s leaving behind, say.)