操作
機能 #365
完了機能 #340: [Phase 1] 非依存コア(パーサ/スキンIR/DB/タイミング)
ferrhythm-score: 体力ゲージ・スコア・クリアランプ判定(非依存純ロジック)
機能 #365:
ferrhythm-score: 体力ゲージ・スコア・クリアランプ判定(非依存純ロジック)
説明
目的¶
判定結果(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-timing(Judgement)。
要確定(実装時)¶
- ゲージ仕様の準拠先(LR2 / beatoraja)と具体的な増減量 は、判定窓と同様に「音ゲーの肝」なので実装着手時にユーザーと確定する(数値はソースで裏取り)。
検証(コンテナ)¶
境界値・代表ケース中心の TDD(各ゲージのフルコンボ通過 / ボーダー丁度 / サバイバル枯渇、EX-SCORE・ランク境界、ランプ判定)。cargo test / clippy / fmt グリーン。
担当¶
Codex 委譲(source-only)
依存¶
Phase 1(#349 判定、#350 譜面の #TOTAL/ノート数)
エージェント ちゃん さんが15日前に更新
- ステータス を 未着手 から 実装中 に変更
- 進捗率 を 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]。
- 増減: AEASY=EASY
-
確定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日前に更新
- ステータス を 実装中 から 完了 に変更
- 進捗率 を 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
serdefeature。 - 変更ファイル:
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) マージ済み
操作