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)
{
}
}
}