Soulsy is a minimal-features Souls-style hotkey HUD for Skyrim SE and AE. It is inspired by hotkey mods like Elden Equip, iEquip, and LamasTinyHud. It is in fact a fork of LamasTinyHud! It is simpler than LamasTinyHud is, however.
Check out the remarkably terse user docs. Or take a peek at a this tour of the HUD. If you like it, you can download it for your favorite mod manager from NexusMods.
My goals are two-fold: make a Souls-style equip HUD that is exactly what I want to use, and learn how to do Rust FFI. A bonus is demonstrating how to write Skyrim native-code mods in Rust.
This project has just had its first release. I expect to hear about bugs or mistakes in my use of the APIs. My eventual goal is to move everything except the SKSE plugin glue code to Rust, and have the C++ mostly vanish. See the TODO list at the end of this readme for details about my next steps.
Soulsy is a Rust and C++ project, using CMake to drive Cargo to build the Rust parts. The application logic is implemented in Rust, with a bridge to the C++ libraries required to implement an SKSE plugin. It requires the following to build:
- Rust set up for Windows (not for WSL)
- Visual Studio 2022 with C++ compilers installed
- CMake
- vcpkg with
VCPKG_ROOT
set in a user environment variable
The plugin requires the following vcpkg libraries, which will be installed for you:
There are a number of development conveniences in the justfile, including build and archive recipes for Powershell. cargo install just
if you do not have it. Because I am more comfortable on Unixes than on Windows, some recipes are written in Bash.
cargo --doc open
displays programmer documentation for the Rust side of the plugin. The C++ side is commented, but not to the same degree.
You are absolutely invited to contribute. This project follows the standard Contributor's Covenant.
I could not have approached the rendering code without the work in LamasTinyHud, so mlthelama gets all the props. I also learned a lot about how to make an SKSE plugin by reading their source. Give that HUD a try if you don't like the souls-game style, or want a UI you can edit in-game. The original has more features than this one does! It's also the only hotkeys hud mod I tried that worked well in my game, so that's a testimonial.
The icons for the built-in theme are the usual SkyUI icons, plus the futura-book-bt
true-type font. The background assets were built from scratch but were inspired by the Untarnished UI skin for LamasTinyHUD by MinhazMurks. The icons are the SkyUI icons by psychosteve, which are used in so many places I am not sure how to credit them.
cxx made developing the C++/Rust bridge a snap. This crate unlocks Rust as a viable language for all of your modding needs. The only drawback is that async Rust is not yet supported, but there are workarounds described in the docs.
Current tasks:
- I18n: fonts. ??
- Make a good-looking layout. Find a designer if necessary.
- Hammer the hell out of it while playing. Fix whatever doesn't stand up to abuse.
- Fix filed issues.
Second phase goals:
- Move image loading code to Rust. This will bring in the windows crate ecosystem.
- Move
imgui
rendering to Rust. Bindings exist already, plus a DX11 rendering back end. - Make image loading on-demand, to save memory. (Maybe an unimportant optimization? Measure.)
- Add support for debug builds to CMake, or at least remove the half-done option.
- Decide what to do about highlight animations.
- If I decide to highlight, track highlight status in the controller to support it.
DONE:
- Figure out how to compile papyrus scripts. Answer: Pyro.
- Edit the
.esp
if necessary. Check it in. - Rewrite or merely just tweak the script that builds the mod archive itself, with correctly-placed files.
- Test to see if the mod loads at all into the game. Fix whatever's broken.
- Finish up the icon data loading function.
- Hack out the per-page position settings stuff to ask Rust for info for exactly four slots, the ones visible right now.
- Handle the case of equipped items not being in the cycle, while the cycle is being advanced.
- Wire up the equip-item functions as well as the equip delay. Implement a timer using the tick in the imgui rendering code.
- Implement a get-current-slot-info function that handles the case where the current item is not in a cycle.
- Debounce keys. Especially the show/hide button.
- Wire up the mod to MCM to show its config & write user settings.
- Figure out what I'm doing wrong with MCM config settings. No really.
- Figure out what I'm doing wrong with translation files. UTF-16 LE, one tab. What else? CRLF.
- Why is consuming potions unstable? Sometimes fine, sometimes lockup.
- Make re-equipping the left-hand item work.
- Wire up the inventory-changed hooks.
- Inform Rust about equip changes.
- Get ammo showing correctly.
- Validate cycle data on save load. Baking the data into the save might be more robust long-term, but I don't know how to do that yet.
- Wire up activating the utility button.
- Figure out why activating potions makes the game lock up.
- Get all layout info into one file; load it into the shared struct. (Is shared the right choice? who knows.)
- Come up with an adequate default layout for the HUD.
- I18n: translation files.
- Code cleanup. DRY up the C++. Reorganize the Rust. Tighten up names.
- Cycle serialization files should include the player name so character-hopping doesn't lose dta.
- Sort out
gear.h
vsutility_items.h
. Merge? - Improve the CMake files so rebuilding is reliable.
- Make Rust log to a second file in the same directory as SKSE.
- Add more Rust debug-level logging for happy-path cases.
- Review the 20-or-so TODO items noted in code comments.
- User docs, for the readme and for the Nexus page.
- Is there an official way to show a textual feedback message in SkyUI? I'm using it.
- Consider getting more testers.
GPL-3.0.