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,167 @@
1
+ game: baldursgate3
2
+ topic: items.cloth-physics
3
+ title: Cloth physics on worn armor (proxy cloth mesh, vertex paint, ClothParams, ClothProxyMapping)
4
+ facts:
5
+ - id: bg3.cloth.proxy-cloth-mesh-in-gr2
6
+ claim: Cloth physics on worn armor is driven by a separate, INVISIBLE, coarse submesh in the same
7
+ GR2 whose name ends in _Cloth_Mesh (the "cloth proxy"); the visible render mesh is deformed by
8
+ it. The proxy uses the engine default material 9e2966c7-b61c-4bc1-bef1-a79cb5fde067
9
+ (Engine_Default_Mesh_Lit_Opaque) and ships per LOD.
10
+ status: verified
11
+ verified_on: 4.73.98.727 (Patch 8)
12
+ source: wiki.bg3.community/Information/Meshes/Armour-Meshes + the vanilla resource
13
+ tags:
14
+ - cloth
15
+ - physics
16
+ - gr2
17
+ - proxy-mesh
18
+ - armor
19
+ detail: 'The wiki glossary: "When a sub-mesh ends with _Cloth_Mesh, this is (with very rare
20
+ exceptions) the cloth mesh, which is an invisible submesh that gives the game information on
21
+ how to simulate the cloth physics for the other parts of that mesh." A custom robe therefore
22
+ needs its swinging parts (tie ends, beads, skirt) modelled a second time as a low-poly proxy,
23
+ not just painted on the render mesh.'
24
+ - id: bg3.cloth.vertex-paint-red-amount-blue-damping
25
+ claim: "Cloth is controlled by vertex colour: RED turns physics on and sets how free a vertex is (0
26
+ = pinned), BLUE slows/damps it; GREEN is reserved for the VertCut body-mask. The cloth proxy
27
+ is painted in red bands (vanilla robe: 0 / .25 / .5 / .65 / .8 / 1, blue 0 / .25 / .5); the
28
+ visible render mesh is painted red = 1 on every cloth-driven vertex and 0 elsewhere."
29
+ status: verified
30
+ verified_on: 4.73.98.727 (Patch 8)
31
+ source: 'wiki.bg3.community/Information/Meshes/Vertex-Painting-Meshes ("Red and Blue affect cloth
32
+ physics"; the community summary: red turns physics on, more red = more active, blue makes it
33
+ slower) + the vanilla data'
34
+ tags:
35
+ - cloth
36
+ - physics
37
+ - vertex-color
38
+ - weight-paint
39
+ detail: 'Paint with flood fills per face selection, not soft brushes: in-between values are handled
40
+ badly by the engine (the wiki reports such verts "stuck to the ground" for the mask channel).
41
+ Export-side colour-space caveat as for VertexColorMaskSlots: via Collada the R/B components
42
+ survive as painted; via glTF they are gamma-adjusted.'
43
+ - id: bg3.cloth.visualbank-clothparams-node
44
+ claim: "The VisualBank Resource carries one ClothParams child per cloth proxy mesh (and per LOD):
45
+ its UUID attribute is the proxy's ObjectID string (e.g.
46
+ HUM_F_ARM_Robe_A_Body.HUM_F_ARM_Robe_A_Body_Cloth_Mesh.2) and it holds the 39 simulation
47
+ attributes."
48
+ status: verified
49
+ verified_on: 4.73.98.727 (Patch 8)
50
+ source: Shared.pak [PAK]_Female_Armor _merged.lsf
51
+ tags:
52
+ - cloth
53
+ - physics
54
+ - visualbank
55
+ - clothparams
56
+ detail: 'Vanilla robe values (a sane starting point for light cloth): AngularDrag/LinearDrag .0001,
57
+ AngularInertia/ LinearInertia/CentrifugalInertia .5, AnimDriveSpringForce 225,
58
+ AnimDriveDampingForce 75, AnimInfluenceMultiplier 1, BendingStiffness 1, LinearStiffness 1,
59
+ Damping .04, DragCoefficient .4, LiftCoefficient .01, FluidDensity .1, Friction .1,
60
+ CollisionMassScale 1, CompressionLimit .8, StretchLimit 1.2, SelfCollisionDistance 0,
61
+ SelfCollisionStiffness 0, SolverFrequency 30, StiffnessFrequency 350, StiffnessMultiplier 1,
62
+ TetherConstraintScale 1, TetherConstraintStiffness 1, EnableCCD False, EnableVirtualParticles
63
+ False, all wind fields 0/False. The "Fabric Manufacturer" SE utility (Nexus 18884) exposes
64
+ these as live sliders and exports them.'
65
+ - id: bg3.cloth.proxy-mapping-blob-three-nearest
66
+ claim: "ClothProxyMapping links a cloth proxy to the render mesh it drives: MapKey = proxy ObjectID;
67
+ MapValue/Object has Name = render-mesh ObjectID, NbClosestVertices = N and ClosestVertices =
68
+ base64(zlib(uint16[N])). The blob is N/3 triples, one per proxied render vertex: slot 1 is
69
+ ALWAYS a valid proxy-vertex index, slots 2-3 are extra nearest neighbours or 0xFFFF. Indices
70
+ address the proxy's WELDED vertex list (max index + 1 equals the proxy's unique-position count
71
+ where the GR2 has no split verts: Robe_A_1 504/504, Padded LOD0 315/315)."
72
+ status: inferred
73
+ source: "Decoded 2026-09-14 from Shared.pak [PAK]_Female_Armor + the GR2s of HUM_F_ARM_Robe_A,
74
+ Robe_A_1, Robe_D, Padded_A_1 and Robe_C_3 (12 mappings, all LODs): N divisible by 3 in all 402
75
+ entries of the file; slot-1 valid count == N/3 in all 12; zlib-inflates to exactly 2*N bytes."
76
+ tags:
77
+ - cloth
78
+ - physics
79
+ - visualbank
80
+ - clothproxymapping
81
+ - scratchbuffer
82
+ - binary
83
+ detail: "WHICH render vertices are proxied is only partly decoded: N/3 is always a little above the
84
+ count of red-painted render verts (Robe_A_1: 1235 vs 1183 red, and it EQUALS red verts + their
85
+ one-ring neighbours, 1235, for both LODs of that mesh), but the one-ring rule
86
+ over-/under-shoots the other four robes by 3-10% (Robe_D 402 vs 379, Padded 1550 vs 1464,
87
+ Robe_C_3 3222 vs 3121) — likely because lslib's glTF export does not reproduce the GR2's exact
88
+ vertex list. Order within the list is presumed to be render-vertex order. The Toolkit
89
+ generates this blob from its Proxy Simulation tab; a hand-generated one (a script writing
90
+ \"red + one ring, vertex order, three nearest welded proxy verts\") is an EXPERIMENT with
91
+ crash risk, not a recipe."
92
+ - id: bg3.cloth.lslib-divmodeltype-cloth-flag
93
+ claim: "lslib/divine marks a GR2 mesh as cloth from the COLLADA source: under the geometry's <mesh>
94
+ an <extra> <technique profile=\"LSTools\"> with <DivModelType>Cloth</DivModelType> sets
95
+ MeshFlags Cloth and ExtendedData Cloth=1. Other DivModelType values: Rigid, MeshProxy,
96
+ ProxyGeometry, Spring, Occluder, Cloth01, Cloth02, Cloth04, ClothPhysics (cloth flag bits);
97
+ same technique also takes ExportOrder, LOD, LODDistance, IsImpostor."
98
+ status: verified
99
+ verified_on: lslib master (ColladaImporter.cs FindExporterExtraData / LoadLSLibProfileMeshType),
100
+ read 2026-09-14
101
+ source: github.com/Norbyte/lslib LSLib/Granny/Model/ColladaImporter.cs
102
+ tags:
103
+ - cloth
104
+ - lslib
105
+ - divine
106
+ - collada
107
+ - gr2
108
+ - mesh-flags
109
+ detail: Blender's built-in COLLADA exporter writes no such technique; the dos2de_collada_exporter
110
+ addon does (its per-mesh "Cloth" custom property). A pipeline using the stock exporter can
111
+ inject the <extra> block into the .dae before divine dae->gr2. Which cloth flag bits vanilla
112
+ proxies carry was not checked.
113
+ - id: bg3.cloth.toolkit-proxy-simulation-tab
114
+ claim: In the Toolkit, a GR2 that contains a cloth proxy mesh is wired by opening the mesh in the
115
+ Resource Manager and, in its Proxy Simulation tab, dragging the render mesh and dropping it
116
+ under the bolded cloth mesh; that is what produces the ClothProxyMapping (and default
117
+ ClothParams) in the VisualBank.
118
+ status: community
119
+ source: wiki.bg3.community/Tutorials/Toolkit/Toolkit_Tips (search summary, 2026-09-14)
120
+ tags:
121
+ - cloth
122
+ - physics
123
+ - toolkit
124
+ - proxy-simulation
125
+ detail: "Recommended route for a hand-built pipeline: author the GR2 (render mesh + proxy, both
126
+ painted) with lslib, do the proxy link in the Toolkit once, then lift the generated
127
+ ClothParams + ClothProxyMapping nodes into the mod's own _merged.lsx. The step-by-step is
128
+ \"Add Cloth Physics To Any Armor\" (Nexus article 311)."
129
+ - id: bg3.cloth.single-bone-mesh-crashes-with-physics
130
+ claim: A mesh weighted 100% to a single bone crashes the game when cloth physics is added to it.
131
+ status: community
132
+ source: search summary of the community cloth-physics tutorial listing, 2026-09-14 (not
133
+ independently verified)
134
+ tags:
135
+ - cloth
136
+ - physics
137
+ - crash
138
+ - weights
139
+ - id: bg3.cloth.colliders-live-on-the-body
140
+ claim: Cloth collides with a ClothColliderBank (bone-attached spheres with links) that ships with
141
+ the BODY mesh's _merged.lsf; an armor VisualBank resource leaves ClothColliderResourceID empty
142
+ and inherits the body's.
143
+ status: community
144
+ source: bg3.wiki/wiki/Modding:Cloth_colliders; vanilla robe resource ClothColliderResourceID=""
145
+ tags:
146
+ - cloth
147
+ - physics
148
+ - collider
149
+ detail: Only a custom BODY needs its own collider bank (the wiki gives FS_NKD_Body_ClothCollider as
150
+ a template); sphere Radius tunes how far cloth is held off the limb.
151
+ - id: bg3.cloth.cloaks-collide-with-the-body-colliders-so-standoff-collars-clip
152
+ claim: "Because a worn mesh has no ClothColliderResourceID of its own
153
+ (bg3.cloth.colliders-live-on-the-body), an equipped cloak's cloth collides only with the naked
154
+ body's ClothColliderBank spheres (HUM_F_NKD_Body_ClothCollider,
155
+ 36550e8b-4302-b290-954d-626f53ee7c91: bone-attached Spheres with Position, Radius and Links �
156
+ Ankle, Knee, Hip_*_Twist, Root_M ...). Any part of a custom robe that stands off the body,
157
+ such as a raised collar or upper back, is therefore passed through by the cape. The untested
158
+ remedy is a ClothColliderBank resource for the robe (spheres on neck / upper spine / shoulders
159
+ sized to the collar) referenced from the robe's VisualBank resource."
160
+ status: inferred
161
+ source: ModWright research
162
+ tags:
163
+ - cloth
164
+ - physics
165
+ - collider
166
+ - cloak
167
+ - clipping
@@ -0,0 +1,320 @@
1
+ game: baldursgate3
2
+ topic: items.roottemplates
3
+ title: Level-placed item instances, CC item slots, and TreasureTable mechanics
4
+ facts:
5
+ - id: bg3.items.roottemplates.level-instance-is-a-separate-gameobjects-node
6
+ claim: Placing an item instance in a level (as opposed to defining the item's own RootTemplate) is a
7
+ separate GameObjects node, in a Levels\<LevelName>\Items\_merged.lsf.lsx file, whose
8
+ TemplateName attribute is the MapKey of the RootTemplate being instantiated — the instance
9
+ gets its OWN new MapKey (a fresh UUID) distinct from the template it points at.
10
+ status: community
11
+ source: 'bg3-community/Information/Items/Item-Level-Positioning.md §Item Data File (worked
12
+ GameObjects example: "TemplateName: This is the MapKey of the object you are copying")'
13
+ tags:
14
+ - items
15
+ - roottemplate
16
+ - level-placement
17
+ - gameobjects
18
+ - uuid
19
+ related:
20
+ - id: bg3.items.visualbank.roottemplate-mapkey-links-stats-entry
21
+ detail: Distinguishes the RootTemplate's own definitional MapKey (which a stats entry's RootTemplate
22
+ value must equal) from a level instance's TemplateName, which references that same MapKey
23
+ from a completely different file to place a copy in the world.
24
+ - id: bg3.items.roottemplates.level-instance-required-fields
25
+ claim: "The page's worked level-placed GameObjects node carries: LevelName (FixedString, matching
26
+ the parent Levels\\<Name> directory — readable in-game via
27
+ _P(Osi.GetRegion(GetHostCharacter()))), MapKey (a freshly generated UUID for the new
28
+ instance), Name (a display/debug name for the created object), TemplateName (the source
29
+ RootTemplate's MapKey), Type (FixedString, e.g. \"item\"), plus Flag and
30
+ _OriginalFileVersion_, a LayerList/Layers/Object child node whose own MapKey repeats the
31
+ LevelName, and a Transform child node with Position/RotationQuat/Scale. The page annotates the
32
+ first six but does not say which are strictly required."
33
+ status: community
34
+ source: bg3-community/Information/Items/Item-Level-Positioning.md §Item Data File
35
+ tags:
36
+ - items
37
+ - roottemplate
38
+ - level-placement
39
+ - required-fields
40
+ - id: bg3.items.roottemplates.rotationquat-must-be-precomputed-externally
41
+ claim: A level instance's Transform/RotationQuat attribute takes a quaternion, not a rotation angle,
42
+ and there is no in-game command that outputs one directly — it must be converted externally
43
+ from a Y-axis degree value (e.g. via a browser rotation-converter tool). 90 degrees converts
44
+ to "0 0.7071068 0 0.7071068", written space-separated like Position (the page states the
45
+ no-commas rule for Position explicitly, and every quaternion it prints follows the same
46
+ spacing).
47
+ status: community
48
+ source: bg3-community/Information/Items/Item-Level-Positioning.md §Converting Rotation to
49
+ RotationQuat ("there isn't a command in game to give you that, so you have to convert it
50
+ externally")
51
+ tags:
52
+ - items
53
+ - roottemplate
54
+ - transform
55
+ - rotationquat
56
+ - gotcha
57
+ detail: The page ships a lookup table of pre-converted 30-degree increments from 0 to 330 for
58
+ convenience, avoiding the external converter for common angles.
59
+ - id: bg3.items.roottemplates.scale-attribute-is-a-multiplier
60
+ claim: "A level instance's Transform/Scale attribute (type float) is a multiplier on the original
61
+ object's size: 1 = 100% (original size), 0.5 = half size, 2.0 = double size."
62
+ status: community
63
+ source: bg3-community/Information/Items/Item-Level-Positioning.md §Item Data File
64
+ tags:
65
+ - items
66
+ - roottemplate
67
+ - transform
68
+ - scale
69
+ - id: bg3.items.roottemplates.cc-item-slot-names-vs-in-game-labels
70
+ claim: 'Character-Creation-visible item slots use internal names that differ from their in-game
71
+ display labels: Head shows as "Face"; Beard shows as "Facial Hair"; Piercing shows as
72
+ "Piercing Style"; DragonbornTop shows as "Crest"; DragonbornChin shows as "Chins";
73
+ DragonbornJaw shows as "Jaws"; Private Parts shows as "Genitals". Hair, Horns, and Tail keep
74
+ the same name in both places.'
75
+ status: community
76
+ source: bg3-community/Information/Items/CC-Item-Slots.md §Character Creation (CC) Slots
77
+ tags:
78
+ - items
79
+ - cc-slots
80
+ - naming-convention
81
+ - id: bg3.items.roottemplates.cc-slot-choice-does-not-constrain-item-behavior
82
+ claim: Any visual can be assigned to any Character Creation slot with identical in-game behavior
83
+ regardless of the slot's intended purpose ("it does not matter what type of item is added to a
84
+ slot... it will behave the same way each time") — the only functional consequence of slot
85
+ choice is which UI section the player must open to select it, plus a caveat that a colorable
86
+ item still needs its own colorable UI section wired up separately.
87
+ status: community
88
+ source: bg3-community/Information/Items/CC-Item-Slots.md §Description
89
+ tags:
90
+ - items
91
+ - cc-slots
92
+ - behavior
93
+ - id: bg3.items.roottemplates.no-way-to-add-new-cc-slots
94
+ claim: There is currently no known way to add a new Character Creation slot beyond the fixed set the
95
+ game ships — "doing so would probably require extensive UI editing, if it is possible at all."
96
+ status: community
97
+ source: bg3-community/Information/Items/CC-Item-Slots.md §Description
98
+ tags:
99
+ - items
100
+ - cc-slots
101
+ - limitation
102
+ - id: bg3.items.roottemplates.spawn-inventory-requires-inventorylist-or-tradetreasures-node
103
+ claim: "Before a TreasureTable can populate a game object's inventory, that object needs a specific
104
+ child node added: InventoryList/InventoryItem (for containers/items) or
105
+ TradeTreasures/TreasureItem (for NPCs), each with an Object attribute (FixedString) naming the
106
+ TreasureTable to roll. Without this node, an otherwise-correct TreasureTable.txt entry is
107
+ never consulted."
108
+ status: community
109
+ source: bg3-community/Tutorials/Items/Treasuretables.md ("Before anything with treasuretables can
110
+ happen... a gameobject needs this attribute node added to it")
111
+ tags:
112
+ - items
113
+ - treasuretable
114
+ - inventorylist
115
+ - tradetreasures
116
+ - required-fields
117
+ - id: bg3.items.roottemplates.treasuretable-subtable-weighting-math
118
+ claim: A TreasureTable "new subtable" string is "Amount;WeightedChance" pairs separated by ";" —
119
+ each pair's second number is its weight relative to the sum of all pairs' second numbers in
120
+ that subtable (e.g. "1,2;2,1" sums to 3, so the first set fires 2-in-3 times and the second
121
+ 1-in-3), and the chosen pair's first number is how many items get rolled from the object list
122
+ beneath it, using each listed object's own leading number as its OWN relative weight within
123
+ that roll.
124
+ status: community
125
+ source: bg3-community/Tutorials/Items/Treasuretables.md (worked "1,2;2,1" example and its weighting
126
+ explanation)
127
+ tags:
128
+ - items
129
+ - treasuretable
130
+ - subtable
131
+ - weighting
132
+ detail: A nested treasuretable reference (an object category name prefixed "T_" instead of "I_")
133
+ re-rolls its own subtables independently each time it is selected — the worked example shows a
134
+ 16-out-of-20 pick of a "T_"-prefixed table getting rolled twice because the outer subtable's
135
+ chosen pair asked for 2 items.
136
+ - id: bg3.items.roottemplates.treasuretable-subtable-chance-negative-one-always-shows
137
+ claim: Setting a TreasureTable subtable's chance string to "-1" makes every object listed underneath
138
+ it always appear, bypassing both the normal weighted-roll chance and any
139
+ player-level/uniqueness gating that would otherwise filter it out.
140
+ status: community
141
+ source: bg3-community/Tutorials/Items/Treasuretables.md ("If you set the subtable chance to -1, it
142
+ always shows everything underneath, even if its unique or the player doesn't qualify due to
143
+ level")
144
+ tags:
145
+ - items
146
+ - treasuretable
147
+ - subtable
148
+ - always-show
149
+ - id: bg3.items.roottemplates.treasuretable-canmerge-appends-without-redefining
150
+ claim: Adding "CanMerge 1" directly under a "new treasuretable" declaration with the SAME table name
151
+ appends the following subtable(s) to the existing table's contents rather than replacing it —
152
+ the documented way to add drops to a table (including a vanilla one) without needing to
153
+ reproduce its original entries.
154
+ status: community
155
+ source: bg3-community/Tutorials/Items/Treasuretables.md §"You can also add to existing
156
+ treasuretables via CanMerge"
157
+ tags:
158
+ - items
159
+ - treasuretable
160
+ - canmerge
161
+ - extension
162
+ - id: bg3.items.roottemplates.treasuretable-definition-ends-at-next-entry-or-eof
163
+ claim: A TreasureTable.txt entry has no explicit end marker — its definition runs until either the
164
+ file ends or a new "new treasuretable" line starts, which the page compares to how
165
+ stats/spells/boosts .txt files behave.
166
+ status: community
167
+ source: bg3-community/Tutorials/Items/Treasuretables.md:110 ("A treasuretable only ends whenever the
168
+ file ends or you start a new treasuretable entry.")
169
+ tags:
170
+ - items
171
+ - treasuretable
172
+ - txt-format
173
+ - parsing
174
+ - id: bg3.items.roottemplates.loose-lsx-in-roottemplates-is-not-loaded-a-separate-lsf-is
175
+ claim: "The game does not read a loose .lsx file under Public/<Mod>/RootTemplates: a GameObjects
176
+ node shipped that way is unknown to Ext.Template.GetTemplate and Osi.CreateAt returns nothing
177
+ for its MapKey. The same node converted with divine to a .lsf file of its own name, placed
178
+ beside _merged.lsf in the same pak, is loaded, resolves, and spawns; RootTemplates need not be
179
+ merged into _merged.lsf, but they must be .lsf."
180
+ status: verified
181
+ verified_on: 4.73.98.727 (Patch 8)
182
+ source: ModWright field verification
183
+ tags:
184
+ - roottemplates
185
+ - lsx
186
+ - lsf
187
+ - packaging
188
+ - scaffold
189
+ detail: "Consequence for ModWright: the baldursgate3.new-item scaffold writes
190
+ Public/<Mod>/RootTemplates/<Item>.lsx and the mod's build had no divine-lsx-to-lsf step, so
191
+ the scaffolded template never reached the engine even though the stats entry (which the row's
192
+ bg3.stat.exists probe checks) loads fine. The build already offers a divine-lsx-to-lsf step
193
+ (src/core/build/steps/bg3.ts); the scaffold now ensures it and a bg3.template.exists probe
194
+ backs the row (both landed 2026-09-10 and confirmed live on 2026-09-11). Other Public/<Mod>
195
+ folders a mod ships as .lsx (Lists, Progressions, ClassDescriptions, GUI atlases) do load as
196
+ .lsx; RootTemplates is the folder where only .lsf counted here."
197
+ - id: bg3.items.roottemplates.multiple-inventoryitem-nodes-roll-independently
198
+ claim: A single object can carry multiple InventoryList/InventoryItem child nodes, each naming a
199
+ different TreasureTable, and every listed table is rolled and its results all added to the
200
+ same inventory.
201
+ status: verified
202
+ verified_on: 4.73.98.727 (Patch 8)
203
+ source: ModWright field verification
204
+ tags:
205
+ - items
206
+ - treasuretable
207
+ - inventorylist
208
+ - multiple-tables
209
+ detail: 'Checked against the source (2026-09-08): an earlier wording added that "every listed table
210
+ is rolled independently and its results all added to the same inventory, rather than only the
211
+ first or a randomly chosen one being used". §"The 0.5th way" is a bare code block with no
212
+ prose at all — the two-node XML shape is attested, the rolling semantics are only the obvious
213
+ reading of it, so this is downgraded to inferred until someone spawns such an object and looks
214
+ in its inventory.'
215
+ - id: bg3.items.roottemplates.gameobjects-node-needs-type-stats-and-parenttemplateid-to-load
216
+ claim: "A RootTemplate GameObjects node that carries only MapKey, Name and VisualTemplate is not
217
+ loaded by the engine even when it ships as a correctly converted .lsf:
218
+ Ext.Template.GetTemplate returns nil for its MapKey and Osi.TemplateAddTo adds nothing. The
219
+ same node with Type \"item\", Stats \"<entry>\" and a ParentTemplateId (the vanilla template
220
+ of the stats entry's `using` parent) loads, resolves (templateType item) and spawns an item
221
+ that inherits the parent template's behaviour."
222
+ status: verified
223
+ verified_on: 4.73.98.727 (Patch 8)
224
+ source: ModWright field verification
225
+ tags:
226
+ - roottemplates
227
+ - gameobjects
228
+ - parenttemplateid
229
+ - scaffold
230
+ - template-exists
231
+ detail: "Which of Type, Stats and ParentTemplateId is individually required was not isolated (all
232
+ three were added at once, matching every loaded template on record: vanilla
233
+ WPN_HUM_Dagger_A_0, a class mod's own _merged.lsf nodes, and the 2026-09-10 chest repro). The
234
+ baldursgate3.new-item scaffold writes all three, taking the parent stat's RootTemplate as
235
+ ParentTemplateId."
236
+ - id: bg3.items.roottemplates.item-displayname-description-icon-live-on-the-roottemplate-not-the-stats-entry
237
+ claim: "An Armor or Weapon item's DisplayName, Description and Icon belong on its RootTemplate
238
+ GameObjects node (DisplayName/Description as TranslatedString attributes with handle=\"h…\"
239
+ version=\"1\", Icon as a FixedString), not as data lines on the stats entry: no vanilla Armor
240
+ or Weapon stats entry carries any of the three, and the Script Extender's stats object for a
241
+ Weapon has no DisplayName property at all (Ext.Stats.Get(\"WPN_Dagger\").DisplayName raises
242
+ \"Property does not exist\"), so a probe reading it can never pass. SpellData entries are
243
+ different: their DisplayName/Description are stats fields."
244
+ status: verified
245
+ verified_on: 4.73.98.727 (Patch 8)
246
+ source: ModWright field verification
247
+ tags:
248
+ - roottemplates
249
+ - displayname
250
+ - description
251
+ - icon
252
+ - localization
253
+ - stats
254
+ - scriptextender
255
+ detail: The scaffold's loca rows are unchanged (contentuid = the bare handle, version its own
256
+ attribute); the template references the same bare handle. The bg3.stat.fields probe on an item
257
+ row should ask only for fields the stats object really has (RootTemplate, Slot); ModWright's
258
+ baldursgate3.new-item does so.
259
+ - id: bg3.items.roottemplates.equipmenttypeid-must-be-guid-typed
260
+ claim: On a RootTemplate GameObjects node, EquipmentTypeID must be declared type="guid". Written as
261
+ type="FixedString" — the type its UUID-holding siblings VisualTemplate, ParentTemplateId and
262
+ MapKey correctly use, which is exactly what makes the mistake easy — the engine SILENTLY
263
+ ignores the attribute and falls back to default one-handed weapon handling (held in one hand,
264
+ no back-sheath, wrong attack animation), logging nothing. The wrong type is not a parse error
265
+ and does not fail the build; only the item's behaviour is wrong. A vanilla-corpus audit
266
+ (below) shows the other GUID-typed GameObjects attributes are Faction, EquipmentRace, AiHint,
267
+ DeathEffect, ColorPreset, and Race ON A CHARACTER template — but NOT Race on an item template,
268
+ where Race is a plain int8 flag (value 0/2/-1), not a GUID. The same silent-fallback failure
269
+ on those attributes is inferred by analogy; only the EquipmentTypeID case was field-observed.
270
+ status: verified
271
+ verified_on: 4.73.98.727 (Patch 8)
272
+ source: ModWright field verification
273
+ tags:
274
+ - items
275
+ - roottemplate
276
+ - gameobjects
277
+ - equipmenttypeid
278
+ - race
279
+ - faction
280
+ - guid
281
+ - attribute-type
282
+ - silent-fallback
283
+ - gotcha
284
+ related:
285
+ - id: bg3.weapons.custom-equipment-type
286
+ detail: Establishes what EquipmentTypeID references (the custom EquipmentType's UUID, which drives
287
+ idle/ sheath handling and the fallback animation set) — i.e. why the engine treats it as a
288
+ GUID and a FixedString mis-declaration loses the reference.
289
+ detail: "ModWright's bg3.items.roottemplate-guid-attribute-type validator (block) catches this from
290
+ the project's own .lsx with no index or toolchain: it walks every Templates/GameObjects node
291
+ and flags any attribute in a curated allowlist of always-guid RootTemplate attributes
292
+ (EquipmentTypeID, Faction, EquipmentRace, AiHint, DeathEffect, ColorPreset, and Race gated to
293
+ a character-Type node) whose declared type is not \"guid\", naming the file, the attribute and
294
+ the one-line fix. The Race gate is the load-bearing detail: an item template's Race is int8,
295
+ so an ungated rule would emit a block finding — with a \"change to guid\" fix — on every
296
+ faithful vanilla weapon/armor clone. The allowlist is deliberately narrow — the six
297
+ UUID-holding siblings (VisualTemplate, ParentTemplateId, MapKey, Icon,
298
+ CharacterVisualResourceID, PortraitVisualResourceID) are FixedString in vanilla, so a \"any
299
+ UUID-looking value must be guid\" rule would false-positive on all of them — and is extended
300
+ only as more always-guid attributes are confirmed. Object is excluded (guid, but only ever on
301
+ a child Tag/InventoryItem node, never on the GameObjects node itself); DisarmDifficultyClassID
302
+ is excluded (mixed guid/int32 in the corpus)."
303
+ - id: bg3.items.roottemplates.statuslist-gives-an-item-a-permanent-status
304
+ claim: "An item template's StatusList child (node \"StatusList\" > \"Status\" with attribute Object
305
+ = a status name) applies that status to every item created from the template, which is how the
306
+ Everburn Blade and three other vanilla weapons burn forever: their StatusList names
307
+ MAG_FIRE_ALWAYS_DIPPED_FIRE, a BOOST status `using DIPPED_FIRE` with
308
+ StatusEffectOverrideForItems 44d77ebf-fc9e-407d-b20f-257019351f2a (the dip flame),
309
+ StackPriority 10 and Boosts WeaponDamage(1d4, Fire). A mod status `using` it with Boosts \"\"
310
+ keeps the flame without the damage. Existing item instances are not retro-fitted; apply the
311
+ status once with Osi.ApplyStatus(<item>, \"<status>\", -1.0, 1)."
312
+ status: inferred
313
+ source: ModWright research
314
+ tags:
315
+ - roottemplates
316
+ - statuslist
317
+ - status
318
+ - weapon
319
+ - vfx
320
+ - everburn