Design and documentation journal for my interactive fiction (text games); also reviews and other miscellaneous stuff.

Friday, December 10, 2010

Color Manipulation: Multiply, Saturate, Gray, Brighten, Lighten, Convert, Blend

Free time has been scarce the last couple weeks, due to end of the year holidays and real life complications.  What little I have had has gone into gathering some tools for color manipulation.  (I also did a little more work on the map, room descriptions, and other things that don't require active design integration.) 

Preserved for posterity (and because I have the nasty habit of accidentally saving over code that's difficult to replace): Simple Equations for Color Manipulation, and Inform 7 Code for the Same.

The first big issue is that Inform uses decimal numbers to represent colors.  This is essentially worthless for our purposes.  The only realistic way to work with color is to use the hex or RGB value.  I could also, I suppose, have used HSV, but that's even more complicated to derive than hex/RGB.

Inform doesn't handle hex as a value, and it's not something I'm willing to fool with, so RGB it is. 

An RGB is a kind of value.   255-255-255 specifies an RGB with parts rgb-red, rgb-green, and rgb-blue.
On my first coding draft, I used R, G, and B as parts of a RGB.  Not a good idea - it makes them hard to search for in the code in case you need to replace something.  All my non-temporary variables are now getting real names. 

The downside of making RGB one value instead of three is that you have to be pretty careful with calculations.  The parts are interconnected internally, so careless arithmetic can have very unexpected results.  You also can't unilaterally change parts of a RGB value (ie "Now the rgb-blue part of sky blue is 44.").  This can be a little unintuitive.  Also, you need to watch input: this setup does allow for R values of greater than 255.  And you have to use glulx, because of the size the Inform thinks the values are - it doesn't see 255-255-255, but some conglomerate number.

RGB values are essentially hex values in disguise.  The current version of hex color values uses 6 digits of base 16 to represent a color.  White, the highest number, is FFFFFF, with the first two digits being red, the second two digits representing green, and the last green.  RGB is just the decimal-converted values of hex, with dashes between to mark the color separations. 

So converting from RGB to decimal requires, essentially, converting to pseudo-base 16, and then to base 10.

Section - RGB to Decimal

To decide what number is the decimal value of (colorspace - an RGB):   
    let R1 be rgb-red part of colorspace; [pull out ind. parts to prevent Issues]
    let B1 be rgb-blue part of colorspace; [in hex would be R1R2G1G2B1B2]
    let G1 be rgb-green part of colorspace;
    let r2 be the remainder after dividing r1 by 16; [remainder is second digit of hex]
    let G2 be the remainder after dividing G1 by 16;
    let B2 be the remainder after dividing B1 by 16;
    now R1 is R1 divided by 16; [division w/o remainder is first digit of hex]
    now G1 is G1 divided by 16;
    now B1 is B1 divided by 16;
    now B1 is B1 multiplied by 16; [conversion to decimal]
    now G2 is G2 multiplied by 256;
    now G1 is G1 multiplied by 4096;
    now R2 is R2 multiplied by 65536;
    now R1 is R1 multiplied by 1048576;
    decide on (R1 + R2 + G1 + G2 + B1 + B2);  [sum of conversions]
In all this code, I've gone for steps, rather than one giant equation.  Giant equations have a habit of going horribly wrong, and it's easier to tweak like this. 

Converting from decimal to RGB is similar, except now you're converting to pseudo-hex, but without the actual hex part.

Section - Decimal to RGB   
To decide what RGB is the RGB value of (colorspace - a number):
    if colorspace is greater than 16777215:
        decide on 255-255-255;
    if colorspace is less than 1:
        decide on 0-0-0;   
    let count be colorspace;
    let b2 be the remainder after dividing count by 16;
    now count is count divided by 16;
    let b1 be the remainder after dividing count by 16;
    now count is count divided by 16;
    let g2 be the remainder after dividing count by 16;
    now count is count divided by 16;
    let g1 be the remainder after dividing count by 16;
    now count is count divided by 16;
    let r2 be the remainder after dividing count by 16;
    now count is count divided by 16;
    let r1 be the remainder after dividing count by 16;
    now count is count divided by 16;
    now r1 is ((r1 * 16) + r2);
    now g1 is ((g1 multiplied by 16) + g2);
    now b1 is ((b1 multiplied by 16) + b2);
    let temp-hue be the RGB with rgb-red part r1 rgb-green part g1 rgb-blue part b1;
    decide on temp-hue;
All this is pretty straightforward, although it is sort of embarrassing how long it took me to figure out base conversions again.  I think the last time I did that was sixth grade, and it did not stick.

If you're going to be fiddling around with changing the color of text or background, keeping things legible is a primary concern.  Black/white is pretty much always the best option, but you can get surprisingly good results by figuring out how "bright" a color appears and then using black on brighter backgrounds or white text on darker backgrounds (or vice versa, if you're modifying text colors).  I find the middle values can still be a little challenging, but acceptable in small spaces (ie the status bar).  This decision is how I decide what color text to use on color backgrounds. The equation was yoinked from Nbd-tech.

Section - Dark or Bright   

To decide if (colorspace - an RGB) is bright:
    let X be the rgb-red part of colorspace;
    now X is X multiplied by 299;
    let Y be the rgb-green part of colorspace;
    now Y is Y multiplied by 587;
    let Z be the rgb-blue part of colorspace;
    now Z is Z multiplied by 114;
    now X is (X plus Y plus Z);
    now X is (X divided by 1000);
    if X is greater than 126:
        decide yes;
    decide no.
 So now we're down to the fun stuff.  Pretty much all of this I had to figure out on my own; there's plenty of talk online *about* color, but the actual equations used to make changes are few, far between, and usually written in a computer language I don't speak, often with calls to library functions that I don't have.

The equations are mine, but spit out answers within a small range of error of Photoshop and Gimp (where those values agree) and Photoshop (when they don't). 


100% desaturation gives you pure gray, which should be about the same shade, but minus all the color.  You can this by taking the highest value of R, G, or B, and making it the same (R-R-R if red was the highest value). 

Section - Pure Gray
To decide what RGB is the pure gray value of (colorspace - a RGB):
    let temp-gray be the rgb-red part of colorspace;
    if the rgb-green part of colorspace is greater than temp-gray:
        now temp-gray is the rgb-green part of colorspace;
    if the rgb-blue part of colorspace is greater than temp-gray:
        now temp-gray is the rgb-blue part of colorspace;   
    let pure-hue be the RGB with rgb-red part temp-gray rgb-green part temp-gray rgb-blue part temp-gray;
    decide on pure-hue;    

If you have a hue you want to make more gray, find the difference between the pure gray value and the color and add it to the color.  This can be modified by using a percentage, letting you pull a little color out or a lot.

Hue + (Gray - Hue)(percentage change) = Grayer Hue

Section - To Gray A Color

To decide what RGB is (colorspace - a RGB) grayed/greyed by (amount - a number) percent:
    let pure-gray be the pure gray value of colorspace;
    let R be (rgb-red part of pure-gray minus rgb-red part of colorspace);
    let G be (rgb-green part of pure-gray minus rgb-green part of colorspace);
    let B be (rgb-blue part of pure-gray minus rgb-blue part of colorspace);
    now R is (R multiplied by amount) divided by 100;
    now G is (G multiplied by amount) divided by 100;
    now B is (B multiplied by amount) divided by 100;   
    now R is R plus rgb-red part of colorspace;
    now G is G plus rgb-green part of colorspace;
    now B is B plus rgb-blue part of colorspace;       
    decide on the rgb with rgb-red part R rgb-green part G rgb-blue part B;


This one stumped me for quite a while.  Saturation is intensity of color - the opposite of gray.  Turning "up" the color in terms of numbers isn't intuitive - what do you actually *do*? 

As saturation increases, you're removing gray, so you're going to see the lowest value go to 0.  The highest value, the place where the most pigment is, will stay the same.

Full Saturation Color:
First find the saturation value.  Saturation = (Highest - lowest)/highest. 
Highest value: Highest Value
Middle value (if any):  (Middle - Lowest)/Saturation
Lowest value: changes to zero.

In Inform terms:

Section - Pure Saturation   
To decide what RGB is the pure saturated value of (colorspace - a RGB):
    if rgb-red part of colorspace is 0 or rgb-green part of colorspace is 0 or rgb-blue part of colorspace is 0:
        decide on colorspace;
    let rgb_high be rgb-red part of colorspace;
    let rgb_low be rgb-red part of colorspace;
    if rgb-green part of colorspace is greater than rgb_high:
        now rgb_high is rgb-green part of colorspace;
    if rgb-green part of colorspace is less than rgb_low:
        now rgb_low is rgb-green part of colorspace;
    if rgb-blue part of colorspace is greater than rgb_high:
        now rgb_high is rgb-blue part of colorspace;
    if rgb-blue part of colorspace is less than rgb_low:
        now rgb_low is rgb-blue part of colorspace;   
    let saturation be 0;
    if rgb_high is not 0:
        now saturation is 100 multiplied by (rgb_high - rgb_low) divided by rgb_high;
    let R be 0;
    if rgb-red part of colorspace is rgb_high:
        now R is rgb-red part of colorspace;
    otherwise if rgb-red part of colorspace is rgb_low:
        now R is 0;
        now R is ((rgb-red part of colorspace - rgb_low) multiplied by 100) divided by saturation;
    let G be 0;   
    if rgb-green part of colorspace is rgb_high:
        now G is rgb-green part of colorspace;
    otherwise if rgb-green part of colorspace is rgb_low:
        now G is 0;
        now G is ((rgb-green part of colorspace - rgb_low) multiplied by 100) divided by saturation;
    let B be 0;   
    if rgb-blue part of colorspace is rgb_high:
        now B is rgb-blue part of colorspace;
    otherwise if rgb-blue part of colorspace is rgb_low:
        now B is 0;
        now B is ((rgb-blue part of colorspace - rgb_low) multiplied by 100) divided by saturation;   
    let saturated_hue be the RGB with rgb-red part R rgb-green part G rgb-blue part B;
    decide on saturated_hue;
 Saturating colors by percentages is very similar to the process we used with graying colors, but this time, we know that fully saturated colors will never have highers values than the original color, so a few signs get switched around.

To decide what RGB is (colorspace - a RGB) saturated by (amount - a number) percent/--:
    let pure-sat be the pure saturated value of colorspace;
    let R be (rgb-red part of colorspace minus rgb-red part of pure-sat);
    let G be (rgb-green part of colorspace minus rgb-green part of pure-sat);
    let B be (rgb-blue part of colorspace minus rgb-blue part of pure-sat);   
    now R is (R multiplied by amount) divided by 100;
    now G is (G multiplied by amount) divided by 100;
    now B is (B multiplied by amount) divided by 100;   
    now R is rgb-red part of colorspace minus R;
    now G is rgb-green part of colorspace minus G;
    now B is rgb-blue part of colorspace minus B;       
    decide on the rgb with rgb-red part R rgb-green part G rgb-blue part B;   

This isn't directly related to the function earlier to decide whether a color was dark or bright.  Brightness occurs when the color hue stays the same, but it's pushed towards white; a fully bright hue has one or more values at 255. 

To convert to the brightest shade of a particular color:
Low values (anything that isn't the highest value in the RGB): Low(bright) = Low * 255 / Highest
Highest: Highest = 255

Section - Pure Brightness   
To decide what RGB is the brightest value of (colorspace - a RGB):
    if rgb-red part of colorspace is 255 or rgb-green part of colorspace is 255 or rgb-blue part of colorspace is 255:
        decide on colorspace;   
    let rgb_high be rgb-red part of colorspace;       
    if rgb-green part of colorspace is greater than rgb_high:
        now rgb_high is rgb-green part of colorspace;
    if rgb-blue part of colorspace is greater than rgb_high:
        now rgb_high is rgb-blue part of colorspace;   
    let R be 0;
    let G be 0;
    let B be 0;
    if rgb-red part of colorspace is rgb_high: [highest brightness requires the high values to be 255]
        now R is 255;
        now R is (255 multiplied by rgb-red part of colorspace) divided by rgb_high;
    if rgb-green part of colorspace is rgb_high:
        now G is 255;   
        now G is (255 multiplied by rgb-green part of colorspace) divided by rgb_high;           
    if rgb-blue part of colorspace is rgb_high:
        now B is 255;       
        now B is (255 multiplied by rgb-blue part of colorspace) divided by rgb_high;   
    decide on the RGB with rgb-red part R rgb-green part G rgb-blue part B;   
 Brightening and darkening use the same machinery as for saturating and graying colors. 

Section - Brightening a Color

To decide what RGB is (colorspace - a RGB) brightened by (amount - a number) percent/--:
    let pure-bright be the brightest value of colorspace;
    let R be (rgb-red part of pure-bright minus rgb-red part of colorspace);
    let G be (rgb-green part of pure-bright minus rgb-green part of colorspace);
    let B be (rgb-blue part of pure-bright minus rgb-blue part of colorspace);
    now R is (R multiplied by amount) divided by 100;
    now G is (G multiplied by amount) divided by 100;
    now B is (B multiplied by amount) divided by 100;   
    now R is R plus rgb-red part of colorspace;
    now G is G plus rgb-green part of colorspace;
    now B is B plus rgb-blue part of colorspace;       
    decide on the rgb with rgb-red part R rgb-green part G rgb-blue part B;   
Section - Darkening a Color   

To decide what RGB is (colorspace - a RGB) darkened by (amount - a number) percent/--:
    let pure-dark be 0-0-0;
    let R be (rgb-red part of colorspace);
    let G be (rgb-green part of colorspace);
    let B be (rgb-blue part of colorspace);   
    now R is (R multiplied by amount) divided by 100;
    now G is (G multiplied by amount) divided by 100;
    now B is (B multiplied by amount) divided by 100;   
    now R is rgb-red part of colorspace minus R;
    now G is rgb-green part of colorspace minus G;
    now B is rgb-blue part of colorspace minus B;       
    decide on the rgb with rgb-red part R rgb-green part G rgb-blue part B;   
Additive vs. Subtractive Color 

There's basically two ways to combine color.  Color can be pigments, in the sense that they absorb all but the color that you see, or they can be light, in that they give the color you see.  Pigments are subtractive, because once all of a certain color is absorbed, there's no way to see it again.  If you layer black marker over a sheet of paper, and then use a yellow marker, you're still only going to see black.

However, if you've got a dark room, and you shine a yellow light, you'll get yellow.  Add a blue light, and you'll get yellow + blue light.


One of the filters I use most in Photoshop/Gimp.  Multiply is a way to simulate subtractive color combination.  The basic formula for each value is to multiply the two corresponding values together and divide by 255.

Red1 * Red2 / 255 = RedMultiplied.

It's a useful function if you're simulating paint, dye, or filtering out light.  (For this scenario, we're pretending white paint doesn't really exist - real life is, as always, more complicated than the model we create.)

Section - Multiplying Colors

[Multiply is used for *subtractive* color mixing - paints, dyes.  Things will grow darker as combined.  The formula is each part of the color, multiplied by its partner, divided by 255.]   
To decide what RGB is (basecolor - a RGB) multiplied by (topcolor - a RGB):
    let R be the rgb-red part of basecolor;
    now R is R multiplied by the rgb-red part of topcolor divided by 255;
    let G be the rgb-green part of basecolor;
    now G is G multiplied by the rgb-green part of topcolor divided by 255;
    let B be the rgb-blue part of basecolor;
    now B is B multiplied by the rgb-blue part of topcolor divided by 255;   
    decide on the RGB with rgb-red part R rgb-green part G rgb-blue part B.

For additive color combination, you take the highest value of each part of the RGB value.  Confusingly, there's no actual addition involved.  It sort of makes sense if you think about what happens if you use a flashlight in full sunlight - things aren't brighter unless you shine the light where the sun isn't.  Brightness isn't purely additive.

Section - Adding or Lightening Colors

[Lightening is *additive* color mixing, as used with light.  Lightening takes the highest of each of the RGB values given.]

To decide what RGB is (basecolor - a RGB) lightened/added by/to (topcolor - a RGB):
    let R be the rgb-red part of basecolor;
    if rgb-red part of topcolor is greater than R:
        now R is rgb-red part of topcolor;
    let G be the rgb-green part of basecolor;
    if rgb-green part of topcolor is greater than G:
        now G is rgb-green part of topcolor;
    let B be the rgb-blue part of basecolor;
    if rgb-blue part of topcolor is greater than B:
        now B is rgb-blue part of topcolor;               
    decide on the RGB with rgb-red part R rgb-green part G rgb-blue part B;

Finally, I've included a way to blend colors.  If you use a image editor, it's similar to the way opacity works between layers, and is actually a good model for that white paint mixing problem left over from multiply.  It's also a way to fade or transition convincingly between two colors.

Combination = Original - ((Original - additive)*percentage of additive used)

 Section - Blending a Percentage

[This is an all purpose color-blending option, similar to the general "brighten/saturate" commands.  It is equivalent to the opacity layer in photoshop, where the pigment is a layer on top of the colorspace.]

To decide what RGB is (colorspace - a RGB) blended with (amount - a number) percent of/-- (pigment - a RGB):
    let R be 0;
    now R is rgb-red part of colorspace minus rgb-red part of pigment;
    let G be 0;
    now G is rgb-green part of colorspace minus rgb-green part of pigment;
    let B be 0;
    now B is rgb-blue part of colorspace minus rgb-blue part of pigment;
    now R is (R multiplied by amount) divided by 100;      
    now G is (G multiplied by amount) divided by 100;      
    now B is (B multiplied by amount) divided by 100;      
    now R is rgb-red part of colorspace minus R;
    now G is rgb-green part of colorspace minus G;
    now B is rgb-blue part of colorspace minus B;
    decide on the RGB with rgb-red part R rgb-green part G rgb-blue part B;
These tools allow for pretty fine color control.  Inform/glulx aren't highly accessible in terms of color, but it is possible to make some minor changes that aren't too distracting.

I'm hoping to come up with an automatic sunset generator next. 

Caveat: This is all in beta still, but it seems to work as expected.

Because of the way Inform handles small values, there's always going to be a little variation as numbers approach each other.  A few digits one way or another in a RGB is not readily visible to the naked eye, though, and is well within the margin of error of computer monitors.  There are more complicated formulas that would afford greater accuracy, but it's a lot of extra processing power for very little benefit. 

Tuesday, November 23, 2010

Ongoing Color Work

Color stuff is evolving - I've come a long way since June.  It makes a nice break from actual mechanics because it's so self-contained; apart from hooking it up to test code, I don't need to think about how this piece will have cascading effects into other areas of the world.

Which is awfully nice.

Also, I realized that the color schema had gotten completely out of hand.  I've spent hours and hours importing a variety of shades, only to realize too late that most of the colors were too saturated, too garish, and too neon to work well, and were far too short on grays, browns, and shades that were variations on each other.

So I spent some time thinking about what I needed, and did some palettes and color-mockups.
Seasonal sky/earth colors: Spring, Summer, Fall, Winter, plus temp scale along bottom (alpha)

But in addition to that, I've made the first steps towards an internal color-handling system.  For now, it converts RGB values to decimals and back again (necessary for the way Inform passes colors to the interp), and determines their brightness.  This is particularly useful if you change the color of the status bar; dark colors can be paired with white text and light colors with black text.  It's remarkably legible.

I don't know how strongly people feel about their interp's color choices, though.  I've left the main window alone, but I'm not sure how changing the status bar/borders works with various interps.  Honestly, I've considered messing with the main window, but people's vision is different enough that that's a dangerous area to play with; I've got severe astigmatism and there's quite a few websites that are illegible to me due to the blurring of text. Better to leave that alone, I think.

It's excrutiating to find clear-cut information on standard color manipulation online.  Playing around with Photoshop/GIMP a little, it looks like brightness, saturation, and color mixing are biggies I'd want; other helpful things would be the ability to determine what color family a RGB value is from the value alone.

Naming is a pretty big issue; until now, I've been using color names (ie midnight blue, cobalt blue, etc.) to indicate both shade and color family.  I'm sure there's a way to determine what named shade a particular value is closest to, but it's hard to think of one that isn't time consuming, and it's not really worth it for large numbers.  

- cut out shade names entirely.  Sort of tempting, honestly; many of the color names are sort of silly.  Have you looked at a paint sampler lately?  "Roycroft Adobe"?  Really, Sherwin Williams?  (Downside: no "Ur-grue Black" anymore.)
- have names for the shades that I actively reference in-game, and let the rest go.  (Downside: some shades will look nearly identical but one will be named and the other won't.)
- randomly generate names.  I love the theory of procedural generation, but experience tells me that generated stuff needs a lot of tweaking to be even sort of okay, and I'm not deeply invested in color names. 
- carefully control what gets drawn from what, and make the names derivative.  That is, a mixture of rose + medium gray would be "faded rose", a more saturated version of moss green would be "vibrant moss", etc.  (Downside: time spent with dictionary and thesaurus is approaching infinity.  Fiddly.  Potential for multiple similar shades (moss green + 20% saturation vs. moss green + 50% saturation.)  
- ??
Current development window: three-sided border

Current display border mock-ups look something like this:

The status bar is correspondent with sky color; this gives players access to weather changes and day/night shifts.  What's actually in the status line at the moment is time and date, but I'm also hoping to get goals/reminders up there once they're implemented.  (At the least, emergencies should be easy to put in there.)

There's actually only one description bar implemented (left), but it looks like whatever bug I was experiencing with the interps is gone, so full framing works.  Currently, the bar only changes when the character examines something, but I'd like there to be a somewhat static location bar (for color/mood purposes, mostly).

The bottom line is temperature, although it needs tweakage (particularly the greens).

This setup gives a surprisingly large range of borders; these are a little bit cherry-picked to provide nice contrast, but not much; all the colors (except black) are from the palette above, or the dawn/twilight palettes I'm working on separately. They're by no means perfect, but even playing with the pre-alpha, untweaked versions, I'm pleasantly surprised how much I like them, and how much they add to the sense of the world.

Morning, winter
Midday, early fall
Afternoon, summer

Summer sunset

Cold cave

Friday, November 19, 2010

63% of Bugs are Stupid Mistakes

It turns out that this:

When During Starvation begins:
    discover During Starvation;
    if the player is awake:
        say "You are ravenous."

and this:
When During Starvation begins:
    if the player is awake:
        discover During Starvation;
        say "You are ravenous."
are radically different things.  In this case, it produced a bug where the PC could wake up after a refreshing nap and have *no idea* she was starving to death.  Oops.

I accidentally copied from the sleeping status scene, because the only reason exhaustion would start during sleep is if it'll get cancelled out moments later.

When During Exhaustion begins:
    if the player is awake:
        discover During Exhaustion;
        say "You are very, very tired."
 Man, that is a winning bit of prose there for the exhaustion scene.  I bet I thought it was funny at the time.

Monday, November 15, 2010

IF Comp 2010: Mad Scramble

Am trying to get as many games done as possible before the deadline.  No time to take notes!  No time to let things percolate or sink in! Quite a few of them I'm not voting on, but some are pretty clear. 

I seem to have hit the "horror" section of gameplay.  Or, er, something.  Horror that doesn't seem to want to terrify.  It's like some authors bought all the horror tropes on sale after Halloween last year, and wants to put them to good use, so they're just scattered through the game.  Look, a corpse!  (Booga-booga.)

I *like* horror, dammit, enough so that I was procrastinating on gameplay by watching the borderline hilarious-awful Black Water last night.  I mean, that's dedication to the genre right there.  Black Water was all about the setup, with horrible followthrough.  Spoilers to follow (for the movie, not any particular game.)

Clueless tourists go out into the Australian outback in a boat.  This is not the first clueless-tourist-in-a-boat-in-the-outback movie I've watched, and I know now that boats with tourists are the equivalent of bacon-wrapped doughnuts for crocs.

They are almost immediately hurled into the water, and the rest of the movie is spent with tense music as the characters invent excuses to get close to the water so we can wonder if they're going to be eaten this time.  It is horrendously boring.  (A little actual research would have made the movie minimally plausible and infinitely more scary; crocodiles are predators, and territorial, but not necessarily loners.  They also don't kill people for the fun of it, or leave corpses floating around in the bog.)

The horrible climax involves the girl being dragged around, half-drowned, and carried by the crocodile to a sand dune.  Sole damage to girl: a broken finger.  Then she managed to kill the croc with a single bullet from a gun that has been in the water for at least 24 hours. 

The final shot is the girl rowing out of the marsh.  It's one of those glorious stock shots, because you know what's coming: the camera pulls back, and you see a crocodile!  Or: the camera pans right, and you see a crocodile!  Or: the camera pushes forward, and suddenly a crocodile overturns the boat!  Or something.  But no.  (There is a tiny little frog-splash off-screen, but no pay-off.  Fail.)

I have a point.  What was it?  Oh, right.  I don't give a toss if you include tropes in your story, but your have to make them pull their weight.  I think sometimes people think the set dressing *is* the horror - dead bodies are scary, so having one or two cavalierly strewn about is adequate.  Dying yourself is scary, so including some random and unfair deaths is horrific.  But the more expected and mundane those elements are, the less effect their mere presence has.  Ho hum, says the player, *another* corpse?

Horror is not about the presence of horrific things, or even about horrific actions (although we're getting closer, there).  There's plenty of movies about horrific things (war, rape, murder, Enron executives) that are clearly not genre-horror.  90%, 95% of it, is atmosphere, and to do that, authors have to go there, and embrace what's happening.  Several games I felt were faintly embarrassed by their chosen genre, and never went for the potential their concepts had.  (Or were so unclear as to leave me completely puzzled as to the desired theme, story, or goal of the game.)

So: horror.  Embrace it.  Horror's a neat genre, in that the goal is to provoke emotion.  A lot of genres are defined by the props they bring: if there are unicorns, it's fantasy, if there are werewolves and London, it's urban fantasy, if there is shiny tech, it's sci fi (even if the story is all mythology, it's still classified as sci fi - ask me about Star Wars sometime.)  Horror starts with a definitive goal: make the person on the other side of the screen feel something.  Creep them out, scare them pantsless, give them pause the next time they go to turn out the lights.  Text has the power to do almost every flavor of fear out there.  You don't get jump scares, but that's cheating anyway.  But since you're doing all this with text, you have to craft your writing, even more than usual, because to be successful, you *have* to tap into players' emotions.

In other news, Aotearoa is making me weep soft tears of joy.  The tutorial mode is sort of like a overly friendly puppy that just has to sit on your lap and lick your face this instant, but man.  I want to take this game home and pet it and feed it and call it George.

Ranting aside, I enjoyed this comp way more than last year's.  Better games, I think, and being in the community some really has helped.  I've had a couple interesting dialogs with authors.  I feel burned out, though.  I just don't feel like playing *that much* IF, and I'm sort of embarrassed to realize it.  I don't mind playing 50 hours of video games in six weeks.  But I'm slower with text, and I like time to process everything. 

Wednesday, November 10, 2010

Automatic Dressing

After a lot of fiddling, I have the foundation of a clothing system I'm pretty happy with.  It's strongly based on "What Not to Wear".  I added a bunch of body parts, in preparation for injury and discomfort work and because it's weird that the PC might be able to examine her thighs, but not her arms.

In short:
- Human is now a subset of person, holding both men and women.  This helps tease out animals from people (obviously), but also makes it easier to assign appropriate body parts.  I don't have current plans to implement extensive body parts for animals, but this leaves the door open. It also leaves the door open for gender-change for the PC.  I'm assuming she's a woman, but making this will make it trivial to change, as well as clearing up some awkward checks.
- Humans have 10 standard issue body parts: head, neck, torso, and a pair each of upper arms, forearms, hands, hips, thighs, calves, and feet.  The upper/lower distinction for legs and arms lets me fiddle with clothing (long-sleeved vs. short-sleeved, pants vs. shorts), which helps a lot with the upcoming work on warmth. 
- Not breaking up the pairs into left/right saves a lot of disambiguation stuff that was making me cry.  If it seems important later, I can handle it internally to the object.
- Most of the relations (overlying/underlying) are similar to the original example.  However, the way layering was set up was not robust and required a lot of delicate testing, and didn't work well with things covering multiple limbs (sleeved stuff especially).
- An article of clothing has a list of numbers, which is usually just one long, indicating where an article goes.  The first number indicates the area of the body, to help diminish confusion for future additions.  The second indicates layers away from the skin.  So, layers on the torso go (theoretically) from 10-19, with 11 being the first layer available to clothes.  I don't think I officially assigned limbs numbers, but the torso is theoretically 10.  So 11 is stuff like bras - skin contacting, tight clothing.  12 would be undershirts, 13 would be shirts, dresses, blouses, or other "normal" wear.  I think the highest layer I have is 18, for coats.  (There's a few empty layers in the middle where I could imagine things going, but didn't want to implement them.)
- There's code to "initialize the clothing layers", run at the beginning of the game, which explicitly details the overlaying relations (now every scarf overlies every neck).  Interestingly, if there's more than one layer involved (every bra overlies every torso, every shirt overlies every bra), but the initial article doesn't have an implemented object, just a kind, weird bugs start popping up - the relations only carry through if there are real, physical objects.
- There's some very basic code to get automatically dressed.
>get dressed
(first taking the black bra)
(first taking the old pair of underwear)
(first taking the black dress)
(first taking the black pair of socks)
(first taking the pair of shoes)
You cast about for underwear and put on the old pair of underwear and the black bra.
You put on the black dress over your underwear.
You slip on a black pair of socks, followed by a pair of shoes.
I am not pleased with the spacing, nor with the command clarifications.  And, uh, the writing itself is not the most stellar description of getting dressed ever to appear in literature.  It's still a step up from:

(first taking the black bra)
You put on the black bra.
(first taking the black dress)
You put on the black dress.
[repeat ad nauseum]
Getting a coherent paragraph when there's a bunch of options is a genuine challenge; I'm not quite sure what to do about it.  Maybe it's the price you pay for convenience.  In good conscience, I can't really *not* give a meta-command for stuff like this. There's some significant tweakage to be done, but the core is pretty solid.

Wish List:
- Automatic dressing when the PC leaves the house.  (Harder, because the PC may have to go to a closet or bedroom or other storage space for clothes, get dressed, and then leave.  Also sort of overrides nudists.)
- Automatic dressing/undressing when the PC sleeps.  (Easy, but more difficult when you're detecting for situations where the PC really oughtn't change to pajamas - say, napping in the hammock or freezing to death because the fire's gone out.)
- Dress for temperature changes: if it's 95F, the PC will wear linen, short sleeves, shorts, etc.  If it's -20, the PC will wear multiple layers in heavier materials.
- Corollary to the above: punish the PC for wearing inappropriate things, via messages or more serious in-game consequences. 
- Outfit appropriateness for cleanliness, wear, etc. - PC should prefer clean clothes in working condition.
- Gender - right now, the player will wear a random outfit in the location.  Some of us don't mind men in skirts, but others might care. 
- Habit.  This would really be the ultimate goal, right?  Watch what the player wears voluntarily, and try to copy that.  Not worth the time sink in clothing, I think, but worth considering how the game might detect player preferences, because it would be awesome elsewhere. 

Immediate goals:
- Materials (cotton, wool, leather) for clothing.
- Consider clothing manufacture, and the randomness vs. customization ratio involved.
- Fix the command clarification lists for getting dressed.

Frivolous self-indulgence:
>embroider dress
(with the scarlet thread)
You embroider the black dress with a bunch of huge triangles.
>embroider shirt
(with the scarlet thread)
You embroider the shirt with a couple running dogs.
 >embroider socks
(with the scarlet thread)
You embroider the black pair of socks with a border of fearsome circles.
... okay, I might need to take another look at which modifiers are applied to shapes.

Monday, November 1, 2010

IF Comp 2010: How long is 2 hours, anyway?

(Dear authors I've betaed for: this is not directed at any specific game/comment, past or present.) 

I keep sheets for stuff I should do to be a better beta.  I love betaing, but it's an acquired skill, and I'm acutely aware when reviews go out with stuff I missed or thought but didn't mention.  I feel culpable, you know? Especially if it's stuff I wouldn't notice as an author.  That's one reason that my beta reports are full of nitpicky details.  If some player complains about misplaced modifiers, I want plausible deniability from my own conscience. 

The new note reminds me to set a timer and input times for the author in fifteen or twenty minute chunks.  "Playtime: 15 min."  The thing is, playtime doesn't really correspond to the transcript.  Maybe I spent ten minutes thinking about the problem before getting the answer; maybe I was just fooling around.  I tend to input commands as I think, so I don't stare at a wall of text.  I'm a fast reader, so I may well have a high command:seconds ratio.  Then again, in traditional games, I'm usually well behind the bell curve in actual "progress".  (It floored me when someone mentioned that Portal was an afternoon's project for her; my reflexes suck for a long-time gamer.)

I'm guessing IF - good, juicy IF, where you want to kick the heads and examine things and soak in the environment - is even more variable than most games, but that doesn't mean it's not worth checking in with the authors about, for exactly the same reason you let authors know that their puzzles require psychics with degrees in astrophysics to work out. 

Every year, there's some games that seem wildly short and some that seem wildly long.  By the time betatesting comes around, often bare days before a comp, there's not much time to change that, but hopefully it'll give the authors some sense of rhythm.  And when I say "authors", I mean me, too. 

I've got an idea I'm tickled about, won't leave me alone, but is this an hour game?  A five hour game?  Suitable for IF Comp 2011, or not so much?  Clearly, it's hugely variable, but everyone seems to agree that A quiet evening at home is short, and Anchorhead is long.  

(Sidenote: I'm kind of a shitty judge, in that I have the tendency to wander off and make dinner, and come back to the game, and judge when I feel like it.  I've done pretty good this comp at finishing the games I've started, even if the endings aren't the most positive ones.  But: a) assuming I remembered to check the clock when I started, and b) noticed it was more than two hours since I finished, I don't try to remember what I thought the score was at the two hour point.  In fact, I come up with scores that change as I play other games, and as the experience sinks in.  It's kind of like scoring food on the first bite - that's part of it, a big part, but there's other flavors to come, and maybe after you have a bite of that cheesecake, your brownie won't seem like a 9.)

Thursday, October 28, 2010

IF Comp 2010: The People's Glorious Revolutionary Text Adventure Game

So I'm not really feeling like playing much these days.  I can marathon other games, even crummy games, but IF seems to take more application.  I will try my best not to take out this ambivalence on the game itself, but it's probably worth noting that I'm feeling a little impatient.  I want something juicy. 

The People's Glorious Revolutionary Text Adventure Game needs a better acronym.  TPGRTAG is not awesome. But it's available online - yay! - which is a plus. 

--  The People's Glorious Revolutionary Text Adventure Game --

 If I were wearing a fur hat, and it started to itch, I would start worrying about fleas.  In fact, I'm sort of scratching reflexively.  Because fur itself is usually all soft - it's only the parasites that are itchy. With the current explosion in bedbug populations, I'd be wary of wearing anything those things could be hiding in. 

Bonus points for nice list formatting, balanced by negative points for random uncapitalization.  Dear Authors, I know how difficult it is to get these things right.  In fact, by dint of Murphy's law there will be at least three horrendous eye-gouging mistakes in this paragraph.  But please, for the love of Marx, Lenin, and Snowball, check your text for misspellings, grammar errors, and formatting questionabilities.  Please?

That said, I've attended communist parties, and I can tell you the supplies you need: as much cheap vodka as two college-age students of able body can carry, plus enough punch to make it drinkable, and a DVD of The Smartest Guys in the Room.  And Twister, because nothing cheers up drunken revolutionaries like Twister.

Whenever I enter a command, I get a subliminal message from the game, but I can't tell what it is.  Something about "thanks to" and "Glorious".  Probably nothing, but it's kind of distracting.  I didn't notice this on any of the other online games.  Also "enter" from the help menu does nothing, which is bizarre and makes me wonder if the capatalist infrastructure is already broken.

Aww, no custom response for >WAVE FLAG?  :( 

Also, >TALK TO SEMENOV is not understood?  :((

Wait, I'm sorry, I seriously have to type out >ASK SEMENOV ABOUT DEVICE every single interaction?  Have mercy.

"The J. Edgar Hoover High School is the premier capitalist youth brainwashing facility in Freedonia."

One day I will found a school, and that will be in my brochure.  

""Trying to supply copies of the Communist Manifesto to the students in the classroom outside this closet," Rosalia says." 

Look, I know how this happens, because I've done it myself.  On the other hand, it's the sort of thing you notice if you test your stuff immediately.  And the spacing is strange.

>x beard
You can't see any such thing. That's exactly the problem.
I laughed.

I wish stuff got added to your list as you found out about it.  Now I have to remember stuff when I have a to-do list.  Sure, it's not a lot of stuff, but that's why I have a to-do list, right?

>x flag
This flag is the hateful symbol of the largest capitalistic nation in the world!

>burn flag
That would be unpatriotic.
Okay, then.

I don't know, I feel like the game is trying too hard to make me laugh, and not hard enough to respond to stuff.  I was in the middle of trying to destroy the government bathrooms when the display went weird - all I got were copies of the line at the bottom, the portion of the acknowledgements just below the game screen ("s Revolutionary Text Adventure Game is brought to you thanks to the Interactive Fiction Competition and p"). 

Save and restart didn't help, and I'm not feeling invested enough to keep going.  I think I saw enough.  It was cute, and I enjoyed playing it.  It's a little long for what is essentially a one-note joke game - by the end, I was tired of everything being a one-liner, and ready to be done.  But it's cute, and I suspect a better puzzle-solver might have been able to finish it before irritation set in.  I wish it tried a little less hard - as it stands, the game is an endless string of one-liners, and after a while, that wears thin.

Still, it's much better than I expected, given the opening.  I enjoyed it, despite my grumbling, and I think it's the most salveagable game I've played all comp.  That sounds like damning with faint praise, but it's really not meant to be.  Polish a bit, fix the spacing, figure out whatever technical issue is going on, tune the characters so they're a little less like those dolls that will say one of six things when you push its buttons, and I think it would be a great game.  Not a revolutionary game (hurr), but fun and quick and amusing.

Friday, October 8, 2010

IF Comp 2010: The Bible Retold: The Lost Sheep

I'm a big fan of retellings of myths and fairy tales and legends and literature.  I am a huge, huge fan of Jonathan Goldstein.  I am also acutely sensitive to evangelization, so I hope this isn't preachy.  Every so often, myths need to be recast to make sense, and given that there really aren't many sheepherders anymore, this could probably do with some updating.  I also like the recursiveness involved.  Even if you take Jesus as a historical, actual dude, we're essentially dealing with an interactive game based on a translated account of a retelling of a story by a guy who was making a point some 2000-odd years ago.  Which is kind of weird, actually.

Oh, hey, spoilers.

---The Bible Retold: The Lost Sheep ---

Typo in the first sentence.  Ouch.  I think I need to adjust my expectations downward a bit.  On the other hand, the game is (theoretically) always winnable.  Good.  After Oxygen, I need a confidence booster.

>count sheep
(your herd of sheep)
That is either not quantifiable or not of significant quantity.


>kill sheep
(your herd of sheep)
You love them too much: you couldn't bring yourself to do it.
. . . shepherds *do* know what happens to the sheep at Ye Olde Slaughterhouse, right?

"A herd of buffalo lumbers towards you from the east."

. . . the fuck? 

I had already tried taking the tree/branch/etc. when I went by, but clues did not lead me to climb, or to believe the sticks up above might be drier.  

"The sheep - who was in the  bush - yelps and jumps from the bush, clutching a black section of its wool, where you burnt it."

It's . . . clutching?  HOW?  WHAT?

Okay, so I found the cowering sheep, and carried it home on my shoulders.  I'm happy, but the sheep seemed happier romping around on its own.  There's probably something snarky I could say here, but I'm going to let it stand for itself.

I dunno.  It was fine.  There were a couple cute bits.  (I particularly liked the response to >FOLLOW SHEEP.)  It was kind of hard to forget that I had a whole flock of sheep that could, even as I rode buffalo and set things on fire, be wandering off a cliff or something.  I mean, didn't I have a backup shepherd somewhere?  Also, I was sad I didn't ever get to pull anyone around with my crook.  It felt more like an intro piece than a finished game - you're introduced to the way the world works (peculiarly) and then thrown a couple softballs, and then - it's over.  Which is fine, it's just not what I expected.  Also, the main character came across as kind of a jerk, and I don't know if that's intentional or just the way I played and read him.

IF Comp 2010: Oxygen

I am pretty sure I have strep throat, which means I can barely swallow unless I am doing so with a mouthful of tea.  On occasion I indulge my masochistic side and swill orange juice, bathing the recalcitrant S. pyogenes in acid.  This burns like fire, but is still better than dry swallowing.  I have consumed approximately 60 liters of fluid due to this need, and can barely sleep because it means that I am not drinking.  The last time this happened, I ended up wandering delirious through the electronics section of the nearest superstore, completely disoriented and unable to remember how I'd gotten there from the hospital two miles away.  So if I start mentioning things that aren't actually in the game, someone drop me an email or something.  Let's see - that'll do for a segue.

Right.  Spoilers.  Possibly for things not in the game, unless my expired Tylenol have kicked in.  Also, non-reviewness.

--- Oxygen ---
"Deprive a person of oxygen, and you kill his body; deprive him of self-respect and you kill his spirit."  - Thomas S. Szasz

There are actually things out there that can't survive in the presence of oxygen.  I wonder if some people are like that - they actually thrive on self-hatred.  Also, I really want my last name to be Szasz.  In addition, it looks like all online games are on a cream background with a peach status bar.  I am not sure I approve, but it could be even more hideous.  At least it's legible.

Oooh, I get to enable sound!  You know, the weird thing about sound is that the explosion sound lasts for 1-2 seconds, while me reading about the explosion lasts for longer.  Thankfully, though, the author did not implement an alarm siren or anything, so I can continue reading in peace.

. . . I think Jefferies tubes are capitalized, and only live on Star Trek.  Am I wrong?  Maybe I'm wrong.  Too sick to google them now.  Googling takes precious energy that could be spent sucking down liquids.  Also, run-on sentence in the first description: "It isn't plugged into anything at the moment, however there is an outlet nearby."

Hey, the ABOUT command includes email and a web address.  Kudos.  Also, kudos for not making me type a bunch of commands to do things: >OPEN PANEL means automatic unscrewing and opening.  This makes me all giddy with good will.  I'm also apportioning a small quantity of good will for the inner monologue voice and attempts to make it interesting, but removing points for incosistency: "The display console gives a beef in response as if to acknowledge your success" is crisp and enunciated, but two paragraphs later we're "gonna be outta luck."  It's not awful, but it is a little distracting.

. . . is it standard operating procedure to leave override cards scattered throughout the ducts?

Oh, man, I can't deal with all these colors and Greek letters right now.  Is there a cheat sheet?

I can't tell if I'm doing things right or not.  There doesn't seem to be much feedback.  There wasn't any affirmative message when I thought I got the oxygen right. 

Oh, I was supposed to talk to the man.  I thought he was critically injured.  Hmm.

. . . and then I got sucked into outer space.

Really promising opening, but the setup was not described well enough for me to have any idea whether my actions were appropriate, which made the whole thing sort of like flailing in the dark.  And I still don't really have a good idea of what I'd do differently on replay.

After reading the walkthrough, I'm only a little more enlightened.  Apparently, I needed to spend more time reading the book (which is what I always do when the oxygen is running out).  Also, apparently I missed the status bar info, because the online interpreter scrolled down too far and it was hidden.  So that was sort of a critical confluence.  In addition, though, I just didn't have a good understanding of the mechanics.  Nitpick: Some combination of card insertion in different parts of the ship decides where the oxygen goes?  This seems like a pretty weak fail-safe system.

A fun game, and pretty well polished, although something of a single puzzle, trial and error game.  I don't feel any urge to replay, though.  It's not really my thing.  I think for players that enjoy this sort of thing, it's probably pretty sweet. 

Tuesday, October 5, 2010

IF Comp 2010: Gigantomania

More spoilers to follow, and non-reviews - just initial impressions/notes.  I seem to recall a David Sedaris piece about men who read stories about giant women.  Well, not just stories.  Porn.  (There.  That should increase the number of hits this blog gets.)  I am hoping this is not porn, but as far as I can tell there's no explicit rule against it.  Still, that story left such a clear impression on me that I'm kind of afraid to hope for anything in particular from this title.  Although I am reminded that the deli down the street sells really good cookies.  Usually large cookies are kind of gross, because it's hard to get the moisture right.  But these are really good.

--- Gigantomania ---

I'm playing the online version of this, too, and I just have to say: Kudos for design attempts.  The peach does nothing for me, but I am heartened people are playing with the options.  Bonus: I've never read any porn with quotes from people with names like dze Jughashvili, so that makes me feel good, too.

Oh.  So, a story about Russia, huh?  Not one of the upbeat periods in Russian history, either.  I can't think of any upbeat periods in Russian history, but things must have taken a swing for the better at some point.  I feel kind of bad about the porn references now.  Maybe I should start reading blurbs before playing.  I'm afraid if I did that, I'd be unnecessarily prejudiced against certain games and I'd never get all the games played. 

Wow.  So I played through the whole thing without feeling a single bubble of vitriol.  That space above is me having nothing vitriolic to say.  Then I had to spend a day thinking about the game, because I couldn't figure out how I felt about the end.  So all the next part is written in retrospective.  (This blog post is like traveling through time!)

My first playthrough ended rather abruptly when all the villagers killed me for not contributing enough.  Which surprised me, because I was carting around like twelve bags of grain and two of potatoes, and I'd expected the collector would just come around and whisk them away.  (I'd even squirreled a bag or two away in my cabin, I think, in case they took everything.)  I'd also thought that the collector needed 10 bags total from the villagers, so I was only planning on contributing one or two.  It turns out that you actually have to hand the bags over yourself.  Life as a Russian peasant is really hard.

This is the first game I've played in the comp where the setting feels rock-solid.  Not that there aren't artificialities, but I can envision in my mind's eye the exact layout of my land, the look of the beggar, the smell of the earth, the huts full of the sick and dying and weak.  For a portion where the bulk of the interaction is typing "harvest wheat" 12 times, this is a big accomplishment.

The second chapter I was just grateful not to actually have to make 44 bars of steel.  It was actually kind of fun alternating turns with pouring steel.  The writing is top-notch.  (I advised my supervisor to lay off my coworkers.  Go revolutionary spirit and black lung!)  There's a line of black humor underlying this whole scene that is just brilliant and heartbreaking.  The downside: I spent the rest of the game, and a good portion of the evening, singing "I am the man who arranges the blocks!"

The third chapter is less awesome, perhaps because I was missing the intermittent boring work.  All I have to do is hide all my questionable stuff - and there's a lot of it.  (Dude has fine taste in music, if not literature.)  I got caught out because my picture of a butterfly was not Russian enough.  The black humor is not just a line in this scene - it's practically a current.

And then.  The fourth chapter. 

I think I am not adequately meta for this chapter.  I *want* to like it, because I think that's what a real literature geek would do.  I would scrounge up a Foucault quote and go all post-modern on its ass.

But it didn't work for me, and it didn't feel like the game ended at the right point - I didn't feel like I had closure on the game, which was a problem because I spent the whole thing is an uncomfortable roil of emotion.  (Mostly in the first two bits, but even some for the poor bureaucrat.)  I didn't feel connected at all to the dictator; worse, I felt like I wasn't even playing any more - I was just reading a one-sided conversation that some half-delusional sadist was having.

Often I could make a trivial choice, like having caviar at dinner, but not a more critical choice, like hanging dissidents vs. giving them a mock trial.  More often, the narrative went with option #3, which was never an option for me to choose anyway.  This was incredibly frustrating, and I could feel the distance between me and the game growing by leaps every time I pushed enter.  Then there were the little letters after pretty much every phrase, which were really distracting.  (The last line indicates they're probably chess moves, but I didn't go back and play them all or anything.)

The narrative of the story was still compelling, but it was no longer interactive in a meaningful way.  Which is why I think I should go all post-modern: maybe the discomfort I felt was an intentional nod to the intoxication of power and blah blah blah.  But it didn't help me get into the story - instead I found myself thinking about my laundry, which may not be where the author wanted to go.  I *did* love Stalin's voice, though, and his no-holds-barred, bat-shit crazy.  I just wish it felt less like looking through the wrong end of a telescope.

But the first three bits were so successful that I still have a warm glow, and I really want to know how the author managed to make typing "harvest wheat" over and over kind of a compelling experience.  I'm also really reluctant to start anything else, because it feels like the game is taking up all my head space - I'm just full of the game and the images and the taste of it, I don't want to put it away yet.

Score:  I don't even know.  7?  8? 10? This is definitely the high bar right now. 

Monday, October 4, 2010

IF Comp 2010: A quiet evening at home

I feel like this title is a setup for something awesome.  Like the end of the title is something impressive: "A quiet evening at home . . . with HITLER."  "A quiet evening at home . . . on the surface of the SUN."  It's got potential to be really 1950's-y, or really 1950's pulpy.  I'm hoping for a sort of MST3K-tastic "Date with Your Family" type deal, myself, full of quiet WTF-ery. 

Fingers crossed! 

-- A quiet evening at home --

. . . this is the most depressing opening paragraph ever.  Man, if this wasn't comp, I'd go find something else.  Please, please don't let the point of the game to be finding and using the bathroom.  I know compelling drama is supposed to be about the small conflicts in life, but please don't let this game be about pee.  I can't go from the surface of the SUN to urine.

Missing period in the first paragraph.  Nothing makes me feel better about the next 2 hours of gameplay than that! 

-- Interlude of deep breaths and happy optimistic thoughts --

What's a half-staircase?  Is it like a short staircase, or does it only go halfway to the basement?  Also, if you describe the rooms in terms of what's on my right, and then don't implement those directions, things get confusing.  Also, capital letters at the beginning of sentences are your friends.

Okay, I can't find my can opener.  Who takes their can opener out of the kitchen?  I am the worst housekeeper in the history of the world, and even I can find my can opener, unless it's migrated to the kitchen sink and is hidden under a bowl or something. 

I don't have the faith to fiddle around on this - straight to the walkthrough! 

. . . oh.  Well.  That's . . . how do I say this in a positive way?  Oh, right.  A non-linear progression.  In other words, completely illogical.  And reading the rest of the walkthrough, I get to take out the trash *and* put the hamster back in the cage!  Wow.  That's . . . great.  I will complete those steps just to say that I did.

I dreamed about being an alien spy, which is indeed more awesome than taking out garbage.

I have nothing very nice to say about this game.  It's basically a My Apartment exercise.  Which is competent, but not very exciting.  That's really the nicest thing I can say about it, so I will just mention that the architect was doing crack, because the long axis of houses should be east-west, to get full southern exposure from the sun, rather than north-south, which gives you a short period of sun in each room (unless you're in an urban environment.  The only room in this game that would get consistent sun is the Foyer, and that is deeply sad.

Oh, and everyone should implement "about", even if it's just to give people your email address.  How can we all follow Conrad's suggestion to send our transcripts if we don't know where to send them?

IF Comp 2010: East Grove Hills

Normal warnings and disclaimers apply - here be spoilers (sort of) and general first impressions of East Grove Hills, which is totally one of those teenage shows on Television Without Pity, like Dawson's Creek or Seventh Heaven.  (Is Seventh Heaven on TWP?  It should be.)  I got this amazing ginger orange sauce this week.  It is good on everything.  I am thinking of making beef stirfry.  Cabbage has a lot of vitamin C in it, and peppers were on sale.  Mmm.  Now I'm hungry.  (The risk of writing spoiler-free paragraphs?)

-- East Grove Hills --

HA, I was right!  High school.  Wow.  That never happens to me.  This one I'm playing online, so no transcript.  That makes me sad, but not sad enough to break the encryption on a library computer to download Frotz. 

Huh.  Interesting.  EGH is written in past tense, which is an interesting choice, especially since it jumps back and forth in time a lot.  It's not entirely successful.  The plot consists of little vignettes around a central event, sort of like Photopia, although the viewpoint remains stable.  The opening is strong, but the lack of interaction really detracts.  The story is structured around an implacable clock: things take place at a certain time.  This is kind of neat, but pretty much anything you type, successful or not, advances the clock.  I spent a lot of play typing three things, then undoing them, then trying something else. 

So few of these were successful that by the time I got to the point where the game hinted broadly that I might be able to save a life, I was not very hopeful.  Indeed, I utterly failed to save anyone.  Not really surprising, given that the main character is a high school student.

The author went to the trouble of rewriting the default responses, which really helped with emersion; unfortunately, pretty much nothing I wanted to do in response to the shooting/bombing helped.  I couldn't help, or hug my dying sister.  I couldn't try to talk the gunners down.  Which . . . is realistic, I guess, but feels so uninteractive that I wonder why I'm playing. 

The other big issue I had was with dialogue.  There's a relatively large quantity of dialogue, but most of it is railroaded.  Ignore a question by "saying nothing", and the game will offer you the same responses again, rather than advancing the conversation in any meaningful way.  A lot of it is pretty stilted (given a humorous nod by the game text itself, which breaks the fourth wall so often they must have the repairman on speed dial.  Bad-dum-dump-chh!).  I think my favorite line was "So let's get to work or something," a line I'm fully intending to utilize at my next project planning meeting. 

And yet . . . I found myself a little charmed.  The game itself needs work, no bones about it, but it tries to be innovative in a couple small ways, and it has a kind of offbeat quirkiness to it that's engaging, although the game itself doesn't follow through enough to be satisfying.

Sunday, October 3, 2010

IF Comp 2010: Ninja's Fate

Spoilers probably follow the break, but this is just buffer space.

I'm always vaguely impressed by writers who get their entries small enough to go into zcode.  It's not really a big deal, but there's a couple extensions I really can't do without that require glulx.  Or I program something memory-eating.  Or I just miss a feature, like larger numbers.

I'm hoping that the "Ninja's Fate" is to die old and surrounded by doting grandchildren, perhaps in a picturesque inn overlooking the winter sea in Hokkaido.  It seems unlikely, but I can hope, right?  Okay, that should buffer enough.

Oh, one final note: these "reviews" really aren't meant for authors - they're just first impressions, and as such not censored.  Sensitive authors may want to hold off reading them; I don't usually get abusive or anything, but I do usually focus on the negative more than the positive, and it may not reflect how I feel about the game in a couple days, when I've had time to digest.

---Ninja's Fate---

"This idol had been the centrepiece of religious worship . . ."
Yeah, when you're writing about *real* people and their cultures, it's really helpful if you get details like, you know, religion right.  This does not sound right to me at all.  I'll handwave it this once, but just once.

Okay, so this is a tribute game.  I started reading raif just before Panks died, so I'm not familiar with him or his work.   

Wait, this is supposed to be modern?  With this kind of characterization of ninjas?  *sigh*  Look, I don't mean to be humorless, but . . . really?  Argh.

The bust is a ghost?

Yeah, I don't think I have enough fluency in the background material to appreciate this game.  For someone who doesn't know the Pank, this seems like a pretty straightforward adventure.  With a maze.  (Why, authors?  Why do you do this?  WHY?)  And weird implementation.  ("kill [x]" results in attacks with your bare hands, which always fail, so you have to type out "kill [x] with sword", which . . . gets old.)

Score: Not sure how to do it, honestly.  I'd give it a 3, but probably won't submit a vote.

Download Complete

IFComp already?  Jeez, time flies.  This year, like last year, I start with the highest intentions: play the games in random order, without spoilers if I can help it.  We'll see how far I get before devolving into only playing the ones that interest me personally, based on the reviews that I can't help reading.

Also, this year will be enlivened by the oncoming Death Plague that I can feel taking over my respiratory system.  It's not here yet, but I can feel the little critters digging past my cilia even now, so I'm probably going to spend a significant part of the comp overdosed on Nyquil.  The perfect state to play games in, not to mention writing responses.  I think I'll probably save comments and transcripts, so I can go back and look at play style a bit later, and then write up impressions if or when I feel like it. 

Random order listing has not failed me - it put most of the games whose titles interest me towards the middle to end, so I have incentive to keep going. 

__: Ninja's Fate
__: East Grove Hills
__: A quiet evening at home
__: Gigantomania
__: Oxygen
__: The Bible Retold: The Lost Sheep
__: The People's Glorious Revolutionary Text Adventure Game
__: Mite
__: Heated
__: Pen and Paint
__: The Bible Retold: Following a Star
__: Flight of the Hummingbird
__: Aotearoa
__: The Chronicler
__: R
__: Divis Mortis
__: Leadlight
__: Gris et Jaune
__: The 12:54 to Asgard
__: Death Off the Cuff
__: One Eye Open
__: Rogue of the Multiverse
__: The Warbler's Nest
__: The Blind House
__: Under, In Erebus

Monday, September 27, 2010

Integrating Help

One of my ongoing goals is to integrate as much help as possible into the game.  FTA isn't really meant to be a beginner IF, but there's a number of new actions and complications that aren't meant to bewilder. 

A tutorial option is Plan A.  I'm putting it off until I'm got most of the mechanics in place, for fairly obvious reasons.  It's a bit tricky, since integrating the tutorial into the current beginning of the game means dealing with different choices people have already made.  Since players have a chance to buy stuff before "arrival", they need guidance through the "what to purchase" phase as well as the "what to do with it" phase.  At this point, I'll probably do a tutorial "build": set all the difficulty toggles to easy, give the stage a set of standard equipment, including the various kinds of things the player should know about.

A separate tutorial that segues into the main game is an option, but the immediate lead-up to the game opening is travelling, not survival, so I'd have to set the tutorial in another time/place, which I'm not thrilled about.  I suppose I could do a separate mini-game theoretically unrelated to the main game, but I really don't like that option - playing a game to get to another game just seems like work.  Besides, I like built-in tutorials in other games.

Of course, not everyone is going to play the tutorial, even if I encourage them to do so.  So there needs to be a readily accessible option for players that are in over their heads and don't want to restart, or for players who played the tutorial but can't remember the specific details.

Secondary to that is a universally accessible set of quick references: the player can type "HELP ON [something]".  For verbs, that includes a description and quirks, the specific command structure to use it, and related topics the player might want to check. 

  Here's the entry for the climbing verb:

This part of the world is relatively flat, according to the survey maps you’ve seen.  There’s a few boulders and maybe an old limestone cliff or two in the region, but there’s bound to be a path somewhere that doesn’t include risking life and limb.
If you’re really determined, you can always try CLIMB CLIFFS.  If you’re feeling less adventurous, you can also CLIMB STAIRSRelated verbs: Go.  Related topics: Injuries.
In this case, the verb help is mostly a redirect - letting the player know that climbing isn't an important part of the game.  (It's alpha text, in case you couldn't tell.)

Other help topics cover the major kinds of things and game concepts: a brief overview, followed by specific uses of the thing in question, or the rules governing it, and the commands for making or using it, with pointers to related topics or verbs used.  The nice thing about this is that (theoretically!) the player can type the name of something she's having difficulty with, and get the proper command structure directly:

Bessie doesn't even budge.


Bessie doesn't even budge.


[Other info, verbs here]

You can move a herd of animals, or a single animal, with MOVE [animal] TO [place].  You can also use the verb DRIVE instead of MOVE.  You'll most often want to MOVE HERD TO BARN or DRIVE COW TO EAST PASTURE

In this example, there's partly a failure on the part of the author, but there's also an easy recourse for the player - rather than playing too much guess the verb, she can skip ahead.  Of course, if I forget to mention something in help, the player is screwed, but if I get it right, then the lack of mention means the player doesn't have to worry about it.

The major upside to doing this is that I'm finding it clarifies a lot of the details of verbs.  I've had ideas for movement, but having to make it concrete, even in a alpha kind of way, helps other things fall into place.  It's sort of like design documentation, but it has an in-game purpose, which makes it easier to write and follow. 

Part of the difficulty I'm having is that I'd like to speak to the player-as-character as much as possible, so ideally I'd like both verbs and topics to be a sort of mental dialogue.  I thought about separating verbs (which are clearly mechanics) from topics (which are actually things a character might think about) by using different commands for them, but immersion loses out over playability here.  Also, by the time the player is asking for help, immersion is already gone; getting her back quickly is more important than pretending she's still there.

Ideally, this is available in a menu-based help system, for those that prefer it, but I'm not sure how feasible that is.  (Also, I hate menus as both a player and an author, so I'm sure that bias factors in.)  A separate, printable document with lists of help topics available might be just as useful.  

The big thing is making sure the interlinkages are present; ideally I'd like to have a response to HELP that redirects the player to a few main topics, which send the player on to specific things.  Sort of a tree thing.  I can't quite come up with a good structure yet, so they're all currently individual (and mostly unfinished).

Plan C was gentle nudging messages; after failure of a certain verb or a certain number of tries at something.  This is basically a redirect to the verb used, but I'm finding it incredibly intrusive and irritating, so it's been dropped for now. 

Other helper type things: The character has a goal list for overarching projects, so if there's nothing to do, she can check her list and go work on a project.

I'm considering how feasible it would be to give the character a sort of "memory" to help prevent crisis.  So if the animals haven't been fed all day, and the character tries to go to bed, she might remember suddenly that she forgot to feed the chickens.  Some damage will have already been done, but not nearly as much as it would be later.  I like this idea, since it's somewhat true to life, and would be easily toggleable for harder difficulties.