Skip to content

v1.4.2

Choose a tag to compare

@JeanStiletto JeanStiletto released this 24 Jun 20:34
· 60 commits to main since this release

Duel:

  • New "you have priority" announcement for the moments the game otherwise only signals silently. When you gain a window to act and nothing else already told you, the mod now speaks "Du hast Priorität" / "You have priority". This targets the easy-to-miss case where the opponent casts a spell or activates an ability and you could respond with an instant, but no phase change or prompt announced it — so without a visual cue you could sit there not realizing you could act. The signal is the game's own: MTGA wraps each free-priority window in an ActionsAvailableWorkflow (it plays a "gain priority" sound and logs PriorityReceived() when that workflow applies), and that workflow is only the "respond or pass" state — forced decisions (choose targets, declare attackers/blockers, discard) are separate workflows that already carry their own prompts. The mod watches GameManager.CurrentInteraction for that workflow and announces on the rising edge. To stay helpful rather than chatty it announces only when there is something on the stack to react to — your own just-cast spell (so you can protect or chain it) or the opponent's spell/ability — read live via the existing timing-safe stack-holder count; an empty stack (after a land, at the start of your phase, or passed to you with nothing pending) stays silent. It also suppresses within ~2 s of a phase/turn change or a prompt (those already imply you can act) and debounces rapid re-fires. Fires on both your turn and the opponent's. New setting Announce priority (F2, on by default) turns it off.
  • The opponent's command zone (Shift+W) now reads the opponent's commander as a full, live card — actual cost (including commander tax) rather than just the printed cost, with the extended-info menu (I), counters (K), and attachment/target jumps (J) all working, exactly as on any other card. Partner commanders are supported: Shift+W lists both and Left/Right walks between them. The old approach read the commander identity from MatchManager.PlayerInfo.CommanderGrpIds, a private property the game removed in update 2026.60 — so since the v1.4.1 hotfix the opponent command zone announced "empty" even in Brawl. It also relied on a secondary zone-event tracker that mis-tagged opponent commanders as the player's own (their ControllerId is 0). The zone is now sourced live from the game state, mirroring Arena's own commander-examine path: GameManager.CurrentGameState.Opponent.CommanderIds gives the commander instance IDs, ViewManager.TryGetCardView resolves each to the real card view (the same DuelScene_CDC object the mod drives everywhere, so the whole card pipeline works for free), and the card database is the fallback by GrpId when no live view exists. Only commanders actually in the command zone are shown — once cast, the commander correctly drops off Shift+W and is found on the battlefield. These are central, long-lived APIs, so the feature is far less fragile to future game updates than the removed private property was.
  • Duel action prompts now carry the game's own instruction text when it adds context. When the highlighted prompt button is announced (e.g. on a ward cost, a "may" trigger, or a target step), the mod now appends the localized instruction the game itself shows — for example "Bezahle 2" / "Pay 2" for a ward cost, or "Choose a target" — so you hear not just the button label but what you're paying or doing and how much. The suffix is only added when it differs from the button text (no duplicate chatter) and is skipped during combat, where the phase is already announced and the changing attacker/blocker count button would otherwise repeat the instruction as noise. Deduplication still keys on the raw button text, so the extra context never adds repeats.
  • Emblems in the command zone are now readable as cards (untested — well-founded but not yet verified in-game). Emblems (e.g. from planeswalker ultimates, or "The Ring") live in the command zone but have no dedicated examine widget — they are ordinary card objects (MtgCardInstance with ObjectType == Emblem). They now appear in command-zone navigation alongside the commander: W picks up your emblems, Shift+W the opponent's, each as a full navigable card (rules text via the I menu, etc.). They are read live from MtgGameState.Command.VisibleCards, split by controller and resolved to their card view the same way the commander is, and deduplicated against the commander so nothing is listed twice. This reuses the (confirmed-working) commander plumbing, but the emblem path itself has not been exercised in a live game, so treat it as speculative until tested with an emblem-producing card.

Bug fixes:

  • Modal "choose one" cards now read each mode's specific rules text again, not just the card name. After game update 2026.60 a card's AbilityIds can arrive as a collection of wrapper objects/tuples (the ability id sitting on an Id / Item1 member) rather than a plain uint[]; the extraction only recognized the plain-uint shapes and dropped the wrapped one to null, so the abilities couldn't be resolved and cards like split/modal "pick one" spells read as just their name with no rules text. A new ExtractAbilityIds helper now normalizes all three shapes (uint array, IEnumerable<uint>, and the wrapped-object collection), and the modal RulesTextOverride path was likewise loosened from IList to a plain IEnumerable so a non-IList backing collection no longer silently yields empty override text. Contributed by @lilmike (PR #105).
  • Lands being played now read again. The game can fire a single ZoneTransferUXEvent directly rather than wrapped inside a ZoneTransferGroup — e.g. a land entering the battlefield — and the bare event wasn't classified, so it fell through to "ignored" and nothing was announced. The event type map now routes a lone ZoneTransferUXEvent through the same handler, which detects it has no _zoneTransfers list to unwrap and processes it directly as the individual transfer. Contributed by @lilmike (PR #105).
  • Already-used permanents no longer appear in the Tab cycle of playable/activatable things. A planeswalker that already used a loyalty ability this turn, or a creature whose only ability is a {T}: ability that is now tapped, would still be offered when tabbing — pressing Enter on it then did nothing, since the game won't accept the action. The cause was in the battlefield/hand "what can I do?" supplement, which reads MTGA's own per-card interaction list (ActionsAvailableWorkflow.GetInteractionsForId) instead of the flaky visual highlight. That list contains both available actions (_request.Actions, IsActive=true) and disqualified ones (_request.InactiveActions, IsActive=false); a disqualified free ability still carries a playable action type and CanAffordToCast=true, so the supplement — which checked only those two — surfaced it. The check now also requires GreInteraction.IsActive, matching the game's own HighlightUtil.GetHighlightForAction (which produces the visual glow) and CanClick gate exactly. This is a strict tightening of the supplement only (the visual-highlight scan is untouched, so targeting and selection highlights are unaffected): genuinely usable cards — the ones the supplement exists to recover when their glow fails to render — are always IsActive=true and still appear; only unusable entries are dropped.

Verification (SHA256):

  • AccessibleArenaInstaller.exe: a7a0227eb48f9f639b8b43a8ee1a7eb63fe08b55385a6c93c5b5e44644726ec9
  • AccessibleArena.dll: 4b7ee325d9a2a8a99f95e4de62daaeec570e710135bb8d35084e2199c43379e4

Verify in PowerShell with Get-FileHash <filename> -Algorithm SHA256 or in Command Prompt with certutil -hashfile <filename> SHA256.