diary of an indie game developer

 

What? GDC Happened?

March 28th, 2009

I didn’t actually attend GDC this year.  My (indie-focused) highlights from the outside:

  • Cactus, an indie developer who sometimes cranks out several games in a week, talked about the four hour game design.
  • World of Goo co-creator Ron Carmel talked about going indie.  Slides available in this post, item #2.
  • Dan Cook bitches about the quality of a few of this year’s GDC talks.  (The selection process is quite strict, by the way– but of course, you can’t really know a talk’s quality before it’s written and delivered.)
  • Raph Koster notices that it’s all going digital distribution, casual, mobile, in-browser, everywhere away from the traditional pub->store model.
  • Zombies attack.
  • Sexpigeon happens across GDC:

    Sexpigeon notices GDC

    Who has come to town? It is game developers. They are shaped exactly like comedy writers: soft, pret-a-porter, aware of “how people dress” but amiss in the details. Girls in lycra, of all things, have been recruited to hand out energy drinks.

    (More on the development process, and a poetic note on video RAM.)

QuickBooks Rant

March 21st, 2009

It’s tax time again, and that means it’s time to use the most aggraviting program in the world, QuickBooks.  Here are a few highlights.

  1. I was googling for information on how to order 1099-MISC forms, and came across this helpful page.  Go to that page, and then click on the link to order some forms.  Go ahead, click on it.  Ooh– that link won’t work in your pedestrian little web browser, will it?  No– that link is only for people who are accessing their web help from inside QuickBooks 2009.  They have successfully broken hyperlinks.
  2. How’s this for planned obsolescence?  My copy of QuickBooks 2006 will no longer be able to send email after May.  If I upgrade, I can still send email.  Oh.  I guess the spec for sending email over the internet must be changing in May, right?  Huh.  Or maybe I’m shutting down my own SMTP server in May?
  3. Okay, let’s upgrade.  They’ve got some big discounts for upgraders.  Huh– they have even bigger discounts for first-time buyers, to the extent that they cost exactly the same. That doesn’t stop them from requiring your license number to purchase your upgrade copy, however.

Ah, well.  Not such a huge hassle for filing my taxes.  Oh– except that these are only the problems I’ve hit in the first 10 minutes.

Our Common Web Site Tools and Libraries

March 13th, 2009

Most of our web sites get anywhere from a little to a lot of custom plugin or script work, but recently, they’ve been sharing more and more tech.

When we build a site right now, there’s a solid chance it’ll include:

  • Wordpress.  Thanks to tons of intelligent, progressive developments over the past couple years, it’s transformed from blogging software toin a very nice platform for a small business Content Management System.
  • Carrington, a developer-friendly theme for Wordpress.  Functionally, it doesn’t really “do” a lot– but that’s the point.  It organizes your development efforts so that you can customize a site, without losing track of what logic goes where.  Early web dev tends towards the frontier hackery until there’s enough experience with the tools to start cleaning things up (see: Dojo et. al. for Javascript).  Carrington is the next step in taming the Wordpress as CMS frontier.
  • WP-Super-Cache.  You always need it, but you REALLY need it with Carrington.
  • Prototype or jQuery.  This really depends on if I’m pulling in any external libraries that use one or the other– if so, my decision’s made up for me.  In the absence of any requirement, I’ve tended towards  Prototype (and Scriptaculous) in the past, but jQuery’s syntax is addictive.  It’s a toss-up now.
  • Minify.  This is pretty specific to your hosting setup, but for now we use Minify to keep Javascript and CSS size from dominating page load times.
  • Custom tools.  We’ve got a few tools that have become standard, but aren’t quite ready for posting to the public.  We use a post-inserter plugin on some sites to enhance editability without going all the way to something like Drupal.  We’ve got some automated backup tools, both for site files as well as content, that we use (supplemented by WP-DB-Backup).  And so on.

I’ll post updates as other tools work their way into the stack.  Customizable Post Listings has become somewhat common.  Text Control used to be standard, but isn’t as essential since Wordpress editing got cleaned up.

Word of the Day: Hysteresis

March 5th, 2009

A system with hysteresis is a system whose output can’t be predicted simply by looking at its current inputs.  It has “path-dependence.”  If you want to know what its outputs are, you have to look at the history of its inputs.

Consider a non-hysteresis example first: your stereo’s volume.  If you turn the volume to 50%, it doesn’t matter if you’re turning it down from a higher volume, or up from a lower volume.  It’s going to set the volume to 50%, regardless.

A typical hysteresis example is a thermostat.  If you set your thermostat to 20 degrees, it doesn’t turn on the furnace at 19.9 and turn it off at 20.1.  Rather, it’ll turn on at 18, and then stay on up until 22.  So, if the temperature is 20 degrees, you can’t tell solely from that bit of information whether or not the furnace is on.  Rather, it depends on the history of the input– in this case, the temperature.

In games, we frequently use hysteresis when mapping analog input to digital output, in order to prevent small deviations in analog input from fluctuating rapidly between discrete states.  Like the thermostat, we do this with a “keep doing what you were doing” state.  It often boils down to a bit of code like this, from a blog entry by Shawn Hargreaves:

const float hysteresisAmount = 0.1;

if (inputValue > threshold + hysteresisAmount)
    DoSomething();
else if (inputValue < threshold - hysteresisAmount)
    OtherThing();
else
    KeepOnDoingWhateverYouAlreadyAre();

If you read the above-linked blog entry from Shawn, you’ll get a few good examples of hysteresis in games.  You’ve probably played games which have failed to exhibit hysteresis.  One I’ve seen far too many times: AI enemies keep running towards you, then running away, then towards you, then away.  Hey, AI, keep doing whatever you were doing!

For now, I’m interested in hysteresis associated with player input.  Shawn gave one example: if you push the analog stick just a little, you get the walk anim.  If you push it a lot, you get the run anim.  If the stick is in the middle, you don’t know if your character is walking or running, because we’ve built in a little “keep doing whatever you were doing” threshold in there.

That example is no longer applicable to modern games, which blend between the anims.  Are there other examples of hysteresis relating to player controls?  Where do we map analog player input to digital output?

One example is target selection in a third-person brawler.  Which guy do I attack, when I hold the stick towards a couple of close-together dudes?  The input here is the stick angle, and the output is the target.  Most games will “stick”  you to the same target once you’ve started beating him up, unless you press substantially far off from his angle.  The game cares about the history of the input: “did you start out pointing towards this guy, or that guy?  If your input is in that threshold zone, I’ll keep you pointed at the same guy.”  If games don’t do this, targeting will feel jittery, and your character will look stupid as he alters his facing rapidly between two competing targets.

One tricky part of discussing hysteresis is limiting the definition. Of course games exhibit path-dependent memory– if the order of your button-presses didn’t matter, it wouldn’t be a very interesting game!  So you need to define “system” very narrowly: “If I press this button, do I jump?”

Also, hysteresis describes path-dependence, not rate-dependence.  A good rule of thumb– without trying to get too far into the definition of hysteresis– is to ignore any phenomena that are dependent on time.  For example, if I press the jump button twice quickly, I’ll only jump once (because I’ll still be in midair).  That’s not hysteresis.  We want output that’s dependent on path.

Yikes!  I suppose that’s more than you ever wanted to know about hysteresis.  I’ve been trying to come up with more examples of hysteresis, especially related to player input.  Aside from targeting, I haven’t come up with much.  Let me know if anything springs to mind.

Jason Kapalka (PopCap, Bejeweled Twist) Interview at Gamasutra

February 28th, 2009

I found this interview with Jason Kapalka to be rich with little game design nuggets.  Here’s an example:

We ended up with a hexagonal grid and that played really well, but the problem was anybody who looked at a hex grid just was turned off right away. So we ended up doing something where we kept the hex grid but faked it.

So the hexes got turned into squares, like little tiles, but they’re offset by 50 percent. And that’s just a cosmetic change, but it actually makes the game much more appealing to casual players.

He also addresses some early issues I’ve been hearing about Puzzle Quest: Galactrix.  Because of that, and the universal nature of some of the design issues he discusses, this interview crosses over pretty well between casual and hardcore.  I’ll be searching out more interviews with Jason to see if I’ve been missing out.

@independentcrtr

February 24th, 2009

I don’t know if it’s coincidence or critical mass, but in the span of about a week, three separate groups/people told me that I need to start twittering.  Tweeting.  Twitlurping?  Like Facebook, Twitter has come a long way from its original mission, and is no longer solely a tool for Wil Wheaton stalkers.  (Though they still make up the majority of its users.)

I snagged Twitter Tools (roughly half of all useful Wordpress plugins were created by Alex King in part or in total), so if you don’t Twulu, you’ll still see my [censored]s in the sidebar.  And if you do Twuzzle, you’ll see an alert from me every time I update the blog.  It’s got more functionality, but I’ve opted not to use it.

Also, I’m using ping.fm to update Twitter, Google, and Facebook simultaneously.  Is that irritating to folks who actually check FB and Twitter?  Probably.

Official Fable 2 Map

February 14th, 2009

Thanks to commenter NIK who pointed out that Lionhead’s released an official Fable 2 map.

The 44 meg TIFF destroyed my laptop, so in an effort to destroy my bandwidth, I’ve created a much smaller JPEG for you to download here.  It’s zipped in hopes you’ll download it instead of bookmarking it, thanks. :)

World-Mechanics Synergy: Ultima 4

February 13th, 2009

Jon Blow’s posted the answers to his “Name That Game” competition.  I enjoyed the obvious passion in his writeups more than the answers themselves.  One answer in particular actually got me to go through a few hoops to play the old game– Ultima 4.

He picked the perfect bit of the screen to show in the competition– the moon phases that occupy the top bit of the screen.  It’s an ideal mechanic that combines the evocative image of the dual moons with the simple, delightful puzzles of the moongates.  Despite technological advances, it’s no less a struggle today to replicate that sense of fantasy and mystery.

Interacting With Characters

February 11th, 2009

One of the more neglected forms of agency in games is the ability of the player to exert influence on non-player characters.  In striking contrast to mainstream entertainments such as literature, television, and film, games often seem to dedicate far more resources to deforming terrain than to shaping character responses.

Certainly we’ve all experienced the placid, untouchable quest NPC in the middle of a full-scale firefight, or the shopkeeper who doesn’t seem to have noticed that you’ve killed off the entire town.  When characters do notice your actions, it’s often in the form of a generalized love/hate slider, like World of Warcraft’s factions.

The few stabs games have taken at reactive characters have been successful.  Good/evil games such as Fable often write several paths of dialog for each character.  In KoTOR, you have the opportunity to sway a recovered dark jedi either towards the light, or into relapse.  Watching the consequences of your actions on another feels more compelling than your own good/evil choices.

The Sims pushed character interactions further than any other game to my knowledge.  It communicates the internal state changes of its characters through their actions, as well as gestures and Simlish.

Despite early successes such as The Sims and KoTOR, developers are reluctant to take on the challenges of deeper character interaction.  Understandably so– the topic gets short shrift at game development’s popular conferences such as GDC.  The state of the art is quite primitive.  But players are happy to fill in the details.  Remember, you were once quite happy to accept this as a castle.

Agency In Games

February 9th, 2009

Geoff’s post on the ending to the latest Prince of Persia brought to mind some recent (disjointed) thoughts on agency in games.  What can the player do?  Why is the player there?

Games have responded to that question with a wide range of responses: from the pathologically linear Out of This World/Another World (or more extreme, Dragon’s Lair), to “choose your own solution” games like Deus Ex, to the reactive and interactive worlds seen in Ultimas and GTAs, to player-centeric and play-focused games such as The Sims.  Is the player acting out your pre-set script, or do they have the power to substantially affect the experience?

Some of the most effective, recent indie game statements have been about the futility of agency– Passage, The Graveyard, La La Land 5.  You appear to have power, but that power is meaningless. In some ways, the games say: “We have this new medium, but we’re not sure what we can do with it.”

How do we measure agency?  How do we better distinguish the player’s low level abilities, such as performing a flip in SSX, from the higher-level power to affect the game world, or the state of an NPC?