- ComSystemManager: при авторизации дефолтного устройства больше не
вызывается StopSequence() если последовательность уже играет.
Это исправляет баг, при котором спецэффекты подсветки, запущенные
GameManager-ом до завершения handshake, уничтожались и заменялись
мигалкой шляпы.
- Логика авторизации разделена на три ветки:
• приостановленные эффекты → ResumeAll() или сброс (если другая плата);
• ничего не играет → Blink();
• последовательность уже играет → не трогаем.
- Обновлены шрифтовые ассеты TextMesh Pro (Roboto-Bold SDF,
LiberationSans SDF Fallback).
- Рефакторинг системы подсветки: вместо длительности в секундах теперь
используется количество циклов (float). Добавлена таблица длительности
циклов эффектов `LightCycleDurations` для пересчёта циклов в секунды.
Префикс команд подсветки изменён с `85` на `86`.
- `LightSequence`: добавлены `Pause()` / `Resume()` с запоминанием текущего
шага последовательности; возобновление продолжает с сохранённой позиции.
- `LightController`: добавлены `PauseAll()` / `ResumeAll()` для
приостановки и восстановления подсветки и мигания шляпы при
отключении/переподключении платы. Свойства `IsSequencePaused`,
`IsBlinkPaused`.
- `ComDeviceClient`: после успешной авторизации отправляются команды
`890003` и `8600`. Добавлен запрос MAC-адреса через команду `06`
(ответ — 12 hex-символов без префикса). Новое событие `ConnectionLost`
при начале KeepAlive-реконнекта.
- `ComHub`: очередь `_disconnectedQueue` с типом `DeviceDisconnectMessage`
(DeviceId + Role + Mac) — сохраняет идентификатор устройства до его
удаления из словаря. Подписка на `ConnectionLost`.
Добавлен `GetDeviceMac()`.
- `ComSystemManager`: при инициализации, если плата не обнаружена,
подсветка сразу ставится на паузу. При отвале дефолтного устройства —
`PauseAll()`, при переподключении — сравнение по MAC и роли через
`IsSameDevice()`: та же плата → `ResumeAll()`, другая → `Blink()` с нуля.
Добавлены событие `OnDeviceDisconnected` и метод `GetDeviceMac()`.
- `COMInput`: при событии `OnDeviceDisconnected` сбрасываются все состояния
кнопок через `ResetAllButtons()`, генерируя `buttonUp` для зажатых кнопок.
Устраняет баг залипания управления после переподключения платы.
- `GameManager`: расширена последовательность световых эффектов в меню
(добавлены `DiagonalWave3`, `WaveUp`, `OrangeWave`); вызовы `SetLight`
для game over/won переведены на float-циклы.
- Обновлены `ARCHITECTURE.md` и `README.md`: переписана документация
на актуальную структуру проекта и текущие возможности игры.
Архитектура COM и роли
- ComMultiManager переименован в ComHub и переведен на фабричный паттерн обработчиков по ROLE.
- Добавлен единый контракт обработчиков COM-контроллеров:
- IComControllerHandler
- DefaultComControllerHandler
- Ответственность за оркестрацию перенесена в ComSystemManager, чтобы инициализация COM и жизненный цикл контроллеров управлялись централизованно.
- ComWrapper сохранен как слой совместимости на время миграции логики в новую схему.
- PrizeStandController отрефакторен под новый role-handler pipeline вместо старой прямой привязки.
- Добавлен удобный доступ к PrizeStandController из менеджера системы там, где это требуется игровому коду.
Handshake/авторизация платы (ComDeviceClient)
- Авторизация платы переработана в строгую поэтапную последовательность:
1) ПК отправляет 07
2) ожидает CHAL
3) отправляет 08 в ответ на CHAL
4) ожидает RAES
- Парсер стадий теперь принимает только ожидаемые токены на каждой стадии:
- WaitingChal -> только CHAL
- WaitingRaes -> только RAES
- Любой посторонний вывод из serial во время handshake игнорируется (без немедленного падения), что устраняет ложные ошибки на нерелевантных COM-устройствах.
- Если ожидаемый ответ после 07 не приходит, порт быстро пропускается как нерелевантный, без эскалации в критическую ошибку.
- Для случаев с неподходящими/сторонними устройствами уровень логирования снижен с ошибок до предупреждений там, где это уместно.
- Добавлена подробная диагностика авторизации (переходы стадий, принятые значимые кадры, контекст таймаутов) для упрощения отладки.
Тестовая утилита handshake
- Добавлен Assets/Temp/Handshake_Test.cs как изолированный диагностический скрипт.
- Включены очень подробные логи по каждому шагу handshake и по каждому решению парсера.
- Позволяет отдельно гонять тестовый сценарий и сравнивать поведение платы, не ломая production-поток.
Стабильность COM и поведение reconnect
- Подправлена логика keep-alive, чтобы исключить агрессивные реконнекты.
- Reconnect теперь срабатывает только после нескольких последовательных пропусков INPUT-ответа, что снижает случайные обрывы COM и прерывания подсветки.
Поведение подсветки во время выполнения
- Циклы подсветки сделаны независимыми от Time.timeScale:
- LightController: WaitForSeconds -> WaitForSecondsRealtime
- LightSequence: WaitForSeconds -> WaitForSecondsRealtime
- Это устраняет случайные паузы/замедления световых циклов при изменении игрового времени (пауза, slow-mo, временные изменения scale).
Итоговый эффект
- COM-стек стал расширяемым по ролям и проще в сопровождении.
- Handshake стал детерминированным, устойчивым к serial-шуму и безопасным при работе со сторонними устройствами.
- Циклы подсветки стабилизированы для длительных сессий и больше не зависят от масштабирования игрового времени.
- Добавлен ComSystemManager как новый публичный компонент COM-системы для поэтапной замены ComWrapper
- Реализовано получение роли контроллера только после успешного handshake в ComDeviceClient
- Добавлено публичное поле ControllerRole в ComDeviceClient
- Добавлен запрос роли по команде 97 и разбор ответа формата ROLE : <value> (с пробелами)
- В ComMultiManager добавлена логика выбора DefaultDeviceId по роли main_controller
- Добавлен доступ к роли устройства через GetDeviceRole(deviceId) в менеджере и фасаде
- В ComWrapper добавлены настройки роли: roleRequestCommand, roleResponsePrefix, roleRequestTimeoutMs, mainControllerRole
- Дефолтная команда запроса роли изменена на 97
- Выполнена кодовая миграция зависимостей с ComWrapper на ComSystemManager в GameManager, GlobalsManager, PaymentManager, BalanceManager, InactivityManager, COMInput, LightController, PrizeSystem
- В GlobalsManager исправлена инициализация ссылки после AddComponent<ComSystemManager>(), чтобы исключить NullReference