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 CHANGED
@@ -4,12 +4,12 @@
4
4
  *
5
5
  * Source by tickle
6
6
  * Created : 2018/10/08
7
- * Revised : 2025/06/28
7
+ * Revised : 2025/08/22
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 42.3.1`;
12
- const g_revisedDate = `2025/06/28`;
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
- const loopCount = g_stateObj.dosDivideFlg ? g_headerObj.keyLabels.length : 1;
2669
- for (let j = 0; j < loopCount; j++) {
2670
- resetGaugeSetting(j);
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 = (j) => keyGroup[j].findIndex(val => val === keyGroupNo) >= 0;
2731
- const keyCtrlList = g_keyObj[keyCtrlPtn].filter((val, j) => filterCond(j));
2732
- const charaList = g_keyObj[`chara${keyBase}`].filter((val, j) => filterCond(j));
2733
- const colorList = g_keyObj[`color${keyBase}_0`].filter((val, j) => filterCond(j));
2734
- const stepRtnList = g_keyObj[`stepRtn${keyBase}_0`].filter((val, j) => filterCond(j));
2735
- const keyNum = g_keyObj[keyCtrlPtn].filter((val, j) => filterCond(j)).length;
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, j) => filterCond(j));
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
- let noteTxt = ``, freezeTxt = ``;
2808
- g_editorTmp[keyN].noteNames.forEach((val, j) =>
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.forEach((val, j) =>
2812
- freezeTxt += `|${val.slice(0, -(`_data`.length))}[i]_data=[f${String(j).padStart(2, `0`)}]|[E]<br>`);
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, j) =>
2818
- isNaN(parseFloat(stepRtnList[j])) ? 28 : 24).join(`,`))
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 scoreIdHeader = setScoreIdHeader(_scoreId, g_stateObj.scoreLockFlg);
3021
- const idHeader = setScoreIdHeader(_scoreId);
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${idHeader}`] =
3025
- (_baseObj[`${arrow}${pattern}Color${scoreIdHeader}`] ?? _baseObj[`${arrow}${pattern}Color`]).concat()));
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
- * @returns オブジェクト ※Object.assign(obj, resetBaseColorList(...))の形で呼び出しが必要
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 オブジェクト ※Object.assign(obj, resetCustomGauge(...))の形で呼び出しが必要
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
- Object.keys(obj).forEach(key => Object.assign(g_gaugeOptionObj[`gauge${_name}s`][key] || [], obj[key]));
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 headerName = `gauge${_name}${setScoreIdHeader(_scoreId, g_stateObj.scoreLockFlg)}`;
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
- return _dosObj[headerName].split(`,`);
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, _dosObj[`gauge${_name}`].split(`,`));
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] ?? gauges[0]).split(`,`)));
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 (musicPlayCheck()) {
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 (musicPlayCheck()) {
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 (musicPlayCheck()) {
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
- if (!hasVal(g_headerObj[`setShadowColor${setScoreIdHeader(g_stateObj.scoreId)}Default`][0]) &&
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 = g_stateObj.opacity / 100;
11610
+ $id(`filterView`).opacity = objOpacity;
11568
11611
  for (let j = 0; j < g_stateObj.layerNum; j++) {
11569
- $id(`filterBar${j}`).opacity = g_stateObj.opacity / 100;
11612
+ $id(`filterBar${j}`).opacity = objOpacity;
11570
11613
  if (doubleFilterFlg) {
11571
- $id(`filterBar${j}_HS`).opacity = g_stateObj.opacity / 100;
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: g_stateObj.opacity / 100, display: g_workObj.judgmentDisp,
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: g_stateObj.opacity / 100, display: g_workObj.judgmentDisp,
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: g_stateObj.opacity / 100, display: g_workObj.fastslowDisp,
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/06/26 (v42.3.0)
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
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "42.3.1",
3
+ "version": "42.5.0",
4
4
  "description": "Dancing☆Onigiri (CW Edition) - Web-based Rhythm Game",
5
5
  "main": "./js/danoni_main.js",
6
6
  "scripts": {