Search Results for: interactive fiction

Introducing Lectrote, an interpreter

Today I posted the beta of Lectrote, a new IF interpreter application for Mac, Windows, and Linux. This is both more and less exciting than it sounds!

If you're familiar with the IF scene, you know that there are several applications which can be used to play these games. Zoom (Mac), WinGlulxe (Windows), and Gargoyle (multiplatform) are the most commonly used. And then there's Quixe, which is a Javascript-based interpreter used on iplayif.com and other web sites.

When I was looking to release Hadean Lands as an app, I found that none of these were really what I wanted. Zoom is unmaintained and buggy; WinGlulxe is weird about scrolling; Gargoyle has problems on hi-res displays. (I'm summarizing, it was a long messy story.)

Quixe had the UI that I wanted -- no surprise; it's the one I wrote the UI for! -- but it wasn't really meant to be used as an app. It exists as a web page, or a component of a web page. Also, it's slow. So I put it aside and went with Gargoyle.

However, the long messy story didn't end there! A few weeks ago I was gazing over the endless cycle of dev-tools and noticed Electron. Electron lets you wrap up a Node.js tool as a standalone app for Mac, Win, and Linux. And Node.js is, well, I don't really know what it is but it's a web thing. Seems ideal, right? Stuff Quixe's web page into Electron and we're done.

It wasn't quite that easy. Node.js has full filesystem access (unlike a web page), so I had to extend Quixe's load/save system to deal with ordinary files. (So you can exchange save files between Lectrote and other interpreters.) But that was still pretty easy. I stuck the IF postcard in a menu, too.

And now you can try it.

So what does this have to do with getting Hadean Lands onto Steam? Well, it's a very simple tweak to drop a Glulx game file into Lectrote. Then you've got a Mac/Win/Linux app that plays a single game. And it looks nice and the text layout is pretty and you can adjust the font size without editing a text file.

I haven't done that yet. I'll have to adjust the menus -- knock out all the support for opening multiple games.

More important, I'll have to add autosave. Right now, if you're playing a game and you close the window, your game is gone. Hope you typed SAVE! That's okay for an interpreter (used by IF habitués), but it's not ideal. It's really not acceptable for a Steam standalone game release.

Autosave for Glulx games is a bit of a nuisance, but I got it working on iOS. I will get it to work with Quixe. It will just take a few more weeks.

...oh, and then there's the speed. I mentioned that Quixe is slow, right? It's faster than it was but it might not be fast enough for Hadean Lands. If you own HL for Mac/Win/Linux, try it! In particular, try loading a mid-game save file and typing a command which requires many stages, like GO TO BAROSY.

(If you don't own HL, may I remind you that it's on sale for the next two days? I probably don't have to. But I do it anyway.)

Anyway, I may try plugging a different Glulx VM into Lectrote to speed it up. I can probably run RemGlk/Glulxe as a subprocess of the Node.js server... We'll see.

For now, Lectrote is a multi-platform interpreter app which has the UI I want, and that's a good start.

Posted in Zarfplan | Tagged , , , , , , | 6 Comments

Hadean Lands sale at IndieGameStand

I am happy to report that Hadean Lands is this week's deal on IndieGameStand. For the next four days, you can buy my alchemical IF puzzle hit for -- for -- whatever price you want. Go nuts.

Beat the average price to get some bonuses:

  • High resolution map: This is the artwork that I used for the Hadean Lands backer reward poster. It is larger than the version included with the general HL release, and includes a few additional details.
  • Hadean Lands source code samples: A few representative samples from the Inform 7 source code of the game.
  • Critical Hit: An unfinished prototype of a game I started in 2009. This has never been released on the Internet, although I included it on the HL backer reward CD.

IndieGameStand is offering Hadean Lands for Mac, Windows, and Linux. These are exactly the same versions that are available on the Humble Store and Itch.IO.

Play IF on iPhone or iPad? I've put the iOS version of HL on sale too! For the same period -- until Thursday. Or buy the bundle with Shade and Heliopause.

Note: the iOS version is not pay-what-you-want; it's a flat $2. And it does not include the IGS bonuses listed above. The two sales are separate; sorry, I have no way to link them together. But you can buy both if you want, right?

Enjoy.

Posted in Zarfplan | Tagged , , , , | 4 Comments

IGF nominees: my comments

The Indie Games Festival nominees are now posted. The IGF is a showcase of indie games which exists as part of GDC (March, San Francisco, expensive). This year I was invited to be on the jury for Excellence in Narrative (along with Emily Short and some other folks you might know).

As I understand the awards process, it's a three-phase thing. A large pool of game experts and designers nominate a large list of games, and then spend a few months playing and commenting on them. (The long list was over 750 games this year.) Smaller groups of experts then look at the top-voted entries on the long list and select six finalists. The final winners will be announced from GDC on March 16th.

I was involved in phase 2, which meant playing a bunch of games (but like a dozen, not 750!) and then talking them over with the other folks on the narrative jury. I have permission to post my game notes (although not, of course, anything the other jurors said!) and that's this post.

The finalists in the Narrative category were (in alphabetical order): The Beginner's Guide; Black Closet; Her Story; The Magic Circle; That Dragon, Cancer; Undertale. Congratulations to all of them! And to the finalists in the other categories, too.

Important details:

  • These are my comments, not my votes! I'm not posting my votes. If you've read any of my Design Ruminations posts, you know that I love to talk about what went wrong and right in a game, which is not the same as how good it was or how much I enjoyed it.
  • I was also invited to vote for the Seumas McNally Grand Prize, but I declined. I don't feel I've played enough games this year to have a sense of what's best overall. I had enough trouble squeezing in the time to play the Narrative nominees!
  • I had access to free review copies of all of these games. (Pre-release copies, in the case of unreleased titles.) I had already purchased (and played) Her Story, Sun Dogs, and The Beginner's Guide on my own account.
  • I wrote these comments in the order that I played the games. Except for Her Story, Sun Dogs, and The Beginner's Guide, which I wrote up pretty much when they occurred to me.
  • Nearly all of the top-voted narrative games were available for Mac! Good news for us Mac folks. (I asked about this in advance; I wouldn't have accepted the invitation if I couldn't play the games.)
  • See also Emily Short's post of comments about the voting process.

My voting criteria were... well, Emily's post has a good list of points: mechanics that support the story, observant writing, and substance. I care about all of those things, but it's an extremely subjective process. I certainly didn't give a finely-graded point-based score to each game. I also didn't simply vote for my favorite games. Obviously my preferences color everything! But the audience here is people who follow indie gaming, not just me, so I tried to keep that in mind.

In the end, I tried to pick the games which will make gamers say "Holy crap, games are even more narratively awesome than I thought."

Games that I discuss in this post:

  • The Writer Will Do Something
  • Sun Dogs
  • Dr. Langeskov, The Tiger and The Terribly Cursed Emerald
  • The Beginner's Guide
  • That Dragon, Cancer
  • Her Story
  • The Magic Circle
  • Emily Is Away
  • Cibele
  • Read Only Memories
  • Oxenfree
  • Sunset
  • Undertale

Onward to the comments!


The Writer Will Do Something

Clever, sharp portrayal; writing from the heart, which is to say it will go over well with everybody in the biz; not particularly interactive. Makes good use of the palette of "nuh-uh" interactivity -- familiar stuff but it's short enough that it doesn't wear out its welcome.

In the end this is an anecdote which will draw a regretful nod from anybody who's even remotely close to the game industry. (I am only remotely close myself, mind you.)

Sun Dogs

Very atmospheric but it feels sparse. You start with one mission but it is difficult to find any others. (I found one other mission on my first play-through, none on my second.) Mostly you fly around and have a collection of disconnected encounters. You accumulate an inventory of capabilities and bric-a-brac; some of this opens up alternate encounters and endings, but you can't effectively search for these options, so you're stuck with random exploration.

Sometimes you die unexpectedly and lose some of your stuff. This is a minor nuisance, which fits the setting -- but since the only achievable goal is "randomly collect all the stuff", this is a serious drawback in play.

If there were a way to follow connections, or enough content that you were constantly running into story element connections by sheer luck, this would be a lot more engaging. As it is I've played twice and I feel like I've done it all.

Langeskov Emerald

This was a bagatelle, and yet I laughed! Reader, I laughed.

The game relies entirely on a deft absurdism, juggling silly concepts of how games do (or should) work. If you care more or less about making games than I do, it will fall flat. Probably the fact that it works at all (for me) just shows how young videogames are as a medium; you can't go to this well often before everybody (including me) starts saying "Yeah yeah, meta-humor, next please." But this time, I laughed.

(Second thoughts: didn't Portal 2 do all these jokes plus a whole range of other emotional tones, plus great puzzle design? I guess it did. So I'm just a sucker for British comedians. Fine.)

The Beginner's Guide

Having just played Langeskov Emerald Whatsit, I should write up my thoughts about The Beginner's Guide (which I played last month).

I found TBG really engaging. Yes, three out of my first four games in this IGF thing are "game-writing by game writers about game-writing", and that's too many. I have no desire for this medium to disappear up its own self-regarding butthole. And no, TBG is not the best writing or the best character story I've encountered this year. The construction of Coda's games is too artificial, too geared towards the narrator's presentation of them -- I was never able to believe in a real Coda (even outside the narrator's distortions).

But TBG hits three of my, as they say, bulletproof kinks. First: unity of form and content -- ideas about games are presented in a game, in a way that really wouldn't be possible in any other medium. Second: the unreliable narrator -- my brain is engaged in absorbing the story on multiple levels, trying to figure out how they relate or contradict. Third: the questions of fame, public persona, personal boundaries, and what we get from this whole crazy enterprise anyhow.

As I said in my notes about Emerald Tiger Whatever, this is a young medium. When I say that, I mean that a game can impress me simply by taking on a topic or an approach I've never seen before. The next generation will be over all that. I'm not, and I just love the way TBG revels in doing this sort of thing. Can you do characterization via Let's Play, addressing the player directly all the way through and putting the entire story in subtext? Of course! Boom. I'm sold.

That Dragon, Cancer

An emotional gauntlet to get through, obviously, but also a relief after all the clever Stanley-Parable-ness. Someone tells us a story -- an actual story that happened to him. That's all. It's not clever. It's simple, honest, and it works.

Okay, not all of it is simple. The game-metaphor scenes come perilously close to being clever, and I think they lose power because of it. When I see a game, I start to look for game mechanics -- that's a distraction. I'm sure the point is to set up game convention (try to win) against story convention (no victory), which is fine, but we've seen that trick dozens of times before. Show me how you drowned. That's what works.

Let me rephrase my complaint: the game felt scattershot. The chapters went back and forth between metaphors that you observe and metaphors that you engage with. Maybe "unbalanced" is the word I'm looking for.

Then, in the middle, the scene with the baby toy and the four-part conversation. That used interactivity to present points of view, which was -- actually really cool! But again, out of balance with the rest of the game. A degree of meaningful control existed only in that scene, and then we are back to being (complicit) observers. I dunno, I'm probably splitting hairs that absolutely nobody else cares about.

Show me a hospital bed. Show me your letters to God. Show me a baby. Being in a room with a screaming baby is a human experience which, it turns out, a game can present very effectively. Why does that seem strange? Only because we keep gaming in such a small, cramped box.

Her Story

Played this several months ago, when it came out; really enjoyed it.

(I've known of the author since ancient times in the IF community. However, we didn't meet in person until this year's Indiecade, after I played the game.)

I have nothing to say about the game itself except "See what happens when you have exactly one mechanic and tune the entire game experience around it?" (The CRT-style screen distortion was a bit much for me, I admit. I turned that off.)

The sneaky part of why Her Story is awesome, and I didn't really get this until I started reading other people's reviews, is that it pretty well works no matter how you approach it. (Despite having no gating mechanism at all.) Every player is going to run into different bits of information first, but there's a common cycle of "Huh, this is strange", "Huh, I suspect shenanigans", "Huh, I wonder if...". This indicates a very broad spread of very minor clues, which must be a lot harder to set up than it is to say.

The other bit I want to talk about is how genre-fluid the story is; it has interestingly different readings whether you think of it as a police procedural, a gothic thriller, a contemporary fairy tale. But I basically lifted that observation off Emily's review posts, so I'll leave it for her to discuss. :)

The Magic Circle

Whew. There was a fair amount of that game. I mean, compared to Tiger Heist Langerhans, anyhow.

So, The Magic Circle had a lot of fun in it -- but not compared to the amount of game there was. The core mechanic was good, and they worked a lot of clever stuff into it... but it still felt like about six-to-eight clever puzzle scenes spread out over a lot of landscape. Mind you, they could have paced it out with combat! (Which would have been awful.) I enjoyed the exploration enough to finish the game. (Despite the truly terrible framerate on my Mac, sigh.)

But! We're not here to talk about game mechanics. (Or framerate.) The narrative was... not as closely connected to the game as it needed to be. This is a game about taking control of your experience as a player -- but your trip around the fantasy/sci-fi world is an extended hacking session whose goal is "end the hacking session". It has no influence on anything in the narrative until the moment you hack Coda's terminal. And in the meantime... journals. I have nothing against journals per se, but all the background kind of hammered in the point that the story was on hold for most of the game's duration.

There was plenty of background. It was well-written. I was motivated to collect it all, which is all the excuse that journals need. Still -- it was jarring to reach the endgame and feel the story jolt back into gear, while also removing most of the exploring-and-experimenting mechanics that I'd been enjoying.

Cheesy meta presentation tricks at the start and end... full points. I will never have anything bad to say about cheesy meta tricks.

This leaves us to the tone. After four? five? stories' worth of game designers talking about game design, I think we have a respectable sample, and I will say that TMC's approach was my least favorite. It was fundamentally nasty: everybody in the story was an asshole. And, as an evocation of an archetypical game project, it implied that everybody is an asshole. The design gurus, the programmers, the level builders, the artists, HR, the playtesters, the customers, the fans. The guy who once wrote a famous text adventure and wants to move on to other things. (Cough.) All of us. Assholes.

Except possibly the Bastion-y AI, who is clearly a jerk but may have noble goals. To wit: teaching you to be a game designer! You can be better than all those other folks! And if you believe that, then you're the asshole.

The Writer Will Do Something was all about assholes, but (a) you could try to do better or walk away, even if it was a cursory attempt; (b) it was short. You could recognize the scenario without soaking in it. TMC was a long, sordid bath. Or, let me put it this way: TWWDS, even in its brutal portrayal, had compassion. TMC had not a scrap.

Emily Is Away

It is hard for me to think about this outside the context of Emily (Short)'s review and the other posts around that time. I read a bunch of them before playing EiA. (Usually I avoid discussion or at least skip the spoilers before I've played a game.)

(I also saw an alpha version of EiA at a Boston Indies demo meetup last year. I only looked at it for a few seconds, though -- I didn't get any of the storyline.)

So after all that, I'm afraid the game didn't have a huge impact on me. It's not my era; I didn't use Windows, I didn't use that chat interface. It does not ping for me.

Not to say it's an alien world -- I sent lots of email! To high-school crushes, even. But, well, I also spent my college years not drinking and not getting laid. (If that's not too much info.) So when I tried to "play me" in the game, it kind of forced me off into a situation that wasn't very me.

(Although by avoiding alcohol, I avoided the plot branch with the skeeviest overtones.)

I have the sense that fans are being drawn in by the nostalgia of the game's presentation; by the extreme off-stage narrative (everything important happens in the scene breaks, so it's all up to your imagination); and by the "nuh-uh" interactivity. (The untyped-rejected choices in the last scene.) This is not new stuff to IF experts but maybe the broader audience still gets a charge out of it.

But -- to the extent that it has an impact, it really emphasizes that the game is about you. Your tongue-tied regret, your sense of lost possibility, your implied unrequited crush. Even if you spent the early chapters trying to empathize with Emily, her viewpoint gets pretty well scrubbed out of the last scene. And that is kind of skeevy no matter how you got there.

Cibele

I pulled this up after Emily Is Away, thinking "I'm done with Games About Game Writers, so it's time to play all the Games About Terrible Online Relationships! Ha ha kill me."

As with my grousing about GAGW, this was unfair -- all these games do different things, from different angles, and I'm really having a great time comparing them all.

Cibele is purely expository game. I will go a very short distance out on a limb and call it autobiographical. It presents itself as a dramatization of an event in the author's life. Or a dramatization of events in the lives of a social circle she was part of -- the difference doesn't weigh on my response. Either way, it rings with the same honest self-presentation that I felt in That Dragon, Cancer.

As with EiA, I am getting a story that I did not live through. My college years predated the era of hot selfies as a flirting tactic. I spent a bit of time on MUDs, but it wasn't my social milieu.

But Cibele contrasts nicely with EiA. Its narrator is a specific person; it doesn't invite me to "play me". Instead, it fills in "Nina's" background with the digital artifacts of her life. (This is very much a database-search game -- to the extent you're doing anything, you're browsing files. Compare to Portal (1986) more than Her Story.) The upshot is that I felt pulled into another person's world in exactly the way that EiA failed to. But, at the same time, I had no sense that this was my story or my world. Even when I was steering an avatar around a faux-MMO UI, it was pro-forma interactivity -- the hand on the mouse was not the voice on the headphones.

So, Cibele gives us intimacy without complicity. I could call that thematic -- the story is about unreciprocated intimacy. But, eh, that's probably crap. I think this model is just the best way the author found to present her story. (I haven't read any extra-game statements by the author, so if I'm wrong, go ahead and mock.)

(The game also gives us intimacy with subjectivity, which I appreciated. I see so much discussion framed as "male gaze" versus "female gaze". Cibele shows a woman's body in self-gaze, which really isn't either of the above.)

What hovers over the game as you play is fear. Is the the story of a victim? Again, maybe there's extra-game framing which clears that up... I don't think so, though. That's the energy of the story as I felt it. And it's resolved: no it's not. There's uncertainty, there's hurt, there's regret; but everyone is being as honest as I figure college students know how to be. We're left without a dramatic ending, which is of course how an honest personal story has to end. Life isn't over, this is just a thing that happened.

So I'm moved, and drawn in. More so than with TD,C, which really is kind of an overload -- how can you not empathize with the parents of a dying child? You monster. It's practically pre-ordained. Cibele is far more tentative, but I think more effective for that.

But, on the flip side, it is mechanically thin. TD,C screwed up some of its interactive presentation, but when it got parts right, it wowed me more than a straight database game could. EiA made good story use of its UI, and of course Her Story used its search mechanic to turn "straight database game" into something massively engaging. Cibele just doesn't have much to compare.

Sorry, I've slipped back under my (so-weighty) game-designer hat. This is not how the wider audience is going to react, and so it's a dumb note to end my review on. Cibele was a really sweet game! I'm glad I played it.

Read Only Memories

  • (John "JJSignal" James, Ted DiNola, Tommy Thompson)
  • IGF entry page
  • (did not finish)

I played about a chapter and a half of this. It's a nice production, but the story didn't grab me at all. I don't think the writing is bad -- it's pretty bouncy and there's a good variety of characters. But none of the plot hooks hooked me. AI-is-sentient, nothing new there; broke gumshoe in cyberpunk style, ditto; etc. All tropes, nothing built on the tropes.

Also, the story seems to be held together by coincidence. As far as I got, anyhow. (For all I know, the cute robot buddy turns out to be an evil mastermind. Sorry if that turns out to be a spoiler.)

Also, the conversation was all line-by-line slow-print. I maxed out the animation speed and clicked through as fast as possible; it was still slow and painful to read. Literally painful -- the game uses an eyestrain pixel font. I am not sentimental about pixels.

It's got the form of an early Sierra-Lucas-style graphical adventure, but it doesn't have much adventure-ness. It's mostly scripted conversation alternating with room-search, with just an occasional light puzzle thrown in. I'm sure this balance is deliberate, but it's not my thing. So I gave up.

Oxenfree

I was only able to play the opening; I ran into some kind of camera bug that prevented me from advancing. (Got stuck just after entering the cave.)

The game seemed strong up to that point. The characters are vivid (in a Scooby Gang way) (original cartoon or Buffy ref, take your pick). The art is nice and the animations are smooth.

The interface lets you participate in a full-on multi-person conversation without dropping out of the move-and-explore UI. That's not ostentatious, and players might not even pick it out as a feature, but it's really impressive when you think about it. The opening scene has you and your gang of pals/rivals/relatives sneaking out to the beach. You wind up in a game of truth-or-etc, throwing embarrassing questions at each other, and incidentally setting up all the characterization -- while simultaneously wandering around, throwing rocks, grabbing a beer out of the cooler, checking the exits. Any of these things in isolation would be standard point-and-click fare, but doing it all in one smooth scene just works really well. I hope more games pick up the trick.

I didn't get far enough to feel where the story was going -- besides "ghost story" -- but I look forward to a version that's playable for me.

Sunset

Strong on story, weak on making me think that I'm part of the story.

The model of "absorb narration while your hands are kept busy with low-level tasks" is common enough. (It's the bulk of Cibele, for example.) Sunset is trying to foreground this model, in fact, I think -- you are a housekeeper, literally tidying up the penthouse of the rich mover-shaker type. The fantasy-architecture space is gorgeous, luxuriously furnished, and not yours.

However, putting a lampshade on the model is not per se a solution to anything. The actual play of Sunset consists of walking into the apartment, hearing a narration of recent events, and then tooling around to complete your chores. As you do, you may find optional actions -- these are how your character gets personally involved in the story. I gather that the story arcs are "you romance your boss", "you aid the revolution", "you help get your brother out of jail". (I'm not sure whether those last two are independent.)

The problem is, these options are necessarily indirect -- you're just moving things around in an apartment -- and appear with little context. So it's not ever really clear what you're accomplishing. If you make a fancy dinner and leave it on the table, is that generous or subservient? If you move an encrypted letter, are you covering for your boss or interfering with his plans? Nor can you ever take back an action. Thus, I had no sense of trying to advance specific goals. Instead, I would just punch every button I found, on the theory that doing anything was more interesting than doing nothing. I wound up not getting very far in any of the story arcs.

(Assuming I've even understood the arcs correctly! I'm mostly going off the Steam achievements list, I admit. I've unlocked "interested in Ortega" but not "has feelings for Ortega" or "probably in love with Ortega". Okay then.)

(I'm pretty sure I boinked him in that last chapter, so I must be the casual-fling type of girl.)

What Sunset does really well is immerse you in an environment, and then convey mood through shifts in that environment. I spent three hours walking around that penthouse; I saw it empty, furnished, cluttered, damaged, repaired, reconstructed, and stripped. I performed a lot of those changes, plus some touches of my own personalization. They paralleled the narrative, and I'll say this: when I took a break, my real-life apartment suddenly looked pokey and cramped. And it took me a moment to remember where my real-life bathroom was. I swear this is true.

The period decor is fantastic. So much Helvetica. So much. This is a compliment.

What Sunset does not do so well is propel you through the story. Chores are boring. I don't know if chores have to be boring -- maybe there's a way for this to work -- but Sunset didn't make it interesting. By halfway through, I was just clicking and waiting for the story to end. Then hoping for it to end. Then pleading. As Christmas approached in the game calendar, I became desperately attached to the theory that the game would end at the end of 1972. Result: I am a person who has greeted Epiphany by flipping it the two-fisted bird, which must be an uncommon blasphemy. (The game runs three months into 1973, in case you're wondering.)

So we have a game which takes up a set of tools, and works the heck out of those tools; I think it does everything it can possibly do with them. I admire this, but I cannot recommend the game because I spent half of it wishing I wasn't playing any more.

Undertale

I played this for 90 minutes, and it was... I don't know. Funny, but not that funny. It has all the JRPG conventions that make me not play JRPGs. It messes with them but it's still based on them. So I quit.

Then I look at discussion by people who are into it, and they're rapturous. I see people enthusiastically discussing how the themes work and how much there is buried in the story. How brilliant the hard ending is (which takes 15-umpty hours to reach). All under spoilers! The first thing everybody says about Undertale is that it's hard to talk about without spoilers.

Well. James Nicoll's second most famous quote is, "I don't mind hidden depths but I insist that there be a surface." The surface level of Undertale has nothing for me, and it's careful to conceal everything I might care about. You win, Undertale. You have successfully imitated a game I don't want to play.

...Here's a less snide way of putting it: Undertale is aimed at a particular audience, and it calls its shot right up front. I did the same thing with Hadean Lands. Want to play old-school IF with alchemy puzzles? Let's start with an old-school IF alchemy puzzle! Begin as you mean to go on. Undertale is the same way. If you don't get a huge kick out of the first 30 minutes, stop.

Posted in Zarf on Games | Tagged , , , , , | 1 Comment

What Zarf is up to, winter edition

I survived my month of a thousand conferences. Three conferences, which feels like a thousand when you put them in a four-week span. IndieCade was great! WordPlay was great! I also went to Practice, which was great! Then I was tired.

Between all of that and some assorted client work, I have had zero time to put into The Flashpaper War. Oops. So the "coming later this year" notice that I posted in May turns out to be a lie. Sorry! (This is why I didn't Kickstart it, right?)

I've updated the Flashpaper teaser page to say "Coming in 2016". I really intend to hold to that. Not least because Flashpaper was my "make some money on IF in 2015" idea. Money is awesome. I'm very keen on having some new IF for sale in 2016.

I'm still excited about Flashpaper as a game concept, too. Now that I've taken a three-month vacation from working on it, I can see that the underlying concept needs to be hit with the iteration stick a few more times. It got good responses at FIG, but it's not as catchy as I'd like. Flashpaper is unlike most IF that's out there, so it has to build its own market in order to be a hit.

In the spirit of setting expectations, I will say: Flashpaper is not parser IF. It will be an iOS game, or at least an iOS-first game. It was conceived as a touchscreen game from the beginning and that's how it will work best.

(Android may follow eventually if it seems worth the effort of porting. Yes, I say that about all my iOS projects. Nothing yet has been enough of a success to be worth learning Android programming. I live in hope.)

As for other projects: I still want to do Meanwhile for AppleTV. I took a quick stab at porting the iOS version over, but the scrolling didn't work right and then I had to put it aside for client work. I'll get back to it over the winter break.

I am also -- and don't take this as a promise but come on this is awesome -- looking at entering the Imaginary Games Jam. Registration deadline is a week from today.

And I need to sew elbow patches on my hideous plaid jacket. That jacket has been in circulation since 1987-ish. Getting a bit worn around the seams.

So those are my winter plans. Plus the usual round of keeping an eye on Inform bugs, thinking about IF libraries, hanging out, and generally messing around. The next Boston IF meetup is Thursday, by the way.

Looking farther out, I'm gonna be at GDC in March. I'm not giving any talks or anything, just visiting. It's been four years since my last (first) GDC trip, and I've met way more cool game people since then, so it's probably time to go back.

I hope to have more exciting Zarf-does-stuff news soon...

Posted in Zarfplan | Tagged , , , , , , , | 2 Comments

4000 pages of Infocom documents

I said 4000 pages of Infocom documents. You heard me, right?

These are paper records saved by Steve Meretzky while Infocom was operating. He saved them after the company fell down; he preserved them for decades; he let Jason Scott scan them while making Get Lamp. The originals are now at Stanford University. The scans (slightly edited to remove personal information) are now on the Internet Archive.

What's currently up there is all the design documents for many of Infocom's games. (I originally wrote "nearly all" but in fact it's seven of them.)

Further doc dumps (memos, email, schedules, business plans) will appear in the future -- they require more editing and permissions, since there's more personal information there.

Go nuts.

Tagged , , , , | 2 Comments

The Room 3: design ruminations

(Or "roominations", har har.)

I have finished The Room 3, third in the series of gorgeous puzzle-box games for touchscreen. I didn't know it was in production -- The Room 2 seemed to wrap up the storyline, such as it was -- but I guess the designers have decided to ride this clockwork train for as long as it ticks. I'm not objecting; this entry in the series is a satisfying chunk of puzzle manipulation. It's longer than the first two games put together, and it expands the original game mechanic into an explorable environment. (By offering an architectural space of rooms, and also adding a new "zoom into tiny sub-rooms" mechanic.)

I want to talk about one particular aspect: the storyline. In idle post-game chatter, I tweeted:

I can't say I think of these games as narrative objects at all. (--@zarfeblong)

That may sound nuts; how different is the Room series from the classically-narrative Myst series? Puzzles + journals = IF. But there must be a difference. When I said above "the storyline, such as it was", I wasn't kidding. I literally don't remember anything about the storyline of The Room and The Room 2 except that R2 seemed to wrap it up. And there was "the Null", but that's something that R3 reminded me of.

R1 had no environmental storytelling. It was ostentatiously unanchored in any physical environment. It had physicality, yes -- its puzzle-boxes were of wood, brass, glass, and steel, as conveyed by texture and sound and the direct manipulation of the touchscreen interface. But the boxes sat on spotlighted tables. The walls around you were unfocussed and dimly lit: the bare minimum to keep you feeling grounded at all. Despite the title, the game kept your attention resolutely off the room you were in.

R2 added furniture -- adjacent tables, mechanisms on the walls. Now we could talk about "the room" as a space that the game took place in. But these were still silent spaces: no history, no future.

In R3, as I said, we are given an architectural environment. We can move from room to room. We can backtrack to consider clues that were originally obscure. Occasionally the topology even becomes relevant, adding a Rhem-style puzzle or two.

These additions expand the scope for puzzle design. But do they add to the storyline? I don't think so. The journals tell us that this house is named "Greyholm", but that's the only mention of the house or anything in it, aside from undescribed "keys" and "parts of the Null". We get no history, no sense of events occurring here. We have no reason to imagine the Craftsman reading in his library or puttering in his greenhouse.

Now you may object: who says this game needs a sense of history? Perhaps the designers wanted to hew to the original R1 aesthetic -- an uncontexted puzzlebox -- while embracing the expanded puzzle possibilities of architecture. And I agree with that!

Or, from the other side: does Myst really have much more than this? Atrus writes about construction in his Ages, but you never get a picture of little Sirrus and Achenar playing in the planetarium or swimming by the dock. Myst Island resists being placed in any context beyond "they burned the library". And I agree with that too. (Although Cyan clearly saw that as a shortcoming; they stuffed as much history into Riven as it could swallow.)

So I am not criticizing The Room 3, but observing how I reacted to it: as a garden of puzzles in spotlights. The journals and letters, lacking historical context, presented themselves to me as irrelevant. So I didn't read 'em! I gave them one glance each, to check whether the pattern had been broken by a surprise clue or something, and then moved on with the "real" game.

The designers may be frustrated by this reaction. Here they are writing content and I'm ignoring it. (And I call myself a text game fan!) They're even trying to set up some narrative tension by having two sets of notes; one says "do the thing!" and the other says "it's a trap -- don't do the thing!" And I'm ignoring that too, because the game just doesn't have any space for it. There's no action you can take which corresponds to "don't fall into the trap". There are only puzzles. You solve the puzzles, or you quit out and go back to Pac-Man.

Myst, of course, set up a very similar narrative tension (red pages or blue pages?) but it managed to make it stick because you could make a choice. It was a silly choice, a clearly terrible choice, but the game let you express it. So you had a reason to at least listen. And then when the third alternative came along, you were engaged enough to count it a victory.

R3 tried an interesting variant of this. You progress through rooms, solving puzzles and collecting pieces of the Null. But as you do, you discover extra puzzles on the side. These appear unsolvable at first, but you can discover an "in" and begin solving them in parallel with the mainline puzzle rooms. Or not; up to you. If you complete both threads, then you can reach extra endings from the game's final scene.

These side puzzles are associated with the "it's a trap" notes -- but, since I was ignoring the notes, I didn't actually notice that until later. In retrospect, the designers must have intended this to be your choice: finish the main puzzle thread or the side puzzle thread? Accept the Null challenge or refuse it?

Except the game doesn't work that way at all, because puzzles are for solving. You're never forced to choose between the threads. You can work on either at your leisure; alternate threads or leave the side puzzles for later. (The side thread is unlocked by the main thread, so you can't solve it on its own. That's what makes it "side".) This is an open design (to a degree, but more open than R1 or R2 were) -- an excellent thing, but not a narrative choice. Final-scene choices are never narrative choices in the game, because the game is over.

(Yes, I'm talking about Myst here too.)

The game has structure; the main-vs-side puzzle construction is admirably clear. The final scene invites you to discover the extra endings -- unsolved puzzles, and then an extra goal beyond that -- purely through presentation. (The closing screen nudges you about which endings you've found, but it didn't have to.) My point is that this structure is not the narrative choice that the journals seem to be conveying. In fact it actively cuts against it; the game wants you to solve all the puzzles.

I'd extend this to the atmosphere, as well. The Room series has a tone of unearthly horror. But this does not flow from unreliable letter-writers or Lovecraftian tentacles. (The tentacles are kind of laughable.) It comes from the unexpected abrogation of your physical environment. You are simultaneously led to think of the world as real and as a directed dreamscape. When your expectations of structure, solidity, and architectural space fall out from under you -- that's what makes these games disturbing.

Posted in Zarf on Games | Tagged , , , , , , | 1 Comment

Indiecade happened and it didn't kill me

We showed off Seltani at Indiecade! To lots of people. Lots and lots. Not everybody was interested -- it was, after all, a text game in a hall crowded with flashing lights and VR headsets -- but plenty of people thought it was worth a look. Some were Myst fans (or even Myst Online fans); some were old MUD users; some were familiar with Twine but had never seen a multiplayer Twine-like.

I gave out stacks of postcards with this map I did of the Seltani District (the game's initial hub area). It had the URL on the back, obviously. (Note to self: next time I reprint the postcard, boldface the URL.)

In a wiser and more organized world I would have a story to tell about Indiecade, but it's not, I don't, and I'm moderately exhausted in a hotel as I write this. So you get lists.

People I met or re-met (in no order): Tory Hoke (of Sub-Q Magazine), Squinky, Zak S, Rich Lemarchand, Tablesaw, Sam Barlow (Her Story won the big festival jury prize), Cat Manning, one of the Chaosmos designers (I have lost which one), Zoe Quinn, Naomi Clark, Mark Marino, Matt Weise, Patrick Smith (Vectorpark), Jim Munroe, Kyle Seeley, Michael Mateas, Michael Carriere, and a lot of others who I am failing to bring to mind because it was a packed weekend.

Games I recognized, played, or intend to check out: Emily Is Away, Desolus, Kairo, Nevermind, Museum of Simulation Technology, Darknet, Metamorphabet, Pygmalion's Challenge, Pavilion, Walden, The Meadow, Line Wobbler, Memories of a Broken Dimension, Thumper, Consentacle, Red and Pleasant Land. This too is an incomplete list. Very, very incomplete. I am not knocking your game if it's not mentioned here.

Bonus points to Sam Barlow for trying to get me to play Consentacle. I declined. It's not you, Sam, it's me.

I am grateful to everybody who came up and introduced yourselves to me. Or re-introduced yourselves to me -- I'm bad at faces. (Have I told the story of how I've met Chris Klimas three times and each time thought it was the first?) I had interesting conversations with writers, teachers, musicians, artists, and (obviously) gamers and game designers. I collected a centimeter-thick stack of business cards (which helped me write this post, at minimum). I had a gelato.

Special thanks again to Carl Muckenhoupt (of Baf's Guide, fondly remembered) who volunteered to help me out with the Seltani demo for hours and hours.

Oh, and I visited the Museum of Jurassic Technology! That was... a trip. Describing the Museum is probably the least useful thing one can do about it, so I won't.


After I wrote the above, as I waited in the airport for my flight home, I saw this post from one of the Indiecade organizers:

Implicit in my work with IndieCade was a belief that conferences—the talks, the panels and the interstitial moments of community—are vehicles for change. Looking back at the last six years, I no longer believe this is a meaningful way to sustainably support marginalized communities. And so I’ve made the decision to step down from my conference co-chair role [...]

[...] For me, a big motivation for volunteering my time to co-chair the IndieCade conference has been giving marginalized voices a platform to share their work. Events like IndieCade and GDC’s diversity track give these developers and critics a platform to share their work, but I fear these events are not providing sustainable, long-term benefit to those outside academia and game development companies.

[...] But within marginalized communities of gamemakers, outside the academic and game development ecosystems, it is unfair to assume everyone can afford to take on the opportunity costs and financial burden of attending a conference. Even with the free conference pass given to most speakers, travel, lodging and food can easily eat up $1,000 or more for a weekend event. Over the last couple of years, IndieCade has made efforts to provide some financial assistance to conference speakers who need it, but it has been a token gesture at best [...]

(--John Sharp, Conferences and sustainable diversity)

(I've selected just a few lines from his post. Read the whole thing.)

That had a wee bit of resonance for me, let me tell you.

Obviously I am not "marginalized" in most senses. I'm a straight white guy with a CS degree and a software industry background. I have savings to fund my attempt at an indie career. But still, this is exactly the stuff I think about. I'm not in academia; I do not work for a game company; I have not achieved sustainability. Zarfhome Software has never made rent for me for more than a couple of months in any given year.

I submitted Seltani to Indiecade on a whim. (A whim with a $100 submission fee!) When it was accepted, I did the calculation: will this trip be worth it? It's a business decision. Crudely, I was gambling that the contacts and handshakes and business cards I collected would add up to more than the cost of travel, hotel, prep work, and the time I took from other tasks. (Which is, yeah, over $1000.)

You can't measure that outcome on the spot. The payoff is in future projects and potential jobs. I'd like to be optimistic about this, but here's a conference organizer saying he's not. He thinks I wasted that grand. (And, again, I'm one of the folks who can afford to lose it. Plenty of people can't.)

As I said on Twitter -- the most valuable "networking" I did this weekend may have been going up to a Boston compatriot and saying "Hey, your company does iOS work, right? I might need some of that next year." Not game work, just pay-rent work. And I didn't have to go to Indiecade to talk to him; I see him around Boston all the time.

So this is all depressing in various ways. I can still be optimistic, but it's a nervous optimism. Going out to dinner with IF people was fantastic, but what did we talk about? Sustainability. Money. Jobs. Trying to figure out what we're doing with our lives.

(Also community tensions within IF and IF-adjacent groups, which is not the same issue but touches on it. There's been some arguments recently about the role of IFComp in the modern indie-dev world. When IFComp started in 1995, nobody was asking "Should I enter my game in this competition or sell it on my web site for money?" That just wasn't a question on anybody's radar. Things have changed.)

John Sharp's article goes on to talk about positive possible directions. It's not a surrender post. He likes IndieXchange, the pre-Indiecade biz-dev event, which I also liked and found valuable. (It didn't turn me into an instant business success, but there were good talks on marketing and on the dirty details of outsourcing audio for your game.) (I might have to outsource audio for a game someday, right? I can't get away with banging the cheese grater forever.)

There may be more possible paths in the future. I hope so.

And look! I've signed up for GDC in March! The last GDC I went to was in 2012, and that gamble did not pay off. I hung out with friends, it was fun, but was the benefit worth that $700 Summits-and-Tutorials pass? Plus plane and hotel? I think it's safe to say "heck no."

But here I am taking another spin of the wheel. I think the odds are tilted my way now. I've got the more modest Indie-Summit pass -- not that this saves much compared to travel costs. Mostly, it's that I've met more people and done more work, so I'll have a wider base of contact. (I'm bad at meeting people, but I can tell that four years of putting myself out there have slowly accumulated some results. See lists above!) I'll have finished Flashpaper by March -- I'd better have finished it by March -- so I'll have a game to promote.

Maybe I'm stupid, but this is the point in my life when I have to be.

Posted in Zarfplan | Tagged , , , , , , , | Leave a comment

Videogame Hugo: 2015 potentials

Last month I posted about the idea of a videogame category for the Hugo awards.

A few days later there was a discussion thread on File770 (a prominent SF fandom news blog). The discussion was a good snapshot of community response to the idea.

The biggest objection was that there aren't enough good games to make a category worthwhile. People cited 15 to 25 as a desirable minimum. (The Hugos have a two-stage voting process. So you want at least 25-ish plausible suggestions for "best game of the year", which then get narrowed down to five finalists, which then get narrowed down to one winner.)

The petition that sparked that discussion thread went nowhere. However, I think it's worthwhile to put up a concrete list. The subject will certainly come up again, and I want people to be able to point and say "Yes, look, there are that many games every year!"

I'm going to focus on indie and amateur interactive fiction titles, because that's my field. I've got nothing against big-budget SF games, but you can get a list of those off any game-industry news site. This is the wider field of games which might not be familiar to the non-gaming SF fan. Most, though not all, are short games -- two hours playtime down to ten minutes.

I'm not saying that all of these games are, in fact, Hugo-worthy. I haven't played most of them! I'm gathering highly-rated titles from a variety of sources, including IF competitions and game-jams of 2015. (Special thanks to Emily Short's mid-2015 roundup post.)

(I do not yet include games from IFComp 2015, the big IF competition of 2015. That's still in progress and will be for another month. When it ends, it will certainly add another handful of titles to this post. I'll update then.) (Also still in progress: the Windhammer Prize for Short Gamebook Fiction.)


Notable and Highly-Rated SF/Fantasy/Horror IF and Narrative Games of 2015:

  • Arcadia, Iain Pears ($)
  • Below, Chris Gardiner ($)
  • Champion of the Gods, Jonathan Valuckas, Choice of Games
  • Chlorophyll, Steph Cherrywell (ParsC)
  • Choice of the Petal Throne, Danielle Goudeau, Choice of Games
  • The Compass Rose, Yoon Ha Lee and Peter Berman, Sub-Q Magazine
  • Delphina's House, Alice Grove (ParsC)
  • Does Canned Rice Dream of a Napkin Heap?, Caelyn Sandel, Carolyn VanEseltine, Danielle Church, Jamie Sandel (AnthJ)
  • 80 Days, Meg Jayanth, Inkle Studios (EXP from 2014) ($)
  • False Mavis, Ted Casaubon (ShufC)
  • Her Story, Sam Barlow (MAR, fairy-tale elements) ($)
  • Leadlight Gamma, Wade Clarke (EXP from 2010)
  • Lifeline, Dave Justus, 3 Minute Games ($)
  • Molly and the Butter Thieves, Alice Grove (ShufC)
  • Neon Haze, Porpentine and Brenda Neotenomie, Sub-Q Magazine
  • Oppositely Opal, Buster Hudson (ParsC)
  • PataNoir, Simon Christiansen (MOB from 2011)
  • Photopia, Adam Cadre (MOB from 1997)
  • Ratings War, Eddy Webb, Choice of Games
  • Scroll Thief, Daniel M. Stelzer (EXP from 2014)
  • Six Gray Rats Crawl Up The Pillow, Caleb Wilson (ParsC)
  • The Skeleton Key of Ambady, Caelyn Sandel (ShufC)
  • Snake Game, Vajra Chandrasekera and Tory Hoke, Sub-Q Magazine
  • Starry Seeksorrow, Caleb Wilson (ShufC)
  • Terminator Chaser, Bruno Dias (ParsC)
  • To Spring Open, Peter Berman and Yoon Ha Lee (ShufC)
  • Tonight Dies the Moon, Tom McHenry (AnthJ)
  • Versus: The Lost Ones, Zachary Sergi, Choice of Games
  • When the Land Goes Under the Water, Bruno Dias (ShufC)
  • A Wise Use of Time, Jim Dattilo, Choice of Games

Tags on the above:

  • ($): Costs money (all titles listed here are US$10 or less)
  • (EXP from...): Significant expansion of a game released in an earlier year
  • (MOB from...): Mobile port of a game released in an earlier year
  • (MAR): Marginally genre but I'm counting it anyway
  • (ParsC): High-rated entry in ParserComp (IF competition)
  • (ShufC): High-rated entry in ShuffleComp (IF game exchange)
  • (AnthJ): Entry in Antholojam (SF-themed IF game jam)
  • note that Choice of Games titles are available both as apps ($) or free-to-play online

Other suggestions welcome! Comment away.

Tagged , , , , | 10 Comments

What Zarf is up to, autumn edition

Yes, I've been running quiet for the past couple of months. I've been working away on various projects. But soon I will enter a season of furious public activity! While also still working away, because the projects aren't done yet.

First, as I recently posted, I will be at IndieCade to show off Seltani. That's Oct 23-25 in Los Angeles. Extra thanks to Carl Muckenhoupt (Baf of the fondly-remembered Baf's Guide) who will be helping me demo Seltani that weekend.

There's also an IF meetup on Saturday night at the IndieCade Night Games festival. I'll be attending that too.

The WordPlay festival of narrative games and IF is back in Toronto on Nov 7th. I'll be there, along with other stalwarts of the IF scene including Emily Short, Sam Barlow, Christine Love, and (our blog-host) Jason McIntosh.

(Is "stalwarts" an okay thing to call people? I don't always know.)

Let me also mention the Boston IF meetups (at MIT) on Oct 12 and Nov 11. Emily Short will be visiting for the November meeting.


Now the more exciting report: projects in progress.

I showed off a prototype of The Flashpaper War at Boston FIG a couple weeks back. That went great! My table didn't draw enormous crowds -- the perils of demoing a couple of meek ipads amid the hall's obstreperous beeping and flashing. But people kept sitting down and trying it... and when they tried it, they generally sat and read/played through several pages of interactive text. Amid all the beeping and flashing! So that's a good sign.

I must admit that Flashpaper is still only a prototype. (Although it's a much more polished prototype than it was before FIG!) The web page says "Coming later this year," and I intend to stick to that, but there's a lot of writing and adjusting to do before it's ready to go.

You may have seen that the new Apple TV is about to ship, and it will support third-party apps. I'm very excited about this; I've been working through the dev tools to see how it works. (Summary: very similar to iOS. No surprise there.)

I've just finished up a draft of Pocket Storm for Apple TV. Is this not the perfect fit? Push button -- soothing rainstorm audio in your living room. Or cricketsong and distant thunder, if you prefer. If all goes well, Pocket Storm will be among the first wave of apps available when the new TV box goes on sale.

(If you already own Pocket Storm for iOS, fear not -- you'll be able to download the Apple TV version for free! One purchase covers both platforms.)

(I know, "Pocket Storm" isn't the best name for a set-top box app. I couldn't think of anything better, I'm afraid. "Living Room Storm" is all wrong.)

So what else would make a good Apple TV app? I'm thinking that Hadean Lands is probably not ideal. The UI is not built for text input, and while you could attach a Bluetooth keyboard, most users won't. So parser-based IF is probably not going to fly. (Flashpaper, on the other hand... we'll see.)

I'm also taking a look at Meanwhile. I'll have to see how the UI works with a remote control, and of course I'll have to consult with Jason Shiga about it. But it could be sweet.

That's all for now. Keep an eye on this blog for things shipping. I'm eager to get to the shipping part.

Posted in Zarfplan | Tagged , , , , , , , , , , , | 2 Comments

Seltani at IndieCade 2015

A very quick note to say that Seltani has been selected as an IndieCade festival nominee!

(Among many other recent indie wave-makers such as Her Story, Kerbal Space Program, Plug & Play, and Prune.)

This means I will be in Los Angeles for the IndieCade festival. (October 23 to 25.) I will be showing off Seltani. Showing off a MUD in the middle of a modern games festival! I don't even know what that means!

(Well, I've demoed Seltani in public before, so I have an idea what it means. But never on this scale.)

I am proud, humbled, and not a little freaked out. Further details to follow.

Posted in Zarfplan | Tagged , , , , | Leave a comment

Videogames in the Hugo Awards

This post is not about nomination slates.

The recent excitement around the Hugos has led to record-breaking levels of public discussion and voting. That's good! It's also led to an early start to the "what's worth nominating next year?" discussions. Also good (and I've noted down some recommendations for my own to-read list). But that's not what this post is about either. This is a game blog, so we're going to talk about the possibility of a "Best Videogame" category for the Hugos.

To catch up: the Hugo Awards are the annual awards for best science fiction and fantasy of the year. They originated in 1953. There are a bunch of categories, including Novel, Short Story, Short Dramatic Presentation (TV episodes), and Long Dramatic Presentation (movies). But the categories have shifted over time; for example, a Graphic Story (comics) category was added in 2009.

So how about a videogame Hugo category? Many games are science fiction and fantasy. (I could argue that most videogames have at least some SF or fantasy elements.) (I could also argue that "sci-fi videogames" do not form a genre the way sci-fi books or movies do, but I won't get into that argument here.)

Looking back in history, I find that an "Interactive Video Game" category was experimentally added in 2006. It received very few nominations and the category was dropped before the final round.

But, I venture to say, times have changed and fandom has (slowly, cane-wavingly) changed too. Comics are in -- probably because lots more fans read comics. (I suspect this is because of web-comics.) Are games as widely appreciated by SF fandom? I'm sure they are, because the field of gaming has become so variegated and spread to so many audiences. Not everybody is playing Metal Gear Solid this week -- I'm not -- but an awful lot of people have played a casual web-game or an online board-game or some form of IF or an indie Steam game or, or, or... something.

So I'm willing to say it's time.

I've dipped into a discussion on this topic on Making Light (a fannish blog). (See comments 651, 652, 656, and various thereafter.) I also see that Eleri Hamilton, who I know from Myst fandom, is pulling together a proposal.

(This is not to say she's the only one pulling together a proposal! Fandom is large and I only see a few corners of it.)

Several other questions came up in the discussion. I'll summarize the answers I agree with; the ML thread contains longer and better-argued replies.

What do we call it?

I've seen "Videogame", "Video Game", "Interactive Media", "Interactive Story", "Interactive Experience", "Interactive Fiction". I lean towards "Videogame" just because everyone knows what that means. (Everyone then starts arguing about what it really means, but that's equally true of the other labels.)

How many categories?

Just one, to start with. Hugo categories are currently split by length (running time or word count), but the play time for a videogame is often ill-defined. Game industry awards are sometimes divided by game genre -- "best adventure game", "best shooter" and so on -- but asking a non-gaming-focussed fannish audience to do that is probably overkill. The genre labels have gotten fuzzy these days, anyhow. A single award category is simple; we can refine it later if desired.

Can videogames be nominated for Hugos right now?

Yes, kind of. Games are eligible for the "Dramatic Presentation" categories, if you're willing to pick a running time. However, those categories were meant for, and remain dominated by, TV and movies. The exceptions are stuff like audio plays and theatrical performances. Games, I snobbishly insist, are qualitatively different! I don't think it's a good comparison to put them up against non-interactive media.

There's also a "Related Work" category. Early on in this discussion, I thought it made sense to nominate games for "Related Work" and then move on to a permanent category if they did well. But this doesn't seem to be the way the Hugos work. The category is mostly used for non-fiction -- critical works about SF -- rather than as a "miscellaneous" or "uncategorizable" bin. Graphic novels were very rarely nominated for "Related Work" before the "Graphic Story" category appeared.

How does one go about proposing a Hugo category?

See Kevin Standlee's post from early this year. The short answer is, the Hugos are run according to the rules of the World Science Fiction Society, which can be amended by vote of attending Worldcon members. There's a procedure. It takes a couple of years; the system has lots of built-in hysteresis.

A worldcon committee may, if it wants, invent a one-time category without going through the whole voting thing. (This is how the 2006 "Interactive Video Game" category happened.) So this would be another way to try out the idea.

So what do we do?

Talk about whether it's a good idea. Come up with games that you think would be good nominees for next year. (That means games released in 2015, or which received significant expansions in 2015.) (For the record, Hadean Lands launched in October 2014. Sorry!)

Any proposal, whether to the Worldcon membership for a permanent category or to the Worldcon committee for a one-off, will need to argue two things: there are enough nominees each year for a good contest, and there is enough interest from fandom to get a lot of votes. That's what we have to establish.

What about the Sad Puppies thing?

Dammit I said this post wasn't about that.

Okay, yes. This is the year that a whole bunch of Hugo categories got No Award due to... well, I would say "due to a loophole in the nomination rules". I would also say "Remember Gamergate? Like that, but for science fiction fandom." I would also say "Dammit." The issue is not dead and will certainly infect the 2016 Hugos, although it's not clear if the results will be as severe. (A nominations rule change has been proposed, but that cannot take effect until 2017.)

So it would be bad if a videogame category was tried and then went to No Award because of this mess. However, this doesn't mean we should just drop the issue! To quote from my own reply on Making Light:

...it's awfully close to "be very very still and the assholes might not see you". I'm not interested in letting them dictate my goals that way.

Nor do I expect either the Puppies or Gamergate to die down of their own accord. They'll be "gone" when the world ignores them, which day will come sooner if fandom continues to create, promote, and discuss great SF. This means moving the conversation forward, not hiding from it.

Anyhow, the game-category discussion is probably going to take a while. A 2016 one-off category is possible but it's not the most likely path forward. So we should get the discussion rolling, and hopefully the 2017 nominations fix will be ratified and help stabilize things.

Time and bank balance permitting, I will be at the 2016 Worldcon (MidAmeriCon II in Kansas City). If I'm there, I'll be at the Business Meetings, which is where rule changes are debated and voted on. Let's see what we can do.

Tagged , , , , | 6 Comments

Customizing an interpreter for a Glulx game release

Another technical question from Twitter: the integration of Hadean Lands with its iOS app. How did I set up iOS UI features like the dynamic map and the recipe index?

(Warning: if you don't think C code is interesting, this post is not for you! Sorry.)

The iOS version of HL uses my standard iOS IF interface, extended. I've added two tabs to it. The map tab shows your current location, and you can tap to travel to any room you've visited before. The recipe tab shows an index of recipes and other information you've learned. These work just like the "GO TO..." and "RECALL..." commands, so they don't make the game easier to solve, but they're convenient shortcuts.

I'm not going to post the iOS UI code I used. If you know iOS programming, it's very basic -- textbook UITableView and UIImageView stuff. Instead, I'll talk about the general problem: transferring information between the Glulx VM and your native (C) interpreter.

I should put "general problem" in quotes. There are several Glulx interpreters, after all. But let's assume that you're building a native app for your Glulx game, incorporating the glulxe interpreter engine (in C), and you want to customize it with game-specific features. You've implemented the UI part; now you just need to extract game state information. Say, the player's location to show on the map.

There are a couple of approaches that would work. For example, we could define a completely general system for transmitting game information to an outside observer, and add that to the Glk spec. Sound like a good idea? Well, maybe, but it's both a hard problem and a vague problem -- what's "information"? We'd probably need some kind of structured interchange format (XML? JSON?). Then we'd have to encode and decode that. Plenty of headaches. No thanks, not right now.

Or we could define a new Glk output capability just for this game. No spec, just define a function ("glk_set_map_location") and have the game call it each turn. I thought about this, but I decided it would require modifying too many different modules. Glk function dispatching is kind of ugly.

Instead, I decided to write C code to peer directly into Glulx VM memory! It's stored as a simple byte array, after all. Reading the game state out is just a matter of understanding the memory layouts of objects, variables, and arrays.

Okay, that's not easy, but it's doable in a small amount of code. To make this work:

  • You'll need to know some Inform 6. Sorry. Inform 7 is a wonderful high-level programming system, but it compiles into low-level objects, variables, and arrays.

  • You'll need to extract information from the gameinfo.dbg file that's built along with your game. (This lives in the Build subdirectory of your Game.inform project.) This is where you find the memory addresses of those objects, variables, and arrays.

  • You'll need some boilerplate C code to examine objects, variables, and arrays. I'll attach it to this post; you can copy-and-paste.

How do you use this? Say you're interested in the player's location. (For the map, right?) You know from the Standard Rules that

The location variable translates into I6 as "real_location".

Browse through gameinfo.dbg with a text editor (or an XML editor) and you'll see a stanza that starts:

<global-variable>
    <identifier>real_location</identifier>
    <address> 249528</address>
    [...more info...]
</global-variable>

This tells you the absolute memory address of the I6 variable real_location. Call gameparse_get_global() with that address -- the function is shown below -- and you'll get the player's location, expressed as the memory address of the room object.

How do you know what room that is? Somewhere in gameinfo.dbg is another stanza:

<object>
    <identifier>I88_kitchen</identifier>
    <value>     273861</value>
    [...more info...]
</object>

This indicates that an object named "Kitchen" has memory address 273861. (It happens to be the 88th item that the compiler defined.)

Obviously this is not very convenient. All of these addresses are liable to change every time you compile your Inform game. So you wind up writing a script to parse your gameinfo.dbg XML, locate the real_location address, locate an object called I#_kitchen (for some integer, might not be 88), and so on. I like to write them out to a C header file looking like this:

#define GLOBAL_REAL_LOCATION (249528)
#define OBJ_KITCHEN (273861)

Then you can include this header in your game project and write code like

if (gameparse_get_global(GLOBAL_REAL_LOCATION) == OBJ_KITCHEN) {...}

But you'll have to write this XML-parsing script yourself, I'm afraid. I don't have one for you. You could start with profile-analyze.py.

Note that you can't do this for I7 global variables (declarations like "Foo is a thing that varies.") Those get tucked into an I6 array and the gameinfo.dbg file has no information about them. If you need to observe a global variable, you'll have to declare it in I6 with an I7 translation. See I7 manual 27.22.

The gameparse_obj_child, gameparse_obj_sibling, gameparse_obj_parent functions let you traverse the I6 object tree. (Although this doesn't give you I7 relations like component-ness.) I used this for HL's recipe index. The game's internal knowledge objects are moved into special containers, for easy scopability, so I can trawl those containers to set up the recipe tab.

Looking at object attribute and properties is easy. The functions gameparse_obj_attribute and gameparse_obj_property do that. Knowing what I6 attribute or property represents a given Inform property is harder. The best plan is to to look at the generated I6 code (the Build/auto.inf in your Inform project) and see what's going on under the covers. For examine, the boolean property open/closed is implemented by the following I6 lines:

! meaning of "open"
if (t_0) return (GetEitherOrProperty(t_0, open));

This means you're looking for an I6 attribute in the gameinfo.dbg file:

<attribute>
    <identifier>open</identifier>
    <value>13</value>
</attribute>

Or say you've written the I7 line:

A thing has a number called the weight.

You find that this generates I6 code like:

! [1: let n be the weight of the noun]
tmp_0 = GProperty(OBJECT_TY, noun, p15_weight);

And so you're looking for an XML stanza like:

<property>
    <identifier>p15_weight</identifier>
    <value>268</value>
</property>

At this point you start to wonder if the general information API wouldn't be better after all. Maybe it is. Why didn't I go that way? (I realize this is more of a peek into Zarfbrain than you probably care about.) I find that this stuff is the easy part. Drawing a map was hard. Extracting recipes from game output and importing them into an iOS app was work, if not really hard. Extracting state from VM memory was a solved problem; I just had to do it for a lot of objects.

Also, it's fast. I only inspect game state when flipping to the relevant tab, and the inspection code is C. If I'd rigged the game to output state to an API, it would have to be every turn, which would slow down normal gameplay. Or I guess I could have added a secret input event for tab-flipping, which would mean blocking the UI on game code, also slow... Anyhow.

Some other concerns:

  • In my iOS interpreter, the VM runs in a background thread. The UI runs in the main thread, as is usual for iOS apps. How did I synchronize the VM inspection? I didn't! Totally whiffed the thread-safety issue. It's generally not a problem; the player will flip tabs while the VM is blocked awaiting input. But if you have some fancy timed-input code that moves the player around, and the player flips tabs at just the moment when the timer fires, you could get a bum value out of real_location.

  • What about Z-code games? You can take the same approach, but you need different state-inspection code, because the Z-machine's memory layout is different. (For a start, it's all 16-bit words, not 32-bit.) I did some of this for the iOS releases of Dreamhold, Shade, and Heliopause. But I didn't wrap up the C code into nice functions like these. So -- exercise for the reader, sorry.

  • Can you do this in Quixe? (A Javascript interpreter instead of a C interpreter.) Yes, and the plan is just about identical. Quixe maintains a private memmap array, which is a Javascript array of byte values, so you just have to translate the code below into Javascript and you'll get the same results. The only trick is that memmap is in a private scope. You could add the functions below to the Quixe global object, or rely on ReadWord/ReadByte, or just add a one-liner to export memmap:

    get_memmap: function() { return memmap; },
    

Finally, we have the question of input. When the player taps a room on the HL map, the game must accept it as input.

Again, there are a few ways to handle this. I decided to use a custom Glk event. The Glk spec says that negative event ids (0x80000000 to 0xFFFFFFFF) are reserved for implementation-specific events, and that's what this is. The iOSGlk library has a forceCustomEvent method. The map UI invokes this, passing a negative constant as the event type and the room object address as an extra argument. Conveniently we've already extracted the addresses of all the rooms from gameinfo.dbg.

(Other Glk libraries might not have this sort of API, but it will be easy to add. All events funnel into the Glk library in the same way.)

The only remaining chore is for the game to react to this custom event. Unfortunately, Inform's core parser loop is built to accept only text. This will have to be improved someday! (Not just for custom map hacks, but for hyperlink input, mouse input, and so on.)

But, again, I took the cheap way out. I used the HandleGlkEvent hook to translate the custom event into the input line "MAP-VERB 273861", where the number is the decimal room address.

This is not ideal because a player could type that line by hand! Well, whatever. Players can do what they want. Mind you, I sanity-check the argument very carefully to make sure an invalid address can't crash the game or leave the player stuck in a teakettle.

The relevant I7 code (and I6 inclusions) appear at the end of this post. I just noticed, though: it won't compile with the current Inform 6 compiler (6.33)! This is because I rely on the constants #lowest_object_number, #highest_object_number, #highest_class_number. These were missing from the Glulx compiler until, well, until I was writing this map code and needed them. You can build the latest I6 compiler from source and shove that into your I7 distribution. Then this'll work.

So the conclusion is, this is all a big pain in the butt, isn't it. Yep.

(No comments out of you, Dave. It really was the least-effort solution for my particular problem.)


C code for examining Glulx VM state:

#include "glulxe.h"

/* The glulxe.h header defines the glui32 type and the Mem4() macro.
    Also the memmap global variable (array of bytes). */
/* These functions do a little bit of safety-checking, but you really
    should be careful to only call them with valid object addresses. */
/* Feel free to add warnings or errors to the "error" cases. I like to
    throw exceptions, myself. */
/* All of this code assumes that NUM_ATTR_BYTES is 7, the default
    value for Glulx games. If you increase NUM_ATTR_BYTES, you'll
    have to adjust the object structure offsets. */

int gameparse_mem_active(void)
{
    return (memmap != NULL);
}

/* Fetch a global variable. */
glui32 gameparse_get_global(glui32 addr)
{
    if (!memmap)
        return 0; // error: called get_global with no memory map
    return Mem4(addr);
}

/* Get the object which contains a given object, or 0 if it
    is off-stage. (The I6 parent() function.) */
glui32 gameparse_obj_parent(glui32 obj)
{
    if (!memmap)
        return 0; // error: called obj_parent with no memory map
    if (memmap[obj] != 0x70)
        return 0; // error: called obj_parent on a non-object
    return Mem4(obj+5*4);
}

/* Get the first object contained by a given object, or 0 if it
    has no contents. (The I6 child() function.) */
glui32 gameparse_obj_child(glui32 obj)
{
    if (!memmap)
        return 0; // error: called obj_child with no memory map
    if (memmap[obj] != 0x70)
        return 0; // error: called obj_child on a non-object
    return Mem4(obj+7*4);
}

/* Get the next object contained after a given object, or 0 if there
    are no more. (The I6 sibling() function.) */
glui32 gameparse_obj_sibling(glui32 obj)
{
    if (!memmap)
        return 0; // error: called obj_sibling with no memory map
    if (memmap[obj] != 0x70)
        return 0; // error: called obj_sibling on a non-object
    return Mem4(obj+6*4);
}

/* Look up an attribute flag on an object. */
int gameparse_obj_attribute(glui32 obj, int attr)
{
    if (!memmap)
        return 0; // error: called obj_attribute with no memory map
    if (memmap[obj] != 0x70)
        return 0; // error: called obj_attribute on a non-object

    unsigned char byte = memmap[obj+1+(attr>>3)];
    if (byte & (1 << (attr & 7)))
        return 1;
    else
        return 0;
}

/* Look up a property value on an object. */
/* Returns the first word of the property, if multi-word. (In most I7 games,
    the only multi-word property is "name". So you can't use this function
    to scan through the name list of an object.)
    If the property is not provided for this object, returns 0. */
glui32 gameparse_obj_property(glui32 obj, int prop)
{
    if (!memmap)
        return 0; // error: called obj_property with no memory map
    if (memmap[obj] != 0x70)
        return 0; // error: called obj_property on a non-object

    glui32 proptab = Mem4(obj+16);
    glui32 propcount = Mem4(proptab+0);
    for (int ix=0; ix<propcount; ix++) {
        glui32 propent = proptab+4+ix*10;
        int pid = Mem2(propent+0);
        if (pid == prop) {
            glui32 paddr = Mem4(propent+4);
            return Mem4(paddr);
        }
    }

    /* Property not provided. */
    return 0;
}

Inform 7 code for accepting custom input events. (This assumes a "select one room on a map" action, but it can be adapted to other uses.)

Include (-
[ HandleGlkEvent ev ischar args   val;
    if (ischar == 0 && ev-->0 == CUSTOM_EVENT_ID) {
        val = ev-->2;  ! the object address of the tapped room
        glk_cancel_line_event(gg_mainwin, gg_event);
        ! Write a synthetic "MAP-VERB ###" command into the buffer.
        VM_PrintToBuffer(buffer, INPUT_BUFFER_LEN-WORDSIZE, PrintVisitNum, val);
        return 2;
    }
    return 0;
];
[ PrintVisitNum val;
    print "MAP-VERB ", val;
];
-) before "Stubs" in "Glulx.i6t".

To decide what object is paranoid-object-check (N - number): (- ParanoidObjCheck({N}) -).
Include (-
! Return val if val is a valid object, otherwise 0.
! This code requires the bleeding-edge (6.34) Inform 6 compiler.
[ ParanoidObjCheck val;
    if (val < Class + ((#lowest_object_number + #highest_class_number) * GOBJ_TOTAL_LENGTH))
        return 0;
    if (val > Class + ((#highest_object_number) * GOBJ_TOTAL_LENGTH))
        return 0;
    if ((val - Class) % GOBJ_TOTAL_LENGTH ~= 0)
        return 0;
    if (val->0 ~= $70)
        return 0;
    return val;
];
-).

Numeric-visiting is an action applying to one number.
Understand "map-verb [number]" as numeric-visiting.

Carry out numeric-visiting:
    let N be the number understood;
    let O be paranoid-object-check N;
    if O is nothing:
        instead say "That address ([N]) is not an object!";
    if O is not a room:
        instead say "That address ([N]) is not a room!";
    [Check locked doors and so on here...]
    now the player is in O;
    say "You move to [O]."
Tagged , , , , , | Leave a comment

Hadean Lands greenlit! It turns out

A few days ago my idle twitter-browsing was upended:

Huh. I just checked the Greenlight page for @zarfeblong's Hadean Lands... I somehow missed the news that Valve had started the GL process (@andetkaihetera)

Really? I, um, missed the news too. But a quick glance at the HL Greenlight page showed:

This game has been Greenlit by the Community!

The community has shown their interest in this game. Valve has reached out to this developer to start moving things toward release on Steam.

I was off at Balticon, so I couldn't dig into the matter right then. (Which is why everybody else announced the news before me.) But now I'm back and more or less caught up on life. So here's what I know.

If Valve reached out to me, I missed it. The Greenlight page says "Updated: May 12 @ 7:24pm", and the voting stats stop on May 11. So I guess the game was officially greenlit two weeks ago and nobody noticed until this weekend? O the embarrassment.

The site now offers me a link to "become a Steamworks partner". So I have begun that process. I have filled out a great many forms' worth of tax and banking info, the usual excitement. (And the usual confusion about whether I should use Zarfhome LLC's EIN or my personal SSN, a question which I will never, ever get right on the first try.)

Bureaucracy aside, what does this mean for Hadean Lands? I wish I could just push a button and launch the thing onto Steam. But no -- not that simple.

The Mac/PC/Linux download packages that I built last year are playable. But they're not nice. Gargoyle doesn't even have a font preference menu. (You can bejigger a text config file, of all the archaic monstrosities.)

Worse problem: Gargoyle doesn't handle high-res displays. It renders text at the old-school resolution, which means it looks fuzzy and awful. "Retina" displays are standard on high-end Macs and are moving steadily down the product line, and now we're seeing them on Windows machines too. So this is serious.

I would like to switch to other interpreters, at least on Mac and Windows. However, the options are currently Mac Zoom (crashy) and WinGlulx (backscroll is hidden behind an obscure keystroke). Um. I'm very much afraid that I'll have to spend a couple of months fixing up other people's interpreters before I can build Steam-acceptable games.

Now, in some ways this is great. I like contributing fixes to open-source projects! Particularly for IF interpreters! But it's a lot of work, and no cash up front. What's up front is learning curve -- I haven't built either Windows or MacOS apps, not since the 1990s.

I'd probably want some game-specific interpreter features, too. There's the dynamic map -- or, if I can't swing that, I should at least display the static map in a separate window when asked. Same for the IF postcard.

On top of that, I need to browse through Steam's SDK and figure out how it works. I have to think about achievements (probably not) and trading cards (I don't even know). I have to look into whether Steam's libraries can legally be wedged in with IF interpreters, which tend to be GPL.

Plus: this would be a terrific opportunity for that HL bug fix release, right? An impressive bug list has piled up since October. I've barely touched it. Surely it's worth putting my best foot forward for the Steam release.

Whew. All of this will happen, but it will happen in parallel with other work. For example, look at this exciting teaser page that I put up last week...

What is this? I'm not saying! Except to note that it is neither parser-based nor traditionally choice-based (hyperlink or menu style). Fun, eh?

And now, the traditional "green it forward" section:

Cyberganked, Robb Sherwin's retro text RPG, has just gone up on Greenlight. Character classes! Live photos! CGA palettes! Live photos in CGA palettes! Surely a winner.

Porpentine, Twine author and winner of multiple IF awards, is Greenlighting Eczema Angel Orifice, a collection of over 20 of her works. You can't talk about the past few years of choice-based IF without talking about Porpentine.

And some IF works which have been on Greenlight for a while, and are still working their way towards the goal line:

Jack Toresal and The Secret Letter (Mike Gentry and David Cornelson)

The Shadow in the Cathedral (Ian Finley and Jon Ingold)

Posted in Zarfplan | Tagged , , , , , , , | 7 Comments

Javascript wonkery

Here I will take a break from the ever-burbling stream of IF and Myst news, and talk about Javascript optimization.

You could say it's relevant because it came up in a Quixe bug report. ("I tried loading Emily Short's Counterfeit Monkey.... Load time dropped from 29.4 seconds to 10.4 seconds...") IF interpreter improvements are a high priority for me -- particularly if they could be big speed improvements for a fairly small code change. Double-particularly if they imply I've had crappy Javascript code out there for years.

Whoops.

I usually build my Javascript libraries according to the private namespace pattern. I can't remember where I learned this. I assume it originated in this blog post (Douglas Crockford), but I use the cleaner layout described here (Ben Cherry) or here (Todd Motto).

With this trick, all your internal functions and variables wind up hidden from the outside world. You decide which ones to export, and the rest remain private.

Here's a toy example:

Lib = function() {
    var counter = 0;
    var prefix = "The current value is ";

    function add(val) {
        counter += val;
        return counter;
    };

    function get() {
        return prefix + add(0);
    };

    return {
        add: add,
        get: get
    };
}();

Here counter and prefix are private variables. The add() function increases counter and returns it. The get() function returns it as part of a string. (I've set get() up to call add(0) just to demonstrate that private functions can call each other.) Finally, we return an object which exports the add and get symbols. This becomes the global Lib object, so a user can call Lib.add() and Lib.get(). But there is no Lib.counter; that's private.

Crockford says "This pattern of public, private, and privileged members is possible because JavaScript has closures... This is an extremely powerful property of the language." Okay, that's top-grade hand-waving. What he means is "Javascript is a terrible language, but it has stolen enough features from other languages that you can pull this crap off if you're incredibly careful and don't mind confusing onlookers."

Anyhow. The trick works pretty well until you start constructing Javascript functions on the fly. Let's extend our example:

Lib = function() {
    var counter = 0;
    var prefix = "The current value is ";

    var compiledfuncs = {};

    function add(val) {
        var func = compiledfuncs[val];
        if (func === undefined) {
            var text = "counter += " + val + ";";
            text += "return counter;";
            func = eval("(function func() { " + text + " })");
            compiledfuncs[val] = func;
        }
        return func();
    };

    function get() {
        return prefix + add(0);
    };

    return {
        add: add,
        get: get
    };
}();

What the heck is going on in add()? Imagine that this is an IF virtual machine interpreter, like Quixe. We're doing just-in-time (JIT) compilation. We take a Glulx function -- that is, a string of Glulx opcodes -- and convert it into a Javascript function. The browser's Javascript engine will then convert that function into native machine code and the result will run really fast.

Since this is a toy example, our only opcode is "increase counter by N". When we see a call to add(1), for example, we convert that into this Javascript function:

function func() {
    counter += 1;
    return counter;
}

We eval that source (compile it) and stash the function (in case another add(1) comes along). Then we execute it.

So that's great, and it works. But if you profile this in Chrome, for example, you'll see a couple of little yellow warning flags:

  • Not optimized: Function calls eval
  • Not optimized: Reference to a variable which requires dynamic lookup

You see, Javascript is a terrible language, and its scoping model is a haystack of ideas jammed together without any planning, and it can never be fixed because backwards compatibility. Certain operations in closures are legal, but slow.

(To be fair, every language's scoping model sucks. You know how the only hard problems are naming and cache invalidation? This is naming. But Javascript is worse than most.)

We could get rid of the eval() if we used a Function() constructor:

func = new Function(text);

But then the code would fail, because the function would exist outside the library closure. It wouldn't have access to the private variable counter.

I fussed around with a couple of different solutions. I tried inner and outer closures, I tried using this a couple different ways. None of them worked. (Crockford progresses from hand-waving to passive-aggressive sniping: "...an error in the ECMAScript Language Specification which causes this to be set incorrectly for inner functions." You tell 'em.)

I eventually settled on this:

Lib = function() {
    var self = {};
    self.counter = 0;

    var prefix = "The current value is ";

    var compiledfuncs = {};

    function add(val) {
        var func = compiledfuncs[val];
        if (func === undefined) {
            var text = "var self = this;";
            text += "self.counter += " + val + ";";
            text += "return self.counter;";
            func = new Function(text);
            func = func.bind(self);
            compiledfuncs[val] = func;
        }
        return func();
    };

    function get() {
        return prefix + add(0);
    };

    return {
        add: add,
        get: get
    };
}();

Our compiled function can't get access to the private namespace. We need a second namespace which can be handed in for that purpose. We'll call that self. We create self up top, and put the counter in it. We'll have to write self.counter to access it now.

To hand self in to our generated function, we call bind. This is a confusing Javascript feature which lets us glue any object in as the function's this. Then we compile it this way:

function func() {
    var self = this;
    self.counter += 1;
    return self.counter;
}

This is more verbose, but it works. And if we check it in Chrome's profiler, the yellow warning flags are gone.

Note that if we wanted the generated function to call private methods, we'd have to copy them into the self object too:

function get() {
    return prefix + add(0);
};
self.get = get;

Not too messy.

Now the real question is, does this actually make Quixe run faster? I don't know! I've started converting the code to this new model, but it's going to take more work. (The virtual machine has lots of state to shove into the self object.) The person who filed the original report got good results, but I'm not sure I've snagged the right tricks yet.

The toy example in this post seems to run a little slower with these changes. That's not encouraging, but of course it's not a realistic work model. Hopefully I'll have real results in a few days.


UPDATE, May 29th:

Got an updated Quixe branch working.

Turns out the func.bind(self) plan is terrible. Performance doesn't improve as much as it should; on Firefox it actually gets worse.

Instead, I've given each generated function an explicit self argument, and called them all as func(self). With this plan, Quixe is 65% faster in Safari, 55% faster in Chrome, 10% faster in Firefox. Woot!

Tagged , , , , , | 11 Comments

Hadean Lands on the Humble Store

I am happy to announce that Hadean Lands can now be purchased directly from the Humble Store. (It's currently listed under New Releases, though of course it will scroll off that page pretty soon.)

This is the same version that's been available all along. (No, I have not done a bug-fix release. I know, it's getting to be time...)

The Humble Store is fixed-price, not pay-what-you-want. The win is that 10% of proceeds go to charity.

You can still buy HL through the pay-what-you-want widgets on my web site. It's still in the Adventure Gamers Store. And of course the iOS version is still available from Apple.

(Have you voted for Hadean Lands on Steam Greenlight?)

Posted in Zarfplan | Tagged , , , , , , , | Leave a comment

XYZZY Awards

The XYZZY Awards for best interactive fiction of 2014 have just been announced. I'm happy to say that Hadean Lands won in four categories: Best Puzzles, Best Setting, Best Implementation, and Best Use of Innovation.

The overall Best IF Game of 2014 went to 80 Days, which absolutely deserved it. It was a tightly-contested award -- Hadean Lands was in the running, along with Kevin Gold's Choice of Robots, Porpentine's standout Twine work With Those We Love Alive, and IFComp winner Hunger Daemon by Sean M. Shore.

Winners in other categories included Lynnea Glasser's Creatures Such As We, Ade McT's Fifteen Minutes, michael lutz's the uncle who works for nintendo, and a symbolically satisfying tie between Twine and Inform 7 for Best Technological Development.

Here's the full list of winners and finalists. Congrats to everybody!

Since this is my brag post, I'll also note that I'm working on a new IF game! This will not be parser-based. I've got ideas about cool things to do with a touchscreen other than typing a lot.

No other hints right now. Stay tuned for more information.

Posted in Zarfplan | Tagged , , , , , , | Leave a comment

Various world models in IF

Another question from the tweetzone: "What are the significant differences for object/rooms + hypertext/choice vs parser + web?"

Here's (more of) that strand(s) of conversation:

I want tools to create a hypertext based game that still has a room and object model for the engine. Any suggestions? (@KalevTait)

I've done it (in Glulx) but the game design space is poorly understood. (As compared to parser+object model.) (@zarfeblong)

this just means it needs more research (@emshort)

What are the significant differences for object/rooms + hypertext/choice vs parser + web? Maybe I’ve misunderstood. (@jurieongames)

Emily's further responses:

parser + web = you still type. world model + choice = you're selecting what to do from options based on model (@emshort)

Oh, and I guess choice-based games tend to come from a CYOA, paragraph-based design approach? (@jurieongames)

often. even if they don't, enumerating all the options that would exist with a parser gives you a too-long list (@emshort)

so you need then to build a hierarchical interface or else have a smaller tighter verb set, for instance (@emshort)

I agree with Emily here (as usual), but I want to back up and talk about ways I've approach IF design.

Parser IF is a well-explored field, which started with Adventure and expanded through generations of... Adventure imitators. That's not a criticism, that's history. The MIT gang tried to make another game like Adventure; so did Scott Adams, albeit with more limited resources; so did other groups. Then in the 90s, many hobbyists tried to make more games like the Infocom set (etc), and built tools to accomplish that. What rooms are, what objects are, what the world model is, what interactions mean -- all go back to Adventure in a very direct line. I'll assert that 75% of the game mechanics in today's parser IF can be found in Adventure... in rudimentary form, sure, but present. And 75% of the rest can be found in Zork.

That's the form I grew up playing, and then writing. Not the only form, but the closest to my heart. But -- when I build a different kind of game, I'm not trying to approximate parser IF in a different-shaped bottle.


Like I said up top, I've created a hypertext game with a room and object model. That's Bigger Than You Think, a game that I wrote for the 2012 Yuletide fanfic exchange. This has a hybrid UI: you can click on links or type (single) words at a command prompt. It has rooms and an inventory.

(I'm going to assume that you've played BTYT, at least a little bit. If you haven't, hit the link and flip through a few moves.)

BTYT is not a parser game turned hyperlinky. I didn't design it that way and the underlying assumptions don't match the Adventure model. It's much more like a CYOA game-book with added inventory features.

Let's look at rooms. BTYT seems to offer a classic Adventure-style layout: each "page" is a location, and you have a choice of exits, each of which leads to a new location.

You'll quickly notice, however, that there's never a choice to "go back where you came from". Nor is there a sense of stopping to take action in a given location. A page is really an event, part of the story of an exploration into a cave. (The narration of the event includes entering and looking around.) You are always moving towards an endpoint; you cannot explore at will, except by using the "start over" option.

So the model is really The Cave of Time, the first of the "Choose Your Own Adventure" gamebook series. That book offered the notion that each page was a physical location in a cave -- but it didn't really stick to it, because pages in a book just don't represent Adventure rooms very well. Pages want to be sequenced events. (Later books in the series entirely discarded the idea of representing a physical maze. Our common notion of "CYOA game" is all about branching events, not branching tunnels.)

What about inventory? If you poke down certain branches of BTYT, you can find some objects to take -- a crowbar, a rope; "medium-sized dry goods" in the Adventure vein. But again, these are not manipulable objects in an Adventure-style world model. You can't put them down or try different actions with each one. Instead, they become an extra set of CYOA-style options -- available to try in each scene, until you find the right situation for each one.

(Note that the game header lists the current movement choices on the left, and the current inventory choices on the right.)

Paper gamebooks can't easily offer an inventory in this way. It's the experimental facet of BTYT. But it's not an Adventure-style inventory. I designed it to fit in with the CYOA model; it's what a gamebook choice-list would look like if it could be dynamic.


Seltani takes yet a third approach. Seltani is a hypertext environment inspired by Myst Online. The Myst games tend towards richly detailed environments but a sparse inventory system. You are expected to spend your time exploring the world, and then manipulating pieces of it "in place". You don't typically apply arbitrary tools to arbitrary targets.

Therefore, I wanted to create a choice-based system in which nodes are typically locations. You'll stop in a location to examine many of its parts, and perhaps pull some levers or turn some knobs. This required a multi-window UI: an environment window which describes what's around you, a detail window which describes the particular item you're paying attention to, and a history window in which events (and environmental changes) scroll by.

Note that this is different from the Adventure UI, where everything happens in a "history window". In parser IF, looking and examining are actions -- the response is a description at that moment. If you LOOK twice in a row, the world may have changed. Seltani's descriptive windows, in contrast, are always current.

(Some parser IF has tried permanent LOOK or INVENTORY panes. The Scott Adams games of the early 80s worked this way, for example; Beyond Zork also offered such a mode. However, these experiments have not caught on in the parser-IF community.)

Seltani has something like a world model, although it's very flat. It's got worlds, locations within a world, and that's about it. The built-in infrastructure is mostly about the portals between worlds rather than world contents.

Significantly, Seltani doesn't have objects or an inventory system. Why not? Well, say it did. What would you do with objects? "Actions" in this UI are hyperlinks which either examine or manipulate the world. If you carried a sword from the Living Room to the Kitchen, and a "sword" hyperlink were (somewhere) available, you could reasonably expect to examine the sword. But that's all! There's no way to express dropping the sword or smashing a window with it.

I avoided this problem in BTYT by discarding the idea of "examine". In that game, a "sword" hyperlink always means "take the sword" (when you first discover it) or "use the sword on something here" (if you're carrying it). I restricted the design to have at most one whackable target per location -- and you never drop anything except in its final use-location. Furthermore, BTYT is made of simple objects which do not require close inspection. So a single-link inventory works okay. But Myst games are full of detail; the BTYT model would never have worked for Seltani.

This is not to say the Seltani model can't be extended that way. The engine supports an extra "world pane" which remains visible throughout a world. The world designer could put an inventory list there. (Or, equivalently, tag an inventory list onto every location description in the world.) You'd have to decide what it meant to click on an inventory link in each location -- essentially inventing your own world model.

What you can't do is carry "objects" from one world to another. Seltani assumes that worlds are independent. It's hard enough rigging up one Age without figuring out how to respond to artifacts from every other Age!

(No, worlds aren't necessarily independent. You can build two Ages which are interconnected and share data. But that gets beyond this scope of this post.)

I should also note that the Seltani model can be extended in the other direction, too. You can build CYOA-style (or Twine-style) worlds, where nodes are treated as events rather than locations. To do this, you have to avoid relying on the event window. You also have to also lock out Seltani's multiplayer features, since a group of chatting players are implicitly presenting events in a location.


I've talked about two of my choice-based game designs, and how I try to craft each one so that the game and the UI match up.

One sometimes sees attempts at "hybrid" UIs -- trying to present a text game with both command-line and menu-based interfaces. You won't be surprised to hear that I have no patience for such experiments. I'd ask myself: does the game's experience depend on the parser interface? If it does, it's required! And if not, get rid of it! -- it's a waste of your time and the player's.

(But what about BTYT? I'll tell you straight up: the command-line interface on that game adds nothing. I should have gotten rid of it. I left it in to support MUD play via ClubFloyd, which is a very minor use case -- it should not have influenced me.) (Anyhow, the right approach would be to update Floyd to support hyperlink input. The RemGlk library makes this possible.)

The same goes for attempts to "port" parser games to a choice-based UI. I have nothing against remakes of a game. (Coloratura, for one example, is a parser game that was remade by the author in Twine.) But this is a design process, akin to translating a book into a movie or vice versa. You can't slap a new UI system onto a game and expect it to be "the same game but now accessible to more people".


I intended to wrap this post up by responding to Jon Ingold's post: Parser as Prototype: why choice-based games are more interesting.

My reaction is "how fundamentally wrong-headed". But if I try to support that, I will need so many qualifiers that I'll fly into the weeds and sink. I mean:

  • The post is from a year and a half ago, which is decades in Internet Time
  • Jon recently commented "Def not talking about approximating a parser game. Rather, parser was a step one to being able to design choice games this way" (@joningold)
  • Jon's design process is his process and I'm not going to step on it
  • The post is about the Sorcery! game series, and I haven't even played those
  • I don't assert that parser IF is some golden standard which other models need to approximate (much less measure up to)

So there's no fundamental disagreement -- rather, I think the post is weirdly framed to make an apology which doesn't need to be made.

I have played a lot of 80 Days. I can confidently say that it's not an approximation of a parser game. 80 Days is its own kind of IF, and its interface fits it very well. It doesn't have a "world model" in the sense of a space to manipulate objects. Its world model is, you know, a model of the world -- big and round and covered with cities -- and your inventory is meaningful in the space of planning your trip.

Note the word "planning". Much of the gameplay of 80 Days involves collecting, buying, or selling objects. But they are not used in the way that, say, Hadean Lands uses objects -- as mysteries whose places in the world come as crucial discoveries. Rather, their value is cumulative and largely predictable. When you buy a didjeridoo, you know where it's most profitable to sell it. If you miss that stop, well, you can probably sell it elsewhere -- and there are other ways to get cash anyhow. Other objects act as bonuses in the mini-game of learning new routes; but again, there are lots of ways to learn routes, and your piece of shortbread is never going to spell the difference between success and failure.


While I was finishing this post, the XYZZY Award finalists were announced. As it happens, Hadean Lands and 80 Days were each nominated for five awards.

It would be meretricious to explain that this will be settled by battle royale of alchemical Kaiju versus Victorian steam-mecha, as piloted by myself and Meg Jayanth. Mostly because With Those We Love Alive was nominated for eight awards, so you have to amend the battle with Porpentine and Brenda Neotenomie drawing mystical runes all over both of us, which makes it all confusing and hard to film.

I will instead wish good fortune to all the nominees, including the above-mentioned and also Kevin Gold, Sean M. Shore, A.D. Jansen, michael lutz, kaleidofish, Sam Ashwell, Steph Cherrywell, Emily Short, Lynnea Glasser, C.E.J. Pacian, Jason Dyer, Ade McT, Carolyn VanEseltine, Simon Christiansen, Mæja Stefánsson, Graham Nelson, Juhana Leinonen, Jim Munroe, Chris Klimas, Nicky Case, Kateri -- whew! I hope I didn't screw that list up.

Tagged , , , , , , , , , , , | 3 Comments

Designing alchemy in a puzzle game

A question about Hadean Lands from the tweet gallery: "Have you written anything about how you approached designing the alchemical system?"

Excellent question! The answer is "No, but I should, shouldn't I," yes okay. (Thanks @logodaedalus.)

My twitter-sized reply was "Sound cool while supporting the puzzles," but I can say more than that.

(Note: I will start this post by talking about HL in generalities. Later on I'll get into more spoilery detail about the game structure. It won't come down to specific puzzle solutions, but I'll put in a spoiler warning anyway.)

The keynote for HL's system was the alchemy puzzle in The Dreamhold. The Dreamhold lab had just two ingredients and three actions to take, but it felt like a dense explorable territory.

Dreamhold's principle was that any action you try on a given substance will produce a new and interesting result. And then you can try new actions on that! Obviously this exponential expansion has to be tied off pretty soon. Many of the combinations converge to common outcomes. The tree is only a few steps deep, really. (I think there are twelve possible substances to find.) But it's enough to give a sense of experimentation and discovery.

For HL, I wanted that sense, but bigger. Did I succeed? Heck no! It was an impossible goal. HL has forty-odd starting ingredients and thirty-odd magic words (not to mention other ritual actions, and the environmental influences, and...). Just providing the first step of a dense exploration tree would be... well, somebody might do it, but I wasn't going to.

So I developed HL with a less ambitious principle: you get recipes. When following a recipe, you should always be able to tell a right action from a wrong one. That is, a particular magic word will produce a unique response if you use it at the right time -- different from the response you get if you use it at the wrong time. The differences may be slight, but they're perceptible.

I didn't want to entirely crush the spirit of experimentation. So the second principle was: recipes aren't everything. The opening puzzle demonstrates this, and various later puzzles require you to substitute or invert ritual elements. I set up parallel structures and oppositional structures to make that make sense.

I think everyone agrees that I didn't hit the perfect balance. The game starts you with an off-recipe puzzle, but there's too long an interval before the next one. In between are lots of recipes that you have to follow perfectly; you lose track of the initial lesson. But most players were able to get onto the right track (or jump off the wrong one, if you like).

A followup question was "Did you have alchemical dynamics in mind when making the puzzles?" The answer is... mixed.

(Spoiler warning for the overall game structure, starting here!)

The core arc of HL is the limited supply of four key elements. You need all four for the endgame, and there are intermediate goals which require two or three. So initially you can only accomplish one intermediate goal at a time; then you have to reset.

That was my initial puzzle framework. I wrote that down, and then started complicating it. What ritual needs elements X and Y? Is it the ritual itself which needs those elements, or do I invent a sub-ritual which consumes X and provides a related X2? And so on.

At this point, I was inventing puzzles and alchemical mechanics in parallel. Or rather, I was going back and forth -- every decision on one side firmed up the possibilities on the other side. I needed puzzles whose solutions would seem reasonable; I needed mechanics which would feel like parts of a plausible magical science.

You'll note that I didn't start by creating a complete magical system and then deriving puzzles from it. Nor did I invent a bunch of puzzles and then invent alchemy that could solve them. Neither approach has ever worked for me. So if you're hoping for a complete, consistent model of HL alchemy -- I'm sorry. No such thing exists.

I knew that it couldn't exist, of course. That's one reason that the alchemy is described as being eclectic and syncretic. It fits nicely with the social background, too. The real-life British Empire did steal artifacts from all over the world. I evolved the idea that a magical British Empire would lift occult knowledge from every place they conquered, and jam it all together without regard for consistency or context!

(We assume this made them better at conquering. The game doesn't touch on much history, but references to the "East Empire" imply that they've got a firm grasp on Central Europe, and no doubt the New World as well. If I were a better writer, I'd have built a story about the Navy running into aliens and trying to treat them colonially... oh, well, room for a sequel.)

(There will be no sequel. That was a joke.)

The point is, I could make up whatever alchemical rules I wanted. I tried for a balance -- consistency in some places, chaos in others. I could draw on mythical, mathematical, or religious sources without having to be accurate about any of it. Convenient!

Back to the puzzle construction. As I said, there were a few key resources whose scarcity determined the game arc. Then I invented more resources -- both ingredients and formulae -- which either resulted from or combined with the key ones.

This could itself have created an ever-expanding tree of dependencies. But I constrained it, or at least bent it back on itself, with a third principle: everything in the game should be used at least twice. Ideally, in slightly different ways.

A naive adventure game uses each item exactly once. Indeed, many graphical adventures remove things from your inventory once you've used them successfully. This cuts against your sense of immersion -- not because of the anti-realism, but because you wind up watching the game mechanics rather than the game. An object disappearing (or being checked off) is a better signal of progress than the response of the game world. Text adventures don't have this disappearance convention; nonethless, the player learns to keep track of what's been used and ignore it thereafter.

I would rather teach the player that there's always more to learn. You may think you understand an item, but you still have to keep it in mind for future use. You have to keep everything in the game in mind at all times. This is the underlying challenge.

So I went over and over the list of rituals, looking for singletons. Magic word used only once? Work it into a new ritual. Alchemical potion only solves one puzzle? Invent a new place to use it. This added a richness to the mechanics. Two uses of a reagent imply there must be more; you have the sense that there must be underlying laws to explain it all. This is, as I said, an illusion; but it's a well-supported illusion.

Of course, it added up to a gob-smacking number of puzzles. Fortunately (or perhaps not), I was blessed with a very large list of formulae, resources, and recipes to scatter around the Retort. I could "use up" these extra puzzles as obstacles to various resources. (Thus all the locked cabinets.)

Also, since these puzzles weren't involved in the key resource plotline, it was okay if they had multiple solutions. (Some of the cabinets can be opened two or three ways.)

The final principle of Hadean Lands: involve all the senses. Let me go back to a line that I quoted in 2010, explaining the HL Kickstarter:

"If a witch could teleport (a thing that seems impossible, but I could be wrong), it would involve hours of preparation, rituals, chanting, and filling all the senses with the desired result until the spell would work in a blinding explosion of emotional fulfillment." (Steven Brust, Taltos)

Magic should be a transcendent experience. I tried to describe the effects of your rituals in colors, textures, sounds, scents... even the words that you speak are given synesthetic weight. Not to mention the ineffable air of things going wrong or right (so useful for cueing mistakes).

Of course, an adventure game involves lots of repetition, and nothing wears out faster than a repeated sense of transcendence. (Except maybe humor.) I dodged this problem with HL's PERFORM mechanic. When you PERFORM a known ritual, it doesn't repeat all of the descriptive text; I kept the output bare and mechanical. You're not reading it anyway! You just want to know whether the ritual succeeded. This preserves your sense of involvement with new rituals.

(Admittedly this falls apart when you're failing at a new ritual. That's a somewhat repetitive experience -- inevitably, I think.)

So there are my principles of magic design. I don't suppose I sound like a Hermetic occultist. I hope I do sound like a writer or designer describing his craft, because that's what this is. A lot of fussy details and a clear plan, is all.

Like the man said: writing is the art of causing change in a consenting reader, in accordance with the writer's will. You gotta be pragmatic about that stuff or you'll get nowhere.

Posted in Zarf on Games, Zarfplan | Tagged , , , , , , , , , , | Leave a comment

Why it takes longer than you think

In case you're wondering, nobody hassled me about how long the rewards took. Apparently you folks really were in it for the game -- or to support me, which is even nicer.

However, I bet there are people out there who are working on Kickstarters. And they should be warned: it always takes longer than you think. To substantiate this, here's a timeline of Hadean Lands work that came after the game shipped.

Note that I did lot of reward design in December, but didn't order the stuff until early January. That's because I knew I would be out of town for the last week of December. I didn't want expensive parcels arriving when I was gone.

  • Oct 30: Hadean Lands goes live for sale. (I won't describe the whole monkey dance of sending out iOS gift codes. Too painful to recall.)
  • Oct 31 to Nov 3: Catching up on backers who had problems getting the game, or who sent in late Kickstarter surveys. Also general PR work -- answering emails, posting on every social network I know.
  • Nov 5: Submit iOS app version 1.1. (Better iPhone 6 support.)
  • Nov 7 to 10: Toronto trip for WordPlay. (File under "marketing".)
  • Nov 10: Release iOS app version 1.1.
  • Nov 13 to 17: New York trip for Practice. (File under "networking".)
  • Nov 30: Finalize book design; order proofs.
  • Dec 2: Finalize postcard design; order postcards.
  • Dec 6: Get first proofs of the book.
  • Dec 8: Finalize map poster design; order proofs.
  • Dec 12: Decide the books are too large. Reformat smaller, order more proofs.
  • Dec 19: Submit iOS app version 1.2. (Save-file import and export.)
  • Dec 25 to 31: Out of town. Not thinking about HL.
  • Jan 1: Release iOS app version 1.2. (I didn't want to release this while I was gone, either.)
  • Jan 2: Order books.
  • Jan 3: Order posters.
  • Jan 6: Look into CD pricing.
  • Jan 11: Finalize CD design; order CDs.
  • Jan 21: Positive Slate review! (And PocketTactics too.) Suddenly I am back in PR mode.
  • Jan 22: Argh, half of the posters are misprinted and not usable. Contact customer support and ask for replacements.
  • Jan 24: Post Steam Greenlight page for HL.
  • Feb 1: The Month of Postage begins. (Assume days and days of sticking labels on things.)
  • Feb 17: Haul books and posters to the post office.
  • Feb 27: Haul half the CDs to the post office.
  • Mar 3: Haul the rest of the CDs to the post office.
Posted in Zarfplan | Tagged , , , , , , | Leave a comment

The Adventure Gamers Store is open

The season of GDC-and-PAX is upon us, which means more gaming news than any one human can hope to digest. And yet, I will burden you with a couple more snippets.

The AdventureGamers.com site, which has been reviewing adventures in various forms since 1998, has opened a web storefront specifically for adventure games. Hadean Lands is in the launch lineup, as are several other indie highlights: Dominique Pamplemousse, Lumino City, stacks of Wadjet Eye and Daedalic titles, etc.

(AdventureGamers.com gave Hadean Lands a super-nice review back when I launched.)

Note the Adventure Gamers Store currently only offers Windows versions of these games. (They say they hope to add Mac/Linux in the future.) Also, everything is currently priced in Euros. (You can buy from the US or anywhere else, don't worry.) I've set the HL price at €4.39, which makes it a fractionally better deal than the $4.99 price I've got everywhere else. Snap it up before the winds of currency conversion shift!

And in other news about places that sell HL...

The Itch.IO site has just announced that they will start taking a share of game revenues. (For most of their history they have been a completely free service.) This change will happen on March 23rd.

Unlike most platforms, they are going to let the game author decide what cut Itch takes of their games. They suggest 10%, but the author can move that slider anywhere between 0% (author keeps all the loot) up to 100% (donating all revenue to support Itch).

This is a sweet idea, and very much in the spirit of the Itch service. I am happy to support it by offering them the same 30% taken by Apple, Steam, and (for that matter) the Adventure Game Store. You can buy HL via Itch here.

Tagged , , , , , , , | Leave a comment