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,128 @@
1
+ game: cyberpunk2077
2
+ topic: npc.behaviour
3
+ title: How NPCs treat a stand-in body, and what a hidden NPC still does (attitude, streaming,
4
+ damage, enemy hacks)
5
+ facts:
6
+ - id: cp2077.npc.behaviour.squads-obey-the-group-attitude
7
+ claim: "A squad treats a body by its attitude group, not by per-agent attitudes: with the body in
8
+ the player's group, AttitudeAgent SetAttitudeTowards(Neutral) both ways toward each squadmate
9
+ did not stop them attacking it at once. With the body in the squad's own group they left it
10
+ alone, but the player's gun lowers at a friendly, and a provoked squadmate turned the whole
11
+ group on itself (the released target too)."
12
+ status: verified
13
+ verified_on: "2.31"
14
+ source: ModWright field verification
15
+ tags:
16
+ - attitude
17
+ - squad
18
+ - group
19
+ - replacer
20
+ - combat
21
+ - id: cp2077.npc.behaviour.the-builtin-neutral-group
22
+ claim: The engine's built-in attitude groups 'friendly', 'neutral' and 'hostile' have fixed
23
+ relations (CanChangeAttitudeRelationFor refuses them) and can be assigned with
24
+ AttitudeAgent.SetAttitudeGroup, as vanilla's dynamic spawns do with 'hostile'. A body put in
25
+ 'neutral' is left alone by a squad until it shoots one; then only that squad turns on it
26
+ (vanilla's per-agent AIActionHelper hostility), and the player's gun does not lower at them.
27
+ status: verified
28
+ verified_on: "2.31"
29
+ source: ModWright field verification
30
+ tags:
31
+ - attitude
32
+ - neutral
33
+ - group
34
+ - squad
35
+ related:
36
+ - cp2077.npc.behaviour.squads-obey-the-group-attitude
37
+ - id: cp2077.npc.behaviour.aiteleportcommand-runs-late-in-combat
38
+ claim: "An AITeleportCommand waits for the NPC's AI to take it: in combat it ran seconds late (the
39
+ NPC showed at its old spot, then jumped). The TeleportationFacility moves an unfrozen NPC at
40
+ once; sent before the NPC is unhidden, with the AI command after it, the NPC appeared at the
41
+ target spot (0 m, 0.7 m)."
42
+ status: verified
43
+ verified_on: "2.31"
44
+ source: ModWright field verification
45
+ tags:
46
+ - teleport
47
+ - ai
48
+ - combat
49
+ - npc
50
+ - id: cp2077.npc.behaviour.a-left-behind-world-npc-streams-out
51
+ claim: "A world (community) NPC left where it stood while the player travels far streams out: the
52
+ script's reference goes undefined, and when the player returns a new instance stands at its
53
+ streaming origin, beyond the old reference. World NPCs cannot be despawned from script
54
+ (spawn::Set::DespawnObject removes only its own set's), so a stand-in that must keep the NPC's
55
+ identity moves the hidden NPC along with the player's body (a teleport every second) instead."
56
+ status: verified
57
+ verified_on: "2.31"
58
+ source: ModWright field verification
59
+ tags:
60
+ - streaming
61
+ - community
62
+ - npc
63
+ - despawn
64
+ - follow
65
+ - id: cp2077.npc.behaviour.a-hidden-npc-keeps-its-hit-shapes
66
+ claim: "An NPC hidden by masks and toggles with collision disabled (NPCPuppet.DisableCollision) can
67
+ still be shot and killed: its hit shapes stay. Invulnerable god mode
68
+ (GodModeSystem.AddGodMode) makes it take no damage; its release must remove the god mode
69
+ before any scripted kill. The hit representation's scale event
70
+ (HitRepresentation_SetSingleScaleMultiplier_AllShapes) was sent too; whether it lets shots
71
+ pass is not separated from the god mode."
72
+ status: verified
73
+ verified_on: "2.31"
74
+ source: ModWright field verification
75
+ tags:
76
+ - damage
77
+ - godmode
78
+ - hitshape
79
+ - hide
80
+ - npc
81
+ - id: cp2077.npc.behaviour.an-npc-upload-on-a-stand-in-body
82
+ claim: "An enemy netrunner's quickhack upload aimed at the player's stand-in body runs through
83
+ UploadFromNPCToPlayerListener, which holds V's UI_HUDProgressBar and a 'PlayerBeingHacked'
84
+ save lock until the upload pool completes. Despawning the body mid-upload cuts it off: the bar
85
+ stays, the lock stays, and a red link from the netrunner through the squadmate it hacks
86
+ through (its proxy) to the body's last spot stays until that squadmate dies; it is not a
87
+ NetworkSystem link. Applying AIQuickHackStatusEffect.HackingInterrupted to the squadmates
88
+ carrying AIQuickHackStatusEffect.Hacking, and releasing a second later with the body still
89
+ there, ends it as \"failed\" with the bar and the link gone."
90
+ status: verified
91
+ verified_on: "2.31"
92
+ source: ModWright field verification
93
+ tags:
94
+ - netrunner
95
+ - upload
96
+ - quickhack
97
+ - hud
98
+ - save-lock
99
+ - replacer
100
+ - id: cp2077.npc.behaviour.a-replacer-is-the-player-main-object
101
+ claim: While a replacer body is enabled (the player system's replacer enable),
102
+ PlayerSystem.GetLocalPlayerMainGameObject returns the body, not V; code that means V must keep
103
+ V's own puppet from before the take.
104
+ status: inferred
105
+ verified_on: "2.31"
106
+ source: ModWright research
107
+ tags:
108
+ - replacer
109
+ - player
110
+ - main-object
111
+ - id: cp2077.npc.behaviour.spawned-npc-ability-stats-read-zero
112
+ claim: An NPC spawned from its record with exEntitySpawner.SpawnRecord reads 0 for the HasX /
113
+ CanQuickhack stats its archetype's ability groups grant (HasSandevistan, HasKerenzikov,
114
+ HasChargeJump, CanQuickhack), while TweakDBInterface's ability list for the record holds them
115
+ and the scanner shows them. An NPC placed by the world reads the same stats as 1. A script
116
+ gate on those stats refuses spawned NPCs that a player would expect to pass; reading the
117
+ ability list as well matches both.
118
+ status: verified
119
+ verified_on: "2.31"
120
+ source: ModWright field verification
121
+ tags:
122
+ - npc
123
+ - abilities
124
+ - stats
125
+ - spawn
126
+ - exentityspawner
127
+ detail: One spawned record, Character.lmg_dude, read no archetype at all in game, though the vanilla
128
+ index gives it ArchetypeData.HeavyRangedT2.
@@ -0,0 +1,490 @@
1
+ game: cyberpunk2077
2
+ topic: npc.locomotion
3
+ title: NPC locomotion, reactions and the animation graph - what script can and cannot drive on a
4
+ puppet whose mover is defeated
5
+ facts:
6
+ - id: cp2077.npc.locomotion.graph-archive
7
+ claim: The gameplay humanoid animation graph is base\gameplay\anim_graphs\humanoid.animgraph and it
8
+ is listed by exactly one archive, archive\pc\content\basegame_3_nightcity.archive (not the
9
+ animation archive). WolvenKit's `unbundle -w` matches the whole depot path, so the filename
10
+ alone finds nothing; a pattern such as "*anim_graphs*humanoid.animgraph" is needed. Serialized
11
+ with `convert serialize` the file is about 420 MB of JSON.
12
+ status: verified
13
+ verified_on: "2.31"
14
+ source: ModWright field verification
15
+ tags:
16
+ - animgraph
17
+ - humanoid
18
+ - archive
19
+ - wolvenkit
20
+ - resource
21
+ - id: cp2077.npc.locomotion.graph-feature-inputs
22
+ claim: 'humanoid.animgraph declares 51 animAnimFeatureEntry inputs. The locomotion one is
23
+ animAnimFeature_Locomotion on the input name "locomotion" and it is the only one; there is NO
24
+ animAnimFeature_Movement entry, so AnimFeature_Movement.SetSpeed applied on "locomotion" is
25
+ ignored. Other inputs worth knowing: animAnimFeatureFreezeFrame => "FreezeFrame",
26
+ entAnimFeature_LookAt => "lookAt", animAnimFeature_NPCState => "highLevelState" /
27
+ "upperBodyState" / "stanceState", animAnimFeature_HitReactionsData => "hit",
28
+ AnimFeature_StimReactions => "stimReaction", AnimFeature_NPCStatusEffect => "statusEffect",
29
+ animAnimFeatureUpdateWorkspot => "UpdateWorkspot", animAnimFeature_CrowdLocomotion =>
30
+ "crowd_locomotion", twelve animAnimFeature_AIAction inputs and the six
31
+ AnimFeature_PhotomodeBodyPartRotate ones.'
32
+ status: verified
33
+ verified_on: "2.31"
34
+ source: ModWright field verification
35
+ tags:
36
+ - animgraph
37
+ - animfeature
38
+ - locomotion
39
+ - humanoid
40
+ detail: Confirms and completes a partial list read earlier in an in-game probe.
41
+ - id: cp2077.npc.locomotion.action-is-movelocomotionaction
42
+ claim: The graph's locomotion transitions are animAnimStateTransitionCondition_IntFeature conditions
43
+ on featureName "locomotion", featurePropertyName "action", compared against 0,1,3,4,5,6,7 (36
44
+ conditions) and "style" (7 conditions). Those values are moveLocomotionAction term for term
45
+ (Undefined 0, Exploration 1, Idle 2, IdleTurn 3, Reposition 4, Start 5, Move 6, Stop 7), the
46
+ enum returned by MovePoliciesComponent.GetCurrentLocomotionAction(); the same component
47
+ answers GetInclineAngle() and IsOnStairs(), the other two animAnimFeature_Locomotion fields.
48
+ The locomotion feature is therefore the move-policies/mover state published to the graph by
49
+ the engine, not something a caller asserts.
50
+ status: verified
51
+ verified_on: "2.31"
52
+ source: ModWright field verification
53
+ tags:
54
+ - animgraph
55
+ - locomotion
56
+ - movepolicies
57
+ - mover
58
+ - walk-cycle
59
+ - id: cp2077.npc.locomotion.feature-class-not-in-script
60
+ claim: "animAnimFeature_Locomotion is declared nowhere a redscript can reach: not in the shipped
61
+ scripts (core\\animation\\animFeature.script declares AnimFeature_Movement at :157-160,
62
+ AnimFeature_NPCState at :20-23, AnimFeature_StimReactions at :770-773 and forty others, but no
63
+ Locomotion feature; the only \"Locomotion\" classes in the tree are
64
+ AnimFeature_PlayerLocomotionStateMachine at :169 and the drone's
65
+ ApplyDroneLocomotionWrapperEvent) and not in Codeware 1.20.3, which declares
66
+ animAnimFeature_CrowdLocomotion (:5699) and adds the fields of AnimFeature_Movement (:238-256)
67
+ but not the Locomotion feature. No script can build the object the graph's locomotion input
68
+ expects."
69
+ status: verified
70
+ verified_on: "2.31"
71
+ source: ModWright field verification
72
+ tags:
73
+ - animfeature
74
+ - locomotion
75
+ - redscript
76
+ - codeware
77
+ - id: cp2077.npc.locomotion.locomotioncycle-is-a-spawn-style
78
+ claim: 'LocomotionCycle01..14 are a spawn-time style roll, not a walk gate:
79
+ NPCPuppet.SetRandomAnimWrappersForLocomotion() does RandRange(1,15) and sets exactly one of
80
+ them to 1.0 (then, by visual tag, LowlifeLocomotion / MidCorpLocomotion / PoshLocomotion /
81
+ DirtGirlLocomotion / HomelessLocomotion / FreakLocomotion / JunkieLocomotion), and its only
82
+ caller is OnGameAttached. The serialized humanoid.animgraph contains ZERO occurrences of the
83
+ string "LocomotionCycle" and none of its 84 distinct wrapperNames is one, so
84
+ SetAnimWrapperWeight(npc, n"LocomotionCycle01", 1.0) on a puppet running that graph cannot
85
+ start a walk.'
86
+ status: verified
87
+ verified_on: "2.31"
88
+ source: ModWright field verification
89
+ tags:
90
+ - animwrapper
91
+ - locomotioncycle
92
+ - walk-cycle
93
+ - animgraph
94
+ - id: cp2077.npc.locomotion.graph-wrapper-names
95
+ claim: The locomotion-relevant anim wrappers humanoid.animgraph itself reads (on its
96
+ animAnimNode_WrapperValue nodes) are combatLocomotion, stealthLocomotion, alertedLocomotion,
97
+ FearLocomotion1..4, woundedLocomotion_l_arm / _r_arm / _l_leg / _r_leg,
98
+ dismemberedLocomotion_l_arm / _r_arm, blockStateLocomotion, the prop-carry set
99
+ (BucketLocomotion, BucketheadLocomotion, CanLocomotion, CellphoneLocomotion,
100
+ CellphoneTalkingLocomotion, CigaretteLocomotion, CrateLocomotion, DufflebagLocomotion,
101
+ LaptopbagLocomotion, PurseLocomotion, TabletLocomotion, UmbrellaLocomotion,
102
+ WaitressLocomotion), plus crowd, Droid, NCPD, Sandevistan, inVehicle, fear, panic, disturbed,
103
+ JackieWounded, the Cyb_* / Wea_* / w_* item wrappers and three sportbike seats - 84 distinct
104
+ names in all. They pick WHICH locomotion set plays, never whether it plays.
105
+ status: verified
106
+ verified_on: "2.31"
107
+ source: ModWright field verification
108
+ tags:
109
+ - animwrapper
110
+ - animgraph
111
+ - locomotion
112
+ - id: cp2077.npc.locomotion.no-external-locomotion-event
113
+ claim: humanoid.animgraph has 29 animAnimStateTransitionCondition_ExternalEvent transitions and
114
+ their complete set of event names is "hit" (16), "Shoot" (3), "Reload" (3), "PlayBlock" (2),
115
+ "PlayParry", "ActionStartup", "ActionLoop", "ActionRecovery", "RepeatActionLoop". There is no
116
+ locomotion event, so AnimationControllerComponent.PushEvent / PushEventToReplicate cannot
117
+ start the leg cycle.
118
+ status: verified
119
+ verified_on: "2.31"
120
+ source: ModWright field verification
121
+ tags:
122
+ - animgraph
123
+ - pushevent
124
+ - animationcontrollercomponent
125
+ - locomotion
126
+ - id: cp2077.npc.locomotion.no-mover-velocity-api
127
+ claim: There is no script API that sets a puppet's mover velocity. The only reference to
128
+ moveComponent in the whole shipped script tree is
129
+ MoveComponentVelocityProvider.CreateMoveComponentVelocityProvider(puppet), a read-only
130
+ velocity source; Codeware declares `moveComponent extends entIMoverComponent {}` with no
131
+ members and entIMoverComponent as an empty importonly class. The motion planner exposes
132
+ exactly one field, moveMotionPlannerComponent.snapToGround (writable through Codeware).
133
+ status: verified
134
+ verified_on: "2.31"
135
+ source: ModWright field verification
136
+ tags:
137
+ - movecomponent
138
+ - mover
139
+ - velocity
140
+ - codeware
141
+ - snaptoground
142
+ - id: cp2077.npc.locomotion.movepolicies-is-script-reachable
143
+ claim: MovePolicies is an ordinary new-able IScriptable with SetDestinationPosition,
144
+ SetDestinationObject, SetMovementType, SetUseStartStop, SetIgnoreNavigation,
145
+ SetDistancePolicy, SetStopOnObstacle, SetCollisionAvoidancePolicy, SetPositionProvider and
146
+ thirty more; ScriptedPuppet.GetMovePolicesComponent() is public and
147
+ MovePoliciesComponent.AddPolicies / PopPolicies take it. That is exactly how the AI moves an
148
+ NPC (AIActionMovePolicy.Add fills one from a MovementPolicy_Record and pushes it). Speed is
149
+ tunable with AIHumanComponent.SetMovementParams / GetMovementParams. Pushing a destination is
150
+ the only script-reachable input the graph's own locomotion conditions can see, and it needs
151
+ the mover alive.
152
+ status: verified
153
+ verified_on: "2.31"
154
+ source: ModWright field verification
155
+ tags:
156
+ - movepolicies
157
+ - walk-cycle
158
+ - mover
159
+ - movementparameters
160
+ - id: cp2077.npc.locomotion.no-script-walk-with-mover-defeated
161
+ claim: With the mover defeated (AIHumanComponent.Toggle(false) plus per-frame SetWorldTransform) NO
162
+ script-reachable path drives the humanoid leg cycle. Feeding AnimFeature_Movement on
163
+ "locomotion", setting the LocomotionCycle0N wrappers, pushing an animation event and writing
164
+ mover velocity are each ruled out by a read of the graph or of the script surface. The two
165
+ designs that can work are (a) let the mover move the body through a MovePolicies destination
166
+ and correct the transform only on drift, and (b) put the puppet in a workspot with a
167
+ walk-in-place clip, which plays with the mover off but owns the whole body.
168
+ status: inferred
169
+ verified_on: "2.31"
170
+ source: ModWright research
171
+ tags:
172
+ - walk-cycle
173
+ - mover
174
+ - locomotion
175
+ - design
176
+ related:
177
+ - cp2077.npc.locomotion.movepolicies-is-script-reachable
178
+ - cp2077.npc.locomotion.workspot-jump-to-anim
179
+ - id: cp2077.npc.locomotion.workspot-jump-to-anim
180
+ claim: humanoid.animgraph carries one animAnimNode_WorkspotHub and declares
181
+ animAnimFeatureUpdateWorkspot => "UpdateWorkspot" and
182
+ animAnimFeatureWorkspotInertializationAnim => "WorkspotInertialization"; WorkspotGameSystem
183
+ can put an actor in a workspot (PlayInDeviceSimple, PlayNpcInWorkspot) and jump it to a named
184
+ animation or tag (SendJumpToAnimEnt, SendJumpToTagCommandEnt), stop it (StopNpcInWorkspot) and
185
+ send reaction signals (SendReactionSignal). A workspot clip plays with the mover off because
186
+ the hub overrides the body pose.
187
+ status: verified
188
+ verified_on: "2.31"
189
+ source: ModWright field verification
190
+ tags:
191
+ - workspot
192
+ - animgraph
193
+ - walk-cycle
194
+ - id: cp2077.npc.locomotion.quickhack-completion-effects
195
+ claim: QuickHack.BaseBlindHack derives from QuickHack.ControlHack and QuickHack.QuickHack; its
196
+ effective completionEffects are five, contributed by QuickHack and ControlHack - an armour
197
+ stat group, a RefreshPingEffector on the target, BaseStatusEffect.WasQuickHacked on the
198
+ target, BaseStatusEffect.QuickHackUploaded on the instigator and
199
+ Effectors.NotifyPoliceEffector on the target. A mod hack based on BaseBlindHack inherits all
200
+ five; an !append adds to them. BaseStatusEffect.WasQuickHacked itself carries only the
201
+ gameplay tag "Debuff" (inherited from BaseStatusEffect.DebuffStatusEffect).
202
+ status: verified
203
+ verified_on: "2.31"
204
+ source: ModWright field verification
205
+ tags:
206
+ - quickhack
207
+ - controlhack
208
+ - completioneffects
209
+ - statuseffect
210
+ - tweakdb
211
+ - id: cp2077.npc.locomotion.nonstealth-quickhack-alert
212
+ claim: A completed non-stealth quickhack alerts the target through a DELAYED event, not through the
213
+ AI. NPCPuppet.OnStatusEffectApplied reads the applied effect's own gameplay tags and, when the
214
+ effect was not applied on spawn, the instigator is the player, the tags do not contain
215
+ 'Stealth' and QuickHackableQueueHelper.IsAwarenessBumpingAllowed is true, schedules
216
+ NonStealthQuickHackVictimEvent 0.1 s later. OnNonStealthQuickHackVictimEvent then calls
217
+ NPCPuppet.RevealPlayerPositionIfNeeded and, if that returns false,
218
+ NPCStatesComponent.AlertPuppet, followed by AIActionHelper.TryChangingAttitudeToHostile.
219
+ AlertPuppet from Relaxed calls NPCPuppet.ChangeHighLevelState(owner, Alerted); from Alerted it
220
+ raises the security system's ALARM or AISquadHelper.EnterAlerted.
221
+ status: verified
222
+ verified_on: "2.31"
223
+ source: ModWright field verification
224
+ tags:
225
+ - quickhack
226
+ - alert
227
+ - statuseffect
228
+ - delaysystem
229
+ - reaction
230
+ - id: cp2077.npc.locomotion.highlevelstate-is-an-anim-feature
231
+ claim: NPCPuppet.ChangeHighLevelState writes an NPCStateChangeSignal into the puppet's signal table;
232
+ NPCStatesComponent.OnNPCStateChangeSignalReceived leads to UpdateHighLevelState, which applies
233
+ an AnimFeature_NPCState with state = the new high-level state on the input 'highLevelState'
234
+ through AnimationControllerComponent.ApplyFeature and writes the puppet-state blackboard (at
235
+ Combat it also calls AnimationSystem.EnterCombatMode). Since humanoid.animgraph declares
236
+ animAnimFeature_NPCState => "highLevelState" and tests it, entering Alerted is an
237
+ animation-graph state change - the alerted idle (the android's head jerk and scan) is the
238
+ graph's, played by the animation controller and not by the behaviour tree.
239
+ status: verified
240
+ verified_on: "2.31"
241
+ source: ModWright field verification
242
+ tags:
243
+ - highlevelstate
244
+ - animfeature
245
+ - npcstatescomponent
246
+ - alerted
247
+ - id: cp2077.npc.locomotion.reaction-components-are-separate
248
+ claim: ScriptedPuppet resolves the AI controller ('AIComponent' -> AIHumanComponent), the reaction
249
+ manager ('ReactionManager' -> ReactionManagerComponent) and the hit reactions
250
+ ('HitReactionOverride' or 'HitReaction' -> HitReactionComponent) as separate components, and
251
+ NPCStatesComponent (an AINetStateComponent) is a fourth. Toggling the AI controller off
252
+ touches none of them, so the quickhack alert path, the stim reactions, the hit reactions and
253
+ the high-level-state animation all keep running on a driven puppet.
254
+ status: verified
255
+ verified_on: "2.31"
256
+ source: ModWright field verification
257
+ tags:
258
+ - aihumancomponent
259
+ - reactionmanagercomponent
260
+ - hitreactioncomponent
261
+ - mover-defeat
262
+ - id: cp2077.npc.locomotion.disallows-awareness-bump-tag
263
+ claim: QuickHackableQueueHelper.IsAwarenessBumpingAllowed(target) walks the target's
264
+ completed-quickhack history plus the currently uploading action and everything queued behind
265
+ it, collects every CompletionEffects() record, and returns false if ANY of their status
266
+ effects has the gameplay tag 'DisallowsAwarenessBumpInQueue'. It is per-action, not
267
+ per-effect, so one such tag on any status effect in a hack's completionEffects suppresses the
268
+ NonStealthQuickHackVictimEvent for that whole hack, including the inherited WasQuickHacked
269
+ effect. This is the clean pre-empt for a mod hack that must not alert its target.
270
+ status: verified
271
+ verified_on: "2.31"
272
+ source: ModWright field verification
273
+ tags:
274
+ - quickhack
275
+ - gameplaytag
276
+ - alert
277
+ - tweakdb
278
+ - stealth
279
+ - id: cp2077.npc.locomotion.reaction-cancel-levers
280
+ claim: The script-reachable levers on ReactionManagerComponent are ClearPendingReaction() (public);
281
+ queueing TerminateReactionLookatEvent on the NPC, whose handler calls DeactiveLookAt() and so
282
+ LookAtRemoveEvent.QueueRemoveLookatEvent with the component's own handle; queueing
283
+ SwapPresetEvent{mappingName} to map a preset whose type is
284
+ gamedataReactionPresetType.NoReaction, which short-circuits the reaction helpers; and
285
+ IComponent.Toggle(false) on the component. None of them touches the quickhack alert path,
286
+ which runs in NPCPuppet's own handlers and NPCStatesComponent. LookAtRemoveEvent needs the
287
+ original LookAtAddEvent, so a third party cannot remove a look-at it did not add.
288
+ status: verified
289
+ verified_on: "2.31"
290
+ source: ModWright field verification
291
+ tags:
292
+ - reactionmanagercomponent
293
+ - lookat
294
+ - reactionpreset
295
+ - cancel
296
+ - id: cp2077.npc.locomotion.root-motion-and-uncontrolled-movement
297
+ claim: "humanoid.animgraph publishes a motion table (424 animMotionTableProvider_Animation nodes
298
+ plus multi-blend, static switch, master-slave and default providers), so its clips carry root
299
+ motion the mover consumes; AI action animations are launched with an explicit useRootMotion
300
+ flag and an updateMovePolicy flag (ActionAnimationScriptProxy.Setup / ForceLaunch). The
301
+ engine's term for animation- or physics-owned motion is uncontrolled movement:
302
+ UncontrolledMovementStartEvent carries ragdollNoGroundThreshold, ragdollOnCollision and
303
+ calculateEarlyPositionGroundHeight, is ended by UncontrolledMovementEndEvent, and NPCPuppet
304
+ re-polls every 0.2 s and clears it only when the puppet is ragdolling or its velocity is under
305
+ 0.01."
306
+ status: verified
307
+ verified_on: "2.31"
308
+ source: ModWright field verification
309
+ tags:
310
+ - rootmotion
311
+ - uncontrolledmovement
312
+ - ragdoll
313
+ - mover
314
+ - id: cp2077.npc.locomotion.fling-is-two-writers
315
+ claim: "A reaction animation on a puppet whose transform a script owns each frame has two writers -
316
+ the per-frame SetWorldTransform and the animation's root motion - and the mover's velocity
317
+ becomes the difference between consecutive transforms over a dt it did not choose. That is the
318
+ shape of one in-game reading (vel 44612936794112.0 with mover 3, defeated true: the body was
319
+ flung, not dropped, and the fall began exactly as the android's alerted scan played)."
320
+ status: inferred
321
+ verified_on: "2.31"
322
+ source: ModWright research
323
+ tags:
324
+ - rootmotion
325
+ - mover-defeat
326
+ - setworldtransform
327
+ - fall
328
+ detail: "Testable indirectly: if the DisallowsAwarenessBumpInQueue tag stops the alert and the fall
329
+ goes with it, the reaction animation was the cause."
330
+ - id: cp2077.npc.locomotion.individual-time-dilation-is-entity-level
331
+ claim: "TimeDilationHelper.SetIndividualTimeDilation is a wrapper that bails in multiplayer and
332
+ calls the target's own native; the native lives on TimeDilatable extends GameObject, beside
333
+ HasIndividualTimeDilation, UnsetIndividualTimeDilation, GetTimeDilationValue,
334
+ IsIgnoringGlobalTimeDilation and IsIgnoringTimeDilation, and takes two arguments the helper
335
+ never passes (ignoreGlobalDilation, useRealTime). Because it is a GameObject method and not a
336
+ component method it is untouched by AIHumanComponent.Toggle(false): a puppet with its AI off
337
+ still honours it."
338
+ status: verified
339
+ verified_on: "2.31"
340
+ source: ModWright field verification
341
+ tags:
342
+ - timedilation
343
+ - timedilatable
344
+ - gameobject
345
+ - mover-defeat
346
+ - id: cp2077.npc.locomotion.time-dilation-is-a-clock-not-a-switch
347
+ claim: "Individual time dilation scales an NPC's clock in both directions and nothing in the shipped
348
+ scripts pauses an animation graph: the uses are 'VeryStrongHit' at the impulse ratio for 0.5
349
+ s, 'MeleeLegKnockdown' at 1.6 for 0.5 s (hit and death reactions), a Kerenzikov ramp, and a
350
+ dive at 0.05 for 2.5 s. AnimationSystem itself has only SetForcedVisible,
351
+ SetForcedVisibleOnlyInFrustum, EnterCombatMode and ExitCombatMode."
352
+ status: verified
353
+ verified_on: "2.31"
354
+ source: ModWright field verification
355
+ tags:
356
+ - timedilation
357
+ - animationsystem
358
+ - freeze
359
+ - id: cp2077.npc.locomotion.procedural-nodes-survive-dilation
360
+ claim: "The humanoid graph's head and limb motion at idle is not only clip playback: it declares
361
+ entAnimFeature_LookAt => \"lookAt\" and carries animAnimNode_LookAtController (3),
362
+ animAnimNode_AimConstraint (15), animAnimNode_OrientConstraint (60), animAnimNode_RotateBone
363
+ (339), animAnimNode_AddIkRequest (34), animAnimNode_Ik2Constraint (43) and
364
+ animAnimNode_PostProcess_Footlock (5) - procedural solvers that write a pose toward a target
365
+ every time the graph is sampled. A near-zero time dilation stops the clock, not the sampling,
366
+ which is why the idle head turn and the android's scan keep moving on a puppet whose body is
367
+ rigid."
368
+ status: inferred
369
+ verified_on: "2.31"
370
+ source: ModWright research
371
+ tags:
372
+ - animgraph
373
+ - lookat
374
+ - procedural
375
+ - timedilation
376
+ - freeze
377
+ - id: cp2077.npc.locomotion.freeze-levers
378
+ claim: "What could stop the graph, and its cost: (1) animAnimFeatureFreezeFrame on the declared
379
+ input \"FreezeFrame\" is the right-named lever but its class is declared neither in the
380
+ shipped scripts nor in Codeware 1.20.3, so script cannot build one; (2)
381
+ AnimationControllerComponent.SetUsesSleepMode(obj, state) is the only graph-wide script switch
382
+ and it governs sleeping, not pausing; (3) IComponent.Toggle(false) on the
383
+ AnimationControllerComponent or the entAnimatedComponent is the blunt instrument
384
+ (AnimatedComponent has no script API of its own), untested and likely to freeze or break the
385
+ pose and anything bound to a bone slot; (4) the graph resource's own isPaused and
386
+ timeDeltaMultiplier fields are real but have no script setter."
387
+ status: verified
388
+ verified_on: "2.31"
389
+ source: ModWright field verification
390
+ tags:
391
+ - freeze
392
+ - animationcontrollercomponent
393
+ - animatedcomponent
394
+ - animgraph
395
+ - codeware
396
+ - id: cp2077.npc.locomotion.minotaur-graph-is-mover-fed
397
+ claim: "The Minotaur mech's look (base\\mechanical\\mech\\mch_003__minotaur\\mch_003__minotaur.app)
398
+ runs base\\gameplay\\anim_graphs\\maelstrom_exo.animgraph on its `root` animated component,
399
+ bound to the NPC's controller AnimationController1473. The graph picks its walk from
400
+ locomotion.action (18 transition conditions), float inputs of the `locomotion` group
401
+ (directionAngle, pathCurvature, ...) and of a `locomotion_ext` group it does not declare as a
402
+ feature (moveAnimationSpeed, moveAnimationTime, moveScale, startDirectionAngle), and 13
403
+ EnumSwitch nodes on animMotionTableAction over 168 motion table providers: the mover's and the
404
+ motion planner's state, none of it script-settable. On a body without a mover (a vehicle) that
405
+ graph cannot be made to walk; a graph of the mod's own is needed."
406
+ status: verified
407
+ verified_on: "2.31"
408
+ source: ModWright field verification
409
+ tags:
410
+ - animgraph
411
+ - mech
412
+ - minotaur
413
+ - locomotion
414
+ - vehicle
415
+ - id: cp2077.npc.locomotion.minotaur-walk-clip-speeds
416
+ claim: cr_minotaur_hmg_locomotion_combat.anims (the Minotaur's locomotion set) holds idle_stand,
417
+ walk_0, walk_180, walk_090, walk_270 and the start, stop and turn transitions, and no run. By
418
+ their motion extraction walk_0 and walk_180 cover 1.96 m in 1.5 s (1.31 m/s) and walk_090 /
419
+ walk_270 cover 1.40 m (0.93 m/s); walk_090 moves along +X, walk_270 along -X.
420
+ status: verified
421
+ verified_on: "2.31"
422
+ source: ModWright field verification
423
+ tags:
424
+ - anims
425
+ - mech
426
+ - minotaur
427
+ - walk
428
+ - motion-extraction
429
+ - id: cp2077.npc.locomotion.vehicle-graph-single-clip
430
+ claim: "A vehicle's animation graph can be a single looping clip: the Heist parade floats'
431
+ q112_carp_small_animgraph.animgraph is Root -> Output -> SkAnim (isLooped 1), with no features
432
+ and no variables. Graph float variables are set on a vehicle from script with
433
+ AnimationControllerComponent.SetInputFloat, as vanilla does for a car's destruction
434
+ variables."
435
+ status: verified
436
+ verified_on: "2.31"
437
+ source: base\quest\main_quests\part1\q112\vehicles\q112_carp_small_animgraph.animgraph;
438
+ tools\redmod\scripts\core\components\scriptComponents\vehicleComponent.script:4710-4752;
439
+ core\components\animationControllerComponent.script:118-124
440
+ tags:
441
+ - animgraph
442
+ - vehicle
443
+ - animationcontrollercomponent
444
+ - setinputfloat
445
+ - id: cp2077.npc.locomotion.skspeedanim-speed-is-ground-speed
446
+ claim: "animAnimNode_SkSpeedAnim with no motion provider takes its Speed input as a ground speed in
447
+ m/s and scales the clip by the clip's own motion-extraction speed: on the mod's mech vehicle
448
+ (walk_0 covers 1.31 m/s at rate 1) feeding the vehicle's forward speed in m/s put the legs in
449
+ sync, while feeding the ratio speed / 1.31 left them lagging the body."
450
+ status: verified
451
+ verified_on: "2.31"
452
+ source: ModWright field verification
453
+ tags:
454
+ - animgraph
455
+ - skspeedanim
456
+ - walk
457
+ - vehicle
458
+ - mech
459
+ - id: cp2077.npc.locomotion.parked-vehicle-graph-idle
460
+ claim: "A spawned vehicle that is not being driven does not tick the graph of an extra animated
461
+ component on it: SetInputFloat on the mod's parked mech vehicle changed nothing, and the same
462
+ call after SetVehicleRemoteControlled(true) played the walk. The variables reach a secondary
463
+ animated component bound to the vehicle's AnimationController."
464
+ status: verified
465
+ verified_on: "2.31"
466
+ source: ModWright field verification
467
+ tags:
468
+ - animgraph
469
+ - vehicle
470
+ - remote-control
471
+ - setinputfloat
472
+ - mech
473
+ - id: cp2077.npc.locomotion.minotaur-no-foot-ik
474
+ claim: "The Minotaur keeps its feet on the ground only through its root: its template's
475
+ moveMotionPlannerComponent has snapToGround = 1 and the walk clips' motion moves the root. Its
476
+ graph (maelstrom_exo, shared with the Maelstrom exo boss) carries a leg IK chain
477
+ (SetBonePosition on ik_leftMechanicalLeg01_cache_eff from an engine-fed model-space target,
478
+ then animAnimNode_Ik2Constraint over l_leg_IK_01..03 with a _cache_pv pole), but the
479
+ Minotaur's rig (mch_003__minotaur.rig, 68 bones) has no ik_*_cache_eff or _cache_pv bone, so
480
+ on this rig those nodes do nothing; its only Ik2 nodes are the arms'."
481
+ status: verified
482
+ verified_on: "2.31"
483
+ source: ModWright field verification
484
+ tags:
485
+ - animgraph
486
+ - ik
487
+ - mech
488
+ - minotaur
489
+ - rig
490
+ - locomotion