Первые исполняемые файлы Quake (quake.exe и vquake.exe) программировали на HP 712-60 с NeXT и кросс-компилировали при помощи DJGPP, запущенного на DEC Alpha server 2100A. В июне 1996 года, после выпуска игры, id Software, озабоченная стагнацией NeXT, решила поменять стек разработки.
Сразу после выпуска Quake мы перешли на оборудование Intergraph с Windows NT.
- Джон Кармак[1]
Следующие версии Quake (winquake.exe, glquake.exe) и QuakeWorld (qwcl.exe и qwsv.exe) разработаны и скомпилированы в Windows NT с помощью Visual C++ 4.X.
В этой статье описываются этапы по воссозданию процесса сборки двоичных файлов Quake win32 в том виде, в котором он происходил в 1997 году.
Уголок пуриста
В зависимости от нужной вам степени исторической точности можно выполнять эти шаги в одной из четырёх сред.
Найти рабочую станцию Intergraph RealizM Dual P6-200MHz (удачи вам в этом).
Найти машину со сдвоенными Pentium Pro (опять же, удачи, но найти W6-LI вполне возможно).
Использовать обычный PC конца 90-х наподобие Quake PC.
Скачать Oracle Virtualbox и создать VM.
Я протестировал эти этапы и на Quake PC, и в Virtualbox с Windows 98SE/Windows NT 4.0.
Установка Windows NT 4
Установить Windows NT 4 довольно просто, потому что CD загрузочный. Установка заняла 30 минут.

Мне нравится минималистичность экрана запуска Windows NT. На нём гордо демонстрируется количество обнаруженных CPU (Windows 95/98 поддерживают только один CPU) и объём ОЗУ. Никаких дурацких анимаций.
Добавленный в систему второй CPU не распознаётся Windows NT автоматически. Необходимо выполнить переустановку, чтобы получить HAL, работающий с системами SMP. То же самое относится и материнской плате для двух CPU. На W6-LI необходимо добавить не только ещё один Pentium Pro, но и регулятор!

В Windows NT 4 используется та же тема UI, что и в Windows 9X. В первом релизе Windows NT 3 использовались те же элементы UI, что и в Windows 3.1. Это выглядело ужасно.
Установка Visual C++ 6
Версия Quake для Win32 кодировалась в Visual C++ 4.X, потому что это была самая новая версия IDE Microsoft, доступная в середине 1996 года. Однако к 1999 году проект мигрировал на Visual C++ 6. Если у вас нет под рукой CD, то вы, вероятно, сможете найти его в Internet Archive или на сайте winworldpc.com.

В эпоху, когда Интернет был доступен не всегда, в большинстве ПО для борьбы с пиратством использовались ID продукта.

На экране установки также упоминается следующая «Visual Studio», соединяющая в себе множество сред разработки. Вскоре она станет главной IDE компании Microsoft.

Экран установки выглядит странно. На нём много пустого места, а полоса прогресса размещена неудачно. Microsoft не ожидала, что он будет работать в безумно высоком разрешении 1280x1024 (которое, вероятно, использовали разработчики id на своих 21-дюймовых мониторах). Нормально экран выглядит только в разрешениях 640x480 и 800x600.


После установки VC++6 нам нужно получить исходный код. НЕ НУЖНО скачивать его с github или передавать файлы через FTP. Это испортит файл рабочего пространства .dsw, после чего VC++6 не сможет его распарсить. И она даже не выдаст сообщения об ошибке, просто откроется и покажет, что нет никаких связанных файлов/проектов, а вы потеряете полдня в попытках отладить проблему.
Вместо этого вам нужно скачать q1source.zip. Когда-то он был выложен на FTP-сервере id Software, но теперь его можно найти в потрясающем Quake Official Archive, поддержкой которого занимается Джейсон Браунлесс[2].

В VM можно перемещать файлы перетаскиванием. Или же можно использовать Quick ‘n Easy FTP Server, работающий в 9X/NT.

Для распаковки q1source.zip вам понадобится WinRar. В 9X/NT хорошо работает версия 2.50.

Теперь запускаем VC++6, выбираем «Open Workspace» и «WinQuake.dsw».
В современных версиях Visual Studio используются .sln (Solution) и .vcxproj, однако в Visual C++ 6 используются .dsp и .dsw. Файл dsp содержит один проект, а dsw — это рабочее пространство, указывающее на проект dsp.

Начнём сборку с «Rebuild All»

Сборка будет неудачной, потому что VC6++ не сможет собрать все файлы .s, содержащие ассемблерный код, вручную оптимизированный Майклом Абрашем.

Файлы .s собираются при помощи этапа «mycoolbuild» «Custom Build», для которого используется ассемблер ml.exe. Он поставляется вместе с VC++6 Processor Pack (vcpp5.exe).

Сначала устанавливаем Visual Studio 6.0 Service Pack 5 (vc6sp5.exe). Разумеется, запуск setupsp5.exe завершится неудачей, потому что нужно установить MDAC 2.5.

Не теряйте час на поиск и скачивание MDAC откуда-нибудь ещё, вам просто нужен mdac_typ.exe, находящийся в той же папке, которую создал vs6spp5.exe при своей распаковке.

Теперь запустим setupsp5.exe. На этот раз всё заработает. Но теперь это похоже на игру в квест Monkey Island по текстовому прохождению. Логика совершенно теряется. Да, мы ушли глубоко в 90-е.

Такая мелкая полоса прогресса... но прогресс всё же есть!

Устанавливаем VC++6 Processor Pack (vcpp5.exe). Теперь нужно поместить ml.exe рядом с cl.exe в папке bin VC++6. Снова открываем проект в VC++6 и снова запускаем «Rebuild All». На этот раз должно сработать.

Да, всё собралось! Осталось скопировать PmProXX.dll, WdirXX.dll и id1, после чего игра должна запуститься. Можно даже собрать/запустить QuakeWorld, и он будет работать с QSpy!

Чертовски хорошая IDE
Для 1996 года VC++6 была на удивление мощной. У неё были такие возможности, как «Go to definition», точки останова, трассировка стека и исследование переменных (однако пока без автоматического завершения Intellisense). В то время я ею не пользовался, но, наверно, для разработчиков это было настоящей сказкой.



Источники
[1] Интервью с Джоном Кармаком
