Beyond posts relating to New Cat, this is my last I7-related post. I felt it necessary to state the origins of its failures and to rail against what it says about the process of creation, those who create, and humanity itself. With this, I lay it upon the bier, set it aflame, and walk away.
Beyond the usability problems of forcing people to put all of their code into one file (a convention that I7 hypocritically fails to follow), such a convention presumes that all game designers use a linear, top-to-bottom, design process. I think of fusing smaller parts into a greater whole. The latter process groups like things together to be dealt with in their own area, limiting bleed and spillover into other topics, which creates a meta-level separation of function and data based upon internal similarity. That is, all functionality and data relating to topic/idea A is placed in the A file; the same goes for topic/idea B, topic/idea C, and so forth. This has parallels to traditional object-oriented language (and even functional programming), in that it minimizes the number of interface points. If you don’t do that, then it quickly becomes hard, if not impossible, to tell what your code is doing. So, you define the interface points and keep them as few as possible; separate files work in an analogous manner. And furthermore, they work this way because they reflect a typically human organizational scheme. People don’t heap everything into one common storage area. No, for they have waste baskets, refrigerators, and soap dishes — all different areas of containment for different things. Thus, if I declaim being forced into a single file for my code, it stems from a natural tendency to separate like objects into separate groupings.
That aside, I7′s story paradigm fails due to the output of the language itself. If what I7 produced was something that could be read from top to bottom, linearly, like a novel, then the need to group related materials together would be eliminated. The content is the issue, and the code is the issue. I7 output does NOT read straight through like a novel, and it never could, because a game is not a novel. While the needs of a game itself provide the first hurdle, the next hurdle is something that I7 sets up for itself: how rulebooks function.
The paradigm of the rulebook is that all like rules governing an object go in the same rulebook — or is it that all actions relating to all objects go into a rulebook? No matter which you choose, things quickly get out of hand. It would be wise to do both; however, if you do that, then your code cannot read straight through. It makes more sense to group together rules that affect multiple objects in a place divorced from any object (like in a separate file), or at the beginning of some section. But in order to refer to that section, you must return to it, or skip forward to it, breaking the processing flow of the game from top of page to bottom of page. I7 assumes that we’re all writing from top of page to bottom of page, writing as if we had only an old Selectrac typewriter, dutifully punching out one row after another.
That is an amazingly restrictive assumption, and it caters only to those who design puzzle-based games; it does not work well for most creative types. Editing on a typewriter is a painful and laborious process. What do you do when the ideas keep coming and have to improved or revised or discarded altogether? Clearly, you must brainstorm and edit elsewhere, and use the typewriter only to capture the finished idea, and you must be correct about that finished idea or else you begin the process anew. I could not write on a typewriter. I can write on paper, because although the paper has lines, I am not forced to use them. I can erase, write over, draw arrows, scratch things out, or even turn the page sideways. A text editor captured most of the creative capacities of paper, and naturally I seek out systems that allow me the same freedom in design. Like goes with like.
I7 imposes a harsh, utilitarian, one-size-fits-all unencouraging, unforgiving framework that in no way respects the creative process. It really is probably the worst possible tool for the job at hand, and the same people who have created this monstrosity are ever deaf, dumb, and blind, to all the pain, angst, and problems that they have created. They do not learn; they do not improve. Their reaction? Let the documentation fix it. However, no documentation can correct the erroneous worldview of I7. I7 fails to be usable.
The first step in making a usable product is to understand humanity; the first interface of I7 is between the language and the humans using it, and that is where it fails. From that set of wrong axioms, it descends, slowly and twistingly, into a dark valley of flawed assumptions that in the end, shuts out all light from the sky.
Inspiration is unpredictable, haphazard, wild, beautiful, and unrestrained. It is not logical, orderly, or predictable. Thus, in order to harness these wild winds, the creative type needs a flexible tool. I7 is not flexible. The creative type needs a tool that gets out of his way. I7 handholds you, even during the error messages. The creative type needs something that is not so obsessed with structure or details, but something that allows him to capture the thought, the moment, the spirit of things. Not that I6 is a great tool for doing that, but it gets in the way a lot less than I7 does. I6 lets you indent all you want, but I7 punishes you for hitting the tab an extra time.
The one-size-fits-all process requirement is completely at odds with human nature, and violently at odds with the creative nature. The people who lie down and wear the chains of I7 are probably accustomed to wearing the chains in other areas as well. I strongly suspect, that beyond politics, that people who are used to doing things in a top-down, logically straitjacketed, order from begin to end with no deviations are not in fact conservative, as some might think. However, they do desire a world that can be perfectly controlled as they perfectly control their games, their writing, their relationships, and so on. They have a command economy sort of life. Like the gargantuan hubris that produces such monstrosities of economic failure such as Kensianism and Socialism, we have I7 in the realm of game design — a command-economy manacle manufacturer for the mind, that produces a world where everyone is the same, everyone wears the same dirty tweed pants, marches in line to the same bread lines and sings the same forced songs, while the rifle butts of the soldiers collapse ribcages and kill the will to live free.
A fundamental misunderstanding of the human nature coupled with the mad hubris of the self-righteous leads to horrors (Hitler, Lenin, Stalin, Pol Pot, Mao, Mohammed). While I have no suspicion that I7 will lead to the gulags, the gas chambers, or the minarets, it has done its part in adding to the dominion of evil, for it lies about how people think, lies about how artists think, and tries to force us all into a restrictive mindset.
It will fail like a spectacle, like the Hindenburg.
It’s time to sum up where I’m at on my IF projects, mostly for my own sake so I can remind myself to get off my lazy hump.
[W] Brickhouse – ALAN
[M] Burn the Koran and Die – I7
[D] Marelithia – RenPy
[M] New Cat – I7
[D] Occupied – I6
[W] Seasons — I6/Glulx
[M] Zegrothenus – I6
The chart measures state and intensity of effort, with brighter colors regarded as more intense; green is working; red is blocked; brown is design; blue is maintenance; grey is stasis (no active development). My development process goes from design -> working -> maintenance. Stasis is a state for projects on the back burner or projects that I’ve decided not to update any longer.
Individual project comments:
- Brickhouse — Yeah, I need to get back to this.
- Burn the Koran and Die — I have some feedback I’ve been avoiding (mostly because I expect it to be obnoxious), but I doubt there’s anything left to do on this one.
- Occupied — This will be a lot of fun to write. It’s going to be a political satire of the Occupy movement. *rubbing hands together in glee* This should virtually write itself.
- Marelithia — Medieval dating sim. Ren’Py has come a long way. The big holdup for this will be the graphics, because my drawing skills are rudimentary. But I figure if I do line art and then apply a sepia filter to it, it will evoke the middle ages the way that the Avernum series does (the first four games, anyways).
- New Cat — I probably will update this again someday, but right now I don’t feel like it, due to an obnoxious review(er) on IFdb. New Cat took a good six months of my life, had no beta testers (despite several calls for them) and now the complainers show up to berate me? A hearty “screw you” to all such unhelpful people — especially when the contact info is in the game. Private emails I do a reasonably good job of responding to, but public humiliation doesn’t motivate me in the slightest.
- Zegrothenus — I have some feedback from a while back that I’m churning through. Now that I have some vacation time, I can put some effort into it.
I’ve been hanging around the IF forum for a while now, and there is a commitment to use the still-in-beta I7 that puzzles me. Two particular misunderstandings leapt off the page at me.
One is that people generally recognize that the Inform 7 docs suck (as I’ve pointed out in several articles here, and here), yet they continue to use the language anyways. Why? Maybe they were where I was, thinking that their game was small enough, or easy enough. Maybe they think that other people learning stuff and telling it to them piecemeal on a forum is enough. Maybe they have some kind of faith that the docs will eventually end up in a useable format.
If it’s the first of these, I can understand that pall of benighted intellect; I too thought I7 was a realistic environment for a game of about 20 rooms. I was wrong, and while my code didn’t end up look as bad as Weischaupt Scholars, it got uncomfortably close. If it’s the second reason, they are fools and are doomed to be frustrated, and if it’s the last, their faith is horribly misplaced.
After three years in beta, the Inform 7 docs are not going to reach a state of usefulness any time soon. They are not written like a technical manual and in order to get them to that point, they will have to be rewritten entirely (see the whole rationale here). In other words, there’s a reason why other manuals for I7 exist. Even they are not enough, as the frustrated folks on the forum attest.
Another person blithely thought that someone could learn English by learning I7. *expression of gape-jawed incredulity* That statement would deserve a pass if I7 modeled English’s word-order flexibility, its natural synonyms, and its general robustness (leaving out an article doesn’t render the sentence wholly incomprehensible, for instance). However, I7 does none of these things, which guarantees that prospective learners will not understand English, but at best will master elevating their own heart rate unproductively. Unfortunately, they will learn how to despise a caricature of a language, and believe that the caricature is the language itself.
First, I7 assumes that there’s only one way to word your sentence: e.g. Now the boat is floating (works), is not the same as The boat is floating now (fails). Learning I7 would not teach anyone about English’s word-order flexibility. You would learn a set of arbitrary rules, not the language, and even those rules would be erroneous (that ‘now’ must come first in any sentence is wholly false).
Second, I7 teaches that words have few or zero synonyms, which is about as far from the spirit of English as possible! It teaches that you can never use options as choices for verbs or prepositions — that selling the baby or the sock doesn’t make sense. Yet, that phrase is structurally sound English and simply comprehended. Another example: the phrase in the bathroom or the bowl, likewise isn’t understood by I7.
I7 was never designed to be English, so any dreams of learning English by learning I7 are woefully misconstrued. Other computer programming languages, although they using a handful of phrases in idosyncratic ways (with in VB, for in C, picture in COBOL, etc), do not read like English, and at best read as some sort of pidgin language. The text surrounding their appropriated phrases is clearly not English and that makes it easier/easy for the programmer to craft a separate semantic space for the new language. When learners scan a block of text, they are able to tell quickly, “Ok, this is VB. I will understand ‘with’ in the VB way.” However, Inform7 doesn’t allow you to do that. When you look at I7 code snippets (not real games — they look like this) at first blush, they seem to be English — only, frustratingly, their words don’t mean what English words mean. So you have to keep reminding yourself that this is not English and that the words you see don’t mean what they mean in English and most frustrating of all, that they can’t be used like English words. The lack of typical programming language constructs confuses and makes understanding the language a constant challenge, because whenever you attempt to use I7 like English, there’s only a small chance that you’ll guess what its idosyncratic designers designed the language to do. Programming in Inform is much like learning to conduct a symphony with your right hand when you are a southpaw that suffers from hearing loss. The context doesn’t help you interpret the language. It tells you that you are reading or writing, and you aren’t.
Finally, what I7 teaches the prospective English learner about English itself is that it is: changeable by only a few (false), highly resistant to change (false), that it does not adapt to the needs of its learners (false), that it consists of a maze of one-way streets (false), that it is poorly documented (false), that it is brittle (false), and that it is unsuited for long works (false).
If I had realized earlier the true nature of I7 (brittle, deceptive, poorly documented), I would not have used it for New Cat. I would have gone the I6 route or even the Alan route. What did I learn? Even a relatively small game will end up in pages and pages of confusing quasi-English that becomes almost impossible to parse. The problem there is that the prose isn’t a narrative, so there’s no built-in way for you to understand it, and artificial distinctions don’t make sense from a linguistic perspective. As a point of comparison, Seasons is ten times the size of New Cat (at least) and because of its semantic shortcuts and non-English nature, it is only a quarter more difficult to understand.
Liberate te ex infernis.
If you’ve played New Cat, then you already know that included in that game was an extension responsible for the relative directions and describing exits. This is a hefty upgrade of an existing extension, Directional Facing by Tim Pittman. Anyhow, I’ve submitted V2 to the I7 extensions page, but if you can’t wait, download it here. (Note: I saved it as a text file and added underscores to avoid any browser/OS complications.)
Yesterday, I realized that Inform7 will not be fixed; the public bug-tracker and the suggestion board are nothing more than the usual smoke and mirrors, the customary shell game conducted by people who wish to appear open and committed to principle, but who in reality, are not. It’s a whitewash, and the developers (and their coterie) remain wedded to their own particularities instead of a consistent vision.
Although the problems I reported inevitably ended up being classed as “cosmetic” rather than design flaws, I still had hope.
Although I saw no action on the ideas I had suggested on the suggestion board, I still had hope.
I lost hope when the justification for not fixing a bug was, “that will break existing games!” That one moment revealed a deep-seated resistance to consistency, and then I knew that the gig was up.
What Inform 7 is, in the end, is nothing more than a petulant toy that bears the imprint of all the idiosyncrasies of its designers. It is not serious; it will not be serious; it cannot be a world-class language. It is, and forever will be, just another oddity. That this is a shame goes without saying, but it is a shame because the designers of the language refuse to commit to principles of design.
Yet another bad design decision, courtesy of the modern artists over at I7:
You are one ugly dude. [if DirtyHands is true] Your hands are dirty.[end if][if WetHands is true] Your hands still smell like pomegranate.[end if][if BathCat is true]Your hands are scarred due to misadventures in cat-bathing.[end if]
Instead of one status paragraph, the above code produces one paragraph for each condition that is true. This doesn’t make sense, as nothing in the paragraph clues you in that the language will behave like this. I filed a bug on this and it was rejected because “It’s been that way since the beginning.”
It doesn’t matter what GAMES will be broken; it matters whether this makes the LANGUAGE more consistent, more English-like, and easier to learn. How many revisions of Inform have broken games, anyways? Just about every other one, right? Yet this won’t be fixed. *facepalm*
Inform 7 itself has become a grande example of how NOT to design a language; either you live up to your goal of making code that reads like English, or you design yet another halfbreed language that requires users to learn specifics instead of principles. This all feels like I voted for “hope and change” and got $4.00/gal for gas, 10% unemployment, a crushing debt, union violence, and my health care in the hands of government.
Anyways, this is a bad decision because:
- The functionality is invisible. Nothing in the code informs the author that a line break is included after each sentence.
- The functionality is illogical. Why does a period indicate a new paragraph? It doesn’t in English, and yet Inform 7 claims to generate code that reads like English.
- The workaround makes no sense. The answer is to put a period in the next part of the condition instead of the first part, yet why would anyone naturally do that? It’s silly to have to break up complete sentences because the Inform 7 preprocessor will automatically throw in line breaks if you don’t! Again, the author is forced to know the particularities of the preprocessor in order to write the game. So much for that Natural Language Programming thing, I guess.
Again, Inform 7 is like natural language, only when it isn’t. I can’t wait to get done with New Cat so that I can turn my back on this mess once and for all.
One of the things that bothers me about Inform 7 is that it’s woefully inconsistent. This makes learning the language hard, and harder than it needs to be. If the prospective programmer/author can’t learn general principles, then he has to learn a sea of specifics. Which of the two leaves him better able to master the language? For certain, it is not the latter. The latter is a brittle system that leaves the learner timid, uncertain, and unwilling to go beyond what he has learned, because all he knows are a set of specifics which do not make much sense together. In the former case, the learner is encouraged and supported in his creativity by the language itself. The former case is like giving someone wings; the latter is like surrounding them with an army of kobolds, which bang them on the toes every time they step outside of the circle.
Now, here’s a specific case of I7 inconsistency:
Say “You jump artfully to the floor and land on all four paws.”;
Now elevation of player is 0 feet;
Move player to location, without printing room description;
This fails to compile, of course, because the last line omits the article “a” before “room description.” I kid you not. This is inconsistent, not only with objects (which can easily be created without an “a” or “the” at all), but it’s maddening from a learnability perspective, senseless from a linguistic perspective, and it’s schoolmarmish and lazy from a coding perspective. The code here was not written with the linguistic sensitivity that I7 claims; it was written to find THAT EXACT PHRASE. The article can safely be omitted without compromising the understanding of the sentence. There is no need for the parser to look for a phrase that includes the article and doing so feels like a ruler rap across your knuckles.
I7 strikes again.
Instead of doing anything except kwhirling’ (source text, line 1795), which seems to introduce a rule taking effect only if the action is ‘doing anything except kwhirling’. But that did not make sense as a description of an action. This looks like a list of actions to avoid: ‘kwhirling’ only made sense as a named kind of action, which can be used on its own but not in an action list; so I am unable to place this rule into any rulebook.
This code will produce the above error:
Smelling the tree is kwhirling.
Climbing the tree is kwhirling.
Instead of doing anything except kwhirling:
The problem here is yet another bad design decision, specifically, inconsistent design. All actions can be placed in an action list except named actions, which forces the user to remember that there are multiple kinds of actions and furthermore, to remember that some can be used in some places, and others in other places.
Sigh. The I7 designers really need to learn a thing or two about being consistent.
You know, sometimes programming sucks, especially when you’re at the mercy of other people who use English like silly putty.
Recently, I decided to use backdrops in Inform 7. I went and read the docs (3.9). Ok, all was well and good. I had a statement like this:
Carpet is a backdrop in Urinal Mint City, Defecatory, and Turdopolis.
Defecatory is a room.
When I compiled and ran the game, the first room turned out to be Urinal Mint City! I was stunned, and it chewed up probably an hour of my life figuring out what had gone wrong. So, I opened a ticket. In return, I get this.
Yes, I feel that the documentation is inadequate. That’s mostly because the DOCUMENTATION SAYS NOTHING AT ALL ABOUT LISTING A ROOM IN A BACKDROP DETERMINING WHERE PLAY BEGINS.
The problem here is that Inform7 attempts to use natural language — only when it doesn’t. So you have a freshly-minted newbie trundling along only to hit a pothole; he says, “huh?” and extricates himself. Then it happens again, and again, and again. Or, you have the case of a programmer who is trying to make the switch to a psuedo-NL construct and finds that he really can’t trust anything he reads or types.
Specifically, to say that listing an item in a list “defines” a room is so foreign to me and probably most other people that I’m speechless. What sort of definition does it give to an item? None! It says that backdrop is in that, but what that is, is wholly unknown. Even if you wanted to say “From the compiler’s perspective, it indicates that the items are rooms and that they exist”, that’s fine — except that there’s no defining of the room in English! It’s a forward reference people! That’s all! It’s no definition! And anyway, why is being listed in a backdrop, from a human-understanding perspective, saying “This is where play begins”? No-one would ever deduce that by looking at it, and I thought the goal of Inform7 was to make readable code? The website definitely implies it!
The problem here is that instead of making a design decision that makes sense — listing items in a backdrop will place them into a backdrop — and leaving it at that, I7 has decided this: “The writer must know that placing rooms in a backdrop will tell the language that the rooms are being defined, and thus, that game will start in the first room listed.” This forces the writer to understand what’s going on in the compiler, which means that the entire abstraction of Inform7 has been discarded.
Now we have to be aware of what the compiler is doing when we write code. Lovely. If we’re going to do that, why don’t we just use Inform 6? This whole ping-ponging back and forth is so tiresome. Just when I think I’ve got my game done, I’ve discovered another shortcoming of Inform7, and worse, when discovered, I get some holier-than-thou blowback about it “being by design”. Why don’t the people at I7 just admit that they don’t have a consistent design philosophy except that the language is assembled by whim?
I don’t mind learning a new paradigm, but when the paradigm is just what a handful of people have decided to do, then learning it is impossible, because there is no regularity.
Here’s more things that I wish were part of the language.
- Synonyms, synonyms, synonyms. Human (for person). Getting for taking.
- Allow a variable to be substituted for a number in the phrase “for ZZZ turns”. Right now, you can only use a bare number value here, which is poor programming practice.
- Condensed statements. Allow “X is a male person.” instead of “X is a person. X is male.”
- Showobj. What happened to this? In debug mode, you still have purloin, and showverb, but no showobj.
- In a rule, a verb that can take two or more objects. You can say “Instead of burping or changing the baby”, but you can’t say “Instead of taking the orange or the sock”.
- In a rule, allowing in to take more than one room object. You can’t say “if sock is in Bar or Bathroom”.
- A way to remove objects from scope explicitly. Right now you’d have to examine every object in a room to decide whether to put it into scope, because once you put a room in scope, you can’t take any of its objects OUT. *facepalm*.
- Allow synonyms for verbs easily. You should be able to say “Understand pee/potty/tinkle” as urinating. You can’t. You have to define urinating and then three separate verbs understood as it.