Devilution: проект по реверс-инжинирингу Diablo
Как показывают годы, шансов увидеть оригинальный исходный код — или хотя бы ремейк — первой части Diablo у нас практически нет (событие The Darkening of Tristram в Diablo III в честь 20-летия выхода первой части — это, конечно, хорошо, но все же немного не то, чего ожидали поклонники). И пусть последнее обновление для игры вышло в 2001 году, и сама Blizzard давно перестала поддерживать и продавать ее — память о ней по-прежнему остается жива в наших сердцах. Что лишний раз и подтвердил некий GalaXyHaXz, решивший произвести реверс-инжиниринг игры.
Исходный код доступен на Github. Проект Devilution, который его автор GalaXyHaXz окрестил «деволюцией Diablo», занял у него свыше 1,200 часов — 4 месяца работы. Также не пропустите объемные комментарии автора, проливающие свет на исходный код игры, и расположенные в другом репозитории. Сам код пока выглядит неважно, но будет продолжать приводится в порядок по мере прогресса работы над другими модулями игры.
Идея реверс-инжиниринга настолько большого проекта поначалу казалась фантастической задачей, если бы не одна счастливая случайность — или, другими словами, небольшой недосмотр, приключившийся 20 лет назад.
B 1998 году Blizzard отдала исходный код Diablo двум студиям: Synergestic Software, которая занималась разработкой дополнения Hellfire, и Climax Studios, работавшей над портом для Playstation. Отдел QA Sony в Японии не в первый раз «радует» своими утечками, отличились они и на этот раз — в японской версии порта был случайно забыт символический файл (a symbolic file), который включал в себя функции, данные, типы и многое другое. Это и позволило восстановить оригинальные функции, глобальные переменные, структуры данных и прочее. Бета-версия порта для Playstation также утекла, и в ней лежал еще один подобный файл, что значительно упростило задачу.
В довершение всего, отладочный билд PC-версии игры всегда лежал прямо на ваших дисках с игрой, спрятанный в архиве DIABDAT.MPQ → D1221A.MPQ → DIABLO.EXE. Билд содержит инструменты для отладки, которые отсутствуют в релизной версии, а также большое количество ассертов строк, благодаря которым удалось воссоздать имена файлов, функций — даже номера строк кода максимально приближены к оригиналу.
Разработка Diablo началась примерно в то время, когда вышла Windows 95. Соответственно, под нее игру и оптимизировали. Для компиляции игры был использован Microsoft Visual C++ 4.20, который в последующих патчах обновили до версии 5.10. С целью точного воспроизведения оригинального кода, в проекте была сохранена совместимость с этими версиями компиляторов, однако доступны Makefile для современных компиляторов. Исполняемые бинарные файлы, получившиеся по итогам компиляции, согласно отчетам работают на Windows 7, Linux-WINE и Windows 10.
Небезызвестный факт, что игра серьезно менялась на протяжении проекта, и многие идеи были вырезаны из нее прямо перед релизом —, а мультиплеер был добавлен на скорую руку.
Многие создатели модификаций для игры (например, авторы мода The Hell) уже заходили достаточно далеко в своих изысканиях по исследованию кода, в том числе при помощи внедрения в память процесса; однако, результаты своего труда они не публиковали, и многие из подобных модов были заброшены на полпути. Если Devilution удастся довести до определенной степени готовности, подобной проблемы можно будет избежать — плюс узнать что-то новое про саму игру.
На данный момент произведен реверс-инжениринг Diablo.exe. Остаются еще несколько библиотек, которыми предстоит заняться: Battle.snp (устаревший протокол Battle.Net), DiabloUI.dll (код главного меню игры, целиком завязан на Windows и плохо написан), Standard.snp (код локального мультиплеера, устаревший, аналогичен используемому в Starcraft) и еще пара модулей.
Теоретически, в ближайшем будущем (после реверсинга DiabloUI.dll) игра может стать кросс-платформенной — если, конечно, Blizzard не поспешит прикрыть лавочку раньше, чем автор сможет привлечь к решению этой задачи достаточно энтузиастов.
P.S. А вот насчет Diablo II все не так однозначно: игра продолжает продаваться и поддерживаться Blizzard, объем ее кодовой базы — примерно в 8 раз больше, чем у оригинала, да и ходят слухи, что официальный ремастер не за горами — поэтому ее полноценного реверс-инжиниринга в обозримом будущем ждать не приходится.