UNGODLY

Mod Series — Installation Manual

UngodlyAI v2.17.0 · UngodlyBallistics v3.0.0 · UngodlyGFX v1.0.0 · Killstreak Announcer v1.1.0

by StixsworldHD (StixsmasterHD4k)

Phase One · The Loader

Installing BepInEx 6 into Easy Red 2

BepInEx is the plugin loader every Ungodly mod stands on. Easy Red 2 is a Unity 6, IL2CPP, 64-bit game, which means you need one very specific flavor: BepInEx 6 Bleeding Edge — Unity.IL2CPP — win-x64. Not BepInEx 5. Not the Mono build. Not x86. This page gets exactly the right build into exactly the right folder, and proves it works before a single mod goes in.

WHY

Why this exact build? Easy Red 2 ships as IL2CPP — the C# game code is compiled to native machine code (that 45 MB GameAssembly.dll in the game folder). BepInEx 5 and the Mono builds hook the Mono runtime, which this game does not have. Only the BepInEx 6 IL2CPP line can generate the interop assemblies that let plugins like the Ungodly series talk to IL2CPP game code. The mods were built against Bleeding Edge build 785; any recent BE build works.

Field Order 01Locate your game folder

Everything installs into the folder that contains Easy Red 2.exe. The fastest way to open it:

  1. In Steam, right-click Easy Red 2 in your library.
  2. Choose Manage → Browse local files. An Explorer window opens directly in the game root.

Typical locations — yours depends on which drive your Steam library lives on:

C:\Program Files (x86)\Steam\steamapps\common\Easy Red 2\
F:\SteamLibrary\steamapps\common\Easy Red 2\        <- the reference install in the screenshots

Before touching anything, a clean unmodded root contains Easy Red 2.exe, GameAssembly.dll, UnityPlayer.dll, baselib.dll, UnityCrashHandler64.exe and the Easy Red 2_Data folder. If you see those, you are in the right place.

DLC

All DLC is supported and needs no special handling. Normandy, Stalingrad, Ardennes, Iwo Jima & Bougainville, Kwajalein, Tinian, Guam, Anzio & Nettuno, Sicilia, Fall of Berlin and the rest all load through the same GameAssembly.dll — BepInEx and the Ungodly plugins hook the game once, and every campaign benefits.

Field Order 02Download the correct BepInEx package

  1. Open the official Bleeding Edge build server: https://builds.bepinex.dev/projects/bepinex_be
  2. On the latest build, find the artifact list and download the one named exactly like this (the trailing number is the build — 785 or newer is what the Ungodly series was built and tested against):
BepInEx-Unity.IL2CPP-win-x64-6.0.0-be.785+af0cba7.zip

Three parts of that name are load-bearing. Check all three before you download:

NOTE

Windows sometimes flags freshly downloaded loader zips. If SmartScreen or your AV quarantines winhttp.dll from inside the archive, restore it and add an exclusion for the game folder — this proxy-DLL technique is how every BepInEx install on Windows bootstraps itself, and the builds on the official server are the canonical ones.

Field Order 03Extract it directly into the game root

Open the downloaded zip and extract its entire contents straight into the game folder from Step 01 — the same level as Easy Red 2.exe, not into any subfolder. If Explorer asks to merge or overwrite, say yes.

After extraction, the game root must contain all five of these new entries sitting next to the game exe:

Easy Red 2\
|- BepInEx\                  <- the loader itself (core\, patchers\, ...)
|- dotnet\                   <- bundled .NET runtime BepInEx 6 IL2CPP uses
|- .doorstop_version          <- version marker for the injector
|- doorstop_config.ini        <- tells the injector what to launch
|- winhttp.dll                <- the injector: Windows loads it with the game
|- changelog.txt              <- BepInEx changelog (harmless, ships in the zip)
|
|- Easy Red 2.exe             <- already there
|- GameAssembly.dll           <- already there
|- UnityPlayer.dll            <- already there
'- Easy Red 2_Data\           <- already there

This is the single most common failure point: if you end up with Easy Red 2\BepInEx-Unity.IL2CPP-win-x64...\BepInEx\ — a folder inside a folder — the game will launch completely vanilla. winhttp.dll must sit in the same directory as Easy Red 2.exe, because Windows only loads it from there.

Compare against the reference install — this is exactly what your root should look like (screenshot taken after the first run in Step 04, so BepInEx already shows a fresh modified date):

Windows Explorer showing the Easy Red 2 game root after installing BepInEx 6
Game root after Step 2 — the BepInEx and dotnet folders, .doorstop_version, doorstop_config.ini, winhttp.dll and changelog.txt sit directly next to Easy Red 2.exe.

What these files actually do

No action needed — but it helps to know what you just installed. winhttp.dll is UnityDoorstop: the game asks Windows for the system WinHTTP library, Windows finds this one first, and it boots BepInEx before a single frame renders. doorstop_config.ini points it at BepInEx\core\BepInEx.Unity.IL2CPP.dll, and the dotnet\ folder is the self-contained .NET runtime the IL2CPP loader runs on. Delete winhttp.dll and the whole stack silently disarms — which is also the official one-file uninstall.

Field Order 04Run the game once — the interop bake

Launch Easy Red 2 normally through Steam. The first modded launch takes several minutes longer than usual — this is the important part, not a hang:

  1. A BepInEx console window may appear alongside the game. Leave it alone.
  2. BepInEx reads GameAssembly.dll plus the game's metadata and generates interop assemblies — managed mirrors of every game class, written to BepInEx\interop\. This is what lets plugins call IL2CPP code, and it only happens on this first run (and again after game updates).
  3. Wait until the main menu fully loads, then quit the game.
LOG

During startup you may see [Warning:Il2CppInterop] Class::Init signatures have been exhausted, using a substitute! in the console or log. That line comes from the BepInEx/Il2CppInterop core resolving an internal engine signature for this Unity version — it appears even with an empty plugins folder, is expected on Bleeding Edge builds, and is harmless. It is not produced by any Ungodly plugin.

That single run creates the working folders every mod page on this site refers to:

Easy Red 2\BepInEx\
|- cache\           <- interop generation cache
|- config\          <- BepInEx.cfg now exists; every plugin writes its .cfg here
|- core\            <- BepInEx itself (shipped in the zip)
|- interop\         <- the generated game assemblies (the 'bake')
|- patchers\        <- (shipped, empty by default)
|- plugins\         <- THIS is where the Ungodly DLLs go
|- unity-libs\      <- downloaded Unity base libraries for this engine version
|- ErrorLog.log
'- LogOutput.log     <- your first stop for any verification or bug report
Windows Explorer inside the BepInEx folder showing cache, config, core, interop, patchers, plugins and unity-libs
Inside Easy Red 2\BepInEx after the first run — interop, plugins, config, unity-libs and LogOutput.log only exist once the game has been started one time.

Field Order 05Confirm the loader is alive

Two quick checks, no tools required:

DONE

The loader is in. From here, every mod is a quick drop: UngodlyAI · UngodlyBallistics · UngodlyGFX · Killstreak Announcer. Install any combination — the Ungodly trio shares zero Harmony targets and is built to run together, and the announcer is a pure listener (one DLL plus its KSounds voice folder in the game root).

Removing BepInEx later

Delete winhttp.dll from the game root and the game boots 100% vanilla — the remaining folders are inert without the injector. For a full clean, also delete BepInEx\, dotnet\, .doorstop_version, doorstop_config.ini and changelog.txt. Your Ungodly .cfg files live in BepInEx\config\ — copy them out first if you want to keep your tuning.