Releases: slfx77/bethesda-multitool
Release list
v3.0.0-alpha.3
16 commits since v3.0.0-alpha.2 (2026-08-19 → 2026-08-21).
A small, corrective release. One user-facing fix — the 3D renderer would not start on Windows 10 — plus the repository hygiene behind it: continuous integration works again after months of red, and the test suite no longer depends on one developer's drive layout.
The Windows 10 fix
If the 3D viewer showed a blank panel and the log said D3D12 init failed, this release is the fix.
Device creation probed a single default adapter at a fixed feature level, which fails on Windows 10 for two independent reasons — either one alone was fatal:
- Older Windows 10 runtimes do not know the
12_2feature-level enum and reject it outright withE_INVALIDARG. D3D12CreateDevice(null, …)only ever probes the DEFAULT adapter, which on hybrid-graphics laptops is routinely an integrated GPU below feature level 12_0 — even with a perfectly capable discrete GPU installed.
Creation now walks the whole 12.x ladder (12_2 → 12_1 → 12_0), so an unknown feature level falls through like any other failure, and enumerates hardware adapters explicitly in best-first order — IDXGIFactory6 performance ordering where the OS provides it, plain DXGI order otherwise.
A new GpuAdapterPolicy decides how far the search goes. Under the default, the WARP software rasterizer is the last resort — feature level 12_1 on every supported Windows 10 build — so a machine with no 12_0-capable GPU renders slowly rather than not at all. That state is reported in the viewer rather than hidden, so a WARP session reads as "slow, and here is why" instead of looking like a fault.
When nothing works, every adapter probed is logged with the reason it was rejected, replacing a bare "init failed" with something diagnosable.
Please report back if this does or does not fix your machine. See Verification below for why.
Repository health
Not user-facing, but it is most of this release:
- CI had been failing since April. Four independent faults were stacked, each visible only once the one ahead of it cleared: real-asset tests running ungated; source-contract pins comparing LF marker strings against a CRLF checkout, so they passed locally and could only ever fail in CI; the SDK resolving to a release candidate that parses
dotnet testarguments differently from the GA SDK; and a test-count floor set to an exact local total CI could never reach. - CI could report a green run having built nothing. A shell block reports only its last command's exit code, so a failing build was swallowed and the resulting zero-test run slipped past the very guard meant to catch it — that guard is enforced by a test host that has to start first. Every command in that step is now exit-code checked.
- Retail assets are located, not hardcoded. 53 paths across 41 test files pointed at one machine's
E:\SteamLibrary. A shared locator now honoursBETHESDA_TEST_DATA_ROOT, then repo-relativeSample/, then every fixed drive's Steam library. - A real bug fell out of the analyzer pass: a vertex-cell hash packed three 21-bit integers into a 64-bit key but cast only two, so the third sign-extended through the upper bits and collided cells with a negative Z.
Known limitations
Unchanged from alpha.2 — Starfield normal maps unwired, Fallout 76 map markers missing, decode is read-only with no schema writer, DMP→ESM output limited by capture completeness. See the alpha.2 notes for the full list.
Verification
Build: 0 warnings, 0 errors across both target frameworks and all companion apps. Tests: 8,167 passing, 0 failing in the main suite, plus 63 and 217 in the auxiliary suites — all three verified green in CI, per project.
One honest caveat on the headline fix. The device-creation paths that actually failed — 12_2 rejected, default adapter below 12_0, WARP engaging — need a real Direct3D device to exercise and sit behind an opt-in gate CI does not set. The policy layer is unit-tested; the ladder itself is verified by the renderer starting on a real Windows 10 machine, not by the suite. Treat this fix as tested-by-hand.
Downloads
| Artifact | Contents |
|---|---|
BethesdaMultitool-Windows-GUI-x64.zip |
WinUI 3 desktop app, self-contained |
BethesdaMultitool-Windows-CLI-x64.zip |
Command-line tool, self-contained |
BethesdaMultitool-Linux-CLI-x64.tar.gz |
Command-line tool, self-contained |
BethesdaAudioTranscriber-Windows-x64.zip |
Companion transcriber app |
All builds are self-contained — no .NET runtime install required.
The full entry is in CHANGELOG.md.
v3.0.0-alpha.2
588 commits since v3.0.0-alpha.1 (2026-06-02 → 2026-08-19).
The short version: the tool stopped being a Fallout New Vegas utility and became a Bethesda one. Record reading now spans Morrowind through Starfield, the 3D viewer moved to D3D12 and grew an engine-grounded lighting and water stack, and a texture-decoding bug that had been silently corrupting roughly a fifth of all converted textures was found and fixed.
Still an alpha — see Known limitations near the bottom before relying on any output.
Highlights
Multi-game record reading
Record and subrecord decoding extended from Fallout 3 / New Vegas to Oblivion (TES4), Morrowind (TES3), Skyrim LE, Fallout 4, Fallout 76, and Starfield. Rather than hand-writing a decoder per game, tools/EsmSchemaGen generates per-game C# schemas from xEdit's wbDefinitions*.pas, so a new game is a regeneration rather than a rewrite.
Records, dialogue, and NPC/armor/weapon/quest/package displays are wired for every supported game, with localized string tables (.STRINGS, and BA2-localized for Fallout 76) resolving base names, dialogue topics, and map markers that previously rendered as mojibake.
Read-only. Unmatched subrecords and undecodable tails stay visible as raw nodes rather than being dropped, but this is explicitly not a no-data-loss editing contract — inline unused bytes are consumed without individual retention, and there is no generic schema writer yet.
3D worldspace viewer
Migrated from D3D11 to D3D12, then built out considerably:
- Lighting & atmosphere — imagespace HDR/tonemap (IMGS/IMAD) with BrightPass bloom, 4-cascade sun shadow maps with off-screen caster replay, sky dome with sun/moon billboards, layered clouds, per-game ambient/DALC lighting, and day/night gating for placed lights.
- Water — per-game water shaders derived from decompiled engine shaders, authored NIF water geometry, and mirrored-scene reflections for Oblivion.
- Vegetation — SpeedTree with weather-driven wind, engine-accurate LOD0 geometry rebuild, and canopy-depth dimming.
- Collision & movement — NIF Havok collision decoding with walk-mode ground and wall collision.
- Animation — NIF playback (banner sway, waterfall/lava scroll),
NiControllerManageridle sequences, Morrowind keyframe animation, and rigid-node baking. - Projection & export — orthographic/isometric/trimetric modes; tile-and-stitch raises the non-tiled PNG export cap to 16384px.
2D world map
Per-game map markers with authentic icons extracted offline from each game's own SWF — Skyrim, Fallout 4 (including faction and DLC types), Fallout 76, and Oblivion's parchment tiles. Plus terrain streaming with a viewport LRU, per-worldspace water, a searchable worldspace browser, layer export, and a FormID heatmap overlay.
DDX texture decoding — silent corruption fixed
The LZX decompressor stopped writing when its output buffer filled and still reported success. The buffer was sized from a mip-0 linear-size hint, so any texture whose real tiled extents exceeded that hint was silently truncated — roughly 4,700 of 22,616 converted textures shipped with black rectangles.
It went unnoticed because the validation harness compared golden hashes, which were stable: the corruption was deterministic, so every run reproduced the same wrong bytes. The buffer is now sized from real tiled extents, with pitch-rounding and tail-base fixes, shape-keyed heuristics removed, and a mean-absolute-error oracle plus decode diagnostics replacing hash-only validation.
Script decompilation
Papyrus (.pex) decompilation for Skyrim, Fallout 4, and Fallout 76, and ObScript extended to Oblivion via game-keyed opcode tables. A hash-pinned retail gate parses and decompiles all 7,194 scripts in the shipped MiscClient archive. Uninterpreted flag bits and references stay visible rather than being assigned guessed semantics.
Archives, VFS & repacking
- Format-agnostic
archivecommand group (BSA and BA2 auto-detected by magic;bsa/ba2kept as aliases), with BA2 (BTDX) read support and LZ4 block decoding for Skyrim SE v105. - A layered game VFS with lock-free BSA reads, so loose files and archives resolve through one view in load order.
- Xbox 360 repacking — console menus unpacked from
final_master_xml.dat,_n/_sspecular maps merged in memory, and MP3 music delivered loose because FNV cannot read MP3 from a BSA (Fallout 3 can).
DMP→ESM converter
Renamed from DMP→ESP (dmp to-esm; to-esp kept as a back-compat alias) and moved onto a plan-time pipeline — every emission decision is settled by the planner before a byte is written. Navmesh handling, cell parentage, placed-reference disposition, leveled-spawn recovery, and dialogue reconstruction all saw substantial work.
Tooling
tools/EsmSchemaGen (schema generation), tools/ShaderProbe (FNV shader package probing), headless renderer and 2D-map profiler apps with JSONL traces and camera automation, and an audio transcriber with a playlist review panel and timestamp converter.
Known limitations
This is an alpha release. Known-open items at the time of tagging:
- Starfield — normal maps are parsed but not yet wired into the renderer; terrain UV scaling and edge creases are unresolved.
- Fallout 76 — map markers are not yet surfaced.
- Record editing — decode is read-only. There is no generic schema-driven writer, so no round-trip editing.
- DMP→ESM output — converted plugins load and are playable, but memory-dump captures are inherently incomplete; output is not a substitute for a real plugin.
- Xbox 360 repacking — the menu-delivery policy is settled for the six menus the retail PC executable cannot run, but the broader policy is still open.
- Skyrim schema — the
IsSSEv43 wrapper and write-side member selection remain unimplemented.
Verification
Full non-incremental Release build across both target frameworks and all companion apps: 0 warnings, 0 errors. Test suite: 7,980 passed, 0 failed, 177 skipped (real-asset, GPU, and shader-compilation suites are opt-in via environment gates; the shader gate runs in CI).
Downloads
| Artifact | Contents |
|---|---|
BethesdaMultitool-Windows-GUI-x64.zip |
WinUI 3 desktop app, self-contained |
BethesdaMultitool-Windows-CLI-x64.zip |
Command-line tool, self-contained |
BethesdaMultitool-Linux-CLI-x64.tar.gz |
Command-line tool, self-contained |
BethesdaAudioTranscriber-Windows-x64.zip |
Companion transcriber app |
All builds are self-contained — no .NET runtime install required.
The full changelog entry, including the Changed and Removed sections, is in CHANGELOG.md.
v3.0.0-alpha.1
⚠️ Alpha release. Use, file issues, expect rough edges. Known gaps and ongoing investigations are documented in thememory/topic notes.
Headline features
🧬 DMP→ESP converter
Turn an Xbox 360 Fallout: New Vegas memory dump into a PC-loadable plugin (.esp + co-emitted .bsa). A new two-pass planner / encoder / merge pipeline covers ~60 FormTypes end-to-end with runtime-read → encoder coverage, plus a post-emission sanitizer pass for FormID, NVEX, and CTDA dangling references. Available as falloutu dmp-to-esp … on the CLI and as a new tab in the WinUI app (multi-DMP picker, dialogue-CSV inputs, secondary-data overlays, live event log).
🏞 v3 worldspace 3D viewer
Real-time WinUI 3 viewer for exterior worldspaces. Five phases shipped:
- Phase 0 — GPU pipeline migrated from Veldrid to Vortice.Windows / D3D11
- Phase 1 — Camera, cell-origin transforms, frustum culling
- Phase 2a — Per-cell terrain meshes from runtime VHGT/VNML, water, walk mode
- Phase 2b — Per-cell landscape texturing via opacity-blended shaders, world-map 2D overlay system, multi-format Map Export dialog, per-stage frame profiling
- Phase 2c — Instanced 3D rendering of placed references (statics, doors, containers, lights)
Also in this release
- 50+ new encoders for the converter — full coverage from
ARMAtoWRLD - GLB exporter generalized —
MeshGlbExporter+TerrainGlbExporterreplace the deleted OBJ pipeline;NpcGlbWriter→GlbWriter - ESP Planner pipeline — Tier 0 through Tier 7b, opt-in via
--planner-types PdbStructViewruntime layout abstraction + ~30 specialized readers migrated- New CLI commands —
report validate/report consistency,dmp analyze/compare/formtype-census/scan-cell,dialogue player-lines,esm gameplay-audit,esm diagnose-scripts - WindowsAppSDK 1.8 → 2.1.3, centralized package versions via
Directory.Packages.props - From-scratch test-discipline framework —
SyntheticStructFactory,RuntimeReaderTestFixture, snippet harness retired
⚠️ Breaking changes
- OBJ mesh / terrain exporters removed. Consumers of CLI-driven OBJ output need to switch to GLB.
NpcExport{MeshPart,Node,NodeKind,Scene,SkinBinding}.cs→Glb*as part of the GLB writer generalization.CrossDumpComparisonPipeline.csdeleted in favor of the new streaming projection pipeline.
Known alpha limitations
- DMP→ESP master-cell NAVM augmentation is gated off by default (
PluginBuildOptions.EmitMasterCellNavmAugmentation); some new NAVM cells still require an extended NAVI override the planner doesn't yet emit. - A WastelandNV-specific crash is under investigation (other worldspaces render fine).
- v3 viewer's reference renderer is alpha — diffuse-only, no shader effects.
Downloads
| Artifact | When to use it |
|---|---|
FalloutXbox360Utils-Windows-GUI-x64.zip |
Default Windows download — full WinUI 3 app with GUI tabs (NPC Browser, World Map, DMP→ESP converter, etc.) |
FalloutXbox360Utils-Windows-CLI-x64.zip |
Windows headless — just the falloutu CLI |
FalloutXbox360Utils-Linux-CLI-x64.tar.gz |
Linux headless CLI |
FalloutAudioTranscriber-Windows-x64.zip |
Companion app for transcribing extracted dialogue audio |
All builds are self-contained (no .NET runtime install required).
Links
- Full release notes: CHANGELOG.md → [3.0.0-alpha.1]
- In-flight investigations:
memory/topic notes - Full diff: v2.4.0...v3.0.0-alpha.1
v2.4.0
Full Changelog: v2.3.0...v2.4.0
v2.3.0
What's New
Full-Body NPC Rendering & glTF Export
Full-body NPC model assembly and export to glTF (.glb) format.
- Head, body, and equipment meshes composited into complete NPC scenes
- Equipment resolver for armor addon and weapon mesh lookup from ESM/BSA
- NPC record scanner for batch appearance extraction
- glTF export with alpha texture packing, material tuning, normal map encoding, and tint color support
- Tangent builder and coordinate adapter for correct glTF orientation
- Fixed NPC head attachment, eye transforms, and holster posing (baseball bat, weapons)
NPC Browser (GUI)
Interactive NPC browsing with 3D model preview in the GUI.
- BSA discovery for automatic mesh/texture archive detection
- NPC list with filtering and selection
- WebView2-based model viewer with embedded
<model-viewer>component
Dialogue Viewer (GUI)
Full dialogue tree visualization and browsing.
- Conversation builder with quest-to-topic-to-response navigation
- Dialogue tree renderer with expandable condition display
- Condition parser with function, operator, and parameter formatting
- Runtime dialogue merger for combining split Xbox 360 INFO records into coherent conversations
- Dialogue picker tree for browsing all quest dialogue topics
Runtime DMP Struct Readers
Major expansion of memory dump analysis with PDB-derived struct layouts.
- Typed runtime readers for 14+ new record types (Book, Challenge, Class, Collection, Explosion, Global, Magic, Message, CharacterAppearance, ActorWeapon, and more)
- PDB-based generic reader: reads any FormType's C++ fields using embedded
pdb_layouts.json(116 types, 2,612 fields) - BSStringT diagnostics for validating string fields in memory
- Memory-mapped file access via
IMemoryAccessor/MmfMemoryAccessor— efficient random-access reads of large DMP files - Runtime NPC layout auto-detection across different build versions
- Runtime world cell auto-detection and cell map probing
- Data-driven field probe system with baseline verification tests
- GPU texture scanner for locating textures in DMP memory regions
ESM Parser Expansion
- Eyes (EYES), Hair (HAIR), and expanded effect/magic data parsing
- Dialogue schema registry extended with new subrecord field definitions
- FormUsageIndex for cross-reference tracking across record types
- Expanded property panel builders for character, item, and world record display
World Map (GUI)
- Interactive world map control with hit testing for placed objects
- Heightmap builder and overview renderer improvements
- Cell property display and placed object category resolution
NIF Animation Support
- Controller sequence selector, interpolator pose reader, and keyframe reader
- Node controller pose reading for skeleton animation data
DDXConv Improvements
- Partial decompression support for truncated/corrupted textures
- Sequential tiled mip extraction
- DDS header fixes
- 3XDR block-size-dependent untiling fix
- 16B-block tiling fix for small grids (<16 blocks wide)
- ATI2/BC5 sub-tile untiling and 3XDO decompression buffer fix
DMP Diagnostics
- New
dmp dmp-diagcommand for scanning persistent refs and map markers across dump directories - DMP snippet extraction framework for creating self-contained test fixtures from real dumps
Code Quality
- Rendering code split and deduplicated (lighting constants consolidated)
- Analysis and export reporting infrastructure refactored with semantic formatting
- Savegame model types split into dedicated files
- Test suite expanded with new helpers:
DmpSnippetExtractor,SparseMemoryAccessor,RecordingMemoryAccessor,EsmTestFileBuilder - Removed obsolete test files and EGT verification pipeline (superseded by probe-based testing)
Full Changelog: v2.2.0-pre1...v2.3.0
v2.2.0-pre1
What's New
NIF Sprite Rendering
New sprite-gen CLI command for rendering 3D item models from BSA archives into PNG sprites.
- Extracts NIF meshes from BSA, converts Xbox 360 big-endian to little-endian, and renders textured sprites
- DDS texture decoding with automatic BSA texture resolution
- Gore cap filtering (BSDismemberSkinInstance body part ranges 100-299)
- Isometric view mode (
--iso) for body armor and larger items - Fixed endian bulk-swap bug that cross-contaminated multi-byte sub-fields in 4-byte structs (BodyPartList, HalfTexCoord, HavokFilter)
NPC Head Rendering
New render npc command for generating NPC head sprites with full FaceGen support.
- Base head mesh loading from RACE records via BSA
- FaceGen NIF override (per-NPC mesh from FaceGen directory)
- EGM mesh morphs: 50 symmetric + 30 asymmetric morph targets applied via FGGS/FGGA coefficients
- EGT texture morphs: 256x256 RGB deltas upscaled with bilinear interpolation to DDS resolution
- Hair, eyes, and head parts (eyebrows, beards) from HAIR/EYES/HDPT records
- NPC appearance resolution merging NPC_ and RACE coefficients
Unified CLI Commands
New format-agnostic commands that auto-detect file type (ESM, DMP, ESP):
search text/hex— text or hex byte pattern search across any binary filestats— categorized record type statisticslist— browse reconstructed records with type and filter optionsshow— inspect record detail by FormID or EditorIDdiff— compare records between any two files
Code Quality
- Massive refactoring: 5 batches of file splitting enforcing ~500-line limit across ~50 files
- New unit tests for extracted helper classes (EsmEditorIdValidator, RecordValidator, SemdiffRecordParser)
- Test suite refactored with shared helpers and ~35 parameterized theories
- All SonarQube and Roslyn analyzer warnings resolved (~336 warnings)
- CLI commands migrated from EsmAnalyzer to main project
Full Changelog: v2.1.0-pre.1...v2.2.0-pre1
v2.1.0-pre.1
What's New
FalloutAudioTranscriber
New standalone app for working with Fallout: New Vegas voice files from Xbox 360 BSA archives.
- Browse voice files with automatic ESM cross-referencing (speaker, quest, subtitle text)
- Batch transcription via Whisper with progress tracking
- Export to CSV or text
Save Game Decoder
Full save file parser for FNV Xbox 360 saves (.fxs).
- Decodes all 12 changed form types (references, actors, creatures, quests, etc.)
- CLI commands for decoding, hex dumping, and listing save contents
DMP Map Rendering
New dmp render-map command that generates map marker overlays from memory dumps.
- Renders per-dump PNGs and an animated GIF showing the timeline across builds
- Frames sorted chronologically by build date with timestamps shown on each frame
- Supports filtering out Fallout 3 markers that appear in early dumps (
--fo3-esmflag) - 15 map marker icons matching the in-game types
Other Improvements
- ESM scanning is significantly faster (was 15-25s per dump, now under 2s)
- Build era detection now uses the actual dump contents instead of relying on file timestamps
- Dialogue viewer shows player prompt text and speech challenge banners
- Codebase cleanup and deduplication across the board
- BSA file list parsing and new BSA CLI commands
Full Changelog: v2.0.0...v2.1.0-pre.1
v2.0.0
What's New
- Dialogue Viewer - Browse NPC dialogue trees with topic navigation, quest context, and speech challenge display
- AI Packages - View and compare NPC AI packages between memory dumps and ESM data
- Version Tracking - Track changes across different builds using runtime memory analysis
- World Map - Improved world map with better marker rendering and cell grid overlay
- RTTI Reader - Runtime type information extraction from memory dumps
- Various bug fixes for the dialogue viewer (difficulty display, quest enrichment)
Full Changelog: v2.0.0-pre2...v2.0.0
v2.0.0-pre2
What's New
Major scope expansion -- the project goes from a memory dump carver to a full Fallout Xbox 360 analysis toolkit. Renamed from Xbox360MemoryCarver to FalloutXbox360Utils.
ESM Conversion
- Full Xbox 360 to PC ESM conversion that produces GECK-compatible files
- Handles mixed endianness, split INFO records, subrecord byte-swapping, and compressed record rebuilding
- EsmAnalyzer CLI with semantic diff, three-way comparison, and record inspection commands
Data Browser
- GUI data browser for exploring ESM records with search, filtering, and property display
- Memory map visualization with dynamic coloring and ESM region identification
- World map with heightmap rendering and cell grid overlay
Script Decompiler
- Rewrote the script decompiler to work within the ESM parsing pipeline
- Handles all compiled scripts found in the ESM
Other
- BSA archive extraction with Xbox 360 to PC conversion
- DDX decompression now compiled in (no external dependencies)
- Dialogue system with topic navigation
- Runtime asset scanning from memory dumps using PDB-derived offsets
- DDS texture, OBJ mesh, and terrain export pipelines
Full Changelog: v1.1.0...v2.0.0-pre2
v1.1.0
What's New
- DDX Converter Tab - New GUI tab for batch DDX texture conversion with drag-and-drop support
- TextureAnalyzer - New tool for DDX/DDS debugging, including block map analysis for 3XDR textures
- UI theme and layout improvements across the app
Full Changelog: v1.0.1...v1.1.0