IFComp 2022 postm, uh, Retro Get-Go(?)

You’d always like to think, as an entrant, that IFComp is about more than just placing, or about technical improvements, or whatever. And it was, for me. I was able to complete reviewing all 69 entries I didn’t write last year, but it came at the price of other things. This year I was more focused. Maybe I was less intimidated by the gauntlet. I don’t know if I’ll be able or willing to get through it next year, but I’m glad I did this year. I wasn’t able to test as many other entries as I liked, and I also suspect I rode the coattails of some reviews to come through in the crunch.

So I’m grateful for those who paved the way. Similar to the testers who helped me see the light about many issues big and small (thanks, guys! I wasn’t as communicative as I could be. Some bugs were kind of embarrassing,) the reviewers who jumped right in gave me a nice crutch to help ensure my side writing goals were not put on hold. That, and I finally got a microphone to use speech to text more regularly, which helped me not only crank out a few reviews quicker (and write a good chunk of this retrospective!) but also keep my weekly writing files a healthy size. In 2021, IFComp-adjacent files maxed out (with one 30k outlier) at 20,000 bytes per week, but here, the lowest was 70,000 bytes per week. Part of that was just experimenting, and so forth, so quality may be low, and I might not get much from those files. But I managed to check on the forums, etc., without putting other writing goals on hold. I still feel like I wasted a lot of time. I always do. But I enjoyed IFComp while not putting other creative goals on hold.

These other creative goals may not have been huge, but I didn’t want to let them rot. One goal was EctoComp, which flatlined my review progress. Fortunately I had enough time to recover. I had stretches of focus I wish I could bottle and use more generally, and in the past few days, I managed not to let Purdue’s football team playing at Illinois distract me from writing reviews, and the last night of the competition, I managed to keep a Purdue basketball game against Marquette at arms length. My relationship with sports fandom probably isn’t one of the big topics that people want to hear about on this site, but I think in the big picture, it’s about saying, OK, there’s something fun that I like to do, and then there is the stuff that I really want to do, which is rewarding, and it’s often at least as fun.

There are a lot of entries I wish I’d gotten to sooner, but I’m glad I saw them all, and overall I found myself taking more notes spontaneously than “oh gee I better have something to write about,” as compared to 2021. And that’s a good feeling. The old cliche of quantity before quality seems to work here–last year felt like quantity as I wrote some reviews, but I was able to touch them up for IFDB, and this year–well, it might not be more quality, but the ideas felt like they were flying more, and when I sat down, I didn’t feel stuck.

About reviews received: I’m aware (ouch!) there are a few reviews I haven’t looked at yet. I wanted to focus on the stretch run for writing reviews. So I want to respond.

It’s neat to have gotten double-digit reviews for both entries. That’s a clear uptick over last year, though a chess game is prohibitively difficult. I was glad to see a general push to review games that were lagging. I was a bit worried I wasn’t getting any reviews for LLJJ at first, but I suspect and hope it’s not the sort of thing you can immediately say something deep about, if there is anything to say beyond “hey I like wordplay puzzles” or “boo I don’t” and fortunately there were no big bugs early on. I mean, people found them, and I appreciate being able to fix them, but there was at least some relief my test scripts did the job. I still have some reviews to respond to. I made a conscious effort not to look too much while sprinting to review all the other games.

Prism and Only Possible Prom Dress and Chinese Room, all with much more to say, do or both than LLJJ, seemed to have a similar fate–nobody reviewed them, until they had time to sit and think about them, then very interesting reviews popped up. So it seems worth targeting tough games early on to come back to later.

The technical bits below will largely revolve around Low-Key Learny Jokey Journey. There’s less to say about Zero Chance of Recovery. I thought I gave myself enough time, and then there was some drama in the chess world you may have heard of which distracted me. I didn’t write all the test cases out. I knew it wasn’t going to be easy, even though it was a position with four pieces. I had an idea for something new in late September, but I think if it belongs anywhere, it’s in the Spring Thing backyard. I don’t want to abuse the concept. I had the idea for ZCoR as a sort of fall-through in case no other ideas came into play, and it was easy to start, but my enthusiasm for testing it waned. I got enough done, I guess, but I recognize bugs slipped through. It was demoralizing in a way, because my previous chess efforts featured rooks and bishops and knights, but actually having a real situation with minimal branching was extremely hard. But I feel ZCoR was adequate, and once I thought of the twist, I didn’t want to let it flounder. I spent a lot of time, though, wondering if it really should have been an IFComp entry. I think it’s an adequate one, but I want to do more. It was my safety valve, but it got completed, so I went with it, and then I wound up paying so much more attention to LLJJ. The programming was all in the span of three months, according to GitHub.

So the moral here is, if you have two entries of unequal size for IFComp, beware that you will likely favor one over the other. This wasn’t such a problem last year with Walking Into It and Fourbyfouria. But here, LLJJ was clearly a lot bigger.

As for LLJJ? Well, when my unnamed “white whale” project looked tough to attain, I poked around at my old notes for Very Vile Fairy File. I figured I’d done just about all I could’ve done, between that and Quite Queer Night Near. I officially made a series out of the Stale Tales slate this year, and I wanted another one, though I had no clue what that name would be. I felt, if there was such a series, I’d need something more substantive than an EctoComp game, even though I’m pleased with QQNN. I was organizing LLJJ for a final release, but a sequel was never really serious until I noticed the no-nudge slow sludge in some notes. Could I slip in one more bonus point to VVFF? No. I didn’t want feature creep. But I wanted it in some game, though!

The TLDR: I did a lot of testing and test script writing and generalizing code for TTDD, but that seemed to be at the cost of developing the narrative as fully as I liked. Instead of adding narrative to tweak later, I found just one more test case, or just one more chunk of code to put in my Universal Header.i7x, from printing the score and tracking bonus points to showing meta-commands and options. But may zeal to keep the binary in z-machine probably impacted my will to write out more narrative I could and should have written. I was trying too hard to save bytes, but as it turns out, the current debug version of LLJJ has xa000 bytes of freespace.

14k of development history for LLJJ

LLJJ started when I asked that fateful question: what would be in a sequel, if I wrote one? And I began to answer it. Well, I’d want a clearer introduction. You’d get the hint item sooner. It would need to be clearer and more accurate–the colors were too confusing. I wanted less fetch-quests. But what else was there?

That’s when the hub format struck me. A lot of my notes had a collection of parallel rhymes, which would formerly be used for just good guesses. Could any be put into a sensible narrative? Why, yes, they could. I couldn’t dump them at once, but once the player was comfortable, perhaps they could visit other places. Maybe you could use directions, too, but on the other hand, I was pretty sure I wanted more than four passages out. Aha–there, we have six matching rhymes, if possible. Which seemed like a pipe dream until it wasn’t. I needed to rhyme a method of transport. I still admit “gawking gift” is a bit of a stretch I didn’t expect, but when a tester tried it, I realized “stocking stiffed” was, well, even more of one. I forced it a bit, but I’m glad I did. It seemed like one rhyme-set dropped daily. The first was the no-new-show shoe. I don’t know when I got the idea to use four-word locations more heavily, but maybe I had no choice. The two-word ones didn’t make sense or weren’t evocative enough.

At this point I’d like to make a detour to thank some people who weren’t testers. AmandaB, jkj yuio and ParserCommander all gave me cover art that was neat, and in fact each offering helped me with fleshing out story details, but I was willing to take a risk with my own stuff. That never really panned out–my new year’s resolution of learning to draw is still, well, up in the air–but I appreciate the time they took to help and add to what I had. It was hard to say no. But they bounced enough ideas around that paid off. So they were as valuable as a good tester, and I had several who helped a ton. It’s the sort of thing I hope I can pay forward some day.

Also re: general participation that touches off ideas, I’m particularly amused by the “white whale” topic because, well, there is one in the game, and it fits perfectly. And LLJJ was a minor white whale. I always felt A Roiling Original blew up a bit too much compared to Shuffling Around, and I’m proud I wrote it, but it wasn’t a sequel of equal length. It was the runoff from throwing all the ideas together. So it was, in fact, there before I published Shuffling Around way back when. LLJJ was different. It didn’t spawn immediately or organically. But I started having goals for it: the big one was that I would try to fit it into a z-machine, which was a bit arbitrary, but I also knew I only had three months, and sometimes arbitrary boundaries work. VVFF, I think, went to glulx late in September, a week or two before the IFComp deadline. A lot of random flavor text pushed it over. With LLJJ, I had the added motivation to keep z-machine because glulx testing would be slower, especially since I abused the parser with regexes. Z-machine format wasn’t mandatory, but if there was a late bug or regression, I wanted quick feedback on how well a fix might work.

Then once I started LLJJ, I realized I didn’t want to cut and paste code. So I spent a lot of energy making series-wide header files. This was fun–I looked at code common to VVFF and QQNN and cut and pasted a lot. The result was a “universal” file you can find in my LLJJ repo, if you’re curious.

I went with “Jest Jokes Pest Pokes” for the series name in early July, totally forgetting that I had put an LLP in a post-comp version of VVFF called the joke-jest poke-pest, where you called yourself a BLOKE BLESSED/BLEST to help forget about it. (Plus, joke in a series name and a game title? A bit awkward!) But I had a start! Then I went with Civil Seeming Drivel Dreaming on July 14, which you may recognize if you looked at the EctoComp list. It felt closer, and in fact it started a flurry of activity in mid-July. I felt very silly once I realized that prime and rhyme did, indeed, rhyme, but I had my series title. Still, I liked CSDD, and maybe it would make a nice EctoComp game? And that’s where I decided I really wanted to universalize the code if I could. This effort didn’t really become pronounced until later when I sent LLJJ to testers who informed me the hint item wasn’t working, and neither was the HINT command, at which point I realized the hinting to VVFF might be a bit arcane, and it didn’t work very well when you had five or so possible rhyme pairs to decipher at once. Nevertheless, I took the bold step of creating a file called “Prime Pro Rhyme Row E34.i7x.”

It’s always interesting to look back on the starting stuff that gets thrown away. Here it is a Trailing Tree that brought you to where you are, but that eventually inspired the Trust Track and Trite Trail in its own way. Most else of what I put in stayed, but I want to mention the antagonist had a different name. Finding their “true” name was a final puzzle, and testers panned it, rightly. The problem was, their name made me giggle so much, I had to put it in. (Spoiler alert: if I ever write a sixth entry, I have a relatively major villain ready to go. I realized I could go from the “true” name to the given name, and it makes a lot of sense.)

The hubs fell pretty quickly in terms of coding. But they felt a bit isolated. You just went in and got out. I needed something more. That’s when I went fishing for items and found the Red Rose and Light Lute. The lute appeared August 10th, the red rose on August 6th. I loved them, because they seemed potentially hokey (oh, how disappointed I was that Hurney wasn’t a word for a bonus point!) But more importantly, I had ideas for testing. I wanted to do a lot of it. I wanted to exhaust the possibilities. Why, I had a big goal: test doing all the hubs in all possible ways!

And the rose and lute wound up making that easier. Why? Because things worked as follows: area 1 gets you the lute. area 2 gets you the rose. 3 and 5 need the lute. 4 and 5 need the rose. That left only 14 of 120 original possible combinations for testing, which cut down scramble-testing time by 88%. Not bad! (I still found bugs, related to getting bonus points you can only get if you do area 1 or 2 first. Those were fun to fix–I had fun creating a control language that filtered out certain text commands. It was probably not time well spent for producing results, but I felt VERY competent doing it.)

So it’s bizarre that adding an item or two can make you feel more relief, but in this case, it did, and I’d like to think it gave the player more chances to get bonus points so the lurking lump got super-powered, in the case of what I thought might be a tricky final puzzle. Even after I changed from the old antagonist to the Burning Bright Spurning Sprite!

On my testers’ advice I knew I needed to change it. The “real” name was, in fact, a bit obscure and English. (Again, I’m redacting it in the case Prime Pro Rhyme Row 6 becomes a thing.) I was glad to expose the guessable final command on move one, just as I did for VVFF.

So who or what is the BBSS? One theme I enjoy in works is when someone not necessarily laugh-out-loud or oppressive evil is successfully blown off, or people realize they are full of hot air and anti-constructive, even if they’re not, you know, obviously cutting you down. They’re just TRYING to help, gosh, in a color-by numbers sort of way. But they aren’t, really, they just obstruct you or offer useless criticism, and they’re mostly there when you don’t need them, or more negative than appropriate. (Also, I liked the initials BS.) How do we brush people like that off? The BS was also there to symbolize self-doubt, and the seemingly-random actions and quests you fulfill in each hub were meant to sort of counter that. I don’t think I put in as much as I hoped, there.

Part of that was due to a small panic over z-machine limits. As it turned out, I just flat out did not know two very useful things that helped LLJJ eventually skate in well under the x80000 size needed for it to stay in z8. The release version actually was just fine! However, the debug version had a lot of extra stuff. Two lines made a huge difference. One was in the Inform docs I used, and one wasn’t but it had been around for years.

`use memory economy [this got rid of some testing/debugging stuff that’s superseded by Zarf’s scripts]


Apparently the second isn’t necessary if you use the 6.4.0 compiler, but I didn’t want to update mine when automated testing was full steam ahead in September. It was one more variable.

And my insistence on keeping things in z-machine format opened an ugly can of worms: I hadn’t implemented HINT (X) and my debug build was close to x80000! So I had made a release build to test the “real” hints and a debug build to test the stubs. This didn’t feel like much busy work, but it was one more thing to plan and fiddle with, and it did exhaust me for a few days I maybe could’ve used to buff up the narrative. So lack of knowledge and not asking questions in the I7 board cost me time. It’s tough. I feel like I know a lot of I7, and my attitude isn’t all “NOBODY CAN TEACH ME ANYTHING, I’M TOO SMART” but more “boy I’d feel dumb if I didn’t know this after X years.”

So I thank those who helped me without making me feel dumb, many of whom came to the boards after I first did and moved well ahead of me in knowledge! I’m probably never going to really look into the core stuff. I know the basics, and I have an idea what I’m missing, and that’s good enough.

And I’m really happy with the technical under-the-hood stuff. In September the EctoComp game that I intended to be Petite Mort was fully written out, though I added . I even managed to make code-generating code. Since I used it for LLJJ originally, it didn’t count against the four hours for CSDD. (CSDD got too big for Petite Mort, but that’s another postmortem.) If you’re interested, you can look (here)[low-key-learny-jokey-journey/utils at main · andrewschultz/low-key-learny-jokey-journey · GitHub] with the main coding (here)[low-key-learny-jokey-journey/tgg.py at main · andrewschultz/low-key-learny-jokey-journey · GitHub] and (here)[low-key-learny-jokey-journey/mrc.py at main · andrewschultz/low-key-learny-jokey-journey · GitHub]. The time spent writing Python scripts made me feel competent and creative, and they saved a lot of frustration and energy from potentially repetitive code entry for each single point, or worse, for when I put in the wrong number of tabs in an Inform table. (If you’re curious where the code wound up, it’s changed to stuff in the Table of Verb Checks in Tables.i7x and the various tables of good guesses in Mistakes.i7x.)

It was a good feeling to see technical tests pass a week or two before the deadline for the final build–in fact, they’d been passing regularly, and it was good to have something to work on, something my testers didn’t need to see. A lot of test cases I wrote up and though “oh, gee, this is boring, I make mistakes but I won’t mess THIS up,” did, in fact, break when other code was tweaked. Zarf’s scripts really are blazing-fast, and I recommend them–a complete run of the main walkthrough files, from the bare minimum to trying GO TO to trying all the good guesses, took maybe a minute or two. I was quite aware of the potential problems in the story, and for whatever reason, I can be slow with that. I don’t want to be too blunt with that or with clues, but on the other hand, I didn’t want to just have nothing. I think I came close to the latter, so that’s something for post-comp. It’s frustrating to read through a transcript and think I implied something and realize 1) I didn’t and 2) the actual solution is pretty obvious, or I sort of saw something that would work 90% and I should have thrown it in. I had an idea to say “hey, why don’t I make the Leet Learner say how many points you can score around X,” and I knew it was a 5-line solution, but I didn’t do so in the end.

That said I think the technical side, of breaking code into smaller modules, worked great. While the Leet Learner’s mechanics were likely mystifying, they were easy to cut and paste, and now I can just add a line into a header and fix all of LLJJ and CSDD and TTDD. That’s big! I was doing the sort of thing I thought I could never do and constantly finding tweaks. But I did realize I had story- and narrative-based stuff I let slide. I figured I would get to it later. And I did, but I just wish I’d taken some free/spare time to tweak things beforehand and look regularly at the narrative from the scripts I generated. I’ve gotten better the last two years at firing off tasks to look at certain important things, but I didn’t establish that regular creative process for LLJJ. Perhaps I was too glad things just fell into place.

Post-comp, even with the technical victories, there are things to clean up. Art DiBianca and Brian Rushton made some excellent suggestions, which is not surprising since they know what they’re doing with Inform and have helped me a lot before, but I wanted to be conservative about my changes. Even adding some neat guesses required energy.

I settled on flipping a switch so you could see the good-guess rhymes you have so far. This was a case where I was way closer than I realized, and it very slightly slowed down my scripts (I had to convert a topic to text and a regex) but it felt worthwhile. The next thing post-comp would be to put in a more rigorous check for if you get one word right. There are a lot of annoying special cases, but it will be a fun challenge and an accomplishment I can be proud of. The best part is, it should work for everything from VVFF to TTDD.

I admit I’m a bit worried I’m flooding the comps with games of the same motif, but I’m really pleased that I, in essence, created a game engine. It’s not a very universal one, but being able to spin things out with relative ease for EctoComp left me feeling handy. I’d like the narrative and story to live up to that, both for the post-comp releases and for if the BBSS’s predecessor ever, well, makes it into a full game.