Monday, March 13, 2006

IF: how Risorgimento Represso was born...

In answer to a comment on an earlier post about whether I used a transcript to create Risorgimento Represso... sorry to take so long to reply, but I hadn't read the comment until now.

No, with Risorg1, I jumped right into it.

In fact, when I started coding, I didn't even realize I was writing a game.

I started with a short story I'd written (or started to write), and thought I'd turn the first part into an IF game just to learn Inform. I also wanted to try out the Enchanter-style spell code from the Balances sample Inform game.

In that original version, you had to retrieve a fizmo spell scroll and unblock a sewer pipe in the basement using that, retrieve Ninario's glasses, and get him to send you home, and that was where it ended.

When that was finished, I realized I really didn't like having the spell scrolls in there--it seemed really derivative, and unoriginal. So I opted to create a different method for unblocking the pipe.

At that point, I looked at this little mini-game I had, and how relatively easy it was to create, and realized that I had the start of a real game. I sat down and thought a little bit about what elements I wanted in the game.

I wanted some multi-level puzzles, like the Babel fish puzzle in the Hitchhiker's Guide to the Galaxy game that Douglas Adams created in collaboration with Infocom. You can see the babel fish inspiration in Risorgimento Represso's "getting past the bear" and "getting into the farm" puzzles, where every solution you think of to an immediate problem results in a new, unforeseen problem--while at the same time being a necessary step towards the solution.

I wanted to leave the stereotypical doddering old wizard in there; making such a clich├ęd character interesting and fun was a challenge I wanted to meet.

I didn't know what to do with Ninario for the span of a whole game, and how to free up the player without leaving Ninario sitting dully in his study. Likewise, I didn't just want Ninario wandering around his own little area... so having him abducted was the perfect way to get him out of the way once his possibilities as an NPC were exhausted.

Ninario's unauthorized use of magic seemed a perfect explanation for his abduction. In the original short story, it was his reason for fleeing his fortress along with the main character, so it translated fairly easily into the game. And then the Wizards Guild's heavy-handed dealing with Ninario gave rise to the whole idea of the Guild suppressing scientific innovation; the renaissance repressed idea, which is, of course, the meaning of the title.

I wanted a bear, in deference to the original Colossal Cave (aka Adventure).

Once I knew I wanted a bear, I needed to have a place to put a bear... so why not a mountain trail? And the bear seemed an ideal place for a Babel fish puzzle.

Of course, if getting past the bear was going to be a significant, multi-level puzzle, there had to be something on the other side. A lonely, wind-blown mountaintop seemed the perfect place for a world-weary hermit. And once I had a hermit, what was more natural than having a bottle with a hermetic seal?

Finally, I knew I wanted to make a cheesy game. Once I decided that, I also knew that Renaldo, the evil head of the Wizards Guild, would have to be lactose-intolerant. It's not a huge part of the game, and there is, in fact, only one tiny part of the game where you can find that out, but it rounded out my vision of that character--and resulted in me deciding that the Cheese Shop in Vechlee would be another victim of the Wizards Guild, with a sign posted outside about it being shut down. Ostensibly, it was for use of modern production methods, but behind the scenes, I knew it was Renaldo's lactose-intolerance.

I came up with these required elements in conjunction with a map of the game world. Some of the things I wanted resulted in having to place certain things on the map. Other times, the drawing of the map drove the selection of the elements I wanted.

When this stage was complete, I had a map, and a pretty good idea of the required elements. A lot of the puzzles grew naturally out of the orientation of the map. I had Ninario's tower and caer, and it made perfect sense that any structure like that would have heavy-duty doors and a gate--especially if the inhabitant was living in fear of Wizards Guild reprisals.

The need for doors gave rise to the cannon, which led to the gunpowder puzzle. The need for a gate led to the hydrolytic counter-balancing machine, which is, I believe, the only puzzle in the game with three distinct solutions. Getting into the shed comes a close second with two quite different solutions.

I wanted the hydrolytic counter-balancing machine to be unusable once the puzzle was solved, to simplify it, so I had the text describe it as coming to a halt, and a hose popping off it. And then I thought, rather than having the hose just hang free from the machine, why not make it an object that popped off, and had a use later in the game? That led to the whole idea of getting into the upper floor of the Wizards Guild, the dumb waiter, the second bottle of Wizstrip, and enabled me to bring the background knowledge I had of Renaldo (his lactose-intolerance) in as a funny consequence of sending one of the many pieces of cheese up to the second floor in the dumb waiter.

So it was a sort of chicken-and-egg development, with each element feeding off the others, and growing into a much larger game than I had originally anticipated.

With Risorg2, starting with a transcript, I am, thus far, creating a much more structured environment. I'm not sure yet if that's helping or hindering me. It's certainly helping me to stay in one "mode" at a time. I'm either in programming mode or writing mode, and can be more focused on whatever I'm doing at time, but it may result in a more narrow game when all is said and done.

We'll have to wait and see...

IF: Risorgimento Represso release 4 (and source code)

I finally got around to uploading release 4 of Risorgimento Represso to the IF Archive. This version has a number of bugfixes, and is noteworthy for being the final, never-again-to-be-updated release. Oh, it adds a Glulx binary as well, more for the sake of completeness than anything else. The Glulx version does not add any fancy graphics or anything to the game, but was really done to check that my auto-opening and auto-unlocking door features from Risorg would work in Glulx.

I also released the game's source code, which can be found either at my website on MTS (click here) or at the IF Archive here. It's written in Inform, and thus requires the Inform 6.30 compiler and library in order to build successfully. It does include a Makefile though for easy building, so if you're at all interested in Inform or writing your own interactive fiction in general, check it out.

With Risorg1 now firmly out of the way, never to be worked on again, I have been focusing on Risorg2. I've almost completely exhausted the work I've done on the transcript. Let me explain; whenever I have a free moment, but don't necessarily feel like coding the game, I'm working on a high-level transcript of play, detailing room descriptions, play-by-play action and so on. That way, when I feel like coding, I can stay at the coding detail level, and just paste in big chunks of already-written text when it comes to actually spitting stuff out at the user. Not only do the room descriptions slot right in place, but I even have a model for the code--from my transcript, I know how the objects and NPCs should react to a lot of the user input, and can code them accordingly, from the ground up.

I'm also finding that as I write the transcript, I stay more in "player mode"--I anticipate, a lot more, the different things players might try when confronted with specific situations. This should make the beta-test process easier, as some of the more obvious things a beta-tester might try will already have sensible, (and entertaining) responses, rather than generic failure messages.

But anyway, to continue my original train of thought, I've been working on the code to such an extent that I've just about reached the limit of what I had already transcripted, so I guess it's either back to transcript for a little while, or else continue improving and rounding out the code I've already written, or just forge ahead with coding, creating the game experience as I go. I think I'll stick to keeping the transcript and coding tasks largely separate though. It seems to be working pretty well, and I think I'll end with a tighter game as a result.