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,224 @@
|
|
|
1
|
+
game: skyrimse
|
|
2
|
+
topic: plugins.format
|
|
3
|
+
title: Plugin file layout — the record header, the TES4 file header and its subrecords
|
|
4
|
+
facts:
|
|
5
|
+
- id: sse.plugins.format.record-header-is-24-bytes
|
|
6
|
+
claim: "Every record in a Skyrim SE plugin begins with a 24-byte header: 4 bytes of signature,
|
|
7
|
+
uint32 data size (excluding the header), uint32 flags, uint32 FormID, 4 bytes of
|
|
8
|
+
timestamp/version-control info, uint16 form version, uint16 unknown. The record's data follows
|
|
9
|
+
immediately at offset 24."
|
|
10
|
+
status: community
|
|
11
|
+
source: en.uesp.net "Skyrim Mod:Mod File Format" section "Records"; corroborated by TES5Edit
|
|
12
|
+
wbImplementation.pas (TwbMainRecordStruct) and Ortham/esplugin src/record.rs
|
|
13
|
+
(MAX_RECORD_HEADER_LENGTH = 24, test header_length_should_be_24)
|
|
14
|
+
tags:
|
|
15
|
+
- plugin
|
|
16
|
+
- binary
|
|
17
|
+
- record-header
|
|
18
|
+
- parser
|
|
19
|
+
- byte-layout
|
|
20
|
+
detail: UESP splits offsets 16-19 into two uint16 fields (Timestamp, Version Control Info) where
|
|
21
|
+
xEdit reads one Cardinal (mrsVCS1); both readings parse the same bytes. All multi-byte fields
|
|
22
|
+
are little-endian.
|
|
23
|
+
- id: sse.plugins.format.form-version-44-for-sse
|
|
24
|
+
claim: "The uint16 at record-header offset 20 is the record's internal form version: 43 for Skyrim
|
|
25
|
+
LE and 44 for Skyrim Special Edition."
|
|
26
|
+
status: community
|
|
27
|
+
source: en.uesp.net "Skyrim Mod:Mod File Format", section "Records", the uint16 internal-version row
|
|
28
|
+
tags:
|
|
29
|
+
- plugin
|
|
30
|
+
- record-header
|
|
31
|
+
- version
|
|
32
|
+
- sse-vs-le
|
|
33
|
+
detail: A quick way to tell an LE-authored plugin from an SE one without parsing further. Fallout 4
|
|
34
|
+
uses 131 on the same axis.
|
|
35
|
+
- id: sse.plugins.format.tes4-flag-bits
|
|
36
|
+
claim: On the TES4 file-header record the meaningful flag bits are 0 (0x00000001) ESM master, 7
|
|
37
|
+
(0x00000080) Localized, 9 (0x00000200) Light/ESL, and 12 (0x00001000) Ignored. xEdit declares
|
|
38
|
+
only the first three on TES4 and gates the ESL bit on the game being Skyrim SE.
|
|
39
|
+
status: community
|
|
40
|
+
source: TES5Edit wbDefinitionsTES5.pas, wbRecord(TES4, 'Main File Header', wbFlags(...)) — bit 9
|
|
41
|
+
written as IsSSE('ESL',''); matortheeternal/esp.json data/SSE/TES4.json "flags"; en.uesp.net
|
|
42
|
+
"Skyrim Mod:Mod File Format/TES4" lead paragraph
|
|
43
|
+
tags:
|
|
44
|
+
- plugin
|
|
45
|
+
- flags
|
|
46
|
+
- esm
|
|
47
|
+
- esl
|
|
48
|
+
- localized
|
|
49
|
+
- parser
|
|
50
|
+
detail: "The ESM flag's effect, verbatim from the TES4 page: \"if set, the file is treated as a
|
|
51
|
+
master, regardless of what the file extension says\". The bit values are not portable across
|
|
52
|
+
games — esplugin's plugin.rs shows Starfield using 0x800 for light and 0x200 for Update."
|
|
53
|
+
- id: sse.plugins.format.localized-flag-changes-string-decoding
|
|
54
|
+
claim: The Localized flag (0x00000080) makes the game load the .STRINGS, .DLSTRINGS and .ILSTRINGS
|
|
55
|
+
files that accompany the plugin. With the flag clear, lstrings in the plugin are treated as
|
|
56
|
+
plain zstrings instead.
|
|
57
|
+
status: community
|
|
58
|
+
source: en.uesp.net "Skyrim Mod:Mod File Format", section "Records", the 0x00000080 flag row
|
|
59
|
+
tags:
|
|
60
|
+
- plugin
|
|
61
|
+
- flags
|
|
62
|
+
- localization
|
|
63
|
+
- strings
|
|
64
|
+
detail: A plugin shipped with the flag set but without its strings files loses every localized name,
|
|
65
|
+
which is why the flag is worth reporting from a header parse.
|
|
66
|
+
- id: sse.plugins.format.tes4-subrecord-order
|
|
67
|
+
claim: The TES4 record's subrecords, in the order xEdit declares them, are HEDR, OFST, DELE, CNAM,
|
|
68
|
+
SNAM, then repeating MAST+DATA pairs, then ONAM, SCRN, INTV and INCC.
|
|
69
|
+
status: community
|
|
70
|
+
source: TES5Edit wbDefinitionsTES5.pas, the wbRecord(TES4, 'Main File Header', ...) member list;
|
|
71
|
+
reproduced exactly by matortheeternal/esp.json data/SSE/TES4.json
|
|
72
|
+
tags:
|
|
73
|
+
- plugin
|
|
74
|
+
- tes4
|
|
75
|
+
- subrecord
|
|
76
|
+
- parser
|
|
77
|
+
- byte-layout
|
|
78
|
+
detail: OFST, DELE and SCRN appear in xEdit and esp.json but not on the UESP TES4 page. A parser
|
|
79
|
+
should skip unknown subrecords by their declared size rather than assume this exact set.
|
|
80
|
+
- id: sse.plugins.format.subrecord-header-is-6-bytes
|
|
81
|
+
claim: "A subrecord (field) header is 6 bytes — 4-byte signature plus uint16 data size — with one
|
|
82
|
+
exception: if the preceding field has the type XXXX, this field's size reads 0 and the real
|
|
83
|
+
size is the uint32 stored in that XXXX field."
|
|
84
|
+
status: community
|
|
85
|
+
source: en.uesp.net "Skyrim Mod:Mod File Format", section "Fields"
|
|
86
|
+
tags:
|
|
87
|
+
- plugin
|
|
88
|
+
- subrecord
|
|
89
|
+
- parser
|
|
90
|
+
- byte-layout
|
|
91
|
+
- gotcha
|
|
92
|
+
detail: The XXXX escape exists because a uint16 cannot express a field larger than 65535 bytes. It
|
|
93
|
+
does not occur inside TES4, so a header-only parser can ignore it, but any parser that walks
|
|
94
|
+
past the file header must handle it.
|
|
95
|
+
- id: sse.plugins.format.hedr-is-twelve-bytes
|
|
96
|
+
claim: "HEDR is a required 12-byte struct: float32 version, uint32 number of records and groups (not
|
|
97
|
+
counting the TES4 record itself), uint32 next available object ID."
|
|
98
|
+
status: community
|
|
99
|
+
source: en.uesp.net "Skyrim Mod:Mod File Format/TES4", HEDR row; TES5Edit wbDefinitionsTES5.pas
|
|
100
|
+
(wbFloat('Version'), wbInteger('Number of Records', itU32), wbInteger('Next Object ID',
|
|
101
|
+
itU32), marked required)
|
|
102
|
+
tags:
|
|
103
|
+
- plugin
|
|
104
|
+
- tes4
|
|
105
|
+
- hedr
|
|
106
|
+
- parser
|
|
107
|
+
- byte-layout
|
|
108
|
+
- id: sse.plugins.format.mast-data-pairs-are-the-master-list
|
|
109
|
+
claim: Each master is a MAST subrecord (a zstring filename) immediately followed by an 8-byte DATA
|
|
110
|
+
subrecord. The masters are listed in the load order they had when the plugin was saved, and
|
|
111
|
+
the mod index of every FormID in the plugin refers to that order.
|
|
112
|
+
status: community
|
|
113
|
+
source: en.uesp.net "Skyrim Mod:Mod File Format/TES4", MAST row; TES5Edit wbDefinitionsTES5.pas
|
|
114
|
+
wbRArray('Master Files', wbRStruct('Master File', [MAST, DATA]))
|
|
115
|
+
tags:
|
|
116
|
+
- plugin
|
|
117
|
+
- tes4
|
|
118
|
+
- mast
|
|
119
|
+
- masters
|
|
120
|
+
- formid
|
|
121
|
+
- load-order
|
|
122
|
+
detail: DATA is "Always 0. May be vestigial. In Tes3, the file size of the master was recorded
|
|
123
|
+
here." xEdit models it as an 8-byte array marked cpIgnore but required. Because FormID mod
|
|
124
|
+
indices are positional, reordering a plugin's masters without remapping its FormIDs silently
|
|
125
|
+
repoints every reference.
|
|
126
|
+
- id: sse.plugins.format.author-and-description-are-512-bytes
|
|
127
|
+
claim: CNAM holds the author and SNAM the description, each a Windows-1252 zero-terminated string
|
|
128
|
+
with a maximum size of 512 bytes including the terminator.
|
|
129
|
+
status: community
|
|
130
|
+
source: en.uesp.net "Skyrim Mod:Mod File Format/TES4", CNAM and SNAM rows; Wrye Bash
|
|
131
|
+
Mopy/bash/game/__init__.py (max_author_length = 511, max_desc_length = 511)
|
|
132
|
+
tags:
|
|
133
|
+
- plugin
|
|
134
|
+
- tes4
|
|
135
|
+
- cnam
|
|
136
|
+
- snam
|
|
137
|
+
- author
|
|
138
|
+
- description
|
|
139
|
+
- limits
|
|
140
|
+
detail: "The two sources disagree on whether CNAM is required — xEdit marks it required, UESP marks
|
|
141
|
+
it optional. SNAM is worth reading beyond curiosity: Wrye Bash reads Bash Tags out of the
|
|
142
|
+
plugin description."
|
|
143
|
+
- id: sse.plugins.format.onam-only-in-esm-overriding-cell-children
|
|
144
|
+
claim: ONAM is an array of FormIDs (count = payload size / 4) that appears only in ESM-flagged files
|
|
145
|
+
which override their masters' cell children.
|
|
146
|
+
status: community
|
|
147
|
+
source: en.uesp.net "Skyrim Mod:Mod File Format/TES4", ONAM row ("Observed in Update.esm as of Patch
|
|
148
|
+
1.5.24")
|
|
149
|
+
tags:
|
|
150
|
+
- plugin
|
|
151
|
+
- tes4
|
|
152
|
+
- onam
|
|
153
|
+
- esm
|
|
154
|
+
- cell
|
|
155
|
+
detail: UESP lists the overridable types as ACHR, LAND, NAVM, PGRE, PHZD and REFR; xEdit's allowed
|
|
156
|
+
list is wider, adding PMIS, PARW, PBAR, PBEA, PCON and PFLA.
|
|
157
|
+
- id: sse.plugins.format.zstring-is-windows-1252
|
|
158
|
+
claim: A zstring in a plugin file is a zero-terminated string whose size counts the text plus one
|
|
159
|
+
terminator byte, encoded Windows-1252.
|
|
160
|
+
status: community
|
|
161
|
+
source: en.uesp.net "Skyrim Mod:File_Format_Conventions", section "Data Types"
|
|
162
|
+
tags:
|
|
163
|
+
- plugin
|
|
164
|
+
- encoding
|
|
165
|
+
- zstring
|
|
166
|
+
- windows-1252
|
|
167
|
+
- parser
|
|
168
|
+
detail: The same encoding governs Plugins.txt (see sse.loadorder.files.plugins-txt-is-windows-1252),
|
|
169
|
+
so a tool that gets one right and the other wrong will corrupt exactly the mods whose names
|
|
170
|
+
motivated the rule.
|
|
171
|
+
- id: sse.plugins.format.compressed-record-flag
|
|
172
|
+
claim: "A record whose flags include 0x00040000 stores its data compressed: a uint32 decompressed
|
|
173
|
+
size followed by dataSize minus 4 bytes of zlib data."
|
|
174
|
+
status: community
|
|
175
|
+
source: en.uesp.net "Skyrim Mod:Mod File Format", section "Records"; Ortham/esplugin src/record.rs
|
|
176
|
+
tests (self.flags & 0x0004_0000) != 0
|
|
177
|
+
tags:
|
|
178
|
+
- plugin
|
|
179
|
+
- compression
|
|
180
|
+
- zlib
|
|
181
|
+
- parser
|
|
182
|
+
detail: TES4 itself is never compressed, so a header-only parser is unaffected; any parser that
|
|
183
|
+
reads further must handle it or it will read garbage.
|
|
184
|
+
- id: sse.plugins.format.grup-size-includes-its-own-header
|
|
185
|
+
claim: A GRUP header is also 24 bytes, but unlike records and fields its size field counts the
|
|
186
|
+
header itself.
|
|
187
|
+
status: community
|
|
188
|
+
source: en.uesp.net "Skyrim Mod:Mod File Format", section "Groups" ("in contrast to records and
|
|
189
|
+
fields, whose sizes do not include their header sizes")
|
|
190
|
+
tags:
|
|
191
|
+
- plugin
|
|
192
|
+
- grup
|
|
193
|
+
- parser
|
|
194
|
+
- byte-layout
|
|
195
|
+
- gotcha
|
|
196
|
+
detail: Getting this backwards is the classic off-by-24 that makes a whole-file walk desynchronise
|
|
197
|
+
after the first group.
|
|
198
|
+
- id: sse.plugins.format.modindex-equal-to-master-count-is-the-plugins-own
|
|
199
|
+
claim: Inside a plugin, a FormID's top byte (its mod index) counts the plugin's masters in MAST
|
|
200
|
+
order, so a record whose mod index equals the number of masters is the plugin's own new
|
|
201
|
+
record, one with a lower index overrides that master's record, and one with a higher index
|
|
202
|
+
references a master the header does not list. This is how "new record" is decided for the
|
|
203
|
+
light-plugin range check without any load order.
|
|
204
|
+
status: community
|
|
205
|
+
source: en.uesp.net "Skyrim Mod:Mod File Format/TES4", MAST ("The modindex of formids in the mod
|
|
206
|
+
file match the order of masters given here"); Ortham/esplugin src/record_id.rs
|
|
207
|
+
`ResolvedRecordId::from_form_id`, which matches a raw FormID against each master's
|
|
208
|
+
`mod_index_mask` (`i << 24`, built in src/plugin.rs `hashed_masters`) and sets
|
|
209
|
+
`overridden_record` only on a match, as used by src/plugin.rs `is_valid_as_light_plugin`;
|
|
210
|
+
dyndolod.info "Internal File FormID Is A HITME"
|
|
211
|
+
tags:
|
|
212
|
+
- formid
|
|
213
|
+
- modindex
|
|
214
|
+
- masters
|
|
215
|
+
- new-record
|
|
216
|
+
- override
|
|
217
|
+
- validator
|
|
218
|
+
detail: "esplugin splits the same FormIDs in two rather than three: a mod index that matches no
|
|
219
|
+
master is not an override, so the higher-than-master-count case counts as the plugin's own for
|
|
220
|
+
the light-range check. DynDOLOD, on that case - \"HITME stands for HIgher Than Master Entry\",
|
|
221
|
+
the message coming from xEdit's internal error check, and \"it can not be determined if the
|
|
222
|
+
record is an overwrite (and which master plugin it belongs to) or if the record is added as a
|
|
223
|
+
master record by the plugin itself\". ModWright's `sse.plugins.esl-range` warns on it for any
|
|
224
|
+
plugin it walks, light or not, and range-checks it as esplugin does."
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
game: skyrimse
|
|
2
|
+
topic: skse.runtime
|
|
3
|
+
title: SKSE64 — build-to-runtime coupling, log paths and lines, the Address Library, and the Papyrus
|
|
4
|
+
runtime log
|
|
5
|
+
facts:
|
|
6
|
+
- id: sse.skse.runtime.build-is-locked-to-one-runtime
|
|
7
|
+
claim: An SKSE64 build targets exactly one game runtime. As of 2026-09-11 the Anniversary Edition
|
|
8
|
+
build is 2.3.1 for game 1.7.104, the GOG build 2.2.6, the Special Edition build 2.0.20 for
|
|
9
|
+
game 1.5.97 and the VR build 2.0.12 for game 1.4.15.
|
|
10
|
+
status: community
|
|
11
|
+
source: skse.silverlock.org, the Downloads section; corroborated by github.com/ianpatt/skse64
|
|
12
|
+
skse64_common/skse_version.h (CURRENT_RELEASE_SKSE_STR "2.3.1", CURRENT_RELEASE_RUNTIME
|
|
13
|
+
RUNTIME_VERSION_1_7_104)
|
|
14
|
+
tags:
|
|
15
|
+
- skse
|
|
16
|
+
- version
|
|
17
|
+
- runtime
|
|
18
|
+
- compatibility
|
|
19
|
+
- compat-matrix
|
|
20
|
+
detail: The same page carries a warning dated 2026-08-14 that Bethesda has announced an incoming
|
|
21
|
+
Skyrim update, so this pairing is current but explicitly volatile. The GOG build's target
|
|
22
|
+
runtime is stated inconsistently - the front page says 1.6.1179, both readmes say 1.6.1170,
|
|
23
|
+
and skse_version.h enumerates both - so a compat rule should accept either.
|
|
24
|
+
- id: sse.skse.runtime.no-microsoft-store-or-epic-support
|
|
25
|
+
claim: SKSE does not support the Windows Store / Game Pass release of Skyrim, and does not support
|
|
26
|
+
the Epic Games Store release.
|
|
27
|
+
status: community
|
|
28
|
+
source: skse.silverlock.org, the "Compatibility" section
|
|
29
|
+
tags:
|
|
30
|
+
- skse
|
|
31
|
+
- compatibility
|
|
32
|
+
- storefront
|
|
33
|
+
- microsoft-store
|
|
34
|
+
- epic
|
|
35
|
+
- compat-matrix
|
|
36
|
+
detail: Worth a blocking advisory rule, because both storefronts are detectable - MO2 probes for
|
|
37
|
+
EOSSDK-Win64-Shipping.dll to identify an Epic install, and SKSE's own source has an EPIC
|
|
38
|
+
save-folder branch even though the build is unsupported.
|
|
39
|
+
- id: sse.skse.runtime.installs-into-the-game-root
|
|
40
|
+
claim: SKSE's .dll and .exe files go in the game root beside SkyrimSE.exe, not in Data. Its .pex
|
|
41
|
+
files go to Data\Scripts\ and are needed by every user; its .psc sources go to
|
|
42
|
+
Data\Scripts\Source\. The game must be started through skse64_loader.exe.
|
|
43
|
+
status: community
|
|
44
|
+
source: github.com/ianpatt/skse64 skse64_readme.txt, section "[ Installation ]"
|
|
45
|
+
tags:
|
|
46
|
+
- skse
|
|
47
|
+
- install
|
|
48
|
+
- paths
|
|
49
|
+
- loader
|
|
50
|
+
- deployment
|
|
51
|
+
detail: Verbatim - "Do not copy these files to the Data folder as with a normal mod" and "You or
|
|
52
|
+
your mod manager must continue to use the loader for SKSE64 to work." skse.ini is not shipped;
|
|
53
|
+
a user creates an empty <skyrim root>\Data\SKSE\skse.ini.
|
|
54
|
+
- id: sse.skse.runtime.log-directory-is-storefront-dependent
|
|
55
|
+
claim: SKSE writes skse64_loader.log and skse64.log to Documents\My Games\<SAVE_FOLDER_NAME>\SKSE\,
|
|
56
|
+
where SAVE_FOLDER_NAME is "Skyrim Special Edition" for Steam, "Skyrim Special Edition GOG" for
|
|
57
|
+
GOG and "Skyrim Special Edition EPIC" for Epic.
|
|
58
|
+
status: community
|
|
59
|
+
source: github.com/ianpatt/skse64 skse64_loader/main.cpp and skse64/skse64.cpp
|
|
60
|
+
(gLog.OpenRelative(CSIDL_MYDOCUMENTS, "\\My Games\\" SAVE_FOLDER_NAME "\\SKSE\\...")), with
|
|
61
|
+
SAVE_FOLDER_NAME selected by runtime type in skse64_common/skse_version.h
|
|
62
|
+
tags:
|
|
63
|
+
- skse
|
|
64
|
+
- logs
|
|
65
|
+
- path
|
|
66
|
+
- storefront
|
|
67
|
+
- gog
|
|
68
|
+
- epic
|
|
69
|
+
detail: The same three folder names libloadorder and MO2 derive independently for %LOCALAPPDATA% and
|
|
70
|
+
Documents\My Games. A log source that hardcodes the Steam name finds nothing on a GOG or Epic
|
|
71
|
+
install.
|
|
72
|
+
- id: sse.skse.runtime.logs-carry-no-timestamp-or-level
|
|
73
|
+
claim: Neither skse64.log nor skse64_loader.log carries a per-line timestamp or severity prefix. The
|
|
74
|
+
_ERROR / _WARNING / _MESSAGE macros only decide whether a line is written, not how it is
|
|
75
|
+
labelled.
|
|
76
|
+
status: community
|
|
77
|
+
source: github.com/ianpatt/common common/IDebugLog.cpp, IDebugLog::Message (writes an empty header
|
|
78
|
+
plus the message, indented by indentLevel * 4 spaces) and IDebugLog.h's level macros
|
|
79
|
+
tags:
|
|
80
|
+
- skse
|
|
81
|
+
- logs
|
|
82
|
+
- format
|
|
83
|
+
- classifier
|
|
84
|
+
- gotcha
|
|
85
|
+
detail: A log classifier must match on message text here, not on a bracketed level token - the
|
|
86
|
+
opposite of the spdlog-shaped logs most other modding frameworks produce.
|
|
87
|
+
- id: sse.skse.runtime.plugin-load-line-format
|
|
88
|
+
claim: Every SKSE plugin outcome is one line of the form `plugin <dll> (<dataVersion:08X> <name>
|
|
89
|
+
<pluginVersion:08X>) <reason> (handle N)`, where a failure inserts a numeric error code
|
|
90
|
+
between the reason and `(handle N)` and a success has the reason `loaded correctly` with no
|
|
91
|
+
code.
|
|
92
|
+
status: community
|
|
93
|
+
source: github.com/ianpatt/skse64 skse64/PluginManager.cpp, PluginManager::LogPluginLoadError and
|
|
94
|
+
PluginManager::LoadComplete
|
|
95
|
+
tags:
|
|
96
|
+
- skse
|
|
97
|
+
- logs
|
|
98
|
+
- format
|
|
99
|
+
- classifier
|
|
100
|
+
- plugin
|
|
101
|
+
detail: The extra numeric field before "(handle N)" is the discriminator between success and
|
|
102
|
+
failure. SKSE 2.0.20 printed the plugin's full path instead of the DLL name and had no
|
|
103
|
+
error-code field, so an old-format line also dates the install to the SE branch.
|
|
104
|
+
- id: sse.skse.runtime.plugin-rejection-reasons
|
|
105
|
+
claim: SKSE 2.3.1's rejection reasons are a fixed set of literal strings, including "disabled,
|
|
106
|
+
incompatible with current version of the game", "disabled, address library needs to be
|
|
107
|
+
updated", "must be recompiled for new address library", "couldn't load plugin", "no version
|
|
108
|
+
data", "reported as incompatible during load" and "disabled, requires newer script extender".
|
|
109
|
+
status: community
|
|
110
|
+
source: github.com/ianpatt/skse64 skse64/PluginManager.cpp (ScanPlugins, CheckAddressLibrary,
|
|
111
|
+
SafeCallLoadPlugin, CheckPluginCompatibility, InstallPlugins)
|
|
112
|
+
tags:
|
|
113
|
+
- skse
|
|
114
|
+
- logs
|
|
115
|
+
- classifier
|
|
116
|
+
- rejection
|
|
117
|
+
- plugin
|
|
118
|
+
- version
|
|
119
|
+
detail: Also present - "LE plugin cannot be used with SE", "does not appear to be an SKSE plugin",
|
|
120
|
+
"disabled, bad version data", "disabled, no name specified", "disabled, unsupported version
|
|
121
|
+
independence method", "disabled, only compatible with versions earlier than 1.6.629", and two
|
|
122
|
+
SEH variants. SKSE 2.0.20 additionally emitted "reported as incompatible during query". Two
|
|
123
|
+
user-facing remaps exist - skee64.dll is reported as RaceMenu, and EngineFixes.dll failing
|
|
124
|
+
with ERROR_MOD_NOT_FOUND is reported as "SSE Engine Fixes (Part 2) not installed".
|
|
125
|
+
- id: sse.skse.runtime.plugin-declares-a-data-symbol-not-a-query-function
|
|
126
|
+
claim: A modern SKSE plugin exports a data symbol SKSEPluginVersionData SKSEPlugin_Version plus bool
|
|
127
|
+
SKSEPlugin_Load(const SKSEInterface*). There is no SKSEPlugin_Query in the AE-era API; that
|
|
128
|
+
was the pre-AE SE model.
|
|
129
|
+
status: community
|
|
130
|
+
source: github.com/ianpatt/skse64 skse64/PluginAPI.h, the plugin API docs and the
|
|
131
|
+
SKSEPluginVersionData struct
|
|
132
|
+
tags:
|
|
133
|
+
- skse
|
|
134
|
+
- plugin
|
|
135
|
+
- api
|
|
136
|
+
- version
|
|
137
|
+
- declaration
|
|
138
|
+
detail: The struct carries dataVersion, pluginVersion, name[256], author[256], supportEmail[252],
|
|
139
|
+
versionIndependenceEx, versionIndependence, compatibleVersions[16] (a zero-terminated list of
|
|
140
|
+
RUNTIME_VERSION_ values) and seVersionRequired. A plugin that is not version-independent must
|
|
141
|
+
name the exact runtime in compatibleVersions or it is rejected.
|
|
142
|
+
- id: sse.skse.runtime.address-library-file-naming
|
|
143
|
+
claim: SKSE looks for the Address Library at
|
|
144
|
+
Data\SKSE\Plugins\versionlib-<major>-<minor>-<build>-0.bin, with a literal 0 in the fourth
|
|
145
|
+
position rather than the runtime type.
|
|
146
|
+
status: community
|
|
147
|
+
source: github.com/ianpatt/skse64 skse64/PluginManager.cpp, PluginManager::CheckAddressLibrary's
|
|
148
|
+
_snprintf_s format string
|
|
149
|
+
tags:
|
|
150
|
+
- skse
|
|
151
|
+
- address-library
|
|
152
|
+
- versionlib
|
|
153
|
+
- path
|
|
154
|
+
- compat-matrix
|
|
155
|
+
- id: sse.skse.runtime.address-library-stem-differs-between-se-and-ae
|
|
156
|
+
claim: The Address Library filename stem differs by branch, not only by version numbers - AE builds
|
|
157
|
+
use versionlib-<version>.bin, SE (1.5.97) uses version-<version>.bin, and VR uses
|
|
158
|
+
version-<version>.csv.
|
|
159
|
+
status: community
|
|
160
|
+
source: github.com/alandtse/CommonLibSSE-NG include/REL/IDDB.h, IDDB::load() (selects
|
|
161
|
+
"versionlib-{}.bin" when Module::IsAE(), "version-{}.bin" otherwise, "version-{}.csv" for VR)
|
|
162
|
+
tags:
|
|
163
|
+
- skse
|
|
164
|
+
- address-library
|
|
165
|
+
- versionlib
|
|
166
|
+
- se-vs-ae
|
|
167
|
+
- vr
|
|
168
|
+
- compat-matrix
|
|
169
|
+
- gotcha
|
|
170
|
+
detail: The same header names four database generations - SSEv1, SSEv2, SSEv5 and VR - with format 5
|
|
171
|
+
arriving at 1.7.99 and being dense and direct-indexed where formats 1 and 2 are sparse and
|
|
172
|
+
sorted by id. That transition is what SKSE's "must be recompiled for new address library"
|
|
173
|
+
rejection and the kVersionIndependentEx_AddressLibraryV5 flag are about.
|
|
174
|
+
- id: sse.skse.runtime.address-library-failure-strings
|
|
175
|
+
claim: An Address Library failure surfaces in the plugin's own log or a message box, not in
|
|
176
|
+
skse64.log, with one of three literal messages - "Unsupported address library format", "Failed
|
|
177
|
+
to find the id within the address library", or "Failed to locate an appropriate address
|
|
178
|
+
library with the path".
|
|
179
|
+
status: community
|
|
180
|
+
source: github.com/Ryan-rsm-McKenzie/CommonLibSSE include/REL/Relocation.h, IDDatabase's
|
|
181
|
+
report_and_fail calls
|
|
182
|
+
tags:
|
|
183
|
+
- skse
|
|
184
|
+
- address-library
|
|
185
|
+
- logs
|
|
186
|
+
- classifier
|
|
187
|
+
- error
|
|
188
|
+
- id: sse.skse.runtime.commonlibsse-plugin-logs
|
|
189
|
+
claim: A CommonLibSSE-based plugin writes <PluginName>.log into the same SKSE log folder, with the
|
|
190
|
+
default spdlog pattern "[%Y-%m-%d %H:%M:%S.%e] [%n] [%l] [%t] [%s:%#] %v".
|
|
191
|
+
status: community
|
|
192
|
+
source: github.com/alandtse/CrashLoggerSSE src/main.cpp, InitializeLogging() and its comment naming
|
|
193
|
+
"the standard SKSE logging directory at Documents/My Games/Skyrim Special Edition/SKSE (or
|
|
194
|
+
Skyrim VR if you are using VR)"
|
|
195
|
+
tags:
|
|
196
|
+
- skse
|
|
197
|
+
- logs
|
|
198
|
+
- plugin
|
|
199
|
+
- spdlog
|
|
200
|
+
- format
|
|
201
|
+
- classifier
|
|
202
|
+
detail: So plugin logs do carry a bracketed level, unlike SKSE's own two. Individual plugins may
|
|
203
|
+
override the pattern.
|
|
204
|
+
- id: sse.skse.runtime.crashloggersse-log-naming
|
|
205
|
+
claim: CrashLoggerSSE writes crash-YYYY-MM-DD-HH-MM-SS.log, by default into the SKSE log folder but
|
|
206
|
+
into a configurable crashDirectory when one is set, with the logger pattern set to "%v" so no
|
|
207
|
+
line carries a timestamp of its own.
|
|
208
|
+
status: community
|
|
209
|
+
source: github.com/alandtse/CrashLoggerSSE src/Crash/CommonHeader.cpp (get_timestamped_log, called
|
|
210
|
+
with the prefix "crash-") and src/main.cpp (SetupCrashLogPath)
|
|
211
|
+
tags:
|
|
212
|
+
- crash-log
|
|
213
|
+
- crashloggersse
|
|
214
|
+
- path
|
|
215
|
+
- format
|
|
216
|
+
- classifier
|
|
217
|
+
detail: "Its section headers are PROBABLE CALL STACK:, RAW CALL STACK:, REGISTERS:, STACK:,
|
|
218
|
+
MODULES:, SKSE PLUGINS: and PLUGINS:, and its light plugin lines read [FE:53C] Name.esp with a
|
|
219
|
+
colon. Trainwreck, the other common crash logger, uses SCRIPT EXTENDER PLUGINS: and [FE 53C]
|
|
220
|
+
with a space, which is the cheapest way to tell the two formats apart."
|
|
221
|
+
- id: sse.skse.runtime.papyrus-log-needs-enabling
|
|
222
|
+
claim: The Papyrus log is off by default and is enabled by [Papyrus] bEnableLogging=1 in Skyrim.ini,
|
|
223
|
+
usually alongside bEnableTrace=1 and bLoadDebugInformation=1 (which adds line numbers to error
|
|
224
|
+
traces at the cost of memory).
|
|
225
|
+
status: community
|
|
226
|
+
source: stepmodifications.org "Guide:Skyrim INI/Papyrus" (the [Papyrus] settings table) and
|
|
227
|
+
"Guide:Troubleshooting", the Clean Savegame Procedure
|
|
228
|
+
tags:
|
|
229
|
+
- papyrus
|
|
230
|
+
- logs
|
|
231
|
+
- ini
|
|
232
|
+
- skyrim-ini
|
|
233
|
+
- enablement
|
|
234
|
+
detail: "An absent Papyrus log almost always means bEnableLogging is 0, not that anything is broken
|
|
235
|
+
- which is exactly what a surface's explainMissing hook should say. The same section's
|
|
236
|
+
defaults are self-validating against a real log's header line \"Memory page: 128 (min) 512
|
|
237
|
+
(max) 76800 (max total)\"."
|
|
238
|
+
- id: sse.skse.runtime.papyrus-log-path-and-rotation
|
|
239
|
+
claim: "With logging on the game writes Documents\\My Games\\Skyrim Special
|
|
240
|
+
Edition\\Logs\\Script\\Papyrus.#.log for # from 0 to 3, where Papyrus.0.log is always the
|
|
241
|
+
newest and Papyrus.3.log the oldest."
|
|
242
|
+
status: community
|
|
243
|
+
source: stepmodifications.org "Guide:Troubleshooting", section "Clean Savegame Procedure"
|
|
244
|
+
tags:
|
|
245
|
+
- papyrus
|
|
246
|
+
- logs
|
|
247
|
+
- path
|
|
248
|
+
- rotation
|
|
249
|
+
detail: Because 0 is replaced rather than appended on each run, an incremental log reader will
|
|
250
|
+
legitimately see this file as rotated on every launch. Whether the Logs\Script folder follows
|
|
251
|
+
the GOG/EPIC rename that SKSE's SAVE_FOLDER_NAME applies is not sourced.
|
|
252
|
+
- id: sse.skse.runtime.papyrus-line-format
|
|
253
|
+
claim: 'A Papyrus log line is "[MM/DD/YYYY - HH:MM:SSAM] <message>", with a capitalized "Error: " or
|
|
254
|
+
"Warning: " immediately after the bracket when present. An error with a stack is followed by a
|
|
255
|
+
bare "stack:" line and tab-indented frames of the form <receiver>.<script>.<function>() -
|
|
256
|
+
"<source>" Line <n>.'
|
|
257
|
+
status: community
|
|
258
|
+
source: a captured Papyrus.0.log at github.com/sswalters/Skyrim/blob/master/papyrus%20log%200
|
|
259
|
+
tags:
|
|
260
|
+
- papyrus
|
|
261
|
+
- logs
|
|
262
|
+
- format
|
|
263
|
+
- classifier
|
|
264
|
+
- stack-trace
|
|
265
|
+
detail: <receiver> is one of <unknown self>, [EditorID (FormID)], [alias <Name> on quest <Quest>
|
|
266
|
+
(FormID)], or [ (FormID)] when the editor ID is blank; <source> is a .psc name, "<native>" or
|
|
267
|
+
"<savegame>"; "Line ?" appears when bLoadDebugInformation is off.
|
|
268
|
+
- id: sse.skse.runtime.papyrus-missing-store-line-has-no-severity
|
|
269
|
+
claim: 'The line `Cannot open store for class "X", missing file?` - meaning a script the save
|
|
270
|
+
references is no longer installed - carries no Error: or Warning: prefix at all.'
|
|
271
|
+
status: community
|
|
272
|
+
source: the same captured Papyrus.0.log (github.com/sswalters/Skyrim/blob/master/papyrus%20log%200)
|
|
273
|
+
tags:
|
|
274
|
+
- papyrus
|
|
275
|
+
- logs
|
|
276
|
+
- classifier
|
|
277
|
+
- gotcha
|
|
278
|
+
- missing-script
|
|
279
|
+
detail: 'One of the most diagnostic lines in the whole log, and a level-gated classifier will miss
|
|
280
|
+
every instance of it. The companion families that DO carry a prefix are "Error: Unable to bind
|
|
281
|
+
script X to Y (FormID) because their base types do not match" and "Warning: Property X on
|
|
282
|
+
script Y attached to Z (FormID) cannot be initialized because the script no longer contains
|
|
283
|
+
that property".'
|