Decompiled source of MonsterParty v1.0.0

Repo_MonsterParty.dll

Decompiled 5 hours ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
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("Repo_MonsterParty")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Repo_MonsterParty")]
[assembly: AssemblyCopyright("Copyright ©  2026")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("fe4b6bc2-b6c8-4439-81ab-bb7a8adbcdb1")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace Repo_MonsterParty;

[BepInPlugin("Wan7.REPO.MonsterParty", "Monster Party", "1.0.0")]
[BepInProcess("REPO.exe")]
public class MonsterParty : BaseUnityPlugin
{
	internal static ManualLogSource Log;

	private Harmony harmony;

	private void Awake()
	{
		//IL_0012: Unknown result type (might be due to invalid IL or missing references)
		//IL_001c: Expected O, but got Unknown
		Log = ((BaseUnityPlugin)this).Logger;
		harmony = new Harmony("Wan7.REPO.MonsterParty");
		harmony.PatchAll();
		Log.LogInfo((object)"Monster Party 已加载");
	}
}
internal static class MonsterPartyEventManager
{
	internal static int RollEvent()
	{
		if (Random.value < 0.4f)
		{
			return -1;
		}
		return Random.Range(1, 28);
	}

	internal static bool IsGroupEvent(int eventId)
	{
		return eventId switch
		{
			2 => true, 
			4 => true, 
			6 => true, 
			7 => true, 
			8 => true, 
			10 => true, 
			13 => true, 
			16 => true, 
			17 => true, 
			18 => true, 
			19 => true, 
			20 => true, 
			21 => true, 
			23 => true, 
			25 => true, 
			26 => true, 
			27 => true, 
			_ => false, 
		};
	}

	internal static string GetEventName(int id)
	{
		return id switch
		{
			1 => "小赌怡情", 
			2 => "鸭鸭泛滥", 
			3 => "特工行动", 
			4 => "顺丰快递", 
			5 => "寂静之地", 
			6 => "新年快乐", 
			7 => "爱狗人士", 
			8 => "铃儿响叮当", 
			9 => "北方呼呼从哪来", 
			10 => "专车护送", 
			11 => "千与千寻", 
			12 => "花粉症", 
			13 => "我该往哪看?", 
			14 => "掌声响起来", 
			15 => "地心引力", 
			16 => "糟糕的生日", 
			17 => "铁头功训练", 
			18 => "拆迁大队", 
			19 => "太空旅行", 
			20 => "假面舞会", 
			21 => "众叛亲离", 
			22 => "大头儿子小头爸爸", 
			23 => "小手别乱摸!", 
			24 => "激光派对", 
			25 => "脊椎病", 
			26 => "小人国", 
			27 => "大赌伤身", 
			_ => null, 
		};
	}
}
internal static class MonsterPartyEventContext
{
	internal static int CurrentEventId = -1;

	internal static string CurrentEventName = null;

	internal static void Clear()
	{
		CurrentEventId = -1;
		CurrentEventName = null;
	}
}
internal static class MonsterPartyEventHistory
{
	private const int MAX_HISTORY = 3;

	private static readonly Queue<int> recentEvents = new Queue<int>();

	internal static bool IsRecentlyUsed(int eventId)
	{
		return recentEvents.Contains(eventId);
	}

	internal static void Record(int eventId)
	{
		if (eventId != -1)
		{
			recentEvents.Enqueue(eventId);
			while (recentEvents.Count > 3)
			{
				recentEvents.Dequeue();
			}
		}
	}

	internal static void Clear()
	{
		recentEvents.Clear();
	}
}
[HarmonyPatch(typeof(EnemyDirector))]
[HarmonyPatch("AmountSetup")]
public static class Patch_MonsterParty_EnemyAmountGrowth
{
	private static readonly FieldRef<EnemyDirector, int> f_Amount1 = AccessTools.FieldRefAccess<EnemyDirector, int>("amountCurve1Value");

	private static readonly FieldRef<EnemyDirector, int> f_Amount2 = AccessTools.FieldRefAccess<EnemyDirector, int>("amountCurve2Value");

	private static readonly FieldRef<EnemyDirector, int> f_Amount3 = AccessTools.FieldRefAccess<EnemyDirector, int>("amountCurve3Value");

	private static readonly FieldRef<EnemyDirector, int> f_Total = AccessTools.FieldRefAccess<EnemyDirector, int>("totalAmount");

	private static readonly FieldInfo fi_enemyList = typeof(EnemyDirector).GetField("enemyList", BindingFlags.Instance | BindingFlags.NonPublic);

	private static void Postfix(EnemyDirector __instance)
	{
		if (!SemiFunc.IsMasterClientOrSingleplayer())
		{
			return;
		}
		MonsterPartyEventContext.Clear();
		int levelsCompleted = RunManager.instance.levelsCompleted;
		int num = levelsCompleted / 5;
		float num2 = 0f;
		float num3 = 0.2f;
		for (int i = 0; i < num; i++)
		{
			num2 += num3;
			num3 *= 0.5f;
		}
		float num4 = 1.5f + (float)levelsCompleted * 0.01f + num2;
		num4 = Mathf.Clamp(num4, 1f, 2.4f);
		f_Amount1.Invoke(__instance) = Mathf.RoundToInt((float)f_Amount1.Invoke(__instance) * num4);
		f_Amount2.Invoke(__instance) = Mathf.RoundToInt((float)f_Amount2.Invoke(__instance) * num4);
		f_Amount3.Invoke(__instance) = Mathf.RoundToInt((float)f_Amount3.Invoke(__instance) * num4);
		f_Total.Invoke(__instance) = f_Amount1.Invoke(__instance) + f_Amount2.Invoke(__instance) + f_Amount3.Invoke(__instance);
		int num5 = Mathf.Min(f_Total.Invoke(__instance), 20);
		List<EnemySetup> list = (List<EnemySetup>)fi_enemyList.GetValue(__instance);
		int num6 = -1;
		for (int j = 0; j < 10; j++)
		{
			int num7 = MonsterPartyEventManager.RollEvent();
			if (num7 == -1)
			{
				num6 = -1;
				break;
			}
			if (!MonsterPartyEventHistory.IsRecentlyUsed(num7))
			{
				num6 = num7;
				break;
			}
		}
		if (num6 != -1 && MonsterPartyEventContext.CurrentEventId == -1)
		{
			MonsterPartyEventContext.CurrentEventId = num6;
			MonsterPartyEventContext.CurrentEventName = MonsterPartyEventManager.GetEventName(num6);
		}
		if (num6 != -1)
		{
			MonsterPartyEventHistory.Record(num6);
		}
		int currentEventId = MonsterPartyEventContext.CurrentEventId;
		if (currentEventId == -1)
		{
			MonsterParty.Log.LogInfo((object)"[MonsterParty] 本关无事件");
			while (list.Count < num5)
			{
				EnemySetup val = null;
				int num8 = Random.Range(0, 3);
				if (num8 == 0 && __instance.enemiesDifficulty1.Count > 0)
				{
					val = __instance.enemiesDifficulty1[Random.Range(0, __instance.enemiesDifficulty1.Count)];
				}
				else if (num8 == 1 && __instance.enemiesDifficulty2.Count > 0)
				{
					val = __instance.enemiesDifficulty2[Random.Range(0, __instance.enemiesDifficulty2.Count)];
				}
				else if (__instance.enemiesDifficulty3.Count > 0)
				{
					val = __instance.enemiesDifficulty3[Random.Range(0, __instance.enemiesDifficulty3.Count)];
				}
				if ((Object)(object)val != (Object)null)
				{
					list.Add(val);
					continue;
				}
				break;
			}
			fi_enemyList.SetValue(__instance, list);
			MonsterParty.Log.LogInfo((object)$"[MonsterParty] Level={levelsCompleted}, Normal Growth, Target={num5}");
		}
		else if (MonsterPartyEventManager.IsGroupEvent(currentEventId))
		{
			int finalCount = num5;
			RunGroupEvent(currentEventId, __instance, list, finalCount, num5);
		}
		else
		{
			RunSingleEvent(currentEventId, __instance, list, num5);
		}
	}

	private static void RunSingleEvent(int eventId, EnemyDirector director, List<EnemySetup> enemyList, int count)
	{
		switch (eventId)
		{
		case 1:
			RunEvent_SpinnyOnly(director, enemyList, count);
			break;
		case 3:
			RunEvent_OoglyOnly(director, enemyList, count);
			break;
		case 5:
			RunEvent_HunterOnly(director, enemyList, count);
			break;
		case 9:
			RunEvent_BowtieOnly(director, enemyList, count);
			break;
		case 11:
			RunEvent_RobeOnly(director, enemyList, count);
			break;
		case 12:
			RunEvent_HeartHuggerOnly(director, enemyList, count);
			break;
		case 14:
			RunEvent_ShadowOnly(director, enemyList, count);
			break;
		case 15:
			RunEvent_SlowWalkerOnly(director, enemyList, count);
			break;
		case 22:
			RunEvent_BigHeadSmallHead(director, enemyList, count);
			break;
		case 24:
			RunEvent_BeamerOnly(director, enemyList, count);
			break;
		}
	}

	private static void RunGroupEvent(int eventId, EnemyDirector director, List<EnemySetup> enemyList, int finalCount, int originalTarget)
	{
		switch (eventId)
		{
		case 2:
			RunEvent_DuckFlood(director, enemyList, finalCount, originalTarget);
			break;
		case 4:
			RunEvent_ExpressDelivery(director, enemyList, finalCount, originalTarget);
			break;
		case 6:
			RunEvent_BangFestival(director, enemyList, finalCount, originalTarget);
			break;
		case 7:
			RunEvent_ElsaLovers(director, enemyList, finalCount, originalTarget);
			break;
		case 8:
			RunEvent_TricycleCarol(director, enemyList, finalCount, originalTarget);
			break;
		case 10:
			RunEvent_VIPEscort(director, enemyList, finalCount, originalTarget);
			break;
		case 13:
			RunEvent_WhereShouldILook(director, enemyList, finalCount, originalTarget);
			break;
		case 16:
			RunEvent_BadBirthday(director, enemyList, finalCount, originalTarget);
			break;
		case 17:
			RunEvent_IronHeadTraining(director, enemyList, finalCount, originalTarget);
			break;
		case 18:
			RunEvent_DemolitionSquad(director, enemyList, finalCount, originalTarget);
			break;
		case 19:
			RunEvent_FloaterSpaceTrip(director, enemyList, finalCount, originalTarget);
			break;
		case 20:
			RunEvent_MasqueradeBall(director, enemyList, finalCount, originalTarget);
			break;
		case 21:
			RunEvent_Betrayal(director, enemyList, finalCount, originalTarget);
			break;
		case 23:
			RunEvent_HandsOff(director, enemyList, finalCount, originalTarget);
			break;
		case 25:
			RunEvent_SpineDisease(director, enemyList, finalCount, originalTarget);
			break;
		case 26:
			RunEvent_Lilliput(director, enemyList, finalCount, originalTarget);
			break;
		case 27:
			RunEvent_GamblingKills(director, enemyList, finalCount, originalTarget);
			break;
		case 3:
		case 5:
		case 9:
		case 11:
		case 12:
		case 14:
		case 15:
		case 22:
		case 24:
			break;
		}
	}

	private static void RunEvent_SpinnyOnly(EnemyDirector director, List<EnemySetup> enemyList, int count)
	{
		EnemySetup val = ((IEnumerable<EnemySetup>)director.enemiesDifficulty2).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("Spinny") && !((Object)e).name.Contains("2")));
		if (!((Object)(object)val == (Object)null))
		{
			enemyList.Clear();
			for (int i = 0; i < count; i++)
			{
				enemyList.Add(val);
			}
			MonsterParty.Log.LogInfo((object)$"[MonsterParty][Event1] 小赌怡情!Spinny x{count}");
		}
	}

	private static void RunEvent_DuckFlood(EnemyDirector director, List<EnemySetup> enemyList, int finalCount, int originalTarget)
	{
		EnemySetup val = ((IEnumerable<EnemySetup>)director.enemiesDifficulty3).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("4 Ducks")));
		EnemySetup val2 = ((IEnumerable<EnemySetup>)director.enemiesDifficulty1).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("Duck") && !((Object)e).name.Contains("4")));
		if ((Object)(object)val == (Object)null || (Object)(object)val2 == (Object)null)
		{
			MonsterParty.Log.LogWarning((object)"[MonsterParty][Event2] Duck Group or Single Duck NOT FOUND, fallback to normal");
			return;
		}
		enemyList.Clear();
		int num = Mathf.CeilToInt((float)finalCount / 3f);
		int num2 = finalCount - num;
		for (int i = 0; i < num; i++)
		{
			enemyList.Add(val);
		}
		for (int j = 0; j < num2; j++)
		{
			enemyList.Add(val2);
		}
		MonsterParty.Log.LogInfo((object)$"[MonsterParty][Event2] 鸭鸭泛滥(降密度)Group={num}, SingleDuck={num2}, Target={originalTarget}");
	}

	private static void RunEvent_OoglyOnly(EnemyDirector director, List<EnemySetup> enemyList, int count)
	{
		EnemySetup val = ((IEnumerable<EnemySetup>)director.enemiesDifficulty2).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("Oogly")));
		if ((Object)(object)val == (Object)null)
		{
			MonsterParty.Log.LogWarning((object)"[MonsterParty][Event3] Oogly NOT FOUND, fallback to normal");
			return;
		}
		enemyList.Clear();
		for (int i = 0; i < count; i++)
		{
			enemyList.Add(val);
		}
		MonsterParty.Log.LogInfo((object)$"[MonsterParty][Event3] 特工行动!Oogly x{count}");
	}

	private static void RunEvent_ExpressDelivery(EnemyDirector director, List<EnemySetup> enemyList, int finalCount, int originalTarget)
	{
		EnemySetup val = ((IEnumerable<EnemySetup>)director.enemiesDifficulty3).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("2 Hidden")));
		EnemySetup val2 = ((IEnumerable<EnemySetup>)director.enemiesDifficulty1).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("Hidden") && !((Object)e).name.Contains("2")));
		if ((Object)(object)val == (Object)null || (Object)(object)val2 == (Object)null)
		{
			MonsterParty.Log.LogWarning((object)"[MonsterParty][Event4] Hidden Group or Single NOT FOUND, fallback to normal");
			return;
		}
		enemyList.Clear();
		int num = Mathf.CeilToInt((float)(2 * finalCount) / 3f);
		int num2 = finalCount - num;
		for (int i = 0; i < num; i++)
		{
			enemyList.Add(val);
		}
		for (int j = 0; j < num2; j++)
		{
			enemyList.Add(val2);
		}
		MonsterParty.Log.LogInfo((object)$"[MonsterParty][Event4] 顺丰快递(Group)!HiddenGroup={num}, HiddenSingle={num2}, Target={originalTarget}");
	}

	private static void RunEvent_HunterOnly(EnemyDirector director, List<EnemySetup> enemyList, int count)
	{
		EnemySetup val = ((IEnumerable<EnemySetup>)director.enemiesDifficulty3).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("Hunter")));
		if ((Object)(object)val == (Object)null)
		{
			MonsterParty.Log.LogWarning((object)"[MonsterParty][Event5] Hunter NOT FOUND, fallback to normal");
			return;
		}
		enemyList.Clear();
		for (int i = 0; i < count; i++)
		{
			enemyList.Add(val);
		}
		MonsterParty.Log.LogInfo((object)$"[MonsterParty][Event5] 寂静之地!Hunter x{count}");
	}

	private static void RunEvent_BangFestival(EnemyDirector director, List<EnemySetup> enemyList, int finalCount, int originalTarget)
	{
		EnemySetup val = ((IEnumerable<EnemySetup>)director.enemiesDifficulty3).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("6 Bang")));
		EnemySetup val2 = ((IEnumerable<EnemySetup>)director.enemiesDifficulty1).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("Bang") && !((Object)e).name.Contains("6")));
		if ((Object)(object)val == (Object)null || (Object)(object)val2 == (Object)null)
		{
			MonsterParty.Log.LogWarning((object)"[MonsterParty][Event6] Bang Group or Single NOT FOUND, fallback to normal");
			return;
		}
		enemyList.Clear();
		int num = Mathf.CeilToInt((float)finalCount / 2f);
		int num2 = finalCount - num;
		for (int i = 0; i < num; i++)
		{
			enemyList.Add(val);
		}
		for (int j = 0; j < num2; j++)
		{
			enemyList.Add(val2);
		}
		MonsterParty.Log.LogInfo((object)$"[MonsterParty][Event6] 新年快乐(降密度)6BangGroup={num}, BangSingle={num2}, Target={originalTarget}");
	}

	private static void RunEvent_ElsaLovers(EnemyDirector director, List<EnemySetup> enemyList, int finalCount, int originalTarget)
	{
		EnemySetup val = ((IEnumerable<EnemySetup>)director.enemiesDifficulty3).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("3 Elsa")));
		if ((Object)(object)val == (Object)null)
		{
			MonsterParty.Log.LogWarning((object)"[MonsterParty][Event7] 3 Elsas Group NOT FOUND, fallback to normal");
			return;
		}
		enemyList.Clear();
		for (int i = 0; i < finalCount; i++)
		{
			enemyList.Add(val);
		}
		MonsterParty.Log.LogInfo((object)$"[MonsterParty][Event7] 爱狗人士!3 Elsas x{finalCount} (Target={originalTarget})");
	}

	private static void RunEvent_TricycleCarol(EnemyDirector director, List<EnemySetup> enemyList, int finalCount, int originalTarget)
	{
		EnemySetup val = ((IEnumerable<EnemySetup>)director.enemiesDifficulty3).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("3 Tricycle")));
		EnemySetup val2 = ((IEnumerable<EnemySetup>)director.enemiesDifficulty1).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("Tricycle") && !((Object)e).name.Contains("3")));
		if ((Object)(object)val == (Object)null || (Object)(object)val2 == (Object)null)
		{
			MonsterParty.Log.LogWarning((object)"[MonsterParty][Event8] Tricycle setups NOT FOUND, fallback to normal");
			return;
		}
		enemyList.Clear();
		int num = Mathf.CeilToInt((float)finalCount / 3f);
		int num2 = finalCount - num;
		for (int i = 0; i < num; i++)
		{
			enemyList.Add(val);
		}
		for (int j = 0; j < num2; j++)
		{
			enemyList.Add(val2);
		}
		MonsterParty.Log.LogInfo((object)$"[MonsterParty][Event8] 铃儿响叮当!Group={num}, Single={num2}, Target={originalTarget}");
	}

	private static void RunEvent_BowtieOnly(EnemyDirector director, List<EnemySetup> enemyList, int count)
	{
		EnemySetup val = ((IEnumerable<EnemySetup>)director.enemiesDifficulty2).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("Bowtie") && !((Object)e).name.Contains("3")));
		if ((Object)(object)val == (Object)null)
		{
			MonsterParty.Log.LogWarning((object)"[MonsterParty][Event9] Bowtie NOT FOUND, fallback to normal");
			return;
		}
		enemyList.Clear();
		for (int i = 0; i < count; i++)
		{
			enemyList.Add(val);
		}
		MonsterParty.Log.LogInfo((object)$"[MonsterParty][Event9] 北方呼呼从哪来?Bowtie x{count}");
	}

	private static void RunEvent_VIPEscort(EnemyDirector director, List<EnemySetup> enemyList, int finalCount, int originalTarget)
	{
		EnemySetup val = ((IEnumerable<EnemySetup>)director.enemiesDifficulty3).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("2 Spinny")));
		EnemySetup val2 = ((IEnumerable<EnemySetup>)director.enemiesDifficulty3).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("2 Hidden")));
		if ((Object)(object)val == (Object)null || (Object)(object)val2 == (Object)null)
		{
			MonsterParty.Log.LogWarning((object)"[MonsterParty][Event10] Spinny/Hidden Group NOT FOUND, fallback to normal");
			return;
		}
		enemyList.Clear();
		int num = Mathf.CeilToInt((float)finalCount / 2f);
		int num2 = finalCount - num;
		for (int i = 0; i < num; i++)
		{
			enemyList.Add(val);
		}
		for (int j = 0; j < num2; j++)
		{
			enemyList.Add(val2);
		}
		MonsterParty.Log.LogInfo((object)$"[MonsterParty][Event10] 专车护送!SpinnyGroup={num}, HiddenGroup={num2}, Target={originalTarget}");
	}

	private static void RunEvent_RobeOnly(EnemyDirector director, List<EnemySetup> enemyList, int count)
	{
		EnemySetup val = ((IEnumerable<EnemySetup>)director.enemiesDifficulty3).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("Robe")));
		if ((Object)(object)val == (Object)null)
		{
			MonsterParty.Log.LogWarning((object)"[MonsterParty][Event11] Robe NOT FOUND, fallback to normal");
			return;
		}
		enemyList.Clear();
		for (int i = 0; i < count; i++)
		{
			enemyList.Add(val);
		}
		MonsterParty.Log.LogInfo((object)$"[MonsterParty][Event11] 千与千寻!Robe x{count}");
	}

	private static void RunEvent_HeartHuggerOnly(EnemyDirector director, List<EnemySetup> enemyList, int count)
	{
		EnemySetup val = ((IEnumerable<EnemySetup>)director.enemiesDifficulty2).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("Heart Hugger") && !((Object)e).name.Contains("2")));
		if ((Object)(object)val == (Object)null)
		{
			MonsterParty.Log.LogWarning((object)"[MonsterParty][Event12] Heart Hugger NOT FOUND, fallback to normal");
			return;
		}
		enemyList.Clear();
		for (int i = 0; i < count; i++)
		{
			enemyList.Add(val);
		}
		MonsterParty.Log.LogInfo((object)$"[MonsterParty][Event12] 花粉症!Heart Hugger x{count}");
	}

	private static void RunEvent_WhereShouldILook(EnemyDirector director, List<EnemySetup> enemyList, int finalCount, int originalTarget)
	{
		EnemySetup val = ((IEnumerable<EnemySetup>)director.enemiesDifficulty3).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("4 Thin Men")));
		EnemySetup val2 = ((IEnumerable<EnemySetup>)director.enemiesDifficulty1).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("Ceiling Eye") && !((Object)e).name.Contains("4")));
		if ((Object)(object)val == (Object)null || (Object)(object)val2 == (Object)null)
		{
			MonsterParty.Log.LogWarning((object)"[MonsterParty][Event13] Thin Men Group or Ceiling Eye NOT FOUND, fallback to normal");
			return;
		}
		enemyList.Clear();
		int num = Mathf.CeilToInt((float)finalCount / 3f);
		int num2 = finalCount - num;
		for (int i = 0; i < num; i++)
		{
			enemyList.Add(val);
		}
		for (int j = 0; j < num2; j++)
		{
			enemyList.Add(val2);
		}
		MonsterParty.Log.LogInfo((object)$"[MonsterParty][Event13] 我该往哪看?ThinMenGroup={num}, CeilingEye={num2}, Target={originalTarget}");
	}

	private static void RunEvent_ShadowOnly(EnemyDirector director, List<EnemySetup> enemyList, int count)
	{
		EnemySetup val = ((IEnumerable<EnemySetup>)director.enemiesDifficulty3).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("Shadow")));
		if ((Object)(object)val == (Object)null)
		{
			MonsterParty.Log.LogWarning((object)"[MonsterParty][Event14] Shadow NOT FOUND, fallback to normal");
			return;
		}
		enemyList.Clear();
		for (int i = 0; i < count; i++)
		{
			enemyList.Add(val);
		}
		MonsterParty.Log.LogInfo((object)$"[MonsterParty][Event14] 掌声响起来!Shadow x{count}");
	}

	private static void RunEvent_SlowWalkerOnly(EnemyDirector director, List<EnemySetup> enemyList, int count)
	{
		EnemySetup val = ((IEnumerable<EnemySetup>)director.enemiesDifficulty3).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("Slow Walker")));
		if ((Object)(object)val == (Object)null)
		{
			MonsterParty.Log.LogWarning((object)"[MonsterParty][Event15] Slow Walker NOT FOUND, fallback to normal");
			return;
		}
		enemyList.Clear();
		for (int i = 0; i < count; i++)
		{
			enemyList.Add(val);
		}
		MonsterParty.Log.LogInfo((object)$"[MonsterParty][Event15] 地心引力!Slow Walker x{count}");
	}

	private static void RunEvent_BadBirthday(EnemyDirector director, List<EnemySetup> enemyList, int finalCount, int originalTarget)
	{
		EnemySetup val = ((IEnumerable<EnemySetup>)director.enemiesDifficulty3).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("3 Birthday")));
		EnemySetup val2 = ((IEnumerable<EnemySetup>)director.enemiesDifficulty2).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("Upscream") && !((Object)e).name.Contains("3")));
		if ((Object)(object)val == (Object)null || (Object)(object)val2 == (Object)null)
		{
			MonsterParty.Log.LogWarning((object)"[MonsterParty][Event16] Birthday Group or Upscream NOT FOUND, fallback to normal");
			return;
		}
		enemyList.Clear();
		int num = Mathf.CeilToInt((float)finalCount / 2f);
		int num2 = finalCount - num;
		for (int i = 0; i < num; i++)
		{
			enemyList.Add(val);
		}
		for (int j = 0; j < num2; j++)
		{
			enemyList.Add(val2);
		}
		MonsterParty.Log.LogInfo((object)$"[MonsterParty][Event16] 糟糕的生日!BirthdayGroup={num}, Upscream={num2}, Target={originalTarget}");
	}

	private static void RunEvent_IronHeadTraining(EnemyDirector director, List<EnemySetup> enemyList, int finalCount, int originalTarget)
	{
		EnemySetup val = ((IEnumerable<EnemySetup>)director.enemiesDifficulty3).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("5 Ticks")));
		EnemySetup val2 = ((IEnumerable<EnemySetup>)director.enemiesDifficulty1).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("Duck") && !((Object)e).name.Contains("4")));
		if ((Object)(object)val == (Object)null || (Object)(object)val2 == (Object)null)
		{
			MonsterParty.Log.LogWarning((object)"[MonsterParty][Event17] Tick Group or Single Duck NOT FOUND, fallback to normal");
			return;
		}
		enemyList.Clear();
		int num = Mathf.CeilToInt((float)finalCount / 2f);
		int num2 = finalCount - num;
		for (int i = 0; i < num; i++)
		{
			enemyList.Add(val);
		}
		for (int j = 0; j < num2; j++)
		{
			enemyList.Add(val2);
		}
		MonsterParty.Log.LogInfo((object)$"[MonsterParty][Event17] 铁头功训练!TickGroup={num}, Duck={num2}, Target={originalTarget}");
	}

	private static void RunEvent_DemolitionSquad(EnemyDirector director, List<EnemySetup> enemyList, int finalCount, int originalTarget)
	{
		EnemySetup val = ((IEnumerable<EnemySetup>)director.enemiesDifficulty3).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("10 Gnomes")));
		EnemySetup val2 = ((IEnumerable<EnemySetup>)director.enemiesDifficulty2).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("Animal") && !((Object)e).name.Contains("3")));
		if ((Object)(object)val == (Object)null || (Object)(object)val2 == (Object)null)
		{
			MonsterParty.Log.LogWarning((object)"[MonsterParty][Event18] Gnome Group or Animal NOT FOUND, fallback to normal");
			return;
		}
		enemyList.Clear();
		int num = Mathf.CeilToInt((float)finalCount / 4f);
		int num2 = finalCount - num;
		for (int i = 0; i < num; i++)
		{
			enemyList.Add(val);
		}
		for (int j = 0; j < num2; j++)
		{
			enemyList.Add(val2);
		}
		MonsterParty.Log.LogInfo((object)$"[MonsterParty][Event18] 拆迁大队(降密度)GnomeGroup={num}, Animal={num2}, Target={originalTarget}");
	}

	private static void RunEvent_FloaterSpaceTrip(EnemyDirector director, List<EnemySetup> enemyList, int finalCount, int originalTarget)
	{
		EnemySetup val = ((IEnumerable<EnemySetup>)director.enemiesDifficulty3).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("3 Floater")));
		EnemySetup val2 = ((IEnumerable<EnemySetup>)director.enemiesDifficulty3).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("2 Heart Hugger")));
		EnemySetup val3 = ((IEnumerable<EnemySetup>)director.enemiesDifficulty2).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("Floater") && !((Object)e).name.Contains("3")));
		if ((Object)(object)val == (Object)null || (Object)(object)val2 == (Object)null || (Object)(object)val3 == (Object)null)
		{
			MonsterParty.Log.LogWarning((object)"[MonsterParty][Event19] Floater / Heart Hugger setups NOT FOUND, fallback to normal");
			return;
		}
		enemyList.Clear();
		int num = Mathf.CeilToInt((float)finalCount / 3f);
		int num2 = num * 2;
		int num3 = finalCount - num2;
		for (int i = 0; i < num; i++)
		{
			enemyList.Add(val);
		}
		for (int j = 0; j < num; j++)
		{
			enemyList.Add(val2);
		}
		for (int k = 0; k < num3; k++)
		{
			enemyList.Add(val3);
		}
		MonsterParty.Log.LogInfo((object)$"[MonsterParty][Event19] 太空旅行!FloaterGroup={num}, HeartHuggerGroup={num}, FloaterSingle={num3}, Target={originalTarget}");
	}

	private static void RunEvent_MasqueradeBall(EnemyDirector director, List<EnemySetup> enemyList, int finalCount, int originalTarget)
	{
		EnemySetup val = ((IEnumerable<EnemySetup>)director.enemiesDifficulty3).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("4 Slow Mouth")));
		EnemySetup val2 = ((IEnumerable<EnemySetup>)director.enemiesDifficulty3).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("Runner")));
		if ((Object)(object)val == (Object)null || (Object)(object)val2 == (Object)null)
		{
			MonsterParty.Log.LogWarning((object)"[MonsterParty][Event20] Slow Mouth Group or Runner NOT FOUND, fallback to normal");
			return;
		}
		enemyList.Clear();
		int num = Mathf.CeilToInt((float)finalCount / 2f);
		int num2 = finalCount - num;
		for (int i = 0; i < num; i++)
		{
			enemyList.Add(val);
		}
		for (int j = 0; j < num2; j++)
		{
			enemyList.Add(val2);
		}
		MonsterParty.Log.LogInfo((object)$"[MonsterParty][Event20] 假面舞会!SlowMouthGroup={num}, Runner={num2}, Target={originalTarget}");
	}

	private static void RunEvent_Betrayal(EnemyDirector director, List<EnemySetup> enemyList, int finalCount, int originalTarget)
	{
		EnemySetup val = ((IEnumerable<EnemySetup>)director.enemiesDifficulty3).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("3 Head Grabbers")));
		EnemySetup val2 = ((IEnumerable<EnemySetup>)director.enemiesDifficulty1).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("Tick") && !((Object)e).name.Contains("5")));
		if ((Object)(object)val == (Object)null || (Object)(object)val2 == (Object)null)
		{
			MonsterParty.Log.LogWarning((object)"[MonsterParty][Event21] Head Grabber Group or Tick NOT FOUND, fallback to normal");
			return;
		}
		enemyList.Clear();
		int num = Mathf.CeilToInt((float)finalCount / 3f);
		int num2 = finalCount - num;
		for (int i = 0; i < num; i++)
		{
			enemyList.Add(val);
		}
		for (int j = 0; j < num2; j++)
		{
			enemyList.Add(val2);
		}
		MonsterParty.Log.LogInfo((object)$"[MonsterParty][Event21] 众叛亲离!HeadGrabberGroup={num}, Tick={num2}, Target={originalTarget}");
	}

	private static void RunEvent_BigHeadSmallHead(EnemyDirector director, List<EnemySetup> enemyList, int count)
	{
		EnemySetup val = ((IEnumerable<EnemySetup>)director.enemiesDifficulty3).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("Bomb Thrower")));
		EnemySetup val2 = ((IEnumerable<EnemySetup>)director.enemiesDifficulty2).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("Valuable Thrower") && !((Object)e).name.Contains("3")));
		if ((Object)(object)val == (Object)null || (Object)(object)val2 == (Object)null)
		{
			MonsterParty.Log.LogWarning((object)"[MonsterParty][Event22] Bomb Thrower or Valuable Thrower NOT FOUND, fallback to normal");
			return;
		}
		enemyList.Clear();
		int num = Mathf.CeilToInt((float)count / 2f);
		int num2 = count - num;
		for (int i = 0; i < num; i++)
		{
			enemyList.Add(val);
		}
		for (int j = 0; j < num2; j++)
		{
			enemyList.Add(val2);
		}
		MonsterParty.Log.LogInfo((object)$"[MonsterParty][Event22] 大头儿子小头爸爸!BombThrower={num}, ValuableThrower={num2}");
	}

	private static void RunEvent_HandsOff(EnemyDirector director, List<EnemySetup> enemyList, int finalCount, int originalTarget)
	{
		EnemySetup val = ((IEnumerable<EnemySetup>)director.enemiesDifficulty3).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("3 Elsa")));
		EnemySetup val2 = ((IEnumerable<EnemySetup>)director.enemiesDifficulty1).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("Elsa") && !((Object)e).name.Contains("3")));
		EnemySetup val3 = ((IEnumerable<EnemySetup>)director.enemiesDifficulty3).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("4 Ducks")));
		EnemySetup val4 = ((IEnumerable<EnemySetup>)director.enemiesDifficulty1).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("Duck") && !((Object)e).name.Contains("4")));
		if ((Object)(object)val == (Object)null || (Object)(object)val2 == (Object)null || (Object)(object)val3 == (Object)null || (Object)(object)val4 == (Object)null)
		{
			MonsterParty.Log.LogWarning((object)"[MonsterParty][Event23] Elsa/Duck setups NOT FOUND, fallback to normal");
			return;
		}
		enemyList.Clear();
		int num = Mathf.Max(1, Mathf.FloorToInt((float)finalCount / 4f));
		int num2 = num * 4;
		int num3 = finalCount - num2;
		for (int i = 0; i < num; i++)
		{
			enemyList.Add(val);
		}
		for (int j = 0; j < num; j++)
		{
			enemyList.Add(val2);
		}
		for (int k = 0; k < num; k++)
		{
			enemyList.Add(val3);
		}
		for (int l = 0; l < num; l++)
		{
			enemyList.Add(val4);
		}
		for (int m = 0; m < num3; m++)
		{
			enemyList.Add(val4);
		}
		MonsterParty.Log.LogInfo((object)$"[MonsterParty][Event23] 小手别乱摸!ElsaGroup={num}, Elsa={num}, DuckGroup={num}, Duck={num}, Extra={num3}, Target={originalTarget}");
	}

	private static void RunEvent_BeamerOnly(EnemyDirector director, List<EnemySetup> enemyList, int count)
	{
		EnemySetup val = ((IEnumerable<EnemySetup>)director.enemiesDifficulty3).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("Beamer")));
		if ((Object)(object)val == (Object)null)
		{
			MonsterParty.Log.LogWarning((object)"[MonsterParty][Event24] Beamer NOT FOUND, fallback to normal");
			return;
		}
		enemyList.Clear();
		for (int i = 0; i < count; i++)
		{
			enemyList.Add(val);
		}
		MonsterParty.Log.LogInfo((object)$"[MonsterParty][Event24] 激光派对!Beamer x{count}");
	}

	private static void RunEvent_SpineDisease(EnemyDirector director, List<EnemySetup> enemyList, int finalCount, int originalTarget)
	{
		EnemySetup val = ((IEnumerable<EnemySetup>)director.enemiesDifficulty3).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("4 Ceiling Eyes")));
		EnemySetup val2 = ((IEnumerable<EnemySetup>)director.enemiesDifficulty1).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("Ceiling Eye") && !((Object)e).name.Contains("4")));
		if ((Object)(object)val == (Object)null || (Object)(object)val2 == (Object)null)
		{
			MonsterParty.Log.LogWarning((object)"[MonsterParty][Event25] Ceiling Eye Group or Single NOT FOUND, fallback to normal");
			return;
		}
		enemyList.Clear();
		int num = Mathf.CeilToInt((float)finalCount / 4f);
		int num2 = finalCount - num;
		for (int i = 0; i < num; i++)
		{
			enemyList.Add(val);
		}
		for (int j = 0; j < num2; j++)
		{
			enemyList.Add(val2);
		}
		MonsterParty.Log.LogInfo((object)$"[MonsterParty][Event25] 脊椎病!CeilingEyeGroup={num}, Single={num2}, Target={originalTarget}");
	}

	private static void RunEvent_Lilliput(EnemyDirector director, List<EnemySetup> enemyList, int finalCount, int originalTarget)
	{
		EnemySetup val = ((IEnumerable<EnemySetup>)director.enemiesDifficulty3).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("10 Gnomes")));
		EnemySetup val2 = ((IEnumerable<EnemySetup>)director.enemiesDifficulty3).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("6 Bangs")));
		EnemySetup val3 = ((IEnumerable<EnemySetup>)director.enemiesDifficulty1).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("Duck") && !((Object)e).name.Contains("4")));
		EnemySetup val4 = ((IEnumerable<EnemySetup>)director.enemiesDifficulty1).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("Elsa") && !((Object)e).name.Contains("3")));
		if ((Object)(object)val == (Object)null || (Object)(object)val2 == (Object)null || (Object)(object)val3 == (Object)null || (Object)(object)val4 == (Object)null)
		{
			MonsterParty.Log.LogWarning((object)"[MonsterParty][Event26] Gnome/Bang/Duck/Elsa setups NOT FOUND, fallback to normal");
			return;
		}
		enemyList.Clear();
		int num = Mathf.Max(1, Mathf.FloorToInt((float)finalCount / 4f));
		int num2 = num * 4;
		int num3 = finalCount - num2;
		for (int i = 0; i < num; i++)
		{
			enemyList.Add(val);
		}
		for (int j = 0; j < num; j++)
		{
			enemyList.Add(val2);
		}
		for (int k = 0; k < num; k++)
		{
			enemyList.Add(val3);
		}
		for (int l = 0; l < num; l++)
		{
			enemyList.Add(val4);
		}
		for (int m = 0; m < num3; m++)
		{
			enemyList.Add(val3);
		}
		MonsterParty.Log.LogInfo((object)$"[MonsterParty][Event26] 小人国(四段)GnomeGroup={num}, BangGroup={num}, Duck={num + num3}, Elsa={num}, Target={originalTarget}");
	}

	private static void RunEvent_GamblingKills(EnemyDirector director, List<EnemySetup> enemyList, int finalCount, int originalTarget)
	{
		EnemySetup val = ((IEnumerable<EnemySetup>)director.enemiesDifficulty3).FirstOrDefault((Func<EnemySetup, bool>)((EnemySetup e) => ((Object)e).name.Contains("2 Spinny")));
		if ((Object)(object)val == (Object)null)
		{
			MonsterParty.Log.LogWarning((object)"[MonsterParty][Event27] 2 Spinny Group NOT FOUND, fallback to normal");
			return;
		}
		enemyList.Clear();
		for (int i = 0; i < finalCount; i++)
		{
			enemyList.Add(val);
		}
		MonsterParty.Log.LogInfo((object)$"[MonsterParty][Event27] 大赌伤身!2 Spinny x{finalCount} (Target={originalTarget})");
	}
}
[HarmonyPatch(typeof(EnemyParent))]
[HarmonyPatch("Despawn")]
public static class Patch_MonsterParty_EnemySpeedGrowth
{
	private static void Postfix(EnemyParent __instance)
	{
		if (SemiFunc.IsMasterClientOrSingleplayer())
		{
			int levelsCompleted = RunManager.instance.levelsCompleted;
			float num = 1f - (float)levelsCompleted * 0.0125f;
			num = Mathf.Clamp(num, 0.5f, 1f);
			__instance.DespawnedTimer *= num;
		}
	}
}