macOS 26 (Tahoe) で JNetHack を動かす

Windows版なら実行ファイルが公開されているので始めるのも容易だと思いますが、ここ最近 Windows の利用頻度が減って macOS メインとなり、久しぶりに JNetHack をプレイしようと思ったところ色々と情勢が変わっていたので忘れないうちにメモ書きです。

JNetHack はいわゆるローグライクな ASCII 文字で画面が構成される RPG ゲームで操作もキーボードで行うなど始めるには色々と敷居は高いのですが、一度覚えてしまえばなかなかに奥が深いゲームです。

元々 JNetHack のソースコードなどを配布していた osdn.net ドメインのサイトが中国資本に買収された後にサイト自体が閉鎖されたようで、こうやって古いものは足跡がなくなっていくのかなと思うと切なくなる次第です。
最初期の頃は http://www.jnethack.org/jnethack.html というサイトがありましたが、更新されなくなっており、意思を引き継いだサイトとして今今でメンテされている JNetHack のソースコードは https://github.com/jnethack が最新の様です。
本家英語版の NetHack の安定バージョンは v3.6.7 で、開発中が v3.7.0 (GitHub の Repository) になる様です。

前置き長くなりましたが、ざっくりとした段取りとしては以下のとおりです。

  1. ソースコードをダウンロードする
  2. macOS 上でビルドに必要なツールをインストールする
  3. いくつかのファイルを修正する
  4. configure して make all して make install する

今回の実施した環境は macOS Tahoe 26.3 で、CPU は M4 になっているので、Intel Mac な CPU をお使いの場合は状況が異なる可能性もあるのでその辺りはご了承ください。

1. ソースコードをダウンロードする

https://github.com/jnethack にアクセスして、jnethack-release をクリックします。

その後、[Code] ボタンをクリックして、[Download ZIP] を選択してソースコードをダウンロードします。

ダウンロード後、Finder からダウンロードフォルダを開くと jnethack-release-master というフォルダが開ける様になります。

2. macOS 上でビルドに必要なツールをインストールする

環境が色々と変更されているので全くの新規の場合は事情が違ってくるかもしれませんがご了承ください。前提条件として macOS 向けのパッケージマネージャである HomeBrew を利用しているのであらかじめセットアップしておく必要があります。

必要なツールをインストールするため、ターミナルを開いて以下のコマンドで文字コードを変換するツール nkf をインストールします。nkf (Network Kanji Filter) は歴史の長いツールで、日本語の文字コードを変換するツールです。というか、公開からもう40年近く経つのですね・・・。

% brew install nkf

この他のツールは・・・多分必要ない気もしますが説明が不足していたらすみません。(Xcode Command Line Tools は必須かもしれない)

3. いくつかのファイルを修正する

修正するファイルは、jnethack-release-master に展開される以下のファイルです。

まず、sys/unix/hints/macosx10.14 (テキストファイルです) をコピーして macosx26.3 を作る。ファイル名は適当でも良いです。以下はダウンロードフォルダにダウンロードした場合のパスなので適宜読み替えてください。Finderで当該フォルダを開いてコピーしてもらっても良いです (その場合は以下のコマンドは不要)。

% cd ~/Downloads/jnethack-release-master/sys/unix/hints/
% cp macosx10.14 macosx26.3

続いて、コピーした macosx26.3 をテキストエディタ (もしくは vi コマンド) で開いて編集します。
61行目あたりに CC=gcc という記述があると思うので以下のように修正&追記します。

CC=clang
CFLAGS+=-arch arm64 -O2
LFLAGS+=-arch arm64 -liconv

保存した後、同じフォルダ (sys/unix/hints/) にある macosx.sh に実行権限を付与します。以下はコピペで実行したい人用。フォルダ移動して作業している人は macosx.sh に実行権限が付与されれば OK です。

% chmod +x ~/Downloads/jnethack-release-master/sys/unix/hints/macosx.sh

その後、一つ上のフォルダ (sys/unix) にある Makefile.utl ファイルを修正します。

# yacc/lex programs to use to generate *_comp.h, *_lex.c, and *_yacc.c.
# if, instead of yacc/lex you have bison/flex, comment/uncomment the following.
# YACC     = yacc
# LEX      = lex
YACC     = bison -y
# YACC     = byacc
LEX      = flex

112行目あたりに YACC = yacc と LEX = lex があると思うので、上記のようにコメントアウトして、代わりに YACC = bison -y と LEX = flex のコメントをはずします。

保存した後、次のフォルダに移動します。Finderで行う場合は以下のコマンドは不要です。

% cd ~/Downloads/jnethack-release-master/japanese/

上記フォルダ (japanese/) に set_mac.sh というファイルがあるのでテキストエディタ (もしくは vi コマンド) で開いて編集します。すでに3行記述があると思いますが、削除するかコメントアウトし、以下の様に記述します。

#!/bin/sh

# Apple Silicon用
export CC=clang
export CFLAGS="-O2 -arch arm64"
export LDFLAGS="-arch arm64"

# SDKを自動取得
export SDKROOT=$(xcrun --sdk macosx --show-sdk-path)
export CFLAGS="$CFLAGS -isysroot $SDKROOT"

# EUCに統一
find ./ -type f -exec nkf -e -Lu --overwrite {} \;

# 新しいhintを使う
sh sys/unix/setup.sh sys/unix/hints/macosx26.3

#brew link --overwrite gcc@9
#find . -type f -name '*.c' -or -name '*.h'|xargs -n1 nkf -Sw --cp932 --overwrite
#sh sys/unix/setup.sh sys/unix/hints/macosx10.10

13行目でソースコードなどのファイルの日本語文字コードを S-JIS から EUC (nkf -e の部分) に変換します。本来ならば、nkf で文字コードを変換するときに、-e ではなく -w で UTF-8 にしたいところですが、色々試した限りでは UTF-8 に変換してビルドすると実行後に一部の文字が文字化けします。様々な環境 (Windows, Linux, Unix など) に対応すべく実装されているため、日本語を含むソースやデータファイルが EUC だったとしても出力時に適切に変換するようです。
とはいえ、あまり良い感じではないので他に良い方法あったら教えてください(p_’)
# nkf の変換を *.c, *.h, dat, sys などに限定すれば行けたりするんですかね? (未確認)
16行目で、先ほどコピペして編集した macosx26.3 を指定します。保存したら次のステップに進みます。

4. configure して make all して make install する

ターミナルの現在のフォルダの位置 (パス) を最初のフォルダに戻して、以下のコマンドを一つずつ順番に実行します。

% cd ~/Downloads/jnethack-release-master/
% ./configure          # ビルド設定を自身の環境に合わせた形で自動でカスタマイズしてくれるコマンド
% make all             # ソースコードから実行ファイルを作成する (警告いっぱい出ますがエラーが出なければ無視)
% make install         # 作成された実行ファイルをユーザーフォルダ直下にインストールする

各コマンド実行後にエラーが出なければ次のコマンドを実行します。

make install 実行後に問題なければユーザーフォルダ (/Users/hanako) 配下に、nethackdir フォルダが生成されるのでその下に実行ファイルが置かれます。以下のコマンドで実行可能です。

% ~/nethackdir/jnethack          # とりあえず起動してみる

試しに動かした後、ひとまずゲームを終わらせたい場合は、プレイヤーを操作可能な状態で「#」を押した後に「quit」と入力するとゲームをその時点で終了 (ゲーム放棄) させることができます。

このままだと色々不便なので、ユーザーフォルダ配下に設定ファイルを作ります。設定ファイル名は .nethackrc になります。

% cd                              # 現在のフォルダをユーザーフォルダに変更する
% touch .nethackrc                # .nethackrc という名前で空のファイルを作る
% vi .nethackrc                   # テキストエディタの vi コマンドで中身を編集する

上記手順は Finder から準備する場合は 2 と 3 の手順は不要で、テキストファイルを .nethackrc という名前でテキストエディタなどで作成してください。ファイル名が「.」で始まるため、作成後は Finder からは非表示になってしまいます。表示させる場合、Command + Shift + . で隠しファイルの表示非表示を切り替えられます。

設定項目値の説明と値の種類値のサンプル
nameプレイヤー名
EUCにしてしまっている関係で、日本語を使用するとセーブファイル名の都合でセーブできなくなります
OPTIONS=name:Hanako
align属性
Lawful : 秩序 (善)
Neutral : 中立
Chaotic : 混沌 (悪)
OPTIONS=align:Neutral
race種族
Human : 人間
Elf : エルフ
Dwarf : ドワーフ
Gnome : ノーム
Orc : オーク
OPTIONS=race:Elf
gender性別
Male : 男性
Female : 女性
OPTIONS=gender:Female
role職業。属性によってなれる職業となれない職業があります (参考)
Archeologist : 考古学者
Barbarian : 野蛮人
Caveman : 洞窟人
Cavewoman : 女性洞窟人
Healer : 薬師
Knight : 騎士
Monk : 武闘家
Priest : 僧侶
Priestess : 尼僧
Ranger : レンジャー
Rogue : 盗賊
Samurai : 侍
Tourist : 観光客
Valkyrie : ワルキューレ
Wizard : 魔法使い
OPTIONS=role:Valkyrie
pettype初期ペットの種別
cat : 猫
dog : 犬
*) 馬は指定できない
OPTIONS=pettype:cat
catname猫のペットの名前OPTIONS=catname:Tama
dogname犬のペットの名前OPTIONS=dogname:Pochi
horsename馬のペットの名前OPTIONS=horsename:Silver
hilite_petペットの背景表示を強調する
ペットを識別しやすくする
OPTIONS=hilite_pet
boulder岩のオブジェクト文字
通常、岩は ` で表示されますが見づらいと思う場合は別の文字に置き換えることが可能です
OPTIONS=boulder:0
autopickup自動取得の指定
後述の pickup_types と組み合わせないと、手当たり次第に拾って重量制限で動けなくなる
ゲーム中は @ で自動取得のオンオフが可能
OPTIONS=autopickup
pickup_types拾う対象のオブジェクト文字
? : 巻物を拾う
! : 薬を拾う
/ : 杖を拾う
$ : お金を拾う
= : 指輪を拾う
” : 魔除けを拾う
OPTIONS=autopickup,pickup_types:!/$=”
colorオブジェクトに色をつけるOPTIONS=color
showexp現在の経験値を表示するOPTIONS=showexp
time現在の経過ターン数を表示するOPTIONS=time

他にも多数オプション (https://nethackwiki.com/wiki/Options) があるのでお好みで。

オプションは , で連結することも可能。

OPTIONS=name:Hanako
OPTIONS=align:Neutral,race:Elf,gender:Female,role:Valkyrie
OPTIONS=pettype:cat,catname:Tama,dogname:Pochi,horsename:Silver,hilite_pet
OPTIONS=boulder:0
OPTIONS=autopickup,pickup_types:!/$="
OPTIONS=color,showexp,time

基本操作は以下の通り。最初に数字を入力してコマンドを指定すると数字分だけ動作を繰り返す。

キーボード文字説明
h, j, k, l, y, u, b, nプレイヤーの移動もしくは攻撃
h : 左に移動もしくは攻撃
j : 上に移動もしくは攻撃
k : 下に移動もしくは攻撃
l : 右に移動もしくは攻撃
y : 左上に移動もしくは攻撃
u : 右上に移動もしくは攻撃
b : 左下に移動もしくは攻撃
n : 右下に移動もしくは攻撃
> (Shiftキーを押しながら . )階段を降りる
< (Shiftキーを押しながら , )階段を登る
i持ち物を確認する
?ヘルプを表示する
.休憩。何もしないで1ターン消費
Sセーブして終了 (ゲームを起動すると前回のセーブ地点から再開)
# quitゲームを放棄して終了 (Game over)
,地面にあるものを拾う
:地面を調べる
s付近を探索する。行き止まりだけど道や扉がありそうな場合は探索を何度かすることで道が開けたり扉を見つけたりする
o / c扉を開く。扉を閉める
Control + d蹴る。鍵のかかった扉や箱は何度か蹴ると鍵を破壊できる。大体のものは蹴ることが可能
e食事をする
# loot中身を調べる。袋や箱の上でこのコマンドを使うと中身を調べることができる
q水や薬品を飲む
r巻物や書籍を読む
a道具を使う
d / D物を地面に置く。大文字の場合はまとめて置く
p店の中にいる場合で、未会計のものを所持している場合、p で支払いができる。お金が足りない場合は 未会計品は d で地面に置く
w武器を装備する
W / T防具を装備する / 防具を外す
P / Rアクセサリなどを装備する / アクセサリなどの装備を外す
t石や武器などのものを投げる
z杖を振るう
Z覚えた呪文を使う。魔法使いなどであらかじめ魔導書を読んで呪文を覚えている必要がある
Control + a直前の動作を繰り返す。扉を蹴るときなどに便利

そのほかのコマンドはヘルプ (?) からコマンド一覧で確認できます。

フォローする