Tough Times Ahead
Right after the beginning of the contest my father’s health turned worse. Between his illness and passing away, I was busy for the first three weeks of the contest. Then, when I got back, work was in crunch mode and I needed to catch up on top of it all, pushing development of Headache! further and further off. Given those delays, it was important to keep the game within a level that was reachable before the deadline. Luckily, I had made sure to design the game concept to be scalable, allowing for basic gameplay, and letting things get added as time presented itself.
headache03.gif
Gator
What Went Right
Scalable design
In any situation where you are on a deadline it always makes sense to make your design scalable. We stuck to the core gameplay and made sure that was pretty good from the beginning. By doing this we created a fun game, and allowed ourselves to add some really great graphics and some fun extras that really enhanced the game and polish.
CVS and Multiple Development Systems
My uDevGames entry for last year, “Zed Nought,” was a pretty large game, and trying to get it to build on another system after the fact ended up being very painful. So, from the beginning, I made a decision to put everything into CVS, and to split my development time between my desktop and laptop machines. This also helped to act as backup for my source and artwork. An additional advantage to this approach was that I could do a clean checkout and see that it would build without my specialized environment.
headache04.jpg
Talking-heads
Great Artwork
Having a great artist really helped the game. It was already fairly fun to play, but once the final art made its way into the game, it really started to get a look of its own. A big part of the success of Headache! was in the art category. It is too easy for a lone-wolf developer to try to create art in a rush to ship the game. However, I feel that with each passing year the quality level of uDevGames entries will increase and having a true artist as part of the development team will become a must.
Flexibility
The final version of Headache! looks considerably different than I imagined it during the design phase. I had visualized a much more “cartoony” look and a very different sound for the music. However, the artist came up with a different look—a “realistic” one that really took the game to the next level. Also, when all testers said we needed the heads to somehow animate when they went away, it was added. However, care must be taken in how flexible you can be, as is illustrated by the next point.
headache05.jpg
Bad coder!
No Surprises at the End
There were a few things that testers (and my artist) really wanted to have me implement, but I was very wary of introducing instability at the end. I don’t mind being flexible, and flexibility had a lot to do with our success. However, there are some things that just can’t be added safely near the end of the development cycle. This was a hard lesson learned from last year’s contest. I added HID support to Zed Nought the day before the end of the contest, and then spent the next 12 hours trying to get the basic gameplay working again while adding in all of the art as well. Needless to say, I didn’t let that happen this year, and it paid off.
Memory Management
Rather than spending a lot of time hunting down leaks and agonizing over performance, I adopted and followed some good practices to keep memory leaks to a minimum. So in the end, I found only two real leaks using Apple’s tools. Of course, one was easy to fix while the other is still plaguing me, as I need to risk adding instability in order to really fix it.
Great Testers
I am lucky to have some friends that are really great testers. They all gave great feedback that made it into the game. They were especially good at helping me prioritize which issues needed immediate attention versus what could wait until after the competition. Unfortunately, I wasn’t able to get through the complete list of to-dos before the deadline of the contest.
What Went Wrong
Prioritization
There were some issues that could have been addressed had I tackled them earlier in the cycle. Some of this was because I was worried in the beginning about getting the basic gameplay done, and some of it was laziness. You always want to work on the fun stuff and find reasons to avoid the tedious stuff. Also, some of my feedback wasn’t available until later in the cycle.
headache06.gif
Everyone talks
Miscommunication
Although working with an artist was a huge boon to the game, one communication issue arose. During the concept phase, I had envisioned that users would be able to pick a “persona” that they could play as. This would be especially helpful with two player mode. However, it became clear that it wouldn’t be possible to put the characters into the game with the limited time we had left and make them look as if they really fit in the game. However, when I decided not to put the characters in, I unfortunately neglected to tell my artist that he didn’t need to make them. As he was following the design document, he spent a great deal of time creating the various characters. In the end, we weren’t able to use the many game assets he created and it would have been more fruitful for him to have worked on other areas of the game, such as the user-interface, which was left for last. Since he had spent so much time creating the characters, he was very disappointed that they weren’t featured in the final build. The good news is that I retained all the game assets, which opens the possibility for a two-player version in the near future so his characters will finally get the attention they deserve and will no doubt add yet more polish to the game.
A final issue that arose was with the witch doctor character that the artist had created. This character was pre-rendered and featured several poses based on the player’s actions. However, I had to omit the witch doctor from the game when the artist was unable to resolve a problem with the alpha-channel in the animations.
Coding Myself into a Corner
Given the time constraints, I found that I had coded myself into a corner. For example, the font renderer needed to have a way to change the color and a way to cast a shadow. However, the way it had been coded in the beginning was fairly specific to the original way it was being used. It’s too bad, because the text system is a great idea—it just had the wrong execution! The reason behind this problem lies in the next section.
headache07.jpg
Doug’s head
No Prototypes? Off with His Head!
One thing that worked really well for last year’s entry was the fact that before I added anything to the main app, I would prototype it out first. In this year’s entry, I started doing that. However, because of the system I was using, prototypes started taking up a large amount of my time. The overhead of getting a prototype up and running was getting to be much more than the time it took to implement the feature being prototyped. I’ve always found that implementing the prototype allows you to make all of your mistakes early. Then, when you rewrite the feature in the main app, you generally implement it much more intelligently.
Developing Quickly vs. Developing Correctly
I am gaining an understanding of the benefits of taking the time to code things correctly. Also, the idea of refactoring is one that really makes sense to me. Yet, for some reason, I failed to follow these principals as I should have.
The Artist Speaks
From Cartoons to the Real World
Once I had the basic concept of the game from Doug, I proceeded to make a concept game screen. The initial design document required cartoon-like graphics so I used a vector-based drawing program. The results were pleasing however I felt they weren’t enough to make the game win the graphics category. So I went back to the drawing board and went for a more realistic approach to the playing screen. Since the game was on an island, I incorporated island-like elements into the play screen, for example a jungle background, and the bamboo.
headache08.gif
Dr. Umfoofoo
Along with freehand painting in Photoshop, I used some royalty-free image clipart. The clipart went through numerous filters and other transformations before being added into the screen. To move away from the ultra-clean look, I tend to add a slight amount of “noise” to each element. In addition, the contrast and brightness was altered. These two steps gave the graphics a more “computerized” look—as though they were rendered in a 3D program.
Each element was stored in its own layer and then saved separately to give the programmer complete flexibility in layering the graphics on the game screen. Since the design document called for slight animation outside the “head-drop zone,” using separate layers would also allow for such things as insects flying in front of and behind different on-screen elements. The idea of adding extra animation to the game was very good. For example, the insects I mentioned. We also planned on having other animals pop in and out of the game, fully animated. However, since time was limited, they were dropped from the final game.
Where the Brush Ends, 3D Begins
headache09.gif
The heads
The topic of severed heads and how to make the graphics for such a game had me wondering if it would be “kid-friendly.” I felt that kid-friendly would be a necessary quality if we were to show the game at MacWorld (providing we won). I’m a strong believer that more games for the Mac need to have a “console-style” polish. So I made the heads as cute as could be. In making the heads, I first modeled a basic head shape in Cinema 4D. I then applied different morphs to the heads to provide for some variances, so the heads wouldn’t be static but provide some on-screen character, much like the classic Macintosh game Snood. In all, I made seven head colors with seven frames each. Although not listed in the design document, I also provided “evil-heads” that might be used for future versions of the game.
The game screen used a realistic art approach while the sprites retained some of the cuteness that the original design document outlined. Using a 3D application allowed for great time savings in creating sprites and also in animating them.
One World, Many Races
The initial story of the game had a cast of characters along with some background information. These characters would be used in the game to add extra polish and some interesting opponents in the two-player mode. A great part of my time was spent creating these characters in Cinema 4D. One interesting point was that I wanted to represent a wide range of people. Most games have a hero, and he is almost always an Anglo-Saxon male. The characters I created would allow gamers from around the world to see someone more close to home. I’d like to see more developers think in this manner! As Doug mentioned, although the characters were created on time, they weren’t incorporated into the final version for the uDevGames contest. Hopefully we will see a two-player mode added in the future and the debut of the witch doctor animation, which I was especially fond of.
headache10.gif
Poor menu system
It’s the Interface Stupid!
I often feel that many Mac games fail to inspire due to their user-interfaces. Looking at the platform, some companies really stand out in their approach to bring console-like menus and screens to their games. This is especially important as the demographics for Mac game players is changing, and also allows for easy localizing. With the character graphics taking a great deal of time, I left the user-interface elements for last. I envisioned having the witch doctor on the screen watching the characters’ mouse movements or interaction with the buttons. For example, if the gamer attempted to type the wrong key for the high score board, the witch doctor would shake his head “no.”
The buttons would also need to provide visual and audio feedback when selected and pressed. Time constraints forced us to use basic buttons—far below the quality level that I had envisioned! Looking at the final playable, I feel that we let gamers down in the user-interface. The buttons seem to be arranged randomly, and don’t offer the easy-to-use concept that we had planned. If I’m on the team for next next Headache! version, the user-interface will be my first priority.
Odds, Heads, and Ends
The talking-heads and gator were inspired by a fun “monkey” game by another developer. It’s a great idea, however I felt the font size and style was a tad hard to read on many screens. Hopefully Doug will address that problem and also include the many talking phrases that I created. The sound and music kept with the spirit of the game, but it sometimes gets a little repetitive. This is most likely caused by the 10MB limit. I can see the sound and music going to new heights if the game goes commercial, due to the fact that we had a great library of sound and music assets that were never utilized. Although I offered some pointers on gameplay, they were mostly for polish. Since the columns-type genre has been visited by many developers, I was always trying to push Doug towards more originality.
GoodDoug’s Conclusion
In the end, there are some very important lessons that I have learned. Using CVS and two machines for all of my coding made it simpler to deliver my code at the end of the contest. Flexibility is great, and it can be maximized by doing prototypes and being conscious of future refactoring. Also, taking time to keep all members of the development team apprised of all issues should make things much smoother next time. I’d like to give a special thanks to the people and groups that made Headache! possible: My artist Amaha, the staff at “Java Junction” on Seabright Ave. for keeping me caffeinated, my hockey superstar teammates on Strychnine and Fuzzy Bunnies for playing hard, and most of all, my wife Sandy and son Zachary (and the new one on the way, Kahuna). And of course to Carlos Camacho and the crew at iDevGames.
- Genre: 2D puzzle
- Developer: Doug Whitmore
- Url: http://www.gooddoug.com
- Team size: 2
- Released date: November 12, 2002
- Project length: 2 months
- Development hardware: PowerBook G4 800MHz and PowerMac G4 Dual 450MHz
- Critical applications: ProjectBuilder, CVS, OmniOutliner”:http://www.omnigroup.com/applications/omnioutliner/, BBEdit 6.5, Adobe Photoshop 7.0, Cinema 4D, Bias Peak