111 lines
4.1 KiB
C#
111 lines
4.1 KiB
C#
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;
|
||
}
|
||
}
|
||
|