using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Reflection.Emit; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using JetBrains.Annotations; using LBoL.Base; using LBoL.Base.Extensions; using LBoL.ConfigData; using LBoL.Core; using LBoL.Core.Randoms; using LBoL.Core.SaveData; using LBoL.Core.Stations; using LBoL.Core.Units; using LBoL.EntityLib.Adventures; using LBoL.EntityLib.Adventures.Common; using LBoL.EntityLib.Adventures.FirstPlace; using LBoL.EntityLib.Adventures.Shared12; using LBoL.EntityLib.Adventures.Shared23; using LBoL.EntityLib.Adventures.Stage1; using LBoL.EntityLib.Adventures.Stage2; using LBoL.EntityLib.Adventures.Stage3; using LBoL.EntityLib.Stages.NormalStages; using LBoL.Presentation.I10N; using LBoL.Presentation.UI; using LBoL.Presentation.UI.ExtraWidgets; using LBoL.Presentation.UI.Panels; using LBoL.Presentation.UI.Widgets; using LBoLEntitySideloader; using LBoLEntitySideloader.Attributes; using LBoLEntitySideloader.Entities; using LBoLEntitySideloader.Resource; using StsMap.Localization; using StsMap.Source.Stages; using TMPro; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.Events; using UnityEngine.UI; [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("StsMap")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+63bb43836485913cc63a15595b88247f3a0c34ff")] [assembly: AssemblyProduct("StsMap")] [assembly: AssemblyTitle("StsMap")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] namespace StsMap { [BepInPlugin("valon.misc.StsMap", "StsMap", "1.0.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInProcess("LBoL.exe")] public class BepinexPlugin : BaseUnityPlugin { public static string modUniqueID = "StsMap"; private static readonly Harmony harmony = PInfo.harmony; internal static ManualLogSource log; internal static IResourceSource embeddedSource = (IResourceSource)new EmbeddedSource(Assembly.GetExecutingAssembly()); internal static DirectorySource directorySource = new DirectorySource("valon.misc.StsMap", ""); public static ConfigEntry VisionRangeConfig; public static ConfigEntry HideBossConfig; private void Awake() { log = ((BaseUnityPlugin)this).Logger; Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject); ((Object)((Component)this).gameObject).hideFlags = (HideFlags)61; VisionRangeConfig = ((BaseUnityPlugin)this).Config.Bind("FogOfWar", "VisionRange", 2, "Number of nodes you can see ahead in Fog of War. Values less than 0 will be treated as 0."); HideBossConfig = ((BaseUnityPlugin)this).Config.Bind("FogOfWar", "HideBoss", true, "If true, the boss node at the end of the map is also hidden until you are within vision range."); EntityManager.RegisterSelf(); harmony.PatchAll(); } private void OnDestroy() { if (harmony != null) { harmony.UnpatchSelf(); } } } public static class PInfo { public const string GUID = "valon.misc.StsMap"; public const string Name = "StsMap"; public const string version = "1.0.0"; public static readonly Harmony harmony = new Harmony("valon.misc.StsMap"); } } namespace StsMap.Localization { public sealed class StsMapLocalization { public static string Jadeboxes = "jadeboxes"; public static BatchLocalization jadeboxLoc = new BatchLocalization((IResourceSource)(object)BepinexPlugin.directorySource, typeof(JadeBoxTemplate), Jadeboxes, (Locale)0, false); public static void Init() { jadeboxLoc.DiscoverAndLoadLocFiles(Jadeboxes); } } } namespace StsMap.Source.Stages { public sealed class BambooForestStSDef : StageTemplate { 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("BambooForestStS"); } public override StageConfig MakeConfig() { //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Expected O, but got Unknown return new StageConfig("BambooForestStS", "BambooForest0", "BambooForest1", 1, "BambooForest2", 6, "BambooForest3", 11, "", 16); } } [EntityLogic(typeof(BambooForestStSDef))] public sealed class BambooForestStS : StSStageBase { private const float W = 1.2f; private const string ForceSanyueFlag = "ForceSanyue"; private const string Force11Flag = "Force11"; private const string Force14Flag = "Force14"; private const string Force17Flag = "Force17"; public BambooForestStS() { ((Stage)this).Level = 1; ((Stage)this).CardUpgradedChance = 0f; ((Stage)this).IsSelectingBoss = true; UniqueRandomPool obj = new UniqueRandomPool(true); obj.Add("11", 1f); obj.Add("12", 1f); obj.Add("13", 1f); ((Stage)this).EnemyPoolAct1 = obj; UniqueRandomPool obj2 = new UniqueRandomPool(true); obj2.Add("14", 1f); obj2.Add("15", 1f); obj2.Add("16", 1f); ((Stage)this).EnemyPoolAct2 = obj2; UniqueRandomPool obj3 = new UniqueRandomPool(true); obj3.Add("17", 1f); obj3.Add("18", 1f); obj3.Add("19", 1f); ((Stage)this).EnemyPoolAct3 = obj3; UniqueRandomPool obj4 = new UniqueRandomPool(true); obj4.Add("Sanyue", 1f); obj4.Add("Aya", 1f); obj4.Add("Rin", 1f); ((Stage)this).EliteEnemyPool = obj4; UniqueRandomPool val = new UniqueRandomPool(true); val.Add(typeof(YorigamiSisters), 1f); val.Add(typeof(HecatiaTshirt), 1f); val.Add(typeof(KeineSales), 1f); val.Add(typeof(MikeInvest), 1f); val.Add(typeof(YoumuDelivery), 1f); val.Add(typeof(AssistKagerou), 1.2f); val.Add(typeof(EternityAscension), 1.2f); val.Add(typeof(KaguyaVersusMokou), 1.2f); val.Add(typeof(MystiaBbq), 1.2f); val.Add(typeof(ParseeJealousy), 1.2f); val.Add(typeof(RumiaDriving), 1.2f); val.Add(typeof(TewiThreat), 1.2f); ((Stage)this).AdventurePool = val; } public override void InitExtraFlags(ProfileSaveData userProfile) { if (!userProfile.EnemyGroupRevealed.Contains("Sanyue")) { ((Stage)this).ExtraFlags.Add("ForceSanyue"); } if (!userProfile.EnemyGroupRevealed.Contains("11")) { ((Stage)this).ExtraFlags.Add("Force11"); } if (!userProfile.EnemyGroupRevealed.Contains("14")) { ((Stage)this).ExtraFlags.Add("Force14"); } if (!userProfile.EnemyGroupRevealed.Contains("17")) { ((Stage)this).ExtraFlags.Add("Force17"); } } public override EnemyGroupEntry GetEnemies(Station station) { switch (station.Act) { case 1: if (((Stage)this).ExtraFlags.Contains("Force11")) { ((Stage)this).ExtraFlags.Remove("Force11"); ((Stage)this).EnemyPoolAct1.Remove("11", false); return Library.GetEnemyGroupEntry("11"); } break; case 2: if (((Stage)this).ExtraFlags.Contains("Force14")) { ((Stage)this).ExtraFlags.Remove("Force14"); ((Stage)this).EnemyPoolAct2.Remove("14", false); return Library.GetEnemyGroupEntry("14"); } break; case 3: if (((Stage)this).ExtraFlags.Contains("Force17")) { ((Stage)this).ExtraFlags.Remove("Force17"); ((Stage)this).EnemyPoolAct3.Remove("17", false); return Library.GetEnemyGroupEntry("17"); } break; } return ((Stage)this).GetEnemies(station); } public override EnemyGroupEntry GetEliteEnemies(Station station) { if (((Stage)this).ExtraFlags.Contains("ForceSanyue")) { ((Stage)this).ExtraFlags.Remove("ForceSanyue"); ((Stage)this).EliteEnemyPool.Remove("Sanyue", false); return Library.GetEnemyGroupEntry("Sanyue"); } if (station.Act == 1) { string text = ((Stage)this).EliteEnemyPool.Without("Aya").Sample(((GameEntity)this).GameRun.StationRng); ((Stage)this).EliteEnemyPool.Remove(text, false); return Library.GetEnemyGroupEntry(text); } return ((Stage)this).GetEliteEnemies(station); } } public class StsGameMap { private const int XLandmark1 = 5; private const int XLandmark2 = 10; private const int XGap = 15; private const int XBoss = 16; private const int MapWidth = 8; private const int MapLevels = 17; private static int GetAct(int x) { if (x <= 5) { return 1; } if (x <= 10) { return 2; } return 3; } public static GameMap CreateStSStyleMap(RandomGen rng, [CanBeNull] string bossId, bool isSelectingBoss) { //IL_01a6: Unknown result type (might be due to invalid IL or missing references) //IL_01ad: Expected O, but got Unknown //IL_01bb: Unknown result type (might be due to invalid IL or missing references) //IL_01c0: Unknown result type (might be due to invalid IL or missing references) //IL_01cd: Expected O, but got Unknown //IL_01e3: Unknown result type (might be due to invalid IL or missing references) //IL_01e8: Unknown result type (might be due to invalid IL or missing references) //IL_0242: Unknown result type (might be due to invalid IL or missing references) //IL_0247: Unknown result type (might be due to invalid IL or missing references) //IL_0254: Expected O, but got Unknown //IL_0264: Unknown result type (might be due to invalid IL or missing references) //IL_0269: Unknown result type (might be due to invalid IL or missing references) //IL_0277: Expected O, but got Unknown //IL_01fc: Expected O, but got Unknown //IL_020e: Unknown result type (might be due to invalid IL or missing references) //IL_0213: Unknown result type (might be due to invalid IL or missing references) //IL_0220: Expected O, but got Unknown int num = 48 + rng.NextInt(-2, 2); int num2 = rng.NextInt(7, 9); int num3 = rng.NextInt(3, num2 - 3); int num4 = num2 - num3; if (num4 < 3) { num4 = 3; num3 = num2 - 3; } if (num3 < 3) { num3 = 3; num4 = num2 - 3; } int num5 = rng.NextInt(1, 2); int num6 = rng.NextInt(2, 4); int num7 = rng.NextInt(2, 4); int num8 = num5 + num6 + num7; int val = num - num2 - num8; val = Math.Max(val, 0); int num9 = Mathf.RoundToInt((float)val * 0.4f); int num10 = val - num9; List list = new List(); for (int i = 0; i < num3; i++) { list.Add((StationType)4); } for (int j = 0; j < num4; j++) { list.Add((StationType)5); } for (int k = 0; k < num6 + num7; k++) { list.Add((StationType)2); } for (int l = 0; l < num9; l++) { list.Add((StationType)6); } for (int m = 0; m < num10; m++) { list.Add((StationType)1); } CollectionsExtensions.Shuffle((IList)list, rng); List list2 = new List(); for (int n = 0; n < num5; n++) { list2.Add((StationType)2); } list2.Add((StationType)1); list2.Add((StationType)6); list2.Add((StationType)1); list2.Add((StationType)1); CollectionsExtensions.Shuffle((IList)list2, rng); GameMap val2 = new GameMap(17, 8, (UiType)2, bossId); val2.Nodes[0, 0] = new MapNode(val2, 0, 0, 1) { StationType = (StationType)7 }; for (int num11 = 1; num11 < 8; num11++) { val2.Nodes[5, num11] = new MapNode(val2, 5, num11, 1) { StationType = (StationType)(isSelectingBoss ? 8 : 9) }; val2.Nodes[10, num11] = new MapNode(val2, 10, num11, 2) { StationType = (StationType)3 }; } val2.Nodes[15, 0] = new MapNode(val2, 15, 0, 3) { StationType = (StationType)4 }; val2.Nodes[16, 0] = new MapNode(val2, 16, 0, 3) { StationType = (StationType)10 }; List<(int, int, int)> edges = new List<(int, int, int)>(); int num12 = rng.NextInt(3, 4); List list3 = Enumerable.Range(1, 7).ToList(); CollectionsExtensions.Shuffle((IList)list3, rng); list3 = list3.Take(num12).ToList(); foreach (int item in list3) { val2.Nodes[0, 0].FollowerList.Add(item); } foreach (int item2 in list3) { WalkHallway(val2, edges, rng, 1, 4, 0, 0, item2, 5); } WalkFromLandmark(val2, edges, rng, 5, 6, 9, 10); WalkFromLandmark(val2, edges, rng, 10, 11, 14, 15); ConvergeToSingle(val2, edges, 14, 15, 0); val2.Nodes[15, 0].FollowerList.Add(0); AssignTypesToHallway(val2, rng, 1, 4, list2, list, isH1: true); AssignTypesToHallway(val2, rng, 6, 9, list, null, isH1: false); AssignTypesToHallway(val2, rng, 11, 14, list, null, isH1: false); BepinexPlugin.log.LogInfo((object)$"Remaining in bucket: {list.Count}"); int count = list.Count; int num13 = count / 3; int num14 = count % 3; PepperNodes(val2, edges, rng, list, 1, 4, 1, isH1: true, num13); PepperNodes(val2, edges, rng, list, 6, 9, 2, isH1: false, num13); PepperNodes(val2, edges, rng, list, 11, 14, 3, isH1: false, num13 + num14); AddCrossConnections(val2, edges, rng, 1, 4); AddCrossConnections(val2, edges, rng, 6, 9); AddCrossConnections(val2, edges, rng, 11, 14); SweepAndPruneOrphans(val2, edges); val2.StartNode = val2.Nodes[0, 0]; val2.StartNode.Status = (MapNodeStatus)1; MapNode bossNode = (val2.EndNode = val2.Nodes[16, 0]); val2.BossNode = bossNode; LogMapShape(val2, num12); return val2; } private static void LogMapShape(GameMap map, int pathCount) { BepinexPlugin.log.LogInfo((object)"=================== MAP SHAPE DIAGNOSTICS ==================="); int num = 0; int num2 = 0; int num3 = 0; int num4 = 0; int[] array = new int[17]; for (int i = 0; i < 17; i++) { int num5 = 0; for (int j = 0; j < 8; j++) { if (map.Nodes[i, j] != null) { num5++; num4++; if (i <= 5) { num++; } else if (i <= 10) { num2++; } else { num3++; } } } array[i] = num5; } BepinexPlugin.log.LogInfo((object)$"Initial Path Count: {pathCount}"); BepinexPlugin.log.LogInfo((object)$"Total Nodes in Grid: {num4}"); BepinexPlugin.log.LogInfo((object)$"Act 1 Nodes (Columns 0-{5}): {num}"); BepinexPlugin.log.LogInfo((object)$"Act 2 Nodes (Columns {6}-{10}): {num2}"); BepinexPlugin.log.LogInfo((object)$"Act 3 Nodes (Columns {11}+): {num3}"); string text = "Nodes per Column: "; for (int k = 0; k < 17; k++) { text += $"[X{k}:{array[k]}] "; } BepinexPlugin.log.LogInfo((object)text); BepinexPlugin.log.LogInfo((object)"Visual Grid Profile:"); for (int l = 0; l < 8; l++) { string text2 = $"Y={l} | "; for (int m = 0; m < 17; m++) { text2 += ((map.Nodes[m, l] != null) ? "O " : ". "); } BepinexPlugin.log.LogInfo((object)text2); } BepinexPlugin.log.LogInfo((object)"============================================================="); } private static void WalkHallway(GameMap map, List<(int x, int fromY, int toY)> edges, RandomGen rng, int xStart, int xEnd, int entryX, int entryY, int startY, int landmarkX) { int num = startY; EnsureNode(map, xStart, num, GetAct(xStart)); TryAddEdge(map, edges, entryX, entryY, xStart, num); for (int i = xStart; i < xEnd; i++) { bool flag = false; List list = new List { num - 1, num, num + 1 }; CollectionsExtensions.Shuffle((IList)list, rng); foreach (int item in list) { int num2 = ClampY(i + 1, item); EnsureNode(map, i + 1, num2, GetAct(i + 1)); if (TryAddEdge(map, edges, i, num, i + 1, num2)) { num = num2; flag = true; break; } } if (!flag) { break; } } if (landmarkX == 15 || landmarkX == 16) { TryAddEdge(map, edges, xEnd, num, landmarkX, 0); } else { TryAddEdge(map, edges, xEnd, num, landmarkX, num); } } private static void WalkFromLandmark(GameMap map, List<(int x, int fromY, int toY)> edges, RandomGen rng, int landmarkX, int xHallStart, int xHallEnd, int nextLandmarkX) { int num = ((landmarkX != 0 && landmarkX != 15 && landmarkX != 16) ? 1 : 0); int y; for (y = num; y < 8; y++) { MapNode val = map.Nodes[landmarkX, y]; if (val != null && edges.Any(((int x, int fromY, int toY) e) => e.x == landmarkX - 1 && e.toY == y)) { WalkHallway(map, edges, rng, xHallStart, xHallEnd, landmarkX, y, y, nextLandmarkX); } } } private static void ConvergeToSingle(GameMap map, List<(int x, int fromY, int toY)> edges, int xFrom, int xTo, int toY) { List list = new List(); for (int i = 1; i < 8; i++) { if (map.Nodes[xFrom, i] != null) { list.Add(i); } } if (list.Count == 1) { int num = list[0]; int num2 = ((num + 1 < 8) ? (num + 1) : (num - 1)); EnsureNode(map, xFrom, num2, GetAct(xFrom)); list.Add(num2); for (int j = 1; j < 8 && (map.Nodes[xFrom - 1, j] == null || !TryAddEdge(map, edges, xFrom - 1, j, xFrom, num2)); j++) { } } foreach (int item in list) { TryAddEdge(map, edges, xFrom, item, xTo, toY); } } private static void AssignTypesToHallway(GameMap map, RandomGen rng, int xStart, int xEnd, List bucket, [CanBeNull] List mainBucket, bool isH1) { //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Invalid comparison between Unknown and I4 //IL_006a: Unknown result type (might be due to invalid IL or missing references) for (int i = xStart; i <= xEnd; i++) { int num = ((i != 0 && i != 15 && i != 16) ? 1 : 0); for (int j = num; j < 8; j++) { MapNode val = map.Nodes[i, j]; if (val != null && (int)val.StationType <= 0) { List bucket2 = ((isH1 && i == xEnd) ? bucket : (mainBucket ?? bucket)); val.StationType = PullFromBucket(bucket2, val, map, i, xEnd, isH1); } } } } private static StationType PullFromBucket(List bucket, MapNode node, GameMap map, int x, int xEnd, bool isH1) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000d: 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) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) for (int i = 0; i < bucket.Count; i++) { StationType val = bucket[i]; if (IsPlacementValid(val, map, x, node.Y, xEnd, isH1)) { bucket.RemoveAt(i); return val; } } return (StationType)1; } private static bool IsPlacementValid(StationType candidate, StationType? predecessor, int x, int xEnd, bool isH1) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Invalid comparison between Unknown and I4 //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Invalid comparison between Unknown and I4 //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Invalid comparison between Unknown and I4 //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Invalid comparison between Unknown and I4 if (x == 1 && (int)candidate != 1) { return false; } if (x < 4 && IsRestSite(candidate)) { return false; } if (x == 14 && IsRestSite(candidate)) { return false; } if (isH1 && (int)candidate == 2 && x != xEnd) { return false; } if (predecessor.HasValue && predecessor.Value == candidate && (int)candidate != 1 && (int)candidate != 6) { return false; } return true; } private static bool IsPlacementValid(StationType candidate, GameMap map, int x, int y, int xEnd, bool isH1) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) MapNode val = map.Nodes[x, y]; if (!IsPlacementValid(candidate, null, x, xEnd, isH1)) { return false; } if (val != null) { foreach (StationType predecessorType in GetPredecessorTypes(map, val)) { if (!IsPlacementValid(candidate, predecessorType, x, xEnd, isH1)) { return false; } } foreach (StationType successorType in GetSuccessorTypes(map, val)) { if (!IsPlacementValid(candidate, successorType, x, xEnd, isH1)) { return false; } } } return true; } private static bool IsRestSite(StationType t) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Invalid comparison between Unknown and I4 //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Invalid comparison between Unknown and I4 return (int)t == 4 || (int)t == 5; } private static List GetPredecessorTypes(GameMap map, MapNode node) { //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) List list = new List(); for (int i = 0; i < 8; i++) { MapNode val = map.Nodes[node.X - 1, i]; if (val != null && val.FollowerList.Contains(node.Y) && !list.Contains(val.StationType)) { list.Add(val.StationType); } } return list; } private static List GetSuccessorTypes(GameMap map, MapNode node) { //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) List list = new List(); for (int i = 0; i < 8; i++) { if (node.FollowerList.Contains(i)) { MapNode val = map.Nodes[node.X + 1, i]; if (val != null && !list.Contains(val.StationType)) { list.Add(val.StationType); } } } return list; } private static void PepperNodes(GameMap map, List<(int x, int fromY, int toY)> edges, RandomGen rng, List bucket, int xStart, int xEnd, int act, bool isH1, int maxNodes) { //IL_0256: Unknown result type (might be due to invalid IL or missing references) //IL_025d: Expected O, but got Unknown //IL_02bc: Unknown result type (might be due to invalid IL or missing references) if (bucket.Count == 0 || maxNodes <= 0) { return; } List<(int, int)> list = new List<(int, int)>(); for (int i = xStart; i <= xEnd; i++) { for (int j = 1; j < 8; j++) { if (map.Nodes[i, j] == null) { list.Add((i, j)); } } } CollectionsExtensions.Shuffle<(int, int)>((IList<(int, int)>)list, rng); int num = 0; foreach (var item3 in list) { int item = item3.Item1; int item2 = item3.Item2; if (bucket.Count == 0 || num >= maxNodes) { break; } int predMinY = ((item - 1 != 0) ? 1 : 0); int succMinY = ((item + 1 != 15) ? 1 : 0); List list2 = (from y in GetNeighbours(map, item - 1, item2) where y >= predMinY select y).ToList(); List list3 = (from y in GetNeighbours(map, item + 1, item2) where y >= succMinY select y).ToList(); if (list2.Count == 0 || list3.Count == 0) { continue; } List list4 = new List(); List list5 = new List(); foreach (int item4 in list2) { foreach (int item5 in list3) { if (!WouldCross(edges, item - 1, item4, item2) && !WouldCross(edges, item, item2, item5)) { if (!list4.Contains(item4)) { list4.Add(item4); } if (!list5.Contains(item5)) { list5.Add(item5); } } } } if (list4.Count != 0 && list5.Count != 0) { MapNode val = new MapNode(map, item, item2, act); map.Nodes[item, item2] = val; CollectionsExtensions.Shuffle((IList)list4, rng); CollectionsExtensions.Shuffle((IList)list5, rng); TryAddEdge(map, edges, item - 1, list4[0], item, item2); TryAddEdge(map, edges, item, item2, item + 1, list5[0]); val.StationType = PullFromBucket(bucket, val, map, item, xEnd, isH1); num++; } } } private static List GetNeighbours(GameMap map, int x, int cy) { List list = new List(); if (x < 0 || x >= 17) { return list; } int num = ((x != 0 && x != 15 && x != 16) ? 1 : 0); int num2 = ((x != 0 && x != 15 && x != 16) ? 7 : 0); for (int i = -1; i <= 1; i++) { int num3 = cy + i; if (num3 >= num && num3 <= num2 && map.Nodes[x, num3] != null) { list.Add(num3); } } return list; } private static void AddCrossConnections(GameMap map, List<(int x, int fromY, int toY)> edges, RandomGen rng, int xStart, int xEnd) { //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) for (int i = xStart; i < xEnd; i++) { int num = 1; for (int j = num; j < 8; j++) { MapNode val = map.Nodes[i, j]; if (val == null) { continue; } List<(int, int)> list = new List<(int, int)>(); for (int k = -1; k <= 1; k++) { int num2 = j + k; if (num2 >= num && num2 < 8) { MapNode val2 = map.Nodes[i + 1, num2]; if (val2 != null && !val.FollowerList.Contains(num2) && IsPlacementValid(val2.StationType, val.StationType, i + 1, xEnd, isH1: false) && !WouldCross(edges, i, j, num2)) { list.Add((j, num2)); } } } if (list.Count >= 1 && !(rng.NextFloat() < 0.5f)) { CollectionsExtensions.Shuffle<(int, int)>((IList<(int, int)>)list, rng); (int, int) tuple = list.First(); TryAddEdge(map, edges, i, tuple.Item1, i + 1, tuple.Item2); } } } } private static void SweepAndPruneOrphans(GameMap map, List<(int x, int fromY, int toY)> edges) { bool flag = true; while (flag) { flag = false; for (int i = 1; i <= 14; i++) { for (int j = 1; j < 8; j++) { MapNode val = map.Nodes[i, j]; if (val == null) { continue; } bool flag2 = val.FollowerList.Count > 0; bool flag3 = false; if (i == 1) { flag3 = map.Nodes[0, 0] != null && map.Nodes[0, 0].FollowerList.Contains(j); } else { for (int k = 1; k < 8; k++) { MapNode val2 = map.Nodes[i - 1, k]; if (val2 != null && val2.FollowerList.Contains(j)) { flag3 = true; break; } } } if (flag3 && flag2) { continue; } if (!flag3 && !flag2) { KillNode(map, edges, i, j); flag = true; continue; } bool missingPred = !flag3; bool missingSucc = !flag2; if (!TryRescue(map, edges, i, j, missingPred, missingSucc)) { KillNode(map, edges, i, j); flag = true; } } } } } private static bool TryRescue(GameMap map, List<(int x, int fromY, int toY)> edges, int x, int y, bool missingPred, bool missingSucc) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_0121: Unknown result type (might be due to invalid IL or missing references) //IL_0124: Unknown result type (might be due to invalid IL or missing references) StationType stationType = map.Nodes[x, y].StationType; if (missingSucc) { int num = x + 1; int num2 = ((num != 15 && num != 16) ? 1 : 0); for (int i = -1; i <= 1; i++) { int num3 = y + i; if (num3 >= num2 && num3 < 8) { MapNode val = map.Nodes[num, num3]; if (val != null && IsPlacementValid(stationType, val.StationType, x, 14, isH1: false) && TryAddEdge(map, edges, x, y, num, num3)) { return true; } } } } if (missingPred) { int num4 = x - 1; int num5 = ((num4 != 0) ? 1 : 0); for (int j = -1; j <= 1; j++) { int num6 = y + j; if (num6 >= num5 && num6 < 8) { MapNode val2 = map.Nodes[num4, num6]; if (val2 != null && IsPlacementValid(stationType, val2.StationType, x, 14, isH1: false) && TryAddEdge(map, edges, num4, num6, x, y)) { return true; } } } } return false; } private static void KillNode(GameMap map, List<(int x, int fromY, int toY)> edges, int x, int y) { map.Nodes[x, y] = null; if (x == 1) { MapNode obj = map.Nodes[0, 0]; if (obj != null) { obj.FollowerList.Remove(y); } } else { for (int i = 1; i < 8; i++) { MapNode val = map.Nodes[x - 1, i]; if (val != null) { val.FollowerList.Remove(y); } } } edges.RemoveAll(((int x, int fromY, int toY) e) => (e.x == x && e.fromY == y) || (e.x == x - 1 && e.toY == y)); } private static bool TryAddEdge(GameMap map, List<(int x, int fromY, int toY)> edges, int fx, int fy, int tx, int ty) { if (map.Nodes[fx, fy] == null || map.Nodes[tx, ty] == null) { return false; } if (map.Nodes[fx, fy].FollowerList.Contains(ty)) { return false; } if (WouldCross(edges, fx, fy, ty)) { return false; } map.Nodes[fx, fy].FollowerList.Add(ty); edges.Add((fx, fy, ty)); return true; } private static bool WouldCross(List<(int x, int fromY, int toY)> edges, int x, int fromY, int toY) { foreach (var (num, num2, num3) in edges) { if (num == x && (num2 != fromY || num3 != toY)) { int num4 = num2 - fromY; int num5 = num3 - toY; if (num4 != 0 && num5 != 0 && num4 > 0 != num5 > 0) { return true; } } } return false; } private static void EnsureNode(GameMap map, int x, int y, int act) { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Expected O, but got Unknown if (map.Nodes[x, y] == null) { map.Nodes[x, y] = new MapNode(map, x, y, act); } } private static int ClampY(int x, int y) { if (x == 0 || x == 15 || x == 16) { return 0; } return Math.Max(1, Math.Min(7, y)); } } public abstract class StSStageBase : NormalStageBase { public override GameMap CreateMap() { //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Expected O, but got Unknown //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Expected O, but got Unknown ulong mapSeed = ((Stage)this).MapSeed; EnemyGroupEntry boss = ((Stage)this).Boss; string text = ((boss != null) ? boss.Id : null); try { BepinexPlugin.log.LogInfo((object)"Creating STS-style map"); return StsGameMap.CreateStSStyleMap(new RandomGen(mapSeed), text, ((Stage)this).IsSelectingBoss); } catch (Exception ex) { BepinexPlugin.log.LogError((object)("Map generation failed, falling back to vanilla: " + ex.Message)); BepinexPlugin.log.LogError((object)ex.StackTrace); return GameMap.CreateNormalMap(new RandomGen(mapSeed), text, ((Stage)this).IsSelectingBoss); } } } public sealed class WindGodLakeStsDef : StageTemplate { 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("WindGodLakeSts"); } public override StageConfig MakeConfig() { //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Expected O, but got Unknown return new StageConfig("WindGodLakeSts", "WindGodLake1", "WindGodLake2", 1, "", 6, "", 11, "", 16); } } [EntityLogic(typeof(WindGodLakeStsDef))] public sealed class WindGodLakeSts : StSStageBase { public const float W = 1.2f; public WindGodLakeSts() { ((Stage)this).Level = 3; ((Stage)this).CardUpgradedChance = 0.5f; ((Stage)this).TradeAdventureType = typeof(SumirekoGathering); UniqueRandomPool obj = new UniqueRandomPool(true); obj.Add("31", 1f); obj.Add("32", 1f); obj.Add("33", 1f); ((Stage)this).EnemyPoolAct1 = obj; UniqueRandomPool obj2 = new UniqueRandomPool(true); obj2.Add("34", 1f); obj2.Add("35", 1f); obj2.Add("36", 1f); ((Stage)this).EnemyPoolAct2 = obj2; UniqueRandomPool obj3 = new UniqueRandomPool(true); obj3.Add("37", 1f); obj3.Add("38", 1f); obj3.Add("39", 1f); ((Stage)this).EnemyPoolAct3 = obj3; UniqueRandomPool obj4 = new UniqueRandomPool(true); obj4.Add("Clownpiece", 1f); obj4.Add("Siji", 1f); obj4.Add("Doremy", 1f); ((Stage)this).EliteEnemyPool = obj4; RepeatableRandomPool obj5 = new RepeatableRandomPool(); obj5.Add("Sanae", 1f); obj5.Add("Remilia", 1f); obj5.Add("Junko", 1f); ((Stage)this).BossPool = obj5; ((Stage)this).StoryBossId = "Sanae"; UniqueRandomPool val = new UniqueRandomPool(false); val.Add(typeof(MiyoiBartender), 1f); val.Add(typeof(WatatsukiPurify), 1f); val.Add(typeof(DoremyPortal), 1f); ((Stage)this).FirstAdventurePool = val; val = new UniqueRandomPool(true); val.Add(typeof(YorigamiSisters), 1f); val.Add(typeof(HatateInterview), 1f); val.Add(typeof(HinaCollect), 1f); val.Add(typeof(KogasaSpook), 1f); val.Add(typeof(KosuzuBookstore), 1f); val.Add(typeof(NarumiOfferCard), 1f); val.Add(typeof(NazrinDetect), 1f); val.Add(typeof(MedicinePoison), 1.2f); val.Add(typeof(BackgroundDancers), 1.2f); val.Add(typeof(MikoDonation), 1.2f); val.Add(typeof(SatoriCounseling), 1.2f); ((Stage)this).AdventurePool = val; ((Stage)this).TradeAdventureType = typeof(SumirekoGathering); } } public sealed class XuanwuRavineStsDef : StageTemplate { 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("XuanwuRavineSts"); } public override StageConfig MakeConfig() { //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Expected O, but got Unknown return new StageConfig("XuanwuRavineSts", "XuanwuRavine1", "", 1, "XuanwuRavine3", 6, "", 11, "", 16); } } [EntityLogic(typeof(XuanwuRavineStsDef))] public sealed class XuanwuRavineSts : StSStageBase { public const float W = 1.4f; public XuanwuRavineSts() { ((Stage)this).Level = 2; ((Stage)this).CardUpgradedChance = 0.25f; UniqueRandomPool obj = new UniqueRandomPool(true); obj.Add("21", 1f); obj.Add("22", 1f); obj.Add("23", 1f); ((Stage)this).EnemyPoolAct1 = obj; UniqueRandomPool obj2 = new UniqueRandomPool(true); obj2.Add("24", 1f); obj2.Add("25", 1f); obj2.Add("26", 1f); ((Stage)this).EnemyPoolAct2 = obj2; UniqueRandomPool obj3 = new UniqueRandomPool(true); obj3.Add("27", 1f); obj3.Add("28", 1f); obj3.Add("29", 1f); ((Stage)this).EnemyPoolAct3 = obj3; UniqueRandomPool obj4 = new UniqueRandomPool(true); obj4.Add("Nitori", 1f); obj4.Add("Youmu", 1f); obj4.Add("Kokoro", 1f); ((Stage)this).EliteEnemyPool = obj4; RepeatableRandomPool obj5 = new RepeatableRandomPool(); obj5.Add("Long", 1f); obj5.Add("Tianzi", 1f); obj5.Add("Yuyuko", 1f); ((Stage)this).BossPool = obj5; ((Stage)this).StoryBossId = "Long"; UniqueRandomPool val = new UniqueRandomPool(false); val.Add(typeof(PatchouliPhilosophy), 1f); val.Add(typeof(JunkoColorless), 1f); val.Add(typeof(ShinmyoumaruForge), 1f); ((Stage)this).FirstAdventurePool = val; val = new UniqueRandomPool(true); val.Add(typeof(YorigamiSisters), 1f); val.Add(typeof(HecatiaTshirt), 1f); val.Add(typeof(KeineSales), 1f); val.Add(typeof(MikeInvest), 1f); val.Add(typeof(YoumuDelivery), 1f); val.Add(typeof(HatateInterview), 1f); val.Add(typeof(HinaCollect), 1f); val.Add(typeof(KogasaSpook), 1f); val.Add(typeof(KosuzuBookstore), 1f); val.Add(typeof(NarumiOfferCard), 1f); val.Add(typeof(NazrinDetect), 1f); val.Add(typeof(BuduSuanming), 1.4f); val.Add(typeof(YachieOppression), 1.4f); val.Add(typeof(RemiliaMeet), 1.4f); val.Add(typeof(RingoEmp), 1.4f); ((Stage)this).AdventurePool = val; } } } namespace StsMap.Source.Patching { internal class MapButtonPatch { [HarmonyPatch(typeof(StartGamePanel), "OnShowing")] private static class StartGamePanel_OnShowing_Patch { private static void Postfix(StartGamePanel __instance, StartGameData data) { try { InjectToggleButton(__instance, data); } catch (Exception ex) { BepinexPlugin.log.LogError((object)("StS Map Mod: failed to inject toggle button: " + ex)); } } } internal static bool UseStSMap; private static void InjectToggleButton(StartGamePanel panel, StartGameData data) { //IL_0119: Unknown result type (might be due to invalid IL or missing references) //IL_011b: Unknown result type (might be due to invalid IL or missing references) //IL_011d: Unknown result type (might be due to invalid IL or missing references) //IL_011f: Unknown result type (might be due to invalid IL or missing references) //IL_0124: Unknown result type (might be due to invalid IL or missing references) Transform val = ((Component)panel).transform.Find("DifficultyPanel/MainRoot"); if ((Object)(object)val == (Object)null) { BepinexPlugin.log.LogWarning((object)"StS Map Mod: DifficultyPanel/MainRoot not found."); return; } Func stagesCreateFunc = data.StagesCreateFunc; Transform val2 = val.Find("StSMapToggle"); if ((Object)(object)val2 != (Object)null) { SwitchWidget component = ((Component)val2).GetComponent(); if ((Object)(object)component != (Object)null) { component.SetValueWithoutNotifier(UseStSMap, true); RewireListener(component, panel, stagesCreateFunc); ApplyToggle(panel, UseStSMap, stagesCreateFunc); } return; } Transform val3 = val.Find("RandomResult"); if ((Object)(object)val3 == (Object)null) { BepinexPlugin.log.LogWarning((object)"StS Map Mod: RandomResult not found."); return; } GameObject val4 = Object.Instantiate(((Component)val3).gameObject, val); ((Object)val4).name = "StSMapToggle"; RectTransform component2 = val4.GetComponent(); Vector3 val5 = default(Vector3); ((Vector3)(ref val5))..ctor(9.7294f, -4.7611f, 10f); Vector3 val6 = default(Vector3); ((Vector3)(ref val6))..ctor(5.9873f, -4.7611f, 10f); ((Transform)component2).position = val6 + (val6 - val5); Transform val7 = val4.transform.Find("TextRoot/TextOn"); if ((Object)(object)val7 != (Object)null) { ((Component)val7).GetComponent().key = "StartGame.StsMapOn"; ((Behaviour)((Component)val7).GetComponent()).enabled = false; ((TMP_Text)((Component)val7).GetComponent()).text = "Sts Map Enabled"; } else { BepinexPlugin.log.LogWarning((object)"Text on not found!"); } Transform val8 = val4.transform.Find("TextRoot/TextOff"); if ((Object)(object)val8 != (Object)null) { ((Component)val8).GetComponent().key = "StartGame.StsMapOff"; ((Behaviour)((Component)val8).GetComponent()).enabled = false; ((TMP_Text)((Component)val8).GetComponent()).text = "Sts Map Disabled"; } else { BepinexPlugin.log.LogWarning((object)"Text off not found!"); } SimpleTooltipSource component3 = val4.GetComponent(); if ((Object)(object)component3 != (Object)null) { component3.SetDirect("StS Map", "Use the Slay the Spire-style map generator."); } SwitchWidget component4 = val4.GetComponent(); if ((Object)(object)component4 != (Object)null) { component4.SetValueWithoutNotifier(UseStSMap, true); RewireListener(component4, panel, stagesCreateFunc); ApplyToggle(panel, UseStSMap, stagesCreateFunc); } BepinexPlugin.log.LogInfo((object)"StS Map Mod: toggle button injected."); } private static void RewireListener(SwitchWidget sw, StartGamePanel panel, Func vanillaFunc) { ((UnityEventBase)sw.onToggleChanged).RemoveAllListeners(); sw.AddListener((UnityAction)delegate(bool isOn) { UseStSMap = isOn; BepinexPlugin.log.LogInfo((object)("StS Map Mod: toggle " + (isOn ? "ON" : "OFF"))); ApplyToggle(panel, isOn, vanillaFunc); }); } private static void ApplyToggle(StartGamePanel panel, bool isOn, Func vanillaFunc) { Stage[] array = vanillaFunc(); Stage[] stages = (Stage[])((!isOn) ? ((Array)array) : ((Array)new Stage[4] { (Stage)Library.CreateStage(), (Stage)Library.CreateStage(), ((Stage)Library.CreateStage()).AsNormalFinal(), ((Stage)Library.CreateStage()).AsTrueEndFinal() })); panel._stages = stages; } } public class MapNodeHighlightHandler : MonoBehaviour, IPointerClickHandler, IEventSystemHandler { private bool _isHighlighted = false; public GameObject highlightRing; public void OnPointerClick(PointerEventData eventData) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Invalid comparison between Unknown and I4 if ((int)eventData.button == 1) { _isHighlighted = !_isHighlighted; if ((Object)(object)highlightRing != (Object)null) { highlightRing.SetActive(_isHighlighted); } } } } [HarmonyPatch(typeof(MapPanel), "LBoL.Presentation.UI.IInputActionHandler.OnCancel")] public static class MapPanel_OnCancel_Patch { private static bool Prefix() { return false; } } [HarmonyPatch(typeof(MapPanel), "GenerateMapUI")] public static class MapPanel_GenerateMapUI_Patch { public static float GetDynamicNodeY(MapNode mapNode) { if (mapNode.Map == null) { return ((float)mapNode.Y - 2.5f) * 350f; } int width = mapNode.Map.Width; if (width <= 5) { return ((float)mapNode.Y - 2.5f) * 350f; } float num = (float)width - 1f; float num2 = (1f + num) / 2f; float num3 = 740f / (num - num2); return ((float)mapNode.Y - num2) * num3; } [HarmonyTranspiler] public static IEnumerable Transpiler(IEnumerable instructions) { List list = new List(instructions); int num = -1; for (int i = 0; i < list.Count - 3; i++) { if (list[i].opcode == OpCodes.Ldc_R4 && (float)list[i].operand == 2.5f && list[i + 1].opcode == OpCodes.Sub && list[i + 2].opcode == OpCodes.Ldc_R4 && (float)list[i + 2].operand == 350f && list[i + 3].opcode == OpCodes.Mul) { num = i; break; } } if (num != -1) { int num2 = num - 2; list[num2].opcode = OpCodes.Call; list[num2].operand = AccessTools.Method(typeof(MapPanel_GenerateMapUI_Patch), "GetDynamicNodeY", (Type[])null, (Type[])null); list[num2 + 1].opcode = OpCodes.Nop; list[num].opcode = OpCodes.Nop; list[num + 1].opcode = OpCodes.Nop; list[num + 2].opcode = OpCodes.Nop; list[num + 3].opcode = OpCodes.Nop; } else { Debug.LogWarning((object)"MapPanel.GenerateMapUI Transpiler failed: Could not find the Y positioning math."); } return list; } } [HarmonyPatch(typeof(MapNodeWidget), "Initialize")] public static class MapNodeWidget_Initialize_ScalePatch { public static void Postfix(MapNodeWidget __instance, MapNode mapNode) { //IL_00fd: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Invalid comparison between Unknown and I4 //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Unknown result type (might be due to invalid IL or missing references) //IL_012c: Unknown result type (might be due to invalid IL or missing references) //IL_013b: Unknown result type (might be due to invalid IL or missing references) //IL_0148: Unknown result type (might be due to invalid IL or missing references) if (mapNode == null || mapNode.Map == null) { return; } if ((Object)(object)((Component)__instance).gameObject.GetComponent() == (Object)null) { Image outerImage = __instance.outerImage; if ((Object)(object)outerImage != (Object)null) { GameObject val = Object.Instantiate(((Component)outerImage).gameObject, ((Component)outerImage).transform.parent); ((Object)val).name = "RightClickHighlightRing"; val.transform.localScale = new Vector3(1.2f, 1.2f, 1f); Image component = val.GetComponent(); ((Graphic)component).color = Color.yellow; val.SetActive(false); MapNodeHighlightHandler mapNodeHighlightHandler = ((Component)__instance).gameObject.AddComponent(); mapNodeHighlightHandler.highlightRing = val; val.transform.SetSiblingIndex(((Component)outerImage).transform.GetSiblingIndex() + 1); } } int width = mapNode.Map.Width; if (width > 5 && (int)mapNode.StationType != 10) { float num = 5f / ((float)width - 1f); RectTransform component2 = ((Component)__instance).GetComponent(); component2.sizeDelta = new Vector2(component2.sizeDelta.x * num, component2.sizeDelta.y * num); } } } } namespace StsMap.Source.Jadeboxes { public sealed class FogOfWarJadeBoxDef : 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("FogOfWarJadeBox"); } public override JadeBoxConfig MakeConfig() { JadeBoxConfig val = ((JadeBoxTemplate)this).DefaultConfig(); val.Value1 = Mathf.Max(0, BepinexPlugin.VisionRangeConfig.Value); return val; } public override LocalizationOption LoadLocalization() { return (LocalizationOption)(object)StsMapLocalization.jadeboxLoc.AddEntity((EntityDefinition)(object)this); } } [EntityLogic(typeof(FogOfWarJadeBoxDef))] public sealed class FogOfWarJadeBox : JadeBox { public static bool IsActive(GameRunController run) { return run != null && run.HasJadeBox(); } public static int VisionRange(GameRunController run) { if (!IsActive(run)) { return 99; } JadeBox val = ((IEnumerable)run.JadeBoxes).FirstOrDefault((Func)((JadeBox c) => c is FogOfWarJadeBox)); return (val != null) ? Mathf.Max(0, val.Value1) : 99; } } public class FogOfWarVisuals : MonoBehaviour { public Sprite realSprite; public Sprite fogSprite; public Image iconImage; public GameObject bossNameObj; public string realTooltipText; public string fogTooltipText; public SimpleTooltipSource tooltip; } [HarmonyPatch(typeof(MapPanel), "UpdateMapNodesStatus")] public static class MapPanel_UpdateMapNodesStatus_FOW_Patch { public static void Postfix(MapPanel __instance) { //IL_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_00e4: Invalid comparison between Unknown and I4 //IL_00fb: Unknown result type (might be due to invalid IL or missing references) //IL_0102: Invalid comparison between Unknown and I4 //IL_010b: Unknown result type (might be due to invalid IL or missing references) //IL_0111: Invalid comparison between Unknown and I4 //IL_011a: Unknown result type (might be due to invalid IL or missing references) //IL_0120: Invalid comparison between Unknown and I4 //IL_01a9: Unknown result type (might be due to invalid IL or missing references) //IL_01ae: Unknown result type (might be due to invalid IL or missing references) //IL_01e0: Unknown result type (might be due to invalid IL or missing references) //IL_01e7: Invalid comparison between Unknown and I4 //IL_02f9: Unknown result type (might be due to invalid IL or missing references) //IL_0300: Invalid comparison between Unknown and I4 int num = FogOfWarJadeBox.VisionRange(((UiPanelBase)__instance).GameRun); if (num >= 99) { return; } GameMap currentMap = ((UiPanelBase)__instance).GameRun.CurrentMap; if (currentMap == null) { return; } MapNode visitingNode = currentMap.VisitingNode; int num2 = ((visitingNode != null) ? visitingNode.X : (-1)); MapNodeWidget[,] mapNodeWidgets = __instance._mapNodeWidgets; if (mapNodeWidgets == null) { return; } MapNodeWidget[,] array = mapNodeWidgets; foreach (MapNodeWidget val in array) { if ((Object)(object)val == (Object)null || val.MapNode == null || (!BepinexPlugin.HideBossConfig.Value && (int)val.MapNode.StationType == 10) || (int)val.MapNode.StationType == 9 || (int)val.MapNode.StationType == 8 || (int)val.MapNode.StationType == 3) { continue; } FogOfWarVisuals fogOfWarVisuals = ((Component)val).gameObject.GetComponent(); if ((Object)(object)fogOfWarVisuals == (Object)null) { fogOfWarVisuals = ((Component)val).gameObject.AddComponent(); fogOfWarVisuals.iconImage = val.iconImage; fogOfWarVisuals.realSprite = fogOfWarVisuals.iconImage.sprite; fogOfWarVisuals.fogSprite = val.bossUnselect; fogOfWarVisuals.tooltip = ((Component)val).GetComponent(); fogOfWarVisuals.realTooltipText = LocalizationExtensions.Localize("Map." + ((object)val.MapNode.StationType/*cast due to .constrained prefix*/).ToString(), true); fogOfWarVisuals.fogTooltipText = "???"; if ((int)val.MapNode.StationType == 10) { TextMeshProUGUI bossName = val.bossName; if ((Object)(object)bossName != (Object)null) { fogOfWarVisuals.bossNameObj = ((Component)bossName).gameObject; } } } if ((Object)(object)fogOfWarVisuals.iconImage.sprite != (Object)(object)fogOfWarVisuals.realSprite && (Object)(object)fogOfWarVisuals.iconImage.sprite != (Object)(object)fogOfWarVisuals.fogSprite) { fogOfWarVisuals.realSprite = fogOfWarVisuals.iconImage.sprite; } if (val.MapNode.X > num2 + num) { if ((Object)(object)fogOfWarVisuals.fogSprite != (Object)null) { fogOfWarVisuals.iconImage.sprite = fogOfWarVisuals.fogSprite; ((Component)fogOfWarVisuals.iconImage).gameObject.SetActive(true); } if ((Object)(object)fogOfWarVisuals.bossNameObj != (Object)null) { fogOfWarVisuals.bossNameObj.SetActive(false); } if ((Object)(object)fogOfWarVisuals.tooltip != (Object)null && (int)val.MapNode.StationType != 10) { fogOfWarVisuals.tooltip.SetDirect(fogOfWarVisuals.fogTooltipText, (string)null); } } else { if ((Object)(object)fogOfWarVisuals.realSprite != (Object)null) { fogOfWarVisuals.iconImage.sprite = fogOfWarVisuals.realSprite; } if ((Object)(object)fogOfWarVisuals.bossNameObj != (Object)null && (Object)(object)fogOfWarVisuals.realSprite == (Object)null) { fogOfWarVisuals.bossNameObj.SetActive(true); ((Component)fogOfWarVisuals.iconImage).gameObject.SetActive(false); } if ((Object)(object)fogOfWarVisuals.tooltip != (Object)null) { fogOfWarVisuals.tooltip.SetDirect(fogOfWarVisuals.realTooltipText, (string)null); } } } } } } namespace StsMap.ImageLoader { public sealed class TrukeImageLoader { public class EffectHider : MonoBehaviour { private void Start() { if (!((Object)this).name.Contains("Clone")) { ((MonoBehaviour)this).StartCoroutine(HideAfterFrame()); } } private IEnumerator HideAfterFrame() { SpriteRenderer renderer = default(SpriteRenderer); if (((Component)this).TryGetComponent(ref renderer)) { ((Renderer)renderer).enabled = false; } yield return null; ((Component)this).transform.localPosition = new Vector3(0f, 0f, 0f); if ((Object)(object)renderer != (Object)null) { ((Renderer)renderer).enabled = true; } Debug.Log((object)"Truke Exists!"); } } public static string file_extension = ".png"; public static GameObject effectParent; public static Dictionary effectObjects = new Dictionary(); public static GameObject LoadEffectGameObject(string imageName) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Expected O, but got Unknown //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_00fd: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Expected O, but got Unknown //IL_013b: Unknown result type (might be due to invalid IL or missing references) //IL_0140: Unknown result type (might be due to invalid IL or missing references) //IL_0156: Unknown result type (might be due to invalid IL or missing references) //IL_015b: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Expected O, but got Unknown if ((Object)(object)effectParent == (Object)null) { Debug.Log((object)"Spawned effect parent"); GameObject val = new GameObject("EffectParent"); Object.DontDestroyOnLoad((Object)(object)val); effectParent = val; effectParent.transform.position = new Vector3(-10f, 0f, 0f); } if (effectObjects.TryGetValue(imageName, out var value)) { return value; } string text = imageName + file_extension; Sprite val2 = ResourceLoader.LoadSprite(text, BepinexPlugin.embeddedSource, (Rect?)null, 256, (Vector2?)null); Debug.Log((object)("Trying to load " + imageName)); if ((Object)(object)val2 == (Object)null) { Debug.LogWarning((object)("Failed to load effect sprite at path: " + text)); return new GameObject(imageName + "_Failed"); } GameObject val3 = new GameObject(imageName + "_Effect"); val3.transform.parent = effectParent.transform; val3.AddComponent(); SpriteRenderer val4 = val3.AddComponent(); val4.sprite = val2; ParticleSystem val5 = val3.AddComponent(); MainModule main = val5.main; ((MainModule)(ref main)).playOnAwake = false; ((MainModule)(ref main)).stopAction = (ParticleSystemStopAction)1; EmissionModule emission = val5.emission; ((EmissionModule)(ref emission)).enabled = false; Debug.Log((object)("Spawning the effect object of " + imageName + " successful!")); return val3; } public static Sprite LoadSprite(IdContainer ID) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) return ResourceLoader.LoadSprite(IdContainer.op_Implicit(ID) + file_extension, BepinexPlugin.embeddedSource, (Rect?)null, 1, (Vector2?)null); } } } namespace StsMap.Config { public struct CustomConfigEntry { public T Value { get; set; } public string Section { get; set; } public string Key { get; set; } public string Description { get; set; } public CustomConfigEntry(T value, string section, string key, string description) { Value = value; Section = section; Key = key; Description = description; } } public sealed class MintyDefaultConfig { private static readonly string OwnerName = BepinexPlugin.modUniqueID; public static string DefaultID(EntityDefinition entity) { string name = ((object)entity).GetType().Name; return name.Remove(name.Length - 3); } public static CardConfig CardDefaultConfig() { //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_018e: Unknown result type (might be due to invalid IL or missing references) //IL_0195: Expected O, but got Unknown return new CardConfig(0, "", 10, true, new string[0][], "", "", 0, false, true, false, true, true, (Rarity)0, (CardType)0, (TargetType?)null, (IReadOnlyList)new List(), false, default(ManaGroup), (ManaGroup?)null, (ManaGroup?)null, (ManaGroup?)null, (int?)null, (int?)null, (int?)null, (int?)null, (int?)null, (int?)null, (int?)null, (int?)null, (int?)null, (int?)null, (int?)null, (ManaGroup?)null, (ManaGroup?)null, (int?)null, (int?)null, (int?)null, (int?)null, (int?)null, (int?)null, (int?)null, (int?)null, (int?)null, (int?)null, (int?)null, (int?)null, (int?)null, (Keyword)0, (Keyword)0, false, (Keyword)0, (Keyword)0, (IReadOnlyList)new List(), (IReadOnlyList)new List(), (IReadOnlyList)new List(), (IReadOnlyList)new List(), OwnerName, (string)null, "", "", false, (string)null, (IReadOnlyList)new List()); } public static ExhibitConfig DefaultExhibitConfig() { //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Expected O, but got Unknown return new ExhibitConfig(0, "", 10, false, false, false, false, (AppearanceType)3, OwnerName, (ExhibitLosableType)1, (Rarity)3, (int?)null, (int?)null, (int?)null, (ManaGroup?)default(ManaGroup), (ManaColor?)null, (ManaColor?)(ManaColor)1, 1, false, (int?)null, (Keyword)0, (IReadOnlyList)new List(), (IReadOnlyList)new List()); } public static StatusEffectConfig DefaultStatusEffectConfig() { //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Expected O, but got Unknown return new StatusEffectConfig(0, "", 10, (StatusEffectType)0, false, true, (int?)null, true, (StackType?)(StackType)0, false, (StackType?)(StackType)0, (DurationDecreaseTiming)0, false, (StackType?)(StackType)3, (StackType?)(StackType)3, false, (Keyword)0, (IReadOnlyList)new List(), (string)null, "Default", "Default", "Default"); } public static UltimateSkillConfig DefaultUltConfig() { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Expected O, but got Unknown return new UltimateSkillConfig("", 10, 100, 100, 2, (UsRepeatableType)1, 1, 0, 0, (Keyword)256, (IReadOnlyList)new List(), (IReadOnlyList)new List()); } public static EnemyUnitConfig EnemyUnitDefaultConfig() { //IL_00f1: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: Unknown result type (might be due to invalid IL or missing references) //IL_0143: Unknown result type (might be due to invalid IL or missing references) //IL_0149: Expected O, but got Unknown return new EnemyUnitConfig("", false, false, (IReadOnlyList)new List { (ManaColor)6 }, 10, "", "#ffff", (EnemyType)1, false, (float?)null, (int?)null, 250, (int?)10, (int?)10, (int?)10, (int?)10, (int?)1, (int?)15, (int?)1, (int?)2, (int?)250, (int?)10, (int?)10, (int?)10, (int?)10, (int?)1, (int?)15, (int?)1, (int?)2, (int?)250, (int?)10, (int?)10, (int?)10, (int?)10, (int?)1, (int?)15, (int?)1, (int?)2, new MinMax(100, 100), new MinMax(100, 100), (IReadOnlyList)new List { "simple" }, (IReadOnlyList)new List { "simple" }, (IReadOnlyList)new List { "simple" }, (IReadOnlyList)new List { "simple" }); } public static EnemyGroupConfig EnemyGroupDefaultConfig() { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Expected O, but got Unknown return new EnemyGroupConfig("", false, (IReadOnlyList)new List(), "", "Single", (IReadOnlyList)new List(), (EnemyType)3, false, 1f, true, new Vector2(-4f, 0.5f), "", "", (string)null); } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { internal IgnoresAccessChecksToAttribute(string assemblyName) { } } }