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,645 @@
1
+ game: cyberpunk2077
2
+ topic: red4ext.api
3
+ title: RED4ext plugin API, address resolution, frame ticks, red-lib and Codeware hooking patterns,
4
+ and the puppet locomotion natives a plugin can reach
5
+ facts:
6
+ - id: cp2077.red4ext.api.sdk-struct-five-services
7
+ claim: "The `RED4ext::v1::Sdk` a plugin receives in `Main` carries exactly five pointers: `runtime`
8
+ (a `SemVer*` holding the game's product version, e.g. 2.31, not its file version), `logger`,
9
+ `hooking`, `gameStates` and `scripts`."
10
+ status: verified
11
+ source: WopsS/RED4ext.SDK@ad72777 include/RED4ext/Api/v1/Sdk.hpp
12
+ tags:
13
+ - red4ext
14
+ - sdk
15
+ - api
16
+ - services
17
+ related:
18
+ - cp2077.red4ext.plugins.three-required-exports
19
+ - id: cp2077.red4ext.api.hooking-attach-detach-signatures
20
+ claim: "The loader's hooking service is two function pointers: `bool Attach(PluginHandle, void*
21
+ target, void* detour, void** original)` (original may be null; returns true when attached) and
22
+ `bool Detach(PluginHandle, void* target)` (detaches every hook at that target); the loader
23
+ implements them with Detours transactions."
24
+ status: verified
25
+ source: WopsS/RED4ext.SDK@ad72777 include/RED4ext/Api/v1/Hooking.hpp; WopsS/RED4ext@c52c8d8
26
+ src/dll/Systems/HookingSystem.cpp
27
+ tags:
28
+ - red4ext
29
+ - hooking
30
+ - detours
31
+ - api
32
+ - id: cp2077.red4ext.api.api-version-1-compat-0
33
+ claim: The SDK defines a single API version, `RED4EXT_API_VERSION_1` (= 1), bumped only on
34
+ incompatible ABI changes; `RED4EXT_API_VERSION_1_COMPAT_0` (= 0) lets a plugin report API v0
35
+ for older loaders because v0 and v1 are fully compatible.
36
+ status: verified
37
+ source: WopsS/RED4ext.SDK@ad72777 include/RED4ext/Api/ApiVersion.hpp
38
+ tags:
39
+ - red4ext
40
+ - api-version
41
+ - supports
42
+ - id: cp2077.red4ext.api.runtime-pins-are-pe-file-versions
43
+ claim: "`PluginInfo::runtime` is a PE file version, not a marketing version:
44
+ `RED4EXT_V1_RUNTIME_VERSION_2_31` is `FILEVER(3, 0, 80, 51928)`,
45
+ `RED4EXT_V1_RUNTIME_VERSION_2_30` is `FILEVER(3, 0, 80, 33925)`, and
46
+ `RED4EXT_V1_RUNTIME_VERSION_INDEPENDENT` is all four fields set to `(uint16_t)-1`."
47
+ status: verified
48
+ verified_on: "2.31"
49
+ source: WopsS/RED4ext.SDK@ad72777 include/RED4ext/Api/v1/Runtime.hpp
50
+ tags:
51
+ - red4ext
52
+ - runtime
53
+ - version-gate
54
+ - fileversion
55
+ related:
56
+ - cp2077.red4ext.plugins.runtime-field-pins-game-version
57
+ detail: "Matches ModWright's two-axis version convention: 2.31 on the marketing axis is 3.0.80.51928
58
+ on the file-version axis, and the runtime pin lives on the file-version axis. At this SDK
59
+ commit `RED4EXT_V1_RUNTIME_VERSION_LATEST` is `#define`d to `RED4EXT_V1_RUNTIME_VERSION_2_31`
60
+ (Runtime.hpp:53), so a plugin built against it and pinned to LATEST refuses any later game
61
+ build until rebuilt against a newer SDK."
62
+ - id: cp2077.red4ext.api.address-resolve-through-loader-export
63
+ claim: "`UniversalRelocFunc<T>(hash)` resolves an address by calling the loader's exported
64
+ `RED4ext_ResolveAddress(uint32_t)` (looked up with `GetProcAddress` on the RED4ext module);
65
+ when the loader returns 0 the SDK shows a dialog (\"Failed to find the address for the hash
66
+ ... This issue is likely caused by the mod using an incorrect or outdated hash.\") and
67
+ terminates the process."
68
+ status: verified
69
+ source: WopsS/RED4ext.SDK@ad72777 include/RED4ext/Relocation-inl.hpp; WopsS/RED4ext@c52c8d8
70
+ src/dll/Addresses.cpp
71
+ tags:
72
+ - red4ext
73
+ - address
74
+ - hash
75
+ - relocation
76
+ - failure-mode
77
+ detail: "Design consequence: resolve hashes lazily and log the hash before resolving, so an outdated
78
+ hash is diagnosable and does not kill the game at startup."
79
+ - id: cp2077.red4ext.api.loader-address-file-shape
80
+ claim: 'The loader fills its hash-to-address table from
81
+ `<game>\bin\x64\cyberpunk2077_addresses.json`: a root `Addresses` array of objects with a
82
+ `hash` (a number carried as a string) and an `offset` string `"<segment>:<hex>"`, where
83
+ segment 1, 2 and 3 are relative to the `.text`, `.rdata` and `.data` sections of the running
84
+ executable; a missing file is a fatal message box.'
85
+ status: verified
86
+ source: WopsS/RED4ext@c52c8d8 src/dll/Addresses.cpp
87
+ tags:
88
+ - red4ext
89
+ - address
90
+ - json
91
+ - bin-x64
92
+ - id: cp2077.red4ext.api.address-file-is-not-shipped-by-red4ext
93
+ claim: Nothing in the RED4ext repository generates, vendors or documents
94
+ `cyberpunk2077_addresses.json`; the loader reads it from the game's own `bin\x64`, so the file
95
+ is inferred to ship with the game itself, and whether its entries carry a symbol name beside
96
+ `hash` and `offset` is not established from any source read here.
97
+ status: inferred
98
+ source: grep for "addresses.json" / "cyberpunk2077_addresses" across WopsS/RED4ext@c52c8d8 (README,
99
+ BUILDING, CHANGELOG, src), the SDK and the wiki on 2026-09-20 matched only
100
+ src/dll/Addresses.cpp
101
+ tags:
102
+ - red4ext
103
+ - address
104
+ - provenance
105
+ - install-check
106
+ detail: Whether the file exists and carries symbol strings is a one-line check against a game
107
+ install. The loader reads only `hash` and `offset` (find_field), so extra fields would be
108
+ ignored, not rejected.
109
+ - id: cp2077.red4ext.api.address-hashes-are-not-fnv1a-of-symbols
110
+ claim: "The numeric address ids used with `UniversalRelocFunc` are not the FNV-1a (32-bit or
111
+ truncated 64-bit) hash of the symbol names the community records beside them: for the three
112
+ Codeware entries that carry a symbol comment, the computed FNV-1a32 of the comment differs
113
+ from the recorded id in every case."
114
+ status: verified
115
+ source: psiberx/cp2077-codeware@613a1cb src/Red/Addresses/Library.hpp:11,94,124
116
+ tags:
117
+ - red4ext
118
+ - address
119
+ - hash
120
+ - codeware
121
+ detail: So a new native's id comes from the address file, not from hashing its name; the SDK's own
122
+ Detail/AddressHashes.hpp (260 lines) names only RTTI, memory, resource, job, TweakDB and
123
+ render internals, none of the puppet locomotion natives.
124
+ - id: cp2077.red4ext.api.plugin-directory-depth-one
125
+ claim: The loader scans `red4ext\plugins` recursively but loads a `.dll` only at depth 0 or 1
126
+ (`plugins\X.dll` or `plugins\X\X.dll`); any deeper directory is skipped without recursion, and
127
+ a depth-1 plugin is loaded with an altered DLL search path so libraries beside it resolve. A
128
+ stem listed under `[plugins] ignored` in `red4ext\config.ini` is skipped.
129
+ status: verified
130
+ source: WopsS/RED4ext@c52c8d8 src/dll/Systems/PluginSystem.cpp; src/dll/Config.hpp
131
+ tags:
132
+ - red4ext
133
+ - plugins-directory
134
+ - deploy
135
+ - config
136
+ related:
137
+ - cp2077.red4ext.plugins.install-paths-and-logs
138
+ - id: cp2077.red4ext.api.deploy-into-names-the-file
139
+ claim: 'A ModWright deploy target whose `from` is a single file is copied to exactly `<root>/<into>`
140
+ (or `<root>/<basename of from>` with no `into`), so an `into` that names a folder makes the
141
+ folder name the installed file. On the `red4ext` root, `into: "<Mod>"` with the plugin DLL as
142
+ `from` installed `red4ext\plugins\<Mod>`, a 108 KB file with no extension, which the loader
143
+ does not load; `into: "<Mod>/<Mod>.dll"` is the working form.'
144
+ status: verified
145
+ verified_on: "2.31"
146
+ source: ModWright field verification
147
+ tags:
148
+ - red4ext
149
+ - deploy
150
+ - plugins-directory
151
+ - into
152
+ related:
153
+ - cp2077.red4ext.api.plugin-directory-depth-one
154
+ - id: cp2077.red4ext.api.plugin-extension-compared-exactly
155
+ claim: 'The loader keeps a file under `red4ext\plugins` only when `path.extension() == L".dll"`, a
156
+ `std::filesystem::path` comparison of the native strings, which is case-sensitive: a plugin
157
+ installed as `X.DLL` is not loaded.'
158
+ status: inferred
159
+ source: WopsS/RED4ext@c52c8d8 src/dll/Systems/PluginSystem.cpp:145
160
+ tags:
161
+ - red4ext
162
+ - plugins-directory
163
+ - extension
164
+ related:
165
+ - cp2077.red4ext.api.plugin-directory-depth-one
166
+ - id: cp2077.red4ext.api.plugin-exports-supports-query-required
167
+ claim: "The loader requires a plugin DLL to export `Supports` and `Query`: a missing one logs
168
+ \"Could not retrieve 'Supports' function\" (or 'Query') at warn level and the plugin is not
169
+ loaded. `Main` is optional: without it the loader logs \"does not export a 'Main' function,
170
+ skipping the call\" at trace level and keeps the plugin loaded, so nothing it would register
171
+ in `Main` exists."
172
+ status: inferred
173
+ source: WopsS/RED4ext@c52c8d8 src/dll/Systems/PluginSystem.cpp:341-354;
174
+ src/dll/PluginBase.cpp:36-46, :88-128
175
+ tags:
176
+ - red4ext
177
+ - exports
178
+ - plugin-load
179
+ - main
180
+ related:
181
+ - cp2077.red4ext.api.plugin-exports-matched-by-exact-name
182
+ - id: cp2077.red4ext.api.plugin-exports-matched-by-exact-name
183
+ claim: The loader finds `Supports`, `Query` and `Main` with `GetProcAddress` by those literal names,
184
+ so each must be exported undecorated (`extern "C"`, which the SDK's `RED4EXT_C_EXPORT`
185
+ supplies); a C++ export carries its decorated name (MSVC `?Query@@...`, MinGW `_Z5QueryPv`)
186
+ and is not found.
187
+ status: inferred
188
+ source: WopsS/RED4ext@c52c8d8 src/dll/Systems/PluginSystem.cpp:341; src/dll/PluginBase.cpp:40, :93;
189
+ test/fixtures/cp2077/red4ext/pe/decorated.x64.dll
190
+ tags:
191
+ - red4ext
192
+ - exports
193
+ - name-decoration
194
+ - extern-c
195
+ - id: cp2077.red4ext.api.config-ini-dev-console
196
+ claim: "`red4ext\\config.ini` is TOML despite its extension and carries `[logging]
197
+ level/flush_on/max_files/max_file_size`, `[plugins] enabled/ignored` and `[dev]
198
+ console/wait_for_debugger`; the wiki lists `dev.console` as defaulting to true while the
199
+ loader source defaults `hasConsole` to false."
200
+ status: community
201
+ source: CDPR-Modding-Documentation/Red4Ext-Wiki@3635293 getting-started/configuration.md (options
202
+ table and example); WopsS/RED4ext@c52c8d8 src/dll/Config.hpp (DevConfig.hasConsole = false)
203
+ tags:
204
+ - red4ext
205
+ - config
206
+ - console
207
+ - logging
208
+ detail: The two sources disagree on the console default; treat the example file's `console = false`
209
+ as what a fresh install writes and set it explicitly for a development session.
210
+ - id: cp2077.red4ext.api.update-registrar-tick-groups-and-stages
211
+ claim: "The SDK exposes the engine's per-frame update registrar: tick groups in order FrameBegin,
212
+ Multiplayer_UpdateStateSnapshots, EntityUpdateState, PreBuckets, Buckets, PostBuckets,
213
+ CameraUpdate, PlayerAimUpdate, PostPlayerAimUpdate, MappinsUpdate,
214
+ BlackboardCallbacks_SecondPass, PreRenderUpdate, Multiplayer_CaptureStateSnapshots; buckets
215
+ Vehicle, Character, AttachedObject; bucket stages in order Entities_PreTick,
216
+ Entities_ServiceEvents, PrePhysicsTick, UpdateTransformPrePhysics, PhysicsFlushBufferedState,
217
+ PhysicsExecuteAsyncQueries, PostPhysicsSyncResults, UpdateTransformPostPhysics,
218
+ AnimationUpdate, PostPhysicsTick, Entities_PostTick, Entities_PostServiceEvents.
219
+ `UpdateRegistrar::RegisterUpdate` takes either (group, system, name, callback(FrameInfo&,
220
+ JobQueue&)) or (bucket mask, stage, system, name, callback(bucket, FrameInfo&, JobQueue&));
221
+ `FrameInfo` carries `deltaTime` and `details->timeDilation`."
222
+ status: verified
223
+ source: WopsS/RED4ext.SDK@ad72777 include/RED4ext/SystemUpdate.hpp
224
+ tags:
225
+ - red4ext
226
+ - tick
227
+ - frame
228
+ - update-registrar
229
+ - bucket
230
+ - stage
231
+ detail: The enum order is the declaration order in the header; that it is also the execution order
232
+ is the natural reading of the names (PrePhysics before PostPhysics) and is not separately
233
+ attested.
234
+ - id: cp2077.red4ext.api.game-system-registers-frame-tick
235
+ claim: A native `gameIGameSystem` inherits `IUpdatableSystem`, whose virtual
236
+ `OnRegisterUpdates(UpdateRegistrar*)` (vtable slot 0x108) is where a system registers its
237
+ per-frame callbacks; `IGameSystem` adds `OnWorldAttached`/`OnWorldDetached`, save/load,
238
+ pause/resume and `OnInitialize`/`OnUninitialize` slots and holds `gameInstance` at 0x40.
239
+ Codeware's StaticEntitySystem registers a FrameBegin tick this way.
240
+ status: verified
241
+ source: WopsS/RED4ext.SDK@ad72777 include/RED4ext/Scripting/Natives/IUpdatableSystem.hpp,
242
+ gameIGameSystem.hpp; psiberx/cp2077-codeware@613a1cb src/App/World/StaticEntitySystem.cpp
243
+ tags:
244
+ - red4ext
245
+ - game-system
246
+ - tick
247
+ - frame
248
+ - codeware
249
+ - id: cp2077.red4ext.api.game-states-add
250
+ claim: "`Sdk->gameStates->Add(PluginHandle, EGameStateType, GameState*)` registers
251
+ `OnEnter`/`OnUpdate`/`OnExit` callbacks (each `bool(*)(CGameApplication*)`) on one of four
252
+ engine states: BaseInitialization, Initialization, Running, Shutdown."
253
+ status: verified
254
+ source: WopsS/RED4ext.SDK@ad72777 include/RED4ext/Api/v1/GameStates.hpp; include/RED4ext/GameStates.hpp
255
+ tags:
256
+ - red4ext
257
+ - game-state
258
+ - tick
259
+ - api
260
+ related:
261
+ - cp2077.red4ext.plugins.main-called-before-memory-allocators-ready
262
+ - id: cp2077.red4ext.api.logger-levels
263
+ claim: The loader's logger service exposes Trace, Debug, Info, Warn, Error and Critical, each in
264
+ four forms (narrow, narrow printf-style `F`, wide `W`, wide printf-style `WF`), all taking the
265
+ plugin handle first.
266
+ status: verified
267
+ source: WopsS/RED4ext.SDK@ad72777 include/RED4ext/Api/v1/Logger.hpp
268
+ tags:
269
+ - red4ext
270
+ - logging
271
+ - api
272
+ related:
273
+ - cp2077.red4ext.plugins.per-plugin-log-file-created-lazily
274
+ - id: cp2077.red4ext.api.scripts-service
275
+ claim: "`Sdk->scripts` offers `Add(PluginHandle, const wchar_t* path)` to add a script path to the
276
+ compile, and `RegisterNeverRefType(const char*)` / `RegisterMixedRefType(const char*)` for
277
+ type-reference handling."
278
+ status: verified
279
+ source: WopsS/RED4ext.SDK@ad72777 include/RED4ext/Api/v1/Scripts.hpp
280
+ tags:
281
+ - red4ext
282
+ - scripts
283
+ - api
284
+ detail: The semantics of the two Register calls are not documented in the header; only the
285
+ signatures are attested here.
286
+ - id: cp2077.red4ext.api.function-registration-callbacks
287
+ claim: Without red-lib, a plugin registers native types and functions from `Main` by
288
+ `CRTTISystem::Get()->AddRegisterCallback(RegisterTypes)` and
289
+ `AddPostRegisterCallback(PostRegisterTypes)`; a native function has the fixed shape
290
+ `void(IScriptable* ctx, CStackFrame* frame, T* out, int64_t)`, reads arguments with
291
+ `GetParameter(frame, &arg)` in order and then `frame->code++` to skip ParamEnd, and is created
292
+ with `CGlobalFunction::Create` / `CClassFunction::Create` / `CClassStaticFunction::Create`
293
+ then `RegisterFunction`.
294
+ status: verified
295
+ source: WopsS/RED4ext.SDK@ad72777 examples/function_registration/Main.cpp;
296
+ examples/native_class_redscript/Main.cpp
297
+ tags:
298
+ - red4ext
299
+ - rtti
300
+ - native-function
301
+ - registration
302
+ - id: cp2077.red4ext.api.redlib-has-no-hooking-api
303
+ claim: psiberx's red-lib is a header-only CMake INTERFACE library whose `include/Red/` holds only
304
+ TypeInfo (definition macros, invocation, registrar), Engine (framework, log channel, mappings)
305
+ and Utils (handles, job queues, resources); it provides RTTI registration, function calling,
306
+ game-system auto-registration and logging, and no hooking facility.
307
+ status: verified
308
+ source: psiberx/cp2077-red-lib@6822105 CMakeLists.txt; include/Red/*; README.md
309
+ tags:
310
+ - red-lib
311
+ - hooking
312
+ - rtti
313
+ - scope
314
+ detail: "Corrects a premise that red-lib provides hooks: hooks come from the loader's Sdk->hooking
315
+ or a library the plugin brings, not from red-lib."
316
+ - id: cp2077.red4ext.api.redlib-rtti-macros
317
+ claim: red-lib declares native types with `RTTI_DEFINE_CLASS(Type, {...})` (with `RTTI_METHOD`,
318
+ `RTTI_PROPERTY`, `RTTI_GETTER`, `RTTI_PARENT`, `RTTI_ABSTRACT`, `RTTI_ALIAS`,
319
+ `RTTI_PERSISTENT`), `RTTI_DEFINE_GLOBALS`, `RTTI_DEFINE_ENUM`/`RTTI_DEFINE_FLAGS`, and
320
+ `RTTI_EXPAND_CLASS(Existing, {...})` to add methods (never properties) to an existing class; a
321
+ class needs `RTTI_IMPL_TYPEINFO` and `RTTI_IMPL_ALLOCATOR` members; an `IGameSystem` subclass
322
+ is registered in the game instance automatically and reached from script through an
323
+ `@addMethod(GameInstance) public static native func`; everything is registered by calling
324
+ `Red::TypeInfoRegistrar::RegisterDiscovered()` in `Main` on Load.
325
+ status: community
326
+ source: psiberx/cp2077-red-lib@6822105 README.md, sections "Building type info", "Game systems",
327
+ "Class extensions", "Registration"
328
+ tags:
329
+ - red-lib
330
+ - rtti
331
+ - macros
332
+ - game-system
333
+ - registration
334
+ - id: cp2077.red4ext.api.redlib-alias-binds-module-scoped-declarations
335
+ claim: A native class declared inside a redscript `module` binds to its C++ definition only when the
336
+ definition carries `RTTI_ALIAS("Module.ClassName")`; a plugin installs at
337
+ `red4ext\plugins\<Name>\<Name>.dll` and its native declarations as ordinary `.reds` files
338
+ under `r6\scripts`.
339
+ status: community
340
+ source: CDPR-Modding-Documentation/Red4Ext-Wiki@3635293
341
+ mod-developers/creating-a-plugin-with-redlib.md ("You only need to add an alias when declaring
342
+ scripts with 'module' and 'import' keywords"; the install paths in the same page)
343
+ tags:
344
+ - red-lib
345
+ - redscript
346
+ - module
347
+ - alias
348
+ - install-path
349
+ - id: cp2077.red4ext.api.any-toolchain-x64-fastcall
350
+ claim: A plugin may be built with any build system or toolchain as long as the output is x86-64 with
351
+ the `__fastcall` convention; WopsS publishes a CMake example (RED4ext.Example.CMake) and a
352
+ Visual Studio example, and only RED4ext.SDK must be on the include path.
353
+ status: community
354
+ source: CDPR-Modding-Documentation/Red4Ext-Wiki@3635293 mod-developers/creating-a-plugin.md:3-17
355
+ tags:
356
+ - red4ext
357
+ - toolchain
358
+ - cmake
359
+ - visual-studio
360
+ related:
361
+ - cp2077.red4ext.plugins.abi-is-fastcall-x86-64
362
+ - id: cp2077.red4ext.api.cmake-example-shape
363
+ claim: The official CMake example adds the SDK as a submodule at `deps/red4ext.sdk`, calls
364
+ `add_subdirectory(deps/red4ext.sdk)`, builds the plugin as a `SHARED` library linked `PRIVATE
365
+ RED4ext::SDK` with C++20, optionally `RED4EXT_HEADER_ONLY`, and its CI configures with `cmake
366
+ -A x64` and builds with `cmake --build . --config <Debug|Release>`.
367
+ status: verified
368
+ source: WopsS/RED4ext.Example.CMake@d5aa651 CMakeLists.txt; src/CMakeLists.txt;
369
+ .github/workflows/build.yml
370
+ tags:
371
+ - red4ext
372
+ - cmake
373
+ - build
374
+ - example
375
+ detail: The example is dated 2022-09-06 and pins nothing; the SDK's own README asks for Visual
376
+ Studio 2022 and CMake 3.23 or newer and exports the `RED4ext::SDK` alias from
377
+ cmake/RED4extConfig.cmake.in.
378
+ - id: cp2077.red4ext.api.sdk-build-requirements
379
+ claim: RED4ext.SDK is used either header-only (include the headers, C++20) or as a static library
380
+ (headers plus src, define `RED4EXT_STATIC_LIB`); building the SDK itself asks for Visual
381
+ Studio 2022 Community or newer and CMake 3.23 or newer.
382
+ status: verified
383
+ source: WopsS/RED4ext.SDK@ad72777 README.md
384
+ tags:
385
+ - red4ext
386
+ - sdk
387
+ - build
388
+ - requirements
389
+ - id: cp2077.red4ext.api.cmake-modules-repo-not-found
390
+ claim: A repository named `psiberx/cp2077-cmake-modules` could not be cloned on 2026-09-20 (the
391
+ clone failed with GitHub's credential prompt, the response a nonexistent or private repository
392
+ produces), while six sibling clones in the same session succeeded; the shared CMake helpers
393
+ the task expected there may live under another name or not exist.
394
+ status: unverified
395
+ source: ModWright research
396
+ tags:
397
+ - cmake
398
+ - psiberx
399
+ - provenance
400
+ detail: "Codeware itself builds with xmake (xmake.lua: minhook, spdlog, tiltedcore, hopscotch-map;
401
+ targets Codeware.dll), not with CMake."
402
+ - id: cp2077.red4ext.api.codeware-entity-setworldtransform
403
+ claim: "Codeware adds `SetWorldTransform(transform: WorldTransform)` to every `Entity` from
404
+ redscript: `RTTI_EXPAND_CLASS(Red::Entity, App::EntityEx, ...)` registers
405
+ `EntityEx::SetWorldTransform`, which calls the native `IPlacedComponent_SetTransform`
406
+ (Codeware address id 1828854026, signature `void(IPlacedComponent*, const WorldTransform&)`)
407
+ on the entity's root transform component; the wiki documents it as moving static entities
408
+ without a respawn."
409
+ status: verified
410
+ source: psiberx/cp2077-codeware@613a1cb src/App/Entity/EntityEx.hpp; src/Red/Entity.hpp;
411
+ src/Red/Addresses/Library.hpp; scripts/Entity/Entity.reds; wiki/Home.md
412
+ tags:
413
+ - codeware
414
+ - entity
415
+ - transform
416
+ - setworldtransform
417
+ - puppet-control
418
+ detail: Documented for static entities; that it also moves a live NPCPuppet (whose mover may
419
+ re-assert its own transform) is the first thing to measure. Codeware's version at this commit
420
+ is 1.20.4 (xmake.lua); the release that first shipped the method is not established here.
421
+ - id: cp2077.red4ext.api.codeware-raw-entity-offsets
422
+ claim: "Codeware's `Raw::Entity` reads an `entEntity` at fixed offsets: the `EntityID` at 0x48, the
423
+ appearance name at 0x50, the template path at 0x60, the components storage at 0x70, the root
424
+ transform component (`IPlacedComponent*`) at 0xB0, the runtime scene at 0xB8 and the status
425
+ byte at 0x156; its `EntityStatus` enum runs Undefined, Initializing, Detached, Attaching,
426
+ Attached, Detaching, Uninitializing, Uninitialized."
427
+ status: verified
428
+ verified_on: "2.31"
429
+ source: psiberx/cp2077-codeware@613a1cb src/Red/Entity.hpp
430
+ tags:
431
+ - codeware
432
+ - entity
433
+ - offsets
434
+ - layout
435
+ detail: The SDK's own generated ent/Entity.hpp leaves the 0x160-byte class undecoded, so these
436
+ offsets are Codeware's reverse engineering, pinned to its SDK submodule 6ea7425 and to the
437
+ game build it was released for; a game patch can move them.
438
+ - id: cp2077.red4ext.api.codeware-hooking-backends
439
+ claim: Codeware's `Core::Hook::{Attach,Before,After,Wrap,Detach}` facade drives a `HookingDriver`;
440
+ when loaded as a RED4ext plugin the driver is `Support::RED4extProvider`, whose
441
+ `HookAttach`/`HookDetach` call `m_sdk->hooking->Attach/Detach` and whose `ResolveAddress`
442
+ calls `RED4ext::UniversalRelocBase::Resolve`; when loaded as an ASI it uses a MinHook driver
443
+ instead. The facade is part of Codeware's own tree (lib/Core), not a library another plugin
444
+ depends on.
445
+ status: verified
446
+ source: psiberx/cp2077-codeware@613a1cb lib/Core/Facades/Hook.hpp;
447
+ lib/Support/RED4ext/RED4extProvider.cpp; lib/Support/MinHook/MinHookProvider.hpp; src/main.cpp
448
+ tags:
449
+ - codeware
450
+ - hooking
451
+ - minhook
452
+ - detours
453
+ - pattern
454
+ - id: cp2077.red4ext.api.codeware-query-runtime-independent
455
+ claim: Codeware's `Query` reports `RED4EXT_V1_RUNTIME_VERSION_INDEPENDENT` and
456
+ `RED4EXT_V1_SDK_VERSION_1_0_0_COMPAT_0_5_0`, and its `Supports` returns
457
+ `RED4EXT_API_VERSION_1_COMPAT_0`; it relies on runtime address resolution rather than a
458
+ game-version pin.
459
+ status: verified
460
+ source: psiberx/cp2077-codeware@613a1cb src/main.cpp
461
+ tags:
462
+ - codeware
463
+ - runtime
464
+ - version-gate
465
+ - pattern
466
+ related:
467
+ - cp2077.red4ext.api.runtime-pins-are-pe-file-versions
468
+ - id: cp2077.red4ext.api.movepolicies-component-is-push-pop-query
469
+ claim: "`movePoliciesComponent` (script alias MovePoliciesComponent, 0x5E0 bytes, undecoded) exposes
470
+ 22 natives that only push, pop or query: AddPolicies, PopPolicies, GetTopPolicies,
471
+ ChangeMovementType, GetCurrentLocomotionAction, GetDestination, GetDistanceToDestination,
472
+ GetClosestPointToPath, IsDestinationCalculated, IsDestinationChanged, IsInIdle,
473
+ IsPathfindingFailed, IsTopPolicyEvaluated, IsPausedByDynamicCollision and the
474
+ off-mesh/incline/stairs queries; none sets a velocity. `moveLocomotionAction` is Undefined,
475
+ Exploration, Idle, IdleTurn, Reposition, Start, Move, Stop."
476
+ status: verified
477
+ verified_on: "2.31"
478
+ source: rayshader/cp2077-nativedb@b5d29af src/assets/reddump/classes.json, enums.json;
479
+ WopsS/RED4ext.SDK@ad72777
480
+ include/RED4ext/Scripting/Natives/Generated/move/PoliciesComponent.hpp
481
+ tags:
482
+ - nativedb
483
+ - movepolicies
484
+ - locomotion
485
+ - puppet-control
486
+ detail: "Observed in game: a MovePolicies push is the one script lever that moves a taken idle
487
+ puppet; this fact is why it cannot be made velocity-driven from script."
488
+ - id: cp2077.red4ext.api.movepolicies-record-layout
489
+ claim: "`movePolicies` (script alias MovePolicies, 0x228 bytes, fully decoded) holds
490
+ `destination`/`destinationTangent`/`startTangent` (Vector3 at 0x40/0x4C/0x58), `targetObject`
491
+ (wref at 0x88), `strafingTarget` (0x98), `desiredDistance` 0x108, `minMovementDistance` 0x10C,
492
+ `toleranceRadius` 0x114, `movementType` 0x140 (moveMovementType: Walk, Run, Sprint, Strafe,
493
+ Stand), `stopOnObstacle` 0x154, `useCollisionAvoidance` 0x156, `ignoreNavigation` 0x180,
494
+ `useStart` 0x181, `useStop` 0x182, `isEvaluated` 0x184; its 51 natives include
495
+ SetDestinationPosition, SetDestinationOrientation, SetIgnoreNavigation, SetUseStartStop,
496
+ SetDistancePolicy, SetMovementType, SetPositionProvider, SetStrafingTarget, SetMaxPathLength
497
+ and SetCollisionAvoidancePolicy."
498
+ status: verified
499
+ verified_on: "2.31"
500
+ source: WopsS/RED4ext.SDK@ad72777 include/RED4ext/Scripting/Natives/Generated/move/Policies.hpp;
501
+ rayshader/cp2077-nativedb@b5d29af src/assets/reddump/classes.json
502
+ tags:
503
+ - nativedb
504
+ - movepolicies
505
+ - layout
506
+ - locomotion
507
+ - id: cp2077.red4ext.api.mover-component-undecoded
508
+ claim: "A puppet's mover is `moveComponent : entIMoverComponent : entIComponent`; the SDK gives its
509
+ size as 0x2C0 with the struct commented out (undecoded) and `entIMoverComponent` as an
510
+ abstract 0x90-byte interface with no natives; `moveMoveComponentVelocityProvider.
511
+ CreateMoveComponentVelocityProvider(puppet)` and `gamePuppet.GetVelocity()` are the only
512
+ script-visible reads of it."
513
+ status: verified
514
+ verified_on: "2.31"
515
+ source: WopsS/RED4ext.SDK@ad72777 include/RED4ext/Scripting/Natives/Generated/move/Component.hpp,
516
+ ent/IMoverComponent.hpp; rayshader/cp2077-nativedb@b5d29af src/assets/reddump/classes.json
517
+ tags:
518
+ - nativedb
519
+ - mover
520
+ - locomotion
521
+ - undecoded
522
+ - id: cp2077.red4ext.api.entity-has-no-transform-setter
523
+ claim: "`entEntity` exposes `GetWorldPosition`, `GetWorldOrientation`, `GetWorldTransform` and
524
+ `FindComponentByName` and no world transform setter; `entIPlacedComponent` (0x120;
525
+ `parentTransform` at 0x90, `localTransform` at 0xC0) exposes `SetLocalTransform(pos, rot)`,
526
+ `SetLocalPosition`, `SetLocalOrientation`, `GetLocalToWorld` for components; `gameObject` adds
527
+ `EnableTransformUpdates(Bool)` with undocumented semantics."
528
+ status: verified
529
+ verified_on: "2.31"
530
+ source: rayshader/cp2077-nativedb@b5d29af src/assets/reddump/classes.json; WopsS/RED4ext.SDK@ad72777
531
+ include/RED4ext/Scripting/Natives/Generated/ent/IPlacedComponent.hpp
532
+ tags:
533
+ - nativedb
534
+ - entity
535
+ - transform
536
+ - puppet-control
537
+ related:
538
+ - cp2077.red4ext.api.codeware-entity-setworldtransform
539
+ - id: cp2077.red4ext.api.aihumancomponent-movement-params
540
+ claim: "`AIHumanComponent : AICAgent` (0x5B8; `movementParamsRecord` TweakDBID at 0x4F0) exposes
541
+ `GetMovementParams(moveMovementType) -> moveMovementParameters {type, maxSpeed, acceleration,
542
+ deceleration, rotationSpeed}`, `SetMovementParams` and `SetTDBMovementParams`; `AICAgent`
543
+ (alias AIComponent) exposes `SendCommand`, `CancelCommand`, `SetBehaviorArgument(CName,
544
+ Variant)`, `GetBehaviorArgument`, `ForceTickNextFrame`, `GetUpdateTickCount`,
545
+ `GetHighLevelState`, `SetAIRole`, `DisableCollider`/`EnableCollider`."
546
+ status: verified
547
+ verified_on: "2.31"
548
+ source: rayshader/cp2077-nativedb@b5d29af src/assets/reddump/classes.json; WopsS/RED4ext.SDK@ad72777
549
+ include/RED4ext/Scripting/Natives/Generated/AI/HumanComponent.hpp
550
+ tags:
551
+ - nativedb
552
+ - ai
553
+ - movement-params
554
+ - speed
555
+ - puppet-control
556
+ - id: cp2077.red4ext.api.animfeature-movement-fields
557
+ claim: "`animAnimFeature_Movement` carries `movementDirection: Vector4`, `speed`, `desiredSpeed`,
558
+ `stabilizedSpeed`, `acceleration`, `timeToChangeLocomotion`, `strafeYaw`, `yawSpeed` and
559
+ `locomotionState: Int32` with natives `SetSpeed` and `SetAcceleration`;
560
+ `animAnimFeature_Locomotion` carries `action`, `style`, `pathCurvature`, `inclineAngle`,
561
+ `groundAngle`, `animDeltaZ`, `speedProgress`, `isOnStairs`; `animAnimFeature_MoveTo` offers
562
+ `MoveTo(targetPosition, targetYawRotation, timeToMove)` and `MoveToWithDir`;
563
+ `entAnimationControllerComponent.ApplyFeature(obj, inputName, feature, delay)` is a static
564
+ native that applies any feature to an object's graph input by name."
565
+ status: verified
566
+ verified_on: "2.31"
567
+ source: rayshader/cp2077-nativedb@b5d29af src/assets/reddump/classes.json
568
+ tags:
569
+ - nativedb
570
+ - animation
571
+ - anim-feature
572
+ - locomotion
573
+ - puppet-control
574
+ detail: Which input name an NPC locomotion graph reads for the Movement feature is not in the RTTI;
575
+ it is in the `.animgraph` resource and needs a check against the game files.
576
+ - id: cp2077.red4ext.api.muppet-classes-are-input-driven-puppet
577
+ claim: "The RTTI carries a native `gameMuppet : gamePuppetBase` with components
578
+ `gameMuppetLocomotionComponent` (0x98, undecoded), `gameMuppetInputHandlerComponent`,
579
+ `gameMuppetRawInput`, `gameMuppetInputStates`, and input structs
580
+ `gameMuppetInputActionMoveForward {direction: Vector2, isSprinting}`,
581
+ `gameMuppetInputActionLook {rotation: Vector2}`, a `gameMuppetMoveState {desiredSpeed,
582
+ isJumping, moveStyle: gameMuppetMoveStyle (Walk, Sprint, Crouch, WalkAim, GravityOnly)}`, and
583
+ a replicated state with `Muppet.ReplicateInputStates( gameMuppetCompressedInputStates)`: an
584
+ input-driven, network-replicated player puppet from the cancelled multiplayer, with no known
585
+ shipped entity template."
586
+ status: verified
587
+ verified_on: "2.31"
588
+ source: rayshader/cp2077-nativedb@b5d29af src/assets/reddump/classes.json, enums.json;
589
+ WopsS/RED4ext.SDK@ad72777
590
+ include/RED4ext/Scripting/Natives/Generated/game/MuppetLocomotionComponent.hpp
591
+ tags:
592
+ - nativedb
593
+ - muppet
594
+ - multiplayer
595
+ - input
596
+ - puppet-control
597
+ detail: '"No known shipped entity template" is the absence of evidence in the RTTI and the SDK, not
598
+ a search of the archives; a few cheap checks would settle it.'
599
+ - id: cp2077.red4ext.api.navigation-clamp-natives
600
+ claim: "`AINavigationSystem` exposes `IsPointOnNavmesh(character, point, tolerance)`,
601
+ `GetNearestNavmeshPointBelow(character, origin, querySphereRadius, numberOfSpheres) ->
602
+ Vector4`, `FindWallInLineForCharacter(start, end, tolerance, owner)`,
603
+ `FindPointBelowForCharacter`, `HasPathForward(object, distance)` and
604
+ `CalculatePathForCharacter`; `gamePuppet` exposes `GetCurrentNavmeshPosition(out position) ->
605
+ navNaviPositionType` and `GetLastValidNavmeshPoint()`."
606
+ status: verified
607
+ verified_on: "2.31"
608
+ source: rayshader/cp2077-nativedb@b5d29af src/assets/reddump/classes.json
609
+ tags:
610
+ - nativedb
611
+ - navigation
612
+ - navmesh
613
+ - clamp
614
+ - puppet-control
615
+ - id: cp2077.red4ext.api.time-dilation-native-signature
616
+ claim: "`gameTimeDilatable` (a gameObject ancestor of every puppet) exposes
617
+ `SetIndividualTimeDilation(reason: CName, dilation: Float, duration: Float, easeInCurve:
618
+ CName, easeOutCurve: CName, ignoreGlobalDilation: Bool, useRealTime: Bool)`,
619
+ `UnsetIndividualTimeDilation(easeOutCurve)`, `GetTimeDilationValue`,
620
+ `HasIndividualTimeDilation(reason)` as natives."
621
+ status: verified
622
+ verified_on: "2.31"
623
+ source: rayshader/cp2077-nativedb@b5d29af src/assets/reddump/classes.json
624
+ tags:
625
+ - nativedb
626
+ - time-dilation
627
+ - freeze
628
+ - puppet-control
629
+ detail: 'Observed in game: the TimeDilationHelper wrapper of this froze a taken puppet ("freeze is
630
+ the smoothness fix"); a per-frame drive must lift it while moving.'
631
+ - id: cp2077.red4ext.api.redlib-call-helpers
632
+ claim: "red-lib lets native code call script-visible functions by name through the RTTI:
633
+ `Red::CallGlobal(name, out?, args...)`, `Red::CallStatic(className, funcName, out?, args...)`
634
+ and `Red::CallVirtual(IScriptable* context, funcName, out?, args...)` (with an overload taking
635
+ the `CClass*`), each returning a bool for success; the README's example chain is
636
+ GetPlayerSystem → GetLocalPlayerControlledGameObject → Revive."
637
+ status: verified
638
+ source: psiberx/cp2077-red-lib@6822105 include/Red/TypeInfo/Invocation.hpp; README.md
639
+ tags:
640
+ - red-lib
641
+ - invocation
642
+ - callvirtual
643
+ - rtti
644
+ detail: This is what lets a plugin call Codeware's registered Entity.SetWorldTransform without
645
+ resolving any game address itself (the no-address variant).