[LR2] 最終プレイ日時を記録できるようにし、最終プレイ日ソートとして活用する方法 前編 [BeMusicSeeker]


前提条件

  • LR2(Lunatic Rave 2) + BeMusicSeeker という環境で遊んでいること

BeMusicSeekerの入手方法

以下の記事で紹介されている通り、ミラー版が公開されています。ミラー版では譜面ビューワについても、代替サイトへ繋がるように改変されています。

準備(必要な環境を整える)

ここでダウンロードするのは以下の2つです

  1. DB Browser for SQLite

  2. sqlite-tools-win-x64

  1. はGUIで使えるSQLiteデータベース操作ツールです。LR2のsong.dbやスコアDBはSQLiteなのでこのツールが使えるとたまに便利です

  2. はコマンドベースでsqliteの操作が行えるツールです、SQLite公式から提供されています。

1. DB Browser for SQLiteのダウンロード

以下のサイトからダウンロードできます。

色々出てきますが一番下の".zip (no installer) for 64-bit Windows"が無難です

ダウンロードできたら、適当なフォルダに入れてください。私はD:\BINとかC:\BINに置きがちです。
「DB Browser for SQLite.exe」が起動できることを確認してください。とりあえず閉じてしまっても良いです。あとで使います。

2. sqlite-tools-win-x64のダウンロード

以下のサイトからダウンロードできます。

少々分かりづらいですが、下画像の赤枠部分を探してください。「sqlite-tools-win-x64」でページ内検索すれば1発です。

ダウンロードしたら解凍して中身を見てみましょう。3つの.exeファイルがあると思います。「sqlite3.exe」は今後使っていくアプリなので場所を忘れないようにしましょう。

最終プレイ日時を記録できるようにする

破壊的な操作は行われないですが、念のためsong.dbやスコアDBはバックアップした上で実践してください

1. DB Browser for SQLiteを起動し、song.dbを開く

赤枠「データベースを開く」を押して、song.dbを選択してください。

起動直後

開けたら、以下のような画面になっていると思います。
次に、赤枠「SQL実行(X)」タブに移動してください。

song.db開いた直後

2. SQLを実行する

次に以下のSQLコードをDB Browser for SQLiteの画面にコピペしてください。2行目のスコアDBの場所は必ず自分のものに書き換えてください。

-- スコアDBをアタッチする、ファイルの場所は書き換えてください
ATTACH DATABASE 'D:\LR2beta3\LR2files\Database_bk\Score\NEETED.db' AS score;

-- 最終プレイ日時を保存するテーブルをスコアDBへ作成する
CREATE TABLE score.history (
  hash TEXT PRIMARY KEY,
  lastplay INTEGER
);

-- scoreテーブルへINSERT時(未プレイ譜面のスコアが記録されたとき)に実行されるトリガーを設定
CREATE TRIGGER score.update_history_after_insert AFTER INSERT ON score
FOR EACH ROW
BEGIN
  INSERT OR REPLACE INTO history(hash, lastplay)
  VALUES (NEW.hash, strftime('%s', 'now', '+9 hours'));
END;

-- scoreテーブルへUPDATE時(既プレイ譜面のスコアが記録されたとき)に実行されるトリガーを設定
CREATE TRIGGER score.update_history_after_update AFTER UPDATE ON score
FOR EACH ROW
BEGIN
  INSERT OR REPLACE INTO history(hash, lastplay)
  VALUES (NEW.hash, strftime('%s', 'now', '+9 hours'));
END;

-- ir_data.lastupdateを最終プレイ日時とみなしてhistoryテーブルへINSERTする
-- LR2IRに接続している状態でプレイしたり、選曲画面で10秒経ってIR情報が更新されたときの日時
-- "\LR2files\Ir\*.xml"の更新日時をBeMusicSeekerが設定していると思われるので、LR2IRのマイページでスコアキャッシュを無効にしていると設定されない値かも?
INSERT INTO history
SELECT 
  hash,
  ir_data.lastupdate/10000000-62135596800 AS 'lastplay'
  -- ir_data.lastupdateの値は、 11100分からの経過ティック(1ティック=100ナノ秒)で表す時間(.NETのDateTimeで使われている)
  -- UNIX時間は197011日午前00分からの秒数なので、差分は62135596800秒(719162日)となる
  -- ティックを秒にするには、10,000,000で割れば良い、よってDateTime/10000000-62135596800 = UNIX時間となる
FROM ir_data INNER JOIN score USING(hash)
WHERE score.clear >= 1; -- FAILEDランプ以上を対象とする

コピペした後は以下のような状態だと思います。それでは実行ボタン「▶」を押してみましょう

SQLをコピペした後の画面

音沙汰がない感じで終わってしまうので、少し不安かもしれませんが、以下の画像のように右下のSQLログで「ユーザー」を選択すると今回実行したSQLの状況が分かります。画像を拡大表示しないと分かりづらいと思いますが、今回実行したクエリーの実行はすべて成功していたので問題ないことが分かりました。

SQL実行後のログ

3. ファイルを上書き保存する

最後にファイルを保存しましょう。以下の画像のように「変更を書き込み」ボタンを押してください。このボタンを押さない限りは、元の.dbへの上書きは行われません。

変更を書き込みボタンを押すところ

4. プロジェクトを保存する

ここまでの作業で、スコア用のDBがscoreという名前でATTACHされた状態になっています。

ATTACH DATABASE 'D:\LR2beta3\LR2files\Database_bk\Score\NEETED.db' AS score;

上述のSQLより抜粋

ATTACHされている状態だと、song.dbとスコア用DBの二つのファイルに分かれていても相互の.dbの情報を参照しながら処理が行えます。
今後もDB Browser for SQLiteを使うかもしれないので、このATTACHされた状態のプロジェクトを保存しておきましょう。保存したプロジェクトは次に開いた時も自動的にスコア用のDBをATTACHしてくれます。
プロジェクトを保存ボタンを押して保存しておきましょう。「LR2.sqbpro」などとしておくと良いでしょう。

プロジェクトを保存

5. 無事作業が終わったと思うので細かい話

お疲れさまでした。
今後は、LR2のプレイ中に自動的にhistoryテーブルのlastplayに最終プレイ日時が記録されていきます。

結局、上のSQLで何をしていたかというと、トリガーという仕組みを使って、以下のようなものを仕込んだということです。

条件: scoreへのUPDATEやINSERTがあったとき→つまり曲をプレイした時
やること: プレイ譜面のhash, 現在の時刻をhistoryに書き込む

トリガーはDB内に定義されるものなので、SQLiteを使用しているLR2のプレイ中にも発動することになります。

また、SQLの最後の方で行っていた、
ir_data.lastupdateを最終プレイ日時とみなしてhistoryテーブルへINSERTする
の処理については、それはプレイ日時じゃないだろと思う方はSQLから取り除いてから実行するようにしてください。

後編へ続く

最終プレイ日ソートとして活用する方法については、このまま続けると長くなってしまうので記事を分割します。

この記事が気に入ったらサポートをしてみませんか?