danoniplus 45.5.1 → 45.5.2

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 : 2026/03/06
7
+ * Revised : 2026/03/10
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 45.5.1`;
12
- const g_revisedDate = `2026/03/06`;
11
+ const g_version = `Ver 45.5.2`;
12
+ const g_revisedDate = `2026/03/10`;
13
13
 
14
14
  // カスタム用バージョン (danoni_custom.js 等で指定可)
15
15
  let g_localVersion = ``;
@@ -11763,7 +11763,7 @@ const getArrowSettings = () => {
11763
11763
  const changeStepRtn = (_name, _angle) =>
11764
11764
  g_workObj[_name] = g_workObj[_name].map(v => rotateBy(v, _angle));
11765
11765
 
11766
- if (g_stateObj.playWindow.endsWith(`SideScroll`)) {
11766
+ if (g_stateObj.playWindow === `SideScroll`) {
11767
11767
  if (g_stateObj.rotateEnabled) {
11768
11768
  const sign = g_stateObj.playWindowType === `Reverse` ? -1 : 1;
11769
11769
  changeStepRtn(`stepRtn`, 90 * sign);
@@ -12005,15 +12005,14 @@ const getArrowSettings = () => {
12005
12005
  const _copiedArray = structuredClone(_array);
12006
12006
  return _array.map((_val, _i) => _array[_i] = _copiedArray[randArray[_i]]);
12007
12007
  };
12008
- if (g_stateObj.camoufrage === `Arrow` || g_stateObj.camoufrage === C_FLG_ALL) {
12008
+ if ([`Arrow`, C_FLG_ALL].includes(g_stateObj.camoufrage)) {
12009
12009
 
12010
12010
  // 矢印ヒット時に元の矢印がわかるようにするため、あえて g_workObj.stepHitRtn はそのままにする
12011
12011
  g_workObj.stepRtn = getSwapArray(g_workObj.stepRtn);
12012
12012
  g_workObj.arrowRtn = getSwapArray(g_workObj.arrowRtn);
12013
12013
  }
12014
- eachOrAll.forEach(type => {
12015
- if (g_stateObj.camoufrage === `Color` || g_stateObj.camoufrage === C_FLG_ALL) {
12016
-
12014
+ if ([`Color`, C_FLG_ALL].includes(g_stateObj.camoufrage)) {
12015
+ eachOrAll.forEach(type => {
12017
12016
  // ダミー矢印は対象外
12018
12017
  g_workObj[`arrowColors${type}`] = getSwapArray(g_workObj[`arrowColors${type}`]);
12019
12018
  g_workObj[`arrowShadowColors${type}`] = getSwapArray(g_workObj[`arrowShadowColors${type}`]);
@@ -12023,23 +12022,19 @@ const getArrowSettings = () => {
12023
12022
  });
12024
12023
  g_workObj[`frzNormalShadowColors${type}`] = getSwapArray(g_workObj[`frzNormalShadowColors${type}`]);
12025
12024
  g_workObj[`frzHitShadowColors${type}`] = getSwapArray(g_workObj[`frzHitShadowColors${type}`]);
12026
- }
12027
- });
12025
+ });
12028
12026
 
12029
- // 位置変更用の配列に従い、個別・全体色変化の位置変更
12030
- if (g_stateObj.camoufrage === `Color` || g_stateObj.camoufrage === C_FLG_ALL) {
12027
+ // 位置変更用の配列に従い、個別・全体色変化の位置変更
12031
12028
  const getSwapList = (_array) => {
12032
12029
  const _copiedArray = structuredClone(_array);
12033
12030
  return _array.map((_val, _i) => _array[_i] = randArray[_copiedArray[_i]]);
12034
12031
  };
12035
- usedColorKeys.forEach(type => {
12036
- if (g_workObj[type] !== undefined) {
12037
- for (let j = 0; j < g_workObj[type].length; j++) {
12038
- if (g_workObj[type][j] === undefined) {
12039
- continue;
12040
- }
12041
- g_workObj[type][j] = getSwapList(g_workObj[type][j]);
12032
+ usedColorKeys.filter(type => g_workObj[type] !== undefined).forEach(type => {
12033
+ for (let j = 0; j < g_workObj[type].length; j++) {
12034
+ if (g_workObj[type][j] === undefined) {
12035
+ continue;
12042
12036
  }
12037
+ g_workObj[type][j] = getSwapList(g_workObj[type][j]);
12043
12038
  }
12044
12039
  });
12045
12040
  }
@@ -12238,7 +12233,7 @@ const mainInit = () => {
12238
12233
 
12239
12234
  // Hidden+, Sudden+用のライン、パーセント表示
12240
12235
  const filterCss = g_stateObj.filterLock === C_FLG_OFF ? g_cssObj.life_Failed : g_cssObj.life_Cleared;
12241
- const doubleFilterFlg = ![`Default`, `Halfway`].includes(g_stateObj.stepArea);
12236
+ const doubleFilterFlg = getDoubleFilterFlg();
12242
12237
 
12243
12238
  for (let j = 0; j < g_stateObj.layerNum; j++) {
12244
12239
  const mainSpriteJ = createEmptySprite(mainSprite, `mainSprite${j}`, mainCommonPos);
@@ -12300,6 +12295,10 @@ const mainInit = () => {
12300
12295
  }
12301
12296
  }
12302
12297
 
12298
+ // Appearanceのオプション適用時は一部描画を隠す
12299
+ changeAppearanceBar(g_appearanceRanges.includes(g_stateObj.appearance)
12300
+ ? g_hidSudObj.filterPos : g_hidSudObj.filterPosDefault[g_stateObj.appearance], 0);
12301
+
12303
12302
  // StepArea処理
12304
12303
  g_stepAreaFunc.get(g_stateObj.stepArea)();
12305
12304
 
@@ -12309,10 +12308,6 @@ const mainInit = () => {
12309
12308
  // EffectのArrowEffect追加処理
12310
12309
  g_effectFunc.get(g_stateObj.effect)();
12311
12310
 
12312
- // Appearanceのオプション適用時は一部描画を隠す
12313
- changeAppearanceBar(g_appearanceRanges.includes(g_stateObj.appearance)
12314
- ? g_hidSudObj.filterPos : g_hidSudObj.filterPosDefault[g_stateObj.appearance], 0);
12315
-
12316
12311
  // 現在の矢印・フリーズアローの速度、個別加算速度の初期化 (速度変化時に直す)
12317
12312
  g_workObj.currentSpeed = 2;
12318
12313
  g_workObj.boostSpd = 1;
@@ -13645,6 +13640,14 @@ const makeStepZone = (_j, _keyCtrlPtn) => {
13645
13640
  }
13646
13641
  };
13647
13642
 
13643
+ /**
13644
+ * フィルターバーが同一層で複数必要かを確認
13645
+ * @returns {boolean}
13646
+ */
13647
+ const getDoubleFilterFlg = () =>
13648
+ g_settings.stepAreaLayers.includes(g_stateObj.stepArea) ||
13649
+ (g_stateObj.stepArea === `Halfway` && g_stateObj.appearance === `Hid&Sud+`);
13650
+
13648
13651
  /**
13649
13652
  * フィルターバーの対象表示変更
13650
13653
  * @param {number} _num
@@ -13655,7 +13658,7 @@ const changeAppearanceBar = (_num = 10, _dirPlus = 2) => {
13655
13658
  const step = Math.trunc(_dirPlus / 2) * 2;
13656
13659
  g_workObj.aprFilterCnt = nextPos(g_workObj.aprFilterCnt, step, g_stateObj.layerNum);
13657
13660
  }
13658
- changeAppearanceFilter(_num);
13661
+ const doubleFilterFlg = changeAppearanceFilter(_num);
13659
13662
 
13660
13663
  // フィルターバーを使用するオプションのみ以下を適用
13661
13664
  if (g_appearanceRanges.includes(g_stateObj.appearance) && g_stateObj.d_filterline === C_FLG_ON) {
@@ -13669,13 +13672,13 @@ const changeAppearanceBar = (_num = 10, _dirPlus = 2) => {
13669
13672
  const displayState = (j === g_workObj.aprFilterCnt ? C_DIS_INHERIT : C_DIS_NONE);
13670
13673
  $id(`filterBar${type}`).display = displayState;
13671
13674
 
13672
- if (![`Default`, `Halfway`].includes(g_stateObj.stepArea)) {
13675
+ if (doubleFilterFlg) {
13673
13676
  $id(`filterBar${type}_HS`).display = displayState;
13674
13677
  }
13675
13678
  });
13676
13679
  }
13677
13680
 
13678
- // スクロールが1種類でHidden+/Sudden+の場合、対面のフィルターバーは不要なため非表示にする
13681
+ // フィルターバーの非表示条件
13679
13682
  const baseLayer = g_workObj.aprFilterCnt;
13680
13683
  const dividePosPart = g_workObj.dividePos.filter(v => Math.floor(v / 2) === g_workObj.aprFilterCnt / 2);
13681
13684
  const currentBarNum = g_hidSudObj.std[g_stateObj.appearance][
@@ -13684,12 +13687,17 @@ const changeAppearanceBar = (_num = 10, _dirPlus = 2) => {
13684
13687
  : g_stateObj.reverse
13685
13688
  ];
13686
13689
 
13687
- if (g_stateObj.appearance !== `Hid&Sud+`
13688
- && dividePosPart.length > 0
13690
+ if (dividePosPart.length > 0
13689
13691
  && dividePosPart.every(v => v % 2 === dividePosPart[0] % 2)) {
13690
- $id(`filterBar${(currentBarNum + 1) % 2 + baseLayer}`).display = C_DIS_NONE;
13691
- if (![`Default`, `Halfway`].includes(g_stateObj.stepArea)) {
13692
- $id(`filterBar${(currentBarNum + 1) % 2 + baseLayer}_HS`).display = C_DIS_NONE;
13692
+ if (g_stateObj.appearance !== `Hid&Sud+` || (g_stateObj.appearance === `Hid&Sud+` && g_stateObj.stepArea === `Halfway`)) {
13693
+ // スクロールが1種類の場合、対面のフィルターバーは不要なため非表示にする
13694
+ $id(`filterBar${(currentBarNum + 1) % 2 + baseLayer}`).display = C_DIS_NONE;
13695
+
13696
+ if (g_settings.stepAreaLayers.includes(g_stateObj.stepArea)) {
13697
+ $id(`filterBar${(currentBarNum + 1) % 2 + baseLayer}_HS`).display = C_DIS_NONE;
13698
+ } else if (g_stateObj.appearance === `Hid&Sud+` && g_stateObj.stepArea === `Halfway`) {
13699
+ $id(`filterBar${(currentBarNum) % 2 + baseLayer}_HS`).display = C_DIS_NONE;
13700
+ }
13693
13701
  }
13694
13702
  }
13695
13703
  }
@@ -13698,6 +13706,7 @@ const changeAppearanceBar = (_num = 10, _dirPlus = 2) => {
13698
13706
  /**
13699
13707
  * アルファマスクの再描画 (Appearance: Hidden+, Sudden+ 用)
13700
13708
  * @param {number} _num
13709
+ * @returns {boolean} フィルターバーを複数利用するかどうかのフラグ (changeAppearanceBarで利用)
13701
13710
  */
13702
13711
  const changeAppearanceFilter = (_num = 10) => {
13703
13712
  const MAX_FILTER_POS = 100;
@@ -13716,6 +13725,7 @@ const changeAppearanceFilter = (_num = 10) => {
13716
13725
  const appearPers = [_num, MAX_FILTER_POS - _num];
13717
13726
  const topDist = g_posObj.arrowHeight * appearPers[topNum] / MAX_FILTER_POS;
13718
13727
  const bottomDist = g_posObj.arrowHeight * appearPers[bottomNum] / MAX_FILTER_POS;
13728
+ const doubleFilterFlg = getDoubleFilterFlg();
13719
13729
 
13720
13730
  for (let j = 0; j < g_stateObj.layerNum; j += 2) {
13721
13731
  $id(`arrowSprite${topNum + j}`).clipPath = topShape;
@@ -13724,7 +13734,7 @@ const changeAppearanceFilter = (_num = 10) => {
13724
13734
  addTransform(`filterBar${topNum + j}`, `appearance`, `translateY(${parseFloat($id(`arrowSprite${j}`).top) + topDist}px)`, g_transPriority.layer);
13725
13735
  addTransform(`filterBar${bottomNum + j}`, `appearance`, `translateY(${parseFloat($id(`arrowSprite${j + 1}`).top) + bottomDist}px)`, g_transPriority.layer);
13726
13736
 
13727
- if (![`Default`, `Halfway`].includes(g_stateObj.stepArea)) {
13737
+ if (doubleFilterFlg) {
13728
13738
  addTransform(`filterBar${bottomNum + j}_HS`, `appearance`, `translateY(${parseFloat($id(`arrowSprite${j}`).top) + bottomDist}px)`, g_transPriority.layer);
13729
13739
  addTransform(`filterBar${topNum + j}_HS`, `appearance`, `translateY(${parseFloat($id(`arrowSprite${j + 1}`).top) + topDist}px)`, g_transPriority.layer);
13730
13740
  }
@@ -13741,6 +13751,8 @@ const changeAppearanceFilter = (_num = 10) => {
13741
13751
 
13742
13752
  // ユーザカスタムイベント(アルファマスクの再描画)
13743
13753
  g_customJsObj.appearanceFilter.forEach(func => func(topNum, bottomNum));
13754
+
13755
+ return doubleFilterFlg;
13744
13756
  };
13745
13757
 
13746
13758
  /**
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Source by tickle
7
7
  * Created : 2019/11/19
8
- * Revised : 2026/03/05 (v45.5.0)
8
+ * Revised : 2026/03/10 (v45.5.2)
9
9
  *
10
10
  * https://github.com/cwtickle/danoniplus
11
11
  */
@@ -1738,6 +1738,7 @@ const g_playWindowFunc = new Map([
1738
1738
  const g_arrowGroupSprite = [`stepSprite`, `arrowSprite`, `frzHitSprite`];
1739
1739
  const halfwayOffset = _j => (_j % 2 === 0 ? 1 : -1) * (g_headerObj.playingHeight / 2 - g_posObj.stepY + (g_posObj.stepYR - C_ARW_WIDTH) / 2);
1740
1740
  const getDirFromLayer = _j => (_j % 2 === 0 ? 1 : -1) * (_j < g_stateObj.layerNumDf ? 1 : -1);
1741
+ const getDirFromRev = () => g_stateObj.reverse === C_FLG_OFF ? 1 : -1;
1741
1742
  const g_stepAreaFunc = new Map([
1742
1743
  ['Default', () => ``],
1743
1744
  ['Halfway', () => {
@@ -1746,6 +1747,32 @@ const g_stepAreaFunc = new Map([
1746
1747
  addTransform(`${sprite}${j}`, `stepArea`, `translateY(${halfwayOffset(j)}px)`, g_transPriority.stepArea);
1747
1748
  }
1748
1749
  });
1750
+
1751
+ // Appearanceフィルターの差分適用
1752
+ if (g_appearanceRanges.includes(g_stateObj.appearance)) {
1753
+
1754
+ // Hidden+, Sudden+の場合はレイヤー毎に座標を画面中央から見てフィルターバーを外側へシフト
1755
+ for (let j = 0; j < g_stateObj.layerNumDf; j++) {
1756
+ addTransform(
1757
+ `filterBar${j}`, `stepArea`,
1758
+ `translateY(calc(${g_hidSudObj[g_stateObj.appearance] === 0 ? 1 : -1} * ${halfwayOffset(j)}px))`,
1759
+ g_transPriority.stepArea
1760
+ );
1761
+ }
1762
+
1763
+ // Hid&Sud+の場合は片側に2つのフィルターバーが必要なため、
1764
+ // 追加したフィルターバーを元のフィルターバーに対して反転するようにシフト
1765
+ if (g_stateObj.appearance === `Hid&Sud+`) {
1766
+ for (let j = 0; j < g_stateObj.layerNumDf; j++) {
1767
+ addTransform(
1768
+ `filterBar${j}_HS`, `stepArea`,
1769
+ `translateY(calc(${(-1) * (g_hidSudObj[g_stateObj.appearance] === 0 ? 1 : -1)} * ${halfwayOffset(j)}px))`,
1770
+ g_transPriority.stepArea
1771
+ );
1772
+ }
1773
+ }
1774
+ addTransform(`filterView`, `stepArea`, `translateY(${halfwayOffset(Number(g_settings.reverseNum))}px)`, g_transPriority.stepArea);
1775
+ }
1749
1776
  }],
1750
1777
  ['Mismatched', () => {
1751
1778
  for (let j = 0; j < g_stateObj.layerNum; j++) {
@@ -1757,6 +1784,27 @@ const g_stepAreaFunc = new Map([
1757
1784
  addTransform(`${sprite}${j}`, `stepArea`, `translateY(${halfwayOffset(j)}px)`, g_transPriority.stepArea);
1758
1785
  }
1759
1786
  });
1787
+
1788
+ // Appearanceフィルターの差分適用
1789
+ if (g_appearanceRanges.includes(g_stateObj.appearance)) {
1790
+ for (let j = 0; j < g_stateObj.layerNumDf; j++) {
1791
+ if (j % 2 === 0) {
1792
+ // Hidden+用のフィルターバー補正
1793
+ addTransform(
1794
+ `filterBar${j + Number(g_settings.reverseNum)}_HS`, `stepArea`,
1795
+ `translateY(calc((${getDirFromRev()}) * ${halfwayOffset(j)}px))`,
1796
+ g_transPriority.stepArea
1797
+ );
1798
+ } else {
1799
+ // Sudden+用のフィルターバー補正
1800
+ addTransform(
1801
+ `filterBar${j - Number(g_settings.reverseNum)}`, `stepArea`,
1802
+ `translateY(calc((${(-1) * getDirFromRev()}) * ${halfwayOffset(j)}px))`,
1803
+ g_transPriority.stepArea
1804
+ );
1805
+ }
1806
+ }
1807
+ }
1760
1808
  }
1761
1809
  }],
1762
1810
  ['R-Mismatched', () => {
@@ -1769,6 +1817,27 @@ const g_stepAreaFunc = new Map([
1769
1817
  addTransform(`${sprite}${j}`, `stepArea`, `translateY(${halfwayOffset(j)}px)`, g_transPriority.stepArea);
1770
1818
  }
1771
1819
  });
1820
+
1821
+ // Appearanceフィルターの差分適用
1822
+ if (g_appearanceRanges.includes(g_stateObj.appearance)) {
1823
+ for (let j = 0; j < g_stateObj.layerNumDf; j++) {
1824
+ if (j % 2 === 0) {
1825
+ // Hidden+用のフィルターバー補正
1826
+ addTransform(
1827
+ `filterBar${j + Number(g_settings.reverseNum)}`, `stepArea`,
1828
+ `translateY(calc((${getDirFromRev()}) * ${halfwayOffset(j)}px))`,
1829
+ g_transPriority.stepArea
1830
+ );
1831
+ } else {
1832
+ // Sudden+用のフィルターバー補正
1833
+ addTransform(
1834
+ `filterBar${j - Number(g_settings.reverseNum)}_HS`, `stepArea`,
1835
+ `translateY(calc((${(-1) * getDirFromRev()}) * ${halfwayOffset(j)}px))`,
1836
+ g_transPriority.stepArea
1837
+ );
1838
+ }
1839
+ }
1840
+ }
1772
1841
  }
1773
1842
  }],
1774
1843
  ['2Step', () => {
@@ -1777,6 +1846,27 @@ const g_stepAreaFunc = new Map([
1777
1846
  addTransform(`${sprite}${j}`, `stepArea`, `translateY(${halfwayOffset(j)}px)`, g_transPriority.stepArea);
1778
1847
  }
1779
1848
  });
1849
+
1850
+ // Appearanceフィルターの差分適用
1851
+ if (g_appearanceRanges.includes(g_stateObj.appearance)) {
1852
+ for (let j = 0; j < g_stateObj.layerNumDf; j++) {
1853
+ addTransform(
1854
+ `filterBar${j}_HS`, `stepArea`,
1855
+ `translateY(calc((${g_hidSudObj[g_stateObj.appearance] === 0 ? 1 : -1}) * ${halfwayOffset(j)}px))`,
1856
+ g_transPriority.stepArea
1857
+ );
1858
+ }
1859
+ if (g_stateObj.appearance === `Hid&Sud+`) {
1860
+ // 2Stepは逆方向スクロールが存在しないため、2つごとに設定
1861
+ for (let j = 0; j < g_stateObj.layerNumDf; j += 2) {
1862
+ addTransform(
1863
+ `filterBar${j + Number(g_settings.reverseNum)}_HS`, `stepArea`,
1864
+ `translateY(calc((${getDirFromRev()}) * ${halfwayOffset(j)}px))`,
1865
+ g_transPriority.stepArea
1866
+ );
1867
+ }
1868
+ }
1869
+ }
1780
1870
  }],
1781
1871
  ['X-Flower', () => {
1782
1872
  for (let j = 0; j < g_stateObj.layerNum; j++) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "45.5.1",
3
+ "version": "45.5.2",
4
4
  "description": "Dancing☆Onigiri (CW Edition) - Web-based Rhythm Game",
5
5
  "main": "./js/danoni_main.js",
6
6
  "scripts": {