САД САМОЦВЕТОВ · ДОРОЖНАЯ КАРТА
От красивого прототипа
к полноценной игре
Четыре обязательных направления: 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 сам не запускает сетевые комнаты. Обновление публикации фиксируется отдельно от локальной готовности.
Понятный цикл соревнования
- Создатель выбирает «Последний выживший» в профиле и приглашает соперников по ссылке. Для запуска нужны2–4 подключённых участника, готовность каждого и запуск создателем. В процессе новые участники не присоединяются.
- Каждый получает собственное одинаковое поле37×37 с исходными одиночными булыжниками. Золото, опыт, жизни, башни и пятёрка полностью личные. Нельзя потратить камни или деньги другого игрока.
- На общий строительный ход даётся60 секунд игрового времени. Каждый ставит пять камней, выбирает результат и подтверждает готовность. Если все готовы раньше, начинается общий отсчёт3 секунды.
- По истечении срока сервер завершает незаконченный ход без покупок и сохраняет первый камень. При полностью занятом поле оставшиеся новые камни превращаются в булыжники, новый самоцвет не создаётся. Проверка пути не обходится.
- Все начинают одну волну одновременно. Быстрее закончивший игрок ждёт остальных; следующий строительный ход открывается всем оставшимся вместе. Пока поле ждёт, менять его нельзя. Это исключает дополнительную стройку во время чужой текущей волны.
- Побеждает последний оставшийся сад. Сервер сначала рассчитывает все поля одного игрового тика и только затем определяет выбывание. Последние участники, погибшие в одном тике, получают ничью без назначенного победителя. Группа одновременного выбывания делит одно место.
- Если после50 волн осталось несколько игроков, соревнование автоматически продолжается в бесконечном режиме. Отдельного голосования нет. Камни, ресурсы, MVP и факт прохождения кампании сохраняются. Технический предел завершает матч без победителя.
Что означает «одинаковые условия»
Профиль 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 без ошибок. Браузерные сценарии и осмотр скриншотов выполнялись отдельно.
- Лобби2–4, отдельные поля и отсутствие чужих башен/событий в персональном представлении.
- Одинаковые базовые выпадения при разном порядке действий, неудачной постановке, молитве и оплаченных повторах. Независимый бросок понижения качества.
- Общий строительный срок, автоматическое завершение, готовность и неотодвигаемый повторным нажатием отсчёт.
- Одинаковые варианты/награды/штрафы противников, ожидание быстрого сада, общий следующий раунд.
- Реальные одновременные пропуски противников с ничьёй, одинаковый результат при перестановке порядка игроков, группы одинаковых мест и один оставшийся победитель.
- Переход50→51, отдельный пропуск пятёрки, восстановление всех полей и выбывших слотов, техническая остановка без победы.
- Настоящие HTTP/WebSocket-соединения четырёх участников, переподключение того же слота, транзакционный откат всех полей после отказа записи, защита от команды прошлого хода и один общий/четыре личных результата.
- Четыре независимых браузерных профиля: приглашение, лобби, двадцать камней, одинаковая первая пятёрка, по одной собственной башне, общий бой, переподключение и показ победителя. Финал проверен сдачей трёх тестовых участников, а не стратегическим прохождением.
- Окна на320×568,390×844,844×390 и1440×1000 без горизонтального переполнения. Это не измерениеFPS настоящего телефона.
Дальше по плану
- Сводная и сезонная статистика: разные режимы и размеры команды отдельно; личная экономика и общий кошелёк co-op не суммируются одинаково. История минералов, авторы ингредиентов и вклад поддержки пока неполные.
- Рейтинг и сезоны: учитывать только проверенные серверные матчи; сначала аудит случайности, правила отказов и одинаковых мест, полноценная база, нагрузка и эксплуатационное восстановление. До этого рейтинг выключен.
- Настоящий интернет-сервер и почта: размещение, домен/HTTPS, подтверждённый отправитель, резервные копии и восстановление, несколько процессов, мобильные задержки и лимиты комнат. Подготовленные файлы размещения не означают выполненный запуск.
- Оставшиеся34 уникальные анимированные формы противников и проверка графики на настоящих устройствах. Утверждённые иллюстрации и внешний вид острова не менялись.
Коммерческие функции и платежи на этом этапе не добавлялись.
Скачать описание этапа · Инструкция запуска сервера
0.9.0 — одна карта для команды
Статус на 10 ноября 2026: совместная игра для 1–4 игроков реализована и проверена на локальном сервере. В опубликованной версии Sites по-прежнему доступна одиночная игра в браузере. Для входа в команду через интернет ещё нужно разместить игровой сервер и подключить настоящую отправку писем. Скриншоты ниже получены в локальной проверке.
Что уже работает
- Создание команды, приглашение по ссылке, четыре места, имена и цвета игроков. Перед стартом все подтверждают готовность; создатель запускает матч. После старта состав фиксируется.
- Одно общее поле 37×37, один лабиринт, общий замок, жизни, золото, опыт хранителя и противники. У каждого игрока своя пятёрка, выбор и случайная последовательность камней.
- Повышение качества разрешено только внутри собственной новой пятёрки: два одинаковых камня дают +1, четыре дают +2. Камни союзника и сохранённые пары не используются для такого повышения.
- Сохранённые компоненты доступны для рецептов в любой активной фазе. При создании команды можно включить общее управление сохранёнными камнями. Без него чужие башни защищены от удаления, обмена и расходования в рецептах. Новые пятёрки всегда остаются личными.
- После выбора каждый отдельно нажимает «Готов». Когда готовы все, начинается общий отсчёт в три секунды. Снятие готовности или отключение готового игрока отменяет отсчёт. После волны автоматически начинается следующий строительный ход.
- На 50-й волне команда решает: завершить кампанию или единогласно продолжить бесконечный режим. Отказ от новой пятёрки в endless касается только камней самого игрока.
Управление на телефоне
Первое короткое касание свободной клетки выделяет её. Второе касание той же клетки или кнопка «Поставить» создаёт камень. Жесты перемещения и масштаба не строят. Это управление работает и в одиночной игре. При выделении карта сохраняет положение: появление и исчезновение карточки камня не сдвигают место второго касания.
Кнопка «Подсветить» отправляет союзникам цветную отметку с именем автора на шесть секунд. Она не ставит камень, не резервирует клетку, не расходует золото и не меняет следующие выпадения. Ограничение — одна отметка в секунду от игрока. Отметки находятся у основания объектов и перекрываются кристаллами по глубине.
Кнопка команды рядом с подсказкой волны показывает готовность союзников. Внутри доступны участники, подключения, готовность, фактически снятое здоровье врагов и убийства. Общие ресурсы показаны один раз. Книга, избранное, несколько целей рецептов и предпросмотр синтеза сохранены. Открытая книга не останавливает сетевой бой.
Сложность и соответствие оригиналу
Текущий профиль называется 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 игроков. Веб-версия выбирает подмножество утверждённых одиночных позиций. Точные координаты многопользовательских булыжников оригинала ещё не сверены; уменьшение поля не выполняется.
Отключения и восстановление
- Переподключение возвращает тот же слот, собственную пятёрку, башни, молитву, последовательность выпадений и подтверждённые команды. Заново платить или строить уже принятый камень не нужно.
- На стройке отключившийся игрок получает 90 секунд игрового времени. После этого сервер без покупок завершает его пятёрку и выбирает первый камень. При возвращении игрок снова управляет своим слотом. Автоматическая постановка ограничена по работе на один тик.
- Бой продолжается при потере связи; пауза и ускорение клиента отключены. При пяти минутах без подключений комната завершается как брошенная. Если кампания уже пройдена, этот результат сохраняется.
- Если создатель сдаётся, руководство передаётся оставшемуся участнику. Сдавшийся получает просмотр без права менять поле. В лобби можно выйти и вернуться; последовательность команд не обнуляется.
- После остановки процесса расчёт возобновляется из долговечного состояния. Пропущенное реальное время не догоняется. Это текущая политика восстановления обычной игры; рейтинговый режим пока выключен.
Сервер и результаты
Клиенты отправляют намерения. Сервер проверяет участника, ход, фазу, права, рецепт, деньги, занятую клетку и проходимость. Конфликтующие команды выполняются последовательно: на одну клетку создаётся только один камень. Состояние и подтверждение команды сохраняются одной транзакцией. Повтор сообщения не повторяет покупку или постановку.
У команды одна итоговая запись матча и отдельный личный отчёт каждого участника. Урон и убийства относятся к владельцу башни; общая экономика явно отмечена как командная. Она не суммируется как четыре независимых дохода. Результаты имеют статус server_casual. Глобальный рейтинг, сезоны, подробная история авторов ингредиентов и вклад поддержки ещё не готовы.
Проверено
- Правила собственного выбора, повышения качества, разрешений синтеза и обмена; независимость выпадений; гонка за клетку; готовность, таймер и пропорциональные HP.
- Возврат слота, выход и повторный вход в лобби, защита от команды прошлого строительного хода, откат после ошибки базы, запись одного командного результата и четырёх личных отчётов.
- Четыре настоящих авторизованных WebSocket-соединения через HTTP-сервис.
- В отдельном сценарии четыре независимых браузерных профиля: приглашение, лобби, двадцать камней, четыре выбора, подсветка союзнику, переподключение и общий запуск волны.
- Физические касания в браузере на мобильном размере: выбор без строительства, второе касание, следующий камень после закрытия карточки, замена исходного булыжника. Окна проверены на 320×568, 390×844, 844×390 и 1440×1000 без горизонтального переполнения.
- Полный жизненный цикл 50 волн для четырёх участников и голосование за endless проверены с принудительным уроном. Это не доказательство проходимости или баланса при обычной игре.
Следующие этапы
- Разместить сервер с HTTPS/WebSocket и полноценным PostgreSQL; подключить подтверждённого почтового отправителя. Проверить резервное восстановление, два процесса, задержки и нагрузку. Подготовленный Docker-контур ещё не проверен на настоящем размещении.
- Last Survivor: 2–4 отдельных одинаковых поля, общий отсчёт раундов, одинаковые условия выпадения, последнее выживание, корректная ничья и восстановление. Пока не реализован.
- Подробная общая и сезонная статистика, рейтинг, история сборок, авторы компонентов и вклад поддержки. Не принимать локальные сохранения как рейтинговые результаты.
- Довести набор до 50 разных анимированных противников. Сейчас есть 16 подготовленных форм; изменение размера и цвета не считается новой уникальной моделью.
- Проверить производительность на настоящих телефонах. Браузерная проверка на разных размерах экрана не является измерением мобильного FPS.
Уже утверждённые иллюстрации минералов, внешний вид острова и маршрут одиночной карты сохранены. Магазин и денежные платежи на этом этапе не добавлялись.
Скачать описание этапа · Инструкция запуска сервера
Серверная основа, профиль и одиночная сетевая партия
Промежуточный этап0.8.0,10 ноября2026. Полная дорожная карта остаётся открытой. Профиль и серверная партия работают в локальной проверке; подключение через интернет и настоящая доставка писем ещё не настроены. На Sites сохраняется локальная игра; экран профиля объясняет доступность без неработающих форм.
Что реализовано
- Один Node-сервер с тем же игровым ядром: клиент не рассчитывает бой, награды и случайные камни. Игрок отправляет намерение; сервер проверяет фазу, маршрут и средства.
- Одиночные серверные комнаты,30Hz расчёт и10Hz передача изменённых данных. Пауза/ускорение клиента выключены. Открытая книга и свёрнутая вкладка не останавливают бой.
- PostgreSQL-схема аккаунтов, сессий, кодов, почтовой очереди, комнат, участников, команд, билетов и результатов. Для локальных проверок Electric PGlite; полноценный PostgreSQL подключается тем же хранилищем через pg.
- Подтверждение почты шестизначным одноразовым кодом; имя и пароль после подтверждения; повторный вход; отдельное восстановление; список устройств и выход со всех устройств. Пароли Argon2id; сессии HttpOnly, CSRF/Origin. Реальные письма без настройки SMTP не отправляются.
- Серверный журнал с UUID команды и порядковым номером. Принятое действие, состояние и квитанция сохраняются одной транзакцией. Повтор команды возвращает прежний ответ, не строит/не списывает второй раз.
- Lease и возрастающий epoch комнаты. Старый писатель после передачи комнаты не может менять данные. Ошибка записи откатывает изменение и случайный поток; до переподключения действия блокируются.
- Одноразовый билет подключения, восстановление полного состояния и следующий номер команды. В сетевом представлении нет будущих RNG/seed/внутренних квитанций.
- История последних100 завершённых серверных партий. Сдача и явное завершение кампании записывают результат один раз. Все текущие результаты server_casual, без рейтинга и сезонных очков.
- Отдельный экран профиля в едином зелёно-золотом стиле. Возврат к локальной экспедиции, повторный вход в серверную партию и подтверждение сдачи. Серверная карта не перезаписывает локальное сохранение.
Что проверено
- Полный путь по настоящему HTTP/WebSocket: регистрация, сессия, CSRF, билет, постройка, повтор команды и отзыв доступа после выхода.
- Срок кода,5 неудач, повторная отправка, одновременное подтверждение, одноразовый grant, разделение регистрации/восстановления, отзыв старого пароля и сессий.
- Ошибки порядка и устаревшей карты; чужой владелец; неподдерживаемая команда; попытки передать золото/HP; отказ хранилища с откатом RNG.
- Смена writer/epoch. Отдельный тест реально убивает дочерний Node-процесс и открывает файловую PGlite заново. После истечения lease сессия/камень/подтверждённая команда восстанавливаются; сдача не дублирует итог.
- Интерфейс320×568,390×844,844×390 и1440×1000: нет горизонтального переполнения. Пять построек, выбор, ручной запуск волны, бой при открытой книге, возврат к локальной игре и повторное подключение.
Это не проверка FPS физического телефона, качества реальной SMTP-доставки, полномасштабного PostgreSQL или распределённого отказа нескольких машин. Смена часов на31 секунду в тесте не измеряет фактическое время восстановления.
Ближайшие работы по серверу
- Выбрать площадку и подтверждённого отправителя; настроить HTTPS и один origin для игры/API/WebSocket. На отдельный вопрос о существующем хостинге и почтовом сервисе ответа пока нет. Платная площадка и реальная почта автоматически не создавались.
- Проверить подготовленный Docker/Compose-контур с полноценным PostgreSQL, отдельной ролью приложения, резервной копией и восстановлением. Здесь Docker/psql отсутствуют; образы перед запуском закрепить проверенными digest.
- Проверить два независимых процесса с одной PostgreSQL, журнал и failover под задержкой/ошибками; не подменять это двумя объектами RoomService внутри одного процесса.
- Заменить консервативные частые snapshot на измеренный checkpoint+journal, определить время восстановления, draining и возобновление комнат после падения. Сейчас расчёт во время падения процесса заморожен до восстановления.
- Измерить p95/p99 tick, расход трафика,60 живых врагов и тяжёлые эффекты; затем выбрать число комнат на worker. Текущая техническая граница64 загруженных actor — защитный лимит, не измеренная производительность.
- Для ranked нужен серверный случайный поток с криптографическим ключом: общий32-битный генератор ядра пока остаётся в casual. Проверить правила и баланс, формулу очков и совместимость сезонов до включения рейтинга.
Дальнейшая очередь
- Co-op1–4: общая карта/сердце/кошелёк, отдельная пятёрка, владельцы и явное общее управление, готовность всех, фиксированная сложность по составу,90с восстановления и предсказуемое завершение оставленного хода. Не менять ограничения улучшений одинаковых камней вне текущей пятёрки.
- На этапе управления co-op вернуть согласованную двухэтапную постановку и пинг клетки. Эти небольшие правки были отложены пользователем; текущий одиночный ввод не изменён.
- Last Survivor2–4: отдельные37×37, одинаковые броски независимо от кликов, общий серверный раунд/лимит стройки, одновременный бой и честная ничья последнего tick, endless после50.
- Детальная статистика владельца/исходной башни/компонентов при синтезе; глобальные и сезонные проекции; отдельные ключи mode/ruleset/map/состав/season. Последние100 личных результатов ещё не являются глобальной статистикой.
- Разнообразие противников: сейчас16 анимированных форм; до50 уникальных остаётся34. Новые лицензии и реальная геометрия должны быть проверены до добавления. Новые50 моделей не заявлены готовыми.
- Изменение пароля из профиля с повторным подтверждением, отзыв отдельных устройств, привязка локальной истории с unverified-меткой, удаление профиля и поддержка — следующие расширения профиля. Сейчас пароль можно сменить через восстановление.
- Платежи и косметика остаются отдельным будущим контуром. Реальных списаний и купленной силы в ranked нет.
Файлы и эксплуатационные правила
Код находится в существующем проекте 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 без строительства.
Продолжение и результат кампании
- Продолжение выбирается явно на экране победы либо через меню карты. До выбора состояние победы не меняется. Сохраняются поле, башни, золото, опыт, ступени MVP и статистика.
- Результат кампании записывается отдельно: исходные правила, 50-я волна, жизни, золото, убийства и боевое время. Последующее поражение в бесконечности не переписывает его.
- Новая ветка начинается с 51-й волны и строительства. Можно раскрыть пять камней, выбрать результат, выполнить синтез и затем вручную запустить волну. Повторяются 50 семейств противников, включая летающих и боссов; абсолютный номер и цикл продолжают расти после 100/101.
- Прежняя партия v7 также может явно продолжить после победы. Её исходный профиль остаётся в записи кампании; для бесконечности инициализируется новая система вариантов с фиксированным воспроизводимым календарём. Это не скрытая замена волн незавершённого старого сохранения.
- Новые ступени MVP, согласно исходному пределу, выдаются до 50-й включительно. Накопленные уровни и MAX-ауры продолжают действовать дальше.
Рост угрозы и ограничения
Для абсолютного номера 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 пары. Варианты на всю волну имеют общий бюджет, но сохраняют разные способности.
- Обычное количество ограничено 30; исходная серия продолжает менять его внутри диапазона 5–30. У кампании v8 этот новый верхний предел не появляется.
- Дополнительная защита планировщика — максимум 60 одновременно живых противников на карте. При достижении предела ожидающий spawn остаётся в очереди, а не создаёт лишнюю модель.
- Рост базовой скорости ограничен +25% к соответствующему кампанийскому семейству. Ярость затянувшегося боя — отдельное правило и действует по-прежнему.
- Дополнительный рост обычных размеров ограничен; модель не увеличивается неограниченно вслед за HP. Используются существующие анимированные роли, без новых тяжёлых эффектов.
- Награда начинается с увеличения по циклу и имеет отдельные caps: обычные до 250 золота/XP, боссы до 1500 золота/3000 XP. Элитные и наградные преобразования применяются после этой базы. Золото остаётся валютой текущей партии; это не начисление в ещё не подключённый глобальный профиль.
Два условия каждого цикла
Выбираются два разных эффекта из четырёх: броня (+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 с рейтингами/сезонами. Настройки реального хостинга и отправки писем пока не получены, поэтому доступный сайт остаётся одиночным.
Скачать раздел · Markdown
Награды, сердце, защита и ослабляющие ауры
10 ноября 2026. Пакет 0.6.6 завершает ещё одну проверяемую часть боевых свойств. Новая система волн v8 и совместимость прежних сохранений сохранены.
Награды за убийства
- Египетское золото передаёт стрелковым башням в 800 исходных единицах ауру жадности. При убийстве — отдельные 5% получить десятикратное итоговое золото. Опыт не умножается. Несколько одинаковых источников не дают несколько бросков.
- Прибавка применяется после уже выполненных исходных преобразований элитной/боссовой награды. Босс с итоговой наградой 150 даёт при успехе 1500: его золото не делится второй раз из-за порога 100.
- Счастливый китайский нефрит передаёт ауру восстановления. Независимые 3% за убийство восстанавливают сердцу жизни по сохранённому урону прорыва врага; при отсутствии старого поля используется исходный fallback 1. Здоровье и максимальный запас могут превысить 100. Это не фиксированное лечение на одну единицу и не ограничение начальным максимумом.
- При наличии обеих аур проверки идут отдельно: жадность, затем восстановление. Опыт выдаётся самостоятельно. Ауры могут быть унаследованы Природным изумрудом; сам источник тоже получает свой эффект.
- Суммарное золото продолжает попадать в общий журнал полученного золота. Дополнительно отдельно учитываются срабатывания, добавочное золото и восстановленные жизни; они видны в статистике и JSON-отчёте. Заголовок карты обновляет здоровье сердца, сохранение восстанавливает новый максимум.
Защита башен
Красный коралл, Камень стойкости и Глубинная жемчужина дают стрелковым соседям защитный маркер в 600 исходных единицах. Реализовано подтверждённое по флагам взаимодействие с вражеской аурой обезоруживания: отмеченная башня не получает от неё новое обезоруживание.
Исходный chenmo не добавляет +100 MR, не снимает старые эффекты и не оглушает/не заставляет молчать врагов. Уже наложенный debuff не очищается. Прямое ответное обезоруживание идёт другим путём ApplyModifier и в текущем веб-контракте остаётся действующим. Нативное C++-поведение этого прямого пути не было объявлено доказанным универсальным иммунитетом.
Ослабление недревних противников
- Кварц и Счастливый китайский нефрит: в 600 исходных единицах броня −10 и скорость −250 единиц. Магически невосприимчивые цели не входят в исходный фильтр первой версии.
- Очаровательный лазурит: броня −10, скорость −250, параметр MR −40. Третий вариант у Золотого юбилея/Куллинана: броня −30, скорость −500, параметр MR −80. Эти два варианта допускают магически невосприимчивых, но не снимают сам иммунитет.
- Все три ауры имеют NOT_ANCIENTS. Новые противники сохраняют точный IsAncient из выбранного NPC. Нельзя применять эти эффекты ко всем наземным существам. В основной таблице наземные — древние, летающие — нет; фильтр всё равно проверяет тип, а не просто flight.
- Для прежних основных волн, сохранённых до появления поля, используется проверенное соответствие типу полёта. Отдельно проверен недревний наземный тестовый противник: он уязвим, несмотря на отсутствие полёта.
- Плоское замедление объединяется с уже действующими эффектами по прежнему веб-правилу наиболее сильного значения. Разные именованные ауры брони/MR складываются; порядок/формула native MR остаются отдельной неизвестной частью движка. Веб-изменение MR трактуется как сдвиг процентных пунктов, как у прежнего Paraiba-порта.
Наследование и незавершённые 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 и соответствующие описания. В фильтрах появились оберег, золотая награда и восстановление сердца. Предыдущие изображения самоцветов и рисунки значков сохранены.
Для успешной награды/восстановления используются небольшие существующие ограниченные всплески. Новых полноэкранных эффектов, моделей или текстур ради этих срабатываний нет.
Явные веб-решения
- Ауры жадности/восстановления имеют объявленный Duration 99999 в KV; это само по себе не доказывает вечное сохранение после выхода. Использован общий веб-след 1 s, проверенный тестами, до native-проверки снятия aura-marker.
- Симуляция относит скрытые источники способности к исходной башне для урона и наград. Оригинальный DamageFilter делает father-remap для статистики, а OnEntityKilled проверяет фактического убийцу без него. Разницу для скрытых native-caster нельзя скрывать: наш последовательный учёт источника является явным решением.
- Урон прорыва босса в v8 обновляется по его живому HP перед обработкой попаданий tick. Поэтому восстановление от босса использует последнее известное значение, а не выдуманный постоянный размер лечения. Нативная периодичность и очередность событий не воспроизводятся покадрово.
- Эффекты не объявляют весь боевой реестр или Classic завершёнными. Нативный maoyan, старый взгляд Medusa, точные правила MR/сложения и отдельные магазинные способности ещё требуют работы.
Проверка
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: основные противники и фиксированное число. Переход происходит только при новой экспедиции; существующий лабиринт не сбрасывается автоматически.
Таблицы и случайные варианты
- Перенесены 75 выбранных определений: 50 основных NPC и 25 автоматических вариантов. Семь дополнительных NPC, доступных только предметам Race, в обычные волны не добавлены.
- 17 волн имеют выбор варианта на всю волну с вероятностью 50%. Выбор происходит один раз при старте и сохраняется вместе с партией.
- На волнах 35, 36 и 38 вариант выбирается отдельно для каждого противника. Флаги собираются заново из собственных способностей выбранного NPC и добавленных способностей данной волны. Свойства основного противника не переносятся на альтернативного по инерции.
- Например, 35-я волна сочетает летающих магически невосприимчивых противников с вариантом физической защиты; на 36-й вариант также заменяет магическую защиту физической; на 38-й вместо лечения может появиться невидимость. На 27-й альтернативный NPC имеет физическую защиту и не получает отсутствующее у него лечение.
- Полёт определяется исходным именем и режимом движения. Альтернатива 48-й летает, хотя отдельная intrinsic enemy_fly у неё отсутствует. Маршрут выбирается по фактическому типу, а не по основной строке волны.
- Числа HP, скорости, брони, сопротивления, древнего типа и intrinsic-способностей заново прочитаны из установленного пакета. Одиночные коэффициенты HP/скорости ×0,69 сохранены.
Варианты боссов
- Босс 20: исходное календарное условие исключает последний день месяца, в феврале использует фиксированные 28 дней; до 21-го дня шанс 10%, с 21-го до предпоследнего гарантирован, но бросок всё равно расходуется.
- Боссы 30 и 40: по 10% для соответствующего варианта.
- Босс 50: вложенные независимые проверки дают 20% золотого, 8% платинового и 72% основного, а не 20/10/70.
- Для воспроизводимости дата UTC фиксируется при создании новой веб-партии. Оригинал берёт системную дату непосредственно при старте соответствующей волны; смена календарного дня во время длинной партии в веб-версии не меняет заранее заданные условия. Это явное решение, пригодное и для будущих одинаковых условий соревнования.
Элита и награды
- На каждом появлении расходуется проверка 1 из 400, включая боссов, которым элитность не присваивается. Обычный подходящий противник получает HP ×((51 − min(волна,50))/50 × 6 + 2), размер ×2 и тёплую отметку. Дополнительные вымышленные способности не выдаются.
- Опыт элиты ×10. Золото сначала ×10; если результат ≥100, затем делится на два. Например, элита 11-й даёт 100 XP и 50 золота. Награда берётся из самого фактически созданного противника и не выдаётся повторно за уже погибшего.
- Обычный урон прорыва 1…3/7/11/15/19 по главам бросается при появлении и хранится в противнике. Повторного броска при выходе нет. От этого же значения зависит масштаб обычного существа от 0,7 до 1,3; элитный множитель применяется дополнительно. Босс использует процент оставшегося здоровья.
- Элитный противник выделен размером, тёплым оттенком собственной копии материала и золотой окантовкой уже существующей полоски HP. Общая модель/материалы остальных существ не перекрашиваются; отдельные текстуры и графические проходы для этого не создаются.
Изменение числа противников
- Начальное количество — 10, минимум — 5. Число фиксируется при запуске волны; текущая волна не удлиняется от заработанной в ней серии. Ограничение сверху в оригинале не обнаружено и произвольно не добавлено в этот пятидесятиволновый профиль.
- Обычное убийство даёт +0,75 серии, элитное +1,5, босс +10. Проход пяти промежуточных маяков вычитает сохранённый урон прорыва ×0/0,05/0,10/0,20/0,40. Нормальному входу карты не присвоено ошибочное значение 0,02: оно относится к отдельному необязательному source-маркеру.
- Прорыв к сердцу вычитает ×3 от действительно потерянных жизней, с учётом оставшегося здоровья сердца. Например, при двух оставшихся жизнях противник с уроном три даёт штраф −6, а не −9.
- Одна проверка увеличивает количество на один при серии ≥50 и вычитает 50; отдельно уменьшает на один при ≤−50 и прибавляет 50. Это две проверки, а не цикл. Остаток может обработаться последующими событиями и периодической проверкой раз в секунду, как у OnThink.
- У боссов исходный счётчик уменьшается на 101 за создание одного: итог ceil(зафиксированное количество / 101), обычно один. Граничные случаи 101/102/202/203 проверены отдельно.
Ярость
В одиночном бою первая подходящая целая секунда — 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-ассеты не публикуются.
Скачать раздел · Markdown
Магические плиты: отдельный слой и заклинания
10 ноября 2026. Пакет 0.6.4. Работают восемь семейств по три уровня: 24 плиты. Это следующая часть боевого этапа, не завершение всего одобренного плана.
Создание и улучшение
- Книга синтеза → «Магические плиты», либо меню карты. Восемь сворачиваемых групп содержат ингредиенты и три изображения уровней. 52 карточки минералов и 51 рецепт кристаллов сохранены отдельно.
- Рецепт плиты требует два точных вида и качества внутри текущей новой пятёрки. Устаревшие сохранённые камни не расходуются. При готовом наборе дополнительная кнопка появляется прямо на карте.
- Кнопка открывает выбор места: сначала клетка карты, затем подтверждение. До подтверждения нет изменений камней, ресурсов и RNG. Отмена безопасна. Устаревшая пятёрка повторно проверяется.
- После создания все пять новых камней становятся булыжниками, а выбранная плита появляется на свободной клетке. Фаза переходит к готовности волны, работает верхняя кнопка старта. Нельзя поставить плиту на маяк, в защищённую зону, поверх существующего объекта/плиты или возле врага.
- Слой плит хранится отдельно от блокирующих структур. Он не меняет маршрут, не занимает клетку лабиринта и переживает сохранение. Позднее на плиту можно поставить кристалл: оба объекта сохранятся. В книге есть список плит на поле с приближением к нужной.
- Три одинаковые плиты одного уровня на соседних клетках по прямой, включая диагональ, автоматически заменяются плитой следующего уровня в центре. Боковые удаляются без новых булыжников. Перепроверка и каскад — через одну секунду. Максимум III; разные семейства и уровни не смешиваются.
- Поиск врага в 128 исходных единицах происходит раз в 0,1 с. После активации — пауза 10 с; она отсчитывается и во время строительства, а не сбрасывается каждой волной. Пользовательская пауза и окна останавливают симуляцию.
Проверенные фактические эффекты в одиночной игре
Сила заклинания в источнике равна 5 − число игроков; одиночная — 4. Она отличается от уровня самой плиты. Нынешний клиент остаётся одиночным; будущему кооперативу потребуется собственный проверенный профиль сложности.
- Захват: до 1/8/64 целей по уровню плиты; подзаклинание оглушает на шесть секунд в solo, включая магически невосприимчивых. Есть исходные небольшие случайные задержки и полёт. Первоначальное предположение о замедляющей ауре не соответствует исполняемой связке Youbu → new_youbu_sub.
- Миазмы: летящая полоса шириной 125 исходных единиц, скорость 600/400/200, дальность 1200/1600/2000. Замедление 50/80/99% постепенно теряет по одному процентному пункту за соответствующий интервал и исчезает за 18/21/24 секунды solo. Оба исходных значения урона равны нулю; вымышленный периодический яд не добавляется.
- Поток: через 1,6 секунды на зафиксированном месте цели область радиусом 256. Урон — половина AbilityDamage, в solo 150 для всех трёх уровней; оглушение 2/4/8 секунд, последующее замедление 40/60/80% на 14/16/18 секунд. Подбрасывание адаптировано к остановке движения без вертикального перемещения модели. Предположения о тысячах единиц урона для этой плиты не подтверждаются текущим пакетом.
- Боевой рог: соседние стрелковые башни получают +25/75/225% исходящего урона на 10 секунд в радиусах 384/512/768. Веб-контракт распространяет это на физический, магический и чистый урон; точный движковый охват DAMAGEOUTGOING_PERCENTAGE пока требует отдельной проверки. Одинаковый тип не перемножается.
- Кислотный туман: область радиусом 625 на 10/15/20 секунд, в solo −14/−42/−126 брони. Работает на невосприимчивых к магии. Урон в исходнике нулевой. Область действует и на подошедших позднее; после выхода сохраняется веб-след 1 s.
- Паралич: 1/3/9 сгустков. Подзаклинания верхних уровней оглушают на 2/3 секунды, первый — на одну. До 12 дополнительных отскоков после первого попадания; допустим возврат на уже поражённого врага, кроме непосредственно текущего. Дальность 1000, задержка 0,2 s, скорость 1800. Урон нулевой.
- Устрашение: +80/160/240% входящего урона и одновременно +25% скорости, на 12 секунд solo, радиус 256/512/1024 вокруг попадания. Первую цель нельзя выбрать магически невосприимчивой; область вокруг допустимой цели может затронуть невосприимчивых, как у исходного OnProjectileHitUnit.
- Пустота: −60/−120/−180 п.п. магической защиты и −50/−70/−90% скорости на 8/12/16 секунд. У источника пустой States-блок: физическая неуязвимость и эфирная форма не добавлялись по названию способности.
Ледяная цепь и статистика
Срабатывание плиты ищет носителей 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 и серверные режимы остаются следующими самостоятельными частями плана.
Боевые способности
- Критический основной выстрел: заявленные 10% и множитель ×5. Для крита и темперамента реализован детерминированный PRD с сохранением счётчика неудач. Вероятность в длинной серии проверена; точный скрытый PRD-поток Source 2 не объявляется воспроизведённым.
- Цепной разряд: шанс 30%, 500 магического урона, до пяти разных целей, шаг 0,2 s и дальность следующего звена 1000 исходных единиц. Цепь прерывается, если предыдущее звено погибло; невидимые и магически невосприимчивые вторичные цели исключаются.
- Разряд Древнего кровавика: 25%, 4000 магического урона основной цели и четырём наиболее удалённым подходящим целям в радиусе 1000. Конус из неиспользуемых параметров не добавлялся.
- Всплеск Золотого юбилея: исходное строгое RandomInt(1,100) < 15 даёт 14%, а не 15%; магический урон ×20 от урона снаряда в радиусе 400. Неиспользуемое снижение сопротивления не придумывается.
- Глубокий холод: пять секунд, 50% замедления, −100 процентных пунктов магического сопротивления, пять импульсов по 128; подавляет оба реализованных источника лечения врага. Магическая невосприимчивость защищает от наложения.
- Окаменение: 1%, восстановление 5 s, до 5 + floor(MVP/2) ближайших целей, включая невидимых и магически невосприимчивых согласно найденному поиску целей. Следящие снаряды замораживают движение на 2,5 s; только физический урон удваивается. Невидимость эффект не раскрывает.
- Темперамент: PRD 2%, обезоруживание своей башни на четыре секунды. Начатый залп в веб-версии сохраняется; последующие атаки ждут окончания эффекта. Другие короткие обезоруживания не сокращают этот срок.
Особенности при создании минерала
- Золотой юбилей получает одну случайную базовую атаку при подтверждённом синтезе. Формула Box–Muller и исходные целочисленные выборки перенесены из addon: ceil(z × 128 + 512), z в пределах ±4, минимум 30. Предпросмотр ничего не бросает, загрузка не перебрасывает атаку. Старый Юбилей получает единственное детерминированное значение при миграции.
- Природный изумруд при синтезе наследует до трёх разных допустимых способностей соседних дальнобойных башен в 220 исходных единицах. Список 72 разрешённых способностей и 92 дальнобойных типов получен из установленного пакета. Другой Природный изумруд исключён. Количество соседей и повторяющиеся способности влияют на вес выборки; способности не копируются повторно.
- Стиль снаряда выбирается среди подходящих соседей. В веб-геометрии переносится его цвет; исходные Dota-модели и эффекты не публикуются. Старое сохранение Природного изумруда не получает вымышленные ретроспективные способности.
- Выпущенный снаряд сохраняет исходный минерал, копированные способности и стиль даже после последующего синтеза башни. Старый урон относится к исходной форме в отчёте; новые способности не добавляются к снаряду задним числом.
- Случайный поток синтеза отделён от генерации пятёрки и боя. Это воспроизводимое веб-решение, а не точная копия глобального порядка RandomInt в Lua.
MVP
- После каждой успешно завершённой волны с 1-й по 50-ю включительно одна подходящая башня получает ступень MVP. Башни MAX и башни без положительного вклада исключены. Ничья разрешается стабильным ID; порядок Lua pairs не гарантирован источником.
- Одна ступень даёт +10% урона. MAX — десять ступеней — дополнительно даёт другим башням в радиусе 290 по +100% за каждый источник. Собственная MAX-аура не усиливает её владельца повторно. Общий MVP-бонус ограничен 500%.
- Физический, магический и чистый урон усиливаются один раз; округление вниз происходит только при положительном бонусе, как в найденном DamageFilter. При синтезе суммируются ступени именно потреблённых ингредиентов, максимум десять.
- Для выбора MVP отдельно учитываются положительные входящие события после усиления, до брони и сопротивления. Фактически снятое здоровье ведётся отдельно и ограничено остатком HP. Нативный порядок движкового фильтра, щитов и сопротивления ещё не подтверждён; текущая веб-последовательность явно проверена тестами.
Статистика и интерфейс
Меню карты → «Статистика партии». Те же данные доступны из итогов с возвратом к итоговому экрану. Показаны фактически снятое здоровье, победы над врагами, полученное/потраченное/украденное золото, вклад минералов, все раскрытые качества, история 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 сохраняется; остальные одобренные направления не объявляются завершёнными.
Исправленные базовые правила
- Свежие KV всех48 базовых камней сверены с каталогом. АлмазыIV/V/VI уже содержат пассивную прибавку: итог40/80/460, её нельзя добавить второй раз.
- Все6 топазов: основная цель и3 дополнительные, всего до4. Ранее прототип ошибочно ограничивался3 общими целями. Подтверждено присутствующим fenliejian.lua, расшифрованным как текст.
- Замедление сапфира всех качеств длится3s. Яд изумруда —10 импульсов в течение10s. АметистI–V снижает броню на3s;VI — на5s. Старые значения2/5/2s исправлены в игре и книге.
Перенесённые способности составных башен
- Пассивные прибавки обычной атаки+80/+160/+320/+640 по sourceAbilities. Например, Розовый алмаз теперь130 обычного урона, а Уран-235 —260. Базовые алмазы не получают повторный бонус.
- Малахит/Яркий малахит/Уран:3/6/12 дополнительных целей, вместе с основной4/7/13. Вторичные цели — ближайшие видимые живые противники в дальности; основной остаётся самый продвинувшийся по маршруту. Дополнительные снаряды наносят средний физический урон, обходят уклонение и не запускают повторные яд/оглушение/чистые всплески.
- Серебро и Серебряный рыцарь:−90/−120 единиц скорости на3s. Составные яды:16/32/128 магического урона каждую секунду в течение10s; независимые экземпляры от каждого попадания.
- Золото/Египетское золото:−32/−48 брони на2s; jianjia6:−64 на5s. Один и тот же тип эффекта обновляется; разные имена модификаторов складываются и истекают независимо.
- Чистые всплески соответствующих составных минералов, включая основную цель. Сохранён явный веб-контракт расчёта от выбранного урона выстрела: pre/post-armor смысл native %attack_damage пока не подтверждён.
- Турмалин: ауры−10/−20 брони и−10/−20п.п. магического сопротивления в800/1200 исходных единицах. Ауры не снимают магическую невосприимчивость.
- Жёлтый/Звёздный сапфир: ауры−70/−80% скорости в300/900единицах, без воздействия на магически невосприимчивых.
- Ауры скорости атаки составных башен, в том числе Кармен-Люсия+160 в200единицах. Одинаковые имена не дублируются, разные складываются; собственный AS аквамарина200/500 не удваивается.
- Ауры дальности+300единиц в362единицах: отдельные источники складываются. Аура точности в300единицах позволяет основному выстрелу игнорировать уклонение.
- Тёмный изумруд и другие носители tower_10jiyun:10% шанс оглушения на2s; магическая невосприимчивость защищает. Остановка движения и сохранение состояния проверены.
- Древний кровавик и Рубин Чёрного Принца получили свои исходные огненные ауры250/0,5s и5000/2s; их обычные выстрелы сохраняются одновременно с огнём.
Книга, графика и сохранения
Описание и фильтры теперь используют тот же реестр эффектов, что и бой. Действующие способности не скрываются в разделе будущих. Удалены ложные предположения из старого автоматического разбора: неиспользуемый poison-MR модификатор не показывается как работающий или обязательный будущий эффект.
В общей коллекции10 медальонов: добавлены оглушение и дальность/точность. Предыдущие восемь рисунков и иллюстрации минералов сохранены. Портреты, цели, избранное, фильтр пятёрки и выбор места синтеза продолжают работать. Для оглушения добавлен небольшой ограниченный по числу всплеск; новые полноэкранные графические проходы не используются.
Динамические баффы/дебаффы, снаряды и состояния переживаютJSON-сохранение. Повреждённые новые поля выявляются при восстановлении. Скомпилированные описания и источники аур кешируются на текущий tick/revision, без сохранения вычислительного кеша в матч.
Явные границы
- Плоские замедления пока используют наиболее сильное значение. Процентные ауры выбирают наиболее сильную. Ауры имеют веб-след1s. Нативное сочетание одинаковых/разных модификаторов, минимальная скорость и порядок движковых событий ещё требуют проверки Dota.
- Математика maoyan30% для magic/pure не определена доступным addon-кодом; не подменена догадкой. Псевдослучайные криты, цепные разряды, окаменение, глубокий холод, случайная атака Юбилея, копирование Природного Зумуруда и наградные ауры — следующие части боевого этапа. Их статус виден в книге.
- Плиты и MVP ещё не реализованы. Наличие обычной атаки не означает, что все особые свойства минерала завершены.
- Новое чтение Blink подтверждает прямой SetAbsOrigin без проверки дальности;925 из KV не является native-clamp в найденном Lua. В текущем прежнем веб-профиле предел925 и защита порядка маяков пока сохранены как явные веб-решения; при полном переносе вариантов будет отдельная версия правил.
- Случайные варианты волн/элита/динамическое число/ярость, настоящий endless, сервер, профиль, co-op и Last Survivor остаются в одобренной очереди. Уникальные50 моделей производятся отдельно.
Доказательства и проверка
Машинные аудиты: 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. Все семь направлений развития одобрены пользователем; эта публикация завершает первый самостоятельный пакет, не объявляет весь план выполненным.
Работает в этой версии
- Нажатие на золото вверху открывает способности хранителя. Прежняя кнопка хранителя в меню открывает уровень и вероятности.
- Восемь видов молитвы:200 золота, одна попытка для следующего успешно поставленного камня. Качество не меняется. На первом ранге фактический шанс выбранного вида46,625%, остальные по7,625%. Исходное строгое сравнение< сохранено.
- Невалидная клетка не расходует эффект и не меняет RNG. Успешная постановка расходует эффект независимо от результата. Активный вид показан около пятёрки и сохраняется при перезагрузке. Вторая покупка до расходования первой блокируется, чтобы случайное нажатие не заменяло оплаченную молитву.
- Обмен двух сохранённых самоцветов либо самоцвета с булыжником: выбор объектов на карте, обозначенияA/B, предпросмотр координат и полной цены, подтверждение/отмена. Новые невыбранные камни пока не переставляются. Два булыжника не обмениваются.
- Важное уточнение источника: handler gemtd_hero_yixinghuanwei вызывает CostGold на каждом выборе. На ранге1 это300+300=600 за полный обмен. Веб списывает полную сумму600 только после подтверждения; первый выбор и отмена бесплатны. Положение строителя и его ходьба пока не ограничивают обмен. Это явные решения интерфейса, а не утверждение о дословном native-поведении.
- Два занятых места остаются занятыми, поэтому маршрут и положение живых врагов сохраняются. Переносятся сами башни: IDs, убийства, способности и действующие снаряды не теряются. Обновляются также3D-модель и координаты для нажатия.
- Повтор незавершённой пятёрки за600: сначала отдельный просмотр теряемых новых камней. Удаляются только они, их клетки освобождаются; старые башни и булыжники сохраняются. RNG не отматывается. Уже выбранный результат сбросить так нельзя.
- Все три стартовые способности имеют ранг1, доступный каждому; XP хранителя его не повышает. Профильное получение старших рангов — отдельный будущий этап. Молитвы качества не включены.
- Cooldown молитвы/обмена3s, повтора10s. Время идёт в строительстве и бою; пауза/окно/предпросмотр останавливают игровой отсчёт.
- Учёт золота разделён на получено/потрачено/украдено, расходы по действиям и журнал операций. Старое сохранение получает начальный остаток, а не выдуманный прошлый доход. Принятая команда с тем же commandId не повторяет действие/списание даже после загрузки.
Уточнение предыдущего аудита качества
Полный просмотр57 Lua-файлов выявил сброс perfected, который не был учтён в первом выводе документа44. Solo/Coop допускает один успешный qualityoverride на строительный интервал между общими стартами волн. Race сбрасывает caster.perfected после завершения личной пятёрки. Это не один успех на всю партию. Точные4 присваивания и оба вида смещений находятся в data/wave-variants-audit-2026-11-09.json → prayerResetAudit. Документ44 и его онлайн-копия исправлены. Покупки качества пока не реализованы, поэтому сохранения игроков этим уточнением не меняются.
Последующие пакеты, уже разрешённые пользователем
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 нет. Физический телефон не подменяется программным стендом.
Скачать раздел · 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 пикселей. Примеры высоты до и после:
Для алмаза сокращение составляет около 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 клеток в секунду. Броня берётся напрямую, сопротивление магии указано в процентах.
Обычных противников по десять, босс один. Награда за обычного врага главы — 15 золота и 15 опыта; за босса — 200 золота и 400 опыта. Утечка обычного врага снимает до десяти жизней по оставшемуся здоровью; у босса сохраняется потеря ceil(процент оставшегося HP). Победа означает пережитую последнюю волну, поэтому она возможна и после частичной утечки босса, если остались жизни.
Способности и подсказки
- Аура брони действует на самого носителя и соседей в радиусе 500/128 клетки. Каждый живой носитель добавляет +4 один раз. Бафф держится ещё секунду после выхода из радиуса или гибели источника. Данные баффов входят в snapshot.
- Защита 23-й волны уменьшает физический урон на 75% после расчёта брони. Это не полный иммунитет. Магический и чистый урон не получают это снижение.
- Направленный щит использует направление следующего отрезка пути в момент попадания. Передний сектор 140° даёт 40% снижения, общий боковой сектор до 240° — 20%, сзади дополнительного снижения нет. Источник попадания сохраняется в снаряде. Магический и чистый урон этот щит не уменьшает.
- Лечение летающей 27-й волны равно 10% максимального здоровья у промежуточных маяков; у финиша лечения нет. Прежняя 15-я волна сохраняет действовавшие в прототипе 20%, чтобы не менять баланс уже опубликованной главы.
- Преломление щита, уклонение и ответное обезоруживание используют существующую детерминированную реализацию прототипа. На 27-й волне обезоруживание атакующей башни длится секунду с вероятностью 50%.
- Перед запуском и в справочнике по номеру волны показаны тип движения, защиты и практическая подсказка. У дозорных есть небольшой видимый передний щит без дополнительных источников света и текстур.
Модели и загрузка
Источник моделей — 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. Серверные режимы и глобальный прогресс должны опираться на те же версионированные данные волн.
Проверка игровых моделей новой главы. Автор моделей: 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 с уточнением пользователя: отдельный осмотр врагов не нужен; вместо него улучшена видимость здоровья.
Цель рецепта
В Книге синтеза у каждой поддерживаемой формулы есть кнопка «Собирать». Выбирается одна конкретная формула, включая её точные качества и альтернативный набор ингредиентов. Повторное нажатие снимает цель. Новый выбор заменяет прежний.
Компактная строка цели показывает результат и число уже сохранённых компонентов. Она открывает нужный рецепт в книге; кнопка × снимает цель. На карте и миниатюрах пятёрки флажком отмечаются точные недостающие ингредиенты. Камень другого качества не считается совпадением. Когда нужный компонент уже сохранён в достаточном количестве, его новые экземпляры не отмечаются как недостающие.
Цель сохраняется в текущем браузере отдельно от партии и ручного избранного. Звёзды избранного продолжают работать независимо. Цель остаётся выбранной после синтеза, чтобы игрок мог собирать эту формулу повторно; её можно снять в любой момент. Это не автоматическое резервирование или расходование камней. Для промежуточного составного ингредиента можно выбрать его собственную формулу; рекурсивное дерево целей пока не реализовано.
Предпросмотр синтеза
Кнопки синтеза из карты и книги сначала открывают единый предпросмотр. Это относится к составным рецептам, повышению качества из одинаковых камней текущей пятёрки. Обычное «Оставить» и случайное понижение качества работают по прежним правилам.
- На карте подсвечены точные экземпляры компонентов. Их номера совпадают с номерами изображений в карточке.
- Символ ✦ показывает клетку результата; × обозначает лишний камень пятёрки, который станет булыжником.
- В карточке видны будущий самоцвет, его компоненты, координаты результата и число будущих булыжников.
- Важное правило оригинала сохранено: при сборке из пятёрки все четыре остальные позиции станут булыжниками, включая не входившие в рецепт. При сборке сохранённых башен лишние экземпляры остаются нетронутыми.
- «Отмена» и Escape закрывают просмотр без изменения партии или случайных чисел. «Собрать» либо «Улучшить» подтверждает показанный вариант.
- Во время просмотра бой приостановлен. После закрытия сохраняется прежнее ручное состояние паузы. Отключение вкладки и открытие других окон не подтверждают синтез.
- Перед подтверждением повторно проверяются фаза, формула, результат, состав, экземпляры и координаты. Изменившийся набор требует нового просмотра; другой компонент незаметно не подставляется.
Результат остаётся на выбранной позиции. В этом этапе не добавлено перетаскивание будущей башни на другую клетку. Логика синтеза исполняется существующими проверяемыми командами.
Подсказка волны
Во время строительства, выбора и ожидания запуска рядом с верхней кнопкой показаны номер и основные свойства предстоящей волны. Приоритет имеют босс, невидимость, полёт, защита от магии и особые способности. На компактной кнопке помещаются до двух основных свойств; нажатие открывает полный существующий справочник со всеми особенностями, количеством противников и здоровьем.
Подписи получаются из той же конфигурации, что использует бой: они не выводятся из внешнего вида модели. Например, модель бронированного существа сама по себе не означает броню, если в данных волны её нет. После начала боя предварительная подсказка исчезает.
Полоски здоровья
Здоровье теперь рисуется общим экранным слоем поверх сцены. Полоски имеют постоянную толщину и ширину в 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–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-отчёту; наличие локальной сборки не означает обновление основного адреса.
Опора деревьев и истоки
Причина дефекта: семь из восьми дальних деревьев находились за реальным краем острова, а отдельные камни под ними читались как висящие подставки. Нижнее дерево почти совпадало с осью водопада.
- Все восемь деревьев перенесены на реальное плечо берега. Корни, кусты, трава и прибрежные камни получают опору однократной проверкой геометрии острова; экземпляры без поверхности отбрасываются.
- Подставки под деревьями удалены, корни слегка заглублены, кусты сгруппированы у стволов. Нижнее дерево отнесено от русла.
- Оба истока прикрыты низкими мшистыми скалами, заглублёнными в берег. Вода выходит из-под камня. Скалы используют существующие геометрию, материалы и пакеты отрисовки.
- Белая кладка, пересекавшая истоки, убрана; русло свободно от растительности. Дальние и ближние деревья используют одни позиции; в balanced вблизи теперь видны все восемь, чтобы два нижних не исчезали при приближении.
Независимая проверка: у 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.
У новых волн броня 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. Что принято пользователем
- Кампания из 50 волн, затем настоящий бесконечный режим.
- Художественная цель — 50 различимых моделей противников, по одной основной форме на волну. Маленькие и простые существа в начале; более крупные, сложные и внушительные позднее. Масштабирование допустимо как промежуточный этап.
- Сначала онлайн-кооператив 1–4 игрока на одной карте и одном лабиринте, с понятным увеличением сложности. Затем соревнование на отдельных одинаковых картах: последний выживший побеждает.
- Подробные показатели золота, очков, качеств, созданных кристаллов и нанесённого урона: в бою, после матча, за всё время и в общем рейтинге. В дальнейшем — сезоны с разными условиями.
- Профиль: электронная почта → числовой код в письме → имя и пароль. Позднее — покупки, связанные с аккаунтом.
- Утверждённые иллюстрации сохраняются. Текущая визуальная работа касается света, материалов 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 и чужие модели в веб-сборку не переносятся.
Найдено расхождение версий: старое приложение использовало иные HP/speed, а wave2 имела speed600 вместо 700 в 2.0. Текущий прототип не перенастраивается молча в рамках цветового обновления. Сведение правил — отдельное заданиеA1.
4. Порядок выполнения и зависимости
Производство моделей идёт пакетами рядом сA2–A8;50 разных силуэтов — цель полного художественного выпуска, не повод блокировать проверку сервера временными моделями. Оплата не является зависимостью отладки игры.
5. Ещё недостающие элементы полного оригинала
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. Пять художественных глав
Это предложенные высоты для камеры, не характеристики исходника. Сильный рост заметен между главами и внутри каждого класса; первая обычная волна новой главы не обязана быть выше предыдущего босса. У быстрых и летающих форм силуэт может быть вытянутым/широким вместо высокого. Обычный наземный footprint до 0.8 клетки; у босса видимая ширина до 1.4, вычислительная точка пути прежняя. Крылья/рога не должны закрывать больше соседних башен; проверить мобильный zoom1.5.
Таблица 50 силуэтов в JSON — собственный предложенный арт, не перевод китайских имён source ID. Например персонаж с «птицей» в имени исходника может идти по земле: gameplay fly брать из source-флага, а не из картинки. Для летучего меха обязателен визуальный полёт; для наземной птицы — бег/прыжки.
4. Полный производственный конвейер моделей
- Привязать 50
waveVisualId к реестру. Для каждого: силуэт, движение, размер, палитра главы, читаемые признаки свойств, автор/лицензия/источник, статус temporary/final.
- Сначала пакет 1–10 с одним полным циклом импорта; затем 11–20,21–30,31–40,41–50. Шесть имеющихся моделей допустимы как временные. Повторная перекраска одной модели не считается 50 уникальными финальными моделями; общий скелет и анимации разрешены.
- Для каждого GLB: Idle/Move/Death; при необходимости Hit/Spawn. Корень в основании, согласованная ось вперёд, одна система единиц, запечённый transform, без камеры/света. Смерть не задерживает игровую награду; визуальный хвост удаляется отдельно.
- Цели mobile: обычный LOD0 до 3–5 тыс. треугольников, дальний до 1–2 тыс., босс до 8–12 тыс.;1–2 материала, текстуры 512–1024, минимальное число костей. Это лимиты проекта, а не обещанная скорость на любом телефоне. Профилировать шкуру/прозрачность/тени всей волны.
- Подгружать текущую и следующие 2 волны; освобождать неиспользуемые материалы/скелеты. Не грузить 50 GLB на первом входе. На сбое загрузки сохранить играбельную fallback-модель и вывести диагностический статус в QA.
- Совместный скелет/атлас и переиспользование геометрии снижают бюджет; независимую анимацию обеспечить корректным skeleton clone либо измеренным animation instancing. Не покупать дорогую систему до профиля нагрузки.
- Сохранить 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. Задания агенту и приёмка
Графика не должна менять исход боя. В 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–4 слота, nickname/ready, выбор режима и публичности. Только до старта: параметры сложности, исходных способностей, общей передачи управления, endless. Нет обязательного чата на первом этапе: достаточно пингов и быстрых сообщений.
- Все загрузили версии контента → сервер фиксирует состав и seed → создаёт общую карту, замок и соответствующие исходные камни. Не начинать волну для игрока, ещё не загрузившего поле.
- Каждому выдаётся своя пятёрка. Свободные клетки общие. Строитель не может перекрыть маршрут и «застолбить» чужую текущую пятёрку без явного разрешения.
- Каждый выбирает результат своей пятёрки. Готовность ставится только после завершения выбора. Пустые слоты не блокируют. Кнопка запуска показывает «готовы 2/3», а не начинает бой раньше остальных.
- Все готовы → короткий общий countdown → одна очередь врагов по общему маршруту. Никаких локальных пауз/скоростей в ranked. В casual возможна общая пауза по согласованным правилам.
- Разрешённые фазой синтез/удаление/перенос выполняются сервером. Последний враг завершает волну; сохраняются статистика и 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. Пакеты работ и приёмка
Нельзя принимать онлайн по скриншоту четырёх вкладок. Нужны независимые клиенты, искусственные задержки, перезапуск сервера и проверка журнала/итогов.
Скачать этот раздел · 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.
Гостевую отладочную телеметрию не считать достижениями. Полные 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. Какие срезы нужны
На телефоне не держать всё открытым. В матче компактный счетчик/иконка → sheet со списком; закрытие возвращает максимум площади полю. Графики в итогах, не поверх пути врагов. Интервальные показатели обновлять 1–2Hz, не перестраивать таблицу каждый render.
Для башен хранить отдельно: draftedCount, keptCount, createdByCraftCount, upgradedCount, peakConcurrent, finalCount, damage. РецептA+B→C увеличивает craftedC и расходует ингредиенты, но не стирает исторические keptA/keptB. Повторный swap не считается новой постройкой. Самый высокий грейд не заменяет распределение всех шести.
5. Очки и разные виды рейтинга
Нельзя смешивать в один главный рейтинг вложенные деньги, длительность игры и соревновательный навык. Нужны разные вкладки.
- Рекорд кампании/бесконечности: отдельный ключ(mode,ruleset,map,difficulty,P,season). Сравнение сначала по очищенной волне, затем remainingLives, затем меньшим combatTicks при одинаковом прогрессе. Предел/тайбрейк объяснены публично; время меню/паузы не награждает.
- Last Survivor skill: места и состав соперников, рейтинг до/после и неопределённость. Предложение — отдельная серверная версия модели навыка для многопользовательских мест; подобрать по симуляции, не копировать неизвестную формулуDota. До выбора модели ранняя beta имеет только места и win rate, без выдуманногоMMR.
- Очки партии: предварительная прозрачная формула
100*clearedWaves + 500*campaignClear + sum(weightedKills) - 10*leakDamage, не ниже 0. Это проектный старт и scoreVersion, не оригинальные очки. Endless-очки только в своей таблице; окончательную формулу заморозить перед сезоном. Золото/урон не добавлять прямо к skill.
- Накопительные таблицы: 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; в 2.0 найденный обработчик этого не делает. Справка старого UI о месячных сезонах/коробках/наградах — свидетельство текста, а не доказанная работа нынешнего backend. Полный аудит — future-audit/economy-stats.md; не публиковать чужие серверные URL/секреты в приложении.
5. Что можно сделать платным
Рекомендация первой монетизации: косметика и удобство вне боевого преимущества. Это предложение, а не уже принятое ограничение пользователя.
Если пользователь позже выбирает боевые покупки, включать их только в отдельный 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. Пакеты работ и критерии
ДоP7 не запрашивать у игрока реальные платёжные данные и не выдавать тестовый checkout за действующий магазин.
Скачать этот раздел · Markdown
50 предложенных форм противников
Это производственная раскладка, а не готовые модели. У каждого номера свой финальный силуэт. Общие скелеты допустимы; источники и лицензии выбираются при производстве. Названия — авторское арт-направление, свойства ground/fly взяты из аудита.
Скачать реестр JSON