Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of MonsterParty v1.0.4
Repo_MonsterParty.dll
Decompiled 5 months agousing 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.3")] [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), 22); 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); f_Total.Invoke(__instance) = list.Count; 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); } f_Total.Invoke(__instance) = 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.enemiesDifficulty2).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 Bangs"))); EnemySetup val2 = ((IEnumerable<EnemySetup>)director.enemiesDifficulty2).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; } } }