v1.4
Deck builder:
- The "Suggest Lands" / Ländervorschlagen control now works and reads as a checkbox. It is the game's
AutoLandsToggle— aCustomToggle(aCustomButton-backed on/off switch, not a UnityToggle) that, when turned on, runsBasicLandSuggester.SuggestLand()to auto-fill the deck with the right basic lands. Because the prefab is styled like a pool tile and sits next to the basic-land cards,CardDetector.IsCardmis-detected it as a card: pressing Enter opened the card-info viewer and read info blocks instead of flipping the toggle, so nothing happened to the deck.CardDetectornow bails out early when aCustomToggleis present (self or child),UIElementClassifierclassifies a bareCustomToggleas a checkbox and announces its on/off state from theValuefield, andUIActivatorclicks the toggle's backingCustomButton(which flipsValue→ the game observes the change next frame and suggests lands), announcing the resulting checked/unchecked state.
Draft (human / table draft):
- The pick timer is now communicated to blind players. In human drafts the game auto-picks for you when a per-pick countdown expires; sighted players see a shrinking timer bar and "auto-select" tags appear on the cards in the last 5 seconds, but there is no sound, so a blind player had no warning before the game chose a card for them. The mod now polls the pod's live
PickSecondsRemainingwhile a pack is shown and announces escalating warnings as the deadline approaches: a gentle, non-interrupting nudge at 30 seconds, an interrupting "10 seconds to pick" at 10 seconds, and an urgent "5 seconds, pick now or the game will choose" at 5 seconds. Each warning fires once per pick window and re-arms when the next pack arrives (detected by the timer jumping back up); warnings already passed at the start of a window — e.g. when rejoining a draft mid-pick — are suppressed. A new E key reads the remaining pick time on demand ("23 seconds to pick"), matching the duel timer key. Bot/quick drafts are untimed, so timer announcements are suppressed there and E reports "No pick timer in this draft". Read offDraftContentController.DraftPod(IDraftPod) —DraftMode,PickSecondsRemaining(live, computed from the pick deadline), andPickSecondsTotal; mirrors the data the game's ownDraftContentController.Coroutine_StartTimer/DraftTimer.UpdateTimeuse. - The table-draft "ready up" lobby (waiting for a human pod to fill) is now presented as a proper loading screen instead of a static button menu. Previously
GeneralMenuNavigatorhandled it as a flat set of buttons — no pod fill count, no timer, no state — and the Cancel→Ready swap stayed unreachable until a forced rescan.LoadingScreenNavigatornow owns it as a newTableDraftQueuemode (priority 65, preempting GeneralMenu at 15) and surfaces four navigable blocks via Arrow Up/Down: status (finding table → ready up → you are ready → starting), pod fill ("3 of 8 players in pod" plus "N ready"), a live timer (counting up while queueing, down while readying), and the current action button (Cancel → Ready). Space readies up, Backspace cancels, and change-only announcements fire as players join, the table forms, the ready count climbs, you confirm, and the draft starts. Data comes from the game's own update path, decompiled fromTableDraftQueueContentController:PodQueueNotification(NumInPod/PodCapacity) andDraftNotification(ReadyReq/ReadyUpdate/TableInfo/Close,NumReady,TimeoutSec) are captured by read-only Harmony postfixes into a newTableDraftQueueState; the timer is read live off the controller'sTextChronometer; the Ready button keys off the sameReadyReq/animator signal the game uses, so it appears without a manual rescan. All game reads are reflection in try/catch with safe fallbacks, and the priorGeneralMenuNavigatorbutton-menu handling is left intact so the screen degrades gracefully if detection ever fails. - Two human-draft detection gaps that previously required forcing a rescan (opening and closing the options menu) are now handled automatically. First, on the ready-up screen the game swaps the Cancel button for a Ready button in place without firing a panel event, so the Ready button stayed unreachable —
GeneralMenuNavigatornow polls the active button signature while only theTableDraftQueueContentControllerpanel is open and rescans on change. Second, between picks the pack empties (0 cards) until other players pass the next one, and nothing polled for it —DraftNavigatornow announces "waiting for other players" once and polls for the next pack (requiring a stable non-zero count), then force-rescans to announce the new pack automatically.
Mastery / rewards track:
- Reward tiers now read as consistent Free and Premium columns on every level (issue #104). The per-level reward array is positionally aligned — index 0 = Free, 1 = Premium, 2 = Renewal, with a
nullmeaning "empty slot" (confirmed against the game's ownRewardTrackItemView.SetRewards, which mapsrewards[i]straight onto reward-icon sloti). The mod was skippingnullentries, which collapsed the columns: on a premium-only level (no free reward) the premium reward slid into the free position and was announced as the level's reward — so a blind player without the premium pass heard a reward they couldn't claim and had no way to tell which tier it belonged to.ExtractLevelDatanow keeps every slot, labels empty ones "No reward" with their correct positional tier name, andBuildLevelDatapads every level to the same column count so the tiers line up across the whole track. Arrow Left/Right selects a column (Free / Premium / Renewal) and that column is now preserved as you arrow Up/Down between levels (newGoToLevel/ column-awareAnnounceCurrentLevel), so you can walk a single Free or Premium column top to bottom and hear "No reward" on the levels that have nothing in that slot. The column resets to Free only when entering or leaving the virtual status row. As a deliberate choice, locked-premium rewards are not flagged as "locked" — the "Premium" tier label already makes the unlock requirement clear. (The second half of the report — multi-quantity rewards like "2 packs" reading the player's level as the count — could not be reproduced; the reward count was correct in every case, including the localized names that embed their own count, so no code change was needed there.)
Duel:
- The F1 duel help menu now documents the two turn-skip shortcuts, which previously worked but were absent from the in-app help. A new entry under "General duel commands" reads "Shift plus Backspace: Pass until opponent acts, Ctrl plus Backspace: Skip turn", localized into all 12 languages. (Shift+Backspace soft-skips until the opponent acts; Ctrl+Backspace force-skips the whole turn — both already announced their on/off state when toggled.)
Verification (SHA256):
AccessibleArenaInstaller.exe:b2247e0b26748daaa8cfa0edd76116ec90d203d3031efff28cd6c5c8aec72291AccessibleArena.dll:0d689ea9d331cd1074763f9c4e2ccaeb13b5da34ae05248e7f476d702e5153a2
Verify in PowerShell with Get-FileHash <filename> -Algorithm SHA256 or in Command Prompt with certutil -hashfile <filename> SHA256.