Hearthstone has a lot going on under the hood. The cause-and-effect relationships when cards are played are relatively straightforward and easy to predict, but because of the way certain events are timed, some very surprising things can happen in rare circumstances. We want cards to work the way that you guess they might—in other words, we want the game to work intuitively.
In the upcoming patch, we’re making some changes in pursuit of that goal. We want Hearthstone to continue to be strategically deep: a game of careful choices, calculated risks, and exciting events. So we want to be extra clear that this update isn’t a change in depth; instead it’s one step in an ongoing effort improve Hearthstone’s mechanics.
Hearthstone’s core gameplay won’t change, but what will change are some rare edge-cases.
Please be aware: what follows is a detailed look at Hearthstone’s mechanics by Hearthstone Gameplay Engineer Josh Durica. If you want to delve into the nitty-gritty details regarding how this change will work, read on.
First, A Glossary
Events are interactions that occur throughout gameplay that can cause triggers to activate when they happen.
- Whenever a Card is Played
- After a Card is Played
- Deathrattle (When this minion dies)
- Whenever a Minion Takes Damage
- At the End of Your Turn
A trigger has two parts: an event (usually starts with “Whenever”, “After”, or “At”), and an effect. Sometimes triggers can also have a condition (usually noted with “if” or “while”, but sometimes noted by qualifiers like “your”).
- Whenever you cast a spell, gain +1 Attack.
- After you cast a spell, deal 1 damage to ALL minions.
- At the end of your turn, give another random friendly minion +1 Health.
- If you control a Secret at the end of your turn, gain +2/+2.
In Hearthstone, there are three zones where triggers can happen, and they happen in order: First, any triggers in the Battlefield, then those that occur in a player’s Hand, and finally those that belong to cards in a player’s Deck.
Whenever an action is taken, Hearthstone executes a sequence of steps to resolve what happens.
Here’s a simplified example sequence:
- Card ability activates
- EVENT: After a Card is Played event occurs
o After a Card is Played
Here’s what that sequence would look like using actual cards, if you had a Questing Adventurer and a Flamewaker on the board, and then played Frostbolt:
- Frostbolt’s text resolves: Deal 3 damage and freeze
- EVENT: After a Card is Played triggers resolve
o Flamewaker shoots two missiles
This is a simple example, but a sequence can incorporate many events and triggers.
Keep in mind that dealing damage, destroying a minion, and other things can interrupt sequences with new sequences, like in this more detailed example:
Whenever a Minion Takes Damage triggers
- NEW SEQUENCE: Damage dealt
- EVENT: Whenever a Card Takes Damage triggers resolve
In Pursuit of the Goal
If you watched the video in our recent blog post, then you saw two different examples of cards triggering in counter-intuitive ways because they weren’t present when the sequence that activated them took place. That sets the stage for the primary goal we wanted to accomplish with these changes:
If you want to trigger off something, you need to be present and valid when that something first happens.
A more technical way to say this is: In order for a trigger to activate from a sequence, it needs to be present and valid at the time the sequence began.
This means any card featuring a trigger that appears in the middle of a sequence can’t activate during that sequence. So, when you play a card (or when a card is destroyed, or an attack occurs, etc.) you only need to consider what is currently on the board instead of guessing what the board state might be in the middle of the sequence. The Mindgames + Wild Pyromancer interaction showcased in the video is an example of an interaction improved by this change.
The valid qualifier is more subtle, but equally important. Before any trigger can activate, it needs to be validated. Each trigger has its own specific validation step, which allows the trigger to filter when it should and shouldn’t activate. For example, the Whenever a Card is Played event occurs when any card of any type (Minion, Spell, Weapon, etc.) is played. However, we want a card like Flamewaker to only trigger when a friendly spell is cast, so the Flamewaker’s validation step checks the card type and controller of the card played. In other words, Flamewaker’s trigger is only valid if the card played was a spell cast by Flamewaker’s controller.
Before our changes, we would validate triggers whenever their related event occurred, even if that was in the middle of the sequence. After the mechanics update, all triggers are validated when the sequence begins, and then they are only allowed to activate if they were valid from the start.
For further insight, let’s look at a bug that will be addressed by the update:
Currently, if you have a Djinni of Zephyrs on the board and cast Entomb on an enemy minion, your Djinni of Zephyrs will trigger, sending itself back to your deck. Not great for you or the Djinni! Djinni of Zephyrs triggers off the After a Card is Played event, and his validation step should only pass if the card played was a spell cast on a different friendly minion. Entomb is a spell, but it was cast on an enemy minion, so why does Djinni trigger?
Remember: the After a Card is Played event occurs after the ability on the played card resolves. In this case, that card is Entomb, and its ability moves the enemy minion into your deck. When the enemy minion enters your deck, it becomes a friendly minion. So, by the time the After a Card is Played event occurs, Djinni’s trigger is valid, because the minion is now friendly.
After the mechanics update, Djinni’s trigger is validated at the beginning of the sequence when the enemy minion is still on the battlefield, and because the trigger isn’t valid at that point (since Entomb counts as being cast on an enemy minion), it’s prevented from triggering when the After a Card is Played event occurs.
There is one final change we should mention, which is a tweak to when we validate triggers across different zones. Currently, the order in which triggers are validated and activated looks like this:
1) Validate Player 1 Battlefield triggers and then activate those that are valid.
2) Validate Player 1 Hand triggers and then activate those that are valid.
3) Validate Player 1 Deck triggers and then activate those that are valid.
4) Validate Player 2 Battlefield triggers and then activate those that are valid.
5) Validate Player 2 Hand triggers and then activate those that are valid.
6) Validate Player 2 Deck triggers and then activate those that are valid.
That approach meant new triggers could appear in the middle of a sequence and still be activated, and a trigger’s validation could even be affected by previous triggers’activations. The Bolvar Fordragon/Spirit Echo interaction detailed in the video was an example of a weird interaction caused by this.
After the update, the order now looks like this:
1) Validate all Battlefield triggers
2) Validate all Hand triggers
3) Validate all Deck triggers
4) Activate Player 1 valid Battlefield triggers
5) Activate Player 1 valid Hand triggers
6) Activate Player 1 valid Deck triggers
7) Activate Player 2 valid Battlefield triggers
8) Activate Player 2 valid Hand triggers
9) Activate Player 2 valid Deck triggers
This means all triggers are validated before any trigger is allowed to activate. Since all triggers are validated using the same game state, then triggers that appear in the middle aren’t allowed to fire. It’s important to note that the order in which triggers are activated is unchanged.
Here are some more examples of sequences and their results before and after the mechanics update:
Player 1 has a Mad Scientist on the board, and a Mirror Entity in their deck.
Player 2 plays Stampeding Kodo.
1) Stampeding Kodo kills Mad Scientist.
2) Mad Scientist pulls Mirror Entity into play.
3) Mirror Entity triggers, copying Stampeding Kodo.
1) Stampeding Kodo kills Mad Scientist.
2) Mad Scientist pulls Mirror Entity into play.
3) Mirror Entity does NOT trigger, because it did not exist when Stampeding Kodo was played.
Player 1 has a Piloted Sky Golem and a Wisp on the board (played in that order).
Player 1 plays Deathwing.
The Piloted Sky Golem spawn a Cult Master from its Deathrattle.
The Cult Master’s power triggers off of the Wisp’s death, and Player 1 draws a card.
The Cult Master does not trigger off the Wisp’s death, because it wasn’t present to see the Wisp destroyed.
Player 1 has Starving Buzzard and Rotface on the board.
Player 1 also has a Flame Leviathan on top of their deck.
Player 1 plays Savannah Highmane.
Starving Buzzard triggers off of Savannah Highmane, causing Player 1 to draw Flame Leviathan.
Flame Leviathan triggers, dealing 2 damage to all characters.
Rotface triggers off the damage and summons Spiritsinger Umbra.
Spirit Singer Umbra triggers off the Savannah Highmane and summons two hyenas.
Spiritsinger Umbra does not trigger off the Savannah Highmane, because she was not present when Savannah Highmane was played.
Thanks for Reading!
Of course, our work to make Hearthstone better won’t stop here!
Like the majority of odd interactions, each of these situations represents an edge case. While this update will address every situation we illustrated (among many others), there are still bound to be more. Keep in mind these are substantial changes to the core systems that underlie Hearthstone! We need to make them incrementally, and with the utmost care, but you can rest assured that we’ll continue to make improvements over time.。