Danil Iarosh 1f6884c5ac Build gameplay systems and service settings
Подробные изменения:
- Добавлены и доработаны модальные окна главного меню, сервисные настройки, шаблоны UI Toolkit и единый scene-flow сервис для переходов между сценами.
- Расширена gameplay-архитектура: сессия забега, HUD, спавн контента платформ, collectible-предметы, оборудование, хрупкие и движущиеся платформы.
- Добавлена база противников: типы спавна, патрулирование, процедурный спавнер, правила размещения через ScriptableObject-сложности и убийство врагов прыжком сверху.
- Исправлены смерть и respawn игрока, финальный GameOver, отскоки от врагов, пружин и boost-предметов, а также проход сквозь врагов при усиленном подъеме.
- Проведен рефакторинг взаимодействия систем: общий landing context, единые правила player-contact, NonLazy gameplay session, fail-fast installer и централизованный выбор точек спавна.
- Обновлены сцены, prefab-ассеты, difficulty stages, ресурсы главного меню, настройки проекта, roadmap и аппаратная COM-интеграция.
- Добавлены ассеты летучей мыши, врагов, collectibles, TextMesh Pro, ProjectContext и gameplay UI.

Проверки:
- dotnet build .\\Assembly-CSharp.csproj --no-restore
- Unity validation ключевых gameplay/UI/scene-flow скриптов
- Unity Console после force refresh без ошибок
2026-05-27 16:34:51 +03:00

151 lines
5.8 KiB
C#
Raw 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;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using UnityEngine.Events;
namespace DanroJump.Hardware.Com
{
/// <summary>
/// Единая точка доступа к COM-подсистеме автомата: кредиты, ввод, витрина призов и подсветка.
/// </summary>
public interface IComSystem :
IComCreditWallet,
IComInputSource,
IPrizeShowcaseGateway,
IComLightingController
{
bool IsRunning { get; }
string MainDeviceId { get; }
string PrizeStandDeviceId { get; }
IReadOnlyCollection<string> ConnectedDeviceIds { get; }
UnityEvent<string> DeviceAuthorized { get; }
UnityEvent<string> DeviceDisconnected { get; }
/// <summary>
/// Запускает поиск, авторизацию и фоновые циклы обмена данными с COM-устройствами.
/// </summary>
void StartSystem();
/// <summary>
/// Останавливает COM-подсистему и при необходимости отправляет устройствам команды выключения.
/// </summary>
void StopSystem(bool sendShutdownCommands);
bool SendToMain(string command);
bool SendToDevice(string deviceId, string command);
void SendToAll(string command);
string GetDeviceRole(string deviceId);
string GetDeviceMac(string deviceId);
}
/// <summary>
/// Хранилище кредитов, полученных от монетоприемника или другой платежной периферии.
/// </summary>
public interface IComCreditWallet
{
int Credits { get; }
UnityEvent<int> CreditAdded { get; }
UnityEvent<int> CreditRemoved { get; }
UnityEvent<int> CreditsChanged { get; }
/// <summary>
/// Добавляет кредиты и уведомляет подписчиков об изменении баланса.
/// </summary>
void AddCredit(int amount = 1);
/// <summary>
/// Пытается списать кредиты без ухода в отрицательный баланс.
/// </summary>
bool TrySpendCredits(int amount = 1);
/// <summary>
/// Принудительно выставляет текущий баланс кредитов.
/// </summary>
void SetCredits(int value);
}
/// <summary>
/// Источник аппаратного ввода с основной платы: кнопки, сенсоры и последние биты состояния.
/// </summary>
public interface IComInputSource
{
string LastMainInputBits { get; }
UnityEvent<string> MainInputReceived { get; }
UnityEvent HopperSensorTriggered { get; }
/// <summary>
/// Возвращает последнее известное состояние входов конкретного устройства.
/// </summary>
string GetLastInputBits(string deviceId);
}
/// <summary>
/// Шлюз для работы с призовой витриной и выдачей призов через аппаратные ячейки.
/// </summary>
public interface IPrizeShowcaseGateway
{
UnityEvent<int> PrizeBoxOpened { get; }
/// <summary>
/// Запрашивает текущие статусы всех ячеек призовой витрины.
/// </summary>
Task<IReadOnlyDictionary<int, PrizeBoxStatus>> GetPrizeBoxStatusesAsync(
CancellationToken cancellationToken = default);
Task<int[]> GetReadyPrizeBoxesAsync(CancellationToken cancellationToken = default);
Task<PrizeOpenResult> OpenPrizeBoxAsync(int boxNumber, CancellationToken cancellationToken = default);
Task<PrizeOpenResult> ForceOpenPrizeBoxAsync(int boxNumber, CancellationToken cancellationToken = default);
bool SetPrizeStandIdleLighting();
bool HighlightPrizeBox(int boxNumber);
}
/// <summary>
/// Контроллер аппаратной подсветки платы, шляпы и связанных световых сценариев.
/// </summary>
public interface IComLightingController
{
void PlayBoardLight(LightMode mode, float cycles = -1f);
void PlayBoardLightSequence(IReadOnlyList<LightStep> steps, bool loop);
void PlayDefaultBoardLight();
void StopBoardLightSequence();
void StopAllBoardEffects();
void BlinkHat();
void BlinkHat(float intervalSeconds);
void StopHatBlink(bool leaveHatEnabled = true);
void PauseLighting();
void ResumeLighting();
}
/// <summary>
/// Поставщик имен доступных COM-портов, вынесенный для тестов и подмены транспорта.
/// </summary>
public interface IComPortProvider
{
string[] GetPortNames();
}
/// <summary>
/// Фабрика транспорта поверх конкретных serial-настроек.
/// </summary>
public interface IComTransportFactory
{
IComTransport Create(SerialSettings settings);
}
/// <summary>
/// Минимальный serial-транспорт, который скрывает реализацию System.IO.Ports от остального кода.
/// </summary>
public interface IComTransport : IDisposable
{
bool IsOpen { get; }
void Open();
void Close();
void DiscardInBuffer();
void DiscardOutBuffer();
string ReadLine();
void WriteLine(string value);
}
}