Detectiveland postmortem

Well. Thanks so much to everybody who liked my game. Winning the comp was a surprise and a delight.

I made the engine, which I’m going to call Versificator 2[*] unless I think of something better, for “Draculaland” in the Ryan Veeder Exposition. The idea of the engine was to create a game that felt as much as possible like very old-school puzzle adventures – specifically the Scott Adams games – without the need for typing, so it could be played easily on tablets. There was some good feedback on the engine, so I decided to use it again for an IFComp game.

(This is not to say that I think IF should move back to very old-school puzzle adventures, but I do think there’s an unfilled niche for games that feel that way with more modern styling and mobile playability.)

I chose the hardboiled detective genre because it’s full of tropes to play with – I really wanted to make a game of fairly arbitrary puzzles, and a genre which nobody takes seriously and which comes with a large collection of recognisable stock characters and situations, is good for putting up a backdrop to that. The multiple, (mostly) separate cases let me structure the game like a trophy-case treasure hunt. I read some Raymond Chandler and Craig Rice to get the voice down.

The name ‘Lanson Rose’ came from the wine list of a cafe-bar in Leicester where I was sitting with my friend Jon Cross in 2001. Lanson Rose is a kind of sparkling wine, but we thought it sounded more like a hardboiled detective. We wrote a play about him together. It was terrible and, were it not for the luckiest near miss, might have actually been performed. But I’m glad Mr Rose eventually got out of my head in some form.

Initially I had a too-huge vision for Detectiveland – ten cases, side quests brought to you by urchin newsboys or gangsters stumbling out of a doorway with a fatal bulletwound, a model for driving around the city to give a “text GTA” feel. There would be a climactic, Grapes-of-Wrath-esque scene at Swampy Hollow, where the Clunketts try to protect their home from demolition, with the possible outcomes depending on what you said to Mary Jo Lou Belle at the end of the speakeasy case. A standoff with Senator Brinkman and his Cardicci-funded cronies in City Hall! A day-night cycle! – hence the useless wristwatch and a few consequence-free time-of-day-sensitive things, like when you can sleep – with different puzzle solutions available at different times.

But I am used to planning big and scaling down, and the decision to use modular cases was partly in preparation for that, because I could reduce the number of cases when reality started catching up with me. Just as well.

The style of the game developed as I hadn’t predicted, too. It kept the one-sentence room descriptions and EXAMINE-less-ness of the Adamsesque format, but things like dialogue and cutscenes got longer. The terseness of the basic world-model let me focus my creative writing on those things, rather than telling you what a typewriter looks like.

What I’m Proud Of

  • The engine. Some people have said I should release it for others to use, and I will.
  • The styling. What I really like about writing IF is that it uses different skills – in making a custom interface I was able to bring in design and music too.
  • Winning the comp with a homebrew engine! – or rather, I’m proud of the IF community for getting to the point where that’s possible. Experimental forms feel a lot more welcome than they used to.

What I Could Have Done Better

  • As several reviewers commented, some of the puzzle solutions, in particular the pizza one, cross the line from ‘light comic tone’ to ‘Saturday-morning cartoon’. I’m sure some people liked this, but others were put off, and the people who liked it would probably still have liked it if it were toned down a bit.
  • If I’d known when I started this game that this would be the worst year for anti-immigrant rhetoric in my lifetime, I wouldn’t have done a comedy Italian chef at all. Sorry.
  • I wish I had some more diverse endings; particularly one tying up the Swampy Hollow demolition-order thread. Even the Super Secret Special ending isn’t that different from the other ‘good’ ones.

Finally, a shoutout to the person who was shocked that the IFComp winner was “a web game in which you can play as a gay”: I… can’t stop you?

And I liked dastridly’s Q&A approach to her postmortem, so if anyone wants any A’s, Q away!

[size=85]* Versificator 1 being the JS parser engine behind Hamlet, Aunts and Butlers, Portcullis, and The Xylophoniad. It works but it’s not as clever as it pretends to be and it’s inelegantly coded. I’ll probably make more games with it myself, but I don’t really expect anyone else to be interested in using it.[/size]

There’s always Detectiveland 2…! (Seriously, this is a rad concept and I’d love to see it, if only the amount of work one human could bear would permit it.)

did the Legend Entertainment games from the 1990s, which also featured a point-and-click interface to “construct” an imperative sentence for a parser, have any influence on your engine? also, did you build the engine first, then create the “game datafile” for it, or were both done together? how much of Detectiveland can be constructed just from using the engine, and how much requires custom code on top?

Not knowingly - I don’t think I’ve ever played any.

I made the engine first with a couple of proof-of-concept small games, then Draculaland, then Detectiveland. Sometimes when I realised I needed more capability for the game, and if it was a general thing rather than a game-specific thing, I would add a feature to the engine. Conversely there are features I planned (& still do) for the engine that I never got around to coding because I didn’t happen to need them for a game yet. But I did manage to keep them fairly well separated.

Well, the engine is a javascript library so in a sense it’s all custom code. It’s possible to make a ‘game’ that just features a walkable-about-in-able world and some portable objects using only javascript objects, but everything that’s actually a puzzle or other interesting behaviour requires a bit of javascript in a function that the engine knows where to look for. An example:

[code]// This is a javascript object defining an item, the wristwatch = {
description: “wristwatch”,
portable: true,
value: 20,
wearable: true,
active_when_carried: [“look”],

// this is a special rule that makes the wristwatch do something interesting (for some values of “interesting”, in this case “tell you the in-universe game time”)
add_rule(‘before’, ‘look’, ‘watch’, function() {
say("It’s " + game_time_str() + “.”);
return true;
where game_time_str() is a javascript function that returns a string like “10:05 p.m.”. This “catches” the action ‘look (at) watch’; if the rule wasn’t there, control would pass to the default behaviour of the ‘look’ verb (defined in another game file), which I think would print something like “You see nothing special about the wristwatch.” The ‘return true’ tells it not to continue the action (Otherwise you’d get “It’s 10:05 p.m. You see nothing special about the watch.”) This will be more clear when I release and document the engine.

I had this conversation with Robin before. Following the Scott Adams mold would give us “Return to Detectiveland”. And only after that do we hit “Return to Detectiveland 2” 8)