using PrizeSystem; using System; using System.Collections.Generic; using TMPro; using UnityEngine; using UnityEngine.UI; public class PrizeView : MonoBehaviour { [SerializeField] private Image _image; [SerializeField] private TextMeshProUGUI _label; public Prize Prize; public void SetPrize(Prize prize) { if (prize == null || prize is EmptyPrize) { _image.sprite = prize is EmptyPrize ? PrizeSystemManager.GetPrizeIcon(PrizeType.None) : null; _label.text = GetPrizeText(prize); Prize = prize; return; } _image.sprite = PrizeSystemManager.GetPrizeIcon(prize.PrizeType); _label.text = GetText(prize); _label.rectTransform.sizeDelta = new Vector2(_label.preferredWidth, _label.rectTransform.sizeDelta.y); Prize = prize; } public void Clear() { _image.sprite = null; _label.text = ""; Prize = null; } private string GetText(Prize prize) => GetPrizeText(prize); public static string GetPrizeText(Prize prize) { if (prize == null || prize is EmptyPrize) { return "Пусто"; } else if (prize is CountablePrize cp) { return prize.PrizeType switch { PrizeType.Hopper => $"{cp.Amount} {Pluralize(cp.Amount, "маленький приз", "маленьких приза", "маленьких призов")}", PrizeType.Ticket => $"{cp.Amount} {Pluralize(cp.Amount, "билет", "билета", "билетов")}", PrizeType.Marbles => $"{cp.Amount} марблс", _ => "Приз" }; } else if (prize is VitrinaPrize vp) { return $"Витрина ячейки: {string.Join(" | ", vp.Boxes)}"; } else if (prize is QrPrize qp) { return $"QR: {qp.PrizeText}"; } return ""; } /// /// Возвращает правильную форму существительного для русского языка в зависимости от числа /// /// Количество предметов /// Форма для 1 (именительный падеж, ед.ч.): "яблоко" /// Форма для 2-4 (родительный падеж, ед.ч.): "яблока" /// Форма для 5+ (родительный падеж, мн.ч.): "яблок" /// Правильная форма существительного public static string Pluralize(int count, string form1, string form2, string form3) { // Приводим число к положительному виду для корректной работы с остатками int absCount = Mathf.Abs(count); // Определяем остатки для проверки правил long lastTwoDigits = absCount % 100; long lastDigit = absCount % 10; // Особый случай: числа от 11 до 19 всегда используют форму 3 if (lastTwoDigits >= 11 && lastTwoDigits <= 19) { return form3; } // Обычные правила склонения switch (lastDigit) { case 1: return form1; case 2: case 3: case 4: return form2; default: return form3; } } }