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("Скидка за реванш при игре с ботом") == "Вкл"; }