機能 #381
完了機能 #344: [Phase 4] レンダリングと UI/スキン描画
beatoraja スキン: Lua VM 統合+スキンランタイム
説明
目的¶
beatoraja スキンエンジンの 2/3。埋め込み Lua VM(mlua 等)を導入し、beatoraja の Lua スキン (.luaskin/.lua) を実行して #380 の IR を生成する。ユーザーの実スキン samples/skin/Luxe_Flat(全 Lua)・WMII_FHD/result(Lua)が対象。
スコープ¶
-
mlua(または同等)の埋め込み。単体 exe ・低レイテンシ方針との整合(ビルド・依存影響を評価)。 - beatoraja スキン Lua ランタイム API の実装:
require("main_state")/event_util/timer_util/skin_config/ property op 生成 / offset/customtimer/customevent 生成 等。 -
.luaskin(return require("load").load_parts())・個別.luaを実行し #380 IR へ集約。サンドボックス化(ファイル IO ・実行時間上限)。
スコープ外¶
- timer/value/option/text ID のゲーム状態接続・画面別描画→ #382。
検証¶
Lua 実行→IR 生成はコンテナで TDD(実スキンを env 駆動で読み込み IR 統計を検証)。実描画は Windows ホスト。
担当¶
Codex 委譲(ランタイム+ IR 生成)。
依存¶
#380(IR 拡張)にブロック。
エージェント ちゃん さんが14日前に更新
- ステータス を 未着手 から 却下 に変更
ネイティブ UI を主体とする方針転換(2026-06-22 ユーザー決定)により beatoraja スキンエンジンは不要化したため 却下。将来必要になった際に再起票する。
エージェント ちゃん さんが14日前に更新
- ステータス を 却下 から 未着手 に変更
却下を取り消して復活(beatoraja スキン完全移植方針へ再転換)。 依存: #380。
エージェント ちゃん さんが14日前に更新
設計方針(セキュリティ制約): Lua 実行のサンドボックス化¶
ユーザー指示(2026-06-22): 任意の Lua スクリプトが実行できてしまうのは脆弱性になるため、samples/ のスキンが使っている Lua 関数/API に限定してよい。
- Lua VM はサンドボックス化:
os/io/debug/package/require(任意)/dofile/loadfile/load等の危険な標準ライブラリは除去/無効化。 - 提供するのは beatoraja スキンが実際に使う API のみ:
require("main_state")/event_util/timer_util/skin_config(ホワイトリストされたモジュール)と、スキンが参照する property/op/timer 生成関数。requireはこれらホワイトリストのみ解決(任意ファイル読み込み不可。スキンフォルダ内のload.lua等の同梱 Lua はパス制限付きで許可)。 - ファイル IO 禁止・実行時間上限。手持ちスキン(
Luxe_Flat等)が使う関数集を実スキンから棚卸し、それをホワイトリストとして実装。
エージェント ちゃん さんが14日前に更新
- ステータス を 未着手 から 実装中 に変更
- 進捗率 を 0 から 10 に変更
実装に着手しました。
- ブランチ:
feature/381-beatoraja-lua-vm - 対応方針:
mlua(vendored Lua 5.4)をferrhythm-skinにluafeature として組み込み、beatoraja スキン Lua ランタイム(main_state/event_util/timer_util/skin_config)とサンドボックス(読取のみ・スキン内パスジェイル、書込 no-op、実行時間/命令数上限)を実装。.luaskinを実行して #380 IR(BeatorajaSkin)へ集約する。timer/value/option/text ID のゲーム状態接続・描画は #382。
エージェント ちゃん さんが14日前に更新
- ステータス を 実装中 から 完了 に変更
- 進捗率 を 10 から 100 に変更
対応が完了しました。
概要¶
beatoraja スキンエンジンの 2/3。mlua(vendored Lua 5.4)を ferrhythm-skin に埋め込み、beatoraja の .luaskin/.lua を実行して #380 の BeatorajaSkin IR へ集約するサンドボックス付きランタイムを実装。timer/value/option/text ID のゲーム状態接続・画面別描画は #382。
変更点¶
- Lua 戻り値 →
JsonValue→ 既存skin_from_json再利用で Lua/JSON 同一 IR(空テーブル→空配列・整数/浮動小数整形・循環/深さガード)。 -
luafeature(default-on)でmlua追加。--no-default-featuresは従来通り JSON/LR2 のみでビルド可。 - サンドボックス(読取のみ・スキン内パスジェイル・書込 no-op): stdlib は string/table/math/utf8 のみ、自前 require/dofile/io、
os/io.write/debug/package/load*/..エスケープ拒否、命令数/実時間/メモリ上限。 -
main_state/timer_util/event_util/skin_configはニュートラル stub(実状態束縛は #382)。luajava.bindClassは inert stub(require・global 両対応)。 -
.cargo/config.toml: DevContainer の gcc-14 が vendored Lua を-O2で ICE(segfault)するため linux-gnu 限定で-fno-dceを付与して回避(Windows/MSVC ビルドは不変)。 - 変更ファイル:
crates/ferrhythm-skin/src/beatoraja/lua/{mod,sandbox,runtime,convert}.rs(新規)・error.rs・lib.rs・beatoraja/mod.rs・Cargo.toml・.cargo/config.tomlほか 8 件。
テスト¶
-
cargo test(ワークスペース全体): 成功。ferrhythm-skin 単体 49 テスト green。 -
cargo clippy --all-targets/cargo fmt --all -- --check: 成功。 - 実スキン 6 種(Luxe_Flat music_select/result/courseresult/playernotesradar、WMII_FHD result/courseResult)の IR 生成を env 駆動で確認済み。
関連 MR¶
- !26 (feature/381-beatoraja-lua-vm → develop)