← Back to the dev blog

DEV BLOG / 03

Getting two teams through a game

Taking the more varied player profiles into a first single-game simulation.

Game screenshots
Bijan Rollinson and Derrick Tankry beside the football and draft artwork from Idleball.
Player data and artwork from Idleball.

The last update was about making the players less interchangeable. I could have kept tweaking that generator forever. At some point, I had to give the players a game to play.

So I started connecting it to the Game Simulation Engine. One matchup was enough for now. Thinking about a whole league before I could make sense of one game would have been a very efficient way to overwhelm myself.

Naming it an engine was the easy part. I had mistaken a filename for a qualification.

What changed since the last post

  • Player data moved into team rosters. I was working with two sides in a matchup, rather than checking generated players one at a time.
  • I started the single-game simulation loop. The immediate goal was to get those rosters through one football game and produce a result I could examine.
  • Ratings started needing a football meaning. I began working through how the differences from the player generator should affect what happened in a matchup.
  • I looked past the final score. Player contributions and the route to a result became part of what I needed to inspect.
  • The two engines started feeding work back to each other. Trying to use a player field in a game showed me where the generator was still making assumptions I hadn’t thought through.

Getting to kickoff

Prototype captures of the matchup and the game itself.

Before kickoffEarlier prototype
Earlier pregame view showing the matchup, team emblems and coach portraits.
The earlier pregame screen. Two teams, two coaches, and a game waiting to start.Open full screenshot
Following a gameAndroid · Build 286 · Sep 30, 2026
Live playoff screen with a scoreboard, game clock and play commentary.
A later playoff game in progress. Having somewhere to watch the scores and commentary made the simulation easier to follow.Open full screenshot

A score wasn’t enough

A better roster should usually have an advantage. It shouldn’t get handed a win. I understood that as a football fan; turning it into something useful in code was another job entirely.

The temptation was to see a plausible score and call the run a success. But a believable final number could hide some very questionable decisions underneath it. I needed to look at how the players contributed, especially after changing who was on the team.

This was progress, but I was nowhere near ready to declare that I’d cracked football simulation. Getting a result gave me something to investigate. It didn’t tell me the result deserved to be trusted.

That’s where the next stretch went: working out why a game ended the way it did.

All blog posts