もぐてっく

人は1つ歳を取る度、1ビットづつ大きくなれると信じてた。

あの伝説の不思議なダンジョン系ゲーム「jnethack」をUbuntu19.10にインストールしようとしたら、そっちはそっちで大冒険だった

sshでサーバにログインしたら、シェルじゃなくてゲームが始まったら楽しくね?」

と言ういまいちよく分からない欲求が爆発して、ターミナルで動くゲームを色々物色してました。

orebibou.com

有名なゲームは大体実装されている印象。

しかしながらアクション系は再描画の頻度が激しすぎててチラつきとか動作に引っかかりがあったりで割とイマイチ。

なので、ここは定番のCUI RPGRogueにしようかなと思った次第です。

あ、そういえばRogue派生の「NetHack」ってやったことないなぁ。
確かJNetHackって言う日本語版もあるんだよね。aptにはなさげ。じゃあコンパイルしますか。

と言うことでJNetHackコンパイルにチャレンジしてみました。

f:id:moguno:20200128001742p:plain

時は2020年。物語の舞台はUbuntu 19.10 Serverです。

ゲーム本編と同様、結構な数の罠が待ち構えていたので攻略のポイントを書いておこうと思います。

ライブラリ・ツールのインストール

まずはapt-getで以下のパッケージをインストールします。

  • build-essential
  • libncurses-dev
  • bison
  • flex

なんでかプログラミング言語を作るときの必須ツールであるyaccとlexを要求されます。
こいつら、そのものずばりの名前じゃなくてbisonとflexと言うパッケージになっています。第一の罠ですね。

ソースコードの展開とパッチの適用

$ tar xvzf NetHack-3.6.2_Release.tar.gz
$ gzip -d jnethack-3.6.2-0.1.diff.gz

$ cd NetHack-NetHack-3.6.2_Release/

$ patch -p1  < ../jnethack-3.6.2-0.1.diff

patchコマンドの-pオプションの数字がいまだに謎で手が止まるのと、差分ファイルをリダイレクトで渡さないといけないのが地味なハマりポイントです。第二の罠ですね。

Linux用のMakefileの作成

$ sh sys/unix/setup.sh sys/unix/hint/linux

常識を疑わず./configureを探し続けてしまう呪いでまたハマり。
シェルスクリプトMakefileを錬成します。第三の罠。

gccSJISなソースを解釈させるためのおまじないを追加する

ここが最大の難関でした。
JNetHackはどんな歴史的経緯かわかりませんが、ソースコード内の日本語がSJISコードで書かれています。

UTF-8を基本としている最近の?gccだとこのソースをそのままコンパイルすることができません。

具体的には、SJISコードには2バイト目が\な文字がいくつかあり(「表」とか)、それが入ると後続の文字がエスケープされてしまします。

このせいで、良くてメッセージ内の「表」の文字が文字化け。
最悪は文字列のダブルクォートをエスケープしてコンパイルエラーになってしまいます。

/* 「表」の2バイト目に含まれる\のせいで後続のダブルクォートがエスケープされて「文字列がダブルクォートで囲まれてへんぞ!」エラーになる。 */

char *str = "表";

じゃあ、ソースコードUTF-8にあらかじめ変換すればいいかと言うとそうでもなくて、JNetHackLinuxで動くときはSJISのメッセージをUTF-8に変換して出力していたり、SJISコードらしい16進数を抱えてたりするので、なんとかSJISのままでコンパイルを通さないと不味そうです。

幸い、gccにはUTF-8以外のソースコードgccの内部コードUTF-8に変換するオプション「-finput-charset」と、逆に内部コードのUTF-8をそれ以外のコードに変換してバイナリを作る「-fexec-charset」ってオプションがあるので、それをMakefileに組み込むことにします。

src/Makefile:27

CFLAGS=-g -O -I../include -DNOTPARMDECL -DDLB -finput-charset=cp932 -fexec-charset=cp932

コンパイルする

ここからは簡単。定番のmakeとmake installです。

$ make
$ make install

これで/usr/local/games・・・ではなくて、~/nh/install/games/
と言うよくわからないディレクトリにjnethackコマンドをインストールしてくれます。
最後まで罠の多いソフトでした。

終わりに

移動がvimと同じhjklキーだったり、ショートカットキーを覚えないとなにも出来なかったりで色んな意味で難易度の高いゲームですが、中毒性は半端ないですね。
今後はログインシェルをjnethackに差し替えたユーザを用意して、ネットのみんなでランキングを争ったりとかしたいですね。