Closing the Gap to the Real NBA
This whole update started with a weird bug.
In September I was finishing up Commissioner Mode, the tools that let you edit any player in your league. While testing it, I cloned Jalen Brunson and changed nothing but his name, and the copy came out a full grade lower. Same exact ratings, but Brunson read A and the clone read B+. Moving any one of the real Brunson’s ratings by a single point dropped him to B+ too.
So the editor was doing the math right, and the problem was the original card. When I checked the whole Today’s NBA roster, about four in five players had an overall rating higher than their own ratings supported. We were showing 34 players at A or better, and their ratings only backed up 12 of them. Some parts of the game read the badge and some read the ratings underneath it, which meant the game and your screen disagreed about how good a lot of players were.
That’s not something you can patch around. So I held v1.2 and took the whole thing apart: how every rating is built, how the sim uses each one, how players grow and age, and how coaches and minutes work. That turned into five weeks of rebuilding and testing. The first attempt burned through about 5 million simulated games before I scrapped it and started over with a cleaner plan, and everything in this post came out of the second one.
At the same time, you all kept telling us the same four things. Stars didn’t score like stars. Benches played too much, so the fifth starter and the tenth man looked about the same. A team built around one great player won fewer games than its talent said it should. And the league felt flat, with few dominant teams and few truly bad ones.
Fair complaints, all four of them. For v1.2 we went after each one, and every change got measured against real NBA seasons before we kept it. This post covers what we changed and how we tested it, then puts our numbers next to the real ones in five side-by-side panels. The misses are in there right next to the hits, since a calibration post with only hits is basically an ad.
How we test
The short version: we play the real league back through the sim. Take the 2025-26 season. We load that year’s rosters, run the schedule, and compare. How many points did each team score? How many games did each team win? What did every player average? How many minutes went to the best player on each team, the second best, the twelfth?
Some of these replays use the real injuries too. A player sits out exactly the games he missed in real life and the real fill-in players take his minutes, so the sim plays the season that happened. On top of that, we run fresh Today’s NBA leagues and compare them against the real season and against the preseason projections from USA Today and ESPN.
Before we score any change, we write down what counts as a pass. Then we run it once and keep the result, good or bad. If a change helps one number and breaks another, it doesn’t ship. And if you’re keeping score at home, we’ve now simulated 33,000+ seasons and 43 million+ games, counting the first attempt we scrapped. For reference, the lifetime count before this update was 3,700 seasons and 5.4 million games, so this one patch ran about seven times as many games as everything that came before it.
What we changed, in player terms
Only finished, tested changes made this list.
-
Passers make teammates better. A good passer raises the odds on the shots he sets up, and assists go to the players with the passing skill, so the right guys lead the league in them.
-
Rim finishing follows skill. Inside scoring used to take points away for quickness and mark down big men who score on touch. Now it’s finishing ability that decides it.
-
Free throws are drawn by skill. Getting to the line comes down to handling, strength, speed and height, and free throw percentage comes from the Free Throw rating.
-
Minutes look like NBA minutes. Starters play starter minutes and close out games. Garbage time exists now, so a blowout empties the bench the way it does on a real night. The minutes leaders get to 36 a night.
-
Durability comes from history. The Iron, Normal and Fragile tags on the Roster page now come from each real player’s games-missed record. Before this, almost everyone read Normal. We also fixed a bug that counted a season with no NBA games as a whole season missed, which had been stamping Fragile on fringe guys who simply hadn’t played yet.
-
Defense and IQ matter. A lineup of good defenders lowers what opponents make inside, with Defensive IQ counting the most, and a lineup of bad ones gets burned. Offensive IQ improves shot quality and cuts down on turnovers.
-
Players develop on a believable curve. Decline starts around 29, players at 80 and up grow at half speed, and skills like passing and shooting keep growing later into a career than athleticism does.
-
Generated draft classes look like real ones. Four seasons in, a generated class used to hold about 8 players rated 86 or better. Now it’s 3 or 4, and the real NBA sits at 3.5.
-
League scoring matches 2025-26. A Today’s NBA league averages 115.5 points per team per game. The real season averaged 115.6.
-
Coaches matter. Every head coach’s offense and defense ratings count in games now, where before only the offensive-minded and defensive-minded types got that. A scheme that fits your roster still helps, but it can’t hand a team talent it doesn’t have anymore. Averaged over the league, a head coach moves his team by about 2 wins a season, and the teams a coach helps most and least sit about 8 wins apart.
-
Assistant coaches grow too. Some assistants get a high ceiling now, the ones sitting in the free agent pool develop, and mentorship works faster.
-
Playoff basketball plays like playoffs. Games slow down, starters play more, shots get harder, and injuries run at the normal rate.
-
Team grades match how teams play. A great coach can’t lift a weak roster into a Title Contender tag anymore.
Panel 1: league averages
Fresh Today’s NBA leagues, 40 seasons each. “Before” is v1.1.4, the build you’re playing today.
| Before | Now | Real 2025-26 | |
|---|---|---|---|
| Points per team per game | 113.1 | 115.5 | 115.6 |
| Possessions per team per game | 100.4 | 103.5 | 102.6 |
| Players scoring 20+ a game | 29.2 | 35.0 | 40 |
| Players scoring 25+ a game | 12.2 | 13.8 | 15 |
| Players per team averaging 30+ minutes | 3.2 | 2.8 | 2.8 |
| Players per team averaging 10+ minutes | 11.7 | 13.3 | 14.2 |
| Top five players’ share of team minutes | 57.8% | 52.6% | 51.2% |
Scoring and minutes both landed close to real. The one that’s still short is the 20+ scorer count, which sits five below the real season.
Panel 2: team level
Wins are where a sim shows its weaknesses, so we check them two ways: a fresh Today’s NBA league against preseason projections, and a 2025-26 replay with real injuries against the real standings.
| Before | Now | Target | |
|---|---|---|---|
| Fresh league: average miss per team, in wins | 11.2 | 7.2 | lower is better |
| Fresh league: correlation with projections | 0.24 | 0.77 | higher is better |
| Fresh league: spread of team wins (SD) | 10.6 | 13.8 | 11.9 |
| Fresh league: teams winning 60+ a year | 1.4 | 2.8 | 2 |
| Fresh league: teams winning under 20 a year | 0.5 | 1.6 | 2 |
| 2025-26 replay: average miss per team, in wins | not measured | 8.6 | lower is better |
| 2025-26 replay: correlation with real wins | not measured | 0.68 | higher is better |
| 2025-26 replay: spread of team wins (SD) | not measured | 13.3 | 13.6 |
| 2025-26 replay: teams winning 60+ a year | not measured | 2.8 | 3 |
| 2025-26 replay: teams winning under 20 a year | not measured | 2.5 | 3 |
So the flat league is gone. In a fresh league, the spread of team records went from 10.6 wins to 13.8, and the correlation with preseason projections jumped from 0.24 to 0.77. We now overshoot the projected spread a little (13.8 against 11.9), but the real 2025-26 spread was 13.6, so the projections themselves run tighter than a real season does. Over 40 seasons of a fresh Today’s NBA league, the average miss on a team’s long-run record is 5.8 wins, with a correlation of 0.83.
One caution on the v1.1.4 numbers. That build’s roster file predates the September roster moves the projections assume, so part of its miss comes from old rosters and not the engine. We couldn’t separate the two cleanly, so read the Before column as “what you have today” rather than a pure engine test.
The replay still misses a typical team by 8 or 9 wins. Over 40 replayed seasons the worst misses were Indianapolis (23 wins too many), Detroit (21 too few) and Portland (19 too few). Here’s how individual teams land over 40 fresh seasons:
| Team | Preseason projection | Our average | Gap |
|---|---|---|---|
| San Antonio | 61 | 60.9 | -0.1 |
| Charlotte | 31 | 30.6 | -0.4 |
| Atlanta | 45 | 44.2 | -0.8 |
| Los Angeles (Sunsets) | 46.5 | 45.6 | -0.9 |
| Miami | 48 | 50.1 | +2.1 |
| Oklahoma City | 62.5 | 69.7 | +7.2 |
| Toronto | 44.5 | 55.7 | +11.2 |
| Boston | 47 | 59.3 | +12.3 |
| Bay Area | 38 | 55.3 | +17.3 |
| Washington | 30.5 | 24.2 | -6.3 |
| Philadelphia | 56 | 48.3 | -7.7 |
| Chicago | 35.5 | 25.1 | -10.4 |
| Phoenix | 43 | 32.0 | -11.0 |
| Salt Lake City | 39 | 26.9 | -12.1 |
Panel 3: players
Here’s scoring per game for the stars we hear about the most. The first two columns are a Today’s NBA league, the build you have today against v1.2. The third is the 2025-26 replay, where every player misses the games he missed in real life. One thing to keep in mind: Today’s NBA uses the 2026-27 rosters, so a few of these stars play with different teammates than they did in 2025-26.
| Player | v1.1.4, fresh league | v1.2, fresh league | v1.2, replay of 2025-26 | Real 2025-26 |
|---|---|---|---|---|
| Anthony Edwards | 26.5 | 27.8 | 28.7 | 28.8 |
| Jalen Brunson | 27.7 | 27.7 | 25.3 | 26.0 |
| Devin Booker | 21.7 | 24.0 | 25.8 | 26.1 |
| Victor Wembanyama | 28.1 | 29.1 | 25.7 | 25.0 |
| Luka Dončić | 25.9 | 35.6 | 30.2 | 33.5 |
| Joel Embiid | 17.3 | 22.3 | 28.0 | 26.9 |
| Shai Gilgeous-Alexander | 31.1 | 32.6 | 37.3 | 31.1 |
| Nikola Jokić | 26.0 | 32.5 | 30.5 | 27.7 |
| Stephen Curry | 25.5 | 30.0 | 29.8 | 26.6 |
| Tyrese Maxey | 22.3 | 20.7 | 23.8 | 28.3 |
| Jaylen Brown | 22.7 | 25.5 | 24.8 | 28.7 |
Across the whole league, the replay has 33.4 players at 20+ (real: 40) and 16.1 at 25+ (real: 15). So we found a lot of the missing scoring, then put a bit too much of it at the top.
| Scoring curve, points per game | 1st | 2nd | 5th | 10th | 15th |
|---|---|---|---|---|---|
| v1.1.4 (Today’s NBA league) | 32.4 | 30.9 | 28.2 | 26.2 | 24.0 |
| v1.2 (Today’s NBA league) | 35.9 | 33.8 | 31.0 | 27.2 | 24.7 |
| v1.2 (2025-26 replay) | 37.3 | 31.3 | 29.5 | 27.6 | 25.6 |
| Real 2025-26 | 33.5 | 31.1 | 28.3 | 26.6 | 25.0 |
The sim also gives some stars more than they earned and some less. In the replay, Gilgeous-Alexander runs 6 points hot and Jokić and Curry about 3. On the other side, Maxey and Brown run about 4 cold and Dončić about 3. We know about these, and they’re on the list in the what’s-still-off section below.
Panel 4: minutes by roster spot
In fresh leagues, the rotation now sits within 1.5 minutes of real at every spot. Before, the seventh through twelfth players were playing 2 to 7 minutes too little, and the twelfth man barely got off the bench.
The 2025-26 replay is a different story, and not all of it is good news.
| Replay: minutes per game | 1st | 2nd | 3rd | 4th | 5th | 8th | 10th | 12th |
|---|---|---|---|---|---|---|---|---|
| v1.2 | 34.8 | 33.2 | 31.8 | 30.4 | 28.2 | 23.3 | 20.1 | 17.8 |
| Real 2025-26 | 33.8 | 32.0 | 30.4 | 28.9 | 27.3 | 21.9 | 18.7 | 15.4 |
The replay’s miss is the bench. The tenth and twelfth men still play about 1.4 and 2.4 minutes more than their real counterparts, and the top four play 1 to 1.5 minutes more than real. The replay also has 3.7 players a season logging 30+ minutes, against 2.8 in the real one.
Panel 5: injuries and absences
| Before | Now | Real 2025-26 | |
|---|---|---|---|
| Games played by players who average 30+ minutes, fresh league | 71.2 | 64.6 | 63.6 |
| Games played by players who average 20+ minutes, fresh league | 72.5 | 65.5 | 62.5 |
| Share of players rated Fragile | not measured | 27% | not applicable |
Short injuries are more common now, and season-ending ones happen at the same rate as before. The upshot is that a rotation player misses about as many games as a real one does, where before he missed far fewer. Playoff injuries run at the regular-season rate.
One more comparison: playoffs
| Before | Now | Real 2025-26 | |
|---|---|---|---|
| Change in points per team per game from regular season to playoffs | -2.0 | -5.2 | -7.7 |
| Possessions per team, regular season | 100.4 | 103.5 | 102.6 |
| Change in possessions from regular season to playoffs | +0.4% | -3.1% | -3.2% (2024-25) |
Before this round, a playoff game scored only a little less than a regular-season game. Now the playoffs slow down and tighten up the way the real ones do, though the real 2025-26 playoffs still scored about 2.5 points a game below where we land.
What is still off
This is the list we’d want to read before starting a ten-season league.
- Oklahoma City and the top of the league are too strong. In 40 fresh Today’s NBA seasons OKC won 25 titles and averaged 70 wins against a projection of 62, and about 2.8 teams a year win 60 or more against 2 projected, with the Bay Area (55 wins against 38), Boston (59 against 47) and Toronto (56 against 44) well above their projections.
- Some star-led teams win less than their talent says. Philadelphia and Washington both finish below their projections (48 and 24 wins against 56 and 30). We chased the gap and haven’t found the cause.
- Some stars run hot and some run cold (see Panel 3), and the replay has about 33 players at 20+ points a game against 40 in the real season.
- Star counts drift over long saves. A Fresh league climbs from about 39 players rated 86 or better to about 63 by season five, and Today’s NBA dips to about 30 by season two before recovering to about 35. This is the first fix after launch.
- The small stuff: Fresh leagues shoot a little cold and play slightly closer games than real ones, no player reaches 99, overtime is a touch rare (3.7 percent of games against 4.4), turnovers run a hair high, and imported BBGM leagues rate guards a little low. Fixes are planned for the first and last of those.
If you play a few seasons and something looks off, let us know. Several items on this list started as a message from one of you.
Where to find the old version
Your older leagues convert to the new ratings the first time you open them, so they won’t play exactly the way they did before. If you’d rather finish a save on the old engine, v1.1.4 is staying up at legacy.frontofficehoops.com. It loads saves only, so you can’t start new leagues there.
The full list of v1.2 changes lives in the changelog.
Go play at play.frontofficehoops.com, and tell us what’s off on r/FrontOfficeHoops.