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,386 @@
1
+ game: baldursgate3
2
+ topic: dialogue.osiris-goals
3
+ title: Osiris goal structure (INIT/KB/EXIT), goal hierarchy, and build errors
4
+ facts:
5
+ - id: bg3.dialogue.osiris-goals.init-kb-exit-sections
6
+ claim: 'Every Osiris goal script has three sections: INIT "will run only once when the goal
7
+ activates" (used for setup such as establishing characters); KB "is where the bulk of the
8
+ script goes" and is assessed while the goal is active; EXIT "contains logic that will only
9
+ execute when GoalCompleted is called", and "Once the EXIT section runs, the logic from your KB
10
+ section will no longer be evaluated by the game."'
11
+ status: community
12
+ source: docs.baldursgate3.game/index.php?title=Osiris:_Using_the_Story_Editor §Sections
13
+ tags:
14
+ - osiris
15
+ - goal
16
+ - init
17
+ - kb
18
+ - exit
19
+ - structure
20
+ - id: bg3.dialogue.osiris-goals.exit-clears-databases
21
+ claim: A goal's EXIT section is the conventional place to tidy up databases the goal no longer
22
+ needs, most commonly via SysClear("NameOfDatabaseGoesHere", Number) calls, since KB stops
23
+ being evaluated once EXIT runs.
24
+ status: community
25
+ source: docs.baldursgate3.game/index.php?title=Osiris:_Using_the_Story_Editor §Sections
26
+ tags:
27
+ - osiris
28
+ - goal
29
+ - exit
30
+ - sysclear
31
+ - databases
32
+ - id: bg3.dialogue.osiris-goals.goals-execute-top-to-bottom
33
+ claim: Goals — and Osiris in general — execute in the order they are listed in the Story Editor's
34
+ goal hierarchy, top to bottom, at the same nesting level.
35
+ status: community
36
+ source: docs.baldursgate3.game/index.php?title=Osiris:_Using_the_Story_Editor §Example ("goals are
37
+ executed from top to bottom")
38
+ tags:
39
+ - osiris
40
+ - goal
41
+ - execution-order
42
+ - goal-hierarchy
43
+ - id: bg3.dialogue.osiris-goals.parent-goal-must-complete-before-children-activate
44
+ claim: A parent goal executes first in full, and its child (sub-)goals only activate once the parent
45
+ fires a GoalCompleted event — a child goal placed under a parent that never completes will
46
+ never run.
47
+ status: community
48
+ source: docs.baldursgate3.game/index.php?title=Osiris:_Using_the_Story_Editor §Example ("parent
49
+ goals execute first, and will only activate their children once that parent goal is complete")
50
+ tags:
51
+ - osiris
52
+ - goal
53
+ - goal-hierarchy
54
+ - goalcompleted
55
+ - silent-failure
56
+ - id: bg3.dialogue.osiris-goals.act-region-situation-naming-convention
57
+ claim: New goal scripts conventionally follow an "Act_Region_Situation" naming pattern (e.g.
58
+ "Act3b_LOW_Applesnatcher" for a Lower City situation in Act 3b), and should be placed as a
59
+ sub-goal of the goal that represents the level/act being targeted, so the new goal doesn't
60
+ activate before that content is loaded.
61
+ status: community
62
+ source: docs.baldursgate3.game/index.php?title=Osiris:_Using_the_Story_Editor §Example
63
+ tags:
64
+ - osiris
65
+ - goal
66
+ - naming-convention
67
+ - act-region-situation
68
+ - id: bg3.dialogue.osiris-goals.modwrapper-gustav-scope
69
+ claim: ModWrapper_Gustav contains all quest logic that appears in the journal; systemics (e.g.
70
+ crime), achievements, spells, savegame patching, and tutorials all live in goals outside of
71
+ ModWrapper_Gustav.
72
+ status: community
73
+ source: docs.baldursgate3.game/index.php?title=Osiris:_Using_the_Story_Editor §Example
74
+ tags:
75
+ - osiris
76
+ - goal
77
+ - modwrapper-gustav
78
+ - scope
79
+ - id: bg3.dialogue.osiris-goals.must-save-before-renaming-new-goal
80
+ claim: A newly created goal script item must be saved in the Story Editor before it can be renamed;
81
+ if you rename it again right after creation without saving in between, the new name may not
82
+ stick, and closing and reopening the Story Editor may be needed to recover.
83
+ status: community
84
+ source: docs.baldursgate3.game/index.php?title=Osiris:_Using_the_Story_Editor §Example ("you must
85
+ first save after creating new script items before you can rename them")
86
+ tags:
87
+ - osiris
88
+ - goal
89
+ - save
90
+ - rename
91
+ - toolkit-gotcha
92
+ - id: bg3.dialogue.osiris-goals.generate-definitions-build-reload-workflow
93
+ claim: "Three reload paths, in decreasing cost: \"Generate Definitions, Build and Reload\" (Ctrl+F7)
94
+ builds and reloads story \"along with making it easier to find any new objects you have
95
+ created\"; \"Reload Level and Story\" (Ctrl+F8, in the main Editor) also reloads the level's
96
+ objects, which is what you need when characters have been defeated or items destroyed;
97
+ \"Reload Story\" (F8) alone \"save[s] some time\" when you made no script changes and don't
98
+ need the level reloaded."
99
+ status: community
100
+ source: "docs.baldursgate3.game/index.php?title=Osiris:_Using_the_Story_Editor §Generate
101
+ Definitions, Build and Reload; §Option 1: Reload Level and Story; §Option 2: Reload Story"
102
+ tags:
103
+ - osiris
104
+ - story-editor
105
+ - build
106
+ - reload
107
+ - workflow
108
+ - id: bg3.dialogue.osiris-goals.errors-panel-reports-every-goal-file
109
+ claim: The Story Editor's Errors panel at the bottom reports build errors and warnings from every
110
+ goal file in the project, not only the one currently open — a build failure elsewhere can
111
+ appear while editing an unrelated goal.
112
+ status: community
113
+ source: docs.baldursgate3.game/index.php?title=Osiris:_Using_the_Story_Editor §Sections
114
+ tags:
115
+ - osiris
116
+ - story-editor
117
+ - errors
118
+ - debugging
119
+ - id: bg3.dialogue.osiris-goals.db-checked-but-never-defined-error
120
+ claim: '"Database checked but never defined" "occurs if you have left a reference to a DB somewhere
121
+ in the KB section of your script, but you never defined the DB within the INIT section of the
122
+ script, nor as part of a THEN block. Either remove the check or define the DB to fix the
123
+ error."'
124
+ status: community
125
+ source: docs.baldursgate3.game/index.php?title=Osiris:_Using_the_Story_Editor §Common Build Errors
126
+ and Warnings > Database checked but never defined
127
+ tags:
128
+ - osiris
129
+ - build-error
130
+ - database
131
+ - kb
132
+ - id: bg3.dialogue.osiris-goals.type-mismatch-requires-explicit-recast
133
+ claim: A "Conflict with function definition" build error "means the Story Editor has been told a
134
+ single variable has multiple types"; the fix is to recast "by adding the expected type in ()s
135
+ before the variable name" at one of its uses — the page's worked example changes the
136
+ DB_Players check to DB_Players((CHARACTER)_Player) — and you should "avoid recasting the type
137
+ of a variable multiple times in the same code block".
138
+ status: community
139
+ source: docs.baldursgate3.game/index.php?title=Osiris:_Using_the_Story_Editor §Common Build Errors
140
+ and Warnings > Conflict with function definition
141
+ tags:
142
+ - osiris
143
+ - build-error
144
+ - type-mismatch
145
+ - recast
146
+ - id: bg3.dialogue.osiris-goals.qry-proc-color-coding
147
+ claim: '"A properly spelled query will have a brick red name, and procs will have a bright green
148
+ one" — so a QRY_/PROC_ name still rendering in the default colour is the tell for a misspelled
149
+ name, which is what the "Could not find any complete/correct definition of Osiris User
150
+ Query/Procedure" error usually means.'
151
+ status: community
152
+ source: docs.baldursgate3.game/index.php?title=Osiris:_Using_the_Story_Editor §Common Build Errors
153
+ and Warnings > Could not find any complete/correct definition of Osiris User Query/Procedure
154
+ tags:
155
+ - osiris
156
+ - story-editor
157
+ - qry
158
+ - proc
159
+ - debugging
160
+ - id: bg3.dialogue.osiris-goals.osi-div-source-file
161
+ claim: "Compiled Osiris goal scripts ship as story.div.osi, one per module:
162
+ Gustav/Mods/Gustav/Story/, Gustav/Mods/GustavDev/Story/ and Gustav/Mods/Honour/Story/. Extract
163
+ with LSLib's \"Story (OSI) tools\" section: put the file in \"Story/savegame file path\",
164
+ press Load, set \"Goal output path\", press Extract."
165
+ status: community
166
+ source: wiki.bg3.community/en/Information/Osiris/unpacking-osiris
167
+ tags:
168
+ - osiris
169
+ - story-div-osi
170
+ - lslib
171
+ - extraction
172
+ - id: bg3.dialogue.osiris-goals.rule-structure-if-and-then
173
+ claim: 'Every Osiris rule has exactly two parts: an IF section of one or more conditions, each on
174
+ its own line and separated by the line AND, evaluated whenever the rule is triggered; and a
175
+ THEN section of one or more actions, each on its own line and ending with ";", executed only
176
+ once every condition in the IF section evaluates true.'
177
+ status: community
178
+ source: 'bg3-community/Tutorials/Osiris/Understanding-Osiris-Rules.md §The Structure of an Osiris
179
+ Rule (lines 33-48: "This part begins with IF"; "Each condition is separated by the line AND";
180
+ "This part begins with THEN"; "Each action ends with ;")'
181
+ tags:
182
+ - osiris
183
+ - rule
184
+ - structure
185
+ - if-then
186
+ - id: bg3.dialogue.osiris-goals.fact-database-definitions
187
+ claim: A "fact" is a set of one or more values; a "database" is a container for zero or more unique
188
+ facts, analogous to a table of rows (facts) and columns (values) — a fact can be "defined"
189
+ (added) or removed from a database at any time, and a database rejects a second definition of
190
+ a fact it already holds.
191
+ status: community
192
+ source: 'bg3-community/Tutorials/Osiris/Understanding-Osiris-Rules.md §Basic Definitions (lines
193
+ 21-25: "Fact: A set of one or more values."; "Database: A container for zero or more unique
194
+ facts.")'
195
+ tags:
196
+ - osiris
197
+ - database
198
+ - fact
199
+ - definitions
200
+ - id: bg3.dialogue.osiris-goals.database-action-not-then-redefines-nothing
201
+ claim: Using a database as a THEN action defines (adds) the fact unless it is already defined, in
202
+ which case "the action won't do anything" — facts in a database must be unique, so the same
203
+ fact cannot be added a second time. Database actions must be used with a literal or an
204
+ already-assigned variable.
205
+ status: community
206
+ source: bg3-community/Tutorials/Osiris/Understanding-Osiris-Actions.md:15,19, §Databases ("Using a
207
+ database as an action will add a fact to the database unless the fact is already defined, in
208
+ which case the action won't do anything.")
209
+ tags:
210
+ - osiris
211
+ - database
212
+ - action
213
+ - idempotent
214
+ detail: 'Checked against the source (2026-09-08): an earlier wording also said such a rule "does not
215
+ re-trigger database conditions that already fired for it the first time". The page does not
216
+ say that anywhere; it only describes the add being a no-op. Dropped rather than promoted.'
217
+ - id: bg3.dialogue.osiris-goals.not-prefix-removes-database-fact
218
+ claim: Prefixing a database action with NOT removes that fact from the database if it is currently
219
+ defined (and is a no-op if it is not), which also re-triggers "inverted" database conditions
220
+ and allows the fact to be re-defined and trigger normal database conditions again afterward.
221
+ status: community
222
+ source: bg3-community/Tutorials/Osiris/Understanding-Osiris-Actions.md:17,41, §Databases ("We can
223
+ also invert database actions by adding `NOT` to the beginning of the line, which will remove a
224
+ fact from the database if it is already defined."; the worked example at :41 adds that this
225
+ triggers inverted database conditions and lets the fact be re-defined and trigger normal ones
226
+ again)
227
+ tags:
228
+ - osiris
229
+ - database
230
+ - not
231
+ - action
232
+ - id: bg3.dialogue.osiris-goals.condition-order-controls-evaluation-cost
233
+ claim: Combining two undeclared-variable database conditions on the SAME database before any
234
+ filtering condition makes the rule evaluate once per pair of facts (size(DB) squared,
235
+ described as "very inefficient"); reordering so a filtering condition (an equality check
236
+ against a known value) comes immediately after the first database condition collapses most of
237
+ those evaluations before the second database condition ever creates new versions of the rule,
238
+ avoiding the exponential blow-up.
239
+ status: community
240
+ source: 'bg3-community/Tutorials/Osiris/Considering-Performance.md §Number of Evaluations (worked
241
+ DB_Players example: "the number of times this rule has to be evaluated is the size of
242
+ DB_Players multiplied by itself. This is very inefficient." / the reordered version: "the
243
+ number of evaluations no longer grows exponentially")'
244
+ tags:
245
+ - osiris
246
+ - performance
247
+ - condition-order
248
+ - database
249
+ detail: "Practical rule of thumb for authoring: put the most selective filter condition as early as
250
+ possible after each undeclared-variable database condition, rather than grouping all database
251
+ conditions together before any filters."
252
+ - id: bg3.dialogue.osiris-goals.overloaded-procedure-with-default-parameter
253
+ claim: 'A procedure can be declared with two different parameter counts (an overload) to emulate a
254
+ default parameter value: PROC_MyProc() calling PROC_MyProc("This is the default message")
255
+ inside its own body makes calling the zero-argument form behave identically to calling the
256
+ one-argument form with that literal, while a caller can still supply a different string
257
+ explicitly via the one-argument form.'
258
+ status: community
259
+ source: bg3-community/Tutorials/Osiris/Understanding-Osiris-Actions.md:191-201, §Procedures ("If you
260
+ define the procedure more than once with different numbers of parameters, they will behave
261
+ like completely different procedures. We can use this to make our own default values"; worked
262
+ PROC_MyProc example with and without a (STRING)_Message parameter)
263
+ tags:
264
+ - osiris
265
+ - procedure
266
+ - overload
267
+ - default-parameter
268
+ - id: bg3.dialogue.osiris-goals.variables-start-with-underscore-convention
269
+ claim: The Osiris naming convention for variables is to always start with an underscore ("_"),
270
+ distinguishing a variable (e.g. _Player, _Character) from a literal, function name, or
271
+ database name in the same line of code.
272
+ status: community
273
+ source: 'bg3-community/Tutorials/Osiris/Understanding-Osiris-Conditions.md:102 ("The naming
274
+ convention for variables in Osiris is to always start with an underscore: _")'
275
+ tags:
276
+ - osiris
277
+ - naming-convention
278
+ - variables
279
+ - id: bg3.dialogue.osiris-goals.query-return-database-naming-convention
280
+ claim: The recommended naming convention for a database that only exists to capture a custom query's
281
+ return value is DB_QRYRTN_QueryName — e.g. a query QRY_CustomGetHitpoints would store its
282
+ result in DB_QRYRTN_CustomGetHitpoints.
283
+ status: community
284
+ source: 'bg3-community/Tutorials/Osiris/Understanding-Osiris-Conditions.md:645 ("A good naming
285
+ convention for query-return databases is: DB_QRYRTN_QueryName")'
286
+ tags:
287
+ - osiris
288
+ - naming-convention
289
+ - query
290
+ - database
291
+ - id: bg3.dialogue.osiris-goals.qry-onlyonce-fire-once-utility
292
+ claim: QRY_OnlyOnce is a built-in query that takes a string in-parameter and evaluates true only the
293
+ first time it is ever called with that particular string, even across multiple
294
+ concurrently-evaluating versions of the same rule — the documented pattern for making a
295
+ multiply-triggered rule fire exactly once per distinct key.
296
+ status: community
297
+ source: bg3-community/Tutorials/Osiris/Understanding-Osiris-Conditions.md:689 ("there is a query
298
+ `QRY_OnlyOnce` that takes a string as an in-parameter and only evaluates to true the first
299
+ time it is called with that particular string."; the next sentence adds that it evaluates true
300
+ for only one of several concurrently-evaluating versions of a rule)
301
+ tags:
302
+ - osiris
303
+ - qry-onlyonce
304
+ - deduplication
305
+ - utility-query
306
+ - id: bg3.dialogue.osiris-goals.calls-require-constant-or-assigned-variable
307
+ claim: Every in-parameter to an Osiris Call must be given either a constant/literal value or an
308
+ already- assigned variable — a Call cannot be given an undeclared (unassigned) variable the
309
+ way a database condition can, since a Call has no mechanism to enumerate possible values for
310
+ it.
311
+ status: community
312
+ source: bg3-community/Tutorials/Osiris/Understanding-Osiris-Actions.md §Calls ("Every call has one
313
+ or more in-parameters that must be given a constant value or an assigned variable so that it
314
+ knows exactly what we want it to do")
315
+ tags:
316
+ - osiris
317
+ - call
318
+ - variable
319
+ - constraint
320
+ - id: bg3.dialogue.osiris-goals.hardcoded-guid-literal-is-most-efficient-condition-form
321
+ claim: "When a rule only cares about specific, known characters, writing their GUIDs directly as
322
+ literals inside the database condition (e.g. DB_Players(S_Player_Wyll_c774d764-...)) instead
323
+ of an undeclared variable plus a separate equality filter is the most efficient form: the rule
324
+ then has exactly one version and only triggers for evaluation when one of the literal facts
325
+ itself is added or removed — strictly better than the \"declared variable filtered right after
326
+ its database condition\" pattern this topic's other performance fact recommends when the
327
+ target isn't a fixed, known value."
328
+ status: community
329
+ source: bg3-community/Tutorials/Osiris/Considering-Performance.md §Number of Evaluations (final
330
+ worked example and "This is incredibly efficient in both regards")
331
+ tags:
332
+ - osiris
333
+ - performance
334
+ - database
335
+ - literal
336
+ - condition-order
337
+ related:
338
+ - id: bg3.dialogue.osiris-goals.condition-order-controls-evaluation-cost
339
+ detail: "Names the even-more-efficient special case of that fact's general reordering advice: when
340
+ the values being matched are fixed and known ahead of time, skip the
341
+ undeclared-variable-plus-filter pattern entirely and hard-code the literal into the
342
+ database condition itself."
343
+ - id: bg3.dialogue.osiris-goals.player-membership-databases-are-distinct
344
+ claim: DB_Players (all registered player character UUIDs), DB_Avatars (registered player Avatar
345
+ character UUIDs), and DB_PartyMembers (currently registered party member UUIDs) are three
346
+ separately maintained, single-parameter (Character UUID) databases with distinct descriptions
347
+ in the db reference, listed as separate rows under Character Management.
348
+ status: community
349
+ source: bg3-community/Information/Osiris/db-reference/character-dbs.md:25-30, §Character Management
350
+ (DB_Players, DB_Avatars, DB_PartyMembers rows, each "1|Character UUID")
351
+ tags:
352
+ - osiris
353
+ - database
354
+ - db-players
355
+ - db-avatars
356
+ - db-partymembers
357
+ - gotcha
358
+ detail: "Inference, not in the source: because they are separately maintained, picking the wrong one
359
+ for a rule's intent (\"everyone in the current party\" vs. \"every player character that
360
+ exists\") will include or exclude characters the author did not mean to. The reference table
361
+ states the three descriptions only; it does not compare them or warn about the mix-up."
362
+ - id: bg3.dialogue.osiris-goals.raw-goal-txt-in-a-pak-is-inert-without-a-story-compile
363
+ claim: "A goal shipped only as Mods/<Mod>/Story/RawFiles/Goals/<Goal>.txt inside a pak does not
364
+ exist at runtime: its INIT database is nil (Osi.DB_<name> is nil, indexing it raises \"attempt
365
+ to index a nil value\"), and Osi.QuestUpdate for the journal entry it names returns without
366
+ error and shows nothing in the journal. The goal has to be compiled into the module's story
367
+ (the toolkit's Generate Definitions / Build) before the pak carries anything the engine runs."
368
+ status: verified
369
+ verified_on: 4.73.98.727 (Patch 8)
370
+ source: ModWright field verification
371
+ tags:
372
+ - osiris
373
+ - goals
374
+ - story-compile
375
+ - pak
376
+ - quest-stub
377
+ - journal
378
+ - scaffold
379
+ related:
380
+ - bg3.dialogue.osiris-goals.generate-definitions-build-reload-workflow
381
+ - bg3.dialogue.osiris-goals.osi-div-source-file
382
+ detail: The loca handles the scaffold wrote (journal title and entry text) resolved through
383
+ Ext.Loca.GetTranslatedString in the same session, so the loca half of the scaffold loads.
384
+ Whether the journal .lsx under Mods/<Mod>/Story/Journals loads as loose .lsx was not separated
385
+ from the missing compile; the RootTemplates rule (loose .lsx not loaded, .lsf needed) suggests
386
+ it does not.
@@ -0,0 +1,122 @@
1
+ game: baldursgate3
2
+ topic: dialogue
3
+ title: Vanilla dialogue editing, pipeline correction, and dialog override delivery
4
+ facts:
5
+ - id: bg3.dialogue.binary-source-not-editor
6
+ claim: "Never patch the shipped editor .lsj under Mods/<ns>/Story/Dialogs/ — it carries an extra
7
+ top-level editorData REGION and an older save version (4.5.0.500 vs the binary's 4.6.0.1), and
8
+ Divine bakes both into the converted .lsf. Correct source: extract the vanilla
9
+ DialogsBinary/*.lsf, convert lsf→lsj (drops editor junk, right version), patch THAT, convert
10
+ back lsj→lsf."
11
+ status: verified
12
+ verified_on: 4.73.98.727 (Patch 8)
13
+ source: ModWright field verification
14
+ tags:
15
+ - dialogue
16
+ - editing
17
+ - editor
18
+ - binary
19
+ - pipeline
20
+ detail: The editor .lsj is still the best READING copy (it has logicalname labels the binary lacks),
21
+ but it is not the correct patching source. Round-trips cleanly; a patched file lands at
22
+ ~vanilla size (a bloated output means editor junk came along).
23
+ - id: bg3.dialogue.node-structure
24
+ claim: "Dialog node graph: save.regions.dialog.nodes[0].node[]. Constructors include TagGreeting
25
+ (entry, per checkflags), TagQuestion (player option), TagAnswer, ActiveRoll (an option with
26
+ dice: RollType/Ability/Skill/DifficultyClassID guid), RollResult (Success bool → children),
27
+ Jump (jumptarget + jumptargetpoint: 2 = target's children), Alias."
28
+ status: verified
29
+ verified_on: 4.73.98.727 (Patch 8)
30
+ source: ModWright field verification
31
+ tags:
32
+ - dialogue
33
+ - node-graph
34
+ - structure
35
+ detail: Add an option = clone a donor node in the SAME dialog (keeps field shapes valid), give it a
36
+ new UUID, and splice it into the parent's children[0].child list at the position you want it
37
+ shown.
38
+ - id: bg3.dialogue.class-gate-tag-rules
39
+ claim: Gate an option by class with either TaggedText RuleGroup tag rules (what vanilla [WIZARD]
40
+ options use; auto-renders the tag DisplayName prefix) or a checkflags flaggroup type="Tag"
41
+ {UUID=<tag guid>, value=true, paramval=<speaker index>} (no auto-prefix, so custom "[Hack]
42
+ ..." text works). The player's speaker index varies per dialog — read speakerlist.
43
+ status: verified
44
+ verified_on: 4.73.98.727 (Patch 8)
45
+ source: ModWright field verification
46
+ tags:
47
+ - dialogue
48
+ - gating
49
+ - class
50
+ - tags
51
+ detail: "Verified by hand end-to-end in game: a custom [Hack] option passes the class gate (pod
52
+ console; Withers crypt dialog)."
53
+ - id: bg3.dialogue.override-cannot-ship-in-pak
54
+ claim: "Earlier rule (v1.5.3.1): dialog overrides CANNOT ship inside a registered mod pak — any
55
+ Mods/<vanilla-module>/Story/DialogsBinary/*.lsf in the pak was said to CTD at LoadModule, even
56
+ a byte-exact copy of vanilla, so overrides had to be deployed as loose files under the game's
57
+ Data/Mods/<ns>/Story/DialogsBinary/."
58
+ status: contradicted
59
+ source: ModWright research
60
+ tags:
61
+ - dialogue
62
+ - pak
63
+ - override
64
+ - delivery
65
+ detail: Kept so the mistake is not remade. The rule stood for a full release cycle and shaped
66
+ dialogue strategy (it is why the namespaced DialogBank workaround was built). Superseded by
67
+ bg3.dialogue.override-packing-rule-was-wrong. Loose files under
68
+ Data/Mods/<ns>/Story/DialogsBinary/ do still load — that half of the rule is correct and is
69
+ the fast dev-iteration route.
70
+ - id: bg3.dialogue.override-packing-rule-was-wrong
71
+ claim: Dialog overrides CAN be packed. A pak containing all 22 binary-derived
72
+ Mods/<vanilla-module>/Story/DialogsBinary overrides launched with NO crash (verified by hand),
73
+ and the [Hack] options fire from the pak.
74
+ status: verified
75
+ verified_on: 4.73.98.727 (Patch 8)
76
+ supersedes: bg3.dialogue.override-cannot-ship-in-pak
77
+ source: ModWright field verification
78
+ tags:
79
+ - dialogue
80
+ - pak
81
+ - override
82
+ - misattribution
83
+ detail: The original CTD was "almost certainly" the editor-vs-binary save-version bug (editor .lsj
84
+ 4.5.0.500 baked into the .lsf vs the binary's 4.6.0.1) — the same root cause that broke the
85
+ loose files before the pipeline switched to binary-derived sources; it was misattributed to
86
+ "packing dialogs." The release pak now folds DialogOverrides/{Gustav,GustavDev} into its Mods/
87
+ tree. The loose-file route still works for fast dev iteration but is no longer required for
88
+ distribution.
89
+ - id: bg3.dialogue.dialogbank-namespaced-pattern
90
+ claim: "Community non-override layout (Various Dialogue Fixes / wiki.bg3.community Dialogue Files
91
+ Tutorial): ship each edited .lsf at Mods/<mod>/Story/DialogsBinary/<same rel path> and add a
92
+ DialogBank at Public/<mod>/Content/Assets/Dialogs/[PAK]_<BankName>/_merged.lsf whose Resource
93
+ nodes are byte-for-byte copies of the vanilla entries (same resource ID, Name, flags,
94
+ SpeakerSlotsWithLines) with only SourceFile re-pointed to Mods/<mod>/Story/Dialogs/<rel>.lsj.
95
+ The game resolves the DialogsBinary .lsf through that .lsj path (no .lsj needs to ship)."
96
+ status: verified
97
+ verified_on: 4.73.98.727 (Patch 8)
98
+ source: ModWright field verification
99
+ tags:
100
+ - dialogue
101
+ - dialogbank
102
+ - namespaced
103
+ - toolkit
104
+ detail: "A class mod shipped 22 such Resource nodes in its own [PAK]_ dialogue bank. Needed because
105
+ the Toolkit packs only the project's own Mods/<proj> + Public/<proj> folders, so
106
+ path-overrides into Gustav(Dev) never reach the mod.io pak. Load-order aware; shows in the
107
+ in-game mod manager. Verified by hand: the options fire from the namespaced test pak;
108
+ extract+diff confirmed all 22 lsf byte-identical plus the bank."
109
+ - id: bg3.dialogue.flags-guid-definitions
110
+ claim: Dialogs reference flags by GUID; definitions are one-per-file Public/Gustav/Flags/<guid>.lsf
111
+ (convert to .lsx, read Name). The Osiris FLAG identifier is Name_GUID.
112
+ Osi.SetFlag("Name_GUID", char) WORKS (actions are fine); Osi.GetFlag is broken like the other
113
+ queries (returned 0 for a provably-set flag).
114
+ status: verified
115
+ verified_on: 4.73.98.727 (Patch 8)
116
+ source: ModWright field verification
117
+ tags:
118
+ - dialogue
119
+ - flags
120
+ - guid
121
+ - osiris
122
+ detail: Use SetFlag to arm flags from dialogue; do not rely on GetFlag for queries in this SE build.
@@ -0,0 +1,164 @@
1
+ game: baldursgate3
2
+ topic: feats.classes
3
+ title: Basic class creation, and the feats-as-passives pattern
4
+ facts:
5
+ - id: bg3.feats.classes.classdescription-required-attributes
6
+ claim: A ClassDescription node's practical minimum attribute set is BaseHp, CharacterCreationPose (a
7
+ guid, commonly reused from a vanilla class), Description and DisplayName (TranslatedString
8
+ handles), HpPerLevel, LearningStrategy, Name (FixedString), PrimaryAbility (uint8),
9
+ ProgressionTableUUID, SoundClassType (FixedString, can reuse a vanilla class's),
10
+ SpellCastingAbility (uint8), and UUID.
11
+ status: community
12
+ source: wiki.bg3.community/en/Tutorials/Classes/Basic-Class-Creation §ClassDescription.lsx
13
+ tags:
14
+ - class
15
+ - classdescription
16
+ - required-fields
17
+ - id: bg3.feats.classes.hpperlevel-adds-one
18
+ claim: 'The engine adds 1 to the HpPerLevel value: "Please be aware that it takes what value you put
19
+ here and adds 1 to it. So the 4 I put here plus the basehp i put as 6 will give me 11, not
20
+ 10." Author HpPerLevel one lower than the per-level gain you want.'
21
+ status: community
22
+ source: wiki.bg3.community/en/Tutorials/Classes/Basic-Class-Creation §ClassDescription.lsx
23
+ tags:
24
+ - class
25
+ - classdescription
26
+ - hpperlevel
27
+ - gotcha
28
+ - id: bg3.feats.classes.primaryability-numeric-mapping
29
+ claim: ClassDescription's PrimaryAbility (and SpellCastingAbility) attribute is a uint8 ability
30
+ index, given on the page as "1 = dex, 2 = str, 3 = con, 4 = int, 5 = wis, 6 = chr" — note
31
+ Dexterity is 1 and Strength is 2, not the usual STR-first order.
32
+ status: community
33
+ source: wiki.bg3.community/en/Tutorials/Classes/Basic-Class-Creation §ClassDescription.lsx
34
+ tags:
35
+ - class
36
+ - classdescription
37
+ - primaryability
38
+ - enum
39
+ - id: bg3.feats.classes.subclass-is-classdescription-with-parentguid
40
+ claim: A subclass is defined as its own ClassDescription node whose ParentGuid equals the base class
41
+ ClassDescription's UUID, and which needs its own newly-generated ProgressionTableUUID distinct
42
+ from the base class's and from every other subclass's.
43
+ status: community
44
+ source: wiki.bg3.community/en/Tutorials/Classes/Basic-Class-Creation §Subclasses
45
+ tags:
46
+ - class
47
+ - subclass
48
+ - parentguid
49
+ - progressiontableuuid
50
+ - id: bg3.feats.classes.subclass-listed-under-parent-progression
51
+ claim: A subclass becomes choosable at a given level by adding a SubClasses/SubClass child node
52
+ (Object = the subclass's ClassDescription UUID) to the base class's Progression node for that
53
+ level, and the subclass's own Progression node(s) must set ProgressionType to 1 (versus 0 for
54
+ the base class).
55
+ status: community
56
+ source: wiki.bg3.community/en/Tutorials/Classes/Basic-Class-Creation §Subclasses
57
+ tags:
58
+ - class
59
+ - subclass
60
+ - progression
61
+ - progressiontype
62
+ - id: bg3.feats.classes.actionresourcedefinition-required-fields
63
+ claim: A custom class resource is defined in ActionResourceDefinitions.lsx with Description and
64
+ DisplayName (TranslatedString handles), MaxLevel (uint32), Name (FixedString — the worked
65
+ example uses "SpeedForce", the same string that then appears in the
66
+ ActionResource(SpeedForce,2,0) boost), ReplenishType (FixedString, "ShortRest" in the
67
+ example), IsSpellResource (bool), ShowOnActionResourcePanel (bool), and its own UUID (guid).
68
+ status: community
69
+ source: wiki.bg3.community/en/Tutorials/Classes/Basic-Class-Creation §Action Resources
70
+ tags:
71
+ - class
72
+ - actionresourcedefinition
73
+ - required-fields
74
+ - id: bg3.feats.classes.actionresource-granted-via-boosts
75
+ claim: "A custom ActionResourceDefinition only takes effect once granted through a Progression's
76
+ Boosts string, e.g. ActionResource(SpeedForce,2,0): \"We have made a new action resource but
77
+ right now it just floating around.\""
78
+ status: community
79
+ source: wiki.bg3.community/en/Tutorials/Classes/Basic-Class-Creation §Action Resources
80
+ tags:
81
+ - class
82
+ - actionresourcedefinition
83
+ - boosts
84
+ - silent-failure
85
+ - id: bg3.feats.classes.tags-live-in-children-node
86
+ claim: A ClassDescription (or subclass) links to its Tags entry through a children/Tags node
87
+ carrying an Object guid attribute — not through an attribute on ClassDescription itself; the
88
+ tag's own .lsx file "should be a new unique uuid" as its filename, and that filename UUID is
89
+ what other files reference.
90
+ status: community
91
+ source: wiki.bg3.community/en/Tutorials/Classes/Basic-Class-Creation §Tags > Make tag file, §Use
92
+ Tag; filename-vs-internal-UUID rule from the Community Library wiki, Building-a-Race-Mod
93
+ §Anatomy of a Tag
94
+ tags:
95
+ - class
96
+ - tags
97
+ - structure
98
+ detail: The Basic-Class-Creation page shows the structure and the uuid-named tag file but does not
99
+ spell out which of the tag's two UUIDs to reference; that is stated explicitly on the
100
+ Community Library race page — see
101
+ bg3.races.progression.tag-filename-differs-from-internal-uuid.
102
+ - id: bg3.feats.classes.passivesadded-vs-selectpassives-selector
103
+ claim: "Passives can reach a class two ways with different semantics: PassivesAdded on the
104
+ Progression node unconditionally grants a fixed, named passive at that level; a
105
+ SelectPassives(...) inside Selectors lets the player choose among a PassiveList's options. Use
106
+ PassivesAdded for something the class always gets, SelectPassives only when the player must
107
+ pick."
108
+ status: community
109
+ source: wiki.bg3.community/en/Tutorials/Classes/Basic-Class-Creation §Selectors ("SelectPassives()
110
+ takes 3 parameters...the UUID of the list of passives, the amount of options you can select"),
111
+ §Boosts and PassivesAdded/Removed (Progressions.lsx) > PassivesAdded/Removed
112
+ tags:
113
+ - class
114
+ - passivesadded
115
+ - selectors
116
+ - selectpassives
117
+ - id: bg3.feats.classes.boosts-vs-passivesadded-distinction
118
+ claim: 'Boosts and PassivesAdded on a Progression node are different attributes, not two spellings
119
+ of the same thing: Boosts holds inline boost-function strings ("things our class should get,
120
+ like maybe certain weapon proficiencies, different actions resources...debuffs, buffs, ability
121
+ changes"), while PassivesAdded holds names that "refer to passives found in Passive.txt".'
122
+ status: community
123
+ source: wiki.bg3.community/en/Tutorials/Classes/Basic-Class-Creation §Boosts and
124
+ PassivesAdded/Removed (Progressions.lsx) > Boosts, > PassivesAdded/Removed
125
+ tags:
126
+ - class
127
+ - boosts
128
+ - passivesadded
129
+ - progressions
130
+ detail: 'Both are semicolon-separated lists (Community Library wiki, Building-a-Race-Mod §Racial
131
+ Progressions: "PassivesAdded: A semicolon-separated list of passive IDs").'
132
+ - id: bg3.feats.classes.level1-progression-required-for-cc
133
+ claim: A class requires at minimum a Level 1 Progression node with its TableUUID matching the
134
+ ClassDescription's ProgressionTableUUID; without one the class cannot progress past the
135
+ character-creation screen ("your class does require a level 1 progression to make it past the
136
+ character creation page").
137
+ status: community
138
+ source: wiki.bg3.community/en/Tutorials/Classes/Basic-Class-Creation §Progressions.lsx
139
+ tags:
140
+ - class
141
+ - progressions
142
+ - level1
143
+ - character-creation
144
+ - id: bg3.feats.classes.feats-follow-passive-boost-pattern
145
+ claim: "A Feat is the same injection target as a Progression: the Compatibility Framework's config
146
+ and API take FileType \"Feat\" or \"Progression\" interchangeably for both Strings (Type
147
+ Boosts, PassivesAdded, PassivesRemoved, Requirements) and Selectors, so a feat is authored as
148
+ the PassivesAdded/Boosts pattern applied to a Feats entry rather than to a Progression node."
149
+ status: community
150
+ source: BG3-Compatibility-Framework wiki, _Boosts-and-Passives.md §API ("FileType = either
151
+ Progression or Feat, defaults to Progression if not included") and _Selector-API.md (Feats
152
+ config entries); pattern side from
153
+ wiki.bg3.community/en/Tutorials/Classes/Basic-Class-Creation §Boosts and PassivesAdded/Removed
154
+ (Progressions.lsx)
155
+ tags:
156
+ - feat
157
+ - passive
158
+ - boost
159
+ - source-gap
160
+ detail: "Recorded because no feat-specific tutorial exists to cite: feats are not independently
161
+ documented on wiki.bg3.community as of this writing, a real gap rather than an artifact of
162
+ search limitations. This fact says plainly that feats are the passive/boost pattern applied to
163
+ Feats.lsx — an analogy backed by the framework's own FileType enum, not by a feat
164
+ walkthrough."