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,210 @@
|
|
|
1
|
+
game: subnautica2
|
|
2
|
+
topic: modding.state
|
|
3
|
+
title: Subnautica 2 modding — official stance, community toolchain, distribution
|
|
4
|
+
facts:
|
|
5
|
+
- id: subnautica2.modding.no-official-mod-support-announced
|
|
6
|
+
claim: As of 2026-09-11, nearly four months after Early Access launch, Unknown Worlds and Krafton
|
|
7
|
+
have announced no official mod support, no modkit, no Steam Workshop and no mod.io integration
|
|
8
|
+
for Subnautica 2.
|
|
9
|
+
status: community
|
|
10
|
+
verified_on: 0.10.0 (CL 113109)
|
|
11
|
+
source: "Negative result across four places such a statement would appear, all read 2026-09-11: the
|
|
12
|
+
Steam store page (https://store.steampowered.com/app/1962700/ — no mention of Workshop, mod
|
|
13
|
+
support or UGC anywhere, including the Early Access box); Unknown Worlds' own EA 1.1 post
|
|
14
|
+
(https://unknownworlds.com/en/news/subnautica-2-adaptive-measures-update); the Update History
|
|
15
|
+
wiki covering all eight releases (https://wiki.subnautica.com/sn2/Update_History); and the
|
|
16
|
+
shipping build itself, which mounts no mod loader."
|
|
17
|
+
tags:
|
|
18
|
+
- official
|
|
19
|
+
- mod-support
|
|
20
|
+
- modkit
|
|
21
|
+
- workshop
|
|
22
|
+
- modio
|
|
23
|
+
- absent
|
|
24
|
+
- stance
|
|
25
|
+
detail: 'There is a reported qualifier that could NOT be read first-hand: an Unknown Worlds
|
|
26
|
+
help-centre article "Will there be any mod support?"
|
|
27
|
+
(https://support.subnautica.com/hc/en-us/articles/57020140859929-Will-there-be-any-mod-support,
|
|
28
|
+
reportedly last updated 2026-04-16) is said to state that official modding support will not be
|
|
29
|
+
available initially but that they would like to consider it for future releases. That page
|
|
30
|
+
returns HTTP 403 to automated fetches on every attempt, so the wording is a search-snippet
|
|
31
|
+
paraphrase and must not be quoted as a citation until a human opens it. Separately, no source
|
|
32
|
+
says mods are DISALLOWED; the EULA was not examined. Read this as "nothing announced", not as
|
|
33
|
+
a prohibition.'
|
|
34
|
+
- id: subnautica2.modding.developer-tolerates-mods-in-patch-notes
|
|
35
|
+
claim: Unknown Worlds acknowledges and tolerates community mods in its own patch notes. The hotfix
|
|
36
|
+
posts carry, verbatim, "If you play Subnautica 2 with mods, please temporarily disable,
|
|
37
|
+
remove, or uninstall them before launching the game following the hotfix."
|
|
38
|
+
status: community
|
|
39
|
+
verified_on: 0.10.0 (CL 113109)
|
|
40
|
+
source: https://unknownworlds.com/en/news/subnautica-2-buddy-system-hotfix-1 ("Subnautica 2 Early
|
|
41
|
+
Access Buddy System Hotfix 1", dated 09.01.26), read first-hand 2026-09-11; the advisory
|
|
42
|
+
appears in a dedicated section near the end of the article.
|
|
43
|
+
tags:
|
|
44
|
+
- official
|
|
45
|
+
- stance
|
|
46
|
+
- mods
|
|
47
|
+
- patch-notes
|
|
48
|
+
- compatibility
|
|
49
|
+
- breakage
|
|
50
|
+
detail: "The passage continues that community mods will not be updated for compatibility with the
|
|
51
|
+
hotfix and may cause crashes on launch, and that players can re-enable them once mod creators
|
|
52
|
+
have updated. Read it as a crash-avoidance advisory, NOT an anti-mod or anti-cheat statement:
|
|
53
|
+
it assumes a mod scene exists and that mod authors will ship compatibility updates. It also
|
|
54
|
+
confirms from the developer's own mouth that mods break on every patch, which with a roughly
|
|
55
|
+
six-week update cadence (subnautica2.game.release-cadence-and-current-build) is the steady
|
|
56
|
+
state rather than an exception — a compat rule should treat it as `warn`, not `block`. Note
|
|
57
|
+
the advisory is not universal: the EA 1.2 \"Buddy System\" feature post (2026-08-19) mentions
|
|
58
|
+
mods nowhere."
|
|
59
|
+
- id: subnautica2.modding.community-org-and-modkit
|
|
60
|
+
claim: An unofficial modding organisation, `Subnautica2Modding` (distinct from the first game's
|
|
61
|
+
`SubnauticaModding`), formed at launch and maintains an unofficial modkit —
|
|
62
|
+
`Subnautica2Modding/Subnautica2-Project`, MIT licensed, built on a custom build of Unreal
|
|
63
|
+
Engine 5.6 about 10 GB smaller than stock, needing roughly 60 GB on disk. Last updated
|
|
64
|
+
2026-09-07.
|
|
65
|
+
status: community
|
|
66
|
+
verified_on: 0.10.0 (CL 113109)
|
|
67
|
+
source: https://github.com/Subnautica2Modding/Subnautica2-Project (README and repository metadata),
|
|
68
|
+
read first-hand 2026-09-11
|
|
69
|
+
tags:
|
|
70
|
+
- modkit
|
|
71
|
+
- community
|
|
72
|
+
- unofficial
|
|
73
|
+
- editor
|
|
74
|
+
- ue5.6
|
|
75
|
+
- authoring
|
|
76
|
+
detail: "The modkit contains NO game source: verbatim, \"All code that exists in the project are
|
|
77
|
+
'stubs'—dummy code that defines the signature of game code\", and it loads the user's own
|
|
78
|
+
installed cooked assets read-only, so it requires the game installed. Its companion
|
|
79
|
+
documentation site is https://subnautica2modding.github.io/ (\"This site provides guides,
|
|
80
|
+
references, and tutorials for creating mods for Subnautica 2\", last updated 2026-06-08),
|
|
81
|
+
which documents four mod types — Lua, C++/scripting, asset replacement and blueprint script —
|
|
82
|
+
and names UE4SS, FModel, Visual Studio, VS Code, Git, Unreal Engine and Rust as the toolchain.
|
|
83
|
+
The Subnautica 2 modding Discord invite is the same as the first game's, so the two
|
|
84
|
+
communities share a server."
|
|
85
|
+
- id: subnautica2.modding.two-mod-paths-one-needs-no-loader
|
|
86
|
+
claim: The modkit offers two mod paths. Blueprint mods are packaged as pak chunks and REQUIRE an
|
|
87
|
+
external loader such as UE4SS. Plugin mods (content-only DLC plugins) are "installed to a
|
|
88
|
+
location in the game that the engine will load without any external/third party mod loader
|
|
89
|
+
required".
|
|
90
|
+
status: community
|
|
91
|
+
verified_on: 0.10.0 (CL 113109)
|
|
92
|
+
source: https://github.com/Subnautica2Modding/Subnautica2-Project README, read first-hand 2026-09-11
|
|
93
|
+
tags:
|
|
94
|
+
- modkit
|
|
95
|
+
- blueprint
|
|
96
|
+
- plugin
|
|
97
|
+
- dlc
|
|
98
|
+
- loader
|
|
99
|
+
- anticheat
|
|
100
|
+
- strategy
|
|
101
|
+
detail: "The loader-free plugin-mod path is the strategically important one: with no DLL injection
|
|
102
|
+
it side-steps both the unresolved anti-cheat question
|
|
103
|
+
(subnautica2.game.eos-anticheat-present-but-not-engaged) and UE4SS's rolling-prerelease
|
|
104
|
+
version problem (subnautica2.ue4ss.ue56-only-in-experimental). It covers items, crafting
|
|
105
|
+
recipes, biomods, scannables, buildings, databank entries and story goals — i.e. data-asset
|
|
106
|
+
content rather than new logic. Blueprint mods cover custom fauna, flora, biomes, items and
|
|
107
|
+
recipes, and are packaged with a plugin called SN2 Mod Tools; plugin mods are packaged with
|
|
108
|
+
Alpakit."
|
|
109
|
+
- id: subnautica2.modding.logicmods-is-folder-per-mod
|
|
110
|
+
claim: Subnautica 2's blueprint mods install as one FOLDER per mod under
|
|
111
|
+
`<install>\Subnautica2\Subnautica2\Content\Paks\LogicMods\`, containing the full IoStore
|
|
112
|
+
triplet named after the folder — `MyMod.pak`, `MyMod.utoc` and `MyMod.ucas`. Plugin mods
|
|
113
|
+
install to `Mods/` under the game directory.
|
|
114
|
+
status: community
|
|
115
|
+
verified_on: 0.10.0 (CL 113109)
|
|
116
|
+
source: https://github.com/Subnautica2Modding/Subnautica2-Project README, read first-hand 2026-09-11
|
|
117
|
+
— verbatim, "Navigate to `<steam install>\Subnautica2\Subnautica2\Content\Paks\LogicMods\` and
|
|
118
|
+
create a folder for your mod", with packaged file names required to match the mod folder name.
|
|
119
|
+
tags:
|
|
120
|
+
- logicmods
|
|
121
|
+
- paths
|
|
122
|
+
- modroot
|
|
123
|
+
- triplet
|
|
124
|
+
- iostore
|
|
125
|
+
- layout
|
|
126
|
+
- deploy
|
|
127
|
+
detail: "This differs from the generic UE4SS description of LogicMods, which has bare `.pak` files
|
|
128
|
+
sitting directly in the directory (subnautica2.ue4ss.logicmods-blueprint-path) — the
|
|
129
|
+
folder-per-mod shape and the full triplet are a Subnautica 2 specific, and follow from the
|
|
130
|
+
game being IoStore-only. Two validator rules fall straight out: the triplet must be complete
|
|
131
|
+
(a missing `.ucas` is a silent no-op) and the file basenames must equal the folder name. One
|
|
132
|
+
caveat to carry: the README writes the plugin-mod path as `<game install dir>/Subnautica
|
|
133
|
+
2/Mods/` with a space, while every path observed in the game's own log spells it `Subnautica2`
|
|
134
|
+
with none; treat that segment as unconfirmed until checked on a real install."
|
|
135
|
+
- id: subnautica2.modding.ue4ss-fork-archived-upstream-covers-it
|
|
136
|
+
claim: A game-specific UE4SS fork, `Subnautica2Modding/Subnautica2-UE4SS`, shipped within weeks of
|
|
137
|
+
launch (1.0.0-pre.1 on 2026-05-09, 1.0.0 on 2026-05-27) and was then ARCHIVED on 2026-06-10,
|
|
138
|
+
its release note saying the fork may no longer be necessary and directing users to upstream
|
|
139
|
+
UE4SS.
|
|
140
|
+
status: community
|
|
141
|
+
verified_on: 0.10.0 (CL 113109)
|
|
142
|
+
source: https://github.com/Subnautica2Modding/Subnautica2-UE4SS and its releases, read 2026-09-11
|
|
143
|
+
tags:
|
|
144
|
+
- ue4ss
|
|
145
|
+
- fork
|
|
146
|
+
- archived
|
|
147
|
+
- loader
|
|
148
|
+
- upstream
|
|
149
|
+
- community
|
|
150
|
+
detail: "This is a positive signal, not abandonment: it means Subnautica 2 is covered by upstream
|
|
151
|
+
UE4SS with no game-specific fork to track. But \"upstream\" here means `experimental-latest`
|
|
152
|
+
specifically, since UE 5.6 support exists nowhere else
|
|
153
|
+
(subnautica2.ue4ss.ue56-only-in-experimental). Corroboration comes from an unrelated
|
|
154
|
+
direction: Nexus Mods' Vortex extension for the game routes UE4SS Lua mods to
|
|
155
|
+
`Binaries/Win64/ue4ss/Mods/`, which is the UE4SS EXPERIMENTAL install layout, not the stable
|
|
156
|
+
one (subnautica2.ue4ss.install-layout-stable-vs-experimental)."
|
|
157
|
+
- id: subnautica2.modding.distribution-channels
|
|
158
|
+
claim: Subnautica 2 mods are distributed on Nexus Mods (with a Vortex game extension) and CurseForge
|
|
159
|
+
(~100 projects). Thunderstore does NOT host a Subnautica 2 community, in contrast to the first
|
|
160
|
+
game.
|
|
161
|
+
status: community
|
|
162
|
+
verified_on: 0.10.0 (CL 113109)
|
|
163
|
+
source: Nexus support established WITHOUT fetching nexusmods.com, via
|
|
164
|
+
https://github.com/Nexus-Mods/game-subnautica2 ("Vortex 2.0+ game extension for Subnautica 2
|
|
165
|
+
(UE5 / UE4SS)", repo archived 2026-06-16); https://www.curseforge.com/subnautica-2 (categories
|
|
166
|
+
Mods, Blueprints, UE4SS Mods, Configs); https://thunderstore.io/c/subnautica-2/ returns 404
|
|
167
|
+
(confirmed negative). All read 2026-09-11.
|
|
168
|
+
tags:
|
|
169
|
+
- distribution
|
|
170
|
+
- nexus
|
|
171
|
+
- vortex
|
|
172
|
+
- curseforge
|
|
173
|
+
- thunderstore
|
|
174
|
+
- modio
|
|
175
|
+
detail: "The Vortex extension is also a useful source for install paths, since it must know them:
|
|
176
|
+
pak mods → `Content/Paks/`, LogicMods → `Content/Paks/LogicMods/`, UE4SS Lua →
|
|
177
|
+
`Binaries/Win64/ue4ss/Mods/`, IoStore `.utoc`/`.ucas` → `Content/Paks/`, plus root and
|
|
178
|
+
Content/Config folder mods. It auto-discovers Steam app 1962700, an Epic catalog item, and
|
|
179
|
+
Xbox/Game Pass — and records that Xbox builds use `WinGDK` in place of `Win64` in the binaries
|
|
180
|
+
path. No mod.io integration was found for this game, consistent with the shipping build making
|
|
181
|
+
no `api.mod.io` requests (subnautica2.modding.no-official-mod-support-announced)."
|
|
182
|
+
- id: subnautica2.modding.nothing-transfers-from-subnautica-1
|
|
183
|
+
claim: Nothing mechanical transfers from the first Subnautica's modding model. The original is
|
|
184
|
+
Unity/Mono, loaded by BepInEx 5 with Nautilus as the modding API; the sequel is Unreal Engine
|
|
185
|
+
5.6.1 with UE4SS or loader-free DLC plugins. The only thing the two share is the community and
|
|
186
|
+
its Discord.
|
|
187
|
+
status: community
|
|
188
|
+
verified_on: 0.10.0 (CL 113109)
|
|
189
|
+
source: "Subnautica 1 side, all read 2026-09-11: Tobey's BepInEx Pack
|
|
190
|
+
(https://github.com/toebeann/BepInEx.Subnautica, latest v5.4.23-pack.3.1.1, 2025-05-26,
|
|
191
|
+
bundling BepInEx 5.4.23.5 — the Mono line; BepInEx 6 is the IL2CPP line); Nautilus
|
|
192
|
+
(https://github.com/SubnauticaModding/Nautilus, \"a continuation of SMLHelper with an improved
|
|
193
|
+
codebase\"); QModManager (https://github.com/SubnauticaModding/QModManager, final release
|
|
194
|
+
4.4.4 on 2024-10-31, repo archived 2026-05-13, \"QModManager is no longer supported. We're
|
|
195
|
+
migrating to BepInEx.\")."
|
|
196
|
+
tags:
|
|
197
|
+
- subnautica1
|
|
198
|
+
- bepinex
|
|
199
|
+
- nautilus
|
|
200
|
+
- qmodmanager
|
|
201
|
+
- contrast
|
|
202
|
+
- unity
|
|
203
|
+
detail: Two premises worth correcting because they circulate widely. First,
|
|
204
|
+
`subnauticamodding.github.io` is NOT a wiki — its root is a 404 and the domain hosts the
|
|
205
|
+
Nautilus docfx API docs at `/Nautilus/` (working entry point
|
|
206
|
+
`/Nautilus/guides/dev-setup.html`); the Subnautica Modding wiki is at
|
|
207
|
+
subnauticamodding.wiki.gg. Second, `mod.json` is not a BepInEx concept — it belongs to the
|
|
208
|
+
archived QModManager, and a modern Subnautica 1 mod has no manifest file at all, taking its
|
|
209
|
+
identity from the `[BepInPlugin]` attribute on a DLL in `Subnautica\BepInEx\plugins\`. Do not
|
|
210
|
+
let the shared franchise name imply shared mechanics.
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
game: subnautica2
|
|
2
|
+
topic: ue5.containers
|
|
3
|
+
title: what a packed Unreal container reveals from its header and footer alone
|
|
4
|
+
facts:
|
|
5
|
+
- id: subnautica2.ue5.pak-footer-and-index-head
|
|
6
|
+
claim: A legacy `.pak` ends with a footer whose fixed core is, in order, the little-endian magic
|
|
7
|
+
0x5A6F12E1, the version major (u32, 1 to 11), the index offset (u64), the index size (u64) and
|
|
8
|
+
a 20-byte hash; version 4 and up put an `encrypted` byte before the magic, 7 and up a 16-byte
|
|
9
|
+
encryption key GUID before that, 9 adds a `frozen` byte after the hash, and 8 and up append
|
|
10
|
+
four (8A) or five (8B and later) 32-byte compression-method names. The index the footer points
|
|
11
|
+
at begins with the mount point as an Unreal FString, so the mount point is readable without
|
|
12
|
+
unpacking anything unless the index is encrypted.
|
|
13
|
+
status: community
|
|
14
|
+
source: repak/src/footer.rs `Footer::read` (the field order and the version-gated fields);
|
|
15
|
+
repak/src/lib.rs `Version::size()` (the same arithmetic) and `VersionMajor` (Unknown 0 ..
|
|
16
|
+
Fnv64BugFix 11); repak/src/pak.rs `Index::read` — `let mount_point = index.read_string()?` as
|
|
17
|
+
the first read after seeking to `footer.index_offset`
|
|
18
|
+
tags:
|
|
19
|
+
- pak
|
|
20
|
+
- footer
|
|
21
|
+
- magic
|
|
22
|
+
- version
|
|
23
|
+
- index
|
|
24
|
+
- mount-point
|
|
25
|
+
- repak
|
|
26
|
+
- format
|
|
27
|
+
- validator
|
|
28
|
+
detail: "`src/surfaces/subnautica2/paks.ts` scans the last 256 bytes for the magic and validates the
|
|
29
|
+
index bounds behind it rather than trial-reading each version's footer size as repak does; the
|
|
30
|
+
effect is the same. `subnautica2.paks.mount-point` compares the string it finds with
|
|
31
|
+
`../../../` (`subnautica2.game.pak-mount-point`)."
|
|
32
|
+
related:
|
|
33
|
+
- subnautica2.game.pak-mount-point
|
|
34
|
+
- subnautica2.ue5.repak-is-legacy-pak-only
|
|
35
|
+
- id: subnautica2.ue5.fstring-encoding
|
|
36
|
+
claim: "An Unreal FString on disk is an i32 length followed by the characters: a positive length
|
|
37
|
+
means that many single-byte characters including a terminating NUL, a negative length means
|
|
38
|
+
that many UTF-16LE code units including the terminator."
|
|
39
|
+
status: community
|
|
40
|
+
source: repak/src/ext.rs `read_string` — `let len = self.read_i32::<LE>()?; if len < 0 { ...
|
|
41
|
+
read_u16 ... String::from_utf16 } else { ... }`
|
|
42
|
+
tags:
|
|
43
|
+
- fstring
|
|
44
|
+
- encoding
|
|
45
|
+
- utf16
|
|
46
|
+
- pak
|
|
47
|
+
- format
|
|
48
|
+
- id: subnautica2.ue5.utoc-header
|
|
49
|
+
claim: An IoStore `.utoc` begins with the 16-byte magic `-==--==--==--==-`, then the TOC version as
|
|
50
|
+
one byte (Invalid 0, Initial 1, DirectoryIndex 2, PartitionSize 3, PerfectHash 4,
|
|
51
|
+
PerfectHashWithOverflow 5, OnDemandMetaData 6, RemovedOnDemandMetaData 7,
|
|
52
|
+
ReplaceIoChunkHashWithIoHash 8), three reserved bytes, the header size (u32) and the TOC entry
|
|
53
|
+
count (u32), all little-endian.
|
|
54
|
+
status: community
|
|
55
|
+
source: 'retoc src/lib.rs — `struct FIoStoreTocHeader { toc_magic: [u8; 16], version:
|
|
56
|
+
EIoStoreTocVersion, reserved0: u8, reserved1: u16, toc_header_size: u32, toc_entry_count: u32,
|
|
57
|
+
... }`, `const MAGIC: [u8; 16] = *b"-==--==--==--==-"`, and the `EIoStoreTocVersion` enum in
|
|
58
|
+
declaration order'
|
|
59
|
+
tags:
|
|
60
|
+
- utoc
|
|
61
|
+
- iostore
|
|
62
|
+
- toc
|
|
63
|
+
- magic
|
|
64
|
+
- version
|
|
65
|
+
- retoc
|
|
66
|
+
- format
|
|
67
|
+
- validator
|
|
68
|
+
detail: Enough for `subnautica2.utoc.header` to tell a container from a renamed file and to notice
|
|
69
|
+
an empty one; which TOC version the 5.6.1 launch build writes has not been read from disk (the
|
|
70
|
+
game is not installed here), so the rule accepts any non-zero version.
|
|
71
|
+
related:
|
|
72
|
+
- subnautica2.ue5.iostore-utoc-ucas-split
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
game: subnautica2
|
|
2
|
+
topic: ue5.paks
|
|
3
|
+
title: Unreal Engine 5 packaging — paks, IoStore containers, load order, signing
|
|
4
|
+
facts:
|
|
5
|
+
- id: subnautica2.ue5.iostore-utoc-ucas-split
|
|
6
|
+
claim: With IoStore (the Zen Loader) enabled, UE5 packages all package data, bulk data and shader
|
|
7
|
+
data into `.utoc` + `.ucas` container pairs. The `.utoc` describes the container — chunk size
|
|
8
|
+
and offset, compression format, and whether chunks are encrypted — and the `.ucas` holds the
|
|
9
|
+
actual data.
|
|
10
|
+
status: community
|
|
11
|
+
source: https://dev.epicgames.com/documentation/en-us/unreal-engine/zen-loader-in-unreal-engine
|
|
12
|
+
("Zen Loader in Unreal Engine"), read 2026-09-11
|
|
13
|
+
tags:
|
|
14
|
+
- iostore
|
|
15
|
+
- zen
|
|
16
|
+
- utoc
|
|
17
|
+
- ucas
|
|
18
|
+
- packaging
|
|
19
|
+
- ue5
|
|
20
|
+
- generic
|
|
21
|
+
detail: "The same page documents that IoStore is switched off by setting the `bUseIoStore` boolean
|
|
22
|
+
to `False`. Practical consequence for modding: on a game shipped with IoStore, a mod that
|
|
23
|
+
provides only a legacy `.pak` for content the Zen Loader expects in a container will mount
|
|
24
|
+
without error and deliver nothing. Converting between the two forms is what `retoc` exists for
|
|
25
|
+
(subnautica2.ue5.retoc-to-zen-to-legacy)."
|
|
26
|
+
- id: subnautica2.ue5.cooked-asset-triplet
|
|
27
|
+
claim: A cooked UE asset is split across `.uasset` and possibly `.uexp` and `.ubulk` files, and all
|
|
28
|
+
of them must be copied together for the asset to work.
|
|
29
|
+
status: community
|
|
30
|
+
source: https://dev.epicgames.com/documentation/en-us/unreal-engine/working-with-cooked-content-in-the-unreal-engine
|
|
31
|
+
("Working with Cooked Content in the Unreal Engine"), read 2026-09-11
|
|
32
|
+
tags:
|
|
33
|
+
- cooked
|
|
34
|
+
- uasset
|
|
35
|
+
- uexp
|
|
36
|
+
- ubulk
|
|
37
|
+
- assets
|
|
38
|
+
- ue5
|
|
39
|
+
- generic
|
|
40
|
+
detail: "Epic states only *that* the split happens, and notes the page \"currently only applies to
|
|
41
|
+
content for the Windows platform\". What each file holds is NOT Epic-documented: the usual
|
|
42
|
+
breakdown — `.uasset` the package header, `.uexp` the serialized export data, `.ubulk`
|
|
43
|
+
streamable bulk data — comes from UEViewer's FAQ
|
|
44
|
+
(https://github.com/gildor2/UEViewer/blob/master/Docs/FAQ.md), which says the engine \"strips
|
|
45
|
+
package header (which is in .uasset) from data — which is in .uexp file\", and that bulk data
|
|
46
|
+
is \"stored either at the end of uasset file, or in separate ubulk file\". Cite that as
|
|
47
|
+
community, not Epic."
|
|
48
|
+
- id: subnautica2.ue5.patch-pak-p-suffix
|
|
49
|
+
claim: 'A `_p` suffix on a pak filename gives it mount priority over other paks. Epic documents
|
|
50
|
+
this: "To prioritize patches, the mounting system uses a `_p` at the end of the filename to
|
|
51
|
+
determine that it gets priority over other PAK files", and the file "can be renamed, but you
|
|
52
|
+
need to include the `_p.pak` at the end of the file name".'
|
|
53
|
+
status: community
|
|
54
|
+
source: https://dev.epicgames.com/documentation/unreal-engine/how-to-create-a-patch-in-unreal-engine
|
|
55
|
+
("How to Create a Patch in Unreal Engine"), read 2026-09-11
|
|
56
|
+
tags:
|
|
57
|
+
- pak
|
|
58
|
+
- load-order
|
|
59
|
+
- priority
|
|
60
|
+
- patch
|
|
61
|
+
- _p
|
|
62
|
+
- ue5
|
|
63
|
+
- generic
|
|
64
|
+
detail: The same page states a patch pak "will automatically be mounted when it is located on the
|
|
65
|
+
device in any of the PAK search directories set in `FPakPlatformFile::GetPakFolders`". This is
|
|
66
|
+
the one Epic-documented load priority mechanism and should be preferred in writing over the
|
|
67
|
+
`~mods` convention wherever both would work.
|
|
68
|
+
- id: subnautica2.ue5.tilde-mods-is-a-convention
|
|
69
|
+
claim: "`Content/Paks/~mods/` is a COMMUNITY convention, not an Epic feature. Epic documents no
|
|
70
|
+
`~mods` folder anywhere. It works only because `~` sorts late in the alphabetical scan of the
|
|
71
|
+
pak search directories, so paks there mount later and win — the same ordering mechanism the
|
|
72
|
+
documented `_p` suffix exploits by a different route."
|
|
73
|
+
status: community
|
|
74
|
+
source: 'Negative result: searching dev.epicgames.com for "~mods" returns nothing (checked
|
|
75
|
+
2026-09-11). The mechanism is Epic-documented at
|
|
76
|
+
https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Runtime/PakFile/FPakPlatformFile
|
|
77
|
+
(`GetPakFolders`, `GetPakOrderFromPakFilePath`, `Mount`), read 2026-09-11.'
|
|
78
|
+
tags:
|
|
79
|
+
- tilde-mods
|
|
80
|
+
- load-order
|
|
81
|
+
- convention
|
|
82
|
+
- pak
|
|
83
|
+
- ue5
|
|
84
|
+
- generic
|
|
85
|
+
- caveat
|
|
86
|
+
detail: "Within `~mods`, ordering is by filename and later wins. Because it is a convention rather
|
|
87
|
+
than a feature, whether any particular game honours it must be confirmed per game rather than
|
|
88
|
+
assumed — for Subnautica 2 that is an open question: the game's own unofficial modkit routes
|
|
89
|
+
mods to `Content/Paks/LogicMods/` and `Mods/` and never mentions `~mods`."
|
|
90
|
+
- id: subnautica2.ue5.mount-order-and-mount-point
|
|
91
|
+
claim: "`FPakPlatformFile::Mount(InPakFilename, PakOrder, InPath, ...)` takes a mount priority
|
|
92
|
+
(`PakOrder`) and a mount point (`InPath`, \"Path to mount the pak at\"). The engine's built-in
|
|
93
|
+
default ordering is, per its own doc comment, \"game main pak -> game content -> engine
|
|
94
|
+
content -> saved dir\"."
|
|
95
|
+
status: community
|
|
96
|
+
source: https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Runtime/PakFile/FPakPlatformFile
|
|
97
|
+
(`Mount`, `GetPakOrderFromPakFilePath`), read 2026-09-11
|
|
98
|
+
tags:
|
|
99
|
+
- mount
|
|
100
|
+
- mount-point
|
|
101
|
+
- load-order
|
|
102
|
+
- pak
|
|
103
|
+
- ue5
|
|
104
|
+
- generic
|
|
105
|
+
detail: "The mount point is the load-bearing part for mod authoring: a pak built with the wrong
|
|
106
|
+
mount point mounts cleanly and resolves its files to the wrong virtual paths, so nothing in it
|
|
107
|
+
is ever found and nothing is logged. The engine-root-relative `../../../` is the usual correct
|
|
108
|
+
value for game content and is also `repak`'s default
|
|
109
|
+
(subnautica2.ue5.repak-is-legacy-pak-only). Epic's API doc adds that in most cases `Mount`
|
|
110
|
+
\"should not be called directly. Instead use the mounting delegates in `FCoreDelegates`.\""
|
|
111
|
+
- id: subnautica2.ue5.pak-signing-and-encryption-settings
|
|
112
|
+
claim: 'Pak signing and encryption are project settings, exposed by `UCryptoKeysSettings`:
|
|
113
|
+
`bEnablePakSigning` ("Enable signing of pak files, to prevent tampering of the data"),
|
|
114
|
+
`bEncryptPakIndex`, `bEncryptUAssetFiles`, `bEncryptAllAssetFiles`, `EncryptionKey`, and the
|
|
115
|
+
RSA `SigningModulus` / `SigningPrivateExponent` / `SigningPublicExponent`.'
|
|
116
|
+
status: community
|
|
117
|
+
source: https://dev.epicgames.com/documentation/unreal-engine/API/Plugins/CryptoKeys/UCryptoKeysSettings,
|
|
118
|
+
read 2026-09-11; `FPakSignatureFile` ("Structure which describes the content of the pak `.sig`
|
|
119
|
+
files") at
|
|
120
|
+
https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Runtime/PakFile/FPakSignatureFile
|
|
121
|
+
tags:
|
|
122
|
+
- signing
|
|
123
|
+
- encryption
|
|
124
|
+
- crypto
|
|
125
|
+
- sig
|
|
126
|
+
- security
|
|
127
|
+
- ue5
|
|
128
|
+
- generic
|
|
129
|
+
detail: When signing is on, the build emits `.sig` files holding SHA1 chunk hashes and an RSA
|
|
130
|
+
signature, and a mod pak that does not satisfy them is rejected — the most likely hard blocker
|
|
131
|
+
to pak modding on any given title. Runtime AES keys are registered through
|
|
132
|
+
`FPakPlatformFile::RegisterEncryptionKey`. Note that `crypto.json` and UnrealPak's
|
|
133
|
+
`-cryptokeys=` flag, which every tooling guide uses, are community-documented and appear
|
|
134
|
+
nowhere in Epic's docs. An all-zero `SignatureHash` in the log's TOC line is how an unsigned
|
|
135
|
+
container presents.
|
|
136
|
+
- id: subnautica2.ue5.log-location-and-verbosity-ladder
|
|
137
|
+
claim: A UE game writes its logs to `<Project>/Saved/Logs`, keeping previous sessions alongside the
|
|
138
|
+
current one. The verbosity ladder is Fatal, Error, Warning, Display, Log, Verbose,
|
|
139
|
+
VeryVerbose; Display goes to console and file, `Log` goes only to the log file, and
|
|
140
|
+
Verbose/VeryVerbose only when explicitly enabled.
|
|
141
|
+
status: community
|
|
142
|
+
source: https://dev.epicgames.com/documentation/en-us/unreal-engine/logging-in-unreal-engine
|
|
143
|
+
("Logging in Unreal Engine"), read 2026-09-11
|
|
144
|
+
tags:
|
|
145
|
+
- logs
|
|
146
|
+
- saved
|
|
147
|
+
- verbosity
|
|
148
|
+
- ue5
|
|
149
|
+
- generic
|
|
150
|
+
- triage
|
|
151
|
+
detail: For a packaged Windows game the directory resolves under
|
|
152
|
+
`%LOCALAPPDATA%\<ProjectName>\Saved\Logs`. Epic documents the location and the ladder but
|
|
153
|
+
neither the log line format nor the backup filename pattern — see
|
|
154
|
+
subnautica2.ue5.log-line-format.
|
|
155
|
+
- id: subnautica2.ue5.log-line-format
|
|
156
|
+
claim: "UE log lines are `[YYYY.MM.DD-HH.MM.SS:mmm][frame]LogCategory: Verbosity: message`, with the
|
|
157
|
+
frame counter space-padded to three columns — but the verbosity token is OMITTED for the
|
|
158
|
+
default `Log` level, and the whole bracketed prefix can be absent."
|
|
159
|
+
status: community
|
|
160
|
+
source: "Format not documented by Epic. Line shape from
|
|
161
|
+
https://nerivec.github.io/old-ue4-wiki/pages/logs-printing-messages-to-yourself-during-runtim\
|
|
162
|
+
e.html and from real logs; the omitted-verbosity and absent-prefix cases were both observed
|
|
163
|
+
directly (a real Epic-hosted UE 5.3 Lyra log has every line bare, e.g. `LogInit: Display:
|
|
164
|
+
Running engine for game: LyraStarterGame`, under a `Log file open, 09/15/23 23:30:49` header).
|
|
165
|
+
Read 2026-09-11."
|
|
166
|
+
tags:
|
|
167
|
+
- logs
|
|
168
|
+
- format
|
|
169
|
+
- parsing
|
|
170
|
+
- gotcha
|
|
171
|
+
- ue5
|
|
172
|
+
- generic
|
|
173
|
+
- signatures
|
|
174
|
+
detail: "Both exceptions are traps for a signature classifier. A pattern requiring `Category:
|
|
175
|
+
Verbosity:` misses every default-level line, which is most of them; a pattern anchored on a
|
|
176
|
+
timestamp misses any unprefixed line. The prefix is suppressed by `-NoLogTimes`, and is also
|
|
177
|
+
simply absent from the head of a real shipping log before the timestamped logger starts — on
|
|
178
|
+
Subnautica 2 that is the first ~520 lines, which is exactly where the pak mounts and plugin
|
|
179
|
+
list are (subnautica2.game.log-head-has-no-timestamps). ModWright's existing `PRE`
|
|
180
|
+
construction in src/surfaces/cyberpunk2077/logs.ts — zero or more optional bracketed fields,
|
|
181
|
+
anchored to line start — handles both cases."
|
|
182
|
+
- id: subnautica2.ue5.log-backup-filename-stamp-order
|
|
183
|
+
claim: A UE game rotates the previous session's log to
|
|
184
|
+
`<ProjectName>-backup-YYYY.MM.DD-HH.MM.SS.log` in the same `Saved/Logs` directory — year, then
|
|
185
|
+
MONTH, then day.
|
|
186
|
+
status: community
|
|
187
|
+
verified_on: 0.10.0 (CL 113109)
|
|
188
|
+
source: "Not documented by Epic; community sources disagree, with at least one rendering the pattern
|
|
189
|
+
day-before-month. Settled empirically against real files: a Subnautica 2 session on 14 May
|
|
190
|
+
2026 produced `Subnautica2-backup-2026.05.14-17.45.04.log` (local artifacts 2026-09-11), which
|
|
191
|
+
is unambiguous because 14 cannot be a month."
|
|
192
|
+
tags:
|
|
193
|
+
- logs
|
|
194
|
+
- rotation
|
|
195
|
+
- backup
|
|
196
|
+
- filename
|
|
197
|
+
- ue5
|
|
198
|
+
- generic
|
|
199
|
+
- triage
|
|
200
|
+
detail: One new file per launch, which means each run's log carries a fresh creation time —
|
|
201
|
+
friendlier to ModWright's offsetKeys-based incremental triage than a log truncated and
|
|
202
|
+
rewritten in place. The settings that control it, `bBackupLogFiles` and `LogFileBackupCount`,
|
|
203
|
+
are likewise community-sourced rather than Epic-documented.
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
game: subnautica2
|
|
2
|
+
topic: ue5.tooling
|
|
3
|
+
title: Unreal Engine 5 asset and packaging tooling — mappings, FModel, UAssetAPI, repak, retoc
|
|
4
|
+
facts:
|
|
5
|
+
- id: subnautica2.ue5.usmap-requires-a-running-game
|
|
6
|
+
claim: UE5 cooks properties unversioned, so a cooked asset carries no property names or types and
|
|
7
|
+
cannot be deserialized without a `.usmap` mappings file supplying the reflection schema. Every
|
|
8
|
+
route to a `.usmap` for a game that ships without one runs a dumper against the LIVE process.
|
|
9
|
+
status: community
|
|
10
|
+
source: "Dumpers: UE4SS (https://docs.ue4ss.com/dev/feature-overview/dumpers.html, `Ctrl + Numpad
|
|
11
|
+
6`), Dumper-7, and UnrealMappingsDumper (\"A dumper that generates mappings (.usmap) files for
|
|
12
|
+
datamining Unreal Engine games\", https://github.com/TheNaeem/UnrealMappingsDumper). The
|
|
13
|
+
consuming requirement is stated by UAssetAPI (\"Reading capability for the unofficial `.usmap`
|
|
14
|
+
format to parse ambiguous and unversioned properties\", https://github.com/atenfyr/UAssetAPI)
|
|
15
|
+
and by FModel's Local Mapping File setting. All read 2026-09-11."
|
|
16
|
+
tags:
|
|
17
|
+
- usmap
|
|
18
|
+
- mappings
|
|
19
|
+
- unversioned
|
|
20
|
+
- assets
|
|
21
|
+
- blocker
|
|
22
|
+
- ue5
|
|
23
|
+
- generic
|
|
24
|
+
detail: "This is the hard dependency that decides what can be built for a UE5 game WITHOUT the game
|
|
25
|
+
installed: nothing at asset level. Log parsing, packaging-shape validators, install detection,
|
|
26
|
+
tool location and load-order parsing all work from documentation and filesystem shape; asset
|
|
27
|
+
conversion, a deep index and any asset-content validator do not, because they need mappings,
|
|
28
|
+
which need a running game. The newest mappings format version referenced in tooling is v4
|
|
29
|
+
(`ExplicitEnumValues`). A mappings file older than the installed game build is the standard
|
|
30
|
+
cause of garbage-looking property names."
|
|
31
|
+
- id: subnautica2.ue5.fmodel-is-a-gui
|
|
32
|
+
claim: FModel is "an archive explorer for Unreal Engine games that uses CUE4Parse as its core
|
|
33
|
+
parsing library" — a C#/.NET WPF desktop application with no documented CLI. Latest release is
|
|
34
|
+
"FModel Aug 2026" (tag `aug-2026`), published 2026-08-02.
|
|
35
|
+
status: community
|
|
36
|
+
source: https://github.com/4sval/FModel (README) and its releases, read 2026-09-11. Note fmodel.app
|
|
37
|
+
returns HTTP 403 to automated fetches, so everything here is from the repository, its wiki and
|
|
38
|
+
the releases feed.
|
|
39
|
+
tags:
|
|
40
|
+
- fmodel
|
|
41
|
+
- gui
|
|
42
|
+
- browsing
|
|
43
|
+
- cue4parse
|
|
44
|
+
- tooling
|
|
45
|
+
- ue5
|
|
46
|
+
- generic
|
|
47
|
+
detail: "Being a GUI is the operative fact for ModWright: `ToolSpec` in src/core/toolchain/specs.ts
|
|
48
|
+
exists for CLIs the server shells out to, so FModel belongs in a surface's `guidance` as the
|
|
49
|
+
human's browsing tool, the same way WolvenKit's GUI is not a spec while WolvenKit.CLI is. Two
|
|
50
|
+
settings matter to anyone using it: the mappings file goes in Settings → General → \"Local
|
|
51
|
+
Mapping File\", and the UE Version setting is described by FModel's own wiki as \"the most
|
|
52
|
+
important setting of all\" — a wrong value produces archive and package errors that look like
|
|
53
|
+
corruption. AES keys go under Directory → AES. It exports meshes as PSK/PSKX, glTF and
|
|
54
|
+
UEFormat, textures as PNG/TGA/WebP, plus raw data and JSON. The project moved from semver
|
|
55
|
+
(last was v4.4.4, 2024-10-20) to date-named releases."
|
|
56
|
+
- id: subnautica2.ue5.uassetapi-json-round-trip
|
|
57
|
+
claim: UAssetAPI provides "JSON export and import to a proprietary format that maintains binary
|
|
58
|
+
equality" — the Unreal analogue of WolvenKit's cr2w↔json round trip, with a stronger
|
|
59
|
+
guarantee. Engine support spans roughly UE 4.13 to 5.7, so UE 5.6 is covered. Latest release
|
|
60
|
+
v1.1.0, 2026-05-01.
|
|
61
|
+
status: community
|
|
62
|
+
source: https://github.com/atenfyr/UAssetAPI (README) and
|
|
63
|
+
https://github.com/atenfyr/UAssetGUI/releases/tag/v1.1.0, read 2026-09-11
|
|
64
|
+
tags:
|
|
65
|
+
- uassetapi
|
|
66
|
+
- uassetgui
|
|
67
|
+
- json
|
|
68
|
+
- roundtrip
|
|
69
|
+
- converter
|
|
70
|
+
- ue5
|
|
71
|
+
- generic
|
|
72
|
+
detail: "Binary equality is a stronger promise than ModWright's existing converters make, and it
|
|
73
|
+
fits core/text's round-trip verification model directly. The v1.1.0 notes add two things that
|
|
74
|
+
matter: UE 5.6 and 5.7 support, and \"support for opening and saving .utoc/.ucas containers
|
|
75
|
+
directly in UAssetGUI through built-in integration with retoc\" — so the GUI can now
|
|
76
|
+
round-trip IoStore containers without a separate retoc invocation. Also added `.usmap` v4
|
|
77
|
+
support. UAssetGUI is the hand-editing front end, \"A tool designed for low-level examination
|
|
78
|
+
and modification of Unreal Engine game assets by hand\", with a CLI alongside the GUI."
|
|
79
|
+
- id: subnautica2.ue5.no-node-path-for-ue-assets
|
|
80
|
+
claim: There is no Node or TypeScript path for reading and writing UE5 cooked assets. UAssetAPI is
|
|
81
|
+
.NET ("A low-level .NET library for reading and writing Unreal Engine game assets"), UAssetGUI
|
|
82
|
+
needs the .NET 10 SDK to build, CUE4Parse (FModel's engine) is also C#, and repak and retoc
|
|
83
|
+
are Rust. Any ModWright converter must shell out to an external binary.
|
|
84
|
+
status: community
|
|
85
|
+
source: https://github.com/atenfyr/UAssetAPI, https://github.com/atenfyr/UAssetGUI (build
|
|
86
|
+
requirements), https://github.com/4sval/FModel, https://github.com/trumank/repak,
|
|
87
|
+
https://github.com/trumank/retoc — all read 2026-09-11
|
|
88
|
+
tags:
|
|
89
|
+
- node
|
|
90
|
+
- dotnet
|
|
91
|
+
- rust
|
|
92
|
+
- converter
|
|
93
|
+
- architecture
|
|
94
|
+
- ue5
|
|
95
|
+
- generic
|
|
96
|
+
detail: "Not a problem architecturally: it is exactly how the two shipped surfaces already work,
|
|
97
|
+
shelling out to divine.exe and WolvenKit.CLI.exe through core/toolchain. The one genuinely new
|
|
98
|
+
wrinkle relative to those is that a UE converter takes a `.usmap` mappings file as a required
|
|
99
|
+
INPUT, so the registry entry needs a mappings path and a missing or stale mappings file must
|
|
100
|
+
be a first-class error rather than a silent misparse."
|
|
101
|
+
- id: subnautica2.ue5.repak-is-legacy-pak-only
|
|
102
|
+
claim: repak is a Rust library and CLI for legacy `.pak` files only — it has NO IoStore support. It
|
|
103
|
+
handles pak versions 2 through 11, i.e. UE 4.0 through UE 5.3. Latest release v0.2.3,
|
|
104
|
+
2026-01-02.
|
|
105
|
+
status: community
|
|
106
|
+
source: https://github.com/trumank/repak (README, CLI subcommands and version table) and its
|
|
107
|
+
releases, read 2026-09-11
|
|
108
|
+
tags:
|
|
109
|
+
- repak
|
|
110
|
+
- pak
|
|
111
|
+
- rust
|
|
112
|
+
- packaging
|
|
113
|
+
- tooling
|
|
114
|
+
- ue5
|
|
115
|
+
- generic
|
|
116
|
+
- limitation
|
|
117
|
+
detail: Subcommands are `info`, `list`, `hash-list`, `unpack`, `pack` and `get`. It reads
|
|
118
|
+
Zlib/Gzip/Zstd but CANNOT write compressed paks, and can read but not write an encrypted index
|
|
119
|
+
(`-a/--aes-key`, base64 or hex). Its default mount point is `../../../`, which its README
|
|
120
|
+
explicitly contrasts with UnrealPak's default — convenient, since that is the correct value
|
|
121
|
+
for game content. On a UE 5.4+ IoStore game repak alone is insufficient and is only the
|
|
122
|
+
legacy-pak half of a repak+retoc pipeline. Its `list` output is the natural analogue of
|
|
123
|
+
Cyberpunk's resource listing for index building.
|
|
124
|
+
- id: subnautica2.ue5.retoc-to-zen-to-legacy
|
|
125
|
+
claim: 'retoc is the IoStore tool: "CLI tool for packing/unpacking Unreal Engine IoStore containers
|
|
126
|
+
(.utoc/.ucas) as well as converting between Zen assets and Legacy assets". `to-legacy`
|
|
127
|
+
converts Zen assets and shaders to a legacy `.pak`; `to-zen` converts the other way, which is
|
|
128
|
+
what produces something a UE 5.4+ IoStore game will actually mount. Latest release v0.1.5,
|
|
129
|
+
2026-01-02.'
|
|
130
|
+
status: community
|
|
131
|
+
source: https://github.com/trumank/retoc (README, subcommand list) and its releases, read 2026-09-11
|
|
132
|
+
tags:
|
|
133
|
+
- retoc
|
|
134
|
+
- iostore
|
|
135
|
+
- utoc
|
|
136
|
+
- ucas
|
|
137
|
+
- zen
|
|
138
|
+
- packaging
|
|
139
|
+
- tooling
|
|
140
|
+
- ue5
|
|
141
|
+
- generic
|
|
142
|
+
detail: The other subcommands are `manifest`, `info`, `list`, `verify`, `unpack`, `unpack-raw`,
|
|
143
|
+
`pack-raw`, `get`, `dump-test`, `gen-script-objects` and `print-script-objects`.
|
|
144
|
+
`gen-script-objects` matters because a Zen container must resolve its imports against the
|
|
145
|
+
game's script-object reflection table. Flags include `--aes-key`, `--version` (target engine,
|
|
146
|
+
e.g. `UE5_4`), `--override-container-header-version` and `--override-toc-version`. UE 5.3 and
|
|
147
|
+
newer are fully supported; earlier versions can produce incomplete dependency data. The
|
|
148
|
+
working pipeline for a modern IoStore game is therefore `retoc to-legacy` → edit via
|
|
149
|
+
UAssetAPI's JSON round trip → `retoc to-zen`.
|
|
150
|
+
- id: subnautica2.ue5.unrealpak-cannot-do-iostore
|
|
151
|
+
claim: UnrealPak, which ships with the engine, produces only legacy `.pak` files and neither reads
|
|
152
|
+
nor writes `.utoc`/`.ucas`; IoStore containers come from the separate `IoStoreUtilities` path
|
|
153
|
+
during staging. On an IoStore-only game it is not the packaging tool.
|
|
154
|
+
status: community
|
|
155
|
+
source: Epic documents only the entry point, `PakFileUtilities::ExecuteUnrealPak` ("Application
|
|
156
|
+
entry point") at
|
|
157
|
+
https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Developer/PakFileUtilities,
|
|
158
|
+
and the `IoStoreUtilities` module separately at
|
|
159
|
+
https://dev.epicgames.com/documentation/unreal-engine/API/Developer/IoStoreUtilities. Read
|
|
160
|
+
2026-09-11.
|
|
161
|
+
tags:
|
|
162
|
+
- unrealpak
|
|
163
|
+
- pak
|
|
164
|
+
- iostore
|
|
165
|
+
- packaging
|
|
166
|
+
- limitation
|
|
167
|
+
- ue5
|
|
168
|
+
- generic
|
|
169
|
+
detail: UnrealPak's flag list is NOT on Epic's documentation site; the commonly-cited transcription
|
|
170
|
+
of its `-help` output is from UE 4.22 and flags may have drifted. Response-file syntax is one
|
|
171
|
+
line per entry, `"<source path>" "<mounted path>" [-compress]`, invoked as `UnrealPak.exe
|
|
172
|
+
PakFile.pak -Create=ResponseFile.txt`. Do not write a ModWright ToolSpec `versionArgs` for it,
|
|
173
|
+
or for repak or retoc, on the strength of convention — src/core/toolchain/specs.ts's standing
|
|
174
|
+
rule is that a version flag is only recorded after it has been checked against the tool itself
|
|
175
|
+
or its own source.
|