danoniplus 42.3.1 → 42.5.0
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 +107 -66
- package/js/lib/danoni_constants.js +2 -2
- 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 : 2025/
|
|
7
|
+
* Revised : 2025/08/22
|
|
8
8
|
*
|
|
9
9
|
* https://github.com/cwtickle/danoniplus
|
|
10
10
|
*/
|
|
11
|
-
const g_version = `Ver 42.
|
|
12
|
-
const g_revisedDate = `2025/
|
|
11
|
+
const g_version = `Ver 42.5.0`;
|
|
12
|
+
const g_revisedDate = `2025/08/22`;
|
|
13
13
|
|
|
14
14
|
// カスタム用バージョン (danoni_custom.js 等で指定可)
|
|
15
15
|
let g_localVersion = ``;
|
|
@@ -717,6 +717,21 @@ const padArray = (_array, _baseArray) => {
|
|
|
717
717
|
return _baseArray;
|
|
718
718
|
};
|
|
719
719
|
|
|
720
|
+
/**
|
|
721
|
+
* ベース配列(_baseArray)の空要素のみ、別配列(_array)の対応要素で補完する(既存値は上書きしない)
|
|
722
|
+
* @param {string[]|number[]} _array 補完元(ソース)
|
|
723
|
+
* @param {string[]|number[]} _baseArray ベース(既存値を優先)
|
|
724
|
+
* @returns {string[]|number[]}
|
|
725
|
+
*/
|
|
726
|
+
const fillMissingArrayElem = (_array = [], _baseArray = []) => {
|
|
727
|
+
const maxLen = Math.max(_baseArray.length, _array.length);
|
|
728
|
+
const res = _baseArray.slice();
|
|
729
|
+
for (let j = 0; j < maxLen; j++) {
|
|
730
|
+
if (!hasVal(res[j]) && hasVal(_array[j])) res[j] = _array[j];
|
|
731
|
+
}
|
|
732
|
+
return res;
|
|
733
|
+
}
|
|
734
|
+
|
|
720
735
|
/**
|
|
721
736
|
* 配列から上位N番目までに一致する位置を取得
|
|
722
737
|
*
|
|
@@ -2656,6 +2671,9 @@ const initialControl = async () => {
|
|
|
2656
2671
|
g_stateObj.dosDivideFlg = setBoolVal(document.getElementById(`externalDosDivide`)?.value ?? getQueryParamVal(`dosDivide`));
|
|
2657
2672
|
g_stateObj.scoreLockFlg = setBoolVal(document.getElementById(`externalDosLock`)?.value ?? getQueryParamVal(`dosLock`));
|
|
2658
2673
|
|
|
2674
|
+
// 非分割時は resetGaugeSetting が全難易度を一括構築するため、初回のみで十分
|
|
2675
|
+
const loopCount = g_stateObj.dosDivideFlg ? g_headerObj.keyLabels.length : 1;
|
|
2676
|
+
|
|
2659
2677
|
for (let j = 0; j < g_headerObj.keyLabels.length; j++) {
|
|
2660
2678
|
|
|
2661
2679
|
// 譜面ファイルが分割されている場合、譜面詳細情報取得のために譜面をロード
|
|
@@ -2664,10 +2682,10 @@ const initialControl = async () => {
|
|
|
2664
2682
|
resetColorSetting(j);
|
|
2665
2683
|
}
|
|
2666
2684
|
getScoreDetailData(j);
|
|
2667
|
-
|
|
2668
|
-
|
|
2669
|
-
|
|
2670
|
-
|
|
2685
|
+
if (j < loopCount) {
|
|
2686
|
+
// 分割時は各譜面ごとに上書き・補完、非分割時は初回のみ実行
|
|
2687
|
+
resetGaugeSetting(j);
|
|
2688
|
+
}
|
|
2671
2689
|
}
|
|
2672
2690
|
}
|
|
2673
2691
|
g_customJsObj.preTitle.forEach(func => func());
|
|
@@ -2727,12 +2745,12 @@ const initialControl = async () => {
|
|
|
2727
2745
|
|
|
2728
2746
|
keyGroupList.forEach((keyGroupNo, j) => {
|
|
2729
2747
|
const keyN = keyGroupNo === `0` ? key : `${key}_${j + 1}`;
|
|
2730
|
-
const filterCond = (
|
|
2731
|
-
const keyCtrlList = g_keyObj[keyCtrlPtn].filter((val,
|
|
2732
|
-
const charaList = g_keyObj[`chara${keyBase}`].filter((val,
|
|
2733
|
-
const colorList = g_keyObj[`color${keyBase}_0`].filter((val,
|
|
2734
|
-
const stepRtnList = g_keyObj[`stepRtn${keyBase}_0`].filter((val,
|
|
2735
|
-
const keyNum = g_keyObj[keyCtrlPtn].filter((val,
|
|
2748
|
+
const filterCond = (r) => keyGroup[r].findIndex(val => val === keyGroupNo) >= 0;
|
|
2749
|
+
const keyCtrlList = g_keyObj[keyCtrlPtn].filter((val, r) => filterCond(r));
|
|
2750
|
+
const charaList = g_keyObj[`chara${keyBase}`].filter((val, r) => filterCond(r));
|
|
2751
|
+
const colorList = g_keyObj[`color${keyBase}_0`].filter((val, r) => filterCond(r));
|
|
2752
|
+
const stepRtnList = g_keyObj[`stepRtn${keyBase}_0`].filter((val, r) => filterCond(r));
|
|
2753
|
+
const keyNum = g_keyObj[keyCtrlPtn].filter((val, r) => filterCond(r)).length;
|
|
2736
2754
|
|
|
2737
2755
|
// ---- Dancing☆Onigiri (CW Edition対応)のフォーマット
|
|
2738
2756
|
g_editorTmp[keyN] = {};
|
|
@@ -2755,7 +2773,7 @@ const initialControl = async () => {
|
|
|
2755
2773
|
if (divMaxPos > divPos) {
|
|
2756
2774
|
|
|
2757
2775
|
// posXの実際の相対位置を計算
|
|
2758
|
-
const orgPosList = g_keyObj[`pos${keyBase}`].filter((val,
|
|
2776
|
+
const orgPosList = g_keyObj[`pos${keyBase}`].filter((val, r) => filterCond(r));
|
|
2759
2777
|
const posList = orgPosList.map(val => val < divPos ? val - deltaXAbove : val - divPos - deltaXBelow);
|
|
2760
2778
|
|
|
2761
2779
|
g_editorTmp[keyN].orderGroups = [];
|
|
@@ -2804,18 +2822,17 @@ const initialControl = async () => {
|
|
|
2804
2822
|
}
|
|
2805
2823
|
|
|
2806
2824
|
// 矢印・フリーズアローのヘッダー情報を定義
|
|
2807
|
-
|
|
2808
|
-
|
|
2809
|
-
noteTxt += `|${val.slice(0, -(`_data`.length))}[i]_data=[a${String(j).padStart(2, `0`)}]|[E]<br>`);
|
|
2825
|
+
const noteTxt = g_editorTmp[keyN].noteNames.map((val, r) =>
|
|
2826
|
+
`|${val.slice(0, -(`_data`.length))}[i]_data=[a${String(r).padStart(2, `0`)}]|[E]<br>`).join(``);
|
|
2810
2827
|
|
|
2811
|
-
g_editorTmp[keyN].freezeNames.
|
|
2812
|
-
|
|
2828
|
+
const freezeTxt = g_editorTmp[keyN].freezeNames.map((val, r) =>
|
|
2829
|
+
`|${val.slice(0, -(`_data`.length))}[i]_data=[f${String(r).padStart(2, `0`)}]|[E]<br>`).join(``);
|
|
2813
2830
|
|
|
2814
2831
|
g_editorTmp2 += g_editorTmp2Template
|
|
2815
2832
|
.replace(`[__KEY__]`, keyN)
|
|
2816
2833
|
.replace(`[__MAP__]`, colorList.map(val => val < 3 ? (val + 1) % 3 : val % 7).join(','))
|
|
2817
|
-
.replace(`[__POS__]`, fillArray(keyNum).map((val,
|
|
2818
|
-
isNaN(parseFloat(stepRtnList[
|
|
2834
|
+
.replace(`[__POS__]`, fillArray(keyNum).map((val, r) =>
|
|
2835
|
+
isNaN(parseFloat(stepRtnList[r])) ? 28 : 24).join(`,`))
|
|
2819
2836
|
.replace(`[__TXT__]`, g_editorTmp[keyN].chars.map(val => val.replace(`, `, ``)).join(`,`))
|
|
2820
2837
|
.replace(`[__CONV__]`, convTxt)
|
|
2821
2838
|
.replace(`[__NOTE__]`, noteTxt)
|
|
@@ -2995,8 +3012,19 @@ const resetColorSetting = _scoreId => {
|
|
|
2995
3012
|
// 初期矢印・フリーズアロー色の再定義
|
|
2996
3013
|
if (g_stateObj.scoreLockFlg) {
|
|
2997
3014
|
Object.assign(g_rootObj, copySetColor(g_rootObj, _scoreId));
|
|
3015
|
+
|
|
3016
|
+
// 分割先のファイルで初期色が未定義の場合はデフォルト値を適用
|
|
3017
|
+
[``, `Shadow`].forEach(pattern =>
|
|
3018
|
+
[`set`, `frz`].forEach(arrow => {
|
|
3019
|
+
// frzShadowColorStrのみ、空で構成された初期配列があるためその条件を追加して除外条件とする
|
|
3020
|
+
if (!hasVal(g_rootObj[`${arrow}${pattern}Color${_scoreId + 1}`])
|
|
3021
|
+
&& g_headerObj[`${arrow}${pattern}ColorStr`]?.flat()?.some(val => hasVal(val))) {
|
|
3022
|
+
g_rootObj[`${arrow}${pattern}Color`] = g_headerObj[`${arrow}${pattern}ColorStr`].join(`,`);
|
|
3023
|
+
}
|
|
3024
|
+
})
|
|
3025
|
+
);
|
|
2998
3026
|
}
|
|
2999
|
-
Object.assign(g_headerObj, resetBaseColorList(g_headerObj, g_rootObj, { scoreId: _scoreId }));
|
|
3027
|
+
Object.assign(g_headerObj, resetBaseColorList(g_headerObj, g_rootObj, { scoreId: _scoreId, scoreLockFlg: false }));
|
|
3000
3028
|
};
|
|
3001
3029
|
|
|
3002
3030
|
/**
|
|
@@ -3017,12 +3045,12 @@ const resetGaugeSetting = _scoreId => {
|
|
|
3017
3045
|
*/
|
|
3018
3046
|
const copySetColor = (_baseObj, _scoreId) => {
|
|
3019
3047
|
const obj = {};
|
|
3020
|
-
const
|
|
3021
|
-
const
|
|
3048
|
+
const srcIdHeader = setScoreIdHeader(_scoreId, g_stateObj.scoreLockFlg, true);
|
|
3049
|
+
const targetIdHeader = setScoreIdHeader(_scoreId, false, true);
|
|
3022
3050
|
[``, `Shadow`].forEach(pattern =>
|
|
3023
|
-
[`set`, `frz`].filter(arrow => hasVal(_baseObj[`${arrow}${pattern}Color`]))
|
|
3024
|
-
.forEach(arrow => obj[`${arrow}${pattern}Color${
|
|
3025
|
-
|
|
3051
|
+
[`set`, `frz`].filter(arrow => hasVal(_baseObj[`${arrow}${pattern}Color${srcIdHeader}`] || _baseObj[`${arrow}${pattern}Color`]))
|
|
3052
|
+
.forEach(arrow => obj[`${arrow}${pattern}Color${targetIdHeader}`] =
|
|
3053
|
+
_baseObj[`${arrow}${pattern}Color${srcIdHeader}`] || _baseObj[`${arrow}${pattern}Color`]));
|
|
3026
3054
|
return obj;
|
|
3027
3055
|
};
|
|
3028
3056
|
|
|
@@ -3164,8 +3192,9 @@ const storeBaseData = (_scoreId, _scoreObj, _keyCtrlPtn) => {
|
|
|
3164
3192
|
/**
|
|
3165
3193
|
* ツール計算
|
|
3166
3194
|
* @param {object} _scoreObj
|
|
3167
|
-
* @param {number[][]} _scoreObj.arrowData
|
|
3168
|
-
* @param {number[][]} _scoreObj.frzData
|
|
3195
|
+
* @param {number[][]} _scoreObj.arrowData 矢印データ
|
|
3196
|
+
* @param {number[][]} _scoreObj.frzData フリーズデータ
|
|
3197
|
+
* @returns {{tool: string, tate: number, douji: number, push3Cnt: number, push3: number[]}}
|
|
3169
3198
|
*/
|
|
3170
3199
|
const calcLevel = _scoreObj => {
|
|
3171
3200
|
//--------------------------------------------------------------
|
|
@@ -3330,6 +3359,7 @@ const calcLevel = _scoreObj => {
|
|
|
3330
3359
|
* ロケールを含んだヘッダーの優先度設定
|
|
3331
3360
|
* @param {object} _obj
|
|
3332
3361
|
* @param {...any} [_params]
|
|
3362
|
+
* @returns {string}
|
|
3333
3363
|
*/
|
|
3334
3364
|
const getHeader = (_obj, ..._params) => {
|
|
3335
3365
|
let headerLocale, headerDf;
|
|
@@ -3350,7 +3380,7 @@ const getHname = _param => [_param, _param.toLowerCase()];
|
|
|
3350
3380
|
/**
|
|
3351
3381
|
* 譜面ヘッダーの分解(スキン、jsファイルなどの設定)
|
|
3352
3382
|
* @param {object} _dosObj
|
|
3353
|
-
* @returns
|
|
3383
|
+
* @returns {object}
|
|
3354
3384
|
*/
|
|
3355
3385
|
const preheaderConvert = _dosObj => {
|
|
3356
3386
|
|
|
@@ -3418,7 +3448,7 @@ const preheaderConvert = _dosObj => {
|
|
|
3418
3448
|
/**
|
|
3419
3449
|
* 譜面ヘッダーの分解(その他の設定)
|
|
3420
3450
|
* @param {object} _dosObj 譜面データオブジェクト
|
|
3421
|
-
* @returns
|
|
3451
|
+
* @returns {object}
|
|
3422
3452
|
*/
|
|
3423
3453
|
const headerConvert = _dosObj => {
|
|
3424
3454
|
|
|
@@ -3785,6 +3815,7 @@ const headerConvert = _dosObj => {
|
|
|
3785
3815
|
}
|
|
3786
3816
|
|
|
3787
3817
|
// カスタムゲージ設定、初期色設定(譜面ヘッダー)の譜面別設定
|
|
3818
|
+
Object.assign(obj, resetBaseColorList(obj, _dosObj));
|
|
3788
3819
|
for (let j = 0; j < obj.difLabels.length; j++) {
|
|
3789
3820
|
Object.assign(g_gaugeOptionObj, resetCustomGauge(_dosObj, { scoreId: j }));
|
|
3790
3821
|
Object.assign(obj, resetBaseColorList(obj, _dosObj, { scoreId: j }));
|
|
@@ -4156,9 +4187,9 @@ const resetColorType = ({ _from = ``, _to = ``, _fromObj = g_headerObj, _toObj =
|
|
|
4156
4187
|
};
|
|
4157
4188
|
|
|
4158
4189
|
/**
|
|
4159
|
-
*
|
|
4160
|
-
* @param {string[]|number[]} _arr
|
|
4161
|
-
* @param {string} _target
|
|
4190
|
+
* 配列に対象がいない場合、配列の先頭にその対象を追加
|
|
4191
|
+
* @param {string[]|number[]} _arr 検索対象の配列
|
|
4192
|
+
* @param {string|number} _target 検索対象
|
|
4162
4193
|
* @returns {string[]|number[]}
|
|
4163
4194
|
*/
|
|
4164
4195
|
const addValtoArray = (_arr, _target) => {
|
|
@@ -4233,12 +4264,13 @@ const addGaugeFulls = _obj => _obj.map(key => g_gaugeOptionObj.customFulls[key]
|
|
|
4233
4264
|
* @param {object} _baseObj
|
|
4234
4265
|
* @param {object} _dosObj
|
|
4235
4266
|
* @param {string} [object.scoreId='']
|
|
4236
|
-
* @
|
|
4267
|
+
* @param {boolean} [object.scoreLockFlg=g_stateObj.scoreLockFlg]
|
|
4268
|
+
* @returns {object} ※Object.assign(obj, resetBaseColorList(...))の形で呼び出しが必要
|
|
4237
4269
|
*/
|
|
4238
|
-
const resetBaseColorList = (_baseObj, _dosObj, { scoreId =
|
|
4270
|
+
const resetBaseColorList = (_baseObj, _dosObj, { scoreId = ``, scoreLockFlg = g_stateObj.scoreLockFlg } = {}) => {
|
|
4239
4271
|
|
|
4240
4272
|
const obj = {};
|
|
4241
|
-
const idHeader = setScoreIdHeader(scoreId);
|
|
4273
|
+
const idHeader = setScoreIdHeader(scoreId, scoreLockFlg, scoreId !== ``);
|
|
4242
4274
|
const getRefData = (_header, _dataName) => {
|
|
4243
4275
|
const data = _dosObj[`${_header}${_dataName}`];
|
|
4244
4276
|
return data?.startsWith(_header) ? _dosObj[data] : data;
|
|
@@ -4384,12 +4416,12 @@ const setColorList = (_data, _colorInit, _colorInitLength,
|
|
|
4384
4416
|
* |customGauge=Original::F,Normal::V,Escape::V|
|
|
4385
4417
|
* @param {object} _dosObj
|
|
4386
4418
|
* @param {string} [object.scoreId=0]
|
|
4387
|
-
* @returns
|
|
4419
|
+
* @returns {object} ※Object.assign(obj, resetCustomGauge(...))の形で呼び出しが必要
|
|
4388
4420
|
*/
|
|
4389
4421
|
const resetCustomGauge = (_dosObj, { scoreId = 0 } = {}) => {
|
|
4390
4422
|
|
|
4391
4423
|
const obj = {};
|
|
4392
|
-
const scoreIdHeader = setScoreIdHeader(scoreId, g_stateObj.scoreLockFlg);
|
|
4424
|
+
const scoreIdHeader = setScoreIdHeader(scoreId, g_stateObj.scoreLockFlg, false);
|
|
4393
4425
|
const dosCustomGauge = _dosObj[`customGauge${scoreIdHeader}`];
|
|
4394
4426
|
if (hasVal(dosCustomGauge)) {
|
|
4395
4427
|
if (g_gaugeOptionObj.defaultPlusList.includes(dosCustomGauge)) {
|
|
@@ -4456,7 +4488,9 @@ const getGaugeSetting = (_dosObj, _name, _difLength, { scoreId = 0 } = {}) => {
|
|
|
4456
4488
|
obj.lifeInits[_scoreId] = _gaugeDetails[3];
|
|
4457
4489
|
|
|
4458
4490
|
if (gaugeUpdateFlg && hasVal(g_gaugeOptionObj[`gauge${_name}s`])) {
|
|
4459
|
-
|
|
4491
|
+
// ゲージ上書き時は_gaugeDetails(obj)の値を優先し、デフォルト値で穴埋めする
|
|
4492
|
+
Object.keys(obj).forEach(key => g_gaugeOptionObj[`gauge${_name}s`][key] =
|
|
4493
|
+
fillMissingArrayElem(g_gaugeOptionObj[`gauge${_name}s`][key] || [], obj[key]));
|
|
4460
4494
|
return false;
|
|
4461
4495
|
}
|
|
4462
4496
|
return true;
|
|
@@ -4470,9 +4504,12 @@ const getGaugeSetting = (_dosObj, _name, _difLength, { scoreId = 0 } = {}) => {
|
|
|
4470
4504
|
*/
|
|
4471
4505
|
const getGaugeDetailList = (_scoreId, _defaultGaugeList) => {
|
|
4472
4506
|
if (_scoreId > 0) {
|
|
4473
|
-
const
|
|
4507
|
+
const idHeader = setScoreIdHeader(_scoreId, g_stateObj.scoreLockFlg, false);
|
|
4508
|
+
const dosId = (idHeader || 0) - 1;
|
|
4509
|
+
const headerName = `gauge${_name}${idHeader}`;
|
|
4474
4510
|
if (hasVal(_dosObj[headerName])) {
|
|
4475
|
-
|
|
4511
|
+
const gauges = splitLF2(_dosObj[headerName]);
|
|
4512
|
+
return (gauges[dosId] || gauges[0])?.split(`,`);
|
|
4476
4513
|
}
|
|
4477
4514
|
}
|
|
4478
4515
|
return _defaultGaugeList;
|
|
@@ -4480,12 +4517,12 @@ const getGaugeSetting = (_dosObj, _name, _difLength, { scoreId = 0 } = {}) => {
|
|
|
4480
4517
|
|
|
4481
4518
|
if (hasVal(_dosObj[`gauge${_name}`])) {
|
|
4482
4519
|
|
|
4520
|
+
const gauges = splitLF2(_dosObj[`gauge${_name}`]);
|
|
4483
4521
|
if (gaugeUpdateFlg) {
|
|
4484
|
-
gaugeCreateFlg = setGaugeDetails(scoreId,
|
|
4522
|
+
gaugeCreateFlg = setGaugeDetails(scoreId, (gauges[scoreId] || gauges[0])?.split(`,`));
|
|
4485
4523
|
} else {
|
|
4486
|
-
const gauges = splitLF2(_dosObj[`gauge${_name}`]);
|
|
4487
4524
|
for (let j = 0; j < _difLength; j++) {
|
|
4488
|
-
gaugeCreateFlg = setGaugeDetails(j, getGaugeDetailList(j, (gauges[j]
|
|
4525
|
+
gaugeCreateFlg = setGaugeDetails(j, getGaugeDetailList(j, (gauges[j] || gauges[0]).split(`,`)));
|
|
4489
4526
|
}
|
|
4490
4527
|
}
|
|
4491
4528
|
|
|
@@ -4545,6 +4582,7 @@ const getKeyCtrlVal = _kCdN => {
|
|
|
4545
4582
|
|
|
4546
4583
|
/**
|
|
4547
4584
|
* 一時的な追加キーの設定
|
|
4585
|
+
* - keyExtraListの指定がない場合は、_dosObj.keyCtrlXに合致するXを追加キーとして追加
|
|
4548
4586
|
* @param {object} _dosObj
|
|
4549
4587
|
* @param {string[]} object.keyExtraList
|
|
4550
4588
|
* @returns {string[]}
|
|
@@ -4640,6 +4678,7 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList?.split(`,`)
|
|
|
4640
4678
|
|
|
4641
4679
|
/**
|
|
4642
4680
|
* キーパターンの略名から実際のデータへ展開
|
|
4681
|
+
* - charaX の場合に限り、a>5_0 の形式を aleft, adown, aup, aright, aspace に変換する
|
|
4643
4682
|
* @param {string} _str
|
|
4644
4683
|
* @param {string} _name
|
|
4645
4684
|
* @param {function} _convFunc
|
|
@@ -5434,7 +5473,7 @@ const drawTitle = (_titleName = g_headerObj.musicTitleForView, _scoreId = ``) =>
|
|
|
5434
5473
|
/**
|
|
5435
5474
|
* 製作者情報の取得
|
|
5436
5475
|
* @param {string[]} _creatorList
|
|
5437
|
-
* @returns [string, string, number]
|
|
5476
|
+
* @returns {[string, string, number]}
|
|
5438
5477
|
*/
|
|
5439
5478
|
const getCreatorInfo = (_creatorList) => {
|
|
5440
5479
|
const creatorName = makeDedupliArray(_creatorList).length === 1 ? _creatorList[0] : `Various`;
|
|
@@ -5480,7 +5519,7 @@ const playBGM = async (_num, _currentLoopNum = g_settings.musicLoopNum) => {
|
|
|
5480
5519
|
const encodeFlg = listMatching(musicUrl, [`.js`, `.txt`], { suffix: `$` });
|
|
5481
5520
|
const musicStart = g_headerObj.musicStarts?.[currentIdx] ?? 0;
|
|
5482
5521
|
const musicEnd = g_headerObj.musicEnds?.[currentIdx] ?? 0;
|
|
5483
|
-
const isTitle = () => g_currentPage === `title
|
|
5522
|
+
const isTitle = () => g_currentPage === `title` && _currentLoopNum === g_settings.musicLoopNum;
|
|
5484
5523
|
|
|
5485
5524
|
/**
|
|
5486
5525
|
* BGMのフェードアウトとシーク
|
|
@@ -5573,20 +5612,19 @@ const playBGM = async (_num, _currentLoopNum = g_settings.musicLoopNum) => {
|
|
|
5573
5612
|
}
|
|
5574
5613
|
};
|
|
5575
5614
|
|
|
5576
|
-
const musicPlayCheck = () => _currentLoopNum !== g_settings.musicLoopNum || g_currentPage !== `title`;
|
|
5577
5615
|
if (encodeFlg) {
|
|
5578
5616
|
try {
|
|
5579
5617
|
// base64エンコードは読込に時間が掛かるため、曲変更時のみ読込
|
|
5580
5618
|
if (!hasVal(g_musicdata) || Math.abs(_num) % g_headerObj.musicIdxList.length !== 0) {
|
|
5581
5619
|
await loadScript2(url);
|
|
5582
5620
|
musicInit();
|
|
5583
|
-
if (
|
|
5621
|
+
if (!isTitle()) {
|
|
5584
5622
|
return;
|
|
5585
5623
|
}
|
|
5586
5624
|
const tmpAudio = new AudioPlayer();
|
|
5587
5625
|
const array = Uint8Array.from(atob(g_musicdata), v => v.charCodeAt(0));
|
|
5588
5626
|
await tmpAudio.init(array.buffer);
|
|
5589
|
-
if (
|
|
5627
|
+
if (!isTitle()) {
|
|
5590
5628
|
tmpAudio.close();
|
|
5591
5629
|
return;
|
|
5592
5630
|
}
|
|
@@ -5609,7 +5647,7 @@ const playBGM = async (_num, _currentLoopNum = g_settings.musicLoopNum) => {
|
|
|
5609
5647
|
g_audio.volume = g_stateObj.bgmVolume / 100;
|
|
5610
5648
|
const loadedMeta = g_handler.addListener(g_audio, `loadedmetadata`, () => {
|
|
5611
5649
|
g_handler.removeListener(loadedMeta);
|
|
5612
|
-
if (
|
|
5650
|
+
if (!isTitle()) {
|
|
5613
5651
|
return;
|
|
5614
5652
|
}
|
|
5615
5653
|
g_audio.currentTime = musicStart;
|
|
@@ -8853,7 +8891,9 @@ const keyConfigInit = (_kcType = g_kcType) => {
|
|
|
8853
8891
|
resetColorType({ _from: g_colorType, _to: g_colorType, _fromObj: g_dfColorObj });
|
|
8854
8892
|
|
|
8855
8893
|
// 影矢印が未指定の場合はType1, Type2の影矢印指定を無くす
|
|
8856
|
-
|
|
8894
|
+
const _idHeader = setScoreIdHeader(g_stateObj.scoreId, false, true);
|
|
8895
|
+
const _shadowDefault = g_headerObj[`setShadowColor${_idHeader}Default`];
|
|
8896
|
+
if ((!Array.isArray(_shadowDefault) || !hasVal(_shadowDefault[0])) &&
|
|
8857
8897
|
[`Type1`, `Type2`].includes(g_colorType)) {
|
|
8858
8898
|
|
|
8859
8899
|
g_headerObj.setShadowColor = fillArray(g_headerObj.setColorInit.length, ``);
|
|
@@ -9172,10 +9212,11 @@ const updateKeyInfo = (_header, _keyCtrlPtn) => {
|
|
|
9172
9212
|
|
|
9173
9213
|
/**
|
|
9174
9214
|
* 初期矢印色・フリーズアロー色の変更
|
|
9215
|
+
* - ここでのID管理は1譜面目も区別して設定する (setScoreIdHeaderの第三引数を使用)
|
|
9175
9216
|
*/
|
|
9176
9217
|
const changeSetColor = () => {
|
|
9177
9218
|
const isDefault = [`Default`, `Type0`].includes(g_colorType);
|
|
9178
|
-
const idHeader = setScoreIdHeader(g_stateObj.scoreId);
|
|
9219
|
+
const idHeader = setScoreIdHeader(g_stateObj.scoreId, false, true);
|
|
9179
9220
|
const defaultType = idHeader + g_colorType;
|
|
9180
9221
|
const currentTypes = {
|
|
9181
9222
|
'': (isDefault ? defaultType : g_colorType),
|
|
@@ -9521,15 +9562,16 @@ const loadingScoreInit = async () => {
|
|
|
9521
9562
|
* 譜面番号の取得
|
|
9522
9563
|
* @param {number} _scoreId
|
|
9523
9564
|
* @param {boolean} _scoreLockFlg
|
|
9565
|
+
* @param {boolean} _useOne 1譜面目指定有無フラグ (初期色に関する箇所のみ指定)
|
|
9524
9566
|
* @returns {number|string}
|
|
9525
9567
|
*/
|
|
9526
|
-
const setScoreIdHeader = (_scoreId = 0, _scoreLockFlg = false) => {
|
|
9568
|
+
const setScoreIdHeader = (_scoreId = 0, _scoreLockFlg = false, _useOne = false) => {
|
|
9527
9569
|
if (!_scoreLockFlg && _scoreId > 0) {
|
|
9528
9570
|
return Number(_scoreId) + 1;
|
|
9529
9571
|
} else if (_scoreLockFlg && g_headerObj.scoreNos?.[_scoreId] > 1) {
|
|
9530
9572
|
return g_headerObj.scoreNos[_scoreId];
|
|
9531
9573
|
}
|
|
9532
|
-
return ``;
|
|
9574
|
+
return _useOne ? 1 : ``;
|
|
9533
9575
|
};
|
|
9534
9576
|
|
|
9535
9577
|
/**
|
|
@@ -9757,7 +9799,7 @@ const scoreConvert = (_dosObj, _scoreId, _preblankFrame, _dummyNo = ``,
|
|
|
9757
9799
|
// 矢印群の格納先
|
|
9758
9800
|
const obj = {};
|
|
9759
9801
|
|
|
9760
|
-
const scoreIdHeader = setScoreIdHeader(_scoreId, g_stateObj.scoreLockFlg);
|
|
9802
|
+
const scoreIdHeader = setScoreIdHeader(_scoreId, g_stateObj.scoreLockFlg, false);
|
|
9761
9803
|
const keyNum = g_keyObj[`${g_keyObj.defaultProp}${_keyCtrlPtn}`].length;
|
|
9762
9804
|
obj.arrowData = [];
|
|
9763
9805
|
obj.frzData = [];
|
|
@@ -11484,6 +11526,7 @@ const mainInit = () => {
|
|
|
11484
11526
|
g_workObj.lastFadeFrame = fillArray(wordMaxLen);
|
|
11485
11527
|
g_workObj.wordFadeFrame = fillArray(wordMaxLen);
|
|
11486
11528
|
const mainCommonPos = { w: g_headerObj.playingWidth, h: g_posObj.arrowHeight };
|
|
11529
|
+
const objOpacity = g_stateObj.opacity / 100;
|
|
11487
11530
|
|
|
11488
11531
|
// 背景スプライトを作成
|
|
11489
11532
|
createMultipleSprite(`backSprite`, g_scoreObj.backMaxDepth, { x: g_workObj.backX });
|
|
@@ -11564,11 +11607,11 @@ const mainInit = () => {
|
|
|
11564
11607
|
if (g_appearanceRanges.includes(g_stateObj.appearance)) {
|
|
11565
11608
|
mainSprite.appendChild(createDivCss2Label(`filterView`, ``, g_lblPosObj.filterView));
|
|
11566
11609
|
if (g_stateObj.d_filterline === C_FLG_ON) {
|
|
11567
|
-
$id(`filterView`).opacity =
|
|
11610
|
+
$id(`filterView`).opacity = objOpacity;
|
|
11568
11611
|
for (let j = 0; j < g_stateObj.layerNum; j++) {
|
|
11569
|
-
$id(`filterBar${j}`).opacity =
|
|
11612
|
+
$id(`filterBar${j}`).opacity = objOpacity;
|
|
11570
11613
|
if (doubleFilterFlg) {
|
|
11571
|
-
$id(`filterBar${j}_HS`).opacity =
|
|
11614
|
+
$id(`filterBar${j}_HS`).opacity = objOpacity;
|
|
11572
11615
|
}
|
|
11573
11616
|
}
|
|
11574
11617
|
}
|
|
@@ -11680,13 +11723,11 @@ const mainInit = () => {
|
|
|
11680
11723
|
|
|
11681
11724
|
// ライフ(数字)部作成
|
|
11682
11725
|
const intLifeVal = Math.floor(g_workObj.lifeVal);
|
|
11683
|
-
let lblInitColor;
|
|
11726
|
+
let lblInitColor = g_cssObj.life_Failed;
|
|
11684
11727
|
if (g_workObj.lifeVal === g_headerObj.maxLifeVal) {
|
|
11685
11728
|
lblInitColor = g_cssObj.life_Max;
|
|
11686
11729
|
} else if (g_workObj.lifeVal >= g_workObj.lifeBorder) {
|
|
11687
11730
|
lblInitColor = g_cssObj.life_Cleared;
|
|
11688
|
-
} else {
|
|
11689
|
-
lblInitColor = g_cssObj.life_Failed;
|
|
11690
11731
|
}
|
|
11691
11732
|
|
|
11692
11733
|
// 曲名・アーティスト名、譜面名表示
|
|
@@ -11792,7 +11833,7 @@ const mainInit = () => {
|
|
|
11792
11833
|
const charaJ = createDivCss2Label(`chara${jdg}`, ``, {
|
|
11793
11834
|
x: jdgX[j], y: jdgY[j],
|
|
11794
11835
|
w: g_limitObj.jdgCharaWidth, h: g_limitObj.jdgCharaHeight, siz: g_limitObj.jdgCharaSiz,
|
|
11795
|
-
opacity:
|
|
11836
|
+
opacity: objOpacity, display: g_workObj.judgmentDisp,
|
|
11796
11837
|
}, g_cssObj.common_ii);
|
|
11797
11838
|
charaJ.setAttribute(`cnt`, 0);
|
|
11798
11839
|
|
|
@@ -11805,14 +11846,14 @@ const mainInit = () => {
|
|
|
11805
11846
|
createDivCss2Label(`combo${jdg}`, ``, {
|
|
11806
11847
|
x: jdgX[j] + 170, y: jdgY[j],
|
|
11807
11848
|
w: g_limitObj.jdgCharaWidth, h: g_limitObj.jdgCharaHeight, siz: g_limitObj.jdgCharaSiz,
|
|
11808
|
-
opacity:
|
|
11849
|
+
opacity: objOpacity, display: g_workObj.judgmentDisp,
|
|
11809
11850
|
}, g_cssObj[`common_combo${jdg}`]),
|
|
11810
11851
|
|
|
11811
11852
|
// Fast/Slow表示
|
|
11812
11853
|
createDivCss2Label(`diff${jdg}`, ``, {
|
|
11813
11854
|
x: jdgX[j] + 170, y: jdgY[j] + 25,
|
|
11814
11855
|
w: g_limitObj.jdgCharaWidth, h: g_limitObj.jdgCharaHeight, siz: g_limitObj.mainSiz,
|
|
11815
|
-
opacity:
|
|
11856
|
+
opacity: objOpacity, display: g_workObj.fastslowDisp,
|
|
11816
11857
|
}, g_cssObj.common_combo),
|
|
11817
11858
|
|
|
11818
11859
|
);
|
|
@@ -13622,7 +13663,7 @@ const resultInit = () => {
|
|
|
13622
13663
|
} else {
|
|
13623
13664
|
// ゲームオーバー時は失敗時のリザルトモーションを適用
|
|
13624
13665
|
if (!g_finishFlg) {
|
|
13625
|
-
const scoreIdHeader = setScoreIdHeader(g_stateObj.scoreId, g_stateObj.scoreLockFlg);
|
|
13666
|
+
const scoreIdHeader = setScoreIdHeader(g_stateObj.scoreId, g_stateObj.scoreLockFlg, false);
|
|
13626
13667
|
|
|
13627
13668
|
g_animationData.forEach(sprite => {
|
|
13628
13669
|
const failedData = g_rootObj[`${sprite}failedS${scoreIdHeader}_data`] ?? g_rootObj[`${sprite}failedS_data`];
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*
|
|
6
6
|
* Source by tickle
|
|
7
7
|
* Created : 2019/11/19
|
|
8
|
-
* Revised : 2025/
|
|
8
|
+
* Revised : 2025/08/22 (v42.5.0)
|
|
9
9
|
*
|
|
10
10
|
* https://github.com/cwtickle/danoniplus
|
|
11
11
|
*/
|
|
@@ -3695,7 +3695,7 @@ const g_checkStr = {
|
|
|
3695
3695
|
|
|
3696
3696
|
// 譜面分割あり、譜面番号固定時のみ譜面データを一時クリアする際の条件
|
|
3697
3697
|
resetDosHeader: [`gauge`],
|
|
3698
|
-
resetDosFooter: [`_data`, `_change`, `Color`, `customGauge`],
|
|
3698
|
+
resetDosFooter: [`_data`, `_change`, `Color`, `Color1`, `customGauge`],
|
|
3699
3699
|
};
|
|
3700
3700
|
|
|
3701
3701
|
/**
|