Skip to content

Releases: slfx77/bethesda-multitool

v3.0.0-alpha.3

v3.0.0-alpha.3 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 21 Aug 08:48

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_2 feature-level enum and reject it outright with E_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 test arguments 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 honours BETHESDA_TEST_DATA_ROOT, then repo-relative Sample/, 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

v3.0.0-alpha.2 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 20 Aug 03:06

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), NiControllerManager idle 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 archive command group (BSA and BA2 auto-detected by magic; bsa/ba2 kept 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/_s specular 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 IsSSE v43 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

v3.0.0-alpha.1 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 02 Jun 23:46

⚠️ Alpha release. Use, file issues, expect rough edges. Known gaps and ongoing investigations are documented in the memory/ 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 ARMA to WRLD
  • GLB exporter generalizedMeshGlbExporter + TerrainGlbExporter replace the deleted OBJ pipeline; NpcGlbWriterGlbWriter
  • ESP Planner pipeline — Tier 0 through Tier 7b, opt-in via --planner-types
  • PdbStructView runtime layout abstraction + ~30 specialized readers migrated
  • New CLI commandsreport 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 frameworkSyntheticStructFactory, 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}.csGlb* as part of the GLB writer generalization.
  • CrossDumpComparisonPipeline.cs deleted 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

v2.4.0

Choose a tag to compare

@github-actions github-actions released this 10 Apr 05:48

Full Changelog: v2.3.0...v2.4.0

v2.3.0

Choose a tag to compare

@github-actions github-actions released this 23 Mar 02:56

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-diag command 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

v2.2.0-pre1 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 28 Feb 21:34

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 file
  • stats — categorized record type statistics
  • list — browse reconstructed records with type and filter options
  • show — inspect record detail by FormID or EditorID
  • diff — 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

v2.1.0-pre.1 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 23 Feb 00:00

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-esm flag)
  • 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

Choose a tag to compare

@github-actions github-actions released this 17 Feb 20:52

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

v2.0.0-pre2 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 14 Feb 03:10

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

Choose a tag to compare

@github-actions github-actions released this 18 Jan 06:49

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