Hey Infinity Warriors!
I hope everyone's been enjoying version 1.4.12 so far! We implemented a hotfix patch yesterday to address some of the more urgent issues that arose - we would really appreciate it if players could validate that they have indeed been fixed. We will continue to keep a close eye on everything, so please don't hesitate to let us know if you encounter any bugs/issues either by submitting a bug report or letting me/Crestmoor know. Thanks!
We've got a double feature lined up for this week's post - two articles (one by Crestmoor, the other by Ian) detailing two ongoing projects that we're excitedly working on! Crestmoor's article will be covering the team's latest breakthrough on understanding, identifying, and preventing endless turns. Meanwhile, Ian's article will dive into a new concept we're planning, called "Cultivated Draft".
As always, we'd love to hear what everyone's thoughts/opinions are for these two projects, so don't hesitate to let us know. Enjoy!
Putting an End to Endless Turns
Endless turns have been an issue that has plagued Infinity Wars for some time now… it’s not something that happens frequently, but most players that have encountered an endless turn at some point will find it to be a frustrating experience, especially when it occurs during a critical ranked match or Rift Run. As part of our efforts to take Infinity War to the next level, we have been dedicating a lot of time, effort and resources into root issues causing the endless turn bugs. Over the past 1-2 months, we have been tracking, analyzing and dissecting reports of endless turn occurrences in order to find some answers: What causes endless turns? How can we detect and reproduce them? How do we prevent them from happening in the future?
The good news is that this exercise has led to a significant break-through in our understanding of endless turns which we hope will lead to a dramatic reduction in the number of endless turn bugs in the game. More importantly, Ian and I have been working on a new method to trap and prevent endless turns before they occur in the game, which will allow us to identify, reproduce, and fix bugs in the game before they manifest into the endless turn situation. What causes “Endless Turns”?
In order to shed more light on what we’ve designed, it’s first important to understand what causes endless turns and why they’ve been so hard to replicate in the past. The “Endless Turns” situation that can occur in game is in itself not a single bug. Rather, it is a symptom of other bugs that can cause two players within the same match to become “desync’ed
”, meaning that one player may be experiencing a different game state than the other player on a turn by turn basis. There are various reasons that can cause desync to occur but the most prevalent cause of desyncs (and also hardest to detect) is a bugged card interaction or combo being played by one or both of the players.
To better explain this, let’s use a hypothetical example where the card “Word of Command” is bugged. Player A plays Word of Command to move one of Player B’s “Wealthy Nobles” from their support zone to their defense zone where there are 3 other 4/4 tokens in play. Let’s just imagine that this hypothetical bug with Word of Command instead resulted in Player A’s game client moving the Wealthy Noble to the front of Player B’s defense zone, while on Player B’s game client, it actually moved the Wealthy Noble to the “end” of Player B’s defense zone. Once the turn resolved, the two players would see different states on their respective game clients and at this point, the game has become “Desynced”. Depending on what other cards are in play, this can also cause the two players to view each other’s Health, Morale and order of cards in each zone to be different. If the difference is subtle, both players may actually keep playing the game and not realize that the game was already in a state of desync.
In the above scenario, the two players will continue playing out the game, but due to the desync state of the game, Player A’s game client may end up thinking that he’s won the game by reducing Player B’s health to zero, while Player B’s game client might still be showing his health being in a positive range. When this happens, Player A happily logs a win, moving on to another match while Player B’s game client gets stuck, unable to resolve the turn and thus exhibits the behavior that we call the “Endless Turn” bug. Why were endless turn bugs so difficult to fix in the past?
In most software development environments, 90% of the effort involved in fixing a bug is actually spent trying to identify, and then replicate it. Endless turn bugs have been elusive because they have been previously hard to identify and reproduce. This is because the actual “bug” can occur early in a match, but the endless turn symptom would not manifest itself until sometime much later in a match. This made it difficult for players to accurately describe what happened to cause the endless turn and made it almost impossible for developers to replicate the same behavior to recreate the endless turn scenario. What’s changed now to make us think that we can defeat endless turns?
Really, it was a fundamental change in the way we looked at tackling the problem. Once we understood that endless turns were the eventual result of a desync that happens earlier in the game, we realized that the trick was not to “trap and prevent” an endless turn, but rather we had to trap the precursor event that causes the endless turn, namely the desync event that happens way before an endless turn can manifest. This lead to us designing a piece of code that we call the “Desync Trap”
The Desync Trap is a simple device that triggers at the end of each turn of a game after all card interactions have been resolved and confirms that both players in a match are in a consistent state and in-sync at EVERY TURN
. It works by taking all the relevant information about the status of a match at a point in time including the values of each players health, morale, turn #, cards in each players command, support, defense and attack zones as well as their order, and generates a checksum using a hash algorithm. The two players game clients will then exchange and compare these checksums with one another each and every turn. If every is working as normal, the checksums will always be the same. If for whatever reason a bugged card interaction or network error occurs, the checksums exchanged will be different, at which point we can stop the match cleanly, rather than letting the match continue until it deteriorates into an endless turn. So why are some players still getting endless turns?
Well, the desync trap code hasn’t made it onto the live servers yet so that’s one reason. We’ve already got it working inside of our internal development code branches and it has helped us to flush out quite a number of desync causing card bugs that we previously did not know about and we’ve been able to fix many of these bugs as part of the 1.4.12 patch that recently went live.
We are currently continuing to enhance the desync trap to not only detect desync events and stop a desynced match, but also to then upload the turn by turn interactions of both players of the match leading up to the actual desync event and notify us that a desync has occurred. This will provide us with the ability to log, track and analyze every desync event that happens in game so we can more easily replicate and fix desync causing card interactions as and when they occur.
Over time, as more more desync events get logged and steps for reproducing these desync events are automatically logged on our server, we will be able to dramatically reduce (or eliminate) desync causing card bugs currently in the game as well as quickly catch potential new desync bugs from creeping into new updates.So what does this mean for players?
So all of the above technical jargon aside, the desync trap will have a different impact to players over the short, medium and long term.
Immediately, we have been able to flush out a number of previously unknown card bugs that were causing desyncs, some of these have already been fixed in update version 1.4.12.
In the short term future (hopefully next patch), the first iteration of the desync trap code will be implemented to the live servers. This will have the effect of stopping a game when a desync is detected so that the game should never deteriorate into an endless turn bug. It will also log the desync on our servers so that we can investigate what caused it and hopefully replicate, then fix the problem. However, it will also make desync bugs more visible initially as it flushes out more desyncs that cause a game to terminate rather than becoming an endless turn.
In the medium term as we trap more bugged interactions and fix them, both desyncs and endless turns will likely reduce dramatically in frequency, providing a much better gaming experience for all players.
In the longer term, we will also continue to enhance the functionality of the desync trap code, adding additional logging and analytics logic that will also allow us to detect patterns of desyncs from specific players or times. This will also help us to detect game anomalies caused by potential hacking/exploits so that we can more quickly react to these to preserve the game experience.
For the next patch, we'll be taking another look at which cards are being offered in draft, so that we can create a better Rift Run experience. We'll be calling this concept "Cultivated Draft
". Previously, the drafting experience was pretty straightforward: every card currently in the game could appear in draft, as long as it would make for a legal deck. For the most part, this has worked fine.
However, over time it has become apparent that there are certain problems with draft as a result of using the entire card pool of Infinity Wars. Some cards are just not ever going to be compelling choices in draft, and basically become a non-choice in draft. When a pick contains too many of these cards, there's no real choice, you just pick the only good card. When all 4 picks are on this level, it becomes a negative experience no matter what you pick, and a lot of draft comes down to simply "choosing the least bad card
". Some cards on the other hand (particularly in the command slot) are just far too good in draft, and if you get one of these you can just ride that ticket to victory (we're looking at you, Aleta).
In the new draft pool, we'll be building the pool from the ground up, actually taking the time to think about each card and whether it should show up in draft, and at which slots (command or deck). With this change in focus for draft, we can craft a much better experience for drafters. Additionally, if a card does turn out to be an issue in draft, we can easily just take it out of the pool, and rebalance draft as needed.
So what kind of changes can you expect in draft? While not a comprehensive list, here's a sample:A sample of some of the cards you won't be seeing offered as commanders:
A sample of some of the cards you won't be seeing offered for the deck:
- Aleta, Immortal Tinkerer and Aleta, Immortal Caretaker. These are both cards that have proven to be very strong in draft, allowing for powerful turn 1 plays consistently every game. Tinkerer has especially been a problem card for a while, and the community has been quite vocal in its strength in draft. Some other notable cards that won't be showing up as commanders are the Sage cycle (Daode, Yaunshi, Lingbao), Inter-dimensional Phase Bot, and Hunted Dragon.
- "Uninteresting" factionless cards, such as Bounty Hunter, Field Engineer, and Tech Knight. While factionless cards can be an interesting choice for a commander when it offers something interesting from the Command Zone, simple staple factionless cards just add up to make more non-choices.
- Overly niche cards designed for constructed, such as Enyah. Cards like this simply can't be used properly in a draft deck, and will always instead be a dead card in draft, so they won't be included.
- Previously banned cards, such as Logrithmatron. Some cards have proven themselves to be so extraordinarily strong in draft that they were previously banned despite the behind-the-scenes hackery needed to do so. These cards will continue to be banned, of course.
- The swarmer cards won't be showing up as choices. The swarmers are designed to require a great deal of other swarmers in the deck in order to work, and while the occasional player would successfully make a swarmer deck, it wasn't worth cluttering up everybody's picks with swarmers when they won't be interesting choices the majority of the time.
- Overly niche cards designed for constructed, such as Genetic Splicing. Some cards are created to enable players to try to make them work by building decks around them. Unfortunately, those cards are pretty much useless in draft, where you can't make a deck around them. Therefore, they've been removed from the pool so they stop cluttering up picks.
- Just truly awful cards like Soldier of Fortune. Nobody picks a card like Soldier of Fortune unless all the other picks are also just as awful. Instead, we want to remove picks like that from even happening in the first place.