Decompiled source of HeroXpScale v1.0.3

HeroXpScale.dll

Decompiled 12 hours ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BTD_Mod_Helper;
using BTD_Mod_Helper.Api;
using BTD_Mod_Helper.Api.ModOptions;
using BTD_Mod_Helper.Extensions;
using BTD_Mod_Helper.UI.Menus;
using HeroXpScale;
using Il2CppAssets.Scripts.Models;
using Il2CppAssets.Scripts.Models.TowerSets;
using Il2CppAssets.Scripts.Models.Towers;
using Il2CppAssets.Scripts.Models.Towers.Upgrades;
using Il2CppAssets.Scripts.Unity;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
using Il2CppSystem;
using MelonLoader;
using Microsoft.CodeAnalysis;
using Newtonsoft.Json.Linq;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: MelonInfo(typeof(HeroXpScaleMod), "Hero XP Scale", "1.0.3", "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("HeroXpScale")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+9229b6bd15568870e14fc49df0c97c355dc45361")]
[assembly: AssemblyProduct("HeroXpScale")]
[assembly: AssemblyTitle("HeroXpScale")]
[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;
		}
	}
}
namespace HeroXpScale
{
	public class HeroXpScaleMod : BloonsTD6Mod
	{
		private const int RoundNumberXpLevel = 4;

		public const float DefaultMin = 1f;

		public const float DefaultMax = 1.71f;

		public const float StepSize = 0.005f;

		private static readonly string BaseHero = TowerType.Quincy;

		public static readonly Dictionary<string, ModSettingFloat> HeroXpScales = new Dictionary<string, ModSettingFloat>();

		internal static readonly Dictionary<string, double> LoadedXpScales = new Dictionary<string, double>();

		public static readonly ModSettingBool BalancedMode;

		public override void OnNewGameModel(GameModel gameModel)
		{
			int[] array = (from upgrade in ((IEnumerable<string>)Il2CppGenericIEnumerable.AsIEnumerable<TowerModel>(Game.instance.model.GetTowersWithBaseId(BaseHero, false)).MaxBy((TowerModel model) => model.tier).appliedUpgrades).Select((Func<string, UpgradeModel>)Game.instance.model.GetUpgrade)
				select upgrade.xpCost).ToArray();
			foreach (KeyValuePair<string, ModSettingFloat> heroXpScale in HeroXpScales)
			{
				heroXpScale.Deconstruct(out var key, out var value);
				string text = key;
				ModSettingFloat val = value;
				Il2CppStringArray appliedUpgrades = Il2CppGenericIEnumerable.AsIEnumerable<TowerModel>(gameModel.GetTowersWithBaseId(text, false)).MaxBy((TowerModel model) => model.tier).appliedUpgrades;
				for (int num = 0; num < ((Il2CppArrayBase<string>)(object)appliedUpgrades).Length; num++)
				{
					gameModel.GetUpgrade(((Il2CppArrayBase<string>)(object)appliedUpgrades)[num]).xpCost = Math.Max((int)Math.Round((float)array[num] * ModSettingDouble.op_Implicit((ModSettingDouble)(object)val)), 1);
				}
			}
		}

		public override void OnLoadSettings(JObject settings)
		{
			foreach (var (text2, val2) in settings)
			{
				if (!text2.EndsWith("XpScale"))
				{
					continue;
				}
				double? num = ((val2 != null) ? new double?(Extensions.Value<double>((IEnumerable<JToken>)val2)) : ((double?)null));
				if (num.HasValue)
				{
					double valueOrDefault = num.GetValueOrDefault();
					if (true)
					{
						LoadedXpScales[text2] = valueOrDefault;
					}
				}
			}
		}

		public static float GetXpScale(string heroId)
		{
			int xpCost = TowerModelExt.GetAppliedUpgrades(Game.instance.model.GetHeroWithNameAndLevel(BaseHero, 4, false)).Last().xpCost;
			int xpCost2 = TowerModelExt.GetAppliedUpgrades(Game.instance.model.GetHeroWithNameAndLevel(heroId, 4, false)).Last().xpCost;
			return (float)xpCost2 / (float)xpCost;
		}

		static HeroXpScaleMod()
		{
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: 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_008e: 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_00af: Expected O, but got Unknown
			//IL_00b4: Expected O, but got Unknown
			ModSettingBool val = new ModSettingBool(true)
			{
				description = $"Keeps the sliders locked to the vanilla low and high of {1f}x and {1.71f}x",
				button = true,
				enabledText = "ON",
				disabledText = "OFF"
			};
			((ModSetting<bool>)val).onValueChanged = delegate
			{
				foreach (ModSettingFloat value in HeroXpScales.Values)
				{
					((ModSettingNumber<double>)(object)value).min = (ModSettingBool.op_Implicit(BalancedMode) ? 1f : 0.005f);
					((ModSettingNumber<double>)(object)value).max = (ModSettingBool.op_Implicit(BalancedMode) ? 1.71f : 2f);
					if ((double)((ModSetting)value).GetValue() < ((ModSettingNumber<double>)(object)value).min)
					{
						((ModSetting)value).SetValue((object)((ModSettingNumber<double>)(object)value).min);
					}
					if ((double)((ModSetting)value).GetValue() > ((ModSettingNumber<double>)(object)value).max)
					{
						((ModSetting)value).SetValue((object)((ModSettingNumber<double>)(object)value).max);
					}
				}
				((ModGameMenu)ModContent.GetInstance<ModSettingsMenu>()).OnMenuOpened((Object)null);
			};
			BalancedMode = val;
		}
	}
	public class HeroXpScaleSettings : ModContent
	{
		protected override float RegistrationPriority => 42f;

		public override void Register()
		{
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: 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_00fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0105: Expected O, but got Unknown
			//IL_0105: Unknown result type (might be due to invalid IL or missing references)
			//IL_0129: Expected O, but got Unknown
			//IL_0129: Unknown result type (might be due to invalid IL or missing references)
			//IL_014d: Expected O, but got Unknown
			//IL_014d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0158: Unknown result type (might be due to invalid IL or missing references)
			//IL_016c: Expected O, but got Unknown
			string value = ((ModContent)this).Localize("XP Scale");
			string value2 = ((ModContent)this).Localize("Default");
			foreach (TowerDetailsModel item in (Il2CppArrayBase<TowerDetailsModel>)(object)Game.instance.model.heroSet)
			{
				TowerModel towerWithName = Game.instance.model.GetTowerWithName(item.towerId);
				float xpScale = HeroXpScaleMod.GetXpScale(item.towerId);
				ModSettingFloat val = new ModSettingFloat(xpScale)
				{
					displayName = $"[{item.towerId}] [{value}]",
					description = $"[{value2}] {xpScale}"
				};
				((ModSettingNumber<double>)val).slider = true;
				((ModSettingNumber<double>)val).min = (ModSettingBool.op_Implicit(HeroXpScaleMod.BalancedMode) ? 1f : 0.005f);
				((ModSettingNumber<double>)val).max = (ModSettingBool.op_Implicit(HeroXpScaleMod.BalancedMode) ? 1.71f : 2f);
				((ModSettingDouble)val).stepSize = 0.005f;
				((ModSetting)val).icon = towerWithName.icon.AssetGUID;
				ModSettingFloat val2 = val;
				if (HeroXpScaleMod.LoadedXpScales.TryGetValue(item.towerId + "XpScale", out var value3))
				{
					((ModSetting)val2).SetValue((object)value3);
				}
				base.mod.ModSettings[item.towerId + "XpScale"] = (ModSetting)(object)val2;
				HeroXpScaleMod.HeroXpScales[item.towerId] = val2;
			}
		}
	}
	public static class ModHelperData
	{
		public const string WorksOnVersion = "55.0";

		public const string Version = "1.0.3";

		public const string Name = "Hero XP Scale";

		public const string Description = "Lets you configure the XP Scales for BTD6 Heroes";

		public const string RepoOwner = "doombubbles";

		public const string PrevRepoName = "hero-xp-scale";

		public const string RepoName = "HeroXpScale";
	}
}