sea-battle/Assets/Scripts/UI/Panels/BossesPageController.cs

111 lines
4.1 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// Контроллер 3-й страницы правил.
/// При активации страницы читает призы боссов из PrizeSerializer
/// и показывает/скрывает блок приза для каждого босса.
///
/// Структура одного слота в инспекторе:
/// BossSlot:
/// prizeContainer — GameObject с картинкой «путь к призу» + картинкой самого приза
/// prizeImage — Image внутри prizeContainer, куда подставляется спрайт приза
///
/// Маппинг PrizeType → Sprite задаётся массивом prizeSprites.
/// </summary>
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<Prize> 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);
}
}
}
/// <summary>
/// «Жетоны x5» если количество > 1, иначе просто «Жетоны».
/// </summary>
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;
}
}