AI: don't let a RemoveCounterAll sub-ability veto its own parent - #11491
Open
liamiak wants to merge 3 commits into
Open
AI: don't let a RemoveCounterAll sub-ability veto its own parent#11491liamiak wants to merge 3 commits into
liamiak wants to merge 3 commits into
Conversation
RemoveCounterAll maps to CannotPlayAi, which refuses in chkDrawback too. As a sub-ability that takes the parent down with it: Oblivion Stone's wipe ends by clearing the fate counters it just checked, so DestroyAllAi said play it and the bookkeeping step said no. Alaundo the Seer's tap ability is dead the same way, and it is unflagged. 17 of the 19 cards reaching this API use it as a sub-ability, and each is a consequence of its parent rather than a decision. canPlay still refuses, so nothing gains a new main ability. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Both abilities cost {T}, so seeding on the AI's own turn costs it the wipe. At
the opponent's end step the tap is free - the AI untaps first - and the mana is
spare by then.
AITgts keeps it off the Stone itself, which is sacrificed as a cost and gone
before the wipe checks fate counters, and off lands, which the wipe does not
destroy. Without it the AI protected the Stone 6/6.
Unflags Oblivion Stone.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
ApiType.RemoveCounterAllmaps toCannotPlayAi, which refuses inchkDrawbackas well ascanPlay.chkDrawbackWithSubsbails on any unwilling sub-ability, so aRemoveCounterAllsubtakes its parent down with it.
Oblivion Stone's wipe ends by clearing the fate counters it just checked.
DestroyAllAicorrectlysaid play it; the bookkeeping step said no, and the ability was unreachable. Alaundo the Seer's
{T}is dead the same way — it ends by ticking time counters on suspended cards — and it isunflagged.
17 of the 19 cards reaching this API use it as a sub-ability, and all sixteen distinct ones are a
consequence of their parent rather than a decision: clear the FATE counters just checked, reset your
own +1/+1s, tick TIME counters on suspended cards, remove a -1/-1 from your own creature. Only
Aether Snap and Thief of Blood use it as a main ability, where refusing is coherent —
canPlaystill refuses, so nothing gains a new main ability.
Most of the other 15 are triggers, so for those this rests on reading the scripts rather than on
measurement.
Fate counters
Both abilities cost
{T}, so seeding on the AI's own turn costs it the wipe.AILogic$ AtOppEOTmoves it to the opponent's end step, where the tap is free and the mana is spare.
AITgtskeeps itoff the Stone itself — sacrificed as a cost, so gone before the wipe checks fate counters — and off
lands, which the wipe does not destroy. Without that filter the AI protected the Stone 6/6; with it,
its Colossal Dreadmaw 6/6.
Unflags Oblivion Stone.
Not addressed: the wipe is instant speed but probes
WillPlayat every phase of both turns, soit fires at the first opportunity rather than the last responsible moment. That is shared
DestroyAllAitiming affecting every instant-speed mass removal, so it wants its own change.Test fails without the change — the AI never activates the wipe. 337 tests, 0 failures.
🤖 Implemented with the assistance of Claude Code (Opus 5).