Basketball GM is a single-player basketball management simulation game. Set your roster, make trades, draft prospects, manage your finances, and try to build a dynasty. Play it in your browser now, completely 100% free!
June 24, 2018 - New Feature
Today I released a new feature: difficulty levels! You can pick whether you want the difficulty of your league to be easy, normal, hard, or insane. You can do this when starting a new league, or you can change it at any time by going to Tools > Options.
Check it out. Damn, nostalgia. I had just graduated from college and was trying to learn both Python and GTK+ (both technologies long since abandoned by BBGM) while pursuing this crazy idea of making a basketball management sim.
Looking at the code, some of it has totally changed, but other parts still have a direct lineage to the code today. For example, the ridiculously simple initial implementation of game simulation is not that different than the only slightly less simple implementation used today. The overall structure is the same, and many of the functions remain quite similar. Example:
May 11, 2018 - New Feature
This feature has been requested a million times, but today it’s finally here: draft day trades! You will see it in all your leagues (if not, refresh the page until it says version 2018.05.11.1253 at the bottom), there are some new buttons on the draft page to make it easy.
Ever since the beginning, trades have not been allowed during the draft. The reason for this was a bad design decision I made: when the draft order was set, I moved the draft picks to a special table containig the picks and order for this year’s draft. This worked, but it was needlessly complicated (extra table for no reason, why not just leave it in the main one and filter for this year?) and it meant that code for trading picks didn’t work once the draft started.
I finally went back and got rid of that bad design, but it took a lot more time than it would have if I just did it right in the first place!
May 3, 2018 - New Feature
In the great novel “The Universal Baseball Association, Inc., J. Henry Waugh, Prop.” by Robert Coover, the title character starts to lose it when a young star player dies in a freak accident. The death was particularly meaningful because the young star wasn’t just anyone. He was the son of another player, a legend himself. Not that I want anyone to go crazy, but shouldn’t Basketball GM at least have the complexity of a fictional baseball simulation game played with dice, paper, and a pencil?
Well now Basketball GM has family relationships! Players can be brothers, fathers, and sons of other players. Here’s what it will look like on player pages:
April 11, 2018 - Performance
This probably won’t be noticeable unless you have played hundreds, or even thousands, of seasons in the same league. I know most people don’t do that, but some do. And for those who enjoy BBGM so much that they play thousands of seasons, I feel that I am obligated to make things work well for you.
Things still aren’t perfect, but they’re better. For example, viewing the Hall of Fame in a league with 3000 seasons played used to take about 5 minutes on my computer. Now it takes 2 minutes. The performance increase was by denormalizing part of the database, allowing an N+1 query to be removed (getting player stats for each of N players). With a relational database that could be done with a join, but BBGM is built on IndexedDB which does not support joins. Humorously, this part of the database was originally denormalized, and I had only normalized it because that improved performance. But after Project Iversion, normalization is actually worse than denormalization in this case.
Minor new feature in version 2018.04.08.66: you can now set the stadium capacity for each team. To do this, enable God Mode (Tools menu) and then go to Tools > Edit Team Info.
This will probably do weird things to team finances if you change it. You probably shouldn’t edit it unless you’re making a custom league file.
For people making custom league files, see the teams customization documentation for more info.
A lot of things have changed! If you want all the details, read the blog post announcing the beta. But the main points are:
Thank you to everyone who helped beta test these changes. You helped me improve it a lot from the initial beta. However, I know it's not perfect now. Why not? Because it's hard! Even if someone correctly notices an issue, it's difficult to fix it because everything is interconnected. Fix X, break Y and Z. So it's not perfect now, but it's pretty good I think. As always, please let me know if you disagree!
Today I released a new beta of Basketball GM featuring big changes to player ratings.
There were a lot of things wrong with player ratings previously. For example, the career arcs of ratings were very unrealistic. For example, it was not uncommon for a player to enter the league with no jump shot and grow to become one of the all time great shooters, or for a player to enter the league with horrible athleticism but grow to become an elite athlete. Sure improvement is possible - but not that much! I mostly implemented the changes described here to make individual rating changes more realistic.
Basketball GM has long had awards every season - MVP, Rookie of the Year, etc. But Most Improved Player (MIP) has been missing for a while. That's because MIP is harder to compute than other awards. You don't need just this year's stats, you need prior years too. And you also need to understand context - is a player actually improving, or just recovered from an injury? Or maybe he's an established star coming off a bad season? Or maybe his numbers went up, but only because he got more playing time without really improving? It's complicated.
Earlier this week I added a bunch of advanced stats to Basketball GM. Well, now there's even more.
Team Advanced Stats: Go to Team Stats and switch from Team to Advanced to view stats like Pythagorean wins and losses and offensive and defensive ratings. Basketball-Reference.com has a good glossary of terms if you don't know what some of the stats are.
Player Win Shares and Ratings: Player pages and the Player Stats page now show offensive and defensive ratings along with offensive win shares, defensive win shares, win shares, and win shares per 48 minutes.
Offensive rating is a metric of offensive performance, although you should probably also look at usage rate when evaluating it, otherwise you might think a low usage player like DeAndre Jordan is an offensive star. Defensive rating is a metric of defensive performance, although it has trouble assigning credit to individual players so it is inaccurate for good defenders on bad defensive teams and bad defenders on good defensive teams.
Win shares (WS) is a holistic stat that aims to condense a player's performance into one number, similar to PER. OWS is the offensive part, DWS is the defensive part, and WS/48 is win shares scaled per 48 minutes played, and a WS/48 of 0.100 is average.
However it is generally better than PER because PER is really stupid in some scenarios, such as high volume inefficient scorers. Check out this guy:
He's an inefficient volume scorer. PER thinks he's a star, but WS thinks he's just a little above average. WS seems more correct to me.
This presents an interesting opportunity for Basketball GM players! AI logic is heavily based on PER, but WS is often better than PER. Until I improve the AI, you can easily get a leg up by looking at players who are rated differently by PER and WS.
WS is not perfect though. The main problem is the same thing I mentioned about defensive rating: it will underrate good defenders on bad defensive teams, and it will overrate bad defenders on good defensive teams. So be careful or you might wind up signing the next Enes Kanter to a max contract!