САД САМОЦВЕТОВ · ДОРОЖНАЯ КАРТА

От красивого прототипа
к полноценной игре

Четыре обязательных направления: 50 волн и бесконечность, онлайн, подробные рейтинги и профиль. Здесь собраны правила, структура данных, порядок работ и критерии приёмки.

0.10.0 · Совместная карта1–4 и «Последний выживший»2–4 реализованы и проверены локально. Ниже — описание и скриншоты обоих режимов. Для игры вместе через интернет ещё нужны отдельный сервер и настоящая почта. На Sites работает одиночная игра; обновление публикации фиксируется отдельно. Следующие этапы — сводная/сезонная статистика, рейтинг и оставшиеся34 уникальные анимированные формы.

Карта: выразительнее без новых эффектов

Ослаблен серый туман, сбалансированы имеющиеся источники света. Море стало глубже по цвету, золотистый маршрут — заметнее, интерфейс получил более чёткие изумрудные и тёплые акценты. Иллюстрации камней и утверждённая графика сохранены.

Карта после цветовой настройки
Стало: чистый воздух, насыщенное море и более объёмный остров.
Карта до настройки
Было: туман смешивал цвета сцены с серо-зелёным фоном.

В одинаковых проверочных сценах: 79 отрисовок на ПК, 68 в мобильном low; один проход сцены. Количество геометрии/текстур и размер теней не выросли. 293 файла утверждённой графики совпали по SHA256. Это проверка бюджета и поведения, не измерение FPS физического телефона.

0.10.0 — последний выживший

Статус на10 ноября2026: режим2–4 игроков реализован и проверен на локальном сервере. Общая карта co-op1–4 и одиночные режимы сохранены. Интернет-сервер и настоящая почтовая доставка ещё не подключены; статический Sites сам не запускает сетевые комнаты. Обновление публикации фиксируется отдельно от локальной готовности.

Понятный цикл соревнования

Что означает «одинаковые условия»

Профиль last-survivor-equal-v1 отделён от обычной и совместной игры. Карты и исходные ресурсы одинаковые. Базовые случайные броски камней привязаны к волне, номеру оплаченного повтора пятёрки и позиции1–5. Порядок кликов игроков, задержки сети и молитва другого игрока не сдвигают эту последовательность.

Итоговое качество рассчитывается по обычной таблице личного уровня хранителя. Опыт за успешную защиту может различаться; при разных уровнях одинаковый базовый бросок может дать разные качества. Собственная молитва законно меняет вероятность выбранного вида, сохраняя бросок качества. Она не меняет следующий камень. Случайный результат понижения качества выделен в отдельный бросок и также не зависит от молитвы на последнем камне.

Сервер хранит закрытый ключ матча и получает начальные состояния бросков через HMAC-SHA256. Ключ, seed, будущие случайные потоки и журнал не передаются клиенту. Базовое ядро использует32-битные состояния: до рейтингового запуска ещё нужен отдельный аудит предсказуемости и проверяемый протокол фиксации случайности. Текущий режим обычный, без рейтинга.

Состав, свойства, элитность, награды и штрафы врагов у всех совпадают по номеру волны и противника. Для равного соревнования обычная волна имеет10 врагов, после50 —30. Боссы используют отдельное число по правилам ядра. Адаптивное изменение числа по успехам отдельного сада здесь не переносится в следующий раунд; исходная адаптация одиночного/co-op режима сохранена в своих профилях. Это самостоятельное правило веб-соревнования, не заявление о точном воспроизведении Dota Race.

Восстановление и итоги

Переподключение возвращает то же поле, место в лобби, пятёрку и подтверждённые команды. Во время обрыва идёт общий срок стройки; отдельной остановки соревнования нет. Падение процесса замораживает симуляцию до восстановления из долговечного состояния: пропущенное реальное время не догоняется. Полный PostgreSQL и эксплуатационная политика таких остановок ещё требуют проверки.

Выбывший игрок получает просмотр состояния соперников без права менять своё поле. Уход создателя после старта не завершает матч оставшимся игрокам. Все отключились на5 минут — соревнование помечается брошенным, без выдуманного победителя. Создатель может закрыть незапущенное лобби.

Один матч создаёт один общий итог и личный отчёт каждого участника. В отчёте есть место, исход, причина/время выбывания, состав башен, качества, MVP, урон, убийства, жизни и личная экономика. Повтор команды и повторная финализация не создают второй результат. Все записи server_casual; локальные сохранения не импортируются в общий рейтинг.

Что проверено

Итоговая регрессия:287 клиентских и50 серверных автоматических проверок, всего337 без ошибок. Браузерные сценарии и осмотр скриншотов выполнялись отдельно.

Дальше по плану

Коммерческие функции и платежи на этом этапе не добавлялись.

Лобби соперников
Лобби соперников · локальная проверка.
Личное поле и общий раунд
Личное поле и общий раунд · локальная проверка.
Итог соревнования · тестовая сдача
Итог соревнования · тестовая сдача · локальная проверка.

Скачать описание этапа · Инструкция запуска сервера

0.9.0 — одна карта для команды

Статус на 10 ноября 2026: совместная игра для 1–4 игроков реализована и проверена на локальном сервере. В опубликованной версии Sites по-прежнему доступна одиночная игра в браузере. Для входа в команду через интернет ещё нужно разместить игровой сервер и подключить настоящую отправку писем. Скриншоты ниже получены в локальной проверке.

Что уже работает

Управление на телефоне

Первое короткое касание свободной клетки выделяет её. Второе касание той же клетки или кнопка «Поставить» создаёт камень. Жесты перемещения и масштаба не строят. Это управление работает и в одиночной игре. При выделении карта сохраняет положение: появление и исчезновение карточки камня не сдвигают место второго касания.

Кнопка «Подсветить» отправляет союзникам цветную отметку с именем автора на шесть секунд. Она не ставит камень, не резервирует клетку, не расходует золото и не меняет следующие выпадения. Ограничение — одна отметка в секунду от игрока. Отметки находятся у основания объектов и перекрываются кристаллами по глубине.

Кнопка команды рядом с подсказкой волны показывает готовность союзников. Внутри доступны участники, подключения, готовность, фактически снятое здоровье врагов и убийства. Общие ресурсы показаны один раз. Книга, избранное, несколько целей рецептов и предпросмотр синтеза сохранены. Открытая книга не останавливает сетевой бой.

Сложность и соответствие оригиналу

Текущий профиль называется coop-proportional-v1. При старте фиксируется P — число игроков, от 1 до 4. Здоровье противников умножается на P ровно один раз. Число врагов, скорость и штраф за пропуск не умножаются. Уход игрока не уменьшает сложность начатой партии.

Это сознательное пропорциональное правило веб-версии по запросу пользователя. В найденном GemTD2.0 используются другие коэффициенты: HP 0.69/2.91/5.17/7.81 и скорость 0.69/1.01/1.19/1.42. Текущий профиль не объявляется точной копией этих коэффициентов.

Начальных булыжников 32/16/8/0 для 1/2/3/4 игроков. Веб-версия выбирает подмножество утверждённых одиночных позиций. Точные координаты многопользовательских булыжников оригинала ещё не сверены; уменьшение поля не выполняется.

Отключения и восстановление

Сервер и результаты

Клиенты отправляют намерения. Сервер проверяет участника, ход, фазу, права, рецепт, деньги, занятую клетку и проходимость. Конфликтующие команды выполняются последовательно: на одну клетку создаётся только один камень. Состояние и подтверждение команды сохраняются одной транзакцией. Повтор сообщения не повторяет покупку или постановку.

У команды одна итоговая запись матча и отдельный личный отчёт каждого участника. Урон и убийства относятся к владельцу башни; общая экономика явно отмечена как командная. Она не суммируется как четыре независимых дохода. Результаты имеют статус server_casual. Глобальный рейтинг, сезоны, подробная история авторов ингредиентов и вклад поддержки ещё не готовы.

Проверено

Следующие этапы

Уже утверждённые иллюстрации минералов, внешний вид острова и маршрут одиночной карты сохранены. Магазин и денежные платежи на этом этапе не добавлялись.

Лобби четырёх игроков
Лобби четырёх игроков · локальная проверка.
Выбор клетки и подсветка союзникам
Выбор клетки и подсветка союзникам · локальная проверка.
Общий лабиринт и одна волна
Общий лабиринт и одна волна · локальная проверка.

Скачать описание этапа · Инструкция запуска сервера

Серверная основа, профиль и одиночная сетевая партия

Промежуточный этап0.8.0,10 ноября2026. Полная дорожная карта остаётся открытой. Профиль и серверная партия работают в локальной проверке; подключение через интернет и настоящая доставка писем ещё не настроены. На Sites сохраняется локальная игра; экран профиля объясняет доступность без неработающих форм.

Что реализовано

Что проверено

Это не проверка FPS физического телефона, качества реальной SMTP-доставки, полномасштабного PostgreSQL или распределённого отказа нескольких машин. Смена часов на31 секунду в тесте не измеряет фактическое время восстановления.

Ближайшие работы по серверу

Дальнейшая очередь

Файлы и эксплуатационные правила

Код находится в существующем проекте sites/gemtd-prototype/server. Подробности запуска и ограничений — server/README.md. server/.data, .mailbox, .env и node_modules исключены из Git/Docker/публикации. Статическая сборка копирует только public,src и интерфейс; серверные секреты и файлы пользователей в неё не включаются.

Технические первоисточники: node-postgres, PGlite, ws, Argon2, OWASP, Pwned Passwords, Nodemailer.

Профиль хранителя в локальной проверке
Профиль · тестовый адрес · локальная проверка.
Серверная партия в локальной проверке
Сетевая одиночная партия · сервер рассчитывает бой.

Скачать этап · Markdown · Инструкция запуска сервера

Настоящий бесконечный режим после кампании

10 ноября 2026. Версия 0.7.0. После завершения 50-й волны доступна отдельная кнопка «Продолжить · бесконечность». Это собственный web-endless-v1, не конечный оригинальный повтор 51–100 без строительства.

Продолжение и результат кампании

Рост угрозы и ограничения

Для абсолютного номера n > 50 семейство равно ((n − 1) mod 50) + 1, цикл — floor((n − 51)/50) + 1. Целевая сумма HP растёт на 2,5% за волну и рассчитывается через логарифм: log B(n) = log B50 + (n − 50) × log(1,025).

B50 определён как наибольший нормированный бюджет основных семейств 41–50 с количеством при продолжении, ограниченным 5–30. Использование только HP одиночного финального босса могло бы сделать 51-ю заметно слабее обычных волн конца кампании. Элитные случайные выбросы в опорный бюджет не включены. Это уточнение стартовой кривой для веба, не доказательство окончательного баланса.

Общий бюджет распределяется между противниками текущей волны. Для смешанных семейств 35/36/38 относительная разница HP вариантов сохраняется через отношение к среднему исходному HP пары. Варианты на всю волну имеют общий бюджет, но сохраняют разные способности.

Два условия каждого цикла

Выбираются два разных эффекта из четырёх: броня (+5 за цикл, максимум +100), магическая защита (+3 п.п. за цикл, максимум +30; у неиммунных итог не выше 90%), регенерация 0,3% HP/с, блок первого положительного попадания. Врождённая магическая невосприимчивость источника не меняется этим cap.

Пара определяется отдельным seed от исходного seed партии и номера цикла. Просмотр не расходует случайность камней/волн. Условия видны до строительства на кнопке памятки и подробно в окне волн. Памятка бесконечности показывает текущую и девять ближайших волн с абсолютными номерами.

Поле не должно создавать тупик

Постановка уже позволяет заменить старый булыжник, но когда поле заполнено башнями, пяти допустимых клеток может не остаться. В меню бесконечности появилась команда «Пропустить стройку» с подтверждением.

Можно отказаться и от частично построенной пятёрки. Её новые камни становятся булыжниками, готового результата не остаётся; сохранённые башни и RNG не откатываются. После этого состояние готовности позволяет запустить волну верхней кнопкой. Это не бесплатный повтор с сохранением удачного результата. Отмена подтверждения ничего не меняет. В обычной кампании и во время боя команда недоступна.

Численная безопасность и длительные партии

Расчёт целевого HP проверен для каждой вычисляемой волны до 10000. Это математический стресс-тест, не обещание десяти тысяч реально сыгранных волн или измерение телефона.

Для этой версии выбран явный предел log B(n) ≤ log(10^240), с запасом для множителей и сумм. При его достижении следующая волна не запускается: партия получает отдельный technical_limit на последней завершённой волне, с сохранением кампании. Это не поражение и не обычный рейтинговый рекорд. Число предельной волны зависит от опорного бюджета; в браузерном проверочном сценарии — 21809.

Большие числа форматируются компактно в научной записи. Статистика снятого HP использует действительную разницу HP до/после: очень маленькое попадание, округлившееся при огромном HP, не приписывает себе несуществующее снятое здоровье. Большие конечные значения MVP-score сохраняются отдельно от целочисленных счётчиков построек.

История/сохранение пока локальные. Проверка формулы до 10000 не означает, что браузерное хранилище выдерживает неограниченную историю; серверный журнал и устойчивые checkpoint — следующий этап. Физический телефон и реальная длительная стратегия пока не заменены программным стендом. Кривая 2,5% и два условия — старт балансировки отдельного режима.

Проверки

282 автоматических сценария прошли. 15 новых: отказ до победы, явное продолжение и повтор команды, старый профиль, семейства после 100, формулы до 10000, независимые условия, caps скорости/количества/живых, стройка/выбор после 50, частичный отказ без бесплатного результата, численный предел, очень большие HP/score, повреждённая запись и сохранение. Проверочный полный дополнительный цикл доходит до 101, не выдаёт новые ступени MVP и сохраняет кампанию. Для проверки жизненного цикла используется проверочный урон с учётом щитов; это не баланс реальной игровой стратегии.

Браузерный отчёт output/GemTD_endless_UI_QA.json: кнопка победы, 51/∞, сохранённые башня/MVP/600 золота, условия до стройки, десять будущих строк, просмотр без изменений, отмена/подтверждение частичной стройки, ручной запуск 51, загрузка боевого сохранения, отдельный технический итог/статистика/перезагрузка. Экраны 320×568, 390×844, 844×390 и 1440×1000 без горизонтального переполнения и JS/HTTP ошибок.

Утверждённая графика сохранена. 50 индивидуальных моделей ещё не готовы: текущая библиотека содержит 16 анимированных форм; разные размеры и цвета не считаются новыми моделями. Продолжаются оставшиеся native-неопределённости и игровой баланс. Далее — авторитетный сервер, почтовый профиль, надёжная статистика и восстановление подключения, затем co-op и Last Survivor с рейтингами/сезонами. Настройки реального хостинга и отправки писем пока не получены, поэтому доступный сайт остаётся одиночным.

Продолжение после победы
Продолжение — отдельный выбор после 50.
Условия бесконечности
Условия известны перед строительством.

Скачать раздел · Markdown

Награды, сердце, защита и ослабляющие ауры

10 ноября 2026. Пакет 0.6.6 завершает ещё одну проверяемую часть боевых свойств. Новая система волн v8 и совместимость прежних сохранений сохранены.

Награды за убийства

Защита башен

Красный коралл, Камень стойкости и Глубинная жемчужина дают стрелковым соседям защитный маркер в 600 исходных единицах. Реализовано подтверждённое по флагам взаимодействие с вражеской аурой обезоруживания: отмеченная башня не получает от неё новое обезоруживание.

Исходный chenmo не добавляет +100 MR, не снимает старые эффекты и не оглушает/не заставляет молчать врагов. Уже наложенный debuff не очищается. Прямое ответное обезоруживание идёт другим путём ApplyModifier и в текущем веб-контракте остаётся действующим. Нативное C++-поведение этого прямого пути не было объявлено доказанным универсальным иммунитетом.

Ослабление недревних противников

Наследование и незавершённые native-эффекты

Добавлены числовые определения fenzheng (аура MR −50 в 400) и attack7 (+1280 базовой атаки), чтобы допустимое сохранённое наследование обрабатывалось последовательно. У этих двух и старого 5shihua нет прямых носителей ни в одном NPC свежего пакета. Присутствие в whitelist не доказывает, что их можно получить в обычном синтезе; новые носители не выдумывались.

Maoyan подтверждён как DAMAGEOUTGOING_PERCENTAGE=30 в радиусе 500, но доступная официальная справка не устанавливает scope physical/all-types. Он остаётся явно будущим эффектом в книге. Отдельный старый 5shihua фактически имеет шанс 1% и вызывает native Medusa L1; срок 20 секунд относится к скрытому источнику, не к оглушению цели. Его не подменили современным окаменением или догадкой по названию.

Значки и оформление

К прежним 17 добавлены три рисунка в том же медальонном стиле: цельный защитный щит со звездой, золотые монеты, сердце с листьями. Все 20 имеют разные силуэты, доступные имена, область нажатия 44 px и соответствующие описания. В фильтрах появились оберег, золотая награда и восстановление сердца. Предыдущие изображения самоцветов и рисунки значков сохранены.

Для успешной награды/восстановления используются небольшие существующие ограниченные всплески. Новых полноэкранных эффектов, моделей или текстур ради этих срабатываний нет.

Явные веб-решения

Проверка

267 автоматических проверок прошли. 14 новых проверяют тип ancient, все три числовых набора, флаги иммунитета, старые поля, общий плоский slow, итоговые награды и XP, независимость бросков, одинаковые источники, диапазон/след, здоровье свыше 100, сохранение, защиту от aura-disarm и отдельное retaliation, свойства книги, повреждённые поля и отсутствие вымышленных носителей.

Браузер: output/GemTD_reward_property_icons_QA.json — 20 разных рисунков/описаний, все 52 карточки и 51 рецепт, фильтры, уникальные SVG IDs, 44 px, экраны 320×568/390×844/844×390/1440×1000, состояние и RNG не меняются от просмотра. output/GemTD_reward_effects_UI_QA.json — фактические срабатывания, золото 50 вместо 5 при прежних 5 XP, отдельно +45, сердце 101/101, отчёт и загрузка. Ошибок JS/HTTP нет. Проверочные сценарии не заменяют баланс обычных игровых партий и FPS физического телефона.

Аудит: data/remaining-effects-audit-2026-11-10.json/.md, свежий KV и source.lua из неизменного Workshop 3817795446. Полный Lua, скрытые ключи и Valve-ассеты не публикуются.

Следом — настоящий endless после 50 с продолжением строительства, контролируемыми ресурсами и сохранением победы кампании; затем сервер/профиль/почта, совместная карта 1–4, Last Survivor, общая статистика и сезоны. Площадка и реальная отправка писем ещё не настроены; локальная разработка сервера может идти независимо. Исследование 50 индивидуальных моделей остаётся отдельной частью работы.

Учёт наград и восстановления сердца
Бонусы отдельно отражены в статистике.

Коллекция 20 значков · Скачать раздел · Markdown

Полная таблица вариантов волн, элита, серия и ярость

10 ноября 2026. Пакет 0.6.5. Новые экспедиции используют отдельный профиль prototype-solo50-variants-v8. Старые сохранённые партии продолжают прежнюю систему волн prototype-solo50-v7: основные противники и фиксированное число. Переход происходит только при новой экспедиции; существующий лабиринт не сбрасывается автоматически.

Таблицы и случайные варианты

Варианты боссов

Элита и награды

Изменение числа противников

Ярость

В одиночном бою первая подходящая целая секунда — 181. Все текущие и последующие враги получают +100% скорости и невосприимчивость к магии. На карте появляется заметная отметка «ЯРОСТЬ», памятка показывает действующее состояние. При переходе к новой волне состояние сбрасывается.

Ярость включается только в бою. Буквальный старый Lua мог включить её и во время долгого строительства, сохранив stop_watch прошлой волны; этот баг не переносится. Совместный профиль ещё не подключён; его исходные сроки 300/420/540 секунд требуют отдельной реализации вместе с количеством игроков и сервером.

Интерфейс и сохранения

Памятка содержит все 50 волн, текущее адаптивное число и серию, возможные альтернативы и диапазон HP. Невидимость альтернативного варианта предупреждается до начала волны. Просмотр не выбирает вариант и не изменяет RNG. Для старого сохранения показывается пояснение о прежней системе; новая экспедиция включает v8.

Случайный поток волн отделён от генерации пятёрки и боевых попаданий. Семантический порядок выбора вариантов/элиты/урона прорыва перенесён, полный глобальный Lua RNG-поток с UI-событиями и движковыми вызовами не воспроизводится. Выбранная волна, дата, число, серия, элита, награды, урон прорыва и RNG сохраняются. Неизвестные версии и повреждённые новые поля отклоняются.

История партии записывает фактический вариант, число при запуске, элитные убийства и ярость. Статистика остаётся локальной до подключения серверного профиля.

Проверка и границы результата

253 автоматических проверки, включая 19 новых для v8. Проверены все 17 общих веток, три индивидуальные, боссы, вероятности 20/8/72, календарные границы, элитные формулы и однократность награды, число боссов, серия и минимум, точные штрафы, сохранённый урон прорыва, граница ярости, независимость генерации камней и JSON-детерминизм.

Проверочный цикл проходит все 50 волн с адаптивным количеством и фактическими вариантами, восстанавливая JSON после каждой десятки. В этом тесте враги завершаются проверочным уроном: он проверяет жизненный цикл и учёт, не доказывает игровой баланс или победу обычной стратегией. Полноценные игровые партии и оставшиеся неподдержанные ауры остаются частью дальнейшей проверки.

Браузерный отчёт output/GemTD_wave_variants_UI_QA.json: новые партии v8, старый профиль без подмены, явный новый старт, 50 записей памятки, предупреждение невидимости, просмотр без изменения состояния, реальная элитная модель/полоска/сохранение, отображение ярости. Размеры 320×568, 390×844, 844×390 и 1440×1000 без переполнения и JS/HTTP ошибок. Производительность физического телефона ещё не измерена.

Это по-прежнему опытный веб-профиль, не заявление о завершённой Classic-совместимости. Физическая броня, MR-модификаторы, сложение скоростей, обработка всплесков, отдельные защитные/наградные ауры и движковый Blink имеют ранее перечисленные веб-контракты/неопределённости. Семь Race-предметных вариантов, аккаунтные/дневные слова и дополнительные магазинные системы не подмешиваются в обычную игру.

Дальше по одобренному плану: оставшиеся ауры и баланс обычных партий; настоящий endless после 50, с безопасным ростом чисел и решением заполнения поля; сервер, почтовый профиль и статистика; co-op 1–4; Last Survivor, общие рейтинги и сезоны. 50 индивидуальных моделей остаются отдельной художественной задачей.

Факты: data/wave-variants-audit-2026-11-09.json и data/wave-variant-facts-2026-11-10.json. Основной source.lua повторно прочитан ограниченными фрагментами; OnThink возвращает 1 s. Полный Lua и Valve-ассеты не публикуются.

Памятка вариантов волн
Количество, серия, элита и ярость.
Варианты38-й волны
Невидимость предупреждается заранее.

Скачать раздел · Markdown

Магические плиты: отдельный слой и заклинания

10 ноября 2026. Пакет 0.6.4. Работают восемь семейств по три уровня: 24 плиты. Это следующая часть боевого этапа, не завершение всего одобренного плана.

Создание и улучшение

Проверенные фактические эффекты в одиночной игре

Сила заклинания в источнике равна 5 − число игроков; одиночная — 4. Она отличается от уровня самой плиты. Нынешний клиент остаётся одиночным; будущему кооперативу потребуется собственный проверенный профиль сложности.

Ледяная цепь и статистика

Срабатывание плиты ищет носителей tower_chain_frost в 500 исходных единицах от цели. Первый получает шанс 15/30/60% по уровню плиты; при неудаче у следующего знаменатель растёт в два, затем в три раза. После первого успеха поиск заканчивается. Поддерживается и наследование этой способности Природным изумрудом.

Цепь наносит до 11 попаданий по 12000 магического урона, замедляет на 60% на пять секунд; первая цель кратко оглушается. Шаг 0,2 s плюс полёт, дальность следующего звена 1000. Повторные цели разрешены, невидимые следующие звенья исключены. Само магическое повреждение не обходит невосприимчивость. Урон относится к башне-источнику и учитывается для её MVP; плиты собственные ступени MVP не получают. Источник IsTower не включает плиты.

Урон плит, если он есть, включён в локальную статистику по отдельной форме плиты. Находящиеся рядом MAX-башни могут усиливать её через MVP-ауру. Это по-прежнему локальный отчёт партии, не защищённый глобальный рейтинг.

Изображения и производительность

Использованы 24 утверждённые иллюстрации world/v0.2 без перерисовки. Доставка WebP 256 px суммарно 480370 байт; исходные PNG и их SHA256 сохранены. Новая графика персонажей не создавалась.

На поле — низкие объёмные плиты с разными узорами семейств и более сложной окантовкой II/III. Рисование объединено по определению: два или двадцать экземпляров одного вида используют одну отрисовку. Материал общий, индивидуальные тени от плит не считаются, новых полноэкранных эффектов нет. Коллекция из 48 экземпляров, по два каждого определения, добавляет 24 отрисовки при отключённых тенях.

Проверки и явные границы

234 автоматических проверки прошли, из них 19 новых: все рецепты, атомарные отказы, свободный слой, четыре направления линии, каскад, cooldown в строительстве, реальные параметры заклинаний, невосприимчивость, затухание, цепные возвраты, MVP-атрибуция, JSON и повреждённые поля.

Браузерный отчёт output/GemTD_slates_UI_QA.json: 8 групп/24 изображения, 52 карточки/51 рецепт кристаллов, кнопка готовой плиты, реальный выбор клетки, отмена, подтверждение, верхний старт, восстановление слоя и геометрии, фактическое оглушение, приближение из списка. Проверены 320×568, 390×844, 844×390 и 1440×1000; нет горизонтального переполнения и ошибок JS/HTTP. Измерение числа отрисовок не заменяет тест FPS на физических телефонах.

Время округляется до 30 Hz. Полёт использует дистанцию при отправке, как прочие веб-снаряды; native-перехват и вертикальные подбрасывания не воспроизведены. Неупорядоченные FIND_ANY_ORDER и Lua pairs заменены стабильным порядком ID, а выбор следующего сгустка — ближайшим подходящим врагом. Одинаковые модификаторы выбирают наиболее сильное активное значение, разные типы брони складываются; native-правила сложения и точный порядок движкового урона остаются явно открытыми вопросами.

Прямое исследование: merge_shiban, start_shiban_timer, shiban_update_one, TriggerShiban, ChainFrost, Youbu1/2/3, Cask2/3 в свежем source.lua; дополнительно расшифрованы как текст venomous_gale.lua, paralyzing_cask.lua, chain_frost.lua и прочитан полный свежий KV способностей. Исходные Lua и Valve-ассеты не публикуются; в игре только выбранные числовые факты и собственные материалы.

Дальше: оставшиеся защитные/наградные/ослабляющие ауры и проверка maoyan; оригинальные варианты волн, элита, адаптивное число, ярость с версионированными правилами; настоящий endless; сервер и профиль; совместное поле 1–4; Last Survivor, глобальные рейтинги и сезоны. Двухэтапная постановка обычных кристаллов и пинги остаются отложены до отдельного этапа управления/кооператива.

Книга плит
Восемь семейств и три уровня.
Выбор клетки плиты
Место выбирается перед подтверждением.

Скачать раздел · Markdown

Особые эффекты, синтез, MVP и статистика партии

10 ноября 2026. Пакет 0.6.3 продолжает одобренный боевой этап. Золотая экономика и предыдущие эффекты сохранены. Плиты, полные варианты волн, endless и серверные режимы остаются следующими самостоятельными частями плана.

Боевые способности

Особенности при создании минерала

MVP

Статистика и интерфейс

Меню карты → «Статистика партии». Те же данные доступны из итогов с возвратом к итоговому экрану. Показаны фактически снятое здоровье, победы над врагами, полученное/потраченное/украденное золото, вклад минералов, все раскрытые качества, история MVP и завершённых волн. JSON-отчёт содержит также отдельные формы башен до и после синтеза. Старое сохранение начинает частичный учёт с текущей волны, без выдуманной истории.

В книге и коллекции теперь 17 разных медальонов: добавлены крит, молния, холод, окаменение, случайная атака, наследование и темперамент. Значки открывают конкретные описания; фильтры используют тот же реестр, что и бой. Иллюстрации минералов сохранены. Небольшие эффекты молнии и всплесков имеют общий предел 36 активных объектов; геометрия и материалы освобождаются после завершения. Новых полноэкранных проходов нет.

Эта статистика пока относится к текущей партии и данному браузеру. Она не выдаётся за серверный профиль, историю между устройствами или защищённый глобальный рейтинг.

Проверка и следующие части

215 автоматических сценариев: PRD, цели и задержки разрядов, магическая невосприимчивость, холод, окаменение, случайная атака, копирование, старые снаряды, MVP, реальные HP против избыточного урона, перенос ступеней, испорченные сохранения и детерминизм после JSON-загрузки.

Браузерные отчёты output/GemTD_trigger_property_icons_QA.json и output/GemTD_mvp_and_statistics_UI_QA.json: 52 карточки и 51 рецепт, 17 разных рисунков, соответствующие описания, фильтры, доступные имена, отчёт и скачивание JSON, загрузка MVP, возврат из статистики к итогам, очистка FX. Экраны 320×568, 390×844, 844×390 и 1440×1000 без горизонтального переполнения. Ошибок JS/HTTP нет. Это не замер FPS физического телефона.

Следом: 24 плиты в отдельном неблокирующем слое и их создание/улучшение; ещё не перенесённые наградные, защитные и maoyan-эффекты с проверкой native-неопределённостей; полный профиль альтернатив волн, элиты, числа врагов и ярости с сохранением старых правил для старых партий; настоящий endless; сервер, почтовый профиль, кооператив, Last Survivor и глобальные рейтинги. Для публикации сервера остаётся получить площадку и настройки отправки писем; локальная разработка от этого не зависит.

Источники: локальные JSON-аудиты basic-gems-combat, combat-effects и wave-variants от 9 ноября 2026; VPK повторно проверен 10 ноября, SHA256 c2aed66ec055edf7fdd3bceb02a0d941d207c01b82326074366f0642c623166e. Оригинальные Lua и Valve-ассеты остаются локальными исследовательскими материалами.

Статистика партии на мобильном экране
Меню карты → Статистика партии.

Все 17 значков свойств · Скачать раздел · Markdown

Подтверждённые боевые эффекты

9 ноября2026. Пакет0.6.2 — первая часть большого боевого этапа. Экономика0.6.1 сохраняется; остальные одобренные направления не объявляются завершёнными.

Исправленные базовые правила

Перенесённые способности составных башен

Книга, графика и сохранения

Описание и фильтры теперь используют тот же реестр эффектов, что и бой. Действующие способности не скрываются в разделе будущих. Удалены ложные предположения из старого автоматического разбора: неиспользуемый poison-MR модификатор не показывается как работающий или обязательный будущий эффект.

В общей коллекции10 медальонов: добавлены оглушение и дальность/точность. Предыдущие восемь рисунков и иллюстрации минералов сохранены. Портреты, цели, избранное, фильтр пятёрки и выбор места синтеза продолжают работать. Для оглушения добавлен небольшой ограниченный по числу всплеск; новые полноэкранные графические проходы не используются.

Динамические баффы/дебаффы, снаряды и состояния переживаютJSON-сохранение. Повреждённые новые поля выявляются при восстановлении. Скомпилированные описания и источники аур кешируются на текущий tick/revision, без сохранения вычислительного кеша в матч.

Явные границы

Доказательства и проверка

Машинные аудиты: docs/planning/data/combat-effects-audit-2026-11-09.json и basic-gems-combat-audit-2026-11-09.json. Генератор фактического списка92 башен: tools/maps/prepare-combat-registry.mjs. Полный addon Lua и Valve-ассеты в публикацию не добавлялись.

186 автоматических тестов прошли.14 новых сценариев проверяют урон без двойного бонуса, все6 топазов,4/7/13 целей, вторичные выстрелы без on-hit, сроки яда/замедления/брони, сочетание аур, магическую невосприимчивость, точность, оглушение и детерминизм сохранений.

Браузерный отчёт output/GemTD_combat_property_icons_QA.json: все10 значков открывают нужные описания,52 карточки/51 рецепт сохранены, фильтры учитывают новые реальные свойства,320/390/844/1440px без горизонтального переполнения. ОшибокJS/HTTP нет. Физическая производительность телефона отдельно ещё не измерена.

Все10 значков свойств · Скачать раздел · Markdown

Золотые способности и выполнение плана

9 ноября2026. Этап0.6.1. Все семь направлений развития одобрены пользователем; эта публикация завершает первый самостоятельный пакет, не объявляет весь план выполненным.

Работает в этой версии

Уточнение предыдущего аудита качества

Полный просмотр57 Lua-файлов выявил сброс perfected, который не был учтён в первом выводе документа44. Solo/Coop допускает один успешный qualityoverride на строительный интервал между общими стартами волн. Race сбрасывает caster.perfected после завершения личной пятёрки. Это не один успех на всю партию. Точные4 присваивания и оба вида смещений находятся в data/wave-variants-audit-2026-11-09.json → prayerResetAudit. Документ44 и его онлайн-копия исправлены. Покупки качества пока не реализованы, поэтому сохранения игроков этим уточнением не меняются.

Последующие пакеты, уже разрешённые пользователем

ПорядокРаботаКритерий завершения
1Золотая экономикаМолитва вида, обмен и повтор пятёрки готовы; дальнейшие способности остаются отдельными пунктами
2Бой и составные башниРеестр эффектов, пассивный урон, яд/замедление/ауры/дополнительные цели, особые механики; затем плиты и MVP; проверка каждого эффекта
3Полные оригинальные волныАльтернативныеNPC, элита, динамическое число, ярость, версионированные сохранения и реальные стратегии50 волн
4Настоящий endlessОтдельные правила после50, понятные рост сложности/награды/строительство, устойчивость длительной симуляции
5Сервер и профильСервер принимает команды/RNG, checkpoint/reconnect, почтовый код/пароль, подробный журнал статистики
6Co-op1–4Общее поле, свои пятёрки, готовность, права, общий кошелёк и проверенный масштаб сложности
7Last Survivor и рейтингиОдинаковые отдельные поля, выбывание, итоги, lifetime/global статистика и сезоны

50 индивидуальных моделей, мобильная производительность, обучение и доступность развиваются рядом с этими пакетами. Утверждённый арт сохраняется. Двухэтапная постановка и подсветка клеток остаются отложенными до отдельного этапа управления/кооператива. Оплата — после устойчивого профиля и рейтинга, не обязательное условие сетевого тестирования.

Проверка

172 теста прошли. Новый пакет проверяет все8 видов, все4 числовых порога молитвы, отсутствие влияния на качество, атомарность отказов, cooldown в строительстве, перезагрузку и commandId, обмен с живыми врагами и сохранение башен при повторе пятёрки.

Браузерный отчёт: output/GemTD_economy_UI_QA.json. Проверены320×568/390×844/844×390/1440×1000, покупка и загрузка активной молитвы, реальные нажатия по карте для обмена,3D и координаты после переноса, отмена, подтверждение сброса, сохранение52 карточек/51 рецепта и значков свойств. ОшибокJS/HTTP нет. Физический телефон не подменяется программным стендом.

Выбор вида камня и полной стоимости способностей
Молитва вида в окне хранителя.
Обмен двух объектов на карте с отметкамиA иB
Предпросмотр обмена на карте.

Скачать раздел · Markdown

0.6.0 · Кампания50 волн и хранитель

Все50 основных NPC сверены с установленным GemTD2.0. Уточнены одиночные коэффициенты и ранние волны; после30-й и40-й игра продолжается. В меню карты хранитель показывает опыт, прогресс и вероятности качеств.

Подтверждены разовые молитвы нужного вида за200 золота, другие золотые расходы и отдельные молитвы качества. Они исследованы и включены в подробный план; покупки ещё не активны.

Открыть полный аудит, таблицу50 волн и план экономики ↗

Скачать раздел · Markdown · Таблица50 волн · CSV

157 тестов. Случайные альтернативы/элита/адаптивное число, бесконечный режим и50 уникальных моделей остаются отдельными этапами. Старые разделы ниже сохраняют историю версий.

43. Значки особых свойств минералов

Дата: 9 ноября 2026. Интерфейс: 0.5.6. Правила партии: prototype-solo30-v6.

Порядок выполнения

По просьбе пользователя сначала завершён и опубликован фильтр пятёрки с результатами пары и четвёрки, версия 0.5.5. Эта коллекция создана следующим отдельным этапом. Исправленный фильтр входит в данное обновление и проверен повторно.

Графика и смысл

Длинные текстовые плашки свойств в карточках книги заменены восемью специально нарисованными значками. Это SVG-медальоны в общей зелёной и золотистой палитре игры, с мягкими градиентами, тонким ободком, бликами и разными силуэтами. Каждый эффект узнаётся по форме; цвет служит дополнительным ориентиром.

• Обнаружение: раскрытый глаз со светлой радужкой и лучами.

• Отравление: зелёная капля яда с узнаваемым знаком токсичности.

• Снижение брони: щит с широким разломом между двумя частями.

• Замедление: шестилучевая ледяная снежинка.

• Скорость атаки: золотистые часы с крылом и следом движения.

• Урон по области: вспышка с ударной волной.

• Несколько целей: три расходящиеся стрелы.

• Огненная аура: двухцветное пламя со светлой сердцевиной.

Все действующие особые свойства карточки показываются отдельными значками; прежний предел двух текстовых меток снят. Числовые параметры и полные объяснения остаются в окне свойств минерала. Обычная атака не создаёт пустой значок, а ещё не перенесённые способности оригинала не выдаются за активные свойства карточки.

Использование

Нажатие значка открывает свойства соответствующего минерала и качества. В заголовках подробных свойств повторяется тот же рисунок, чтобы связать символ и объяснение. У кнопок есть доступные имена для экранного диктора и обычные всплывающие подсказки при наведении.

Под фильтром свойств находится аккордеон «Значки особых свойств». Внутри — восемь рисунков, названия и короткие объяснения. Он закрыт по умолчанию и сохраняет раскрытое состояние при поиске, выборе раздела, работе с целями и фильтрами. Открытие не меняет партию.

В карточке значки занимают области 44×44. При достаточной ширине они располагаются справа от названия и действий; при недостатке места переходят ниже. Текстовые названия внутри обычного списка фильтров сохранены, чтобы выбор свойства оставался понятным. Быстрая кнопка обнаружения невидимых продолжает работать.

Файлы и доставка

Основной исходник: sites/gemtd-prototype/src/ui/property-icons.js. Копии восьми отдельных SVG и manifest находятся в assets/ui/property-icons/v0.1. Галерея и скачивание файлов доступны в /ui/property-icons/ на сайте игры; опубликованные копии лежат в public/ui/property-icons.

Исходный viewBox — 48×48. Векторные файлы остаются чёткими при изменении масштаба; все восемь SVG суммарно занимают менее 10 КБ. В самой книге рисунки встроены в разметку и не создают дополнительных сетевых запросов. У каждого экземпляра собственные ID градиентов, чтобы несколько одинаковых значков не конфликтовали между собой. Новые 3D-эффекты, анимации или источники света не добавлены.

Проверка

146 тестов логики проходят. Браузер проверяет восемь разных рисунков, отсутствие текста в кнопках-значках, доступные имена, открытие соответствующего описания и легенду под фильтром. Сохранены 52 карточки и 51 рецепт, обнаружители, избранное, цели и выбор качества. Размещение и размер кнопок проверены на 320×568, 390×844, 844×390 и 1440×1000; переполнений и конфликтов SVG ID не обнаружено.

Повторный сценарий фильтра проверяет пару и четвёрку, отметки ↗, исключение старых пар, выбор клетки в предпросмотре и полный синтез до волны. Просмотр значков и легенды не изменяет состояние партии или RNG.

Отчёты: output/GemTD_property_icons_QA.json и output/GemTD_draft_upgrade_filter_QA.json. Иллюстрации: output/GemTD_property_icons_collection.png, output/GemTD_property_icons_mobile.png и output/GemTD_property_legend_mobile.png. Публикация подтверждается отдельно ответом Sites и output/GemTD_property_icons_delivery.json.

Карточки, рецепты, утверждённые изображения минералов, окружение, 30 волн и сохранения остаются совместимыми. Сезоны, сетевые режимы и 50 волн продолжают находиться в последующих этапах плана.

Открыть всю коллекцию и скачать SVG · Скачать раздел · Markdown

42. Фильтр пятёрки с учётом повышения качества

Дата: 9 ноября 2026. Интерфейс: 0.5.5. Правила: prototype-solo30-v6.

Исправленный сценарий

«Из пятёрки» учитывает как выпавшие камни, так и результат допустимого повышения их качества. Два одинаковых изумруда К1 добавляют рецепты с изумрудом К2. Четыре одинаковых изумруда К1 добавляют рецепты с К2 и К3. Рецепты с исходным К1 остаются в списке.

Отбор проходит по всем исходным формулам и группам, включая сложные составные минералы и альтернативные рецепты. Каждая формула остаётся одной записью, даже если несколько камней или способов улучшения подходят ей одновременно. «Потенциал поля» включает те же допустимые улучшения новой пятёрки наряду с реальными компонентами поля.

Отображение возможности

Ещё не построенный улучшенный ингредиент отмечен ↗ и подписью «из 2 × К1» или «из 4 × К1». Показывается изображение требуемого качества. Нажатие на него открывает его обычные свойства; звезда сохраняет именно это качество в избранное.

Такая отметка означает возможность получить один компонент, а не наличие готового камня. Полный рецепт становится доступным только после обычной проверки движка. Если остальные компоненты уже сохранены, существующее действие «Улучшить компонент» открывает предпросмотр повышения качества. В нём можно выбрать клетку результата, подтвердить улучшение и затем собрать полный составной минерал до начала волны.

Если цель рецепта уже выбрана, используется её существующая кнопка следующего шага. Отдельная дублирующая кнопка не добавляется. Цели, поиск, избранное, свойства и разделы книги работают поверх нового отбора.

Ограничения

• Учитываются только реально выпавшие одинаковые экземпляры в текущей новой пятёрке. Сохранённые пары и сочетание старого камня с новым не повышают качество.

• Из пятёрки остаётся один результат: исходный камень, улучшение пары или улучшение четвёрки. Нельзя одновременно засчитать два возможных результата в разные ингредиенты одного рецепта.

• Пара даёт +1 качество, четвёрка — отдельное +2. Будущие цепочки из ещё не сохранённых промежуточных результатов не прогнозируются.

• Один экземпляр без пары не обещает следующее качество. Во время неполной стройки отмечается только уже имеющийся набор, а не предполагаемые будущие броски.

• Потолок шестого качества и Великий камень из четырёх экземпляров пятого качества сохранены.

Механизм использует существующий расчёт допустимых выборов пятёрки в analyseRecipes. Для подходящих ингредиентов возвращаются draftUpgrades: точный исходный вид, количество 2/4, ID экземпляров, выход и обычная команда улучшения. Фильтр расширяет видимость рецепта; поля ready/completable и команды сборки не подменяются суммой виртуальных компонентов.

Проверки

146 тестов проходят. Восемь новых покрывают пример с изумрудами, четвёрки, все восемь семейств, старые пары, максимальное качество, альтернативную формулу, правило одного результата, неполную стройку и последовательность «улучшение → синтез до волны».

Браузер проверяет оба фильтра, подписи ↗, поиск, избранное и цель, отсутствие преждевременной сборки, выбор клетки в предпросмотре и реальное получение Турмалина Параиба после улучшения пары. На 320×568, 390×844, 844×390 и 1440×1000 проверяются ширина названий, метки и расположение звёзд. Просмотр книги не меняет состояние партии и RNG.

Отчёт: output/GemTD_draft_upgrade_filter_QA.json. Изображение: output/GemTD_draft_pair_filter_mobile.png. Публикация подтверждается отдельно ответом Sites и output/GemTD_draft_upgrade_filter_delivery.json.

Это уточнение заменяет ограничение фильтра только точными выпавшими качествами из документа 38. Формулы, 52 карточки, 51 рецепт, 30 волн и формат сохранений не меняются. Значки особых свойств выполняются следующим отдельным этапом по просьбе пользователя.

Скачать раздел · Markdown

41. Выбор клетки результата в предпросмотре синтеза

Дата: 9 ноября 2026. Интерфейс: 0.5.4. Профиль партии: prototype-solo30-v6.

Пользовательский сценарий

Откройте предпросмотр сборки или повышения качества. Выберите место результата нажатием на изображение компонента в нижней панели либо на сам подходящий кристалл на карте. Предпросмотр остаётся открытым. Координаты результата, выделенная картинка, белая метка и набор расходуемых экземпляров обновляются вместе.

Кнопка «Собрать» или «Улучшить» выполняет действие только после подтверждения. «Отмена» и Escape закрывают предпросмотр без расходования камней. Нажатие на пустую клетку, булыжник или неподходящий минерал не закрывает предпросмотр и не запускает строительство или удаление; появляется короткое пояснение.

Изображения стали настоящими кнопками с отметкой выбранного состояния aria-pressed. Доступны касание, мышь, Tab, Enter и пробел. На кнопке указаны координаты клетки, а доступное имя содержит минерал, качество и место. Основная область нажатия не меньше 44×44.

Допустимые места

• Для составного рецепта выбирается любой точный ингредиент текущего набора: сохранённые башни либо новая пятёрка.

• Смешивать эти два набора внутри одного предпросмотра нельзя. Если оба набора готовы, нужный набор можно выбрать существующим способом до открытия предпросмотра.

• Если на поле есть лишний одинаковый подходящий экземпляр, он тоже доступен. Выбор пересобирает точный список расходуемых камней. Исключённый сохранённый дубликат остаётся на поле.

• При улучшении пары или четвёрки выбирается любой совпадающий камень этой новой пятёрки. Третий одинаковый экземпляр может стать местом результата пары. Сохранённый экземпляр в повышение качества не подставляется.

• Великий камень из четырёх одинаковых камней пятого качества сохраняет своё особое правило.

• Результат размещается на существующем допустимом компоненте. Свободное размещение на пустой клетке не добавлено.

Для пятёрки по-прежнему остаётся один результат и четыре булыжника. Для сохранённого рецепта превращаются только использованные экземпляры. На карте белая ✦ указывает результат, числа — компоненты, ↔ — дополнительный подходящий экземпляр, × — прочие позиции пятёрки, которые станут булыжниками.

Реализация

Модель предпросмотра содержит anchorChoices: точные ID, определения, типы и координаты допустимых опор. Перед каждым переключением повторно проверяется прежний fingerprint, затем строится новый read-only план с другим anchorId или id. Проверяются совпадение результата и сохранение типа набора. Финальное подтверждение повторяет проверку и передаёт обычную команду движку.

Выбор места меняет только интерфейс. Партия, ресурсы, фаза, команда-история и случайные последовательности остаются прежними. Во время предпросмотра бой остановлен. После отмены он продолжает работать, если не был поставлен на обычную паузу ранее.

Касание карты в предпросмотре сначала проверяет пересечение луча с видимой геометрией кристалла, затем использует клетку основания. Это позволяет нажимать на верх высокого кристалла, который визуально находится над другой клеткой. В обычном строительстве прежнее определение клетки не меняется. Перетягивание и жест двумя пальцами сохраняют защиту от случайного нажатия.

Дополнительные метки используют прежнюю пакетную отрисовку колец. Буфер и HTML-метки увеличиваются только при необходимости, поэтому подходят и для более пяти возможных мест. Глубина колец сохраняет перекрытие самим кристаллом. Обычное удаление и клавиатурная стройка заблокированы на время выбора места.

Проверка

138 тестов проходят: 130 прежних и восемь новых. Проверены смена каждой опоры сохранённого рецепта, дополнительный дубликат, пятёрка, пара, Великий камень, запрет смешивания наборов, устаревший предпросмотр и подтверждение каждой поддержанной оригинальной формулы на каждом её ингредиенте.

Браузерный сценарий использует реальные кнопки и касания canvas. Он проверяет выбор через вложенное изображение и Enter, переключение на карте без закрытия, отказ неподходящему камню и пустой клетке, отмену и фактический результат в выбранном месте. Отдельно проверены восемь кандидатов и рост буфера меток, третий одинаковый камень в улучшении и попадание в верхнюю часть высокого кристалла, когда клетка плоскости отличается.

Обычный работающий цикл без ограничения requestAnimationFrame подтверждает остановку боя на время выбора и продолжение после отмены. Проверены размеры 320×568, 390×844, 844×390 и 1440×1000. Отчёт: output/GemTD_synthesis_anchor_QA.json. Изображение: output/GemTD_synthesis_anchor_mobile.png. Публикация подтверждается отдельно ответом Sites и output/GemTD_synthesis_anchor_delivery.json.

Кампания остаётся на 30 волн. Рецепты, ограничения качества и формат сохранения партии не менялись. Двойное подтверждение обычной постановки кристалла и кооперативные пинги остаются отдельно отложенными задачами.

Скачать раздел · Markdown

40. Устойчивая раскладка ингредиентов выбранной цели

Дата: 9 ноября 2026. Исправление интерфейса: 0.5.3. Правила: prototype-solo30-v6.

Дефект со скриншота

После добавления серебра в цели его ингредиенты получали флажок через ::before. При автоматическом размещении элементов сетки флажок занимал первую ячейку. Изображение переходило в широкую колонку названия, название — в узкую колонку статуса, а звезда — на следующую строку. Поэтому слова переносились по нескольким буквам и карточки становились очень высокими.

Скриншот содержит предыдущую версию карточки с кнопками «Характеристики» и «i». В 0.5.2 флажок уже вынесен из потока. Эта версия дополнительно устраняет зависимость от автоматического размещения и защищает получение новых стилей после обновления сайта. Наличие старой раскладки на скриншоте само по себе не доказывает конкретную причину сохранения старой страницы в браузере.

Исправление

• В общих стилях выбранного ингредиента флажок сразу получает абсолютное позиционирование относительно строки. Он не участвует в сетке и не перекрывает нажатия.

• Для четырёх частей строки явно назначены области: изображение, название, статус наличия и избранное. Добавление метки не сдвигает эти элементы.

• При сборке сайта ссылки на CSS получают версию, вычисленную из содержимого соответствующего файла. Изменившийся CSS получает новый URL; неизменившийся файл сохраняет прежний. Это предотвращает повторное использование старого стиля по прежнему адресу после загрузки обновлённой HTML-страницы.

• Компактные карточки, один выбор качества и аккордеоны версии 0.5.2 сохранены. Сохранения, рецепты и выбранные пользователем цели не сбрасываются.

Проверка

Браузерный сценарий запускает именно собранную страницу dist. Он воспроизводит случай серебра с двумя ингредиентами в новой пятёрке и одним недостающим, несколько раз выключает и включает цель, добавляет ещё две цели, включая альтернативную формулу из пяти качеств.

На 320×568, 384×720, 390×844, 844×390 и 1440×1000 проверяются ширина названия, порядок четырёх колонок, звезда в одной строке с изображением, флажок вне потока и отсутствие переполнений. Дополнительно проверяются избранное, восстановление трёх целей после перезагрузки и неизменность партии от просмотра книги.

Тест сверяет версии всех CSS с SHA256 реальных файлов и подменяет запрос старого адреса стилей дефектным CSS. Собранная страница не запрашивает такие адреса. Это проверка версий ссылок в браузере, а не измерение поведения кэша на физическом телефоне.

Основные отчёты: output/GemTD_goal_layout_QA.json и output/GemTD_goal_layout_mobile.png. 130 тестов логики проходят. Публикация подтверждается отдельно ответом Sites и output/GemTD_goal_layout_delivery.json.

Скачать разбор · Markdown

39. Компактные карточки минералов и единый выбор качества

Дата: 9 ноября 2026. Интерфейс: 0.5.2. Игровые правила: prototype-solo30-v6.

Результат анализа

Предыдущая версия правильно группировала минералы, но внутри карточек сохраняла несколько последовательных вертикальных блоков. Это увеличивало прокрутку и заставляло повторно читать одну информацию.

• У базового семейства существовал список шести качеств со своими изображениями и звёздами. Окно свойств показывало те же шесть качеств ещё раз в выпадающем списке.

• Портрет, кнопка «Характеристики» и отдельная кнопка «i» часто открывали одно окно. Для обычных атак кнопка занимала целую строку без новой информации.

• Свойства всегда находились под названием, хотя на широких карточках справа оставалось свободное место.

• У единственного рецепта верхняя панель содержала пустую левую часть и кнопку цели справа. После ингредиентов ещё раз перечислялись их полные названия в тексте нехватки.

• Описание огненной ауры повторялось в каждой альтернативной формуле, хотя являлось свойством результата, доступным в общем окне.

• Флажок цели ::before участвовал в сетке ингредиента как дополнительная ячейка. При активной цели он сдвигал колонки и мог превращать название в узкую вертикальную полосу. Проверка только общего переполнения такой дефект не обнаруживала.

Новая карточка

Слева находятся изображение и название. Изображение получает небольшой значок информации и открывает свойства. Справа — избранное для составного минерала либо переход к качествам для базового семейства. Дополнительные одинаковые кнопки «Характеристики» и «i» под названием убраны.

Если внутренней ширины карточки хватает, короткие метки особых свойств размещаются справа от названия и действий. При недостатке ширины они переходят на следующую строку. Невидимость по-прежнему выделена цветом и значком, а нажатие на метку открывает подробное описание. Базовый удар не создаёт пустую строку меток. Сами свойства не удаляются из окна.

Аккордеоны пяти групп сохранены и закрыты при обычном входе в книгу. Под составным минералом остаётся только раскрытие рецепта. У базового семейства отдельного внутреннего списка качеств больше нет.

Один выбор качества

Все шесть качеств доступны в единственном селекторе окна свойств. Заголовок показывает название минерала один раз; варианты селектора содержат только номер и название качества. Изображение и свойства меняются вместе с выбором.

Выбранное качество отражается в изображении и подписи семейства в книге. Выбор запоминается на время открытой игровой страницы, включая повторное открытие книги. Фильтры продолжают ограничивать допустимые показываемые варианты: например, «С избранными» выбирает точное избранное качество, а «Потенциал поля» учитывает реально имеющиеся качества.

Звезда в окне свойств добавляет именно текущий ID качества. Другие качества не изменяются. После нажатия звезды окно остаётся открытым на том же качестве; при закрытии фокус возвращается к карточке даже после её перерисовки. Сохранённые ранее избранные используют прежнее хранилище браузера.

Для выбранных целей семейство кратко показывает нужные номера качеств с ⚑ или ↗. Подробность для конкретного качества находится в его окне. Это отметки нужных компонентов, а не повторный список всех вариантов. Правило допустимого улучшения пары текущей пятёрки не меняется.

Рецепты и действия

Порядок внутри формулы: название способа, если способов несколько; сетка ингредиентов; необходимые предупреждения или шаги цели; короткий статус и действия. У единственного способа пустая верхняя панель убрана.

Состав ингредиентов показывается один раз. В статусе остаются количества сохранённых, новых и недостающих частей. Когда требуется выбор конкретного результата пятёрки, его имя сохраняется в инструкции: это информация для действия. Предупреждение о единственном результате пятёрки также сохраняется.

Кнопка цели и доступное действие сборки находятся рядом в общем нижнем блоке. При недостатке ширины блок переносится целиком. Альтернативные формулы остаются отдельными и используют прежние ID. Повторное описание ауры из формул убрано; действующий эффект по-прежнему доступен в свойствах результата.

Флажок выбранной цели теперь расположен поверх угла области ингредиента и не занимает колонку. У изображения, названия, наличия и звезды сохраняются собственные колонки. В проверку добавлена минимальная ширина названия и нахождение звезды с изображением в одной строке.

Замеры и проверка

Замеры сравнивают ту же книгу, все раскрытые карточки, отсутствие выбранных целей, ширину окна 390 или 1440 пикселей. Примеры высоты до и после:

КарточкаШирина окнаДоПосле
Алмаз, базовое семейство390328 px64 px
Опал, базовое семейство390328 px112 px
Опал, базовое семейство1440328 px64 px
Серебро, раскрытый рецепт390443 px387 px
Серебро, раскрытый рецепт1440373 px301 px

Для алмаза сокращение составляет около 80%, для рецепта серебра на широком экране — около 19%. Это измерения конкретных состояний карточек, а не обещание одинакового сокращения всех рецептов. Длинные имена, активные цели и ширина устройства меняют высоту.

130 тестов логики проходят. Браузер проверяет все 48 базовых качеств и 44 составных определения, их изображения и действующие свойства, точное избранное, возврат фокуса, отметки целей, альтернативные формулы и сборку сохранённых компонентов до волны. На 320×568, 390×844, 844×390 и 1440×1000 проверяются отсутствие переполнений, положение меток справа, ширина текста ингредиентов и отсутствие сдвига от флажка. Размеры основных кнопок и селектора остаются не меньше 44 пикселей.

Отчёты: output/GemTD_compact_book_QA.json, output/GemTD_book_card_metrics_before.json и output/GemTD_book_card_metrics_after.json. Иллюстрации: output/GemTD_compact_base_mobile.png, output/GemTD_compact_opal_mobile.png и output/GemTD_compact_silver_desktop.png. Публикация подтверждается отдельно ответом Sites и output/GemTD_compact_book_delivery.json.

52 карточки, 51 формула, фильтр всех связанных рецептов пятёрки, несколько целей и 30 волн сохраняются. Иллюстрации, модели, окружение, баланс и формат сохранения партии не менялись. Следующее уплотнение верхних фильтров книги можно рассматривать отдельно после оценки этой версии на телефоне.

Скачать разбор · Markdown

38. Книга: сворачиваемые группы и рецепты пятёрки

Дата: 9 ноября 2026. Версия интерфейса: 0.5.1. Правила игры: prototype-solo30-v6.

Группы и навигация

Пять прежних групп сохранены: базовые самоцветы, начальный синтез, сложный синтез, легендарные и особые сочетания. Каждая стала отдельным аккордеоном. При открытии книги все группы закрыты; видны название и количество минералов внутри. Нажатие раскрывает группу, повторное — скрывает. Можно открыть несколько групп одновременно.

Кнопка «Раскрыть группы» раскрывает все видимые группы, после этого становится «Свернуть группы». Раскрытие отдельных групп и карточек сохраняется во время поиска, переключения фильтров, работы с избранным и целями. Закрытие окна свойств возвращает к прежней книге. Новый обычный вход в книгу снова начинается с закрытых групп.

Переход к конкретному рецепту из виджета на карте раскрывает его группу и карточку, затем прокручивает к рецепту. Для аккордеонов используются стандартные details/summary: заголовок доступен с клавиатуры, Enter и пробел раскрывают его. Область нажатия заголовка не меньше 54 пикселей.

Фильтр «Из пятёрки»

Теперь он показывает рецепты, где есть хотя бы один точный ингредиент из текущих новых камней. Полного совпадения всех частей для появления в списке больше не требуется. Рецепты отбираются во всех группах и среди всех исходных альтернативных формул. Базовые семейства в этом режиме скрыты, потому что пользователь ищет именно рецепты.

Примеры:

• Новый алмаз первого качества показывает рецепт серебра, даже если сапфир и топаз пока отсутствуют. Внутри видно, какие части есть и какие ещё нужны.

• Сохранённые сапфир и топаз плюс новый алмаз показывают тот же рецепт и допустимую кнопку сохранения компонента. После выбора одного результата пятёрки можно соединить сохранённый полный комплект.

• Аметист пятого качества показывает связанные формулы золота, египетского золота и альтернативную формулу Кохинура. Группы начального, сложного и особого синтеза участвуют в одном отборе.

• Огромный рубин показывает связанные легендарные рецепты. Другие качества не подменяют точный требуемый ингредиент.

Это фильтр участия точных ингредиентов, а не обещание немедленной сборки и не прогноз всех будущих цепочек. Он не считает сохранённые башни новыми камнями и не подставляет потенциальное улучшение пары вместо существующего ингредиента. Планирование допустимых улучшений остаётся в отдельной системе целей рецептов. Особый Великий камень сохраняет свою действительную проверку четырёх одинаковых экземпляров пятого качества.

«Потенциал поля» по-прежнему учитывает точные компоненты всех сохранённых башен и текущей пятёрки. Отключение обоих фильтров возвращает полный каталог: 52 карточки и 51 исходную рецептурную формулу. Поиск, раздел, свойство, избранное и цели работают поверх выбранного источника.

Ни просмотр неполного рецепта, ни фильтрация не меняют партию. Действие «Собрать» остаётся привязано к существующей проверке полного допустимого набора. Из новой пятёрки по-прежнему выбирается один результат. Улучшение сохранённых пар запрещено, как установлено аудитом оригинала в документе 36.

Изображения

Иллюстрации и их соответствие минералам сохранены. Причина смещения: старый общий стиль кнопок recipe-row добавлял внутренние отступы к кнопке портрета фиксированного размера. Изображение выходило за выделенную область. Раскладка заголовка также зависела от старых стилей карточек.

Теперь у каждой карточки одинаковые колонки: портрет 44×44, название в свободной ширине и кнопка избранного 44×44. Изображения помещены по центру своих областей без внутренних отступов и сохраняют пропорции. Строки ингредиентов используют одинаковые колонки для изображения, названия, статуса и избранного. На узком экране они идут в один столбец, на широком — в два, когда хватает места. Длинные названия переносятся и не сдвигают соседние изображения.

Проверяются все 92 определения минералов: портреты, базовые качества и ингредиенты. Ссылки на изображения сверяются с каталогом; браузер декодирует файлы и проверяет, что изображения помещаются в кнопки и находятся по центру. Изменение не требует новых текстур или моделей.

Проверка и границы

130 автоматических тестов проходят. Дополнены проверки частичных рецептов пятёрки, разных уровней синтеза, точных качеств, альтернативных формул и независимости от сохранённых камней или булыжников. Все прежние проверки 30 волн и ограничений синтеза сохранены.

Браузерный сценарий проверяет закрытые группы при входе, клавиатуру, массовое раскрытие, сохранение раскрытия при поиске, переход к вложенному рецепту, окно свойств, оба фильтра, отсутствие ложной кнопки сборки и реальную сборку серебра из полной новой пятёрки. Проверка всех изображений и переполнений выполняется на 320×568, 390×844, 844×390 и 1440×1000. Отчёт: output/GemTD_book_accordions_QA.json.

Иллюстрации проверки: output/GemTD_book_accordions_mobile.png, output/GemTD_book_initial_synthesis_mobile.png и output/GemTD_book_legendary_desktop.png. Публикация подтверждается отдельно ответом Sites и output/GemTD_book_accordions_delivery.json.

Кампания остаётся на 30 волн. Баланс, модели врагов, окружение и сохранения не меняются. Описанный здесь отбор рецептов заменяет прежнее поведение фильтра «Из пятёрки» из документа 31; остальная история изменений сохраняется.

Скачать раздел · Markdown

37. Продолжение экспедиции: волны 21–30

Дата: 9 ноября 2026. Версия: 0.5.0. Профиль правил: prototype-solo30-v6.

Что реализовано

Одиночная экспедиция продолжена с 20 до 30 волн. После второго босса игра переходит к строительству 21-й пятёрки. Итог экспедиции появляется после 30-й волны. Первые двадцать волн сохраняют прежние характеристики и награды; изменены подсказка 20-й волны и граница завершения.

У каждой новой волны отдельная анимированная модель: десять моделей Quaternius с движением, ожиданием и смертью. Размеры и предельная ширина растут по главе, заключительный летающий дракон заметно крупнее рядовых существ. Названия новых существ — наша художественная адаптация, а не перевод имён Dota. Утверждённые иллюстрации минералов, карта, маршрут и окружение не перерабатывались.

Сохранённые партии продолжаются. Прежняя победа на 20-й волне с оставшимися жизнями открывает 21-ю, сохраняя лабиринт, башни, золото, опыт и случайные последовательности. Аналогичная миграция 10→11 остаётся. Проигрыш не превращается в продолжение; завершённая новая партия остаётся на 30-й. Несколько целей рецептов и избранное сохраняются в прежних хранилищах браузера.

Состав новой главы

Значения HP и скорости в таблице — исходные значения основного NPC установленного GemTD2.0. В веб-профиле HP умножается на 0,63, скорость — на 0,85/128 клеток в секунду. Броня берётся напрямую, сопротивление магии указано в процентах.

ВолнаВеб-образHP / скоростьБроня / магияДействующее поведение
21Сумеречные рапторы7500 / 67520 / 0%Наземная волна с усиленной бронёй
22Панцирные стражи11000 / 60015 / 0%Суммирующаяся аура брони +4
23Туманные жабы10000 / 62515 / 0%На 75% меньше физического урона; щит на семь событий урона
24Латные дозорные20000 / 67520 / 0%Направленный щит: 40% спереди, 20% сбоку
25Небесные скаты4500 / 40015 / 20%Полёт через маяки; аура брони +4
26Пламенные бегуны11000 / 90015 / 100%Быстрая наземная волна; магический урон не проходит
27Лунные крылья3000 / 62515 / 40%Полёт; лечение 10% у промежуточных маяков; ответное обезоруживание
28Небесные щитоносцы5000 / 75015 / 0%Полёт; направленный щит
29Облачные драконы6000 / 77515 / 0%Полёт; уклонение 50%; щит на семь событий урона
30Грозовой владыка80000 / 75015 / 0%Один летающий босс, финал текущей экспедиции

Обычных противников по десять, босс один. Награда за обычного врага главы — 15 золота и 15 опыта; за босса — 200 золота и 400 опыта. Утечка обычного врага снимает до десяти жизней по оставшемуся здоровью; у босса сохраняется потеря ceil(процент оставшегося HP). Победа означает пережитую последнюю волну, поэтому она возможна и после частичной утечки босса, если остались жизни.

Способности и подсказки

Модели и загрузка

Источник моделей — https://quaternius.com/packs/ultimatemonsters.html. Текущие условия автора — https://quaternius.com/license.html. Публичная страница старого набора помечена CC0, общая лицензия автора от 28 августа 2026 — QAL 1.0. Приёмка сохраняет обе страницы и применяет более ограничительные условия QAL: использование внутри игры разрешено, отдельный архив моделей для раздачи не создаётся. Вклад автора указан в manifest и титрах игры.

Соответствие волн исходным моделям: 21 Dino, 22 Monkroose, 23 Frog, 24 Alien, 25 Glub, 26 Birb, 27 Armabee_Evolved, 28 Tribal, 29 Dragon, 30 Dragon_Evolved. Это десять разных файлов со скелетами и настоящими анимациями, а не десять перекрашиваний одной формы. Они остаются готовыми сторонними образами прототипа; собственные финальные формы всех 50 волн ещё предстоит изготовить.

Новые GLB суммарно занимают 2 783 068 байт. Сохранены три нужные анимации на модель, исходные скелеты и материалы. Шесть ранее использовавшихся GLB остались побайтово прежними. Число треугольников новой модели достигает 7676: отдельные формы выше целевого бюджета 3–5 тысяч для будущего мобильного LOD. Фактическую частоту кадров на физических телефонах этот этап не измерял.

При первом входе на 1-ю волну загружаются прежние шесть моделей. Новая десятка начинает фоновую загрузку с 18-й волны, заранее перед главой. Сохранение на поздней волне сразу получает нужную главу. Повторные запросы к одной модели не дублируются; при задержке или ошибке используется прежняя анимированная модель соответствующей роли. После успешной загрузки она заменяется новой без изменения состояния врага. Высота ограничивается также максимальной шириной, чтобы крылья не закрывали слишком много клеток.

Основание и границы соответствия

Повторно прочитаны NPC KV, способности и Lua установленного пакета Workshop 3817795446. Для щита дополнительно исследовано определение mars_bulwark из установленного Dota2 pak01_dir.vpk: проценты, углы и первый уровень способности. Исходные файлы Dota не включены в публичный сайт.

Локальный отчёт: reference_data/gemtd2-source/thirty-wave-audit/audit.json. SHA256 исследованного Workshop VPK: c2aed66ec055edf7fdd3bceb02a0d941d207c01b82326074366f0642c623166e. SHA256 главного Lua: 810f1ede9cece57b2413f5e0629407554703b1b0e22fd52866ee11e95a1a7695. В отчёте отдельно сохранены основные NPC, оригинальные альтернативы и принятые веб-контракты.

Это расширение опытного одиночного профиля. Случайные альтернативные NPC, динамическое число врагов, элиты, активное перенаправление атак Mars, точный Source2-планировщик и PRD пока не воспроизведены. Первые двадцать волн не перебалансированы по результатам этого аудита. Полная проверка Classic, волны 31–50, endless, сетевой сервер, рейтинг и профили остаются в следующих этапах.

Исправленное правило качества сохраняется: повышать пару/четвёрку можно только внутри текущей новой пятёрки до выбора. Сохранённые одинаковые башни не образуют повышение качества. Составные рецепты из сохранённых компонентов по-прежнему доступны до начала волны и в других активных фазах. Двойное нажатие при размещении и совместная подсветка остаются отложенными по просьбе пользователя.

Проверка и следующий этап

128 тестов ядра и интерфейсных планировщиков проходят. Новые проверки покрывают характеристики всех десяти волн, брони и щиты, полёт, лечение, продолжение сохранения, JSON-восстановление и детерминизм. Полный технический цикл 30 волн насчитывает 273 врага, 3200 золота и 3700 опыта; он искусственно устраняет врагов и проверяет жизненный цикл, а не доказывает окончательный игровой баланс.

Браузер проверил движение всех десяти скелетов, клипы смерти, размеры, передние щиты, справочник, предварительные подсказки, позднюю подгрузку, замену резервной модели и отказ одного GLB. Обычный работающий цикл без ограничения кадров проверил переход 20→21, завершение на 30-й и перезагрузку результата. Старое сохранение сохранило лабиринт, ресурсы и две цели. Проверены экраны 1440×1000, 390×844, 320×568 и 844×390. Необработанных ошибок и непредвиденных HTTP-ошибок в основном сценарии нет.

Отчёты: output/GemTD_thirty_waves_QA.json и output/GemTD_chapter_three_models_QA.json. Иллюстрации проверки: output/GemTD_chapter_three_lineup.png и output/GemTD_thirty_boss_mobile.png. Публикация подтверждается отдельно ответом Sites и output/GemTD_thirty_waves_delivery.json.

Следующий этап — практический баланс новой главы на настоящем лабиринте, затем 31–40 и 41–50 с отдельными моделями, после них endless. Серверные режимы и глобальный прогресс должны опираться на те же версионированные данные волн.

Десять новых анимированных противников волн 21–30
Проверка игровых моделей новой главы. Автор моделей: Quaternius. Это общий проверочный кадр; в игре каждая форма появляется в своей волне.

Скачать раздел · Markdown

36. Исправление повышения качества: только текущая пятёрка

Дата: 9 ноября 2026. Версия: 0.4.10. Профиль правил: prototype-solo20-v5.

Результат

Два уже сохранённых аметиста второго качества больше не предлагают и не позволяют получить аметист третьего качества. Правило действует для всех восьми базовых минералов, любого качества и любой фазы. Старый камень и новый камень тоже не образуют пару; сначала оставить новый, а затем объединить его со старым нельзя.

Повышение качества возможно только до выбора результата текущей пятёрки: два одинаковых камня одного качества дают +1, четыре — отдельное улучшение +2. Особая сборка Великого камня из четырёх экземпляров пятого качества сохранена. Из пятёрки остаётся один результат; остальные четыре клетки становятся булыжниками.

Это исправление по итогам повторного аудита установленного GemTD 2.0. Сборка составных минералов по Книге синтеза из сохранённых ингредиентов разных ходов остаётся отдельным механизмом. Пользовательское разрешение выполнять такой синтез до начала волны и в других активных фазах сохранено.

Движок и интерфейс

• Команда mergeIdentical больше не изменяет игру. Она оставлена только как явно отклоняемый старый запрос, чтобы устаревшая кнопка, внешний вызов или прежний предпросмотр не обходили правило.

• С карты удалены кнопки повышения качества сохранённых пар. Пара из новой пятёрки по-прежнему открывает предпросмотр с точными экземплярами и выбранной клеткой результата.

• Справка и книга объясняют границу между улучшением качества внутри пятёрки и рецептурным синтезом сохранённых башен.

• Отмена предпросмотра, ручной запуск волны, все 51 рецепт, несколько независимых целей, избранное и подсветки у основания сохранены.

Цели рецептов

Планы больше не используют сохранённые пары, цепочки смешанных сохранённых качеств или сочетание старого камня с новым для повышения качества. Сохранённые башни учитываются только как точные ингредиенты рецепта.

Стрелка ↗ у нового камня означает возможное улучшение именно этой пятёрки. Если пара или четвёрка уже есть, показывается допустимый шаг; выполнить его можно после пятой постройки. Если стройка ещё идёт и свободных мест достаточно для недостающих дубликатов, камень обозначается как кандидат с пояснением «в этой пятёрке».

После пятой постройки неподкреплённая пара исчезает из отметок: одиночный низкий камень больше не предлагается сохранить ради будущего объединения со старым. Улучшения глубже +2 не прогнозируются, поскольку из одной пятёрки нельзя сохранить несколько промежуточных результатов.

Несколько целей продолжают объединять нужные отметки. Общая пара текущей пятёрки считается одним конкурирующим результатом; точные общие сохранённые компоненты учитываются по их реальному количеству. После выбора и синтеза все планы пересчитываются.

Совместимость сохранений

Существующие партии открываются с прежними камнями, волной, ресурсами и историей команд. Уже построенные в прошлой версии результаты не откатываются: по сохранению нельзя надёжно восстановить потраченные экземпляры и решения игрока. Новые объединения сохранённых пар заблокированы. Формат snapshot и идентификаторы рецептов не менялись.

Доказательства и проверка

Повторный аудит прочитал установленный Workshop-пакет 3817795446, определения способностей и все 57 Lua-файлов. Вызовы выдачи gemtd_choose_update_stone найдены только в gemtd_build_stone, где повторы считаются внутри build_curr[player_id][0..4]. Подробный разбор — документ 35. SHA256 пакета: c2aed66ec055edf7fdd3bceb02a0d941d207c01b82326074366f0642c623166e.

117 автоматических проверок проходят. Сценарий 15-й волны отклоняет старую пару атомарно; проверяются все семейства и качества, старые предпросмотры, сохранность снарядов/яда/случайных чисел, смешанная старая и новая пара, прежние snapshot и допустимые улучшения новой пятёрки.

Для каждого подходящего базового компонента во всех оригинальных формулах проверена замена на пару предыдущего качества именно в текущей пятёрке. После её выбора движок получает точный требуемый компонент, и весь рецепт становится доступен.

Браузерная проверка на 390 × 844, 320 × 568 и 844 × 390 подтверждает: отсутствие кнопки и пути из старой пары, отказ прямой команды, перезагрузку сохранения, предпросмотр только новых экземпляров, отмену без изменений, сохранность старых башен, последующий рецепт до волны и правильную подсветку кандидата до и после пятой постройки. Отчёт: output/GemTD_original_pair_rule_QA.json. Отдельный сценарий нескольких целей: output/GemTD_multiple_goals_QA.json.

Графика, геометрия, модели и окружение не изменялись. Двойное нажатие при размещении и совместные подсветки остаются отложенными задачами.

Скачать раздел · Markdown · Скачать аудит оригинала

34. Несколько целей рецептов одновременно

Дата: 9 ноября 2026. Версия: 0.4.10 (уточнение правила улучшений).

Выбор и управление

Кнопка «Добавить цель» в книге добавляет рецепт к уже выбранным планам. Можно одновременно собирать два, три и больше разных составных минералов. Повторное нажатие снимает только этот рецепт. Остальные цели и отметки сохраняются.

Для одного составного минерала выбран один конкретный способ сборки. Если выбрать альтернативный рецепт того же минерала, он заменяет только его предыдущую формулу; цели других минералов и порядок списка сохраняются. Это не создаёт повторяющихся целей одного и того же результата.

На карте цели находятся в одной компактной строке с горизонтальной прокруткой. У каждой есть картинка, название, собственный прогресс и кнопка ×. Нажатие на картинку или название открывает точный рецепт в книге. Количество целей не увеличивает высоту списка на карте пропорционально их числу.

Кнопка «Цели» в книге показывает только выбранные формулы. Она сбрасывает несовместимые фильтры при включении. Сброс фильтров и быстрый поиск обнаружения невидимости возвращают обычный каталог. После удаления последней цели книга объясняет, как добавить новую.

Общие отметки и улучшения

Подсветка объединяет потребности всех выбранных рецептов. Флажок ⚑ отмечает точный ингредиент, стрелка ↗ — камень для последовательного улучшения качества. Число рядом со значком показывает, скольким целям подходит экземпляр. Пояснение перечисляет соответствующие минералы. Метки работают в пятёрке, у её номеров на карте и в запасах книги.

Для каждого рецепта действует расчёт из раздела 33: пара или четвёрка новой пятёрки даёт один улучшенный результат; сохранённые башни учитываются только как точные ингредиенты своего рецепта. Кнопка улучшения относится к конкретной цели, даже если она третья или последняя в списке.

Пересечение планов

Цели — независимые планы и варианты выбора, а не автоматическая очередь расходования камней. Готовность показывается отдельно для каждой формулы. Общая готовность всех целей сразу не суммируется.

Если планы требуют больше экземпляров одного вида и качества, чем реально есть, появляется отметка ↔ и пояснение об общих компонентах. Проверяется количество: два имеющихся одинаковых экземпляра могут обеспечить два независимых рецепта; совпадение первого найденного экземпляра само по себе не создаёт ложного предупреждения. Пары и четвёрки для улучшения учитываются только внутри текущей новой пятёрки и дают один результат.

Даже разные камни текущей пятёрки не могут обеспечить два независимых результата одного хода. Такие планы отмечаются как конкурирующие варианты выбора пятёрки. После выбора, улучшения или финального синтеза все оставшиеся цели пересчитываются по фактическому запасу.

Ни один план автоматически не тратит компоненты и не удаляет другую цель. Предпросмотр, отмена и подтверждение используют прежние проверяемые команды игры. Завершённую цель можно снять вручную либо оставить для повторной сборки.

Сохранение и производительность

Список хранится в том же браузере. Старое сохранение с одной целью читается автоматически; после изменения записывается массив выбранных формул. Неизвестные, повторные и повреждённые записи отбрасываются, недоступное хранилище не мешает игре.

Производные планы кэшируются по выбранным рецептам и фактическому составу поля. Изменения используют существующие отметки и интерфейс; дополнительные модели, текстуры, источники света и проходы отрисовки не добавляются.

Проверка

117 автоматических проверок. Новые сценарии: три независимые цели; снятие одной; восстановление списка и старой одиночной записи; замена альтернативной формулы; совокупная подсветка и улучшения; достаточный и недостаточный общий запас; общая пара; разные выборы одной пятёрки; пересчёт после сборки и фильтр целей без изменения партии.

Браузерная проверка: выбрать три рецепта в книге, снять и вернуть один, открыть фильтр целей, увидеть счётчики общих отметок, перезагрузить страницу, выполнить улучшение именно третьей цели с отменой предпросмотра, собрать минерал и проверить пересчёт другого плана, снять отдельную цель на карте и все цели в книге. Размеры: 390 × 844, 320 × 568, 844 × 390. Отчёт: output/GemTD_multiple_goals_QA.json.

Игровая партия, случайные последовательности, исходные 51 формула и правила одного результата из пятёрки сохранены. Двойное нажатие при размещении и совместные подсветки остаются отложенными задачами.

Скачать раздел · Markdown

33. Цель рецепта с учётом улучшений качества

Дата: 9 ноября 2026. Актуализировано для 0.4.10 по аудиту оригинала. Прежние описания улучшения сохранённых пар отменены.

Допустимые улучшения

Цель учитывает точные сохранённые компоненты и один результат новой пятёрки. Повышение качества доступно только внутри этой пятёрки до выбора: пара одинаковых камней даёт +1, четвёрка — +2. Сохранённые пары, смешанные сохранённые качества и сочетания старого камня с новым не дают повышение качества.

Флажок ⚑ означает точный ингредиент. Стрелка ↗ означает допустимое улучшение внутри новой пятёрки. Пока стройка не завершена, одиночный камень может быть отмечен кандидатом только если оставшихся мест достаточно для недостающих дубликатов. После пятой постройки неподкреплённая пара не отмечается и не предлагается к сохранению ради будущего улучшения.

В карточке цели блок «Получить компоненты улучшением» указывает исходные качества и количество камней, которые нужны в одной новой пятёрке. При наличии пары или четвёрки и завершённых пяти постройках доступен ближайший законный шаг. Предпросмотр показывает только расходуемые новые экземпляры и клетку результата; отмена ничего не меняет.

Точность и независимость наборов

• Сохранённые башни участвуют только как точные компоненты рецепта. Каждый экземпляр учитывается отдельно.

• Из пятёрки выбирается один результат. Она не может одновременно обеспечить два разных ингредиента или два результата для разных целей.

• Точный сохранённый рубин первого качества можно оставить на поле и дополнить рубином второго качества, полученным из пары новых рубинов первого качества. Сам сохранённый рубин в эту пару не входит.

• Четыре новых камня одного качества могут сразу дать +2. Дальнейшую цепочку из сохранённых результатов план не обещает.

• Понижение качества за золото не включается в прогноз. Более высокое качество не подменяет требуемое более низкое.

• Все составные минералы по-прежнему требуют точную формулу. Их рецептурный синтез из сохранённых компонентов разрешён до запуска волны.

Несколько целей, точные отметки избранного и сохранение выбора в браузере работают совместно. Планирование не меняет партию, ресурсы или случайные последовательности.

Проверка

117 проверок ядра и планировщиков. Каждый подходящий базовый компонент оригинальных формул проверен через реальную пару внутри новой пятёрки. Старые пары и старый плюс новый экземпляр отвергаются. Браузерный отчёт: output/GemTD_original_pair_rule_QA.json; несколько целей — output/GemTD_multiple_goals_QA.json. Подробности исправления и аудита — документы 35 и 36.

Скачать раздел · Markdown

32. Синтез без ожидания начала волны

Дата: 9 ноября 2026. Версия: 0.4.7.

Правило

Полный комплект сохранённых компонентов можно соединить в любой активной фазе: при строительстве новой пятёрки, во время выбора, после выбора до начала волны, во время боя и между волнами. Начинать волну ради синтеза больше не требуется. Сразу после создания составного минерала его можно использовать в следующем рецепте, если остальные сохранённые компоненты уже есть.

Это осознанное изменение по запросу пользователя. В исходном GemTD2.0 обработчик сборки из сохранённых камней был ограничен боевой фазой; прежний прототип повторял это ограничение. Рецепты, точные качества и количество ингредиентов остаются прежними.

Два независимых набора

• Сохранённые компоненты — только уже выбранные башни на поле. Их синтез не завершает текущий выбор и не меняет ни один из ещё не выбранных камней новой пятёрки.

• Текущая пятёрка — отдельный набор. Сборка из неё доступна после размещения всех пяти камней, на этапе выбора. Результат занимает выбранную клетку; остальные четыре позиции становятся булыжниками.

• Для сочетания старых компонентов с новым выпавшим камнем сначала нужно оставить этот камень. После этого весь комплект сохранён и его можно сразу соединить, до запуска волны.

• Несколько ещё не выбранных камней нельзя смешивать со старыми башнями в обход правила одного результата из пятёрки.

• Если оба набора содержат полный рецепт, выбранный компонент определяет набор и клетку результата. Если полный комплект есть только в другом наборе, кнопка предлагает именно доступный комплект.

• После победы или поражения действия синтеза недоступны.

Интерфейс и сохранность партии

Кнопки готовых рецептов на карте и в книге используют одинаковую проверку. Они доступны сразу при наличии законного комплекта. Подсказки больше не предлагают ждать боя. Предпросмотр показывает точные расходуемые экземпляры и клетку результата; отмена ничего не меняет. Подтверждение повторно проверяет комплект и фазу.

Синтез не запускает волну, не продвигает время и не меняет золото, жизни или случайные последовательности. Сохранённые лабиринты совместимы с обновлением. Запуск волны остаётся отдельной кнопкой.

Проверка

95 автоматических проверок, в том числе все активные фазы, оба независимых набора, сохранность текущей пятёрки, запрет неполных смешанных наборов, выбор клетки результата, устаревший предпросмотр и цепочка «Серебро → Серебряный рыцарь» до начала боя.

Браузерный сценарий на мобильном экране 390 × 844 проверяет: оставить последний компонент; собрать через книгу и виджет до волны; отменить предпросмотр без изменения партии; выполнить две последовательные сборки; вручную запустить волну; соединить старые компоненты во время строительства и выбора без потери новых камней. Отчёт: output/GemTD_anytime_synthesis_QA.json.

Обновление также включает подготовленные в 0.4.6 фильтры книги, свойства минералов и исправление колец у основания; описание — раздел 31. Двойное нажатие при размещении и совместные подсветки остаются отложенными задачами.

Скачать раздел · Markdown

31. Фильтры книги, свойства минералов и выделение у основания

Дата: 8 ноября 2026. Версия: 0.4.6.

Круги выделения

Кольца текущей пятёрки и предпросмотра синтеза теперь проверяют глубину сцены. Общая высота выделения 0,186 при поверхности поля 0,18. Круг радиуса и углы выбранной клетки также опущены к основанию. Кристаллы и каменные основания перекрывают расположенные за ними части колец; прозрачная подсветка больше не рисуется поверх непрозрачных кристаллов.

Новые эффекты, текстуры или проходы рендера не добавлены. Приёмка включает сравнение изображения с кольцом и без него: белая непрозрачная модель не должна менять свои пиксели, а видимая часть кольца снаружи должна оставаться. Эта проверка отдельно выполнена для выделения пятёрки, синтеза и радиуса.

Два режима отбора по имеющимся камням

• «Из пятёрки»: рецепты, полный состав которых уже присутствует в текущем выпадении, и справочные карточки его базовых минералов. Если пять построек ещё не завершены, сборка остаётся недоступна по обычным правилам.

• «Потенциал поля»: рецепты с хотя бы одним уже имеющимся компонентом — среди сохранённых башен и текущей пятёрки. Это возможные направления развития, а не обещание готовой сборки. Недостающие компоненты указаны внутри рецепта.

• Режимы переключаются между собой. Повторное нажатие выключает выбранный режим. Когда оба выключены, отбор по имеющимся камням снят; поиск, раздел и свойство можно выбирать отдельно.

Булыжники не считаются компонентами. Разные качества не подменяют друг друга. Правило одного сохраняемого результата пятёрки и фазы исполнения рецептов не изменены.

Организация каталога

Пять разделов: базовые самоцветы, начальный синтез, сложный синтез, легендарные камни и особые сочетания. Раздел выбирается коротким списком. Подробные рецепты свёрнуты; готовая сборка и выбранная цель при открытии книги раскрываются автоматически. Остальные карточки можно раскрыть по нажатию, их состояние сохраняется при поиске и работе с избранным.

Каталог содержит 52 карточки:8 базовых семейств с шестью качествами,43 результата обычных/альтернативных рецептов и отдельный Великий камень. Все 92 определения минералов и 51 исходная рецептурная формула сохранены. Великий камень объясняет особое правило четырёх одинаковых камней пятого качества из одной пятёрки; когда набор готов, используется существующая проверяемая команда повышения качества.

Добавление базового раздела необходимо для поиска опала и других минералов, которые не являются результатами рецептов. Одна карточка по-прежнему представляет один вид, а качества выбираются внутри.

Свойства и обнаружение невидимости

На карточках показаны короткие метки действующих эффектов: обнаружение, яд, снижение брони, замедление, скорость атаки, несколько целей, урон по области и огненная аура. Нажатие на метку, изображение минерала или изображение ингредиента открывает отдельное компактное окно. Для базового семейства в нём можно сменить качество и увидеть соответствующие параметры. Закрытие окна возвращает к книге с прежними фильтрами и положением списка.

Фильтр «Свойство в игре» учитывает только реально действующие способности. Кнопка «Невидимость» сбрасывает мешающие ограничения и показывает все работающие обнаружители: семейство опалов, Кошачий глаз, Красный коралл, Кармен-Люсия и Звёздный сапфир. Метка обнаружения выделена цветом, значком и текстом. Подсказка объясняет радиус 4,69 клетки и необходимость ставить обнаружитель рядом с маршрутом.

Свойства текущего прототипа отделены от ещё не перенесённых эффектов оригинальной игры. В дополнительном разделе окна показаны соответствующие сведения из исходников. Числа действующих эффектов берутся из текущей логики игры: например, отравление действует пять импульсов, а снижение брони аметиста — две секунды. Свойства оригинала не выдаются за уже работающие. Повторно извлечены привязки способностей всех 92 определений; аудит находится в reference_data/gemtd2-source/tower-properties-audit.json. Часть постоянных прибавок уже учтена в импортированном уроне и обозначена соответствующим образом.

Проверка

90 проверок логики. Дополнительный браузерный сценарий проверяет каталог, оба режима отбора, обнаружение, всплывающие окна и качества, неизменность партии от просмотра, обе формы синтеза, перекрытие колец моделью и четыре размера экрана:390×844,320×568,844×390,1440×1000. Отчёт: output/GemTD_book_explorer_QA.json. Реальная частота кадров на физических телефонах не измерялась.

Скачать раздел · Markdown

30. Книга синтеза без повторяющихся карточек

Дата: 8 ноября 2026. Обновление 0.4.5.

Что обнаружено

В исходниках есть 51 формула, дающая 43 разных результата. Восемь легендарных камней имеют по два допустимых способа сборки. Старый интерфейс создавал карточку для каждой формулы, поэтому названия и изображения этих камней повторялись.

Это Кохинур, Обеднённый Кайпариум, Рубин Чёрного Принца, Звёздный сапфир, Кармен-Люсия, Золотой Юбилей, Алмаз Куллинан и Звезда Адама. У каждого есть основной рецепт через составной камень и альтернативный набор из пяти качеств одного минерала. Повторяющихся формул с одинаковым результатом и теми же ингредиентами не обнаружено.

Все 51 формула повторно сопоставлены с таблицами gemtd_merge и gemtd_merge_secret оригинального Lua. Имена базовых минералов разных качеств остаются общими; качество явно указано у компонента. Это разные игровые варианты одного минерала, а не ошибочные копии.

Исправление интерфейса

• Один итоговый камень теперь имеет одну карточку с одним названием, изображением и звездой избранного.

• Несколько способов сборки находятся внутри этой карточки под подписями «Основной рецепт» и «Альтернативный · качества 1–5».

• У каждого способа собственные компоненты, доступность, кнопка сборки и выбор цели. Готовый способ может показываться первым.

• Счётчик раздельно показывает число камней и число рецептов. По умолчанию:43 камня и 51 рецепт.

• Поиск и фильтры работают с формулами внутри карточки. Если подходит только один из двух способов, это обозначено как «1 из 2».

• Цель остаётся привязана к конкретной формуле, а избранное результата — к самому камню. Открытие цели ведёт к нужному способу в общей карточке.

Изменение касается отображения. Исходные идентификаторы рецептов, ингредиенты, качества, правила фаз, предпросмотр, игровой баланс и сохранения не изменены. Альтернативные рецепты не удалялись и не переименовывались в новые камни.

Проверки

84 проверки логики, включая сохранность всех 51 идентификаторов,43 уникальных результатов, фильтрацию отдельного способа, независимость от состояния партии и получение одного и того же камня обоими рецептами. Отдельная браузерная проверка охватывает уникальность заголовков и DOM-идентификаторов, звезду результата, выбор обеих целей, поиск, фильтры и выполнение альтернативного синтеза через предпросмотр. Проверяются мобильные размеры 390×844,320×568 и ПК 1440×1000. Отчёт: output/GemTD_grouped_book_QA.json.

Скачать раздел · Markdown

29. Исправление звёздного рубина и огненных аур

Дата: 8 ноября 2026. Обновление 0.4.4.

Причина недоступного рецепта

Рецепт звёздного рубина был верным: рубин второго качества + рубин первого качества + аметист первого качества. Однако проверка поддержки разрешала только результаты с положительным обычным уроном. В оригинале звёздный рубин имеет нулевой обычный урон и наносит периодический магический урон через tower_huiyao. Пока эта способность отсутствовала, рецепт блокировался вместе с «Вулканом» и «Горящим камнем».

Теперь проверка учитывает явно реализованные способности. Просто снять ограничение было бы недостаточно: получился бы бездействующий камень. Все три ступени огненной ауры перенесены, а обычные выстрелы с нулевым уроном убраны. Неизвестный камень с нулевым уроном по-прежнему не разрешается автоматически.

Сверенные параметры

Значения повторно прочитаны напрямую из установленного VPK GemTD2.0 Workshop3817795446. Старые приложенные текстовые файлы содержат другие числа, поэтому приоритет имеют установленный пакет и новый аудит reference_data/gemtd2-source/burning-auras-audit.json.

• Звёздный рубин:20 магического урона каждые 0,25 секунды, радиус 500 исходных единиц или 3,90625 клетки.

• Вулкан:250 каждые 0,5 секунды, радиус 800 единиц или 6,25 клетки.

• Горящий камень:5000 каждые 2 секунды, радиус 1000 единиц или 7,8125 клетки.

Обычный урон в импортированном каталоге остаётся нулевым. Способности заданы отдельным реестром с соответствием Ability8 из оригинальных NPC. Книга и карточка выбранного камня показывают параметры ауры; круг радиуса использует её действительный радиус.

Поведение в прототипе

Аура действует на врагов вокруг башни без прицельного выстрела, использует магическое сопротивление и щиты. Разные источники складываются. Обезоруживание башни не отключает пассивную ауру. После выхода из радиуса эффект имеет ограниченное время сохранения 1 секунду; исчезнувший или преобразованный источник перестаёт наносить прежний урон.

Интервал 0,25 секунды при частоте симуляции 30 шагов в секунду хранится как 7,5 шага, с чередованием ближайших целых моментов. За секунду получается четыре импульса без накопленного временного смещения. Расписание сохраняется в JSON и восстанавливается вместе с партией. Источник убийства, золото и опыт учитываются обычной системой урона. Визуальное попадание использует существующий ограниченный эффект без новых текстур и освещения.

Сохранённые компоненты разных волн соединяются во время боя; рецепт внутри пятёрки выполняется после пятой постройки. Ограничения фаз, точные качества, предпросмотр и четыре булыжника при выборе из пятёрки не меняются. Старые сохранения совместимы; сбрасывать лабиринт для исправления не требуется.

Проверка

79 проверок логики, включая доступность рецепта в обоих наборах, точный радиус и частоту, сопротивление/иммунитет/щиты, несколько источников, обезоруживание, истечение эффекта, восстановление расписания и начисление убийства ровно один раз. В браузере отдельно проверяются книга, цель рецепта, предпросмотр, синтез из пятёрки, синтез накопленных компонентов, реальное снижение здоровья и сохранение партии. Отчёт: output/GemTD_star_ruby_QA.json.

Числа и привязки способностей сверены с исходниками. Точное поведение всех модификаторов движка Source2 в запущенной Dota отдельно не проверялось. Это исправление конкретной способности, а не заявление о завершении всех особых эффектов Classic.

Скачать раздел · Markdown

28. Цель рецепта, предпросмотр синтеза, волны и здоровье врагов

Дата: 8 ноября 2026. Версия: 0.4.3. Реализует одобренные предложения из документа 27 с уточнением пользователя: отдельный осмотр врагов не нужен; вместо него улучшена видимость здоровья.

Цель рецепта

В Книге синтеза у каждой поддерживаемой формулы есть кнопка «Собирать». Выбирается одна конкретная формула, включая её точные качества и альтернативный набор ингредиентов. Повторное нажатие снимает цель. Новый выбор заменяет прежний.

Компактная строка цели показывает результат и число уже сохранённых компонентов. Она открывает нужный рецепт в книге; кнопка × снимает цель. На карте и миниатюрах пятёрки флажком отмечаются точные недостающие ингредиенты. Камень другого качества не считается совпадением. Когда нужный компонент уже сохранён в достаточном количестве, его новые экземпляры не отмечаются как недостающие.

Цель сохраняется в текущем браузере отдельно от партии и ручного избранного. Звёзды избранного продолжают работать независимо. Цель остаётся выбранной после синтеза, чтобы игрок мог собирать эту формулу повторно; её можно снять в любой момент. Это не автоматическое резервирование или расходование камней. Для промежуточного составного ингредиента можно выбрать его собственную формулу; рекурсивное дерево целей пока не реализовано.

Предпросмотр синтеза

Кнопки синтеза из карты и книги сначала открывают единый предпросмотр. Это относится к составным рецептам, повышению качества из одинаковых камней текущей пятёрки. Обычное «Оставить» и случайное понижение качества работают по прежним правилам.

Результат остаётся на выбранной позиции. В этом этапе не добавлено перетаскивание будущей башни на другую клетку. Логика синтеза исполняется существующими проверяемыми командами.

Подсказка волны

Во время строительства, выбора и ожидания запуска рядом с верхней кнопкой показаны номер и основные свойства предстоящей волны. Приоритет имеют босс, невидимость, полёт, защита от магии и особые способности. На компактной кнопке помещаются до двух основных свойств; нажатие открывает полный существующий справочник со всеми особенностями, количеством противников и здоровьем.

Подписи получаются из той же конфигурации, что использует бой: они не выводятся из внешнего вида модели. Например, модель бронированного существа сама по себе не означает броню, если в данных волны её нет. После начала боя предварительная подсказка исчезает.

Полоски здоровья

Здоровье теперь рисуется общим экранным слоем поверх сцены. Полоски имеют постоянную толщину и ширину в CSS-пикселях: обычная 30×6, у босса 48×8, плюс контрастная окантовка. Масштаб камеры и размер модели не делают их микроскопическими.

Пустая часть остаётся тёмной, заполнение меняет цвет при снижении здоровья. Бирюзовая линия отдельно показывает наличие щита, фиолетовая метка — нераскрытую невидимость. Полоски видны и при полном здоровье. Слой не принимает касания, не выбирает врагов и не мешает перемещению карты.

Используется один Canvas2D для всей волны с ограничением плотности пикселей 1.5. Два прежних трёхмерных объекта полоски на каждого врага удалены. Новых текстур, источников света или эффектов постобработки нет. Это устройство реализации, а не обещание конкретного FPS на всех телефонах.

Проверки и границы

71 проверка логики включает точные источники синтеза, неизменность партии от предпросмотра, устаревший набор, лишний сохранённый экземпляр, четыре булыжника, Великий камень из четырёх дубликатов, сохранение цели и точность качества. Браузерные проверки охватывают подтверждение/отмену, реальную остановку и возобновление боя, разные свойства волн, постоянный размер здоровья и четыре размера экрана:320×568,390×844,844×390,1440×1000. Отчёт: output/GemTD_decision_tools_QA.json.

Отдельный осмотр врага не реализуется по уточнению пользователя. Полноценное обучение, профиль и синхронизация предпочтений, онлайн и дальнейшие игровые системы остаются в общем плане. Два нажатия при постановке и кооперативные пинги по-прежнему отложены. Текущая кампания содержит 20 волн; правила, баланс и утверждённые иллюстрации этим обновлением не меняются.

Скачать раздел · Markdown

История этапа0.4.2. Цель рецепта, предпросмотр и подсказка волны уже реализованы в обновлении0.4.3. Осмотр врагов отменён по уточнению пользователя; улучшены полоски здоровья.

27. Избранное, текущая пятёрка и удобство управления

Дата: 8 ноября 2026. Версия интерфейса: 0.4.2. Этот документ уточняет поведение мини-виджета из документа26; правила синтеза сохранены.

Реализовано

Полные комплекты на карте

На карте показываются только реальные полные наборы поддерживаемых рецептов. Если действие уже разрешено фазой игры, появляется обычная кнопка «Собрать». Если компоненты накоплены на поле, но соединение по правилам оригинала разрешено только в бою, карточка прямо сообщает об этом.

Если два компонента сохранены, а точный третий уже появился среди пяти, показывается полный комплект и действие «Оставить». Оно сохраняет этот компонент; после запуска боя доступен синтез. Нельзя объявлять готовым набор из двух временных камней и одного старого: после выбора два разных временных камня не сохранятся.

Из мини-виджета убраны отсутствующие ингредиенты, прогнозы будущих выпадений и цепочки с ещё не созданным промежуточным компонентом. До завершения пяти построек выбор не предлагается. На карте до двух карточек ожидания; непосредственные действия синтеза и улучшений находятся рядом. Все51 формула, недостающие части и допустимые промежуточные действия остаются в Книге синтеза. Три результата с неподдерживаемой особой способностью не предлагаются к расходованию компонентов.

Избранное

Пять камней текущего хода

На карте появились кольца и номера1–5. Они совпадают с миниатюрами в порядке постановки. Выбранный камень выделен белым контуром, избранный — золотым и звездой. После выбора единственного результата отметки пятёрки исчезают.

Нажатие на миниатюру переводит камеру к этому камню. Кнопка «1–5» подбирает масштаб для всех камней хода с учётом верхних и нижних панелей. Карта остаётся доступна для обычного перемещения и масштабирования.

Маркеры используют один дополнительный вызов отрисовки максимум для пяти колец и пять текстовых меток. Новых источников света, теней, текстур и эффектов постобработки нет. Это ограничение сложности, а не измерение FPS физических телефонов.

Что улучшить следующим шагом

Следующие пункты — предложения. Они ещё не включены в игру.

ПриоритетУлучшениеКак должно работатьОбъём и зависимость
1Выбранный рецепт как цельКнопка «Собирать» закрепляет одну формулу; её точные ингредиенты отмечаются в книге и пятёрке. Если формул несколько, игрок явно выбирает одну. Ручное избранное остаётся самостоятельным списком.Небольшой отдельный этап интерфейса; сервер не нужен.
2Предпросмотр синтезаНажатие на готовый рецепт выделяет расходуемые камни и показывает клетку результата. Игрок видит, какие экземпляры будут использованы, прежде чем подтверждает действие. На телефоне предпросмотр должен занимать одну компактную строку.Интерфейс и выбор источников; команда повторно проверяет набор перед исполнением.
3Свойство следующей волны у запускаРядом с «Начать волну» короткая метка «Летающие», «Невидимые» или «Защита от магии». Нажатие открывает уже существующий справочник волн.Маленький этап без изменения баланса.
4Сворачиваемая карточка выбораПосле просмотра оставить на поле имя, избранное и главное действие; расширенные характеристики открывать по запросу. При нескольких готовых рецептах добавить ясный счётчик горизонтальной ленты.Небольшой этап; проверить телефоны320–430px и landscape.
5Осмотр противникаНажатие на врага показывает здоровье, броню, сопротивления и активные эффекты. Выбор врага не должен случайно строить камень.Средний этап: отдельный выбор объекта и компактная карточка.
6Краткое обучение в первой партииПоследовательно объяснить пять построек, один оставляемый результат, булыжники, синтез и ручной запуск. Пояснения исчезают после выполнения шага и повторно открываются из помощи.Средний этап; нужны сохранение прогресса обучения и проверка новичками.

Рекомендуемый ближайший порядок: цель рецепта → предпросмотр расходуемых камней → свойство волны у запуска. Это повышает ясность решений без производства новых моделей и изменения механики.

Какие системы ещё отсутствуют

Для полноценного продукта остаются профиль с синхронизацией, серверная совместная игра1–4, соперничество на отдельных картах, восстановление подключения, подробные итоги/история партий/рейтинги, кампания50 волн и бесконечный режим. Их подробные требования находятся в документах19–23. Сейчас работает одиночный прототип20 волн. Новые отметки и избранное не означают появления сетевого режима.

Два последовательных нажатия при постановке и кооперативная подсветка зоны записаны в план и отложены по прямому указанию пользователя. В этом обновлении они не реализуются.

Визуальные требования и приёмка

Новые кнопки избранного имеют область44×44 CSSpx: ориентир W3C Target Size Enhanced. Состояние показывается звездой, номером, подписью и рамкой, в соответствии с принципом W3C Use of Color. Применение этих приёмов не означает полный аудит доступности игры.

Проверки: неполный рецепт не появляется на карте; готовый синтез не дублируется карточкой ожидания; схема2+1 проходит через сохранение компонента и реальное соединение; точное качество избранного сохраняется после перезагрузки; просмотр/отметки не меняют состояние партии; все пять номеров видны после команды показа; после выбора отметки исчезают. Проверяются узкий телефон320×568, телефон390×844, landscape844×390 и ПК1440×1000. Для скорости и управления нужны дальнейшие проверки на физических iOS/Android-устройствах.

Скачать раздел · Markdown

Берег и экспедиция на 20 волн

Подготовлена сборка 0.4.0, профиль prototype-solo20-v4. Публикация проверяется отдельно по ответу Sites и delivery-отчёту; наличие локальной сборки не означает обновление основного адреса.

Опора деревьев и истоки

Причина дефекта: семь из восьми дальних деревьев находились за реальным краем острова, а отдельные камни под ними читались как висящие подставки. Нижнее дерево почти совпадало с осью водопада.

Независимая проверка: у 8/8 деревьев есть поверхность под корнями, заглубление 0.055 клетки. Верх скал над истоками Y≈0.326/0.305, начало воды Y=0.085. Новых пересечений над строительными клетками не обнаружено. Размеры поля и путь не менялись, иллюстрации сохранены.

Волны 11–20

Источник: GemTD2.0 Workshop3817795446, NPC KV и таблица способностей. Аудит и отклонения: reference_data/gemtd2-source/twenty-wave-audit/audit.json. Первые 10 волн сохраняют прежний баланс. Для продолжения используются те же прототипные множители HP×0.63 и speed×0.85/128; это ещё не полный Classic2.0.

ВолнаИсходные HP / speedНовое поведение
11400 /525Броня 10
12500 /600Аура обезоруживания:150Source units, остаток 1сек
13900 /600Крепкая наземная волна с бронёй
141100 /600Щит на 7 положительных событий урона, cooldown5 сек, срок 60 сек
15270 /600Полёт и восстановление 20%HP у промежуточных маяков
16950 /800Магический урон не проходит; золото у маяка становится floor(gold×0.99)
172200 /600Сопротивление магии 40%,50% шанс обезоружить атакующего на 1сек
183300 /675Невидимость и аура обезоруживания; опал раскрывает врага
193200 /1000Ускорение+50% на 20 сек
2030000 /900Второй и финальный босс экспедиции; масштаб 1.28 базового босса

У новых волн броня 10; базовое MR−5% усиливает магический урон, у 16-й MR100%, у 17-й 40%. Обычные враги 11–19 дают 10 золота/XP, боссы 150 золота/300XP. Утечка обычного врага 11–19 стоит 1–7 жизней; босса — ceil(remainingHP/maxHP×100).

Опал и четыре подтверждённых составных детектора раскрывают невидимость. Радиус 600/128 — временное веб-решение: точный native-радиус не найден. Призрачный враг виден игроку полупрозрачным, но башни без раскрытия не берут его в цель. Щит имеет голубую полоску. Реталиация использует seeded Bernoulli вместо Source2 PRD; проверка запуска щита/ускорения раз в 0.1 сек заменяет движковые задержки приказов. Не выдавать эти различия за точный порт.

Верхний номер волны открывает памятку всех 20 противников. После 10-й идёт стройка 11; победа — после 20. Старое сохранение победы 10 мигрирует к 11 без сброса камней, золота, XP, жизней и RNG. Проигранные партии не возрождаются. В snapshot входят щит, ускорение и отдельный RNG способностей. Переход на 21-ю отклоняется.

Используются 6 существующих анимированных моделей с разными ролями и увеличением размера;20 новых GLB не производились.50 уникальных форм остаются в художественном плане.

Проверка

48/48 проверок ядра: прежние правила, все новые свойства, миграция, snapshot/replay, переход 10→11 и финал 20. Полный прогон 182 врагов проверяет фазы/счётчики/награды; это не доказательство окончательного баланса. Отдельный браузерный сценарий использует обычный продуктовый цикл без ограниченияRAF: старый save открывается на 11/20 с прежними ресурсами,20-й босс появляется и заканчивает игру итогом «20 волн пройдены».

Общий вид balanced:79 отрисовок/590435 треугольников против 79/630769 ранее,23 текстуры. Ближний balanced:38/852387 против 36/819693 — добавлены два ранее пропадавших дерева. Мобильный low сохраняет дальние плоские деревья. Новые источники света и постобработка не добавлены. FPS физических телефонов не измерялся.

Отчёты: output/GemTD_rim_after_QA.json, output/GemTD_twenty_live_QA.json; снимки GemTD_rim_after_spring.png, GemTD_twenty_mobile.png, GemTD_twenty_result.png.

Скачать этот раздел · Markdown

Обязательный план развития Gem TD Web

Редакция 7 ноября 2026. Этот документ и документы 20–23 уточняют документы 02–04. Это задания будущей разработки, а не перечень уже выпущенных функций.

1. Что принято пользователем

  1. Кампания из 50 волн, затем настоящий бесконечный режим.
  2. Художественная цель — 50 различимых моделей противников, по одной основной форме на волну. Маленькие и простые существа в начале; более крупные, сложные и внушительные позднее. Масштабирование допустимо как промежуточный этап.
  3. Сначала онлайн-кооператив 1–4 игрока на одной карте и одном лабиринте, с понятным увеличением сложности. Затем соревнование на отдельных одинаковых картах: последний выживший побеждает.
  4. Подробные показатели золота, очков, качеств, созданных кристаллов и нанесённого урона: в бою, после матча, за всё время и в общем рейтинге. В дальнейшем — сезоны с разными условиями.
  5. Профиль: электронная почта → числовой код в письме → имя и пароль. Позднее — покупки, связанные с аккаунтом.
  6. Утверждённые иллюстрации сохраняются. Текущая визуальная работа касается света, материалов 3D-мира и цветов интерфейса; устройство не должно получать дополнительные тяжёлые эффекты.

Ранее согласованный режим с отправкой врагов соперникам остаётся отдельной дальнейшей задачей. Он не входит в первую версию соревнования на выживание.

2. Что реально готово сейчас

Подготовлена сборка 0.4.0 одиночного прототипа на 20 волн с картой 37×37, пятёрками, синтезом и мобильным интерфейсом. Есть 6 анимированных моделей. Граница точности и новые свойства — документ 25. Готовность локальной сборки и доступность её на основном адресе проверяются отдельно; полный Classic пока не завершён.

Ещё нет: полноценной кампании 50, бесконечности, серверных матчей, регистрации, глобальной статистики, сезонов и оплаты. Локальное браузерное сохранение не является защищённым серверным результатом. Новый план не должен менять эту маркировку до прохождения приёмки.

3. Что подтвердил аудит установленной GemTD2.0

Источник — Workshop3817795446, опубликован 29.10.2026; пакет SHA256 c2aed66ec055edf7fdd3bceb02a0d941d207c01b82326074366f0642c623166e. Читались файлы, игра Dota не запускалась. Подробные доказательства: волны/co-op, экономика/статистика. Смещения, исходные строки и хеши выдержек сохранены рядом. Сам VPK и чужие модели в веб-сборку не переносятся.

ВопросПодтверждённое поведениеСледствие для нашего плана
Сколько волн50 исходных;51–100 повторяют их с резким усилением, без строительства; после 100 есть завершающая ветвьНастоящая бесконечность — новое правило, отдельная версия баланса
Сложность 1/2/3/4HP×base:0.69/2.91/5.17/7.81; speed×base:0.69/1.01/1.19/1.42Не называть исходную таблицу линейной; хранить её отдельно от нового пропорционального режима
Врагов на волнуСчётчик стартует 10 и меняется сериями успехов/неудач; обычно 1 боссНельзя просто умножить 10 врагов на игроков
Общая картаОбщий замок, начальные 100 жизней, общее золото, общий пул сохранённого синтеза; своя пятёрка у каждогоОтдельно описать владение, разрешение союзнику и расход общих ресурсов
Начальные камни32/16/8/0 при 1/2/3/4Конфигурация поля зависит от числа участников
ПереподключениеЕсть callbacks, но готовность после ухода и одна ветвь reconnect сомнительныВеб-восстановление проектируем и проверяем самостоятельно
ПерестановкаSwap за 300/225/175/150 золота по уровню способности; есть соседний обмен и круговой сдвигЭто игровые расходы, а не доказанная цена за реальные деньги
Бесплатные переносыОбщая конечная квота с докупкой не найдена; старая версия возвращала золото за обмен с обычным камнемНе обещать перенос этого правила без выбора целевой версии
МагазинЕсть покупки героев/способностей/эффектов/игрушек/курьеров/коробок через внешний APIЦены внешнего магазина и реальная платёжная интеграция локально не установлены
Мета-силаБонусы питомцев способны увеличивать урон; это не только косметикаНе переносить их незаметно в честный рейтинг
РейтингОтправляются результаты co-op/race, но серверная MMR-формула неизвестнаНаша статистика и формула рейтинга должны быть собственными и версионируемыми

Найдено расхождение версий: старое приложение использовало иные HP/speed, а wave2 имела speed600 вместо 700 в 2.0. Текущий прототип не перенастраивается молча в рамках цветового обновления. Сведение правил — отдельное заданиеA1.

4. Порядок выполнения и зависимости

ЭтапРезультатЗависимостиКогда принимается
A0Более выразительная карта/UI без новых графических проходовТекущий прототипСнимки ПК/телефона/ночи, неизменность утверждённой графики и бюджета
A1Версионированный ruleset2.0, реестр всех недостающих эффектов и 50 волнАудит исходниковНет смешения старых и новых таблиц; неизвестное явно отмечено
A2Кампания 50 с полноценными противниками и итогомA1, приоритетные эффекты ClassicПолный headless-прогон и ручные контрольные волны
A3Настоящая бесконечность, отдельные правила и рейтингA2Численная устойчивость, ограниченный spawn, воспроизводимость
A4Контракт серверных команд/событий, журнал статистикиA1; может идти до завершения артаСервер воспроизводит матч по seed и командам
A5Почтовый аккаунт и сессии, привязка гостяA4 контракты идентификаторовПроверка регистрации, восстановления, выхода, защиты повторов
A6Авторитетная серверная solo-комната и восстановлениеA4,A5Разрыв связи не портит сохранение/результат
A7Co-op1–4, общая карта, готовность, права, балансA2,A6Четыре клиента, одновременные команды, уход/возврат
A8Last Survivor2–4 на отдельных картахA7 транспорт/сервер; правила из 21Проверены выбывание, ничья и единый темп времени
A9Личная история, подробные итоги, глобальные таблицыA4,A6; накапливать с первого сетевого матчаПовторная доставка результата не удваивает показатели
A10Сезоны/награды/архивыA8,A9Граница сезона не меняет правила начатой партии
A11Магазин косметики и оплатаA5,A9, выбранная юрисдикция/провайдерТестовые платежи, повторы, возвраты, выдача ровно один раз

Производство моделей идёт пакетами рядом сA2–A8;50 разных силуэтов — цель полного художественного выпуска, не повод блокировать проверку сервера временными моделями. Оплата не является зависимостью отладки игры.

5. Ещё недостающие элементы полного оригинала

ОбластьЧто сделатьПриоритет
БойТочный реестр всех атак, аур, баффов, дебаффов, иммунитетов, уклонения, невидимости/обнаружения, отражения/регенерации; порядок вычислений и округленияДо 50-волнной приёмки
СинтезРеализовать способности всех составных башен; сейчас некоторые недоступны. Проверить сохранение владельца, MVP, вклад ингредиентов; повышать качество только внутри текущей новой пятёрки; сохранённые пары не улучшаютсяДо полного Classic
ПлитыТри различимых уровня, создание/замена/усиление, ограничения, влияние на путь и эффектыДо полного Classic
Экономика партииXP/уровень строителя/вероятности качеств, общая и личная валюта, расходы способностей, награды, MVP до 10 и его перенос при синтезеДо баланса кампании
ВолныЛетающие маршруты, элита, альтернативные варианты, боссы, урон замку по диапазонам, enrage и динамическое число враговДо 50-волнной приёмки
Строитель-шарСохранить форму шара; способности и прокачка не требуют человека/гуманоида. Для рейтинга одинаковый набор способностейПосле основных эффектов
Шаблоны лабиринтаСохранение схемы/призрачный план; оригинал сохраняет occupancy, это не checkpoint бояПосле надёжных сохранений
ОбучениеКороткое обучение пятёрке, выбору, синтезу, перелётам и общей карте; подсказки для телефонаДо открытого теста
Звук и доступностьИндивидуальная громкость, сигналы начала/опасности/синтеза, форма+иконка помимо цвета, reduced motion, читаемость мелких чиселДо открытого теста
НадёжностьМиграции сохранений, версии контента, реплеи, аварийный checkpoint, экспорт результата, жалобы/модерация имён, админ-аудитДо рейтинга
ЭксплуатацияМетрики, резервные копии с реальным восстановлением, нагрузка, лимиты комнат, поддержка зависших матчей и спорных платежейДо публичного онлайна
Другие оригинальные системыЗадания/дневные условия, питомцы, герои, luckybox, кодовые награды — сначала аудит/продуктовое решение; не обязательны первой честной веб-версииПосле ядра

6. Инструкция агенту следующего этапа

ВзятьA1 как следующую игровую задачу. Сначала прочитать 20 и evidence, составить матрицу source / implemented / missing / chosen deviation. Не добавлять одновременно авторизацию, магазин и 50 волн в один патч. На каждую работу: входные файлы → контракт данных → реализация → воспроизводимые проверки → обновление статуса. Публиковать только реализованное; будущие кнопки не должны выдавать локальные значения за глобальный рейтинг.

Правила выполнения четырёх направлений находятся в 20 — волны, 21 — сервер/режимы, 22 — статистика, 23 — профиль/покупки.

7. Решения до начала зависимой реализации

Предварительно принять предлагаемые ниже значения для прототипирования, затем подтвердить на тестах: строительство после 50 разрешено; пропорциональный co-op имеет HP×P без ускорения; ranked не продаёт силу; disconnect сохраняет сложность; ранговый Last Survivor играет в одинаковом темпе. Выбор страны/валюты/платёжного оператора потребуется только передA11. Эти вопросы не блокируют нынешнее улучшение цвета и подготовку архитектуры.

Скачать этот раздел · Markdown

50 волн, модели и бесконечный режим

Статус: обязательный будущий объём. Числа новых режимов ниже — проектные предложения. Подтверждённый источник — reference_data/gemtd2-source/future-audit/waves-coop.json:50 основных NPC,25 альтернативных, базовые HP/speed/armor/MR и ability IDs. Полная художественная раскладка всех 50 форм: data/wave_visual_plan.json.

1. Сначала определить версию правил

Создать rulesets/gemtd2-2026-10-29 как неизменяемый импорт свидетельств и rulesets/web-campaign-v1 как явно выбранную веб-реализацию. Пакет старых приложений, установленная 2.0 и нынешний прототип — три разных источника. Не объединять коэффициенты без provenance и причины изменения. Серверный матч фиксирует rulesetVersion, contentHash, mapVersion, seed, difficultyProfile до старта.

Переносить исходные свойства, не Dota-модели. Dota ModelScale/скорость Source2 не являются готовыми метрами/секундами веба. Масштаб маршрута 128Source units на клетку известен, но итоговые скорости и native-модификаторы требуют отдельного контрольного теста. Временные скорости должны иметь статус provisional, а не «точный оригинал».

2. Реестр данных и состояние

EnemyDefinition: id, sourceId, movementType, baseHp, armor, resistances, abilityIds, targetTags, collisionRadius, visualId, rewardRule, leakRule, provenance, implementationStatus.

WaveDefinition: index1..50, primaryEnemyId, alternativeRules, countRule, spawnSchedule, boss, briefingTags, rewardPolicy, abilityLevelPolicy. Варианты 20/30/40/50 и случайность по врагам 35/36/38 хранить раздельно: это разные точки броска. Календарную ветвь не читать с часов клиента; в рейтинге заменить версионированным seed-событием или фиксированным сезонным правилом.

WaveState: absoluteWave, campaignWave, endlessCycle, phase, scheduled/spawned/alive/killed/escaped, startTick, rosterSize, hpScale, countScale, nextSpawnTick, variantChoice, eliteRolls, enrageAtTick. Прочитанное число врагов фиксировать на начале волны; изменения будущей сложности не должны менять уже созданных существ.

EnemyState: entityId, definitionId, hp/maxHp, shield, routeProgress, statuses, sourceWave, spawnOrdinal, ownerMapId, rewardClaimed. Визуальный размер не меняет маршрут, радиусы AoE и hitbox автоматически.

Фазы: construction → allDraftsResolved → ready → spawning/combat → waveSettled → nextConstruction. Волна завершена только когда очередь spawn пуста и живых врагов нет. Смерть и выход одного врага в один tick должны дать ровно один исход. Волна 50 выставляет campaignCleared, отдельно от matchEnded.

3. Пять художественных глав

ВолныОбразОбычная высота, клеткиБоссыСложность формы
1–10Садовые животные, небольшие насекомые и лесные жители0.35–0.6210:0.95Простой силуэт, минимум украшений
11–20Лесные хранители и сильные звери0.55–0.8020:1.25Панцирь, рога, шерсть, листья
21–30Древние хищники, броненосцы, крылатые0.70–0.9830:1.55Явные массы брони и отличимые части тела
31–40Фантастические глубоководные/небесные существа0.85–1.1540:1.85Более крупная пластика, сдержанные рунические акценты
41–50Древние стражи и колоссальные финальные формы1.0–1.3050:2.15Величественные силуэты, собственная финальная анимация

Это предложенные высоты для камеры, не характеристики исходника. Сильный рост заметен между главами и внутри каждого класса; первая обычная волна новой главы не обязана быть выше предыдущего босса. У быстрых и летающих форм силуэт может быть вытянутым/широким вместо высокого. Обычный наземный footprint до 0.8 клетки; у босса видимая ширина до 1.4, вычислительная точка пути прежняя. Крылья/рога не должны закрывать больше соседних башен; проверить мобильный zoom1.5.

Таблица 50 силуэтов в JSON — собственный предложенный арт, не перевод китайских имён source ID. Например персонаж с «птицей» в имени исходника может идти по земле: gameplay fly брать из source-флага, а не из картинки. Для летучего меха обязателен визуальный полёт; для наземной птицы — бег/прыжки.

4. Полный производственный конвейер моделей

  1. Привязать 50 waveVisualId к реестру. Для каждого: силуэт, движение, размер, палитра главы, читаемые признаки свойств, автор/лицензия/источник, статус temporary/final.
  2. Сначала пакет 1–10 с одним полным циклом импорта; затем 11–20,21–30,31–40,41–50. Шесть имеющихся моделей допустимы как временные. Повторная перекраска одной модели не считается 50 уникальными финальными моделями; общий скелет и анимации разрешены.
  3. Для каждого GLB: Idle/Move/Death; при необходимости Hit/Spawn. Корень в основании, согласованная ось вперёд, одна система единиц, запечённый transform, без камеры/света. Смерть не задерживает игровую награду; визуальный хвост удаляется отдельно.
  4. Цели mobile: обычный LOD0 до 3–5 тыс. треугольников, дальний до 1–2 тыс., босс до 8–12 тыс.;1–2 материала, текстуры 512–1024, минимальное число костей. Это лимиты проекта, а не обещанная скорость на любом телефоне. Профилировать шкуру/прозрачность/тени всей волны.
  5. Подгружать текущую и следующие 2 волны; освобождать неиспользуемые материалы/скелеты. Не грузить 50 GLB на первом входе. На сбое загрузки сохранить играбельную fallback-модель и вывести диагностический статус в QA.
  6. Совместный скелет/атлас и переиспользование геометрии снижают бюджет; независимую анимацию обеспечить корректным skeleton clone либо измеренным animation instancing. Не покупать дорогую систему до профиля нагрузки.
  7. Сохранить contact sheet, масштаб рядом с камнем, короткий preview движения и mobile-снимок каждой главы. Одобренные изображения камней не менять.

5. Кампания 1–50

Реализовать все исходные волны как данные. Боссы 10/20/30/40/50; летающие волны определяет JSON. Части модификаторов требуют собственного порта поведения Dota. Для каждого ability ID иметь один из статусов verified / implemented-provisional / missing; неизвестная способность не должна исчезнуть без отметки.

Оригинал использует динамический wave_enemy_count с нижним 5,50-пороговой серией успехов/неудач, случайной элитой 1/400 и особыми вариантами. Нельзя принять упрощённую «10 врагов всегда» за полный Classic. Для честного сравнения набор бросков — серверный seed, а не Math.random. Варианты элиты должны заранее показывать значок и объяснение, не только цвет.

После 50 показать результат кампании и предложить продолжение в endless. В solo разрешить завершить и сохранить clear. В co-op режим продолжения выбирают в лобби; после 50 можно командой закончить без потери достижения. В Last Survivor выбор не открывает паузу: если осталось несколько игроков, автоматически продолжается endless.

6. Настоящая бесконечность — web-endless-v1

Оригинальный 51–100 без стройки сохранить только как отдельный будущий classic-survival-100, если он понадобится. Не называть его endless. Наше предложение: разрешить новую пятёрку и улучшения после 50; это поддерживает продолжение развития лабиринта. Флаг buildAfter50=true фиксируется ruleset и не меняется в ходе матча.

Для абсолютной волны n>50: cycle=floor((n-51)/50)+1, slot=((n-1)%50)+1. Повторять 50 семейств, но брать отдельную возрастающую кривую угрозы; летающие/боссовые слоты сохранять. Предложение начальной кривой: целевая волновая суммаHP B(n)=B50 * 1.025^(n-50), а не умножение исходногоHP первой волны на большой случайный коэффициент. ДолюHP распределять по типу/количеству существ и коэффициенту босса. Сохранять логарифмическую форму расчёта для аудита.

Эта 2.5%-кривая — старт балансировки, не обещание финальной длительности. Не добавлять одновременно неограниченные скорость, число врагов иHP. Предварительные caps: speed не выше 1.25×соответствующей кампанийной; обычный count не выше 30, живых одновременно не выше 60 на карту. Достигнут cap — увеличивать угрозу свойствами/HP, но не количеством геометрии.

Два модификатора из разрешённого набора на цикл: броня, сопротивление, регенерация, защита первой атаки; несовместимые комбинации запрещены. Комбинация не может сделать волну абсолютно неуязвимой для всех типов доступной обороны. Объявлять условия до следующей стройки. Случайность модификаторов отдельна от RNG камней.

При угрозе численной точности использовать версионированные ступени масштаба HP/урона или decimal/fixed-point представление; не получать Infinity/NaN. Выбранная нормализация обязана сохранять отношение урона кHP, отображаемые числа и replay hash. В рейтинге серверные ресурсные лимиты завершают матч статусом technical_limit, а не «игрок проиграл». Такой исход не публикуется как обычный рекорд без обозначения. Стресс-прогон хотя бы до 10000-й вычисляемой волны; фактический баланс проверять на длинных игровых сессиях отдельно.

7. Задания агенту и приёмка

IDРаботаПроверяемый результат
W1Импорт 50+вариантов, provenance, версияВсе ссылки enemy/ability/visual валидны; неизвестные эффекты блокируют статус Classic
W2WaveDirector, отдельные RNG-потокиОдинаковый seed даёт одинаковые варианты при любом FPS клиента
W3Полный урон замку, награды, enrageПроверки обычного/босса, последнего spawn, одновременной смерти и выхода
W4Все особые эффектыНевидимый не атакуется без раскрытия; иммунитет/броня/уклонение/регенерация корректны
W5Переход 50→51 и продолжениеClear не стирается при отказе продолжить; co-op не зависает; wave101 существует
W6Числа и ресурсы endlessНет NaN/Infinity/неограниченного spawn; после snapshot получаем тот же hash
W7Модели пакетами 1050 уникальных final visual IDs, клипы/лицензия/LOD/масштаб приняты

Графика не должна менять исход боя. В headless50 волн проверять независимый отFPS результат; отдельные fixture-тесты не заменять только «сильной башней, убивающей всё». Проверить wave5/15/25/30/40/50, все невидимые/иммунные разновидности и минимум одну волну каждого специального эффекта.

Скачать этот раздел · Markdown

Сервер, общая карта и Last Survivor

Статус: co-op1–4 и Last Survivor2–4 реализованы и проверены локально. Публичный сервер ещё не размещён. Актуальные результаты0.9.0–0.10.0 находятся в начале страницы; ниже — полная целевая спецификация.

1. Оригинал и сознательные изменения

В GemTD2.0 co-op: общий замок и team_gold, отдельная пятёрка каждого строителя, общий сохранённый gemtd_pool, сохранённый owner башни и совместное управление. Волна ждёт готовности занятых слотов. Начальные 32/16/8/0 булыжников для 1/2/3/4. Базовые HP-коэффициенты 0.69/2.91/5.17/7.81 и speed0.69/1.01/1.19/1.42. Число врагов не умножается наP. Прежняя сложность в найденном обработчике не снижается при уходе игрока.

В исходном Race игроки размещены в собственных квадрантах; сохранение шаблона использует 17×17. Это не доказательство, что нам нужно уменьшить отдельную веб-карту до 17×17. По текущему требованию берём одинаковые независимые solo-поля 37×37; original Race сохраняем в сравнительной матрице, а не незаметно смешиваем с новым Last Survivor.

2. Кто отвечает за матч

Единственный авторитет — сервер. Клиент отправляет намерения и показывает результат. Он не определяет HP, добычу, RNG, победителя, рейтинг, баланс покупок или владельца объекта. Offline остаётся доступным отдельно; изменённый localStorage нельзя загрузить как рейтинговый результат.

Предложение: общее чистое ядро TypeScript/ESM, сервер Node LTS, комнаты поверх WebSocket; Colyseus — кандидат на транспорт/комнаты/синхронизацию, а не замена нашей симуляции. Официальные документы подтверждают серверные изменения состояния и полный snapshot при успешном reconnect: state, reconnection. Совместимость версии и измерения проверить в отдельном сетевом образце, закрепить зависимости lock-файлом.

Текущий Sites — статический клиент. Долгоживущую Node-комнату нельзя просто положить в его статический dist: нужен отдельно развёрнутый игровой сервис и HTTPS API. Альтернатива — отдельное исследование Workers/Durable Objects; не вести две серверные реализации одновременно. Профиль/итоги: PostgreSQL как источник истины; Redis опционально для краткоживущих очередей, rate limits и presence. Нельзя хранить единственную копию результатов только в Redis.

Компоненты: browser → authenticated API → lobby/matchmaker → room worker → journal/checkpoints → result finalizer → PostgreSQL/outbox → statistics projector. Сервер комнаты не выполняет платёжные запросы и отправку почты внутри игрового tick.

3. Модель состояния и команды

Room: id, mode, state(lobby/loading/running/recovering/finished/aborted), region, seed, ruleset/content/map versions, seasonId, ranked, tick, revision, leaseEpoch, roster, difficultyProfile, startedAt, resultId.

PlayerSlot: playerId, slotId, displayNameSnapshot, role, connected, reconnectDeadline, ready, draftState, ownerColor, contribution, eliminatedTick, surrenderState. Email и сессионные секреты не входят в snapshot матча.

BoardState: boardId, mapVersion, structures, route, lives, goldLedgerRef, waveState, RNGStreams. Co-op имеет один BoardState; Last Survivor — по одному на слот, с единым room clock.

Конверт команды: protocolVersion, roomId, matchEpoch, commandId, clientSeq, expectedRevision, type, payload. actorId берётся из проверенной сессии соединения. Ответ: commandId, accepted/rejected, reasonCode, appliedTick, revision. Старое/повторное намерение возвращает тот же исход без повторного применения. Ввод клиента не содержит доверенного serverTick.

Команды: place/remove/resolveDraft/merge/craft/moveStone/ready/unready/surrender/ping. Сервер проверяет фазу, координаты, права, ресурсы, рецепт, занятость и маршрут. В co-op две команды на одну клетку выполняются последовательно в одном порядке: первая принята, вторая отклонена; частично списанного золота быть не должно. Изменение карты и проверка пути — одна атомарная операция.

Симуляция 30Hz как нынешнее ядро; сетевые дельты стартово 10Hz, UI-сводки 1–2Hz, полный snapshot при входе/расхождении. Клиент интерполирует движение между подтверждёнными точками. Не слать тысячи HP/частиц каждый кадр; визуальные частицы не являются сетевыми сущностями. Компрессия/формат — после измерения, с явным пределом размера сообщения и очереди клиента.

4. Co-op: полный игровой цикл

  1. Лобби по ссылке/коду,1–4 слота, nickname/ready, выбор режима и публичности. Только до старта: параметры сложности, исходных способностей, общей передачи управления, endless. Нет обязательного чата на первом этапе: достаточно пингов и быстрых сообщений.
  2. Все загрузили версии контента → сервер фиксирует состав и seed → создаёт общую карту, замок и соответствующие исходные камни. Не начинать волну для игрока, ещё не загрузившего поле.
  3. Каждому выдаётся своя пятёрка. Свободные клетки общие. Строитель не может перекрыть маршрут и «застолбить» чужую текущую пятёрку без явного разрешения.
  4. Каждый выбирает результат своей пятёрки. Готовность ставится только после завершения выбора. Пустые слоты не блокируют. Кнопка запуска показывает «готовы 2/3», а не начинает бой раньше остальных.
  5. Все готовы → короткий общий countdown → одна очередь врагов по общему маршруту. Никаких локальных пауз/скоростей в ranked. В casual возможна общая пауза по согласованным правилам.
  6. Разрешённые фазой синтез/удаление/перенос выполняются сервером. Последний враг завершает волну; сохраняются статистика и checkpoint; далее новая стройка.

Владение и помощь союзника

У каждой башни остаются createdBy, ownerId, controlledByPolicy, ingredientLineage. По умолчанию любой может осмотреть и поставить пинг. Изменять/поглощать чужую сохранённую башню можно при включённом общем управлении либо по одноразовому запросу её владельцу. Черновую пятёрку завершает только её владелец. Это предложенная защита для веба; оригинальное общее управление шире.

Общее золото — один ledger, не копии суммы у каждого. Потратить его может разрешённая роль в пределах лимита; дорогое командное действие показывает расход и получателя до принятия. Выбор стратегии хранения владельцев и общего управления фиксируется в лобби. Нельзя продавать союзнику способность незаметно поглощать чужие результаты.

Пропорциональная сложность

Для нового coop-proportional-v1 стартовое предложение: HP(P)=soloHP * P; скорость, число врагов, жизни и штрафы за пропуск остаются solo. С каждымP команда получаетP результатов пятёрки, поэтому это понятная стартовая пропорция, не доказанный окончательный баланс. Ауры/общие рецепты усиливают синергию; проверить 1/2/3/4 сценариями одинакового уровня игроков. Нельзя затем незаметно добавить ещёP к count и speed.

Оригинальная нелинейная таблица — отдельный coop-classic2-v1, со своим рейтингом и контентными условиями. В правилах матча отображать название профиля и действующие коэффициенты. Размер команды входит в ключ лидерборда.

difficultySlots фиксируется на старте матча. Disconnect не уменьшает сложность и не даёт переиграть более лёгкую волну. В casual до начала следующей волны возможна явная пересборка состава с новым difficulty profile; такой матч получает rosterChanged=true, не сравнивается с неизменным ranked-составом. Игровой hotjoin в ranked после старта первоначально запрещён; зритель может войти отдельно позднее.

Уход, восстановление, зависшая готовность

Предложение:90 сек grace для возвращения. Во время боя сервер продолжает ход. В стройке countdown готовности останавливается на ограниченное окно восстановления, а не навсегда. Если игрок не вернулся: разрешённая передача его управления союзнику; незавершённую пятёрку завершить по заранее выбранной детерминированной политике с записью autoResolve. Не тратить общее золото автоматически. Повторный вход восстанавливает slot, draft и права; не создаёт второго участника.

Grace/pause — параметры ruleset. В ranked выход не возвращает расход/вклад и не уменьшает сложность; умышленный выход фиксируется отдельно от технического обрыва. Если все отключились — хранить комнату ограниченное время, затем завершить abandoned, не выдавая победу без игры.

5. Last Survivor: одинаковые условия и последний выживший

Два–четыре игрока, отдельные карты, одинаковые жизни/экономика/контент/seed/сложность. Нет отправки врагов или покупных помех в первой версии. Один серверный tick управляет всеми досками. Урон, золото и башни не смешиваются между досками.

Камни генерировать потоком (matchSeed, wave, playerDraftOrdinal, drawSlot), одинаковым для всех игроков; не общим изменяемым RNG, где порядок чужих кликов съедает броски. Волновые варианты/элита тоже одинаковые по wave/spawnOrdinal. Позиция постройки не должна менять бросок. Приватные предстоящие камни не рассылать противникам.

Темп ranked: общие раунды. Стройка имеет заранее объявленный лимит (предложение 60 сек с доступным casual-вариантом без спешки), все готовы могут сократить ожидание. Бой стартует одновременно. Новая волна после завершения текущей на всех живых досках; быстрая очистка не даёт лишнюю пятёрку раньше других. На стройке по timeout — объявленный deterministic auto-resolve без бонусной переброски. Уточнить UX на телефоне до включения рейтинга.

Игрок выбывает при lives≤0 либо подтверждённой сдаче. Последний живой выигрывает сразу. Если несколько последних погибли в одном server tick, фиксировать sharedPlace/ничью, а не порядок обработки слотов или ping. Предыдущие места — по eliminatedTick, одновременное выбывание даёт общее место. Кампания 50 не завершает соревнование, пока живы несколько: они переходят в endless.

Если правила endless или технический лимит не позволяют определить победителя, матч получает draw/technical_limit; не выдумывать победителя по донату или случайному порядку. Сданный слот не возрождается после reconnect. После выбывания доступны итог и наблюдение за оставшимися с ограничением приватных данных. Защита от затягивания — серверный таймер стройки и версионированный enrage, не скрытое увеличение угрозы одному игроку.

6. Надёжность и эксплуатация

Единственный активный writer комнаты имеет lease+epoch; устаревший процесс не пишет события после восстановления. Долговечный checkpoint на границе волн и стартово каждые 5–10 сек боя, между ними журнал принятых команд и значимых событий. Snapshot содержит все RNG-состояния, очередь spawn/projectiles/statuses и время, но не визуальные GLB. При падении восстановить checkpoint и replay до подтверждённой границы; результат дублироваться не должен.

Сервер не подтверждает durable-команду как окончательно сохранённую до записи журнала; видимое принятие вRAM и гарантированное сохранение — разные ack. При потере неподтверждённого хвоста клиенты получают recovering и новый epoch. Не обещать нулевую потерю без теста отказа хранилища.

Проверять лимит частоты команд, размер координат/чисел, допустимые enum, последовательность, права slot, Origin/соединение и срок билета. Комната получает короткоживущий одноразовый join ticket от API. Секреты не писать в replay/log. Клиентский fps и local clock не влияют на исход. Предусмотреть отдельную очередь unrated для отладки, bots не попадают в обычный рейтинг.

Цели первого измерения: p95 tick<20 мс при бюджете 33.3 мс, p99<33 мс; при превышении — уменьшать число комнат на worker, а не замедлять отдельного соперника. Проверять RTT50/150/300 мс, jitter,1–5% потерь, мобильное сворачивание, обрыв 30/90 сек, медленный клиент. Канал планировать стартово до 50KB/s down на игрока,5KB/s up; это цель нагрузочного теста, не измеренное обещание.

Метрики: tick lag, route calculation time, event queue, memory/room, reconnect success, result finalization lag, command rejection, snapshot duration. Алерты на зависшую волну/невозможный баланс/двойной lease. Масштабирование по room count и нагрузке, draining при обновлении: новые матчи идут на новую версию, старые завершаются на своей.

7. Пакеты работ и приёмка

IDПакетОбязательная проверка
N1Порты чистого ядра и протоколаNode и browser дают одинаковый hash после журнала
N2Серверная solo-комнатаКлиент не может прислать себе золото/HP/рейтинг
N3Co-op2, затем 4Одна клетка/общий расход/разные пятёрки/согласованный синтез
N4Ready/отключение/reconnectНикто не блокирует навсегда; слот не дублируется
N5Snapshot+replay+failoverKill worker в бою: восстановление и ровно один результат
N6Last SurvivorОдинаковые броски независимо от кликов; общий tick; ничья последнего tick
N7Нагрузочная сессияЗаявленный лимит одновременных комнат измерен, записаны конфигурация и p95/p99
N8Границы доверияFuzz-команды/повторы/чужой owner/истёкший ticket отклонены

Нельзя принимать онлайн по скриншоту четырёх вкладок. Нужны независимые клиенты, искусственные задержки, перезапуск сервера и проверка журнала/итогов.

Скачать этот раздел · Markdown

Статистика, рейтинги, история и сезоны

Статус: обязательный будущий объём. В прототипе нет глобальной статистики. Ни клиентское сохранение, ни только нынешний счётчик kills не являются готовой основой рейтинга.

1. Разделить понятия

Качество минерала — стадии 1–6. MVP-усиление башни — отдельные 0–10 уровней оригинала. Рейтинг игрока — результат соревнования. Уровень профиля/достижения — прогресс активности. Их нельзя показывать одним числом «грейд».

В исходнике DamageStat суммирует округлённый положительный входящий урон фильтра, обновляется примерно раз в секунду и сбрасывается по волне; это не подтверждённый lifetime effective damage. Co-op отправляет Level/Kills/TimeCost/Seed/Towers/Gold/MazeLength и другое, Race — DeathStack/Duration/Wave/Seed; MMR-формула внешнего backend неизвестна. Наша система ниже — самостоятельная спецификация.

2. Источник истины: серверные события

Общий envelope: eventId=(matchId,logicalSequence), leaseEpoch, schemaVersion, serverTick, type, actorId?, boardId, sourceEntityId?, payload. Идентификатор логического события стабилен при восстановлении и replay; новый leaseEpoch не создаёт второй экземпляр того же факта. Sequence не переиспользуется для другого факта. Авторитетный журнал команд/событий и финальный hash подписываются сервером. Публичный клиент присылает только запрос действия, не stats:add.

СобытиеКлючевые поляЗачем
MatchStarted/Endedmode, roster, versions, season, validity, reasonРазделить режимы и доказать итог
WaveStarted/Settledwave/cycle, lives, ticks, seed branchПрогресс, длительность и graph
EnemySpawned/Killed/EscapedenemyId, wave, killer, weightedScore, leakЧисло тел отдельно от очков
DamageAppliedrawDamage, mitigated, shieldDamage, hpLoss, overkill, damageType, attacker/ownerТочный фактический урон и причина
GoldCredited/DebitedledgerEntryId, amount, reason, balanceAfter, recipient/teamДоход, расходы, остаток без смешения
DraftGenerated/Resolvedfamily/quality/ordinal, choiceЧто выпало и что оставили
TowerCreated/Upgraded/Crafted/Removeddefinition, grade, owner, ingredientIds, outputEntityId, reasonКоллекция и история синтеза
MvpAwardedtower, levelBefore/After, waveУсиление отдельно от качества
ControlTransferred/PlayerDisconnectedold/new owner/control, causeКорректный вклад и история

Гостевую отладочную телеметрию не считать достижениями. Полные damage-события могут быть объёмны: хранить для replay/проверки в сжатых чанках, а обычные query обслуживать по агрегатам. Срок хранения полных логов — отдельная политика; долгоживущие проверенные итоги не исчезают вместе с детальным replay.

3. Как считать урон и командный вклад

Основной показатель урона = реальная потеряHP врага после защиты, capped егоHP перед событием. Урон щиту показывать отдельно. Overkill и rawDamage можно открыть в деталях, но не добавлять к основному. Регенерация даёт возможность повторно нанести effective damage: это допустимый боевой факт, но не свободные рейтинговые очки.

DoT хранит sourceTower/sourceOwner при наложении; поздний синтез/смена владельца не переписывает уже нанесённый урон. Для текущего остаточногоDoT политика lineage фиксируется ruleset. Исходная башня может исчезнуть, её статистическая запись остаётся. Один удар splash даёт несколько событий по разным врагам, а не двойной учёт одной потериHP.

Support: время замедления/снятия брони/ускорения башен и assisted damage показывать отдельными величинами с описанной методикой. Нельзя складывать «поддержку в процентах» и урон в одну сумму. Килл у последнего удара, assist у contributors; суммарное количество убитых команды не равно сумме kills+assists.

Co-op: результат прежде всего командный. Урон принадлежит владельцу атакующей башни в момент события; дополнительно сохраняется builtBy. Составной камень хранит авторов ингредиентов. Золото команды начисляется один раз; в личном экране отдельно «создано действий/нанесено урона/поддержка», а не копии общего дохода, которые потом ошибочно суммируются в 4 раза. Переход управления не меняет автора создания.

4. Какие срезы нужны

ЭкранОбязательные показатели
Во время игрыВолна/жизни/золото; компактная сводка команды, раскрываемая по нажатию: урон/поддержка/потери/готовность. У башни — качество, MVP, DPS текущего окна и суммарный effective damage
Итог матчаМесто/победа/clear/endless, причина завершения, версии/seed, длительность, очки, золото earned/spent/final, урон, kills/escapes, самые сильные башни, полная постройка и lineage
По волнамЖизни и утечки, заработано/потрачено, damage by type, лучший камень, длительность, изменения лабиринта
Личная историяФильтры режима/сезона/сложности, последние матчи, лучшие результаты, коллекция и прогресс
За всё времяМатчи/wins/clears, лучшие волны, золото заработано/потрачено, урон, построенные/созданные минералы по видам/качествам, MVP, время игры
ГлобальноОтдельные таблицы навыка, рекордов, очков, золота, урона и коллекции с объяснением способа подсчёта

На телефоне не держать всё открытым. В матче компактный счетчик/иконка → sheet со списком; закрытие возвращает максимум площади полю. Графики в итогах, не поверх пути врагов. Интервальные показатели обновлять 1–2Hz, не перестраивать таблицу каждый render.

Для башен хранить отдельно: draftedCount, keptCount, createdByCraftCount, upgradedCount, peakConcurrent, finalCount, damage. РецептA+B→C увеличивает craftedC и расходует ингредиенты, но не стирает исторические keptA/keptB. Повторный swap не считается новой постройкой. Самый высокий грейд не заменяет распределение всех шести.

5. Очки и разные виды рейтинга

Нельзя смешивать в один главный рейтинг вложенные деньги, длительность игры и соревновательный навык. Нужны разные вкладки.

  1. Рекорд кампании/бесконечности: отдельный ключ(mode,ruleset,map,difficulty,P,season). Сравнение сначала по очищенной волне, затем remainingLives, затем меньшим combatTicks при одинаковом прогрессе. Предел/тайбрейк объяснены публично; время меню/паузы не награждает.
  2. Last Survivor skill: места и состав соперников, рейтинг до/после и неопределённость. Предложение — отдельная серверная версия модели навыка для многопользовательских мест; подобрать по симуляции, не копировать неизвестную формулуDota. До выбора модели ранняя beta имеет только места и win rate, без выдуманногоMMR.
  3. Очки партии: предварительная прозрачная формула 100*clearedWaves + 500*campaignClear + sum(weightedKills) - 10*leakDamage, не ниже 0. Это проектный старт и scoreVersion, не оригинальные очки. Endless-очки только в своей таблице; окончательную формулу заморозить перед сезоном. Золото/урон не добавлять прямо к skill.
  4. Накопительные таблицы: total effective damage, goldEarned, crystalsCrafted, highestGrade, clears. Это статистика активности, не доказательство мастерства. Отдельно показывать лучший один матч/среднее/всего и достаточную выборку.

Кумулятивный endless можно фармить регенерацией и временем; поэтому для глобального total хранить признак rankedVerified и режим, а награды ограничивать правилами сезона. Матчи с отладкой, custom mod, guest tampering, bots или платным усилением не попадают в основной skill-board. Разные размеры co-op не конкурируют в одной таблице.

Разрешённый неизменный seed-челлендж имеет отдельную таблицу. При равенстве всех публичных критериев — одинаковое место, стабильная внутренняя сортировка лишь для пагинации. Нельзя тайно использовать email/возраст аккаунта для выигрыша тайбрейка.

6. Хранение и надёжная агрегация

Таблицы: matches, match_players, match_boards, match_wave_stats, match_tower_stats, tower_lineage, gold_ledger, result_events, player_aggregate, player_gem_aggregate, ratings, rating_history, seasons, season_memberships, leaderboard_entries, outbox. PK/FK, unique(matchId,resultVersion), unique(eventId), индексы поplayer/mode/season/date; сырой журнал — chunk storage с checksum.

Finalizer в одной транзакции проверяет завершённость, записывает неизменяемый результат+outbox. Projector читает outbox с повторами; unique projectionKey не позволяет удвоить lifetime. Это доставка at-least-once с идемпотентным применением, не магическое «ровно один раз» сети. Агрегаты восстанавливаются из версионированных результатов; итог матча не меняется при переименовании игрока.

Схема статистики не требует храненияemail в матчах. Публичный профиль содержит только разрешённое пользователем имя/id/статистику. Скрытый профиль, удаление/обезличивание и экспорт должны иметь описанную политику; отдельно хранить необходимые финансовые записи. Не публиковать IP/сессионные данные.

API: GET /me/stats, /me/matches?cursor, /matches/:id, /matches/:id/waves, /matches/:id/towers, /leaderboards?mode&season&metric&cursor, /players/:publicId. Cursor-пагинация, ограничения range/limit и доступ к чужому приватному матчу. В ответах — dataFreshness, metricDefinitionVersion, counts, notAvailableReason. До агрегации показывать «результат обрабатывается», не нули вместо потерянной статистики.

7. Сезоны

SeasonConfig: id/name, startAt/endAtUTC, allowedRulesetHashes, modes, mapPool, seedPolicy, modifiers, rankedEntitlementsPolicy, qualification, scoringVersion, rewardTable, status(draft/published/active/frozen/settled/archived).

Матч получаетseasonId на старте. Партия, начатая до закрытия, завершает старые условия в ограниченном grace-window, например 2 часа; более длинный endless сохраняется в lifetime/режимный рекорд, но не бесконечно задерживает награды. Это предложение, которое нужно явно опубликовать до сезона. Новый патч баланса не меняет уже запущенную комнату. Существенный хотфикс открывает новую категорию или прекращает ranked-вход, не перемешивает результаты.

Рейтинговый reset/soft reset, placement-матчи и награды описывать публично. Lifetime-коллекция и купленная косметика сохраняются; сезонные места архивируются с правилами/версией. Новые условия сезона не означают переписать историю старого. Награды — один grant с ключом(season,player,reward), повтор settlement безопасен, отмена имеет аудит.

8. Задания и приёмка

S1 — определения метрик и golden fixtures: удар по 1HP на 100damage учитывает 1effective,99overkill; poison/splash/shield/regen проверены. S2 — серверный ledger/lineage: синтез не стирает прошлый вклад, swap не добавляет созданный камень. S3 — live UI и итоги на телефоне. S4 — durable finalizer/outbox,10 повторов одного результата дают один вклад. S5 — lifetime/публичные рейтинги, rebuild из событий равен сохранённым агрегатам. S6 — seasons: матч на границе, sharedPlace, возврат награды, повтор settlement, смена правил. S7 — злоупотребления: подкрученный localStorage, повторresult, необычный урон, сговор/фарм помечаются и не меняют основной рейтинг без серверной валидации.

Скачать этот раздел · Markdown

Профиль по почте и будущие покупки

Статус: профиль и сессии реализованы на локальном сервере. Настоящая почтовая доставка, публичный сервер, магазин и списание денег ещё не подключены. Платёжные кнопки нельзя показывать как работающие до завершения всего контура.

1. Регистрация, вход и гость

Требование пользователя трактуется так: числовой код приходит на email, телефон не нужен. Экран 1: почта и «Получить код». Экран 2: ввод кода с возможностью исправить адрес/повторить отправку. Экран 3: игровое имя и пароль. После завершения пользователь возвращается к игре; повторная регистрация при каждом входе не нужна.

Обычный последующий вход — email+пароль, восстановление — подтверждение владения почтой и новый пароль. Можно позже добавить passwordless-вход кодом как отдельный способ, но не смешивать его незаметно с созданием нового аккаунта. Почтовая проверка не является вторым фактором для уже существующего passwordless-входа.

Сохранить «попробовать без регистрации» для offline/casual. При создании профиля предложить привязать локальную тренировочную историю и настройки: проверенные серверные матчи сохраняются, произвольные клиентские рекорды помечаются unverified и не идут в рейтинг. Регистрация не должна прерывать текущий локальный бой. Для ranked и оплаты email должен быть подтверждён.

2. Состояния, безопасность и почта

Аккаунт: pendingVerification → pendingOnboarding → active; отдельные suspended/deletionRequested/deleted. Email хранить приватно, publicId отдельно. Исходный адрес и каноническое сравнение не путать: не удалять точки/плюс по догадке и не склеивать разных людей по особенностям одного провайдера. Политику одинаково применять к signup/login/reset/change-email. Проверка письма и ограничения повторов опираются на OWASP Email Verification.

Предлагаемые исходные лимиты:6-значный криптографически случайный код, TTL10 мин,5 попыток на challenge, повтор отправки не чаще 60 сек и до 5/час на адрес; отдельные IP/device/global limits против спама. Значения конфигурируемые и проверяются на доставляемости. Код привязан кpurpose, email, challengeId; старый код аннулируется при повторе, успешный consume атомарен. Сохранять HMAC кода с серверным секретом и challengeId, не открытый код и не простой быстрый hash шестизначного пространства. Не логировать код, пароль, session cookie и email целиком.

Ответ на запрос регистрации/сброса нейтральный, не выдаёт наличие аккаунта постороннему. Проверенный signup challenge может завершить только создание своего нового профиля; существующему аккаунту нельзя сменить пароль через этот маршрут. Recovery имеет отдельныйpurpose и отзывает предыдущие сессии согласно политике.

Пароли: поддержка менеджеров и вставки, без обязательных спецсимволов/периодической смены; минимум 15 символов при одном факторе, разрешить длинные фразы и как минимум 64 символа, проверять известные скомпрометированные пароли. Хранение — проверенная библиотека Argon2id или управляемый identity provider с подходящим контрактом; параметры выбрать и измерить по актуальным рекомендациям. Не писать собственную криптографию. Базовые требования к ошибкам, TLS, повторной аутентификации и паролям: OWASP Authentication, Password Storage.

Сессия в Secure+HttpOnly+SameSite cookie, CSRF/Origin-проверки для изменений; срок, rotation и отзыв хранятся серверно. Не держать долгоживущий bearer в localStorage. Короткоживущий join ticket привязан к конкретной комнате и слоту. Сменаemail/пароля/платёжных настроек требует повторного подтверждения. Экран «Устройства и выход со всех»; админ-доступ отдельно от игрока, с усиленной защитой.

Письма: отдельный отправляющий домен, SPF/DKIM/DMARC и bounce/complaint обработки через выбранный сервис. Очередь отправки не блокирует HTTP и игру. Статус доставки/недоступности показан честно; запасной resend без потери введённого адреса. В dev — локальный тестовый почтовый ящик, в production никакого вывода кода на экран. Проверить iOS/Android autofill one-time-code, русские/латинские имена и медленную сеть.

3. Данные профиля и API

Таблицы: users, email_identities, auth_challenges, credentials, sessions, profiles, profile_settings, guest_links, account_audit, consents. Пароль/почта изолированы от публичной статистики. Public profile: publicId, displayName, avatarCosmeticId, createdAt, privacy, selectedBadges; игровые lifetime/season данные запрашиваются из 22.

Никнейм — отображаемое имя, не ключ владения покупками/матчами. Сервер нормализуетUnicode, ограничивает длину, удаляет управляющие символы и опасную разметку; вывод всегда экранирован. Нужны жалоба/смена нарушающего имени и защита от выдачи себя за администратора. Уникальный короткий тег можно добавить отдельно; не раскрыватьemail ради различения одинаковых имён.

Настройки: звук/движение/графика/язык/доступность, приватность профиля, согласие на необязательные письма, косметика и избранные лабиринты. Графическое качество по устройству не синхронизировать слепо с мощногоПК на телефон. Игровая схема лабиринта — отдельный объект и не выдаёт сами башни бесплатно.

API-предложение: POST /auth/email/start, /auth/email/verify, /auth/onboard, /auth/login, /auth/logout, /auth/recovery/start, /auth/recovery/complete, /auth/password/change; GET /me, PATCH /me/profile, PATCH /me/settings, GET/DELETE /me/sessions, POST /me/export, /me/deletion-request. Все изменяющие операции имеют validation/rate limit/audit. Регистрацию аккаунта и перенос гостевой истории выполнять идемпотентно, повтор onboarding не создаёт второйuser.

Экспорт/удаление/восстановление, длительность хранения и правила несовершеннолетних зависят от стран запуска. До запуска подготовить политику приватности и условия; финансовые записи не обещать стирать вопреки обязательному хранению. Эти юридические настройки — отдельный этап перед публичной оплатой, не повод задерживать графическую работу.

4. Что в оригинале продавалось или усиливалось

Подтверждённые факты и цены внутри матча:

ВозможностьЧто найденоЧто не подтверждено
Swap/yixinghuanweiОбмен двух позиций, золото 300/225/175/150 за каст по уровню способностиКвота бесплатных переносов и докупка за реальные деньги
Adja-Swap/qingyiОбмен башни с соседним обычным камнем, золото 200/140/100/80Безошибочность всех owner-проверок в runtime
xuanfengКруговой сдвиг восьми соседних объектов, золото 200/125/75/50Прямая денежная цена
huidaoguoquПовторить незавершённую текущую пятёрку, золото 600/500/400/300Это не перенос оставленного камня и не бесплатныйreroll
Герои/способности/эффекты/игрушки/курьеры/коробкиPurchase handlers → внешний /game/.../buy, товар поGoodsIdАссортиментные цены, возвраты, реальный платёжный оператор
ПитомцыЕсть влияющий на уронpet_buff: ранги до суммарных 12 дают 2–50%; co-op складывает бонусы игроковНельзя считать магазин исключительно косметическим
ПрофильSteam/session, shell/ice/candy, сохранение героя и схем лабиринтовНаш email-вход не готовое свойство оригинала

В старом приложении обычный камень мог давать возврат ценыSwap; в 2.0 найденный обработчик этого не делает. Справка старого UI о месячных сезонах/коробках/наградах — свидетельство текста, а не доказанная работа нынешнего backend. Полный аудит — future-audit/economy-stats.md; не публиковать чужие серверные URL/секреты в приложении.

5. Что можно сделать платным

Рекомендация первой монетизации: косметика и удобство вне боевого преимущества. Это предложение, а не уже принятое ограничение пользователя.

ВариантПользаРекомендация
Оболочки строителя-шара, шлейфы, эмоцииЛичная выразительность без нового скелетаПервый набор; лимит частиц и reduced motion
Темы внешнего острова/воды/пьедесталовНовый облик утверждённого мираХорошо; не менять коллизию, обзор врагов и контраст
Альтернативные косметические огранки/снарядыПриятная кастомизацияСохранять family/grade читаемыми; не закрывать путь
Аватары, рамки, профильные витрины/титулыЦенность вне бояПодходит, рейтинг не продаётся
Дополнительные слоты сохранённых схемУдобство организацииБесплатных слотов достаточно для обычной игры; в ranked схема лишьподсказка
Косметический сезонный пропускТематические наградыФиксированный список, без усиления урона/удачи
Поддержка проекта/комплект основателяПонятная добровольная покупкаЧёткая выдача, без скрытых игровых бонусов
Дополнительные переносы/переброскиСильное влияние на лабиринт и удачуТолько отдельный явно casual/custom режим; для ranked одинаковые лимиты и стоимость для всех
Платный урон, качество выпадения, жизни, питомцы с боевым бонусомПрямое преимуществоНе рекомендую для общего рейтинга и первого магазина

Если пользователь позже выбирает боевые покупки, включать их только в отдельный ruleset и таблицу, раскрывать условия лобби и co-op-команде до старта. Купленный перенос не должен изменять уже начатую ranked-партию. Бесплатная внутриигровая возможность перемещения за золото доступна всем по одинаковым правилам; выбор точного лимита/цены — баланс после аудита, не платёжная механика.

Не начинать с платных случайных коробок: фиксированные наборы проще объяснить, тестировать и поддерживать. Редкие визуальные предметы не должны стоить дополнительных draw calls без лимита. Не назначать реальные цены до выбора страны, валюты, аудитории и стоимости обслуживания.

6. Платёжный контур, который подготовить заранее

Изолировать три экономики: золото текущей партии, мета-прогресс аккаунта, реальные денежные заказы. Их балансы не являются одним полемgold. Сначала можно продавать фиксированныеSKU напрямую без виртуального кошелька.

Таблицы: products, prices, orders, order_lines, payment_attempts, provider_events, entitlement_grants, entitlement_revocations, refunds, commerce_audit. SKU/версияцены/валюта/налоговыйконтекст и snapshot описания фиксируются в заказе. Entitlement содержит itemId, accountId, sourceOrderId, validFrom/until, rulesetRestrictions, status; сервер проверяет доступность, клиент не выдаёт себе предмет флагом.

Поток: клиент выбираетSKU → сервер создаёт заказ по своей цене → hosted checkout провайдера → webhook с проверкой подлинности → транзакционное сохранение события/выдачи → клиент получает обновлённый профиль. Страница «оплачено» и redirect сами по себе не выдают предмет. Повтор webhook/вызова/таймаута не создаёт вторую выдачу: unique(provider,eventId) и unique(orderLine,grantType). Обрабатывать out-of-order сообщения через актуальное состояние заказа.

Проверка подписи по исходному телу, повторы и тестовый контур документированы, например, в официальной документации Stripe webhooks. Это архитектурный пример, а не выбранный оператор или утверждение о его доступности пользователю. Провайдера выбирать по стране юридического лица, валютам и способу запуска; подключениеsandbox предшествует любым реальным списаниям.

Возврат/chargeback создаёт revoke соответствующей косметики; история матча и честно заработанный рейтинг не переписываются. Расходуемые платные действия требуют отдельной политики возврата/неиспользованного остатка и поэтому не входят в первый магазин. Для подписки предусмотреть отмену/истечение/grace/неуспешное продление, не хранить карты на нашем сервере. Панель поддержки показывает заказ/выдачу/возврат без доступа к игровым паролям.

7. Пакеты работ и критерии

IDРаботаПриёмка
P1Identity schema и тестовая почтаОдин код нельзя применить дважды; адрес/назначение не подменяются
P2Регистрация/вход/recoveryПросроченный код, 5 ошибок, resend, существующая почта, потеря сети, повтор формы
P3Сессии и безопасностьLogout-all, смена пароля, CSRF, чужой профиль, join-ticket replay
P4Профиль и guest-linkПеренос не создаёт ranked-рекорд из localStorage; покупки не привязаны к nickname
P5Entitlements без оплатыТестовый grant/revoke, разрешённые режимы, совместимость устройств
P6Провайдер sandboxВерная/неверная подпись, дубликат, неупорядоченные события, таймаут, возврат
P7Готовность запуска магазинаВыбраны оператор, страны, цены и правила возврата; работает поддержка; нет купленной силы в общем ranked

ДоP7 не запрашивать у игрока реальные платёжные данные и не выдавать тестовый checkout за действующий магазин.

Скачать этот раздел · Markdown

50 предложенных форм противников

Это производственная раскладка, а не готовые модели. У каждого номера свой финальный силуэт. Общие скелеты допустимы; источники и лицензии выбираются при производстве. Названия — авторское арт-направление, свойства ground/fly взяты из аудита.

Скачать реестр JSON

ВолнаФормаСилуэтДвижение / размер
1Лесной поросёнокКомпактное округлое тело, короткая щетина, два маленьких клыкаЗемля · 0.35 клетки
2Прудовая квакшаНизкая широкая посадка, крупные задние лапы, короткие прыжкиЗемля · 0.375 клетки
3Горный телёнокКоренастый маленький четвероногий, шерстяная чёлка, короткие рогаЗемля · 0.4 клетки
4Песчаный многоногТонкое сегментированное тело, шесть быстрых ног, гибкие усикиЗемля · 0.425 клетки
5Луговой мотылёкДва крупных листовидных крыла, короткое мягкое брюшко, спокойный полётПолёт · 0.45 клетки
6Жук-щитоносецОвальный панцирь, шесть отчётливых лап, приподнятые передние надкрыльяЗемля · 0.475 клетки
7Мшистая ящерицаДлинный низкий хвост, четыре лапы, зубчатый мягкий гребеньЗемля · 0.5 клетки
8Сумеречный ёжПлотный колючий купол и видимый нос; прозрачность обозначает невидимостьЗемля · 0.525 клетки
9Пятнистый лисёнокУзкая морда, большие уши, длинный хвост, пружинистая походкаЗемля · 0.55 клетки
10 · БОССВепрь — хранитель тропыПервый крупный босс: тяжёлые плечи и изогнутые парные клыкиЗемля · 0.95 клетки
11Вересковый баранОбъёмная шерсть, два спиральных рога и высокий загривокЗемля · 0.55 клетки
12Медоносный барсукШирокая низкая спина, контрастная полоса, заметные когтиЗемля · 0.575 клетки
13Лесная зайчихаОчень длинные уши, вытянутая линия спины, крупные задние ногиЗемля · 0.6 клетки
14Черепаха с папоротникомВысокий ребристый панцирь, короткая шея и четыре опорные лапыЗемля · 0.625 клетки
15Шмель-стражТри мягких сегмента, четыре небольших крыла, обрамление из пыльцыПолёт · 0.65 клетки
16Проворная куницаГибкая вытянутая спина, хвост-крюк, маска на мордеЗемля · 0.675 клетки
17Хохлатый бегунНаземная птица, длинные голени, веер-хохолок, сложенные крыльяЗемля · 0.7 клетки
18Теневой тапирСильная арочная спина, короткий хоботок и парные светлые меткиЗемля · 0.725 клетки
19Длинноногий тушканПочти вертикальные большие уши, тонкий балансирующий хвостЗемля · 0.75 клетки
20 · БОССРогатый лесной оленьБосс: высокая шея, широкая грудь, сложная корона ветвистых роговЗемля · 1.25 клетки
21Когтистый рапторДвуногий хищник с горизонтальным хвостом и серповидными когтямиЗемля · 0.7 клетки
22Броненосец-кольценосецМассивные перекрывающиеся ленты панциря и тяжёлый хвостЗемля · 0.725 клетки
23Клювастый варанПлоская голова с костным клювом, крупная чешуя, низкие лапыЗемля · 0.75 клетки
24Рогатый носорогНаземная тяжёлая форма, один высокий носовой рог, пластинчатые складкиЗемля · 0.775 клетки
25Небесный скатПарящие широкие грудные плавники и длинный тонкий хвостПолёт · 0.8 клетки
26Пламенный василискНаземный бегун, веер на затылке, перьевые полосы на хвостеЗемля · 0.825 клетки
27Лунная стрекозаЧетыре длинных отдельных крыла, узкое расчленённое брюшкоПолёт · 0.85 клетки
28Крылатый богомолВысокий грудной сегмент, хватательные передние лапы, жёсткие надкрыльяПолёт · 0.875 клетки
29Парящий грифонКрупные крылья, кошачьи задние лапы и заметный крючковатый клювПолёт · 0.9 клетки
30 · БОССГрозовой скат-маткаЛетающий босс: многолопастные плавники и корона из гибких усовПолёт · 1.55 клетки
31Гребнистый дракончикНаземный тяжёлый четвероногий с длинной шеей и закрытыми крыльямиЗемля · 0.85 клетки
32Береговой акулозаврНаземное фантастическое существо с акульим плавником и четырьмя опорамиЗемля · 0.875 клетки
33Панголин-прыгунВертикальные чешуйные пластины, мощные задние лапы и кольцо хвостаЗемля · 0.9 клетки
34Золотокрылый ибисДлинный изогнутый клюв и узкие крылья, ноги поджаты в полётеПолёт · 0.925 клетки
35Серебряный рогокрылПарные длинные рога, кожистые крылья, раздвоенный хвостПолёт · 0.95 клетки
36Лиственный кабан-гигантВысокий щетинистый хребет и тяжёлые передние лапы, листовые ушиЗемля · 0.975 клетки
37Белый саблезубСильный кошачий торс, два длинных зуба и короткий хвостЗемля · 1 клетки
38Лунный волкВысокие лапы, вытянутая грудь, полумесяц шерстяной гривыЗемля · 1.025 клетки
39Небесная медузаПрозрачный колокол, крупные свисающие ленты и отчётливое светлое ядроПолёт · 1.05 клетки
40 · БОССДревний наутилусЛетающий босс: большая спиральная раковина и несколько тяжёлых щупалецПолёт · 1.85 клетки
41Лазурный саламандрНаземный драконовый силуэт, рога-плавники и две гряды на спинеЗемля · 1 клетки
42Павлин-буревестникШирокие раскрытые крылья, веерный хвост и тонкий венецПолёт · 1.025 клетки
43Панцирный речной котКрупные усы, округлый торс, широкие лапы и спинные защитные щиткиЗемля · 1.05 клетки
44Грибной ходокБольшая асимметричная шляпа, четыре корневые ноги и кольцо спорЗемля · 1.075 клетки
45Хор небесных колоколовОдна модель существа из трёх соединённых живых колоколообразных куполовПолёт · 1.1 клетки
46Рогатый бизон-титанОчень мощный загривок, низкая голова и поперечные защитные рогаЗемля · 1.125 клетки
47Корневой древостражНаземная четырёхопорная живая коряга с арочным торсом и ветвистым венцомЗемля · 1.15 клетки
48Эфирный осьминогЛетающее существо, высокий головной купол и восемь раздельных плавных рукПолёт · 1.175 клетки
49Солнечный дронтБольшая наземная птица, тяжёлый клюв, широкая грудь и гребень-пламяЗемля · 1.2 клетки
50 · БОССНебесный левиафанФинальный летающий босс: сводчатое тело, парные лопасти и корона длинных роговПолёт · 2.15 клетки