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,166 @@
|
|
|
1
|
+
game: cyberpunk2077
|
|
2
|
+
topic: entities.appearance
|
|
3
|
+
title: Entity and appearance files structure, resolution, and inheritance
|
|
4
|
+
facts:
|
|
5
|
+
- id: cp2077.entities.entity-appearance-chain
|
|
6
|
+
claim: An entity file (.ent) references an appearance file (.app) via the appearance field; the
|
|
7
|
+
appearance file defines the submesh layout and material assignments for a given entity
|
|
8
|
+
appearance, while the entity file contains the interaction chunk and properties.
|
|
9
|
+
status: inferred
|
|
10
|
+
source: ModWright research
|
|
11
|
+
tags:
|
|
12
|
+
- entity
|
|
13
|
+
- appearance
|
|
14
|
+
- file-structure
|
|
15
|
+
- separation
|
|
16
|
+
detail: cache_case.ent points at cache_case.app through appearanceResource.DepotPath, with
|
|
17
|
+
appearanceName/name/defaultAppearance all "default". The loot properties (lootTables,
|
|
18
|
+
contentAssignment, lootQuality, displayName) are set on the .ent's entity data, not in the
|
|
19
|
+
.app.
|
|
20
|
+
- id: cp2077.entities.appearance-submesh-references
|
|
21
|
+
claim: An appearance file (.app) contains appearances with submesh element references, each pointing
|
|
22
|
+
to a mesh file path via a slotName; changing which mesh loads for a slot is done in the .app
|
|
23
|
+
file, not the mesh file.
|
|
24
|
+
status: inferred
|
|
25
|
+
source: ModWright research
|
|
26
|
+
tags:
|
|
27
|
+
- appearance
|
|
28
|
+
- mesh
|
|
29
|
+
- submesh
|
|
30
|
+
- slot
|
|
31
|
+
- component
|
|
32
|
+
detail: "The unit is a named component, not a \"slotName\": cache_case.app's default appearance
|
|
33
|
+
holds entPhysicalMeshComponent entries named lid, box and handle, each with mesh.DepotPath and
|
|
34
|
+
meshAppearance. The build script repoints lid -> mod\\<mod>\\meshes\\cache_case_top.mesh and
|
|
35
|
+
box -> mod\\<mod>\\meshes\\cache_case_bottom.mesh and clones box into a handle component
|
|
36
|
+
pointing at the vanilla q000__gun_suitcase_handle.mesh."
|
|
37
|
+
- id: cp2077.entities.appearance-material-assignments
|
|
38
|
+
claim: Appearance files can assign materials to submeshes either by external reference
|
|
39
|
+
(preloadExternalMaterials) or by local instance (preloadLocalMaterialInstances); external
|
|
40
|
+
materials must be loaded from a donor mesh, while locals are editable per appearance.
|
|
41
|
+
status: verified
|
|
42
|
+
source: ModWright field verification
|
|
43
|
+
tags:
|
|
44
|
+
- appearance
|
|
45
|
+
- material
|
|
46
|
+
- external
|
|
47
|
+
- local
|
|
48
|
+
- assignment
|
|
49
|
+
- cooked
|
|
50
|
+
detail: "The trap the lesson records is the field name: a cooked mesh ignores externalMaterials and
|
|
51
|
+
reads preloadExternalMaterials. Editable local instances live in
|
|
52
|
+
preloadLocalMaterialInstances. Learned while editing the case and weapon meshes. This is a
|
|
53
|
+
CR2W/WolvenKit-side observation, so the in-game verified_on/verified_by that were on it have
|
|
54
|
+
been removed."
|
|
55
|
+
- id: cp2077.entities.entity-appearance-factory-resolution
|
|
56
|
+
claim: Weapon appearance resolution uses weapon record appearance-resource-name field + archivexl
|
|
57
|
+
factory csv to locate the .app file; the factory maps appearance name strings to absolute mesh
|
|
58
|
+
file paths, not through the entity system.
|
|
59
|
+
status: verified
|
|
60
|
+
verified_on: "2.31"
|
|
61
|
+
source: ModWright field verification
|
|
62
|
+
tags:
|
|
63
|
+
- appearance
|
|
64
|
+
- factory
|
|
65
|
+
- resolution
|
|
66
|
+
- weapon
|
|
67
|
+
- tweakdb
|
|
68
|
+
detail: "The field is spelled appearanceResourceName. factory_parts.csv has columns name,path,shared
|
|
69
|
+
and two rows: <mod>_body -> mod\\<mod>\\<mod>_body.app and <Mod>_Weapon ->
|
|
70
|
+
mod\\<mod>\\<mod>_weapon.app. It maps to .app resources, not to mesh paths; the .app then
|
|
71
|
+
names the meshes."
|
|
72
|
+
- id: cp2077.entities.world-node-position-coordinates
|
|
73
|
+
claim: World entity node positions are specified as X, Y, Z coordinates in the sector json nodedata;
|
|
74
|
+
positions are in absolute world units and can be adjusted in build scripts before
|
|
75
|
+
reserializing.
|
|
76
|
+
status: inferred
|
|
77
|
+
source: ModWright research
|
|
78
|
+
tags:
|
|
79
|
+
- sector
|
|
80
|
+
- node
|
|
81
|
+
- position
|
|
82
|
+
- coordinate
|
|
83
|
+
- world
|
|
84
|
+
detail: "Three different positions appear in the sources and must not be conflated: (-838.7, 324.8,
|
|
85
|
+
7.9) was the hand-authored guess in the abandoned build; the entSpawner export gave the user's
|
|
86
|
+
in-game placement (-835.758, 328.628, 7.884), which the sector-building script adopted; and
|
|
87
|
+
the shipped mod sits at the old Malorian factory site on the City Center NE waterfront, which
|
|
88
|
+
the mod's README \"Features\" gives as approximately (-836, 329). Its notes add \"Moving the
|
|
89
|
+
case now = edit X/Y/Z in the sector build script -> rebuild -> repack\"."
|
|
90
|
+
- id: cp2077.entities.world-node-rotation-quaternion
|
|
91
|
+
claim: World entity node rotation is specified as a quaternion (k, r, x, y, z values) in the sector
|
|
92
|
+
json nodedata; the quaternion represents the full 3D rotation and can be adjusted if mesh
|
|
93
|
+
orientation needs changes.
|
|
94
|
+
status: inferred
|
|
95
|
+
source: ModWright research
|
|
96
|
+
tags:
|
|
97
|
+
- sector
|
|
98
|
+
- node
|
|
99
|
+
- rotation
|
|
100
|
+
- quaternion
|
|
101
|
+
- orientation
|
|
102
|
+
detail: The components are named i, j, k, r (not x, y, z, w). The entSpawner export's placement was
|
|
103
|
+
i 0, j 0, k 0.75298953056335, r 0.6580325961113. The mod's polish list mentions rotating via
|
|
104
|
+
the Orientation quaternion in the sector build script "if it clips the wall", so the shipped
|
|
105
|
+
orientation may differ from the export's.
|
|
106
|
+
- id: cp2077.entities.case-open-is-entity-state
|
|
107
|
+
claim: The Malorian cache case rendering open in game means the entity is in an open state, so the
|
|
108
|
+
fix belongs in the entity's animation or state (the animator).
|
|
109
|
+
status: contradicted
|
|
110
|
+
source: ModWright research
|
|
111
|
+
tags:
|
|
112
|
+
- animator
|
|
113
|
+
- case
|
|
114
|
+
- pose
|
|
115
|
+
- state
|
|
116
|
+
- retracted
|
|
117
|
+
- debugging
|
|
118
|
+
detail: Several rounds of debugging chased an entity-state bug that did not exist. The meshes ship
|
|
119
|
+
authored open, exterior-up. Superseded by cp2077.process.case-pose-vs-state-lesson.
|
|
120
|
+
- id: cp2077.entities.animator-removed-case-closed
|
|
121
|
+
claim: A gameTransformAnimatorComponent that was originally authored for an entity can be removed
|
|
122
|
+
from the entity file to disable its animation; removing TransformAnimator from a case entity
|
|
123
|
+
keeps it permanently closed.
|
|
124
|
+
status: contradicted
|
|
125
|
+
source: ModWright research
|
|
126
|
+
tags:
|
|
127
|
+
- animator
|
|
128
|
+
- entity
|
|
129
|
+
- animation
|
|
130
|
+
- removal
|
|
131
|
+
- retracted
|
|
132
|
+
detail: Removing the animator was the interim architecture while the lid was mis-posed; the shipped
|
|
133
|
+
v1.0.0 case animates open again, so the removal did not survive. Superseded by
|
|
134
|
+
cp2077.entities.transform-animator-open-anim.
|
|
135
|
+
- id: cp2077.entities.transform-animator-open-anim
|
|
136
|
+
claim: A gameTransformAnimatorComponent can define an animation name (e.g., "open") that drives
|
|
137
|
+
position/rotation transforms; the animator component contains the animation name and execution
|
|
138
|
+
parameters.
|
|
139
|
+
status: verified
|
|
140
|
+
verified_on: "2.31"
|
|
141
|
+
source: ModWright field verification
|
|
142
|
+
tags:
|
|
143
|
+
- animator
|
|
144
|
+
- animation
|
|
145
|
+
- transform
|
|
146
|
+
- open
|
|
147
|
+
supersedes: cp2077.entities.animator-removed-case-closed
|
|
148
|
+
detail: The animation is named "Open" (capital O in the source). Getting it right needed the pivot
|
|
149
|
+
at the lid's measured back-bottom edge, sunk about 1cm into the rim so the closed pose shows
|
|
150
|
+
no gap.
|
|
151
|
+
- id: cp2077.entities.streaming-box-field
|
|
152
|
+
claim: Sector node nodedata includes a streamingBox field that defines the bounding box for
|
|
153
|
+
streaming distance calculations; correct streamingBox values ensure entities load/unload at
|
|
154
|
+
appropriate distances.
|
|
155
|
+
status: inferred
|
|
156
|
+
source: ModWright research
|
|
157
|
+
tags:
|
|
158
|
+
- streaming
|
|
159
|
+
- box
|
|
160
|
+
- distance
|
|
161
|
+
- nodedata
|
|
162
|
+
- descriptor
|
|
163
|
+
detail: 'streamingBox sits on the streamingblock DESCRIPTOR, not on nodeData: the sector-building
|
|
164
|
+
script sets desc["streamingBox"] to a Box built from BOX_MIN/BOX_MAX, a 300m cube centred on
|
|
165
|
+
the placement. The per-node nodeData entry has its own Bounds plus MaxStreamingDistance. The
|
|
166
|
+
values came from the entSpawner export.'
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
game: cyberpunk2077
|
|
2
|
+
topic: equipmentex.slots
|
|
3
|
+
title: Equipment-EX outfit slot system
|
|
4
|
+
facts:
|
|
5
|
+
- id: cp2077.equipment-ex.slots.version-floors
|
|
6
|
+
claim: Equipment-EX's stated requirements are Cyberpunk 2077 2.2, ArchiveXL 1.18.0+, TweakXL
|
|
7
|
+
1.10.4+, Codeware 1.13.0+ and redscript 0.5.25+.
|
|
8
|
+
status: community
|
|
9
|
+
source: cp2077-equipment-ex README.md, section "Getting Started > Requirements"
|
|
10
|
+
tags:
|
|
11
|
+
- equipment-ex
|
|
12
|
+
- version-floor
|
|
13
|
+
- archivexl
|
|
14
|
+
- tweakxl
|
|
15
|
+
- codeware
|
|
16
|
+
- redscript
|
|
17
|
+
detail: Re-verified against the README on the master branch (there is no main branch) on 2026-09-07.
|
|
18
|
+
The framework floors are on their own numbering and stay in the claim; "Cyberpunk 2077 2.2" is
|
|
19
|
+
the game's marketing version, and is what this Equipment-EX release targets rather than a
|
|
20
|
+
version this fact was observed on, so it is not a `verified_on`.
|
|
21
|
+
- id: cp2077.equipment-ex.slots.placementslots-append-syntax
|
|
22
|
+
claim: "\"Any item can support one base slot and one outfit slot at the same time.\" The outfit slot
|
|
23
|
+
is added to `placementSlots` after the base slot with TweakXL's `!append`, e.g.
|
|
24
|
+
`placementSlots: - !append OutfitSlots.NecklaceShort` on an item whose `$base` is
|
|
25
|
+
`Items.GenericHeadClothing`; the README shows this as equivalent to spelling out `-
|
|
26
|
+
AttachmentSlots.Head` and `- OutfitSlots.NecklaceShort`."
|
|
27
|
+
status: community
|
|
28
|
+
source: cp2077-equipment-ex README.md, section "Documentation > Compatible items"
|
|
29
|
+
tags:
|
|
30
|
+
- equipment-ex
|
|
31
|
+
- placementslots
|
|
32
|
+
- append
|
|
33
|
+
- syntax
|
|
34
|
+
- tweakxl
|
|
35
|
+
- id: cp2077.equipment-ex.slots.outfit-slot-is-additive-not-required
|
|
36
|
+
claim: "\"If user doesn't have Equipment-EX installed, the item will still work with the base slot\"
|
|
37
|
+
— appending an OutfitSlots entry is therefore safe to ship unconditionally rather than as a
|
|
38
|
+
hard dependency."
|
|
39
|
+
status: community
|
|
40
|
+
source: cp2077-equipment-ex README.md, section "Documentation > Compatible items"
|
|
41
|
+
tags:
|
|
42
|
+
- equipment-ex
|
|
43
|
+
- placementslots
|
|
44
|
+
- compatibility
|
|
45
|
+
- optional-dependency
|
|
46
|
+
detail: The README states the fallback behaviour but not that the extra entry is "inert"; that word
|
|
47
|
+
was trimmed on 2026-09-07.
|
|
48
|
+
- id: cp2077.equipment-ex.slots.torso-layer-names
|
|
49
|
+
claim: Torso outfit slots, in the README's table order, are `OutfitSlots.TorsoUnder` (Bras, Tight
|
|
50
|
+
Long-sleeves), `TorsoInner` (Tops, T-Shirts, Tight Shirts, Tight Dresses), `TorsoMiddle`
|
|
51
|
+
(Waistcoats, Blazers, Loose Shirts, Loose Dresses), `TorsoOuter` (Jackets, Coats) and
|
|
52
|
+
`TorsoAux` (Vests, Harnesses, Puffers).
|
|
53
|
+
status: community
|
|
54
|
+
source: cp2077-equipment-ex README.md, section "Documentation > Outfit slots"
|
|
55
|
+
tags:
|
|
56
|
+
- equipment-ex
|
|
57
|
+
- outfitslots
|
|
58
|
+
- torso
|
|
59
|
+
- naming
|
|
60
|
+
- slot-table
|
|
61
|
+
detail: 'Corrected 2026-09-07: the README describes `TorsoAux` only by purpose; the previous claim
|
|
62
|
+
that it "stacks independently of the four" is not stated there.'
|
|
63
|
+
- id: cp2077.equipment-ex.slots.legs-and-body-layer-names
|
|
64
|
+
claim: "Leg outfit slots are `OutfitSlots.LegsInner` (Tights, Leggings), `LegsMiddle` (Tight Pants,
|
|
65
|
+
Tight Shorts) and `LegsOuter` (Loose Pants, Loose Shorts, Skirts). A parallel whole-body stack
|
|
66
|
+
exists: `OutfitSlots.BodyUnder` (Netrunning Suits), `BodyInner` (no purpose listed),
|
|
67
|
+
`BodyMiddle` (Jumpsuits, Tracksuits), `BodyOuter` (no purpose listed)."
|
|
68
|
+
status: community
|
|
69
|
+
source: cp2077-equipment-ex README.md, section "Documentation > Outfit slots"
|
|
70
|
+
tags:
|
|
71
|
+
- equipment-ex
|
|
72
|
+
- outfitslots
|
|
73
|
+
- legs
|
|
74
|
+
- body
|
|
75
|
+
- naming
|
|
76
|
+
- slot-table
|
|
77
|
+
- id: cp2077.equipment-ex.slots.paired-left-right-naming
|
|
78
|
+
claim: "Symmetric body parts get explicit Left/Right slot pairs: `OutfitSlots.EarLeft`/`EarRight`,
|
|
79
|
+
`EyeLeft`/`EyeRight`, `ShoulderLeft`/`ShoulderRight`, `ElbowLeft`/`ElbowRight`,
|
|
80
|
+
`WristLeft`/`WristRight`, `HandLeft`/`HandRight`, `FingersLeft`/`FingersRight`,
|
|
81
|
+
`FingernailsLeft`/`FingernailsRight`, `ThighLeft`/`ThighRight`, `KneeLeft`/`KneeRight`,
|
|
82
|
+
`AnkleLeft`/`AnkleRight`, `ToesLeft`/`ToesRight`, `ToenailsLeft`/`ToenailsRight`,
|
|
83
|
+
`HandPropLeft`/`HandPropRight` (props for photo mode). Eyes and hands ALSO have a shared slot
|
|
84
|
+
alongside the pair — `OutfitSlots.Eyes` and `OutfitSlots.Hands`."
|
|
85
|
+
status: community
|
|
86
|
+
source: cp2077-equipment-ex README.md, section "Documentation > Outfit slots"
|
|
87
|
+
tags:
|
|
88
|
+
- equipment-ex
|
|
89
|
+
- outfitslots
|
|
90
|
+
- naming
|
|
91
|
+
- left-right
|
|
92
|
+
- slot-table
|
|
93
|
+
detail: "Corrected 2026-09-07: the previous claim said symmetric parts are split \"rather than one
|
|
94
|
+
shared slot\", which the README's own `OutfitSlots.Eyes` and `OutfitSlots.Hands` rows
|
|
95
|
+
contradict."
|
|
96
|
+
- id: cp2077.equipment-ex.slots.auto-conversion-table
|
|
97
|
+
claim: "An item that specifies no outfit slot is auto-assigned one from its base record:
|
|
98
|
+
`Items.GenericHeadClothing` -> `OutfitSlots.Head`, `Items.Glasses` -> `OutfitSlots.Glasses`,
|
|
99
|
+
`Items.Visor` -> `OutfitSlots.Glasses`, `Items.GenericFaceClothing` -> `OutfitSlots.Mask`,
|
|
100
|
+
`Items.GenericInnerChestClothing` -> `OutfitSlots.TorsoInner`,
|
|
101
|
+
`Items.GenericOuterChestClothing` -> `OutfitSlots.TorsoOuter`, `Items.GenericLegClothing` ->
|
|
102
|
+
`OutfitSlots.LegsMiddle`, `Items.Skirt` -> `OutfitSlots.LegsOuter`,
|
|
103
|
+
`Items.GenericFootClothing` -> `OutfitSlots.Feet`, `Items.Outfit` ->
|
|
104
|
+
`OutfitSlots.BodyMiddle`."
|
|
105
|
+
status: community
|
|
106
|
+
source: cp2077-equipment-ex README.md, section "Documentation > Auto conversions"
|
|
107
|
+
tags:
|
|
108
|
+
- equipment-ex
|
|
109
|
+
- outfitslots
|
|
110
|
+
- auto-conversion
|
|
111
|
+
- default
|
|
112
|
+
- slot-table
|
|
113
|
+
- id: cp2077.equipment-ex.slots.new-slot-proposal-rules
|
|
114
|
+
claim: "Equipment-EX's recommendations for proposing a new slot: \"The purpose of the slot must be
|
|
115
|
+
clear and distinguishable from other slots\"; \"The slot must represent an area or layer for
|
|
116
|
+
only one item equipped at a time\"; \"The slot must be named after a body part if possible, or
|
|
117
|
+
equipment category otherwise\"."
|
|
118
|
+
status: community
|
|
119
|
+
source: cp2077-equipment-ex README.md, section "Documentation > Outfit slots" (closing list)
|
|
120
|
+
tags:
|
|
121
|
+
- equipment-ex
|
|
122
|
+
- outfitslots
|
|
123
|
+
- naming-rule
|
|
124
|
+
- contribution
|
|
125
|
+
- id: cp2077.equipment-ex.slots.outfit-mode-overlays-not-reequips
|
|
126
|
+
claim: Clicking an item in the Wardrobe UI "will activate outfit mode, which applies the visuals of
|
|
127
|
+
the selected items to your character over equipped gear" — the overlay is visual and sits on
|
|
128
|
+
top of what is actually equipped. It is turned off by selecting "No outfit" or unequipping the
|
|
129
|
+
outfit from the Inventory menu.
|
|
130
|
+
status: community
|
|
131
|
+
source: cp2077-equipment-ex README.md, section "Getting Started > How to use"
|
|
132
|
+
tags:
|
|
133
|
+
- equipment-ex
|
|
134
|
+
- outfit-mode
|
|
135
|
+
- wardrobe
|
|
136
|
+
- visual-only
|
|
137
|
+
detail: The Wardrobe is reached "through the new 'Wardrobe' button in the Inventory menu or from
|
|
138
|
+
wardrobe call in V's apartments"; photo mode exposes outfit switching in the pose section. The
|
|
139
|
+
README says the overlay applies visuals; it does not comment on stats, so that wording was
|
|
140
|
+
trimmed on 2026-09-07.
|
|
141
|
+
- id: cp2077.equipment-ex.slots.translation-template-path
|
|
142
|
+
claim: Localization contributions start from the template `support/localization/lang.json.json` in
|
|
143
|
+
the repo; the instruction is to "translate all `femaleVariant` values" and keep the
|
|
144
|
+
translation as close to the English version as possible.
|
|
145
|
+
status: community
|
|
146
|
+
source: cp2077-equipment-ex README.md, section "Translations"
|
|
147
|
+
tags:
|
|
148
|
+
- equipment-ex
|
|
149
|
+
- localization
|
|
150
|
+
- translation
|
|
151
|
+
- file-path
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
game: cyberpunk2077
|
|
2
|
+
topic: fx.effects
|
|
3
|
+
title: Particle effects, effect descriptors, and melee swing trails
|
|
4
|
+
facts:
|
|
5
|
+
- id: cp2077.fx.effects.placement-info-named-tag-required
|
|
6
|
+
claim: On a custom melee weapon's .app, an entEffectDesc only places its particles correctly when it
|
|
7
|
+
uses worldCompiledEffectInfo placementInfos + placementTags naming an actual bone tag (e.g.
|
|
8
|
+
"base", the weapon's base bone); untagged placement (placementTagIndex 255, i.e. the weapon
|
|
9
|
+
root) resolves to nothing on this app even though the identical untagged pattern works on the
|
|
10
|
+
katana's own, much richer app.
|
|
11
|
+
status: verified
|
|
12
|
+
source: ModWright field verification
|
|
13
|
+
tags:
|
|
14
|
+
- fx
|
|
15
|
+
- effect-desc
|
|
16
|
+
- placement
|
|
17
|
+
- tag
|
|
18
|
+
- silent-failure
|
|
19
|
+
detail: "Three earlier no-ops (documented in the mod's build scripts) had already proven neither
|
|
20
|
+
compiledEffectInfo componentIndexMask nor the effect's own trackGroup componentName places
|
|
21
|
+
particles here. The chainsword's vanilla blood_dripping desc revealed the real mechanism:
|
|
22
|
+
placementInfos + placementTags + relativePositions in worldCompiledEffectInfo, selected per
|
|
23
|
+
event via placementIndexMask, offset relative to the named tag. A first version of the trail
|
|
24
|
+
script copied the katana's trail desc verbatim (placementTagIndex 255, flags 9) and rendered
|
|
25
|
+
nothing; v2 mirrored the app's OWN working idle_thermal desc (placementTags [\"base\"],
|
|
26
|
+
placementTagIndex 0, flags 3) and worked. Rule recorded for this app: copy the placement shape
|
|
27
|
+
of idle_thermal, never a donor weapon's own desc."
|
|
28
|
+
- id: cp2077.fx.effects.relative-rotation-placement-quaternion
|
|
29
|
+
claim: Each placementInfo in compiledEffectInfo carries a relativeRotationIndex pointing into a
|
|
30
|
+
separate relativeRotations[] array of quaternions; this is the per-placement rotation knob for
|
|
31
|
+
an effect desc, and it is exploited on a custom weapon's idle_thermal desc to flip the far
|
|
32
|
+
horn's placement 180 degrees about local Z.
|
|
33
|
+
status: inferred
|
|
34
|
+
source: ModWright research
|
|
35
|
+
tags:
|
|
36
|
+
- fx
|
|
37
|
+
- effect-desc
|
|
38
|
+
- placement
|
|
39
|
+
- rotation
|
|
40
|
+
- quaternion
|
|
41
|
+
detail: compiledEffectInfo.placementInfos[].relativeRotationIndex ->
|
|
42
|
+
compiledEffectInfo.relativeRotations[] (Quaternion). idle_thermal's far horn placement carries
|
|
43
|
+
(0,0,1,0), a 180 degree spin about local Z, to flip its drift inward. The knob is real and in
|
|
44
|
+
active use — see cp2077.fx.effects.world-space-vectors-ignore-placement-rotation for why it
|
|
45
|
+
cannot fix every orientation problem.
|
|
46
|
+
- id: cp2077.fx.effects.world-space-vectors-ignore-placement-rotation
|
|
47
|
+
claim: A particle emitter's velocity/acceleration initializers set with worldSpace = 1 are evaluated
|
|
48
|
+
in world space; rotating the effect desc's placement quaternion (relativeRotationIndex) cannot
|
|
49
|
+
redirect them, because the placement rotation only affects local-space vectors.
|
|
50
|
+
status: inferred
|
|
51
|
+
source: ModWright research
|
|
52
|
+
tags:
|
|
53
|
+
- fx
|
|
54
|
+
- particle
|
|
55
|
+
- world-space
|
|
56
|
+
- rotation
|
|
57
|
+
- orientation
|
|
58
|
+
detail: "w_mantisblades_idle_thermal.effect's \"smoke\" event
|
|
59
|
+
(w_mantisblades_idle_thermal_sparks.particle) sets BOTH CParticleInitializerVelocity (+Z,
|
|
60
|
+
0.25..0.5) and CParticleModificatorAcceleration (direction +Z) with worldSpace = 1 on both
|
|
61
|
+
modules, so the particles rise straight up in world space no matter how the placement is
|
|
62
|
+
rotated. Correct for vertical mantis arm blades, visibly wrong for a crescent held horizontal.
|
|
63
|
+
The companion haze event has no velocity initializer, only a world-space acceleration, so it
|
|
64
|
+
is a pure distortion field and reads fine from any angle. CLOSED 2026-09-03: the user verified
|
|
65
|
+
in game that the smoke reads fine once 1b's placement fix landed, so this was never actually
|
|
66
|
+
re-fixed via option A (local-spacing a cloned particle) or option B (masking the sparks event
|
|
67
|
+
off) — recorded because it explains the mechanism, not because a fix shipped."
|
|
68
|
+
- id: cp2077.fx.effects.per-event-placement-index-mask
|
|
69
|
+
claim: A single entEffectDesc can place its several particle events at different placementInfos
|
|
70
|
+
independently, by giving each event its own placementIndexMask bit rather than sharing one
|
|
71
|
+
mask across all events.
|
|
72
|
+
status: inferred
|
|
73
|
+
source: ModWright research
|
|
74
|
+
tags:
|
|
75
|
+
- fx
|
|
76
|
+
- effect-desc
|
|
77
|
+
- placement-mask
|
|
78
|
+
- event
|
|
79
|
+
detail: "Vanilla's reflected_bullet_sparks desc proves the mechanism works. A custom weapon's own
|
|
80
|
+
idle_thermal desc does NOT use it: both its haze and sparks events currently run
|
|
81
|
+
placementIndexMask 3 (both placements), which is why the far-horn placement fix also moved the
|
|
82
|
+
haze (see cp2077.fx.effects.relative-rotation-placement-quaternion's parent finding) — an
|
|
83
|
+
available lever the mod does not currently pull."
|
|
84
|
+
- id: cp2077.fx.effects.heat-haze-hypothesis-shader-pass
|
|
85
|
+
claim: The thermal blade's heat haze is most likely a pass of the multilayer_blackbody_inject.mt
|
|
86
|
+
shader itself (it samples fx_perlin_noise_01_d / fx_perlin_noise_3d_01_d across 4 passes), so
|
|
87
|
+
using that shader on the glow material should produce the haze for free with no separate
|
|
88
|
+
effect needed.
|
|
89
|
+
status: contradicted
|
|
90
|
+
source: ModWright research
|
|
91
|
+
tags:
|
|
92
|
+
- fx
|
|
93
|
+
- heat-haze
|
|
94
|
+
- shader
|
|
95
|
+
- hypothesis
|
|
96
|
+
- retracted
|
|
97
|
+
detail: "This was the working hypothesis before the haze mechanism was pinned down. It turned out to
|
|
98
|
+
be wrong: the haze is a particle effect, not a shader pass. Superseded by
|
|
99
|
+
cp2077.fx.effects.heat-haze-is-a-particle-effect."
|
|
100
|
+
- id: cp2077.fx.effects.heat-haze-is-a-particle-effect
|
|
101
|
+
claim: "The thermal weapon heat haze is a PARTICLE effect, not a shader pass: an
|
|
102
|
+
effectTrackItemParticles track inside a dedicated idle-thermal .effect file, spawning a
|
|
103
|
+
distortion particle with a refraction shader and a circular-noise distortion texture."
|
|
104
|
+
status: inferred
|
|
105
|
+
source: ModWright research
|
|
106
|
+
tags:
|
|
107
|
+
- fx
|
|
108
|
+
- heat-haze
|
|
109
|
+
- particle
|
|
110
|
+
- pinned
|
|
111
|
+
supersedes: cp2077.fx.effects.heat-haze-hypothesis-shader-pass
|
|
112
|
+
detail: "For the mantis it is the \"Heat_Haze\" particle track inside
|
|
113
|
+
base\\fx\\weapons\\cyberware\\mantisblades\\idle\\w_mantisblades_idle_thermal .effect, emitter
|
|
114
|
+
shader base\\fx\\shaders\\simple_refraction.mt + fx_circular_distortion_03_noise_n.xbm, params
|
|
115
|
+
Refraction/RefractionStrength. The katana has its own separate haze:
|
|
116
|
+
base\\fx\\weapons\\melee\\katanas\\idles\\w_katana_idle_thermal.effect, spawning
|
|
117
|
+
w_katana_idle_thermal.particle with the same distortion texture. A custom weapon mod's shipped
|
|
118
|
+
idle_thermal desc points at the vanilla mantis effect verbatim (see
|
|
119
|
+
cp2077.fx.effects.placement-info-named-tag-required), not the katana one — two independent
|
|
120
|
+
vanilla implementations of the same visual idea exist in the game."
|
|
121
|
+
- id: cp2077.fx.effects.katana-and-mantis-have-separate-heat-haze-effects
|
|
122
|
+
claim: The katana and mantis-blades families each ship their own, separate idle-thermal haze effect
|
|
123
|
+
file and particle asset; they are not the same resource reused across weapon types.
|
|
124
|
+
status: inferred
|
|
125
|
+
source: ModWright research
|
|
126
|
+
tags:
|
|
127
|
+
- fx
|
|
128
|
+
- heat-haze
|
|
129
|
+
- katana
|
|
130
|
+
- mantis
|
|
131
|
+
- resource
|
|
132
|
+
detail: "Mantis: w_mantisblades_idle_thermal.effect / w_mantisblades_idle_thermal_sparks.particle.
|
|
133
|
+
Katana: w_katana_idle_thermal.effect / w_katana_idle_thermal.particle. Both were explored as
|
|
134
|
+
heat-haze donors for a custom weapon; the shipped weapon grafts the mantis one, per
|
|
135
|
+
cp2077.fx.effects.heat-haze-is-a-particle-effect."
|
|
136
|
+
- id: cp2077.fx.effects.effect-desc-handle-wrapped-lists
|
|
137
|
+
claim: In a custom weapon's .app, entEffectDesc entries are stored HANDLE-WRAPPED ({HandleId, Data})
|
|
138
|
+
in three separate lists (two compiledData chunks plus the source components[] array), not as
|
|
139
|
+
bare objects; a script that only checks `i["$type"] == "entEffectDesc"` will find nothing.
|
|
140
|
+
status: inferred
|
|
141
|
+
source: ModWright research
|
|
142
|
+
tags:
|
|
143
|
+
- fx
|
|
144
|
+
- effect-desc
|
|
145
|
+
- handle
|
|
146
|
+
- json
|
|
147
|
+
- wolvenkit
|
|
148
|
+
detail: Appending new descs also perturbs handle order, and WolvenKit's `convert deserialize` FAILS
|
|
149
|
+
unless every HandleId runs in document-encounter order (the same class of gotcha recorded for
|
|
150
|
+
sector json — see cp2077.sectors.sector-json-file-uniqueness — but here it is ordering, not
|
|
151
|
+
uniqueness, that breaks). The fix reuses a `renumber_handles` helper originally written for a
|
|
152
|
+
finisher routing script; deserialize plus a binary round-trip both pass after renumbering.
|
|
153
|
+
- id: cp2077.fx.effects.swing-trail-triggered-per-attack-record-timing
|
|
154
|
+
claim: The melee swing trail (weapon.StartCurrentMeleeTrailEffect / StopCurrentMeleeTrailEffect) is
|
|
155
|
+
driven purely by per-attack-record timing fields — trailStartDelay and trailStopDelay compared
|
|
156
|
+
against elapsed state time in meleeTransitions.script — not by animation data; a weapon
|
|
157
|
+
inherits this triggering for free from its base attack records regardless of whether it
|
|
158
|
+
declares a trail effect at all.
|
|
159
|
+
status: inferred
|
|
160
|
+
source: ModWright research
|
|
161
|
+
tags:
|
|
162
|
+
- fx
|
|
163
|
+
- swing-trail
|
|
164
|
+
- attack-record
|
|
165
|
+
- timing
|
|
166
|
+
detail: A machete-derived weapon's attack records inherit trailStartDelay 0.1 / trailStopDelay 0.4
|
|
167
|
+
from MacheteComboAttackAbstract / MacheteFinalAttackAbstract, so the engine had been asking
|
|
168
|
+
for the trail on every swing since the weapon's first build — it simply resolved to nothing
|
|
169
|
+
because the weapon's .app declared no trail_* effect descriptor at all. The katana's own app
|
|
170
|
+
declares eight (trail_physical/_npc, trail_thermal/_npc, trail_chemical/_npc,
|
|
171
|
+
trail_electric/_npc).
|
|
172
|
+
- id: cp2077.fx.effects.trail-name-assumed-from-thermal-flag
|
|
173
|
+
claim: Because a custom weapon record (Items.<ModWeapon>) sets BaseStats.DealsThermalDamage and the
|
|
174
|
+
weapon's own idle_thermal desc visibly renders (which StartIdleMeleeEffect only requests for
|
|
175
|
+
Thermal-type weapons), the resolved melee damage type must be Thermal, so the swing trail
|
|
176
|
+
should be requested by the name "trail_thermal".
|
|
177
|
+
status: contradicted
|
|
178
|
+
source: ModWright research
|
|
179
|
+
tags:
|
|
180
|
+
- fx
|
|
181
|
+
- swing-trail
|
|
182
|
+
- damage-type
|
|
183
|
+
- hypothesis
|
|
184
|
+
- retracted
|
|
185
|
+
detail: This chain of reasoning is wrong at the last step and cost three relaunch cycles. Superseded
|
|
186
|
+
by cp2077.fx.effects.trail-name-resolved-from-damage-comparison.
|
|
187
|
+
- id: cp2077.fx.effects.trail-name-resolved-from-damage-comparison
|
|
188
|
+
claim: GetCurrentDamageType() (the value weapon.script actually uses to pick the trail effect name)
|
|
189
|
+
is resolved by comparing damage STAT VALUES, not by reading the DealsThermalDamage flag; on
|
|
190
|
+
that weapon it resolves to Physical even though DealsThermalDamage is set, because that flag
|
|
191
|
+
only gates whether burn status applies, not which damage type the trail system sees.
|
|
192
|
+
status: verified
|
|
193
|
+
source: ModWright field verification
|
|
194
|
+
tags:
|
|
195
|
+
- fx
|
|
196
|
+
- swing-trail
|
|
197
|
+
- damage-type
|
|
198
|
+
- probe
|
|
199
|
+
supersedes: cp2077.fx.effects.trail-name-assumed-from-thermal-flag
|
|
200
|
+
detail: A logging probe (a debug redscript, <Mod>_TrailProbe.reds, deleted before ship) showed 49/49
|
|
201
|
+
requests for "trail_physical", not "trail_thermal". The fix was to pair `trail_physical ->
|
|
202
|
+
w_katana_swing_trail.effect` (the working one) and `trail_thermal ->
|
|
203
|
+
w_katana_thermal_swing_trail.effect` separately, instead of pointing both names at the thermal
|
|
204
|
+
visual. Confirmed in game on lights 2/3/4 after the pairing fix; the final gating chosen is ON
|
|
205
|
+
for light 3 and light 4 only (light 1 too subtle, heavies too slow to show the ribbon).
|
|
206
|
+
- id: cp2077.fx.effects.swing-trail-anchor-glow-arc-midpoint
|
|
207
|
+
claim: For a crescent-shaped blade, the correct swing-trail placement anchor is the midpoint of the
|
|
208
|
+
glow arc — the glow-mesh vertex farthest from the chord between the two horn tips — with the
|
|
209
|
+
perpendicular axis zeroed to center it in the blade's thickness; this is the crescent analogue
|
|
210
|
+
of the katana's straight-blade anchor point.
|
|
211
|
+
status: inferred
|
|
212
|
+
source: ModWright research
|
|
213
|
+
tags:
|
|
214
|
+
- fx
|
|
215
|
+
- swing-trail
|
|
216
|
+
- placement
|
|
217
|
+
- measurement
|
|
218
|
+
- crescent
|
|
219
|
+
detail: "Measured position (0, 0.2119, 0.2152) — the raw glow vertex is (-0.0112, 0.2119, 0.2152)
|
|
220
|
+
with X zeroed to centre it in the blade's ~22 mm thickness — 0.286 m of bulge from the chord.
|
|
221
|
+
Inferred, not verified: the anchor is an offline measurement. The trail carrying it was
|
|
222
|
+
separately confirmed rendering in game on lights 2/3/4
|
|
223
|
+
(cp2077.fx.effects.trail-name-resolved-from-damage-comparison), but the ribbon's TILT against
|
|
224
|
+
the blade plane has never been judged in game. The katana anchors at (0, -0.01, 0.5), out
|
|
225
|
+
along its straight blade; rotation is left identity (the katana's own trail carries a ~3
|
|
226
|
+
degree trim quaternion, noted as the knob to use if the ribbon ever reads tilted against the
|
|
227
|
+
blade plane in game)."
|
|
228
|
+
- id: cp2077.fx.effects.analytic-camera-projection-for-offline-placement-check
|
|
229
|
+
claim: Effect-placement offsets can be checked offline without a working render by projecting
|
|
230
|
+
measured 3D marker positions through the FPP camera analytically (Blender's
|
|
231
|
+
world_to_camera_view), reading off normalized screen-space x/y; this works even when the
|
|
232
|
+
render pipeline itself is broken for that scene.
|
|
233
|
+
status: inferred
|
|
234
|
+
source: ModWright research
|
|
235
|
+
tags:
|
|
236
|
+
- fx
|
|
237
|
+
- placement
|
|
238
|
+
- measurement
|
|
239
|
+
- camera-projection
|
|
240
|
+
- methodology
|
|
241
|
+
detail: 'Used to localize the smoke-placement bug precisely: PLACE0 (left) measured 0.0201 right of
|
|
242
|
+
its glow tip in normalized screen x, PLACE1 (right) measured -0.0508 (fine). The marker render
|
|
243
|
+
itself came out blank grey (a known silent-grey issue in this preview pipeline, referenced
|
|
244
|
+
elsewhere as "renders default to FPP camera"); the projection did not depend on the render
|
|
245
|
+
succeeding, so the fix (pulling PLACE0 1 cm toward the glow centroid, offset dropping to
|
|
246
|
+
+0.0023) was computed and shipped without needing that render fixed.'
|