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!
When you’re trying to make a trade, you can click the “What would make this deal work?” button to get a counter offer from the AI team you’re trading with. Often this results in the AI asking for something you really don’t want to give up, like your best player or a high draft pick. Then what you really want to say to the AI is, “okay, you can’t have that, but is there any other assets I have that could make this deal work?” But there was no way to ask that. Until now!
Today I released an update to Basketball GM containing a lot of small improvements to the UI. Most of them are small tweaks that, when seen in aggregate, will hopefully just make the game feel a bit cleaner and smoother.
But there’s also some sexy.
When I make a small improvement to Basketball GM, it feels silly to write a whole blog post about it. But if I don’t, some people will never realize what happened. So maybe this is a good idea: a single blog post explaining several recent small improvements.
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.
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:
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.
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!
I rolled out a few new features over the past week, all aimed at one goal: more stats. Ideally, Basketball GM should provide you with all the advanced stats available for real basketball leagues. It's not there yet, but it's closer. Here's what's new:
Team Opponent Stats: On the Team Stats page, you can now switch between team stats, opponent stats, and advanced stats. For seasons played before this update, the only opponent stats will be blocks and points, since those have both been recorded for a long time. Then in new seasons you play, you will get all opponent stats.
Team Playoff Stats: Team playoff stats were always recorded, but there was no easy way to view them. Now you can toggle between Playoffs and Regular Season from the Team Stats page, just like you've always been able to do for Player Stats. It's crazy this feature was missing for so long!
Player Advanced Stats: This is the real juicy part, more advanced stats! When I put PER in the game, I never intended for it to be the only advanced stat. I always wanted more, but performance was kind of shitty in general and I didn't want to add more stuff to slow it down. But now, with the glorious success of Project Iverson, I can add new features without too much concern for performance (don't worry, I benchmarked it and all these additional stats have very little performance impact).
Player advanced stats now sit in their own table, which you can view on player pages for individual players, or on the Player Stats page by switching "Per Game" to "Advanced". In addition to the old standbys, I added TS%, 3PAr, FTr, ORB%, DRB%, TRB%, AST%, STL%, BLK%, TOV%, and USG%. See Basketball-Reference.com for definitions, cause that's where I got them from. Most of these won't be available for past seasons because they are based on the team opponent stats described above, but some will be.
All the % stats (like ORB%) are calculated using the formulas at the page linked above, which means they are estimates. I could have stored data directly from game simulation to calculate real values, but I didn't do that. No real reason why. Arguments could be made either way, but at the end of the day I doubt it matters much.
Hopefully this is just the start of more advanced stats. I'd love to add a better holistic stat than PER, which is really not a good metric. What do you want to see next? Let me know on Reddit.
September 9, 2017 - New Feature
One of the cool things about Basketball GM is the time scale. The NBA has been around for 70 years, and in those 70 years all kinds of crazy things have happened - freakish players, lucky shots, huge upsets, tragic deaths, and more. In Basketball GM, you can easily play 700 years - you should get 10x as much craziness as the NBA! And you do get some.
But one thing that is missing is extremely freakish players. The best players alway feel kind of the same. That's because of the 0-100 rating system - once somebody is near 100 in most categories, he's the same as somebody else who is near 100 in most categories. You could imagine fixing that by abolishing the 0-100 system and letting ratings increase unbounded, but that is a bit too radical for my tastes. A more conservative solution is to decrease the range of normal. Take a 100 rating and make it a 75, then allow anything above 75 to appear only very rarely. That would allow for more unique stars that you might only see after playing thousands of seasons.
Don't get too excited. I haven't completely done this yet. But thanks to some help from Timothy Highley, it's done for height. Short players will no longer have height 0 unless they are really short, and tall players will no longer have height 100 unless they are approaching physiological limits.
This is an important change for people making custom rosters or running multiplayer leagues. When loading a league file in the new version, player height ratings will be adjusted to reflect the new scale. If you don't want this to happen (such as, if you're building a new roster file and want to specify the heights on the new scale yourself), add this to the root of your JSON object:
In the future, if there are more backwards incompatibly changes in file format, the version parameter will be used similarly in upgrades. For now, it only affects heights.
If you have any feedback, please leave a comment on Reddit.
You can now view the draft lottery live, as it happens! The lottery behaves the same as it always has, just like the NBA draft lottery, so this doesn't change gameplay at all. But it can be very dramatic to watch the lottery unfold before your eyes.
Google made me do it.
Basketball GM has always allowed you to open up the same league in multiple tabs, so you can easily view multiple different screens. This was originally implemented by running the entire game in each tab. Game data was always saved to disk via IndexedDB. And when an action resulted in a change to the data (such as playing a game, signing a contract, trading a player, etc), then a signal was sent to all other tabs telling them to update their data. This was kind of a crude approach, but it worked.
When life hands you lemons, make lemonade. Since Google decided to totally invalidate the tradeoffs I had considered when designing Basketball GM, I decided to re-evaluate. I came up with two ideas:
This is not an April Fool's Day joke! Basketball GM 4.0 is really here, and it's awesome. For those who haven't been following along, here are the biggest changes:
I'll make another post with more technical details soon, for those who are interested in such things.
Thanks you everyone for testing the first beta! All of the bugs people found have been fixed. The biggest change from the first beta is that multi-tab play is back. There are two caveats. First, you can only have one league open at a time. I figure this is not a huge problem, but let me know if you often do have multiple leagues open. Second, it is a little slower than the first beta, but still much faster than it used to be.
Also, multi-tab play does not work in Safari, so you can either play one tab per league in Safari or use another browser.
With that being said, here's the link to beta 2, please give it a try. To make sure you're on beta 2 and not the original beta, look at the bottom of the page. It should have a date of 2017.03.24.1059 or later.
I'll make another post with more details later, but right now, the beta brings some good and some bad:
Good: Performance, performance, performance. Depending on your computer and browser, you will find it about 10 times faster. That is a lot.
Good: It works in Safari now, although it's not that well tested.
Bad: You can only open a league in one tab at a time. I do have plans to restore multi-tab play, but I didn't want to hold up the beta for it. And single-tab mode will be needed as a fallback mode in some browsers, so it will be good to test it. Please do give me feedback on this. If single-tab mode is horrible, I will prioritize multi-tab mode.
(Also, accounts don't work on the beta. They aren't supposed to. That's not a bug.)
Until today, Basketball GM was hardcoded to always have 2 conferences, 6 divisions, and 16 teams in the playoffs. If you wanted to set up a league with a different structure, you were out of luck.
But today that has changed! You can have any number of conferences and divisions, and the number of teams in the playoffs can be any power of 2 (2, 4, 8, 16, 32, etc). Unfortunately this is only customizable by making a league JSON file, but it's not that hard, I promise. Here is the documentation and here is an example file with 3 conferences, 6 divisions, 12 teams, and a 4 team playoff.
Please let me know if you notice bugs related to this!
Previously, player names in Basketball GM were generated based on a list of name frequencies in the US in 1990 published by the US Census Bureau. In some ways this was awesome - it was a huge list of names, so there was a lot of variety. However the US population in 1990 does not exactly correspond to global basketball talent. There should be more African American names and there should be international names from basketball-loving countries.
I never fixed this problem because there wasn't any data I could find that was nearly as good as the census data I used previously. But now I think I have a better solution: DraftExpress. DraftExpress is a website about the NBA draft. It has player profiles for basically every NBA prospect in recent history, even fringe guys like minor college players and roleplayers in overseas leagues. That's a pretty good sample of the distribution of basketball talent, right? Maybe not perfect, but probably good enough to be better than the previous names list.
So I used my trusty wget to scrape draftexpress.com, and then I wrote a script to parse names and countries for all players in their database. After a little work to clean up the data (splitting names into first and last names while handling extra spaces like Nando De Colo; fixing typos in country names), I filtered the list of countries to get rid of those with less than 5 names because they would just become too repetitive. So sorry Suriname, you and your 2 names are gone. That left me with 28,377 names from 85 countries. To generate a player, the game randomly picks a country and then randomly picks first and last names from that country.
Particularly cool things about the new names:
This is live now, even in existing leagues new draft prospects will be generated with this new naming method. And you can see the countries of all the players in your league by going to the Player Ratings page.
The default teams now have logos! Thank you Elliott Strauss for all your hard work!
Currently you'll only see the logos on the roster page, which doesn't really do them justice. Eventually I will do a redesign to better utilize them. In the mean time, check them out here in their full glory:
May 28, 2016 - New Feature
Basketball GM has long supported a "Shuffle Rosters" option when you start a new league from a file. However it kind of sucked, because it would randomly shuffle players on all teams along with free agents, often leaving tons of really good players as free agents.
Now, it will only shuffle players actually signed to teams, leaving free agents alone. This is possibly still not ideal -- maybe it would be better to shuffle in comparably rated free agents while not changing the overall talent distribution -- but it's a hell of a lot better than it used to be.
I tested it using this user-made NBA roster file, and the Warriors got what they deserved to balance off the universe. Their best player was Jameer Nelson and they wound up with the worst record in the league.
February 6, 2016 - New Feature
At the God Mode screen (accessible from the Tools menu), there are now 10 new options you can use to customize your league:
Previously these things were all impossible (or very difficult) to change.
The caveat is, the AI might not respond well if you change some of these values drastically, particularly the financial ones. But hopefully it's still better than nothing. Let me know how you like it!
January 31, 2016 - New Feature
Previously, injuries in Basketball GM had no lasting effects. Once a player healed, he was good as new. In the real world, we know that's not true.
So now, in Basketball GM, serious injuries (over 25 games) can result in decreased athleticism, depending on the severity of the injury and some luck. As an example, someone who gets a 100 game injury (probably a torn ACL) will have a 50% chance of making a complete recovery, but also a 67% chance of losing between 0 and 10 points of his speed, jumping, and endurance ratings, and also a very small chance of a much larger catastrophic decrease. Each of those losses is independent, so someone might lose 1 speed, 9 jumping, and 3 endurance. Let me know if you think these numbers are too big or too small.
By default, Basketball GM uses random American names taken from the US Census. However if you’re making a custom league file designed to represent a basketball league in another country, it is annoying when the new players generated in your league all have names like "John Smith".
Now, when creating a League File, you have the ability to define the list of names used for randomly generated players. For more info, check out the documentation.
Today I added a new feature to Basketball GM called Multi Team Mode. Multi Team Mode lets you to control multiple teams within a league in the same way that you control one team by default. This enables a few new ways of playing Basketball GM:
To try Multi Team Mode, create a new league or load an existing league. Enable God Mode (in the Tools menu) and then a new option called Multi Team Mode will appear in the Tools menu. Click that and it will let you select one or more teams to control.
March 15, 2015 - New Feature
You can now go to Tools > Screenshot and it will save a screenshot of your current page to Imgur. Then you can easily share it on Twitter or Facebook or Reddit or wherever.
New feature! Go to Tools > Auto Play Seasons and you can tell Basketball GM to simulate through any number of seasons. The AI will take over your team for you and play through multiple seasons without any user input required.
I'm not sure how many people will actually benefit from this feature. I mainly made it for debugging. But I hope someone appreciates it!
Available now, view all the great performances in your league on one page. Just go to Stats > Statistical Feats. Triple doubles, 5x5s, 50 point games, etc. Eventually you will see this information pop up on player pages, team history pages, league history pages, and more. But for now, it's just on the Statistical Feats page, all in one place.
Note that this will only track performances from now on. It won't go back through the history of your existing leagues.
January 31, 2015 - New Feature
As of the latest version (2015.01.31.658), you can go to Tools > Export Stats within a league and export either player average stats or individual game stats. The exported file is in CSV format, which means you can easily view it in Excel or any other spreadsheet software if you want to more deeply analyze the stats in one of your leagues.
I know it's missing a couple things now (playoff stats, team stats, shot locations, ...), but I want to make sure the core feature works well before implementing all of those.
After a long beta (thanks for testing!), the new version of Basketball GM is ready. All your leagues will be upgraded automatically. The main difference is that game simulation is about 20% faster. Additionally, there are some minor bug fixes (the NaN bug is finally gone, I think) and enhancements (real injury descriptions show in old box scores and uploading exported league files is much faster).
On the downside, Internet Explorer is no longer supported. If you're an IE user, you can export your leagues still. Then you have the option of switching to Chrome/Firefox or using an old version of Basketball GM. Hopefully IE support will return to the latest version eventually, but I'm not holding my breath.
God Mode enables some features that are a little too close to cheating for me to want enabled by default. Specifically:
This post is to announce two new features that have gone live over the past couple weeks that should enhance the customizability of Basketball GM: full league import/export and draft class import.
It has come to my attention that some people are doing things besides constantly playing Basketball GM. The game just isn't addictive enough. Maybe part of the problem is that the game has always been self-paced. There's no way to "win", and there aren't any real objectives other than ones you define yourself.
Well, now that's changed. Today I added an "Achievements" system. This provides some challenges you aim to accomplish, like sweeping all 16 wins in the playoffs, winning a title with a low payroll, and winning multiple consecutive titles. See them all here.