What fan-mods would you like to see?


If they’re in online mode, maybe something could be done through that. Probably involve innovation, regardless.


I’ve been referred here by Flarechess from here:

I am interested in modding the movement system - either entirely, or just by bypassing the simulation and use absolute controls.
Please refer to the discussion related to this a few lines above.

Since I’m here, I would also like to see mods on the inventory system as well - a full revamp if possible.

I’d very much appreciate if you could facilitate modding both of these.
Depending on how easy the modding will be (tools, code, compilation, etc.), I might be able to contribute as well.
Looking forward to the final patch and finally the actual modding.
Thank you!

Is Steam Workshop planned or would the mods show up under DLCs (considering that there are none)?


Dewi_Morgan has made decent progress investigating UA’s moddability.

They may have some insights that will help get your process started.


This sounds exciting, and I hope will help me overcome my recent apathy :slight_smile:
I’m afraid I’m sitting in a hospital, keeping my wife company after some surgery tonight, but I will try to at least write up what I can remember of my notes here when we get back home, between caring for her.


Eek! Looks like everything has changed in more recent versions of UA. I suspect this is because they had to change their build process to support the cross-platform stuff.

Particularly, it no longer has the MonoBleedingEdge folder, which used to contain the mono DLL that you’d replace to insert debugging hooks into .NET assemblies. In fact, I don’t see the mono dll anywhere in the tree.



Here’s everything I knew, before making the above horrible discovery :slight_smile:

VERY LITTLE OF THIS CURRENTLY WORKS FOR UA. Other Unity games, sure. Just, not UA.

Don’t do any of the following unless you understand it all and have satisfied that I’m not getting you to install a bunch of malware. Odds are that you, dear reader, are one of less than a half-dozen people following these instructions, so this won’t be super-well peer reviewed.

1) Debugging.
- Installing dnSpy.
- Reading the source with dnSpy.
- Debugging with dnSpy. (broken)
2) Extracting assets.
3) Reverse compiling. (broken)
4) Making a mod plugin. (broken)
5) Inserting assets. (broken)

1) Debugging:
Any kind of development is a million times easier if you can take the thing and slap it into a runtime debugger and see what’s getting called where, with breakpoints and stuff. Even better if you can make changes, and recompile to see the effect of those changes.

For this, you want dnSpy: https://github.com/0xd4d/dnSpy, a project built on various other projects (Roslyn, ILSpy, dnlib, etc), which integrates them into a single smooth interface which reverse compiles, debugs, and recompiles .NET assemblies. Which is to say: Unity games.

Installing dnSpy:
This is covered in more depth at: https://github.com/0xd4d/dnSpy/wiki/Debugging-Unity-Games, but in short, you install the app, then replace UA’s .NET library with one that has debugging hooks.

a. Go to https://github.com/0xd4d/dnSpy/releases, download dnSpy-net472.zip and unzip it wherever you want to run the program from: no installer, sorry! Extracting to your desktop is fine, so is to C:\Program Files. You do you.

b. Find out what Unity version your copy of UA was built with. This is important. Your extension will break in various unpredictable ways if you make it for the wrong version of Unity!

At the moment, it’s “2018.3.12.64867”. But there’s a tiny chance this might change in future patches, so for each patch, browse to where you have UA installed, rightclick UA.exe, and click the “details” tab. You should see “File Version: 2018.3.12.64867”, which is the Unity version the exe was compiled with. If it’s different, then change the following instructions appropriately.

While you’re in the UA install folder, maybe slap a shortcut to it on your desktop, since you’re going to be going to that folder a lot. Or at least keep the file explorer window open.

Also while you’re in there, make a backup of the file MonoBleedingEdge/EmbedRuntime/mono-2.0-bdwgc.dll within there. (The location of the mono file will depend on which game you are debugging - this was the value for UA until recently.)

c. Download Unity-debugging-2018.zip from the same webpage as the installer. Extract it somewhere, too. Within it, you’ll find a whole bunch of folders for the Unity versions released that year.

Overwrite the above MonoBleedingEdge\EmbedRuntime\mono-2.0-bdwgc.dll from your game’s install folder (which no longer exists in UA) with the file Unity-debugging\unity-2018.3.12\win64\mono-2.0-bdwgc.dll - this replaces the mono DLL with one that has debugging hooks in it!

Reading the source with dnSpy
You don’t actually need to do the above DLL replacement for this bit.
a. Launch UA the normal way. I’d recommend to run it in a window, it’s just way easier to switch to the debugger that way.
b. Run dnspy.exe from the folder you installed it into (well, I put a shortcut on my start bar).
c. File -> Open -> <game install folder>\<GameName>_Data\Managed\Assembly_CSharp.dll
d. That’ll load the C# code into dnSpy. You can navigate the source’s namespace tree on the left. Generally speaking, the “-” namespace is where all the interesting code for a game is, and everything else is libraries, which are cool because you can call them.

Like I said… this no longer works with UA. Try it with any other Unity game you have installed and it should work fine. Just… not this one.

Debugging with dnSpy

a. Launch UA the normal way. I’d recommend to run it in a window, it’s just way easier to switch to the debugger that way.
b. Run dnspy.exe from the folder you installed it into (well, I put a shortcut on my start bar).
c. Click Debug -> Attach to Process… (Note: NOT “Attach to Process (Unity)”!)
d. If a Windows Firewall warning comes up, click “Allow access”.
e. Select the UA.exe process and click “Attach
f. If everything went right, the game’s source tree should automagically load in the lefthand panel, as well as those for all the DLLs it has loaded. You can navigate around, set breakpoints (even conditional ones), click things to go to the definition, find usages, edit the code and recompile, all the stuff you expect in a decent IDE.

  1. Extracting assets.
    This bit MIGHT still work, maybe?
    Download the program https://sourceforge.net/projects/utinyripper/ and run it on one of the .asset or .level files. It will take a long time to run (multiple hours on a beefy gaming machine), and loading the extracted resources back into Unity will take FOREVER (maybe a day) and won’t work perfectly. I never did get the main static scenery to load, and you have to change the lighting on all the objects that show up purple. But it gives a starting point, and lets you extract character models, etc.

  2. Reverse compiling.
    This used dnlib (https://github.com/0xd4d/dnlib), which like dnSpy relies on the existence of Assembly_CSharp.dll. This file no longer exists. There is GameAssembly.dll which might contain the same data… but I have no idea how to extract it.

  3. Making a mod plugin.
    This relied on using UnityModManager (UMM) https://www.nexusmods.com/site/mods/21/
    … which again requires the normal Unity Windows file structure.

  4. Inserting assets.
    This relied on compiling asset DLLs using Unity, that could then be hooked in using UMM. It was a challenge because Unity wouldn’t allow you to embed code with those dll packages. Either way, it will no longer work.

  5. Bonus: runtime debugging displays.

I never got this to work, but my plan was to use the Unity Asset Store assets here:

I’m… pretty bummed out, here. I spent a good few weeks of evenings researching all the above, most of which is no longer relevant to this game. I will use it with other games, though, so it’s not all a loss.

I admit, while I do like this game, and the dev team that made it (they didn’t deliberately screw modding, it’s just a sad side-effect of a change to the build process), I’m no longer hugely motivated to solving the modding for this game now it’s all been changed. It’s kind of a huge load off my shoulders, in fact, since it had been hanging over me :P


Your horrible discovery means they went from mono to il2cpp:

Mono is cross-platform in the first place, so the change to il2cpp was surely not for the sake of cross-platfrom stuff. I am guessing it’s that tiny performance gain it brings (would bring, if done correctly).

Anyway, here’s the million dollar question:
Was the idea of modding based on the reverse-engineering and rebuilding/patching the mono DLL? (Meaning that it’s all gone now in a puff of C++ smoke?)

Best wishes to your better half!

Thank you!


Dewi…firstly, as Csimbi says, best wishes to/for your wife.

Secondly…ughhhh. Just ‘ughhh’. This brings back long-forgotten nightmares of debuggers, optimisers, wonky library run-times etc.

Quite simply, take that feeling of relief and run with it. Don’t be tempted to return. That story serves up a simulacra of the game as a whole, and the dev process…right up and to and including the last sudden twist.

Oof…burial rights.


Ah, makes sense :D Thank you.

dnSpy builds on a bunch of .NET C# bytecode tools. It was super amazing while it worked.

UnityModManager builds on Harmony (https://github.com/pardeike/Harmony), which aimed at hooking C# only: lets you put “before” and “after” hook-methods around any C# method. That was how I’d hoped to get it working without having everyone replacing the Assembly_CSharp.dll file.

Since it’s all C++ now… you’re right, achieving patchability will mean starting over with researching a whole different toolset. And I just don’t think I’m up to that challenge :frowning:

Still… the upside is, there’re other games that the tools above will still work with, so my learning wasn’t wasted. Like, Shroud of the Avatar is C# Unity… and I was able to use it to give a bugfix to the 60 Seconds devs.

Thanks, both :) The surgeon says everything went perfectly, she’s tucked up recuperating at home with me and the cats, and since she just played some Elder Scrolls Online, I’d say she’s mostly back to normal already!

Edit: Hrm, for a braver person than I, there may still be a path to reverse engineer il2cpp-munged code…


I can’t promise anything YET, but I talked to our Lead Engineer. He thinks he may be able to re-upload the final version of UA as C# on a separate Steam branch for mod purposes, but needs to make sure it doesn’t break anything in the process. Fingers crossed… I’ll post an update when I hear back from him.


OSE releasing UA source for extension/modding by the community would be amazing!


All right my friends, I return bearing fruit. :slight_smile:

Will was gracious enough to spend some time recompiling UA into C# for us on a mod-branch which is now actively accessible on the main Underworld Ascendant app. You can switch to this at any time by right-clicking Underworld Ascendant on Steam, selecting “Properties,” then the “Betas” tab, selecting “mod-friendly” and then the Close button.

He also put the Challenge of Ishtass and the Split Ruins of Gwern level back in for your purposes, since some of the larger levels were harder to decompile.

Note that to access those two latter levels, you’ll need to be able to use the dev console.

When launching Underworld Ascendant from Steam, you’ll need to set your launch options to “-console” from Properties and then play the game. While ingame, you’ll now be able to access a dev console by pressing the Shift and ~ keys simultaneously. There are a couple of mod menus we’ll let you browse. @Dewi_Morgan, you’re free to distribute the mod commands we taught you if you need them as well.

I hope this helps!!


Wooooow! <3
That really is above and beyond. I love you guys!


Whoo! Whoo! Whoo!
Will! Will! Will! \o/


You bear great tidings, thank you!


OSE, thank you for this.


So wait. Is this a true source code release to build real mods or is this just opening access to the dev console for tweaks?


Neither, as I understand it. It’s a version that was not compiled to C++, but rather C#.
That lets us mod it and view the source, but it’s the source from the bytecode, so no comments, and some variablenames are generic rather than specific.
It gives us all we need for modding, but is one step shy of a full source release.


Do you think we could build levels and NPCs with it?
Like UUW and UUW2?


This is the least we can do, short of a full moddable release, which we wouldn’t have the development tools or budget to squeeze in.

The dev console access allows you to do some minor modding, if you need it at any point in your adventure, but it’s not open to much customization. Most of it was for QA purposes. (The invincibility cheat is probably the one I used the most often, shy of the teleportation cheats.)

As to Csimbi’s question, I don’t see why not, but you would probably need to insert your own levels from Unity and mod it to the game. You can use some of the given models though, which might be fun… I wish we had more Meridian time in the main campaign, for example…