namespace RR.Common.Controls
{
///
/// Абстрактный базовый класс для всех источников ввода в системе.
/// Определяет унифицированный интерфейс для работы с аппаратными кнопками и виртуальными действиями игроков.
///
///
/// Наследники этого класса реализуют конкретные способы ввода:
/// - COMinput: работа с периферийной платой через COM-порт
/// - KeyboardInput: эмуляция ввода с клавиатуры для тестирования
///
/// Класс предоставляет три уровня абстракции:
/// 1. Низкоуровневый доступ к физическим пинам
/// 2. Доступ к абстрактным игровым действиям
/// 3. Мультиплеерные методы для работы с несколькими игроками
///
public abstract class InputSource
{
///
/// Инициализирует источник ввода. Должен быть вызван перед использованием других методов.
///
/// true если инициализация прошла успешно, false в случае ошибки
public abstract bool Initialize();
//----------------------------------------------------------------------------------
///
/// Получает текущее состояние конкретной кнопки по её физическому пину.
///
/// Пин кнопки на периферийной плате
/// true если кнопка нажата в текущий момент
public abstract bool GetButton(ButtonPinMapping button);
///
/// Проверяет, была ли кнопка нажата в начале текущего кадра.
///
/// Пин кнопки на периферийной плате
/// true только в первом кадре после нажатия кнопки
public abstract bool GetButtonDown(ButtonPinMapping button);
///
/// Проверяет, была ли кнопка отпущена в начале текущего кадра.
///
/// Пин кнопки на периферийной плате
/// true только в первом кадре после отпускания кнопки
public abstract bool GetButtonUp(ButtonPinMapping button);
//----------------------------------------------------------------------------------
///
/// Получает состояние кнопки по числовому индексу пина.
/// Перегрузка для работы с системами, где количество пинов превышает размер перечисления.
///
/// Числовой индекс пина (0-based)
/// true если кнопка нажата в текущий момент
public abstract bool GetButton(int pinIndex);
///
/// Проверяет нажатие кнопки по числовому индексу пина в текущем кадре.
///
/// Числовой индекс пина (0-based)
/// true только в первом кадре после нажатия
public abstract bool GetButtonDown(int pinIndex);
///
/// Проверяет отпускание кнопки по числовому индексу пина в текущем кадре.
///
/// Числовой индекс пина (0-based)
/// true только в первом кадре после отпускания
public abstract bool GetButtonUp(int pinIndex);
//----------------------------------------------------------------------------------
///
/// Получает состояние игрового действия для любого из игроков.
/// Используется для мультиплеерных сценариев где важно действие любого игрока.
///
/// Абстрактное игровое действие
/// true если действие активно у первого ИЛИ второго игрока
public abstract bool GetButtonAnyPlayer(PlayerAction button);
///
/// Проверяет начало игрового действия любым игроком в текущем кадре.
///
/// Абстрактное игровое действие
/// true если действие начато любым игроком в этом кадре
public abstract bool GetButtonDownAnyPlayer(PlayerAction button);
///
/// Проверяет завершение игрового действия любым игроком в текущем кадре.
///
/// Абстрактное игровое действие
/// true если действие завершено любым игроком в этом кадре
public abstract bool GetButtonUpAnyPlayer(PlayerAction button);
//----------------------------------------------------------------------------------
///
/// Получает состояние игрового действия для текущего активного игрока.
/// Используется для одиночной игры или поочередного управления.
///
/// Абстрактное игровое действие
/// true если действие активно у текущего игрока
public abstract bool GetButtonCurrentPlayer(PlayerAction button);
///
/// Проверяет начало игрового действия текущим игроком в текущем кадре.
///
/// Абстрактное игровое действие
/// true если действие начато текущим игроком в этом кадре
public abstract bool GetButtonDownCurrentPlayer(PlayerAction button);
///
/// Проверяет завершение игрового действия текущим игроком в текущем кадре.
///
/// Абстрактное игровое действие
/// true если действие завершено текущим игроком в этом кадре
public abstract bool GetButtonUpCurrentPlayer(PlayerAction button);
}
}