using System; 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.Data; using BTD_Mod_Helper.Api.Helpers; using BTD_Mod_Helper.Api.ModOptions; using BTD_Mod_Helper.Api.UI; using BTD_Mod_Helper.Extensions; using FasterForward; using HarmonyLib; using Il2CppAssets.Scripts; using Il2CppAssets.Scripts.Unity; using Il2CppAssets.Scripts.Unity.UI_New.InGame; using Il2CppAssets.Scripts.Unity.UI_New.Popups; using Il2CppAssets.Scripts.Unity.UI_New.Upgrade; using Il2CppSystem; using MelonLoader; using Microsoft.CodeAnalysis; using UnityEngine; using UnityEngine.InputSystem.Utilities; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: MelonInfo(typeof(FasterForwardMod), "Faster Forward", "1.1.6", "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("FasterForward")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+f5b4143d7c6af4212fbd566a91f0e9ec11546b0d")] [assembly: AssemblyProduct("FasterForward")] [assembly: AssemblyTitle("FasterForward")] [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 FasterForward { public class FasterForwardMod : BloonsTD6Mod { [HarmonyPatch(typeof(UpgradeDetails), "Update")] internal static class UpgradeDetails_Update { [HarmonyPrefix] internal static void Prefix(UpgradeDetails __instance) { if (__instance.beginShowPopup) { __instance.popupTimer += 3f * Time.unscaledDeltaTime - Time.fixedUnscaledDeltaTime; } } } public static readonly ModSettingHotkey Hotkey1 = new ModSettingHotkey((KeyCode)282, (HotkeyModifier)0) { displayName = "First Speed Hotkey" }; public static readonly ModSettingInt Speed1; public static readonly ModSettingHotkey Hotkey2; public static readonly ModSettingInt Speed2; public static readonly ModSettingHotkey Hotkey3; public static readonly ModSettingInt Speed3; public static readonly ModSettingHotkey Hotkey4; public static readonly ModSettingInt Speed4; public static readonly ModSettingHotkey SpeedCustom; private static readonly ModSettingBool ShowMessages; public override void OnUpdate() { if (Hotkey1.JustPressed()) { SetSpeed(ModSettingInt.op_Implicit(Speed1)); } if (Hotkey2.JustPressed()) { SetSpeed(ModSettingInt.op_Implicit(Speed2)); } if (Hotkey3.JustPressed()) { SetSpeed(ModSettingInt.op_Implicit(Speed3)); } if (Hotkey4.JustPressed()) { SetSpeed(ModSettingInt.op_Implicit(Speed4)); } if (SpeedCustom.JustPressed() && (Object)(object)InGame.instance != (Object)null) { SetCustomSpeed(); } } public static void SetCustomSpeed() { PopupScreen.instance.ShowSetValuePopup("Custom Fast Forward Speed", "Sets the Fast Forward speed to the specified value", Action.op_Implicit((Action)delegate(int s) { SetSpeed(Mathf.Clamp(s, 1, 100)); }), (int)TimeHelper.OverrideFastForwardTimeScale); } public static void SetSpeed(double speed) { if (NumberHelpers.Approximately(TimeHelper.OverrideFastForwardTimeScale, speed)) { return; } TimeHelper.OverrideFastForwardTimeScale = speed; if (!((Object)(object)InGame.instance == (Object)null) && InGame.Bridge != null) { bool flag = NumberHelpers.Approximately(speed, Constants.fastForwardTimeScaleMultiplier); string text = $"Fast Forward Speed is now {speed}x{(flag ? " (Default)" : "")}"; if (ModSettingBool.op_Implicit(ShowMessages)) { GameExt.ShowMessage(Game.instance, text, 1f, (string)null); } else { ModHelper.Msg((object)text); } } } static FasterForwardMod() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Expected O, but got Unknown //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Expected O, but got Unknown //IL_004c: Expected O, but got Unknown //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Expected O, but got Unknown //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Expected O, but got Unknown //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Expected O, but got Unknown //IL_0098: Expected O, but got Unknown //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Expected O, but got Unknown //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: 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_00d2: Expected O, but got Unknown //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Expected O, but got Unknown //IL_00e5: Expected O, but got Unknown //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Unknown result type (might be due to invalid IL or missing references) //IL_0100: Expected O, but got Unknown //IL_0102: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) //IL_0112: Unknown result type (might be due to invalid IL or missing references) //IL_011f: Expected O, but got Unknown //IL_011f: Unknown result type (might be due to invalid IL or missing references) //IL_012d: Expected O, but got Unknown //IL_0132: Expected O, but got Unknown //IL_0138: Unknown result type (might be due to invalid IL or missing references) //IL_013d: Unknown result type (might be due to invalid IL or missing references) //IL_014d: Expected O, but got Unknown //IL_014e: 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_0163: Expected O, but got Unknown ModSettingInt val = new ModSettingInt(3) { displayName = "First Speed" }; ((ModSettingNumber)val).min = 1L; ((ModSettingNumber)val).max = 100L; Speed1 = val; Hotkey2 = new ModSettingHotkey((KeyCode)283, (HotkeyModifier)0) { displayName = "Second Speed Hotkey" }; ModSettingInt val2 = new ModSettingInt(5) { displayName = "Second Speed" }; ((ModSettingNumber)val2).min = 1L; ((ModSettingNumber)val2).max = 100L; Speed2 = val2; Hotkey3 = new ModSettingHotkey((KeyCode)284, (HotkeyModifier)0) { displayName = "Third Speed Hotkey" }; ModSettingInt val3 = new ModSettingInt(10) { displayName = "Third Speed" }; ((ModSettingNumber)val3).min = 1L; ((ModSettingNumber)val3).max = 100L; Speed3 = val3; Hotkey4 = new ModSettingHotkey((KeyCode)285, (HotkeyModifier)0) { displayName = "Fourth Speed Hotkey" }; ModSettingInt val4 = new ModSettingInt(25) { displayName = "Fourth Speed" }; ((ModSettingNumber)val4).min = 1L; ((ModSettingNumber)val4).max = 100L; Speed4 = val4; SpeedCustom = new ModSettingHotkey((KeyCode)286, (HotkeyModifier)0) { displayName = "Custom Speed Hotkey" }; ShowMessages = new ModSettingBool(true) { description = "Whether to show the in game message popups for fast forward speed changing" }; } } public static class ModHelperData { public const string WorksOnVersion = "55.0"; public const string Version = "1.1.6"; public const string RepoOwner = "doombubbles"; public const string PrevRepoName = "faster-forward"; public const string RepoName = "FasterForward"; public const string Name = "Faster Forward"; public const string Description = "Allows you to increase the Fast Forward speed using the FN keys.\r\n\r\nF1: 3x Speed (Default)\r\nF2: 5x Speed\r\nF3: 10x Speed\r\nF4: 25x Speed\r\nF5: Custom Speed"; } public class Speed : ModStartMenuEntry, IModSettings, IModContent { private static readonly ModSettingBool AddStartMenuEntry = new ModSettingBool(false) { description = "Adds an entry to the Mod Helper in game Start Menu for changing the fast forward speed without hotkeys" }; public override string Icon => ((ModContent)this).GetTextureGUID("Icon"); public override float IconScale => 1.2f; public override bool DontAddToStartMenu => !ModSettingBool.op_Implicit(AddStartMenuEntry); } public abstract class SpeedEntry : ModStartMenuEntry { public abstract int Speed { get; } public override string DisplayName => $"{Speed:N0}x"; public override void StartMenuEntryClicked() { FasterForwardMod.SetSpeed(Speed); } public override bool IsSelected() { return NumberHelpers.Approximately(TimeHelper.OverrideFastForwardTimeScale, (double)Speed); } } public class Speed1 : SpeedEntry { public override int Speed => ModSettingInt.op_Implicit(FasterForwardMod.Speed1); } public class Speed2 : SpeedEntry { public override int Speed => ModSettingInt.op_Implicit(FasterForwardMod.Speed2); } public class Speed3 : SpeedEntry { public override int Speed => ModSettingInt.op_Implicit(FasterForwardMod.Speed3); } public class Speed4 : SpeedEntry { public override int Speed => ModSettingInt.op_Implicit(FasterForwardMod.Speed4); } public class Custom : ModStartMenuEntry { public override void StartMenuEntryClicked() { FasterForwardMod.SetCustomSpeed(); } public override bool IsSelected() { return ModContent.GetContent().All((SpeedEntry entry) => !((ModStartMenuEntry)entry).IsSelected()); } } }