Skip to content

v1.1.1 - Duel locates v10.7.0, ATK/DEF tracking, post-duel Enter

Choose a tag to compare

@zersiax zersiax released this 28 Apr 10:06
· 68 commits to main since this release
b65b5ac

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. MonsterLocates was 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 decoding CardMove p3 destinations as (locate << 1) | player against 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 DuelPositionTracker keyed on uniqueId is updated by CutinTurn (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). ReadCurrentCard consults 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) and itemList (data order) are not guaranteed to share an ordering — the game can sort cardList. The old code read itemList[i] for the announcement but called OnClickCard(cardList[i]) to confirm; when orderings diverged the user heard one card and the click hit a different one. Both paths now resolve through cardList[visualIndex].Index so reads and clicks target the same ListItem. Diagnostic log emits EmoCard[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 uses StartsWith("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 OnSelectAttacked against an empty zone; the drag failed and the fallback OnDoCardCommand(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. BeginTargetSelection now strips empty entries from the navigable list and a new NavigateTarget(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 covering RunSummon, CardMove, CardBreak/CardExplosion, CutinTurn (the trap that bit the position-tracker fix), LifeSet/LifeDamage, PhaseChange, and RunDialog.

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 bridge
  • nvdaControllerClient64.dll — NVDA controller client (64-bit, matches the game)
  • README.md — full keybinding reference and a new Home / Duel World screen guide
  • LICENSE — MIT

Install

  1. 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.
  2. Extract the zip directly into your Duel Links install folder. The structure already matches what the game expects: DuelLinksAccess.dll lands in Mods\, and Tolk.dll + nvdaControllerClient64.dll land in the game root next to dlpc.exe. If you're upgrading from v1.1.0, this will overwrite the old DLL.
  3. 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.