Я изучал ванильный исходный код игры 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://ift.tt/1plO4WM
cd ../c
curl -O http://ift.tt/1uEiwvS
curl -O http://ift.tt/1plO4WO
Теперь все файлы находятся в файловой системе. Просто чтобы проверить, введём:
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://ift.tt/1plO5dk
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
Наконец-то заработало!
Комментарии (0)