Levels, projectiles, and weapons all now read from XML, allowing quick swaps of sets of weapons, and levels. XNA’s serialization pipeline is a lot of pain, and I’m not 100% sure the features of the compiled xnb filetype are of any real benefit to a game this simple. I’m just using C#’s XML Document system to very basically read and parse in properties.
While interviewing I also got a chance to playtest on a large number of game developers. They seem to have very finely trained aim, and aggressive play styles. I found that players were generally able to enter a stalemate with forward attacks. Because of this, I shrunk the safe regions in my arenas, and added significant recoil to the weapons. This recoil forces a choice between firing and gaining position, breaking such stalemates. The benefit of the recoil system is that the new Boost weapon is just a special case of this system that doesn’t fire a projectile.
The biggest pain of the weekend for progress was working around some of the shortcomings of farseer. Farseer shortcircuits when a CollisionEventHandler returns false. This makes it difficult to put game logic in the delegate. I changed this bit of farseer, so that it will always call the handlers for every object involved. The far more nefarious bug was related to revolution counting. Farseer counts the number of rotations using a while loop and a subtraction. When colliding a small item ( like a bullet ) against a larger object, (like a tank) there can sometimes be very high rotational speeds on the object. This causes a very long loop, and because the velocity is very high, this occurs every frame. The impulse that causes this rotation can actually result in an infinite or near infinite rotational velocity, which means that the loop tries to count infinitely, causing a very rough lockup. I had to nuke the rotation counting, and clamp the rotational velocity to prevent this sort of problem to get this resolved.