Skip to content

v0.2

Latest

Choose a tag to compare

@harrysof harrysof released this 12 Aug 02:14
· 2 commits to main since this release

Changelog V0.2

Cemu 2.6 fork — "Remote Toypad". All changes below are on top of stock Cemu 2.6.

2026-08-12

Added

  • Tag writes now persist to the source .bin when figures are loaded through the TCP listener. The LOAD message (previously 5-byte header + 180-byte tag data) may now carry a UTF-8 file path: 2-byte little-endian length, then that many bytes. The listener opens it with FileStream::openFile2(path, true) — exactly like the built-in toypad window — and hands the stream to LoadFigure, so every subsequent game write (WriteBlock -> Save()), the final flush in RemoveFigure, and the handle transfer in MoveFigure write back to the same file. (DimensionsNetworkListener.cpp)

Fixed

  • Network-loaded figures previously got a nullptr file handle (LoadFigure(figureData, nullptr, ...)), so DimensionsMini::Save() silently no-oped: the game wrote to memory only, and every tag reverted to a blank template on reload. This was the root cause of "CORRUPTED" .bin files (identical UID, pages 35-37 zeroed).
  • Commands the game uses before writing the encrypted tag pages (0xD0, 0xE1, 0xE5, 0xFF) previously got an all-zero reply; they now return a proper success ack (55 02 <seq> 00 <checksum>), so the unlock exchange completes and the write lands. (Dimensions.cpp SendCommand)

Changed

  • A LOAD without a path (length 0) keeps the old in-memory-only behavior. If the path can't be opened, the listener logs Dimensions network listener failed to open figure file: ... and falls back to an in-memory figure instead of dropping the load.

Fork base (stock Cemu 2.6 + prior additions)

Added

  • Emulated LEGO Dimensions Toypad (nsyshid backend) with a TCP listener on 127.0.0.1:9191 (port configurable via DimensionsToypadListenerPort), speaking a 3-message protocol from the LegoToypad app:
    • LOAD: 01 <pad> <index> 00 00 + 180 bytes (45 pages x 4) + optional path (see above)
    • REMOVE: 02 <pad> <index> 00 00
    • MOVE: 03 <pad> <index> <oldPad> <oldIndex>
  • Input handoff event Local\CemuToypadPickerInputActive: while set, Cemu suppresses controller input so the picker overlay can be used without the game reading the pad. (Controller.cpp)

Changed

  • Diagnostics in Dimensions.cpp: LD CMD {:02x} seq for toy-pad commands from the game, and WriteBlock: gameIndex=... page=... dimFile=true/false for every tag write, so persistence problems are visible in log.txt (%APPDATA%\Cemu\log.txt when running non-portable).