Let the AI use Venser, the Sojourner (and two other mass-unblockable cards) - #11396
Open
liamiak wants to merge 2 commits into
Open
Let the AI use Venser, the Sojourner (and two other mass-unblockable cards)#11396liamiak wants to merge 2 commits into
liamiak wants to merge 2 commits into
Conversation
Making everything unblockable is worth nothing unless the attack it enables wins the game, and EffectAi had no way to ask that, so every card with the effect declined on every board - including boards where it was lethal. Add an UnblockableForLethal logic that holds the ability until attacking with everything that can attack would take an opponent to zero with nothing able to block, which is precisely the state the ability creates. Blockers are therefore not counted. Applied to the three cards where using it is an optional choice - Venser, the Sojourner's -1, Jace, Arcane Strategist's -7 and Tezzeret's Gatebreaker. All three went from declining on every board to firing only on lethal ones. The others with the same effect are not decisions: Keeper of Keys and Veiling Oddity are mandatory triggers, Bedlam, Tazeem and Tanglewalker are static. Glaring Spotlight grants hexproof alongside it, so it is also a protection card and a lethal-only gate would be wrong for it. Reverse the Polarity offers it as a Charm mode, which CharmAi picks through a different path and would need its own verification. Venser also loses AI:RemoveDeck:All. His other two abilities already work - ChangeZoneAi's blink logic handles the +2 (skips tokens, prefers ETB triggers, waits for post-combat, and takes back anything an opponent has gained control of), and the -8 is already AILogic$ Always. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Both directions on Venser's -1: fires at exactly lethal, holds one damage short. Calls the AI directly rather than playing a game out, so it does not depend on MyRandom. Drop this commit if you would rather not carry the test. 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.
28 added lines outside the test, which is a droppable second commit.
Venser, the Sojourner is
AI:RemoveDeck:All. Two of his three abilities turn out to work already —the flag was covering for one dead one, and that one turned out not to be his alone.
What was dead
The -1 never fired on any board, including one where it wins on the spot:
CantPlayAiCantPlayAiCantPlayAiCantPlayAiCantPlayAiCantPlayAiWhile there are corner cases there unblockability without being able to swing for the win is worth it, those are relatively rare and not implemented. However, the case of "can I make everything unblockable and swing for the win" is key, and now implemented.
UnblockableForLethalholds the ability until attacking with everything that can attack would takean opponent to zero with nothing able to block — the state the ability itself creates, so blockers
are not counted.
The same gap on two other cards
Every card where granting mass unblockability is an optional choice had the identical problem —
CantPlayAion every board, lethal ones included — and all three now fire only on lethal:-1AI:RemoveDeck:All, removed here-7ultimateAI:RemoveDeck:Random, left alone — that is a deck-building signal, not a playability one{5}{U}, {T}, SacrificeThose two argue for the gate harder than Venser does: Jace spends seven loyalty and Gatebreaker
sacrifices itself, so firing either off-lethal is a real loss rather than a wasted tick.
The rest of the cards with the same effect are deliberately untouched, because using it is not a
choice they make: Keeper of Keys and Veiling Oddity are mandatory triggers, and Bedlam, Tazeem and
Tanglewalker are static. Glaring Spotlight grants hexproof alongside it, so it is also a protection
card and a lethal-only gate would be wrong for it. Reverse the Polarity offers it as a Charm mode,
which CharmAi picks through a different path and would want its own verification.
No priority plumbing was needed —
ComputerUtilAbilityalready sorts planeswalker abilitiesmost-costly-first, so the -1 outranks the +2 by itself once it starts saying yes.
What already works
The +2 (exile a permanent you own, return it at end of turn) lands in
ChangeZoneAi's existingblink logic, because the ability has
Destination$ Exilewith aDB$ DelayedTriggersub. That logicis good: it skips tokens, prefers permanents with ETB triggers, holds until post-combat, and takes
anything the AI owns but an opponent controls immediately rather than waiting. Measured:
The -8 is already
AILogic$ Always, and the emblem it makes behaves: whenever the AI ultimates,the emblem exiles Ancient Brontodon and then Grizzly Bears — the opponent's board, biggest first —
leaving its own Colossal Dreadmaw alone.
Testing
mvn -pl forge-gui-desktop -am test: 287 tests, 0 failures.MyRandom.The flag comes off on the back of that.
🤖 Implemented with the assistance of Claude Code (Opus 5).