Releases: zersiax/DuelLinksAccess
Release list
v1.4.2 - Dark Magical Circle, effect picker, mission & menu accessibility
Changes since v1.4.1
In-duel
- Dark Magical Circle: the reveal step — choose a card to add to your hand, then place the rest back in any order — is now accessible. Pick a card with Enter, continue with Space.
- Multi-effect cards: the "choose which effect to activate" picker is now announced and navigable (Up/Down to move between effects, Enter to confirm).
- Pendulum Summon from a set Pendulum Scale now dispatches correctly.
Menus
- Missions (World tab): each mission now reads its objective and progress — e.g. "GX: Summon Warrior-Type monsters 3 time(s), (0/3)" — instead of only the world or character name.
- Login bonus screen: reward cells read the reward they grant instead of a bare "Today".
- Mission and reward lists: duplicate rows are no longer announced, and each "Info" button now names the mission it belongs to (", more info"). Long lists also populate faster.
Install
Extract the archive into your Yu-Gi-Oh! DUEL LINKS folder so the Mods folder merges with the game's, and the loose Tolk.dll and nvdaControllerClient64.dll sit next to the game executable. Requires MelonLoader. Tolk.dll and nvdaControllerClient64.dll are LGPL and user-replaceable; their license texts are included.
Verification
- Automated: portable test suite passes (137/137); clean Release build (0 warnings, 0 errors).
- Runtime: developed and diagnosed against live in-game logs (Duel Links v10.10.0). The Dark Magical Circle reveal flow was confirmed from in-game logs; the remaining changes are pending broader in-game confirmation.
Integrity
DuelLinksAccess-v1.4.2.zipSHA-256:1F1B4300E484D7E95554E615708D82D2E9B4090A1B3AB17CA66200BCEC8D64CF- The archive contains
SHA256SUMS.txtandBUILD-INFO.txt(build provenance and per-file hashes). The build is byte-reproducible from this commit.
v1.4.1 - Shop tutorial fix
Point release on top of v1.4.0. Fixes the shop pack lineup being unreachable during the tutorial. If you're on v1.4.0, just replace the DLL (or extract this over it).
Fixed
- Shop pack lineup is now accessible. The shop's pack list (
ShopLineup) loads its packs asynchronously, so the scan on entry caught only the "Back" button — and the tutorial arrow then wrongly told you to press Escape to go back, steering you off the shop. Now the lineup keeps rescanning until the packs populate (announcing them once they do), and when a tutorial arrow's target isn't scanned yet it points you to F11 instead of telling you to leave the screen. This unblocks the "buy a pack from the Main Box" tutorial step. - Added always-on shop-lineup, rescan, and arrow-guidance logging to diagnose any remaining shop navigation issues from a plain log.
Everything else is unchanged from v1.4.0.
Install
Same as v1.4.0 — Tolk and the NVDA controller client are bundled, so speech works on a clean install.
- Install MelonLoader 0.7.3+ for
dlpc.exe(Duel Links on Steam) and launch the game once so MelonLoader generates its assemblies, then close it. - Extract the archive into your Duel Links install folder:
Mods\DuelLinksAccess.dlllands inMods\, andTolk.dll+nvdaControllerClient64.dllland in the game root besidedlpc.exe. Replaces any earlier DLL. - Start NVDA, then start Duel Links. You should hear "Duel Links Access loaded. F1 for help."
Upgrading from v1.4.0: replacing Mods\DuelLinksAccess.dll is enough; the Tolk files are unchanged. Press F1 in game for the controls. If your screen reader isn't NVDA, swap nvdaControllerClient64.dll for the controller client matching your reader (the others ship in the Tolk archive linked in THIRD_PARTY_NOTICES.md).
Verification
DuelLinksAccess-v1.4.1.zipSHA-256:64c1e767900d230508d2f9f4f6400114c3e18b689d3792d38ba17385fb4ec282Mods/DuelLinksAccess.dllSHA-256:08195113d44190680b28f85cbe174cebf4038a73bd27d0afd91d9f2b0ff31533Tolk.dllSHA-256:e09c215ac957b7693d6a57508a4bd5a701f12df6e846674774c87d672f04fff4(unchanged from v1.4.0)nvdaControllerClient64.dllSHA-256:41c1f5df5997e798fcfbf7c8f2589de811e768b069a60710600cf57cb23a0b09(unchanged from v1.4.0)
SHA256SUMS.txt inside the archive lists the hash of every bundled file, and BUILD-INFO.txt records the exact commit and Tolk archive provenance.
v1.4.0 - Deck accessories, PvP fixes, duel timer, keyboard surrender
First public release since v1.2.0. Deck accessories, a large batch of PvP duel fixes, an audible duel clock, keyboard surrender, richer Home and deck-editor labelling, plus a public-readiness pass that adds a portable test suite, CI, and a reproducible release process.
Tested against Duel Links 10.10.0 with MelonLoader 0.7.3 and NVDA.
New
- Deck accessories (card sleeve / game mat / ace card). Press A in the deck editor to open the accessories hub, browse sleeves and mats with names, and change them. The change-scope confirmation (this deck / all decks for the character / world / everything) and the save flow are fully labelled.
- Keyboard surrender. Ctrl+Q during a duel opens the game's own "give up?" confirmation, which the dialog reader announces — the visual surrender button was previously unreachable for screen-reader users.
- Audible duel clock (PvP / Ranked). Announces 60 / 30 / 10 seconds remaining while your clock is draining, and — crucially — speaks the inactivity warning that the game only ever showed on screen before auto-forfeiting an idle player. Press Space while that warning is up to answer "still here."
- Fast-forward duel animations. Space during summon / effect / battle playback taps the screen the way sighted players do to skip through it. The PvP turn clock keeps draining during animations, so this matters for keeping time.
- Automatic draw phase. Draws now happen on their own; press Space during the Draw Phase to retry if a draw is delayed.
- Deck-slot character ownership. Deck slots belong to a character in Duel Links, and building a deck in another character's slot makes the game offer to switch characters on save. The deck-select list now reads a header per character and prefixes each slot with its owner, blank slots included, and the deck editor announces whose deck you're editing on entry — so decks aren't unknowingly built under the wrong character.
- Home event objects are named. The event billboards on the world map now read as "Ranked Duels", "Bingo event", "Character Deck Duel", "Scramble event", and so on, resolved from their assets, instead of a generic "Event object".
- View-only card-list prompts. Effects that show you cards without a selection (e.g. Dark Magical Circle's "look at the top 3 cards") are now browsable and confirmable instead of dead-ending.
Fixes
- PvP graveyard now reads every card. In server-run duels the graveyard rendered as a single pile and read as the top card followed by empty slots; it now reads all of its contents.
- Face-down monsters offer Flip Summon. Pressing Enter on your own set monster in PvP opened a bogus direct attack instead of the Flip Summon action. Fixed — set monsters now open their real action menu.
- Scenario / cutscene dialogue speaks once. Unlock scenes and pre-duel banter no longer repeat lines; each line reads once as "Speaker. Line".
- Post-merge duel regressions: empty extra deck count, doubled draw animation, mislabelled Home billboards, and LP announcements being cut off by NPC speech.
- Opponent extra-deck identities stay hidden (privacy gate on face-down / unowned cards).
- Card-detail screens are classified before other screens, so they read correctly.
- Deck filters and zone counts are honoured, structure-deck shop category is exposed, and actions are enabled for extra-monster-zone monsters you own.
- Consecutive same-player turns are announced, duel-log browse position is preserved, and numpad Enter works across handlers.
- Disabled dialog and ticket-exchange buttons no longer fire silently, and unsafe Card Trader exchanges are aborted before they drift.
- Late-loading screens recover instead of staying silent.
Internal / release readiness
- Portable test suite (134 tests) and a GitHub Actions CI workflow.
- Reproducible, hash-manifested release packaging and honest contributor / building / releasing docs.
- Security hardening: removed the mutating debug hotkeys and the inert settings menu.
- Policy-class refactors and removal of dead code (access-state manager, unused config), pinned line endings.
Known issues (non-blocking)
- Card Trader trade execution can drift for middle-of-list items; the confirmation dialog always opens so you can read it and back out. Items at the end of the list are stable.
- Some structure decks opened before they're built still read as "0 in main deck" (editor opens in a MODE not yet handled).
- A few multi-effect spell selectors (e.g. Dragon's Gunfire) aren't detected yet and need a mouse click.
Install
Tolk and the NVDA controller client are bundled in this archive, so speech works on a clean install — no separate download needed.
- Install MelonLoader 0.7.3+ for
dlpc.exe(Duel Links on Steam) and launch the game once so MelonLoader generates its assemblies, then close it. - Extract the archive into your Duel Links install folder:
Mods\DuelLinksAccess.dlllands inMods\, andTolk.dll+nvdaControllerClient64.dllland in the game root besidedlpc.exe. Replaces any earlier DLL. - Start NVDA, then start Duel Links. You should hear "Duel Links Access loaded. F1 for help."
If your screen reader isn't NVDA, swap nvdaControllerClient64.dll for the controller client matching your reader (the others ship in the Tolk archive linked in THIRD_PARTY_NOTICES.md). Tolk and the NVDA client are LGPL; their license texts are included in the archive. Press F1 in game for the current controls.
Verification
DuelLinksAccess-v1.4.0.zipSHA-256:9a2b7d19164005f0438396c1abaa9b744d176ae92107b45e933e1e62ac603dfcMods/DuelLinksAccess.dllSHA-256:7c52d97ad584f58322f941695107e52c0fe47500c8e347074c6d6cff499f40c1Tolk.dllSHA-256:e09c215ac957b7693d6a57508a4bd5a701f12df6e846674774c87d672f04fff4(x64, from the Tolk archive76879fe7…)nvdaControllerClient64.dllSHA-256:41c1f5df5997e798fcfbf7c8f2589de811e768b069a60710600cf57cb23a0b09
SHA256SUMS.txt inside the archive lists the hash of every bundled file, and BUILD-INFO.txt records the exact commit, game version, and Tolk archive provenance.
v1.2.0 - Home/Duel World, PvP duel support, Card Trader, Card Catalog
Minor release. New curated Home / Duel World screen, PvP / Ranked duel support, Card Trader conversion catalog, and assorted duel fixes.
New
-
Curated Home / Duel World screen. The world map no longer pours forty-plus raw UI items at you. A new handler maintains an explicit list of named destinations — area selector, map NPCs filtered to the area you're in (Billboards, Gate, Shop, School, Duel Center), footer destinations (Gate, Colosseum, Shop, Labo), header buttons (Events with badge count, Gifts, Info, Player Info, Options, Neuron Code), character/deck buttons, missions (with the live stage label like "Stage 7"), shortcuts, menu/settings, duel-world series switcher, and quick-duel shortcuts. Up/Down navigate, Left/Right cycle areas (or characters on the character panel), Enter activates, G announces gem + crystal balance. B toggles to "browse all" mode if a button isn't in the curated list — hands the screen back to the generic scanner so nothing is unreachable. Suspends automatically when a tutorial arrow is on screen so the orphan-arrow handler can take over.
-
PvP / Ranked duel support. The previous duel code talked directly to the engine; in PvP the engine is a renderer — server runs the duel logic and most
DLL_Duel*queries return 0 / empty / wrong. A newDuelStateadapter reads from the visual layer (cardRoots, HandCardManager) plus event-tracked counters, working identically in single-player and PvP. Specific fixes:- Seat detection.
DLL_DuelGetMyPlayerNumalways returned 0 in PvP; now resolves to the actual server seat via the local viewer's hand anchor. - Hand / field card reads route through the visual layer when the engine is hollow.
- Phase advancement (P key) now sends the request to the server unconditionally instead of relying on a local-only button click that PvP ignored.
- Extra deck card identification in PvP. The engine only renders the top card; all the others read as "Empty" or "Unknown" via every obvious lookup path. The mod now reads from
EngineInitializer.deck{seat}(the registered-deck cache populated at duel start, including skill-registered cards mid-duel). Opponent's array is server-withheld — privacy is enforced engine-side. - Hand play and field actions in PvP read the live
CardCommandpopup since the engine's command mask is 0 in PvP. Attack short-circuit whenDLL_DuelGetAttackTargetMaskreports legal targets. - Direct-attack / EMZ slot count fixes. Both used hollow APIs that always returned 0 in PvP, causing misannouncements ("direct attack" when opp had monsters; "0 cards" in EMZ during a fusion summon). Both now route through the visual layer.
- Phase change announcements are now driven by the event payload instead of polling the hollow current-phase API, with 300 ms debounce to collapse the rapid Draw → Standby → Main burst at turn start into one announcement.
- Seat detection.
-
Extra Deck SummonSp + EMZ navigation. Fusion / Synchro / Xyz / Link summoning now works in both single-player and PvP. Tapping a card in the extra deck dispatches
SummonSpdirectly (the popup never opens for extra deck, same family as TurnAtk / TurnDef / Reverse). Material selection goes through the existing EmotionalList handler. The Extra Monster Zone is now a navigable grid row between your monsters and your opponent's — reachable via Up arrow from your monster row, or Alpha-4 / Alpha-5 hotkeys. Per-slot ownership resolved at lookup; opponent-owned EMZ Synchro / Xyz / Fusion / Link monsters can now be attacked from your main row. -
Card Catalog (conversion catalog). New handler for the conversion screen opened from the Card Trader when you have eligible cards. Left/Right browse, V for description, B for batch conversion, Enter to confirm an individual conversion once the gold button activates.
-
Card Trader screen (Patreon track, included in this release). Type-aware item naming (Card / ChangeCard / Item / BoxChip / Skill / SkillTicket / Pack / RespectOrb / Rare-Super-Ultra rarity lists / Chroniclizer / Process / ChangeSkill / SoldOut), markup stripping for both Unity rich text and game
[Dragon/Fusion/Effect]tags, affordability check ("can trade" / "cannot trade"), verbose cost breakdown showing what you have versus need, gold balance with G, batch catalog with B, two-press confirmation flow with drift warning if the in-game scroll-snap moved the selection during your press. Trade execution is reliable for items at the end of the list and degraded for middle-of-list items due to the scroll-snap drift — confirmation dialog always opens so you can read it and back out if it switched on you.
Fixes
- Turn-1 first-player phase lockup. First press of P from Main Phase 1 of turn 1 sometimes did nothing because the engine reported the Battle Phase as legal but the server refused it. Retry escalation: if a previous P-press asked Battle from the same phase and ten seconds elapsed without progress, the next press goes straight to End Phase. Normal turns advance on the first press as before.
- EmotionalList tribute material no longer misidentified as "Pierce!" or other unrelated cards.
DLL_DuelGetCardIDByUniqueID2(mixedId)returns a real cardId for any low integer (it indexes into a deck table), somixedId = 7resolved to whichever cardId happened to live at slot 7 of the deck. Replaced with a CardRoot walk that prefersroot.cardIdand only falls back to the cardModel for face-down rendering, mirroring the privacy-gated MakeSnapshot path. Also tightened the direct-cardDbId fallback from> 0to>= 1000. - Sequential XYZ material pickers no longer drop the second prompt. The
_emoListHandledflag could trap the second picker because the first one'sgoActive=falsereset transition was never observed before the next prompt opened. Now time-based: the flag clears after a brief grace period post-confirm. - "Your move" no longer fires mid-summon between material picks. When the engine fires
WaitInput(Selection)while you're picking the second XYZ material, the suppression now checksworker.curInputTypeand lets the next EmotionalList prompt win the announcement. - MakeSnapshot privacy gate. The cardPlane / cardModel fallback for face-down rendering now requires the card to be face-up or owned by you. Prevents leaking opponent face-down card identities if the visual layer ever happens to know them (tutorial / AI duels where the engine has full visibility).
- Fusion-summoned monsters in stack zones / EMZ are no longer missed by field reads. The CardRoot's
locator.indexfor fusion-summoned monsters carries non-zero overlay-material bookkeeping; the strictindex == slotmatch was missing them. Non-stack field zones now fall through to a position-only walk if the strict match misses.
Misc
- Deck editor verbose card reading hotkey changed from C to V to match the in-duel
Vhotkey. The verbose re-read no longer prepends "X of Y" — you've already navigated to the card, so the position prefix is redundant. - DialogHandler no longer fires
onClick.Invokeon disabled buttons (e.g. the NEXT button on a screen with unconfigured settings) — the prior behavior bypassed the game's intentional interactivity gate.
Known issues (non-blocking)
- Card Trader trade execution drifts for middle-of-list items (last items in the list are stable). The confirmation dialog opens so you can read and back out.
- Opening certain decks (Structure Decks before they're built) still reads as "0 in main deck" because the editor opens in a non-default MODE not yet handled.
- Multi-effect spell-card selectors that fire
RunDialog (55) p1=6 p2=259 p3=0and leaveworker2d.curInputType=Null(e.g. Dragon's Gunfire) are not yet detected — user has to mouse-click.
Install
- Install MelonLoader v0.7.3 Open-Beta against
dlpc.exe(Yu-Gi-Oh! Duel Links on Steam). Launch once so MelonLoader generates its assemblies, then close it. - Extract the zip directly into your Duel Links install folder.
DuelLinksAccess.dlllands inMods\,Tolk.dllandnvdaControllerClient64.dllland in the game root next todlpc.exe. Replaces any earlier DLL if present. - Launch. You should hear "Duel Links Access loaded. F1 for help."
If your screen reader is something other than NVDA, swap nvdaControllerClient64.dll for the controller client matching your reader.
See README.md (bundled in the zip) for the full key bindings and the Home / Duel World screen guide.
v1.1.5 - Tutorial arrow announcement fixes
Hotfix release. Fixes tutorial arrow announcement problems introduced during the GX series-unlock flow.
Fixes
-
Tutorial arrow announcement no longer fires before the home-screen speech finishes. When a UISelectablePointer arrow (e.g. the Stage/Series button tutorial) appeared while the home screen was still scanning, the old sbhIdle gate fired a generic announcement immediately — cutting it off half a second later with "Home screen". UISelectablePointer arrows now always use the delayed (1.5 s) path so the home-screen scan settles first.
-
Announcement now says the button's live name, not its static container label. After selecting a series (e.g. GX), the Stage button's live label updates to "MAX". The old code read from the parent ipclick GO (
SeriesButton) which always returned the static text "ステージ". NowScreenButtonHandler.GetLabelForDescendantfinds the actual navigable child item (SeriesLogo) already in the SBH list and returns its current label, so you hear "Tutorial: navigate to MAX and press Enter" instead of "ステージ". -
You are told to press Escape when the tutorial target is on a different screen. After a series change the game lands on the character-select sub-screen (Home VC), not the main Single screen where the Stage button lives. SBH is active but has no item matching the arrow's target, so the mod now announces "Tutorial: press Escape to go back, then navigate to X" instead of silently pointing at an unreachable button.
-
Double "Dialog" announcement on TutorialArrowPart suppressed. Previously both
GameStateTrackerandDialogHandlerannounced "Dialog" when a TutorialArrowPart overlay appeared — the user heard it twice. Both paths now suppress the announcement for that overlay; the real content underneath announces itself. -
TutorialArrowPart overlays above real dialogs are now dismissed automatically. DialogHandler detects when the dialog manager has a real VC beneath the arrow overlay and calls
OnPointerClickto clear it, making the underlying dialog immediately accessible. -
Double-announcement on Enter key press eliminated.
ScreenButtonHandler.ActivateViaTutorialArrowpreviously calledScreenReader.Sayfor UISelectablePointer arrows and then let normal activation also announce — producing duplicate speech on every keypress. It now returns early for that shape, leaving the announcement to the one-shot delayed path.
Known issues (non-blocking)
- The Extra Monster Zone (loc=6) is not a navigable column in the monster row. EMZ activity is visible via F-key field summary and summon announcements.
- Extra Deck XYZ / Synchro / Link / Fusion summons fail with "Action failed" — the engine doesn't open the CardCommand popup for these. Workaround pending.
- Opening certain decks (e.g. Structure Decks before they're built) reads as "0 in main deck" because the editor opens in a non-default MODE not yet handled.
Install
- Install MelonLoader v0.7.3 Open-Beta against
dlpc.exe(Yu-Gi-Oh! Duel Links on Steam). Launch once so MelonLoader generates its assemblies, then close it. - Extract the zip directly into your Duel Links install folder.
DuelLinksAccess.dlllands inMods\,Tolk.dllandnvdaControllerClient64.dllland in the game root next todlpc.exe. Replaces any earlier DLL if present. - Launch. You should hear "Duel Links Access loaded. F1 for help."
If your screen reader is something other than NVDA, swap nvdaControllerClient64.dll for the controller client matching your reader.
v1.1.4 - Spell row third slot, flip-summon position, tutorial arrow loop
Patch release. Three duel-related bug fixes from a Stage-7 progression test session.
Fixes
- Spell/trap row no longer hides the third set spell.
SpellLocateswas{9, 10, 11}but the third spell actually lands atloc=8, notloc=11(which is never used). Fixed to{9, 10, 8}— same middle-then-right-then-left auto-place pattern that v1.1.3'sMonsterLocatesrework uncovered. A third Set Magic Card on your spell/trap row now announces as "Slot 3" instead of vanishing into the void. Same fix applies to your opponent's spell row. - Face-down monsters that survive an attack now read as "Defense position", not "Attack position". The engine fires a
CutinFlip (76)event when an attacked face-down monster is forcibly flipped face-up; the position stays Defense. Our position cache had nothing for the unhandled event, so the next read fell back to the command-mask heuristic and reported Attack. NewHandleFlipresolves the uniqueId viaDLL_DuelGetCardUniqueID(player, locate, 0)and writes Defense into the cache so subsequent reads stay accurate. Particularly relevant in resumed duels where the originalCardSetevent never replayed. - Stage-7 "To the Shop" tutorial no longer traps you in a Vagrant Purchase loop. The tutorial pushes a
TutorialArrowPartwithphysicTarget=nullwhoseipclick[0]is the Vagrant Purchase button. Our orphan-arrow handler classified any null-physicTargetarrow as "click anywhere to continue" and auto-fired the ipclick after 1.5–2.1s — which opened Shop2 every time you closed it, with no way out.Main.ClassifyArrowShapenow treats any null-physicTargetarrow that has at least oneipclickhandler as a UI-Selectable pointer instead: no auto-click, you navigate to the target via the normal item list and press Enter to engage (or Escape to leave). Genuine cutscene "click anywhere" arrows still haveipclick == 0and continue to auto-advance as before. The same change unblocks the previously-known GX Series-unlock arrow loop reported on 2026-04-30.
Known issues (non-blocking)
- The Extra Monster Zone (loc=6, used by Synchro/Xyz/Link/Fusion summons) is not a navigable column in the monster row. It still counts in the F-key field summary so EMZ activity is visible there and via summon announcements, but a player's own EMZ-summoned monster cannot be selected as an attacker via field nav for now.
- Extra Deck XYZ / Synchro / Link / Fusion summons fail with "Action failed" — the engine doesn't open the CardCommand popup for these like it does for Normal Summons. Workaround pending.
- Opening certain decks (e.g. Structure Decks like "Blue-Eyes" before they're built) reads as "0 in main deck, 0 in extra deck, 0 in collection" because the editor opens in a non-default
MODEwe don't yet handle. TheGoBacklog added in v1.1.3 will help us identify the mode.
Install
- Install MelonLoader v0.7.3 Open-Beta against
dlpc.exe(Yu-Gi-Oh! Duel Links on Steam). Launch once so MelonLoader generates its assemblies, then close it. - Extract the zip directly into your Duel Links install folder.
DuelLinksAccess.dlllands inMods\,Tolk.dllandnvdaControllerClient64.dllland in the game root next todlpc.exe. Replaces the v1.1.0 / v1.1.1 / v1.1.3 DLL if present. - Launch. You should hear "Duel Links Access loaded. F1 for help."
If your screen reader is something other than NVDA, swap nvdaControllerClient64.dll for the controller client matching your reader.
See README.md (bundled in the zip) for the full key bindings and the Home / Duel World screen guide.
v1.1.3 - Deck-editor U key, monster slot order, post-duel Enter take 3
Patch release. Includes everything that was queued for v1.1.2 (which was pulled before going live) plus a new "set this deck as your active deck" hotkey and a couple of UX fixes from testing it.
New
Ukey in the deck editor sets the currently-open deck as your active/main deck. Routes throughDeckEdit2ViewController.confirmSet()— the same entry point the in-editor "Use this deck" button calls — so the game's normal "This Deck is not set as active. Change your active Deck?" confirmation dialog fires and you confirm with Enter as usual. After confirming, the deck becomes the one Gate / PvP / etc. grab by default.
Fixes
- Monster row no longer reads "1 of 3: Empty" when you only have one monster out.
MonsterLocatesreordered from{1, 2, 3}(spatial) to{2, 3, 1}(engine auto-place sequence). A single Normal Summon now reads "1 of 3: " instead of "2 of 3: " with an empty leftmost slot. Same change applies to opponent's monster row. - Ctrl+S in the deck editor saves again. The bare
S(announce skill) handler was checked beforeCtrl+S(save) andTryConsumeKeyDownate the key first. Ctrl+S is now checked first; bare S is gated on!ctrlHeld. - Post-duel "Character Level" page advances on Enter. v1.1.1's fix searched only Selectables named
NextButton…; the actual button on this Htjson page is namedNextButton0but isn't a Selectable — it's a plain Transform with aButton.onClickhandler. v1.1.3 walks every descendant Transform (not just Selectables) and triesButton.onClick.Invoke()first before falling back to pointer events — same trick that fixed Htjson ButtonSet activation back in 2026-04-05. - Pressing
Uon a deck that's already your active deck no longer announces "Operation failed". The game'sconfirmSetthrowsNullReferenceExceptioninternally when called against the already-active deck (some "previous active deck" reference is null because there's nothing to swap). The mod now catches that specific exception and announces "Already your active deck" instead. GoBackin the deck editor now logs what it does. Previously it ran silently — if back didn't navigate, you couldn't tell from the log whether the keypress reached us, what the top VC was, or what_vc.Modewas. The handler now logs entry, the top VC name, the editorMODE, andSendBack()completion. Diagnostic only — no behavior change.
Known issues (non-blocking)
- The Extra Monster Zone (loc=6, used by Synchro/Xyz/Link/Fusion summons) is not a navigable column in the monster row. It still counts in the F-key field summary so EMZ activity is visible there and via summon announcements, but a player's own EMZ-summoned monster cannot be selected as an attacker via field nav for now.
- Opening certain decks (e.g. Structure Decks like "Blue-Eyes" before they're built) reads as "0 in main deck, 0 in extra deck, 0 in collection" because the editor opens in a non-default
MODEwe don't yet handle. The newGoBacklog will help us identify which mode this is. Tracked for a future release. - Tribute summon EmotionalList may still re-prompt with multi-material tributes; diagnostic log lines (
EmoCard[visual=N, itemIdx=M]) will pinpoint whether it's an order mismatch or a multi-select detection issue.
Install
- Install MelonLoader v0.7.3 Open-Beta against
dlpc.exe(Yu-Gi-Oh! Duel Links on Steam). Launch once so MelonLoader generates its assemblies, then close it. - Extract the zip directly into your Duel Links install folder.
DuelLinksAccess.dlllands inMods\,Tolk.dllandnvdaControllerClient64.dllland in the game root next todlpc.exe. Replaces the v1.1.0 / v1.1.1 DLL if present. - Launch. You should hear "Duel Links Access loaded. F1 for help."
If your screen reader is something other than NVDA, swap nvdaControllerClient64.dll for the controller client matching your reader.
See README.md (bundled in the zip) for the full key bindings and the Home / Duel World screen guide.
v1.1.1 - Duel locates v10.7.0, ATK/DEF tracking, post-duel Enter
Patch release. Duel polish: corrects long-standing field-locate assumptions for game v10.7.0, makes battle-position changes survive across the same turn, fixes the Character Level result page that started ignoring Enter again, and tightens attack-target selection.
Fixes
- Third monster on the field now appears in the monster row.
MonsterLocateswas assumed to be{2, 3, 4}based on older docs; in game v10.7.0 the three Speed Duel monster zones are at locates 1, 2, 3 (loc=4 is never occupied). Verified empirically by decodingCardMovep3 destinations as(locate << 1) | playeragainst summon order. Now{1, 2, 3}so all three Normal Summon slots show up under the M zone hotkey and Left/Right navigation. - ATK / DEF position change is reflected immediately, not next turn. The old command-mask heuristic only sees the OPPOSITE position bit (TurnAtk available → currently DEF; TurnDef available → currently ATK). After a position change has been used this turn both bits drop, and the heuristic fell back to "Attack position" regardless of actual orientation until the next turn. New
DuelPositionTrackerkeyed on uniqueId is updated byCutinTurn(looking up the actual uniqueId from(p1=player, p2=locate, slot=0)rather than misreading p2 as the uniqueId),RunSummon/RunSpSummon/CutinReverse(set ATK),CardSet(set DEF),CardBreak/CardExplosion(forget).ReadCurrentCardconsults the tracker before falling back to the cmdMask heuristic. A position change now also speaks: "Switched to Defense position: ". - Tribute / EmotionalList card selection picks the card the user heard.
cardList(visual order) anditemList(data order) are not guaranteed to share an ordering — the game can sortcardList. The old code readitemList[i]for the announcement but calledOnClickCard(cardList[i])to confirm; when orderings diverged the user heard one card and the click hit a different one. Both paths now resolve throughcardList[visualIndex].Indexso reads and clicks target the sameListItem. Diagnostic log emitsEmoCard[visual=N, itemIdx=M]so any future divergence is visible. - Post-duel "Character Level" result page advances on Enter again. The v1.1.0 fix used exact-match button-text "NEXT" and exact-name "nextbutton"; game v10.7.0 displays the text as "Next" (Title case) and names the GO
NextButton0. Both filters are now case-insensitive, and the GO-name fallback usesStartsWith("nextbutton")/StartsWith("okbutton")/StartsWith("btnnext")/StartsWith("btnok")so suffixed names match. - Attack target selection skips empty opp slots. Pressing Enter on an announced "Slot N: Empty" used to send
OnSelectAttackedagainst an empty zone; the drag failed and the fallbackOnDoCardCommand(Attack)let the engine reroute to the only legal target. Game-correct, but the audio + animation read like a direct attack while the engine actually resolved a battle.BeginTargetSelectionnow strips empty entries from the navigable list and a newNavigateTarget(direction)wraps over the filtered count so Left/Right only visits real opp monsters.
Documentation
docs/game-api.md: corrected monster-zone locate mapping (1, 2, 3 in Speed Duel), added a "ViewType param semantics" table coveringRunSummon,CardMove,CardBreak/CardExplosion,CutinTurn(the trap that bit the position-tracker fix),LifeSet/LifeDamage,PhaseChange, andRunDialog.
Known issues (non-blocking)
- The Extra Monster Zone (loc=6, used by Synchro/Xyz/Link/Fusion summons) is no longer a navigable column. It still counts in the F-key field summary so EMZ activity is visible there and via summon announcements. A player's own EMZ-summoned monster cannot be selected as an attacker via field nav for now.
- Tribute summon EmotionalList may still re-prompt with multi-material tributes; new diagnostic log lines (
EmoCard[visual=N, itemIdx=M]) will pinpoint whether it's an order mismatch or a multi-select detection issue.
What's in the zip
Mods/DuelLinksAccess.dll— the mod (Release build)Tolk.dll— Tolk screen-reader bridgenvdaControllerClient64.dll— NVDA controller client (64-bit, matches the game)README.md— full keybinding reference and a new Home / Duel World screen guideLICENSE— MIT
Install
- Install MelonLoader v0.7.3 Open-Beta against
dlpc.exe(Yu-Gi-Oh! Duel Links on Steam). Launch the game once so MelonLoader generates its assemblies, then close it. - Extract the zip directly into your Duel Links install folder. The structure already matches what the game expects:
DuelLinksAccess.dlllands inMods\, andTolk.dll+nvdaControllerClient64.dllland in the game root next todlpc.exe. If you're upgrading from v1.1.0, this will overwrite the old DLL. - Launch. You should hear "Duel Links Access loaded. F1 for help."
If your screen reader is something other than NVDA, swap nvdaControllerClient64.dll for the controller client matching your reader (Tolk supports JAWS, Window-Eyes, SuperNova, ZoomText, SAPI, and more — see Tolk's docs).
See README.md (now bundled in the zip) for the full key bindings and a guide to the Home / Duel World screen layout.
v1.1.0 - Boot tutorial fixes, F11 hotkey, post-duel Enter
Second alpha release. Focused on getting the boot tutorial flow working end-to-end and fixing the post-duel result screen.
Fixes
- Boot tutorial Shop and Gate steps now advance. The click pipeline for TutorialArrow ipclick handlers in IL2CPP was using
ExecuteEvents.Execute, which silently missed the SingleViewController handler. v1.1.0 callshandler.OnPointerClick(eventData)directly via the IL2CPP IPointerClickHandler thunk.eventData.positionnow uses the arrow's owntargetCamera.WorldToScreenPoint(physicTarget)instead of screen center.RegistPointerCurrentRaycastis no longer called before ipclick (it half-populated raycast data and the handler then rejected the click). - Joey post-duel cutscene advances on Enter. ScenarioPlayerPart screens now route Enter through direct ExecuteEvents on the scenario VC (the proven Kaiba pattern).
- Post-duel "Character Level" result screen advances on Enter. SBH's text-mode advance now searches the screen root's children for a late-activated NEXT/OK button (interactable and active) before falling through to the no-op root click.
New
- F11 hotkey — activates the current tutorial arrow target. Fires both ipclick and hardware mouse simulation. Available outside debug mode. Use this as the fallback when the target isn't reachable via arrow-key navigation.
- Shape-aware orphan arrow dispatch — distinguishes click-to-continue cutscene arrows (auto-dismiss after 1.5 s), UI-Selectable pointer arrows (user navigates the underlying button), and 3D world Collider arrows (user-driven via Enter on the navigated SBH item or F11).
- Generalized arrow detection across all named managers — fixes cases where the game pushed an arrow into a non-default manager and the mod went blind.
- Audible failure announcements for hardware mouse — no more silent failure when the game window can't be focused.
Install
- Install MelonLoader v0.7.3 Open-Beta against
dlpc.exe(Yu-Gi-Oh! Duel Links on Steam). - Extract the zip and place
DuelLinksAccess.dllinto the game'sMods\folder. - Tolk + your screen reader's controller DLL (
nvdaControllerClient64.dllfor NVDA, etc.) must be in the game root. - Launch. You should hear "Duel Links Access loaded. F1 for help."
Known issues (non-blocking)
- Click-to-continue arrows auto-advance silently after 1.5 s — works but the user isn't told what's happening. UX fix tracked for a future release.
- F11 alone doesn't open Gate/Shop/Labo screens once the boot tutorial has finished gating navigation. Workaround: navigate to the item with arrow keys and press Enter — that path also calls the underlying VC method (
OnGateButton, etc.). - Tribute summon EmotionalList may re-prompt confusingly with multi-material tributes; user can usually advance by trying different cards. Diagnostic logging will be added next.
See README for the full key bindings.
v0.3.0-alpha
Alpha release of Duel Links Access.
Highlights since the last build:
- Redesigned duel field navigation as a spatial grid: Up/Down move between rows (hand, your spells, your monsters, opponent monsters, opponent spells), Left/Right between columns.
- Zone hotkeys: C hand, M monsters, S spells, T field spell, G graveyard, B banished, D extra deck. Shift+hotkey targets opponent side. Number keys jump to monster slots.
- L reads life points. Status moved to I, event log moved to J.
- Missions screen improvements: tab-aware rescan, category headers, mission progress text, Alt Style Missions dialog fix.
- Duel dialog text composition with %s substitution for correct prompt text.
- Htjson ButtonSet activation and various field action fixes (flip summon, field card activate, contact fusion path).
Install
- Install MelonLoader v0.7.3 Open-Beta against Duel Links (dlpc.exe).
- Extract the zip and drop DuelLinksAccess.dll into the game's Mods folder.
- Launch the game. You should hear 'Duel Links Access loaded. F1 for help.'
Requires Tolk.dll and nvdaControllerClient64.dll in the game root for screen reader output. See the README for full key bindings.