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,214 @@
|
|
|
1
|
+
game: baldursgate3
|
|
2
|
+
topic: journal.quests
|
|
3
|
+
title: Journal structure, quest state DBs, and Osiris quest calls
|
|
4
|
+
facts:
|
|
5
|
+
- id: bg3.journal.quests.questupdate-requires-parent-quest-id
|
|
6
|
+
claim: "\"QuestUpdate always requires the parent quest ID to give out updates, even when updating a
|
|
7
|
+
subquest\" — so QuestUpdate((CHARACTER)_Player, (STRING)_QuestID, (STRING)_EntryID) takes the
|
|
8
|
+
top-level quest's ID in _QuestID and the subquest's entry in _EntryID, never the subquest's
|
|
9
|
+
own ID in _QuestID."
|
|
10
|
+
status: community
|
|
11
|
+
source: docs.baldursgate3.game/index.php?title=Journal:_Osiris_Calls §Functions > QuestUpdate
|
|
12
|
+
tags:
|
|
13
|
+
- journal
|
|
14
|
+
- questupdate
|
|
15
|
+
- subquest
|
|
16
|
+
- silent-failure
|
|
17
|
+
- id: bg3.journal.quests.questupdate-does-not-emit-a-journal-entry-by-itself
|
|
18
|
+
claim: '"The QuestUpdate call will also respect the quest step property to add or close the quest
|
|
19
|
+
for you", but "Adding or Closing a quest does not automatically give you a journal update...
|
|
20
|
+
You will always want to provide a quest update after adding or before closing a quest."'
|
|
21
|
+
status: community
|
|
22
|
+
source: docs.baldursgate3.game/index.php?title=Journal:_Osiris_Calls §Functions > QuestUpdate
|
|
23
|
+
tags:
|
|
24
|
+
- journal
|
|
25
|
+
- questupdate
|
|
26
|
+
- quest-state
|
|
27
|
+
- gotcha
|
|
28
|
+
- id: bg3.journal.quests.questupdate-two-arg-overload-implicit-player
|
|
29
|
+
claim: QuestUpdate has a two-argument overload, QuestUpdate((STRING)_QuestID, (STRING)_EntryID),
|
|
30
|
+
that omits the player parameter "since the quest is shared, everybody should get the update
|
|
31
|
+
anyway"; it "Overloads the engine call" (the three-argument version).
|
|
32
|
+
status: community
|
|
33
|
+
source: docs.baldursgate3.game/index.php?title=Journal:_Osiris_Calls §Functions > QuestUpdate
|
|
34
|
+
tags:
|
|
35
|
+
- journal
|
|
36
|
+
- questupdate
|
|
37
|
+
- overload
|
|
38
|
+
- id: bg3.journal.quests.questadd-questclose-should-be-avoided
|
|
39
|
+
claim: "QuestAdd and QuestClose exist for manually unlocking/closing a quest, but the documentation
|
|
40
|
+
recommends against both: \"It's better to avoid starting quests with this call and instead
|
|
41
|
+
rely on QuestUpdate\" and \"It's better to avoid closing quests with this call and instead
|
|
42
|
+
rely on QuestUpdate.\""
|
|
43
|
+
status: community
|
|
44
|
+
source: docs.baldursgate3.game/index.php?title=Journal:_Osiris_Calls §Functions > QuestAdd, >
|
|
45
|
+
QuestClose
|
|
46
|
+
tags:
|
|
47
|
+
- journal
|
|
48
|
+
- questadd
|
|
49
|
+
- questclose
|
|
50
|
+
- best-practice
|
|
51
|
+
- id: bg3.journal.quests.questupdateunlocked-reports-top-level-quest-id
|
|
52
|
+
claim: The QuestUpdateUnlocked event always receives the top-level parent quest as its _QuestID
|
|
53
|
+
parameter, even when the update that was unlocked belongs to a subquest;
|
|
54
|
+
SubQuestUpdateUnlocked is the separate event that fires specifically for subquest updates and
|
|
55
|
+
receives the subquest ID instead.
|
|
56
|
+
status: community
|
|
57
|
+
source: docs.baldursgate3.game/index.php?title=Journal:_Osiris_Calls §Events > QuestUpdateUnlocked,
|
|
58
|
+
> SubQuestUpdateUnlocked
|
|
59
|
+
tags:
|
|
60
|
+
- journal
|
|
61
|
+
- events
|
|
62
|
+
- subquest
|
|
63
|
+
- questupdateunlocked
|
|
64
|
+
- id: bg3.journal.quests.questisclosed-false-until-explicitly-closed
|
|
65
|
+
claim: The QuestIsClosed query "always returns false if the quest has not yet been explicitly
|
|
66
|
+
closed, even while it has not yet been accepted/added/opened/unlocked" — it does not
|
|
67
|
+
distinguish "not yet started" from "not yet closed."
|
|
68
|
+
status: community
|
|
69
|
+
source: docs.baldursgate3.game/index.php?title=Journal:_Osiris_Calls §Queries > QuestIsClosed
|
|
70
|
+
tags:
|
|
71
|
+
- journal
|
|
72
|
+
- questisclosed
|
|
73
|
+
- query
|
|
74
|
+
- gotcha
|
|
75
|
+
detail: "Separate caution for Script Extender work: this is the in-story Osiris query. Reading
|
|
76
|
+
Osiris queries through SE's Osi bridge is separately unreliable in the build recorded here —
|
|
77
|
+
see bg3.se.osi-queries-broken-actions-work (verified: Osi actions work, Osi queries return
|
|
78
|
+
junk)."
|
|
79
|
+
- id: bg3.journal.quests.db-questdef-state-reacts-to-flag
|
|
80
|
+
claim: "DB_QuestDef_State(_Flag, _Quest, _Update) is a declarative database: defining it unlocks
|
|
81
|
+
_Update in _Quest as soon as _Flag is set. If _Flag is global, the update unlocks for every
|
|
82
|
+
player; otherwise it unlocks only for the specific character the flag was set on."
|
|
83
|
+
status: community
|
|
84
|
+
source: docs.baldursgate3.game/index.php?title=Journal:_DB_Helpers §Declarative Databases ("When
|
|
85
|
+
_Flag is set, unlock _Update in _Quest")
|
|
86
|
+
tags:
|
|
87
|
+
- journal
|
|
88
|
+
- db-questdef-state
|
|
89
|
+
- declarative-database
|
|
90
|
+
- flags
|
|
91
|
+
- id: bg3.journal.quests.db-questdef-chainedstate-links-entries
|
|
92
|
+
claim: DB_QuestDef_ChainedState(_Quest, _Step, _NewStep) declares that unlocking _Step in _Quest
|
|
93
|
+
automatically unlocks _NewStep in the same quest; a 4-parameter overload,
|
|
94
|
+
DB_QuestDef_ChainedState(_Quest, _Step, _NewQuest, _NewStep), links a step in one quest to a
|
|
95
|
+
step in a different quest.
|
|
96
|
+
status: community
|
|
97
|
+
source: docs.baldursgate3.game/index.php?title=Journal:_DB_Helpers §Linking Quest Entries ("When
|
|
98
|
+
_Step in _Quest is unlocked, so is _NewStep [in _NewQuest]")
|
|
99
|
+
tags:
|
|
100
|
+
- journal
|
|
101
|
+
- db-questdef-chainedstate
|
|
102
|
+
- declarative-database
|
|
103
|
+
- id: bg3.journal.quests.db-questdef-conditionalstate-defined-multiple-times
|
|
104
|
+
claim: DB_QuestDef_ConditionalState (in its 5/6/7-parameter forms) works like
|
|
105
|
+
DB_QuestDef_ChainedState but can be defined multiple times for the same unlock, letting an
|
|
106
|
+
entry unlock conditionally on different combinations of a separate step's boolean state.
|
|
107
|
+
status: community
|
|
108
|
+
source: docs.baldursgate3.game/index.php?title=Journal:_DB_Helpers §Entries Conditional to Other
|
|
109
|
+
Entries ("Similar to DB_QuestDef_ChainedState, but they can be defined multiple times")
|
|
110
|
+
tags:
|
|
111
|
+
- journal
|
|
112
|
+
- db-questdef-conditionalstate
|
|
113
|
+
- declarative-database
|
|
114
|
+
- id: bg3.journal.quests.qry-questdef-blockquestupdate-is-the-exception-hook
|
|
115
|
+
claim: QRY_QuestDef_BlockQuestUpdate((CHARACTER)_Player, (STRING)_Quest, (STRING)_Update) is checked
|
|
116
|
+
by every declarative database rule before it calls QuestUpdate; defining this query to return
|
|
117
|
+
false for a specific player/quest/update combination is the documented way to carve out a
|
|
118
|
+
last-minute exception to an otherwise-automatic quest-state rule.
|
|
119
|
+
status: community
|
|
120
|
+
source: docs.baldursgate3.game/index.php?title=Journal:_DB_Helpers §Adding Exceptions to Declarative
|
|
121
|
+
Database Rules ("Every declarative database rule will also check if this QRY returns false
|
|
122
|
+
before calling the QuestUpdate")
|
|
123
|
+
tags:
|
|
124
|
+
- journal
|
|
125
|
+
- qry-questdef-blockquestupdate
|
|
126
|
+
- exception
|
|
127
|
+
- id: bg3.journal.quests.db-questdef-companionleft-reason-steps
|
|
128
|
+
claim: "DB_QuestDef_State_CompanionLeft((TAG)_CompanionTag, (STRING)_Quest, (STRING)_Reason) links a
|
|
129
|
+
companion's REALLY_ORIGIN tag to that companion's journal quest and to a _Reason, which is \"a
|
|
130
|
+
quest step defined in the journal; it explains the reason for the companion leaving\". Three
|
|
131
|
+
_Reason steps \"are generic and should be defined in any companion's journal\":
|
|
132
|
+
CompanionLowRelation, CompanionMurdered, CompanionHostile."
|
|
133
|
+
status: community
|
|
134
|
+
source: docs.baldursgate3.game/index.php?title=Journal:_DB_Helpers §Companions ("_CompanionTag
|
|
135
|
+
refers to the REALLY_ORIGIN tag a companion has")
|
|
136
|
+
tags:
|
|
137
|
+
- journal
|
|
138
|
+
- companion
|
|
139
|
+
- db-questdef-companionleft
|
|
140
|
+
- tags
|
|
141
|
+
detail: PROC_Origins_CompanionLeavePermanently() is what writes the reason step, picking
|
|
142
|
+
CompanionLowRelation by default, CompanionMurder if GLO_Companion_Murder is set, or
|
|
143
|
+
CompanionHostile if GLO_Companion_Combat is set — so a custom companion missing those three
|
|
144
|
+
steps loses the default leave-reason updates.
|
|
145
|
+
- id: bg3.journal.quests.level-transition-dbs-close-on-point-of-no-return
|
|
146
|
+
claim: DB_QuestDef_LevelLoaded and DB_QuestDef_LevelUnloading fire (via PROC_LevelLoadedOnce /
|
|
147
|
+
PROC_LevelUnloading respectively) to give a quest update to all players on entering or leaving
|
|
148
|
+
a named level; their documented typical use is closing quest entries a player can no longer
|
|
149
|
+
complete once they progress past a region they can't return to.
|
|
150
|
+
status: community
|
|
151
|
+
source: 'docs.baldursgate3.game/index.php?title=Journal:_DB_Helpers §Leaving/Entering a Region
|
|
152
|
+
("Typical use: For closing entries, when a quest must close when the player progresses to the
|
|
153
|
+
next region")'
|
|
154
|
+
tags:
|
|
155
|
+
- journal
|
|
156
|
+
- level-transition
|
|
157
|
+
- db-questdef-levelloaded
|
|
158
|
+
- id: bg3.journal.quests.party-shared-state-dbs-checked-not-defined
|
|
159
|
+
claim: DB_QuestIsAccepted(_QuestID), DB_QuestIsOpened(_QuestID), and DB_QuestIsClosed(_QuestID) are
|
|
160
|
+
set automatically by the engine and are meant to be checked, not defined by mod authors; all
|
|
161
|
+
three also apply to subquests, not only top-level quests.
|
|
162
|
+
status: community
|
|
163
|
+
source: docs.baldursgate3.game/index.php?title=Journal:_DB_Helpers §Party Shared Quest State ("These
|
|
164
|
+
DBs are set automatically and can be checked"; "Subquests are also added to the above DBs")
|
|
165
|
+
tags:
|
|
166
|
+
- journal
|
|
167
|
+
- party-shared-state
|
|
168
|
+
- database
|
|
169
|
+
- id: bg3.journal.quests.questupdate-helper-queries-signatures
|
|
170
|
+
claim: "Three generated helper queries exist alongside QuestUpdate: QuestUpdateExists(questID,
|
|
171
|
+
stateID), QuestUpdateGetTopLevel(questID, stateID), and QuestUpdateIsUnlocked(character,
|
|
172
|
+
quest, update) — the latter taking a character parameter the first two don't, confirming it is
|
|
173
|
+
the per-player unlock check rather than a global existence check."
|
|
174
|
+
status: verified
|
|
175
|
+
source: LaughingLeader/BG3ModdingTools@ab343b6 generated/Osi.lua:1988 (QuestUpdateExists), :1993
|
|
176
|
+
(QuestUpdateGetTopLevel), :1999 (QuestUpdateIsUnlocked)
|
|
177
|
+
detail: "Checked against the source (2026-09-08): `verified_on` removed — read from a generated stub
|
|
178
|
+
file that names no game version. Verified as declared signatures only; what the queries return
|
|
179
|
+
at runtime was not observed."
|
|
180
|
+
tags:
|
|
181
|
+
- journal
|
|
182
|
+
- questupdate
|
|
183
|
+
- signature
|
|
184
|
+
- osiris
|
|
185
|
+
- id: bg3.journal.quests.questupdaterevert-and-questcloseverted-exist
|
|
186
|
+
claim: Beyond QuestUpdate/QuestAdd/QuestClose, the generated stubs also declare
|
|
187
|
+
QuestUpdateRevert(character, questID, stateID) as a call and QuestCloseReverted(questID) as an
|
|
188
|
+
event. The existence of a revert call and a revert event is all the stub file shows; no source
|
|
189
|
+
read here documents what reverting does or when the event fires.
|
|
190
|
+
status: verified
|
|
191
|
+
source: LaughingLeader/BG3ModdingTools@ab343b6 generated/Osi.lua:3583 (QuestUpdateRevert);
|
|
192
|
+
generated/Osi.Events.lua:864 (QuestCloseReverted). Osi.Events.lua:875 also declares
|
|
193
|
+
QuestUpdateUnlockReverted(character, topLevelQuestID, stateID)
|
|
194
|
+
tags:
|
|
195
|
+
- journal
|
|
196
|
+
- questupdaterevert
|
|
197
|
+
- questclosereverted
|
|
198
|
+
- signature
|
|
199
|
+
- id: bg3.journal.quests.questupdatemessagecounter-adjusts-message-count
|
|
200
|
+
claim: Osi.QuestUpdateMessageCounter(messageId, deltaUpdateAmount) is a separate call from
|
|
201
|
+
QuestUpdate that adjusts a message/notification counter by a delta amount rather than
|
|
202
|
+
unlocking a journal entry — its existence in the generated stub file means a mod could
|
|
203
|
+
increment or decrement a quest-related counter without triggering a full QuestUpdate.
|
|
204
|
+
status: inferred
|
|
205
|
+
source: LaughingLeader/BG3ModdingTools@ab343b6 generated/Osi.lua:3576-3578
|
|
206
|
+
tags:
|
|
207
|
+
- journal
|
|
208
|
+
- questupdatemessagecounter
|
|
209
|
+
- signature
|
|
210
|
+
detail: Inferred from the function name and parameter names alone (messageId, deltaUpdateAmount) —
|
|
211
|
+
neither the community Journal:Osiris_Calls page nor any other source on disk documents this
|
|
212
|
+
call's semantics or when the engine invokes the corresponding
|
|
213
|
+
QuestUpdateUnlockReverted/QuestUpdateUnlocked events that appear alongside it in
|
|
214
|
+
Osi.Events.lua.
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
game: baldursgate3
|
|
2
|
+
topic: loadorder.modsettings
|
|
3
|
+
title: Load order, modsettings.lsx, and dependency resolution
|
|
4
|
+
facts:
|
|
5
|
+
- id: bg3.loadorder.external-guid-dependencies
|
|
6
|
+
claim: "Borrowing another mod's assets (a RootTemplate referencing a VisualTemplate /
|
|
7
|
+
EquipmentTypeID — or any resource GUID — defined in a different mod) creates a load-order
|
|
8
|
+
dependency: that mod must be enabled AND ordered before yours in modsettings.lsx. If it is
|
|
9
|
+
missing from the enabled list the game CTDs at LoadModule — no dangling-name error, and your
|
|
10
|
+
own reference-checker stays green because the name resolves fine inside your files."
|
|
11
|
+
status: verified
|
|
12
|
+
source: ModWright field verification
|
|
13
|
+
tags:
|
|
14
|
+
- load-order
|
|
15
|
+
- dependencies
|
|
16
|
+
- guids
|
|
17
|
+
- roottemplate
|
|
18
|
+
detail: "A class mod hit this while borrowing Whips Expanded / BetterWhips assets (VisualTemplate
|
|
19
|
+
1c66562c, EquipmentTypeID e9b4ae39): the mod must load AFTER BetterWhips or these refs won't
|
|
20
|
+
resolve. The crash looks like your own bug. Referencing a GUID is not the same as defining it
|
|
21
|
+
— both mods can reference a third."
|
|
22
|
+
- id: bg3.loadorder.modsettings-crash-guard
|
|
23
|
+
claim: BG3's crash-guard auto-disables a mod after repeated crashes (the in-game manager shows it
|
|
24
|
+
off even though modsettings still lists it; the save screen shows a "Mod Verification /
|
|
25
|
+
Missing or Disabled" checkbox). Every launch test after a crash streak must confirm the module
|
|
26
|
+
was actually ACTIVE, or the "it loads now" result is meaningless.
|
|
27
|
+
status: verified
|
|
28
|
+
source: ModWright field verification
|
|
29
|
+
tags:
|
|
30
|
+
- load-order
|
|
31
|
+
- crash-guard
|
|
32
|
+
- auto-disable
|
|
33
|
+
detail: '"Half our bisect arms were confounded by this" during the 2026-08-31 launch-CTD marathon.'
|
|
34
|
+
- id: bg3.loadorder.modsettings-not-durable
|
|
35
|
+
claim: A hand-added modsettings.lsx entry is not durable — a mod-manager deploy (Vortex) rewrites
|
|
36
|
+
the file and silently drops it, so a previously-working setup starts crashing with no content
|
|
37
|
+
change on your side. The in-game mod manager also rewrites modsettings.lsx when the mod list
|
|
38
|
+
is edited and strips hand-inserted loose-mod entries.
|
|
39
|
+
status: verified
|
|
40
|
+
source: ModWright field verification
|
|
41
|
+
tags:
|
|
42
|
+
- load-order
|
|
43
|
+
- modsettings
|
|
44
|
+
- vortex
|
|
45
|
+
- volatility
|
|
46
|
+
detail: 'Suspect this whenever a build that loaded fine starts CTDing after an unrelated repack.
|
|
47
|
+
Back the file up before editing; validate with [xml]$x = Get-Content ... -Raw afterwards. Grep
|
|
48
|
+
gotchas that cause false "not found" conclusions here: PowerShell Select-String -SimpleMatch
|
|
49
|
+
treats a|b as a literal string, and -Path treats [PAK]-style brackets as wildcards (use
|
|
50
|
+
-LiteralPath or [System.IO.File]::ReadAllText).'
|
|
51
|
+
- id: bg3.loadorder.dependency-diagnostic
|
|
52
|
+
claim: "To diagnose a load-order CTD: (1) tail bin\\network.*.log — LoadModule means module/asset
|
|
53
|
+
load, not a level transition (bin\\CrashDump*.dmp timestamps confirm the attempt). (2) Extract
|
|
54
|
+
the deployed pak and convert RootTemplates/_merged.lsf to lsx; grep VisualTemplate /
|
|
55
|
+
EquipmentTypeID values. (3) For each external GUID, extract the candidate provider pak and
|
|
56
|
+
confirm it DEFINES it (a VisualBank region _merged.lsf <attribute id=\"ID\" ...>, or
|
|
57
|
+
EquipmentTypes.lsx UUID). (4) Check the enabled list in %LOCALAPPDATA%\\Larian
|
|
58
|
+
Studios\\Baldur's Gate 3\\PlayerProfiles\\Public\\modsettings.lsx (order = top-to-bottom; the
|
|
59
|
+
dependency must come first)."
|
|
60
|
+
status: verified
|
|
61
|
+
source: ModWright field verification
|
|
62
|
+
tags:
|
|
63
|
+
- load-order
|
|
64
|
+
- dependencies
|
|
65
|
+
- diagnostic
|
|
66
|
+
detail: This is the standard dependency debugging workflow; the crash looks like a content bug until
|
|
67
|
+
you trace the GUID origins.
|
|
68
|
+
- id: bg3.loadorder.modmanager-skips-order-entries-with-no-local-mod-match
|
|
69
|
+
claim: "When BG3 Mod Manager builds its final dependency-resolved output list (BuildOutputList) from
|
|
70
|
+
a load order, an order entry whose UUID does not match any mod the manager has actually
|
|
71
|
+
indexed on disk is logged as \"[*ERROR*] Missing mod for mod in order: '<Name>'.\" and
|
|
72
|
+
excluded from the built list, rather than the build failing outright. BuildOutputList also
|
|
73
|
+
skips order entries already flagged Missing before it starts (`order.Where(x =>
|
|
74
|
+
!x.Missing)`)."
|
|
75
|
+
status: verified
|
|
76
|
+
source: LaughingLeader/BG3ModManager@fc35358 src/Core/Util/DivinityModDataLoader.cs:1431-1465
|
|
77
|
+
(BuildOutputList; the log line at :1462)
|
|
78
|
+
tags:
|
|
79
|
+
- load-order
|
|
80
|
+
- missing-mod
|
|
81
|
+
- bg3modmanager
|
|
82
|
+
- silent-omission
|
|
83
|
+
related:
|
|
84
|
+
- id: bg3.loadorder.modsettings-crash-guard
|
|
85
|
+
detail: "A different mechanism producing a similar symptom: here the mod manager itself quietly
|
|
86
|
+
drops an order entry it cannot resolve locally, distinct from the game's own crash-guard
|
|
87
|
+
auto-disabling a mod after a crash streak — both can make an \"enabled\" mod not actually
|
|
88
|
+
end up active."
|
|
89
|
+
- id: bg3.loadorder.modsettings-not-rewritten-by-a-plain-launch
|
|
90
|
+
claim: "Launching the game and loading a save does not by itself rewrite modsettings.lsx: the file
|
|
91
|
+
keeps its previous content and modification time across launches, and its ModuleShortDesc
|
|
92
|
+
Folder attribute therefore records the module folder the mod manager last bound the UUID to,
|
|
93
|
+
not the copy the running game loaded. It is rewritten when the mod list is edited (the in-game
|
|
94
|
+
manager, Vortex, BG3 Mod Manager)."
|
|
95
|
+
status: verified
|
|
96
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
97
|
+
source: ModWright field verification
|
|
98
|
+
tags:
|
|
99
|
+
- load-order
|
|
100
|
+
- modsettings
|
|
101
|
+
- launch
|
|
102
|
+
- folder
|
|
103
|
+
- uuid
|
|
104
|
+
detail: "Consequence for diagnosis: with several installed copies of one UUID, the Folder attribute
|
|
105
|
+
cannot tell you which copy the game bound to at the last launch; read the content back through
|
|
106
|
+
the Script Extender (Ext.Stats.Get on an entry unique to one copy, or ModWright's
|
|
107
|
+
bg3.stat.exists probe) instead. ModWright's own load_order guidance used to say the game
|
|
108
|
+
\"rewrites modsettings.lsx on launch\"; that is the mod-manager case in
|
|
109
|
+
bg3.loadorder.modsettings-not-durable, not a plain launch."
|
|
110
|
+
- id: bg3.loadorder.profile-activemods-drives-current-order-not-modsettings-order-alone
|
|
111
|
+
claim: BG3 Mod Manager reconstructs "the current load order" from a profile by reading the
|
|
112
|
+
ActiveMods list recorded under modsettings.lsx's Mods node and matching each entry's UUID
|
|
113
|
+
against its own indexed mod list in that same sequence, skipping any UUID it cannot match —
|
|
114
|
+
the DivinityProfileData model documents ActiveMods explicitly as "The mod data under the Mods
|
|
115
|
+
node, from modsettings.lsx".
|
|
116
|
+
status: verified
|
|
117
|
+
source: LaughingLeader/BG3ModManager@fc35358 src/Core/Models/DivinityProfileData.cs:21-24 (the
|
|
118
|
+
ActiveMods field and its doc comment), :26-39 (GetLoadOrder walking ActiveMods in order)
|
|
119
|
+
detail: "Inference, not in the source: because the manager rebuilds \"Current\" purely from that
|
|
120
|
+
list, the Mods node's child order in modsettings.lsx is the order it reflects back — there is
|
|
121
|
+
no separate order file involved in this path. Checked against the source (2026-09-08):
|
|
122
|
+
`verified_on` removed; this is read from the mod manager's source, which names no game
|
|
123
|
+
version."
|
|
124
|
+
tags:
|
|
125
|
+
- load-order
|
|
126
|
+
- modsettings
|
|
127
|
+
- activemods
|
|
128
|
+
- bg3modmanager
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
game: baldursgate3
|
|
2
|
+
topic: localization.handles
|
|
3
|
+
title: Localization handles, UUID mapping, and field-specific formatting
|
|
4
|
+
facts:
|
|
5
|
+
- id: bg3.loca.handle-is-uuid-with-g-separators
|
|
6
|
+
claim: 'A loca handle IS a UUID with an h prefix and dashes→g: uuid abcd1234-... ↔ handle
|
|
7
|
+
habcd1234g.... The game shows "Not Found" for a human-readable handle such as
|
|
8
|
+
h_Em_Example_DisplayName.'
|
|
9
|
+
status: verified
|
|
10
|
+
source: ModWright field verification
|
|
11
|
+
tags:
|
|
12
|
+
- localization
|
|
13
|
+
- handles
|
|
14
|
+
- uuid
|
|
15
|
+
- format
|
|
16
|
+
detail: 'Generate deterministically: "h" + str(uuid.uuid5(MOD_UUID, key)).replace("-","g"). All four
|
|
17
|
+
dashes of the UUID become g characters; the underlying UUID is unchanged.'
|
|
18
|
+
- id: bg3.loca.display-name-format
|
|
19
|
+
claim: Stat fields DisplayName and Description use the h..g..;<version> handle form. But some fields
|
|
20
|
+
(TooltipUpcastDescription, ExtraDescription) take the raw dash-UUID form (abcd1234-...). Match
|
|
21
|
+
the form the field expects; the underlying UUID is the same.
|
|
22
|
+
status: verified
|
|
23
|
+
source: ModWright field verification
|
|
24
|
+
tags:
|
|
25
|
+
- localization
|
|
26
|
+
- handles
|
|
27
|
+
- field-specific
|
|
28
|
+
- format
|
|
29
|
+
detail: The engine maps the raw dash-UUID form to the same loca entry. This inconsistency is a
|
|
30
|
+
common mistake source.
|
|
31
|
+
- id: bg3.loca.xml-location-and-format
|
|
32
|
+
claim: Loca lives in Mods/<Mod>/Localization/English/<Mod>.xml as <content contentuid="h..."
|
|
33
|
+
version="1">text</content>. The .xml must be compiled to the binary .loca, which is what ships
|
|
34
|
+
in the pak and is required at runtime.
|
|
35
|
+
status: verified
|
|
36
|
+
source: ModWright field verification
|
|
37
|
+
tags:
|
|
38
|
+
- localization
|
|
39
|
+
- xml
|
|
40
|
+
- loca
|
|
41
|
+
- format
|
|
42
|
+
detail: Compile with Divine.exe -g bg3 -a convert-loca -s <src>.xml -d <out>.loca. See
|
|
43
|
+
bg3.toolchain.loca-compilation.
|
|
44
|
+
- id: bg3.loca.description-params-inheritance
|
|
45
|
+
claim: DescriptionParams only substitutes into [1]-style placeholders; harmless if the text has
|
|
46
|
+
none, but inherited params (via `using`) can be stale — clear them when reskinning.
|
|
47
|
+
status: verified
|
|
48
|
+
source: ModWright field verification
|
|
49
|
+
tags:
|
|
50
|
+
- localization
|
|
51
|
+
- params
|
|
52
|
+
- reskin
|
|
53
|
+
- inheritance
|
|
54
|
+
detail: Set DescriptionParams "" to clear inherited params that no longer apply to the reskinned
|
|
55
|
+
spell/item.
|
|
56
|
+
- id: bg3.loca.entry-version-is-uint16
|
|
57
|
+
claim: A compiled .loca entry's Version field (the number after the ";" in a handle reference such
|
|
58
|
+
as "h...;<version>", and the same number as the .xml content tag's version attribute) is
|
|
59
|
+
stored as a 16-bit unsigned integer in the binary format — a version number above 65535 cannot
|
|
60
|
+
be represented and would wrap or fail to compile correctly.
|
|
61
|
+
status: inferred
|
|
62
|
+
source: Norbyte/lslib@6f5f698 LSLib/LS/Localization.cs:22 (`public UInt16 Version;` in LocaEntry)
|
|
63
|
+
tags:
|
|
64
|
+
- localization
|
|
65
|
+
- loca
|
|
66
|
+
- version
|
|
67
|
+
- binary-format
|
|
68
|
+
detail: Inferred from the struct field type (UInt16 Version) rather than observed failing — no
|
|
69
|
+
vanilla or known mod content has been checked against this ceiling, but no hand-authored mod
|
|
70
|
+
is likely to approach it either, since version numbers only increment when a line's text
|
|
71
|
+
changes.
|
|
72
|
+
- id: bg3.loca.magic-signature-and-numentries-header
|
|
73
|
+
claim: A compiled .loca file opens with a 4-byte magic signature spelling 'LOCA' (0x41434f4c)
|
|
74
|
+
followed by a uint32 entry count and a uint32 byte offset where the actual text payload
|
|
75
|
+
begins; LSLib's reader throws "Incorrect signature in localization file" on any file that
|
|
76
|
+
doesn't start with that exact magic.
|
|
77
|
+
status: verified
|
|
78
|
+
source: "Norbyte/lslib@6f5f698 LSLib/LS/Localization.cs:5-13 (LocaHeader:
|
|
79
|
+
Signature/NumEntries/TextsOffset, DefaultSignature 0x41434f4c), :75-80 (the signature check
|
|
80
|
+
and its InvalidDataException)"
|
|
81
|
+
detail: "Checked against the source (2026-09-08): `verified_on` removed — read from LSLib's source,
|
|
82
|
+
which names no game version."
|
|
83
|
+
tags:
|
|
84
|
+
- localization
|
|
85
|
+
- loca
|
|
86
|
+
- binary-format
|
|
87
|
+
- magic-signature
|
|
88
|
+
related:
|
|
89
|
+
- id: bg3.loca.xml-location-and-format
|
|
90
|
+
detail: Adds the compiled .loca file's exact binary header shape underneath the already-verified
|
|
91
|
+
statement that .loca is what ships in the pak and is required at runtime — this is the
|
|
92
|
+
format LSLib's reader validates before trusting the rest of the file.
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
game: baldursgate3
|
|
2
|
+
topic: misc.encoding-and-practice
|
|
3
|
+
title: Version encoding, UTF-8 handling, reference checking, and development practices
|
|
4
|
+
facts:
|
|
5
|
+
- id: bg3.encoding.version64-format
|
|
6
|
+
claim: "Mod version in meta.lsx: Version64 = (major<<55) | (minor<<47) | (revision<<31) | build.
|
|
7
|
+
Decode/encode in Python: def enc(ma,mi,rev,bld): return (ma<<55)|(mi<<47)|(rev<<31)|bld; def
|
|
8
|
+
dec(v): return (v>>55, (v>>47)&0xFF, (v>>31)&0xFFFF, v&0x7FFFFFFF). Bump revision for
|
|
9
|
+
iterative builds. Bumping the version does NOT break loading an existing save."
|
|
10
|
+
status: verified
|
|
11
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
12
|
+
source: ModWright field verification
|
|
13
|
+
tags:
|
|
14
|
+
- version
|
|
15
|
+
- encoding
|
|
16
|
+
- meta.lsx
|
|
17
|
+
detail: The revision field (bits 31–46) is the primary field for dev iteration; major/minor rarely
|
|
18
|
+
change.
|
|
19
|
+
- id: bg3.encoding.utf8-bom-corruption
|
|
20
|
+
claim: PowerShell 5.1 Set-Content -Encoding utf8 writes a UTF-8 BOM — stats .txt and .lsx files must
|
|
21
|
+
stay BOM-less. Use Python or careful byte writes for surgical edits to game-parsed files.
|
|
22
|
+
status: verified
|
|
23
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
24
|
+
source: ModWright field verification
|
|
25
|
+
tags:
|
|
26
|
+
- encoding
|
|
27
|
+
- utf-8
|
|
28
|
+
- bom
|
|
29
|
+
- powershell
|
|
30
|
+
detail: The BOM is invisible but breaks parsing. Found in the 2026-08-31 launch-CTD bisect.
|
|
31
|
+
- id: bg3.practice.reference-checker-invaluable
|
|
32
|
+
claim: A static reference checker — a script that verifies every
|
|
33
|
+
SpellList/DefaultValues/SelectSpells/ApplyStatus/RootSpellID/`using` reference resolves
|
|
34
|
+
against your stats plus a vanilla stats extract — catches the dangling-ref CTDs before
|
|
35
|
+
packing. Invaluable; run it before every pack.
|
|
36
|
+
status: verified
|
|
37
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
38
|
+
source: ModWright field verification
|
|
39
|
+
tags:
|
|
40
|
+
- tools
|
|
41
|
+
- reference-checking
|
|
42
|
+
- automation
|
|
43
|
+
detail: A class mod's reference-checking script is the reference implementation; it later grew drift
|
|
44
|
+
checks for hardcoded enumerations (the per-slot SpellId enumeration behind an on-cast charge
|
|
45
|
+
passive).
|
|
46
|
+
- id: bg3.practice.diagnostic-with-every-fix
|
|
47
|
+
claim: Pair a diagnostic with every bug-fix from the first attempt. Don't ship a blind fix and wait
|
|
48
|
+
a relaunch cycle. A visible marker (a temporary distinctive boost, a visible status, an SE
|
|
49
|
+
print/dump) gives ground truth in one cycle instead of guessing over many.
|
|
50
|
+
status: verified
|
|
51
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
52
|
+
source: ModWright field verification
|
|
53
|
+
tags:
|
|
54
|
+
- testing
|
|
55
|
+
- diagnostics
|
|
56
|
+
- debugging
|
|
57
|
+
detail: A spell-slot-display bug cost 3 blind cycles before an SE Ext.StaticData dump gave the
|
|
58
|
+
answer in one, and a character-level weapon gate was proven dead in one cycle by pairing it
|
|
59
|
+
with a visible "+1 Thunder" marker.
|
|
60
|
+
- id: bg3.practice.unproven-token-verification
|
|
61
|
+
claim: When a token/mechanism is unproven (no vanilla precedent), assume it may not work and verify
|
|
62
|
+
with a diagnostic before building a whole system on it.
|
|
63
|
+
status: verified
|
|
64
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
65
|
+
source: ModWright field verification
|
|
66
|
+
tags:
|
|
67
|
+
- testing
|
|
68
|
+
- verification
|
|
69
|
+
- risky-patterns
|
|
70
|
+
detail: "Example: IsWeaponOfProficiencyGroup in an equip passive's Boosts had zero vanilla precedent
|
|
71
|
+
and was proven in-game on a gloves item before being relied on (see
|
|
72
|
+
bg3.weapons.weapon-category-gated-equipment-bonus)."
|
|
73
|
+
- id: bg3.practice.incremental-testing
|
|
74
|
+
claim: Test after every addition — don't stack multiple untested features. A static
|
|
75
|
+
reference-checker catches dangling-ref CTDs, but functor/status-field errors only surface
|
|
76
|
+
in-engine (usually logged, sometimes CTD). If a batch breaks, bisect.
|
|
77
|
+
status: verified
|
|
78
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
79
|
+
source: ModWright field verification
|
|
80
|
+
tags:
|
|
81
|
+
- testing
|
|
82
|
+
- incremental
|
|
83
|
+
- bisect
|
|
84
|
+
detail: One untested phase stacked on another was the core failure mode of an earlier mod; the class
|
|
85
|
+
mod's workflow that followed has a per-phase testing checklist for this reason.
|
|
86
|
+
- id: bg3.practice.se-console-dumps
|
|
87
|
+
claim: 'An SE console dump (Ext.StaticData) settles "is my data wrong or is the UI wrong" questions:
|
|
88
|
+
it shows what the engine actually loaded. The Class Features investigation used it to prove
|
|
89
|
+
the ProgressionDescriptions and progression table were loaded and correct, which moved the bug
|
|
90
|
+
to the UI side.'
|
|
91
|
+
status: verified
|
|
92
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
93
|
+
source: ModWright field verification
|
|
94
|
+
tags:
|
|
95
|
+
- testing
|
|
96
|
+
- script-extender
|
|
97
|
+
- diagnostics
|
|
98
|
+
detail: The dump confirmed 9 ProgressionDescriptions loaded and matched to the exact boosts, the
|
|
99
|
+
progression table loaded with 13 nodes, and 419 ProgressionDescriptions / 1019 Progressions in
|
|
100
|
+
static data overall.
|
|
101
|
+
- id: bg3.practice.manual-path-first
|
|
102
|
+
claim: If a manual/GUI path is >99% likely to work and the headless path is unproven, OFFER THE
|
|
103
|
+
MANUAL PATH FIRST.
|
|
104
|
+
status: community
|
|
105
|
+
source: ModWright research
|
|
106
|
+
tags:
|
|
107
|
+
- practice
|
|
108
|
+
- automation
|
|
109
|
+
- manual
|
|
110
|
+
detail: 'A behavioural rule for assistants rather than a BG3 engine fact: automate what is certain,
|
|
111
|
+
offer manual routes when they are safer. The CP2077 "sector saga" violated it and cost time.'
|