danoniplus 42.3.1 → 42.4.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.
Files changed (2) hide show
  1. package/js/danoni_main.js +92 -63
  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/06/28
7
+ * Revised : 2025/08/21
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.4.0`;
12
+ const g_revisedDate = `2025/08/21`;
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)
@@ -3017,12 +3034,12 @@ const resetGaugeSetting = _scoreId => {
3017
3034
  */
3018
3035
  const copySetColor = (_baseObj, _scoreId) => {
3019
3036
  const obj = {};
3020
- const scoreIdHeader = setScoreIdHeader(_scoreId, g_stateObj.scoreLockFlg);
3021
- const idHeader = setScoreIdHeader(_scoreId);
3037
+ const srcIdHeader = setScoreIdHeader(_scoreId, g_stateObj.scoreLockFlg, true);
3038
+ const targetIdHeader = setScoreIdHeader(_scoreId, false, true);
3022
3039
  [``, `Shadow`].forEach(pattern =>
3023
3040
  [`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()));
3041
+ .forEach(arrow => obj[`${arrow}${pattern}Color${targetIdHeader}`] =
3042
+ (_baseObj[`${arrow}${pattern}Color${srcIdHeader}`] ?? _baseObj[`${arrow}${pattern}Color`]).concat()));
3026
3043
  return obj;
3027
3044
  };
3028
3045
 
@@ -3164,8 +3181,9 @@ const storeBaseData = (_scoreId, _scoreObj, _keyCtrlPtn) => {
3164
3181
  /**
3165
3182
  * ツール計算
3166
3183
  * @param {object} _scoreObj
3167
- * @param {number[][]} _scoreObj.arrowData
3168
- * @param {number[][]} _scoreObj.frzData
3184
+ * @param {number[][]} _scoreObj.arrowData 矢印データ
3185
+ * @param {number[][]} _scoreObj.frzData フリーズデータ
3186
+ * @returns {{tool: string, tate: number, douji: number, push3Cnt: number, push3: number[]}}
3169
3187
  */
3170
3188
  const calcLevel = _scoreObj => {
3171
3189
  //--------------------------------------------------------------
@@ -3330,6 +3348,7 @@ const calcLevel = _scoreObj => {
3330
3348
  * ロケールを含んだヘッダーの優先度設定
3331
3349
  * @param {object} _obj
3332
3350
  * @param {...any} [_params]
3351
+ * @returns {string}
3333
3352
  */
3334
3353
  const getHeader = (_obj, ..._params) => {
3335
3354
  let headerLocale, headerDf;
@@ -3350,7 +3369,7 @@ const getHname = _param => [_param, _param.toLowerCase()];
3350
3369
  /**
3351
3370
  * 譜面ヘッダーの分解(スキン、jsファイルなどの設定)
3352
3371
  * @param {object} _dosObj
3353
- * @returns
3372
+ * @returns {object}
3354
3373
  */
3355
3374
  const preheaderConvert = _dosObj => {
3356
3375
 
@@ -3418,7 +3437,7 @@ const preheaderConvert = _dosObj => {
3418
3437
  /**
3419
3438
  * 譜面ヘッダーの分解(その他の設定)
3420
3439
  * @param {object} _dosObj 譜面データオブジェクト
3421
- * @returns
3440
+ * @returns {object}
3422
3441
  */
3423
3442
  const headerConvert = _dosObj => {
3424
3443
 
@@ -3785,6 +3804,7 @@ const headerConvert = _dosObj => {
3785
3804
  }
3786
3805
 
3787
3806
  // カスタムゲージ設定、初期色設定(譜面ヘッダー)の譜面別設定
3807
+ Object.assign(obj, resetBaseColorList(obj, _dosObj));
3788
3808
  for (let j = 0; j < obj.difLabels.length; j++) {
3789
3809
  Object.assign(g_gaugeOptionObj, resetCustomGauge(_dosObj, { scoreId: j }));
3790
3810
  Object.assign(obj, resetBaseColorList(obj, _dosObj, { scoreId: j }));
@@ -4156,9 +4176,9 @@ const resetColorType = ({ _from = ``, _to = ``, _fromObj = g_headerObj, _toObj =
4156
4176
  };
4157
4177
 
4158
4178
  /**
4159
- * 配列にデータを先頭に追加
4160
- * @param {string[]|number[]} _arr
4161
- * @param {string} _target
4179
+ * 配列に対象がいない場合、配列の先頭にその対象を追加
4180
+ * @param {string[]|number[]} _arr 検索対象の配列
4181
+ * @param {string|number} _target 検索対象
4162
4182
  * @returns {string[]|number[]}
4163
4183
  */
4164
4184
  const addValtoArray = (_arr, _target) => {
@@ -4233,12 +4253,12 @@ const addGaugeFulls = _obj => _obj.map(key => g_gaugeOptionObj.customFulls[key]
4233
4253
  * @param {object} _baseObj
4234
4254
  * @param {object} _dosObj
4235
4255
  * @param {string} [object.scoreId='']
4236
- * @returns オブジェクト ※Object.assign(obj, resetBaseColorList(...))の形で呼び出しが必要
4256
+ * @returns {object} ※Object.assign(obj, resetBaseColorList(...))の形で呼び出しが必要
4237
4257
  */
4238
4258
  const resetBaseColorList = (_baseObj, _dosObj, { scoreId = `` } = {}) => {
4239
4259
 
4240
4260
  const obj = {};
4241
- const idHeader = setScoreIdHeader(scoreId);
4261
+ const idHeader = setScoreIdHeader(scoreId, g_stateObj.scoreLockFlg, scoreId !== ``);
4242
4262
  const getRefData = (_header, _dataName) => {
4243
4263
  const data = _dosObj[`${_header}${_dataName}`];
4244
4264
  return data?.startsWith(_header) ? _dosObj[data] : data;
@@ -4384,12 +4404,12 @@ const setColorList = (_data, _colorInit, _colorInitLength,
4384
4404
  * |customGauge=Original::F,Normal::V,Escape::V|
4385
4405
  * @param {object} _dosObj
4386
4406
  * @param {string} [object.scoreId=0]
4387
- * @returns オブジェクト ※Object.assign(obj, resetCustomGauge(...))の形で呼び出しが必要
4407
+ * @returns {object} ※Object.assign(obj, resetCustomGauge(...))の形で呼び出しが必要
4388
4408
  */
4389
4409
  const resetCustomGauge = (_dosObj, { scoreId = 0 } = {}) => {
4390
4410
 
4391
4411
  const obj = {};
4392
- const scoreIdHeader = setScoreIdHeader(scoreId, g_stateObj.scoreLockFlg);
4412
+ const scoreIdHeader = setScoreIdHeader(scoreId, g_stateObj.scoreLockFlg, false);
4393
4413
  const dosCustomGauge = _dosObj[`customGauge${scoreIdHeader}`];
4394
4414
  if (hasVal(dosCustomGauge)) {
4395
4415
  if (g_gaugeOptionObj.defaultPlusList.includes(dosCustomGauge)) {
@@ -4456,7 +4476,9 @@ const getGaugeSetting = (_dosObj, _name, _difLength, { scoreId = 0 } = {}) => {
4456
4476
  obj.lifeInits[_scoreId] = _gaugeDetails[3];
4457
4477
 
4458
4478
  if (gaugeUpdateFlg && hasVal(g_gaugeOptionObj[`gauge${_name}s`])) {
4459
- Object.keys(obj).forEach(key => Object.assign(g_gaugeOptionObj[`gauge${_name}s`][key] || [], obj[key]));
4479
+ // ゲージ上書き時は_gaugeDetails(obj)の値を優先し、デフォルト値で穴埋めする
4480
+ Object.keys(obj).forEach(key => g_gaugeOptionObj[`gauge${_name}s`][key] =
4481
+ fillMissingArrayElem(g_gaugeOptionObj[`gauge${_name}s`][key] || [], obj[key]));
4460
4482
  return false;
4461
4483
  }
4462
4484
  return true;
@@ -4470,9 +4492,12 @@ const getGaugeSetting = (_dosObj, _name, _difLength, { scoreId = 0 } = {}) => {
4470
4492
  */
4471
4493
  const getGaugeDetailList = (_scoreId, _defaultGaugeList) => {
4472
4494
  if (_scoreId > 0) {
4473
- const headerName = `gauge${_name}${setScoreIdHeader(_scoreId, g_stateObj.scoreLockFlg)}`;
4495
+ const idHeader = setScoreIdHeader(_scoreId, g_stateObj.scoreLockFlg, false);
4496
+ const dosId = (idHeader || 0) - 1;
4497
+ const headerName = `gauge${_name}${idHeader}`;
4474
4498
  if (hasVal(_dosObj[headerName])) {
4475
- return _dosObj[headerName].split(`,`);
4499
+ const gauges = splitLF2(_dosObj[headerName]);
4500
+ return (gauges[dosId] || gauges[0])?.split(`,`);
4476
4501
  }
4477
4502
  }
4478
4503
  return _defaultGaugeList;
@@ -4480,12 +4505,12 @@ const getGaugeSetting = (_dosObj, _name, _difLength, { scoreId = 0 } = {}) => {
4480
4505
 
4481
4506
  if (hasVal(_dosObj[`gauge${_name}`])) {
4482
4507
 
4508
+ const gauges = splitLF2(_dosObj[`gauge${_name}`]);
4483
4509
  if (gaugeUpdateFlg) {
4484
- gaugeCreateFlg = setGaugeDetails(scoreId, _dosObj[`gauge${_name}`].split(`,`));
4510
+ gaugeCreateFlg = setGaugeDetails(scoreId, (gauges[scoreId] || gauges[0])?.split(`,`));
4485
4511
  } else {
4486
- const gauges = splitLF2(_dosObj[`gauge${_name}`]);
4487
4512
  for (let j = 0; j < _difLength; j++) {
4488
- gaugeCreateFlg = setGaugeDetails(j, getGaugeDetailList(j, (gauges[j] ?? gauges[0]).split(`,`)));
4513
+ gaugeCreateFlg = setGaugeDetails(j, getGaugeDetailList(j, (gauges[j] || gauges[0]).split(`,`)));
4489
4514
  }
4490
4515
  }
4491
4516
 
@@ -4545,6 +4570,7 @@ const getKeyCtrlVal = _kCdN => {
4545
4570
 
4546
4571
  /**
4547
4572
  * 一時的な追加キーの設定
4573
+ * - keyExtraListの指定がない場合は、_dosObj.keyCtrlXに合致するXを追加キーとして追加
4548
4574
  * @param {object} _dosObj
4549
4575
  * @param {string[]} object.keyExtraList
4550
4576
  * @returns {string[]}
@@ -4640,6 +4666,7 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList?.split(`,`)
4640
4666
 
4641
4667
  /**
4642
4668
  * キーパターンの略名から実際のデータへ展開
4669
+ * - charaX の場合に限り、a>5_0 の形式を aleft, adown, aup, aright, aspace に変換する
4643
4670
  * @param {string} _str
4644
4671
  * @param {string} _name
4645
4672
  * @param {function} _convFunc
@@ -5434,7 +5461,7 @@ const drawTitle = (_titleName = g_headerObj.musicTitleForView, _scoreId = ``) =>
5434
5461
  /**
5435
5462
  * 製作者情報の取得
5436
5463
  * @param {string[]} _creatorList
5437
- * @returns [string, string, number]
5464
+ * @returns {[string, string, number]}
5438
5465
  */
5439
5466
  const getCreatorInfo = (_creatorList) => {
5440
5467
  const creatorName = makeDedupliArray(_creatorList).length === 1 ? _creatorList[0] : `Various`;
@@ -5480,7 +5507,7 @@ const playBGM = async (_num, _currentLoopNum = g_settings.musicLoopNum) => {
5480
5507
  const encodeFlg = listMatching(musicUrl, [`.js`, `.txt`], { suffix: `$` });
5481
5508
  const musicStart = g_headerObj.musicStarts?.[currentIdx] ?? 0;
5482
5509
  const musicEnd = g_headerObj.musicEnds?.[currentIdx] ?? 0;
5483
- const isTitle = () => g_currentPage === `title`;
5510
+ const isTitle = () => g_currentPage === `title` && _currentLoopNum === g_settings.musicLoopNum;
5484
5511
 
5485
5512
  /**
5486
5513
  * BGMのフェードアウトとシーク
@@ -5573,20 +5600,19 @@ const playBGM = async (_num, _currentLoopNum = g_settings.musicLoopNum) => {
5573
5600
  }
5574
5601
  };
5575
5602
 
5576
- const musicPlayCheck = () => _currentLoopNum !== g_settings.musicLoopNum || g_currentPage !== `title`;
5577
5603
  if (encodeFlg) {
5578
5604
  try {
5579
5605
  // base64エンコードは読込に時間が掛かるため、曲変更時のみ読込
5580
5606
  if (!hasVal(g_musicdata) || Math.abs(_num) % g_headerObj.musicIdxList.length !== 0) {
5581
5607
  await loadScript2(url);
5582
5608
  musicInit();
5583
- if (musicPlayCheck()) {
5609
+ if (!isTitle()) {
5584
5610
  return;
5585
5611
  }
5586
5612
  const tmpAudio = new AudioPlayer();
5587
5613
  const array = Uint8Array.from(atob(g_musicdata), v => v.charCodeAt(0));
5588
5614
  await tmpAudio.init(array.buffer);
5589
- if (musicPlayCheck()) {
5615
+ if (!isTitle()) {
5590
5616
  tmpAudio.close();
5591
5617
  return;
5592
5618
  }
@@ -5609,7 +5635,7 @@ const playBGM = async (_num, _currentLoopNum = g_settings.musicLoopNum) => {
5609
5635
  g_audio.volume = g_stateObj.bgmVolume / 100;
5610
5636
  const loadedMeta = g_handler.addListener(g_audio, `loadedmetadata`, () => {
5611
5637
  g_handler.removeListener(loadedMeta);
5612
- if (musicPlayCheck()) {
5638
+ if (!isTitle()) {
5613
5639
  return;
5614
5640
  }
5615
5641
  g_audio.currentTime = musicStart;
@@ -8853,7 +8879,9 @@ const keyConfigInit = (_kcType = g_kcType) => {
8853
8879
  resetColorType({ _from: g_colorType, _to: g_colorType, _fromObj: g_dfColorObj });
8854
8880
 
8855
8881
  // 影矢印が未指定の場合はType1, Type2の影矢印指定を無くす
8856
- if (!hasVal(g_headerObj[`setShadowColor${setScoreIdHeader(g_stateObj.scoreId)}Default`][0]) &&
8882
+ const _idHeader = setScoreIdHeader(g_stateObj.scoreId, false, true);
8883
+ const _shadowDefault = g_headerObj[`setShadowColor${_idHeader}Default`];
8884
+ if ((!Array.isArray(_shadowDefault) || !hasVal(_shadowDefault[0])) &&
8857
8885
  [`Type1`, `Type2`].includes(g_colorType)) {
8858
8886
 
8859
8887
  g_headerObj.setShadowColor = fillArray(g_headerObj.setColorInit.length, ``);
@@ -9172,10 +9200,11 @@ const updateKeyInfo = (_header, _keyCtrlPtn) => {
9172
9200
 
9173
9201
  /**
9174
9202
  * 初期矢印色・フリーズアロー色の変更
9203
+ * - ここでのID管理は1譜面目も区別して設定する (setScoreIdHeaderの第三引数を使用)
9175
9204
  */
9176
9205
  const changeSetColor = () => {
9177
9206
  const isDefault = [`Default`, `Type0`].includes(g_colorType);
9178
- const idHeader = setScoreIdHeader(g_stateObj.scoreId);
9207
+ const idHeader = setScoreIdHeader(g_stateObj.scoreId, false, true);
9179
9208
  const defaultType = idHeader + g_colorType;
9180
9209
  const currentTypes = {
9181
9210
  '': (isDefault ? defaultType : g_colorType),
@@ -9521,15 +9550,16 @@ const loadingScoreInit = async () => {
9521
9550
  * 譜面番号の取得
9522
9551
  * @param {number} _scoreId
9523
9552
  * @param {boolean} _scoreLockFlg
9553
+ * @param {boolean} _useOne 1譜面目指定有無フラグ (初期色に関する箇所のみ指定)
9524
9554
  * @returns {number|string}
9525
9555
  */
9526
- const setScoreIdHeader = (_scoreId = 0, _scoreLockFlg = false) => {
9556
+ const setScoreIdHeader = (_scoreId = 0, _scoreLockFlg = false, _useOne = false) => {
9527
9557
  if (!_scoreLockFlg && _scoreId > 0) {
9528
9558
  return Number(_scoreId) + 1;
9529
9559
  } else if (_scoreLockFlg && g_headerObj.scoreNos?.[_scoreId] > 1) {
9530
9560
  return g_headerObj.scoreNos[_scoreId];
9531
9561
  }
9532
- return ``;
9562
+ return _useOne ? 1 : ``;
9533
9563
  };
9534
9564
 
9535
9565
  /**
@@ -9757,7 +9787,7 @@ const scoreConvert = (_dosObj, _scoreId, _preblankFrame, _dummyNo = ``,
9757
9787
  // 矢印群の格納先
9758
9788
  const obj = {};
9759
9789
 
9760
- const scoreIdHeader = setScoreIdHeader(_scoreId, g_stateObj.scoreLockFlg);
9790
+ const scoreIdHeader = setScoreIdHeader(_scoreId, g_stateObj.scoreLockFlg, false);
9761
9791
  const keyNum = g_keyObj[`${g_keyObj.defaultProp}${_keyCtrlPtn}`].length;
9762
9792
  obj.arrowData = [];
9763
9793
  obj.frzData = [];
@@ -11484,6 +11514,7 @@ const mainInit = () => {
11484
11514
  g_workObj.lastFadeFrame = fillArray(wordMaxLen);
11485
11515
  g_workObj.wordFadeFrame = fillArray(wordMaxLen);
11486
11516
  const mainCommonPos = { w: g_headerObj.playingWidth, h: g_posObj.arrowHeight };
11517
+ const objOpacity = g_stateObj.opacity / 100;
11487
11518
 
11488
11519
  // 背景スプライトを作成
11489
11520
  createMultipleSprite(`backSprite`, g_scoreObj.backMaxDepth, { x: g_workObj.backX });
@@ -11564,11 +11595,11 @@ const mainInit = () => {
11564
11595
  if (g_appearanceRanges.includes(g_stateObj.appearance)) {
11565
11596
  mainSprite.appendChild(createDivCss2Label(`filterView`, ``, g_lblPosObj.filterView));
11566
11597
  if (g_stateObj.d_filterline === C_FLG_ON) {
11567
- $id(`filterView`).opacity = g_stateObj.opacity / 100;
11598
+ $id(`filterView`).opacity = objOpacity;
11568
11599
  for (let j = 0; j < g_stateObj.layerNum; j++) {
11569
- $id(`filterBar${j}`).opacity = g_stateObj.opacity / 100;
11600
+ $id(`filterBar${j}`).opacity = objOpacity;
11570
11601
  if (doubleFilterFlg) {
11571
- $id(`filterBar${j}_HS`).opacity = g_stateObj.opacity / 100;
11602
+ $id(`filterBar${j}_HS`).opacity = objOpacity;
11572
11603
  }
11573
11604
  }
11574
11605
  }
@@ -11680,13 +11711,11 @@ const mainInit = () => {
11680
11711
 
11681
11712
  // ライフ(数字)部作成
11682
11713
  const intLifeVal = Math.floor(g_workObj.lifeVal);
11683
- let lblInitColor;
11714
+ let lblInitColor = g_cssObj.life_Failed;
11684
11715
  if (g_workObj.lifeVal === g_headerObj.maxLifeVal) {
11685
11716
  lblInitColor = g_cssObj.life_Max;
11686
11717
  } else if (g_workObj.lifeVal >= g_workObj.lifeBorder) {
11687
11718
  lblInitColor = g_cssObj.life_Cleared;
11688
- } else {
11689
- lblInitColor = g_cssObj.life_Failed;
11690
11719
  }
11691
11720
 
11692
11721
  // 曲名・アーティスト名、譜面名表示
@@ -11792,7 +11821,7 @@ const mainInit = () => {
11792
11821
  const charaJ = createDivCss2Label(`chara${jdg}`, ``, {
11793
11822
  x: jdgX[j], y: jdgY[j],
11794
11823
  w: g_limitObj.jdgCharaWidth, h: g_limitObj.jdgCharaHeight, siz: g_limitObj.jdgCharaSiz,
11795
- opacity: g_stateObj.opacity / 100, display: g_workObj.judgmentDisp,
11824
+ opacity: objOpacity, display: g_workObj.judgmentDisp,
11796
11825
  }, g_cssObj.common_ii);
11797
11826
  charaJ.setAttribute(`cnt`, 0);
11798
11827
 
@@ -11805,14 +11834,14 @@ const mainInit = () => {
11805
11834
  createDivCss2Label(`combo${jdg}`, ``, {
11806
11835
  x: jdgX[j] + 170, y: jdgY[j],
11807
11836
  w: g_limitObj.jdgCharaWidth, h: g_limitObj.jdgCharaHeight, siz: g_limitObj.jdgCharaSiz,
11808
- opacity: g_stateObj.opacity / 100, display: g_workObj.judgmentDisp,
11837
+ opacity: objOpacity, display: g_workObj.judgmentDisp,
11809
11838
  }, g_cssObj[`common_combo${jdg}`]),
11810
11839
 
11811
11840
  // Fast/Slow表示
11812
11841
  createDivCss2Label(`diff${jdg}`, ``, {
11813
11842
  x: jdgX[j] + 170, y: jdgY[j] + 25,
11814
11843
  w: g_limitObj.jdgCharaWidth, h: g_limitObj.jdgCharaHeight, siz: g_limitObj.mainSiz,
11815
- opacity: g_stateObj.opacity / 100, display: g_workObj.fastslowDisp,
11844
+ opacity: objOpacity, display: g_workObj.fastslowDisp,
11816
11845
  }, g_cssObj.common_combo),
11817
11846
 
11818
11847
  );
@@ -13622,7 +13651,7 @@ const resultInit = () => {
13622
13651
  } else {
13623
13652
  // ゲームオーバー時は失敗時のリザルトモーションを適用
13624
13653
  if (!g_finishFlg) {
13625
- const scoreIdHeader = setScoreIdHeader(g_stateObj.scoreId, g_stateObj.scoreLockFlg);
13654
+ const scoreIdHeader = setScoreIdHeader(g_stateObj.scoreId, g_stateObj.scoreLockFlg, false);
13626
13655
 
13627
13656
  g_animationData.forEach(sprite => {
13628
13657
  const failedData = g_rootObj[`${sprite}failedS${scoreIdHeader}_data`] ?? g_rootObj[`${sprite}failedS_data`];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "42.3.1",
3
+ "version": "42.4.0",
4
4
  "description": "Dancing☆Onigiri (CW Edition) - Web-based Rhythm Game",
5
5
  "main": "./js/danoni_main.js",
6
6
  "scripts": {