gamespy.com->openspy.netだって
番外編です。オールドタイマーかつゲーマーにはおなじみだったGamespy.comがシャットダウンしたのはずいぶん前でしたが、その代替としてOpenspy.netが動いています。後者は前者を模倣するものですが、かなり完成度というか互換性が高く、ソースコードないしバイナリで“gamespy.com”を“openspy.net”に置き換えることで、昔のようにゲームクライアントやサーバーが動くようです。文字数も同じだし、バイナリの改変はStirling等ののバイナリエディタで簡単にできます。まず、Luigi Auriemma氏のgslistからいじってみましょうか?
今は今月の帯域超えているとかで表示されないようですが、その場合には来月早々にでも再訪してください。gslistはGame Server Listの意で、昔のmaster.gamespy.comに集結している各ゲームサーバーの情報を取り出すことができます。そのサーバーリストで、各サーバーの情報も取り出すことができます。今回は、懐かしいBattleField2142関係のサーバーリストや、liveな各サーバーの情報を取り出すことを考えます。まずgslistのソースコードが供給されていますから、ソース内の”gamespy.com”への参照を”openspy.net”にすげ替えてbuildしてみましょうかね?
上記のLuigi氏のサイトからgslist.zipをダウンロードします。解凍すると、

このようなファイル構成です。ここでコースは二つに分かれます。ここではソースを改変して現行のopenspy.netで動かすことにトライします。srcディレクトリ以下は、

のようになっています。C言語のソースですが、C++ Builder CEで扱えます。まず、IDEを起動して、

新規作成->コンソールアプリケーションを選択します、

上図のようにソースの種類としては”C”を選んで、“OK”。
いったん適切なフォルダーを新規で作成し、そこへセーブしておきます。そのフォルダー内部に、先ほど展開して得られたソースコード(*.cと*.h)をコピーします。それらを全部プロジェクトに足して、元々のFile1.cはプロジェクトから削除します。その状態が、

このようになっているはずです。ここで先ほどから述べている文字列“gamespy.com”から“openspy.net”への置換をまず行っておきましょう。それはまずどれか例えばgslist.cをダブルクリックして、表示しておきます。それで、下の図のようにメインのメニューから検索->置換を選択します。

それから出てきたダイアログで、

で”すべて置換”を選択(クリック)。
ついでに、”WIN32“を”_WIN32“に全て置換しましょう。で、SHIFT-F9を押します。それですんなりコンパイルが通るはずもなく、
[bcc32c 致命的エラー] gslist.c(64): 'GeoIP.h' file not found
とか言われますから、ここからソースを手動でいじります。GeoIPにも興味はありますが、サポートするのが面倒そうなので、パス。ここは
//#include <GeoIP.h>
とコメントアウトでおけ。再度コンパイル。またエラーが出るので、
//GeoIP *geoipx = NULL;
FILE *fdout = NULL; // for the -o option
in_addr_t msip = INADDR_NONE;
int megaquery = -1,
scandelay = 5,
no_reping = 0,
ignore_errors = 0,
sql = 0,
quiet = 0,
myenctype = -1, // 0, 1 and 2 or -1 for the X type
force_natneg = 0,
enctypex_type = 1,
multi_query_custom_binary_size = 0;
u16 msport = MSPORT; // do N OT touch
u8 *mshost = (u8 *)MS, // do N OT touch
*msgamename = (u8 *)MSGAMENAME, // do N OT touch
*msgamekey = (u8 *)MSGAMEKEY, // do N OT touch
*mymshost = NULL,
gslist_path[GSMAXPATH + 1] = "",
*sql_host = NULL,
*sql_database = NULL,
*sql_username = NULL,
*sql_password = NULL,
*sql_query = NULL,
*sql_queryb = NULL,
*sql_queryl = NULL,
*enctypex_query = "",
*multi_query_custom_binary = NULL;
こんな感じでGeoIPをコメントアウト。以下同様にひたすらコンパイルが通るようにします。あー、zlib.h関係も飛ばします。なんとかコンパイルが通れば、バイナリができあがります。テストしてみますかね?IDEのメインメニューの”実行”->”実行時引数”を選択。

以下のダイアログで、図のように”パラメータ”に”-n stella”を入れます。

これで保存してから実行すると、何やら表示されますが、main関数の終了とともに、画面(コマンドプロンプト)が閉じてしまうので、main()の最後のreturn文の前にgetchar()でも入れておきましょう。

結果が得られました。ちなみに”-n stella”というのはBF2142のサーバーをqueryしています。当初はデバッガで動作を追いかけて、ソースコードレベルでgslistを取り込んで使うことを考えましたが、今回はアボートしました。大昔には、Luigi氏のソースを元に、Halo Combat Evolvedのゲームサーバーブラウザを作って、busyなサーバーへのredialとか実現していたのですが、ソースコードが見つからないので、諦めました。次は、バイナリパッチによるgslistのリバイブの記事でも書きます。
コメント