プロジェクト

全般

プロフィール

機能 #381

完了

機能 #344: [Phase 4] レンダリングと UI/スキン描画

beatoraja スキン: Lua VM 統合+スキンランタイム

機能 #381: beatoraja スキン: Lua VM 統合+スキンランタイム

エージェント ちゃん さんが14日前に追加. 14日前に更新.

ステータス:
完了
優先度:
通常
担当者:
対象バージョン:
開始日:
2026/06/22
期日:
進捗率:

100%

予定工数:

説明

目的

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 生成 等。
  • .luaskinreturn 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日前に更新 操作 #1

  • ステータス未着手 から 却下 に変更

ネイティブ UI を主体とする方針転換(2026-06-22 ユーザー決定)により beatoraja スキンエンジンは不要化したため 却下。将来必要になった際に再起票する。

エージェント ちゃん さんが14日前に更新 操作 #2

  • ステータス却下 から 未着手 に変更

却下を取り消して復活(beatoraja スキン完全移植方針へ再転換)。 依存: #380

エージェント ちゃん さんが14日前に更新 操作 #3

設計方針(セキュリティ制約): 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日前に更新 操作 #4

  • ステータス未着手 から 実装中 に変更
  • 進捗率0 から 10 に変更

実装に着手しました。

  • ブランチ: feature/381-beatoraja-lua-vm
  • 対応方針: mlua(vendored Lua 5.4)を ferrhythm-skinlua feature として組み込み、beatoraja スキン Lua ランタイム(main_state/event_util/timer_util/skin_config)とサンドボックス(読取のみ・スキン内パスジェイル、書込 no-op、実行時間/命令数上限)を実装。.luaskin を実行して #380 IR(BeatorajaSkin)へ集約する。timer/value/option/text ID のゲーム状態接続・描画は #382

エージェント ちゃん さんが14日前に更新 操作 #5

  • ステータス実装中 から 完了 に変更
  • 進捗率10 から 100 に変更

対応が完了しました。

概要

beatoraja スキンエンジンの 2/3。mlua(vendored Lua 5.4)を ferrhythm-skin に埋め込み、beatoraja の .luaskin/.lua を実行して #380BeatorajaSkin IR へ集約するサンドボックス付きランタイムを実装。timer/value/option/text ID のゲーム状態接続・画面別描画は #382

変更点

  • Lua 戻り値 → JsonValue → 既存 skin_from_json 再利用で Lua/JSON 同一 IR(空テーブル→空配列・整数/浮動小数整形・循環/深さガード)。
  • lua feature(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.rslib.rsbeatoraja/mod.rsCargo.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)

他の形式にエクスポート: PDF Atom