Iron ChIF: Season One Episode 1 (lpsmith vs. Afterward, using Inform 7)

It looks like I’m not going to get to the as-of-yet unimplemented places on the map. Oh, well!

Decide whether they should be ‘filler’ spaces for the chase, or just nix them.

As I write that, the answer is obvious: I have to nix them. Sigh. Time!

Brutal but pragmatic! And almost certainly the correct choice.

Haven’t we all, at one time or another, been confronted with scope creep? A task grows larger, and larger, and larger – for good reasons! We want to indulge the largeness. The largeness is filled with fun things. But the more we feed it, the more it demands. We must eventually cut it off!

Better to reach such a conclusion now, when the competition is still in its middle stages, than be confronted at the end by an insurmountable tangle of loose ends, and no time to implement them.

This is the sort of thing that isn’t always easy to appreciate, but sometimes what does not appear in a game matters just as much as what does appear.

12 Likes

Scope is for sure the Siren to Author-Sailors, seductively luring the unwary to their doom. In a more leisurely development cycle, I experience SCOPE as a frenemy: goading me to greater and greater heights, while craftily hiding the combinatorial explosion lurking behind its face. There are cycles of expansion and retrenchment as ideas bloom, then must be held to the thematics and gameplay of the underlying vision and pruned accordingly. I would be surprised to hear an author’s story where Scope Expansion did not HELP them realize and sharpen their vision - though those stories are no doubt swamped by the converse.

In some ways this pressure is desirable: it would be uncommon for a holistic vision to spring as from the head of Zeus, fully formed. Inevitably, opportunities for thematic resonance or improved gameplay will present during the coding cycle. I would be SUSPICIOUS of any author claimed immune to scope creep - how much pressure does that put on the initial vision???

Of course, all this is for a leisurely, ART-FIRST approach to IF. Here in Keyboard Stadium? This is a CLOCK-FIRST venue, and Scope creep is a full on antagonist. I echo @CMG’s endorsement of our Challenger’s discipline.

You are not making Art here (ok, you ARE, but don’t be blinded by that)… YOU ARE FIGHTING FOR SURVIVAL.

7 Likes

Behold, an image of our ChIFs in action:

17719641944714276315259301236840

15 Likes

More seriously, when the topic turns to scope I always think of Emily Short’s excellent blog post Idea to Implementation.

In my boring daytime identity I’m actually an engineer of the banging-wrenches-on-things kind, which provides relatively few transferrable skills for IF development. The big exception is of course project management, which is a skill I’ve only recently needed to acquire in order to progress my career. And let me say, if you need to manage a project of one you really can’t do better than Emily’s advice, especially if you’re on a time crunch like our contestants! (If you abstract it a bit it’s very useful for a variety of projects beyond IF.) But while Emily has detailed most of these as things she’s tried and moved past as part of her game dev journey, I’d argue that most of them are valid depending on one’s circumstances and preferences.

As far as we can tell, @Afterward is using the tried-and-true “Prototype the Hard Part First” strategy. From what he’s shared so far this is absolutely a good choice for a game revolving around a single complicated mechanic. After all, if the room-rearranging part doesn’t work in your room-rearranging game, what’s the point? It’s hard to say at this point what else he has up his sleeve, but it’s entirely possible that if his dish is puzzle-forward then this step will represent most of the work. If he’s going to serve plot alongside his puzzles this could be a disadvantage, though, as the second dish could come out under-baked given the rush.

@lpsmith, meanwhile, seems to be using the “Fully Design on Paper, Then Implement” strategy, which is also a good choice, but seems to be struggling with one of the pitfalls Short identified with this strategy: what she calls “overambition” but is known to most of us as “over-scoping”. Over-scoping comes for all projects, as my fellow judges have pointed out (and that I am certainly not immune to!), but this planning method in particular requires nerves of steel and willingness to keep your eyes on the prize when you inevitably run into it. If I were faced with this in my day job I’d re-check my requirements and rethink what’s needed to create a minimum viable product that meets them – but with fiction is harder, as the requirements for any particular story are entirely up to the author! Instead we must turn to the writing version of this advice, which is the famous phrase “Kill Your Darlings” (referring of course to your favorite ideas instead of anything else one might expect from the Horsewoman of War – stop looking at me like that!). If Lucian can keep his hands steady and make the necessary cuts he can achieve greatness, but it’s certainly not easy to do!

14 Likes

Do we want a bunch of squares who implement solid project management advice and avoid scope creep, or do we want absinth-quaffing artistes whose pursuit of their sublime visions makes them exclaim, and I quote: “I am going to die”?!

13 Likes

The Horseman of Famine can endorse prophesied death, but not absinthe-quaffing. Saliva-quaffing, perhaps, but even that might be a touch too indulgent…

8 Likes

Pestilence on the other hand? I can absinthe until I hurl like a Frat Boy!

I am so sorry for that mental image.

5 Likes

Our challenger continues his maximal transparency, with bug reports tracking his to-do items and even including his initial tester’s comments. And we find some substantial new code.

The Scenes extension and Being Chased both make use of Inform’s scenes. Lucian’s “Scenes” has some (non-recurring) scenes corresponding to discrete events in the story, while Being Chased defines several recurring scenes, creating the framework to both detect and customize some meaningful circumstances. Together, they effectively demonstrate how and when to use scenes.

As described in my above overview of Inform, a motivation for Inform’s rule-based design is rules’ value in handling all the exceptional behavior that IF is prone to. But just how do we actually specify the exceptions – how, in practice, do you catch all the cases you want while avoiding those you don’t?

Well, Inform has lots of ways to categorize elements to facilitate selecting or excluding them. I think of it as chunking and consider it a crucial part of the craft of Inform (it’s the focus of WI Chapter 6: Descriptions). You can define subkinds. Rooms can be grouped into regions. There are named action patterns (“kinds of actions” ). One powerhouse is adjectives from either/or properties or definitions or “conditions” (i.e., properties whose kind is an enumerated kind of value).

And there are scenes. They make a great way to approach set-pieces or events in your story, just as the name implies. But I fear that that evocation and the docs’ emphasis on their suitability for managing things related to the passage of time may distract from something important.

Scenes are perhaps the most general and flexible facility for chunking in Inform.

They’re conceptually very simple. A scene is either happening in the moment or it’s not. For each scene, you specify the circumstances under which it should begin[1] and end. It has two associated rulebooks, one to be followed when it begins and the other when it ends. If it isn’t defined to be recurring, it can only happen once.

And there’s a scene changing rule. It loops through the scenes and for each scene, if it’s happening, its end-condition is tested and if it should end, its ending rulebook is followed or if it’s not currently happening, likewise for its begin-condition and beginning rulebook (…unless it’s a non-recurring scene that has already happened). The scene changing rule gets followed before each turn[2] and again immediately after every action, before the every turn rules (making Every turn during <scene> a useful place for scene-specific rules).

And that’s pretty much it! The simplicity goes beyond conceptual into the actual. If they didn’t already exist, they could be made from scratch with not a lot of Inform code![3]

Some crucial things to note are:

  • the conditions marking scenes’ beginnings and ends are arbitrarily complex, anything you can come up with
  • any number of scenes can be happening at once

So they can correspond to any situation. If some combination of particular values or statuses or whatever conditions in your game’s global state give rise to some meaning that’s useful to track, scenes are often the best way to do so and to customize behavior based on their occurrence.


  1. technically optional, but a scene that can never begin is as useful as it sounds ↩︎

  2. “before each turn” is a colloquial description: it’s followed during the Startup rules before the first turn, and also near the end of the turn sequence, but notably after the advance time and update chronological records rules; see the turn sequence for details. ↩︎

  3. equivalent functionality, that is – you wouldn’t be able to reproduce the existing syntax ↩︎

10 Likes

It has been a few years since “Theories of Engineering Execution” have been relevant to me, though it sounds like my engagement likely mirrored @Encorm’s, in my case complete with management-mandated Tomes of Wisdom. (A parade of such, over the years, few outliving the management fad they were tied to.) For the record, the balance of Emily’s terrific taxonomy are: Implement first! Design later!; Write the through-line first; Transcript fully, then implement:

As a lot of taxonomies they seem less appealing as mutually exclusive orthodoxies than as interesting multi-dimensional axii to pivot around until you find a combination that clicks for you. As I play this against my own WIP, I started with “Fully Design Through Line on Paper (with big empty clouds of ‘some magic here’)”; “Prototype Pivotal Capabilities”; then a furious cyclone of “micro-through line” “Implement first” iterations. Boy it’s been fun. Not for nothing, three+ years in, W very much still IP. Did I mention Scope Creep has been my constant companion?

What’s lovely about Emily’s taxonomy is that it does not require that you hold its breadth in your head, and measure your progress (or lack of!) against its categories. Our Competitors have gravitated intuitively to an approach that seems to make the most sense for their vision - it is us, the looming Riders of Judgement (not to mention the rabid audience at large) that can assess their approaches, and how that approach served their final dish!

I’m sure it is great comfort to them that their sweat is so much ‘lessons learned’ for us! Or as my favorite motivational poster put it:

6 Likes

It does! Iron Chef Veeder indicates that he’s pursuing a highly literal interpretation of “altering the world around it”. Whenever a player looks, goes somewhere, or opens the Van der Nagel papyrus, the room it’s in and every directly adjacent room (per the grid, not by Inform’s adjacency relation, thus disregarding whether transit between them is possible) and everything within those rooms that’s alterable beome, well, altered, a newly defined either-or property on rooms and things. And then a new miscellaneous alteration rulebook is followed.

So we both learn a great deal and not much at all. alterable could be an either-or property that’s never altered from however it was initially set for each thing… or maybe it’s dynamically determined by some complicated definition. A real description text property was added to rooms and things… to provide a backup of objects’ original, unaltered descriptions? Maybe. Themiscellaneous alteration rulebook might effect change upon altered objects, possibly to rewrite their descriptions according to some procedural text generation scheme.

But for the moment, we’re still guessing.

6 Likes

I was nudged to reply to this.

Inform is a strange land when it comes to math. I tend to be wary around it when using negatives or decimals. I frequently have to look up how to word comparisons and additions. Dialog is, woefully, not any better, and perhaps worse.

But, it has (inherited from its base language, I think C), inherited a wide variety of real-number operations, up to and including inverse hyperbolic trigonometric functions!

I immediately set out to find a puzzle that utilizes this type of function, and ended up writing one for Never Gives Up Her Dead (which includes an in-game calculator), only to discover that the inverse hyperbolic trigonometric functions had been (gasp!) incorrectly implemented, possibly ruining countless past games. Fortunately, this was patched in the most recent update. If any of our intrepid competitors decide to use this rarest of ingredients, they will find Inform ready for the challenge!

12 Likes

I didn’t get to Horatio. I did implement Moar Magic, which makes The Chase that much more complex!

Or, you know, hopefully ‘fun’. Because with all the discussion about how to restrict what a player does during a chase to preserve momentum, I believe there’s another way that perhaps didn’t get that much attention: simply respond to everything the player tries.

Not ‘could try’, mind you, though if you want to catch everyone in your dragnet, you’d certainly need to. But if your game has a bunch of affordances, and you tell the player what happens when they avail themselves of those affordances (and if your writing is snappy enough), I think–I hope–that momentum can be maintained.

And the additional complications didn’t stop any of the old ways of ‘winning’ the chase; they just added new ways. There are now four ways to win, using every technique and every system I could think of. There’s also a new way to lose. If my betatesters think of more, I’ll put those in, too. (Even if it doesn’t work, it’ll get a response. The main thing players want is ‘new text’. Is my hypothesis.)

Next up: Horatio. For a complete change of pace. But for now, I’m sending this puppy to @Ally, my Day 3 Tester (thanks @Ally!)

15 Likes

In THE LITTLE MATCH GIRL 6: FULCRUM OF THE TELKON VORTEX, each enemy unit needs its own description, >TALK TO text, >SCAN text, scan log object, “class” text, HP value, table of stance-changing texts, table for tracking status ailments, text for when it’s defeated, basic attack rule, targeting priorities, and AI routine. I’m not dumb enough to type out all these properties by hand for dozens of characters, but for a long time I was dumb enough to handle them with fiddly copying/pasting/hand-editing. Tedious and error-prone.

Recently I got around to writing some code to generate these statblocks for me. EMBARRASSINGLY RECENTLY—but recent enough that the notion was fresh in my mind for this project. And it has really come in handy!

The code that needs generating here is for objects that have “altered” and “unaltered” forms. The most tedious thing about this is that there will be lots of synonyms that we only want to apply to an object in one state or the other. Let’s say we want synonym-listing code for a cigarette that turns into a worm, like in that Wayside School book.

The code-generating code is of course written in Inform 7.

"object generator" by Ryan Veeder

Internal name is initially "worm".

Room name is initially "wayside".

Adjective list is initially "portable thing".

Normal name is initially "cigarette".

Normal synonyms is initially "smooth straight white death stick".

Normal description is initially "A smooth, straight, white cigarette. [']Death sticks,['] they call them.". 

Real name is initially "worm".

Real synonyms is initially "ooey gooey".

Real description is initially "An ooey gooey worm, writhing around! Yuck!". 

When play begins:
	let thisname be "[room name]-[internal name]";
	say "The [thisname] is a [adjective list] in Room-[room name].";
	say line break;
	say "Printed name of the [thisname] is '[normal name][quotation mark].";
	say line break;
	say "Underst";
	repeat with x running from 1 to number of words in normal name:
		let xtext be word number x in normal name;
		say "and '[xtext]' ";
	repeat with x running from 1 to number of words in normal synonyms:
		let xtext be word number x in normal synonyms;
		say "and '[xtext]' ";
	say "as the [thisname] while the [thisname] is not altered.";
	say line break;
	say "Description of the [thisname] is '[normal description]' ";
	say paragraph break;
	say "Real name of the [thisname] is '[real name][quotation mark].";
	say line break;
	say "Underst";
	repeat with x running from 1 to number of words in real name:
		let xtext be word number x in real name;
		say "and '[xtext]' ";
	repeat with x running from 1 to number of words in real synonyms:
		let xtext be word number x in real synonyms;
		say "and '[xtext]' ";
	say "as the [thisname] while the [thisname] is altered.";
	say line break;
	say "Real description of the [thisname] is '[real description]' ";
	
place is a room. printed name of place is " ".

Rule for printing the banner text:
	stop.

Run the game, and we get:

The wayside-worm is a portable thing in Room-wayside.

Printed name of the wayside-worm is "cigarette".

Understand "cigarette" and "smooth" and "straight" and "white" and "death" and "stick" as the wayside-worm while the wayside-worm is not altered.

Description of the wayside-worm is "A smooth, straight, white cigarette. 'Death sticks,' they call them." 

Real name of the wayside-worm is "worm".

Understand "worm" and "ooey" and "gooey" as the wayside-worm while the wayside-worm is altered.

Real description of the wayside-worm is "An ooey gooey worm, writhing around! Yuck!" 

That was so much faster than typing everything out! I might still have to write rules for smelling, listening to, and so on. But notice that I can put stuff like “closed openable transparent scenery container” in the Adjective list field, which goes a long way.

13 Likes

I have been thinking of my rotationally disadvantaged geography as putting me at the end of a (admittedly auspicious) line, playing catchup all day. (Nevermind that I am NOT IN FACT WESTMOST) I wanted to talk about chase scenes and pacing/tempo in IF. I wanted to talk about emergent gameplay. I DESPERATELY wanted to talk about the scene paradigm in IF.

Eric Eve in fact did just this for TADS, taking inspiration from Inform. AND I LOVE THEM. So flexible and useful!!!

So here I am stewing on how do I turn back the clock, when it occurs to me… hey, WE LIVE ON A SPINNING SPHERE. (Sorry flat Earthers, if you had to hear it from me). I’m not at the back of the line today. I’m at the HEAD OF THE LINE TOMORROW.

Our Competitors have both provided some late night glimpses and both are super cool! From our Challenger:

Holy crud what an observation. Our Horsewoman of War laid out CHASE dynamics pretty clearly - generating tension requires a sense of urgency that must buttress itself against player missteps, both inadvertent and belligerent. Our Challenger posits - “well Parsers may not be the best tool for that. Y’know what they CAN be good at though? Conversation with the player!” HE’S SO RIGHT. I don’t get bored with parsers just because I’m not crushing their puzzles with godlike aplomb. I DO get bored with parsers when I continually get repeated, stock answers to wildly different things I try. My sense becomes, “Hey game, why am I trying so much harder than you?” Earlier our Horseman of Famine exposed a series of “no you can’t” messages in the Challenger’s dish-in-progress and I could feel my excitement building but couldn’t identify why. Then he summarized

I would say it even stronger. It does so to LEAN INTO parser gameplay rather than constrain it! If these “sorry, no” messages further soft steer the player back with deft phrasing in addition to playfully tweaking the player or making us laugh, even better. THIS IS SOME WAAY MORE THAN 5 DAY DEVELOPMENT STUFF. Kudos to the Challenger for this insight.

I mean In the same quote he confesses to implementing a multiple solution puzzle, and that is SOMEHOW LESS EXCITING FOR ME TO HEAR!

And then our Iron ChIF weighed in…

9 Likes

I am excited to see the natural language programming language being used to program a program that mimics natural language.

But at the same time it’s disturbing. Our Chef is creating cuisine that creates cuisine, like a miniature golem made of food, cursed to cook more food for its creators table. I picture the Iron ChIF surrounded by a horde of helper-sous-chefs made of the very materials they create with.

food golem

9 Likes

I like Interactive Fiction. I mean, saying that here is hardly eyebrow raising. It’s probably not noteworthy to say I like coding either. (I mean I REAAALLY like it, to a seriously unhealthy degree, but let’s not belabor that.) Assuming we all have that in common, are we all just GEEKING THE F OUT that our Iron ChIF is coding code to code IF??

AND IF NOT, WHAT IS THE PROBLEM WITH YOU ALL???

My apologies. That is terrible energy for me to bring to this hallowed event. I did mention the unhealthy state I was operating in here. Let me dial it back a bit. I have of course written (mostly PERL) code to generate code myself - I find PERL’s text manipulation extremely powerful and intuitive (again, probably because of my damaged worldview). This is not that.

This is an Iron ChIF, seemingly drunk on his own potency, showcasing the featured language’s ability to generate code in the featured language. While I was feverishly hammering my keyboard, our Grim Rider succinctly summarized it

Every time I think my admiration for this hubris is settling to something approaching proportional, I spiral with it all over again. This competition was already a development-forward event, its exposing of talented authors’ process as compelling as the art produced. The Iron ChIF has compounded this by including his dish in the making of his dish. It feels delightfully deliberate and cocky.

As judges we will all have to decide what to even do with that. Like, if I taste a delicious gazpacho I honestly don’t care if it was made by a 5 star chef, or a guy with a rat on his head. The gazpacho speaks. But if I learned it was a guy with a rat on his head, how does that not suddenly become even MORE interesting? What is my response to the gazpacho after learning that - can it ever approach pre-knowledge impartiality? We’re gonna find out!

So, I’m kinda thrilled by all this, you may have noticed. As my heartrate inevitably subsides to less medically concerning levels, I am reminded of this observation by our Technical Expert

What is it they say about a magician’s main tool being misdirection? Was there ever a mark MORE susceptible than your Pestilence Horseman??? Our Iron ChIF is giving a masterclass on generating excitement with vanishingly small concrete details. I think this is what we know:

  • There is a malleable map on a grid
  • There is a scroll with spacially defined binary effects on rooms and/or objects
  • It is unclear what the player’s role will be with the objects, rooms and scroll
  • There may or may not be a Pool and Changing room
  • I think that’s it?

I would be mad if I wasn’t so giddy.

4 Likes

Oh, also, Good Morning @VictorGijsbers

2 Likes

Some of my fellow horsepeople are giddy at seeing code that creates code. That’s okay. To each their own. But I am personally more impressed by an otherwise overlooked detail: the fact that @Afterward made his code simultaneously shorter, more efficient, and more insane, by exploiting the fact that the word “understand” ends with the word “and”. How deliciously demented! Our IronChIF does not quaff absinthe, absinthe quaffs him!

16 Likes

Natural language programming that writes natural language programming, indeed…

In an effort to describe the Iron ChIF’s shenanigans to someone outside the IF sphere the other day, I found myself struggling for metaphors and came up with this one. It sometimes feels as though a toolbox has been presented in the form of Inform 7, but rather than reaching for the hammer, the Iron ChIF reaches for a few hundred screws and a bundle of duct tape, and tapes all the screws haphazardly into a hammer-esque shape.

Why?

Would not the hammer serve? It is right there! No, there must be a reason for the creation of a duct-taped hammer-esque screw-amalgamation… maybe all the screws are supposed to fly away, when the “hammer” makes impact, and magically hit a bunch of bull’s-eyes on nearby dartboards. Bull’s-eyes with screw-holes waiting to receive the projectiles!

It is absurd, but it must be so! There must be some reason for these convoluted systems. If the systems have even been presented to us in their true form.

Are we really meant to believe that, when the player runs the game, it will output a load of code as the game’s narrative text? Can this possibly be the “final shape” of a player-facing mechanic?

Perhaps not. But if so, what does it suggest? That the game is about itself? That the scroll that alters reality will indeed alter the game within the game, and that the player will be exposed to the morphing mechanics?

Or is this just more misdirection? I wondered, earlier, whether the Locker Room and Pool might be placeholders. But they fit well within the Iron ChIF’s previous scope of interest re: game environments. A reference to Wayside School, however? Would the ChIF really lean upon pop-culture like this? He is not too proud for pop-culture references. Far from it! In this very update, he references his Little March Girl series, whose name speaks for itself. But my sense, based purely upon dim and potentially flawed memory, is that he more often creates his own “parallel” pop-culture – a set of references that exist within his games in a skewed relationship to reality. Crocodracula is a shining example. So this “wayside-worm” stands out to me. Not only is it a real-world pop-culture reference, but it is embedded in supposedly player-facing code, compelling the player to, what? Brush up on their Wayside School trivia in order to parse the meaning of a block of programming language? There must be more to it!

Perhaps this “wayside-worm” is another placeholder, meant to be swapped for something else in the final product. Perhaps it is merely a test case for the system. Perhaps the Iron ChIF does not care if players don’t get a minor, passing reference. Or perhaps Wayside School is universal, a cosmic baseline, and everyone will understand it perfectly!

The worm might be a hint, however, that the game is operating on two levels: the “fake” world of the game, with “fake” references to people like Van der Nagel, and the “real” world of a programmer within the game who is presumed to be writing this player-facing code, and who references our own reality within that code.

Of course, I could simply be overthinking things. That is an evergreen possibility!

7 Likes

Oooh, I thought the ChIF was just showing us some side programme he uses to efficiently create code. You think that it might be part of the game itself? Surely not?

Alas, I must inform you that far from being universal and cosmic, I have reasons to suspect it is not known in the Netherlands! Which would be sad, but I’m cheered up that in this case, my own ignorance turned out to simultaneously be a form of knowledge.

6 Likes