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,352 @@
1
+ game: cyberpunk2077
2
+ topic: tweakdb.melee
3
+ title: Melee attack records, combo mechanics, and per-hit modifiers
4
+ facts:
5
+ - id: cp2077.tweakdb.melee.attack-lookup-by-state-plus-counter
6
+ claim: "The engine resolves which attack record to play by concatenating the state name with the
7
+ current combo counter — GetAttack(StringToName( stateName + IntToString(attackNumber))) — and
8
+ a missing record is not an error: the lookup simply returns null and the caller's enter
9
+ condition fails silently."
10
+ status: verified
11
+ source: ModWright field verification
12
+ tags:
13
+ - tweakdb
14
+ - melee
15
+ - attack-record
16
+ - lookup
17
+ - silent-failure
18
+ detail: This is the root mechanism behind the endless-flow bug/feature (see
19
+ cp2077.tweakdb.melee.missing-final-record-loops-combo-forever) and behind why authoring
20
+ <ModAttacks>.FinalAttack4 (named MeleeFinalAttack3, since AttacksNumber 4 puts the finisher at
21
+ counter 3) was required to get a real finisher instead of an infinite loop.
22
+ - id: cp2077.tweakdb.melee.dormant-fourth-combo-hit-in-all-vanilla-melee
23
+ claim: "Every vanilla held melee weapon ships with BaseStats.AttacksNumber = 3, so the authored 4th
24
+ combo-hit records (MeleeComboAttack3 across machete/chainsword/katana movesets — including the
25
+ machete/chainsword center thrust and the katana's 4th diagonal) exist in the game's data but
26
+ are dormant: no vanilla weapon's stat allows the state machine to ever reach them. Cyberware
27
+ weapons (strong arms 5, mantis blades 9) use higher AttacksNumber values, proving the state
28
+ machine natively supports longer chains."
29
+ status: inferred
30
+ source: ModWright research
31
+ tags:
32
+ - tweakdb
33
+ - melee
34
+ - attacksnumber
35
+ - dormant-content
36
+ - combo
37
+ detail: "A risk the note flags explicitly: authored records existing does not guarantee the
38
+ corresponding animation clip exists in a given weapon's anim set (later testing found only the
39
+ katana moveset had a real 4th-slash animation; the rest fell back to a bare left-hand punch —
40
+ animation content itself is out of scope for this file)."
41
+ - id: cp2077.tweakdb.melee.missing-final-record-loops-combo-forever
42
+ claim: If BaseStats.AttacksNumber is set to N and a combo record exists at index N-1 but no final
43
+ (finisher) record exists at that same index, the finisher's enter condition can never succeed,
44
+ the combo transition wins by default every time, and IncrementAttackNumber wraps the counter
45
+ back to 0 once it reaches N — producing an unbreakable light-attack loop with no finisher,
46
+ stopped only by stamina.
47
+ status: verified
48
+ source: ModWright field verification
49
+ tags:
50
+ - tweakdb
51
+ - melee
52
+ - attacksnumber
53
+ - combo
54
+ - infinite-loop
55
+ detail: Discovered by accident (AttacksNumber 4 on a machete-based weapon with only 3 final records
56
+ authored), then deliberately fixed for the shipped build by authoring
57
+ <ModAttacks>.FinalAttack4 so the finisher can enter at counter 3. The unpatched behavior is
58
+ kept as a documented, unshipped design option for a future no-finisher continuous-combo
59
+ variant.
60
+ - id: cp2077.tweakdb.melee.vanilla-infinite-combo-flag-pair
61
+ claim: "Vanilla has a distinct, runtime-toggleable mechanism for an unending combo, independent of
62
+ record-shape gaps: CheckIfInfiniteCombo requires BOTH BaseStats.CanWeaponInfinitlyCombo (on
63
+ the weapon record) and BaseStats.CanMeleeInfinitelyCombo (on the player) to be set; when both
64
+ are true, CheckIfFinalAttack returns false unconditionally (no finisher, ever) and
65
+ IncrementAttackNumber wraps the counter to 1 instead of 0."
66
+ status: inferred
67
+ source: ModWright research
68
+ tags:
69
+ - tweakdb
70
+ - melee
71
+ - infinite-combo
72
+ - status-effect
73
+ - community
74
+ detail: 'Wrapping to 1 rather than 0 means combo index 0 plays only once at the very start of a
75
+ chain (the loop afterward is 1->2->3->1->...), a thinner loop than the accidental record-shape
76
+ variant, which cycles all four indices (0->1->2->3->0). This is read from vanilla tweak files
77
+ and scripts, not independently tested — recorded as the documented foundation for a future
78
+ toggleable "flow state" ability, not as an observed result. (Reclassified from community to
79
+ inferred: the source is vanilla game data read directly, not a community claim.)'
80
+ - id: cp2077.tweakdb.melee.attack-records-live-in-per-family-packages
81
+ claim: Weapon attack records are NOT defined under a generic Attacks.* package; each weapon family
82
+ has its own package (MacheteAttacks.*, KatanaAttacks.*, ChainswordAttacks.*,
83
+ TwoHandHammerAttacks.*). Only the truly generic base classes (Slash, QuickMelee, ...) live
84
+ under Attacks.*. Get the correct record IDs from the base weapon's own `attacks` list in its
85
+ vanilla tweak file, verbatim.
86
+ status: inferred
87
+ source: ModWright research
88
+ tags:
89
+ - tweakdb
90
+ - melee
91
+ - attack-record
92
+ - package
93
+ - naming
94
+ detail: Cost several launch cycles to learn. Confirms the general TweakDB ground-truth rule
95
+ (cp2077.process.tweakdb-ground-truth) with a melee-specific gotcha not covered by that fact.
96
+ - id: cp2077.tweakdb.melee.tweakxl-log-required-after-yaml-changes
97
+ claim: TweakXL yaml errors (missing record, ambiguous definition) are completely silent in game and
98
+ only visible in red4ext\plugins\TweakXL\TweakXL-<timestamp>.log; always check that log after
99
+ any yaml change before concluding a change "did nothing."
100
+ status: verified
101
+ source: ModWright field verification
102
+ tags:
103
+ - tweakdb
104
+ - tweakxl
105
+ - log
106
+ - debugging
107
+ - archivexl
108
+ detail: "Named instance: \"the morning timing yaml's Attacks.* entries never applied\" and the log
109
+ was the only place that said why. Distinct from the unrelated CET-mod-status log check already
110
+ recorded as cp2077.packaging.cet-log-checks. Merged from an equivalent fact in the ArchiveXL
111
+ topic, which extends the same rule to the ArchiveXL side: after any .xl manifest edit, the
112
+ corresponding ArchiveXL log is the only confirmation that a resource patch, animations entry,
113
+ factory, localization or streaming block actually registered. The two named TweakXL failure
114
+ modes are \"record doesn't exist\" (an entirely unapplied edit) and \"Ambiguous definition\"
115
+ (see cp2077.tweakdb.melee.dotted-path-mod-of-same-file-record-fails)."
116
+ - id: cp2077.tweakdb.melee.dotted-path-mod-of-same-file-record-fails
117
+ claim: 'Modifying a record via a dotted path (e.g. Items.<ModWeapon>.attacks: appends) inside the
118
+ SAME yaml file that first defines that record fails with an "Ambiguous definition" error,
119
+ caused by declaration ordering; the fix is to put the modification in a second file that sorts
120
+ alphabetically after the first.'
121
+ status: inferred
122
+ source: ModWright research
123
+ tags:
124
+ - tweakdb
125
+ - tweakxl
126
+ - yaml
127
+ - ordering
128
+ - silent-failure
129
+ detail: 'Recorded pattern: a second, later-sorting file (a "<mod>_patch.yaml") for such appends. `-
130
+ !append` per-item is confirmed to work fine both inside record definitions and in dotted
131
+ modifications of existing records.'
132
+ - id: cp2077.tweakdb.melee.iconic-quality-pattern-confirmed-across-mods
133
+ claim: "The iconic-scaling pattern of quality: Quality.Random plus
134
+ Items.CraftableIconicQualityRandomisation appended to statModifierGroups (with
135
+ Quality.IconicItem appended to statModifiers) is confirmed working identically on a second,
136
+ independently-built iconic weapon, not just the mod it was first documented on."
137
+ status: verified
138
+ source: ModWright field verification
139
+ tags:
140
+ - tweakdb
141
+ - quality
142
+ - iconic
143
+ - confirmed
144
+ - cross-mod
145
+ detail: "Confirms cp2077.tweakdb.quality-stat-iconic-progression and
146
+ cp2077.tweakdb.craftable-iconic-quality-randomisation (both originally documented from a
147
+ ranged weapon mod): the melee mod's weapon record already carried the full iconic scaffold
148
+ (Quality.Random, IconicWeapon/CraftableIconic tags, Items.Iconic_Melee_Blueprint,
149
+ Items.Craftable_Iconic_Weapon) with no base-record change needed, unlike the ranged mod, which
150
+ had to author a custom blueprint for its heavily kitbashed sniper receiver — so the pattern
151
+ generalizes across weapon type (melee vs. ranged) without modification."
152
+ - id: cp2077.tweakdb.melee.candropweapon-defaults-off-not-immunity
153
+ claim: gamedataStatType.CanDropWeapon defaults to 0/false on most NPCs — it is an opt-in vanilla
154
+ ability flag, not a boss-immunity flag. Gating a custom disarm mechanic on this stat alone
155
+ will silently do nothing on ordinary NPCs; gate the mechanic on NPCPuppet.IsBoss() instead to
156
+ exempt bosses specifically.
157
+ status: verified
158
+ source: ModWright field verification
159
+ tags:
160
+ - tweakdb
161
+ - melee
162
+ - disarm
163
+ - stat
164
+ - gate
165
+ detail: "Observed vanilla behaviors once disarm worked: the dropped weapon is a damaged-quality
166
+ lootable, and NPCs re-equip a backup weapon (kept deliberately as counterplay rather than
167
+ patched out). A Stagger status effect was added on proc for readability."
168
+ - id: cp2077.tweakdb.melee.thermal-damage-flag-required-for-burn-application
169
+ claim: BaseStats.BurningApplicationRate is multiplied by the BaseStats.DealsThermalDamage flag in
170
+ base_melee's stat calculation (the flag is 0 on machetes by default); a plain additive
171
+ BurningApplicationRate modifier on a machete-family weapon will never show any burn chance
172
+ unless DealsThermalDamage is also explicitly set to 1.
173
+ status: verified
174
+ source: ModWright field verification
175
+ tags:
176
+ - tweakdb
177
+ - melee
178
+ - burning
179
+ - thermal
180
+ - stat-modifier
181
+ - silent-failure
182
+ detail: 'Fix shipped as two appended ConstantStatModifiers: DealsThermalDamage Additive 1, then
183
+ BurningApplicationRate Multiplier 0.75 (a token quality curve, since per-item proc damage
184
+ cannot itself be reduced). Ships alongside a parallel BleedingApplicationRate Multiplier 0.5,
185
+ described as "modest real baselines" the redscript disarm/burn logic stacks larger
186
+ attack-specific bonuses on top of (+25% light burn, +15% heavy bleed at Legendary).'
187
+ - id: cp2077.tweakdb.melee.tag-check-required-for-tiered-base-clones
188
+ claim: "Tiered spawn-preset records built as `$base: Items.<ModWeapon>` clones
189
+ (Items.<ModWeapon>_T2..T5) get their OWN distinct TweakDBIDs; redscript that gates a behavior
190
+ on exact TweakDBID equality to the base item silently skips every tiered clone. Use HasTag()
191
+ on a custom identity tag appended to the base record instead, which all clones inherit."
192
+ status: verified
193
+ source: ModWright field verification
194
+ tags:
195
+ - tweakdb
196
+ - melee
197
+ - tag
198
+ - tweakdbid
199
+ - base-clone
200
+ - silent-failure
201
+ detail: Both the disarm hook (HitReactionComponent.EvaluateHit) and the bullet deflect hook
202
+ (DamageSystem.ProcessBulletBlockAndDeflect) check
203
+ weapon.GetItemData().HasTag(n"<ModWeaponTag>") rather than comparing TweakDBIDs, specifically
204
+ because of this. The tag is appended once, on Items.<ModWeapon>, and inherited by every $base
205
+ clone.
206
+ - id: cp2077.tweakdb.melee.enableadjustingplayerpositiontotarget-lunge-flag
207
+ claim: enableAdjustingPlayerPositionToTarget on an attack record is the perk-free mechanism (read in
208
+ meleeTransitions.script:2345) that makes a vanilla blade's STRONG attack close distance to a
209
+ target; it requires a hostile within roughly 4 m and 10 degrees of the crosshair and does
210
+ nothing when swung at empty air (vanilla behavior, not a bug). Any light-chain or finisher
211
+ record can set it to gain the same lunge, since the code path (MeleeFinalAttackEvents.OnEnter
212
+ -> super.OnEnter, or the combo equivalent) is not exclusive to strong attacks.
213
+ status: verified
214
+ source: ModWright field verification
215
+ tags:
216
+ - tweakdb
217
+ - melee
218
+ - lunge
219
+ - target-snap
220
+ - attack-record
221
+ detail: "Distinct from BaseStats.CanMeleeLeap / the meleeLeap PSM state (which this mechanism is NOT
222
+ — that state is unreachable from a light chain, demanding a charged-hold release instead).
223
+ Enabled and tested on the light finisher (<ModAttacks>.FinalAttack4), then deliberately
224
+ DISABLED there by the author's call: by swing 4 of the light chain the player is already
225
+ standing on the target, so the gated ~4 m snap rarely fires and adds nothing — not a defect in
226
+ the mechanism, a mismatch with where the chain puts the player. Re-enabling is one
227
+ commented-out line. It was then MOVED to the chain OPENER instead: <ModAttacks>.ComboAttack1
228
+ (counter 0) sets enableAdjustingPlayerPositionToTarget: true, where the ~4 m closing gate
229
+ actually helps. A companion field, useAdjustmentInsteadOfImpulse (a target-free fixed-metres
230
+ variant), is explicitly left UNVERIFIED in the yaml — no vanilla record exercises it, and the
231
+ comment says not to add it without observing it first."
232
+ - id: cp2077.tweakdb.melee.vanilla-camera-impulse-inert-during-melee-attack
233
+ claim: Vanilla's generic camera-space movement impulse mechanism does not apply while the player is
234
+ in a melee-attack state, confirmed by in-game logging; a target-free forward-motion effect
235
+ during a melee attack cannot rely on that vanilla route and needs a custom implementation
236
+ instead.
237
+ status: verified
238
+ source: ModWright field verification
239
+ tags:
240
+ - tweakdb
241
+ - melee
242
+ - impulse
243
+ - lunge
244
+ - silent-failure
245
+ detail: "This is why the mod's lunge script exists at all: it reads the cameraSpaceImpulse field
246
+ itself and hands the state machine an adjustTransform call (the same underlying mechanism as
247
+ enableAdjustingPlayerPositionToTarget's target-snap), rather than relying on vanilla's own
248
+ impulse application."
249
+ - id: cp2077.tweakdb.melee.retiming-preserves-hit-frame-position
250
+ claim: When re-timing an attack record's startupDuration/activeDuration/ recoverDuration to speed up
251
+ or slow down a hand-keyed clip, scale ALL the state-time fields (including attackEffectDelay
252
+ and the attackWindow open/close bounds) by the same factor, so the hit frame and input-buffer
253
+ windows keep their original frame positions relative to the clip instead of drifting.
254
+ status: inferred
255
+ source: ModWright research
256
+ tags:
257
+ - tweakdb
258
+ - melee
259
+ - timing
260
+ - attack-record
261
+ - retiming
262
+ detail: "Worked example: StrongAttack1's 49-frame clip has phase markers at f~0/f12/f19 (30 fps);
263
+ durations 0.400/0.233/0.967 scaled by 0.9 keep the hit locked to clip frame 24 while the whole
264
+ swing plays 10% faster. Reverting is documented as deleting the three durations to restore the
265
+ pre-scale values (0.8/0.9/1.3/1.65)."
266
+ - id: cp2077.tweakdb.melee.trailstartdelay-999-disables-swing-trail-per-record
267
+ claim: Setting an attack record's trailStartDelay to a value larger than the clip's total length
268
+ (e.g. 999.0) disables the melee swing trail for that specific record without touching any
269
+ other record or any effect descriptor, because the trail only starts once elapsed state time
270
+ passes trailStartDelay.
271
+ status: verified
272
+ source: ModWright field verification
273
+ tags:
274
+ - tweakdb
275
+ - melee
276
+ - swing-trail
277
+ - attack-record
278
+ - per-record-toggle
279
+ detail: "Shipped gating (the author's verdict: trail ON only for light 3 and light 4): ComboAttack1,
280
+ ComboAttack2, StrongAttack1 and StrongAttack2 are pushed to trailStartDelay 999.0 by this
281
+ mechanism, while ComboAttack3 and FinalAttack4 are left at the inherited working 0.1 delay and
282
+ show the trail. See cp2077.fx.effects.trail-name-resolved-from-damage-comparison for why the
283
+ trail needed a separate effect-pairing fix before any of this per-record gating became visible
284
+ at all."
285
+ - id: cp2077.tweakdb.melee.deflect-tuning-stamina-and-ricochet
286
+ claim: "A weapon-specific bullet-deflect rework can independently tune: (a) the per-bullet stamina
287
+ cost while blocking bullets (vanilla divides StaminaCostToBlock by 2; this weapon divides by
288
+ 4), (b) a quality-scaled chance to ricochet a blocked-but-not-deflected bullet back WITHOUT
289
+ the Reflexes_Right_Perk_2_1 perk (vanilla requires the perk for any ricochet at all), and (c)
290
+ a flat damage multiplier on ricocheted damage WITH the perk. All three are implemented as a
291
+ @wrapMethod(DamageSystem) ProcessBulletBlockAndDeflect override gated on the blocking item's
292
+ tag."
293
+ status: inferred
294
+ source: ModWright research
295
+ tags:
296
+ - tweakdb
297
+ - melee
298
+ - deflect
299
+ - bullet
300
+ - stamina
301
+ - ricochet
302
+ detail: "Shipped values: stamina divisor 4.0 (vanilla 2.0); ricochet chance without the perk scales
303
+ by weapon quality: Legendary/Iconic 0.45, Epic 0.25, Rare 0.10, below-Rare 0.05 (the spec was
304
+ \"10% at rare, 45% at legendary\"; Epic interpolated). With the perk, ricochet damage is
305
+ multiplied 1.5x on top of the existing parry bump. The block prerequisite itself (a blade +
306
+ Reflexes_Right_Milestone_2 level 2) is explicitly kept, not part of this change — see
307
+ cp2077.tweakdb.melee.tag-check-required-for-tiered-base-clones for the identity-tag gating
308
+ mechanism this hook reuses. Inferred, not verified: the values are read out of the shipped
309
+ redscript; the source records no in-game observation of the ricochet rates themselves. The
310
+ gate in code is blockingItem.GetItemData().HasTag(n\"<ModWeaponTag>\"), despite the header
311
+ comment's looser \"gated on the blocking item being Items.<ModWeapon>\"."
312
+ - id: cp2077.tweakdb.melee.finisher-tag-backward-scan-selects-effect
313
+ claim: finisher.script scans a weapon's tags array BACKWARD and uses the first tag that resolves to
314
+ a 'playFinisher' game effect; appending a new finisher-identity tag to a weapon's tags list is
315
+ enough to make it win over an inherited finisher tag (e.g. OneHandBladeFinisher), with no
316
+ !remove of the inherited tag required.
317
+ status: inferred
318
+ source: ModWright research
319
+ tags:
320
+ - tweakdb
321
+ - melee
322
+ - finisher
323
+ - tag
324
+ - scan-order
325
+ detail: Cited from finisher.script:224-231 in the source mod's own comment. The specific finisher
326
+ motions this routes to (the mod's own finisher tag and its back variant) are
327
+ animation-workspot content outside this file's scope; only the generic tag-scan selection
328
+ mechanism is recorded here.
329
+ - id: cp2077.tweakdb.melee.iconic-melee-mod-element-is-items-iconicmeleeweaponmodelement
330
+ claim: The vanilla blueprint element that grants a melee weapon its iconic-mod attachment slot is
331
+ Items.IconicMeleeWeaponModElement (type ItemBlueprintElement, slot
332
+ AttachmentSlots.IconicMeleeWeaponMod1), declared in blueprint_elements.tweak beside
333
+ Items.IconicRangedWeaponModElement (slot AttachmentSlots.IconicWeaponModLegendary), and used
334
+ by the vanilla melee iconics' own blueprints (Preset_Baseball_Bat_Denny, Preset_Baton_Murphy,
335
+ Preset_Butchers_Knife_Iconic, Preset_Cane_Fingers and others, each through an inline
336
+ rootElement child with that slot).
337
+ status: verified
338
+ verified_on: "2.31"
339
+ source: installed Cyberpunk 2077 2.31 tools/redmod/tweaks (blueprint_elements.tweak,
340
+ melee/presets/*.tweak), via the ModWright vanilla index
341
+ tags:
342
+ - tweakdb
343
+ - melee
344
+ - iconic
345
+ - blueprint
346
+ - attachment-slot
347
+ - scaffold
348
+ detail: "Settles the name the new-item-chain scaffold's iconicModElementName input needed for a
349
+ melee base (its header called it UNCONFIRMED). Not yet seen in game: whether a mod-authored
350
+ blueprint carrying this element gives a scaffolded melee item a functional iconic slot is the
351
+ same open question as for the ranged element. One melee mod's iconic instead points blueprint:
352
+ at the vanilla Items.Iconic_Melee_Blueprint and never clones a blueprint."
@@ -0,0 +1,325 @@
1
+ game: cyberpunk2077
2
+ topic: tweakdb.weapons
3
+ title: Weapon records, damage calibration, and iconic modifiers
4
+ facts:
5
+ - id: cp2077.tweakdb.slot-part-list-preset-paints-weapon
6
+ claim: A weapon's visuals can be painted by giving it part records in slotPartListPreset whose
7
+ appearances carry the custom mesh.
8
+ status: contradicted
9
+ source: ModWright research
10
+ tags:
11
+ - appearance
12
+ - visual
13
+ - slot-part-list-preset
14
+ - body-part
15
+ - retracted
16
+ detail: "This was the mod's v1 belief, and the stale header comment of its tweak yaml still records
17
+ it (\"Visuals : G-58 Dian part records via slotPartListPreset\"). A complete part chain
18
+ (Items.<ModWeapon>BodyPart, based on Items.w_smg__kang_tao_dian__rcv1, with
19
+ appearanceResourceName: <mod>_body resolved through factory_parts.csv to
20
+ mod\\<modname>\\<mod>_body.app) was authored into slotPartListPreset and had no visual effect
21
+ at all. It still ships in the yaml, inert. Merged here from a former entities-focused fact,
22
+ which claimed the same mechanism plus an unsourced \"invisible weapon\" symptom. Superseded by
23
+ cp2077.tweakdb.weapon-visuals-via-appearanceresourcename."
24
+ - id: cp2077.tweakdb.weapon-visuals-via-appearanceresourcename
25
+ claim: Weapon visuals are painted by the weapon-level .app file resolved via the weapon record's
26
+ appearanceResourceName + the ArchiveXL factory csv, not by slotPartListPreset part
27
+ appearances.
28
+ status: verified
29
+ verified_on: "2.31"
30
+ source: ModWright field verification
31
+ tags:
32
+ - appearance
33
+ - visual
34
+ - factory
35
+ - appearance-resource-name
36
+ - slot-part-list-preset
37
+ supersedes: cp2077.tweakdb.slot-part-list-preset-paints-weapon
38
+ detail: "Items.Preset_<ModWeapon> sets appearanceResourceName: <ModWeapon>_Weapon, which
39
+ mod\\<modname>\\factory_parts.csv maps to mod\\<modname>\\<mod>_weapon.app. The part chain in
40
+ slotPartListPreset did nothing until that weapon-level .app existed."
41
+ - id: cp2077.tweakdb.iconic-blueprint-required-for-mod-slot
42
+ claim: The IconicWeaponModLegendary attachment slot only exists if the weapon blueprint is an iconic
43
+ blueprint; on a non-iconic blueprint the slot is absent and the iconic modifier (which carries
44
+ all the special stats) is silently dropped.
45
+ status: verified
46
+ verified_on: "2.31"
47
+ source: ModWright field verification
48
+ tags:
49
+ - blueprint
50
+ - iconic
51
+ - attachment-slot
52
+ - silent-failure
53
+ detail: The v1 weapon shipped with every iconic stat missing and no error. <ModWeapon>Blueprint is
54
+ based on Items.Base_Smart_Precision_Sniper_Rifle_NoMuzzle_Blueprint and adds
55
+ Items.IconicRangedWeaponModElement to rootElement.childElements — that child element is what
56
+ supplies the iconic mod slot the modifier lives in.
57
+ - id: cp2077.tweakdb.damage-per-hit-empirical-calibration
58
+ claim: DamagePerHit must be calibrated empirically by reading the in-game damage panel at each tier;
59
+ the panel value derives from a DPS/DamagePerHit interplay that no formula in the sources
60
+ predicts.
61
+ status: verified
62
+ verified_on: "2.31"
63
+ source: ModWright field verification
64
+ tags:
65
+ - damage
66
+ - damage-per-hit
67
+ - calibration
68
+ - balance
69
+ - in-game
70
+ detail: "Readings on the Ashura base, with modifierType AdditiveMultiplier on
71
+ BaseStats.DamagePerHit: -0.25 -> 278 at T5; -0.104 -> 333 (the mod's notes: \"calibrated so
72
+ Tier 5 shows 333 dmg\"). The yaml comment records the arithmetic behind the second value:
73
+ unpenalized Tier-5 base 371 (443/1.194), 371 x 0.896 = 332. The shipped main file uses -0.104;
74
+ a balanced variant file uses -0.5, where \"the full burst (2 rounds) totals one vanilla Ashura
75
+ shot (371): each round lands ~186\"."
76
+ - id: cp2077.tweakdb.twin-lock-stat-modifiers
77
+ claim: "Twin smart-lock (both hip and ADS) requires two separate stat modifiers:
78
+ BaseStats.SmartGunAdsMaxLockedTargets +1 and BaseStats.SmartGunHipMaxLockedTargets +1
79
+ (modifierType Additive), both on the iconic modifier."
80
+ status: verified
81
+ verified_on: "2.31"
82
+ source: ModWright field verification
83
+ tags:
84
+ - smart-weapon
85
+ - lock
86
+ - stat-modifier
87
+ - dual-target
88
+ detail: The yaml comment records the Ashura stock value as 1 for each (hip and ADS single-target);
89
+ +1 additive on each yields 2 simultaneous locks. The stock value is an authoring comment, not
90
+ a measurement.
91
+ - id: cp2077.tweakdb.burst-fire-true-two-rounds
92
+ claim: A true 2-round burst (both rounds real, each consuming ammo and able to strike a different
93
+ lock) is produced by BaseStats.NumShotsInBurst +2 and BaseStats.CycleTime_Burst +0.06
94
+ (Additive) on the iconic modifier, with TriggerMode.Burst as the weapon's primaryTriggerMode.
95
+ status: verified
96
+ verified_on: "2.31"
97
+ source: ModWright field verification
98
+ tags:
99
+ - burst
100
+ - fire-mode
101
+ - ammo
102
+ - cycle-time
103
+ detail: "Shipped behaviour per the mod's notes: \"fires 2, consumes 2, mag = 2 (twin chambers)\".
104
+ The +0.06 CycleTime_Burst is the near-simultaneous gap between the paired rounds."
105
+ - id: cp2077.tweakdb.magazine-capacity-twin-chamber
106
+ claim: A twin-chamber weapon that empties on one trigger pull needs BaseStats.MagazineCapacity +1
107
+ (Additive) over the vanilla Ashura base of 1, giving capacity 2.
108
+ status: verified
109
+ verified_on: "2.31"
110
+ source: ModWright field verification
111
+ tags:
112
+ - magazine
113
+ - capacity
114
+ - twin
115
+ - chamber
116
+ - reload
117
+ detail: The yaml comment records the vanilla Ashura MagazineCapacity as 1 ("loads a single round per
118
+ reload"); this gun chambers a pair, so one pull empties the magazine and forces a reload.
119
+ - id: cp2077.tweakdb.headshot-multiplier-stat
120
+ claim: BaseStats.HeadshotDamageMultiplier takes an Additive stat modifier; a ranged weapon mod ships
121
+ value 2.5.
122
+ status: verified
123
+ verified_on: "2.31"
124
+ source: ModWright field verification
125
+ tags:
126
+ - headshot
127
+ - damage-multiplier
128
+ - stat
129
+ detail: "The sources describe the same +2.5 additive two ways: the yaml comment and README call it a
130
+ \"250% headshot bonus\", the mod's design notes call it \"+400% headshot (+2.5 additive)\". No
131
+ source states how the engine folds the additive into the final headshot multiplier, so do not
132
+ quote a total multiplier."
133
+ - id: cp2077.tweakdb.projectile-velocity-stat
134
+ claim: BaseStats.SmartGunPlayerProjectileVelocity is the smart-weapon projectile speed stat; the
135
+ Ashura base is 80 and an Additive +20 takes it to 100.
136
+ status: verified
137
+ verified_on: "2.31"
138
+ source: ModWright field verification
139
+ tags:
140
+ - projectile
141
+ - velocity
142
+ - stat
143
+ - smart-weapon
144
+ detail: The shipped modifier (+20 Additive) is part of the weapon confirmed in game; the base value
145
+ 80 and the resulting 100 come from the yaml authoring comment, not from a reading. The units
146
+ are not documented in the sources.
147
+ - id: cp2077.tweakdb.smart-targeting-reticle-size
148
+ claim: BaseStats.SmartGunTargetingRectangleSizeIncrease is expressed in percent as an Additive
149
+ modifier; a ranged weapon mod ships value 25 for a +25% smart reticle.
150
+ status: verified
151
+ verified_on: "2.31"
152
+ source: ModWright field verification
153
+ tags:
154
+ - smart-weapon
155
+ - ui
156
+ - targeting
157
+ - reticle
158
+ detail: That the stat is in percent is the yaml comment's statement; only the shipped value (25) and
159
+ the described effect (+25%) are recorded elsewhere.
160
+ - id: cp2077.tweakdb.weapon-noise-silencer-stat
161
+ claim: BaseStats.WeaponNoise Additive -10 is the vanilla SilencerBase value and is what an integral
162
+ suppressor applies on the weapon.
163
+ status: verified
164
+ verified_on: "2.31"
165
+ source: ModWright field verification
166
+ tags:
167
+ - weapon-noise
168
+ - suppressor
169
+ - silencer
170
+ - stealth
171
+ detail: Applied on the iconic modifier alongside RicochetCount x0. The sources state the value and
172
+ its vanilla origin, not the detection-range curve it feeds.
173
+ - id: cp2077.tweakdb.ricochet-count-multiplier-zero
174
+ claim: BaseStats.RicochetCount with modifierType Multiplier and value 0 removes ricochets; a weapon
175
+ mod applies it as part of the integral-suppressor stat block.
176
+ status: verified
177
+ verified_on: "2.31"
178
+ source: ModWright field verification
179
+ tags:
180
+ - ricochet
181
+ - suppressor
182
+ - stat
183
+ detail: Copied from the vanilla SilencerBase stat set, which pairs WeaponNoise -10 with
184
+ RicochetCount x0.
185
+ - id: cp2077.tweakdb.can-silent-kill-on-weapon-record
186
+ claim: BaseStats.CanSilentKill +1 must sit in the weapon record's own statModifiers, not on the
187
+ iconic-mod part record, because StealthRunner's detection patch (bug_fixes.reds) falls back to
188
+ scanning the record's statModifiers.
189
+ status: inferred
190
+ source: ModWright research
191
+ tags:
192
+ - stealth
193
+ - silent-kill
194
+ - stat
195
+ - iconic-modifier
196
+ - interoperability
197
+ detail: A weapon mod places it on Items.Preset_<ModWeapon>, not <ModWeapon>IconicWeaponMod, which
198
+ the yaml comment says is how Wind (Silent Ashura) stays reliably silent. The placement ships
199
+ in the working weapon, but no source records testing the part-record placement and observing a
200
+ failure, so the causal claim is reasoning, not observation.
201
+ - id: cp2077.tweakdb.quality-stat-iconic-progression
202
+ claim: "quality: Quality.Random on an iconic weapon is what makes it scale with player level like
203
+ other iconics; the actual tier is fixed when the item is crafted."
204
+ status: verified
205
+ verified_on: "2.31"
206
+ source: ModWright field verification
207
+ tags:
208
+ - quality
209
+ - iconic
210
+ - progression
211
+ - scaling
212
+ detail: Paired with the tiered craftables Items.$(tier)_<ModWeapon> and their recipes, this is the
213
+ pattern that gives the level-banded spec drop shipped in the mod's v1.0.0.
214
+ - id: cp2077.tweakdb.craftable-iconic-quality-randomisation
215
+ claim: Items.CraftableIconicQualityRandomisation is appended to statModifierGroups on a craftable
216
+ iconic weapon; a weapon mod ships it alongside quality Quality.Random.
217
+ status: verified
218
+ verified_on: "2.31"
219
+ source: ModWright field verification
220
+ tags:
221
+ - crafting
222
+ - quality
223
+ - stat-modifier-group
224
+ - iconic
225
+ detail: "Appended as `statModifierGroups: [!append Items.CraftableIconicQualityRandomisation]`, with
226
+ `statModifiers: [!append Quality.IconicItem]` on the same record. The sources state the
227
+ pairing, not the internal roll mechanics."
228
+ - id: cp2077.tweakdb.tier-badge-quality-stat-times-two
229
+ claim: The in-game item tier badge comes from the Quality STAT x 2 (EffectiveTier).
230
+ status: verified
231
+ verified_on: "2.31"
232
+ source: ModWright field verification
233
+ tags:
234
+ - quality
235
+ - tier
236
+ - badge
237
+ - visual
238
+ - stat
239
+ detail: Read off the in-game item panel while working on tiered weapons. The lesson's other half —
240
+ that the `quality:` field only seeds loot rolls — is
241
+ cp2077.tweakdb.quality-field-loot-roll-seed.
242
+ - id: cp2077.tweakdb.quality-field-loot-roll-seed
243
+ claim: The `quality:` field on a weapon record only seeds loot rolls; it does not set the displayed
244
+ tier.
245
+ status: verified
246
+ verified_on: "2.31"
247
+ source: ModWright field verification
248
+ tags:
249
+ - quality
250
+ - loot
251
+ - recipe
252
+ - tier
253
+ detail: "In a weapon mod, crafted tiers come from the tiered craftable records
254
+ Items.$(tier)_<ModWeapon> (quality: Quality.$(tier)) that the tiered recipes produce, not from
255
+ Items.Preset_<ModWeapon>'s own Quality.Random."
256
+ - id: cp2077.tweakdb.weapons.spawned-weapon-itemid-carries-a-seed-so-bare-tdbid-reads-miss-it
257
+ claim: "A weapon added with Game.AddToInventory(recordId, 1) is present in the inventory, but
258
+ Game.GetTransactionSystem():GetItemQuantity(player, ItemID.FromTDBID(TweakDBID.new(recordId)))
259
+ returns 0 and HasItem(...) returns false for it, in the same tick and seconds later: a bare
260
+ TweakDB id does not identify a spawned weapon instance, whose ItemID carries a per-instance
261
+ seed. Counting spawned weapons needs an inventory walk, not a TDBID query."
262
+ status: verified
263
+ verified_on: "2.31"
264
+ source: ModWright field verification
265
+ tags:
266
+ - tweakdb
267
+ - weapons
268
+ - itemid
269
+ - inventory
270
+ - cet
271
+ - eval
272
+ - read-back
273
+ detail: The "seed" explanation is the standard one for weapon ItemIDs and is inferred here; the
274
+ observation is only that the TDBID-based reads miss the spawned item. A CET-side count that
275
+ walks the inventory was not tried.
276
+ - id: cp2077.tweakdb.weapons.blueprint-root-restated-with-only-the-iconic-element-yields-no-slots
277
+ claim: "A project blueprint that $base's a vanilla weapon blueprint and restates rootElement with
278
+ childElements holding only Items.IconicRangedWeaponModElement (no slot, none of the base
279
+ root's children) gives the item no attachment slots at all in the weapon modding screen: the
280
+ base's mod slots are gone and no iconic slot appears either. The restatement replaces the
281
+ inherited root rather than adding to it."
282
+ status: verified
283
+ verified_on: "2.31"
284
+ source: ModWright field verification
285
+ tags:
286
+ - tweakdb
287
+ - weapons
288
+ - blueprint
289
+ - iconic
290
+ - attachment-slot
291
+ - scaffold
292
+ detail: "Answered on 2026-09-12 (the next fact): with the base's slot and children restated beside
293
+ the iconic element the base's slots come back, and an iconic slot with no part in it is not
294
+ listed at all. The vanilla index names a root's inline children <root>_inline0/1/2 while the
295
+ engine flattens them to <blueprint>_inline1/2/3, so a restatement cannot copy the index's
296
+ inline names verbatim; the blueprint-root lookup renders inline elements as nested mappings
297
+ instead."
298
+ - id: cp2077.tweakdb.weapons.restated-root-with-base-children-keeps-base-slots-and-empty-iconic-slot-is-unlisted
299
+ claim: "A project blueprint that $base's a vanilla weapon blueprint and restates rootElement with
300
+ the base root's own slot and every child (named elements by name, inline ones as nested
301
+ slot/childElements mappings) plus Items.IconicRangedWeaponModElement first keeps the base's
302
+ attachment slots: at the same tier the clone's tooltip lists exactly the slots the vanilla
303
+ base's tooltip lists (equipped, the clone's panel lists that same single slot; the vanilla was
304
+ not equipped). Which mod slots appear is gated by tier, not by the blueprint (a Tier 1 vanilla
305
+ JKE-X2 Kenshin lists only \"Empty Scope Slot\" while a Tier 5 one lists the scope and two mod
306
+ slots), and the iconic slot the IconicRangedWeaponModElement opens
307
+ (AttachmentSlots.IconicWeaponModLegendary) is not listed while nothing is attached in it."
308
+ status: verified
309
+ verified_on: "2.31"
310
+ source: ModWright field verification
311
+ related:
312
+ - cp2077.tweakdb.weapons.blueprint-root-restated-with-only-the-iconic-element-yields-no-slots
313
+ - cp2077.tweakdb.iconic-blueprint-required-for-mod-slot
314
+ tags:
315
+ - tweakdb
316
+ - weapons
317
+ - blueprint
318
+ - iconic
319
+ - attachment-slot
320
+ - tier
321
+ - scaffold
322
+ detail: Showing the iconic slot populated therefore needs an iconic modifier part authored on the
323
+ element (a <ModWeapon>IconicWeaponMod in its slotPartListPreset), which stays the scaffold's
324
+ manual step. The Tier 5 control comes from an earlier launch (2026-09-11), the Tier 1 pair
325
+ from this one (2026-09-12); no tier in between was observed.