List of Games I own #2 Script

年明けに意気込んで、所有しているPCゲームリストを作った。その2。

スプレッドシート化して得られる恩恵のもう一つは、スクリプトが使えることだろう。テキストエディタによっては固有のマクロが使える場合もあるが、Google SpreadsheetだとJavascriptからサーバサイドの処理を行える。とはいえ、妙にレスポンスが遅いのでGoogle Apps ScriptのAPIのコール回数は極力減らしたほうがいいのだろう。
開発にあたりGoogleということで、Chromeが群を抜いてクライアント側で処理するJavascriptが早いので、それを使った方が良い。他のブラウザで弄っていると妙に遅くてストレスが溜まる。しかし、Chrome自体はタブやらメモリ管理が貧弱すぎてデフォルトブラウザとして常用するには耐えうる代物ではなかった。

さて、スクリプトを何に使うかというと、ゲームタイトルの追加である。利便性のために、次のような要件でタイトルを適切な位置に挿入したい。

  1. アルファベット昇順、正確には文字コード順
  2. 先頭にあるA, An, Theの冠詞は無視する
  3. .(ピリオド)などの記号は、アルファベットよりも先にきてはならない
  4. 続編はリリース順にまとめる
  5. 続編で著しく名前が異なる場合、メジャーとなっているタイトル部分をアルファベット昇順の基準とする

従来のテキストでの管理では、タイトル追加時に手動で挿入位置を探しだし、改行をしてゲームタイトルを入力していた。スプレッドシート化しても、挿入位置を探し出し、行を挿入して、ゲームタイトルを入力することになる。腹ただしいことに、Google Spreadsheetに行挿入のショートカットキーは存在しない(エクセルは使用頻度が高いくせに面倒で押しにくいショートカットキーがある)ので、行を選択して端を右クリックするか、メニューから追加する項目をマウスで選択しなくてはならない。テキストからスプレッドシートに移行するとかえって手間が増えているのである。
目視で挿入場所を探し出して追加するのは間違いを生むし、増えた手間をスクリプト自動化して手間を減らしたいところである。

行挿入からタイトル記入の処理は、入力フォームを開いてタイトルを入力して、これをスクリプトで扱えば何の工夫もなく出来るだろう。あとは挿入するべき位置が分かればよい。

シートにはセルをアルファベット順に並び替えるソート機能があるが、これは要件を満たさないので使えない。
次のようなタイトル群があったとしよう。何の工夫もせず、シートの機能やスクリプトプログラムを用いてアルファベット順にソートした場合、きっとこういう順序になるだろう。

An Elder Scrolls Legend: Battlespire
Beyond Divinity
Descent: FreeSpace
Divine Divinity
F.E.A.R.
Fable: The Lost Chapters
FreeSpace 2
The Elder Scrolls 2: Daggerfall
The Elder Scrolls 3: Morrowind

確かに要件1の文字コード順になっているが、先の要件は1しか満たしていない。我々は機械ではなく人間であるため、これらのゲームをよく知った人間ならば、何もかもがおかしいと感じるだろう。

要件2の先頭の冠詞の除外は、An Elder ScrollsやThe Elder Scrollsが該当する。
メジャーなディストリビュータを例にとるとSteamは去年か一昨年あたりまでは対応していなかったのだが、最近になって対応されていた。GOGはずっと対応されていないのだが、Elder Scrolls, Theといった具合に記述順序を変更して対応している。しかしながら、特に明示的に命名規則が決められておらず手作業でそういう処理をしているのか、Theが先頭に書かれているタイトルもあるし、AとAnは全て処理されていないのでチグハグな並びになってしまっている。Originは日本語タイトルの命名規則が全くない上に、日本語に対するソートがまともに機能しておらず出鱈目である。

これは単純に、先頭が大文字小文字問わず”the “, “a “, “an “の場合に、それを除去して考慮すれば良い。この要件を満たすと次のような並びになる。

Beyond Divinity
Descent: FreeSpace
Divine Divinity
The Elder Scrolls 2: Daggerfall
The Elder Scrolls 3: Morrowind
An Elder Scrolls Legend: Battlespire
F.E.A.R.
Fable: The Lost Chapters
FreeSpace 2

要件3は、F.E.A.R.がそれに該当する。文字コード的にはピリオドはアルファベットよりも先なので正しいのだが、人間の感性としてはF.E.A.R.はFEARである。これ以降の要件、つまり冠詞の除外以外はどのディストリビュータも対応していない。
これも単純に、ピリオドやその他不要な記号は除去して考慮してやればよい。次のようになるだろう。

Beyond Divinity
Descent: FreeSpace
Divine Divinity
The Elder Scrolls 2: Daggerfall
The Elder Scrolls 3: Morrowind
An Elder Scrolls Legend: Battlespire
Fable: The Lost Chapters
F.E.A.R.
FreeSpace 2

要件4, 5は非常に厄介である。どいつもこいつも好き勝手に続編名をつけやがって法則性が無いからである。
Beyond DivinityはDivine Divinityの後にでたスピンオフであり、An Elder Scrolls Legend: BattlespireはThe Elder Scrolls 2: DaggerfallとThe Elder Scrolls 3: Morrowindの合間に出たスピンオフである。
この要件を満たさないと、膨大なゲームタイトルリストにおいて、このシリーズはどこまでやったのかといったことすら把握出来なくなる。自分の知らないタイトルにもなると、Blood Omen 2: Legacy of KainはLegacy of Kain: Soul Reaver 2とLegacy of Kain: Defianceの間に出たということや、Legacy of Kain: Defianceには3とか4とかナンバリングがついていないが1作目ではなくて4作目である、ということが分からないのである。
頼むからタイトルは統一してナンバリングを割り振って、好き勝手にやるのは副題だけにしてくれ。リブートの同名タイトルなんてもってのほかだ。

要件4を満たすと、次のようになる。

Descent: FreeSpace
FreeSpace 2
Divine Divinity
Beyond Divinity
The Elder Scrolls 2: Daggerfall
An Elder Scrolls Legend: Battlespire
The Elder Scrolls 3: Morrowind
Fable: The Lost Chapters
F.E.A.R.

要件5は、ここで言うところのFreeSpaceシリーズが該当する。FreeSpaceはFreeSpaceシリーズであり、Descentシリーズではない。Descentといえば3作出ていてパブリッシャも同一(Interplay)であるが、ディベロッパは異なりシリーズでもスピンオフでもない。販売的な側面から当時ヒットしていたDescentの名前を付けたのだろうか。Descent: FreeSpaceのパッケージを見ても、Descentの文字は非常に小さく、FreeSpaceは大きい。
したがって、FreeSpaceシリーズは、Dの行に位置するのではなくFの行に位置するのが自然である。

全ての要件を満たし最終的に次のように並んでいて欲しいところである。

Divine Divinity
Beyond Divinity

The Elder Scrolls 2: Daggerfall
An Elder Scrolls Legend: Battlespire
The Elder Scrolls 3: Morrowind

Fable: The Lost Chapters

F.E.A.R.

Descent: FreeSpace
FreeSpace 2

さて、要件4, 5を満たしたいところだが、当然スプレッドシート上には、シリーズに関する情報は無い。この世に存在する全ゲームタイトルのシリーズ情報をシートのどこかに用意することは到底無理だし、随時スクリプトプログラムによってWikipediaあたりの外部から情報を参照してくるにしても、フォーマットが揃っていないので機械的に判別することは不可能だろう。

ここで注目したいのは、この手の好き勝手につけられた続編タイトルの頻出の仕方は、単発的であるということである。
The Elder Scrolls 4: Oblivionをこのリストに追加するとき、要件1から3を満たしながらリストの上から順に挿入位置を探すと(このアルゴリズムをリニアサーチという)、An Elder Scrolls Legend: Battlespireの手前が挿入位置である示すだろう。そこで処理を打ち切るのが一般的な探索処理である。
単発性を考慮して探索処理を停止せず、次のタイトルを見てみると、The Elder Scrolls 3: Morrowindとなっており、まだその後ろに挿入できるということが分かるだろう。An Elder Scrolls Legend: Battlespireは単発であると判断できる。
さらにその後のFable: The Lost Chaptersよりは挿入位置が手前であり、さらにF.E.A.R.でも手前となる。単発的に挿入位置が手前であると判断されたわけではないので、この時点でMorrowindの後が適切な挿入位置であると判断することができる。
これにより、要件4, 5を限定的に満たすことが可能である。限定的であるのは、例えばBeyond Divinityがリストにない状態で、これを新規に追加挿入しようとしても、それはDivine Divinityの後ろには追加されないためである。この時は、Beyond Divinityとして追加挿入するのではなく、一旦Divinity, Beyondなどとして追加挿入してから元の名前にリネームを行う必要がある。

最も確実に要件4, 5を満たすには、ソートや検索処理にかけるため名前を別名で持たせることだろう。
イレギュラーな名前: Beyond DivinityにはDivine, Beyond、An Elder Scrolls Legend: BattlespireにはElder Scrolls 2.5という別名をどこかに書いておき、スクリプトプログラムではそちらを参照するようにするとよい。
ただし、この別名の追記は人力でやるしかない。膨大なリストにチマチマと調べて書き込んでいくのは必ずどこかに間違いが生じるし、何より面倒だ。一旦書いてしまえば後はそれほど大変ではないはずだが、スプレッドシートへの移行に際して面倒なことはやらないと決めたので今のところあまり乗り気ではない。

かくして、テキストからスプレッドシートに移行して、そのスクリプトを活用して色々便利になったのかなあ?

  • 所有ゲームを管理しやすくなる
  • 統計とグラフ化によって積みゲーの現状と問題が分かりやすくなり、積みゲーを崩したくなる(希望的観測)
  • Webに公開できるようになったので、こいつこんなに積みゲーしてやがるぞ、と第三者に思われるのだろうという意識から積みゲーを崩したくなる(希望的観測)
  • ゲームタイトル追加時の手間と間違いが減る
  • 今後何か便利機能を追加して、より便利に出来るかもしれない

デジタルダウンロード主流の積みゲーが蔓延化している現在、積みゲー崩し用のゲーム管理サービスサイトを出せると流行るのかも知れないが、私のようにものぐさな人間から、逆の几帳面にデータ管理してメタ情報つけまくりのが好みの人、ひたすら積みゲーを増やしてその数を見てニヤニヤする人まで幅広くニーズを満たすようなものはなかなか難しいだろう。少なくとも、アルファベット順にソートしただけのリストは駄目だというのは分かっていただけたと思う。主要ディストリビュータと提携して各所のライブラリと同期されつつも、ドマイナーゲームも問題無く扱えて、適当に管理できつつも痒いところに手が届くようなものをよろしく。


コメントを残す

メールアドレスが公開されることはありません。