Возвращая старую Доту: Охота за Первой Альфой
Вы когда-нибудь задумывались, как выглядела Dota 2? Ещё до того, как мы о ней узнали, возможно, даже до того, как она стала называться "Dota 2". И я сейчас не об оригинальной кастомке для WarCraft III, а об отдельной игре, созданной Valve.
Всю дорогу у нас были небольшие проблески старых альфа-версий, предшествовавших TI1, но мы видели лишь отдельные фрагменты в виде скриншотов, причём из более поздних версий. Единственной официальной информацией, которая была на этот счёт, было изображение мини-карты, использовавшееся в сборке игры на TI1. Вы когда-нибудь замечали, насколько она коричневая?
Дело в том, что она была нарисована поверх старого дизайна карты, основанного на ранних концептах, в которых использовались именно эти цвета. А если присмотреться повнимательнее, то можно даже разглядеть оригинальные модели построек!
И как только я это заметил, пересматривая матчи TI1 ещё в 2020 году и документируя драфты и статистику этих игр, я не мог перестать думать об этой версии карты.
А сегодня версия карты, наиболее близкая к исходному изображению, полностью портирована и доступна для игры в современной Dota 2 в качестве кастомки. Всё благодаря набору скриптов, над которыми я работал более года.
В этом посте я хотел бы рассказать подробнее об оригинальной версии, изображении мини-карты и о том, как в итоге удалось её портировать.
Хотя пожалуй я тут преувеличил, в итоге о первоначальном дизайне и о самом билде я особо и не рассказал. Впрочем, я сказал и показал достаточно, а сама игра доступна на современном движке, так что можно поиграть самому и сделать выводы.
И в качестве бонуса я также создал для себя пользовательский лаунчер Dota 2 Workshop Tools для Linux (подробнее об этом в конце).
(это, кстати, стало причиной, по которой я до сих пор не закончил свой итоговый пост о The International, хаха)
Предыстория
Вернёмся в 2021 год. Я много думал об этой "легендарной песчаной карте" и начал собирать скриншоты старых версий, а заодно расспрашивать об этом участников сообщества.
В конце концов, на TI2023 в Сиэтле я встретил другого энтузиаста (пожелавшего остаться анонимным), который упомянул, что у него есть несколько старых сборок с давних времён. Мы договорились, что он поделится этими сборками со мной, когда сможет.
И в середине 2024 года он наконец прислал мне ссылку на Google Drive с тремя архивами. Хотя сборки казались полными и содержали все необходимые ресурсы, ни одна из них не была пригодной для игры из-за отсутствия server.dll. Это означало, что было невозможно заставить движок загрузить карту или даже запустить локальный матч. Я пробовал использовать server.dll из других версий игры или из Source SDK, но это, ожидаемо, не сработало без дополнительных коррективов, и я не стал углубляться в поиск реального решения.
Тем не менее мне удалось проверить содержимое сборок: карту, HUD, героев и модели. В 2026 году, после утечки steam2, вокруг всего этого сформировалось огромное сообщество, и в конечном итоге те же самые сборки были обнаружены в утечке и стали известны как 883_2, 883_7 и 883_12. Или, проще говоря, альфа-плейтест сборки номер 3, 8 и 13. Вместе с ними позже соорудили работающий файл server.dll, который позволял загружаться на карту и тестировать всё это великолепие.
Для контекста,
- Steam2 leak — это масштабная утечка старых сборок игр из Steam, в том числе закрытых. Среди них было много сборок игр самих Valve, но только тех, которые давали игрокам на удалённый плейтест. Внутренние сборки там не фигурировали.
- 883 — это идентификатор приложения Source SDK, который использовался в ранних сборках Dota 2, а число после подчеркивания — номер сборки.
Но это произошло гораздо позже. А в 2024 году я просматривал файлы и начал разрабатывать своего рода пайплайн для переноса карт Source 1 в Source 2. Проект был амбициозным: перенести "потерянную альфа-версию" с "песчаной картой" на новый движок, а позже и основные версии карты из более поздних патчей и версий игры, сохранив историю разработки доты.
Мне удалось декомпилировать геометрию карты и перенести некоторые модели, но отсутствие какой-либо документации, как и люлей, пробовавших сделать что-то подобное, значительно затрудняло работу. Доступные инструменты часто вылетали, а геометрия карты была просто геометрией: все материалы вызывали ошибки, что затрудняло их воссоздание.
Даже опытные знакомые из сообщества моддинга доты лишь разводили руками в ответ на большинство моих вопросов.
Прорыв
Было две основные вещи, которые помогли мне добиться прорыва в этом проекте.
Первой, как не трудно догадаться, стало использование LLM для автоматизации большей части рутинной работы, исследований и документирования хода работы. Однако главный прорыв произошёл благодаря утечке Steam2.
Самой важной частью этой сборки на самом деле была… "первая альфа сборка", 883_0.
Именно это привело к первому важному открытию: изображение мини-карты было нарисовано поверх реального рендеринга карты с камерой сверху.
Кроме того, оказалось, что это не песчаная тема, а скорее что-то вроде вода-лето-лес и рыбы против корней-осени-драконов с повсюду разбросанными опавшими листьями. А большая часть коричневого цвета на самом деле была связана с песком, грязью и освещением. Занятно.
Это также помогло понять, что сборка 883_0 — не та сборка, из которой был сделан этот скриншот: текстуры каменных дорожек на стороне Тьмы расположены по-другому. Это, наряду с сеткой и хитбоксами, наводит меня на мысль, что скриншот был сделан в Hammer или из тестовой сборки сразу после завершения работы над первой версией карты. А после того, как её немного доработали, состоялся первый плейтест с игрой по сети.
Однако главный прорыв произошёл благодаря инструментам разработчика, которые поставлялись вместе с этой сборкой, а также файлу server.dll, для запуска которого потребовались лишь минимальные настройки. Это, наряду с тем, что файлы в основном были распакованы, очень помогло в реализации проекта.
Итак, теперь у нас есть материалы (многие из которых, кстати, либо до сих пор присутствуют в современной Dota 2, либо имеют прямых потомков, что довольно занятно), модели и анимации, эффекты, звуки, геометрия карты, навигационная сетка. И теперь нам остаётся только понять, как всё это соединить воедино.
Портируем карту
Так, на чем мы остановились? На данном этапе разработки уже доступна геометрия карты, декомпилированная из BSP. И, конечно же, перенос таких ресурсов, как курсоры, звуки, иконки способностей и предметов, не должен вызвать особых сложностей.
Вот список проблем, которые надо было решить:
- Импортировать ландшафт в качестве модели мира, а также навигационную сетку
- Перенести все материалы и настроить блендинг текстур как на исходной карте
- Перенести модели: декорации, деревья, героев и других юнитов
- Перенести частицы и другие эффекты
- Воссоздать список героев с исходными характеристиками, списком доступных героев и привязать к ним способности
- Сделать аналогично для предметов
- Перенести HUD
- Доработки: переписать некоторые способности, чтобы воссоздать исходную логику, исправить поведение курьера и другие подобные моменты
В целом, для большинства таких задач существуют инструменты для декомпиляции и конверсии, поэтому дело сводилось к подбору правильных параметров и последующей автоматизации для ускорения всего процесса.
Конвертация моделей осуществлялась через Blender: на вход шли MDL и на выходе были FBX и VMDL. Для большинства моделей масштаб FBX составлял 0.01, с разворотом в ModelDoc на 90 градусов, чтобы привести их в правильное положение.
В некоторых случаях модели имели текстуры с альфа-каналом, которые приходилось переэкспортировать дополнительно. Ещё одной побочной проблемой был внешний вид героев после импорта: некоторые материалы выглядели немного не так, как нужно, или сами герои казались слишком яркими и блестящими из-за шейдера героев в Source 2, поэтому их параметры были чуть приглушены.
Особым случаем стал перенос анимаций. Многие герои были ещё недоработаны и не имели ни анимаций, ни скелетов, но сами модели по общей форме были ОЧЕНЬ близки к современным версиям. Поэтому в большинстве случаев добавление анимаций сводилось к привязке современных скелетов к модели с помощью скрипта, с последующей ручной корректировкой там, где это было необходимо, чтобы они правильно сели, не деформируя модель героя.
Phantom Lancer был особым случаем, так как у него была законченная ранняя модель со скелетом и анимацией ожидания, но вот современные анимации и скелет на эту модель ложились с трудом.
Но всё это можно было исправить вручную, потратив достаточно времени. После того как я разобрался с костями, оставалось только перенести анимации на старые/обновлённые скелеты, и всё готово.
Перенос самого ландшафта оказался сложной задачей. Прежде всего, модель из декомпилированного BSP не совсем подходила в качестве модели мира: карта либо не загружалась, либо полностью игнорировала существование этой модели. В конце концов я понял, что в экспортированной модели мира было много замкнутых или искажённых полигонов, и их было слишком много в целом. Скрипт с функцией обнаружения замкнутых полигонов и уменьшения их количества в итоге помог мне привести модель в рабочее состояние.
Одна проблема, с которой я долго не мог справиться, была связана с MultiBlend. Я знал, что этот шейдер есть в игре и, скорее всего, примерно также работает. Но портирование материалов слой за слоем не давало точно таких же результатов: переходы всегда получались резкими, как будто маска отображения не работала корректно, а сами текстуры-слои располагались в неправильном порядке.
Именно так и оказалось. Сначала я не смог найти точную причину и решил, что лучше будет заменить исходные материалы на 64 предварительно рассчитанных "текстур ландшафта", воспроизводящих эффект блендинга.
И в конце концов, когда я вернулся к этой проблеме, выяснилось, что
- базовый слой в Source 1 был четвёртым
- маска отображения была назначена не на тот канал
- веса на вершину из блока multiblend BSP попадают в потоки вершинной раскраски, которые считывает шейдер.
Затем обновлённая навигационная сетка, экспортированная из исходной карты, была наложена на карту, соединившись с сеткой мира.
Портирование героев и предметов в целом оказалось достаточно простым. Большинство элементов по-прежнему присутствует в современной Dota, но в некоторых случаях они немного изменились: либо изменился тип таргетинга, либо поведение атаки (я смотрю на тебя, Венга), либо под тем же названием появилось что-то другое. Именно для таких случаев я обращался к репозиторию SpellLibrary от Pizzalol, чтобы воссоздать оригинальные версии заклинаний. То же самое произошло с предметами. С юнитами было немного проще, так как все нейтральные юниты использовали временные модели, некоторые даже модели лейн крипов, и не обладали способностями. Не о чём беспокоиться. Так что осталось лишь перенести конфигурации героев, предметов и магазинов.
Предметы, недоступные в магазине в современной доте (Buckler, Poor Man’s Shield, Hood of Defiance), продаются как копии под собственными тегами, поскольку современный магазин не даёт их нормально купить/продать. Предметы, механика которых изменилась (Bloodstone, Blade Mail, Boots of Travel, курьеры), реализованы с помощью скриптов.
Перенос звуков и портретов/иконок был довольно простым делом. А вот частицы доставили немало головной боли.
Системы частиц PCF преобразуются в VPCF Source 2 с помощью таблицы, которая сопоставляет каждый оператор и параметр Source 1 с его эквивалентом в Source 2. Чтобы современный код способностей мог воспроизводить старые эффекты, преобразованные системы передаются по путям современной Dota. В целом всё работает, но современный код в отдельных случаях устанавливает другие контрольные точки, нежели код 2011 года, поэтому некоторые системы потребовали адаптации: присоединение, перенацеливание контрольных точек, добавление или удаление операторов.
HUD 2010 года был реализован на VGUI: файлы макетов .res с указанием положений, размеров и текстур. Это ещё не HUD на Scaleform, и его немного проще читать и переделать, с некоторыми творческими вольностями. Создание скрипта преобразования и последующая настройка некоторых элементов позволили добиться хорошего результата.
Самыми серьёзными проблемами оказались чат и экран выбора героев. Чат фактически представляет собой два текстовых блока с похожим поведением, наложенных друг на друга, чтобы воссоздать то же поведение, что и в старых текстовых логах чата. А экран выбора героев, хотя и выглядит просто, фактически загружает игрока в приостановленный матч в виде Виспа, а затем ждёт, пока игроки завершат выбор, и "освобождает" их, разблокируя камеру и подменяя героев.
Это сопровождалось двумя очень неприятными багами: блокировкой чата и блокировкой камеры/управления. В конце концов я использовал в качестве ориентира пару пользовательских игр на GitHub с похожим подходом, чтобы обойти эту проблему (к сожалению, я нигде не записал их названия), и к настоящему моменту эти баги, вроде как, в основном устранены (по крайней мере, мне больше не удалось их воспроизвести), и я очень доволен тем, насколько этот новый HUD близок к оригиналу.
Финальная версия
Во-первых, карта во всей своей красе! Ну и вы можете подписаться на неё и скачать в Steam по этой ссылке.
Геометрия игрового мира работает, навигационная сетка работает.
Я не хотел уделять слишком много внимания переработке каждого отдельного предмета и умения, поэтому там, где это было возможно, я использовал системы современной Dota. Это означает, что некоторые тонкости, связанные с устаревшими типами урона, также не были полностью перенесены. Тем не менее я постарался сохранить некоторые классические "механики" (например, стакающиеся Mekansm, BKB с рефрешером, старую версию Blade Mail), но в этой версии, скорее всего, не будет старых багов или каких-то интеракций.
Поскольку в этой сборке не было большого количества героев, но многие из них были отчасти проработаны и существовали в файлах, я добавил флажок "включить WIP героев". У большинства этих героев не было анимаций и скелетов в моделях. Модели этих героев были реконструированы с помощью вставки скелетов и ручной настройки, а сверху к ним были добавлены современные анимации. Примерами героев с переработанными анимациями являются Zeus (не имел анимаций), Phantom Lancer (имел раннюю модель только с анимацией ожидания), Witch Doctor (временная модель), Shadow Shaman, Tiny, Lich (ранние модели). К счастью, геометрия моделей во многих случаях довольно хорошо соответствует современным версиям.
Звуки перенесены по максимуму, как есть.
Освещение настроено так, чтобы максимально приближаться к оригинальной альфа-версии.
Смешивание текстур, визуальные эффекты, модели и всё остальное работают.
Моя любимая часть — экран выбора героя и HUD, воссоздающие вайб оригинальной альфы. Правда, они могут иногда вести себя странно.
Также на финальном экране есть кнопка "скопировать stats blob", чтобы сохранить JSON объект, по структуре похожий на ответы OpenDota API, чтобы можно было залогать статистику таких вот матчей.
- Иногда косметические предметы отображаются на героях противника, которых видишь в первый раз из тумана войны
- Я подозреваю, что это из-за совпадения имен костей старых и новых моделей, и если это и была причина, то в последней сборке проблема должна исчезнуть
- В настройках пользовательской игры есть параметр "DisableWearables", но, похоже, он не работает уже пару месяцев
- Из-за экрана пользовательского драфта возникают некоторые проблемы: окно чата становится невидимым (обойти проблему можно так: откройте настройки, щёлкните по строке поиска, закройте настройки — это сбросит фокус текстового поля) или камера застревает в небольшой части карты.
- Большинство этих проблем должно было быть устранено, но если вы столкнётесь с ними и сможете найти способ стабильно воспроизвести их — пожалуйста, пришлите мне информацию об этом в Discord или по электронной почте
- Чат в пользовательском HUD тоже работает немного странно
Кроме того, я устал постоянно переключаться между версиями для Windows/Proton и Linux/Native во время работы над этим проектом, поэтому в итоге написал для себя несколько скриптов, чтобы загружать бинарные файлы для Windows и инструменты Workshop, настраивать символьные ссылки на ресурсы нативной версии и обновлять всё это.
Под конец работы я облагородил это в нечто более целостное, так и появился скрипт-лаунчер.
- автоматически обновлять инструменты
- запускать игру с определённой версией инструментов Workshop
- добавлять запись о себе в библиотеку Steam
- создавать рендер выбранной карты в высоком качестве
- Метод тот же, что в руководстве от Devilesk, которое я использовал для настройки своего собственного файла сессии, обновлённого до версии 7.33, когда я обновлял Интерактивную Карту
- Перед запуском рендеринга запускается несколько специальных скриптов, которые немного улучшают внешний вид карты: они основаны на тех, которые я уже использовал сам (или делал то же самое вручную), в основном восстанавливая эффект потока лавы на стороне Dire, корректируя некоторые эффекты и освещение, а также исправляя материалы на углах карты
- Этот скрипт использует тот же файл сессии, но запускает SFM на виртуальном экране, автоматически запускает "прогревны" рендеринг, а затем рендерит кадры для панорамы
- После завершения рендеринга начинается этап сшивки, в ходе которого вычисляется средний тон для всех кадров, определяются точки сшивки, а затем создаётся одна гигантская панорама карты + обрезанная версия с использованием координат из конфигурации обзора карты + предварительный просмотр с более низким разрешением
Позже я создам для него отдельный репозиторий/установщик (и оставлю ссылку здесь и на своём сайте).
Я также хочу опубликовать скрипты и инструменты, которые использовал при портировании, но работа над ними ещё не завершена, да и это был мой первый, проект, в котором, кхм, мне в значительной степени помог Claude.
Что дальше?
Я хочу провернуть такое и для других сборок. Конечно, сначала для пары альфа-версий, но потом я хочу сделать то же самое для версий карты со всех The International до 2016 года.
Надеюсь Valve не огорчатся из-за такого проекта. Просто мне очень уже нравится история развития Доты.
Чтобы следить за апдейтами по теме, можете зайти в мой Discord, Telegram (ru), Bluesky или Twitter. Или прям тут подписаться. Есть ещё Patreon и Boosty.
Было бы круто, если бы удалось перенести сюда и карту из Heroes of Newerth или оригинальную DotA, но я не думаю, что эти версии когда-нибудь станут общедоступными из-за проблем с авторскими правами. Хотя я всё равно хотел бы создать что-то подобное. Над чем-то подобным для WC3 DotA сейчас работает CrystalScepter в рамках своей карты Dota Classic.
У меня есть ещё куча вещё, о которых я хотел бы написать, например, ежегодный обзор The International или пост об обновлённых тирлистах героев и уровнях меты. Наверное, я потихоньку начну разгребать этот бэклог постов в ближайшее время.
P.S. Спасибо Пиробуреку за помощь со сбором людей для плейтестов.