๐ Language / Idioma: English | Portuguรชs (README_pt-br.md)
๐ค Author: Mauricio Nunes + DeepSeek & Gemini ยท Contributors
๐ฅ Download: latest release (Windows, Linux.AppImage/.deb/.tar.gz)
๐ GitHub: https://github.com/mbnunes/UOFiddler-Rust
UOFiddler is a complete, modern, high-performance 100% native Rust reimplementation of the classic UOFiddler for Ultima Online. Built on egui / eframe, it runs smoothly, stably, and elegantly on Linux, Windows, and macOS, completely eliminating dependencies on the .NET runtime, Mono, Wine, or Python.
Every Pull Request must meet the acceptance criteria. The first one: all user-visible text must be localized; a PR without it is refused. Agents: see AGENTS.md.
Traditional UOFiddler on Linux via Wine or Mono is prone to graphical glitches, crashes, and path casing errors. UOFiddler provides:
- 100% Native Rust: Zero runtime dependencies. Memory-safe, instant startup (< 50 ms), and microscopic memory footprint.
- Dual-Client Engine (Classic & Enhanced UOP): Seamless live toggling between Classic 2D (
.mul/.idx) and Enhanced Client 3D (.uopMythic MYP v5 / DDS textures). - Hardware-Accelerated UI (egui/eframe): Smooth 60+ FPS navigation across 65,536 static items, 16,384 land tiles, 79 GameData tables, and huge multis.
- Intelligent Path Detection: Automatically discovers Ultima Online Classic and Enhanced installations across standard locations (
/opt/hd_jogos/,~/.wine/, Lutris, Steam, local directories) with case-insensitive file resolution. - Universal Keyboard Navigation: Full keyboard control (Arrow Keys, PageUp, PageDown) with smooth automatic scrolling across lists and grids in all tabs.
- Native Audio Engine: Direct PCM WAV playback using
rodioover PipeWire, PulseAudio, and ALSA without external audio drivers. - Vertical Zoom Slider Tool: 1:1 true-size rendering with vertical sliders (0.5x to 5.0x) on previews for Items, Land Tiles, TileData, Textures, and Animations.
- Isometric Map Viewer & Map Editor: The world drawn like the game client (GPU, real art, sloped land), from
mapN.mulormapNLegacyMUL.uop, and a full map editor that saves straight into the client files (with.bakbackups), for shard admins. - Multilingual interface: English and Brazilian Portuguese (system language detected on first run, switchable in the options); every text goes through the translation tables in
crates/uo_gui/locales, so a new language is one more file.
Tabs are grouped in three categories at the top of the window: Arte (art), Dados (data) and Mundo (world).
| Tab | Description |
|---|---|
| โ๏ธ Items | Static items viewer with Grid and List modes. Live toggle between Classic 2D Art and Enhanced Client DDS textures (LegacyTexture.uop). Hue tester (3,000 hues), the item's TileData inspector (classic 32-bit and High Seas 64-bit flags), and vertical zoom tool. |
| ๐ฟ Land Tiles | 16,384 terrain tiles with diamond geometry (44x44 rhombus). Dual-engine switch for Classic vs Enhanced 3D terrain textures (Texture.uop), the land's TileData inspector, and zoom slider. |
| ๐ผ๏ธ Gumps | Full browser for classic gumpart.mul and modern gumpartLegacyMUL.uop. Container bounding box overlays (71 containers), search, and vertical zoom tool. |
| ๐จ Hues | Complete palette of all 3,000 Ultima Online hues. Color bar gradient inspector with individual 32-color RGB555 swatches and table view. |
| ๐งฑ Textures | Raw 64x64 and 128x128 surface textures from texmaps.mul. Grid and list view with 1:1 preview and vertical zoom tool. |
| ๐ฏ RadarCol | All 81,920 minimap radar colors mapped to items and terrain. Real-time RGB color preview and 1:1 tile art inspection. |
| ๐ญ Animations | Complete creature animation player supporting anim1..6.mul and AnimationFrame1..6.uop (46,000+ entries). Full category filtering (Monstros, Marinhos, Animais, Humanos/Equip, UOP Modernos), dynamic action selection with โ indicators, directional playback (8 directions), and sprite sheet exporter. |
| ๐ฌ Cliloc | High-speed string localization browser (cliloc.enu). Search across 100,000+ entries by ID or localized text. |
| ๐ Sounds | PCM sound browser and player for sound.mul. Direct audio playback with wave information. |
| ๐บ๏ธ Map | All six facets (Felucca, Trammel, Ilshenar, Malas, Tokuno, Ter Mur) from mapN.mul or mapNLegacyMUL.uop. Isometric view drawn on the GPU like the client (real art, textured slopes, roofs and height cut, radar inset), Radar and whole-facet Overview (facet0N.mul / Multimap.rle), mapdif/stadif toggle, presets and go-to. The Edit map button opens the map editor. |
| ๐ฐ Multis | Multi-tile structures browser (houses, castles, ships). Supports classic multi.mul and Enhanced Client MultiCollection.uop. Real-time isometric software ray-assembler with multi-height Z slicing and mouse wheel zoom. |
| ๐ก Light | Circular and directional light patterns (light.mul) with high-contrast preview. |
| ๐ค Fonts | Bitmap ASCII font browser (fonts.mul) with interactive text typing preview. |
| โญ Skills | Skills definition table (skills.mul) with action button flags and text entries. |
| ๐ฃ๏ธ Speech | Speech keywords and command triggers (speech.mul). |
| ๐ฌ AnimData | Frame animation timing and delay tables (animdata.mul) with live static art preview. |
| ๐ฎ GameData | Enhanced Client 3D configuration inspector (GameData.uop). Decodes all 79 configuration tables with Structured Grid and Raw Monospace views, row filtering, and batch CSV export. |
| ๐ง Paperdoll (experimental) | Paperdoll builder: the body animation and the paperdoll gump side by side, backpack-style item slots and hues (Equipconv.def, gump.def), any item on any layer, and the character on a mount. Still being finished, so it is hidden unless you start the program with --experimental (see Experimental features). |
| ๐งฉ GumpStudio | Visual gump designer: backgrounds, images, items, text, HTML/cliloc, buttons, checkboxes, radios, text entries and alpha regions, drawn with the client's art and UO fonts (unifont*.mul, fonts.mul). Saves and opens JSON and exports to RunUO (C#), Sphere and POL. Visual pickers for images, items, buttons, checkboxes and radios, a resizepic browser (with a manual valid/invalid list), HTML text, repeat loops, favorites and groups. |
| ๐ก Comunicaรงรฃo | Static reference of the client's packets (server to client and client to server) and gump layout commands, with search and filters. |
| ๐ Arquivos | Browser for every client file: text/def files as tables, IFF localization, UOP browser with entries and preview, hex view, Multimap.rle and facet0N.mul as images, and the UOP โ MUL converter (art, gumps, maps). |
Open the Map tab and press Edit map (or F11). The editor takes the place of the viewer, in the same tab:
- Tools: Select (inspect and edit a tile and its statics), Stamp, Terrain, Height, Eraser and Region, with brush size and shape, a preview of the stroke and a see-through ghost of the static where it will land (it stacks on tables, floors, countersโฆ).
- Terrain with automatic borders, read from the art or from border sets you edit in the Bordersโฆ dialog (saved in
~/.config/uofiddler/map_borders.json); floor statics get their borders inside the stroke. - Height band to work inside caves and on upper floors, and a fixed working Z.
- Region: copy, cut, paste, move, delete, fill, and saved templates.
- Palette with the visual art picker (categories, search, favorites, recents), undo/redo and keyboard shortcuts (press
?).
Saving: changes stay pending until you press Save, which writes them into the facet's files in the client folder: land into mapN.mul / mapNLegacyMUL.uop (patched in place), statics into staidxN.mul / staticsN.mul (rewritten). A .bak copy of each file is made before its first save. Save asโฆ writes a full copy of the facet's files into another folder instead, and pending changes can be exported to and imported from JSON. The editor edits the base map: mapdif/stadif patches, if the facet has them, still apply on top in the client.
Keep a copy of your client folder before saving, and close the game client while you save.
Tabs that are still being finished stay hidden, so the published tool shows only what is ready. Start the program with --experimental to show them:
uo_gui --experimental # Windows: uo_gui.exe --experimental
./UOFiddler-<version>-x86_64.AppImage --experimental
cargo run --release -p uo_gui -- --experimental- Today that is the Paperdoll tab. It appears marked (experimental), and the tab counters (20 tabs, 21 with the flag) include it only with the flag.
- The flag is kept when the auto updater restarts the program. For scripts and automated screenshots,
UOFIDDLER_EXPERIMENTAL=1does the same. All environment variables are listed indocs/en/environment-variables.md.
Ready-to-run builds of every push to master are published on the Releases page:
| System | File |
|---|---|
| Windows 10/11 (x64) | uofiddler-<version>-windows-x86_64.zip: unzip and run uo_gui.exe |
| Linux (any distro) | UOFiddler-<version>-x86_64.AppImage: chmod +x and run it |
| Debian / Ubuntu / Mint | uofiddler_<version>_amd64.deb: sudo apt install ./uofiddler_<version>_amd64.deb, then open UOFiddler from the menu |
| Linux (plain archive) | uofiddler-<version>-linux-x86_64.tar.gz: extract and run ./uofiddler |
Linux builds need glibc 2.30 or newer (Ubuntu 20.04+, Debian 11+, Fedora 32+ and anything newer).
UOFiddler checks, in the background, whether the latest release has a newer build than yours (the build number is embedded by the CI; a local cargo build is build 0, shown as "dev build"). If GitHub cannot be reached, nothing happens and the app opens normally.
- When there is a newer build, a dialog shows the new version and the release notes with Update now, Remind later and Ignore this version. Nothing is downloaded or installed without your click.
- Update now downloads the file for your system, checks its SHA-256 against the release's
SHA256SUMS.txt(a file that does not match is never installed), keeps the old executable as<name>.old, replaces the executable and restarts. If the new version does not start, the old one is put back. Settings are kept (they live in~/.config/uofiddler). - It updates the Windows
.exe(from the.zip), the Linux.AppImageand the.tar.gzbinary. For the.deb(system install) it only opens the release page. - Options has the toggle Check for updates automatically at startup (turn it off to disable the check) and the Check for updates button. Ignore this version is remembered in the same
settings.json(auto_update_check,ignored_update_build). - Command line (no window):
uo_gui --versionprints the build number;uo_gui --self-update <dir>runs the same update code against a local folder laid out like a release (zip/tar.gz/AppImage +SHA256SUMS.txt). It is used by the Updater test workflow (GitHub: Actions > Updater test > Run workflow, manual only), which builds build 1 and build 2 on Windows and Linux, updates one into the other and checks that a tampered checksum is refused.
- Rust toolchain (version 1.75+ recommended)
- On Linux, only the usual desktop libraries at run time (OpenGL plus X11 or Wayland); nothing extra is needed to build.
# Clone the repository
git clone https://github.com/mbnunes/UOFiddler-Rust.git
cd UOFiddler-Rust
# Run directly using the launch script
./run.sh
# Or compile and run with cargo
cargo run --release -p uo_guicargo test -p uo_core --lib
cargo test -p uo_gui
# Tests that read real client files run when UOFIDDLER_UO_DIR points at a client folder
UOFIDDLER_UO_DIR=/path/to/client cargo test -p uo_guicargo test --workspace also runs the benchmark_test integration test, which needs an Enhanced Client installation (GameData.uop).
UOFiddler-Rust/
โโโ Cargo.toml # Workspace manifest
โโโ crates/
โ โโโ uo_core/ # High-performance UO format decoders (100% safe Rust)
โ โ โโโ src/
โ โ โ โโโ art.rs # Classic Art & EC DDS decoding (image-rs dds)
โ โ โ โโโ animations.rs # MUL & UOP animation sequence decoder
โ โ โ โโโ gamedata.rs # GameData.uop parser (79 tables & containers)
โ โ โ โโโ multis.rs # Isometric multi renderer & uop collection
โ โ โ โโโ maps.rs # Map reader (mapN.mul / mapNLegacyMUL.uop, statics, mapdif), radar
โ โ โ โโโ map_edit.rs # Map changes and saving them into the client files
โ โ โ โโโ uop_convert.rs # UOP <-> MUL converter
โ โ โ โโโ gump_studio.rs # GumpStudio model and RunUO / Sphere / POL exporters
โ โ โ โโโ tiledata.rs # 32-bit & 64-bit TileData parser
โ โ โ โโโ gumps.rs # Classic & UOP Gump decoder
โ โ โ โโโ ...
โ โโโ uo_gui/ # Native hardware-accelerated GUI (egui / eframe)
โ โโโ src/
โ โโโ main.rs # Tabs, virtualization, keyboard navigation, theme
โ โโโ map/ # Isometric map view (GPU) and the map editor
โ โโโ ... # Files, Packets, Paperdoll and GumpStudio tabs
โโโ docs/
โ โโโ formats/ # Every client file format, documented
โ โโโ protocol/ # Packets and gump layout reference
โโโ packaging/linux/ # .deb / AppImage / .tar.gz packaging (used by CI)
โโโ Animationlist.xml # Creature animation definitions
โโโ Multilist.xml # Multi house names and metadata
โโโ run.sh # Universal launcher
โโโ README.md
docs/en/formats: one document per family of client files (MUL/IDX, maps, tables, animations, UOP containers,.def, localizationโฆ), covering every file of a 7.x client folder.docs/en/environment-variables.md: every environment variable and command-line argument (--experimental,UOFIDDLER_UO_DIR, the screenshot variables, the updater ones). The Portuguese original isdocs/variaveis-de-ambiente.md.docs/en/protocol: packets, gump layout commands and flows (login, gumps, house customization, boats). The Portuguese originals are indocs/formatsanddocs/protocol.
| Mauricio Nunes | Author and maintainer: the Rust rewrite, the core decoders and the whole original app. |
| Felipe Tuffani | Animations via Body.def/Bodyconv.def, the Files and Communication tabs, the Paperdoll builder, the UOP โ MUL converter, GumpStudio and UO fonts, the file format and protocol documentation, and the CI. |
| Joรฃo Escribano | UOP map reading, the isometric map viewer, the map editor that saves into the client files, and the release packages. |
Contributions and pull requests are welcome!
Open-source under the MIT License.