Skip to content

feat(interchange): add manager-neutral mod transfer - #417

Merged
Slush97 merged 4 commits into
Slush97:mainfrom
Skeptic-systems:feature/mod-interchange
Oct 6, 2026
Merged

Slush97 merged 4 commits into
Slush97:mainfrom
Skeptic-systems:feature/mod-interchange

Conversation

@Skeptic-systems

Copy link
Copy Markdown
Contributor
  • Define the Deadlock Mod Interchange format and bundle specification
  • Replace the DMM migration path with reusable reader and importer adapters
  • Add Grimoire export support for mods, profiles, and crosshairs
  • Add import and export workflows with progress and local mod identification
  • Cover DMM versions, bundles, profiles, variants, and path safety with tests

@Skeptic-systems

Copy link
Copy Markdown
Contributor Author

WIP, ref to deadlock-mod-manager/deadlock-mod-manager#744

@Skeptic-systems

Copy link
Copy Markdown
Contributor Author

@Slush97 Should be ready for review

@Slush97

Slush97 commented Oct 5, 2026

Copy link
Copy Markdown
Owner

Related DMM PRs:

@Slush97

Slush97 commented Oct 6, 2026

Copy link
Copy Markdown
Owner

added a new hasModIdentity() check in metadata.ts.in #424 as there was a bug on Grimoire's side making mods seem recognized despite being unknown. Will post review after

@Slush97 Slush97 left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I tested this against current DMM main (b626d504) with 7 real GameBanana mods installed through DMM, plus a second profile and a crosshair. Reading DMM's data works, and bundles work both ways (DMM export into Grimoire, Grimoire export into DMM). A few things need fixing before I merge:

  1. Importing from a DMM that shares citadel/addons skipped 6 of 7 mods. That part was our bug and it's fixed in #424 (merged). Grimoire writes a hash row for every unknown VPK at startup, and the importer counted any row with a hash as "already managed" and any lockerHero as owned, so hero skins never got imported either. Please rebase and use hasModIdentity() from metadata.ts in importer.ts: for managedHashes, and in place of isGrimoireManaged.

  2. Running the import a second time creates the profiles again ("Default Profile (2)", "Ranked (2)") every time. Also, after the first import reorders the slots, DMM's records point at different files, so the second run put the sound mod into a profile twice. Rule 6 in your spec (remember which document key became which mod) isn't implemented on the Grimoire side yet. A small ledger in userData would fix both.

  3. If an entry matches a mod that's already installed with several VPKs, the result only records one of them (importer.ts ~326, selectionImport.ts ~93). Applying that profile then turns off the mod's other files, or turns on a disabled variant instead. It should record all the installed files for that mod.

  4. When a DMM mod has no recorded files, the reader falls back to the file names inside its archive (dmmMigration.ts:232). Those are often pakNN_dir.vpk, and they get matched against whatever is live in that slot, so an unrelated mod can get moved and relabeled. Current DMM always records its files, so this mostly hits older installs. Those names should only be looked up in DMM's download folder.

  5. The import screen says "{{source}} keeps working, nothing there is changed", but files in the shared addons folder get moved and renamed. Please change the wording so people know DMM may lose track of them.

- Define the Deadlock Mod Interchange format and bundle specification
- Replace the DMM migration path with reusable reader and importer
  adapters
- Add Grimoire export support for mods, profiles, and crosshairs
- Add import and export workflows with progress and local mod
  identification
- Cover DMM versions, bundles, profiles, variants, and path safety with
  tests
- Block imports while Deadlock is running
- Resolve DMM files within their recorded profile
- Adopt or move managed VPKs without modifying external sources
- Apply source and imported load order consistently
- Track all adopted VPKs when rebuilding profiles
- Preserve existing slots when imported mods already match the order
- Verify imported mods are reordered into document order when needed
- Use absolute temporary paths for cross-platform shard tests
@Skeptic-systems
Skeptic-systems force-pushed the feature/mod-interchange branch from 497ba75 to 1423a86 Compare October 6, 2026 16:34
- Track imported mods and profiles in a content-hash ledger
- Refresh previously imported profiles without creating duplicates
- Ignore live slots when resolving DMM archive filenames and preserve
  variants
@Slush97
Slush97 merged commit d07262d into Slush97:main Oct 6, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants