70万行以上のコードを20年かけて1人でコツコツ開発してきたゲームプログラマーへのインタビュー
7人のドワーフを操作して広大な世界を開拓し、歴史や神話を含めたさまざまな文明を築いていく無料のシミュレーションゲームが「Dwarf Fortress」です。コンピュータープログラミングに関するナレッジコミュニティ・Stack Overflowの公式ブログに、2002年から20年近くにわたってDwarf Fortressの開発を続けるターン・アダムズ氏へのインタビューが掲載されています。
700,000 lines of code, 20 years, and one developer: How Dwarf Fortress is built - Stack Overflow Blog
https://stackoverflow.blog/2021/07/28/700000-lines-of-code-20-years-and-one-developer-how-dwarf-fortress-is-built/
Dwarf Fortressは、2002年からToady Oneことターン・アダムズ氏という一人の開発者によって作られています。アダムズ氏は、最初は仕事の合間を縫って開発していましたが、2006年からはフルタイムでDwarf Fortressの開発に取り組んでいます。すべてのコードがアダムズ氏によってコーディングされていますが、デザインやゲームに基づいたストーリーは弟にも手伝ってもらっているとのこと。
Dwarf Fortressは無料のシミュレーションゲームで、以下のように文字を使って絵を表現するテキストグラフィックを利用しているのが特徴です。
UIを一新したバージョンもSteamやitch.ioでリリースされています。
Steam:Dwarf Fortress
https://store.steampowered.com/app/975370/Dwarf_Fortress/
Dwarf Fortress by Kitfox Games
https://kitfoxgames.itch.io/dwarf-fortress
Dwarf Fortressがどういったゲームなのかは、以下のムービーをみるとよくわかります。
#1 Dwarf Fortress日本語実況 Evil&Tower - YouTube
Q:
Dwarf Fortressで使用しているプログラミング言語やその他の技術を教えてください。この15~20年の間に変わったことはありますか?
アダムズ氏:
Dwarf FortressはCとC++を組み合わせて作っています。Microsoft Visual StudioはMicrosoft Visual C++ 6.0から使っていますが、今は無償版であるVisual Studio Communityを使っています。
エンジンについてはOpenGLとSDLを使っています。これらを採用したのは、macOSやLinuxへの移植が容易だからです。もちろんそれでも自分ではできませんでしたが……。今、UnityやUnreal Engineを使っても、どちらも使いこなせていないので迷っています。しかし、自分でエンジンを扱うのは、特にテキストグラフィックを超えたものを作っている今となっては本当に苦痛ですね。サウンドはFMODを使っています。
途中でSDLを導入して移植を可能にしたことを別にすれば、プロジェクト期間中の開発環境はずっと変わっていません。ゲームの機械的な面では外部のライブラリもあまり使っていませんが、乱数生成のものはたまに使っています。最初はメルセンヌ・ツイスタを使っていましたが、今はsplitmix64を使っています。
Q:
1つのプロジェクトを長く続けることの難しさとは一体なんですか?自分で全てをやった方が、メンテナンスや修正が楽なのでしょうか?
アダムズ氏:
(書いたコードは)忘れていることが多いですね。全部で71万1000行にも及びますから、その全部を覚えておくのは無理です。ただ、変数やオブジェクトには一貫性があって覚えやすい名前を付けるようにしていますし、コードで何が起こっているかを思い出せるようにコメントは残すようにしています。時には10年前に書いたっきり触っていないコードを見つけるために検索をかけることもあります。2006年の最初のリリースの前から見返していない、非常に不完全な部分もいくつか残っています。
私は複数人での大規模なプロジェクトに携わったことがないので、確かに1人での作業の方が比較的簡単で、最適だと思います。コードを修正したいと思った時に、チームや上下関係のハードルがないのは事実ですが、1人でやらなければならないこともあります。
Q:
Dwarf Fortressを開発してきた中で、最も大きなリファクタリングや修正点はありますか?
アダムズ氏:
特定のデータ構造を何カ月もかけて設計し直したりしましたが、厳密にはリファクタリングではないと思っています。というのも、システムを進歩させる機会は常にあり、新しいコードの知識を得てすぐにそれを行うのが理にかなっているからです。
例えば、ゲームを3D化するためにZ座標を追加したのもその一つで、今までにやったことのないほど気が遠くなるような作業でした。XとYという2つの座標に依存したロジックや関数の呼び出しが、追加したZ座標にどう適合するのかを何週間も何週間も考えました。
Q:
32ビットOSから64ビットOSへの移行で問題はありませんでしたか?当時は大きな話題になりましたたが、今ではすっかり64ビットOSが定着した感があります。
アダムズ氏:
全くありませんね。何か問題があったかというと、そんなことはありません。幸いなことに、私たちはすでにバイトサイズをしっかりと管理していました。これはワールドの保存と読み込みに関わることですが、フォーマットを設定する際には、特にOS間のエンディアンなどに対処する必要がありました。厄介なポインタ操作なども行っていません。結果的には他の方法でコードは64ビットOSに最適化されましたが、これは全くの偶然です。当初の問題は64ビットに変更するための時間を確保することでしたが、実際は思っていたよりも時間がかかりませんでした。
Q:
あなたの一番好きなバグとその原因はなんですか?
アダムズ氏:
私が言うのもつまらないかもしれませんが、「酔っぱらいネコのバグ」を超えるものはありませんね。2017年にDwarf Fortressで、突如ネコが「ゲロまみれになって死んでいる」状態で見つかるというバグが相次いで報告されました。調べると、毒をもつ生物を強化した際に、ネコが足を掃除するとなぜかアルコール中毒の症状をすべて発症してしまうというバグが生じたためだということがわかりました。
なお、酔っぱらいネコのバグについて解説しているムービーが以下。
Why Dwarf Fortress started killing cats - Here's A Thing - YouTube
Q:
Dwarf Fortressと並行して他のプロジェクトを進めようとしたことはありますか?
アダムズ氏:
もちろんあります!ここ10年間ほどで並行して進めたプロジェクトがおよそ90件ほど存在します。数日で終わるものもあれば、何年もかかるものもあります。ほとんどが全く違うジャンルの別ゲームですが、中にはDwarf Fortressに近いプロジェクトもいくつかあります。公開するまでには至っていませんが、遊んでいると楽しいですよ。
Q:
90件も並行して進めたプロジェクトの中で、他のプログラミング言語を試したことはありますか?
アダムズ氏:
ハハハ、ないですね。私は技術的なことよりもむしろデザインに関することに興味があります。ただし、自分の思い描いたデザインをより早く実現するためには、スクリプトを学んだりスレッドを使ってみる必要はあるでしょうね。しかし、プロジェクトを並行して進めるための時間を技術習得に割くのは難しいものです。
・関連記事
なぜLinux環境でゲームを開発するのか?Linuxベースで開発するゲームスタジオへのインタビューが公開中 - GIGAZINE
「モバイルならではの新しいディアブロの世界をつくる」、Diablo Immortal開発者に新生ディアブロについて聞いてみました - GIGAZINE
戦国時代だったテキストエディタ界をVisual Studio Codeが天下統一しつつある - GIGAZINE
プログラミングのQ&Aサイトにアクセスした人々はどれほどコードや本文を「コピー&ペースト」しているのか? - GIGAZINE
・関連コンテンツ