操作
機能 #398
完了機能 #396: ゲーム内常駐ペット育成機能の追加
成長計算ロジック(独立モジュール)
機能 #398:
成長計算ロジック(独立モジュール)
説明
背景 / 目的¶
親チケット #396 MVP の一部。EXP・レベル・親密度・機嫌の計算を独立したロジックとして実装し、テスト容易性を確保する。
作業内容¶
- 曲レベル、総ノーツ、クリア種別、スコア率、BP を入力として EXP を計算する
- EXP に応じて Lv100 までレベルアップする閾値テーブルを実装する
- クリア種別・スコア率・BP に応じて親密度と機嫌を更新する
- 計算は純粋関数として実装し、副作用を持たせない
完了条件 (DoD)¶
- Failed / Normal clear / FullCombo / Perfect / Max の各ケースで EXP が期待値どおり算出される
- Lv100 上限で EXP がキャップされる
- 総ノーツ 0 など異常寄り入力でも例外が発生しない
- ユニットテストがすべて通る
補足¶
依存先: #397(ペット状態永続化)のデータ構造を参照する。
エージェント ちゃん さんが12日前に更新
- ステータス を 未着手 から 実装中 に変更
- 進捗率 を 0 から 10 に変更
実装に着手しました。
- ブランチ:
feature/398 - 対応方針: EXP・レベル・親密度・機嫌の計算を、ScoreData に依存しない純粋関数モジュール(
PetGrowthCalculator+ 入力/結果の値オブジェクト)として実装し、ユニットテストで境界値・代表ケースを網羅する。
エージェント ちゃん さんが12日前に更新
- ステータス を 実装中 から 完了 に変更
- 進捗率 を 10 から 100 に変更
対応が完了しました。
概要¶
EXP・レベル・親密度・機嫌の計算を、ScoreData などプレイ実行系に依存しない独立した純粋関数モジュールとして追加。プレイ結果連携(成長トリガー / 対象判定)は #399 の責務として分離し、本チケットはプリミティブ入力のみを受け取る計算ロジックに限定。
変更点¶
-
PetGrowthInput:不変の入力値オブジェクト。コンストラクタで防御的に正規化(負値→0、スコア率を [0,1]・NaN→0、クリア種別 null→NoPlay) -
PetGrowthResult:不変の結果値オブジェクト(獲得EXP / 新総EXP / 新レベル / 新親密度 / 新機嫌 / 次レベルまでのEXP) -
PetGrowthCalculator:純粋 static 計算ロジック。獲得EXP式、threshold(L)=100×(L−1)²のレベル閾値テーブル(Lv100・総EXPを 980100 でキャップ)、親密度 0–100(増加のみ)・機嫌 0–100(増減)、grow()はPetDataを非破壊 - 変更ファイル:
src/bms/player/beatoraja/PetGrowthInput.java、PetGrowthResult.java、PetGrowthCalculator.java、src/test/java/bms/player/beatoraja/PetGrowthCalculatorTest.java(新規4件、既存変更なし)
テスト¶
-
./gradlew cleanTest test --tests "bms.player.beatoraja.PetGrowthCalculatorTest": 成功(7/7 PASS、failures=0 / errors=0) -
./gradlew compileJava compileTestJava: 成功 - 補足:Docker 未起動のため
xvfb-run -a ./gradlew test(全体スイート)は未実行。本変更は JavaFX 非依存の純粋ロジックで影響範囲がないため、対象テストクラス限定実行で検証。
関連 MR¶
- !80 (feature/398 → develop)
操作