Decompiled source of ReforgeTowers v1.0.8

ReforgeTowers.dll

Decompiled 11 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.Components;
using BTD_Mod_Helper.Api.Display;
using BTD_Mod_Helper.Api.ModOptions;
using BTD_Mod_Helper.Extensions;
using HarmonyLib;
using Il2Cpp;
using Il2CppAssets.Scripts.Models;
using Il2CppAssets.Scripts.Models.Entities;
using Il2CppAssets.Scripts.Models.GenericBehaviors;
using Il2CppAssets.Scripts.Models.Profile;
using Il2CppAssets.Scripts.Models.TowerSets;
using Il2CppAssets.Scripts.Models.Towers;
using Il2CppAssets.Scripts.Models.Towers.Behaviors;
using Il2CppAssets.Scripts.Models.Towers.Behaviors.Attack;
using Il2CppAssets.Scripts.Models.Towers.Projectiles;
using Il2CppAssets.Scripts.Models.Towers.Projectiles.Behaviors;
using Il2CppAssets.Scripts.Models.Towers.Weapons;
using Il2CppAssets.Scripts.Models.Towers.Weapons.Behaviors;
using Il2CppAssets.Scripts.Simulation;
using Il2CppAssets.Scripts.Simulation.Objects;
using Il2CppAssets.Scripts.Simulation.SMath;
using Il2CppAssets.Scripts.Simulation.Towers;
using Il2CppAssets.Scripts.Unity.Bridge;
using Il2CppAssets.Scripts.Unity.UI_New.InGame;
using Il2CppAssets.Scripts.Unity.UI_New.InGame.TowerSelectionMenu;
using Il2CppAssets.Scripts.Unity.Utils;
using Il2CppInterop.Runtime.InteropTypes;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
using Il2CppNinjaKiwi.Common.ResourceUtils;
using Il2CppNinjaKiwi.Localization;
using Il2CppSystem;
using Il2CppTMPro;
using MelonLoader;
using Microsoft.CodeAnalysis;
using ReforgeTowers;
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(ReforgeTowersMod), "Reforge Towers", "1.0.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("ReforgeTowers")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+d4a989cbb0f2955074437532a969cc63a0fc18a9")]
[assembly: AssemblyProduct("ReforgeTowers")]
[assembly: AssemblyTitle("ReforgeTowers")]
[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 ReforgeTowers
{
	public static class Extensions
	{
		public static ModReforge? GetCurrentReforge(this Tower? tower)
		{
			TimedMutator val = ((tower != null) ? ((Mutable)tower).GetMutatorById("ReforgeTowersMod") : null);
			return ((val != null) ? ((Il2CppObjectBase)val.mutator).Cast<RateSupportMutator>() : null)?.GetReforge();
		}

		public static bool HasReforge(this Tower tower)
		{
			return tower.GetCurrentReforge() != null;
		}

		public static bool HasReforge(this Tower tower, out ModReforge modReforge)
		{
			return (modReforge = tower.GetCurrentReforge()) != null;
		}

		public static ModReforge? GetReforge(this RateSupportMutator mutator)
		{
			int key = Convert.ToInt32(mutator.multiplier);
			return ModReforge.ReforgesById.GetValueOrDefault(key);
		}
	}
	public static class ModHelperData
	{
		public const string WorksOnVersion = "54.0";

		public const string Version = "1.0.8";

		public const string Name = "Reforge Towers";

		public const string Description = "Lets you reforge towers in a similar way to how you can reforge items in Terraria.\nThe price of reforging a tower is proportional to its total worth. However, reforges will also affect the costs of a tower's available upgrades, with positive reforges making them more expensive, and negative reforges making them cheaper.\n\nNote: for Heroes, the price multiplier is applied to XP gains instead.";

		public const string RepoOwner = "doombubbles";

		public const string PrevRepoName = "reforge-towers";

		public const string RepoName = "ReforgeTowers";
	}
	public abstract class ModReforge : ModContent
	{
		private static int nextID;

		public static readonly Dictionary<int, ModReforge> ReforgesById = new Dictionary<int, ModReforge>();

		public static readonly Dictionary<string, ModReforge> ReforgesByName = new Dictionary<string, ModReforge>();

		public abstract TowerSet TowerSet { get; }

		public virtual int Damage => 0;

		public virtual int Pierce => 0;

		public virtual float AttackSpeed => 0f;

		public virtual float Range => 0f;

		public virtual float Cash => 0f;

		private IEnumerable<float> Effects => new float[5] { Damage, Pierce, AttackSpeed, Range, Cash };

		public float Weight => ModSettingDouble.op_Implicit(Effects.All((float effect) => effect >= 0f) ? ReforgeTowersMod.GoodReforgeWeight : (Effects.All((float effect) => effect <= 0f) ? ReforgeTowersMod.BadReforgeWeight : ReforgeTowersMod.MixedReforgeWeight));

		public int ReforgeId { get; private set; }

		public float Cost(TowerModel towerModel)
		{
			float num = 0f;
			if (DamageValid(towerModel))
			{
				num += (float)Damage * 0.1f;
			}
			if (PierceValid(towerModel))
			{
				num += (float)Pierce * 0.05f;
			}
			if (RangeValid(towerModel))
			{
				num += Range / 3f;
			}
			if (AttackSpeedValid(towerModel))
			{
				num += AttackSpeed / 2f;
			}
			if (CashValid(towerModel))
			{
				num += Cash;
			}
			return num;
		}

		private static string Sign(float f)
		{
			return (f > 0f) ? "+" : "";
		}

		public string Description(Tower tower)
		{
			TowerModel towerModel = tower.towerModel;
			List<string> list = new List<string>();
			if (DamageValid(towerModel) && Damage != 0)
			{
				list.Add($"{Sign(Damage)}{Damage} Damage");
			}
			if (PierceValid(towerModel) && Pierce != 0)
			{
				list.Add($"{Sign(Pierce)}{Pierce} Pierce");
			}
			if (AttackSpeedValid(towerModel) && AttackSpeed != 0f)
			{
				list.Add($"{Sign(AttackSpeed)}{AttackSpeed:P0} Speed");
			}
			if (RangeValid(towerModel) && Range != 0f)
			{
				list.Add($"{Sign(Range)}{Range:P0} Range");
			}
			if (CashValid(towerModel) && Cash != 0f)
			{
				list.Add($"{Sign(Cash)}{Cash:P0} Cash");
			}
			float num = Cost(towerModel);
			list.Add(towerModel.IsHero() ? $"{Sign(0f - num)}{0f - num:P0} XP" : $"{Sign(num)}{num:P0} Cost");
			return GeneralExtensions.Join<string>((IEnumerable<string>)list, (Func<string, string>)null, ", ");
		}

		public override void Register()
		{
			ReforgeId = nextID++;
			ReforgesById[ReforgeId] = this;
			ReforgesByName[((ModContent)this).Name] = this;
		}

		public virtual bool CanApplyTo(Tower? tower)
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: 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)
			TowerModel val = ((tower != null) ? tower.towerModel : null);
			return val != null && (val.towerSet == TowerSet || (int)TowerSet == 0) && (((Damage == 0 || DamageValid(val)) && (Pierce == 0 || PierceValid(val)) && (Range == 0f || RangeValid(val)) && (AttackSpeed == 0f || AttackSpeedValid(val))) || (Cash > 0f && CashValid(val)));
		}

		private static bool DamageValid(TowerModel towerModel)
		{
			return Il2CppGenericIEnumerable.Any<DamageModel>(((Model)towerModel).GetDescendants<DamageModel>());
		}

		private static bool PierceValid(TowerModel towerModel)
		{
			return Il2CppGenericIEnumerable.Any<ProjectileModel>(((Model)towerModel).GetDescendants<ProjectileModel>(), (Func<ProjectileModel, bool>)((ProjectileModel p) => p.pierce > 0f && (double)p.pierce < 1000000.0));
		}

		private static bool RangeValid(TowerModel towerModel)
		{
			return true;
		}

		private static bool AttackSpeedValid(TowerModel towerModel)
		{
			return Il2CppGenericIEnumerable.Any<WeaponModel>(((Model)towerModel).GetDescendants<WeaponModel>(), (Func<WeaponModel, bool>)((WeaponModel w) => !WeaponModelBehaviorExt.HasBehavior<EmissionsPerRoundFilterModel>(w)));
		}

		private static bool CashValid(TowerModel towerModel)
		{
			return Il2CppGenericIEnumerable.Any<CashModel>(((Model)towerModel).GetDescendants<CashModel>()) || Il2CppGenericIEnumerable.Any<PerRoundCashBonusTowerModel>(((Model)towerModel).GetDescendants<PerRoundCashBonusTowerModel>());
		}

		public void Apply(TowerModel tower)
		{
			if (Damage > 0)
			{
				foreach (DamageModel item in from d in Il2CppGenericIEnumerableExt.ToList<DamageModel>(((Model)tower).GetDescendants<DamageModel>())
					where d.damage > 0f
					select d)
				{
					item.damage = Math.Max(1f, item.damage + (float)Damage);
				}
			}
			if (Pierce > 0)
			{
				foreach (ProjectileModel item2 in from p in Il2CppGenericIEnumerableExt.ToList<ProjectileModel>(((Model)tower).GetDescendants<ProjectileModel>())
					where p.pierce > 0f
					select p)
				{
					item2.pierce = Math.Max(1f, item2.pierce + (float)Pierce);
				}
			}
			if (Range > 0f)
			{
				tower.range *= 1f + Range;
				foreach (AttackModel attackModel in TowerModelExt.GetAttackModels(tower))
				{
					attackModel.range *= 1f + Range;
				}
			}
			if (AttackSpeed > 0f)
			{
				foreach (WeaponModel item3 in TowerModelExt.GetAttackModels(tower).SelectMany((AttackModel attackModel) => (IEnumerable<WeaponModel>)(attackModel.weapons ?? new Il2CppReferenceArray<WeaponModel>(0L))))
				{
					item3.Rate /= 1f + AttackSpeed;
				}
			}
			if (Cash > 0f)
			{
				Il2CppGenericIEnumerable.ForEach<CashModel>(((Model)tower).GetDescendants<CashModel>(), (Action<CashModel>)delegate(CashModel model)
				{
					model.minimum *= 1f + Cash;
					model.maximum *= 1f + Cash;
				});
				Il2CppGenericIEnumerable.ForEach<PerRoundCashBonusTowerModel>(((Model)tower).GetDescendants<PerRoundCashBonusTowerModel>(), (Action<PerRoundCashBonusTowerModel>)delegate(PerRoundCashBonusTowerModel model)
				{
					model.cashPerRound *= 1f + Cash;
				});
			}
			HeroModel val = default(HeroModel);
			if (TowerModelBehaviorExt.HasBehavior<HeroModel>(tower, ref val))
			{
				HeroModel obj = val;
				obj.xpScale /= 1f + Cost(tower);
			}
		}
	}
	[HarmonyPatch(typeof(RateSupportMutator), "Mutate")]
	internal static class RateMutator_Mutate
	{
		[HarmonyPrefix]
		private static bool Prefix(RateSupportMutator __instance, Model model, ref bool __result)
		{
			if (((BehaviorMutator)__instance).id != "ReforgeTowersMod")
			{
				return true;
			}
			TowerModel tower = ((Il2CppObjectBase)model).Cast<TowerModel>();
			ModReforge reforge = __instance.GetReforge();
			reforge.Apply(tower);
			__result = true;
			return false;
		}
	}
	[HarmonyPatch]
	internal static class TowerSelectionMenu_Show
	{
		private static IEnumerable<MethodBase> TargetMethods()
		{
			yield return AccessTools.Method(typeof(TowerSelectionMenu), "Show", (Type[])null, (Type[])null);
			yield return AccessTools.Method(typeof(TowerSelectionMenu), "UpdateTower", (Type[])null, (Type[])null);
		}

		[HarmonyPostfix]
		private static void Postfix(TowerSelectionMenu __instance)
		{
			ReforgePanel reforgePanel = ((Component)__instance).GetComponentInChildren<ReforgePanel>();
			if ((Object)(object)reforgePanel == (Object)null)
			{
				reforgePanel = ReforgePanel.Create(__instance);
			}
			reforgePanel.UpdateVisuals();
		}
	}
	[HarmonyPatch(typeof(TowerSelectionMenu), "CashChanged")]
	internal static class TowerSelectionMenu_CashChanged
	{
		[HarmonyPostfix]
		private static void Postfix(TowerSelectionMenu __instance)
		{
			ReforgePanel componentInChildren = ((Component)__instance).GetComponentInChildren<ReforgePanel>();
			if (!((Object)(object)componentInChildren == (Object)null))
			{
				componentInChildren.UpdateCost();
			}
		}
	}
	[HarmonyPatch(typeof(Simulation), "GetSimulationBehaviorDiscount")]
	internal static class Simulation_GetSimulationBehaviorDiscount
	{
		[HarmonyPostfix]
		private static void Postfix(Tower tower, ref float __result)
		{
			if (tower.HasReforge(out ModReforge modReforge))
			{
				__result -= modReforge.Cost(tower.towerModel);
			}
		}
	}
	[RegisterTypeInIl2Cpp(false)]
	public class ReforgePanel : MonoBehaviour
	{
		public TowerSelectionMenu menu = null;

		public ModHelperButton button = null;

		public ModHelperText cost = null;

		public ModHelperText description = null;

		public ReforgePanel(IntPtr ptr)
			: base(ptr)
		{
		}

		public void OnReforgeClicked()
		{
			Tower tower = menu.selectedTower.tower;
			int reforgeCost = ReforgeTowersMod.GetReforgeCost(tower);
			if (!(InGameExt.GetCash(InGame.instance) >= (double)reforgeCost))
			{
				return;
			}
			InGameExt.AddCash(InGame.instance, (double)(-reforgeCost));
			ReforgeTowersMod.RandomlyReforge(tower);
			UpdateVisuals();
			foreach (UpgradeObject item in ((IEnumerable<UpgradeObject>)menu.upgradeButtons).Where((UpgradeObject o) => ((Behaviour)o).isActiveAndEnabled))
			{
				item.UpdateVisuals(item.path, false);
			}
		}

		public void UpdateVisuals()
		{
			TowerToSimulation selectedTower = menu.selectedTower;
			Tower val = ((selectedTower != null) ? selectedTower.tower : null);
			if (val == null)
			{
				return;
			}
			ModReforge currentReforge = val.GetCurrentReforge();
			if (currentReforge != null)
			{
				description.SetText(currentReforge.Description(val));
				NK_TextMeshProUGUI val2 = ComponentExt.GetComponentFromChildrenByName<NK_TextMeshProUGUI>((Component)(object)menu, "TowerNameText");
				string text = LocalizationManager.Instance.GetText(((EntityModel)val.towerModel).baseId);
				RectTransform val3 = default(RectTransform);
				if (GameObjectExt.Exists<RectTransform>(ComponentExt.GetComponentFromChildrenByName<RectTransform>((Component)(object)menu, "TSMNamedMonkeysInput"), ref val3) && ((Component)val3).gameObject.active)
				{
					val2 = ((Component)val3).GetComponentInChildren<NK_TextMeshProUGUI>();
					((TMP_Text)val2).enableAutoSizing = true;
					text = InGame.Bridge.GetNamedMonkeyName(InGame.Bridge.MyPlayerNumber, val.namedMonkeyKey);
				}
				if ((Object)(object)val2 == (Object)null)
				{
					TaskScheduler.ScheduleTask((Action)UpdateVisuals, (Func<bool>)null);
				}
				else
				{
					val2.SetText(((ModContent)currentReforge).Name + " " + text);
				}
			}
			else
			{
				description.SetText("Not Yet Reforged");
			}
			UpdateCost();
		}

		public void UpdateCost()
		{
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			TowerToSimulation selectedTower = menu.selectedTower;
			Tower val = ((selectedTower != null) ? selectedTower.tower : null);
			if (val != null)
			{
				int reforgeCost = ReforgeTowersMod.GetReforgeCost(val);
				cost.SetText($"${reforgeCost:N0}");
				bool flag = InGameExt.GetCash(InGame.instance) >= (double)reforgeCost;
				((Graphic)cost.Text).color = (flag ? Color.white : Color.red);
				((Selectable)button.Button).interactable = flag;
			}
		}

		public static ReforgePanel Create(TowerSelectionMenu menu)
		{
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: 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)
			//IL_00be: 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_0118: Unknown result type (might be due to invalid IL or missing references)
			//IL_0130: Unknown result type (might be due to invalid IL or missing references)
			//IL_0153: Unknown result type (might be due to invalid IL or missing references)
			//IL_0194: Unknown result type (might be due to invalid IL or missing references)
			ModHelperPanel val = GameObjectExt.AddModHelperPanel(((Component)menu.scalar).gameObject, new Info("ReforgePanel", 0f, -1240f, 950f, 250f), "Ui[BrownInsertPanel]", (Axis?)null, 50f, 0);
			ReforgePanel reforgePanel = ((ModHelperComponent)val).AddComponent<ReforgePanel>();
			reforgePanel.menu = menu;
			Info val2 = default(Info);
			((Info)(ref val2))..ctor("InnerPanel");
			((Info)(ref val2)).set_AnchorMin(new Vector2(0f, 0f));
			((Info)(ref val2)).set_AnchorMax(new Vector2(1f, 1f));
			((Info)(ref val2)).set_Size(-50f);
			ModHelperPanel val3 = ((ModHelperComponent)val).AddPanel(val2, "Ui[BrownInsertPanelDark]", (Axis?)(Axis)0, 25f);
			reforgePanel.button = ((ModHelperComponent)val3).AddButton(new Info("ReforgeButton", 225f), "Ui[GreenBtn]", Action.op_Implicit((Action)reforgePanel.OnReforgeClicked));
			ModHelperButton obj = reforgePanel.button;
			((Info)(ref val2))..ctor("Image");
			((Info)(ref val2)).set_AnchorMin(new Vector2(0f, 0f));
			((Info)(ref val2)).set_AnchorMax(new Vector2(1f, 1f));
			((Info)(ref val2)).set_Size(-50f);
			((ModHelperComponent)obj).AddImage(val2, ModContent.GetTextureGUID<ReforgeTowersMod>("Hammer"));
			reforgePanel.cost = ((ModHelperComponent)val3).AddText(new Info("ReforgeCost", 200f, 200f), "$0", 80f, (TextAlignmentOptions)513);
			((TMP_Text)reforgePanel.cost.Text).enableAutoSizing = true;
			reforgePanel.description = ((ModHelperComponent)val3).AddText(new Info("ReforgeDescription", 375f, 250f), "Description", 42f);
			return reforgePanel;
		}
	}
	public class ReforgeTowersMod : BloonsTD6Mod
	{
		public class HammerBuffIcon : ModBuffIcon
		{
			public override string Icon => "Hammer";
		}

		public static readonly ModSettingDouble BadReforgeWeight;

		public static readonly ModSettingDouble MixedReforgeWeight;

		public static readonly ModSettingDouble GoodReforgeWeight;

		public static readonly ModSettingDouble ReforgeCost;

		public static int GetReforgeCost(Tower tower)
		{
			return 5 + 5 * (int)Math.Round(ModSettingDouble.op_Implicit(ReforgeCost) * tower.worth / 500f);
		}

		public static void SetTowerReforge(Tower tower, ModReforge reforge)
		{
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Expected O, but got Unknown
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Expected O, but got Unknown
			HammerBuffIcon instance = ModContent.GetInstance<HammerBuffIcon>();
			((Mutable)tower).RemoveMutatorsById("ReforgeTowersMod");
			((Mutable)tower).AddMutator((BehaviorMutator)new RateSupportMutator(true, "ReforgeTowersMod", (float)reforge.ReforgeId, 0, new BuffIndicatorModel("BuffIndicatorModel", ((ModBuffIcon)instance).BuffLocsName, ((ModBuffIcon)instance).BuffIconName, false, 0, false, false), false, (DisplayModel)null), -1, true, true, false, true, false, false, false, -1, false, false);
		}

		public static void RandomlyReforge(Tower tower)
		{
			//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c5: 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_00e8: Expected O, but got Unknown
			ModReforge currentReforge = tower.GetCurrentReforge();
			WeightedGroup<string> val = new WeightedGroup<string>();
			foreach (ModReforge item in from modReforge2 in ModContent.GetContent<ModReforge>()
				where modReforge2 != currentReforge && modReforge2.CanApplyTo(tower)
				select modReforge2)
			{
				val.Add(((ModContent)item).Name, item.Weight);
			}
			ModReforge modReforge = ModReforge.ReforgesByName[val.GetRandom()];
			SetTowerReforge(tower, modReforge);
			InGame.Bridge.Simulation.CreateTextEffect(Vector3Boxed.op_Implicit(((CommonBehaviorProxy<ITowerBehavior>)(object)tower).Position), new PrefabReference
			{
				guidRef = "Assets/Monkeys/General/Graphics/Effects/CashUp.prefab"
			}, 1f, ((ModContent)modReforge).Name, true, (DisplayCategory)1);
			AudioClipExtensions.Play(ModContent.GetAudioClip<ReforgeTowersMod>("ReforgeSound"), "FX", 1f);
		}

		public override void OnTowerSaved(Tower tower, TowerSaveDataModel saveData)
		{
			ModReforge currentReforge = tower.GetCurrentReforge();
			if (currentReforge != null)
			{
				saveData.metaData["ReforgeTowersMod"] = ((ModContent)currentReforge).Name;
			}
		}

		public override void OnTowerLoaded(Tower tower, TowerSaveDataModel saveData)
		{
			if (saveData.metaData.ContainsKey("ReforgeTowersMod"))
			{
				string key = saveData.metaData["ReforgeTowersMod"];
				if (ModReforge.ReforgesByName.TryGetValue(key, out ModReforge value))
				{
					SetTowerReforge(tower, value);
				}
			}
		}

		static ReforgeTowersMod()
		{
			//IL_0009: 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_0015: Expected O, but got Unknown
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Expected O, but got Unknown
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Expected O, but got Unknown
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: 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)
			//IL_005c: Expected O, but got Unknown
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Expected O, but got Unknown
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: Expected O, but got Unknown
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Expected O, but got Unknown
			//IL_0092: 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)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b8: Expected O, but got Unknown
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cd: Expected O, but got Unknown
			//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e1: Expected O, but got Unknown
			//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ee: Expected O, but got Unknown
			//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0104: Unknown result type (might be due to invalid IL or missing references)
			//IL_0114: Expected O, but got Unknown
			//IL_011d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0122: 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_013d: Expected O, but got Unknown
			//IL_013d: Unknown result type (might be due to invalid IL or missing references)
			//IL_014b: Expected O, but got Unknown
			//IL_014b: 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_0161: Expected O, but got Unknown
			//IL_0161: Unknown result type (might be due to invalid IL or missing references)
			//IL_016c: Unknown result type (might be due to invalid IL or missing references)
			//IL_017c: Expected O, but got Unknown
			ModSettingDouble val = new ModSettingDouble(1.0);
			((ModSettingNumber<double>)val).slider = true;
			((ModSettingNumber<double>)val).min = 0.0;
			((ModSettingNumber<double>)val).max = 1.0;
			val.stepSize = 0.01f;
			((ModSetting)val).icon = "e3a78644a09d6144684d4dc1c56eca89";
			((ModSetting)val).description = "Randomized weight that bad reforges (ones with only negative effects) should be given. 0 will disable.";
			BadReforgeWeight = val;
			ModSettingDouble val2 = new ModSettingDouble(1.0);
			((ModSettingNumber<double>)val2).slider = true;
			((ModSettingNumber<double>)val2).min = 0.0;
			((ModSettingNumber<double>)val2).max = 1.0;
			val2.stepSize = 0.01f;
			((ModSetting)val2).icon = "426b97648d5b70440a9ab43bb74e9798";
			((ModSetting)val2).description = "Randomized weight that bad reforges (ones with positive and negative effects) should be given. 0 will disable.";
			MixedReforgeWeight = val2;
			ModSettingDouble val3 = new ModSettingDouble(1.0);
			((ModSettingNumber<double>)val3).slider = true;
			((ModSettingNumber<double>)val3).min = 0.0;
			((ModSettingNumber<double>)val3).max = 1.0;
			val3.stepSize = 0.01f;
			((ModSetting)val3).icon = "aff5bdeafb99ae24d8b98896e03ed9fc";
			((ModSetting)val3).description = "Randomized weight that good reforges (ones with only positive benefits) should be given. 0 will disable.";
			GoodReforgeWeight = val3;
			ModSettingDouble val4 = new ModSettingDouble(2.0);
			((ModSettingNumber<double>)val4).slider = true;
			((ModSettingNumber<double>)val4).min = 0.0;
			((ModSettingNumber<double>)val4).max = 10.0;
			val4.stepSize = 0.1f;
			((ModSettingNumber<double>)val4).sliderSuffix = "%";
			((ModSetting)val4).icon = "UiEmoteIcons[MoneyBag]";
			((ModSetting)val4).description = "Cost for reforging, as a percentage of the Tower's overall worth.";
			ReforgeCost = val4;
		}
	}
}
namespace ReforgeTowers.Reforges
{
	public class Mystic : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)4;

		public override int Damage => 1;

		public override float Range => 0.15f;
	}
	public class Adept : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)4;

		public override float Range => 0.15f;
	}
	public class Masterful : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)4;

		public override int Damage => 1;

		public override int Pierce => 1;

		public override float Range => 0.15f;
	}
	public class Inept : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)4;

		public override float Range => -0.1f;
	}
	public class Ignorant : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)4;

		public override int Pierce => -1;

		public override float Range => -0.1f;
	}
	public class Deranged : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)4;

		public override int Pierce => -1;
	}
	public class Intense : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)4;

		public override int Damage => 1;

		public override int Pierce => -1;
	}
	public class Taboo : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)4;

		public override int Pierce => 1;

		public override float AttackSpeed => 0.1f;

		public override float Range => -0.1f;
	}
	public class Celestial : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)4;

		public override int Damage => 1;

		public override int Pierce => 1;

		public override float AttackSpeed => -0.1f;
	}
	public class Furious : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)4;

		public override int Damage => 1;

		public override int Pierce => 1;

		public override float AttackSpeed => -0.1f;
	}
	public class Manic : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)4;

		public override int Pierce => -1;

		public override float AttackSpeed => 0.1f;

		public override float Range => 0.1f;
	}
	public class Mythical : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)4;

		public override int Damage => 1;

		public override float AttackSpeed => 0.1f;

		public override int Pierce => 2;

		public override float Range => 0.15f;
	}
	public class Sighted : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)2;

		public override int Damage => 1;
	}
	public class Rapid : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)2;

		public override float AttackSpeed => 0.15f;
	}
	public class Intimidating : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)2;

		public override int Pierce => 1;
	}
	public class Staunch : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)2;

		public override int Damage => 1;

		public override int Pierce => 1;
	}
	public class Awful : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)2;

		public override int Pierce => -2;
	}
	public class Lethargic : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)2;

		public override float AttackSpeed => -0.15f;
	}
	public class Awkward : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)2;

		public override int Pierce => -1;

		public override float AttackSpeed => -0.1f;
	}
	public class Powerful : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)2;

		public override int Damage => 1;

		public override int Pierce => 1;

		public override float AttackSpeed => -0.1f;
	}
	public class Frenzying : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)2;

		public override int Pierce => -1;

		public override float AttackSpeed => 0.15f;
	}
	public class Unreal : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)2;

		public override int Damage => 1;

		public override float Range => 0.15f;

		public override int Pierce => 2;

		public override float AttackSpeed => 0.1f;
	}
	public class Dangerous : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)1;

		public override int Pierce => 1;
	}
	public class Savage : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)1;

		public override float Range => 0.1f;

		public override int Pierce => 2;
	}
	public class Dull : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)1;

		public override int Pierce => -1;
	}
	public class Terrible : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)1;

		public override int Pierce => -1;

		public override float Range => -0.15f;
	}
	public class Unhappy : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)1;

		public override float AttackSpeed => -0.1f;

		public override float Range => -0.1f;
	}
	public class Shameful : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)1;

		public override int Pierce => -1;

		public override float Range => -0.2f;
	}
	public class Legendary : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)1;

		public override int Damage => 1;

		public override float Range => 0.15f;

		public override int Pierce => 2;

		public override float AttackSpeed => 0.1f;
	}
	public class Fresh : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)8;

		public override float Cash => 0.05f;
	}
	public class Healthy : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)8;

		public override float Cash => 0.1f;
	}
	public class Keen : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)0;

		public override int Pierce => 1;
	}
	public class Superior : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)0;

		public override int Damage => 1;

		public override int Pierce => 1;

		public override float Cash => 0.1f;
	}
	public class Forceful : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)0;

		public override float Range => 0.15f;
	}
	public class Shoddy : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)0;

		public override int Pierce => -1;

		public override float Range => -0.15f;

		public override float Cash => -0.05f;
	}
	public class Strong : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)0;

		public override float Range => 0.15f;

		public override float Cash => 0.05f;
	}
	public class Unpleasant : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)0;

		public override int Pierce => 1;

		public override float Range => 0.15f;
	}
	public class Weak : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)0;

		public override float Range => -0.2f;
	}
	public class Ruthless : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)0;

		public override int Damage => 2;

		public override float Range => 0.1f;
	}
	public class Godly : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)0;

		public override int Damage => 1;

		public override int Pierce => 1;

		public override float Range => 0.15f;

		public override float Cash => 0.15f;
	}
	public class Demonic : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)0;

		public override int Damage => 1;

		public override int Pierce => 2;
	}
	public class Zealous : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)0;

		public override int Pierce => 2;
	}
	public class Quick : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)0;

		public override float AttackSpeed => 0.1f;
	}
	public class Deadly : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)0;

		public override int Damage => 1;

		public override float AttackSpeed => 0.1f;
	}
	public class Agile : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)0;

		public override int Pierce => 1;

		public override float AttackSpeed => 0.1f;
	}
	public class Nimble : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)0;

		public override float AttackSpeed => 0.05f;
	}
	public class Murderous : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)0;

		public override int Pierce => 2;

		public override float AttackSpeed => 0.05f;
	}
	public class Slow : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)0;

		public override float AttackSpeed => -0.15f;
	}
	public class Sluggish : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)0;

		public override float AttackSpeed => -0.2f;
	}
	public class Lazy : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)0;

		public override float AttackSpeed => -0.08f;
	}
	public class Annoying : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)0;

		public override int Pierce => -1;

		public override float AttackSpeed => -0.15f;
	}
	public class Nasty : ModReforge
	{
		public override TowerSet TowerSet => (TowerSet)0;

		public override int Pierce => 1;

		public override float AttackSpeed => 0.1f;

		public override float Range => -0.1f;
	}
}