modwright 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +35 -0
- package/README.md +212 -0
- package/assets/claude/agents/mw-explore.md +46 -0
- package/assets/claude/agents/mw-fixture.md +33 -0
- package/assets/claude/agents/mw-rule-author.md +51 -0
- package/assets/claude/agents/mw-scaffold-author.md +48 -0
- package/assets/claude/skills/mw-author.md +59 -0
- package/assets/claude/skills/mw-new-item.md +51 -0
- package/assets/claude/skills/mw-new-spell.md +50 -0
- package/assets/claude/skills/mw-scaffold.md +59 -0
- package/assets/claude/skills/mw-ship.md +57 -0
- package/assets/claude/skills/mw-validate.md +51 -0
- package/assets/claude/skills/mw-verify.md +59 -0
- package/assets/nivalisnights/extract_resources.py +177 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Config.json +5 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/BootstrapClient.lua +55 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/BootstrapServer.lua +81 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/ModWrightBridge/Log.lua +96 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/ModWrightBridge/Probes.lua +1038 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/ModWrightBridge/ProbesClient.lua +74 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/ModWrightBridge/Protocol.lua +985 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/ModWrightBridge/Watch.lua +175 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/meta.lsx +45 -0
- package/bridges/bg3-se/README.md +99 -0
- package/bridges/bg3-se/bridge.json +68 -0
- package/bridges/cp2077-cet/ModWrightBridge/init.lua +375 -0
- package/bridges/cp2077-cet/ModWrightBridge/probes.lua +1104 -0
- package/bridges/cp2077-cet/ModWrightBridge/protocol.lua +1306 -0
- package/bridges/cp2077-cet/README.md +165 -0
- package/bridges/cp2077-cet/bridge.json +53 -0
- package/dist/core/bridge/arm.js +175 -0
- package/dist/core/bridge/cet-console.js +26 -0
- package/dist/core/bridge/cet-log.js +362 -0
- package/dist/core/bridge/index.js +11 -0
- package/dist/core/bridge/locate.js +35 -0
- package/dist/core/bridge/paths.js +34 -0
- package/dist/core/bridge/pending.js +89 -0
- package/dist/core/bridge/poll.js +155 -0
- package/dist/core/bridge/stage.js +100 -0
- package/dist/core/bridge/status.js +97 -0
- package/dist/core/bridge/types.js +145 -0
- package/dist/core/bridge/validate.js +107 -0
- package/dist/core/build/index.js +6 -0
- package/dist/core/build/manifest.js +47 -0
- package/dist/core/build/paths.js +32 -0
- package/dist/core/build/run.js +342 -0
- package/dist/core/build/stage.js +265 -0
- package/dist/core/build/steps/bg3.js +129 -0
- package/dist/core/build/steps/core.js +195 -0
- package/dist/core/build/steps/cyberpunk.js +95 -0
- package/dist/core/build/steps/listing.js +35 -0
- package/dist/core/build/types.js +13 -0
- package/dist/core/build/zip.js +148 -0
- package/dist/core/compat/check.js +113 -0
- package/dist/core/compat/pe.js +220 -0
- package/dist/core/compat/types.js +1 -0
- package/dist/core/compat/version.js +70 -0
- package/dist/core/deploy/guards.js +292 -0
- package/dist/core/deploy/index.js +5 -0
- package/dist/core/deploy/plan.js +696 -0
- package/dist/core/deploy/reload-apply.js +361 -0
- package/dist/core/deploy/reload.js +358 -0
- package/dist/core/deploy/sources.js +169 -0
- package/dist/core/deploy/types.js +1 -0
- package/dist/core/epic.js +54 -0
- package/dist/core/fsutil.js +191 -0
- package/dist/core/home.js +70 -0
- package/dist/core/knowledge/facts.js +229 -0
- package/dist/core/knowledge/index.js +4 -0
- package/dist/core/knowledge/search.js +112 -0
- package/dist/core/knowledge/store.js +123 -0
- package/dist/core/knowledge/types.js +1 -0
- package/dist/core/ledger/check.js +42 -0
- package/dist/core/ledger/hooks.js +80 -0
- package/dist/core/ledger/index.js +7 -0
- package/dist/core/ledger/query.js +17 -0
- package/dist/core/ledger/record.js +84 -0
- package/dist/core/ledger/status.js +53 -0
- package/dist/core/ledger/store.js +98 -0
- package/dist/core/ledger/types.js +108 -0
- package/dist/core/logs/index.js +4 -0
- package/dist/core/logs/registry.js +50 -0
- package/dist/core/logs/scan.js +195 -0
- package/dist/core/logs/triage.js +160 -0
- package/dist/core/logs/types.js +1 -0
- package/dist/core/lsx.js +10 -0
- package/dist/core/lz4.js +66 -0
- package/dist/core/mods.js +229 -0
- package/dist/core/process.js +49 -0
- package/dist/core/project/build-steps.js +83 -0
- package/dist/core/project/describe.js +74 -0
- package/dist/core/project/index.js +5 -0
- package/dist/core/project/load.js +146 -0
- package/dist/core/project/schema.js +264 -0
- package/dist/core/project/types.js +3 -0
- package/dist/core/prompts.js +72 -0
- package/dist/core/registry.js +35 -0
- package/dist/core/safety/backup.js +206 -0
- package/dist/core/safety/execute.js +188 -0
- package/dist/core/safety/index.js +5 -0
- package/dist/core/safety/plan.js +122 -0
- package/dist/core/safety/restore.js +172 -0
- package/dist/core/safety/types.js +1 -0
- package/dist/core/scaffold/bootstrap.js +7 -0
- package/dist/core/scaffold/catalog.js +28 -0
- package/dist/core/scaffold/claude-assets.js +271 -0
- package/dist/core/scaffold/collisions.js +64 -0
- package/dist/core/scaffold/emit.js +356 -0
- package/dist/core/scaffold/engine.js +680 -0
- package/dist/core/scaffold/ids.js +78 -0
- package/dist/core/scaffold/index.js +10 -0
- package/dist/core/scaffold/jsonpath.js +121 -0
- package/dist/core/scaffold/load.js +81 -0
- package/dist/core/scaffold/render.js +85 -0
- package/dist/core/scaffold/sequence.js +396 -0
- package/dist/core/scaffold/types.js +309 -0
- package/dist/core/steam.js +63 -0
- package/dist/core/surfaceutil.js +36 -0
- package/dist/core/testplan/check.js +67 -0
- package/dist/core/testplan/index.js +5 -0
- package/dist/core/testplan/load.js +100 -0
- package/dist/core/testplan/registry.js +317 -0
- package/dist/core/testplan/run.js +389 -0
- package/dist/core/testplan/types.js +82 -0
- package/dist/core/text/converters/bg3.js +50 -0
- package/dist/core/text/converters/cyberpunk.js +36 -0
- package/dist/core/text/converters/index.js +261 -0
- package/dist/core/text/diff/cr2w.js +180 -0
- package/dist/core/text/diff/index.js +16 -0
- package/dist/core/text/diff/loca.js +43 -0
- package/dist/core/text/diff/lsx.js +126 -0
- package/dist/core/text/handles.js +86 -0
- package/dist/core/text/index.js +6 -0
- package/dist/core/text/json.js +46 -0
- package/dist/core/text/templates/cache.js +71 -0
- package/dist/core/text/templates/index.js +3 -0
- package/dist/core/text/templates/library.js +245 -0
- package/dist/core/text/templates/types.js +51 -0
- package/dist/core/text/toolchain.js +16 -0
- package/dist/core/text/types.js +1 -0
- package/dist/core/text/validate.js +149 -0
- package/dist/core/text/xml.js +58 -0
- package/dist/core/toolchain/datafetch.js +151 -0
- package/dist/core/toolchain/env.js +63 -0
- package/dist/core/toolchain/features.js +170 -0
- package/dist/core/toolchain/index.js +8 -0
- package/dist/core/toolchain/install.js +191 -0
- package/dist/core/toolchain/locate.js +275 -0
- package/dist/core/toolchain/remember.js +84 -0
- package/dist/core/toolchain/run.js +318 -0
- package/dist/core/toolchain/specs.js +351 -0
- package/dist/core/toolchain/types.js +1 -0
- package/dist/core/types.js +1 -0
- package/dist/core/userconfig.js +66 -0
- package/dist/core/validate/context.js +139 -0
- package/dist/core/validate/index.js +5 -0
- package/dist/core/validate/registry.js +58 -0
- package/dist/core/validate/run.js +131 -0
- package/dist/core/validate/suppressions.js +91 -0
- package/dist/core/validate/types.js +2 -0
- package/dist/core/yamledit.js +51 -0
- package/dist/index.js +389 -0
- package/dist/server.js +1914 -0
- package/dist/surfaces/baldursgate3/compat.js +164 -0
- package/dist/surfaces/baldursgate3/identity.js +110 -0
- package/dist/surfaces/baldursgate3/index/build.js +331 -0
- package/dist/surfaces/baldursgate3/index/index.js +17 -0
- package/dist/surfaces/baldursgate3/index/info.js +40 -0
- package/dist/surfaces/baldursgate3/index/parsers/loca.js +41 -0
- package/dist/surfaces/baldursgate3/index/parsers/lsx.js +137 -0
- package/dist/surfaces/baldursgate3/index/parsers/stats.js +45 -0
- package/dist/surfaces/baldursgate3/index/parsers/treasuretable.js +57 -0
- package/dist/surfaces/baldursgate3/index/parsers/xmlutil.js +142 -0
- package/dist/surfaces/baldursgate3/index/queries.js +327 -0
- package/dist/surfaces/baldursgate3/index/schema.js +62 -0
- package/dist/surfaces/baldursgate3/index.js +3 -0
- package/dist/surfaces/baldursgate3/logs.js +278 -0
- package/dist/surfaces/baldursgate3/modsettings.js +115 -0
- package/dist/surfaces/baldursgate3/pak.js +153 -0
- package/dist/surfaces/baldursgate3/settings.js +49 -0
- package/dist/surfaces/baldursgate3/surface.js +232 -0
- package/dist/surfaces/baldursgate3/validators/bridge.js +7 -0
- package/dist/surfaces/baldursgate3/validators/files.js +476 -0
- package/dist/surfaces/baldursgate3/validators/items.js +1001 -0
- package/dist/surfaces/baldursgate3/validators/progression.js +734 -0
- package/dist/surfaces/baldursgate3/validators/stats.js +1076 -0
- package/dist/surfaces/baldursgate3/validators/story.js +790 -0
- package/dist/surfaces/baldursgate3/validators/templates.js +7 -0
- package/dist/surfaces/cyberpunk2077/compat.js +223 -0
- package/dist/surfaces/cyberpunk2077/index/build.js +231 -0
- package/dist/surfaces/cyberpunk2077/index/index.js +17 -0
- package/dist/surfaces/cyberpunk2077/index/info.js +51 -0
- package/dist/surfaces/cyberpunk2077/index/model.js +52 -0
- package/dist/surfaces/cyberpunk2077/index/parsers/tweak.js +483 -0
- package/dist/surfaces/cyberpunk2077/index/parsers/tweakxl-yaml.js +183 -0
- package/dist/surfaces/cyberpunk2077/index/queries.js +504 -0
- package/dist/surfaces/cyberpunk2077/index/resource.js +135 -0
- package/dist/surfaces/cyberpunk2077/index/schema.js +90 -0
- package/dist/surfaces/cyberpunk2077/index.js +3 -0
- package/dist/surfaces/cyberpunk2077/logs.js +742 -0
- package/dist/surfaces/cyberpunk2077/paths.js +12 -0
- package/dist/surfaces/cyberpunk2077/surface.js +218 -0
- package/dist/surfaces/cyberpunk2077/validators/bridge.js +7 -0
- package/dist/surfaces/cyberpunk2077/validators/cr2w.js +349 -0
- package/dist/surfaces/cyberpunk2077/validators/garments.js +1181 -0
- package/dist/surfaces/cyberpunk2077/validators/mesh.js +338 -0
- package/dist/surfaces/cyberpunk2077/validators/modsettings.js +120 -0
- package/dist/surfaces/cyberpunk2077/validators/packaging.js +463 -0
- package/dist/surfaces/cyberpunk2077/validators/red4ext.js +318 -0
- package/dist/surfaces/cyberpunk2077/validators/redscript.js +193 -0
- package/dist/surfaces/cyberpunk2077/validators/templates.js +7 -0
- package/dist/surfaces/cyberpunk2077/validators/tweaks.js +768 -0
- package/dist/surfaces/cyberpunk2077/validators/vehicles.js +531 -0
- package/dist/surfaces/cyberpunk2077/validators/xl.js +308 -0
- package/dist/surfaces/eldenring/binders.js +111 -0
- package/dist/surfaces/eldenring/compat.js +166 -0
- package/dist/surfaces/eldenring/dcx.js +49 -0
- package/dist/surfaces/eldenring/index.js +13 -0
- package/dist/surfaces/eldenring/loaders.js +132 -0
- package/dist/surfaces/eldenring/logs.js +67 -0
- package/dist/surfaces/eldenring/paramdef.js +256 -0
- package/dist/surfaces/eldenring/params.js +129 -0
- package/dist/surfaces/eldenring/surface.js +121 -0
- package/dist/surfaces/eldenring/tools.js +52 -0
- package/dist/surfaces/eldenring/validators/binders.js +193 -0
- package/dist/surfaces/eldenring/validators/packages.js +159 -0
- package/dist/surfaces/eldenring/validators/params.js +334 -0
- package/dist/surfaces/eldenring/validators/profiles.js +287 -0
- package/dist/surfaces/index.js +34 -0
- package/dist/surfaces/nivalisnights/compat.js +229 -0
- package/dist/surfaces/nivalisnights/index/build.js +310 -0
- package/dist/surfaces/nivalisnights/index/index.js +5 -0
- package/dist/surfaces/nivalisnights/index/queries.js +231 -0
- package/dist/surfaces/nivalisnights/index.js +4 -0
- package/dist/surfaces/nivalisnights/logs.js +473 -0
- package/dist/surfaces/nivalisnights/surface.js +195 -0
- package/dist/surfaces/skyrimse/archives.js +229 -0
- package/dist/surfaces/skyrimse/compat.js +163 -0
- package/dist/surfaces/skyrimse/index.js +12 -0
- package/dist/surfaces/skyrimse/loadorder.js +174 -0
- package/dist/surfaces/skyrimse/logs.js +241 -0
- package/dist/surfaces/skyrimse/plugins.js +149 -0
- package/dist/surfaces/skyrimse/records.js +94 -0
- package/dist/surfaces/skyrimse/surface.js +240 -0
- package/dist/surfaces/skyrimse/validators/archive-records.js +165 -0
- package/dist/surfaces/skyrimse/validators/archives.js +110 -0
- package/dist/surfaces/skyrimse/validators/plugins.js +374 -0
- package/dist/surfaces/skyrimse/validators/records.js +117 -0
- package/dist/surfaces/stardewvalley/compat.js +190 -0
- package/dist/surfaces/stardewvalley/config.js +42 -0
- package/dist/surfaces/stardewvalley/contentpatcher.js +203 -0
- package/dist/surfaces/stardewvalley/index/index.js +229 -0
- package/dist/surfaces/stardewvalley/index/wiki.js +190 -0
- package/dist/surfaces/stardewvalley/index.js +12 -0
- package/dist/surfaces/stardewvalley/logs.js +307 -0
- package/dist/surfaces/stardewvalley/mods.js +182 -0
- package/dist/surfaces/stardewvalley/surface.js +244 -0
- package/dist/surfaces/stardewvalley/validators/content.js +321 -0
- package/dist/surfaces/stardewvalley/validators/fields.js +147 -0
- package/dist/surfaces/stardewvalley/validators/loadorder.js +69 -0
- package/dist/surfaces/stardewvalley/validators/manifest.js +221 -0
- package/dist/surfaces/subnautica2/compat.js +138 -0
- package/dist/surfaces/subnautica2/index.js +5 -0
- package/dist/surfaces/subnautica2/logs.js +129 -0
- package/dist/surfaces/subnautica2/paks.js +173 -0
- package/dist/surfaces/subnautica2/surface.js +151 -0
- package/dist/surfaces/subnautica2/validators/packaging.js +298 -0
- package/dist/surfaces/valheim/compat.js +171 -0
- package/dist/surfaces/valheim/index/index.js +301 -0
- package/dist/surfaces/valheim/index/tables.js +103 -0
- package/dist/surfaces/valheim/index.js +11 -0
- package/dist/surfaces/valheim/logs.js +197 -0
- package/dist/surfaces/valheim/packaging.js +131 -0
- package/dist/surfaces/valheim/plugins.js +270 -0
- package/dist/surfaces/valheim/references.js +121 -0
- package/dist/surfaces/valheim/surface.js +223 -0
- package/dist/surfaces/valheim/validators/packaging.js +218 -0
- package/dist/surfaces/valheim/validators/plugins.js +287 -0
- package/dist/surfaces/valheim/validators/references.js +169 -0
- package/knowledge/baldursgate3/animations.gr2.yaml +166 -0
- package/knowledge/baldursgate3/audio.voice.yaml +182 -0
- package/knowledge/baldursgate3/audio.wwise.yaml +104 -0
- package/knowledge/baldursgate3/charactercreation.heads-hair.yaml +193 -0
- package/knowledge/baldursgate3/communitylibrary.shared-content.yaml +129 -0
- package/knowledge/baldursgate3/compatibilityframework.api.yaml +176 -0
- package/knowledge/baldursgate3/crash.causes.yaml +90 -0
- package/knowledge/baldursgate3/dialogue.dialogbank.yaml +120 -0
- package/knowledge/baldursgate3/dialogue.files.yaml +236 -0
- package/knowledge/baldursgate3/dialogue.osiris-goals.yaml +386 -0
- package/knowledge/baldursgate3/dialogue.yaml +122 -0
- package/knowledge/baldursgate3/feats.classes.yaml +164 -0
- package/knowledge/baldursgate3/items.cloth-physics.yaml +167 -0
- package/knowledge/baldursgate3/items.roottemplates.yaml +320 -0
- package/knowledge/baldursgate3/items.visualbank.yaml +628 -0
- package/knowledge/baldursgate3/journal.quests.yaml +214 -0
- package/knowledge/baldursgate3/loadorder.modsettings.yaml +128 -0
- package/knowledge/baldursgate3/localization.handles.yaml +92 -0
- package/knowledge/baldursgate3/misc.encoding-and-practice.yaml +111 -0
- package/knowledge/baldursgate3/origins.companions.yaml +144 -0
- package/knowledge/baldursgate3/osiris.signatures.yaml +211 -0
- package/knowledge/baldursgate3/packaging.meta.yaml +155 -0
- package/knowledge/baldursgate3/packaging.paks.yaml +79 -0
- package/knowledge/baldursgate3/process.launch.yaml +34 -0
- package/knowledge/baldursgate3/progressions.yaml +92 -0
- package/knowledge/baldursgate3/publishing.modio-nexus.yaml +170 -0
- package/knowledge/baldursgate3/publishing.toolkit-modio.yaml +135 -0
- package/knowledge/baldursgate3/races.progression.yaml +228 -0
- package/knowledge/baldursgate3/scriptextender.console.yaml +257 -0
- package/knowledge/baldursgate3/scriptextender.yaml +252 -0
- package/knowledge/baldursgate3/stats.boosts.yaml +293 -0
- package/knowledge/baldursgate3/stats.equipment-kits.yaml +69 -0
- package/knowledge/baldursgate3/stats.interrupts.yaml +45 -0
- package/knowledge/baldursgate3/stats.itemcombos.yaml +65 -0
- package/knowledge/baldursgate3/stats.spells.yaml +293 -0
- package/knowledge/baldursgate3/stats.weapons.yaml +210 -0
- package/knowledge/baldursgate3/toolchain.divine.yaml +179 -0
- package/knowledge/baldursgate3/toolchain.lslib-formats.yaml +242 -0
- package/knowledge/baldursgate3/toolkit.levels.yaml +177 -0
- package/knowledge/baldursgate3/ui.icons-atlas.yaml +78 -0
- package/knowledge/baldursgate3/ui.icons.yaml +412 -0
- package/knowledge/baldursgate3/ui.mcm.yaml +161 -0
- package/knowledge/baldursgate3/vfx.materials.yaml +174 -0
- package/knowledge/baldursgate3/visuals.characterfix.yaml +73 -0
- package/knowledge/cyberpunk2077/animations.anims.yaml +118 -0
- package/knowledge/cyberpunk2077/anims.archivexl.yaml +163 -0
- package/knowledge/cyberpunk2077/anims.authoring.yaml +579 -0
- package/knowledge/cyberpunk2077/anims.encoder.yaml +156 -0
- package/knowledge/cyberpunk2077/anims.graph.yaml +629 -0
- package/knowledge/cyberpunk2077/anims.method.yaml +360 -0
- package/knowledge/cyberpunk2077/anims.pipeline.yaml +352 -0
- package/knowledge/cyberpunk2077/anims.roundtrip.yaml +222 -0
- package/knowledge/cyberpunk2077/anims.sets.yaml +176 -0
- package/knowledge/cyberpunk2077/archivexl.bodytypes.yaml +149 -0
- package/knowledge/cyberpunk2077/archivexl.dynamic-appearances.yaml +218 -0
- package/knowledge/cyberpunk2077/archivexl.manifest.yaml +214 -0
- package/knowledge/cyberpunk2077/audio.events.yaml +168 -0
- package/knowledge/cyberpunk2077/audio.sounds.yaml +164 -0
- package/knowledge/cyberpunk2077/audio.voicesets.yaml +146 -0
- package/knowledge/cyberpunk2077/cet.sandbox.yaml +219 -0
- package/knowledge/cyberpunk2077/clothing.garments.yaml +283 -0
- package/knowledge/cyberpunk2077/clothing.refits.yaml +215 -0
- package/knowledge/cyberpunk2077/codeware.overview.yaml +111 -0
- package/knowledge/cyberpunk2077/codeware.systems.yaml +192 -0
- package/knowledge/cyberpunk2077/drones.combat.yaml +416 -0
- package/knowledge/cyberpunk2077/drones.control.yaml +552 -0
- package/knowledge/cyberpunk2077/entities.appearance.yaml +166 -0
- package/knowledge/cyberpunk2077/equipmentex.slots.yaml +151 -0
- package/knowledge/cyberpunk2077/fx.effects.yaml +246 -0
- package/knowledge/cyberpunk2077/fx.lights.yaml +171 -0
- package/knowledge/cyberpunk2077/hair.modding.yaml +145 -0
- package/knowledge/cyberpunk2077/items.wiring.yaml +246 -0
- package/knowledge/cyberpunk2077/loadorder.archives.yaml +71 -0
- package/knowledge/cyberpunk2077/mesh.blender.yaml +209 -0
- package/knowledge/cyberpunk2077/nativedb.dump.yaml +98 -0
- package/knowledge/cyberpunk2077/npc.appearance.yaml +275 -0
- package/knowledge/cyberpunk2077/npc.behaviour.yaml +128 -0
- package/knowledge/cyberpunk2077/npc.locomotion.yaml +490 -0
- package/knowledge/cyberpunk2077/packaging.deploy.yaml +175 -0
- package/knowledge/cyberpunk2077/packaging.variants.yaml +176 -0
- package/knowledge/cyberpunk2077/player.control.yaml +918 -0
- package/knowledge/cyberpunk2077/process.assetbuild.yaml +154 -0
- package/knowledge/cyberpunk2077/process.lessons.yaml +276 -0
- package/knowledge/cyberpunk2077/quests.minor.yaml +46 -0
- package/knowledge/cyberpunk2077/quests.scenes.yaml +282 -0
- package/knowledge/cyberpunk2077/quickhacks.tiers.yaml +41 -0
- package/knowledge/cyberpunk2077/red4ext.api.yaml +645 -0
- package/knowledge/cyberpunk2077/red4ext.plugins.yaml +124 -0
- package/knowledge/cyberpunk2077/redhottools.hotreload.yaml +245 -0
- package/knowledge/cyberpunk2077/redscript.compile-log.yaml +76 -0
- package/knowledge/cyberpunk2077/redscript.modules.yaml +118 -0
- package/knowledge/cyberpunk2077/toolchain.wolvenkit.yaml +163 -0
- package/knowledge/cyberpunk2077/tweakdb.loot-recipes.yaml +184 -0
- package/knowledge/cyberpunk2077/tweakdb.melee.yaml +352 -0
- package/knowledge/cyberpunk2077/tweakdb.weapons.yaml +325 -0
- package/knowledge/cyberpunk2077/tweakxl.hotreload.yaml +151 -0
- package/knowledge/cyberpunk2077/tweakxl.yaml-syntax.yaml +208 -0
- package/knowledge/cyberpunk2077/ui.icons.yaml +259 -0
- package/knowledge/cyberpunk2077/ui.inkatlas.yaml +81 -0
- package/knowledge/cyberpunk2077/ui.modsettings.yaml +204 -0
- package/knowledge/cyberpunk2077/vehicles.control.yaml +475 -0
- package/knowledge/cyberpunk2077/vehicles.dashboard-ui.yaml +203 -0
- package/knowledge/cyberpunk2077/vehicles.entities.yaml +195 -0
- package/knowledge/cyberpunk2077/vehicles.wiring.yaml +137 -0
- package/knowledge/cyberpunk2077/wolvenkit.cli.yaml +167 -0
- package/knowledge/cyberpunk2077/workspot.system.yaml +55 -0
- package/knowledge/cyberpunk2077/world.interactions.yaml +41 -0
- package/knowledge/cyberpunk2077/world.loot-container.yaml +167 -0
- package/knowledge/cyberpunk2077/world.sectors.yaml +233 -0
- package/knowledge/eldenring/formats.binders.yaml +237 -0
- package/knowledge/eldenring/launcher.me3.yaml +230 -0
- package/knowledge/eldenring/launcher.modengine2.yaml +119 -0
- package/knowledge/eldenring/params.paramdef.yaml +149 -0
- package/knowledge/eldenring/params.regulation.yaml +142 -0
- package/knowledge/eldenring/saves.online.yaml +118 -0
- package/knowledge/eldenring/toolchain.cli.yaml +256 -0
- package/knowledge/nivalisnights/modding.runtime.yaml +157 -0
- package/knowledge/skyrimse/archives.bsa.yaml +212 -0
- package/knowledge/skyrimse/install.detection.yaml +41 -0
- package/knowledge/skyrimse/loadorder.files.yaml +242 -0
- package/knowledge/skyrimse/plugins.esl.yaml +189 -0
- package/knowledge/skyrimse/plugins.format.yaml +224 -0
- package/knowledge/skyrimse/skse.runtime.yaml +283 -0
- package/knowledge/skyrimse/toolchain.xedit-spriggit.yaml +336 -0
- package/knowledge/stardewvalley/contentpatcher.format.yaml +338 -0
- package/knowledge/stardewvalley/distribution.channels.yaml +236 -0
- package/knowledge/stardewvalley/game.versions.yaml +202 -0
- package/knowledge/stardewvalley/install.layout.yaml +277 -0
- package/knowledge/stardewvalley/smapi.loader.yaml +284 -0
- package/knowledge/stardewvalley/smapi.logs.yaml +329 -0
- package/knowledge/stardewvalley/smapi.manifest.yaml +293 -0
- package/knowledge/stardewvalley/toolchain.build.yaml +261 -0
- package/knowledge/stardewvalley/wiki.dataformat.yaml +130 -0
- package/knowledge/subnautica2/game.build.yaml +331 -0
- package/knowledge/subnautica2/modding.state.yaml +210 -0
- package/knowledge/subnautica2/ue5.containers.yaml +72 -0
- package/knowledge/subnautica2/ue5.paks.yaml +203 -0
- package/knowledge/subnautica2/ue5.tooling.yaml +175 -0
- package/knowledge/subnautica2/ue5.ue4ss.yaml +203 -0
- package/knowledge/valheim/bepinex.loader.yaml +247 -0
- package/knowledge/valheim/bepinex.plugins.yaml +251 -0
- package/knowledge/valheim/game.versions.yaml +321 -0
- package/knowledge/valheim/install.layout.yaml +216 -0
- package/knowledge/valheim/jotunn.library.yaml +334 -0
- package/knowledge/valheim/thunderstore.packaging.yaml +217 -0
- package/knowledge/valheim/toolchain.build.yaml +111 -0
- package/package.json +29 -0
- package/scaffolds/baldursgate3/new-class-injection.yaml +148 -0
- package/scaffolds/baldursgate3/new-item.yaml +264 -0
- package/scaffolds/baldursgate3/new-mod.yaml +174 -0
- package/scaffolds/baldursgate3/new-passive.yaml +100 -0
- package/scaffolds/baldursgate3/new-project.yaml +118 -0
- package/scaffolds/baldursgate3/new-quest-stub.yaml +159 -0
- package/scaffolds/baldursgate3/new-spell.yaml +102 -0
- package/scaffolds/baldursgate3/new-status.yaml +119 -0
- package/scaffolds/baldursgate3/sequences/subclass-kit.yaml +50 -0
- package/scaffolds/cyberpunk2077/edit-tweak.yaml +70 -0
- package/scaffolds/cyberpunk2077/mesh-export-preset.yaml +170 -0
- package/scaffolds/cyberpunk2077/new-entity-patch.yaml +255 -0
- package/scaffolds/cyberpunk2077/new-garment-refit.yaml +279 -0
- package/scaffolds/cyberpunk2077/new-item-chain.yaml +548 -0
- package/scaffolds/cyberpunk2077/new-localization.yaml +130 -0
- package/scaffolds/cyberpunk2077/new-mod-settings.yaml +133 -0
- package/scaffolds/cyberpunk2077/new-player-replacer.yaml +1003 -0
- package/scaffolds/cyberpunk2077/new-project.yaml +157 -0
- package/scaffolds/cyberpunk2077/new-sector-node.yaml +156 -0
- package/scaffolds/cyberpunk2077/new-tweak.yaml +121 -0
- package/scaffolds/cyberpunk2077/new-vehicle-livery.yaml +148 -0
- package/scaffolds/cyberpunk2077/new-workspot-entity.yaml +177 -0
- package/scaffolds/cyberpunk2077/sequences/iconic-weapon.yaml +72 -0
- package/scaffolds/cyberpunk2077/sequences/quickhack-takeover.yaml +213 -0
- package/scaffolds/stardewvalley/new-cp-patch.yaml +106 -0
- package/scaffolds/stardewvalley/new-csharp-mod.yaml +195 -0
- package/scaffolds/stardewvalley/new-project.yaml +184 -0
- package/scaffolds/stardewvalley/sequences/content-pack.yaml +31 -0
- package/scripts/mw-tool.mjs +184 -0
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
game: eldenring
|
|
2
|
+
topic: formats.binders
|
|
3
|
+
title: dvdbnd archives, dcx compression and the bnd4 container
|
|
4
|
+
facts:
|
|
5
|
+
- id: eldenring.formats.game-data-lives-in-hashed-dvdbnd-archives
|
|
6
|
+
claim: Everything the game ships lives in paired .bhd/.bdt "dvdbnd" archives — Data0-3 and sd/sd in
|
|
7
|
+
Elden Ring's Game folder. The .bhd holds an encrypted table of file offsets keyed by a hash of
|
|
8
|
+
the file's path, and the .bdt holds the bytes. There is no filename table, so an archive
|
|
9
|
+
cannot be enumerated without a community dictionary.
|
|
10
|
+
status: community
|
|
11
|
+
source: http://soulsmodding.wikidot.com/game-engine-file-formats §"DVDBND archives" ("all the Souls
|
|
12
|
+
games on PC have all their game files inside giant so-called \"dvdbnd\" archives, which are
|
|
13
|
+
the bdt and bhd files... The bhd files are encrypted and contain the file lists and offsets
|
|
14
|
+
for each of the game files, and the bdt files contain all the game files... the file names are
|
|
15
|
+
hashed"); http://soulsmodding.wikidot.com/format:main ("BDT, BHT — dvdbnd archives containing
|
|
16
|
+
nearly all game data")
|
|
17
|
+
tags:
|
|
18
|
+
- dvdbnd
|
|
19
|
+
- bhd
|
|
20
|
+
- bdt
|
|
21
|
+
- archive
|
|
22
|
+
- hash
|
|
23
|
+
- dictionary
|
|
24
|
+
- vanilla-index
|
|
25
|
+
detail: 'This is why UXM Selective Unpack ships and maintains an "EldenRingDictionary" of known
|
|
26
|
+
paths and why its changelog is a running list of newly discovered files per patch. For
|
|
27
|
+
ModWright it means a vanilla index cannot be built by walking the archives the way
|
|
28
|
+
`build_index` walks a Cyberpunk archive: it needs either the unpacked loose-file tree or a
|
|
29
|
+
tool that already carries the dictionary.'
|
|
30
|
+
- id: eldenring.formats.dcx-is-the-outer-compression-wrapper
|
|
31
|
+
claim: "A `.dcx` suffix is a generic compression wrapper, not a content type — the real format is
|
|
32
|
+
whatever the inner name says (`.anibnd.dcx`, `.mapbnd.dcx`, `.msgbnd.dcx`). The wrapper's
|
|
33
|
+
magic is the four ASCII bytes `DCX\\0` at offset 0 and a second four-byte tag at 0x04 selects
|
|
34
|
+
the codec: DFLT (zlib), EDGE, KRAK (Oodle Kraken) or ZSTD."
|
|
35
|
+
status: community
|
|
36
|
+
source: https://github.com/JKAnderson/SoulsFormats/blob/master/SoulsFormats/Formats/DCX.cs (`return
|
|
37
|
+
magic == "DCP\0" || magic == "DCX\0";` then the format switch on "DFLT"/"EDGE"/"KRAK"/"ZSTD";
|
|
38
|
+
`DecompressDCXKRAK` opens with `br.AssertASCII("DCX\0"); br.AssertInt32(0x11000);`);
|
|
39
|
+
http://soulsmodding.wikidot.com/game-engine-file-formats §"DCX and BND files" ("DCX files are
|
|
40
|
+
compressed files, and use EDGE, DEFLATE, or Oodle depending on the game")
|
|
41
|
+
tags:
|
|
42
|
+
- dcx
|
|
43
|
+
- compression
|
|
44
|
+
- oodle
|
|
45
|
+
- kraken
|
|
46
|
+
- zstd
|
|
47
|
+
- deflate
|
|
48
|
+
- magic
|
|
49
|
+
detail: DCX.cs's Type enum comments pin the Elden Ring cases exactly - DCX_KRAK_6 is "DCX header,
|
|
50
|
+
Oodle compression. Used in Sekiro and Elden Ring", DCX_ZSTD is "DCX header, Zstandard
|
|
51
|
+
compression. Used in Elden Ring since DLC release", and DCX_DFLT_11000_44_9_15 is the one the
|
|
52
|
+
regulation itself uses. A validator that checks a staged file's compression against what the
|
|
53
|
+
game expects for that path is therefore possible from the first four bytes plus the tag, with
|
|
54
|
+
no game install.
|
|
55
|
+
- id: eldenring.formats.bnd4-header-is-fully-published
|
|
56
|
+
claim: BND4 is the container almost every Elden Ring asset bundle unwraps to. Its header is a fixed
|
|
57
|
+
0x40 bytes beginning with the ASCII magic `BND4`, with an explicit big-endian flag byte, a
|
|
58
|
+
file count, an asserted 0x40 header size and an 8-character version string. The layout is
|
|
59
|
+
published in full in SoulsFormats' read and write paths.
|
|
60
|
+
status: community
|
|
61
|
+
source: 'https://github.com/JKAnderson/SoulsFormats/blob/master/SoulsFormats/Binder/BND4/BND4.cs
|
|
62
|
+
(`Is`: `string magic = br.GetASCII(0, 4); return magic == "BND4";`; `ReadHeader`:
|
|
63
|
+
AssertASCII("BND4"), Unk04/Unk05 booleans, three asserted zero bytes, BigEndian and
|
|
64
|
+
BitBigEndian booleans, `int fileCount = br.ReadInt32()`, `br.AssertInt64(0x40) // Header
|
|
65
|
+
size`, `bnd.Version = br.ReadFixStr(8)`, fileHeaderSize, headers end, Unicode flag)'
|
|
66
|
+
tags:
|
|
67
|
+
- bnd4
|
|
68
|
+
- binder
|
|
69
|
+
- header
|
|
70
|
+
- magic
|
|
71
|
+
- synthetic-fixture
|
|
72
|
+
- byte-layout
|
|
73
|
+
detail: "This settles the question of whether ModWright can build a synthetic BND4 or DCX fixture
|
|
74
|
+
byte by byte without owning the game: it can. Every DCX header field is an asserted constant,
|
|
75
|
+
and BND4's header and per-entry layout have matching read/write implementations to copy from.
|
|
76
|
+
The one exception is a KRAK payload, which needs the non-redistributable Oodle DLL — a
|
|
77
|
+
synthetic fixture should use DFLT (plain zlib) or ZSTD instead."
|
|
78
|
+
- id: eldenring.formats.wiki-has-no-byte-layouts-for-binders
|
|
79
|
+
claim: The community wiki documents no byte-level layout for DCX, BND, BND4, BHD5/BDT, PARAM,
|
|
80
|
+
PARAMDEF, MSB, FLVER, TPF or HKX. Its format index is one-line descriptions that defer to
|
|
81
|
+
SoulsFormats. Any format claim needing offsets must cite the C# implementation, not the wiki.
|
|
82
|
+
status: community
|
|
83
|
+
source: http://soulsmodding.wikidot.com/format:main ("Many of the proprietary FromSoftware formats
|
|
84
|
+
are accessible in SoulsFormats for programmatic browsing or editing and SoulsTemplates for hex
|
|
85
|
+
browsing. See also the SoulsFormats format summary for even more obscure formats and usage
|
|
86
|
+
details."); the site's own page index (http://soulsmodding.wikidot.com/system:list-all-pages)
|
|
87
|
+
contains only format:main, :emevd, :esd, :ffx, :fmg, :fxr, :sfx, :sl2, :tae and :evd —
|
|
88
|
+
http://soulsmodding.wikidot.com/format:dcx answers "The page format:dcx you want to access
|
|
89
|
+
does not exist."
|
|
90
|
+
tags:
|
|
91
|
+
- wiki
|
|
92
|
+
- documentation
|
|
93
|
+
- gap
|
|
94
|
+
- souls-formats
|
|
95
|
+
- provenance
|
|
96
|
+
detail: The single exception is format:sl2, which carries real C structs for the Dark Souls
|
|
97
|
+
Remastered save file — and those are DSR's, not Elden Ring's. Treat the wiki as a tool index
|
|
98
|
+
and a tutorial index; treat SoulsFormats as the format specification.
|
|
99
|
+
- id: eldenring.formats.the-unpacked-tree-is-a-fixed-directory-vocabulary
|
|
100
|
+
claim: An unpacked Elden Ring tree uses a fixed, documented top-level vocabulary — chr/, obj/,
|
|
101
|
+
parts/, event/, map/, menu/, msg/, mtd/, param/, remo/, script/, sfx/ — and a mod package must
|
|
102
|
+
reproduce whichever of those paths it overrides, exactly.
|
|
103
|
+
status: community
|
|
104
|
+
source: "http://soulsmodding.wikidot.com/game-engine-file-formats §\"Game directory structure\"
|
|
105
|
+
(per-directory descriptions: chr/ \"Archives for characters and all their models and
|
|
106
|
+
animations\"; parts/ \"the models, textures, and animations for the weapons and armor\"; map/
|
|
107
|
+
\"Inside the MapStudio directory are msb files for each map, which defines the layouts and
|
|
108
|
+
placements of everything\"; msg/ \"all the text and dialogue for the game and all the
|
|
109
|
+
translations\"; script/ \"AI scripts are written in Lua and compiled... NPC scripts... use
|
|
110
|
+
From's proprietary state machine format\")"
|
|
111
|
+
tags:
|
|
112
|
+
- layout
|
|
113
|
+
- directories
|
|
114
|
+
- package
|
|
115
|
+
- overlay
|
|
116
|
+
- paths
|
|
117
|
+
detail: "Mod Engine 2's own config states the same requirement from the loader side — \"Inside each
|
|
118
|
+
specified mod directory must have the game assets in Fromsoft's asset structure. I.e. if you
|
|
119
|
+
mod parts/something.partsbnd.dcx, the modded version must be at
|
|
120
|
+
mod/parts/something.partsbnd.dcx.\" A structural validator can check a package's top-level
|
|
121
|
+
names against this vocabulary and flag a mod whose files sit one directory too deep, which is
|
|
122
|
+
a failure that otherwise produces a silently vanilla game. The wiki page is series-wide, and
|
|
123
|
+
its list is not Elden Ring's: this game has no obj/ or remo/ (its cutscenes are cutscene/) and
|
|
124
|
+
adds action/, asset/, expression/, facegen/, font/, material/, movie/, shader/ and sound/. The
|
|
125
|
+
exact set is UXM's EldenRingDictionary data0-data3 and DLC sections, which is what
|
|
126
|
+
`eldenring.package.layout` uses."
|
|
127
|
+
- id: eldenring.formats.per-domain-formats-and-their-editors
|
|
128
|
+
claim: Each authoring domain has its own format and its own editor - MSB for map entity placement,
|
|
129
|
+
EMEVD for event scripts, ESD for talk/AI state machines, HKS (compiled Lua) for character
|
|
130
|
+
behaviour, TAE inside an anibnd for animation events, FLVER for models, TPF for texture
|
|
131
|
+
archives, FMG for localized text, and PARAM for tabular game data.
|
|
132
|
+
status: community
|
|
133
|
+
source: http://soulsmodding.wikidot.com/format:main (rows for MSB "Map file containing all world
|
|
134
|
+
entity placements"; EMEVD "Event scripting files used in all games. Can be edited with
|
|
135
|
+
Darkscript3"; ESD "State machines used for character behavior, dialog trees, and enemy AI";
|
|
136
|
+
HKS "Compiled Lua script used by Havok for actor behaviors"; TAE "Defines animation events
|
|
137
|
+
such as sounds, effects, and hitboxes"; FLVER "Model format"; TPF "Texture archive containing
|
|
138
|
+
DDS files"; FMG "Generic text containers for localization"; PARAM "General-purpose game data
|
|
139
|
+
config")
|
|
140
|
+
tags:
|
|
141
|
+
- msb
|
|
142
|
+
- emevd
|
|
143
|
+
- esd
|
|
144
|
+
- hks
|
|
145
|
+
- tae
|
|
146
|
+
- flver
|
|
147
|
+
- tpf
|
|
148
|
+
- fmg
|
|
149
|
+
- param
|
|
150
|
+
- editors
|
|
151
|
+
detail: "The wiki's TAE page adds a detail worth carrying - \"vanilla TAE files have events placed
|
|
152
|
+
in 30 Hz ticks across the series but they are stored as floating point seconds values rather
|
|
153
|
+
than frame values\", which is exactly the kind of unit trap a validator can catch. Note the
|
|
154
|
+
scale difference from the games ModWright already supports: there is no single project format
|
|
155
|
+
here, so a mod is a heterogeneous set of binaries, each with its own tool."
|
|
156
|
+
- id: eldenring.formats.dcx-header-byte-layout
|
|
157
|
+
claim: 'A DCX header is big-endian and puts the same fields at the same offsets in all four codecs:
|
|
158
|
+
the four bytes "DCX" and a zero at 0x00, a variant word at 0x04, four more words to 0x17,
|
|
159
|
+
"DCS" at 0x18, the uncompressed and compressed sizes at 0x1C and 0x20, "DCP" at 0x24, the
|
|
160
|
+
four-byte codec tag at 0x28 (DFLT, EDGE, KRAK or ZSTD), 0x20 at 0x2C and the level byte at
|
|
161
|
+
0x30 (DFLT 8 or 9, EDGE 9, KRAK 6 or 9, ZSTD 21). Only the words between 0x04 and 0x17 vary by
|
|
162
|
+
codec and era: KRAK and ZSTD assert 0x11000, 0x18, 0x24, 0x44, 0x4C, DFLT allows 0x10000 or
|
|
163
|
+
0x11000 at 0x04 and 0x24/0x2C or 0x44/0x4C at 0x10, and EDGE asserts 0x10000, 0x18, 0x24, 0x24
|
|
164
|
+
with a computed word at 0x14. A file that starts "DCP" instead carries the codec tag at 0x04
|
|
165
|
+
with no DCX wrapper.'
|
|
166
|
+
status: community
|
|
167
|
+
source: SoulsFormats Formats/DCX.cs — DecompressDCXDFLT, DecompressDCXKRAK, DecompressDCXZSTD (each
|
|
168
|
+
an AssertASCII/AssertInt32 sequence), DecompressDCPDFLT and DecompressDCPEDGE; `br.BigEndian =
|
|
169
|
+
true` before the reads
|
|
170
|
+
tags:
|
|
171
|
+
- dcx
|
|
172
|
+
- header
|
|
173
|
+
- codec
|
|
174
|
+
- offset
|
|
175
|
+
- layout
|
|
176
|
+
- krak
|
|
177
|
+
- zstd
|
|
178
|
+
- dflt
|
|
179
|
+
- edge
|
|
180
|
+
detail: Reading 0x34 bytes is enough to name the codec and level, which is all `eldenring.dcx.codec`
|
|
181
|
+
needs; `src/surfaces/eldenring/dcx.ts` reads exactly that and the fixture in
|
|
182
|
+
test/unit/eldenring/tools.test.ts is byte-built from this layout with no payload.
|
|
183
|
+
related:
|
|
184
|
+
- eldenring.formats.dcx-is-the-outer-compression-wrapper
|
|
185
|
+
- id: eldenring.formats.zstd-dcx-arrived-with-the-dlc
|
|
186
|
+
claim: Elden Ring's own files are Oodle Kraken at level 6 (SoulsFormats' default DCX type for the
|
|
187
|
+
game), its regulation.bin is a DFLT level-9 variant, and ZSTD DCX files are "Used in Elden
|
|
188
|
+
Ring since DLC release" — so a ZSTD-compressed file in a mod needs a DLC-era game and a
|
|
189
|
+
pre-DLC build cannot read it.
|
|
190
|
+
status: community
|
|
191
|
+
source: SoulsFormats Formats/DCX.cs — `EldenRing = Type.DCX_KRAK_6` in DefaultType, the
|
|
192
|
+
`DCX_DFLT_11000_44_9_15` comment "Used in the ER regulation", and the `DCX_ZSTD` comment "DCX
|
|
193
|
+
header, Zstandard compression. Used in Elden Ring since DLC release."
|
|
194
|
+
tags:
|
|
195
|
+
- dcx
|
|
196
|
+
- zstd
|
|
197
|
+
- krak
|
|
198
|
+
- dlc
|
|
199
|
+
- version
|
|
200
|
+
- compat
|
|
201
|
+
- codec
|
|
202
|
+
detail: Which game version number the DLC boundary corresponds to is a marketing/App Ver question
|
|
203
|
+
(1.12 in the patch notes) and the PE version axis is unverified, so the validator reports ZSTD
|
|
204
|
+
as an info naming the DLC boundary rather than gating on a version it cannot compare.
|
|
205
|
+
related:
|
|
206
|
+
- eldenring.formats.dcx-is-the-outer-compression-wrapper
|
|
207
|
+
- id: eldenring.formats.bnd4-header-byte-offsets
|
|
208
|
+
claim: "The BND4 header's fields sit at fixed offsets: the ASCII magic at 0x00, two boolean bytes at
|
|
209
|
+
0x04-0x05, three zero bytes, the big-endian flag at 0x09, a byte at 0x0A whose inverse is the
|
|
210
|
+
bit-big-endian flag, a zero at 0x0B, the file count as an int32 at 0x0C, the header size as an
|
|
211
|
+
int64 at 0x10 (asserted 0x40), an eight-character version string at 0x18, the per-file header
|
|
212
|
+
size as an int64 at 0x20, the headers-end offset at 0x28, the Unicode flag at 0x30, the format
|
|
213
|
+
byte at 0x31, the extended byte at 0x32 (asserted 0, 1, 4 or 0x80), a zero byte and an int32
|
|
214
|
+
zero, then an int64 hash-table offset (when extended is 4) or zero. Integers follow the
|
|
215
|
+
big-endian flag."
|
|
216
|
+
status: community
|
|
217
|
+
source: SoulsFormats Binder/BND4/BND4.cs `ReadHeader` (`br.AssertASCII("BND4")`, `bnd.Unk04 =
|
|
218
|
+
br.ReadBoolean()`, ..., `bnd.BigEndian = br.ReadBoolean()`, `bnd.BitBigEndian =
|
|
219
|
+
!br.ReadBoolean()`, `int fileCount = br.ReadInt32()`, `br.AssertInt64(0x40) // Header size`,
|
|
220
|
+
`bnd.Version = br.ReadFixStr(8)`, `long fileHeaderSize = br.ReadInt64()`, `bnd.Unicode =
|
|
221
|
+
br.ReadBoolean()`, `bnd.Format = Binder.ReadFormat(...)`, `bnd.Extended = br.AssertByte(0, 1,
|
|
222
|
+
4, 0x80)`); Binder/Binder.cs `GetBND4FileHeaderSize` for the per-file size the header must
|
|
223
|
+
match
|
|
224
|
+
tags:
|
|
225
|
+
- bnd4
|
|
226
|
+
- binder
|
|
227
|
+
- header
|
|
228
|
+
- offsets
|
|
229
|
+
- byte-layout
|
|
230
|
+
- validator
|
|
231
|
+
- synthetic-fixture
|
|
232
|
+
detail: "`src/surfaces/eldenring/binders.ts` reads exactly these 0x40 bytes;
|
|
233
|
+
`eldenring.binders.bnd4-header` uses the magic, header size, extended byte and file count. The
|
|
234
|
+
format byte is reported raw: SoulsFormats decodes it against the bit-big-endian flag and the
|
|
235
|
+
rule has no need to."
|
|
236
|
+
related:
|
|
237
|
+
- eldenring.formats.bnd4-header-is-fully-published
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
game: eldenring
|
|
2
|
+
topic: launcher.me3
|
|
3
|
+
title: me3, the current elden ring mod loader
|
|
4
|
+
facts:
|
|
5
|
+
- id: eldenring.me3.supersedes-modengine2
|
|
6
|
+
claim: me3 (garyttierney/me3) is the live successor to Mod Engine 2 and the loader an Elden Ring
|
|
7
|
+
surface should target first. Mod Engine 2's own repository is archived and hands off to it,
|
|
8
|
+
and Smithbox's README recommends me3 for launching mods in all modern FromSoftware games.
|
|
9
|
+
status: community
|
|
10
|
+
source: https://github.com/soulsmods/ModEngine2 (repo banner "This repository was archived by the
|
|
11
|
+
owner on Jul 19, 2024. It is now read-only"; README "Development on Mod Engine 2 is
|
|
12
|
+
discontinued. Any future work will be done on me3"); https://github.com/vawser/Smithbox
|
|
13
|
+
README, Troubleshooting, "Save Corruption" entry ("For most modern games, it is recommended
|
|
14
|
+
that you use ME3 to launch your mods. Smithbox has support for creating a ME3 profile
|
|
15
|
+
built-in.")
|
|
16
|
+
tags:
|
|
17
|
+
- me3
|
|
18
|
+
- modengine2
|
|
19
|
+
- loader
|
|
20
|
+
- deprecation
|
|
21
|
+
- smithbox
|
|
22
|
+
detail: "Smithbox qualifies the recommendation: \"For DS1, DS2 and pre 1.15.2 DS3, you will still
|
|
23
|
+
need to use ModEngine2 or other mod launching solutions.\" Elden Ring is not in that exception
|
|
24
|
+
list. me3's latest release at the time of writing is v0.13.0, published 2026-08-11; Mod Engine
|
|
25
|
+
2's latest and last is release-2.1.0, published 2023-09-01, which predates the Shadow of the
|
|
26
|
+
Erdtree DLC."
|
|
27
|
+
- id: eldenring.me3.profile-is-a-toml-file
|
|
28
|
+
claim: A me3 mod setup is a single versioned TOML file with the extension `.me3`, holding
|
|
29
|
+
`profileVersion`, one or more `[[supports]]` blocks naming a game, `[[packages]]` blocks for
|
|
30
|
+
asset-override folders and `[[natives]]` blocks for DLL mods. This file, not a folder layout,
|
|
31
|
+
is the thing a surface must read and write.
|
|
32
|
+
status: community
|
|
33
|
+
source: https://github.com/garyttierney/me3/blob/main/docs/configuration-reference.md ("ModProfile
|
|
34
|
+
(.me3) configuration reference"; "A ModProfile configuration is a versioned TOML file that
|
|
35
|
+
tells me3 which mods to load, how to load them, and the games they support")
|
|
36
|
+
tags:
|
|
37
|
+
- me3
|
|
38
|
+
- profile
|
|
39
|
+
- toml
|
|
40
|
+
- packages
|
|
41
|
+
- natives
|
|
42
|
+
- config
|
|
43
|
+
detail: "The reference's worked example is exactly: profileVersion = \"v1\" / savefile =
|
|
44
|
+
\"MyModdedSave.sl2\" / start_online = true / [[supports]] game = \"eldenring\" / [[packages]]
|
|
45
|
+
path = 'mods/MyCoolTexturePack/' / [[natives]] path = 'mods/MyAwesomeMod.dll'. A
|
|
46
|
+
`[[packages]]` block may also carry an `id`. \"Profiles that list exactly one game can be
|
|
47
|
+
launched without specifying which game to launch.\""
|
|
48
|
+
- id: eldenring.me3.package-paths-are-relative-to-the-profile
|
|
49
|
+
claim: Every `path` in a `[[packages]]` or `[[natives]]` block is resolved relative to the location
|
|
50
|
+
of the `.me3` file itself, not to the game directory and not to the working directory. A
|
|
51
|
+
deploy or scaffold that writes a profile must compute paths against the profile's own
|
|
52
|
+
directory.
|
|
53
|
+
status: community
|
|
54
|
+
source: https://github.com/garyttierney/me3/blob/main/docs/user-guide/creating-mod-profiles.md ("Any
|
|
55
|
+
paths referenced in a mod profile (`path` in `[[packages]]` and `[[natives]]`) are relative to
|
|
56
|
+
the location of the `.me3` file itself");
|
|
57
|
+
https://github.com/garyttierney/me3/blob/main/docs/user-guide/troubleshooting.md ("Remember
|
|
58
|
+
that all `path`s for `[[packages]]` and `[[natives]]` are relative to the location of your
|
|
59
|
+
`.me3` file")
|
|
60
|
+
tags:
|
|
61
|
+
- me3
|
|
62
|
+
- profile
|
|
63
|
+
- paths
|
|
64
|
+
- relative
|
|
65
|
+
- deploy
|
|
66
|
+
detail: The troubleshooting page names this and a typo in an `id`/`packages`/`path` keyword as the
|
|
67
|
+
two most frequent setup errors, which makes both of them cheap static validator rules against
|
|
68
|
+
a `.me3` file alone.
|
|
69
|
+
- id: eldenring.me3.package-mirrors-the-dvdbnd-hierarchy
|
|
70
|
+
claim: A `[[packages]]` folder is a loose-file overlay whose internal layout must match the path the
|
|
71
|
+
file would have inside the game's DVDBND archives — e.g. a `regulation.bin` at the package
|
|
72
|
+
root, a `parts/` folder for equipment models. Nothing renames or relocates files for the
|
|
73
|
+
author.
|
|
74
|
+
status: community
|
|
75
|
+
source: https://github.com/garyttierney/me3/blob/main/docs/user-guide/creating-mod-profiles.md
|
|
76
|
+
("Place asset files (e.g. `regulation.bin`, `parts/` folders) in `mod`. Place `.dll` files in
|
|
77
|
+
`natives`."); https://github.com/garyttierney/me3 README, packages description ("a source for
|
|
78
|
+
files that override files within the existing games DVDBND archives and points to a local path
|
|
79
|
+
containing assets matching the hierarchy they would be served under in the DVDBND")
|
|
80
|
+
tags:
|
|
81
|
+
- me3
|
|
82
|
+
- packages
|
|
83
|
+
- dvdbnd
|
|
84
|
+
- overlay
|
|
85
|
+
- layout
|
|
86
|
+
detail: "This is why a file-level conflict between two Elden Ring mods is real rather than cosmetic:
|
|
87
|
+
two packages that both ship `regulation.bin` are contending for the same served path, unlike
|
|
88
|
+
two Skyrim mods that merely both contain a `config.json`."
|
|
89
|
+
- id: eldenring.me3.savefile-field-isolates-modded-saves
|
|
90
|
+
claim: A profile's optional `savefile` field renames the save the game uses, replacing the default
|
|
91
|
+
`ER0000.sl2`. me3 copies and renames an existing base save if the named file does not already
|
|
92
|
+
exist. The save directory itself is unchanged.
|
|
93
|
+
status: community
|
|
94
|
+
source: https://github.com/garyttierney/me3/blob/main/docs/configuration-reference.md ("This
|
|
95
|
+
optional field specifies the file name of the savefile the game will use instead of the
|
|
96
|
+
default one (e.g. `ER0000.sl2` in Elden Ring). It's extremely handy for compartmentalizing
|
|
97
|
+
modded content to avoid save corruption and multiplayer bans. If a file with that name does
|
|
98
|
+
not already exist, me3 copies and renames an existing base savefile. The default save
|
|
99
|
+
directory is unchanged.")
|
|
100
|
+
tags:
|
|
101
|
+
- me3
|
|
102
|
+
- savefile
|
|
103
|
+
- saves
|
|
104
|
+
- ban
|
|
105
|
+
- isolation
|
|
106
|
+
- safety
|
|
107
|
+
detail: This is the first-party version of the community convention Seamless Co-op established with
|
|
108
|
+
its `.co2` extension. For ModWright it means a modded-play profile can be made non-destructive
|
|
109
|
+
to a real save purely from the profile file, with no filesystem surgery — a precondition for
|
|
110
|
+
any attended test run.
|
|
111
|
+
- id: eldenring.me3.blocks-matchmaking-by-default
|
|
112
|
+
claim: me3 prevents the game from reaching the official multiplayer matchmaking servers unless a
|
|
113
|
+
profile sets `start_online = true`. The flag exists for private-server mods and is explicitly
|
|
114
|
+
not needed for Seamless Co-op.
|
|
115
|
+
status: community
|
|
116
|
+
source: https://github.com/garyttierney/me3/blob/main/docs/configuration-reference.md ("By default,
|
|
117
|
+
me3 prevents the game from connecting to the official multiplayer matchmaking servers. This
|
|
118
|
+
functionality can be reenabled for use with private server mods like Waygate and DS3OS (it is
|
|
119
|
+
*not* needed for Seamless Co-op).")
|
|
120
|
+
tags:
|
|
121
|
+
- me3
|
|
122
|
+
- online
|
|
123
|
+
- matchmaking
|
|
124
|
+
- ban
|
|
125
|
+
- start-online
|
|
126
|
+
- safety
|
|
127
|
+
detail: me3's own CLI help for the flag calls it a ban risk directly — "Re-enable online
|
|
128
|
+
matchmaking? (ban risk) ... Supported games are blocked from matchmaking servers by default to
|
|
129
|
+
prevent accidental online play with invalid (modded) data"
|
|
130
|
+
(crates/cli/src/commands/profile.rs). A compat rule should treat `start_online = true` on a
|
|
131
|
+
profile with any package as a warning, not a block.
|
|
132
|
+
- id: eldenring.me3.cli-and-profile-locations
|
|
133
|
+
claim: me3 ships a real command-line launcher — `me3 launch -p <profile>` — plus `me3 info`, `me3
|
|
134
|
+
profile create|list|show`, and `--skip-steam-init` / `--exe-path` for a non-Steam copy.
|
|
135
|
+
Default profiles live under %LOCALAPPDATA%\garyttierney\me3\config\profiles on Windows and the
|
|
136
|
+
global config is me3.toml in the sibling config directory.
|
|
137
|
+
status: community
|
|
138
|
+
source: https://github.com/garyttierney/me3/blob/main/docs/user-guide/installation.md ("me3 launch
|
|
139
|
+
-p eldenring-default"; "See `me3 launch --help`");
|
|
140
|
+
https://github.com/garyttierney/me3/blob/main/docs/user-guide/faq.md ("The default mod profile
|
|
141
|
+
folders are managed under `$HOME/.config/me3/profiles` on Linux and
|
|
142
|
+
`%LOCALAPPDATA%\\garyttierney\\me3\\config\\profiles` on Windows"; "me3 launch
|
|
143
|
+
--skip-steam-init --exe-path=\"C:/game-archive/eldenring.exe\""); command list from
|
|
144
|
+
crates/cli/src/main.rs
|
|
145
|
+
tags:
|
|
146
|
+
- me3
|
|
147
|
+
- cli
|
|
148
|
+
- unattended
|
|
149
|
+
- profile-dir
|
|
150
|
+
- toolchain
|
|
151
|
+
- locator
|
|
152
|
+
detail: 'This is the piece Mod Engine 2 never had in a scriptable form and the reason an Elden Ring
|
|
153
|
+
toolchain spec is worth writing: launching a specific profile is a single non-interactive
|
|
154
|
+
command. The installer "will create a set of empty profiles for ELDEN RING by default", so
|
|
155
|
+
`eldenring-default` is a profile name that exists on a fresh install.'
|
|
156
|
+
- id: eldenring.me3.log-is-per-profile-and-rotates-at-five
|
|
157
|
+
claim: me3 writes one timestamped log file per launch at <data dir>/logs/<profile
|
|
158
|
+
name>/<YYYY-MM-DD_HH-MM-SS>.log and deletes the oldest once five already exist. A log source
|
|
159
|
+
for me3 must therefore be a glob over a per-profile directory, not a single fixed path.
|
|
160
|
+
status: inferred
|
|
161
|
+
source: 'Read from source: https://github.com/garyttierney/me3/blob/main/crates/cli/src/db/logs.rs
|
|
162
|
+
(`retention: 5`; `self.base_dir.join(profile_name)`; `now.format("%Y-%m-%d_%H-%M-%S")`;
|
|
163
|
+
`profile_log_folder.join(format!("{log_file_suffix}.log"))`) and crates/cli/src/config.rs
|
|
164
|
+
(`self.known_dirs.data_dir().join("logs")`)'
|
|
165
|
+
tags:
|
|
166
|
+
- me3
|
|
167
|
+
- logs
|
|
168
|
+
- triage
|
|
169
|
+
- rotation
|
|
170
|
+
- log-source
|
|
171
|
+
detail: The CLI first logs into a temporary file (`tempfile::NamedTempFile` ... `.keep()`) and
|
|
172
|
+
copies it to the per-profile log only inside `launch` (crates/cli/src/commands/launch.rs, `let
|
|
173
|
+
log_file_path = db.logs.create_log_file(...)` then `std::fs::copy(tmp_log_file_path,
|
|
174
|
+
&log_file_path)`); crates/cli/src/main.rs ends with `let _ =
|
|
175
|
+
std::fs::remove_file(tmp_log_file_path)`. A command other than `launch` therefore leaves no
|
|
176
|
+
log behind at all. The Windows data directory is not stated in the docs — only the config
|
|
177
|
+
directory is — so the concrete parent of `logs/` still needs confirming on a machine that has
|
|
178
|
+
me3 installed.
|
|
179
|
+
- id: eldenring.me3.profile-schema-fixes-version-games-and-keys
|
|
180
|
+
claim: "me3 publishes a JSON schema for the .me3 profile that fixes what a validator can check
|
|
181
|
+
without the game: profileVersion is the constant \"v1\" and is required; a [[supports]].game
|
|
182
|
+
is one of darksouls3/ds3, sekiro/sdt, eldenring/er/elden-ring, armoredcore6/ac6,
|
|
183
|
+
nightreign/nr/nightrein; a [[packages]] block has id, enabled, path, load_after, load_before;
|
|
184
|
+
a [[natives]] block has path, optional, enabled, load_before, load_after, initializer,
|
|
185
|
+
finalizer, load_early; a load_after/ load_before entry is { id, optional }; and the profile's
|
|
186
|
+
other top-level keys are savefile, start_online, disable_arxan, mem_patch, mem_patch_heap_size
|
|
187
|
+
and debug_properties."
|
|
188
|
+
status: community
|
|
189
|
+
source: 'https://github.com/garyttierney/me3/blob/main/schemas/mod-profile.json (read 2026-09-11):
|
|
190
|
+
`"profileVersion": { "type": "string", "const": "v1" }`, the `Game` oneOf with each enum, and
|
|
191
|
+
the Package/Native/Dependent property lists; crates/mod-protocol/src/game.rs
|
|
192
|
+
`possible_names()` for the aliases'
|
|
193
|
+
tags:
|
|
194
|
+
- me3
|
|
195
|
+
- profile
|
|
196
|
+
- schema
|
|
197
|
+
- profileversion
|
|
198
|
+
- game
|
|
199
|
+
- ids
|
|
200
|
+
- keys
|
|
201
|
+
- validator
|
|
202
|
+
detail: "This is the basis of the six `eldenring.me3.*` rules: a key outside those lists is a typo
|
|
203
|
+
me3 ignores (the docs call keyword typos a common failure), and a load_after id that names no
|
|
204
|
+
entry is a silent no-op."
|
|
205
|
+
related:
|
|
206
|
+
- eldenring.me3.profile-is-a-toml-file
|
|
207
|
+
- eldenring.me3.package-paths-are-relative-to-the-profile
|
|
208
|
+
- id: eldenring.me3.info-prints-the-logs-directory
|
|
209
|
+
claim: "`me3 info` prints the profile directory and the logs directory as \"Profile directory\" and
|
|
210
|
+
\"Logs directory\" lines, then the me3.toml search paths, the installation status and prefix
|
|
211
|
+
(Windows), and whether Steam was found; `me3 --version` prints `me3 <semver>` (clap's version
|
|
212
|
+
flag on a command named me3)."
|
|
213
|
+
status: community
|
|
214
|
+
source: crates/cli/src/commands/info.rs — `output.property("Profile directory", ...)`,
|
|
215
|
+
`output.property("Logs directory", format_path(config.log_dir()))`; crates/cli/ src/main.rs
|
|
216
|
+
`#[command(name = "me3", version, ...)]`; crates/cli/src/config.rs `log_dir()` =
|
|
217
|
+
`known_dirs.data_dir().join("logs")`
|
|
218
|
+
tags:
|
|
219
|
+
- me3
|
|
220
|
+
- cli
|
|
221
|
+
- info
|
|
222
|
+
- version
|
|
223
|
+
- logs
|
|
224
|
+
- directory
|
|
225
|
+
- toolchain
|
|
226
|
+
detail: So the me3 log location the loader-log research left open is one command away on any machine
|
|
227
|
+
with me3 installed, without reading the Rust source; the Windows default data directory itself
|
|
228
|
+
is still not sourced from disk.
|
|
229
|
+
related:
|
|
230
|
+
- eldenring.me3.log-is-per-profile-and-rotates-at-five
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
game: eldenring
|
|
2
|
+
topic: launcher.modengine2
|
|
3
|
+
title: mod engine 2, the archived predecessor still on disk everywhere
|
|
4
|
+
facts:
|
|
5
|
+
- id: eldenring.modengine2.archived-and-predates-the-dlc
|
|
6
|
+
claim: Mod Engine 2 is discontinued. Its last release, release-2.1.0, is dated 2023-09-01 and the
|
|
7
|
+
repository was archived 2024-07-19 — both before the Shadow of the Erdtree DLC. Any Elden Ring
|
|
8
|
+
install still using it is pinned to an old game build, so a compat rule should surface its
|
|
9
|
+
presence rather than treat it as current.
|
|
10
|
+
status: community
|
|
11
|
+
source: https://github.com/soulsmods/ModEngine2 (archive banner dated Jul 19, 2024; README
|
|
12
|
+
"Development on Mod Engine 2 is discontinued. Any future work will be done on me3");
|
|
13
|
+
https://github.com/soulsmods/ModEngine2/releases (release-2.1.0, published 2023-09-01, is the
|
|
14
|
+
only non-prerelease; preview4 2022-08-26 and preview3 2022-03-31 are the others)
|
|
15
|
+
tags:
|
|
16
|
+
- modengine2
|
|
17
|
+
- deprecation
|
|
18
|
+
- compat
|
|
19
|
+
- version
|
|
20
|
+
- dlc
|
|
21
|
+
detail: 'The build still shipping in its installer calls itself a preview: installer/dist/README.txt
|
|
22
|
+
opens "Mod Engine 2 Preview release: This is a preview release of Mod Engine 2 for Elden Ring
|
|
23
|
+
and Armored Core 6." A locally installed copy reports itself in its own log as "ModEngine
|
|
24
|
+
version 2.1.0-0924ab36f1311bf84e7e626740b4bf2c0d54909a initializing for Elden Ring", i.e.
|
|
25
|
+
version plus the exact commit — a clean version-detection line for a compat surface that has
|
|
26
|
+
to report a Mod Engine 2 install at all.'
|
|
27
|
+
- id: eldenring.modengine2.first-enabled-mod-wins
|
|
28
|
+
claim: When two Mod Engine 2 mod folders provide the same relative path, the first enabled entry in
|
|
29
|
+
the config's `mods` array wins outright. There is no merging of any kind, including for
|
|
30
|
+
regulation.bin.
|
|
31
|
+
status: community
|
|
32
|
+
source: https://github.com/soulsmods/ModEngine2/blob/main/installer/dist/config_eldenring.toml
|
|
33
|
+
("List of directories that contain modded files in order of prioritization"; "Note that
|
|
34
|
+
modengine 2 currently has no way to resolve conflicting files including regulation.bin, and
|
|
35
|
+
thus the mod with the highest priority will have the modded file be loaded in the case of
|
|
36
|
+
conflict. Some support for merging of params and potentially other assets is considered for a
|
|
37
|
+
future release.")
|
|
38
|
+
tags:
|
|
39
|
+
- modengine2
|
|
40
|
+
- conflict
|
|
41
|
+
- load-order
|
|
42
|
+
- regulation
|
|
43
|
+
- merge
|
|
44
|
+
- override
|
|
45
|
+
detail: Corroborated by the README's own hedge on concurrent mods — "this is still restricted to
|
|
46
|
+
mods that don't replace conflicting files" — and by src/modengine/ext/mod_loader/, which
|
|
47
|
+
pushes enabled roots in array order and returns on the first root where the path exists. This
|
|
48
|
+
single sentence is the whole reason an Elden Ring surface's `mod/` root must be `merged`, not
|
|
49
|
+
`isolated`, and why regulation.bin is the central cross-mod problem for this game.
|
|
50
|
+
- id: eldenring.modengine2.config-keys
|
|
51
|
+
claim: config_eldenring.toml carries `[modengine] debug` (spawns a debug console), `[modengine]
|
|
52
|
+
external_dlls` (DLL mods loaded into the game), `[extension.mod_loader] enabled` and
|
|
53
|
+
`loose_params`, a `mods` list of `{ enabled, name, path }` entries, and
|
|
54
|
+
`[extension.scylla_hide] enabled`. `loose_params` is explicitly not supported for Elden Ring.
|
|
55
|
+
status: community
|
|
56
|
+
source: https://github.com/soulsmods/ModEngine2/blob/main/installer/dist/config_eldenring.toml
|
|
57
|
+
(comments "If set to true the debug console will appear while the game is running"; "List of
|
|
58
|
+
files that will be loaded into the game as DLL mods."; "Not currently supported for Elden
|
|
59
|
+
Ring" above `loose_params = false`)
|
|
60
|
+
tags:
|
|
61
|
+
- modengine2
|
|
62
|
+
- config
|
|
63
|
+
- toml
|
|
64
|
+
- loose-params
|
|
65
|
+
- external-dlls
|
|
66
|
+
- scyllahide
|
|
67
|
+
detail: A locally installed copy's file uses the table-array spelling
|
|
68
|
+
`[[extension.mod_loader.mods]]` with one block per mod rather than the README's inline `mods =
|
|
69
|
+
[ { ... } ]` array; both parse to the same TOML value, so a parser must accept either. An
|
|
70
|
+
absolute path in `external_dlls` needs doubled backslashes, and a path with no drive specifier
|
|
71
|
+
is resolved relative to the launcher, not the game.
|
|
72
|
+
- id: eldenring.modengine2.launches-the-real-exe-and-bypasses-eac
|
|
73
|
+
claim: Mod Engine 2 launches Game/eldenring.exe directly rather than start_protected_game.exe, which
|
|
74
|
+
is the Easy Anti-Cheat shim Steam normally starts. Modded play therefore runs with EAC never
|
|
75
|
+
loaded, and is offline-only.
|
|
76
|
+
status: community
|
|
77
|
+
source: https://github.com/soulsmods/ModEngine2/blob/main/installer/dist/README.txt ("double-click
|
|
78
|
+
\"launchmod_eldenring.bat\" and the game will automatically be launched with Mod Engine 2
|
|
79
|
+
injected. This includes the game launching with EAC disabled so you can play with mods offline
|
|
80
|
+
with no fear of being banned."; and, on the rename trick, "You can also rename the launcher to
|
|
81
|
+
\"start_protected_game.exe\" (after backing up the existing one) and have Steam automatically
|
|
82
|
+
launch with your mod, though game updates will restore the existing exe and overwrite the Mod
|
|
83
|
+
Engine 2 launcher if you do so."); launcher target table in launcher/launcher.cpp mapping
|
|
84
|
+
ELDEN_RING to app id 1245620 and "Game/eldenring.exe"
|
|
85
|
+
tags:
|
|
86
|
+
- modengine2
|
|
87
|
+
- eac
|
|
88
|
+
- anticheat
|
|
89
|
+
- offline
|
|
90
|
+
- launch
|
|
91
|
+
- ban
|
|
92
|
+
detail: "There is no `-eac` flag: the launcher's whole option set is -t/--launch-target,
|
|
93
|
+
-p/--game-path, -c/--config, -s/--suspend and --modengine-dll. \"EAC disabled\" is a
|
|
94
|
+
consequence of which executable is started, not a switch. The shipped batch file is a single
|
|
95
|
+
line, `.\\modengine2_launcher.exe -t er -c .\\config_eldenring.toml`. Because running the game
|
|
96
|
+
from Steam still starts the vanilla instance, an install can hold both a modded and an
|
|
97
|
+
unmodded launch path at once."
|
|
98
|
+
- id: eldenring.modengine2.log-file-is-dated-not-fixed
|
|
99
|
+
claim: Mod Engine 2 logs to a daily-rotating file under its own `logs/` directory. The file on disk
|
|
100
|
+
is named modengine_<YYYY-MM-DD>.log, so a log source must declare a glob or candidate list
|
|
101
|
+
rather than one fixed filename.
|
|
102
|
+
status: community
|
|
103
|
+
source: src/modengine/main.cpp (`auto logs_path = modengine_path / "logs";`) and
|
|
104
|
+
src/modengine/logging.cpp (`daily_file_sink_mt` over `path / "modengine.log"`, rotating at
|
|
105
|
+
00:30 with 5 files retained) at https://github.com/soulsmods/ModEngine2; filename confirmed
|
|
106
|
+
against the install on this machine, which holds modengine2\logs\modengine_2026-03-07.log
|
|
107
|
+
tags:
|
|
108
|
+
- modengine2
|
|
109
|
+
- logs
|
|
110
|
+
- triage
|
|
111
|
+
- rotation
|
|
112
|
+
- log-source
|
|
113
|
+
detail: spdlog's daily sink appends the date to the base name, which is why the configured
|
|
114
|
+
"modengine.log" appears on disk as "modengine_2026-03-07.log". Useful lines seen in that real
|
|
115
|
+
log, each a candidate triage signature — an [info] banner "ModEngine version <ver>-<commit>
|
|
116
|
+
initializing for Elden Ring"; one "Installing mod location mod\\<name>" plus "Resolved mod
|
|
117
|
+
path to <abs path>" pair per enabled mod, in priority order; "Applied 3 hooks"; and, for a DLL
|
|
118
|
+
mod that failed to load, an [error] line "Failed to load DLL <absolute path>" that the game
|
|
119
|
+
otherwise reports nowhere.
|