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)


  1. k12th
    19.06.2018 18:18
    +6

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


    1. GeMir
      19.06.2018 18:45
      +5

      Первая Diablo и без Hellfire была настолько мрачной, что невольно хотелось сохраниться лишний раз перед спуском на следующий уровень, не говоря уже о местах вроде логова Мясника или «Зала слепых».


      1. rtzra
        20.06.2018 06:19

        Мрачно было бегать компанией на сложных уровнях — сложные монстры и слишком много дури в персонажах, можно было легко поубивать друг друга. Если играешь за прокачанного мага и кастуешь Lighting — на другом краю карты напарники легко погибали. Приходилось их вытаскивать. А уж какая коллекция ушей была собрана… :-)


      1. vaniacer
        20.06.2018 10:56

        Fresh meat!


      1. Raftko
        21.06.2018 12:34

        Да, причём, логово Мясника в самом начале игры, где всё относительно спокойно. Моя реакция:

        Спойлер
        image


    1. firk
      19.06.2018 19:33

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

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


      1. k12th
        19.06.2018 20:25
        +4

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


        1. sumanai
          19.06.2018 22:40
          +4

          А я вообще впервые про онлайн во второй части услышал.


      1. Black_Zerg
        20.06.2018 17:08

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


        1. firk
          21.06.2018 17:31

          с каких пор второй Дьявол стал онлайн рпг???? Второй был прямым продолжением первого

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


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

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


          1. Black_Zerg
            21.06.2018 19:19

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

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


    1. daggert
      20.06.2018 00:33
      +1

      Вроде как метелица весьма ревностно относится к своим детищам. Боюсь что у «опен диабло» будут проблемы уже из-за сеттинга. И да, согласен, первая диабла была лучшая по атмосфере.


      1. k12th
        20.06.2018 00:34

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


      1. gohan
        20.06.2018 03:46

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


        1. daggert
          20.06.2018 16:35
          -1

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


  1. rezdm
    19.06.2018 21:02
    +2

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


    1. Dvlbug
      20.06.2018 00:06
      -1

      Он просто предан своему делу и двадцать часов сна в месяц для него вполне достаточны)
      Линусу Торвальдсу бы его упорство и Linux, превосходящий Windows 7, был бы написан в 93-м году


  1. vesper-bot
    20.06.2018 09:33

    Я джвадцать лет ждал такую игру :)


    1. TonyLorencio
      20.06.2018 16:03

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


      1. perlestius
        20.06.2018 18:30
        +1

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


        1. Lirein
          21.06.2018 05:39

          Это паравозик из коров на «The Secret Cow Level»


      1. vesper-bot
        21.06.2018 10:07

        Да, в первой можно было только пнуть корову, и она говорила «мууу». (В Хеллфайр не играл). А во второй — красота, титаны в руку, LF по площади — экран дохлых коров. С бердышами.


  1. bro-dev0
    20.06.2018 15:32

    Ну недавно близы варик 3 довольна таки серьезно прокачали, мб и за дьяблу возмутится, я тока не понял какая итоговая цель то, просто модов наделать?


  1. YuriM1983
    20.06.2018 16:41

    Эх, приделать бы:

    • высокое разрешение,
    • моментальные движения по деревне,
    • полный ассортимент у колдуньи,
    • скрытие назойливой красной кнопки Level Up, когда увеличивать нечего,
    • исправление бага с пропажей предметов,
    • обозначение Goat Shrines и Cauldrons как надо,
    • исправление бага с пробелами в Chain Lightning

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


  1. hardkotian
    20.06.2018 17:09

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


  1. almarc
    20.06.2018 17:09

    Было бы интересно увидеть первую диаблу с обновленной графикой. Ждем :)


  1. pavlushk0
    20.06.2018 18:25

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

    __fastcall
    и
    __cdecl
    вообще везде вплоть до, на мой взгляд невинного:

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


    2) И второй вопрос — а не зашквар ли писать в c-style нынче (ну и тогда в 1995)?


    1. vesper-bot
      21.06.2018 10:08

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