danoniplus 51.0.3 → 51.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/js/danoni_main.js +3 -3
- package/js/lib/danoni_constants.js +13 -7
- package/js/lib/dosConverter.js +81 -3
- package/js/lib/settings.js +74 -178
- package/js/lib/title.js +44 -39
- package/package.json +1 -1
package/js/danoni_main.js
CHANGED
|
@@ -4,12 +4,12 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Source by tickle
|
|
6
6
|
* Created : 2018/10/08
|
|
7
|
-
* Revised : 2026/09/
|
|
7
|
+
* Revised : 2026/09/29
|
|
8
8
|
*
|
|
9
9
|
* https://github.com/cwtickle/danoniplus
|
|
10
10
|
*/
|
|
11
|
-
const g_version = `Ver 51.
|
|
12
|
-
const g_revisedDate = `2026/09/
|
|
11
|
+
const g_version = `Ver 51.1.1`;
|
|
12
|
+
const g_revisedDate = `2026/09/29`;
|
|
13
13
|
|
|
14
14
|
// カスタム用バージョン (danoni_custom.js 等で指定可)
|
|
15
15
|
let g_localVersion = ``;
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*
|
|
6
6
|
* Source by tickle
|
|
7
7
|
* Created : 2019/11/19
|
|
8
|
-
* Revised : 2026/09/
|
|
8
|
+
* Revised : 2026/09/29 (v51.1.1)
|
|
9
9
|
*
|
|
10
10
|
* https://github.com/cwtickle/danoniplus
|
|
11
11
|
*/
|
|
@@ -1340,6 +1340,12 @@ const g_gaugeDefObj = {
|
|
|
1340
1340
|
Easy: { Border: 70, Recovery: 4, Damage: 7, Init: 25, Variable: C_FLG_ON, headerOverridable: true, deriveRecoveryFrom: `Normal` },
|
|
1341
1341
|
};
|
|
1342
1342
|
|
|
1343
|
+
/**
|
|
1344
|
+
* 譜面ヘッダー由来のゲージ設定をまとめて定義
|
|
1345
|
+
* - 定義方法はg_gaugeSelObjと類似しており、ゲージ名プロパティがない以外はほぼ同じ構造。
|
|
1346
|
+
*/
|
|
1347
|
+
const g_gaugeHeaderObj = {};
|
|
1348
|
+
|
|
1343
1349
|
/**
|
|
1344
1350
|
* カスタムゲージの選択状態・個別上書き値
|
|
1345
1351
|
* - g_gaugeSelObj[scoreId] = {
|
|
@@ -1368,11 +1374,10 @@ const g_gaugeDefObj = {
|
|
|
1368
1374
|
*/
|
|
1369
1375
|
const g_gaugeSelObj = {};
|
|
1370
1376
|
|
|
1371
|
-
/**
|
|
1372
|
-
*
|
|
1373
|
-
* - 定義方法はg_gaugeSelObjと類似しており、ゲージ名プロパティがない以外はほぼ同じ構造。
|
|
1377
|
+
/**
|
|
1378
|
+
* 最終的に適用するゲージ設定値のサマリー
|
|
1374
1379
|
*/
|
|
1375
|
-
const
|
|
1380
|
+
const g_gaugeResolvedObj = {};
|
|
1376
1381
|
|
|
1377
1382
|
/** どの名前をどの順で選択肢に出すかだけを持つ。詳細値はg_gaugeDefObj、g_gaugeHeaderObj, g_gaugeSelObjを参照 */
|
|
1378
1383
|
const g_gaugeOptionObj = {
|
|
@@ -1381,7 +1386,6 @@ const g_gaugeOptionObj = {
|
|
|
1381
1386
|
customFulls: {},
|
|
1382
1387
|
defaultPlusList: [`survival`, `border`, `customDefault`],
|
|
1383
1388
|
};
|
|
1384
|
-
let g_gaugeType;
|
|
1385
1389
|
|
|
1386
1390
|
const g_autoPlaysBase = [C_FLG_OFF, C_FLG_ALL];
|
|
1387
1391
|
|
|
@@ -1537,7 +1541,8 @@ const g_settings = {
|
|
|
1537
1541
|
settingWindowNum: 0,
|
|
1538
1542
|
|
|
1539
1543
|
preconditions: [`g_rootObj`, `g_headerObj`, `g_keyObj`, `g_scoreObj`, `g_workObj`,
|
|
1540
|
-
`g_detailObj`, `g_stateObj`, `g_attrObj`,
|
|
1544
|
+
`g_detailObj`, `g_stateObj`, `g_attrObj`,
|
|
1545
|
+
`g_gaugeDefObj`, `g_gaugeHeaderObj`, `g_gaugeSelObj`, `g_gaugeResolvedObj`, `g_editorTmp`, `g_editorTmp2`],
|
|
1541
1546
|
preconditionNum: 0,
|
|
1542
1547
|
preconditionNumSub: 0,
|
|
1543
1548
|
};
|
|
@@ -5336,6 +5341,7 @@ const g_root = {
|
|
|
5336
5341
|
get g_gaugeDefObj() { return g_gaugeDefObj },
|
|
5337
5342
|
get g_gaugeHeaderObj() { return g_gaugeHeaderObj },
|
|
5338
5343
|
get g_gaugeSelObj() { return g_gaugeSelObj },
|
|
5344
|
+
get g_gaugeResolvedObj() { return g_gaugeResolvedObj },
|
|
5339
5345
|
};
|
|
5340
5346
|
const getPathVal = _path => _path.split(`.`).reduce((o, k) => o?.[k], g_root);
|
|
5341
5347
|
const setPathVal = (_path, _value) => {
|
package/js/lib/dosConverter.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*
|
|
6
6
|
* Source by tickle
|
|
7
7
|
* Created : 2026/09/13
|
|
8
|
-
* Revised : 2026/09/
|
|
8
|
+
* Revised : 2026/09/27 (v51.1.0)
|
|
9
9
|
*
|
|
10
10
|
* https://github.com/cwtickle/danoniplus
|
|
11
11
|
*/
|
|
@@ -262,6 +262,10 @@ const initialControl = async () => {
|
|
|
262
262
|
getGaugeSetting(g_rootObj, gaugePtn, { scoreId: j }));
|
|
263
263
|
}
|
|
264
264
|
}
|
|
265
|
+
// g_loadObj.mainがfalseで上のブロックが丸ごとスキップされた場合でも、
|
|
266
|
+
// setGaugeが必ずg_gaugeResolvedObjを引けるよう毎回解決し直す
|
|
267
|
+
resolveGaugeValuesAll();
|
|
268
|
+
|
|
265
269
|
safeExecuteCustomHooks(`g_customJsObj.preTitle`, g_customJsObj.preTitle);
|
|
266
270
|
const queryMusicId = getQueryParamVal(`musicId`);
|
|
267
271
|
g_settings.musicIdxNum = queryMusicId !== null ? Number(queryMusicId) :
|
|
@@ -2068,7 +2072,7 @@ const resetCustomGauge = (_dosObj, { scoreId = 0 } = {}) => {
|
|
|
2068
2072
|
|
|
2069
2073
|
const scoreIdHeader = (scoreId === 0 && hasVal(_dosObj[`customGauge1`]))
|
|
2070
2074
|
? 1 : setScoreIdHeader(scoreId, g_stateObj.scoreLockFlg, false);
|
|
2071
|
-
const dosCustomGauge = _dosObj[`customGauge${scoreIdHeader}`];
|
|
2075
|
+
const dosCustomGauge = _dosObj[`customGauge${scoreIdHeader}`] ?? _dosObj.customGauge;
|
|
2072
2076
|
if (!hasVal(dosCustomGauge)) return;
|
|
2073
2077
|
|
|
2074
2078
|
g_gaugeSelObj[scoreId] = structuredClone(g_gaugeSelObj.default ?? { __order: [] });
|
|
@@ -2126,6 +2130,70 @@ const getGaugeSetting = (_dosObj, _name, { scoreId = 0 } = {}) => {
|
|
|
2126
2130
|
g_gaugeSelObj[scoreId][_name] = { ...g_gaugeSelObj[scoreId][_name], Border: border, Recovery: recovery, Damage: damage, Init: init };
|
|
2127
2131
|
};
|
|
2128
2132
|
|
|
2133
|
+
/**
|
|
2134
|
+
* 全ゲージ名の最終値(Border/Recovery/Damage/Init/Variable)を決定する関数
|
|
2135
|
+
*/
|
|
2136
|
+
const resolveGaugeValuesAll = () => {
|
|
2137
|
+
for (let j = 0; j < g_headerObj.difLabels.length; j++) {
|
|
2138
|
+
resolveGaugeValues(j);
|
|
2139
|
+
}
|
|
2140
|
+
}
|
|
2141
|
+
|
|
2142
|
+
/**
|
|
2143
|
+
* (scoreId)単位で、その譜面の全ゲージ名の最終値(Border/Recovery/Damage/Init/Variable)を
|
|
2144
|
+
* 事前に解決し、g_gaugeResolvedObj[scoreId]として保持する。
|
|
2145
|
+
* カーソル位置には依存しない、譜面が決まれば決まる値なので、getGaugeSetting(j)の直後に1回だけ呼ぶ
|
|
2146
|
+
* @param {number} _scoreId
|
|
2147
|
+
*/
|
|
2148
|
+
const resolveGaugeValues = (_scoreId) => {
|
|
2149
|
+
const getGaugeCalc = (_val, _defaultVal) => setVal(convertStrToVal(
|
|
2150
|
+
replaceStr(_val, g_escapeStr.gaugeParamName)?.split(`{0}`).join(_scoreId)
|
|
2151
|
+
), _defaultVal, C_TYP_CALC);
|
|
2152
|
+
const resolveBorder = (_border, _defaultVal) => (_border === `x` ? `x` : getGaugeCalc(_border, _defaultVal));
|
|
2153
|
+
|
|
2154
|
+
const currentGaugeSel = g_gaugeSelObj[_scoreId] || g_gaugeSelObj[0] || g_gaugeSelObj.default;
|
|
2155
|
+
const header = g_gaugeHeaderObj[_scoreId];
|
|
2156
|
+
const isCustom = currentGaugeSel?.__order?.length > 0;
|
|
2157
|
+
const order = isCustom
|
|
2158
|
+
? currentGaugeSel.__order
|
|
2159
|
+
: g_gaugeOptionObj[header.Border === `x` ? `survival` : `border`];
|
|
2160
|
+
|
|
2161
|
+
// __order内で最初に出てくるheaderOverridable「系統」だけにdifDataを適用する(Light/EasyはOriginal/Normalの系統扱い)
|
|
2162
|
+
const getGaugeRoot = _name => g_gaugeDefObj[_name]?.deriveRecoveryFrom ?? _name;
|
|
2163
|
+
const firstOverridableRoot = getGaugeRoot(order.find(name => g_gaugeDefObj[name]?.headerOverridable));
|
|
2164
|
+
|
|
2165
|
+
const resolved = { __order: order.concat(), __custom: isCustom };
|
|
2166
|
+
order.forEach(name => {
|
|
2167
|
+
const def = g_gaugeDefObj[name] ?? {};
|
|
2168
|
+
|
|
2169
|
+
// Step1:基本設定(g_gaugeDefObj)をまず適用
|
|
2170
|
+
const value = { Border: def.Border, Recovery: def.Recovery, Damage: def.Damage, Init: def.Init };
|
|
2171
|
+
|
|
2172
|
+
// Step2:譜面ヘッダー(headerOverridable、系統一致のみ)
|
|
2173
|
+
if (def.headerOverridable && (!isCustom || getGaugeRoot(name) === firstOverridableRoot)) {
|
|
2174
|
+
value.Border = resolveBorder(header.Border, value.Border);
|
|
2175
|
+
value.Recovery = getGaugeCalc(header.Recovery, value.Recovery) * (hasVal(def.deriveRecoveryFrom) ? 2 : 1);
|
|
2176
|
+
value.Damage = getGaugeCalc(header.Damage, value.Damage);
|
|
2177
|
+
value.Init = getGaugeCalc(header.Init, value.Init);
|
|
2178
|
+
}
|
|
2179
|
+
|
|
2180
|
+
// Step3:ゲージ個別設定(最優先)
|
|
2181
|
+
const override = currentGaugeSel?.[name];
|
|
2182
|
+
if (override?.Recovery !== undefined) {
|
|
2183
|
+
if (hasVal(override.Border)) {
|
|
2184
|
+
value.Border = resolveBorder(override.Border, value.Border);
|
|
2185
|
+
}
|
|
2186
|
+
value.Recovery = getGaugeCalc(override.Recovery, value.Recovery);
|
|
2187
|
+
value.Damage = getGaugeCalc(override.Damage, value.Damage);
|
|
2188
|
+
value.Init = getGaugeCalc(override.Init, value.Init);
|
|
2189
|
+
}
|
|
2190
|
+
|
|
2191
|
+
value.Variable = override?.Variable ?? def.Variable ?? C_FLG_OFF;
|
|
2192
|
+
resolved[name] = value;
|
|
2193
|
+
});
|
|
2194
|
+
g_gaugeResolvedObj[_scoreId] = resolved;
|
|
2195
|
+
};
|
|
2196
|
+
|
|
2129
2197
|
/**
|
|
2130
2198
|
* 【参照用】g_gaugeOptionObjの旧プロパティを参照できるようにする関数
|
|
2131
2199
|
* (initXXX/rcvXXX/dmgXXX/clearXXX/typeXXX/varXXX)
|
|
@@ -2162,11 +2230,21 @@ const restoreLegacyGaugeHeaderReference = () => {
|
|
|
2162
2230
|
})
|
|
2163
2231
|
};
|
|
2164
2232
|
|
|
2233
|
+
/**
|
|
2234
|
+
* 【反映用】カスタムスクリプトが旧形式で作った個別ゲージ設定の適用
|
|
2235
|
+
* - g_gaugeOptionObj[`gauge${name}s`](旧形式)で用意した各ゲージ名の個別設定を
|
|
2236
|
+
* まとめてg_gaugeSelObjへ反映し、影響する全譜面分のg_gaugeResolvedObjを再計算する。
|
|
2237
|
+
* - カスタムJS側はこの1関数を呼ぶだけでよく、applyLegacyGaugeOverride単体での呼び出しは不要
|
|
2238
|
+
*/
|
|
2239
|
+
const applyLegacyGaugeOverrides = () => {
|
|
2240
|
+
Object.keys(g_gaugeOptionObj.customFulls).forEach(name => applyLegacyGaugeOverride(name));
|
|
2241
|
+
resolveGaugeValuesAll();
|
|
2242
|
+
};
|
|
2243
|
+
|
|
2165
2244
|
/**
|
|
2166
2245
|
* 【反映用】カスタムスクリプトが旧形式で作った個別ゲージ設定
|
|
2167
2246
|
* - g_gaugeOptionObj[`gauge${_name}s`] = { lifeBorders, lifeRecoverys, lifeDamages, lifeInits }
|
|
2168
2247
|
* (それぞれscoreId順の配列)を、新プロパティ g_gaugeSelObj[scoreId][_name] へ変換して反映する
|
|
2169
|
-
* - 本体からの呼び出しは無いため、カスタムスクリプト側で呼び出しする想定
|
|
2170
2248
|
* @param {string} _name ゲージ名
|
|
2171
2249
|
*/
|
|
2172
2250
|
const applyLegacyGaugeOverride = (_name) => {
|
package/js/lib/settings.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*
|
|
6
6
|
* Source by tickle
|
|
7
7
|
* Created : 2026/09/13
|
|
8
|
-
* Revised : 2026/09/
|
|
8
|
+
* Revised : 2026/09/29 (v51.1.1)
|
|
9
9
|
*
|
|
10
10
|
* https://github.com/cwtickle/danoniplus
|
|
11
11
|
*/
|
|
@@ -1421,15 +1421,16 @@ const setDifficulty = (_chartChangeFlg) => {
|
|
|
1421
1421
|
: g_autoPlaysBase.concat()
|
|
1422
1422
|
);
|
|
1423
1423
|
|
|
1424
|
-
//
|
|
1425
|
-
|
|
1424
|
+
// ゲージ設定配列の入れ替え
|
|
1425
|
+
g_settings.gauges = structuredClone(g_gaugeResolvedObj[scoreId].__order);
|
|
1426
1426
|
|
|
1427
|
-
//
|
|
1427
|
+
// 速度、スクロール、ゲージ、アシスト設定のカーソル位置調整
|
|
1428
1428
|
if (_chartChangeFlg) {
|
|
1429
1429
|
g_stateObj.speed = g_headerObj.initSpeeds[scoreId];
|
|
1430
1430
|
g_settings.speedNum = getCurrentNo(g_settings.speeds, g_stateObj.speed);
|
|
1431
1431
|
}
|
|
1432
1432
|
g_settings.scrollNum = getCurrentNo(g_settings.scrolls, g_stateObj.scroll);
|
|
1433
|
+
g_settings.gaugeNum = (g_initialFlg ? getCurrentNo(g_settings.gauges, g_stateObj.gauge) : 0);
|
|
1433
1434
|
g_settings.autoPlayNum = getCurrentNo(g_settings.autoPlays, g_stateObj.autoPlay);
|
|
1434
1435
|
|
|
1435
1436
|
|
|
@@ -1493,6 +1494,11 @@ const setDifficulty = (_chartChangeFlg) => {
|
|
|
1493
1494
|
setSetting(0, `reverse`);
|
|
1494
1495
|
}
|
|
1495
1496
|
|
|
1497
|
+
// ゲージ設定
|
|
1498
|
+
g_stateObj.gauge = g_settings.gauges[g_settings.gaugeNum];
|
|
1499
|
+
setSetting(0, `gauge`);
|
|
1500
|
+
setGauge();
|
|
1501
|
+
|
|
1496
1502
|
// オート・アシスト設定 (AutoPlay)
|
|
1497
1503
|
g_stateObj.autoPlay = g_settings.autoPlays[g_settings.autoPlayNum];
|
|
1498
1504
|
lnkAutoPlay.textContent = getStgDetailName(g_stateObj.autoPlay);
|
|
@@ -1845,35 +1851,22 @@ const createOptionWindow = _sprite => {
|
|
|
1845
1851
|
// ---------------------------------------------------
|
|
1846
1852
|
// ゲージ設定 (Gauge)
|
|
1847
1853
|
// 縦位置: 7.5
|
|
1848
|
-
spriteList.gauge
|
|
1849
|
-
|
|
1850
|
-
|
|
1851
|
-
spriteList.gauge
|
|
1852
|
-
|
|
1853
|
-
|
|
1854
|
-
multiAppend(spriteList.gauge,
|
|
1855
|
-
makeSettingLblCssButton(`lnkGauge`, ``, 0, () => setGauge(1), { cxtFunc: () => setGauge(-1) }),
|
|
1856
|
-
makeMiniCssButton(`lnkGauge`, `R`, 0, () => setGauge(1)),
|
|
1857
|
-
makeMiniCssButton(`lnkGauge`, `L`, 0, () => setGauge(-1)),
|
|
1858
|
-
);
|
|
1859
|
-
createScText(spriteList.gauge, `Gauge`);
|
|
1860
|
-
} else {
|
|
1861
|
-
lblGauge.classList.add(g_cssObj.settings_Disabled);
|
|
1862
|
-
spriteList.gauge.appendChild(makeDisabledLabel(`lnkGauge`, 0, getStgDetailName(g_stateObj.gauge)));
|
|
1863
|
-
}
|
|
1854
|
+
createGeneralSetting(spriteList.gauge, `gauge`, {
|
|
1855
|
+
addRFunc: () => setGauge(),
|
|
1856
|
+
});
|
|
1857
|
+
multiAppend(spriteList.gauge,
|
|
1858
|
+
// ゲージ設定詳細 縦位置: ゲージ設定+1
|
|
1859
|
+
createDivCss2Label(`lblGauge2`, ``, g_lblPosObj.lblGauge2),
|
|
1864
1860
|
|
|
1865
|
-
|
|
1866
|
-
spriteList.gauge.appendChild(
|
|
1861
|
+
// 空押し判定設定 (Excessive)
|
|
1867
1862
|
createDivCss2Label(`lblExcessive`, `${g_lblNameObj.Excessive}:${C_FLG_ON}`,
|
|
1868
1863
|
g_lblPosObj.lblExcessive, g_cssObj[`button_Disabled${C_FLG_ON}`]
|
|
1869
|
-
)
|
|
1870
|
-
);
|
|
1871
|
-
spriteList.gauge.appendChild(
|
|
1864
|
+
),
|
|
1872
1865
|
createCss2Button(`lnkExcessive`, g_lblNameObj.Excessive, evt => setExcessive(evt.target), {
|
|
1873
1866
|
...g_lblPosObj.btnExcessive,
|
|
1874
1867
|
title: g_msgObj.excessive, cxtFunc: evt => setExcessive(evt.target),
|
|
1875
|
-
}, g_cssObj.button_Default, g_cssObj[`button_Rev${g_stateObj.excessive}`])
|
|
1876
|
-
)
|
|
1868
|
+
}, g_cssObj.button_Default, g_cssObj[`button_Rev${g_stateObj.excessive}`]),
|
|
1869
|
+
)
|
|
1877
1870
|
createScText(lnkExcessive, `Excessive`, { x: -13, targetLabel: `lnkExcessive` });
|
|
1878
1871
|
|
|
1879
1872
|
// ---------------------------------------------------
|
|
@@ -2164,121 +2157,26 @@ const setReverseView = _btn => {
|
|
|
2164
2157
|
}
|
|
2165
2158
|
};
|
|
2166
2159
|
|
|
2167
|
-
// ============================================================
|
|
2168
|
-
// ゲージ設定の適用パイプライン(wiki: ゲージ設定適用順仕様)
|
|
2169
|
-
// 優先度は「低→高」= 基本設定(g_gaugeDefObj) → 譜面ヘッダー(初期ゲージのみ) → ゲージ個別設定。
|
|
2170
|
-
// 下記のapply*/resolve*はsetGaugeから“この順番のまま”呼ばれ、後段が前段を上書きすることで
|
|
2171
|
-
// 優先度を表現する。順序の変更は仕様変更を意味する。
|
|
2172
|
-
// ============================================================
|
|
2173
|
-
|
|
2174
2160
|
/**
|
|
2175
|
-
*
|
|
2176
|
-
* @param {number} _scrollNum
|
|
2161
|
+
* ゲージ設定切替後の設定処理
|
|
2177
2162
|
*/
|
|
2178
|
-
const setGauge = (
|
|
2179
|
-
|
|
2180
|
-
|
|
2181
|
-
|
|
2182
|
-
|
|
2183
|
-
|
|
2184
|
-
|
|
2185
|
-
|
|
2186
|
-
|
|
2187
|
-
|
|
2188
|
-
|
|
2189
|
-
|
|
2190
|
-
|
|
2191
|
-
|
|
2192
|
-
|
|
2193
|
-
|
|
2194
|
-
|
|
2195
|
-
let currentGaugeSel = null;
|
|
2196
|
-
|
|
2197
|
-
const resolveCustomGaugeSel = () => {
|
|
2198
|
-
currentGaugeSel = g_gaugeSelObj[g_stateObj.scoreId] || g_gaugeSelObj[0] || g_gaugeSelObj.default;
|
|
2199
|
-
};
|
|
2200
|
-
|
|
2201
|
-
/**
|
|
2202
|
-
* 【Step1】ゲージ種別(g_gaugeType)を確定し、ゲージ配列とカーソル位置を入れ替える
|
|
2203
|
-
* @param {number} _scrollNum
|
|
2204
|
-
* @param {boolean} _gaugeInitFlg true時は前回選択していたゲージ名を引き継がず、配列の先頭を強制的に使う
|
|
2205
|
-
*/
|
|
2206
|
-
const resolveGaugeType = (_scrollNum, _gaugeInitFlg) => {
|
|
2207
|
-
applyLifeModeSwitch(g_gaugeHeaderObj[g_stateObj.scoreId].Border);
|
|
2208
|
-
g_gaugeType = (currentGaugeSel?.__order?.length > 0 ? C_LFE_CUSTOM : g_stateObj.lifeMode);
|
|
2209
|
-
|
|
2210
|
-
g_settings.gauges = structuredClone(g_gaugeType === C_LFE_CUSTOM
|
|
2211
|
-
? currentGaugeSel.__order
|
|
2212
|
-
: g_gaugeOptionObj[g_gaugeType.toLowerCase()]);
|
|
2213
|
-
g_settings.gaugeNum = (_gaugeInitFlg ? 0 : getCurrentNo(g_settings.gauges, g_stateObj.gauge));
|
|
2214
|
-
g_stateObj.gauge = g_settings.gauges[g_settings.gaugeNum];
|
|
2215
|
-
|
|
2216
|
-
setSetting(_scrollNum, `gauge`);
|
|
2217
|
-
g_stateObj.lifeVariable = currentGaugeSel?.[g_stateObj.gauge]?.Variable
|
|
2218
|
-
?? g_gaugeDefObj[g_stateObj.gauge]?.Variable
|
|
2219
|
-
?? C_FLG_OFF;
|
|
2220
|
-
};
|
|
2221
|
-
|
|
2222
|
-
/** 【Step2:基本設定】g_gaugeDefObjのカーソル位置に対応する初期設定を適用 */
|
|
2223
|
-
const applyBaseGaugeSettings = () => {
|
|
2224
|
-
const def = g_gaugeDefObj[g_stateObj.gauge];
|
|
2225
|
-
if (!hasVal(def)) return;
|
|
2226
|
-
g_stateObj.lifeMode = (def.Border === `x` ? C_LFE_SURVIVAL : C_LFE_BORDER);
|
|
2227
|
-
g_stateObj.lifeBorder = (def.Border === `x` ? 0 : def.Border);
|
|
2228
|
-
g_stateObj.lifeInit = def.Init;
|
|
2229
|
-
g_stateObj.lifeRcv = def.Recovery;
|
|
2230
|
-
g_stateObj.lifeDmg = def.Damage;
|
|
2231
|
-
};
|
|
2232
|
-
|
|
2233
|
-
/** 【Step3:譜面ヘッダー】headerOverridable指定ゲージのみ、difData由来の値で上書き */
|
|
2234
|
-
const applyHeaderGaugeSettings = () => {
|
|
2235
|
-
const def = g_gaugeDefObj[g_stateObj.gauge];
|
|
2236
|
-
if (!def?.headerOverridable) return;
|
|
2237
|
-
if (g_gaugeType === C_LFE_CUSTOM) {
|
|
2238
|
-
// カスタム選択でOriginal/Normal等headerOverridable対象が複数混在する場合、
|
|
2239
|
-
// difDataは1つしか値を持たないため、選択順で最初に出てきた「系統」だけに適用する。
|
|
2240
|
-
// Light/EasyはOriginal/Normalの系統として扱う(deriveRecoveryFromで判定)
|
|
2241
|
-
const getGaugeRoot = _name => g_gaugeDefObj[_name]?.deriveRecoveryFrom ?? _name;
|
|
2242
|
-
const firstOverridableRoot = getGaugeRoot(
|
|
2243
|
-
g_settings.gauges.find(name => g_gaugeDefObj[name]?.headerOverridable)
|
|
2244
|
-
);
|
|
2245
|
-
if (getGaugeRoot(g_stateObj.gauge) !== firstOverridableRoot) return;
|
|
2246
|
-
}
|
|
2247
|
-
const header = g_gaugeHeaderObj[g_stateObj.scoreId];
|
|
2248
|
-
applyLifeModeSwitch(header.Border);
|
|
2249
|
-
g_stateObj.lifeInit = getGaugeCalc(header.Init, g_stateObj.lifeInit);
|
|
2250
|
-
g_stateObj.lifeRcv = getGaugeCalc(header.Recovery, g_stateObj.lifeRcv)
|
|
2251
|
-
* (hasVal(def.deriveRecoveryFrom) ? 2 : 1);
|
|
2252
|
-
g_stateObj.lifeDmg = getGaugeCalc(header.Damage, g_stateObj.lifeDmg);
|
|
2253
|
-
};
|
|
2254
|
-
|
|
2255
|
-
/**
|
|
2256
|
-
* 【Step4:ゲージ個別設定(最優先)】gaugeXXXで明示的に設定された値があれば上書き。
|
|
2257
|
-
* g_gaugeSelObj[scoreId][name]は既に単一譜面分の値なので、g_headerObj用の
|
|
2258
|
-
* applyLifeModeSwitch/applyLifeCategory(配列アクセス版)は使わず直接適用する
|
|
2259
|
-
*/
|
|
2260
|
-
const applyIndividualGaugeSettings = () => {
|
|
2261
|
-
const override = currentGaugeSel?.[g_stateObj.gauge];
|
|
2262
|
-
if (override?.Recovery === undefined) return; // gaugeXXXヘッダー由来の上書きが無い(overrideが無い/Variableのみの場合を含む)
|
|
2263
|
-
if (hasVal(override.Border)) {
|
|
2264
|
-
applyLifeModeSwitch(override.Border);
|
|
2265
|
-
}
|
|
2266
|
-
g_stateObj.lifeInit = getGaugeCalc(override.Init, g_stateObj.lifeInit);
|
|
2267
|
-
g_stateObj.lifeRcv = getGaugeCalc(override.Recovery, g_stateObj.lifeRcv);
|
|
2268
|
-
g_stateObj.lifeDmg = getGaugeCalc(override.Damage, g_stateObj.lifeDmg);
|
|
2269
|
-
};
|
|
2270
|
-
|
|
2271
|
-
return (_scrollNum, _gaugeInitFlg = false) => {
|
|
2272
|
-
resolveCustomGaugeSel();
|
|
2273
|
-
resolveGaugeType(_scrollNum, _gaugeInitFlg);
|
|
2274
|
-
applyBaseGaugeSettings();
|
|
2275
|
-
applyHeaderGaugeSettings();
|
|
2276
|
-
applyIndividualGaugeSettings();
|
|
2277
|
-
|
|
2278
|
-
lblGauge2.innerHTML = gaugeFormat(g_stateObj.lifeMode,
|
|
2279
|
-
g_stateObj.lifeBorder, g_stateObj.lifeRcv, g_stateObj.lifeDmg, g_stateObj.lifeInit, g_stateObj.lifeVariable);
|
|
2280
|
-
};
|
|
2281
|
-
})();
|
|
2163
|
+
const setGauge = () => {
|
|
2164
|
+
const value = g_gaugeResolvedObj[g_stateObj.scoreId][g_stateObj.gauge];
|
|
2165
|
+
g_stateObj.lifeMode = (value.Border === `x` ? C_LFE_SURVIVAL : C_LFE_BORDER);
|
|
2166
|
+
g_stateObj.lifeBorder = (value.Border === `x` ? 0 : value.Border);
|
|
2167
|
+
g_stateObj.lifeInit = value.Init;
|
|
2168
|
+
g_stateObj.lifeRcv = value.Recovery;
|
|
2169
|
+
g_stateObj.lifeDmg = value.Damage;
|
|
2170
|
+
g_stateObj.lifeVariable = value.Variable;
|
|
2171
|
+
gaugeFormat(
|
|
2172
|
+
g_stateObj.lifeMode,
|
|
2173
|
+
g_stateObj.lifeBorder,
|
|
2174
|
+
g_stateObj.lifeRcv,
|
|
2175
|
+
g_stateObj.lifeDmg,
|
|
2176
|
+
g_stateObj.lifeInit,
|
|
2177
|
+
g_stateObj.lifeVariable
|
|
2178
|
+
);
|
|
2179
|
+
};
|
|
2282
2180
|
|
|
2283
2181
|
/**
|
|
2284
2182
|
* ゲージ設定の詳細表示を整形
|
|
@@ -2288,7 +2186,7 @@ const setGauge = (() => {
|
|
|
2288
2186
|
* @param {number} _dmg
|
|
2289
2187
|
* @param {number} _init
|
|
2290
2188
|
* @param {string} _lifeValFlg
|
|
2291
|
-
* @
|
|
2189
|
+
* @param {string} ゲージ詳細表示用のhtml(互換のため。利用なしでも作成される)
|
|
2292
2190
|
*/
|
|
2293
2191
|
const gaugeFormat = (_mode, _border, _rcv, _dmg, _init, _lifeValFlg) => {
|
|
2294
2192
|
const initVal = g_headerObj.maxLifeVal * _init / 100;
|
|
@@ -2322,44 +2220,42 @@ const gaugeFormat = (_mode, _border, _rcv, _dmg, _init, _lifeValFlg) => {
|
|
|
2322
2220
|
const [rateText, allowableCntsText] = getAccuracy(borderVal, realRcv, realDmg, initVal, allCnt);
|
|
2323
2221
|
g_workObj.requiredAccuracy = rateText;
|
|
2324
2222
|
|
|
2223
|
+
// createDiv が付与するインラインの配置・サイズ指定を解除し、CSSクラス側のレイアウトを使う
|
|
2224
|
+
const reset = { position: ``, left: ``, top: ``, width: ``, height: `` };
|
|
2225
|
+
const labelReset = { ...reset, fontSize: ``, fontFamily: ``, textAlign: `` };
|
|
2226
|
+
|
|
2325
2227
|
// このテーブルのみpointer-eventsを有効にする(オンマウス許可)
|
|
2326
|
-
|
|
2327
|
-
|
|
2328
|
-
|
|
2329
|
-
|
|
2330
|
-
|
|
2331
|
-
|
|
2332
|
-
|
|
2333
|
-
|
|
2334
|
-
|
|
2335
|
-
|
|
2336
|
-
|
|
2337
|
-
|
|
2338
|
-
|
|
2339
|
-
|
|
2340
|
-
|
|
2341
|
-
|
|
2342
|
-
|
|
2343
|
-
|
|
2344
|
-
|
|
2345
|
-
|
|
2346
|
-
|
|
2347
|
-
|
|
2348
|
-
|
|
2349
|
-
|
|
2350
|
-
|
|
2351
|
-
|
|
2352
|
-
|
|
2353
|
-
|
|
2354
|
-
|
|
2355
|
-
|
|
2356
|
-
|
|
2357
|
-
<div id="dataGaugeRate" class="settings_gaugeDivTableCol settings_gaugeVal settings_gaugeEtc" style="line-height: 12px;">
|
|
2358
|
-
${rateText}<br><span style="font-size: 10px;">${allowableCntsText}</span>
|
|
2359
|
-
</div>
|
|
2360
|
-
</div>
|
|
2361
|
-
</div>
|
|
2362
|
-
`;
|
|
2228
|
+
deleteChildspriteAll(`lblGauge2`);
|
|
2229
|
+
const cover = createEmptySprite(lblGauge2, `gaugeDivCover`,
|
|
2230
|
+
{ ...reset, pointerEvents: C_DIS_AUTO }, `settings_gaugeDivCover`);
|
|
2231
|
+
|
|
2232
|
+
const cell = (_id, _text, _classes, _style = {}) =>
|
|
2233
|
+
createDivCss2Label(_id, _text, { ...labelReset, ..._style }, `settings_gaugeDivTableCol`, ..._classes);
|
|
2234
|
+
|
|
2235
|
+
// ラベル行
|
|
2236
|
+
const lblTable = createEmptySprite(cover, `lblGaugeDivTable`, reset, `settings_gaugeDivTable`);
|
|
2237
|
+
const lblBaseClass = [`settings_gaugeEtc`];
|
|
2238
|
+
multiAppend(lblTable,
|
|
2239
|
+
cell(`lblGaugeStart`, g_lblNameObj.g_start, [`settings_gaugeStart`]),
|
|
2240
|
+
cell(`lblGaugeBorder`, g_lblNameObj.g_border, lblBaseClass),
|
|
2241
|
+
cell(`lblGaugeRecovery`, g_lblNameObj.g_recovery, lblBaseClass),
|
|
2242
|
+
cell(`lblGaugeDamage`, g_lblNameObj.g_damage, lblBaseClass),
|
|
2243
|
+
cell(`lblGaugeRate`, g_lblNameObj.g_rate, lblBaseClass),
|
|
2244
|
+
)
|
|
2245
|
+
|
|
2246
|
+
// 値行
|
|
2247
|
+
const dataTable = createEmptySprite(cover, `dataGaugeDivTable`, reset, `settings_gaugeDivTable`);
|
|
2248
|
+
const dataBaseClass = [`settings_gaugeVal`, `settings_gaugeEtc`];
|
|
2249
|
+
multiAppend(dataTable,
|
|
2250
|
+
cell(`dataGaugeStart`, `${init}/${g_headerObj.maxLifeVal}`,
|
|
2251
|
+
[`settings_gaugeVal`, `settings_gaugeStart`]),
|
|
2252
|
+
cell(`dataGaugeBorder`, `${borderText}`, dataBaseClass),
|
|
2253
|
+
cell(`dataGaugeRecovery`, `${rcvText}`, dataBaseClass),
|
|
2254
|
+
cell(`dataGaugeDamage`, `${dmgText}`, dataBaseClass),
|
|
2255
|
+
cell(`dataGaugeRate`, `${rateText}<br><span style="font-size: 10px;">${allowableCntsText}</span>`,
|
|
2256
|
+
dataBaseClass, { lineHeight: `12px` }),
|
|
2257
|
+
)
|
|
2258
|
+
return lblGauge2.innerHTML;
|
|
2363
2259
|
};
|
|
2364
2260
|
|
|
2365
2261
|
/**
|
package/js/lib/title.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*
|
|
6
6
|
* Source by tickle
|
|
7
7
|
* Created : 2026/09/13
|
|
8
|
-
* Revised : 2026/09/
|
|
8
|
+
* Revised : 2026/09/29 (v51.1.1)
|
|
9
9
|
*
|
|
10
10
|
* https://github.com/cwtickle/danoniplus
|
|
11
11
|
*/
|
|
@@ -471,46 +471,51 @@ const drawTitle = (_titleName = g_headerObj.musicTitleForView, _scoreId = ``) =>
|
|
|
471
471
|
// 変数 titlelineheight の定義 (使用例: |titlelineheight=50|)
|
|
472
472
|
const titlelineheight = (g_headerObj.titlelineheight !== `` ? g_headerObj.titlelineheight - (titlefontsize2 + 10) : 0);
|
|
473
473
|
|
|
474
|
-
const
|
|
474
|
+
const txtAnimStyles = [{}, {}];
|
|
475
475
|
if (!g_headerObj.customTitleAnimationUse) {
|
|
476
|
-
for (let j = 0; j <
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
476
|
+
for (let j = 0; j < txtAnimStyles.length; j++) {
|
|
477
|
+
txtAnimStyles[j] = {
|
|
478
|
+
animationName: g_headerObj.titleAnimationName[j],
|
|
479
|
+
animationDuration: `${g_headerObj.titleAnimationDuration[j]}s`,
|
|
480
|
+
animationDelay: `${g_headerObj.titleAnimationDelay[j]}s`,
|
|
481
|
+
animationTimingFunction: g_headerObj.titleAnimationTimingFunction[j],
|
|
482
|
+
};
|
|
481
483
|
}
|
|
482
484
|
}
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
background
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
485
|
+
const titleDiv = createDivCss2Label(`lblmusicTitle`, ``, {
|
|
486
|
+
x: Number(g_headerObj.titlepos[0][0]), y: Number(g_headerObj.titlepos[0][1]),
|
|
487
|
+
w: g_sWidth, h: g_sHeight - 40, siz: titlefontsize1,
|
|
488
|
+
display: `flex`, flexDirection: `column`, justifyContent: `center`, alignItems: `center`,
|
|
489
|
+
});
|
|
490
|
+
|
|
491
|
+
// createDivCss2Label が付与するインラインの配置・文字設定を解除する
|
|
492
|
+
const reset = { position: ``, left: ``, top: ``, width: ``, height: ``, fontSize: ``, textAlign: `` };
|
|
493
|
+
const gradStyle = {
|
|
494
|
+
backgroundClip: `text`, webkitBackgroundClip: `text`, color: `rgba(255,255,255,0.0)`,
|
|
495
|
+
};
|
|
496
|
+
// 空文字・スペース区切りの複数クラスに対応
|
|
497
|
+
const toClasses = _cls => (_cls ?? ``).split(` `).filter(Boolean);
|
|
498
|
+
multiAppend(titleDiv,
|
|
499
|
+
createDivCss2Label(`lblmusicTitle1`, `${_titleName[0]}`, {
|
|
500
|
+
...reset,
|
|
501
|
+
fontFamily: g_headerObj.titlefonts[0],
|
|
502
|
+
background: titlegrds[0],
|
|
503
|
+
...gradStyle,
|
|
504
|
+
...txtAnimStyles[0],
|
|
505
|
+
}, ...toClasses(g_headerObj.titleAnimationClass[0])),
|
|
506
|
+
createDivCss2Label(`lblmusicTitle2`, `${_titleName[1] ?? ``}`, {
|
|
507
|
+
...reset,
|
|
508
|
+
position: `relative`,
|
|
509
|
+
fontSize: wUnit(titlefontsize2),
|
|
510
|
+
left: wUnit(g_headerObj.titlepos[1][0]),
|
|
511
|
+
top: wUnit(g_headerObj.titlepos[1][1] + titlelineheight),
|
|
512
|
+
fontFamily: g_headerObj.titlefonts[1],
|
|
513
|
+
background: titlegrds[1],
|
|
514
|
+
...gradStyle,
|
|
515
|
+
...txtAnimStyles[1],
|
|
516
|
+
}, ...toClasses(g_headerObj.titleAnimationClass[1])),
|
|
517
|
+
)
|
|
518
|
+
return titleDiv;
|
|
514
519
|
};
|
|
515
520
|
|
|
516
521
|
/**
|
|
@@ -830,7 +835,7 @@ const changeMSelect = (_num, _initFlg = false) => {
|
|
|
830
835
|
if (j === 0) {
|
|
831
836
|
} else {
|
|
832
837
|
document.getElementById(`btnMusicSelect${j}`).style.fontSize =
|
|
833
|
-
getFontSize2(g_headerObj.musicTitles[idx].slice(0, limitedMLength), g_btnWidth(1 / 2));
|
|
838
|
+
wUnit(getFontSize2(g_headerObj.musicTitles[idx].slice(0, limitedMLength), g_btnWidth(1 / 2)));
|
|
834
839
|
document.getElementById(`btnMusicSelect${j}`).innerHTML =
|
|
835
840
|
`${g_headerObj.musicTitles[idx].slice(0, limitedMLength)}${g_headerObj.musicTitles[idx].length > limitedMLength ? '...' : ''}<br>` +
|
|
836
841
|
`<span style="font-size:0.7em;line-height:9px"> / ${g_headerObj.artistNames[idx]}</span>`;
|