Repository navigation
feat(interchange): add manager-neutral mod transfer - #417
Conversation
Skeptic-systems
commented
Oct 3, 2026
- 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
|
WIP, ref to deadlock-mod-manager/deadlock-mod-manager#744 |
|
@Slush97 Should be ready for review |
|
Related DMM PRs:
|
|
added a new |
Slush97
left a comment
There was a problem hiding this comment.
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:
-
Importing from a DMM that shares
citadel/addonsskipped 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 anylockerHeroas owned, so hero skins never got imported either. Please rebase and usehasModIdentity()frommetadata.tsinimporter.ts: formanagedHashes, and in place ofisGrimoireManaged. -
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.
-
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. -
When a DMM mod has no recorded files, the reader falls back to the file names inside its archive (
dmmMigration.ts:232). Those are oftenpakNN_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. -
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
497ba75 to
1423a86
Compare
- 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