Import Real Players, and how you can use it to create custom historical teams

Today I added a new feature to Basketball GM called "Import Real Players". It works similar to the old "Import Players" feature, except instead of you providing a file containing some players to add to your league, it just shows you a list of every single real player in the BBGM historical database. You can pick any age, or even have multiple versions of the same player, at the same age or different ages.

I think that's all pretty straightforward - just enable God Mode go to Tools > Import/Export Players and click Import Real Players.

But I also wanted to write this blog post to explicitly describe how to use this feature for one cool application that several people have asked me how to do over the years. How can you create an entire team (or even an entire league) made up of some particular set of real players?

Read more...


Real players leagues created during the current playoffs now include draft lottery results

In real life, the draft lottery happens in the middle of the playoffs.

In BBGM, the draft lottery happens after the playoffs.

This poses a little bit of a problem when real players leagues are started in BBGM after the draft lottery has happened, but before the playoffs have ended. Because in real life the lottery is over so a lot of people want those results in their BBGM leagues, but in BBGM the lottery hasn't happened yet.

Read more...


Face updates - relatives, and save changes easily from the editor

March 23, 2025-

The latest update has two nice improvements to the cartoon player faces. First, relatives now look similar rather than being completely random. Here is an example of four brothers:

Read more...


Free agent contract fixes for football and hockey

This started because of a post on Reddit wondering why ZenGM Hockey was slower than the other games. I figured I should investigate. And I found some low hanging fruit! A significant amount of time during the regular season was spent computing free agent contract values for released players.

That sounds pretty silly, and it is. The reason it's possible at all is because of how free agent contracts work. It's a somewhat complex and slow algorithm. So slow that it doesn't work at all in Football GM and ZenGM Baseball - for those I do a simpler method, which is just a simple formula based on how good/old a player is. But the complex algorithm works quite well in Basketball GM (fewer players), and it works okayish in ZenGM Hockey.

Read more...


Null values for historical stats

BBGM has had real players and historical stats for a long time now. One tricky part about historical stats is that most stats were not recorded originally and only started being recorded at some later date. For instance rebounds weren't tracked until 1951, and blocks/steals weren't tracked until 1974.

The correct way to deal with missing data like that is to leave it as missing data - your system should support some data being missing or "null", and still work despite that. BBGM did not work that way originally, because back before historical data was in the game, it was all simulated data. That means I never had to worry about some stat not being tracked - everything was always tracked! That's a lot easier to deal with than data where sometimes stuff is missing, because then every time you want to do something with a stat, you need to check if it actually exists. That's especially difficult to add to an existing codebase where there are a bunch of different places you need to update to handle missing data.

So when initially adding historical stats back in 2021, I "solved" this problem the easy/lazy way. Rather than adding support for null values for stats, I just replaced all the null values with 0. So if you looked at a player from the old days, you'd see something like this:

Read more...


View career totals/averages for ranges of seasons on player profile pages

February 2, 2025-

On player profile pages, you can now view career totals/averages for ranges of seasons. First you click this button below any player stats table (except fielding in baseball, cause I didn't want to have to worry about multiple positions):

Then you get an extra row at the bottom of the table where you can select a range of seasons to sum over:

Read more...


Bulk actions from any table of players

January 28, 2025-

New UI feature! Apply bulk actions to multiple players selected on any table in the game. You can use it to:

Access this feature by clicking the ... feature to the top right of a table, and then click "Bulk select":

Read more...


Trading block filters

The trading block is one of the most commonly used features in BBGM, and one of the most common feature requests for the trading block is to add some way to filter trades. Currently teams give you a mix of different types of assets, but in some situations maybe you want to trade for draft picks, or maybe you want to trade for a point guard, or maybe you want to trade for some interior defense. Previously there was no good way to do this, but now there is! Behold, trading block filters:

Read more...


2024 usage stats

January 1, 2025-

Every year I post some usage stats here. This year, there is some (very minor) bad news. For the first time since they were released in 2013, my games declined in popularity since last year! But it was a small decline, and 2024 was still the 2nd best year ever, so that's not really a bad year.

Is ZenGM plateauing around its current usage? Or entering a period of decline? Or just experiencing a minor road bump on the way to world domination? Check back next year to see!

On the plus side, I did change the data displayed in these blog posts a bit. Previously one of the metrics I showed was Pageviews, which is something that matters to advertisers, but is kind of meaningless otherwise. I replaced Pageviews with Seasons Simulated, which is a more interesting number.

2024 usage stats:

Read more...


Some small improvements

December 23, 2024-

I've been working on some stuff, but it's not done yet. In the meantime, I've continued to do little fixes as I normally do, but nothing was big enough to make it to the changelog until today's update about the contract negotiation UI.

That's often how it is - small bug fixes or improvements don't get entries in the changelog because I don't want to bother you about every little thing. But since there haven't been other updates lately they'd been building up a bit more than normal, so I figure I'd share what these kinds of little improvements typically look like.

These are the small changes in the latest update:

Read more...