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,41 @@
|
|
|
1
|
+
game: skyrimse
|
|
2
|
+
topic: install.detection
|
|
3
|
+
title: Where a Skyrim Special Edition install is recorded, by storefront
|
|
4
|
+
facts:
|
|
5
|
+
- id: sse.install.detection.epic-manifests
|
|
6
|
+
claim: "An Epic Games Store install is found through the Epic Games Launcher's own manifests: one
|
|
7
|
+
`*.item` JSON file per installed app under the launcher data directory's `Manifests` folder,
|
|
8
|
+
where that directory is the registry value `HKLM\\Software\\Epic Games\\EpicGamesLauncher`
|
|
9
|
+
`AppDataPath` or, failing that, `%ProgramData%\\Epic\\EpicGamesLauncher\\Data\\`. A manifest
|
|
10
|
+
whose `AppName` is `ac82db5035584c7f8a2c548d98c86b2c` (Skyrim Special Edition) or
|
|
11
|
+
`5d600e4f59974aeba0259c7734134e27` (the Anniversary Edition update) names the install folder
|
|
12
|
+
in `InstallLocation`."
|
|
13
|
+
status: community
|
|
14
|
+
source: 'modorganizer-game_gamebryo src/gamebryo/gamegamebryo.cpp
|
|
15
|
+
`GameGamebryo::parseEpicGamesLocation` (read 2026-09-11): `findInRegistry(HKEY_LOCAL_MACHINE,
|
|
16
|
+
L"Software\\Epic Games\\EpicGamesLauncher", L"AppDataPath")`, the
|
|
17
|
+
`getKnownFolderPath(FOLDERID_ProgramData, false) + "\\Epic\\EpicGamesLauncher\\Data\\"`
|
|
18
|
+
fallback, `manifestDir += "Manifests"`, `QDir epicManifests(manifestDir, "*.item",
|
|
19
|
+
QDir::SortFlags(QDir::Name | QDir::IgnoreCase), QDir::Files)`, and `manifestJson["AppName"]` /
|
|
20
|
+
`manifestJson["InstallLocation"]`; the two app ids from modorganizer-game_skyrimse
|
|
21
|
+
src/gameskyrimse.cpp `GameSkyrimSE::identifyGamePath` ("AppName:
|
|
22
|
+
ac82db5035584c7f8a2c548d98c86b2c", "AE Update: 5d600e4f59974aeba0259c7734134e27")'
|
|
23
|
+
tags:
|
|
24
|
+
- install
|
|
25
|
+
- detect
|
|
26
|
+
- epic
|
|
27
|
+
- storefront
|
|
28
|
+
- manifest
|
|
29
|
+
detail: "MO2 reads the manifests only after the Bethesda and GOG registry keys came back empty;
|
|
30
|
+
ModWright reads them as one more candidate source and lets dedupeByRoot fold duplicates, as
|
|
31
|
+
every ModWright surface does. SKSE does not support the Epic build (fact
|
|
32
|
+
sse.skse.runtime.no-microsoft-store-or-epic-support), so an Epic install is detected so that
|
|
33
|
+
compat can say so, not because modding it is recommended. No real Epic install has been read;
|
|
34
|
+
the reader is tested against synthetic manifests in the launcher's shape. ModWright also reads
|
|
35
|
+
the `WOW6432Node` view of the launcher key, which MO2 does not: the launcher's installer is
|
|
36
|
+
32-bit, and the registry value only matters when the data directory is not the default one the
|
|
37
|
+
fallback already covers. The Microsoft Store install is still not searched, because neither
|
|
38
|
+
reference says where to look: MO2 has no Microsoft Store handling at all
|
|
39
|
+
(`GameSkyrimSE::gameVariants` is `{\"Steam\", \"GOG\", \"Epic Games\"}`), and libloadorder's
|
|
40
|
+
`is_microsoft_store_install` only recognizes an install it is already given, by
|
|
41
|
+
`appxmanifest.xml` in the game directory."
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
game: skyrimse
|
|
2
|
+
topic: loadorder.files
|
|
3
|
+
title: Plugins.txt, the asterisk load order system, and what the mod managers do to it
|
|
4
|
+
facts:
|
|
5
|
+
- id: sse.loadorder.files.asterisk-system
|
|
6
|
+
claim: 'Skyrim SE uses the "asterisk" load order system: order is the order of lines in Plugins.txt
|
|
7
|
+
and an entry is active when its line begins with `*`. Skyrim LE used the older textfile system
|
|
8
|
+
with a separate loadorder.txt; Oblivion and the Fallout 3 era used file timestamps.'
|
|
9
|
+
status: community
|
|
10
|
+
source: Ortham/libloadorder src/game_settings.rs, fn load_order_method (SkyrimSE maps to
|
|
11
|
+
LoadOrderMethod::Asterisk); doc/src/load_order_mechanisms.md
|
|
12
|
+
tags:
|
|
13
|
+
- load-order
|
|
14
|
+
- plugins-txt
|
|
15
|
+
- asterisk
|
|
16
|
+
- sse-vs-le
|
|
17
|
+
detail: The doc's framing of why this matters - "load order position is no longer an intrinsic
|
|
18
|
+
property of a plugin" - is the reason a Skyrim SE surface must read the order file rather than
|
|
19
|
+
inspect the Data directory.
|
|
20
|
+
- id: sse.loadorder.files.plugins-txt-path-is-storefront-dependent
|
|
21
|
+
claim: Plugins.txt lives under %LOCALAPPDATA% in a folder whose name depends on the storefront -
|
|
22
|
+
"Skyrim Special Edition" for Steam, "Skyrim Special Edition GOG", "Skyrim Special Edition
|
|
23
|
+
EPIC" and "Skyrim Special Edition MS" for the others.
|
|
24
|
+
status: community
|
|
25
|
+
source: Ortham/libloadorder src/game_settings.rs, fn skyrim_se_appdata_folder_name and fn
|
|
26
|
+
plugins_file_path; the same names appear in ModOrganizer2/modorganizer-game_skyrimse
|
|
27
|
+
src/gameskyrimse.cpp (GameSkyrimSE::gameDirectoryName)
|
|
28
|
+
tags:
|
|
29
|
+
- load-order
|
|
30
|
+
- plugins-txt
|
|
31
|
+
- path
|
|
32
|
+
- gog
|
|
33
|
+
- epic
|
|
34
|
+
- storefront
|
|
35
|
+
detail: libloadorder and MO2 both detect the storefront by probing the game install directory -
|
|
36
|
+
Galaxy64.dll means GOG, EOSSDK-Win64-Shipping.dll means Epic, otherwise Steam. The same folder
|
|
37
|
+
name is used for Documents\My Games\<name>. A surface that hardcodes the Steam name is wrong
|
|
38
|
+
for three of four storefronts.
|
|
39
|
+
- id: sse.loadorder.files.plugins-txt-is-windows-1252
|
|
40
|
+
claim: Plugins.txt is encoded Windows-1252 without a BOM. A plugin filename containing a character
|
|
41
|
+
outside Windows-1252 cannot be written to it at all.
|
|
42
|
+
status: community
|
|
43
|
+
source: Ortham/libloadorder doc/src/active_plugins.md ("Both active plugins files are encoded in
|
|
44
|
+
Windows-1252 ... some plugins have filenames which cannot be represented in Windows-1252, and
|
|
45
|
+
so cannot be activated without first renaming them"); src/load_order/mutable.rs
|
|
46
|
+
read_plugin_names, src/load_order/mod.rs strict_encode
|
|
47
|
+
tags:
|
|
48
|
+
- load-order
|
|
49
|
+
- plugins-txt
|
|
50
|
+
- encoding
|
|
51
|
+
- windows-1252
|
|
52
|
+
- gotcha
|
|
53
|
+
detail: libloadorder decodes with decode_without_bom_handling_and_without_replacement and encodes
|
|
54
|
+
with a strict_encode that returns Error::EncodeError rather than writing lossily. Reading the
|
|
55
|
+
file as UTF-8 mangles non-ASCII mod names.
|
|
56
|
+
- id: sse.loadorder.files.line-grammar
|
|
57
|
+
claim: An empty line or a line starting with `#` is ignored. A line starting with `*` names an
|
|
58
|
+
active plugin, with the filename following the asterisk immediately and no space. Any other
|
|
59
|
+
line names a plugin that is listed but inactive, which still holds a load order position.
|
|
60
|
+
status: community
|
|
61
|
+
source: Ortham/libloadorder src/load_order/asterisk_based.rs, fn plugin_line_mapper and fn save
|
|
62
|
+
tags:
|
|
63
|
+
- load-order
|
|
64
|
+
- plugins-txt
|
|
65
|
+
- parser
|
|
66
|
+
- syntax
|
|
67
|
+
detail: On write, the marker is a bare `*` then the name then a newline; inactive entries get no
|
|
68
|
+
marker.
|
|
69
|
+
- id: sse.loadorder.files.duplicate-and-ghost-handling
|
|
70
|
+
claim: If the same filename appears more than once, the last entry wins. Name matching is
|
|
71
|
+
case-insensitive and a trailing .ghost suffix is trimmed before comparison.
|
|
72
|
+
status: community
|
|
73
|
+
source: Ortham/libloadorder src/load_order/mutable.rs, fn total_insertion_order (comment "If the
|
|
74
|
+
same filename is listed multiple times, keep the last entry"), which uses UniCase and
|
|
75
|
+
trim_dot_ghost
|
|
76
|
+
tags:
|
|
77
|
+
- load-order
|
|
78
|
+
- plugins-txt
|
|
79
|
+
- parser
|
|
80
|
+
- duplicates
|
|
81
|
+
- ghost
|
|
82
|
+
- id: sse.loadorder.files.five-masters-are-implicit-and-absent
|
|
83
|
+
claim: Skyrim.esm, Update.esm, Dawnguard.esm, HearthFires.esm and Dragonborn.esm are hardcoded to
|
|
84
|
+
load first and are omitted from Plugins.txt entirely, as is every plugin named in <game
|
|
85
|
+
dir>\Skyrim.ccc. A reader must synthesise them at the head of the order.
|
|
86
|
+
status: community
|
|
87
|
+
source: Ortham/libloadorder src/game_settings.rs SKYRIM_SE_HARDCODED_PLUGINS, fn ccc_file_paths, fn
|
|
88
|
+
early_loading_plugins, fn implicitly_active_plugins; src/load_order/ asterisk_based.rs fn save
|
|
89
|
+
("Skip early loading plugins"); MO2 GameSkyrimSE::primaryPlugins and CCPlugins
|
|
90
|
+
tags:
|
|
91
|
+
- load-order
|
|
92
|
+
- plugins-txt
|
|
93
|
+
- implicit
|
|
94
|
+
- creation-club
|
|
95
|
+
- skyrim-ccc
|
|
96
|
+
- gotcha
|
|
97
|
+
detail: Any index computed straight from the file's lines is low by at least five. Creation Club
|
|
98
|
+
content adds more. libloadorder's own doc states the ordering rule - official Bethesda
|
|
99
|
+
plugins, DLC and Creation Club plugins "are all hardcoded to always load in a certain order
|
|
100
|
+
before other plugins".
|
|
101
|
+
- id: sse.loadorder.files.no-loadorder-txt-for-sse
|
|
102
|
+
claim: There is no loadorder.txt for Skyrim Special Edition. libloadorder returns a path for it only
|
|
103
|
+
for Skyrim LE and Oblivion Remastered; a loadorder.txt found alongside an SSE install is a mod
|
|
104
|
+
manager's own artifact.
|
|
105
|
+
status: community
|
|
106
|
+
source: Ortham/libloadorder src/game_settings.rs, fn load_order_path (GameId::SkyrimSE falls into
|
|
107
|
+
the `_ => None` arm); doc/src/textfile_standard.md ("Unlike the other games, Skyrim (but not
|
|
108
|
+
the Special Edition) does not define the load order of inactive plugins")
|
|
109
|
+
tags:
|
|
110
|
+
- load-order
|
|
111
|
+
- loadorder-txt
|
|
112
|
+
- sse-vs-le
|
|
113
|
+
- gotcha
|
|
114
|
+
- id: sse.loadorder.files.unlisted-plugins-order-is-synthesized
|
|
115
|
+
claim: Plugins present on disk but absent from Plugins.txt are appended after every listed one,
|
|
116
|
+
inactive, ordered by file modification time ascending and, on a tie, by uppercased filename
|
|
117
|
+
descending. This ordering is libloadorder's synthesis, not game behaviour - the game loads
|
|
118
|
+
only active plugins and has no opinion about the rest.
|
|
119
|
+
status: inferred
|
|
120
|
+
source: Ortham/libloadorder src/load_order/mutable.rs fn total_insertion_order and
|
|
121
|
+
src/game_settings.rs sort_plugins_dir_entries with its comment, plus the test
|
|
122
|
+
find_plugins_in_directories_should_sort_files_by_modification_timestamp
|
|
123
|
+
tags:
|
|
124
|
+
- load-order
|
|
125
|
+
- plugins-txt
|
|
126
|
+
- inactive
|
|
127
|
+
- synthesis
|
|
128
|
+
- caveat
|
|
129
|
+
detail: Marked inferred because the "not game behaviour" half is a reading of what the code is for,
|
|
130
|
+
not a quoted statement. A tool that reports this ordering must label it as a tool convention
|
|
131
|
+
or it will be taken for an engine rule.
|
|
132
|
+
- id: sse.loadorder.files.master-hoisting
|
|
133
|
+
claim: Master plugins load before non-master plugins, with one exception - a non-master that a
|
|
134
|
+
master depends on is hoisted to load between that master and the one preceding it.
|
|
135
|
+
status: community
|
|
136
|
+
source: Ortham/libloadorder doc/src/load_order_mechanisms.md; implemented as fn hoist_masters in
|
|
137
|
+
src/load_order/mutable.rs
|
|
138
|
+
tags:
|
|
139
|
+
- load-order
|
|
140
|
+
- masters
|
|
141
|
+
- hoisting
|
|
142
|
+
- id: sse.loadorder.files.mo2-profile-owns-the-real-file
|
|
143
|
+
claim: Under Mod Organizer 2 the authoritative plugins.txt is the one in the active profile
|
|
144
|
+
directory, which MO2 maps onto the %LOCALAPPDATA% location for the processes it launches. MO2
|
|
145
|
+
also keeps a loadorder.txt there even though Skyrim SE does not use one.
|
|
146
|
+
status: community
|
|
147
|
+
source: ModOrganizer2/modorganizer-game_skyrimse src/gameskyrimse.cpp, GameSkyrimSE::mappings (maps
|
|
148
|
+
both plugins.txt and loadorder.txt from the profile path to
|
|
149
|
+
localAppFolder()/gameDirectoryName())
|
|
150
|
+
tags:
|
|
151
|
+
- load-order
|
|
152
|
+
- mo2
|
|
153
|
+
- profile
|
|
154
|
+
- plugins-txt
|
|
155
|
+
- virtual-filesystem
|
|
156
|
+
detail: A profile directory also holds modlist.txt, lockedorder.txt, archives.txt, settings.ini and
|
|
157
|
+
initweaks.ini. Editing the %LOCALAPPDATA% copy while MO2 is in use is silently ineffective for
|
|
158
|
+
an MO2-launched game.
|
|
159
|
+
- id: sse.loadorder.files.mo2-hides-mods-from-the-real-data-folder
|
|
160
|
+
claim: Mod Organizer 2 never places mod files in the game's Data folder. It uses USVFS, a user-space
|
|
161
|
+
virtual file system built on API hooking, so only processes MO2 launches see the merged tree.
|
|
162
|
+
status: community
|
|
163
|
+
source: github.com/ModOrganizer2/usvfs README ("aims to allow windows applications to create file or
|
|
164
|
+
directory links that are visible to only a select set of processes ... by using api hooking");
|
|
165
|
+
ModOrganizer2/modorganizer wiki "Moving things" FAQ ("Although Mod Organizer makes it look
|
|
166
|
+
like the files come from the game's Data folder, they're still physically on whatever drive
|
|
167
|
+
the mods folder is on")
|
|
168
|
+
tags:
|
|
169
|
+
- mo2
|
|
170
|
+
- usvfs
|
|
171
|
+
- virtual-filesystem
|
|
172
|
+
- data-folder
|
|
173
|
+
- gotcha
|
|
174
|
+
detail: An external inspector reading the real Data folder while MO2 is in use sees the vanilla game
|
|
175
|
+
and nothing else. The effective tree is mods/<mod name>/ (each mirroring Data),
|
|
176
|
+
profiles/<profile>/ and overwrite/.
|
|
177
|
+
- id: sse.loadorder.files.vortex-owns-and-watches-plugins-txt
|
|
178
|
+
claim: Vortex writes plugins.txt itself, with encoding latin1 and a first line reading "#
|
|
179
|
+
Automatically generated by Vortex". If that line is missing it logs "plugins file was changed
|
|
180
|
+
by foreign application" and prompts the user to keep or revert the change.
|
|
181
|
+
status: community
|
|
182
|
+
source: Nexus-Mods/Vortex extensions/gamebryo-plugin-management/src/util/PluginPersistor.ts, fn
|
|
183
|
+
serialize, fn filterFileData and the onFileChanged handler
|
|
184
|
+
tags:
|
|
185
|
+
- vortex
|
|
186
|
+
- plugins-txt
|
|
187
|
+
- deployment
|
|
188
|
+
- ownership
|
|
189
|
+
- gotcha
|
|
190
|
+
detail: For Skyrim SE, Fallout 4 and Starfield Vortex uses its "fallout4" format - native plugins
|
|
191
|
+
omitted, enabled ones prefixed `*`. It also writes a loadorder.txt (utf8) that Skyrim SE does
|
|
192
|
+
not use. An external tool that edits plugins.txt will raise a foreign-application prompt for
|
|
193
|
+
the user.
|
|
194
|
+
- id: sse.loadorder.files.vortex-hardlink-deploys-into-data
|
|
195
|
+
claim: Vortex's default hardlink deployment puts real directory entries in the game's Data folder,
|
|
196
|
+
indistinguishable from ordinary files. Symlink deployment is explicitly unsupported for every
|
|
197
|
+
Skyrim variant.
|
|
198
|
+
status: community
|
|
199
|
+
source: Nexus-Mods/Vortex wiki "Deployment Methods", sections "Hardlink Deployment" and "Symlink
|
|
200
|
+
Deployment" (the latter lists Morrowind, Oblivion, Skyrim variants and the Fallout titles as
|
|
201
|
+
incompatible)
|
|
202
|
+
tags:
|
|
203
|
+
- vortex
|
|
204
|
+
- deployment
|
|
205
|
+
- hardlink
|
|
206
|
+
- data-folder
|
|
207
|
+
detail: This is the opposite of MO2 - under Vortex, reading the real Data folder shows the full
|
|
208
|
+
deployed mod set. Vortex records what it deployed in vortex.deployment.json, written into the
|
|
209
|
+
deploy path with a backup copy in the staging folder.
|
|
210
|
+
- id: sse.loadorder.files.loot-cli-can-sort-unattended
|
|
211
|
+
claim: LOOT can sort and apply a load order without interaction using `LOOT.exe --game="Skyrim
|
|
212
|
+
Special Edition" --auto-sort`. The --game value is case sensitive and is the game's LOOT
|
|
213
|
+
folder name, and --auto-sort requires it.
|
|
214
|
+
status: community
|
|
215
|
+
source: loot/loot docs/app/usage/initialisation.rst, section "Initialisation" ("automatically sort
|
|
216
|
+
the load order, apply the sorted load order, then quit")
|
|
217
|
+
tags:
|
|
218
|
+
- loot
|
|
219
|
+
- cli
|
|
220
|
+
- sorting
|
|
221
|
+
- unattended
|
|
222
|
+
- toolchain
|
|
223
|
+
detail: MO2 registers exactly this argument for its bundled LOOT. It is still the GUI binary, there
|
|
224
|
+
is no headless build, and the process exit code on failure is not documented. Sorting fails
|
|
225
|
+
outright on a cyclic interaction.
|
|
226
|
+
- id: sse.loadorder.files.loot-masterlist-paths
|
|
227
|
+
claim: LOOT keeps its data under %LOCALAPPDATA%\LOOT, with per-game files in games\<folder name>\.
|
|
228
|
+
Skyrim SE's default folder name is "Skyrim Special Edition" and its masterlist is fetched from
|
|
229
|
+
https://raw.githubusercontent.com/loot/skyrimse/v0.29/masterlist.yaml.
|
|
230
|
+
status: community
|
|
231
|
+
source: loot/loot src/gui/state/loot_paths.cpp getDataPath; src/gui/state/game/game.cpp
|
|
232
|
+
getLOOTGamePath; src/gui/state/game/game_id.cpp getDefaultLootFolderName;
|
|
233
|
+
src/gui/state/game/game_settings.cpp getDefaultMasterlistRepositoryName and
|
|
234
|
+
getDefaultMasterlistUrl with DEFAULT_MASTERLIST_BRANCH = "v0.29"
|
|
235
|
+
tags:
|
|
236
|
+
- loot
|
|
237
|
+
- masterlist
|
|
238
|
+
- path
|
|
239
|
+
- url
|
|
240
|
+
detail: The per-game folder name is user-configurable and differs between two installs of the same
|
|
241
|
+
game, so an external tool should read %LOCALAPPDATA%\LOOT\settings.toml rather than hardcode
|
|
242
|
+
it. The branch in the URL is LOOT's metadata-syntax version, bumped per release.
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
game: skyrimse
|
|
2
|
+
topic: plugins.esl
|
|
3
|
+
title: Light plugins (ESL) — the flag, the FormID ranges, HEDR 1.71, and the load limits
|
|
4
|
+
facts:
|
|
5
|
+
- id: sse.plugins.esl.flag-is-bit-9-of-the-tes4-header
|
|
6
|
+
claim: A plugin is light when bit 9 (0x00000200) of its TES4 record header flags is set. The flag is
|
|
7
|
+
Skyrim-SE-only — xEdit declares it as IsSSE('ESL','') and no earlier game has it.
|
|
8
|
+
status: community
|
|
9
|
+
source: TES5Edit wbDefinitionsTES5.pas, wbRecord(TES4, 'Main File Header', ...) flag list;
|
|
10
|
+
en.uesp.net "Skyrim Mod:Mod File Format/TES4" lead ("if set, the file is treated as a light
|
|
11
|
+
master")
|
|
12
|
+
tags:
|
|
13
|
+
- esl
|
|
14
|
+
- light-plugin
|
|
15
|
+
- flags
|
|
16
|
+
- tes4
|
|
17
|
+
- parser
|
|
18
|
+
- id: sse.plugins.esl.extension-does-not-determine-lightness
|
|
19
|
+
claim: Lightness cannot be decided from the file extension. An .esl is always light because the
|
|
20
|
+
extension forces the flag, but an .esp with the light flag set is also light, and it counts
|
|
21
|
+
against the 4096 light budget rather than the 255 full one.
|
|
22
|
+
status: community
|
|
23
|
+
source: libloadorder doc/src/plugin_types.md, "Skyrim Special Edition, Skyrim VR, Fallout 4, Fallout
|
|
24
|
+
4 VR" ("A plugin is a light non-master plugin if its file extension is .esp and it has its
|
|
25
|
+
light plugin flag set"); Wrye Bash skyrimse/__init__.py extension_forces_flags = True; xEdit
|
|
26
|
+
whatsnew.md "the .esl extension which implicitly always sets the ESL flag"
|
|
27
|
+
tags:
|
|
28
|
+
- esl
|
|
29
|
+
- light-plugin
|
|
30
|
+
- extension
|
|
31
|
+
- gotcha
|
|
32
|
+
- load-order
|
|
33
|
+
- counting
|
|
34
|
+
detail: Any tool that classifies plugins by extension will miscount the caps. esplugin's own test is
|
|
35
|
+
`self.is_light_flag_set() || self.file_extension() == FileExtension::Esl`.
|
|
36
|
+
- id: sse.plugins.esl.fe-space-is-twelve-plus-twelve-bits
|
|
37
|
+
claim: "Light plugins load into the 0xFE mod-index slot, and their FormIDs are mapped into the FExxx
|
|
38
|
+
space: 12 bits of light index (4096 slots) and 12 bits of object id (4096 objects per light
|
|
39
|
+
plugin)."
|
|
40
|
+
status: community
|
|
41
|
+
source: TES5Edit whatsnew.md, "What's new in xEdit 4.0.0? > ESL support" ("up to 253 'full' modules
|
|
42
|
+
(00 to FD) and 4096 'light' modules (FE000 to FEFFF) loaded at the same time")
|
|
43
|
+
tags:
|
|
44
|
+
- esl
|
|
45
|
+
- formid
|
|
46
|
+
- fe-space
|
|
47
|
+
- load-order
|
|
48
|
+
- limits
|
|
49
|
+
detail: esplugin's mask constant for the same space is small_mask = 0xFE00_0000.
|
|
50
|
+
- id: sse.plugins.esl.formid-prefix-is-not-load-order
|
|
51
|
+
claim: The leading digits of a FormID can no longer be used to infer load order. Light modules can
|
|
52
|
+
load before full modules; they merely occupy the FE index at runtime.
|
|
53
|
+
status: community
|
|
54
|
+
source: TES5Edit whatsnew.md, "ESL support" ("the first digits of the FormID are NOT a reliable way
|
|
55
|
+
to determine load order anymore"); loot.github.io "Introduction To Load Orders" (light plugins
|
|
56
|
+
"are listed as position FE, but actually load in the position dictated by the load order")
|
|
57
|
+
tags:
|
|
58
|
+
- esl
|
|
59
|
+
- formid
|
|
60
|
+
- load-order
|
|
61
|
+
- gotcha
|
|
62
|
+
detail: The order file is authoritative for position; the FormID prefix is not. A load-order report
|
|
63
|
+
must take its ordering from Plugins.txt, never from FormIDs.
|
|
64
|
+
- id: sse.plugins.esl.hedr-1-71-unlocks-the-expanded-range
|
|
65
|
+
claim: HEDR version 1.71 is what signals the expanded light-plugin object-index range introduced in
|
|
66
|
+
Skyrim SE 1.6.1130. Below 1.71 a light plugin's new records must have object indices in
|
|
67
|
+
0x800-0xFFF; at 1.71 and above the range opens downward.
|
|
68
|
+
status: community
|
|
69
|
+
source: libloot changelog 0.22.3 (2023-12-06) ("the extended FormID range introduced in Skyrim SE
|
|
70
|
+
v1.6.1130.0 for light plugins with a header version of 1.71. Via esplugin"); Ortham/esplugin
|
|
71
|
+
src/plugin.rs valid_light_form_id_range; Wrye Bash skyrimse/__init__.py
|
|
72
|
+
object_index_range_expansion_ver = 1.71
|
|
73
|
+
tags:
|
|
74
|
+
- esl
|
|
75
|
+
- hedr
|
|
76
|
+
- formid
|
|
77
|
+
- 1-6-1130
|
|
78
|
+
- version
|
|
79
|
+
detail: esplugin's code reads `Some(v) if v < 1.71 => 0x800..=0xFFF, Some(_) => 0..=0xFFF`. Before
|
|
80
|
+
the change the reserved range 0x0000-0x07FF gave light plugins a 2048-record limit; after it,
|
|
81
|
+
4096.
|
|
82
|
+
- id: sse.plugins.esl.expanded-floor-is-disputed
|
|
83
|
+
claim: Sources disagree on the expanded range's lower bound. esplugin's code and Wrye Bash's
|
|
84
|
+
docstring put it at 0x000; xEdit's release notes write it as 001-7FF. Wrye Bash also requires
|
|
85
|
+
the plugin to have at least one master for the expansion to apply, a condition neither of the
|
|
86
|
+
others states.
|
|
87
|
+
status: community
|
|
88
|
+
source: Ortham/esplugin src/plugin.rs (0..=0xFFF); Wrye Bash Mopy/bash/game/__init__.py
|
|
89
|
+
ObjectIndexRange docstring ("EXPANDED_CONDITIONAL ... and at least one master can use the
|
|
90
|
+
range 0x000-0x7FF"); TES5Edit whatsnew.md 4.1.5b ("Extended FormID Range (001-7FF)")
|
|
91
|
+
tags:
|
|
92
|
+
- esl
|
|
93
|
+
- formid
|
|
94
|
+
- disputed
|
|
95
|
+
- validator
|
|
96
|
+
- open-question
|
|
97
|
+
detail: A validator should use 0x001 as the floor, which is the conservative reading and cannot
|
|
98
|
+
produce a false failure against either source. Settling it needs a real 1.6.1130+ install and
|
|
99
|
+
a look at what _ResourcePack.esl actually contains.
|
|
100
|
+
- id: sse.plugins.esl.validity-counts-new-records-only
|
|
101
|
+
claim: A plugin is ESL-flag-safe when every NEW record's FormID object index falls in the valid
|
|
102
|
+
range. Records that merely override a master's forms are exempt, however high their object
|
|
103
|
+
index.
|
|
104
|
+
status: community
|
|
105
|
+
source: libloot changelog 0.14.0 (2018-12-09) ("Validity is defined as having no new records with a
|
|
106
|
+
FormID object index greater than 0xFFF"); Ortham/esplugin src/plugin.rs
|
|
107
|
+
is_valid_as_light_plugin, which filters on !f.is_overridden_record()
|
|
108
|
+
tags:
|
|
109
|
+
- esl
|
|
110
|
+
- validation
|
|
111
|
+
- formid
|
|
112
|
+
- override
|
|
113
|
+
- validator
|
|
114
|
+
detail: "esplugin's tests make the asymmetry explicit: an override outside the range keeps the
|
|
115
|
+
plugin valid, a new FormID above 0xFFF does not. Wrye Bash's user-facing message for the
|
|
116
|
+
failure is \"This plugin contains records with FormIDs greater than 0xFFF.\""
|
|
117
|
+
- id: sse.plugins.esl.masters-at-1-71-force-the-plugin-to-1-71
|
|
118
|
+
claim: A plugin whose masters carry header version 1.71 should itself be 1.71, or referencing or
|
|
119
|
+
overriding any record whose FormID falls in the extended range produces errors.
|
|
120
|
+
status: community
|
|
121
|
+
source: TES5Edit whatsnew.md 4.1.5b, "Extended FormID Range in Skyrim Special Edition", the
|
|
122
|
+
"Important" note
|
|
123
|
+
tags:
|
|
124
|
+
- esl
|
|
125
|
+
- hedr
|
|
126
|
+
- masters
|
|
127
|
+
- version
|
|
128
|
+
- validator
|
|
129
|
+
- id: sse.plugins.esl.1-71-plugins-crash-old-game-builds
|
|
130
|
+
claim: The December 5 2023 Creations update incremented plugin header versions from 1.70 to 1.71 in
|
|
131
|
+
order to raise a light plugin's new-record maximum from 2048 to 4096. Using a 1.71 plugin on
|
|
132
|
+
an older game build will likely crash.
|
|
133
|
+
status: community
|
|
134
|
+
source: github.com/Nukem9/skyrimse-backported-esl-support README, section "Purpose"
|
|
135
|
+
tags:
|
|
136
|
+
- esl
|
|
137
|
+
- hedr
|
|
138
|
+
- 1-6-1130
|
|
139
|
+
- crash
|
|
140
|
+
- compatibility
|
|
141
|
+
- creations-update
|
|
142
|
+
detail: Verbatim - "Attempting to use a version 1.71 plugin on an old game build will likely crash."
|
|
143
|
+
This is why a HEDR-version check against the installed runtime deserves a blocking severity
|
|
144
|
+
rather than a warning.
|
|
145
|
+
- id: sse.plugins.esl.active-full-limit-drops-to-254
|
|
146
|
+
claim: The active full-plugin limit is 255 when no light plugin is active and 254 once one is,
|
|
147
|
+
because the FE index is carved out of the full space. Light plugins have their own separate
|
|
148
|
+
limit of 4096 active.
|
|
149
|
+
status: inferred
|
|
150
|
+
source: Ortham/libloadorder src/load_order/mutable.rs max_active_full_plugins (255 / 254 / 253
|
|
151
|
+
branches) and src/load_order/writable.rs MAX_ACTIVE_LIGHT_PLUGINS = 4096, with the tests
|
|
152
|
+
activate_should_lower_the_full_plugin_limit_if_a_light_plugin_is_present
|
|
153
|
+
tags:
|
|
154
|
+
- esl
|
|
155
|
+
- limits
|
|
156
|
+
- load-order
|
|
157
|
+
- counting
|
|
158
|
+
- disputed
|
|
159
|
+
detail: Marked inferred because libloadorder's own prose contradicts its code - the docs say light
|
|
160
|
+
plugins "do not count towards the 255 active plugin limit" while the code demonstrably lowers
|
|
161
|
+
the cap. The code and its tests are the stronger evidence. The 253 figure that also appears is
|
|
162
|
+
the master-list limit, not the active limit.
|
|
163
|
+
- id: sse.plugins.esl.master-list-limit-is-253
|
|
164
|
+
claim: A Skyrim SE plugin may list at most 253 masters, not 255, because the FE slot is reserved for
|
|
165
|
+
light plugins inside master lists as well as in the load order.
|
|
166
|
+
status: community
|
|
167
|
+
source: Wrye Bash Mopy/bash/game/skyrimse/__init__.py, master_limit = 253 with the comment "Because
|
|
168
|
+
the FE slot is reserved for ESLs - yes, including in master lists"; the base
|
|
169
|
+
Mopy/bash/game/__init__.py has master_limit = 255
|
|
170
|
+
tags:
|
|
171
|
+
- esl
|
|
172
|
+
- masters
|
|
173
|
+
- limits
|
|
174
|
+
- validator
|
|
175
|
+
- id: sse.plugins.esl.compact-formids-is-the-fix
|
|
176
|
+
claim: xEdit's "Compact FormIDs for ESL" function renumbers a plugin's new records into the valid
|
|
177
|
+
light range; from xEdit 4.0.3 an expert option extends the target space to 001-FFF instead of
|
|
178
|
+
800-FFF.
|
|
179
|
+
status: community
|
|
180
|
+
source: TES5Edit whatsnew.md, "What's new in xEdit 4.0.0? > Compact FormIDs for ESL" and "What's new
|
|
181
|
+
in xEdit 4.0.3? > Minor changes"
|
|
182
|
+
tags:
|
|
183
|
+
- esl
|
|
184
|
+
- xedit
|
|
185
|
+
- compact
|
|
186
|
+
- tooling
|
|
187
|
+
- remediation
|
|
188
|
+
detail: xEdit refuses to save a plugin with the ESL flag set when it contains new records with an
|
|
189
|
+
ObjectID above $FFF, and warns when loading an incorrectly flagged module.
|