using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Necro;
using UnityEngine;
[assembly: AssemblyCopyright("Copyright © 2025")]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: AssemblyTitle("Classic Start Area")]
[assembly: AssemblyDescription("Restores the original intro room as the starting area in Necropolis")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("KoMiKoZa")]
[assembly: AssemblyProduct("Classic Start Area")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("b39b09e0-0805-495a-80b6-960c391f255e")]
[assembly: AssemblyFileVersion("1.0.1.0")]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: CompilationRelaxations(8)]
[assembly: AssemblyVersion("1.0.1.0")]
namespace Komikoza.Necropolis.ClassicStartArea;
[BepInPlugin("komikoza.necropolis.classicstartarea", "Classic Start Area", "1.0.1")]
public class ClassicStartAreaPlugin : BaseUnityPlugin
{
private const string GUID = "komikoza.necropolis.classicstartarea";
private const string NAME = "Classic Start Area";
private const string VERSION = "1.0.1";
internal static ManualLogSource Logger;
internal static ConfigEntry<bool> ModEnabled;
internal static ConfigEntry<bool> DebugMode;
internal static FieldInfo startModuleField;
internal static string originalStartModule = null;
private void Awake()
{
//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
//IL_00e7: Expected O, but got Unknown
Logger = ((BaseUnityPlugin)this).Logger;
ModEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "ModEnabled", true, "Enable or disable this mod");
DebugMode = ((BaseUnityPlugin)this).Config.Bind<bool>("Debug", "DebugMode", false, "Enable debug logging");
startModuleField = typeof(Necropoloid).GetField("startModule", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
if ((object)startModuleField == null)
{
Logger.LogError((object)string.Format("[{0}] Could not find startModule field!", "Classic Start Area"));
return;
}
ModEnabled.SettingChanged += OnModEnabledChanged;
if (!ModEnabled.Value)
{
Logger.LogInfo((object)string.Format("[{0}] Disabled", "Classic Start Area"));
return;
}
try
{
Harmony val = new Harmony("komikoza.necropolis.classicstartarea");
val.PatchAll();
Logger.LogInfo((object)"================================================");
Logger.LogInfo((object)string.Format("[{0}] v{1} loaded!", "Classic Start Area", "1.0.1"));
Logger.LogInfo((object)" - Start area set to: intro (original)");
Logger.LogInfo((object)"================================================");
}
catch (Exception arg)
{
Logger.LogError((object)string.Format("[{0}] Failed to load: {1}", "Classic Start Area", arg));
}
}
private static void OnModEnabledChanged(object sender, EventArgs e)
{
try
{
Object obj = Object.FindObjectOfType(typeof(Necropoloid));
Necropoloid val = (Necropoloid)(object)((obj is Necropoloid) ? obj : null);
if ((Object)(object)val == (Object)null)
{
if (DebugMode.Value)
{
Logger.LogInfo((object)"[Classic Start Area][DEBUG] Necropoloid not found - might not be in game yet");
}
}
else
{
if ((object)startModuleField == null)
{
return;
}
if (ModEnabled.Value)
{
if (originalStartModule == null)
{
originalStartModule = startModuleField.GetValue(val) as string;
if (DebugMode.Value)
{
Logger.LogInfo((object)$"[Classic Start Area][DEBUG] Stored original start module: {originalStartModule}");
}
}
startModuleField.SetValue(val, "intro");
Logger.LogInfo((object)"[Classic Start Area] Enabled - start area set to: intro");
}
else if (originalStartModule != null)
{
startModuleField.SetValue(val, originalStartModule);
Logger.LogInfo((object)$"[Classic Start Area] Disabled - start area restored to: {originalStartModule}");
}
else
{
startModuleField.SetValue(val, "start");
Logger.LogInfo((object)"[Classic Start Area] Disabled - start area reset to: start (default)");
}
}
}
catch (Exception ex)
{
Logger.LogError((object)("[Classic Start Area] Error during hot-reload: " + ex));
}
}
}
[HarmonyPatch(typeof(Necropoloid), "Init")]
internal static class Necropoloid_Init_Patch
{
private static void Prefix(Necropoloid __instance)
{
try
{
if (!ClassicStartAreaPlugin.ModEnabled.Value || (Object)(object)__instance == (Object)null)
{
return;
}
if ((object)ClassicStartAreaPlugin.startModuleField != null)
{
if (ClassicStartAreaPlugin.originalStartModule == null)
{
ClassicStartAreaPlugin.originalStartModule = ClassicStartAreaPlugin.startModuleField.GetValue(__instance) as string;
if (ClassicStartAreaPlugin.DebugMode.Value)
{
ClassicStartAreaPlugin.Logger.LogInfo((object)$"[Classic Start Area][DEBUG] Stored original start module: {ClassicStartAreaPlugin.originalStartModule}");
}
}
ClassicStartAreaPlugin.startModuleField.SetValue(__instance, "intro");
if (ClassicStartAreaPlugin.DebugMode.Value)
{
ClassicStartAreaPlugin.Logger.LogInfo((object)"[Classic Start Area][DEBUG] Start area changed to: intro");
}
}
else
{
ClassicStartAreaPlugin.Logger.LogError((object)"[Classic Start Area] Could not find startModule field!");
}
}
catch (Exception ex)
{
ClassicStartAreaPlugin.Logger.LogError((object)("[Classic Start Area] Error: " + ex));
}
}
}