Decompiled source of SuperhotRandomizer v1.1.1

Mods/SuperhotRandomizer.dll

Decompiled a day ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using HarmonyLib;
using MelonLoader;
using SuperhotRandomizer;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("SuperhotRandomizer")]
[assembly: AssemblyDescription("Mod for randomizing weapons on player and enemies.")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("SuperhotRandomizer")]
[assembly: AssemblyCopyright("Copyright © 2026")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("5657e2cd-888b-4174-b3d0-3df38d7852fe")]
[assembly: AssemblyFileVersion("1.1.1.0")]
[assembly: MelonInfo(typeof(MainClass), "Superhot Randomizer", "1.1.1", "Gasterbuzzer", "https://github.com/Gasterbuzzer/SuperhotRandomizer/releases/")]
[assembly: MelonGame("SUPERHOT_Team", "SUPERHOT")]
[assembly: MelonAuthorColor(255, 255, 0, 255)]
[assembly: MelonPriority(100)]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.1.1.0")]
namespace SuperhotRandomizer;

public class MainClass : MelonMod
{
}
[HarmonyPatch(typeof(PejAiController), "Start")]
public static class PatchEnemyStart
{
	private static readonly Random RandomSystem = new Random();

	private static readonly MethodInfo PickupWeapon = typeof(PejAiController).GetMethod("PickupWeapon", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

	private static readonly FieldInfo CivilianWeapon = typeof(PejAiController).GetField("CivilianWeaponPrefab", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

	private static readonly FieldInfo MachineGunWeapon = typeof(PejAiController).GetField("MachineGunWeaponPrefab", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

	private static readonly FieldInfo MeleeWeapon = typeof(PejAiController).GetField("MeleeWeaponPrefab", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

	private static readonly FieldInfo PistolWeapon = typeof(PejAiController).GetField("PistolWeaponPrefab", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

	private static readonly FieldInfo ShotgunWeapon = typeof(PejAiController).GetField("ShotGunWeaponPrefab", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

	private static readonly FieldInfo KatanaWeapon = typeof(PejAiController).GetField("KatanaWeaponPrefab", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

	private static readonly FieldInfo FollowWeapon = typeof(PejAiController).GetField("MeleeWWeaponPrefab", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

	private static readonly FieldInfo WalkingSpeed = typeof(PejAiController).GetField("WalkingSpeed", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

	private static readonly FieldInfo RunningSpeed = typeof(PejAiController).GetField("RunningSpeed", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

	private static readonly FieldInfo LookSpeed = typeof(PejAiController).GetField("LookSpeed", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

	private static readonly FieldInfo WeaponSpeedMultiplier = typeof(PejAiController).GetField("weaponSpeedMultiplier", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

	private static readonly FieldInfo StandsStillWhileShooting = typeof(PejAiController).GetField("standsStillWhileShooting", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

	private static void Postfix(PejAiController __instance)
	{
		//IL_005d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0064: Expected O, but got Unknown
		//IL_0094: Unknown result type (might be due to invalid IL or missing references)
		//IL_009b: Expected O, but got Unknown
		//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d2: Expected O, but got Unknown
		//IL_0102: Unknown result type (might be due to invalid IL or missing references)
		//IL_0109: Expected O, but got Unknown
		//IL_0139: Unknown result type (might be due to invalid IL or missing references)
		//IL_0140: Expected O, but got Unknown
		//IL_0170: Unknown result type (might be due to invalid IL or missing references)
		//IL_0177: Expected O, but got Unknown
		//IL_01a4: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ab: Expected O, but got Unknown
		//IL_01d8: Unknown result type (might be due to invalid IL or missing references)
		//IL_01df: Expected O, but got Unknown
		//IL_038d: Unknown result type (might be due to invalid IL or missing references)
		int num = RandomSystem.Next(0, 7);
		if (PickupWeapon != null)
		{
			switch (num)
			{
			case 0:
			{
				GameObject val8 = (GameObject)CivilianWeapon.GetValue(__instance);
				PickupWeapon.Invoke(__instance, new object[3] { val8, null, true });
				break;
			}
			case 1:
			{
				GameObject val7 = (GameObject)MachineGunWeapon.GetValue(__instance);
				PickupWeapon.Invoke(__instance, new object[3] { val7, null, true });
				break;
			}
			case 2:
			{
				GameObject val6 = (GameObject)MeleeWeapon.GetValue(__instance);
				PickupWeapon.Invoke(__instance, new object[3] { val6, null, true });
				break;
			}
			case 3:
			{
				GameObject val5 = (GameObject)PistolWeapon.GetValue(__instance);
				PickupWeapon.Invoke(__instance, new object[3] { val5, null, true });
				break;
			}
			case 4:
			{
				GameObject val4 = (GameObject)ShotgunWeapon.GetValue(__instance);
				PickupWeapon.Invoke(__instance, new object[3] { val4, null, true });
				break;
			}
			case 5:
			{
				GameObject val3 = (GameObject)KatanaWeapon.GetValue(__instance);
				PickupWeapon.Invoke(__instance, new object[3] { val3, null, true });
				break;
			}
			case 6:
			{
				GameObject val2 = (GameObject)ShotgunWeapon.GetValue(__instance);
				PickupWeapon.Invoke(__instance, new object[3] { val2, null, true });
				break;
			}
			default:
			{
				GameObject val = (GameObject)FollowWeapon.GetValue(__instance);
				PickupWeapon.Invoke(__instance, new object[3] { val, null, true });
				break;
			}
			}
		}
		else
		{
			MelonLogger.Warning("PickUpWeapon method not found on the class.");
		}
		float num2 = RandomSystem.Next(0, 7);
		float num3 = RandomSystem.Next((int)num2, 10);
		float num4 = RandomSystem.Next(180, 640);
		WalkingSpeed.SetValue(__instance, num2);
		RunningSpeed.SetValue(__instance, num3);
		LookSpeed.SetValue(__instance, num4);
		float num5 = RandomSystem.Next(0, 3);
		WeaponSpeedMultiplier.SetValue(__instance, num5);
		switch (RandomSystem.Next(0, 2))
		{
		case 0:
			StandsStillWhileShooting.SetValue(__instance, false);
			break;
		case 1:
			StandsStillWhileShooting.SetValue(__instance, true);
			break;
		}
		if (RandomSystem.Next(0, 4) == 0)
		{
			double num6 = RandomSystem.NextDouble();
			if (num6 <= 0.1)
			{
				num6 += 0.1;
			}
			int num7 = RandomSystem.Next(1, 3);
			GameObject gameObject = ((Component)__instance).gameObject;
			if ((float)num6 * (float)num7 <= 0.2f)
			{
				num6 *= (double)num7;
			}
			gameObject.transform.localScale = new Vector3((float)num6 * (float)num7, (float)num6 * (float)num7, (float)num6 * (float)num7);
		}
	}
}
[HarmonyPatch(typeof(HandManager), "Start")]
public static class PatchHandStart
{
	private static readonly Random RandomSystem = new Random();

	private static readonly FieldInfo CurrentWeapon = typeof(HandManager).GetField("weapon", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

	private static readonly MethodInfo SpawnPlayerWeapon = typeof(HandManager).GetMethod("SpawnWeapon", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

	private static readonly MethodInfo BecomeUltra = typeof(HandManager).GetMethod("Ultra", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

	private static readonly MethodInfo RemoveCurrentWeapon = typeof(HandManager).GetMethod("RemoveWeapon", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

	private static void Postfix(HandManager __instance)
	{
		int num = RandomSystem.Next(0, 5);
		if (CurrentWeapon.GetValue(__instance) == null || CurrentWeapon.GetValue(__instance) is TakedownWeapon)
		{
			MelonLogger.Msg("No weapon equipped. 60% to gain one...");
			if (num < 4)
			{
				MelonLogger.Msg("Giving player a random weapon.");
				num = RandomSystem.Next(0, 4);
				SpawnPlayerWeapon.Invoke(__instance, new object[1] { num });
			}
			num = RandomSystem.Next(0, 25);
			if (num == 1)
			{
				BecomeUltra.Invoke(__instance, new object[1] { true });
			}
		}
		else
		{
			MelonLogger.Msg("Already have weapon, replacing...");
			RemoveCurrentWeapon.Invoke(__instance, new object[2] { false, true });
			num = RandomSystem.Next(0, 5);
			RemoveCurrentWeapon.Invoke(__instance, new object[1] { num });
		}
	}
}
[HarmonyPatch(typeof(PejAiSpawner), "Spawn")]
public static class PatchAiSpawner
{
	private static readonly Random RandomSystem = new Random();

	private static bool Prefix()
	{
		int num = RandomSystem.Next(0, 4);
		if (num == 1)
		{
			MelonLogger.Msg("Skipping one spawn.");
			return false;
		}
		return true;
	}

	private static void Postfix(MethodBase __originalMethod, PejAiSpawner __instance)
	{
		switch (RandomSystem.Next(0, 5))
		{
		case 1:
			MelonLogger.Msg("Spawning extra enemy.");
			__originalMethod.Invoke(__instance, null);
			break;
		case 2:
			MelonLogger.Msg("Spawning extra 2 enemies.");
			__originalMethod.Invoke(__instance, null);
			__originalMethod.Invoke(__instance, null);
			break;
		}
	}
}
[HarmonyPatch(typeof(PejAiBody), "Start")]
public static class EnemyHeadPatchRandom
{
	private static readonly Random RandomSystem = new Random();

	private static readonly FieldInfo PumpkinHeadPrefab = typeof(PejAiBody).GetField("PumpkinHeadPrefab", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

	private static readonly MethodInfo ReplaceHeadMethod = typeof(PejAiBody).GetMethod("ReplaceHead", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

	private static void Postfix(PejAiBody __instance)
	{
		//IL_0019: Unknown result type (might be due to invalid IL or missing references)
		//IL_001f: Expected O, but got Unknown
		int num = RandomSystem.Next(0, 5);
		GameObject val = (GameObject)PumpkinHeadPrefab.GetValue(__instance);
		if (num == 0)
		{
			ReplaceHeadMethod.Invoke(__instance, new object[1] { val });
		}
	}
}