using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BTD_Mod_Helper; using BTD_Mod_Helper.Api; using BTD_Mod_Helper.Api.Components; using BTD_Mod_Helper.Api.Data; using BTD_Mod_Helper.Api.Helpers; using BTD_Mod_Helper.Api.ModOptions; using BTD_Mod_Helper.Api.Towers; using BTD_Mod_Helper.Extensions; using HarmonyLib; using Il2Cpp; using Il2CppAssets.Scripts.Data.ParagonData; using Il2CppAssets.Scripts.Models; using Il2CppAssets.Scripts.Models.Entities; using Il2CppAssets.Scripts.Models.TowerSets; using Il2CppAssets.Scripts.Models.Towers; using Il2CppAssets.Scripts.Models.Towers.Behaviors; using Il2CppAssets.Scripts.Models.Towers.Mutators; using Il2CppAssets.Scripts.Models.Towers.Upgrades; using Il2CppAssets.Scripts.Simulation.Objects; using Il2CppAssets.Scripts.Simulation.Towers; using Il2CppAssets.Scripts.Simulation.Towers.Behaviors; using Il2CppAssets.Scripts.Simulation.Towers.Mutators; using Il2CppAssets.Scripts.Unity; using Il2CppAssets.Scripts.Unity.Bridge; using Il2CppAssets.Scripts.Unity.UI_New.InGame; using Il2CppAssets.Scripts.Unity.UI_New.InGame.TowerSelectionMenu; using Il2CppAssets.Scripts.Unity.UI_New.InGame.TowerSelectionMenu.TowerSelectionMenuThemes; using Il2CppAssets.Scripts.Unity.UI_New.Popups; using Il2CppAssets.Scripts.Unity.UI_New.Utils; using Il2CppInterop.Runtime.InteropTypes; using Il2CppInterop.Runtime.InteropTypes.Arrays; using Il2CppSystem; using Il2CppSystem.Collections.Generic; using Il2CppSystem.IO; using Il2CppTMPro; using MelonLoader; using Microsoft.CodeAnalysis; using SacrificeHelper; using UnityEngine; 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: MelonInfo(typeof(SacrificeHelperMod), "Sacrifice Helper", "2.4.8", "doombubbles", null)] [assembly: MelonGame("Ninja Kiwi", "BloonsTD6")] [assembly: MelonGame("Ninja Kiwi", "BloonsTD6-Epic")] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")] [assembly: AssemblyCompany("SacrificeHelper")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+34462f8fb877883dbd7bd25d7dcae74ab212ad1f")] [assembly: AssemblyProduct("SacrificeHelper")] [assembly: AssemblyTitle("SacrificeHelper")] [assembly: AssemblyVersion("1.0.0.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class ExtensionMarkerAttribute : Attribute { private readonly string k__BackingField; public string Name => k__BackingField; public ExtensionMarkerAttribute(string name) { k__BackingField = name; } } } namespace SacrificeHelper { public static class ModHelperData { public const string WorksOnVersion = "56.0"; public const string Version = "2.4.8"; public const string Name = "Sacrifice Helper"; public const string Description = "Adds more UI information when doing Temple and Paragon sacrifices so you know exactly what you'll get.\n\nAlso adds settings for customizing how sacrifices happen, such as Auto Sacrifice mode."; public const string RepoOwner = "doombubbles"; public const string PrevRepoName = "sacrifice-helper"; public const string RepoName = "SacrificeHelper"; } public class SacrificeHelperMod : BloonsTD6Mod { [HarmonyPatch(typeof(MonkeyTemple), "StartSacrifice")] public class MonkeyTemple_StartSacrifice { [HarmonyPrefix] public static bool Prefix() { return !templeSacrificesOff && AutoSacrificeMode == AutoSacrificeMode.Off; } [HarmonyPostfix] public static void Postfix(MonkeyTemple __instance) { //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Expected I4, but got Unknown //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Invalid comparison between Unknown and I4 if (AutoSacrificeMode == AutoSacrificeMode.Off) { return; } __instance.checkTCBOO = __instance.monkeyTempleModel.checkForThereCanOnlyBeOne; if (__instance.selectedTowers == null) { Dictionary val = (__instance.selectedTowers = new Dictionary()); } TowerMutator val4 = default(TowerMutator); foreach (TempleTowerMutatorGroup item in MonoLinqHelper.ToArray(((RootBehavior)__instance).entity.GetBehaviorsInDependants())) { bool flag = __instance.monkeyTempleModel.templeId != "TrueTemple"; bool flag2 = flag; if (flag2) { AutoSacrificeMode autoSacrificeMode = AutoSacrificeMode; TowerSet towerSet = item.templeTowerMutatorGroupModel.towerSet; if (1 == 0) { } AutoSacrificeMode autoSacrificeMode2; switch (towerSet - 1) { default: if ((int)towerSet != 8) { goto case 2; } autoSacrificeMode2 = AutoSacrificeMode.Sacrifice2221; break; case 0: autoSacrificeMode2 = AutoSacrificeMode.Sacrifice1222; break; case 1: autoSacrificeMode2 = AutoSacrificeMode.Sacrifice2122; break; case 3: autoSacrificeMode2 = AutoSacrificeMode.Sacrifice2212; break; case 2: autoSacrificeMode2 = AutoSacrificeMode.Off; break; } if (1 == 0) { } flag2 = autoSacrificeMode == autoSacrificeMode2; } if (flag2) { continue; } List val3 = new List(); Entity entity = ((RootBehavior)__instance).entity; Model[] array = (Model[])(object)Il2CppReferenceArrayExt.ToArray(((TowerMutatorGroupModel)item.templeTowerMutatorGroupModel).mutators); entity.AddBehaviorsOrUpdateModels(val3, Il2CppReferenceArray.op_Implicit(array)); Enumerator enumerator2 = val3.GetEnumerator(); while (enumerator2.MoveNext()) { RootBehavior current2 = enumerator2.Current; if (Il2CppSystemObjectExt.Is((Il2CppObjectBase)(object)current2, ref val4) && val4.EvaluateConditional()) { __instance.mutatorsToApply.Add(val4.mutator); } } } } } [HarmonyPatch(typeof(MonkeyTemple), "GetSaveMetaData")] internal static class MonkeyTemple_GetSaveMetaData { [HarmonyPrefix] internal static void Prefix(MonkeyTemple __instance) { if (AutoSacrificeMode == AutoSacrificeMode.Off) { return; } MonkeyTemple val = __instance; if (val.templeTowers == null) { Dictionary val2 = (val.templeTowers = new Dictionary()); } if (AutoSacrificeMode != AutoSacrificeMode.Sacrifice1222) { __instance.templeTowers[(TowerSet)1] = 50001f; } if (AutoSacrificeMode != AutoSacrificeMode.Sacrifice2122) { __instance.templeTowers[(TowerSet)2] = 50001f; } if (AutoSacrificeMode != AutoSacrificeMode.Sacrifice2212) { __instance.templeTowers[(TowerSet)4] = 50001f; } if (AutoSacrificeMode != AutoSacrificeMode.Sacrifice2221) { __instance.templeTowers[(TowerSet)8] = 50001f; } if (!(__instance.monkeyTempleModel.templeId != "TrueTemple")) { val = __instance; if (val.trueTempleTowers == null) { Dictionary val2 = (val.trueTempleTowers = new Dictionary()); } __instance.trueTempleTowers[(TowerSet)1] = 50001f; __instance.trueTempleTowers[(TowerSet)2] = 50001f; __instance.trueTempleTowers[(TowerSet)4] = 50001f; __instance.trueTempleTowers[(TowerSet)8] = 50001f; } } } private static readonly ModSettingEnum AutoSacrifice = new ModSettingEnum(AutoSacrificeMode.Off) { description = "Mode for automatically applying sacrifice benefits to temples via increasing the upgrade cost a corresponding amount instead of sacrificing nearby towers. Temple syntax is for example 2221 meaning all sacrifices are 50k except for Support on the Tier 4 sacrifice. Still works for becoming a Vengeful Temple.", labelFunction = (AutoSacrificeMode mode) => mode.ToString().Replace("Sacrifice", "Sacrifice ") }; public static readonly ModSettingBool FourCategorySunTemples = new ModSettingBool(false) { displayName = "Four-Category Sun Temple Sacrifices", description = "Allows Sun Temples to benefit from all four tower category sacrifices instead of only three. Warning: When enabled, a Vengeful True Sun God requires a fully maxed 2222 Sun Temple; the base-game 2221 setup will no longer qualify.", icon = "080c12903611a654b8d3281aef7fe553", requiresRestart = true }; public static readonly ModSettingDouble SliderContributionPenalty; public static readonly ModSettingCategory ParagonPowerMaximums; public static readonly ModSettingInt MaxPowerFromPops; public static readonly ModSettingInt MaxPowerFromCash; public static readonly ModSettingInt MaxPowerFromNonTier5s; public static readonly ModSettingInt MaxPowerFromTier5s; public static readonly ModSettingCategory ParagonPowerWeights; private static readonly ModSettingInt PopsScaleFactor; private static readonly ModSettingInt CashScaleFactor; private static readonly ModSettingInt NonTier5ScaleFactor; private static readonly ModSettingInt Tier5ScaleFactor; public static readonly ModSettingCategory TempleAlternateCosts; public static readonly ModSettingDouble TempleAlternateCostMod; public static readonly ModSettingDouble GodAlternateCostMod; public static bool templeSacrificesOff; public static AutoSacrificeMode AutoSacrificeMode => ModSettingEnum.op_Implicit(AutoSacrifice); public override void OnNewGameModel(GameModel result) { ParagonDegreeDataModel paragonDegreeDataModel = result.paragonDegreeDataModel; paragonDegreeDataModel.maxPowerFromPops = ModSettingInt.op_Implicit(MaxPowerFromPops); if (paragonDegreeDataModel.maxPowerFromPops < 0) { paragonDegreeDataModel.maxPowerFromPops = paragonDegreeDataModel.MaxInvestment; } paragonDegreeDataModel.maxPowerFromMoneySpent = ModSettingInt.op_Implicit(MaxPowerFromCash); if (paragonDegreeDataModel.maxPowerFromMoneySpent < 0) { paragonDegreeDataModel.maxPowerFromMoneySpent = paragonDegreeDataModel.MaxInvestment; } paragonDegreeDataModel.maxPowerFromNonTier5Count = ModSettingInt.op_Implicit(MaxPowerFromNonTier5s); if (paragonDegreeDataModel.maxPowerFromNonTier5Count < 0) { paragonDegreeDataModel.maxPowerFromNonTier5Count = paragonDegreeDataModel.MaxInvestment; } paragonDegreeDataModel.maxPowerFromTier5Count = ModSettingInt.op_Implicit(MaxPowerFromTier5s); if (paragonDegreeDataModel.maxPowerFromTier5Count < 0) { paragonDegreeDataModel.maxPowerFromTier5Count = paragonDegreeDataModel.MaxInvestment; } paragonDegreeDataModel.popsOverX = ModSettingInt.op_Implicit(PopsScaleFactor); paragonDegreeDataModel.moneySpentOverX = ModSettingInt.op_Implicit(CashScaleFactor); paragonDegreeDataModel.nonTier5TowersMultByX = ModSettingInt.op_Implicit(NonTier5ScaleFactor); paragonDegreeDataModel.tier5TowersMultByX = ModSettingInt.op_Implicit(Tier5ScaleFactor); paragonDegreeDataModel.paidContributionPenalty = ModSettingDouble.op_Implicit(SliderContributionPenalty); templeSacrificesOff = false; SacrificeHelperUtility.UpdateUpgradeCosts(result); } static SacrificeHelperMod() { //IL_002d: 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_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Expected O, but got Unknown //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Expected O, but got Unknown //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Expected O, but got Unknown //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Expected O, but got Unknown //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: Expected O, but got Unknown //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Expected O, but got Unknown //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Expected O, but got Unknown //IL_00f6: Unknown result type (might be due to invalid IL or missing references) //IL_0101: Unknown result type (might be due to invalid IL or missing references) //IL_0111: Expected O, but got Unknown //IL_0116: 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_0126: Unknown result type (might be due to invalid IL or missing references) //IL_0133: Expected O, but got Unknown //IL_0133: Unknown result type (might be due to invalid IL or missing references) //IL_0144: Expected O, but got Unknown //IL_0144: Unknown result type (might be due to invalid IL or missing references) //IL_014f: Unknown result type (might be due to invalid IL or missing references) //IL_015f: Expected O, but got Unknown //IL_0164: Unknown result type (might be due to invalid IL or missing references) //IL_0169: Unknown result type (might be due to invalid IL or missing references) //IL_0174: Unknown result type (might be due to invalid IL or missing references) //IL_0181: Expected O, but got Unknown //IL_0181: Unknown result type (might be due to invalid IL or missing references) //IL_0192: Expected O, but got Unknown //IL_0192: Unknown result type (might be due to invalid IL or missing references) //IL_019d: Unknown result type (might be due to invalid IL or missing references) //IL_01b3: Unknown result type (might be due to invalid IL or missing references) //IL_01c3: Expected O, but got Unknown //IL_01c8: Unknown result type (might be due to invalid IL or missing references) //IL_01cd: Unknown result type (might be due to invalid IL or missing references) //IL_01d8: Unknown result type (might be due to invalid IL or missing references) //IL_01e5: Expected O, but got Unknown //IL_01e5: Unknown result type (might be due to invalid IL or missing references) //IL_01f6: Expected O, but got Unknown //IL_01f6: Unknown result type (might be due to invalid IL or missing references) //IL_0201: Unknown result type (might be due to invalid IL or missing references) //IL_0217: Unknown result type (might be due to invalid IL or missing references) //IL_0227: Expected O, but got Unknown //IL_022c: Unknown result type (might be due to invalid IL or missing references) //IL_0236: Expected O, but got Unknown //IL_023b: Unknown result type (might be due to invalid IL or missing references) //IL_0240: Unknown result type (might be due to invalid IL or missing references) //IL_024b: Unknown result type (might be due to invalid IL or missing references) //IL_0258: Expected O, but got Unknown //IL_0258: Unknown result type (might be due to invalid IL or missing references) //IL_0263: Unknown result type (might be due to invalid IL or missing references) //IL_0273: Expected O, but got Unknown //IL_0278: Unknown result type (might be due to invalid IL or missing references) //IL_027d: Unknown result type (might be due to invalid IL or missing references) //IL_0288: Unknown result type (might be due to invalid IL or missing references) //IL_0295: Expected O, but got Unknown //IL_0295: Unknown result type (might be due to invalid IL or missing references) //IL_02a0: Unknown result type (might be due to invalid IL or missing references) //IL_02ab: Unknown result type (might be due to invalid IL or missing references) //IL_02bb: Expected O, but got Unknown //IL_02bd: Unknown result type (might be due to invalid IL or missing references) //IL_02c2: Unknown result type (might be due to invalid IL or missing references) //IL_02cd: Unknown result type (might be due to invalid IL or missing references) //IL_02da: Expected O, but got Unknown //IL_02da: Unknown result type (might be due to invalid IL or missing references) //IL_02e5: Unknown result type (might be due to invalid IL or missing references) //IL_02fb: Unknown result type (might be due to invalid IL or missing references) //IL_030b: Expected O, but got Unknown //IL_0310: Unknown result type (might be due to invalid IL or missing references) //IL_0315: Unknown result type (might be due to invalid IL or missing references) //IL_0320: Unknown result type (might be due to invalid IL or missing references) //IL_032d: Expected O, but got Unknown //IL_032d: Unknown result type (might be due to invalid IL or missing references) //IL_0338: Unknown result type (might be due to invalid IL or missing references) //IL_034e: Unknown result type (might be due to invalid IL or missing references) //IL_035e: Expected O, but got Unknown //IL_0363: Unknown result type (might be due to invalid IL or missing references) //IL_036d: Expected O, but got Unknown //IL_0376: Unknown result type (might be due to invalid IL or missing references) //IL_037b: Unknown result type (might be due to invalid IL or missing references) //IL_0386: Unknown result type (might be due to invalid IL or missing references) //IL_039a: Expected O, but got Unknown //IL_039a: Unknown result type (might be due to invalid IL or missing references) //IL_03a7: Expected O, but got Unknown //IL_03a7: Unknown result type (might be due to invalid IL or missing references) //IL_03b2: Unknown result type (might be due to invalid IL or missing references) //IL_03bd: Unknown result type (might be due to invalid IL or missing references) //IL_03c8: Unknown result type (might be due to invalid IL or missing references) //IL_03d8: Expected O, but got Unknown //IL_03e1: Unknown result type (might be due to invalid IL or missing references) //IL_03e6: Unknown result type (might be due to invalid IL or missing references) //IL_03f1: Unknown result type (might be due to invalid IL or missing references) //IL_0405: Expected O, but got Unknown //IL_0405: Unknown result type (might be due to invalid IL or missing references) //IL_0412: Expected O, but got Unknown //IL_0412: Unknown result type (might be due to invalid IL or missing references) //IL_041d: Unknown result type (might be due to invalid IL or missing references) //IL_0428: Unknown result type (might be due to invalid IL or missing references) //IL_0433: Unknown result type (might be due to invalid IL or missing references) //IL_0443: Expected O, but got Unknown ModSettingDouble val = new ModSettingDouble(0.05000000074505806) { description = "The popup added in BTD6 v39 comes with a default 5% penalty to manually invested cash.\nSetting this to 0 would stop it, or negative would counteract it.", stepSize = 0.01f }; ((ModSettingNumber)val).min = -0.99; ((ModSettingNumber)val).max = 1.0; ((ModSetting)val).icon = "Ui[UpgradeContainerParagonUnlocked]"; SliderContributionPenalty = val; ParagonPowerMaximums = new ModSettingCategory("Paragon Power Maximums"); ModSettingInt val2 = new ModSettingInt(90000) { displayName = "Max Paragon Power From Pops\n(-1 for unlimited)" }; ((ModSettingNumber)val2).min = -1L; ((ModSettingNumber)val2).max = 200000L; ((ModSetting)val2).icon = "IngameUi[PopIcon]"; ((ModSetting)val2).category = ParagonPowerMaximums; MaxPowerFromPops = val2; ModSettingInt val3 = new ModSettingInt(60000) { displayName = "Max Paragon Power From Cash\n(-1 for unlimited)" }; ((ModSettingNumber)val3).min = -1L; ((ModSettingNumber)val3).max = 200000L; ((ModSetting)val3).icon = "Ui[CoinIcon]"; ((ModSetting)val3).category = ParagonPowerMaximums; MaxPowerFromCash = val3; ModSettingInt val4 = new ModSettingInt(10000) { displayName = "Max Paragon Power From Non Tier 5s\n(-1 for unlimited)" }; ((ModSettingNumber)val4).min = -1L; ((ModSettingNumber)val4).max = 200000L; ((ModSetting)val4).icon = "Ui[UpgradeContainerGrey]"; ((ModSetting)val4).modifyOption = delegate(ModHelperOption option) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) ((ModHelperComponent)option.Icon).AddText(new Info("Text", (InfoPreset)0), "<5", 100f); }; ((ModSetting)val4).category = ParagonPowerMaximums; MaxPowerFromNonTier5s = val4; ModSettingInt val5 = new ModSettingInt(50000) { displayName = "Max Paragon Power From Tier 5s\n(-1 for unlimited)" }; ((ModSettingNumber)val5).min = -1L; ((ModSettingNumber)val5).max = 200000L; ((ModSetting)val5).icon = "Ui[UpgradeContainerTier5]"; ((ModSetting)val5).modifyOption = delegate(ModHelperOption option) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) ((ModHelperComponent)option.Icon).AddText(new Info("Text", (InfoPreset)0), "5", 100f); }; ((ModSetting)val5).category = ParagonPowerMaximums; MaxPowerFromTier5s = val5; ParagonPowerWeights = new ModSettingCategory("Paragon Power Weights"); ModSettingInt val6 = new ModSettingInt(180) { displayName = "Pops per Point of Paragon Power" }; ((ModSettingNumber)val6).min = 1L; ((ModSetting)val6).icon = "IngameUi[PopIcon]"; ((ModSetting)val6).category = ParagonPowerWeights; PopsScaleFactor = val6; ModSettingInt val7 = new ModSettingInt(20000) { displayName = "Paragon Power Scale Factor for Cash" }; ((ModSettingNumber)val7).min = 1L; ((ModSetting)val7).icon = "Ui[CoinIcon]"; ((ModSetting)val7).category = ParagonPowerWeights; ((ModSetting)val7).description = "As of v39, the Paragon Upgrade Price is divided by this to get the final value"; CashScaleFactor = val7; ModSettingInt val8 = new ModSettingInt(100) { displayName = "Paragon Power Scale Factor for Non Tier 5s" }; ((ModSettingNumber)val8).min = 0L; ((ModSetting)val8).icon = "Ui[UpgradeContainerGrey]"; ((ModSetting)val8).modifyOption = delegate(ModHelperOption option) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) ((ModHelperComponent)option.Icon).AddText(new Info("Text", (InfoPreset)0), "<5", 100f); }; ((ModSetting)val8).category = ParagonPowerWeights; NonTier5ScaleFactor = val8; ModSettingInt val9 = new ModSettingInt(6000) { displayName = "Paragon Power Scale Factor for Tier 5s" }; ((ModSettingNumber)val9).min = 0L; ((ModSetting)val9).icon = "Ui[UpgradeContainerTier5]"; ((ModSetting)val9).modifyOption = delegate(ModHelperOption option) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) ((ModHelperComponent)option.Icon).AddText(new Info("Text", (InfoPreset)0), "5", 100f); }; ((ModSetting)val9).category = ParagonPowerWeights; Tier5ScaleFactor = val9; TempleAlternateCosts = new ModSettingCategory("Template Alternate Costs"); ModSettingDouble val10 = new ModSettingDouble(0.5) { displayName = "Alternate Sun Temple Cost" }; ((ModSettingNumber)val10).min = 0.0; ((ModSettingNumber)val10).max = 1.0; val10.stepSize = 0.01f; ((ModSetting)val10).icon = "080c12903611a654b8d3281aef7fe553"; ((ModSetting)val10).description = "What portion the cost should be if you decide to get a Sun Temple without doing sacrifices"; ((ModSetting)val10).category = TempleAlternateCosts; TempleAlternateCostMod = val10; ModSettingDouble val11 = new ModSettingDouble(0.2) { displayName = "Alternate True Sun God Cost" }; ((ModSettingNumber)val11).min = 0.0; ((ModSettingNumber)val11).max = 1.0; val11.stepSize = 0.01f; ((ModSetting)val11).icon = "a04463dfa8e4c704c8b660dd6e5d64b4"; ((ModSetting)val11).description = "What portion the cost should be if you decide to get a True Sun God without doing sacrifices"; ((ModSetting)val11).category = TempleAlternateCosts; GodAlternateCostMod = val11; } } public enum AutoSacrificeMode { Off, Sacrifice1222, Sacrifice2122, Sacrifice2212, Sacrifice2221, Sacrifice2222 } public class SacrificeHelperUtility : IModSettings, IModContent { public class SacrificeHelperTsm : ModVanillaTsmTheme { public const int InfoWidth = 500; public const int InfoHeight = 100; private static bool showingExtraParagonInfo; private ModHelperPanel paragonStuff = null; private ModHelperButton degreeButton = null; private ModHelperText degreeText = null; private ModHelperPanel extraParagonInfo = null; private List paragonDetails = null; private ModHelperPanel templeStuff = null; private ModHelperButton sacrificeToggle = null; private ModHelperPanel extraSacrificeInfo = null; private List sacrificeTowerSets = null; private static bool showingExtraTempleInfo => !SacrificeHelperMod.templeSacrificesOff && SacrificeHelperMod.AutoSacrificeMode == AutoSacrificeMode.Off; private static void ToggleShowingExtraInfo() { SacrificeHelperMod.templeSacrificesOff = !SacrificeHelperMod.templeSacrificesOff; } public override void SetupTheme(BaseTSMTheme theme) { if (ModSettingBool.op_Implicit(ParagonSacrificeInfo)) { CreateParagonStuff(theme); } if (ModSettingBool.op_Implicit(TempleSacrificeInfo)) { CreateTempleStuff(theme); } } private void CreateParagonStuff(BaseTSMTheme theme) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) paragonStuff = GameObjectExt.AddModHelperPanel(((Component)theme).gameObject, new Info("ParagonStuff", (InfoPreset)0), (string)null, (Axis?)null, 50f, 0); degreeButton = ((ModHelperComponent)paragonStuff).AddButton(new Info("ParagonButton", 375f, -75f, 135f), "Ui[UpgradeContainerParagon]", Action.op_Implicit((Action)delegate { showingExtraParagonInfo = !showingExtraParagonInfo; UpdateExtraInfo(); })); degreeText = ((ModHelperComponent)degreeButton).AddText(new Info("DegreeText", (InfoPreset)0), "0", 60f); ModHelperPanel obj = paragonStuff; Info val = default(Info); ((Info)(ref val))..ctor("ExtraParagonInfo", 50f, -50f, 500f); ((Info)(ref val)).set_PivotY(1f); extraParagonInfo = ((ModHelperComponent)obj).AddPanel(val, (string)null, (Axis?)(Axis)1); paragonDetails = IEnumerableExt.ToIl2CppList(ParagonDetail.CreateTexts(extraParagonInfo)); } private unsafe void CreateTempleStuff(BaseTSMTheme theme) { //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) templeStuff = GameObjectExt.AddModHelperPanel(((Component)theme).gameObject, new Info("TempleStuff", (InfoPreset)0), (string)null, (Axis?)null, 50f, 0); sacrificeToggle = ((ModHelperComponent)templeStuff).AddButton(new Info("TempleButton", 375f, -75f, 120f), "Ui[NotificationYellow]", Action.op_Implicit((Action)delegate { ToggleShowingExtraInfo(); UpdateUpgradeCosts(); TowerSelectionMenu componentInParent = ((Component)theme).GetComponentInParent(); for (int i = 0; i < ((Il2CppArrayBase)(object)componentInParent.upgradeButtons).Count; i++) { UpgradeObject val2 = ((Il2CppArrayBase)(object)componentInParent.upgradeButtons)[i]; val2.UpdateCost(); val2.UpdateVisuals(i, false); } UpdateExtraInfo(); })); ((ModHelperComponent)sacrificeToggle).AddImage(new Info("SacrificeIcon", 80f), "UiBuffIcons[BuffIconBloodSacrifice]"); ModHelperPanel obj = templeStuff; Info val = default(Info); ((Info)(ref val))..ctor("ExtraSacrificeInfo", 50f, -50f, 500f); ((Info)(ref val)).set_PivotY(1f); extraSacrificeInfo = ((ModHelperComponent)obj).AddPanel(val, (string)null, (Axis?)(Axis)1); IEnumerable enumerable = from s in ((TowerSet)15).Enumerate() select CreateInfoLine(extraSacrificeInfo, ((object)(*(TowerSet*)(&s))/*cast due to .constrained prefix*/).ToString(), $"MainMenuUiAtlas[{s}Btn]"); sacrificeTowerSets = IEnumerableExt.ToIl2CppList(enumerable); } public override void TowerChanged(BaseTSMTheme theme, TowerToSimulation tower) { if (tower != null) { if (ModSettingBool.op_Implicit(ParagonSacrificeInfo)) { UpdateParagonStuff(tower); } if (ModSettingBool.op_Implicit(TempleSacrificeInfo)) { UpdateTempleStuff(tower); } UpdateExtraInfo(); } } private void UpdateParagonStuff(TowerToSimulation tower) { //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) bool flag = TowerSelectionMenuUtils.CanUpgradeToParagon(tower, true); ((ModHelperComponent)paragonStuff).SetActive(flag); if (flag) { InvestmentInfo investmentInfo; long paragonDegree = Utils.GetParagonDegree(tower, out investmentInfo); degreeText.SetText($"{paragonDegree}"); ((Graphic)degreeText.Text).color = ((paragonDegree >= 100) ? Color.green : Color.white); List list = Il2CppGenericsExt.ToList(paragonDetails); for (int i = 0; i < ParagonDetail.AllDetails.Count; i++) { ParagonDetail.AllDetails[i].Update(list[i], investmentInfo); } } } private unsafe void UpdateTempleStuff(TowerToSimulation tower) { //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_0133: Unknown result type (might be due to invalid IL or missing references) Il2CppReferenceArray upgrades = tower.Def.upgrades; bool flag = upgrades != null && Il2CppReferenceArray.Any(upgrades, (Func)((UpgradePathModel model) => model.upgrade == "Sun Temple")); Il2CppReferenceArray upgrades2 = tower.Def.upgrades; bool flag2 = upgrades2 != null && Il2CppReferenceArray.Any(upgrades2, (Func)((UpgradePathModel model) => model.upgrade == "True Sun God")); ((ModHelperComponent)templeStuff).SetActive(flag || flag2); if (flag || flag2) { Dictionary towerWorths = Utils.GetTowerWorths(tower.tower); Dictionary colors = Utils.GetColors(towerWorths, flag2); List list = ((TowerSet)15).Enumerate().ToList(); List list2 = Il2CppGenericsExt.ToList(sacrificeTowerSets); for (int num = 0; num < list2.Count; num++) { TowerSet val = list[num]; ModHelperText val2 = list2[num]; val2.SetText($"${towerWorths[((object)(*(TowerSet*)(&val))/*cast due to .constrained prefix*/).ToString()]:N0}"); ((Graphic)val2.Text).color = colors[((object)(*(TowerSet*)(&val))/*cast due to .constrained prefix*/).ToString()]; } } } private void UpdateExtraInfo() { if (ModSettingBool.op_Implicit(ParagonSacrificeInfo)) { ((ModHelperComponent)extraParagonInfo).SetActive(showingExtraParagonInfo); } if (ModSettingBool.op_Implicit(TempleSacrificeInfo)) { ((ModHelperComponent)extraSacrificeInfo).SetActive(showingExtraTempleInfo); } } private static ModHelperText CreateInfoLine(ModHelperPanel parent, string id, string icon) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) ModHelperPanel val = ((ModHelperComponent)parent).AddPanel(new Info(id, 500f, 100f), (string)null, (Axis?)(Axis)0, 25f); ((ModHelperComponent)val).AddImage(new Info("Icon", 100f), icon); ModHelperText val2 = ((ModHelperComponent)val).AddText(new Info("Amount", 350f, 100f), "", 69f); ((TMP_Text)val2.Text).alignment = (TextAlignmentOptions)4097; return val2; } } public class ParagonDetail { private float current; private float max; public static List AllDetails { get; } public string Name { get; } public string Icon { get; } public Func Current { get; } public Func? Max { get; } public Action? ModifyIcon { get; } static ParagonDetail() { AllDetails = new List(5) { new ParagonDetail("Money Spent", "Ui[CoinIcon]", (InvestmentInfo info) => info.powerFromMoneySpent, (ParagonDegreeDataModel model) => model.maxPowerFromMoneySpent), new ParagonDetail("Pops / Generated Cash", "IngameUi[PopIcon]", (InvestmentInfo info) => info.powerFromPops, (ParagonDegreeDataModel model) => model.maxPowerFromPops), new ParagonDetail("Non Tier 5 Upgrades Purchased", "Ui[UpgradeContainerGrey]", (InvestmentInfo info) => info.powerFromNonTier5Tiers, (ParagonDegreeDataModel model) => model.maxPowerFromNonTier5Count, delegate(ModHelperComponent image) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) image.AddText(new Info("Text", (InfoPreset)0), "<5", 69f); }), new ParagonDetail("Having Tier 5 Towers", "Ui[UpgradeContainerTier5]", (InvestmentInfo info) => info.powerFromTier5Count, (ParagonDegreeDataModel model) => model.maxPowerFromTier5Count, delegate(ModHelperComponent image) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) image.AddText(new Info("Text", (InfoPreset)0), "5", 69f); }), new ParagonDetail("Geraldo Totems", "44ec3db93dc5cb847aaf730cea6c6084", (InvestmentInfo info) => info.powerFromBonus) }; } public ParagonDetail(string name, string icon, Func current, Func? max = null, Action? modifyIcon = null) { Name = name; Icon = icon; Current = current; Max = max; ModifyIcon = modifyIcon; } public void Update(ModHelperText text, InvestmentInfo investmentInfo) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) current = Current(investmentInfo); max = Max?.Invoke(InGameExt.GetGameModel(InGame.instance).paragonDegreeDataModel) ?? (-1f); text.SetText($"{current:N0}"); ((Graphic)text.Text).color = ((max > 0f && current >= max) ? Color.green : Color.white); } public static IEnumerable CreateTexts(ModHelperPanel extraParagonInfo) { return AllDetails.Select((ParagonDetail detail) => detail.CreateInfoLine(extraParagonInfo)); } private ModHelperText CreateInfoLine(ModHelperPanel parent) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) ModHelperPanel val = ((ModHelperComponent)parent).AddPanel(new Info(Name, 500f, 100f), (string)null, (Axis?)(Axis)0, 25f); ModHelperButton obj = ((ModHelperComponent)val).AddButton(new Info("Icon", 100f), Icon, Action.op_Implicit((Action)delegate { string message = $"You are getting {current:N0} Paragon Power from {Name}."; if (max > 0f) { message += $" You are {current / max:P0} of the way to the maximum of {max:N0}."; } PopupScreenExt.SafelyQueue(PopupScreen.instance, (Action)delegate(PopupScreen screen) { screen.ShowOkPopup(message, (ReturnCallback)null); }); })); ModifyIcon?.Invoke((ModHelperComponent)(object)obj); ModHelperText val2 = ((ModHelperComponent)val).AddText(new Info("Amount", 350f, 100f), "", 69f); ((TMP_Text)val2.Text).alignment = (TextAlignmentOptions)4097; return val2; } } public static class Utils { public static void DefaultTemple(UpgradeModel upgradeModel) { upgradeModel.confirmation = ((SacrificeHelperMod.AutoSacrificeMode == AutoSacrificeMode.Off) ? "Sun Temple" : ""); int cost = Game.instance.model.GetUpgrade(((Model)upgradeModel).name).cost; int num = CostHelper.CostForDifficulty(cost, InGame.instance); AutoSacrificeMode autoSacrificeMode = SacrificeHelperMod.AutoSacrificeMode; if (1 == 0) { } int num2 = autoSacrificeMode switch { AutoSacrificeMode.Off => 0, AutoSacrificeMode.Sacrifice2222 => 200000, _ => 150000, }; if (1 == 0) { } upgradeModel.cost = num + num2; } public static void ModifyTemple(UpgradeModel upgradeModel) { upgradeModel.confirmation = ""; int cost = Game.instance.model.GetUpgrade(((Model)upgradeModel).name).cost; ModSettingDouble templeAlternateCostMod = SacrificeHelperMod.TempleAlternateCostMod; upgradeModel.cost = CostHelper.CostForDifficulty((int)((float)cost * ModSettingDouble.op_Implicit(templeAlternateCostMod)), InGame.instance); } public static void DefaultGod(UpgradeModel upgradeModel) { upgradeModel.confirmation = ((SacrificeHelperMod.AutoSacrificeMode == AutoSacrificeMode.Off) ? "True Sun God" : ""); int cost = Game.instance.model.GetUpgrade(((Model)upgradeModel).name).cost; int num = CostHelper.CostForDifficulty(cost, InGame.instance); AutoSacrificeMode autoSacrificeMode = SacrificeHelperMod.AutoSacrificeMode; if (1 == 0) { } int num2 = ((autoSacrificeMode != AutoSacrificeMode.Off) ? 200000 : 0); if (1 == 0) { } upgradeModel.cost = num + num2; } public static void ModifyGod(UpgradeModel upgradeModel) { upgradeModel.confirmation = ""; int cost = Game.instance.model.GetUpgrade(((Model)upgradeModel).name).cost; ModSettingDouble godAlternateCostMod = SacrificeHelperMod.GodAlternateCostMod; upgradeModel.cost = CostHelper.CostForDifficulty((int)((float)cost * ModSettingDouble.op_Implicit(godAlternateCostMod)), InGame.instance); } public static Dictionary GetColors(Dictionary worths, bool god) { //IL_0112: Unknown result type (might be due to invalid IL or missing references) //IL_0117: Unknown result type (might be due to invalid IL or missing references) //IL_0129: Unknown result type (might be due to invalid IL or missing references) //IL_012e: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_017c: Unknown result type (might be due to invalid IL or missing references) //IL_0171: Unknown result type (might be due to invalid IL or missing references) //IL_0176: 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) Dictionary dictionary = new Dictionary(); if (!god) { string key = ""; float min = float.MaxValue; foreach (string item in worths.Keys.Where((string key2) => worths[key2] < min)) { key = item; min = worths[item]; } dictionary[key] = Color.red; } foreach (string key2 in worths.Keys) { if (dictionary.ContainsKey(key2)) { continue; } float num = worths[key2]; Color value = Color.red; if (num > 50000f) { value = Color.green; } else if (key2 == "Magic") { if (num > 1000f) { value = Color.white; } } else if (num > 300f) { value = Color.white; } dictionary[key2] = value; } return dictionary; } public static bool IsValidTower(Tower tower) { return !tower.towerModel.isPowerTower && !tower.towerModel.isGeraldoItem && !tower.towerModel.IsBeastHandlerPet && !tower.towerModel.isParagon && ((EntityModel)tower.towerModel).baseId != "TempleBase-TempleBase"; } public unsafe static Dictionary GetTowerWorths(Tower tower) { return ((TowerSet)15).Enumerate().ToDictionary((TowerSet s) => ((object)(*(TowerSet*)(&s))/*cast due to .constrained prefix*/).ToString(), (TowerSet s) => GetTowerSetWorth(s, tower)); } private static float GetTowerSetWorth(TowerSet towerSet, Tower tower) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) return (from t in Il2CppGenericIEnumerableExt.ToList(InGameExt.GetTowerManager(InGame.instance).GetTowersInRange(((CommonBehaviorProxy)(object)tower).Position, tower.towerModel.range)) where t.towerModel.towerSet == towerSet && ((RootObject)t).Id != ((RootObject)tower).Id && IsValidTower(t) select t).Sum((Tower t) => t.worth); } private static ParagonTower FakeParagonTower(Tower tower) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Expected O, but got Unknown return new ParagonTower { Sim = ((RootObject)tower).Sim, entity = ((RootBehavior)tower).entity, model = ((RootBehavior)tower).model, tower = tower, isActive = true, activeAt = -1 }; } public static UpgradeModel GetParagonUpgrade(Tower tower) { GameModel val = (((Object)(object)InGame.instance != (Object)null) ? InGame.Bridge.Model : Game.instance.model); BloonsMod val2 = default(BloonsMod); return (((Mutable)tower).IsMutatedBy("HonoraryParagon") && ModHelper.HasMod("HonoraryParagons", ref val2)) ? val2.Call("GetParagonUpgrade", new object[2] { val, tower.towerModel }) : val.GetParagonUpgradeForTowerId(((EntityModel)tower.towerModel).baseId); } public static long GetParagonDegree(TowerToSimulation tower, out InvestmentInfo investmentInfo, float bonus = 0f) { //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0182: Unknown result type (might be due to invalid IL or missing references) //IL_019b: Unknown result type (might be due to invalid IL or missing references) //IL_01a0: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Unknown result type (might be due to invalid IL or missing references) GameModel model = tower.sim.Model; ParagonDegreeDataModel paragonDegreeDataModel = model.paragonDegreeDataModel; float num = (tower.IsParagon ? ((float)GetParagonUpgrade(tower.tower).cost) : tower.GetUpgradeCost(0, 6, -1f, true)); float num2 = bonus * paragonDegreeDataModel.moneySpentOverX / ((1f + paragonDegreeDataModel.paidContributionPenalty) * num); InvestmentInfo seed = new InvestmentInfo { powerFromMoneySpent = num2 }; ParagonTower paragonTower = default(ParagonTower); if (Il2CppSystemObjectExt.Is(((RootBehavior)tower.tower).entity.GetBehavior(), ref paragonTower)) { InvestmentInfo investmentInfo2 = paragonTower.investmentInfo; investmentInfo2.totalInvestment = paragonTower.investmentInfo.totalInvestment + num2; investmentInfo = investmentInfo2; } else { paragonTower = FakeParagonTower(tower.tower); paragonTower.upgradeCost = num; int index = 0; investmentInfo = (from tts in InGameExt.GetAllTowerToSim(InGame.instance, (string)null) where !tts.IsParagon && !((Mutable)tts.tower).IsMutatedBy("DoorGunnerMutator") && (((EntityModel)tts.Def).baseId == ((EntityModel)tower.Def).baseId || ((Model)tts.Def).GetChild() != null) orderby paragonTower.GetTowerInvestment(tts.tower, 3).totalInvestment select paragonTower.GetTowerInvestment(tts.tower, (tts.Def.tier >= 5) ? index++ : 3)).Aggregate(seed, (Func)paragonTower.CombineInvestments); } long num3 = 0L; BloonsMod val = default(BloonsMod); if (ModHelper.HasMod("Paragonomics", ref val)) { num3 = (int)val.Call("GetDegree", new object[1] { investmentInfo.totalInvestment }); } else { while (investmentInfo.totalInvestment >= (float)((Il2CppArrayBase)(object)paragonDegreeDataModel.powerDegreeRequirements)[(int)num3]) { num3++; if (num3 == ((Il2CppArrayBase)(object)paragonDegreeDataModel.powerDegreeRequirements).Length) { break; } } } return num3; } } [HarmonyPatch(typeof(ParagonConfirmationPopup), "UpdateCurrentInvestment")] internal static class ParagonConfirmationPopup_UpdateCurrentInvestment { [HarmonyPostfix] private static void Postfix(ParagonConfirmationPopup __instance, float current) { //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Unknown result type (might be due to invalid IL or missing references) TowerToSimulation selectedTower = TowerSelectionMenuExt.instance.selectedTower; float num = current; int cost = Utils.GetParagonUpgrade(selectedTower.tower).cost; if (__instance.upgradeCost != 0 && InGame.Bridge.GetCash(-1) < (double)cost) { num += (float)__instance.upgradeCost; num -= (float)cost; } InvestmentInfo investmentInfo; long paragonDegree = Utils.GetParagonDegree(selectedTower, out investmentInfo, num); NK_TextMeshProUGUI componentFromChildrenByName = ComponentExt.GetComponentFromChildrenByName((Component)(object)((Component)__instance).transform, "DegreeText"); componentFromChildrenByName.SetText(paragonDegree.ToString()); ((Graphic)componentFromChildrenByName).color = Color.white; if (paragonDegree >= 100) { BloonsMod mod = ModHelper.GetMod("Paragonomics"); if ((bool?)((mod != null) ? mod.ModSettings["NoDegreeLimit"].GetValue() : null) != true) { ((Graphic)componentFromChildrenByName).color = Color.green; } } } } [HarmonyPatch(typeof(ParagonConfirmationPopup), "Init", new Type[] { typeof(Action), typeof(Action), typeof(int), typeof(int), typeof(int), typeof(BackGround), typeof(TransitionAnim) })] internal static class ParagonConfirmationPopup_Init { [HarmonyPostfix] private static void Postfix(ParagonConfirmationPopup __instance) { //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) TowerToSimulation selectedTower = TowerSelectionMenuExt.instance.selectedTower; int num = 0; int cost = Utils.GetParagonUpgrade(selectedTower.tower).cost; if (__instance.upgradeCost != 0 && InGame.Bridge.GetCash(-1) < (double)cost) { num += __instance.upgradeCost; num -= cost; } InvestmentInfo investmentInfo; long paragonDegree = Utils.GetParagonDegree(selectedTower, out investmentInfo, num); GameObject gameObject = ((Component)((Popup)__instance).animator).gameObject; ModHelperImage val = ModHelperImage.Create(new Info("DegreeIndicator", 0f, -450f, 250f, 250f), "Ui[UpgradeContainerParagon]"); GameObjectExt.AddModHelperComponent(gameObject, val); ((ModHelperComponent)val).AddText(new Info("DegreeText", (InfoPreset)0), paragonDegree.ToString(), 100f); } } private static readonly ModSettingBool TempleSacrificeInfo = new ModSettingBool(true) { description = "Shows indicators for Sun Temple and True Sun God sacrifices for how much of each tower category is in range.", icon = "4798e98bc64924a999a410acde0ac904" }; private static readonly ModSettingBool ParagonSacrificeInfo = new ModSettingBool(true) { description = "Shows indicators for Paragon sacrifices for how what degree the paragon will be, and also how much power is coming from each source.", icon = "1757f8ef9167a3842b6d977f379d8548" }; public static void UpdateUpgradeCosts(GameModel? gameModel = null) { if (gameModel == null) { gameModel = InGameExt.GetGameModel(InGame.instance); } UpgradeModel upgrade = gameModel.GetUpgrade("Sun Temple"); UpgradeModel upgrade2 = gameModel.GetUpgrade("True Sun God"); if (SacrificeHelperMod.templeSacrificesOff) { Utils.ModifyTemple(upgrade); Utils.ModifyGod(upgrade2); } else { Utils.DefaultTemple(upgrade); Utils.DefaultGod(upgrade2); } foreach (MonkeyTempleModel item in from tower in ((IEnumerable)MonoLinqHelper.ToArray(gameModel.GetTowersWithBaseId(TowerType.SuperMonkey, false))).Where(delegate(TowerModel tower) { Il2CppStringArray appliedUpgrades = tower.appliedUpgrades; return appliedUpgrades != null && ((Il2CppArrayBase)(object)appliedUpgrades).Contains("Sun Temple") && !((Il2CppArrayBase)(object)tower.appliedUpgrades).Contains("True Sun God"); }) select TowerModelBehaviorExt.GetBehavior(tower)) { item.towerGroupCount = (ModSettingBool.op_Implicit(SacrificeHelperMod.FourCategorySunTemples) ? 4 : 3); } } } internal static class TowerSetExt { [SpecialName] public sealed class $0BDFE946FF9530C0E65A0F67758E2703 { [SpecialName] public static class $6938555CF6C5DEAE31E69F666B5131BF { } [ExtensionMarker("$6938555CF6C5DEAE31E69F666B5131BF")] public IEnumerable Enumerate() { throw new NotSupportedException(); } } public static IEnumerable Enumerate(this TowerSet towerSet) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) TowerSet[] values = Enum.GetValues(); int i = 1; while (values.Contains((TowerSet)i)) { if (((Enum)towerSet).HasFlag((Enum)(object)(TowerSet)i)) { yield return (TowerSet)i; } i *= 2; } } } }