とても古い Hearts というゲームがあります。これは 1980 年代のどこかで Bob Ankeney が UNIX 用に作成し、1992 年に Mike Yang が改訂し、現在は Jonathan Badger がメンテナンスしています。その前身は、Oregon Software の Don Backus が 書いたもっと古い Pascal のプログラムであり、後に Jeff Hemmerling が更 新しています。もともとは複数の人間で遊ぶことを想定したゲームですが、 コンピュータを相手にして一人で遊ぶこともできます。グラフィックスはいい 感じですが、このゲームには凝った機能はありませんし、コンピュータと対戦 してもあまり強くありません。それにもかかわらず、現在においても UNIX マシンや Linux マシンで生き残っているゲームはこの Hearts だけのようです。
古いため、また歴史的な経緯のため、このパッケージを Linux システム上で構築するのは特に 困難です。この作業では長くて複雑なパズルを解く必要があります。忍耐と 決断力の訓練になるでしょう。
作業を始める前には、必ず motif
または lesstif
ライブラリをインストールしておいてください。
xmkmf
make
client.c: In function `read_card':
client.c:430: `_tty' undeclared (first use in this function)
client.c:430: (Each undeclared identifier is reported only once
client.c:430: for each function it appears in.)
client.c: In function `scan':
client.c:685: `_tty' undeclared (first use in this function)
make: *** [client.o] Error 1
client.c
ファイル中の問題を起こした部分を以下に示します:
#ifndef SYSV
(buf[2] != _tty.sg_erase) && (buf[2] != _tty.sg_kill)) {
#else
(buf[2] != CERASE) && (buf[2] != CKILL)) {
#endif
client.c
の 30 行目に
#define SYSV
を追加してください。これにより _tty への参照が回避されます。
make
client.c:41: sys/termio.h: No such file or directory
make: *** [client.o] Error 1
インクルードファイル termio.h
は Linux システムでは
/usr/include
ディレクトリにあります。比較的古い UNIX マシンの
場合のような /usr/include/sys
ではありません。したがって、
client.c
の 41行目を
#include <sys/termio.h>
から
#include <termio.h>
に変更してください。
make
gcc -o hearts -g -L/usr/X11R6/lib client.o hearts.o select.o connect.o
sockio.o start_dist.o -lcurses -ltermlib
/usr/bin/ld: cannot open -ltermlib: No such file or directory
collect2: ld returned 1 exit status
make: *** [hearts] Error 1
最近の Linux ディストリビューションは、時代遅れの termlib データベースではなく terminfoデータベース や termcap データベースを使っています。
したがって Makefile
を編集します。
655 行目の
CURSES_LIBRARIES = -lcurses -ltermlib
を
CURSES_LIBRARIES = -lcurses -ltermcap
に変更します。
make
gcc -o xmhearts -g -L/usr/X11R6/lib xmclient.o hearts.o select.o
connect.o sockio.o start_dist.o gfx.o -lXm_s -lXt -lSM -lICE -lXext -lX11
-lPW
/usr/bin/ld: cannot open -lXm_s: No such file or directory
collect2: ld returned 1 exit status
メインの lesstif ライブラリは libXm_s
ではなく
libXm
です。したがって、Makefile
を編集して、
653 行目の
XMLIB = -lXm_s $(XTOOLLIB) $(XLIB) -lPW
を
XMLIB = -lXm $(XTOOLLIB) $(XLIB) -lPW
にします。
make
gcc -o xmhearts -g -L/usr/X11R6/lib xmclient.o hearts.o select.o
connect.o sockio.o start_dist.o gfx.o -lXm -lXt -lSM -lICE -lXext -lX11 -lPW
/usr/bin/ld: cannot open -lPW: No such file or directory
collect2: ld returned 1 exit status
make: *** [xmhearts] Error 1
ここではいつもの容疑者を逮捕しましょう。
PW
というライブラリはありません。Makefile
を編集して、
653 行目を
XMLIB = -lXm $(XTOOLLIB) $(XLIB) -lPW
から
XMLIB = -lXm $(XTOOLLIB) $(XLIB) -lPEX5
make
rm -f xmhearts
gcc -o xmhearts -g -L/usr/X11R6/lib xmclient.o hearts.o select.o
connect.o sockio.o start_dist.o gfx.o -lXm -lXt -lSM -lICE -lXext -lX11 -lPEX5
make
がやっとうまくいきました(ばんざーい!)。
インストール:
root になって以下を実行します。
[root@localhost hearts]# make install
install -c -s hearts /usr/X11R6/bin/hearts
install -c -s xmhearts /usr/X11R6/bin/xmhearts
install -c -s xawhearts /usr/X11R6/bin/xawhearts
install in . done
実行テスト:
rehash
(tcsh
を使っているものとします。)
xmhearts
localhost:~/% xmhearts
Can't invoke distributor!
hearts
付属の README
を見ると以下のように書いてあり
ます:
heartsd, hearts_dist, hearts.instr ファイルを local.h で定義され
ている HEARTSLIB ディレクトリに置き、誰でもアクセスできるようにし
てください。
local.h
には以下のように書いてあります:
/* where the distributor, dealer and instructions live */
#define HEARTSLIB "/usr/local/lib/hearts"
これは「マニュアルをちゃんと読め!」の典型例ですね。
root になって以下の作業を行います。
cd /usr/local/lib
mkdir hearts
cd !$
それから、distributor
ファイルをこのディレクトリにコピーしま
す。
cp /home/username/hearts/heartsd .
cp /home/username/hearts/hearts_dist .
cp /home/username/hearts/hearts.instr .
もう一度実行テストをしてみましょう。
xmhearts
これは動くことも時々ありますが、大抵の場合は dealer died!
と
いうメッセージを出して止まってしまうでしょう。
"distributor" と "dealer" はハードウェアのポートを叩きます。したがって、 これらのプログラムが root 権限が必要としていることを疑うべきです。
root になって以下の作業をしてみましょう。
chmod u+s /usr/local/lib/heartsd
chmod u+s /usr/local/lib/hearts_dist
(前にも述べましたが、suid したバイナリはセキュリティホールに なるかもしれないので注意してください。)
xmhearts
これでやっと動くようになりました!
Hearts は
Sunsite
から入手できます。