スコア計算 仕様解説
← 計算ページへ戻る本ページは当サイトのスコア計算に実装されているロジック全体を、計算の流れ順に図で解説するものです。 数値例はすべて下記のデモ編成 × 楽曲「MONSTER GENERATiON」(428ノーツ / 104秒) をビルド時に実際の計算エンジンへ通して生成しています。 有志による計測・推定値を含むため、ゲーム内の挙動と完全に一致することを保証するものではありません。
0. スコア計算の全体像とデモ編成
リザルトのスコアは チーム属性値 を土台に、ノーツ 1 個ずつの素点を積み、 そこへスコアアップスキルと判定縮小スキルの上乗せ、最後にバッジ・ブローチの最終補正が掛かって決まります。以下の 6 段階を章ごとに拡大して見ていきます。
デモ編成(全章共通の数値例)
| 枠 | 衣装 | 属性 | スキル (Lv5) |
|---|---|---|---|
| センター | 四葉環「記念日2024」UR | Melody | 判定縮小(Perfect) 20ノーツ毎 / 40% / 4秒 / ×1.6 |
| メンバー | 和泉一織「10th Anniversary」UR | Melody | スコアアップ(コンボ) 13ノーツ毎 / 49% / +4,618 |
| メンバー | 九条天「7th Anniversary」UR | Shout | スコアアップ(タイマー) 5秒毎 / 57% / +5,674 |
| メンバー | 七瀬陸「リスポ2」UR | Shout | 判定縮小(Perfect) 23ノーツ毎 / 39% / 5秒 / ×1.6 |
| メンバー | 六弥ナギ「10th Anniversary」UR | Melody | スコアアップ(Perfect) 13ノーツ毎 / 40% / +5,846 |
| フレンド | 亥清悠「7th Anniversary」UR | Melody | スコアアップ(コンボ) 13ノーツ毎 / 48% / +4,304 |
条件: 全員特訓済み / スキル Lv5 / イベント特効なし / ラビットノート・共通ブローチなし / スコアアップアシスト OFF / バッジ 16%(スコア計算ページの既定値)。
1. チーム属性値
まず編成 6 枠それぞれの Shout / Beat / Melody を合算してチーム属性値を作ります。 衣装 1 枠ぶんの値は「基礎値 × イベント特効」にラビットノートとブローチを足したもの。 合算後、センターとフレンドのセンタースキル(レアリティ別: UR +10% / SSR +7%)が 自属性と同じ属性へ上乗せされます。
デモ編成の実数値がこちら。センター(四葉環)とフレンド(亥清悠)がどちらも Melody UR のため、 Melody にはセンタースキルが 2 回分(+4,105 と +4,106)効いています。 スロット 1 / 4 の固有ブローチ +1,600 も Melody に乗っています。
実装詳細(式・丸めタイミング)
実装: computeTeam() (src/lib/score/teamBuilder.ts)
- 未特訓の衣装は自属性のみ
sp_time × sp_valueを*_maxから減算(他属性・特訓済みは max のまま) - イベント特効は枠ごとに
Math.round(基礎値 × 特効倍率)(四捨五入) - ラビットノートは特効倍率を掛けないフラット加算。同キャラ複数積みでもキャラ初出スロット(0-4、フレンド除外)に 1 回だけ帰属
- 固有ブローチは UR のみ装着可。条件(グループ縛り・全属性編成・同一衣装上限など)は
resolveDeckBroachs()で判定。共通ブローチの装着数は容量ルール(非 UR=0 / 固有持ち UR=1 / それ以外 UR=2、ADR 0039)に従う - センタースキルはセンター分とフレンド分の増加率を合算してから 1 回だけ floor:
floor(合算属性値 × (センター率 + フレンド率) / 100)(ADR 0040 / 0041)
2. 1ノーツの素点とライト倍率
ノーツを 1 個叩くたびに「そのノーツの属性のチーム属性値」から素点が計算されます。 レートは白ノーツ 2.5% / 色ノーツ 3.0%。さらにライブが進んでライトが増えるほどライト倍率が掛かり、サビ光では最大 3.0 倍になります。
デモ編成でサビ光 (×3.0) 区間の Melody 色ノーツを 1 個叩いた場合の計算がこちら。 乗算のたびに小数点以下が切り捨てられる(⌊ ⌋)のがポイントです。
これを全 428 ノーツぶん合算したものが、スキルが一切発動しなかった場合の素点合計762,905 です。
実装詳細(式・丸めタイミング)
実装: calcNoteScore() (src/lib/score/simulation.ts)
perNoteBase = floor(appeal × NOTE_RATE)→score = floor(perNoteBase × LIGHT_MULTIPLIER)の 2 段階 floorNOTE_RATE = white 0.025 / color 0.030、LIGHT_MULTIPLIER = 1.0〜3.0(8 グループ)- スコアアップアシスト ON のときは属性値段階で
appeal = floor(チーム属性値 × 1.2)を適用(最終スコアへの乗算ではない) - ノーツの並びはグループ(序盤20 → ライト2〜6 → サビ光)の順を保ち、グループ内のみシャッフルして近似(
flattenNotes())
3. スコアアップスキル
スコアアップスキルは発動するたびに固定値をそのまま加算するスキルです。 発動タイミングの数え方で 2 種類あります:ノート型(コンボ / Perfect)は「◯ノーツごと」、タイマー型は「◯秒ごと」に 発動判定が走り、確率(per)を引けば +value 点です。
デモ編成にはスコアアップが 4 枚います。期待値ベースの寄与は次のとおりで、合計 +286,771 です。
| 衣装 | タイプ | 最大発動回数 | 期待値寄与 | 理論最大寄与 |
|---|---|---|---|---|
| 和泉一織 | ノート型 (13ノーツ毎) | 32 回 | +74,498 | +152,038 |
| 九条天 | タイマー型 (5秒毎) | 20 回 | +67,270 | +118,019 |
| 六弥ナギ | ノート型 (13ノーツ毎) | 32 回 | +76,987 | +192,468 |
| 亥清悠 | ノート型 (13ノーツ毎) | 32 回 | +68,016 | +141,700 |
実装詳細(式・丸めタイミング)
実装: calcExpectedScore() / runOnce() (src/lib/score/simulation.ts)
- 期待値:
floor((denom / count) × per/100 × value)。分母 denom はノート型が総ノーツ数、タイマー型が曲の秒数。衣装単位で 1 回だけ floor(spec §6-6 H38 準拠) - 理論最大:
floor((denom / count) × value)(全発動) - MC シミュレーションでは判定ごとに乱数ロール(
rng.next()×100 < per)で発動を決める - 判定強化(BAD→Perfect など)・判定ガード・スコアダウンはスコアに影響しないため計算対象外(ADR 0037)
4. 判定縮小スキル
判定縮小スキルは「◯ノーツごと(タイマー型は◯秒ごと)」に確率 per% で発動し、持続◯秒のあいだに叩いたノーツの素点を倍率(Lv5 で 1.6 倍)に増幅するスキルです。 固定値加算のスコアアップと違い、素点そのものを底上げするためチーム属性値が高いほど効きます。
下図はデモ編成の縮小 2 枚(四葉環 / 七瀬陸)の発動タイムラインです。 縦点線ごとに発動判定が行われ、コインが緑なら発動 (橙の塗りで持続秒数ぶんカバー)、灰なら不発。 先頭の灰色領域は後述の先頭除外です。
4-1. インタラクティブに試す
スライダーでノーツ数 / 確率 / 秒数を変え、「+衣装追加」で縮小の枚数を増やし、 「別の試行」でシードを変えられます。発動回数・カバー時間がどう変わるか確認してみてください。
4-2. 先頭除外
曲の最初のほうは縮小の効果対象外です。除外幅は「序盤演出区間(最初の約 20 ノーツ)」と 「編成内でいちばん早く発動できる縮小の発動位置」の大きい方。 デモ編成では max(21, 20) = 21 ノーツが対象外です。
4-3. カバー率と 100% キャップ
各縮小スキルの「最大カバー秒数」を単純合算して曲の長さで割ったものがカバー率です。 デモ編成は 四葉環 81秒 + 七瀬陸 88秒 =169秒 で曲の長さ 104秒 を大きく超えるため、100% でキャップされます(超過分は無駄になる = 縮小の積みすぎは効率が落ちる、の根拠)。 さらに実際には発動確率 per(40% / 39%)があるため、 発動ムラを織り込んだ期待カバー率は 66.7% になります(下段バー)。
4-4. スコアへの上乗せ式
縮小の上乗せは「対象ノーツの素点合計 × 追加倍率 × カバー率」。倍率 1.6 のうち通常分 1.0 を除いた0.6 倍ぶんが上乗せです。ここで使うカバー率には 2 種類あります:
- すべての発動判定に成功した場合(カバー率 100%): +441,342(理論最大)
- 発動確率を織り込んだ場合(期待カバー率 66.7%): +294,534(期待値)
4-5. スコアアタックでの位置づけ — 縮小 vs スコアアップ
デモ編成で 1 枚あたりの寄与を比べると、縮小はスコアアップの約 2 倍。デッキ合計では スコアアップ 4 枚 vs 縮小 2 枚でほぼ同じ額になりますが、枚数あたりの効率は縮小が上です。
さらにスコアアップは固定値加算のため属性値が伸びても寄与が変わらないのに対し、 縮小は素点の底上げのため属性値に比例して伸びます。イベント特効などで チーム属性値が跳ね上がるスコアアタック編成ほど、縮小の相対価値が上がります。
実装詳細(式・丸めタイミング)
実装: calcShrinkCoverage() / runOnce() (src/lib/score/simulation.ts)、computeShrinkExclusion() (src/lib/score/shrinkExclusion.ts)
- 先頭除外
excludeHead = max(notes_20 サイズ, デッキ内縮小 count の最小値)。タイマー型はノート換算floor((count / songDuration) × notesCount)で比較 - カード別カバー秒
floor((対象ノーツ数 / count) × value)(タイマー型は分母 songDuration)。衣装単位で 1 回だけ floor(spec §6-6 H39) - 実効秒数
effectiveSeconds = songDuration − 先頭除外の秒換算。内部カバー率は effectiveSeconds で 100% キャップ、表示用 raw は超過可 - 期待値スコアは
(rateᵢ − 1)をスキルごとに加重した期待カバー率を使用し、構造的到達可能秒数でキャップ(ADR 0036) - 上乗せの基準スコア(eligibleBaseScore)は excluded ノーツを除いた素点合計。アシスト ON 時は
floor(eligibleBaseScore / 1.2)でアシスト分を剥離してから縮小倍率を掛ける(spec §6-5 BN22) - 複数縮小の同時発動なし(キューイング)。発動中の倍率は「いずれか 1 つの rate」で重ねがけなし
- UI の「スキル最大発動回数」表示はノーツ全体(タイマー型は曲全体)基準で、先頭除外はスコア寄与側にのみ効く
5. 最終補正(バッジ・ブローチ)
ライブ終了時スコア(素点 + スコアアップ + 縮小)に、最後の 2 つの補正が掛かります。SCOREUP バッジはスコア全体への倍率(例: 16% なら ×1.16)、ブローチのスコア直接加算(種類 9 の固有ブローチ)は倍率の外側でのフラット加算です。 このデモ編成に種類 9 のブローチはないため +0 ですが、持っている編成では最後に足されます。
実装詳細(式・丸めタイミング)
実装: applyFinalBonus() (src/lib/score/simulation.ts)
finalScore = floor(liveEndScore × (1 + badge% / 100)) + broachScoreBonus- スコアアップアシスト(+20%)は §2 のとおり属性値段階で適用済みのため、ここでは乗算しない
- ブローチのスコア直接加算(種類 9)はバッジ倍率の外側(倍率が掛からない)
6. 理論値・期待値・シミュレーション
スキルは確率発動なので、同じ編成でもスコアは揺らぎます。スコア計算ページでは 3 種類の数値を出しています:理論最低(全スキル不発)、理論最高(全スキル発動)、期待値(発動確率で加重した平均的な見込み)。さらにモンテカルロ(MC)シミュレーションで発動の当たり外れを乱数で再現し、分布として観測します。
デモ編成を 1000 試行した実際の分布がこちら。平均 1,531,124 / 標準偏差 75,680 / 上位 10% ライン (p90) 1,630,646 でした。
6-1. 全発動モード
スコア計算ページの「縮小全発動」「スコアアップ全発動」チェックを ON にすると、 MC 試行内で該当スキルの確率ロールを常に成功扱いにできます。確率の揺らぎがどれだけスコアに 効いているかを、OFF/ON の比較で分離して確認できます。
- 適用対象は MC シミュレーション結果のみ(平均・中央値・p90・ヒストグラム・衣装別寄与など)。理論最高/最低・期待値の表示は影響を受けません
- 「縮小全発動」でもキューイング仕様は維持されるため、カバー率は引き続き 100% でキャップされます
- 両方 ON にすると理論最高スコアに近い分布になります
実装詳細(MC の内部構造)
実装: runSimulation() / runOnce() (src/lib/score/simulation.ts)
- 乱数は sfc32(seed 指定で決定論化、ADR 0038)。既定 100 試行、このページのデモは seed 固定 1000 試行
- 1 試行 = タイマー型スキルの事前ロール → ノーツ順に「縮小キュー処理 → 発動判定 → 素点 + 縮小上乗せ + スコアアップ加算」→ 最終補正
- 期待値は理論最高を超えないよう同段階合計でクランプ(縮小の秒→ノート離散化誤差対策、ADR 0036)
- 統計値: mean / median / stddev / p90 / mcMin / mcMax と衣装別の平均発動回数・平均寄与