using System.Collections;
using UnityEngine;
///
/// Управляет ценой на Виндисте (вендинговый автомат, подключён к плате игрока).
/// Команда 220 = основная цена, 221 = скидочная цена (реванш с ботом).
///
/// Подписывается на ComWrapper.OnInitialize — отправляет начальную цену только
/// когда COM-порты уже открыты. Рефреш каждые 3 минуты.
///
/// Добавить этот компонент на любой GameObject на сцене.
///
public class VindistaController : MonoBehaviour
{
public static VindistaController Instance { get; private set; }
private const string CmdDefault = "220";
private const string CmdDiscount = "221";
[Tooltip("Интервал рефреша (сек). Виндиста сбрасывается ~каждые 3 мин.")]
[SerializeField] private float refreshInterval = 180f;
// Индексы 1 и 2; индекс 0 не используется
private readonly bool[] _discountActive = new bool[3];
private void Awake()
{
if (Instance != null && Instance != this) { Destroy(gameObject); return; }
Instance = this;
// Подписываемся на открытие портов — как BlinkController
try { ComWrapper.OnInitialize += OnComInitialized; } catch { }
}
private void Start()
{
StartCoroutine(RefreshLoop());
}
private void OnDestroy()
{
if (Instance == this) Instance = null;
try { ComWrapper.OnInitialize -= OnComInitialized; } catch { }
}
// Вызывается когда COM-порты открыты и платы готовы принимать команды
private void OnComInitialized()
{
SendPrice(1);
SendPrice(2);
}
// -------------------------------------------------------
///
/// Включает / выключает скидку для конкретного игрока (1 или 2).
/// Сразу отправляет команду на плату этого игрока.
///
public void SetDiscountMode(bool discount, int playerId)
{
if (playerId < 1 || playerId > 2) return;
_discountActive[playerId] = discount;
SendPrice(playerId);
}
// -------------------------------------------------------
// Каждые refreshInterval секунд повторяем текущее состояние обоих игроков.
// Используем _discountActive — не перебьём скидку во время GameOver.
private IEnumerator RefreshLoop()
{
while (true)
{
yield return new WaitForSeconds(refreshInterval);
SendPrice(1);
SendPrice(2);
}
}
private void SendPrice(int playerId)
{
// Скидку (221) только если настройка включена И скидка активна для этого игрока.
// Основную цену (220) посылаем всегда.
bool sendDiscount = IsDiscountSettingEnabled() && _discountActive[playerId];
string cmd = sendDiscount ? CmdDiscount : CmdDefault;
ComWrapper.Send(cmd, playerId);
Debug.Log($"Виндиста p{playerId} -> {cmd} " +
$"({(sendDiscount ? "скидочная" : "основная")})");
}
private static bool IsDiscountSettingEnabled()
=> SettingsManager.instance != null &&
SettingsManager.instance.GetSettingValue("Скидка за реванш при игре с ботом") == "Вкл";
}