[LR2] 最終プレイ日時を記録できるようにし、最終プレイ日ソートとして活用する方法 前編 [BeMusicSeeker]
前提条件
LR2(Lunatic Rave 2) + BeMusicSeeker という環境で遊んでいること
BeMusicSeekerの入手方法
以下の記事で紹介されている通り、ミラー版が公開されています。ミラー版では譜面ビューワについても、代替サイトへ繋がるように改変されています。
準備(必要な環境を整える)
ここでダウンロードするのは以下の2つです
DB Browser for SQLite
sqlite-tools-win-x64
はGUIで使えるSQLiteデータベース操作ツールです。LR2のsong.dbやスコアDBはSQLiteなのでこのツールが使えるとたまに便利です
はコマンドベースで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)」タブに移動してください。
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の値は、 1年1月1日0時0分からの経過ティック(1ティック=100ナノ秒)で表す時間(.NETのDateTimeで使われている)
-- UNIX時間は1970年1月1日午前0時0分からの秒数なので、差分は62135596800秒(719162日)となる
-- ティックを秒にするには、10,000,000で割れば良い、よってDateTime/10000000-62135596800 = UNIX時間となる
FROM ir_data INNER JOIN score USING(hash)
WHERE score.clear >= 1; -- FAILEDランプ以上を対象とする
コピペした後は以下のような状態だと思います。それでは実行ボタン「▶」を押してみましょう
音沙汰がない感じで終わってしまうので、少し不安かもしれませんが、以下の画像のように右下のSQLログで「ユーザー」を選択すると今回実行したSQLの状況が分かります。画像を拡大表示しないと分かりづらいと思いますが、今回実行したクエリーの実行はすべて成功していたので問題ないことが分かりました。
3. ファイルを上書き保存する
最後にファイルを保存しましょう。以下の画像のように「変更を書き込み」ボタンを押してください。このボタンを押さない限りは、元の.dbへの上書きは行われません。
4. プロジェクトを保存する
ここまでの作業で、スコア用のDBがscoreという名前でATTACHされた状態になっています。
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から取り除いてから実行するようにしてください。
後編へ続く
最終プレイ日ソートとして活用する方法については、このまま続けると長くなってしまうので記事を分割します。
この記事が気に入ったらサポートをしてみませんか?