sea-battle/Assets/Scripts/VindistaController.cs

96 lines
3.8 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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