Restoring History: Creating WoW Classic Panel Recap
The highly anticipated World of Warcraft Classic experience has long been a topic of interest among the community, but to truly understand the undertaking of bringing a Blizzard quality experience to life, software engineers Brian Birmingham and Omar Gonzalez along with Game Director Ion Hazzikostas took to the stage to share their insights.
Finding the Pieces
To simplify the essentials of creating a game, Omar boiled it down to three main factors: database data, art assets, and source code.
- The database data includes hit points a creature has, the amount of stamina an item has, spawn locations around the word, and millions of other data points.
- Art assets include everything from how a night elf looks when it Shadowmelds, to the sounds a Pyroblast makes, to the motion of an orc swinging an axe.
- The source code is the instructions on how to display the game, process input, and connect people.
To start out, we had to find out how far back our source code went and discovered our code repository went as far back as 1997, well before World of Warcraft began development.
This was a good start, but there were issues with how game development used to handle updates to the database data. Unlike our code, which had multiple branches of the game that could be worked on and developed as separate pieces, our earliest database data was overwritten with each commensurate update. Thankfully, we fixed that problem very quickly after launch, and when we looked, we found data going back to version 1.12, and even earlier.
Finally, we found our Art assets on old tape backups, which matched all the database data we’d preserved.
With all three components coming together, we were able to do a test and login to the game, create new characters, kill boars, and complete some quests.
Classic Gameplay in a Modern World
While we had a working version of the game, there were many additional challenges we needed to overcome. The technology supporting the game has come a long way since when it first launched including: cloud support, Battle.net App integration, customer support features, and a lot of previously corrected bugs and exploits.
To get past these hurdles we looked at what we liked (art and data) of what we had and what we didn’t like (the code). We wanted to see if we could utilize classic art assets and data within our modern code and get things to play nicely together. Things didn’t quite work right out of the gate, but with some trial and error, we were able to pull together a proof of concept of how we could get things to work together and have something playable. This built our confidence that we could deliver a Blizzard quality experience within our modern platform.
From Prototype to Demo
Our building blocks, of database data, source code, and art assets interplay with each other to create player-facing features like terrain, gameplay, animations and lighting. Different features require the building blocks to relate to each other in multiple ways.
To fully understand the interplay, consider terrain. This includes the placement of hills and valleys, trees, buildings, and more. When hooking up the old terrain data files to the new modern game system we realized that the way the system looked at the shape of data was different. This resulted in the updated system and classic data not aligning resulting in things like Kolkar campfires underwater or burnt out trees from the Cataclysm era.
1.12 Terrain Data
Fortunately, our modern editor is able to perform some of these data conversions and for the terrain data we can convert it with the same editor we use on Battle for Azeroth. The modern editor knows how to load the old terrain format and how to transform it into the new terrain format and export it to our modern engine. This corrected the issues of campfire placements and the appearance of trees among other things.
Another hurdle we overcame is in how we store and merge our data. World of Warcraft has multiple patches in development at any one time because every patch is in a different stage of development. If we add an art asset or terrain file to one patch, we wanted to have it automatically show up in later patches. In the fourteen years of progression, this has always been done in a fixed linear timeline. If we had simply inserted our new patch for classic into current development, we would have overwritten things like the current dam in Loch Modan with the previous restored version. This would have caused issues for Battle for Azeroth’s release.
To avoid this, we taught our tools some new tricks so that we could patch classic without affecting the current version of the game. We copied the 1.12 data into a new project, taught our tools to distinguish between them, and now as we make patches any changes stay within the classic chain without ever interacting with the mainline patches. This might seem simple – like copying a directory – but the tricky part is teaching all our tools how to understand this so that they can make edits for us automatically. Being able to use our internal tools is a huge benefit and we wanted to make sure classic has access to all our infrastructure and data.
Classic Models and Animations
We’ve also taken the time to fully restore the models for the classic appearance, but as we worked to restore these, we found some models were broken. In some cases, we were missing textures and had to do some research to find out just how those items should appear and correct them within the system.
The original animations have also been restored, but our animation system is tightly coupled with our gameplay code. We had to make changes to both data and code to get our animations back to the 1.12 look. We ran into a few bugs along the way such as where models that should appear prone would instead appear upright and vice versa, but we were able to correct these with a few fixes.
Restoring Class Systems
We made a lot of progress just converting data to code, but some systems don’t have a modern equivalent. The class probably most affected by this is the hunter. The pet happiness and loyalty systems were removed as well as pet training and the ability to use both a ranged weapon and a melee weapon. Those are cases where converting the old data to the new system wouldn’t work because there is no new system for them. In this instance, we had to bring back the old code -- and we did. Fortunately, the restoration went smoothly though the reality of having to buy arrows or feed their pets again took a few people by surprise.
This issue wasn’t solely a hunter issue. Rogues combo points also had to have a code change because our modern resource system knows how to gain and spend combo points, but not how to lose them when changing targets. There are also the older combat formulas to consider. In this case, we brought back the code for the prior combat formulas including critical hits and crushing blows. Their chance to occur is also modified by the difference between the defender’s defense and the attacker’s weapon skill. Yes, weapons skill is back. We had the data for them, but we needed to restore the code that increased your skills when you used them and made your skill level affect your chance to hit or get a glancing blow.
User interface and Lighting
The character screen is a great example of an iconic user interface that we clearly needed to restore and made sure to put some effort into bringing back that feeling even down to the screen effects and lighting behind the character. While we don’t want to promise perfection, we can promise that we are doing side-by-side comparisons and trying our best to create an authentic experience.
For another example of lighting, we looked at Elwynn Forest. We had a period in Warcraft’s history where we changed all the lighting equations and as a result, our environment artists had to take a pass over all of the zones to improve the lighting and take advantage of the new equations. To recreate the original experience, we had to rewind those changes. The first thing we did was restore the old lighting data. This brought us much closer to the original lighting and with a few more changes to the distance formula, fog formulas, and some changes to shadows, we were able to bring things even closer to the original lighting.
Are You Done Yet?
With all this work, we’re sure you’re wondering if we’re done yet or if it just wouldn’t be easier to update the reference client.
After this past year of working on this project and forging our way through the various bugs and challenges, one consistent theme is that the difference between what we have and what we want is clearly visible. When we look at today’s World of Warcraft we can see the differences between it and classic. If we tried to update the reference client, we’d be tracking down a lot of invisible changes such as exploits waiting to be abused, crashes that don’t show up until you have millions of players online at once, and more. We chose to approach the problem in a way that makes our job clear and obvious instead of difficult and hard to see.
We’re not done yet and we have lots of capital city features to look at such as banks and auction houses. We need to test our dungeons and raids to make sure the boss abilities all still work correctly, and we need to examine all of our PvP systems.
Philosophy and Future Plans
In restoring World of Warcraft Classic, we wanted to provide an authentic experience in which if someone hadn’t played the game since the start of it all, they’d be able to seamlessly pick up right where they left off. Things might run a bit smoother and the hardware is better, but the game should still feel like you’re playing World of Warcraft from 2006. A big part of that isn’t just the combat equations and the skill, but it’s also about the social dynamics and the reliance on others such as the difficulty in finding a group and the resulting reliance on them once you’re in a dungeon or some other encounter. We also wanted to make sure we didn’t go down a path of changing the 1.12 data and the resulting experience with the game.
Many decisions we made were fairly clear cut. Things like Dungeon Finder were clearly a ‘no’. We also made sure to exclude cross-realm grouping, the achievement system, unified auction houses, and – yes – flying.
Other decisions were slightly less clear cut. At one point there was an 8 debuff limit. This was later raised to 16 and today there is no debuff limit. This change radically changed the balance of classes and strategies players could employ when using these debuffs to overcome content. To avoid cracking into the 1.12 data, we’ve settled on a debuff limit of 16 for classic.
In-game mail between guildmates now is instant but, in the past, it had a 1-hour delay, like mail between strangers. The change to instant mail made things more convenient but removed the social interaction of having to meet up with someone to make a transaction if you wanted something sooner. So, we’ve reintroduced that delay for that reason. Other conveniences such as auto-completion of names or quickly clearing a mailbox have been left in. This seemed an easy enough call given that someone could create an add-on to do the very same thing and we felt there was no point in removing those sorts of conveniences.
Loot trading in the past used to often involve customer support if someone accidentally looted something they didn’t mean to. With the more modern system, players are given a period of time in which they can still exchange loot with others. This is a convenience we felt was worth retaining for classic rather than creating a volume of support tickets that were wholly unnecessary to the experience. (Sorry ninja looters!)
For classes who rely on energy regeneration such as rogues, things have also changed significantly since classic. Regeneration used to occur in chunks based on the server ‘heartbeat’. So, to gain 20 energy, it would take a full two seconds. Today, the system is smoothed out so that that 1 energy regenerates every tenth of a second. This difference changed the timing of being able to use certain abilities. What seems like a minor convenience today actually changes the very flow of combat rotations and burst capabilities in classic gameplay. We felt this was important to restore to provide this authentic experience.
What add-ons can do has changed over the years and have become much more sophisticated as authors have gained years of experience and savvy. We’re not 100% on a concrete solution to what this means for classic yet, but one thing we know is that we’re not going to roll all the way back to the 1.12 add-on API. Doing so would open the way for nearly complete automation of combat decision making allowing for ‘bot’ behavior that is counter to the core WoW gameplay experience. This is one thing we know we don’t want. On the other end of the spectrum, the modern API offers some additional functionality for creating social features that could also undermine the authentic Classic experience. We’re still figuring out the details and looking for a good middle ground. We’ll be keeping a close eye on feedback from the community and add-on authors on where we should be setting those boundaries.
Content Release Plan
While we’re starting with version 1.12, we also want to make sure we’re providing the journey players will expect. To provide the roadmap for this journey, we have four additional stages that we plan to integrate into the experience over time.
- Stage 1: Molten Core, Onyxia, Dire Maul, Kazzak, Azurgos
- Stage 2: Blackwing Lair, Battlegrounds and PvP rewards, Zul’Gurub
- Stage 3: Ahn’Qiraj (including opening event), Tier 0.5, Silithus content, Green Dragons
- Stage 4: Naxxramas Raid, Scourge Invasion
These plans are subject to change, but we wanted to provide an inside look at what's ahead. We look forward to continuing to hear your thoughts and know we still have a lot more work ahead of us.