Skip to content

v1.4

Choose a tag to compare

@JeanStiletto JeanStiletto released this 16 Jun 08:39
· 66 commits to main since this release

Deck builder:

  • The "Suggest Lands" / Ländervorschlagen control now works and reads as a checkbox. It is the game's AutoLandsToggle — a CustomToggle (a CustomButton-backed on/off switch, not a Unity Toggle) that, when turned on, runs BasicLandSuggester.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.IsCard mis-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. CardDetector now bails out early when a CustomToggle is present (self or child), UIElementClassifier classifies a bare CustomToggle as a checkbox and announces its on/off state from the Value field, and UIActivator clicks the toggle's backing CustomButton (which flips Value → 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 PickSecondsRemaining while 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 off DraftContentController.DraftPod (IDraftPod) — DraftMode, PickSecondsRemaining (live, computed from the pick deadline), and PickSecondsTotal; mirrors the data the game's own DraftContentController.Coroutine_StartTimer / DraftTimer.UpdateTime use.
  • 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 GeneralMenuNavigator handled 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. LoadingScreenNavigator now owns it as a new TableDraftQueue mode (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 from TableDraftQueueContentController: PodQueueNotification (NumInPod/PodCapacity) and DraftNotification (ReadyReq/ReadyUpdate/TableInfo/Close, NumReady, TimeoutSec) are captured by read-only Harmony postfixes into a new TableDraftQueueState; the timer is read live off the controller's TextChronometer; the Ready button keys off the same ReadyReq/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 prior GeneralMenuNavigator button-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 — GeneralMenuNavigator now polls the active button signature while only the TableDraftQueueContentController panel 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 — DraftNavigator now 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 null meaning "empty slot" (confirmed against the game's own RewardTrackItemView.SetRewards, which maps rewards[i] straight onto reward-icon slot i). The mod was skipping null entries, 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. ExtractLevelData now keeps every slot, labels empty ones "No reward" with their correct positional tier name, and BuildLevelData pads 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 (new GoToLevel / column-aware AnnounceCurrentLevel), 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: b2247e0b26748daaa8cfa0edd76116ec90d203d3031efff28cd6c5c8aec72291
  • AccessibleArena.dll: 0d689ea9d331cd1074763f9c4e2ccaeb13b5da34ae05248e7f476d702e5153a2

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