This year Alleson and I submitted a short story called Esther’s to the 28th annual Interactive Fiction Competition. We placed 17th, which is great!
We live in Seattle, Washington. Alleson runs Radiant Neon, an art studio near Pike Place Market. I’m an engineering manager at Discord. This is the first game we’ve released together.
The Avocado Pit of an Idea
Esther’s started as an idea for the Together Breakfast 2022 Narrative Jam, which I heard about from David van Duzer at Narrascope in July. I’ve been chipping away at a bigger Twine project with a friend for about a year, and thought maybe I could borrow that foundation and build something small for the jam. Alleson helped me brainstorm a little story about two mice who worked together to get their brunch. There was about a day left in the jam when I heard about it, and it quickly became clear that we couldn’t do the idea justice so we put it on the shelf. But it’s always been a modest idea; something small and polished that could elicit a smile.
About a month later I had the privilege of taking September away from work before joining Discord. I’ve wanted to enter something in IFComp for a long time, so I asked Alleson if she’d help me write the game. We spent about 50 hours building Esther’s in the month of September. I was hands-on-the-keyboard and did the illustrations. Alleson did the narrative design and endless editing passes. She contributed the “speak squeak” moment and many other clever turns of phrase.
I don’t remember exactly how we landed on brunch, but I know the “mimosa mice” alliteration caught our ear very early. As reviewers have guessed, we are (and consequently wrote) hipster millennials. We both grew up in Portland, Oregon and we lived on Mississippi Avenue in 2011, right at the societal inflection point for avocado toast. Mississippi Ave is a stellar food street, with brunch standbys like Gravy and Miss Delta. We still miss Muddy’s Coffeehouse. If you’re ever in the area make sure to check out Lovely’s Fifty Fifty for some of the best pizza in the country. Beech Street, where our mice live, crosses Mississippi Ave on our old block.
In the first version of the story Harold and Janie visited a real cafe/diner in their neighborhood, and Esther was the young adult proprietor whose Disney princess complex drove her to ignore local health codes and set the mice a tiny table on the end of the counter. The central idea that Esther wouldn’t understand our order was in place, but we were having trouble painting the rest of the world. Why wouldn’t Esther just go down the menu with the mice? Do they have the run of the kitchen, and retrieve the ingredients themselves? What do the other patrons think of the mice on the counter? We could have explained each of these away, but we were starting to run afoul of The Lens of The Weirdest Thing. We also allowed the mice to get increasingly frustrated trying to communicate their order; at one point “Bite Esther” was an option! It felt wrong and I’d hit a writer’s block; I spent about a day mentally tearing elements out of the piece, looking for the right pivot.
Making Esther a kid fixed a lot of problems at once. The make-believe cafe has no health codes, or complaining patrons, or expectation of pay. Of course the mice can’t make sense of the menu – it’s scrawled on a chalkboard, and even the pictures don’t reveal much. Of course, it also introduced a problem: Why are the mice ordering alcohol from a kid? We considered backing off the “mimosa mice” thing and having them just order orange juice. But we were attached to the “mimosas and avocado toast” brunch cliche, so instead we made the mice not actually know what a mimosa is. This felt like a mice… sorry, a nice compromise, and left parents room to explain as much or as little as they liked.
Structure and Tech
Though small, the game mixes up a few CYOA structures. The first six-ish pages are basically linear. About page seven it opens up into a set of single-visit storylets which act as locks and keys for one another; there’s this blob of hacked-together menu logic that curates and limits the options we’ll show the player. The space naturally narrows as the storylets dry up, and we bottleneck into the last three linear pages for the pudding cup gag. I won’t claim this structure got a lot of thought. It seemed like a good way to let the player try lots of silly actions, and it let us keep the total number of pages small and write one strong ending.
On top of that is a little “eatable foods” inventory system, that will put an extra option into the menu anytime there aren’t enough choices. None of the six “Eat” storylets are critical-path, so we used them to hide little hints and nudges that remind the player about the brunch goal. Because of this they have some of the most complex conditional logic in the game, to ensure Janie’s comments appropriately on the state of the world.
:: Eat crackers
"Crackers are very good too," crunched <span.harold>Harold</span> with his mouth full.
<% if (s.hasMimosa) { %>
"They pair well with our mimosas," conceded <span.janie>Janie</span>.
<% } else { %>
"They would pair well with a mimosa," said <span.janie>Janie</span>.
"All we need is <%= (s.hasOrangeSlice && s.hasEmptyCup) ? "orange juice in these cups" : [!s.hasOrangeSlice && "some orange juice", !s.hasEmptyCup && "an empty cup"].filter(x => x).join(' and ') %>."
<% } %>
<span.esther>Esther</span> giggled at <span.harold>Harold</span>. "What a good appetite you have today!"
<% removeFrom(s.eatableFoods, 'crackers') %>
<%= story.render('Menu') %>
Esther’s is built with Tweego and Snowman, which is to say it’s a Twine game but eschews some of Twine’s writer-friendly defaults in favor of tools a web developer like me would be comfortable with. I did all my writing in VSCode. You can see the project on GitHub. I liked the look of default Chapbook and built out something visually in that vein, with a skeuomorphic page.
Although it’s a small game, it can be annoying to re-navigate to a particular page every time you rebuild. So I added a small developer tools panel to help with this, with savestates and autosave. It’s actually in the release; you can enable it by adding ?dev=true to the URL.
Esther’s was small enough to test exhaustively and I geek out about automated testing, so I wrote a Puppeteer script that actually launches the game in a browser and plays it. I hid a lot of the complexity in this SyntheticPlayer class, and then used it with a very light JavaScript test runner called tape. I ended up with this test that plays through every possible path, not just visiting every passage but also every possible game-state you could be in when you reach that passage.
await player.restart()
await player.walk(['Play'])
await player.exploreTo(['Now all we need is dessert'])
The exploreTo
command checks for some problems along the way:
- Dead ends: No passage should have no exits.
- Self-references: No passage should link back to itself (in this game, anyway!)
- Navigation and restore problems: The synthetic player makes heavy use of the same save/restore logic that drives the browser back/forward behavior, and it catches any place where this doesn’t work properly.
- Errors: When a scripting error causes Twine to render an error message instead of a passage, capture that and report it back in the test result.
When it finds one of these issues the script can produce a helpful error message and a story backtrace, showing the sequence of passages and links that led to the problem.
The test also gathers some stats as it explores and prints a report at the end. Here’s the report for the current version of the game:
# Every path
13:33 | Knots: 6507 | Endings: 45
Found 2793120 possible paths.
┌────────────┬──────┬──────┬──────┬────────┐
│ (index) │ min │ max │ mean │ median │
├────────────┼──────┼──────┼──────┼────────┤
│ characters │ 5230 │ 8189 │ 6827 │ 6856 │
│ words │ 892 │ 1433 │ 1181 │ 1186 │
│ knots │ 18 │ 28 │ 24 │ 24 │
└────────────┴──────┴──────┴──────┴────────┘
On my laptop it takes about 15 minutes to find all 6,507 distinct possible gamestates (knots), and count 2.8 million possible paths through the game with an average length of 1181 words / 24 pages (treating all possible paths as equally likely, which they’re not). That sounds like a lot, but if anything this is a case study in how weak branching itself is for creating variation. You get some control over the order in which you read the pages, but this is one story with one inevitable ending, and on replay readers don’t report that they’ve seen a different version of events. I do suspect having a larger number of options at each beat helps create the “puzzle” in the mind of the player, even though all roads lead to success.
Finally, the script was a great way to dump a transcript of a particular path through the game, or even all of the rendered game text in one go, which was valuable for editing. At one point I printed knots-by-passage from a sub-exploration to do some editing on paper. I also dumped a few transcripts into Hemingway Editor shortly before release to check the writing for clarity and reading level. That tool thinks we got down to a 2nd-grade (age 7) reading level.
This test tool isn’t easy to use with any Twine game yet: It’s tied to the Snowman API and to the small subset of Twine features Esther’s uses. But I think there’s a possible future as a more general tool. Let me know if you try it!
Points of view
The thing I found most challenging about writing Esther’s, and also what makes it sing for me personally, are the overlapping imperfect perspectives at play. It was important to me that we had a clear sense of what each character understands about the world. It gives the story a childlike logic that’s consistent enough to follow, and it’s especially important when the heart of the story is communicating across these differences.
My framework goes something like this:
- Esther knows that she’s playing pretend. From her point of view the mice are playmates like her stuffed-animal customers, only better because they can respond. In her own head she has Disney-princess talk-to-animals powers, and when the mice talk back to her she doesn’t understand their words, but she’ll often make something up and pretend she did understand them. She is playing with real (albeit kid-accessible) foods in her cafe.
- Harold and Janie have a magical mouse-perspective. They don’t read or speak English, but they do understand some spoken English. They don’t understand that Esther isn’t an adult and this isn’t a real cafe. They also don’t really understand what avocado toast or a mimosa is. (How Janie got in her head that she wanted brunch might be the weirdest thing in the whole story, but we’ve established that she reads picture-books and it’s conceivable that she peruses magazine ads too.) They try speaking to Esther, as we often do across a language barrier, hoping against hope that our inflection or common root words will be enough. But in the end, body language and luck gets them what they want.
- The narrator is “over the shoulder, close” to Harold and Janie, as we mostly see the world through the eyes of the mice. But we the readers can understand both Esther and the mice, and also observe how Esther hears the mice (SQUEAK SQUEAK), and also have little glimpses of “reality” through the pretend, like identifying the “coffee” as little creamer cups.
- The illustrator is a fourth point-of-view, and plays pretend much less than the characters or the narrator are. They set the scene in a different and more grounded way than the narrator. It is the illustrator who reveals on the second page that Esther is a child; who shows that we are in Esther’s backyard, and the other customers are stuffed animals; only the illustrator gives us a sense of scale for these characters, and shows Esther’s attentive but slightly condescending attitude towards the mice; who shows us Esther’s misspelled chalkboard menu.
That last bit emerged partway through development. As a kid I was fascinated by books where the pictures revealed hidden layers to the story, and I wanted to capture a bit of that even though my illustrations aren’t nearly as lovely and clever as someone like Jan Brett.
Playtesting
I’ve studied and worked in games and am fortunate to have a number of savvy industry contacts I can trust to give excellent feedback. We sent our first playtest build out on the 11th, about a week and a half in. Most of the text was present, but we only had one black-and-white sketch of Janie and Harold, and otherwise had AI-generated placeholder art to get a tiny bit of “picture-book” feel. It went to three playtesters with a note that it would only take about five minutes to play, and the prompt: “What works, what doesn’t, where is it confusing, what does it need?” We ended up sending seven builds and got feedback from a total of nine playtesters. They were great, not just for finding issues, but also suggesting key additions to the experience.
For example, I’d written a bit where you could eat the orange and have to ask for another one. Alleson was worried this would be confusing, and our playtesters quickly confirmed this:
Eating the orange allowed me to eat it, get a warning that we needed it, and then I had to order another. It could have been an opportunity to warn not to eat it, and give a hint that we could use it for the mimosa.
I got to a thread where I ordered the orange, but wasn’t given the option to squeeze it into the cup, so I ate it and had to order it again. It just felt unsatisfying, as I wasn’t able to do the thing I wanted to right away.
So we made Janie block the “Eat the orange”action; simpler was better in this case.
Our original intent was that the player guides both Harold and Janie, so this feedback was helpful:
It felt through much of the experience as though we’re playing as Harold. I’m not sure this is intended. If it is, what was it about his perspective that made it important to play as him instead of Janie?
I took an inventory of which passages featured each mouse as the key actor, and Harold did have more to do – mostly because he features in all the “Eat…” passages. We adjusted a few critical-path passages to balance things out. I also noticed that whichever mouse complains to Esther at the start of the story ends up feeling more like the main character. That seemed like a good outcome.
In the earlier builds, several folks thought Esther being human was a twist ending! This convinced me that the illustration on the second page needed to set the scene, showing that Esther is a kid running a play restaurant in her yard.
Our testers also requested the back button, the hand-drawn avocado bullet points, the color-coded character names, and the note about length on the title page. One even provided this excellent feedback:
it would be nice if, at the very end, you had a callback to something that was chosen at the very beginning. Otherwise, it feels like Harold and Janie end the story without the player. Something that has a consequence when the dessert falls on them.
…which is when we added the pudding flavor choice that affects the ending. At first these choices were just the flavor names, but on the next round this same tester wrote back:
You can have one say, “What’s your favorite pudding again?” They know each other, so they would be reminded, not told. The answer would be something like: “You know what my favorite pudding is.” And then that mouse would be give a choice based on three different types of criteria. “You know, the first one we had together.” Or, “You know, the one I’ve always wanted to try.” Or, “You know, that really thick one.” Then, the other one can answer, “Of course, chocolate.” Or, vanilla, or tapioca. One refers to memory, one to anticipation, and one to an attribute of the pudding itself. Now, when the pudding does appear, you can refer not only to the flavor itself but to how it relates to the characters. It becomes an emotional link that, hopefully, the players can identify with.
…so we went back and wrote reasons into the flavor choices. I don’t think we closed the loop on the emotional link, but it was a great spot for some extra characterization, especially since Harold and Janie have different thoughts on the flavors.
Reception
We tied for 17th place out of 70 entries. We received 98 ratings, with an average score of 6.53 out of 10.
I feel great about this ranking! The game was too small to ever be a contender for the top spots. I figured we had a shot at the top third, and sneaking into the top quarter feels like success. We were surprised to see Esther’s included in a few personal top-ten lists.
Our rating distribution is a little unusual in that we placed 17th when our most common (mode) score was a 6. The most common score for nearby games was a 7, including the other game in 17th, the ones in 19th and 20th places, and all three games in 22nd place. Our average was pulled up through low controversy (no 1-3 scores) and about 20% of judges found our game unusually appealing (8-10).
One wonderful thing about submitting a short game to the comp is that lots of people play it and write reviews! (I’ve collected them here.) We’ve been honored and flattered by the positive attention the game has received. More than a dozen reviews complimented the illustrations and visual design. The word “adorable” has been deployed with abandon. The game is short, but the prevailing sentiment has been that it feels just right for what it is. Some reviews complained that the choices in the game don’t matter (and they’re right) but I’ve been pleasantly surprised by the number that felt the simple puzzle worked well. At least a couple reviewers suggested we should do a sequel.
One of my early hopes for the game was that it would serve as a palate-cleanser for judges between heavier entries. That worked out, at least for Andrew Schultz!
Okay. I peeked. I had a few tough games with big ideas, and even though I’m largely a text-adventurer and I enjoy said big ideas, I wanted something that didn’t address anything serious. A glance at the reviews suggested Esther’s would be just the thing, and my fellow reviewers did not leave me astray. It certainly does not address any big issues, but it certainly leaves you much more recharged to deal with them than, well, pretty much any other way you can stare at a computer screen. Including, likely, your old favorites.
In my opinion, the most notable criticism came from folks that actually played the game with kids. Victor Gijsbers played it with his daughter, and reported that she enjoyed it. But:
Still, I’m not convinced that Esther’s was as successful as it could have been. While reading it to my daughter, I noticed more clearly than when I read it myself that the game makes some heavy and perhaps unnecessary demands on the young listener. The basic idea of mice wanting specific food and not being able to communicate with the cafe owner is easily grasped. But the foods in question were highly unfamiliar. Even I myself had to look up mimosas. In addition, my 4-year-old has only a vague knowledge of avocados and guacamole, and none at all of tapioca pudding. […]
This problem is exacerbated by the rather complex cognitive task of keeping in mind the current inventory of the mice. Children are really good at grasping and remembering narratives. I read long books over many nights with my daughter, and she’ll still know what happened to the horse ten chapters ago, no problem. Story is easy. But I noticed that it was really hard for her to mentally keep track of the foodstuff that was on the table in Esther’s. The mice now have… an empty cup, a slice of orange, toast with the cinnamon & sugar still on it, a quesadilla with cheese and some guacamole. I mean, that is hard. But if you’re not keeping track of this, you don’t really understand how far you are along in the story; what you have done; what still needs to be done. It makes me wonder why the authors chose this particular form for the game, rather than a more traditional narrative that requires less complex non-story state tracking.
This is spot-on! You’ve called our bluff. We never actually playtested with kids, and I’m not a bit surprised that it doesn’t work so well. Our one tester that did play with a three-year-old got back to us after the submission deadline, and reported that the kid lost interest partway through.
The truth is, we wrote it for ourselves first – our seven-year-old selves, perhaps, but sitting beside our adult selves who also love picture-books. I even did an editing pass to try and expand the vocabulary in the story, because I like it when kids make adults explain big words. We figured this headfake would be fine for the comp, because our comp audience would be adults. Reviewers guessed the story was for 3-4 year olds based on the gentle illustrations, but I had 6 year old me in mind. I think Esther herself is seven – old enough to use the toaster on her own, not old enough to make a quesadilla without help. But again – I cared less that kids actually liked it, and more that it felt like a convincing children’s book to an adult. Which is, I think, much easier.
Things you might have missed
- In the rarely-visited branch that includes an “Eat Cheese” option, Janie nibbles on some Asadero. I hadn’t heard of this cheese before writing Esther’s. It turns out it’s commonly included in a Mexi-shreds mix, which in my imagination is where Esther gets the “bit of cheese” she normally brings the mice.
- On that note, Esther’s parents clearly lean on lots of bulk snack foods. Pre-sliced oranges, guacamole cups, and Velveeta cheese slices all feature in their kitchen.
- The dog and bear in the second-page illustration of Esther’s cafe are actually favorite stuffed animals from our own childhoods. And of course the moose with a muffin references a popular children’s book.
- One of the books Harold is carrying home for Janie is Goodnight Moon. (Good eye on this Mike Russo!)
That’s a wrap
Thanks for reading! Make sure to check out the full comp results. My personal favorites this year were According to Cain by Jim Nelson, Prism by Eliot M.B. Howard, and Elvish for Goodbye by David Gürçay-Morris.