Skip to content

Fullcount Devlog #5: Spring Tuning

Fullcount Devlog

As March approaches, bringing with it the Fullcount Nova League launch and MLB’s Opening Day, this week’s devlog returns to the topic of tuning and balancing the game. You might recall that we addressed tuning in the very first Fullcount devlog, where we explained our provisional approach to determining the outcome of each pitch and swing and our plans to retune the game once we had more data from playtesting. That time has come, so here’s a look at our process as we make some final tweaks before launching Fullcount on Arbitrum Nova on March 15th. 


What determines the outcome of a swing?

We’ll start with a reminder of how Fullcount at-bats work:

Fullcount uses a 5×5 grid to represent the strike zone. The pitcher and the batter each select a square in the grid for their pitch and swing, respectively. A fundamental game mechanic is the distance between their moves and how this distance affects the outcome of the at-bat.

Image of a five by five grid with a bold outline around the center nine squares

Possible pitch and swing locations with strike zone outlined

Fullcount calculates the distance between moves by adding the horizontal distance to the vertical distance. This method is sometimes called the “Sidewalk Distance.” For example, moves that are a knight’s move away from each other would have a distance of 3.

Image of the strike zone grid with the ball one space above and two spaces to the right of the bat.

distance = 3

The distance between the pitch and the swing is the key to determining what happens in the game: Does the batter hit the ball? Is it a strike? A fly out? In tuning the game, we have to decide what outcomes are reasonable for each distance, and how likely they should be.


Matching distances with outcomes

The batter’s goal is to get a hit, and the pitcher’s goal is to strike out the batter. Thus a small distance between the pitch and the swing should benefit the batter. A large distance should benefit the pitcher. To have a game that feels balanced, the pitcher and batter should both have reasonable chances of success. It could be argued that they should have equal chances of success; however, the pitcher is successful more often than the batter in the game of baseball.

When we did our provisional tuning in January, we took MLB statistics as a guideline. We looked at how often, on average, at-bats end with strikeouts, homeruns, singles, doubles, etc. Our experiences with playtesting, however, have shown that the outcomes that are most ‘realistic,’ i.e., truest to MLB play, are not the most satisfying for a PvP strategy game. In re-tuning, we’ve moved away from this model in favor of a more evenly balanced match-up between batter and pitcher that the playtests have suggested suit Fullcount’s gameplay better.

So which distances should be good for the batter and vice versa? Here are some calculations that help us to answer this question. Below is a grid that shows the expected distance between a swing in each square and a random pitch. The expected distances are calculated by adding the distances from the square in question to each other square and then dividing the sum by 25 (the total number of squares).

Image of the strike zone. In the top row, the first three squares starting from the left contain the values 4, 3.4, and 3.2. In the second row, the second and third squares contain the values 2.8 and 2.6. The center square contains the value 2.4.

Expected distances between pitch and swing for swings at various places on the grid.

Because of symmetries, these squares are the only ones we need to consider.

The square with the thick black outline in the center of the image separates the strike zone from the rest of the playing area. Pitches to the inside of the thick black square will be strikes if the batter does not choose to swing. Pitches outside of it will be balls. 

Let’s leave balls and takes aside for the moment and assume that the batter swings. In that case, we can see from the illustration above that the squares with largest expected distances are the three squares outside of the strike zone (with distances of 4, 3.4, and 3.2). The pitcher wants the greatest possible distance between the pitch and the swing, to keep the batter from hitting the ball. This means that the pitcher is incentivized to throw outside of the strike zone, at the squares with the greatest expected distances. The batter, who wants the smallest distance possible between pitch and swing, is incentivized to swing inside the strike zone, where the expected distances are all less than 3. 

Looking at these expected distances also gives us a sense of where to make the split between outcomes that favor the batter and those that favor the pitcher. Swings inside the strike zone have expected distances between 2 and 3. Between the distances of 2 and 3, therefore, is the logical place to make the shift. In general, a distance between the pitch and the swing of 2 or less should be favorable to the batter. A distance of 3 or greater should benefit the pitcher.


Checking for balance

We can test this decision by thinking about what it means for players’ strategy. Consider a swing in the center of the strike zone. In some sense this is a “proper” swing, as it gives the batter the best chances against a random pitch. The diagram below shows whether a pitch in each of the squares should be better for the pitcher (green) or the batter (red).

The strike zone grid. The three squares at each corner of the grid are green; the rest are red.

Red squares are pitch locations that favor the batter; green favor the pitcher.

There are 13 pitch locations that are favorable to the batter and 12 that are favorable to the pitcher using the above split. This suggests that the split (distance <= 2 batter-favored and distance >=3 pitcher-favored) may be the right decision in terms of balances.

Given the decision on splits, how should the game be balanced? Eight outcomes are possible for each pitcher-batter interaction:

  1. Strike
  2. Ball
  3. Foul
  4. Single
  5. Dougle
  6. Triple
  7. Home Run
  8. In-play Out

In practice, at-bat tends to be more fun if there is time for the suspense to build. Results 4-8 are finalities. They end the encounter immediately. If the goal is longer at-bats where the suspense builds, Results 1-3 should be heavily emphasized. Foul balls are especially important because the batter cannot strikeout with a foul. Foul balls always extend the encounter and build suspense.


Other considerations

In Devlog #1, we talked about wanting to keep some low-probability outcomes in the game, such as a rare chance of getting a hit even with a large distance between pitch and swing, or a small chance of missing the ball and getting a strike even if the batter swings pretty close to the ball. We wrote about how we were adjusting the game to make sure those outcomes didn’t happen so often that they clashed with players’ expectations and broke their immersion in the game. After testing, we’ve decided to eliminate most of those outcomes. The suspenseful wait to see if you’ve read a pitch correctly and swung at the right square proved more exciting than any uncertainties provided by chance.

Since the first devlog, we’ve also introduced Fullcount’s campaign mode, which you can read about in Devlog #3. In this round of tuning, we’ve paid attention to balancing the game for both campaign mode and PvP.



Fullcount has evolved greatly since the earliest playtests, and it will continue to evolve as more and more people play it. If you’re coming back to Fullcount after having playtested in the winter, you will notice:

  1. More foul balls (game-extending outcomes) and fewer in-play outs (game-final outcomes; not dependent solely on the batter and pitcher).
  2. A more even balance between pitcher-favored and batter-favored outcomes.
  3. Less chance; more strategy (though randomness continues to play a role).
  4. The addition of the bot campaigns (currently in testing) for a new strategic dimension.

Thanks for reading, and be sure to check out Fullcount when the Nova League launches on Arbitrum Nova on March 15th!