株式会社シベスピ 従業員ブログ

シベスピの社員ブログ。技術・想い・経験沢山書いていきます!

DOOMで遊ぼう

久しぶりのブログ担当。
今年に入って身内や親戚に色々とありまして、健康に関するあれこれについて書こうか考えていましたが、重苦しいので断念。
一応、ほかにも引越しやら旅行やらネタにできそうなネタはありますが、今回はかの有名なDOOMチャレンジに挑んだ話をします。
※先に結論からいうと失敗しました。誰か成功した人がいたら教えてください...。

DOOMチャレンジとは

DOOM(ドゥーム)とは
id Softwareによって開発され1993年に発売されたビデオゲームです。
FPSゲームの代表作として有名な本作ですが、なんとこのゲーム
1997年に公式からソースコードが公開されています。
公開以降、全世界のプログラマーありとあらゆる電子機器へのDOOMの移植にチャレンジする文化が定着していきました。
これがDOOMチャレンジと呼ばれるものです。

挑戦

本来はカーナビとかコピー機とか、ゲームには通常使わない突飛なものに移植をして楽しむチャレンジですが、ゲームの移植は初心者なので今回はPC上で動かすところまで。
公開されているコードはLinux版のものであるため、まずは環境を整えます。

①環境整備

ホスト環境
 OS:Windows11
 仮想化ソフト:VirtualBox(Oracle製)
ゲスト環境
 OS:Ubuntu 24.04.2 LTS
 その他、コードエディタや比較ツール等を都度導入

githubからソースコードをダウンロード

git clone https://github.com/id-Software/DOOM.git

ターミナルで実行↑するとDOOMソースコードを取得できます。

ソースコードとは別に、マップやグラフィック、サウンド等のゲームデータがまとまったWADファイルの配置も必要となります。
別途入手し、ソースコードに配置。

③コード修正

ここで注意。実は公開されているソースコードにはバグが存在しており、そのまま使うことができません。古い環境由来のバグや、公開用に意図して残されている(らしい)バグが混在しており、修正が必要となります。
ここは先人たちの知恵をお借りします。

<参考>
https://github.com/id-Software/DOOM/pull/3/files
https://github.com/JohnZ03/DOOM/commit/43946d42a6b229a018f9a0e874ce86fee23e4b5f

コンパイル

ソースコードの微調整が終わったら、早速コンパイル

cd /DOOM/linuxdoom-1.10
mkdir linux
make

問題と解決策

...ここまでは順調に進んでいましたが、ここから本格的につまずき始めます。
色々とありましたが、印象深かったものをいくつか。

①ヘッダファイル、ライブラリの不足

X11/Xlib.h:そのようなファイルやディレクトリはありません」
X11(X Windows System)Unix系OS向けのグラフィック表示システム。
ゲームの描写に必要なライブラリと、それを使うためのヘッダファイルが入っていない、とのこと。
インストールを行い、すぐ解決しましたが
ライブラリや環境設定の不足分の追加がもう何件か続きました。

sudo apt update
sudo apt install libx11-dev

②initializer element is not constant

初期化子が定数じゃないよとエラー。
C言語では配列の初期化子に定数以外は使えないとのこと。
初期化の際、仮の定数を入れて後から代入する等あれこれ格闘しましたが、結局後述の32ビットでコンパイルする対応を行って以降エラーが出なくなりました。
よく分からんけどヨシ!

③32 or 64ビット問題

そもそもこのゲーム自体20年以上前のものであり、32ビット環境での動作を前提に作られております。
今のマシンは64ビット。ポインタや型のサイズが変わり、プログラムの挙動にも悪影響があるため無視できない問題です。
環境に合わせるために色々と調整が必要になりました。

MakefileのCFLAGSに-m32を追記
 Cコンパイルのオプションに32ビット用にコンパイルすることを明示
・32ビット用のライブラリの導入
 sudo dpkg --add-architecture i386
 sudo apt-get install libx11-dev:i386 libxext-dev:i386 libnsl-dev:i386

これらの問題を解消し、ようやくコンパイル完了!
出来上がった実行ファイルを起動...!

cd DOOM/linuxdoom-1.10/linux
Xephyr :2 -screen 640x640x8 -br -reset -terminate -title DOOM &
DISPLAY=:2 ./linuxxdoom


...ここで今回のチャレンジ最大の問題が発生。本ブログの投稿期限までに完遂できなくなってしまいました。

Error: xdoom currently only supports 256-color PseudoColor screens

DOOMはPseudoColorモードしかサポートしておりません。
プログラムとシステムで色の情報のやり取りがうまく行ってないようです。
何が起きているかざっくり説明するとこんな感じ↓

DOOM
 システムの方で全256色のカラーマップ(パレットみたいなもの)
 を用意し、そこから色を選んで使うこと前提の設計。
今の環境
 256色のカラーマップは持ち合わせておらず
 プログラムのほうで赤緑青の数値を指定してもらい色を表現。
⇒結果:色の指定がうまくいかず、描画に失敗。

コマンドで無理やり対応させる、古い環境を構築する、代替システムを探す等手段は考えられますが、いったん今回はここまで。

振り返り

想像はしていましたが、結構苦戦を強いられました。
エラーのすべてが、環境等の前提条件のギャップから来るものであり
いかにそのギャップを埋めるかがDOOMチャレンジの難しさであると同時に、醍醐味でもあることを実感しました。
トライ&エラーこそ成功への道。懲りずにまた挑戦してみます。


余談
ブログを書いていて気付いたのですが、最後のつまずきの原因X11、自分でインストールしているんですよね...一度環境リセットして、古いバージョンを導入できるか試そうかな。