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,293 @@
|
|
|
1
|
+
game: baldursgate3
|
|
2
|
+
topic: stats.boosts
|
|
3
|
+
title: Boost mechanics, BoostContext, BoostConditions, and conditional evaluation
|
|
4
|
+
facts:
|
|
5
|
+
- id: bg3.boosts.boostcontext-evaluation-events
|
|
6
|
+
claim: BoostContext is the list of events on which the engine EVALUATES a boost — it is not a
|
|
7
|
+
"re-check as well" hint. Omit the event that represents initial evaluation and the boost never
|
|
8
|
+
applies at all with no error. ~42 of ~46 vanilla usages include OnCreate (OnEquip;OnCreate
|
|
9
|
+
×20, bare OnCreate ×18).
|
|
10
|
+
status: verified
|
|
11
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
12
|
+
source: ModWright field verification
|
|
13
|
+
tags:
|
|
14
|
+
- boost
|
|
15
|
+
- boostcontext
|
|
16
|
+
- oncreate
|
|
17
|
+
- silent-failure
|
|
18
|
+
detail: "A class mod's on-cast charge passive shipped completely inert (no icon glow, slot still
|
|
19
|
+
consumed, no on-cast damage) for a full relaunch cycle, while the toggle itself worked fine —
|
|
20
|
+
which is what made it confusing. The 5 vanilla entries using OnDamaged;OnHealed with no
|
|
21
|
+
OnCreate are bloodied-style buffs deliberately OFF until you are hurt; copying that pair onto
|
|
22
|
+
an at-will toggle makes it permanently dead. Pattern: if a boost should be live the moment its
|
|
23
|
+
source exists, either include OnCreate or omit BoostContext/BoostConditions entirely."
|
|
24
|
+
- id: bg3.boosts.context-source-invalid-hp-percent
|
|
25
|
+
claim: "context.Source is not an attested qualifier for HasHPPercentageLessThan in a Conditions
|
|
26
|
+
field: all 4 vanilla Conditions usages qualify with context.Observer, and BoostConditions
|
|
27
|
+
usages are bare or context.Target. The expectation is that context.Source makes the entire
|
|
28
|
+
condition string evaluate false, silently stopping every functor gated by it."
|
|
29
|
+
status: inferred
|
|
30
|
+
source: ModWright research
|
|
31
|
+
tags:
|
|
32
|
+
- boost
|
|
33
|
+
- conditions
|
|
34
|
+
- context
|
|
35
|
+
- hp-percent
|
|
36
|
+
- silent-failure
|
|
37
|
+
detail: "A class mod's diagnostic passive whose Conditions read \"... HasHPPercentageLessThan(15,
|
|
38
|
+
context.Source)\" was the prime suspect for a load-CTD (bisect-isolated: the previous version
|
|
39
|
+
loads, the next CTDs at module load), on the reasoning that an unresolvable qualifier in a
|
|
40
|
+
parsed condition is a candidate stats-load crash. The following version removed the entire
|
|
41
|
+
diagnostic harness rather than isolating the term, so the failure mode is reasoned, not seen.
|
|
42
|
+
Do the census before using any qualified context in a new field: grep -rho 'data \"<Field>\"
|
|
43
|
+
\"[^\"]*<Func>[^\"]*\"'."
|
|
44
|
+
- id: bg3.boosts.context-observer-invalid-oncast-self
|
|
45
|
+
claim: context.Observer ALSO fails in a plain OnCast-on-self passive Conditions field. The 4 vanilla
|
|
46
|
+
context.Observer uses are all reaction/interrupt passives with a genuine Observer entity. In
|
|
47
|
+
an OnCast passive that fires on the caster there is no Observer, so the term evaluates false
|
|
48
|
+
and the whole and-chain dies silently.
|
|
49
|
+
status: verified
|
|
50
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
51
|
+
source: ModWright field verification
|
|
52
|
+
tags:
|
|
53
|
+
- boost
|
|
54
|
+
- conditions
|
|
55
|
+
- context.observer
|
|
56
|
+
- oncast
|
|
57
|
+
- silent-failure
|
|
58
|
+
detail: "Symptom: the free cast worked, the HP self-charge never fired. The charge condition was
|
|
59
|
+
\"and not HasHPPercentageLessThan(15, context.Observer)\" on the mod's passive. Fix: use the
|
|
60
|
+
BARE form HasHPPercentageLessThan(15) (defaults to the functor's own entity = the caster), or
|
|
61
|
+
don't gate the functor at all and gate via the source status's own RemoveConditions — the
|
|
62
|
+
mod's fix was a status that removes itself below 15% via RemoveConditions
|
|
63
|
+
\"HasHPPercentageLessThan(15)\" + RemoveEvents \"OnDamage\" (precedent MAG_LOWHP_IGNORE_AOO),
|
|
64
|
+
which then makes the passive's HasStatus() gate false, so one mechanism gates both the free
|
|
65
|
+
cast and the charge."
|
|
66
|
+
- id: bg3.boosts.context-qualifier-field-specific
|
|
67
|
+
claim: A context qualifier proven valid in one field+functor context is NOT automatically valid in
|
|
68
|
+
another; match it to the entities the functor context actually provides, and run a
|
|
69
|
+
field-by-field vanilla census before using any qualified context in a new field.
|
|
70
|
+
status: inferred
|
|
71
|
+
source: ModWright research
|
|
72
|
+
tags:
|
|
73
|
+
- boost
|
|
74
|
+
- conditions
|
|
75
|
+
- context
|
|
76
|
+
- field-specific
|
|
77
|
+
detail: "The worked case: context.Observer is vanilla-attested in reaction/interrupt passive
|
|
78
|
+
Conditions and fails in an OnCast-on-self passive (see
|
|
79
|
+
bg3.boosts.context-observer-invalid-oncast-self). Census command: grep -rho 'data \"<Field>\"
|
|
80
|
+
\"[^\"]*<Func>[^\"]*\"'."
|
|
81
|
+
- id: bg3.boosts.toggled-passive-oncast-dead-until-on
|
|
82
|
+
claim: IsToggled passives sit OFF by default, and a toggled-off passive's OnCast StatsFunctors NEVER
|
|
83
|
+
fire. Applying the linked status directly (bypassing the toggle) gives you the status's boosts
|
|
84
|
+
but not the passive's cast hooks — which looks exactly like "the functor silently doesn't
|
|
85
|
+
work".
|
|
86
|
+
status: verified
|
|
87
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
88
|
+
source: ModWright field verification
|
|
89
|
+
tags:
|
|
90
|
+
- boost
|
|
91
|
+
- toggles
|
|
92
|
+
- oncast
|
|
93
|
+
- forced-cast
|
|
94
|
+
detail: Test protocols must toggle the passive ON (in-game click or toggle functors) and keep status
|
|
95
|
+
presence coupled to toggle state via ToggleOnFunctors/ToggleOffFunctors. Separately, a forced
|
|
96
|
+
Osi.UseSpell cast resolves at spell power level 0 (not the selected level) — see
|
|
97
|
+
bg3.se.use-spell-forced-cast.
|
|
98
|
+
- id: bg3.boosts.arcane-battery-toggle-pattern
|
|
99
|
+
claim: "The safest shape for a toggled slot-free-cast is the vanilla Arcane Battery split: the
|
|
100
|
+
passive carries IsToggled + ToggleOn/OffFunctors + the OnCast functors, and a status carries
|
|
101
|
+
the UnlockSpellVariant boost. MAG_MagicItemPoweredCast_Passive + MAG_MAGIC_ITEM_POWERED_CAST
|
|
102
|
+
are the template."
|
|
103
|
+
status: verified
|
|
104
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
105
|
+
source: ModWright field verification
|
|
106
|
+
tags:
|
|
107
|
+
- boost
|
|
108
|
+
- toggle
|
|
109
|
+
- free-cast
|
|
110
|
+
- arcane-battery
|
|
111
|
+
- pattern
|
|
112
|
+
detail: TAD_Freecast proves a toggled passive CAN hold UnlockSpellVariant in its own Boosts — but
|
|
113
|
+
note it has no BoostConditions/BoostContext at all. BoostConditions/BoostContext have zero
|
|
114
|
+
vanilla precedent on any StatusData (they are Passive-only fields), which is why a class mod
|
|
115
|
+
gates its status with RemoveConditions instead.
|
|
116
|
+
- id: bg3.boosts.diagnosis-dead-condition
|
|
117
|
+
claim: To diagnose a dead condition string, put each candidate term in its own IsHidden passive with
|
|
118
|
+
StatsFunctorContext "OnCast" and StatsFunctors "ApplyStatus(SELF,<distinct marker>,100,2)".
|
|
119
|
+
One cast then shows, on the portrait, exactly which terms parse and evaluate true. Keep each
|
|
120
|
+
probe in a SEPARATE passive — a malformed condition kills its own entry's functors, which is
|
|
121
|
+
what makes the isolation useful.
|
|
122
|
+
status: verified
|
|
123
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
124
|
+
source: ModWright field verification
|
|
125
|
+
tags:
|
|
126
|
+
- boost
|
|
127
|
+
- debugging
|
|
128
|
+
- conditions
|
|
129
|
+
- diagnostic
|
|
130
|
+
detail: "The marker form is what proved the character-level weapon gate dead in one cycle: a class
|
|
131
|
+
mod paired IF(CharacterLevelGreaterThan(3)):WeaponProperty(Magical) with a visible
|
|
132
|
+
IF(CharacterLevelGreaterThan(3)):WeaponDamage(1,Thunder) on the same condition, and the tester
|
|
133
|
+
reported no \"+1 Thunder\" at L4. Note the counter-case: that mod's six-probe harness was
|
|
134
|
+
itself suspected of a load-CTD and deleted before it produced any reading — a probe that
|
|
135
|
+
carries unproven syntax can cost a cycle instead of saving one."
|
|
136
|
+
- id: bg3.boosts.statusdata-boosts-apply-on-applystatus
|
|
137
|
+
claim: bg3.boosts.boostcontext-evaluation-events' "no OnCreate -> never applies" rule is confirmed
|
|
138
|
+
for PassiveData only. On StatusData, a Boosts field was observed to evaluate at ApplyStatus
|
|
139
|
+
(i.e. the moment the status is first applied) independent of BoostContext's
|
|
140
|
+
re-evaluation-event semantics — a class mod status's free-cast ModifyUseCosts boost applied
|
|
141
|
+
correctly with BoostContext "OnDamaged;OnHealed" and no OnCreate, deliberately run despite
|
|
142
|
+
ModWright's validator (bg3.history.boostcontext-initial-event) warning on it.
|
|
143
|
+
status: verified
|
|
144
|
+
verified_on: 2026-09-08
|
|
145
|
+
source: ModWright field verification
|
|
146
|
+
tags:
|
|
147
|
+
- boost
|
|
148
|
+
- boostcontext
|
|
149
|
+
- statusdata
|
|
150
|
+
- passivedata
|
|
151
|
+
- applystatus
|
|
152
|
+
- asymmetry
|
|
153
|
+
detail: 'An acceptance regression put BoostContext "OnDamaged;OnHealed" back on the status (not the
|
|
154
|
+
passive, where the free-cast mechanism now actually lives). SpellSlot resources were sampled
|
|
155
|
+
before and after a leveled non-cantrip cast with the toggle ON: L1 4/4, L2 3/3, L3 2/2 before
|
|
156
|
+
and after — completely unchanged, i.e. the free-cast boost fired anyway. This does not mean
|
|
157
|
+
BoostContext is meaningless on StatusData; it means the "missing OnCreate -> dead boost"
|
|
158
|
+
failure mode proven for PassiveData (see bg3.boosts.boostcontext-evaluation-events) does not
|
|
159
|
+
generalize to StatusData, and each entry type needs its own verification rather than assuming
|
|
160
|
+
the PassiveData rule everywhere.'
|
|
161
|
+
- id: bg3.boosts.weapon-level-gating-fails-passive
|
|
162
|
+
claim: CharacterLevelGreaterThan(N) (and character-level conditions generally) do NOT resolve the
|
|
163
|
+
wielder inside a passive weapon-item status Boosts IF(). A gate like
|
|
164
|
+
IF(CharacterLevelGreaterThan(3)):WeaponProperty(Magical) on a summoned weapon's status
|
|
165
|
+
silently never fires. No vanilla weapon status gates a boost by wielder level — that's the
|
|
166
|
+
tell.
|
|
167
|
+
status: verified
|
|
168
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
169
|
+
source: ModWright field verification
|
|
170
|
+
tags:
|
|
171
|
+
- boost
|
|
172
|
+
- weapon
|
|
173
|
+
- level-gate
|
|
174
|
+
- passive
|
|
175
|
+
- silent-failure
|
|
176
|
+
detail: "Fix: gate weapon properties by SPELL SLOT instead — the summon's upcast child knows its
|
|
177
|
+
slot, so apply a different weapon status per slot tier (a class mod put
|
|
178
|
+
WeaponProperty(Magical) on the slot-3+ tiers). Slot ≈ level anyway. Cast-time IF() in
|
|
179
|
+
SpellProperties does see the caster's level and is the reliable place for character-level
|
|
180
|
+
logic — see bg3.spells.level-conditions-in-spellproperties."
|
|
181
|
+
- id: bg3.stats.dipped-weapon-status-check
|
|
182
|
+
claim: "To react to a dipped weapon from a character-context boost or condition, test the WEAPON for
|
|
183
|
+
the dip status: HasStatus('DIPPED_FIRE',GetActiveWeapon()) — the form vanilla's poison-dip
|
|
184
|
+
functors use. DIPPED_FIRE is a weapon status carrying WeaponDamage(1d4, Fire)."
|
|
185
|
+
status: unverified
|
|
186
|
+
source: ModWright research
|
|
187
|
+
tags:
|
|
188
|
+
- boost
|
|
189
|
+
- conditions
|
|
190
|
+
- dipped
|
|
191
|
+
- weapon
|
|
192
|
+
- hasstatus
|
|
193
|
+
- getactiveweapon
|
|
194
|
+
detail: "Example rider:
|
|
195
|
+
IF(HasStatus('DIPPED_FIRE',GetActiveWeapon())):CharacterWeaponDamage(max(0,DexterityModifier)\
|
|
196
|
+
,Fire). A bare HasStatus('DIPPED_FIRE') in character context looks at the character, which
|
|
197
|
+
never carries the dip status, so the condition is silently always false."
|
|
198
|
+
- id: bg3.stats.downedstatus-drop-to-one
|
|
199
|
+
claim: "\"Drop to 1 HP instead of 0\" is Boosts \"DownedStatus(<DOWNED entry>,<n>)\", not an
|
|
200
|
+
interrupt. DEATH_WARD uses DownedStatus(DEATH_WARD_DOWNED,10); RELENTLESS_RAGE gates it with
|
|
201
|
+
IF(HasStatus('SG_Rage')). The DOWNED entry is using \"SURVIVAL_INSTINCT_DOWNED\" with
|
|
202
|
+
OnApplyFunctors \"RemoveStatus(<buff>);RegainHitPoints(1,Guaranteed)\"
|
|
203
|
+
(RELENTLESS_ENDURANCE_DOWNED)."
|
|
204
|
+
status: verified
|
|
205
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
206
|
+
source: Vanilla Status_BOOST entries DEATH_WARD, RELENTLESS_RAGE, RELENTLESS_ENDURANCE_DOWNED and
|
|
207
|
+
SURVIVAL_INSTINCT_DOWNED (4.73.98.727)
|
|
208
|
+
tags:
|
|
209
|
+
- boost
|
|
210
|
+
- downedstatus
|
|
211
|
+
- death-ward
|
|
212
|
+
- relentless
|
|
213
|
+
- long-rest
|
|
214
|
+
- status
|
|
215
|
+
detail: A once-per-long-rest marker status survives short rests with StatusPropertyFlags
|
|
216
|
+
IgnoreResting and is cleared by a passive with StatsFunctorContext "OnLongRest" and
|
|
217
|
+
StatsFunctors "RemoveStatus(SELF,<marker>)". Verified against the vanilla data, not yet as a
|
|
218
|
+
custom entry in-game.
|
|
219
|
+
- id: bg3.boosts.conditional-damagebonus-in-item-boosts-renders-as-bare-dice
|
|
220
|
+
claim: A conditional damage boost written straight into an Armor/Weapon entry's Boosts
|
|
221
|
+
(IF(IsUnarmedAttack()):DamageBonus(1d4,Fire)) works mechanically but the item tooltip prints
|
|
222
|
+
it as a bare "1d4" line with no sentence. Vanilla keeps such bonuses in a PassiveData with a
|
|
223
|
+
DisplayName/Description (SCL_MastiffPoachers_Ring_Passive) granted through PassivesOnEquip, so
|
|
224
|
+
the tooltip shows a card instead.
|
|
225
|
+
status: verified
|
|
226
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
227
|
+
source: ModWright field verification
|
|
228
|
+
tags:
|
|
229
|
+
- boosts
|
|
230
|
+
- damagebonus
|
|
231
|
+
- tooltip
|
|
232
|
+
- passives
|
|
233
|
+
- armor
|
|
234
|
+
- id: bg3.boosts.onattack-functors-target-the-struck-creature-swap-flips-to-the-attacker
|
|
235
|
+
claim: In a PassiveData with StatsFunctorContext "OnAttack", a plain ApplyStatus(X,100,n) lands on
|
|
236
|
+
the creature that was hit (vanilla UND_HARDWORK_TARGET, MAG_ELECTROCUTED do exactly this), and
|
|
237
|
+
ApplyStatus(SELF,...) on the attacker; ApplyStatus(SWAP,...) therefore sends the status to the
|
|
238
|
+
ATTACKER, which put Kindling on the wearer instead of the enemy.
|
|
239
|
+
status: verified
|
|
240
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
241
|
+
source: ModWright field verification
|
|
242
|
+
tags:
|
|
243
|
+
- passives
|
|
244
|
+
- onattack
|
|
245
|
+
- functors
|
|
246
|
+
- swap
|
|
247
|
+
- self
|
|
248
|
+
- target
|
|
249
|
+
- id: bg3.boosts.weapondamage-boosts-do-not-reach-spells-that-roll-their-own-dice
|
|
250
|
+
claim: WeaponDamage(...) boosts on a weapon (DefaultBoosts or an equip status) are added only to
|
|
251
|
+
damage expressed as MainMeleeWeapon / MainRangedWeapon; a weapon action whose SpellSuccess
|
|
252
|
+
rolls its own formula (DealDamage(1d8+max(StrengthModifier,DexterityModifier), Slashing))
|
|
253
|
+
shows and deals none of the weapon's extra fire dice, and needs them restated in its own
|
|
254
|
+
DealDamage and TooltipDamageList.
|
|
255
|
+
status: verified
|
|
256
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
257
|
+
source: ModWright field verification
|
|
258
|
+
tags:
|
|
259
|
+
- boosts
|
|
260
|
+
- weapondamage
|
|
261
|
+
- spells
|
|
262
|
+
- dealdamage
|
|
263
|
+
- tooltip
|
|
264
|
+
- id: bg3.boosts.vanilla-item-status-effects-use-statusonequip-beside-the-passive
|
|
265
|
+
claim: "When a vanilla item's effect is a status rather than a boost, the Armor entry carries
|
|
266
|
+
`StatusOnEquip \"<STATUS>\"` next to PassivesOnEquip: The Graceful Cloth
|
|
267
|
+
(MAG_BarbMonk_Defensive_Cloth) grants Cat's Grace as StatusOnEquip MAG_CATS_GRACE (using
|
|
268
|
+
CATS_GRACE: Advantage(Ability, Dexterity);FallDamageMultiplier(0.5); IgnoreResting) while its
|
|
269
|
+
+2 Dexterity to 20 is the passive MAG_BarbMonk_Armor_Defensive_Passive (Ability(Dexterity, 2,
|
|
270
|
+
20), DescriptionParams \"2;20\"). A mod item copies both halves to match it."
|
|
271
|
+
status: inferred
|
|
272
|
+
source: ModWright research
|
|
273
|
+
tags:
|
|
274
|
+
- armor
|
|
275
|
+
- statusonequip
|
|
276
|
+
- passivesonequip
|
|
277
|
+
- cats-grace
|
|
278
|
+
- ability
|
|
279
|
+
- id: bg3.boosts.ext-stats-hot-edits-do-not-reach-the-combine-index
|
|
280
|
+
claim: Setting a stat field from Script Extender at runtime (Ext.Stats.Get(name).ComboCategory =
|
|
281
|
+
..., then Ext.Stats.Sync) reads back changed on server and client and survives a save+reload,
|
|
282
|
+
and editing a loaded Ext.Stats.ItemCombo entry's Ingredients in place also reads back changed;
|
|
283
|
+
neither produced a Combine option in the running session, so combine eligibility is fixed at
|
|
284
|
+
load and a pak change plus full restart is the only test loop for recipes.
|
|
285
|
+
status: verified
|
|
286
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
287
|
+
source: ModWright field verification
|
|
288
|
+
tags:
|
|
289
|
+
- scriptextender
|
|
290
|
+
- ext-stats
|
|
291
|
+
- sync
|
|
292
|
+
- hot-edit
|
|
293
|
+
- itemcombos
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
game: baldursgate3
|
|
2
|
+
topic: stats.equipment-kits
|
|
3
|
+
title: Character-creation equipment kits (Stats/Generated/Equipment.txt)
|
|
4
|
+
facts:
|
|
5
|
+
- id: bg3.equipment.cc-kit-override-replaces-vanilla-entry
|
|
6
|
+
claim: "A mod's Public/<Mod>/Stats/Generated/Equipment.txt that declares new equipment
|
|
7
|
+
\"EQP_CC_Monk\" REPLACES vanilla Monk's character-creation kit wholesale: vanilla Monk's
|
|
8
|
+
ClassDescription ClassEquipment points at that entry (defined in SharedDev Equipment.txt), and
|
|
9
|
+
the mod's same-named block is the whole kit. Every vanilla line you want to keep must be
|
|
10
|
+
restated."
|
|
11
|
+
status: verified
|
|
12
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
13
|
+
source: ModWright field verification
|
|
14
|
+
tags:
|
|
15
|
+
- equipment
|
|
16
|
+
- character-creation
|
|
17
|
+
- kit
|
|
18
|
+
- override
|
|
19
|
+
- classdescription
|
|
20
|
+
- stats
|
|
21
|
+
detail: 'Vanilla Monk lines to restate for a like-for-like kit: the potions, OBJ_Scroll_Revivify,
|
|
22
|
+
ARM_Shoes_Monk, OBJ_Keychain, OBJ_Bag_AlchemyPouch, ARM_Camp_Body, ARM_Camp_Shoes,
|
|
23
|
+
OBJ_Backpack_CampSupplies. Format: new equipment "<id>", then add initialweaponset "Melee",
|
|
24
|
+
then repeated pairs of add equipmentgroup / add equipment entry "<stat>". Trade-off: this
|
|
25
|
+
conflicts with any other mod overriding the same kit — the same class of trade-off as
|
|
26
|
+
overriding a vanilla progression node. A custom class avoids it by naming its own
|
|
27
|
+
EQP_CC_<Class> from its own ClassDescription instead. Validator
|
|
28
|
+
bg3.stats.equipment-kit-entries-resolve checks the block shape and that every entry resolves.'
|
|
29
|
+
- id: bg3.equipment.cc-kit-one-body-item
|
|
30
|
+
claim: A CC kit must carry exactly one Breast-slot (body) armor. With two — a custom robe plus the
|
|
31
|
+
vanilla ARM_Monk — character creation drew the VANILLA outfit while the custom robe's
|
|
32
|
+
VertexColorMaskSlots still applied, so the character's arms vanished. Dropping the vanilla
|
|
33
|
+
body item fixed it.
|
|
34
|
+
status: verified
|
|
35
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
36
|
+
source: ModWright field verification
|
|
37
|
+
tags:
|
|
38
|
+
- equipment
|
|
39
|
+
- character-creation
|
|
40
|
+
- kit
|
|
41
|
+
- armor
|
|
42
|
+
- slot
|
|
43
|
+
- vertexcolormask
|
|
44
|
+
- silent-failure
|
|
45
|
+
related:
|
|
46
|
+
- id: bg3.items.visualbank.vertexcolormaskslots-underwear-fix
|
|
47
|
+
detail: The body mask that hid the arms is the same VertexColorMaskSlots mechanism that fact copies
|
|
48
|
+
from the vanilla robe.
|
|
49
|
+
- id: bg3.equipment.cc-kit-override-replaces-vanilla-entry
|
|
50
|
+
detail: The symptom is silent — nothing logs; the CC preview simply shows the vanilla outfit with
|
|
51
|
+
body parts missing. Validator bg3.stats.equipment-kit-one-body-armor warns when two entries in
|
|
52
|
+
one kit resolve to Armor stats whose Slot (own or inherited via using) is Breast.
|
|
53
|
+
- id: bg3.equipment.kit-order-equips-first-then-pack
|
|
54
|
+
claim: Kit entries are equipped in list order into free slots; a later entry whose slot is already
|
|
55
|
+
occupied lands in the pack instead (the vanilla quarterstaff listed after a custom naginata
|
|
56
|
+
was carried, not wielded).
|
|
57
|
+
status: unverified
|
|
58
|
+
source: ModWright research
|
|
59
|
+
tags:
|
|
60
|
+
- equipment
|
|
61
|
+
- character-creation
|
|
62
|
+
- kit
|
|
63
|
+
- order
|
|
64
|
+
- inventory
|
|
65
|
+
related:
|
|
66
|
+
- bg3.equipment.cc-kit-override-replaces-vanilla-entry
|
|
67
|
+
detail: Consistent with what was seen (the custom weapon came first in the block and was the one
|
|
68
|
+
wielded), but the ordering rule itself was not tested by swapping the two lines. List the
|
|
69
|
+
intended wielded weapon first until it is.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
game: baldursgate3
|
|
2
|
+
topic: stats.interrupts
|
|
3
|
+
title: Reaction interrupts (Stats/Generated/Data/Interrupt.txt)
|
|
4
|
+
facts:
|
|
5
|
+
- id: bg3.stats.interrupt-observer-context
|
|
6
|
+
claim: InterruptData Conditions carry context.Observer as the standard idiom (every reaction
|
|
7
|
+
interrupt opens with Self(context.Source,context.Observer) and
|
|
8
|
+
IsAbleToReact(context.Observer)), and interrupt functors address the reaction entities with
|
|
9
|
+
the target specifiers OBSERVER_OBSERVER, OBSERVER_SOURCE and OBSERVER_TARGET
|
|
10
|
+
(ApplyStatus(OBSERVER_OBSERVER,<status>,...), RemoveStatus(OBSERVER_OBSERVER,<status>)). The
|
|
11
|
+
passive-only "context.Observer is invalid" lesson does not apply to InterruptData.
|
|
12
|
+
status: verified
|
|
13
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
14
|
+
source: Shared, SharedDev and Gustav Interrupt.txt read on 2026-09-17
|
|
15
|
+
tags:
|
|
16
|
+
- interrupt
|
|
17
|
+
- reaction
|
|
18
|
+
- conditions
|
|
19
|
+
- context.observer
|
|
20
|
+
- target-specifier
|
|
21
|
+
- stats
|
|
22
|
+
detail: "The ModWright rules bg3.history.context-qualifier-validity and
|
|
23
|
+
bg3.history.reference-integrity flagged a cloned Polearm Master interrupt on both counts
|
|
24
|
+
(block) until they learned the entry type: the known-invalid evidence is PassiveData
|
|
25
|
+
(OnCast-on-self), and OBSERVER_* is a target, not a status name."
|
|
26
|
+
- id: bg3.stats.interrupt-enter-reach-native
|
|
27
|
+
claim: 'An opportunity attack on a creature ENTERING reach is native: InterruptContext
|
|
28
|
+
"OnEnterAttackRange" with InterruptContextScope "Self" (vanilla Interrupt_PolearmMaster,
|
|
29
|
+
unlocked by the passive boost UnlockInterrupt(Interrupt_PolearmMaster)); its Conditions accept
|
|
30
|
+
a Reach weapon, a WPN_STAVE or a WPN_SPEAR. No Osiris hook is needed for enter-reach
|
|
31
|
+
reactions; a clone with extra Properties (an ApplyStatus(OBSERVER_OBSERVER,...) rider) keeps
|
|
32
|
+
the reaction cost and the AttackOfOpportunity stack.'
|
|
33
|
+
status: inferred
|
|
34
|
+
source: ModWright research
|
|
35
|
+
tags:
|
|
36
|
+
- interrupt
|
|
37
|
+
- reaction
|
|
38
|
+
- opportunity-attack
|
|
39
|
+
- reach
|
|
40
|
+
- polearm-master
|
|
41
|
+
- stats
|
|
42
|
+
detail: "A subclass mod's reaction replaced its Script Extender scaffold with a scoped clone of
|
|
43
|
+
Interrupt_PolearmMaster. The stack \"AttackOfOpportunity\" keeps it from doubling with the
|
|
44
|
+
ordinary leave-reach reaction. What an interrupt cannot do: charge a resource conditionally on
|
|
45
|
+
the attack HITTING (Properties run when the reaction is taken)."
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
game: baldursgate3
|
|
2
|
+
topic: stats.itemcombos
|
|
3
|
+
title: ItemCombos.txt � the inventory Combine recipes (forging one item from two)
|
|
4
|
+
facts:
|
|
5
|
+
- id: bg3.itemcombos.file-lives-beside-data-not-inside-it
|
|
6
|
+
claim: Recipes go in Public/<Mod>/Stats/Generated/ItemCombos.txt � next to the Data/ folder, not
|
|
7
|
+
inside it � as `new ItemCombination "<name>"` blocks (Type N Object|Category, Object N,
|
|
8
|
+
Transform N Consume|Transform|None|Dye) followed by `new ItemCombinationResult "<name>_1"`
|
|
9
|
+
(ResultAmount 1, Result 1, PreviewStatsID). A mod's file loads alongside the vanilla ones and
|
|
10
|
+
Ext.Stats.ItemCombo.Get("<name>") returns it on server and client; // comment lines at the top
|
|
11
|
+
of the file did not stop it loading (vanilla files carry none).
|
|
12
|
+
status: verified
|
|
13
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
14
|
+
source: ModWright field verification
|
|
15
|
+
tags:
|
|
16
|
+
- itemcombos
|
|
17
|
+
- combine
|
|
18
|
+
- stats
|
|
19
|
+
- file-layout
|
|
20
|
+
- id: bg3.itemcombos.combine-menu-comes-from-the-template-peace-action-not-the-recipe
|
|
21
|
+
claim: 'An item gets the "Combine" context-menu entry only if its RootTemplate carries an
|
|
22
|
+
OnUsePeaceActions Action with ActionType 23 (Attributes: Animation "", CombineSlots 1 (int8),
|
|
23
|
+
IsBase True). A recipe alone never adds the option: recipes naming vanilla objects (Amethyst,
|
|
24
|
+
a plain Spear) gave those items no Combine entry either, while the vanilla Broken Spear halves
|
|
25
|
+
showed it even with their partner dropped from the bag.'
|
|
26
|
+
status: verified
|
|
27
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
28
|
+
source: ModWright field verification
|
|
29
|
+
tags:
|
|
30
|
+
- itemcombos
|
|
31
|
+
- combine
|
|
32
|
+
- roottemplate
|
|
33
|
+
- peace-action
|
|
34
|
+
- actiontype-23
|
|
35
|
+
detail: "Validator idea (design 05): flag an ItemCombination ingredient whose RootTemplate chain has
|
|
36
|
+
no ActionType 23 peace action � the recipe is unreachable from the UI."
|
|
37
|
+
- id: bg3.itemcombos.category-ingredient-reads-combocategory-and-custom-values-did-not-match
|
|
38
|
+
claim: 'A `Type N "Category"` ingredient is matched against the stat field ComboCategory (vanilla:
|
|
39
|
+
_Body armour "DyableArmor" for the dyes, _DRINK_* "Drink" for the trap combo,
|
|
40
|
+
"ConstructPart"), not ObjectCategory. A mod-defined value on a weapon (ComboCategory
|
|
41
|
+
"<ModCategory>", confirmed on server and client) still never matched in-game, so name the
|
|
42
|
+
partner directly with `Type N "Object"` and its stat name instead.'
|
|
43
|
+
status: verified
|
|
44
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
45
|
+
source: ModWright field verification
|
|
46
|
+
tags:
|
|
47
|
+
- itemcombos
|
|
48
|
+
- category
|
|
49
|
+
- combocategory
|
|
50
|
+
- objectcategory
|
|
51
|
+
- id: bg3.itemcombos.vanilla-shape-transform-first-consume-second
|
|
52
|
+
claim: 'Vanilla two-part forges list the part that becomes the result as Object 1 with Transform
|
|
53
|
+
"Transform" and the part that is used up as Object 2 with Transform "Consume"
|
|
54
|
+
(QUEST_FOR_CultistsRepairedSpear: Head transforms, Shaft consumed, Result FOR_TrueSoul_Spear;
|
|
55
|
+
the beer-barrel poisonings likewise). A Weapon stat can be the transformed Object 1 � the
|
|
56
|
+
Emberwatch Naginata (a Weapon) became the Naginata of Ashcrown this way.'
|
|
57
|
+
status: verified
|
|
58
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
59
|
+
source: ModWright field verification
|
|
60
|
+
tags:
|
|
61
|
+
- itemcombos
|
|
62
|
+
- transform
|
|
63
|
+
- consume
|
|
64
|
+
- ordering
|
|
65
|
+
- weapons
|