How Gamebreaking powered Blizzard's #WarcraftStory to #1 on Twitter

Sebastian Leon
Kevin Viglucci

Let me tell you a story...

Every character in World of Warcraft has a story to tell. Whether a veteran of Azeroth's many wars or a recruit fresh out of Northshire Abbey; each adventurer's deeds are forever recorded in the annals of history–or more precisely, on the game servers. When the time came for players to make their triumphant return to Azeroth for World of Warcraft's 9th expansion "Dragonflight", the stage was set for their stories to finally be told… on Twitter!

And so it was that on November 3rd, 2022, Blizzard launched the #WarcraftStory campaign. It all started with a simple prompt: tweet the official @Warcraft account your character's name, realm and region with the #WarcraftStory hashtag. In response, the player receives an infographic highlighting their character's heroic misdeeds, along with a render of their beloved character, exactly as they appeared in-game.

/images/posts/warcraft_story/intro.png

The frenzy was on! Players worldwide rushed to Twitter to have their stories told. Some stories boasted of victories over Azeroth's most ruthless villains, while others… Well, they brought to light a certain proclivity for falling from cliffs (often to the player's demise). Some players even did what the internet does best (create memes!), poking fun at themselves and their friends (all in good fun)!

In total, more than 390,000 stories were written for well over 100,000 unique players, causing the #WarcraftStory hashtag to quickly become the #1 trending US topic on Twitter across all categories, a position it would hold for the next 8 hours. All in all a hugely successful campaign, and Gamebreaking was there every step of the way.

A good story needs an expert storyteller

Let me take us back to the very beginning and ask the obvious question: how were the stories created? I alluded earlier to the game servers holding records on every activity that players engaged in, but somehow that massive amount of data for each character would need to be distilled down to a handful of facts which, in addition to being exciting and funny, could be woven together into a cohesive story. Furthermore, there was the added technical challenge of creating a composite image out of the story text, the character's render, and a background relevant to the story being told.

Blizzard knew that, in order to ever make this campaign possible within the timeline (the expansion would launch in 3 months!), they needed a partner with not only the proven technical expertise to build digital experiences supporting thousands of concurrent players, but also a deep understanding of what those players value, in-game and out. But where could such a partner be found?

Enter Gamebreaking Studios!

It's no secret that here at Gamebreaking, we love multiplayer games and the social experiences they create. So, when Blizzard shared their idea for #WarcraftStory we leapt at the opportunity and got to work on bringing their vision to life.

Fortunately, two other strategic partners were also brought into the project: IC Group would focus on interfacing with the Twitter APIs to scrape incoming tweets for character inputs, as well as tweet back the stories, and Cloudinary would provide the image transformation engine and CDN. It was up to our team at Gamebreaking to generate an exciting, unique story for each character, and to tell it in an eye-catching, composite image.

Let's run through the challenges and see how Gamebreaking tackled each one!

Weaving a Story

The elephant in the room was, of course, writing the stories–what data is available and how could we use that to create compelling stories? Our first step towards getting there was an exploration of the public Game Data APIs. We sifted through the APIs, searching for the most relevant data that could tell an interesting story about the players' exploits. Luckily our team's decades-long experience playing World of Warcraft and engaging with its community hugely boosted this process. From slaying Deathwing, to getting exalted with the Frost Wolf Clan (in OG Classic!), to obtaining Invincible, we'd been there and done that, and the result was the creation of a classification system where each character could fall into one or more predefined categories we called "buckets."

In order to decide whether a character belonged in a bucket, we would query the API for the relevant statistics, such as "number of defeated raid bosses" or "total battleground victories" and assign a resulting weight to the bucket. If the weight crossed a certain threshold, then the character would fall in that bucket. But in order to keep the story focused on a specific area of gameplay, only the bucket with the highest weight would be ultimately selected. And once we decided what the story would be about, we would once again go through the statistics from the API looking for the most exciting ones to put in the copy.

But no good story could go without the occasional happy little accident, so we collaborated with Blizzard to choose some statistics that weren't quite as heroic such as "number of critters killed" or "total times LOL'd". We attached one of these "fun facts" to the end of each story. And with that, we had our completed copy. What now?

No particle left behind

Blizzard's vision involved displaying the character's model next to their story in as flashy a way as possible, including their wildly disproportionate shoulderpads, glowy effects and all. We achieved this by composing together the character's pre-rendered model (as extracted from the Game Data API) with the static background image through a process called "alpha blending", which composes the images by placing one on top of the other and applying simple transparency (that's the alpha part). Unfortunately we quickly learned that any partially transparent particles were missing from the final images! This meant any exciting visual effects like fire or magical glow weren't visible!

In order to solve this problem, we brought in our video game engine experts to create a custom algorithm for premultiplied alpha blending, which allowed the particle effects to merge with the background colors. Next, we worked with the image transformation engine provider Cloudinary, who implemented the algorithm as an extension to their engine so we could execute it on every #WarcraftStory image. And by our powers combined, the equipment was restored to its full glowy glory!

If at first you don't succeed, re-roll!

As we got closer to the launch of #WarcraftStory, and our partners at Blizzard started using our service to generate stories for their own characters, an idea came to them: "what if we could tell more than one story for each character?"; after all, World of Warcraft players love to engage in multiple different activities such as raiding, PvP and mount collecting, and they may want to see each one featured in turn.

Could we do it? Absolutely! We called this feature "re-roll": a user could tweet the @Warcraft account multiple times with the same character inputs, and they would get a different story tweeted back each time (at least until we ran out of new stories for that character, in which case they would repeat from the top).

In order to accommodate this new requirement, we needed to give our service the ability to keep track of previous requests made for any given character so that we wouldn't tell the same story twice. We achieved this by adding a Redis Key-Value (KV) store to our deployment: each time we generated a story we would record the selected bucket in the KV store under the character's ID, and the next time a story was requested for the same character we would check the KV for the previously recorded selections and remove them from the set of available buckets. Boom, re-rolling!

Bracing for Massively Multiplayer

Predicting the success of social campaigns is notoriously difficult, but we knew we wanted #WarcraftStory to go viral, and that meant we had to be prepared. In the best case scenario, we would receive a huge influx of requests as word of mouth spread and players flocked to have their stories told, but eventually interest would wane and the volume of requests would decrease just as sharply. Spoilers: this is exactly what happened!

In order to seamlessly support both low and super-high levels of concurrency, we opted to containerize our service and deploy it serverless, which gave us the huge advantage of automatic scaling. As the madness unfolded, we observed our instance count spike up to 12 and then dwindle down to 1 after things cooled down, without any sort of manual intervention from our team. This choice not only had the service running smoothly throughout (despite the hundreds of thousands of requests) but also kept the hosting costs reasonably low, as we were only charged for the active instances.

The final important consideration for Blizzard was ensuring that there was enough variety in the stories that were produced so that no one bucket had an observable lead over the rest. We catered to this need with a one-two combo: First, we built a bespoke testing tool that would enable us to repeatedly run over a million characters through the story generation service. Second, we created a dashboard that would allow us to quickly visualize how many characters would fall in each bucket for a given test run. With this data in hand, we collaborated with Blizzard to iteratively tune the over- and under-represented buckets' entry criteria until a good balance was achieved.

#WarcraftStory goes viral

The first two days of the campaign were absolute insanity. #WarcraftStory held the #1 trending status on Twitter in the US for about 8 hours, and generated massive buzz for the Warcraft brand, which was mentioned in over 750,000 conversations over the first two days. And the players loved it! Out of the more than 100,000 unique Twitter users that participated, 28% came back to get another story for their characters through the re-roll feature, tallying up to well over 390,000 total stories generated over the whole length of the campaign.

The madness could not be contained to Twitter; there were over 620,000 usages of the hashtag across other social media platforms such as Instagram, TikTok, Reddit, Twitch and YouTube, where many WoW content creators shared their stories and commented on the whole phenomenon. Various news outlets such as Adweek, Icy Veins, Wowhead, GameSpot, and ScreenRant published articles highlighting the success of the campaign and its role in promoting the then-upcoming WoW expansion.

But it wasn't just the players that were delighted. Our partners over at Blizzard praised Gamebreaking's proactive problem-solving, deep technical expertise, and laser-focus on the player experience. I'll let this quote from Drew Elliott, Senior Director of Consumer Marketing at Blizzard Entertainment, serve as my closing statement:

"From the start, the Gamebreaking team jumped in head first and helped pioneer a whole new program for the Warcraft franchise to deliver a player-first experience to our community."

Lets Chat!

We hope our experience has helped you learn more about building around X (formerly Twitter). Don't hesitate to contact us to discuss developing games, consulting, or game co-development projects.