Way of the Mind Sculptor (FRA) - #11986
Merged
Merged
Conversation
Record the counters removed to pay an ability's costs on the SpellAbility and expose them as Count$CountersRemovedToPay <CounterName>, so the card's trigger can tell whether two or more loyalty counters were paid to activate an ability. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
tool4ever
reviewed
Sep 20, 2026
tool4ever
reviewed
Sep 20, 2026
Drop the per-CounterType tally on SpellAbility and read the existing CostCountersRemoved SVar instead, as tool4ever asked. A remove-counter cost names its type, so the payment cannot mix types and the tally bought nothing. Move the two-or-more test onto the trigger's ValidSA so a failing condition keeps the trigger off the stack, rather than resolving it to no effect. CheckSVar cannot serve here: requirementsCheck runs without runParams, so a trigger-level SVar cannot reach the activated ability. A CountersRemovedToPay comparison property can, following XCost. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Contributor
Author
|
Pushed 59a8f07 for both review comments — replies are in the two threads, which are now collapsed as outdated. Short version: the engine side drops from 7 files to 1. The per-CounterType tally on |
tool4ever
approved these changes
Sep 21, 2026
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.
Adds Way of the Mind Sculptor, the last unimplemented card in the FRA
Way of the ___cycle. The ETBhalf needed nothing new — the other six cycle members already script
Empower | Type$ Jace | Num$ 5verbatim.
The second ability is the blocker:
It has to read the payment rather than the printed cost, because cost modification changes it: Carth
the Lion raises every loyalty cost by
[+1], so a printed[-2]removes one counter and must notdraw. The 21 cards with
SubCounter<X/LOYALTY>have no printed number at all.Forge already records this —
CostRemoveCounterstores the amount paid in theCostCountersRemovedSVar, which ten cards read. What was missing is a way for a trigger on another permanent to match on
it, so this adds one comparison property to
SpellAbilityProperty, followingXCostdirectly aboveit.
The card gates the trigger itself,
ValidSA$ Activated.Loyalty+CountersRemovedToPayGE2on theT:line, rather than putting a condition on the executed ability — so a failing condition keeps the
trigger off the stack instead of resolving it to nothing.
CheckSVarcan't serve here:requirementsCheckruns without runParams, so a trigger-level SVar cannot reach the activatedability, while
ValidSAis evaluated inperformTest, which can.LoyaltyPaidGateTestdrives five activations through the real activation path, asserting the loyaltyspent and whether the trigger reached the stack as well as the draw:
[-4][-1][-4][-2][-1]Reverting
SpellAbilityProperty.javaalone fails the two drawing cases.Two things worth knowing: the property reads the total counters removed rather than splitting by type,
so it relies on
Activated.Loyaltyto keep that sound; and folding the condition intoValidSAchecksit once, where a true intervening-if is also rechecked on resolution — equivalent here, since counters
already removed cannot change.
Written with Claude Code (Opus 5); I have reviewed and tested it.
🤖 Generated with Claude Code