Decompiled source of BossChallengeMod v0.4.2
BossChallengeMod.dll
Decompiled a week ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Reflection; using System.Reflection.Emit; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Threading; using System.Threading.Tasks; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using BossChallengeMod.BossPatches; using BossChallengeMod.BossPatches.TargetPatches; using BossChallengeMod.Configuration; using BossChallengeMod.Configuration.Fields; using BossChallengeMod.Configuration.Holders; using BossChallengeMod.Configuration.Repositories; using BossChallengeMod.CustomActions; using BossChallengeMod.CustomMonsterStates; using BossChallengeMod.CustomMonsterStates.Configuration; using BossChallengeMod.Extensions; using BossChallengeMod.Global; using BossChallengeMod.Helpers; using BossChallengeMod.Interfaces; using BossChallengeMod.KillCounting; using BossChallengeMod.Modifiers; using BossChallengeMod.Modifiers.Managers; using BossChallengeMod.ObjectProviders; using BossChallengeMod.PatchResolver; using BossChallengeMod.PatchResolver.Initializers; using BossChallengeMod.Patches; using BossChallengeMod.Preloading; using BossChallengeMod.UI; using BossChallengeMod.UI.QueueUI; using HarmonyLib; using I2.Loc; using Microsoft.CodeAnalysis; using MonoMod.Utils; using MonsterLove.StateMachine; using NineSolsAPI; using NineSolsAPI.Utils; using RCGFSM.Monster; using RCGMaker.AddressableAssets; using RCGMaker.Core; using TMPro; using UnityEngine; using UnityEngine.Events; using UnityEngine.SceneManagement; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("BossChallengeMod")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyDescription("Bosses don't die")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+f179c9034da3b77dde7ba0ca665603f0e4d87161")] [assembly: AssemblyProduct("BossChallengeMod")] [assembly: AssemblyTitle("BossChallengeMod")] [assembly: AssemblyVersion("1.0.0.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.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] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.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; } } } internal sealed class ConfigurationManagerAttributes { public delegate void CustomHotkeyDrawerFunc(ConfigEntryBase setting, ref bool isCurrentlyAcceptingInput); public bool? ShowRangeAsPercent; public Action<ConfigEntryBase> CustomDrawer; public CustomHotkeyDrawerFunc CustomHotkeyDrawer; public bool? Browsable; public string Category; public object DefaultValue; public bool? HideDefaultButton; public bool? HideSettingName; public string Description; public string DispName; public int? Order; public bool? ReadOnly; public bool? IsAdvanced; public Func<object, string> ObjToStr; public Func<string, object> StrToObj; } namespace BossChallengeMod { [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("BossChallengeMod", "BossChallengeMod", "1.0.0")] public class BossChallengeMod : BaseUnityPlugin { [CompilerGenerated] private sealed class <ShowToasts>d__87 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public BossChallengeMod <>4__this; private int <i>5__2; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <ShowToasts>d__87(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Expected O, but got Unknown //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Expected O, but got Unknown int num = <>1__state; BossChallengeMod bossChallengeMod = <>4__this; switch (num) { default: return false; case 0: <>1__state = -1; <>2__current = (object)new WaitForSeconds(5f); <>1__state = 1; return true; case 1: <>1__state = -1; <i>5__2 = 1; break; case 2: <>1__state = -1; <i>5__2++; break; } if (<i>5__2 < 5 && !bossChallengeMod.UnloadRequested) { ToastManager.Toast((object)LocalizationResolver.Localize($"toast_message{<i>5__2}")); <>2__current = (object)new WaitForSeconds(4f); <>1__state = 2; return true; } return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } public const string PluginGUID = "BossChallengeMod"; private int versionNotificationCounter = 3; private bool isToastsDisplayed; private bool UnloadRequested; private Harmony harmony; private ModConfig _modConfig; private bool isVersionValid; private bool isLatestPatch; public CustomMonsterStateValuesResolver MonsterStateValuesResolver { get; private set; } public EventTypesResolver EventTypesResolver { get; private set; } public MonsterPatchResolver RegularMonstersPatchResolver { get; private set; } public MonsterPatchResolver BossesPatchResolver { get; private set; } public UIController UIController { get; private set; } public MonsterUIController MonsterUIController { get; private set; } public ChallengeConfigurationManager ChallengeConfigurationManager { get; private set; } public GlobalModifiersController GlobalModifiersFlags { get; private set; } public UIConfiguration UIConfiguration { get; private set; } private Preloader Preloader { get; set; } private BepInExModConfigurationHandler BepInExModConfigurationHandler { get; set; } public ShieldProvider ShieldProvider { get; private set; } public YanlaoGunProvider YanlaoGunProvider { get; private set; } public BombProvider BombShooterProvider { get; private set; } public static ModifiersStore Modifiers { get; private set; } public static BossChallengeMod Instance { get; private set; } public static Random Random { get; private set; } protected ChallengeConfiguration ConfigurationToUse => ChallengeConfigurationManager.ChallengeConfiguration; public BossChallengeMod() { MonsterStateValuesResolver = new CustomMonsterStateValuesResolver(); EventTypesResolver = new EventTypesResolver(); } private void Awake() { //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Expected O, but got Unknown Instance = this; Log.Init(((BaseUnityPlugin)this).Logger); RCGLifeCycle.DontDestroyForever(((Component)this).gameObject); Random = new Random(); Preloader = new Preloader(); ShieldProvider = new ShieldProvider(); YanlaoGunProvider = new YanlaoGunProvider(); BombShooterProvider = new BombProvider(); Modifiers = new ModifiersStore(); AssignPreloadingTargets(); SetupModifiers(Modifiers); LocalizationResolver.LoadLanguage(GetLanguageCode()); IRecordsRepository recordsRepository = new JsonRecordsRepository(); ChallengeConfigurationManager = new ChallengeConfigurationManager(recordsRepository); UIConfiguration = new UIConfiguration(); GlobalModifiersFlags = new GlobalModifiersController(); LocalizationManager.OnLocalizeEvent += new OnLocalizeCallback(OnLocalizationChange); BepInExModConfigurationHandler = new BepInExModConfigurationHandler(((BaseUnityPlugin)this).Config, ChallengeConfigurationManager, UIConfiguration); BepInExModConfigurationHandler.InitChallengeConfiguration(); BepInExModConfigurationHandler.HandleChallengeConfigurationValues(); BepInExModConfigurationHandler.InitializeUIConfiguration(); UIController = new UIController(UIConfiguration); BepInExModConfigurationHandler.HandleUIConfigurationValues(); MonsterUIController = new MonsterUIController(); RegularMonstersPatchResolver = new RegularEnemiesPatchesInitializer(MonsterStateValuesResolver).MonsterPatchResolver; BossesPatchResolver = new BossesPatchesInitializer(MonsterStateValuesResolver).MonsterPatchResolver; SceneManager.sceneLoaded += OnSceneLoaded; harmony = Harmony.CreateAndPatchAll(typeof(BossChallengeMod).Assembly, (string)null); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin BossChallengeMod is loaded1!"); } private void Start() { ProcessModConfig(); if (isVersionValid) { if (isLatestPatch) { Preloader.PreloadLatest(); } else { ((MonoBehaviour)this).StartCoroutine(Preloader.PreloadOld()); } } } private void ProcessModConfig() { _modConfig = AssemblyUtils.GetEmbeddedJson<ModConfig>("BossChallengeMod.Resources.ModConfig.modconfig.json"); if (_modConfig == null) { Log.Error("Mod config not found!"); return; } string text = ConfigManager.Instance.Version.Trim(); if (text.Contains(_modConfig?.LatestVersion)) { isLatestPatch = true; isVersionValid = true; } else if (text.Contains(_modConfig.StableVersion)) { isVersionValid = true; } } private void AssignPreloadingTargets() { string scene = "A5_S5_JieChuanHall"; string path = "Shield(Effect Receiver)_Shield Sphere Version"; Preloader.AddPreload(scene, path, ShieldProvider); string scene2 = "A4_S4_Container_Final"; string path2 = "ZGun FSM Object Variant"; Preloader.AddPreload(scene2, path2, YanlaoGunProvider); string scene3 = "A1_S3_InnerHumanDisposal_Final"; string path3 = "Shooter_GrenadeUp"; Preloader.AddPreload(scene3, path3, BombShooterProvider); } private string GetLanguageCode() { return LocalizationManager.CurrentLanguageCode switch { "ru" => "ru-ru", "en-US" => "en-us", "zh-CN" => "zh-cn", "zh-TW" => "zh-tw", _ => "en-us", }; } private void OnLocalizationChange() { LocalizationResolver.LoadLanguage(GetLanguageCode()); } private void OnDestroy() { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Expected O, but got Unknown UnloadRequested = true; UIController.Unload(); LocalizationManager.OnLocalizeEvent -= new OnLocalizeCallback(OnLocalizationChange); SceneManager.sceneLoaded -= OnSceneLoaded; harmony.UnpatchSelf(); } private void OnSceneLoaded(Scene scene, LoadSceneMode loadSceneMode) { //IL_00b4: Unknown result type (might be due to invalid IL or missing references) UIController.FixUI(); GlobalModifiersFlags.ValidateAll(); if (!isToastsDisplayed) { isToastsDisplayed = true; ((MonoBehaviour)this).StartCoroutine(ShowToasts()); } if (versionNotificationCounter > 0 && !isVersionValid && SingletonBehaviour<GameCore>.IsAvailable()) { versionNotificationCounter--; SingletonBehaviour<GameCore>.Instance.notificationUI.ShowNotification("Boss Challenge mod version is built for different game versions: " + _modConfig.StableVersion.Substring(0, 16) + " or " + _modConfig.LatestVersion.Substring(0, 16) + ". Some features were disabled.", (RCGAssetReference)null, (PlayerInfoPanelType)(-1), (Action)null); } } [IteratorStateMachine(typeof(<ShowToasts>d__87))] private IEnumerator ShowToasts() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <ShowToasts>d__87(0) { <>4__this = this }; } private void SetupModifiers(ModifiersStore modifiersStore) { modifiersStore.CreateModifierBuilder<SpeedModifier>("speed_temp", "SpeedModifier").AddCanBeRolledConditionPredicate((ModifierConfig _, int _) => ConfigurationToUse.IsSpeedModifierEnabled).BuildAndAdd(); modifiersStore.CreateModifierBuilder<TimerModifier>("timer", "TimerModifier").AddConditionPredicate((ModifierConfig _) => ApplicationCore.IsInBossMemoryMode).AddCanBeRolledConditionPredicate((ModifierConfig _, int iteration) => iteration > 0 && ConfigurationToUse.IsTimerModifierEnabled) .AddIgnoredMonsters(new <>z__ReadOnlyArray<string>(new string[4] { "StealthGameMonster_Boss_ButterFly Variant (1)", "StealthGameMonster_Boss_ButterFly Variant (2)", "StealthGameMonster_Boss_ButterFly Variant (3)", "StealthGameMonster_Boss_ButterFly Variant (4)" })) .BuildAndAdd(); modifiersStore.CreateModifierBuilder<ScalingSpeedModifier>("speed_perm", "SpeedScalingModifier").SetPersistance(isPersistent: true).BuildAndAdd(); modifiersStore.CreateModifierBuilder<ParryDirectDamageModifier>("parry_damage", "ParryDamageModifier").AddCanBeRolledConditionPredicate((ModifierConfig _, int _) => ConfigurationToUse.IsParryDamageModifierEnabled).BuildAndAdd(); modifiersStore.CreateModifierBuilder<DamageBuildupModifier>("damage_buildup", "DamageBuildupModifier").AddCanBeRolledConditionPredicate((ModifierConfig _, int _) => ConfigurationToUse.IsDamageBuildupModifierEnabled).AddIncompatibles(new <>z__ReadOnlyArray<string>(new string[2] { "parry_damage", "qi_overload" })) .AddIgnoredMonsters(new <>z__ReadOnlyArray<string>(new string[6] { "StealthGameMonster_Boss_ButterFly Variant (1)", "StealthGameMonster_Boss_ButterFly Variant (2)", "StealthGameMonster_Boss_ButterFly Variant (3)", "StealthGameMonster_Boss_ButterFly Variant (4)", "StealthGameMonster_BossZombieSpear", "StealthGameMonster_BossZombieHammer" })) .BuildAndAdd(); modifiersStore.CreateModifierBuilder<RegenerationModifier>("regeneration", "RegenerationModifier").AddCanBeRolledConditionPredicate((ModifierConfig _, int _) => ConfigurationToUse.IsRegenerationModifierEnabled).AddIgnoredMonsters(new <>z__ReadOnlyArray<string>(new string[6] { "StealthGameMonster_Boss_ButterFly Variant (1)", "StealthGameMonster_Boss_ButterFly Variant (2)", "StealthGameMonster_Boss_ButterFly Variant (3)", "StealthGameMonster_Boss_ButterFly Variant (4)", "StealthGameMonster_BossZombieSpear", "StealthGameMonster_BossZombieHammer" })) .BuildAndAdd(); modifiersStore.CreateModifierBuilder<KnockbackModifier>("knockback", "KnockbackModifier").AddCanBeRolledConditionPredicate((ModifierConfig _, int _) => ConfigurationToUse.IsKnockbackModifierEnabled).BuildAndAdd(); modifiersStore.CreateModifierBuilder<RandomArrowModifier>("random_arrow", "RandomArrowModifier").AddCanBeRolledConditionPredicate((ModifierConfig _, int _) => ConfigurationToUse.IsRandomArrowModifierEnabled && Player.i.mainAbilities.ArrowAbility.IsActivated).AddIgnoredMonsters(new <>z__ReadOnlyArray<string>(new string[6] { "StealthGameMonster_Boss_ButterFly Variant (1)", "StealthGameMonster_Boss_ButterFly Variant (2)", "StealthGameMonster_Boss_ButterFly Variant (3)", "StealthGameMonster_Boss_ButterFly Variant (4)", "StealthGameMonster_BossZombieSpear", "StealthGameMonster_BossZombieHammer" })) .BuildAndAdd(); Func<bool, bool> randomTalismanCondition = delegate(bool isEnabled) { Player i = Player.i; bool flag = ((GameFlagDescriptable)i.mainAbilities.FooExplodeAllStyle.AbilityData).IsAcquired || ((GameFlagDescriptable)i.mainAbilities.FooExplodeAllStyleUpgrade.AbilityData).IsAcquired; bool flag2 = ((GameFlagDescriptable)i.mainAbilities.FooExplodeAutoStyle.AbilityData).IsAcquired || ((GameFlagDescriptable)i.mainAbilities.FooExplodeAutoStyleUpgrade.AbilityData).IsAcquired; bool flag3 = ((GameFlagDescriptable)i.mainAbilities.FooExplodeConsecutiveStyle.AbilityData).IsAcquired || ((GameFlagDescriptable)i.mainAbilities.FooExplodeConsecutiveStyleUpgrade.AbilityData).IsAcquired; return (!(flag ^ flag2 ^ flag3) || (flag && flag3 && flag3)) && isEnabled; }; modifiersStore.CreateModifierBuilder<RandomTaliModifier>("random_talisman", "RandomTalismanModifier").AddCanBeRolledConditionPredicate((ModifierConfig _, int _) => randomTalismanCondition(ConfigurationToUse.IsRandomTalismanModifierEnabled)).AddIgnoredMonsters(new <>z__ReadOnlyArray<string>(new string[6] { "StealthGameMonster_Boss_ButterFly Variant (1)", "StealthGameMonster_Boss_ButterFly Variant (2)", "StealthGameMonster_Boss_ButterFly Variant (3)", "StealthGameMonster_Boss_ButterFly Variant (4)", "StealthGameMonster_BossZombieSpear", "StealthGameMonster_BossZombieHammer" })) .BuildAndAdd(); modifiersStore.CreateModifierBuilder<EnduranceModifier>("endurance", "EnduranceModifier").AddIgnoredMonsters(new <>z__ReadOnlyArray<string>(new string[5] { "StealthGameMonster_Boss_ButterFly Variant", "StealthGameMonster_Boss_ButterFly Variant (1)", "StealthGameMonster_Boss_ButterFly Variant (2)", "StealthGameMonster_Boss_ButterFly Variant (3)", "StealthGameMonster_Boss_ButterFly Variant (4)" })).AddCanBeRolledConditionPredicate((ModifierConfig _, int _) => ConfigurationToUse.IsEnduranceModifierEnabled) .BuildAndAdd(); Func<bool, bool> shieldsCondition = (bool isEnabled) => Player.i.mainAbilities.ChargedAttackAbility.IsActivated && isEnabled && isVersionValid; modifiersStore.CreateModifierBuilder<QiShieldModifier>("qi_shield", "QiShieldModifer").AddCanBeRolledConditionPredicate((ModifierConfig _, int _) => shieldsCondition(ConfigurationToUse.IsQiShieldModifierEnabled)).AddIncompatibles(new <>z__ReadOnlyArray<string>(new string[2] { "timer_shield", "distance_shield" })) .AddIgnoredMonsters(new <>z__ReadOnlyArray<string>(new string[7] { "StealthGameMonster_Boss_ButterFly Variant", "StealthGameMonster_Boss_ButterFly Variant (1)", "StealthGameMonster_Boss_ButterFly Variant (2)", "StealthGameMonster_Boss_ButterFly Variant (3)", "StealthGameMonster_Boss_ButterFly Variant (4)", "StealthGameMonster_SpearHorseMan", "Monster_GiantMechClaw" })) .AddCombinationModifiers(new <>z__ReadOnlySingleElementList<string>("shield_break_bomb")) .AddController(typeof(MonsterShieldController), isShared: true) .BuildAndAdd(); modifiersStore.CreateModifierBuilder<TimedShieldModifier>("timer_shield", "CooldownShieldModifier").AddCanBeRolledConditionPredicate((ModifierConfig _, int _) => shieldsCondition(ConfigurationToUse.IsCooldownShieldModifierEnabled)).AddIncompatibles(new <>z__ReadOnlyArray<string>(new string[2] { "qi_shield", "distance_shield" })) .AddIgnoredMonsters(new <>z__ReadOnlyArray<string>(new string[7] { "StealthGameMonster_Boss_ButterFly Variant", "StealthGameMonster_Boss_ButterFly Variant (1)", "StealthGameMonster_Boss_ButterFly Variant (2)", "StealthGameMonster_Boss_ButterFly Variant (3)", "StealthGameMonster_Boss_ButterFly Variant (4)", "StealthGameMonster_SpearHorseMan", "Monster_GiantMechClaw" })) .AddCombinationModifiers(new <>z__ReadOnlySingleElementList<string>("shield_break_bomb")) .AddController(typeof(MonsterShieldController), isShared: true) .BuildAndAdd(); modifiersStore.CreateModifierBuilder<DistanceShieldModifier>("distance_shield", "DistanceShieldModifier").AddCanBeRolledConditionPredicate((ModifierConfig _, int _) => shieldsCondition(ConfigurationToUse.IsDistanceShieldModifierEnabled)).AddIncompatibles(new <>z__ReadOnlyArray<string>(new string[2] { "timer_shield", "qi_shield" })) .AddIgnoredMonsters(new <>z__ReadOnlyArray<string>(new string[8] { "StealthGameMonster_Boss_ButterFly Variant", "StealthGameMonster_Boss_ButterFly Variant (1)", "StealthGameMonster_Boss_ButterFly Variant (2)", "StealthGameMonster_Boss_ButterFly Variant (3)", "StealthGameMonster_Boss_ButterFly Variant (4)", "StealthGameMonster_伏羲_新", "StealthGameMonster_SpearHorseMan", "Monster_GiantMechClaw" })) .AddCombinationModifiers(new <>z__ReadOnlySingleElementList<string>("shield_break_bomb")) .AddController(typeof(MonsterShieldController), isShared: true) .BuildAndAdd(); modifiersStore.CreateModifierBuilder<QiOverloadModifier>("qi_overload", "QiOverloadModifier").AddCanBeRolledConditionPredicate((ModifierConfig _, int _) => ConfigurationToUse.IsQiOverloadModifierEnabled).AddIncompatibles(new <>z__ReadOnlySingleElementList<string>("damage_buildup")) .AddIgnoredMonsters(new <>z__ReadOnlyArray<string>(new string[6] { "StealthGameMonster_Boss_ButterFly Variant (1)", "StealthGameMonster_Boss_ButterFly Variant (2)", "StealthGameMonster_Boss_ButterFly Variant (3)", "StealthGameMonster_Boss_ButterFly Variant (4)", "StealthGameMonster_BossZombieSpear", "StealthGameMonster_BossZombieHammer" })) .BuildAndAdd(); modifiersStore.CreateModifierBuilder<YanlaoGunModifier>("ya_gun", "YanlaoGunModifier").AddIncompatibles(new <>z__ReadOnlyArray<string>(new string[5] { "shield_break_bomb", "qi_bomb", "qi_overload_bomb", "qi_depletion_bomb", "cooldown_bomb" })).AddCanBeRolledConditionPredicate((ModifierConfig _, int _) => ConfigurationToUse.IsYanlaoGunModifierEnabled && isVersionValid) .AddController(typeof(MonsterYanlaoGunController), isShared: true) .AddIgnoredMonsters(new <>z__ReadOnlyArray<string>(new string[6] { "StealthGameMonster_Boss_ButterFly Variant (1)", "StealthGameMonster_Boss_ButterFly Variant (2)", "StealthGameMonster_Boss_ButterFly Variant (3)", "StealthGameMonster_Boss_ButterFly Variant (4)", "StealthGameMonster_BossZombieSpear", "StealthGameMonster_BossZombieHammer" })) .BuildAndAdd(); Func<bool, bool> bombCondition = (bool switchValue) => switchValue && isVersionValid; modifiersStore.CreateModifierBuilder<QiBombModifier>("qi_bomb", "QiBombModifier").AddCanBeRolledConditionPredicate((ModifierConfig _, int _) => bombCondition(ConfigurationToUse.IsQiBombModifierEnabled)).AddController(typeof(MonsterBombController), isShared: true) .AddIncompatibles(new <>z__ReadOnlyArray<string>(new string[4] { "ya_gun", "shield_break_bomb", "qi_overload_bomb", "qi_depletion_bomb" })) .BuildAndAdd(); modifiersStore.CreateModifierBuilder<ShieldBreakBombModifier>("shield_break_bomb", "ShieldBreakBombModifier").AddCanBeRolledConditionPredicate((ModifierConfig _, int _) => bombCondition(ConfigurationToUse.IsShieldBreakBombModifierEnabled)).AddController(typeof(MonsterBombController), isShared: true) .SetIsCombination(isCombination: true) .AddIncompatibles(new <>z__ReadOnlyArray<string>(new string[4] { "qi_bomb", "ya_gun", "qi_overload_bomb", "qi_depletion_bomb" })) .BuildAndAdd(); modifiersStore.CreateModifierBuilder<QiOverloadBombModifier>("qi_overload_bomb", "QiOverloadBombModifier").AddCanBeRolledConditionPredicate((ModifierConfig _, int _) => bombCondition(ConfigurationToUse.IsQiOverloadBombModifierEnabled)).AddController(typeof(MonsterBombController), isShared: true) .AddIgnoredMonsters(new <>z__ReadOnlyArray<string>(new string[6] { "StealthGameMonster_Boss_ButterFly Variant (1)", "StealthGameMonster_Boss_ButterFly Variant (2)", "StealthGameMonster_Boss_ButterFly Variant (3)", "StealthGameMonster_Boss_ButterFly Variant (4)", "StealthGameMonster_BossZombieSpear", "StealthGameMonster_BossZombieHammer" })) .AddIncompatibles(new <>z__ReadOnlyArray<string>(new string[4] { "ya_gun", "shield_break_bomb", "qi_bomb", "qi_depletion_bomb" })) .BuildAndAdd(); modifiersStore.CreateModifierBuilder<QiDepletionBombModifier>("qi_depletion_bomb", "QiDepletionBombModifier").AddCanBeRolledConditionPredicate((ModifierConfig _, int _) => bombCondition(ConfigurationToUse.IsQiDepletionBombModifierEnabled)).AddController(typeof(MonsterBombController), isShared: true) .AddIgnoredMonsters(new <>z__ReadOnlyArray<string>(new string[6] { "StealthGameMonster_Boss_ButterFly Variant (1)", "StealthGameMonster_Boss_ButterFly Variant (2)", "StealthGameMonster_Boss_ButterFly Variant (3)", "StealthGameMonster_Boss_ButterFly Variant (4)", "StealthGameMonster_BossZombieSpear", "StealthGameMonster_BossZombieHammer" })) .AddIncompatibles(new <>z__ReadOnlyArray<string>(new string[4] { "ya_gun", "shield_break_bomb", "qi_bomb", "qi_overload_bomb" })) .BuildAndAdd(); modifiersStore.CreateModifierBuilder<CooldownBombModifier>("cooldown_bomb", "CooldownBomb").AddCanBeRolledConditionPredicate((ModifierConfig _, int _) => bombCondition(ConfigurationToUse.IsCooldownBombModifierEnabled)).AddController(typeof(MonsterBombController), isShared: true) .AddIncompatibles(new <>z__ReadOnlyArray<string>(new string[5] { "ya_gun", "shield_break_bomb", "qi_bomb", "qi_overload_bomb", "qi_depletion_bomb" })) .AddIgnoredMonsters(new <>z__ReadOnlyArray<string>(new string[6] { "StealthGameMonster_Boss_ButterFly Variant (1)", "StealthGameMonster_Boss_ButterFly Variant (2)", "StealthGameMonster_Boss_ButterFly Variant (3)", "StealthGameMonster_Boss_ButterFly Variant (4)", "StealthGameMonster_BossZombieSpear", "StealthGameMonster_BossZombieHammer" })) .BuildAndAdd(); } } public class ChallengeMonsterController : MonoBehaviour, IResettableComponent { private int _killCounter; private MonsterBase _monster; public Action? OnRevivalStateEnter; public Action? OnRevivalStateExit; public Action? OnDie; public Action? OnEngage; public Action? OnDisengage; public List<States> DieHandelingStates = new List<States>(); public int KillCounter { get; private set; } private void Awake() { _monster = ((Component)this).GetComponent<MonsterBase>(); } public void ProcessRevivalStateEnter() { KillCounter++; OnRevivalStateEnter?.Invoke(); } public void ProcessDeath() { KillCounter++; OnDie?.Invoke(); } public void HandleMaxCyclesChange() { } public int GetPriority() { return -1; } public void ResetComponent() { KillCounter = 0; _monster.postureSystem.DieHandleingStates.Clear(); _monster.postureSystem.DieHandleingStates.AddRange(DieHandelingStates); _monster.postureSystem.GenerateCurrentDieHandleStacks(); } } internal static class Log { private static ManualLogSource? logSource; internal static void Init(ManualLogSource logSource) { Log.logSource = logSource; } internal static void Debug(object data) { ManualLogSource? obj = logSource; if (obj != null) { obj.LogDebug(data); } } internal static void Error(object data) { ManualLogSource? obj = logSource; if (obj != null) { obj.LogError(data); } } internal static void Fatal(object data) { ManualLogSource? obj = logSource; if (obj != null) { obj.LogFatal(data); } } internal static void Info(object data) { ManualLogSource? obj = logSource; if (obj != null) { obj.LogInfo(data); } } internal static void Message(object data) { ManualLogSource? obj = logSource; if (obj != null) { obj.LogMessage(data); } } internal static void Warning(object data) { ManualLogSource? obj = logSource; if (obj != null) { obj.LogWarning(data); } } } internal class ModConfig { public string StableVersion { get; set; } = string.Empty; public string LatestVersion { get; set; } = string.Empty; } public static class PluginInfo { public const string PLUGIN_GUID = "BossChallengeMod"; public const string PLUGIN_NAME = "BossChallengeMod"; public const string PLUGIN_VERSION = "1.0.0"; } } namespace BossChallengeMod.UI { public class CurrentTalismanUIContoller : MonoBehaviour { private Image talismanImage; public void Awake() { talismanImage = CreateImage(); ValidateImage(); } public void UpdateCurrentTalisman(Sprite sprite) { _ = Player.i; talismanImage.sprite = sprite; ValidateImage(); } private Image CreateImage() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("CurrentTalisman"); val.transform.SetParent(((Component)this).transform, false); Image obj = val.AddComponent<Image>(); ((Transform)((Graphic)obj).rectTransform).localScale = new Vector3(1.5f, 1.5f, 1f); return obj; } private Sprite GetTalismanSprite(AbilityWrapper style, AbilityWrapper upgrade, Sprite baseSprite, Sprite upgradedSprite) { if (((AbilityWrapper)(ref style)).IsActivated) { if (!((AbilityWrapper)(ref upgrade)).IsActivated) { return baseSprite; } return upgradedSprite; } return null; } private void ValidateImage() { ((Behaviour)talismanImage).enabled = (Object)(object)talismanImage.sprite != (Object)null; } } public class KillCounterController : MonoBehaviour { [CompilerGenerated] private sealed class <AnimateTextHide>d__27 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public bool flag; public TMP_Text text; public float defaultAlpha; public float hideDuration; public Func<float, float> easingFunction; public Action callback; private float <startingAlpha>5__2; private float <elapsedTime>5__3; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <AnimateTextHide>d__27(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { int num = <>1__state; if (num != 0) { if (num != 1) { return false; } <>1__state = -1; } else { <>1__state = -1; if (flag) { goto IL_00f8; } <startingAlpha>5__2 = text.alpha; float num2 = 1f - <startingAlpha>5__2 / defaultAlpha; <elapsedTime>5__3 = hideDuration * num2; } if (!flag && <elapsedTime>5__3 < hideDuration) { <elapsedTime>5__3 += Time.unscaledDeltaTime; float arg = <elapsedTime>5__3 / hideDuration; text.alpha = Mathf.Lerp(<startingAlpha>5__2, 0f, easingFunction(arg)); <>2__current = null; <>1__state = 1; return true; } if (!flag) { ((Component)text).gameObject.SetActive(false); callback?.Invoke(); } goto IL_00f8; IL_00f8: return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <AnimateTextShow>d__26 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public bool flag; public TMP_Text text; public float defaultAlpha; public float showDuration; public Func<float, float> easingFunction; public Action callback; private float <startingAlpha>5__2; private float <elapsedTime>5__3; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <AnimateTextShow>d__26(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { int num = <>1__state; if (num != 0) { if (num != 1) { return false; } <>1__state = -1; } else { <>1__state = -1; if (!flag) { goto IL_00f3; } ((Component)text).gameObject.SetActive(true); <startingAlpha>5__2 = text.alpha; float num2 = <startingAlpha>5__2 / defaultAlpha; <elapsedTime>5__3 = showDuration * num2; } if (flag && <elapsedTime>5__3 < showDuration) { <elapsedTime>5__3 += Time.unscaledDeltaTime; float arg = <elapsedTime>5__3 / showDuration; text.alpha = Mathf.Lerp(<startingAlpha>5__2, defaultAlpha, easingFunction(arg)); <>2__current = null; <>1__state = 1; return true; } if (flag) { callback?.Invoke(); } goto IL_00f3; IL_00f3: return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } private TMP_FontAsset font; private bool needToShow; private bool needToShowExpanded; public TMP_Text MainCounterText; public TMP_Text HightScoreText; public TMP_Text LastAttemptText; public float labelSpacing = 10f; public float animationChangeDuration = 1f; public float labelTextAnimationShowDuration = 1f; public float labelTextAnimationHideDuration = 1f; public float labelTextDefaultAlpha = 1f; public float expandedTextAnimationShowDuration = 1f; public float expandedTextAnimationHideDuration = 1f; public float expandedTextDefaultAlpha = 1f; public UIControllerAnimationState UIControllerAnimationState { get; set; } public void Awake() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0055: 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) font = LoadFont(); MainCounterText = UIController.InitializeText(Vector2.zero, ((Component)this).gameObject, string.Format("{0} {1}", LocalizationResolver.Localize("kill_counter"), 0), active: false, 32, font, (TextAlignmentOptions)260); HightScoreText = UIController.InitializeText(new Vector2(0f, -36f), ((Component)this).gameObject, string.Format("{0} {1}", LocalizationResolver.Localize("kill_counter_hs"), 0), active: false, 20, font, (TextAlignmentOptions)260); LastAttemptText = UIController.InitializeText(new Vector2(0f, -56f), ((Component)this).gameObject, string.Format("{0} {1}", LocalizationResolver.Localize("kill_counter_last"), 0), active: false, 20, font, (TextAlignmentOptions)260); labelTextDefaultAlpha = MainCounterText.alpha; expandedTextDefaultAlpha = HightScoreText.alpha; MainCounterText.alpha = 0f; } public void ChangeNumber(int number) { MainCounterText.text = LocalizationResolver.Localize("kill_counter") + " " + number; } public void Show() { needToShow = true; ((MonoBehaviour)this).StartCoroutine(AnimateTextShow(MainCounterText, needToShow, labelTextDefaultAlpha, labelTextAnimationShowDuration, EasingFunctions.Linear)); } public void Hide(Action? callback = null) { needToShow = false; ((MonoBehaviour)this).StartCoroutine(AnimateTextHide(MainCounterText, needToShow, labelTextDefaultAlpha, labelTextAnimationHideDuration, EasingFunctions.Linear, callback)); } public void UpdateHighScore(int number) { HightScoreText.text = LocalizationResolver.Localize("kill_counter_hs") + " " + number; } public void UpdatePrevResult(int number) { LastAttemptText.text = LocalizationResolver.Localize("kill_counter_last") + " " + number; } public void ShowExtraText(Action? callback = null) { if (UIControllerAnimationState == UIControllerAnimationState.ModifiersLowered) { needToShowExpanded = true; ((MonoBehaviour)this).StartCoroutine(AnimateTextShow(HightScoreText, needToShowExpanded, expandedTextDefaultAlpha, expandedTextAnimationShowDuration, EasingFunctions.Linear, callback)); ((MonoBehaviour)this).StartCoroutine(AnimateTextShow(LastAttemptText, needToShowExpanded, expandedTextDefaultAlpha, expandedTextAnimationShowDuration, EasingFunctions.Linear)); } } public void HideExtraText(Action? callback = null) { if (UIControllerAnimationState == UIControllerAnimationState.KillCounterExpanded) { needToShowExpanded = false; ((MonoBehaviour)this).StartCoroutine(AnimateTextHide(HightScoreText, needToShowExpanded, expandedTextDefaultAlpha, expandedTextAnimationHideDuration, EasingFunctions.Linear, callback)); ((MonoBehaviour)this).StartCoroutine(AnimateTextHide(LastAttemptText, needToShowExpanded, expandedTextDefaultAlpha, expandedTextAnimationHideDuration, EasingFunctions.Linear)); } } [IteratorStateMachine(typeof(<AnimateTextShow>d__26))] private IEnumerator AnimateTextShow(TMP_Text text, bool flag, float defaultAlpha, float showDuration, Func<float, float> easingFunction, Action? callback = null) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <AnimateTextShow>d__26(0) { text = text, flag = flag, defaultAlpha = defaultAlpha, showDuration = showDuration, easingFunction = easingFunction, callback = callback }; } [IteratorStateMachine(typeof(<AnimateTextHide>d__27))] private IEnumerator AnimateTextHide(TMP_Text text, bool flag, float defaultAlpha, float hideDuration, Func<float, float> easingFunction, Action? callback = null) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <AnimateTextHide>d__27(0) { text = text, flag = flag, defaultAlpha = defaultAlpha, hideDuration = hideDuration, easingFunction = easingFunction, callback = callback }; } private TMP_FontAsset? LoadFont() { TMP_FontAsset[] array = Resources.FindObjectsOfTypeAll<TMP_FontAsset>(); foreach (TMP_FontAsset val in array) { if (((Object)val).name == "LiberationSans SDF") { return val; } } return null; } } public class ModifiersUIController : MonoBehaviour { private enum ModifiersUIState { Hidden, UnfoldingLine, LineUnfolded, UnfoldingModifiers, ModifiersUnfolded, CollapsingModifiers, ModifiersCollapsed, CollapsingLine } [CompilerGenerated] private sealed class <AnimateModifierHide>d__31 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public TMP_Text textItem; public ModifiersUIController <>4__this; public bool last; private float <startingAlpha>5__2; private float <elapsedTime>5__3; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <AnimateModifierHide>d__31(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { int num = <>1__state; ModifiersUIController modifiersUIController = <>4__this; switch (num) { default: return false; case 0: { <>1__state = -1; <startingAlpha>5__2 = textItem.alpha; float num2 = 1f - <startingAlpha>5__2 / modifiersUIController.modifierTextDefaultAlpha; <elapsedTime>5__3 = modifiersUIController.modifierTextAnimationHideDuration * num2; break; } case 1: <>1__state = -1; break; } if (<elapsedTime>5__3 < modifiersUIController.modifierTextAnimationHideDuration) { <elapsedTime>5__3 += Time.unscaledDeltaTime; float num3 = <elapsedTime>5__3 / modifiersUIController.modifierTextAnimationHideDuration; textItem.alpha = Mathf.Lerp(<startingAlpha>5__2, 0f, num3); <>2__current = null; <>1__state = 1; return true; } if ((modifiersUIController.CurrentState == ModifiersUIState.CollapsingModifiers) & last) { modifiersUIController.CurrentState = ModifiersUIState.ModifiersCollapsed; } Object.Destroy((Object)(object)((Component)textItem).gameObject); return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <AnimateModifierShow>d__30 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public ModifiersUIController <>4__this; public TMP_Text textItem; public bool last; private float <startingAlpha>5__2; private float <elapsedTime>5__3; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <AnimateModifierShow>d__30(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { int num = <>1__state; ModifiersUIController modifiersUIController = <>4__this; if (num != 0) { if (num != 1) { return false; } <>1__state = -1; } else { <>1__state = -1; if (modifiersUIController.CurrentState != ModifiersUIState.UnfoldingModifiers) { goto IL_00f1; } ((Component)textItem).gameObject.SetActive(true); <startingAlpha>5__2 = textItem.alpha; float num2 = <startingAlpha>5__2 / modifiersUIController.modifierTextDefaultAlpha; <elapsedTime>5__3 = modifiersUIController.modifierTextAnimationShowDuration * num2; } if (modifiersUIController.CurrentState == ModifiersUIState.UnfoldingModifiers && <elapsedTime>5__3 < modifiersUIController.modifierTextAnimationShowDuration) { <elapsedTime>5__3 += Time.unscaledDeltaTime; float num3 = <elapsedTime>5__3 / modifiersUIController.modifierTextAnimationShowDuration; textItem.alpha = Mathf.Lerp(<startingAlpha>5__2, modifiersUIController.modifierTextDefaultAlpha, num3); <>2__current = null; <>1__state = 1; return true; } if ((modifiersUIController.CurrentState == ModifiersUIState.UnfoldingModifiers) & last) { modifiersUIController.CurrentState = ModifiersUIState.ModifiersUnfolded; } goto IL_00f1; IL_00f1: return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <AnimateModifiersLowering>d__32 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public ModifiersUIController <>4__this; public Action callback; private float <elapsedTime>5__2; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <AnimateModifiersLowering>d__32(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) int num = <>1__state; ModifiersUIController modifiersUIController = <>4__this; if (num != 0) { if (num != 1) { return false; } <>1__state = -1; } else { <>1__state = -1; if (modifiersUIController.UIControllerAnimationState != 0) { goto IL_00d1; } <elapsedTime>5__2 = 0f; } if (<elapsedTime>5__2 < modifiersUIController.modifiersLoweringAnimationDuration) { <elapsedTime>5__2 += Time.unscaledDeltaTime; float t = <elapsedTime>5__2 / modifiersUIController.modifiersLoweringAnimationDuration; Vector3 localPosition = default(Vector3); ((Vector3)(ref localPosition))..ctor(((Component)modifiersUIController).transform.localPosition.x, Mathf.Lerp(modifiersUIController.modifiersDefaultHeight, modifiersUIController.modifiersLoweredHeight, EasingFunctions.EaseOut(t))); ((Component)modifiersUIController).transform.localPosition = localPosition; <>2__current = null; <>1__state = 1; return true; } if (modifiersUIController.UIControllerAnimationState == UIControllerAnimationState.KillCounterCollapsed) { callback?.Invoke(); } goto IL_00d1; IL_00d1: return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <AnimateModifiersRaising>d__33 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public ModifiersUIController <>4__this; public Action callback; private float <elapsedTime>5__2; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <AnimateModifiersRaising>d__33(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) int num = <>1__state; ModifiersUIController modifiersUIController = <>4__this; if (num != 0) { if (num != 1) { return false; } <>1__state = -1; } else { <>1__state = -1; if (modifiersUIController.UIControllerAnimationState != UIControllerAnimationState.KillCounterExpandedTextHidden) { goto IL_00d3; } <elapsedTime>5__2 = 0f; } if (<elapsedTime>5__2 < modifiersUIController.modifiersRaisingAnimationDuration) { <elapsedTime>5__2 += Time.unscaledDeltaTime; float t = <elapsedTime>5__2 / modifiersUIController.modifiersRaisingAnimationDuration; Vector3 localPosition = default(Vector3); ((Vector3)(ref localPosition))..ctor(((Component)modifiersUIController).transform.localPosition.x, Mathf.Lerp(modifiersUIController.modifiersLoweredHeight, modifiersUIController.modifiersDefaultHeight, EasingFunctions.EaseOut(t))); ((Component)modifiersUIController).transform.localPosition = localPosition; <>2__current = null; <>1__state = 1; return true; } if (modifiersUIController.UIControllerAnimationState == UIControllerAnimationState.KillCounterExpandedTextHidden) { callback?.Invoke(); } goto IL_00d3; IL_00d3: return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <CollapseLineAnimation>d__29 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public ModifiersUIController <>4__this; private float <startingLength>5__2; private float <elapsedTime>5__3; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <CollapseLineAnimation>d__29(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_004d: 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_00d0: Unknown result type (might be due to invalid IL or missing references) int num = <>1__state; ModifiersUIController modifiersUIController = <>4__this; if (num != 0) { if (num != 1) { return false; } <>1__state = -1; } else { <>1__state = -1; if (modifiersUIController.CurrentState != ModifiersUIState.LineUnfolded && modifiersUIController.CurrentState != ModifiersUIState.UnfoldingLine && modifiersUIController.CurrentState != ModifiersUIState.ModifiersCollapsed) { goto IL_011b; } modifiersUIController.CurrentState = ModifiersUIState.CollapsingLine; <startingLength>5__2 = modifiersUIController.line.sizeDelta.x; float num2 = 1f - <startingLength>5__2 / modifiersUIController.lineDefaultLength; <elapsedTime>5__3 = modifiersUIController.lineFoldAnimationDuration * num2; } if (modifiersUIController.CurrentState == ModifiersUIState.CollapsingLine && <elapsedTime>5__3 < modifiersUIController.lineFoldAnimationDuration) { <elapsedTime>5__3 += Time.unscaledDeltaTime; float t = <elapsedTime>5__3 / modifiersUIController.lineFoldAnimationDuration; float num3 = Mathf.Lerp(<startingLength>5__2, 0f, EasingFunctions.EaseOut(t)); modifiersUIController.line.sizeDelta = new Vector2(num3, modifiersUIController.line.sizeDelta.y); <>2__current = null; <>1__state = 1; return true; } if (modifiersUIController.CurrentState == ModifiersUIState.CollapsingLine) { modifiersUIController.CurrentState = ModifiersUIState.Hidden; } goto IL_011b; IL_011b: return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <CollapseModifiers>d__27 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public ModifiersUIController <>4__this; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <CollapseModifiers>d__27(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Expected O, but got Unknown int num = <>1__state; ModifiersUIController modifiersUIController = <>4__this; if (num != 0) { if (num != 1) { return false; } <>1__state = -1; } else { <>1__state = -1; if (modifiersUIController.CurrentState != ModifiersUIState.ModifiersUnfolded && modifiersUIController.CurrentState != ModifiersUIState.UnfoldingModifiers) { goto IL_008e; } modifiersUIController.CurrentState = ModifiersUIState.CollapsingModifiers; } if (modifiersUIController.items.Any()) { TMP_Text textItem = ListExtensions.Pop<TMP_Text>(modifiersUIController.items); ((MonoBehaviour)modifiersUIController).StartCoroutine(modifiersUIController.AnimateModifierHide(textItem, !modifiersUIController.items.Any())); <>2__current = (object)new WaitForSecondsRealtime(0.33f); <>1__state = 1; return true; } goto IL_008e; IL_008e: return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <UnfoldLineAnimation>d__28 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public ModifiersUIController <>4__this; private float <startingLength>5__2; private float <elapsedTime>5__3; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <UnfoldLineAnimation>d__28(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Unknown result type (might be due to invalid IL or missing references) int num = <>1__state; ModifiersUIController modifiersUIController = <>4__this; if (num != 0) { if (num != 1) { return false; } <>1__state = -1; } else { <>1__state = -1; if (modifiersUIController.CurrentState != 0 && modifiersUIController.CurrentState != ModifiersUIState.CollapsingLine) { goto IL_011d; } modifiersUIController.CurrentState = ModifiersUIState.UnfoldingLine; ((Component)modifiersUIController.line).gameObject.SetActive(true); <startingLength>5__2 = modifiersUIController.line.sizeDelta.x; float num2 = <startingLength>5__2 / modifiersUIController.lineDefaultLength; <elapsedTime>5__3 = modifiersUIController.lineUnfoldAnimationDuration * num2; } if (modifiersUIController.CurrentState == ModifiersUIState.UnfoldingLine && <elapsedTime>5__3 < modifiersUIController.lineUnfoldAnimationDuration) { <elapsedTime>5__3 += Time.unscaledDeltaTime; float t = <elapsedTime>5__3 / modifiersUIController.lineUnfoldAnimationDuration; float num3 = Mathf.Lerp(<startingLength>5__2, modifiersUIController.lineDefaultLength, EasingFunctions.EaseOut(t)); modifiersUIController.line.sizeDelta = new Vector2(num3, modifiersUIController.line.sizeDelta.y); <>2__current = null; <>1__state = 1; return true; } if (modifiersUIController.CurrentState == ModifiersUIState.UnfoldingLine) { modifiersUIController.CurrentState = ModifiersUIState.LineUnfolded; } goto IL_011d; IL_011d: return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <UnfoldModifiers>d__26 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public ModifiersUIController <>4__this; private Queue<string> <modifiersQueue>5__2; private int <counter>5__3; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <UnfoldModifiers>d__26(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <modifiersQueue>5__2 = null; <>1__state = -2; } private bool MoveNext() { //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Expected O, but got Unknown //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_0120: Unknown result type (might be due to invalid IL or missing references) //IL_012a: Expected O, but got Unknown int num = <>1__state; ModifiersUIController modifiersUIController = <>4__this; switch (num) { default: return false; case 0: <>1__state = -1; if (modifiersUIController.CurrentState != ModifiersUIState.LineUnfolded && modifiersUIController.CurrentState != ModifiersUIState.ModifiersCollapsed && modifiersUIController.CurrentState != ModifiersUIState.CollapsingModifiers) { break; } modifiersUIController.CurrentState = ModifiersUIState.UnfoldingModifiers; <modifiersQueue>5__2 = new Queue<string>(modifiersUIController.modifiers); <counter>5__3 = 1; goto IL_0088; case 1: <>1__state = -1; goto IL_0088; case 2: { <>1__state = -1; goto IL_013a; } IL_013a: if (<modifiersQueue>5__2.Any() && modifiersUIController.CurrentState == ModifiersUIState.UnfoldingModifiers) { string key = <modifiersQueue>5__2.Dequeue(); TMP_Text val = UIController.InitializeText(new Vector2(0f, (float)(-31 * <counter>5__3)), ((Component)modifiersUIController).gameObject, LocalizationResolver.Localize(key), active: true, 21, null, (TextAlignmentOptions)260); <counter>5__3++; val.alpha = 0f; modifiersUIController.items.Add(val); ((MonoBehaviour)modifiersUIController).StartCoroutine(modifiersUIController.AnimateModifierShow(val, !<modifiersQueue>5__2.Any())); <>2__current = (object)new WaitForSecondsRealtime(0.25f); <>1__state = 2; return true; } <modifiersQueue>5__2 = null; break; IL_0088: if (modifiersUIController.items.Any()) { <>2__current = (object)new WaitForSecondsRealtime(0.1f); <>1__state = 1; return true; } goto IL_013a; } return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } private RectTransform line; private List<string> modifiers = new List<string>(); private List<TMP_Text> items = new List<TMP_Text>(); public float lineDefaultLength = 200f; public float lineUnfoldAnimationDuration = 0.75f; public float lineFoldAnimationDuration = 0.75f; public float modifierTextAnimationShowDuration = 0.7f; public float modifierTextAnimationHideDuration = 0.7f; public float modifierTextDefaultAlpha = 0.79f; private float modifiersDefaultHeight = -21f; private float modifiersLoweredHeight = -66f; private float modifiersRaisingAnimationDuration = 1f; private float modifiersLoweringAnimationDuration = 1f; private bool forceHide; public UIControllerAnimationState UIControllerAnimationState; private ModifiersUIState currentState; private ModifiersUIState CurrentState { get { return currentState; } set { switch (value) { case ModifiersUIState.Hidden: currentState = value; break; case ModifiersUIState.UnfoldingLine: currentState = value; break; case ModifiersUIState.LineUnfolded: currentState = value; if (modifiers.Any()) { ((MonoBehaviour)this).StartCoroutine(UnfoldModifiers()); } else { ((MonoBehaviour)this).StartCoroutine(CollapseLineAnimation()); } break; case ModifiersUIState.UnfoldingModifiers: currentState = value; break; case ModifiersUIState.ModifiersUnfolded: currentState = value; break; case ModifiersUIState.CollapsingModifiers: currentState = value; break; case ModifiersUIState.ModifiersCollapsed: currentState = value; if (modifiers.Any() && !forceHide) { ((MonoBehaviour)this).StartCoroutine(UnfoldModifiers()); } else { ((MonoBehaviour)this).StartCoroutine(CollapseLineAnimation()); } break; case ModifiersUIState.CollapsingLine: currentState = value; break; default: currentState = value; break; } } } public void Awake() { line = CreateLine(); ((Component)line).gameObject.SetActive(false); } public void Show(bool force = false) { if (modifiers.Any() || force) { forceHide = false; switch (CurrentState) { case ModifiersUIState.Hidden: ((MonoBehaviour)this).StartCoroutine(UnfoldLineAnimation()); break; case ModifiersUIState.CollapsingLine: ((MonoBehaviour)this).StartCoroutine(UnfoldLineAnimation()); break; case ModifiersUIState.UnfoldingLine: case ModifiersUIState.LineUnfolded: case ModifiersUIState.UnfoldingModifiers: case ModifiersUIState.ModifiersUnfolded: case ModifiersUIState.CollapsingModifiers: case ModifiersUIState.ModifiersCollapsed: break; } } } public void Hide(bool force = false) { forceHide = force; switch (CurrentState) { case ModifiersUIState.UnfoldingLine: CurrentState = ModifiersUIState.CollapsingLine; break; case ModifiersUIState.LineUnfolded: ((MonoBehaviour)this).StartCoroutine(CollapseLineAnimation()); break; case ModifiersUIState.UnfoldingModifiers: CurrentState = ModifiersUIState.CollapsingModifiers; break; case ModifiersUIState.ModifiersUnfolded: ((MonoBehaviour)this).StartCoroutine(CollapseModifiers()); break; case ModifiersUIState.Hidden: case ModifiersUIState.CollapsingModifiers: case ModifiersUIState.ModifiersCollapsed: case ModifiersUIState.CollapsingLine: break; } } public void SetModifiers(IEnumerable<string> modifiers) { this.modifiers.Clear(); this.modifiers.AddRange(modifiers); Hide(); } public void Reset() { SetModifiers(Array.Empty<string>()); } public void RaiseModifiers(Action? callback = null) { ((MonoBehaviour)this).StartCoroutine(AnimateModifiersRaising(callback)); } public void LowerModifiers(Action? callback = null) { ((MonoBehaviour)this).StartCoroutine(AnimateModifiersLowering(callback)); } [IteratorStateMachine(typeof(<UnfoldModifiers>d__26))] private IEnumerator UnfoldModifiers() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <UnfoldModifiers>d__26(0) { <>4__this = this }; } [IteratorStateMachine(typeof(<CollapseModifiers>d__27))] private IEnumerator CollapseModifiers() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <CollapseModifiers>d__27(0) { <>4__this = this }; } [IteratorStateMachine(typeof(<UnfoldLineAnimation>d__28))] private IEnumerator UnfoldLineAnimation() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <UnfoldLineAnimation>d__28(0) { <>4__this = this }; } [IteratorStateMachine(typeof(<CollapseLineAnimation>d__29))] private IEnumerator CollapseLineAnimation() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <CollapseLineAnimation>d__29(0) { <>4__this = this }; } [IteratorStateMachine(typeof(<AnimateModifierShow>d__30))] private IEnumerator AnimateModifierShow(TMP_Text textItem, bool last = false) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <AnimateModifierShow>d__30(0) { <>4__this = this, textItem = textItem, last = last }; } [IteratorStateMachine(typeof(<AnimateModifierHide>d__31))] private IEnumerator AnimateModifierHide(TMP_Text textItem, bool last = false) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <AnimateModifierHide>d__31(0) { <>4__this = this, textItem = textItem, last = last }; } [IteratorStateMachine(typeof(<AnimateModifiersLowering>d__32))] private IEnumerator AnimateModifiersLowering(Action? callback = null) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <AnimateModifiersLowering>d__32(0) { <>4__this = this, callback = callback }; } [IteratorStateMachine(typeof(<AnimateModifiersRaising>d__33))] private IEnumerator AnimateModifiersRaising(Action? callback = null) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <AnimateModifiersRaising>d__33(0) { <>4__this = this, callback = callback }; } private RectTransform CreateLine() { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Expected O, but got Unknown //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0098: 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_00bd: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) Color color = default(Color); ((Color)(ref color))..ctor(0.941f, 0.862f, 0.588f, 0.79f); float num = 1f; float num2 = 0f; GameObject val = new GameObject("HorizontalLine"); val.transform.SetParent(((Component)this).transform, false); ((Graphic)val.AddComponent<Image>()).color = color; RectTransform component = val.GetComponent<RectTransform>(); component.sizeDelta = new Vector2(num2, num); component.anchorMin = new Vector2(0.5f, 0.5f); component.anchorMax = new Vector2(0.5f, 0.5f); component.pivot = new Vector2(1f, 0.5f); component.anchoredPosition = Vector2.zero; val.transform.localPosition = Vector2.op_Implicit(new Vector2(100f, 0f)); return component; } } public class MonsterUIController { private MonsterKillCounter? trackedKillCounter; private MonsterModifierController? trackedModifiersController; private readonly List<MonsterModifierController> compositeModifierControllers = new List<MonsterModifierController>(); private UIController UIController = BossChallengeMod.Instance.UIController; private bool isHidingKillCounter; private bool isHidingRecordsText; public bool IsHidingKillCounter { get { return isHidingKillCounter; } set { isHidingKillCounter = value; if ((Object)(object)trackedKillCounter != (Object)null && !isHidingKillCounter) { UpdateKillCounterUI(); } } } public bool IsHidingRecordsText { get { return isHidingRecordsText; } set { isHidingRecordsText = value; if ((Object)(object)trackedKillCounter != (Object)null && !isHidingRecordsText) { UpdateKillCounterUI(); } } } public MonsterUIController() { UIController uIController = UIController; uIController.OnModifiersRaisedAnimationDone = (Action)Delegate.Combine(uIController.OnModifiersRaisedAnimationDone, (Action)delegate { IsHidingRecordsText = false; }); SceneManager.sceneUnloaded += ValidateOnSceneUnload; } public void ChangeKillCounter(MonsterKillCounter? monsterKillCounter) { if (!((Object)(object)monsterKillCounter != (Object)null) || monsterKillCounter.CanBeTracked) { if ((Object)(object)trackedKillCounter != (Object)null) { MonsterKillCounter? monsterKillCounter2 = trackedKillCounter; monsterKillCounter2.OnUpdate = (Action)Delegate.Remove(monsterKillCounter2.OnUpdate, new Action(UpdateKillCounterUI)); MonsterKillCounter? monsterKillCounter3 = trackedKillCounter; monsterKillCounter3.OnDestroyActions = (Action)Delegate.Remove(monsterKillCounter3.OnDestroyActions, new Action(ResetKillCounter)); } trackedKillCounter = monsterKillCounter; if ((Object)(object)trackedKillCounter != (Object)null) { MonsterKillCounter? monsterKillCounter4 = trackedKillCounter; monsterKillCounter4.OnUpdate = (Action)Delegate.Combine(monsterKillCounter4.OnUpdate, new Action(UpdateKillCounterUI)); MonsterKillCounter? monsterKillCounter5 = trackedKillCounter; monsterKillCounter5.OnDestroyActions = (Action)Delegate.Combine(monsterKillCounter5.OnDestroyActions, new Action(ResetKillCounter)); } UpdateKillCounterUI(); } } public void ChangeModifiersController(MonsterModifierController? monsterModifierController) { if (!((Object)(object)monsterModifierController != (Object)null) || monsterModifierController.CanBeTracked) { if ((Object)(object)trackedModifiersController != (Object)null) { MonsterModifierController? monsterModifierController2 = trackedModifiersController; monsterModifierController2.OnModifiersChange = (Action)Delegate.Remove(monsterModifierController2.OnModifiersChange, new Action(UpdateModifierUI)); MonsterModifierController? monsterModifierController3 = trackedModifiersController; monsterModifierController3.OnDestroyActions = (Action)Delegate.Remove(monsterModifierController3.OnDestroyActions, new Action(ResetModifierController)); } trackedModifiersController = monsterModifierController; if ((Object)(object)trackedModifiersController != (Object)null) { MonsterModifierController? monsterModifierController4 = trackedModifiersController; monsterModifierController4.OnModifiersChange = (Action)Delegate.Combine(monsterModifierController4.OnModifiersChange, new Action(UpdateModifierUI)); MonsterModifierController? monsterModifierController5 = trackedModifiersController; monsterModifierController5.OnDestroyActions = (Action)Delegate.Combine(monsterModifierController5.OnDestroyActions, new Action(ResetModifierController)); } UpdateModifierUI(); } } public void AddCompositeModifierController(MonsterModifierController monsterModifierController) { if (monsterModifierController.UseCompositeTracking) { compositeModifierControllers.Add(monsterModifierController); monsterModifierController.OnModifiersChange = (Action)Delegate.Combine(monsterModifierController.OnModifiersChange, new Action(UpdateModifierUI)); UpdateModifierUI(); } } public void RemoveCompositeModifierController(MonsterModifierController monsterModifierController) { compositeModifierControllers.Remove(monsterModifierController); monsterModifierController.OnModifiersChange = (Action)Delegate.Remove(monsterModifierController.OnModifiersChange, new Action(UpdateModifierUI)); UpdateModifierUI(); } private void UpdateKillCounterUI() { if ((Object)(object)trackedKillCounter == (Object)null) { IsHidingKillCounter = true; UIController.HideText(delegate { IsHidingKillCounter = false; }); if (UIController.CurrentAnimationState != 0) { IsHidingRecordsText = true; UIController.HideExpandedKillNumbersText(); } return; } if (!isHidingKillCounter) { UIController.UpdateBossCounterNumber(trackedKillCounter.KillCounter); UIController.ShowText(); } if (!isHidingRecordsText && (trackedKillCounter.BestCount > 0 || trackedKillCounter.LastCount > 0)) { UIController.UpdateBossRecordValues(trackedKillCounter.BestCount, trackedKillCounter.LastCount); UIController.ShowExpandedKillNumbersText(); } } private void UpdateModifierUI() { try { if ((Object)(object)trackedModifiersController == (Object)null) { MonoNodeExtension.RemoveAllNull<MonsterModifierController>(compositeModifierControllers); if (compositeModifierControllers.Any()) { UIController.UpdateModifiers((from controller in compositeModifierControllers from config in controller.Activated select new { CombinedKey = HashCode.Combine(((object)controller).GetHashCode(), config.GetHashCode()), ConfigKey = config.Key }).ToDictionary(x => x.CombinedKey, x => x.ConfigKey)); } else { UIController.UpdateModifiers(new Dictionary<int, string>()); } } else if (trackedModifiersController.Activated.Any()) { UIController.UpdateModifiers(trackedModifiersController.Activated.ToDictionary((ModifierConfig config) => HashCode.Combine(((object)trackedModifiersController).GetHashCode(), config.GetHashCode()), (ModifierConfig config) => config.Key)); } else { UIController.UpdateModifiers(new Dictionary<int, string>()); } } catch (Exception ex) { Log.Error(ex.Message + ", " + ex.StackTrace); } } public void ResetKillCounter() { ChangeKillCounter(null); } public void ResetModifierController() { ChangeModifiersController(null); } public void ValidateOnSceneUnload(Scene scene) { } public void Unload() { SceneManager.sceneUnloaded -= ValidateOnSceneUnload; } } public class QueueUISystem : MonoBehaviour { [CompilerGenerated] private sealed class <ProcessQueue>d__4 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public QueueUISystem <>4__this; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <ProcessQueue>d__4(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { int num = <>1__state; QueueUISystem queueUISystem = <>4__this; switch (num) { default: return false; case 0: <>1__state = -1; queueUISystem._isProcessing = true; break; case 1: <>1__state = -1; queueUISystem.OnOperationProcessed?.Invoke(); break; } if (queueUISystem.operationsQueue.Count > 0) { IEnumerator enumerator = queueUISystem.operationsQueue.Dequeue(); <>2__current = ((MonoBehaviour)queueUISystem).StartCoroutine(enumerator); <>1__state = 1; return true; } queueUISystem._isProcessing = false; return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } protected Queue<IEnumerator> operationsQueue = new Queue<IEnumerator>(); private bool _isProcessing; protected Action? OnOperationProcessed; public void EnqueueOperation(IEnumerator uiOperation) { operationsQueue.Enqueue(uiOperation); if (!_isProcessing) { ((MonoBehaviour)this).StartCoroutine(ProcessQueue()); } } [IteratorStateMachine(typeof(<ProcessQueue>d__4))] private IEnumerator ProcessQueue() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <ProcessQueue>d__4(0) { <>4__this = this }; } } public class TimerController : MonoBehaviour { private enum UIAnimationStates { Show, Hide } [CompilerGenerated] private sealed class <AnimateTimerHide>d__13 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public TimerController <>4__this; private float <elapsedTime>5__2; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <AnimateTimerHide>d__13(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) int num = <>1__state; TimerController timerController = <>4__this; if (num != 0) { if (num != 1) { return false; } <>1__state = -1; } else { <>1__state = -1; if (timerController.state != UIAnimationStates.Hide) { goto IL_00e8; } <elapsedTime>5__2 = 0f; } if (<elapsedTime>5__2 < timerController.animationHideDuration && timerController.state == UIAnimationStates.Hide) { <elapsedTime>5__2 += Time.unscaledDeltaTime; float t = <elapsedTime>5__2 / timerController.animationShowDuration; float num2 = Mathf.Lerp(timerController.visibleYPosition, timerController.hiddenYPosition, EasingFunctions.EaseOut(t)); timerController.timerText.transform.localPosition = new Vector3(timerController.timerText.transform.localPosition.x, num2); <>2__current = null; <>1__state = 1; return true; } if (timerController.state == UIAnimationStates.Hide) { ((Component)timerController.timerText).gameObject.SetActive(false); } goto IL_00e8; IL_00e8: return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <AnimateTimerShow>d__12 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public TimerController <>4__this; private float <elapsedTime>5__2; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <AnimateTimerShow>d__12(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0113: Unknown result type (might be due to invalid IL or missing references) //IL_0123: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: Unknown result type (might be due to invalid IL or missing references) int num = <>1__state; TimerController timerController = <>4__this; if (num != 0) { if (num != 1) { return false; } <>1__state = -1; } else { <>1__state = -1; if (timerController.state != 0 || timerController.timerText.transform.localPosition.y == timerController.visibleYPosition) { goto IL_012d; } ((Component)timerController.timerText).gameObject.SetActive(true); <elapsedTime>5__2 = 0f; } if (<elapsedTime>5__2 < timerController.animationShowDuration && timerController.state == UIAnimationStates.Show) { <elapsedTime>5__2 += Time.unscaledDeltaTime; float t = <elapsedTime>5__2 / timerController.animationShowDuration; float num2 = Mathf.Lerp(timerController.hiddenYPosition, timerController.visibleYPosition, EasingFunctions.EaseOut(t)); timerController.timerText.transform.localPosition = new Vector3(timerController.timerText.transform.localPosition.x, num2); <>2__current = null; <>1__state = 1; return true; } timerController.timerText.transform.localPosition = new Vector3(timerController.timerText.transform.localPosition.x, timerController.visibleYPosition); goto IL_012d; IL_012d: return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } private TMP_Text timerText; private TMP_FontAsset font; private float animationShowDuration = 0.75f; private float animationHideDuration = 0.75f; private float hiddenYPosition; private float visibleYPosition; private UIAnimationStates state = UIAnimationStates.Hide; public void Awake() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) font = LoadFont(); timerText = UIController.InitializeText(Vector2.zero, ((Component)this).gameObject, "00:00:000", active: false, 32, font, (TextAlignmentOptions)514); visibleYPosition = GetVisiblePosition(); hiddenYPosition = GetHiddenPosition(); timerText.transform.localPosition = new Vector3(timerText.transform.localPosition.x, hiddenYPosition); } public void Show() { //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) state = UIAnimationStates.Show; if (BossChallengeMod.Instance.UIConfiguration.UseCustomTimerPosition) { ((Component)timerText).gameObject.SetActive(true); timerText.transform.localPosition = new Vector3(timerText.transform.localPosition.x, visibleYPosition); } else { ((MonoBehaviour)this).StartCoroutine(AnimateTimerShow()); } } public void Hide() { state = UIAnimationStates.Hide; if (BossChallengeMod.Instance.UIConfiguration.UseCustomTimerPosition) { ((Component)timerText).gameObject.SetActive(false); } else { ((MonoBehaviour)this).StartCoroutine(AnimateTimerHide()); } } public void UpdateTimer(int milliseconds) { timerText.text = FormatMilliseconds(milliseconds); } private string FormatMilliseconds(int milliseconds) { TimeSpan timeSpan = TimeSpan.FromMilliseconds(milliseconds); return $"{timeSpan.Minutes:D2}:{timeSpan.Seconds:D2}.{timeSpan.Milliseconds:D3}"; } [IteratorStateMachine(typeof(<AnimateTimerShow>d__12))] private IEnumerator AnimateTimerShow() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <AnimateTimerShow>d__12(0) { <>4__this = this }; } [IteratorStateMachine(typeof(<AnimateTimerHide>d__13))] private IEnumerator AnimateTimerHide() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <AnimateTimerHide>d__13(0) { <>4__this = this }; } private TMP_FontAsset? LoadFont() { TMP_FontAsset[] array = Resources.FindObjectsOfTypeAll<TMP_FontAsset>(); foreach (TMP_FontAsset val in array) { if (((Object)val).name == "LiberationSans SDF") { return val; } } return null; } private float GetVisiblePosition() { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) Rect rect = ((Component)((Component)NineSolsAPICore.FullscreenCanvas).transform).GetComponent<RectTransform>().rect; return ((Rect)(ref rect)).height * 0.03f; } private float GetHiddenPosition() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) return 0f - ((Component)this).transform.position.y - timerText.preferredHeight; } } public class UIController { private KillCounterController bossCounterTextController; private global::BossChallengeMod.UI.QueueUI.ModifiersUIController modifiersController; private TimerController timerController; private CurrentTalismanUIContoller talismanUIController; public Action? OnModifiersRaisedAnimationDone; private UIConfiguration _configuration; private UIControllerAnimationState animationState; private RectTransform rightPanel; private RectTransform bottomPanel; private RectTransform bottomLeftPanel; public UIControllerAnimationState CurrentAnimationState { get { return animationState; } private set { animationState = value; modifiersController.UIControllerAnimationState = value; bossCounterTextController.UIControllerAnimationState = value; switch (value) { case UIControllerAnimationState.ModifiersLowered: bossCounterTextController.ShowExtraText(delegate { CurrentAnimationState = UIControllerAnimationState.KillCounterExpanded; }); break; case UIControllerAnimationState.KillCounterExpandedTextHidden: modifiersController.RaiseModifiers(delegate { CurrentAnimationState = UIControllerAnimationState.KillCounterCollapsed; OnModifiersRaisedAnimationDone?.Invoke(); }); break; case UIControllerAnimationState.KillCounterCollapsed: case UIControllerAnimationState.KillCounterExpanded: break; } } } public UIController(UIConfiguration configuration) { rightPanel = CreateRightPanelObject(); bottomPanel = CreateBottomPanelObject(); bottomLeftPanel = CreateBottomLeftPanelObject(); bossCounterTextController = MonoNodeExtension.AddChildrenComponent<KillCounterController>(((Component)rightPanel).gameObject, "KillCounter"); modifiersController = CreateModifiersControllerGUI(); timerController = MonoNodeExtension.AddChildrenComponent<TimerController>(((Component)bottomPanel).gameObject, "TimerUI"); talismanUIController = MonoNodeExtension.AddChildrenComponent<CurrentTalismanUIContoller>(((Component)bottomLeftPanel).gameObject, "TalismanUI"); _configuration = configuration; ResolveConfigurationEvents(_configuration); } private void RestoreUI() { rightPanel = CreateRightPanelObject(); bottomPanel = CreateBottomPanelObject(); bottomLeftPanel = CreateBottomLeftPanelObject(); bossCounterTextController = MonoNodeExtension.AddChildrenComponent<KillCounterController>(((Component)rightPanel).gameObject, "KillCounter"); modifiersController = CreateModifiersControllerGUI(); timerController = MonoNodeExtension.AddChildrenComponent<TimerController>(((Component)bottomPanel).gameObject, "TimerUI"); talismanUIController = MonoNodeExtension.AddChildrenComponent<CurrentTalismanUIContoller>(((Component)bottomLeftPanel).gameObject, "TalismanUI"); } public RectTransform CreateRightPanelObject() { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) Transform transform = ((Component)NineSolsAPICore.FullscreenCanvas).transform; GameObject val = new GameObject("BossChallenge_RightPanelUI"); val.transform.SetParent(transform, false); RectTransform obj = val.AddComponent<RectTransform>(); RectTransform component = ((Component)transform).GetComponent<RectTransform>(); CalculateRightPanelPosition(component, out var coordsX, out var coordsY); obj.anchorMin = new Vector2(0f, 0f); obj.anchorMax = new Vector2(0f, 0f); obj.pivot = new Vector2(0f, 0f); obj.anchoredPosition = new Vector2(coordsX, coordsY); obj.sizeDelta = new Vector2(300f, 200f); return obj; } private void CalculateRightPanelPosition(RectTransform canvasRect, out float coordsX, out float coordsY) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) Rect rect = canvasRect.rect; float width = ((Rect)(ref rect)).width; rect = canvasRect.rect; float height = ((Rect)(ref rect)).height; CalculateRightPanelPosition(width, height, out coordsX, out coordsY); } private void CalculateRightPanelPosition(float width, float height, out float coordsX, out float coordsY) { coordsX = width - width / 9f; coordsY = height - height / 4.5f; } public RectTransform CreateBottomPanelObject() { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) Transform transform = ((Component)NineSolsAPICore.FullscreenCanvas).transform; GameObject val = new GameObject("BossChallenge_BottomPanelUI"); val.transform.SetParent(transform, false); RectTransform obj = val.AddComponent<RectTransform>(); RectTransform component = ((Component)transform).GetComponent<RectTransform>(); CalculateBottomPanelPosition(component, out var coordsX, out var coordsY); obj.anchorMin = new Vector2(0f, 0f); obj.anchorMax = new Vector2(0f, 0f); obj.pivot = new Vector2(0f, 0f); obj.anchoredPosition = new Vector2(coordsX, coordsY); obj.sizeDelta = new Vector2(100f, 100f); return obj; } private void CalculateBottomPanelPosition(RectTransform canvasRect, out float coordsX, out float coordsY) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) Rect rect = canvasRect.rect; float width = ((Rect)(ref rect)).width; rect = canvasRect.rect; float height = ((Rect)(ref rect)).height; CalculateBottomPanelPosition(width, height, out coordsX, out coordsY); } private void CalculateBottomPanelPosition(float width, float height, out float coordsX, out float coordsY) { coordsX = width - width / 2f; coordsY = height / 10f; } public RectTransform CreateBottomLeftPanelObject() { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) Transform transform = ((Component)NineSolsAPICore.FullscreenCanvas).transform; GameObject val = new GameObject("BossChallenge_BottomLeftPanelUI"); val.transform.SetParent(transform, false); RectTransform obj = val.AddComponent<RectTransform>(); RectTransform component = ((Component)transform).GetComponent<RectTransform>(); CalculateBottomLeftPanelPosition(component, out var coordsX, out var coordsY); obj.anchorMin = new Vector2(0f, 0f); obj.anchorMax = new Vector2(0f, 0f); obj.pivot = new Vector2(0f, 0f); obj.anchoredPosition = new Vector2(coordsX, coordsY); obj.sizeDelta = new Vector2(100f, 100f); return obj; } private void CalculateBottomLeftPanelPosition(RectTransform canvasRect, out float coordsX, out float coordsY) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) Rect rect = canvasRect.rect; float width = ((Rect)(ref rect)).width; rect = canvasRect.rect; float height = ((Rect)(ref rect)).height; CalculateBottomLeftPanelPosition(width, height, out coordsX, out coordsY); } private void CalculateBottomLeftPanelPosition(float width, float height, out float coordsX, out float coordsY) { coordsX = width / 13.71f; coordsY = height / 4.15f; } private global::BossChallengeMod.UI.QueueUI.ModifiersUIController CreateModifiersControllerGUI() { //IL_0025: Unknown result type (might be due to invalid IL or missing references) global::BossChallengeMod.UI.QueueUI.ModifiersUIController modifiersUIController = MonoNodeExtension.AddChildrenComponent<global::BossChallengeMod.UI.QueueUI.ModifiersUIController>(((Component)rightPanel).gameObject, "ModifiersUI"); ((Component)modifiersUIController).transform.localPosition = new Vector3(0f, -21f); return modifiersUIController; } public static TMP_Text InitializeText(Vector2 localPosition, GameObject parent, string text = "Test", bool active = false, int fontSize = 32, TMP_FontAsset? font = null, TextAlignmentOptions alignment = 260) { //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0083: 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) TextMeshProUGUI val = MonoNodeExtension.AddChildrenComponent<TextMeshProUGUI>(((Component)((Component)NineSolsAPICore.FullscreenCanvas).transform).gameObject, "BossCounter_Text"); ((TMP_Text)val).fontSize = fontSize; if ((Object)(object)font != (Object)null) { ((TMP_Text)val).font = font; } ((Graphic)val).color = new Color(0.941f, 0.862f, 0.588f, 0.79f); ((TMP_Text)val).alignment = alignment; ((TMP_Text)val).text = text; ((Component)val).GetComponent<RectTransform>().sizeDelta = new Vector2(300f, 50f); ((TMP_Text)val).transform.localPosition = Vector2.op_Implicit(localPosition); ((TMP_Text)val).transform.SetParent(parent.transform, false); MonoLifeTimeExtension.SetActive((MonoBehaviour)(object)val, active); return (TMP_Text)(object)val; } public void UpdateTalisman(Sprite sprite) { talismanUIController.UpdateCurrentTalisman(sprite); } public void UpdateBossCounterNumber(int number) { if ((Object)(object)rightPanel == (Object)null || (Object)(object)bottomPanel == (Object)null || (Object)(object)timerController == (Object)null) { RestoreUI(); } bossCounterTextController.ChangeNumber(number); ShowText(); } public void UpdateModifiers(Dictionary<int, string> modifiers) { modifiersController.SetModifiers(modifiers); } public void HideModifiers() { modifiersController.Reset(); } public void ShowText() { bossCounterTextController.Show(); } public void HideText(Action? callback = null) { bossCounterTextController.Hide(callback); } public void ShowExpandedKillNumbersText() { modifiersController.LowerModifiers(delegate { CurrentAnimationState = UIControllerAnimationState.ModifiersLowered; }); } public void HideExpandedKillNumbersText(Action? callback = null) { Action callback2 = callback; bossCounterTextController.HideExtraText(delegate { CurrentAnimationState = UIControllerAnimationState.KillCounterExpandedTextHidden; callback2?.Invoke(); }); } public void UpdateBossRecordValues(int highScore, int prevResult) { if ((Object)(object)rightPanel == (Object)null || (Object)(object)bottomPanel == (Object)null || (Object)(object)timerController == (Object)null) { RestoreUI(); } bossCounterTextController.UpdateHighScore(highScore); bossCounterTextController.UpdatePrevResult(prevResult); } public void ShowTimer() { timerController.Show(); } public void HideTimer() { timerController.Hide(); } public void UpdateTimer(int milliseconds) { timerController.UpdateTimer(milliseconds); } private TMP_FontAsset? LoadFont() { TMP_FontAsset[] array = Resources.FindObjectsOfTypeAll<TMP_FontAsset>(); foreach (TMP_FontAsset val in array) { if (((Object)val).name == "LiberationSans SDF") { return val; } } return null; } public void Unload() { UnsubscribeConfigurationEvents(_configuration); if ((Object)(object)rightPanel != (Object)null) { Object.Destroy((Object)(object)rightPanel); } if ((Object)(object)bottomPanel != (Object)null) { Object.Destroy((Object)(object)bottomPanel); } if ((Object)(object)bottomLeftPanel != (Object)null) { Object.Destroy((Object)(object)bottomLeftPanel); } if ((Object)(object)modifiersController != (Object)null) { Object.Destroy((Object)(object)modifiersController); } if (OnModifiersRaisedAnimationDone != null) { OnModifiersRaisedAnimationDone = null; } } public void FixUI() { if ((Object)(object)rightPanel == (Object)null || (Object)(object)bottomPanel == (Object)null || (Object)(object)timerController == (Object)null) { RestoreUI(); } } private void ResolveConfigurationEvents(UIConfiguration configuration) { configuration.OnCounterUIEnabledChanged += ToggleCounterUI; configuration.OnUseCustomCounterPositionChanged += ToggleCustomCounterUIPosition; configuration.OnCounterXPosChanged += ChangeCounterXPosition; configuration.OnCounterYPosChanged += ChangeCounterYPosition; configuration.OnCounterUIScaleChanged += ChangeCounterScale; configuration.OnEnableTimerUIChanged += ToggleTimerUI; configuration.OnUseCustomTimerPositionChanged += ToggleCustomTimerUIPosition; configuration.OnTimerXPosChanged += ChangeTimerXPosition; configuration.OnTimerYPosChanged += ChangeTimerYPosition; configuration.OnTimerUIScaleChanged += ChangeTimerScale; configuration.OnEnableTalismanModeUIChanged += ToggleTalismanModeUI; configuration.OnUseCustomTalismanModePositionChanged += ToggleCustomTalismanModeUIPosition; configuration.OnTalismanModeXPosChanged += ChangeTalismanModeXPosition; configuration.OnTalismanModeYPosChanged += ChangeTalismanModeYPosition; configuration.OnTalismanUIScaleChanged += ChangeTalismanScale; } private void UnsubscribeConfigurationEvents(UIConfiguration configuration) { configuration.OnCounterUIEnabledChanged -= ToggleCounterUI; configuration.OnUseCustomCounterPositionChanged -= ToggleCustomCounterUIPosition; configuration.OnCounterXPosChanged -= ChangeCounterXPosition; configuration.OnCounterYPosChanged -= ChangeCounterYPosition; configuration.OnCounterUIScaleChanged -= ChangeCounterScale; configuration.OnEnableTimerUIChanged -= ToggleTimerUI; configuration.OnUseCustomTimerPositionChanged -= ToggleCustomTimerUIPosition; configuration.OnTimerXPosChanged -= ChangeTimerXPosition; configuration.OnTimerYPosChanged -= ChangeTimerYPosition; configuration.OnTimerUIScaleChanged -= ChangeTimerScale; configuration.OnEnableTalismanModeUIChanged -= ToggleTalismanModeUI; configuration.OnUseCustomTalismanModePositionChanged -= ToggleCustomTalismanModeUIPosition; configuration.OnTalismanModeXPosChanged -= ChangeTalismanModeXPosition; configurat