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.
- package/LICENSE +35 -0
- package/README.md +212 -0
- package/assets/claude/agents/mw-explore.md +46 -0
- package/assets/claude/agents/mw-fixture.md +33 -0
- package/assets/claude/agents/mw-rule-author.md +51 -0
- package/assets/claude/agents/mw-scaffold-author.md +48 -0
- package/assets/claude/skills/mw-author.md +59 -0
- package/assets/claude/skills/mw-new-item.md +51 -0
- package/assets/claude/skills/mw-new-spell.md +50 -0
- package/assets/claude/skills/mw-scaffold.md +59 -0
- package/assets/claude/skills/mw-ship.md +57 -0
- package/assets/claude/skills/mw-validate.md +51 -0
- package/assets/claude/skills/mw-verify.md +59 -0
- package/assets/nivalisnights/extract_resources.py +177 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Config.json +5 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/BootstrapClient.lua +55 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/BootstrapServer.lua +81 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/ModWrightBridge/Log.lua +96 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/ModWrightBridge/Probes.lua +1038 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/ModWrightBridge/ProbesClient.lua +74 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/ModWrightBridge/Protocol.lua +985 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/ModWrightBridge/Watch.lua +175 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/meta.lsx +45 -0
- package/bridges/bg3-se/README.md +99 -0
- package/bridges/bg3-se/bridge.json +68 -0
- package/bridges/cp2077-cet/ModWrightBridge/init.lua +375 -0
- package/bridges/cp2077-cet/ModWrightBridge/probes.lua +1104 -0
- package/bridges/cp2077-cet/ModWrightBridge/protocol.lua +1306 -0
- package/bridges/cp2077-cet/README.md +165 -0
- package/bridges/cp2077-cet/bridge.json +53 -0
- package/dist/core/bridge/arm.js +175 -0
- package/dist/core/bridge/cet-console.js +26 -0
- package/dist/core/bridge/cet-log.js +362 -0
- package/dist/core/bridge/index.js +11 -0
- package/dist/core/bridge/locate.js +35 -0
- package/dist/core/bridge/paths.js +34 -0
- package/dist/core/bridge/pending.js +89 -0
- package/dist/core/bridge/poll.js +155 -0
- package/dist/core/bridge/stage.js +100 -0
- package/dist/core/bridge/status.js +97 -0
- package/dist/core/bridge/types.js +145 -0
- package/dist/core/bridge/validate.js +107 -0
- package/dist/core/build/index.js +6 -0
- package/dist/core/build/manifest.js +47 -0
- package/dist/core/build/paths.js +32 -0
- package/dist/core/build/run.js +342 -0
- package/dist/core/build/stage.js +265 -0
- package/dist/core/build/steps/bg3.js +129 -0
- package/dist/core/build/steps/core.js +195 -0
- package/dist/core/build/steps/cyberpunk.js +95 -0
- package/dist/core/build/steps/listing.js +35 -0
- package/dist/core/build/types.js +13 -0
- package/dist/core/build/zip.js +148 -0
- package/dist/core/compat/check.js +113 -0
- package/dist/core/compat/pe.js +220 -0
- package/dist/core/compat/types.js +1 -0
- package/dist/core/compat/version.js +70 -0
- package/dist/core/deploy/guards.js +292 -0
- package/dist/core/deploy/index.js +5 -0
- package/dist/core/deploy/plan.js +696 -0
- package/dist/core/deploy/reload-apply.js +361 -0
- package/dist/core/deploy/reload.js +358 -0
- package/dist/core/deploy/sources.js +169 -0
- package/dist/core/deploy/types.js +1 -0
- package/dist/core/epic.js +54 -0
- package/dist/core/fsutil.js +191 -0
- package/dist/core/home.js +70 -0
- package/dist/core/knowledge/facts.js +229 -0
- package/dist/core/knowledge/index.js +4 -0
- package/dist/core/knowledge/search.js +112 -0
- package/dist/core/knowledge/store.js +123 -0
- package/dist/core/knowledge/types.js +1 -0
- package/dist/core/ledger/check.js +42 -0
- package/dist/core/ledger/hooks.js +80 -0
- package/dist/core/ledger/index.js +7 -0
- package/dist/core/ledger/query.js +17 -0
- package/dist/core/ledger/record.js +84 -0
- package/dist/core/ledger/status.js +53 -0
- package/dist/core/ledger/store.js +98 -0
- package/dist/core/ledger/types.js +108 -0
- package/dist/core/logs/index.js +4 -0
- package/dist/core/logs/registry.js +50 -0
- package/dist/core/logs/scan.js +195 -0
- package/dist/core/logs/triage.js +160 -0
- package/dist/core/logs/types.js +1 -0
- package/dist/core/lsx.js +10 -0
- package/dist/core/lz4.js +66 -0
- package/dist/core/mods.js +229 -0
- package/dist/core/process.js +49 -0
- package/dist/core/project/build-steps.js +83 -0
- package/dist/core/project/describe.js +74 -0
- package/dist/core/project/index.js +5 -0
- package/dist/core/project/load.js +146 -0
- package/dist/core/project/schema.js +264 -0
- package/dist/core/project/types.js +3 -0
- package/dist/core/prompts.js +72 -0
- package/dist/core/registry.js +35 -0
- package/dist/core/safety/backup.js +206 -0
- package/dist/core/safety/execute.js +188 -0
- package/dist/core/safety/index.js +5 -0
- package/dist/core/safety/plan.js +122 -0
- package/dist/core/safety/restore.js +172 -0
- package/dist/core/safety/types.js +1 -0
- package/dist/core/scaffold/bootstrap.js +7 -0
- package/dist/core/scaffold/catalog.js +28 -0
- package/dist/core/scaffold/claude-assets.js +271 -0
- package/dist/core/scaffold/collisions.js +64 -0
- package/dist/core/scaffold/emit.js +356 -0
- package/dist/core/scaffold/engine.js +680 -0
- package/dist/core/scaffold/ids.js +78 -0
- package/dist/core/scaffold/index.js +10 -0
- package/dist/core/scaffold/jsonpath.js +121 -0
- package/dist/core/scaffold/load.js +81 -0
- package/dist/core/scaffold/render.js +85 -0
- package/dist/core/scaffold/sequence.js +396 -0
- package/dist/core/scaffold/types.js +309 -0
- package/dist/core/steam.js +63 -0
- package/dist/core/surfaceutil.js +36 -0
- package/dist/core/testplan/check.js +67 -0
- package/dist/core/testplan/index.js +5 -0
- package/dist/core/testplan/load.js +100 -0
- package/dist/core/testplan/registry.js +317 -0
- package/dist/core/testplan/run.js +389 -0
- package/dist/core/testplan/types.js +82 -0
- package/dist/core/text/converters/bg3.js +50 -0
- package/dist/core/text/converters/cyberpunk.js +36 -0
- package/dist/core/text/converters/index.js +261 -0
- package/dist/core/text/diff/cr2w.js +180 -0
- package/dist/core/text/diff/index.js +16 -0
- package/dist/core/text/diff/loca.js +43 -0
- package/dist/core/text/diff/lsx.js +126 -0
- package/dist/core/text/handles.js +86 -0
- package/dist/core/text/index.js +6 -0
- package/dist/core/text/json.js +46 -0
- package/dist/core/text/templates/cache.js +71 -0
- package/dist/core/text/templates/index.js +3 -0
- package/dist/core/text/templates/library.js +245 -0
- package/dist/core/text/templates/types.js +51 -0
- package/dist/core/text/toolchain.js +16 -0
- package/dist/core/text/types.js +1 -0
- package/dist/core/text/validate.js +149 -0
- package/dist/core/text/xml.js +58 -0
- package/dist/core/toolchain/datafetch.js +151 -0
- package/dist/core/toolchain/env.js +63 -0
- package/dist/core/toolchain/features.js +170 -0
- package/dist/core/toolchain/index.js +8 -0
- package/dist/core/toolchain/install.js +191 -0
- package/dist/core/toolchain/locate.js +275 -0
- package/dist/core/toolchain/remember.js +84 -0
- package/dist/core/toolchain/run.js +318 -0
- package/dist/core/toolchain/specs.js +351 -0
- package/dist/core/toolchain/types.js +1 -0
- package/dist/core/types.js +1 -0
- package/dist/core/userconfig.js +66 -0
- package/dist/core/validate/context.js +139 -0
- package/dist/core/validate/index.js +5 -0
- package/dist/core/validate/registry.js +58 -0
- package/dist/core/validate/run.js +131 -0
- package/dist/core/validate/suppressions.js +91 -0
- package/dist/core/validate/types.js +2 -0
- package/dist/core/yamledit.js +51 -0
- package/dist/index.js +389 -0
- package/dist/server.js +1914 -0
- package/dist/surfaces/baldursgate3/compat.js +164 -0
- package/dist/surfaces/baldursgate3/identity.js +110 -0
- package/dist/surfaces/baldursgate3/index/build.js +331 -0
- package/dist/surfaces/baldursgate3/index/index.js +17 -0
- package/dist/surfaces/baldursgate3/index/info.js +40 -0
- package/dist/surfaces/baldursgate3/index/parsers/loca.js +41 -0
- package/dist/surfaces/baldursgate3/index/parsers/lsx.js +137 -0
- package/dist/surfaces/baldursgate3/index/parsers/stats.js +45 -0
- package/dist/surfaces/baldursgate3/index/parsers/treasuretable.js +57 -0
- package/dist/surfaces/baldursgate3/index/parsers/xmlutil.js +142 -0
- package/dist/surfaces/baldursgate3/index/queries.js +327 -0
- package/dist/surfaces/baldursgate3/index/schema.js +62 -0
- package/dist/surfaces/baldursgate3/index.js +3 -0
- package/dist/surfaces/baldursgate3/logs.js +278 -0
- package/dist/surfaces/baldursgate3/modsettings.js +115 -0
- package/dist/surfaces/baldursgate3/pak.js +153 -0
- package/dist/surfaces/baldursgate3/settings.js +49 -0
- package/dist/surfaces/baldursgate3/surface.js +232 -0
- package/dist/surfaces/baldursgate3/validators/bridge.js +7 -0
- package/dist/surfaces/baldursgate3/validators/files.js +476 -0
- package/dist/surfaces/baldursgate3/validators/items.js +1001 -0
- package/dist/surfaces/baldursgate3/validators/progression.js +734 -0
- package/dist/surfaces/baldursgate3/validators/stats.js +1076 -0
- package/dist/surfaces/baldursgate3/validators/story.js +790 -0
- package/dist/surfaces/baldursgate3/validators/templates.js +7 -0
- package/dist/surfaces/cyberpunk2077/compat.js +223 -0
- package/dist/surfaces/cyberpunk2077/index/build.js +231 -0
- package/dist/surfaces/cyberpunk2077/index/index.js +17 -0
- package/dist/surfaces/cyberpunk2077/index/info.js +51 -0
- package/dist/surfaces/cyberpunk2077/index/model.js +52 -0
- package/dist/surfaces/cyberpunk2077/index/parsers/tweak.js +483 -0
- package/dist/surfaces/cyberpunk2077/index/parsers/tweakxl-yaml.js +183 -0
- package/dist/surfaces/cyberpunk2077/index/queries.js +504 -0
- package/dist/surfaces/cyberpunk2077/index/resource.js +135 -0
- package/dist/surfaces/cyberpunk2077/index/schema.js +90 -0
- package/dist/surfaces/cyberpunk2077/index.js +3 -0
- package/dist/surfaces/cyberpunk2077/logs.js +742 -0
- package/dist/surfaces/cyberpunk2077/paths.js +12 -0
- package/dist/surfaces/cyberpunk2077/surface.js +218 -0
- package/dist/surfaces/cyberpunk2077/validators/bridge.js +7 -0
- package/dist/surfaces/cyberpunk2077/validators/cr2w.js +349 -0
- package/dist/surfaces/cyberpunk2077/validators/garments.js +1181 -0
- package/dist/surfaces/cyberpunk2077/validators/mesh.js +338 -0
- package/dist/surfaces/cyberpunk2077/validators/modsettings.js +120 -0
- package/dist/surfaces/cyberpunk2077/validators/packaging.js +463 -0
- package/dist/surfaces/cyberpunk2077/validators/red4ext.js +318 -0
- package/dist/surfaces/cyberpunk2077/validators/redscript.js +193 -0
- package/dist/surfaces/cyberpunk2077/validators/templates.js +7 -0
- package/dist/surfaces/cyberpunk2077/validators/tweaks.js +768 -0
- package/dist/surfaces/cyberpunk2077/validators/vehicles.js +531 -0
- package/dist/surfaces/cyberpunk2077/validators/xl.js +308 -0
- package/dist/surfaces/eldenring/binders.js +111 -0
- package/dist/surfaces/eldenring/compat.js +166 -0
- package/dist/surfaces/eldenring/dcx.js +49 -0
- package/dist/surfaces/eldenring/index.js +13 -0
- package/dist/surfaces/eldenring/loaders.js +132 -0
- package/dist/surfaces/eldenring/logs.js +67 -0
- package/dist/surfaces/eldenring/paramdef.js +256 -0
- package/dist/surfaces/eldenring/params.js +129 -0
- package/dist/surfaces/eldenring/surface.js +121 -0
- package/dist/surfaces/eldenring/tools.js +52 -0
- package/dist/surfaces/eldenring/validators/binders.js +193 -0
- package/dist/surfaces/eldenring/validators/packages.js +159 -0
- package/dist/surfaces/eldenring/validators/params.js +334 -0
- package/dist/surfaces/eldenring/validators/profiles.js +287 -0
- package/dist/surfaces/index.js +34 -0
- package/dist/surfaces/nivalisnights/compat.js +229 -0
- package/dist/surfaces/nivalisnights/index/build.js +310 -0
- package/dist/surfaces/nivalisnights/index/index.js +5 -0
- package/dist/surfaces/nivalisnights/index/queries.js +231 -0
- package/dist/surfaces/nivalisnights/index.js +4 -0
- package/dist/surfaces/nivalisnights/logs.js +473 -0
- package/dist/surfaces/nivalisnights/surface.js +195 -0
- package/dist/surfaces/skyrimse/archives.js +229 -0
- package/dist/surfaces/skyrimse/compat.js +163 -0
- package/dist/surfaces/skyrimse/index.js +12 -0
- package/dist/surfaces/skyrimse/loadorder.js +174 -0
- package/dist/surfaces/skyrimse/logs.js +241 -0
- package/dist/surfaces/skyrimse/plugins.js +149 -0
- package/dist/surfaces/skyrimse/records.js +94 -0
- package/dist/surfaces/skyrimse/surface.js +240 -0
- package/dist/surfaces/skyrimse/validators/archive-records.js +165 -0
- package/dist/surfaces/skyrimse/validators/archives.js +110 -0
- package/dist/surfaces/skyrimse/validators/plugins.js +374 -0
- package/dist/surfaces/skyrimse/validators/records.js +117 -0
- package/dist/surfaces/stardewvalley/compat.js +190 -0
- package/dist/surfaces/stardewvalley/config.js +42 -0
- package/dist/surfaces/stardewvalley/contentpatcher.js +203 -0
- package/dist/surfaces/stardewvalley/index/index.js +229 -0
- package/dist/surfaces/stardewvalley/index/wiki.js +190 -0
- package/dist/surfaces/stardewvalley/index.js +12 -0
- package/dist/surfaces/stardewvalley/logs.js +307 -0
- package/dist/surfaces/stardewvalley/mods.js +182 -0
- package/dist/surfaces/stardewvalley/surface.js +244 -0
- package/dist/surfaces/stardewvalley/validators/content.js +321 -0
- package/dist/surfaces/stardewvalley/validators/fields.js +147 -0
- package/dist/surfaces/stardewvalley/validators/loadorder.js +69 -0
- package/dist/surfaces/stardewvalley/validators/manifest.js +221 -0
- package/dist/surfaces/subnautica2/compat.js +138 -0
- package/dist/surfaces/subnautica2/index.js +5 -0
- package/dist/surfaces/subnautica2/logs.js +129 -0
- package/dist/surfaces/subnautica2/paks.js +173 -0
- package/dist/surfaces/subnautica2/surface.js +151 -0
- package/dist/surfaces/subnautica2/validators/packaging.js +298 -0
- package/dist/surfaces/valheim/compat.js +171 -0
- package/dist/surfaces/valheim/index/index.js +301 -0
- package/dist/surfaces/valheim/index/tables.js +103 -0
- package/dist/surfaces/valheim/index.js +11 -0
- package/dist/surfaces/valheim/logs.js +197 -0
- package/dist/surfaces/valheim/packaging.js +131 -0
- package/dist/surfaces/valheim/plugins.js +270 -0
- package/dist/surfaces/valheim/references.js +121 -0
- package/dist/surfaces/valheim/surface.js +223 -0
- package/dist/surfaces/valheim/validators/packaging.js +218 -0
- package/dist/surfaces/valheim/validators/plugins.js +287 -0
- package/dist/surfaces/valheim/validators/references.js +169 -0
- package/knowledge/baldursgate3/animations.gr2.yaml +166 -0
- package/knowledge/baldursgate3/audio.voice.yaml +182 -0
- package/knowledge/baldursgate3/audio.wwise.yaml +104 -0
- package/knowledge/baldursgate3/charactercreation.heads-hair.yaml +193 -0
- package/knowledge/baldursgate3/communitylibrary.shared-content.yaml +129 -0
- package/knowledge/baldursgate3/compatibilityframework.api.yaml +176 -0
- package/knowledge/baldursgate3/crash.causes.yaml +90 -0
- package/knowledge/baldursgate3/dialogue.dialogbank.yaml +120 -0
- package/knowledge/baldursgate3/dialogue.files.yaml +236 -0
- package/knowledge/baldursgate3/dialogue.osiris-goals.yaml +386 -0
- package/knowledge/baldursgate3/dialogue.yaml +122 -0
- package/knowledge/baldursgate3/feats.classes.yaml +164 -0
- package/knowledge/baldursgate3/items.cloth-physics.yaml +167 -0
- package/knowledge/baldursgate3/items.roottemplates.yaml +320 -0
- package/knowledge/baldursgate3/items.visualbank.yaml +628 -0
- package/knowledge/baldursgate3/journal.quests.yaml +214 -0
- package/knowledge/baldursgate3/loadorder.modsettings.yaml +128 -0
- package/knowledge/baldursgate3/localization.handles.yaml +92 -0
- package/knowledge/baldursgate3/misc.encoding-and-practice.yaml +111 -0
- package/knowledge/baldursgate3/origins.companions.yaml +144 -0
- package/knowledge/baldursgate3/osiris.signatures.yaml +211 -0
- package/knowledge/baldursgate3/packaging.meta.yaml +155 -0
- package/knowledge/baldursgate3/packaging.paks.yaml +79 -0
- package/knowledge/baldursgate3/process.launch.yaml +34 -0
- package/knowledge/baldursgate3/progressions.yaml +92 -0
- package/knowledge/baldursgate3/publishing.modio-nexus.yaml +170 -0
- package/knowledge/baldursgate3/publishing.toolkit-modio.yaml +135 -0
- package/knowledge/baldursgate3/races.progression.yaml +228 -0
- package/knowledge/baldursgate3/scriptextender.console.yaml +257 -0
- package/knowledge/baldursgate3/scriptextender.yaml +252 -0
- package/knowledge/baldursgate3/stats.boosts.yaml +293 -0
- package/knowledge/baldursgate3/stats.equipment-kits.yaml +69 -0
- package/knowledge/baldursgate3/stats.interrupts.yaml +45 -0
- package/knowledge/baldursgate3/stats.itemcombos.yaml +65 -0
- package/knowledge/baldursgate3/stats.spells.yaml +293 -0
- package/knowledge/baldursgate3/stats.weapons.yaml +210 -0
- package/knowledge/baldursgate3/toolchain.divine.yaml +179 -0
- package/knowledge/baldursgate3/toolchain.lslib-formats.yaml +242 -0
- package/knowledge/baldursgate3/toolkit.levels.yaml +177 -0
- package/knowledge/baldursgate3/ui.icons-atlas.yaml +78 -0
- package/knowledge/baldursgate3/ui.icons.yaml +412 -0
- package/knowledge/baldursgate3/ui.mcm.yaml +161 -0
- package/knowledge/baldursgate3/vfx.materials.yaml +174 -0
- package/knowledge/baldursgate3/visuals.characterfix.yaml +73 -0
- package/knowledge/cyberpunk2077/animations.anims.yaml +118 -0
- package/knowledge/cyberpunk2077/anims.archivexl.yaml +163 -0
- package/knowledge/cyberpunk2077/anims.authoring.yaml +579 -0
- package/knowledge/cyberpunk2077/anims.encoder.yaml +156 -0
- package/knowledge/cyberpunk2077/anims.graph.yaml +629 -0
- package/knowledge/cyberpunk2077/anims.method.yaml +360 -0
- package/knowledge/cyberpunk2077/anims.pipeline.yaml +352 -0
- package/knowledge/cyberpunk2077/anims.roundtrip.yaml +222 -0
- package/knowledge/cyberpunk2077/anims.sets.yaml +176 -0
- package/knowledge/cyberpunk2077/archivexl.bodytypes.yaml +149 -0
- package/knowledge/cyberpunk2077/archivexl.dynamic-appearances.yaml +218 -0
- package/knowledge/cyberpunk2077/archivexl.manifest.yaml +214 -0
- package/knowledge/cyberpunk2077/audio.events.yaml +168 -0
- package/knowledge/cyberpunk2077/audio.sounds.yaml +164 -0
- package/knowledge/cyberpunk2077/audio.voicesets.yaml +146 -0
- package/knowledge/cyberpunk2077/cet.sandbox.yaml +219 -0
- package/knowledge/cyberpunk2077/clothing.garments.yaml +283 -0
- package/knowledge/cyberpunk2077/clothing.refits.yaml +215 -0
- package/knowledge/cyberpunk2077/codeware.overview.yaml +111 -0
- package/knowledge/cyberpunk2077/codeware.systems.yaml +192 -0
- package/knowledge/cyberpunk2077/drones.combat.yaml +416 -0
- package/knowledge/cyberpunk2077/drones.control.yaml +552 -0
- package/knowledge/cyberpunk2077/entities.appearance.yaml +166 -0
- package/knowledge/cyberpunk2077/equipmentex.slots.yaml +151 -0
- package/knowledge/cyberpunk2077/fx.effects.yaml +246 -0
- package/knowledge/cyberpunk2077/fx.lights.yaml +171 -0
- package/knowledge/cyberpunk2077/hair.modding.yaml +145 -0
- package/knowledge/cyberpunk2077/items.wiring.yaml +246 -0
- package/knowledge/cyberpunk2077/loadorder.archives.yaml +71 -0
- package/knowledge/cyberpunk2077/mesh.blender.yaml +209 -0
- package/knowledge/cyberpunk2077/nativedb.dump.yaml +98 -0
- package/knowledge/cyberpunk2077/npc.appearance.yaml +275 -0
- package/knowledge/cyberpunk2077/npc.behaviour.yaml +128 -0
- package/knowledge/cyberpunk2077/npc.locomotion.yaml +490 -0
- package/knowledge/cyberpunk2077/packaging.deploy.yaml +175 -0
- package/knowledge/cyberpunk2077/packaging.variants.yaml +176 -0
- package/knowledge/cyberpunk2077/player.control.yaml +918 -0
- package/knowledge/cyberpunk2077/process.assetbuild.yaml +154 -0
- package/knowledge/cyberpunk2077/process.lessons.yaml +276 -0
- package/knowledge/cyberpunk2077/quests.minor.yaml +46 -0
- package/knowledge/cyberpunk2077/quests.scenes.yaml +282 -0
- package/knowledge/cyberpunk2077/quickhacks.tiers.yaml +41 -0
- package/knowledge/cyberpunk2077/red4ext.api.yaml +645 -0
- package/knowledge/cyberpunk2077/red4ext.plugins.yaml +124 -0
- package/knowledge/cyberpunk2077/redhottools.hotreload.yaml +245 -0
- package/knowledge/cyberpunk2077/redscript.compile-log.yaml +76 -0
- package/knowledge/cyberpunk2077/redscript.modules.yaml +118 -0
- package/knowledge/cyberpunk2077/toolchain.wolvenkit.yaml +163 -0
- package/knowledge/cyberpunk2077/tweakdb.loot-recipes.yaml +184 -0
- package/knowledge/cyberpunk2077/tweakdb.melee.yaml +352 -0
- package/knowledge/cyberpunk2077/tweakdb.weapons.yaml +325 -0
- package/knowledge/cyberpunk2077/tweakxl.hotreload.yaml +151 -0
- package/knowledge/cyberpunk2077/tweakxl.yaml-syntax.yaml +208 -0
- package/knowledge/cyberpunk2077/ui.icons.yaml +259 -0
- package/knowledge/cyberpunk2077/ui.inkatlas.yaml +81 -0
- package/knowledge/cyberpunk2077/ui.modsettings.yaml +204 -0
- package/knowledge/cyberpunk2077/vehicles.control.yaml +475 -0
- package/knowledge/cyberpunk2077/vehicles.dashboard-ui.yaml +203 -0
- package/knowledge/cyberpunk2077/vehicles.entities.yaml +195 -0
- package/knowledge/cyberpunk2077/vehicles.wiring.yaml +137 -0
- package/knowledge/cyberpunk2077/wolvenkit.cli.yaml +167 -0
- package/knowledge/cyberpunk2077/workspot.system.yaml +55 -0
- package/knowledge/cyberpunk2077/world.interactions.yaml +41 -0
- package/knowledge/cyberpunk2077/world.loot-container.yaml +167 -0
- package/knowledge/cyberpunk2077/world.sectors.yaml +233 -0
- package/knowledge/eldenring/formats.binders.yaml +237 -0
- package/knowledge/eldenring/launcher.me3.yaml +230 -0
- package/knowledge/eldenring/launcher.modengine2.yaml +119 -0
- package/knowledge/eldenring/params.paramdef.yaml +149 -0
- package/knowledge/eldenring/params.regulation.yaml +142 -0
- package/knowledge/eldenring/saves.online.yaml +118 -0
- package/knowledge/eldenring/toolchain.cli.yaml +256 -0
- package/knowledge/nivalisnights/modding.runtime.yaml +157 -0
- package/knowledge/skyrimse/archives.bsa.yaml +212 -0
- package/knowledge/skyrimse/install.detection.yaml +41 -0
- package/knowledge/skyrimse/loadorder.files.yaml +242 -0
- package/knowledge/skyrimse/plugins.esl.yaml +189 -0
- package/knowledge/skyrimse/plugins.format.yaml +224 -0
- package/knowledge/skyrimse/skse.runtime.yaml +283 -0
- package/knowledge/skyrimse/toolchain.xedit-spriggit.yaml +336 -0
- package/knowledge/stardewvalley/contentpatcher.format.yaml +338 -0
- package/knowledge/stardewvalley/distribution.channels.yaml +236 -0
- package/knowledge/stardewvalley/game.versions.yaml +202 -0
- package/knowledge/stardewvalley/install.layout.yaml +277 -0
- package/knowledge/stardewvalley/smapi.loader.yaml +284 -0
- package/knowledge/stardewvalley/smapi.logs.yaml +329 -0
- package/knowledge/stardewvalley/smapi.manifest.yaml +293 -0
- package/knowledge/stardewvalley/toolchain.build.yaml +261 -0
- package/knowledge/stardewvalley/wiki.dataformat.yaml +130 -0
- package/knowledge/subnautica2/game.build.yaml +331 -0
- package/knowledge/subnautica2/modding.state.yaml +210 -0
- package/knowledge/subnautica2/ue5.containers.yaml +72 -0
- package/knowledge/subnautica2/ue5.paks.yaml +203 -0
- package/knowledge/subnautica2/ue5.tooling.yaml +175 -0
- package/knowledge/subnautica2/ue5.ue4ss.yaml +203 -0
- package/knowledge/valheim/bepinex.loader.yaml +247 -0
- package/knowledge/valheim/bepinex.plugins.yaml +251 -0
- package/knowledge/valheim/game.versions.yaml +321 -0
- package/knowledge/valheim/install.layout.yaml +216 -0
- package/knowledge/valheim/jotunn.library.yaml +334 -0
- package/knowledge/valheim/thunderstore.packaging.yaml +217 -0
- package/knowledge/valheim/toolchain.build.yaml +111 -0
- package/package.json +29 -0
- package/scaffolds/baldursgate3/new-class-injection.yaml +148 -0
- package/scaffolds/baldursgate3/new-item.yaml +264 -0
- package/scaffolds/baldursgate3/new-mod.yaml +174 -0
- package/scaffolds/baldursgate3/new-passive.yaml +100 -0
- package/scaffolds/baldursgate3/new-project.yaml +118 -0
- package/scaffolds/baldursgate3/new-quest-stub.yaml +159 -0
- package/scaffolds/baldursgate3/new-spell.yaml +102 -0
- package/scaffolds/baldursgate3/new-status.yaml +119 -0
- package/scaffolds/baldursgate3/sequences/subclass-kit.yaml +50 -0
- package/scaffolds/cyberpunk2077/edit-tweak.yaml +70 -0
- package/scaffolds/cyberpunk2077/mesh-export-preset.yaml +170 -0
- package/scaffolds/cyberpunk2077/new-entity-patch.yaml +255 -0
- package/scaffolds/cyberpunk2077/new-garment-refit.yaml +279 -0
- package/scaffolds/cyberpunk2077/new-item-chain.yaml +548 -0
- package/scaffolds/cyberpunk2077/new-localization.yaml +130 -0
- package/scaffolds/cyberpunk2077/new-mod-settings.yaml +133 -0
- package/scaffolds/cyberpunk2077/new-player-replacer.yaml +1003 -0
- package/scaffolds/cyberpunk2077/new-project.yaml +157 -0
- package/scaffolds/cyberpunk2077/new-sector-node.yaml +156 -0
- package/scaffolds/cyberpunk2077/new-tweak.yaml +121 -0
- package/scaffolds/cyberpunk2077/new-vehicle-livery.yaml +148 -0
- package/scaffolds/cyberpunk2077/new-workspot-entity.yaml +177 -0
- package/scaffolds/cyberpunk2077/sequences/iconic-weapon.yaml +72 -0
- package/scaffolds/cyberpunk2077/sequences/quickhack-takeover.yaml +213 -0
- package/scaffolds/stardewvalley/new-cp-patch.yaml +106 -0
- package/scaffolds/stardewvalley/new-csharp-mod.yaml +195 -0
- package/scaffolds/stardewvalley/new-project.yaml +184 -0
- package/scaffolds/stardewvalley/sequences/content-pack.yaml +31 -0
- package/scripts/mw-tool.mjs +184 -0
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
game: cyberpunk2077
|
|
2
|
+
topic: anims.pipeline
|
|
3
|
+
title: Blender to GLB to WolvenKit .anims round trip for custom FPP melee animations
|
|
4
|
+
facts:
|
|
5
|
+
- id: cp2077.anims.pipeline.cli-export-anims-old-belief
|
|
6
|
+
claim: An early project note stated that WolvenKit.CLI cannot export .anims to GLB, making the GLB
|
|
7
|
+
half of the round trip a GUI-only job.
|
|
8
|
+
status: contradicted
|
|
9
|
+
source: ModWright research
|
|
10
|
+
tags:
|
|
11
|
+
- wolvenkit
|
|
12
|
+
- cli
|
|
13
|
+
- export
|
|
14
|
+
- anims
|
|
15
|
+
- glb
|
|
16
|
+
detail: "Superseded the same day: the missing ingredient was the -gp flag, not a real CLI
|
|
17
|
+
limitation. Replaced by cp2077.anims.roundtrip.cli-export-strips-root-motion, which carries
|
|
18
|
+
both the working command form and the root-motion caveat. The GUI-only IMPORT half of the
|
|
19
|
+
round trip is recorded separately at cp2077.anims.roundtrip.import-is-gui-only."
|
|
20
|
+
- id: cp2077.anims.pipeline.glb-export-requires-animations-checkbox
|
|
21
|
+
claim: Exporting an authored action from Blender back to a Cyberpunk GLB requires selecting the
|
|
22
|
+
ARMATURE object in Object Mode and ticking "Animations" (export_poses) in File -> Export ->
|
|
23
|
+
Cyberpunk GLB; without it the exporter takes the mesh path and fails with "No meshes
|
|
24
|
+
selected".
|
|
25
|
+
status: inferred
|
|
26
|
+
source: ModWright research
|
|
27
|
+
tags:
|
|
28
|
+
- blender
|
|
29
|
+
- export
|
|
30
|
+
- glb
|
|
31
|
+
- cyberpunk-io-suite
|
|
32
|
+
- animations
|
|
33
|
+
detail: Leave "Export Float Tracks" ON and any action filter OFF, or only the active action gets
|
|
34
|
+
written to the GLB.
|
|
35
|
+
- id: cp2077.anims.pipeline.cp77-addon-importer-required-for-anims
|
|
36
|
+
claim: A donor .anims GLB must be imported with the Cyberpunk IO Suite's
|
|
37
|
+
`bpy.ops.io_scene_gltf.cp77(scripting=True, import_tracks=True)`, never with Blender's stock
|
|
38
|
+
`bpy.ops.import_scene.gltf`.
|
|
39
|
+
status: verified
|
|
40
|
+
source: ModWright field verification
|
|
41
|
+
tags:
|
|
42
|
+
- blender
|
|
43
|
+
- cp77-addon
|
|
44
|
+
- import
|
|
45
|
+
- anims
|
|
46
|
+
- float-tracks
|
|
47
|
+
- stock-gltf
|
|
48
|
+
detail: A CP2077 animation entry carries 23 float tracks (allowFeetIk, enableLeftFootIk,
|
|
49
|
+
chestSpineStretchFactor, ...) as non-bone fcurves plus 12-14 action custom properties
|
|
50
|
+
(rootMotionType, constTrackKeys, animEvents, optimizationHints, ...). The stock importer drops
|
|
51
|
+
all of this. A block build exported through the stock path teleported the player and made V
|
|
52
|
+
fall through the floor.
|
|
53
|
+
- id: cp2077.anims.pipeline.float-track-carries-model-space-position
|
|
54
|
+
claim: Among a clip's 23 float tracks are modelSpacePositionX/Y/Z, the player's model-space
|
|
55
|
+
position; a clip that loses this track data on import teleports the player.
|
|
56
|
+
status: inferred
|
|
57
|
+
source: ModWright research
|
|
58
|
+
tags:
|
|
59
|
+
- float-track
|
|
60
|
+
- model-space-position
|
|
61
|
+
- teleport
|
|
62
|
+
- stock-gltf
|
|
63
|
+
detail: Discovered while diagnosing the stock-glTF-importer teleport defect above; this is the
|
|
64
|
+
specific mechanism by which a clip missing its non-bone track data moves the player character.
|
|
65
|
+
- id: cp2077.anims.pipeline.cubicspline-import-failure
|
|
66
|
+
claim: Keyframes inserted from a Python script default to BEZIER interpolation, which Blender's glTF
|
|
67
|
+
exporter writes as CUBICSPLINE samplers; WolvenKit's importer rejects those with "The given
|
|
68
|
+
key 'CUBICSPLINE' was not present in the dictionary."
|
|
69
|
+
status: inferred
|
|
70
|
+
source: ModWright research
|
|
71
|
+
tags:
|
|
72
|
+
- blender
|
|
73
|
+
- cubicspline
|
|
74
|
+
- interpolation
|
|
75
|
+
- import-failure
|
|
76
|
+
- keyframe
|
|
77
|
+
detail: "Fix, belt and braces: set `bpy.context.preferences.edit.keyframe_new_interpolation_type =
|
|
78
|
+
'LINEAR'` before keying, then force every existing key's interpolation to LINEAR after keying.
|
|
79
|
+
A healthy GLB reports only STEP and LINEAR samplers (one verified example: 22696 STEP / 7400
|
|
80
|
+
LINEAR, zero CUBICSPLINE). Vanilla-imported curves are already LINEAR/STEP, which is why an
|
|
81
|
+
untouched round trip imports fine and a freshly-keyed one does not."
|
|
82
|
+
- id: cp2077.anims.pipeline.compare-curves-by-bone-name-not-index
|
|
83
|
+
claim: "Offline verification of a round-tripped .anims file must compare motion curves by BONE NAME,
|
|
84
|
+
never by node index, because the GLB export reorders skeleton node indices (one measured
|
|
85
|
+
example: RightHand moved from index 25 to 47)."
|
|
86
|
+
status: inferred
|
|
87
|
+
source: ModWright research
|
|
88
|
+
tags:
|
|
89
|
+
- glb
|
|
90
|
+
- node-index
|
|
91
|
+
- bone-name
|
|
92
|
+
- verification
|
|
93
|
+
- reorder
|
|
94
|
+
detail: Index-based comparison of the same bone before and after a round trip shows bogus
|
|
95
|
+
~180-degree deltas that are purely an artifact of the reordering, not a real pose change.
|
|
96
|
+
- id: cp2077.anims.pipeline.roundtrip-baseline-gate
|
|
97
|
+
claim: A clean, unedited .anims round trip through Blender (import via the cp77 addon, export back
|
|
98
|
+
to GLB, WolvenKit reimport) reproduces all 97 entries with identical names, durations and
|
|
99
|
+
animationType, and curve values identical to float rounding (max component delta measured
|
|
100
|
+
1.4e-4).
|
|
101
|
+
status: inferred
|
|
102
|
+
source: ModWright research
|
|
103
|
+
tags:
|
|
104
|
+
- round-trip
|
|
105
|
+
- baseline
|
|
106
|
+
- gate
|
|
107
|
+
- verification
|
|
108
|
+
- float-rounding
|
|
109
|
+
detail: "Blender bakes denser keys than the source cooked file (source file 515KB -> 726KB after the
|
|
110
|
+
round trip; GLB size drops from 18.8MB to 9.4MB — this is fine). The only structural delta on
|
|
111
|
+
a clean round trip is that the importer adds a `motionExtraction: {HandleRefId: -1}` null
|
|
112
|
+
handle where the original omitted the field; this is harmless."
|
|
113
|
+
- id: cp2077.anims.pipeline.animevents-survive-roundtrip-byte-identical
|
|
114
|
+
claim: animAnimEvent_Phase events (a clip's startup/active/recover segment markers, stored as
|
|
115
|
+
startFrame + durationInFrames in a sibling "events" container next to the clip's ".animation"
|
|
116
|
+
data) survive the Blender GLB round trip byte-identical, even on clips whose keyframes were
|
|
117
|
+
actively rewritten.
|
|
118
|
+
status: inferred
|
|
119
|
+
source: ModWright research
|
|
120
|
+
tags:
|
|
121
|
+
- animevents
|
|
122
|
+
- phase-markers
|
|
123
|
+
- round-trip
|
|
124
|
+
- cp77-addon
|
|
125
|
+
- custom-properties
|
|
126
|
+
detail: "Measured across the whole vanilla katana set: 184 events across 97 entries before, 184
|
|
127
|
+
after, zero changed — including 26 events on 11 clips whose keyframes the block builder
|
|
128
|
+
actually rewrote. The cp77 addon carries these events in Blender action custom properties,
|
|
129
|
+
which is why they survive edits to the bone curves untouched."
|
|
130
|
+
- id: cp2077.anims.pipeline.numframes-off-by-one-defect
|
|
131
|
+
claim: Vanilla .anims entries hold the invariant `numFrames - 1 == duration * 30` (measured on
|
|
132
|
+
401/401 entries across six vanilla sets); one mod's pipeline instead wrote `duration * 30` for
|
|
133
|
+
numFrames while preserving duration unchanged, producing an off-by-one on 44 of 96 shipped
|
|
134
|
+
entries, including combo_attack_01/02/03.
|
|
135
|
+
status: inferred
|
|
136
|
+
source: ModWright research
|
|
137
|
+
tags:
|
|
138
|
+
- numframes
|
|
139
|
+
- duration
|
|
140
|
+
- off-by-one
|
|
141
|
+
- invariant
|
|
142
|
+
- defect
|
|
143
|
+
detail: Whether the game engine actually reads numFrames directly, or derives the sample count
|
|
144
|
+
purely from duration, is a separate open question — see
|
|
145
|
+
cp2077.anims.graph.numframes-engine-read-question (unverified). The fix applied was to assert
|
|
146
|
+
the invariant in the builder and correct the field regardless of whether the engine cared.
|
|
147
|
+
- id: cp2077.anims.pipeline.serialize-diff-offline-verification-workflow
|
|
148
|
+
claim: The standard offline verification workflow for a rebuilt .anims file is to `convert
|
|
149
|
+
serialize` both the original and the rebuilt file to JSON, diff entry names, durations and
|
|
150
|
+
animationType, then compare motion curves by bone name (never node index).
|
|
151
|
+
status: inferred
|
|
152
|
+
source: ModWright research
|
|
153
|
+
tags:
|
|
154
|
+
- wolvenkit
|
|
155
|
+
- serialize
|
|
156
|
+
- json
|
|
157
|
+
- diff
|
|
158
|
+
- workflow
|
|
159
|
+
detail: This workflow, plus the end-to-end pose re-measurement, replaces a game launch for almost
|
|
160
|
+
every structural or pose question about a rebuilt .anims file.
|
|
161
|
+
- id: cp2077.anims.pipeline.gui-import-reads-project-raw-folder-not-arbitrary-glb
|
|
162
|
+
claim: The WolvenKit GUI's Import action always consumes the project's own raw folder path for the
|
|
163
|
+
resource being imported (e.g. `<Project>\source\raw\mod\<mod>\anims\<set>.anims.glb`), not
|
|
164
|
+
whatever GLB the build tooling last wrote elsewhere; staging a new build requires copying the
|
|
165
|
+
staging GLB over that raw-folder path (MD5-verified) before telling the user to import.
|
|
166
|
+
status: inferred
|
|
167
|
+
source: ModWright research
|
|
168
|
+
tags:
|
|
169
|
+
- wolvenkit
|
|
170
|
+
- gui
|
|
171
|
+
- import
|
|
172
|
+
- raw-folder
|
|
173
|
+
- staging
|
|
174
|
+
- stale-import
|
|
175
|
+
detail: "Caught after a \"no difference\" deploy: the staging GLB was current but the raw-folder
|
|
176
|
+
copy was from that morning, the import \"succeeded\" against the stale copy, and two deploys
|
|
177
|
+
shipped stale content while every downstream check passed (a deploy script's baseline check
|
|
178
|
+
only catches a never-imported GLB, not a stale one). Diagnose this class of failure by
|
|
179
|
+
serializing the imported .anims and checking a field only the new build could have set."
|
|
180
|
+
- id: cp2077.anims.pipeline.numconstankeys-dense-encoding-not-a-defect
|
|
181
|
+
claim: A rebuilt .anims entry that reports `numConstAnimKeys = 0` (every joint stored on every
|
|
182
|
+
frame, dense encoding) after a round trip is not itself a fault as long as the end-to-end pose
|
|
183
|
+
check passes — vanilla `melee_first_equip` ships encoded the same dense way.
|
|
184
|
+
status: inferred
|
|
185
|
+
source: ModWright research
|
|
186
|
+
tags:
|
|
187
|
+
- numconstankeys
|
|
188
|
+
- dense-encoding
|
|
189
|
+
- gate
|
|
190
|
+
- false-positive
|
|
191
|
+
detail: This was initially graded a hard build failure by an overly strict heuristic; it was found
|
|
192
|
+
to be a cosmetic difference in how identical data is packed, not missing data.
|
|
193
|
+
- id: cp2077.anims.pipeline.content-diff-preferred-over-byte-md5
|
|
194
|
+
claim: "Repeated GLB rebuilds from the same content are NOT byte-reproducible: the Blender/cp77
|
|
195
|
+
exporter scrambles channel ORDER run-to-run on some clips (a documented case: exactly the four
|
|
196
|
+
sway additive clips), values remaining bit-identical. Regression gates should diff channels
|
|
197
|
+
matched by bone+path (content diff), never compare whole-file byte MD5."
|
|
198
|
+
status: inferred
|
|
199
|
+
source: ModWright research
|
|
200
|
+
tags:
|
|
201
|
+
- content-diff
|
|
202
|
+
- byte-md5
|
|
203
|
+
- regression-gate
|
|
204
|
+
- channel-order
|
|
205
|
+
- glb-export
|
|
206
|
+
detail: Setting PYTHONHASHSEED=0 does not fix the channel-order nondeterminism. The project's
|
|
207
|
+
`_glb_content_diff.py` tool matches channels by bone name and property path specifically to
|
|
208
|
+
make this gate reliable.
|
|
209
|
+
- id: cp2077.anims.pipeline.wolvenkit-importer-numextrajoints-drops-last-joints
|
|
210
|
+
claim: WolvenKit's animation importer (AnimationTools.cs::PutAnimations) computes `jointsCountActual
|
|
211
|
+
= numJoints - numExtraJoints`, where numExtraJoints is read from the GLB action's
|
|
212
|
+
custom-property "extras" on each animation, and drops that many joints from the end of the rig
|
|
213
|
+
regardless of what the WolvenKit project file itself specifies; a GLB whose extras still carry
|
|
214
|
+
a donor clip's inherited numExtraJoints value (e.g. 1) silently imports one fewer joint than
|
|
215
|
+
it should.
|
|
216
|
+
status: inferred
|
|
217
|
+
source: ModWright research
|
|
218
|
+
tags:
|
|
219
|
+
- wolvenkit
|
|
220
|
+
- importer
|
|
221
|
+
- numextrajoints
|
|
222
|
+
- glb-extras
|
|
223
|
+
- missing-joints
|
|
224
|
+
- victim-anims
|
|
225
|
+
supersedes: cp2077.anims.pipeline.dense-per-frame-baking-imports-more-reliably
|
|
226
|
+
detail: "Found on victim-lift animation clips inheriting a donor's `numExtraJoints: 1` GLB extras
|
|
227
|
+
value: they imported 69/71 rig bones (missing RightHandPinky3 and Root) while a from-scratch
|
|
228
|
+
player-authored GLB with `numExtraJoints: 0` imported all 152/152 clean. Three earlier
|
|
229
|
+
attempted fixes (project-file numExtraJoints, a small Root offset, dense baking alone) never
|
|
230
|
+
touched this GLB-extras field and were therefore byte-for-byte no-ops on the symptom."
|
|
231
|
+
- id: cp2077.anims.pipeline.wolvenkit-importer-rootmotiontype-consumes-root-joint
|
|
232
|
+
claim: WolvenKit's importer (Tools/Animation/AnimRootMotion.cs::ExtractRootMotion), for any
|
|
233
|
+
rootMotionType other than None/Unknown, takes the Root joint's translation/rotation as the
|
|
234
|
+
root-motion source and never writes Root as a regular joint channel; setting an action's
|
|
235
|
+
rootMotionType to "Unknown" makes the importer instead keep the project file's existing
|
|
236
|
+
motionExtraction data verbatim and treat Root as an ordinary joint.
|
|
237
|
+
status: inferred
|
|
238
|
+
source: ModWright research
|
|
239
|
+
tags:
|
|
240
|
+
- wolvenkit
|
|
241
|
+
- importer
|
|
242
|
+
- rootmotiontype
|
|
243
|
+
- root-motion
|
|
244
|
+
- extras
|
|
245
|
+
detail: 'Fix applied in the clip-editing script: set numExtraJoints=0, numExtraTracks=0, and
|
|
246
|
+
rootMotionType="Unknown" on every action before export, and gate the written GLB on both the
|
|
247
|
+
extras values and which bones actually carry channels. All three prepared victim GLBs then
|
|
248
|
+
reported "GLB EXTRAS OK" and imported their full 71/71 joint count.'
|
|
249
|
+
- id: cp2077.anims.pipeline.dense-per-frame-baking-imports-more-reliably
|
|
250
|
+
claim: "A clip where every bone is re-keyed with evaluated values on every single frame (a dense
|
|
251
|
+
bake) imports its full joint count via WolvenKit's raw per-frame path (one measured case:
|
|
252
|
+
152/152 bones, numConstAnimKeys 0), while sparse or padded curves from a less exhaustive
|
|
253
|
+
keying approach can take an import path that silently drops the rig's first and last joints."
|
|
254
|
+
status: contradicted
|
|
255
|
+
source: ModWright research
|
|
256
|
+
tags:
|
|
257
|
+
- dense-bake
|
|
258
|
+
- per-frame
|
|
259
|
+
- joint-coverage
|
|
260
|
+
- import-reliability
|
|
261
|
+
- dead-belief
|
|
262
|
+
detail: "Kept as the belief held on 2026-09-02 morning. DISPROVEN the same afternoon: \"The
|
|
263
|
+
dense-bake fix did not take either\" — the rebuilt victim clips still imported 69/71 bones
|
|
264
|
+
after a full dense bake, and the source's own summary is that \"the three earlier fixes
|
|
265
|
+
(project-file numExtraJoints, Root 0.1 mm, dense bake) never touched the extras, which is why
|
|
266
|
+
they were byte-for-byte no-ops on the symptom.\" The real cause is the GLB action extras — see
|
|
267
|
+
cp2077.anims.pipeline.wolvenkit-importer-numextrajoints-drops-last-joints. The 152/152
|
|
268
|
+
dense-baked player set is still a true observation; it simply does not explain the victim
|
|
269
|
+
sets, which were also dense-baked and still dropped two joints."
|
|
270
|
+
- id: cp2077.anims.pipeline.attach-frame-90-degree-rotation-correction
|
|
271
|
+
claim: The in-game FPP weapon attachment frame is `game_weapon_world = bone_world @ Rotation(-90
|
|
272
|
+
deg, local X)`; a Blender preview workbench that Child-Of's the weapon mesh to WeaponRight
|
|
273
|
+
with an IDENTITY inverse gets the weapon's POSITION right but its ROTATION 90 degrees wrong.
|
|
274
|
+
status: verified
|
|
275
|
+
source: ModWright field verification
|
|
276
|
+
tags:
|
|
277
|
+
- attachment-frame
|
|
278
|
+
- weaponright
|
|
279
|
+
- child-of
|
|
280
|
+
- rotation
|
|
281
|
+
- workbench
|
|
282
|
+
- probe
|
|
283
|
+
detail: "Confirmed because the identical 90-degree discrepancy appeared on an UNTOUCHED vanilla clip
|
|
284
|
+
(melee_idlepose) too, proving the preview frame was wrong rather than the authored data. Fix:
|
|
285
|
+
set the Child Of inverse to Rotation(-90 deg, X); any weapon-pose write to bones must apply `X
|
|
286
|
+
@ ATTACH^-1` so a desired world matrix X lands as X in game."
|
|
287
|
+
- id: cp2077.anims.pipeline.file-layout-weapon-anim-sets
|
|
288
|
+
claim: Player FPP melee anim sets live under `base\animations\weapon\<weapon>\` as per-gender files
|
|
289
|
+
`pwa_<weapon>.anims` (female) / `pma_<weapon>.anims` (male); all player melee weapon sets
|
|
290
|
+
share the same 152-joint rig, which is what makes cross-weapon donor grafting mechanically
|
|
291
|
+
straightforward.
|
|
292
|
+
status: inferred
|
|
293
|
+
source: ModWright research
|
|
294
|
+
tags:
|
|
295
|
+
- file-layout
|
|
296
|
+
- anim-set
|
|
297
|
+
- pwa
|
|
298
|
+
- pma
|
|
299
|
+
- rig
|
|
300
|
+
- weapon-family
|
|
301
|
+
detail: Motion data is stored as compressed slices in animationDataChunks[i] (base64 in the
|
|
302
|
+
serialized JSON), addressed per entry by animBuffer.dataAddress {unkIndex, fsetInBytes,
|
|
303
|
+
zeInBytes}; WolvenKit also keeps a per-entry tempBuffer copy. `default_melee_weapon.anims`
|
|
304
|
+
(non-prefixed) is a separate, ungated, always-mounted fallback set distinct from any
|
|
305
|
+
per-weapon-family pwa_/pma_ set.
|
|
306
|
+
- id: cp2077.anims.pipeline.entry-naming-convention
|
|
307
|
+
claim: "Entries inside a player melee .anims set follow a fixed naming convention. The CSV motion
|
|
308
|
+
database defines the addressable names: combo_attack_01..09, heavy_attack_01..06 (plus
|
|
309
|
+
melee_hack_attack, mantisblade_special_heavy, one_punch_heavy_attack) and final_attack_01..09.
|
|
310
|
+
Alongside them a set carries block/block_start/block_end/block_attack, add_block_*
|
|
311
|
+
(directional block reactions), block_deflect_left/right, hold_start_01 +
|
|
312
|
+
hold_start_offscreen_01/02, hold_loop_01/02, melee_idlepose/melee_safepose/melee_crouchpose
|
|
313
|
+
and their transitions, melee_equip/melee_first_equip/melee_unequip, the melee_slide_* and
|
|
314
|
+
melee_sprint_* locomotion entries, and the
|
|
315
|
+
slide/crouch/jump/sprint/fall/throw/dodge/equip/safe attack variants — every base attack entry
|
|
316
|
+
paired with `_hit` and `_deflect` suffixed variants."
|
|
317
|
+
status: inferred
|
|
318
|
+
source: ModWright research
|
|
319
|
+
tags:
|
|
320
|
+
- naming-convention
|
|
321
|
+
- entry-names
|
|
322
|
+
- combo-attack
|
|
323
|
+
- heavy-attack
|
|
324
|
+
- final-attack
|
|
325
|
+
detail: "Not every numbered slot has a clip in every set: heavy_attack_03, final_attack_01/02,
|
|
326
|
+
final_attack_06..09 and combo_attack_05..09 are addressable CSV names with no clip in any
|
|
327
|
+
mounted set (see cp2077.anims.graph.real-swing-ceiling-is-nine-slot-csv). combo_attack_04 DOES
|
|
328
|
+
exist in the vanilla katana set (a 4th diagonal slash) and therefore in this mod's
|
|
329
|
+
katana-clone set, as well as in default_melee_weapon.anims (where it is the left-punch
|
|
330
|
+
content) — an earlier phrasing of this fact wrongly said it existed only in
|
|
331
|
+
default_melee_weapon.anims. In vanilla katana, final_attack_04 is byte-identical to
|
|
332
|
+
combo_attack_04 but sits in a distinct buffer (BufferId 75 vs 76), so re-authoring one does
|
|
333
|
+
not alias into the other."
|
|
334
|
+
- id: cp2077.anims.pipeline.byte-splice-transplant-approach-dead
|
|
335
|
+
claim: "An early transplant approach — decoding a source .anims motion chunk, slicing its bytes,
|
|
336
|
+
appending them to a target entry's chunk, and repointing the target's dataAddress (a
|
|
337
|
+
byte-growing cross-file splice) — was silently rejected by the game engine: the modded file
|
|
338
|
+
loaded, but the spliced entry played unchanged vanilla content, with no error anywhere."
|
|
339
|
+
status: contradicted
|
|
340
|
+
source: ModWright research
|
|
341
|
+
tags:
|
|
342
|
+
- transplant
|
|
343
|
+
- byte-splice
|
|
344
|
+
- chunk-growing
|
|
345
|
+
- dead-end
|
|
346
|
+
- silent-rejection
|
|
347
|
+
detail: "A decisive bisect ruled out several other explanations: an IN-FILE repoint with no new
|
|
348
|
+
bytes (redirecting one existing entry's dataAddress to another existing entry's data) DID work
|
|
349
|
+
and rendered correctly in game, while any approach that grew the file's chunk data did not.
|
|
350
|
+
This dead end was abandoned in favor of the full Blender GLB round-trip pipeline (author in
|
|
351
|
+
Blender, export a whole GLB, WolvenKit reimport) documented in the rest of this file — no
|
|
352
|
+
single fact \"replaces\" it, so no supersedes id is given."
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
game: cyberpunk2077
|
|
2
|
+
topic: anims.roundtrip
|
|
3
|
+
title: Round-tripping .anims through wolvenkit and Blender - known corruptions
|
|
4
|
+
facts:
|
|
5
|
+
- id: cp2077.anims.roundtrip.cli-export-strips-root-motion
|
|
6
|
+
claim: "wolvenkit CLI can export .anims to GLB headlessly (positional path plus -gp), but it
|
|
7
|
+
SILENTLY STRIPS ROOT MOTION by default, logging only \"Root motion export: disabled\". A
|
|
8
|
+
clip's world travel simply vanishes from the GLB and every measurement taken from it is wrong.
|
|
9
|
+
Enable it with \"AnimationExportArgs\" incRootMotion true in the CLI's appsettings.json."
|
|
10
|
+
status: verified
|
|
11
|
+
source: ModWright field verification
|
|
12
|
+
tags:
|
|
13
|
+
- cli
|
|
14
|
+
- anims
|
|
15
|
+
- export
|
|
16
|
+
- root-motion
|
|
17
|
+
- silent-failure
|
|
18
|
+
- appsettings
|
|
19
|
+
supersedes: cp2077.anims.pipeline.cli-export-anims-old-belief
|
|
20
|
+
detail: "The -o output directory must already EXIST or the export dies with \"fill in an output
|
|
21
|
+
path\". Corrects an earlier note claiming the CLI could not export .anims at all (kept as
|
|
22
|
+
cp2077.anims.pipeline.cli-export-anims-old-belief). MERGED from a mod project's record of the
|
|
23
|
+
same command, which adds: the path argument must be POSITIONAL (with -p instead it fails
|
|
24
|
+
misleadingly with \"Exporting mesh files with materials requires --gamepath to be set\"); -gp
|
|
25
|
+
is what lets the archive manager resolve the skeleton rig (a copy of the rig also sits in the
|
|
26
|
+
WolvenKit depot at MaterialRepositoryPath); a successful run logs \"Found 88 animations to
|
|
27
|
+
export, using rig base\\characters\\entities\\player\\player_woman_skeleton.rig\"; and donor
|
|
28
|
+
acquisition therefore no longer needs a GUI trip."
|
|
29
|
+
- id: cp2077.anims.roundtrip.rm-export-timeline-is-normalised
|
|
30
|
+
claim: In a root-motion GLB export the ROOT timeline is normalised to 0..1 seconds, NOT clip time.
|
|
31
|
+
Reading extraction timing off the GLB therefore time-squashes the motion by the clip's
|
|
32
|
+
duration. Read timing from the serialized .anims instead.
|
|
33
|
+
status: verified
|
|
34
|
+
source: ModWright field verification
|
|
35
|
+
tags:
|
|
36
|
+
- anims
|
|
37
|
+
- export
|
|
38
|
+
- root-motion
|
|
39
|
+
- timing
|
|
40
|
+
- measurement
|
|
41
|
+
detail: Cost a full authoring round. motionExtraction (animSplineCompressedMotionExtraction)
|
|
42
|
+
posKeysData and rotKeysData are 16-byte knots, u16 t_norm then u16 flags then three f32, where
|
|
43
|
+
t is t_norm/65535 times duration and the values are Root translation in the rig's LOCAL frame.
|
|
44
|
+
- id: cp2077.anims.roundtrip.simd-extra-joints-export-garbage
|
|
45
|
+
claim: A clip whose animation buffer is animAnimationBufferSimd AND which has one or more extra
|
|
46
|
+
joints exports to GLB as silent garbage - every bone carries a bogus constant scale fcurve and
|
|
47
|
+
the evaluated pose collapses. Compressed buffers with extra joints are fine, and Simd with
|
|
48
|
+
zero extra joints is fine. It is the COMBINATION, not the extra-joint count alone.
|
|
49
|
+
status: verified
|
|
50
|
+
source: ModWright field verification
|
|
51
|
+
tags:
|
|
52
|
+
- anims
|
|
53
|
+
- export
|
|
54
|
+
- glb
|
|
55
|
+
- corruption
|
|
56
|
+
- simd
|
|
57
|
+
- wolvenkit-bug
|
|
58
|
+
- blender
|
|
59
|
+
detail: Under full inherit-scale the bogus scale compounds down 152 bones until every bone's
|
|
60
|
+
evaluated head reads as a unit vector, no exception is raised, and a render is an empty frame.
|
|
61
|
+
Every PLAYER finisher clip in the game is Simd with one extra joint, so none can currently be
|
|
62
|
+
round-tripped; NPC-side finisher clips are Compressed and export clean. The extra joints are
|
|
63
|
+
syncTrajectory sync-scene tracks, not bones, so no rig override helps. CHEAP UNIVERSAL GATE -
|
|
64
|
+
after importing any donor, assert every pose bone's matrix_basis scale is (1,1,1) and that the
|
|
65
|
+
pose actually moves. The anim pipeline keys loc and rot only, so any nonzero scale channel on
|
|
66
|
+
a donor is by definition corruption.
|
|
67
|
+
- id: cp2077.anims.roundtrip.import-writes-bad-fallback-indices
|
|
68
|
+
claim: The .anims GUI import rewrites fallbackFrameIndices on REBUILT clips to out-of-range values,
|
|
69
|
+
which HARD CRASHES the game the instant such a clip plays. Each clip's
|
|
70
|
+
animBuffer.fallbackFrameIndices is two ints indexing the set-level fallbackAnimDescIndexes
|
|
71
|
+
array.
|
|
72
|
+
status: verified
|
|
73
|
+
source: ModWright field verification
|
|
74
|
+
tags:
|
|
75
|
+
- anims
|
|
76
|
+
- import
|
|
77
|
+
- crash
|
|
78
|
+
- corruption
|
|
79
|
+
- wolvenkit-bug
|
|
80
|
+
- gate
|
|
81
|
+
detail: "Vanilla mantis clips use small in-range values such as [4,5] or [6,7]; the importer rewrote
|
|
82
|
+
rebuilt clips to [78,79] while leaving untouched clips alone, and the engine then read index
|
|
83
|
+
78 of a 10-element array. The compile was clean and the bone data sound. The fallback ARRAYS
|
|
84
|
+
survive import identical to vanilla, so the fix is byte-safe: restore each rebuilt clip's
|
|
85
|
+
indices in the serialized JSON, and gate that every clip's indices are within the bounds of
|
|
86
|
+
fallbackAnimDescIndexes before packing."
|
|
87
|
+
- id: cp2077.anims.roundtrip.import-stale-extra-joint-count
|
|
88
|
+
claim: The .anims import copies the EXISTING clip's extra-joint count onto a rebuilt clip while
|
|
89
|
+
encoding every GLB bone as a real channel. The engine then reads the last real bone as a sync
|
|
90
|
+
track, the mesh bounds straddle the frustum, and the body flashes on and off in game. A
|
|
91
|
+
rebuilt clip from a GLB with no sync nodes MUST carry numExtraJoints 0 and empty
|
|
92
|
+
extraDataNames.
|
|
93
|
+
status: verified
|
|
94
|
+
source: ModWright field verification
|
|
95
|
+
tags:
|
|
96
|
+
- anims
|
|
97
|
+
- import
|
|
98
|
+
- corruption
|
|
99
|
+
- culling
|
|
100
|
+
- wolvenkit-bug
|
|
101
|
+
- gate
|
|
102
|
+
detail: Symptom is numJoints 71 with extra 1 on a 71-bone rig. Nothing crashes and wolvenkit exports
|
|
103
|
+
it fine. Synced finishers still align with no syncTrajectory on either side, because the
|
|
104
|
+
workspot syncOffsets carry it.
|
|
105
|
+
- id: cp2077.anims.roundtrip.import-drops-joint-channels
|
|
106
|
+
claim: The .anims importer is driven by the GLB's per-animation EXTRAS (the Blender action's custom
|
|
107
|
+
properties), NOT by the project file. A donor-inherited numExtraJoints of 1 makes it write
|
|
108
|
+
only 70 of 71 rig joints, dropping the last; and any rootMotionType other than None or Unknown
|
|
109
|
+
makes it consume the Root joint's keys as a re-invented motionExtraction and write no Root
|
|
110
|
+
joint at all. The engine reads garbage for a joint with no entry and the mesh culls in and
|
|
111
|
+
out.
|
|
112
|
+
status: verified
|
|
113
|
+
source: ModWright field verification
|
|
114
|
+
tags:
|
|
115
|
+
- anims
|
|
116
|
+
- import
|
|
117
|
+
- corruption
|
|
118
|
+
- glb-extras
|
|
119
|
+
- wolvenkit-bug
|
|
120
|
+
- gate
|
|
121
|
+
detail: "Cost three launches and three wrong fixes - aimed at the project file, the Root value, and
|
|
122
|
+
key density - because none of them touched the extras. Before exporting a clip re-authored
|
|
123
|
+
from a donor, set the action's numExtraJoints to 0 and its rootMotionType to \"Unknown\"
|
|
124
|
+
(Unknown means keep the project file's existing extraction verbatim AND treat Root as a
|
|
125
|
+
regular joint). Then gate the written GLB's extras and channel targets, and gate the imported
|
|
126
|
+
set by re-exporting it and counting channel targets. GENERALISES: when an importer misbehaves
|
|
127
|
+
on a round-tripped file, diff the round-trip's METADATA against a file that imports cleanly
|
|
128
|
+
before touching the data."
|
|
129
|
+
- id: cp2077.anims.roundtrip.import-preserves-extraction-if-root-static
|
|
130
|
+
claim: With "Use existing file", the .anims importer PRESERVES the existing clip's motionExtraction
|
|
131
|
+
as long as the GLB's Root does not move. Author bones root-relative with Root keyed STATIC and
|
|
132
|
+
a vanilla extraction survives verbatim. A GLB whose Root animates gets its extraction
|
|
133
|
+
re-encoded, and both dense and sparse Root keys produce broken results.
|
|
134
|
+
status: verified
|
|
135
|
+
source: ModWright field verification
|
|
136
|
+
tags:
|
|
137
|
+
- anims
|
|
138
|
+
- import
|
|
139
|
+
- root-motion
|
|
140
|
+
- motion-extraction
|
|
141
|
+
- gui
|
|
142
|
+
detail: Dense Root keys produced a wrong-curve spline; sparse Root keys a corrupt 66 KB one, which
|
|
143
|
+
then failed re-export with "Motion extraction in joint 2, out of range". Gate on byte-equality
|
|
144
|
+
of the extraction.
|
|
145
|
+
- id: cp2077.anims.roundtrip.import-drops-animevents
|
|
146
|
+
claim: The .anims importer does not carry the Blender addon's animEvents action property. A rebuilt
|
|
147
|
+
clip inherits the events of whatever DONOR action was copied, so the events must be patched
|
|
148
|
+
back into the serialized JSON after import.
|
|
149
|
+
status: verified
|
|
150
|
+
source: ModWright field verification
|
|
151
|
+
tags:
|
|
152
|
+
- anims
|
|
153
|
+
- import
|
|
154
|
+
- animevents
|
|
155
|
+
- corruption
|
|
156
|
+
- id: cp2077.anims.roundtrip.import-is-gui-only
|
|
157
|
+
claim: There is no headless route for importing .anims. The CLI import verb refuses them ("as Mesh")
|
|
158
|
+
and the CLI build verb crashes. The wolvenkit GUI import is the only working path, so an anims
|
|
159
|
+
pipeline cannot be fully automated.
|
|
160
|
+
status: verified
|
|
161
|
+
source: ModWright field verification
|
|
162
|
+
tags:
|
|
163
|
+
- anims
|
|
164
|
+
- import
|
|
165
|
+
- cli
|
|
166
|
+
- gui
|
|
167
|
+
- limitation
|
|
168
|
+
detail: "MERGED from a mod project's record of the same limitation, which adds the exact failure
|
|
169
|
+
text and the argument shape: `import -k` routes a .glb to the MESH importer and dies with
|
|
170
|
+
\"Failed to rebuild with buffers: x.anims (as Mesh)\"; there is no -gp and no anims-specific
|
|
171
|
+
argument on `import`, and -o must be the folder that directly CONTAINS the target .anims (it
|
|
172
|
+
does not mirror the raw tree from a single-file argument). The practical loop for one
|
|
173
|
+
animation iteration is therefore: bake headless -> ONE GUI import click -> pack headless."
|
|
174
|
+
- id: cp2077.anims.roundtrip.use-the-addon-importer
|
|
175
|
+
claim: To import a donor .anims GLB into Blender, use the Cyberpunk IO Suite importer -
|
|
176
|
+
bpy.ops.io_scene_gltf.cp77 with scripting and import_tracks enabled - never
|
|
177
|
+
bpy.ops.import_scene.gltf. The stock importer silently drops the 23 float tracks and roughly
|
|
178
|
+
13 action custom properties that every clip carries.
|
|
179
|
+
status: verified
|
|
180
|
+
source: ModWright field verification
|
|
181
|
+
tags:
|
|
182
|
+
- anims
|
|
183
|
+
- blender
|
|
184
|
+
- import
|
|
185
|
+
- addon
|
|
186
|
+
- float-tracks
|
|
187
|
+
- silent-failure
|
|
188
|
+
detail: "Dropped data includes allowFeetIk, enableLeftFootIk/RightFootIk, cameraUpOffset,
|
|
189
|
+
rootMotionType, constTrackKeys, animEvents and optimizationHints. The rebuilt entry comes back
|
|
190
|
+
hasRawRotations 1 with numConstTrackKeys 0, and in game the missing foot-IK flags TELEPORT THE
|
|
191
|
+
PLAYER - black screen, streaming reload, V under the world or underwater. Cost a full launch.
|
|
192
|
+
Gate on the encoding fields, not just names and durations. GENERALISES: when an addon ships
|
|
193
|
+
its own importer for a format, the stock one is not a substitute - the addon's exists to carry
|
|
194
|
+
the engine-specific extras."
|
|
195
|
+
- id: cp2077.anims.roundtrip.encoder-rotation-noise
|
|
196
|
+
claim: The wolvenkit anims encoder keeps POSITIONS exact (0.00 mm) but degrades ROTATIONS on the
|
|
197
|
+
gun-space chain and IK JNTs by 1.3 to 3.3 degrees. The ordinary arm chain encodes clean, under
|
|
198
|
+
0.3 degrees. Constant channels encode exactly, which is why positions survive.
|
|
199
|
+
status: inferred
|
|
200
|
+
source: ModWright research
|
|
201
|
+
tags:
|
|
202
|
+
- anims
|
|
203
|
+
- encoder
|
|
204
|
+
- rotation
|
|
205
|
+
- precision
|
|
206
|
+
- noise
|
|
207
|
+
- sway
|
|
208
|
+
detail: "A shipped weapon's orientation was up to half phantom noise: an authored turn of 2.2
|
|
209
|
+
degrees against 2.1 to 2.5 degrees of encoder error. No gate measuring the authored or
|
|
210
|
+
re-exported data at the same points can see it as motion. Practical rule - author varying
|
|
211
|
+
rotation only into arm-chain bones, keep weapon-placement and IK-bone rotation channels
|
|
212
|
+
CONSTANT, and carry motion in translations. MERGED from a mod project's measurement of the
|
|
213
|
+
same effect, which gives the per-bone numbers on the four ambient-sway additive clips:
|
|
214
|
+
worst-frame arms_gun_space 2.13 deg (add_melee_idle) / 2.50 deg (add_melee_idle_combat), the
|
|
215
|
+
four Torso_*Arm_Hand_IK_JNT bones 1.3-3.3 deg, LeftArm/RightArm only 0.11-0.28 deg, and EVERY
|
|
216
|
+
position channel 0.00 mm; the authored turn inside add_melee_idle was itself only 2.18 deg.
|
|
217
|
+
Status is INFERRED, not verified: both sides are offline per-bone script measurements
|
|
218
|
+
(_encoder_audit.py), not an in-game observation. SCOPE: the damage applies to RE-AUTHORED
|
|
219
|
+
clips only — see cp2077.anims.encoder.damage-scoped-to-reauthored-clips-not-untouched-ones and
|
|
220
|
+
cp2077.anims.encoder.reauthoring-collapses-constant-channels for the mechanism, and
|
|
221
|
+
cp2077.anims.encoder.sway-gunrot-const-fix-verified-in-game for the fix that removes it at
|
|
222
|
+
source."
|