Original Post — Direct link

The card Thallid Omnivore is currently not causing you to gain the 2 life when sacrificing a saproling, instad only giving Thallid the +2/+2. I've played 2 games on the FNM historic pauper, both resulted in a loss due to the card not functioning as expected.

External link →
almost 3 years ago - /u/WotC_BenFinkel - Direct link

Thanks for the report! I see some curiosity in here about how this could have happened. The answer is implementing the Strixhaven card, [[Deadly Brew]], which reads in part: "If you sacrificed a permanent this way, you may return another permanent card from your graveyard to your hand."

The challenge this introduced is that "if you sacrificed a permanent this way" is talking about a permanent card on the battlefield, while "return another permanent card" means "other than the permanent you sacrificed while it's in the graveyard" - which means that the "sacrifice" verb is responsible for describing the sacrificed object in the graveyard. The bug was that this made the "if ... was sacrificed" code look at both the pre- and post-sacrifice objects for determining whether the condition was met, which interacts incorrectly with our token zone transfer code. The fix will be to ensure that the be-sacrificed condition code doesn't care about the object in the new zone. #wotc_staff

almost 3 years ago - /u/WotC_BenFinkel - Direct link

Thanks for the report! I see some curiosity here about how this could have happened. We discovered a bug with how [[Light Up the Stage]] works if you Escape it with [[Underworld Breach]] - the bug had been that you were allowed to play the cards you exiled to pay the Escape cost. The fix had been to separate recording the results of zone transfers for costs from other zone transfers. This made it so that when we look for a Saproling "sacrificed this way" for Thallid Omnivore, we aren't looking in the right place - we're looking for a Saproling sacrificed not to pay a cost. The fix should be pretty straightforward. #wotc_staff

[I made a mistake in the diagnosis earlier, oops!]

almost 3 years ago - /u/WotC_BenFinkel - Direct link

Originally posted by Filobel

Interesting. Thanks for giving some insight!

I don't mean to sound rude, and perhaps it's not something you're willing to answer, but don't you have some unit testing for individual cards? Obviously, it would be unrealistic to have unit tests that cover all the possible interaction of cards in the game, but I would have assumed you had some unit tests for the basic use cases of a card... like "if you sacrifice a saproling to Thallid Omnivore, the life total goes up by 2". Then your phone rings and someone goes "Ben, I don't know what you did, but the unit tests on Thallid Omnivore don't pass anymore!"

Again, there are going to be bugs when it comes to weird interactions, but it always surprises me when the "base case" of a card doesn't work properly.

We write regression tests for any new behavior that a dev implements. As Thallid Omnivore already worked perfectly when we released Dominaria, it did not receive a regression test. If we had to record regression tests for every single card behavior in the game, no matter how redundant, I'm pretty sure we wouldn't have time to implement anything! It's a tradeoff though - it means sometimes old cards get bugs on live, and that sucks. For what it's worth, any bugfixes we do also get regression tests for them. #wotc_staff

almost 3 years ago - /u/WotC_BenFinkel - Direct link

Originally posted by Filobel

Fair.

On a side note, totally hypothetical here, but imagine a card that has "splice onto sorcery" and the effect was "exile target creature". Do I understand your implementation of Light up the stage correctly that it would let you play the exiled creature if you spliced that card onto LutS, because the card was exiled by LutS not as part of paying its cost? Obviously, no point in fixing a bug that isn't even in the game yet, but I'm not sure I understand why LutS isn't just coded as "pick two cards, set them aside, you get to cast those two cards and those two cards alone". Why is it coded as "you can cast any card exiled by LutS as long as it wasn't exiled as part of its cost"?

The short answer is "because the English words drive the behavior." LUtS reads "you may play those cards." Which cards? The exiled cards. What are the exiled cards? The cards that have been exiled via Light Up the Stage.

Your hypothetical card wouldn't have an issue (well, besides the issues of friggin' implementing Splice) because at the time we create the play-permission, nothing would have been exiled by the spliced ability (as those happen after the natural abilities). So when we're creating that permission, the splice exiled cards won't be considered.