Jamestown Gameplay Footage!

by Tim
Fri, March 18, 2011 -- 23:29 UTC

Jamestown Logo

Because the people demanded it, we have wrought a Jamestown trailer for your amusement and delight. At last you shall have your precious gameplay footage!


Sound Judgement (A PUN!)

by Tim
Wed, January 5, 2011 -- 22:18 UTC

IGF LogoThis Monday, the Independent Games Festival annouced their Finalists and, to our great surprise we noticed our little Jamestown listed under Honorable Mention for Excellence in Audio!

As those who follow @finalformgames on Twitter will already know, we submitted Jamestown to the Independent Games Festival this Fall. Like most IGF entrants, we held secret hopes of recognition deep in our hearts, but saw it more realistically as a good opportunity for some exposure and a deadline to push hard for.

Needless to say, we are delighted about this unexpected honor! Many thanks to the IGF and judges for their kind acknowledgement.

Given the circumstances, we think it fitting to introduce you to the gentlemen who so carefully crafted our audio experience, and to share with you a little about how we approached the audio for our game.

First of all, we’re pleased to introduce our composer, Francisco Cerda, who works with us remotely from Santiago, Chile.

Here is one of his 4 compositions that went out with the IGF build, entitled “War Upon the East Frontier”.

As an added bonus, we’re pleased to share a brand new track, entitled “Into the Dark Sector”.

I had the pleasure of meeting Francisco while he was visiting Berkeley in 2008. A friend of my former housemate, Francisco stayed with us for a few days, on a few occasions sitting down at the piano for an hour or two of improvisational play. What I heard was expertly performed, dynamic, and emotionally powerful.

We exchanged contact info before he returned home, and have stayed in touch since. When the time came to select a composer, we worked with a few (truly amazing) candidates, but ultimately could not refuse Francisco’s passion, versatility, speed, and sheer compositional might.

Francisco Cerda

The man behind the music.

We decided to eschew the traditional shooter chiptune soundtrack, inspired instead by games such as Ikaruga, Gigawing 2 and Under Defeat. Our milieu and story suggest a more conventional orchestral instrumentation, so we tried to marry that style to the intensity of a wailing Joe Satriani guitar solo. What we ended up with is something that we feel is greater than the sum of its parts.

For sound effects, we turned to our old friend Justin Mullens, with whom I worked on several past titles. While we can’t as easily represent his work here as Francisco’s, suffice it to say that his steampunk-inspired wood/brass/cloth approach to the UI sounds offers something new to the shoot-em-up landscape. He scratch-built all the sounds in the game, employing every trick in the book to find some coherence in the crowded sound space of a 4-player shoot-em-up.

JustinRecordingFireHose

Here is Justin recording a fire hose, that most elusive of sounds.

We are all honored to have our hard work acknowledged, and to be able to bring this honor to the oft-overlooked shmup genre in general. We are working hard to continue to improve the audio experience for our game, so that by the time it ships to you it will provide an even richer experience than what the judges saw in October. After all, the most important external validation can only come in time, when the game ships to the world at large.


We Got Some Ink II: The Quickening

by Mike
Thu, July 8, 2010 -- 18:40 UTC

This post is going to be about our game, but stay with me while I take you on a little bit of a side-quest.

Some of you may not know this, but last Wednesday was Hoagie Day here in Philly. Wawa* puts it on every decade or so, apparently. The formula for this event is sort of breathtaking in its simplicity:

STEP 1:
Make the longest Italian hoagie in the history of the world (1.25 miles this year)

STEP 2:
Give it to the people of Philadelphia

STEP 3:
Watch Rocky

The stage is set.

The stage is set. Rocky looks on approvingly.

So we queued up after work with the rest of the hungry masses, waited for 30 minutes or so, and each got to enjoy several mouthfuls of sandwich history. Because Wawa is always a class act, they sweetened the pot by giving away enormous quantities of Tastykakes, potato chips, ice cream bars, fruit juices, waters, and iced tea. By the end of the event, Wawa employees were simply roaming around the fields where people were sitting, throwing ice cream bars in random directions.

Then we watched Rocky, using the steps of the Art Museum as stadium seating. Those of you who have seen Rocky will surely appreciate the cultural heft of the tableau I’m describing. Those of you who haven’t: shame on you.

I mention all this because I want to be clear about what we thought the highlight of last week was going to be:

Six inches of Hoagie history.

Six inches of Hoagie history.

Right? Then we made our birthday post announcing Jamestown, and this happened:

Apparently, the internet thinks Jamestown deserves a wider audience than the few (but courageous!) stalwart fans who read this blog.

We are thrilled and humbled that so many folks are excited about our little project! Reading the links above has infused our workdays with a fresh jolt of optimism and determination, and we are banging out code and pixels at full speed. So to the friends, bloggers, readers, commenters, tweeters, and re-tweeters who were part of getting the word out about Jamestown this weekend: thank you!

But don’t take it too hard, HoagieFest. There’s simply no hoagie, no matter how record-breaking and delicious, that could have made us feel this positive about our future. Maybe next year.

* Wawa is an excellent regional convenience store chain that answers the question “what if 7-11 didn’t wallow in being a trashy downscale hell-mart?” That answer turns out to be market-dominant.


Final Form, Year One: WHERE WE’RE GOING

by Mike
Thu, July 1, 2010 -- 19:59 UTC

It took 365 days of hard livin’, but we’re finally here: Final Form Games is one year old today! You are our loyal, never-say-die readers with whom we will always shoot straight, and we hope you are excited to celebrate with us! Over the past few days, we’re brought you up to speed about where we’ve been and where we’re at, but said very little about…

WHERE WE’RE GOING

or

Seriously: What In Tarnation Are You Guys Working On?

What a good question! We are working on a rad videogame! It represents a lot of what we love about games, its working title is Jamestown, and we think it’s going to be a blast.

Logo

First things first: The screenshot we posted back in October wasn’t an image of functional gameplay. We know, you’re shocked. HOWEVER! That image does represent the overall aesthetic and milieu that we are striving to deliver to YOU, the customer! To vouch for the truth of our words, here are some totally real, in-game (and very Work-In-Progress!) screenshots of what the game looks like on this very day:

And HERE are some scintillating details:

- Jamestown is an old-school, handcrafted shoot-em-up (or “shmup“) with a new-school twist: 4-player co-operative play!

You will roll deep.

You will roll deep.

- As many have guessed (amazingly), it is set in 17th-century British colonial Mars. It will feature: Famous alt-historical figures! Majestic alien landscapes! Steampunk space tech! Hard-bitten settlers taking their shot at ekeing out a better life in the New World! Redcoats and Martians settling their differences with spear and space-musket!

Redcoat

- With the gameplay, we’re striving to press all the important hardcore gamer pleasure-buttons, while still leaving room to innovate on what co-op can really mean in the context of a classic shooter. We just love co-op games so much!

In 2011, one of these ships could be you.

In 2011, one of these ships could be you.

- We hope to tell a story within this world that is legitimately engaging and worth reading/watching/playing. A story that one might use the word “swashbuckling” to describe! Or, “coherent!” Or even, “explodathon!”

- In terms of timeline, we plan to submit to IGF this year, and hope to release on PC sometime in 2011, with other platforms to follow. The comments section awaits your snarky comments about release dates!

RedcoatFw

This is our first project, and we undoubtedly have plenty of rough waters to contend with between now and ship day, but we are optimistic about the journey ahead. As you may have read in our previous two posts, Year One was largely about investing a huge percentage of our energy into developing the game mechanics, technology, tools, and skillsets that we think are necessary to make our game great. Year Two is going to be about using them.

Thanks for being here with us on our first birthday. More to come.


Final Form Games, Year One: WHERE WE’RE AT

Wed, June 30, 2010 -- 17:49 UTC

On July 1st, a mere earth-rotation from now, Final Form Games will celebrate its very first birthday. To commemorate this milestone, we decided to break our customary silence to talk about where we’ve been, where we’re at, and where we’re going.

finalform_officepanorama

Day one.

WHERE WE ARE AT
or
THREE FACTS WE HANG OUR HATS UPON:

0511101929

Tim, hacking the encryptions. And yes, he is using three mice at the same time in this photo.

ONE: For prototyping, our goal/dream was to write games in a way that was as rapid, straightforward, and fun as tools like Flash.  Tim told us he had a vision, and that though the path would be a risky one, he knew it would take us where we wanted to go. When Tim finally emerged from his 5-month journey into code, drenched in gore and using a walking-stick that appeared to have been hewn from the claw of some long-forgotten subterranean insect, we looked upon the spoils and knew that we had found what we were looking for.

0306101557

Hal, playing our game in the Traditional Manner.

TWO: We realized that we needed two programmers, and had but one. This led to a conversation that basically went like this:

Tim: “Hal, we’re going to need you to become a programmer now.”

Hal: “Okay.”

And so he did.  It’s easy to say, but much harder to imagine actually doing: Hal bootstrapped himself the bulk of the distance between occasional-web-tinkerer and full-blown-gameplay-programmer in less than a year.  Working closely with Tim brought him the rest of the way there, and now almost all of our actual gamecode is the result of Hal’s skilled handiwork.

THREE: People routinely compare our art to the art in Metal Slug. The rest of Mike’s life is more or less guaranteed to be downhill.

ALSO!
or
OTHER TRUE FACTS THAT WARM OUR HEARTS WHEN ALL IS COLD AND DARK:

- We are active members of the small-but-scrappy Philadelphia game developer community, and are thrilled to be a part of its establishment and continued growth.

Our playtests... are getting a little crazy.

Our playtests... are getting a little crazy.

- We’ve given a few talks and round-tables about what we do at some local colleges and universities, along with our BFFs over at Cipher Prime and Merit. We’ve enjoyed dipping our toes into these kinds of education initiatives, and hope to wade in much deeper during the coming year.

Crunch dinner, courtesy Hal's then-fiancée-now-wife Jenn.

Crunch-time dinner, courtesy Hal's then-fiancée-now-wife Jenn. It was delicious. And TIMELY!

- Our friends and family have been hugely supportive of our endeavor, contributing everything from kind words to sage advice to crunch-time donuts. Two particular people (one of whom was Mike/Tim’s mother) went so far as to teach themselves how to pixel, and contributed much-needed art assets during our darkest hour.

- Finally: we are doing what we came here to do. We are spending our days making games of our own devising, learning all we can, and enjoying it ever so much. Year One was a great, tumultuous adventure. Join us on our birthday tomorrow, and we’ll tell you about why we’re so excited about Year Two.


Final Form Games, Year One: WHERE WE’VE BEEN

Tue, June 29, 2010 -- 23:19 UTC

On July 1st, a scant two days from now, Final Form Games will be one year old! To celebrate, we decided to bring our (fiercely!) loyal readership up to speed on where we’ve been, where we’re at, and where we’re going.

But what about right now, you ask? What is Final Form working on right this second? When will I finally see evidence that anything from that timeline up there is actually true?

Well… it is our birthday coming up…


We Got Some Ink!

Fri, October 30, 2009 -- 21:15 UTC

Haverford College put up a lovely article on us over on their website. You should go read it, if only for the really great photo* of us doing our best  mac-users-group ‘zine cover pose.

*courtesy of the talented Aaron Stock


It’s A God-Awful Small Affair

by Mike
Thu, October 8, 2009 -- 21:58 UTC

A peek at what we’ve been up to:

jamestown_01X2

It’s the freakiest show.


Something Very Special

by Tim
Mon, September 28, 2009 -- 17:34 UTC

The following is a fairly technical post about something that came up during our programming efforts. It assumes a certain amount of experience with the intricacies of C++, so if that’s not your cup of tea, don’t pay this post any mind.

I spent some time yesterday integrating my C++ math library with Lua. I have a pretty robust Lua integration library at this point, but it heavily leverages template partial specialization to achieve the ease-of-extensibility that I want. While I have become rather adept in the past few months at dissecting and making use of template error messages, I ran into a confounding error that I simply had to share*.

Here is a C++ program that represents the kind of task I was attempting to implement. The original code was implementing C++-side templated generation of Lua userdata metatables for my templated mathematical primitive classes. The following code snippet, while contrived, should serve as a more digestible demonstrative example.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
using namespace std;
 
// A few generic templates
template <int N>
struct Foo
{
};
template <>
struct Foo<1>
{
};
template <int N>
struct Printer
{
  static void Print()
  {
    cout<< "You have " << N << " " << Texter<Foo<N> >::GetText() <<endl;
  }
};
template <typename T>
struct Texter
{
  static const char* GetText() { return "apples"; }
};
 
// Let's call this next specialization "A"
template <>
struct Printer<1>
{
  static void Print()
  {
    cout<< "You have just one " << Texter<Foo<1> >::GetText() <<endl;
  }
};
 
// And let's call this next specialization "B"
template <int N>
struct Texter<Foo<N> >
{
  static void Test() { Printer<N>::Print(); }
  static const char* GetText() { return "apple"; }
};
 
int main(int argc, char** argv)
{
  Texter<Foo<1> >::Test();
}

So, what would you expect to happen when you run this program? I would have expected it to print out, “You have just one apple” and terminate. What I would NOT have expected is for it to spit out this error:

1
2
3
4
5
6
7
8
9
10
11
12
1>------ Build started: Project: TrickyTemplates, Configuration: Debug Win32 ------
1>Compiling...
1>main.cpp
1>c:\finalformgames\trickytemplates\trickytemplates\main.cpp(40) : error C2039: 'Test' : is not a member of 'Texter<T>'
1>        with
1>        [
1>            T=Foo<1>
1>        ]
1>c:\finalformgames\trickytemplates\trickytemplates\main.cpp(40) : error C3861: 'Test': identifier not found
1>Build log was saved at "file://c:\FinalFormGames\TrickyTemplates\TrickyTemplates\Debug\BuildLog.htm"
1>TrickyTemplates - 2 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

It was telling me that Texter<Foo<1>> does not have a method named Test in it. But there Test is, right above the call to it! All my efforts to statically analyze the program for the problem were fruitless (in part because the actual code was vastly more complex than this example). So, I did what anyone would do in my shoes, and started poking at it with a stick.

One surprising result: if I changed Printer to take in an additional template parameter, typename T, the error went away.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
...
template <typename T, int N>
struct Printer
{
  static void Print()
  {
    cout<< "You have " << N << " " << Texter<Foo<N> >::GetText() <<endl;
  }
};
...
template <typename T>
struct Printer<T, 1>
{
  static void Print()
  {
    cout<< "You have just one " << Texter<Foo<1> >::GetText() <<endl;
  }
};
...

Well, that’s pretty strange. Needless to say, this did little to allay my worry.

So, I rolled it back and broke out an old tried-and-true technique I picked up while working with the Metrowerks Codewarrior debugger: try moving blocks of code around. Sometimes this is illuminating, and, in fact, I found that by swapping the order of specializations “A” and “B” (see above code snippets), the error went away. Again, not too reassuring, but it gave me a lead by suggesting that something about this bug must relate to the order in which things are defined.

I searched online for all manner of permutations of keywords relating to the situation, and finally found this post on a site about the programming language D (which has many similarities to C++):

“If two template specialization refer to each other, there is the possibility that one of them will try to instance the other before the specialization for the other is created. The result would be either a compile error or an attempt to instance the wrong template. On the other hand, if I’m not missing something, a compiler would also be correct to lazy evaluate specializations, in which case this problem may well not occur. Some way to ensure the desired behavior here would be needed.”

So, my current understanding as to what was going on is as follows: The Printer<1> specialization is instantiating the Texter<Foo<1>> specialization before the Texter<Foo<N>> specialization is defined. This is because the correct order cannot be determined due to two specializations cyclically referring to each other. As a result, it is masking out the later definition of the Texter<Foo<N>> specialization. When we call Texter<Foo<1>>::Test() in main(), it uses the incorrect specialization, which does not define the a member named Test. This may be inaccurate, but it seems to line up best with the symptoms from what I have figured out. That being said, if you are familiar with this bug, or have a contrasting theory, please share with us below in the comments.

What’s especially surprising about this error is that there is supposed to be an error message you get when it happens! It’s not hard to invoke it, either:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// This compiles just fine:
template <int N> struct X
{
  static void A() { Y<N>::B(); }
  static void C() { }
};
template <int N> struct Y
{
  static void B() { X<N>::C(); }
};
int main(int argc, char** argv)
{
  X<1>::A();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// This, however, throws a C2908!
template <int N> struct X {};
template <int N> struct Y {};
template <>
struct X<1>
{
  static void A() { Y<1>::B(); }
  static void C() { }
};
template <>
struct Y<1>
{
  static void B() { X<1>::C(); }
};
int main(int argc, char** argv)
{
  X<1>::A();
}

I do not mean to fault Microsoft for their failure to throw this error at me. It’s one hell of an edge case, and if you’re in this deep, you really ought not to rely on your compiler to bail you out when you do Bad Things. That being said, it’s nice to be able to trust that your compiler is Always Right, and experiences like this make that trust feel tenuous and uncertain.

In conclusion, do not let your template specializations refer to each other cyclically, or you may find yourself a sad, sad panda.

*Please note that this post refers specifically to behavior I experienced using Visual Studio 2008 9.0.21022.8 RTM on a machine running Windows XP. If you are on a different platform, you may or may not experience the same behavior.


Touhouhou and a Bottle of Rum

Fri, September 25, 2009 -- 21:06 UTC

Chris over at Paper Dino recently put up a  post on the lessons he learned from playing the Touhou shmups, e.g. Perfect Cherry Blossom and Imperishable Night. For those who don’t know, this is a series of shmups (shoot ‘em ups) made by one guy from Japan who calls himself ZUN. He’s iterated a lot on the basic vertical scrolling shooter formula and his shoulders are great ones to stand on when you’re making a shmup yourself.

Chris did an excellent job of highlighting several key lessons.  Here are some of the things I took away from my own explorations of the series.

Welcome to Bullet Hell

Welcome to Bullet Hell

Slow/Technical Mode

If a bullet hits the dot on her waist, you're dead. Anywhere else and you're home free.

If a bullet hits the dot on her waist, you're dead.

Almost all of the Touhou games I played had a button that, when you hold it down, makes you go slower. In the earlier Perfect Cherry Blossom you activate this mode by holding down the fire button, a’la DoDonPachi. In later games, however, ZUN remapped this slowdown to another button entirely.

One of the most subtle benefits of this slowdown is that it puts a small dot on your character showing your “real” hit-box. As Chris mentioned in his post, it’s usually a good idea in shmups to make the player’s hit box (i.e. the part of the player that, if it touches a bullet, will result in player’s death) much smaller than the image of the player’s ship.

Notice the little white dot on the player on the image to the right. That’s the player’s hit-box; as long as you remain in slow mode the game displays this point for you allowing for a highly technical level of play.

Modal Gameplay

Left: Slow Mode, Right: Normal

Left: Slow Mode fires wavy bats, Right: Normal fires spread

In most of the Touhou games the player’s main vulcan fire* is slightly different when slow mode is engaged. In Imperishable Night, the players main attack gets extremely different. As you can see on the right, the main character’s sprite also changes to reflect this.

With the character(s) pictured, the slow mode actually leaves guns behind in screen-space (the red circles above her are the guns) so you can put a gun down, for example, somewhere you know the boss often is while you’re off somewhere else dodging. By contrast, the main mode is a very traditional vulcan spread shot.

Currently in "I can kill you, you can kill me" mode

Currently in "I can kill you, you can kill me" mode

This allows for tactical decisions. All of the sudden you have an interesting choice of which gun to use for each wave of enemies that comes at you. Do you fire the spread to cover more screen, or do you leave a gun on one side of the screen to cover the other?

Imperishable Night makes this even more interesting by changing enemy behavir based on which mode you’re in. These things, called “familiars”, are usually spawned by bosses and shoot bullets at you. When you are in slow mode they won’t harm you by touch, but you can’t kill them either. When you are in normal mode, however, your bullets can kill them and they can kill you by running into you. This offers even more interesting play choices such as, for example, you choose whether to remain in regular mode so you can kill them and stop them from firing at you, or just to switch to slow mode and fire through them to get to the boss while dodging bullets.

Boss Locator

The last mechanic that I’ll mention is the boss locator. Whenever you fight a boss, the word enemy appears on the bottom of the screen directly under where the boss is on screen (screenshot below). This lets the player see where the boss is with a minimal effort even when he’s busy dodging hell of bullets at the bottom of the screen. It’s a great innovation that’s particularly well-suited to the smaller bosses of the Touhou shmups. We may have to borrow this.

crude red drawing added by the editors for emphasis

Crude Red Drawing added by the editors for emphasis

This is by no means all of the lessons these games have to teach. The bullet patterns alone could be the subject of a dissertation; I’m sure I’ll go back to that well. For now, though, these are my big takeaways from my brief research time. If you haven’t had a chance to play these yet I heartily recommend them, Imperishable Night in particular.

* The vulcan is pretty much the standard issue primary weapon in shmups. Originally named after the real M61 Vulcan cannon, the original standard gatling gun on American jets post WWII, in shmups a vulcan is a high speed, high rate-of-fire weapon.