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!
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:
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.
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:
January 5, 2015 - Technical
If you've been here a while, you may recall that Basketball GM used to be open source. Last year, I closed the source for various reasons. Now, I'm semi-opening it back up. My goal is to allow others to contribute to the development of Basketball GM without allowing a competitor to swoop in and just clone everything. I hope it works.
So please, take a look at the code and read the license. If everything looks enticing and you want to help make Basketball GM better, please get in touch! There are tons and tons of ways Basketball GM could be improved, in many different areas.
The set of technologies used as a foundation for a piece of software is sometimes called a stack. The most famous is LAMP (Linux, Apache, MySQL, Perl/PHP/Python). A trendier option is MEAN (MongoDB, Express.js, AngularJS, Node.js). And there are tons more, mostly tounge-in-cheek jokes at the absurdity of reducing a stack to a catchy acronym (at least, I hope that's what they are). There is even the LeBron stack: LevelDB, Browserify, and npm. In Basketball GM, I use npm a little and I indirectly use LevelDB through IndexedDB in Chrome, but sadly it'd be quite a stretch to say I'm using the LeBron stack.
What stack am I using? Nothing coherent or well established. Just a hodgepodge of things that somehow happens to work. But that's just not a catchy answer, so I set out to find a cool name for my stack. The LeBron stack is a fun name, so I figured I could try to find another NBA-inspired name.
December 10, 2013 - Technical
I wrote the first line of code for Basketball GM back in 2008, after I had graduated from college but before I started grad school. That code was C#, which I had never used before. My primary goal was to learn a new programming language and learn how to make traditional desktop GUI software, as previously I had only made software with either command line or web UIs. I was not sure if I was a good enough programmer to complete such an ambitious project, but I figured I'd give it a shot.