Indie Game Development - "Having fun, making fun"

Thursday, December 27, 2012

Dev Log - Lessons from Localization

Here are some lessons I learned about localizing a XBLIG, while trying to help Ultimate Dodgeball navigate through the peer review process.

Localized Games take a long time to get through peer review:
Although Ultimate Dodgeball received many pass votes during review it got stuck in the review process.  New pass votes simply didn't seem to count at all.  I looked into this, and discovered that I needed two pass votes from every language group that I localized into.  Since I also put a game description in French, this meant I needed to find developers who spoke French, German, Spanish and Japanese.  I checked the developer profiles of other games in peer review and actively searched out these developers.  After an additional week and a half I had received all the votes I needed except for one French vote.  If I didn't get that vote before 30 days had passed, I would have automatically failed review.  The lesson here is not to translate the game into too many languages or you may never pass review.  Also, you will need to actively court developers from the languages you are localizing into.

You will probably need to go through review more than once:
During review, a French developers pointed out that I had spelling errors in my French description that I would have never let through in English.  I recieved similar feedback from German developers.  However, since the process was taking so long, and I wanted to make Christmas, I was hesitant to pull it from review.  In the end, the extra time in review enabled reviewers to find a problem that I needed to fix, so I had to resubmit the game anyway.  When localizing a game however, both the game and your translation are being reviewed.  It is quite likely that errors will be found in your translation that you are better off fixing.

A poor translation is worse than no translation at all:
During review two German developers told me that while they could understand my German translation, it was difficulty to read.  In fact, they said it was easier for them to play the game in English than it was in German.  Ouch!!  At the same time a Japanese developer told me that the Japanese translation was better than some XBLA games he has played.  The lesson I learned here is that if you cannot afford a professional translator, then make sure that the friends who are doing your translation are translating the game into their primary language.

Saturday, December 1, 2012

Dev Log - My Next Project

While I continue to review other developer's games and wait for Ultimate Dodgeball to move through the peer review process, I am also laying the groundwork for my next project.

Today marks the start of the new project - an FPS (first-person shooter) with a twist.  While I've been dreaming of this project for the last few months while I slogged through multiplayer issues with Ultimate Dodgeball, all I had was a few pages of design notes.  Today I made the first code build for the new game, as well as built a first person camera and an asset viewer for my modeler (which is something that was sorely needed last project). 

The biggest unknowns for this new project will be collision, lighting and AI pathing in a complex 3d environment.  I've found many good resources but have also discovered that there is a lot I need to learn.  I've also discovered an XNA engine called Sunburn, which is specifically designed to handle lighting and collision for 3d games.  While I was initially reluctant to get tied to an engine, I am coming to realise this is exactly what I need.

With my first indie game Kick'n It! there was a certain pride in doing everything myself, until I realized that my art skills just wouldn't cut if for the box cover and my friend Chris came to my aid.  For Ultimate Dodgeball I realized I would need to spend months learning how to model a 3d environment until my friend Raphael stepped in and offered to do it.  Now, as I continue to step up the complexity and production quality of my indie titles, its time to allow the programmers who made Sunburn come along side me and do some of the technical heavy lifting so I can be a designer again.

Thursday, November 22, 2012


Happy Thanksgiving! 

I am very thankful for all the people who have come up beside me and helped me finish Ultimate Dodgeball.  From my friend Raphael who taught himself Maya so he could model the environment, to Chris who did the illustation, to Emi, Alex and Felicia who translated the game into Japanese, Spanish and German.  To my parents for their encouragement and support and to all my family and friends for their encouragement, prayers and playtesting.  Thankyou for helping me achieve my dream!

Not only am I poised to release a second indie game, but one that is better in every way.  Online multiplayer, challenging computer opponents, true 3D environment, intuitive and responsive controls, and localized into other languages.  This was an ambitious project, and one that I could not have accomplished without all of your help.  Thank you!

Wednesday, November 21, 2012

Ultimate Dodgeball is in Peer Review!

I just submitted Ultimate Dodgeball into peer review!

The game will now get reviewed by other developers looking for crashes and technical or legal violations.  Once I get enough pass votes, I will be able to launch it on Xbox Live.  Almost done!

Dev Log - Testing Online Multiplayer

Having tested online multiplayer with two xbox consoles set up in my home, with a neighbor living across the street, and with simulated latency, I felt very confident that my network code would hold up online.  I was wrong. 

After completing a series of playtests, I decided to conduct a test with my nephew who lives 15 miles from my house.  To my dismay, the game fell completely out of sync.  Some of the bugs were caused by timing issues that simply don't occur under simulated latency or low latency, but did with the latency spikes experienced in the real world.  Other bugs were caused by my misconception that network session properties would get updated as frequently as I sent other packets. 

So I owe a big thank you to my nephew LeMonte and my friend David for helping me test online multiplayer!  My next step...peer review!

Friday, October 26, 2012

Kdog is now on Facebook & Twitter!

I recently had a playtest with a friend who works as a marketing manager.  While he was really impressed with what I accomplished with Ultimate Dodgeball, he stressed to me the importance of social marketing.  Following his advice, K-dog is now on Facebook and Twitter!

While I will continue my development updates here, I'm looking forward to interacting with friends and fans on Facebook and Twitter so I can continue to improve my games and share this adventure.

You can find me on Facebook as K-dog Games
Follow me on Twitter @KdogGames

Monday, October 22, 2012

Dev Log - Playtests

Playtests have gone extremely well.  Tournament mode has turned out to be a powerful draw, expecially for gamers who are playing it in coop.  In both cases where gamers were playing tournament in coop, they were unwilling to put the controllers down until they beat the entire tournament.  This is important, as I am planning to use the first two Tournament levels in the demo to entice gamers to purchase the full game.

All gamers were able to learn the controlls fairly easily, whether or not they played the tutorial.  Those that did play the tutorial were pleasantly surprised that a tutorial would be that fun.

All gamers loved the avatar team different styles, which enabled them to personify enemies and feel satisfaction at defeating them.

The game itself has been very solid, with most feedback being balancing tweeks or minor feature requests.  My next objective is to fix outsiding bugs with Live Multiplayer so I can begin a series of online playtests.  Almost there...

Tuesday, October 9, 2012

Dev Log - Localization

It was very exciting to see the game in Japanese for the first time!  At this point I have finished integrating the German, Spanish and Japanese translations into the game.  I owe a huge debt of gratitude to my friends who offered to translate the game for me.

I am very interested to see how localizing the game will impact sales.  I was unable to get a French translation, but this will actually help me gauge the impact of localization.  Sales from Germany and France were roughly the same for my last game, so if sales from Germany are much stronger with this release I will be able to put a value on localization.

Localizing the game in XNA was not very difficult, but it did increase the time needed to create the interface screens.  Since I had no way of knowing how short or long a given phrase would be, I had to measure each phrase and center it in code.  The size of background borders and boxes also had to be calculated dynamically to match their contents.  In cases where graphics, such as button prompts occur in the middle of a line of text, I had to make special adjustments for each language.  Had I only been working in English, none of that would have been necessary.

But I am very excited to have localized this game into other languages.  Localization was the last of the three new areas I wanted to master.  The other two were computer AI and online multiplayer.  I am currently implementing the demo mode and sales screen into the game.  I will then start an intensive round of play testing and bug fixing before submitting the game for peer review.  Getting close now...

Thursday, September 13, 2012

Dev Log - Wrestling with Latency

After a summer packed full of trips and fun, I dove right into the problem of multiplayer latency.  I can now say that I truly understand why seasoned developers often try to steer new developers away from online multiplayer.  At this point, online multiplayer has probably taken more than 30% of my development budget.  It is not a feature to be taken lightly.  My advice for any developer planning to tackle online multiplayer for the first time would be to keep your game simple - at least as simple as a first person shooter. 

At this point I have solved the latency problem for movement and targeting, and it works extremely well.  I have also implemented an acceptable solution for collision detection and syncing balls after collisions.  I have decided not to take the time to provide a technical explanation of how I accomplished this.  Instead let me simply say that wrestling with latency involves making a series of tradeoffs. 

I absolutely hate playing a game where its impossible to hit an opponent because their position keeps teleporting around every time there is an update.  This will never happen in my game.  The players all move about smoothly from one position to another - regardless how bad the latency may be.  I also hate playing a game where my character dies from an attack that clearly missed me.  Again this will never happen in my game.  However, the tradeoff is that in heavy latency a ball that seemed to hit an opponent may miss.  To mitigate this possibility,  I slow down balls on the attacking player's machine so we have time to display the opponents dodge anim.  This solution works well, but not in every instance.  The tradeoff of allowing thrown balls to fall out of sync is that I eventually have to bring them back into sync.  This means that while characters and thrown balls all move smoothly, the ball may pop into sync after a collision if the player is experiencing heavy latency.  This seemed an acceptable compromise, since this would happen only after a player has dodged the incoming ball.

At the moment I'm wrapping up a few remaining multiplayer bugs, and am getting computer AI to follow the same latency management proceedures as do human controlled players.  Ever onward!

Tuesday, July 24, 2012

Dev Log - Bandwidth and Latency

I really enjoyed implementing the compression techniques for multiplayer, and have had great success with it.  I was able to reduce the server's bandwidth from 50,000 bytes to a peak of 7000 bytes.  Microsoft requires games going through their certification process to be below 8000.  While indie games do not have to meet this standard, I wanted to ensure my players had a good experience.

I was able to accomplish this using a variety of techniques that Shawn described in his blog.  First, I removed any data that was not really necessary at that moment.  For example, player stats are only needed after a match so I didn't need to update them during game play.  I also discovered that I didn't need to send a matrix for each character.  A matrix is a what the computer uses to store a 3D objects position, facing and scale.  Since my characters never change scale I didn't need the scale portion.  Since my characters never leave the ground, I was able to replace the 3D position and facing data with a smaller 2D vector data.  To top it off, I was able to further reduce the size using a compression technique called packed vertors.

The part that made me feel clever was when I was able to replace five interger values with a single half interger.  I realized that most of the numerical values I needed to send only had a range of 0-9.  Therefore, I saved a value in the one's place, another in the ten's place, another in the hundred's place and so on.

The last thing I did was offload some of the server's work to one or more clients.  In deathmatch for example, one of the clients is selected to manage any computer players, while the sever manages the balls.  In a sense therefore, there are kind of two servers.

All these techniques enabled me to meet my bandwidth goals while still sending data every frame - so I haven't had to trade bandwidth for latency.  My next step is to solve the latency problem.  After banging my head against a wall for a couple days, I've finally got a prediction system working for basic movement.  When I get back from vacation, I'll complete that work and let you know how it went.

Monday, July 16, 2012

Dev Log - Multiplayer Part II

I've discovered that I've been somewhat na├»ve concerning multiplayer.  I have multiplayer games working again over system link but when I added a full eight players and balls, the system got bogged down and fell out of sync.  After looking into the issue some more I discovered an excellent resource by Shawn Hargreaves that both explained my problem as well as offered strategies to address it. 

Shawn is part of Microsoft's XNA development team, and has taken the time to explain many technical issues on his blog.  His writings were extremely helpful when I tried to wrap my mind around 3D and he came to the rescue again in helping me understand online multiplayer.

Apparently multiplayer games are relatively "easy" to get working on a local network, but often fail when trying to get them to work in the real world over the internet.  This is because bandwidth is much more limited over the internet, packets of information take much longer to arrive, and some simply never arrive.  In my case, it seems I had forced the server to send so much information that I was having bandwidth problems even on my local network.  Ouch!

The good news it that I now understand what I need to do, its an interesting problem to solve and I'm excited to finally conqour multiplayer.  Using the compression techniques Shawn described I've already been able to reduce the client's bandwidth by 50%!  Sending the packets less frequently reduce it another 50%.  I'm now going to apply those techniques to the server, as well as offload some of the work to the clients.  Ever onward!

Wednesday, July 4, 2012

Dev Log - Multiplayer & Localization

Happy 4th of July to my American readers!  For Americans, the 4th of July marks our independence day, and is a time to celebrate our freedom.  Its always been a symbolic day for me, as it also marks the day 15 years ago when I left a good but ultimately unsatisfying 9-5 job to pursue my dream of making games.  Its been quite an adventure with rewards and sacrifices that went far beyond what the 9-5 job would have provided or required. 

It also marks the day I submitted my first indie game and therefore marks a different kind of independence.  I would have loved to submit my latest game on the 4th.  The single player is solid and fun.  The tutorial is complete.  All high prioirity bugs are fixed.  However two very important things remain: Multiplayer and Localization.

As I continued work on the single player game, new features were added that the multiplayer now needs to sync.  I've had great success getting the multiplayer back online but there's still much to do.  So I'm currently working through multiplayer bugs, and will be doing online focus tests.

The game is ready to be localized into as many languages as the Xbox supports and I can get translations for.  I am currenlty awaiting translations for Spanish and German.  I would still like to find someone who would be willing to translate the game into French, Italian or Japaneese.  So if any readers know one of these languages and would be interested in translating an indie game, let me know!

Well, it is the 4th today, so I will leave Multiplayer and Localization for tomorrow.  Today I will bake an apple pie and gather with family and friends to celebrate freedom.  Freedom of all kinds.

Thursday, June 21, 2012

Dev Log - Playtests and Tutorial

The play tests are going well.  More than a dozen people have played the game so far, ranging from non-gamers to fellow developers.  I've had an extremely enthusiastic response from local multiplayer games, as well as a great reaction from those playing the single player tournament mode.  Almost everyone who picked up the game, wanted to play until they beat the single player tournament.  The difficulty level seems about right, and I've had some important bug reports.

Although the game is fairly easy to pick up and play, its become clear that it would benefit from a tutorial level, so I spent the past few days building one.  I've got a couple more touches to do on it, and then I will expand the focus tests further while I return to bug fixing.

Tuesday, June 12, 2012

Dev Log - Mission Accomplished

To quote the Empire Strikes Back, "The first transport is away!"  Late last night I submitted our new game into Microsoft's Dream Build Play competition.  A lot of hard work, late nights and close coordination with my artist and modeler friends made this possible.  I am thankful to both of them for making the sacrifices needed to wrap up the illustration and 3D envirnonment.  The single player game is in a solid state.

My focus now shifts to play testing, bug fixing and localization.  I will also be working on the online multiplayer code to make sure the client and server stay in sync.  Our next major milestone will be submitting the game for peer review.  Onward to the finish line!

Saturday, June 2, 2012

Dev Log - The Countdown Continues

With only 9 days left to submit to Microsoft's Dream, Build, Play competition, here's where we stand:

My friend Chris has finished the box cover, title screen and menu screen art - and he did an outstanding job!  I am totally blown away. 

I decided to polish the single player experience and possibly not include Live multiplayer in the contest submission.  That has enabled me to fix all high and medium priority bugs and really tighten up the gameplay. 

I'm also tackling the last couple single player features like putting fans in the stands.  I've decided to implement the fans by taking screenshots of 3d characters in the stands, and then rendering those textures to poly cards that will replace the 3d characters.  This looks almost identical to the actual 3d models and maintains my frame rate.  At the current moment I'm not planning on animating these textures - so the fans will not stand and cheer.  While I'd love to do this, its simply not a high enough priority.

The biggest open issues now are getting the final texutres for the environment, completing my work on the fans, and making a gameplay trailer.

The submission requirements include a gameplay video, so this is the perfect time to create my marketing trailer.  My old Dazzle video capture system could only record low res footage, which made Kick'n It's graphics look inferior to what they really were.  Since chracters are further away from the camera in this game, low res footage is simply not acceptable.  I ordered a new high res video capture system and scripted out the trailer.  I'll start recording as soon as I get the final textures for the environment and finish the fans.

Well, the countdown continues...

Wednesday, May 23, 2012

Dev Log - Countdown to Dream Build Play

Each year Microsoft runs a contest for XNA indie developers called Dream, Build Play.  Its an opportunity to gain exposure for myself as a developer and for my game, and I could even win some prize money.  Just as important however, it provides a hard deadline that I can use to rally my external artists, my family and myself to make the final push to finish this game.

I am currently working through the bug list.  I'm looking forward to opening the game to wider focus testing after I submit to to Dream Build Play.  The interfaces, win and lose screens for Live multiplayer games are all in and working properly.  All tiling and modeling issues with the environment have been fixed.  We are currently working through the final textures for the environment.

I hit a snag getting the client and server to stay synced up during Live multiplayer matches.  There are more game states to maintain than when I first wrote the multiplayer code, and I'm trying to protect against lag.  Delivering a solid multiplayer experience may yet prove to be a challenge.

Well, here is to the next three weeks.  Let the countdown begin!

Tuesday, May 8, 2012

Dev Log - Feature Lock

I'm still working toward feature lock.  All single player game modes are now complete.  I really like how the Tournament mode turned out.  The Avatar teams really add character to the game.  With single player done, my attention has now turned back to multiplayer. 

I just completed the final interface screens for creating and joining online multiplayer games.  Next I will revisit the login screens and will make sure that win and fail screens work properly for multiplayer matches.  I played another indie multiplayer game recently and it suffered from significant latency issues, so I will need to stress test my own multiplayer to make sure I am handling latency the best that I can. 

We also solved the texture tiling problem in the envionment and are currently working to finialize the environment.  The game's logo has been created, but I'm waiting for the game's box cover and title screen art. 

I am continuing to update the game for localization into other languages.  I have an excellent Spanish translator and a lead for Japanese translation, but I still need to find someone who would translate game text into German and French.

Well, back to it!

Wednesday, April 4, 2012

Dev Log - User Interface & Environmental Textures

I continue to work toward locking down all the game's features.  My current strategy is to try to complete a vertical slice of game play.  What this means is that for each game mode, I am completing all the user interface screens and minor features that are needed to lock down that mode.

Once the core of a game is complete, a developer can often mistakenly believe he is "almost done."  However, there is often a substantial amount of work remaining such as the user interface and a host of small but necessary features.  And that is what I have been doing. 

I have completed the Game Settings screen from which the player can choose AI difficulty, as well as the number of players or balls.  Playing around with the different settings created some pretty fun situations.  I've also completed the Help and Objective screens and am in the process of wrapping up the win and lose screens.  I've also set-up all these screens so they can be localized into several languages.  I'm very excited to see the what impact localizing the game will have on sales.  Currently the vast bulk of sales are coming from English speaking countries.

As part of the vertical slice I'm trying to lock down the envirnoment, and have just recieved a textured version of the play arena.  We're currently working through a problem that is preventing the textures from tiling properly.  It can sometimes be difficulty to determine whether these types of problems are caused by the code or by the art.

Wednesday, March 14, 2012

Dev Log - Audio, Visual Effects & Elimination Mode

I'm on the home stretch now, striving to get the game in a feature complete state.  Game music and sound effects are in.  I've opted for an extreme sports style heavy metal music that really pumps you up and makes you grip the controller.  I was fortunate to find some great sound effects that didn't require much editing.  Controller vibration is in as are fire and ghosting effects for special attacks.  Elimination mode is largely complete and the eight different teams the player will battle have been created.

I'm currently working on getting fans in the stands that will stand up and cheer when a team makes an awesome play.  This has turned out to be more time consuming that anticipated.  There are several ways to approach this, but since I've already got up to 16 unique avatars on screen at one time I'm opting for one that will maintain frame rate.

Monday, February 6, 2012

Dev Log - Computer AI

Computer AI is in!!!  This was one of the big risk areas for the project that I had never done before.  I specifically avoided writing a computer AI in my last project, but knew I wanted to tackle it now. 

For the last few weeks I would take a pad of paper to my daughter's appointments and spend time just thinking and sketching out how I would approach the AI.  When the time came to actually implement it, I was able to write the AI and debug it in only a week! 

The heart of the AI is a threat assessment system which examines the state of enemies and incomming projectiles.  AI players then compare this threat assessment with their own state and position and choose an appropriate action.  They then call the same automated targeting and dodge animation selection functions I already wrote for human players.  In just two days the AI had already come to life.

I then added layers to handle locomotion, collision avoidance, minimize friendly fire, and make friendly AI yield to human players.  The final step was to add pauses in the AI to simulate how humans wait after performing one action before beginning another.  Without it, the AI were simply too brutally efficient.

I'm now playing 4 vs. 4 games with a mix of human and AI players.  Its all very exciting.

Tuesday, January 24, 2012

Dev Log - Environment, Animations & Play Test

While Kick'n it was a 3d game, all of its gameplay occured on a 2d plane and I was able to use photographic backgrounds and avoid 3d modeling.   Gameplay in my current project takes place in full 3d, and I just dropped in the arena environment that my friend Raphael modeled for me.  It looks really nice, and is in the process of being textured.  We initially took a huge framerate hit until we discovered that all the elements of a model must be merged before export in order for the Xbox to treat it as a single object. 

I've completed the character attack and defensive moves and am really pleased with how smoothly the controls are working.  There is simply an attack, dodge, and jump button with a trigger for dash, but using these in different combinations will automatically create different cool moves.  So its easy and intuitive to do jump attack or dash attack combos. 

Last night was my first major playtest and I recieved a lot of great feedback.  It was also the first time I was able to test a 3 on 3 online multiplayer match.  But most importantly, the playtesters couldn't put down the controllers.  I thought we'd test the game for 30 minutes, but they just kept playing and playing for a couple hours.  If I can make a compelling single player experience to match the multiplayer experience I witnessed last night, this game could be a winner.