3 Commits

Author SHA1 Message Date
cb2e83a596 feat(ui, prizes, spawners, editor): expand prize flow and add spawning/editor tooling
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
- доработан 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'ы и добавлены сопутствующие проектные артефакты,
  которые сейчас используются обновлённой конфигурацией проекта
2026-04-28 14:05:05 +03:00
4374c6f63f refactor: rework environmental spawner, remove pooling, add trigger-based particle switching
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
- Убран пулинг из `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`.
2026-03-03 14:55:58 +03:00
de87b318b7 feat: add ScoreSystem, environmental collectibles, object pool and spawner
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
- Добавлен `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()` при старте новой игры и при потере жизни.
2026-03-03 09:14:49 +03:00