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,176 @@
|
|
|
1
|
+
game: cyberpunk2077
|
|
2
|
+
topic: anims.sets
|
|
3
|
+
title: Player FPP animation sets, mounting and gating
|
|
4
|
+
facts:
|
|
5
|
+
- id: cp2077.anims.sets.vars-are-animwrapper-weights
|
|
6
|
+
claim: The variableNames that gate an animAnimSetupEntry on the player entity are AnimWrapper
|
|
7
|
+
weights, not booleans or TweakDB flags. Raise one from script with
|
|
8
|
+
AnimationControllerComponent.SetAnimWrapperWeight(ent, n"<name>", 1.0) or by sending an
|
|
9
|
+
AnimWrapperWeightSetter event. Custom variable names can be invented; they do not have to
|
|
10
|
+
exist in vanilla.
|
|
11
|
+
status: verified
|
|
12
|
+
source: ModWright field verification
|
|
13
|
+
tags:
|
|
14
|
+
- animation
|
|
15
|
+
- animwrapper
|
|
16
|
+
- anim-set
|
|
17
|
+
- gating
|
|
18
|
+
- player
|
|
19
|
+
- fpp
|
|
20
|
+
- id: cp2077.anims.sets.lower-priority-number-wins
|
|
21
|
+
claim: Between two mounted animation sets, the LOWER priority number wins (pwa_katana at 128 beats
|
|
22
|
+
default_melee_weapon at 200). Sets override each other by shared animation NAMES, not by slot
|
|
23
|
+
or by file.
|
|
24
|
+
status: verified
|
|
25
|
+
source: ModWright field verification
|
|
26
|
+
tags:
|
|
27
|
+
- animation
|
|
28
|
+
- anim-set
|
|
29
|
+
- priority
|
|
30
|
+
- override
|
|
31
|
+
detail: pwa_katana shares 83 of 97 animation names with default_melee_weapon, which is why mounting
|
|
32
|
+
it replaces most of the melee moveset.
|
|
33
|
+
- id: cp2077.anims.sets.patch-the-ep1-player-ent
|
|
34
|
+
claim: With Phantom Liberty installed the game loads
|
|
35
|
+
ep1\characters\entities\player\player_ma/wa_fpp_ep1.ent. The base\ entity is only the no-EP1
|
|
36
|
+
fallback. A patch aimed only at base\ registers successfully and then silently does nothing,
|
|
37
|
+
with NO log line. List BOTH paths so the mod works with and without PL.
|
|
38
|
+
status: verified
|
|
39
|
+
source: ModWright field verification
|
|
40
|
+
tags:
|
|
41
|
+
- ep1
|
|
42
|
+
- phantom-liberty
|
|
43
|
+
- player-entity
|
|
44
|
+
- silent-failure
|
|
45
|
+
- archivexl
|
|
46
|
+
- patch
|
|
47
|
+
supersedes: cp2077.anims.archivexl.resourcepatch-header-issue-retracted
|
|
48
|
+
detail: "Cost a long debug session and two nearly-filed ArchiveXL bug reports - the no-op looks
|
|
49
|
+
exactly like a broken tool. The ep1 template is a standalone 124-component copy, not an
|
|
50
|
+
include. GENERALISES: before blaming a tool for a silent no-op on a vanilla asset, grep
|
|
51
|
+
tools\\redmod\\tweaks for an [ EP1 ] override of that asset. MERGED from two equivalent facts
|
|
52
|
+
(one in the ArchiveXL topic, one in the packaging topic). What they add: the wrong diagnosis
|
|
53
|
+
this replaced was an ArchiveXL bug report claiming ResourcePatch component patches silently
|
|
54
|
+
skip base-game-cooked templates because of an early return when compiledDataHeader.IsEmpty() —
|
|
55
|
+
that draft issue was RETRACTED once the ep1 mistargeting was found
|
|
56
|
+
(cp2077.anims.archivexl.resourcepatch-header-issue-retracted), and no such issue was filed
|
|
57
|
+
upstream. The rule for a manifest is therefore to list BOTH the base\\ and ep1\\ template
|
|
58
|
+
paths for BOTH genders in the same `resource: patch:` block, which is what the shipped .xl
|
|
59
|
+
does, so the mod works with and without Phantom Liberty."
|
|
60
|
+
- id: cp2077.anims.sets.do-not-hot-reload
|
|
61
|
+
claim: .anims content does NOT hot-reload, and swapping an archive underneath a mounted animation
|
|
62
|
+
set CRASHES the game. Animation sets are cached when the set mounts, so a depot swap never
|
|
63
|
+
reaches them. Budget a full relaunch per animation iteration.
|
|
64
|
+
status: verified
|
|
65
|
+
source: ModWright field verification
|
|
66
|
+
tags:
|
|
67
|
+
- animation
|
|
68
|
+
- hot-reload
|
|
69
|
+
- crash
|
|
70
|
+
- redhottools
|
|
71
|
+
- iteration
|
|
72
|
+
detail: A same-name repack with a different donor set was dropped into archive\pc\hot. RedHotTools
|
|
73
|
+
ingested it, the idle stayed on the OLD clips, and forcing a re-resolve by switching weapons
|
|
74
|
+
killed the process. Meshes and textures hot-reload fine; this is specific to anims.
|
|
75
|
+
- id: cp2077.anims.sets.resourcepatch-mounting-route
|
|
76
|
+
claim: An animation set can be mounted by appending a small entAnimationSetupExtensionComponent
|
|
77
|
+
(controlBinding to root) to the player fpp entities via ArchiveXL ResourcePatch.
|
|
78
|
+
MergeComponents matches on name plus id, and no match means append. The .ent carries its own
|
|
79
|
+
variableNames, so gating works with no ArchiveXL fix required.
|
|
80
|
+
status: verified
|
|
81
|
+
verified_on: 1.27.1
|
|
82
|
+
source: ModWright field verification
|
|
83
|
+
tags:
|
|
84
|
+
- archivexl
|
|
85
|
+
- resourcepatch
|
|
86
|
+
- animation
|
|
87
|
+
- anim-set
|
|
88
|
+
- player-entity
|
|
89
|
+
detail: "MERGED from an equivalent fact, which records this as the SHIPPING route on stock ArchiveXL
|
|
90
|
+
1.27.1 with no upstream fix required: the set at mod\\<mod>\\anims\\p[mw]a_<mod>.anims,
|
|
91
|
+
priority 127, gated on w_melee_<mod>, mounted when its wrapper variable was raised, and the
|
|
92
|
+
machete's own anim set was confirmed unchanged in the same session — i.e. per-weapon gating
|
|
93
|
+
worked as intended with zero effect on other weapons. The patch targets are the ep1 player fpp
|
|
94
|
+
.ent files plus the base\\ paths as a no-Phantom-Liberty fallback (see
|
|
95
|
+
cp2077.anims.sets.patch-the-ep1-player-ent)."
|
|
96
|
+
- id: cp2077.anims.sets.archivexl-animations-feature-broken
|
|
97
|
+
claim: 'The ArchiveXL "animations:" .xl feature is broken in versions up to and including 1.27.1:
|
|
98
|
+
vars: are dropped, and the list form of entity: never parses. Until a fix ships, do not use
|
|
99
|
+
"animations:" to mount a weapon-specific set - the dropped vars mount it on every melee
|
|
100
|
+
weapon.'
|
|
101
|
+
status: verified
|
|
102
|
+
verified_on: 1.27.1
|
|
103
|
+
source: ModWright field verification
|
|
104
|
+
tags:
|
|
105
|
+
- archivexl
|
|
106
|
+
- animation
|
|
107
|
+
- anim-set
|
|
108
|
+
- bug
|
|
109
|
+
- upstream
|
|
110
|
+
detail: "The two typos are recorded at mechanism level, one fact each, at
|
|
111
|
+
cp2077.anims.archivexl.animconfig-vars-parser-bug (line 82 tests the SEQUENCE node instead of
|
|
112
|
+
the item, so entry.variables stays empty) and
|
|
113
|
+
cp2077.anims.archivexl.animconfig-entity-list-parser-bug (line 50's `else if` repeats the
|
|
114
|
+
`if`'s IsScalar() test instead of IsSequence(), so the list form of `entity:` never parses and
|
|
115
|
+
the entry is rejected as malformed). Both are present in v1.27.0, v1.27.1 and v1.28.0-beta.1,
|
|
116
|
+
and each fix is one line. MERGED from a third, packaging-side restatement, which adds the
|
|
117
|
+
standing manifest rule this produced: the shipped mod's .archive.xl carries a comment telling
|
|
118
|
+
future editors NOT to switch the mount to the `animations:` feature and to keep the `resource:
|
|
119
|
+
patch:` route, because the .ent's own variableNames field is not subject to the parser bug
|
|
120
|
+
(see cp2077.anims.sets.resourcepatch-mounting-route). Update 2026-09-07: fixed upstream in
|
|
121
|
+
ArchiveXL v1.27.3 (see cp2077.anims.archivexl.pr-merged-upstream); the claim holds for 1.27.1
|
|
122
|
+
and earlier and for 1.28.0-beta.1, which predates the fix."
|
|
123
|
+
- id: cp2077.anims.sets.melee-motion-database-csv
|
|
124
|
+
claim: Melee clip names are NOT composed by an index switch in the animgraph. They come from a
|
|
125
|
+
motion database CSV, base\animations\anim_motion_database\player_melee_attacks.csv (plus _hits
|
|
126
|
+
and _deflects), keyed by (MeleeSlotData.attackType, MeleeSlotData.comboNumber). Row (0,N)
|
|
127
|
+
resolves to combo_attack_0(N+1), (1,N) to heavy_attack_0(N+1), (2,N) to final_attack_0(N+1),
|
|
128
|
+
nine slots per class.
|
|
129
|
+
status: inferred
|
|
130
|
+
source: ModWright research
|
|
131
|
+
tags:
|
|
132
|
+
- animation
|
|
133
|
+
- melee
|
|
134
|
+
- motion-database
|
|
135
|
+
- csv
|
|
136
|
+
- attack
|
|
137
|
+
detail: "The attackType table has 13 rows: 0 __COMBO__, 1 __STRONG__, 2 __FINAL__, 3 __BLOCK__, 4
|
|
138
|
+
__SAFE__, 5 __SLIDE__, 6 __CROUCH__, 7 __JUMP__, 8 __SPRINT__, 9 __FALL__, 10 __THROW__, 11
|
|
139
|
+
__DODGE__, 12 __EQUIP__ (rows 3-12 take comboNumber \"*\"). A custom set that omits a row
|
|
140
|
+
plays ANOTHER WEAPON'S clip rather than failing. Note parried_*, block_deflect_* and
|
|
141
|
+
melee_slide_* are NOT in this table at all - they are animgraph-driven, so grepping the CSV
|
|
142
|
+
does not prove a clip is dead. MERGED from an equivalent fact, which adds: each of the three
|
|
143
|
+
CSVs (player_melee_attacks.csv and its _hits / _deflects siblings) carries 50 rows; the
|
|
144
|
+
__STRONG__ row also maps melee_hack_attack, mantisblade_special_heavy and
|
|
145
|
+
one_punch_heavy_attack; and the \"clip names come from the CSV, not from an index switch in
|
|
146
|
+
the animgraph\" finding was established by TWO independent reachability walks of the
|
|
147
|
+
serialized live Attack pose graph, which refuted an earlier reading of a dead legacy subtree
|
|
148
|
+
(see cp2077.anims.graph.real-swing-ceiling-is-nine-slot-csv)."
|
|
149
|
+
- id: cp2077.anims.sets.weapon-family-set-is-the-fallback
|
|
150
|
+
claim: A clip name that a custom animation set omits falls through to the WEAPON-FAMILY set first,
|
|
151
|
+
not straight to the ungated default. The machete plays pwa_one_handed_blunt.anims at priority
|
|
152
|
+
128, gated on the AnimWrapper variable w_melee_one_hand_blunt, which is the weapon record's
|
|
153
|
+
friendlyName. default_melee_weapon.anims is only the ungated priority-200 fallback.
|
|
154
|
+
status: inferred
|
|
155
|
+
source: ModWright research
|
|
156
|
+
tags:
|
|
157
|
+
- animation
|
|
158
|
+
- anim-set
|
|
159
|
+
- fallback
|
|
160
|
+
- priority
|
|
161
|
+
- melee
|
|
162
|
+
- friendlyname
|
|
163
|
+
supersedes: cp2077.anims.graph.anim-set-gating-variable-is-native-old-belief
|
|
164
|
+
detail: "There is no pwa_machete.anims. Established by reading scripts and records offline rather
|
|
165
|
+
than by an in-engine experiment. MERGED from an equivalent fact, which adds the MECHANISM and
|
|
166
|
+
its moddability: the gating AnimWrapper variable IS the weapon record's own friendlyName
|
|
167
|
+
string field, raised natively via SetAnimWrapperWeight(puppet,
|
|
168
|
+
StringToName(itemRecord.FriendlyName()), value) at inGameMenuGameController.script:637 — so it
|
|
169
|
+
is fully moddable by setting friendlyName on a custom item record in yaml, with no native
|
|
170
|
+
change needed. Confirmed on base_katana.tweak:15, base_knife.tweak:7, base_baton.tweak:9,
|
|
171
|
+
base_two_hand_hammer.tweak:13 and five one-hand-blunt-family bases (all at
|
|
172
|
+
w_melee_one_hand_blunt). This supersedes an earlier project hypothesis that the variable was
|
|
173
|
+
native C++ behaviour with no data lever. See
|
|
174
|
+
cp2077.anims.graph.machete-plays-one-handed-blunt-set for the depot survey ruling out a
|
|
175
|
+
per-weapon machete file, and cp2077.anims.graph.custom-set-mount-priority-competitor for what
|
|
176
|
+
inheriting a base preset's friendlyName costs a custom weapon."
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
game: cyberpunk2077
|
|
2
|
+
topic: archivexl.bodytypes
|
|
3
|
+
title: ArchiveXL body-type tag registration for body mods and refits
|
|
4
|
+
facts:
|
|
5
|
+
- id: cp2077.archivexl.bodytypes.player-bodytypes-key
|
|
6
|
+
claim: "A body mod registers itself with ArchiveXL by putting a `player` top-level key in a `.xl`
|
|
7
|
+
manifest with a `bodyTypes` list of one or more tag names, e.g. `player: { bodyTypes: [
|
|
8
|
+
MyBodyName ] }`; this registration method requires ArchiveXL >= 1.14 (an older, more tedious
|
|
9
|
+
per-appearance method also still works and is documented separately)."
|
|
10
|
+
status: community
|
|
11
|
+
source: 'CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
|
|
12
|
+
for-mod-creators-theory/core-mods-explained/archivexl/archivexl-body-mods-and-refits/README.md,
|
|
13
|
+
sections "Body modders: Adding support" and "1. Registering the body mod"'
|
|
14
|
+
tags:
|
|
15
|
+
- archivexl
|
|
16
|
+
- manifest
|
|
17
|
+
- player
|
|
18
|
+
- bodytypes
|
|
19
|
+
- body-mod
|
|
20
|
+
detail: The page's minimum-required-ArchiveXL-version banner for the page as a whole is 1.5, but the
|
|
21
|
+
`player.bodyTypes` shortcut specifically is called out as "the new method (for version >=
|
|
22
|
+
1.14)"; a scaffold targeting the shortcut key should gate on 1.14, not the page's overall 1.5
|
|
23
|
+
floor.
|
|
24
|
+
related:
|
|
25
|
+
- id: cp2077.clothing.refits.body-mod-version-floor
|
|
26
|
+
detail: 'Agrees, and is the same page read for its version banner alone: that fact records the 1.5
|
|
27
|
+
floor and the ">= 1.14" new-method note; this one records what the new method actually is
|
|
28
|
+
(the `player.bodyTypes` manifest key). Neither number is a game version.'
|
|
29
|
+
- id: cp2077.archivexl.bodytypes.tag-name-becomes-snake-case-substitution
|
|
30
|
+
claim: A body tag registered via `player.bodyTypes` (e.g. `BoobsForBackProblems`) is converted to
|
|
31
|
+
snake_case (`boobs_for_back_problems`) to become the `{body}` substitution value usable in
|
|
32
|
+
dynamic-appearance conditions and path substitutions; if no body mod is installed, `{body}`
|
|
33
|
+
resolves to the literal string `base_body`.
|
|
34
|
+
status: community
|
|
35
|
+
source: 'CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
|
|
36
|
+
for-mod-creators-theory/core-mods-explained/archivexl/archivexl-body-mods-and-refits/README.md,
|
|
37
|
+
section "1. Registering the body mod" (yaml comment) and "Clothing mods: Making use of the
|
|
38
|
+
tags" (`base_body` fallback warning)'
|
|
39
|
+
tags:
|
|
40
|
+
- archivexl
|
|
41
|
+
- body-tag
|
|
42
|
+
- snake_case
|
|
43
|
+
- substitution
|
|
44
|
+
- base_body
|
|
45
|
+
detail: "`base_body` is also the value clothing mods should target for body mods that keep the
|
|
46
|
+
vanilla body shape (the page names EVB and VTK Vanilla HD FemV as examples of vanilla-shaped
|
|
47
|
+
bodies that use `base_body` rather than registering their own tag)."
|
|
48
|
+
- id: cp2077.archivexl.bodytypes.registration-needs-patched-mesh-component-name
|
|
49
|
+
claim: "Registering a body tag also requires patching the player entity: a patch `.ent` containing
|
|
50
|
+
an `entMeshComponent` whose `name` is changed to `Body:<BodyModName>` (e.g. `Body:NewBody`)
|
|
51
|
+
must be registered against the vanilla player entity files via ArchiveXL resource patching
|
|
52
|
+
(`resource.patch`), separately per body gender (`player_wa.ent` / `player_ma.ent` — only the
|
|
53
|
+
relevant gender needs including)."
|
|
54
|
+
status: community
|
|
55
|
+
source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
|
|
56
|
+
for-mod-creators-theory/core-mods-explained/archivexl/archivexl-body-mods-and-refits/README.md,
|
|
57
|
+
sections "2. Patch the player entity files" and "Register the patch .ent"
|
|
58
|
+
tags:
|
|
59
|
+
- archivexl
|
|
60
|
+
- body-tag
|
|
61
|
+
- resource-patch
|
|
62
|
+
- entmeshcomponent
|
|
63
|
+
detail: "RELATED: this is a concrete worked use of cp2077.archivexl.manifest.resource-patch-key
|
|
64
|
+
against the base game's player entity specifically, not an arbitrary mod-owned resource."
|
|
65
|
+
- id: cp2077.archivexl.bodytypes.check-current-body-via-cet
|
|
66
|
+
claim: The currently active body-tag suffix for the local player can be read from CET with
|
|
67
|
+
`Game.GetScriptableSystemsContainer():Get("PuppetStateSystem"):GetBodyTypeSuffix(ItemID.new(),
|
|
68
|
+
GetPlayer(), nil)`; the same `PuppetStateSystem` also exposes `GetArmsStateSuffix` and
|
|
69
|
+
`GetFeetStateSuffix` for the arm-cyberware and foot-state substitutions.
|
|
70
|
+
status: community
|
|
71
|
+
source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
|
|
72
|
+
for-mod-creators-theory/core-mods-explained/archivexl/archivexl-body-mods-and-refits/README.md,
|
|
73
|
+
section "Checking the current body"; and archivexl-suffixes-and-substitutions.md, sections
|
|
74
|
+
"Arm states" and "Foot states"
|
|
75
|
+
tags:
|
|
76
|
+
- archivexl
|
|
77
|
+
- cet
|
|
78
|
+
- puppetstatesystem
|
|
79
|
+
- debugging
|
|
80
|
+
- body
|
|
81
|
+
- arms
|
|
82
|
+
- feet
|
|
83
|
+
- id: cp2077.archivexl.bodytypes.arm-state-table-is-source-checked
|
|
84
|
+
claim: The documented arm-cyberware substitution values (`base_arms`, `mantis_blades`, `monowire`,
|
|
85
|
+
`projectile_launcher`) and foot-state values (`flat`, `lifted`, `high_heels`, `flat_shoes`)
|
|
86
|
+
both carry an explicit note to re-check them against
|
|
87
|
+
`src/App/Extensions/PuppetState/System.cpp` in psiberx/cp2077-archive-xl if they stop working,
|
|
88
|
+
because the wiki table is not guaranteed to track the source.
|
|
89
|
+
status: community
|
|
90
|
+
source: 'CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
|
|
91
|
+
for-mod-creators-theory/core-mods-explained/archivexl/archivexl-suffixes-and-substitutions.md,
|
|
92
|
+
sections "Arm states" (link to src/App/Extensions/PuppetState/System.cpp#L72) and "Foot
|
|
93
|
+
states" (same file #L89), both pinned at psiberx/cp2077-archive-xl commit
|
|
94
|
+
027aab7139689ee8d14163682ab6d506fbccea2a'
|
|
95
|
+
tags:
|
|
96
|
+
- archivexl
|
|
97
|
+
- arms
|
|
98
|
+
- feet
|
|
99
|
+
- source-of-truth
|
|
100
|
+
- staleness
|
|
101
|
+
- id: cp2077.archivexl.bodytypes.male-feet-states-need-a-mod
|
|
102
|
+
claim: Foot-state substitution (flat/lifted/high-heels) is only implemented for the female-rigged
|
|
103
|
+
body by default; male-rigged V has no vanilla foot-state support and needs a body mod or the
|
|
104
|
+
"Toggleable Feet" mod to get one — for male V the foot-state suffix/substitution is documented
|
|
105
|
+
as simply empty.
|
|
106
|
+
status: community
|
|
107
|
+
source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
|
|
108
|
+
for-mod-creators-theory/core-mods-explained/archivexl/archivexl-suffixes-and-substitutions.md,
|
|
109
|
+
section "Foot states" (warning hint and table row "Male / Any / (empty)")
|
|
110
|
+
tags:
|
|
111
|
+
- archivexl
|
|
112
|
+
- feet
|
|
113
|
+
- male
|
|
114
|
+
- gender
|
|
115
|
+
- gap
|
|
116
|
+
- id: cp2077.archivexl.bodytypes.body-support-tag-only-needed-for-nonstandard-shape
|
|
117
|
+
claim: A body mod only needs to register its own ArchiveXL body tag if its mesh shape differs from
|
|
118
|
+
the base game body; a body mod that keeps the vanilla proportions does not need to register a
|
|
119
|
+
tag and clothing should target it as `base_body`.
|
|
120
|
+
status: community
|
|
121
|
+
source: 'CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
|
|
122
|
+
for-mod-creators-theory/core-mods-explained/archivexl/archivexl-body-mods-and-refits/README.md,
|
|
123
|
+
hint under "Body modders: Adding support" ("If your body mod has the same shape as the
|
|
124
|
+
basegame body, you do not need to do this.")'
|
|
125
|
+
tags:
|
|
126
|
+
- archivexl
|
|
127
|
+
- body-tag
|
|
128
|
+
- base_body
|
|
129
|
+
- when-not-needed
|
|
130
|
+
- id: cp2077.archivexl.bodytypes.resource-patch-entry-needs-at-least-one-target
|
|
131
|
+
claim: 'An ArchiveXL manifest resource.patch entry whose target list is empty is rejected at
|
|
132
|
+
extension load: ArchiveXL logs "[error] Line #N: Patch definition must have at least one
|
|
133
|
+
target." for each such entry and then "[warning] Archive extensions are loaded with issues.",
|
|
134
|
+
and the patch .ent attaches to nothing. The rest of the manifest (player bodyTypes,
|
|
135
|
+
localization, factories) still loads.'
|
|
136
|
+
status: verified
|
|
137
|
+
verified_on: "2.31"
|
|
138
|
+
source: ModWright field verification
|
|
139
|
+
tags:
|
|
140
|
+
- archivexl
|
|
141
|
+
- resource-patch
|
|
142
|
+
- manifest
|
|
143
|
+
- body-tag
|
|
144
|
+
- scaffold
|
|
145
|
+
- lint
|
|
146
|
+
detail: The new-garment-refit scaffold emitted the empty lists until this run; it now names the base
|
|
147
|
+
+ ep1 player FPP entity per gender, and cp2077.history.xl-manifest-lint warns on an empty
|
|
148
|
+
target list. Which player entities a body-mesh patch must target for third-person visibility
|
|
149
|
+
(player_XX_tpp.ent exists in the vanilla index) is not yet observed.
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
game: cyberpunk2077
|
|
2
|
+
topic: archivexl.dynamic-appearances
|
|
3
|
+
title: ArchiveXL dynamic appearances — conditions, substitutions and their placeholders
|
|
4
|
+
facts:
|
|
5
|
+
- id: cp2077.archivexl.dynamic-appearances.introduced-in-1.5.0
|
|
6
|
+
claim: ArchiveXL's dynamic appearances feature (rule-based selection of components and appearances,
|
|
7
|
+
replacing hand-multiplied suffix combinations) was introduced in ArchiveXL version 1.5.0.
|
|
8
|
+
status: verified
|
|
9
|
+
source: psiberx/cp2077-archive-xl@7988eb5, `git ls-tree v1.4.1` vs `v1.5.0`
|
|
10
|
+
(src/App/Extensions/GarmentOverride/Dynamic.{cpp,hpp} first appear at v1.5.0, defining
|
|
11
|
+
DynamicAppearanceTag, VariantMarker '!', ConditionMarker '&', DynamicValueMarker '*' and the
|
|
12
|
+
gender/camera/body/feet attributes); CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
|
|
13
|
+
for-mod-creators-theory/core-mods-explained/archivexl/README.md, section "Dynamic appearances"
|
|
14
|
+
("Version 1.5.0 of ArchiveXL solves this problem by introducing dynamic variants")
|
|
15
|
+
tags:
|
|
16
|
+
- archivexl
|
|
17
|
+
- dynamic-appearances
|
|
18
|
+
- version-floor
|
|
19
|
+
detail: "Checked against the source (2026-09-08): this contradicted the existing
|
|
20
|
+
cp2077.clothing.garments.dynamic-appearance-version-floors, which said dynamic variants were
|
|
21
|
+
\"added in 1.13\" on the strength of one sentence in the dynamic-variants guide. The guide's
|
|
22
|
+
own Prerequisites section says ArchiveXL >= 1.5.0, and the repository's tags confirm 1.5.0, so
|
|
23
|
+
that fact is now contradicted and this one supersedes it. No `verified_on`: the source names
|
|
24
|
+
an ArchiveXL version, not a game build."
|
|
25
|
+
- id: cp2077.archivexl.dynamic-appearances.substitutions-since-1.8.0
|
|
26
|
+
claim: Path/name substitutions for dynamic appearances (the `{placeholder}` interpolation syntax)
|
|
27
|
+
were added in ArchiveXL 1.8.0, three minor versions after dynamic appearances themselves
|
|
28
|
+
(1.5.0); conditions and substitutions are documented as two related but separately-versioned
|
|
29
|
+
capabilities.
|
|
30
|
+
status: community
|
|
31
|
+
source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
|
|
32
|
+
for-mod-creators-theory/core-mods-explained/archivexl/archivexl-suffixes-and-substitutions.md,
|
|
33
|
+
section "Which substitutions exist?" ("Since 1.8.0, ArchiveXL supports substitutions for
|
|
34
|
+
dynamic-appearances")
|
|
35
|
+
tags:
|
|
36
|
+
- archivexl
|
|
37
|
+
- dynamic-appearances
|
|
38
|
+
- substitution
|
|
39
|
+
- version-floor
|
|
40
|
+
detail: "RELATED: sharpens cp2077.archivexl.dynamic-appearances.introduced-in-1.5.0 — a project
|
|
41
|
+
whose ArchiveXL floor is 1.5.x-1.7.x can use conditions but not substitutions."
|
|
42
|
+
- id: cp2077.archivexl.dynamic-appearances.substitution-requires-leading-asterisk
|
|
43
|
+
claim: A field value that should be interpolated as a dynamic-appearance substitution (in a mesh
|
|
44
|
+
entity component's `name`, `depotPath` or `appearance`, or an `.app` appearance's `name`) only
|
|
45
|
+
activates interpolation if the string starts with an asterisk (`*`); without the leading `*`,
|
|
46
|
+
`{placeholder}` text is treated as a literal string.
|
|
47
|
+
status: community
|
|
48
|
+
source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
|
|
49
|
+
for-mod-creators-theory/core-mods-explained/archivexl/archivexl-suffixes-and-substitutions.md,
|
|
50
|
+
section "Which substitutions exist?"
|
|
51
|
+
tags:
|
|
52
|
+
- archivexl
|
|
53
|
+
- substitution
|
|
54
|
+
- syntax
|
|
55
|
+
- gotcha
|
|
56
|
+
detail: A validator that greps for `{gender}`/`{body}`/etc. in a resource field should also check
|
|
57
|
+
the field starts with `*`, since a substitution-looking string without the prefix silently
|
|
58
|
+
does not substitute.
|
|
59
|
+
- id: cp2077.archivexl.dynamic-appearances.placeholder-table
|
|
60
|
+
claim: "The page's placeholder table lists eight substitutions: `{camera}` (`fpp`/`tpp`), `{gender}`
|
|
61
|
+
(`m`/`w`), `{body}` (`base_body` or the registered body-mod tag in snake_case), `{arms}`
|
|
62
|
+
(`base_arms`, `mantis_blades`, `monowire`, `projectile_launcher`), `{feet}` (`flat`, `lifted`,
|
|
63
|
+
`high_heels`, `flat_shoes`, empty for male-rigged V), `{sleeves}` (`full`, `part`),
|
|
64
|
+
`{skin_color}` (the skin-tone appearance name from customization, e.g. `03_senna`) and
|
|
65
|
+
`{hair_color}` (the hair-colour name, e.g. `black_liquorice`)."
|
|
66
|
+
status: community
|
|
67
|
+
source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
|
|
68
|
+
for-mod-creators-theory/core-mods-explained/archivexl/archivexl-suffixes-and-substitutions.md,
|
|
69
|
+
section "Which substitutions exist?" (placeholder table)
|
|
70
|
+
tags:
|
|
71
|
+
- archivexl
|
|
72
|
+
- substitution
|
|
73
|
+
- placeholder
|
|
74
|
+
- gender
|
|
75
|
+
- body
|
|
76
|
+
- arms
|
|
77
|
+
- feet
|
|
78
|
+
detail: "The page warns this table can go stale and points to the source of truth:
|
|
79
|
+
`src/App/Extensions/GarmentOverride/Dynamic.cpp#L29` in psiberx/cp2077-archive-xl (not re-read
|
|
80
|
+
line-by-line for this fact — only the wiki table was transcribed). Checked against the source
|
|
81
|
+
(2026-09-08): an earlier wording listed only the first five placeholders as though the table
|
|
82
|
+
were complete; `{sleeves}`, `{skin_color}` and `{hair_color}` are in the same table and have
|
|
83
|
+
been added."
|
|
84
|
+
- id: cp2077.archivexl.dynamic-appearances.unresolvable-placeholder-falls-back
|
|
85
|
+
claim: If a `@context`-defined substitution placeholder cannot be resolved for a given mesh (e.g. a
|
|
86
|
+
custom `GlobalNormal` parameter defined on one patched mesh but not on another), ArchiveXL
|
|
87
|
+
ignores the unresolved placeholder and falls back to the base material's own value for that
|
|
88
|
+
parameter, rather than failing to load.
|
|
89
|
+
status: community
|
|
90
|
+
source: 'CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
|
|
91
|
+
for-mod-creators-theory/core-mods-explained/archivexl/archivexl-resource-patching/README.md,
|
|
92
|
+
section "Partial templates: @Context"'
|
|
93
|
+
tags:
|
|
94
|
+
- archivexl
|
|
95
|
+
- substitution
|
|
96
|
+
- fallback
|
|
97
|
+
- failure-mode
|
|
98
|
+
- id: cp2077.archivexl.dynamic-appearances.appearance-conditions-two-locations
|
|
99
|
+
claim: "Dynamic-appearance conditions (e.g. `&camera=fpp`, `&gender=w`) can be written in exactly
|
|
100
|
+
two places: the `name` field of an `appearanceAppearanceDefinition` inside a `.app` file, and
|
|
101
|
+
the `name` field of a component inside a `mesh_entity.ent` file; using gendered per-component
|
|
102
|
+
conditions in the mesh entity is called out as generally worse practice than gendered whole
|
|
103
|
+
appearances, because components for the inactive gender are still added to the entity."
|
|
104
|
+
status: community
|
|
105
|
+
source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
|
|
106
|
+
for-mod-creators-theory/core-mods-explained/archivexl/archivexl-suffixes-and-substitutions.md,
|
|
107
|
+
section "Conditions"
|
|
108
|
+
tags:
|
|
109
|
+
- archivexl
|
|
110
|
+
- condition
|
|
111
|
+
- .app
|
|
112
|
+
- mesh_entity
|
|
113
|
+
- performance
|
|
114
|
+
- id: cp2077.archivexl.dynamic-appearances.appearance-name-truncated-at-variant-separator
|
|
115
|
+
claim: When using dynamic appearances, the `appearanceName` a mod's `.yaml` entry gives is matched
|
|
116
|
+
against the root entity's appearance `name` only up to the first `!` (the "variant
|
|
117
|
+
separator"); everything after `!` is the dynamic-appearance condition/substitution suffix that
|
|
118
|
+
ArchiveXL resolves itself, not part of the name TweakXL's yaml needs to match.
|
|
119
|
+
status: community
|
|
120
|
+
source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
|
|
121
|
+
modding-guides/items-equipment/adding-new-items/archive-xl-item-structure-explained.md, hint
|
|
122
|
+
under "root_entity.ent" ("must match the field `appearanceName` in the `.yaml` up to the
|
|
123
|
+
variant separator `!`")
|
|
124
|
+
tags:
|
|
125
|
+
- archivexl
|
|
126
|
+
- dynamic-appearances
|
|
127
|
+
- root-entity
|
|
128
|
+
- appearancename
|
|
129
|
+
detail: "RELATED: the `!` variant separator is a different delimiter from the `&` used for legacy
|
|
130
|
+
suffixes and for dynamic conditions; the suffixes-and-substitutions page's
|
|
131
|
+
substitution-load-order table shows both in one name (`my_item!variant&camera=tpp`), so `!`
|
|
132
|
+
and `&` are not interchangeable spellings of one mechanism. See
|
|
133
|
+
cp2077.archivexl.dynamic-appearances.legacy-suffix-still-first-match for the legacy suffix
|
|
134
|
+
system itself."
|
|
135
|
+
- id: cp2077.archivexl.dynamic-appearances.legacy-suffix-still-first-match
|
|
136
|
+
claim: "Before ArchiveXL 1.5, conditional appearance selection used only suffixes: for N independent
|
|
137
|
+
suffix axes (gender, camera, ...) the root entity needed 2^N appearance entries (one per
|
|
138
|
+
combination); the page's own worked example describes going from 96 suffix-based entries in
|
|
139
|
+
one root entity down to 9 after moving to dynamic appearances."
|
|
140
|
+
status: community
|
|
141
|
+
source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
|
|
142
|
+
for-mod-creators-theory/core-mods-explained/archivexl/archivexl-suffixes-and-substitutions.md,
|
|
143
|
+
section "Why are suffixes?"
|
|
144
|
+
tags:
|
|
145
|
+
- archivexl
|
|
146
|
+
- suffix
|
|
147
|
+
- legacy
|
|
148
|
+
- root-entity
|
|
149
|
+
- id: cp2077.archivexl.dynamic-appearances.suffix-load-order-most-specific-wins
|
|
150
|
+
claim: "The documented suffix load order for a legacy (pre-1.5, non-dynamic) suffixed appearance
|
|
151
|
+
name is two steps: the base appearance name (with no suffix) first, then \"the most specific
|
|
152
|
+
suffix collection it can find\" — a less specific match that exists is ignored when a more
|
|
153
|
+
specific one also exists (the page's worked example marks the bare name and
|
|
154
|
+
`appearance_&Female` as \"ignored: a better match exists\")."
|
|
155
|
+
status: community
|
|
156
|
+
source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
|
|
157
|
+
for-mod-creators-theory/core-mods-explained/archivexl/archivexl-suffixes-and-substitutions.md,
|
|
158
|
+
section "Suffix load order" (worked example table)
|
|
159
|
+
tags:
|
|
160
|
+
- archivexl
|
|
161
|
+
- suffix
|
|
162
|
+
- load-order
|
|
163
|
+
- appearance-resolution
|
|
164
|
+
detail: 'Checked against the source (2026-09-08): an earlier wording said the game "searches suffix
|
|
165
|
+
combinations from least to most specific". The page states only which entry wins, not the
|
|
166
|
+
order in which candidates are tried; that search-order detail is removed.'
|
|
167
|
+
- id: cp2077.archivexl.dynamic-appearances.disable-suffixes-empty-array
|
|
168
|
+
claim: "Setting `appearanceSuffixes: []` in a TweakXL yaml item entry is the documented way to
|
|
169
|
+
disable suffixes for that item."
|
|
170
|
+
status: community
|
|
171
|
+
source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
|
|
172
|
+
for-mod-creators-theory/core-mods-explained/archivexl/archivexl-suffixes-and-substitutions.md,
|
|
173
|
+
section "Disabling Suffixes"
|
|
174
|
+
tags:
|
|
175
|
+
- archivexl
|
|
176
|
+
- suffix
|
|
177
|
+
- appearancesuffixes
|
|
178
|
+
- yaml
|
|
179
|
+
- id: cp2077.archivexl.dynamic-appearances.app-condition-variables-since-1.4.0
|
|
180
|
+
claim: For ArchiveXL >= 1.4.0, an `.app` file's appearance overrides can use the interpolation
|
|
181
|
+
variables `{gender}` (m/w), `{skin_color}` (skin tone appearance name) and `{hair_color}`
|
|
182
|
+
(hair color appearance name) inside the `meshAppearance` field.
|
|
183
|
+
status: community
|
|
184
|
+
source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
|
|
185
|
+
modding-guides/items-equipment/adding-new-items/archive-xl-item-structure-explained.md,
|
|
186
|
+
section "appearance.app" (variable table, citing ArchiveXL release tag v1.4.0-rc2)
|
|
187
|
+
tags:
|
|
188
|
+
- archivexl
|
|
189
|
+
- dynamic-appearances
|
|
190
|
+
- .app
|
|
191
|
+
- meshappearance
|
|
192
|
+
- version-floor
|
|
193
|
+
detail: "RELATED: this predates dynamic appearances proper
|
|
194
|
+
(cp2077.archivexl.dynamic-appearances.introduced-in-1.5.0 puts that at 1.5.0), so
|
|
195
|
+
`meshAppearance` interpolation was available slightly earlier than full condition/substitution
|
|
196
|
+
support."
|
|
197
|
+
- id: cp2077.archivexl.dynamic-appearances.camera-perspective-helpers
|
|
198
|
+
claim: "ArchiveXL 1.27.1 ships two redscript helpers in module ArchiveXL.DynamicAppearance:
|
|
199
|
+
ConvertAppearanceNameToTPP(app) and ConvertAppearanceNameToFPP(app). A plain appearance name
|
|
200
|
+
gets the substring &FPP swapped for &TPP, or back. A dynamic appearance (one with '!') gets
|
|
201
|
+
its 'camera' condition set to tpp or fpp through OverrideDynamicAppearanceCondition. The
|
|
202
|
+
static natives ArchiveXL.DisableGarmentOffsets() and EnableGarmentOffsets() switch the garment
|
|
203
|
+
offsets. A third-person mod (Immersive Third Person 1.3.0) shows V's clothes whole in third
|
|
204
|
+
person this way: it converts each equipped area's current appearance and applies it with
|
|
205
|
+
TransactionSystem.ChangeItemAppearanceByName, with the garment offsets off while in third
|
|
206
|
+
person."
|
|
207
|
+
status: verified
|
|
208
|
+
source: <install>\red4ext\plugins\ArchiveXL\Scripts\ArchiveXL.DynamicAppearance.reds (lines 4-60)
|
|
209
|
+
and ArchiveXL.Global.reds (DisableGarmentOffsets); Immersive Third Person 1.3.0
|
|
210
|
+
r6\scripts\immersive_third_person\tpp_camera_bridge.reds (ApplyArea,
|
|
211
|
+
ApplyGarmentOffsetsForPerspective, ApplyVisibleRenderPerspective)
|
|
212
|
+
tags:
|
|
213
|
+
- archivexl
|
|
214
|
+
- dynamic-appearance
|
|
215
|
+
- camera
|
|
216
|
+
- tpp
|
|
217
|
+
- fpp
|
|
218
|
+
- garment
|