using UnityEngine;
using RR.Common.Controls;
using RR.Common.Settings;
using RR.Game2D.Core.Managers;
namespace RR.Game2D.Behaviour
{
///
/// Компонент финиша уровня с возможностью выдачи маленького приза.
/// Устанавливается на объект с триггером и тегом "Finish".
///
[RequireComponent(typeof(Collider2D))]
public class LevelFinish : MonoBehaviour
{
[Header("Настройки приза")]
[Tooltip("Включить выдачу приза при завершении уровня")]
[SerializeField] private bool enablePrizeOnFinish = true;
[Tooltip("Ключ настройки для проверки включения выдачи призов (если пусто - не проверяется)")]
[SerializeField] private string prizeEnabledSettingKey = "prizes.giveSmallPrize";
[Tooltip("Задержка перед выдачей приза (в секундах)")]
[SerializeField] private float prizeDelay = 0.5f;
[Header("Отладка")]
[SerializeField] private bool debugMode;
private bool _prizeGiven;
private void OnTriggerEnter2D(Collider2D collision)
{
// Проверяем, что это игрок
if (!collision.CompareTag("Player")) return;
// Пытаемся выдать приз
TryGivePrize();
// Переход на следующий уровень
GameManager.Instance.NextLevel();
}
///
/// Пытается выдать приз игроку, если выполнены все условия.
///
private void TryGivePrize()
{
// Проверка, что приз еще не был выдан
if (_prizeGiven)
{
if (debugMode)
Debug.Log("[LevelFinish] Приз уже был выдан на этом финише.");
return;
}
// Проверка, включена ли выдача призов в этом компоненте
if (!enablePrizeOnFinish)
{
if (debugMode)
Debug.Log("[LevelFinish] Выдача призов отключена в компоненте.");
return;
}
// Проверка настроек (если указан ключ)
if (!string.IsNullOrEmpty(prizeEnabledSettingKey))
{
bool settingEnabled = SettingsManager.Instance.GetBool(prizeEnabledSettingKey);
if (!settingEnabled)
{
if (debugMode)
Debug.Log($"[LevelFinish] Выдача призов отключена в настройках ({prizeEnabledSettingKey}).");
return;
}
}
// Все проверки пройдены - выдаем приз
_prizeGiven = true;
if (prizeDelay > 0)
{
Invoke(nameof(GivePrize), prizeDelay);
}
else
{
GivePrize();
}
}
///
/// Выдает приз через PrizeSystemManager (учитывает флаг enableHopper).
///
private void GivePrize()
{
if (debugMode)
Debug.Log("[LevelFinish] Выдаю приз игроку!");
if (RR.Common.Managers.PrizeSystemManager.Instance != null)
RR.Common.Managers.PrizeSystemManager.Instance.GivePrize();
else
PrizeSystem.GivePrize(); // fallback
}
///
/// Сбрасывает состояние выдачи приза (для повторного использования).
///
public void ResetPrize()
{
_prizeGiven = false;
}
#if UNITY_EDITOR
private void OnDrawGizmos()
{
// Визуализация зоны финиша в редакторе
Collider2D col = GetComponent();
if (col != null)
{
Gizmos.color = enablePrizeOnFinish ? Color.green : Color.yellow;
Gizmos.DrawWireCube(col.bounds.center, col.bounds.size);
}
}
#endif
}
}