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.
Files changed (455) hide show
  1. package/LICENSE +35 -0
  2. package/README.md +212 -0
  3. package/assets/claude/agents/mw-explore.md +46 -0
  4. package/assets/claude/agents/mw-fixture.md +33 -0
  5. package/assets/claude/agents/mw-rule-author.md +51 -0
  6. package/assets/claude/agents/mw-scaffold-author.md +48 -0
  7. package/assets/claude/skills/mw-author.md +59 -0
  8. package/assets/claude/skills/mw-new-item.md +51 -0
  9. package/assets/claude/skills/mw-new-spell.md +50 -0
  10. package/assets/claude/skills/mw-scaffold.md +59 -0
  11. package/assets/claude/skills/mw-ship.md +57 -0
  12. package/assets/claude/skills/mw-validate.md +51 -0
  13. package/assets/claude/skills/mw-verify.md +59 -0
  14. package/assets/nivalisnights/extract_resources.py +177 -0
  15. package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Config.json +5 -0
  16. package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/BootstrapClient.lua +55 -0
  17. package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/BootstrapServer.lua +81 -0
  18. package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/ModWrightBridge/Log.lua +96 -0
  19. package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/ModWrightBridge/Probes.lua +1038 -0
  20. package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/ModWrightBridge/ProbesClient.lua +74 -0
  21. package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/ModWrightBridge/Protocol.lua +985 -0
  22. package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/ModWrightBridge/Watch.lua +175 -0
  23. package/bridges/bg3-se/Mods/ModWrightBridge/meta.lsx +45 -0
  24. package/bridges/bg3-se/README.md +99 -0
  25. package/bridges/bg3-se/bridge.json +68 -0
  26. package/bridges/cp2077-cet/ModWrightBridge/init.lua +375 -0
  27. package/bridges/cp2077-cet/ModWrightBridge/probes.lua +1104 -0
  28. package/bridges/cp2077-cet/ModWrightBridge/protocol.lua +1306 -0
  29. package/bridges/cp2077-cet/README.md +165 -0
  30. package/bridges/cp2077-cet/bridge.json +53 -0
  31. package/dist/core/bridge/arm.js +175 -0
  32. package/dist/core/bridge/cet-console.js +26 -0
  33. package/dist/core/bridge/cet-log.js +362 -0
  34. package/dist/core/bridge/index.js +11 -0
  35. package/dist/core/bridge/locate.js +35 -0
  36. package/dist/core/bridge/paths.js +34 -0
  37. package/dist/core/bridge/pending.js +89 -0
  38. package/dist/core/bridge/poll.js +155 -0
  39. package/dist/core/bridge/stage.js +100 -0
  40. package/dist/core/bridge/status.js +97 -0
  41. package/dist/core/bridge/types.js +145 -0
  42. package/dist/core/bridge/validate.js +107 -0
  43. package/dist/core/build/index.js +6 -0
  44. package/dist/core/build/manifest.js +47 -0
  45. package/dist/core/build/paths.js +32 -0
  46. package/dist/core/build/run.js +342 -0
  47. package/dist/core/build/stage.js +265 -0
  48. package/dist/core/build/steps/bg3.js +129 -0
  49. package/dist/core/build/steps/core.js +195 -0
  50. package/dist/core/build/steps/cyberpunk.js +95 -0
  51. package/dist/core/build/steps/listing.js +35 -0
  52. package/dist/core/build/types.js +13 -0
  53. package/dist/core/build/zip.js +148 -0
  54. package/dist/core/compat/check.js +113 -0
  55. package/dist/core/compat/pe.js +220 -0
  56. package/dist/core/compat/types.js +1 -0
  57. package/dist/core/compat/version.js +70 -0
  58. package/dist/core/deploy/guards.js +292 -0
  59. package/dist/core/deploy/index.js +5 -0
  60. package/dist/core/deploy/plan.js +696 -0
  61. package/dist/core/deploy/reload-apply.js +361 -0
  62. package/dist/core/deploy/reload.js +358 -0
  63. package/dist/core/deploy/sources.js +169 -0
  64. package/dist/core/deploy/types.js +1 -0
  65. package/dist/core/epic.js +54 -0
  66. package/dist/core/fsutil.js +191 -0
  67. package/dist/core/home.js +70 -0
  68. package/dist/core/knowledge/facts.js +229 -0
  69. package/dist/core/knowledge/index.js +4 -0
  70. package/dist/core/knowledge/search.js +112 -0
  71. package/dist/core/knowledge/store.js +123 -0
  72. package/dist/core/knowledge/types.js +1 -0
  73. package/dist/core/ledger/check.js +42 -0
  74. package/dist/core/ledger/hooks.js +80 -0
  75. package/dist/core/ledger/index.js +7 -0
  76. package/dist/core/ledger/query.js +17 -0
  77. package/dist/core/ledger/record.js +84 -0
  78. package/dist/core/ledger/status.js +53 -0
  79. package/dist/core/ledger/store.js +98 -0
  80. package/dist/core/ledger/types.js +108 -0
  81. package/dist/core/logs/index.js +4 -0
  82. package/dist/core/logs/registry.js +50 -0
  83. package/dist/core/logs/scan.js +195 -0
  84. package/dist/core/logs/triage.js +160 -0
  85. package/dist/core/logs/types.js +1 -0
  86. package/dist/core/lsx.js +10 -0
  87. package/dist/core/lz4.js +66 -0
  88. package/dist/core/mods.js +229 -0
  89. package/dist/core/process.js +49 -0
  90. package/dist/core/project/build-steps.js +83 -0
  91. package/dist/core/project/describe.js +74 -0
  92. package/dist/core/project/index.js +5 -0
  93. package/dist/core/project/load.js +146 -0
  94. package/dist/core/project/schema.js +264 -0
  95. package/dist/core/project/types.js +3 -0
  96. package/dist/core/prompts.js +72 -0
  97. package/dist/core/registry.js +35 -0
  98. package/dist/core/safety/backup.js +206 -0
  99. package/dist/core/safety/execute.js +188 -0
  100. package/dist/core/safety/index.js +5 -0
  101. package/dist/core/safety/plan.js +122 -0
  102. package/dist/core/safety/restore.js +172 -0
  103. package/dist/core/safety/types.js +1 -0
  104. package/dist/core/scaffold/bootstrap.js +7 -0
  105. package/dist/core/scaffold/catalog.js +28 -0
  106. package/dist/core/scaffold/claude-assets.js +271 -0
  107. package/dist/core/scaffold/collisions.js +64 -0
  108. package/dist/core/scaffold/emit.js +356 -0
  109. package/dist/core/scaffold/engine.js +680 -0
  110. package/dist/core/scaffold/ids.js +78 -0
  111. package/dist/core/scaffold/index.js +10 -0
  112. package/dist/core/scaffold/jsonpath.js +121 -0
  113. package/dist/core/scaffold/load.js +81 -0
  114. package/dist/core/scaffold/render.js +85 -0
  115. package/dist/core/scaffold/sequence.js +396 -0
  116. package/dist/core/scaffold/types.js +309 -0
  117. package/dist/core/steam.js +63 -0
  118. package/dist/core/surfaceutil.js +36 -0
  119. package/dist/core/testplan/check.js +67 -0
  120. package/dist/core/testplan/index.js +5 -0
  121. package/dist/core/testplan/load.js +100 -0
  122. package/dist/core/testplan/registry.js +317 -0
  123. package/dist/core/testplan/run.js +389 -0
  124. package/dist/core/testplan/types.js +82 -0
  125. package/dist/core/text/converters/bg3.js +50 -0
  126. package/dist/core/text/converters/cyberpunk.js +36 -0
  127. package/dist/core/text/converters/index.js +261 -0
  128. package/dist/core/text/diff/cr2w.js +180 -0
  129. package/dist/core/text/diff/index.js +16 -0
  130. package/dist/core/text/diff/loca.js +43 -0
  131. package/dist/core/text/diff/lsx.js +126 -0
  132. package/dist/core/text/handles.js +86 -0
  133. package/dist/core/text/index.js +6 -0
  134. package/dist/core/text/json.js +46 -0
  135. package/dist/core/text/templates/cache.js +71 -0
  136. package/dist/core/text/templates/index.js +3 -0
  137. package/dist/core/text/templates/library.js +245 -0
  138. package/dist/core/text/templates/types.js +51 -0
  139. package/dist/core/text/toolchain.js +16 -0
  140. package/dist/core/text/types.js +1 -0
  141. package/dist/core/text/validate.js +149 -0
  142. package/dist/core/text/xml.js +58 -0
  143. package/dist/core/toolchain/datafetch.js +151 -0
  144. package/dist/core/toolchain/env.js +63 -0
  145. package/dist/core/toolchain/features.js +170 -0
  146. package/dist/core/toolchain/index.js +8 -0
  147. package/dist/core/toolchain/install.js +191 -0
  148. package/dist/core/toolchain/locate.js +275 -0
  149. package/dist/core/toolchain/remember.js +84 -0
  150. package/dist/core/toolchain/run.js +318 -0
  151. package/dist/core/toolchain/specs.js +351 -0
  152. package/dist/core/toolchain/types.js +1 -0
  153. package/dist/core/types.js +1 -0
  154. package/dist/core/userconfig.js +66 -0
  155. package/dist/core/validate/context.js +139 -0
  156. package/dist/core/validate/index.js +5 -0
  157. package/dist/core/validate/registry.js +58 -0
  158. package/dist/core/validate/run.js +131 -0
  159. package/dist/core/validate/suppressions.js +91 -0
  160. package/dist/core/validate/types.js +2 -0
  161. package/dist/core/yamledit.js +51 -0
  162. package/dist/index.js +389 -0
  163. package/dist/server.js +1914 -0
  164. package/dist/surfaces/baldursgate3/compat.js +164 -0
  165. package/dist/surfaces/baldursgate3/identity.js +110 -0
  166. package/dist/surfaces/baldursgate3/index/build.js +331 -0
  167. package/dist/surfaces/baldursgate3/index/index.js +17 -0
  168. package/dist/surfaces/baldursgate3/index/info.js +40 -0
  169. package/dist/surfaces/baldursgate3/index/parsers/loca.js +41 -0
  170. package/dist/surfaces/baldursgate3/index/parsers/lsx.js +137 -0
  171. package/dist/surfaces/baldursgate3/index/parsers/stats.js +45 -0
  172. package/dist/surfaces/baldursgate3/index/parsers/treasuretable.js +57 -0
  173. package/dist/surfaces/baldursgate3/index/parsers/xmlutil.js +142 -0
  174. package/dist/surfaces/baldursgate3/index/queries.js +327 -0
  175. package/dist/surfaces/baldursgate3/index/schema.js +62 -0
  176. package/dist/surfaces/baldursgate3/index.js +3 -0
  177. package/dist/surfaces/baldursgate3/logs.js +278 -0
  178. package/dist/surfaces/baldursgate3/modsettings.js +115 -0
  179. package/dist/surfaces/baldursgate3/pak.js +153 -0
  180. package/dist/surfaces/baldursgate3/settings.js +49 -0
  181. package/dist/surfaces/baldursgate3/surface.js +232 -0
  182. package/dist/surfaces/baldursgate3/validators/bridge.js +7 -0
  183. package/dist/surfaces/baldursgate3/validators/files.js +476 -0
  184. package/dist/surfaces/baldursgate3/validators/items.js +1001 -0
  185. package/dist/surfaces/baldursgate3/validators/progression.js +734 -0
  186. package/dist/surfaces/baldursgate3/validators/stats.js +1076 -0
  187. package/dist/surfaces/baldursgate3/validators/story.js +790 -0
  188. package/dist/surfaces/baldursgate3/validators/templates.js +7 -0
  189. package/dist/surfaces/cyberpunk2077/compat.js +223 -0
  190. package/dist/surfaces/cyberpunk2077/index/build.js +231 -0
  191. package/dist/surfaces/cyberpunk2077/index/index.js +17 -0
  192. package/dist/surfaces/cyberpunk2077/index/info.js +51 -0
  193. package/dist/surfaces/cyberpunk2077/index/model.js +52 -0
  194. package/dist/surfaces/cyberpunk2077/index/parsers/tweak.js +483 -0
  195. package/dist/surfaces/cyberpunk2077/index/parsers/tweakxl-yaml.js +183 -0
  196. package/dist/surfaces/cyberpunk2077/index/queries.js +504 -0
  197. package/dist/surfaces/cyberpunk2077/index/resource.js +135 -0
  198. package/dist/surfaces/cyberpunk2077/index/schema.js +90 -0
  199. package/dist/surfaces/cyberpunk2077/index.js +3 -0
  200. package/dist/surfaces/cyberpunk2077/logs.js +742 -0
  201. package/dist/surfaces/cyberpunk2077/paths.js +12 -0
  202. package/dist/surfaces/cyberpunk2077/surface.js +218 -0
  203. package/dist/surfaces/cyberpunk2077/validators/bridge.js +7 -0
  204. package/dist/surfaces/cyberpunk2077/validators/cr2w.js +349 -0
  205. package/dist/surfaces/cyberpunk2077/validators/garments.js +1181 -0
  206. package/dist/surfaces/cyberpunk2077/validators/mesh.js +338 -0
  207. package/dist/surfaces/cyberpunk2077/validators/modsettings.js +120 -0
  208. package/dist/surfaces/cyberpunk2077/validators/packaging.js +463 -0
  209. package/dist/surfaces/cyberpunk2077/validators/red4ext.js +318 -0
  210. package/dist/surfaces/cyberpunk2077/validators/redscript.js +193 -0
  211. package/dist/surfaces/cyberpunk2077/validators/templates.js +7 -0
  212. package/dist/surfaces/cyberpunk2077/validators/tweaks.js +768 -0
  213. package/dist/surfaces/cyberpunk2077/validators/vehicles.js +531 -0
  214. package/dist/surfaces/cyberpunk2077/validators/xl.js +308 -0
  215. package/dist/surfaces/eldenring/binders.js +111 -0
  216. package/dist/surfaces/eldenring/compat.js +166 -0
  217. package/dist/surfaces/eldenring/dcx.js +49 -0
  218. package/dist/surfaces/eldenring/index.js +13 -0
  219. package/dist/surfaces/eldenring/loaders.js +132 -0
  220. package/dist/surfaces/eldenring/logs.js +67 -0
  221. package/dist/surfaces/eldenring/paramdef.js +256 -0
  222. package/dist/surfaces/eldenring/params.js +129 -0
  223. package/dist/surfaces/eldenring/surface.js +121 -0
  224. package/dist/surfaces/eldenring/tools.js +52 -0
  225. package/dist/surfaces/eldenring/validators/binders.js +193 -0
  226. package/dist/surfaces/eldenring/validators/packages.js +159 -0
  227. package/dist/surfaces/eldenring/validators/params.js +334 -0
  228. package/dist/surfaces/eldenring/validators/profiles.js +287 -0
  229. package/dist/surfaces/index.js +34 -0
  230. package/dist/surfaces/nivalisnights/compat.js +229 -0
  231. package/dist/surfaces/nivalisnights/index/build.js +310 -0
  232. package/dist/surfaces/nivalisnights/index/index.js +5 -0
  233. package/dist/surfaces/nivalisnights/index/queries.js +231 -0
  234. package/dist/surfaces/nivalisnights/index.js +4 -0
  235. package/dist/surfaces/nivalisnights/logs.js +473 -0
  236. package/dist/surfaces/nivalisnights/surface.js +195 -0
  237. package/dist/surfaces/skyrimse/archives.js +229 -0
  238. package/dist/surfaces/skyrimse/compat.js +163 -0
  239. package/dist/surfaces/skyrimse/index.js +12 -0
  240. package/dist/surfaces/skyrimse/loadorder.js +174 -0
  241. package/dist/surfaces/skyrimse/logs.js +241 -0
  242. package/dist/surfaces/skyrimse/plugins.js +149 -0
  243. package/dist/surfaces/skyrimse/records.js +94 -0
  244. package/dist/surfaces/skyrimse/surface.js +240 -0
  245. package/dist/surfaces/skyrimse/validators/archive-records.js +165 -0
  246. package/dist/surfaces/skyrimse/validators/archives.js +110 -0
  247. package/dist/surfaces/skyrimse/validators/plugins.js +374 -0
  248. package/dist/surfaces/skyrimse/validators/records.js +117 -0
  249. package/dist/surfaces/stardewvalley/compat.js +190 -0
  250. package/dist/surfaces/stardewvalley/config.js +42 -0
  251. package/dist/surfaces/stardewvalley/contentpatcher.js +203 -0
  252. package/dist/surfaces/stardewvalley/index/index.js +229 -0
  253. package/dist/surfaces/stardewvalley/index/wiki.js +190 -0
  254. package/dist/surfaces/stardewvalley/index.js +12 -0
  255. package/dist/surfaces/stardewvalley/logs.js +307 -0
  256. package/dist/surfaces/stardewvalley/mods.js +182 -0
  257. package/dist/surfaces/stardewvalley/surface.js +244 -0
  258. package/dist/surfaces/stardewvalley/validators/content.js +321 -0
  259. package/dist/surfaces/stardewvalley/validators/fields.js +147 -0
  260. package/dist/surfaces/stardewvalley/validators/loadorder.js +69 -0
  261. package/dist/surfaces/stardewvalley/validators/manifest.js +221 -0
  262. package/dist/surfaces/subnautica2/compat.js +138 -0
  263. package/dist/surfaces/subnautica2/index.js +5 -0
  264. package/dist/surfaces/subnautica2/logs.js +129 -0
  265. package/dist/surfaces/subnautica2/paks.js +173 -0
  266. package/dist/surfaces/subnautica2/surface.js +151 -0
  267. package/dist/surfaces/subnautica2/validators/packaging.js +298 -0
  268. package/dist/surfaces/valheim/compat.js +171 -0
  269. package/dist/surfaces/valheim/index/index.js +301 -0
  270. package/dist/surfaces/valheim/index/tables.js +103 -0
  271. package/dist/surfaces/valheim/index.js +11 -0
  272. package/dist/surfaces/valheim/logs.js +197 -0
  273. package/dist/surfaces/valheim/packaging.js +131 -0
  274. package/dist/surfaces/valheim/plugins.js +270 -0
  275. package/dist/surfaces/valheim/references.js +121 -0
  276. package/dist/surfaces/valheim/surface.js +223 -0
  277. package/dist/surfaces/valheim/validators/packaging.js +218 -0
  278. package/dist/surfaces/valheim/validators/plugins.js +287 -0
  279. package/dist/surfaces/valheim/validators/references.js +169 -0
  280. package/knowledge/baldursgate3/animations.gr2.yaml +166 -0
  281. package/knowledge/baldursgate3/audio.voice.yaml +182 -0
  282. package/knowledge/baldursgate3/audio.wwise.yaml +104 -0
  283. package/knowledge/baldursgate3/charactercreation.heads-hair.yaml +193 -0
  284. package/knowledge/baldursgate3/communitylibrary.shared-content.yaml +129 -0
  285. package/knowledge/baldursgate3/compatibilityframework.api.yaml +176 -0
  286. package/knowledge/baldursgate3/crash.causes.yaml +90 -0
  287. package/knowledge/baldursgate3/dialogue.dialogbank.yaml +120 -0
  288. package/knowledge/baldursgate3/dialogue.files.yaml +236 -0
  289. package/knowledge/baldursgate3/dialogue.osiris-goals.yaml +386 -0
  290. package/knowledge/baldursgate3/dialogue.yaml +122 -0
  291. package/knowledge/baldursgate3/feats.classes.yaml +164 -0
  292. package/knowledge/baldursgate3/items.cloth-physics.yaml +167 -0
  293. package/knowledge/baldursgate3/items.roottemplates.yaml +320 -0
  294. package/knowledge/baldursgate3/items.visualbank.yaml +628 -0
  295. package/knowledge/baldursgate3/journal.quests.yaml +214 -0
  296. package/knowledge/baldursgate3/loadorder.modsettings.yaml +128 -0
  297. package/knowledge/baldursgate3/localization.handles.yaml +92 -0
  298. package/knowledge/baldursgate3/misc.encoding-and-practice.yaml +111 -0
  299. package/knowledge/baldursgate3/origins.companions.yaml +144 -0
  300. package/knowledge/baldursgate3/osiris.signatures.yaml +211 -0
  301. package/knowledge/baldursgate3/packaging.meta.yaml +155 -0
  302. package/knowledge/baldursgate3/packaging.paks.yaml +79 -0
  303. package/knowledge/baldursgate3/process.launch.yaml +34 -0
  304. package/knowledge/baldursgate3/progressions.yaml +92 -0
  305. package/knowledge/baldursgate3/publishing.modio-nexus.yaml +170 -0
  306. package/knowledge/baldursgate3/publishing.toolkit-modio.yaml +135 -0
  307. package/knowledge/baldursgate3/races.progression.yaml +228 -0
  308. package/knowledge/baldursgate3/scriptextender.console.yaml +257 -0
  309. package/knowledge/baldursgate3/scriptextender.yaml +252 -0
  310. package/knowledge/baldursgate3/stats.boosts.yaml +293 -0
  311. package/knowledge/baldursgate3/stats.equipment-kits.yaml +69 -0
  312. package/knowledge/baldursgate3/stats.interrupts.yaml +45 -0
  313. package/knowledge/baldursgate3/stats.itemcombos.yaml +65 -0
  314. package/knowledge/baldursgate3/stats.spells.yaml +293 -0
  315. package/knowledge/baldursgate3/stats.weapons.yaml +210 -0
  316. package/knowledge/baldursgate3/toolchain.divine.yaml +179 -0
  317. package/knowledge/baldursgate3/toolchain.lslib-formats.yaml +242 -0
  318. package/knowledge/baldursgate3/toolkit.levels.yaml +177 -0
  319. package/knowledge/baldursgate3/ui.icons-atlas.yaml +78 -0
  320. package/knowledge/baldursgate3/ui.icons.yaml +412 -0
  321. package/knowledge/baldursgate3/ui.mcm.yaml +161 -0
  322. package/knowledge/baldursgate3/vfx.materials.yaml +174 -0
  323. package/knowledge/baldursgate3/visuals.characterfix.yaml +73 -0
  324. package/knowledge/cyberpunk2077/animations.anims.yaml +118 -0
  325. package/knowledge/cyberpunk2077/anims.archivexl.yaml +163 -0
  326. package/knowledge/cyberpunk2077/anims.authoring.yaml +579 -0
  327. package/knowledge/cyberpunk2077/anims.encoder.yaml +156 -0
  328. package/knowledge/cyberpunk2077/anims.graph.yaml +629 -0
  329. package/knowledge/cyberpunk2077/anims.method.yaml +360 -0
  330. package/knowledge/cyberpunk2077/anims.pipeline.yaml +352 -0
  331. package/knowledge/cyberpunk2077/anims.roundtrip.yaml +222 -0
  332. package/knowledge/cyberpunk2077/anims.sets.yaml +176 -0
  333. package/knowledge/cyberpunk2077/archivexl.bodytypes.yaml +149 -0
  334. package/knowledge/cyberpunk2077/archivexl.dynamic-appearances.yaml +218 -0
  335. package/knowledge/cyberpunk2077/archivexl.manifest.yaml +214 -0
  336. package/knowledge/cyberpunk2077/audio.events.yaml +168 -0
  337. package/knowledge/cyberpunk2077/audio.sounds.yaml +164 -0
  338. package/knowledge/cyberpunk2077/audio.voicesets.yaml +146 -0
  339. package/knowledge/cyberpunk2077/cet.sandbox.yaml +219 -0
  340. package/knowledge/cyberpunk2077/clothing.garments.yaml +283 -0
  341. package/knowledge/cyberpunk2077/clothing.refits.yaml +215 -0
  342. package/knowledge/cyberpunk2077/codeware.overview.yaml +111 -0
  343. package/knowledge/cyberpunk2077/codeware.systems.yaml +192 -0
  344. package/knowledge/cyberpunk2077/drones.combat.yaml +416 -0
  345. package/knowledge/cyberpunk2077/drones.control.yaml +552 -0
  346. package/knowledge/cyberpunk2077/entities.appearance.yaml +166 -0
  347. package/knowledge/cyberpunk2077/equipmentex.slots.yaml +151 -0
  348. package/knowledge/cyberpunk2077/fx.effects.yaml +246 -0
  349. package/knowledge/cyberpunk2077/fx.lights.yaml +171 -0
  350. package/knowledge/cyberpunk2077/hair.modding.yaml +145 -0
  351. package/knowledge/cyberpunk2077/items.wiring.yaml +246 -0
  352. package/knowledge/cyberpunk2077/loadorder.archives.yaml +71 -0
  353. package/knowledge/cyberpunk2077/mesh.blender.yaml +209 -0
  354. package/knowledge/cyberpunk2077/nativedb.dump.yaml +98 -0
  355. package/knowledge/cyberpunk2077/npc.appearance.yaml +275 -0
  356. package/knowledge/cyberpunk2077/npc.behaviour.yaml +128 -0
  357. package/knowledge/cyberpunk2077/npc.locomotion.yaml +490 -0
  358. package/knowledge/cyberpunk2077/packaging.deploy.yaml +175 -0
  359. package/knowledge/cyberpunk2077/packaging.variants.yaml +176 -0
  360. package/knowledge/cyberpunk2077/player.control.yaml +918 -0
  361. package/knowledge/cyberpunk2077/process.assetbuild.yaml +154 -0
  362. package/knowledge/cyberpunk2077/process.lessons.yaml +276 -0
  363. package/knowledge/cyberpunk2077/quests.minor.yaml +46 -0
  364. package/knowledge/cyberpunk2077/quests.scenes.yaml +282 -0
  365. package/knowledge/cyberpunk2077/quickhacks.tiers.yaml +41 -0
  366. package/knowledge/cyberpunk2077/red4ext.api.yaml +645 -0
  367. package/knowledge/cyberpunk2077/red4ext.plugins.yaml +124 -0
  368. package/knowledge/cyberpunk2077/redhottools.hotreload.yaml +245 -0
  369. package/knowledge/cyberpunk2077/redscript.compile-log.yaml +76 -0
  370. package/knowledge/cyberpunk2077/redscript.modules.yaml +118 -0
  371. package/knowledge/cyberpunk2077/toolchain.wolvenkit.yaml +163 -0
  372. package/knowledge/cyberpunk2077/tweakdb.loot-recipes.yaml +184 -0
  373. package/knowledge/cyberpunk2077/tweakdb.melee.yaml +352 -0
  374. package/knowledge/cyberpunk2077/tweakdb.weapons.yaml +325 -0
  375. package/knowledge/cyberpunk2077/tweakxl.hotreload.yaml +151 -0
  376. package/knowledge/cyberpunk2077/tweakxl.yaml-syntax.yaml +208 -0
  377. package/knowledge/cyberpunk2077/ui.icons.yaml +259 -0
  378. package/knowledge/cyberpunk2077/ui.inkatlas.yaml +81 -0
  379. package/knowledge/cyberpunk2077/ui.modsettings.yaml +204 -0
  380. package/knowledge/cyberpunk2077/vehicles.control.yaml +475 -0
  381. package/knowledge/cyberpunk2077/vehicles.dashboard-ui.yaml +203 -0
  382. package/knowledge/cyberpunk2077/vehicles.entities.yaml +195 -0
  383. package/knowledge/cyberpunk2077/vehicles.wiring.yaml +137 -0
  384. package/knowledge/cyberpunk2077/wolvenkit.cli.yaml +167 -0
  385. package/knowledge/cyberpunk2077/workspot.system.yaml +55 -0
  386. package/knowledge/cyberpunk2077/world.interactions.yaml +41 -0
  387. package/knowledge/cyberpunk2077/world.loot-container.yaml +167 -0
  388. package/knowledge/cyberpunk2077/world.sectors.yaml +233 -0
  389. package/knowledge/eldenring/formats.binders.yaml +237 -0
  390. package/knowledge/eldenring/launcher.me3.yaml +230 -0
  391. package/knowledge/eldenring/launcher.modengine2.yaml +119 -0
  392. package/knowledge/eldenring/params.paramdef.yaml +149 -0
  393. package/knowledge/eldenring/params.regulation.yaml +142 -0
  394. package/knowledge/eldenring/saves.online.yaml +118 -0
  395. package/knowledge/eldenring/toolchain.cli.yaml +256 -0
  396. package/knowledge/nivalisnights/modding.runtime.yaml +157 -0
  397. package/knowledge/skyrimse/archives.bsa.yaml +212 -0
  398. package/knowledge/skyrimse/install.detection.yaml +41 -0
  399. package/knowledge/skyrimse/loadorder.files.yaml +242 -0
  400. package/knowledge/skyrimse/plugins.esl.yaml +189 -0
  401. package/knowledge/skyrimse/plugins.format.yaml +224 -0
  402. package/knowledge/skyrimse/skse.runtime.yaml +283 -0
  403. package/knowledge/skyrimse/toolchain.xedit-spriggit.yaml +336 -0
  404. package/knowledge/stardewvalley/contentpatcher.format.yaml +338 -0
  405. package/knowledge/stardewvalley/distribution.channels.yaml +236 -0
  406. package/knowledge/stardewvalley/game.versions.yaml +202 -0
  407. package/knowledge/stardewvalley/install.layout.yaml +277 -0
  408. package/knowledge/stardewvalley/smapi.loader.yaml +284 -0
  409. package/knowledge/stardewvalley/smapi.logs.yaml +329 -0
  410. package/knowledge/stardewvalley/smapi.manifest.yaml +293 -0
  411. package/knowledge/stardewvalley/toolchain.build.yaml +261 -0
  412. package/knowledge/stardewvalley/wiki.dataformat.yaml +130 -0
  413. package/knowledge/subnautica2/game.build.yaml +331 -0
  414. package/knowledge/subnautica2/modding.state.yaml +210 -0
  415. package/knowledge/subnautica2/ue5.containers.yaml +72 -0
  416. package/knowledge/subnautica2/ue5.paks.yaml +203 -0
  417. package/knowledge/subnautica2/ue5.tooling.yaml +175 -0
  418. package/knowledge/subnautica2/ue5.ue4ss.yaml +203 -0
  419. package/knowledge/valheim/bepinex.loader.yaml +247 -0
  420. package/knowledge/valheim/bepinex.plugins.yaml +251 -0
  421. package/knowledge/valheim/game.versions.yaml +321 -0
  422. package/knowledge/valheim/install.layout.yaml +216 -0
  423. package/knowledge/valheim/jotunn.library.yaml +334 -0
  424. package/knowledge/valheim/thunderstore.packaging.yaml +217 -0
  425. package/knowledge/valheim/toolchain.build.yaml +111 -0
  426. package/package.json +29 -0
  427. package/scaffolds/baldursgate3/new-class-injection.yaml +148 -0
  428. package/scaffolds/baldursgate3/new-item.yaml +264 -0
  429. package/scaffolds/baldursgate3/new-mod.yaml +174 -0
  430. package/scaffolds/baldursgate3/new-passive.yaml +100 -0
  431. package/scaffolds/baldursgate3/new-project.yaml +118 -0
  432. package/scaffolds/baldursgate3/new-quest-stub.yaml +159 -0
  433. package/scaffolds/baldursgate3/new-spell.yaml +102 -0
  434. package/scaffolds/baldursgate3/new-status.yaml +119 -0
  435. package/scaffolds/baldursgate3/sequences/subclass-kit.yaml +50 -0
  436. package/scaffolds/cyberpunk2077/edit-tweak.yaml +70 -0
  437. package/scaffolds/cyberpunk2077/mesh-export-preset.yaml +170 -0
  438. package/scaffolds/cyberpunk2077/new-entity-patch.yaml +255 -0
  439. package/scaffolds/cyberpunk2077/new-garment-refit.yaml +279 -0
  440. package/scaffolds/cyberpunk2077/new-item-chain.yaml +548 -0
  441. package/scaffolds/cyberpunk2077/new-localization.yaml +130 -0
  442. package/scaffolds/cyberpunk2077/new-mod-settings.yaml +133 -0
  443. package/scaffolds/cyberpunk2077/new-player-replacer.yaml +1003 -0
  444. package/scaffolds/cyberpunk2077/new-project.yaml +157 -0
  445. package/scaffolds/cyberpunk2077/new-sector-node.yaml +156 -0
  446. package/scaffolds/cyberpunk2077/new-tweak.yaml +121 -0
  447. package/scaffolds/cyberpunk2077/new-vehicle-livery.yaml +148 -0
  448. package/scaffolds/cyberpunk2077/new-workspot-entity.yaml +177 -0
  449. package/scaffolds/cyberpunk2077/sequences/iconic-weapon.yaml +72 -0
  450. package/scaffolds/cyberpunk2077/sequences/quickhack-takeover.yaml +213 -0
  451. package/scaffolds/stardewvalley/new-cp-patch.yaml +106 -0
  452. package/scaffolds/stardewvalley/new-csharp-mod.yaml +195 -0
  453. package/scaffolds/stardewvalley/new-project.yaml +184 -0
  454. package/scaffolds/stardewvalley/sequences/content-pack.yaml +31 -0
  455. 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.