Okay! This might end up being long winded and hard to understand, but bear with me!
As I've mentioned to Buzz, we're dealing with a fighting game, not Halo. Halo sends hundred upon hundreds of the same packets over and over, so when some are lost, no one but the extremely anal people notice it.
I'm pretty sure that's not true. Halo doesn't send redundant packets. And I most certainly DO notice when packets are lost. All the time.
Halo sends each bullet as a separate packet. Each one has the opportunity to get lost. Normally when you shoot a Battle Rifle, it shoots 3 round bursts. The weapon has max ammo of 36. So your current ammo should logically always be a multiple of 3. And in LAN this is true.
But online, poor network conditions can cause an individual bullet to get lost. When that happens, the game refunds you for the lost bullet and puts it back into your gun! So you will quite frequently (Almost all the time) notice that your BR has a number of bullets in it that is not a multiple of 3.
As such, making the fights Synchronous/Centralized/TCP would be the best configuration.
With this being a fighting game, a single action could decide the entire outcome of a match[if we have 0-death combos, anyways], and if you use UDP, its basically like adding tripping...a random chance to have your action, any action, not be registered and you may or may not be subsequently punished for it.
I am partial to toward going the other route, actually. Using UDP over TCP, that is. Recall that each action will be a separate TCP connection. So you're looking at 4 times as much latency for TCP over UDP.
Of course the chances of this happening are decreased with better latency/ping/bandwidth/whathaveyou. But you can't keep these things static, most of the time, so lost packets are bound to cause problems, which will eventually lead to frustrating game play.
TCP will slow it down a bit, but as long as everyone has a decent amount of bandwidth available to them, the client-server connection with TCP won't be a big hindrance on gameplay.
Well, no be careful here. Bandwith and latency are totally different. This might be where you're missing some of the problem.
Latency is the time it takes one message to reach your target. This is the "ping" as you put it. Bandwith it the total throughput of the connection.
Bandwith is not an issue. At all. This game is going to use a negligible about of total bandwith. The issue is latency and reliability. Even a "fast" internet connection can have latencies of 150ms to a reasonably distant target. That by itself is okay, but if you have to multiply that by 4, you're suddenly looking at 600ms of latency. That is quite significant.
I am also partial right now to using an asynchronous game scheme. In my experience with competitive smash, even the smallest amount of noticeable input delay ruins the game. A small amount of erratic character movement does not, however.
I love to hear dissenting opinion, though.