The Animal Farm

June 29th, 2010

See the Light Android Gets a Good Review!

See the Light: A twist on Puzzle Games at Android Headlines.

I’m glad they enjoyed it. They did point out some glitches, a few of which flew right under my radar, but luckily nothing I think is too severe.

While I have your attention, two updates on the See the Light front:
(1) It just received a temporary price drop to 0.99 until Friday. This is for a limited time. If you were waiting to purchase the game but $2 was just too much, you’re in luck.
(2) Laura’s working on a dedicated site for the game. Should be finished in a couple days.

“This game is a must download if you are into puzzle games.”

June 28th, 2010

Crunching Numbers

Here are some random numbers for your consideration:

See the Light XBLIG:
Trials: 1788
Sales: 140
Conversion Rate: 7.83 %

See the Light Android:
Trials: 750
Sales: 8
Conversion Rate: 1.07 %

Word Duelist XBLIG:
Trials: 1696
Sales: 169
Conversion Rate: 9.96%

Website Hits/Day: ~17-20
Hits when I Twitter an XNA related post: 45-50
Hits when I Twitter an Android related post: 20

Just, y’know, putting that out there.

June 28th, 2010

A Super Simple Maya Level Exporter

I don’t want to write tools for Iron Heinrich. Period.

Let me expand on that: writing tools has its charm, but I’m more interested in making games. I’ve spent the bulk of my professional game industry career working on tools in some fashion. I know they’re a lot of work, and you can easily get lost in them without ever actually producing a product. I don’t want that. I want to release a game.

This leaves two options for us:
We could hand-write all our data. Or we could use tools already available to us. Spend about 12 seconds hand-writing an XML file and you already know option #2 is the correct one.

This is no more true than when creating level data. Levels get pretty freaking big, hence a lot of data needs to be generated. Writing level editing tools is not by any means a trivial task - after working on two at Emergent and one at EA, I can safely say it’s a hefty undertaking that could easily swallow an engineer’s entire development bandwidth during a project.

Luckily, if you’re developing a 3D game, you’ve got a level editing tool staring you in the face. It is your 3D modeler.

Nate has access to Maya. Maya is a complicated, complicated, beast that does a gagillion things. “Level editing” isn’t natively in its repertoire, but it’s not a huge leap. You can edit geometry. You can reference external models and move/morph them around. You can tag nodes with extra data. And you have all those lovely tools the Maya engineers have already written to help here, which can save you tremendous amounts of time.

There’s some leg-work, no doubt. You’ll probably need an export step to send the data out in the exact format you want, and this will mean writing a plugin or a script. Depending on the ‘extra data’ you need to tag your entities with, you may find yourself wanting to create custom Maya dialogs to streamline editing. This isn’t hard necessarily, but it’s still work. Work I’m currently looking at.

Thus, I present you with a super simple maya level exporter:
[ftf]
fileBrowserDialog -mode 1 -fc “Export_Scene” -an “Nothing”;

global proc int Export_Scene( string $outfile, string $fileType )
{

int $fileId = fopen( $outfile, “w+” );

string $references[] = `ls -type reference`;
for ($ref in $references)
{
string $filename = `referenceQuery -filename -shortName $ref`;
string $nodes[] = `referenceQuery -nodes $ref`;

vector $trans = `getAttr ($nodes[0] + “.translate”)`;
vector $rot = `getAttr ($nodes[0] + “.rotate”)`;
vector $scale = `getAttr ($nodes[0] + “.scale”)`;

fprint ($fileId, “Node: “); fprint ($fileId, $nodes[0]);
fprint ($fileId, “\nFilename: “); fprint ($fileId, $filename);
fprint ($fileId, “\nTranslation: “); fprint ($fileId, $trans);
fprint ($fileId, “\nRotation: “); fprint ($fileId, $rot);
fprint ($fileId, “\nScale: “); fprint ($fileId, $scale);
fprint ($fileId, “\n\n”);

}

fclose $fileId;
return 1;

}
[/ftf]

This guy is about as trivial as it gets. All it does is iterate over your external references and spit out their node name and transformation information. In Iron Heinrich, ‘node name’ translates directly to ‘entity template name,’ which is where all the extra data gets specified. We can bring in arbitrary entities or even drag in spawn points and triggers. Run this script and separately export the level geometry and you’ve got a good portion of the level specified with only a small amount of work.

Of course, this is oversimplified and won’t reflect the final export step, but it’s a start. We’ll definitely need to have a way to specify lighting, camera cues, and assorted random bits, but that will come as we go. For now, I’m happy having the ability to edit levels in under an hour.

This won’t be the solution for everyone. Your game may require special tools that don’t integrate well within Maya. It’s hard to get Maya to integrate with your game to do things like rapid iteration. You don’t get a perfect visual of how the game will look in-engine without exporting and running. These are all things that a custom tool can do more easily. However, a fully in-Maya approach is perfectly valid (I have witnessed it used by professional studios to varying degrees of success), and at the very least, I think it will be good enough for Iron Heinrich.

Next on the agenda: enemy interaction

June 28th, 2010

The Death of Nerd Culture

I’ve got a bit of a pet peeve, and it flames into full effect with a single word: “fail”.

For whatever reason, the word “fail” has fallen into the diction of the internet masses within the past couple years. I often overhear folks responding with “FAIL” or “EPIC FAIL” or some other such nonsense. Seriously?

For whatever reason it’s now nerdy or geeky to participate in Internet memes. Really, the opposite is true. For 90% of folks, a meme is simply following a trend. It’s not being original or creative, it’s simply regurgitating something that’s probably already inane and pointless.

Being a nerd is about dedicating yourself deeply to something, because it interests you. Computer nerds write socket APIs and hack Linux kernels because it’s challenging. It’s interesting. English nerds read and write because they can travel through their imagination. They can express themselves. Repeating the word “FAIL” demonstrates nothing except your lack of creativity and an ability to follow a herd. Congratulations.

June 28th, 2010

The Weekend’s Events

Today Laura looked at me and asked why I don’t Twitter about my personal life. I thought about this and connected it to why blog posts have been impersonal lately.

Instead of spelling out the reason, I’m going to highlight the major events of the weekend and let you work out your own conclusions.

Friday:
Morning until Evening - Worked the day job.
Night - Went to Caribou. Worked on Dungeon Kid.
Late Night - Sampled some bad Netflix movies.

Saturday:
Morning - Finalized See the Light 1.1 and released it.
Afternoon - Went to Caribou. Worked on Iron Heinrich art pipeline.
Evening - Scoured the internet for ways to market See the Light.
Night - Ate dinner, putzed around.
Late Night - Played Puzzle Quest.

Sunday:
Morning - Explored adding a “Purchase” button to See the Light.
Afternoon - Went to Open Eye. Worked on Iron Heinrich art pipeline some more.
Evening - Went to Shiki with Laura. Came back and played a little Puzzle Quest.
Night - Went to Caribou. Finished up Iron Heinrich art pipeline. Wrote blog post detailing it.
Late Night - Watched Leverage (!). Played Puzzle Quest. Scoured the internet for ways to market See the Light again.

To summarize: I’m working a lot these days on a variety of things. My work ethic has skyrocketed, but my daily collection of interesting stories has dwindled. That’s good or bad depending on how you want to view it; I’m pretty comfortable with how I conduct my days.

See the Light just got its 8th sale!

June 27th, 2010

Designing an XNA Art Build System

Introduction
If your project’s artists have to open Visual Studio to work, you’ve failed them. If they have to come to you to get every piece of art implemented, you’ve failed them worse.

The primary driving motivator behind every engineering decision I’ve made for Iron Heinrich is thus: I want to allow the artist (Nate) to do awesome things. Each barrier in his way is a high priority for me.

There are plenty of barriers, and we’re working on addressing a lot of them. The purpose of this post in particular is the art build system. The system set in place so that when an artist does something, after he’s modified the data, he can see everything running.

The Goals
The current XNA content workflow is pretty much the following:
(1) Start Visual Studio
(2) Add your content to the Content project
(3) Set any necessary importers or content processors
(4) Build and wonder why you got all those errors
(5) Fix up those errors
(6) Build and run

Which isn’t particularly good for an artist. It’s cumbersome. It’s error-pone. It requires technical knowledge. Here’s the ideal:
(1) Build and run.

A lofty goal, but can it be done? It’s not entirely trivial, but I do believe it can.

Changing the Art Build Step
The first thing we need to do is take Visual Studio out of the equation. Artists shouldn’t need to know about IDEs or content projects or importers. Artists should be able to double-click on a file and watch it go. This is an art build step, and a good art build step hides all the ugly details from the artist.

How is this done with XNA? Here’s an outline of the current process we’re using now:
(1) The Content directory is crawled by a program. Each file is evaluated against an Art Manifest which details how that file should get built. The artist doesn’t need to know about the Art Manifest.

(2) Based on the above, a new Content project file gets generated that the XNA build system can interpret. This file is actually a mashup of a Template file (which contains all the standard stuff that goes in a Content project) and the new data determined by the crawler/manifest.

(3) msbuild is run on the new Content project, which performs the necessary art build.

All this is fairly simple. The trick is in the details - the details specified by the Art Manifest.

The Art Manifest
Each type of file has a few things associated with it:
(1) An importer & exporter
(2) An asset name
(3) Various parameters

It’s not enough to specify these once per file type and be done with it. That would lead to a broken build within minutes. Consider:

Level1.x is a level file. It uses an exporter that spits out its vertices for collision purposes.
Char1.x is a character. It uses an exporter that spits out a skeleton for animation.

The same “type” of file, but they meet radically different requirements. The art system has to manage that.

The Iron Heinrich build system specifies a hierarchy, where each part of the hierarchy takes precedence over the previous:
(1) Default (Per File Type) - If a file of this type is encountered, this is how it will be built by default

(2) Group (Per Directory) - Build information can be set at the directory level such that if a file is in the directory, the ‘Default’ no longer applies. For instance, all levels may go in a group “Levels” and will be built specially.

(3) Override (Per File) - Specific files have specific requirements regardless of where they are.

(4) Ignore (Per File) - Sometimes you just don’t want a file in the Content directory to get built. For example, we definitely want the crawler to ignore Content.contentproj.

I as a programmer handle that - I setup the manifest, specify the importers, exporters, etc, and the artist almost never has to worry about it. Sometimes he may need to add something to the Ignore list or even the Override list, but 99% of the time he just puts his assets in place, executes a script, and runs the program.

Final Thoughts
The system isn’t perfect. Some errors will still require some technical knowledge, and the manifest is more cumbersome to make small changes to than settings within Visual Studio. Comparatively, though, I think it allows for a much smoother workflow, which is vital to artists.

This is all overkill for small projects, but for larger projects (and especially projects which are largely data driven), it can be pretty helpful. It also sets up the framework for a rapid iteration scheme which I’ll talk about… if/when I ever implement it.

Not nearly as complex as some of the build systems I’ve worked with.

June 27th, 2010

Re: “Is level 2 even solvable??”

I thought this comment for See the Light was cute. Also the accompanying down-rating.

Yes, level 2 is most definitely solvable. I can solve it in under 30 seconds. Here’s a play-by-play:

(1) Drag the lens onto the red light.
(2) Hit the green check to confirm.
(3) Drag the second lens onto the red light such that the lens and red goal are in a straight line to each other.
(4) Touch the lens twice.
(5) Hit the green check to confirm.

Solved.

My suspicion is you didn’t read the first level tutorial, part 4, which says:
“After you place an object, you can touch it to rotate it.”

That’s pretty pivotal. There are other bits in the tutorials that will come in handy, too.

Am I above talking down to my customers? No, apparently I’m not.

May be why I only have 7 sales.

June 25th, 2010

Introducing Iron Heinrich!

I’ve teased a lot about the Big XNA project I’ve had in the works for a while now, and although it’s still immature, I’m going to start talking about it anyway.

First, the name (or we’ll call it the codename, since names like to change): Iron Heinrich. Based off an old folklore about a man who was, well, partially iron. Nate knows more about the story than I do.

Second, the description: Iron Heinrich is an action/platformer sidescroller stemming from our love of games like Mega Man X, Earthworm Jim, Super Metroid, Castlevania, Contra, Bionic Commando, and a bunch of others. The game takes place in a fantasy/steam-punk world (think Hellboy 2) where the player runs around doing what players tend to do very well. Shoot stuff.

We have a lot of ideas in the pipeline - weapon upgrades, fancy bosses, streamlined controls. I’ll start talking features/implementations more as they are finalized, though.

And third, screenshots!

These first three are silhouettes of the character in his walking, running, and dashing animations. You’ll notice some odd proportions - this is because Heinrich has some piston joints that expand/contract as he moves.

Heinrich Walk

Heinrich Run

Heinrich Dash

This last one is just a screengrab of a movement prototype.

Physics Prototype

The game is still young, and it would benefit you to not come to too many conclusions just yet, but it’s coming along well.

June 21st, 2010

See the Light Android Day 1 Sales (Kinda)

I’m generally pretty open when it comes to my financial business; I really don’t care one bit if you know how much I make or where my game sales sit. I also believe sales information is valuable for people planning on approaching unfamiliar markets. Thus, I intend on being completely forthcoming with See the Light sales data. If, as a developer, it helps you - awesome. If, as a friend, it sends you into a guilt trip and causes you to buy one of my games - also awesome. So here are some figures.

These aren’t so much ‘day 1 sales’ as they are ’sales between early Sunday morning and early Tuesday morning’, but you get the idea:

Trials: 604.
Sales: 5.
Trial Rating: 4/5 stars (4 ratings)
Full Version Rating: 5/5 stars (1 rating. From Aaron)

Pretty small. XBLIG saw more trials and more sales by far. The XBLIG price point was smaller though - $1 versus the Android’s $2 - so that’s something to consider, and also something I can play around with more easily.

As I’ve repeated in my last two posts, there are updates coming in that might help out, but I don’t expect I’ll be buying that luxury yacht before year’s end.

I want to be on a boat just so I can sing “I’m on a Boat.”

June 21st, 2010

Seeking Translators for See the Light

See the Light, though done, still has a few updates coming. Namely, I want to translate it into as many languages as possible. The problem being, of course, that I only know English. And this site constantly illustrates how poorly I know even that.

So here’s an open call, which has already been echoed in Twitter and Facebook and in person: if there are any multilingual people out there, your translation services would be greatly, greatly appreciated. Not appreciated so much that I’ll, y’know, pay you. But appreciated enough that you’ll have my gratitude, a spot in the credits, and maybe a free meal if you’re around.

…Please?

No hablo espanol. Ich spreche nicht Deutsch. Watashi no nihongo wa totemo warui desu.