Devilution: проект по реверс-инжинирингу Diablo

    image

    Как показывают годы, шансов увидеть оригинальный исходный код — или хотя бы ремейк — первой части 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 раз больше, чем у оригинала, да и ходят слухи, что официальный ремастер не за горами — поэтому ее полноценного реверс-инжиниринга в обозримом будущем ждать не приходится.
    Поделиться публикацией
    Комментарии 28
      +12

      Если сделают на этой основе OpenDiablo (как сделали OpenTTD), будет очень круто. Всё-таки во 2 части атмосфера уже не такая густая, ну а про 3 в приличном обществе и говорить нечего.

        +7
        Первая Diablo и без Hellfire была настолько мрачной, что невольно хотелось сохраниться лишний раз перед спуском на следующий уровень, не говоря уже о местах вроде логова Мясника или «Зала слепых».
          0
          Мрачно было бегать компанией на сложных уровнях — сложные монстры и слишком много дури в персонажах, можно было легко поубивать друг друга. Если играешь за прокачанного мага и кастуешь Lighting — на другом краю карты напарники легко погибали. Приходилось их вытаскивать. А уж какая коллекция ушей была собрана… :-)
            +1
            Fresh meat!
              0
              Да, причём, логово Мясника в самом начале игры, где всё относительно спокойно. Моя реакция:
              Спойлер
              image

              Зато урок «не всё стоит бездумно открывать» был усвоен.
              0
              Всё-таки во 2 части атмосфера уже не такая густая, ну а про 3 в приличном обществе и говорить нечего.

              А вы не вводитесь в заблуждение похожим названием — это разные игры разных жанров. Diablo I — полуаркадный слешер с элементами рпг и мультиплеера, Diablo II — онлайн-рпг с элементами слешера, Diablo III — не знаю что, но тоже что-то другое.

                +10

                Ну я во 2 часть играл как в сингл:)

                  +6
                  А я вообще впервые про онлайн во второй части услышал.
                  0
                  с каких пор второй Дьявол стал онлайн рпг???? Второй был прямым продолжением первого с возможностью совместного прохождения, добавлены новые локации и улучшена графика. А вот третий уже пошел по стопам ВоВ'а и на мой взгляд, полный отстой
                    0
                    с каких пор второй Дьявол стал онлайн рпг???? Второй был прямым продолжением первого

                    Возможно в начале 2000-х он и рассматривался как продолжение первого, но уже году в 2005-2006 стало ясно, что главный его аспект (тот, которому игра обязана своей огромной популярностью) это именно мультиплеер. И именно под мультиплеер доделывался баланс начиная с 2003 года (патч 1.10), на сингл при этом тоже смотрели, но только с целью не испортить его ненароком до неиграбельного состояния. Более того, начиная с того же 1.10 официально заметная часть игрового контента недоступна в сингле и при игре по локалке, а доступна только через сервер.


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

                    По-моему вы в неё мало играли (мало — это например меньше года онлайн). Это гораздо больше, чем "апгрейднутое d1", но если её рассматривать только так, то я не удивлён, что некоторые её считают неатмосферной итд.

                      0
                      По-моему вы в неё мало играли (мало — это например меньше года онлайн). Это гораздо больше, чем «апгрейднутое d1», но если её рассматривать только так, то я не удивлён, что некоторые её считают неатмосферной итд.

                      Я в нее играл достаточно и продолжаю до сих пор играть в лицензию. Прошел первую, прошел вторую (играли по локалку с друзьями и ее можно было точно также играть и в сингл, тем же персом). Очень ждал третий, мне его дали бесплатно за подписку на WoW, но очень разочаровал… И все же второй это не онлайн РПГ, это хак энд слеш рпг, а онлайн это фишка близов, которые развили свой батлнет, до огромной империи
                  +2
                  Вроде как метелица весьма ревностно относится к своим детищам. Боюсь что у «опен диабло» будут проблемы уже из-за сеттинга. И да, согласен, первая диабла была лучшая по атмосфере.
                    0

                    Скорее всего да, будут проблемы.

                      0
                      Не забудьте посмотреть мод к первой части Diablo: The Hell, если ещё не видели. Сейчас я вижу, что там расплодились его версии. У меня какая-то установлена была, играл с большим удовольствием. Автор вроде русский (чеченец).
                        –1

                        К сожалению старая диабла по управлению уже не удобна, привычка wasd стала диктовать свои условия (:

                    +3

                    1200 часов = 4 месяца? По 300 часов в месяц?
                    Сурово.

                      –4
                      Он просто предан своему делу и двадцать часов сна в месяц для него вполне достаточны)
                      Линусу Торвальдсу бы его упорство и Linux, превосходящий Windows 7, был бы написан в 93-м году
                      +1
                      Я джвадцать лет ждал такую игру :)
                        0

                        Жалко, что возможность грабить корованы появилась только во втором диабло (ЕМНИП)

                          +1

                          Корован — это фургон с коровами?

                            0
                            Это паравозик из коров на «The Secret Cow Level»
                            0
                            Да, в первой можно было только пнуть корову, и она говорила «мууу». (В Хеллфайр не играл). А во второй — красота, титаны в руку, LF по площади — экран дохлых коров. С бердышами.
                          0
                          Ну недавно близы варик 3 довольна таки серьезно прокачали, мб и за дьяблу возмутится, я тока не понял какая итоговая цель то, просто модов наделать?
                            +1
                            Эх, приделать бы:
                            • высокое разрешение,
                            • моментальные движения по деревне,
                            • полный ассортимент у колдуньи,
                            • скрытие назойливой красной кнопки Level Up, когда увеличивать нечего,
                            • исправление бага с пропажей предметов,
                            • обозначение Goat Shrines и Cauldrons как надо,
                            • исправление бага с пробелами в Chain Lightning

                            и была бы отличная игрушка.
                              +1

                              Круто. Интересно, а найдутся ли умельцы, которые смогут такое проделать с Disciples 2?..

                                0
                                Было бы интересно увидеть первую диаблу с обновленной графикой. Ждем :)
                                  0
                                  Тоже хочу восхититься огромной работой и задать пару вопросов сведующим.
                                  1) Бегло окинул взглядом код и бросилось сразу в глаза обилие деклараций о соглашении вызовов —
                                  __fastcall
                                  и
                                  __cdecl
                                  вообще везде вплоть до, на мой взгляд невинного:

                                  void __fastcall foo(char *fname) {
                                       //далее работа с fname
                                       //.......
                                  }


                                  2) И второй вопрос — а не зашквар ли писать в c-style нынче (ну и тогда в 1995)?
                                    0
                                    Ради производительности (тогда) — точно не зашквар. Сейчас, скорее всего, низкоуровневую логику все равно будут писать на структурах, как раз чтобы сэкономить такты на работе фреймворков, а высокоуровневую уже можно писать на скриптовых языках.

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

                                  Самое читаемое