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,386 @@
|
|
|
1
|
+
game: baldursgate3
|
|
2
|
+
topic: dialogue.osiris-goals
|
|
3
|
+
title: Osiris goal structure (INIT/KB/EXIT), goal hierarchy, and build errors
|
|
4
|
+
facts:
|
|
5
|
+
- id: bg3.dialogue.osiris-goals.init-kb-exit-sections
|
|
6
|
+
claim: 'Every Osiris goal script has three sections: INIT "will run only once when the goal
|
|
7
|
+
activates" (used for setup such as establishing characters); KB "is where the bulk of the
|
|
8
|
+
script goes" and is assessed while the goal is active; EXIT "contains logic that will only
|
|
9
|
+
execute when GoalCompleted is called", and "Once the EXIT section runs, the logic from your KB
|
|
10
|
+
section will no longer be evaluated by the game."'
|
|
11
|
+
status: community
|
|
12
|
+
source: docs.baldursgate3.game/index.php?title=Osiris:_Using_the_Story_Editor §Sections
|
|
13
|
+
tags:
|
|
14
|
+
- osiris
|
|
15
|
+
- goal
|
|
16
|
+
- init
|
|
17
|
+
- kb
|
|
18
|
+
- exit
|
|
19
|
+
- structure
|
|
20
|
+
- id: bg3.dialogue.osiris-goals.exit-clears-databases
|
|
21
|
+
claim: A goal's EXIT section is the conventional place to tidy up databases the goal no longer
|
|
22
|
+
needs, most commonly via SysClear("NameOfDatabaseGoesHere", Number) calls, since KB stops
|
|
23
|
+
being evaluated once EXIT runs.
|
|
24
|
+
status: community
|
|
25
|
+
source: docs.baldursgate3.game/index.php?title=Osiris:_Using_the_Story_Editor §Sections
|
|
26
|
+
tags:
|
|
27
|
+
- osiris
|
|
28
|
+
- goal
|
|
29
|
+
- exit
|
|
30
|
+
- sysclear
|
|
31
|
+
- databases
|
|
32
|
+
- id: bg3.dialogue.osiris-goals.goals-execute-top-to-bottom
|
|
33
|
+
claim: Goals — and Osiris in general — execute in the order they are listed in the Story Editor's
|
|
34
|
+
goal hierarchy, top to bottom, at the same nesting level.
|
|
35
|
+
status: community
|
|
36
|
+
source: docs.baldursgate3.game/index.php?title=Osiris:_Using_the_Story_Editor §Example ("goals are
|
|
37
|
+
executed from top to bottom")
|
|
38
|
+
tags:
|
|
39
|
+
- osiris
|
|
40
|
+
- goal
|
|
41
|
+
- execution-order
|
|
42
|
+
- goal-hierarchy
|
|
43
|
+
- id: bg3.dialogue.osiris-goals.parent-goal-must-complete-before-children-activate
|
|
44
|
+
claim: A parent goal executes first in full, and its child (sub-)goals only activate once the parent
|
|
45
|
+
fires a GoalCompleted event — a child goal placed under a parent that never completes will
|
|
46
|
+
never run.
|
|
47
|
+
status: community
|
|
48
|
+
source: docs.baldursgate3.game/index.php?title=Osiris:_Using_the_Story_Editor §Example ("parent
|
|
49
|
+
goals execute first, and will only activate their children once that parent goal is complete")
|
|
50
|
+
tags:
|
|
51
|
+
- osiris
|
|
52
|
+
- goal
|
|
53
|
+
- goal-hierarchy
|
|
54
|
+
- goalcompleted
|
|
55
|
+
- silent-failure
|
|
56
|
+
- id: bg3.dialogue.osiris-goals.act-region-situation-naming-convention
|
|
57
|
+
claim: New goal scripts conventionally follow an "Act_Region_Situation" naming pattern (e.g.
|
|
58
|
+
"Act3b_LOW_Applesnatcher" for a Lower City situation in Act 3b), and should be placed as a
|
|
59
|
+
sub-goal of the goal that represents the level/act being targeted, so the new goal doesn't
|
|
60
|
+
activate before that content is loaded.
|
|
61
|
+
status: community
|
|
62
|
+
source: docs.baldursgate3.game/index.php?title=Osiris:_Using_the_Story_Editor §Example
|
|
63
|
+
tags:
|
|
64
|
+
- osiris
|
|
65
|
+
- goal
|
|
66
|
+
- naming-convention
|
|
67
|
+
- act-region-situation
|
|
68
|
+
- id: bg3.dialogue.osiris-goals.modwrapper-gustav-scope
|
|
69
|
+
claim: ModWrapper_Gustav contains all quest logic that appears in the journal; systemics (e.g.
|
|
70
|
+
crime), achievements, spells, savegame patching, and tutorials all live in goals outside of
|
|
71
|
+
ModWrapper_Gustav.
|
|
72
|
+
status: community
|
|
73
|
+
source: docs.baldursgate3.game/index.php?title=Osiris:_Using_the_Story_Editor §Example
|
|
74
|
+
tags:
|
|
75
|
+
- osiris
|
|
76
|
+
- goal
|
|
77
|
+
- modwrapper-gustav
|
|
78
|
+
- scope
|
|
79
|
+
- id: bg3.dialogue.osiris-goals.must-save-before-renaming-new-goal
|
|
80
|
+
claim: A newly created goal script item must be saved in the Story Editor before it can be renamed;
|
|
81
|
+
if you rename it again right after creation without saving in between, the new name may not
|
|
82
|
+
stick, and closing and reopening the Story Editor may be needed to recover.
|
|
83
|
+
status: community
|
|
84
|
+
source: docs.baldursgate3.game/index.php?title=Osiris:_Using_the_Story_Editor §Example ("you must
|
|
85
|
+
first save after creating new script items before you can rename them")
|
|
86
|
+
tags:
|
|
87
|
+
- osiris
|
|
88
|
+
- goal
|
|
89
|
+
- save
|
|
90
|
+
- rename
|
|
91
|
+
- toolkit-gotcha
|
|
92
|
+
- id: bg3.dialogue.osiris-goals.generate-definitions-build-reload-workflow
|
|
93
|
+
claim: "Three reload paths, in decreasing cost: \"Generate Definitions, Build and Reload\" (Ctrl+F7)
|
|
94
|
+
builds and reloads story \"along with making it easier to find any new objects you have
|
|
95
|
+
created\"; \"Reload Level and Story\" (Ctrl+F8, in the main Editor) also reloads the level's
|
|
96
|
+
objects, which is what you need when characters have been defeated or items destroyed;
|
|
97
|
+
\"Reload Story\" (F8) alone \"save[s] some time\" when you made no script changes and don't
|
|
98
|
+
need the level reloaded."
|
|
99
|
+
status: community
|
|
100
|
+
source: "docs.baldursgate3.game/index.php?title=Osiris:_Using_the_Story_Editor §Generate
|
|
101
|
+
Definitions, Build and Reload; §Option 1: Reload Level and Story; §Option 2: Reload Story"
|
|
102
|
+
tags:
|
|
103
|
+
- osiris
|
|
104
|
+
- story-editor
|
|
105
|
+
- build
|
|
106
|
+
- reload
|
|
107
|
+
- workflow
|
|
108
|
+
- id: bg3.dialogue.osiris-goals.errors-panel-reports-every-goal-file
|
|
109
|
+
claim: The Story Editor's Errors panel at the bottom reports build errors and warnings from every
|
|
110
|
+
goal file in the project, not only the one currently open — a build failure elsewhere can
|
|
111
|
+
appear while editing an unrelated goal.
|
|
112
|
+
status: community
|
|
113
|
+
source: docs.baldursgate3.game/index.php?title=Osiris:_Using_the_Story_Editor §Sections
|
|
114
|
+
tags:
|
|
115
|
+
- osiris
|
|
116
|
+
- story-editor
|
|
117
|
+
- errors
|
|
118
|
+
- debugging
|
|
119
|
+
- id: bg3.dialogue.osiris-goals.db-checked-but-never-defined-error
|
|
120
|
+
claim: '"Database checked but never defined" "occurs if you have left a reference to a DB somewhere
|
|
121
|
+
in the KB section of your script, but you never defined the DB within the INIT section of the
|
|
122
|
+
script, nor as part of a THEN block. Either remove the check or define the DB to fix the
|
|
123
|
+
error."'
|
|
124
|
+
status: community
|
|
125
|
+
source: docs.baldursgate3.game/index.php?title=Osiris:_Using_the_Story_Editor §Common Build Errors
|
|
126
|
+
and Warnings > Database checked but never defined
|
|
127
|
+
tags:
|
|
128
|
+
- osiris
|
|
129
|
+
- build-error
|
|
130
|
+
- database
|
|
131
|
+
- kb
|
|
132
|
+
- id: bg3.dialogue.osiris-goals.type-mismatch-requires-explicit-recast
|
|
133
|
+
claim: A "Conflict with function definition" build error "means the Story Editor has been told a
|
|
134
|
+
single variable has multiple types"; the fix is to recast "by adding the expected type in ()s
|
|
135
|
+
before the variable name" at one of its uses — the page's worked example changes the
|
|
136
|
+
DB_Players check to DB_Players((CHARACTER)_Player) — and you should "avoid recasting the type
|
|
137
|
+
of a variable multiple times in the same code block".
|
|
138
|
+
status: community
|
|
139
|
+
source: docs.baldursgate3.game/index.php?title=Osiris:_Using_the_Story_Editor §Common Build Errors
|
|
140
|
+
and Warnings > Conflict with function definition
|
|
141
|
+
tags:
|
|
142
|
+
- osiris
|
|
143
|
+
- build-error
|
|
144
|
+
- type-mismatch
|
|
145
|
+
- recast
|
|
146
|
+
- id: bg3.dialogue.osiris-goals.qry-proc-color-coding
|
|
147
|
+
claim: '"A properly spelled query will have a brick red name, and procs will have a bright green
|
|
148
|
+
one" — so a QRY_/PROC_ name still rendering in the default colour is the tell for a misspelled
|
|
149
|
+
name, which is what the "Could not find any complete/correct definition of Osiris User
|
|
150
|
+
Query/Procedure" error usually means.'
|
|
151
|
+
status: community
|
|
152
|
+
source: docs.baldursgate3.game/index.php?title=Osiris:_Using_the_Story_Editor §Common Build Errors
|
|
153
|
+
and Warnings > Could not find any complete/correct definition of Osiris User Query/Procedure
|
|
154
|
+
tags:
|
|
155
|
+
- osiris
|
|
156
|
+
- story-editor
|
|
157
|
+
- qry
|
|
158
|
+
- proc
|
|
159
|
+
- debugging
|
|
160
|
+
- id: bg3.dialogue.osiris-goals.osi-div-source-file
|
|
161
|
+
claim: "Compiled Osiris goal scripts ship as story.div.osi, one per module:
|
|
162
|
+
Gustav/Mods/Gustav/Story/, Gustav/Mods/GustavDev/Story/ and Gustav/Mods/Honour/Story/. Extract
|
|
163
|
+
with LSLib's \"Story (OSI) tools\" section: put the file in \"Story/savegame file path\",
|
|
164
|
+
press Load, set \"Goal output path\", press Extract."
|
|
165
|
+
status: community
|
|
166
|
+
source: wiki.bg3.community/en/Information/Osiris/unpacking-osiris
|
|
167
|
+
tags:
|
|
168
|
+
- osiris
|
|
169
|
+
- story-div-osi
|
|
170
|
+
- lslib
|
|
171
|
+
- extraction
|
|
172
|
+
- id: bg3.dialogue.osiris-goals.rule-structure-if-and-then
|
|
173
|
+
claim: 'Every Osiris rule has exactly two parts: an IF section of one or more conditions, each on
|
|
174
|
+
its own line and separated by the line AND, evaluated whenever the rule is triggered; and a
|
|
175
|
+
THEN section of one or more actions, each on its own line and ending with ";", executed only
|
|
176
|
+
once every condition in the IF section evaluates true.'
|
|
177
|
+
status: community
|
|
178
|
+
source: 'bg3-community/Tutorials/Osiris/Understanding-Osiris-Rules.md §The Structure of an Osiris
|
|
179
|
+
Rule (lines 33-48: "This part begins with IF"; "Each condition is separated by the line AND";
|
|
180
|
+
"This part begins with THEN"; "Each action ends with ;")'
|
|
181
|
+
tags:
|
|
182
|
+
- osiris
|
|
183
|
+
- rule
|
|
184
|
+
- structure
|
|
185
|
+
- if-then
|
|
186
|
+
- id: bg3.dialogue.osiris-goals.fact-database-definitions
|
|
187
|
+
claim: A "fact" is a set of one or more values; a "database" is a container for zero or more unique
|
|
188
|
+
facts, analogous to a table of rows (facts) and columns (values) — a fact can be "defined"
|
|
189
|
+
(added) or removed from a database at any time, and a database rejects a second definition of
|
|
190
|
+
a fact it already holds.
|
|
191
|
+
status: community
|
|
192
|
+
source: 'bg3-community/Tutorials/Osiris/Understanding-Osiris-Rules.md §Basic Definitions (lines
|
|
193
|
+
21-25: "Fact: A set of one or more values."; "Database: A container for zero or more unique
|
|
194
|
+
facts.")'
|
|
195
|
+
tags:
|
|
196
|
+
- osiris
|
|
197
|
+
- database
|
|
198
|
+
- fact
|
|
199
|
+
- definitions
|
|
200
|
+
- id: bg3.dialogue.osiris-goals.database-action-not-then-redefines-nothing
|
|
201
|
+
claim: Using a database as a THEN action defines (adds) the fact unless it is already defined, in
|
|
202
|
+
which case "the action won't do anything" — facts in a database must be unique, so the same
|
|
203
|
+
fact cannot be added a second time. Database actions must be used with a literal or an
|
|
204
|
+
already-assigned variable.
|
|
205
|
+
status: community
|
|
206
|
+
source: bg3-community/Tutorials/Osiris/Understanding-Osiris-Actions.md:15,19, §Databases ("Using a
|
|
207
|
+
database as an action will add a fact to the database unless the fact is already defined, in
|
|
208
|
+
which case the action won't do anything.")
|
|
209
|
+
tags:
|
|
210
|
+
- osiris
|
|
211
|
+
- database
|
|
212
|
+
- action
|
|
213
|
+
- idempotent
|
|
214
|
+
detail: 'Checked against the source (2026-09-08): an earlier wording also said such a rule "does not
|
|
215
|
+
re-trigger database conditions that already fired for it the first time". The page does not
|
|
216
|
+
say that anywhere; it only describes the add being a no-op. Dropped rather than promoted.'
|
|
217
|
+
- id: bg3.dialogue.osiris-goals.not-prefix-removes-database-fact
|
|
218
|
+
claim: Prefixing a database action with NOT removes that fact from the database if it is currently
|
|
219
|
+
defined (and is a no-op if it is not), which also re-triggers "inverted" database conditions
|
|
220
|
+
and allows the fact to be re-defined and trigger normal database conditions again afterward.
|
|
221
|
+
status: community
|
|
222
|
+
source: bg3-community/Tutorials/Osiris/Understanding-Osiris-Actions.md:17,41, §Databases ("We can
|
|
223
|
+
also invert database actions by adding `NOT` to the beginning of the line, which will remove a
|
|
224
|
+
fact from the database if it is already defined."; the worked example at :41 adds that this
|
|
225
|
+
triggers inverted database conditions and lets the fact be re-defined and trigger normal ones
|
|
226
|
+
again)
|
|
227
|
+
tags:
|
|
228
|
+
- osiris
|
|
229
|
+
- database
|
|
230
|
+
- not
|
|
231
|
+
- action
|
|
232
|
+
- id: bg3.dialogue.osiris-goals.condition-order-controls-evaluation-cost
|
|
233
|
+
claim: Combining two undeclared-variable database conditions on the SAME database before any
|
|
234
|
+
filtering condition makes the rule evaluate once per pair of facts (size(DB) squared,
|
|
235
|
+
described as "very inefficient"); reordering so a filtering condition (an equality check
|
|
236
|
+
against a known value) comes immediately after the first database condition collapses most of
|
|
237
|
+
those evaluations before the second database condition ever creates new versions of the rule,
|
|
238
|
+
avoiding the exponential blow-up.
|
|
239
|
+
status: community
|
|
240
|
+
source: 'bg3-community/Tutorials/Osiris/Considering-Performance.md §Number of Evaluations (worked
|
|
241
|
+
DB_Players example: "the number of times this rule has to be evaluated is the size of
|
|
242
|
+
DB_Players multiplied by itself. This is very inefficient." / the reordered version: "the
|
|
243
|
+
number of evaluations no longer grows exponentially")'
|
|
244
|
+
tags:
|
|
245
|
+
- osiris
|
|
246
|
+
- performance
|
|
247
|
+
- condition-order
|
|
248
|
+
- database
|
|
249
|
+
detail: "Practical rule of thumb for authoring: put the most selective filter condition as early as
|
|
250
|
+
possible after each undeclared-variable database condition, rather than grouping all database
|
|
251
|
+
conditions together before any filters."
|
|
252
|
+
- id: bg3.dialogue.osiris-goals.overloaded-procedure-with-default-parameter
|
|
253
|
+
claim: 'A procedure can be declared with two different parameter counts (an overload) to emulate a
|
|
254
|
+
default parameter value: PROC_MyProc() calling PROC_MyProc("This is the default message")
|
|
255
|
+
inside its own body makes calling the zero-argument form behave identically to calling the
|
|
256
|
+
one-argument form with that literal, while a caller can still supply a different string
|
|
257
|
+
explicitly via the one-argument form.'
|
|
258
|
+
status: community
|
|
259
|
+
source: bg3-community/Tutorials/Osiris/Understanding-Osiris-Actions.md:191-201, §Procedures ("If you
|
|
260
|
+
define the procedure more than once with different numbers of parameters, they will behave
|
|
261
|
+
like completely different procedures. We can use this to make our own default values"; worked
|
|
262
|
+
PROC_MyProc example with and without a (STRING)_Message parameter)
|
|
263
|
+
tags:
|
|
264
|
+
- osiris
|
|
265
|
+
- procedure
|
|
266
|
+
- overload
|
|
267
|
+
- default-parameter
|
|
268
|
+
- id: bg3.dialogue.osiris-goals.variables-start-with-underscore-convention
|
|
269
|
+
claim: The Osiris naming convention for variables is to always start with an underscore ("_"),
|
|
270
|
+
distinguishing a variable (e.g. _Player, _Character) from a literal, function name, or
|
|
271
|
+
database name in the same line of code.
|
|
272
|
+
status: community
|
|
273
|
+
source: 'bg3-community/Tutorials/Osiris/Understanding-Osiris-Conditions.md:102 ("The naming
|
|
274
|
+
convention for variables in Osiris is to always start with an underscore: _")'
|
|
275
|
+
tags:
|
|
276
|
+
- osiris
|
|
277
|
+
- naming-convention
|
|
278
|
+
- variables
|
|
279
|
+
- id: bg3.dialogue.osiris-goals.query-return-database-naming-convention
|
|
280
|
+
claim: The recommended naming convention for a database that only exists to capture a custom query's
|
|
281
|
+
return value is DB_QRYRTN_QueryName — e.g. a query QRY_CustomGetHitpoints would store its
|
|
282
|
+
result in DB_QRYRTN_CustomGetHitpoints.
|
|
283
|
+
status: community
|
|
284
|
+
source: 'bg3-community/Tutorials/Osiris/Understanding-Osiris-Conditions.md:645 ("A good naming
|
|
285
|
+
convention for query-return databases is: DB_QRYRTN_QueryName")'
|
|
286
|
+
tags:
|
|
287
|
+
- osiris
|
|
288
|
+
- naming-convention
|
|
289
|
+
- query
|
|
290
|
+
- database
|
|
291
|
+
- id: bg3.dialogue.osiris-goals.qry-onlyonce-fire-once-utility
|
|
292
|
+
claim: QRY_OnlyOnce is a built-in query that takes a string in-parameter and evaluates true only the
|
|
293
|
+
first time it is ever called with that particular string, even across multiple
|
|
294
|
+
concurrently-evaluating versions of the same rule — the documented pattern for making a
|
|
295
|
+
multiply-triggered rule fire exactly once per distinct key.
|
|
296
|
+
status: community
|
|
297
|
+
source: bg3-community/Tutorials/Osiris/Understanding-Osiris-Conditions.md:689 ("there is a query
|
|
298
|
+
`QRY_OnlyOnce` that takes a string as an in-parameter and only evaluates to true the first
|
|
299
|
+
time it is called with that particular string."; the next sentence adds that it evaluates true
|
|
300
|
+
for only one of several concurrently-evaluating versions of a rule)
|
|
301
|
+
tags:
|
|
302
|
+
- osiris
|
|
303
|
+
- qry-onlyonce
|
|
304
|
+
- deduplication
|
|
305
|
+
- utility-query
|
|
306
|
+
- id: bg3.dialogue.osiris-goals.calls-require-constant-or-assigned-variable
|
|
307
|
+
claim: Every in-parameter to an Osiris Call must be given either a constant/literal value or an
|
|
308
|
+
already- assigned variable — a Call cannot be given an undeclared (unassigned) variable the
|
|
309
|
+
way a database condition can, since a Call has no mechanism to enumerate possible values for
|
|
310
|
+
it.
|
|
311
|
+
status: community
|
|
312
|
+
source: bg3-community/Tutorials/Osiris/Understanding-Osiris-Actions.md §Calls ("Every call has one
|
|
313
|
+
or more in-parameters that must be given a constant value or an assigned variable so that it
|
|
314
|
+
knows exactly what we want it to do")
|
|
315
|
+
tags:
|
|
316
|
+
- osiris
|
|
317
|
+
- call
|
|
318
|
+
- variable
|
|
319
|
+
- constraint
|
|
320
|
+
- id: bg3.dialogue.osiris-goals.hardcoded-guid-literal-is-most-efficient-condition-form
|
|
321
|
+
claim: "When a rule only cares about specific, known characters, writing their GUIDs directly as
|
|
322
|
+
literals inside the database condition (e.g. DB_Players(S_Player_Wyll_c774d764-...)) instead
|
|
323
|
+
of an undeclared variable plus a separate equality filter is the most efficient form: the rule
|
|
324
|
+
then has exactly one version and only triggers for evaluation when one of the literal facts
|
|
325
|
+
itself is added or removed — strictly better than the \"declared variable filtered right after
|
|
326
|
+
its database condition\" pattern this topic's other performance fact recommends when the
|
|
327
|
+
target isn't a fixed, known value."
|
|
328
|
+
status: community
|
|
329
|
+
source: bg3-community/Tutorials/Osiris/Considering-Performance.md §Number of Evaluations (final
|
|
330
|
+
worked example and "This is incredibly efficient in both regards")
|
|
331
|
+
tags:
|
|
332
|
+
- osiris
|
|
333
|
+
- performance
|
|
334
|
+
- database
|
|
335
|
+
- literal
|
|
336
|
+
- condition-order
|
|
337
|
+
related:
|
|
338
|
+
- id: bg3.dialogue.osiris-goals.condition-order-controls-evaluation-cost
|
|
339
|
+
detail: "Names the even-more-efficient special case of that fact's general reordering advice: when
|
|
340
|
+
the values being matched are fixed and known ahead of time, skip the
|
|
341
|
+
undeclared-variable-plus-filter pattern entirely and hard-code the literal into the
|
|
342
|
+
database condition itself."
|
|
343
|
+
- id: bg3.dialogue.osiris-goals.player-membership-databases-are-distinct
|
|
344
|
+
claim: DB_Players (all registered player character UUIDs), DB_Avatars (registered player Avatar
|
|
345
|
+
character UUIDs), and DB_PartyMembers (currently registered party member UUIDs) are three
|
|
346
|
+
separately maintained, single-parameter (Character UUID) databases with distinct descriptions
|
|
347
|
+
in the db reference, listed as separate rows under Character Management.
|
|
348
|
+
status: community
|
|
349
|
+
source: bg3-community/Information/Osiris/db-reference/character-dbs.md:25-30, §Character Management
|
|
350
|
+
(DB_Players, DB_Avatars, DB_PartyMembers rows, each "1|Character UUID")
|
|
351
|
+
tags:
|
|
352
|
+
- osiris
|
|
353
|
+
- database
|
|
354
|
+
- db-players
|
|
355
|
+
- db-avatars
|
|
356
|
+
- db-partymembers
|
|
357
|
+
- gotcha
|
|
358
|
+
detail: "Inference, not in the source: because they are separately maintained, picking the wrong one
|
|
359
|
+
for a rule's intent (\"everyone in the current party\" vs. \"every player character that
|
|
360
|
+
exists\") will include or exclude characters the author did not mean to. The reference table
|
|
361
|
+
states the three descriptions only; it does not compare them or warn about the mix-up."
|
|
362
|
+
- id: bg3.dialogue.osiris-goals.raw-goal-txt-in-a-pak-is-inert-without-a-story-compile
|
|
363
|
+
claim: "A goal shipped only as Mods/<Mod>/Story/RawFiles/Goals/<Goal>.txt inside a pak does not
|
|
364
|
+
exist at runtime: its INIT database is nil (Osi.DB_<name> is nil, indexing it raises \"attempt
|
|
365
|
+
to index a nil value\"), and Osi.QuestUpdate for the journal entry it names returns without
|
|
366
|
+
error and shows nothing in the journal. The goal has to be compiled into the module's story
|
|
367
|
+
(the toolkit's Generate Definitions / Build) before the pak carries anything the engine runs."
|
|
368
|
+
status: verified
|
|
369
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
370
|
+
source: ModWright field verification
|
|
371
|
+
tags:
|
|
372
|
+
- osiris
|
|
373
|
+
- goals
|
|
374
|
+
- story-compile
|
|
375
|
+
- pak
|
|
376
|
+
- quest-stub
|
|
377
|
+
- journal
|
|
378
|
+
- scaffold
|
|
379
|
+
related:
|
|
380
|
+
- bg3.dialogue.osiris-goals.generate-definitions-build-reload-workflow
|
|
381
|
+
- bg3.dialogue.osiris-goals.osi-div-source-file
|
|
382
|
+
detail: The loca handles the scaffold wrote (journal title and entry text) resolved through
|
|
383
|
+
Ext.Loca.GetTranslatedString in the same session, so the loca half of the scaffold loads.
|
|
384
|
+
Whether the journal .lsx under Mods/<Mod>/Story/Journals loads as loose .lsx was not separated
|
|
385
|
+
from the missing compile; the RootTemplates rule (loose .lsx not loaded, .lsf needed) suggests
|
|
386
|
+
it does not.
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
game: baldursgate3
|
|
2
|
+
topic: dialogue
|
|
3
|
+
title: Vanilla dialogue editing, pipeline correction, and dialog override delivery
|
|
4
|
+
facts:
|
|
5
|
+
- id: bg3.dialogue.binary-source-not-editor
|
|
6
|
+
claim: "Never patch the shipped editor .lsj under Mods/<ns>/Story/Dialogs/ — it carries an extra
|
|
7
|
+
top-level editorData REGION and an older save version (4.5.0.500 vs the binary's 4.6.0.1), and
|
|
8
|
+
Divine bakes both into the converted .lsf. Correct source: extract the vanilla
|
|
9
|
+
DialogsBinary/*.lsf, convert lsf→lsj (drops editor junk, right version), patch THAT, convert
|
|
10
|
+
back lsj→lsf."
|
|
11
|
+
status: verified
|
|
12
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
13
|
+
source: ModWright field verification
|
|
14
|
+
tags:
|
|
15
|
+
- dialogue
|
|
16
|
+
- editing
|
|
17
|
+
- editor
|
|
18
|
+
- binary
|
|
19
|
+
- pipeline
|
|
20
|
+
detail: The editor .lsj is still the best READING copy (it has logicalname labels the binary lacks),
|
|
21
|
+
but it is not the correct patching source. Round-trips cleanly; a patched file lands at
|
|
22
|
+
~vanilla size (a bloated output means editor junk came along).
|
|
23
|
+
- id: bg3.dialogue.node-structure
|
|
24
|
+
claim: "Dialog node graph: save.regions.dialog.nodes[0].node[]. Constructors include TagGreeting
|
|
25
|
+
(entry, per checkflags), TagQuestion (player option), TagAnswer, ActiveRoll (an option with
|
|
26
|
+
dice: RollType/Ability/Skill/DifficultyClassID guid), RollResult (Success bool → children),
|
|
27
|
+
Jump (jumptarget + jumptargetpoint: 2 = target's children), Alias."
|
|
28
|
+
status: verified
|
|
29
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
30
|
+
source: ModWright field verification
|
|
31
|
+
tags:
|
|
32
|
+
- dialogue
|
|
33
|
+
- node-graph
|
|
34
|
+
- structure
|
|
35
|
+
detail: Add an option = clone a donor node in the SAME dialog (keeps field shapes valid), give it a
|
|
36
|
+
new UUID, and splice it into the parent's children[0].child list at the position you want it
|
|
37
|
+
shown.
|
|
38
|
+
- id: bg3.dialogue.class-gate-tag-rules
|
|
39
|
+
claim: Gate an option by class with either TaggedText RuleGroup tag rules (what vanilla [WIZARD]
|
|
40
|
+
options use; auto-renders the tag DisplayName prefix) or a checkflags flaggroup type="Tag"
|
|
41
|
+
{UUID=<tag guid>, value=true, paramval=<speaker index>} (no auto-prefix, so custom "[Hack]
|
|
42
|
+
..." text works). The player's speaker index varies per dialog — read speakerlist.
|
|
43
|
+
status: verified
|
|
44
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
45
|
+
source: ModWright field verification
|
|
46
|
+
tags:
|
|
47
|
+
- dialogue
|
|
48
|
+
- gating
|
|
49
|
+
- class
|
|
50
|
+
- tags
|
|
51
|
+
detail: "Verified by hand end-to-end in game: a custom [Hack] option passes the class gate (pod
|
|
52
|
+
console; Withers crypt dialog)."
|
|
53
|
+
- id: bg3.dialogue.override-cannot-ship-in-pak
|
|
54
|
+
claim: "Earlier rule (v1.5.3.1): dialog overrides CANNOT ship inside a registered mod pak — any
|
|
55
|
+
Mods/<vanilla-module>/Story/DialogsBinary/*.lsf in the pak was said to CTD at LoadModule, even
|
|
56
|
+
a byte-exact copy of vanilla, so overrides had to be deployed as loose files under the game's
|
|
57
|
+
Data/Mods/<ns>/Story/DialogsBinary/."
|
|
58
|
+
status: contradicted
|
|
59
|
+
source: ModWright research
|
|
60
|
+
tags:
|
|
61
|
+
- dialogue
|
|
62
|
+
- pak
|
|
63
|
+
- override
|
|
64
|
+
- delivery
|
|
65
|
+
detail: Kept so the mistake is not remade. The rule stood for a full release cycle and shaped
|
|
66
|
+
dialogue strategy (it is why the namespaced DialogBank workaround was built). Superseded by
|
|
67
|
+
bg3.dialogue.override-packing-rule-was-wrong. Loose files under
|
|
68
|
+
Data/Mods/<ns>/Story/DialogsBinary/ do still load — that half of the rule is correct and is
|
|
69
|
+
the fast dev-iteration route.
|
|
70
|
+
- id: bg3.dialogue.override-packing-rule-was-wrong
|
|
71
|
+
claim: Dialog overrides CAN be packed. A pak containing all 22 binary-derived
|
|
72
|
+
Mods/<vanilla-module>/Story/DialogsBinary overrides launched with NO crash (verified by hand),
|
|
73
|
+
and the [Hack] options fire from the pak.
|
|
74
|
+
status: verified
|
|
75
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
76
|
+
supersedes: bg3.dialogue.override-cannot-ship-in-pak
|
|
77
|
+
source: ModWright field verification
|
|
78
|
+
tags:
|
|
79
|
+
- dialogue
|
|
80
|
+
- pak
|
|
81
|
+
- override
|
|
82
|
+
- misattribution
|
|
83
|
+
detail: The original CTD was "almost certainly" the editor-vs-binary save-version bug (editor .lsj
|
|
84
|
+
4.5.0.500 baked into the .lsf vs the binary's 4.6.0.1) — the same root cause that broke the
|
|
85
|
+
loose files before the pipeline switched to binary-derived sources; it was misattributed to
|
|
86
|
+
"packing dialogs." The release pak now folds DialogOverrides/{Gustav,GustavDev} into its Mods/
|
|
87
|
+
tree. The loose-file route still works for fast dev iteration but is no longer required for
|
|
88
|
+
distribution.
|
|
89
|
+
- id: bg3.dialogue.dialogbank-namespaced-pattern
|
|
90
|
+
claim: "Community non-override layout (Various Dialogue Fixes / wiki.bg3.community Dialogue Files
|
|
91
|
+
Tutorial): ship each edited .lsf at Mods/<mod>/Story/DialogsBinary/<same rel path> and add a
|
|
92
|
+
DialogBank at Public/<mod>/Content/Assets/Dialogs/[PAK]_<BankName>/_merged.lsf whose Resource
|
|
93
|
+
nodes are byte-for-byte copies of the vanilla entries (same resource ID, Name, flags,
|
|
94
|
+
SpeakerSlotsWithLines) with only SourceFile re-pointed to Mods/<mod>/Story/Dialogs/<rel>.lsj.
|
|
95
|
+
The game resolves the DialogsBinary .lsf through that .lsj path (no .lsj needs to ship)."
|
|
96
|
+
status: verified
|
|
97
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
98
|
+
source: ModWright field verification
|
|
99
|
+
tags:
|
|
100
|
+
- dialogue
|
|
101
|
+
- dialogbank
|
|
102
|
+
- namespaced
|
|
103
|
+
- toolkit
|
|
104
|
+
detail: "A class mod shipped 22 such Resource nodes in its own [PAK]_ dialogue bank. Needed because
|
|
105
|
+
the Toolkit packs only the project's own Mods/<proj> + Public/<proj> folders, so
|
|
106
|
+
path-overrides into Gustav(Dev) never reach the mod.io pak. Load-order aware; shows in the
|
|
107
|
+
in-game mod manager. Verified by hand: the options fire from the namespaced test pak;
|
|
108
|
+
extract+diff confirmed all 22 lsf byte-identical plus the bank."
|
|
109
|
+
- id: bg3.dialogue.flags-guid-definitions
|
|
110
|
+
claim: Dialogs reference flags by GUID; definitions are one-per-file Public/Gustav/Flags/<guid>.lsf
|
|
111
|
+
(convert to .lsx, read Name). The Osiris FLAG identifier is Name_GUID.
|
|
112
|
+
Osi.SetFlag("Name_GUID", char) WORKS (actions are fine); Osi.GetFlag is broken like the other
|
|
113
|
+
queries (returned 0 for a provably-set flag).
|
|
114
|
+
status: verified
|
|
115
|
+
verified_on: 4.73.98.727 (Patch 8)
|
|
116
|
+
source: ModWright field verification
|
|
117
|
+
tags:
|
|
118
|
+
- dialogue
|
|
119
|
+
- flags
|
|
120
|
+
- guid
|
|
121
|
+
- osiris
|
|
122
|
+
detail: Use SetFlag to arm flags from dialogue; do not rely on GetFlag for queries in this SE build.
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
game: baldursgate3
|
|
2
|
+
topic: feats.classes
|
|
3
|
+
title: Basic class creation, and the feats-as-passives pattern
|
|
4
|
+
facts:
|
|
5
|
+
- id: bg3.feats.classes.classdescription-required-attributes
|
|
6
|
+
claim: A ClassDescription node's practical minimum attribute set is BaseHp, CharacterCreationPose (a
|
|
7
|
+
guid, commonly reused from a vanilla class), Description and DisplayName (TranslatedString
|
|
8
|
+
handles), HpPerLevel, LearningStrategy, Name (FixedString), PrimaryAbility (uint8),
|
|
9
|
+
ProgressionTableUUID, SoundClassType (FixedString, can reuse a vanilla class's),
|
|
10
|
+
SpellCastingAbility (uint8), and UUID.
|
|
11
|
+
status: community
|
|
12
|
+
source: wiki.bg3.community/en/Tutorials/Classes/Basic-Class-Creation §ClassDescription.lsx
|
|
13
|
+
tags:
|
|
14
|
+
- class
|
|
15
|
+
- classdescription
|
|
16
|
+
- required-fields
|
|
17
|
+
- id: bg3.feats.classes.hpperlevel-adds-one
|
|
18
|
+
claim: 'The engine adds 1 to the HpPerLevel value: "Please be aware that it takes what value you put
|
|
19
|
+
here and adds 1 to it. So the 4 I put here plus the basehp i put as 6 will give me 11, not
|
|
20
|
+
10." Author HpPerLevel one lower than the per-level gain you want.'
|
|
21
|
+
status: community
|
|
22
|
+
source: wiki.bg3.community/en/Tutorials/Classes/Basic-Class-Creation §ClassDescription.lsx
|
|
23
|
+
tags:
|
|
24
|
+
- class
|
|
25
|
+
- classdescription
|
|
26
|
+
- hpperlevel
|
|
27
|
+
- gotcha
|
|
28
|
+
- id: bg3.feats.classes.primaryability-numeric-mapping
|
|
29
|
+
claim: ClassDescription's PrimaryAbility (and SpellCastingAbility) attribute is a uint8 ability
|
|
30
|
+
index, given on the page as "1 = dex, 2 = str, 3 = con, 4 = int, 5 = wis, 6 = chr" — note
|
|
31
|
+
Dexterity is 1 and Strength is 2, not the usual STR-first order.
|
|
32
|
+
status: community
|
|
33
|
+
source: wiki.bg3.community/en/Tutorials/Classes/Basic-Class-Creation §ClassDescription.lsx
|
|
34
|
+
tags:
|
|
35
|
+
- class
|
|
36
|
+
- classdescription
|
|
37
|
+
- primaryability
|
|
38
|
+
- enum
|
|
39
|
+
- id: bg3.feats.classes.subclass-is-classdescription-with-parentguid
|
|
40
|
+
claim: A subclass is defined as its own ClassDescription node whose ParentGuid equals the base class
|
|
41
|
+
ClassDescription's UUID, and which needs its own newly-generated ProgressionTableUUID distinct
|
|
42
|
+
from the base class's and from every other subclass's.
|
|
43
|
+
status: community
|
|
44
|
+
source: wiki.bg3.community/en/Tutorials/Classes/Basic-Class-Creation §Subclasses
|
|
45
|
+
tags:
|
|
46
|
+
- class
|
|
47
|
+
- subclass
|
|
48
|
+
- parentguid
|
|
49
|
+
- progressiontableuuid
|
|
50
|
+
- id: bg3.feats.classes.subclass-listed-under-parent-progression
|
|
51
|
+
claim: A subclass becomes choosable at a given level by adding a SubClasses/SubClass child node
|
|
52
|
+
(Object = the subclass's ClassDescription UUID) to the base class's Progression node for that
|
|
53
|
+
level, and the subclass's own Progression node(s) must set ProgressionType to 1 (versus 0 for
|
|
54
|
+
the base class).
|
|
55
|
+
status: community
|
|
56
|
+
source: wiki.bg3.community/en/Tutorials/Classes/Basic-Class-Creation §Subclasses
|
|
57
|
+
tags:
|
|
58
|
+
- class
|
|
59
|
+
- subclass
|
|
60
|
+
- progression
|
|
61
|
+
- progressiontype
|
|
62
|
+
- id: bg3.feats.classes.actionresourcedefinition-required-fields
|
|
63
|
+
claim: A custom class resource is defined in ActionResourceDefinitions.lsx with Description and
|
|
64
|
+
DisplayName (TranslatedString handles), MaxLevel (uint32), Name (FixedString — the worked
|
|
65
|
+
example uses "SpeedForce", the same string that then appears in the
|
|
66
|
+
ActionResource(SpeedForce,2,0) boost), ReplenishType (FixedString, "ShortRest" in the
|
|
67
|
+
example), IsSpellResource (bool), ShowOnActionResourcePanel (bool), and its own UUID (guid).
|
|
68
|
+
status: community
|
|
69
|
+
source: wiki.bg3.community/en/Tutorials/Classes/Basic-Class-Creation §Action Resources
|
|
70
|
+
tags:
|
|
71
|
+
- class
|
|
72
|
+
- actionresourcedefinition
|
|
73
|
+
- required-fields
|
|
74
|
+
- id: bg3.feats.classes.actionresource-granted-via-boosts
|
|
75
|
+
claim: "A custom ActionResourceDefinition only takes effect once granted through a Progression's
|
|
76
|
+
Boosts string, e.g. ActionResource(SpeedForce,2,0): \"We have made a new action resource but
|
|
77
|
+
right now it just floating around.\""
|
|
78
|
+
status: community
|
|
79
|
+
source: wiki.bg3.community/en/Tutorials/Classes/Basic-Class-Creation §Action Resources
|
|
80
|
+
tags:
|
|
81
|
+
- class
|
|
82
|
+
- actionresourcedefinition
|
|
83
|
+
- boosts
|
|
84
|
+
- silent-failure
|
|
85
|
+
- id: bg3.feats.classes.tags-live-in-children-node
|
|
86
|
+
claim: A ClassDescription (or subclass) links to its Tags entry through a children/Tags node
|
|
87
|
+
carrying an Object guid attribute — not through an attribute on ClassDescription itself; the
|
|
88
|
+
tag's own .lsx file "should be a new unique uuid" as its filename, and that filename UUID is
|
|
89
|
+
what other files reference.
|
|
90
|
+
status: community
|
|
91
|
+
source: wiki.bg3.community/en/Tutorials/Classes/Basic-Class-Creation §Tags > Make tag file, §Use
|
|
92
|
+
Tag; filename-vs-internal-UUID rule from the Community Library wiki, Building-a-Race-Mod
|
|
93
|
+
§Anatomy of a Tag
|
|
94
|
+
tags:
|
|
95
|
+
- class
|
|
96
|
+
- tags
|
|
97
|
+
- structure
|
|
98
|
+
detail: The Basic-Class-Creation page shows the structure and the uuid-named tag file but does not
|
|
99
|
+
spell out which of the tag's two UUIDs to reference; that is stated explicitly on the
|
|
100
|
+
Community Library race page — see
|
|
101
|
+
bg3.races.progression.tag-filename-differs-from-internal-uuid.
|
|
102
|
+
- id: bg3.feats.classes.passivesadded-vs-selectpassives-selector
|
|
103
|
+
claim: "Passives can reach a class two ways with different semantics: PassivesAdded on the
|
|
104
|
+
Progression node unconditionally grants a fixed, named passive at that level; a
|
|
105
|
+
SelectPassives(...) inside Selectors lets the player choose among a PassiveList's options. Use
|
|
106
|
+
PassivesAdded for something the class always gets, SelectPassives only when the player must
|
|
107
|
+
pick."
|
|
108
|
+
status: community
|
|
109
|
+
source: wiki.bg3.community/en/Tutorials/Classes/Basic-Class-Creation §Selectors ("SelectPassives()
|
|
110
|
+
takes 3 parameters...the UUID of the list of passives, the amount of options you can select"),
|
|
111
|
+
§Boosts and PassivesAdded/Removed (Progressions.lsx) > PassivesAdded/Removed
|
|
112
|
+
tags:
|
|
113
|
+
- class
|
|
114
|
+
- passivesadded
|
|
115
|
+
- selectors
|
|
116
|
+
- selectpassives
|
|
117
|
+
- id: bg3.feats.classes.boosts-vs-passivesadded-distinction
|
|
118
|
+
claim: 'Boosts and PassivesAdded on a Progression node are different attributes, not two spellings
|
|
119
|
+
of the same thing: Boosts holds inline boost-function strings ("things our class should get,
|
|
120
|
+
like maybe certain weapon proficiencies, different actions resources...debuffs, buffs, ability
|
|
121
|
+
changes"), while PassivesAdded holds names that "refer to passives found in Passive.txt".'
|
|
122
|
+
status: community
|
|
123
|
+
source: wiki.bg3.community/en/Tutorials/Classes/Basic-Class-Creation §Boosts and
|
|
124
|
+
PassivesAdded/Removed (Progressions.lsx) > Boosts, > PassivesAdded/Removed
|
|
125
|
+
tags:
|
|
126
|
+
- class
|
|
127
|
+
- boosts
|
|
128
|
+
- passivesadded
|
|
129
|
+
- progressions
|
|
130
|
+
detail: 'Both are semicolon-separated lists (Community Library wiki, Building-a-Race-Mod §Racial
|
|
131
|
+
Progressions: "PassivesAdded: A semicolon-separated list of passive IDs").'
|
|
132
|
+
- id: bg3.feats.classes.level1-progression-required-for-cc
|
|
133
|
+
claim: A class requires at minimum a Level 1 Progression node with its TableUUID matching the
|
|
134
|
+
ClassDescription's ProgressionTableUUID; without one the class cannot progress past the
|
|
135
|
+
character-creation screen ("your class does require a level 1 progression to make it past the
|
|
136
|
+
character creation page").
|
|
137
|
+
status: community
|
|
138
|
+
source: wiki.bg3.community/en/Tutorials/Classes/Basic-Class-Creation §Progressions.lsx
|
|
139
|
+
tags:
|
|
140
|
+
- class
|
|
141
|
+
- progressions
|
|
142
|
+
- level1
|
|
143
|
+
- character-creation
|
|
144
|
+
- id: bg3.feats.classes.feats-follow-passive-boost-pattern
|
|
145
|
+
claim: "A Feat is the same injection target as a Progression: the Compatibility Framework's config
|
|
146
|
+
and API take FileType \"Feat\" or \"Progression\" interchangeably for both Strings (Type
|
|
147
|
+
Boosts, PassivesAdded, PassivesRemoved, Requirements) and Selectors, so a feat is authored as
|
|
148
|
+
the PassivesAdded/Boosts pattern applied to a Feats entry rather than to a Progression node."
|
|
149
|
+
status: community
|
|
150
|
+
source: BG3-Compatibility-Framework wiki, _Boosts-and-Passives.md §API ("FileType = either
|
|
151
|
+
Progression or Feat, defaults to Progression if not included") and _Selector-API.md (Feats
|
|
152
|
+
config entries); pattern side from
|
|
153
|
+
wiki.bg3.community/en/Tutorials/Classes/Basic-Class-Creation §Boosts and PassivesAdded/Removed
|
|
154
|
+
(Progressions.lsx)
|
|
155
|
+
tags:
|
|
156
|
+
- feat
|
|
157
|
+
- passive
|
|
158
|
+
- boost
|
|
159
|
+
- source-gap
|
|
160
|
+
detail: "Recorded because no feat-specific tutorial exists to cite: feats are not independently
|
|
161
|
+
documented on wiki.bg3.community as of this writing, a real gap rather than an artifact of
|
|
162
|
+
search limitations. This fact says plainly that feats are the passive/boost pattern applied to
|
|
163
|
+
Feats.lsx — an analogy backed by the framework's own FileType enum, not by a feat
|
|
164
|
+
walkthrough."
|