using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Text; using BepInEx; using BepInEx.Logging; using GlobalEnums; using GlobalSettings; using HarmonyLib; using HutongGames.PlayMaker; using HutongGames.PlayMaker.Actions; using Newtonsoft.Json; using TeamCherry.Localization; using UnityEngine; using UnityEngine.SceneManagement; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: AssemblyVersion("0.0.0.0")] namespace CodexMods.CustomDifficulty; internal sealed class BossRulesController { private static readonly string[] NonCombatStateTerms = new string[15] { "Death", "Dead", "Defeat", "Killed", "Destroy", "Intro", "Outro", "Title", "Scene", "Transition", "Dormant", "Asleep", "Wake", "Stun", "Stagger" }; private readonly SettingsStore _settingsStore; public static BossRulesController Instance; public BossRulesController(SettingsStore settingsStore) { _settingsStore = settingsStore; Instance = this; } public bool TryGetScaledWait(Wait waitAction, out float originalWait, out float scaledWait) { originalWait = 0f; scaledWait = 0f; if (waitAction == null || waitAction.time == null) { return false; } if (!TryGetCombatSource(waitAction, out var isBoss, out var _)) { return false; } ModSettingKind setting = (isBoss ? ModSettingKind.BossAttackSpeedMultiplier : ModSettingKind.EnemyAttackSpeedMultiplier); if (!_settingsStore.IsEnabled(setting) && !isBoss) { return false; } float value = ((isBoss && _settingsStore.IsEnabled(setting)) ? _settingsStore.Current.BossAttackSpeedMultiplier : ((!isBoss) ? _settingsStore.Current.EnemyAttackSpeedMultiplier : 1f)); float num = (isBoss ? ValueValidator.NormalizeBossAttackSpeedMultiplier(value) : ValueValidator.NormalizeMultiplier(value)); if (Math.Abs(num - 1f) < 0.001f) { return false; } originalWait = waitAction.time.Value; if (originalWait <= 0f || float.IsNaN(originalWait) || float.IsInfinity(originalWait)) { return false; } scaledWait = Mathf.Max(0.001f, CalculateScaledAttackWait(originalWait, num)); return true; } internal static float CalculateScaledAttackWait(float originalWait, float attackSpeed) { if (originalWait <= 0f || float.IsNaN(originalWait) || float.IsInfinity(originalWait)) { return originalWait; } return originalWait / ValueValidator.NormalizeMultiplier(attackSpeed); } public void Shutdown() { if (object.ReferenceEquals(Instance, this)) { Instance = null; } } private static bool TryGetCombatSource(Wait waitAction, out bool isBoss, out GameObject combatSource) { isBoss = false; combatSource = null; try { Fsm fsm = ((FsmStateAction)waitAction).Fsm; GameObject val = ((fsm != null) ? fsm.GameObject : ((FsmStateAction)waitAction).Owner); if ((Object)(object)val == (Object)null) { return false; } HealthManager val2 = val.GetComponentInParent(); if ((Object)(object)val2 == (Object)null) { val2 = val.GetComponentInChildren(true); } if ((Object)(object)val2 == (Object)null) { return false; } isBoss = EnemyStatsController.IsBossSource(((Component)val2).gameObject); combatSource = ((Component)val2).gameObject; string value = ((((FsmStateAction)waitAction).State != null) ? ((FsmStateAction)waitAction).State.Name : string.Empty); string value2 = ((fsm != null) ? fsm.Name : string.Empty); return !ContainsNonCombatTerm(value) && !ContainsNonCombatTerm(value2); } catch { return false; } } private static bool ContainsNonCombatTerm(string value) { if (string.IsNullOrEmpty(value)) { return false; } for (int i = 0; i < NonCombatStateTerms.Length; i++) { if (value.IndexOf(NonCombatStateTerms[i], StringComparison.OrdinalIgnoreCase) >= 0) { return true; } } return false; } } [HarmonyPatch(typeof(Wait), "OnUpdate")] internal static class BossAttackWaitPatch { private struct WaitScaleState { public bool Changed; public float OriginalWait; } private static void Prefix(Wait __instance, out WaitScaleState __state) { __state = default(WaitScaleState); BossRulesController instance = BossRulesController.Instance; if (instance != null && instance.TryGetScaledWait(__instance, out var originalWait, out var scaledWait)) { __instance.time.Value = scaledWait; __state.Changed = true; __state.OriginalWait = originalWait; } } private static void Postfix(Wait __instance, WaitScaleState __state) { if (__state.Changed && __instance != null && __instance.time != null) { __instance.time.Value = __state.OriginalWait; } } } internal sealed class CurrencyRewardController { [ThreadStatic] private static int _coinCollectionDepth; [ThreadStatic] private static int _shardCollectionDepth; private readonly SettingsStore _settingsStore; private double _poorWorldRemainder; public static CurrencyRewardController Instance; public CurrencyRewardController(SettingsStore settingsStore) { _settingsStore = settingsStore; _settingsStore.Changed += OnSettingChanged; Instance = this; } public void BeginCoinCollection() { _coinCollectionDepth++; } public void EndCoinCollection() { _coinCollectionDepth = Math.Max(0, _coinCollectionDepth - 1); } public void BeginShardCollection() { _shardCollectionDepth++; } public void EndShardCollection() { _shardCollectionDepth = Math.Max(0, _shardCollectionDepth - 1); } public void ScaleCoinAddition(ref int amount) { if (_coinCollectionDepth > 0 && amount > 0 && (MutatorController.Instance == null || !MutatorController.Instance.IsGrantingMaskFragmentReward)) { float num = 1f; if (_settingsStore.IsEnabled(ModSettingKind.CoinMultiplier)) { num *= ValueValidator.NormalizeMultiplier(_settingsStore.Current.CoinMultiplier); } bool flag = false; if (_settingsStore.IsMutatorEnabled(ModSettingKind.MutatorRichWorld)) { num *= 30f; } else if (_settingsStore.IsMutatorEnabled(ModSettingKind.MutatorPoorWorld)) { flag = true; num *= 0.5f; } if (flag) { amount = ScalePositiveAmountWithRemainder(amount, num, ref _poorWorldRemainder); return; } _poorWorldRemainder = 0.0; amount = ScalePositiveAmountRaw(amount, num); } } public void ScaleShardAddition(ref int amount) { if (_settingsStore.IsEnabled(ModSettingKind.ShardMultiplier) && _shardCollectionDepth > 0 && amount > 0) { float shardMultiplier = _settingsStore.Current.ShardMultiplier; amount = ScalePositiveAmount(amount, shardMultiplier); } } public void Shutdown() { _settingsStore.Changed -= OnSettingChanged; _coinCollectionDepth = 0; _shardCollectionDepth = 0; _poorWorldRemainder = 0.0; if (Instance == this) { Instance = null; } } internal static int ScalePositiveAmount(int originalAmount, float multiplier) { if (originalAmount <= 0) { return originalAmount; } int val = (int)Math.Round((float)originalAmount * ValueValidator.NormalizeMultiplier(multiplier), MidpointRounding.AwayFromZero); return Math.Max(1, val); } internal static int ScalePositiveAmountRaw(int originalAmount, float multiplier) { if (originalAmount <= 0) { return originalAmount; } double val = Math.Round((double)originalAmount * (double)multiplier, MidpointRounding.AwayFromZero); return (int)Math.Max(1.0, Math.Min(2147483647.0, val)); } internal static int ScalePositiveAmountWithRemainder(int originalAmount, float multiplier, ref double remainder) { if (originalAmount <= 0) { return originalAmount; } if (double.IsNaN(remainder) || double.IsInfinity(remainder) || remainder < 0.0 || remainder >= 1.0) { remainder = 0.0; } double num = (double)originalAmount * Math.Max(0.0, multiplier) + remainder; if (num >= 2147483647.0) { remainder = 0.0; return int.MaxValue; } double num2 = Math.Floor(num + 1E-09); remainder = num - num2; return (int)Math.Max(0.0, num2); } private void OnSettingChanged(ModSettingKind setting) { if (setting == ModSettingKind.MutatorPoorWorld || setting == ModSettingKind.MutatorRichWorld) { _poorWorldRemainder = 0.0; } } } [HarmonyPatch(typeof(GeoControl), "Collected")] internal static class CoinCollectionScopePatch { private static void Prefix(out bool __state) { __state = CurrencyRewardController.Instance != null; if (__state) { CurrencyRewardController.Instance.BeginCoinCollection(); } } private static void Postfix(bool __state) { if (__state && CurrencyRewardController.Instance != null) { CurrencyRewardController.Instance.EndCoinCollection(); } } private static Exception Finalizer(Exception __exception, bool __state) { if (__exception != null && __state && CurrencyRewardController.Instance != null) { CurrencyRewardController.Instance.EndCoinCollection(); } return __exception; } } [HarmonyPatch(typeof(CurrencyManager), "AddGeo", new Type[] { typeof(int) })] internal static class CoinRewardAmountPatch { private static void Prefix(ref int __0) { if (CurrencyRewardController.Instance != null) { CurrencyRewardController.Instance.ScaleCoinAddition(ref __0); } } } [HarmonyPatch(typeof(ShellShard), "Collected")] internal static class ShardCollectionScopePatch { private static void Prefix(out bool __state) { __state = CurrencyRewardController.Instance != null; if (__state) { CurrencyRewardController.Instance.BeginShardCollection(); } } private static void Postfix(bool __state) { if (__state && CurrencyRewardController.Instance != null) { CurrencyRewardController.Instance.EndShardCollection(); } } private static Exception Finalizer(Exception __exception, bool __state) { if (__exception != null && __state && CurrencyRewardController.Instance != null) { CurrencyRewardController.Instance.EndShardCollection(); } return __exception; } } [HarmonyPatch(typeof(CurrencyManager), "AddShards", new Type[] { typeof(int) })] internal static class ShardRewardAmountPatch { private static void Prefix(ref int __0) { if (CurrencyRewardController.Instance != null) { CurrencyRewardController.Instance.ScaleShardAddition(ref __0); } } } internal sealed class CustomDifficultyMenu { private sealed class DifficultySummarySnapshot { public int Score; public string Classification; public string ClassificationDescription; public string ProfileStyle; public string ProfileDescription; public string Mutators; public string MutatorsDescription; public Color AccentColor; } private sealed class DamageToolDefinition { public readonly string Title; public readonly string Description; public readonly string ImageName; public DamageToolDefinition(string title, string description, string imageName) { Title = title; Description = description; ImageName = imageName; } } private const string HealthControl = "CustomDifficultyHealth"; private const string NeedleControl = "CustomDifficultyNeedle"; private const string NeedleUpgradePercentageControl = "CustomDifficultyNeedleUpgradePercentage"; private const string SilkSpearDamageControl = "CustomDifficultySilkSpearDamage"; private const string SilkSpearSilkCostControl = "CustomDifficultySilkSpearSilkCost"; private const string DamageTakenControl = "CustomDifficultyDamageTaken"; private const string EnvironmentalDamageControl = "CustomDifficultyEnvironmentalDamage"; private const string OneHitControl = "CustomDifficultyOneHit"; private const string HealingControl = "CustomDifficultyHealing"; private const string HealingCostControl = "CustomDifficultyHealingCost"; private const string InvincibilityTimeControl = "CustomDifficultyInvincibilityTime"; private const string EnemyHealthControl = "CustomDifficultyEnemyHealth"; private const string EnemySpeedControl = "CustomDifficultyEnemySpeed"; private const string EnemyAttackSpeedControl = "CustomDifficultyEnemyAttackSpeed"; private const string EnemyAggressionControl = "CustomDifficultyEnemyAggression"; private const string BossControlPrefix = "CustomDifficultyBoss"; private const string CoinControl = "CustomDifficultyCoin"; private const string ShardControl = "CustomDifficultyShard"; private const string ShopPriceControl = "CustomDifficultyShopPrice"; private const string StationPriceControl = "CustomDifficultyStationPrice"; private const string DeathRosaryLossControl = "CustomDifficultyDeathRosaryLoss"; private const string HornetSpeedControl = "CustomDifficultyHornetSpeed"; private const string DashRechargeControl = "CustomDifficultyDashRecharge"; private const float ActiveRowHeight = 146f; private const float ActiveRowSpacing = 158f; private const int ActiveOptionCount = 97; private const string NavigationSearchControl = "CustomDifficultyNavigationSearch"; private static readonly ModSettingKind[] BossSettings = new ModSettingKind[7] { ModSettingKind.BossHealthMultiplier, ModSettingKind.BossDamageTakenMultiplier, ModSettingKind.BossSpeedMultiplier, ModSettingKind.BossAttackSpeedMultiplier, ModSettingKind.BossBrutalMode, ModSettingKind.DisableHealingDuringBoss, ModSettingKind.HealingDuringBossMultiplier }; private static readonly DamageToolDefinition[] RedDamageTools = new DamageToolDefinition[22] { new DamageToolDefinition("ALFINETE RETO", "Projétil leve para ataques rápidos à distância.", "T_straight_pin.png"), new DamageToolDefinition("ALFINETE TRIPLO", "Arremessa três alfinetes em conjunto.", "T_tri_pin.png"), new DamageToolDefinition("FRAGMENTO DE FERRÃO", "Armadilha de lâminas que perfura inimigos ao contato.", "T_sting_shard.png"), new DamageToolDefinition("GARRA CURVA", "Osso curvo arremessável, eficiente contra alvos voadores.", "T_curve_claw.png"), new DamageToolDefinition("PINO LONGO", "Pino pesado criado para atravessar carapaças resistentes.", "T_claw_javelin.png"), new DamageToolDefinition("TACHINHAS", "Espalha pontas no chão que ferem inimigos que pisarem nelas.", "T_tack.png"), new DamageToolDefinition("FOICE CURVA", "Versão aprimorada da Garra Curva para enfrentar presas perigosas.", "T_curve_claw_upgraded.png"), new DamageToolDefinition("ANEL DE ARREMESSO", "Arma de Shakra que ricocheteia em inimigos e superfícies.", "T_shakra_ring.png"), new DamageToolDefinition("PIMPILLO", "Bolsa volátil que explode ao atingir o alvo.", "T_pimpilo.png"), new DamageToolDefinition("DISPARO DE SEDA — ARQUITETO", "Versão do Disparo de Seda modificada pelo Décimo Segundo Arquiteto.", "_0003_T_web_shot_architect.png"), new DamageToolDefinition("DISPARO DE SEDA — FILHA DA FORJA", "Versão do Disparo de Seda modificada pela Filha da Forja.", "_0002_T_web_shot_forge.png"), new DamageToolDefinition("CORTADOR DE CONCHAS", "Projétil espiral que ricocheteia e surpreende os inimigos.", "T_Conch_Drill_Shot.png"), new DamageToolDefinition("DISPARO DE SEDA — ORIGINAL", "Arma antiga dos Tecelões restaurada à sua forma original.", "_0001_T_web_shot_forge_runes.png"), new DamageToolDefinition("BROCA DO DELVER", "Broca giratória que conduz a Hornet para baixo com força destrutiva.", "T_Spine_head.png"), new DamageToolDefinition("RODA DENTADA", "Lâmina circular mecânica que avança cortando os inimigos.", "T_cogwork_saw.png"), new DamageToolDefinition("ARMADOR DE ARMADILHAS", "Cria uma runa de Seda que se incendeia ao contato.", "_0004_T_snare_setter.png"), new DamageToolDefinition("ARDÓSIA DE SÍLEX", "Aquece temporariamente a agulha e adiciona fogo aos golpes.", "Hornet_icon_0003_T_flintstone.png"), new DamageToolDefinition("COGFLY", "Companheiro mecânico alado que procura e ataca inimigos.", "T_cogwork_flier.png"), new DamageToolDefinition("CERVEJA DE PULGA", "Bebida energizante que aumenta temporariamente a velocidade.", "T_flea_brew.png"), new DamageToolDefinition("FRASCO DE PLASMÍDIO", "Concede máscaras temporárias de plasmídio.", "T_syringe_lifeblood.png"), new DamageToolDefinition("RECIPIENTES VOLTAICOS", "Dispositivo carregado que libera uma descarga elétrica.", "_0004_T_lightning__0001_1.png"), new DamageToolDefinition("CANHÃO DE ROSÁRIO", "Canhão poderoso carregado com Rosários.", "_0004_T_rosary_cannon_loaded.png") }; private static readonly DamageToolDefinition[] BlueDamageTools = new DamageToolDefinition[23] { new DamageToolDefinition("OLHO DE DRUIDA", "Transforma parte do dano recebido em Seda.", "T_mossmedal.png"), new DamageToolDefinition("OLHOS DE DRUIDA", "Versão aprimorada do Olho de Druida.", "T_mossmedal_second.png"), new DamageToolDefinition("SINO DE MAGMA", "Reduz o dano causado por fogo e magma.", "Hornet_T_lava_charm.png"), new DamageToolDefinition("SINO DE PROTEÇÃO", "Protege a Hornet enquanto ela realiza um vínculo.", "Hornet_icon_0001_T_bell_shield.png"), new DamageToolDefinition("BOLSA POLLIP", "Aplica veneno às ferramentas vermelhas equipadas.", "T_poison_pouch.png"), new DamageToolDefinition("MÁSCARA FRATURADA", "Bloqueia um dano crítico antes de se quebrar.", "Hornet_T_fractured_mask.png"), new DamageToolDefinition("MULTILIGADOR", "Prolonga o vínculo e aumenta seu efeito de recuperação.", "T_multi_bind.png"), new DamageToolDefinition("LUZ DE TEIA", "Aumenta a velocidade de regeneração de Seda.", "T_icon_white_ring.png"), new DamageToolDefinition("CÍRCULO DENTE-DE-SERRA", "Faz lâminas girarem ao abrir a capa, ferindo inimigos próximos.", "T_brolly_spike.png"), new DamageToolDefinition("FAIXA INJETORA", "Aumenta a velocidade de execução do vínculo.", "T_quick_bind.png"), new DamageToolDefinition("EXTENSOR DE CARRETEL", "Permite armazenar Seda além da capacidade natural.", "T_spool_bar_extender.png"), new DamageToolDefinition("VÍNCULO DE RESERVA", "Armazena um vínculo adicional para situações de emergência.", "T_focus_spool.png"), new DamageToolDefinition("ESPELHO DE GARRA", "Emite um clarão que causa dano durante o vínculo.", "T_dazzle_bind.png"), new DamageToolDefinition("ESPELHOS DE GARRA", "Versão aprimorada que libera uma explosão mais intensa.", "T_dazzle_bind_upg.png"), new DamageToolDefinition("CRISTAL DE MEMÓRIA", "Cria um cristal ofensivo quando a Hornet recebe dano.", "T_revenge_crystal.png"), new DamageToolDefinition("PICARETA DE GATUNO", "Rouba Rosários e Fragmentos de Concha dos inimigos atingidos.", "Thief_Claw.png"), new DamageToolDefinition("FILAMENTO VOLTAICO", "Eletrifica as Habilidades de Seda.", "T_zap_imbuement.png"), new DamageToolDefinition("FUNDA RÁPIDA", "Duplica a quantidade de ferramentas arremessadas.", "T_quick_sling.png"), new DamageToolDefinition("GUIRLANDA DE PUREZA", "Protege contra a infestação de larvas do lodo.", "Wreath_of_Purity.png"), new DamageToolDefinition("GARRA LONGA", "Aumenta o alcance dos ataques da agulha.", "T_longneedle.png"), new DamageToolDefinition("LANTERNA DE LUMEFOGO", "Consome Seda para invocar lumefogos que atacam inimigos.", "T_wisp_lantern.png"), new DamageToolDefinition("OVO DE PULGALIA", "Reduz o custo das Habilidades de Seda enquanto a vida está cheia.", "Flea_Egg.png"), new DamageToolDefinition("EMBLEMA DE PINO", "Reduz o tempo necessário para carregar o Golpe de Agulha.", "Pin_Badge.png") }; private static readonly DamageToolDefinition[] YellowDamageTools = new DamageToolDefinition[13] { new DamageToolDefinition("BÚSSOLA", "Marca a posição da Hornet no mapa.", "T_Compass.png"), new DamageToolDefinition("PINGENTE DE FRAGMENTO", "Aumenta a quantidade de Fragmentos de Concha coletados.", "Hornet_Bone_Necklace.png"), new DamageToolDefinition("BROCHE DE MAGNETITA", "Atrai Rosários soltos para a Hornet.", "T_rosary_magnet.png"), new DamageToolDefinition("CINTO PESADO", "Reduz o recuo ao atacar e ao receber dano.", "T_weighted_anklet.png"), new DamageToolDefinition("PULSEIRA FARPADA", "Aumenta o dano da agulha, mas também o dano recebido.", "T_barbed_wire.png"), new DamageToolDefinition("BOLSA DE INSETO MORTO", "Preserva parte dos Rosários depois da derrota.", "T_dead_purse.png"), new DamageToolDefinition("BOLSA DE CONCHA", "Aumenta a capacidade das ferramentas vermelhas.", "T_shell_satchel.png"), new DamageToolDefinition("DADOS DE MAGNETITA", "Concede uma chance de evitar completamente o dano recebido.", "_0006_I_magnetite_dice.png"), new DamageToolDefinition("BRAÇADEIRA DE RASTEJO", "Permite uma retirada rápida enquanto a Hornet se abaixa.", "T_steel_spine.png"), new DamageToolDefinition("EMPUNHADURA DE SUBIDA", "Permite permanecer parada enquanto se agarra a uma parede.", "T_longneedle_old1.png"), new DamageToolDefinition("CORDAS DE ARANHA", "Amplia e fortalece os efeitos da Agulharpa.", "T_attunement_charm.png"), new DamageToolDefinition("TORNOZELEIRAS DE SEDA", "Consome Seda para aumentar a velocidade de corrida.", "T_icon_sprintmaster.png"), new DamageToolDefinition("MARCA DO LADRÃO", "Aumenta os Rosários obtidos, mas perde alguns ao receber dano.", "Thief_Brooch.png") }; private readonly SettingsStore _settingsStore; private readonly ModImages _images; private readonly PresetManager _presetManager; private readonly LocalizationManager _localization; private readonly object _inputBlocker = new object(); private bool _isOpen; private bool _heroInputBlocked; private float _previousTimeScale = 1f; private bool _previousCursorVisible; private CursorLockMode _previousCursorLockMode; private string _healthText = string.Empty; private string _needleText = string.Empty; private string _needleUpgradePercentageText = string.Empty; private string _silkSpearDamageText = string.Empty; private string _silkSpearSilkCostText = string.Empty; private readonly Dictionary _silkSkillTexts = new Dictionary(); private readonly Dictionary _bossSettingTexts = new Dictionary(); private string _damageTakenText = string.Empty; private string _environmentalDamageText = string.Empty; private string _oneHitText = string.Empty; private string _healingText = string.Empty; private string _healingCostText = string.Empty; private string _invincibilityTimeText = string.Empty; private string _enemyHealthText = string.Empty; private string _enemySpeedText = string.Empty; private string _enemyAttackSpeedText = string.Empty; private string _enemyAggressionText = string.Empty; private string _coinText = string.Empty; private string _shardText = string.Empty; private string _shopPriceText = string.Empty; private string _stationPriceText = string.Empty; private string _deathRosaryLossText = string.Empty; private string _hornetSpeedText = string.Empty; private string _dashRechargeText = string.Empty; private string _presetNameText = "Meu Preset"; private string _openSettingsSnapshot = string.Empty; private string _operationMessage = string.Empty; private string _navigationSearchText = string.Empty; private float _openAnimationProgress; private bool _focusNavigationSearch; private Color _currentSectionAccent = new Color(0.94f, 0.69f, 0.28f, 1f); private string _focusedControl = string.Empty; private int _selectedSectionIndex = 2; private Vector2 _sectionScroll = Vector2.zero; private Vector2 _optionScroll = Vector2.zero; private bool _cardGridActive; private int _cardGridColumns = 1; private int _cardGridColumn; private float _cardGridY; private float _cardGridWidth; private string _tooltipText = string.Empty; private bool _showRestoreConfirmation; private bool _hasHoveredSetting; private ModSettingKind _hoveredSetting; private readonly Dictionary _hoverAnimations = new Dictionary(); private GUIStyle _titleStyle; private GUIStyle _sectionTitleStyle; private GUIStyle _sectionSubtitleStyle; private GUIStyle _sectionTabStyle; private GUIStyle _selectedSectionTabStyle; private GUIStyle _labelStyle; private GUIStyle _descriptionStyle; private GUIStyle _metaTitleStyle; private GUIStyle _metaValueStyle; private GUIStyle _searchStyle; private GUIStyle _footerStyle; private GUIStyle _fieldStyle; private GUIStyle _buttonStyle; private GUIStyle _lockedLabelStyle; private GUIStyle _lockedValueStyle; private GUIStyle _lockedBadgeStyle; private GUIStyle _restoreButtonStyle; private GUIStyle _closeButtonStyle; private GUIStyle _completionLabelStyle; private GUIStyle _completionValueStyle; private GUIStyle _summaryValueStyle; private GUIStyle _summaryCaptionStyle; private GUIStyle _eyebrowStyle; private GUIStyle _sidebarHeaderStyle; private GUIStyle _chipStyle; private GUIStyle _shortcutStyle; private GUIStyle _navigationSearchStyle; private GUIStyle _switchLabelStyle; private GUIStyle _tooltipStyle; private GUIStyle _keycapStyle; private bool _thinScrollbarActive; private float _previousScrollbarWidth; private float _previousScrollbarThumbWidth; private float _previousScrollbarUpHeight; private float _previousScrollbarDownHeight; private Texture2D _previousScrollbarThumbNormal; private Texture2D _previousScrollbarThumbHover; private Texture2D _buttonNormalTexture; private Texture2D _buttonHoverTexture; private Texture2D _buttonActiveTexture; private Texture2D _fieldNormalTexture; private Texture2D _fieldFocusedTexture; public CustomDifficultyMenu(SettingsStore settingsStore, ModImages images, PresetManager presetManager, LocalizationManager localization) { //IL_015f: Unknown result type (might be due to invalid IL or missing references) //IL_0164: Unknown result type (might be due to invalid IL or missing references) //IL_017c: Unknown result type (might be due to invalid IL or missing references) //IL_0181: Unknown result type (might be due to invalid IL or missing references) //IL_0187: Unknown result type (might be due to invalid IL or missing references) //IL_018c: Unknown result type (might be due to invalid IL or missing references) _settingsStore = settingsStore; _images = images; _presetManager = presetManager; _localization = localization; } public void Update() { if (_isOpen) { _openAnimationProgress = Mathf.MoveTowards(_openAnimationProgress, 1f, Time.unscaledDeltaTime * 7.5f); } if (Input.GetKeyDown((KeyCode)289)) { if (_isOpen) { Close(); } else { Open(); } } else if (_isOpen && Input.GetKeyDown((KeyCode)27)) { if (_showRestoreConfirmation) { _showRestoreConfirmation = false; } else { Close(); } } else if (_isOpen) { if ((Input.GetKey((KeyCode)306) || Input.GetKey((KeyCode)305)) && Input.GetKeyDown((KeyCode)102)) { _focusNavigationSearch = true; } else if (Input.GetKeyDown((KeyCode)102) && string.IsNullOrEmpty(_focusedControl) && _hasHoveredSetting && !_showRestoreConfirmation) { CommitField(_hoveredSetting); _settingsStore.ToggleFavorite(_hoveredSetting); } if (string.IsNullOrEmpty(_focusedControl) && (Input.GetKeyDown((KeyCode)101) || Input.GetKeyDown((KeyCode)281))) { CycleSelectedSection(1); } else if (string.IsNullOrEmpty(_focusedControl) && (Input.GetKeyDown((KeyCode)113) || Input.GetKeyDown((KeyCode)280))) { CycleSelectedSection(-1); } } } public void OnGUI() { //IL_0031: 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) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_0160: Unknown result type (might be due to invalid IL or missing references) //IL_0165: Unknown result type (might be due to invalid IL or missing references) //IL_016a: Unknown result type (might be due to invalid IL or missing references) //IL_0171: Unknown result type (might be due to invalid IL or missing references) //IL_0173: Unknown result type (might be due to invalid IL or missing references) //IL_017d: Unknown result type (might be due to invalid IL or missing references) //IL_01b0: Unknown result type (might be due to invalid IL or missing references) //IL_01b6: Unknown result type (might be due to invalid IL or missing references) //IL_01c0: Unknown result type (might be due to invalid IL or missing references) //IL_01ee: Unknown result type (might be due to invalid IL or missing references) //IL_0232: Unknown result type (might be due to invalid IL or missing references) //IL_026c: Unknown result type (might be due to invalid IL or missing references) //IL_0277: Unknown result type (might be due to invalid IL or missing references) //IL_037d: Unknown result type (might be due to invalid IL or missing references) //IL_0394: Unknown result type (might be due to invalid IL or missing references) //IL_031f: Unknown result type (might be due to invalid IL or missing references) //IL_0340: Unknown result type (might be due to invalid IL or missing references) //IL_034b: Unknown result type (might be due to invalid IL or missing references) //IL_0372: Unknown result type (might be due to invalid IL or missing references) //IL_0475: Unknown result type (might be due to invalid IL or missing references) //IL_0477: Unknown result type (might be due to invalid IL or missing references) //IL_04a1: Unknown result type (might be due to invalid IL or missing references) //IL_04a6: Unknown result type (might be due to invalid IL or missing references) //IL_03ae: Unknown result type (might be due to invalid IL or missing references) //IL_03b4: Unknown result type (might be due to invalid IL or missing references) //IL_04cd: Unknown result type (might be due to invalid IL or missing references) //IL_04d5: Unknown result type (might be due to invalid IL or missing references) //IL_0509: Unknown result type (might be due to invalid IL or missing references) //IL_051b: Unknown result type (might be due to invalid IL or missing references) //IL_053d: Unknown result type (might be due to invalid IL or missing references) //IL_0543: Unknown result type (might be due to invalid IL or missing references) //IL_052b: Unknown result type (might be due to invalid IL or missing references) if (!_isOpen) { return; } HandleSubmitKey(); EnsureStyles(); GUI.depth = -1000; _tooltipText = string.Empty; _hasHoveredSetting = false; Matrix4x4 matrix = GUI.matrix; Color color = GUI.color; float num = Mathf.Clamp(Mathf.Min((float)Screen.width / 1280f, (float)Screen.height / 720f), 0.4f, 1.15f); GUI.matrix = Matrix4x4.Scale(new Vector3(num, num, 1f)); float num2 = (float)Screen.width / num; float num3 = (float)Screen.height / num; Rect val = default(Rect); ((Rect)(ref val))..ctor(0f, 0f, num2, num3); GUI.color = new Color(1f, 1f, 1f, Mathf.Clamp01(_openAnimationProgress)); DrawMenuBackdrop(val); float num4 = Mathf.Min(1700f, Mathf.Max(760f, num2 - 40f)); float num5 = Mathf.Min(1040f, Mathf.Max(620f, num3 - 34f)); Rect rect = default(Rect); ((Rect)(ref rect))..ctor((num2 - num4) * 0.5f, (num3 - num5) * 0.5f + (1f - _openAnimationProgress) * 18f, num4, num5); MenuSection section = LockedOptionCatalog.Sections[Mathf.Clamp(_selectedSectionIndex, 0, LockedOptionCatalog.Sections.Length - 1)]; _currentSectionAccent = GetSectionAccent(section); DrawSoftShadow(rect); DrawSolidRect(rect, MenuVisualTheme.Panel); DrawOrnateFrame(rect); DrawSolidRect(new Rect(((Rect)(ref rect)).x + 20f, ((Rect)(ref rect)).y + 1f, ((Rect)(ref rect)).width - 40f, 1f), MenuVisualTheme.WithAlpha(_currentSectionAccent, 0.72f)); GUI.Label(new Rect(((Rect)(ref rect)).x + 28f, ((Rect)(ref rect)).y + 8f, 410f, 18f), L("menu_eyebrow", "SILKSONG / PERFIL PERSONALIZADO"), _eyebrowStyle); GUI.Label(new Rect(((Rect)(ref rect)).x + 27f, ((Rect)(ref rect)).y + 23f, 360f, 42f), "CUSTOM DIFFICULTY", _titleStyle); DrawStatusChip(new Rect(((Rect)(ref rect)).x + 392f, ((Rect)(ref rect)).y + 30f, 70f, 26f), "v3.0.0", _currentSectionAccent); Rect val2 = default(Rect); ((Rect)(ref val2))..ctor(((Rect)(ref rect)).xMax - 58f, ((Rect)(ref rect)).y + 18f, 38f, 38f); float num6 = ((Rect)(ref val2)).x - 12f; Rect rect2 = default(Rect); ((Rect)(ref rect2))..ctor(num6 - 190f, ((Rect)(ref rect)).y + 17f, 180f, 40f); Rect rect3 = default(Rect); ((Rect)(ref rect3))..ctor(((Rect)(ref rect2)).x - 150f, ((Rect)(ref rect2)).y, 140f, ((Rect)(ref rect2)).height); if (((Rect)(ref rect3)).x > ((Rect)(ref rect)).x + 485f) { DrawMetricChip(rect3, L("changes", "ALTERAÇÕES"), GetChangedSettingCount().ToString(), MenuVisualTheme.SignalCyan); DrawMetricChip(rect2, L("active_interface", "INTERFACE ATIVA"), GetActiveOptionsPercentage() + "%", _currentSectionAccent); } SetTooltip(val2, L("close_menu", "Fechar menu (F8 / Esc)")); if (GUI.Button(val2, "×", _closeButtonStyle)) { Close(); GUI.matrix = matrix; GUI.color = color; return; } float num7 = 78f; float num8 = 58f; Rect val3 = default(Rect); ((Rect)(ref val3))..ctor(((Rect)(ref rect)).x + 14f, ((Rect)(ref rect)).y + num7, ((Rect)(ref rect)).width - 28f, ((Rect)(ref rect)).height - num7 - num8 - 4f); float num9 = Mathf.Clamp(((Rect)(ref val3)).width * 0.185f, 224f, 278f); Rect val4 = default(Rect); ((Rect)(ref val4))..ctor(((Rect)(ref val3)).x, ((Rect)(ref val3)).y, num9, ((Rect)(ref val3)).height); Rect optionRect = default(Rect); ((Rect)(ref optionRect))..ctor(((Rect)(ref val4)).xMax + 12f, ((Rect)(ref val3)).y, ((Rect)(ref val3)).width - num9 - 12f, ((Rect)(ref val3)).height); DrawSolidRect(val4, MenuVisualTheme.Sidebar); DrawSolidRect(new Rect(((Rect)(ref val4)).xMax - 1f, ((Rect)(ref val4)).y, 1f, ((Rect)(ref val4)).height), MenuVisualTheme.BorderSubtle); bool enabled = GUI.enabled; GUI.enabled = enabled && !_showRestoreConfirmation; DrawSectionTabs(val4); DrawSectionContent(optionRect); DrawFooter(new Rect(((Rect)(ref rect)).x + 14f, ((Rect)(ref rect)).yMax - num8, ((Rect)(ref rect)).width - 28f, num8 - 8f)); GUI.enabled = enabled; DrawTooltip(val); if (_showRestoreConfirmation) { DrawRestoreConfirmation(val); } HandleTextFieldFocus(); ConsumeInputEvent(); GUI.matrix = matrix; GUI.color = color; } public void Shutdown() { if (_isOpen) { Close(); } DestroyTexture(ref _buttonNormalTexture); DestroyTexture(ref _buttonHoverTexture); DestroyTexture(ref _buttonActiveTexture); DestroyTexture(ref _fieldNormalTexture); DestroyTexture(ref _fieldFocusedTexture); } private void Open() { //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) SyncTextFromSettings(); _openSettingsSnapshot = _settingsStore.ExportJson(); _operationMessage = string.Empty; _openAnimationProgress = 0f; _showRestoreConfirmation = false; _tooltipText = string.Empty; _focusNavigationSearch = false; _focusedControl = string.Empty; _previousTimeScale = Time.timeScale; Time.timeScale = 0f; _previousCursorVisible = Cursor.visible; _previousCursorLockMode = Cursor.lockState; Cursor.visible = true; Cursor.lockState = (CursorLockMode)0; SetHeroInputBlocked(blocked: true); _isOpen = true; } private void Close() { //IL_0040: Unknown result type (might be due to invalid IL or missing references) CommitAllFields(); GUI.FocusControl(string.Empty); _focusedControl = string.Empty; _isOpen = false; SetHeroInputBlocked(blocked: false); Time.timeScale = _previousTimeScale; Cursor.visible = _previousCursorVisible; Cursor.lockState = _previousCursorLockMode; } private void DrawSectionTabs(Rect sectionRect) { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_0155: Unknown result type (might be due to invalid IL or missing references) //IL_0219: Unknown result type (might be due to invalid IL or missing references) //IL_021b: Unknown result type (might be due to invalid IL or missing references) //IL_0220: Unknown result type (might be due to invalid IL or missing references) //IL_0224: Unknown result type (might be due to invalid IL or missing references) //IL_0229: Unknown result type (might be due to invalid IL or missing references) //IL_052e: Unknown result type (might be due to invalid IL or missing references) //IL_0530: Unknown result type (might be due to invalid IL or missing references) //IL_0554: Unknown result type (might be due to invalid IL or missing references) //IL_0559: Unknown result type (might be due to invalid IL or missing references) //IL_0563: Unknown result type (might be due to invalid IL or missing references) //IL_04d3: Unknown result type (might be due to invalid IL or missing references) //IL_02ef: Unknown result type (might be due to invalid IL or missing references) //IL_02fd: Unknown result type (might be due to invalid IL or missing references) //IL_0302: Unknown result type (might be due to invalid IL or missing references) //IL_030c: Unknown result type (might be due to invalid IL or missing references) //IL_029c: Unknown result type (might be due to invalid IL or missing references) //IL_0359: Unknown result type (might be due to invalid IL or missing references) //IL_0326: Unknown result type (might be due to invalid IL or missing references) //IL_03c5: Unknown result type (might be due to invalid IL or missing references) //IL_03c9: Unknown result type (might be due to invalid IL or missing references) //IL_03f8: Unknown result type (might be due to invalid IL or missing references) //IL_038d: Unknown result type (might be due to invalid IL or missing references) //IL_0392: Unknown result type (might be due to invalid IL or missing references) //IL_0474: Unknown result type (might be due to invalid IL or missing references) //IL_045d: Unknown result type (might be due to invalid IL or missing references) GUI.Label(new Rect(((Rect)(ref sectionRect)).x + 14f, ((Rect)(ref sectionRect)).y + 8f, ((Rect)(ref sectionRect)).width - 28f, 18f), L("navigation", "NAVEGAÇÃO"), _sidebarHeaderStyle); Rect val = default(Rect); ((Rect)(ref val))..ctor(((Rect)(ref sectionRect)).x + 10f, ((Rect)(ref sectionRect)).y + 30f, ((Rect)(ref sectionRect)).width - 20f, 36f); SetTooltip(val, L("search_tooltip", "Buscar categorias e seções (Ctrl+F)")); GUI.SetNextControlName("CustomDifficultyNavigationSearch"); _navigationSearchText = GUI.TextField(val, _navigationSearchText ?? string.Empty, 36, _navigationSearchStyle); if (!string.IsNullOrEmpty(_navigationSearchText) && GUI.Button(new Rect(((Rect)(ref val)).xMax - 31f, ((Rect)(ref val)).y + 6f, 25f, 26f), "×", _closeButtonStyle)) { _navigationSearchText = string.Empty; GUI.FocusControl("CustomDifficultyNavigationSearch"); } if (string.IsNullOrEmpty(_navigationSearchText)) { GUI.Label(new Rect(((Rect)(ref val)).x + 13f, ((Rect)(ref val)).y, ((Rect)(ref val)).width - 26f, ((Rect)(ref val)).height), "⌕ " + L("search_category", "Buscar categoria..."), _searchStyle); } if (_focusNavigationSearch) { GUI.FocusControl("CustomDifficultyNavigationSearch"); _focusNavigationSearch = false; } float num = 44f; Rect position = default(Rect); ((Rect)(ref position))..ctor(((Rect)(ref sectionRect)).x + 1f, ((Rect)(ref sectionRect)).y + 72f, ((Rect)(ref sectionRect)).width - 2f, ((Rect)(ref sectionRect)).height - num - 76f); float filteredNavigationHeight = GetFilteredNavigationHeight(); Rect viewRect = default(Rect); ((Rect)(ref viewRect))..ctor(0f, 0f, Mathf.Max(150f, ((Rect)(ref position)).width - 18f), Mathf.Max(((Rect)(ref position)).height, filteredNavigationHeight)); _sectionScroll = BeginThinScrollView(position, _sectionScroll, viewRect, alwaysShowHorizontal: false, alwaysShowVertical: false); float num2 = 5f; string b = string.Empty; int num3 = 0; Rect val2 = default(Rect); Rect rect = default(Rect); for (int i = 0; i < LockedOptionCatalog.Sections.Length; i++) { MenuSection section = LockedOptionCatalog.Sections[i]; if (!MatchesNavigationSearch(section)) { continue; } string sectionGroup = GetSectionGroup(section); if (!string.Equals(sectionGroup, b, StringComparison.Ordinal)) { if (num3 > 0) { num2 += 7f; } GUI.Label(new Rect(13f, num2, ((Rect)(ref viewRect)).width - 26f, 20f), sectionGroup, _sidebarHeaderStyle); num2 += 23f; b = sectionGroup; } bool flag = i == _selectedSectionIndex; ((Rect)(ref val2))..ctor(7f, num2, ((Rect)(ref viewRect)).width - 14f, 48f); bool flag2 = ((Rect)(ref val2)).Contains(Event.current.mousePosition); Color sectionAccent = GetSectionAccent(section); if (flag || flag2) { DrawSolidRect(val2, flag ? new Color(sectionAccent.r * 0.18f, sectionAccent.g * 0.18f, sectionAccent.b * 0.18f, 0.72f) : new Color(0.07f, 0.085f, 0.087f, 0.84f)); } if (flag) { DrawSolidRect(new Rect(((Rect)(ref val2)).x, ((Rect)(ref val2)).y + 6f, 3f, ((Rect)(ref val2)).height - 12f), sectionAccent); } ((Rect)(ref rect))..ctor(((Rect)(ref val2)).x + 12f, ((Rect)(ref val2)).y + 12f, 24f, 24f); DrawSectionIcon(rect, section, sectionAccent); GUI.Label(new Rect(((Rect)(ref rect)).xMax + 10f, ((Rect)(ref val2)).y, ((Rect)(ref val2)).width - 82f, ((Rect)(ref val2)).height), GetLocalizedSectionLabel(section).ToUpperInvariant(), flag ? _selectedSectionTabStyle : _sectionTabStyle); int num4 = GetActiveRowCount(section) + LockedOptionCatalog.GetOptions(section).Count; if (num4 > 0) { GUI.Label(new Rect(((Rect)(ref val2)).xMax - 36f, ((Rect)(ref val2)).y, 26f, ((Rect)(ref val2)).height), num4.ToString(), _shortcutStyle); } if (GUI.Button(val2, GUIContent.none, GUIStyle.none)) { SelectSection(i); } num2 += 52f; num3++; } if (num3 == 0) { GUI.Label(new Rect(15f, 18f, ((Rect)(ref viewRect)).width - 30f, 52f), L("no_category", "Nenhuma categoria encontrada. Tente outro termo."), _descriptionStyle); } EndThinScrollView(); Rect val3 = default(Rect); ((Rect)(ref val3))..ctor(((Rect)(ref sectionRect)).x + 9f, ((Rect)(ref sectionRect)).yMax - num + 5f, ((Rect)(ref sectionRect)).width - 18f, 36f); DrawSolidRect(val3, MenuVisualTheme.Surface); DrawSolidRect(new Rect(((Rect)(ref val3)).x, ((Rect)(ref val3)).y, ((Rect)(ref val3)).width, 1f), MenuVisualTheme.BorderSubtle); GUI.Label(val3, "★ " + _settingsStore.FavoriteCount + " " + L("favorites_search", "FAVORITOS · CTRL+F BUSCAR"), _lockedBadgeStyle); } private void DrawSectionContent(Rect optionRect) { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: 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_00fc: Unknown result type (might be due to invalid IL or missing references) //IL_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_0186: Unknown result type (might be due to invalid IL or missing references) //IL_01b3: Unknown result type (might be due to invalid IL or missing references) //IL_01cb: Unknown result type (might be due to invalid IL or missing references) //IL_01fa: Unknown result type (might be due to invalid IL or missing references) //IL_0295: Unknown result type (might be due to invalid IL or missing references) //IL_0298: Unknown result type (might be due to invalid IL or missing references) //IL_029d: Unknown result type (might be due to invalid IL or missing references) //IL_02a1: Unknown result type (might be due to invalid IL or missing references) //IL_02a6: Unknown result type (might be due to invalid IL or missing references) //IL_02f5: Unknown result type (might be due to invalid IL or missing references) MenuSection section = LockedOptionCatalog.Sections[Mathf.Clamp(_selectedSectionIndex, 0, LockedOptionCatalog.Sections.Length - 1)]; _currentSectionAccent = GetSectionAccent(section); Rect rect = default(Rect); ((Rect)(ref rect))..ctor(((Rect)(ref optionRect)).x, ((Rect)(ref optionRect)).y, ((Rect)(ref optionRect)).width, 78f); DrawSolidRect(rect, MenuVisualTheme.Surface); DrawSolidRect(new Rect(((Rect)(ref rect)).x, ((Rect)(ref rect)).y + 9f, 3f, ((Rect)(ref rect)).height - 18f), _currentSectionAccent); DrawSolidRect(new Rect(((Rect)(ref rect)).x + 14f, ((Rect)(ref rect)).yMax - 1f, ((Rect)(ref rect)).width - 28f, 1f), MenuVisualTheme.WithAlpha(_currentSectionAccent, 0.28f)); Rect rect2 = default(Rect); ((Rect)(ref rect2))..ctor(((Rect)(ref rect)).x + 18f, ((Rect)(ref rect)).y + 15f, 46f, 46f); DrawSectionIcon(rect2, section, _currentSectionAccent); float num = Mathf.Clamp(((Rect)(ref rect)).width * 0.22f, 180f, 220f); Rect rect3 = default(Rect); ((Rect)(ref rect3))..ctor(((Rect)(ref rect)).xMax - num - 14f, ((Rect)(ref rect)).y + 17f, num, 42f); float num2 = ((Rect)(ref rect2)).xMax + 14f; float num3 = ((Rect)(ref rect3)).x - num2 - 14f; GUI.Label(new Rect(num2, ((Rect)(ref rect)).y + 7f, num3, 32f), GetLocalizedSectionLabel(section), _sectionTitleStyle); GUI.Label(new Rect(num2, ((Rect)(ref rect)).y + 38f, num3, 31f), GetSectionSubtitle(section), _sectionSubtitleStyle); DrawMetricChip(rect3, L("items_in_area", "ITENS NESTA ÁREA"), (GetActiveRowCount(section) + LockedOptionCatalog.GetOptions(section).Count).ToString(), _currentSectionAccent); Rect position = default(Rect); ((Rect)(ref position))..ctor(((Rect)(ref optionRect)).x, ((Rect)(ref optionRect)).y + 78f + 10f, ((Rect)(ref optionRect)).width, ((Rect)(ref optionRect)).height - 78f - 10f); List options = LockedOptionCatalog.GetOptions(section); float num4 = Mathf.Max(240f, ((Rect)(ref position)).width - 16f); float estimatedContentHeight = GetEstimatedContentHeight(section, num4, options.Count); Rect viewRect = default(Rect); ((Rect)(ref viewRect))..ctor(0f, 0f, num4, Mathf.Max(((Rect)(ref position)).height, estimatedContentHeight)); _optionScroll = BeginThinScrollView(position, _optionScroll, viewRect, alwaysShowHorizontal: false, alwaysShowVertical: false); float rowY = 4f; BeginCardLayout(section, ((Rect)(ref viewRect)).width, rowY); DrawActiveRows(section, ((Rect)(ref viewRect)).width, ref rowY); rowY = EndCardLayout(rowY); for (int i = 0; i < options.Count; i++) { DrawLockedRow(new Rect(0f, rowY, ((Rect)(ref viewRect)).width, 124f), options[i], i); rowY += 132f; } EndThinScrollView(); } private Vector2 BeginThinScrollView(Rect position, Vector2 scrollPosition, Rect viewRect, bool alwaysShowHorizontal, bool alwaysShowVertical) { //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Unknown result type (might be due to invalid IL or missing references) GUISkin skin = GUI.skin; _previousScrollbarWidth = skin.verticalScrollbar.fixedWidth; _previousScrollbarThumbWidth = skin.verticalScrollbarThumb.fixedWidth; _previousScrollbarUpHeight = skin.verticalScrollbarUpButton.fixedHeight; _previousScrollbarDownHeight = skin.verticalScrollbarDownButton.fixedHeight; _previousScrollbarThumbNormal = skin.verticalScrollbarThumb.normal.background; _previousScrollbarThumbHover = skin.verticalScrollbarThumb.hover.background; skin.verticalScrollbar.fixedWidth = 7f; skin.verticalScrollbarThumb.fixedWidth = 7f; skin.verticalScrollbarUpButton.fixedHeight = 0f; skin.verticalScrollbarDownButton.fixedHeight = 0f; skin.verticalScrollbarThumb.normal.background = _fieldFocusedTexture; skin.verticalScrollbarThumb.hover.background = _buttonHoverTexture; _thinScrollbarActive = true; return GUI.BeginScrollView(position, scrollPosition, viewRect, alwaysShowHorizontal, alwaysShowVertical); } private void EndThinScrollView() { GUI.EndScrollView(); if (_thinScrollbarActive) { GUISkin skin = GUI.skin; skin.verticalScrollbar.fixedWidth = _previousScrollbarWidth; skin.verticalScrollbarThumb.fixedWidth = _previousScrollbarThumbWidth; skin.verticalScrollbarUpButton.fixedHeight = _previousScrollbarUpHeight; skin.verticalScrollbarDownButton.fixedHeight = _previousScrollbarDownHeight; skin.verticalScrollbarThumb.normal.background = _previousScrollbarThumbNormal; skin.verticalScrollbarThumb.hover.background = _previousScrollbarThumbHover; _thinScrollbarActive = false; } } private void BeginCardLayout(MenuSection section, float width, float startY) { _cardGridActive = ShouldUseCardGrid(section, width); _cardGridColumns = ((!_cardGridActive) ? 1 : 2); _cardGridColumn = 0; _cardGridY = startY; _cardGridWidth = width; } private Rect ResolveCardRect(Rect requested, bool fullWidth) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) if (!_cardGridActive) { return requested; } if (fullWidth) { if (_cardGridColumn != 0) { _cardGridY += 158f; _cardGridColumn = 0; } Rect result = default(Rect); ((Rect)(ref result))..ctor(0f, _cardGridY, _cardGridWidth, ((Rect)(ref requested)).height); _cardGridY += ((Rect)(ref requested)).height + 12f; return result; } float num = (_cardGridWidth - 12f) / (float)_cardGridColumns; Rect result2 = default(Rect); ((Rect)(ref result2))..ctor((float)_cardGridColumn * (num + 12f), _cardGridY, num, ((Rect)(ref requested)).height); _cardGridColumn++; if (_cardGridColumn >= _cardGridColumns) { _cardGridColumn = 0; _cardGridY += ((Rect)(ref requested)).height + 12f; } return result2; } private float EndCardLayout(float fallbackY) { if (!_cardGridActive) { return fallbackY; } if (_cardGridColumn != 0) { _cardGridY += 158f; _cardGridColumn = 0; } _cardGridActive = false; return _cardGridY; } private static bool ShouldUseCardGrid(MenuSection section, float width) { if (width < 1010f) { return false; } if (section != MenuSection.Favorites && section != MenuSection.Player && section != MenuSection.Damage && section != MenuSection.Enemies && section != MenuSection.Bosses && section != MenuSection.Drops && section != MenuSection.Economy && section != MenuSection.Movement) { return section == MenuSection.Mutators; } return true; } private float GetEstimatedContentHeight(MenuSection section, float width, int lockedCount) { switch (section) { case MenuSection.Summary: return ((width >= 900f) ? 500f : 630f) + (float)lockedCount * 132f; case MenuSection.Favorites: if (_settingsStore.FavoriteCount == 0) { return 334f + (float)lockedCount * 132f; } break; } int num = GetActiveRowCount(section); if (ShouldUseCardGrid(section, width)) { if (section == MenuSection.Damage) { num = Mathf.CeilToInt((float)(num - 4) / 2f) + 7; } else { int num2 = ((section != MenuSection.Favorites) ? 1 : 0); num = Mathf.CeilToInt((float)(num - num2) / 2f) + num2; } } return (float)num * 158f + (float)lockedCount * 132f + 18f; } private void DrawActiveRows(MenuSection section, float width, ref float rowY) { //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0261: Unknown result type (might be due to invalid IL or missing references) //IL_0b38: 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) //IL_0cce: Unknown result type (might be due to invalid IL or missing references) //IL_02a5: Unknown result type (might be due to invalid IL or missing references) //IL_0f75: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_1029: Unknown result type (might be due to invalid IL or missing references) //IL_02e9: Unknown result type (might be due to invalid IL or missing references) //IL_030c: Unknown result type (might be due to invalid IL or missing references) //IL_1138: Unknown result type (might be due to invalid IL or missing references) //IL_0fba: Unknown result type (might be due to invalid IL or missing references) //IL_0b93: Unknown result type (might be due to invalid IL or missing references) //IL_010e: Unknown result type (might be due to invalid IL or missing references) //IL_106e: Unknown result type (might be due to invalid IL or missing references) //IL_0d29: Unknown result type (might be due to invalid IL or missing references) //IL_034a: Unknown result type (might be due to invalid IL or missing references) //IL_117d: Unknown result type (might be due to invalid IL or missing references) //IL_0fff: Unknown result type (might be due to invalid IL or missing references) //IL_0153: Unknown result type (might be due to invalid IL or missing references) //IL_125f: Unknown result type (might be due to invalid IL or missing references) //IL_1281: Unknown result type (might be due to invalid IL or missing references) //IL_12a3: Unknown result type (might be due to invalid IL or missing references) //IL_11ee: Unknown result type (might be due to invalid IL or missing references) //IL_1226: Unknown result type (might be due to invalid IL or missing references) //IL_0383: Unknown result type (might be due to invalid IL or missing references) //IL_03ab: Unknown result type (might be due to invalid IL or missing references) //IL_1316: Unknown result type (might be due to invalid IL or missing references) //IL_11c2: Unknown result type (might be due to invalid IL or missing references) //IL_0bee: Unknown result type (might be due to invalid IL or missing references) //IL_0198: Unknown result type (might be due to invalid IL or missing references) //IL_1389: Unknown result type (might be due to invalid IL or missing references) //IL_10c8: Unknown result type (might be due to invalid IL or missing references) //IL_0d84: Unknown result type (might be due to invalid IL or missing references) //IL_03fa: Unknown result type (might be due to invalid IL or missing references) //IL_13ff: Unknown result type (might be due to invalid IL or missing references) //IL_01dd: Unknown result type (might be due to invalid IL or missing references) //IL_110d: Unknown result type (might be due to invalid IL or missing references) //IL_044c: Unknown result type (might be due to invalid IL or missing references) //IL_0c49: Unknown result type (might be due to invalid IL or missing references) //IL_0ddf: Unknown result type (might be due to invalid IL or missing references) //IL_0485: Unknown result type (might be due to invalid IL or missing references) //IL_04ad: Unknown result type (might be due to invalid IL or missing references) //IL_0237: Unknown result type (might be due to invalid IL or missing references) //IL_04fc: Unknown result type (might be due to invalid IL or missing references) //IL_0ca4: Unknown result type (might be due to invalid IL or missing references) //IL_0e3a: Unknown result type (might be due to invalid IL or missing references) //IL_054e: Unknown result type (might be due to invalid IL or missing references) //IL_05a0: Unknown result type (might be due to invalid IL or missing references) //IL_0e95: Unknown result type (might be due to invalid IL or missing references) //IL_05d9: Unknown result type (might be due to invalid IL or missing references) //IL_0601: Unknown result type (might be due to invalid IL or missing references) //IL_0650: Unknown result type (might be due to invalid IL or missing references) //IL_0ef0: Unknown result type (might be due to invalid IL or missing references) //IL_06a4: Unknown result type (might be due to invalid IL or missing references) //IL_06dd: Unknown result type (might be due to invalid IL or missing references) //IL_0705: Unknown result type (might be due to invalid IL or missing references) //IL_0f4b: Unknown result type (might be due to invalid IL or missing references) //IL_0755: Unknown result type (might be due to invalid IL or missing references) //IL_07a9: Unknown result type (might be due to invalid IL or missing references) //IL_07e2: Unknown result type (might be due to invalid IL or missing references) //IL_080a: Unknown result type (might be due to invalid IL or missing references) //IL_085a: Unknown result type (might be due to invalid IL or missing references) //IL_08ae: Unknown result type (might be due to invalid IL or missing references) //IL_08e7: Unknown result type (might be due to invalid IL or missing references) //IL_090f: Unknown result type (might be due to invalid IL or missing references) //IL_095f: Unknown result type (might be due to invalid IL or missing references) //IL_09ad: Unknown result type (might be due to invalid IL or missing references) //IL_09d0: Unknown result type (might be due to invalid IL or missing references) //IL_0a14: Unknown result type (might be due to invalid IL or missing references) //IL_0a2e: Unknown result type (might be due to invalid IL or missing references) //IL_0a51: Unknown result type (might be due to invalid IL or missing references) //IL_0a95: Unknown result type (might be due to invalid IL or missing references) //IL_0aaf: Unknown result type (might be due to invalid IL or missing references) //IL_0ad2: Unknown result type (might be due to invalid IL or missing references) //IL_0b16: Unknown result type (might be due to invalid IL or missing references) switch (section) { case MenuSection.Favorites: DrawFavoriteRows(width, ref rowY); break; case MenuSection.Summary: { DifficultySummarySnapshot summary = BuildDifficultySummary(); DrawSummaryDashboard(width, ref rowY, summary); break; } case MenuSection.Player: DrawSettingRow(new Rect(0f, rowY, width, 146f), ModSettingKind.MaximumHealth, "VIDA MÁXIMA", "Define o limite total de máscaras da Hornet, entre 1 e 20. Ao reduzir o valor, a vida atual é limitada ao novo máximo; ao desligar a opção, o máximo original do perfil é restaurado.", (_images != null) ? _images.Health : null); rowY += 158f; DrawSettingRow(new Rect(0f, rowY, width, 146f), ModSettingKind.DamageTakenMultiplier, "DANO RECEBIDO", "Adiciona dano aos ataques de inimigos e projéteis. O valor 1 mantém o dano original; cada ponto acima de 1 acrescenta uma máscara ao dano que o ataque normalmente causaria.", (_images != null) ? _images.EnemyDamage : null); rowY += 158f; DrawSettingRow(new Rect(0f, rowY, width, 146f), ModSettingKind.EnvironmentalDamageMultiplier, "DANO DE CENÁRIO", "Controla o dano adicional de espinhos, ácido, lava, armadilhas e outros perigos do cenário. O valor 1 preserva o dano original; valores maiores acrescentam máscaras ao acerto.", (_images != null) ? _images.EnvironmentalDamage : null); rowY += 158f; DrawSettingRow(new Rect(0f, rowY, width, 146f), ModSettingKind.OneHitMode, "MODO ONE HIT", "Quando o valor está Ligado, qualquer acerto que cause dano remove toda a vida normal e azul da Hornet. O botão LIG./DESL. ativa ou ignora completamente esta regra.", (_images != null) ? _images.OneHit : null); rowY += 158f; DrawSettingRow(new Rect(0f, rowY, width, 146f), ModSettingKind.HealingAmount, "QUANTIDADE DE CURA", "Define diretamente quantas máscaras são recuperadas ao concluir um Bind, de 1 a 20. O valor não multiplica a cura normal; ele passa a ser a quantidade total restaurada, limitada pela vida máxima.", (_images != null) ? _images.Healing : null); rowY += 158f; DrawSettingRow(new Rect(0f, rowY, width, 146f), ModSettingKind.HealingCost, "CUSTO DA CURA", "Define diretamente quantos fios de Seda são necessários e consumidos pelo Bind, de 1 a 18. O mesmo valor é usado para liberar a cura, atualizar o indicador e descontar a Seda.", (_images != null) ? _images.SilkSpool : null); rowY += 158f; DrawSettingRow(new Rect(0f, rowY, width, 146f), ModSettingKind.InvincibilityTimeMultiplier, "TEMPO DE INVENCIBILIDADE", "Multiplica a duração original da invencibilidade após receber dano e durante Parry, Quake, Cross Stitch e Silk Dash. 1,0x mantém o tempo normal; 2,0x dobra cada janela.", (_images != null) ? _images.Invincibility : null, (_images != null) ? _images.Timing : null); rowY += 158f; DrawPlayerCategoryResetRow(new Rect(0f, rowY, width, 146f)); rowY += 158f; break; case MenuSection.Damage: DrawSettingRow(new Rect(0f, rowY, width, 146f), ModSettingKind.NeedleDamage, "DANO DA AGULHA", "Define o dano base da agulha antes das melhorias, entre 1 e 100. Este valor substitui o dano base detectado do jogo enquanto a opção estiver ligada.", (_images != null) ? _images.Needle : null); rowY += 158f; DrawSettingRow(new Rect(0f, rowY, width, 146f), ModSettingKind.NeedleUpgradePercentage, "AUMENTO POR MELHORIA (%)", "Aplica a porcentagem a cada melhoria já obtida, sempre sobre o dano resultante da etapa anterior. Exemplo: dano 10 e 100% vira 20 na primeira melhoria e 40 na segunda.", (_images != null) ? _images.NeedleUpgrade : null); rowY += 158f; DrawDamageToolCategory(new Rect(0f, rowY, width, 146f), "HABILIDADES DE SEDA", "Custos e danos individuais das seis Habilidades de Seda. Os valores padrão reproduzem a build 1.0.30000.", new Color(0.86f, 0.88f, 0.84f, 1f), (_images != null) ? _images.WhiteTools : null); rowY += 158f; DrawDamageToolEntry(new Rect(18f, rowY, width - 18f, 146f), "LANÇA DE SEDA", "Um impacto perfurante. Fórmula vanilla: dano atual da Agulha × 3,00.", (_images != null) ? _images.SilkSpear : null, new Color(0.86f, 0.88f, 0.84f, 1f)); rowY += 158f; DrawSettingRow(new Rect(18f, rowY, width - 18f, 146f), ModSettingKind.SilkSpearSilkCost, "CUSTO DE SEDA", GetSilkCostDescription("Lança de Seda"), (_images != null) ? _images.SilkSpear : null); rowY += 158f; DrawSettingRow(new Rect(18f, rowY, width - 18f, 146f), ModSettingKind.SilkSpearDamageMultiplier, "MULTIPLICADOR DE DANO", GetSilkDamageDescription(ModSettingKind.SilkSpearDamageMultiplier, "Aplicado uma vez ao dano atual da Agulha no único impacto.", 1), (_images != null) ? _images.SilkSpear : null); rowY += 158f; DrawDamageToolEntry(new Rect(18f, rowY, width - 18f, 146f), "TURBILHÃO DE FIOS", "Impactos separados a cada 6 passos de física. O FSM troca o multiplicador após 0,5 s.", (_images != null) ? _images.ThreadStorm : null, new Color(0.86f, 0.88f, 0.84f, 1f)); rowY += 158f; DrawSettingRow(new Rect(18f, rowY, width - 18f, 146f), ModSettingKind.ThreadStormSilkCost, "CUSTO DE SEDA", GetSilkCostDescription("Turbilhão de Fios"), (_images != null) ? _images.ThreadStorm : null); rowY += 158f; DrawSettingRow(new Rect(18f, rowY, width - 18f, 146f), ModSettingKind.ThreadStormNormalHitMultiplier, "IMPACTOS INICIAIS (0–0,5 S)", GetSilkDamageDescription(ModSettingKind.ThreadStormNormalHitMultiplier, "O alvo mantém os quatro primeiros impactos completos.", 1), (_images != null) ? _images.ThreadStorm : null); rowY += 158f; DrawSettingRow(new Rect(18f, rowY, width - 18f, 146f), ModSettingKind.ThreadStormLateHitMultiplier, "IMPACTOS TARDIOS (APÓS 0,5 S)", GetSilkDamageDescription(ModSettingKind.ThreadStormLateHitMultiplier, "No mesmo alvo, o 5º impacto ainda é dividido por 3 e os seguintes por 4.", 1), (_images != null) ? _images.ThreadStorm : null); rowY += 158f; DrawDamageToolEntry(new Rect(18f, rowY, width - 18f, 146f), "PONTO CRUZ", "Contra-ataque de quatro impactos, criado somente após uma defesa bem-sucedida.", (_images != null) ? _images.CrossStitch : null, new Color(0.86f, 0.88f, 0.84f, 1f)); rowY += 158f; DrawSettingRow(new Rect(18f, rowY, width - 18f, 146f), ModSettingKind.CrossStitchSilkCost, "CUSTO DE SEDA", GetSilkCostDescription("Ponto Cruz"), (_images != null) ? _images.CrossStitch : null); rowY += 158f; DrawSettingRow(new Rect(18f, rowY, width - 18f, 146f), ModSettingKind.CrossStitchHitMultiplier, "MULTIPLICADOR POR GOLPE", GetSilkDamageDescription(ModSettingKind.CrossStitchHitMultiplier, "Cada um dos quatro impactos é calculado e arredondado separadamente.", 4), (_images != null) ? _images.CrossStitch : null); rowY += 158f; DrawDamageToolEntry(new Rect(18f, rowY, width - 18f, 146f), "DARDO AFIADO", "Na build atual, usa um único DamageEnemies de 2,75x por inimigo atravessado.", (_images != null) ? _images.SharpDart : null, new Color(0.86f, 0.88f, 0.84f, 1f)); rowY += 158f; DrawSettingRow(new Rect(18f, rowY, width - 18f, 146f), ModSettingKind.SharpdartSilkCost, "CUSTO DE SEDA", GetSilkCostDescription("Dardo Afiado"), (_images != null) ? _images.SharpDart : null); rowY += 158f; DrawSettingRow(new Rect(18f, rowY, width - 18f, 146f), ModSettingKind.SharpdartMainHitMultiplier, "MULTIPLICADOR DO IMPACTO", GetSilkDamageDescription(ModSettingKind.SharpdartMainHitMultiplier, "Substitui somente o impacto perfurante; movimento e invulnerabilidade não são alterados.", 1), (_images != null) ? _images.SharpDart : null); rowY += 158f; DrawDamageToolEntry(new Rect(18f, rowY, width - 18f, 146f), "FÚRIA DE RUNAS", "Nove runas independentes. A redução por impactos repetidos pertence a cada inimigo.", (_images != null) ? _images.RuneRage : null, new Color(0.86f, 0.88f, 0.84f, 1f)); rowY += 158f; DrawSettingRow(new Rect(18f, rowY, width - 18f, 146f), ModSettingKind.RuneRageSilkCost, "CUSTO DE SEDA", GetSilkCostDescription("Fúria de Runas"), (_images != null) ? _images.RuneRage : null); rowY += 158f; DrawSettingRow(new Rect(18f, rowY, width - 18f, 146f), ModSettingKind.RuneRageBaseDamageMultiplier, "MULTIPLICADOR BASE DA RUNA", GetSilkDamageDescription(ModSettingKind.RuneRageBaseDamageMultiplier, "Define a primeira runa. No mesmo alvo, as seguintes usam divisão inteira por 2, 3, 4 e assim por diante, com mínimo 1.", 1), (_images != null) ? _images.RuneRage : null); rowY += 158f; DrawDamageToolEntry(new Rect(18f, rowY, width - 18f, 146f), "FERRÕES PÁLIDOS", "Três projéteis independentes, cada um usando o dano atual da Agulha.", (_images != null) ? _images.PaleSpines : null, new Color(0.86f, 0.88f, 0.84f, 1f)); rowY += 158f; DrawSettingRow(new Rect(18f, rowY, width - 18f, 146f), ModSettingKind.PaleNailsSilkCost, "CUSTO DE SEDA", GetSilkCostDescription("Ferrões Pálidos"), (_images != null) ? _images.PaleSpines : null); rowY += 158f; DrawSettingRow(new Rect(18f, rowY, width - 18f, 146f), ModSettingKind.PaleNailsProjectileMultiplier, "MULTIPLICADOR POR PROJÉTIL", GetSilkDamageDescription(ModSettingKind.PaleNailsProjectileMultiplier, "Cada projétil é calculado separadamente. A prévia total considera os três projéteis.", 3), (_images != null) ? _images.PaleSpines : null); rowY += 158f; DrawDamageToolCategory(new Rect(0f, rowY, width, 146f), "FERRAMENTAS VERMELHAS", "Dispositivos ativos, como projéteis, armadilhas e bombas; os usos são reabastecidos com Fragmentos de Concha.", new Color(0.86f, 0.25f, 0.18f, 1f), (_images != null) ? _images.RedTools : null); rowY += 158f; DrawDamageToolEntries(RedDamageTools, new Color(0.86f, 0.25f, 0.18f, 1f), width, ref rowY); DrawDamageToolCategory(new Rect(0f, rowY, width, 146f), "FERRAMENTAS AZUIS", "Melhorias passivas defensivas e ofensivas: proteção extra, resistência a perigos e aplicação de efeitos.", new Color(0.22f, 0.54f, 0.92f, 1f), (_images != null) ? _images.BlueTools : null); rowY += 158f; DrawDamageToolEntries(BlueDamageTools, new Color(0.22f, 0.54f, 0.92f, 1f), width, ref rowY); DrawDamageToolCategory(new Rect(0f, rowY, width, 146f), "FERRAMENTAS AMARELAS", "Melhorias passivas ofensivas ou de suporte, voltadas a reforçar ataques e vantagens de exploração.", new Color(0.94f, 0.72f, 0.18f, 1f), (_images != null) ? _images.YellowTools : null); rowY += 158f; DrawDamageToolEntries(YellowDamageTools, new Color(0.94f, 0.72f, 0.18f, 1f), width, ref rowY); break; case MenuSection.Enemies: DrawSettingRow(new Rect(0f, rowY, width, 146f), ModSettingKind.EnemyHealthMultiplier, "VIDA DOS INIMIGOS", "Multiplica a vida máxima dos inimigos comuns quando eles aparecem. A vida atual mantém a mesma porcentagem ao mudar o valor; Bosses identificados não são alterados.", (_images != null) ? _images.GetSectionIcon(MenuSection.Enemies) : null, (_images != null) ? _images.Health : null); rowY += 158f; DrawSettingRow(new Rect(0f, rowY, width, 146f), ModSettingKind.EnemySpeedMultiplier, "VELOCIDADE DOS INIMIGOS", "Multiplica de 0,1x a 1,1x a velocidade física de movimento dos inimigos comuns. Não acelera o tempo global, a Hornet nem a recarga de ataques; inimigos parados continuam parados.", (_images != null) ? _images.GetSectionIcon(MenuSection.Enemies) : null, (_images != null) ? _images.Sprint : null); rowY += 158f; DrawSettingRow(new Rect(0f, rowY, width, 146f), ModSettingKind.EnemyAttackSpeedMultiplier, "RECARGA DE ATAQUE DOS INIMIGOS", "Valores maiores reduzem os intervalos entre ações ofensivas dos inimigos comuns. Em 2,0x, os tempos de espera caem pela metade; Bosses não são alterados.", (_images != null) ? _images.GetSectionIcon(MenuSection.Enemies) : null, (_images != null) ? _images.Timing : null); rowY += 158f; DrawSettingRow(new Rect(0f, rowY, width, 146f), ModSettingKind.EnemyAggressionMultiplier, "AGRESSIVIDADE DOS INIMIGOS", "Multiplica as distâncias de detecção, alerta e perseguição usadas pela IA dos inimigos comuns. Valores maiores fazem o inimigo perceber a Hornet de mais longe.", (_images != null) ? _images.GetSectionIcon(MenuSection.Enemies) : null, (_images != null) ? _images.WorldSense : null); rowY += 158f; DrawEnemiesCategoryResetRow(new Rect(0f, rowY, width, 146f)); rowY += 158f; break; case MenuSection.Bosses: DrawSettingRow(new Rect(0f, rowY, width, 146f), ModSettingKind.BossHealthMultiplier, "VIDA DOS BOSSES", "Multiplica a vida máxima de cada Boss identificado quando ele aparece. A vida atual mantém a mesma porcentagem quando o valor é alterado.", (_images != null) ? _images.GetSectionIcon(MenuSection.Bosses) : null, (_images != null) ? _images.Health : null); rowY += 158f; DrawSettingRow(new Rect(0f, rowY, width, 146f), ModSettingKind.BossDamageTakenMultiplier, "DANO RECEBIDO DE BOSS", "Multiplica somente o dano que a Hornet recebe de ataques e projéteis identificados como pertencentes a um Boss.", (_images != null) ? _images.GetSectionIcon(MenuSection.Bosses) : null, (_images != null) ? _images.EnemyDamage : null); rowY += 158f; DrawSettingRow(new Rect(0f, rowY, width, 146f), ModSettingKind.BossSpeedMultiplier, "VELOCIDADE DOS BOSSES", "Multiplica de 0,1x a 1,1x a velocidade física dos Bosses, sem alterar a velocidade da Hornet.", (_images != null) ? _images.GetSectionIcon(MenuSection.Bosses) : null, (_images != null) ? _images.Sprint : null); rowY += 158f; DrawSettingRow(new Rect(0f, rowY, width, 146f), ModSettingKind.BossAttackSpeedMultiplier, "RECARGA DE ATAQUE DOS BOSSES", "Valores maiores reduzem os intervalos da IA durante o combate. Em 2,0x, os tempos entre ações ofensivas caem pela metade.", (_images != null) ? _images.GetSectionIcon(MenuSection.Bosses) : null, (_images != null) ? _images.Timing : null); rowY += 158f; DrawSettingRow(new Rect(0f, rowY, width, 146f), ModSettingKind.BossBrutalMode, "MODO BOSS BRUTAL", "Cada ataque de Boss tem 10% de chance de causar 1 máscara adicional. Durante Boss, toda cura concluída recupera 1 máscara a menos. O dano da Hornet não muda.", (_images != null) ? _images.GetSectionIcon(MenuSection.Bosses) : null, (_images != null) ? _images.BossBrutal : null); rowY += 158f; DrawSettingRow(new Rect(0f, rowY, width, 146f), ModSettingKind.DisableHealingDuringBoss, "SEM CURA EM BOSS", "Quando ligado, o Bind ainda pode consumir Seda, mas não recupera nenhuma máscara enquanto uma luta de Boss estiver ativa.", (_images != null) ? _images.GetSectionIcon(MenuSection.Bosses) : null, (_images != null) ? _images.NoHealingBoss : null); rowY += 158f; DrawSettingRow(new Rect(0f, rowY, width, 146f), ModSettingKind.HealingDuringBossMultiplier, "CURA DURANTE BOSS", "Multiplica somente durante Boss a Quantidade de Cura configurada na aba Hornet. Exemplo: cura 3 com 0,5x restaura 2; com 2,0x restaura 6. Sem Cura em Boss sempre resulta em 0, e o Modo Boss Brutal retira 1 após o cálculo.", (_images != null) ? _images.Healing : null, (_images != null) ? _images.GetSectionIcon(MenuSection.Bosses) : null); rowY += 158f; DrawBossesCategoryResetRow(new Rect(0f, rowY, width, 146f)); rowY += 158f; break; case MenuSection.Drops: DrawSettingRow(new Rect(0f, rowY, width, 146f), ModSettingKind.CoinMultiplier, "ROSÁRIOS RECEBIDOS POR MOEDAS", "Multiplica somente os Rosários concedidos ao coletar moedas no cenário. O resultado é arredondado para o inteiro mais próximo e nunca fica abaixo de 1 quando a coleta original é positiva.", (_images != null) ? _images.Coin : null); rowY += 158f; DrawSettingRow(new Rect(0f, rowY, width, 146f), ModSettingKind.ShardMultiplier, "ROSÁRIOS RECEBIDOS POR FRAGMENTOS", "Multiplica somente a recompensa adicionada ao coletar fragmentos. O resultado é arredondado para o inteiro mais próximo e não altera gastos, preços ou outras fontes de moeda.", (_images != null) ? _images.Shard : null); rowY += 158f; DrawDropsCategoryResetRow(new Rect(0f, rowY, width, 146f)); rowY += 158f; break; case MenuSection.Economy: DrawSettingRow(new Rect(0f, rowY, width, 146f), ModSettingKind.ShopPriceMultiplier, "PREÇOS DAS LOJAS", "Multiplica o preço em Rosários dos itens vendidos nas lojas compatíveis. O resultado é arredondado para o inteiro mais próximo e todo item com preço positivo continua custando pelo menos 1.", (_images != null) ? _images.Shop : null); rowY += 158f; DrawSettingRow(new Rect(0f, rowY, width, 146f), ModSettingKind.StationPriceMultiplier, "PREÇOS DOS BANCOS E ESTAÇÕES", "Multiplica o valor em Rosários mostrado e cobrado nas confirmações de bancos e estações Bellway. Não altera preços de lojas comuns nem custos pagos com outros tipos de recurso.", (_images != null) ? _images.Bench : null, (_images != null) ? _images.Station : null); rowY += 158f; DrawSettingRow(new Rect(0f, rowY, width, 146f), ModSettingKind.DeathRosaryLossPercentage, "PERDA DE ROSÁRIOS NA MORTE", "Define a porcentagem da perda normal de Rosários ao morrer. 100% mantém a regra original e 0% não perde nada. Acima de 100%, o saldo pode ficar negativo, mas o casulo devolve no máximo o saldo positivo existente antes da morte.", (_images != null) ? _images.Coin : null); rowY += 158f; DrawEconomyCategoryResetRow(new Rect(0f, rowY, width, 146f)); rowY += 158f; break; case MenuSection.Movement: DrawSettingRow(new Rect(0f, rowY, width, 146f), ModSettingKind.HornetSpeedMultiplier, "VELOCIDADE DA HORNET", "Multiplica a velocidade normal de caminhada e corrida da Hornet. Não altera a velocidade própria do dash nem de ataques.", (_images != null) ? _images.Sprint : null); rowY += 158f; DrawSettingRow(new Rect(0f, rowY, width, 146f), ModSettingKind.DashRechargeLevel, "RECARGA DO DASH", "Nível 1 mantém a recarga normal. No nível 2 a recarga leva 0,1 segundo; cada nível seguinte dobra esse tempo, até o nível 20.", (_images != null) ? _images.DashRecharge : null); rowY += 158f; DrawMovementCategoryResetRow(new Rect(0f, rowY, width, 146f)); rowY += 158f; break; case MenuSection.Mutators: { for (int num = 0; num < MutatorCatalog.All.Length; num++) { DrawMutatorRow(new Rect(0f, rowY, width, 146f), MutatorCatalog.All[num], num); rowY += 158f; } DrawMutatorsCategoryResetRow(new Rect(0f, rowY, width, 146f)); rowY += 158f; break; } case MenuSection.Presets: DrawPresetRows(width, ref rowY); break; case MenuSection.System: DrawLanguageRow(new Rect(0f, rowY, width, 146f)); rowY += 158f; DrawLanguagePreviewRow(new Rect(0f, rowY, width, 146f)); rowY += 158f; DrawCommandRow(new Rect(0f, rowY, width, 146f), L("system_apply_title", "APLICAR"), L("system_apply_desc", "Confirma todos os valores digitados e transforma o estado atual no novo ponto para Descartar alterações."), L("system_apply_value", "Tempo real"), L("apply", "APLICAR"), delegate { CommitAllFields(); _openSettingsSnapshot = _settingsStore.ExportJson(); SetOperationMessage("Alterações aplicadas."); }); rowY += 158f; DrawCommandRow(new Rect(0f, rowY, width, 146f), L("system_reset_title", "RESETAR TUDO"), L("system_reset_desc", "Restaura todas as categorias aos padrões do perfil atual. Os favoritos são preservados."), L("system_reset_value", "Todos os ajustes"), L("reset", "RESETAR"), delegate { CommitAllFields(); _showRestoreConfirmation = true; }); rowY += 158f; DrawCommandRow(new Rect(0f, rowY, width, 146f), L("system_discard_title", "DESCARTAR ALTERAÇÕES"), L("system_discard_desc", "Retorna exatamente ao estado existente quando o menu foi aberto ou quando Aplicar foi usado pela última vez."), L("system_discard_value", "Snapshot do menu"), L("system_discard_action", "DESCARTAR"), delegate { if (!string.IsNullOrEmpty(_openSettingsSnapshot) && _settingsStore.ImportJson(_openSettingsSnapshot)) { SyncTextFromSettings(); SetOperationMessage("Alterações descartadas."); } }); rowY += 158f; DrawCommandRow(new Rect(0f, rowY, width, 146f), L("system_close_title", "FECHAR MENU"), L("system_close_desc", "Aplica os campos em edição, fecha a interface e devolve o controle da Hornet."), "F8 / Esc", L("back", "FECHAR"), delegate { Close(); }); rowY += 158f; break; } } private void DrawPresetRows(float width, ref float rowY) { //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_00fc: Unknown result type (might be due to invalid IL or missing references) //IL_015a: Unknown result type (might be due to invalid IL or missing references) //IL_0329: Unknown result type (might be due to invalid IL or missing references) //IL_03a1: Unknown result type (might be due to invalid IL or missing references) int num = ((_presetManager != null) ? _presetManager.Count : 0); int num2 = ((_presetManager != null) ? _presetManager.LoadedCount : 0); string arg = ((_presetManager != null) ? _presetManager.ActivePresetName : L("unavailable", "Indisponível")); DrawCycleRow(new Rect(0f, rowY, width, 146f), L("preset_load_file_title", "CARREGAR ARQUIVO"), string.Format(L("preset_load_file_desc", "{0} arquivo(s) encontrado(s) na pasta Presets. Carregar adiciona o arquivo à lista Seus Presets sem ativá-lo."), num), (_presetManager != null) ? _presetManager.SelectedName : L("unavailable", "Indisponível"), delegate(int direction) { if (_presetManager != null) { _presetManager.Cycle(direction); } }, L("preset_load_button", "CARREGAR"), delegate { if (_presetManager != null && _presetManager.LoadSelectedFileToList()) { SetOperationMessage("Preset carregado para a lista."); } else { SetOperationMessage("Não foi possível carregar esse arquivo."); } }); rowY += 158f; DrawPresetNamedActionRow(new Rect(0f, rowY, width, 146f), L("preset_save_file_title", "SALVAR ARQUIVO"), L("preset_save_file_desc", "Salva em um novo JSON todas as configurações atuais de todas as abas e adiciona o preset à lista Seus Presets."), L("action_save_short", "SALVAR"), delegate { if (_presetManager != null) { CommitAllFields(); _presetNameText = _presetManager.Create(_presetNameText); SetOperationMessage("Preset salvo e adicionado à lista."); } }); rowY += 158f; DrawCommandRow(new Rect(0f, rowY, width, 146f), L("preset_refresh_title", "ATUALIZAR PASTA PRESETS"), string.Format(L("preset_refresh_desc", "Lê novamente os arquivos JSON da pasta do mod. Preset ativo: {0}."), arg), string.Format(L("preset_loaded_count", "{0} carregado(s)"), num2), L("reload_presets", "ATUALIZAR"), delegate { if (_presetManager != null) { _presetManager.Refresh(); SetOperationMessage("Pasta Presets atualizada."); } }); rowY += 158f; DrawBuiltInPresetToggle(width, ref rowY, "very_easy", L("preset_very_easy", "MUITO FÁCIL"), L("desc_preset_very_easy", "Grande vantagem para a Hornet, inimigos frágeis, economia generosa e nenhuma perda de Rosários.")); DrawBuiltInPresetToggle(width, ref rowY, "easy", L("preset_easy", "FÁCIL"), L("desc_preset_easy", "Mais vida e cura, inimigos mais frágeis, preços menores e perda de Rosários reduzida.")); DrawBuiltInPresetToggle(width, ref rowY, "normal", L("preset_normal", "NORMAL"), L("desc_preset_normal", "Usa os valores normais detectados no perfil atual.")); DrawBuiltInPresetToggle(width, ref rowY, "hard", L("preset_hard", "DIFÍCIL"), L("desc_preset_hard", "Menos vida e cura; inimigos e Bosses mais resistentes, rápidos e agressivos.")); DrawBuiltInPresetToggle(width, ref rowY, "very_hard", L("preset_very_hard", "MUITO DIFÍCIL"), L("desc_preset_very_hard", "Dano recebido maior, cura limitada, economia restrita e oponentes muito fortalecidos.")); DrawBuiltInPresetToggle(width, ref rowY, "nightmare", L("preset_nightmare", "NIGHTMARE"), L("desc_preset_nightmare", "Perfil extremo com pouca vida, economia severa e Bosses brutalmente fortalecidos.")); DrawBuiltInPresetToggle(width, ref rowY, "farm", L("preset_farm", "FARM"), L("desc_preset_farm", "Aumenta Rosários, Fragmentos, dano, cura e velocidade para coleta.")); if (_presetManager == null || _presetManager.LoadedCount == 0) { DrawPresetToggleRow(new Rect(0f, rowY, width, 146f), L("your_presets", "SEUS PRESETS"), L("your_presets_empty", "Nenhum arquivo foi carregado para esta lista. Use Carregar Arquivo acima."), active: false, null, canRemove: false, null); rowY += 158f; return; } for (int num3 = 0; num3 < _presetManager.LoadedCount; num3++) { int presetIndex = num3; if (IsPresetRowVisible(rowY)) { DrawPresetToggleRow(new Rect(0f, rowY, width, 146f), L("your_preset_prefix", "SEU PRESET") + " — " + _presetManager.GetLoadedName(presetIndex).ToUpperInvariant(), L("your_preset_desc", "Liga todas as configurações deste arquivo. Excluir remove somente da aba; o JSON permanece na pasta Presets."), _presetManager.IsLoadedActive(presetIndex), delegate { if (_presetManager.ToggleLoaded(presetIndex)) { SyncTextFromSettings(); SetOperationMessage(_presetManager.IsLoadedActive(presetIndex) ? "Preset ativado." : "Preset desativado."); } }, canRemove: true, delegate { if (_presetManager.RemoveLoadedFromTab(presetIndex)) { SyncTextFromSettings(); SetOperationMessage("Preset excluído da aba. O arquivo foi mantido."); } }); } rowY += 158f; } } private void DrawPresetRowsLegacy(float width, ref float rowY) { //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_014d: Unknown result type (might be due to invalid IL or missing references) string text = ((_presetManager != null) ? (_presetManager.Count + " preset(s) salvo(s) em disco.") : "Gerenciador de presets indisponível."); if (!string.IsNullOrEmpty(_operationMessage)) { text = text + " " + _operationMessage; } DrawCycleRow(new Rect(0f, rowY, width, 146f), "PRESET SALVO", text, (_presetManager != null) ? _presetManager.SelectedName : "Indisponível", delegate(int direction) { if (_presetManager != null) { _presetManager.Cycle(direction); } }, null, null); rowY += 158f; DrawPresetNamedActionRow(new Rect(0f, rowY, width, 146f), "CRIAR PRESET", "Salva a configuração atual em um novo arquivo usando o nome digitado.", "CRIAR", delegate { if (_presetManager != null) { _presetNameText = _presetManager.Create(_presetNameText); SetOperationMessage("Preset criado."); } }); rowY += 158f; DrawPresetCommand(width, ref rowY, "SALVAR ATUAL", "Substitui o conteúdo do preset selecionado pela configuração atual.", "SALVAR", delegate { if (_presetManager != null && _presetManager.SaveSelected()) { SetOperationMessage("Preset salvo."); } }); DrawPresetCommand(width, ref rowY, "CARREGAR SELECIONADO", "Aplica imediatamente todos os valores do preset selecionado.", "CARREGAR", delegate { if (_presetManager != null && _presetManager.LoadSelected()) { SyncTextFromSettings(); SetOperationMessage("Preset carregado."); } }); DrawPresetCommand(width, ref rowY, "DUPLICAR SELECIONADO", "Cria uma cópia independente do preset selecionado.", "DUPLICAR", delegate { if (_presetManager != null) { _presetNameText = _presetManager.DuplicateSelected(); SetOperationMessage("Preset duplicado."); } }); DrawPresetNamedActionRow(new Rect(0f, rowY, width, 146f), "RENOMEAR SELECIONADO", "Renomeia o arquivo selecionado usando o nome digitado.", "RENOMEAR", delegate { if (_presetManager != null) { _presetNameText = _presetManager.RenameSelected(_presetNameText); SetOperationMessage("Preset renomeado."); } }); rowY += 158f; DrawPresetCommand(width, ref rowY, "APAGAR SELECIONADO", "Apaga somente o arquivo do preset selecionado. A configuração ativa não muda.", "APAGAR", delegate { if (_presetManager != null && _presetManager.DeleteSelected()) { SetOperationMessage("Preset apagado."); } }); DrawPresetCommand(width, ref rowY, "RESETAR ARQUIVO", "Substitui o preset selecionado pelos valores do perfil Normal.", "RESETAR", delegate { if (_presetManager != null && _presetManager.ResetSelected()) { SetOperationMessage("Arquivo restaurado."); } }); DrawPresetCommand(width, ref rowY, "EXPORTAR ATUAL", (_presetManager != null) ? ("Cria um JSON datado em " + _presetManager.ExportDirectory) : "Gerenciador indisponível.", "EXPORTAR", delegate { if (_presetManager != null) { _presetManager.ExportCurrent(); SetOperationMessage("Configuração exportada."); } }); DrawPresetCommand(width, ref rowY, "IMPORTAR MAIS RECENTE", (_presetManager != null) ? ("Importa o JSON mais recente de " + _presetManager.ImportDirectory + " ou da pasta de exportação.") : "Gerenciador indisponível.", "IMPORTAR", delegate { if (_presetManager != null && _presetManager.ImportLatest()) { SyncTextFromSettings(); SetOperationMessage("Preset importado."); } else { SetOperationMessage("Nenhum JSON válido para importar."); } }); DrawPresetCommand(width, ref rowY, "RECARREGAR LISTA", "Lê novamente os arquivos da pasta de presets.", "RECARREGAR", delegate { if (_presetManager != null) { _presetManager.Refresh(); SetOperationMessage("Lista recarregada."); } }); DrawBuiltInPreset(width, ref rowY, "EASY", "Mais vida e cura, inimigos mais frágeis, preços menores e perda de Rosários reduzida."); DrawBuiltInPreset(width, ref rowY, "NORMAL", "Restaura os ajustes normais detectados no perfil atual."); DrawBuiltInPreset(width, ref rowY, "HARD", "Menos vida e cura; inimigos e Bosses mais resistentes, rápidos e agressivos."); DrawBuiltInPreset(width, ref rowY, "NIGHTMARE", "Perfil extremo com pouca vida, economia restrita e Bosses muito fortalecidos."); DrawBuiltInPreset(width, ref rowY, "ONE HIT", "Ativa um golpe fatal, uma máscara máxima e bloqueia a cura."); DrawBuiltInPreset(width, ref rowY, "FARM", "Aumenta Rosários, Fragmentos, dano, cura e velocidade para coleta."); DrawBuiltInPreset(width, ref rowY, "CUSTOM", "Mantém a configuração atual sem alterar valores."); } private void DrawBuiltInPresetToggle(float width, ref float rowY, string key, string displayName, string description) { //IL_0047: Unknown result type (might be due to invalid IL or missing references) bool active = _presetManager != null && _presetManager.IsBuiltInActive(key); DrawPresetToggleRow(new Rect(0f, rowY, width, 146f), L("preset_mod_prefix", "PRESET DO MOD") + " — " + displayName, description, active, delegate { if (_presetManager != null && _presetManager.ToggleBuiltIn(key)) { SyncTextFromSettings(); SetOperationMessage(_presetManager.IsBuiltInActive(key) ? ("Preset " + displayName + " ativado.") : ("Preset " + displayName + " desativado.")); } }, canRemove: false, null); rowY += 158f; } private void DrawPresetToggleRow(Rect rowRect, string title, string description, bool active, Action toggleAction, bool canRemove, Action removeAction) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0105: 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) DrawActionRowBackground(rowRect, title?.GetHashCode() ?? 0); float num = 350f; float num2 = ((Rect)(ref rowRect)).xMax - num - 16f; DrawActionRowText(rowRect, num2, title, description); float num3 = ((Rect)(ref rowRect)).y + 34f; float num4 = (canRemove ? 164f : num); if (toggleAction != null) { Color color = GUI.color; if (active) { GUI.color = new Color(0.72f, 1f, 0.76f, 1f); } if (GUI.Button(new Rect(num2, num3, num4, 44f), active ? L("enabled", "LIGADO") : L("disabled", "DESLIGADO"), _buttonStyle)) { ExecuteMenuAction(toggleAction); } GUI.color = color; } else { DrawDisabledControl(new Rect(num2, num3, num4, 44f), L("empty", "VAZIO")); } if (canRemove && GUI.Button(new Rect(num2 + 174f, num3, 176f, 44f), L("remove_from_tab", "EXCLUIR DA ABA"), _buttonStyle)) { ExecuteMenuAction(removeAction); } } private bool IsPresetRowVisible(float rowY) { if (rowY + 146f >= _optionScroll.y - 158f) { return rowY <= _optionScroll.y + 920f; } return false; } private void DrawPresetCommand(float width, ref float rowY, string title, string description, string button, Action action) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) DrawCommandRow(new Rect(0f, rowY, width, 146f), title, description, (_presetManager != null) ? _presetManager.SelectedName : "Indisponível", button, action); rowY += 158f; } private void DrawBuiltInPreset(float width, ref float rowY, string name, string description) { //IL_0022: Unknown result type (might be due to invalid IL or missing references) DrawCommandRow(new Rect(0f, rowY, width, 146f), "PRESET " + name, description, "Interno", "APLICAR", delegate { if (_presetManager != null && _presetManager.ApplyBuiltIn(name)) { SyncTextFromSettings(); SetOperationMessage("Preset " + name + " aplicado."); } }); rowY += 158f; } private void DrawCommandRow(Rect rowRect, string title, string description, string value, string buttonLabel, Action action) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00e4: Unknown result type (might be due to invalid IL or missing references) DrawActionRowBackground(rowRect, title?.GetHashCode() ?? 0); float num = 330f; float num2 = ((Rect)(ref rowRect)).xMax - num - 16f; DrawActionRowText(rowRect, num2, title, description); DrawFramedBox(new Rect(num2, ((Rect)(ref rowRect)).y + 23f, 190f, 62f), new Color(0.018f, 0.024f, 0.024f, 0.96f), new Color(0.24f, 0.23f, 0.18f, 0.9f)); GUI.Label(new Rect(num2 + 8f, ((Rect)(ref rowRect)).y + 23f, 174f, 62f), T(value ?? string.Empty), _metaValueStyle); if (GUI.Button(new Rect(num2 + 198f, ((Rect)(ref rowRect)).y + 34f, 132f, 42f), T(buttonLabel), _buttonStyle)) { ExecuteMenuAction(action); } } private void DrawCycleRow(Rect rowRect, string title, string description, string value, Action adjust, string actionLabel, Action action) { //IL_0017: 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_0078: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_010a: Unknown result type (might be due to invalid IL or missing references) //IL_013d: Unknown result type (might be due to invalid IL or missing references) //IL_0184: Unknown result type (might be due to invalid IL or missing references) DrawActionRowBackground(rowRect, title?.GetHashCode() ?? 0); bool flag = !string.IsNullOrEmpty(actionLabel); float num = (flag ? 390f : 300f); float num2 = ((Rect)(ref rowRect)).xMax - num - 16f; DrawActionRowText(rowRect, num2, title, description); float num3 = ((Rect)(ref rowRect)).y + 34f; if (GUI.Button(new Rect(num2, num3, 42f, 42f), "<", _buttonStyle)) { ExecuteMenuAction(delegate { adjust(-1); }); } DrawFramedBox(new Rect(num2 + 50f, num3, 160f, 42f), new Color(0.018f, 0.024f, 0.024f, 0.96f), new Color(0.24f, 0.23f, 0.18f, 0.9f)); GUI.Label(new Rect(num2 + 56f, num3, 148f, 42f), T(value ?? string.Empty), _metaValueStyle); if (GUI.Button(new Rect(num2 + 218f, num3, 42f, 42f), ">", _buttonStyle)) { ExecuteMenuAction(delegate { adjust(1); }); } if (flag && GUI.Button(new Rect(num2 + 268f, num3, 122f, 42f), T(actionLabel), _buttonStyle)) { ExecuteMenuAction(action); } } private void DrawPresetNamedActionRow(Rect rowRect, string title, string description, string actionLabel, Action action) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) DrawActionRowBackground(rowRect, title?.GetHashCode() ?? 0); float num = 390f; float num2 = ((Rect)(ref rowRect)).xMax - num - 16f; DrawActionRowText(rowRect, num2, title, description); GUI.SetNextControlName("CustomDifficultyPresetName"); _presetNameText = GUI.TextField(new Rect(num2, ((Rect)(ref rowRect)).y + 34f, 250f, 42f), _presetNameText ?? string.Empty, 48, _fieldStyle); if (GUI.Button(new Rect(num2 + 258f, ((Rect)(ref rowRect)).y + 34f, 132f, 42f), T(actionLabel), _buttonStyle)) { ExecuteMenuAction(action); } } private void DrawLanguageRow(Rect rowRect) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_006f: 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) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) //IL_0120: Unknown result type (might be due to invalid IL or missing references) //IL_0156: Unknown result type (might be due to invalid IL or missing references) //IL_01c6: Unknown result type (might be due to invalid IL or missing references) //IL_0208: Unknown result type (might be due to invalid IL or missing references) //IL_0249: Unknown result type (might be due to invalid IL or missing references) //IL_026c: Unknown result type (might be due to invalid IL or missing references) //IL_0271: Unknown result type (might be due to invalid IL or missing references) //IL_02c3: Unknown result type (might be due to invalid IL or missing references) //IL_02e5: Unknown result type (might be due to invalid IL or missing references) //IL_029b: Unknown result type (might be due to invalid IL or missing references) DrawActionRowBackground(rowRect, 401); float num = 470f; float num2 = ((Rect)(ref rowRect)).xMax - num - 18f; DrawActionRowText(rowRect, num2, L("system_language_title", "IDIOMA DA INTERFACE"), L("system_language_desc", "Automático acompanha o idioma atual do jogo. Se o arquivo correspondente não existir, a interface usa inglês.")); Rect rect = default(Rect); ((Rect)(ref rect))..ctor(num2 + 54f, ((Rect)(ref rowRect)).y + 28f, 288f, 106f); DrawFramedBox(rect, new Color(0.018f, 0.032f, 0.032f, 0.99f), new Color(_currentSectionAccent.r, _currentSectionAccent.g, _currentSectionAccent.b, 0.82f)); DrawSolidRect(new Rect(((Rect)(ref rect)).x, ((Rect)(ref rect)).y, 5f, ((Rect)(ref rect)).height), _currentSectionAccent); DrawSolidRect(new Rect(((Rect)(ref rect)).x + 18f, ((Rect)(ref rect)).y + 19f, 9f, 9f), new Color(0.3f, 0.96f, 0.58f, 1f)); GUI.Label(new Rect(((Rect)(ref rect)).x + 34f, ((Rect)(ref rect)).y + 7f, ((Rect)(ref rect)).width - 46f, 32f), L("system_status_active", "DEFINIDO") + " · " + ((_localization != null) ? _localization.GetSelectedDisplayName() : "Automatic"), _metaTitleStyle); GUI.Label(new Rect(((Rect)(ref rect)).x + 18f, ((Rect)(ref rect)).y + 39f, ((Rect)(ref rect)).width - 36f, 54f), (_localization != null) ? _localization.GetSelectionSummary() : "Automatic → English", _metaValueStyle); if (GUI.Button(new Rect(num2, ((Rect)(ref rowRect)).y + 58f, 44f, 48f), "‹", _buttonStyle)) { _localization.Cycle(-1); } if (GUI.Button(new Rect(num2 + 352f, ((Rect)(ref rowRect)).y + 58f, 44f, 48f), "›", _buttonStyle)) { _localization.Cycle(1); } Color color = GUI.color; if (_localization != null && _localization.IsAutomatic) { GUI.color = new Color(0.72f, 1f, 0.78f, 1f); } if (GUI.Button(new Rect(num2 + 406f, ((Rect)(ref rowRect)).y + 58f, 64f, 48f), "AUTO", _buttonStyle)) { _localization.SelectAutomatic(); } GUI.color = color; } private void DrawLanguagePreviewRow(Rect rowRect) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_007a: 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) //IL_00b7: 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_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_012c: Unknown result type (might be due to invalid IL or missing references) //IL_0182: Unknown result type (might be due to invalid IL or missing references) DrawActionRowBackground(rowRect, 402); float num = 470f; float num2 = ((Rect)(ref rowRect)).xMax - num - 18f; DrawActionRowText(rowRect, num2, L("system_preview_title", "PRÉVIA DO IDIOMA"), L("system_preview_desc", "Esta amostra confirma visualmente o idioma aplicado e verifica letras acentuadas ou caracteres especiais.")); Rect rect = default(Rect); ((Rect)(ref rect))..ctor(num2, ((Rect)(ref rowRect)).y + 22f, num, 120f); DrawFramedBox(rect, new Color(0.012f, 0.022f, 0.025f, 0.99f), new Color(0.25f, 0.38f, 0.38f, 0.92f)); DrawSolidRect(new Rect(((Rect)(ref rect)).x, ((Rect)(ref rect)).y, ((Rect)(ref rect)).width, 3f), _currentSectionAccent); GUI.Label(new Rect(((Rect)(ref rect)).x + 18f, ((Rect)(ref rect)).y + 12f, 80f, 48f), "Aa", _summaryValueStyle); GUI.Label(new Rect(((Rect)(ref rect)).x + 100f, ((Rect)(ref rect)).y + 8f, ((Rect)(ref rect)).width - 118f, 38f), (_localization != null) ? _localization.GetResolvedDisplayName() : "English", _labelStyle); GUI.Label(new Rect(((Rect)(ref rect)).x + 20f, ((Rect)(ref rect)).y + 58f, ((Rect)(ref rect)).width - 40f, 50f), L("system_preview_sample", "Interface ready · Text fits correctly · 123"), _descriptionStyle); } private void DrawActionRowBackground(Rect rowRect, int alternatingValue) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0004: Unknown result type (might be due to invalid IL or missing references) DrawModernRowSurface(rowRect, alternatingValue, _currentSectionAccent); } private void DrawActionRowText(Rect rowRect, float controlsX, string title, string description) { //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) float num = ((Rect)(ref rowRect)).x + 20f; float num2 = Math.Max(120f, controlsX - num - 16f); GUI.Label(new Rect(num, ((Rect)(ref rowRect)).y + 12f, num2, 42f), T(title ?? string.Empty).ToUpperInvariant(), _labelStyle); GUI.Label(new Rect(num, ((Rect)(ref rowRect)).y + 57f, num2, ((Rect)(ref rowRect)).height - 68f), T(description ?? string.Empty), _descriptionStyle); } private void ExecuteMenuAction(Action action) { try { action?.Invoke(); } catch (Exception ex) { SetOperationMessage("Falha: " + ex.Message); } } private void SetOperationMessage(string message) { _operationMessage = message ?? string.Empty; } private string L(string key, string fallback) { if (_localization == null) { return fallback; } return _localization.Get(key, fallback); } private string T(string source) { string text; if (_localization == null) { text = source; if (text == null) { return string.Empty; } } else { text = _localization.Translate(source); } return text; } private void DrawFavoriteRows(float width, ref float rowY) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) ModSettingKind[] favoriteSettings = _settingsStore.GetFavoriteSettings(); if (favoriteSettings.Length == 0) { DrawFavoriteEmptyRow(new Rect(0f, rowY, width, 310f)); rowY += 322f; return; } for (int i = 0; i < favoriteSettings.Length; i++) { ModSettingKind setting = favoriteSettings[i]; if (MutatorCatalog.IsMutator(setting)) { MutatorDefinition mutatorDefinition = FindMutatorDefinition(setting); if (mutatorDefinition != null) { DrawMutatorRow(new Rect(0f, rowY, width, 146f), mutatorDefinition, i); rowY += 158f; } } else { GetSettingIcons(setting, out var icon, out var secondaryIcon); DrawSettingRow(new Rect(0f, rowY, width, 146f), setting, GetFavoriteLabel(setting), L("favorite_origin", "Origem") + ": " + GetSettingOriginLabel(setting) + ". " + L("favorite_card_description", "Este atalho mantém os mesmos controles da opção original."), icon, secondaryIcon); rowY += 158f; } } } private void DrawFavoriteEmptyRow(Rect rowRect) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0053: 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_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Unknown result type (might be due to invalid IL or missing references) //IL_0137: Unknown result type (might be due to invalid IL or missing references) //IL_0177: Unknown result type (might be due to invalid IL or missing references) //IL_01a2: Unknown result type (might be due to invalid IL or missing references) //IL_01fb: Unknown result type (might be due to invalid IL or missing references) rowRect = ResolveCardRect(rowRect, fullWidth: true); DrawModernRowSurface(rowRect, 0, MenuVisualTheme.FavoritePink); Rect rect = default(Rect); ((Rect)(ref rect))..ctor(((Rect)(ref rowRect)).x + (((Rect)(ref rowRect)).width - 66f) * 0.5f, ((Rect)(ref rowRect)).y + 38f, 66f, 66f); DrawSectionIcon(rect, MenuSection.Favorites, MenuVisualTheme.FavoritePink); TextAnchor alignment = _sectionTitleStyle.alignment; TextAnchor alignment2 = _descriptionStyle.alignment; _sectionTitleStyle.alignment = (TextAnchor)4; _descriptionStyle.alignment = (TextAnchor)4; GUI.Label(new Rect(((Rect)(ref rowRect)).x + 40f, ((Rect)(ref rowRect)).y + 115f, ((Rect)(ref rowRect)).width - 80f, 34f), L("favorites_empty_title", "Nenhuma configuração favorita"), _sectionTitleStyle); GUI.Label(new Rect(((Rect)(ref rowRect)).x + 80f, ((Rect)(ref rowRect)).y + 151f, ((Rect)(ref rowRect)).width - 160f, 45f), L("favorites_empty_description", "Abra uma categoria e use a estrela de uma opção para criar seu acesso rápido."), _descriptionStyle); _sectionTitleStyle.alignment = alignment; _descriptionStyle.alignment = alignment2; Rect rect2 = default(Rect); ((Rect)(ref rect2))..ctor(((Rect)(ref rowRect)).x + (((Rect)(ref rowRect)).width - 210f) * 0.5f, ((Rect)(ref rowRect)).y + 205f, 42f, 26f); DrawKeycap(rect2, "F"); GUI.Label(new Rect(((Rect)(ref rect2)).xMax + 9f, ((Rect)(ref rect2)).y, 160f, ((Rect)(ref rect2)).height), L("favorite_shortcut_hint", "adicionar favorito"), _shortcutStyle); Rect val = default(Rect); ((Rect)(ref val))..ctor(((Rect)(ref rowRect)).x + (((Rect)(ref rowRect)).width - 190f) * 0.5f, ((Rect)(ref rowRect)).yMax - 57f, 190f, 36f); if (!GUI.Button(val, L("explore_settings", "EXPLORAR CONFIGURAÇÕES"), _buttonStyle)) { return; } for (int i = 0; i < LockedOptionCatalog.Sections.Length; i++) { if (LockedOptionCatalog.Sections[i] == MenuSection.Player) { SelectSection(i); break; } } } private static MutatorDefinition FindMutatorDefinition(ModSettingKind setting) { for (int i = 0; i < MutatorCatalog.All.Length; i++) { if (MutatorCatalog.All[i].Setting == setting) { return MutatorCatalog.All[i]; } } return null; } private void GetSettingIcons(ModSettingKind setting, out Texture2D icon, out Texture2D secondaryIcon) { icon = null; secondaryIcon = null; if (_images != null) { switch (setting) { case ModSettingKind.MaximumHealth: icon = _images.Health; break; case ModSettingKind.NeedleDamage: icon = _images.Needle; break; case ModSettingKind.NeedleUpgradePercentage: icon = _images.NeedleUpgrade; break; case ModSettingKind.SilkSpearDamageMultiplier: case ModSettingKind.SilkSpearSilkCost: icon = _images.SilkSpear; break; case ModSettingKind.ThreadStormSilkCost: case ModSettingKind.ThreadStormNormalHitMultiplier: case ModSettingKind.ThreadStormLateHitMultiplier: icon = _images.ThreadStorm; break; case ModSettingKind.CrossStitchSilkCost: case ModSettingKind.CrossStitchHitMultiplier: icon = _images.CrossStitch; break; case ModSettingKind.SharpdartSilkCost: case ModSettingKind.SharpdartMainHitMultiplier: icon = _images.SharpDart; break; case ModSettingKind.RuneRageSilkCost: case ModSettingKind.RuneRageBaseDamageMultiplier: icon = _images.RuneRage; break; case ModSettingKind.PaleNailsSilkCost: case ModSettingKind.PaleNailsProjectileMultiplier: icon = _images.PaleSpines; break; case ModSettingKind.DamageTakenMultiplier: icon = _images.EnemyDamage; break; case ModSettingKind.EnvironmentalDamageMultiplier: icon = _images.EnvironmentalDamage; break; case ModSettingKind.OneHitMode: icon = _images.OneHit; break; case ModSettingKind.HealingAmount: icon = _images.Healing; break; case ModSettingKind.HealingCost: icon = _images.SilkSpool; break; case ModSettingKind.InvincibilityTimeMultiplier: icon = _images.Invincibility; secondaryIcon = _images.Timing; break; case ModSettingKind.EnemyHealthMultiplier: icon = _images.GetSectionIcon(MenuSection.Enemies); secondaryIcon = _images.Health; break; case ModSettingKind.EnemySpeedMultiplier: icon = _images.GetSectionIcon(MenuSection.Enemies); secondaryIcon = _images.Sprint; break; case ModSettingKind.EnemyAttackSpeedMultiplier: icon = _images.GetSectionIcon(MenuSection.Enemies); secondaryIcon = _images.Timing; break; case ModSettingKind.EnemyAggressionMultiplier: icon = _images.GetSectionIcon(MenuSection.Enemies); secondaryIcon = _images.WorldSense; break; case ModSettingKind.BossHealthMultiplier: icon = _images.GetSectionIcon(MenuSection.Bosses); secondaryIcon = _images.Health; break; case ModSettingKind.BossDamageTakenMultiplier: icon = _images.GetSectionIcon(MenuSection.Bosses); secondaryIcon = _images.EnemyDamage; break; case ModSettingKind.BossSpeedMultiplier: icon = _images.GetSectionIcon(MenuSection.Bosses); secondaryIcon = _images.Sprint; break; case ModSettingKind.BossAttackSpeedMultiplier: icon = _images.GetSectionIcon(MenuSection.Bosses); secondaryIcon = _images.Timing; break; case ModSettingKind.BossBrutalMode: icon = _images.GetSectionIcon(MenuSection.Bosses); secondaryIcon = _images.BossBrutal; break; case ModSettingKind.DisableHealingDuringBoss: icon = _images.GetSectionIcon(MenuSection.Bosses); secondaryIcon = _images.NoHealingBoss; break; case ModSettingKind.HealingDuringBossMultiplier: icon = _images.Healing; secondaryIcon = _images.GetSectionIcon(MenuSection.Bosses); break; case ModSettingKind.CoinMultiplier: case ModSettingKind.DeathRosaryLossPercentage: icon = _images.Coin; break; case ModSettingKind.ShardMultiplier: icon = _images.Shard; break; case ModSettingKind.ShopPriceMultiplier: icon = _images.Shop; break; case ModSettingKind.StationPriceMultiplier: icon = _images.Bench; secondaryIcon = _images.Station; break; case ModSettingKind.HornetSpeedMultiplier: icon = _images.Sprint; break; case ModSettingKind.DashRechargeLevel: icon = _images.DashRecharge; break; } } } private void DrawSummaryRow(Rect rowRect, string label, string description, string value, string caption, Color accent, int rowIndex) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_0095: 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_00df: Unknown result type (might be due to invalid IL or missing references) //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Unknown result type (might be due to invalid IL or missing references) //IL_0161: Unknown result type (might be due to invalid IL or missing references) //IL_0184: Unknown result type (might be due to invalid IL or missing references) //IL_0189: Unknown result type (might be due to invalid IL or missing references) //IL_0196: Unknown result type (might be due to invalid IL or missing references) //IL_01d1: Unknown result type (might be due to invalid IL or missing references) //IL_01f4: Unknown result type (might be due to invalid IL or missing references) DrawModernRowSurface(rowRect, rowIndex, accent); float num = Mathf.Clamp(((Rect)(ref rowRect)).width * 0.29f, 210f, 300f); Rect rect = default(Rect); ((Rect)(ref rect))..ctor(((Rect)(ref rowRect)).xMax - num - 16f, ((Rect)(ref rowRect)).y + 16f, num, ((Rect)(ref rowRect)).height - 32f); float num2 = ((Rect)(ref rowRect)).x + 20f; float num3 = Mathf.Max(150f, ((Rect)(ref rect)).x - num2 - 18f); GUI.Label(new Rect(num2, ((Rect)(ref rowRect)).y + 10f, num3, 28f), T(label), _labelStyle); GUI.Label(new Rect(num2, ((Rect)(ref rowRect)).y + 39f, num3, ((Rect)(ref rowRect)).height - 47f), T(description), _descriptionStyle); DrawFramedBox(rect, new Color(accent.r * 0.1f, accent.g * 0.1f, accent.b * 0.1f, 0.96f), new Color(accent.r, accent.g, accent.b, 0.82f)); GUI.Label(new Rect(((Rect)(ref rect)).x + 8f, ((Rect)(ref rect)).y + 4f, ((Rect)(ref rect)).width - 16f, 20f), T(caption), _summaryCaptionStyle); Color textColor = _summaryValueStyle.normal.textColor; _summaryValueStyle.normal.textColor = accent; GUI.Label(new Rect(((Rect)(ref rect)).x + 8f, ((Rect)(ref rect)).y + 22f, ((Rect)(ref rect)).width - 16f, ((Rect)(ref rect)).height - 25f), T(value), _summaryValueStyle); _summaryValueStyle.normal.textColor = textColor; } private void DrawSummaryDashboard(float width, ref float rowY, DifficultySummarySnapshot summary) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0026: 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_0094: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_0121: Unknown result type (might be due to invalid IL or missing references) //IL_012e: Unknown result type (might be due to invalid IL or missing references) //IL_015b: Unknown result type (might be due to invalid IL or missing references) //IL_01a2: Unknown result type (might be due to invalid IL or missing references) //IL_01ba: Unknown result type (might be due to invalid IL or missing references) //IL_020c: Unknown result type (might be due to invalid IL or missing references) //IL_023d: Unknown result type (might be due to invalid IL or missing references) //IL_0264: Unknown result type (might be due to invalid IL or missing references) //IL_028a: Unknown result type (might be due to invalid IL or missing references) //IL_02ab: Unknown result type (might be due to invalid IL or missing references) //IL_02df: Unknown result type (might be due to invalid IL or missing references) //IL_0306: Unknown result type (might be due to invalid IL or missing references) //IL_033a: Unknown result type (might be due to invalid IL or missing references) //IL_0548: Unknown result type (might be due to invalid IL or missing references) //IL_056b: Unknown result type (might be due to invalid IL or missing references) //IL_0563: Unknown result type (might be due to invalid IL or missing references) ModSettings current = _settingsStore.Current; float num = 204f; Rect rect = default(Rect); ((Rect)(ref rect))..ctor(0f, rowY, width, num); DrawModernRowSurface(rect, 0, summary.AccentColor); float num2 = Mathf.Max(300f, ((Rect)(ref rect)).width * 0.48f); GUI.Label(new Rect(((Rect)(ref rect)).x + 24f, ((Rect)(ref rect)).y + 20f, num2 - 36f, 20f), L("summary_current_profile", "PERFIL ATUAL"), _eyebrowStyle); TextAnchor alignment = _summaryValueStyle.alignment; Color textColor = _summaryValueStyle.normal.textColor; _summaryValueStyle.alignment = (TextAnchor)3; _summaryValueStyle.normal.textColor = summary.AccentColor; GUI.Label(new Rect(((Rect)(ref rect)).x + 22f, ((Rect)(ref rect)).y + 40f, num2 - 32f, 42f), LocalizeSummaryTerm(summary.Classification).ToUpperInvariant(), _summaryValueStyle); _summaryValueStyle.normal.textColor = textColor; _summaryValueStyle.alignment = alignment; GUI.Label(new Rect(((Rect)(ref rect)).x + 24f, ((Rect)(ref rect)).y + 83f, num2 - 38f, 66f), L("desc_summary_rating", summary.ClassificationDescription), _descriptionStyle); DrawProgressBar(new Rect(((Rect)(ref rect)).x + 24f, ((Rect)(ref rect)).yMax - 31f, num2 - 46f, 7f), Mathf.Clamp01((float)summary.Score / 300f), summary.AccentColor); float num3 = ((Rect)(ref rect)).x + num2; float num4 = ((Rect)(ref rect)).xMax - num3 - 18f; float num5 = 8f; float num6 = (num4 - num5) * 0.5f; DrawSummaryStat(new Rect(num3, ((Rect)(ref rect)).y + 18f, num6, 78f), L("summary_score", "PONTUAÇÃO"), summary.Score.ToString(), L("summary_points", "PONTOS"), summary.AccentColor); DrawSummaryStat(new Rect(num3 + num6 + num5, ((Rect)(ref rect)).y + 18f, num6, 78f), L("summary_profile", "ESTILO"), LocalizeSummaryTerm(summary.ProfileStyle), string.Empty, MenuVisualTheme.SilkGold); DrawSummaryStat(new Rect(num3, ((Rect)(ref rect)).y + 104f, num6, 78f), L("summary_mutator_count", "MUTADORES"), MutatorCatalog.CountEnabled(current).ToString(), L("active", "ATIVOS"), MenuVisualTheme.FavoritePink); DrawSummaryStat(new Rect(num3 + num6 + num5, ((Rect)(ref rect)).y + 104f, num6, 78f), L("changes", "ALTERAÇÕES"), GetChangedSettingCount().ToString(), L("real_time", "EM TEMPO REAL"), MenuVisualTheme.SignalCyan); rowY += num + 12f; int num7 = ((width >= 900f) ? 3 : 2); float num8 = (width - 12f * (float)(num7 - 1)) / (float)num7; float num9 = 112f; string[] array = new string[6] { L("summary_metric_survival", "Sobrevivência"), L("summary_metric_damage", "Dano"), L("summary_metric_mobility", "Mobilidade"), L("summary_metric_enemies", "Inimigos"), L("summary_metric_bosses", "Bosses"), L("summary_metric_healing", "Cura") }; float[] array2 = new float[6] { Mathf.Clamp01((float)current.MaximumHealth / 20f), Mathf.Clamp01((float)current.NeedleDamage / 100f), Mathf.Clamp01(current.HornetSpeedMultiplier / 2f), Mathf.Clamp01((current.EnemyHealthMultiplier + current.EnemySpeedMultiplier + current.EnemyAggressionMultiplier) / 7.1f), Mathf.Clamp01((current.BossHealthMultiplier + current.BossSpeedMultiplier + current.BossAttackSpeedMultiplier) / 23.1f), Mathf.Clamp01((float)current.HealingAmount / 20f) }; string[] array3 = new string[6] { current.MaximumHealth + " / 20", current.NeedleDamage.ToString(), ValueValidator.FormatHornetSpeedMultiplier(current.HornetSpeedMultiplier), ValueValidator.FormatMultiplier(current.EnemyHealthMultiplier), ValueValidator.FormatMultiplier(current.BossHealthMultiplier), current.HealingAmount.ToString() }; for (int i = 0; i < array.Length; i++) { int num10 = i % num7; int num11 = i / num7; DrawSummaryMetric(new Rect((float)num10 * (num8 + 12f), rowY + (float)num11 * (num9 + 12f), num8, num9), array[i], array3[i], array2[i], (i % 2 == 0) ? summary.AccentColor : _currentSectionAccent); } rowY += (float)Mathf.CeilToInt((float)array.Length / (float)num7) * (num9 + 12f); } private void DrawSummaryStat(Rect rect, string label, string value, string caption, Color accent) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_007e: 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_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) //IL_0142: Unknown result type (might be due to invalid IL or missing references) DrawSolidRect(rect, MenuVisualTheme.SurfaceRaised); DrawSolidRect(new Rect(((Rect)(ref rect)).x, ((Rect)(ref rect)).y, 2f, ((Rect)(ref rect)).height), MenuVisualTheme.WithAlpha(accent, 0.82f)); GUI.Label(new Rect(((Rect)(ref rect)).x + 12f, ((Rect)(ref rect)).y + 6f, ((Rect)(ref rect)).width - 24f, 18f), label, _eyebrowStyle); TextAnchor alignment = _summaryValueStyle.alignment; Color textColor = _summaryValueStyle.normal.textColor; _summaryValueStyle.alignment = (TextAnchor)3; _summaryValueStyle.normal.textColor = accent; GUI.Label(new Rect(((Rect)(ref rect)).x + 12f, ((Rect)(ref rect)).y + 22f, ((Rect)(ref rect)).width - 24f, 34f), value, _summaryValueStyle); _summaryValueStyle.alignment = alignment; _summaryValueStyle.normal.textColor = textColor; if (!string.IsNullOrEmpty(caption)) { GUI.Label(new Rect(((Rect)(ref rect)).x + 12f, ((Rect)(ref rect)).yMax - 23f, ((Rect)(ref rect)).width - 24f, 17f), caption, _summaryCaptionStyle); } } private void DrawSummaryMetric(Rect rect, string label, string value, float normalized, Color accent) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005c: 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_0068: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_010d: Unknown result type (might be due to invalid IL or missing references) //IL_0114: Unknown result type (might be due to invalid IL or missing references) DrawModernRowSurface(rect, label.GetHashCode(), accent); GUI.Label(new Rect(((Rect)(ref rect)).x + 16f, ((Rect)(ref rect)).y + 13f, ((Rect)(ref rect)).width - 32f, 24f), label, _labelStyle); Color textColor = _metaValueStyle.normal.textColor; TextAnchor alignment = _metaValueStyle.alignment; _metaValueStyle.normal.textColor = accent; _metaValueStyle.alignment = (TextAnchor)5; GUI.Label(new Rect(((Rect)(ref rect)).x + 16f, ((Rect)(ref rect)).y + 13f, ((Rect)(ref rect)).width - 32f, 24f), value, _metaValueStyle); _metaValueStyle.normal.textColor = textColor; _metaValueStyle.alignment = alignment; DrawProgressBar(new Rect(((Rect)(ref rect)).x + 16f, ((Rect)(ref rect)).yMax - 30f, ((Rect)(ref rect)).width - 32f, 8f), normalized, accent); } private static void DrawProgressBar(Rect rect, float normalized, Color accent) { //IL_0000: 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_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) DrawSolidRect(rect, new Color(0.1f, 0.13f, 0.13f, 0.95f)); DrawSolidRect(new Rect(((Rect)(ref rect)).x, ((Rect)(ref rect)).y, ((Rect)(ref rect)).width * Mathf.Clamp01(normalized), ((Rect)(ref rect)).height), MenuVisualTheme.WithAlpha(accent, 0.92f)); } private DifficultySummarySnapshot BuildDifficultySummary() { //IL_0867: Unknown result type (might be due to invalid IL or missing references) //IL_086c: Unknown result type (might be due to invalid IL or missing references) ModSettings current = _settingsStore.Current; float num = 100f; int num2 = ((current.DefaultMaximumHealth > 0) ? ValueValidator.ClampHealth(current.DefaultMaximumHealth) : 5); int num3 = ((current.DefaultNeedleDamage > 0) ? ValueValidator.ClampNeedleDamage(current.DefaultNeedleDamage) : 5); if (_settingsStore.IsEnabled(ModSettingKind.MaximumHealth)) { int num4 = current.MaximumHealth - num2; num += ((num4 < 0) ? Mathf.Min((float)(-num4) * 10f, 50f) : (0f - Mathf.Min((float)num4 * 2.5f, 30f))); } if (_settingsStore.IsEnabled(ModSettingKind.NeedleDamage)) { int num5 = current.NeedleDamage - num3; num += ((num5 < 0) ? Mathf.Min((float)(-num5) * 4f, 20f) : (0f - Mathf.Min((float)num5 * 1.2f, 30f))); } if (_settingsStore.IsEnabled(ModSettingKind.NeedleUpgradePercentage)) { num -= Mathf.Min((float)current.NeedleUpgradePercentage * 0.2f, 20f); } if (_settingsStore.IsEnabled(ModSettingKind.SilkSpearDamageMultiplier)) { int num6 = current.SilkSpearDamageMultiplier - 3; num += ((num6 < 0) ? Mathf.Min((float)(-num6) * 6f, 12f) : (0f - Mathf.Min((float)num6 * 1.5f, 25f))); } if (_settingsStore.IsEnabled(ModSettingKind.SilkSpearSilkCost)) { int num7 = current.SilkSpearSilkCost - 4; num += ((num7 > 0) ? Mathf.Min((float)num7 * 2f, 32f) : (0f - Mathf.Min((float)(-num7) * 4f, 12f))); } if (_settingsStore.IsEnabled(ModSettingKind.DamageTakenMultiplier)) { num += Mathf.Min(Mathf.Max(0f, current.DamageTakenMultiplier - 1f) * 5f, 50f); } if (_settingsStore.IsEnabled(ModSettingKind.EnvironmentalDamageMultiplier)) { num += Mathf.Min(Mathf.Max(0f, current.EnvironmentalDamageMultiplier - 1f) * 4f, 40f); } if (_settingsStore.IsEnabled(ModSettingKind.OneHitMode) && current.OneHitMode) { num += 100f; } if (_settingsStore.IsEnabled(ModSettingKind.HealingAmount)) { int num8 = current.HealingAmount - 3; num += ((num8 < 0) ? Mathf.Min((float)(-num8) * 8f, 16f) : (0f - Mathf.Min((float)num8 * 2f, 30f))); } if (_settingsStore.IsEnabled(ModSettingKind.HealingCost)) { int num9 = current.HealingCost - 9; num += ((num9 > 0) ? Mathf.Min((float)num9 * 2f, 22f) : (0f - Mathf.Min((float)(-num9) * 2f, 16f))); } if (_settingsStore.IsEnabled(ModSettingKind.InvincibilityTimeMultiplier)) { float invincibilityTimeMultiplier = current.InvincibilityTimeMultiplier; num += ((invincibilityTimeMultiplier < 1f) ? Mathf.Min((1f - invincibilityTimeMultiplier) * 30f, 27f) : (0f - Mathf.Min((invincibilityTimeMultiplier - 1f) * 2f, 30f))); } if (_settingsStore.IsEnabled(ModSettingKind.EnemyHealthMultiplier)) { float enemyHealthMultiplier = current.EnemyHealthMultiplier; num += ((enemyHealthMultiplier > 1f) ? Mathf.Min((enemyHealthMultiplier - 1f) * 7f, 70f) : (0f - Mathf.Min((1f - enemyHealthMultiplier) * 20f, 18f))); } if (_settingsStore.IsEnabled(ModSettingKind.EnemySpeedMultiplier)) { float enemySpeedMultiplier = current.EnemySpeedMultiplier; num += ((enemySpeedMultiplier > 1f) ? Mathf.Min((enemySpeedMultiplier - 1f) * 9f, 80f) : (0f - Mathf.Min((1f - enemySpeedMultiplier) * 22f, 19.8f))); } if (_settingsStore.IsEnabled(ModSettingKind.EnemyAttackSpeedMultiplier)) { float enemyAttackSpeedMultiplier = current.EnemyAttackSpeedMultiplier; num += ((enemyAttackSpeedMultiplier > 1f) ? Mathf.Min((enemyAttackSpeedMultiplier - 1f) * 7f, 70f) : (0f - Mathf.Min((1f - enemyAttackSpeedMultiplier) * 14f, 12.6f))); } if (_settingsStore.IsEnabled(ModSettingKind.EnemyAggressionMultiplier)) { float enemyAggressionMultiplier = current.EnemyAggressionMultiplier; num += ((enemyAggressionMultiplier > 1f) ? Mathf.Min((enemyAggressionMultiplier - 1f) * 3f, 30f) : (0f - Mathf.Min((1f - enemyAggressionMultiplier) * 8f, 7.2f))); } if (_settingsStore.IsEnabled(ModSettingKind.BossHealthMultiplier)) { float bossHealthMultiplier = current.BossHealthMultiplier; num += ((bossHealthMultiplier > 1f) ? Mathf.Min((bossHealthMultiplier - 1f) * 7f, 70f) : (0f - Mathf.Min((1f - bossHealthMultiplier) * 20f, 18f))); } if (_settingsStore.IsEnabled(ModSettingKind.BossDamageTakenMultiplier)) { float bossDamageTakenMultiplier = current.BossDamageTakenMultiplier; num += ((bossDamageTakenMultiplier > 1f) ? Mathf.Min((bossDamageTakenMultiplier - 1f) * 8f, 80f) : (0f - Mathf.Min((1f - bossDamageTakenMultiplier) * 20f, 18f))); } if (_settingsStore.IsEnabled(ModSettingKind.BossSpeedMultiplier)) { float bossSpeedMultiplier = current.BossSpeedMultiplier; num += ((bossSpeedMultiplier > 1f) ? Mathf.Min((bossSpeedMultiplier - 1f) * 12f, 12f) : (0f - Mathf.Min((1f - bossSpeedMultiplier) * 12f, 10.8f))); } if (_settingsStore.IsEnabled(ModSettingKind.BossAttackSpeedMultiplier)) { float bossAttackSpeedMultiplier = current.BossAttackSpeedMultiplier; num += ((bossAttackSpeedMultiplier > 1f) ? Mathf.Min((bossAttackSpeedMultiplier - 1f) * 8f, 80f) : (0f - Mathf.Min((1f - bossAttackSpeedMultiplier) * 16f, 14.4f))); } if (_settingsStore.IsEnabled(ModSettingKind.BossBrutalMode) && current.BossBrutalMode) { num += 20f; } if (_settingsStore.IsEnabled(ModSettingKind.DisableHealingDuringBoss) && current.DisableHealingDuringBoss) { num += 30f; } if (_settingsStore.IsEnabled(ModSettingKind.HealingDuringBossMultiplier)) { float healingDuringBossMultiplier = current.HealingDuringBossMultiplier; num += ((healingDuringBossMultiplier < 1f) ? Mathf.Min((1f - healingDuringBossMultiplier) * 20f, 18f) : (0f - Mathf.Min((healingDuringBossMultiplier - 1f) * 3f, 30f))); } num += GetRewardDifficultyChange(ModSettingKind.CoinMultiplier, current.CoinMultiplier); num += GetRewardDifficultyChange(ModSettingKind.ShardMultiplier, current.ShardMultiplier); num += GetPriceDifficultyChange(ModSettingKind.ShopPriceMultiplier, current.ShopPriceMultiplier); num += GetPriceDifficultyChange(ModSettingKind.StationPriceMultiplier, current.StationPriceMultiplier); if (_settingsStore.IsEnabled(ModSettingKind.DeathRosaryLossPercentage)) { int num10 = current.DeathRosaryLossPercentage - 100; num += ((num10 > 0) ? Mathf.Min((float)num10 * 0.25f, 25f) : (0f - Mathf.Min((float)(-num10) * 0.1f, 10f))); } if (_settingsStore.IsEnabled(ModSettingKind.HornetSpeedMultiplier)) { num += (1f - current.HornetSpeedMultiplier) * 20f; } if (_settingsStore.IsEnabled(ModSettingKind.DashRechargeLevel)) { num += Mathf.Min((float)(current.DashRechargeLevel - 1) * 3f, 57f); } for (int i = 0; i < MutatorCatalog.All.Length; i++) { MutatorDefinition mutatorDefinition = MutatorCatalog.All[i]; if (MutatorCatalog.Get(current, mutatorDefinition.Setting)) { num += (float)mutatorDefinition.DifficultyPoints; } } int num11 = Mathf.Clamp(Mathf.RoundToInt(num), 0, 250); string difficultyClassification = GetDifficultyClassification(num11); string profileStyle = GetProfileStyle(current, num11); bool flag = _settingsStore.IsEnabled(ModSettingKind.OneHitMode) && current.OneHitMode; int num12 = MutatorCatalog.CountEnabled(current) + (flag ? 1 : 0); string activeMutatorNames = GetActiveMutatorNames(current, flag); DifficultySummarySnapshot difficultySummarySnapshot = new DifficultySummarySnapshot(); difficultySummarySnapshot.Score = num11; difficultySummarySnapshot.Classification = difficultyClassification; difficultySummarySnapshot.ClassificationDescription = "O perfil está classificado como " + difficultyClassification + ". A faixa é atualizada imediatamente conforme os valores, os mutadores ativos e seus pontos de dificuldade."; difficultySummarySnapshot.ProfileStyle = profileStyle; difficultySummarySnapshot.ProfileDescription = GetProfileDescription(profileStyle); difficultySummarySnapshot.Mutators = ((num12 > 0) ? (num12 + ((num12 == 1) ? " ATIVO" : " ATIVOS")) : "NENHUM"); difficultySummarySnapshot.MutatorsDescription = ((num12 > 0) ? ("Regras especiais ligadas: " + activeMutatorNames + ". Ajustes numéricos comuns não são contados como mutadores.") : "Nenhuma regra especial está ligada. Ajustes numéricos de vida, dano, cura, recompensas e preços continuam refletidos na pontuação, mas não são contados como mutadores."); difficultySummarySnapshot.AccentColor = GetDifficultyAccent(num11); return difficultySummarySnapshot; } private static string GetActiveMutatorNames(ModSettings settings, bool oneHitActive) { List list = new List(); if (oneHitActive) { list.Add("Modo One Hit"); } for (int i = 0; i < MutatorCatalog.All.Length; i++) { MutatorDefinition mutatorDefinition = MutatorCatalog.All[i]; if (MutatorCatalog.Get(settings, mutatorDefinition.Setting)) { list.Add(mutatorDefinition.Title); } } return string.Join(", ", list.ToArray()); } private float GetRewardDifficultyChange(ModSettingKind setting, float value) { if (!_settingsStore.IsEnabled(setting)) { return 0f; } if (!(value < 1f)) { return 0f - Mathf.Min((value - 1f) * 0.75f, 15f); } return Mathf.Min((1f - value) * 12f, 10.8f); } private float GetPriceDifficultyChange(ModSettingKind setting, float value) { if (!_settingsStore.IsEnabled(setting)) { return 0f; } if (!(value > 1f)) { return 0f - Mathf.Min((1f - value) * 12f, 10.8f); } return Mathf.Min((value - 1f) * 4f, 36f); } private static string GetDifficultyClassification(int score) { if (score < 40) { return "Assistido"; } if (score < 75) { return "Fácil"; } if (score < 125) { return "Normal"; } if (score < 165) { return "Difícil"; } if (score < 210) { return "Extremo"; } return "Pesadelo"; } private string LocalizeSummaryTerm(string value) { string obj = value ?? string.Empty; string key = obj; if (obj != null) { if ({0AA8D63C-C7A3-4767-B801-C10C1EA30D5C}.$$method0x600004d-1 == null) { {0AA8D63C-C7A3-4767-B801-C10C1EA30D5C}.$$method0x600004d-1 = new Dictionary(11) { { "Assistido", 0 }, { "Fácil", 1 }, { "Normal", 2 }, { "Difícil", 3 }, { "Extremo", 4 }, { "Pesadelo", 5 }, { "Equilibrado", 6 }, { "Punitivo", 7 }, { "Ofensivo", 8 }, { "Sobrevivência", 9 }, { "Econômico", 10 } }; } if ({0AA8D63C-C7A3-4767-B801-C10C1EA30D5C}.$$method0x600004d-1.TryGetValue(key, out var value2)) { switch (value2) { case 0: return L("summary_assisted", "Assistido"); case 1: return L("preset_easy", "Fácil"); case 2: return L("summary_normal", "Normal"); case 3: return L("preset_hard", "Difícil"); case 4: return L("summary_extreme", "Extremo"); case 5: return L("summary_nightmare", "Pesadelo"); case 6: return L("summary_balanced", "Equilibrado"); case 7: return L("summary_punishing", "Punitivo"); case 8: return L("summary_offensive", "Ofensivo"); case 9: return L("summary_survival", "Sobrevivência"); case 10: return L("summary_economic", "Econômico"); } } } return value ?? string.Empty; } private string LocalizeMutatorSummaryValue(string value) { if (string.IsNullOrEmpty(value) || string.Equals(value, "NENHUM", StringComparison.OrdinalIgnoreCase)) { return L("none", "NENHUM").ToUpperInvariant(); } int num = value.IndexOf(' '); string text = ((num > 0) ? value.Substring(0, num) : value); return text + " " + L("summary_active_suffix", "ATIVOS").ToUpperInvariant(); } private string GetProfileStyle(ModSettings settings, int difficultyScore) { if (_settingsStore.IsEnabled(ModSettingKind.OneHitMode) && settings.OneHitMode) { return "One Hit"; } if (difficultyScore < 75) { return "Assistido"; } if (difficultyScore >= 210) { return "Pesadelo"; } int num = ((settings.DefaultMaximumHealth > 0) ? settings.DefaultMaximumHealth : 5); int num2 = ((settings.DefaultNeedleDamage > 0) ? settings.DefaultNeedleDamage : 5); float num3 = 0f; float num4 = 0f; float num5 = 0f; float num6 = 0f; if (_settingsStore.IsEnabled(ModSettingKind.NeedleDamage)) { num3 += Mathf.Max(0f, (float)(settings.NeedleDamage - num2)); num6 += Mathf.Max(0f, (float)(num2 - settings.NeedleDamage)); } if (_settingsStore.IsEnabled(ModSettingKind.NeedleUpgradePercentage)) { num3 += (float)settings.NeedleUpgradePercentage / 5f; } if (_settingsStore.IsEnabled(ModSettingKind.SilkSpearDamageMultiplier)) { num3 += Mathf.Max(0f, (float)(settings.SilkSpearDamageMultiplier - 3)) * 2f; num6 += Mathf.Max(0f, (float)(3 - settings.SilkSpearDamageMultiplier)) * 4f; } if (_settingsStore.IsEnabled(ModSettingKind.SilkSpearSilkCost)) { num3 += Mathf.Max(0f, (float)(4 - settings.SilkSpearSilkCost)); num6 += Mathf.Max(0f, (float)(settings.SilkSpearSilkCost - 4)) * 2f; } if (_settingsStore.IsEnabled(ModSettingKind.MaximumHealth)) { num4 += Mathf.Max(0f, (float)(settings.MaximumHealth - num)) * 2f; num6 += Mathf.Max(0f, (float)(num - settings.MaximumHealth)) * 5f; } if (_settingsStore.IsEnabled(ModSettingKind.HealingAmount)) { num4 += Mathf.Max(0f, (float)(settings.HealingAmount - 3)) * 2f; num6 += Mathf.Max(0f, (float)(3 - settings.HealingAmount)) * 5f; } if (_settingsStore.IsEnabled(ModSettingKind.HealingCost)) { num4 += Mathf.Max(0f, (float)(9 - settings.HealingCost)); num6 += Mathf.Max(0f, (float)(settings.HealingCost - 9)) * 2f; } if (_settingsStore.IsEnabled(ModSettingKind.InvincibilityTimeMultiplier)) { num4 += Mathf.Max(0f, settings.InvincibilityTimeMultiplier - 1f) * 3f; num6 += Mathf.Max(0f, 1f - settings.InvincibilityTimeMultiplier) * 8f; } if (_settingsStore.IsEnabled(ModSettingKind.CoinMultiplier)) { num5 += Mathf.Max(0f, settings.CoinMultiplier - 1f); num6 += Mathf.Max(0f, 1f - settings.CoinMultiplier) * 10f; } if (_settingsStore.IsEnabled(ModSettingKind.ShardMultiplier)) { num5 += Mathf.Max(0f, settings.ShardMultiplier - 1f); num6 += Mathf.Max(0f, 1f - settings.ShardMultiplier) * 10f; } if (_settingsStore.IsEnabled(ModSettingKind.ShopPriceMultiplier)) { num5 += Mathf.Max(0f, 1f - settings.ShopPriceMultiplier) * 10f; num6 += Mathf.Max(0f, settings.ShopPriceMultiplier - 1f) * 3f; } if (_settingsStore.IsEnabled(ModSettingKind.StationPriceMultiplier)) { num5 += Mathf.Max(0f, 1f - settings.StationPriceMultiplier) * 10f; num6 += Mathf.Max(0f, settings.StationPriceMultiplier - 1f) * 3f; } if (_settingsStore.IsEnabled(ModSettingKind.DamageTakenMultiplier)) { num6 += Mathf.Max(0f, settings.DamageTakenMultiplier - 1f) * 3f; } if (_settingsStore.IsEnabled(ModSettingKind.EnvironmentalDamageMultiplier)) { num6 += Mathf.Max(0f, settings.EnvironmentalDamageMultiplier - 1f) * 3f; } float num7 = Mathf.Max(Mathf.Max(num3, num4), Mathf.Max(num5, num6)); if (num7 < 1f) { return "Equilibrado"; } if (num7 == num6) { return "Punitivo"; } if (num7 == num3) { return "Ofensivo"; } if (num7 != num4) { return "Econômico"; } return "Sobrevivência"; } private static string GetProfileDescription(string style) { return style switch { "Assistido" => "Predominam ajustes que favorecem a Hornet, como mais vida, dano, cura ou recompensas. O estilo muda automaticamente quando outro conjunto de opções passa a dominar o perfil.", "One Hit" => "O mutador One Hit define o perfil: sobreviver sem receber golpes é mais importante que os demais ajustes numéricos configurados.", "Pesadelo" => "Várias regras severas estão combinadas e colocam o perfil na faixa máxima de desafio.", "Punitivo" => "Predominam dano recebido, custos elevados, recursos reduzidos ou limitações de sobrevivência.", "Ofensivo" => "Predominam melhorias no dano base da agulha e no crescimento obtido a cada melhoria.", "Sobrevivência" => "Predominam vida, cura, custo reduzido de Bind e janelas maiores de invencibilidade.", "Econômico" => "Predominam alterações em Rosários, Fragmentos e preços de lojas, bancos ou estações.", _ => "Os ajustes estão próximos dos valores normais ou distribuídos sem uma tendência dominante.", }; } private static Color GetDifficultyAccent(int score) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) if (score < 75) { return new Color(0.25f, 0.84f, 0.39f, 1f); } if (score < 125) { return new Color(0.95f, 0.72f, 0.28f, 1f); } if (score < 165) { return new Color(0.96f, 0.48f, 0.18f, 1f); } return new Color(0.92f, 0.18f, 0.14f, 1f); } private void DrawDamageToolCategory(Rect rowRect, string title, string description, Color accent, Texture2D icon = null) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_0127: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) rowRect = ResolveCardRect(rowRect, fullWidth: true); DrawModernRowSurface(rowRect, title?.GetHashCode() ?? 0, accent); float num = ((Rect)(ref rowRect)).x + 18f; if ((Object)(object)icon != (Object)null) { Rect val = default(Rect); ((Rect)(ref val))..ctor(((Rect)(ref rowRect)).x + 14f, ((Rect)(ref rowRect)).y + 25f, 72f, 72f); Color color = GUI.color; GUI.color = accent; GUI.DrawTexture(val, (Texture)(object)icon, (ScaleMode)2, true); GUI.color = color; num = ((Rect)(ref val)).xMax + 14f; } GUI.Label(new Rect(num, ((Rect)(ref rowRect)).y + 24f, ((Rect)(ref rowRect)).xMax - num - 18f, 32f), T(title), _lockedLabelStyle); string text = T(description); Rect val2 = default(Rect); ((Rect)(ref val2))..ctor(num, ((Rect)(ref rowRect)).y + 58f, ((Rect)(ref rowRect)).xMax - num - 18f, ((Rect)(ref rowRect)).height - 70f); GUI.Label(val2, FitTextWithEllipsis(text, ((Rect)(ref val2)).width, ((Rect)(ref val2)).height, _descriptionStyle), _descriptionStyle); SetTooltip(val2, text); } private void DrawDamageToolEntry(Rect rowRect, string title, string description, Texture2D icon, Color accent) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0018: 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) //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) rowRect = ResolveCardRect(rowRect, fullWidth: false); DrawModernRowSurface(rowRect, title?.GetHashCode() ?? 0, accent); Rect val = default(Rect); ((Rect)(ref val))..ctor(((Rect)(ref rowRect)).x + 14f, ((Rect)(ref rowRect)).y + 22f, 76f, 76f); if ((Object)(object)icon != (Object)null) { GUI.DrawTexture(val, (Texture)(object)icon, (ScaleMode)2, true); } float num = ((Rect)(ref val)).xMax + 14f; GUI.Label(new Rect(num, ((Rect)(ref rowRect)).y + 20f, ((Rect)(ref rowRect)).xMax - num - 16f, 31f), T(title), _lockedLabelStyle); string text = T(description); Rect val2 = default(Rect); ((Rect)(ref val2))..ctor(num, ((Rect)(ref rowRect)).y + 53f, ((Rect)(ref rowRect)).xMax - num - 16f, ((Rect)(ref rowRect)).height - 65f); GUI.Label(val2, FitTextWithEllipsis(text, ((Rect)(ref val2)).width, ((Rect)(ref val2)).height, _descriptionStyle), _descriptionStyle); SetTooltip(val2, text); } private void DrawDamageToolEntries(DamageToolDefinition[] tools, Color accent, float width, ref float rowY) { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) foreach (DamageToolDefinition damageToolDefinition in tools) { DrawDamageToolEntry(new Rect(18f, rowY, width - 18f, 146f), damageToolDefinition.Title, damageToolDefinition.Description, (_images != null) ? _images.GetDamageTool(damageToolDefinition.ImageName) : null, accent); rowY += 158f; } } private static string GetSilkCostDescription(string skillName) { return "Define o custo individual de " + skillName + ", de 1 a 18. O padrão é 4. O Ovo de Flealia ainda reduz o custo final em 1 quando suas condições vanilla são atendidas."; } private string GetSilkDamageDescription(ModSettingKind setting, string formulaDescription, int hitCount) { float value = (_settingsStore.IsEnabled(setting) ? SilkSkillSettingCatalog.GetValue(_settingsStore.Current, setting) : SilkSkillSettingCatalog.GetDefault(setting)); value = SilkSkillSettingCatalog.Normalize(setting, value); int previewNeedleDamage = GetPreviewNeedleDamage(); int num = Mathf.RoundToInt((float)previewNeedleDamage * value); string text = " Prévia: Agulha " + previewNeedleDamage + " × " + SilkSkillSettingCatalog.Format(setting, value) + " = " + num; if (hitCount > 1) { object obj = text; text = string.Concat(obj, " por impacto; ", hitCount, " impactos = ", num * hitCount, " no máximo."); } else { text += "."; } return formulaDescription + text; } private int GetPreviewNeedleDamage() { try { if (PlayerData.HasInstance && PlayerData.instance != null) { return Math.Max(1, PlayerData.instance.nailDamage); } } catch { } if (_settingsStore.Current.NeedleDamage <= 0) { return 5; } return ValueValidator.ClampNeedleDamage(_settingsStore.Current.NeedleDamage); } private void DrawLockedRow(Rect rowRect, LockedOptionDefinition option, int rowIndex) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Unknown result type (might be due to invalid IL or missing references) //IL_0185: Unknown result type (might be due to invalid IL or missing references) //IL_01a8: Unknown result type (might be due to invalid IL or missing references) //IL_01cc: Unknown result type (might be due to invalid IL or missing references) //IL_01ef: Unknown result type (might be due to invalid IL or missing references) //IL_011c: Unknown result type (might be due to invalid IL or missing references) //IL_0152: Unknown result type (might be due to invalid IL or missing references) DrawModernRowSurface(rowRect, rowIndex, new Color(0.34f, 0.38f, 0.38f, 1f)); float num = 300f; float num2 = ((Rect)(ref rowRect)).xMax - num - 12f; bool flag = ((Rect)(ref rowRect)).width >= 1120f; float num3 = (flag ? 218f : 0f); float num4 = num2 - num3 - 12f; float num5 = ((Rect)(ref rowRect)).x + 18f; float num6 = Mathf.Max(110f, num4 - num5 - 12f); GUI.Label(new Rect(num5, ((Rect)(ref rowRect)).y + 10f, num6, 38f), T(option.Label).ToUpperInvariant(), _lockedLabelStyle); GUI.Label(new Rect(num5, ((Rect)(ref rowRect)).y + 51f, num6, ((Rect)(ref rowRect)).height - 62f), L("locked_future_desc", "Configuração reservada para uma próxima etapa."), _descriptionStyle); if (flag) { DrawMetadataColumn(new Rect(num4, ((Rect)(ref rowRect)).y + 8f, 100f, 54f), "PADRÃO", option.Value, locked: true); DrawMetadataColumn(new Rect(num4 + 112f, ((Rect)(ref rowRect)).y + 8f, 104f, 54f), "INTERVALO", GetLockedRange(option), locked: true); } float num7 = ((Rect)(ref rowRect)).y + 18f; DrawDisabledControl(new Rect(num2, num7, 42f, 38f), "<"); DrawDisabledControl(new Rect(num2 + 50f, num7, 112f, 38f), option.Value); DrawDisabledControl(new Rect(num2 + 170f, num7, 42f, 38f), ">"); DrawDisabledControl(new Rect(num2 + 220f, num7, 68f, 38f), L("locked_short", "BLOQ.")); } private int GetActiveRowCount(MenuSection section) { return section switch { MenuSection.Favorites => Math.Max(1, _settingsStore.FavoriteCount), MenuSection.Summary => 4, MenuSection.Player => 8, MenuSection.Damage => 25 + RedDamageTools.Length + BlueDamageTools.Length + YellowDamageTools.Length, MenuSection.Enemies => 5, MenuSection.Bosses => 8, MenuSection.Drops => 3, MenuSection.Economy => 4, MenuSection.Movement => 3, MenuSection.Mutators => MutatorCatalog.All.Length + 1, MenuSection.Presets => 10 + Math.Max(1, (_presetManager != null) ? _presetManager.LoadedCount : 0), MenuSection.System => 6, _ => 0, }; } private void DrawSettingRow(Rect rowRect, ModSettingKind setting, string label, string description, Texture2D icon, Texture2D secondaryIcon = null) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: Unknown result type (might be due to invalid IL or missing references) //IL_021c: Unknown result type (might be due to invalid IL or missing references) //IL_019f: Unknown result type (might be due to invalid IL or missing references) //IL_01b8: Unknown result type (might be due to invalid IL or missing references) //IL_010a: Unknown result type (might be due to invalid IL or missing references) //IL_01d7: Unknown result type (might be due to invalid IL or missing references) //IL_01cc: Unknown result type (might be due to invalid IL or missing references) //IL_0249: Unknown result type (might be due to invalid IL or missing references) //IL_0305: Unknown result type (might be due to invalid IL or missing references) //IL_033f: Unknown result type (might be due to invalid IL or missing references) //IL_0360: Unknown result type (might be due to invalid IL or missing references) //IL_039b: Unknown result type (might be due to invalid IL or missing references) //IL_040c: Unknown result type (might be due to invalid IL or missing references) //IL_0493: Unknown result type (might be due to invalid IL or missing references) //IL_02cc: Unknown result type (might be due to invalid IL or missing references) //IL_02d1: Unknown result type (might be due to invalid IL or missing references) //IL_04c0: Unknown result type (might be due to invalid IL or missing references) //IL_051a: Unknown result type (might be due to invalid IL or missing references) //IL_0564: Unknown result type (might be due to invalid IL or missing references) //IL_0569: Unknown result type (might be due to invalid IL or missing references) //IL_0576: Unknown result type (might be due to invalid IL or missing references) //IL_057b: Unknown result type (might be due to invalid IL or missing references) //IL_05bb: Unknown result type (might be due to invalid IL or missing references) //IL_05e1: Unknown result type (might be due to invalid IL or missing references) //IL_05f3: Unknown result type (might be due to invalid IL or missing references) //IL_0614: Unknown result type (might be due to invalid IL or missing references) //IL_058b: Unknown result type (might be due to invalid IL or missing references) //IL_05a0: Unknown result type (might be due to invalid IL or missing references) //IL_066a: Unknown result type (might be due to invalid IL or missing references) //IL_0696: Unknown result type (might be due to invalid IL or missing references) rowRect = ResolveCardRect(rowRect, fullWidth: false); if (Event.current != null && ((Rect)(ref rowRect)).Contains(Event.current.mousePosition)) { _hasHoveredSetting = true; _hoveredSetting = setting; } bool flag = _settingsStore.IsEnabled(setting); bool flag2 = IsSettingChanged(setting); label = GetLocalizedSettingText(setting, description: false, label); description = GetLocalizedSettingText(setting, description: true, description); DrawModernRowSurface(rowRect, (int)setting, flag ? _currentSectionAccent : MenuVisualTheme.Disabled); float num = 48f; Rect val = default(Rect); ((Rect)(ref val))..ctor(((Rect)(ref rowRect)).x + 14f, ((Rect)(ref rowRect)).y + 15f, num, num); if ((Object)(object)icon != (Object)null || (Object)(object)secondaryIcon != (Object)null) { DrawSolidRect(new Rect(((Rect)(ref val)).x - 5f, ((Rect)(ref val)).y - 5f, ((Rect)(ref val)).width + 10f, ((Rect)(ref val)).height + 10f), MenuVisualTheme.Field); } if ((Object)(object)icon != (Object)null && (Object)(object)secondaryIcon == (Object)null) { GUI.DrawTexture(val, (Texture)(object)icon, (ScaleMode)2, true); } else if ((Object)(object)secondaryIcon != (Object)null) { float num2 = num * 0.64f; Rect val2 = default(Rect); ((Rect)(ref val2))..ctor(((Rect)(ref val)).x, ((Rect)(ref val)).y + num - num2, num2, num2); Rect val3 = default(Rect); ((Rect)(ref val3))..ctor(((Rect)(ref val)).x + num - num2, ((Rect)(ref val)).y, num2, num2); DrawSolidRect(new Rect(((Rect)(ref val3)).x - 2f, ((Rect)(ref val3)).y - 2f, ((Rect)(ref val3)).width + 4f, ((Rect)(ref val3)).height + 4f), new Color(0.008f, 0.012f, 0.013f, 0.92f)); if ((Object)(object)icon != (Object)null) { GUI.DrawTexture(val2, (Texture)(object)icon, (ScaleMode)2, true); } GUI.DrawTexture(val3, (Texture)(object)secondaryIcon, (ScaleMode)2, true); } Rect val4 = default(Rect); ((Rect)(ref val4))..ctor(((Rect)(ref rowRect)).xMax - 42f, ((Rect)(ref rowRect)).y + 10f, 30f, 30f); bool flag3 = _settingsStore.IsFavorite(setting); SetTooltip(val4, flag3 ? L("remove_favorite_tooltip", "Remover dos Favoritos (F)") : L("add_favorite_tooltip", "Adicionar aos Favoritos (F)")); if (GUI.Button(val4, flag3 ? "★" : "☆", _buttonStyle)) { CommitField(setting); _settingsStore.ToggleFavorite(setting); GUI.FocusControl(string.Empty); } float num3 = ((Rect)(ref val)).xMax + 13f; float num4 = Mathf.Max(120f, ((Rect)(ref val4)).x - num3 - 9f); if (flag2) { DrawSolidRect(new Rect(num3, ((Rect)(ref rowRect)).y + 16f, 6f, 6f), MenuVisualTheme.SignalCyan); num3 += 11f; num4 -= 11f; } GUI.Label(new Rect(num3, ((Rect)(ref rowRect)).y + 9f, num4, 27f), FitTextWithEllipsis(label, num4, 27f, _labelStyle), _labelStyle); SetTooltip(new Rect(num3, ((Rect)(ref rowRect)).y + 9f, num4, 27f), label); GUI.Label(new Rect(num3, ((Rect)(ref rowRect)).y + 37f, num4, 43f), FitTextWithEllipsis(description, num4, 43f, _descriptionStyle), _descriptionStyle); SetTooltip(new Rect(num3, ((Rect)(ref rowRect)).y + 37f, num4, 43f), description); float num5 = 32f; float num6 = ((Rect)(ref rowRect)).yMax - num5 - 10f; float num7 = 288f; float num8 = ((Rect)(ref rowRect)).xMax - num7 - 12f; Rect val5 = default(Rect); ((Rect)(ref val5))..ctor(((Rect)(ref rowRect)).x + 14f, ((Rect)(ref rowRect)).y + 82f, ((Rect)(ref rowRect)).width - 28f, 18f); GUI.Label(val5, L("default", "Padrão") + " " + GetDefaultValueText(setting) + " · " + L("range", "Intervalo") + " " + GetRangeText(setting), _metaTitleStyle); Rect rect = default(Rect); ((Rect)(ref rect))..ctor(num8, num6, 82f, num5); SetTooltip(rect, flag ? L("disable_option_tooltip", "Desativar esta configuração") : L("enable_option_tooltip", "Ativar esta configuração")); if (DrawSwitchControl(rect, flag)) { CommitField(setting); _settingsStore.SetEnabled(setting, !flag); SyncTextFromSettings(); GUI.FocusControl(string.Empty); } float num9 = num8 + 90f; bool enabled = GUI.enabled; GUI.enabled = enabled && flag; if (GUI.Button(new Rect(num9, num6, 32f, num5), "−", _buttonStyle)) { CommitField(setting); AdjustSetting(setting, -1); GUI.FocusControl(string.Empty); } string controlName = GetControlName(setting); GUI.SetNextControlName(controlName); Color textColor = _fieldStyle.normal.textColor; Color textColor2 = _fieldStyle.focused.textColor; if (flag2) { _fieldStyle.normal.textColor = MenuVisualTheme.SignalCyan; _fieldStyle.focused.textColor = MenuVisualTheme.SignalCyan; } string value = GUI.TextField(new Rect(num9 + 38f, num6, 76f, num5), GetText(setting), 12, _fieldStyle); _fieldStyle.normal.textColor = textColor; _fieldStyle.focused.textColor = textColor2; SetText(setting, value); if (GUI.Button(new Rect(num9 + 120f, num6, 32f, num5), "+", _buttonStyle)) { CommitField(setting); AdjustSetting(setting, 1); GUI.FocusControl(string.Empty); } GUI.enabled = enabled && flag2; Rect val6 = default(Rect); ((Rect)(ref val6))..ctor(num9 + 160f, num6, 38f, num5); SetTooltip(val6, flag2 ? L("reset_option_tooltip", "Restaurar o valor padrão") : L("already_default_tooltip", "Esta opção já usa o padrão")); if (GUI.Button(val6, "↻", _buttonStyle)) { CommitField(setting); ResetSetting(setting); GUI.FocusControl(string.Empty); } GUI.enabled = enabled; } private void DrawMutatorRow(Rect rowRect, MutatorDefinition definition, int rowIndex) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_0165: Unknown result type (might be due to invalid IL or missing references) //IL_0174: Unknown result type (might be due to invalid IL or missing references) //IL_016d: Unknown result type (might be due to invalid IL or missing references) //IL_01bf: Unknown result type (might be due to invalid IL or missing references) //IL_01f9: Unknown result type (might be due to invalid IL or missing references) //IL_021a: Unknown result type (might be due to invalid IL or missing references) //IL_0254: Unknown result type (might be due to invalid IL or missing references) //IL_028b: Unknown result type (might be due to invalid IL or missing references) //IL_039c: Unknown result type (might be due to invalid IL or missing references) //IL_03c9: Unknown result type (might be due to invalid IL or missing references) rowRect = ResolveCardRect(rowRect, fullWidth: false); if (Event.current != null && ((Rect)(ref rowRect)).Contains(Event.current.mousePosition)) { _hasHoveredSetting = true; _hoveredSetting = definition.Setting; } bool flag = _settingsStore.IsMutatorEnabled(definition.Setting); string mutatorLocalizationKey = GetMutatorLocalizationKey(definition.Setting); string text = L(mutatorLocalizationKey, definition.Title); string text2 = L("desc_" + mutatorLocalizationKey, definition.Description); DrawModernRowSurface(rowRect, rowIndex, flag ? MenuVisualTheme.Danger : _currentSectionAccent); Rect val = default(Rect); ((Rect)(ref val))..ctor(((Rect)(ref rowRect)).xMax - 42f, ((Rect)(ref rowRect)).y + 10f, 30f, 30f); bool flag2 = _settingsStore.IsFavorite(definition.Setting); SetTooltip(val, flag2 ? L("remove_favorite_tooltip", "Remover dos Favoritos (F)") : L("add_favorite_tooltip", "Adicionar aos Favoritos (F)")); if (GUI.Button(val, flag2 ? "★" : "☆", _buttonStyle)) { _settingsStore.ToggleFavorite(definition.Setting); GUI.FocusControl(string.Empty); } Rect rect = default(Rect); ((Rect)(ref rect))..ctor(((Rect)(ref rowRect)).x + 14f, ((Rect)(ref rowRect)).y + 15f, 46f, 46f); DrawSectionIcon(rect, MenuSection.Mutators, flag ? MenuVisualTheme.Danger : _currentSectionAccent); float num = ((Rect)(ref rect)).xMax + 13f; float num2 = Mathf.Max(120f, ((Rect)(ref val)).x - num - 9f); GUI.Label(new Rect(num, ((Rect)(ref rowRect)).y + 9f, num2, 28f), FitTextWithEllipsis(text, num2, 28f, _labelStyle), _labelStyle); SetTooltip(new Rect(num, ((Rect)(ref rowRect)).y + 9f, num2, 28f), text); GUI.Label(new Rect(num, ((Rect)(ref rowRect)).y + 38f, num2, 52f), FitTextWithEllipsis(text2, num2, 52f, _descriptionStyle), _descriptionStyle); SetTooltip(new Rect(num, ((Rect)(ref rowRect)).y + 38f, num2, 52f), text2); GUI.Label(new Rect(((Rect)(ref rowRect)).x + 14f, ((Rect)(ref rowRect)).yMax - 39f, ((Rect)(ref rowRect)).width - 126f, 25f), ((_selectedSectionIndex >= 0 && LockedOptionCatalog.Sections[_selectedSectionIndex] == MenuSection.Favorites) ? (L("favorite_origin", "Origem") + ": " + GetLocalizedSectionLabel(MenuSection.Mutators) + " · ") : string.Empty) + L("difficulty", "Dificuldade") + ": " + T(definition.Difficulty) + " · " + ((definition.DifficultyPoints > 0) ? "+" : string.Empty) + definition.DifficultyPoints + " " + L("summary_points", "pontos"), _metaTitleStyle); Rect rect2 = default(Rect); ((Rect)(ref rect2))..ctor(((Rect)(ref rowRect)).xMax - 102f, ((Rect)(ref rowRect)).yMax - 42f, 90f, 32f); SetTooltip(rect2, flag ? L("disable_mutator_tooltip", "Desativar mutador") : L("enable_mutator_tooltip", "Ativar mutador")); if (DrawSwitchControl(rect2, flag)) { CommitAllFields(); _settingsStore.SetMutator(definition.Setting, !flag); SyncTextFromSettings(); GUI.FocusControl(string.Empty); _focusedControl = string.Empty; } } private void DrawMutatorsCategoryResetRow(Rect rowRect) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) rowRect = ResolveCardRect(rowRect, fullWidth: true); DrawModernRowSurface(rowRect, -1, _currentSectionAccent); float num = 180f; Rect val = default(Rect); ((Rect)(ref val))..ctor(((Rect)(ref rowRect)).xMax - num - 18f, ((Rect)(ref rowRect)).y + (((Rect)(ref rowRect)).height - 40f) * 0.5f, num, 40f); float num2 = Mathf.Max(120f, ((Rect)(ref val)).x - ((Rect)(ref rowRect)).x - 42f); GUI.Label(new Rect(((Rect)(ref rowRect)).x + 18f, ((Rect)(ref rowRect)).y + 10f, num2, 28f), L("reset_category", "RESETAR CATEGORIA"), _labelStyle); GUI.Label(new Rect(((Rect)(ref rowRect)).x + 18f, ((Rect)(ref rowRect)).y + 38f, num2, Mathf.Max(30f, ((Rect)(ref rowRect)).height - 46f)), L("desc_reset_mutators", "Desliga todos os mutadores sem alterar os valores configurados nas outras categorias."), _descriptionStyle); if (GUI.Button(val, L("disable_all", "DESLIGAR TODOS"), _buttonStyle)) { CommitAllFields(); _settingsStore.ResetMutatorsCategory(); SyncTextFromSettings(); GUI.FocusControl(string.Empty); _focusedControl = string.Empty; } } private void DrawPlayerCategoryResetRow(Rect rowRect) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) rowRect = ResolveCardRect(rowRect, fullWidth: true); DrawModernRowSurface(rowRect, -1, _currentSectionAccent); float num = 180f; Rect val = default(Rect); ((Rect)(ref val))..ctor(((Rect)(ref rowRect)).xMax - num - 18f, ((Rect)(ref rowRect)).y + (((Rect)(ref rowRect)).height - 40f) * 0.5f, num, 40f); float num2 = Mathf.Max(120f, ((Rect)(ref val)).x - ((Rect)(ref rowRect)).x - 42f); GUI.Label(new Rect(((Rect)(ref rowRect)).x + 18f, ((Rect)(ref rowRect)).y + 10f, num2, 28f), L("reset_category", "RESETAR CATEGORIA"), _labelStyle); GUI.Label(new Rect(((Rect)(ref rowRect)).x + 18f, ((Rect)(ref rowRect)).y + 38f, num2, Mathf.Max(30f, ((Rect)(ref rowRect)).height - 46f)), L("desc_reset_category", "Restaura somente esta categoria aos valores padrão."), _descriptionStyle); if (GUI.Button(val, L("reset", "RESETAR"), _buttonStyle)) { CommitAllFields(); _settingsStore.ResetPlayerCategory(); SyncTextFromSettings(); GUI.FocusControl(string.Empty); _focusedControl = string.Empty; } } private void DrawDropsCategoryResetRow(Rect rowRect) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) rowRect = ResolveCardRect(rowRect, fullWidth: true); DrawModernRowSurface(rowRect, -1, _currentSectionAccent); float num = 180f; Rect val = default(Rect); ((Rect)(ref val))..ctor(((Rect)(ref rowRect)).xMax - num - 18f, ((Rect)(ref rowRect)).y + (((Rect)(ref rowRect)).height - 40f) * 0.5f, num, 40f); float num2 = Mathf.Max(120f, ((Rect)(ref val)).x - ((Rect)(ref rowRect)).x - 42f); GUI.Label(new Rect(((Rect)(ref rowRect)).x + 18f, ((Rect)(ref rowRect)).y + 10f, num2, 28f), L("reset_category", "RESETAR CATEGORIA"), _labelStyle); GUI.Label(new Rect(((Rect)(ref rowRect)).x + 18f, ((Rect)(ref rowRect)).y + 38f, num2, Mathf.Max(30f, ((Rect)(ref rowRect)).height - 46f)), L("desc_reset_category", "Restaura somente esta categoria aos valores padrão."), _descriptionStyle); if (GUI.Button(val, L("reset", "RESETAR"), _buttonStyle)) { CommitAllFields(); _settingsStore.ResetDropsCategory(); SyncTextFromSettings(); GUI.FocusControl(string.Empty); _focusedControl = string.Empty; } } private void DrawEnemiesCategoryResetRow(Rect rowRect) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) rowRect = ResolveCardRect(rowRect, fullWidth: true); DrawModernRowSurface(rowRect, -1, _currentSectionAccent); float num = 180f; Rect val = default(Rect); ((Rect)(ref val))..ctor(((Rect)(ref rowRect)).xMax - num - 18f, ((Rect)(ref rowRect)).y + (((Rect)(ref rowRect)).height - 40f) * 0.5f, num, 40f); float num2 = Mathf.Max(120f, ((Rect)(ref val)).x - ((Rect)(ref rowRect)).x - 42f); GUI.Label(new Rect(((Rect)(ref rowRect)).x + 18f, ((Rect)(ref rowRect)).y + 10f, num2, 28f), L("reset_category", "RESETAR CATEGORIA"), _labelStyle); GUI.Label(new Rect(((Rect)(ref rowRect)).x + 18f, ((Rect)(ref rowRect)).y + 38f, num2, Mathf.Max(30f, ((Rect)(ref rowRect)).height - 46f)), L("desc_reset_category", "Restaura somente esta categoria aos valores padrão."), _descriptionStyle); if (GUI.Button(val, L("reset", "RESETAR"), _buttonStyle)) { CommitAllFields(); _settingsStore.ResetEnemiesCategory(); SyncTextFromSettings(); GUI.FocusControl(string.Empty); _focusedControl = string.Empty; } } private void DrawBossesCategoryResetRow(Rect rowRect) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) rowRect = ResolveCardRect(rowRect, fullWidth: true); DrawModernRowSurface(rowRect, -1, _currentSectionAccent); float num = 180f; Rect val = default(Rect); ((Rect)(ref val))..ctor(((Rect)(ref rowRect)).xMax - num - 18f, ((Rect)(ref rowRect)).y + (((Rect)(ref rowRect)).height - 40f) * 0.5f, num, 40f); float num2 = Mathf.Max(120f, ((Rect)(ref val)).x - ((Rect)(ref rowRect)).x - 42f); GUI.Label(new Rect(((Rect)(ref rowRect)).x + 18f, ((Rect)(ref rowRect)).y + 10f, num2, 28f), L("reset_category", "RESETAR CATEGORIA"), _labelStyle); GUI.Label(new Rect(((Rect)(ref rowRect)).x + 18f, ((Rect)(ref rowRect)).y + 38f, num2, Mathf.Max(30f, ((Rect)(ref rowRect)).height - 46f)), L("desc_reset_category", "Restaura somente esta categoria aos valores padrão."), _descriptionStyle); if (GUI.Button(val, L("reset", "RESETAR"), _buttonStyle)) { CommitAllFields(); _settingsStore.ResetBossesCategory(); SyncTextFromSettings(); GUI.FocusControl(string.Empty); _focusedControl = string.Empty; } } private void DrawEconomyCategoryResetRow(Rect rowRect) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) rowRect = ResolveCardRect(rowRect, fullWidth: true); DrawModernRowSurface(rowRect, -1, _currentSectionAccent); float num = 180f; Rect val = default(Rect); ((Rect)(ref val))..ctor(((Rect)(ref rowRect)).xMax - num - 18f, ((Rect)(ref rowRect)).y + (((Rect)(ref rowRect)).height - 40f) * 0.5f, num, 40f); float num2 = Mathf.Max(120f, ((Rect)(ref val)).x - ((Rect)(ref rowRect)).x - 42f); GUI.Label(new Rect(((Rect)(ref rowRect)).x + 18f, ((Rect)(ref rowRect)).y + 10f, num2, 28f), L("reset_category", "RESETAR CATEGORIA"), _labelStyle); GUI.Label(new Rect(((Rect)(ref rowRect)).x + 18f, ((Rect)(ref rowRect)).y + 38f, num2, Mathf.Max(30f, ((Rect)(ref rowRect)).height - 46f)), L("desc_reset_category", "Restaura somente esta categoria aos valores padrão."), _descriptionStyle); if (GUI.Button(val, L("reset", "RESETAR"), _buttonStyle)) { CommitAllFields(); _settingsStore.ResetEconomyCategory(); SyncTextFromSettings(); GUI.FocusControl(string.Empty); _focusedControl = string.Empty; } } private void DrawMovementCategoryResetRow(Rect rowRect) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) rowRect = ResolveCardRect(rowRect, fullWidth: true); DrawModernRowSurface(rowRect, -1, _currentSectionAccent); float num = 180f; Rect val = default(Rect); ((Rect)(ref val))..ctor(((Rect)(ref rowRect)).xMax - num - 18f, ((Rect)(ref rowRect)).y + (((Rect)(ref rowRect)).height - 40f) * 0.5f, num, 40f); float num2 = Mathf.Max(120f, ((Rect)(ref val)).x - ((Rect)(ref rowRect)).x - 42f); GUI.Label(new Rect(((Rect)(ref rowRect)).x + 18f, ((Rect)(ref rowRect)).y + 10f, num2, 28f), L("reset_category", "RESETAR CATEGORIA"), _labelStyle); GUI.Label(new Rect(((Rect)(ref rowRect)).x + 18f, ((Rect)(ref rowRect)).y + 38f, num2, Mathf.Max(30f, ((Rect)(ref rowRect)).height - 46f)), L("desc_reset_category", "Restaura somente esta categoria aos valores padrão."), _descriptionStyle); if (GUI.Button(val, L("reset", "RESETAR"), _buttonStyle)) { CommitAllFields(); _settingsStore.ResetMovementCategory(); SyncTextFromSettings(); GUI.FocusControl(string.Empty); _focusedControl = string.Empty; } } private string GetLocalizedSectionLabel(MenuSection section) { return section switch { MenuSection.Summary => L("category_summary", "Resumo"), MenuSection.Favorites => L("category_favorites", "Favoritos"), MenuSection.Player => L("category_player", "Jogador"), MenuSection.Damage => L("category_damage", "Dano e Ferramentas"), MenuSection.Enemies => L("category_enemies", "Inimigos"), MenuSection.Bosses => L("category_bosses", "Bosses"), MenuSection.EnemyEditor => L("category_enemy_editor", "Editor de Inimigos"), MenuSection.Drops => L("category_drops", "Drops"), MenuSection.Economy => L("category_economy", "Economia"), MenuSection.Movement => L("category_movement", "Movimento"), MenuSection.Mutators => L("category_mutators", "Mutadores"), MenuSection.Presets => L("category_presets", "Presets"), _ => L("category_system", "Sistema"), }; } private string GetLocalizedSettingText(ModSettingKind setting, bool description, string fallback) { string text; switch (setting) { case ModSettingKind.MaximumHealth: text = "health"; break; case ModSettingKind.NeedleDamage: text = "damage"; break; case ModSettingKind.NeedleUpgradePercentage: text = "needle_upgrade_percentage"; break; case ModSettingKind.SilkSpearDamageMultiplier: text = "silk_spear_damage_multiplier"; break; case ModSettingKind.SilkSpearSilkCost: case ModSettingKind.ThreadStormSilkCost: case ModSettingKind.CrossStitchSilkCost: case ModSettingKind.SharpdartSilkCost: case ModSettingKind.RuneRageSilkCost: case ModSettingKind.PaleNailsSilkCost: text = "silk_cost_multiplier"; break; case ModSettingKind.ThreadStormNormalHitMultiplier: case ModSettingKind.ThreadStormLateHitMultiplier: case ModSettingKind.CrossStitchHitMultiplier: case ModSettingKind.SharpdartMainHitMultiplier: case ModSettingKind.RuneRageBaseDamageMultiplier: case ModSettingKind.PaleNailsProjectileMultiplier: text = "skill_damage_multiplier"; break; case ModSettingKind.DamageTakenMultiplier: text = "damage_taken"; break; case ModSettingKind.EnvironmentalDamageMultiplier: text = "environmental_damage_multiplier"; break; case ModSettingKind.OneHitMode: text = "one_hit_mode"; break; case ModSettingKind.HealingAmount: text = "healing_multiplier"; break; case ModSettingKind.HealingCost: text = "healing_cost_multiplier"; break; case ModSettingKind.InvincibilityTimeMultiplier: text = "invincibility_time_multiplier"; break; case ModSettingKind.EnemyHealthMultiplier: text = "enemy_health_multiplier"; break; case ModSettingKind.EnemySpeedMultiplier: text = "enemy_speed_multiplier"; break; case ModSettingKind.EnemyAttackSpeedMultiplier: text = "enemy_attack_cooldown_multiplier"; break; case ModSettingKind.EnemyAggressionMultiplier: text = "enemy_aggression_multiplier"; break; case ModSettingKind.BossHealthMultiplier: text = "boss_health_multiplier"; break; case ModSettingKind.BossDamageTakenMultiplier: text = "boss_damage_taken_multiplier"; break; case ModSettingKind.BossSpeedMultiplier: text = "boss_speed_multiplier"; break; case ModSettingKind.BossAttackSpeedMultiplier: text = "boss_attack_cooldown_multiplier"; break; case ModSettingKind.BossBrutalMode: text = "boss_brutal_mode"; break; case ModSettingKind.DisableHealingDuringBoss: text = "disable_healing_during_boss"; break; case ModSettingKind.HealingDuringBossMultiplier: text = "healing_during_boss_multiplier"; break; case ModSettingKind.CoinMultiplier: text = "currency_drop_multiplier"; break; case ModSettingKind.ShardMultiplier: text = "item_drop_multiplier"; break; case ModSettingKind.ShopPriceMultiplier: case ModSettingKind.StationPriceMultiplier: text = "shop_price_multiplier"; break; case ModSettingKind.DeathRosaryLossPercentage: text = "death_currency_loss_multiplier"; break; case ModSettingKind.HornetSpeedMultiplier: text = "player_speed_multiplier"; break; case ModSettingKind.DashRechargeLevel: text = "dash_cooldown_multiplier"; break; default: return fallback; } return L(description ? ("desc_" + text) : text, fallback); } private static string GetMutatorLocalizationKey(ModSettingKind setting) { return setting switch { ModSettingKind.MutatorNoHealing => "mutator_no_healing", ModSettingKind.MutatorLowGravity => "mutator_low_gravity", ModSettingKind.MutatorDoubleDamage => "mutator_double_damage", ModSettingKind.MutatorGlassCannon => "mutator_glass_cannon", ModSettingKind.MutatorFastEnemies => "mutator_fast_enemies", ModSettingKind.MutatorTankEnemies => "mutator_tank_enemies", ModSettingKind.MutatorAggressiveEnemies => "mutator_aggressive_enemies", ModSettingKind.MutatorRandomEnemyHealth => "mutator_randomized_enemy_health", ModSettingKind.MutatorRichWorld => "mutator_rich_world", ModSettingKind.MutatorPoorWorld => "mutator_poor_world", ModSettingKind.MutatorExpensiveShops => "mutator_expensive_shops", ModSettingKind.MutatorNoDeathLoss => "mutator_no_death_loss", ModSettingKind.MutatorBossFrenzy => "mutator_boss_frenzy", ModSettingKind.MutatorNoMercy => "mutator_no_mercy", _ => "mutator_extended_fights", }; } private string GetSectionSubtitle(MenuSection section) { return section switch { MenuSection.Player => L("section_subtitle_player", "Ajustes que alteram diretamente a experiência da Hornet."), MenuSection.Damage => L("section_subtitle_damage", "Configurações de ataques, habilidades e acertos críticos."), MenuSection.Enemies => L("section_subtitle_enemies", "Vida, movimento, recarga de ataque e percepção dos inimigos comuns."), MenuSection.Bosses => L("section_subtitle_bosses", "Configurações gerais para encontros com Bosses."), MenuSection.EnemyEditor => L("section_subtitle_enemy_editor", "Ajustes individuais para inimigos e Bosses catalogados."), MenuSection.Drops => L("section_subtitle_drops", "Configurações de recompensas e itens coletados."), MenuSection.Economy => L("section_subtitle_economy", "Ajustes de preços, perdas e recompensas."), MenuSection.Movement => L("section_subtitle_movement", "Velocidade da Hornet e tempo de recarga do dash."), MenuSection.Mutators => L("section_subtitle_mutators", "Regras especiais independentes aplicadas sobre a configuração normal."), MenuSection.Presets => L("section_subtitle_presets", "Perfis prontos e configurações salvas."), MenuSection.System => L("section_subtitle_system", "Idioma e ações gerais do menu."), MenuSection.Favorites => L("section_subtitle_favorites", "Acesso rápido às configurações favoritas."), _ => L("section_subtitle_summary", "Visão geral do perfil de dificuldade."), }; } private static string GetLockedRange(LockedOptionDefinition option) { if (option.Value.IndexOf("Desligado", StringComparison.OrdinalIgnoreCase) >= 0 || option.Value.IndexOf("Ligado", StringComparison.OrdinalIgnoreCase) >= 0) { return "LIG. / DESL."; } if (option.Value.IndexOf("%", StringComparison.Ordinal) >= 0) { return "0% – 100%"; } if (option.Value.IndexOf("x", StringComparison.OrdinalIgnoreCase) >= 0) { return "0,1x – 20,0x"; } return "–"; } private void DrawMetadataColumn(Rect rect, string title, string value, bool locked) { //IL_001a: 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) GUI.Label(new Rect(((Rect)(ref rect)).x, ((Rect)(ref rect)).y, ((Rect)(ref rect)).width, 22f), T(title), _metaTitleStyle); GUI.Label(new Rect(((Rect)(ref rect)).x, ((Rect)(ref rect)).y + 23f, ((Rect)(ref rect)).width, ((Rect)(ref rect)).height - 23f), T(value), locked ? _lockedValueStyle : _metaValueStyle); } private void DrawDisabledControl(Rect rect, string text) { //IL_0000: 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_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) DrawFramedBox(rect, new Color(0.022f, 0.027f, 0.027f, 0.9f), new Color(0.2f, 0.2f, 0.17f, 0.85f)); GUI.Label(rect, T(text), _lockedValueStyle); } private string GetDefaultValueText(ModSettingKind setting) { if (SilkSkillSettingCatalog.IsSilkSkillSetting(setting)) { return SilkSkillSettingCatalog.Format(setting, SilkSkillSettingCatalog.GetDefault(setting)); } switch (setting) { case ModSettingKind.MaximumHealth: return _settingsStore.Current.DefaultMaximumHealth.ToString(); case ModSettingKind.NeedleDamage: return _settingsStore.Current.DefaultNeedleDamage.ToString(); case ModSettingKind.NeedleUpgradePercentage: return "0%"; case ModSettingKind.SilkSpearDamageMultiplier: return ValueValidator.FormatSilkSpearDamageMultiplier(3); case ModSettingKind.SilkSpearSilkCost: return 4.ToString(); case ModSettingKind.DamageTakenMultiplier: case ModSettingKind.EnvironmentalDamageMultiplier: return "1"; case ModSettingKind.OneHitMode: case ModSettingKind.BossBrutalMode: case ModSettingKind.DisableHealingDuringBoss: return "Desligado"; case ModSettingKind.HealingAmount: return 3.ToString(); case ModSettingKind.HealingCost: return 9.ToString(); case ModSettingKind.DeathRosaryLossPercentage: return ValueValidator.FormatDeathRosaryLossPercentage(100); case ModSettingKind.DashRechargeLevel: return ValueValidator.FormatDashRechargeLevel(1); default: return "1,0x"; } } private static string GetRangeText(ModSettingKind setting) { if (SilkSkillSettingCatalog.IsSilkSkillSetting(setting)) { return SilkSkillSettingCatalog.GetRangeText(setting); } switch (setting) { case ModSettingKind.MaximumHealth: return "1 – 20"; case ModSettingKind.NeedleDamage: return "1 – 100"; case ModSettingKind.NeedleUpgradePercentage: return "0% – 100%"; case ModSettingKind.SilkSpearDamageMultiplier: return "1x – 20x"; case ModSettingKind.DeathRosaryLossPercentage: return "0% – 200%"; case ModSettingKind.HornetSpeedMultiplier: return "0,1x – 2,0x"; case ModSettingKind.DashRechargeLevel: return "Nível 1 – 20"; case ModSettingKind.ShopPriceMultiplier: case ModSettingKind.StationPriceMultiplier: return "0,1x – 10,0x"; case ModSettingKind.EnemySpeedMultiplier: return "0,1x – 1,1x"; case ModSettingKind.BossSpeedMultiplier: return "0,1x – 1,1x"; case ModSettingKind.BossAttackSpeedMultiplier: return "0,1x – 2,0x"; case ModSettingKind.OneHitMode: case ModSettingKind.BossBrutalMode: case ModSettingKind.DisableHealingDuringBoss: return "LIG. / DESL."; case ModSettingKind.DamageTakenMultiplier: case ModSettingKind.EnvironmentalDamageMultiplier: case ModSettingKind.HealingAmount: return "1 – 20"; case ModSettingKind.HealingCost: return "1 – 18"; default: return "0,1x – 20,0x"; } } private void ResetSetting(ModSettingKind setting) { if (SilkSkillSettingCatalog.IsSilkSkillSetting(setting)) { _settingsStore.SetSilkSkillValue(setting, SilkSkillSettingCatalog.GetDefault(setting)); SyncTextFromSettings(); return; } switch (setting) { case ModSettingKind.MaximumHealth: _settingsStore.SetMaximumHealth(_settingsStore.Current.DefaultMaximumHealth); break; case ModSettingKind.NeedleDamage: _settingsStore.SetNeedleDamage(_settingsStore.Current.DefaultNeedleDamage); break; case ModSettingKind.NeedleUpgradePercentage: _settingsStore.SetNeedleUpgradePercentage(0); break; case ModSettingKind.SilkSpearDamageMultiplier: _settingsStore.SetSilkSpearDamageMultiplier(3); break; case ModSettingKind.SilkSpearSilkCost: _settingsStore.SetSilkSpearSilkCost(4); break; case ModSettingKind.DamageTakenMultiplier: _settingsStore.SetDamageTakenMultiplier(1f); break; case ModSettingKind.EnvironmentalDamageMultiplier: _settingsStore.SetEnvironmentalDamageMultiplier(1f); break; case ModSettingKind.OneHitMode: _settingsStore.SetOneHitMode(enabled: false); break; case ModSettingKind.HealingAmount: _settingsStore.SetHealingAmount(3); break; case ModSettingKind.HealingCost: _settingsStore.SetHealingCost(9); break; case ModSettingKind.InvincibilityTimeMultiplier: _settingsStore.SetInvincibilityTimeMultiplier(1f); break; case ModSettingKind.EnemyHealthMultiplier: _settingsStore.SetEnemyHealthMultiplier(1f); break; case ModSettingKind.EnemySpeedMultiplier: _settingsStore.SetEnemySpeedMultiplier(1f); break; case ModSettingKind.EnemyAttackSpeedMultiplier: _settingsStore.SetEnemyAttackSpeedMultiplier(1f); break; case ModSettingKind.EnemyAggressionMultiplier: _settingsStore.SetEnemyAggressionMultiplier(1f); break; case ModSettingKind.BossHealthMultiplier: _settingsStore.SetBossHealthMultiplier(1f); break; case ModSettingKind.BossDamageTakenMultiplier: _settingsStore.SetBossDamageTakenMultiplier(1f); break; case ModSettingKind.BossSpeedMultiplier: _settingsStore.SetBossSpeedMultiplier(1f); break; case ModSettingKind.BossAttackSpeedMultiplier: _settingsStore.SetBossAttackSpeedMultiplier(1f); break; case ModSettingKind.BossBrutalMode: _settingsStore.SetBossBrutalMode(enabled: false); break; case ModSettingKind.DisableHealingDuringBoss: _settingsStore.SetDisableHealingDuringBoss(enabled: false); break; case ModSettingKind.HealingDuringBossMultiplier: _settingsStore.SetHealingDuringBossMultiplier(1f); break; case ModSettingKind.CoinMultiplier: _settingsStore.SetCoinMultiplier(1f); break; case ModSettingKind.ShardMultiplier: _settingsStore.SetShardMultiplier(1f); break; case ModSettingKind.ShopPriceMultiplier: _settingsStore.SetShopPriceMultiplier(1f); break; case ModSettingKind.DeathRosaryLossPercentage: _settingsStore.SetDeathRosaryLossPercentage(100); break; case ModSettingKind.StationPriceMultiplier: _settingsStore.SetStationPriceMultiplier(1f); break; case ModSettingKind.HornetSpeedMultiplier: _settingsStore.SetHornetSpeedMultiplier(1f); break; case ModSettingKind.DashRechargeLevel: _settingsStore.SetDashRechargeLevel(1); break; } SyncTextFromSettings(); } private int GetChangedSettingCount() { int num = 0; for (int i = 0; i < SilkSkillSettingCatalog.AllSettings.Length; i++) { ModSettingKind setting = SilkSkillSettingCatalog.AllSettings[i]; if (!_settingsStore.IsEnabled(setting) || Math.Abs(_settingsStore.GetSilkSkillValue(setting) - SilkSkillSettingCatalog.GetDefault(setting)) >= 0.0001f) { num++; } } if (!_settingsStore.IsEnabled(ModSettingKind.MaximumHealth) || _settingsStore.Current.MaximumHealth != _settingsStore.Current.DefaultMaximumHealth) { num++; } if (!_settingsStore.IsEnabled(ModSettingKind.NeedleDamage) || _settingsStore.Current.NeedleDamage != _settingsStore.Current.DefaultNeedleDamage) { num++; } if (!_settingsStore.IsEnabled(ModSettingKind.NeedleUpgradePercentage) || _settingsStore.Current.NeedleUpgradePercentage != 0) { num++; } if (!_settingsStore.IsEnabled(ModSettingKind.DamageTakenMultiplier) || Math.Abs(_settingsStore.Current.DamageTakenMultiplier - 1f) >= 0.001f) { num++; } if (!_settingsStore.IsEnabled(ModSettingKind.EnvironmentalDamageMultiplier) || Math.Abs(_settingsStore.Current.EnvironmentalDamageMultiplier - 1f) >= 0.001f) { num++; } if (!_settingsStore.IsEnabled(ModSettingKind.OneHitMode) || _settingsStore.Current.OneHitMode) { num++; } if (!_settingsStore.IsEnabled(ModSettingKind.HealingAmount) || _settingsStore.Current.HealingAmount != 3) { num++; } if (!_settingsStore.IsEnabled(ModSettingKind.HealingCost) || _settingsStore.Current.HealingCost != 9) { num++; } if (!_settingsStore.IsEnabled(ModSettingKind.InvincibilityTimeMultiplier) || Math.Abs(_settingsStore.Current.InvincibilityTimeMultiplier - 1f) >= 0.001f) { num++; } if (!_settingsStore.IsEnabled(ModSettingKind.EnemyHealthMultiplier) || Math.Abs(_settingsStore.Current.EnemyHealthMultiplier - 1f) >= 0.001f) { num++; } if (!_settingsStore.IsEnabled(ModSettingKind.EnemySpeedMultiplier) || Math.Abs(_settingsStore.Current.EnemySpeedMultiplier - 1f) >= 0.001f) { num++; } if (!_settingsStore.IsEnabled(ModSettingKind.EnemyAttackSpeedMultiplier) || Math.Abs(_settingsStore.Current.EnemyAttackSpeedMultiplier - 1f) >= 0.001f) { num++; } if (!_settingsStore.IsEnabled(ModSettingKind.EnemyAggressionMultiplier) || Math.Abs(_settingsStore.Current.EnemyAggressionMultiplier - 1f) >= 0.001f) { num++; } if (!_settingsStore.IsEnabled(ModSettingKind.BossHealthMultiplier) || Math.Abs(_settingsStore.Current.BossHealthMultiplier - 1f) >= 0.001f) { num++; } if (!_settingsStore.IsEnabled(ModSettingKind.BossDamageTakenMultiplier) || Math.Abs(_settingsStore.Current.BossDamageTakenMultiplier - 1f) >= 0.001f) { num++; } if (!_settingsStore.IsEnabled(ModSettingKind.BossSpeedMultiplier) || Math.Abs(_settingsStore.Current.BossSpeedMultiplier - 1f) >= 0.001f) { num++; } if (!_settingsStore.IsEnabled(ModSettingKind.BossAttackSpeedMultiplier) || Math.Abs(_settingsStore.Current.BossAttackSpeedMultiplier - 1f) >= 0.001f) { num++; } if (!_settingsStore.IsEnabled(ModSettingKind.BossBrutalMode) || _settingsStore.Current.BossBrutalMode) { num++; } if (!_settingsStore.IsEnabled(ModSettingKind.DisableHealingDuringBoss) || _settingsStore.Current.DisableHealingDuringBoss) { num++; } if (!_settingsStore.IsEnabled(ModSettingKind.HealingDuringBossMultiplier) || Math.Abs(_settingsStore.Current.HealingDuringBossMultiplier - 1f) >= 0.001f) { num++; } if (!_settingsStore.IsEnabled(ModSettingKind.CoinMultiplier) || Math.Abs(_settingsStore.Current.CoinMultiplier - 1f) >= 0.001f) { num++; } if (!_settingsStore.IsEnabled(ModSettingKind.ShardMultiplier) || Math.Abs(_settingsStore.Current.ShardMultiplier - 1f) >= 0.001f) { num++; } if (!_settingsStore.IsEnabled(ModSettingKind.ShopPriceMultiplier) || Math.Abs(_settingsStore.Current.ShopPriceMultiplier - 1f) >= 0.001f) { num++; } if (!_settingsStore.IsEnabled(ModSettingKind.StationPriceMultiplier) || Math.Abs(_settingsStore.Current.StationPriceMultiplier - 1f) >= 0.001f) { num++; } if (!_settingsStore.IsEnabled(ModSettingKind.DeathRosaryLossPercentage) || _settingsStore.Current.DeathRosaryLossPercentage != 100) { num++; } if (!_settingsStore.IsEnabled(ModSettingKind.HornetSpeedMultiplier) || Math.Abs(_settingsStore.Current.HornetSpeedMultiplier - 1f) >= 0.001f) { num++; } if (!_settingsStore.IsEnabled(ModSettingKind.DashRechargeLevel) || _settingsStore.Current.DashRechargeLevel != 1) { num++; } return num + MutatorCatalog.CountEnabled(_settingsStore.Current); } private void DrawFooter(Rect footerRect) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_011f: Unknown result type (might be due to invalid IL or missing references) //IL_0179: Unknown result type (might be due to invalid IL or missing references) //IL_01a1: Unknown result type (might be due to invalid IL or missing references) //IL_01ce: Unknown result type (might be due to invalid IL or missing references) DrawSolidRect(footerRect, MenuVisualTheme.Sidebar); DrawSolidRect(new Rect(((Rect)(ref footerRect)).x, ((Rect)(ref footerRect)).y, ((Rect)(ref footerRect)).width, 1f), MenuVisualTheme.BorderSubtle); float num = ((Rect)(ref footerRect)).y + 7f; float num2 = 36f; float num3 = Mathf.Clamp(((Rect)(ref footerRect)).width * 0.19f, 190f, 248f); Rect val = default(Rect); ((Rect)(ref val))..ctor(((Rect)(ref footerRect)).xMax - num3 - 10f, num, num3, num2); Rect val2 = default(Rect); ((Rect)(ref val2))..ctor(((Rect)(ref footerRect)).x + 12f, num, 226f, num2); float alpha = 0.72f + (Mathf.Sin(Time.unscaledTime * 2.2f) + 1f) * 0.1f; DrawSolidRect(new Rect(((Rect)(ref val2)).x + 14f, ((Rect)(ref val2)).y + 14f, 7f, 7f), MenuVisualTheme.WithAlpha(MenuVisualTheme.LiveGreen, alpha)); GUI.Label(new Rect(((Rect)(ref val2)).x + 30f, ((Rect)(ref val2)).y, ((Rect)(ref val2)).width - 38f, ((Rect)(ref val2)).height), L("real_time_application", "APLICAÇÃO EM TEMPO REAL"), _shortcutStyle); Rect rect = default(Rect); ((Rect)(ref rect))..ctor(((Rect)(ref val2)).xMax + 12f, num, ((Rect)(ref val)).x - ((Rect)(ref val2)).xMax - 24f, num2); if (((Rect)(ref rect)).width > 250f) { DrawFooterShortcuts(rect); } int changedSettingCount = GetChangedSettingCount(); bool enabled = GUI.enabled; GUI.enabled = enabled && changedSettingCount > 0; SetTooltip(val, (changedSettingCount > 0) ? L("restore_all_tooltip", "Restaurar todas as alterações") : L("nothing_to_restore", "Nenhuma alteração para restaurar")); if (GUI.Button(val, L("restore_all", "↻ RESTAURAR TUDO") + ((changedSettingCount > 0) ? (" · " + changedSettingCount) : string.Empty), _restoreButtonStyle)) { CommitAllFields(); GUI.FocusControl(string.Empty); _focusedControl = string.Empty; _showRestoreConfirmation = true; } GUI.enabled = enabled; } private void DrawFooterShortcuts(Rect rect) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: 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) //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_0118: Unknown result type (might be due to invalid IL or missing references) //IL_014d: Unknown result type (might be due to invalid IL or missing references) //IL_016e: Unknown result type (might be due to invalid IL or missing references) float num = ((Rect)(ref rect)).x + 4f; float num2 = ((Rect)(ref rect)).y + 5f; DrawKeycap(new Rect(num, num2, 28f, 26f), "Q"); DrawKeycap(new Rect(num + 31f, num2, 28f, 26f), "E"); GUI.Label(new Rect(num + 65f, num2, 70f, 26f), L("navigate", "NAVEGAR"), _shortcutStyle); num += 138f; DrawKeycap(new Rect(num, num2, 56f, 26f), "CTRL+F"); GUI.Label(new Rect(num + 61f, num2, 58f, 26f), L("search", "BUSCAR"), _shortcutStyle); num += 124f; DrawKeycap(new Rect(num, num2, 28f, 26f), "F"); GUI.Label(new Rect(num + 33f, num2, 70f, 26f), L("favorite", "FAVORITO"), _shortcutStyle); num += 108f; DrawKeycap(new Rect(num, num2, 61f, 26f), "F8/ESC"); GUI.Label(new Rect(num + 66f, num2, 56f, 26f), L("close", "FECHAR"), _shortcutStyle); } private bool DrawSwitchControl(Rect rect, bool active) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0061: 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) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_0114: Unknown result type (might be due to invalid IL or missing references) //IL_0119: Unknown result type (might be due to invalid IL or missing references) //IL_012d: Unknown result type (might be due to invalid IL or missing references) //IL_0164: Unknown result type (might be due to invalid IL or missing references) //IL_016b: Unknown result type (might be due to invalid IL or missing references) bool flag = Event.current != null && ((Rect)(ref rect)).Contains(Event.current.mousePosition); DrawSolidRect(rect, active ? MenuVisualTheme.Tint(_currentSectionAccent, flag ? 0.2f : 0.14f, 0.98f) : MenuVisualTheme.Field); DrawBorder(rect, active ? MenuVisualTheme.WithAlpha(_currentSectionAccent, 0.58f) : MenuVisualTheme.BorderSubtle, 1f); float num = ((Rect)(ref rect)).height - 10f; Rect rect2 = default(Rect); ((Rect)(ref rect2))..ctor(active ? (((Rect)(ref rect)).xMax - num - 5f) : (((Rect)(ref rect)).x + 5f), ((Rect)(ref rect)).y + 5f, num, num); DrawSolidRect(rect2, active ? _currentSectionAccent : MenuVisualTheme.Disabled); Rect val = default(Rect); ((Rect)(ref val))..ctor(active ? (((Rect)(ref rect)).x + 7f) : (((Rect)(ref rect2)).xMax + 5f), ((Rect)(ref rect)).y, ((Rect)(ref rect)).width - num - 17f, ((Rect)(ref rect)).height); TextAnchor alignment = _switchLabelStyle.alignment; _switchLabelStyle.alignment = (TextAnchor)(active ? 3 : 5); GUI.Label(val, active ? L("enabled_short", "LIG.") : L("disabled_short", "DESL."), _switchLabelStyle); _switchLabelStyle.alignment = alignment; return GUI.Button(rect, GUIContent.none, GUIStyle.none); } private void DrawKeycap(Rect rect, string text) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) DrawSolidRect(rect, MenuVisualTheme.Field); DrawBorder(rect, MenuVisualTheme.BorderSubtle, 1f); GUI.Label(rect, text, _keycapStyle); } private void SetTooltip(Rect rect, string text) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) if (Event.current != null && ((Rect)(ref rect)).Contains(Event.current.mousePosition)) { _tooltipText = text ?? string.Empty; } } private void DrawTooltip(Rect canvasRect) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Expected O, but got Unknown //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_011b: Unknown result type (might be due to invalid IL or missing references) //IL_0130: Unknown result type (might be due to invalid IL or missing references) //IL_013a: Unknown result type (might be due to invalid IL or missing references) //IL_013b: Unknown result type (might be due to invalid IL or missing references) //IL_017e: Unknown result type (might be due to invalid IL or missing references) if (!string.IsNullOrEmpty(_tooltipText) && Event.current != null && !_showRestoreConfirmation) { GUIContent val = new GUIContent(_tooltipText); Vector2 val2 = _tooltipStyle.CalcSize(val); val2.x = Mathf.Clamp(val2.x + 22f, 110f, 360f); val2.y = Mathf.Max(31f, val2.y + 12f); Vector2 mousePosition = Event.current.mousePosition; Rect rect = default(Rect); ((Rect)(ref rect))..ctor(mousePosition.x + 16f, mousePosition.y + 18f, val2.x, val2.y); if (((Rect)(ref rect)).xMax > ((Rect)(ref canvasRect)).xMax - 10f) { ((Rect)(ref rect)).x = mousePosition.x - ((Rect)(ref rect)).width - 12f; } if (((Rect)(ref rect)).yMax > ((Rect)(ref canvasRect)).yMax - 10f) { ((Rect)(ref rect)).y = mousePosition.y - ((Rect)(ref rect)).height - 12f; } DrawSoftShadow(rect); DrawSolidRect(rect, new Color(0.018f, 0.025f, 0.027f, 0.995f)); DrawBorder(rect, MenuVisualTheme.BorderStrong, 1f); GUI.Label(new Rect(((Rect)(ref rect)).x + 11f, ((Rect)(ref rect)).y + 6f, ((Rect)(ref rect)).width - 22f, ((Rect)(ref rect)).height - 12f), _tooltipText, _tooltipStyle); } } private void DrawRestoreConfirmation(Rect canvasRect) { //IL_0000: 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_0066: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Unknown result type (might be due to invalid IL or missing references) //IL_016d: Unknown result type (might be due to invalid IL or missing references) //IL_0197: Unknown result type (might be due to invalid IL or missing references) //IL_01ed: Unknown result type (might be due to invalid IL or missing references) //IL_0212: Unknown result type (might be due to invalid IL or missing references) DrawSolidRect(canvasRect, new Color(0f, 0f, 0f, 0.74f)); Rect rect = default(Rect); ((Rect)(ref rect))..ctor(((Rect)(ref canvasRect)).x + (((Rect)(ref canvasRect)).width - 500f) * 0.5f, ((Rect)(ref canvasRect)).y + (((Rect)(ref canvasRect)).height - 238f) * 0.5f, 500f, 238f); DrawSoftShadow(rect); DrawSolidRect(rect, MenuVisualTheme.SurfaceRaised); DrawBorder(rect, MenuVisualTheme.BorderStrong, 1f); DrawSolidRect(new Rect(((Rect)(ref rect)).x, ((Rect)(ref rect)).y, ((Rect)(ref rect)).width, 3f), MenuVisualTheme.SilkGold); GUI.Label(new Rect(((Rect)(ref rect)).x + 26f, ((Rect)(ref rect)).y + 24f, ((Rect)(ref rect)).width - 52f, 34f), L("restore_confirm_title", "Restaurar todas as configurações?"), _sectionTitleStyle); GUI.Label(new Rect(((Rect)(ref rect)).x + 26f, ((Rect)(ref rect)).y + 67f, ((Rect)(ref rect)).width - 52f, 62f), L("restore_confirm_description", "Todas as alterações do perfil atual voltarão aos valores padrão. Favoritos e arquivos de preset serão preservados."), _descriptionStyle); DrawStatusChip(new Rect(((Rect)(ref rect)).x + 26f, ((Rect)(ref rect)).y + 133f, 154f, 30f), GetChangedSettingCount() + " " + L("changes", "alterações"), MenuVisualTheme.SignalCyan); float num = ((Rect)(ref rect)).yMax - 54f; Rect val = default(Rect); ((Rect)(ref val))..ctor(((Rect)(ref rect)).xMax - 252f, num, 104f, 36f); Rect val2 = default(Rect); ((Rect)(ref val2))..ctor(((Rect)(ref rect)).xMax - 138f, num, 112f, 36f); if (GUI.Button(val, L("cancel", "CANCELAR"), _buttonStyle)) { _showRestoreConfirmation = false; } if (GUI.Button(val2, L("restore", "RESTAURAR"), _restoreButtonStyle)) { _settingsStore.RestoreDefaults(); SyncTextFromSettings(); GUI.FocusControl(string.Empty); _focusedControl = string.Empty; _showRestoreConfirmation = false; } } private bool IsSettingChanged(ModSettingKind setting) { if (!_settingsStore.IsEnabled(setting)) { return true; } return !string.Equals(NormalizeValueText(GetText(setting)), NormalizeValueText(GetDefaultValueText(setting)), StringComparison.OrdinalIgnoreCase); } private static string NormalizeValueText(string value) { return (value ?? string.Empty).Trim().Replace(" ", string.Empty).Replace('.', ','); } private static string FitTextWithEllipsis(string value, float width, float height, GUIStyle style) { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Expected O, but got Unknown //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Expected O, but got Unknown string text = value ?? string.Empty; if (text.Length == 0 || style == null || style.CalcHeight(new GUIContent(text), width) <= height) { return text; } int num = 0; int num2 = text.Length; while (num < num2) { int num3 = (num + num2 + 1) / 2; string text2 = text.Substring(0, num3).TrimEnd(new char[0]) + "…"; if (style.CalcHeight(new GUIContent(text2), width) <= height) { num = num3; } else { num2 = num3 - 1; } } return text.Substring(0, Mathf.Max(0, num)).TrimEnd(new char[0]) + "…"; } private void HandleTextFieldFocus() { string text = GUI.GetNameOfFocusedControl() ?? string.Empty; if (IsValueControl(_focusedControl) && !string.Equals(_focusedControl, text, StringComparison.Ordinal)) { CommitField(GetSettingForControl(_focusedControl)); } _focusedControl = text; } private void HandleSubmitKey() { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Invalid comparison between Unknown and I4 //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Invalid comparison between Unknown and I4 //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Invalid comparison between Unknown and I4 Event current = Event.current; if (current == null || (int)current.type != 4 || ((int)current.keyCode != 13 && (int)current.keyCode != 271)) { return; } string text = GUI.GetNameOfFocusedControl() ?? string.Empty; if (string.Equals(text, "CustomDifficultyNavigationSearch", StringComparison.Ordinal)) { int num = FindFirstMatchingSectionIndex(); if (num >= 0) { SelectSection(num); } current.Use(); } else if (IsValueControl(text)) { CommitField(GetSettingForControl(text)); GUI.FocusControl(string.Empty); _focusedControl = string.Empty; current.Use(); } } private void AdjustSetting(ModSettingKind setting, int direction) { if (SilkSkillSettingCatalog.IsSilkSkillSetting(setting)) { _settingsStore.SetSilkSkillValue(setting, _settingsStore.GetSilkSkillValue(setting) + (float)direction * SilkSkillSettingCatalog.GetStep(setting)); } else { switch (setting) { case ModSettingKind.MaximumHealth: _settingsStore.SetMaximumHealth(_settingsStore.Current.MaximumHealth + direction); break; case ModSettingKind.NeedleDamage: _settingsStore.SetNeedleDamage(_settingsStore.Current.NeedleDamage + direction); break; case ModSettingKind.NeedleUpgradePercentage: _settingsStore.SetNeedleUpgradePercentage(_settingsStore.Current.NeedleUpgradePercentage + direction); break; case ModSettingKind.SilkSpearDamageMultiplier: _settingsStore.SetSilkSpearDamageMultiplier(_settingsStore.Current.SilkSpearDamageMultiplier + direction); break; case ModSettingKind.SilkSpearSilkCost: _settingsStore.SetSilkSpearSilkCost(_settingsStore.Current.SilkSpearSilkCost + direction); break; case ModSettingKind.DamageTakenMultiplier: _settingsStore.SetDamageTakenMultiplier(_settingsStore.Current.DamageTakenMultiplier + (float)direction); break; case ModSettingKind.EnvironmentalDamageMultiplier: _settingsStore.SetEnvironmentalDamageMultiplier(_settingsStore.Current.EnvironmentalDamageMultiplier + (float)direction); break; case ModSettingKind.OneHitMode: _settingsStore.SetOneHitMode(direction > 0); break; case ModSettingKind.HealingAmount: _settingsStore.SetHealingAmount(_settingsStore.Current.HealingAmount + direction); break; case ModSettingKind.HealingCost: _settingsStore.SetHealingCost(_settingsStore.Current.HealingCost + direction); break; case ModSettingKind.InvincibilityTimeMultiplier: _settingsStore.SetInvincibilityTimeMultiplier(_settingsStore.Current.InvincibilityTimeMultiplier + (float)direction * 0.1f); break; case ModSettingKind.EnemyHealthMultiplier: _settingsStore.SetEnemyHealthMultiplier(_settingsStore.Current.EnemyHealthMultiplier + (float)direction * 0.1f); break; case ModSettingKind.EnemySpeedMultiplier: _settingsStore.SetEnemySpeedMultiplier(_settingsStore.Current.EnemySpeedMultiplier + (float)direction * 0.1f); break; case ModSettingKind.EnemyAttackSpeedMultiplier: _settingsStore.SetEnemyAttackSpeedMultiplier(_settingsStore.Current.EnemyAttackSpeedMultiplier + (float)direction * 0.1f); break; case ModSettingKind.EnemyAggressionMultiplier: _settingsStore.SetEnemyAggressionMultiplier(_settingsStore.Current.EnemyAggressionMultiplier + (float)direction * 0.1f); break; case ModSettingKind.BossHealthMultiplier: _settingsStore.SetBossHealthMultiplier(_settingsStore.Current.BossHealthMultiplier + (float)direction * 0.1f); break; case ModSettingKind.BossDamageTakenMultiplier: _settingsStore.SetBossDamageTakenMultiplier(_settingsStore.Current.BossDamageTakenMultiplier + (float)direction * 0.1f); break; case ModSettingKind.BossSpeedMultiplier: _settingsStore.SetBossSpeedMultiplier(_settingsStore.Current.BossSpeedMultiplier + (float)direction * 0.1f); break; case ModSettingKind.BossAttackSpeedMultiplier: _settingsStore.SetBossAttackSpeedMultiplier(_settingsStore.Current.BossAttackSpeedMultiplier + (float)direction * 0.1f); break; case ModSettingKind.BossBrutalMode: _settingsStore.SetBossBrutalMode(direction > 0); break; case ModSettingKind.DisableHealingDuringBoss: _settingsStore.SetDisableHealingDuringBoss(direction > 0); break; case ModSettingKind.HealingDuringBossMultiplier: _settingsStore.SetHealingDuringBossMultiplier(_settingsStore.Current.HealingDuringBossMultiplier + (float)direction * 0.1f); break; case ModSettingKind.CoinMultiplier: _settingsStore.SetCoinMultiplier(_settingsStore.Current.CoinMultiplier + (float)direction * 0.1f); break; case ModSettingKind.ShopPriceMultiplier: _settingsStore.SetShopPriceMultiplier(_settingsStore.Current.ShopPriceMultiplier + (float)direction * 0.1f); break; case ModSettingKind.DeathRosaryLossPercentage: _settingsStore.SetDeathRosaryLossPercentage(_settingsStore.Current.DeathRosaryLossPercentage + direction); break; case ModSettingKind.HornetSpeedMultiplier: _settingsStore.SetHornetSpeedMultiplier(_settingsStore.Current.HornetSpeedMultiplier + (float)direction * 0.1f); break; case ModSettingKind.DashRechargeLevel: _settingsStore.SetDashRechargeLevel(_settingsStore.Current.DashRechargeLevel + direction); break; case ModSettingKind.StationPriceMultiplier: _settingsStore.SetStationPriceMultiplier(_settingsStore.Current.StationPriceMultiplier + (float)direction * 0.1f); break; default: _settingsStore.SetShardMultiplier(_settingsStore.Current.ShardMultiplier + (float)direction * 0.1f); break; } } SyncTextFromSettings(); } private void CommitAllFields() { CommitField(ModSettingKind.MaximumHealth); CommitField(ModSettingKind.NeedleDamage); CommitField(ModSettingKind.NeedleUpgradePercentage); for (int i = 0; i < SilkSkillSettingCatalog.AllSettings.Length; i++) { CommitField(SilkSkillSettingCatalog.AllSettings[i]); } CommitField(ModSettingKind.DamageTakenMultiplier); CommitField(ModSettingKind.EnvironmentalDamageMultiplier); CommitField(ModSettingKind.OneHitMode); CommitField(ModSettingKind.HealingAmount); CommitField(ModSettingKind.HealingCost); CommitField(ModSettingKind.InvincibilityTimeMultiplier); CommitField(ModSettingKind.EnemyHealthMultiplier); CommitField(ModSettingKind.EnemySpeedMultiplier); CommitField(ModSettingKind.EnemyAttackSpeedMultiplier); CommitField(ModSettingKind.EnemyAggressionMultiplier); for (int j = 0; j < BossSettings.Length; j++) { CommitField(BossSettings[j]); } CommitField(ModSettingKind.CoinMultiplier); CommitField(ModSettingKind.ShardMultiplier); CommitField(ModSettingKind.ShopPriceMultiplier); CommitField(ModSettingKind.StationPriceMultiplier); CommitField(ModSettingKind.DeathRosaryLossPercentage); CommitField(ModSettingKind.HornetSpeedMultiplier); CommitField(ModSettingKind.DashRechargeLevel); } private void CommitField(ModSettingKind setting) { if (SilkSkillSettingCatalog.IsSilkSkillSetting(setting)) { _settingsStore.SetSilkSkillValue(setting, SilkSkillSettingCatalog.Parse(setting, GetText(setting))); SetText(setting, GetFormattedSetting(setting)); return; } switch (setting) { case ModSettingKind.MaximumHealth: _settingsStore.SetMaximumHealth(ValueValidator.ParseHealthOrClamp(_healthText)); break; case ModSettingKind.NeedleDamage: _settingsStore.SetNeedleDamage(ValueValidator.ParseNeedleDamageOrClamp(_needleText)); break; case ModSettingKind.NeedleUpgradePercentage: _settingsStore.SetNeedleUpgradePercentage(ValueValidator.ParseNeedleUpgradePercentageOrClamp(_needleUpgradePercentageText)); break; case ModSettingKind.SilkSpearDamageMultiplier: _settingsStore.SetSilkSpearDamageMultiplier(ValueValidator.ParseSilkSpearDamageMultiplierOrClamp(_silkSpearDamageText)); break; case ModSettingKind.SilkSpearSilkCost: _settingsStore.SetSilkSpearSilkCost(ValueValidator.ParseSilkSpearSilkCostOrClamp(_silkSpearSilkCostText)); break; case ModSettingKind.DamageTakenMultiplier: _settingsStore.SetDamageTakenMultiplier(ValueValidator.ParseDamageMultiplierOrClamp(_damageTakenText)); break; case ModSettingKind.EnvironmentalDamageMultiplier: _settingsStore.SetEnvironmentalDamageMultiplier(ValueValidator.ParseDamageMultiplierOrClamp(_environmentalDamageText)); break; case ModSettingKind.OneHitMode: _settingsStore.SetOneHitMode(ValueValidator.ParseBooleanOrFalse(_oneHitText)); break; case ModSettingKind.HealingAmount: _settingsStore.SetHealingAmount(ValueValidator.ParseHealingAmountOrClamp(_healingText)); break; case ModSettingKind.HealingCost: _settingsStore.SetHealingCost(ValueValidator.ParseHealingCostOrClamp(_healingCostText)); break; case ModSettingKind.InvincibilityTimeMultiplier: _settingsStore.SetInvincibilityTimeMultiplier(ValueValidator.ParseMultiplierOrClamp(_invincibilityTimeText)); break; case ModSettingKind.EnemyHealthMultiplier: _settingsStore.SetEnemyHealthMultiplier(ValueValidator.ParseMultiplierOrClamp(_enemyHealthText)); break; case ModSettingKind.EnemySpeedMultiplier: _settingsStore.SetEnemySpeedMultiplier(ValueValidator.ParseEnemySpeedMultiplierOrClamp(_enemySpeedText)); break; case ModSettingKind.EnemyAttackSpeedMultiplier: _settingsStore.SetEnemyAttackSpeedMultiplier(ValueValidator.ParseMultiplierOrClamp(_enemyAttackSpeedText)); break; case ModSettingKind.EnemyAggressionMultiplier: _settingsStore.SetEnemyAggressionMultiplier(ValueValidator.ParseMultiplierOrClamp(_enemyAggressionText)); break; case ModSettingKind.BossHealthMultiplier: _settingsStore.SetBossHealthMultiplier(ValueValidator.ParseMultiplierOrClamp(GetText(setting))); break; case ModSettingKind.BossDamageTakenMultiplier: _settingsStore.SetBossDamageTakenMultiplier(ValueValidator.ParseMultiplierOrClamp(GetText(setting))); break; case ModSettingKind.BossSpeedMultiplier: _settingsStore.SetBossSpeedMultiplier(ValueValidator.ParseEnemySpeedMultiplierOrClamp(GetText(setting))); break; case ModSettingKind.BossAttackSpeedMultiplier: _settingsStore.SetBossAttackSpeedMultiplier(ValueValidator.ParseBossAttackSpeedMultiplierOrClamp(GetText(setting))); break; case ModSettingKind.BossBrutalMode: _settingsStore.SetBossBrutalMode(ValueValidator.ParseBooleanOrFalse(GetText(setting))); break; case ModSettingKind.DisableHealingDuringBoss: _settingsStore.SetDisableHealingDuringBoss(ValueValidator.ParseBooleanOrFalse(GetText(setting))); break; case ModSettingKind.HealingDuringBossMultiplier: _settingsStore.SetHealingDuringBossMultiplier(ValueValidator.ParseMultiplierOrClamp(GetText(setting))); break; case ModSettingKind.CoinMultiplier: _settingsStore.SetCoinMultiplier(ValueValidator.ParseMultiplierOrClamp(_coinText)); break; case ModSettingKind.DeathRosaryLossPercentage: _settingsStore.SetDeathRosaryLossPercentage(ValueValidator.ParseDeathRosaryLossPercentageOrClamp(_deathRosaryLossText)); break; case ModSettingKind.HornetSpeedMultiplier: _settingsStore.SetHornetSpeedMultiplier(ValueValidator.ParseHornetSpeedMultiplierOrClamp(_hornetSpeedText)); break; case ModSettingKind.DashRechargeLevel: _settingsStore.SetDashRechargeLevel(ValueValidator.ParseDashRechargeLevelOrClamp(_dashRechargeText)); break; case ModSettingKind.ShopPriceMultiplier: _settingsStore.SetShopPriceMultiplier(ValueValidator.ParsePriceMultiplierOrClamp(_shopPriceText)); break; case ModSettingKind.StationPriceMultiplier: _settingsStore.SetStationPriceMultiplier(ValueValidator.ParsePriceMultiplierOrClamp(_stationPriceText)); break; default: _settingsStore.SetShardMultiplier(ValueValidator.ParseMultiplierOrClamp(_shardText)); break; } SetText(setting, GetFormattedSetting(setting)); } private void SyncTextFromSettings() { _healthText = ValueValidator.FormatHealth(_settingsStore.Current.MaximumHealth); _needleText = ValueValidator.FormatNeedleDamage(_settingsStore.Current.NeedleDamage); _needleUpgradePercentageText = ValueValidator.FormatNeedleUpgradePercentage(_settingsStore.Current.NeedleUpgradePercentage); _silkSpearDamageText = ValueValidator.FormatSilkSpearDamageMultiplier(_settingsStore.Current.SilkSpearDamageMultiplier); _silkSpearSilkCostText = ValueValidator.FormatSilkSpearSilkCost(_settingsStore.Current.SilkSpearSilkCost); for (int i = 0; i < SilkSkillSettingCatalog.AllSettings.Length; i++) { ModSettingKind modSettingKind = SilkSkillSettingCatalog.AllSettings[i]; _silkSkillTexts[modSettingKind] = SilkSkillSettingCatalog.Format(modSettingKind, _settingsStore.GetSilkSkillValue(modSettingKind)); } _damageTakenText = ValueValidator.FormatDamageMultiplier(_settingsStore.Current.DamageTakenMultiplier); _environmentalDamageText = ValueValidator.FormatDamageMultiplier(_settingsStore.Current.EnvironmentalDamageMultiplier); _oneHitText = ValueValidator.FormatOneHit(_settingsStore.Current.OneHitMode); _healingText = ValueValidator.FormatHealingAmount(_settingsStore.Current.HealingAmount); _healingCostText = ValueValidator.FormatHealingCost(_settingsStore.Current.HealingCost); _invincibilityTimeText = ValueValidator.FormatMultiplier(_settingsStore.Current.InvincibilityTimeMultiplier); _enemyHealthText = ValueValidator.FormatMultiplier(_settingsStore.Current.EnemyHealthMultiplier); _enemySpeedText = ValueValidator.FormatEnemySpeedMultiplier(_settingsStore.Current.EnemySpeedMultiplier); _enemyAttackSpeedText = ValueValidator.FormatMultiplier(_settingsStore.Current.EnemyAttackSpeedMultiplier); _enemyAggressionText = ValueValidator.FormatMultiplier(_settingsStore.Current.EnemyAggressionMultiplier); for (int j = 0; j < BossSettings.Length; j++) { ModSettingKind modSettingKind2 = BossSettings[j]; _bossSettingTexts[modSettingKind2] = GetFormattedSetting(modSettingKind2); } _coinText = ValueValidator.FormatMultiplier(_settingsStore.Current.CoinMultiplier); _shardText = ValueValidator.FormatMultiplier(_settingsStore.Current.ShardMultiplier); _shopPriceText = ValueValidator.FormatPriceMultiplier(_settingsStore.Current.ShopPriceMultiplier); _stationPriceText = ValueValidator.FormatPriceMultiplier(_settingsStore.Current.StationPriceMultiplier); _deathRosaryLossText = ValueValidator.FormatDeathRosaryLossPercentage(_settingsStore.Current.DeathRosaryLossPercentage); _hornetSpeedText = ValueValidator.FormatHornetSpeedMultiplier(_settingsStore.Current.HornetSpeedMultiplier); _dashRechargeText = ValueValidator.FormatDashRechargeLevel(_settingsStore.Current.DashRechargeLevel); } private string GetFormattedSetting(ModSettingKind setting) { if (SilkSkillSettingCatalog.IsSilkSkillSetting(setting)) { return SilkSkillSettingCatalog.Format(setting, _settingsStore.GetSilkSkillValue(setting)); } return setting switch { ModSettingKind.MaximumHealth => ValueValidator.FormatHealth(_settingsStore.Current.MaximumHealth), ModSettingKind.NeedleDamage => ValueValidator.FormatNeedleDamage(_settingsStore.Current.NeedleDamage), ModSettingKind.NeedleUpgradePercentage => ValueValidator.FormatNeedleUpgradePercentage(_settingsStore.Current.NeedleUpgradePercentage), ModSettingKind.SilkSpearDamageMultiplier => ValueValidator.FormatSilkSpearDamageMultiplier(_settingsStore.Current.SilkSpearDamageMultiplier), ModSettingKind.SilkSpearSilkCost => ValueValidator.FormatSilkSpearSilkCost(_settingsStore.Current.SilkSpearSilkCost), ModSettingKind.DamageTakenMultiplier => ValueValidator.FormatDamageMultiplier(_settingsStore.Current.DamageTakenMultiplier), ModSettingKind.EnvironmentalDamageMultiplier => ValueValidator.FormatDamageMultiplier(_settingsStore.Current.EnvironmentalDamageMultiplier), ModSettingKind.OneHitMode => ValueValidator.FormatOneHit(_settingsStore.Current.OneHitMode), ModSettingKind.HealingAmount => ValueValidator.FormatHealingAmount(_settingsStore.Current.HealingAmount), ModSettingKind.HealingCost => ValueValidator.FormatHealingCost(_settingsStore.Current.HealingCost), ModSettingKind.InvincibilityTimeMultiplier => ValueValidator.FormatMultiplier(_settingsStore.Current.InvincibilityTimeMultiplier), ModSettingKind.EnemyHealthMultiplier => ValueValidator.FormatMultiplier(_settingsStore.Current.EnemyHealthMultiplier), ModSettingKind.EnemySpeedMultiplier => ValueValidator.FormatEnemySpeedMultiplier(_settingsStore.Current.EnemySpeedMultiplier), ModSettingKind.EnemyAttackSpeedMultiplier => ValueValidator.FormatMultiplier(_settingsStore.Current.EnemyAttackSpeedMultiplier), ModSettingKind.EnemyAggressionMultiplier => ValueValidator.FormatMultiplier(_settingsStore.Current.EnemyAggressionMultiplier), ModSettingKind.BossHealthMultiplier => ValueValidator.FormatMultiplier(_settingsStore.Current.BossHealthMultiplier), ModSettingKind.BossDamageTakenMultiplier => ValueValidator.FormatMultiplier(_settingsStore.Current.BossDamageTakenMultiplier), ModSettingKind.BossSpeedMultiplier => ValueValidator.FormatEnemySpeedMultiplier(_settingsStore.Current.BossSpeedMultiplier), ModSettingKind.BossAttackSpeedMultiplier => ValueValidator.FormatMultiplier(_settingsStore.Current.BossAttackSpeedMultiplier), ModSettingKind.BossBrutalMode => ValueValidator.FormatOneHit(_settingsStore.Current.BossBrutalMode), ModSettingKind.DisableHealingDuringBoss => ValueValidator.FormatOneHit(_settingsStore.Current.DisableHealingDuringBoss), ModSettingKind.HealingDuringBossMultiplier => ValueValidator.FormatMultiplier(_settingsStore.Current.HealingDuringBossMultiplier), ModSettingKind.CoinMultiplier => ValueValidator.FormatMultiplier(_settingsStore.Current.CoinMultiplier), ModSettingKind.DeathRosaryLossPercentage => ValueValidator.FormatDeathRosaryLossPercentage(_settingsStore.Current.DeathRosaryLossPercentage), ModSettingKind.HornetSpeedMultiplier => ValueValidator.FormatHornetSpeedMultiplier(_settingsStore.Current.HornetSpeedMultiplier), ModSettingKind.DashRechargeLevel => ValueValidator.FormatDashRechargeLevel(_settingsStore.Current.DashRechargeLevel), ModSettingKind.ShopPriceMultiplier => ValueValidator.FormatPriceMultiplier(_settingsStore.Current.ShopPriceMultiplier), ModSettingKind.StationPriceMultiplier => ValueValidator.FormatPriceMultiplier(_settingsStore.Current.StationPriceMultiplier), _ => ValueValidator.FormatMultiplier(_settingsStore.Current.ShardMultiplier), }; } private string GetText(ModSettingKind setting) { if (SilkSkillSettingCatalog.IsSilkSkillSetting(setting)) { if (!_silkSkillTexts.TryGetValue(setting, out var value)) { return GetFormattedSetting(setting); } return value; } if (IsBossSetting(setting)) { if (!_bossSettingTexts.TryGetValue(setting, out var value2)) { return GetFormattedSetting(setting); } return value2; } return setting switch { ModSettingKind.MaximumHealth => _healthText, ModSettingKind.NeedleDamage => _needleText, ModSettingKind.NeedleUpgradePercentage => _needleUpgradePercentageText, ModSettingKind.SilkSpearDamageMultiplier => _silkSpearDamageText, ModSettingKind.SilkSpearSilkCost => _silkSpearSilkCostText, ModSettingKind.DamageTakenMultiplier => _damageTakenText, ModSettingKind.EnvironmentalDamageMultiplier => _environmentalDamageText, ModSettingKind.OneHitMode => _oneHitText, ModSettingKind.HealingAmount => _healingText, ModSettingKind.HealingCost => _healingCostText, ModSettingKind.InvincibilityTimeMultiplier => _invincibilityTimeText, ModSettingKind.EnemyHealthMultiplier => _enemyHealthText, ModSettingKind.EnemySpeedMultiplier => _enemySpeedText, ModSettingKind.EnemyAttackSpeedMultiplier => _enemyAttackSpeedText, ModSettingKind.EnemyAggressionMultiplier => _enemyAggressionText, ModSettingKind.CoinMultiplier => _coinText, ModSettingKind.DeathRosaryLossPercentage => _deathRosaryLossText, ModSettingKind.HornetSpeedMultiplier => _hornetSpeedText, ModSettingKind.DashRechargeLevel => _dashRechargeText, ModSettingKind.ShopPriceMultiplier => _shopPriceText, ModSettingKind.StationPriceMultiplier => _stationPriceText, _ => _shardText, }; } private void SetText(ModSettingKind setting, string value) { if (SilkSkillSettingCatalog.IsSilkSkillSetting(setting)) { _silkSkillTexts[setting] = value; return; } if (IsBossSetting(setting)) { _bossSettingTexts[setting] = value; return; } switch (setting) { case ModSettingKind.MaximumHealth: _healthText = value; break; case ModSettingKind.NeedleDamage: _needleText = value; break; case ModSettingKind.NeedleUpgradePercentage: _needleUpgradePercentageText = value; break; case ModSettingKind.SilkSpearDamageMultiplier: _silkSpearDamageText = value; break; case ModSettingKind.SilkSpearSilkCost: _silkSpearSilkCostText = value; break; case ModSettingKind.DamageTakenMultiplier: _damageTakenText = value; break; case ModSettingKind.EnvironmentalDamageMultiplier: _environmentalDamageText = value; break; case ModSettingKind.OneHitMode: _oneHitText = value; break; case ModSettingKind.HealingAmount: _healingText = value; break; case ModSettingKind.HealingCost: _healingCostText = value; break; case ModSettingKind.InvincibilityTimeMultiplier: _invincibilityTimeText = value; break; case ModSettingKind.EnemyHealthMultiplier: _enemyHealthText = value; break; case ModSettingKind.EnemySpeedMultiplier: _enemySpeedText = value; break; case ModSettingKind.EnemyAttackSpeedMultiplier: _enemyAttackSpeedText = value; break; case ModSettingKind.EnemyAggressionMultiplier: _enemyAggressionText = value; break; case ModSettingKind.CoinMultiplier: _coinText = value; break; case ModSettingKind.DeathRosaryLossPercentage: _deathRosaryLossText = value; break; case ModSettingKind.HornetSpeedMultiplier: _hornetSpeedText = value; break; case ModSettingKind.DashRechargeLevel: _dashRechargeText = value; break; case ModSettingKind.ShopPriceMultiplier: _shopPriceText = value; break; case ModSettingKind.StationPriceMultiplier: _stationPriceText = value; break; default: _shardText = value; break; } } private static string GetControlName(ModSettingKind setting) { if (SilkSkillSettingCatalog.IsSilkSkillSetting(setting)) { return SilkSkillSettingCatalog.GetControlName(setting); } if (IsBossSetting(setting)) { return "CustomDifficultyBoss" + setting; } return setting switch { ModSettingKind.MaximumHealth => "CustomDifficultyHealth", ModSettingKind.NeedleDamage => "CustomDifficultyNeedle", ModSettingKind.NeedleUpgradePercentage => "CustomDifficultyNeedleUpgradePercentage", ModSettingKind.SilkSpearDamageMultiplier => "CustomDifficultySilkSpearDamage", ModSettingKind.SilkSpearSilkCost => "CustomDifficultySilkSpearSilkCost", ModSettingKind.DamageTakenMultiplier => "CustomDifficultyDamageTaken", ModSettingKind.EnvironmentalDamageMultiplier => "CustomDifficultyEnvironmentalDamage", ModSettingKind.OneHitMode => "CustomDifficultyOneHit", ModSettingKind.HealingAmount => "CustomDifficultyHealing", ModSettingKind.HealingCost => "CustomDifficultyHealingCost", ModSettingKind.InvincibilityTimeMultiplier => "CustomDifficultyInvincibilityTime", ModSettingKind.EnemyHealthMultiplier => "CustomDifficultyEnemyHealth", ModSettingKind.EnemySpeedMultiplier => "CustomDifficultyEnemySpeed", ModSettingKind.EnemyAttackSpeedMultiplier => "CustomDifficultyEnemyAttackSpeed", ModSettingKind.EnemyAggressionMultiplier => "CustomDifficultyEnemyAggression", ModSettingKind.CoinMultiplier => "CustomDifficultyCoin", ModSettingKind.DeathRosaryLossPercentage => "CustomDifficultyDeathRosaryLoss", ModSettingKind.HornetSpeedMultiplier => "CustomDifficultyHornetSpeed", ModSettingKind.DashRechargeLevel => "CustomDifficultyDashRecharge", ModSettingKind.ShopPriceMultiplier => "CustomDifficultyShopPrice", ModSettingKind.StationPriceMultiplier => "CustomDifficultyStationPrice", _ => "CustomDifficultyShard", }; } private static ModSettingKind GetSettingForControl(string controlName) { if (SilkSkillSettingCatalog.TryGetSettingForControl(controlName, out var setting)) { return setting; } if (!string.IsNullOrEmpty(controlName) && controlName.StartsWith("CustomDifficultyBoss", StringComparison.Ordinal) && Enum.TryParse(controlName.Substring("CustomDifficultyBoss".Length), out var result) && IsBossSetting(result)) { return result; } if (string.Equals(controlName, "CustomDifficultyHealth", StringComparison.Ordinal)) { return ModSettingKind.MaximumHealth; } if (string.Equals(controlName, "CustomDifficultyNeedle", StringComparison.Ordinal)) { return ModSettingKind.NeedleDamage; } if (string.Equals(controlName, "CustomDifficultyNeedleUpgradePercentage", StringComparison.Ordinal)) { return ModSettingKind.NeedleUpgradePercentage; } if (string.Equals(controlName, "CustomDifficultySilkSpearDamage", StringComparison.Ordinal)) { return ModSettingKind.SilkSpearDamageMultiplier; } if (string.Equals(controlName, "CustomDifficultySilkSpearSilkCost", StringComparison.Ordinal)) { return ModSettingKind.SilkSpearSilkCost; } if (string.Equals(controlName, "CustomDifficultyDamageTaken", StringComparison.Ordinal)) { return ModSettingKind.DamageTakenMultiplier; } if (string.Equals(controlName, "CustomDifficultyEnvironmentalDamage", StringComparison.Ordinal)) { return ModSettingKind.EnvironmentalDamageMultiplier; } if (string.Equals(controlName, "CustomDifficultyOneHit", StringComparison.Ordinal)) { return ModSettingKind.OneHitMode; } if (string.Equals(controlName, "CustomDifficultyHealing", StringComparison.Ordinal)) { return ModSettingKind.HealingAmount; } if (string.Equals(controlName, "CustomDifficultyHealingCost", StringComparison.Ordinal)) { return ModSettingKind.HealingCost; } if (string.Equals(controlName, "CustomDifficultyInvincibilityTime", StringComparison.Ordinal)) { return ModSettingKind.InvincibilityTimeMultiplier; } if (string.Equals(controlName, "CustomDifficultyEnemyHealth", StringComparison.Ordinal)) { return ModSettingKind.EnemyHealthMultiplier; } if (string.Equals(controlName, "CustomDifficultyEnemySpeed", StringComparison.Ordinal)) { return ModSettingKind.EnemySpeedMultiplier; } if (string.Equals(controlName, "CustomDifficultyEnemyAttackSpeed", StringComparison.Ordinal)) { return ModSettingKind.EnemyAttackSpeedMultiplier; } if (string.Equals(controlName, "CustomDifficultyEnemyAggression", StringComparison.Ordinal)) { return ModSettingKind.EnemyAggressionMultiplier; } if (string.Equals(controlName, "CustomDifficultyDeathRosaryLoss", StringComparison.Ordinal)) { return ModSettingKind.DeathRosaryLossPercentage; } if (string.Equals(controlName, "CustomDifficultyHornetSpeed", StringComparison.Ordinal)) { return ModSettingKind.HornetSpeedMultiplier; } if (string.Equals(controlName, "CustomDifficultyDashRecharge", StringComparison.Ordinal)) { return ModSettingKind.DashRechargeLevel; } if (string.Equals(controlName, "CustomDifficultyShopPrice", StringComparison.Ordinal)) { return ModSettingKind.ShopPriceMultiplier; } if (string.Equals(controlName, "CustomDifficultyStationPrice", StringComparison.Ordinal)) { return ModSettingKind.StationPriceMultiplier; } if (!string.Equals(controlName, "CustomDifficultyCoin", StringComparison.Ordinal)) { return ModSettingKind.ShardMultiplier; } return ModSettingKind.CoinMultiplier; } private static bool IsValueControl(string controlName) { if (!SilkSkillSettingCatalog.TryGetSettingForControl(controlName, out var _) && (string.IsNullOrEmpty(controlName) || !controlName.StartsWith("CustomDifficultyBoss", StringComparison.Ordinal)) && !string.Equals(controlName, "CustomDifficultyHealth", StringComparison.Ordinal) && !string.Equals(controlName, "CustomDifficultyNeedle", StringComparison.Ordinal) && !string.Equals(controlName, "CustomDifficultyNeedleUpgradePercentage", StringComparison.Ordinal) && !string.Equals(controlName, "CustomDifficultySilkSpearDamage", StringComparison.Ordinal) && !string.Equals(controlName, "CustomDifficultySilkSpearSilkCost", StringComparison.Ordinal) && !string.Equals(controlName, "CustomDifficultyDamageTaken", StringComparison.Ordinal) && !string.Equals(controlName, "CustomDifficultyEnvironmentalDamage", StringComparison.Ordinal) && !string.Equals(controlName, "CustomDifficultyOneHit", StringComparison.Ordinal) && !string.Equals(controlName, "CustomDifficultyHealing", StringComparison.Ordinal) && !string.Equals(controlName, "CustomDifficultyHealingCost", StringComparison.Ordinal) && !string.Equals(controlName, "CustomDifficultyInvincibilityTime", StringComparison.Ordinal) && !string.Equals(controlName, "CustomDifficultyEnemyHealth", StringComparison.Ordinal) && !string.Equals(controlName, "CustomDifficultyEnemySpeed", StringComparison.Ordinal) && !string.Equals(controlName, "CustomDifficultyEnemyAttackSpeed", StringComparison.Ordinal) && !string.Equals(controlName, "CustomDifficultyEnemyAggression", StringComparison.Ordinal) && !string.Equals(controlName, "CustomDifficultyDeathRosaryLoss", StringComparison.Ordinal) && !string.Equals(controlName, "CustomDifficultyHornetSpeed", StringComparison.Ordinal) && !string.Equals(controlName, "CustomDifficultyDashRecharge", StringComparison.Ordinal) && !string.Equals(controlName, "CustomDifficultyCoin", StringComparison.Ordinal) && !string.Equals(controlName, "CustomDifficultyShard", StringComparison.Ordinal) && !string.Equals(controlName, "CustomDifficultyShopPrice", StringComparison.Ordinal)) { return string.Equals(controlName, "CustomDifficultyStationPrice", StringComparison.Ordinal); } return true; } private static bool IsBossSetting(ModSettingKind setting) { switch (setting) { case ModSettingKind.BossHealthMultiplier: case ModSettingKind.BossDamageTakenMultiplier: case ModSettingKind.BossSpeedMultiplier: case ModSettingKind.BossAttackSpeedMultiplier: case ModSettingKind.BossBrutalMode: case ModSettingKind.DisableHealingDuringBoss: case ModSettingKind.HealingDuringBossMultiplier: return true; default: return false; } } private static string GetFavoriteLabel(ModSettingKind setting) { return setting switch { ModSettingKind.MaximumHealth => "VIDA MÁXIMA", ModSettingKind.NeedleDamage => "DANO DA AGULHA", ModSettingKind.NeedleUpgradePercentage => "AUMENTO POR MELHORIA (%)", ModSettingKind.SilkSpearSilkCost => "LANÇA DE SEDA — CUSTO DE SEDA", ModSettingKind.SilkSpearDamageMultiplier => "LANÇA DE SEDA — DANO", ModSettingKind.ThreadStormSilkCost => "TURBILHÃO DE FIOS — CUSTO DE SEDA", ModSettingKind.ThreadStormNormalHitMultiplier => "TURBILHÃO DE FIOS — DANO INICIAL", ModSettingKind.ThreadStormLateHitMultiplier => "TURBILHÃO DE FIOS — DANO FINAL", ModSettingKind.CrossStitchSilkCost => "PONTO CRUZ — CUSTO DE SEDA", ModSettingKind.CrossStitchHitMultiplier => "PONTO CRUZ — DANO", ModSettingKind.SharpdartSilkCost => "DARDO AFIADO — CUSTO DE SEDA", ModSettingKind.SharpdartMainHitMultiplier => "DARDO AFIADO — DANO", ModSettingKind.RuneRageSilkCost => "FÚRIA DE RUNAS — CUSTO DE SEDA", ModSettingKind.RuneRageBaseDamageMultiplier => "FÚRIA DE RUNAS — DANO", ModSettingKind.PaleNailsSilkCost => "FERRÕES PÁLIDOS — CUSTO DE SEDA", ModSettingKind.PaleNailsProjectileMultiplier => "FERRÕES PÁLIDOS — DANO", ModSettingKind.DamageTakenMultiplier => "DANO RECEBIDO", ModSettingKind.EnvironmentalDamageMultiplier => "DANO DO CENÁRIO", ModSettingKind.OneHitMode => "MODO UM GOLPE", ModSettingKind.HealingAmount => "QUANTIDADE DE CURA", ModSettingKind.HealingCost => "CUSTO DA CURA", ModSettingKind.InvincibilityTimeMultiplier => "TEMPO DE INVENCIBILIDADE", ModSettingKind.EnemyHealthMultiplier => "VIDA DOS INIMIGOS", ModSettingKind.EnemySpeedMultiplier => "VELOCIDADE DOS INIMIGOS", ModSettingKind.EnemyAttackSpeedMultiplier => "RECARGA DE ATAQUE DOS INIMIGOS", ModSettingKind.EnemyAggressionMultiplier => "AGRESSIVIDADE DOS INIMIGOS", ModSettingKind.BossHealthMultiplier => "VIDA DOS BOSSES", ModSettingKind.BossDamageTakenMultiplier => "DANO RECEBIDO DOS BOSSES", ModSettingKind.BossSpeedMultiplier => "VELOCIDADE DOS BOSSES", ModSettingKind.BossAttackSpeedMultiplier => "RECARGA DE ATAQUE DOS BOSSES", ModSettingKind.BossBrutalMode => "BOSS BRUTAL", ModSettingKind.DisableHealingDuringBoss => "SEM CURA DURANTE BOSS", ModSettingKind.HealingDuringBossMultiplier => "CURA DURANTE BOSS", ModSettingKind.CoinMultiplier => "GANHO DE ROSÁRIOS", ModSettingKind.ShardMultiplier => "GANHO DE FRAGMENTOS DE CONCHA", ModSettingKind.ShopPriceMultiplier => "PREÇOS DAS LOJAS", ModSettingKind.StationPriceMultiplier => "PREÇOS DAS ESTAÇÕES", ModSettingKind.DeathRosaryLossPercentage => "PERDA DE ROSÁRIOS NA MORTE", ModSettingKind.HornetSpeedMultiplier => "VELOCIDADE DA HORNET", ModSettingKind.DashRechargeLevel => "RECARGA DO DASH", _ => setting.ToString().ToUpperInvariant(), }; } private string GetSettingOriginLabel(ModSettingKind setting) { if (MutatorCatalog.IsMutator(setting)) { return GetLocalizedSectionLabel(MenuSection.Mutators); } if (!SilkSkillSettingCatalog.IsSilkSkillSetting(setting)) { switch (setting) { case ModSettingKind.NeedleDamage: case ModSettingKind.NeedleUpgradePercentage: break; case ModSettingKind.MaximumHealth: case ModSettingKind.DamageTakenMultiplier: case ModSettingKind.EnvironmentalDamageMultiplier: case ModSettingKind.OneHitMode: case ModSettingKind.HealingAmount: case ModSettingKind.HealingCost: case ModSettingKind.InvincibilityTimeMultiplier: return GetLocalizedSectionLabel(MenuSection.Player); case ModSettingKind.EnemyHealthMultiplier: case ModSettingKind.EnemySpeedMultiplier: case ModSettingKind.EnemyAttackSpeedMultiplier: case ModSettingKind.EnemyAggressionMultiplier: return GetLocalizedSectionLabel(MenuSection.Enemies); case ModSettingKind.BossHealthMultiplier: case ModSettingKind.BossDamageTakenMultiplier: case ModSettingKind.BossSpeedMultiplier: case ModSettingKind.BossAttackSpeedMultiplier: case ModSettingKind.BossBrutalMode: case ModSettingKind.DisableHealingDuringBoss: case ModSettingKind.HealingDuringBossMultiplier: return GetLocalizedSectionLabel(MenuSection.Bosses); case ModSettingKind.CoinMultiplier: case ModSettingKind.ShardMultiplier: return GetLocalizedSectionLabel(MenuSection.Drops); case ModSettingKind.ShopPriceMultiplier: case ModSettingKind.StationPriceMultiplier: case ModSettingKind.DeathRosaryLossPercentage: return GetLocalizedSectionLabel(MenuSection.Economy); case ModSettingKind.HornetSpeedMultiplier: case ModSettingKind.DashRechargeLevel: return GetLocalizedSectionLabel(MenuSection.Movement); default: return GetLocalizedSectionLabel(MenuSection.Damage); } } return GetLocalizedSectionLabel(MenuSection.Damage); } private void SetHeroInputBlocked(bool blocked) { if ((Object)(object)HeroController.instance == (Object)null) { _heroInputBlocked = false; } else if (blocked && !_heroInputBlocked) { HeroController.instance.AddInputBlocker(_inputBlocker); _heroInputBlocked = true; } else if (!blocked && _heroInputBlocked) { HeroController.instance.RemoveInputBlocker(_inputBlocker); _heroInputBlocked = false; } } private void EnsureStyles() { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Expected O, but got Unknown //IL_0042: 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_006d: Expected O, but got Unknown //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Expected O, but got Unknown //IL_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_0119: Unknown result type (might be due to invalid IL or missing references) //IL_0123: Expected O, but got Unknown //IL_0167: Unknown result type (might be due to invalid IL or missing references) //IL_0190: Unknown result type (might be due to invalid IL or missing references) //IL_019a: Expected O, but got Unknown //IL_01c5: Unknown result type (might be due to invalid IL or missing references) //IL_01da: Unknown result type (might be due to invalid IL or missing references) //IL_01e4: Expected O, but got Unknown //IL_0208: Unknown result type (might be due to invalid IL or missing references) //IL_0241: Unknown result type (might be due to invalid IL or missing references) //IL_024b: Expected O, but got Unknown //IL_0263: Unknown result type (might be due to invalid IL or missing references) //IL_029c: Unknown result type (might be due to invalid IL or missing references) //IL_02a6: Expected O, but got Unknown //IL_02be: Unknown result type (might be due to invalid IL or missing references) //IL_02f7: Unknown result type (might be due to invalid IL or missing references) //IL_0301: Expected O, but got Unknown //IL_032d: Unknown result type (might be due to invalid IL or missing references) //IL_0366: Unknown result type (might be due to invalid IL or missing references) //IL_0370: Expected O, but got Unknown //IL_039c: Unknown result type (might be due to invalid IL or missing references) //IL_03c9: Unknown result type (might be due to invalid IL or missing references) //IL_03d3: Expected O, but got Unknown //IL_03fa: Unknown result type (might be due to invalid IL or missing references) //IL_0427: Unknown result type (might be due to invalid IL or missing references) //IL_0431: Expected O, but got Unknown //IL_0455: Unknown result type (might be due to invalid IL or missing references) //IL_046a: Unknown result type (might be due to invalid IL or missing references) //IL_048e: Unknown result type (might be due to invalid IL or missing references) //IL_04a7: Unknown result type (might be due to invalid IL or missing references) //IL_04d0: Unknown result type (might be due to invalid IL or missing references) //IL_04e9: Unknown result type (might be due to invalid IL or missing references) //IL_0512: Unknown result type (might be due to invalid IL or missing references) //IL_052b: Unknown result type (might be due to invalid IL or missing references) //IL_0554: Unknown result type (might be due to invalid IL or missing references) //IL_056d: Unknown result type (might be due to invalid IL or missing references) //IL_0596: Unknown result type (might be due to invalid IL or missing references) //IL_05af: Unknown result type (might be due to invalid IL or missing references) //IL_060a: Unknown result type (might be due to invalid IL or missing references) //IL_0614: Expected O, but got Unknown //IL_0620: Unknown result type (might be due to invalid IL or missing references) //IL_062a: Expected O, but got Unknown //IL_0635: Unknown result type (might be due to invalid IL or missing references) //IL_063f: Expected O, but got Unknown //IL_06c5: Unknown result type (might be due to invalid IL or missing references) //IL_06da: Unknown result type (might be due to invalid IL or missing references) //IL_06ef: Unknown result type (might be due to invalid IL or missing references) //IL_0703: Unknown result type (might be due to invalid IL or missing references) //IL_070d: Expected O, but got Unknown //IL_0724: Unknown result type (might be due to invalid IL or missing references) //IL_072e: Expected O, but got Unknown //IL_0766: Unknown result type (might be due to invalid IL or missing references) //IL_079f: Unknown result type (might be due to invalid IL or missing references) //IL_07a9: Expected O, but got Unknown //IL_07d0: Unknown result type (might be due to invalid IL or missing references) //IL_07fd: Unknown result type (might be due to invalid IL or missing references) //IL_0807: Expected O, but got Unknown //IL_083f: Unknown result type (might be due to invalid IL or missing references) //IL_0860: Unknown result type (might be due to invalid IL or missing references) //IL_086a: Expected O, but got Unknown //IL_08a9: Unknown result type (might be due to invalid IL or missing references) //IL_08cd: Unknown result type (might be due to invalid IL or missing references) //IL_08e2: Unknown result type (might be due to invalid IL or missing references) //IL_0938: Unknown result type (might be due to invalid IL or missing references) //IL_0942: Expected O, but got Unknown //IL_094d: Unknown result type (might be due to invalid IL or missing references) //IL_0957: Expected O, but got Unknown //IL_0996: Unknown result type (might be due to invalid IL or missing references) //IL_09ab: Unknown result type (might be due to invalid IL or missing references) //IL_0a01: Unknown result type (might be due to invalid IL or missing references) //IL_0a0b: Expected O, but got Unknown //IL_0a16: Unknown result type (might be due to invalid IL or missing references) //IL_0a20: Expected O, but got Unknown //IL_0a58: Unknown result type (might be due to invalid IL or missing references) //IL_0a85: Unknown result type (might be due to invalid IL or missing references) //IL_0a8f: Expected O, but got Unknown //IL_0ab3: Unknown result type (might be due to invalid IL or missing references) //IL_0ae0: Unknown result type (might be due to invalid IL or missing references) //IL_0aea: Expected O, but got Unknown //IL_0b0e: Unknown result type (might be due to invalid IL or missing references) //IL_0b3b: Unknown result type (might be due to invalid IL or missing references) //IL_0b45: Expected O, but got Unknown //IL_0b7d: Unknown result type (might be due to invalid IL or missing references) //IL_0baa: Unknown result type (might be due to invalid IL or missing references) //IL_0bb4: Expected O, but got Unknown //IL_0bec: Unknown result type (might be due to invalid IL or missing references) //IL_0c0d: Unknown result type (might be due to invalid IL or missing references) //IL_0c17: Expected O, but got Unknown //IL_0c4f: Unknown result type (might be due to invalid IL or missing references) //IL_0c70: Unknown result type (might be due to invalid IL or missing references) //IL_0c7a: Expected O, but got Unknown //IL_0c9e: Unknown result type (might be due to invalid IL or missing references) //IL_0ccb: Unknown result type (might be due to invalid IL or missing references) //IL_0cd5: Expected O, but got Unknown //IL_0d0d: Unknown result type (might be due to invalid IL or missing references) //IL_0d42: Unknown result type (might be due to invalid IL or missing references) //IL_0d4c: Expected O, but got Unknown //IL_0d71: Unknown result type (might be due to invalid IL or missing references) //IL_0d7b: Expected O, but got Unknown //IL_0d86: Unknown result type (might be due to invalid IL or missing references) //IL_0d90: Expected O, but got Unknown //IL_0db4: Unknown result type (might be due to invalid IL or missing references) //IL_0de1: Unknown result type (might be due to invalid IL or missing references) //IL_0deb: Expected O, but got Unknown //IL_0e03: Unknown result type (might be due to invalid IL or missing references) //IL_0e30: Unknown result type (might be due to invalid IL or missing references) //IL_0e3a: Expected O, but got Unknown //IL_0e5e: Unknown result type (might be due to invalid IL or missing references) if (_titleStyle == null) { _titleStyle = new GUIStyle(GUI.skin.label); _titleStyle.fontSize = 27; _titleStyle.fontStyle = (FontStyle)1; _titleStyle.normal.textColor = MenuVisualTheme.TextPrimary; _titleStyle.alignment = (TextAnchor)3; _sectionTitleStyle = new GUIStyle(GUI.skin.label); _sectionTitleStyle.fontSize = 21; _sectionTitleStyle.fontStyle = (FontStyle)1; _sectionTitleStyle.normal.textColor = MenuVisualTheme.TextPrimary; _sectionTitleStyle.alignment = (TextAnchor)3; _sectionTitleStyle.wordWrap = true; _sectionSubtitleStyle = new GUIStyle(GUI.skin.label); _sectionSubtitleStyle.fontSize = 13; _sectionSubtitleStyle.normal.textColor = MenuVisualTheme.TextSecondary; _sectionSubtitleStyle.alignment = (TextAnchor)3; _sectionSubtitleStyle.wordWrap = true; _sectionSubtitleStyle.clipping = (TextClipping)1; _sectionTabStyle = new GUIStyle(GUI.skin.label); _sectionTabStyle.fontSize = 12; _sectionTabStyle.fontStyle = (FontStyle)1; _sectionTabStyle.alignment = (TextAnchor)3; _sectionTabStyle.normal.textColor = new Color(0.64f, 0.69f, 0.68f, 1f); _sectionTabStyle.wordWrap = true; _sectionTabStyle.clipping = (TextClipping)1; _selectedSectionTabStyle = new GUIStyle(_sectionTabStyle); _selectedSectionTabStyle.fontStyle = (FontStyle)1; _selectedSectionTabStyle.normal.textColor = new Color(0.98f, 0.99f, 0.98f, 1f); _labelStyle = new GUIStyle(GUI.skin.label); _labelStyle.fontSize = 15; _labelStyle.fontStyle = (FontStyle)1; _labelStyle.normal.textColor = MenuVisualTheme.TextPrimary; _labelStyle.alignment = (TextAnchor)0; _labelStyle.wordWrap = true; _labelStyle.clipping = (TextClipping)1; _descriptionStyle = new GUIStyle(GUI.skin.label); _descriptionStyle.fontSize = 12; _descriptionStyle.normal.textColor = MenuVisualTheme.TextSecondary; _descriptionStyle.alignment = (TextAnchor)0; _descriptionStyle.wordWrap = true; _descriptionStyle.clipping = (TextClipping)1; _metaTitleStyle = new GUIStyle(GUI.skin.label); _metaTitleStyle.fontSize = 11; _metaTitleStyle.normal.textColor = MenuVisualTheme.TextMuted; _metaTitleStyle.alignment = (TextAnchor)3; _metaTitleStyle.wordWrap = true; _metaTitleStyle.clipping = (TextClipping)1; _metaValueStyle = new GUIStyle(GUI.skin.label); _metaValueStyle.fontSize = 14; _metaValueStyle.normal.textColor = new Color(0.88f, 0.91f, 0.89f, 1f); _metaValueStyle.alignment = (TextAnchor)4; _metaValueStyle.wordWrap = true; _metaValueStyle.clipping = (TextClipping)1; _searchStyle = new GUIStyle(GUI.skin.label); _searchStyle.fontSize = 13; _searchStyle.normal.textColor = new Color(0.42f, 0.49f, 0.48f, 1f); _searchStyle.alignment = (TextAnchor)3; _searchStyle.clipping = (TextClipping)1; _footerStyle = new GUIStyle(GUI.skin.label); _footerStyle.fontSize = 13; _footerStyle.normal.textColor = new Color(0.72f, 0.69f, 0.61f); _footerStyle.alignment = (TextAnchor)4; _footerStyle.clipping = (TextClipping)1; _fieldStyle = new GUIStyle(GUI.skin.textField); _fieldStyle.fontSize = 15; _fieldStyle.alignment = (TextAnchor)4; _fieldStyle.normal.textColor = Color.white; _fieldStyle.focused.textColor = Color.white; _buttonNormalTexture = CreateRoundedTexture(32, 32, 7, new Color(0.055f, 0.071f, 0.073f, 0.99f), new Color(0.24f, 0.3f, 0.3f, 1f)); _buttonHoverTexture = CreateRoundedTexture(32, 32, 7, new Color(0.11f, 0.13f, 0.13f, 0.99f), new Color(0.72f, 0.55f, 0.28f, 1f)); _buttonActiveTexture = CreateRoundedTexture(32, 32, 7, new Color(0.18f, 0.14f, 0.075f, 0.99f), new Color(0.96f, 0.72f, 0.34f, 1f)); _fieldNormalTexture = CreateRoundedTexture(32, 32, 7, new Color(0.01f, 0.016f, 0.018f, 0.99f), new Color(0.22f, 0.29f, 0.29f, 1f)); _fieldFocusedTexture = CreateRoundedTexture(32, 32, 7, new Color(0.018f, 0.028f, 0.03f, 0.99f), new Color(0.92f, 0.69f, 0.31f, 1f)); _fieldStyle.normal.background = _fieldNormalTexture; _fieldStyle.focused.background = _fieldFocusedTexture; _fieldStyle.hover.background = _fieldFocusedTexture; _fieldStyle.border = new RectOffset(8, 8, 8, 8); _fieldStyle.padding = new RectOffset(9, 9, 5, 5); _buttonStyle = new GUIStyle(GUI.skin.button); _buttonStyle.fontSize = 13; _buttonStyle.fontStyle = (FontStyle)1; _buttonStyle.alignment = (TextAnchor)4; _buttonStyle.normal.background = _buttonNormalTexture; _buttonStyle.hover.background = _buttonHoverTexture; _buttonStyle.active.background = _buttonActiveTexture; _buttonStyle.normal.textColor = new Color(0.86f, 0.89f, 0.87f, 1f); _buttonStyle.hover.textColor = Color.white; _buttonStyle.active.textColor = Color.white; _buttonStyle.border = new RectOffset(8, 8, 8, 8); _buttonStyle.wordWrap = true; _lockedLabelStyle = new GUIStyle(GUI.skin.label); _lockedLabelStyle.fontSize = 15; _lockedLabelStyle.fontStyle = (FontStyle)1; _lockedLabelStyle.normal.textColor = new Color(0.72f, 0.76f, 0.74f, 1f); _lockedLabelStyle.alignment = (TextAnchor)0; _lockedLabelStyle.wordWrap = true; _lockedLabelStyle.clipping = (TextClipping)1; _lockedValueStyle = new GUIStyle(GUI.skin.label); _lockedValueStyle.fontSize = 13; _lockedValueStyle.normal.textColor = new Color(0.58f, 0.59f, 0.58f); _lockedValueStyle.alignment = (TextAnchor)4; _lockedValueStyle.clipping = (TextClipping)1; _lockedBadgeStyle = new GUIStyle(GUI.skin.label); _lockedBadgeStyle.fontSize = 11; _lockedBadgeStyle.fontStyle = (FontStyle)1; _lockedBadgeStyle.normal.textColor = new Color(0.65f, 0.72f, 0.7f, 1f); _lockedBadgeStyle.alignment = (TextAnchor)4; _restoreButtonStyle = new GUIStyle(GUI.skin.button); _restoreButtonStyle.fontSize = 15; _restoreButtonStyle.fontStyle = (FontStyle)1; _restoreButtonStyle.alignment = (TextAnchor)4; _restoreButtonStyle.normal.textColor = new Color(1f, 0.82f, 0.44f); _restoreButtonStyle.hover.textColor = new Color(1f, 0.92f, 0.68f); _restoreButtonStyle.active.textColor = Color.white; _restoreButtonStyle.normal.background = _buttonNormalTexture; _restoreButtonStyle.hover.background = _buttonHoverTexture; _restoreButtonStyle.active.background = _buttonActiveTexture; _restoreButtonStyle.border = new RectOffset(8, 8, 8, 8); _closeButtonStyle = new GUIStyle(GUI.skin.button); _closeButtonStyle.fontSize = 23; _closeButtonStyle.fontStyle = (FontStyle)1; _closeButtonStyle.alignment = (TextAnchor)4; _closeButtonStyle.normal.textColor = new Color(1f, 0.79f, 0.43f); _closeButtonStyle.hover.textColor = Color.white; _closeButtonStyle.normal.background = _buttonNormalTexture; _closeButtonStyle.hover.background = _buttonHoverTexture; _closeButtonStyle.active.background = _buttonActiveTexture; _closeButtonStyle.border = new RectOffset(8, 8, 8, 8); _completionLabelStyle = new GUIStyle(GUI.skin.label); _completionLabelStyle.fontSize = 11; _completionLabelStyle.fontStyle = (FontStyle)1; _completionLabelStyle.normal.textColor = new Color(0.88f, 1f, 0.9f, 1f); _completionLabelStyle.alignment = (TextAnchor)3; _completionLabelStyle.clipping = (TextClipping)1; _completionValueStyle = new GUIStyle(GUI.skin.label); _completionValueStyle.fontSize = 15; _completionValueStyle.fontStyle = (FontStyle)1; _completionValueStyle.normal.textColor = Color.white; _completionValueStyle.alignment = (TextAnchor)5; _completionValueStyle.clipping = (TextClipping)1; _summaryValueStyle = new GUIStyle(GUI.skin.label); _summaryValueStyle.fontSize = 20; _summaryValueStyle.fontStyle = (FontStyle)1; _summaryValueStyle.normal.textColor = Color.white; _summaryValueStyle.alignment = (TextAnchor)4; _summaryValueStyle.clipping = (TextClipping)1; _summaryCaptionStyle = new GUIStyle(GUI.skin.label); _summaryCaptionStyle.fontSize = 10; _summaryCaptionStyle.fontStyle = (FontStyle)1; _summaryCaptionStyle.normal.textColor = new Color(0.75f, 0.7f, 0.59f, 1f); _summaryCaptionStyle.alignment = (TextAnchor)4; _summaryCaptionStyle.clipping = (TextClipping)1; _eyebrowStyle = new GUIStyle(GUI.skin.label); _eyebrowStyle.fontSize = 10; _eyebrowStyle.fontStyle = (FontStyle)1; _eyebrowStyle.normal.textColor = new Color(0.52f, 0.62f, 0.6f, 1f); _eyebrowStyle.alignment = (TextAnchor)3; _sidebarHeaderStyle = new GUIStyle(GUI.skin.label); _sidebarHeaderStyle.fontSize = 10; _sidebarHeaderStyle.fontStyle = (FontStyle)1; _sidebarHeaderStyle.normal.textColor = new Color(0.42f, 0.51f, 0.49f, 1f); _sidebarHeaderStyle.alignment = (TextAnchor)3; _chipStyle = new GUIStyle(GUI.skin.label); _chipStyle.fontSize = 11; _chipStyle.fontStyle = (FontStyle)1; _chipStyle.normal.textColor = Color.white; _chipStyle.alignment = (TextAnchor)4; _chipStyle.clipping = (TextClipping)1; _shortcutStyle = new GUIStyle(GUI.skin.label); _shortcutStyle.fontSize = 10; _shortcutStyle.fontStyle = (FontStyle)1; _shortcutStyle.normal.textColor = new Color(0.62f, 0.7f, 0.68f, 1f); _shortcutStyle.alignment = (TextAnchor)4; _shortcutStyle.wordWrap = true; _shortcutStyle.clipping = (TextClipping)1; _navigationSearchStyle = new GUIStyle(_fieldStyle); _navigationSearchStyle.fontSize = 13; _navigationSearchStyle.alignment = (TextAnchor)3; _navigationSearchStyle.padding = new RectOffset(12, 36, 5, 5); _switchLabelStyle = new GUIStyle(GUI.skin.label); _switchLabelStyle.fontSize = 9; _switchLabelStyle.fontStyle = (FontStyle)1; _switchLabelStyle.normal.textColor = MenuVisualTheme.TextPrimary; _switchLabelStyle.alignment = (TextAnchor)3; _switchLabelStyle.clipping = (TextClipping)1; _tooltipStyle = new GUIStyle(GUI.skin.label); _tooltipStyle.fontSize = 11; _tooltipStyle.normal.textColor = MenuVisualTheme.TextPrimary; _tooltipStyle.wordWrap = true; _tooltipStyle.alignment = (TextAnchor)3; _keycapStyle = new GUIStyle(GUI.skin.label); _keycapStyle.fontSize = 9; _keycapStyle.fontStyle = (FontStyle)1; _keycapStyle.normal.textColor = MenuVisualTheme.TextSecondary; _keycapStyle.alignment = (TextAnchor)4; } } private void CycleSelectedSection(int direction) { int num = LockedOptionCatalog.Sections.Length; if (num > 0) { int num2 = (_selectedSectionIndex + direction) % num; if (num2 < 0) { num2 += num; } SelectSection(num2); } } private void SelectSection(int index) { //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) int num = Mathf.Clamp(index, 0, LockedOptionCatalog.Sections.Length - 1); if (num != _selectedSectionIndex) { CommitAllFields(); SyncTextFromSettings(); if (Event.current != null) { GUI.FocusControl(string.Empty); } _focusedControl = string.Empty; _selectedSectionIndex = num; _optionScroll = Vector2.zero; _currentSectionAccent = GetSectionAccent(LockedOptionCatalog.Sections[num]); } } private float GetFilteredNavigationHeight() { float num = 10f; int num2 = 0; string b = string.Empty; for (int i = 0; i < LockedOptionCatalog.Sections.Length; i++) { MenuSection section = LockedOptionCatalog.Sections[i]; if (MatchesNavigationSearch(section)) { string sectionGroup = GetSectionGroup(section); if (!string.Equals(sectionGroup, b, StringComparison.Ordinal)) { num += ((num2 > 0) ? 30f : 23f); b = sectionGroup; } num += 52f; num2++; } } if (num2 <= 0) { return 90f; } return num + 8f; } private int FindFirstMatchingSectionIndex() { for (int i = 0; i < LockedOptionCatalog.Sections.Length; i++) { if (MatchesNavigationSearch(LockedOptionCatalog.Sections[i])) { return i; } } return -1; } private bool MatchesNavigationSearch(MenuSection section) { string text = (_navigationSearchText ?? string.Empty).Trim(); if (text.Length == 0) { return true; } string text2 = GetLocalizedSectionLabel(section) + " " + GetSectionSubtitle(section) + " " + GetSectionGroup(section); return text2.IndexOf(text, StringComparison.OrdinalIgnoreCase) >= 0; } private string GetSectionGroup(MenuSection section) { switch (section) { case MenuSection.Summary: case MenuSection.Favorites: return L("group_overview", "VISÃO GERAL"); case MenuSection.Player: case MenuSection.Damage: case MenuSection.Movement: return L("group_hornet", "HORNET"); case MenuSection.Enemies: case MenuSection.Bosses: case MenuSection.EnemyEditor: return L("group_opponents", "OPONENTES"); case MenuSection.Drops: case MenuSection.Economy: return L("group_resources", "RECURSOS"); case MenuSection.Mutators: case MenuSection.Presets: return L("group_modes", "MODOS E PERFIS"); case MenuSection.System: return L("group_system", "SISTEMA"); default: return L("group_other", "OUTROS"); } } private static string GetSectionGlyph(MenuSection section) { return section switch { MenuSection.Summary => "R", MenuSection.Favorites => "★", MenuSection.Player => "H", MenuSection.Damage => "D", MenuSection.Enemies => "I", MenuSection.Bosses => "B", MenuSection.EnemyEditor => "E", MenuSection.Drops => "↓", MenuSection.Economy => "$", MenuSection.Movement => "M", MenuSection.Mutators => "X", MenuSection.Presets => "P", _ => "S", }; } private static Color GetSectionAccent(MenuSection section) { //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) //IL_0121: Unknown result type (might be due to invalid IL or missing references) //IL_013b: Unknown result type (might be due to invalid IL or missing references) //IL_0155: Unknown result type (might be due to invalid IL or missing references) //IL_016f: Unknown result type (might be due to invalid IL or missing references) //IL_0189: Unknown result type (might be due to invalid IL or missing references) return (Color)(section switch { MenuSection.Summary => new Color(0.94f, 0.7f, 0.3f, 1f), MenuSection.Favorites => new Color(0.96f, 0.48f, 0.66f, 1f), MenuSection.Player => new Color(0.88f, 0.86f, 0.78f, 1f), MenuSection.Damage => new Color(0.94f, 0.29f, 0.22f, 1f), MenuSection.Enemies => new Color(0.94f, 0.52f, 0.22f, 1f), MenuSection.Bosses => new Color(0.82f, 0.18f, 0.24f, 1f), MenuSection.EnemyEditor => new Color(0.66f, 0.42f, 0.88f, 1f), MenuSection.Drops => new Color(0.25f, 0.76f, 0.82f, 1f), MenuSection.Economy => new Color(0.92f, 0.72f, 0.22f, 1f), MenuSection.Movement => new Color(0.26f, 0.58f, 0.94f, 1f), MenuSection.Mutators => new Color(0.86f, 0.28f, 0.68f, 1f), MenuSection.Presets => new Color(0.94f, 0.66f, 0.28f, 1f), _ => new Color(0.52f, 0.62f, 0.66f, 1f), }); } private void DrawModernRowSurface(Rect rect, int alternatingValue, Color accent) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_0114: Unknown result type (might be due to invalid IL or missing references) //IL_013b: Unknown result type (might be due to invalid IL or missing references) //IL_0171: Unknown result type (might be due to invalid IL or missing references) //IL_0176: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: 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) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) bool flag = Event.current != null && ((Rect)(ref rect)).Contains(Event.current.mousePosition); if (!_hoverAnimations.TryGetValue(alternatingValue, out var value)) { value = 0f; } float num = 8.333334f; value = Mathf.MoveTowards(value, flag ? 1f : 0f, Time.unscaledDeltaTime * num); _hoverAnimations[alternatingValue] = value; Color color = (Color)(((alternatingValue & 1) == 0) ? MenuVisualTheme.Surface : new Color(0.019f, 0.027f, 0.029f, 0.992f)); DrawSolidRect(rect, color); if (value > 0.001f) { DrawSolidRect(new Rect(((Rect)(ref rect)).x + 1f, ((Rect)(ref rect)).y + 1f, ((Rect)(ref rect)).width - 2f, ((Rect)(ref rect)).height - 2f), MenuVisualTheme.WithAlpha(MenuVisualTheme.SurfaceHover, 0.34f * value)); } DrawSolidRect(new Rect(((Rect)(ref rect)).x, ((Rect)(ref rect)).y + 12f, 2f + 2f * value, ((Rect)(ref rect)).height - 24f), new Color(accent.r, accent.g, accent.b, 0.58f + 0.34f * value)); DrawSolidRect(new Rect(((Rect)(ref rect)).x + 14f, ((Rect)(ref rect)).yMax - 1f, ((Rect)(ref rect)).width - 28f, 1f), MenuVisualTheme.BorderSubtle); } private void DrawMetricChip(Rect rect, string label, string value, Color accent) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: Unknown result type (might be due to invalid IL or missing references) DrawFramedBox(rect, new Color(accent.r * 0.08f, accent.g * 0.08f, accent.b * 0.08f, 0.98f), new Color(accent.r, accent.g, accent.b, 0.48f)); GUI.Label(new Rect(((Rect)(ref rect)).x + 10f, ((Rect)(ref rect)).y + 4f, ((Rect)(ref rect)).width - 58f, ((Rect)(ref rect)).height - 8f), label, _eyebrowStyle); Color textColor = _completionValueStyle.normal.textColor; _completionValueStyle.normal.textColor = accent; GUI.Label(new Rect(((Rect)(ref rect)).xMax - 55f, ((Rect)(ref rect)).y, 45f, ((Rect)(ref rect)).height), value, _completionValueStyle); _completionValueStyle.normal.textColor = textColor; } private void DrawStatusChip(Rect rect, string text, Color accent) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) DrawFramedBox(rect, new Color(accent.r * 0.12f, accent.g * 0.12f, accent.b * 0.12f, 0.98f), new Color(accent.r, accent.g, accent.b, 0.62f)); Color textColor = _chipStyle.normal.textColor; _chipStyle.normal.textColor = accent; GUI.Label(rect, text, _chipStyle); _chipStyle.normal.textColor = textColor; } private void DrawSectionIcon(Rect rect, MenuSection section, Color accent) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_0087: 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) //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_0108: Unknown result type (might be due to invalid IL or missing references) DrawFramedBox(rect, new Color(accent.r * 0.1f, accent.g * 0.1f, accent.b * 0.1f, 0.98f), new Color(accent.r, accent.g, accent.b, 0.62f)); Texture2D val = ((_images != null) ? _images.GetSectionIcon(section) : null); if ((Object)(object)val == (Object)null) { Color textColor = _chipStyle.normal.textColor; _chipStyle.normal.textColor = accent; GUI.Label(rect, GetSectionGlyph(section), _chipStyle); _chipStyle.normal.textColor = textColor; } else { float num = ((((Rect)(ref rect)).width >= 40f) ? 6f : 3f); GUI.DrawTexture(new Rect(((Rect)(ref rect)).x + num, ((Rect)(ref rect)).y + num, ((Rect)(ref rect)).width - num * 2f, ((Rect)(ref rect)).height - num * 2f), (Texture)(object)val, (ScaleMode)2, true); } } private static void DrawMenuBackdrop(Rect rect) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) DrawSolidRect(rect, MenuVisualTheme.Backdrop); DrawSolidRect(new Rect(((Rect)(ref rect)).x, ((Rect)(ref rect)).y, ((Rect)(ref rect)).width, ((Rect)(ref rect)).height * 0.3f), new Color(0.018f, 0.032f, 0.034f, 0.26f)); DrawSolidRect(new Rect(((Rect)(ref rect)).x, ((Rect)(ref rect)).yMax - ((Rect)(ref rect)).height * 0.28f, ((Rect)(ref rect)).width, ((Rect)(ref rect)).height * 0.28f), new Color(0.03f, 0.014f, 0.018f, 0.18f)); } private static void DrawSoftShadow(Rect rect) { //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) for (int num = 5; num >= 1; num--) { float num2 = (float)num * 5f; DrawSolidRect(new Rect(((Rect)(ref rect)).x - num2, ((Rect)(ref rect)).y - num2 + 8f, ((Rect)(ref rect)).width + num2 * 2f, ((Rect)(ref rect)).height + num2 * 2f), new Color(0f, 0f, 0f, 0.035f)); } } private static Texture2D CreateRoundedTexture(int width, int height, int radius, Color fill, Color border) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Expected O, but got Unknown //IL_0050: 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_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) Texture2D val = new Texture2D(width, height, (TextureFormat)5, false); ((Object)val).name = "CustomDifficultyRuntimeStyle"; ((Texture)val).wrapMode = (TextureWrapMode)1; ((Texture)val).filterMode = (FilterMode)1; Color[] array = (Color[])(object)new Color[width * height]; for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { if (!IsInsideRoundedRect(j, i, width, height, radius, 0)) { ref Color reference = ref array[i * width + j]; reference = Color.clear; } else { bool flag = IsInsideRoundedRect(j, i, width, height, Math.Max(1, radius - 1), 1); array[i * width + j] = (flag ? fill : border); } } } val.SetPixels(array); val.Apply(false, true); return val; } private static bool IsInsideRoundedRect(int x, int y, int width, int height, int radius, int inset) { int num = width - 1 - inset; int num2 = height - 1 - inset; if (x < inset || x > num || y < inset || y > num2) { return false; } int num3 = Math.Max(1, radius); int num4 = Math.Max(inset + num3, Math.Min(num - num3, x)); int num5 = Math.Max(inset + num3, Math.Min(num2 - num3, y)); int num6 = x - num4; int num7 = y - num5; return num6 * num6 + num7 * num7 <= num3 * num3; } private static void DestroyTexture(ref Texture2D texture) { if (!((Object)(object)texture == (Object)null)) { Object.Destroy((Object)(object)texture); texture = null; } } private static void DrawFramedBox(Rect rect, Color fill, Color border) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) DrawSolidRect(rect, fill); DrawBorder(rect, border, 1f); } private static int GetActiveOptionsPercentage() { int num = 97 + LockedOptionCatalog.LockedOptionCount; if (num <= 0) { return 0; } return Mathf.Clamp(Mathf.RoundToInt(9700f / (float)num), 0, 100); } private void DrawCompletionIndicator(Rect rect, string label, int percentage) { //IL_000b: 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_0011: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_0108: Unknown result type (might be due to invalid IL or missing references) int num = Mathf.Clamp(percentage, 0, 100); Color completionColor = GetCompletionColor(num); DrawFramedBox(rect, new Color(completionColor.r * 0.13f, completionColor.g * 0.13f, completionColor.b * 0.13f, 0.98f), completionColor); DrawSolidRect(new Rect(((Rect)(ref rect)).x + 3f, ((Rect)(ref rect)).y + 3f, (((Rect)(ref rect)).width - 6f) * (float)num / 100f, ((Rect)(ref rect)).height - 6f), new Color(completionColor.r, completionColor.g, completionColor.b, 0.92f)); GUI.Label(new Rect(((Rect)(ref rect)).x + 10f, ((Rect)(ref rect)).y, ((Rect)(ref rect)).width - 67f, ((Rect)(ref rect)).height), label, _completionLabelStyle); GUI.Label(new Rect(((Rect)(ref rect)).xMax - 62f, ((Rect)(ref rect)).y, 52f, ((Rect)(ref rect)).height), num + "%", _completionValueStyle); } private static Color GetCompletionColor(int percentage) { //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) int num = Mathf.Clamp(percentage, 0, 100); Color val = default(Color); ((Color)(ref val))..ctor(0.92f, 0.13f, 0.1f, 1f); Color val2 = default(Color); ((Color)(ref val2))..ctor(1f, 0.72f, 0.08f, 1f); Color val3 = default(Color); ((Color)(ref val3))..ctor(0.16f, 0.86f, 0.31f, 1f); if (num <= 50) { return Color.Lerp(val, val2, (float)num / 50f); } return Color.Lerp(val2, val3, (float)(num - 50) / 50f); } private static void DrawOrnateFrame(Rect rect) { //IL_0000: 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_000f: 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_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_0102: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) //IL_0137: Unknown result type (might be due to invalid IL or missing references) //IL_013c: Unknown result type (might be due to invalid IL or missing references) //IL_016c: Unknown result type (might be due to invalid IL or missing references) //IL_0171: Unknown result type (might be due to invalid IL or missing references) //IL_01a1: Unknown result type (might be due to invalid IL or missing references) //IL_01a6: Unknown result type (might be due to invalid IL or missing references) Color color = MenuVisualTheme.WithAlpha(MenuVisualTheme.SilkGold, 0.36f); DrawBorder(rect, color, 1f); DrawSolidRect(new Rect(((Rect)(ref rect)).x + 8f, ((Rect)(ref rect)).y + 8f, 30f, 1f), color); DrawSolidRect(new Rect(((Rect)(ref rect)).x + 8f, ((Rect)(ref rect)).y + 8f, 1f, 30f), color); DrawSolidRect(new Rect(((Rect)(ref rect)).xMax - 30f - 8f, ((Rect)(ref rect)).y + 8f, 30f, 1f), color); DrawSolidRect(new Rect(((Rect)(ref rect)).xMax - 9f, ((Rect)(ref rect)).y + 8f, 1f, 30f), color); DrawSolidRect(new Rect(((Rect)(ref rect)).x + 8f, ((Rect)(ref rect)).yMax - 9f, 30f, 1f), color); DrawSolidRect(new Rect(((Rect)(ref rect)).x + 8f, ((Rect)(ref rect)).yMax - 30f - 8f, 1f, 30f), color); DrawSolidRect(new Rect(((Rect)(ref rect)).xMax - 30f - 8f, ((Rect)(ref rect)).yMax - 9f, 30f, 1f), color); DrawSolidRect(new Rect(((Rect)(ref rect)).xMax - 9f, ((Rect)(ref rect)).yMax - 30f - 8f, 1f, 30f), color); } private static void DrawSolidRect(Rect rect, Color color) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) Color color2 = GUI.color; GUI.color = new Color(color.r * color2.r, color.g * color2.g, color.b * color2.b, color.a * color2.a); GUI.DrawTexture(rect, (Texture)(object)Texture2D.whiteTexture); GUI.color = color2; } private static void DrawBorder(Rect rect, Color color, float thickness) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) DrawSolidRect(new Rect(((Rect)(ref rect)).x, ((Rect)(ref rect)).y, ((Rect)(ref rect)).width, thickness), color); DrawSolidRect(new Rect(((Rect)(ref rect)).x, ((Rect)(ref rect)).yMax - thickness, ((Rect)(ref rect)).width, thickness), color); DrawSolidRect(new Rect(((Rect)(ref rect)).x, ((Rect)(ref rect)).y, thickness, ((Rect)(ref rect)).height), color); DrawSolidRect(new Rect(((Rect)(ref rect)).xMax - thickness, ((Rect)(ref rect)).y, thickness, ((Rect)(ref rect)).height), color); } private static void ConsumeInputEvent() { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Invalid comparison between Unknown and I4 Event current = Event.current; if (current != null && (current.isKey || current.isMouse || (int)current.type == 6)) { current.Use(); } } } [BepInPlugin("codex.silksong.custom-difficulty", "Custom Difficulty", "3.0.0")] public sealed class CustomDifficultyPlugin : BaseUnityPlugin { public const string PluginGuid = "codex.silksong.custom-difficulty"; public const string PluginName = "Custom Difficulty"; public const string PluginVersion = "3.0.0"; private Harmony _harmony; private SettingsStore _settingsStore; private PresetManager _presetManager; private MaximumHealthController _maximumHealthController; private NeedleDamageController _needleDamageController; private SilkSpearController _silkSpearController; private IncomingDamageController _incomingDamageController; private PlayerRecoveryController _playerRecoveryController; private EnemyStatsController _enemyStatsController; private BossRulesController _bossRulesController; private CurrencyRewardController _currencyRewardController; private PriceController _priceController; private DeathRosaryLossController _deathRosaryLossController; private PlayerMovementController _playerMovementController; private MutatorController _mutatorController; private LocalizationManager _localization; private SceneTransitionMonitor _sceneTransitionMonitor; private ModImages _images; private CustomDifficultyMenu _menu; private ExtendedHealthHud _extendedHealthHud; private void Awake() { //IL_01c0: Unknown result type (might be due to invalid IL or missing references) //IL_01ca: Expected O, but got Unknown string directoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); string text = Path.Combine(Paths.ConfigPath, "CustomDifficulty", "settings.json"); string directoryName2 = Path.GetDirectoryName(text); _settingsStore = new SettingsStore(((BaseUnityPlugin)this).Logger, text); _settingsStore.Load(); _localization = new LocalizationManager(_settingsStore, ((BaseUnityPlugin)this).Logger, Path.Combine(directoryName, "Localization")); _presetManager = new PresetManager(_settingsStore, ((BaseUnityPlugin)this).Logger, directoryName, directoryName2); _mutatorController = new MutatorController(_settingsStore, ((BaseUnityPlugin)this).Logger); _maximumHealthController = new MaximumHealthController(_settingsStore, ((BaseUnityPlugin)this).Logger); _needleDamageController = new NeedleDamageController(_settingsStore); _silkSpearController = new SilkSpearController(_settingsStore); _incomingDamageController = new IncomingDamageController(_settingsStore); _playerRecoveryController = new PlayerRecoveryController(_settingsStore, ((BaseUnityPlugin)this).Logger); _enemyStatsController = new EnemyStatsController(_settingsStore); _bossRulesController = new BossRulesController(_settingsStore); _currencyRewardController = new CurrencyRewardController(_settingsStore); _priceController = new PriceController(_settingsStore, ((BaseUnityPlugin)this).Logger); _deathRosaryLossController = new DeathRosaryLossController(_settingsStore, ((BaseUnityPlugin)this).Logger); _playerMovementController = new PlayerMovementController(_settingsStore, ((BaseUnityPlugin)this).Logger); _images = ModImageLoader.Load(directoryName, ((BaseUnityPlugin)this).Logger); _menu = new CustomDifficultyMenu(_settingsStore, _images, _presetManager, _localization); _extendedHealthHud = new ExtendedHealthHud(((BaseUnityPlugin)this).Logger); _harmony = new Harmony("codex.silksong.custom-difficulty"); _harmony.PatchAll(Assembly.GetExecutingAssembly()); _sceneTransitionMonitor = new SceneTransitionMonitor(_maximumHealthController, ((BaseUnityPlugin)this).Logger); _sceneTransitionMonitor.Start(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Custom Difficulty 3.0.0 carregado. Menu: F8."); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Funcoes ativas: vida maxima, cura, custo da cura, invencibilidade, dano da agulha, seis Habilidades de Seda, dano recebido, dano de cenario, moedas, vida, velocidade, recarga e agressividade dos inimigos, velocidade da Hornet, recarga do dash, fragmentos, lojas, estacoes, perda de Rosarios, regras de Bosses, Favoritos, Presets, Sistema e 15 mutadores."); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Sincronizacao estabilizada: atributos de percepcao da IA sao reaplicados em intervalos controlados."); } private void Update() { _localization.Update(force: false); _mutatorController.Update(); _extendedHealthHud.Update(); _menu.Update(); } private void OnGUI() { _menu.OnGUI(); } private void OnDestroy() { if (_sceneTransitionMonitor != null) { _sceneTransitionMonitor.Shutdown(); } if (_menu != null) { _menu.Shutdown(); } if (_extendedHealthHud != null) { _extendedHealthHud.Shutdown(); } if (_maximumHealthController != null) { _maximumHealthController.Shutdown(); } if (_needleDamageController != null) { _needleDamageController.Shutdown(); } if (_silkSpearController != null) { _silkSpearController.Shutdown(); } if (_incomingDamageController != null) { _incomingDamageController.Shutdown(); } if (_playerRecoveryController != null) { _playerRecoveryController.Shutdown(); } if (_enemyStatsController != null) { _enemyStatsController.Shutdown(); } if (_bossRulesController != null) { _bossRulesController.Shutdown(); } if (_currencyRewardController != null) { _currencyRewardController.Shutdown(); } if (_priceController != null) { _priceController.Shutdown(); } if (_deathRosaryLossController != null) { _deathRosaryLossController.Shutdown(); } if (_playerMovementController != null) { _playerMovementController.Shutdown(); } if (_mutatorController != null) { _mutatorController.Shutdown(); } if (_images != null) { _images.Dispose(); } if (_harmony != null) { _harmony.UnpatchSelf(); _harmony = null; } } } internal sealed class DeathRosaryLossController { private readonly SettingsStore _settingsStore; private readonly ManualLogSource _logger; public static DeathRosaryLossController Instance; public DeathRosaryLossController(SettingsStore settingsStore, ManualLogSource logger) { _settingsStore = settingsStore; _logger = logger; Instance = this; } public IEnumerator WrapDeathSequence(IEnumerator originalSequence) { if (originalSequence != null) { return new DeathRosaryLossEnumerator(originalSequence, this); } return null; } public void ApplyAfterVanillaDeath(int startingBalance, int startingCorpsePool) { if (!PlayerData.HasInstance) { return; } PlayerData instance = PlayerData.instance; int geo = instance.geo; int heroCorpseMoneyPool = instance.HeroCorpseMoneyPool; bool flag = _settingsStore.IsMutatorEnabled(ModSettingKind.MutatorNoMercy); bool flag2 = _settingsStore.IsMutatorEnabled(ModSettingKind.MutatorNoDeathLoss); if (geo == startingBalance && heroCorpseMoneyPool == startingCorpsePool && !flag && !flag2) { return; } if (flag) { instance.geo = 0; ClearCorpse(instance); if (MutatorController.Instance != null) { MutatorController.Instance.PrepareNoMercyRespawn(); } _logger.LogInfo((object)"Sem misericordia aplicado: Rosarios zerados, casulo removido e retorno ao inicio preparado."); return; } if (flag2) { instance.geo = startingBalance; ClearCorpse(instance); _logger.LogInfo((object)("Sem perda ao morrer aplicado: saldo mantido em " + startingBalance + " e casulo removido.")); return; } int num = (_settingsStore.IsEnabled(ModSettingKind.DeathRosaryLossPercentage) ? ValueValidator.ClampDeathRosaryLossPercentage(_settingsStore.Current.DeathRosaryLossPercentage) : 100); if (num != 100 || startingBalance < 0) { long num2 = Math.Max(0L, (long)startingBalance - (long)geo); long val = (long)Math.Round((double)(num2 * num) / 100.0, MidpointRounding.AwayFromZero); val = Math.Max(0L, Math.Min(2147483647L, val)); long val2 = startingBalance - val; val2 = Math.Max(-2147483648L, Math.Min(2147483647L, val2)); long num3 = Math.Min(val, Math.Max(0L, startingBalance)); instance.geo = (int)val2; instance.HeroCorpseMoneyPool = (int)num3; _logger.LogInfo((object)("Perda de Rosarios aplicada na morte: " + num + "%, saldo " + startingBalance + " -> " + instance.geo + ", casulo " + instance.HeroCorpseMoneyPool + ", perda permanente " + (val - num3) + ".")); } } private static void ClearCorpse(PlayerData playerData) { if (playerData != null) { playerData.HeroCorpseMoneyPool = 0; playerData.HeroCorpseScene = string.Empty; playerData.HeroCorpseMarkerGuid = new byte[0]; } } public void Shutdown() { if (object.ReferenceEquals(Instance, this)) { Instance = null; } } } internal sealed class DeathRosaryLossEnumerator : IEnumerator, IDisposable { private readonly IEnumerator _originalSequence; private readonly DeathRosaryLossController _controller; private readonly int _startingBalance; private readonly int _startingCorpsePool; private bool _adjusted; public object Current => _originalSequence.Current; public DeathRosaryLossEnumerator(IEnumerator originalSequence, DeathRosaryLossController controller) { _originalSequence = originalSequence; _controller = controller; if (PlayerData.HasInstance) { _startingBalance = PlayerData.instance.geo; _startingCorpsePool = PlayerData.instance.HeroCorpseMoneyPool; } } public bool MoveNext() { bool result = _originalSequence.MoveNext(); if (!_adjusted) { _adjusted = true; if (_controller != null) { _controller.ApplyAfterVanillaDeath(_startingBalance, _startingCorpsePool); } } return result; } public void Reset() { _originalSequence.Reset(); } public void Dispose() { if (_originalSequence is IDisposable disposable) { disposable.Dispose(); } } } [HarmonyPatch(typeof(HeroController), "Die", new Type[] { typeof(bool), typeof(bool) })] internal static class DeathRosaryLossSequencePatch { private static void Postfix(ref IEnumerator __result) { if (DeathRosaryLossController.Instance != null && __result != null) { __result = DeathRosaryLossController.Instance.WrapDeathSequence(__result); } } } internal sealed class EnemyStatsController { private static readonly FieldInfo HealthField = AccessTools.Field(typeof(HealthManager), "hp"); private static readonly FieldInfo InitialHealthField = AccessTools.Field(typeof(HealthManager), "initHp"); private static readonly FieldInfo IsDeadField = AccessTools.Field(typeof(HealthManager), "isDead"); private static readonly FieldInfo SendDamageToField = AccessTools.Field(typeof(HealthManager), "sendDamageTo"); private static readonly FieldInfo BattleSceneField = AccessTools.Field(typeof(HealthManager), "battleScene"); private static readonly FieldInfo BossesField = AccessTools.Field(typeof(BossSceneController), "bosses"); private static readonly string[] KnownBossNames = new string[18] { "Bone Beast", "Crawfather", "First Weaver", "Flower Queen", "Garmond BlackThreaded", "Giant Bone Flyer", "Lace1", "Lace2", "Last Judge", "Lost Lace", "Mossbone Mother", "Pinstress Boss", "Skull King Bonetown", "Skull King SkullFragment", "Splinter Queen", "Tormented Trobbio", "Trobbio", "Vampire Gnat" }; private readonly SettingsStore _settingsStore; private readonly Dictionary _activeBosses = new Dictionary(); private float _lastConfirmedBossCombatAt = -1000f; private int _lastConfirmedBossSceneHandle = int.MinValue; public static EnemyStatsController Instance { get; private set; } public EnemyStatsController(SettingsStore settingsStore) { _settingsStore = settingsStore; _settingsStore.Changed += OnSettingChanged; Instance = this; ApplyToActiveEnemies(); } public void Shutdown() { _settingsStore.Changed -= OnSettingChanged; ForEachActiveEnemy(delegate(HealthManager healthManager) { EnemyRuntimeState component = ((Component)healthManager).GetComponent(); if ((Object)(object)component != (Object)null) { component.RestoreVanillaValues(); } }); _activeBosses.Clear(); if (object.ReferenceEquals(Instance, this)) { Instance = null; } } public void Register(HealthManager healthManager) { if ((Object)(object)healthManager == (Object)null || (Object)(object)((Component)healthManager).gameObject == (Object)null) { return; } if (IsDead(healthManager)) { Unregister(healthManager); return; } EnemyRuntimeState enemyRuntimeState = ((Component)healthManager).GetComponent(); if ((Object)(object)enemyRuntimeState == (Object)null) { enemyRuntimeState = ((Component)healthManager).gameObject.AddComponent(); } bool flag = IsBoss(healthManager, new HashSet()); if (flag) { _activeBosses[((Object)healthManager).GetInstanceID()] = healthManager; } else { _activeBosses.Remove(((Object)healthManager).GetInstanceID()); } enemyRuntimeState.Initialize(healthManager, flag); enemyRuntimeState.ApplyHealth(GetHealthMultiplier(enemyRuntimeState, flag)); enemyRuntimeState.SetSpeedMultiplier(GetSpeedMultiplier(flag, ((Component)healthManager).gameObject)); enemyRuntimeState.SetAggressionMultiplier(GetAggressionMultiplier(flag)); } public void Unregister(HealthManager healthManager) { if ((Object)(object)healthManager != (Object)null) { _activeBosses.Remove(((Object)healthManager).GetInstanceID()); } } public float GetSpeedMultiplier(bool isBoss, GameObject source = null) { float num = ((!isBoss) ? (_settingsStore.IsEnabled(ModSettingKind.EnemySpeedMultiplier) ? ValueValidator.NormalizeEnemySpeedMultiplier(_settingsStore.Current.EnemySpeedMultiplier) : 1f) : (_settingsStore.IsEnabled(ModSettingKind.BossSpeedMultiplier) ? ValueValidator.NormalizeEnemySpeedMultiplier(_settingsStore.Current.BossSpeedMultiplier) : 1f)); if (_settingsStore.IsMutatorEnabled(ModSettingKind.MutatorFastEnemies)) { num *= 1.1f; } if (_settingsStore.IsMutatorEnabled(ModSettingKind.MutatorAggressiveEnemies)) { num *= 1.1f; } if (isBoss && _settingsStore.IsMutatorEnabled(ModSettingKind.MutatorBossFrenzy)) { num *= 1.1f; } return num; } private float GetHealthMultiplier(EnemyRuntimeState state, bool isBoss) { float num = (_settingsStore.IsMutatorEnabled(ModSettingKind.MutatorRandomEnemyHealth) ? state.RandomHealthMultiplier : ((!isBoss) ? (_settingsStore.IsEnabled(ModSettingKind.EnemyHealthMultiplier) ? ValueValidator.NormalizeMultiplier(_settingsStore.Current.EnemyHealthMultiplier) : 1f) : (_settingsStore.IsEnabled(ModSettingKind.BossHealthMultiplier) ? ValueValidator.NormalizeMultiplier(_settingsStore.Current.BossHealthMultiplier) : 1f))); if (_settingsStore.IsMutatorEnabled(ModSettingKind.MutatorTankEnemies)) { num *= 3f; } if (isBoss && _settingsStore.IsMutatorEnabled(ModSettingKind.MutatorExtendedFights)) { num *= 10f; } return num; } private float GetAggressionMultiplier(bool isBoss) { if (isBoss || !_settingsStore.IsEnabled(ModSettingKind.EnemyAggressionMultiplier)) { return 1f; } return ValueValidator.NormalizeMultiplier(_settingsStore.Current.EnemyAggressionMultiplier); } private void OnSettingChanged(ModSettingKind setting) { if (setting == ModSettingKind.EnemyHealthMultiplier || setting == ModSettingKind.EnemySpeedMultiplier || setting == ModSettingKind.EnemyAggressionMultiplier || setting == ModSettingKind.BossHealthMultiplier || setting == ModSettingKind.BossSpeedMultiplier || setting == ModSettingKind.MutatorFastEnemies || setting == ModSettingKind.MutatorTankEnemies || setting == ModSettingKind.MutatorAggressiveEnemies || setting == ModSettingKind.MutatorRandomEnemyHealth || setting == ModSettingKind.MutatorBossFrenzy || setting == ModSettingKind.MutatorExtendedFights) { ApplyToActiveEnemies(); } } public void ReapplyActiveEnemies() { ApplyToActiveEnemies(); } private void ApplyToActiveEnemies() { ForEachActiveEnemy(Register); } private static void ForEachActiveEnemy(Action action) { if (action == null) { return; } try { foreach (HealthManager item in HealthManager.EnumerateActiveEnemies()) { if ((Object)(object)item != (Object)null) { action(item); } } } catch { } } private static bool IsDead(HealthManager healthManager) { try { return IsDeadField != null && Convert.ToBoolean(IsDeadField.GetValue(healthManager)); } catch { return false; } } private static bool IsBoss(HealthManager healthManager, HashSet visited) { if ((Object)(object)healthManager == (Object)null) { return false; } int instanceID = ((Object)healthManager).GetInstanceID(); if (!visited.Add(instanceID)) { return false; } GameObject gameObject = ((Component)healthManager).gameObject; if ((Object)(object)gameObject == (Object)null) { return false; } if (HasBossName(((Object)gameObject).name) || HasBossController(gameObject) || IsRegisteredBoss(healthManager)) { return true; } try { HealthManager val = (HealthManager)((SendDamageToField != null) ? /*isinst with value type is only supported in some contexts*/: null); return (Object)(object)val != (Object)null && IsBoss(val, visited); } catch { return false; } } internal static bool IsBossSource(GameObject source) { if ((Object)(object)source == (Object)null) { return false; } try { HealthManager componentInParent = source.GetComponentInParent(); if ((Object)(object)componentInParent != (Object)null && IsBoss(componentInParent, new HashSet())) { return true; } } catch { } if (!HasBossName(((Object)source).name)) { return HasBossController(source); } return true; } internal static bool IsBossEncounterActive() { try { if (BossSceneController.IsBossScene) { return true; } } catch { } if (Instance != null) { return Instance.HasActiveBossEncounter(); } return false; } internal static void NotifyBossCombat(GameObject source) { //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) if (Instance == null) { return; } Instance._lastConfirmedBossCombatAt = Time.realtimeSinceStartup; try { EnemyStatsController instance = Instance; int handle; if ((Object)(object)source != (Object)null) { Scene scene = source.scene; if (((Scene)(ref scene)).IsValid()) { Scene scene2 = source.scene; handle = ((Scene)(ref scene2)).handle; goto IL_0052; } } Scene activeScene = SceneManager.GetActiveScene(); handle = ((Scene)(ref activeScene)).handle; goto IL_0052; IL_0052: instance._lastConfirmedBossSceneHandle = handle; } catch { Instance._lastConfirmedBossSceneHandle = int.MinValue; } if ((Object)(object)source == (Object)null) { return; } try { HealthManager componentInParent = source.GetComponentInParent(); if ((Object)(object)componentInParent != (Object)null && IsBoss(componentInParent, new HashSet())) { Instance._activeBosses[((Object)componentInParent).GetInstanceID()] = componentInParent; } } catch { } } private bool HasActiveBossEncounter() { //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) List list = new List(); foreach (KeyValuePair activeBoss in _activeBosses) { HealthManager value = activeBoss.Value; if ((Object)(object)value == (Object)null || (Object)(object)((Component)value).gameObject == (Object)null || IsDead(value) || !((Behaviour)value).enabled || !((Component)value).gameObject.activeInHierarchy) { list.Add(activeBoss.Key); continue; } return true; } for (int i = 0; i < list.Count; i++) { _activeBosses.Remove(list[i]); } try { Scene activeScene = SceneManager.GetActiveScene(); int handle = ((Scene)(ref activeScene)).handle; return handle == _lastConfirmedBossSceneHandle && Time.realtimeSinceStartup - _lastConfirmedBossCombatAt <= 3f; } catch { return false; } } private static bool HasBossName(string objectName) { if (string.IsNullOrEmpty(objectName)) { return false; } if (objectName.IndexOf("Boss", StringComparison.OrdinalIgnoreCase) >= 0) { return true; } for (int i = 0; i < KnownBossNames.Length; i++) { if (objectName.IndexOf(KnownBossNames[i], StringComparison.OrdinalIgnoreCase) >= 0) { return true; } } return false; } private static bool HasBossController(GameObject target) { try { MonoBehaviour[] componentsInParent = target.GetComponentsInParent(true); foreach (MonoBehaviour val in componentsInParent) { if ((Object)(object)val != (Object)null && ((object)val).GetType().Name.IndexOf("Boss", StringComparison.OrdinalIgnoreCase) >= 0) { return true; } } } catch { } return false; } private static bool IsRegisteredBoss(HealthManager healthManager) { try { GameObject val = (GameObject)((BattleSceneField != null) ? /*isinst with value type is only supported in some contexts*/: null); BossSceneController val2 = (((Object)(object)val != (Object)null) ? val.GetComponent() : null); HealthManager[] array = (((Object)(object)val2 != (Object)null && BossesField != null) ? (BossesField.GetValue(val2) as HealthManager[]) : null); if (array == null) { return false; } for (int i = 0; i < array.Length; i++) { if ((Object)(object)array[i] == (Object)(object)healthManager) { return true; } } } catch { } return false; } internal static int GetHealth(HealthManager healthManager) { try { return (HealthField != null) ? Convert.ToInt32(HealthField.GetValue(healthManager)) : 0; } catch { return 0; } } internal static int GetInitialHealth(HealthManager healthManager) { try { return (InitialHealthField != null) ? Convert.ToInt32(InitialHealthField.GetValue(healthManager)) : 0; } catch { return 0; } } internal static void SetHealth(HealthManager healthManager, int health, int initialHealth) { try { if (InitialHealthField != null) { InitialHealthField.SetValue(healthManager, initialHealth); } if (HealthField != null) { HealthField.SetValue(healthManager, health); } } catch { } } } [DefaultExecutionOrder(32000)] internal sealed class EnemyRuntimeState : MonoBehaviour { private sealed class AggressionVariableState { public FsmFloat Variable; public float BaseValue; public float AppliedValue; public float AppliedMultiplier = 1f; } private sealed class AlertRangeColliderState { public Collider2D Collider; public int Kind; public Vector2 BaseSize; public Vector2 AppliedSize; public float BaseRadius; public float AppliedRadius; } private static readonly string[] AggressionVariableTerms = new string[23] { "Aggro", "Agro", "Detect", "Detection", "Sight", "Vision", "Alert Range", "Engage", "Wake Range", "Chase Range", "Hero Range", "Target Range", "Notice", "Proximity", "Awareness", "Aware Range", "Pursuit", "Acquire Range", "Search Range", "Hearing", "Listen Range", "Activation Range", "Trigger Range" }; private HealthManager _healthManager; private Rigidbody2D _body; private readonly List _aggressionVariables = new List(); private readonly List _alertRangeColliders = new List(); private int _baseInitialHealth; private int _appliedInitialHealth; private bool _healthCaptured; private bool _isBoss; private float _randomHealthMultiplier; private float _speedMultiplier = 1f; private float _aggressionMultiplier = 1f; private float _nextAggressionRefreshAt; private float _lastAppliedSpeedMultiplier = 1f; private Vector2 _lastScaledVelocity; private bool _velocityWasScaled; public float RandomHealthMultiplier { get { if (_randomHealthMultiplier <= 0f) { _randomHealthMultiplier = Random.Range(0.1f, 5.0001f); } return _randomHealthMultiplier; } } public void Initialize(HealthManager healthManager, bool isBoss) { _healthManager = healthManager; _isBoss = isBoss; if ((Object)(object)_body == (Object)null && (Object)(object)healthManager != (Object)null) { _body = ((Component)healthManager).GetComponent(); if ((Object)(object)_body == (Object)null) { _body = ((Component)healthManager).GetComponentInParent(); } } if (!_isBoss) { CaptureAggressionVariables(); } } public void ApplyHealth(float multiplier) { if ((Object)(object)_healthManager == (Object)null) { return; } int initialHealth = EnemyStatsController.GetInitialHealth(_healthManager); int health = EnemyStatsController.GetHealth(_healthManager); if (initialHealth > 0 && health > 0) { if (!_healthCaptured) { _baseInitialHealth = initialHealth; _appliedInitialHealth = initialHealth; _healthCaptured = true; } else if (initialHealth != _appliedInitialHealth && initialHealth != _baseInitialHealth) { _baseInitialHealth = initialHealth; _appliedInitialHealth = initialHealth; } int num = Math.Max(1, initialHealth); float num2 = Mathf.Clamp01((float)health / (float)num); float num3 = ((float.IsNaN(multiplier) || float.IsInfinity(multiplier)) ? 1f : Mathf.Clamp(multiplier, 0.1f, 3000f)); double val = Math.Round((double)_baseInitialHealth * (double)num3, MidpointRounding.AwayFromZero); int num4 = (int)Math.Max(1.0, Math.Min(2147483647.0, val)); int health2 = Math.Max(1, Math.Min(num4, Mathf.RoundToInt((float)num4 * num2))); EnemyStatsController.SetHealth(_healthManager, health2, num4); _appliedInitialHealth = num4; } } public void SetSpeedMultiplier(float multiplier) { _speedMultiplier = ((float.IsNaN(multiplier) || float.IsInfinity(multiplier)) ? 1f : Mathf.Clamp(multiplier, 0.1f, 20f)); } public void SetAggressionMultiplier(float multiplier) { if (_isBoss) { _aggressionMultiplier = 1f; RestoreAggressionVariables(); } else { _aggressionMultiplier = ValueValidator.NormalizeMultiplier(multiplier); ApplyAggressionMultiplier(); } } private void ApplyAggressionMultiplier() { CaptureAggressionVariables(); CaptureAlertRangeColliders(); float aggressionMultiplier = _aggressionMultiplier; for (int i = 0; i < _aggressionVariables.Count; i++) { AggressionVariableState aggressionVariableState = _aggressionVariables[i]; if (aggressionVariableState.Variable != null) { float value = aggressionVariableState.Variable.Value; if (!float.IsNaN(value) && !float.IsInfinity(value) && Mathf.Abs(value - aggressionVariableState.AppliedValue) > 0.001f && Mathf.Abs(value - aggressionVariableState.BaseValue) > 0.001f) { aggressionVariableState.BaseValue = value; } float num = aggressionVariableState.BaseValue * aggressionMultiplier; if (float.IsNaN(num) || float.IsInfinity(num)) { num = aggressionVariableState.BaseValue; } aggressionVariableState.AppliedValue = Mathf.Clamp(num, 0.001f, 100000f); aggressionVariableState.AppliedMultiplier = aggressionMultiplier; aggressionVariableState.Variable.Value = aggressionVariableState.AppliedValue; } } ApplyAlertRangeColliders(aggressionMultiplier); } public void RestoreVanillaValues() { ApplyHealth(1f); _speedMultiplier = 1f; RestoreVelocity(); RestoreAggressionVariables(); } public void RestoreVelocity() { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_body == (Object)null || !_velocityWasScaled) { _velocityWasScaled = false; _lastAppliedSpeedMultiplier = 1f; return; } Vector2 velocity = _body.velocity; _body.velocity = GetUnscaledVelocity(velocity); _velocityWasScaled = false; _lastAppliedSpeedMultiplier = 1f; } private void OnDisable() { RestoreVelocity(); } private void FixedUpdate() { //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_004e: 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) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) if (!_isBoss && Time.realtimeSinceStartup >= _nextAggressionRefreshAt) { _nextAggressionRefreshAt = Time.realtimeSinceStartup + 0.5f; ApplyAggressionMultiplier(); } if ((Object)(object)_body == (Object)null) { return; } float speedMultiplier = _speedMultiplier; Vector2 velocity = _body.velocity; Vector2 val = velocity; if (_velocityWasScaled) { val = GetUnscaledVelocity(velocity); } if (Math.Abs(speedMultiplier - 1f) < 0.001f) { if (_velocityWasScaled) { _body.velocity = val; } _velocityWasScaled = false; _lastAppliedSpeedMultiplier = 1f; } else { Vector2 val2 = val * speedMultiplier; _body.velocity = val2; _lastScaledVelocity = val2; _lastAppliedSpeedMultiplier = speedMultiplier; _velocityWasScaled = true; } } private Vector2 GetUnscaledVelocity(Vector2 currentVelocity) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) float num = Math.Max(0.1f, _lastAppliedSpeedMultiplier); Vector2 result = currentVelocity; if (Mathf.Abs(currentVelocity.x - _lastScaledVelocity.x) <= 0.08f) { result.x = currentVelocity.x / num; } if (Mathf.Abs(currentVelocity.y - _lastScaledVelocity.y) <= GetVelocityTolerance()) { result.y = currentVelocity.y / num; } return result; } private float GetVelocityTolerance() { //IL_0015: Unknown result type (might be due to invalid IL or missing references) float num = (((Object)(object)_body != (Object)null) ? Mathf.Abs(Physics2D.gravity.y * _body.gravityScale * Time.fixedDeltaTime) : 0f); return Mathf.Max(0.08f, num * 1.75f + 0.04f); } private void CaptureAggressionVariables() { if (!((Object)(object)_healthManager == (Object)null)) { PlayMakerFSM[] componentsInChildren; PlayMakerFSM[] componentsInParent; try { componentsInChildren = ((Component)_healthManager).GetComponentsInChildren(true); componentsInParent = ((Component)_healthManager).GetComponentsInParent(true); } catch { return; } CaptureAggressionVariables(componentsInChildren); CaptureAggressionVariables(componentsInParent); } } private void CaptureAggressionVariables(PlayMakerFSM[] fsms) { if (fsms == null) { return; } foreach (PlayMakerFSM val in fsms) { FsmFloat[] array = (((Object)(object)val != (Object)null && val.FsmVariables != null) ? val.FsmVariables.FloatVariables : null); if (array == null) { continue; } foreach (FsmFloat val2 in array) { if (val2 != null && !(val2.Value <= 0f) && !float.IsNaN(val2.Value) && !float.IsInfinity(val2.Value) && IsAggressionVariable(((NamedVariable)val2).Name) && !ContainsAggressionVariable(val2)) { _aggressionVariables.Add(new AggressionVariableState { Variable = val2, BaseValue = val2.Value, AppliedValue = val2.Value }); } } } } private bool ContainsAggressionVariable(FsmFloat variable) { for (int i = 0; i < _aggressionVariables.Count; i++) { if (object.ReferenceEquals(_aggressionVariables[i].Variable, variable)) { return true; } } return false; } private static bool IsAggressionVariable(string variableName) { if (string.IsNullOrEmpty(variableName)) { return false; } for (int i = 0; i < AggressionVariableTerms.Length; i++) { if (variableName.IndexOf(AggressionVariableTerms[i], StringComparison.OrdinalIgnoreCase) >= 0) { return true; } } return false; } private void CaptureAlertRangeColliders() { if ((Object)(object)_healthManager == (Object)null) { return; } try { CaptureAlertRangeColliders(((Component)_healthManager).GetComponentsInChildren(true)); if ((Object)(object)_body != (Object)null && (Object)(object)((Component)_body).gameObject != (Object)(object)((Component)_healthManager).gameObject) { CaptureAlertRangeColliders(((Component)_body).GetComponentsInChildren(true)); } } catch { } } private void CaptureAlertRangeColliders(AlertRange[] alertRanges) { //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_008f: 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_009d: Unknown result type (might be due to invalid IL or missing references) //IL_0139: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Unknown result type (might be due to invalid IL or missing references) //IL_0147: Unknown result type (might be due to invalid IL or missing references) //IL_014c: Unknown result type (might be due to invalid IL or missing references) if (alertRanges == null) { return; } foreach (AlertRange val in alertRanges) { if ((Object)(object)val == (Object)null) { continue; } Collider2D[] componentsInChildren = ((Component)val).GetComponentsInChildren(true); foreach (Collider2D val2 in componentsInChildren) { if ((Object)(object)val2 == (Object)null || !val2.isTrigger || ContainsAlertRangeCollider(val2)) { continue; } BoxCollider2D val3 = (BoxCollider2D)(object)((val2 is BoxCollider2D) ? val2 : null); if ((Object)(object)val3 != (Object)null) { _alertRangeColliders.Add(new AlertRangeColliderState { Collider = val2, Kind = 1, BaseSize = val3.size, AppliedSize = val3.size }); continue; } CircleCollider2D val4 = (CircleCollider2D)(object)((val2 is CircleCollider2D) ? val2 : null); if ((Object)(object)val4 != (Object)null) { _alertRangeColliders.Add(new AlertRangeColliderState { Collider = val2, Kind = 2, BaseRadius = val4.radius, AppliedRadius = val4.radius }); continue; } CapsuleCollider2D val5 = (CapsuleCollider2D)(object)((val2 is CapsuleCollider2D) ? val2 : null); if ((Object)(object)val5 != (Object)null) { _alertRangeColliders.Add(new AlertRangeColliderState { Collider = val2, Kind = 3, BaseSize = val5.size, AppliedSize = val5.size }); } } } } private bool ContainsAlertRangeCollider(Collider2D collider) { for (int i = 0; i < _alertRangeColliders.Count; i++) { if (object.ReferenceEquals(_alertRangeColliders[i].Collider, collider)) { return true; } } return false; } private void ApplyAlertRangeColliders(float multiplier) { //IL_0048: 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_0114: Unknown result type (might be due to invalid IL or missing references) //IL_0122: Unknown result type (might be due to invalid IL or missing references) for (int i = 0; i < _alertRangeColliders.Count; i++) { AlertRangeColliderState alertRangeColliderState = _alertRangeColliders[i]; if ((Object)(object)alertRangeColliderState.Collider == (Object)null) { continue; } if (alertRangeColliderState.Kind == 1) { Collider2D collider = alertRangeColliderState.Collider; BoxCollider2D val = (BoxCollider2D)(object)((collider is BoxCollider2D) ? collider : null); if ((Object)(object)val != (Object)null) { UpdateColliderSize(alertRangeColliderState, val.size, multiplier); val.size = alertRangeColliderState.AppliedSize; } } else if (alertRangeColliderState.Kind == 2) { Collider2D collider2 = alertRangeColliderState.Collider; CircleCollider2D val2 = (CircleCollider2D)(object)((collider2 is CircleCollider2D) ? collider2 : null); if ((Object)(object)val2 != (Object)null) { if (Mathf.Abs(val2.radius - alertRangeColliderState.AppliedRadius) > 0.001f && Mathf.Abs(val2.radius - alertRangeColliderState.BaseRadius) > 0.001f) { alertRangeColliderState.BaseRadius = val2.radius; } alertRangeColliderState.AppliedRadius = Mathf.Clamp(alertRangeColliderState.BaseRadius * multiplier, 0.01f, 100000f); val2.radius = alertRangeColliderState.AppliedRadius; } } else if (alertRangeColliderState.Kind == 3) { Collider2D collider3 = alertRangeColliderState.Collider; CapsuleCollider2D val3 = (CapsuleCollider2D)(object)((collider3 is CapsuleCollider2D) ? collider3 : null); if ((Object)(object)val3 != (Object)null) { UpdateColliderSize(alertRangeColliderState, val3.size, multiplier); val3.size = alertRangeColliderState.AppliedSize; } } } } private static void UpdateColliderSize(AlertRangeColliderState state, Vector2 currentSize, float multiplier) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0076: 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_001b: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) Vector2 val = currentSize - state.AppliedSize; if (((Vector2)(ref val)).sqrMagnitude > 1E-06f) { Vector2 val2 = currentSize - state.BaseSize; if (((Vector2)(ref val2)).sqrMagnitude > 1E-06f) { state.BaseSize = currentSize; } } state.AppliedSize = new Vector2(Mathf.Clamp(state.BaseSize.x * multiplier, 0.01f, 100000f), Mathf.Clamp(state.BaseSize.y * multiplier, 0.01f, 100000f)); } private void RestoreAggressionVariables() { _aggressionMultiplier = 1f; for (int i = 0; i < _aggressionVariables.Count; i++) { AggressionVariableState aggressionVariableState = _aggressionVariables[i]; if (aggressionVariableState.Variable != null) { aggressionVariableState.Variable.Value = aggressionVariableState.BaseValue; aggressionVariableState.AppliedValue = aggressionVariableState.BaseValue; aggressionVariableState.AppliedMultiplier = 1f; } } ApplyAlertRangeColliders(1f); } } [HarmonyPatch(typeof(HealthManager), "OnEnable")] internal static class EnemyStatsHealthEnablePatch { private static void Postfix(HealthManager __instance) { if (EnemyStatsController.Instance != null) { EnemyStatsController.Instance.Register(__instance); } } } [HarmonyPatch(typeof(HealthManager), "Start")] internal static class EnemyStatsHealthStartPatch { private static void Postfix(HealthManager __instance) { if (EnemyStatsController.Instance != null) { EnemyStatsController.Instance.Register(__instance); } } } [HarmonyPatch(typeof(HealthManager), "OnDisable")] internal static class EnemyStatsHealthDisablePatch { private static void Prefix(HealthManager __instance) { if (!((Object)(object)__instance == (Object)null)) { if (EnemyStatsController.Instance != null) { EnemyStatsController.Instance.Unregister(__instance); } EnemyRuntimeState component = ((Component)__instance).GetComponent(); if ((Object)(object)component != (Object)null) { component.RestoreVelocity(); } } } } internal sealed class ExtendedHealthHud { private sealed class NativeHealthSlot { public readonly int Number; public readonly GameObject GameObject; public NativeHealthSlot(int number, GameObject gameObject) { Number = number; GameObject = gameObject; } } private const int NativeHudCapacity = 11; private const int ExtendedHudCapacity = 40; private const float SearchIntervalSeconds = 1f; private readonly ManualLogSource _logger; private readonly List _createdSlots = new List(); private float _nextSearchAt; public ExtendedHealthHud(ManualLogSource logger) { _logger = logger; } public void Update() { if (!HasValidExtension() && !(Time.unscaledTime < _nextSearchAt)) { _nextSearchAt = Time.unscaledTime + 1f; RemoveCreatedSlots(); TryCreateNativeSlots(); } } public void Shutdown() { RemoveCreatedSlots(); } private bool HasValidExtension() { if (_createdSlots.Count == 29) { return (Object)(object)_createdSlots[0] != (Object)null; } return false; } private void TryCreateNativeSlots() { //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_012c: Unknown result type (might be due to invalid IL or missing references) //IL_0131: Unknown result type (might be due to invalid IL or missing references) //IL_0138: Unknown result type (might be due to invalid IL or missing references) //IL_013d: Unknown result type (might be due to invalid IL or missing references) List list = FindNativeSlots(); if (list.Count < 11) { return; } list.Sort(delegate(NativeHealthSlot left, NativeHealthSlot right) { int number = left.Number; return number.CompareTo(right.Number); }); NativeHealthSlot nativeHealthSlot = list[0]; NativeHealthSlot nativeHealthSlot2 = list[list.Count - 2]; NativeHealthSlot nativeHealthSlot3 = list[list.Count - 1]; if (nativeHealthSlot.Number != 1 || nativeHealthSlot3.Number < 11 || (Object)(object)nativeHealthSlot3.GameObject == (Object)null || (Object)(object)nativeHealthSlot3.GameObject.transform.parent == (Object)null) { return; } Vector3 val = nativeHealthSlot3.GameObject.transform.localPosition - nativeHealthSlot2.GameObject.transform.localPosition; if (((Vector3)(ref val)).sqrMagnitude < 0.0001f) { return; } GameObject gameObject = nativeHealthSlot3.GameObject; bool activeSelf = gameObject.activeSelf; gameObject.SetActive(false); try { for (int num = 12; num <= 40; num++) { GameObject val2 = Object.Instantiate(gameObject, gameObject.transform.parent, false); ((Object)val2).name = "CustomDifficulty Health Slot " + num; val2.transform.localPosition = nativeHealthSlot.GameObject.transform.localPosition + val * (float)(num - 1); SetHealthNumber(val2, num); val2.SetActive(activeSelf); _createdSlots.Add(val2); } } finally { gameObject.SetActive(activeSelf); } EventRegister.SendEvent(EventRegisterEvents.HealthUpdate, (GameObject)null); _logger.LogInfo((object)"HUD de vida ampliado para 40 posicoes nativas; Sangue Vital continua apos a vida permanente."); } private static List FindNativeSlots() { Dictionary dictionary = new Dictionary(); PlayMakerFSM[] array = Resources.FindObjectsOfTypeAll(); foreach (PlayMakerFSM val in array) { if (!((Object)(object)val == (Object)null) && !((Object)(object)((Component)val).gameObject == (Object)null) && string.Equals(val.FsmName, "health_display", StringComparison.OrdinalIgnoreCase)) { FsmInt val2 = val.FsmVariables.FindFsmInt("Health Number"); if (val2 != null && val2.Value >= 1 && val2.Value <= 11 && !dictionary.ContainsKey(val2.Value)) { dictionary.Add(val2.Value, new NativeHealthSlot(val2.Value, ((Component)val).gameObject)); } } } return new List(dictionary.Values); } private static void SetHealthNumber(GameObject slot, int number) { PlayMakerFSM[] components = slot.GetComponents(); for (int i = 0; i < components.Length; i++) { FsmInt val = components[i].FsmVariables.FindFsmInt("Health Number"); if (val != null) { val.Value = number; } } } private void RemoveCreatedSlots() { for (int i = 0; i < _createdSlots.Count; i++) { if ((Object)(object)_createdSlots[i] != (Object)null) { Object.Destroy((Object)(object)_createdSlots[i]); } } _createdSlots.Clear(); } } internal sealed class IncomingDamageController { private struct DamageContext { public readonly bool IsEnvironmental; public readonly bool IsBoss; public readonly GameObject Source; public DamageContext(bool isEnvironmental, bool isBoss, GameObject source) { IsEnvironmental = isEnvironmental; IsBoss = isBoss; Source = source; } } [ThreadStatic] private static Stack _damageContexts; [ThreadStatic] private static int _takeHealthDepth; private readonly SettingsStore _settingsStore; public static IncomingDamageController Instance; public IncomingDamageController(SettingsStore settingsStore) { _settingsStore = settingsStore; Instance = this; } public void BeginDetailedDamage(GameObject source, HazardType hazardType) { //IL_0027: Unknown result type (might be due to invalid IL or missing references) if (_damageContexts == null) { _damageContexts = new Stack(); } bool flag = EnemyStatsController.IsBossSource(source); if (flag) { EnemyStatsController.NotifyBossCombat(source); } _damageContexts.Push(new DamageContext(IsEnvironmentalHazard(source, hazardType), flag, source)); } public void EndDetailedDamage() { if (_damageContexts != null && _damageContexts.Count > 0) { _damageContexts.Pop(); } } public int ScaleFallbackDamage(int amount) { if (_settingsStore.IsEnabled(ModSettingKind.OneHitMode) && _settingsStore.Current.OneHitMode && PlayerData.HasInstance && PlayerData.instance != null) { return Math.Max(1, PlayerData.instance.health + PlayerData.instance.healthBlue); } bool flag = _damageContexts != null && _damageContexts.Count > 0; bool flag2 = flag && _damageContexts.Peek().IsEnvironmental; bool isBoss = flag && _damageContexts.Peek().IsBoss; GameObject source = (flag ? _damageContexts.Peek().Source : null); ModSettingKind setting = (flag2 ? ModSettingKind.EnvironmentalDamageMultiplier : ModSettingKind.DamageTakenMultiplier); int amount2 = amount; if (!_settingsStore.IsEnabled(setting)) { return ApplyMutatorDamage(amount2, isBoss, flag2, source); } float configuredDamage = (flag2 ? _settingsStore.Current.EnvironmentalDamageMultiplier : _settingsStore.Current.DamageTakenMultiplier); amount2 = ScaleDamage(amount, configuredDamage); return ApplyMutatorDamage(amount2, isBoss, flag2, source); } public bool BeginTakeHealth() { bool result = _takeHealthDepth == 0; _takeHealthDepth++; return result; } public void EndTakeHealth() { _takeHealthDepth = Math.Max(0, _takeHealthDepth - 1); } public void Shutdown() { if (_damageContexts != null) { _damageContexts.Clear(); } _takeHealthDepth = 0; if (Instance == this) { Instance = null; } } internal static int ScaleDamage(int amount, float configuredDamage) { if (amount <= 0) { return amount; } float num = ((float.IsNaN(configuredDamage) || float.IsInfinity(configuredDamage)) ? 1f : ValueValidator.NormalizeDamageMultiplier(configuredDamage)); int num2 = (int)num - 1; long val = (long)amount + (long)num2; return (int)Math.Min(2147483647L, Math.Max(1L, val)); } private int ApplyMutatorDamage(int amount, bool isBoss, bool isEnvironmental, GameObject source) { if (amount <= 0) { return amount; } int num = amount; if (_settingsStore.IsMutatorEnabled(ModSettingKind.MutatorDoubleDamage)) { num = MutatorController.MultiplyDamage(num, 2f); } if (isEnvironmental) { return num; } if (isBoss) { float multiplier = (_settingsStore.IsEnabled(ModSettingKind.BossDamageTakenMultiplier) ? ValueValidator.NormalizeMultiplier(_settingsStore.Current.BossDamageTakenMultiplier) : 1f); num = MutatorController.MultiplyDamage(num, multiplier); if (_settingsStore.IsMutatorEnabled(ModSettingKind.MutatorExtendedFights)) { return 1; } if (_settingsStore.IsMutatorEnabled(ModSettingKind.MutatorBossFrenzy)) { num = MutatorController.MultiplyDamage(num, 2f); } } if (_settingsStore.IsMutatorEnabled(ModSettingKind.MutatorAggressiveEnemies)) { num = MutatorController.MultiplyDamage(num, 2f); } if (isBoss && _settingsStore.IsEnabled(ModSettingKind.BossBrutalMode) && _settingsStore.Current.BossBrutalMode && Random.value < 0.1f) { num = ((num == int.MaxValue) ? int.MaxValue : (num + 1)); } return num; } internal static bool IsEnvironmentalHazard(GameObject source, HazardType hazardType) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Invalid comparison between Unknown and I4 if ((int)hazardType != 0 && (int)hazardType != 1) { return true; } if ((Object)(object)source == (Object)null) { return false; } string sourceName = ((Object)source).name ?? string.Empty; if (!ContainsHazardName(sourceName, "spike") && !ContainsHazardName(sourceName, "acid") && !ContainsHazardName(sourceName, "lava") && !ContainsHazardName(sourceName, "hazard") && !ContainsHazardName(sourceName, "thorn")) { return ContainsHazardName(sourceName, "trap"); } return true; } private static bool ContainsHazardName(string sourceName, string value) { return sourceName.IndexOf(value, StringComparison.OrdinalIgnoreCase) >= 0; } } [HarmonyPatch(typeof(PlayerData), "TakeHealth", new Type[] { typeof(int), typeof(bool), typeof(bool) })] internal static class IncomingDamageFallbackPatch { private static void Prefix(ref int __0, out bool __state) { IncomingDamageController instance = IncomingDamageController.Instance; __state = instance != null; if (__state && instance.BeginTakeHealth()) { __0 = instance.ScaleFallbackDamage(__0); } } private static void Postfix(bool __state) { if (__state && IncomingDamageController.Instance != null) { IncomingDamageController.Instance.EndTakeHealth(); } } private static Exception Finalizer(Exception __exception, bool __state) { if (__exception != null && __state && IncomingDamageController.Instance != null) { IncomingDamageController.Instance.EndTakeHealth(); } return __exception; } } [HarmonyPatch(typeof(HeroController), "TakeDamage", new Type[] { typeof(GameObject), typeof(CollisionSide), typeof(int), typeof(HazardType), typeof(DamagePropertyFlags) })] internal static class DetailedIncomingDamagePatch { private static void Prefix(GameObject __0, HazardType __3, out bool __state) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) IncomingDamageController instance = IncomingDamageController.Instance; __state = instance != null; if (__state) { instance.BeginDetailedDamage(__0, __3); } } private static void Postfix(bool __state) { if (__state && IncomingDamageController.Instance != null) { IncomingDamageController.Instance.EndDetailedDamage(); } } private static Exception Finalizer(Exception __exception, bool __state) { if (__exception != null && __state && IncomingDamageController.Instance != null) { IncomingDamageController.Instance.EndDetailedDamage(); } return __exception; } } internal sealed class LocalizationManager { private static readonly string[] LanguageCodes = new string[12] { "auto", "en", "fr", "de", "es", "it", "pt-BR", "ru", "ja", "ko", "zh-CN", "zh-TW" }; private readonly SettingsStore _settingsStore; private readonly ManualLogSource _logger; private readonly string _localizationDirectory; private readonly Dictionary _english; private readonly Dictionary _sourceAliases; private Dictionary _current; private string _selectedCode = "auto"; private string _resolvedCode = "en"; public string SelectedCode => _selectedCode; public string ResolvedCode => _resolvedCode; public bool IsAutomatic => string.Equals(_selectedCode, "auto", StringComparison.OrdinalIgnoreCase); public int LanguageCount => LanguageCodes.Length; public LocalizationManager(SettingsStore settingsStore, ManualLogSource logger, string localizationDirectory) { _settingsStore = settingsStore; _logger = logger; _localizationDirectory = localizationDirectory; _sourceAliases = BuildSourceAliases(); _english = LoadMergedLanguage("en", null); _current = _english; Update(force: true); } public void Update(bool force) { string text = NormalizeCode(_settingsStore.Current.MenuLanguage); string text2 = (string.Equals(text, "auto", StringComparison.OrdinalIgnoreCase) ? MapGameLanguageCode() : text); if (!HasLanguageFile(text2)) { text2 = "en"; } if (force || !string.Equals(text, _selectedCode, StringComparison.OrdinalIgnoreCase) || !string.Equals(text2, _resolvedCode, StringComparison.OrdinalIgnoreCase)) { _selectedCode = text; _resolvedCode = text2; _current = (string.Equals(text2, "en", StringComparison.OrdinalIgnoreCase) ? _english : LoadMergedLanguage(text2, _english)); } } public void Cycle(int direction) { int languageIndex = GetLanguageIndex(_selectedCode); languageIndex = (languageIndex + ((direction >= 0) ? 1 : (-1))) % LanguageCodes.Length; if (languageIndex < 0) { languageIndex += LanguageCodes.Length; } _settingsStore.SetMenuLanguage(LanguageCodes[languageIndex]); Update(force: true); } public void SelectAutomatic() { _settingsStore.SetMenuLanguage("auto"); Update(force: true); } public string Get(string key, string fallback) { if (_current != null && _current.TryGetValue(key, out var value) && !string.IsNullOrEmpty(value)) { return value; } if (_english != null && _english.TryGetValue(key, out value) && !string.IsNullOrEmpty(value)) { return value; } return fallback ?? key ?? string.Empty; } public string Translate(string source) { if (string.IsNullOrEmpty(source)) { return string.Empty; } if (!_sourceAliases.TryGetValue(source, out var value)) { return source; } return Get(value, source); } public string GetSelectedDisplayName() { if (!IsAutomatic) { return GetLanguageDisplayName(_selectedCode); } return Get("language_auto", "Automatic"); } public string GetResolvedDisplayName() { return GetLanguageDisplayName(_resolvedCode); } public string GetSelectionSummary() { if (!IsAutomatic) { return Get("language_manual", "Manual selection") + " → " + GetResolvedDisplayName(); } return Get("language_follow_game", "Following game") + " → " + GetResolvedDisplayName(); } public static string NormalizeCode(string value) { string a = (value ?? string.Empty).Trim(); if (string.Equals(a, "Automatic", StringComparison.OrdinalIgnoreCase)) { return "auto"; } if (string.Equals(a, "Portuguese", StringComparison.OrdinalIgnoreCase) || string.Equals(a, "PT", StringComparison.OrdinalIgnoreCase)) { return "pt-BR"; } if (string.Equals(a, "English", StringComparison.OrdinalIgnoreCase)) { return "en"; } for (int i = 0; i < LanguageCodes.Length; i++) { if (string.Equals(a, LanguageCodes[i], StringComparison.OrdinalIgnoreCase)) { return LanguageCodes[i]; } } return "auto"; } private Dictionary LoadMergedLanguage(string code, Dictionary fallback) { Dictionary dictionary = ((fallback != null) ? new Dictionary(fallback, StringComparer.OrdinalIgnoreCase) : new Dictionary(StringComparer.OrdinalIgnoreCase)); MergeFile(dictionary, Path.Combine(_localizationDirectory, code + ".json")); MergeFile(dictionary, Path.Combine(_localizationDirectory, code + ".ui.json")); return dictionary; } private void MergeFile(Dictionary target, string path) { if (!File.Exists(path)) { return; } try { Dictionary dictionary = JsonConvert.DeserializeObject>(File.ReadAllText(path)); if (dictionary == null) { return; } foreach (KeyValuePair item in dictionary) { target[item.Key] = item.Value; } } catch (Exception ex) { if (_logger != null) { _logger.LogWarning((object)("Falha ao carregar idioma " + path + ": " + ex.Message)); } } } private bool HasLanguageFile(string code) { if (!File.Exists(Path.Combine(_localizationDirectory, code + ".json"))) { return File.Exists(Path.Combine(_localizationDirectory, code + ".ui.json")); } return true; } private static int GetLanguageIndex(string code) { for (int i = 0; i < LanguageCodes.Length; i++) { if (string.Equals(LanguageCodes[i], code, StringComparison.OrdinalIgnoreCase)) { return i; } } return 0; } private static string GetLanguageDisplayName(string code) { return NormalizeCode(code) switch { "fr" => "Français", "de" => "Deutsch", "es" => "Español", "it" => "Italiano", "pt-BR" => "Português (Brasil)", "ru" => "Русский", "ja" => "日本語", "ko" => "한국어", "zh-CN" => "简体中文", "zh-TW" => "繁體中文", "auto" => "Automatic", _ => "English", }; } private static string MapGameLanguageCode() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) try { string text = ((object)Language.CurrentLanguage()).ToString().Replace('-', '_').ToUpperInvariant(); if (text.StartsWith("FR")) { return "fr"; } if (text.StartsWith("DE")) { return "de"; } if (text.StartsWith("ES")) { return "es"; } if (text.StartsWith("IT")) { return "it"; } if (text.StartsWith("PT")) { return "pt-BR"; } if (text.StartsWith("RU")) { return "ru"; } if (text.StartsWith("JA")) { return "ja"; } if (text.StartsWith("KO")) { return "ko"; } if (text.StartsWith("ZH_TW") || text.StartsWith("ZH_HK")) { return "zh-TW"; } if (text.StartsWith("ZH")) { return "zh-CN"; } } catch { } return "en"; } private static Dictionary BuildSourceAliases() { Dictionary dictionary = new Dictionary(StringComparer.OrdinalIgnoreCase); dictionary["NAVEGAÇÃO"] = "navigation"; dictionary["ITENS NESTA ÁREA"] = "items_in_area"; dictionary["PADRÃO"] = "label_default"; dictionary["INTERVALO"] = "comparison_range"; dictionary["DIFICULDADE"] = "difficulty"; dictionary["ESTADO"] = "state"; dictionary["Ativo"] = "active"; dictionary["Inativo"] = "inactive"; dictionary["LIGADO"] = "enabled"; dictionary["DESLIGADO"] = "disabled"; dictionary["LIGAR"] = "enable"; dictionary["DESLIGAR"] = "disable"; dictionary["LIG."] = "enabled_short"; dictionary["DESL."] = "disabled_short"; dictionary["APLICAR"] = "apply"; dictionary["RESETAR"] = "reset"; dictionary["FECHAR"] = "back"; dictionary["SALVAR"] = "action_save_short"; dictionary["CARREGAR"] = "load_preset"; dictionary["ATUALIZAR"] = "reload_presets"; dictionary["EXCLUIR DA ABA"] = "remove_from_tab"; dictionary["APLICAÇÃO EM TEMPO REAL"] = "real_time_application"; dictionary["↻ RESTAURAR TUDO"] = "restore_all"; dictionary["Nenhum"] = "none"; dictionary["Indisponível"] = "unavailable"; dictionary["HABILIDADES DE SEDA"] = "silk_skills_section"; dictionary["Custos e danos individuais das seis Habilidades de Seda. Os valores padrão reproduzem a build 1.0.30000."] = "desc_silk_skills_section"; dictionary["LANÇA DE SEDA"] = "silk_spear_name"; dictionary["TURBILHÃO DE FIOS"] = "thread_storm_name"; dictionary["PONTO CRUZ"] = "cross_stitch_name"; dictionary["DARDO AFIADO"] = "sharpdart_name"; dictionary["FÚRIA DE RUNAS"] = "rune_rage_name"; dictionary["FERRÕES PÁLIDOS"] = "pale_nails_name"; dictionary["Um impacto perfurante. Fórmula vanilla: dano atual da Agulha × 3,00."] = "desc_silk_spear_entry"; dictionary["Impactos separados a cada 6 passos de física. O FSM troca o multiplicador após 0,5 s."] = "desc_thread_storm_entry"; dictionary["Contra-ataque de quatro impactos, criado somente após uma defesa bem-sucedida."] = "desc_cross_stitch_entry"; dictionary["Na build atual, usa um único DamageEnemies de 2,75x por inimigo atravessado."] = "desc_sharpdart_entry"; dictionary["Nove runas independentes. A redução por impactos repetidos pertence a cada inimigo."] = "desc_rune_rage_entry"; dictionary["Três projéteis independentes, cada um usando o dano atual da Agulha."] = "desc_pale_nails_entry"; dictionary["FERRAMENTAS VERMELHAS"] = "red_tools_section"; dictionary["FERRAMENTAS AZUIS"] = "blue_tools_section"; dictionary["FERRAMENTAS AMARELAS"] = "yellow_tools_section"; dictionary["Dispositivos ativos, como projéteis, armadilhas e bombas; os usos são reabastecidos com Fragmentos de Concha."] = "desc_red_tools_section"; dictionary["Melhorias passivas defensivas e ofensivas: proteção extra, resistência a perigos e aplicação de efeitos."] = "desc_blue_tools_section"; dictionary["Melhorias passivas ofensivas ou de suporte, voltadas a reforçar ataques e vantagens de exploração."] = "desc_yellow_tools_section"; return dictionary; } } internal enum MenuSection { Summary, Favorites, Player, Damage, Enemies, Bosses, EnemyEditor, Drops, Economy, Movement, Mutators, Presets, System } internal sealed class LockedOptionDefinition { public readonly MenuSection Section; public readonly string Label; public readonly string Value; public LockedOptionDefinition(MenuSection section, string label, string value) { Section = section; Label = label; Value = value; } } internal static class LockedOptionCatalog { public static readonly MenuSection[] Sections = new MenuSection[13] { MenuSection.Summary, MenuSection.Favorites, MenuSection.Player, MenuSection.Damage, MenuSection.Enemies, MenuSection.Bosses, MenuSection.EnemyEditor, MenuSection.Drops, MenuSection.Economy, MenuSection.Movement, MenuSection.Mutators, MenuSection.Presets, MenuSection.System }; private static readonly LockedOptionDefinition[] Options = new LockedOptionDefinition[18] { Option(MenuSection.EnemyEditor, "Busca de inimigos", "Indisponível"), Option(MenuSection.EnemyEditor, "Filtro de inimigos", "Todos"), Option(MenuSection.EnemyEditor, "Ativar inimigo ou Boss", "Desligado"), Option(MenuSection.EnemyEditor, "Vida exata", "Padrão"), Option(MenuSection.EnemyEditor, "Dano de contato", "Padrão"), Option(MenuSection.EnemyEditor, "Dano recebido da criatura", "1,0x"), Option(MenuSection.EnemyEditor, "Dano da Hornet contra ela", "1,0x"), Option(MenuSection.EnemyEditor, "Velocidade", "1,0x"), Option(MenuSection.EnemyEditor, "Tamanho / escala", "1,0x"), Option(MenuSection.EnemyEditor, "Cooldown de ataque", "1,0x"), Option(MenuSection.EnemyEditor, "Agressividade / detecção", "1,0x"), Option(MenuSection.EnemyEditor, "Projéteis / invocações", "1,0x"), Option(MenuSection.EnemyEditor, "Loot / recompensa", "1,0x"), Option(MenuSection.EnemyEditor, "Salvar ficha", "Indisponível"), Option(MenuSection.EnemyEditor, "Resetar ficha", "Indisponível"), Option(MenuSection.EnemyEditor, "Copiar ficha", "Indisponível"), Option(MenuSection.EnemyEditor, "Colar ficha", "Indisponível"), Option(MenuSection.EnemyEditor, "Resetar todas as fichas", "Indisponível") }; public static int LockedOptionCount { get { int num = 0; for (int i = 0; i < Options.Length; i++) { if (Options[i].Section == MenuSection.EnemyEditor) { num++; } } return num; } } public static string GetSectionLabel(MenuSection section) { return section switch { MenuSection.Summary => "Resumo", MenuSection.Favorites => "Favoritos", MenuSection.Player => "Jogador", MenuSection.Damage => "Dano e Ferramentas", MenuSection.Enemies => "Inimigos", MenuSection.Bosses => "Bosses", MenuSection.EnemyEditor => "Editor de Inimigos", MenuSection.Drops => "Drops", MenuSection.Economy => "Economia", MenuSection.Movement => "Movimento", MenuSection.Mutators => "Mutadores", MenuSection.Presets => "Presets", _ => "Sistema", }; } public static List GetOptions(MenuSection section) { List list = new List(); if (section != MenuSection.EnemyEditor) { return list; } LockedOptionDefinition[] options = Options; foreach (LockedOptionDefinition lockedOptionDefinition in options) { if (lockedOptionDefinition.Section == section) { list.Add(lockedOptionDefinition); } } return list; } private static LockedOptionDefinition Option(MenuSection section, string label, string value) { return new LockedOptionDefinition(section, label, value); } } internal sealed class MaximumHealthController { private readonly SettingsStore _settingsStore; private readonly ManualLogSource _logger; private int _lastProfileId = -1; private int _lastAppliedMaximum; public static MaximumHealthController Instance; public MaximumHealthController(SettingsStore settingsStore, ManualLogSource logger) { _settingsStore = settingsStore; _logger = logger; _settingsStore.Changed += OnSettingChanged; Instance = this; } public void Synchronize(string reason, bool forceHudRefresh) { if (!PlayerData.HasInstance || PlayerData.instance == null) { _lastProfileId = -1; return; } PlayerData instance = PlayerData.instance; bool flag = _lastProfileId != instance.profileID; _lastProfileId = instance.profileID; int num = ((instance.maxHealthBase > 0) ? instance.maxHealthBase : instance.maxHealth); if (num > 0) { _settingsStore.EnsureMaximumHealthInitialized(num); Apply(forceHudRefresh || flag, reason); } } public void ApplyImmediately() { Synchronize("aplicacao imediata", forceHudRefresh: true); } public void Shutdown() { _settingsStore.Changed -= OnSettingChanged; if (Instance == this) { Instance = null; } } private void OnSettingChanged(ModSettingKind setting) { if (setting == ModSettingKind.MaximumHealth || setting == ModSettingKind.MutatorGlassCannon) { Synchronize("alteracao da configuracao", forceHudRefresh: true); } } private void Apply(bool forceHudRefresh, string reason) { if (!PlayerData.HasInstance || PlayerData.instance == null) { return; } int num = (_settingsStore.IsMutatorEnabled(ModSettingKind.MutatorGlassCannon) ? 1 : (_settingsStore.IsEnabled(ModSettingKind.MaximumHealth) ? _settingsStore.Current.MaximumHealth : _settingsStore.Current.DefaultMaximumHealth)); if (num <= 0) { return; } num = ValueValidator.ClampHealth(num); PlayerData instance = PlayerData.instance; bool flag = num > instance.maxHealth || (_lastAppliedMaximum > 0 && num > _lastAppliedMaximum); bool flag2 = instance.maxHealth != num || flag || instance.health > num || instance.prevHealth > num; if (!flag2 && !forceHudRefresh) { return; } instance.maxHealth = num; if (flag) { instance.prevHealth = instance.health; instance.health = num; } else if (instance.health > num) { instance.health = num; } if (instance.prevHealth > num) { instance.prevHealth = num; } _lastAppliedMaximum = num; if (flag2) { _logger.LogInfo((object)("Vida maxima aplicada ao jogo: " + num + " (" + reason + ").")); } try { EventRegister.SendEvent(EventRegisterEvents.HealthUpdate, (GameObject)null); } catch (Exception ex) { _logger.LogWarning((object)("Falha ao atualizar a interface de vida: " + ex.Message)); } } } [HarmonyPatch(typeof(PlayerData), "AddToMaxHealth")] internal static class MaximumHealthUpgradePatch { private static void Postfix() { if (MaximumHealthController.Instance != null) { MaximumHealthController.Instance.ApplyImmediately(); } } } [HarmonyPatch(typeof(PlayerData), "SetupNewPlayerData")] internal static class NewPlayerDataHealthPatch { private static void Postfix() { if (MaximumHealthController.Instance != null) { MaximumHealthController.Instance.Synchronize("novo perfil carregado", forceHudRefresh: true); } } } [HarmonyPatch(typeof(PlayerData), "SetupExistingPlayerData")] internal static class ExistingPlayerDataHealthPatch { private static void Postfix() { if (MaximumHealthController.Instance != null) { MaximumHealthController.Instance.Synchronize("perfil existente carregado", forceHudRefresh: true); } } } [HarmonyPatch(typeof(HeroController), "FinishedEnteringScene")] internal static class HeroEnteredSceneHealthPatch { private static void Postfix() { if (MaximumHealthController.Instance != null) { MaximumHealthController.Instance.Synchronize("entrada na sala", forceHudRefresh: false); } } } internal static class MenuVisualTheme { public const float SpaceXs = 4f; public const float SpaceSm = 8f; public const float SpaceMd = 12f; public const float SpaceLg = 16f; public const float SpaceXl = 24f; public const float SpaceXxl = 32f; public const float RadiusSm = 5f; public const float RadiusMd = 8f; public const float RadiusLg = 12f; public const float TopBarHeight = 78f; public const float FooterHeight = 58f; public const float CategoryHeaderHeight = 78f; public const float SidebarMinWidth = 224f; public const float SidebarMaxWidth = 278f; public const float NavigationRowHeight = 48f; public const float CardHeight = 146f; public const float CardGap = 12f; public const float GridGap = 12f; public const float TwoColumnThreshold = 1010f; public const float MinCardWidth = 458f; public const float HoverTransitionSeconds = 0.12f; public const float SelectionTransitionSeconds = 0.18f; public static readonly Color Backdrop = new Color(0.002f, 0.005f, 0.006f, 0.93f); public static readonly Color Panel = new Color(0.01f, 0.015f, 0.017f, 0.995f); public static readonly Color Sidebar = new Color(0.014f, 0.021f, 0.023f, 0.995f); public static readonly Color Surface = new Color(0.022f, 0.03f, 0.032f, 0.992f); public static readonly Color SurfaceRaised = new Color(0.031f, 0.041f, 0.043f, 0.995f); public static readonly Color SurfaceHover = new Color(0.054f, 0.067f, 0.069f, 0.86f); public static readonly Color Field = new Color(0.008f, 0.013f, 0.015f, 1f); public static readonly Color BorderSubtle = new Color(0.22f, 0.28f, 0.28f, 0.58f); public static readonly Color BorderStrong = new Color(0.34f, 0.42f, 0.41f, 0.78f); public static readonly Color TextPrimary = new Color(0.95f, 0.97f, 0.96f, 1f); public static readonly Color TextSecondary = new Color(0.66f, 0.72f, 0.71f, 1f); public static readonly Color TextMuted = new Color(0.45f, 0.54f, 0.52f, 1f); public static readonly Color Disabled = new Color(0.34f, 0.39f, 0.38f, 1f); public static readonly Color SilkGold = new Color(0.93f, 0.68f, 0.27f, 1f); public static readonly Color SignalCyan = new Color(0.3f, 0.73f, 0.83f, 1f); public static readonly Color FavoritePink = new Color(0.96f, 0.45f, 0.67f, 1f); public static readonly Color LiveGreen = new Color(0.24f, 0.91f, 0.58f, 1f); public static readonly Color Danger = new Color(0.92f, 0.27f, 0.24f, 1f); public static Color WithAlpha(Color color, float alpha) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) return new Color(color.r, color.g, color.b, alpha); } public static Color Tint(Color color, float amount, float alpha) { //IL_001c: Unknown result type (might be due to invalid IL or missing references) return new Color(color.r * amount, color.g * amount, color.b * amount, alpha); } } internal sealed class ModImages : IDisposable { public Texture2D Health; public Texture2D Needle; public Texture2D NeedleUpgrade; public Texture2D WhiteTools; public Texture2D RedTools; public Texture2D BlueTools; public Texture2D YellowTools; public Texture2D SilkSpear; public Texture2D ThreadStorm; public Texture2D CrossStitch; public Texture2D SharpDart; public Texture2D RuneRage; public Texture2D PaleSpines; public Texture2D EnvironmentalDamage; public Texture2D EnemyDamage; public Texture2D Coin; public Texture2D Shard; public Texture2D Shop; public Texture2D Bench; public Texture2D Station; public Texture2D DashRecharge; public Texture2D Invincibility; public Texture2D Timing; public Texture2D Sprint; public Texture2D OneHit; public Texture2D Healing; public Texture2D SilkSpool; public Texture2D WorldSense; public Texture2D BossBrutal; public Texture2D NoHealingBoss; public readonly Dictionary DamageTools = new Dictionary(StringComparer.OrdinalIgnoreCase); public readonly Dictionary SectionIcons = new Dictionary(); public void Dispose() { DestroyTexture(Health); DestroyTexture(Needle); DestroyTexture(NeedleUpgrade); DestroyTexture(WhiteTools); DestroyTexture(RedTools); DestroyTexture(BlueTools); DestroyTexture(YellowTools); DestroyTexture(SilkSpear); DestroyTexture(ThreadStorm); DestroyTexture(CrossStitch); DestroyTexture(SharpDart); DestroyTexture(RuneRage); DestroyTexture(PaleSpines); DestroyTexture(EnvironmentalDamage); DestroyTexture(EnemyDamage); DestroyTexture(Coin); DestroyTexture(Shard); DestroyTexture(Shop); DestroyTexture(Bench); DestroyTexture(Station); DestroyTexture(DashRecharge); DestroyTexture(Invincibility); DestroyTexture(Timing); DestroyTexture(Sprint); DestroyTexture(OneHit); DestroyTexture(Healing); DestroyTexture(SilkSpool); DestroyTexture(WorldSense); DestroyTexture(BossBrutal); DestroyTexture(NoHealingBoss); foreach (Texture2D value in DamageTools.Values) { DestroyTexture(value); } foreach (Texture2D value2 in SectionIcons.Values) { DestroyTexture(value2); } DamageTools.Clear(); SectionIcons.Clear(); Health = null; Needle = null; NeedleUpgrade = null; WhiteTools = null; RedTools = null; BlueTools = null; YellowTools = null; SilkSpear = null; ThreadStorm = null; CrossStitch = null; SharpDart = null; RuneRage = null; PaleSpines = null; Coin = null; Shard = null; Shop = null; Bench = null; Station = null; DashRecharge = null; Invincibility = null; Timing = null; Sprint = null; OneHit = null; Healing = null; SilkSpool = null; WorldSense = null; BossBrutal = null; NoHealingBoss = null; } public Texture2D GetDamageTool(string imageName) { if (string.IsNullOrEmpty(imageName) || !DamageTools.TryGetValue(imageName, out var value)) { return null; } return value; } public Texture2D GetSectionIcon(MenuSection section) { if (!SectionIcons.TryGetValue(section, out var value)) { return null; } return value; } private static void DestroyTexture(Texture2D texture) { if ((Object)(object)texture != (Object)null) { Object.Destroy((Object)(object)texture); } } } internal static class ModImageLoader { private const string HealthImageName = "Inv_0030_inv_health_backboard_mask_full.png"; private const string NeedleImageName = "Inv_0033_inv_nail_04.png"; private const string NeedleUpgradeImageName = "_0007_nail_upgrade_icon.png"; private const string WhiteToolsImageName = "UI_tool_slot_weave0000.png"; private const string RedToolsImageName = "UI_tool_slot_attack0000.png"; private const string BlueToolsImageName = "UI_tool_slot_defend0000.png"; private const string YellowToolsImageName = "UI_tool_slot_explore0000.png"; private const string SilkSpearImageName = "tiny_tool_icon_spell__0000_silk_spear.png"; private const string ThreadStormImageName = "tiny_tool_icon_spell__0004_thread_storm.png"; private const string CrossStitchImageName = "tiny_tool_icon_spell__0002_parry.png"; private const string SharpDartImageName = "tiny_tool_icon_spell__0001_sharp_dart.png"; private const string RuneRageImageName = "tiny_tool_icon_spell__0003_bomb.png"; private const string PaleSpinesImageName = "tiny_tool_icon_spell__0005_needles.png"; private const string EnvironmentalDamageImageName = "ant_spikes_collected.png"; private const string EnemyDamageImageName = "dano.png"; private const string CoinImageName = "HUD_coin_shop.png"; private const string ShardImageName = "HUD_shard_shop.png"; private const string ShopImageName = "pin_shop.png"; private const string BenchImageName = "pin_bench.png"; private const string StationImageName = "pin_stag_station.png"; private const string DashRechargeImageName = "prompt_swiftstep.png"; private const string InvincibilityImageName = "Hornet_icon_0001_T_bell_shield.png"; private const string TimingImageName = "alarm_bell_cog.png"; private const string SprintImageName = "Inv_0029_spell_core_outer_icons_0000_1_sprint.png"; private const string OneHitImageName = "Bone_Goomba_Large_skull.png"; private const string HealingImageName = "Eva_heal_prompt.png"; private const string SilkSpoolImageName = "Inv_Hornet_Spool_0001_1_full.png"; private const string WorldSenseImageName = "hornet_world_sense.png"; private const string BossBrutalImageName = "Spell_Rune__0001_rune_rage_summon.png"; private const string NoHealingBossImageName = "no-healing-boss.png"; private const string DamageToolsDirectoryName = "DamageTools"; private static readonly MethodInfo LoadImageMethod = typeof(ImageConversion).GetMethod("LoadImage", new Type[3] { typeof(Texture2D), typeof(byte[]), typeof(bool) }); public static ModImages Load(string pluginDirectory, ManualLogSource logger) { string text = Path.Combine(pluginDirectory, "Assets"); ModImages modImages = new ModImages(); modImages.Health = LoadTexture(Path.Combine(text, "Inv_0030_inv_health_backboard_mask_full.png"), logger); modImages.Needle = LoadTexture(Path.Combine(text, "Inv_0033_inv_nail_04.png"), logger); modImages.NeedleUpgrade = LoadTexture(Path.Combine(text, "_0007_nail_upgrade_icon.png"), logger); modImages.WhiteTools = LoadTexture(Path.Combine(text, "UI_tool_slot_weave0000.png"), logger); modImages.RedTools = LoadTexture(Path.Combine(text, "UI_tool_slot_attack0000.png"), logger); modImages.BlueTools = LoadTexture(Path.Combine(text, "UI_tool_slot_defend0000.png"), logger); modImages.YellowTools = LoadTexture(Path.Combine(text, "UI_tool_slot_explore0000.png"), logger); modImages.SilkSpear = LoadTexture(Path.Combine(text, "tiny_tool_icon_spell__0000_silk_spear.png"), logger); modImages.ThreadStorm = LoadTexture(Path.Combine(text, "tiny_tool_icon_spell__0004_thread_storm.png"), logger); modImages.CrossStitch = LoadTexture(Path.Combine(text, "tiny_tool_icon_spell__0002_parry.png"), logger); modImages.SharpDart = LoadTexture(Path.Combine(text, "tiny_tool_icon_spell__0001_sharp_dart.png"), logger); modImages.RuneRage = LoadTexture(Path.Combine(text, "tiny_tool_icon_spell__0003_bomb.png"), logger); modImages.PaleSpines = LoadTexture(Path.Combine(text, "tiny_tool_icon_spell__0005_needles.png"), logger); modImages.EnvironmentalDamage = LoadTexture(Path.Combine(text, "ant_spikes_collected.png"), logger); modImages.EnemyDamage = LoadTexture(Path.Combine(text, "dano.png"), logger); modImages.Coin = LoadTexture(Path.Combine(text, "HUD_coin_shop.png"), logger); modImages.Shard = LoadTexture(Path.Combine(text, "HUD_shard_shop.png"), logger); modImages.Shop = LoadTexture(Path.Combine(text, "pin_shop.png"), logger); modImages.Bench = LoadTexture(Path.Combine(text, "pin_bench.png"), logger); modImages.Station = LoadTexture(Path.Combine(text, "pin_stag_station.png"), logger); modImages.DashRecharge = LoadTexture(Path.Combine(text, "prompt_swiftstep.png"), logger); modImages.Invincibility = LoadTexture(Path.Combine(text, "Hornet_icon_0001_T_bell_shield.png"), logger); modImages.Timing = LoadTexture(Path.Combine(text, "alarm_bell_cog.png"), logger); modImages.Sprint = LoadTexture(Path.Combine(text, "Inv_0029_spell_core_outer_icons_0000_1_sprint.png"), logger); modImages.OneHit = LoadTexture(Path.Combine(text, "Bone_Goomba_Large_skull.png"), logger); modImages.Healing = LoadTexture(Path.Combine(text, "Eva_heal_prompt.png"), logger); modImages.SilkSpool = LoadTexture(Path.Combine(text, "Inv_Hornet_Spool_0001_1_full.png"), logger); modImages.WorldSense = LoadTexture(Path.Combine(text, "hornet_world_sense.png"), logger); modImages.BossBrutal = LoadTexture(Path.Combine(text, "Spell_Rune__0001_rune_rage_summon.png"), logger); modImages.NoHealingBoss = LoadTexture(Path.Combine(text, "no-healing-boss.png"), logger); ModImages modImages2 = modImages; LoadSectionIcons(text, modImages2, logger); string text2 = Path.Combine(text, "DamageTools"); if (!Directory.Exists(text2)) { logger.LogWarning((object)("Pasta de imagens das ferramentas nao encontrada: " + text2)); return modImages2; } string[] files = Directory.GetFiles(text2, "*.png"); foreach (string path in files) { Texture2D val = LoadTexture(path, logger); if ((Object)(object)val != (Object)null) { modImages2.DamageTools[Path.GetFileName(path)] = val; } } return modImages2; } private static void LoadSectionIcons(string assetDirectory, ModImages images, ManualLogSource logger) { LoadSectionIcon(images, MenuSection.Summary, assetDirectory, "I_quill_and_map.png", logger); LoadSectionIcon(images, MenuSection.Favorites, assetDirectory, "Hornet_Inv_pane_icons_0002_wish.png", logger); LoadSectionIcon(images, MenuSection.Player, assetDirectory, "Hornet_Inv_pane_icons_0001_crest.png", logger); LoadSectionIcon(images, MenuSection.Damage, assetDirectory, "Hornet_Inv_pane_icons_0003_needle_sharpened.png", logger); LoadSectionIcon(images, MenuSection.Enemies, assetDirectory, "Kill_quest_icon.png", logger); LoadSectionIcon(images, MenuSection.Bosses, assetDirectory, "steel_soul.png", logger); LoadSectionIcon(images, MenuSection.EnemyEditor, assetDirectory, "QI_Journal.png", logger); LoadSectionIcon(images, MenuSection.Drops, assetDirectory, "I_shell_shard_icon_large.png", logger); LoadSectionIcon(images, MenuSection.Economy, assetDirectory, "I_rosary_icon_big_clean.png", logger); LoadSectionIcon(images, MenuSection.Movement, assetDirectory, "T_icon_sprintmaster.png", logger); LoadSectionIcon(images, MenuSection.Mutators, assetDirectory, "Cursed_item_prompt.png", logger); LoadSectionIcon(images, MenuSection.Presets, assetDirectory, "Tools_UI_Crest_Change.png", logger); LoadSectionIcon(images, MenuSection.System, assetDirectory, "Hornet_cog_small_full.png", logger); } private static void LoadSectionIcon(ModImages images, MenuSection section, string assetDirectory, string imageName, ManualLogSource logger) { Texture2D val = LoadTexture(Path.Combine(assetDirectory, imageName), logger); if ((Object)(object)val != (Object)null) { images.SectionIcons[section] = val; } } private static Texture2D LoadTexture(string path, ManualLogSource logger) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Expected O, but got Unknown try { if (!File.Exists(path)) { logger.LogWarning((object)("Imagem nao encontrada: " + path)); return null; } Texture2D val = new Texture2D(2, 2, (TextureFormat)5, false); if (LoadImageMethod == null || !Convert.ToBoolean(LoadImageMethod.Invoke(null, new object[3] { val, File.ReadAllBytes(path), false }))) { Object.Destroy((Object)(object)val); logger.LogWarning((object)("Nao foi possivel carregar a imagem: " + path)); return null; } ((Texture)val).filterMode = (FilterMode)1; ((Texture)val).wrapMode = (TextureWrapMode)1; ((Object)val).name = "CustomDifficulty_" + Path.GetFileNameWithoutExtension(path); return val; } catch (Exception ex) { logger.LogWarning((object)("Falha ao carregar imagem " + path + ": " + ex.Message)); return null; } } } internal enum ModSettingKind { MaximumHealth, NeedleDamage, NeedleUpgradePercentage, SilkSpearDamageMultiplier, SilkSpearSilkCost, ThreadStormSilkCost, ThreadStormNormalHitMultiplier, ThreadStormLateHitMultiplier, CrossStitchSilkCost, CrossStitchHitMultiplier, SharpdartSilkCost, SharpdartMainHitMultiplier, RuneRageSilkCost, RuneRageBaseDamageMultiplier, PaleNailsSilkCost, PaleNailsProjectileMultiplier, DamageTakenMultiplier, EnvironmentalDamageMultiplier, OneHitMode, HealingAmount, HealingCost, InvincibilityTimeMultiplier, EnemyHealthMultiplier, EnemySpeedMultiplier, EnemyAttackSpeedMultiplier, EnemyAggressionMultiplier, BossHealthMultiplier, BossDamageTakenMultiplier, BossSpeedMultiplier, BossAttackSpeedMultiplier, BossBrutalMode, DisableHealingDuringBoss, HealingDuringBossMultiplier, CoinMultiplier, ShardMultiplier, ShopPriceMultiplier, StationPriceMultiplier, DeathRosaryLossPercentage, HornetSpeedMultiplier, DashRechargeLevel, MutatorNoHealing, MutatorLowGravity, MutatorDoubleDamage, MutatorGlassCannon, MutatorFastEnemies, MutatorTankEnemies, MutatorAggressiveEnemies, MutatorRandomEnemyHealth, MutatorRichWorld, MutatorPoorWorld, MutatorExpensiveShops, MutatorNoDeathLoss, MutatorBossFrenzy, MutatorNoMercy, MutatorExtendedFights } [Serializable] internal sealed class ModSettings { public int SettingsSchemaVersion; public int MaximumHealth; public int DefaultMaximumHealth; public bool MaximumHealthEnabled = true; public int NeedleDamage; public int DefaultNeedleDamage; public bool NeedleDamageEnabled = true; public int NeedleUpgradePercentage; public bool NeedleUpgradePercentageEnabled = true; public int SilkSpearDamageMultiplier = 3; public bool SilkSpearDamageMultiplierEnabled = true; public int SilkSpearSilkCost = 4; public bool SilkSpearSilkCostEnabled = true; public int ThreadStormSilkCost = 4; public bool ThreadStormSilkCostEnabled = true; public float ThreadStormNormalHitMultiplier = 0.7f; public bool ThreadStormNormalHitMultiplierEnabled = true; public float ThreadStormLateHitMultiplier = 0.25f; public bool ThreadStormLateHitMultiplierEnabled = true; public int CrossStitchSilkCost = 4; public bool CrossStitchSilkCostEnabled = true; public float CrossStitchHitMultiplier = 0.75f; public bool CrossStitchHitMultiplierEnabled = true; public int SharpdartSilkCost = 4; public bool SharpdartSilkCostEnabled = true; public float SharpdartMainHitMultiplier = 2.75f; public bool SharpdartMainHitMultiplierEnabled = true; public int RuneRageSilkCost = 4; public bool RuneRageSilkCostEnabled = true; public float RuneRageBaseDamageMultiplier = 2.1f; public bool RuneRageBaseDamageMultiplierEnabled = true; public int PaleNailsSilkCost = 4; public bool PaleNailsSilkCostEnabled = true; public float PaleNailsProjectileMultiplier = 1f; public bool PaleNailsProjectileMultiplierEnabled = true; public float DamageTakenMultiplier = 1f; public bool DamageTakenMultiplierEnabled = true; public float EnvironmentalDamageMultiplier = 1f; public bool EnvironmentalDamageMultiplierEnabled = true; public bool OneHitMode; public bool OneHitModeEnabled = true; public int HealingAmount = 3; public bool HealingAmountEnabled = true; public int HealingCost = 9; public bool HealingCostEnabled = true; public float InvincibilityTimeMultiplier = 1f; public bool InvincibilityTimeMultiplierEnabled = true; public float EnemyHealthMultiplier = 1f; public bool EnemyHealthMultiplierEnabled = true; public float EnemySpeedMultiplier = 1f; public bool EnemySpeedMultiplierEnabled = true; public float EnemyAttackSpeedMultiplier = 1f; public bool EnemyAttackSpeedMultiplierEnabled = true; public float EnemyAggressionMultiplier = 1f; public bool EnemyAggressionMultiplierEnabled = true; public float BossHealthMultiplier = 1f; public bool BossHealthMultiplierEnabled = true; public float BossDamageTakenMultiplier = 1f; public bool BossDamageTakenMultiplierEnabled = true; public float BossSpeedMultiplier = 1f; public bool BossSpeedMultiplierEnabled = true; public float BossAttackSpeedMultiplier = 1f; public bool BossAttackSpeedMultiplierEnabled = true; public bool BossBrutalMode; public bool BossBrutalModeEnabled = true; public bool DisableHealingDuringBoss; public bool DisableHealingDuringBossEnabled = true; public float HealingDuringBossMultiplier = 1f; public bool HealingDuringBossMultiplierEnabled = true; public string MenuLanguage = "auto"; public float CoinMultiplier = 1f; public bool CoinMultiplierEnabled = true; public float ShardMultiplier = 1f; public bool ShardMultiplierEnabled = true; public float ShopPriceMultiplier = 1f; public bool ShopPriceMultiplierEnabled = true; public float StationPriceMultiplier = 1f; public bool StationPriceMultiplierEnabled = true; public int DeathRosaryLossPercentage = 100; public bool DeathRosaryLossPercentageEnabled = true; public float HornetSpeedMultiplier = 1f; public bool HornetSpeedMultiplierEnabled = true; public int DashRechargeLevel = 1; public bool DashRechargeLevelEnabled = true; public bool MutatorNoHealing; public bool MutatorLowGravity; public bool MutatorDoubleDamage; public bool MutatorGlassCannon; public bool MutatorFastEnemies; public bool MutatorTankEnemies; public bool MutatorAggressiveEnemies; public bool MutatorRandomEnemyHealth; public bool MutatorRichWorld; public bool MutatorPoorWorld; public bool MutatorExpensiveShops; public bool MutatorNoDeathLoss; public bool MutatorBossFrenzy; public bool MutatorNoMercy; public bool MutatorExtendedFights; public string[] FavoriteSettings = new string[0]; public static ModSettings CreateDefaults() { ModSettings modSettings = new ModSettings(); modSettings.SettingsSchemaVersion = 17; modSettings.MaximumHealth = 0; modSettings.DefaultMaximumHealth = 0; modSettings.MaximumHealthEnabled = true; modSettings.NeedleDamage = 0; modSettings.DefaultNeedleDamage = 0; modSettings.NeedleDamageEnabled = true; modSettings.NeedleUpgradePercentage = 0; modSettings.NeedleUpgradePercentageEnabled = true; modSettings.SilkSpearDamageMultiplier = 3; modSettings.SilkSpearDamageMultiplierEnabled = true; modSettings.SilkSpearSilkCost = 4; modSettings.SilkSpearSilkCostEnabled = true; modSettings.ThreadStormSilkCost = 4; modSettings.ThreadStormSilkCostEnabled = true; modSettings.ThreadStormNormalHitMultiplier = 0.7f; modSettings.ThreadStormNormalHitMultiplierEnabled = true; modSettings.ThreadStormLateHitMultiplier = 0.25f; modSettings.ThreadStormLateHitMultiplierEnabled = true; modSettings.CrossStitchSilkCost = 4; modSettings.CrossStitchSilkCostEnabled = true; modSettings.CrossStitchHitMultiplier = 0.75f; modSettings.CrossStitchHitMultiplierEnabled = true; modSettings.SharpdartSilkCost = 4; modSettings.SharpdartSilkCostEnabled = true; modSettings.SharpdartMainHitMultiplier = 2.75f; modSettings.SharpdartMainHitMultiplierEnabled = true; modSettings.RuneRageSilkCost = 4; modSettings.RuneRageSilkCostEnabled = true; modSettings.RuneRageBaseDamageMultiplier = 2.1f; modSettings.RuneRageBaseDamageMultiplierEnabled = true; modSettings.PaleNailsSilkCost = 4; modSettings.PaleNailsSilkCostEnabled = true; modSettings.PaleNailsProjectileMultiplier = 1f; modSettings.PaleNailsProjectileMultiplierEnabled = true; modSettings.DamageTakenMultiplier = 1f; modSettings.DamageTakenMultiplierEnabled = true; modSettings.EnvironmentalDamageMultiplier = 1f; modSettings.EnvironmentalDamageMultiplierEnabled = true; modSettings.OneHitMode = false; modSettings.OneHitModeEnabled = true; modSettings.HealingAmount = 3; modSettings.HealingAmountEnabled = true; modSettings.HealingCost = 9; modSettings.HealingCostEnabled = true; modSettings.InvincibilityTimeMultiplier = 1f; modSettings.InvincibilityTimeMultiplierEnabled = true; modSettings.EnemyHealthMultiplier = 1f; modSettings.EnemyHealthMultiplierEnabled = true; modSettings.EnemySpeedMultiplier = 1f; modSettings.EnemySpeedMultiplierEnabled = true; modSettings.EnemyAttackSpeedMultiplier = 1f; modSettings.EnemyAttackSpeedMultiplierEnabled = true; modSettings.EnemyAggressionMultiplier = 1f; modSettings.EnemyAggressionMultiplierEnabled = true; modSettings.BossHealthMultiplier = 1f; modSettings.BossHealthMultiplierEnabled = true; modSettings.BossDamageTakenMultiplier = 1f; modSettings.BossDamageTakenMultiplierEnabled = true; modSettings.BossSpeedMultiplier = 1f; modSettings.BossSpeedMultiplierEnabled = true; modSettings.BossAttackSpeedMultiplier = 1f; modSettings.BossAttackSpeedMultiplierEnabled = true; modSettings.BossBrutalMode = false; modSettings.BossBrutalModeEnabled = true; modSettings.DisableHealingDuringBoss = false; modSettings.DisableHealingDuringBossEnabled = true; modSettings.HealingDuringBossMultiplier = 1f; modSettings.HealingDuringBossMultiplierEnabled = true; modSettings.MenuLanguage = "auto"; modSettings.CoinMultiplier = 1f; modSettings.CoinMultiplierEnabled = true; modSettings.ShardMultiplier = 1f; modSettings.ShardMultiplierEnabled = true; modSettings.ShopPriceMultiplier = 1f; modSettings.ShopPriceMultiplierEnabled = true; modSettings.StationPriceMultiplier = 1f; modSettings.StationPriceMultiplierEnabled = true; modSettings.DeathRosaryLossPercentage = 100; modSettings.DeathRosaryLossPercentageEnabled = true; modSettings.HornetSpeedMultiplier = 1f; modSettings.HornetSpeedMultiplierEnabled = true; modSettings.DashRechargeLevel = 1; modSettings.DashRechargeLevelEnabled = true; modSettings.MutatorNoHealing = false; modSettings.MutatorLowGravity = false; modSettings.MutatorDoubleDamage = false; modSettings.MutatorGlassCannon = false; modSettings.MutatorFastEnemies = false; modSettings.MutatorTankEnemies = false; modSettings.MutatorAggressiveEnemies = false; modSettings.MutatorRandomEnemyHealth = false; modSettings.MutatorRichWorld = false; modSettings.MutatorPoorWorld = false; modSettings.MutatorExpensiveShops = false; modSettings.MutatorNoDeathLoss = false; modSettings.MutatorBossFrenzy = false; modSettings.MutatorNoMercy = false; modSettings.MutatorExtendedFights = false; modSettings.FavoriteSettings = new string[0]; return modSettings; } } internal sealed class MutatorDefinition { public readonly ModSettingKind Setting; public readonly string Title; public readonly string Description; public readonly string Difficulty; public readonly int DifficultyPoints; public string DifficultyDisplay => Difficulty + " (" + ((DifficultyPoints > 0) ? "+" : string.Empty) + DifficultyPoints + ")"; public MutatorDefinition(ModSettingKind setting, string title, string description, string difficulty, int difficultyPoints) { Setting = setting; Title = title; Description = description; Difficulty = difficulty; DifficultyPoints = difficultyPoints; } } internal static class MutatorCatalog { public static readonly MutatorDefinition[] All = new MutatorDefinition[15] { new MutatorDefinition(ModSettingKind.MutatorNoHealing, "SEM CURA", "Remove a habilidade de usar o Bind para curar durante toda a jogatina.", "EXTREMA", 30), new MutatorDefinition(ModSettingKind.MutatorLowGravity, "GRAVIDADE BAIXA", "Mantém a gravidade da Hornet fixa em 0,5x durante toda a jogatina.", "MÉDIA", 8), new MutatorDefinition(ModSettingKind.MutatorDoubleDamage, "DANO DOBRADO", "Dobra somente o dano recebido de inimigos e perigos do cenário; o dano da Hornet permanece normal.", "ALTA", 25), new MutatorDefinition(ModSettingKind.MutatorGlassCannon, "CANHÃO DE VIDRO", "Fixa a vida máxima em 1 e o dano da Agulha em 30. Fragmentos de máscara passam a conceder 1.000 Rosários.", "EXTREMA", 45), new MutatorDefinition(ModSettingKind.MutatorFastEnemies, "INIMIGOS RÁPIDOS", "Multiplica a velocidade de todos os inimigos, inclusive Bosses, por 1,1x.", "MÉDIA", 8), new MutatorDefinition(ModSettingKind.MutatorTankEnemies, "INIMIGOS TANQUE", "Multiplica a vida de todos os inimigos, inclusive Bosses, por 3x.", "ALTA", 18), new MutatorDefinition(ModSettingKind.MutatorAggressiveEnemies, "INIMIGOS AGRESSIVOS", "Multiplica por 2x o dano e por 1,1x a velocidade de todos os inimigos, inclusive Bosses.", "EXTREMA", 28), new MutatorDefinition(ModSettingKind.MutatorRandomEnemyHealth, "VIDA ALEATÓRIA DOS INIMIGOS", "Sorteia para cada inimigo, inclusive Bosses, uma vida entre 0,1x e 5,0x.", "VARIÁVEL", 10), new MutatorDefinition(ModSettingKind.MutatorRichWorld, "MUNDO RICO", "Multiplica por 30x os Rosários obtidos de moedas coletadas.", "FACILITA", -25), new MutatorDefinition(ModSettingKind.MutatorPoorWorld, "MUNDO POBRE", "Concede exatamente metade dos Rosários obtidos de moedas coletadas.", "ALTA", 15), new MutatorDefinition(ModSettingKind.MutatorExpensiveShops, "LOJAS CARAS", "Multiplica por 10x os preços de lojas, bancos e estações.", "ALTA", 20), new MutatorDefinition(ModSettingKind.MutatorNoDeathLoss, "SEM PERDA AO MORRER", "Mantém todos os Rosários após a morte e impede a criação do casulo.", "FACILITA", -20), new MutatorDefinition(ModSettingKind.MutatorBossFrenzy, "FÚRIA DOS BOSSES", "Bosses causam 2x de dano e se movimentam a 1,1x da velocidade normal.", "EXTREMA", 25), new MutatorDefinition(ModSettingKind.MutatorNoMercy, "SEM MISERICÓRDIA", "Ao morrer, perde todos os Rosários, não cria casulo e retorna ao início do jogo.", "EXTREMA", 50), new MutatorDefinition(ModSettingKind.MutatorExtendedFights, "LUTAS PROLONGADAS", "Bosses causam exatamente 1 máscara de dano, mas possuem 10x mais vida.", "EXTREMA", 30) }; public static bool IsMutator(ModSettingKind setting) { if (setting >= ModSettingKind.MutatorNoHealing) { return setting <= ModSettingKind.MutatorExtendedFights; } return false; } public static bool Get(ModSettings settings, ModSettingKind setting) { return setting switch { ModSettingKind.MutatorNoHealing => settings.MutatorNoHealing, ModSettingKind.MutatorLowGravity => settings.MutatorLowGravity, ModSettingKind.MutatorDoubleDamage => settings.MutatorDoubleDamage, ModSettingKind.MutatorGlassCannon => settings.MutatorGlassCannon, ModSettingKind.MutatorFastEnemies => settings.MutatorFastEnemies, ModSettingKind.MutatorTankEnemies => settings.MutatorTankEnemies, ModSettingKind.MutatorAggressiveEnemies => settings.MutatorAggressiveEnemies, ModSettingKind.MutatorRandomEnemyHealth => settings.MutatorRandomEnemyHealth, ModSettingKind.MutatorRichWorld => settings.MutatorRichWorld, ModSettingKind.MutatorPoorWorld => settings.MutatorPoorWorld, ModSettingKind.MutatorExpensiveShops => settings.MutatorExpensiveShops, ModSettingKind.MutatorNoDeathLoss => settings.MutatorNoDeathLoss, ModSettingKind.MutatorBossFrenzy => settings.MutatorBossFrenzy, ModSettingKind.MutatorNoMercy => settings.MutatorNoMercy, ModSettingKind.MutatorExtendedFights => settings.MutatorExtendedFights, _ => false, }; } public static void Set(ModSettings settings, ModSettingKind setting, bool enabled) { switch (setting) { case ModSettingKind.MutatorNoHealing: settings.MutatorNoHealing = enabled; break; case ModSettingKind.MutatorLowGravity: settings.MutatorLowGravity = enabled; break; case ModSettingKind.MutatorDoubleDamage: settings.MutatorDoubleDamage = enabled; break; case ModSettingKind.MutatorGlassCannon: settings.MutatorGlassCannon = enabled; break; case ModSettingKind.MutatorFastEnemies: settings.MutatorFastEnemies = enabled; break; case ModSettingKind.MutatorTankEnemies: settings.MutatorTankEnemies = enabled; break; case ModSettingKind.MutatorAggressiveEnemies: settings.MutatorAggressiveEnemies = enabled; break; case ModSettingKind.MutatorRandomEnemyHealth: settings.MutatorRandomEnemyHealth = enabled; break; case ModSettingKind.MutatorRichWorld: settings.MutatorRichWorld = enabled; break; case ModSettingKind.MutatorPoorWorld: settings.MutatorPoorWorld = enabled; break; case ModSettingKind.MutatorExpensiveShops: settings.MutatorExpensiveShops = enabled; break; case ModSettingKind.MutatorNoDeathLoss: settings.MutatorNoDeathLoss = enabled; break; case ModSettingKind.MutatorBossFrenzy: settings.MutatorBossFrenzy = enabled; break; case ModSettingKind.MutatorNoMercy: settings.MutatorNoMercy = enabled; break; case ModSettingKind.MutatorExtendedFights: settings.MutatorExtendedFights = enabled; break; default: throw new ArgumentOutOfRangeException("setting"); } } public static string GetTitle(ModSettingKind setting) { for (int i = 0; i < All.Length; i++) { if (All[i].Setting == setting) { return All[i].Title; } } return setting.ToString(); } public static int CountEnabled(ModSettings settings) { int num = 0; for (int i = 0; i < All.Length; i++) { if (Get(settings, All[i].Setting)) { num++; } } return num; } public static void ResetAll(ModSettings settings) { for (int i = 0; i < All.Length; i++) { Set(settings, All[i].Setting, enabled: false); } } } internal sealed class MutatorController { private const float LowGravityMultiplier = 0.5f; private const int GlassCannonNeedleDamage = 30; private const int MaskFragmentRosaryReward = 1000; private const string InitialScene = "Tut_01"; private const string InitialMarker = "Death Respawn Marker Init"; private static readonly FieldInfo DefaultGravityField = AccessTools.Field(typeof(HeroController), "DEFAULT_GRAVITY"); private static readonly FieldInfo AirHangGravityField = AccessTools.Field(typeof(HeroController), "AIR_HANG_GRAVITY"); private static readonly FieldInfo BodyField = AccessTools.Field(typeof(HeroController), "rb2d"); private static readonly FieldInfo PreviousGravityField = AccessTools.Field(typeof(HeroController), "prevGravityScale"); [ThreadStatic] private static int _maskFragmentRewardDepth; private readonly SettingsStore _settingsStore; private readonly ManualLogSource _logger; private HeroController _gravityHero; private float _defaultGravity; private float _defaultAirHangGravity; private float _gravityMultiplier = 1f; private bool _gravityCaptured; private bool _noMercyRespawnPending; private int _heartPieceProfileId = -1; private int _preservedHeartPieces = -1; public static MutatorController Instance; public bool BlocksHealing => IsActive(ModSettingKind.MutatorNoHealing); public bool IsGrantingMaskFragmentReward => _maskFragmentRewardDepth > 0; public bool BlocksMaximumHealthIncrease => IsActive(ModSettingKind.MutatorGlassCannon); public MutatorController(SettingsStore settingsStore, ManualLogSource logger) { _settingsStore = settingsStore; _logger = logger; _settingsStore.Changed += OnSettingChanged; Instance = this; } public bool IsActive(ModSettingKind setting) { return _settingsStore.IsMutatorEnabled(setting); } public int GetNeedleDamage(int originalDamage) { if (!IsActive(ModSettingKind.MutatorGlassCannon)) { return originalDamage; } return 30; } public void Update() { UpdateGravity(); TrackHeartPieces(); } public bool TryReplaceMaskFragment(string variableName, int amount) { if (!IsActive(ModSettingKind.MutatorGlassCannon) || amount <= 0 || !string.Equals(variableName, "heartPieces", StringComparison.OrdinalIgnoreCase)) { return false; } long num = Math.Min(2147483647L, 1000L * (long)amount); try { _maskFragmentRewardDepth++; CurrencyManager.AddGeo((int)num); } finally { _maskFragmentRewardDepth = Math.Max(0, _maskFragmentRewardDepth - 1); } _logger.LogInfo((object)("Canhao de vidro: fragmento de mascara convertido em " + num + " Rosarios.")); return true; } public void HandleHeartPiecesUpdated(PlayerData playerData, string variableName) { if (playerData != null && IsActive(ModSettingKind.MutatorGlassCannon) && string.Equals(variableName, "heartPieces", StringComparison.OrdinalIgnoreCase)) { TrackHeartPieces(); if (_preservedHeartPieces < 0 || playerData.heartPieces <= _preservedHeartPieces) { _preservedHeartPieces = playerData.heartPieces; return; } int amount = playerData.heartPieces - _preservedHeartPieces; playerData.heartPieces = _preservedHeartPieces; TryReplaceMaskFragment("heartPieces", amount); } } public void PrepareNoMercyRespawn() { _noMercyRespawnPending = true; } public bool TryGetNoMercyRespawn(out string scene, out string marker) { scene = null; marker = null; if (!_noMercyRespawnPending || !IsActive(ModSettingKind.MutatorNoMercy)) { return false; } scene = "Tut_01"; marker = "Death Respawn Marker Init"; return true; } public void FinishNoMercyRespawn() { _noMercyRespawnPending = false; } public void Shutdown() { _settingsStore.Changed -= OnSettingChanged; RestoreGravity(); _noMercyRespawnPending = false; _maskFragmentRewardDepth = 0; _heartPieceProfileId = -1; _preservedHeartPieces = -1; if (object.ReferenceEquals(Instance, this)) { Instance = null; } } internal static int MultiplyDamage(int damage, float multiplier) { if (damage <= 0) { return damage; } double val = Math.Round((float)damage * multiplier, MidpointRounding.AwayFromZero); return (int)Math.Max(1.0, Math.Min(2147483647.0, val)); } private void UpdateGravity() { HeroController instance = HeroController.instance; if ((Object)(object)instance == (Object)null) { _gravityHero = null; _gravityCaptured = false; return; } if (!object.ReferenceEquals(_gravityHero, instance) || !_gravityCaptured) { CaptureGravity(instance); } float num = (IsActive(ModSettingKind.MutatorLowGravity) ? 0.5f : 1f); if (Math.Abs(_gravityMultiplier - num) >= 0.001f) { ApplyGravityMultiplier(num); } } private void CaptureGravity(HeroController hero) { _gravityHero = hero; _gravityCaptured = true; _gravityMultiplier = 1f; _defaultGravity = GetFloat(DefaultGravityField, hero, 1f); _defaultAirHangGravity = GetFloat(AirHangGravityField, hero, _defaultGravity); } private void ApplyGravityMultiplier(float multiplier) { if (_gravityCaptured && !((Object)(object)_gravityHero == (Object)null)) { float num = Math.Max(0.01f, _gravityMultiplier); multiplier = Mathf.Clamp(multiplier, 0.5f, 1f); SetFloat(DefaultGravityField, _gravityHero, _defaultGravity * multiplier); SetFloat(AirHangGravityField, _gravityHero, _defaultAirHangGravity * multiplier); Rigidbody2D val = (Rigidbody2D)((BodyField != null) ? /*isinst with value type is only supported in some contexts*/: null); if ((Object)(object)val != (Object)null && Math.Abs(val.gravityScale) > 0.001f) { val.gravityScale = val.gravityScale * multiplier / num; } float num2 = GetFloat(PreviousGravityField, _gravityHero, 0f); if (Math.Abs(num2) > 0.001f) { SetFloat(PreviousGravityField, _gravityHero, num2 * multiplier / num); } _gravityMultiplier = multiplier; _logger.LogInfo((object)("Mutador de gravidade: " + multiplier.ToString("0.0") + "x.")); } } private void RestoreGravity() { if (_gravityCaptured && (Object)(object)_gravityHero != (Object)null) { ApplyGravityMultiplier(1f); } _gravityHero = null; _gravityCaptured = false; _gravityMultiplier = 1f; } private void OnSettingChanged(ModSettingKind setting) { if (setting == ModSettingKind.MutatorLowGravity) { UpdateGravity(); } if (setting == ModSettingKind.MutatorNoMercy && !IsActive(setting)) { _noMercyRespawnPending = false; } if (setting == ModSettingKind.MutatorGlassCannon) { _heartPieceProfileId = -1; _preservedHeartPieces = -1; TrackHeartPieces(); } } private void TrackHeartPieces() { if (!PlayerData.HasInstance || PlayerData.instance == null || !IsActive(ModSettingKind.MutatorGlassCannon)) { _heartPieceProfileId = -1; _preservedHeartPieces = -1; return; } PlayerData instance = PlayerData.instance; if (_heartPieceProfileId != instance.profileID || _preservedHeartPieces < 0) { _heartPieceProfileId = instance.profileID; _preservedHeartPieces = instance.heartPieces; } } private static float GetFloat(FieldInfo field, object instance, float fallback) { try { return (field != null) ? Convert.ToSingle(field.GetValue(instance)) : fallback; } catch { return fallback; } } private static void SetFloat(FieldInfo field, object instance, float value) { try { if (field != null) { field.SetValue(instance, value); } } catch { } } } [HarmonyPatch(typeof(HeroController), "CanBind")] internal static class MutatorNoHealingPatch { private static void Postfix(ref bool __result) { if (__result && MutatorController.Instance != null && MutatorController.Instance.BlocksHealing) { __result = false; } } } [HarmonyPatch(typeof(PlayerData), "IntAdd", new Type[] { typeof(string), typeof(int) })] internal static class GlassCannonIntAddPatch { private static bool Prefix(string __0, int __1) { if (MutatorController.Instance != null) { return !MutatorController.Instance.TryReplaceMaskFragment(__0, __1); } return true; } } [HarmonyPatch(typeof(PlayerData), "IncrementInt", new Type[] { typeof(string) })] internal static class GlassCannonIncrementIntPatch { private static bool Prefix(string __0) { if (MutatorController.Instance != null) { return !MutatorController.Instance.TryReplaceMaskFragment(__0, 1); } return true; } } [HarmonyPatch(typeof(PlayerData), "SetInt", new Type[] { typeof(string), typeof(int) })] internal static class GlassCannonSetIntPatch { private static bool Prefix(PlayerData __instance, string __0, int __1) { if (__instance == null || !string.Equals(__0, "heartPieces", StringComparison.OrdinalIgnoreCase) || __1 <= __instance.heartPieces) { return true; } if (MutatorController.Instance != null) { return !MutatorController.Instance.TryReplaceMaskFragment(__0, __1 - __instance.heartPieces); } return true; } } [HarmonyPatch(typeof(PlayerData), "OnUpdatedVariable", new Type[] { typeof(string) })] internal static class GlassCannonVariableUpdatedPatch { private static void Postfix(PlayerData __instance, string __0) { if (MutatorController.Instance != null) { MutatorController.Instance.HandleHeartPiecesUpdated(__instance, __0); } } } [HarmonyPatch(typeof(PlayerData), "AddToMaxHealth", new Type[] { typeof(int) })] internal static class GlassCannonMaximumHealthPatch { private static bool Prefix() { if (MutatorController.Instance != null) { return !MutatorController.Instance.BlocksMaximumHealthIncrease; } return true; } } [HarmonyPatch(typeof(GameManager), "GetRespawnInfo")] internal static class NoMercyRespawnPatch { private static bool Prefix(ref string __0, ref string __1) { if (MutatorController.Instance == null) { return true; } if (!MutatorController.Instance.TryGetNoMercyRespawn(out var scene, out var marker)) { return true; } __0 = scene; __1 = marker; return false; } } [HarmonyPatch(typeof(HeroController), "FinishedEnteringScene")] internal static class NoMercyRespawnFinishedPatch { private static void Postfix() { if (MutatorController.Instance != null) { MutatorController.Instance.FinishNoMercyRespawn(); } } } internal sealed class NeedleDamageController { private readonly SettingsStore _settingsStore; public static NeedleDamageController Instance; public NeedleDamageController(SettingsStore settingsStore) { _settingsStore = settingsStore; Instance = this; } public int GetConfiguredDamage(int originalDamage, int nailUpgrades) { if (MutatorController.Instance != null && MutatorController.Instance.IsActive(ModSettingKind.MutatorGlassCannon)) { return MutatorController.Instance.GetNeedleDamage(originalDamage); } if (!_settingsStore.IsEnabled(ModSettingKind.NeedleDamage)) { return originalDamage; } if (originalDamage > 0 && (_settingsStore.Current.NeedleDamage <= 0 || _settingsStore.Current.DefaultNeedleDamage <= 0)) { _settingsStore.EnsureNeedleDamageInitialized(originalDamage); } int needleDamage = _settingsStore.Current.NeedleDamage; if (needleDamage <= 0) { return originalDamage; } int num = ValueValidator.ClampNeedleDamage(needleDamage); int num2 = (_settingsStore.IsEnabled(ModSettingKind.NeedleUpgradePercentage) ? ValueValidator.ClampNeedleUpgradePercentage(_settingsStore.Current.NeedleUpgradePercentage) : 0); int num3 = Math.Max(0, Math.Min(4, nailUpgrades)); for (int i = 0; i < num3; i++) { num = (int)Math.Ceiling((double)num * (1.0 + (double)num2 / 100.0)); } return num; } public void Shutdown() { if (Instance == this) { Instance = null; } } } [HarmonyPatch(typeof(PlayerData), "get_nailDamage")] internal static class NeedleDamagePatch { private static void Postfix(PlayerData __instance, ref int __result) { if (NeedleDamageController.Instance != null) { int nailUpgrades = __instance?.nailUpgrades ?? 0; __result = NeedleDamageController.Instance.GetConfiguredDamage(__result, nailUpgrades); } } } internal sealed class PlayerMovementController { private readonly SettingsStore _settingsStore; private readonly ManualLogSource _logger; private HeroController _dashOwner; private float _dashReadyAt; public static PlayerMovementController Instance; public PlayerMovementController(SettingsStore settingsStore, ManualLogSource logger) { _settingsStore = settingsStore; _logger = logger; _settingsStore.Changed += OnSettingChanged; Instance = this; } public float ScaleMovementSpeed(float originalSpeed) { if (!_settingsStore.IsEnabled(ModSettingKind.HornetSpeedMultiplier)) { return originalSpeed; } float num = ValueValidator.NormalizeHornetSpeedMultiplier(_settingsStore.Current.HornetSpeedMultiplier); return originalSpeed * num; } public void BeginDashRecharge(HeroController hero) { _dashOwner = hero; _dashReadyAt = 0f; if (!((Object)(object)hero == (Object)null) && _settingsStore.IsEnabled(ModSettingKind.DashRechargeLevel)) { int num = ValueValidator.ClampDashRechargeLevel(_settingsStore.Current.DashRechargeLevel); if (num > 1) { float dashRechargeSeconds = ValueValidator.GetDashRechargeSeconds(num); _dashReadyAt = Time.time + dashRechargeSeconds; _logger.LogInfo((object)("Recarga do dash iniciada: nivel " + num + ", " + dashRechargeSeconds.ToString("0.0##") + " segundos.")); } } } public bool IsCustomDashReady(HeroController hero) { if (!_settingsStore.IsEnabled(ModSettingKind.DashRechargeLevel) || ValueValidator.ClampDashRechargeLevel(_settingsStore.Current.DashRechargeLevel) <= 1 || !object.ReferenceEquals(_dashOwner, hero)) { return true; } return Time.time >= _dashReadyAt; } public void Shutdown() { _settingsStore.Changed -= OnSettingChanged; _dashOwner = null; _dashReadyAt = 0f; if (object.ReferenceEquals(Instance, this)) { Instance = null; } } private void OnSettingChanged(ModSettingKind setting) { if (setting == ModSettingKind.DashRechargeLevel) { _dashOwner = null; _dashReadyAt = 0f; } } } [HarmonyPatch(typeof(HeroController), "GetRunSpeed")] internal static class HornetRunSpeedPatch { private static void Postfix(ref float __result) { if (PlayerMovementController.Instance != null) { __result = PlayerMovementController.Instance.ScaleMovementSpeed(__result); } } } [HarmonyPatch(typeof(HeroController), "GetWalkSpeed")] internal static class HornetWalkSpeedPatch { private static void Postfix(ref float __result) { if (PlayerMovementController.Instance != null) { __result = PlayerMovementController.Instance.ScaleMovementSpeed(__result); } } } [HarmonyPatch(typeof(HeroController), "SetDashCooldownTimer")] internal static class DashRechargeStartPatch { private static void Postfix(HeroController __instance) { if (PlayerMovementController.Instance != null) { PlayerMovementController.Instance.BeginDashRecharge(__instance); } } } [HarmonyPatch(typeof(HeroController), "CanDash")] internal static class CanDashRechargePatch { private static void Postfix(HeroController __instance, ref bool __result) { if (__result && PlayerMovementController.Instance != null && !PlayerMovementController.Instance.IsCustomDashReady(__instance)) { __result = false; } } } [HarmonyPatch(typeof(HeroController), "DashCooldownReady")] internal static class DashCooldownReadyPatch { private static void Postfix(HeroController __instance, ref bool __result) { if (__result && PlayerMovementController.Instance != null && !PlayerMovementController.Instance.IsCustomDashReady(__instance)) { __result = false; } } } internal sealed class PlayerRecoveryController { private readonly SettingsStore _settingsStore; private readonly ManualLogSource _logger; private int _heroControllerId = -1; private float _defaultInvulTime; private float _defaultInvulTimeParry; private float _defaultInvulTimeQuake; private float _defaultInvulTimeCrossStitch; private float _defaultInvulTimeSilkDash; private bool _bindHealingPending; private bool _bindHealingApplied; private int _remainingNativeBindHealing; private float _bindHealingExpiresAt; public static PlayerRecoveryController Instance; public PlayerRecoveryController(SettingsStore settingsStore, ManualLogSource logger) { _settingsStore = settingsStore; _logger = logger; _settingsStore.Changed += OnSettingChanged; Instance = this; } public void BeginBindHealing() { _bindHealingPending = true; _bindHealingApplied = false; _remainingNativeBindHealing = 3; _bindHealingExpiresAt = Time.realtimeSinceStartup + 2f; _logger.LogInfo((object)("Bind reconhecido; aguardando a cura para aplicar " + ValueValidator.ClampHealingAmount(_settingsStore.Current.HealingAmount) + " mascaras.")); } public bool ApplyBindHealing(ref int amount) { bool flag = _bindHealingPending || IsBindHealingCall(); if (!_bindHealingPending && flag) { BeginBindHealing(); } if (!_bindHealingPending || Time.realtimeSinceStartup > _bindHealingExpiresAt) { ClearPendingBindHealing(); return true; } if (amount <= 0) { return true; } _remainingNativeBindHealing = Math.Max(0, _remainingNativeBindHealing - amount); if (MutatorController.Instance != null && MutatorController.Instance.BlocksHealing) { FinishNativeBindHealingIfComplete(); return false; } bool flag2 = EnemyStatsController.IsBossEncounterActive(); if (flag2 && _settingsStore.IsEnabled(ModSettingKind.DisableHealingDuringBoss) && _settingsStore.Current.DisableHealingDuringBoss) { FinishNativeBindHealingIfComplete(); return false; } bool flag3 = _settingsStore.IsEnabled(ModSettingKind.HealingAmount); bool flag4 = flag2 && _settingsStore.IsEnabled(ModSettingKind.HealingDuringBossMultiplier); bool flag5 = flag2 && _settingsStore.IsEnabled(ModSettingKind.BossBrutalMode) && _settingsStore.Current.BossBrutalMode; if (!flag3 && !flag4 && !flag5) { if (_remainingNativeBindHealing == 0) { ClearPendingBindHealing(); } return true; } if (!_bindHealingApplied) { int num = amount; int baseHealing = (flag3 ? ValueValidator.ClampHealingAmount(_settingsStore.Current.HealingAmount) : 3); amount = CalculateBossHealing(baseHealing, (flag2 && _settingsStore.IsEnabled(ModSettingKind.HealingDuringBossMultiplier)) ? _settingsStore.Current.HealingDuringBossMultiplier : 1f, flag4, flag5); _bindHealingApplied = true; _logger.LogInfo((object)("Quantidade de cura aplicada ao Bind: " + num + " -> " + amount)); if (_remainingNativeBindHealing == 0) { ClearPendingBindHealing(); } return amount > 0; } _logger.LogInfo((object)("Parcela nativa adicional da cura bloqueada: " + amount)); if (_remainingNativeBindHealing == 0) { ClearPendingBindHealing(); } return false; } internal static int CalculateBossHealing(int baseHealing, float multiplier, bool applyMultiplier, bool brutalMode) { int num = Math.Max(0, baseHealing); if (applyMultiplier && num > 0) { num = Math.Max(1, (int)Math.Round((float)num * ValueValidator.NormalizeMultiplier(multiplier), MidpointRounding.AwayFromZero)); } if (brutalMode) { num = Math.Max(0, num - 1); } return num; } public int GetHealingCost(int originalCost) { if (!_settingsStore.IsEnabled(ModSettingKind.HealingCost)) { return originalCost; } return ValueValidator.ClampHealingCost(_settingsStore.Current.HealingCost); } public float GetBindRequirement(float originalCost) { if (!_settingsStore.IsEnabled(ModSettingKind.HealingCost) || originalCost <= 0f || float.IsNaN(originalCost) || float.IsInfinity(originalCost) || originalCost >= 1.7014117E+38f) { return originalCost; } return ValueValidator.ClampHealingCost(_settingsStore.Current.HealingCost); } public void ApplyBindCostVariables(Fsm fsm) { if (fsm != null && fsm.Variables != null) { FsmInt val = fsm.Variables.FindFsmInt("Silk Cost"); NamedVariable val2 = fsm.Variables.FindVariable("Current Silk Cost"); if (val != null && val2 != null) { val.Value = (_settingsStore.IsEnabled(ModSettingKind.HealingCost) ? ValueValidator.ClampHealingCost(_settingsStore.Current.HealingCost) : 9); } } } public void RefreshBindCost() { List fsmList = PlayMakerFSM.FsmList; if (fsmList != null) { for (int i = 0; i < fsmList.Count; i++) { PlayMakerFSM val = fsmList[i]; if ((Object)(object)val != (Object)null) { ApplyBindCostVariables(val.Fsm); } } } if ((Object)(object)SilkSpool.Instance != (Object)null) { SilkSpool.Instance.RefreshSilk(); } } public void ApplyInvincibilityTime(HeroController hero) { if (!((Object)(object)hero == (Object)null)) { int instanceID = ((Object)hero).GetInstanceID(); if (_heroControllerId != instanceID) { _heroControllerId = instanceID; _defaultInvulTime = hero.INVUL_TIME; _defaultInvulTimeParry = hero.INVUL_TIME_PARRY; _defaultInvulTimeQuake = hero.INVUL_TIME_QUAKE; _defaultInvulTimeCrossStitch = hero.INVUL_TIME_CROSS_STITCH; _defaultInvulTimeSilkDash = hero.INVUL_TIME_SILKDASH; } float num = (_settingsStore.IsEnabled(ModSettingKind.InvincibilityTimeMultiplier) ? ValueValidator.NormalizeMultiplier(_settingsStore.Current.InvincibilityTimeMultiplier) : 1f); hero.INVUL_TIME = _defaultInvulTime * num; hero.INVUL_TIME_PARRY = _defaultInvulTimeParry * num; hero.INVUL_TIME_QUAKE = _defaultInvulTimeQuake * num; hero.INVUL_TIME_CROSS_STITCH = _defaultInvulTimeCrossStitch * num; hero.INVUL_TIME_SILKDASH = _defaultInvulTimeSilkDash * num; } } public void Shutdown() { _settingsStore.Changed -= OnSettingChanged; ClearPendingBindHealing(); if ((Object)(object)HeroController.instance != (Object)null) { RestoreInvincibilityDefaults(HeroController.instance); } if (Instance == this) { Instance = null; } } private void OnSettingChanged(ModSettingKind setting) { if (setting == ModSettingKind.InvincibilityTimeMultiplier && (Object)(object)HeroController.instance != (Object)null) { ApplyInvincibilityTime(HeroController.instance); } if (setting == ModSettingKind.HealingCost) { RefreshBindCost(); } } private void RestoreInvincibilityDefaults(HeroController hero) { if (!((Object)(object)hero == (Object)null) && ((Object)hero).GetInstanceID() == _heroControllerId) { hero.INVUL_TIME = _defaultInvulTime; hero.INVUL_TIME_PARRY = _defaultInvulTimeParry; hero.INVUL_TIME_QUAKE = _defaultInvulTimeQuake; hero.INVUL_TIME_CROSS_STITCH = _defaultInvulTimeCrossStitch; hero.INVUL_TIME_SILKDASH = _defaultInvulTimeSilkDash; } } private void ClearPendingBindHealing() { _bindHealingPending = false; _bindHealingApplied = false; _remainingNativeBindHealing = 0; _bindHealingExpiresAt = 0f; } private void FinishNativeBindHealingIfComplete() { if (_remainingNativeBindHealing == 0) { ClearPendingBindHealing(); } } private static bool IsBindHealingCall() { StackFrame[] frames = new StackTrace().GetFrames(); if (frames == null) { return false; } for (int i = 0; i < frames.Length; i++) { MethodBase method = frames[i].GetMethod(); Type type = ((method != null) ? method.DeclaringType : null); string text = ((type != null) ? type.FullName : string.Empty); if (!string.IsNullOrEmpty(text) && text.IndexOf("HeroRegenGainHealth", StringComparison.Ordinal) >= 0) { return true; } } return false; } } [HarmonyPatch(typeof(HeroController), "AddHealth", new Type[] { typeof(int) })] internal static class HealingAmountPatch { private static bool Prefix(ref int __0) { if (PlayerRecoveryController.Instance != null) { return PlayerRecoveryController.Instance.ApplyBindHealing(ref __0); } return true; } } [HarmonyPatch(typeof(SilkSpool), "get_BindCost")] internal static class BindRequirementPatch { private static void Postfix(ref float __result) { if (PlayerRecoveryController.Instance != null) { __result = PlayerRecoveryController.Instance.GetBindRequirement(__result); } } } [HarmonyPatch(typeof(HeroController), "TakeSilk", new Type[] { typeof(int), typeof(SilkTakeSource) })] internal static class HealingSilkCostPatch { private static void Prefix(HeroController __instance, ref int __0, SilkTakeSource __1) { //IL_0025: Unknown result type (might be due to invalid IL or missing references) if (PlayerRecoveryController.Instance != null && !((Object)(object)__instance == (Object)null) && __instance.cState != null && __instance.cState.isBinding && (int)__1 == 0) { PlayerRecoveryController.Instance.BeginBindHealing(); __0 = PlayerRecoveryController.Instance.GetHealingCost(__0); } } } [HarmonyPatch(typeof(Fsm), "Start")] internal static class BindCostFsmStartPatch { private static void Prefix(Fsm __instance) { if (PlayerRecoveryController.Instance != null) { PlayerRecoveryController.Instance.ApplyBindCostVariables(__instance); } } } [HarmonyPatch(typeof(HeroController), "Start")] internal static class HeroInvincibilityStartPatch { private static void Postfix(HeroController __instance) { if (PlayerRecoveryController.Instance != null) { PlayerRecoveryController.Instance.ApplyInvincibilityTime(__instance); PlayerRecoveryController.Instance.RefreshBindCost(); } } } [HarmonyPatch(typeof(HeroController), "FinishedEnteringScene")] internal static class HeroInvincibilityScenePatch { private static void Postfix(HeroController __instance) { if (PlayerRecoveryController.Instance != null) { PlayerRecoveryController.Instance.ApplyInvincibilityTime(__instance); } } } internal sealed class PresetManager { [Serializable] private sealed class PresetUiState { public string[] LoadedPresetFiles = new string[0]; public string ActivePresetId = string.Empty; public string RestoreSnapshot = string.Empty; } [Serializable] private sealed class LegacyPresetEnvelope { public LegacyPresetSettings Settings; public string[] FavoriteOptionIds = new string[0]; } [Serializable] private sealed class LegacyPresetSettings { public int BaseDamage; public int BaseHealth; public float DamageTakenMultiplier = 1f; public float HealingMultiplier = 1f; public float HealingCostMultiplier = 1f; public float InvincibilityTimeMultiplier = 1f; public float SilkSpearDamageMultiplier = 1f; public float EnvironmentalDamageMultiplier = 1f; public float EnemyHealthMultiplier = 1f; public float EnemySpeedMultiplier = 1f; public float EnemyAttackCooldownMultiplier = 1f; public float EnemyAggressionMultiplier = 1f; public float BossHealthMultiplier = 1f; public float BossDamageTakenMultiplier = 1f; public float BossSpeedMultiplier = 1f; public float BossAttackCooldownMultiplier = 1f; public bool BossBrutalMode; public bool DisableHealingDuringBoss; public float HealingDuringBossMultiplier = 1f; public float CurrencyDropMultiplier = 1f; public float ItemDropMultiplier = 1f; public float ShopPriceMultiplier = 1f; public float DeathCurrencyLossMultiplier = 1f; public float PlayerSpeedMultiplier = 1f; public bool OneHitMode; public bool MutatorNoHealing; public bool MutatorLowGravity; public bool MutatorDoubleDamage; public bool MutatorGlassCannon; public bool MutatorFastEnemies; public bool MutatorTankEnemies; public bool MutatorAggressiveEnemies; public bool MutatorRandomizedEnemyHealth; public bool MutatorRichWorld; public bool MutatorPoorWorld; public bool MutatorExpensiveShops; public bool MutatorNoDeathLoss; public bool MutatorBossFrenzy; public bool MutatorNoMercy; public bool MutatorExtendedFights; } private readonly SettingsStore _settingsStore; private readonly ManualLogSource _logger; private readonly string _presetDirectory; private readonly string _statePath; private readonly string _legacyPresetDirectory; private readonly string _importDirectory; private readonly string _exportDirectory; private readonly List _presetFiles = new List(); private readonly List _loadedPresetFiles = new List(); private PresetUiState _state = new PresetUiState(); private int _selectedIndex; public string PresetDirectory => _presetDirectory; public string ImportDirectory => _importDirectory; public string ExportDirectory => _exportDirectory; public int Count => _presetFiles.Count; public int LoadedCount => _loadedPresetFiles.Count; public string ActivePresetName { get { string text = _state.ActivePresetId ?? string.Empty; if (text.StartsWith("builtin:", StringComparison.OrdinalIgnoreCase)) { return GetBuiltInDisplayName(text.Substring("builtin:".Length)); } if (text.StartsWith("file:", StringComparison.OrdinalIgnoreCase)) { return Path.GetFileNameWithoutExtension(text.Substring("file:".Length)); } return "Nenhum"; } } public string SelectedName { get { if (_presetFiles.Count == 0) { return "Nenhum preset salvo"; } _selectedIndex = Math.Max(0, Math.Min(_selectedIndex, _presetFiles.Count - 1)); return Path.GetFileNameWithoutExtension(_presetFiles[_selectedIndex]); } } public PresetManager(SettingsStore settingsStore, ManualLogSource logger, string pluginDirectory, string configDirectory) { _settingsStore = settingsStore; _logger = logger; _presetDirectory = Path.Combine(pluginDirectory, "Presets"); _statePath = Path.Combine(configDirectory, "preset-state.json"); _legacyPresetDirectory = Path.Combine(configDirectory, "presets"); _importDirectory = Path.Combine(configDirectory, "imports"); _exportDirectory = Path.Combine(configDirectory, "exports"); EnsureDirectories(); MigrateLegacyPresetFiles(); LoadState(); Refresh(); } public void Refresh() { EnsureDirectories(); string selectedName = SelectedName; _presetFiles.Clear(); _presetFiles.AddRange(Directory.GetFiles(_presetDirectory, "*.json", SearchOption.TopDirectoryOnly)); _presetFiles.Sort((string left, string right) => string.Compare(Path.GetFileName(left), Path.GetFileName(right), StringComparison.OrdinalIgnoreCase)); _selectedIndex = 0; for (int num = 0; num < _presetFiles.Count; num++) { if (string.Equals(Path.GetFileNameWithoutExtension(_presetFiles[num]), selectedName, StringComparison.OrdinalIgnoreCase)) { _selectedIndex = num; break; } } NormalizeLoadedPresetFiles(); } public string GetLoadedName(int index) { if (index < 0 || index >= _loadedPresetFiles.Count) { return "Preset indisponível"; } return Path.GetFileNameWithoutExtension(_loadedPresetFiles[index]); } public bool LoadSelectedFileToList() { string selectedPath = GetSelectedPath(); if (selectedPath == null || !TryReadPreset(selectedPath, out var _)) { return false; } string fileName = Path.GetFileName(selectedPath); if (!ContainsIgnoreCase(_loadedPresetFiles, fileName)) { _loadedPresetFiles.Add(fileName); SortLoadedPresetFiles(); SaveState(); } Log("Preset adicionado à aba: " + Path.GetFileNameWithoutExtension(fileName)); return true; } public bool ToggleLoaded(int index) { if (index < 0 || index >= _loadedPresetFiles.Count) { return false; } string text = _loadedPresetFiles[index]; string path = Path.Combine(_presetDirectory, text); string id = "file:" + text; if (IsActive(id)) { return DeactivateCurrent(); } if (!TryReadPreset(path, out var convertedJson)) { return false; } return Activate(id, () => _settingsStore.ImportJson(convertedJson)); } public bool ToggleBuiltIn(string key) { string normalized = NormalizeBuiltInKey(key); if (string.IsNullOrEmpty(normalized)) { return false; } string id = "builtin:" + normalized; if (IsActive(id)) { return DeactivateCurrent(); } return Activate(id, () => ApplyBuiltIn(normalized)); } public bool IsLoadedActive(int index) { if (index >= 0 && index < _loadedPresetFiles.Count) { return IsActive("file:" + _loadedPresetFiles[index]); } return false; } public bool IsBuiltInActive(string key) { string text = NormalizeBuiltInKey(key); if (!string.IsNullOrEmpty(text)) { return IsActive("builtin:" + text); } return false; } public bool RemoveLoadedFromTab(int index) { if (index < 0 || index >= _loadedPresetFiles.Count) { return false; } string text = _loadedPresetFiles[index]; if (IsActive("file:" + text) && !DeactivateCurrent()) { return false; } _loadedPresetFiles.RemoveAt(index); SaveState(); Log("Preset removido da aba: " + Path.GetFileNameWithoutExtension(text)); return true; } public void Cycle(int direction) { if (_presetFiles.Count == 0) { _selectedIndex = 0; return; } _selectedIndex = (_selectedIndex + direction) % _presetFiles.Count; if (_selectedIndex < 0) { _selectedIndex += _presetFiles.Count; } } public string Create(string requestedName) { string uniquePresetPath = GetUniquePresetPath(requestedName); File.WriteAllText(uniquePresetPath, _settingsStore.ExportJson()); RefreshAndSelect(uniquePresetPath); AddLoadedPresetFile(Path.GetFileName(uniquePresetPath)); Log("Preset criado: " + SelectedName); return SelectedName; } public bool SaveSelected() { string selectedPath = GetSelectedPath(); if (selectedPath == null) { Create("Meu Preset"); return true; } File.WriteAllText(selectedPath, _settingsStore.ExportJson()); Log("Preset salvo: " + SelectedName); return true; } public bool LoadSelected() { string selectedPath = GetSelectedPath(); if (selectedPath == null || !File.Exists(selectedPath)) { return false; } if (!TryConvertPresetJson(File.ReadAllText(selectedPath), out var convertedJson)) { return false; } bool flag = _settingsStore.ImportJson(convertedJson); if (flag) { Log("Preset carregado: " + SelectedName); } return flag; } public string DuplicateSelected() { string selectedPath = GetSelectedPath(); if (selectedPath == null || !File.Exists(selectedPath)) { return Create("Meu Preset"); } string uniquePresetPath = GetUniquePresetPath(SelectedName + " - Copia"); File.Copy(selectedPath, uniquePresetPath); RefreshAndSelect(uniquePresetPath); Log("Preset duplicado: " + SelectedName); return SelectedName; } public string RenameSelected(string requestedName) { string selectedPath = GetSelectedPath(); if (selectedPath == null || !File.Exists(selectedPath)) { return Create(requestedName); } string uniquePresetPath = GetUniquePresetPath(requestedName); File.Move(selectedPath, uniquePresetPath); RefreshAndSelect(uniquePresetPath); Log("Preset renomeado: " + SelectedName); return SelectedName; } public bool DeleteSelected() { string selectedPath = GetSelectedPath(); if (selectedPath == null || !File.Exists(selectedPath)) { return false; } string selectedName = SelectedName; File.Delete(selectedPath); Refresh(); Log("Preset apagado: " + selectedName); return true; } public bool ResetSelected() { string text = GetSelectedPath(); if (text == null) { text = GetUniquePresetPath("Normal"); } File.WriteAllText(text, JsonUtility.ToJson((object)CreateNormalSettings(), true)); RefreshAndSelect(text); Log("Arquivo do preset restaurado: " + SelectedName); return true; } public string ExportCurrent() { EnsureDirectories(); string text = Path.Combine(_exportDirectory, "CustomDifficulty-" + DateTime.Now.ToString("yyyyMMdd-HHmmss") + ".json"); File.WriteAllText(text, _settingsStore.ExportJson()); Log("Configuracao exportada: " + text); return text; } public bool ImportLatest() { EnsureDirectories(); List list = new List(); list.AddRange(Directory.GetFiles(_importDirectory, "*.json", SearchOption.TopDirectoryOnly)); list.AddRange(Directory.GetFiles(_exportDirectory, "*.json", SearchOption.TopDirectoryOnly)); if (list.Count == 0) { return false; } list.Sort((string left, string right) => File.GetLastWriteTimeUtc(right).CompareTo(File.GetLastWriteTimeUtc(left))); string path = list[0]; string json = File.ReadAllText(path); if (!TryConvertPresetJson(json, out var convertedJson) || !_settingsStore.ImportJson(convertedJson)) { return false; } string uniquePresetPath = GetUniquePresetPath("Importado " + DateTime.Now.ToString("yyyy-MM-dd HH-mm")); File.WriteAllText(uniquePresetPath, convertedJson); RefreshAndSelect(uniquePresetPath); Log("Preset mais recente importado: " + SelectedName); return true; } public bool ApplyBuiltIn(string name) { ModSettings modSettings = CreateNormalSettings(); string text = NormalizeBuiltInKey(name); switch (text) { case "very_easy": modSettings.MaximumHealth = 12; modSettings.HealingAmount = 5; modSettings.HealingCost = 4; modSettings.NeedleDamage = Math.Max(modSettings.DefaultNeedleDamage, 9); modSettings.CoinMultiplier = 2f; modSettings.ShardMultiplier = 2f; modSettings.ShopPriceMultiplier = 0.5f; modSettings.StationPriceMultiplier = 0.5f; modSettings.EnemyHealthMultiplier = 0.5f; modSettings.EnemySpeedMultiplier = 0.8f; modSettings.EnemyAttackSpeedMultiplier = 0.7f; modSettings.EnemyAggressionMultiplier = 0.7f; modSettings.BossHealthMultiplier = 0.6f; modSettings.BossSpeedMultiplier = 0.8f; modSettings.BossAttackSpeedMultiplier = 0.7f; modSettings.DeathRosaryLossPercentage = 0; break; case "easy": modSettings.MaximumHealth = 8; modSettings.HealingAmount = 4; modSettings.HealingCost = 6; modSettings.NeedleDamage = Math.Max(modSettings.DefaultNeedleDamage, 7); modSettings.CoinMultiplier = 1.5f; modSettings.ShardMultiplier = 1.5f; modSettings.ShopPriceMultiplier = 0.8f; modSettings.StationPriceMultiplier = 0.8f; modSettings.EnemyHealthMultiplier = 0.8f; modSettings.EnemySpeedMultiplier = 0.9f; modSettings.BossHealthMultiplier = 0.8f; modSettings.DeathRosaryLossPercentage = 50; break; case "hard": modSettings.MaximumHealth = 4; modSettings.HealingAmount = 2; modSettings.EnemyHealthMultiplier = 1.35f; modSettings.EnemySpeedMultiplier = 1.1f; modSettings.EnemyAttackSpeedMultiplier = 1.2f; modSettings.EnemyAggressionMultiplier = 1.2f; modSettings.BossHealthMultiplier = 1.5f; modSettings.BossDamageTakenMultiplier = 1.2f; modSettings.BossSpeedMultiplier = 1.1f; modSettings.BossAttackSpeedMultiplier = 1.2f; modSettings.HealingDuringBossMultiplier = 0.75f; break; case "very_hard": modSettings.MaximumHealth = 3; modSettings.DamageTakenMultiplier = 1.5f; modSettings.EnvironmentalDamageMultiplier = 1.5f; modSettings.HealingAmount = 1; modSettings.HealingCost = 12; modSettings.CoinMultiplier = 0.75f; modSettings.ShardMultiplier = 0.75f; modSettings.ShopPriceMultiplier = 1.5f; modSettings.StationPriceMultiplier = 1.5f; modSettings.EnemyHealthMultiplier = 1.75f; modSettings.EnemySpeedMultiplier = 1.1f; modSettings.EnemyAttackSpeedMultiplier = 1.5f; modSettings.EnemyAggressionMultiplier = 1.5f; modSettings.BossHealthMultiplier = 2.5f; modSettings.BossDamageTakenMultiplier = 1.5f; modSettings.BossSpeedMultiplier = 1.1f; modSettings.BossAttackSpeedMultiplier = 1.6f; modSettings.HealingDuringBossMultiplier = 0.5f; break; case "nightmare": modSettings.MaximumHealth = 3; modSettings.NeedleDamage = 4; modSettings.DamageTakenMultiplier = 2f; modSettings.HealingAmount = 1; modSettings.HealingCost = 12; modSettings.InvincibilityTimeMultiplier = 0.8f; modSettings.CoinMultiplier = 0.6f; modSettings.ShardMultiplier = 0.6f; modSettings.ShopPriceMultiplier = 1.5f; modSettings.StationPriceMultiplier = 1.5f; modSettings.EnemyHealthMultiplier = 1.6f; modSettings.EnemySpeedMultiplier = 1.2f; modSettings.EnemyAttackSpeedMultiplier = 1.5f; modSettings.EnemyAggressionMultiplier = 1.5f; modSettings.BossHealthMultiplier = 2f; modSettings.BossDamageTakenMultiplier = 1.5f; modSettings.BossSpeedMultiplier = 1.2f; modSettings.BossAttackSpeedMultiplier = 1.5f; modSettings.BossBrutalMode = true; modSettings.HealingDuringBossMultiplier = 0.35f; break; case "farm": modSettings.MaximumHealth = 8; modSettings.NeedleDamage = Math.Max(modSettings.DefaultNeedleDamage, 9); modSettings.HealingAmount = 4; modSettings.CoinMultiplier = 3f; modSettings.ShardMultiplier = 3f; modSettings.ShopPriceMultiplier = 0.9f; modSettings.StationPriceMultiplier = 0.9f; modSettings.HornetSpeedMultiplier = 1.15f; break; default: if (text != "normal") { return false; } break; } bool flag = _settingsStore.ImportJson(JsonUtility.ToJson((object)modSettings, true)); if (flag) { Log("Preset interno aplicado: " + name); } return flag; } private ModSettings CreateNormalSettings() { ModSettings modSettings = ModSettings.CreateDefaults(); ModSettings current = _settingsStore.Current; int value = ((current.DefaultMaximumHealth > 0) ? current.DefaultMaximumHealth : 5); int value2 = ((current.DefaultNeedleDamage > 0) ? current.DefaultNeedleDamage : 5); modSettings.MaximumHealth = ValueValidator.ClampHealth(value); modSettings.DefaultMaximumHealth = ValueValidator.ClampHealth(value); modSettings.NeedleDamage = ValueValidator.ClampNeedleDamage(value2); modSettings.DefaultNeedleDamage = ValueValidator.ClampNeedleDamage(value2); modSettings.FavoriteSettings = ((current.FavoriteSettings != null) ? ((string[])current.FavoriteSettings.Clone()) : new string[0]); return modSettings; } private bool TryConvertPresetJson(string json, out string convertedJson) { convertedJson = json ?? string.Empty; if (string.IsNullOrWhiteSpace(convertedJson)) { return false; } if (convertedJson.IndexOf("\"Schema\"", StringComparison.OrdinalIgnoreCase) < 0 || convertedJson.IndexOf("\"Settings\"", StringComparison.OrdinalIgnoreCase) < 0) { return true; } try { LegacyPresetEnvelope legacyPresetEnvelope = JsonUtility.FromJson(convertedJson); if (legacyPresetEnvelope == null || legacyPresetEnvelope.Settings == null) { return false; } LegacyPresetSettings settings = legacyPresetEnvelope.Settings; ModSettings modSettings = CreateNormalSettings(); if (settings.BaseHealth > 0) { modSettings.MaximumHealth = ValueValidator.ClampHealth(settings.BaseHealth); } if (settings.BaseDamage > 0) { modSettings.NeedleDamage = ValueValidator.ClampNeedleDamage(settings.BaseDamage); } modSettings.DamageTakenMultiplier = PositiveOrDefault(settings.DamageTakenMultiplier, 1f); modSettings.EnvironmentalDamageMultiplier = PositiveOrDefault(settings.EnvironmentalDamageMultiplier, 1f); modSettings.HealingAmount = ValueValidator.ClampHealingAmount((int)Math.Round(3f * PositiveOrDefault(settings.HealingMultiplier, 1f), MidpointRounding.AwayFromZero)); modSettings.HealingCost = ValueValidator.ClampHealingCost((int)Math.Round(9f * PositiveOrDefault(settings.HealingCostMultiplier, 1f), MidpointRounding.AwayFromZero)); modSettings.InvincibilityTimeMultiplier = PositiveOrDefault(settings.InvincibilityTimeMultiplier, 1f); modSettings.SilkSpearDamageMultiplier = ((settings.SilkSpearDamageMultiplier > 0f) ? ValueValidator.ClampSilkSpearDamageMultiplier((int)Math.Round(3f * settings.SilkSpearDamageMultiplier, MidpointRounding.AwayFromZero)) : 3); modSettings.EnemyHealthMultiplier = PositiveOrDefault(settings.EnemyHealthMultiplier, 1f); modSettings.EnemySpeedMultiplier = PositiveOrDefault(settings.EnemySpeedMultiplier, 1f); modSettings.EnemyAttackSpeedMultiplier = InvertCooldown(settings.EnemyAttackCooldownMultiplier); modSettings.EnemyAggressionMultiplier = PositiveOrDefault(settings.EnemyAggressionMultiplier, 1f); modSettings.BossHealthMultiplier = PositiveOrDefault(settings.BossHealthMultiplier, 1f); modSettings.BossDamageTakenMultiplier = PositiveOrDefault(settings.BossDamageTakenMultiplier, 1f); modSettings.BossSpeedMultiplier = PositiveOrDefault(settings.BossSpeedMultiplier, 1f); modSettings.BossAttackSpeedMultiplier = InvertCooldown(settings.BossAttackCooldownMultiplier); modSettings.BossBrutalMode = settings.BossBrutalMode; modSettings.DisableHealingDuringBoss = settings.DisableHealingDuringBoss; modSettings.HealingDuringBossMultiplier = PositiveOrDefault(settings.HealingDuringBossMultiplier, 1f); modSettings.CoinMultiplier = PositiveOrDefault(settings.CurrencyDropMultiplier, 1f); modSettings.ShardMultiplier = PositiveOrDefault(settings.ItemDropMultiplier, 1f); modSettings.ShopPriceMultiplier = PositiveOrDefault(settings.ShopPriceMultiplier, 1f); modSettings.DeathRosaryLossPercentage = ValueValidator.ClampDeathRosaryLossPercentage((int)Math.Round(PositiveOrDefault(settings.DeathCurrencyLossMultiplier, 1f) * 100f, MidpointRounding.AwayFromZero)); modSettings.HornetSpeedMultiplier = PositiveOrDefault(settings.PlayerSpeedMultiplier, 1f); modSettings.OneHitMode = settings.OneHitMode; modSettings.MutatorNoHealing = settings.MutatorNoHealing; modSettings.MutatorLowGravity = settings.MutatorLowGravity; modSettings.MutatorDoubleDamage = settings.MutatorDoubleDamage; modSettings.MutatorGlassCannon = settings.MutatorGlassCannon; modSettings.MutatorFastEnemies = settings.MutatorFastEnemies; modSettings.MutatorTankEnemies = settings.MutatorTankEnemies; modSettings.MutatorAggressiveEnemies = settings.MutatorAggressiveEnemies; modSettings.MutatorRandomEnemyHealth = settings.MutatorRandomizedEnemyHealth; modSettings.MutatorRichWorld = settings.MutatorRichWorld; modSettings.MutatorPoorWorld = settings.MutatorPoorWorld; modSettings.MutatorExpensiveShops = settings.MutatorExpensiveShops; modSettings.MutatorNoDeathLoss = settings.MutatorNoDeathLoss; modSettings.MutatorBossFrenzy = settings.MutatorBossFrenzy; modSettings.MutatorNoMercy = settings.MutatorNoMercy; modSettings.MutatorExtendedFights = settings.MutatorExtendedFights; if (legacyPresetEnvelope.FavoriteOptionIds != null) { modSettings.FavoriteSettings = legacyPresetEnvelope.FavoriteOptionIds; } convertedJson = JsonUtility.ToJson((object)modSettings, true); return true; } catch (Exception ex) { if (_logger != null) { _logger.LogWarning((object)("Falha ao migrar preset antigo: " + ex.Message)); } return false; } } private static float PositiveOrDefault(float value, float fallback) { if (!(value > 0f) || float.IsNaN(value) || float.IsInfinity(value)) { return fallback; } return value; } private bool Activate(string id, Func apply) { bool flag = !string.IsNullOrEmpty(_state.ActivePresetId); string activePresetId = _state.ActivePresetId ?? string.Empty; string restoreSnapshot = _state.RestoreSnapshot ?? string.Empty; if (!flag) { _state.RestoreSnapshot = _settingsStore.ExportJson(); } if (apply == null || !apply()) { _state.ActivePresetId = activePresetId; _state.RestoreSnapshot = restoreSnapshot; return false; } _state.ActivePresetId = id; SaveState(); Log("Preset ativado: " + ActivePresetName); return true; } private bool DeactivateCurrent() { if (string.IsNullOrEmpty(_state.ActivePresetId)) { return true; } string restoreSnapshot = _state.RestoreSnapshot; if (!string.IsNullOrEmpty(restoreSnapshot) && !_settingsStore.ImportJson(restoreSnapshot)) { return false; } string activePresetName = ActivePresetName; _state.ActivePresetId = string.Empty; _state.RestoreSnapshot = string.Empty; SaveState(); Log("Preset desativado: " + activePresetName); return true; } private bool IsActive(string id) { return string.Equals(_state.ActivePresetId, id, StringComparison.OrdinalIgnoreCase); } private bool TryReadPreset(string path, out string convertedJson) { convertedJson = string.Empty; try { if (string.IsNullOrEmpty(path) || !File.Exists(path) || !TryConvertPresetJson(File.ReadAllText(path), out convertedJson)) { return false; } return JsonUtility.FromJson(convertedJson) != null; } catch (Exception ex) { Log("Falha ao ler preset: " + ex.Message); return false; } } private void LoadState() { try { if (File.Exists(_statePath)) { _state = JsonUtility.FromJson(File.ReadAllText(_statePath)) ?? new PresetUiState(); } } catch (Exception ex) { _state = new PresetUiState(); Log("Falha ao carregar estado dos presets: " + ex.Message); } if (_state.LoadedPresetFiles == null) { _state.LoadedPresetFiles = new string[0]; } } private void SaveState() { _state.LoadedPresetFiles = _loadedPresetFiles.ToArray(); string directoryName = Path.GetDirectoryName(_statePath); if (!string.IsNullOrEmpty(directoryName)) { Directory.CreateDirectory(directoryName); } File.WriteAllText(_statePath, JsonUtility.ToJson((object)_state, true)); } private void NormalizeLoadedPresetFiles() { _loadedPresetFiles.Clear(); string[] array = _state.LoadedPresetFiles ?? new string[0]; for (int i = 0; i < array.Length; i++) { string fileName = Path.GetFileName(array[i] ?? string.Empty); if (!string.IsNullOrEmpty(fileName) && File.Exists(Path.Combine(_presetDirectory, fileName)) && !ContainsIgnoreCase(_loadedPresetFiles, fileName)) { _loadedPresetFiles.Add(fileName); } } string text = _state.ActivePresetId ?? string.Empty; if (text.StartsWith("file:", StringComparison.OrdinalIgnoreCase)) { string fileName2 = Path.GetFileName(text.Substring("file:".Length)); if (File.Exists(Path.Combine(_presetDirectory, fileName2))) { if (!ContainsIgnoreCase(_loadedPresetFiles, fileName2)) { _loadedPresetFiles.Add(fileName2); } } else { _state.ActivePresetId = string.Empty; _state.RestoreSnapshot = string.Empty; } } SortLoadedPresetFiles(); SaveState(); } private void AddLoadedPresetFile(string fileName) { fileName = Path.GetFileName(fileName ?? string.Empty); if (!string.IsNullOrEmpty(fileName) && !ContainsIgnoreCase(_loadedPresetFiles, fileName)) { _loadedPresetFiles.Add(fileName); SortLoadedPresetFiles(); SaveState(); } } private void SortLoadedPresetFiles() { _loadedPresetFiles.Sort((string left, string right) => string.Compare(left, right, StringComparison.OrdinalIgnoreCase)); } private static bool ContainsIgnoreCase(List values, string candidate) { for (int i = 0; i < values.Count; i++) { if (string.Equals(values[i], candidate, StringComparison.OrdinalIgnoreCase)) { return true; } } return false; } private void MigrateLegacyPresetFiles() { if (string.IsNullOrEmpty(_legacyPresetDirectory) || !Directory.Exists(_legacyPresetDirectory) || string.Equals(Path.GetFullPath(_legacyPresetDirectory), Path.GetFullPath(_presetDirectory), StringComparison.OrdinalIgnoreCase)) { return; } string[] files = Directory.GetFiles(_legacyPresetDirectory, "*.json", SearchOption.TopDirectoryOnly); for (int i = 0; i < files.Length; i++) { string text = Path.Combine(_presetDirectory, Path.GetFileName(files[i])); if (!File.Exists(text)) { File.Copy(files[i], text); } } } private static string NormalizeBuiltInKey(string value) { switch ((value ?? string.Empty).Trim().ToLowerInvariant().Replace('-', '_') .Replace(' ', '_')) { case "muito_fácil": case "muito_facil": case "very_easy": return "very_easy"; case "fácil": case "facil": case "easy": return "easy"; case "normal": return "normal"; case "difícil": case "dificil": case "hard": return "hard"; case "muito_difícil": case "muito_dificil": case "very_hard": return "very_hard"; case "nightmare": return "nightmare"; case "farm": return "farm"; default: return string.Empty; } } private static string GetBuiltInDisplayName(string key) { return NormalizeBuiltInKey(key) switch { "very_easy" => "Muito Fácil", "easy" => "Fácil", "normal" => "Normal", "hard" => "Difícil", "very_hard" => "Muito Difícil", "nightmare" => "Nightmare", "farm" => "Farm", _ => "Nenhum", }; } private static float InvertCooldown(float value) { float num = PositiveOrDefault(value, 1f); return 1f / num; } private string GetSelectedPath() { if (_presetFiles.Count == 0) { return null; } _selectedIndex = Math.Max(0, Math.Min(_selectedIndex, _presetFiles.Count - 1)); return _presetFiles[_selectedIndex]; } private string GetUniquePresetPath(string requestedName) { EnsureDirectories(); string text = SanitizeName(requestedName); string text2 = Path.Combine(_presetDirectory, text + ".json"); int num = 2; while (File.Exists(text2)) { text2 = Path.Combine(_presetDirectory, text + " " + num + ".json"); num++; } return text2; } private static string SanitizeName(string requestedName) { string text = (string.IsNullOrWhiteSpace(requestedName) ? "Meu Preset" : requestedName.Trim()); if (text.EndsWith(".json", StringComparison.OrdinalIgnoreCase)) { text = Path.GetFileNameWithoutExtension(text); } char[] invalidFileNameChars = Path.GetInvalidFileNameChars(); for (int i = 0; i < invalidFileNameChars.Length; i++) { text = text.Replace(invalidFileNameChars[i], '_'); } if (text.Length <= 48) { return text; } return text.Substring(0, 48).Trim(); } private void RefreshAndSelect(string path) { Refresh(); for (int i = 0; i < _presetFiles.Count; i++) { if (string.Equals(_presetFiles[i], path, StringComparison.OrdinalIgnoreCase)) { _selectedIndex = i; break; } } } private void EnsureDirectories() { Directory.CreateDirectory(_presetDirectory); Directory.CreateDirectory(_importDirectory); Directory.CreateDirectory(_exportDirectory); } private void Log(string message) { if (_logger != null) { _logger.LogInfo((object)message); } } } internal sealed class PriceController { private readonly SettingsStore _settingsStore; private readonly ManualLogSource _logger; public static PriceController Instance; public PriceController(SettingsStore settingsStore, ManualLogSource logger) { _settingsStore = settingsStore; _logger = logger; Instance = this; } public int ScaleShopPrice(int originalPrice) { float num = (_settingsStore.IsEnabled(ModSettingKind.ShopPriceMultiplier) ? ValueValidator.NormalizePriceMultiplier(_settingsStore.Current.ShopPriceMultiplier) : 1f); if (_settingsStore.IsMutatorEnabled(ModSettingKind.MutatorExpensiveShops)) { num *= 10f; } return ScalePositivePrice(originalPrice, num); } public int ScaleStationPrice(int originalPrice) { float num = (_settingsStore.IsEnabled(ModSettingKind.StationPriceMultiplier) ? ValueValidator.NormalizePriceMultiplier(_settingsStore.Current.StationPriceMultiplier) : 1f); if (_settingsStore.IsMutatorEnabled(ModSettingKind.MutatorExpensiveShops)) { num *= 10f; } int num2 = ScalePositivePrice(originalPrice, num); if (num2 != originalPrice) { _logger.LogInfo((object)("Preco da estacao aplicado: " + originalPrice + " -> " + num2)); } return num2; } public bool IsStationConfirmation(string prompt) { //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) string text = NormalizeForMatch(prompt); if (text.Contains("inserir rosarios") || text.Contains("insert rosaries") || text.Contains("insertar rosarios") || text.Contains("inserire rosari")) { return true; } for (int i = 0; i < SceneManager.sceneCount; i++) { Scene sceneAt = SceneManager.GetSceneAt(i); if (((Scene)(ref sceneAt)).IsValid() && ((Scene)(ref sceneAt)).isLoaded) { string text2 = NormalizeForMatch(((Scene)(ref sceneAt)).name).Replace(" ", string.Empty); if (text2.Contains("bellshrine")) { return true; } } } return false; } public void Shutdown() { if (Instance == this) { Instance = null; } } private static int ScalePositivePrice(int originalPrice, float multiplier) { if (originalPrice <= 0) { return originalPrice; } double val = Math.Round((double)originalPrice * (double)multiplier, MidpointRounding.AwayFromZero); return Math.Max(1, Math.Min(int.MaxValue, (int)Math.Min(2147483647.0, val))); } private static string NormalizeForMatch(string value) { if (string.IsNullOrEmpty(value)) { return string.Empty; } string text = value.Normalize(NormalizationForm.FormD); StringBuilder stringBuilder = new StringBuilder(text.Length); string text2 = text; foreach (char c in text2) { if (CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark) { stringBuilder.Append(char.ToLowerInvariant(c)); } } return stringBuilder.ToString().Normalize(NormalizationForm.FormC); } } [HarmonyPatch] internal static class ShopPricePatch { private static IEnumerable TargetMethods() { MethodInfo shopItemCost = AccessTools.PropertyGetter(typeof(ShopItem), "Cost"); if (shopItemCost != null) { yield return shopItemCost; } Type hunterItemType = AccessTools.TypeByName("CaravanTroupeHunter+ShopItemInfo"); MethodInfo hunterGetCost = ((hunterItemType != null) ? AccessTools.Method(hunterItemType, "GetCost", (Type[])null, (Type[])null) : null); if (hunterGetCost != null) { yield return hunterGetCost; } Type questItemType = AccessTools.TypeByName("SimpleQuestsShopOwner+ShopItemInfo"); MethodInfo questGetCost = ((questItemType != null) ? AccessTools.Method(questItemType, "GetCost", (Type[])null, (Type[])null) : null); if (questGetCost != null) { yield return questGetCost; } } private static void Postfix(ref int __result) { if (PriceController.Instance != null) { __result = PriceController.Instance.ScaleShopPrice(__result); } } } [HarmonyPatch] internal static class StationPricePatch { private static MethodBase TargetMethod() { MethodInfo[] methods = typeof(DialogueYesNoBox).GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); foreach (MethodInfo methodInfo in methods) { ParameterInfo[] parameters = methodInfo.GetParameters(); if (methodInfo.Name == "Open" && parameters.Length == 13 && parameters[4].ParameterType == typeof(CurrencyType) && parameters[5].ParameterType == typeof(int)) { return methodInfo; } } return null; } private static void Prefix(string text, CurrencyType currencyType, ref int currencyAmount) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) if (PriceController.Instance != null && (int)currencyType == 0 && currencyAmount > 0 && PriceController.Instance.IsStationConfirmation(text)) { currencyAmount = PriceController.Instance.ScaleStationPrice(currencyAmount); } } } internal sealed class SceneTransitionMonitor { private readonly MaximumHealthController _maximumHealthController; private readonly ManualLogSource _logger; private bool _started; public SceneTransitionMonitor(MaximumHealthController maximumHealthController, ManualLogSource logger) { _maximumHealthController = maximumHealthController; _logger = logger; } public void Start() { if (!_started) { _started = true; SceneManager.activeSceneChanged += OnActiveSceneChanged; _maximumHealthController.Synchronize("inicializacao do mod", forceHudRefresh: true); } } public void Shutdown() { if (_started) { SceneManager.activeSceneChanged -= OnActiveSceneChanged; _started = false; } } private void OnActiveSceneChanged(Scene previousScene, Scene currentScene) { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) _logger.LogInfo((object)("Transicao de sala: " + GetSceneName(previousScene) + " -> " + GetSceneName(currentScene) + ".")); _maximumHealthController.Synchronize("transicao de sala", forceHudRefresh: false); } private static string GetSceneName(Scene scene) { if (!((Scene)(ref scene)).IsValid() || string.IsNullOrEmpty(((Scene)(ref scene)).name)) { return "(sem cena)"; } return ((Scene)(ref scene)).name; } } internal sealed class SettingsStore { [Serializable] private sealed class LegacyRecoverySettings { public int SettingsSchemaVersion; public float HealingMultiplier = 1f; public bool HealingMultiplierEnabled = true; public float HealingCostMultiplier = 1f; public bool HealingCostMultiplierEnabled = true; } private readonly ManualLogSource _logger; private readonly string _settingsPath; private ModSettings _settings; public ModSettings Current => _settings; public int FavoriteCount { get { if (_settings.FavoriteSettings == null) { return 0; } return _settings.FavoriteSettings.Length; } } public event Action Changed; public SettingsStore(ManualLogSource logger, string settingsPath) { _logger = logger; _settingsPath = settingsPath; _settings = ModSettings.CreateDefaults(); } public bool IsFavorite(ModSettingKind setting) { string b = setting.ToString(); string[] favoriteSettings = _settings.FavoriteSettings; if (favoriteSettings == null) { return false; } for (int i = 0; i < favoriteSettings.Length; i++) { if (string.Equals(favoriteSettings[i], b, StringComparison.Ordinal)) { return true; } } return false; } public ModSettingKind[] GetFavoriteSettings() { List list = new List(); string[] favoriteSettings = _settings.FavoriteSettings; if (favoriteSettings == null) { return list.ToArray(); } for (int i = 0; i < favoriteSettings.Length; i++) { if (Enum.TryParse(favoriteSettings[i], out var result) && !list.Contains(result)) { list.Add(result); } } return list.ToArray(); } public void ToggleFavorite(ModSettingKind setting) { List list = new List(GetFavoriteSettings()); if (list.Contains(setting)) { list.Remove(setting); } else { list.Add(setting); } string[] array = new string[list.Count]; for (int i = 0; i < list.Count; i++) { array[i] = list[i].ToString(); } _settings.FavoriteSettings = array; Save(); _logger.LogInfo((object)("Favorito " + GetSettingLogName(setting) + ": " + (list.Contains(setting) ? "Adicionado" : "Removido"))); } public bool IsMutatorEnabled(ModSettingKind setting) { if (MutatorCatalog.IsMutator(setting)) { return MutatorCatalog.Get(_settings, setting); } return false; } public void SetMutator(ModSettingKind setting, bool enabled) { if (!MutatorCatalog.IsMutator(setting)) { throw new ArgumentOutOfRangeException("setting"); } List list = new List(); if (enabled && setting == ModSettingKind.MutatorRichWorld && _settings.MutatorPoorWorld) { _settings.MutatorPoorWorld = false; list.Add(ModSettingKind.MutatorPoorWorld); } else if (enabled && setting == ModSettingKind.MutatorPoorWorld && _settings.MutatorRichWorld) { _settings.MutatorRichWorld = false; list.Add(ModSettingKind.MutatorRichWorld); } if (enabled && setting == ModSettingKind.MutatorNoDeathLoss && _settings.MutatorNoMercy) { _settings.MutatorNoMercy = false; list.Add(ModSettingKind.MutatorNoMercy); } else if (enabled && setting == ModSettingKind.MutatorNoMercy && _settings.MutatorNoDeathLoss) { _settings.MutatorNoDeathLoss = false; list.Add(ModSettingKind.MutatorNoDeathLoss); } if (MutatorCatalog.Get(_settings, setting) != enabled) { MutatorCatalog.Set(_settings, setting, enabled); list.Add(setting); } if (list.Count != 0) { Save(); for (int i = 0; i < list.Count; i++) { ModSettingKind setting2 = list[i]; _logger.LogInfo((object)("Mutador " + MutatorCatalog.GetTitle(setting2) + ": " + (MutatorCatalog.Get(_settings, setting2) ? "Ligado" : "Desligado"))); RaiseChanged(setting2); } } } public bool IsEnabled(ModSettingKind setting) { if (SilkSkillSettingCatalog.IsSilkSkillSetting(setting)) { return SilkSkillSettingCatalog.GetEnabled(_settings, setting); } return setting switch { ModSettingKind.MaximumHealth => _settings.MaximumHealthEnabled, ModSettingKind.NeedleDamage => _settings.NeedleDamageEnabled, ModSettingKind.NeedleUpgradePercentage => _settings.NeedleUpgradePercentageEnabled, ModSettingKind.SilkSpearDamageMultiplier => _settings.SilkSpearDamageMultiplierEnabled, ModSettingKind.SilkSpearSilkCost => _settings.SilkSpearSilkCostEnabled, ModSettingKind.DamageTakenMultiplier => _settings.DamageTakenMultiplierEnabled, ModSettingKind.EnvironmentalDamageMultiplier => _settings.EnvironmentalDamageMultiplierEnabled, ModSettingKind.OneHitMode => _settings.OneHitModeEnabled, ModSettingKind.HealingAmount => _settings.HealingAmountEnabled, ModSettingKind.HealingCost => _settings.HealingCostEnabled, ModSettingKind.InvincibilityTimeMultiplier => _settings.InvincibilityTimeMultiplierEnabled, ModSettingKind.EnemyHealthMultiplier => _settings.EnemyHealthMultiplierEnabled, ModSettingKind.EnemySpeedMultiplier => _settings.EnemySpeedMultiplierEnabled, ModSettingKind.EnemyAttackSpeedMultiplier => _settings.EnemyAttackSpeedMultiplierEnabled, ModSettingKind.EnemyAggressionMultiplier => _settings.EnemyAggressionMultiplierEnabled, ModSettingKind.BossHealthMultiplier => _settings.BossHealthMultiplierEnabled, ModSettingKind.BossDamageTakenMultiplier => _settings.BossDamageTakenMultiplierEnabled, ModSettingKind.BossSpeedMultiplier => _settings.BossSpeedMultiplierEnabled, ModSettingKind.BossAttackSpeedMultiplier => _settings.BossAttackSpeedMultiplierEnabled, ModSettingKind.BossBrutalMode => _settings.BossBrutalModeEnabled, ModSettingKind.DisableHealingDuringBoss => _settings.DisableHealingDuringBossEnabled, ModSettingKind.HealingDuringBossMultiplier => _settings.HealingDuringBossMultiplierEnabled, ModSettingKind.CoinMultiplier => _settings.CoinMultiplierEnabled, ModSettingKind.ShardMultiplier => _settings.ShardMultiplierEnabled, ModSettingKind.ShopPriceMultiplier => _settings.ShopPriceMultiplierEnabled, ModSettingKind.StationPriceMultiplier => _settings.StationPriceMultiplierEnabled, ModSettingKind.DeathRosaryLossPercentage => _settings.DeathRosaryLossPercentageEnabled, ModSettingKind.HornetSpeedMultiplier => _settings.HornetSpeedMultiplierEnabled, ModSettingKind.DashRechargeLevel => _settings.DashRechargeLevelEnabled, _ => true, }; } public void SetEnabled(ModSettingKind setting, bool enabled) { if (IsEnabled(setting) == enabled) { return; } if (SilkSkillSettingCatalog.IsSilkSkillSetting(setting)) { SilkSkillSettingCatalog.SetEnabled(_settings, setting, enabled); Save(); _logger.LogInfo((object)("Opcao " + SilkSkillSettingCatalog.GetLogName(setting) + ": " + (enabled ? "Ligada" : "Desligada"))); RaiseChanged(setting); return; } switch (setting) { case ModSettingKind.MaximumHealth: _settings.MaximumHealthEnabled = enabled; break; case ModSettingKind.NeedleDamage: _settings.NeedleDamageEnabled = enabled; break; case ModSettingKind.NeedleUpgradePercentage: _settings.NeedleUpgradePercentageEnabled = enabled; break; case ModSettingKind.SilkSpearDamageMultiplier: _settings.SilkSpearDamageMultiplierEnabled = enabled; break; case ModSettingKind.SilkSpearSilkCost: _settings.SilkSpearSilkCostEnabled = enabled; break; case ModSettingKind.DamageTakenMultiplier: _settings.DamageTakenMultiplierEnabled = enabled; break; case ModSettingKind.EnvironmentalDamageMultiplier: _settings.EnvironmentalDamageMultiplierEnabled = enabled; break; case ModSettingKind.OneHitMode: _settings.OneHitModeEnabled = enabled; break; case ModSettingKind.HealingAmount: _settings.HealingAmountEnabled = enabled; break; case ModSettingKind.HealingCost: _settings.HealingCostEnabled = enabled; break; case ModSettingKind.InvincibilityTimeMultiplier: _settings.InvincibilityTimeMultiplierEnabled = enabled; break; case ModSettingKind.EnemyHealthMultiplier: _settings.EnemyHealthMultiplierEnabled = enabled; break; case ModSettingKind.EnemySpeedMultiplier: _settings.EnemySpeedMultiplierEnabled = enabled; break; case ModSettingKind.EnemyAttackSpeedMultiplier: _settings.EnemyAttackSpeedMultiplierEnabled = enabled; break; case ModSettingKind.EnemyAggressionMultiplier: _settings.EnemyAggressionMultiplierEnabled = enabled; break; case ModSettingKind.BossHealthMultiplier: _settings.BossHealthMultiplierEnabled = enabled; break; case ModSettingKind.BossDamageTakenMultiplier: _settings.BossDamageTakenMultiplierEnabled = enabled; break; case ModSettingKind.BossSpeedMultiplier: _settings.BossSpeedMultiplierEnabled = enabled; break; case ModSettingKind.BossAttackSpeedMultiplier: _settings.BossAttackSpeedMultiplierEnabled = enabled; break; case ModSettingKind.BossBrutalMode: _settings.BossBrutalModeEnabled = enabled; break; case ModSettingKind.DisableHealingDuringBoss: _settings.DisableHealingDuringBossEnabled = enabled; break; case ModSettingKind.HealingDuringBossMultiplier: _settings.HealingDuringBossMultiplierEnabled = enabled; break; case ModSettingKind.CoinMultiplier: _settings.CoinMultiplierEnabled = enabled; break; case ModSettingKind.ShardMultiplier: _settings.ShardMultiplierEnabled = enabled; break; case ModSettingKind.ShopPriceMultiplier: _settings.ShopPriceMultiplierEnabled = enabled; break; case ModSettingKind.StationPriceMultiplier: _settings.StationPriceMultiplierEnabled = enabled; break; case ModSettingKind.DeathRosaryLossPercentage: _settings.DeathRosaryLossPercentageEnabled = enabled; break; case ModSettingKind.HornetSpeedMultiplier: _settings.HornetSpeedMultiplierEnabled = enabled; break; case ModSettingKind.DashRechargeLevel: _settings.DashRechargeLevelEnabled = enabled; break; } Save(); _logger.LogInfo((object)("Opcao " + GetSettingLogName(setting) + ": " + (enabled ? "Ligada" : "Desligada"))); RaiseChanged(setting); } public void Load() { if (!File.Exists(_settingsPath)) { _settings = ModSettings.CreateDefaults(); return; } try { string text = File.ReadAllText(_settingsPath); ModSettings modSettings = JsonUtility.FromJson(text); if (modSettings != null && modSettings.SettingsSchemaVersion < 7) { MigrateLegacyRecoverySettings(text, modSettings); } _settings = modSettings ?? ModSettings.CreateDefaults(); if (ValidateLoadedSettings()) { Save(); } } catch (Exception ex) { _settings = ModSettings.CreateDefaults(); _logger.LogWarning((object)("Nao foi possivel carregar as configuracoes. Usando padroes: " + ex.Message)); } } public bool EnsureMaximumHealthInitialized(int gameMaximumHealth) { if (_settings.MaximumHealth > 0) { if (_settings.DefaultMaximumHealth <= 0) { _settings.DefaultMaximumHealth = ValueValidator.ClampHealth(gameMaximumHealth); Save(); } return false; } int num = ValueValidator.ClampHealth(gameMaximumHealth); _settings.MaximumHealth = num; _settings.DefaultMaximumHealth = num; Save(); _logger.LogInfo((object)("Vida maxima padrao detectada: " + num)); RaiseChanged(ModSettingKind.MaximumHealth); return true; } public bool EnsureNeedleDamageInitialized(int gameNeedleDamage) { if (_settings.NeedleDamage > 0) { if (_settings.DefaultNeedleDamage <= 0) { _settings.DefaultNeedleDamage = ValueValidator.ClampNeedleDamage(gameNeedleDamage); Save(); } return false; } int num = ValueValidator.ClampNeedleDamage(gameNeedleDamage); _settings.NeedleDamage = num; _settings.DefaultNeedleDamage = num; Save(); _logger.LogInfo((object)("Dano padrao da agulha detectado: " + num)); RaiseChanged(ModSettingKind.NeedleDamage); return true; } public void SetMaximumHealth(int value) { int num = ValueValidator.ClampHealth(value); if (_settings.MaximumHealth != num) { int maximumHealth = _settings.MaximumHealth; _settings.MaximumHealth = num; Save(); _logger.LogInfo((object)("Vida maxima alterada: " + maximumHealth + " -> " + num)); RaiseChanged(ModSettingKind.MaximumHealth); } } public void SetNeedleDamage(int value) { int num = ValueValidator.ClampNeedleDamage(value); if (_settings.NeedleDamage != num) { int needleDamage = _settings.NeedleDamage; _settings.NeedleDamage = num; Save(); _logger.LogInfo((object)("Dano da agulha alterado: " + needleDamage + " -> " + num)); RaiseChanged(ModSettingKind.NeedleDamage); } } public void SetNeedleUpgradePercentage(int value) { int num = ValueValidator.ClampNeedleUpgradePercentage(value); if (_settings.NeedleUpgradePercentage != num) { int needleUpgradePercentage = _settings.NeedleUpgradePercentage; _settings.NeedleUpgradePercentage = num; Save(); _logger.LogInfo((object)("Aumento da agulha por melhoria alterado: " + needleUpgradePercentage + "% -> " + num + "%")); RaiseChanged(ModSettingKind.NeedleUpgradePercentage); } } public void SetSilkSpearDamageMultiplier(int value) { int num = ValueValidator.ClampSilkSpearDamageMultiplier(value); if (_settings.SilkSpearDamageMultiplier != num) { int silkSpearDamageMultiplier = _settings.SilkSpearDamageMultiplier; _settings.SilkSpearDamageMultiplier = num; Save(); _logger.LogInfo((object)("Dano da Lanca de Seda alterado: " + ValueValidator.FormatSilkSpearDamageMultiplier(silkSpearDamageMultiplier) + " -> " + ValueValidator.FormatSilkSpearDamageMultiplier(num))); RaiseChanged(ModSettingKind.SilkSpearDamageMultiplier); } } public void SetSilkSpearSilkCost(int value) { int num = ValueValidator.ClampSilkSpearSilkCost(value); if (_settings.SilkSpearSilkCost != num) { int silkSpearSilkCost = _settings.SilkSpearSilkCost; _settings.SilkSpearSilkCost = num; Save(); _logger.LogInfo((object)("Custo de Seda da Lanca de Seda alterado: " + ValueValidator.FormatSilkSpearSilkCost(silkSpearSilkCost) + " -> " + ValueValidator.FormatSilkSpearSilkCost(num))); RaiseChanged(ModSettingKind.SilkSpearSilkCost); } } public float GetSilkSkillValue(ModSettingKind setting) { if (!SilkSkillSettingCatalog.IsSilkSkillSetting(setting)) { throw new ArgumentOutOfRangeException("setting"); } return SilkSkillSettingCatalog.GetValue(_settings, setting); } public void SetSilkSkillValue(ModSettingKind setting, float value) { if (!SilkSkillSettingCatalog.IsSilkSkillSetting(setting)) { throw new ArgumentOutOfRangeException("setting"); } float value2 = SilkSkillSettingCatalog.GetValue(_settings, setting); float num = SilkSkillSettingCatalog.Normalize(setting, value); if (!(Math.Abs(value2 - num) < 0.0001f)) { SilkSkillSettingCatalog.SetValue(_settings, setting, num); Save(); _logger.LogInfo((object)(SilkSkillSettingCatalog.GetLogName(setting) + " alterado: " + SilkSkillSettingCatalog.Format(setting, value2) + " -> " + SilkSkillSettingCatalog.Format(setting, num))); RaiseChanged(setting); } } public string ExportJson() { return JsonUtility.ToJson((object)_settings, true); } public bool ImportJson(string json) { try { ModSettings modSettings = JsonUtility.FromJson(json ?? string.Empty); if (modSettings == null) { return false; } if (modSettings.SettingsSchemaVersion < 7) { MigrateLegacyRecoverySettings(json, modSettings); } _settings = modSettings; ValidateLoadedSettings(); Save(); RaiseAllChanged(); return true; } catch (Exception ex) { _logger.LogWarning((object)("Nao foi possivel importar as configuracoes: " + ex.Message)); return false; } } public void SetDamageTakenMultiplier(float value) { float num = ValueValidator.NormalizeDamageMultiplier(value); if (!(Math.Abs(_settings.DamageTakenMultiplier - num) < 0.001f)) { float damageTakenMultiplier = _settings.DamageTakenMultiplier; _settings.DamageTakenMultiplier = num; Save(); _logger.LogInfo((object)("Dano recebido alterado: " + ValueValidator.FormatDamageMultiplier(damageTakenMultiplier) + " -> " + ValueValidator.FormatDamageMultiplier(num))); RaiseChanged(ModSettingKind.DamageTakenMultiplier); } } public void SetEnvironmentalDamageMultiplier(float value) { float num = ValueValidator.NormalizeDamageMultiplier(value); if (!(Math.Abs(_settings.EnvironmentalDamageMultiplier - num) < 0.001f)) { float environmentalDamageMultiplier = _settings.EnvironmentalDamageMultiplier; _settings.EnvironmentalDamageMultiplier = num; Save(); _logger.LogInfo((object)("Dano de cenario alterado: " + ValueValidator.FormatDamageMultiplier(environmentalDamageMultiplier) + " -> " + ValueValidator.FormatDamageMultiplier(num))); RaiseChanged(ModSettingKind.EnvironmentalDamageMultiplier); } } public void SetOneHitMode(bool enabled) { if (_settings.OneHitMode != enabled) { _settings.OneHitMode = enabled; Save(); _logger.LogInfo((object)("Modo One Hit alterado: " + (enabled ? "Ligado" : "Desligado"))); RaiseChanged(ModSettingKind.OneHitMode); } } public void SetHealingAmount(int value) { int num = ValueValidator.ClampHealingAmount(value); if (_settings.HealingAmount != num) { int healingAmount = _settings.HealingAmount; _settings.HealingAmount = num; Save(); _logger.LogInfo((object)("Quantidade de cura alterada: " + ValueValidator.FormatHealingAmount(healingAmount) + " -> " + ValueValidator.FormatHealingAmount(num))); RaiseChanged(ModSettingKind.HealingAmount); } } public void SetHealingCost(int value) { int num = ValueValidator.ClampHealingCost(value); if (_settings.HealingCost != num) { int healingCost = _settings.HealingCost; _settings.HealingCost = num; Save(); _logger.LogInfo((object)("Custo da cura alterado: " + ValueValidator.FormatHealingCost(healingCost) + " -> " + ValueValidator.FormatHealingCost(num))); RaiseChanged(ModSettingKind.HealingCost); } } public void SetInvincibilityTimeMultiplier(float value) { float num = ValueValidator.NormalizeMultiplier(value); if (!(Math.Abs(_settings.InvincibilityTimeMultiplier - num) < 0.001f)) { float invincibilityTimeMultiplier = _settings.InvincibilityTimeMultiplier; _settings.InvincibilityTimeMultiplier = num; Save(); _logger.LogInfo((object)("Tempo de invencibilidade alterado: " + ValueValidator.FormatMultiplier(invincibilityTimeMultiplier) + " -> " + ValueValidator.FormatMultiplier(num))); RaiseChanged(ModSettingKind.InvincibilityTimeMultiplier); } } public void SetEnemyHealthMultiplier(float value) { float num = ValueValidator.NormalizeMultiplier(value); if (!(Math.Abs(_settings.EnemyHealthMultiplier - num) < 0.001f)) { float enemyHealthMultiplier = _settings.EnemyHealthMultiplier; _settings.EnemyHealthMultiplier = num; Save(); _logger.LogInfo((object)("Vida dos inimigos alterada: " + ValueValidator.FormatMultiplier(enemyHealthMultiplier) + " -> " + ValueValidator.FormatMultiplier(num))); RaiseChanged(ModSettingKind.EnemyHealthMultiplier); } } public void SetEnemySpeedMultiplier(float value) { float num = ValueValidator.NormalizeEnemySpeedMultiplier(value); if (!(Math.Abs(_settings.EnemySpeedMultiplier - num) < 0.001f)) { float enemySpeedMultiplier = _settings.EnemySpeedMultiplier; _settings.EnemySpeedMultiplier = num; Save(); _logger.LogInfo((object)("Velocidade dos inimigos alterada: " + ValueValidator.FormatEnemySpeedMultiplier(enemySpeedMultiplier) + " -> " + ValueValidator.FormatEnemySpeedMultiplier(num))); RaiseChanged(ModSettingKind.EnemySpeedMultiplier); } } public void SetEnemyAttackSpeedMultiplier(float value) { float num = ValueValidator.NormalizeMultiplier(value); if (!(Math.Abs(_settings.EnemyAttackSpeedMultiplier - num) < 0.001f)) { float enemyAttackSpeedMultiplier = _settings.EnemyAttackSpeedMultiplier; _settings.EnemyAttackSpeedMultiplier = num; Save(); _logger.LogInfo((object)("Recarga de ataque dos inimigos alterada: " + ValueValidator.FormatMultiplier(enemyAttackSpeedMultiplier) + " -> " + ValueValidator.FormatMultiplier(num))); RaiseChanged(ModSettingKind.EnemyAttackSpeedMultiplier); } } public void SetEnemyAggressionMultiplier(float value) { float num = ValueValidator.NormalizeMultiplier(value); if (!(Math.Abs(_settings.EnemyAggressionMultiplier - num) < 0.001f)) { float enemyAggressionMultiplier = _settings.EnemyAggressionMultiplier; _settings.EnemyAggressionMultiplier = num; Save(); _logger.LogInfo((object)("Agressividade dos inimigos alterada: " + ValueValidator.FormatMultiplier(enemyAggressionMultiplier) + " -> " + ValueValidator.FormatMultiplier(num))); RaiseChanged(ModSettingKind.EnemyAggressionMultiplier); } } public void SetBossHealthMultiplier(float value) { SetBossMultiplier(ModSettingKind.BossHealthMultiplier, ValueValidator.NormalizeMultiplier(value), _settings.BossHealthMultiplier, delegate(float normalized) { _settings.BossHealthMultiplier = normalized; }, "Vida dos Bosses"); } public void SetBossDamageTakenMultiplier(float value) { SetBossMultiplier(ModSettingKind.BossDamageTakenMultiplier, ValueValidator.NormalizeMultiplier(value), _settings.BossDamageTakenMultiplier, delegate(float normalized) { _settings.BossDamageTakenMultiplier = normalized; }, "Dano recebido de Boss"); } public void SetBossSpeedMultiplier(float value) { SetBossMultiplier(ModSettingKind.BossSpeedMultiplier, ValueValidator.NormalizeEnemySpeedMultiplier(value), _settings.BossSpeedMultiplier, delegate(float normalized) { _settings.BossSpeedMultiplier = normalized; }, "Velocidade dos Bosses"); } public void SetBossAttackSpeedMultiplier(float value) { SetBossMultiplier(ModSettingKind.BossAttackSpeedMultiplier, ValueValidator.NormalizeBossAttackSpeedMultiplier(value), _settings.BossAttackSpeedMultiplier, delegate(float normalized) { _settings.BossAttackSpeedMultiplier = normalized; }, "Velocidade de ataque dos Bosses"); } public void SetBossBrutalMode(bool enabled) { if (_settings.BossBrutalMode != enabled) { _settings.BossBrutalMode = enabled; Save(); _logger.LogInfo((object)("Modo Boss Brutal alterado: " + (enabled ? "Ligado" : "Desligado"))); RaiseChanged(ModSettingKind.BossBrutalMode); } } public void SetDisableHealingDuringBoss(bool enabled) { if (_settings.DisableHealingDuringBoss != enabled) { _settings.DisableHealingDuringBoss = enabled; Save(); _logger.LogInfo((object)("Sem cura em Boss alterado: " + (enabled ? "Ligado" : "Desligado"))); RaiseChanged(ModSettingKind.DisableHealingDuringBoss); } } public void SetHealingDuringBossMultiplier(float value) { SetBossMultiplier(ModSettingKind.HealingDuringBossMultiplier, ValueValidator.NormalizeMultiplier(value), _settings.HealingDuringBossMultiplier, delegate(float normalized) { _settings.HealingDuringBossMultiplier = normalized; }, "Cura durante Boss"); } public void SetMenuLanguage(string value) { string text = LocalizationManager.NormalizeCode(value); if (!string.Equals(_settings.MenuLanguage, text, StringComparison.Ordinal)) { _settings.MenuLanguage = text; Save(); } } private void SetBossMultiplier(ModSettingKind setting, float normalized, float previous, Action assign, string label) { if (!(Math.Abs(previous - normalized) < 0.001f)) { assign(normalized); Save(); _logger.LogInfo((object)(label + " alterado: " + ValueValidator.FormatMultiplier(previous) + " -> " + ValueValidator.FormatMultiplier(normalized))); RaiseChanged(setting); } } public void SetCoinMultiplier(float value) { float num = ValueValidator.NormalizeMultiplier(value); if (!(Math.Abs(_settings.CoinMultiplier - num) < 0.001f)) { float coinMultiplier = _settings.CoinMultiplier; _settings.CoinMultiplier = num; Save(); _logger.LogInfo((object)("Multiplicador de Rosarios por moedas alterado: " + ValueValidator.FormatMultiplier(coinMultiplier) + " -> " + ValueValidator.FormatMultiplier(num))); RaiseChanged(ModSettingKind.CoinMultiplier); } } public void SetShardMultiplier(float value) { float num = ValueValidator.NormalizeMultiplier(value); if (!(Math.Abs(_settings.ShardMultiplier - num) < 0.001f)) { float shardMultiplier = _settings.ShardMultiplier; _settings.ShardMultiplier = num; Save(); _logger.LogInfo((object)("Multiplicador de Fragmentos alterado: " + ValueValidator.FormatMultiplier(shardMultiplier) + " -> " + ValueValidator.FormatMultiplier(num))); RaiseChanged(ModSettingKind.ShardMultiplier); } } public void SetShopPriceMultiplier(float value) { float num = ValueValidator.NormalizePriceMultiplier(value); if (!(Math.Abs(_settings.ShopPriceMultiplier - num) < 0.001f)) { float shopPriceMultiplier = _settings.ShopPriceMultiplier; _settings.ShopPriceMultiplier = num; Save(); _logger.LogInfo((object)("Multiplicador de precos das lojas alterado: " + ValueValidator.FormatPriceMultiplier(shopPriceMultiplier) + " -> " + ValueValidator.FormatPriceMultiplier(num))); RaiseChanged(ModSettingKind.ShopPriceMultiplier); } } public void SetStationPriceMultiplier(float value) { float num = ValueValidator.NormalizePriceMultiplier(value); if (!(Math.Abs(_settings.StationPriceMultiplier - num) < 0.001f)) { float stationPriceMultiplier = _settings.StationPriceMultiplier; _settings.StationPriceMultiplier = num; Save(); _logger.LogInfo((object)("Multiplicador de precos das estacoes alterado: " + ValueValidator.FormatPriceMultiplier(stationPriceMultiplier) + " -> " + ValueValidator.FormatPriceMultiplier(num))); RaiseChanged(ModSettingKind.StationPriceMultiplier); } } public void SetDeathRosaryLossPercentage(int value) { int num = ValueValidator.ClampDeathRosaryLossPercentage(value); if (_settings.DeathRosaryLossPercentage != num) { int deathRosaryLossPercentage = _settings.DeathRosaryLossPercentage; _settings.DeathRosaryLossPercentage = num; Save(); _logger.LogInfo((object)("Perda de Rosarios na morte alterada: " + ValueValidator.FormatDeathRosaryLossPercentage(deathRosaryLossPercentage) + " -> " + ValueValidator.FormatDeathRosaryLossPercentage(num))); RaiseChanged(ModSettingKind.DeathRosaryLossPercentage); } } public void SetHornetSpeedMultiplier(float value) { float num = ValueValidator.NormalizeHornetSpeedMultiplier(value); if (!(Math.Abs(_settings.HornetSpeedMultiplier - num) < 0.001f)) { float hornetSpeedMultiplier = _settings.HornetSpeedMultiplier; _settings.HornetSpeedMultiplier = num; Save(); _logger.LogInfo((object)("Velocidade da Hornet alterada: " + ValueValidator.FormatHornetSpeedMultiplier(hornetSpeedMultiplier) + " -> " + ValueValidator.FormatHornetSpeedMultiplier(num))); RaiseChanged(ModSettingKind.HornetSpeedMultiplier); } } public void SetDashRechargeLevel(int value) { int num = ValueValidator.ClampDashRechargeLevel(value); if (_settings.DashRechargeLevel != num) { int dashRechargeLevel = _settings.DashRechargeLevel; _settings.DashRechargeLevel = num; Save(); _logger.LogInfo((object)("Nivel de recarga do dash alterado: " + dashRechargeLevel + " -> " + num)); RaiseChanged(ModSettingKind.DashRechargeLevel); } } public void ResetPlayerCategory() { int maximumHealth = ((_settings.DefaultMaximumHealth > 0) ? ValueValidator.ClampHealth(_settings.DefaultMaximumHealth) : 5); _settings.MaximumHealth = maximumHealth; _settings.MaximumHealthEnabled = true; _settings.DamageTakenMultiplier = 1f; _settings.DamageTakenMultiplierEnabled = true; _settings.EnvironmentalDamageMultiplier = 1f; _settings.EnvironmentalDamageMultiplierEnabled = true; _settings.OneHitMode = false; _settings.OneHitModeEnabled = true; _settings.HealingAmount = 3; _settings.HealingAmountEnabled = true; _settings.HealingCost = 9; _settings.HealingCostEnabled = true; _settings.InvincibilityTimeMultiplier = 1f; _settings.InvincibilityTimeMultiplierEnabled = true; Save(); _logger.LogInfo((object)"Categoria Jogador restaurada para os valores padrao."); RaiseChanged(ModSettingKind.MaximumHealth); RaiseChanged(ModSettingKind.DamageTakenMultiplier); RaiseChanged(ModSettingKind.EnvironmentalDamageMultiplier); RaiseChanged(ModSettingKind.OneHitMode); RaiseChanged(ModSettingKind.HealingAmount); RaiseChanged(ModSettingKind.HealingCost); RaiseChanged(ModSettingKind.InvincibilityTimeMultiplier); } public void ResetDropsCategory() { _settings.CoinMultiplier = 1f; _settings.CoinMultiplierEnabled = true; _settings.ShardMultiplier = 1f; _settings.ShardMultiplierEnabled = true; Save(); _logger.LogInfo((object)"Categoria Drops restaurada para os valores padrao."); RaiseChanged(ModSettingKind.CoinMultiplier); RaiseChanged(ModSettingKind.ShardMultiplier); } public void ResetEnemiesCategory() { _settings.EnemyHealthMultiplier = 1f; _settings.EnemyHealthMultiplierEnabled = true; _settings.EnemySpeedMultiplier = 1f; _settings.EnemySpeedMultiplierEnabled = true; _settings.EnemyAttackSpeedMultiplier = 1f; _settings.EnemyAttackSpeedMultiplierEnabled = true; _settings.EnemyAggressionMultiplier = 1f; _settings.EnemyAggressionMultiplierEnabled = true; Save(); _logger.LogInfo((object)"Categoria Inimigos restaurada para os valores padrao."); RaiseChanged(ModSettingKind.EnemyHealthMultiplier); RaiseChanged(ModSettingKind.EnemySpeedMultiplier); RaiseChanged(ModSettingKind.EnemyAttackSpeedMultiplier); RaiseChanged(ModSettingKind.EnemyAggressionMultiplier); } public void ResetBossesCategory() { _settings.BossHealthMultiplier = 1f; _settings.BossHealthMultiplierEnabled = true; _settings.BossDamageTakenMultiplier = 1f; _settings.BossDamageTakenMultiplierEnabled = true; _settings.BossSpeedMultiplier = 1f; _settings.BossSpeedMultiplierEnabled = true; _settings.BossAttackSpeedMultiplier = 1f; _settings.BossAttackSpeedMultiplierEnabled = true; _settings.BossBrutalMode = false; _settings.BossBrutalModeEnabled = true; _settings.DisableHealingDuringBoss = false; _settings.DisableHealingDuringBossEnabled = true; _settings.HealingDuringBossMultiplier = 1f; _settings.HealingDuringBossMultiplierEnabled = true; Save(); _logger.LogInfo((object)"Categoria Bosses restaurada para os valores padrao."); RaiseChanged(ModSettingKind.BossHealthMultiplier); RaiseChanged(ModSettingKind.BossDamageTakenMultiplier); RaiseChanged(ModSettingKind.BossSpeedMultiplier); RaiseChanged(ModSettingKind.BossAttackSpeedMultiplier); RaiseChanged(ModSettingKind.BossBrutalMode); RaiseChanged(ModSettingKind.DisableHealingDuringBoss); RaiseChanged(ModSettingKind.HealingDuringBossMultiplier); } public void ResetEconomyCategory() { _settings.ShopPriceMultiplier = 1f; _settings.ShopPriceMultiplierEnabled = true; _settings.StationPriceMultiplier = 1f; _settings.StationPriceMultiplierEnabled = true; _settings.DeathRosaryLossPercentage = 100; _settings.DeathRosaryLossPercentageEnabled = true; Save(); _logger.LogInfo((object)"Categoria Economia restaurada para os valores padrao."); RaiseChanged(ModSettingKind.ShopPriceMultiplier); RaiseChanged(ModSettingKind.StationPriceMultiplier); RaiseChanged(ModSettingKind.DeathRosaryLossPercentage); } public void ResetMovementCategory() { _settings.HornetSpeedMultiplier = 1f; _settings.HornetSpeedMultiplierEnabled = true; _settings.DashRechargeLevel = 1; _settings.DashRechargeLevelEnabled = true; Save(); _logger.LogInfo((object)"Categoria Movimento restaurada para os valores padrao."); RaiseChanged(ModSettingKind.HornetSpeedMultiplier); RaiseChanged(ModSettingKind.DashRechargeLevel); } public void ResetMutatorsCategory() { List list = new List(); for (int i = 0; i < MutatorCatalog.All.Length; i++) { ModSettingKind setting = MutatorCatalog.All[i].Setting; if (MutatorCatalog.Get(_settings, setting)) { list.Add(setting); } } if (list.Count != 0) { MutatorCatalog.ResetAll(_settings); Save(); _logger.LogInfo((object)"Categoria Mutadores restaurada: todos desligados."); for (int j = 0; j < list.Count; j++) { RaiseChanged(list[j]); } } } public void RestoreDefaults() { int num = ((_settings.DefaultMaximumHealth > 0) ? ValueValidator.ClampHealth(_settings.DefaultMaximumHealth) : 5); int num2 = ((_settings.DefaultNeedleDamage > 0) ? ValueValidator.ClampNeedleDamage(_settings.DefaultNeedleDamage) : 5); bool flag = _settings.MaximumHealth != num || !_settings.MaximumHealthEnabled; bool flag2 = _settings.NeedleDamage != num2 || !_settings.NeedleDamageEnabled; bool flag3 = _settings.NeedleUpgradePercentage != 0 || !_settings.NeedleUpgradePercentageEnabled; bool flag4 = _settings.SilkSpearDamageMultiplier != 3 || !_settings.SilkSpearDamageMultiplierEnabled; bool flag5 = _settings.SilkSpearSilkCost != 4 || !_settings.SilkSpearSilkCostEnabled; bool flag6 = Math.Abs(_settings.DamageTakenMultiplier - 1f) >= 0.001f || !_settings.DamageTakenMultiplierEnabled; bool flag7 = Math.Abs(_settings.EnvironmentalDamageMultiplier - 1f) >= 0.001f || !_settings.EnvironmentalDamageMultiplierEnabled; bool flag8 = _settings.OneHitMode || !_settings.OneHitModeEnabled; bool flag9 = _settings.HealingAmount != 3 || !_settings.HealingAmountEnabled; bool flag10 = _settings.HealingCost != 9 || !_settings.HealingCostEnabled; bool flag11 = Math.Abs(_settings.InvincibilityTimeMultiplier - 1f) >= 0.001f || !_settings.InvincibilityTimeMultiplierEnabled; bool flag12 = Math.Abs(_settings.EnemyHealthMultiplier - 1f) >= 0.001f || !_settings.EnemyHealthMultiplierEnabled; bool flag13 = Math.Abs(_settings.EnemySpeedMultiplier - 1f) >= 0.001f || !_settings.EnemySpeedMultiplierEnabled; bool flag14 = Math.Abs(_settings.EnemyAttackSpeedMultiplier - 1f) >= 0.001f || !_settings.EnemyAttackSpeedMultiplierEnabled; bool flag15 = Math.Abs(_settings.EnemyAggressionMultiplier - 1f) >= 0.001f || !_settings.EnemyAggressionMultiplierEnabled; bool flag16 = Math.Abs(_settings.BossHealthMultiplier - 1f) >= 0.001f || !_settings.BossHealthMultiplierEnabled; bool flag17 = Math.Abs(_settings.BossDamageTakenMultiplier - 1f) >= 0.001f || !_settings.BossDamageTakenMultiplierEnabled; bool flag18 = Math.Abs(_settings.BossSpeedMultiplier - 1f) >= 0.001f || !_settings.BossSpeedMultiplierEnabled; bool flag19 = Math.Abs(_settings.BossAttackSpeedMultiplier - 1f) >= 0.001f || !_settings.BossAttackSpeedMultiplierEnabled; bool flag20 = _settings.BossBrutalMode || !_settings.BossBrutalModeEnabled; bool flag21 = _settings.DisableHealingDuringBoss || !_settings.DisableHealingDuringBossEnabled; bool flag22 = Math.Abs(_settings.HealingDuringBossMultiplier - 1f) >= 0.001f || !_settings.HealingDuringBossMultiplierEnabled; bool flag23 = Math.Abs(_settings.CoinMultiplier - 1f) >= 0.001f || !_settings.CoinMultiplierEnabled; bool flag24 = Math.Abs(_settings.ShardMultiplier - 1f) >= 0.001f || !_settings.ShardMultiplierEnabled; bool flag25 = Math.Abs(_settings.ShopPriceMultiplier - 1f) >= 0.001f || !_settings.ShopPriceMultiplierEnabled; bool flag26 = Math.Abs(_settings.StationPriceMultiplier - 1f) >= 0.001f || !_settings.StationPriceMultiplierEnabled; bool flag27 = _settings.DeathRosaryLossPercentage != 100 || !_settings.DeathRosaryLossPercentageEnabled; bool flag28 = Math.Abs(_settings.HornetSpeedMultiplier - 1f) >= 0.001f || !_settings.HornetSpeedMultiplierEnabled; bool flag29 = _settings.DashRechargeLevel != 1 || !_settings.DashRechargeLevelEnabled; bool[] array = new bool[MutatorCatalog.All.Length]; for (int i = 0; i < MutatorCatalog.All.Length; i++) { array[i] = MutatorCatalog.Get(_settings, MutatorCatalog.All[i].Setting); } bool[] array2 = new bool[SilkSkillSettingCatalog.AllSettings.Length]; for (int j = 0; j < SilkSkillSettingCatalog.AllSettings.Length; j++) { ModSettingKind setting = SilkSkillSettingCatalog.AllSettings[j]; array2[j] = Math.Abs(SilkSkillSettingCatalog.GetValue(_settings, setting) - SilkSkillSettingCatalog.GetDefault(setting)) >= 0.0001f || !SilkSkillSettingCatalog.GetEnabled(_settings, setting); } _settings.MaximumHealth = num; _settings.MaximumHealthEnabled = true; _settings.NeedleDamage = num2; _settings.NeedleDamageEnabled = true; _settings.NeedleUpgradePercentage = 0; _settings.NeedleUpgradePercentageEnabled = true; _settings.SilkSpearDamageMultiplier = 3; _settings.SilkSpearDamageMultiplierEnabled = true; _settings.SilkSpearSilkCost = 4; _settings.SilkSpearSilkCostEnabled = true; for (int k = 0; k < SilkSkillSettingCatalog.AllSettings.Length; k++) { ModSettingKind setting2 = SilkSkillSettingCatalog.AllSettings[k]; SilkSkillSettingCatalog.SetValue(_settings, setting2, SilkSkillSettingCatalog.GetDefault(setting2)); SilkSkillSettingCatalog.SetEnabled(_settings, setting2, enabled: true); } _settings.DamageTakenMultiplier = 1f; _settings.DamageTakenMultiplierEnabled = true; _settings.EnvironmentalDamageMultiplier = 1f; _settings.EnvironmentalDamageMultiplierEnabled = true; _settings.OneHitMode = false; _settings.OneHitModeEnabled = true; _settings.HealingAmount = 3; _settings.HealingAmountEnabled = true; _settings.HealingCost = 9; _settings.HealingCostEnabled = true; _settings.InvincibilityTimeMultiplier = 1f; _settings.InvincibilityTimeMultiplierEnabled = true; _settings.EnemyHealthMultiplier = 1f; _settings.EnemyHealthMultiplierEnabled = true; _settings.EnemySpeedMultiplier = 1f; _settings.EnemySpeedMultiplierEnabled = true; _settings.EnemyAttackSpeedMultiplier = 1f; _settings.EnemyAttackSpeedMultiplierEnabled = true; _settings.EnemyAggressionMultiplier = 1f; _settings.EnemyAggressionMultiplierEnabled = true; _settings.BossHealthMultiplier = 1f; _settings.BossHealthMultiplierEnabled = true; _settings.BossDamageTakenMultiplier = 1f; _settings.BossDamageTakenMultiplierEnabled = true; _settings.BossSpeedMultiplier = 1f; _settings.BossSpeedMultiplierEnabled = true; _settings.BossAttackSpeedMultiplier = 1f; _settings.BossAttackSpeedMultiplierEnabled = true; _settings.BossBrutalMode = false; _settings.BossBrutalModeEnabled = true; _settings.DisableHealingDuringBoss = false; _settings.DisableHealingDuringBossEnabled = true; _settings.HealingDuringBossMultiplier = 1f; _settings.HealingDuringBossMultiplierEnabled = true; _settings.MenuLanguage = "auto"; _settings.CoinMultiplier = 1f; _settings.CoinMultiplierEnabled = true; _settings.ShardMultiplier = 1f; _settings.ShardMultiplierEnabled = true; _settings.ShopPriceMultiplier = 1f; _settings.ShopPriceMultiplierEnabled = true; _settings.StationPriceMultiplier = 1f; _settings.StationPriceMultiplierEnabled = true; _settings.DeathRosaryLossPercentage = 100; _settings.DeathRosaryLossPercentageEnabled = true; _settings.HornetSpeedMultiplier = 1f; _settings.HornetSpeedMultiplierEnabled = true; _settings.DashRechargeLevel = 1; _settings.DashRechargeLevelEnabled = true; MutatorCatalog.ResetAll(_settings); Save(); if (flag) { _logger.LogInfo((object)("Vida maxima restaurada para o padrao: " + num)); RaiseChanged(ModSettingKind.MaximumHealth); } if (flag2) { _logger.LogInfo((object)("Dano da agulha restaurado para o padrao: " + num2)); RaiseChanged(ModSettingKind.NeedleDamage); } if (flag3) { _logger.LogInfo((object)"Aumento da agulha por melhoria restaurado: 0%"); RaiseChanged(ModSettingKind.NeedleUpgradePercentage); } if (flag4) { _logger.LogInfo((object)("Dano da Lanca de Seda restaurado: " + ValueValidator.FormatSilkSpearDamageMultiplier(3))); RaiseChanged(ModSettingKind.SilkSpearDamageMultiplier); } if (flag5) { _logger.LogInfo((object)("Custo de Seda da Lanca de Seda restaurado: " + 4)); RaiseChanged(ModSettingKind.SilkSpearSilkCost); } for (int l = 0; l < SilkSkillSettingCatalog.AllSettings.Length; l++) { ModSettingKind modSettingKind = SilkSkillSettingCatalog.AllSettings[l]; if (array2[l] && modSettingKind != ModSettingKind.SilkSpearDamageMultiplier && modSettingKind != ModSettingKind.SilkSpearSilkCost) { _logger.LogInfo((object)(SilkSkillSettingCatalog.GetLogName(modSettingKind) + " restaurado: " + SilkSkillSettingCatalog.Format(modSettingKind, SilkSkillSettingCatalog.GetDefault(modSettingKind)))); RaiseChanged(modSettingKind); } } if (flag6) { _logger.LogInfo((object)"Dano recebido restaurado: 1"); RaiseChanged(ModSettingKind.DamageTakenMultiplier); } if (flag7) { _logger.LogInfo((object)"Dano de cenario restaurado: 1"); RaiseChanged(ModSettingKind.EnvironmentalDamageMultiplier); } if (flag8) { _logger.LogInfo((object)"Modo One Hit restaurado: Desligado"); RaiseChanged(ModSettingKind.OneHitMode); } if (flag9) { _logger.LogInfo((object)("Quantidade de cura restaurada: " + 3)); RaiseChanged(ModSettingKind.HealingAmount); } if (flag10) { _logger.LogInfo((object)("Custo da cura restaurado: " + 9)); RaiseChanged(ModSettingKind.HealingCost); } if (flag11) { _logger.LogInfo((object)"Tempo de invencibilidade restaurado: 1,0x"); RaiseChanged(ModSettingKind.InvincibilityTimeMultiplier); } if (flag12) { _logger.LogInfo((object)"Vida dos inimigos restaurada: 1,0x"); RaiseChanged(ModSettingKind.EnemyHealthMultiplier); } if (flag13) { _logger.LogInfo((object)"Velocidade dos inimigos restaurada: 1,0x"); RaiseChanged(ModSettingKind.EnemySpeedMultiplier); } if (flag14) { _logger.LogInfo((object)"Recarga de ataque dos inimigos restaurada: 1,0x"); RaiseChanged(ModSettingKind.EnemyAttackSpeedMultiplier); } if (flag15) { _logger.LogInfo((object)"Agressividade dos inimigos restaurada: 1,0x"); RaiseChanged(ModSettingKind.EnemyAggressionMultiplier); } if (flag16) { _logger.LogInfo((object)"Vida dos Bosses restaurada: 1,0x"); RaiseChanged(ModSettingKind.BossHealthMultiplier); } if (flag17) { _logger.LogInfo((object)"Dano recebido dos Bosses restaurado: 1,0x"); RaiseChanged(ModSettingKind.BossDamageTakenMultiplier); } if (flag18) { _logger.LogInfo((object)"Velocidade dos Bosses restaurada: 1,0x"); RaiseChanged(ModSettingKind.BossSpeedMultiplier); } if (flag19) { _logger.LogInfo((object)"Recarga de ataque dos Bosses restaurada: 1,0x"); RaiseChanged(ModSettingKind.BossAttackSpeedMultiplier); } if (flag20) { _logger.LogInfo((object)"Boss Brutal restaurado: Desligado"); RaiseChanged(ModSettingKind.BossBrutalMode); } if (flag21) { _logger.LogInfo((object)"Sem cura durante Boss restaurado: Desligado"); RaiseChanged(ModSettingKind.DisableHealingDuringBoss); } if (flag22) { _logger.LogInfo((object)"Cura durante Boss restaurada: 1,0x"); RaiseChanged(ModSettingKind.HealingDuringBossMultiplier); } if (flag23) { _logger.LogInfo((object)"Multiplicador de Rosarios por moedas restaurado: 1,0x"); RaiseChanged(ModSettingKind.CoinMultiplier); } if (flag24) { _logger.LogInfo((object)"Multiplicador de Fragmentos restaurado: 1,0x"); RaiseChanged(ModSettingKind.ShardMultiplier); } if (flag25) { _logger.LogInfo((object)"Multiplicador de precos das lojas restaurado: 1,0x"); RaiseChanged(ModSettingKind.ShopPriceMultiplier); } if (flag26) { _logger.LogInfo((object)"Multiplicador de precos das estacoes restaurado: 1,0x"); RaiseChanged(ModSettingKind.StationPriceMultiplier); } if (flag27) { _logger.LogInfo((object)"Perda de Rosarios na morte restaurada: 100%"); RaiseChanged(ModSettingKind.DeathRosaryLossPercentage); } if (flag28) { _logger.LogInfo((object)"Velocidade da Hornet restaurada: 1,0x"); RaiseChanged(ModSettingKind.HornetSpeedMultiplier); } if (flag29) { _logger.LogInfo((object)"Recarga do dash restaurada: nivel 1"); RaiseChanged(ModSettingKind.DashRechargeLevel); } for (int m = 0; m < MutatorCatalog.All.Length; m++) { if (array[m]) { RaiseChanged(MutatorCatalog.All[m].Setting); } } } private bool ValidateLoadedSettings() { float[] array = new float[SilkSkillSettingCatalog.AllSettings.Length]; bool[] array2 = new bool[SilkSkillSettingCatalog.AllSettings.Length]; for (int i = 0; i < SilkSkillSettingCatalog.AllSettings.Length; i++) { ModSettingKind setting = SilkSkillSettingCatalog.AllSettings[i]; array[i] = SilkSkillSettingCatalog.GetValue(_settings, setting); array2[i] = SilkSkillSettingCatalog.GetEnabled(_settings, setting); } int settingsSchemaVersion = _settings.SettingsSchemaVersion; int maximumHealth = _settings.MaximumHealth; int defaultMaximumHealth = _settings.DefaultMaximumHealth; bool maximumHealthEnabled = _settings.MaximumHealthEnabled; int needleDamage = _settings.NeedleDamage; int defaultNeedleDamage = _settings.DefaultNeedleDamage; bool needleDamageEnabled = _settings.NeedleDamageEnabled; int needleUpgradePercentage = _settings.NeedleUpgradePercentage; bool needleUpgradePercentageEnabled = _settings.NeedleUpgradePercentageEnabled; int silkSpearDamageMultiplier = _settings.SilkSpearDamageMultiplier; bool silkSpearDamageMultiplierEnabled = _settings.SilkSpearDamageMultiplierEnabled; int silkSpearSilkCost = _settings.SilkSpearSilkCost; bool silkSpearSilkCostEnabled = _settings.SilkSpearSilkCostEnabled; float damageTakenMultiplier = _settings.DamageTakenMultiplier; bool damageTakenMultiplierEnabled = _settings.DamageTakenMultiplierEnabled; float environmentalDamageMultiplier = _settings.EnvironmentalDamageMultiplier; bool environmentalDamageMultiplierEnabled = _settings.EnvironmentalDamageMultiplierEnabled; bool oneHitMode = _settings.OneHitMode; bool oneHitModeEnabled = _settings.OneHitModeEnabled; int healingAmount = _settings.HealingAmount; bool healingAmountEnabled = _settings.HealingAmountEnabled; int healingCost = _settings.HealingCost; bool healingCostEnabled = _settings.HealingCostEnabled; float invincibilityTimeMultiplier = _settings.InvincibilityTimeMultiplier; bool invincibilityTimeMultiplierEnabled = _settings.InvincibilityTimeMultiplierEnabled; float enemyHealthMultiplier = _settings.EnemyHealthMultiplier; bool enemyHealthMultiplierEnabled = _settings.EnemyHealthMultiplierEnabled; float enemySpeedMultiplier = _settings.EnemySpeedMultiplier; bool enemySpeedMultiplierEnabled = _settings.EnemySpeedMultiplierEnabled; float enemyAttackSpeedMultiplier = _settings.EnemyAttackSpeedMultiplier; bool enemyAttackSpeedMultiplierEnabled = _settings.EnemyAttackSpeedMultiplierEnabled; float enemyAggressionMultiplier = _settings.EnemyAggressionMultiplier; bool enemyAggressionMultiplierEnabled = _settings.EnemyAggressionMultiplierEnabled; float bossHealthMultiplier = _settings.BossHealthMultiplier; bool bossHealthMultiplierEnabled = _settings.BossHealthMultiplierEnabled; float bossDamageTakenMultiplier = _settings.BossDamageTakenMultiplier; bool bossDamageTakenMultiplierEnabled = _settings.BossDamageTakenMultiplierEnabled; float bossSpeedMultiplier = _settings.BossSpeedMultiplier; bool bossSpeedMultiplierEnabled = _settings.BossSpeedMultiplierEnabled; float bossAttackSpeedMultiplier = _settings.BossAttackSpeedMultiplier; bool bossAttackSpeedMultiplierEnabled = _settings.BossAttackSpeedMultiplierEnabled; bool bossBrutalMode = _settings.BossBrutalMode; bool bossBrutalModeEnabled = _settings.BossBrutalModeEnabled; bool disableHealingDuringBoss = _settings.DisableHealingDuringBoss; bool disableHealingDuringBossEnabled = _settings.DisableHealingDuringBossEnabled; float healingDuringBossMultiplier = _settings.HealingDuringBossMultiplier; bool healingDuringBossMultiplierEnabled = _settings.HealingDuringBossMultiplierEnabled; float coinMultiplier = _settings.CoinMultiplier; bool coinMultiplierEnabled = _settings.CoinMultiplierEnabled; float shardMultiplier = _settings.ShardMultiplier; bool shardMultiplierEnabled = _settings.ShardMultiplierEnabled; float shopPriceMultiplier = _settings.ShopPriceMultiplier; bool shopPriceMultiplierEnabled = _settings.ShopPriceMultiplierEnabled; float stationPriceMultiplier = _settings.StationPriceMultiplier; bool stationPriceMultiplierEnabled = _settings.StationPriceMultiplierEnabled; int deathRosaryLossPercentage = _settings.DeathRosaryLossPercentage; bool deathRosaryLossPercentageEnabled = _settings.DeathRosaryLossPercentageEnabled; float hornetSpeedMultiplier = _settings.HornetSpeedMultiplier; bool hornetSpeedMultiplierEnabled = _settings.HornetSpeedMultiplierEnabled; int dashRechargeLevel = _settings.DashRechargeLevel; bool dashRechargeLevelEnabled = _settings.DashRechargeLevelEnabled; string menuLanguage = _settings.MenuLanguage; if (_settings.MaximumHealth != 0) { _settings.MaximumHealth = ValueValidator.ClampHealth(_settings.MaximumHealth); } if (_settings.DefaultMaximumHealth != 0) { _settings.DefaultMaximumHealth = ValueValidator.ClampHealth(_settings.DefaultMaximumHealth); } if (_settings.NeedleDamage != 0) { _settings.NeedleDamage = ValueValidator.ClampNeedleDamage(_settings.NeedleDamage); } if (_settings.DefaultNeedleDamage != 0) { _settings.DefaultNeedleDamage = ValueValidator.ClampNeedleDamage(_settings.DefaultNeedleDamage); } if (_settings.SettingsSchemaVersion < 2) { _settings.SettingsSchemaVersion = 2; _settings.DamageTakenMultiplier = 1f; _settings.EnvironmentalDamageMultiplier = 1f; } if (_settings.SettingsSchemaVersion < 3) { _settings.SettingsSchemaVersion = 3; _settings.OneHitMode = false; } if (_settings.SettingsSchemaVersion < 4) { _settings.SettingsSchemaVersion = 4; _settings.NeedleUpgradePercentage = 0; } if (_settings.SettingsSchemaVersion < 5) { _settings.SettingsSchemaVersion = 5; _settings.MaximumHealthEnabled = true; _settings.NeedleDamageEnabled = true; _settings.NeedleUpgradePercentageEnabled = true; _settings.DamageTakenMultiplierEnabled = true; _settings.EnvironmentalDamageMultiplierEnabled = true; _settings.OneHitModeEnabled = true; _settings.CoinMultiplierEnabled = true; _settings.ShardMultiplierEnabled = true; _settings.ShopPriceMultiplierEnabled = true; _settings.StationPriceMultiplierEnabled = true; } if (_settings.SettingsSchemaVersion < 6) { _settings.SettingsSchemaVersion = 6; _settings.InvincibilityTimeMultiplier = 1f; _settings.InvincibilityTimeMultiplierEnabled = true; } if (_settings.SettingsSchemaVersion < 7) { _settings.SettingsSchemaVersion = 7; if (_settings.HealingAmount <= 0) { _settings.HealingAmount = 3; } if (_settings.HealingCost <= 0) { _settings.HealingCost = 9; } } if (_settings.SettingsSchemaVersion < 9) { _settings.SettingsSchemaVersion = 9; _settings.SilkSpearDamageMultiplier = 3; _settings.SilkSpearDamageMultiplierEnabled = true; _settings.SilkSpearSilkCost = 4; _settings.SilkSpearSilkCostEnabled = true; } if (_settings.SettingsSchemaVersion < 10) { _settings.SettingsSchemaVersion = 10; for (int j = 0; j < SilkSkillSettingCatalog.AllSettings.Length; j++) { ModSettingKind modSettingKind = SilkSkillSettingCatalog.AllSettings[j]; if (modSettingKind != ModSettingKind.SilkSpearDamageMultiplier && modSettingKind != ModSettingKind.SilkSpearSilkCost) { SilkSkillSettingCatalog.SetValue(_settings, modSettingKind, SilkSkillSettingCatalog.GetDefault(modSettingKind)); SilkSkillSettingCatalog.SetEnabled(_settings, modSettingKind, enabled: true); } } } if (_settings.SettingsSchemaVersion < 11) { _settings.SettingsSchemaVersion = 11; _settings.EnemyHealthMultiplier = 1f; _settings.EnemyHealthMultiplierEnabled = true; _settings.EnemySpeedMultiplier = 1f; _settings.EnemySpeedMultiplierEnabled = true; } if (_settings.SettingsSchemaVersion < 12) { _settings.SettingsSchemaVersion = 12; _settings.DeathRosaryLossPercentage = 100; _settings.DeathRosaryLossPercentageEnabled = true; } if (_settings.SettingsSchemaVersion < 13) { _settings.SettingsSchemaVersion = 13; _settings.HornetSpeedMultiplier = 1f; _settings.HornetSpeedMultiplierEnabled = true; _settings.DashRechargeLevel = 1; _settings.DashRechargeLevelEnabled = true; } if (_settings.SettingsSchemaVersion < 14) { _settings.SettingsSchemaVersion = 14; MutatorCatalog.ResetAll(_settings); } if (_settings.SettingsSchemaVersion < 15) { _settings.SettingsSchemaVersion = 15; _settings.BossHealthMultiplier = 1f; _settings.BossHealthMultiplierEnabled = true; _settings.BossDamageTakenMultiplier = 1f; _settings.BossDamageTakenMultiplierEnabled = true; _settings.BossSpeedMultiplier = 1f; _settings.BossSpeedMultiplierEnabled = true; _settings.BossAttackSpeedMultiplier = 1f; _settings.BossAttackSpeedMultiplierEnabled = true; _settings.BossBrutalMode = false; _settings.BossBrutalModeEnabled = true; _settings.DisableHealingDuringBoss = false; _settings.DisableHealingDuringBossEnabled = true; _settings.HealingDuringBossMultiplier = 1f; _settings.HealingDuringBossMultiplierEnabled = true; _settings.FavoriteSettings = new string[0]; } if (_settings.SettingsSchemaVersion < 16) { _settings.SettingsSchemaVersion = 16; _settings.EnemyAttackSpeedMultiplier = 1f; _settings.EnemyAttackSpeedMultiplierEnabled = true; _settings.EnemyAggressionMultiplier = 1f; _settings.EnemyAggressionMultiplierEnabled = true; } if (_settings.SettingsSchemaVersion < 17) { _settings.SettingsSchemaVersion = 17; _settings.MenuLanguage = "auto"; } _settings.NeedleUpgradePercentage = ValueValidator.ClampNeedleUpgradePercentage(_settings.NeedleUpgradePercentage); _settings.SilkSpearDamageMultiplier = ValueValidator.ClampSilkSpearDamageMultiplier(_settings.SilkSpearDamageMultiplier); _settings.SilkSpearSilkCost = ValueValidator.ClampSilkSpearSilkCost(_settings.SilkSpearSilkCost); for (int k = 0; k < SilkSkillSettingCatalog.AllSettings.Length; k++) { ModSettingKind setting2 = SilkSkillSettingCatalog.AllSettings[k]; SilkSkillSettingCatalog.SetValue(_settings, setting2, SilkSkillSettingCatalog.GetValue(_settings, setting2)); } _settings.DamageTakenMultiplier = ValueValidator.NormalizeDamageMultiplier(_settings.DamageTakenMultiplier); _settings.EnvironmentalDamageMultiplier = ValueValidator.NormalizeDamageMultiplier(_settings.EnvironmentalDamageMultiplier); _settings.HealingAmount = ValueValidator.ClampHealingAmount(_settings.HealingAmount); _settings.HealingCost = ValueValidator.ClampHealingCost(_settings.HealingCost); _settings.InvincibilityTimeMultiplier = ValueValidator.NormalizeMultiplier(_settings.InvincibilityTimeMultiplier); _settings.EnemyHealthMultiplier = ValueValidator.NormalizeMultiplier(_settings.EnemyHealthMultiplier); _settings.EnemySpeedMultiplier = ValueValidator.NormalizeEnemySpeedMultiplier(_settings.EnemySpeedMultiplier); _settings.EnemyAttackSpeedMultiplier = ValueValidator.NormalizeMultiplier(_settings.EnemyAttackSpeedMultiplier); _settings.EnemyAggressionMultiplier = ValueValidator.NormalizeMultiplier(_settings.EnemyAggressionMultiplier); _settings.BossHealthMultiplier = ValueValidator.NormalizeMultiplier(_settings.BossHealthMultiplier); _settings.BossDamageTakenMultiplier = ValueValidator.NormalizeMultiplier(_settings.BossDamageTakenMultiplier); _settings.BossSpeedMultiplier = ValueValidator.NormalizeEnemySpeedMultiplier(_settings.BossSpeedMultiplier); _settings.BossAttackSpeedMultiplier = ValueValidator.NormalizeBossAttackSpeedMultiplier(_settings.BossAttackSpeedMultiplier); _settings.HealingDuringBossMultiplier = ValueValidator.NormalizeMultiplier(_settings.HealingDuringBossMultiplier); _settings.MenuLanguage = LocalizationManager.NormalizeCode(_settings.MenuLanguage); bool flag = NormalizeFavorites(); _settings.CoinMultiplier = ValueValidator.NormalizeMultiplier(_settings.CoinMultiplier); _settings.ShardMultiplier = ValueValidator.NormalizeMultiplier(_settings.ShardMultiplier); _settings.ShopPriceMultiplier = ((shopPriceMultiplier <= 0f) ? 1f : ValueValidator.NormalizePriceMultiplier(shopPriceMultiplier)); _settings.StationPriceMultiplier = ((stationPriceMultiplier <= 0f) ? 1f : ValueValidator.NormalizePriceMultiplier(stationPriceMultiplier)); _settings.DeathRosaryLossPercentage = ValueValidator.ClampDeathRosaryLossPercentage(_settings.DeathRosaryLossPercentage); _settings.HornetSpeedMultiplier = ValueValidator.NormalizeHornetSpeedMultiplier(_settings.HornetSpeedMultiplier); _settings.DashRechargeLevel = ValueValidator.ClampDashRechargeLevel(_settings.DashRechargeLevel); bool flag2 = false; for (int l = 0; l < SilkSkillSettingCatalog.AllSettings.Length; l++) { ModSettingKind setting3 = SilkSkillSettingCatalog.AllSettings[l]; if (Math.Abs(array[l] - SilkSkillSettingCatalog.GetValue(_settings, setting3)) >= 0.0001f || array2[l] != SilkSkillSettingCatalog.GetEnabled(_settings, setting3)) { flag2 = true; break; } } if (settingsSchemaVersion == _settings.SettingsSchemaVersion && !flag2 && maximumHealth == _settings.MaximumHealth && defaultMaximumHealth == _settings.DefaultMaximumHealth && maximumHealthEnabled == _settings.MaximumHealthEnabled && needleDamage == _settings.NeedleDamage && defaultNeedleDamage == _settings.DefaultNeedleDamage && needleDamageEnabled == _settings.NeedleDamageEnabled && needleUpgradePercentage == _settings.NeedleUpgradePercentage && needleUpgradePercentageEnabled == _settings.NeedleUpgradePercentageEnabled && silkSpearDamageMultiplier == _settings.SilkSpearDamageMultiplier && silkSpearDamageMultiplierEnabled == _settings.SilkSpearDamageMultiplierEnabled && silkSpearSilkCost == _settings.SilkSpearSilkCost && silkSpearSilkCostEnabled == _settings.SilkSpearSilkCostEnabled && !(Math.Abs(damageTakenMultiplier - _settings.DamageTakenMultiplier) >= 0.001f) && damageTakenMultiplierEnabled == _settings.DamageTakenMultiplierEnabled && !(Math.Abs(environmentalDamageMultiplier - _settings.EnvironmentalDamageMultiplier) >= 0.001f) && environmentalDamageMultiplierEnabled == _settings.EnvironmentalDamageMultiplierEnabled && oneHitMode == _settings.OneHitMode && oneHitModeEnabled == _settings.OneHitModeEnabled && healingAmount == _settings.HealingAmount && healingAmountEnabled == _settings.HealingAmountEnabled && healingCost == _settings.HealingCost && healingCostEnabled == _settings.HealingCostEnabled && !(Math.Abs(invincibilityTimeMultiplier - _settings.InvincibilityTimeMultiplier) >= 0.001f) && invincibilityTimeMultiplierEnabled == _settings.InvincibilityTimeMultiplierEnabled && !(Math.Abs(enemyHealthMultiplier - _settings.EnemyHealthMultiplier) >= 0.001f) && enemyHealthMultiplierEnabled == _settings.EnemyHealthMultiplierEnabled && !(Math.Abs(enemySpeedMultiplier - _settings.EnemySpeedMultiplier) >= 0.001f) && enemySpeedMultiplierEnabled == _settings.EnemySpeedMultiplierEnabled && !(Math.Abs(enemyAttackSpeedMultiplier - _settings.EnemyAttackSpeedMultiplier) >= 0.001f) && enemyAttackSpeedMultiplierEnabled == _settings.EnemyAttackSpeedMultiplierEnabled && !(Math.Abs(enemyAggressionMultiplier - _settings.EnemyAggressionMultiplier) >= 0.001f) && enemyAggressionMultiplierEnabled == _settings.EnemyAggressionMultiplierEnabled && !(Math.Abs(bossHealthMultiplier - _settings.BossHealthMultiplier) >= 0.001f) && bossHealthMultiplierEnabled == _settings.BossHealthMultiplierEnabled && !(Math.Abs(bossDamageTakenMultiplier - _settings.BossDamageTakenMultiplier) >= 0.001f) && bossDamageTakenMultiplierEnabled == _settings.BossDamageTakenMultiplierEnabled && !(Math.Abs(bossSpeedMultiplier - _settings.BossSpeedMultiplier) >= 0.001f) && bossSpeedMultiplierEnabled == _settings.BossSpeedMultiplierEnabled && !(Math.Abs(bossAttackSpeedMultiplier - _settings.BossAttackSpeedMultiplier) >= 0.001f) && bossAttackSpeedMultiplierEnabled == _settings.BossAttackSpeedMultiplierEnabled && bossBrutalMode == _settings.BossBrutalMode && bossBrutalModeEnabled == _settings.BossBrutalModeEnabled && disableHealingDuringBoss == _settings.DisableHealingDuringBoss && disableHealingDuringBossEnabled == _settings.DisableHealingDuringBossEnabled && !(Math.Abs(healingDuringBossMultiplier - _settings.HealingDuringBossMultiplier) >= 0.001f) && healingDuringBossMultiplierEnabled == _settings.HealingDuringBossMultiplierEnabled && !flag && !(Math.Abs(coinMultiplier - _settings.CoinMultiplier) >= 0.001f) && coinMultiplierEnabled == _settings.CoinMultiplierEnabled && !(Math.Abs(shardMultiplier - _settings.ShardMultiplier) >= 0.001f) && shardMultiplierEnabled == _settings.ShardMultiplierEnabled && !(Math.Abs(shopPriceMultiplier - _settings.ShopPriceMultiplier) >= 0.001f) && shopPriceMultiplierEnabled == _settings.ShopPriceMultiplierEnabled && !(Math.Abs(stationPriceMultiplier - _settings.StationPriceMultiplier) >= 0.001f) && stationPriceMultiplierEnabled == _settings.StationPriceMultiplierEnabled && deathRosaryLossPercentage == _settings.DeathRosaryLossPercentage && deathRosaryLossPercentageEnabled == _settings.DeathRosaryLossPercentageEnabled && !(Math.Abs(hornetSpeedMultiplier - _settings.HornetSpeedMultiplier) >= 0.001f) && hornetSpeedMultiplierEnabled == _settings.HornetSpeedMultiplierEnabled && dashRechargeLevel == _settings.DashRechargeLevel && dashRechargeLevelEnabled == _settings.DashRechargeLevelEnabled) { return !string.Equals(menuLanguage, _settings.MenuLanguage, StringComparison.Ordinal); } return true; } private bool NormalizeFavorites() { string[] favoriteSettings = _settings.FavoriteSettings; List list = new List(); if (favoriteSettings != null) { for (int i = 0; i < favoriteSettings.Length; i++) { if (Enum.TryParse(favoriteSettings[i], out var result)) { string item = result.ToString(); if (!list.Contains(item)) { list.Add(item); } } } } bool flag = favoriteSettings == null || favoriteSettings.Length != list.Count; if (!flag) { for (int j = 0; j < list.Count; j++) { if (!string.Equals(favoriteSettings[j], list[j], StringComparison.Ordinal)) { flag = true; break; } } } _settings.FavoriteSettings = list.ToArray(); return flag; } private static void MigrateLegacyRecoverySettings(string json, ModSettings loaded) { LegacyRecoverySettings legacyRecoverySettings = JsonUtility.FromJson(json); if (legacyRecoverySettings == null || legacyRecoverySettings.SettingsSchemaVersion < 6) { loaded.HealingAmount = 3; loaded.HealingAmountEnabled = true; loaded.HealingCost = 9; loaded.HealingCostEnabled = true; } else { float num = ValueValidator.NormalizeMultiplier(legacyRecoverySettings.HealingMultiplier); float num2 = ValueValidator.NormalizeMultiplier(legacyRecoverySettings.HealingCostMultiplier); loaded.HealingAmount = ValueValidator.ClampHealingAmount((int)Math.Round(3f * num, MidpointRounding.AwayFromZero)); loaded.HealingAmountEnabled = legacyRecoverySettings.HealingMultiplierEnabled; loaded.HealingCost = ValueValidator.ClampHealingCost((int)Math.Round(9f * num2, MidpointRounding.AwayFromZero)); loaded.HealingCostEnabled = legacyRecoverySettings.HealingCostMultiplierEnabled; } } private void Save() { try { string directoryName = Path.GetDirectoryName(_settingsPath); if (!Directory.Exists(directoryName)) { Directory.CreateDirectory(directoryName); } File.WriteAllText(_settingsPath, JsonUtility.ToJson((object)_settings, true)); } catch (Exception ex) { _logger.LogError((object)("Falha ao salvar as configuracoes: " + ex.Message)); } } private void RaiseChanged(ModSettingKind setting) { this.Changed?.Invoke(setting); } private void RaiseAllChanged() { ModSettingKind[] array = (ModSettingKind[])Enum.GetValues(typeof(ModSettingKind)); for (int i = 0; i < array.Length; i++) { RaiseChanged(array[i]); } } private static string GetSettingLogName(ModSettingKind setting) { return setting switch { ModSettingKind.MaximumHealth => "Vida maxima", ModSettingKind.NeedleDamage => "Dano da agulha", ModSettingKind.NeedleUpgradePercentage => "Aumento por melhoria", ModSettingKind.SilkSpearDamageMultiplier => "Dano da Lanca de Seda", ModSettingKind.SilkSpearSilkCost => "Custo de Seda da Lanca de Seda", ModSettingKind.DamageTakenMultiplier => "Dano recebido", ModSettingKind.EnvironmentalDamageMultiplier => "Dano de cenario", ModSettingKind.OneHitMode => "Modo One Hit", ModSettingKind.HealingAmount => "Quantidade de cura", ModSettingKind.HealingCost => "Custo da cura", ModSettingKind.InvincibilityTimeMultiplier => "Tempo de invencibilidade", ModSettingKind.EnemyHealthMultiplier => "Vida dos inimigos", ModSettingKind.EnemySpeedMultiplier => "Velocidade dos inimigos", ModSettingKind.EnemyAttackSpeedMultiplier => "Recarga de ataque dos inimigos", ModSettingKind.EnemyAggressionMultiplier => "Agressividade dos inimigos", ModSettingKind.BossHealthMultiplier => "Vida dos Bosses", ModSettingKind.BossDamageTakenMultiplier => "Dano recebido de Boss", ModSettingKind.BossSpeedMultiplier => "Velocidade dos Bosses", ModSettingKind.BossAttackSpeedMultiplier => "Velocidade de ataque dos Bosses", ModSettingKind.BossBrutalMode => "Modo Boss Brutal", ModSettingKind.DisableHealingDuringBoss => "Sem cura em Boss", ModSettingKind.HealingDuringBossMultiplier => "Cura durante Boss", ModSettingKind.CoinMultiplier => "Rosarios por moedas", ModSettingKind.ShardMultiplier => "Rosarios por fragmentos", ModSettingKind.ShopPriceMultiplier => "Precos das lojas", ModSettingKind.StationPriceMultiplier => "Precos dos bancos e estacoes", ModSettingKind.DeathRosaryLossPercentage => "Perda de Rosarios na morte", ModSettingKind.HornetSpeedMultiplier => "Velocidade da Hornet", ModSettingKind.DashRechargeLevel => "Recarga do dash", _ => setting.ToString(), }; } } internal static class SilkSkillSettingCatalog { private const string ControlPrefix = "CustomDifficultySilkSkill"; public static readonly ModSettingKind[] AllSettings = new ModSettingKind[13] { ModSettingKind.SilkSpearSilkCost, ModSettingKind.SilkSpearDamageMultiplier, ModSettingKind.ThreadStormSilkCost, ModSettingKind.ThreadStormNormalHitMultiplier, ModSettingKind.ThreadStormLateHitMultiplier, ModSettingKind.CrossStitchSilkCost, ModSettingKind.CrossStitchHitMultiplier, ModSettingKind.SharpdartSilkCost, ModSettingKind.SharpdartMainHitMultiplier, ModSettingKind.RuneRageSilkCost, ModSettingKind.RuneRageBaseDamageMultiplier, ModSettingKind.PaleNailsSilkCost, ModSettingKind.PaleNailsProjectileMultiplier }; public static bool IsSilkSkillSetting(ModSettingKind setting) { switch (setting) { case ModSettingKind.SilkSpearDamageMultiplier: case ModSettingKind.SilkSpearSilkCost: case ModSettingKind.ThreadStormSilkCost: case ModSettingKind.ThreadStormNormalHitMultiplier: case ModSettingKind.ThreadStormLateHitMultiplier: case ModSettingKind.CrossStitchSilkCost: case ModSettingKind.CrossStitchHitMultiplier: case ModSettingKind.SharpdartSilkCost: case ModSettingKind.SharpdartMainHitMultiplier: case ModSettingKind.RuneRageSilkCost: case ModSettingKind.RuneRageBaseDamageMultiplier: case ModSettingKind.PaleNailsSilkCost: case ModSettingKind.PaleNailsProjectileMultiplier: return true; default: return false; } } public static bool IsCost(ModSettingKind setting) { if (setting != ModSettingKind.SilkSpearSilkCost && setting != ModSettingKind.ThreadStormSilkCost && setting != ModSettingKind.CrossStitchSilkCost && setting != ModSettingKind.SharpdartSilkCost && setting != ModSettingKind.RuneRageSilkCost) { return setting == ModSettingKind.PaleNailsSilkCost; } return true; } public static bool IsWholeNumberMultiplier(ModSettingKind setting) { return setting == ModSettingKind.SilkSpearDamageMultiplier; } public static float GetStep(ModSettingKind setting) { if (!IsCost(setting) && !IsWholeNumberMultiplier(setting)) { return 0.05f; } return 1f; } public static float GetMinimum(ModSettingKind setting) { if (IsCost(setting)) { return 1f; } if (!IsWholeNumberMultiplier(setting)) { return 0.05f; } return 1f; } public static float GetMaximum(ModSettingKind setting) { if (IsCost(setting)) { return 18f; } if (!IsWholeNumberMultiplier(setting)) { return 20f; } return 20f; } public static float GetDefault(ModSettingKind setting) { return setting switch { ModSettingKind.SilkSpearDamageMultiplier => 3f, ModSettingKind.ThreadStormNormalHitMultiplier => 0.7f, ModSettingKind.ThreadStormLateHitMultiplier => 0.25f, ModSettingKind.CrossStitchHitMultiplier => 0.75f, ModSettingKind.SharpdartMainHitMultiplier => 2.75f, ModSettingKind.RuneRageBaseDamageMultiplier => 2.1f, ModSettingKind.PaleNailsProjectileMultiplier => 1f, _ => 4f, }; } public static float Normalize(ModSettingKind setting, float value) { if (IsCost(setting)) { return ValueValidator.ClampSilkSkillCost((int)Math.Round(value, MidpointRounding.AwayFromZero)); } if (IsWholeNumberMultiplier(setting)) { return ValueValidator.ClampSilkSpearDamageMultiplier((int)Math.Round(value, MidpointRounding.AwayFromZero)); } return ValueValidator.NormalizeSilkSkillMultiplier(value, GetDefault(setting)); } public static float Parse(ModSettingKind setting, string text) { if (IsCost(setting)) { return ValueValidator.ParseSilkSkillCostOrClamp(text); } if (IsWholeNumberMultiplier(setting)) { return ValueValidator.ParseSilkSpearDamageMultiplierOrClamp(text); } return ValueValidator.ParseSilkSkillMultiplierOrClamp(text, GetDefault(setting)); } public static string Format(ModSettingKind setting, float value) { if (IsCost(setting)) { return ValueValidator.FormatSilkSkillCost((int)Normalize(setting, value)); } if (IsWholeNumberMultiplier(setting)) { return ValueValidator.FormatSilkSpearDamageMultiplier((int)Normalize(setting, value)); } return ValueValidator.FormatSilkSkillMultiplier(Normalize(setting, value)); } public static string GetRangeText(ModSettingKind setting) { if (IsCost(setting)) { return "1 - 18"; } if (!IsWholeNumberMultiplier(setting)) { return "0,05x - 20,00x"; } return "1x - 20x"; } public static string GetControlName(ModSettingKind setting) { return "CustomDifficultySilkSkill" + setting; } public static bool TryGetSettingForControl(string controlName, out ModSettingKind setting) { setting = ModSettingKind.MaximumHealth; if (string.IsNullOrEmpty(controlName) || !controlName.StartsWith("CustomDifficultySilkSkill", StringComparison.Ordinal)) { return false; } if (!Enum.TryParse(controlName.Substring("CustomDifficultySilkSkill".Length), out var result) || !IsSilkSkillSetting(result)) { return false; } setting = result; return true; } public static float GetValue(ModSettings settings, ModSettingKind setting) { return setting switch { ModSettingKind.SilkSpearDamageMultiplier => settings.SilkSpearDamageMultiplier, ModSettingKind.SilkSpearSilkCost => settings.SilkSpearSilkCost, ModSettingKind.ThreadStormSilkCost => settings.ThreadStormSilkCost, ModSettingKind.ThreadStormNormalHitMultiplier => settings.ThreadStormNormalHitMultiplier, ModSettingKind.ThreadStormLateHitMultiplier => settings.ThreadStormLateHitMultiplier, ModSettingKind.CrossStitchSilkCost => settings.CrossStitchSilkCost, ModSettingKind.CrossStitchHitMultiplier => settings.CrossStitchHitMultiplier, ModSettingKind.SharpdartSilkCost => settings.SharpdartSilkCost, ModSettingKind.SharpdartMainHitMultiplier => settings.SharpdartMainHitMultiplier, ModSettingKind.RuneRageSilkCost => settings.RuneRageSilkCost, ModSettingKind.RuneRageBaseDamageMultiplier => settings.RuneRageBaseDamageMultiplier, ModSettingKind.PaleNailsSilkCost => settings.PaleNailsSilkCost, ModSettingKind.PaleNailsProjectileMultiplier => settings.PaleNailsProjectileMultiplier, _ => throw new ArgumentOutOfRangeException("setting"), }; } public static void SetValue(ModSettings settings, ModSettingKind setting, float value) { float num = Normalize(setting, value); switch (setting) { case ModSettingKind.SilkSpearDamageMultiplier: settings.SilkSpearDamageMultiplier = (int)num; break; case ModSettingKind.SilkSpearSilkCost: settings.SilkSpearSilkCost = (int)num; break; case ModSettingKind.ThreadStormSilkCost: settings.ThreadStormSilkCost = (int)num; break; case ModSettingKind.ThreadStormNormalHitMultiplier: settings.ThreadStormNormalHitMultiplier = num; break; case ModSettingKind.ThreadStormLateHitMultiplier: settings.ThreadStormLateHitMultiplier = num; break; case ModSettingKind.CrossStitchSilkCost: settings.CrossStitchSilkCost = (int)num; break; case ModSettingKind.CrossStitchHitMultiplier: settings.CrossStitchHitMultiplier = num; break; case ModSettingKind.SharpdartSilkCost: settings.SharpdartSilkCost = (int)num; break; case ModSettingKind.SharpdartMainHitMultiplier: settings.SharpdartMainHitMultiplier = num; break; case ModSettingKind.RuneRageSilkCost: settings.RuneRageSilkCost = (int)num; break; case ModSettingKind.RuneRageBaseDamageMultiplier: settings.RuneRageBaseDamageMultiplier = num; break; case ModSettingKind.PaleNailsSilkCost: settings.PaleNailsSilkCost = (int)num; break; case ModSettingKind.PaleNailsProjectileMultiplier: settings.PaleNailsProjectileMultiplier = num; break; default: throw new ArgumentOutOfRangeException("setting"); } } public static bool GetEnabled(ModSettings settings, ModSettingKind setting) { return setting switch { ModSettingKind.SilkSpearDamageMultiplier => settings.SilkSpearDamageMultiplierEnabled, ModSettingKind.SilkSpearSilkCost => settings.SilkSpearSilkCostEnabled, ModSettingKind.ThreadStormSilkCost => settings.ThreadStormSilkCostEnabled, ModSettingKind.ThreadStormNormalHitMultiplier => settings.ThreadStormNormalHitMultiplierEnabled, ModSettingKind.ThreadStormLateHitMultiplier => settings.ThreadStormLateHitMultiplierEnabled, ModSettingKind.CrossStitchSilkCost => settings.CrossStitchSilkCostEnabled, ModSettingKind.CrossStitchHitMultiplier => settings.CrossStitchHitMultiplierEnabled, ModSettingKind.SharpdartSilkCost => settings.SharpdartSilkCostEnabled, ModSettingKind.SharpdartMainHitMultiplier => settings.SharpdartMainHitMultiplierEnabled, ModSettingKind.RuneRageSilkCost => settings.RuneRageSilkCostEnabled, ModSettingKind.RuneRageBaseDamageMultiplier => settings.RuneRageBaseDamageMultiplierEnabled, ModSettingKind.PaleNailsSilkCost => settings.PaleNailsSilkCostEnabled, ModSettingKind.PaleNailsProjectileMultiplier => settings.PaleNailsProjectileMultiplierEnabled, _ => throw new ArgumentOutOfRangeException("setting"), }; } public static void SetEnabled(ModSettings settings, ModSettingKind setting, bool enabled) { switch (setting) { case ModSettingKind.SilkSpearDamageMultiplier: settings.SilkSpearDamageMultiplierEnabled = enabled; break; case ModSettingKind.SilkSpearSilkCost: settings.SilkSpearSilkCostEnabled = enabled; break; case ModSettingKind.ThreadStormSilkCost: settings.ThreadStormSilkCostEnabled = enabled; break; case ModSettingKind.ThreadStormNormalHitMultiplier: settings.ThreadStormNormalHitMultiplierEnabled = enabled; break; case ModSettingKind.ThreadStormLateHitMultiplier: settings.ThreadStormLateHitMultiplierEnabled = enabled; break; case ModSettingKind.CrossStitchSilkCost: settings.CrossStitchSilkCostEnabled = enabled; break; case ModSettingKind.CrossStitchHitMultiplier: settings.CrossStitchHitMultiplierEnabled = enabled; break; case ModSettingKind.SharpdartSilkCost: settings.SharpdartSilkCostEnabled = enabled; break; case ModSettingKind.SharpdartMainHitMultiplier: settings.SharpdartMainHitMultiplierEnabled = enabled; break; case ModSettingKind.RuneRageSilkCost: settings.RuneRageSilkCostEnabled = enabled; break; case ModSettingKind.RuneRageBaseDamageMultiplier: settings.RuneRageBaseDamageMultiplierEnabled = enabled; break; case ModSettingKind.PaleNailsSilkCost: settings.PaleNailsSilkCostEnabled = enabled; break; case ModSettingKind.PaleNailsProjectileMultiplier: settings.PaleNailsProjectileMultiplierEnabled = enabled; break; default: throw new ArgumentOutOfRangeException("setting"); } } public static string GetLogName(ModSettingKind setting) { return setting switch { ModSettingKind.SilkSpearDamageMultiplier => "multiplicador da Lanca de Seda", ModSettingKind.SilkSpearSilkCost => "custo da Lanca de Seda", ModSettingKind.ThreadStormSilkCost => "custo do Turbilhao de Fios", ModSettingKind.ThreadStormNormalHitMultiplier => "dano inicial do Turbilhao de Fios", ModSettingKind.ThreadStormLateHitMultiplier => "dano tardio do Turbilhao de Fios", ModSettingKind.CrossStitchSilkCost => "custo do Ponto Cruz", ModSettingKind.CrossStitchHitMultiplier => "dano por golpe do Ponto Cruz", ModSettingKind.SharpdartSilkCost => "custo do Dardo Afiado", ModSettingKind.SharpdartMainHitMultiplier => "dano do Dardo Afiado", ModSettingKind.RuneRageSilkCost => "custo da Furia de Runas", ModSettingKind.RuneRageBaseDamageMultiplier => "dano base da Furia de Runas", ModSettingKind.PaleNailsSilkCost => "custo dos Ferroes Palidos", ModSettingKind.PaleNailsProjectileMultiplier => "dano por projetil dos Ferroes Palidos", _ => setting.ToString(), }; } } internal sealed class SilkSpearController { private enum SilkSkill { None, SilkSpear, ThreadStorm, CrossStitch, Sharpdart, RuneRage, PaleNails } private enum ThreadStormDamageStage { Normal, Late } private const string SilkSpecialsFsmName = "Silk Specials"; private const string SilkSpearDamagerName = "Needle Damage"; private const string SilkSpearHierarchyName = "Needle Throw"; private const string CrossStitchHierarchyName = "cross_slash"; private const string ThreadStormToolName = "Thread Sphere"; private const string SilkSpearToolName = "Silk Spear"; private const string CrossStitchToolName = "Parry"; private const string SharpdartToolName = "Silk Charge"; private const string RuneRageToolName = "Silk Bomb"; private const string PaleNailsToolName = "Silk Boss Needle"; [ThreadStatic] private static int _skillCostCheckDepth; [ThreadStatic] private static SilkSkill _checkedSkill; private readonly SettingsStore _settingsStore; private readonly Dictionary _threadStormStages = new Dictionary(); public static SilkSpearController Instance; public SilkSpearController(SettingsStore settingsStore) { _settingsStore = settingsStore; _settingsStore.Changed += OnSettingChanged; Instance = this; } public void ApplyDamageMultiplier(DamageEnemies damageSource, bool resetThreadStormStage) { ModSettingKind setting; switch (GetDamageSkill(damageSource)) { case SilkSkill.None: return; case SilkSkill.SilkSpear: setting = ModSettingKind.SilkSpearDamageMultiplier; break; case SilkSkill.ThreadStorm: { int instanceID = ((Object)((Component)damageSource).gameObject).GetInstanceID(); if (resetThreadStormStage || !_threadStormStages.ContainsKey(instanceID)) { _threadStormStages[instanceID] = ThreadStormDamageStage.Normal; } setting = ((_threadStormStages[instanceID] == ThreadStormDamageStage.Late) ? ModSettingKind.ThreadStormLateHitMultiplier : ModSettingKind.ThreadStormNormalHitMultiplier); break; } case SilkSkill.CrossStitch: setting = ModSettingKind.CrossStitchHitMultiplier; break; case SilkSkill.Sharpdart: setting = ModSettingKind.SharpdartMainHitMultiplier; break; case SilkSkill.RuneRage: setting = ModSettingKind.RuneRageBaseDamageMultiplier; break; default: setting = ModSettingKind.PaleNailsProjectileMultiplier; break; } damageSource.nailDamageMultiplier = GetDamageMultiplier(setting); } public void ReplaceThreadStormFsmMultiplier(DamageEnemies damageSource, ref float multiplier) { if (GetDamageSkill(damageSource) != SilkSkill.ThreadStorm) { return; } ThreadStormDamageStage value; ModSettingKind setting; if (Math.Abs(multiplier - 0.25f) < 0.001f) { value = ThreadStormDamageStage.Late; setting = ModSettingKind.ThreadStormLateHitMultiplier; } else { if (!(Math.Abs(multiplier - 0.7f) < 0.001f)) { return; } value = ThreadStormDamageStage.Normal; setting = ModSettingKind.ThreadStormNormalHitMultiplier; } _threadStormStages[((Object)((Component)damageSource).gameObject).GetInstanceID()] = value; multiplier = GetDamageMultiplier(setting); } public void ApplyCostVariable(GetPlayerDataVariable action) { SilkSkill skillFromAction = GetSkillFromAction((FsmStateAction)(object)action); if (skillFromAction != SilkSkill.None && action.StoreValue != null) { action.StoreValue.SetValue((object)GetCurrentSilkCost(skillFromAction)); } } public void ApplyCost(TakeSilk action) { SilkSkill skillFromAction = GetSkillFromAction((FsmStateAction)(object)action); if (skillFromAction != SilkSkill.None && action.amount != null) { action.amount.Value = GetCurrentSilkCost(skillFromAction); } } public int GetCheckedSkillCost(int originalCost) { if (_skillCostCheckDepth <= 0 || _checkedSkill == SilkSkill.None) { return originalCost; } return GetCurrentSilkCost(_checkedSkill); } public int BeginSkillCostCheck(ToolItem tool) { SilkSkill skillFromTool = GetSkillFromTool(tool); if (skillFromTool == SilkSkill.None) { return 0; } if (_skillCostCheckDepth == 0) { _checkedSkill = skillFromTool; } _skillCostCheckDepth++; return (int)skillFromTool; } public void EndSkillCostCheck(int checkedSkill) { if (checkedSkill != 0 && _skillCostCheckDepth > 0) { _skillCostCheckDepth--; if (_skillCostCheckDepth == 0) { _checkedSkill = SilkSkill.None; } } } public void RefreshDamageSources() { DamageEnemies[] array = Resources.FindObjectsOfTypeAll(); if (array != null) { for (int i = 0; i < array.Length; i++) { ApplyDamageMultiplier(array[i], resetThreadStormStage: false); } } } public void Shutdown() { _settingsStore.Changed -= OnSettingChanged; _threadStormStages.Clear(); if (Instance == this) { Instance = null; } } private float GetDamageMultiplier(ModSettingKind setting) { if (!_settingsStore.IsEnabled(setting)) { return SilkSkillSettingCatalog.GetDefault(setting); } return SilkSkillSettingCatalog.Normalize(setting, SilkSkillSettingCatalog.GetValue(_settingsStore.Current, setting)); } private int GetCurrentSilkCost(SilkSkill skill) { ModSettingKind costSetting = GetCostSetting(skill); int num = (_settingsStore.IsEnabled(costSetting) ? ((int)SilkSkillSettingCatalog.Normalize(costSetting, SilkSkillSettingCatalog.GetValue(_settingsStore.Current, costSetting))) : 4); if (HasFleaCharmDiscount()) { num--; } return Math.Max(1, num); } private static ModSettingKind GetCostSetting(SilkSkill skill) { return skill switch { SilkSkill.SilkSpear => ModSettingKind.SilkSpearSilkCost, SilkSkill.ThreadStorm => ModSettingKind.ThreadStormSilkCost, SilkSkill.CrossStitch => ModSettingKind.CrossStitchSilkCost, SilkSkill.Sharpdart => ModSettingKind.SharpdartSilkCost, SilkSkill.RuneRage => ModSettingKind.RuneRageSilkCost, SilkSkill.PaleNails => ModSettingKind.PaleNailsSilkCost, _ => throw new ArgumentOutOfRangeException("skill"), }; } private static bool HasFleaCharmDiscount() { if (!PlayerData.HasInstance || PlayerData.instance == null) { return false; } ToolItem fleaCharmTool = Gameplay.FleaCharmTool; if ((Object)(object)fleaCharmTool != (Object)null && fleaCharmTool.IsEquippedHud) { return PlayerData.instance.health >= PlayerData.instance.CurrentMaxHealth; } return false; } private static SilkSkill GetSkillFromAction(FsmStateAction action) { if (action == null || action.Fsm == null || action.State == null || !string.Equals(action.Fsm.Name, "Silk Specials", StringComparison.Ordinal)) { return SilkSkill.None; } switch (action.State.Name) { case "Start Throw": return SilkSkill.SilkSpear; case "A Sphere Start": case "Can Repeat?": case "A Sphere Repeat": return SilkSkill.ThreadStorm; case "Parry Start": return SilkSkill.CrossStitch; case "Silk Charge Begin": return SilkSkill.Sharpdart; case "Silk Bomb Start": case "Silk Bomb Restart": return SilkSkill.RuneRage; case "BossNeedle Cast": return SilkSkill.PaleNails; default: return SilkSkill.None; } } private static SilkSkill GetDamageSkill(DamageEnemies damageSource) { if ((Object)(object)damageSource == (Object)null || (Object)(object)((Component)damageSource).gameObject == (Object)null || !damageSource.useNailDamage) { return SilkSkill.None; } ToolItem representingTool = damageSource.RepresentingTool; string a = (((Object)(object)representingTool != (Object)null) ? (representingTool.name ?? string.Empty) : string.Empty); if (string.Equals(a, "Thread Sphere", StringComparison.OrdinalIgnoreCase)) { return SilkSkill.ThreadStorm; } if (string.Equals(a, "Silk Spear", StringComparison.OrdinalIgnoreCase)) { return SilkSkill.SilkSpear; } if (string.Equals(a, "Parry", StringComparison.OrdinalIgnoreCase)) { return SilkSkill.CrossStitch; } if (string.Equals(a, "Silk Charge", StringComparison.OrdinalIgnoreCase)) { return SilkSkill.Sharpdart; } if (string.Equals(a, "Silk Bomb", StringComparison.OrdinalIgnoreCase)) { return SilkSkill.RuneRage; } if (string.Equals(a, "Silk Boss Needle", StringComparison.OrdinalIgnoreCase)) { return SilkSkill.PaleNails; } if (IsSilkSpearDamager(damageSource)) { return SilkSkill.SilkSpear; } if (!HasHierarchyName(((Component)damageSource).transform, "cross_slash")) { return SilkSkill.None; } return SilkSkill.CrossStitch; } private static bool IsSilkSpearDamager(DamageEnemies damageSource) { if (string.Equals(((Object)((Component)damageSource).gameObject).name, "Needle Damage", StringComparison.Ordinal)) { return HasHierarchyName(((Component)damageSource).transform, "Needle Throw"); } return false; } private static bool HasHierarchyName(Transform transform, string nameFragment) { Transform val = transform; int num = 0; while ((Object)(object)val != (Object)null && num < 10) { if (((Object)val).name.IndexOf(nameFragment, StringComparison.OrdinalIgnoreCase) >= 0) { return true; } num++; val = val.parent; } return false; } private static SilkSkill GetSkillFromTool(ToolItem tool) { if ((Object)(object)tool == (Object)null) { return SilkSkill.None; } string text = tool.name ?? string.Empty; if (string.Equals(text, "Thread Sphere", StringComparison.OrdinalIgnoreCase)) { return SilkSkill.ThreadStorm; } if (string.Equals(text, "Silk Spear", StringComparison.OrdinalIgnoreCase)) { return SilkSkill.SilkSpear; } if (string.Equals(text, "Parry", StringComparison.OrdinalIgnoreCase)) { return SilkSkill.CrossStitch; } if (string.Equals(text, "Silk Charge", StringComparison.OrdinalIgnoreCase)) { return SilkSkill.Sharpdart; } if (string.Equals(text, "Silk Bomb", StringComparison.OrdinalIgnoreCase)) { return SilkSkill.RuneRage; } if (string.Equals(text, "Silk Boss Needle", StringComparison.OrdinalIgnoreCase)) { return SilkSkill.PaleNails; } string a = text.Replace(" ", string.Empty).Replace("_", string.Empty).Replace("-", string.Empty); if (!string.Equals(a, "SilkSpear", StringComparison.OrdinalIgnoreCase)) { return SilkSkill.None; } return SilkSkill.SilkSpear; } private void OnSettingChanged(ModSettingKind setting) { if (SilkSkillSettingCatalog.IsSilkSkillSetting(setting) && !SilkSkillSettingCatalog.IsCost(setting)) { RefreshDamageSources(); } } } [HarmonyPatch(typeof(DamageEnemies), "Start")] internal static class SilkSpearDamageStartPatch { private static void Postfix(DamageEnemies __instance) { if (SilkSpearController.Instance != null) { SilkSpearController.Instance.ApplyDamageMultiplier(__instance, resetThreadStormStage: false); } } } [HarmonyPatch(typeof(DamageEnemies), "OnEnable")] internal static class SilkSpearDamageEnablePatch { private static void Postfix(DamageEnemies __instance) { if (SilkSpearController.Instance != null) { SilkSpearController.Instance.ApplyDamageMultiplier(__instance, resetThreadStormStage: true); } } } [HarmonyPatch(typeof(DamageEnemies), "SetNailDamageMultiplier")] internal static class ThreadStormFsmDamagePatch { private static void Prefix(DamageEnemies __instance, ref float multiplier) { if (SilkSpearController.Instance != null) { SilkSpearController.Instance.ReplaceThreadStormFsmMultiplier(__instance, ref multiplier); } } } [HarmonyPatch(typeof(GetPlayerDataVariable), "OnEnter")] internal static class SilkSpearCostVariablePatch { private static void Postfix(GetPlayerDataVariable __instance) { if (SilkSpearController.Instance != null) { SilkSpearController.Instance.ApplyCostVariable(__instance); } } } [HarmonyPatch(typeof(TakeSilk), "OnEnter")] internal static class SilkSpearTakeSilkPatch { private static void Prefix(TakeSilk __instance) { if (SilkSpearController.Instance != null) { SilkSpearController.Instance.ApplyCost(__instance); } } } [HarmonyPatch(typeof(HeroController), "CanThrowTool", new Type[] { typeof(ToolItem), typeof(AttackToolBinding), typeof(bool) })] internal static class SilkSpearCanThrowToolPatch { private static void Prefix(ToolItem __0, out int __state) { __state = ((SilkSpearController.Instance != null) ? SilkSpearController.Instance.BeginSkillCostCheck(__0) : 0); } private static void Postfix(int __state) { if (SilkSpearController.Instance != null) { SilkSpearController.Instance.EndSkillCostCheck(__state); } } } [HarmonyPatch(typeof(PlayerData), "get_SilkSkillCost")] internal static class SilkSpearCheckedSkillCostPatch { private static void Postfix(ref int __result) { if (SilkSpearController.Instance != null) { __result = SilkSpearController.Instance.GetCheckedSkillCost(__result); } } } [HarmonyPatch(typeof(HeroController), "Start")] internal static class SilkSpearHeroStartPatch { private static void Postfix() { if (SilkSpearController.Instance != null) { SilkSpearController.Instance.RefreshDamageSources(); } } } internal static class ValueValidator { public const int MinimumHealth = 1; public const int MaximumHealth = 20; public const int MinimumNeedleDamage = 1; public const int MaximumNeedleDamage = 100; public const int MinimumNeedleUpgradePercentage = 0; public const int MaximumNeedleUpgradePercentage = 100; public const int MinimumSilkSpearDamageMultiplier = 1; public const int MaximumSilkSpearDamageMultiplier = 20; public const int DefaultSilkSpearDamageMultiplier = 3; public const int MinimumSilkSpearSilkCost = 1; public const int MaximumSilkSpearSilkCost = 18; public const int DefaultSilkSpearSilkCost = 4; public const int MinimumSilkSkillCost = 1; public const int MaximumSilkSkillCost = 18; public const int DefaultSilkSkillCost = 4; public const float MinimumSilkSkillMultiplier = 0.05f; public const float MaximumSilkSkillMultiplier = 20f; public const float SilkSkillMultiplierStep = 0.05f; public const float DefaultThreadStormNormalHitMultiplier = 0.7f; public const float DefaultThreadStormLateHitMultiplier = 0.25f; public const float DefaultCrossStitchHitMultiplier = 0.75f; public const float DefaultSharpdartMainHitMultiplier = 2.75f; public const float DefaultRuneRageBaseDamageMultiplier = 2.1f; public const float DefaultPaleNailsProjectileMultiplier = 1f; public const int MinimumHealingAmount = 1; public const int MaximumHealingAmount = 20; public const int DefaultHealingAmount = 3; public const int MinimumHealingCost = 1; public const int MaximumHealingCost = 18; public const int DefaultHealingCost = 9; public const float MinimumMultiplier = 0.1f; public const float MaximumMultiplier = 20f; public const float MultiplierStep = 0.1f; public const float MinimumEnemySpeedMultiplier = 0.1f; public const float MaximumEnemySpeedMultiplier = 1.1f; public const float MinimumBossAttackSpeedMultiplier = 0.1f; public const float MaximumBossAttackSpeedMultiplier = 2f; public const int MinimumDeathRosaryLossPercentage = 0; public const int MaximumDeathRosaryLossPercentage = 200; public const int DefaultDeathRosaryLossPercentage = 100; public const float MinimumHornetSpeedMultiplier = 0.1f; public const float MaximumHornetSpeedMultiplier = 2f; public const float DefaultHornetSpeedMultiplier = 1f; public const int MinimumDashRechargeLevel = 1; public const int MaximumDashRechargeLevel = 20; public const int DefaultDashRechargeLevel = 1; public const float MinimumPriceMultiplier = 0.1f; public const float MaximumPriceMultiplier = 10f; public const float MinimumDamageMultiplier = 1f; public const float MaximumDamageMultiplier = 20f; public const int DamageStep = 1; private static readonly CultureInfo PortugueseCulture = new CultureInfo("pt-BR"); public static int ClampHealth(int value) { return Math.Max(1, Math.Min(20, value)); } public static int ClampNeedleDamage(int value) { return Math.Max(1, Math.Min(100, value)); } public static int ClampNeedleUpgradePercentage(int value) { return Math.Max(0, Math.Min(100, value)); } public static int ClampSilkSpearDamageMultiplier(int value) { return Math.Max(1, Math.Min(20, value)); } public static int ClampSilkSpearSilkCost(int value) { return ClampSilkSkillCost(value); } public static int ClampSilkSkillCost(int value) { return Math.Max(1, Math.Min(18, value)); } public static float NormalizeSilkSkillMultiplier(float value, float fallback) { if (float.IsNaN(value) || float.IsInfinity(value)) { value = fallback; } float num = Math.Max(0.05f, Math.Min(20f, value)); return (float)(Math.Round(num / 0.05f, MidpointRounding.AwayFromZero) * 0.05000000074505806); } public static int ClampHealingAmount(int value) { return Math.Max(1, Math.Min(20, value)); } public static int ClampHealingCost(int value) { return Math.Max(1, Math.Min(18, value)); } public static float NormalizeMultiplier(float value) { if (float.IsNaN(value) || float.IsInfinity(value)) { return 0.1f; } float num = Math.Max(0.1f, Math.Min(20f, value)); return (float)(Math.Round((double)num * 10.0, MidpointRounding.AwayFromZero) / 10.0); } public static float NormalizeEnemySpeedMultiplier(float value) { if (float.IsNaN(value) || float.IsInfinity(value)) { return 1f; } float num = Math.Max(0.1f, Math.Min(1.1f, value)); return (float)(Math.Round((double)num * 10.0, MidpointRounding.AwayFromZero) / 10.0); } public static float NormalizeBossAttackSpeedMultiplier(float value) { if (float.IsNaN(value) || float.IsInfinity(value)) { return 1f; } float num = Math.Max(0.1f, Math.Min(2f, value)); return (float)(Math.Round((double)num * 10.0, MidpointRounding.AwayFromZero) / 10.0); } public static int ClampDeathRosaryLossPercentage(int value) { return Math.Max(0, Math.Min(200, value)); } public static float NormalizeHornetSpeedMultiplier(float value) { if (float.IsNaN(value) || float.IsInfinity(value)) { return 1f; } float num = Math.Max(0.1f, Math.Min(2f, value)); return (float)(Math.Round((double)num * 10.0, MidpointRounding.AwayFromZero) / 10.0); } public static int ClampDashRechargeLevel(int value) { return Math.Max(1, Math.Min(20, value)); } public static float GetDashRechargeSeconds(int level) { int num = ClampDashRechargeLevel(level); if (num <= 1) { return 0f; } return (float)(0.1 * Math.Pow(2.0, num - 2)); } public static float NormalizePriceMultiplier(float value) { if (float.IsNaN(value) || float.IsInfinity(value)) { return 1f; } float num = Math.Max(0.1f, Math.Min(10f, value)); return (float)(Math.Round((double)num * 10.0, MidpointRounding.AwayFromZero) / 10.0); } public static float NormalizeDamageMultiplier(float value) { if (float.IsNaN(value) || float.IsInfinity(value)) { return 1f; } float num = Math.Max(1f, Math.Min(20f, value)); return (float)Math.Round(num, MidpointRounding.AwayFromZero); } public static int ParseHealthOrClamp(string text) { if (!int.TryParse((text ?? string.Empty).Trim(), NumberStyles.Integer, CultureInfo.InvariantCulture, out var result)) { return 1; } return ClampHealth(result); } public static int ParseNeedleDamageOrClamp(string text) { if (!int.TryParse((text ?? string.Empty).Trim(), NumberStyles.Integer, CultureInfo.InvariantCulture, out var result)) { return 1; } return ClampNeedleDamage(result); } public static int ParseNeedleUpgradePercentageOrClamp(string text) { string s = (text ?? string.Empty).Trim().Replace("%", string.Empty); if (!int.TryParse(s, NumberStyles.Integer, CultureInfo.InvariantCulture, out var result)) { return 0; } return ClampNeedleUpgradePercentage(result); } public static int ParseSilkSpearDamageMultiplierOrClamp(string text) { string s = (text ?? string.Empty).Trim().Replace("x", string.Empty).Replace("X", string.Empty); if (!int.TryParse(s, NumberStyles.Integer, CultureInfo.InvariantCulture, out var result)) { return 1; } return ClampSilkSpearDamageMultiplier(result); } public static int ParseSilkSpearSilkCostOrClamp(string text) { return ParseSilkSkillCostOrClamp(text); } public static int ParseSilkSkillCostOrClamp(string text) { if (!int.TryParse((text ?? string.Empty).Trim(), NumberStyles.Integer, CultureInfo.InvariantCulture, out var result)) { return 4; } return ClampSilkSkillCost(result); } public static float ParseSilkSkillMultiplierOrClamp(string text, float fallback) { string s = (text ?? string.Empty).Trim().Replace("x", string.Empty).Replace("X", string.Empty) .Replace(',', '.'); if (!float.TryParse(s, NumberStyles.Float, CultureInfo.InvariantCulture, out var result)) { result = fallback; } return NormalizeSilkSkillMultiplier(result, fallback); } public static int ParseHealingAmountOrClamp(string text) { if (!int.TryParse((text ?? string.Empty).Trim(), NumberStyles.Integer, CultureInfo.InvariantCulture, out var result)) { return 1; } return ClampHealingAmount(result); } public static int ParseHealingCostOrClamp(string text) { if (!int.TryParse((text ?? string.Empty).Trim(), NumberStyles.Integer, CultureInfo.InvariantCulture, out var result)) { return 1; } return ClampHealingCost(result); } public static float ParseMultiplierOrClamp(string text) { string s = (text ?? string.Empty).Trim().Replace("x", string.Empty).Replace("X", string.Empty) .Replace(',', '.'); if (!float.TryParse(s, NumberStyles.Float, CultureInfo.InvariantCulture, out var result)) { return 0.1f; } return NormalizeMultiplier(result); } public static float ParseEnemySpeedMultiplierOrClamp(string text) { string s = (text ?? string.Empty).Trim().Replace("x", string.Empty).Replace("X", string.Empty) .Replace(',', '.'); if (!float.TryParse(s, NumberStyles.Float, CultureInfo.InvariantCulture, out var result)) { return 1f; } return NormalizeEnemySpeedMultiplier(result); } public static float ParseBossAttackSpeedMultiplierOrClamp(string text) { string s = (text ?? string.Empty).Trim().Replace("x", string.Empty).Replace("X", string.Empty) .Replace(',', '.'); if (!float.TryParse(s, NumberStyles.Float, CultureInfo.InvariantCulture, out var result)) { return 1f; } return NormalizeBossAttackSpeedMultiplier(result); } public static int ParseDeathRosaryLossPercentageOrClamp(string text) { string s = (text ?? string.Empty).Trim().Replace("%", string.Empty); if (!int.TryParse(s, NumberStyles.Integer, CultureInfo.InvariantCulture, out var result)) { return 100; } return ClampDeathRosaryLossPercentage(result); } public static float ParseHornetSpeedMultiplierOrClamp(string text) { string s = (text ?? string.Empty).Trim().Replace("x", string.Empty).Replace("X", string.Empty) .Replace(',', '.'); if (!float.TryParse(s, NumberStyles.Float, CultureInfo.InvariantCulture, out var result)) { return 1f; } return NormalizeHornetSpeedMultiplier(result); } public static int ParseDashRechargeLevelOrClamp(string text) { string s = (text ?? string.Empty).Trim().Replace("Nível", string.Empty).Replace("Nivel", string.Empty) .Trim(); if (!int.TryParse(s, NumberStyles.Integer, CultureInfo.InvariantCulture, out var result)) { return 1; } return ClampDashRechargeLevel(result); } public static float ParsePriceMultiplierOrClamp(string text) { string s = (text ?? string.Empty).Trim().Replace("x", string.Empty).Replace("X", string.Empty) .Replace(',', '.'); if (!float.TryParse(s, NumberStyles.Float, CultureInfo.InvariantCulture, out var result)) { return 0.1f; } return NormalizePriceMultiplier(result); } public static float ParseDamageMultiplierOrClamp(string text) { string s = (text ?? string.Empty).Trim().Replace("x", string.Empty).Replace("X", string.Empty) .Replace(',', '.'); if (!float.TryParse(s, NumberStyles.Float, CultureInfo.InvariantCulture, out var result)) { return 1f; } return NormalizeDamageMultiplier(result); } public static string FormatHealth(int value) { return ClampHealth(value).ToString(CultureInfo.InvariantCulture); } public static string FormatNeedleDamage(int value) { return ClampNeedleDamage(value).ToString(CultureInfo.InvariantCulture); } public static string FormatNeedleUpgradePercentage(int value) { return ClampNeedleUpgradePercentage(value).ToString(CultureInfo.InvariantCulture) + "%"; } public static string FormatSilkSpearDamageMultiplier(int value) { return ClampSilkSpearDamageMultiplier(value).ToString(CultureInfo.InvariantCulture) + "x"; } public static string FormatSilkSpearSilkCost(int value) { return FormatSilkSkillCost(value); } public static string FormatSilkSkillCost(int value) { return ClampSilkSkillCost(value).ToString(CultureInfo.InvariantCulture); } public static string FormatSilkSkillMultiplier(float value) { return NormalizeSilkSkillMultiplier(value, 1f).ToString("0.00", PortugueseCulture) + "x"; } public static string FormatHealingAmount(int value) { return ClampHealingAmount(value).ToString(CultureInfo.InvariantCulture); } public static string FormatHealingCost(int value) { return ClampHealingCost(value).ToString(CultureInfo.InvariantCulture); } public static string FormatMultiplier(float value) { return NormalizeMultiplier(value).ToString("0.0", PortugueseCulture) + "x"; } public static string FormatEnemySpeedMultiplier(float value) { return NormalizeEnemySpeedMultiplier(value).ToString("0.0", PortugueseCulture) + "x"; } public static string FormatDeathRosaryLossPercentage(int value) { return ClampDeathRosaryLossPercentage(value).ToString(CultureInfo.InvariantCulture) + "%"; } public static string FormatHornetSpeedMultiplier(float value) { return NormalizeHornetSpeedMultiplier(value).ToString("0.0", PortugueseCulture) + "x"; } public static string FormatDashRechargeLevel(int value) { return ClampDashRechargeLevel(value).ToString(CultureInfo.InvariantCulture); } public static string FormatPriceMultiplier(float value) { return NormalizePriceMultiplier(value).ToString("0.0", PortugueseCulture) + "x"; } public static string FormatDamageMultiplier(float value) { return NormalizeDamageMultiplier(value).ToString("0", PortugueseCulture); } public static bool ParseBooleanOrFalse(string text) { string text2 = (text ?? string.Empty).Trim(); if (!text2.Equals("ligado", StringComparison.OrdinalIgnoreCase) && !text2.Equals("on", StringComparison.OrdinalIgnoreCase) && !text2.Equals("true", StringComparison.OrdinalIgnoreCase) && !text2.Equals("sim", StringComparison.OrdinalIgnoreCase)) { return text2 == "1"; } return true; } public static string FormatOneHit(bool value) { if (!value) { return "Desligado"; } return "Ligado"; } }