diff --git a/CelesteTAS-EverestInterop/CelesteTAS-EverestInterop.csproj b/CelesteTAS-EverestInterop/CelesteTAS-EverestInterop.csproj index 01cb738c9..e543a97fb 100644 --- a/CelesteTAS-EverestInterop/CelesteTAS-EverestInterop.csproj +++ b/CelesteTAS-EverestInterop/CelesteTAS-EverestInterop.csproj @@ -58,9 +58,6 @@ lib-stripped\SpeedrunTool.dll - - lib-stripped\ExtendedVariantMode.dll - lib-stripped\TASRecorder.dll diff --git a/CelesteTAS-EverestInterop/Source/Utils/ExtendedVariantsUtils.cs b/CelesteTAS-EverestInterop/Source/Utils/ExtendedVariantsUtils.cs index e750c7a6e..3ba68caf2 100644 --- a/CelesteTAS-EverestInterop/Source/Utils/ExtendedVariantsUtils.cs +++ b/CelesteTAS-EverestInterop/Source/Utils/ExtendedVariantsUtils.cs @@ -1,32 +1,38 @@ using System; -using System.Runtime.CompilerServices; -using ExtendedVariants.Module; +using Celeste.Mod; +using MonoMod.Utils; namespace TAS.Utils; internal static class ExtendedVariantsUtils { - private static readonly Lazy installed = new(() => ModUtils.GetModule("ExtendedVariantMode") != null); - - // enum value might be different between different ExtendedVariantMode version - private static readonly Lazy upsideDownVariant = - new(() => Enum.Parse(typeof(ExtendedVariantsModule.Variant), "UpsideDown")); - - private static readonly Lazy superDashingVariant = - new(() => Enum.Parse(typeof(ExtendedVariantsModule.Variant), "SuperDashing")); - - private static bool upsideDown { - [MethodImpl(MethodImplOptions.NoInlining)] - get => (bool) ExtendedVariantsModule.Instance.TriggerManager.GetCurrentVariantValue( - (ExtendedVariantsModule.Variant) upsideDownVariant.Value); + private static readonly Lazy module = new(() => ModUtils.GetModule("ExtendedVariantMode")); + private static readonly Lazy triggerManager = new(() => module.Value?.GetFieldValue("TriggerManager")); + + private static readonly Lazy getCurrentVariantValue = new(() => + triggerManager.Value?.GetType().GetMethodInfo("GetCurrentVariantValue")?.GetFastDelegate()); + + private static readonly Lazy variantType = + new(() => module.Value?.GetType().Assembly.GetType("ExtendedVariants.Module.ExtendedVariantsModule+Variant")); + + // enum value might be different between different ExtendedVariantMode version, so we have to parse from string + private static readonly Lazy upsideDownVariant = new(ParseVariant("UpsideDown")); + private static readonly Lazy superDashingVariant = new(ParseVariant("SuperDashing")); + + private static Func ParseVariant(string value) { + return () => { + try { + return variantType.Value == null ? null : Enum.Parse(variantType.Value, value); + } catch (Exception e) { + e.LogException($"Parsing Variant.{value} Failed."); + return null; + } + }; } - public static bool UpsideDown => installed.Value && upsideDown; + public static bool UpsideDown => GetCurrentVariantValue(upsideDownVariant); + public static bool SuperDashing => GetCurrentVariantValue(superDashingVariant); - private static bool superDashing { - [MethodImpl(MethodImplOptions.NoInlining)] - get => (bool) ExtendedVariantsModule.Instance.TriggerManager.GetCurrentVariantValue( - (ExtendedVariantsModule.Variant) superDashingVariant.Value); + private static bool GetCurrentVariantValue(Lazy variant) { + return variant.Value is { } value && (bool?) getCurrentVariantValue.Value?.Invoke(triggerManager.Value, value) == true; } - - public static bool SuperDashing => installed.Value && superDashing; } \ No newline at end of file diff --git a/CelesteTAS-EverestInterop/lib-stripped/ExtendedVariantMode.dll b/CelesteTAS-EverestInterop/lib-stripped/ExtendedVariantMode.dll deleted file mode 100644 index e6ab9ec4e..000000000 Binary files a/CelesteTAS-EverestInterop/lib-stripped/ExtendedVariantMode.dll and /dev/null differ