プロジェクト

全般

プロフィール

機能 #365

完了

機能 #340: [Phase 1] 非依存コア(パーサ/スキンIR/DB/タイミング)

ferrhythm-score: 体力ゲージ・スコア・クリアランプ判定(非依存純ロジック)

機能 #365: ferrhythm-score: 体力ゲージ・スコア・クリアランプ判定(非依存純ロジック)

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

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

100%

予定工数:

説明

目的

判定結果(Judgement)を入力に、体力ゲージ・スコア・クリアランプ/ランクを導出する純ロジック群。判定(#349)と地続きのプラットフォーム非依存層で、コンテナ TDD で固める。現状この層の受け皿チケットが無いため新設。

スコープ

  • 体力ゲージ: ゲージ種別(ASSIST EASY / EASY / NORMAL(GROOVE) / HARD / EX-HARD / HAZARD 等)ごとの増減量・上限/下限・クリアライン(NORMAL系=終了時ボーダー%、HARD系=サバイバル0%)。回復量は譜面 #TOTAL とノート数依存(#TOTAL・ノート数は chart(#350) から入力として受け取り疎結合にする)。
  • スコア: EX-SCORE(PG=2 / GR=1)、達成率%、ランク(MAX/AAA/AA/.../F)、コンボ・最大コンボ、各判定カウント集計。
  • クリアランプ判定: ゲージ種別と結果から FAILED/ASSIST/EASY/CLEAR/HARD/EXHARD/FULLCOMBO/PERFECT/MAX 等を導出。
  • 判定モデルは [[judge-model]](ferrhythm-timing)準拠。Judgement は ferrhythm-timing から受け取る。

配置

  • 新規クレート(例 ferrhythm-score)を crates/ 配下に追加。依存: ferrhythm-core, ferrhythm-timingJudgement)。

要確定(実装時)

  • ゲージ仕様の準拠先(LR2 / beatoraja)と具体的な増減量 は、判定窓と同様に「音ゲーの肝」なので実装着手時にユーザーと確定する(数値はソースで裏取り)。

検証(コンテナ)

境界値・代表ケース中心の TDD(各ゲージのフルコンボ通過 / ボーダー丁度 / サバイバル枯渇、EX-SCORE・ランク境界、ランプ判定)。cargo test / clippy / fmt グリーン。

担当

Codex 委譲(source-only)

依存

Phase 1(#349 判定、#350 譜面の #TOTAL/ノート数)

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

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

実装に着手しました。

  • ブランチ: feature/365-score
  • 対応方針: 判定結果(Judgement)を入力に体力ゲージ・スコア・クリアランプを導出する非依存純ロジック新クレート ferrhythm-score(依存=core/timing)をコンテナTDDで実装。

確定した仕様(音ゲーの肝・ユーザー確定 2026-06-21)

  • ゲージ値=LR2準拠(beatoraja _LR2 定数)/TOTALの効き方=beatoraja モディファイア方式。判定配列順 [PG, GR, GD, BD, PR(見逃しPOOR), MS(空POOR)]a=TOTAL/N
  • ゲージ6種: ASSIST EASY(border60) / EASY(80) / NORMAL(80) は groove回復型(開始20/床2/上限100)、HARD / EX-HARD / HAZARD は survival即死型(開始100/床0/上限100)。
    • 増減: AEASY=EASY [1.2a,1.2a,0.6a,−3.2,−4.8,−1.6] / NORMAL [1.0a,1.0a,0.5a,−4,−6,−2] / HARD [0.1,0.1,0.05,−6,−10,−2] guts{{30,0.6}} / EX-HARD [0.1,0.1,0.05,−12,−20,−2] guts無し / HAZARD [0.15,0.06,0,−100,−100,−10]
  • 確定4論点: (1)HARD低ゲージ補正=コード値 30%/0%(<30%で減少×0.6・0%失敗、調整可能フィールド化)。(2)EX-HARD=HARDのBAD/PRを2倍・空MS据え置き・guts無し。(3)低TOTAL補正=beatoraja方式(回復減):grooveは回復×TOTAL/N、HARD/EX-HARDは回復のみ低TOTALで逓減(LIMIT_INCREMENT、TOTAL≤160で回復0)、HAZARDは固定。ダメージは常にTOTAL非依存(LR2のダメージ増 MODIFY_DAMAGE は不採用)。(4)段位ゲージ=値表(CLASS/EXCLASS/EXHARDCLASS)だけ定義・コース連結はスコープ外
  • デフォルト#TOTAL(譜面省略時)= beatoraja式 max(260, 7.605·N/(0.01·N+6.5))(24Kのみ300)。
  • スコア: EX-SCORE(PG=2/GR=1)、達成率%=EX/(N×2)×100、ランク=IIDX式 MAX+9段(MAX/AAA≥8/9/AA≥7/9/A≥6/9/B≥5/9/C≥4/9/D≥3/9/E≥2/9/F)。コンボ継続=PG/GR/GD・切断=BAD/見逃しPOOR・空POOR不変。
  • クリアランプ: NoPlay<Failed<AssistEasy<Easy<Clear<Hard<ExHard<FullCombo<Perfect<Max(ゲージ種別ランプとコンボ品質ランプの高い方)。

出典: beatoraja OSS(GaugeProperty.java/GrooveGauge.java/BMSPlayerRule.java)+コミュニティ資料、独立調査5本が同一値に収束。実装は Codex 委譲(source-only)、Claude がレビュー・ビルド・テストを担当。

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

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

対応が完了しました。

概要

判定結果(Judgement)を入力に体力ゲージ・EX-スコア・クリアランプ/ランクを導出する非依存純ロジッククレート ferrhythm-score(依存=core/timing)を追加。#TOTAL・ノート数は入力として受け取り疑結合。コンテナTDDで確定。

変更点

  • gauge: 6種のプレイゲージ(AssistEasy/Easy/Normal=groove回復型、Hard/ExHard/Hazard=survival即死型)+段位 Class/ExClass/ExHardClass の値表のみ定義(コース連結はスコープ外)。ゲージ値=LR2準拠・TOTALの効き方=beatoraja方式のハイブリッド。回復は groove で TOTAL/N、Hard/ExHard は LimitIncrement(TOTAL≤160で回復0)、その他固定。ダメージは常にTOTAL非依存(MODIFY_DAMAGE不採用)。HARD補正 30%/×0.6・0%で失敗ラッチ。default_total は beatoraja式 max(260, 7.605N/(0.01N+6.5))
  • score: EX-SCORE(PG=2/GR=1)、達成率%、IIDX式 MAX+9段ランク、コンボ/最大コンボ、各判定カウント、空POORカウンタ。
  • lamp: クリアランプ導出。ゲージのクリア可否でゲートし、FC品質(FullCombo/Perfect/Max)はクリア済みランプのみ引き上げる。
  • optional serde feature。
  • 変更ファイル: crates/ferrhythm-score/Cargo.toml/src/{lib,error,gauge,score,lamp}.rs)・Cargo.lock。計7ファイル。

テスト

  • cargo test -p ferrhythm-score : 成功(28)/--features serde : 成功(29)
  • cargo test --workspace : 成功(全クレート緑・リグレッションなし)
  • cargo clippy --workspace --all-targets : 成功(警告0)/cargo fmt --all -- --check : 成功

関連 MR

  • !6 (feature/365-score → develop) マージ済み

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