Компилируем, как будто на дворе 1992 год

в 6:53, , рубрики: borland c++, dosbox, Wolfenstein 3D, игры, Компиляторы, разработка игр, ретрогейминг

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:

Компилируем, как будто на дворе 1992 год - 2

Монтируем

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

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

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

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

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

Компилируем, как будто на дворе 1992 год - 3

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

Компилируем, как будто на дворе 1992 год - 4

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

Компилируем, как будто на дворе 1992 год - 5

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

Компилируем, как будто на дворе 1992 год - 6

Компилируем, как будто на дворе 1992 год - 7

Компилируем, как будто на дворе 1992 год - 8

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

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

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

Компилируем, как будто на дворе 1992 год - 9

Введём «C»

Компилируем, как будто на дворе 1992 год - 10

Оставим путь по умолчанию: WOLFSRC
Компилируем, как будто на дворе 1992 год - 11

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

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

Компилируем, как будто на дворе 1992 год - 12

Компилируем

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

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

Компилируем, как будто на дворе 1992 год - 13

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

Компилируем, как будто на дворе 1992 год - 14

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

    Include Directories: C:BORLANDCINCLUDE

    Library Directories: C:BORLANDCLIB

    Ouptput Directories: OBJ

    Source Directories:  C:WOLFSRC

Компилируем, как будто на дворе 1992 год - 15

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

Компилируем, как будто на дворе 1992 год - 16

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

Компилируем, как будто на дворе 1992 год - 17

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

     C:> CD ..
     C:> PATH=C:BORLANDCBIN
     C:> BC.EXE

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

Компилируем, как будто на дворе 1992 год - 18

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

Они отмечены в C:SOURCEWOLF:

Компилируем, как будто на дворе 1992 год - 19

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

Компилируем, как будто на дворе 1992 год - 20

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

Компилируем, как будто на дворе 1992 год - 21

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

Компилируем, как будто на дворе 1992 год - 22

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

Скачайте 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

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

Компилируем, как будто на дворе 1992 год - 23

Ой…

Компилируем, как будто на дворе 1992 год - 24

Что?

Компилируем, как будто на дворе 1992 год - 25

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

Компилируем, как будто на дворе 1992 год - 26

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

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

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

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

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

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

  • GRE.H
  • GRE.EQU

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

Компилируем, как будто на дворе 1992 год - 27

Для чего нужны файлы .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:vgafilesVGADICT.WL6 C:WOLF3DVGADICT.WL1
  C:> copy C:vgafilesVGAGRAPH.WL6 C:WOLF3DVGAGRAPH.WL1
  C:> copy C:vgafilesVGAHEAD.WL6 C:WOLF3DVGAHEAD.WL1

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

  C:WOLF3D> WOLF3D.EXE

Работает!

Компилируем, как будто на дворе 1992 год - 28

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

Буфер кадров 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

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

Компилируем, как будто на дворе 1992 год - 29

Компилируем, как будто на дворе 1992 год - 30
Компилируем, как будто на дворе 1992 год - 31

Автор: PatientZero

Источник

Поделиться

* - обязательные к заполнению поля