using System; using System.Collections.Generic; using TMPro; using UnityEngine; using UnityEngine.UI; /// /// Контроллер 3-й страницы правил. /// При активации страницы читает призы боссов из PrizeSerializer /// и показывает/скрывает блок приза для каждого босса. /// /// Структура одного слота в инспекторе: /// BossSlot: /// prizeContainer — GameObject с картинкой «путь к призу» + картинкой самого приза /// prizeImage — Image внутри prizeContainer, куда подставляется спрайт приза /// /// Маппинг PrizeType → Sprite задаётся массивом prizeSprites. /// public class BossesPageController : MonoBehaviour { // ─── Маппинг PrizeType → Sprite ────────────────────────────── [Serializable] public class PrizeEntry { public PrizeType type; public Sprite sprite; [Tooltip("Отображаемое имя типа приза (например «Жетоны»)")] public string displayName; } [Header("Маппинг: тип приза → спрайт")] [SerializeField] private PrizeEntry[] prizeSprites; // ─── Слоты боссов ───────────────────────────────────────────── [Serializable] public class BossSlot { [Tooltip("Корневой GO блока приза (картинка пути + картинка приза)")] public GameObject prizeContainer; [Tooltip("Image внутри prizeContainer, куда подставляется спрайт приза")] public Image prizeImage; [Tooltip("TMP_Text: тип приза и количество (если > 1)")] public TMP_Text prizeLabel; } [Header("Слоты боссов (порядок = индекс в PrizeSerializer, 0..4)")] [SerializeField] private BossSlot[] bossSlots; // ─── Unity ──────────────────────────────────────────────────── private void OnEnable() { Refresh(); } // ─── Logic ──────────────────────────────────────────────────── private void Refresh() { List prizes = PrizeSerializer.GetPrizes(); for (int i = 0; i < bossSlots.Length; i++) { BossSlot slot = bossSlots[i]; if (slot == null || slot.prizeContainer == null) continue; bool hasPrize = i < prizes.Count && prizes[i].PrizeType != PrizeType.None; slot.prizeContainer.SetActive(hasPrize); if (hasPrize) { Prize prize = prizes[i]; if (slot.prizeImage != null) slot.prizeImage.sprite = FindSprite(prize.PrizeType); if (slot.prizeLabel != null) slot.prizeLabel.text = BuildLabel(prize); } } } /// /// «Жетоны x5» если количество > 1, иначе просто «Жетоны». /// private string BuildLabel(Prize prize) { PrizeEntry entry = FindEntry(prize.PrizeType); string label = entry != null && !string.IsNullOrWhiteSpace(entry.displayName) ? entry.displayName : prize.PrizeType.ToString(); return prize.Amount > 1 ? $"{label} x{prize.Amount}" : label; } private Sprite FindSprite(PrizeType type) => FindEntry(type)?.sprite; private PrizeEntry FindEntry(PrizeType type) { if (prizeSprites == null) return null; foreach (var e in prizeSprites) if (e.type == type) return e; return null; } }