introduction.
As I’ve already discussed here and elsewhere, Marbles, D, and the Sinister Spotlight must be delayed to Spring Thing 2025. Have no fear, fellow beginners! There is more IF to be made, which means more posts,
I’ll be shifting focus to my “cave game” project, which contains many ambitious–for a person of my skill level, at least–design features that we can discuss here. Because I intend for this work to be a competition piece, rather than one written for exhibition purposes, I will have to be more guarded in what I share. Here are some important distinctions. Sadly, I will no longer be able to share the following:
- Source code for the entire project.
- Lengthy transcribed passages of gameplay.
- Specific, detailed descriptions of the game’s story.
You might wonder: what’s the point, then? Don’t worry, there’s still a lot to talk about! Remember, this blog is intended, among other things, to be a resource for beginning authors who would like to read about Inform 7 coding and design techniques. Live blogging Marbles, D, and the Sinister Spotlight is only one of the ways that I intend to realize those ambitions. The cave project will afford many opportunities to assist and amuse new authors. At least, that is the plan.
what’s in a cave game.
Let’s consider some of my high-level design goals for the project. You may better understand these goals if you have played my first game, Repeat the Ending. Referring to the source code for RTE may be helpful as well. You can find both source and game here.
- Devise a new or improved system of magic.
- Create QoL (player quality of life) systems that will provide helpful information (goal tracking, etc) as well as thematic content.
- Create a wide-linear world that faciliates exploration for exploration’s sake.
- A much larger map, compared with RTE.
- Explore paratext in a new way. No academic essays or footnotes, but something lighter and more “fun” to experience.
- While this will be a parser game in all of its complexity, drudgery should be reduced. Commands required for the main throughline should generate interesting feedback with minimal repetition.
- Incorporate scenes that evoke a sense of dramatic tension without feeling “on rails.”
- Explore methods to create a sense of pacing or engagement.
- Design from the ground up with a story mode option, i.e., written for both playing and reading.
Whew! That’s a lot, and the list will only grow as the project progresses. Where should we begin?
cg1: devise a new or improved system of magic.
The entropic magic system of Repeat the Ending was, by necessity, one of the first things that I ever created in Inform 7. It is used in the prologue in the game’s second room. My primary inspiration for the system–in terms of structure, not content or quality–was that of Infocom’s Enchanter. The basic gameplay loop of the Enchanter games is this:
- Find and collect sources of magic (spells).
- Memorize them.
- Cast them to find and collect more sources of magic (spells)
…and so forth. Now, as many of you already know, I am not in the business of interpreting or explicating my own writing. So thematic distinctions between the magic systems of Enchanter and Repeat the Ending aren’t up for discussion here. Mechanically, though, they operate quite differently. Let’s peek under the hood of Repeat the Ending for a moment. There are no spell books; magic is a thing in the world. The *READ SPELLBOOK* command in Enchanter will list all available spells, each with a brief description of its function, but that isn’t possible in RTE.
Diagnosing is an action applying to one thing.
Understand "diagnose [something]" as diagnosing.
Don’t forget abbreviations and/or synonyms!
Understand "dn [something]" as diagnosing.
Understand "dg [something]" as diagnosing.
With the *DIAGNOSE [SOMETHING]* command in Repeat the Ending, the player can evaluate a source of magic in the game world and discern possible uses for it. In Inform 7 terms, that source must be a “thing” created in the world of the game. That precipitates a lot of situations to manage. None of them are overwhelming, but they gave a first-time author a lot to think about. There are two especially pressing considerations. In the first place, as Inform 7 things, they must be given appropriate properties. For instance, are they printed as part of room descriptions? Listed in Inform 7’s locale descriptions? Similarly, as things, players can direct all sorts of actions toward them. For instance, EATing, OPENing, or SMELLing are all by default possible verbs from Inform 7’s standard rules.
In Repeat the Ending, these sources were so constrained by set responses and restrictions to default actions that the player couldn’t cause much trouble. It was also very obvious what actions would move things forward (the game explicitly gives the player this information once the source is discovered). In truth, this is a poor practice. It is hard to be sure of oneself when dealing with the 77 verbs built into the Standard Rules, plus whatever new verbs I implemented along the way, and no tester will check every action against a noun. There is an extension, Juhana Leinonen’s “Object Response Tests” that automates such checks, and it can be a great help in such cases. However, I fully believe that if we know that a thing is good for only a handful of actions, it is best to constrain it ourselves. That way, we can control the output and give some helpful, directed feedback for the player. That’s the first thing we can do, then: limit the actions applicable to sources of magic in the game world.
instead of doing anything other than xyzzying or plughing or discerning to the magic:
say "The magic is little more than an invisible quality. *DISCERN THE MAGIC* to learn more about its nature.".
“Instead” rules, we know, happen very early in Inform’s action processing, and they are generally used to divert or halt player actions. Rather than allow a command like *EAT MAGIC* to be parsed as an *EAT* action, an instead rule will stop that command before it can begin. Inform will never even evaluate the possibilities of EATing. Instead, it will print the above message and be done with the command entirely. Problem solved?
Perhaps. We can be more thorough. What about a command like *UNLOCK DOOR WITH MAGIC*? Our construction won’t apply, sadly. It is specifically for commands that use *MAGIC* as their direct object. Using magic as an indirect object (*WITH MAGIC*) will sail right past our defenses. This phrasing, which doesn’t quite feel as good on the tongue, will do:
instead of doing anything other than xyzzying or plughing or discerning when the second noun is the magic:
say "The magic is little more than an invisible quality. *DISCERN THE MAGIC* to learn more about its nature.".
In most cases, though, there will not be a need to manage direct and indirect objects separately. Mercifully, Inform 7 includes this phrasing:
instead of doing anything other than xyzzying or plughing or discerning when the current action involves the magic:
say "The magic is little more than an invisible quality. *DISCERN THE MAGIC* to learn more about its nature.".
This is one of those cases in which Inform 7 is quite readable: “when the current action involves the magic” makes good intuitive sense. This code will be our solution of choice. It heads off unexpected action processing while helpfully redirecting the player toward some productive action. This makes it an improvement for authors (less complexity) and players (better feedback) alike.
This by itself is hardly a magic system, though! We have only scratched the surface.
meanwhile/next.
Here, on Top Expert, I’ll continue to discuss a design for a system of magic in the cave game, using the mechanics of Repeat the Ending as a baseline.
Elsewhere, Graham Nelson’s “The Craft of the Adventure” on the Gold Microphone podcast, and continued discussion of Brian Moriarty’s Trinity at Gold Machine.
I’m also going to start streaming a full playthrough of From Software’s Elden Ring, a triple-A action RPG on Twitch. It will focus on strategies for beginning players as well as narrative features.
You can find new content announcements on Mastodon and Tumblr. I’ve asked for this blog to be added to the Planet IF aggregator, but I have no sense of when or how adjustments are made. Hopefully it will be there soon!

Leave a comment