オレオレBPIManager定義更新手順
BPIManagerという、beatmania IIDX というゲームの上手い度を数値化するための Web アプリを開発しているんだけど、1 年に 1 回やってくる定義データ(上手い度のベースになるデータ)の更新手順を毎回忘れてしまうのでオレオレメモ。
もはや beatmania IIDX は稼働日に新曲 5 クレくらいやるだけの 99%引退人間になっているので運営引き継いでくれる人募集してます。
(オープンソース&運営費用を賄ってた広告も外したので OSS 貢献でも大歓迎)
前提条件&リポジトリ
定義データのフォーマット
https://docs2.poyashi.me/other/def/
上に書いてあるとおり。
プログラミング始めて 1 年目くらいのタイミングで作ったソフトウェアなので全てがガバガバ。
定義更新作業は基本的にこの要件に沿って新曲の追加&既存曲の wr,avg,coef を更新する作業。
関連リポジトリ
GitHub で Organization を作ってそこに関連リポジトリを全部ぶち込んでる。
BPIManager / bpim-bookmarklet
https://github.com/BPIManager/bpim-bookmarklet
BPIManager / IIDX-Average-Calc
https://github.com/BPIManager/IIDX-Average-Calc
BPIManager / BPIM-Scores
https://github.com/BPIManager/BPIM-Scores
手順としては、
- BPIManager / bpim-bookmarklet で公式サイトから必要となるデータを入手する(皆伝全員のプレイデータ&アリーナランク上位 5000 名のプレイデータをマージしたもの)
- BPIManager / IIDX-Average-Calc で Coef(譜面ごとの上手い度傾斜を決めるやつ)を計算
- BPIManager / BPIM-Scores で更新差分をマージ&リリース てかんじ。 ただし、上記だけでは作業は簡潔しない(後述)
更新手順
必要となるデータを入手する
定義データを更新するにあたって必要となるデータは次の通り
- 皆伝全員のプレイデータ&アリーナランク上位 5000 名のプレイデータをマージしたもの
- 歴代全 1 データ
ここで、1.は eAMUSEMENT をスクレイピングして入手する。2.は有志によって作成されているであろうIIDX SP☆12 歴代全一表などから入手する(IIDX 公式の TOP RANKER ページがなくなってしまったので)。
1.については BPIManager/bpim-bookmarklet の/src/run/all.ts を実行する(Windows かつ Node 実行環境なら ts-node /src/run/all.ts など)
内部的には Puppeteer で実行中の Chrome に接続して eAMU サイトを自動巡回させる。そのために、上記スクリプトを回す前に起動オプション付きで Chrome を実行しておく。
“C:\Program Files\Google\Chrome\Application\chrome.exe” –remote-debugging-port=9222 –user-data-dir=remote-profile
eAMU サイトのメンテナンス時間中は巡回を止める仕組みになっているので基本的に上記スクリプトを回して PC つけっぱなしにしておけば OK。/src/savedata/以下に取得したデータが IIDX ID ごとに保存されていく。
だいたい 100 時間くらい放置しておけば巡回終了する。
データを定義更新に使える形に整形する
WR の更新
スクレイピングデータは不完全(全 1 を持っている人がデータ非公開にしている可能性がある)なので、別ルートで仕入れる必要がある。 ☆12 はIIDX SP☆12 歴代全一表など。☆11 は筐体で手動でデータを集めるくらいか。
上記歴代全 1 表を使った手順は次の通り。
- スプレッドシートを CSV で出力(例)
- 上記を src/test.csv に上書きする
- wrComparer.mjs を実行する
新曲データが入力された定義ファイルをあらかじめコミットしとく必要が多分ある?
その時点でアクティブな定義データの WR データと比較更新したものが result/result_zen1_12.json に保存されるので、これを IIDX-Average-Calc/inputs/release.json として使用する。
☆11 は人力で頑張るしかない。(TOP RANKER ページがなくなったので…)
スクレイピングデータの整形
上記で取得したデータは便宜上 IIDX ID ごとに保存されているので、これを楽曲ごとの JSON ファイルに変換する。 データは下記のフォーマットで保存されているので、
- /savedata
- /arena/
- /11/{IIDXID}.json
- /12/{IIDXID}.json
- /kaiden/
- /-11/{IIDXID}.json
- /-12/{IIDXID}.json
とりあえずこれを
- 11/{IIDXID}.json
- 12/{IIDXID}.json
みたいな感じで,一時フォルダをつくって arena、kaiden ごっちゃまぜにした形にしておく。(こうしたデータをIIDX-ScoresRepoにぶち込んでいる)
これを C:\GitHub\IIDX-ScoresRepo\内にぶちこんで、IIDX-Average-Calc/src/index.ts を実行する。
使用する関数は init() (最終コミットでは rs()が実行関数になっている)
IIDX/Average-Calc/res/以下に曲ごとに整形されたデータが出力される。
このデータをもとに、powCoef を算出するための中間データを更に作成していく.
ここで作成したいデータはこれみたいなファイル。
BPI0~100 に相当するスコアを順位ごとに取得したもの。
これも同じく IIDX-Average-Calc/src/index.ts で作成する。
使用する関数は rs() (何故 init()と rs()でファイルを分けていないのかは不明。)
rs()を実行すると IIDX-Average-Calc/release 内に release11.json、release12.json が出力される。
{ “title”: “#MAGiCVLGiRL_TRVP_B3VTZ[A]“, “difficulty”: 4, “wr”: 3483, “avg”: 3042, “BPI100”: 3478, “BPI90”: 3454, “BPI80”: 3439, “BPI70”: 3427, “BPI60”: 3410, “BPI50”: 3387, “BPI40”: 3347, “BPI30”: 3307, “BPI20”: 3242, “BPI10”: 3149, “max”: 3506, “playerSum”: 3336 },…
こんな感じで wr,avg,BPI0~100,max のデータが全て揃っていれば OK.
ポイント
- WR は先の手順で更新したものが使用される
- AVG はスクレイピングデータから自動計算
powCoef を計算する
上記で作成した release12.json を適当なサーバーにアップロードして、test.R の URL を変更。(最終コミットで http://133.242.168.137/bpim/releases/20230903/6release12.json となっている部分)
問題なければ CSV 形式で各楽曲係数が出力される。(デフォルトだと Documents フォルダ内)
これを定義ファイルに一括反映する。IIDX-Average-Calc/inputs/に result.csv という名前で保存する。更新前の release.json(定義ファイル)を同じく inputs フォルダに保存する。
これで IIDX-Average-Calc/src/powCoef.ts を実行すると、CSV の powCoef 値が定義データに転記されて final/sp{Level}.json に出力される。
スクレイピングで入手した全 1 データもここで定義データにコピーされるので Lv11、Lv12 両方とも実行する(Lv11 は powCoef は無視される)
あとはこれらのデータをマージすれば完成。
- BPIM-ScoresRepo/input に sp11.json、sp12.json をコピーする。
- build.bat の修正(コマンドライン引数–o に定義ファイル名を入力)
- build.bat の実行。output フォルダに release.json が出力される
- version.json の修正(build.bat の引数に指定した定義ファイル名をオブジェクト内 version に転記)
BPIM-Scores をコミットすればデータは自動的にデプロイされる。
多分これでいけると思う。思い出しながら書いたので間違っているかもしれない。