Inspiration
I was inspired to write my own custom mod for Signalis from excitement playing the game and seeing the other mod ideas on NexusMods.
What it does
My mod adds a spooky flashlight that you can toggle on/off with crtl+F.
How I built it
I installed MelonLoader for the Signalis game and then reverse engineered the code for the mod in C# in Visual Studio in a project configured for a .dll library using a pattern from Aponiac's Flashlight Mod https://www.nexusmods.com/signalis/mods/8. I built the .dll, copied it into the Mods directory, ran Signalis and debugged a saved profile until it worked correctly.
Challenges I ran into
I wanted to run Signalis on my Roku TV but Roku doesn't support the Unity framework. Rip.
I'd never dived into how Steam games are structured on the backend so learning what files where installed where was a pre-requisite I had to figure out.
Learning how to mod - turns out, this is rather complex. You have to understand that order to modify a Unity game, you have to use a. NET decompiler (like dnspy) to decompile the .dll file (and even the decompiled code may not be 100% accurate). Writing a custom mod requires an understanding of the game code itself, which circles back to decompiling the source code to find the functions you need to call.
My mod template
using MelonLoader;
using UnityEngine;
using UnityEngine.SceneManagement;
[assembly: MelonInfo(typeof(<class name>), "My first Elster mod", "latest", "Andy Blendermann")]
[assembly: MelonGame("", "")]
namespace MyCustomMod
{
public class MyCustomModFunction : MelonMod
{
public override void OnSceneWasLoaded(int buildIndex, string sceneName)
{
base.OnSceneWasLoaded(buildIndex, sceneName);
// Set game objects
}
public override void OnUpdate()
{
// add code for how mod should function on update
// set game objects
}
}
}
Pouring through decompiled src code only got me so far so I used FindObjectsOfType to print all object and child object names in the active scene to the Unity debugger console to learn what I had to work with. It didn't work fully but here's the code
GameObject[] allObjects = Resources.FindObjectsOfTypeAll<GameObject>();
foreach (GameObject obj in allObjects)
{
if (SceneManager.GetActiveScene() == null) {
continue;
}
Debug.Log("[" + obj.name + "] is an active object");
}
Debugging the mod - Signalis began crashing halfway through writing my custom mod, so I debugged the game logs and figured out Unhollowerbaselib.dll was missing from MelonLoader. This is a upstream bug: https://github.com/sinai-dev/UnityExplorer/issues/204. I downgraded to v5.0.2 and it began working again! (thanks ML for shaky backwards compatibility lol)
Accomplishments that I'm proud of
I deployed several mods that other devs had created, including
- Camera Perspective Shift Mod https://www.nexusmods.com/signalis/mods/7
- Machete Mod! https://www.nexusmods.com/signalis/mods/5
- Elster Eule Reskin https://www.nexusmods.com/signalis/mods/9
Deploying my own custom mod! Making the game even creepier! Cool reverse engineering experience. A+ for my taste in horror.

Log in or sign up for Devpost to join the conversation.