- добавлены проектные инструкции AGENTS.md:
зафиксированы правила работы с документацией, сообщениями коммитов,
MCP-инструментами и Unity MCP workflow для дальнейшей разработки
- проверка лицензии вынесена из GameManager в отдельный StartupLicenseManager:
код WinAPI, запуск RRLauncher.exe, обработка таймаута, возврат фокуса,
установка fullscreen-режима и клик в центр перенесены в отдельный
долгоживущий компонент
- обновлена инициализация глобальных сервисов:
GlobalsManager теперь добавляет и инициализирует StartupLicenseManager,
а Globals.prefab содержит новый компонент рядом с остальными runtime-сервисами
- обновлены Unity Editor и зависимости проекта:
версия проекта поднята до 6000.3.14f1, обновлены ai.inference,
collab-proxy, inputsystem, timeline, visualscripting и связанные lock-записи
- синхронизированы проектные настройки и generated assets после обновления Unity:
обновлены ProjectSettings, URP global settings, TMP/font assets,
tile/prefab meta-данные и связанные ресурсы сцен
- скорректирован MainMenu UI:
символ валюты заменен на текстовое обозначение руб., а также сохранены
небольшие Unity-сериализованные изменения layout/scrollbar-значений
- добавлены правила .gitignore для локальных служебных артефактов:
Codex/RAG-индекса, .NET SDK telemetry/cache и Unity recovery-сцен
- удалены из отслеживания ранее попавшие в репозиторий файлы .dotnet и Assets/_Recovery:
новые служебные файлы этих каталогов больше не будут засорять рабочее дерево
- завершен спринт 24 марта - 2 апреля с опережением плана и закрытием задач раньше срока
- расширена и стабилизирована система призов:
добавлены и доработаны QR-tier конфиги, новые типы и модели данных,
сохранение `qrCodes` в `prizes.json`, fallback-логика и синхронизация
через `PrizeSystemManager`, `PrizeDatabase` и `LevelPrizeConfig`
- переработан flow настройки QR-призов:
добавлены `QRCodeSettingsModal` и связанный UI-код,
разнесены короткий текст приза и полный текст сообщения,
добавлены шаблоны форматирования, корректная подстановка текста
в QR и в UI-модалках, а также сохранение конфигурации между запусками
- доработан flow суперприза и текстовых настроек:
добавлены fallback-правила показа, корректная обработка пустых строк
и строк из одних пробелов, обновлены binders и показ текста в меню
- реализована и обновлена отдельная настройка витрины:
добавлена `PrizeStandSettingsModal`, обновлена навигация строк,
логика выбора ячейки и порогов очков, циклический выбор ячеек,
ускорение изменения значений и исправления для keyboard/gamepad UX
- доработана игровая модалка витрины `PrizeStandModal`:
добавлен вывод очков игрока, форматируемый текст счета,
улучшено отображение ячеек и связанная логика выбора приза
- исправлен подсчет очков и интеграция с prize flow:
`ScoreSystem` переведен на событийное обновление текущего счета,
добавлены `CurrentScore`, `CurrentScoreChanged` и корректный display score,
витрина и связанные UI-элементы теперь получают актуальные очки,
а не нулевые или несвоевременные preview-значения
- переработаны модальные окна и навигация UI:
улучшены `Modal`, `ModalManager`, `UIRowPointer`, `RulesModal`,
`QRCodeModal`, `PrizeStandModal`, `LevelPrizeSettingsModal` и др.,
чтобы фокус, указатель и submit работали консистентно без мыши
- обновлен win/prize UI:
доработаны `WinBannerController`, `GameEndUIController`,
`MainMenu`, `QRCodeUIController`, `TopPanelTextController` и настройки UI,
улучшены тексты баннеров, отображение призов и итогового счета
- обновлены сцены и ассеты под новый flow:
`MainMenu`, `Level UI`, prefab'ы строк настроек и кнопок,
глобальные префабы, шрифты TMP, иконки, recovery-данные и ресурсы UI
- добавлены вспомогательные UI-компоненты и служебные скрипты:
`ButtonTextFocusColor`, `SelectableDescriptionTarget`, `QRTier`
и другие изменения, поддерживающие новый конфигурируемый prize UI
- добавлена новая система призов:
PrizeBase, PrizeType, PrizeDatabase, LevelPrizeConfig и реализации
для hopper, QR-кода, отсутствия приза и стойки с призом
- добавлена конфигурация призов уровней через `prizes.json`
и связанная логика загрузки/обработки в менеджерах игры
- расширен UI главного меню и настроек уровней:
добавлены LevelSettingsModal, LevelPrizeSettingsModal,
QRCodeModal и PrizeStandModal
- обновлена навигация модальных окон и связанный UI-код:
ModalManager, MainMenu, RulesModal, PauseMenu,
PrizeErrorDisplay, UIRowPointer и WinBannerController
- доработаны настройки и генерация UI-элементов:
обновлены SettingsDatabase, SettingsUIGenerator,
SettingUIItem, ValueSelectorRow и editor drawer для настроек
- обновлены и добавлены UI-prefab'ы для кнопок, строк настроек,
панели групп и кнопки настроек уровня
- обновлены сцены `MainMenu` и `Level UI` под новый флоу
настройки уровней, выбора призов и отображения модалок
- добавлены файлы лаунчера в `StreamingAssets`,
включая `RRLauncher.exe`, служебные meta-файлы и документацию
- улучшено логирование через FileLogger
и удален устаревший код лицензирования
- удалены больше неиспользуемые файлы:
`Licensing.cs`, `SteppedSlider.cs` и recovery-сцены
Система выдачи призов хоппером:
- PrizeSystemManager теперь читает enableHopper из настройки prizes.giveSmallPrize
вместо захардкоженного SerializeField (реагирует на изменения в реальном времени)
- LevelFinish: исправлен ключ настройки на prizes.giveSmallPrize
- Добавлен HopperCheckController для тестирования выдачи приза кнопкой в настройках
- Проверка датчика хоппера перенесена в ComDeviceClient (2-й бит INPUT)
- PrizeGivenBuffer заменён с PlayerPrefs на потокобезопасный Interlocked-буфер
(исправлен краш при вызове PlayerPrefs из фонового потока платы)
- Добавлен PrizeSystem.OnPrizeResult (Action<bool>) — событие результата выдачи
Отображение ошибки выдачи приза:
- Добавлен PrizeErrorDisplay — UI-компонент, подписанный на OnPrizeResult
- Зависит от настройки prizes.showPrizeError (реагирует на изменения в реальном времени)
QR-коды:
- PrizeSystemManager подписан на изменение prizes.phoneNumber — QR-коды
перегенерируются автоматически при смене номера
- WinBannerController показывает QR-коды только при включённой prizes.giveBigPrize
Прочее:
- Добавлен Levitator — компонент плавной левитации объекта (высота, скорость, плавность)
- Настройки: группы поддержки/тестов реорганизованы, добавлена кнопка btn.hopper_test
Архитектура 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
- Добавлена система баланса игры (BalanceManager) для управления внутриигровой валютой
- Баланс начисляется за импульсы оплаты и списывается за начало/продолжение игры
- При старте игры весь внесенный баланс списывается, а жизни начисляются в соответствии с количеством оплат
- Добавлены проверки достаточности баланса для начала и продолжения игры
- Интегрирован BalanceManager с PaymentManager и GameManager
- Исправлен баг с возможностью снятия паузы при показе баннера проигрыша/победы
- Добавлена блокировка переключения паузы через IsActive флаг в PauseMenu
- Жизни больше не могут уйти в минус при повторной смерти во время показа баннера
- Настройки стоимости импульса, начала и продолжения игры берутся из SettingsManager
- Добавил новую систему настроек, возможности:
- Динамически создает список настроек
- Сохраняет настройки в JSON-файл
- Возможность группировать настройки
- Широкие возможности по кастомизации
- Применение настроек в реальном времени (частично)
- Добавил префабы для новых элементов настроек
- Изменил поведение игры исходя из нового формата настроек
- Added PaymentManager integration with GameManager
- Implemented credit-based lives increment system
- Updated UI layout and anchor positions in MainMenu scene
- Added AddCredit input action bindings for keyboard and gamepad
- Refactored GameManager to use StartingLives, MaxLives properties
- Added UICreditsTextController for displaying credits and lives- Fixed prefab initialization order and component dependencies
- Updated ComWrapper serialization and prize checking logic
- Removed obsolete setLivesToDefaultAfterFirstLose setting
- Improved scene loading and player spawn management
- Created AdvancedLoggingExample class demonstrating composite and file loggers
- Implemented multi-file logging setup with separate error and full logs
- Added game event and performance logging methods
- Included key input handling for log operations (flush, clear)
- Setup proper resource disposal on application quit
- Removed deprecated ButtonPinMapping enum and related COM input classes- Updated ComInputToInputSystemAdapter with improved binding logic- Refactored GameManager to use new globals prefab path
- Enhanced GameEndUIController with event system focus management
- Modified Globals prefab to use pin-based input bindings
- Cleaned up obsolete COM system wrapper and native wrapper classes
- Adjusted input adapter to support pin bindings over action bindings
- Updated manufacturer name in virtual gamepad description