using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Cryptography; using System.Security.Permissions; using System.Text; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using GameNetcodeStuff; using HarmonyLib; using Microsoft.CodeAnalysis; using TMPro; using Unity.Collections; using Unity.Netcode; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.Events; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: IgnoresAccessChecksTo("Assembly-CSharp")] [assembly: IgnoresAccessChecksTo("Unity.Netcode.Runtime")] [assembly: AssemblyCompany("UpgradableStats")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("Upgradable Stats")] [assembly: AssemblyTitle("UpgradableStats")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace UpgradableStats { internal static class HudFigure { internal static RectTransform Anchor() { HUDManager instance = HUDManager.Instance; if ((Object)(object)instance == (Object)null || (Object)(object)instance.selfRedCanvasGroup == (Object)null) { return null; } return ((Component)instance.selfRedCanvasGroup).GetComponent(); } internal static RectTransform NewSibling(string name, Vector2 sizeFactor, Vector2 offsetFactor, Vector2 extraOffset) { //IL_0025: 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_0063: 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_007f: 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_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_00a0: 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_00bb: 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_00c8: 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_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Unknown result type (might be due to invalid IL or missing references) RectTransform val = Anchor(); if ((Object)(object)val == (Object)null) { return null; } RectTransform component = new GameObject(name, new Type[1] { typeof(RectTransform) }).GetComponent(); ((Transform)component).SetParent(((Transform)val).parent, false); ((Transform)component).SetSiblingIndex(((Transform)val).GetSiblingIndex() + 1); Vector2 val2 = default(Vector2); ((Vector2)(ref val2))..ctor(0.5f, 0.5f); component.anchorMax = val2; component.anchorMin = val2; component.pivot = new Vector2(0.5f, 0.5f); Rect rect = val.rect; float width = ((Rect)(ref rect)).width; rect = val.rect; float height = ((Rect)(ref rect)).height; component.sizeDelta = new Vector2(width * sizeFactor.x, height * sizeFactor.y); ((Transform)component).localPosition = ((Transform)val).localPosition + new Vector3(width * offsetFactor.x + extraOffset.x, height * offsetFactor.y + extraOffset.y, 0f); ((Transform)component).localRotation = Quaternion.identity; ((Transform)component).localScale = Vector3.one; return component; } internal static Sprite SpriteFromRows(string[] rows, Color mainColor, Color darkColor, Color gemColor) { //IL_0049: 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_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Expected O, but got Unknown //IL_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: 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_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: 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) int num = rows.Length; int num2 = rows.Max((string r) => r.Length); Color val = default(Color); ((Color)(ref val))..ctor(0f, 0f, 0f, 0f); Texture2D val2 = new Texture2D(num2, num, (TextureFormat)4, false) { filterMode = (FilterMode)0, wrapMode = (TextureWrapMode)1 }; for (int num3 = 0; num3 < num; num3++) { string text = rows[num - 1 - num3]; for (int num4 = 0; num4 < num2; num4++) { val2.SetPixel(num4, num3, (Color)(((num4 < text.Length) ? text[num4] : '.') switch { 'X' => gemColor, 'd' => darkColor, 'g' => mainColor, _ => val, })); } } val2.Apply(); return Sprite.Create(val2, new Rect(0f, 0f, (float)num2, (float)num), new Vector2(0.5f, 0.5f), 100f); } } internal static class CrownIndicator { private static Image _crown; private static AudioClip _glassClip; private static bool _searchedClip; internal static void Tick() { bool flag = StatsEffects.HasSecondWind && !StatsEffects.SecondWindActive && (Object)(object)GameNetworkManager.Instance != (Object)null && (Object)(object)GameNetworkManager.Instance.localPlayerController != (Object)null && !GameNetworkManager.Instance.localPlayerController.isPlayerDead; if ((Object)(object)_crown == (Object)null) { if (!flag) { return; } Build(); if ((Object)(object)_crown == (Object)null) { return; } } if (((Behaviour)_crown).enabled != flag) { ((Behaviour)_crown).enabled = flag; } } private static void Build() { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_001e: 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) RectTransform val = HudFigure.NewSibling("SecondWindCrown[UpgradableStats]", new Vector2(0.42f, 0.16f), new Vector2(0f, 0.62f), new Vector2(0f, 4f)); if (!((Object)(object)val == (Object)null)) { _crown = ((Component)val).gameObject.AddComponent(); _crown.sprite = BuildCrownSprite(); _crown.preserveAspect = true; ((Graphic)_crown).raycastTarget = false; ((Behaviour)_crown).enabled = false; Plugin.Log.LogInfo((object)"Corona del segundo aliento creada (anclada a la figura)."); } } private static Sprite BuildCrownSprite() { //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_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_0069: Unknown result type (might be due to invalid IL or missing references) Color white = Color.white; return HudFigure.SpriteFromRows(new string[11] { ".g.....g.....g...", ".gg...g.g...gg...", ".g.g..g.g..g.g...", ".g..g.g.g.g..g...", ".g...gg.gg...g...", ".g...........g...", ".ggggggggggggg...", ".g.....g.....g...", ".g....g.g....g...", ".g.....g.....g...", ".ggggggggggggg..." }, white, white, white); } internal static void PlayBreakSound() { AudioClip val = FindGlassClip(); if (!((Object)(object)val == (Object)null) && !((Object)(object)HUDManager.Instance == (Object)null) && !((Object)(object)HUDManager.Instance.UIAudio == (Object)null)) { HUDManager.Instance.UIAudio.PlayOneShot(val, 0.4f); } } private static AudioClip FindGlassClip() { if ((Object)(object)_glassClip != (Object)null || _searchedClip) { return _glassClip; } _searchedClip = true; string[] obj = new string[5] { "glassbreak", "glassshatter", "shatter", "glass", "windowbreak" }; AudioClip[] source = Resources.FindObjectsOfTypeAll(); string[] array = obj; foreach (string key in array) { _glassClip = ((IEnumerable)source).FirstOrDefault((Func)((AudioClip c) => (Object)(object)c != (Object)null && ((Object)c).name.ToLowerInvariant().Contains(key))); if ((Object)(object)_glassClip != (Object)null) { Plugin.Log.LogInfo((object)("Sonido de vidrio: usando el clip del juego \"" + ((Object)_glassClip).name + "\".")); return _glassClip; } } _glassClip = SynthesizeGlass(); Plugin.Log.LogInfo((object)"Sonido de vidrio: no encontré clip del juego, usando uno sintetizado."); return _glassClip; } private static AudioClip SynthesizeGlass() { int num = 15435; float[] array = new float[num]; Random random = new Random(1234); for (int i = 0; i < num; i++) { float num2 = (float)i / (float)num; float num3 = Mathf.Pow(1f - num2, 2.6f); float num4 = (float)(random.NextDouble() * 2.0 - 1.0) * 0.55f; float num5 = Mathf.Sin(MathF.PI * 7600f * (float)i / 44100f) * 0.25f; float num6 = Mathf.Sin(MathF.PI * 11200f * (float)i / 44100f) * 0.18f; array[i] = (num4 + num5 + num6) * num3 * 0.5f; } AudioClip obj = AudioClip.Create("GlassBreakSynth", num, 1, 44100, false); obj.SetData(array, 0); return obj; } } internal static class StrengthArms { private static Image _left; private static Image _right; private static int _builtLevel = -1; private static Sprite[] _sprites; internal static void Tick() { int level = Plugin.LocalUpgrades.GetLevel(UpgradeSkill.Strength); if (level <= 0) { if ((Object)(object)_left != (Object)null) { ((Behaviour)_left).enabled = false; ((Behaviour)_right).enabled = false; } _builtLevel = 0; return; } if ((Object)(object)_left == (Object)null) { Build(); if ((Object)(object)_left == (Object)null) { return; } } if (_builtLevel != level) { Sprite sprite = GetSprite(level); _left.sprite = sprite; _right.sprite = sprite; _builtLevel = level; } if (!((Behaviour)_left).enabled) { ((Behaviour)_left).enabled = true; ((Behaviour)_right).enabled = true; } } private static void Build() { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //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_0047: 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_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0075: 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) RectTransform val = HudFigure.NewSibling("StrengthArmL[UpgradableStats]", new Vector2(0.38f, 0.34f), new Vector2(-0.34f, 0.12f), Vector2.zero); if (!((Object)(object)val == (Object)null)) { RectTransform obj = HudFigure.NewSibling("StrengthArmR[UpgradableStats]", new Vector2(0.38f, 0.34f), new Vector2(0.34f, 0.12f), Vector2.zero); ((Transform)obj).localScale = new Vector3(-1f, 1f, 1f); _left = ((Component)val).gameObject.AddComponent(); _right = ((Component)obj).gameObject.AddComponent(); Image[] array = (Image[])(object)new Image[2] { _left, _right }; foreach (Image obj2 in array) { obj2.preserveAspect = true; ((Graphic)obj2).raycastTarget = false; ((Graphic)obj2).color = new Color(1f, 1f, 1f, 0.95f); ((Behaviour)obj2).enabled = false; } Plugin.Log.LogInfo((object)"Brazos de fuerza creados en la figura del HUD."); } } private static Sprite GetSprite(int level) { if (_sprites == null) { _sprites = (Sprite[])(object)new Sprite[3]; } int num = Mathf.Clamp(level, 1, 3) - 1; if ((Object)(object)_sprites[num] == (Object)null) { _sprites[num] = BuildArmSprite(level); } return _sprites[num]; } private static Sprite BuildArmSprite(int level) { //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_015c: Unknown result type (might be due to invalid IL or missing references) //IL_015d: Unknown result type (might be due to invalid IL or missing references) //IL_015e: Unknown result type (might be due to invalid IL or missing references) Color white = Color.white; return HudFigure.SpriteFromRows(level switch { 1 => new string[12] { "....................", "....................", "..............ggg...", "...........gggggg...", "........ggggggg.....", ".....ggggggg........", "...ggggggg..........", "..gggggg............", "..ggggg.............", "..gggg..............", "...gg...............", "...................." }, 2 => new string[12] { "....................", "..............gggg..", "..........gggggggg..", ".......ggggggggg....", ".....gggggggggg.....", "....ggggggggg.......", "...gggggggg.........", "..ggggggg...........", "..gggggg............", "..ggggg.............", "...ggg..............", "...................." }, _ => new string[12] { "...gggg.............", "..gggggg............", "..gggggg............", "..ggggggg...........", "...gggggg...........", "...ggggggg......ggg.", "....gggggggg..ggggg.", ".....ggggggggggggg..", "......ggggggggggg...", ".......ggggggggg....", "....................", "...................." }, }, white, white, white); } } public class MachineScreenFx : MonoBehaviour { private static readonly Color Celeste = new Color(0.45f, 0.85f, 1f, 0.95f); private RectTransform _figure; private readonly RectTransform[] _particles = (RectTransform[])(object)new RectTransform[3]; private readonly Quaternion[] _orbitTilts = (Quaternion[])(object)new Quaternion[3] { Quaternion.Euler(72f, 0f, 0f), Quaternion.Euler(72f, 0f, 60f), Quaternion.Euler(72f, 0f, -60f) }; private readonly float[] _speeds = new float[3] { 2f, 2.6f, 3.3f }; private readonly float[] _phases = new float[3] { 0f, 2.1f, 4.2f }; private const float OrbitRadius = 16f; private float _t; private void Start() { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Expected O, but got Unknown //IL_004c: 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_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Expected O, but got Unknown //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_0101: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("Empleado", new Type[1] { typeof(RectTransform) }); _figure = val.GetComponent(); ((Transform)_figure).SetParent(((Component)this).transform, false); _figure.sizeDelta = new Vector2(20f, 30f); Image obj = val.AddComponent(); obj.sprite = FindEmployeeSprite(); ((Graphic)obj).color = Celeste; obj.preserveAspect = true; ((Graphic)obj).raycastTarget = false; Sprite sprite = BuildDotSprite(); for (int i = 0; i < _particles.Length; i++) { GameObject val2 = new GameObject($"Particula{i}", new Type[1] { typeof(RectTransform) }); _particles[i] = val2.GetComponent(); ((Transform)_particles[i]).SetParent(((Component)this).transform, false); _particles[i].sizeDelta = new Vector2(3.2f, 3.2f); Image obj2 = val2.AddComponent(); obj2.sprite = sprite; ((Graphic)obj2).color = Celeste; ((Graphic)obj2).raycastTarget = false; } } private void Update() { //IL_003c: 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_00a2: 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_00ac: 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_00c5: 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_00ee: Unknown result type (might be due to invalid IL or missing references) _t += Time.deltaTime; if ((Object)(object)_figure != (Object)null) { ((Transform)_figure).localRotation = Quaternion.Euler(0f, _t * 85f, 0f); } for (int i = 0; i < _particles.Length; i++) { if (!((Object)(object)_particles[i] == (Object)null)) { float num = _t * _speeds[i] + _phases[i]; Vector3 val = _orbitTilts[i] * new Vector3(Mathf.Cos(num) * 16f, 0f, Mathf.Sin(num) * 16f); ((Transform)_particles[i]).localPosition = val; float num2 = Mathf.InverseLerp(16f, -16f, val.z); ((Transform)_particles[i]).localScale = Vector3.one * Mathf.Lerp(0.7f, 1.25f, num2); } } } private static Sprite FindEmployeeSprite() { HUDManager instance = HUDManager.Instance; if ((Object)(object)instance != (Object)null && (Object)(object)instance.selfRedCanvasGroup != (Object)null) { Image componentInChildren = ((Component)instance.selfRedCanvasGroup).GetComponentInChildren(true); if ((Object)(object)componentInChildren != (Object)null && (Object)(object)componentInChildren.sprite != (Object)null) { return componentInChildren.sprite; } Transform parent = ((Component)instance.selfRedCanvasGroup).transform.parent; if ((Object)(object)parent != (Object)null) { Image[] componentsInChildren = ((Component)parent).GetComponentsInChildren(true); foreach (Image val in componentsInChildren) { if ((Object)(object)val.sprite != (Object)null) { return val.sprite; } } } } Plugin.Log.LogWarning((object)"No encontré el sprite del empleado; uso el de respaldo."); return BuildFallbackFigure(); } private static Sprite BuildFallbackFigure() { //IL_0085: 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_008f: Unknown result type (might be due to invalid IL or missing references) return HudFigure.SpriteFromRows(new string[15] { "....gggg....", "...g....g...", "...g....g...", "....gggg....", ".....gg.....", "..gggggggg..", ".g...gg...g.", "g....gg....g", "g....gg....g", ".....gg.....", "....g..g....", "....g..g....", "...g....g...", "...g....g...", "..g......g.." }, Color.white, Color.white, Color.white); } private static Sprite BuildDotSprite() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Expected O, but got Unknown //IL_0097: 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_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) Texture2D val = new Texture2D(12, 12, (TextureFormat)4, false) { wrapMode = (TextureWrapMode)1 }; float num = 5.5f; for (int i = 0; i < 12; i++) { for (int j = 0; j < 12; j++) { float num2 = Vector2.Distance(new Vector2((float)j, (float)i), new Vector2(num, num)) / num; float num3 = Mathf.Clamp01(1f - num2); val.SetPixel(j, i, new Color(1f, 1f, 1f, num3 * num3)); } } val.Apply(); return Sprite.Create(val, new Rect(0f, 0f, 12f, 12f), new Vector2(0.5f, 0.5f), 100f); } } internal static class Patches { [HarmonyPatch(typeof(GameNetworkManager), "Start")] internal static class GameNetworkManager_Start { [HarmonyPostfix] private static void Postfix() { TokenItem.RegisterNetworkPrefab(); UpgradesMachine.RegisterNetworkPrefab(); } } [HarmonyPatch(typeof(StartOfRound), "Awake")] internal static class StartOfRound_Awake { [HarmonyPostfix] private static void Postfix() { TokenItem.SetupEarlyInGame(); UpgradesMachine.RegisterUnlockable(); } } [HarmonyPatch(typeof(StartOfRound), "Start")] internal static class StartOfRound_Start { [HarmonyPostfix] private static void Postfix(StartOfRound __instance) { TokenItem.SetupInGame(); ((MonoBehaviour)__instance).StartCoroutine(UpgradesMachine.SpawnRoutine()); ((MonoBehaviour)__instance).StartCoroutine(UpgradeSync.SessionStartRoutine()); ((MonoBehaviour)__instance).StartCoroutine(FixRemoteSlotsWhenReady()); } private static IEnumerator FixRemoteSlotsWhenReady() { yield return (object)new WaitForSeconds(2f); UpgradeSync.EnsureRemotePlayersSlots(); } } [HarmonyPatch(typeof(StartOfRound), "ReviveDeadPlayers")] internal static class StartOfRound_ReviveDeadPlayers { [HarmonyPostfix] private static void Postfix() { StatsEffects.ReapplyAll(((Object)(object)GameNetworkManager.Instance != (Object)null) ? GameNetworkManager.Instance.localPlayerController : null); } } internal struct DamageState { internal int Prev; internal int Expected; internal bool SecondWind; } [HarmonyPatch(typeof(PlayerControllerB), "DamagePlayer")] internal static class PlayerControllerB_DamagePlayer { [HarmonyPrefix] private static void Prefix(PlayerControllerB __instance, ref int damageNumber, ref DamageState __state) { __state = new DamageState { Prev = -1, Expected = -1 }; if (!StatsEffects.IsLocal(__instance) || !((NetworkBehaviour)__instance).IsOwner || __instance.isPlayerDead) { return; } int health = __instance.health; bool secondWind = false; int expected; if (health - damageNumber <= 0) { if (!__instance.criticallyInjured && damageNumber < 50) { expected = 5; } else if (StatsEffects.HasSecondWind && health > 1) { expected = 1; secondWind = true; damageNumber = health - 1; Plugin.Log.LogInfo((object)"¡Segundo aliento! Sobrevives con 1 HP."); } else { expected = 0; } } else { expected = Mathf.Clamp(health - damageNumber, 0, StatsEffects.MaxHealth); } __state = new DamageState { Prev = health, Expected = expected, SecondWind = secondWind }; } [HarmonyPostfix] private static void Postfix(PlayerControllerB __instance, DamageState __state) { if (__state.SecondWind && !__instance.isPlayerDead) { StatsEffects.NotifySecondWind(); } if (__state.Prev >= 0 && __state.Expected > 0 && !__instance.isPlayerDead && __instance.health != __state.Prev && __instance.health != __state.Expected) { __instance.health = __state.Expected; if ((Object)(object)HUDManager.Instance != (Object)null) { HUDManager.Instance.UpdateHealthUI(__instance.health, false); } } } } [HarmonyPatch(typeof(Shovel), "HitShovel")] internal static class Shovel_HitShovel { [HarmonyPrefix] private static void Prefix(Shovel __instance, ref int __state) { __state = -1; if (StatsEffects.IsLocal(__instance.previousPlayerHeldBy)) { float meleeMultiplier = StatsEffects.MeleeMultiplier; if (!(meleeMultiplier <= 1f)) { __state = __instance.shovelHitForce; __instance.shovelHitForce = Mathf.Max(1, Mathf.RoundToInt((float)__state * meleeMultiplier)); } } } [HarmonyPostfix] private static void Postfix(Shovel __instance, int __state) { if (__state >= 0) { __instance.shovelHitForce = __state; } } } [HarmonyPatch(typeof(KnifeItem), "HitKnife")] internal static class KnifeItem_HitKnife { [HarmonyPrefix] private static void Prefix(KnifeItem __instance, ref int __state) { __state = -1; if (StatsEffects.IsLocal(__instance.previousPlayerHeldBy)) { float meleeMultiplier = StatsEffects.MeleeMultiplier; if (!(meleeMultiplier <= 1f)) { __state = __instance.knifeHitForce; __instance.knifeHitForce = Mathf.Max(1, Mathf.RoundToInt((float)__state * meleeMultiplier)); } } } [HarmonyPostfix] private static void Postfix(KnifeItem __instance, int __state) { if (__state >= 0) { __instance.knifeHitForce = __state; } } } [HarmonyPatch(typeof(TetraChemicalItem), "Update")] internal static class TetraChemicalItem_Update { private static float _healAccumulator; [HarmonyPostfix] private static void Postfix(TetraChemicalItem __instance) { if (!__instance.emittingGas || __instance.fuel <= 0f) { return; } PlayerControllerB playerHeldBy = ((GrabbableObject)__instance).playerHeldBy; if (!StatsEffects.IsLocal(playerHeldBy) || playerHeldBy.isPlayerDead || playerHeldBy.health >= StatsEffects.MaxHealth) { return; } _healAccumulator += Time.deltaTime / 38f * 198f; int num = (int)_healAccumulator; if (num <= 0) { StatsEffects.LastTzpHealTime = Time.time; return; } _healAccumulator -= num; playerHeldBy.health = Mathf.Min(playerHeldBy.health + num, StatsEffects.MaxHealth); StatsEffects.LastTzpHealTime = Time.time; if (playerHeldBy.health >= 20 && playerHeldBy.criticallyInjured) { playerHeldBy.MakeCriticallyInjured(false); } if ((Object)(object)HUDManager.Instance != (Object)null) { HUDManager.Instance.UpdateHealthUI(playerHeldBy.health, false); } } } [HarmonyPatch(typeof(GrabbableObject), "Start")] internal static class GrabbableObject_Start { [HarmonyPostfix] private static void Postfix(GrabbableObject __instance) { if (TokenItem.IsToken(__instance)) { __instance.SetScrapValue(Plugin.TokenSellValue.Value); } } } [HarmonyPatch(typeof(PlayerControllerB), "SetInSpecialMenu")] internal static class PlayerControllerB_SetInSpecialMenu { [HarmonyPostfix] private static void Postfix(bool setInMenu) { if (!setInMenu && UpgradeMenuUI.IsOpen) { UpgradeMenuUI.Close(); } } } } [BepInPlugin("com.martinchavez.upgradablestats", "Upgradable Stats", "1.0.0")] public class Plugin : BaseUnityPlugin { public const string PluginGuid = "com.martinchavez.upgradablestats"; public const string PluginName = "Upgradable Stats"; public const string PluginVersion = "1.0.0"; internal static ManualLogSource Log; internal static readonly PlayerUpgrades LocalUpgrades = new PlayerUpgrades(); internal static ConfigEntry OffsetX; internal static ConfigEntry OffsetY; internal static ConfigEntry OffsetZ; internal static ConfigEntry MachineRotationY; internal static ConfigEntry FreeUpgrades; internal static ConfigEntry TokenBuyPrice; internal static ConfigEntry TokenSellValue; internal static ConfigEntry TokenFallbackRarity; internal static ConfigEntry StaminaBarVisual; private readonly Harmony _harmony = new Harmony("com.martinchavez.upgradablestats"); internal static Vector3 MachineOffset => new Vector3(OffsetX.Value, OffsetY.Value, OffsetZ.Value); private void Awake() { //IL_0152: Unknown result type (might be due to invalid IL or missing references) //IL_0157: Unknown result type (might be due to invalid IL or missing references) //IL_015d: Expected O, but got Unknown //IL_015d: Unknown result type (might be due to invalid IL or missing references) Log = ((BaseUnityPlugin)this).Logger; OffsetX = ((BaseUnityPlugin)this).Config.Bind("Maquina", "DesplazamientoX", -1.6f, "Posición respecto al terminal: a los lados (negativo = izquierda)."); OffsetY = ((BaseUnityPlugin)this).Config.Bind("Maquina", "DesplazamientoY", 0f, "Posición respecto al terminal: altura."); OffsetZ = ((BaseUnityPlugin)this).Config.Bind("Maquina", "DesplazamientoZ", 0f, "Posición respecto al terminal: adelante/atrás."); MachineRotationY = ((BaseUnityPlugin)this).Config.Bind("Maquina", "RotacionY", 0f, "Giro de la máquina en grados."); FreeUpgrades = ((BaseUnityPlugin)this).Config.Bind("Fichas", "MejorasGratis", false, "true = las mejoras no consumen fichas (solo para probar)."); TokenBuyPrice = ((BaseUnityPlugin)this).Config.Bind("Fichas", "PrecioCompra", 450, "Créditos que cuesta comprar una ficha en la terminal (\"buy ficha\")."); TokenSellValue = ((BaseUnityPlugin)this).Config.Bind("Fichas", "ValorChatarra", 200, "Valor de chatarra de la ficha (en el suelo y al comprarla): lo que paga la Compañía."); TokenFallbackRarity = ((BaseUnityPlugin)this).Config.Bind("Fichas", "RarezaRespaldo", 8, "Rareza usada solo si una luna no tiene Regalo del que copiar la suya."); StaminaBarVisual = ((BaseUnityPlugin)this).Config.Bind("Interfaz", "BarraEstaminaVisual", true, "Muestra la barra verde extra de estamina (25/50/75% según tus tokens)."); TokenItem.CreateEarly(); UpgradesMachine.CreatePrefabEarly(); GameObject val = new GameObject("UpgradableStats_Runtime"); Object.DontDestroyOnLoad((Object)val); ((Object)val).hideFlags = (HideFlags)61; val.AddComponent(); _harmony.PatchAll(typeof(Patches).Assembly); Log.LogInfo((object)"¡Upgradable Stats v1.0.0 cargado correctamente!"); Log.LogInfo((object)"Fase 3: fichas (aparecen como el Regalo, \"buy ficha\" 450, venta 400) + efectos reales."); } } internal static class StatsEffects { private const int BaseHealth = 100; private const float BaseSprintTime = 5f; private const int BaseSlots = 4; internal static bool SecondWindActive; internal static float LastTzpHealTime = -10f; private static float _lastRawExcess; private static readonly Color HudGreen = new Color(0.31f, 0.88f, 0.42f, 1f); private static GameObject _meleeRoot; private static TextMeshProUGUI _meleeText; private static Image _meleeSword; private static int _meleeShownLevel = -1; private static Image _staminaExtraBar; private static PlayerControllerB Local { get { if (!((Object)(object)GameNetworkManager.Instance != (Object)null)) { return null; } return GameNetworkManager.Instance.localPlayerController; } } internal static int MaxHealth => 100 + 33 * Mathf.Min(Plugin.LocalUpgrades.GetLevel(UpgradeSkill.Health), 3); internal static bool HasSecondWind => Plugin.LocalUpgrades.HasSecondWind; internal static float MeleeMultiplier => Plugin.LocalUpgrades.MeleeMultiplier; internal static float WeightFactor => 1f - 0.25f * (float)Plugin.LocalUpgrades.GetLevel(UpgradeSkill.Strength); internal static int TargetSlots => 4 + Plugin.LocalUpgrades.ExtraSlots; internal static bool IsLocal(PlayerControllerB p) { if ((Object)(object)p != (Object)null) { return (Object)(object)p == (Object)(object)Local; } return false; } internal static void OnUpgraded(UpgradeSkill skill) { PlayerControllerB local = Local; if ((Object)(object)local == (Object)null) { return; } switch (skill) { case UpgradeSkill.Health: if (Plugin.LocalUpgrades.GetLevel(UpgradeSkill.Health) <= 3) { local.health = Mathf.Min(local.health + 33, MaxHealth); HUDManager.Instance.UpdateHealthUI(local.health, false); } break; case UpgradeSkill.Stamina: ApplyStamina(local); break; case UpgradeSkill.Inventory: EnsureInventorySize(local); break; case UpgradeSkill.Strength: break; } } internal static void NotifySecondWind() { if (!SecondWindActive) { SecondWindActive = true; CrownIndicator.PlayBreakSound(); } } internal static void UpdateVignettes() { PlayerControllerB local = Local; if (SecondWindActive && ((Object)(object)local == (Object)null || local.isPlayerDead || local.health >= 20)) { SecondWindActive = false; } bool num = SecondWindActive && (Object)(object)local != (Object)null && !local.isPlayerDead; VignetteOverlay.SetTargets(pink: (Time.time - LastTzpHealTime < 0.35f) ? 0.35f : 0f, green: num ? 0.55f : 0f); VignetteOverlay.Tick(Time.deltaTime); CrownIndicator.Tick(); StrengthArms.Tick(); } internal static void ReapplyAll(PlayerControllerB p) { SecondWindActive = false; if (!((Object)(object)p == (Object)null) && IsLocal(p)) { p.health = MaxHealth; if ((Object)(object)HUDManager.Instance != (Object)null) { HUDManager.Instance.UpdateHealthUI(p.health, false); } ApplyStamina(p); EnsureInventorySize(p); } } private static void ApplyStamina(PlayerControllerB p) { p.sprintTime = 5f * Plugin.LocalUpgrades.StaminaMultiplier; } internal static void EnforceCarryWeight() { PlayerControllerB local = Local; if ((Object)(object)local == (Object)null || local.isPlayerDead || local.ItemSlots == null) { return; } float num = 0f; for (int i = 0; i < local.ItemSlots.Length; i++) { GrabbableObject val = local.ItemSlots[i]; if ((Object)(object)val != (Object)null && (Object)(object)val.itemProperties != (Object)null) { num += Mathf.Max(val.itemProperties.weight - 1f, 0f); } } _lastRawExcess = num; local.carryWeight = 1f + num * WeightFactor; } internal static void UpdateWeightLabel() { PlayerControllerB local = Local; HUDManager instance = HUDManager.Instance; if (!((Object)(object)local == (Object)null) && !((Object)(object)instance == (Object)null) && !((Object)(object)instance.weightCounter == (Object)null) && Plugin.LocalUpgrades.GetLevel(UpgradeSkill.Strength) > 0) { int num = Mathf.RoundToInt(_lastRawExcess * (1f - WeightFactor) * 105f); if (num > 0) { float num2 = Mathf.RoundToInt(Mathf.Clamp(local.carryWeight - 1f, 0f, 100f) * 105f); ((TMP_Text)instance.weightCounter).text = $"{num2} lb (-{num} lb)"; } } } internal static void UpdateMeleeLabel() { HUDManager instance = HUDManager.Instance; if ((Object)(object)instance == (Object)null || (Object)(object)instance.weightCounter == (Object)null) { return; } int level = Plugin.LocalUpgrades.GetLevel(UpgradeSkill.Strength); if (level <= 0) { if ((Object)(object)_meleeRoot != (Object)null) { _meleeRoot.SetActive(false); } _meleeShownLevel = 0; return; } if ((Object)(object)_meleeRoot == (Object)null) { BuildMeleeLabel(instance); } if (!((Object)(object)_meleeRoot == (Object)null)) { if (!_meleeRoot.activeSelf) { _meleeRoot.SetActive(true); } if (_meleeShownLevel != level) { ((TMP_Text)_meleeText).text = $"(+{level * 50}%"; _meleeShownLevel = level; } } } private static void BuildMeleeLabel(HUDManager hud) { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Expected O, but got Unknown //IL_0056: 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_006d: 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) //IL_007e: 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_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: 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_0112: Unknown result type (might be due to invalid IL or missing references) //IL_011c: Invalid comparison between Unknown and I4 //IL_011f: Unknown result type (might be due to invalid IL or missing references) //IL_0129: Invalid comparison between Unknown and I4 //IL_016f: 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_0181: Unknown result type (might be due to invalid IL or missing references) //IL_01a0: Unknown result type (might be due to invalid IL or missing references) TextMeshProUGUI weightCounter = hud.weightCounter; RectTransform rectTransform = ((TMP_Text)weightCounter).rectTransform; _meleeRoot = new GameObject("MeleeBonus[UpgradableStats]", new Type[1] { typeof(RectTransform) }); RectTransform component = _meleeRoot.GetComponent(); ((Transform)component).SetParent((Transform)(object)rectTransform, false); Vector2 val = default(Vector2); ((Vector2)(ref val))..ctor(0.5f, 1f); component.anchorMax = val; component.anchorMin = val; component.pivot = new Vector2(0.5f, 0f); Rect rect = rectTransform.rect; component.sizeDelta = new Vector2(Mathf.Max(((Rect)(ref rect)).width, 120f), ((TMP_Text)weightCounter).fontSize * 1.3f); component.anchoredPosition = new Vector2(0f, ((TMP_Text)weightCounter).fontSize * 0.35f); ((Transform)component).localRotation = Quaternion.identity; ((Transform)component).localScale = Vector3.one; HorizontalLayoutGroup obj = _meleeRoot.AddComponent(); ((HorizontalOrVerticalLayoutGroup)obj).spacing = ((TMP_Text)weightCounter).fontSize * 0.12f; ((HorizontalOrVerticalLayoutGroup)obj).childControlWidth = true; ((HorizontalOrVerticalLayoutGroup)obj).childControlHeight = true; ((HorizontalOrVerticalLayoutGroup)obj).childForceExpandWidth = false; ((HorizontalOrVerticalLayoutGroup)obj).childForceExpandHeight = false; ((LayoutGroup)obj).childAlignment = (TextAnchor)(((int)((TMP_Text)weightCounter).alignment == 513) ? 3 : (((int)((TMP_Text)weightCounter).alignment == 516) ? 5 : 4)); _meleeText = MakeMeleeTmp("Texto", component, weightCounter); ((TMP_Text)_meleeText).text = "(+50%"; GameObject val2 = new GameObject("Espada", new Type[1] { typeof(RectTransform) }); val2.transform.SetParent((Transform)(object)component, false); _meleeSword = val2.AddComponent(); _meleeSword.sprite = BuildSwordSprite(); ((Graphic)_meleeSword).color = HudGreen; _meleeSword.preserveAspect = true; ((Graphic)_meleeSword).raycastTarget = false; LayoutElement obj2 = val2.AddComponent(); obj2.preferredHeight = ((TMP_Text)weightCounter).fontSize * 1.1f; obj2.preferredWidth = ((TMP_Text)weightCounter).fontSize * 0.85f; ((TMP_Text)MakeMeleeTmp("Cierre", component, weightCounter)).text = ")"; Plugin.Log.LogInfo((object)"Indicador de daño melee creado sobre el contador de peso."); } private static TextMeshProUGUI MakeMeleeTmp(string name, RectTransform parent, TextMeshProUGUI copyFrom) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Expected O, but got Unknown //IL_0047: 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) GameObject val = new GameObject(name, new Type[1] { typeof(RectTransform) }); val.transform.SetParent((Transform)(object)parent, false); TextMeshProUGUI obj = val.AddComponent(); ((TMP_Text)obj).font = ((TMP_Text)copyFrom).font; ((TMP_Text)obj).fontSize = ((TMP_Text)copyFrom).fontSize; ((TMP_Text)obj).fontStyle = ((TMP_Text)copyFrom).fontStyle; ((Graphic)obj).color = HudGreen; ((TMP_Text)obj).alignment = (TextAlignmentOptions)4098; ((TMP_Text)obj).enableWordWrapping = false; ((Graphic)obj).raycastTarget = false; ContentSizeFitter obj2 = val.AddComponent(); obj2.horizontalFit = (FitMode)2; obj2.verticalFit = (FitMode)2; return obj; } private static Sprite BuildSwordSprite() { //IL_008e: 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_0098: Unknown result type (might be due to invalid IL or missing references) return HudFigure.SpriteFromRows(new string[16] { ".....g.....", "....g.g....", "....g.g....", "....g.g....", "....g.g....", "....g.g....", "....g.g....", "....g.g....", "....g.g....", "..ggggggg..", "..g.....g..", "..ggggggg..", "....g.g....", "....g.g....", "....ggg....", "..........." }, Color.white, Color.white, Color.white); } internal static void UpdateStaminaBarVisual() { PlayerControllerB local = Local; if ((Object)(object)local == (Object)null || (Object)(object)local.sprintMeterUI == (Object)null) { return; } float staminaMultiplier = Plugin.LocalUpgrades.StaminaMultiplier; if (staminaMultiplier <= 1f || !Plugin.StaminaBarVisual.Value) { if ((Object)(object)_staminaExtraBar != (Object)null) { ((Behaviour)_staminaExtraBar).enabled = false; } return; } if ((Object)(object)_staminaExtraBar == (Object)null) { CreateStaminaExtraBar(local); } if (!((Object)(object)_staminaExtraBar == (Object)null)) { float num = local.sprintMeter * staminaMultiplier; local.sprintMeterUI.fillAmount = Mathf.Min(num, 1f); _staminaExtraBar.fillAmount = Mathf.Clamp(num - 1f, 0f, staminaMultiplier - 1f); ((Behaviour)_staminaExtraBar).enabled = true; } } private static void CreateStaminaExtraBar(PlayerControllerB p) { //IL_00a8: 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_00e0: 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) GameObject val = Object.Instantiate(((Component)p.sprintMeterUI).gameObject, ((Component)p.sprintMeterUI).transform.parent); ((Object)val).name = "SprintMeterExtra[UpgradableStats]"; for (int num = val.transform.childCount - 1; num >= 0; num--) { Object.Destroy((Object)(object)((Component)val.transform.GetChild(num)).gameObject); } Animator component = val.GetComponent(); if ((Object)(object)component != (Object)null) { Object.Destroy((Object)(object)component); } _staminaExtraBar = val.GetComponent(); if ((Object)(object)_staminaExtraBar == (Object)null) { Object.Destroy((Object)(object)val); return; } ((Graphic)_staminaExtraBar).color = new Color(0.25f, 1f, 0.3f, 0.95f); _staminaExtraBar.fillAmount = 0f; RectTransform component2 = val.GetComponent(); RectTransform rectTransform = ((Graphic)p.sprintMeterUI).rectTransform; component2.anchoredPosition = rectTransform.anchoredPosition; ((Transform)component2).localScale = ((Transform)rectTransform).localScale * 1.13f; val.transform.SetSiblingIndex(((Component)p.sprintMeterUI).transform.GetSiblingIndex()); Plugin.Log.LogInfo((object)"Barra de estamina extra creada."); } internal static void EnsureInventorySize(PlayerControllerB p) { if (!((Object)(object)p == (Object)null) && IsLocal(p) && p.ItemSlots != null) { int targetSlots = TargetSlots; if (p.ItemSlots.Length < targetSlots) { GrabbableObject[] array = p.ItemSlots; Array.Resize(ref array, targetSlots); p.ItemSlots = array; GrowHud(targetSlots); Plugin.Log.LogInfo((object)$"Inventario ampliado a {targetSlots} espacios."); } } } private static void GrowHud(int target) { //IL_0068: 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_004b: 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_0086: 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_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: 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) HUDManager instance = HUDManager.Instance; if ((Object)(object)instance == (Object)null || instance.itemSlotIconFrames == null || instance.itemSlotIconFrames.Length == 0 || instance.itemSlotIconFrames.Length >= target) { return; } int num = instance.itemSlotIconFrames.Length; RectTransform rectTransform = ((Graphic)instance.itemSlotIconFrames[num - 1]).rectTransform; Vector2 val = (Vector2)((num >= 2) ? (rectTransform.anchoredPosition - ((Graphic)instance.itemSlotIconFrames[num - 2]).rectTransform.anchoredPosition) : new Vector2(rectTransform.sizeDelta.x + 10f, 0f)); List list = new List(instance.itemSlotIconFrames); List list2 = new List(instance.itemSlotIcons); for (int i = num; i < target; i++) { GameObject obj = Object.Instantiate(((Component)rectTransform).gameObject, ((Transform)rectTransform).parent); ((Object)obj).name = $"Slot{i}[UpgradableStats]"; obj.GetComponent().anchoredPosition = rectTransform.anchoredPosition + val * (float)(i - num + 1); Image component = obj.GetComponent(); Image val2 = null; Image[] componentsInChildren = obj.GetComponentsInChildren(true); foreach (Image val3 in componentsInChildren) { if ((Object)(object)val3 != (Object)(object)component) { val2 = val3; break; } } if ((Object)(object)val2 != (Object)null) { val2.sprite = null; ((Behaviour)val2).enabled = false; } list.Add(component); list2.Add(((Object)(object)val2 != (Object)null) ? val2 : component); } instance.itemSlotIconFrames = list.ToArray(); instance.itemSlotIcons = list2.ToArray(); } } public class UpgradeRuntime : MonoBehaviour { private void LateUpdate() { StatsEffects.EnforceCarryWeight(); StatsEffects.UpdateWeightLabel(); StatsEffects.UpdateMeleeLabel(); StatsEffects.UpdateStaminaBarVisual(); StatsEffects.UpdateVignettes(); } } internal static class TokenItem { internal static Item Token; internal static GameObject TokenPrefab; private static GameObject _prefabContainer; private static Sprite _icon; private static bool _enriched; private static TerminalNode _buyNode1; private static TerminalNode _buyNode2; internal static bool IsToken(GrabbableObject obj) { if ((Object)(object)obj != (Object)null && (Object)(object)Token != (Object)null) { return (Object)(object)obj.itemProperties == (Object)(object)Token; } return false; } internal static int CountInInventory(PlayerControllerB player) { if ((Object)(object)player == (Object)null || player.ItemSlots == null) { return 0; } int num = 0; for (int i = 0; i < player.ItemSlots.Length; i++) { if (IsToken(player.ItemSlots[i])) { num++; } } return num; } internal static bool ConsumeOne(PlayerControllerB player) { if ((Object)(object)player == (Object)null || player.ItemSlots == null) { return false; } int num = -1; if (player.currentItemSlot >= 0 && player.currentItemSlot < player.ItemSlots.Length && IsToken(player.ItemSlots[player.currentItemSlot])) { num = player.currentItemSlot; } else { for (int i = 0; i < player.ItemSlots.Length; i++) { if (IsToken(player.ItemSlots[i])) { num = i; break; } } } if (num < 0) { return false; } player.DestroyItemInSlotAndSync(num); return true; } internal static void CreateEarly() { //IL_0136: 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) if (!((Object)(object)Token != (Object)null)) { Token = ScriptableObject.CreateInstance(); ((Object)Token).name = "UpgradeTokenItem"; Token.itemName = "Ficha"; Token.itemId = 613001; Token.isScrap = true; Token.twoHanded = false; Token.twoHandedAnimation = false; Token.weight = 1f; Token.creditsWorth = Plugin.TokenBuyPrice.Value; Token.minValue = Plugin.TokenSellValue.Value; Token.maxValue = Plugin.TokenSellValue.Value; Token.requiresBattery = false; Token.saveItemVariable = false; Token.isConductiveMetal = true; Token.itemSpawnsOnGround = true; Token.canBeGrabbedBeforeGameStart = true; Token.highestSalePercentage = 100; Token.itemIcon = GetIcon(); Token.spawnPositionTypes = new List(); Token.toolTips = new string[0]; Token.restingRotation = new Vector3(0f, 0f, 0f); TokenPrefab = BuildPrefab(); Token.spawnPrefab = TokenPrefab; Plugin.Log.LogInfo((object)"Ficha de mejora creada."); } } private static GameObject BuildPrefab() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Expected O, but got Unknown //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Expected O, but got Unknown //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_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: 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) //IL_010b: Unknown result type (might be due to invalid IL or missing references) //IL_0111: 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_0175: Unknown result type (might be due to invalid IL or missing references) //IL_017a: 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_01a6: Unknown result type (might be due to invalid IL or missing references) //IL_01ac: 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) _prefabContainer = new GameObject("UpgradableStats_Prefabs"); _prefabContainer.SetActive(false); Object.DontDestroyOnLoad((Object)(object)_prefabContainer); ((Object)_prefabContainer).hideFlags = (HideFlags)61; GameObject val = new GameObject("UpgradeTokenProp"); val.transform.SetParent(_prefabContainer.transform, false); val.tag = "PhysicsProp"; val.layer = 6; NetworkObject obj = val.AddComponent(); byte[] value = MD5.Create().ComputeHash(Encoding.UTF8.GetBytes("com.martinchavez.upgradablestatsUpgradeTokenProp")); obj.GlobalObjectIdHash = BitConverter.ToUInt32(value, 0); GameObject val2 = new GameObject("Gema"); val2.transform.SetParent(val.transform, false); val2.layer = 6; val2.transform.localScale = new Vector3(1f, 0.45f, 1f); val2.AddComponent().sharedMesh = BuildIcosahedronMesh(0.09f); ((Renderer)val2.AddComponent()).sharedMaterial = UpgradesMachine.MakeMaterial(new Color(0.83f, 0.62f, 0.14f), 1f, 0.62f); val.AddComponent().size = new Vector3(0.16f, 0.09f, 0.16f); AudioSource obj2 = val.AddComponent(); obj2.playOnAwake = false; obj2.spatialBlend = 1f; PhysicsProp obj3 = val.AddComponent(); ((GrabbableObject)obj3).grabbable = true; ((GrabbableObject)obj3).grabbableToEnemies = true; ((GrabbableObject)obj3).itemProperties = Token; GameObject val3 = new GameObject("ScanNode"); val3.transform.SetParent(val.transform, false); int num = LayerMask.NameToLayer("ScanNode"); val3.layer = ((num >= 0) ? num : 22); val3.AddComponent().size = Vector3.one * 0.6f; ScanNodeProperties obj4 = val3.AddComponent(); obj4.headerText = "Ficha de mejora"; obj4.subText = ""; obj4.nodeType = 2; obj4.minRange = 1; obj4.maxRange = 13; obj4.requiresLineOfSight = true; return val; } private static Mesh BuildIcosahedronMesh(float radius) { //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0030: 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_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_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) //IL_0089: 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_00a0: 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_00b8: 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_00d0: 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_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_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Unknown result type (might be due to invalid IL or missing references) //IL_0118: Unknown result type (might be due to invalid IL or missing references) //IL_011d: 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_0136: Unknown result type (might be due to invalid IL or missing references) //IL_033e: Unknown result type (might be due to invalid IL or missing references) //IL_0343: Unknown result type (might be due to invalid IL or missing references) //IL_034e: Unknown result type (might be due to invalid IL or missing references) //IL_0355: Unknown result type (might be due to invalid IL or missing references) //IL_035d: Unknown result type (might be due to invalid IL or missing references) //IL_0363: Unknown result type (might be due to invalid IL or missing references) //IL_036a: Expected O, but got Unknown //IL_0312: Unknown result type (might be due to invalid IL or missing references) //IL_0318: Unknown result type (might be due to invalid IL or missing references) float num = (1f + Mathf.Sqrt(5f)) / 2f; Vector3[] array = (Vector3[])(object)new Vector3[12] { new Vector3(-1f, num, 0f), new Vector3(1f, num, 0f), new Vector3(-1f, 0f - num, 0f), new Vector3(1f, 0f - num, 0f), new Vector3(0f, -1f, num), new Vector3(0f, 1f, num), new Vector3(0f, -1f, 0f - num), new Vector3(0f, 1f, 0f - num), new Vector3(num, 0f, -1f), new Vector3(num, 0f, 1f), new Vector3(0f - num, 0f, -1f), new Vector3(0f - num, 0f, 1f) }; int[][] obj = new int[20][] { new int[3] { 0, 11, 5 }, new int[3] { 0, 5, 1 }, new int[3] { 0, 1, 7 }, new int[3] { 0, 7, 10 }, new int[3] { 0, 10, 11 }, new int[3] { 1, 5, 9 }, new int[3] { 5, 11, 4 }, new int[3] { 11, 10, 2 }, new int[3] { 10, 7, 6 }, new int[3] { 7, 1, 8 }, new int[3] { 3, 9, 4 }, new int[3] { 3, 4, 2 }, new int[3] { 3, 2, 6 }, new int[3] { 3, 6, 8 }, new int[3] { 3, 8, 9 }, new int[3] { 4, 9, 5 }, new int[3] { 2, 4, 11 }, new int[3] { 6, 2, 10 }, new int[3] { 8, 6, 7 }, new int[3] { 9, 8, 1 } }; List list = new List(60); List list2 = new List(60); int[][] array2 = obj; foreach (int[] array3 in array2) { foreach (int num2 in array3) { list2.Add(list.Count); list.Add(((Vector3)(ref array[num2])).normalized * radius); } } Mesh val = new Mesh { name = "FichaIcosaedro" }; val.SetVertices(list); val.SetTriangles(list2, 0); val.RecalculateNormals(); val.RecalculateBounds(); return val; } private static Sprite GetIcon() { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Expected O, but got Unknown //IL_00e1: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Unknown result type (might be due to invalid IL or missing references) //IL_009c: 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_00a5: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_icon != (Object)null) { return _icon; } Texture2D val = new Texture2D(64, 64, (TextureFormat)4, false); Color val2 = default(Color); ((Color)(ref val2))..ctor(0.9f, 0.72f, 0.2f, 1f); Color val3 = default(Color); ((Color)(ref val3))..ctor(0.55f, 0.4f, 0.08f, 1f); Color val4 = default(Color); ((Color)(ref val4))..ctor(0f, 0f, 0f, 0f); for (int i = 0; i < 64; i++) { for (int j = 0; j < 64; j++) { int num = Mathf.Abs(j - 32) + Mathf.Abs(i - 32); val.SetPixel(j, i, (num <= 26) ? ((num > 22) ? val3 : val2) : val4); } } val.Apply(); _icon = Sprite.Create(val, new Rect(0f, 0f, 64f, 64f), new Vector2(0.5f, 0.5f), 100f); return _icon; } internal static void RegisterNetworkPrefab() { if (!((Object)(object)TokenPrefab == (Object)null) && !((Object)(object)NetworkManager.Singleton == (Object)null) && !NetworkManager.Singleton.NetworkConfig.Prefabs.Contains(TokenPrefab)) { NetworkManager.Singleton.AddNetworkPrefab(TokenPrefab); Plugin.Log.LogInfo((object)"Prefab de la Ficha registrado en red."); } } internal static void SetupEarlyInGame() { if (!((Object)(object)Token == (Object)null) && !((Object)(object)StartOfRound.Instance == (Object)null)) { EnrichFromGift(); RegisterInAllItemsList(); } } internal static void SetupInGame() { if (!((Object)(object)Token == (Object)null) && !((Object)(object)StartOfRound.Instance == (Object)null)) { SetupEarlyInGame(); AddToLevels(); Terminal val = Object.FindObjectOfType(); if ((Object)(object)val != (Object)null) { RegisterInShop(val); } else { Plugin.Log.LogWarning((object)"No encontré la Terminal para registrar la compra de fichas."); } } } private static void EnrichFromGift() { if (!_enriched) { List itemsList = StartOfRound.Instance.allItemsList.itemsList; Item val = ((IEnumerable)itemsList).FirstOrDefault((Func)((Item x) => (Object)(object)x != (Object)null && (Object)(object)x.spawnPrefab != (Object)null && (Object)(object)x.spawnPrefab.GetComponent() != (Object)null)) ?? ((IEnumerable)itemsList).FirstOrDefault((Func)((Item x) => (Object)(object)x != (Object)null && x.itemName == "Gift")); if ((Object)(object)val == (Object)null) { Plugin.Log.LogWarning((object)"No encontré el ítem 'Gift'; la Ficha usará valores por defecto."); return; } Token.spawnPositionTypes = new List(val.spawnPositionTypes); Token.grabSFX = val.grabSFX; Token.dropSFX = val.dropSFX; Token.pocketSFX = val.pocketSFX; Token.throwSFX = val.throwSFX; Token.grabAnim = val.grabAnim; Token.pocketAnim = val.pocketAnim; Token.grabAnimationTime = val.grabAnimationTime; Token.floorYOffset = val.floorYOffset; _enriched = true; } } private static void RegisterInAllItemsList() { List itemsList = StartOfRound.Instance.allItemsList.itemsList; if (!itemsList.Contains(Token)) { itemsList.Add(Token); } } private static void AddToLevels() { //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Expected O, but got Unknown SelectableLevel[] levels = StartOfRound.Instance.levels; foreach (SelectableLevel val in levels) { if (!((Object)(object)val == (Object)null) && val.spawnableScrap != null && !val.spawnableScrap.Any((SpawnableItemWithRarity s) => s != null && (Object)(object)s.spawnableItem == (Object)(object)Token)) { int num = ((IEnumerable)val.spawnableScrap).FirstOrDefault((Func)((SpawnableItemWithRarity s) => s != null && (Object)(object)s.spawnableItem != (Object)null && (s.spawnableItem.itemName == "Gift" || ((Object)(object)s.spawnableItem.spawnPrefab != (Object)null && (Object)(object)s.spawnableItem.spawnPrefab.GetComponent() != (Object)null))))?.rarity ?? Plugin.TokenFallbackRarity.Value; if (num > 0) { val.spawnableScrap.Add(new SpawnableItemWithRarity(Token, num)); } } } Plugin.Log.LogInfo((object)"Ficha añadida a las lunas con la rareza del Regalo."); } private static void RegisterInShop(Terminal terminal) { //IL_0273: Unknown result type (might be due to invalid IL or missing references) //IL_0279: Expected O, but got Unknown //IL_027f: Unknown result type (might be due to invalid IL or missing references) //IL_0285: Expected O, but got Unknown //IL_02fc: Unknown result type (might be due to invalid IL or missing references) //IL_0306: Expected O, but got Unknown //IL_0357: Unknown result type (might be due to invalid IL or missing references) //IL_0361: Expected O, but got Unknown List list = terminal.buyableItemsList.ToList(); if (!list.Contains(Token)) { list.Add(Token); } terminal.buyableItemsList = list.ToArray(); int buyItemIndex = list.IndexOf(Token); if ((Object)(object)_buyNode1 != (Object)null && (Object)(object)_buyNode2 != (Object)null) { _buyNode1.buyItemIndex = buyItemIndex; _buyNode2.buyItemIndex = buyItemIndex; } else if (!terminal.terminalNodes.allKeywords.Any((TerminalKeyword k) => (Object)(object)k != (Object)null && k.word == "ficha")) { TerminalKeyword val = terminal.terminalNodes.allKeywords.First((TerminalKeyword k) => k.word == "buy"); TerminalKeyword val2 = terminal.terminalNodes.allKeywords.First((TerminalKeyword k) => k.word == "confirm"); TerminalKeyword val3 = terminal.terminalNodes.allKeywords.First((TerminalKeyword k) => k.word == "deny"); TerminalKeyword val4 = terminal.terminalNodes.allKeywords.First((TerminalKeyword k) => k.word == "info"); TerminalNode result = val.compatibleNouns[0].result.terminalOptions[1].result; int value = Plugin.TokenBuyPrice.Value; _buyNode2 = ScriptableObject.CreateInstance(); ((Object)_buyNode2).name = "FichaBuyNode2"; _buyNode2.displayText = "Ordered [variableAmount] Fichas. Your new balance is [playerCredits].\n\nLa maquina de mejoras espera tu proxima visita.\r\n\r\n"; _buyNode2.clearPreviousText = true; _buyNode2.maxCharactersToType = 15; _buyNode2.buyItemIndex = buyItemIndex; _buyNode2.isConfirmationNode = false; _buyNode2.itemCost = value; _buyNode2.playSyncedClip = 0; _buyNode1 = ScriptableObject.CreateInstance(); ((Object)_buyNode1).name = "FichaBuyNode1"; _buyNode1.displayText = "You have requested to order Fichas. Amount: [variableAmount].\nTotal cost of items: [totalCost].\n\nPlease CONFIRM or DENY.\r\n\r\n"; _buyNode1.clearPreviousText = true; _buyNode1.maxCharactersToType = 35; _buyNode1.buyItemIndex = buyItemIndex; _buyNode1.isConfirmationNode = true; _buyNode1.overrideOptions = true; _buyNode1.itemCost = value; _buyNode1.terminalOptions = (CompatibleNoun[])(object)new CompatibleNoun[2] { new CompatibleNoun(val2, _buyNode2), new CompatibleNoun(val3, result) }; TerminalKeyword val5 = ScriptableObject.CreateInstance(); ((Object)val5).name = "FichaKeyword"; val5.word = "ficha"; val5.isVerb = false; val5.defaultVerb = val; List list2 = terminal.terminalNodes.allKeywords.ToList(); list2.Add(val5); terminal.terminalNodes.allKeywords = list2.ToArray(); List list3 = val.compatibleNouns.ToList(); list3.Add(new CompatibleNoun(val5, _buyNode1)); val.compatibleNouns = list3.ToArray(); TerminalNode val6 = ScriptableObject.CreateInstance(); ((Object)val6).name = "FichaInfoNode"; val6.displayText = "FICHA\nMoneda romboidal de oro.\nInsertala en la maquina de mejoras de la nave para potenciar tus habilidades... o vendela a la Compania.\n\n"; val6.clearPreviousText = true; val6.maxCharactersToType = 25; List list4 = val4.compatibleNouns.ToList(); list4.Add(new CompatibleNoun(val5, val6)); val4.compatibleNouns = list4.ToArray(); Plugin.Log.LogInfo((object)$"Ficha en la terminal: \"buy ficha\" por {value} créditos."); } } } public enum UpgradeSkill { Health, Stamina, Strength, Inventory } public static class UpgradeInfo { public const int SkillCount = 4; public static int MaxLevel(UpgradeSkill skill) { if (skill != UpgradeSkill.Health) { return 3; } return 4; } public static string DisplayName(UpgradeSkill skill) { return skill switch { UpgradeSkill.Health => "HEALTH", UpgradeSkill.Stamina => "STAMINA", UpgradeSkill.Strength => "STRENGTH", UpgradeSkill.Inventory => "INVENTORY", _ => "???", }; } public static string NextEffect(UpgradeSkill skill, int currentLevel) { if (currentLevel >= MaxLevel(skill)) { return "MAX LEVEL REACHED"; } switch (skill) { case UpgradeSkill.Health: if (currentLevel >= 3) { return "SECOND WIND: survive a lethal hit with 1 HP"; } return "+33% max health"; case UpgradeSkill.Stamina: return "+25% stamina bar"; case UpgradeSkill.Strength: return "-25% carry weight + 50% melee damage"; case UpgradeSkill.Inventory: return "+1 inventory slot"; default: return ""; } } } public class PlayerUpgrades { private readonly int[] _levels = new int[4]; public float HealthMultiplier => 1f + 0.33f * (float)Mathf.Min(GetLevel(UpgradeSkill.Health), 3); public bool HasSecondWind => GetLevel(UpgradeSkill.Health) >= 4; public float StaminaMultiplier => 1f + 0.25f * (float)GetLevel(UpgradeSkill.Stamina); public float MeleeMultiplier => 1f + 0.5f * (float)GetLevel(UpgradeSkill.Strength); public int ExtraSlots => GetLevel(UpgradeSkill.Inventory); public int GetLevel(UpgradeSkill skill) { return _levels[(int)skill]; } public bool CanUpgrade(UpgradeSkill skill) { return GetLevel(skill) < UpgradeInfo.MaxLevel(skill); } public bool TryUpgrade(UpgradeSkill skill) { if (!CanUpgrade(skill)) { return false; } _levels[(int)skill]++; return true; } public void ResetAll() { for (int i = 0; i < _levels.Length; i++) { _levels[i] = 0; } } public int[] ExportLevels() { return (int[])_levels.Clone(); } public void ImportLevels(int[] levels) { if (levels != null) { for (int i = 0; i < _levels.Length && i < levels.Length; i++) { _levels[i] = Mathf.Clamp(levels[i], 0, UpgradeInfo.MaxLevel((UpgradeSkill)i)); } } } } public class UpgradeMenuUI : MonoBehaviour { [CompilerGenerated] private static class <>O { public static UnityAction <0>__Close; } private GameObject _root; private PlayerControllerB _player; private readonly TextMeshProUGUI[] _effectLabels = (TextMeshProUGUI[])(object)new TextMeshProUGUI[4]; private readonly TextMeshProUGUI[] _buttonLabels = (TextMeshProUGUI[])(object)new TextMeshProUGUI[4]; private readonly Button[] _buttons = (Button[])(object)new Button[4]; private readonly Image[][] _pips = new Image[4][]; private TextMeshProUGUI _tokensLabel; private TextMeshProUGUI _statusLabel; private TextMeshProUGUI _subtitle; private static readonly Color BronzeGreen = new Color(0.24f, 0.4f, 0.31f, 1f); private static readonly Color Bronze = new Color(0.72f, 0.53f, 0.22f, 1f); private static readonly Color PanelBg = new Color(0.05f, 0.07f, 0.06f, 0.94f); private static readonly Color PipEmpty = new Color(0.16f, 0.18f, 0.16f, 1f); private static readonly Color TextDim = new Color(0.62f, 0.68f, 0.62f, 1f); private static readonly Color WarnRed = new Color(0.85f, 0.35f, 0.25f, 1f); private static readonly Color OkGreen = new Color(0.45f, 0.85f, 0.45f, 1f); private static TMP_FontAsset _cachedFont; public static UpgradeMenuUI Instance { get; private set; } public static bool IsOpen { get { if ((Object)(object)Instance != (Object)null && (Object)(object)Instance._root != (Object)null) { return Instance._root.activeSelf; } return false; } } public static void Open(PlayerControllerB player) { //IL_0056: 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_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Expected O, but got Unknown if ((Object)(object)Instance == (Object)null) { GameObject val = new GameObject("UpgradableStats_MenuHost"); Object.DontDestroyOnLoad((Object)val); Instance = val.AddComponent(); Instance.Build(); } Instance._player = player; Instance._root.SetActive(true); Instance.SetStatus("", Color.clear); Instance.Refresh(); player.inSpecialMenu = true; Cursor.lockState = (CursorLockMode)0; Cursor.visible = true; if ((Object)(object)player.cursorIcon != (Object)null) { ((Behaviour)player.cursorIcon).enabled = false; } if ((Object)(object)player.cursorTip != (Object)null) { ((TMP_Text)player.cursorTip).text = ""; } player.hoveringOverTrigger = null; } public static void Close() { if (IsOpen) { Instance._root.SetActive(false); PlayerControllerB player = Instance._player; if ((Object)(object)player != (Object)null) { player.inSpecialMenu = false; Cursor.lockState = (CursorLockMode)1; Cursor.visible = false; } Instance._player = null; } } private void OnUpgradeClicked(UpgradeSkill skill) { //IL_0020: 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_004a: Unknown result type (might be due to invalid IL or missing references) PlayerUpgrades localUpgrades = Plugin.LocalUpgrades; if (!localUpgrades.CanUpgrade(skill)) { SetStatus(UpgradeInfo.DisplayName(skill) + " is already at max level.", TextDim); return; } if (!Plugin.FreeUpgrades.Value && !TokenItem.ConsumeOne(_player)) { SetStatus("YOU NEED A FICHA — found on moons, or type \"buy ficha\" in the terminal.", WarnRed); return; } localUpgrades.TryUpgrade(skill); StatsEffects.OnUpgraded(skill); UpgradeSync.OnLocalLevelsChanged(); int level = localUpgrades.GetLevel(skill); SetStatus($"{UpgradeInfo.DisplayName(skill)} upgraded to level {level}.", OkGreen); Plugin.Log.LogInfo((object)$"Mejora aplicada: {UpgradeInfo.DisplayName(skill)} -> nivel {level}"); Refresh(); } private void Refresh() { //IL_005d: 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_004f: 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_00b5: 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_0154: Unknown result type (might be due to invalid IL or missing references) PlayerUpgrades localUpgrades = Plugin.LocalUpgrades; bool value = Plugin.FreeUpgrades.Value; int num = TokenItem.CountInInventory(_player); ((TMP_Text)_tokensLabel).text = (value ? "TEST MODE: FREE UPGRADES" : $"FICHAS IN YOUR INVENTORY: {num}"); ((Graphic)_tokensLabel).color = (value ? TextDim : ((num > 0) ? Bronze : TextDim)); ((TMP_Text)_subtitle).text = (value ? "UPGRADE MACHINE // CONFIG: MejorasGratis = true" : "UPGRADE MACHINE // 1 FICHA PER UPGRADE"); for (int i = 0; i < 4; i++) { UpgradeSkill skill = (UpgradeSkill)i; int level = localUpgrades.GetLevel(skill); bool flag = localUpgrades.CanUpgrade(skill); for (int j = 0; j < _pips[i].Length; j++) { ((Graphic)_pips[i][j]).color = ((j < level) ? Bronze : PipEmpty); } ((TMP_Text)_effectLabels[i]).text = UpgradeInfo.NextEffect(skill, level); ((Selectable)_buttons[i]).interactable = flag; ((TMP_Text)_buttonLabels[i]).text = ((!flag) ? "MAX" : (value ? "UPGRADE" : "UPGRADE · 1 FICHA")); Image component = ((Component)_buttons[i]).GetComponent(); if ((Object)(object)component != (Object)null) { ((Graphic)component).color = (Color)(flag ? BronzeGreen : new Color(0.12f, 0.13f, 0.12f)); } } } private void SetStatus(string text, Color color) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) ((TMP_Text)_statusLabel).text = text; ((Graphic)_statusLabel).color = color; } private void Build() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Expected O, but got Unknown //IL_005f: 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_00b0: 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_00d7: 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_00f0: Unknown result type (might be due to invalid IL or missing references) //IL_010b: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Unknown result type (might be due to invalid IL or missing references) //IL_0124: Unknown result type (might be due to invalid IL or missing references) //IL_0144: 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_015d: Unknown result type (might be due to invalid IL or missing references) //IL_0183: Unknown result type (might be due to invalid IL or missing references) //IL_0192: Unknown result type (might be due to invalid IL or missing references) //IL_019c: 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_01d5: Unknown result type (might be due to invalid IL or missing references) //IL_01df: Unknown result type (might be due to invalid IL or missing references) //IL_022b: Unknown result type (might be due to invalid IL or missing references) //IL_023a: Unknown result type (might be due to invalid IL or missing references) //IL_0244: Unknown result type (might be due to invalid IL or missing references) //IL_026d: Unknown result type (might be due to invalid IL or missing references) //IL_027c: Unknown result type (might be due to invalid IL or missing references) //IL_02a0: 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_02ab: Expected O, but got Unknown _root = new GameObject("UpgradeCanvas"); _root.transform.SetParent(((Component)this).transform, false); Canvas obj = _root.AddComponent(); obj.renderMode = (RenderMode)0; obj.sortingOrder = 1000; CanvasScaler obj2 = _root.AddComponent(); obj2.uiScaleMode = (ScaleMode)1; obj2.referenceResolution = new Vector2(1920f, 1080f); _root.AddComponent(); if ((Object)(object)EventSystem.current == (Object)null) { Plugin.Log.LogWarning((object)"No hay EventSystem en la escena: los botones podrían no responder."); } RectTransform val = NewRect("Panel", _root.transform, new Vector2(940f, 640f), Vector2.zero); AddImage(val, PanelBg); AddImage(NewRect("BarraSup", (Transform)(object)val, new Vector2(940f, 6f), new Vector2(0f, 317f)), Bronze); AddImage(NewRect("BarraInf", (Transform)(object)val, new Vector2(940f, 6f), new Vector2(0f, -317f)), Bronze); AddText((Transform)(object)val, "Titulo", "UPGRADES", new Vector2(600f, 60f), new Vector2(0f, 265f), 40f, Bronze, (TextAlignmentOptions)514); _subtitle = AddText((Transform)(object)val, "Sub", "UPGRADE MACHINE", new Vector2(900f, 30f), new Vector2(0f, 225f), 18f, TextDim, (TextAlignmentOptions)514); _tokensLabel = AddText((Transform)(object)val, "Fichas", "", new Vector2(900f, 30f), new Vector2(0f, 193f), 20f, Bronze, (TextAlignmentOptions)514); for (int i = 0; i < 4; i++) { BuildSkillRow(val, (UpgradeSkill)i, 128f - (float)i * 92f); } _statusLabel = AddText((Transform)(object)val, "Estado", "", new Vector2(900f, 30f), new Vector2(0f, -245f), 17f, TextDim, (TextAlignmentOptions)514); ButtonClickedEvent onClick = AddButton((Transform)(object)val, "Cerrar", "CLOSE [ESC]", new Vector2(260f, 46f), new Vector2(0f, -285f), 20f).onClick; object obj3 = <>O.<0>__Close; if (obj3 == null) { UnityAction val2 = Close; <>O.<0>__Close = val2; obj3 = (object)val2; } ((UnityEvent)onClick).AddListener((UnityAction)obj3); } private void BuildSkillRow(RectTransform parent, UpgradeSkill skill, float y) { //IL_0030: 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_004b: 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_0093: 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_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Unknown result type (might be due to invalid IL or missing references) //IL_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) //IL_015d: 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_01a2: Expected O, but got Unknown AddText((Transform)(object)parent, $"Nombre{(int)skill}", UpgradeInfo.DisplayName(skill), new Vector2(260f, 40f), new Vector2(-320f, y + 12f), 26f, Color.white, (TextAlignmentOptions)513); _effectLabels[(int)skill] = AddText((Transform)(object)parent, $"Efecto{(int)skill}", "", new Vector2(560f, 28f), new Vector2(-170f, y - 18f), 16f, TextDim, (TextAlignmentOptions)513); int num = UpgradeInfo.MaxLevel(skill); _pips[(int)skill] = (Image[])(object)new Image[num]; for (int i = 0; i < num; i++) { RectTransform rt = NewRect($"Pip{(int)skill}_{i}", (Transform)(object)parent, new Vector2(26f, 26f), new Vector2(50f + (float)i * 34f, y + 12f)); _pips[(int)skill][i] = AddImage(rt, PipEmpty); } Button val = AddButton((Transform)(object)parent, $"Btn{(int)skill}", "MEJORAR", new Vector2(230f, 52f), new Vector2(330f, y), 18f); _buttons[(int)skill] = val; _buttonLabels[(int)skill] = ((Component)val).GetComponentInChildren(); UpgradeSkill captured = skill; ((UnityEvent)val.onClick).AddListener((UnityAction)delegate { OnUpgradeClicked(captured); }); } private static RectTransform NewRect(string name, Transform parent, Vector2 size, Vector2 anchoredPos) { //IL_0014: 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_0040: 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_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0048: 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_0056: Unknown result type (might be due to invalid IL or missing references) RectTransform component = new GameObject(name, new Type[1] { typeof(RectTransform) }).GetComponent(); ((Transform)component).SetParent(parent, false); Vector2 val = default(Vector2); ((Vector2)(ref val))..ctor(0.5f, 0.5f); component.pivot = val; Vector2 anchorMin = (component.anchorMax = val); component.anchorMin = anchorMin; component.sizeDelta = size; component.anchoredPosition = anchoredPos; return component; } private static Image AddImage(RectTransform rt, Color color) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) Image obj = ((Component)rt).gameObject.AddComponent(); ((Graphic)obj).color = color; return obj; } private static TextMeshProUGUI AddText(Transform parent, string name, string text, Vector2 size, Vector2 pos, float fontSize, Color color, TextAlignmentOptions align) { //IL_0002: 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_0025: 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) TextMeshProUGUI val = ((Component)NewRect(name, parent, size, pos)).gameObject.AddComponent(); ((TMP_Text)val).text = text; ((TMP_Text)val).fontSize = fontSize; ((Graphic)val).color = color; ((TMP_Text)val).alignment = align; ((TMP_Text)val).enableWordWrapping = false; ((Graphic)val).raycastTarget = false; TMP_FontAsset font = GetFont(); if ((Object)(object)font != (Object)null) { ((TMP_Text)val).font = font; } return val; } private static Button AddButton(Transform parent, string name, string label, Vector2 size, Vector2 pos, float fontSize) { //IL_0002: 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_000c: 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_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0032: 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_0068: 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_008e: Unknown result type (might be due to invalid IL or missing references) //IL_009b: 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_00a3: Unknown result type (might be due to invalid IL or missing references) RectTransform val = NewRect(name, parent, size, pos); Image targetGraphic = AddImage(val, BronzeGreen); Button obj = ((Component)val).gameObject.AddComponent