Implement achievement system: add achievement controller, UI components, and tests

This commit is contained in:
Kirill
2026-10-18 20:14:27 +03:00
parent e41d652631
commit e1782c7b10
8 changed files with 358 additions and 10 deletions
+29
View File
@@ -249,3 +249,32 @@ H списывает только оставшуюся после замещен
`tests/test_extra_params.gd` проверяет загрузку точных чисел и изменение энергии,
плотности, объёма пустот, порогов индикатора и бонуса горючести.
## Достижения и уведомления
`OwniverseAchievementLoader` задаёт локализованные достижения. Строки с
`Ignore=1` исключены из проверок, списка и общего количества. Для включённых
строк поддерживаются `age::порог` и `total:ID:порог`. `total` — накопленные
поступления `stats.total_amount`, включая автоматическое производство и
эволюцию; расход и гибель объектов не уменьшают этот счётчик. Возраст берётся
из завершённого состояния симуляции. Пороги разбираются точной арифметикой.
`ui/achievements/achievement_controller.gd` проверяет условия при смене
ревизии состояния и после создания новой вселенной. Пустое OpenCondition
делает достижение видимым без уведомления; непустое открывает его с серой
иконкой `g`. Выполнение AchieveCondition выдаёт цветную иконку `c`. Если оба
условия выполнены одновременно, показывается только цветное уведомление.
Уже полученные достижения повторно не выдаются.
Состояния видимости и получения сохраняются отдельно в
`user://achievements.cfg` и сохраняются между вселенными. Очередь уведомлений
не сохраняется. Единая панель поверх индикаторов следует за выбранной
страницей: показ 3 секунды, затем затухание 0,3 секунды. Меню приостанавливает
таймер. Клик или касание закрывает текущее уведомление; очередь сохраняется. После показа индикаторы возвращаются. Тексты списка и уведомления
обновляются при смене языка; список прокручивается.
`tests/test_achievements.gd` проверяет все включённые пороги, фильтр Ignore,
открытие и получение, отсутствие повторных уведомлений, паузу в меню,
возврат индикаторов, сохранение прогресса и локализацию. Файл прогресса теста
создаётся отдельно в `/tmp`.