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,628 @@
1
+ game: baldursgate3
2
+ topic: items.visualbank
3
+ title: Item VisualBank / MaterialBank / TextureBank UUID chain
4
+ facts:
5
+ - id: bg3.items.visualbank.three-region-chain
6
+ claim: "An item's visual data is a three-region chain that must cross-link by UUID: a VisualBank
7
+ Resource's Objects/MaterialID must equal a MaterialBank Resource's ID, and that MaterialBank
8
+ Resource's Texture2DParameters ID must equal a TextureBank Resource's ID. All three regions
9
+ typically live in the same pair of .lsf.lsx files under
10
+ Public/<Mod>/Content/Assets/Characters/[PAK]_Armor."
11
+ status: community
12
+ source: bg3.wiki/wiki/Modding:Items §Meshes.lsx, §Materials and Texture .lsx
13
+ tags:
14
+ - items
15
+ - visualbank
16
+ - materialbank
17
+ - texturebank
18
+ - uuid
19
+ detail: '"[PAK]_Armor" is a literal bracketed folder name. The wiki: "If there is anything wrong
20
+ with the material, your item may simply refuse to show up, so it is worth double-checking
21
+ everything here." — the chain fails silently. Community confirmation of
22
+ bg3.materials.no-custom-base-material, which read the same side-by-side bank layout
23
+ (VisualBank / MaterialBank / TextureBank as regions of one merged bank file) straight out of
24
+ the Patch 8 paks.'
25
+ - id: bg3.items.visualbank.visualbank-id-links-roottemplate
26
+ claim: The VisualBank Resource's ID attribute is the UUID a RootTemplate's VisualTemplate (loot
27
+ appearance) or Equipment/VisualSet (equipped appearance) references to attach the mesh to an
28
+ item.
29
+ status: community
30
+ source: bg3.wiki/wiki/Modding:Items §Meshes.lsx ("(This UUID links up to the Roottemplate)")
31
+ tags:
32
+ - items
33
+ - visualbank
34
+ - roottemplate
35
+ - uuid
36
+ - id: bg3.items.visualbank.objectid-mesh-order-vs-lod
37
+ claim: "A VisualBank Objects node's ObjectID suffix (e.g. \"..._Mesh.0\") denotes mesh order (\"The
38
+ .0 denotes mesh order\"), which is a different number from the LOD attribute on the same node:
39
+ \"What level of LOD it is. This is a LOD0, so it is the highest quality mesh and the one we
40
+ see in cutscenes.\""
41
+ status: community
42
+ source: bg3.wiki/wiki/Modding:Items §Meshes.lsx
43
+ tags:
44
+ - items
45
+ - visualbank
46
+ - lod
47
+ - mesh-order
48
+ detail: The exporter-side number that produces the suffix is the per-mesh Export Order field — see
49
+ bg3.character-creation.heads-hair.export-order-must-be-sequential.
50
+ - id: bg3.items.visualbank.name-fields-unreferenced-but-unique
51
+ claim: The Name attribute on a VisualBank mesh Resource and on a MaterialBank material Resource is
52
+ never referenced anywhere else in the data, but should still be kept unique per mod to avoid
53
+ clashing with another mod's identically-named entries.
54
+ status: community
55
+ source: bg3.wiki/wiki/Modding:Items §Meshes.lsx, §Materials and Texture .lsx
56
+ tags:
57
+ - items
58
+ - visualbank
59
+ - materialbank
60
+ - naming
61
+ - id: bg3.items.visualbank.vertexcolormaskslots-hides-body-part
62
+ claim: Setting SupportsVertexColorMask to True on a VisualBank Resource and adding a child
63
+ VertexColorMaskSlots/Object node with a slot name (e.g. value="feet") makes the underlying
64
+ body part disappear when that item is equipped — the standard fix for boots clipping through
65
+ feet.
66
+ status: community
67
+ source: "bg3.wiki/wiki/Modding:Items §Meshes.lsx (\"You need this set to True if you want, say,
68
+ pants to vanish when boots are equipped\"; the feet example: \"This code would stop the body's
69
+ feet from loading in and clipping, ideal for boot items\")"
70
+ tags:
71
+ - items
72
+ - visualbank
73
+ - vertexcolormask
74
+ - clipping
75
+ - id: bg3.items.visualbank.material-shader-selection-by-filename
76
+ claim: "The MaterialBank Resource's SourceFile picks the shader by filename convention:
77
+ \"CHAR_BASE.lsf\" is a standard opaque shader; a name containing \"Alpha\" (e.g.
78
+ \"CHAR_BASE_AlphaTest_2S.lsf\") enables transparency and disables backface culling;
79
+ \"..._AlphaTest_2S_Dither\" is required for underwear to hide correctly; \"..._VertCut\" is
80
+ required (with SupportsVertexColorMask/VertexColorMaskSlots) to make a body part disappear; a
81
+ \"_VT\" suffix only works with virtual textures and is not generally useful for modding."
82
+ status: community
83
+ source: bg3.wiki/wiki/Modding:Items §Materials and Texture .lsx
84
+ tags:
85
+ - items
86
+ - materialbank
87
+ - shader
88
+ - transparency
89
+ - underwear
90
+ detail: "Exact wiki wording for the two load-bearing ones: \"Underwear needs to have a Dither shader
91
+ or it won't hide correctly\" and \"Materials with _VT at the end are less useful, as they only
92
+ work with virtual texture.\" Names the shader files behind bg3.materials.instance-recipe's
93
+ \"SourceFile = path to a base material .lsf\", which was inferred from vanilla data rather
94
+ than from a tutorial."
95
+ - id: bg3.items.visualbank.texturebank-srgb-basecolor-only
96
+ claim: A TextureBank Resource's SRGB attribute must be True only for the basecolor (BM) texture; the
97
+ normal (NM), physical (PM), and mask (MSK) maps must have SRGB set to False because they don't
98
+ carry color information.
99
+ status: community
100
+ source: bg3.wiki/wiki/Modding:Items §Materials and Texture .lsx
101
+ tags:
102
+ - items
103
+ - texturebank
104
+ - srgb
105
+ - basecolor
106
+ - id: bg3.items.visualbank.dds-extension-case-sensitive
107
+ claim: "A TextureBank Resource's SourceFile path is case-sensitive on the .DDS extension itself: a
108
+ texture file is expected as uppercase \".DDS\" and a lowercase \".dds\" file at the same path
109
+ will not load."
110
+ status: community
111
+ source: bg3.wiki/wiki/Modding:Items §Materials and Texture .lsx ("Capitalisation is IMPORTANT. Make
112
+ sure your texture is not named MSW_CoolCirclet_NM.dds or it won't load.")
113
+ tags:
114
+ - items
115
+ - texturebank
116
+ - dds
117
+ - case-sensitivity
118
+ - silent-failure
119
+ detail: "The casing rule is per file class, not global: item/character textures and .GR2 meshes are
120
+ uppercase (.DDS / .GR2), while an ICON ATLAS .dds is lowercase — see
121
+ bg3.ui.icons-atlas.atlas-path-must-match-textureatlaspath."
122
+ - id: bg3.items.visualbank.undersized-texture-tiles
123
+ claim: A TextureBank Resource's Width/Height attributes don't have to exactly match the source .DDS
124
+ file's real dimensions, but if the listed size is larger than the actual texture, the texture
125
+ tiles instead of scaling.
126
+ status: community
127
+ source: bg3.wiki/wiki/Modding:Items §Materials and Texture .lsx
128
+ tags:
129
+ - items
130
+ - texturebank
131
+ - texture-size
132
+ detail: "The wiki hedges it: \"These dimensions don't need to be exact. I believe if it is smaller
133
+ than listed, the texture will tile.\""
134
+ - id: bg3.items.visualbank.roottemplate-mapkey-links-stats-entry
135
+ claim: "A RootTemplate GameObjects node's Name and MapKey attributes both link it to the matching
136
+ stats entry (Armor.txt or Weapon.txt): the stats file's data \"RootTemplate\" value must equal
137
+ the RootTemplate's MapKey, and the stats entry name must equal the RootTemplate's Name."
138
+ status: community
139
+ source: bg3.wiki/wiki/Modding:Items §RootTemplate
140
+ tags:
141
+ - items
142
+ - roottemplate
143
+ - armor-txt
144
+ - weapon-txt
145
+ - uuid-linkage
146
+ - id: bg3.items.visualbank.parenttemplateid-inheritance-fallback
147
+ claim: Any RootTemplate attribute left unspecified (Description, Icon, EquipSound, etc.) silently
148
+ falls back to the value on the item's ParentTemplateId template. Using the wrong
149
+ ParentTemplateId for the item's real type (e.g. not a shield's parent template for a shield)
150
+ causes inherited-property mismatches — "a shield will not know it is a shield without this
151
+ ParentTemplate."
152
+ status: community
153
+ source: bg3.wiki/wiki/Modding:Items §RootTemplate
154
+ tags:
155
+ - items
156
+ - roottemplate
157
+ - parenttemplateid
158
+ - inheritance
159
+ - silent-failure
160
+ - id: bg3.items.visualbank.parentrace-zero-uuid-opts-out
161
+ claim: Githyanki, Dragonborn, Tiefling, and Half-Orc automatically fall back to HUM/HUM_STRONG body
162
+ meshes for an item unless a race is explicitly opted out; opting out is done with an
163
+ Equipment/ParentRace/Object node whose MapKey is the race's UUID and whose MapValue is the
164
+ all-zero UUID (00000000-0000-0000-0000-000000000000), which "zeroes the race out" of using
165
+ that item's race-specific mesh.
166
+ status: community
167
+ source: bg3.wiki/wiki/Modding:Items §RootTemplate
168
+ tags:
169
+ - items
170
+ - roottemplate
171
+ - parentrace
172
+ - race-uuid
173
+ - id: bg3.items.visualbank.treasuretable-i-prefix
174
+ claim: "TreasureTable.txt entries reference item root templates with an \"I_\" prefix on the item
175
+ name, in the form: object category \"I_ITEM_NAME\",1,0,0,0,0,0,0,0 — \"Make sure you don't
176
+ forget the I_ prefix for the item!\""
177
+ status: community
178
+ source: 'bg3.wiki/wiki/Modding:Items §TreasureTable (worked example: object category
179
+ "I_MY_COOL_NEW_CIRCLET",1,0,0,0,0,0,0,0)'
180
+ tags:
181
+ - items
182
+ - treasuretable
183
+ - naming-convention
184
+ - id: bg3.items.visualbank.weapon-loot-model-equals-item-model
185
+ claim: A RootTemplate's VisualTemplate is normally the dropped/examined "LOOT model," distinct from
186
+ the equipped VisualSet mesh — except for a weapon, where "the LOOT model and the item model
187
+ are the same," so a weapon RootTemplate's VisualTemplate should point at the same visual as
188
+ its equipped mesh.
189
+ status: community
190
+ source: bg3.wiki/wiki/Modding:Items §RootTemplate
191
+ tags:
192
+ - items
193
+ - weapon
194
+ - visualtemplate
195
+ - roottemplate
196
+ - id: bg3.items.visualbank.weapon-shares-visualbank-chain
197
+ claim: Weapons use the identical VisualBank/MaterialBank/TextureBank chain, folder ([PAK]_Armor),
198
+ and file pairing (.lsf.lsx meshes + materials/textures) as armor — the wiki's
199
+ Stats/Generated/Data folder listing names "Armor.txt, Object.txt, Passive.txt, Weapon.txt"
200
+ side by side as the stats files that reference the same RootTemplates/[PAK]_Armor content
201
+ tree, and the Sample Equipment Mod template is explicitly described as "for Armor and Weapon
202
+ modding" using one shared workflow.
203
+ status: community
204
+ source: bg3.wiki/wiki/Modding:Items §File Overview, §Sample Templates
205
+ tags:
206
+ - items
207
+ - weapon
208
+ - visualbank
209
+ - shared-pattern
210
+ detail: "Extends the armor-focused walkthrough: no separate weapon-only visual pipeline is
211
+ documented on the page. What the page does state weapon-specifically is the loot-model rule —
212
+ see bg3.items.visualbank.weapon-loot-model-equals-item-model."
213
+ - id: bg3.items.visualbank.texture-map-suffix-taxonomy
214
+ claim: "BG3's texture filenames encode their map type by suffix: BM (Basecolor), NM (Normal), PM
215
+ (Physical: Metallic+Roughness+AO), and MSK (Mask, material-region/dye definition) are the
216
+ Hardsurface set; CLEA (Cavity/Hair/Makeup/AO) and HMVY (Hemoglobin/Melanin/Vein/Yellowing) are
217
+ Skin-only; CTLO (Cavity/Thickness/Lips/AO, replaces CLEA) and DMSK (Decorative/Accent Mask)
218
+ are Dragonborn-Skin-only. NM and MSK suffixes are shared between Hardsurface and Skin but mean
219
+ different channel layouts in each (see
220
+ bg3.items.visualbank.msk-channel-meaning-differs-hardsurface-vs-skin)."
221
+ status: community
222
+ source: bg3-community/Information/Textures/texture-types.md §Texture formats > Maps (the eight-row
223
+ Map Type table)
224
+ tags:
225
+ - items
226
+ - texture
227
+ - suffix
228
+ - naming-convention
229
+ - msk
230
+ - bm
231
+ - nm
232
+ - pm
233
+ related:
234
+ - id: bg3.items.visualbank.material-shader-selection-by-filename
235
+ detail: Complements the existing fact's shader-selection-by-filename convention (CHAR_BASE, _Alpha,
236
+ _Dither, _VertCut, _VT) with the separate, orthogonal suffix system that names which
237
+ TEXTURE MAP TYPE a given .dds is, independent of which shader a material chooses.
238
+ - id: bg3.items.visualbank.hardsurface-channel-layout-and-compression
239
+ claim: "Hardsurface texture maps' channel layout and DDS compression: BM stores RGB color intensity
240
+ plus an alpha channel, compressed BC1/DXT1 Linear (and \"can be either full color or
241
+ grayscale\"); NM stores Y Axis Normals in Green, Z Axis Normals in Blue, and X Axis Normals in
242
+ Alpha with Red unused, BC3/DXT5 Linear; PM stores Metallic Intensity (Red), Roughness (Green),
243
+ and Ambient Occlusion (Blue) with Alpha unused, BC1/DXT1 Linear; MSK's channel makeup is
244
+ \"largely irrelevant\" (a colored mask for material regions) with Alpha unused, BC1/DXT1
245
+ Linear."
246
+ status: community
247
+ source: bg3-community/Information/Textures/texture-types.md §Objects (Hardsurface) texture map
248
+ breakdown
249
+ tags:
250
+ - items
251
+ - texture
252
+ - hardsurface
253
+ - channel-layout
254
+ - compression
255
+ - bm
256
+ - nm
257
+ - pm
258
+ - msk
259
+ - id: bg3.items.visualbank.normal-map-red-channel-relocated-to-alpha
260
+ claim: Converting a standard tangent-space DX normal map to BG3's NM format requires moving the Red
261
+ channel's data into the Alpha channel and then setting Red itself to black — BG3's NM format
262
+ does not use Red for X-axis normal data the way a conventional DX normal map does; X-axis data
263
+ instead lives in Alpha.
264
+ status: community
265
+ source: bg3-community/Information/Textures/texture-types.md §DGB texture map breakdown, NM entry
266
+ ("To convert a 'regular' tangent DX normal map to BG3, put the Red channel into Alpha channel
267
+ and set Red channel to black")
268
+ tags:
269
+ - items
270
+ - texture
271
+ - normal-map
272
+ - dragonborn
273
+ - conversion
274
+ - gotcha
275
+ - id: bg3.items.visualbank.msk-channel-meaning-differs-hardsurface-vs-skin
276
+ claim: "The same MSK suffix means a different channel layout depending on context: a Hardsurface
277
+ MSK's channel makeup is stated as irrelevant (any colored region works as a material mask),
278
+ while a Skin MSK has a fixed meaning — Red: Non-Skin, Green: Melanin Removal, Blue: Mucous
279
+ Map, Alpha: Not Used — both compressed BC1/DXT1 Linear despite the different channel
280
+ semantics."
281
+ status: community
282
+ source: bg3-community/Information/Textures/texture-types.md §Objects (Hardsurface) texture map
283
+ breakdown (MSK row) and §Skin texture map breakdown (MSK row)
284
+ tags:
285
+ - items
286
+ - texture
287
+ - msk
288
+ - hardsurface
289
+ - skin
290
+ - channel-layout
291
+ - id: bg3.items.visualbank.dragonborn-ctlo-thickness-and-ao-need-adjustment-from-bakes
292
+ claim: Dragonborn's CTLO map's Thickness channel (Green) "is inverted compared to one from Marmoset
293
+ and much lighter," and its Ambient Occlusion channel (Alpha) "is much whiter then one you will
294
+ bake in Marmoset or Substance" — a Thickness/AO map baked in either of those tools needs
295
+ adjustment before it will look correct packed into BG3's CTLO layout.
296
+ status: community
297
+ source: "bg3-community/Information/Textures/texture-types.md §DGB texture map breakdown, CTLO entry
298
+ (Note: \"Thickness - it's inverted compared to one from Marmoset and much lighter\"; \"AO -
299
+ it's much whiter then one you will bake in Marmoset or Substance, so adjust them if you want
300
+ to mix with yours\")"
301
+ tags:
302
+ - items
303
+ - texture
304
+ - dragonborn
305
+ - ctlo
306
+ - thickness
307
+ - ambient-occlusion
308
+ - gotcha
309
+ - id: bg3.items.visualbank.draconic-bloodline-dmsk-replaces-dmsk-at-runtime
310
+ claim: A Dragonborn's DMSK (decorative/accent mask) texture is dynamically replaced by a separate
311
+ "Draconic Bloodline DMSK" texture at runtime if the player chose the Draconic Bloodline
312
+ sorcerer subclass — a mod that only authors the base DMSK will not see its accent details on a
313
+ Draconic Bloodline character.
314
+ status: community
315
+ source: bg3-community/Information/Textures/texture-types.md §DGB texture map breakdown, "Draconic
316
+ Bloodline DMSK" entry ("they will replace DMSK if gamer choose the DB subclass, keep it in
317
+ mind")
318
+ tags:
319
+ - items
320
+ - texture
321
+ - dragonborn
322
+ - dmsk
323
+ - draconic-bloodline
324
+ - subclass
325
+ - id: bg3.items.visualbank.illithid-msk-body-uses-stacked-uv-halves
326
+ claim: The Illithid MSK texture uses a 1x1 UV ratio for the head but a 1x2 (vertically stacked)
327
+ ratio for the body; any body UV island placed outside the top 1x1 square draws its data from
328
+ the second (bottom) half of the texture instead.
329
+ status: community
330
+ source: bg3-community/Information/Textures/texture-types.md:247-252, §DGB texture map breakdown,
331
+ "Illithid MSK" entry ("For head it is 1x1 ratio image, for body it is 1x2."; the note then
332
+ says UV parts outside that 1x1 take their data from the second part of the texture)
333
+ tags:
334
+ - items
335
+ - texture
336
+ - illithid
337
+ - msk
338
+ - uv-layout
339
+ - id: bg3.items.visualbank.mesh-needs-msk-map-to-be-dyeable
340
+ claim: A mesh only supports in-game dyeing if it has an MSK map; the MSK map is what "allows you to
341
+ set which dye parameters different areas in your mesh use." A mesh with no MSK map cannot be
342
+ dyed regardless of what dye/colour preset is applied to it.
343
+ status: community
344
+ source: bg3-community/Information/Textures/mskColours.md §MSK Colours (opening paragraph)
345
+ tags:
346
+ - items
347
+ - texture
348
+ - msk
349
+ - dye
350
+ - requirement
351
+ - id: bg3.items.visualbank.msk-twelve-parameter-armor-scheme
352
+ claim: "The primary armor shader's MSK map uses exactly 12 dye parameters, three each for Cloth,
353
+ Leather, and Metal (Primary/Secondary/Tertiary), plus Accent_Color, Custom_1, and Custom_2 —
354
+ each with a fixed reference sRGB/hex swatch value used to paint that region in the MSK texture
355
+ (e.g. Cloth_Primary = #FF8000, Leather_Primary = #8000FF, Metal_Primary = #00FF80)."
356
+ status: community
357
+ source: bg3-community/Information/Textures/mskColours.md §MSK Colours (12-parameter table)
358
+ tags:
359
+ - items
360
+ - texture
361
+ - msk
362
+ - dye
363
+ - parameters
364
+ - id: bg3.items.visualbank.msk-simple-three-parameter-scheme-aliases-the-twelve-parameter-one
365
+ claim: "Simpler meshes can use a 3-parameter MSK scheme instead (Color_01/Color_02/Color_03), but
366
+ the two schemes cannot be combined on the same MSK map: Color_01/02/03 use the exact same
367
+ reference RGB values as Cloth_Secondary, Metal_Secondary, and Leather_Secondary respectively,
368
+ so a value written for one scheme is indistinguishable in the raw texture from the
369
+ corresponding value in the other — which set of 12-or-3 meanings actually applies depends on
370
+ the material shader assigned to the mesh, not on the MSK texture itself."
371
+ status: community
372
+ source: bg3-community/Information/Textures/mskColours.md:36, §MSK Colours ("You cannot combine these
373
+ on the same MSK map as the parameters above, as you may notice they use the same values as
374
+ Cloth_Secondary, Metal_Secondary, and Leather_Secondary respectively."; the next sentence adds
375
+ that which value is used depends on the material shader)
376
+ tags:
377
+ - items
378
+ - texture
379
+ - msk
380
+ - dye
381
+ - shader-dependent
382
+ - gotcha
383
+ - id: bg3.items.visualbank.solid-colour-msk-uses-engine-msk-uuids
384
+ claim: For a solid-colour MSK region, a material can reference the built-in Engine_MSK colour map's
385
+ UUID for the desired parameter instead of authoring a new solid-color MSK texture — e.g.
386
+ Cloth_Primary = 01e0ce88-b357-fd26-323a-5a3577fcc35a, Metal_Primary =
387
+ 40daac11-00dc-de43-7dcc-7cb7206fd298. The community reference itself records
388
+ Leather_Tertiary's UUID as "unknown" — not yet documented anywhere.
389
+ status: community
390
+ source: bg3-community/Information/Textures/mskColours.md §Solid Colour MSK (UUID table)
391
+ tags:
392
+ - items
393
+ - texture
394
+ - msk
395
+ - engine-msk
396
+ - uuid
397
+ - solid-color
398
+ detail: The community page's own gap (Leather_Tertiary = "unknown") is preserved here rather than
399
+ guessed at — a mod needing that specific solid parameter should extract Engine_MSK from the
400
+ vanilla paks directly rather than trust an invented UUID.
401
+ - id: bg3.items.visualbank.msk-compression-matches-basecolor-map
402
+ claim: "MSK maps for clothing and armor use the same compression settings as the base color (BM)
403
+ map: BC1/DXT1 with mipmaps enabled — not a different compression profile from the diffuse
404
+ texture it accompanies."
405
+ status: community
406
+ source: bg3-community/Information/Textures/mskColours.md §Compression
407
+ tags:
408
+ - items
409
+ - texture
410
+ - msk
411
+ - compression
412
+ - bc1
413
+ - dxt1
414
+ - id: bg3.items.visualbank.equipment-visuals-is-direct-child-not-in-visualset
415
+ claim: 'In an item RootTemplate (GameObjects, Type="item") the worn mesh comes ONLY from the
416
+ Equipment child node, and the body-type map node Visuals must be a DIRECT child of Equipment —
417
+ a sibling of Slot, VisualSet and ParentRace — never nested inside VisualSet. With Visuals
418
+ nested under VisualSet the engine finds no worn body map: the armor is invisible when equipped
419
+ on every body type, and examining it falls back to the loot VisualTemplate.'
420
+ status: verified
421
+ verified_on: 4.73.98.727 (Patch 8)
422
+ source: ModWright field verification
423
+ tags:
424
+ - items
425
+ - roottemplate
426
+ - equipment
427
+ - visuals
428
+ - visualset
429
+ - silent-failure
430
+ - invisible-armor
431
+ related:
432
+ - id: bg3.items.visualbank.equipment-visuals-fourteen-body-type-keys
433
+ detail: The keys that Visuals node must carry once it is in the right place.
434
+ - id: bg3.items.visualbank.parentrace-zero-uuid-opts-out
435
+ detail: ParentRace is the other direct child of Equipment; it is a race-remap opt-out, not a mesh
436
+ map.
437
+ detail: 'The correct shape under Equipment > children is: ParentRace (4 Object children, MapKey guid
438
+ -> MapValue guid, zero uuid = opt-out); Slot (attribute Object FixedString "Body"); VisualSet
439
+ (attributes BodySetVisual FixedString "", ShowEquipmentVisuals bool False; children
440
+ MaterialOverrides and RealMaterialOverrides); and Visuals, whose children are Object nodes
441
+ with a MapKey guid attribute (the body-type uuid) and a MapValue child whose Object
442
+ FixedString attribute is the VisualBank Resource ID. VisualSet is an easy trap because the
443
+ name sounds like where visuals go — it only carries the material-override banks. Validator
444
+ bg3.items.equipment-visuals-structure blocks the nested shape.'
445
+ - id: bg3.items.visualbank.equipment-visuals-fourteen-body-type-keys
446
+ claim: "There is no automatic body-type fallback in Equipment/Visuals: each race+gender body type
447
+ looks up its OWN MapKey, so any body type left unmapped renders the armor invisible on that
448
+ body. The vanilla robe maps exactly 14 keys, all with real VisualBank IDs, strictly
449
+ alternating male/female — MALE: 7d73f501-f65e-46af-a13b-2cacf3985d05 (HUM_M),
450
+ e39505f7-f576-4e70-a99e-8e29cd381a11, f07faafa-0c6f-4f79-a049-70e96b23d51b,
451
+ abf674d2-2ea4-4a74-ade0-125429f69f83, a933e2a8-aee1-4ecb-80d2-8f47b706f024,
452
+ 5640e766-aa53-428d-815b-6a0b4ef95aca, 9a8bbeba-850c-402f-bac5-ff15696e6497; FEMALE:
453
+ 71180b76-5752-4a97-b71f-911a69197f58 (HUM_F), 47c0315c-7dc6-4862-b39b-8bf3a10f8b54,
454
+ 06aaae02-bb9e-4fa3-ac00-b08e13a5b0fa, b4a34ce7-41be-44d9-8486-938fe1472149,
455
+ 8f00cf38-4588-433a-8175-8acdbbf33f33, c491d027-4332-4fda-948f-4a3df6772baa,
456
+ 6d38f246-15cb-48b5-9b85-378016a7a78e."
457
+ status: verified
458
+ verified_on: 4.73.98.727 (Patch 8)
459
+ source: ModWright field verification
460
+ tags:
461
+ - items
462
+ - roottemplate
463
+ - equipment
464
+ - visuals
465
+ - body-type
466
+ - race
467
+ - gender
468
+ - invisible-armor
469
+ related:
470
+ - id: bg3.items.visualbank.parentrace-zero-uuid-opts-out
471
+ detail: ParentRace maps 4 of these same keys (f07faafa, 06aaae02, 9a8bbeba, 6d38f246) to the
472
+ all-zero UUID — a race-remap opt-out that is SEPARATE from Visuals; those 4 keys still
473
+ carry real meshes in Visuals.
474
+ detail: A mod that only maps HUM_M/HUM_F (the two keys most tutorials show) ships armor that is
475
+ invisible on the other 12 bodies. Validator bg3.items.equipment-visuals-structure warns on any
476
+ of the 14 keys missing from a Visuals map and on a MapValue with an empty Object.
477
+ - id: bg3.items.visualbank.worn-body-resource-needs-character-material-domain
478
+ claim: "A VisualBank Resource with Slot=\"Body\" (a body-skinned worn mesh) must be MaterialType 0
479
+ and its Objects/MaterialID material must instance a CHARACTER-domain base material
480
+ (Materials.pak Public/Shared/Assets/Materials/Characters/CHAR_BASE.lsf,
481
+ CHAR_BASE_AlphaTest.lsf or CHAR_BASE_VertCut.lsf — all declare the same Texture2D params
482
+ basecolor/normalmap/physicalmap). MaterialType 4 is a weapon/rigid value: a Body resource at
483
+ MaterialType 4 whose material's SourceFile is the generic scenery base
484
+ Public/Shared/Assets/Materials/Base/Base_AlphaTest.lsf gets no skinned shader permutation and
485
+ the mesh is invisible when worn."
486
+ status: verified
487
+ verified_on: 4.73.98.727 (Patch 8)
488
+ source: ModWright field verification
489
+ tags:
490
+ - items
491
+ - visualbank
492
+ - materialbank
493
+ - materialtype
494
+ - char-base
495
+ - base-alphatest
496
+ - worn-mesh
497
+ - invisible-armor
498
+ related:
499
+ - id: bg3.items.visualbank.material-shader-selection-by-filename
500
+ detail: That fact picks a shader by CHAR_BASE filename suffix; this one adds the prerequisite that
501
+ the base must be in the Characters/ domain at all for a worn mesh.
502
+ detail: Base_AlphaTest + MaterialType 4 remains correct for a rigid WEAPON (Slot="Unassigned"),
503
+ which is exactly why a weapon recipe copied onto an armor piece fails silently. The vanilla
504
+ worn robe uses MaterialType 13 + CHAR_BASE_VertCut_VT, a VirtualTexture base that lslib/divine
505
+ cannot bake — clone the shader FAMILY (non-VT CHAR_BASE) rather than the exact vanilla
506
+ material. Validator bg3.items.worn-visual-material-domain blocks a Body resource at
507
+ MaterialType 4 or on a Materials/Base/ material.
508
+ - id: bg3.items.visualbank.gr2-mesh-name-must-match-objectid
509
+ claim: A worn VisualBank Resource's Objects/ObjectID is "<GR2 basename>.<meshname>.<n>" and its
510
+ Template is "<GR2 basename>.<model root>.0"; the mesh name inside the GR2 must match the
511
+ ObjectID's middle segment exactly. The pipeline exports mesh "model" under root "Dummy_Root";
512
+ a stray Blender "model.001" datablock exported in its place silently breaks the link and the
513
+ mesh is invisible.
514
+ status: verified
515
+ verified_on: 4.73.98.727 (Patch 8)
516
+ source: ModWright field verification
517
+ tags:
518
+ - items
519
+ - visualbank
520
+ - gr2
521
+ - objectid
522
+ - mesh-name
523
+ - blender
524
+ - silent-failure
525
+ related:
526
+ - id: bg3.items.visualbank.objectid-mesh-order-vs-lod
527
+ detail: The trailing ".<n>" is the export-order suffix that fact describes; the middle segment is
528
+ the mesh name.
529
+ detail: Check with divine -g bg3 -a convert-model gr2->dae and read the mesh/geometry ids, or in
530
+ Blender confirm the object and mesh datablock are both named "model" before export. No
531
+ ModWright validator reads GR2 binaries, so this stays a checklist item.
532
+ - id: bg3.items.visualbank.worn-gr2-orientation-numeric-check
533
+ claim: "A Blender-exported worn GR2 whose vertices are rotated 90 degrees about X out of its own
534
+ skeleton frame renders in-game as a collapsed pile at the character's feet. Cause: exporting
535
+ after bpy.ops.object.parent_set(type='ARMATURE_NAME') leaves a non-identity
536
+ matrix_parent_inverse; fix: set an identity parent-inverse and identity local transform before
537
+ the COLLADA export. Offline numeric check: divine -g bg3 -a convert-model gr2->dae, then the
538
+ mesh POSITION bounding box must be tall on Y within the skeleton's height (e.g. y=[0.26,1.63]
539
+ with Root_M at y~1.045), as vanilla HUM_F_ARM_Robe_A_Body reads; a mesh spanning
540
+ z=[-1.63,-0.26] is the broken one."
541
+ status: verified
542
+ verified_on: 4.73.98.727 (Patch 8)
543
+ source: ModWright field verification
544
+ tags:
545
+ - items
546
+ - gr2
547
+ - blender
548
+ - orientation
549
+ - parent-inverse
550
+ - collada
551
+ - divine
552
+ - worn-mesh
553
+ detail: "This needs no engine: the dae is plain XML, so the POSITION source's min/max per axis is
554
+ readable with any script. Deliberately not a ModWright validator (it needs divine on the path
555
+ and a GR2 conversion per mesh); it belongs in the mesh-export checklist next to the mesh-name
556
+ check."
557
+ - id: bg3.items.visualbank.worn-open-garment-needs-two-sided-base
558
+ claim: A single-layer collar or lapel wound away from the body shows only its outer face, because
559
+ the engine culls backfaces on CHAR_BASE. Materials.pak ships
560
+ Public/Shared/Assets/Materials/Characters/CHAR_BASE_AlphaTest_2S.lsf — non-VT, two-sided, with
561
+ the same basecolor/normalmap/physicalmap Texture2D parameters as CHAR_BASE — and an open
562
+ garment should instance that base instead, keeping the basecolor alpha opaque.
563
+ status: unverified
564
+ source: ModWright research
565
+ tags:
566
+ - items
567
+ - visualbank
568
+ - materialbank
569
+ - char-base
570
+ - two-sided
571
+ - backface-culling
572
+ - worn-mesh
573
+ related:
574
+ - id: bg3.items.visualbank.worn-body-resource-needs-character-material-domain
575
+ detail: CHAR_BASE_AlphaTest_2S is in the Characters/ material domain that fact requires, so it stays
576
+ valid for a worn mesh.
577
+ - id: bg3.items.visualbank.material-shader-selection-by-filename
578
+ detail: Same parameter set means the existing MaterialBank Texture2DParameters carry over unchanged;
579
+ only SourceFile changes. Because it is non-VT it survives the lslib/divine bake, unlike
580
+ CHAR_BASE_VertCut_VT.
581
+ - id: bg3.items.visualbank.atlas-gutter-bleed
582
+ claim: "An AI-sculpt texture atlas with thousands of tiny UV islands and ~47% pixel coverage shows
583
+ hard-edged colour patches along triangle edges in-game, because the mipmaps average each
584
+ island's colour with the black gutters around it. Fix: rasterise the UV layout and dilate
585
+ island colour ~32 px into the gutters before making the DDS."
586
+ status: verified
587
+ verified_on: 4.73.98.727 (Patch 8)
588
+ source: ModWright field verification
589
+ tags:
590
+ - items
591
+ - textures
592
+ - atlas
593
+ - uv
594
+ - mipmaps
595
+ - gutter
596
+ - dds
597
+ - physicalmap
598
+ related:
599
+ - bg3.items.visualbank.msk-compression-matches-basecolor-map
600
+ detail: "A second symptom from the same atlas: a per-island metal/roughness map produces
601
+ per-triangle specular (each island averages to a different value). Cloth should ship a
602
+ near-constant physical map rather than one derived per island."
603
+ - id: bg3.items.visualbank.vertexcolormaskslots-underwear-fix
604
+ claim: "Copying the vanilla robe's seven VertexColorMaskSlots (Torso, upperarm, decolletage_02,
605
+ lowerarm, Shoulders, Underwear_Bra, Nipple Covers) plus SupportsVertexColorMask=True onto a
606
+ custom worn body VisualBank Resource stopped the underwear showing through the robe. The
607
+ robe's own material stayed CHAR_BASE: the mask is declared by the hiding item, and the
608
+ VertCut/dither shaders belong to the mesh being hidden."
609
+ status: verified
610
+ verified_on: 4.73.98.727 (Patch 8)
611
+ source: ModWright field verification
612
+ tags:
613
+ - items
614
+ - visualbank
615
+ - vertexcolormask
616
+ - underwear
617
+ - clipping
618
+ - worn-mesh
619
+ related:
620
+ - id: bg3.items.visualbank.vertexcolormaskslots-hides-body-part
621
+ detail: The community "feet" example generalised to a worn body — the same node hides the body and
622
+ underwear regions a robe covers.
623
+ - id: bg3.items.visualbank.material-shader-selection-by-filename
624
+ detail: That fact's Dither/VertCut wording applies to the HIDDEN mesh's material (vanilla underwear
625
+ and body), not to the garment doing the hiding.
626
+ detail: "Side effect to plan for: the same mask hides the arms whenever the robe is drawn, which is
627
+ what made a kit with two Breast-slot armors lose the arms in character creation
628
+ (bg3.equipment.cc-kit-one-body-item)."