96 lines
3.8 KiB
C#
96 lines
3.8 KiB
C#
using System.Collections;
|
||
using UnityEngine;
|
||
|
||
/// <summary>
|
||
/// Управляет ценой на Виндисте (вендинговый автомат, подключён к плате игрока).
|
||
/// Команда 220 = основная цена, 221 = скидочная цена (реванш с ботом).
|
||
///
|
||
/// Подписывается на ComWrapper.OnInitialize — отправляет начальную цену только
|
||
/// когда COM-порты уже открыты. Рефреш каждые 3 минуты.
|
||
///
|
||
/// Добавить этот компонент на любой GameObject на сцене.
|
||
/// </summary>
|
||
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);
|
||
}
|
||
|
||
// -------------------------------------------------------
|
||
|
||
/// <summary>
|
||
/// Включает / выключает скидку для конкретного игрока (1 или 2).
|
||
/// Сразу отправляет команду на плату этого игрока.
|
||
/// </summary>
|
||
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($"<color=cyan>Виндиста p{playerId} -> {cmd} " +
|
||
$"({(sendDiscount ? "скидочная" : "основная")})</color>");
|
||
}
|
||
|
||
private static bool IsDiscountSettingEnabled()
|
||
=> SettingsManager.instance != null &&
|
||
SettingsManager.instance.GetSettingValue("Скидка за реванш при игре с ботом") == "Вкл";
|
||
}
|