using System; using System.Numerics; using System.Security.Cryptography; using System.Text; using TMPro; using UnityEngine; using UnityEngine.UI; public static class Tools { public static Sprite GetIconForUser(BigInteger user) { if (user == 1) return Resources.Load("Icons/Icons/bird_-1"); else if (user == 2) return Resources.Load("Icons/Icons/bird_-2"); else if (user == 4) return Resources.Load("Icons/Icons/bird_-3"); else if (user == 3) return Resources.Load("Icons/Icons/bird_-4"); else return Resources.Load("Icons/Icons/bird_1"); } public static string FormatWithCommas(string number) { try { return FormatWithCommas(BigInteger.Parse(number)); } catch { return number; } } public static string FormatWithCommas(BigInteger number) { return string.Format("{0:N0}", number); } public static void UpdateStatusText(TMP_Text statusText, string message, Color color) { statusText.text = message; statusText.color = color; } public static void RenderFromBase64(string base64, Image targetImage) { byte[] imageData = Convert.FromBase64String(base64); Texture2D tex = new(2, 2, TextureFormat.ARGB32, false); if (!tex.LoadImage(imageData)) return; tex.filterMode = FilterMode.Point; tex.Apply(false, false); Sprite sprite = Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), new UnityEngine.Vector2(0.5f, 0.5f)); targetImage.sprite = sprite; } public static void RenderFromBase64(string base64, SpriteRenderer targetImage) { byte[] imageData = Convert.FromBase64String(base64); Texture2D tex = new(2, 2, TextureFormat.ARGB32, false); if (!tex.LoadImage(imageData)) return; tex.filterMode = FilterMode.Point; tex.Apply(false, false); Sprite sprite = Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), new UnityEngine.Vector2(0.5f, 0.5f)); targetImage.sprite = sprite; } public static void RefreshHierarchy(GameObject root) { foreach (Transform child in root.transform) RefreshHierarchy(child.gameObject); if (root.TryGetComponent(out var rect)) LayoutRebuilder.ForceRebuildLayoutImmediate(rect); } public static string Sha512Sum(byte[] data) { using var sha512 = SHA512.Create(); var hash = sha512.ComputeHash(data); var sb = new StringBuilder(hash.Length * 2); foreach (var b in hash) sb.Append(b.ToString("x2")); return sb.ToString(); } public static (BigInteger totalXp, double level, BigInteger currentXpInLevel, BigInteger totalXpForLevel, double percentDone) GetLevelInfo() { BigInteger totalXp = 0; totalXp += BazookaManager.Instance.GetGameStoreTotalNormalBerries(); totalXp -= BazookaManager.Instance.GetGameStoreTotalPoisonBerries(); totalXp -= BazookaManager.Instance.GetGameStoreTotalSlowBerries(); totalXp += BazookaManager.Instance.GetGameStoreTotalUltraBerries() * 5; totalXp += BazookaManager.Instance.GetGameStoreTotalSpeedyBerries() * 10; totalXp += BazookaManager.Instance.GetGameStoreTotalCoinBerries() * 10; if (totalXp < 0) totalXp = 0; double levelDivisor = 50.0; double discriminant = 95 * 95 + levelDivisor * 2 * (double)totalXp; double level = (-95 + Math.Sqrt(discriminant)) / levelDivisor; double flooredLevel = Math.Floor(level); BigInteger xpAtStartOfLevel = (BigInteger)(levelDivisor / 2 * flooredLevel * flooredLevel + 95 * flooredLevel); double nextLevel = flooredLevel + 1; BigInteger xpAtNextLevel = (BigInteger)(levelDivisor / 2 * nextLevel * nextLevel + 95 * nextLevel); BigInteger totalXpForLevel = xpAtNextLevel - xpAtStartOfLevel; BigInteger currentXpInLevel = totalXp - xpAtStartOfLevel; double percentDone = totalXpForLevel == 0 ? 0.0 : (double)currentXpInLevel / (double)totalXpForLevel * 100.0; return (totalXp, flooredLevel, currentXpInLevel, totalXpForLevel, percentDone); } }