BoardGameGeekに登録されているウォーゲームを日本語(と支那語と朝鮮語)のインターフェイスで検索できるWebアプリを昨日、PHPラボに追加したので開発の経緯を補足。
日本の卓上ウォーゲーム界隈では2000年頃から、つまりGoogleが法人化して日本に進出したあたりの頃から、かつてプレイしていたゲームのタイトルを何気無く検索してみて、現在でもプレイされていたり再版されていることを知る……というタイプの、ネット経由の出戻りが起きるようになっていた。
更に2010年代に入ると、出戻りではなく新規に卓上ウォーゲームと接する人の姿もSNSで散見されるようになってきた。が、こうした新規に卓上ウォーゲームと接する層のSNSでの発言を見てみると、出戻りと比べてどうにも「群盲ウォーゲームを撫でる」ように見えてならない。たかだか片手で数える程度の接触で雑な印象論を垂れ流しているように見える。
しかし、そうした雑な印象論が横行しているのも現状、仕方が無いと言える。現在の卓上ウォーゲームは基本的に少部数出版だから店頭で触れる機会が少ないし、加えてメディア環境の整備も足りていない。先日ホビージャパンがリブートした「タクテクス」は1980年代後半には月刊誌として全国の書店で800円で買えて、新作のレビューやシリーズもの・ジャンル別のゲーム解説も豊富で、しかもシュリンクされていなかったから立ち読みも可能だった。書店の数も今より遥かに多かったから、多種多様な卓上ウォーゲームに関するまとまった情報を日本語で、なおかつ低コストで得る環境も今より良好だった。
現在、日本の卓上ウォーゲーム専門誌はどれも付録ゲーム付きで3000円以上するし、袋入りで立ち読みしにくい。そもそも発行部数も販売店も限られている。「コマンドマガジン」は付録ゲーム無しのKindle版を800円で配信していて、しかもUnlimitedの読み放題対象にもなっているが、版元がそれを積極的に広報していない。
ゲームタイトルをネットで検索すればレビューやリプレイがタダで読める。が、そもそもどんなタイトルのゲームが存在するのか、ということすら知らない状態では検索すらできない。具体的にどんなゲームが存在するのか、という卓上ウォーゲームの全体像が、大まかな形ででも見渡せるようになっていない。だから、群盲ウォーゲームを撫でることになってしまっている。
東京に引っ越す前の2000年代前半、ミドルアース大阪本部に出入りしていて、定例会と二次会を終えた後、帰る方角が同じということで古角会長の運転するベンツで途中まで送ってもらうことが多かったのだが、ふたりっきりの車中での四方山話から、ウォーゲームの網羅的なカタログ作りを何度か持ち掛けられたことがあった。しかし、当時は今一つピンと来なかった。BGGが世界最大のデータベースなのだから、それで十分用が足りるでしょ、と思っていた。
けれども、それから20年近く経った今、古角会長の正しさを痛感している。日本で日常生活を送る上で、英語を使わざるを得なくなることは滅多に無い。やはり日本語で概観できなければダメなのだ。
ボドゲーマに登録されているウォーゲームは、BGGと比べてまだまだ圧倒的に少ない。卓上ウォーゲームの多種多様ぶりを日本語で発信するため、Twitter用にこんなBOTやこんなBOTを作ったし、海外の専門誌の付録ゲームの目録も作った。けれども、まだまだ概観するのには程遠い。
だったらせめて、BGGに登録されているウォーゲームを日本語のインターフェイスで検索できるようにすれば、卓上ウォーゲームの全体像を多少は概観しやすくなるのではないか、ということで、今回の開発に至った。
……さて、ここから先は技術的な話。コーディング自体は3月の三連休明けから10日程でサクッと済ませたのだが、最初はアキネイターみたいに質問に一つ一つ答えると目当てのウォーゲームが提示されるものを考えていた(言語選択のデカいボタンが幾つも縦並びになっているのはその名残)。しかし、この方法だと質問への回答の内容によっては次の質問の内容も変えざるを得ないので、条件分岐が面倒臭くなる。そこで、最初から検索条件のチェックボックスてんこ盛りのサウナイキタイを真似ることにした。検索タブも当初はサウナイキタイと同様、3つ(タイトル検索・個別戦史検索・特徴特色検索)だった。
BGGはサイト内のデータベースを外部のアプリからでも利用できるように、XMLのAPIを公開している(バージョン1とバージョン2)。当初はこれを使って内部的な検索を全て処理するつもりだった。が、この方法でゲームを直接検索する場合、タイトルの部分一致・完全一致でしか検索できないのでウォーゲーム以外も拾ってしまう。そこで、タイトル検索ではAdvanced Search(上級検索)の機能を使うことにした。具体的には、Advanced Searchでタイトル(の一部)を入力してカテゴリーをウォーゲームに限定した上でSubmitボタンを押すと生成される引数付きURLと同じものを作成してBGGに送信して、BGGが返信してきた検索結果のHTMLファイルをGoogleのphpQueryライブラリでDOM化して、primaryクラス(検索結果に含まれる個々のゲームへのリンクタグ)だけを抜き出して配列を作り、foreachでグルグル回してechoするようにした。
ぶっちゃけ、この方法を使えばAdvanced Searchの全ての検索項目を日本語(と支那語と朝鮮語)に置き換えたラッパーアプリを作ることも可能なのだが、テスト段階で検索をやりまくった所、BGG側がIPアドレス制限をかけたのか、一時的にアクセスできなくなってしまったことがあったので、やらない。
これに対して、特徴特色検索では当初の予定通り、XMLのAPIを使っている。BGGでは登録されているゲームを「カテゴリー」や「ファミリー」で分類できるようになっている。そしてXMLのAPIでは特定の「ファミリー」に属するゲームの一覧を取得できる。そこで、特徴特色検索ではチェックが入ったファミリーに属するゲームの一覧をXMLのAPIで取得して、simplexml_load_file関数でオブジェクト化して、foreachでグルグル回してechoしている。
Advanced Searchでは平均レーティングやカテゴリーによる絞り込みができるが、ファミリーによる絞り込みはできない。一方、XMLのAPIではファミリーによる絞り込みができるが、平均レーティングやカテゴリーによる絞り込みはできない。
こうして、タイトル検索と特徴特色検索は実装したが、個別戦史検索は著名戦史検索と上級戦史検索の二種類に分け、加えてシリーズ検索を新たに設けることにした。著名戦史検索は内部的にはAdvanced Searchのカテゴリー検索と同じで、上級戦史検索とシリーズ検索は特徴特色検索と同様、チェックが入ったファミリーに属するゲームの一覧をXMLのAPIで取得している。そのため、タイトル検索と著名戦史検索は平均レーティングの下限を指定できるが、上級戦史検索・シリーズ検索・特徴特色検索では指定できない。
平均レーティングの下限を指定した場合、単純に下限だけで絞り込むのではなく、レーティングした人が10人未満のものを除外するようにしている(ボンバゲーみたいに作った本人が10点を入れることがあったりするので)。そのため、下限を指定した場合、新作などの登録されて日が浅いゲームは除外されることが多い。
検索結果の一覧にはBGGへのリンクだけでなく、ボドゲーマの検索ページへのリンクも付けている(ほとんどの場合、NotFoundになる筈だけど)。全くの余談だが、支那語版では瘋桌遊の検索ページへのリンク、朝鮮語版ではボードライフの検索ページへのリンクになっている。この他に、VASSAL公式サイトの検索ページへのリンクも付けることを考えたが、今回は見送った。
ぶっちゃけ、コーディングよりもBGGのファミリー一覧(4500件以上!)からウォーゲーム関連のファミリーだけを抜き出して日本語・支那語・朝鮮語付きのリストにする作業の方が手間だった。4月1日公開とTwitterで予告していたけれど、リスト作成が23時直前までかかってしまった。多分、抜け落ちや転記ミスがあちこちにある筈だけど、月末恒例の作業(海外の専門誌の最新号チェックとかビリビリ動画のチェックとか)が全部後回しになってしまったので、ヒマな時に見直すつもり。