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,293 @@
1
+ game: baldursgate3
2
+ topic: stats.boosts
3
+ title: Boost mechanics, BoostContext, BoostConditions, and conditional evaluation
4
+ facts:
5
+ - id: bg3.boosts.boostcontext-evaluation-events
6
+ claim: BoostContext is the list of events on which the engine EVALUATES a boost — it is not a
7
+ "re-check as well" hint. Omit the event that represents initial evaluation and the boost never
8
+ applies at all with no error. ~42 of ~46 vanilla usages include OnCreate (OnEquip;OnCreate
9
+ ×20, bare OnCreate ×18).
10
+ status: verified
11
+ verified_on: 4.73.98.727 (Patch 8)
12
+ source: ModWright field verification
13
+ tags:
14
+ - boost
15
+ - boostcontext
16
+ - oncreate
17
+ - silent-failure
18
+ detail: "A class mod's on-cast charge passive shipped completely inert (no icon glow, slot still
19
+ consumed, no on-cast damage) for a full relaunch cycle, while the toggle itself worked fine —
20
+ which is what made it confusing. The 5 vanilla entries using OnDamaged;OnHealed with no
21
+ OnCreate are bloodied-style buffs deliberately OFF until you are hurt; copying that pair onto
22
+ an at-will toggle makes it permanently dead. Pattern: if a boost should be live the moment its
23
+ source exists, either include OnCreate or omit BoostContext/BoostConditions entirely."
24
+ - id: bg3.boosts.context-source-invalid-hp-percent
25
+ claim: "context.Source is not an attested qualifier for HasHPPercentageLessThan in a Conditions
26
+ field: all 4 vanilla Conditions usages qualify with context.Observer, and BoostConditions
27
+ usages are bare or context.Target. The expectation is that context.Source makes the entire
28
+ condition string evaluate false, silently stopping every functor gated by it."
29
+ status: inferred
30
+ source: ModWright research
31
+ tags:
32
+ - boost
33
+ - conditions
34
+ - context
35
+ - hp-percent
36
+ - silent-failure
37
+ detail: "A class mod's diagnostic passive whose Conditions read \"... HasHPPercentageLessThan(15,
38
+ context.Source)\" was the prime suspect for a load-CTD (bisect-isolated: the previous version
39
+ loads, the next CTDs at module load), on the reasoning that an unresolvable qualifier in a
40
+ parsed condition is a candidate stats-load crash. The following version removed the entire
41
+ diagnostic harness rather than isolating the term, so the failure mode is reasoned, not seen.
42
+ Do the census before using any qualified context in a new field: grep -rho 'data \"<Field>\"
43
+ \"[^\"]*<Func>[^\"]*\"'."
44
+ - id: bg3.boosts.context-observer-invalid-oncast-self
45
+ claim: context.Observer ALSO fails in a plain OnCast-on-self passive Conditions field. The 4 vanilla
46
+ context.Observer uses are all reaction/interrupt passives with a genuine Observer entity. In
47
+ an OnCast passive that fires on the caster there is no Observer, so the term evaluates false
48
+ and the whole and-chain dies silently.
49
+ status: verified
50
+ verified_on: 4.73.98.727 (Patch 8)
51
+ source: ModWright field verification
52
+ tags:
53
+ - boost
54
+ - conditions
55
+ - context.observer
56
+ - oncast
57
+ - silent-failure
58
+ detail: "Symptom: the free cast worked, the HP self-charge never fired. The charge condition was
59
+ \"and not HasHPPercentageLessThan(15, context.Observer)\" on the mod's passive. Fix: use the
60
+ BARE form HasHPPercentageLessThan(15) (defaults to the functor's own entity = the caster), or
61
+ don't gate the functor at all and gate via the source status's own RemoveConditions — the
62
+ mod's fix was a status that removes itself below 15% via RemoveConditions
63
+ \"HasHPPercentageLessThan(15)\" + RemoveEvents \"OnDamage\" (precedent MAG_LOWHP_IGNORE_AOO),
64
+ which then makes the passive's HasStatus() gate false, so one mechanism gates both the free
65
+ cast and the charge."
66
+ - id: bg3.boosts.context-qualifier-field-specific
67
+ claim: A context qualifier proven valid in one field+functor context is NOT automatically valid in
68
+ another; match it to the entities the functor context actually provides, and run a
69
+ field-by-field vanilla census before using any qualified context in a new field.
70
+ status: inferred
71
+ source: ModWright research
72
+ tags:
73
+ - boost
74
+ - conditions
75
+ - context
76
+ - field-specific
77
+ detail: "The worked case: context.Observer is vanilla-attested in reaction/interrupt passive
78
+ Conditions and fails in an OnCast-on-self passive (see
79
+ bg3.boosts.context-observer-invalid-oncast-self). Census command: grep -rho 'data \"<Field>\"
80
+ \"[^\"]*<Func>[^\"]*\"'."
81
+ - id: bg3.boosts.toggled-passive-oncast-dead-until-on
82
+ claim: IsToggled passives sit OFF by default, and a toggled-off passive's OnCast StatsFunctors NEVER
83
+ fire. Applying the linked status directly (bypassing the toggle) gives you the status's boosts
84
+ but not the passive's cast hooks — which looks exactly like "the functor silently doesn't
85
+ work".
86
+ status: verified
87
+ verified_on: 4.73.98.727 (Patch 8)
88
+ source: ModWright field verification
89
+ tags:
90
+ - boost
91
+ - toggles
92
+ - oncast
93
+ - forced-cast
94
+ detail: Test protocols must toggle the passive ON (in-game click or toggle functors) and keep status
95
+ presence coupled to toggle state via ToggleOnFunctors/ToggleOffFunctors. Separately, a forced
96
+ Osi.UseSpell cast resolves at spell power level 0 (not the selected level) — see
97
+ bg3.se.use-spell-forced-cast.
98
+ - id: bg3.boosts.arcane-battery-toggle-pattern
99
+ claim: "The safest shape for a toggled slot-free-cast is the vanilla Arcane Battery split: the
100
+ passive carries IsToggled + ToggleOn/OffFunctors + the OnCast functors, and a status carries
101
+ the UnlockSpellVariant boost. MAG_MagicItemPoweredCast_Passive + MAG_MAGIC_ITEM_POWERED_CAST
102
+ are the template."
103
+ status: verified
104
+ verified_on: 4.73.98.727 (Patch 8)
105
+ source: ModWright field verification
106
+ tags:
107
+ - boost
108
+ - toggle
109
+ - free-cast
110
+ - arcane-battery
111
+ - pattern
112
+ detail: TAD_Freecast proves a toggled passive CAN hold UnlockSpellVariant in its own Boosts — but
113
+ note it has no BoostConditions/BoostContext at all. BoostConditions/BoostContext have zero
114
+ vanilla precedent on any StatusData (they are Passive-only fields), which is why a class mod
115
+ gates its status with RemoveConditions instead.
116
+ - id: bg3.boosts.diagnosis-dead-condition
117
+ claim: To diagnose a dead condition string, put each candidate term in its own IsHidden passive with
118
+ StatsFunctorContext "OnCast" and StatsFunctors "ApplyStatus(SELF,<distinct marker>,100,2)".
119
+ One cast then shows, on the portrait, exactly which terms parse and evaluate true. Keep each
120
+ probe in a SEPARATE passive — a malformed condition kills its own entry's functors, which is
121
+ what makes the isolation useful.
122
+ status: verified
123
+ verified_on: 4.73.98.727 (Patch 8)
124
+ source: ModWright field verification
125
+ tags:
126
+ - boost
127
+ - debugging
128
+ - conditions
129
+ - diagnostic
130
+ detail: "The marker form is what proved the character-level weapon gate dead in one cycle: a class
131
+ mod paired IF(CharacterLevelGreaterThan(3)):WeaponProperty(Magical) with a visible
132
+ IF(CharacterLevelGreaterThan(3)):WeaponDamage(1,Thunder) on the same condition, and the tester
133
+ reported no \"+1 Thunder\" at L4. Note the counter-case: that mod's six-probe harness was
134
+ itself suspected of a load-CTD and deleted before it produced any reading — a probe that
135
+ carries unproven syntax can cost a cycle instead of saving one."
136
+ - id: bg3.boosts.statusdata-boosts-apply-on-applystatus
137
+ claim: bg3.boosts.boostcontext-evaluation-events' "no OnCreate -> never applies" rule is confirmed
138
+ for PassiveData only. On StatusData, a Boosts field was observed to evaluate at ApplyStatus
139
+ (i.e. the moment the status is first applied) independent of BoostContext's
140
+ re-evaluation-event semantics — a class mod status's free-cast ModifyUseCosts boost applied
141
+ correctly with BoostContext "OnDamaged;OnHealed" and no OnCreate, deliberately run despite
142
+ ModWright's validator (bg3.history.boostcontext-initial-event) warning on it.
143
+ status: verified
144
+ verified_on: 2026-09-08
145
+ source: ModWright field verification
146
+ tags:
147
+ - boost
148
+ - boostcontext
149
+ - statusdata
150
+ - passivedata
151
+ - applystatus
152
+ - asymmetry
153
+ detail: 'An acceptance regression put BoostContext "OnDamaged;OnHealed" back on the status (not the
154
+ passive, where the free-cast mechanism now actually lives). SpellSlot resources were sampled
155
+ before and after a leveled non-cantrip cast with the toggle ON: L1 4/4, L2 3/3, L3 2/2 before
156
+ and after — completely unchanged, i.e. the free-cast boost fired anyway. This does not mean
157
+ BoostContext is meaningless on StatusData; it means the "missing OnCreate -> dead boost"
158
+ failure mode proven for PassiveData (see bg3.boosts.boostcontext-evaluation-events) does not
159
+ generalize to StatusData, and each entry type needs its own verification rather than assuming
160
+ the PassiveData rule everywhere.'
161
+ - id: bg3.boosts.weapon-level-gating-fails-passive
162
+ claim: CharacterLevelGreaterThan(N) (and character-level conditions generally) do NOT resolve the
163
+ wielder inside a passive weapon-item status Boosts IF(). A gate like
164
+ IF(CharacterLevelGreaterThan(3)):WeaponProperty(Magical) on a summoned weapon's status
165
+ silently never fires. No vanilla weapon status gates a boost by wielder level — that's the
166
+ tell.
167
+ status: verified
168
+ verified_on: 4.73.98.727 (Patch 8)
169
+ source: ModWright field verification
170
+ tags:
171
+ - boost
172
+ - weapon
173
+ - level-gate
174
+ - passive
175
+ - silent-failure
176
+ detail: "Fix: gate weapon properties by SPELL SLOT instead — the summon's upcast child knows its
177
+ slot, so apply a different weapon status per slot tier (a class mod put
178
+ WeaponProperty(Magical) on the slot-3+ tiers). Slot ≈ level anyway. Cast-time IF() in
179
+ SpellProperties does see the caster's level and is the reliable place for character-level
180
+ logic — see bg3.spells.level-conditions-in-spellproperties."
181
+ - id: bg3.stats.dipped-weapon-status-check
182
+ claim: "To react to a dipped weapon from a character-context boost or condition, test the WEAPON for
183
+ the dip status: HasStatus('DIPPED_FIRE',GetActiveWeapon()) — the form vanilla's poison-dip
184
+ functors use. DIPPED_FIRE is a weapon status carrying WeaponDamage(1d4, Fire)."
185
+ status: unverified
186
+ source: ModWright research
187
+ tags:
188
+ - boost
189
+ - conditions
190
+ - dipped
191
+ - weapon
192
+ - hasstatus
193
+ - getactiveweapon
194
+ detail: "Example rider:
195
+ IF(HasStatus('DIPPED_FIRE',GetActiveWeapon())):CharacterWeaponDamage(max(0,DexterityModifier)\
196
+ ,Fire). A bare HasStatus('DIPPED_FIRE') in character context looks at the character, which
197
+ never carries the dip status, so the condition is silently always false."
198
+ - id: bg3.stats.downedstatus-drop-to-one
199
+ claim: "\"Drop to 1 HP instead of 0\" is Boosts \"DownedStatus(<DOWNED entry>,<n>)\", not an
200
+ interrupt. DEATH_WARD uses DownedStatus(DEATH_WARD_DOWNED,10); RELENTLESS_RAGE gates it with
201
+ IF(HasStatus('SG_Rage')). The DOWNED entry is using \"SURVIVAL_INSTINCT_DOWNED\" with
202
+ OnApplyFunctors \"RemoveStatus(<buff>);RegainHitPoints(1,Guaranteed)\"
203
+ (RELENTLESS_ENDURANCE_DOWNED)."
204
+ status: verified
205
+ verified_on: 4.73.98.727 (Patch 8)
206
+ source: Vanilla Status_BOOST entries DEATH_WARD, RELENTLESS_RAGE, RELENTLESS_ENDURANCE_DOWNED and
207
+ SURVIVAL_INSTINCT_DOWNED (4.73.98.727)
208
+ tags:
209
+ - boost
210
+ - downedstatus
211
+ - death-ward
212
+ - relentless
213
+ - long-rest
214
+ - status
215
+ detail: A once-per-long-rest marker status survives short rests with StatusPropertyFlags
216
+ IgnoreResting and is cleared by a passive with StatsFunctorContext "OnLongRest" and
217
+ StatsFunctors "RemoveStatus(SELF,<marker>)". Verified against the vanilla data, not yet as a
218
+ custom entry in-game.
219
+ - id: bg3.boosts.conditional-damagebonus-in-item-boosts-renders-as-bare-dice
220
+ claim: A conditional damage boost written straight into an Armor/Weapon entry's Boosts
221
+ (IF(IsUnarmedAttack()):DamageBonus(1d4,Fire)) works mechanically but the item tooltip prints
222
+ it as a bare "1d4" line with no sentence. Vanilla keeps such bonuses in a PassiveData with a
223
+ DisplayName/Description (SCL_MastiffPoachers_Ring_Passive) granted through PassivesOnEquip, so
224
+ the tooltip shows a card instead.
225
+ status: verified
226
+ verified_on: 4.73.98.727 (Patch 8)
227
+ source: ModWright field verification
228
+ tags:
229
+ - boosts
230
+ - damagebonus
231
+ - tooltip
232
+ - passives
233
+ - armor
234
+ - id: bg3.boosts.onattack-functors-target-the-struck-creature-swap-flips-to-the-attacker
235
+ claim: In a PassiveData with StatsFunctorContext "OnAttack", a plain ApplyStatus(X,100,n) lands on
236
+ the creature that was hit (vanilla UND_HARDWORK_TARGET, MAG_ELECTROCUTED do exactly this), and
237
+ ApplyStatus(SELF,...) on the attacker; ApplyStatus(SWAP,...) therefore sends the status to the
238
+ ATTACKER, which put Kindling on the wearer instead of the enemy.
239
+ status: verified
240
+ verified_on: 4.73.98.727 (Patch 8)
241
+ source: ModWright field verification
242
+ tags:
243
+ - passives
244
+ - onattack
245
+ - functors
246
+ - swap
247
+ - self
248
+ - target
249
+ - id: bg3.boosts.weapondamage-boosts-do-not-reach-spells-that-roll-their-own-dice
250
+ claim: WeaponDamage(...) boosts on a weapon (DefaultBoosts or an equip status) are added only to
251
+ damage expressed as MainMeleeWeapon / MainRangedWeapon; a weapon action whose SpellSuccess
252
+ rolls its own formula (DealDamage(1d8+max(StrengthModifier,DexterityModifier), Slashing))
253
+ shows and deals none of the weapon's extra fire dice, and needs them restated in its own
254
+ DealDamage and TooltipDamageList.
255
+ status: verified
256
+ verified_on: 4.73.98.727 (Patch 8)
257
+ source: ModWright field verification
258
+ tags:
259
+ - boosts
260
+ - weapondamage
261
+ - spells
262
+ - dealdamage
263
+ - tooltip
264
+ - id: bg3.boosts.vanilla-item-status-effects-use-statusonequip-beside-the-passive
265
+ claim: "When a vanilla item's effect is a status rather than a boost, the Armor entry carries
266
+ `StatusOnEquip \"<STATUS>\"` next to PassivesOnEquip: The Graceful Cloth
267
+ (MAG_BarbMonk_Defensive_Cloth) grants Cat's Grace as StatusOnEquip MAG_CATS_GRACE (using
268
+ CATS_GRACE: Advantage(Ability, Dexterity);FallDamageMultiplier(0.5); IgnoreResting) while its
269
+ +2 Dexterity to 20 is the passive MAG_BarbMonk_Armor_Defensive_Passive (Ability(Dexterity, 2,
270
+ 20), DescriptionParams \"2;20\"). A mod item copies both halves to match it."
271
+ status: inferred
272
+ source: ModWright research
273
+ tags:
274
+ - armor
275
+ - statusonequip
276
+ - passivesonequip
277
+ - cats-grace
278
+ - ability
279
+ - id: bg3.boosts.ext-stats-hot-edits-do-not-reach-the-combine-index
280
+ claim: Setting a stat field from Script Extender at runtime (Ext.Stats.Get(name).ComboCategory =
281
+ ..., then Ext.Stats.Sync) reads back changed on server and client and survives a save+reload,
282
+ and editing a loaded Ext.Stats.ItemCombo entry's Ingredients in place also reads back changed;
283
+ neither produced a Combine option in the running session, so combine eligibility is fixed at
284
+ load and a pak change plus full restart is the only test loop for recipes.
285
+ status: verified
286
+ verified_on: 4.73.98.727 (Patch 8)
287
+ source: ModWright field verification
288
+ tags:
289
+ - scriptextender
290
+ - ext-stats
291
+ - sync
292
+ - hot-edit
293
+ - itemcombos
@@ -0,0 +1,69 @@
1
+ game: baldursgate3
2
+ topic: stats.equipment-kits
3
+ title: Character-creation equipment kits (Stats/Generated/Equipment.txt)
4
+ facts:
5
+ - id: bg3.equipment.cc-kit-override-replaces-vanilla-entry
6
+ claim: "A mod's Public/<Mod>/Stats/Generated/Equipment.txt that declares new equipment
7
+ \"EQP_CC_Monk\" REPLACES vanilla Monk's character-creation kit wholesale: vanilla Monk's
8
+ ClassDescription ClassEquipment points at that entry (defined in SharedDev Equipment.txt), and
9
+ the mod's same-named block is the whole kit. Every vanilla line you want to keep must be
10
+ restated."
11
+ status: verified
12
+ verified_on: 4.73.98.727 (Patch 8)
13
+ source: ModWright field verification
14
+ tags:
15
+ - equipment
16
+ - character-creation
17
+ - kit
18
+ - override
19
+ - classdescription
20
+ - stats
21
+ detail: 'Vanilla Monk lines to restate for a like-for-like kit: the potions, OBJ_Scroll_Revivify,
22
+ ARM_Shoes_Monk, OBJ_Keychain, OBJ_Bag_AlchemyPouch, ARM_Camp_Body, ARM_Camp_Shoes,
23
+ OBJ_Backpack_CampSupplies. Format: new equipment "<id>", then add initialweaponset "Melee",
24
+ then repeated pairs of add equipmentgroup / add equipment entry "<stat>". Trade-off: this
25
+ conflicts with any other mod overriding the same kit — the same class of trade-off as
26
+ overriding a vanilla progression node. A custom class avoids it by naming its own
27
+ EQP_CC_<Class> from its own ClassDescription instead. Validator
28
+ bg3.stats.equipment-kit-entries-resolve checks the block shape and that every entry resolves.'
29
+ - id: bg3.equipment.cc-kit-one-body-item
30
+ claim: A CC kit must carry exactly one Breast-slot (body) armor. With two — a custom robe plus the
31
+ vanilla ARM_Monk — character creation drew the VANILLA outfit while the custom robe's
32
+ VertexColorMaskSlots still applied, so the character's arms vanished. Dropping the vanilla
33
+ body item fixed it.
34
+ status: verified
35
+ verified_on: 4.73.98.727 (Patch 8)
36
+ source: ModWright field verification
37
+ tags:
38
+ - equipment
39
+ - character-creation
40
+ - kit
41
+ - armor
42
+ - slot
43
+ - vertexcolormask
44
+ - silent-failure
45
+ related:
46
+ - id: bg3.items.visualbank.vertexcolormaskslots-underwear-fix
47
+ detail: The body mask that hid the arms is the same VertexColorMaskSlots mechanism that fact copies
48
+ from the vanilla robe.
49
+ - id: bg3.equipment.cc-kit-override-replaces-vanilla-entry
50
+ detail: The symptom is silent — nothing logs; the CC preview simply shows the vanilla outfit with
51
+ body parts missing. Validator bg3.stats.equipment-kit-one-body-armor warns when two entries in
52
+ one kit resolve to Armor stats whose Slot (own or inherited via using) is Breast.
53
+ - id: bg3.equipment.kit-order-equips-first-then-pack
54
+ claim: Kit entries are equipped in list order into free slots; a later entry whose slot is already
55
+ occupied lands in the pack instead (the vanilla quarterstaff listed after a custom naginata
56
+ was carried, not wielded).
57
+ status: unverified
58
+ source: ModWright research
59
+ tags:
60
+ - equipment
61
+ - character-creation
62
+ - kit
63
+ - order
64
+ - inventory
65
+ related:
66
+ - bg3.equipment.cc-kit-override-replaces-vanilla-entry
67
+ detail: Consistent with what was seen (the custom weapon came first in the block and was the one
68
+ wielded), but the ordering rule itself was not tested by swapping the two lines. List the
69
+ intended wielded weapon first until it is.
@@ -0,0 +1,45 @@
1
+ game: baldursgate3
2
+ topic: stats.interrupts
3
+ title: Reaction interrupts (Stats/Generated/Data/Interrupt.txt)
4
+ facts:
5
+ - id: bg3.stats.interrupt-observer-context
6
+ claim: InterruptData Conditions carry context.Observer as the standard idiom (every reaction
7
+ interrupt opens with Self(context.Source,context.Observer) and
8
+ IsAbleToReact(context.Observer)), and interrupt functors address the reaction entities with
9
+ the target specifiers OBSERVER_OBSERVER, OBSERVER_SOURCE and OBSERVER_TARGET
10
+ (ApplyStatus(OBSERVER_OBSERVER,<status>,...), RemoveStatus(OBSERVER_OBSERVER,<status>)). The
11
+ passive-only "context.Observer is invalid" lesson does not apply to InterruptData.
12
+ status: verified
13
+ verified_on: 4.73.98.727 (Patch 8)
14
+ source: Shared, SharedDev and Gustav Interrupt.txt read on 2026-09-17
15
+ tags:
16
+ - interrupt
17
+ - reaction
18
+ - conditions
19
+ - context.observer
20
+ - target-specifier
21
+ - stats
22
+ detail: "The ModWright rules bg3.history.context-qualifier-validity and
23
+ bg3.history.reference-integrity flagged a cloned Polearm Master interrupt on both counts
24
+ (block) until they learned the entry type: the known-invalid evidence is PassiveData
25
+ (OnCast-on-self), and OBSERVER_* is a target, not a status name."
26
+ - id: bg3.stats.interrupt-enter-reach-native
27
+ claim: 'An opportunity attack on a creature ENTERING reach is native: InterruptContext
28
+ "OnEnterAttackRange" with InterruptContextScope "Self" (vanilla Interrupt_PolearmMaster,
29
+ unlocked by the passive boost UnlockInterrupt(Interrupt_PolearmMaster)); its Conditions accept
30
+ a Reach weapon, a WPN_STAVE or a WPN_SPEAR. No Osiris hook is needed for enter-reach
31
+ reactions; a clone with extra Properties (an ApplyStatus(OBSERVER_OBSERVER,...) rider) keeps
32
+ the reaction cost and the AttackOfOpportunity stack.'
33
+ status: inferred
34
+ source: ModWright research
35
+ tags:
36
+ - interrupt
37
+ - reaction
38
+ - opportunity-attack
39
+ - reach
40
+ - polearm-master
41
+ - stats
42
+ detail: "A subclass mod's reaction replaced its Script Extender scaffold with a scoped clone of
43
+ Interrupt_PolearmMaster. The stack \"AttackOfOpportunity\" keeps it from doubling with the
44
+ ordinary leave-reach reaction. What an interrupt cannot do: charge a resource conditionally on
45
+ the attack HITTING (Properties run when the reaction is taken)."
@@ -0,0 +1,65 @@
1
+ game: baldursgate3
2
+ topic: stats.itemcombos
3
+ title: ItemCombos.txt � the inventory Combine recipes (forging one item from two)
4
+ facts:
5
+ - id: bg3.itemcombos.file-lives-beside-data-not-inside-it
6
+ claim: Recipes go in Public/<Mod>/Stats/Generated/ItemCombos.txt � next to the Data/ folder, not
7
+ inside it � as `new ItemCombination "<name>"` blocks (Type N Object|Category, Object N,
8
+ Transform N Consume|Transform|None|Dye) followed by `new ItemCombinationResult "<name>_1"`
9
+ (ResultAmount 1, Result 1, PreviewStatsID). A mod's file loads alongside the vanilla ones and
10
+ Ext.Stats.ItemCombo.Get("<name>") returns it on server and client; // comment lines at the top
11
+ of the file did not stop it loading (vanilla files carry none).
12
+ status: verified
13
+ verified_on: 4.73.98.727 (Patch 8)
14
+ source: ModWright field verification
15
+ tags:
16
+ - itemcombos
17
+ - combine
18
+ - stats
19
+ - file-layout
20
+ - id: bg3.itemcombos.combine-menu-comes-from-the-template-peace-action-not-the-recipe
21
+ claim: 'An item gets the "Combine" context-menu entry only if its RootTemplate carries an
22
+ OnUsePeaceActions Action with ActionType 23 (Attributes: Animation "", CombineSlots 1 (int8),
23
+ IsBase True). A recipe alone never adds the option: recipes naming vanilla objects (Amethyst,
24
+ a plain Spear) gave those items no Combine entry either, while the vanilla Broken Spear halves
25
+ showed it even with their partner dropped from the bag.'
26
+ status: verified
27
+ verified_on: 4.73.98.727 (Patch 8)
28
+ source: ModWright field verification
29
+ tags:
30
+ - itemcombos
31
+ - combine
32
+ - roottemplate
33
+ - peace-action
34
+ - actiontype-23
35
+ detail: "Validator idea (design 05): flag an ItemCombination ingredient whose RootTemplate chain has
36
+ no ActionType 23 peace action � the recipe is unreachable from the UI."
37
+ - id: bg3.itemcombos.category-ingredient-reads-combocategory-and-custom-values-did-not-match
38
+ claim: 'A `Type N "Category"` ingredient is matched against the stat field ComboCategory (vanilla:
39
+ _Body armour "DyableArmor" for the dyes, _DRINK_* "Drink" for the trap combo,
40
+ "ConstructPart"), not ObjectCategory. A mod-defined value on a weapon (ComboCategory
41
+ "<ModCategory>", confirmed on server and client) still never matched in-game, so name the
42
+ partner directly with `Type N "Object"` and its stat name instead.'
43
+ status: verified
44
+ verified_on: 4.73.98.727 (Patch 8)
45
+ source: ModWright field verification
46
+ tags:
47
+ - itemcombos
48
+ - category
49
+ - combocategory
50
+ - objectcategory
51
+ - id: bg3.itemcombos.vanilla-shape-transform-first-consume-second
52
+ claim: 'Vanilla two-part forges list the part that becomes the result as Object 1 with Transform
53
+ "Transform" and the part that is used up as Object 2 with Transform "Consume"
54
+ (QUEST_FOR_CultistsRepairedSpear: Head transforms, Shaft consumed, Result FOR_TrueSoul_Spear;
55
+ the beer-barrel poisonings likewise). A Weapon stat can be the transformed Object 1 � the
56
+ Emberwatch Naginata (a Weapon) became the Naginata of Ashcrown this way.'
57
+ status: verified
58
+ verified_on: 4.73.98.727 (Patch 8)
59
+ source: ModWright field verification
60
+ tags:
61
+ - itemcombos
62
+ - transform
63
+ - consume
64
+ - ordering
65
+ - weapons