【IIDX】INFINITAS 全国トップスコア開発秘話
[2022/06/02]
beatmania IIDX INFINITASの全国トップ一覧をまとめたページを公開しました。
beatmania IIDX INFINITAS 全国トップスコア
反響があったので、作った時の話を書こうかと思います。
大まかな流れ
ACと違いINFINITASでは公式サイトでスコアなどを見ることはできません。
ゲームからデータを拾うしかないのです。
自己ベストやライバルのスコアであれば選曲画面に表示されるため、いちいち曲をプレイしなくても取得が可能です。
しかし全国トップは曲を選択しないとスコアが表示されません。
つまりどうあがいても全譜面プレイが必須。ここで全譜面プレイは確定しました。
次に取得方法。いろいろ方法あるとは思いますが、規約的にもセーフそうなスクショを撮ってそこからデータを抜くという方法に決定。
スクショからデータを抜くことにしたのでその方法。
画像なのでテキストデータとして取得することは不可能。
OCR機能を使ってテキストとして取得することに決定。
まとめると「1曲ずつプレイ→スクショを撮る→画像からDJ NAMEとスコアを取得」という感じです。
「ALL DIFFICULTY」カテゴリには全譜面入ってるのでそこを上から順番にプレイしました。
スクショを撮る
INFINITASの画面をスクショとして画像として保存するといえば、[Win]+[Alt]+[PrintScreen]を押すとかがありますが、手動で保存するのは大変!
最近はやり(?)のRPAでよく使われる手法ですが、「特定の画面になったら実行する」というスクリプトを組むことに。
Pythonを使い、「プレイ画面になったらスクリーンショットを撮る」というものを作りました。
from PIL import ImageGrab
import pyautogui as pg
import datetime, time
def ss_save():
time.sleep(0.5)
dt_now = datetime.datetime.now()
dt = dt_now.strftime('%Y%m%d_%H%M%S')
fn = f'./img/{str(dt)}.png'
img1 = ImageGrab.grab(bbox=(0, 0, 1280, 720))
img1.save(fn)
print(fn)
time.sleep(10)
while True:
try:
if pg.locateOnScreen('./files/chk_img.png'):
ss_save()
except :
pass
time.sleep(0.5)
やっつけですけど、pyautoguiでchk_img.pngというプレイ画面の一部を切りとった画像を探し続ける。
見つかったらPILのImageGrabでスクショを撮って保存する。ってだけです。
これを起動しておけばプレイ画面になるとスクショを撮ります。
おおよそ1ループ10秒なので、普通にプレイしてると何枚も撮ってしまう。撮影されたらESCで曲を強制終了してました。
スクショした画像の一部 |
画像からDJ NAMEとスコアを取得
スクショが撮れたら画像1枚1枚からDJ NAMEとスコアを拾います。
これも画像を1枚ずつ開いてメモっていったわけではありません。
スクショを撮るときに使ったのと同じPythonでPyOCRとTesseract OCRというOCRソフトで読み込みをしました。
具体的に書くと長くなるのでざっくり書くと、文字の部分だけをトリミング、読み取りやすいように背景を取り除き、白背景・黒文字に反転させて、フォントを学習させたOCRで読み込む。
ここまでやって実用できる識字率になりました。デフォルトのままでは全く使い物にならなかった。
トリミングや加工した画像 |
曲リストと突合
DJ NAMEとスコアの一覧は完成しましたが、それだけだと曲名も不明でスコアレートとかもわからない状態。
これを曲名と一致させるのですが、ALL DIFFICULTYカテゴリでプレイしたので、同じ順番の曲リストを作りスコア一覧を貼り付ければ完成です。
簡単に書いているけど、IIDXの曲の並びって特殊なのでこの順番にするのも若干面倒だったりします。
Excel上でデータが完成したら、JSONに変換して完成。
Excel上で曲データとスコアデータを突合 |
最後に
こうして"2022年5月時点"での"SP"の全国トップ一覧は完成しました。
そう全国トップは日々更新され、しかもDPはできてません。
全国トップ一覧をまとめる仕組みはできたので、定期的にDPも含めて取得は可能です。
可能ではありますが、今回説明しなかった全譜面をプレイするという非常に時間がかかる課題がクリアできていません。
当たり前ですが、INFINITASも不正対策で外部ツールからの自動操作は基本的には受け付けません。
また無理やり突破すると規約違反になったりBANされかねないということに。
今回も完全手動でやったわけではないですが、3500譜面をプレイするのは正直やりたくはない。