All Projects Status: January 2013
Ok, it’s time for some more status-taking and evaluation.
[W] Brickhouse — ALAN
[W] Seasons — I6/Glulx
[D] Marelithia — RenPy
[D] Dearbornistan — 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.
Active project comments:
- Brickhouse — Yeah, I still need to get back to this.
- Seasons — I’m working on this on a daily basis almost. So far, spring and summer are winnable, so that’s 1/2 the seasons right there. Winter is about 80% winnable, and it should be completely winnable in a month or two. That leaves autumn, the end game, descriptions, alternate paths, music, hint guide, and the whole testing campaign.
- Marelithia — I need to get back to this.
- Dearbornistan — An elderly woman tries to survive long enough for her son to come to Dearborn, MI, and get her out. I love this concept, of playing an elderly person because the puzzles write themselves due to her physical limitations. It also folds in care, concern, and respect for elders just because you have to deal with what she deals with, and it’s gothic because your body is fighting against you. Of course I get to expose the decline and fall of yet another American city to the Islamists, too.
Completed/abandoned project comments:
- Zegrothenus was finished in 2012, so there’s no maintenance associated with that.
- I doubt I’ll ever get around to New Cat or to Burn the Koran and Die.
- I don’t think I will do Occupied either, because while it’s a target-rich environment, I can’t come up with much of a plot.
Cutting Down on the Verb Explosion (Tales of the Test Book)
I discovered that I had way too many verbs in my latest WIP, Seasons. Now I don’t mean player verbs, but rather testing verbs — the verbs that only I (and maybe beta testers) would use. You know those verbs: the secret ones that give you points, move objects around, or whatever, so you can test a particular area of code. While reading through the IDG on the consult verb, I hit on something. Why bother with consult when you can do the same thing, only easier, with parse_name?
So instead of having twenty testing verbs, now I have one:
Verb 'Test'
* noun -> Test;
But I also have a test book:
MyObj testbook "" hldclz
with
space 1,
weight 1,
realword "",
parse_name[;
self.realword = NextWord();
return 2;
],
invent[; print "testbook";
],
react_before[;
Test:
if (self.realword == 'ak') {...}
if (self.realword == 'mans') {...}
];
What this does is make all of your abbreviations or mnemonics synonyms for the book itself. If you were to pick it up, you could type ‘get ak’. However, since you don’t care about manipulating the book, only testing sections of code, the physical aspects of the book are immaterial; you can call it anything you like, and as long as what you name it doesn’t collide with any real objects in the game.
This may not be strictly necessary, but it makes for elegant code that can easily be turned off when debugging is over, with the usual #ifdef DEBUG / #endif; wrapper.
Juiced GS does the IFComp
I really dislike having to post about this, but JuicedGS, the premier Apple ][ print mag, has got it entirely wrong with this endorsement. IF has moved beyond the limitations of the Z8 machine, which means that IF on the A2, C64, Atari, TRS-80 and other 8-bit machines is just about dead. Not only that, but JGS unnecessarily dipped a toe into the frothing waters of IF politics. Did they understand just how toxic the contest is? It's always been just a popularity contest for people to ooh and aah over others' works, and God help you if you're not popular. Then, no matter the quality of your work, you'll be flayed alive. Is endorsing such a shark-fest really in the best interests of the magazine?
I'm pretty sure they saw an overlap of interests and stopped there, without researching what lies beneath. I love the Apple ][ to death, have always respected JGS, and I really don't want to them mixed up with the toxic environment of the so-called "IF community". But it's their choice, not mine. I just hope that it doesn't come back to bite them, though I strongly suspect that it will.
Expressivity of Logical Constructs
Concise code becomes more and more of a necessity the longer the project becomes. While you can wade through inefficient code when there is only a small amount of it, doing so when the project is immense is something you do not want to do. The latter wastes time and makes the code difficult to understand, which impedes finishing the game and makes debugging a nightmare. To cut to the chase, to make long games, you must use concise code, and to make concise code, you must leverage the expressivity of logical constructs.
Now, to make concise code, you must first notice something about the expressivity of the logical constructs provided to you by the language that you are using. INFORM and many others provide booleans, which can take two possible states. Booleans are easily readable but not very expressive, for that reason.
Integer variables are multi-state; that is, they can take on the range of values that belong to integer numbers. These variables can express far more than two states, which makes them more expressive. However, some readability is lost when using them. Compare two implementations of a wand that must be turned, expanded, and charged prior to use:
turned false,
expanded false,
charged false,
react[;
if (self.turned && self.expanded && self.charged) ...
!-- 1 = turned
!-- 2 = 1 and expanded
!-- 3 = 2 and charged
state 0,
react [;
if (self.state = 3) ...
Let's leave aside the difference between the two, where in the boolean example the states can be wholly independent of one another and in the second, they are presumed to be part of a sequence. I've found that a sequence generally mirrors the real world of objects more closely than a situation where everything can be done in any order at all. For example: driving a car. You can't put the key into the ignition before you get in.
However, note that the integer variable is less readable. This loss of readability may be why languages such as C, C++, Java, and so forth came up with enumerated variable, which allows you to define the states that a variable can take. I really wish INFORM had this.
The only thing you can do in INFORM to approximate enumerated variables is to define constants for each value in a range, and then use that range ONLY with certain variables (or at least use them where there is no confusion amongst variables). For example:
Constant red 1;
Constant blue 2;
Constant green 3;Object button "button" nowhererm
with
name 'button',
color 0,
description[;
if (self.color == red) "It is red.";
if (self.color == blue) "It is blue.";
if (self.color == green) "It is sea-green.";
];
You still have to unpack the meaning of self.color for the user, as the language has no concept of green, blue, or red, except as integer values.
The language should handle these difficulties, rather than making the programmer program to fit what is simple for the parser or interpreter. For INFORM, I wonder if the enumerated type is something that could be bolted on to the language, but defining constants comes close enough for now. I suppose that a regular expression pre-processor could be written to handle such things, and that could be part of the build process, too. INFORM 7 has something like enumerated types, and it’s just a preprocessor for INFORM.
Actually, I Did Build This
By now, I trust that most politically aware people have seen at least some of 1001 memes generated by President Obama’s incredible speech. Here’s a few examples so that you can get a flavor:
How does this apply to me, you might ask?
Intaligo is a company, albeit a very small company. It employs one person, who is paid very little (me). Its income stream is barely above zero, but every game, website, and help manual – I built it all. Through the storm of opposition, despite haters’ profane reviews, being ignored, hours of late-night coding, theft, and on and on, I persevered. These games are the result of my hard work, sweat, tears, and blood.
So who exactly has been helping me all these years? *bitter laughter* That would be NO-ONE, Mr. President. So yeah. Actually, I did build this. Now go play some golf or go on vacation before you reveal something else embarrassing about how you think.
Hat tip to everyone else who has created an IF game or runs an IF-related business.
Optimization In The Fair
So what have I been up to these last two months?
I’ve spent most of my free time working on Seasons. It took me a few days to get back into it, but now I’m usually cranking out 2+ hours a night. So what progress have I made?
I started on winter first, and made puzzles work there. After tacking back and forth, I decided to finish up summer, since it was further along already. Specifically I’m in the fair area. However, in the fair, there are tickets. Tickets means handling parsing problems like ‘give 5 tickets’. That gave me a headache for a while, but it now works.
Besides that, it’s the usual stitching things together and making sure that there is a way to complete all the puzzles for that season. I’d say on that front I’m over half done.
On the horizon some is some clean-up and optimization work. I can’t afford to leave that until the game is all working, because then I will forget how certain parts work. I think this kind of program/optimize cycle is a good way to work, because when you do get done, your overall project is functional as well as lean. And leanness is important, because in a work of sufficient size, every little bit of complexity makes the entire project that much harder to understand. I’m convinced that the only way to achieve a truly complex (and engrossing) work is to have the components be as simple as they possibly can be.
Textmate Inform Bundle 2.0 for Inform 6
Ever since I downloaded TextMate, I’ve been living in coding Cloud 9. Coding DEX = Coding DEX + 5! I even bought the product. That’s how awesome it is.
However, the Inform bundle was way out of date and rather limited. I sure wasn’t going to stand for a regress in my working environment! Must have syntax coloring. Must have function listing/navigation! So I went to work, delving into the madness of regex and fiddled around a bit until the power of the Inform bundle exceeded the power of my old BBEdit Inform bundle.
Now the TextMate folks have this in source control, so it may be a while before it passes their process and becomes official. However, if you want it now, pssst…over here! Unzip this to your ~/Library/Application Support/Textmate/Bundles directory and enjoy!
Zegrothenus 5.0 Released
If you haven’t played Zegrothenus before, now you have even fewer reasons to avoid doing so, as this release corrects many errors, and the game is now more humane with more commands, more hints, and not a few player-friendly improvements.
Download the game from the IFDB (in a few days when they catch up), or from Intaligo, and if you are in the mood, stop by the official site.
This is the last release of Zegro. I hope you enjoy it. It’s been a long, strange journey.
Soft Censorship
I have noticed an increasing din of calls for books, movies, comics, sites, games, and so on to be banned on the basis of their content. That was distressing enough, but it really hit home when it’s your work that they want to ban. Not that these anonymous haters have any real power to ban, but they would if they could; the tendrils of censorship hit home and they strike deadly cold.
Again, it’s one thing when such calls are on the basis of prurient content. There’s a longstanding tradition and rationale of pornography and obscenity being excluded from the category of free speech, and if I was producing sexually-explicit content, I’d have to take my lumps like a man. No worries. But the argument used is simply this — “I don’t like what you have to say, so you should have no right to say it.” Some people become a little bit more convoluted and vague with their claims of “public interest” or “public discourse” but all that really means is that certain viewpoints are accepted, while others are not, or the same goes for certain styles (i.e. you cannot make death metal; everything must be tepid jazz). Where does someone gets off on telling anyone else what perspective must be held and how one must express themselves especially when morality is never a factor in the argument? We all have preferences, likes and dislikes, but to say that I must paint like Renoir, or that I must write like Hemmingway? Really? It is, to laugh.
And that’s what I’m doing. I laugh, the way that the librarian laughed in Bradbury’s Something Wicked This Way Comes. He laughed, and he drew a smile on the bullet before he fired it at the witch. There must be nothing more irritating and annoying in life than to want to ban someone else’s work and be unable to. I can’t say that I’ve ever felt that kind of emotion, because regulating on the basis of content is not something that I feel any need to do. The mental picture I have is a blustering hausfrau, attempting to mother someone else’s child, and that makes me laugh at such hopeless futility. Of all the things to waste your time upon!
The would-be censors, finally, are cowards, quaking in their loafers, fearful of their own demise, and willing to sell out and shut down anyone that increases their unease. History is never kind in her judgment of such collaborators, and suppressed works have a nasty tendency of never quite going away, as William Tyndale will attest.
Alive and Kicking
Although it may not be obvious, I’m still at work here. I just got back into Zegro after a long while of fiddling with WordPress on one of my other sites; it is due for its last update this spring — probably in April, and then I’ll be done, only a few years after the initial ill-fated release. Yeah. I’m sure I could defend myself with some high-falutin’ explanation, but I really just have too many projects going on and I’m not as efficient as I’d like to be. After that, it’s back to Seasons, and I will be migrating my project to TextMate.