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;
}
}