Decompiled source of CybergrindPowerups v1.0.0

CybergrindPowerups.dll

Decompiled 6 hours ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using PluginConfig.API;
using PluginConfig.API.Fields;
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("CybergrindPowerups")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("CybergrindPowerups")]
[assembly: AssemblyCopyright("Copyright ©  2026")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("ccbdd6f0-7249-4d79-9587-2c2fa81d9d51")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("1.0.0.0")]
public static class EnemyList
{
	public static List<EnemyType> AllEnemies = new List<EnemyType>
	{
		(EnemyType)3,
		(EnemyType)13,
		(EnemyType)14,
		(EnemyType)15,
		(EnemyType)6,
		(EnemyType)1,
		(EnemyType)20,
		(EnemyType)4,
		(EnemyType)0,
		(EnemyType)7,
		(EnemyType)2,
		(EnemyType)5,
		(EnemyType)26,
		(EnemyType)12,
		(EnemyType)9,
		(EnemyType)21,
		(EnemyType)31,
		(EnemyType)33,
		(EnemyType)34,
		(EnemyType)19,
		(EnemyType)39,
		(EnemyType)40,
		(EnemyType)38,
		(EnemyType)41
	};
}
public class EnemySettings
{
	public BoolField enabled;

	public IntField requiredCount;

	public EnemySettings(ConfigPanel panel, EnemyType enemy)
	{
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_000b: Invalid comparison between Unknown and I4
		//IL_000e: Unknown result type (might be due to invalid IL or missing references)
		//IL_003c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0046: Expected O, but got Unknown
		//IL_0049: Unknown result type (might be due to invalid IL or missing references)
		//IL_0076: Unknown result type (might be due to invalid IL or missing references)
		//IL_0080: Expected O, but got Unknown
		enabled = new BoolField(panel, ((int)enemy == 19) ? "Sisyphean Insurrectionist" : GetEnemyDisplayName(enemy), ((object)(EnemyType)(ref enemy)).ToString().ToLower() + "_enabled", true);
		requiredCount = new IntField(panel, GetEnemyDisplayName(enemy) + " Count", ((object)(EnemyType)(ref enemy)).ToString().ToLower() + "_required_count", 1);
	}

	private string GetEnemyDisplayName(EnemyType enemy)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_0003: Unknown result type (might be due to invalid IL or missing references)
		//IL_0004: Unknown result type (might be due to invalid IL or missing references)
		//IL_0005: Unknown result type (might be due to invalid IL or missing references)
		//IL_0007: Invalid comparison between Unknown and I4
		//IL_0015: Unknown result type (might be due to invalid IL or missing references)
		//IL_0017: Invalid comparison between Unknown and I4
		//IL_0009: Unknown result type (might be due to invalid IL or missing references)
		//IL_000b: Invalid comparison between Unknown and I4
		//IL_001b: Unknown result type (might be due to invalid IL or missing references)
		//IL_001e: Invalid comparison between Unknown and I4
		//IL_000f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0011: Invalid comparison between Unknown and I4
		EnemyType val = enemy;
		EnemyType val2 = val;
		if ((int)val2 <= 6)
		{
			if ((int)val2 == 2)
			{
				return "Hideous Mass";
			}
			if ((int)val2 == 6)
			{
				return "Streetcleaner";
			}
		}
		else
		{
			if ((int)val2 == 7)
			{
				return "Swordsmachine";
			}
			if ((int)val2 == 19)
			{
				return "Sisyphean";
			}
		}
		return ((object)(EnemyType)(ref enemy)).ToString();
	}
}
[BepInPlugin("yourname.cybergrindpowerups", "Cybergrind Powerups", "1.0.0")]
public class Plugin : BaseUnityPlugin
{
	[Serializable]
	[CompilerGenerated]
	private sealed class <>c
	{
		public static readonly <>c <>9 = new <>c();

		public static IntValueChangeEventDelegate <>9__15_0;

		public static BoolValueChangeEventDelegate <>9__15_1;

		public static BoolValueChangeEventDelegate <>9__15_2;

		internal void <Awake>b__15_0(IntValueChangeEvent changeEvent)
		{
			if (OrbSpawnChance.value < 0)
			{
				OrbSpawnChance.value = 0;
			}
			if (OrbSpawnChance.value > 100)
			{
				OrbSpawnChance.value = 100;
			}
		}

		internal void <Awake>b__15_1(BoolValueChangeEvent changeEvent)
		{
			if (SpawnOnPlayer.value)
			{
				SpawnAtEnemySpawn.value = false;
			}
		}

		internal void <Awake>b__15_2(BoolValueChangeEvent changeEvent)
		{
			if (SpawnAtEnemySpawn.value)
			{
				SpawnOnPlayer.value = false;
			}
		}
	}

	[CompilerGenerated]
	private sealed class <CachePowerups>d__17 : IEnumerator<object>, IDisposable, IEnumerator
	{
		private int <>1__state;

		private object <>2__current;

		public Plugin <>4__this;

		private GameObject[] <allObjects>5__1;

		private GameObject[] <>s__2;

		private int <>s__3;

		private GameObject <obj>5__4;

		private DualWieldPickup <pickup>5__5;

		private SpawnableObject[] <spawnables>5__6;

		private SpawnableObject[] <>s__7;

		private int <>s__8;

		private SpawnableObject <s>5__9;

		private string <name>5__10;

		object IEnumerator<object>.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		object IEnumerator.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		[DebuggerHidden]
		public <CachePowerups>d__17(int <>1__state)
		{
			this.<>1__state = <>1__state;
		}

		[DebuggerHidden]
		void IDisposable.Dispose()
		{
			<allObjects>5__1 = null;
			<>s__2 = null;
			<obj>5__4 = null;
			<pickup>5__5 = null;
			<spawnables>5__6 = null;
			<>s__7 = null;
			<s>5__9 = null;
			<name>5__10 = null;
			<>1__state = -2;
		}

		private bool MoveNext()
		{
			//IL_016d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0177: Expected O, but got Unknown
			//IL_02a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b3: Expected O, but got Unknown
			switch (<>1__state)
			{
			default:
				return false;
			case 0:
				<>1__state = -1;
				goto IL_0052;
			case 1:
				<>1__state = -1;
				goto IL_0052;
			case 2:
				<>1__state = -1;
				goto IL_0188;
			case 3:
				{
					<>1__state = -1;
					goto IL_02c4;
				}
				IL_0052:
				if ((Object)(object)GameStateManager.Instance == (Object)null)
				{
					<>2__current = null;
					<>1__state = 1;
					return true;
				}
				goto IL_0190;
				IL_0190:
				if ((Object)(object)RuntimeDualWieldPrefab == (Object)null)
				{
					<allObjects>5__1 = Resources.FindObjectsOfTypeAll<GameObject>();
					<>s__2 = <allObjects>5__1;
					for (<>s__3 = 0; <>s__3 < <>s__2.Length; <>s__3++)
					{
						<obj>5__4 = <>s__2[<>s__3];
						if (!((Object)(object)<obj>5__4 == (Object)null) && ((Object)<obj>5__4).name.Contains("DualWield"))
						{
							<pickup>5__5 = <obj>5__4.GetComponent<DualWieldPickup>();
							if (!((Object)(object)<pickup>5__5 == (Object)null))
							{
								RuntimeDualWieldPrefab = Object.Instantiate<GameObject>(<obj>5__4);
								Object.DontDestroyOnLoad((Object)(object)RuntimeDualWieldPrefab);
								RuntimeDualWieldPrefab.SetActive(false);
								Log.LogInfo((object)"[SUCCESS] Cached Dual Wield Orb");
								break;
							}
						}
					}
					<>s__2 = null;
					if ((Object)(object)RuntimeDualWieldPrefab == (Object)null)
					{
						<>2__current = (object)new WaitForSeconds(1f);
						<>1__state = 2;
						return true;
					}
					goto IL_0188;
				}
				goto IL_02cc;
				IL_02cc:
				if ((Object)(object)RedSoulOrbSpawnable == (Object)null)
				{
					<spawnables>5__6 = Resources.FindObjectsOfTypeAll<SpawnableObject>();
					<>s__7 = <spawnables>5__6;
					for (<>s__8 = 0; <>s__8 < <>s__7.Length; <>s__8++)
					{
						<s>5__9 = <>s__7[<>s__8];
						if (!((Object)(object)<s>5__9 == (Object)null))
						{
							<name>5__10 = ((!string.IsNullOrEmpty(<s>5__9.objectName)) ? <s>5__9.objectName : ((Object)<s>5__9).name);
							if (<name>5__10 == "Red Soul Orb")
							{
								RedSoulOrbSpawnable = <s>5__9;
								Log.LogInfo((object)"[SUCCESS] Cached Red Soul Orb");
								break;
							}
							<name>5__10 = null;
							<s>5__9 = null;
						}
					}
					<>s__7 = null;
					if ((Object)(object)RedSoulOrbSpawnable == (Object)null)
					{
						<>2__current = (object)new WaitForSeconds(1f);
						<>1__state = 3;
						return true;
					}
					goto IL_02c4;
				}
				Log.LogInfo((object)"[SUCCESS] Powerups cached");
				return false;
				IL_02c4:
				<spawnables>5__6 = null;
				goto IL_02cc;
				IL_0188:
				<allObjects>5__1 = null;
				goto IL_0190;
			}
		}

		bool IEnumerator.MoveNext()
		{
			//ILSpy generated this explicit interface implementation from .override directive in MoveNext
			return this.MoveNext();
		}

		[DebuggerHidden]
		void IEnumerator.Reset()
		{
			throw new NotSupportedException();
		}
	}

	public static ManualLogSource Log;

	public static Plugin Instance;

	public static BoolField EnableDualWieldOrb;

	public static BoolField EnableRedSoulOrb;

	public static BoolField EnableOrbSpawnChance;

	public static IntField OrbSpawnChance;

	public static BoolField SpawnOnPlayer;

	public static BoolField SpawnAtEnemySpawn;

	public static GameObject RuntimeDualWieldPrefab;

	public static SpawnableObject RedSoulOrbSpawnable;

	public static List<GameObject> SpawnedPowerups = new List<GameObject>();

	public static Dictionary<EnemyType, EnemySettings> EnemyConfigs = new Dictionary<EnemyType, EnemySettings>();

	public static PluginConfigurator PluginConfigInstance;

	private bool lastSpawnOnPlayer;

	private bool lastSpawnAtEnemySpawn;

	private void Awake()
	{
		//IL_0028: Unknown result type (might be due to invalid IL or missing references)
		//IL_002e: Expected O, but got Unknown
		//IL_006a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0070: Expected O, but got Unknown
		//IL_0084: Unknown result type (might be due to invalid IL or missing references)
		//IL_008a: Expected O, but got Unknown
		//IL_009e: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a4: Expected O, but got Unknown
		//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ba: Expected O, but got Unknown
		//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d0: Expected O, but got Unknown
		//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e6: Expected O, but got Unknown
		//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fd: Expected O, but got Unknown
		//IL_0133: Unknown result type (might be due to invalid IL or missing references)
		//IL_013d: Expected O, but got Unknown
		//IL_0149: Unknown result type (might be due to invalid IL or missing references)
		//IL_0153: Expected O, but got Unknown
		//IL_0116: Unknown result type (might be due to invalid IL or missing references)
		//IL_011b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0121: Expected O, but got Unknown
		//IL_016c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0171: Unknown result type (might be due to invalid IL or missing references)
		//IL_0177: Expected O, but got Unknown
		//IL_0196: Unknown result type (might be due to invalid IL or missing references)
		//IL_019b: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a1: Expected O, but got Unknown
		//IL_01e5: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ea: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f2: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f5: Unknown result type (might be due to invalid IL or missing references)
		Instance = this;
		Log = ((BaseUnityPlugin)this).Logger;
		((BaseUnityPlugin)this).Logger.LogInfo((object)"Cybergrind Powerups loaded!");
		Harmony val = new Harmony("yourname.cybergrindpowerups");
		val.PatchAll();
		((MonoBehaviour)this).StartCoroutine(CachePowerups());
		PluginConfigInstance = PluginConfigurator.Create("Cybergrind Powerups", "yourname.cybergrindpowerups");
		ConfigPanel val2 = new ConfigPanel(PluginConfigInstance.rootPanel, "Powerup Settings", "powerup_settings");
		ConfigPanel val3 = new ConfigPanel(PluginConfigInstance.rootPanel, "Spawn Settings", "spawn_settings");
		ConfigPanel panel = new ConfigPanel(PluginConfigInstance.rootPanel, "Enemy Settings", "enemy_settings");
		EnableDualWieldOrb = new BoolField(val2, "Dual Wield power-up", "enable_dual_wield_orb", true);
		EnableRedSoulOrb = new BoolField(val2, "Red Soul Orb power-up", "enable_red_soul_orb", true);
		EnableOrbSpawnChance = new BoolField(val2, "Enable Orb Spawn Chance", "enable_orb_spawn_chance", false);
		OrbSpawnChance = new IntField(val2, "Orb Spawn Chance (%)", "orb_spawn_chance", 100);
		IntField orbSpawnChance = OrbSpawnChance;
		object obj = <>c.<>9__15_0;
		if (obj == null)
		{
			IntValueChangeEventDelegate val4 = delegate
			{
				if (OrbSpawnChance.value < 0)
				{
					OrbSpawnChance.value = 0;
				}
				if (OrbSpawnChance.value > 100)
				{
					OrbSpawnChance.value = 100;
				}
			};
			<>c.<>9__15_0 = val4;
			obj = (object)val4;
		}
		orbSpawnChance.onValueChange += (IntValueChangeEventDelegate)obj;
		SpawnOnPlayer = new BoolField(val3, "Spawn power-ups on player", "spawn_on_player", true);
		SpawnAtEnemySpawn = new BoolField(val3, "Spawn power-ups at enemy spawn", "spawn_enemy_spawn", false);
		BoolField spawnOnPlayer = SpawnOnPlayer;
		object obj2 = <>c.<>9__15_1;
		if (obj2 == null)
		{
			BoolValueChangeEventDelegate val5 = delegate
			{
				if (SpawnOnPlayer.value)
				{
					SpawnAtEnemySpawn.value = false;
				}
			};
			<>c.<>9__15_1 = val5;
			obj2 = (object)val5;
		}
		spawnOnPlayer.onValueChange += (BoolValueChangeEventDelegate)obj2;
		BoolField spawnAtEnemySpawn = SpawnAtEnemySpawn;
		object obj3 = <>c.<>9__15_2;
		if (obj3 == null)
		{
			BoolValueChangeEventDelegate val6 = delegate
			{
				if (SpawnAtEnemySpawn.value)
				{
					SpawnOnPlayer.value = false;
				}
			};
			<>c.<>9__15_2 = val6;
			obj3 = (object)val6;
		}
		spawnAtEnemySpawn.onValueChange += (BoolValueChangeEventDelegate)obj3;
		if (SpawnOnPlayer.value && SpawnAtEnemySpawn.value)
		{
			SpawnAtEnemySpawn.value = false;
		}
		foreach (EnemyType allEnemy in EnemyList.AllEnemies)
		{
			EnemyConfigs[allEnemy] = new EnemySettings(panel, allEnemy);
		}
	}

	private void Update()
	{
		WaveTracker.Update();
		if (OrbSpawnChance != null)
		{
			if (OrbSpawnChance.value < 0)
			{
				OrbSpawnChance.value = 0;
			}
			if (OrbSpawnChance.value > 100)
			{
				OrbSpawnChance.value = 100;
			}
		}
		if (!lastSpawnOnPlayer && SpawnOnPlayer.value)
		{
			SpawnAtEnemySpawn.value = false;
		}
		if (!lastSpawnAtEnemySpawn && SpawnAtEnemySpawn.value)
		{
			SpawnOnPlayer.value = false;
		}
		lastSpawnOnPlayer = SpawnOnPlayer.value;
		lastSpawnAtEnemySpawn = SpawnAtEnemySpawn.value;
	}

	[IteratorStateMachine(typeof(<CachePowerups>d__17))]
	private IEnumerator CachePowerups()
	{
		//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
		return new <CachePowerups>d__17(0)
		{
			<>4__this = this
		};
	}
}
public static class PowerupSpawner
{
	public static void SpawnDualWield(Vector3 position)
	{
		//IL_0028: Unknown result type (might be due to invalid IL or missing references)
		//IL_0029: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)Plugin.RuntimeDualWieldPrefab == (Object)null)
		{
			Plugin.Log.LogError((object)"[POWERUP] Runtime DualWield is NULL");
			return;
		}
		GameObject val = Object.Instantiate<GameObject>(Plugin.RuntimeDualWieldPrefab, position, Quaternion.identity);
		Plugin.SpawnedPowerups.Add(val);
		val.SetActive(true);
		Plugin.Log.LogInfo((object)"[POWERUP] Spawned Dual Wield Orb");
	}

	public static void SpawnRedSoulOrb(Vector3 position)
	{
		//IL_002d: Unknown result type (might be due to invalid IL or missing references)
		//IL_002e: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)Plugin.RedSoulOrbSpawnable == (Object)null)
		{
			Plugin.Log.LogError((object)"[POWERUP] RedSoulOrbSpawnable is NULL");
			return;
		}
		GameObject val = Object.Instantiate<GameObject>(Plugin.RedSoulOrbSpawnable.gameObject, position, Quaternion.identity);
		Plugin.SpawnedPowerups.Add(val);
		val.SetActive(true);
		Plugin.Log.LogInfo((object)"[POWERUP] Spawned Red Soul Orb");
	}
}
[HarmonyPatch(typeof(EndlessGrid))]
[HarmonyPatch("SpawnOnGrid")]
public class SpawnHook
{
	public static void Postfix(GameObject __result, bool enemy)
	{
		//IL_002d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0038: Unknown result type (might be due to invalid IL or missing references)
		if (enemy && !((Object)(object)__result == (Object)null))
		{
			EnemyIdentifier componentInChildren = __result.GetComponentInChildren<EnemyIdentifier>();
			if (!((Object)(object)componentInChildren == (Object)null))
			{
				WaveTracker.RegisterEnemy(componentInChildren.enemyType, ((Component)componentInChildren).transform.position);
			}
		}
	}
}
public static class WaveTracker
{
	public static Dictionary<EnemyType, int> CurrentWaveEnemies = new Dictionary<EnemyType, int>();

	private static int lastWave = -1;

	private static EndlessGrid cachedGrid;

	private static bool orbTriggeredThisWave = false;

	private static bool rollAttemptedThisWave = false;

	public static void Update()
	{
		if ((Object)(object)cachedGrid == (Object)null)
		{
			cachedGrid = Object.FindObjectOfType<EndlessGrid>();
		}
		if ((Object)(object)cachedGrid == (Object)null || cachedGrid.currentWave == lastWave)
		{
			return;
		}
		lastWave = cachedGrid.currentWave;
		CurrentWaveEnemies.Clear();
		orbTriggeredThisWave = false;
		rollAttemptedThisWave = false;
		foreach (GameObject spawnedPowerup in Plugin.SpawnedPowerups)
		{
			if ((Object)(object)spawnedPowerup != (Object)null)
			{
				Object.Destroy((Object)(object)spawnedPowerup);
			}
		}
		Plugin.SpawnedPowerups.Clear();
		Plugin.Log.LogInfo((object)("[CybergrindPowerups] New Wave: " + lastWave));
	}

	public static void RegisterEnemy(EnemyType type, Vector3 enemyPosition)
	{
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_0027: Unknown result type (might be due to invalid IL or missing references)
		//IL_0028: Unknown result type (might be due to invalid IL or missing references)
		//IL_002a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0031: Unknown result type (might be due to invalid IL or missing references)
		//IL_003b: Unknown result type (might be due to invalid IL or missing references)
		//IL_003c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0019: Unknown result type (might be due to invalid IL or missing references)
		if (!CurrentWaveEnemies.ContainsKey(type))
		{
			CurrentWaveEnemies[type] = 0;
		}
		CurrentWaveEnemies[type]++;
		CheckEnemyConditions(type, enemyPosition);
	}

	private static void CheckEnemyConditions(EnemyType type, Vector3 enemyPosition)
	{
		//IL_001f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0038: Unknown result type (might be due to invalid IL or missing references)
		//IL_005d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0076: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ab: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b0: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ba: Unknown result type (might be due to invalid IL or missing references)
		//IL_01bf: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c4: Unknown result type (might be due to invalid IL or missing references)
		//IL_01da: Unknown result type (might be due to invalid IL or missing references)
		//IL_01db: Unknown result type (might be due to invalid IL or missing references)
		//IL_01e5: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ea: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ef: Unknown result type (might be due to invalid IL or missing references)
		//IL_0218: Unknown result type (might be due to invalid IL or missing references)
		//IL_0232: Unknown result type (might be due to invalid IL or missing references)
		if (orbTriggeredThisWave || rollAttemptedThisWave || !Plugin.EnemyConfigs.ContainsKey(type))
		{
			return;
		}
		EnemySettings enemySettings = Plugin.EnemyConfigs[type];
		if (!enemySettings.enabled.value || !CurrentWaveEnemies.ContainsKey(type))
		{
			return;
		}
		int num = CurrentWaveEnemies[type];
		int num2 = enemySettings.requiredCount.value;
		if (num2 < 1)
		{
			num2 = 1;
			enemySettings.requiredCount.value = 1;
		}
		if (num != num2)
		{
			return;
		}
		rollAttemptedThisWave = true;
		if (Plugin.EnableOrbSpawnChance.value)
		{
			int num3 = Random.Range(0, 100);
			if (num3 >= Plugin.OrbSpawnChance.value)
			{
				Plugin.Log.LogInfo((object)("[ROLL FAILED] " + num3 + "/" + Plugin.OrbSpawnChance.value));
				return;
			}
			Plugin.Log.LogInfo((object)("[ROLL SUCCESS] " + num3 + "/" + Plugin.OrbSpawnChance.value));
		}
		orbTriggeredThisWave = true;
		Plugin.Log.LogInfo((object)("[ORB CONDITION MET] " + ((object)(EnemyType)(ref type)).ToString() + " reached " + num));
		Vector3 position;
		if (Plugin.SpawnOnPlayer.value)
		{
			position = ((Component)MonoSingleton<NewMovement>.Instance).transform.position + Vector3.up * 2f;
		}
		else
		{
			if (!Plugin.SpawnAtEnemySpawn.value)
			{
				Plugin.Log.LogInfo((object)"[POWERUP] No spawn mode enabled");
				return;
			}
			position = enemyPosition + Vector3.up * 1f;
		}
		if (Plugin.EnableDualWieldOrb.value)
		{
			PowerupSpawner.SpawnDualWield(position);
		}
		if (Plugin.EnableRedSoulOrb.value)
		{
			PowerupSpawner.SpawnRedSoulOrb(position);
		}
	}

	private static Vector3 GetRandomEnemySpawnPosition()
	{
		//IL_0048: Unknown result type (might be due to invalid IL or missing references)
		//IL_004d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0057: Unknown result type (might be due to invalid IL or missing references)
		//IL_005c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0061: Unknown result type (might be due to invalid IL or missing references)
		//IL_0036: Unknown result type (might be due to invalid IL or missing references)
		//IL_003b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0064: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)cachedGrid == (Object)null)
		{
			cachedGrid = Object.FindObjectOfType<EndlessGrid>();
		}
		if ((Object)(object)cachedGrid == (Object)null)
		{
			return ((Component)MonoSingleton<NewMovement>.Instance).transform.position;
		}
		return ((Component)cachedGrid).transform.position + Vector3.up * 3f;
	}
}