プロジェクト

全般

プロフィール

リファクタ #466

完了

[skin] スキンローダ・プロパティの汎用化・未実装対応

リファクタ #466: [skin] スキンローダ・プロパティの汎用化・未実装対応

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

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

100%

予定工数:

説明

#179 「TODO/FIXME 棚卸し」からの派生(skin 領域)。LR2/JSON ローダのコピペ整理とプロパティの未実装対応。

対象 TODO

  • src/.../skin/property/BooleanPropertyFactory.java:67,70,73 — select, decide 時の実装・未実装。
  • src/.../skin/property/IntegerIndexPropertyTypes.java:153 — 64-69 を target2, target3 に割り当てたい。
  • src/.../skin/SkinNoteDistributionGraph.java:26 — 各 Texture を 1 枚にまとめ glBindTexture 回数を削減。
  • src/.../skin/SkinNoteDistributionGraph.java:130 — スキン定義側で分岐できないか。
  • src/.../skin/SkinNoteDistributionGraph.java:153 — 高速化のアイデア。
  • src/.../skin/lr2/LR2SelectSkinLoader.java:22 — コピペのリファクタリング。
  • src/.../skin/lr2/LR2SkinCSVLoader.java:338 — 固有実装の汎用化。
  • src/.../skin/lr2/LR2PlaySkinLoader.java:945 — 固有実装の汎用化。
  • src/.../skin/lr2/LR2SkinHeaderLoader.java:49 — header 読み込みに失敗したら null を返す。
  • src/.../skin/json/JsonPlaySkinObjectLoader.java:39 — プレイスキン固有の値設定。note 未定義時は通らないため場所要検討。

対応観点

スキン互換性を崩さないこと。

優先度: 高め(一部未実装)


関連するチケット 1 (0件未完了1件完了)

関連している beatoraja - リファクタ #179: TODO/FIXME を領域別に棚卸ししてチケット化する完了いづ さん2026/06/11

操作

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

  • 関連している リファクタ #179: TODO/FIXME を領域別に棚卸ししてチケット化する を追加

いづ さん さんが7日前に更新 操作 #2

  • 対象バージョン1.3.1 にセット

いづ さん さんが7日前に更新 操作 #3

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

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

実装に着手しました。

  • ブランチ: feature/466
  • 対応方針: スキン互換性を崩さない範囲で、LR2SelectSkinLoader の重複 setDestination を共通ヘルパへ集約。実装可能な未実装項目(LR2SkinHeaderLoader の失敗時 null 返し+全呼び出し元の null 処理、JsonPlaySkinObjectLoader の play 固有値設定を note ブロック外へ移動)を対応。残る仕様判断・未実装・性能系 TODO(BooleanPropertyFactory の SAVE_SCORE/NO_SAVE_CLEAR、IntegerIndexPropertyTypes の target2/3、SkinNoteDistributionGraph の性能/設計案、LR2SkinCSVLoader/LR2PlaySkinLoader の laneCover 汎用化)は #464/#465 同様に決定コメント化(挙動不変)。

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

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

MR !141 が develop にマージされ、本チケットを完了とします。

実装サマリ

スキン互換性を崩さない範囲で、LR2 セレクトスキンローダの重複集約+実装可能な未実装項目を対応。残りは #464/#465 同様に決定コメント化。

リファクタ(挙動不変)

  • LR2SelectSkinLoader: 各 DST_BAR_* の重複(負値正規化+20引数 setDestination)を normalizeNegativeSize / setBarDestination(obj, values, str, yBase) ヘルパへ集約。BODY 系は yBase=dst.height、他は 0f で元式と完全一致。DST_NOTECHART/DST_BPMCHART は無変更。

実装(挙動変更)

  • LR2SkinHeaderLoader: 読込失敗時に null 返却+throws IOException 撤去(JSON/Lua の loadHeader と整合)。Files.lines().forEach() の遅延読み込みに備え IOExceptionUncheckedIOException を捕捉。呼び出し元 SkinLoader / SkinConfiguration / SkinConfigurationView を null チェック化。
  • JsonPlaySkinObjectLoader: play 固有値(close/loadend/playstart/judgetimer/finishmargin)を note ブロック外の新フック JsonSkinObjectLoader#applySkinSettings へ移動し、ロード毎に1回呼出。note 未定義スキンでも反映。

決定コメント化(ロジック不変)

  • BooleanPropertyFactory(67/70/73)、IntegerIndexPropertyTypes(153)、SkinNoteDistributionGraph(26/130/153)、LR2SkinCSVLoader(338)、LR2PlaySkinLoader(945) の 7 TODO を「なぜ今変えないか」を説明する決定コメントへ置換。

テスト

  • .\gradlew.bat test : 成功(全テスト合格)
  • 新規 LR2SkinHeaderLoaderNullReturnTest(非存在パス=IOException 経路 / 不正バイト=UncheckedIOException 経路の両方で null 返却を検証)

残課題(別途仕様確定が必要)

  • OPTION_NO_SAVE_CLEAR(クリア非保存)と target2/target3(2nd/3rd rival)は対応するデータソースが現状存在しないため、決定コメントで予約のみ・実装見送り。実装時は別チケットで仕様確定が必要。

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