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,166 @@
1
+ game: cyberpunk2077
2
+ topic: entities.appearance
3
+ title: Entity and appearance files structure, resolution, and inheritance
4
+ facts:
5
+ - id: cp2077.entities.entity-appearance-chain
6
+ claim: An entity file (.ent) references an appearance file (.app) via the appearance field; the
7
+ appearance file defines the submesh layout and material assignments for a given entity
8
+ appearance, while the entity file contains the interaction chunk and properties.
9
+ status: inferred
10
+ source: ModWright research
11
+ tags:
12
+ - entity
13
+ - appearance
14
+ - file-structure
15
+ - separation
16
+ detail: cache_case.ent points at cache_case.app through appearanceResource.DepotPath, with
17
+ appearanceName/name/defaultAppearance all "default". The loot properties (lootTables,
18
+ contentAssignment, lootQuality, displayName) are set on the .ent's entity data, not in the
19
+ .app.
20
+ - id: cp2077.entities.appearance-submesh-references
21
+ claim: An appearance file (.app) contains appearances with submesh element references, each pointing
22
+ to a mesh file path via a slotName; changing which mesh loads for a slot is done in the .app
23
+ file, not the mesh file.
24
+ status: inferred
25
+ source: ModWright research
26
+ tags:
27
+ - appearance
28
+ - mesh
29
+ - submesh
30
+ - slot
31
+ - component
32
+ detail: "The unit is a named component, not a \"slotName\": cache_case.app's default appearance
33
+ holds entPhysicalMeshComponent entries named lid, box and handle, each with mesh.DepotPath and
34
+ meshAppearance. The build script repoints lid -> mod\\<mod>\\meshes\\cache_case_top.mesh and
35
+ box -> mod\\<mod>\\meshes\\cache_case_bottom.mesh and clones box into a handle component
36
+ pointing at the vanilla q000__gun_suitcase_handle.mesh."
37
+ - id: cp2077.entities.appearance-material-assignments
38
+ claim: Appearance files can assign materials to submeshes either by external reference
39
+ (preloadExternalMaterials) or by local instance (preloadLocalMaterialInstances); external
40
+ materials must be loaded from a donor mesh, while locals are editable per appearance.
41
+ status: verified
42
+ source: ModWright field verification
43
+ tags:
44
+ - appearance
45
+ - material
46
+ - external
47
+ - local
48
+ - assignment
49
+ - cooked
50
+ detail: "The trap the lesson records is the field name: a cooked mesh ignores externalMaterials and
51
+ reads preloadExternalMaterials. Editable local instances live in
52
+ preloadLocalMaterialInstances. Learned while editing the case and weapon meshes. This is a
53
+ CR2W/WolvenKit-side observation, so the in-game verified_on/verified_by that were on it have
54
+ been removed."
55
+ - id: cp2077.entities.entity-appearance-factory-resolution
56
+ claim: Weapon appearance resolution uses weapon record appearance-resource-name field + archivexl
57
+ factory csv to locate the .app file; the factory maps appearance name strings to absolute mesh
58
+ file paths, not through the entity system.
59
+ status: verified
60
+ verified_on: "2.31"
61
+ source: ModWright field verification
62
+ tags:
63
+ - appearance
64
+ - factory
65
+ - resolution
66
+ - weapon
67
+ - tweakdb
68
+ detail: "The field is spelled appearanceResourceName. factory_parts.csv has columns name,path,shared
69
+ and two rows: <mod>_body -> mod\\<mod>\\<mod>_body.app and <Mod>_Weapon ->
70
+ mod\\<mod>\\<mod>_weapon.app. It maps to .app resources, not to mesh paths; the .app then
71
+ names the meshes."
72
+ - id: cp2077.entities.world-node-position-coordinates
73
+ claim: World entity node positions are specified as X, Y, Z coordinates in the sector json nodedata;
74
+ positions are in absolute world units and can be adjusted in build scripts before
75
+ reserializing.
76
+ status: inferred
77
+ source: ModWright research
78
+ tags:
79
+ - sector
80
+ - node
81
+ - position
82
+ - coordinate
83
+ - world
84
+ detail: "Three different positions appear in the sources and must not be conflated: (-838.7, 324.8,
85
+ 7.9) was the hand-authored guess in the abandoned build; the entSpawner export gave the user's
86
+ in-game placement (-835.758, 328.628, 7.884), which the sector-building script adopted; and
87
+ the shipped mod sits at the old Malorian factory site on the City Center NE waterfront, which
88
+ the mod's README \"Features\" gives as approximately (-836, 329). Its notes add \"Moving the
89
+ case now = edit X/Y/Z in the sector build script -> rebuild -> repack\"."
90
+ - id: cp2077.entities.world-node-rotation-quaternion
91
+ claim: World entity node rotation is specified as a quaternion (k, r, x, y, z values) in the sector
92
+ json nodedata; the quaternion represents the full 3D rotation and can be adjusted if mesh
93
+ orientation needs changes.
94
+ status: inferred
95
+ source: ModWright research
96
+ tags:
97
+ - sector
98
+ - node
99
+ - rotation
100
+ - quaternion
101
+ - orientation
102
+ detail: The components are named i, j, k, r (not x, y, z, w). The entSpawner export's placement was
103
+ i 0, j 0, k 0.75298953056335, r 0.6580325961113. The mod's polish list mentions rotating via
104
+ the Orientation quaternion in the sector build script "if it clips the wall", so the shipped
105
+ orientation may differ from the export's.
106
+ - id: cp2077.entities.case-open-is-entity-state
107
+ claim: The Malorian cache case rendering open in game means the entity is in an open state, so the
108
+ fix belongs in the entity's animation or state (the animator).
109
+ status: contradicted
110
+ source: ModWright research
111
+ tags:
112
+ - animator
113
+ - case
114
+ - pose
115
+ - state
116
+ - retracted
117
+ - debugging
118
+ detail: Several rounds of debugging chased an entity-state bug that did not exist. The meshes ship
119
+ authored open, exterior-up. Superseded by cp2077.process.case-pose-vs-state-lesson.
120
+ - id: cp2077.entities.animator-removed-case-closed
121
+ claim: A gameTransformAnimatorComponent that was originally authored for an entity can be removed
122
+ from the entity file to disable its animation; removing TransformAnimator from a case entity
123
+ keeps it permanently closed.
124
+ status: contradicted
125
+ source: ModWright research
126
+ tags:
127
+ - animator
128
+ - entity
129
+ - animation
130
+ - removal
131
+ - retracted
132
+ detail: Removing the animator was the interim architecture while the lid was mis-posed; the shipped
133
+ v1.0.0 case animates open again, so the removal did not survive. Superseded by
134
+ cp2077.entities.transform-animator-open-anim.
135
+ - id: cp2077.entities.transform-animator-open-anim
136
+ claim: A gameTransformAnimatorComponent can define an animation name (e.g., "open") that drives
137
+ position/rotation transforms; the animator component contains the animation name and execution
138
+ parameters.
139
+ status: verified
140
+ verified_on: "2.31"
141
+ source: ModWright field verification
142
+ tags:
143
+ - animator
144
+ - animation
145
+ - transform
146
+ - open
147
+ supersedes: cp2077.entities.animator-removed-case-closed
148
+ detail: The animation is named "Open" (capital O in the source). Getting it right needed the pivot
149
+ at the lid's measured back-bottom edge, sunk about 1cm into the rim so the closed pose shows
150
+ no gap.
151
+ - id: cp2077.entities.streaming-box-field
152
+ claim: Sector node nodedata includes a streamingBox field that defines the bounding box for
153
+ streaming distance calculations; correct streamingBox values ensure entities load/unload at
154
+ appropriate distances.
155
+ status: inferred
156
+ source: ModWright research
157
+ tags:
158
+ - streaming
159
+ - box
160
+ - distance
161
+ - nodedata
162
+ - descriptor
163
+ detail: 'streamingBox sits on the streamingblock DESCRIPTOR, not on nodeData: the sector-building
164
+ script sets desc["streamingBox"] to a Box built from BOX_MIN/BOX_MAX, a 300m cube centred on
165
+ the placement. The per-node nodeData entry has its own Bounds plus MaxStreamingDistance. The
166
+ values came from the entSpawner export.'
@@ -0,0 +1,151 @@
1
+ game: cyberpunk2077
2
+ topic: equipmentex.slots
3
+ title: Equipment-EX outfit slot system
4
+ facts:
5
+ - id: cp2077.equipment-ex.slots.version-floors
6
+ claim: Equipment-EX's stated requirements are Cyberpunk 2077 2.2, ArchiveXL 1.18.0+, TweakXL
7
+ 1.10.4+, Codeware 1.13.0+ and redscript 0.5.25+.
8
+ status: community
9
+ source: cp2077-equipment-ex README.md, section "Getting Started > Requirements"
10
+ tags:
11
+ - equipment-ex
12
+ - version-floor
13
+ - archivexl
14
+ - tweakxl
15
+ - codeware
16
+ - redscript
17
+ detail: Re-verified against the README on the master branch (there is no main branch) on 2026-09-07.
18
+ The framework floors are on their own numbering and stay in the claim; "Cyberpunk 2077 2.2" is
19
+ the game's marketing version, and is what this Equipment-EX release targets rather than a
20
+ version this fact was observed on, so it is not a `verified_on`.
21
+ - id: cp2077.equipment-ex.slots.placementslots-append-syntax
22
+ claim: "\"Any item can support one base slot and one outfit slot at the same time.\" The outfit slot
23
+ is added to `placementSlots` after the base slot with TweakXL's `!append`, e.g.
24
+ `placementSlots: - !append OutfitSlots.NecklaceShort` on an item whose `$base` is
25
+ `Items.GenericHeadClothing`; the README shows this as equivalent to spelling out `-
26
+ AttachmentSlots.Head` and `- OutfitSlots.NecklaceShort`."
27
+ status: community
28
+ source: cp2077-equipment-ex README.md, section "Documentation > Compatible items"
29
+ tags:
30
+ - equipment-ex
31
+ - placementslots
32
+ - append
33
+ - syntax
34
+ - tweakxl
35
+ - id: cp2077.equipment-ex.slots.outfit-slot-is-additive-not-required
36
+ claim: "\"If user doesn't have Equipment-EX installed, the item will still work with the base slot\"
37
+ — appending an OutfitSlots entry is therefore safe to ship unconditionally rather than as a
38
+ hard dependency."
39
+ status: community
40
+ source: cp2077-equipment-ex README.md, section "Documentation > Compatible items"
41
+ tags:
42
+ - equipment-ex
43
+ - placementslots
44
+ - compatibility
45
+ - optional-dependency
46
+ detail: The README states the fallback behaviour but not that the extra entry is "inert"; that word
47
+ was trimmed on 2026-09-07.
48
+ - id: cp2077.equipment-ex.slots.torso-layer-names
49
+ claim: Torso outfit slots, in the README's table order, are `OutfitSlots.TorsoUnder` (Bras, Tight
50
+ Long-sleeves), `TorsoInner` (Tops, T-Shirts, Tight Shirts, Tight Dresses), `TorsoMiddle`
51
+ (Waistcoats, Blazers, Loose Shirts, Loose Dresses), `TorsoOuter` (Jackets, Coats) and
52
+ `TorsoAux` (Vests, Harnesses, Puffers).
53
+ status: community
54
+ source: cp2077-equipment-ex README.md, section "Documentation > Outfit slots"
55
+ tags:
56
+ - equipment-ex
57
+ - outfitslots
58
+ - torso
59
+ - naming
60
+ - slot-table
61
+ detail: 'Corrected 2026-09-07: the README describes `TorsoAux` only by purpose; the previous claim
62
+ that it "stacks independently of the four" is not stated there.'
63
+ - id: cp2077.equipment-ex.slots.legs-and-body-layer-names
64
+ claim: "Leg outfit slots are `OutfitSlots.LegsInner` (Tights, Leggings), `LegsMiddle` (Tight Pants,
65
+ Tight Shorts) and `LegsOuter` (Loose Pants, Loose Shorts, Skirts). A parallel whole-body stack
66
+ exists: `OutfitSlots.BodyUnder` (Netrunning Suits), `BodyInner` (no purpose listed),
67
+ `BodyMiddle` (Jumpsuits, Tracksuits), `BodyOuter` (no purpose listed)."
68
+ status: community
69
+ source: cp2077-equipment-ex README.md, section "Documentation > Outfit slots"
70
+ tags:
71
+ - equipment-ex
72
+ - outfitslots
73
+ - legs
74
+ - body
75
+ - naming
76
+ - slot-table
77
+ - id: cp2077.equipment-ex.slots.paired-left-right-naming
78
+ claim: "Symmetric body parts get explicit Left/Right slot pairs: `OutfitSlots.EarLeft`/`EarRight`,
79
+ `EyeLeft`/`EyeRight`, `ShoulderLeft`/`ShoulderRight`, `ElbowLeft`/`ElbowRight`,
80
+ `WristLeft`/`WristRight`, `HandLeft`/`HandRight`, `FingersLeft`/`FingersRight`,
81
+ `FingernailsLeft`/`FingernailsRight`, `ThighLeft`/`ThighRight`, `KneeLeft`/`KneeRight`,
82
+ `AnkleLeft`/`AnkleRight`, `ToesLeft`/`ToesRight`, `ToenailsLeft`/`ToenailsRight`,
83
+ `HandPropLeft`/`HandPropRight` (props for photo mode). Eyes and hands ALSO have a shared slot
84
+ alongside the pair — `OutfitSlots.Eyes` and `OutfitSlots.Hands`."
85
+ status: community
86
+ source: cp2077-equipment-ex README.md, section "Documentation > Outfit slots"
87
+ tags:
88
+ - equipment-ex
89
+ - outfitslots
90
+ - naming
91
+ - left-right
92
+ - slot-table
93
+ detail: "Corrected 2026-09-07: the previous claim said symmetric parts are split \"rather than one
94
+ shared slot\", which the README's own `OutfitSlots.Eyes` and `OutfitSlots.Hands` rows
95
+ contradict."
96
+ - id: cp2077.equipment-ex.slots.auto-conversion-table
97
+ claim: "An item that specifies no outfit slot is auto-assigned one from its base record:
98
+ `Items.GenericHeadClothing` -> `OutfitSlots.Head`, `Items.Glasses` -> `OutfitSlots.Glasses`,
99
+ `Items.Visor` -> `OutfitSlots.Glasses`, `Items.GenericFaceClothing` -> `OutfitSlots.Mask`,
100
+ `Items.GenericInnerChestClothing` -> `OutfitSlots.TorsoInner`,
101
+ `Items.GenericOuterChestClothing` -> `OutfitSlots.TorsoOuter`, `Items.GenericLegClothing` ->
102
+ `OutfitSlots.LegsMiddle`, `Items.Skirt` -> `OutfitSlots.LegsOuter`,
103
+ `Items.GenericFootClothing` -> `OutfitSlots.Feet`, `Items.Outfit` ->
104
+ `OutfitSlots.BodyMiddle`."
105
+ status: community
106
+ source: cp2077-equipment-ex README.md, section "Documentation > Auto conversions"
107
+ tags:
108
+ - equipment-ex
109
+ - outfitslots
110
+ - auto-conversion
111
+ - default
112
+ - slot-table
113
+ - id: cp2077.equipment-ex.slots.new-slot-proposal-rules
114
+ claim: "Equipment-EX's recommendations for proposing a new slot: \"The purpose of the slot must be
115
+ clear and distinguishable from other slots\"; \"The slot must represent an area or layer for
116
+ only one item equipped at a time\"; \"The slot must be named after a body part if possible, or
117
+ equipment category otherwise\"."
118
+ status: community
119
+ source: cp2077-equipment-ex README.md, section "Documentation > Outfit slots" (closing list)
120
+ tags:
121
+ - equipment-ex
122
+ - outfitslots
123
+ - naming-rule
124
+ - contribution
125
+ - id: cp2077.equipment-ex.slots.outfit-mode-overlays-not-reequips
126
+ claim: Clicking an item in the Wardrobe UI "will activate outfit mode, which applies the visuals of
127
+ the selected items to your character over equipped gear" — the overlay is visual and sits on
128
+ top of what is actually equipped. It is turned off by selecting "No outfit" or unequipping the
129
+ outfit from the Inventory menu.
130
+ status: community
131
+ source: cp2077-equipment-ex README.md, section "Getting Started > How to use"
132
+ tags:
133
+ - equipment-ex
134
+ - outfit-mode
135
+ - wardrobe
136
+ - visual-only
137
+ detail: The Wardrobe is reached "through the new 'Wardrobe' button in the Inventory menu or from
138
+ wardrobe call in V's apartments"; photo mode exposes outfit switching in the pose section. The
139
+ README says the overlay applies visuals; it does not comment on stats, so that wording was
140
+ trimmed on 2026-09-07.
141
+ - id: cp2077.equipment-ex.slots.translation-template-path
142
+ claim: Localization contributions start from the template `support/localization/lang.json.json` in
143
+ the repo; the instruction is to "translate all `femaleVariant` values" and keep the
144
+ translation as close to the English version as possible.
145
+ status: community
146
+ source: cp2077-equipment-ex README.md, section "Translations"
147
+ tags:
148
+ - equipment-ex
149
+ - localization
150
+ - translation
151
+ - file-path
@@ -0,0 +1,246 @@
1
+ game: cyberpunk2077
2
+ topic: fx.effects
3
+ title: Particle effects, effect descriptors, and melee swing trails
4
+ facts:
5
+ - id: cp2077.fx.effects.placement-info-named-tag-required
6
+ claim: On a custom melee weapon's .app, an entEffectDesc only places its particles correctly when it
7
+ uses worldCompiledEffectInfo placementInfos + placementTags naming an actual bone tag (e.g.
8
+ "base", the weapon's base bone); untagged placement (placementTagIndex 255, i.e. the weapon
9
+ root) resolves to nothing on this app even though the identical untagged pattern works on the
10
+ katana's own, much richer app.
11
+ status: verified
12
+ source: ModWright field verification
13
+ tags:
14
+ - fx
15
+ - effect-desc
16
+ - placement
17
+ - tag
18
+ - silent-failure
19
+ detail: "Three earlier no-ops (documented in the mod's build scripts) had already proven neither
20
+ compiledEffectInfo componentIndexMask nor the effect's own trackGroup componentName places
21
+ particles here. The chainsword's vanilla blood_dripping desc revealed the real mechanism:
22
+ placementInfos + placementTags + relativePositions in worldCompiledEffectInfo, selected per
23
+ event via placementIndexMask, offset relative to the named tag. A first version of the trail
24
+ script copied the katana's trail desc verbatim (placementTagIndex 255, flags 9) and rendered
25
+ nothing; v2 mirrored the app's OWN working idle_thermal desc (placementTags [\"base\"],
26
+ placementTagIndex 0, flags 3) and worked. Rule recorded for this app: copy the placement shape
27
+ of idle_thermal, never a donor weapon's own desc."
28
+ - id: cp2077.fx.effects.relative-rotation-placement-quaternion
29
+ claim: Each placementInfo in compiledEffectInfo carries a relativeRotationIndex pointing into a
30
+ separate relativeRotations[] array of quaternions; this is the per-placement rotation knob for
31
+ an effect desc, and it is exploited on a custom weapon's idle_thermal desc to flip the far
32
+ horn's placement 180 degrees about local Z.
33
+ status: inferred
34
+ source: ModWright research
35
+ tags:
36
+ - fx
37
+ - effect-desc
38
+ - placement
39
+ - rotation
40
+ - quaternion
41
+ detail: compiledEffectInfo.placementInfos[].relativeRotationIndex ->
42
+ compiledEffectInfo.relativeRotations[] (Quaternion). idle_thermal's far horn placement carries
43
+ (0,0,1,0), a 180 degree spin about local Z, to flip its drift inward. The knob is real and in
44
+ active use — see cp2077.fx.effects.world-space-vectors-ignore-placement-rotation for why it
45
+ cannot fix every orientation problem.
46
+ - id: cp2077.fx.effects.world-space-vectors-ignore-placement-rotation
47
+ claim: A particle emitter's velocity/acceleration initializers set with worldSpace = 1 are evaluated
48
+ in world space; rotating the effect desc's placement quaternion (relativeRotationIndex) cannot
49
+ redirect them, because the placement rotation only affects local-space vectors.
50
+ status: inferred
51
+ source: ModWright research
52
+ tags:
53
+ - fx
54
+ - particle
55
+ - world-space
56
+ - rotation
57
+ - orientation
58
+ detail: "w_mantisblades_idle_thermal.effect's \"smoke\" event
59
+ (w_mantisblades_idle_thermal_sparks.particle) sets BOTH CParticleInitializerVelocity (+Z,
60
+ 0.25..0.5) and CParticleModificatorAcceleration (direction +Z) with worldSpace = 1 on both
61
+ modules, so the particles rise straight up in world space no matter how the placement is
62
+ rotated. Correct for vertical mantis arm blades, visibly wrong for a crescent held horizontal.
63
+ The companion haze event has no velocity initializer, only a world-space acceleration, so it
64
+ is a pure distortion field and reads fine from any angle. CLOSED 2026-09-03: the user verified
65
+ in game that the smoke reads fine once 1b's placement fix landed, so this was never actually
66
+ re-fixed via option A (local-spacing a cloned particle) or option B (masking the sparks event
67
+ off) — recorded because it explains the mechanism, not because a fix shipped."
68
+ - id: cp2077.fx.effects.per-event-placement-index-mask
69
+ claim: A single entEffectDesc can place its several particle events at different placementInfos
70
+ independently, by giving each event its own placementIndexMask bit rather than sharing one
71
+ mask across all events.
72
+ status: inferred
73
+ source: ModWright research
74
+ tags:
75
+ - fx
76
+ - effect-desc
77
+ - placement-mask
78
+ - event
79
+ detail: "Vanilla's reflected_bullet_sparks desc proves the mechanism works. A custom weapon's own
80
+ idle_thermal desc does NOT use it: both its haze and sparks events currently run
81
+ placementIndexMask 3 (both placements), which is why the far-horn placement fix also moved the
82
+ haze (see cp2077.fx.effects.relative-rotation-placement-quaternion's parent finding) — an
83
+ available lever the mod does not currently pull."
84
+ - id: cp2077.fx.effects.heat-haze-hypothesis-shader-pass
85
+ claim: The thermal blade's heat haze is most likely a pass of the multilayer_blackbody_inject.mt
86
+ shader itself (it samples fx_perlin_noise_01_d / fx_perlin_noise_3d_01_d across 4 passes), so
87
+ using that shader on the glow material should produce the haze for free with no separate
88
+ effect needed.
89
+ status: contradicted
90
+ source: ModWright research
91
+ tags:
92
+ - fx
93
+ - heat-haze
94
+ - shader
95
+ - hypothesis
96
+ - retracted
97
+ detail: "This was the working hypothesis before the haze mechanism was pinned down. It turned out to
98
+ be wrong: the haze is a particle effect, not a shader pass. Superseded by
99
+ cp2077.fx.effects.heat-haze-is-a-particle-effect."
100
+ - id: cp2077.fx.effects.heat-haze-is-a-particle-effect
101
+ claim: "The thermal weapon heat haze is a PARTICLE effect, not a shader pass: an
102
+ effectTrackItemParticles track inside a dedicated idle-thermal .effect file, spawning a
103
+ distortion particle with a refraction shader and a circular-noise distortion texture."
104
+ status: inferred
105
+ source: ModWright research
106
+ tags:
107
+ - fx
108
+ - heat-haze
109
+ - particle
110
+ - pinned
111
+ supersedes: cp2077.fx.effects.heat-haze-hypothesis-shader-pass
112
+ detail: "For the mantis it is the \"Heat_Haze\" particle track inside
113
+ base\\fx\\weapons\\cyberware\\mantisblades\\idle\\w_mantisblades_idle_thermal .effect, emitter
114
+ shader base\\fx\\shaders\\simple_refraction.mt + fx_circular_distortion_03_noise_n.xbm, params
115
+ Refraction/RefractionStrength. The katana has its own separate haze:
116
+ base\\fx\\weapons\\melee\\katanas\\idles\\w_katana_idle_thermal.effect, spawning
117
+ w_katana_idle_thermal.particle with the same distortion texture. A custom weapon mod's shipped
118
+ idle_thermal desc points at the vanilla mantis effect verbatim (see
119
+ cp2077.fx.effects.placement-info-named-tag-required), not the katana one — two independent
120
+ vanilla implementations of the same visual idea exist in the game."
121
+ - id: cp2077.fx.effects.katana-and-mantis-have-separate-heat-haze-effects
122
+ claim: The katana and mantis-blades families each ship their own, separate idle-thermal haze effect
123
+ file and particle asset; they are not the same resource reused across weapon types.
124
+ status: inferred
125
+ source: ModWright research
126
+ tags:
127
+ - fx
128
+ - heat-haze
129
+ - katana
130
+ - mantis
131
+ - resource
132
+ detail: "Mantis: w_mantisblades_idle_thermal.effect / w_mantisblades_idle_thermal_sparks.particle.
133
+ Katana: w_katana_idle_thermal.effect / w_katana_idle_thermal.particle. Both were explored as
134
+ heat-haze donors for a custom weapon; the shipped weapon grafts the mantis one, per
135
+ cp2077.fx.effects.heat-haze-is-a-particle-effect."
136
+ - id: cp2077.fx.effects.effect-desc-handle-wrapped-lists
137
+ claim: In a custom weapon's .app, entEffectDesc entries are stored HANDLE-WRAPPED ({HandleId, Data})
138
+ in three separate lists (two compiledData chunks plus the source components[] array), not as
139
+ bare objects; a script that only checks `i["$type"] == "entEffectDesc"` will find nothing.
140
+ status: inferred
141
+ source: ModWright research
142
+ tags:
143
+ - fx
144
+ - effect-desc
145
+ - handle
146
+ - json
147
+ - wolvenkit
148
+ detail: Appending new descs also perturbs handle order, and WolvenKit's `convert deserialize` FAILS
149
+ unless every HandleId runs in document-encounter order (the same class of gotcha recorded for
150
+ sector json — see cp2077.sectors.sector-json-file-uniqueness — but here it is ordering, not
151
+ uniqueness, that breaks). The fix reuses a `renumber_handles` helper originally written for a
152
+ finisher routing script; deserialize plus a binary round-trip both pass after renumbering.
153
+ - id: cp2077.fx.effects.swing-trail-triggered-per-attack-record-timing
154
+ claim: The melee swing trail (weapon.StartCurrentMeleeTrailEffect / StopCurrentMeleeTrailEffect) is
155
+ driven purely by per-attack-record timing fields — trailStartDelay and trailStopDelay compared
156
+ against elapsed state time in meleeTransitions.script — not by animation data; a weapon
157
+ inherits this triggering for free from its base attack records regardless of whether it
158
+ declares a trail effect at all.
159
+ status: inferred
160
+ source: ModWright research
161
+ tags:
162
+ - fx
163
+ - swing-trail
164
+ - attack-record
165
+ - timing
166
+ detail: A machete-derived weapon's attack records inherit trailStartDelay 0.1 / trailStopDelay 0.4
167
+ from MacheteComboAttackAbstract / MacheteFinalAttackAbstract, so the engine had been asking
168
+ for the trail on every swing since the weapon's first build — it simply resolved to nothing
169
+ because the weapon's .app declared no trail_* effect descriptor at all. The katana's own app
170
+ declares eight (trail_physical/_npc, trail_thermal/_npc, trail_chemical/_npc,
171
+ trail_electric/_npc).
172
+ - id: cp2077.fx.effects.trail-name-assumed-from-thermal-flag
173
+ claim: Because a custom weapon record (Items.<ModWeapon>) sets BaseStats.DealsThermalDamage and the
174
+ weapon's own idle_thermal desc visibly renders (which StartIdleMeleeEffect only requests for
175
+ Thermal-type weapons), the resolved melee damage type must be Thermal, so the swing trail
176
+ should be requested by the name "trail_thermal".
177
+ status: contradicted
178
+ source: ModWright research
179
+ tags:
180
+ - fx
181
+ - swing-trail
182
+ - damage-type
183
+ - hypothesis
184
+ - retracted
185
+ detail: This chain of reasoning is wrong at the last step and cost three relaunch cycles. Superseded
186
+ by cp2077.fx.effects.trail-name-resolved-from-damage-comparison.
187
+ - id: cp2077.fx.effects.trail-name-resolved-from-damage-comparison
188
+ claim: GetCurrentDamageType() (the value weapon.script actually uses to pick the trail effect name)
189
+ is resolved by comparing damage STAT VALUES, not by reading the DealsThermalDamage flag; on
190
+ that weapon it resolves to Physical even though DealsThermalDamage is set, because that flag
191
+ only gates whether burn status applies, not which damage type the trail system sees.
192
+ status: verified
193
+ source: ModWright field verification
194
+ tags:
195
+ - fx
196
+ - swing-trail
197
+ - damage-type
198
+ - probe
199
+ supersedes: cp2077.fx.effects.trail-name-assumed-from-thermal-flag
200
+ detail: A logging probe (a debug redscript, <Mod>_TrailProbe.reds, deleted before ship) showed 49/49
201
+ requests for "trail_physical", not "trail_thermal". The fix was to pair `trail_physical ->
202
+ w_katana_swing_trail.effect` (the working one) and `trail_thermal ->
203
+ w_katana_thermal_swing_trail.effect` separately, instead of pointing both names at the thermal
204
+ visual. Confirmed in game on lights 2/3/4 after the pairing fix; the final gating chosen is ON
205
+ for light 3 and light 4 only (light 1 too subtle, heavies too slow to show the ribbon).
206
+ - id: cp2077.fx.effects.swing-trail-anchor-glow-arc-midpoint
207
+ claim: For a crescent-shaped blade, the correct swing-trail placement anchor is the midpoint of the
208
+ glow arc — the glow-mesh vertex farthest from the chord between the two horn tips — with the
209
+ perpendicular axis zeroed to center it in the blade's thickness; this is the crescent analogue
210
+ of the katana's straight-blade anchor point.
211
+ status: inferred
212
+ source: ModWright research
213
+ tags:
214
+ - fx
215
+ - swing-trail
216
+ - placement
217
+ - measurement
218
+ - crescent
219
+ detail: "Measured position (0, 0.2119, 0.2152) — the raw glow vertex is (-0.0112, 0.2119, 0.2152)
220
+ with X zeroed to centre it in the blade's ~22 mm thickness — 0.286 m of bulge from the chord.
221
+ Inferred, not verified: the anchor is an offline measurement. The trail carrying it was
222
+ separately confirmed rendering in game on lights 2/3/4
223
+ (cp2077.fx.effects.trail-name-resolved-from-damage-comparison), but the ribbon's TILT against
224
+ the blade plane has never been judged in game. The katana anchors at (0, -0.01, 0.5), out
225
+ along its straight blade; rotation is left identity (the katana's own trail carries a ~3
226
+ degree trim quaternion, noted as the knob to use if the ribbon ever reads tilted against the
227
+ blade plane in game)."
228
+ - id: cp2077.fx.effects.analytic-camera-projection-for-offline-placement-check
229
+ claim: Effect-placement offsets can be checked offline without a working render by projecting
230
+ measured 3D marker positions through the FPP camera analytically (Blender's
231
+ world_to_camera_view), reading off normalized screen-space x/y; this works even when the
232
+ render pipeline itself is broken for that scene.
233
+ status: inferred
234
+ source: ModWright research
235
+ tags:
236
+ - fx
237
+ - placement
238
+ - measurement
239
+ - camera-projection
240
+ - methodology
241
+ detail: 'Used to localize the smoke-placement bug precisely: PLACE0 (left) measured 0.0201 right of
242
+ its glow tip in normalized screen x, PLACE1 (right) measured -0.0508 (fine). The marker render
243
+ itself came out blank grey (a known silent-grey issue in this preview pipeline, referenced
244
+ elsewhere as "renders default to FPP camera"); the projection did not depend on the render
245
+ succeeding, so the fix (pulling PLACE0 1 cm toward the glow centroid, offset dropping to
246
+ +0.0023) was computed and shipped without needing that render fixed.'