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;
}
}
}