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,167 @@
|
|
|
1
|
+
game: baldursgate3
|
|
2
|
+
topic: items.cloth-physics
|
|
3
|
+
title: Cloth physics on worn armor (proxy cloth mesh, vertex paint, ClothParams, ClothProxyMapping)
|
|
4
|
+
facts:
|
|
5
|
+
- id: bg3.cloth.proxy-cloth-mesh-in-gr2
|
|
6
|
+
claim: Cloth physics on worn armor is driven by a separate, INVISIBLE, coarse submesh in the same
|
|
7
|
+
GR2 whose name ends in _Cloth_Mesh (the "cloth proxy"); the visible render mesh is deformed by
|
|
8
|
+
it. The proxy uses the engine default material 9e2966c7-b61c-4bc1-bef1-a79cb5fde067
|
|
9
|
+
(Engine_Default_Mesh_Lit_Opaque) and ships per LOD.
|
|
10
|
+
status: verified
|
|
11
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
12
|
+
source: wiki.bg3.community/Information/Meshes/Armour-Meshes + the vanilla resource
|
|
13
|
+
tags:
|
|
14
|
+
- cloth
|
|
15
|
+
- physics
|
|
16
|
+
- gr2
|
|
17
|
+
- proxy-mesh
|
|
18
|
+
- armor
|
|
19
|
+
detail: 'The wiki glossary: "When a sub-mesh ends with _Cloth_Mesh, this is (with very rare
|
|
20
|
+
exceptions) the cloth mesh, which is an invisible submesh that gives the game information on
|
|
21
|
+
how to simulate the cloth physics for the other parts of that mesh." A custom robe therefore
|
|
22
|
+
needs its swinging parts (tie ends, beads, skirt) modelled a second time as a low-poly proxy,
|
|
23
|
+
not just painted on the render mesh.'
|
|
24
|
+
- id: bg3.cloth.vertex-paint-red-amount-blue-damping
|
|
25
|
+
claim: "Cloth is controlled by vertex colour: RED turns physics on and sets how free a vertex is (0
|
|
26
|
+
= pinned), BLUE slows/damps it; GREEN is reserved for the VertCut body-mask. The cloth proxy
|
|
27
|
+
is painted in red bands (vanilla robe: 0 / .25 / .5 / .65 / .8 / 1, blue 0 / .25 / .5); the
|
|
28
|
+
visible render mesh is painted red = 1 on every cloth-driven vertex and 0 elsewhere."
|
|
29
|
+
status: verified
|
|
30
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
31
|
+
source: 'wiki.bg3.community/Information/Meshes/Vertex-Painting-Meshes ("Red and Blue affect cloth
|
|
32
|
+
physics"; the community summary: red turns physics on, more red = more active, blue makes it
|
|
33
|
+
slower) + the vanilla data'
|
|
34
|
+
tags:
|
|
35
|
+
- cloth
|
|
36
|
+
- physics
|
|
37
|
+
- vertex-color
|
|
38
|
+
- weight-paint
|
|
39
|
+
detail: 'Paint with flood fills per face selection, not soft brushes: in-between values are handled
|
|
40
|
+
badly by the engine (the wiki reports such verts "stuck to the ground" for the mask channel).
|
|
41
|
+
Export-side colour-space caveat as for VertexColorMaskSlots: via Collada the R/B components
|
|
42
|
+
survive as painted; via glTF they are gamma-adjusted.'
|
|
43
|
+
- id: bg3.cloth.visualbank-clothparams-node
|
|
44
|
+
claim: "The VisualBank Resource carries one ClothParams child per cloth proxy mesh (and per LOD):
|
|
45
|
+
its UUID attribute is the proxy's ObjectID string (e.g.
|
|
46
|
+
HUM_F_ARM_Robe_A_Body.HUM_F_ARM_Robe_A_Body_Cloth_Mesh.2) and it holds the 39 simulation
|
|
47
|
+
attributes."
|
|
48
|
+
status: verified
|
|
49
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
50
|
+
source: Shared.pak [PAK]_Female_Armor _merged.lsf
|
|
51
|
+
tags:
|
|
52
|
+
- cloth
|
|
53
|
+
- physics
|
|
54
|
+
- visualbank
|
|
55
|
+
- clothparams
|
|
56
|
+
detail: 'Vanilla robe values (a sane starting point for light cloth): AngularDrag/LinearDrag .0001,
|
|
57
|
+
AngularInertia/ LinearInertia/CentrifugalInertia .5, AnimDriveSpringForce 225,
|
|
58
|
+
AnimDriveDampingForce 75, AnimInfluenceMultiplier 1, BendingStiffness 1, LinearStiffness 1,
|
|
59
|
+
Damping .04, DragCoefficient .4, LiftCoefficient .01, FluidDensity .1, Friction .1,
|
|
60
|
+
CollisionMassScale 1, CompressionLimit .8, StretchLimit 1.2, SelfCollisionDistance 0,
|
|
61
|
+
SelfCollisionStiffness 0, SolverFrequency 30, StiffnessFrequency 350, StiffnessMultiplier 1,
|
|
62
|
+
TetherConstraintScale 1, TetherConstraintStiffness 1, EnableCCD False, EnableVirtualParticles
|
|
63
|
+
False, all wind fields 0/False. The "Fabric Manufacturer" SE utility (Nexus 18884) exposes
|
|
64
|
+
these as live sliders and exports them.'
|
|
65
|
+
- id: bg3.cloth.proxy-mapping-blob-three-nearest
|
|
66
|
+
claim: "ClothProxyMapping links a cloth proxy to the render mesh it drives: MapKey = proxy ObjectID;
|
|
67
|
+
MapValue/Object has Name = render-mesh ObjectID, NbClosestVertices = N and ClosestVertices =
|
|
68
|
+
base64(zlib(uint16[N])). The blob is N/3 triples, one per proxied render vertex: slot 1 is
|
|
69
|
+
ALWAYS a valid proxy-vertex index, slots 2-3 are extra nearest neighbours or 0xFFFF. Indices
|
|
70
|
+
address the proxy's WELDED vertex list (max index + 1 equals the proxy's unique-position count
|
|
71
|
+
where the GR2 has no split verts: Robe_A_1 504/504, Padded LOD0 315/315)."
|
|
72
|
+
status: inferred
|
|
73
|
+
source: "Decoded 2026-09-14 from Shared.pak [PAK]_Female_Armor + the GR2s of HUM_F_ARM_Robe_A,
|
|
74
|
+
Robe_A_1, Robe_D, Padded_A_1 and Robe_C_3 (12 mappings, all LODs): N divisible by 3 in all 402
|
|
75
|
+
entries of the file; slot-1 valid count == N/3 in all 12; zlib-inflates to exactly 2*N bytes."
|
|
76
|
+
tags:
|
|
77
|
+
- cloth
|
|
78
|
+
- physics
|
|
79
|
+
- visualbank
|
|
80
|
+
- clothproxymapping
|
|
81
|
+
- scratchbuffer
|
|
82
|
+
- binary
|
|
83
|
+
detail: "WHICH render vertices are proxied is only partly decoded: N/3 is always a little above the
|
|
84
|
+
count of red-painted render verts (Robe_A_1: 1235 vs 1183 red, and it EQUALS red verts + their
|
|
85
|
+
one-ring neighbours, 1235, for both LODs of that mesh), but the one-ring rule
|
|
86
|
+
over-/under-shoots the other four robes by 3-10% (Robe_D 402 vs 379, Padded 1550 vs 1464,
|
|
87
|
+
Robe_C_3 3222 vs 3121) — likely because lslib's glTF export does not reproduce the GR2's exact
|
|
88
|
+
vertex list. Order within the list is presumed to be render-vertex order. The Toolkit
|
|
89
|
+
generates this blob from its Proxy Simulation tab; a hand-generated one (a script writing
|
|
90
|
+
\"red + one ring, vertex order, three nearest welded proxy verts\") is an EXPERIMENT with
|
|
91
|
+
crash risk, not a recipe."
|
|
92
|
+
- id: bg3.cloth.lslib-divmodeltype-cloth-flag
|
|
93
|
+
claim: "lslib/divine marks a GR2 mesh as cloth from the COLLADA source: under the geometry's <mesh>
|
|
94
|
+
an <extra> <technique profile=\"LSTools\"> with <DivModelType>Cloth</DivModelType> sets
|
|
95
|
+
MeshFlags Cloth and ExtendedData Cloth=1. Other DivModelType values: Rigid, MeshProxy,
|
|
96
|
+
ProxyGeometry, Spring, Occluder, Cloth01, Cloth02, Cloth04, ClothPhysics (cloth flag bits);
|
|
97
|
+
same technique also takes ExportOrder, LOD, LODDistance, IsImpostor."
|
|
98
|
+
status: verified
|
|
99
|
+
verified_on: lslib master (ColladaImporter.cs FindExporterExtraData / LoadLSLibProfileMeshType),
|
|
100
|
+
read 2026-09-14
|
|
101
|
+
source: github.com/Norbyte/lslib LSLib/Granny/Model/ColladaImporter.cs
|
|
102
|
+
tags:
|
|
103
|
+
- cloth
|
|
104
|
+
- lslib
|
|
105
|
+
- divine
|
|
106
|
+
- collada
|
|
107
|
+
- gr2
|
|
108
|
+
- mesh-flags
|
|
109
|
+
detail: Blender's built-in COLLADA exporter writes no such technique; the dos2de_collada_exporter
|
|
110
|
+
addon does (its per-mesh "Cloth" custom property). A pipeline using the stock exporter can
|
|
111
|
+
inject the <extra> block into the .dae before divine dae->gr2. Which cloth flag bits vanilla
|
|
112
|
+
proxies carry was not checked.
|
|
113
|
+
- id: bg3.cloth.toolkit-proxy-simulation-tab
|
|
114
|
+
claim: In the Toolkit, a GR2 that contains a cloth proxy mesh is wired by opening the mesh in the
|
|
115
|
+
Resource Manager and, in its Proxy Simulation tab, dragging the render mesh and dropping it
|
|
116
|
+
under the bolded cloth mesh; that is what produces the ClothProxyMapping (and default
|
|
117
|
+
ClothParams) in the VisualBank.
|
|
118
|
+
status: community
|
|
119
|
+
source: wiki.bg3.community/Tutorials/Toolkit/Toolkit_Tips (search summary, 2026-09-14)
|
|
120
|
+
tags:
|
|
121
|
+
- cloth
|
|
122
|
+
- physics
|
|
123
|
+
- toolkit
|
|
124
|
+
- proxy-simulation
|
|
125
|
+
detail: "Recommended route for a hand-built pipeline: author the GR2 (render mesh + proxy, both
|
|
126
|
+
painted) with lslib, do the proxy link in the Toolkit once, then lift the generated
|
|
127
|
+
ClothParams + ClothProxyMapping nodes into the mod's own _merged.lsx. The step-by-step is
|
|
128
|
+
\"Add Cloth Physics To Any Armor\" (Nexus article 311)."
|
|
129
|
+
- id: bg3.cloth.single-bone-mesh-crashes-with-physics
|
|
130
|
+
claim: A mesh weighted 100% to a single bone crashes the game when cloth physics is added to it.
|
|
131
|
+
status: community
|
|
132
|
+
source: search summary of the community cloth-physics tutorial listing, 2026-09-14 (not
|
|
133
|
+
independently verified)
|
|
134
|
+
tags:
|
|
135
|
+
- cloth
|
|
136
|
+
- physics
|
|
137
|
+
- crash
|
|
138
|
+
- weights
|
|
139
|
+
- id: bg3.cloth.colliders-live-on-the-body
|
|
140
|
+
claim: Cloth collides with a ClothColliderBank (bone-attached spheres with links) that ships with
|
|
141
|
+
the BODY mesh's _merged.lsf; an armor VisualBank resource leaves ClothColliderResourceID empty
|
|
142
|
+
and inherits the body's.
|
|
143
|
+
status: community
|
|
144
|
+
source: bg3.wiki/wiki/Modding:Cloth_colliders; vanilla robe resource ClothColliderResourceID=""
|
|
145
|
+
tags:
|
|
146
|
+
- cloth
|
|
147
|
+
- physics
|
|
148
|
+
- collider
|
|
149
|
+
detail: Only a custom BODY needs its own collider bank (the wiki gives FS_NKD_Body_ClothCollider as
|
|
150
|
+
a template); sphere Radius tunes how far cloth is held off the limb.
|
|
151
|
+
- id: bg3.cloth.cloaks-collide-with-the-body-colliders-so-standoff-collars-clip
|
|
152
|
+
claim: "Because a worn mesh has no ClothColliderResourceID of its own
|
|
153
|
+
(bg3.cloth.colliders-live-on-the-body), an equipped cloak's cloth collides only with the naked
|
|
154
|
+
body's ClothColliderBank spheres (HUM_F_NKD_Body_ClothCollider,
|
|
155
|
+
36550e8b-4302-b290-954d-626f53ee7c91: bone-attached Spheres with Position, Radius and Links �
|
|
156
|
+
Ankle, Knee, Hip_*_Twist, Root_M ...). Any part of a custom robe that stands off the body,
|
|
157
|
+
such as a raised collar or upper back, is therefore passed through by the cape. The untested
|
|
158
|
+
remedy is a ClothColliderBank resource for the robe (spheres on neck / upper spine / shoulders
|
|
159
|
+
sized to the collar) referenced from the robe's VisualBank resource."
|
|
160
|
+
status: inferred
|
|
161
|
+
source: ModWright research
|
|
162
|
+
tags:
|
|
163
|
+
- cloth
|
|
164
|
+
- physics
|
|
165
|
+
- collider
|
|
166
|
+
- cloak
|
|
167
|
+
- clipping
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
game: baldursgate3
|
|
2
|
+
topic: items.roottemplates
|
|
3
|
+
title: Level-placed item instances, CC item slots, and TreasureTable mechanics
|
|
4
|
+
facts:
|
|
5
|
+
- id: bg3.items.roottemplates.level-instance-is-a-separate-gameobjects-node
|
|
6
|
+
claim: Placing an item instance in a level (as opposed to defining the item's own RootTemplate) is a
|
|
7
|
+
separate GameObjects node, in a Levels\<LevelName>\Items\_merged.lsf.lsx file, whose
|
|
8
|
+
TemplateName attribute is the MapKey of the RootTemplate being instantiated — the instance
|
|
9
|
+
gets its OWN new MapKey (a fresh UUID) distinct from the template it points at.
|
|
10
|
+
status: community
|
|
11
|
+
source: 'bg3-community/Information/Items/Item-Level-Positioning.md §Item Data File (worked
|
|
12
|
+
GameObjects example: "TemplateName: This is the MapKey of the object you are copying")'
|
|
13
|
+
tags:
|
|
14
|
+
- items
|
|
15
|
+
- roottemplate
|
|
16
|
+
- level-placement
|
|
17
|
+
- gameobjects
|
|
18
|
+
- uuid
|
|
19
|
+
related:
|
|
20
|
+
- id: bg3.items.visualbank.roottemplate-mapkey-links-stats-entry
|
|
21
|
+
detail: Distinguishes the RootTemplate's own definitional MapKey (which a stats entry's RootTemplate
|
|
22
|
+
value must equal) from a level instance's TemplateName, which references that same MapKey
|
|
23
|
+
from a completely different file to place a copy in the world.
|
|
24
|
+
- id: bg3.items.roottemplates.level-instance-required-fields
|
|
25
|
+
claim: "The page's worked level-placed GameObjects node carries: LevelName (FixedString, matching
|
|
26
|
+
the parent Levels\\<Name> directory — readable in-game via
|
|
27
|
+
_P(Osi.GetRegion(GetHostCharacter()))), MapKey (a freshly generated UUID for the new
|
|
28
|
+
instance), Name (a display/debug name for the created object), TemplateName (the source
|
|
29
|
+
RootTemplate's MapKey), Type (FixedString, e.g. \"item\"), plus Flag and
|
|
30
|
+
_OriginalFileVersion_, a LayerList/Layers/Object child node whose own MapKey repeats the
|
|
31
|
+
LevelName, and a Transform child node with Position/RotationQuat/Scale. The page annotates the
|
|
32
|
+
first six but does not say which are strictly required."
|
|
33
|
+
status: community
|
|
34
|
+
source: bg3-community/Information/Items/Item-Level-Positioning.md §Item Data File
|
|
35
|
+
tags:
|
|
36
|
+
- items
|
|
37
|
+
- roottemplate
|
|
38
|
+
- level-placement
|
|
39
|
+
- required-fields
|
|
40
|
+
- id: bg3.items.roottemplates.rotationquat-must-be-precomputed-externally
|
|
41
|
+
claim: A level instance's Transform/RotationQuat attribute takes a quaternion, not a rotation angle,
|
|
42
|
+
and there is no in-game command that outputs one directly — it must be converted externally
|
|
43
|
+
from a Y-axis degree value (e.g. via a browser rotation-converter tool). 90 degrees converts
|
|
44
|
+
to "0 0.7071068 0 0.7071068", written space-separated like Position (the page states the
|
|
45
|
+
no-commas rule for Position explicitly, and every quaternion it prints follows the same
|
|
46
|
+
spacing).
|
|
47
|
+
status: community
|
|
48
|
+
source: bg3-community/Information/Items/Item-Level-Positioning.md §Converting Rotation to
|
|
49
|
+
RotationQuat ("there isn't a command in game to give you that, so you have to convert it
|
|
50
|
+
externally")
|
|
51
|
+
tags:
|
|
52
|
+
- items
|
|
53
|
+
- roottemplate
|
|
54
|
+
- transform
|
|
55
|
+
- rotationquat
|
|
56
|
+
- gotcha
|
|
57
|
+
detail: The page ships a lookup table of pre-converted 30-degree increments from 0 to 330 for
|
|
58
|
+
convenience, avoiding the external converter for common angles.
|
|
59
|
+
- id: bg3.items.roottemplates.scale-attribute-is-a-multiplier
|
|
60
|
+
claim: "A level instance's Transform/Scale attribute (type float) is a multiplier on the original
|
|
61
|
+
object's size: 1 = 100% (original size), 0.5 = half size, 2.0 = double size."
|
|
62
|
+
status: community
|
|
63
|
+
source: bg3-community/Information/Items/Item-Level-Positioning.md §Item Data File
|
|
64
|
+
tags:
|
|
65
|
+
- items
|
|
66
|
+
- roottemplate
|
|
67
|
+
- transform
|
|
68
|
+
- scale
|
|
69
|
+
- id: bg3.items.roottemplates.cc-item-slot-names-vs-in-game-labels
|
|
70
|
+
claim: 'Character-Creation-visible item slots use internal names that differ from their in-game
|
|
71
|
+
display labels: Head shows as "Face"; Beard shows as "Facial Hair"; Piercing shows as
|
|
72
|
+
"Piercing Style"; DragonbornTop shows as "Crest"; DragonbornChin shows as "Chins";
|
|
73
|
+
DragonbornJaw shows as "Jaws"; Private Parts shows as "Genitals". Hair, Horns, and Tail keep
|
|
74
|
+
the same name in both places.'
|
|
75
|
+
status: community
|
|
76
|
+
source: bg3-community/Information/Items/CC-Item-Slots.md §Character Creation (CC) Slots
|
|
77
|
+
tags:
|
|
78
|
+
- items
|
|
79
|
+
- cc-slots
|
|
80
|
+
- naming-convention
|
|
81
|
+
- id: bg3.items.roottemplates.cc-slot-choice-does-not-constrain-item-behavior
|
|
82
|
+
claim: Any visual can be assigned to any Character Creation slot with identical in-game behavior
|
|
83
|
+
regardless of the slot's intended purpose ("it does not matter what type of item is added to a
|
|
84
|
+
slot... it will behave the same way each time") — the only functional consequence of slot
|
|
85
|
+
choice is which UI section the player must open to select it, plus a caveat that a colorable
|
|
86
|
+
item still needs its own colorable UI section wired up separately.
|
|
87
|
+
status: community
|
|
88
|
+
source: bg3-community/Information/Items/CC-Item-Slots.md §Description
|
|
89
|
+
tags:
|
|
90
|
+
- items
|
|
91
|
+
- cc-slots
|
|
92
|
+
- behavior
|
|
93
|
+
- id: bg3.items.roottemplates.no-way-to-add-new-cc-slots
|
|
94
|
+
claim: There is currently no known way to add a new Character Creation slot beyond the fixed set the
|
|
95
|
+
game ships — "doing so would probably require extensive UI editing, if it is possible at all."
|
|
96
|
+
status: community
|
|
97
|
+
source: bg3-community/Information/Items/CC-Item-Slots.md §Description
|
|
98
|
+
tags:
|
|
99
|
+
- items
|
|
100
|
+
- cc-slots
|
|
101
|
+
- limitation
|
|
102
|
+
- id: bg3.items.roottemplates.spawn-inventory-requires-inventorylist-or-tradetreasures-node
|
|
103
|
+
claim: "Before a TreasureTable can populate a game object's inventory, that object needs a specific
|
|
104
|
+
child node added: InventoryList/InventoryItem (for containers/items) or
|
|
105
|
+
TradeTreasures/TreasureItem (for NPCs), each with an Object attribute (FixedString) naming the
|
|
106
|
+
TreasureTable to roll. Without this node, an otherwise-correct TreasureTable.txt entry is
|
|
107
|
+
never consulted."
|
|
108
|
+
status: community
|
|
109
|
+
source: bg3-community/Tutorials/Items/Treasuretables.md ("Before anything with treasuretables can
|
|
110
|
+
happen... a gameobject needs this attribute node added to it")
|
|
111
|
+
tags:
|
|
112
|
+
- items
|
|
113
|
+
- treasuretable
|
|
114
|
+
- inventorylist
|
|
115
|
+
- tradetreasures
|
|
116
|
+
- required-fields
|
|
117
|
+
- id: bg3.items.roottemplates.treasuretable-subtable-weighting-math
|
|
118
|
+
claim: A TreasureTable "new subtable" string is "Amount;WeightedChance" pairs separated by ";" —
|
|
119
|
+
each pair's second number is its weight relative to the sum of all pairs' second numbers in
|
|
120
|
+
that subtable (e.g. "1,2;2,1" sums to 3, so the first set fires 2-in-3 times and the second
|
|
121
|
+
1-in-3), and the chosen pair's first number is how many items get rolled from the object list
|
|
122
|
+
beneath it, using each listed object's own leading number as its OWN relative weight within
|
|
123
|
+
that roll.
|
|
124
|
+
status: community
|
|
125
|
+
source: bg3-community/Tutorials/Items/Treasuretables.md (worked "1,2;2,1" example and its weighting
|
|
126
|
+
explanation)
|
|
127
|
+
tags:
|
|
128
|
+
- items
|
|
129
|
+
- treasuretable
|
|
130
|
+
- subtable
|
|
131
|
+
- weighting
|
|
132
|
+
detail: A nested treasuretable reference (an object category name prefixed "T_" instead of "I_")
|
|
133
|
+
re-rolls its own subtables independently each time it is selected — the worked example shows a
|
|
134
|
+
16-out-of-20 pick of a "T_"-prefixed table getting rolled twice because the outer subtable's
|
|
135
|
+
chosen pair asked for 2 items.
|
|
136
|
+
- id: bg3.items.roottemplates.treasuretable-subtable-chance-negative-one-always-shows
|
|
137
|
+
claim: Setting a TreasureTable subtable's chance string to "-1" makes every object listed underneath
|
|
138
|
+
it always appear, bypassing both the normal weighted-roll chance and any
|
|
139
|
+
player-level/uniqueness gating that would otherwise filter it out.
|
|
140
|
+
status: community
|
|
141
|
+
source: bg3-community/Tutorials/Items/Treasuretables.md ("If you set the subtable chance to -1, it
|
|
142
|
+
always shows everything underneath, even if its unique or the player doesn't qualify due to
|
|
143
|
+
level")
|
|
144
|
+
tags:
|
|
145
|
+
- items
|
|
146
|
+
- treasuretable
|
|
147
|
+
- subtable
|
|
148
|
+
- always-show
|
|
149
|
+
- id: bg3.items.roottemplates.treasuretable-canmerge-appends-without-redefining
|
|
150
|
+
claim: Adding "CanMerge 1" directly under a "new treasuretable" declaration with the SAME table name
|
|
151
|
+
appends the following subtable(s) to the existing table's contents rather than replacing it —
|
|
152
|
+
the documented way to add drops to a table (including a vanilla one) without needing to
|
|
153
|
+
reproduce its original entries.
|
|
154
|
+
status: community
|
|
155
|
+
source: bg3-community/Tutorials/Items/Treasuretables.md §"You can also add to existing
|
|
156
|
+
treasuretables via CanMerge"
|
|
157
|
+
tags:
|
|
158
|
+
- items
|
|
159
|
+
- treasuretable
|
|
160
|
+
- canmerge
|
|
161
|
+
- extension
|
|
162
|
+
- id: bg3.items.roottemplates.treasuretable-definition-ends-at-next-entry-or-eof
|
|
163
|
+
claim: A TreasureTable.txt entry has no explicit end marker — its definition runs until either the
|
|
164
|
+
file ends or a new "new treasuretable" line starts, which the page compares to how
|
|
165
|
+
stats/spells/boosts .txt files behave.
|
|
166
|
+
status: community
|
|
167
|
+
source: bg3-community/Tutorials/Items/Treasuretables.md:110 ("A treasuretable only ends whenever the
|
|
168
|
+
file ends or you start a new treasuretable entry.")
|
|
169
|
+
tags:
|
|
170
|
+
- items
|
|
171
|
+
- treasuretable
|
|
172
|
+
- txt-format
|
|
173
|
+
- parsing
|
|
174
|
+
- id: bg3.items.roottemplates.loose-lsx-in-roottemplates-is-not-loaded-a-separate-lsf-is
|
|
175
|
+
claim: "The game does not read a loose .lsx file under Public/<Mod>/RootTemplates: a GameObjects
|
|
176
|
+
node shipped that way is unknown to Ext.Template.GetTemplate and Osi.CreateAt returns nothing
|
|
177
|
+
for its MapKey. The same node converted with divine to a .lsf file of its own name, placed
|
|
178
|
+
beside _merged.lsf in the same pak, is loaded, resolves, and spawns; RootTemplates need not be
|
|
179
|
+
merged into _merged.lsf, but they must be .lsf."
|
|
180
|
+
status: verified
|
|
181
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
182
|
+
source: ModWright field verification
|
|
183
|
+
tags:
|
|
184
|
+
- roottemplates
|
|
185
|
+
- lsx
|
|
186
|
+
- lsf
|
|
187
|
+
- packaging
|
|
188
|
+
- scaffold
|
|
189
|
+
detail: "Consequence for ModWright: the baldursgate3.new-item scaffold writes
|
|
190
|
+
Public/<Mod>/RootTemplates/<Item>.lsx and the mod's build had no divine-lsx-to-lsf step, so
|
|
191
|
+
the scaffolded template never reached the engine even though the stats entry (which the row's
|
|
192
|
+
bg3.stat.exists probe checks) loads fine. The build already offers a divine-lsx-to-lsf step
|
|
193
|
+
(src/core/build/steps/bg3.ts); the scaffold now ensures it and a bg3.template.exists probe
|
|
194
|
+
backs the row (both landed 2026-09-10 and confirmed live on 2026-09-11). Other Public/<Mod>
|
|
195
|
+
folders a mod ships as .lsx (Lists, Progressions, ClassDescriptions, GUI atlases) do load as
|
|
196
|
+
.lsx; RootTemplates is the folder where only .lsf counted here."
|
|
197
|
+
- id: bg3.items.roottemplates.multiple-inventoryitem-nodes-roll-independently
|
|
198
|
+
claim: A single object can carry multiple InventoryList/InventoryItem child nodes, each naming a
|
|
199
|
+
different TreasureTable, and every listed table is rolled and its results all added to the
|
|
200
|
+
same inventory.
|
|
201
|
+
status: verified
|
|
202
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
203
|
+
source: ModWright field verification
|
|
204
|
+
tags:
|
|
205
|
+
- items
|
|
206
|
+
- treasuretable
|
|
207
|
+
- inventorylist
|
|
208
|
+
- multiple-tables
|
|
209
|
+
detail: 'Checked against the source (2026-09-08): an earlier wording added that "every listed table
|
|
210
|
+
is rolled independently and its results all added to the same inventory, rather than only the
|
|
211
|
+
first or a randomly chosen one being used". §"The 0.5th way" is a bare code block with no
|
|
212
|
+
prose at all — the two-node XML shape is attested, the rolling semantics are only the obvious
|
|
213
|
+
reading of it, so this is downgraded to inferred until someone spawns such an object and looks
|
|
214
|
+
in its inventory.'
|
|
215
|
+
- id: bg3.items.roottemplates.gameobjects-node-needs-type-stats-and-parenttemplateid-to-load
|
|
216
|
+
claim: "A RootTemplate GameObjects node that carries only MapKey, Name and VisualTemplate is not
|
|
217
|
+
loaded by the engine even when it ships as a correctly converted .lsf:
|
|
218
|
+
Ext.Template.GetTemplate returns nil for its MapKey and Osi.TemplateAddTo adds nothing. The
|
|
219
|
+
same node with Type \"item\", Stats \"<entry>\" and a ParentTemplateId (the vanilla template
|
|
220
|
+
of the stats entry's `using` parent) loads, resolves (templateType item) and spawns an item
|
|
221
|
+
that inherits the parent template's behaviour."
|
|
222
|
+
status: verified
|
|
223
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
224
|
+
source: ModWright field verification
|
|
225
|
+
tags:
|
|
226
|
+
- roottemplates
|
|
227
|
+
- gameobjects
|
|
228
|
+
- parenttemplateid
|
|
229
|
+
- scaffold
|
|
230
|
+
- template-exists
|
|
231
|
+
detail: "Which of Type, Stats and ParentTemplateId is individually required was not isolated (all
|
|
232
|
+
three were added at once, matching every loaded template on record: vanilla
|
|
233
|
+
WPN_HUM_Dagger_A_0, a class mod's own _merged.lsf nodes, and the 2026-09-10 chest repro). The
|
|
234
|
+
baldursgate3.new-item scaffold writes all three, taking the parent stat's RootTemplate as
|
|
235
|
+
ParentTemplateId."
|
|
236
|
+
- id: bg3.items.roottemplates.item-displayname-description-icon-live-on-the-roottemplate-not-the-stats-entry
|
|
237
|
+
claim: "An Armor or Weapon item's DisplayName, Description and Icon belong on its RootTemplate
|
|
238
|
+
GameObjects node (DisplayName/Description as TranslatedString attributes with handle=\"h…\"
|
|
239
|
+
version=\"1\", Icon as a FixedString), not as data lines on the stats entry: no vanilla Armor
|
|
240
|
+
or Weapon stats entry carries any of the three, and the Script Extender's stats object for a
|
|
241
|
+
Weapon has no DisplayName property at all (Ext.Stats.Get(\"WPN_Dagger\").DisplayName raises
|
|
242
|
+
\"Property does not exist\"), so a probe reading it can never pass. SpellData entries are
|
|
243
|
+
different: their DisplayName/Description are stats fields."
|
|
244
|
+
status: verified
|
|
245
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
246
|
+
source: ModWright field verification
|
|
247
|
+
tags:
|
|
248
|
+
- roottemplates
|
|
249
|
+
- displayname
|
|
250
|
+
- description
|
|
251
|
+
- icon
|
|
252
|
+
- localization
|
|
253
|
+
- stats
|
|
254
|
+
- scriptextender
|
|
255
|
+
detail: The scaffold's loca rows are unchanged (contentuid = the bare handle, version its own
|
|
256
|
+
attribute); the template references the same bare handle. The bg3.stat.fields probe on an item
|
|
257
|
+
row should ask only for fields the stats object really has (RootTemplate, Slot); ModWright's
|
|
258
|
+
baldursgate3.new-item does so.
|
|
259
|
+
- id: bg3.items.roottemplates.equipmenttypeid-must-be-guid-typed
|
|
260
|
+
claim: On a RootTemplate GameObjects node, EquipmentTypeID must be declared type="guid". Written as
|
|
261
|
+
type="FixedString" — the type its UUID-holding siblings VisualTemplate, ParentTemplateId and
|
|
262
|
+
MapKey correctly use, which is exactly what makes the mistake easy — the engine SILENTLY
|
|
263
|
+
ignores the attribute and falls back to default one-handed weapon handling (held in one hand,
|
|
264
|
+
no back-sheath, wrong attack animation), logging nothing. The wrong type is not a parse error
|
|
265
|
+
and does not fail the build; only the item's behaviour is wrong. A vanilla-corpus audit
|
|
266
|
+
(below) shows the other GUID-typed GameObjects attributes are Faction, EquipmentRace, AiHint,
|
|
267
|
+
DeathEffect, ColorPreset, and Race ON A CHARACTER template — but NOT Race on an item template,
|
|
268
|
+
where Race is a plain int8 flag (value 0/2/-1), not a GUID. The same silent-fallback failure
|
|
269
|
+
on those attributes is inferred by analogy; only the EquipmentTypeID case was field-observed.
|
|
270
|
+
status: verified
|
|
271
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
272
|
+
source: ModWright field verification
|
|
273
|
+
tags:
|
|
274
|
+
- items
|
|
275
|
+
- roottemplate
|
|
276
|
+
- gameobjects
|
|
277
|
+
- equipmenttypeid
|
|
278
|
+
- race
|
|
279
|
+
- faction
|
|
280
|
+
- guid
|
|
281
|
+
- attribute-type
|
|
282
|
+
- silent-fallback
|
|
283
|
+
- gotcha
|
|
284
|
+
related:
|
|
285
|
+
- id: bg3.weapons.custom-equipment-type
|
|
286
|
+
detail: Establishes what EquipmentTypeID references (the custom EquipmentType's UUID, which drives
|
|
287
|
+
idle/ sheath handling and the fallback animation set) — i.e. why the engine treats it as a
|
|
288
|
+
GUID and a FixedString mis-declaration loses the reference.
|
|
289
|
+
detail: "ModWright's bg3.items.roottemplate-guid-attribute-type validator (block) catches this from
|
|
290
|
+
the project's own .lsx with no index or toolchain: it walks every Templates/GameObjects node
|
|
291
|
+
and flags any attribute in a curated allowlist of always-guid RootTemplate attributes
|
|
292
|
+
(EquipmentTypeID, Faction, EquipmentRace, AiHint, DeathEffect, ColorPreset, and Race gated to
|
|
293
|
+
a character-Type node) whose declared type is not \"guid\", naming the file, the attribute and
|
|
294
|
+
the one-line fix. The Race gate is the load-bearing detail: an item template's Race is int8,
|
|
295
|
+
so an ungated rule would emit a block finding — with a \"change to guid\" fix — on every
|
|
296
|
+
faithful vanilla weapon/armor clone. The allowlist is deliberately narrow — the six
|
|
297
|
+
UUID-holding siblings (VisualTemplate, ParentTemplateId, MapKey, Icon,
|
|
298
|
+
CharacterVisualResourceID, PortraitVisualResourceID) are FixedString in vanilla, so a \"any
|
|
299
|
+
UUID-looking value must be guid\" rule would false-positive on all of them — and is extended
|
|
300
|
+
only as more always-guid attributes are confirmed. Object is excluded (guid, but only ever on
|
|
301
|
+
a child Tag/InventoryItem node, never on the GameObjects node itself); DisarmDifficultyClassID
|
|
302
|
+
is excluded (mixed guid/int32 in the corpus)."
|
|
303
|
+
- id: bg3.items.roottemplates.statuslist-gives-an-item-a-permanent-status
|
|
304
|
+
claim: "An item template's StatusList child (node \"StatusList\" > \"Status\" with attribute Object
|
|
305
|
+
= a status name) applies that status to every item created from the template, which is how the
|
|
306
|
+
Everburn Blade and three other vanilla weapons burn forever: their StatusList names
|
|
307
|
+
MAG_FIRE_ALWAYS_DIPPED_FIRE, a BOOST status `using DIPPED_FIRE` with
|
|
308
|
+
StatusEffectOverrideForItems 44d77ebf-fc9e-407d-b20f-257019351f2a (the dip flame),
|
|
309
|
+
StackPriority 10 and Boosts WeaponDamage(1d4, Fire). A mod status `using` it with Boosts \"\"
|
|
310
|
+
keeps the flame without the damage. Existing item instances are not retro-fitted; apply the
|
|
311
|
+
status once with Osi.ApplyStatus(<item>, \"<status>\", -1.0, 1)."
|
|
312
|
+
status: inferred
|
|
313
|
+
source: ModWright research
|
|
314
|
+
tags:
|
|
315
|
+
- roottemplates
|
|
316
|
+
- statuslist
|
|
317
|
+
- status
|
|
318
|
+
- weapon
|
|
319
|
+
- vfx
|
|
320
|
+
- everburn
|