K-Shoot MANIA Internet Ranking Systemのベータ版が公開中です。
https://ir.kshootmania.com/beta/
本記事ではKSMIRと略して呼ぶことにします。

はじめに

KSMIRの開発にあたって、BMSプレイヤーLR2用のインターネットランキングであるLR2IRを一部参考にさせていただきました。具体的には、

  • 各譜面ページで楽曲情報とランキングが確認できる
    • 楽曲情報をWiki形式で編集できる(※予定)
  • キーワード検索で譜面を検索できる
  • 譜面の識別は譜面ファイルのハッシュ値をもとに行う

という点がほぼ同じとなっています。

一方で、KSMIRの独自の点として、

  • Twitter認証でログインする
    • これにより、パスワード流出が一切起こらない
    • いたずらも多少防止される?
    • Twitterのフォロー関係でプレイヤーが検索できる(※予定)
  • リザルト画面で近い順位のプレイヤーが確認できる
  • 曲名・レベル・曲の音量など、実際のプレイに関係ない部分に変更を加えても同一譜面として識別される
    • 譜面ファイル(.ksh)のハッシュ値をただ単純に用いて識別している訳ではない

などがあります。ここでは、最後に挙げた「プレイに関係ない部分に変更を加えても同一譜面として識別される」という点について、その仕様を解説します。

譜面管理の仕様

K-Shoot MANIAの譜面形式であるkshファイルは、テキスト形式(メモ帳で開いても読める形式)になっていて、おおよそ以下のような見た目をしています。

譜面ファイルのはじめの部分に、曲名やレベルなどの譜面情報が記載されていて、その後実際の譜面データが記載されています。

基本的なアイディアとしては、kshファイルからこれらの譜面情報の行を取り除いたデータのハッシュ値(具体的にはMD5ハッシュ)をもとに譜面を管理することで、譜面情報によらず同じ譜面であると判断させています。

ただし、譜面情報のうち、例えばBPMの行(「t=○○」)を変更すると譜面を簡単にできてしまいます。こういった変更を別譜面として扱うために、譜面ファイルのはじめの部分を取り除くのではなく、kshファイル全体から以下の文字列で始まる行を取り除くことにしています(※一覧はv1.70beta現在のもの)。

  • "//"
  • "title="
  • "title_img="
  • "artist="
  • "artist_img="
  • "effect="
  • "illustrator="
  • "jacket="
  • "level="
  • "difficulty="
  • "m="
  • "o="
  • "v="
  • "vo="
  • "mvol="
  • "bg="
  • "layer="
  • "po="
  • "plength="
  • "pfiltergain="
  • "filtertype="
  • "chokkakuautovol="
  • "chokkakuvol="
  • "chokkakuse="
  • "icon="
  • "ver="
  • "fx-l="
  • "fx-r="
  • "#define"
  • "information="

すなわち、上で挙げた譜面ファイルの例の場合、ハッシュ値を求める前に以下のような状態にされます。

これにより、譜面データ内の残った部分のみで同一性の判定が行われることになり、譜面内容に関係ない変更を無視しながら譜面を識別できることになります。

ただし、完全に安心はできません。というのも、kshファイルの形式では同じ譜面内容でも複数の表現が可能だからです。例えば、以下の2つの譜面データの指す内容自体は同一ですが、KSMIRでは別の譜面内容として扱われてしまいます。

 

割と古いバージョンのエディタで作った譜面は、開いて保存するだけで上記のような変更が加わる可能性があります。これを避けるために、古い譜面のレベル表記を変更する際にはメモ帳などのテキストエディタで行うと安全です。

ちなみにkshファイルは旧バージョンではShift-JIS、現行バージョンではUTF-8(BOM付き)が文字コードに使用されていますが、譜面データは基本的に半角英数字+記号のみなので文字コード間での差異は生じません(BOMもハッシュ値を求める際には削除されます)。


この投稿をシェアする