Decompiled source of EnemyRandomizer v1.1.0

EnemyRandomizer.dll

Decompiled 13 hours ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using LBoL.Base;
using LBoL.Base.Extensions;
using LBoL.ConfigData;
using LBoL.Core;
using LBoL.Core.Stations;
using LBoL.Core.Units;
using LBoL.EntityLib.EnemyUnits.Character;
using LBoL.EntityLib.EnemyUnits.Normal;
using LBoL.EntityLib.EnemyUnits.Normal.Bats;
using LBoL.EntityLib.EnemyUnits.Normal.Drones;
using LBoL.EntityLib.EnemyUnits.Normal.Guihuos;
using LBoL.EntityLib.EnemyUnits.Normal.Maoyus;
using LBoL.EntityLib.EnemyUnits.Normal.Ravens;
using LBoL.EntityLib.EnemyUnits.Normal.Shenlings;
using LBoL.EntityLib.EnemyUnits.Normal.Yinyangyus;
using LBoLEntitySideloader;
using LBoLEntitySideloader.Attributes;
using LBoLEntitySideloader.Entities;
using LBoLEntitySideloader.Resource;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: IgnoresAccessChecksTo("LBoL.Base")]
[assembly: IgnoresAccessChecksTo("LBoL.ConfigData")]
[assembly: IgnoresAccessChecksTo("LBoL.Core")]
[assembly: IgnoresAccessChecksTo("LBoL.EntityLib")]
[assembly: IgnoresAccessChecksTo("LBoL.Presentation")]
[assembly: IgnoresAccessChecksTo("Untitled.ConfigDataBuilder.Base")]
[assembly: AssemblyCompany("EnemyRandomizer")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+cb7687403ef8c0b4ff8beaec9afff3bb6053c7b4")]
[assembly: AssemblyProduct("EnemyRandomizer")]
[assembly: AssemblyTitle("EnemyRandomizer")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace EnemyRandomizer
{
	[BepInPlugin("cramps-enemyrandomizer", "EnemyRandomizer", "1.1.0")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInProcess("LBoL.exe")]
	public class BepinexPlugin : BaseUnityPlugin
	{
		private static readonly Harmony harmony = PInfo.harmony;

		internal static ManualLogSource log;

		internal static TemplateSequenceTable sequenceTable = new TemplateSequenceTable(0);

		internal static IResourceSource embeddedSource = (IResourceSource)new EmbeddedSource(Assembly.GetExecutingAssembly());

		internal static DirectorySource directorySource = new DirectorySource("cramps-enemyrandomizer", "");

		internal static BatchLocalization jadeboxLoc = new BatchLocalization((IResourceSource)(object)directorySource, typeof(JadeBoxTemplate), "jadebox", (Locale)0, false);

		private void Awake()
		{
			log = ((BaseUnityPlugin)this).Logger;
			Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject);
			((Object)((Component)this).gameObject).hideFlags = (HideFlags)61;
			EntityManager.RegisterSelf();
			harmony.PatchAll();
		}

		private void OnDestroy()
		{
			if (harmony != null)
			{
				harmony.UnpatchSelf();
			}
		}
	}
	public static class PInfo
	{
		public const string GUID = "cramps-enemyrandomizer";

		public const string Name = "EnemyRandomizer";

		public const string version = "1.1.0";

		public static readonly Harmony harmony = new Harmony("cramps-enemyrandomizer");
	}
	[HarmonyPatch]
	internal class EnemyRandomizer
	{
		private const int MAX_ROLLS = 25;

		private static Dictionary<string, int> actWeights = new Dictionary<string, int>
		{
			{ "1-1", 40 },
			{ "1-2", 50 },
			{ "1-3", 60 },
			{ "1-e", 80 },
			{ "2-1", 90 },
			{ "2-2", 105 },
			{ "2-3", 120 },
			{ "2-e", 160 },
			{ "3-1", 175 },
			{ "3-2", 200 },
			{ "3-3", 225 },
			{ "3-e", 300 }
		};

		private static Dictionary<Type, int> enemyWeights = new Dictionary<Type, int>
		{
			{
				typeof(WhiteFairy),
				30
			},
			{
				typeof(RavenWen),
				15
			},
			{
				typeof(RavenGuo),
				15
			},
			{
				typeof(GuihuoBlue),
				15
			},
			{
				typeof(GuihuoGreen),
				15
			},
			{
				typeof(GuihuoRed),
				25
			},
			{
				typeof(SickGirl),
				20
			},
			{
				typeof(YinyangyuRed),
				25
			},
			{
				typeof(YinyangyuBlue),
				25
			},
			{
				typeof(DollBlue),
				50
			},
			{
				typeof(DollPurple),
				50
			},
			{
				typeof(FraudRabbit),
				25
			},
			{
				typeof(BlackFairy),
				50
			},
			{
				typeof(Bat),
				20
			},
			{
				typeof(MaoyuBlue),
				10
			},
			{
				typeof(Maoyu),
				10
			},
			{
				typeof(MaoyuRed),
				15
			},
			{
				typeof(MaoyuBlack),
				25
			},
			{
				typeof(Luna),
				30
			},
			{
				typeof(Star),
				30
			},
			{
				typeof(Aya),
				60
			},
			{
				typeof(Rin),
				60
			},
			{
				typeof(Purifier),
				45
			},
			{
				typeof(Scout),
				45
			},
			{
				typeof(WaterGirl),
				90
			},
			{
				typeof(Yaoshi),
				45
			},
			{
				typeof(Fox),
				150
			},
			{
				typeof(BatLord),
				50
			},
			{
				typeof(HetongKailang),
				30
			},
			{
				typeof(HetongYinchen),
				20
			},
			{
				typeof(ShenlingPurple),
				30
			},
			{
				typeof(ShenlingWhite),
				30
			},
			{
				typeof(Nitori),
				120
			},
			{
				typeof(Youmu),
				120
			},
			{
				typeof(Kokoro),
				120
			},
			{
				typeof(YaTiangou),
				120
			},
			{
				typeof(LangTiangou),
				130
			},
			{
				typeof(LoveGirl),
				150
			},
			{
				typeof(Terminator),
				100
			},
			{
				typeof(HardworkRabbit),
				150
			},
			{
				typeof(LazyRabbit),
				150
			},
			{
				typeof(KanakoLimao),
				120
			},
			{
				typeof(SuwakoLimao),
				100
			},
			{
				typeof(Clownpiece),
				225
			},
			{
				typeof(Siji),
				225
			},
			{
				typeof(Doremy),
				225
			}
		};

		[HarmonyPatch(typeof(BattleStation), "OnEnter")]
		private static void Postfix(BattleStation __instance)
		{
			//IL_0407: Unknown result type (might be due to invalid IL or missing references)
			//IL_0411: Expected O, but got Unknown
			//IL_0445: Unknown result type (might be due to invalid IL or missing references)
			//IL_0451: Unknown result type (might be due to invalid IL or missing references)
			//IL_0479: Unknown result type (might be due to invalid IL or missing references)
			//IL_0483: Expected O, but got Unknown
			if (!(__instance is EnemyStation) && !(__instance is EliteEnemyStation))
			{
				BepinexPlugin.log.LogInfo((object)"Not enemy or elite station");
				return;
			}
			if (!((Station)__instance).GameRun.HasJadeBox<EnemyRandomizerJadebox>())
			{
				BepinexPlugin.log.LogInfo((object)"Jadebox not enabled");
				return;
			}
			BepinexPlugin.log.LogInfo((object)("Act: " + ((Station)__instance).Stage.Level + " - Act section: " + ((Station)__instance).Act));
			int maxActWeight = GetActWeight(((Station)__instance).Stage.Level, ((Station)__instance).Act, __instance is EliteEnemyStation);
			BepinexPlugin.log.LogInfo((object)("Max Act weight: " + maxActWeight));
			List<List<(Type, int)>> list = new List<List<(Type, int)>>();
			do
			{
				List<(Type, int)> list2 = new List<(Type, int)>();
				int firstEnemyMinWeight = ((Station)__instance).GameRun.StationRng.NextInt(0, maxActWeight);
				int num = ((Station)__instance).GameRun.StationRng.NextInt(3, 5);
				BepinexPlugin.log.LogInfo((object)("First enemy min weight: " + firstEnemyMinWeight + " - max enemies: " + num));
				do
				{
					KeyValuePair<Type, int> keyValuePair = CollectionsExtensions.SampleOrDefault<KeyValuePair<Type, int>>(enemyWeights.Where((KeyValuePair<Type, int> w) => w.Value >= firstEnemyMinWeight && w.Value <= maxActWeight), ((Station)__instance).GameRun.StationRng);
					firstEnemyMinWeight = 0;
					if (!(keyValuePair.Key == null))
					{
						list2.Add((keyValuePair.Key, keyValuePair.Value));
						BepinexPlugin.log.LogInfo((object)("chosen cand: " + keyValuePair.Key?.ToString() + " - " + keyValuePair.Value + " - sum: " + list2.Sum(((Type, int) c) => c.Item2)));
					}
				}
				while (list2.Sum(((Type, int) c) => c.Item2) < maxActWeight && list2.Count < num);
				if (list2.Sum(((Type, int) c) => c.Item2) > maxActWeight)
				{
					(Type, int) tuple = list2.Last();
					ManualLogSource log = BepinexPlugin.log;
					(Type, int) tuple2 = tuple;
					log.LogInfo((object)("To remove: " + tuple2.ToString()));
					list2.Remove(tuple);
				}
				BepinexPlugin.log.LogInfo((object)("Total weight: " + list2.Sum(((Type, int) c) => c.Item2)));
				BepinexPlugin.log.LogInfo((object)"===Added enemy group===");
				list.Add(list2);
			}
			while (list.Count < 25);
			List<EntrySource> list3 = new List<EntrySource>();
			int num2 = 4;
			foreach (var (type, num3) in CollectionsExtensions.Sample<List<(Type, int)>>(list.OrderByDescending((List<(Type, int)> e) => e.Sum(((Type, int) e2) => e2.Item2)).Take(5), ((Station)__instance).GameRun.StationRng))
			{
				list3.Add(new EntrySource(type, num2));
				num2--;
			}
			EnemyGroup enemyGroup = __instance.EnemyGroup;
			__instance.EnemyGroup = new EnemyGroup(enemyGroup.Id, (IEnumerable<EntrySource>)list3, enemyGroup.EnemyType, "Five", enemyGroup.PlayerRootV2, enemyGroup.PreBattleDialogName, enemyGroup.PostBattleDialogName, enemyGroup.Hidden, enemyGroup.DebutTime, enemyGroup.Environment);
			foreach (EnemyUnit item in __instance.EnemyGroup)
			{
				((Unit)item).EnterGameRun(((Station)__instance).GameRun);
			}
		}

		private static int GetActWeight(int act, int actSection, bool isElite)
		{
			return isElite ? actWeights[act + "-e"] : actWeights[act + "-" + actSection];
		}
	}
	public sealed class EnemyRandomizerJadeboxDef : JadeBoxTemplate
	{
		public override IdContainer GetId()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			return IdContainer.op_Implicit("EnemyRandomizerJadebox");
		}

		public override LocalizationOption LoadLocalization()
		{
			return (LocalizationOption)(object)BepinexPlugin.jadeboxLoc.AddEntity((EntityDefinition)(object)this);
		}

		public override JadeBoxConfig MakeConfig()
		{
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Expected O, but got Unknown
			return new JadeBoxConfig(0, "", 10, (IReadOnlyList<string>)new List<string>(), (int?)null, (int?)null, (int?)null, (ManaGroup?)null, (Keyword)0, (IReadOnlyList<string>)new List<string>(), (IReadOnlyList<string>)new List<string>());
		}
	}
	[EntityLogic(typeof(EnemyRandomizerJadeboxDef))]
	public sealed class EnemyRandomizerJadebox : JadeBox
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
	internal sealed class IgnoresAccessChecksToAttribute : Attribute
	{
		internal IgnoresAccessChecksToAttribute(string assemblyName)
		{
		}
	}
}