Wednesday, April 17, 2013

Screenshot Time!

Expect a gameplay video soon. But until then I'll post screenshots every now and then.
(Click to embiggen)

Wednesday, April 10, 2013

FAILURE DRAMA

Ugh. This is the painful part of the blog thing. Sure I get to share my successes with an enraptured audience of dozens, and that's fun. But I'm also committed to sharing my failures.

And fail I have. All bullshit aside nobody would mistake FRONTIERS for a releasable product right now. My deadline has come and gone. Now I get to choose whether to stick to my guns and shelve the game like I threatened to back in dick-swinging March or wuss out and pretend I never made such a threat.

Okay, that's a false dilemma. A third option is to reflect on why I failed, admit I made mistakes, resolve not to make those mistakes again and remain committed to finishing the game.

Spoiler: I'm not shelving the game. As much as I'd love to be a badass and walk away, the pain of shelving it would be too much.

Missing this deadline was rough. It may be hard to see from the outside, because deadlines seem so arbitrary when they're self-imposed. But this one wasn't. It was a measured calculation. It was based on objective self-appraisal. Failing means I overestimated myself in skill or self-honesty or both.

Before I go on, yes, this is a pity party. None of this wailing and drama really helps anything. But fuck it, it's *my* pity party and I'll boo hoo hoo if I want to. If this post reads like a eulogy it's because I feel like part of me died when I missed that deadline.

I'm not even kidding.

When you try something new you have to pretend you can do it or you'd never start. 'Yeah sure I can *totally* make a game even though I never have before.' You're like a kid outlining yourself on the wall, then drawing the outline you *think* you'll fill 10 years from now. Unless you're really morbid you're going to assume you'll grow a couple of inches and keep all your limbs.

When I started this project I drew a mental outline of myself as a game developer, hoping that I would grow to fill it. It wasn't overly ambitious, but it did assume a full set of limbs. As I worked I'd fill in bits of the outline with real observations - hey, it looks like I *am* pragmatic when it comes to design and hey, it looks like I *can* make art assets quickly. Go me! It was a promising start. So promising (even intoxicating) that I stopped wondering whether I'd grow to fill this outline and started assuming I would.

That was cocky. I can see that now. I treated my goal like a reality. Doing that is like using your '10-years-from-now' outline to buy all your clothes in advance. They ain't gonna fit right.

This deadline didn't fit right. In fact very little about the past two or three months has fit right. I'm not the game developer I sincerely believed I was. It's like looking down and realizing I've been missing a leg this whole time. Fuck! No wonder these pants were loose!

So this is me tossing a rose on that imagined self's coffin and saying some final words before burying it in the ground. Goodbye. It was nice thinking I knew you, but I've got to move on. Cue rain machine and sad folk song as I walk away in slow motion, etc.

Okay. Moving on.

Wednesday, March 6, 2013

Deadlines

Last post: Dec 31st, 2012. What the hell happened?

Two things. First, my wife & I moved into our first house - that's part of what motivated my self-imposed Christmas deadline, knowing that I'd lose most of January to the move - and second, I got busy on the newer 'leaner' Frontiers.

Last time I posted I said I achieved my goal of a playable game by Christmas, but not without cost. Remember how Frontiers started as a Minecraft clone with a dynamic terrain engine, with survival elements built on top? Well around November I realized that if I was going to make this thing playable by Christmas, one of two things had to go - the survival elements, or the sandbox elements. Yeah, sucks huh. After a few tough nights of waffling I decided to ditch the sandbox elements. I salvaged everything else I could - the interface, interactivity engine, survival engine and art - and started over from scratch. The rest - eight painful months of development and an engine that was 80% there - I tossed in the bin.

Why not just keep working on the terrain engine if I was 80% there? Because I had a deadline. And if I didn't make that deadline I'd sworn to shelve the game permanently. Yeah, it was painful. I still feel sick when I think about how much time I spent on something people may never see. But when the alternative was giving up entirely, the choice was clear.

This is why deadlines matter - they motivate the really tough decision. Of course, you have to take your deadlines seriously, and when you're a one man shop that means taking yourself seriously. I knew I wasn't playing around - I really meant to drop the whole project if I didn't have a playable game by Christmas. If I thought for an instant that I'd let myself off the hook, I'd still be tweaking the terrain engine for an unplayable game.

My next deadline is in March- my goal is to have a releasable game by then. Not perfectly balanced, not totally finished, but releasable. If I can't pull that off, I'm shelving it.

Monday, December 31, 2012

Mission Accomplished

Well, I did it. I delievered a playable game by Christmas.

Not without cost, mind you. A lot had to change. Even more had to be cut. But a lot of other fun things were added and discovered during playtesting. All of which I'll detail here once I catch my breath.

Now for my next goal - a releasable game by March. Onward!

Wednesday, November 14, 2012

The First Playtest

I said Frontiers would be ready to playtest over Christmas - my family and friends are excited to try it. I said it would be ready because I decided it was high time I got the core gameplay working, and the embarrassment of having nothing to show is an excellent motivator. But now that I have about a month left to go, I'm starting to wish I hadn't said a thing, especially since I know a new season of Breaking Bad work is scheduled to drop on me like a ton of bricks in December.

On the one hand this deadline did exactly what I'd hoped it would - it forced me to step outside of the comfort zone of Let's get this working just the way I want and into the world of This needs to happen or the game won't exist. And that's been fantastic for progress, if not stability.

On the other hand - Christ almighty there's a lot left to do. And I can already see all those sad looks I'll get if I have to tell them Sorry, it's not ready like I said it would be. It's the same look you get when you tell someone a pet died, only worse, because what really died is your integrity. And there's that half-amused undercurrent of Oh, I see, so you're NOT really doing this for a living. My mistake.

And the worst part is, because I haven't done this before - this being creating a game from start to finish - I haven't leveled up my estimation skill. Ask me how long it'll take me to complete a VFX shot and I'll give you an estimate accurate to within a half hour. Ask me how long it'll take to implement a game feature and all I can tell you is it'll happen someday. I hope.

Did I say that was the worst part? I'll do you one better. The worst part is, they will almost certainly dislike the game, for two reasons. First, it's difficult to stay alive, even when nerfed for playtesting. Second, despite being more focused than a pure sandbox like Minecraft, it can still be hard to figure out exactly what to do next. That may be remedied as I write the Almanac - The Adventurer's Almanac, which I'll get into later - but for this session I'm expecting a lot of blank stares.

*sigh*

The thing to remember is that my goal during a first playtest is to seek information, not validation. If go in hoping for compliments I'll walk away disappointed and make everyone uncomfortable in the process. If I go in hoping for a guiding light, I'll walk away satisfied no matter what their reaction. Because even if they hate it from top to bottom, that's information I can use to make the game better.

Alright. Enough hand-wringing. Time to get fire working properly...

Tuesday, October 23, 2012

Tell a Story

Wouldn't you know it, only a few weeks in and I'm already lagging on the blog. Truth is I'm working on a piece about why you should embrace formulaic game mechanics, and it has to be perfect before I let anyone see it or the world will end, etc.

In the meantime, I've got a random programming tip: Tell a story with your code.

When you're working on shared code I actually don't recommend this. But if you're working alone, you can waste a lot of time grappling with those chunks of code you don't touch for months at a time - you know, the buried artifacts from your own past that you dust off and hold it up to the light and wonder whether you wrote them while blackout drunk.

So when code starts getting gnarly, I try to figure out a way to make it about a character trying to accomplish a specific goal, and either succeeding or failing. It's a great memory aid.

One class I just revisited this morning is supposed to update chunks of voxels using some weird proximity rules. It's complicated and huge. When I initially created it I called it a NodeProximityUpdater, and when I cracked it open a few weeks later I felt like I'd had a stroke. So I created this base class:

public class InfectorScript : NodeScript
{
     public virtual void TryToReawaken ( )
     public virtual void GoDormant ( )
     public virtual void SpreadTo (Node targetNode)
     public virtual bool FindPotentialHost (out Node targetNode)
     public virtual void AttemptToAlterHost ( )
     public virtual bool IsNodeSucceptible (Node targetNode)
     public virtual bool HasNodeSuccumbed (Node targetNode)
     public virtual bool IsNodeInfected (Node targetNode)
     public virtual void Die ( )
}

Flash forward another month - this time when I opened it up, I felt up to speed right away. Infector, okay - an infector infects things like a virus, altering hosts until they succumb to changes, then spreading to another potential host. When it can't find a host it goes dormant, then tries to reawaken once in a while. If it's without a host for too long, it dies. Got it.

All the gnarly complexity is still buried in there, but when you're reading the highlights of a story, you only need broad strokes to summon a complete memory, even if the particulars are complicated.