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() : 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 ReforgesById = new Dictionary(); public static readonly Dictionary ReforgesByName = new Dictionary(); 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 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 list = new List(); 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((IEnumerable)list, (Func)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(((Model)towerModel).GetDescendants()); } private static bool PierceValid(TowerModel towerModel) { return Il2CppGenericIEnumerable.Any(((Model)towerModel).GetDescendants(), (Func)((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(((Model)towerModel).GetDescendants(), (Func)((WeaponModel w) => !WeaponModelBehaviorExt.HasBehavior(w))); } private static bool CashValid(TowerModel towerModel) { return Il2CppGenericIEnumerable.Any(((Model)towerModel).GetDescendants()) || Il2CppGenericIEnumerable.Any(((Model)towerModel).GetDescendants()); } public void Apply(TowerModel tower) { if (Damage > 0) { foreach (DamageModel item in from d in Il2CppGenericIEnumerableExt.ToList(((Model)tower).GetDescendants()) 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(((Model)tower).GetDescendants()) 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)(attackModel.weapons ?? new Il2CppReferenceArray(0L)))) { item3.Rate /= 1f + AttackSpeed; } } if (Cash > 0f) { Il2CppGenericIEnumerable.ForEach(((Model)tower).GetDescendants(), (Action)delegate(CashModel model) { model.minimum *= 1f + Cash; model.maximum *= 1f + Cash; }); Il2CppGenericIEnumerable.ForEach(((Model)tower).GetDescendants(), (Action)delegate(PerRoundCashBonusTowerModel model) { model.cashPerRound *= 1f + Cash; }); } HeroModel val = default(HeroModel); if (TowerModelBehaviorExt.HasBehavior(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(); ModReforge reforge = __instance.GetReforge(); reforge.Apply(tower); __result = true; return false; } } [HarmonyPatch] internal static class TowerSelectionMenu_Show { private static IEnumerable 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(); 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(); 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)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((Component)(object)menu, "TowerNameText"); string text = LocalizationManager.Instance.GetText(((EntityModel)val.towerModel).baseId); RectTransform val3 = default(RectTransform); if (GameObjectExt.Exists(ComponentExt.GetComponentFromChildrenByName((Component)(object)menu, "TSMNamedMonkeysInput"), ref val3) && ((Component)val3).gameObject.active) { val2 = ((Component)val3).GetComponentInChildren(); ((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)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.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("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(); ((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 val = new WeightedGroup(); foreach (ModReforge item in from modReforge2 in ModContent.GetContent() 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)(object)tower).Position), new PrefabReference { guidRef = "Assets/Monkeys/General/Graphics/Effects/CashUp.prefab" }, 1f, ((ModContent)modReforge).Name, true, (DisplayCategory)1); AudioClipExtensions.Play(ModContent.GetAudioClip("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)val).slider = true; ((ModSettingNumber)val).min = 0.0; ((ModSettingNumber)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)val2).slider = true; ((ModSettingNumber)val2).min = 0.0; ((ModSettingNumber)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)val3).slider = true; ((ModSettingNumber)val3).min = 0.0; ((ModSettingNumber)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)val4).slider = true; ((ModSettingNumber)val4).min = 0.0; ((ModSettingNumber)val4).max = 10.0; val4.stepSize = 0.1f; ((ModSettingNumber)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; } }