danoniplus 35.5.0 → 36.0.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 : 2024/04/03
7
+ * Revised : 2024/04/15
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 35.5.0`;
12
- const g_revisedDate = `2024/04/03`;
11
+ const g_version = `Ver 36.0.0`;
12
+ const g_revisedDate = `2024/04/15`;
13
13
 
14
14
  // カスタム用バージョン (danoni_custom.js 等で指定可)
15
15
  let g_localVersion = ``;
@@ -247,6 +247,12 @@ const convertStrToVal = _str => {
247
247
  return convStrs;
248
248
  };
249
249
 
250
+ /**
251
+ * 半角スペース、タブを文字列から除去
252
+ * @param {string} _str
253
+ */
254
+ const trimStr = _str => _str?.split(`\t`).join(``).trimStart().trimEnd();
255
+
250
256
  /*-----------------------------------------------------------*/
251
257
  /* 値や配列のチェック・変換 */
252
258
  /*-----------------------------------------------------------*/
@@ -472,7 +478,7 @@ const fuzzyListMatching = (_str, _headerList, _footerList) =>
472
478
  */
473
479
  const replaceStr = (_str, _pairs) => {
474
480
  let tmpStr = _str;
475
- _pairs.forEach(pair => tmpStr = tmpStr.replaceAll(pair[0], pair[1]));
481
+ _pairs.forEach(pair => tmpStr = tmpStr?.replaceAll(pair[0], pair[1]));
476
482
  return tmpStr;
477
483
  };
478
484
 
@@ -1587,7 +1593,7 @@ const makeSpriteData = (_data, _calcFrame = _frame => _frame) => {
1587
1593
  let maxDepth = -1;
1588
1594
 
1589
1595
  splitLF(_data).filter(data => hasVal(data)).forEach(tmpData => {
1590
- const tmpSpriteData = tmpData.split(`,`);
1596
+ const tmpSpriteData = tmpData.split(`,`).map(val => trimStr(val));
1591
1597
 
1592
1598
  // 深度が"-"の場合はスキップ
1593
1599
  if (tmpSpriteData.length <= 1 || tmpSpriteData[1] === `-`) {
@@ -1671,7 +1677,7 @@ const makeSpriteData = (_data, _calcFrame = _frame => _frame) => {
1671
1677
  const makeStyleData = (_data, _calcFrame = _frame => _frame) => {
1672
1678
  const spriteData = [];
1673
1679
  splitLF(_data).filter(data => hasVal(data)).forEach(tmpData => {
1674
- const tmpSpriteData = tmpData.split(`,`);
1680
+ const tmpSpriteData = tmpData.split(`,`).map(val => trimStr(val));
1675
1681
 
1676
1682
  // カスタムプロパティの名称(--始まり)で無い場合はコメントと見做してスキップ
1677
1683
  if (tmpSpriteData.length <= 1 || !tmpSpriteData[1].startsWith(`--`)) {
@@ -7641,7 +7647,8 @@ const scoreConvert = (_dosObj, _scoreId, _preblankFrame, _dummyNo = ``,
7641
7647
  const colorCd = tmpColorData[k + 2];
7642
7648
 
7643
7649
  // フレーム数、色番号、カラーコード、全体色変化フラグをセットとして配列化
7644
- colorData.push([frame, colorNum, colorCd, allFlg]);
7650
+ // フリーズアローヒット時の個別色変化は互換のため全体色変化として扱う
7651
+ colorData.push([frame, colorNum, colorCd, isFrzHitColor(colorNum) && !allFlg ? true : allFlg]);
7645
7652
  }
7646
7653
  });
7647
7654
  return colorData.sort((_a, _b) => _a[0] - _b[0]);
@@ -7649,6 +7656,74 @@ const scoreConvert = (_dosObj, _scoreId, _preblankFrame, _dummyNo = ``,
7649
7656
  return [];
7650
7657
  };
7651
7658
 
7659
+ /**
7660
+ * 色変化データの分解・格納(新形式)
7661
+ * - 個別・全体色変化を一体で管理するため通常の配列で返却
7662
+ * @param {string} _header
7663
+ * @param {number} _scoreNo
7664
+ * @returns
7665
+ */
7666
+ const setColor2Data = (_header, _scoreNo) => {
7667
+ const dosColorData = getRefData(_header, `${_scoreNo}_data`);
7668
+ const colorData = {
7669
+ Arrow: [], ArrowShadow: [], Normal: [], NormalBar: [], NormalShadow: [],
7670
+ Hit: [], HitBar: [], HitShadow: [],
7671
+ };
7672
+
7673
+ if (hasVal(dosColorData) && g_stateObj.d_color === C_FLG_ON) {
7674
+
7675
+ splitLF(dosColorData).filter(data => hasVal(data)).forEach(tmpData => {
7676
+ const tmpColorData = tmpData.split(`,`).map(val => trimStr(val));
7677
+ if (!hasVal(tmpColorData[0]) || tmpColorData[1] === `-`) {
7678
+ return;
7679
+ }
7680
+ const frame = calcFrame(setVal(tmpColorData[0], ``, C_TYP_CALC));
7681
+ const colorCd = tmpColorData[2];
7682
+
7683
+ // 色変化対象の取得
7684
+ const pos = tmpColorData[1]?.indexOf(`:`);
7685
+ const patternStr = pos > 0 ? [trimStr(tmpColorData[1].substring(0, pos)), trimStr(tmpColorData[1].substring(pos + 1))]
7686
+ : [tmpColorData[1]];
7687
+ const patterns = replaceStr(trimStr(patternStr[1]), g_escapeStr.colorPatternName)?.split(`/`) || [`Arrow`];
7688
+
7689
+ // 矢印番号の組み立て
7690
+ const colorVals = [];
7691
+ replaceStr(patternStr[0], g_escapeStr.targetPatternName)?.split(`/`)?.forEach(val => {
7692
+ if (val.startsWith('g')) {
7693
+ // g付きの場合は矢印グループから対象の矢印番号を検索
7694
+ const groupVal = setIntVal(val.slice(1));
7695
+ for (let j = 0; j < keyNum; j++) {
7696
+ if (g_keyObj[`color${_keyCtrlPtn}`][j] === groupVal) {
7697
+ colorVals.push(j);
7698
+ }
7699
+ }
7700
+ } else if (val.indexOf(`...`) > 0) {
7701
+ // 範囲指定表記の補完 例. 0...3 -> 0/1/2/3
7702
+ const [valMin, valMax] = [val.split(`...`)[0], val.split(`...`)[1]].map(val => setIntVal(val));
7703
+ for (let k = valMin; k <= valMax; k++) {
7704
+ colorVals.push(setIntVal(k));
7705
+ }
7706
+ } else {
7707
+ colorVals.push(setIntVal(val));
7708
+ }
7709
+ });
7710
+
7711
+ // フレーム数、色番号、カラーコード、全体色変化フラグ、変更対象をセットとして配列化し、色変化対象ごとのプロパティへ追加
7712
+ patterns.forEach(pattern => {
7713
+ try {
7714
+ colorVals.forEach(val => colorData[pattern].push([frame, val, colorCd, hasVal(tmpColorData[3]), pattern]));
7715
+ } catch (error) {
7716
+ makeWarningWindow(g_msgInfoObj.E_0201.split(`{0}`).join(pattern));
7717
+ }
7718
+ });
7719
+ });
7720
+ // 色変化対象ごとにフレーム数をキーにソートしてフラット化
7721
+ Object.keys(colorData).forEach(pattern =>
7722
+ colorData[pattern] = colorData[pattern].sort((_a, _b) => _a[0] - _b[0]).flat());
7723
+ }
7724
+ return colorData;
7725
+ };
7726
+
7652
7727
  /**
7653
7728
  * 矢印モーションデータの分解・格納(フレーム数, 矢印番号)
7654
7729
  * @param {string} _header
@@ -7802,7 +7877,7 @@ const scoreConvert = (_dosObj, _scoreId, _preblankFrame, _dummyNo = ``,
7802
7877
  }
7803
7878
 
7804
7879
  tmpArrayData.filter(data => hasVal(data)).forEach(tmpData => {
7805
- const tmpWordData = tmpData.split(`,`);
7880
+ const tmpWordData = tmpData.split(`,`).map(val => trimStr(val));
7806
7881
  for (let k = 0; k < tmpWordData.length; k += 3) {
7807
7882
  if (!hasVal(tmpWordData[k])) {
7808
7883
  continue;
@@ -7881,6 +7956,11 @@ const scoreConvert = (_dosObj, _scoreId, _preblankFrame, _dummyNo = ``,
7881
7956
  obj[`${sprite}DummyData`] = setColorData(sprite, _dummyNo);
7882
7957
  }
7883
7958
  });
7959
+ // 色変化(新形式)の分解(3~4つで1セット, セット毎の改行区切り)
7960
+ obj.ncolorData = setColor2Data(`ncolor`, scoreIdHeader);
7961
+ if (g_stateObj.dummyId !== ``) {
7962
+ obj.ncolorDummyData = setColor2Data(`ncolor`, _dummyNo);
7963
+ }
7884
7964
 
7885
7965
  if (_scoreAnalyzeFlg) {
7886
7966
  return obj;
@@ -8263,17 +8343,17 @@ const pushArrows = (_dataObj, _speedOnFrame, _motionOnFrame, _firstArrivalFrame)
8263
8343
  * @param {object} obj _colorFlg: 個別色変化フラグ, _calcFrameFlg: 逆算を無条件で行うかどうかの可否
8264
8344
  */
8265
8345
  const calcDataTiming = (_type, _header, _setFunc = _ => true,
8266
- { _term = 4, _colorFlg = false, _calcFrameFlg = false } = {}) => {
8346
+ { _term = 4, _colorFlg = false, _calcFrameFlg = false, _propName = `` } = {}) => {
8267
8347
 
8268
8348
  const camelHeader = _header === `` ? _type : `${_header}${toCapitalize(_type)}`;
8269
- const baseData = _dataObj[`${camelHeader}Data`];
8349
+ const baseData = hasVal(_propName) ? _dataObj[`${camelHeader}Data`][_propName] : _dataObj[`${camelHeader}Data`];
8270
8350
 
8271
8351
  if (!hasArrayList(baseData, _term)) {
8272
8352
  return;
8273
8353
  }
8274
8354
  const frontData = [];
8275
8355
  for (let k = baseData.length - _term; k >= 0; k -= _term) {
8276
- const calcFrameFlg = (_colorFlg && !isFrzHitColor(baseData[k + 1]) && !baseData[k + 3]) || _calcFrameFlg;
8356
+ const calcFrameFlg = (_colorFlg && !baseData[k + 3]) || _calcFrameFlg;
8277
8357
 
8278
8358
  if (baseData[k] < g_scoreObj.frameNum) {
8279
8359
  // フェードイン直前にある色変化・モーションデータ・スクロール反転データを取得して格納
@@ -8362,7 +8442,13 @@ const pushArrows = (_dataObj, _speedOnFrame, _motionOnFrame, _firstArrivalFrame)
8362
8442
  };
8363
8443
 
8364
8444
  // 個別・全体色変化、モーションデータ・スクロール反転データのタイミング更新
8365
- [``, `dummy`].forEach(type => calcDataTiming(`color`, type, pushColors, { _colorFlg: true }));
8445
+ [``, `dummy`].forEach(type => {
8446
+ calcDataTiming(`color`, type, pushColors, { _colorFlg: true });
8447
+ if (_dataObj[`ncolor${type}Data`] !== undefined) {
8448
+ Object.keys(_dataObj[`ncolor${type}Data`]).forEach(pattern =>
8449
+ calcDataTiming(`ncolor`, type, pushColors, { _term: 5, _colorFlg: true, _propName: pattern }));
8450
+ }
8451
+ });
8366
8452
 
8367
8453
  g_typeLists.arrow.forEach(header =>
8368
8454
  calcDataTiming(`cssMotion`, header, pushCssMotions, { _calcFrameFlg: true }));
@@ -8463,7 +8549,7 @@ const convertReplaceNums = _ => {
8463
8549
  * @param {string} _colorCd
8464
8550
  * @param {string} _allFlg
8465
8551
  */
8466
- const pushColors = (_header, _frame, _val, _colorCd, _allFlg) => {
8552
+ const pushColors = (_header, _frame, _val, _colorCd, _allFlg, _pattern = ``) => {
8467
8553
 
8468
8554
  const tkObj = getKeyInfo();
8469
8555
  const grdFlg = (g_colorType === `Type0` ? !g_headerObj.defaultColorgrd[0] : g_headerObj.defaultColorgrd[0]);
@@ -8491,62 +8577,93 @@ const pushColors = (_header, _frame, _val, _colorCd, _allFlg) => {
8491
8577
  g_workObj[`${_baseStr}Cd`][_frame]?.push(colorCd) || (g_workObj[`${_baseStr}Cd`][_frame] = [colorCd]);
8492
8578
  };
8493
8579
 
8494
- if (_val < 30 || _val >= 1000) {
8495
- const baseHeaders = [`mk${_header}Color`];
8496
- allUseTypes.push(`Arrow`);
8497
-
8498
- // フリーズアロー色の追随設定がある場合、対象を追加
8499
- g_headerObj.frzScopeFromArrowColors.forEach(type =>
8500
- baseHeaders.push(`mk${_header}FColor${type}`, `mk${_header}FColor${type}Bar`));
8501
- if (g_headerObj.frzScopeFromArrowColors.length > 0) {
8580
+ /**
8581
+ * 色変化データ(ncolor_data)の格納処理
8582
+ */
8583
+ const executePushColors = () => {
8584
+ const baseHeaders = [];
8585
+ if (_pattern.startsWith(`Arrow`)) {
8586
+ baseHeaders.push(`mk${_header}Color${_pattern.slice('Arrow'.length)}`);
8587
+ allUseTypes.push(`Arrow`);
8588
+
8589
+ // フリーズアロー色の追随設定がある場合、対象を追加
8590
+ if (_pattern === `Arrow`) {
8591
+ g_headerObj.frzScopeFromArrowColors.forEach(type =>
8592
+ baseHeaders.push(`mk${_header}FColor${type}`, `mk${_header}FColor${type}Bar`));
8593
+ if (g_headerObj.frzScopeFromArrowColors.length > 0) {
8594
+ allUseTypes.push(`Frz`);
8595
+ }
8596
+ }
8597
+ } else {
8598
+ baseHeaders.push(`mk${_header}FColor${_pattern}`);
8502
8599
  allUseTypes.push(`Frz`);
8503
8600
  }
8601
+ // 色変化情報の格納
8602
+ baseHeaders.forEach(baseHeader => pushColor(baseHeader, g_workObj.replaceNums[_val] + addAll));
8603
+ };
8504
8604
 
8505
- // 矢印の色変化 (追随指定時はフリーズアローも色変化)
8506
- baseHeaders.forEach(baseHeader => {
8507
- if (_val < 20 || _val >= 1000) {
8508
- pushColor(baseHeader, g_workObj.replaceNums[_val % 1000] + addAll);
8509
- } else if (_val >= 20) {
8510
- const colorNum = _val - 20;
8511
- for (let j = 0; j < tkObj.keyNum; j++) {
8512
- if (g_keyObj[`color${tkObj.keyCtrlPtn}`][j] === colorNum) {
8513
- pushColor(baseHeader, j + addAll);
8605
+ /**
8606
+ * 従来の色変化データ派生(color_data, acolor_data)の格納処理
8607
+ */
8608
+ const executePushColorsOld = () => {
8609
+
8610
+ if (_val < 30 || _val >= 1000) {
8611
+ const baseHeaders = [`mk${_header}Color`];
8612
+ allUseTypes.push(`Arrow`);
8613
+
8614
+ // フリーズアロー色の追随設定がある場合、対象を追加
8615
+ g_headerObj.frzScopeFromArrowColors.forEach(type =>
8616
+ baseHeaders.push(`mk${_header}FColor${type}`, `mk${_header}FColor${type}Bar`));
8617
+ if (g_headerObj.frzScopeFromArrowColors.length > 0) {
8618
+ allUseTypes.push(`Frz`);
8619
+ }
8620
+
8621
+ // 矢印の色変化 (追随指定時はフリーズアローも色変化)
8622
+ baseHeaders.forEach(baseHeader => {
8623
+ if (_val < 20 || _val >= 1000) {
8624
+ pushColor(baseHeader, g_workObj.replaceNums[_val % 1000] + addAll);
8625
+ } else if (_val >= 20) {
8626
+ const colorNum = _val - 20;
8627
+ for (let j = 0; j < tkObj.keyNum; j++) {
8628
+ if (g_keyObj[`color${tkObj.keyCtrlPtn}`][j] === colorNum) {
8629
+ pushColor(baseHeader, j + addAll);
8630
+ }
8514
8631
  }
8515
8632
  }
8516
- }
8517
- });
8633
+ });
8518
8634
 
8519
- } else {
8520
- const baseHeader = `mk${_header}FColor`;
8521
- allUseTypes.push(`Frz`);
8522
-
8523
- // フリーズアローの色変化
8524
- const tmpVals = [];
8525
- if (_val < 50) {
8526
- tmpVals.push(_val % 30);
8527
- } else if (_val < 60) {
8528
- tmpVals.push((_val % 50) * 2, (_val % 50) * 2 + 1);
8529
8635
  } else {
8530
- if (_val === 60) {
8531
- tmpVals.push(...Array(8).keys());
8636
+ const baseHeader = `mk${_header}FColor`;
8637
+ allUseTypes.push(`Frz`);
8638
+
8639
+ // フリーズアローの色変化
8640
+ const tmpVals = [];
8641
+ if (_val < 50) {
8642
+ tmpVals.push(_val % 30);
8643
+ } else if (_val < 60) {
8644
+ tmpVals.push((_val % 50) * 2, (_val % 50) * 2 + 1);
8532
8645
  } else {
8533
- tmpVals.push(...[...Array(8).keys()].map(j => j + 10));
8646
+ if (_val === 60) {
8647
+ tmpVals.push(...Array(8).keys());
8648
+ } else {
8649
+ tmpVals.push(...[...Array(8).keys()].map(j => j + 10));
8650
+ }
8534
8651
  }
8535
- }
8536
- tmpVals.forEach(targetj => {
8652
+ tmpVals.forEach(targetj => {
8537
8653
 
8538
- // targetj=0,2,4,6,8 ⇒ Arrow, 1,3,5,7,9 ⇒ Bar
8539
- const ctype = (targetj >= 10 ? `Hit` : `Normal`) + (targetj % 2 === 0 ? `` : `Bar`);
8540
- const colorPos = Math.ceil((targetj % 10 - 1) / 2);
8654
+ // targetj=0,2,4,6,8 ⇒ Arrow, 1,3,5,7,9 ⇒ Bar
8655
+ const ctype = (targetj >= 10 ? `Hit` : `Normal`) + (targetj % 2 === 0 ? `` : `Bar`);
8656
+ const colorPos = Math.ceil((targetj % 10 - 1) / 2);
8541
8657
 
8542
- g_keyObj[`color${tkObj.keyCtrlPtn}`].forEach((cpattern, k) => {
8543
- if (colorPos === cpattern) {
8544
- pushColor(baseHeader + ctype, k + addAll);
8545
- }
8658
+ g_keyObj[`color${tkObj.keyCtrlPtn}`].forEach((cpattern, k) => {
8659
+ if (colorPos === cpattern) {
8660
+ pushColor(baseHeader + ctype, k + addAll);
8661
+ }
8662
+ });
8546
8663
  });
8547
- });
8548
- }
8549
-
8664
+ }
8665
+ };
8666
+ hasVal(_pattern) ? executePushColors() : executePushColorsOld();
8550
8667
  enabledAll(...allUseTypes);
8551
8668
  };
8552
8669
 
@@ -8661,13 +8778,11 @@ const getArrowSettings = _ => {
8661
8778
  g_workObj.judgFrzHitCnt = [...Array(keyNum)].fill(1);
8662
8779
  g_judgObj.lockFlgs = [...Array(keyNum)].fill(false);
8663
8780
 
8664
- // TODO: この部分を矢印塗りつぶし部分についても適用できるように変数を作成
8665
-
8666
8781
  // 矢印色管理 (個別・全体)
8667
8782
  const eachOrAll = [``, `All`];
8668
8783
  eachOrAll.forEach(type => {
8669
- g_workObj[`arrowColors${type}`] = [];
8670
- g_workObj[`dummyArrowColors${type}`] = [];
8784
+ [`arrow`, `dummyArrow`].forEach(arrowType =>
8785
+ g_typeLists.arrowColor.forEach(objType => g_workObj[`${arrowType}${objType}Colors${type}`] = []));
8671
8786
 
8672
8787
  [`frz`, `dummyFrz`].forEach(arrowType =>
8673
8788
  g_typeLists.frzColor.forEach(frzType => g_workObj[`${arrowType}${frzType}Colors${type}`] = []));
@@ -8692,16 +8807,18 @@ const getArrowSettings = _ => {
8692
8807
  g_workObj.dividePos[j] = ((posj <= divideCnt ? 0 : 1) + (scrollDirOptions[j] === 1 ? 0 : 1) + (g_stateObj.reverse === C_FLG_OFF ? 0 : 1)) % 2;
8693
8808
  g_workObj.scrollDir[j] = (posj <= divideCnt ? 1 : -1) * scrollDirOptions[j] * (g_stateObj.reverse === C_FLG_OFF ? 1 : -1);
8694
8809
 
8695
- // TODO: この部分を矢印塗りつぶし部分についても適用できるように変数を作成
8696
-
8697
8810
  eachOrAll.forEach(type => {
8698
8811
  g_workObj[`arrowColors${type}`][j] = g_headerObj.setColor[colorj];
8699
8812
  g_workObj[`dummyArrowColors${type}`][j] = g_headerObj.setDummyColor[colorj];
8813
+ g_workObj[`arrowShadowColors${type}`][j] = g_headerObj.setShadowColor[colorj] || ``;
8814
+ g_workObj[`dummyArrowShadowColors${type}`][j] = g_headerObj.setDummyColor[colorj] || ``;
8700
8815
 
8701
8816
  g_typeLists.frzColor.forEach((frzType, k) => {
8702
- g_workObj[`frz${frzType}Colors${type}`][j] = g_headerObj.frzColor[colorj][k];
8817
+ g_workObj[`frz${frzType}Colors${type}`][j] = g_headerObj.frzColor[colorj][k] || ``;
8703
8818
  g_workObj[`dummyFrz${frzType}Colors${type}`][j] = g_headerObj.setDummyColor[colorj];
8704
8819
  });
8820
+ g_workObj[`frzNormalShadowColors${type}`][j] = g_headerObj.frzShadowColor[colorj][0] || ``;
8821
+ g_workObj[`frzHitShadowColors${type}`][j] = g_headerObj.frzShadowColor[colorj][1] || ``;
8705
8822
  });
8706
8823
  }
8707
8824
  g_workObj.scrollDirDefault = g_workObj.scrollDir.concat();
@@ -9342,13 +9459,30 @@ const mainInit = _ => {
9342
9459
  */
9343
9460
  const changeArrowColor = (_j, _k, _name) => {
9344
9461
  if (g_workObj[`mk${toCapitalize(_name)}ColorChangeAll`][g_scoreObj.frameNum]) {
9345
- const colorSelf = g_workObj[`${_name}Colors`][_j];
9346
- const colorAll = g_workObj[`${_name}ColorsAll`][_j];
9462
+
9463
+ /**
9464
+ * 全体色の変更処理
9465
+ * - 次の全体色変化対象の色と比較して一致した場合に色を変更
9466
+ * @param {string} _type
9467
+ * @param {element} _baseObj
9468
+ */
9469
+ const changeColor = (_type, _baseObj) => {
9470
+ const cArrowColor = g_workObj[`${_name}${_type}Colors`][_j];
9471
+ const cArrowColorAll = g_workObj[`${_name}${_type}ColorsAll`][_j];
9472
+ if (_baseObj.getAttribute(`color`) !== cArrowColor && cArrowColorAll === cArrowColor) {
9473
+ _baseObj.style.background = cArrowColorAll;
9474
+ _baseObj.setAttribute(`color`, cArrowColorAll);
9475
+ }
9476
+ };
9477
+
9478
+ // 矢印枠の色変化
9347
9479
  const arrowTop = document.getElementById(`${_name}Top${_j}_${_k}`);
9480
+ changeColor(``, arrowTop);
9348
9481
 
9349
- if (arrowTop.getAttribute(`color`) !== colorSelf && colorAll === colorSelf) {
9350
- arrowTop.style.background = colorAll;
9351
- arrowTop.setAttribute(`color`, colorAll);
9482
+ // 矢印塗りつぶし部分の色変化
9483
+ if (g_headerObj.setShadowColor[0] !== ``) {
9484
+ const arrowShadow = document.getElementById(`${_name}Shadow${_j}_${_k}`);
9485
+ changeColor(`Shadow`, arrowShadow);
9352
9486
  }
9353
9487
  }
9354
9488
  };
@@ -9363,30 +9497,39 @@ const mainInit = _ => {
9363
9497
  const changeFrzColor = (_j, _k, _name, _state) => {
9364
9498
 
9365
9499
  if (g_workObj[`mk${toCapitalize(_name)}ColorChangeAll`][g_scoreObj.frameNum]) {
9366
- const frzTop = document.getElementById(`${_name}Top${_j}_${_k}`);
9367
- const frzBar = document.getElementById(`${_name}Bar${_j}_${_k}`);
9368
- const frzBtm = document.getElementById(`${_name}Btm${_j}_${_k}`);
9369
- const frzName = `${_name}${_state}`;
9500
+ const frzNo = `${_j}_${_k}`;
9501
+ const frzTop = document.getElementById(`${_name}Top${frzNo}`);
9502
+ const frzBar = document.getElementById(`${_name}Bar${frzNo}`);
9503
+ const frzBtm = document.getElementById(`${_name}Btm${frzNo}`);
9504
+ const frzTopShadow = document.getElementById(`${_name}TopShadow${frzNo}`);
9505
+ const frzBtmShadow = document.getElementById(`${_name}BtmShadow${frzNo}`);
9370
9506
 
9371
- // 矢印部分の色変化
9372
- if (frzBtm.getAttribute(`color`) !== g_workObj[`${frzName}Colors`][_j]) {
9373
- const toColorCode = g_workObj[`${frzName}ColorsAll`][_j];
9374
- if (g_workObj[`${frzName}Colors`][_j] === toColorCode) {
9375
- if (_state === `Normal`) {
9376
- frzTop.style.background = toColorCode;
9507
+ /**
9508
+ * 全体色の変更処理
9509
+ * @param {string} _type
9510
+ * @param {element} _baseObj
9511
+ * @param {element} _baseObj2
9512
+ */
9513
+ const changeColor = (_type, _baseObj, _baseObj2) => {
9514
+ const cFrzColor = g_workObj[`${_name}${_state}${_type}Colors`][_j];
9515
+ const cFrzColorAll = g_workObj[`${_name}${_state}${_type}ColorsAll`][_j];
9516
+ if (_baseObj.getAttribute(`color${_state}`) !== cFrzColor && cFrzColorAll === cFrzColor) {
9517
+ if (_baseObj2 && _state === `Normal`) {
9518
+ _baseObj2.style.background = cFrzColorAll;
9377
9519
  }
9378
- frzBtm.style.background = toColorCode;
9379
- frzBtm.setAttribute(`color`, toColorCode);
9520
+ _baseObj.style.background = cFrzColorAll;
9521
+ _baseObj.setAttribute(`color${_state}`, cFrzColorAll);
9380
9522
  }
9381
- }
9523
+ };
9524
+
9525
+ // 矢印部分の色変化
9526
+ changeColor(``, frzBtm, frzTop);
9527
+
9382
9528
  // 帯部分の色変化
9383
- if (frzBar.getAttribute(`color`) !== g_workObj[`${frzName}BarColors`][_j]) {
9384
- const toBarColorCode = g_workObj[`${frzName}BarColorsAll`][_j];
9385
- if (g_workObj[`${frzName}BarColors`][_j] === toBarColorCode) {
9386
- frzBar.style.background = toBarColorCode;
9387
- frzBar.setAttribute(`color`, toBarColorCode);
9388
- }
9389
- }
9529
+ changeColor(`Bar`, frzBar);
9530
+
9531
+ // 矢印塗りつぶし部分の色変化
9532
+ changeColor(`Shadow`, frzBtmShadow, frzTopShadow);
9390
9533
  }
9391
9534
  };
9392
9535
 
@@ -9610,8 +9753,9 @@ const mainInit = _ => {
9610
9753
  * @param {number} _arrowCnt 現在の判定矢印順
9611
9754
  * @param {string} _name 矢印名
9612
9755
  * @param {string} _color 矢印色
9756
+ * @param {string} _shadowColor 矢印塗りつぶし部分の色
9613
9757
  */
9614
- const makeArrow = (_j, _arrowCnt, _name, _color) => {
9758
+ const makeArrow = (_j, _arrowCnt, _name, _color, _shadowColor) => {
9615
9759
  const dividePos = g_workObj.dividePos[_j];
9616
9760
  const colorPos = g_keyObj[`color${keyCtrlPtn}`][_j];
9617
9761
 
@@ -9630,6 +9774,7 @@ const mainInit = _ => {
9630
9774
  dir: g_workObj.scrollDir[_j], boostDir: g_workObj.boostDir,
9631
9775
  prevY: firstPosY, y: firstPosY,
9632
9776
  };
9777
+ g_typeLists.arrowColor.forEach(val => g_attrObj[arrowName][`Arrow${val}`] = g_workObj[`${_name}${val}Colors`][_j]);
9633
9778
  arrowSprite[dividePos].appendChild(stepRoot);
9634
9779
 
9635
9780
  if (g_workObj[`${_name}CssMotions`][_j] !== ``) {
@@ -9644,9 +9789,10 @@ const mainInit = _ => {
9644
9789
  if (g_headerObj.setShadowColor[colorPos] !== ``) {
9645
9790
  // 矢印の塗り部分
9646
9791
  const arrShadow = createColorObject2(`${_name}Shadow${_j}_${_arrowCnt}`, {
9647
- background: getShadowColor(colorPos, _color), rotate: g_workObj.arrowRtn[_j], styleName: `Shadow`,
9792
+ background: _shadowColor === `Default` ? _color : _shadowColor,
9793
+ rotate: g_workObj.arrowRtn[_j], styleName: `Shadow`,
9648
9794
  });
9649
- if (g_headerObj.setShadowColor[colorPos] === `Default`) {
9795
+ if (_shadowColor === `Default`) {
9650
9796
  arrShadow.style.opacity = 0.5;
9651
9797
  }
9652
9798
  stepRoot.appendChild(arrShadow);
@@ -9690,8 +9836,9 @@ const mainInit = _ => {
9690
9836
  * @param {string} _name
9691
9837
  * @param {string} _normalColor
9692
9838
  * @param {string} _barColor
9839
+ * @param {string} _shadowColor
9693
9840
  */
9694
- const makeFrzArrow = (_j, _arrowCnt, _name, _normalColor, _barColor) => {
9841
+ const makeFrzArrow = (_j, _arrowCnt, _name, _normalColor, _barColor, _shadowColor) => {
9695
9842
  const dividePos = g_workObj.dividePos[_j];
9696
9843
  const frzNo = `${_j}_${_arrowCnt}`;
9697
9844
  const frzName = `${_name}${frzNo}`;
@@ -9710,19 +9857,15 @@ const mainInit = _ => {
9710
9857
  boostSpd: g_workObj.boostSpd, dividePos: dividePos, dir: g_workObj.scrollDir[_j], boostDir: g_workObj.boostDir,
9711
9858
  y: firstPosY, barY: C_ARW_WIDTH / 2 - firstBarLength * dividePos, btmY: firstBarLength * g_workObj.scrollDir[_j],
9712
9859
  };
9860
+ g_typeLists.frzColor.forEach(val => g_attrObj[frzName][val] = g_workObj[`${_name}${val}Colors`][_j]);
9861
+
9713
9862
  arrowSprite[dividePos].appendChild(frzRoot);
9714
9863
 
9715
9864
  if (g_workObj[`${_name}CssMotions`][_j] !== ``) {
9716
9865
  frzRoot.classList.add(g_workObj[`${_name}CssMotions`][_j]);
9717
9866
  frzRoot.style.animationDuration = `${g_workObj.arrivalFrame[g_scoreObj.frameNum] / g_fps}s`;
9718
9867
  }
9719
-
9720
- const colorPos = g_keyObj[`color${keyCtrlPtn}`][_j];
9721
- let shadowColor = ``;
9722
- if (g_headerObj.frzShadowColor[colorPos][0] !== ``) {
9723
- shadowColor = (g_headerObj.frzShadowColor[colorPos][0] === `Default` ?
9724
- _normalColor : g_headerObj.frzShadowColor[colorPos][0]);
9725
- }
9868
+ let shadowColor = _shadowColor === `Default` ? _normalColor : _shadowColor;
9726
9869
 
9727
9870
  // フリーズアローは、下記の順で作成する。
9728
9871
  // 後に作成するほど前面に表示される。
@@ -9886,8 +10029,9 @@ const mainInit = _ => {
9886
10029
  const headerU = toCapitalize(header);
9887
10030
 
9888
10031
  // 個別・全体色変化 (矢印)
9889
- changeColors(g_workObj[`mk${headerU}Color`][currentFrame],
9890
- g_workObj[`mk${headerU}ColorCd`][currentFrame], header, `arrow`);
10032
+ g_typeLists.arrowColor.forEach(ctype =>
10033
+ changeColors(g_workObj[`mk${headerU}Color${ctype}`][currentFrame],
10034
+ g_workObj[`mk${headerU}Color${ctype}Cd`][currentFrame], header, `arrow${ctype}`));
9891
10035
 
9892
10036
  // 個別・全体色変化(フリーズアロー)
9893
10037
  g_typeLists.frzColor.forEach(ctype =>
@@ -9916,19 +10060,21 @@ const mainInit = _ => {
9916
10060
 
9917
10061
  // ダミー矢印生成(背面に表示するため先に処理)
9918
10062
  g_workObj.mkDummyArrow[currentFrame]?.forEach(data =>
9919
- makeArrow(data, ++dummyArrowCnts[data], `dummyArrow`, g_workObj.dummyArrowColors[data]));
10063
+ makeArrow(data, ++dummyArrowCnts[data], `dummyArrow`, g_workObj.dummyArrowColors[data], g_workObj.dummyArrowShadowColors[data]));
9920
10064
 
9921
10065
  // 矢印生成
9922
10066
  g_workObj.mkArrow[currentFrame]?.forEach(data =>
9923
- makeArrow(data, ++arrowCnts[data], `arrow`, g_workObj.arrowColors[data]));
10067
+ makeArrow(data, ++arrowCnts[data], `arrow`, g_workObj.arrowColors[data], g_workObj.arrowShadowColors[data]));
9924
10068
 
9925
10069
  // ダミーフリーズアロー生成
9926
10070
  g_workObj.mkDummyFrzArrow[currentFrame]?.forEach(data =>
9927
- makeFrzArrow(data, ++dummyFrzCnts[data], `dummyFrz`, g_workObj.dummyFrzNormalColors[data], g_workObj.dummyFrzNormalBarColors[data]));
10071
+ makeFrzArrow(data, ++dummyFrzCnts[data], `dummyFrz`, g_workObj.dummyFrzNormalColors[data],
10072
+ _workObj.dummyFrzNormalBarColors[data], g_workObj.dummyFrzNormalShadowColors[data]));
9928
10073
 
9929
10074
  // フリーズアロー生成
9930
10075
  g_workObj.mkFrzArrow[currentFrame]?.forEach(data =>
9931
- makeFrzArrow(data, ++frzCnts[data], `frz`, g_workObj.frzNormalColors[data], g_workObj.frzNormalBarColors[data]));
10076
+ makeFrzArrow(data, ++frzCnts[data], `frz`, g_workObj.frzNormalColors[data],
10077
+ g_workObj.frzNormalBarColors[data], g_workObj.frzNormalShadowColors[data]));
9932
10078
 
9933
10079
  // 矢印・フリーズアロー移動&消去
9934
10080
  for (let j = 0; j < keyNum; j++) {
@@ -10148,8 +10294,6 @@ const appearKeyTypes = (_j, _target) => {
10148
10294
  }
10149
10295
  };
10150
10296
 
10151
- // TODO: この部分を矢印塗りつぶし部分についても適用できるように関数を見直し
10152
-
10153
10297
  /**
10154
10298
  * 個別・全体色変化
10155
10299
  * @param {array} _mkColor
@@ -10230,7 +10374,6 @@ const changeHitFrz = (_j, _k, _name, _difFrame = 0) => {
10230
10374
  const styfrzBtm = $id(`${_name}Btm${frzNo}`);
10231
10375
  const styfrzTopShadow = $id(`${_name}TopShadow${frzNo}`);
10232
10376
  const styfrzBtmShadow = $id(`${_name}BtmShadow${frzNo}`);
10233
- const colorPos = g_keyObj[`color${g_keyObj.currentKey}_${g_keyObj.currentPtn}`][_j];
10234
10377
 
10235
10378
  // フリーズアロー位置の修正(ステップゾーン上に来るように)
10236
10379
  const delFrzLength = parseFloat($id(`stepRoot${_j}`).top) - currentFrz.y;
@@ -10256,10 +10399,8 @@ const changeHitFrz = (_j, _k, _name, _difFrame = 0) => {
10256
10399
  styfrzTopShadow.opacity = 0;
10257
10400
  styfrzBtmShadow.top = styfrzBtm.top;
10258
10401
  if (_name === `frz`) {
10259
- if (g_headerObj.frzShadowColor[colorPos][1] !== ``) {
10260
- styfrzBtmShadow.background = (g_headerObj.frzShadowColor[colorPos][1] === `Default` ?
10261
- g_workObj.frzHitColors[_j] : g_headerObj.frzShadowColor[colorPos][1]);
10262
- }
10402
+ styfrzBtmShadow.background = g_workObj[`${_name}HitShadowColors`][_j] === `Default` ?
10403
+ g_workObj[`${_name}HitColors`][_j] : g_workObj[`${_name}HitShadowColors`][_j];
10263
10404
  $id(`frzHit${_j}`).opacity = 0.9;
10264
10405
  $id(`frzTop${frzNo}`).display = C_DIS_NONE;
10265
10406
  if (isNaN(parseFloat(g_workObj.arrowRtn[_j]))) {
@@ -10281,6 +10422,8 @@ const changeFailedFrz = (_j, _k) => {
10281
10422
  $id(`frzTop${frzNo}`).display = C_DIS_INHERIT;
10282
10423
  $id(`frzTop${frzNo}`).background = `#cccccc`;
10283
10424
  $id(`frzTopShadow${frzNo}`).opacity = 1;
10425
+ $id(`frzTopShadow${frzNo}`).background = `#333333`;
10426
+ $id(`frzBtmShadow${frzNo}`).background = `#333333`;
10284
10427
  $id(`frzBar${frzNo}`).background = `#999999`;
10285
10428
  $id(`frzBar${frzNo}`).opacity = 1;
10286
10429
  $id(`frzBtm${frzNo}`).background = `#cccccc`;
@@ -10289,12 +10432,6 @@ const changeFailedFrz = (_j, _k) => {
10289
10432
  const hitPos = g_workObj.hitPosition * g_workObj.scrollDir[_j];
10290
10433
  $id(`frzTop${frzNo}`).top = wUnit(- hitPos);
10291
10434
  $id(`frzTopShadow${frzNo}`).top = wUnit(- hitPos);
10292
-
10293
- const colorPos = g_keyObj[`color${g_keyObj.currentKey}_${g_keyObj.currentPtn}`][_j];
10294
- if (g_headerObj.frzShadowColor[colorPos][0] !== ``) {
10295
- $id(`frzTopShadow${frzNo}`).background = `#333333`;
10296
- $id(`frzBtmShadow${frzNo}`).background = `#333333`;
10297
- }
10298
10435
  };
10299
10436
 
10300
10437
  /**
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Source by tickle
7
7
  * Created : 2019/11/19
8
- * Revised : 2024/04/03 (v35.5.0)
8
+ * Revised : 2024/04/15 (v36.0.0)
9
9
  *
10
10
  * https://github.com/cwtickle/danoniplus
11
11
  */
@@ -616,12 +616,15 @@ let g_imgExtensions = [`png`, `gif`, `bmp`, `jpg`, `jpeg`, `svg`];
616
616
  const g_typeLists = {
617
617
  arrow: [`arrow`, `dummyArrow`, `frz`, `dummyFrz`],
618
618
  color: [`color`, `acolor`],
619
- frzColor: [`Normal`, `NormalBar`, `Hit`, `HitBar`],
619
+ arrowColor: [``, `Shadow`],
620
+ frzColor: [`Normal`, `NormalBar`, `Hit`, `HitBar`, `NormalShadow`, `HitShadow`],
620
621
  dataList: [
621
622
  `Arrow`, `FrzArrow`, `FrzLength`,
622
- `Color`, `ColorCd`, `ScrollchArrow`, `ScrollchStep`, `ScrollchArrowDir`, `ScrollchStepDir`,
623
+ `Color`, `ColorCd`, `ColorShadow`, `ColorShadowCd`, `ScrollchArrow`, `ScrollchStep`, `ScrollchArrowDir`, `ScrollchStepDir`,
623
624
  `FColorNormal`, `FColorNormalCd`, `FColorNormalBar`, `FColorNormalBarCd`,
625
+ `FColorNormalShadow`, `FColorNormalShadowCd`,
624
626
  `FColorHit`, `FColorHitCd`, `FColorHitBar`, `FColorHitBarCd`,
627
+ `FColorHitShadow`, `FColorHitShadowCd`,
625
628
  `ArrowCssMotion`, `ArrowCssMotionName`,
626
629
  `FrzCssMotion`, `FrzCssMotionName`,
627
630
  `ArrowColorChangeAll`, `FrzColorChangeAll`,
@@ -675,6 +678,19 @@ const g_escapeStr = {
675
678
  [`Quote`, `Ja-Colon`], [`BracketLeft`, `Ja-@`], [`BracketRight`, `Ja-[`],
676
679
  [`Backslash`, `Ja-]`], [`Equal`, `Ja-^`],
677
680
  ],
681
+ colorPatternName: [
682
+ [`AR`, `Arrow`], [`AS`, `ArrowShadow`],
683
+ [`NA`, `Normal`], [`NB`, `NormalBar`], [`NS`, `NormalShadow`],
684
+ [`HA`, `Hit`], [`HB`, `HitBar`], [`HS`, `HitShadow`],
685
+ [`FN`, `Normal/NormalBar`], [`FH`, `Hit/HitBar`], [`FS`, `NormalShadow/HitShadow`],
686
+ [`AF`, `Arrow/Normal/NormalBar/Hit/HitBar`],
687
+ [`FrzNormal`, `Normal/NormalBar`], [`FrzHit`, `Hit/HitBar`],
688
+ [`FrzShadow`, `NormalShadow/HitShadow`],
689
+ [`Frz`, `Normal/NormalBar/Hit/HitBar`],
690
+ ],
691
+ targetPatternName: [
692
+ [`all`, `g0/g1/g2/g3/g4`],
693
+ ],
678
694
  };
679
695
 
680
696
  /** 設定・オプション画面用共通 */
@@ -2740,6 +2756,8 @@ const g_lang_msgInfoObj = {
2740
2756
  E_0104: `新しいキー:{0}の[keyCtrl]が未定義です。(E-0104)<br>
2741
2757
  |keyCtrl{0}=75,79,76,80,187,32/0|`,
2742
2758
 
2759
+ E_0201: `色変化データで指定した色変化対象が存在しません。[pattern={0}] (E-0201)`,
2760
+
2743
2761
  I_0001: `リザルトデータをクリップボードにコピーしました!`,
2744
2762
  I_0002: `入力したキーは割り当てできません。他のキーを指定してください。`,
2745
2763
  I_0003: `各譜面の明細情報をクリップボードにコピーしました!`,
@@ -2787,6 +2805,8 @@ const g_lang_msgInfoObj = {
2787
2805
  E_0104: `New key: {0} [keyCtrl] is not set. (E-0104)<br>
2788
2806
  |keyCtrl{0}=75,79,76,80,187,32/0|`,
2789
2807
 
2808
+ E_0201: `The color change target specified in the color change data does not exist. [pattern={0}] (E-0201)`,
2809
+
2790
2810
  I_0001: `Your result data is copied to the clipboard!`,
2791
2811
  I_0002: `The specified key cannot be assigned. Please specify another key.`,
2792
2812
  I_0003: `Charts information is copied to the clipboard!`,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "35.5.0",
3
+ "version": "36.0.0",
4
4
  "description": "Dancing☆Onigiri (CW Edition) - Web-based Rhythm Game",
5
5
  "main": "index.js",
6
6
  "scripts": {