obj v0008 g_detailObj - cwtickle/danoniplus GitHub Wiki
g_detailObj
概要
譜面詳細データを管理するためのオブジェクト。譜面毎の矢印数・密度・難易度レベルなどをタイトル画面前に取得し格納する。
const g_detailObj = {
arrowCnt: [],
frzCnt: [],
maxDensity: [],
maxDensity2Push: [],
maxDensity3Push: [],
densityData: [],
density2PushData: [],
density3PushData: [],
densityDiff: [],
density2PushDiff: [],
density3PushDiff: [],
startFrame: [],
playingFrame: [],
playingFrameWithBlank: [],
speedData: [],
boostData: [],
toolDif: [],
miniMapParams: {},
scoreMinimap: {},
scoreMinimapReverse: {},
scoreMinimapHeader: {},
};
生成タイミング
storeBaseData() 呼び出し時(譜面読込時)
プロパティ
配列系プロパティはすべて譜面番号をキーとする配列になっている。scoreId を使って各譜面のデータにアクセスする。
// 0番譜面の全矢印数を取得
sumData(g_detailObj.arrowCnt[0]);
// 1番譜面のプレイ時間(秒)を算出
g_detailObj.playingFrame[1] / 60;
ノーツ数
-
arrowCnt (array2) — 譜面別・レーン別の通常矢印数。
arrowCnt[scoreId][j]がj番レーンの矢印数 -
frzCnt (array2) — 譜面別・レーン別のフリーズアロー数。フリーズアローの終点データが奇数個(未完結)の場合は
-0.5される
// 0番譜面の全矢印数・フリーズアロー数
sumData(g_detailObj.arrowCnt[0]); // → 例: 500
sumData(g_detailObj.frzCnt[0]); // → 例: 80
// ゲージカスタム数式での展開例
// "arrow[]" → sumData(g_detailObj.arrowCnt[{0}])
// "all[]" → arrowCnt + frzCnt の合計
密度グラフ
密度グラフは曲を densityDivision(=16)区間に分割し、各区間のノーツ数をパーセント値で格納する。2つ押し・3つ押し以上については別途集計したうえで差分形式に変換して保持する。
-
maxDensity (array) — 譜面別の最大密度区間インデックスの配列(上位
densityMaxVals件分)。密度グラフの縦軸上限・強調表示に使用 -
maxDensity2Push (array) — 同フレームに2つ以上の同時押しが含まれる区間における最大密度の区間インデックス
-
maxDensity3Push (array) — 同フレームに3つ以上の同時押しが含まれる区間における最大密度の区間インデックス
-
densityData (array2) — 譜面別の全ノーツ密度データ(16区間、パーセント値)
-
density2PushData (array2) — 同フレーム2つ以上押しのノーツのみを対象とした密度データ
-
density3PushData (array2) — 同フレーム3つ以上押しのノーツのみを対象とした密度データ
-
densityDiff (array2) —
densityDataとdensity2PushDataの差分(単押し区間の割合)。密度グラフの単押し部分の描画に使用 -
density2PushDiff (array2) —
density2PushDataとdensity3PushDataの差分(2つ押し区間の割合)。密度グラフの2つ押し部分の描画に使用 -
density3PushDiff (array2) —
density3PushDataのコピー(3つ以上押し区間の割合)。密度グラフの3つ押し以上部分の描画に使用
// 0番譜面の密度データ(16要素、パーセント値)
g_detailObj.densityData[0]; // → [3.2, 5.1, 8.4, ...]
プレイ時間
-
startFrame (array) — 譜面別の開始フレーム数(フェードイン補正前の生の値)
-
playingFrame (array) — 譜面別のプレイフレーム数(
blankFrameを除いた実プレイ区間)。APM(1分あたりの矢印数)の分母として使用 -
playingFrameWithBlank (array) — 譜面別のプレイフレーム数(
blankFrame込み)。g_scoreObj.fullFrame(曲終了フレーム)の算出元
// 0番譜面のAPM計算
const arrows = sumData(g_detailObj.arrowCnt[0]) + sumData(g_detailObj.frzCnt[0]);
const minutes = g_detailObj.playingFrame[0] / 60 / 60; // 60fps換算
const apm = arrows / minutes;
速度変化データ
-
speedData (array2) — 譜面別の全体速度変化データ(
speed_dataを解析してフレーム・速度ペアに展開したリスト)。速度変化グラフの描画に使用 -
boostData (array2) — 譜面別の個別加速データ(
boost_dataを解析済みのリスト)。速度変化グラフの描画に使用
難易度計算値
toolDif[scoreId] は calcLevel() が返すオブジェクトをそのまま格納する。
- toolDif (array of object) — 譜面別のレベル計算ツール算出結果。各要素は以下のプロパティを持つオブジェクト
| プロパティ | 型 | 内容 |
|---|---|---|
tool |
string | 難易度レベル文字列(例: "12.34" / 3つ押し含む場合は "12.34*") |
douji |
number | 同時押し補正値 |
tate |
number | 縦連補正値 |
push3cnt |
number | 3つ押し以上の総フレーム数 |
push3 |
number[] | 3つ押し以上が発生したフレーム番号の配列(重複排除済み) |
// 0番譜面の難易度情報
const dif = g_detailObj.toolDif[0];
console.log(dif.tool); // → "12.34"
console.log(dif.douji); // → 2.15(同時押し補正値)
console.log(dif.tate); // → 0.87(縦連補正値)
console.log(dif.push3cnt); // → 3(3つ押し以上フレーム数)
console.log(dif.push3); // → [240, 480, 720](発生フレーム)
ミニマップ
-
miniMapParams (object) — 譜面番号をキーとするオブジェクト。
generateMinimapData()に渡す各種パラメータ(_scoreObj・_keyNum・_playingFrame・_firstArrowFrame・_keyCtrlPtn・config)をキャッシュする。storeBaseData()内で毎回上書きされる -
scoreMinimap (object) — 譜面番号をキーとするオブジェクト。通常方向のミニマップ Canvas 配列をキャッシュする(Lazy Generation)。未生成時は
null -
scoreMinimapReverse (object) — 譜面番号をキーとするオブジェクト。リバース方向のミニマップ Canvas 配列をキャッシュする。未生成時は
null -
scoreMinimapHeader (object) — キーコントロールパターン(
keyCtrlPtn)をキーとするオブジェクト。キー名ヘッダー Canvas をキャッシュする。キー種が同じ譜面間で共有される
// ミニマップが生成済みかどうかを確認
if (g_detailObj.scoreMinimap[scoreId] === null) {
// 未生成 → generateMinimapData() が呼ばれる
}