Petz Catz series
In Catz for Nintendo DS, you adopt an adorable kitten and learn to care for it, cuddle it, dress it, photograph it, and entertain it with toys. Petz Catz 2 enhances the experience with 3D environments, challenges, new breeds, toys, unlockables, and more, while Petz Fashion: Dogz & Catz adds dogs along with a focus on fashion and fashion shows to the already engaging pet care gameplay.
This is the Japanese trailer for Catz. I think you'll agree its cuteness transcends the language barrier.
My role on the original Catz title was mainly in my contribution to the initial version of Powerhead's DS library. I had written basic support code for things like video resource management, audio, memory management, and input. I also brought over some parsing and infrastructure code from our GBA menu system, which, combined with the other libraries, definitely helped us get things up and running quickly on the brand new Nintendo DS system.
On Petz Catz 2, my role was more extensive than on the original Catz. The first Catz game used a 3D kitten on an isometric perspective, switching to a 3D camera only occasionally, while the user is cuddling their pet. For Petz Catz 2, we decided to have the kitten in a fully rendered 3D environment all the time. This meant a host of new challenges, from physics to navigation to camera and more. But before I get into any of that, I'd like to take this opportunity to talk about another library I worked on for this game, though it's not exactly core to the gameplay: the text library.
Powerhead had a storied history with text rendering libraries. Prior to Petz Catz 2, we were using a haphazardly-constructed text library ported from the Game Boy Advance, written in C by a programmer that was no longer at the company, with major limitations—no Unicode support, for one—and stability issues. In 2007, I decided enough was enough. I designed a better text system from the ground up, with a Windows tool (written in C# with Windows Forms) to create fonts based on TrueType fonts or bitmaps. I knew we needed Unicode support, so for backwards compatibility with existing text but forward compatibility with other languages, I chose to use UTF-8 as the text encoding for the entire system, which made it extremely flexible: Petz Catz 2 was localized from English into French, German, Italian, Spanish, Dutch, Danish, Swedish, Norwegian, and even Japanese, including all kana as well as a selection of kanji suitable for young players.
I had been to my first Game Developers Conference earlier that year, and had attended one of the Tools roundtables, which had me all jazzed up to work on a new tool. This font creation tool, which was the first C# program I ever wrote, took a week or two to put together, and another week or two to fix up so it could be used by people other than me. I created some font file formats to use on the DS, wrote the tool to generate them, then wrote the DS library to load the files. It all worked beautifully. Once I added tagging (bold, italics), variable substitution, and the ability to inline images into the text, the new text library was ready to use for just about anything we needed. I even added a multi-threaded text rendering mode eventually, so you could prepare text in advance in the background and throw it on screen only when you're ready to display it, saving precious Nintendo DS CPU time. That text library has been used for every single Nintendo DS game Powerhead has shipped since Petz Catz 2.
The next aspect of the game I spent a lot of time on was the 3D environment. I added an engine I dubbed "Scene" to our DS library, and began working on all sorts of useful math-based utility functions, like raycasting, movement, collision, visibility determination, and so on. By default, objects used their axis-aligned bounding boxes for collision, but it was possible to bypass this behavior if needed. The kitten needed to be able to stand on things other than the floor, including furniture, shelves, kitchen counters, and even the top of the refrigerator.
Once a full 3D environment was up and running, navigation became an issue. Well, since I was still full of spit and vinegar about tools, I wrote a navigation node tool, which would load the layout of a room and let you set up navigation bounding cubes, then link between them as a graph. These were 3D cubes, so there was a difference between being, say, under the kitchen table or on top of it, as the only way to reach the kitchen counter would have been from on top of the table, which could only be reached from the floor by way of the chairs. If one node was linked to another node, it meant that any point on the first node could reach any point on the second node. Most of the links were bidirectional, but in some cases, the kitten would be allowed to go only one way, such as jumping off the counter onto the floor. Any time the kitten wanted to reach a new location, a simple A* pathfinding search would find a list of nodes to traverse to reach the goal, then a simple node reduction would use raycasting to find unobstructed subroutes and smooth the path. Navigation became even more important when we added the special jungle gym playrooms, which were basically platforming obstacle courses for the kitten; without a proper way to get around, these areas would be extremely frustrating.
One last issue with moving to a full 3D environment was cameras. I spent a lot of time designing the camera system, mainly by working backwards from what we wanted the player to see, then figuring out how to position and move the camera to accomplish that. Any time the kitten would move away from the camera, it would eventually zoom in a bit, to ensure that the kitten would always take up a certain percentage of the screen (again, "it's all about the kitten"). We also included some location-based cameras and camera animations for the 3D jungle gym playroom environments, to show the player how to guide their kitten to the goal.
Speech recognition was another part of Petz Catz 2 I worked on. The original Catz for Nintendo DS used a library we built around Nintendo's speech recognition code (licensed from Matsushita), but Catz had a limitation that when the game was processing what the player said, the frame rate would slow to a crawl. I was able to modify our library with additional multithreading to smooth out the load and maintain a decent frame rate, even while the CPU was being taxed by the audio processing requirements. I would later use these sorts of tricks to speed up text rendering and muliplayer processing in other games.
For Petz Fashion: Dogz and Catz, my role was more advisory, as I helped plan what we could do with the engine we had already developed, sticking as much as possible to adding content and modifying existing systems rather than coming up with anything new. While we did end up adding new features for the game, particularly fashion shows, we were able to reuse almost all of the systems from Petz Catz 2, which helped us finish Petz Fashion: Dogz and Catz on time and under budget.