using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
///
/// Контроллер карты боссов.
/// При активации читает currentBotLevel из GameManager и призы из PrizeSerializer.
///
/// Для каждого слота:
/// • побеждён (index < currentBotLevel) → серый аватар, фон «победы», оверлей с крестом
/// • есть приз → prizeContainer активен, спрайт и подпись подставляются
/// • приза нет → prizeContainer скрыт
///
public class BossMapController : MonoBehaviour
{
// ─── Маппинг PrizeType → Sprite ──────────────────────────────
[System.Serializable]
public class PrizeEntry
{
public PrizeType type;
public Sprite sprite;
[Tooltip("Отображаемое имя (например «Жетоны»)")]
public string displayName;
}
[Header("Маппинг: тип приза → спрайт")]
[SerializeField] private PrizeEntry[] prizeSprites;
// ─── Слоты боссов ─────────────────────────────────────────────
[System.Serializable]
public class BossSlot
{
[Header("Аватар и фон")]
[Tooltip("Image аватара — станет серым при победе")]
public Image bossImage;
[Tooltip("Image фона — меняет спрайт при победе")]
public Image bossBackground;
[Tooltip("Спрайт фона когда босс не побеждён")]
public Sprite backgroundNormal;
[Tooltip("Спрайт фона когда босс побеждён")]
public Sprite backgroundDefeated;
[Header("Крест победы")]
[Tooltip("GO с картинкой креста — включается когда босс побеждён")]
public GameObject defeatedOverlay;
[Header("Приз")]
[Tooltip("Корневой GO блока приза — скрывается если приза нет")]
public GameObject prizeContainer;
[Tooltip("Image куда подставляется спрайт приза")]
public Image prizeImage;
[Tooltip("TMP_Text: название приза и количество (если > 1)")]
public TMP_Text prizeLabel;
}
[Header("Слоты боссов (0..4, порядок = индекс босса)")]
[SerializeField] private BossSlot[] bossSlots;
[Header("GameManager (для currentBotLevel и gameMode)")]
[SerializeField] private GameManager gameManager;
[Tooltip("Корневой GO с визуальным содержимым карты — скрывается в режиме PvP")]
[SerializeField] private GameObject contentRoot;
private static readonly Color DefeatedColor = new Color(0.35f, 0.35f, 0.35f, 1f);
// ─── Unity ────────────────────────────────────────────────────
private void OnEnable()
{
bool isBotMode = gameManager != null && gameManager.gameMode == GameMode.PlayerVsBot;
if (contentRoot != null)
contentRoot.SetActive(isBotMode);
if (isBotMode)
Refresh();
}
// ─── Logic ────────────────────────────────────────────────────
private void Refresh()
{
int currentLevel = gameManager != null ? gameManager.currentBotLevel : 0;
List prizes = PrizeSerializer.GetPrizes();
for (int i = 0; i < bossSlots.Length; i++)
{
BossSlot slot = bossSlots[i];
if (slot == null) continue;
bool isDefeated = i < currentLevel;
// Аватар: серый если побеждён
if (slot.bossImage != null)
slot.bossImage.color = isDefeated ? DefeatedColor : Color.white;
// Фон: меняем спрайт
if (slot.bossBackground != null)
{
Sprite bg = isDefeated ? slot.backgroundDefeated : slot.backgroundNormal;
if (bg != null) slot.bossBackground.sprite = bg;
}
// Крест: активен только у побеждённых
if (slot.defeatedOverlay != null)
slot.defeatedOverlay.SetActive(isDefeated);
// Приз
if (slot.prizeContainer == null) continue;
// Приз показываем только если босс ещё не побеждён
bool hasPrize = !isDefeated && 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);
}
}
}
// ─── Helpers ──────────────────────────────────────────────────
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;
}
}