- Добавлен компонент подмены спрайтов игрока перед началом игры.
- Обновлены сцена уровня, префабы, шейдеры, настройки импорта и данные призов.
- Зафиксирован embedded-пакет Unity MCP 9.6.8 и обновлены связанные файлы проекта.
- В метод PickPrefab класса EntitySpawner добавлено логирование Debug.Log при успешном переопределении префаба зоной.
- Это позволяет легко проверять, какие спавнеры и на каких точках подверглись влиянию зоны переопределения.
- Добавлено свойство spawnerNameFilter (по умолчанию 'Enemy') в EntitySpawnerZone, чтобы зоны переопределения применялись только к спавнерам врагов и не заменяли префабы в CoinSpawner (спавнерах кристаллов) или других спавнерах предметов.
- Реализована точная математическая проверка IsPointInside для BoxCollider2D, что делает ее независимой от Z-координаты и тиков физического движка Unity.
- Исправлено поведение в EntitySpawner: теперь при поиске зоны проверяется zone.MatchesSpawner.
- Создан скрипт EntitySpawnerZone.cs для выделения зон замены префабов в Unity Editor.
- Модифицирован EntitySpawner.cs для поддержки зон при выборе префаба на основе координат точки спавна.
- Заменена уменьшенная платформа TriggeringPlatform_2 на сцене 1-1 на табличку со стрелкой влево (Signs_Arrow_Left).
- Создан C# скрипт ShowObjectWithVFX.cs для активации скрытых объектов со спецэффектами частиц (sparks).
- Добавлен вспомогательный редакторский скрипт ReplacePlatformWithSign.cs для автоматической перестройки сцены.
- Рычаг на уровне 1-1 привязан к активации таблички: табличка изначально скрыта, при переключении рычага появляется с эффектом искр.
- Добавлен Editor-скрипт SpriteAssetGenerator для автоматической генерации TMP Sprite Asset'ов из текстур призов.
- Сгенерированы TMP Sprite Asset'ы (Prize, Prize_Hopper, Prize_Marbles, Prize_QR, Prize_Tickets) в папке Assets/Resources/Sprite Assets.
- Настроены FaceInfo и вертикальное центрирование спрайтов относительно текста.
- Обновлен RulesPrizeListPage.cs: вместо текстовых названий призов выводятся соответствующие пиктограммы с помощью тегов <sprite>.
- Добавлены новые файлы текстур призов и их мета-файлы в коммит.
- Исправлено поведение игрока при падении с высоты и разворотах (устранен сильный отскок от углов)
- Центрирован PolygonCollider2D по оси X на префабе character_defeat_4.prefab (m_Offset.x установлен в 0)
- Упрощена форма PolygonCollider2D до симметричного выпуклого шестиугольника
- Сохранен бэкап старого префаба игрока в Player_Old.prefab
- Интегрирована система кастомных визуальных эффектов (VFX):
- Добавлена новая утилита MvpVFXUtility и настройки MvpVFXSpawnSettings для спавна эффектов.
- Реализован пул эффектов VFXPool с поддержкой отслеживания версий спавна, сброса оверрайдов и анимации масштаба по времени.
- Добавлены эффекты прыжка и приземления в PlayerAnimationEvents.
- Интегрирован эффект DeathVignetteController для плавного затемнения экрана при смерти игрока.
- Добавлены частицы stompImpactVFX при уничтожении врагов прыжком сверху (EnemyController).
- Реализован эффект конфетти finishVFX при успешном завершении уровня (LevelFinish).
- Интегрированы эффекты искр при сборе монеток, кристаллов и других собираемых предметов (Collectible, EnvironmentalCollectibleBase).
- Улучшен и визуально доработан пользовательский интерфейс (UI):
- Добавлен скрипт QRCodeTierHighlight для цветовой подсветки QR-кодов в зависимости от тира приза.
- Реализована пульсация блока приза в баннере победы (WinBannerController).
- Обновлено обозначение валюты в BalanceDisplay с "₽" на "руб.".
- Добавлены новые префабы, сцены, ассеты тайлсетов и шейдеров для настройки визуального стиля.
- Обновлён протокол и инициализация подсветки COM-платы:
- Изменен префикс команд подсветки с 85/86 на 8550, а диапазон эффектов обновлен с 40...52 на 10...22 (LightController, LightMode, LightCycleDurations).
- Исправлена хардкод-команда сброса подсветки при инициализации в ComDeviceClient с устаревшей 8600 на новую 8550 для предотвращения рассинхронизации буфера обмена платы.
Исправлена бесконечная рекурсия (StackOverflowException) при синхронизации баланса с кредитами платы.
Детали изменений:
- В класс BalanceManager добавлен флаг-предохранитель _isSyncingCredits.
- Обработчик OnImpulsePaid теперь игнорирует события начисления кредитов, вызванные синхронизацией.
- В методе SyncCreditsWithBalance вызов ComSystemManager.SetCredits обернут в блок try-finally для безопасного управления флагом _isSyncingCredits.
- добавлены проектные инструкции 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:
новые служебные файлы этих каталогов больше не будут засорять рабочее дерево
- доработан flow призовой витрины и связанного UI:
добавлены `PrizeStandButtonView` и `RulesPrizeListPage`, обновлены
`PrizeStandController`, `PrizeStandPrize`, `PrizeStandModal`,
`PrizeStandSettingsModal`, `LevelPrizeSettingsModal`, `QRCodeSettingsModal`,
`BalanceDisplay`, `ButtonTextFocusColor` и связанные prefab'ы,
чтобы улучшить настройку, навигацию, отображение кнопок и prize flow
- расширена система настроек и сохранения значений:
`OptionPicker` получил отдельный формат `ValueSelector`,
обновлены `SettingsDatabase`, `SettingEntryDrawer`, `SettingUIItem`,
`SettingsUIGenerator`, `ValueSelectorRow` и `MainSettingsDatabase.asset`,
а сохранение option picker-значений, включая `gameplay.gameDifficulty`,
исправлено и синхронизировано с остальными настройками
- добавлены универсальные спавнеры сущностей:
реализованы `EntitySpawner` и `EntitySpawnerManager` с поддержкой
весов префабов, точек спавна, заполнения по проценту, ограничений
на количество и автоспавна при инициализации
- доработана логика игрового спавна и сложности:
процент инициализационного спавна может зависеть от настройки
`gameplay.gameDifficulty` с градациями 25/50/75/100,
в одном цикле массового спавна повторно не используется та же точка,
а gizmo спавнера теперь показывает только сами точки без линий
- упрощена работа в редакторе Unity и добавлены editor-инструменты:
в `GameManager` лицензия пропускается при запуске в `UNITY_EDITOR`,
а `HierarchySelectionCounter`, `HierarchySelectionCountOverlay`
и `HierarchyBulkRenamerWindow` добавляют подсчет выделения,
realtime overlay в `SceneView` и массовое переименование объектов
по правилам нумерации из Unity Project Settings
- синхронизированы сцены, ресурсы и UI-ассеты под новый flow:
обновлены `MainMenu`, `Level UI`, уровни `1-1` и `1-2`,
строки настроек, кнопки, TMP/font assets, изображения UI,
`prizes.json` и recovery-данные после правок интерфейса и логики
- очищены и переразложены часть внешних и служебных ресурсов:
удалён пакет `Lava_Flowing_Shader`, переименованы/заменены
отдельные UI-prefab'ы и добавлены сопутствующие проектные артефакты,
которые сейчас используются обновлённой конфигурацией проекта
- доработана плашка проигрыша `LoseBannerController`:
добавлены отдельные поля `Menu Button` и `Menu Button Text`
для кнопки возврата в главное меню
- добавлена логика переключения кнопок по настройке
`gameplay.canContinueGame`:
при включенной настройке показывается только кнопка продолжения,
при выключенной — только кнопка возврата в меню
- добавлены отдельные форматы текста для обеих кнопок:
`Continue Button Text Format` и `Menu Button Text Format`
с подстановкой таймера автоматического действия
- реализован единый таймер автодействия для активной кнопки:
обратный отсчет отображается либо на кнопке продолжения,
либо на кнопке возврата в меню — в зависимости от текущего режима
- улучшено управление фокусом в плашке проигрыша:
баннер автоматически назначает `firstSelected` и переводит
`EventSystem` только на активную видимую кнопку
- обновлен показ очков в игровой витрине:
подготовлены поля и связанный UI для отображения счета игрока
в `Level UI` и связанных настройках
- синхронизированы изменения сцены и настроек:
обновлены `Level UI.unity`, `MainSettingsDatabase.asset`
и связанные TMP/font assets после правок интерфейса
- завершен спринт 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-сцены
- Добавлена проверка лицензии через внешний `RRLauncher.exe` при старте игры.
- В `GameManager` встроен асинхронный сценарий проверки лицензии с таймаутом и завершением приложения при неуспешной проверке.
- После успешной проверки лицензии добавлена принудительная установка `ExclusiveFullScreen` и разрешения `1920x1080`.
- В проект добавлен новый скрипт `Licensing.cs`.
- В `GameManager` добавлена низкоуровневая работа с WinAPI для запуска внешнего процесса и ожидания результата.
- Добавлено новое модальное окно `RulesModal` с поддержкой многостраничных правил.
- В `RulesModal` реализовано переключение страниц через `Input System` по горизонтальной навигации.
- Для окна правил добавлены индикатор текущей страницы, форматируемый текст номера страницы и поддержка точек-индикаторов.
- В `RulesModal` добавана защита от многократного листания при удержании оси навигации.
- В `ModalManager` исправлена работа singleton-инстанса при закрытии приложения и повторном входе в Play Mode.
- В `ModalManager` добавлен сброс статических полей через `RuntimeInitializeOnLoadMethod`, чтобы менеджер корректно переживал перезапуск в редакторе.
- В базовом `Modal` и связанном UI-потоке внесены доработки для более стабильной работы модальных окон.
- В систему настроек добавлена и расширена поддержка `ValueSelectorRow`.
- `ValueSelectorRow` переработан так, чтобы работать не только с `int`, но и с `float` значениями.
- В `ValueSelectorRow` добавено ускорение изменения значений при последовательном удержании влево/вправо.
- В `ValueSelectorRow` добавлен показ процентов для настроек, которые должны отображаться как процентные значения.
- В `ValueSelectorRow` улучшено поведение навигации и сброс состояния удержания при потере фокуса и деактивации.
- В `SettingsDatabase` добавлены связанные изменения для новых сценариев работы настроек.
- В `SettingsUIGenerator` и `SettingUIItem` обновлена генерация UI для новых вариантов отображения и редактирования настроек.
- В `SettingEntryDrawer` в редакторской части добавлены изменения для поддержки новых параметров настроек.
- Обновлена `MainSettingsDatabase.asset` под новую структуру и параметры настроек.
- Обновлены префабы строк настроек: `Row_Button`, `Row_Dropdown`, `Row_Input`, `Row_Slider`, `Row_Toggle`, `Row_ValueSelector`, а также `InputCell` и связанные UI-префабы.
- Обновлен `LevelButton.prefab` и связанные элементы интерфейса.
- Обновлен `Globals.prefab` с учетом новых или измененных UI/сервисных компонентов.
- В `MainMenu.unity` выполнена крупная правка интерфейса: переразложены якоря, размеры, позиционирование элементов и изменены отдельные тексты.
- В `MainMenu.unity` активированы и переработаны части UI, ранее отключенные или имевшие другие размеры/якоря.
- В `Level UI.unity` внесены изменения в структуру и конфигурацию интерфейса уровня.
- Обновлен `UICreditsTextController` для работы с измененным отображением UI или логикой текста.
- В `InputSystem_Actions.inputactions` внесены изменения в конфигурацию действий ввода.
- В `FileLogger` обновлена логика файлового логирования.
- Обновлен `.gitignore`.
- Обновлены метаданные и ресурсы, связанные с главным меню, включая `plashka_levels.png.meta`.
Система выдачи призов хоппером:
- 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
Добавлены новые UI-компоненты и исправлена надёжность подсветки
- Добавлен UIElementAnimator — универсальный аниматор UI-элементов (покачивание, движение вверх-вниз, пульсация масштаба)
- Добавлен GamePriceDisplay — отображение стоимости игры из настроек (payment.startGameCost, payment.currency)
- Добавлен метод StartIdleEffects() в GameManager для гарантированного запуска мигания шапки и последовательности эффектов
- Исправлена подсветка, не включавшаяся при переходе в главное меню: OnSceneLoaded теперь вызывает StartIdleEffects()
- Исправлено восстановление подсветки при переподключении платы: ComSystemManager использует StartIdleEffects() для MainMenu
- Добавлены LightController.IsHatOn и ResendHatState() для корректного отслеживания состояния шапки
- Исправлено зависание спецэффектов при мигании шапки: LightSequence теперь переотправляет команду эффекта каждые 2 сек
- Убраны дублирующиеся вызовы Blink/SetLight из LoadScene (теперь обрабатывается в OnSceneLoaded)
- Обновлена сцена MainMenu, ассеты шрифтов, удалён старый префаб Coin
- 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`: переписана документация
на актуальную структуру проекта и текущие возможности игры.
- Убран пулинг из `EnvironmentalCollectibleBase` и `EnvironmentalCollectibleSpawner`:
при подборе и деспауне частицы теперь уничтожаются через `Destroy()`,
что устраняет проблему переиспользования объектов старого типа при смене частиц.
- Удалены поля `usePooling`, `_ownerPool`, `_originPrefab` из `EnvironmentalCollectibleBase`;
упрощены методы `Collect()` и `Despawn()`.
- Добавлено время жизни частиц: поле `defaultLifetime` в `EnvironmentalCollectibleBase`,
таймер `_age` с автоматическим деспауном по истечении; виртуальный `OnDespawned()` для наследников.
- В `SpawnEntry` добавлены `overrideLifetime` и `lifetimeOverride` для переопределения времени жизни.
- Добавлена структура `NamedSpawnEntry` — именованные записи с ключом (`string key`),
полным `SpawnEntry` и флагом `hardReplace`, настраиваемые в инспекторе.
- Спаунер получает игрока из `GameManager.Instance.PlayerObj` вместо `FindGameObjectWithTag`;
подписка на `GameManager.PlayerSpawned` для автообновления ссылки.
- Добавлен постепенный спаун: `MaintainFixedCount()` запускает корутину `SpawnRoutine()`
с рандомной задержкой `spawnDelay` между объектами.
- Добавлены диапазоны случайного масштаба (`scaleRange`) и угла поворота (`rotationRange`) при спауне.
- Добавлены публичные методы переключения типа частиц для `UnityEvent`:
`SetForcedPrefab`, `SetForcedPrefabHard`, `SetForcedPrefabByObject`, `SetForcedPrefabByObjectHard`,
`SetForcedPrefabByIndex`, `SetForcedPrefabHardByIndex`, `SetForcedEntry`, `SetForcedEntryByName`,
`SetEntryByName` (мягкая постепенная замена через `GradualReplaceRoutine`),
`ClearForcedPrefab`, `SetOverrideArea`.
- Исправлено сравнение prefab по ссылкам на сравнение по `name`, устраняя проблему
когда один и тот же ассет из разных массивов (`spawnEntries` / `namedEntries`) не совпадал.
- Удалён `EnvironmentalZoneTrigger.cs` (триггер-зона не нужна как отдельный скрипт).
- Удалены `EnvironmentalPool` из использования в спаунере и базовом классе.
- Префабы `Coin.prefab` и `Coin_Robotail.prefab` перемещены в `Prefabs/Props/Collectibles/`;
добавлены `LeafCollectible.prefab` и `BatCollectible.prefab`.
- Добавлен `ScoreSystem` — singleton-компонент, отслеживающий монеты, убитых врагов и экологические очки;
финальный счёт вычисляется по формуле `Score = E × (P + 45C + 90K + 10K²) − 0.5T`
с раздельными множителями для победы и проигрыша.
- Добавлен `EnvironmentalCollectibleBase` — абстрактный базовый класс для подбираемых экологических объектов:
срабатывает по триггеру, поддерживает пулинг, при подборе регистрирует очки в `ScoreSystem`.
- Добавлен `LeafCollectible` — листик с синусоидальным горизонтальным дрейфом, вращением и детекцией земли.
- Добавлен `BatCollectible` — летучая мышь с синусоидальным вертикальным движением, ограниченным горизонтальным
блужданием и случайными сменами направления; переворачивает спрайт по X при смене направления.
- Добавлен `EnvironmentalPool` — простой объектный пул по prefab-ключу с прогревом (`Warmup`) и возвратом объектов.
- Добавлен `EnvironmentalCollectibleSpawner` — взвешенный случайный спаунер, поддерживающий фиксированное количество
активных объектов; поддерживает лимиты по типу, принудительный выбор одного prefab и область спауна через
`BoxCollider2D` или ручной `Bounds`.
- В `CoinCollectible.TryPickup` добавлен вызов `ScoreSystem.Instance?.RegisterCoinCollected()`.
- В `EnemyController.Die` добавлен guard через флаг `_isDead` для предотвращения повторного срабатывания;
добавлен вызов `ScoreSystem.Instance?.RegisterEnemyKilled()`.
- В `GameManager` добавлен вызов `ScoreSystem.Instance?.ResetStats()` при старте новой игры и при потере жизни.
- Исправлен баг `GameManager.NewGame()`: в режиме бесплатной игры (`payment.freeGame = true`) больше не выполняется проверка/списание баланса.
- Добавлен явный guard для free-play перед `Balance.CanStartGame()` и `Balance.SpendBalance(...)`, чтобы не было нежелательных списаний.
- Устранена ошибка закрытия лог-файла `Cannot access a disposed object`:
- `FileLogger` переведен на безопасный паттерн `Dispose(bool)` с идемпотентностью;
- добавлена защита от повторного закрытия/записи в уже закрытый поток;
- финализатор `FileLogger` больше не выполняет managed-cleanup.
- Устранен риск повторной очистки в `CompositeLogger`:
- добавлен флаг `_disposed`;
- `Dispose(bool)` теперь выполняется только один раз;
- финализатор вызывает `Dispose(false)` вместо полного `Dispose()`.
Архитектура 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
- Добавлен LevelFinish.cs: новый компонент финиша уровня
- выдача маленького приза через PrizeSystemManager (учитывает enableHopper)
- настройки: enablePrizeOnFinish, prizeEnabledSettingKey, prizeDelay, debugMode
- защита от двойной выдачи (_prizeGiven)
- PlayerController: закомментирован старый переход на следующий уровень по тегу 'Finish'
(теперь за это отвечает LevelFinish)
- QRCodeUIController: помечен [Obsolete], QR-коды показываются только при победе
через WinBannerController.ShowWin() -> PrizeSystemManager.GetQRCodes()
- Finish.prefab: добавлен компонент LevelFinish (enablePrizeOnFinish=true, prizeDelay=0)
- Сцена 1-1: переопределён enablePrizeOnFinish=false для финиша промежуточного уровня
- Сцена 1-3: minor update
- MainMenu: правки якорей UI-элементов и активация скрытого объекта
- Добавлены публичные методы в PrizeSystem для проверки статуса выдачи приза (WasLastPrizeSuccessful, IsPrizing)
- Сохранение результата последней выдачи приза для внешнего контроля
- Исправлено вращение в TextSplash: теперь оно применяется относительно начального поворота вместо сброса до 0
- Начальное вращение сохраняется в Awake и используется как базовое для анимации покачивания
- Начата глобальная замена шрифтов в игре: добавлены BerlinSansFBCyrillic, Flatiron Casual, Flatiron Regular, RifficFree-Bold
- Заменена часть шрифтов в главном меню на новые
- Добавлены новые тайловые спрайты для фона (Forest, Hills, Sky)
- Удален лишний пробел в PlayerController.cs
- Исправлена BOM-метка в UICreditsTextController.cs
- Добавлена система анимированных текстовых сплешей (TextSplash) с настройками масштаба, покачивания, движения и цвета
- Добавлена поддержка циклического воспроизведения анимации сплешей
- Добавлена настройка частоты покачивания для более плавной и непрерывной анимации
- Добавлено отображение валюты в компоненте BalanceDisplay (берется из настройки payment.currency)
- Добавлены поля для отображения номера поддержки и суперприза в главном меню
- Добавлена возможность форматирования текстов через string.Format в MainMenu (supportNumberFormat, superPrizeFormat)
- Валюта и тексты автоматически обновляются при изменении настроек
- Добавлена система ввода текста через модальное окно с ячейками для аркадного автомата
- Реализован TextInputModal с поддержкой кастомных алфавитов и навигации
- Добавлен TextInputCell для ввода отдельных символов с циклической навигацией
- Создан TextInputSettingsBinder для интеграции ввода текста с системой настроек
- Реализована компактная сериализация настроек (только нужные поля в JSON)
- Внедрена система баланса игрока (BalanceManager)
- Баланс начисляется при оплате импульсом, списывается при начале/продолжении игры
- Добавлен InactivityManager для выхода в меню при отсутствии активности (5 минут)
- Улучшена система настроек
- Добавлены флаги shownInSettings и exposed для управления видимостью настроек
- Реализована автоматическая регистрация/отписка SettingsButtonBinder при активации/деактивации
- Исправлена загрузка настроек с проверкой типов через Sanitize()
- SettingsApplier упрощен - оставлена только поддержка AudioManager
- Добавлен ValueSelectorRow для выбора целочисленных значений с шагом
- Удалены примеры и документация из production кода (QUICK_SETUP.md, TextInputExample, AdvancedLoggingExample)
- Убран весь отладочный вывод Debug.Log из системы настроек и ввода текста
- Очищены неразрывные пробелы из файлов проекта
- Добавлены префабы UI (InputCell)
- Добавлена система баланса игры (BalanceManager) для управления внутриигровой валютой
- Баланс начисляется за импульсы оплаты и списывается за начало/продолжение игры
- При старте игры весь внесенный баланс списывается, а жизни начисляются в соответствии с количеством оплат
- Добавлены проверки достаточности баланса для начала и продолжения игры
- Интегрирован BalanceManager с PaymentManager и GameManager
- Исправлен баг с возможностью снятия паузы при показе баннера проигрыша/победы
- Добавлена блокировка переключения паузы через IsActive флаг в PauseMenu
- Жизни больше не могут уйти в минус при повторной смерти во время показа баннера
- Настройки стоимости импульса, начала и продолжения игры берутся из SettingsManager
- Добавил новую систему настроек, возможности:
- Динамически создает список настроек
- Сохраняет настройки в JSON-файл
- Возможность группировать настройки
- Широкие возможности по кастомизации
- Применение настроек в реальном времени (частично)
- Добавил префабы для новых элементов настроек
- Изменил поведение игры исходя из нового формата настроек
- Теперь игрок при смерти будет падать вниз
- Изменил поведение игрока при смерти
- Изменил поведение врагов при смерти игрока
- Изменил поведение ловушек при смерти игрока
- Исправил баг, что при первом запуске игры на автомате, если не сохранить настройки, ток при включенной бесплатной игре девочка возрождалась не на чекпоинте, а на месте смерти
- Исправил баг, что при бесплатной игре все равно требовалась оплата для продолжения игры
- ТЕПЕРЬ ВМЕСТО БАТАРЕЕК ЛЕТУЧИЕ МЫШКИ, УРААА
- Добавил моргание шапки автомата до начала игры
- Исправил мелкие баги с оплатой для продолжения игры