image

Я изучал ванильный исходный код игры Wolfenstein 3D 1992 года. Несмотря на то, что ей уже 25 лет, и она совершенно устарела для современных платформ, её всё равно можно скомпилировать, если воссоздать окружение.

Для этого требуется всего лишь:

  • Исходный код Wolfenstein 3D.
  • DosBox.
  • Компилятор Borland C++ 3.1.
  • Wolfenstein 3D shareware (чтобы позаимствовать ресурсы).

Настройка файловой системы


Откроем командную строку и создадим две папки, по одной для каждого из необходимых дисков DOS:

   cd ~
   mkdir system
   cd system
   mkdir c
   mkdir a
   cd ~

Скачиваем файлы


  • Скачиваем Borland 3.1 в system/a.
  • Скачиваем исходный код Wolfenstein 3D в system/c
  • Скачиваем файлы VGA в system/c (в конце статьи я объясню, зачем это нужно).

    cd system/a
    curl -O http://fabiensanglard.net/Compile_Like_Its_1992/tools/BCPP31.zip    

    cd ../c
    curl -O http://fabiensanglard.net/Compile_Like_Its_1992/tools/wolfsrc.zip
    curl -O http://fabiensanglard.net/Compile_Like_Its_1992/tools/vgafiles.zip

Теперь все файлы находятся в файловой системе. Просто чтобы проверить, введём:

   cd ..
   find ~/system

У вас должно получиться следующее:

    /Users/fabiensanglard/system
    /Users/fabiensanglard/system/a
    /Users/fabiensanglard/system/a/BCPP31.zip
    /Users/fabiensanglard/system/c
    /Users/fabiensanglard/system/c/vgafiles.zip
    /Users/fabiensanglard/system/c/wolfsrc.zip

Распаковываем всё


    cd ~/system/a
    unzip BCPP31.zip

    cd ~/system/c
    unzip vgafiles.zip
    unzip wolfsrc.zip

DosBox


Скачаем и запустим DosBox:



Монтируем


Смонтируем файловую систему, по одной папке для каждого из дисков:

   Z:/> mount c ~/system/c 
   Z:/> mount a ~/system/a

Устанавливаем компилятор


Настало время установить Borland C++ 3.1:

    Z:\> a:
    A:\> cd BCPP31
    A:\> install



Нажмите «ввод» при выборе исходного диска (должен быть выбран диск A)



Оставим все параметры по умолчанию и выберем «Start Installation»:



Уведомления предупреждают, что не удаётся найти папку Microsoft Windows, но она нам не нужна, просто нажмём «ввод».







Устанавливаем исходный код Wolfenstein 3D


Система работает и в ней есть компилятор: настало время распаковывать (снова) исходный код.

  A:\> c:
  C:\> cd  C:\> install



Введём «C»



Оставим путь по умолчанию: \WOLFSRC



Подтвердим («Y») создание директории.

Устанавливается!



Компилируем


Запускаем Borland C++ 3.1:

     C:\> cd     C:\> cd borlandc
     C:\> cd bin
     C:\> bc.exe




После нажатия на OK, используем мышь или горячие клавиши, чтобы выбрать Project > Open Project ..\..\WOLFSRC\WOLF3D.PRJ:



Выберем Options > Directories и изменим значение следующим образом:

    Include Directories: C:\BORLANDC\INCLUDE

    Library Directories: C:\BORLANDC\LIB

    Ouptput Directories: OBJ

    Source Directories:  C:\WOLFSRC



Попробуем скомпилировать: Compile -> Build All



Мы получим ошибку: «Cannot find executable TASM»



Выйдем из Borland C++, нужно настроить PATH:

     C:\> CD ..
     C:\> PATH=C:\BORLANDC\BIN
     C:\> BC.EXE

Снова попробуем скомпилировать (Compile -> Build All):



Компилирование выполнилось, но возникла ошибка компоновки: «Unable to find OBJ file», потому что путь к SIGNON.OBJ и GAMEPAL.OBJ в проекте указан неверно.

Они отмечены в C:\SOURCE\WOLF\:



Удаляем их из проекта (Выберем Projext > Delete item). Добавим их снова через PROJECT > Add Item…. Добавляем WOLFSRC\OBJ\SIGNON.OBJ и WOLFSRC\OBJ\GAMEPAL.OBJ



Попробуем скомпилировать снова (Compile > Build All)



Сработало! Но запустится ли игра?



Достаём ресурсы


Скачайте shareware-версию, или даже лучше: купите как полную версию Wolfenstein 3D.

    cd ~/system/c
    curl -O http://fabiensanglard.net/Compile_Like_Its_1992/tools/1wolf14.zip
    unzip 1wolf14.zip

Вернёмся в DosBox и установим игру в C:\WOLF3D.

  C:\> c:
  C:\> cd   C:\> cd 1wolf14
  C:\1WOLF14> install

После установки игры скопируем только что скомпилированный файл .EXE в папку игры,

    C:\> c:
    C:\> cd wolf3d
    C:\WOLF3D> copy WOLF3D.EXE WOLF3D.OLD
    C:\WOLF3D> copy ../WOLRSRC/WOLF.EXE

Запускаем игру


Попробуем запустить:

    C:\> cd wolf3d
    C:\WOLF3D> copy WOLF3D.EXE WOLF3D.OLD
    C:\WOLF3D> copy ../WOLRSRC/OBJ/WOLF3D.EXE .
    C:\WOLF3D> WOLF3D.EXE

Хм, выглядит странно…



Ой…



Что?



Не припомню, чтобы игра была такой…



Так, где-то возникла ошибка!

Что случилось?


Дело в конвейере производства игры и в том, как он использовался движком. Когда Адриан Кармак и Кевин Клауд заканчивали работу над всеми графическими файлами, они использовали инструмент IGRABed для их упаковки. В результате получалось 3+2 файла.

  • VGAHEAD.WL1
  • VGAGRAPH.WL1
  • VGADICT.WL1

Файл VGAHEAD — это индекс, содержащий указатели на VGAGRAPH, в котором хранятся данные, сжатые алгоритмом Хаффмана. VGADICT содержит словари Хаффмана для распаковки данных.

Два других созданных файла:

  • GRE.H
  • GRE.EQU

компилируются в движок, как показано на рисунке ниже:



Для чего нужны файлы .H и .EQU? Если вкратце, то они позволяют получать доступ по имени. Когда IGRABed собирает все файлы, он также создаёт перечисление (enum) с соответствующими индексами:

GRE.H

            enum{ 
            H_WOLFLOGOPIC
            GETPSYCHEDPIC
            L_GUYPIC
            .
            .
            } graphicnums

GRE.EQU

            H_WOLFLOGOPIC  = 0
            GETPSYCHEDPIC  = 1
            L_GUYPIC       = 2

Таким образом, когда движок запрашивает нужный ресурс, он может использовать логическое имя (L_GUYPIC), а не «магическое число» (2).

Это значит, что движок выпускался с жёстко заданными индексами изображений в файлах VGA. Поскольку ресурсы и база кода эволюционировали после выпуска wolf3D shareware (в Spear of Destiny), новые скомпилированные индексы игры не совпадают с расположением исходных файлов ресурсов.

Запускаем игру (снова)


К счастью, у этой проблемы есть простое решение: кто-то сгенерировал ресурсы VGA заново, чтобы они совпадали с индексами в файлах .H и .EQU, выпущенных с исходным кодом. Просто скопируем эти файлы (если вы используете ресурсы из shareware-версии, то нужно будет изменить расширение файлов с .WL6 на .WL1).

  C:\> copy C:\vgafiles\VGADICT.WL6 C:\WOLF3D\VGADICT.WL1
  C:\> copy C:\vgafiles\VGAGRAPH.WL6 C:\WOLF3D\VGAGRAPH.WL1
  C:\> copy C:\vgafiles\VGAHEAD.WL6 C:\WOLF3D\VGAHEAD.WL1

Попробуем снова:

  C:\WOLF3D> WOLF3D.EXE

Работает!



Но мы всё ещё не закончили!

Буфер кадров VGA и соотношение сторон экрана


Это может быть неочевидно для людей, никогда не видевших оригинальную игру, но представленная выше картинка из DosBox не совсем совпадает с тем, что видели игроки в 1992 году. Буфер кадров VGA имел размер 320x200, но у ЭЛТ-мониторов соотношение сторон равно 4:3. Это значит, что буфер кадров при отправке на монитор вертикально растягивался. В DosBox есть опция для компенсации этого:

     vi ~/Library/Preferences/DOSBox\ 0.74\ Preferences
  
    [render]
    # frameskip: количество кадров, пропускаемых DOSBox при отрисовке кадра.
    # aspect: выполнять коррекцию соотношения сторон. Если способ вывода не поддерживает масштабирование, то это может привести к замедлению работы!
    # scaler: используется для расширения/улучшения режимов низкого разрешения.
      # Если использована опция 'forced', то scaler используется, даже когда результат может оказаться неправильным.
      # Возможные значения: none, normal2x, normal3x, advmame2x, advmame3x, advinterp2x, advinterp3x, ...

    frameskip=0
    aspect=false
    scaler=normal2x

Поменяем значение aspect на true.

Попробуем снова:

  C:\WOLF3D> WOLF3D.EXE

Наконец-то заработало!




Поделиться с друзьями
-->

Комментарии (35)


  1. iCpu
    15.06.2017 10:36
    +6

    Не думал, что скажу это, но… Тогда это было проще.


    1. icCE
      15.06.2017 23:15
      +3

      Вот первая мысль была, конечно проще. С другой стороны, я собираю старые машины и их периодически включаю. Когда начинаешь что-то делать, возникают неожиданные проблемы. Кажется и железо нормальное, а по тем временам вообще топ и помнишь все. Но нет, несовместимость в разных местах, косяки разработчиков.
      Времени на установку занимает порядочно. Вспомнить, что раньше все это еще надо было найти и скачать (про купить можно забыть). Почитать доки как установить. Это сейчас,dosbox трах бах и готово.

      Вот попробовать на такой матери скомпилировать :) Интересно долго будет?


      1. iCpu
        16.06.2017 08:00

        Обратно, попробуйте собрать тот же OpenSSL на какой-нибудь нестандартной архитектуре или операционной системе. Я не говорю о миграции на «Эльбрусы», даже просто переход на какой-нибудь старый x86 форк Дивана — огромная боль. И тем более, сборка движка Source с сохранением приличной производительности на ARM5.

        Так что всё относительно, медлительность сборки и отсутствие удобных средств разработки с лихвой компенсируется общей примитивностью конкретного оборудования и небольшим объёмом кодовой базы.


        1. icCE
          16.06.2017 18:50

          ну вы тут смешиваете, хотя и это в общем на текущий момент не помеха.
          Есть тулчайны, эмуляторы — которые в общем делают жизнь проще.
          Сборка движку Source для ARM5, это уже не просто взять исходники и собрать. Это уже оптимизация под архитектуру. В статье мы этим не занимаемся.

          Сейчас для каждого уже настолько обыденность интернета и доступности информации вокруг. У каждого мобильник которым он может снять видео, фото, записать голос и сразу опубликовать для всех. Еще в 2003 году не было такого обилие и живем мы в такой роскоши жалкие 10 лет (по моим примеркам все стало меняться в 2007-2008 годах). Только старые вещи дают понять, насколько все было сурово. Как мы выкачивали инфу через BBS/FIDO/USENET. Поэтому да, сейчас проще такие вещи делать.


          1. iCpu
            19.06.2017 07:45

            Доступность? Попробуйте найти даташит на какой-нибудь не очень обычный контроллер, да хотя бы алгоритмы получения POST-кодов по PCI-e и их список. Получение информации о BIOS'е, комплектующих и прочем — так же. Всё это гуглится с огромным трудом, и, что хуже, с куда большим трудом реверсится. А ряд запросов просто не гуглится, потому что какой-то умник сделал сокращение или название в унисон модному хештегу, так что даже белый пояс по гугл-фу не даёт пробиться сквозь решёточки.

            Я в одном согласен, раньше было очень по другому.


      1. da-nie
        16.06.2017 21:43

        О! У меня почти такая же есть. :) Надо попробовать как-нибудь её достать и запустить BC3.1. :) А сама игра на ней идёт так: https://www.youtube.com/watch?v=4hYXPHeZ7aA

        Кстати, Idot сделал на OpenGL Wolf-3D. :)


        1. icCE
          16.06.2017 22:20
          +1

          Ну эту мать удалось спасти, так как батарейка сделала свое черное дело.
          Ремонтом уже занимался не я, так как у меня ушло бы больше времени.
          Вот тут можно посмотреть, что в общем делали. Там и взрывы были :)


          1. da-nie
            16.06.2017 22:34

            Там 8 МГц процессор. И турбо, действительно, не включено.
            А каким образом 8 МГб поставить на такую плату? Там же память на рассыпухе.


            1. icCE
              16.06.2017 22:36

              Тогда не удивительно, что тормоза на весь экран. Но все равно, надо отдать должное, что Кармак и команда сделали возможным запуск на 80286 с такими параметрами.


            1. icCE
              17.06.2017 01:11

              На моей плате есть SIPP, это прообраз SIMM и он обратно совместим (кроме ног)
              У меня есть мать 80286 и с simm разъемами сразу.
              Другой момент, что в общем и целом для обывателя эти 8MB на 80286 вообще не нужны.


              1. da-nie
                17.06.2017 08:14

                А, увидел, внизу для SIPP места. Только SIPP совместим по ножкам с SIMM-30 Pin.


                1. icCE
                  17.06.2017 10:51

                  Ну все верно. Simm 30 pin :)
                  Мать понимает 2 мегабайтные модули.

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


  1. Pinsky
    15.06.2017 11:03
    +4

    Думал, что будет статья критикующая использование make-файлов и autotools и рекомендации перейти на более современные инструменты/виденье того, как должно быть.


  1. OlegTar
    15.06.2017 11:31
    +3

    Через 4 года выйдет первый квейк, и какой прорыв! Просто пропасть…


  1. kostus1974
    15.06.2017 12:08
    +1

    borland c++ 3 мать его 1! странное чувство возникло, что-то давно забытое… как запах школьной столовой в первом классе… но нет, это не слёзы умиления. хорошо, что этого больше нет.


    1. shukan
      16.06.2017 18:35

      Вы правы. Этого больше нет.

      Скрытый текст


  1. MasMaX
    15.06.2017 12:33
    -8

    Первый набор команд заменяется одной строчкой:

    mkdir -p ~/system/{a,c}

    Это так, придирки немного))))


  1. jankovsky
    15.06.2017 13:41
    -23

    Зачем такие игры если их так сложно запустить. Еще и графика странная. Наверное пародия на олдскул.


    1. MasMaX
      15.06.2017 14:04

      Тег «ирония» забыл


    1. spikedviper
      15.06.2017 14:17
      +10

      Вы, наверное, хотели пошутить, но у вас это не вышло.


    1. relia
      15.06.2017 14:43
      +3

      Года 4 назад качнул OpenGL порт Duke Nukem 3D v 1.4 — у меня запускается на Windows 7 X64. К так и не увиденным мной в 90ых годах 60fps (играл в режиме VGA и с 9...12fps) добавилось еще и разрешение FullHD (правда синтетика сглаженная из исходных спрайтов, но все-таки). Побаловался немного — налетела ностальжи по студенческим годам :) Что-то в таких погружениях в светлые момент прошлого все-таки есть.


  1. Pusk1
    15.06.2017 14:17
    +1

    Спасибо за статью. Очень приятные воспоминания от окошек Борланда. Вспомнилось, как успевал сходить в туалет покурить, пока небольшой проект C++ компилировался на XT:) Паскаль компилировался на порядок быстрее.
    В 1992-м с файлами чаще из Norton Comander работали, но это придирки. Если такой хардкор с командной строкой, то где автономный компилятор?:)


    1. safari2012
      15.06.2017 15:37
      +2

      Турбо Паскаль (даже с турбовижн) компилировался за считанные секунды. А мои одногрупники, которые отважились пересесть на C++, не только покурить, но иногда даже пообедать успевали :)


      1. HEKOT
        16.06.2017 10:12
        +1

        А я до сих пор держу дома Virtual Pascal, на котором работал году эдак в 98. Кстати, кросс-компилятор для Win32, OS/2 и linux. Использую его, когда надо написать какую-нибудь мелочёвку и получить тёплые и ламповые ощущения от процесса.


  1. Rastishka
    15.06.2017 14:48

    О, а не пробовали подправить чтобы было HD разрешение?


    1. CarambaPirat
      15.06.2017 15:46
      +1

      А как без ресурсов подправить до HD? там же ресурсы не резиновые


      1. Rastishka
        15.06.2017 15:56
        -5

        Нет, чисто чтобы стены без ступенек были.
        А ресурсы пусть остаются какие есть. =)


        1. Rastishka
          16.06.2017 12:29

          За что минусы? Почему нельзя подправить разрешение, а ресурсы пусть растягиваются на принципу nearest neighbor? Ну да, что то сползет, если абсолютными координатами задано.


    1. relia
      15.06.2017 16:02
      +3

      Статья написана переводчиком, о чем есть метка в заголовке, — он слово в слово перевел страницу http://fabiensanglard.net/Compile_Like_Its_1992/index.php

      HD порты уже есть: http://www-personal.umich.edu/~jimw/games/
      image


      1. RiseOfDeath
        15.06.2017 16:55

        Должен заметить, что он выглядит отвратительно.


        1. relia
          15.06.2017 17:09

          IMHO не отвратительней исходника


          1. Pinsky
            16.06.2017 11:26

            Позвольте не согласиться.


  1. Luke0208
    16.06.2017 09:46
    +1

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


  1. Optimus_990
    21.06.2017 09:13

    Тут главное — процесс))
    К сожалению лично не застал эту игру, хорошо помню первый Doom.


  1. perfect_genius
    21.06.2017 16:43

    Надо было ещё бинарно сверить.