読者です 読者をやめる 読者になる 読者になる

ど~もeagle0wlです(再)

140文字では収まらないネタを記録するブログ

Raspberry Pi 2B に RetroPie 4.0 を導入する その5 データベース機能

Raspberry Pi RetroPie レトロゲーム

エミュレータの新規インストールはマスターできたと思う。しかしながら、タイトルの選択画面が寂しいと思わないだろうか。

実は、各タイトルのデータがあれば、以下のように華やかな画面にすることができるのだ。データがあればだが。
f:id:eagle0wl:20160830213813p:plain

データベース作成機能

EmulationStationはその問題を解決すべく、ウェブからデータを収集してデータベースを作成するSCRAPERという機能を有している。対応機種とromsフォルダにあるゲームのファイル名(=タイトル)をデータベースサイトに問い合わせて、パッケージ画像や概要・発売日などの情報を取得することができる、とても素敵な機能である。
Scraper · RetroPie/RetroPie-Setup Wiki · GitHub

しかし、我々にとっては望まない結果になると思うので、安易に実行するとややこしくなるので注意してほしい。

EmulationStationが対応しているデータベースサイトは2つ。

どちらも英語だが、使うのであれば主にthegamesdb.netとなる。まとまった形でパッケージのスキャン画像を引けるのはなかなかない。対応機種が非常に多く、ゲーム&ウォッチのような電子ゲーム、MSXCommodore 64、ZX Spectrumのようなホビーパソコン、日本未発売のNuonやN-Gage、ゲーム専用機とは異なるiOSAndroidまで(一応)カバーしている。PC-88、PC-98の項目もあるが3-4タイトルしかないので飾りである。APIを提供しているため、第三者にとっては使いやすい。
http://wiki.thegamesdb.net/index.php/API_Introduction

家庭用レトロゲーム機とそのレトロゲームの大半は日本製だが、北米でも発売されているタイトルも多い。同じタイトルであっても日本版と北米版が別物扱いされていればいいのだが、発売日が日本のそれなのか北米なのかといった情報の混在もある、archive.vgではアーケードのドンキーコング(1981年)が2004年発売といった極端なミスがある。細かいことはどうでもいいだって? その方がいいと思う。

本ブログの最初のエントリでは、データベースの作成作業のことをこう書いた。

この俺様データベースを手作業で作ろうとすると一生かかっても終わらないので、ウェブ上にある複数のデータベースサイトなどをスクレイピングして、名寄せして俺様データベースを自作しようとしたことがある。それでも時間がかかる。かかりすぎる。永遠に終わらない。正直労力に見合わない。

少なくとも、大規模なデータベースの編纂は1人でやることではない。

機種別に見るデータベース作成考察

データベースを手作業で入力して作成することはあり得ないので、スクリプトを書いて半自動化することを前提とするべきである。それでも死ねるのでオススメしないが…。ここからはあくまで考察である。

アーケードゲームの場合(MAME

MAME対応タイトルのデータベースをEmulationStationに移植することについては全く問題がない。

アーケードゲームエミュレータMAMEに関して言えば、これまでにリリースされたアケゲーリストが大規模かつ最も正確に整理、データベース化されている。スクリーンショット(プレイ中/タイトル画面)はもちろんのこと、ゲームによってはインストカードやポスター、筐体の写真、枠画像まで用意されてる。

Raspberry PiMAMEでの動作確認リストもスプレッドシートで公開されている。
MAME · RetroPie/RetroPie-Setup Wiki · GitHub (COMPATIBILITY LIST参照)

何より、アーケードゲームデータベース編纂委員会(AGDB-Japan)が作成した「日本のMAMEデータベース」が圧巻である。日本語で丁寧にスペックが記されているが、ほとんどのタイトルに簡潔な概要とストーリーがついている。現在AGDB-Japanのサイトはなくなってしまったが、テキストのデータベースを再配布しているサイトがある。
MAME E2J - Downloads

例えば『グラディウスII -GOFERの野望-』はこんな具合である。

グラディウスII -GOFERの野望-


発売年:1988.03
開発元:コナミ工業 発売元:コナミ
ジャンル:シューティング
コントローラ:8方向レバー+3ボタン
システムボード:コナミ ツイン16システム
CPU構成[Z80, 68000 (2)] 音源チップ[YM2151, 007232, μPD7759]


不朽の名作「グラディウス」の正式な続編となるのが「グラディウスII」である。 「グラディウス」「沙羅曼蛇」という流れの中で、そのノウハウをここに集約し、充実した完成度を誇る。 今回はパワーアップの異なる4つのタイプから自機をセレクトできるようになっている。 操作方法は8方向レバーで移動、パワーアップ、ショット、ミサイルに3つのボタンを使用する。 全8ステージでループ。


Mameinfo:
■バグ

  • アトラクトモードの過去のボスシーンでボスが表示されない。(#02523, v0.127u6, kanikani) $end


ORIGINAL:
グラディウスII -ゴーファーの野望 / Vulcan Venture (new)


CLONES:
グラディウスII -ゴーファーの野望 (日本版 new ver)
グラディウスII -ゴーファーの野望 (日本版 old ver)
グラディウスII -ゴーファーの野望 (日本版 older ver)
グラディウスII -ゴーファーの野望 / Vulcan Venture (old)
グラディウスII -ゴーファーの野望 / Vulcan Venture (oldest)

整理された画像と文字情報が揃っているので、簡単な変換スクリプトを書けばEmulationStationのデータベースに丸々ぶち込める。正直これには感動した。

一番重要なのは、これらの情報とROMイメージが一意に結びついていることである。MAMEではタイトルごとにIDを振っており、バージョン違い、海外版、海賊版も個別に割り振られている。IDがそのままファイル名(ROMイメージを固めたzip、スクリーンショットのjpgなど全部)になっているため管理も容易である。MAME自体はエミュレータだが、データベース、ランチャーとしての機能も有しているからである。

素晴らしいとしか言いようがない。ビバ集合知

家庭用(レトロ)ゲーム機の場合

集合知によって研ぎ澄まされたアケゲーデータベースと引き換え、ここから地獄が待っている。

念写されたROMイメージから、データベースの掲載に耐えうるほどの情報を一発で特定する方法はおそらく存在しない。ただし正規に市販されたタイトルは確定しているため、非売品、限定品、非公認タイトルは不要というのであればゴールは明確である。

以下2種類のデータベースを組み合わせて対処する方法が考えられる。

  1. ROMイメージから一意にタイトルを特定するツール
  2. タイトルから一意に詳細情報を引けるゲームソフトのデータベース(サイト)

(1) でROMイメージのタイトルを特定して、(2) でタイトルから発売日やメーカーなどの関連情報を特定する。問題は(1)と(2)をどう紐付けるかである。やはりタイトルしかないのだが、(1)で発売日なども得ることができれば、より確実に一意になる。

タイトルで名寄せしようとすると表記ゆれがすごく多いことに気付かされる(後述する超絶大技林が盛大にやらかしている)。

ドラゴンクエストIII』『ドラゴンクエスト3』『ドラゴンクエストⅢ』
(ローマ、アラビア数字、機種依存文字。大した問題ではない)

クレイジー・クライマー』『クレイジー クライマー』『クレイジークライマー
(中黒、区切り文字の有無。これも大した問題ではない)

『スーパースターフォース 時空暦の秘密』『スーパースターフォース
『目指せパチプロ パチ夫くん』『パチ夫くん』
(省略されやすいサブタイトルの有無。シリーズでも全てにサブタイがついている/ついていないとは限らない)
(ロゴのレイアウトや公式の表記が曖昧なせいでタイトルとサブタイトルの順序が謎なパターンもある)

いずれにせよ、自分でスクレイピングしたり整理できるスクリプトを書けないと非常に厳しい。そこまでしてやる価値があるかは大いに疑問だが。

ROMイメージから一意にタイトルを特定するツール

ROMイメージのハッシュ値を取り、ハッシュ値のデータベースと照らし合わせてタイトルを特定し、リネームするツールがいくつかある。私が実際に試行したツールを紹介する。

・The Old School Emulation Center (TOSEC)
www.tosecdev.org
ウェブ上に作られたレトロゲー、レトロコンソールの資料館を目指しているというサイト。配布されているハッシュ値のデータベースがとにかく膨大で、古今東西のホビーパソコン、超マイナーな機種、ゲーム以外のフリーソフトメガデモまで認識する。ちなみに「site:archive.org TOSEC」で検索すると、草薙素子よろしく「ネットは広大だわ…」と唖然とするに違いない。たぶん言っている意味は違うが。いいのかこれ。

・GoodTools
AllGoodThings
35機種に対応した歴史あるリネームツールである。海外版やハックロム、勝手翻訳版なども含めリネームできるが、本来は認識対象外とするべき吸い出しに失敗したような破損ROMも注釈付きでリネーム(例:hogehoge [b1].nes、foobar [h1].gb など)する点が鬱陶しい、というか意味不明。だって、[b9]とかあったりするんですよ。10年以上前の話だが、GoodMSX作成の際に、実機から吸い出したROMイメージではなく、ネットで拾ったROMイメージからとりあえず取り込んでみました的な運用が見られた。日本語にはリネームされない。しかし、セガのキッズコンピュータ・ピコにまで対応しているのは驚きである。

・EtoJRenamer
EtoJRenamer
GoodToolsでリネームされたファイルを日本語ファイル名にリネームするツール。そのためGoodToolsと併用する必要があるが、2004年から更新されていない。その間にGoodToolsが更新されてファイル名が噛み合わなくなる現象が発生している。

・NinRenDo
MY EZ4ファイル置き場
日本語に対応したリネームツール。多機種に対応しており、ハッシュ値(CRC32、ZIPファイルと同じやつ)の一覧はテキストデータで読めるので二次利用する際に参考になる。日本発売タイトルのみ対応。

・Metal Rom Renamer
Internet Archive Wayback Machine (WebArchive参照)
日本語に対応したリネームツール。多機種に対応しておりランチャーとしての機能も備えており、独自のハッシュ値を持つデータベースを備えていた。ファミコンのデータベースには当時表に出ていないデベロッパ(下請けとも言う)の存在も記されている。が、infoseek.co.jpにサイトを構えていたせいかサイト消滅。幾多の無料ホームページサービスを買収した挙句全て潰すというアクロバット経営で、ネット黎明期のウェブサイトを一斉に葬ったのは楽天である。

純粋なゲームソフトのデータベース

ウェブサイトの場合は、基本的に自分でコードを書いてスクレイピングする必要があるが、取得できる有用な情報はスクリーンショットぐらいではないだろうか。

・『超絶大技林 2011年秋完全全機種版』
家庭用ゲームのデータベースとしては、『超絶大技林 2011年秋完全全機種版』が候補に上がる。

全件検索可能CD?ROMデータベース付き 超絶大技林 2011年秋完全全機種版

全件検索可能CD?ROMデータベース付き 超絶大技林 2011年秋完全全機種版

付属CD-ROMに実行形式のデータベースソフトが収録されているが、起動が遅く、使い勝手も悪くコピペもさせてくれない。しかし、ある方法を使うと内部に埋め込まれているcsvファイルを抜き出せる(これを元にして機械的に生成されたと思しきデータベースサイトが散見される)。扱っているのは正規流通した市販タイトル(初回版・通常版のある一部タイトルは分けられている)だけ。非売品、非公認タイトルは未収録…のはずだが、収録漏れタイトルも発覚していたり、非常に誤植が多く、発売日や価格が間違っていたり、タイトル中に謎の半角スペースが入っていて検索妨害になっていたり、廉価版の存在が忘れられているタイトルもある。それでもデータベース化されているという意味では非常に価値がある。

・refuge.tokyo
Game Database
恐らく個人によってコツコツと更新され続けている、他機種に渡るデータベースサイト。デザインがなかなか凝っており素晴らしい。文章は添えられていないが、スクリーンショットが掲載されていることに意味がある。家庭用ゲーム機だけでなく、MSXX68000のゲーム、PC-98のアダルトを含むゲーム、Windowsのアダルトゲーム(2004年ぐらいまで?)も収録されている。Watara Supervision、Game.comのような国内流通していないマイナーハードもカバーされている。

ファミコン名作の杜
ファミコン名作の杜
名前の通りファミコンディスクシステムのタイトルだけだが、独自に添えられた解説が絶妙なので紹介したい。

Wikipedia
Wikipedia
「●●のゲームタイトル一覧」というエントリから辿れる各タイトルについている概要は充実している。ただWikipediaなので文章にムラがあり、何よりフォーマットが一意ではないのでスクレイピング対象には成り得ない。

・レトロフリーク
レトロフリークがデータベース機能を有しておりハックロムも対応しているらしいので、アップデートデータからデータベースを吸い出すと(1)(2)を満たせるのではないかという考え方もある。しかし、レトロフリークを所持していないので今回は見送る。

ホビーパソコンの場合

プラットフォーマーが販売をコントロールしている家庭用ゲームの場合は、発売タイトルは確定しておりゴールも明確である。一方ホビーパソコンは自由にゲームを作れるので線引きが非常に難しい。商業ソフト、フリーソフト、同人ソフトに分類できるが、商業ソフトは当時のゲーム雑誌に掲載されていたはずなので、完成はイメージできる。しかしフリーソフトと同人ソフトはどうにもならない。諦めて欲しい。

・The Old School Emulation Center (TOSEC))
TOSECdev Home

・refuge.tokyo
Game Database

Homebrewの場合

メーカーとのライセンス契約を結ばず、正規の開発環境を得ること無く同人的に開発することを、ビールの自家醸造(home brewery)に例えてHomebrewという。こればかりは誰でも勝手にゲームが作れるだけでなく、(Homebrewとは違うが)App StoreGoogle Playのような独占的な配信サイトがあるわけでもないので、リスト化は困難を極める。そこまでしてやるかはその人次第だが、諦めて欲しい。

SCRAPERを動かしてみる(非推奨)

データベースの自作は非常に困難であるということはさんざん説明した。SCRAPERとやらを確認するために、とりあえずそれっぽい名前のファイル名があれば確認できるので、それっぽい名前のファイルを突っ込んでスクレイピングしてみたいと思う。
f:id:eagle0wl:20161002091707p:plain
f:id:eagle0wl:20161002081959p:plain

タイトルの候補が複数ある場合はユーザーが選んでいく。一度に100タイトルSCRAPEしようとしたら最悪100回選ばされるハメになると思われる。
f:id:eagle0wl:20161002082840p:plain

SCRAPE後の画面。単なるファイルのリストから、詳細表示用のレイアウトに変わっている。よく見るとDRAGON QUESTが4つ続いているが、これはデータベースにはⅠの情報しかなく、Ⅰ~Ⅳまで全部ドラクエ1のデータに変わってしまったためである。末尾の数字しか違わないシリーズで顕著。余計混乱するじゃねーか!
f:id:eagle0wl:20161002082417p:plain

ファイナルファンタジーⅡ、Ⅲのパッケージが日本語版になっているが、それもそのはず。海外ではリリースされていないからだ。北米ではファイナルファンタジーのナンバリングが非常におかしなことになっているが割愛する。
f:id:eagle0wl:20161002082917p:plain
f:id:eagle0wl:20161002082938p:plain
f:id:eagle0wl:20161002082948p:plain

結果、日本語タイトルは全滅(以前のバージョンではある程度は通った記憶があるのだが…)。予想通りだが残念な結果となってしまった。

それにしても文字が以前のバージョンより小さくなっている気がする。

データベースを構成するファイル群

さて、今回スクレイピングされた画像ファイルはどこに格納されているのか、そもそもゲームリストはどこにあるのかというと、以下のパスにある。

/opt/retropie/configs/all/emulationstation/gamelists/[機種名]/gamelist.xml

画像ファイルは以下に格納される。

/opt/retropie/configs/all/emulationstation/downloaded_images/[機種名]/

単にSCRAPERを使って取得した画像がここに格納されるというだけで、gamelist.xmlに記載できるパスであればどこでも良い。

gamelist.xmlを編集し、画像ファイルを置けば自分好みのデータベースを作ることができる。

それではgamelist.xmlを見てみよう。

<?xml version="1.0"?>
<gameList>
	<game>
		<path>/home/pi/RetroPie/roms/nes/2048.nes</path>
		<name>2048</name>
		<playcount>3</playcount>
		<lastplayed>20160830T024856</lastplayed>
	</game>
	...
	<game>
		<path>/home/pi/RetroPie/roms/nes/キラキラスターナイト.nes</path>
		<name>キラキラスターナイト</name>
		<playcount>3</playcount>
		<lastplayed>20160830T025716</lastplayed>
	</game>
	<game>
		<path>./Battletoads (J) [!].nes</path>
		<name>Battletoads</name>
		<desc>After her defeat by the Galactic Corporation at the battle of Canis Major, the evil Dark Queen and her renegade space troops retreat to the outer reaches of the universe, hiding out in dark spaces between the stars. Meanwhile, on board the spaceship Vulture, Professor T. Bird and the trio of Battletoads - Rash, Zitz and Pimple - are escorting the Princess Angelica back to her home planet, where her father, the Terran Emperor, awaits her safe arrival. Along the way, Pimple, the biggest Battletoad, takes Angelica out for a cruise in the Toadster to a nearby Leisure Station, but the Dark Queen ambushes them before they can get there, and they are kidnapped and carried away to Ragnarok's World, the Dark Queen's planet. Professor Bird sends remaining Battletoads down on Ragnarok to save Pimple and Angelica, but it will be a hard battle against planet's dangerous environments, traps and Dark Queen's troops. They have to go a long way from the planet's rough surface to deep caves and landed Gargantua and ultimately to the Tower of Shadows, where the Dark Queen awaits.</desc>
		<image>/home/pi/.emulationstation/downloaded_images/nes/Battletoads (J) [!]-image.jpg</image>
		<rating>0.5</rating>
		<releasedate>19910601T000000</releasedate>
		<developer>Rare</developer>
		<publisher>Tradewest</publisher>
		<genre>Fighting</genre>
		<players>2</players>
	</game>
	<game>
		<path>./Dragon Quest (J) [!].nes</path>
		<name>Dragon Quest</name>
		<desc>Cuenta la leyenda que, hace muchos años, el Héroe Legendario, Loto, recibió de manos de Dios una Esfera de Luz. Con su poder, él derrotó a los demonios que cubrían el mundo. Entonces, el malvado Rey Dragón apareció... robó la Esfera de Luz, y la selló en oscuridad.

No pasaría mucho tiempo antes de que este mundo sea totalmente envuelto y destruido por la oscuridad...

Como el descendiente del Legendario Guerrero Loto, tu misión consistirá en derrotar al Rey Dragón, y recuperar la Esfera de Luz usando todo tu poder y medios a tu alcance.</desc>
		<image>/home/pi/.emulationstation/downloaded_images/nes/Dragon Quest (J) [!]-image.jpg</image>
		<developer>Chunsoft</developer>
		<publisher>Enix</publisher>
		<genre>Role-Playing</genre>
		<players></players>
	</game>
	<game>
		<path>./Final Fantasy (J) (PRG0) [!].nes</path>
		<name>Final Fantasy</name>
		<desc>An evil shroud covers the world in darkness. You must restore the powers of earth, wind, fire and water to the Four Orbs. Create your own band of 4 Light Warriors from fighters, thieves, martial artists, and magicians. You'll need all their skills to triumph in this massive role-playing adventure. Your treaterous journey takes you to all parts of a strange new world. Explore dangerous castles and dark caverns where dadly perils and great rewards, await at every turn. Hundreds of ferocious monsters block your path. With patience, skill, and cunning, you can defeat them.</desc>
		<image>/home/pi/.emulationstation/downloaded_images/nes/Final Fantasy (J) (PRG0) [!]-image.jpg</image>
		<rating>0.5</rating>
		<releasedate>19901010T000000</releasedate>
		<developer>Squaresoft</developer>
		<publisher>Squaresoft</publisher>
		<genre>Role-Playing</genre>
	</game>
</gameList>

眺めていればどんな情報が必要で、どんな情報が格納されているかは見ればわかるので詳細はWikiで。
github.com

気になる点をいくつか挙げると、<releasedate>タグは少々いただけない。発売日をISO 8601のフォーマットで表しているようだが、アーケードゲームのように年月までしか分からないようなものに対して、19980300T000000のように存在しない日付を入れるとinvalidになるようだ。

<name>タグは画面に表示されるタイトルなのだが、五十音順のソートを実現させたい場合はフィールドを拡張する必要がある。つまり、<name>大魔界村</name>だけでなく</namekana>だいまかいむら</namekana>といったフィールドを用意しなければならない。これはまた別の機会に。

<desc>タグには概要が記されている。SCRAPERから取ったものは全て英語なのだが、gamelist.xmlを編集して日本語を記せば日本語が表示される。

gamelist.xmlを更新する際は、EmulationStationを終了してから行うこと。即ち、メインメニューのQUIT→QUIT EMULATESTATIONを選んでシェルが表示されているタイミングで行う。

しかし…。文字が折り返されない。(解説文はファミコン名作の社から拝借した)。
ドラゴンクエスト : ファミコン名作の杜
f:id:eagle0wl:20161002092715p:plain

これはEmulationStationが折り返し処理がチープなのが原因。半角スペースで折り返しているようだ。
EmulationStation/Font.cpp at master · Aloshi/EmulationStation · GitHub

対処方法は2つ。

  • 本文に改行を入れる
  • EmulationStationのソースを修正して折り返し処理の日本語対応を行う

前者ではレイアウトのカスタマイズに対応できないので現実的ではない。となると後者しかない。泥沼化してきた。

次回はEmulationStationのソース修正と、レイアウト修正を行って見栄えを万全にして、RetroPieの話は終わりにしてしまいたい。