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,251 @@
|
|
|
1
|
+
game: valheim
|
|
2
|
+
topic: bepinex.plugins
|
|
3
|
+
title: The BepInEx 5 plugin contract — metadata attributes, dependency-ordered loading, and how a
|
|
4
|
+
plugin fails
|
|
5
|
+
facts:
|
|
6
|
+
- id: valheim.bepinex.plugins.bepinplugin-attribute-contract
|
|
7
|
+
claim: A plugin is a class inheriting `BepInEx.BaseUnityPlugin` (itself a Unity `MonoBehaviour`, so
|
|
8
|
+
`Awake`/`Update` are the entry points) carrying `[BepInPlugin(GUID, Name, Version)]`. Without
|
|
9
|
+
the attribute BepInEx ignores the type entirely. The GUID must be unique and match
|
|
10
|
+
`^[a-zA-Z0-9\._\-]+$`; reverse-domain notation is the recommended form. The version string is
|
|
11
|
+
parsed with `System.Version`, i.e. `major.minor[.build[.revision]]`.
|
|
12
|
+
status: community
|
|
13
|
+
source: https://docs.bepinex.dev/v5.4.11/articles/dev_guide/plugin_tutorial/2_plugin_start.html ;
|
|
14
|
+
GUID regex from BepInEx v5-lts `Chainloader.allowedGuidRegex`
|
|
15
|
+
tags:
|
|
16
|
+
- bepinex
|
|
17
|
+
- plugin
|
|
18
|
+
- bepinplugin
|
|
19
|
+
- guid
|
|
20
|
+
- version
|
|
21
|
+
- validator
|
|
22
|
+
detail: "Three of these are checkable by a static validator against a plugin's own source before it
|
|
23
|
+
is ever built: the attribute is present, the GUID matches the regex, and the version parses.
|
|
24
|
+
BepInEx logs \"Skipping type [...] because its GUID [...] is of an illegal format.\" and
|
|
25
|
+
\"Skipping type [...] because its version is invalid.\" for the other two cases, at Warning
|
|
26
|
+
level, with no other symptom."
|
|
27
|
+
- id: valheim.bepinex.plugins.valheim-pack-allows-semver-versions
|
|
28
|
+
claim: "Stock BepInEx 5 rejects a plugin whose version string is a full SemVer with a pre-release
|
|
29
|
+
suffix such as `1.2.0-beta.1`, because `System.Version` cannot parse it. BepInExPack_Valheim
|
|
30
|
+
patches this: its README lists \"Plugins can use semver version strings like `1.2.0-beta.1`.
|
|
31
|
+
Base BepInEx 5 throws those plugins out with an 'invalid version' warning.\""
|
|
32
|
+
status: community
|
|
33
|
+
source: https://thunderstore.io/c/valheim/p/denikson/BepInExPack_Valheim/ (README, the list of
|
|
34
|
+
deviations from upstream BepInEx)
|
|
35
|
+
tags:
|
|
36
|
+
- bepinex
|
|
37
|
+
- bepinexpack
|
|
38
|
+
- version
|
|
39
|
+
- semver
|
|
40
|
+
- validator
|
|
41
|
+
- valheim-specific
|
|
42
|
+
detail: A validator that enforces the stock `System.Version` rule on a Valheim plugin would be
|
|
43
|
+
wrong. This is one of the concrete places where "Valheim runs BepInEx" and "Valheim runs the
|
|
44
|
+
Valheim BepInEx pack" give different answers, which is why the pack has to be its own compat
|
|
45
|
+
component.
|
|
46
|
+
- id: valheim.bepinex.plugins.dependency-attributes
|
|
47
|
+
claim: '`[BepInDependency(guid, DependencyFlags)]` declares a dependency, with
|
|
48
|
+
`DependencyFlags.HardDependency` (the constructor default) or `SoftDependency`; a second
|
|
49
|
+
overload takes a minimum version string and is always treated as hard.
|
|
50
|
+
`[BepInProcess("name.exe")]` restricts the plugin to named executables,
|
|
51
|
+
`[BepInIncompatibility(guid)]` refuses to load alongside another plugin. All three allow
|
|
52
|
+
multiple applications.'
|
|
53
|
+
status: inferred
|
|
54
|
+
source: BepInEx v5-lts `BepInEx/Contract/Attributes.cs`; the Hard/Soft semantics are also stated at
|
|
55
|
+
https://docs.bepinex.dev/v5.4.11/articles/dev_guide/plugin_tutorial/2_plugin_start.html
|
|
56
|
+
tags:
|
|
57
|
+
- bepinex
|
|
58
|
+
- plugin
|
|
59
|
+
- bepindependency
|
|
60
|
+
- bepinprocess
|
|
61
|
+
- bepinincompatibility
|
|
62
|
+
- load-order
|
|
63
|
+
detail: "`[BepInProcess]` matters more than usual for Valheim because the client and dedicated
|
|
64
|
+
server are different executables — a plugin can declare itself client-only or server-only in
|
|
65
|
+
the metadata itself, which a validator can cross-check against where a project deploys it."
|
|
66
|
+
- id: valheim.bepinex.plugins.load-order-is-a-topological-sort
|
|
67
|
+
claim: BepInEx has no load-order file. The order is a depth-first topological sort of the dependency
|
|
68
|
+
graph, seeded from a case-insensitive `SortedDictionary` so that unordered plugins come out
|
|
69
|
+
alphabetically and deterministically; the in-source comment is "We use a sorted dictionary to
|
|
70
|
+
ensure consistent load order". Both hard and soft dependencies feed the sort, so a soft
|
|
71
|
+
dependency still orders the load and the flag only decides whether a missing one is fatal.
|
|
72
|
+
status: inferred
|
|
73
|
+
source: BepInEx v5-lts `BepInEx/Bootstrap/Chainloader.cs` (`Utility.TopologicalSort` over
|
|
74
|
+
`dependencyDict`) and `BepInEx/Utility.cs`
|
|
75
|
+
tags:
|
|
76
|
+
- bepinex
|
|
77
|
+
- load-order
|
|
78
|
+
- topological-sort
|
|
79
|
+
- dependency
|
|
80
|
+
- deterministic
|
|
81
|
+
detail: 'This is the single most consequential difference from every game ModWright currently
|
|
82
|
+
supports: there is nothing for `loadOrderFile` or `diffLoadOrder` to read, and a `load_order`
|
|
83
|
+
answer can only be derived by reading metadata out of the plugin assemblies or by reading the
|
|
84
|
+
order the log actually reported. A dependency cycle throws `Exception("Cyclic Dependency:\r\n
|
|
85
|
+
- node...")` rather than degrading.'
|
|
86
|
+
- id: valheim.bepinex.plugins.duplicate-guid-highest-version-wins
|
|
87
|
+
claim: When two loaded assemblies declare the same plugin GUID, BepInEx groups by GUID, orders by
|
|
88
|
+
version descending, keeps the highest and logs "Skipping [Name Version] because a newer
|
|
89
|
+
version exists (Name Version)" at Warning for each loser.
|
|
90
|
+
status: inferred
|
|
91
|
+
source: BepInEx v5-lts `BepInEx/Bootstrap/Chainloader.cs`
|
|
92
|
+
tags:
|
|
93
|
+
- bepinex
|
|
94
|
+
- duplicate
|
|
95
|
+
- guid
|
|
96
|
+
- version
|
|
97
|
+
- conflict
|
|
98
|
+
- signature
|
|
99
|
+
detail: "This is why `conflictScope` for `BepInEx/plugins` is subtle: two mods in separate
|
|
100
|
+
subfolders never collide on file paths, so the directory layout is genuinely isolated, but
|
|
101
|
+
they can still collide on GUID, which no filesystem diff can see. The honest answer is
|
|
102
|
+
`isolated` plus a note saying the real collision axis is the GUID."
|
|
103
|
+
- id: valheim.bepinex.plugins.missing-hard-dependency-lines
|
|
104
|
+
claim: 'A missing hard dependency produces, at Error, "Could not load [Name Version] because it has
|
|
105
|
+
missing dependencies: <guid>" (or "<guid> (v<version> or newer)" when a minimum was declared),
|
|
106
|
+
and the plugin is never instantiated. Anything that hard-depends on *that* plugin then gets,
|
|
107
|
+
at Warning, "Skipping [Name Version] because it has a dependency that was not loaded. See
|
|
108
|
+
previous errors for details." A missing soft dependency produces no message at all.'
|
|
109
|
+
status: inferred
|
|
110
|
+
source: BepInEx v5-lts `BepInEx/Bootstrap/Chainloader.cs`, the `Start()` dependency pass
|
|
111
|
+
tags:
|
|
112
|
+
- bepinex
|
|
113
|
+
- dependency
|
|
114
|
+
- failure-mode
|
|
115
|
+
- signature
|
|
116
|
+
- log
|
|
117
|
+
- cascade
|
|
118
|
+
detail: "The cascade is the useful part for triage: one Error line names the real root cause, and
|
|
119
|
+
every Warning line after it is collateral. A triage verdict that ranks these equally will bury
|
|
120
|
+
the finding that matters. The same three strings are also appended to the public
|
|
121
|
+
`Chainloader.DependencyErrors` list, which is how in-game reporter mods surface them."
|
|
122
|
+
- id: valheim.bepinex.plugins.other-load-failure-lines
|
|
123
|
+
claim: 'The remaining chainloader failure literals are "Could not load [...] because it is
|
|
124
|
+
incompatible with: <guids>" (Error), "Plugin [...] targets a wrong version of BepInEx
|
|
125
|
+
(<version>) and might not work until you update" (Warning, non-blocking), "Skipping [...]
|
|
126
|
+
because of process filters (<exe names>)" (Warning), "Error loading [...] : <exception
|
|
127
|
+
message>" (Error) and "Error occurred starting the game" (Fatal).'
|
|
128
|
+
status: inferred
|
|
129
|
+
source: BepInEx v5-lts `BepInEx/Bootstrap/Chainloader.cs`
|
|
130
|
+
tags:
|
|
131
|
+
- bepinex
|
|
132
|
+
- failure-mode
|
|
133
|
+
- signature
|
|
134
|
+
- log
|
|
135
|
+
- version
|
|
136
|
+
detail: "\"targets a wrong version of BepInEx\" is a warning and does not block loading — it fires
|
|
137
|
+
when the plugin's referenced BepInEx assembly differs in major version, or is newer in minor
|
|
138
|
+
or build. Treating it as a blocker would be wrong; treating it as noise hides the most common
|
|
139
|
+
post-update breakage warning."
|
|
140
|
+
- id: valheim.bepinex.plugins.stale-assembly-exceptions-are-invisible-by-default
|
|
141
|
+
claim: "A plugin compiled against an older game assembly typically fails with an ordinary .NET
|
|
142
|
+
`MissingMethodException`/`TypeLoadException`, for which BepInEx defines no message of its own.
|
|
143
|
+
If it surfaces during type enumeration the log shows only the one-line \"Error loading [...] :
|
|
144
|
+
<message>\", because the detail (`TypeLoader.TypeLoadExceptionToString`, enumerating every
|
|
145
|
+
`LoaderException` and any `Fusion Log:` block) is logged at Debug, which the default
|
|
146
|
+
`[Logging.Disk] LogLevels` excludes. If it surfaces later — inside `Awake`, or on the first
|
|
147
|
+
call into a stale reference — it goes to Unity's logger and reaches `LogOutput.log` only if
|
|
148
|
+
`[Logging.Disk] WriteUnityLog` is turned on, which by default it is not."
|
|
149
|
+
status: inferred
|
|
150
|
+
source: BepInEx v5-lts `BepInEx/Bootstrap/TypeLoader.cs` and `BepInEx/Bootstrap/Chainloader.cs` (the
|
|
151
|
+
`LogDebug` calls after `Error loading`, and the `ConfigDiskWriteUnityLog` default of `false`)
|
|
152
|
+
tags:
|
|
153
|
+
- bepinex
|
|
154
|
+
- missingmethodexception
|
|
155
|
+
- typeloadexception
|
|
156
|
+
- game-update
|
|
157
|
+
- log
|
|
158
|
+
- failure-mode
|
|
159
|
+
detail: "This is the most important triage fact on the whole game: after a Valheim update, the
|
|
160
|
+
default configuration produces a `LogOutput.log` that looks nearly clean while the game is
|
|
161
|
+
visibly broken, and the actual stack trace is in Valheim's own `Player.log` instead.
|
|
162
|
+
ModWright's correct move is to declare both files as log sources and, on seeing a bare \"Error
|
|
163
|
+
loading [...]\" with no detail, to say so and recommend widening `LogLevels` rather than
|
|
164
|
+
guessing the cause."
|
|
165
|
+
- id: valheim.bepinex.plugins.harmony-version-and-patch-shape
|
|
166
|
+
claim: BepInEx 5.4.23.5 ships HarmonyX 2.9.0 (plus Mono.Cecil and MonoMod.RuntimeDetour); patches
|
|
167
|
+
are declared with `[HarmonyPatch(typeof(T), nameof(T.Method))]` on a class whose `Prefix`,
|
|
168
|
+
`Postfix` and `Transpiler` static methods are found by name, and applied with `new
|
|
169
|
+
Harmony("id").PatchAll()` or `Harmony.CreateAndPatchAll(assembly, id)`.
|
|
170
|
+
status: community
|
|
171
|
+
source: https://github.com/BepInEx/BepInEx/blob/v5.4.23.5/BepInEx/BepInEx.csproj (the HarmonyX 2.9.0
|
|
172
|
+
PackageReference); https://harmony.pardeike.net/v2/articles/patching-prefix.html ;
|
|
173
|
+
https://docs.bepinex.dev/articles/dev_guide/runtime_patching.html
|
|
174
|
+
tags:
|
|
175
|
+
- harmony
|
|
176
|
+
- harmonyx
|
|
177
|
+
- patch
|
|
178
|
+
- prefix
|
|
179
|
+
- postfix
|
|
180
|
+
- transpiler
|
|
181
|
+
- version
|
|
182
|
+
detail: 'The Valheim-Modding wiki independently records the same assembly version as the one a
|
|
183
|
+
plugin project references — "0Harmony, Version=2.9.0.0" from `BepInEx\core\0Harmony.dll`
|
|
184
|
+
(https://github.com/Valheim-Modding/Wiki/wiki/Best-Practices). The parameterless `PatchAll()`
|
|
185
|
+
carries a documented hazard: it resolves the calling assembly via `StackTrace.GetFrame(1)`,
|
|
186
|
+
which inlining can get wrong, so `PatchAll(Assembly.GetExecutingAssembly())` is the safe
|
|
187
|
+
form.'
|
|
188
|
+
- id: valheim.bepinex.plugins.harmonyx-runs-every-prefix-even-after-a-false
|
|
189
|
+
claim: 'HarmonyX deliberately differs from stock Harmony on prefix cancellation: in stock Harmony
|
|
190
|
+
the first prefix returning false skips the remaining prefixes and the original, whereas in
|
|
191
|
+
HarmonyX "cancelling running a prefix will not cancel running the subsequent prefixes" — every
|
|
192
|
+
prefix still runs. The HarmonyX-only injected `bool __runOriginal` parameter is the documented
|
|
193
|
+
way for a later prefix to notice that a skip was requested.'
|
|
194
|
+
status: community
|
|
195
|
+
source: https://github.com/BepInEx/HarmonyX/wiki/Difference-between-Harmony-and-HarmonyX, section
|
|
196
|
+
"All prefix patchers are always run even if original method is skipped"; stock behaviour from
|
|
197
|
+
https://harmony.pardeike.net/v2/articles/patching-prefix.html
|
|
198
|
+
tags:
|
|
199
|
+
- harmonyx
|
|
200
|
+
- harmony
|
|
201
|
+
- prefix
|
|
202
|
+
- conflict
|
|
203
|
+
- silent-failure
|
|
204
|
+
- multiplayer
|
|
205
|
+
detail: The page opens with "Note that these are not bugs! All items listed here are intentional
|
|
206
|
+
changes". There is **no log line** for this — two mods patching the same method with
|
|
207
|
+
cancelling prefixes behave differently on Valheim than the Harmony documentation says,
|
|
208
|
+
silently. It cannot be detected by a log signature, only by knowing it, which makes it a
|
|
209
|
+
knowledge-base fact rather than a triage rule.
|
|
210
|
+
- id: valheim.bepinex.plugins.patch-target-gone-after-an-update
|
|
211
|
+
claim: 'When a patched method no longer exists after a game update, the two observable signatures
|
|
212
|
+
are a HarmonyX Warning from AccessTools — "AccessTools.Method: Could not find method for type
|
|
213
|
+
<type> and name <name> and parameters <params>" (and the DeclaredMethod / Field / Property /
|
|
214
|
+
TypeByName variants) — and an `ArgumentException: Undefined target method for patch method
|
|
215
|
+
<signature>` thrown out of `PatchClassProcessor`, which in a normal plugin surfaces from
|
|
216
|
+
`Awake` as a Unity exception rather than as a chainloader error.'
|
|
217
|
+
status: inferred
|
|
218
|
+
source: HarmonyX v2.9.0 `Harmony/Tools/AccessTools.cs` and `Harmony/Public/PatchClassProcessor.cs`;
|
|
219
|
+
the BepInEx-side channel mapping is `BepInEx/Logging/HarmonyLogSource.cs`
|
|
220
|
+
tags:
|
|
221
|
+
- harmony
|
|
222
|
+
- harmonyx
|
|
223
|
+
- game-update
|
|
224
|
+
- failure-mode
|
|
225
|
+
- signature
|
|
226
|
+
- accesstools
|
|
227
|
+
detail: "The Valheim-Modding wiki's own troubleshooting page quotes both shapes from real logs —
|
|
228
|
+
\"[Warning: HarmonyX] AccessTools.DeclaredMethod: Could not find method for type InventoryGui
|
|
229
|
+
and name Show and parameters (Container)\" and \"[Error : Unity Log] ArgumentException:
|
|
230
|
+
Undefined target method...\" — which is independent confirmation that these are the lines
|
|
231
|
+
users actually see (https://github.com/Valheim-Modding/Wiki/wiki/Client-Troubleshooting).
|
|
232
|
+
HarmonyX's `[Harmony.Logger] LogChannels` defaults to `Warn, Error`, so the AccessTools
|
|
233
|
+
warning does reach the disk log by default while Harmony's own Info-channel startup banner
|
|
234
|
+
does not."
|
|
235
|
+
- id: valheim.bepinex.plugins.never-unpatchall-with-null
|
|
236
|
+
claim: The community's standing rule is to never call `UnpatchAll()` with a null parameter — only
|
|
237
|
+
`UnpatchAll("your.harmony.id")` — and not to call UnpatchAll at all on game shutdown, because
|
|
238
|
+
doing so risks corrupting saves.
|
|
239
|
+
status: community
|
|
240
|
+
source: https://github.com/Valheim-Modding/Wiki/wiki/Best-Practices
|
|
241
|
+
tags:
|
|
242
|
+
- harmony
|
|
243
|
+
- unpatchall
|
|
244
|
+
- save-corruption
|
|
245
|
+
- validator
|
|
246
|
+
- failure-mode
|
|
247
|
+
detail: 'BepInEx itself logs "[Warning: HarmonyX] UnpatchAll has been called - This will remove ALL
|
|
248
|
+
HARMONY PATCHES." when it happens, which the Client-Troubleshooting page quotes as a line to
|
|
249
|
+
look for. That makes this both a source-level validator (flag a null-argument UnpatchAll call)
|
|
250
|
+
and a log signature (flag the warning), and the consequence — a corrupted save — is severe
|
|
251
|
+
enough to justify both.'
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
game: valheim
|
|
2
|
+
topic: game.versions
|
|
3
|
+
title: Valheim's version axis, update cadence, the 1.0 engine upgrade, and where saves and Player.log live
|
|
4
|
+
facts:
|
|
5
|
+
- id: valheim.game.versions.one-dotted-axis
|
|
6
|
+
claim: "Valheim has one public version axis and it is the only number Iron Gate uses: three-part
|
|
7
|
+
patch numbers, `0.217.x`, `0.218.x`, `0.219.x`, `0.220.x`, `0.221.x` through Early Access and
|
|
8
|
+
`1.0.x` after release. There is no separate marketing name for a build — the biome updates
|
|
9
|
+
(Ashlands, The Bog Witch, Deep North) are names attached to a numbered patch, not a second
|
|
10
|
+
version scheme."
|
|
11
|
+
status: community
|
|
12
|
+
source: Steam news announcement titles for app 892970 (e.g. "Patch 0.218.15 – Ashlands", "Patch
|
|
13
|
+
0.219.13 – The Bog Witch", "Patch 0.221.10 – Five Years of Valheim!"),
|
|
14
|
+
https://store.steampowered.com/news/app/892970
|
|
15
|
+
tags:
|
|
16
|
+
- version
|
|
17
|
+
- axis
|
|
18
|
+
- patch
|
|
19
|
+
- knowledge-format
|
|
20
|
+
- verified-on
|
|
21
|
+
detail: Under ModWright's version convention, `verified_on` for this game is therefore written on
|
|
22
|
+
the `1.0.12` form — the same axis the patch notes use. The exe's PE FileVersion is a
|
|
23
|
+
*different* number (the Unity player version, see below) and must never be substituted for it.
|
|
24
|
+
- id: valheim.game.versions.current-is-1-0-12
|
|
25
|
+
claim: Valheim left Early Access on 2026-09-09 with "Valheim 1.0 Has Arrived!", and the most recent
|
|
26
|
+
patch as of 2026-09-11 is "Hotfix 1.0.10 & 1.0.12", published the same day — 1.0.10 to all
|
|
27
|
+
platforms and 1.0.12 to Steam only.
|
|
28
|
+
status: community
|
|
29
|
+
source: https://valheim.com/news/ and the Steam news feed for app 892970 (announcements dated
|
|
30
|
+
2026-09-09 and 2026-09-11)
|
|
31
|
+
tags:
|
|
32
|
+
- version
|
|
33
|
+
- release
|
|
34
|
+
- "1.0"
|
|
35
|
+
- deep-north
|
|
36
|
+
- current
|
|
37
|
+
detail: Two things follow for a surface being brought up today. Every fact about this game is at
|
|
38
|
+
most two days old, so nothing is settled. And the split between an all-platform 1.0.10 and a
|
|
39
|
+
Steam-only 1.0.12 means "the current version" is genuinely ambiguous for a few days at a time
|
|
40
|
+
— a compat rule that pins an exact build will misfire during those windows.
|
|
41
|
+
- id: valheim.game.versions.cadence-is-slow-with-a-public-test-branch
|
|
42
|
+
claim: "Iron Gate's cadence is a handful of patches a year, each typically preceded by a named
|
|
43
|
+
\"(Public Test)\" release: 0.217.46 (2024-04-10), 0.218.15 – Ashlands (2024-05-14), 0.218.21
|
|
44
|
+
(2024-08-27), 0.219.13 – The Bog Witch (2024-10-29), 0.219.16 (2024-11-19), 0.220.5
|
|
45
|
+
(2025-04-01), 0.221.4 – Call To Arms (2025-09-09), 0.221.10 – Five Years of Valheim
|
|
46
|
+
(2026-02-02), 0.221.12 (2026-02-19), 0.221.13 (Public Test) (2026-05-06), 1.0 (2026-09-09)."
|
|
47
|
+
status: community
|
|
48
|
+
source: Steam news announcement titles and dates for app 892970,
|
|
49
|
+
https://store.steampowered.com/news/app/892970
|
|
50
|
+
tags:
|
|
51
|
+
- version
|
|
52
|
+
- cadence
|
|
53
|
+
- public-test
|
|
54
|
+
- beta-branch
|
|
55
|
+
- patch-history
|
|
56
|
+
detail: Compared with Cyberpunk 2077 or Baldur's Gate 3 this is a slow cadence with long stable
|
|
57
|
+
plateaus — 0.220.5 stood for five months, 0.221.12 for seven. The practical consequence is
|
|
58
|
+
that "every plugin broke" events are rare but total, and the Public Test branch gives modders
|
|
59
|
+
advance warning, which is the natural trigger for a compat-matrix refresh.
|
|
60
|
+
- id: valheim.game.versions.1-0-included-a-unity-engine-upgrade
|
|
61
|
+
claim: The Valheim 1.0 patch notes list "Unity engine upgrade" among the fixes and improvements,
|
|
62
|
+
alongside a new "Magica cloth system"; the Valheim-Modding wiki's Unity project guide
|
|
63
|
+
correspondingly instructs modders to install Unity `6000.0.75f1`.
|
|
64
|
+
status: community
|
|
65
|
+
source: https://valheim.com/news/valheim-1-0-has-arrived-/ (patch notes, "Fixes & Improvements") ;
|
|
66
|
+
https://github.com/Valheim-Modding/Wiki/wiki/Valheim-Unity-Project-Guide
|
|
67
|
+
tags:
|
|
68
|
+
- unity
|
|
69
|
+
- engine
|
|
70
|
+
- version
|
|
71
|
+
- assetbundle
|
|
72
|
+
- "1.0"
|
|
73
|
+
- breaking
|
|
74
|
+
detail: An engine major-version move is the largest possible breaking change for asset-shipping
|
|
75
|
+
mods. Note the wiki's own JotunnModStub README still names Unity `2022.3.17f`, so the two
|
|
76
|
+
Valheim-Modding sources disagree and the correct editor version for 1.0 asset work is not
|
|
77
|
+
settled by documentation alone.
|
|
78
|
+
- id: valheim.game.versions.unity-upgrade-history
|
|
79
|
+
claim: Iron Gate names the Unity version in patch notes only some of the time. The numbered
|
|
80
|
+
statements are "Updated Unity version to 2022.3.50" in 0.219.13 – The Bog Witch (2024-10-29),
|
|
81
|
+
"Upgraded Unity engine to 6000.0.46f" in 0.221.4 – Call To Arms (2025-09-09), and "Updated
|
|
82
|
+
Game Engine to Unity 6000.0.61f1" in 0.221.10 (2026-02-02). Valheim 1.0 (2026-09-09) says only
|
|
83
|
+
"Unity engine upgrade", with no number.
|
|
84
|
+
status: community
|
|
85
|
+
source: Steam news patch notes for app 892970, the four announcements named (retrieved via
|
|
86
|
+
ISteamNews GetNewsForApp, 2026-09-11)
|
|
87
|
+
tags:
|
|
88
|
+
- unity
|
|
89
|
+
- version
|
|
90
|
+
- history
|
|
91
|
+
- patch-notes
|
|
92
|
+
- assetbundle
|
|
93
|
+
detail: So Valheim moved from the Unity 2022.3 line to Unity 6 between 2024-10-29 and 2025-09-09,
|
|
94
|
+
and the last *numbered* engine statement is 6000.0.61f1. Earlier engine moves (the 2019/2020
|
|
95
|
+
lines) are not in the patch notes at all — 0.207.20, 0.212.7 (Mistlands) and 0.217.14
|
|
96
|
+
(Hildir's Request) mention no engine version — so that history cannot be reconstructed from
|
|
97
|
+
Iron Gate's own notes.
|
|
98
|
+
- id: valheim.game.versions.assetbundles-are-not-forward-compatible
|
|
99
|
+
claim: Unity's own manual states that AssetBundles built with an older Unity are usually loadable by
|
|
100
|
+
a newer one but that "Unity doesn't support forward-compatibility of AssetBundles, so you
|
|
101
|
+
can't load an AssetBundle built with a newer version of Unity into an older version of Unity",
|
|
102
|
+
and that after large changes between versions a bundle must be rebuilt.
|
|
103
|
+
status: community
|
|
104
|
+
source: https://docs.unity3d.com/6000.3/Documentation/Manual/AssetBundlesIntro.html, "Introduction
|
|
105
|
+
to AssetBundles"
|
|
106
|
+
tags:
|
|
107
|
+
- unity
|
|
108
|
+
- assetbundle
|
|
109
|
+
- compatibility
|
|
110
|
+
- version
|
|
111
|
+
- toolchain
|
|
112
|
+
detail: "Combined with the upgrade history above, this is why the editor version matters concretely
|
|
113
|
+
rather than academically: a mod's bundle must be built with an editor no newer than the game's
|
|
114
|
+
runtime, and every Iron Gate engine bump is a point at which existing bundles can stop
|
|
115
|
+
loading. The same page notes that bundles built without type trees are the ones that fail
|
|
116
|
+
hardest across versions."
|
|
117
|
+
- id: valheim.game.versions.unity-version-readable-from-the-exe
|
|
118
|
+
claim: "The Unity player version is recoverable without launching the game, because BepInEx itself
|
|
119
|
+
derives it that way: its \"Running under Unity v...\" line is
|
|
120
|
+
`FileVersionInfo.GetVersionInfo(<game exe>).FileVersion`. Reading `valheim.exe`'s PE
|
|
121
|
+
FileVersion therefore answers the Unity-version question from a cold install."
|
|
122
|
+
status: inferred
|
|
123
|
+
source: BepInEx v5-lts `BepInEx.Preloader/Preloader.cs`, `GetUnityVersion()`
|
|
124
|
+
tags:
|
|
125
|
+
- unity
|
|
126
|
+
- version
|
|
127
|
+
- pe
|
|
128
|
+
- fileversion
|
|
129
|
+
- detect
|
|
130
|
+
- compat
|
|
131
|
+
related:
|
|
132
|
+
- id: valheim.bepinex.loader.unity-version-is-the-exe-file-version
|
|
133
|
+
detail: the same mechanism, stated from the loader's side
|
|
134
|
+
- id: valheim.game.versions.most-mods-broke-at-1-0
|
|
135
|
+
claim: The Valheim-Modding community's own 1.0 FAQ states that most mods do not work with 1.0
|
|
136
|
+
because of breaking changes, that update timelines vary from days to months per author, that
|
|
137
|
+
the old BepInEx pack still loads but should be updated, and that players wanting the pre-1.0
|
|
138
|
+
game should select `0.221.12 from February 19th` through Steam's beta settings.
|
|
139
|
+
status: community
|
|
140
|
+
source: https://github.com/Valheim-Modding/Wiki/wiki/Valheim-1.0-FAQ
|
|
141
|
+
tags:
|
|
142
|
+
- "1.0"
|
|
143
|
+
- breaking
|
|
144
|
+
- compat
|
|
145
|
+
- beta-branch
|
|
146
|
+
- rollback
|
|
147
|
+
detail: "Iron Gate's own 1.0 FAQ says the same from the publisher's side: there is no official mod
|
|
148
|
+
support on PC or consoles, no Steam Workshop, and no guarantee any mod will function at 1.0
|
|
149
|
+
(https://valheim.com/support/valheim-1-0-faq/)."
|
|
150
|
+
- id: valheim.game.versions.iron-gate-mod-stance
|
|
151
|
+
claim: Iron Gate's standing public statement on mods, dated 2023-05-29, is that "any creating and
|
|
152
|
+
using of mods is done at your own risk, and that we can't guarantee that mods will be
|
|
153
|
+
compatible with newer versions", and that the studio "does not condone locking modded content
|
|
154
|
+
behind a paywall" and urges authors to keep mods freely available.
|
|
155
|
+
status: community
|
|
156
|
+
source: https://valheim.com/news/regarding-mods/
|
|
157
|
+
tags:
|
|
158
|
+
- legal
|
|
159
|
+
- norm
|
|
160
|
+
- iron-gate
|
|
161
|
+
- official
|
|
162
|
+
- paid-mods
|
|
163
|
+
detail: This post is a tolerance statement, not a licence grant, and it sits alongside a EULA that
|
|
164
|
+
says the opposite in strict terms — see
|
|
165
|
+
`valheim.game.versions.eula-prohibits-reverse-engineering`. Iron Gate's stated enforcement
|
|
166
|
+
line in this post is paywalling and passing mods off as official.
|
|
167
|
+
- id: valheim.game.versions.eula-prohibits-reverse-engineering
|
|
168
|
+
claim: "Valheim's EULA (last updated 11 June 2025) explicitly prohibits both decompilation and
|
|
169
|
+
modification: users must \"do not reverse engineer, decompile, disassemble, decipher or
|
|
170
|
+
otherwise attempt to derive the source code for any underlying software or other intellectual
|
|
171
|
+
property used to provide the Game\", and \"do not modify or adapt the Game or hack, merge,
|
|
172
|
+
translate, creative derivatives from the Game, mimic, disable the Game or tamper with them\"."
|
|
173
|
+
status: community
|
|
174
|
+
source: https://valheim.com/eula (last updated 11 June 2025)
|
|
175
|
+
tags:
|
|
176
|
+
- legal
|
|
177
|
+
- eula
|
|
178
|
+
- decompile
|
|
179
|
+
- reverse-engineering
|
|
180
|
+
- modding
|
|
181
|
+
- norm
|
|
182
|
+
detail: "The strict letter of the EULA — and of the Steam Subscriber Agreement §2.G, which likewise
|
|
183
|
+
forbids reverse engineering and derivative works — coexists with Iron Gate's own public
|
|
184
|
+
statement welcoming mods (`valheim.game.versions.iron-gate-mod-stance`). Both must be
|
|
185
|
+
recorded; reporting only the tolerance statement would be a materially incomplete answer to
|
|
186
|
+
anyone asking whether decompiling is sanctioned. Practically, the whole Valheim modding
|
|
187
|
+
toolchain is built around never redistributing anything game-owned: publicizers ship as
|
|
188
|
+
patchers that rewrite the user's own local copy, not as assemblies."
|
|
189
|
+
- id: valheim.game.versions.soft-referenceable-assets-since-0-217-40
|
|
190
|
+
claim: Since 0.217.40 Valheim loads assets through a custom system Iron Gate calls "Soft
|
|
191
|
+
Referenceable Assets", backed by AssetBundles, so that Locations and Rooms can be loaded and
|
|
192
|
+
unloaded dynamically; ObjectDB and ZNetScene were stated as unaffected at the time of that
|
|
193
|
+
FAQ.
|
|
194
|
+
status: community
|
|
195
|
+
source: https://valheim.com/support/modding-faq-for-the-asset-bundle-update-0-217-40/
|
|
196
|
+
tags:
|
|
197
|
+
- assets
|
|
198
|
+
- assetbundle
|
|
199
|
+
- softreferenceableassets
|
|
200
|
+
- objectdb
|
|
201
|
+
- znetscene
|
|
202
|
+
- index
|
|
203
|
+
detail: "Iron Gate's own guidance in that FAQ is the design constraint for any ModWright vanilla
|
|
204
|
+
index: \"if your mod relies on a certain asset having a certain path, it's likely that an
|
|
205
|
+
update will break your mod\", and mods should key on AssetIDs, which \"will always stay the
|
|
206
|
+
same for each asset even if it's moved or renamed\". An index keyed on paths would be
|
|
207
|
+
re-broken by every patch; one keyed on AssetIDs would not."
|
|
208
|
+
- id: valheim.game.versions.save-locations
|
|
209
|
+
claim: Valheim's user data lives under `%USERPROFILE%\AppData\LocalLow\IronGate\Valheim`, with
|
|
210
|
+
character saves as `characters/*.fch` and worlds as `worlds/*.fwl` plus a matching `.db`; each
|
|
211
|
+
has a `.old` backup sibling (`.fch.old`, `.fwl.old`, `.db.old`).
|
|
212
|
+
status: community
|
|
213
|
+
source: https://github.com/ModOrganizer2/modorganizer-basic_games/blob/master/games/game_valheim.py
|
|
214
|
+
(`GameSavesDirectory`, `ValheimSaveGame`, `ValheimWorldSaveGame.allFiles`, `listSaves`)
|
|
215
|
+
tags:
|
|
216
|
+
- saves
|
|
217
|
+
- worlds
|
|
218
|
+
- characters
|
|
219
|
+
- locallow
|
|
220
|
+
- path
|
|
221
|
+
detail: MO2's plugin globs only `characters/` and `worlds/`; community save tools glob
|
|
222
|
+
`worlds_local/` and `characters_local/`, which is where local (as opposed to Steam-cloud)
|
|
223
|
+
saves have lived since roughly 0.209.8. Treat all four directory names as candidates to probe,
|
|
224
|
+
not as asserted paths, and see the next fact — the `.db`/`.fwl` pair itself is no longer how
|
|
225
|
+
1.0 stores a world.
|
|
226
|
+
- id: valheim.game.versions.1-0-world-saves-are-chunked-folders
|
|
227
|
+
claim: "Valheim's world save format changed with the new save system introduced in 0.221.13 and
|
|
228
|
+
shipped in 1.0: \"Worlds will no longer be saved with a .db and a .fwl file, but will instead
|
|
229
|
+
be saved and stored in separate fo[lders]\", the world is split into chunks and \"only the
|
|
230
|
+
chunks that have been modified since the last save will be affected\"."
|
|
231
|
+
status: community
|
|
232
|
+
source: 'Steam news, "Patch 0.221.13 (Public Test)", app 892970, 2026-05-06; the 1.0 notes restate
|
|
233
|
+
it as "New save system: Splits world data across chunks to reduce how much data is serialized
|
|
234
|
+
and written"'
|
|
235
|
+
tags:
|
|
236
|
+
- saves
|
|
237
|
+
- worlds
|
|
238
|
+
- format
|
|
239
|
+
- "1.0"
|
|
240
|
+
- breaking
|
|
241
|
+
- chunks
|
|
242
|
+
detail: Any tool that assumes one `<world>.db` per world — which includes every community save
|
|
243
|
+
manager written before 2026 and MO2's own `ValheimWorldSaveGame.allFiles`, which appends `.db`
|
|
244
|
+
and `.db.old` — is wrong against a 1.0 world. A Valheim surface should not model save files at
|
|
245
|
+
all until the new layout has been seen on disk.
|
|
246
|
+
- id: valheim.game.versions.windows-playerprefs-live-in-the-registry
|
|
247
|
+
claim: "On Windows there is no `prefs` file under LocalLow: Unity stores PlayerPrefs in the registry
|
|
248
|
+
under `HKCU\\Software\\<CompanyName>\\<ProductName>`, i.e.
|
|
249
|
+
`HKCU\\Software\\IronGate\\Valheim`. The `prefs` file exists only on Linux and macOS."
|
|
250
|
+
status: community
|
|
251
|
+
source: https://docs.unity3d.com/ScriptReference/PlayerPrefs.html
|
|
252
|
+
tags:
|
|
253
|
+
- prefs
|
|
254
|
+
- playerprefs
|
|
255
|
+
- registry
|
|
256
|
+
- windows
|
|
257
|
+
- unity
|
|
258
|
+
- path
|
|
259
|
+
detail: Worth stating because "the prefs file" is a common instruction in Valheim troubleshooting
|
|
260
|
+
threads written from a Linux perspective, and a surface that declares it as a Windows path
|
|
261
|
+
will report a permanently missing file.
|
|
262
|
+
- id: valheim.game.versions.player-log-location
|
|
263
|
+
claim: Unity writes the player log to
|
|
264
|
+
`%USERPROFILE%\AppData\LocalLow\<CompanyName>\<ProductName>\Player.log`, which for Valheim is
|
|
265
|
+
`%USERPROFILE%\AppData\LocalLow\IronGate\Valheim\Player.log` — the same directory as the
|
|
266
|
+
saves.
|
|
267
|
+
status: community
|
|
268
|
+
source: https://docs.unity3d.com/Manual/log-files.html (Unity 6.6 Manual, Player log locations)
|
|
269
|
+
combined with the IronGate/Valheim company and product names from
|
|
270
|
+
https://github.com/ModOrganizer2/modorganizer-basic_games/blob/master/games/game_valheim.py
|
|
271
|
+
tags:
|
|
272
|
+
- player-log
|
|
273
|
+
- unity
|
|
274
|
+
- locallow
|
|
275
|
+
- log
|
|
276
|
+
- triage
|
|
277
|
+
detail: "This is the second half of the triage story: `BepInEx/LogOutput.log` carries the loader's
|
|
278
|
+
view and, by default, none of the game's own Unity exceptions (`[Logging.Disk] WriteUnityLog`
|
|
279
|
+
is false), so a plugin that throws inside `Awake` leaves its stack trace here instead. The
|
|
280
|
+
Unity Manual page consulted does not mention a `Player-prev.log` sibling, so a previous-run
|
|
281
|
+
log should be treated as a candidate to probe rather than an asserted path."
|
|
282
|
+
- id: valheim.game.versions.mo2-lists-a-third-steam-app-id
|
|
283
|
+
claim: ModOrganizer2's Valheim plugin registers three Steam app ids — `892970` (game), `896660`
|
|
284
|
+
(dedicated server) and `1223920` — and forces `winhttp.dll` to load into `valheim.exe`, with
|
|
285
|
+
`GameDataPath = ""` meaning the game root itself is the deployment target.
|
|
286
|
+
status: community
|
|
287
|
+
source: https://github.com/ModOrganizer2/modorganizer-basic_games/blob/master/games/game_valheim.py
|
|
288
|
+
(`ValheimGame.GameSteamId`, `_forced_libraries`, `GameDataPath`)
|
|
289
|
+
tags:
|
|
290
|
+
- steam
|
|
291
|
+
- appid
|
|
292
|
+
- detect
|
|
293
|
+
- winhttp
|
|
294
|
+
- mo2
|
|
295
|
+
- deploy
|
|
296
|
+
detail: "What app `1223920` is (most plausibly a public-test or demo app) was not established from a
|
|
297
|
+
primary source in this pass and should not be asserted. The `GameDataPath = \"\"` line is the
|
|
298
|
+
interesting one: unlike every Bethesda-style game MO2 supports, Valheim's mod tree is rooted
|
|
299
|
+
at the game directory itself, because the loader files sit beside the executable."
|
|
300
|
+
- id: valheim.game.versions.mo2-mod-layout-normalisation
|
|
301
|
+
claim: "MO2's Valheim plugin encodes the community's de-facto archive layout as data: it unfolds a
|
|
302
|
+
`BepInExPack_Valheim` wrapper directory, accepts `BepInEx`, `doorstop_libs`,
|
|
303
|
+
`unstripped_corlib`, `.doorstop_version`, `doorstop_config.ini`, `start_game_bepinex.sh`,
|
|
304
|
+
`start_server_bepinex.sh`, `winhttp.dll` and `changelog.txt` at the root, deletes
|
|
305
|
+
`manifest.json`, `icon.png`, `*.md`, `*.pdb` and `*.dll.mdb`, and moves loose `*.dll` to
|
|
306
|
+
`BepInEx/plugins/` and loose `*.cfg` to `BepInEx/config/`."
|
|
307
|
+
status: community
|
|
308
|
+
source: https://github.com/ModOrganizer2/modorganizer-basic_games/blob/master/games/game_valheim.py
|
|
309
|
+
(the `BasicModDataChecker` `GlobPatterns`)
|
|
310
|
+
tags:
|
|
311
|
+
- layout
|
|
312
|
+
- packaging
|
|
313
|
+
- normalisation
|
|
314
|
+
- mo2
|
|
315
|
+
- prior-art
|
|
316
|
+
- validator
|
|
317
|
+
detail: Two things ModWright can take directly from this. The `unfold` entry for
|
|
318
|
+
`BepInExPack_Valheim` is machine-readable confirmation that the extract-the-wrapper-folder
|
|
319
|
+
mistake is common enough to encode. And the `move` table is a ready-made statement of where a
|
|
320
|
+
loose file of each type belongs, which is precisely what a packaging validator needs to check
|
|
321
|
+
against.
|