# 35. Аудит оригинала: повышение качества одинаковых камней

Дата: 9 ноября 2026. Статус: аудит завершён; игровые правила веб-версии в этой задаче не менялись.

Исправление внесено в 0.4.10; см. документ 36. Ниже сохранён разбор расхождения версии 0.4.9. Повторный машинный аудит теперь подтверждает отказ команды в исправленной версии.

## Вывод

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

В веб-версии 0.4.9 такое объединение сохранённых камней разрешает добавленная команда mergeIdentical. Это подтверждённое расхождение с оригиналом, а не обнаруженное правило исходной игры. Ранее возможность была ошибочно принята за соответствующую оригиналу.

| Ситуация | Оригинальный GemTD 2.0 |
| --- | --- |
| Два аметиста второго качества в текущей пятёрке, выбор ещё не сделан | Можно выбрать улучшение до третьего качества |
| Два аметиста второго качества уже сохранены на поле | Повысить качество парой нельзя |
| Один сохранённый аметист и один такой же в новой пятёрке | Для повышения качества не объединяются |
| Новый камень сначала оставлен, затем его пытаются объединить со старым | Пара уже сохранённых не получает такой возможности |
| Составной минерал по точной формуле из сохранённых ингредиентов разных ходов | Разрешён отдельным механизмом рецептурного синтеза |

## Проверенные источники

Заново прочитан установленный пакет F:/SteamLibrary/steamapps/workshop/content/570/3817795446/3817795446.vpk. Его SHA256: c2aed66ec055edf7fdd3bceb02a0d941d207c01b82326074366f0642c623166e. Пакет совпадает с предыдущим импортом; Lua декодирован как данные, без исполнения кода Dota.

Основной файл scripts/vscripts/addon_game_mode.lua, SHA256: 810f1ede9cece57b2413f5e0629407554703b1b0e22fd52866ee11e95a1a7695. Дополнительно прочитаны npc_abilities_custom.txt, npc_units_custom.txt и все 57 Lua-файлов пакета для поиска других выдач способности повышения качества. Также сверена ранее приложенная старая версия reference_data/addon_game_mode.lua: ограничение текущей пятёркой в ней такое же.

## Как работает оригинал

1. В gemtd_build_stone после пятой постройки перебирается только build_curr[player_id][0..4]. Имена камней сравниваются внутри этого же массива. Сохранённый gemtd_pool в подсчёт одинаковых камней не входит.
2. При cj >= 2 способность gemtd_choose_update_stone выдаётся элементам этой пятёрки. При cj >= 4 дополнительно выдаётся отдельное улучшение на два уровня; у пятого качества есть особый результат. Обе выдачи способности +1 во всём Lua-пакете находятся именно здесь.
3. В определении способности gemtd_choose_update_stone событие OnSpellStart вызывает choose_update_stone.
4. choose_update_stone создаёт результат с именем caster:GetUnitName().."1". Например, gemtd_p11 → gemtd_p111. Четыре остальные позиции текущей пятёрки заменяются булыжниками; build_curr очищается, результат попадает в сохранённый пул.
5. Обычный выбор choose_stone тоже удаляет способности выбора/улучшения, заменяет остальные четыре позиции булыжниками и очищает build_curr. Сохранённая башня больше не остаётся кандидатом на такое повышение качества.
6. В определении аметиста второго качества нет постоянной способности повышения качества. Название gemtd_tower_update может сбивать с толку, но в KV это скрытый пассивный визуальный эффект без RunScript, а не сборка пары.

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

## Почему это не рецепт составного минерала

Проверены обе оригинальные таблицы: 38 обычных и 13 дополнительных формул. Все 51 формула совпадают с каталогом веб-версии. Ни одна из них не создаёт базовый самоцвет следующего качества из пары сохранённых одинаковых минералов.

merge_tower работает с рецептными наборами сохранённых башен. Это другой механизм. Он не подтверждает возможность повышать качество любой пары. Разрешённый пользователем синтез составных минералов до запуска волны в веб-версии — отдельное намеренное изменение фазы; возвращение правильного правила одинаковых пар не требует его отменять.

## Воспроизведение расхождения в веб-версии

В отдельном контрольном экземпляре JavaScript-движка задана волна 15, два сохранённых gemtd_p11 и новая пятёрка без аметистов. savedUpgradeOptions вернул готовое действие; mergeIdentical создал gemtd_p111, не затронув пятёрку. Это воспроизводит описанный случай. Пользовательское сохранение при проверке не читалось и не изменялось.

## Объём необходимого исправления

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

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

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

Повторный аудит: node tools/recipes/audit-identical-upgrades.mjs.

Машинный отчёт: reference_data/gemtd2-source/identical-upgrade-audit/audit.json. Он содержит хеши, точные смещения, результаты проверки всех Lua-файлов и контрольное воспроизведение в веб-движке.

Читаемые выдержки с исходными смещениями и хешами: reference_data/gemtd2-source/identical-upgrade-audit/gemtd_build_stone.lua, choose_stone.lua, choose_update_stone.lua, choose_update_update_stone.lua, merge_tower.lua. Определения способностей и двух качеств аметиста сохранены рядом в KV-файлах. Переносы строк добавлены только для чтения; хеши относятся к точным исходным выдержкам.
