世界を動かす技術を、日本語で。

1997年のように「Quake」をコンパイルしよう

概要

Quake のWin32バイナリを 1997年当時の環境 でビルドする手順のまとめ。 Windows NT 4Visual C++ 6 のインストール方法の解説。 ソースコード取得ビルド時の注意点 を具体的に説明。 90年代の開発環境 の雰囲気やトラブルにも言及。 QuakeWorld のビルド・実行方法も紹介。

1997年当時のQuakeビルド体験再現

  • Quakeの初期バイナリ (quake.exe, vquake.exe)は HP 712-60(NeXT) で開発、 DEC Alphaサーバー でクロスコンパイル
  • 1996年6月、id Softwareは Intergraph製Windows NTマシン へ開発環境を移行
  • winquake.exe, glquake.exe, QuakeWorld (qwcl.exe, qwsv.exe)は Windows NT + Visual C++ 4.X で開発
  • 1997年当時の再現方法 として4つの選択肢
    • Intergraph RealizM Dual P6-200MHzワークステーション実機
    • Dual Pentium Proマシン(例:W6-LI)
    • 90年代後期の一般的なPC(Quake PC)
    • VirtualBox による仮想環境(Windows 98SEまたはWindows NT 4.0)

Windows NT 4のインストール

  • Windows NT 4CDブート対応、インストールは約30分
  • 起動画面 はミニマルで、検出CPU数・RAM容量を表示
  • デュアルCPU対応 には再インストールが必要(HALの切替)
  • W6-LIマザーボード の場合、CPU追加時に レギュレーター も必要
  • UIテーマ はWindows 9Xと共通、NT 3はWindows 3.1風で評価低

Visual C++ 6のインストール

  • Win32向けQuakeVisual C++ 4.X で開発、1999年以降は VC++6 に移行
  • インストールメディア はInternet Archiveやwinworldpc.comで入手可能
  • プロダクトID入力 が必要、次世代IDE「Visual Studio」も同梱
  • 高解像度 (1280x1024)ではインストーラ画面が崩れる(推奨:640x480/800x600)

ソースコード取得と注意点

  • GitHubやFTP経由の転送は禁止
    • .dswワークスペースファイル が壊れるため、VC++6で正常に開けなくなる
  • 推奨入手先 :Jason Brownless管理の Quake Official Archive
  • ファイル転送方法 :VMのドラッグ&ドロップ、またはQuick ‘n Easy FTP Server
  • q1source.zip の解凍には WinRar v2.50 が安定

ビルド手順とトラブル解決

  • VC++6 で「Open Workspace」→「WinQuake.dsw」を開く
    • .dsw =ワークスペース、 .dsp =プロジェクトファイル
  • 「Rebuild All」実行でビルド開始
    • エラー発生: .sファイル(アセンブリ) のビルド失敗
    • 原因: ml.exeアセンブラ が必要(VC++6 Processor Packに同梱)
  • 対策手順
    • Visual Studio 6.0 Service Pack 5 (vc6sp5.exe)を先にインストール
      • MDAC 2.5 (mdac_typ.exe)を先に実行しないとセットアップ失敗
    • Processor Pack(vcpp5.exe) をインストール、 ml.exe がbinフォルダに追加される
    • 再度「Rebuild All」実行でビルド成功

実行・検証と開発環境の特徴

  • PmProXX.dll, WdirXX.dll, id1 をコピーすればゲーム起動可能
  • QuakeWorld(QSpy対応) もビルド・実行可能
  • VC++6の特徴
    • 「定義へ移動」「ブレークポイント」「スタックトレース」「変数ウォッチ」等を1996年時点で搭載
    • Intellisense自動補完 は未搭載
    • 当時としては非常に先進的な統合開発環境

90年代開発環境の雰囲気

  • インストールやビルドの手順が複雑 で、些細なミスで数時間のロスも
  • 進捗バーやUIの不親切さ も時代を象徴
  • Monkey Island的な謎解き感覚 で進行する90年代の開発体験

参考リンク

  • Quake Official Archive (Jason Brownless管理)
  • Internet Archive / winworldpc.com (VC++6配布元)

Hackerたちの意見

「VC++6は1996年にしては驚くほどパワフルだったよね。『定義へ移動』、ブレークポイント、スタックトレース、変数の検査といった機能があったけど、まだIntellisenseの自動補完はなかった。使ったことはないけど、当時は夢のようだったんだろうね。」今や、VS6を使ったことがない世代がブログを書いてるし、俺も公式に年を取ったな。ちなみに、2009年までVS6を使ってたよ…それに、あれは1998年のソフトだし。マイクロソフトの名作リストを作ったら、間違いなくトップ5には入るだろうね。windbgやquickbasic、Windows 3.11と一緒に。

彼を若い奴みたいに言ってるけど、ファビアンは1983年からプログラミングしてるんだよ。https://fabiensanglard.net/40/

ターボパスカルは80年代後半にブレークポイントや変数の検査があったよ。スタックトレースもあったと思うけど、100%確信はないな。プロとして使ったほど年は取ってないけど、2000年代初頭に先生が入門プログラミングの授業で使ってたから、結構使ってた。デバッガーは素晴らしかったし、開発のループがすごくタイトだった。ウェブ開発に入るまでは、変更して→変更を確認するのが「速い」と感じたことはなかった。今でもほとんどのスタックでは悪いままだよ。

ああ、そうそう、VC++6.0。すごく長い間使われてたよね。最後に商業ソフトをリリースするために使ったのは2020年頃で、そのソフトの開発環境はVMマシンだった。顧客が年会費を払ってたそのソフトのソースコードリポジトリは何年も前に知らずに壊されてたから、VMイメージを必要に応じてコピーしてた。最新のイメージを見つけないと、変更したら他の最近の変更が抜け落ちて、顧客にはフランケンバージョンが届いちゃう。VMを起動すると、すでにVC++6が開いてるデスクトップが見えるし、ソフトをビルドする方法を示す十分な証拠もあった。変更を加えて、ビルドして、ユーザーに送るためにバイナリを慎重に抽出して、VMを再度凍結。今でもその状態で、毎年「最後のアップデート」のために引っ張り出されてるんじゃないかな。

2000年から2004年頃にVS6をプロとして使ってたけど、その頃もまだまだ元気だった。VC++は素晴らしかった。ただ、一つだけ今でも悪夢に出てくるのが、マイクロソフトの小規模チーム向けソース管理システムのVisual SourceSafe。使いにくいし(遅いし)、同時実行の問題でデータをよく失ってた。

100%同意。VC++6は全体的に際立った製品だったし、当時の選択肢の中で圧倒的に優れたIDEだった。残念ながら、VSCodeが出るまで製品ラインは悪化していったけど、今はずっと良くなったね。

Rational Apex Adaは、90年代の初めから後半にかけて、かなり先を行っていた開発プラットフォームだよ。マルチユーザーのホスティング開発環境で、インクリメンタルコンパイルや依存関係のトラッキング、構文や意味のエラーのハイライト、リポジトリ全体にわたるセマンティックサーチ(関数のシグネチャなど)、独自のバージョン管理システム(gitのサブモジュールスタイル)、コードを書くときの自動フォーマット機能があったんだ。リモートデバッグやエミュレーション機能(スタックトレース、コード行、逆アセンブルなど)もあって、VxWorksとの統合やツールも素晴らしかった。現代の言語にはまだないAdaの言語機能もたくさんあるしね。

今は、パフォーマンス最適化が最優先だった別のタイムラインのように感じる。時々、もし「使うリソースには常に気をつける」アプローチを放棄しなかったら、現在の開発エコシステムはどうなっていたんだろうと妄想することがある。ウェブ開発の立ち上げを含めて、数百MBのクロミウムエンジンをドックアプリ用に出荷するような感じで。

その多くの機能は、Turbo PascalやC++のためのBorlandのMS-DOSやWindows 3.x IDEでもすでに利用可能だったんだ。だからUNIX開発に入ったときは、開発ツールの石器時代に入ったように感じたよ。幸いにもXEmacsはすでにあったけどね。ちなみに、これは1993年にEnergize C++のために生まれたんだ! https://www.youtube.com/watch?v=pQQTScuApWk それと、Quakeのツール開発に使われたNeXTSTEPの開発環境がどうだったか、1991年のマーケティングビデオで見られるよ。 https://www.youtube.com/watch?v=UGhfB-NICzg だから、CLIやTUIのノスタルジーは理解できないっていつも主張してるんだ。当時そこにいたけど、これらのシステムを使うことができなかったから、お金が必要だったしね。

VC++6にはIntellisenseがあったと思ったんだけど。あんまり深く調べるつもりはないけど、ウィキペディアも俺の意見に同意してるみたいだし(https://en.wikipedia.org/wiki/Code_completion#Visual_Studio) - 参考としてはあんまり良くないけど、確かにあったことを示唆してるね。 「IntelliSenseのVisual Basicバージョンは、Visual C++の5.0および6.0(Visual Studioの命名シーケンスでは97と98)のバージョンよりも常により堅牢で完全だった。」

問題はIDEじゃなくて、当時のWin32 APIのドキュメントがすごくひどく書かれてたことだよ。それで多くのプログラムが苦しんでた。

VC++ 6は最高だった。もしVC++ 6やBorland Delphiの海賊版を持ってなかったら、今のキャリアはなかったと思う。しかも、見た目がすごくクリーンでシャープだよね。すべてのピクセルに意味がある。

「setupsp5.exeを再実行してみて。今度はうまくいくはず。まるでモンキーアイランドの解決策を追ってるみたいだね。何もかも意味がわからない。90年代にどっぷり浸かってるのは間違いない。最高だ。」

これ、2つの警告でコンパイルできるんだ。すごいコードベースだよ。ジョン・カーマックは確実に別次元の人だね。僕がゲームを作っていた頃も、似たような哲学を持っていたよ。警告なし(でも、規模は桁違いに小さくて、複雑さも少なかった)。デバッグビルドでは、失敗したアサートでクラッシュするのを使っていた。なんでかはわからないけど、ゲーム開発では一般的にこういう厳格なエンジニアリングがされてない気がする(少なくとも当時はそうだったし、正直大きなスタジオで働いたことはないけど)。

1998年のMicrosoftコンパイラは、現代のコンパイラほど警告が多くなかったんじゃないかな。

Visual C++とVisual J++のインターフェースが大好きなんだ。すごく速くて、超クリアだった。

GitHubからダウンロードしたり、FTPでファイルを転送しないでね。著者はFTPのASCIIモードを知らないと思うし、特にそれがデフォルトだってことも知らないだろうね。ASCIIモードは便利な機能だったけど、デフォルトにすべきじゃなかった。ほとんどのテキストファイルは小さくて、忘れたら再ダウンロードも簡単なのに対して、バイナリファイルは大きいことが多くて、行末の変換によるダメージは修復がほぼ不可能だからね。それに、テキストファイルの変換を忘れたら、ホスト側で簡単にできるし。

これはノスタルジーが溢れてるね。Quakeが大学での最初の「LANパーティ」タイトルだったから、自分の年齢を実感するけど、このゲームのおかげでLANトポロジーやネットワーク、レイテンシー、マルチプレイヤーのリアルタイムインタラクションについて理解する興味が湧いたんだ。

stbライブラリの作者ショーン・バレットは、ゲーム開発でほぼどこでも使われていることで知られていて、今でもVisual C++ 6を使っていることでも有名だよ。[0] https://github.com/nothings/stb [1] https://m.youtube.com/watch?v=nQrzB5P5NPE

これが意味するのは、ファビアンがまた別のゲームエンジンのブラックブックに取り組んでるってことかな。90年代のゲーム技術の深堀りや歴史的保存が本当に好きなんだ。 https://fabiensanglard.net/gebbwolf3d/ https://fabiensanglard.net/gebbdoom/

それに、Borland C++6よりもずっと良くて安定してた! 15〜30ファイルを開いたり閉じたり、パスを間違えたりすると、Borlandは昔ながらのクラッシュをくれたからね。あのIDEはすごく慎重に扱わないといけなかった。特有のクセを掴む必要があって、時には何時間もクラッシュせずに動いてくれたこともあったよ。