Quake Live ran as a service for about 7 years, an incredibly long time by game service standards, and most of that time was spent running in a browser plugin. As browser vendors began to kick native plugins out of their browsers, we knew we had to do something. Our solution was to flip things around: instead of embedding the game in the browser, we'd embed the browser into the game. This ended up working pretty well, requiring mostly UI and initialization changes to correct some now incorrect assumptions. I emulated the plugin's interface within the game directly, and the game was mostly happy.
Once we decided to discontinue the service, we would have to figure out how to do everything we used to do on the web completely on the player's PC. Since Quake Live's underlying UI was still basically 15 year old Quake 3 code, it would not have been feasible to reach really any quality bar, especially compared to what the browser UI provided. Thankfully, the decision to embed the browser in the game a year earlier was ultimately what made this possible.
Codenamed the "Eternal Edition," this final version would ironically bring the game back to how it started: as a one time purchase game with user-run servers. We wanted to use as much of the Steam platform as possible, and this required a bunch of core changes to the engine. The big points from service to Steam from my perspective were:
- Rewrote the entire UI from scratch to run locally on the user's PC. Data was fed through extending the JavaScript object that the engine provided to the browser. I chose React for this project, which was very early in development during 2014 and 2015, recognizing the potential of reusable components in frontend development. React, even in it's infancy, ended up being a huge reason why the UI was successful.
- Added support for rendering TTF fonts through FontStash. We needed to support rendering UTF-8 names, and the increased rendering quality made the in-game 2D UI look fantastic.
- Replaced the stats pipeline with a ZeroMQ based solution. This let people access more stats than we even had originally, real-time, and let them feed it through external software written in any language. This ended up being really cool, and is definitely something I wish more games had.
- Refactored filesystem code to support reading from multiple directories. This let us integrate with Steam Workshop, which ended up being very popular for maps.
- Enhanced the dedicated server with features that were originally on the backend. Better map pool support, the ability to switch gametypes on one server, and make your own gamemodes by combining console CVars.
- An easter egg that has been found but still not successfully decoded!
Overall, this transition was great for the game's future, and I am immensely proud of what we pulled off as a 3 plus contractor person team.