danoniplus 45.1.0 → 45.2.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 : 2026/02/26
7
+ * Revised : 2026/02/27
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 45.1.0`;
12
- const g_revisedDate = `2026/02/26`;
11
+ const g_version = `Ver 45.2.0`;
12
+ const g_revisedDate = `2026/02/27`;
13
13
 
14
14
  // カスタム用バージョン (danoni_custom.js 等で指定可)
15
15
  let g_localVersion = ``;
@@ -1692,7 +1692,7 @@ const createMultipleSprite = (_baseName, _num, { x = 0, priority = g_transPriori
1692
1692
  for (let j = 0; j <= _num; j++) {
1693
1693
  createEmptySprite(sprite, `${_baseName}${j}`);
1694
1694
  }
1695
- addX(_baseName, `root`, x, { priority });
1695
+ addTransform(_baseName, `root`, `translateX(${x}px)`, priority);
1696
1696
  return sprite;
1697
1697
  };
1698
1698
 
@@ -5010,6 +5010,12 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList?.split(`,`)
5010
5010
  // キーの最小横幅 (minWidthX)
5011
5011
  g_keyObj[`minWidth${newKey}`] = _dosObj[`minWidth${newKey}`] ?? g_keyObj[`minWidth${newKey}`] ?? g_keyObj.minWidthDefault;
5012
5012
 
5013
+ // 移動ロック (movLockX)
5014
+ g_keyObj[`movLock${newKey}`] = setBoolVal(_dosObj[`movLock${newKey}`] ?? g_keyObj[`movLock${newKey}`], false);
5015
+
5016
+ // 位置マニュアル化 (initManualX)
5017
+ g_keyObj[`initManual${newKey}`] = setBoolVal(_dosObj[`initManual${newKey}`] ?? g_keyObj[`initManual${newKey}`], false);
5018
+
5013
5019
  // キーコンフィグ (keyCtrlX_Y)
5014
5020
  g_keyObj.minPatterns = newKeyMultiParam(newKey, `keyCtrl`, toKeyCtrlArray, {
5015
5021
  errCd: `E_0104`, baseCopyFlg: true,
@@ -11954,6 +11960,13 @@ const getArrowSettings = () => {
11954
11960
  // AppearanceFilterの可視範囲設定
11955
11961
  g_workObj.aprFilterCnt = 0;
11956
11962
 
11963
+ // 位置をマニュアルで設定する際は矢印の初期位置をゼロにする
11964
+ if (g_keyObj[`initManual${g_keyObj.currentKey}`] !== undefined && g_keyObj[`initManual${g_keyObj.currentKey}`]) {
11965
+ g_workObj.stepX = fillArray(g_workObj.stepX.length, 0);
11966
+ }
11967
+ g_workObj.movLockEnabled = g_keyObj[`movLock${g_keyObj.currentKey}`] === true ? `movLock` : `default`;
11968
+ g_workObj.initManualEnabled = g_keyObj[`initManual${g_keyObj.currentKey}`] === true ? `manual` : `auto`;
11969
+
11957
11970
  if (g_stateObj.dataSaveFlg) {
11958
11971
  // ローカルストレージへAdjustment, HitPosition, Volume設定を保存
11959
11972
  // 変更が確定した時点で表示用のキャッシュを解放
@@ -12085,15 +12098,15 @@ const mainInit = () => {
12085
12098
  }
12086
12099
 
12087
12100
  addTransform(`mainSprite`, `root`, `scale(${g_workObj.scale})`, g_transPriority.scale);
12088
- addXY(`mainSprite`, `root`, g_workObj.playingX, g_posObj.stepY - C_STEP_Y + g_headerObj.playingY, { priority: g_transPriority.base });
12101
+ addTransform(`mainSprite`, `main`, `translateX(${g_workObj.playingX}px) translateY(${g_posObj.stepY - C_STEP_Y + g_headerObj.playingY}px)`, g_transPriority.base);
12089
12102
 
12090
12103
  // 曲情報・判定カウント用スプライトを作成(メインスプライトより上位)
12091
12104
  const infoSprite = createEmptySprite(divRoot, `infoSprite`, mainCommonPos);
12092
- addXY(`infoSprite`, `root`, g_workObj.playingX, g_headerObj.playingY, { priority: g_transPriority.base });
12105
+ addTransform(`infoSprite`, `main`, `translateX(${g_workObj.playingX}px) translateY(${g_headerObj.playingY}px)`, g_transPriority.base);
12093
12106
 
12094
12107
  // 判定系スプライトを作成(メインスプライトより上位)
12095
12108
  const judgeSprite = createEmptySprite(divRoot, `judgeSprite`, mainCommonPos);
12096
- addXY(`judgeSprite`, `root`, g_workObj.playingX, g_headerObj.playingY, { priority: g_transPriority.base });
12109
+ addTransform(`judgeSprite`, `main`, `translateX(${g_workObj.playingX}px) translateY(${g_headerObj.playingY}px)`, g_transPriority.base);
12097
12110
  const tkObj = getKeyInfo();
12098
12111
  const [keyCtrlPtn, keyNum] = [tkObj.keyCtrlPtn, tkObj.keyNum];
12099
12112
 
@@ -12208,11 +12221,6 @@ const mainInit = () => {
12208
12221
  changeAppearanceBar(g_appearanceRanges.includes(g_stateObj.appearance)
12209
12222
  ? g_hidSudObj.filterPos : g_hidSudObj.filterPosDefault[g_stateObj.appearance], 0);
12210
12223
 
12211
- // Shaking初期化
12212
- if (g_stateObj.shaking !== C_FLG_OFF) {
12213
- addXY(`mainSprite`, `shaking`, 0, 0, { priority: g_transPriority.shaking });
12214
- }
12215
-
12216
12224
  // 現在の矢印・フリーズアローの速度、個別加算速度の初期化 (速度変化時に直す)
12217
12225
  g_workObj.currentSpeed = 2;
12218
12226
  g_workObj.boostSpd = 1;
@@ -12886,9 +12894,9 @@ const mainInit = () => {
12886
12894
  const colorPos = g_keyObj[`color${keyCtrlPtn}`][_j];
12887
12895
 
12888
12896
  const arrowName = `${_name}${_j}_${_arrowCnt}`;
12889
- const firstPosY = C_STEP_Y + g_posObj.reverseStepY * dividePos +
12890
- (_attrs.initY * g_workObj.boostSpd +
12891
- _attrs.initBoostY * g_workObj.boostDir) * g_workObj.scrollDir[_j];
12897
+ const stepY = C_STEP_Y + g_posObj.reverseStepY * dividePos;
12898
+ const firstPosY = stepY + (_attrs.initY * g_workObj.boostSpd +
12899
+ _attrs.initBoostY * g_workObj.boostDir) * g_workObj.scrollDir[_j];
12892
12900
 
12893
12901
  const arrowRoot = createEmptySprite(arrowSprite[g_workObj.dividePos[_j]], arrowName, {
12894
12902
  x: g_workObj.stepX[_j], y: 0, w: C_ARW_WIDTH, h: C_ARW_WIDTH,
@@ -12914,7 +12922,7 @@ const mainInit = () => {
12914
12922
  // 現フレーム時の位置
12915
12923
  y: firstPosY,
12916
12924
  };
12917
- addTransform(arrowName, `root`, `translateY(${wUnit(firstPosY)})`);
12925
+ setArrowY.get(`${g_workObj.movLockEnabled}_${g_workObj.initManualEnabled}`)(arrowName, firstPosY, stepY);
12918
12926
 
12919
12927
  // 矢印色の設定
12920
12928
  // - 枠/塗りつぶし色: g_attrObj[arrowName].Arrow / ArrowShadow
@@ -12970,7 +12978,7 @@ const mainInit = () => {
12970
12978
  currentArrow.prevY = currentArrow.y;
12971
12979
  currentArrow.y -= (g_workObj.currentSpeed * currentArrow.boostSpd +
12972
12980
  (g_workObj.motionOnFrames[boostCnt] || 0) * currentArrow.boostDir) * currentArrow.dir;
12973
- addTransform(arrowName, `root`, `translateY(${wUnit(currentArrow.y)})`);
12981
+ movArrowY.get(g_workObj.movLockEnabled)(arrowName, currentArrow.y);
12974
12982
  g_motionAlphaFunc.get(g_stateObj.motion)(arrowName, currentArrow);
12975
12983
  currentArrow.boostCnt--;
12976
12984
  }
@@ -12994,9 +13002,9 @@ const mainInit = () => {
12994
13002
  const dividePos = g_workObj.dividePos[_j] % 2;
12995
13003
  const frzNo = `${_j}_${_arrowCnt}`;
12996
13004
  const frzName = `${_name}${frzNo}`;
12997
- const firstPosY = C_STEP_Y + g_posObj.reverseStepY * dividePos +
12998
- (_attrs.initY * g_workObj.boostSpd +
12999
- _attrs.initBoostY * g_workObj.boostDir) * g_workObj.scrollDir[_j];
13005
+ const stepY = C_STEP_Y + g_posObj.reverseStepY * dividePos;
13006
+ const firstPosY = stepY + (_attrs.initY * g_workObj.boostSpd +
13007
+ _attrs.initBoostY * g_workObj.boostDir) * g_workObj.scrollDir[_j];
13000
13008
  const firstBarLength = g_workObj[`mk${toCapitalize(_name)}Length`][_j][(_arrowCnt - 1) * 2] * g_workObj.boostSpd;
13001
13009
 
13002
13010
  const frzRoot = createEmptySprite(arrowSprite[g_workObj.dividePos[_j]], frzName, {
@@ -13033,7 +13041,7 @@ const mainInit = () => {
13033
13041
  // フリーズアロー(対矢印)の相対位置
13034
13042
  btmY: firstBarLength * g_workObj.scrollDir[_j],
13035
13043
  };
13036
- addTransform(frzName, `root`, `translateY(${wUnit(firstPosY)})`);
13044
+ setArrowY.get(`${g_workObj.movLockEnabled}_${g_workObj.initManualEnabled}`)(frzName, firstPosY, stepY);
13037
13045
 
13038
13046
  // フリーズアロー色の設定
13039
13047
  // - 通常時 (矢印枠/矢印塗りつぶし/帯): g_attrObj[frzName].Normal / NormalShadow / NormalBar
@@ -13127,7 +13135,7 @@ const mainInit = () => {
13127
13135
  if (g_workObj.currentSpeed !== 0) {
13128
13136
  currentFrz.prevY = currentFrz.y;
13129
13137
  currentFrz.y -= movY + (g_workObj.motionOnFrames[currentFrz.boostCnt] || 0) * currentFrz.dir * currentFrz.boostDir;
13130
- addTransform(frzName, `root`, `translateY(${wUnit(currentFrz.y)})`);
13138
+ movArrowY.get(g_workObj.movLockEnabled)(frzName, currentFrz.y);
13131
13139
  g_motionAlphaFunc.get(g_stateObj.motion)(frzName, currentFrz);
13132
13140
  currentFrz.boostCnt--;
13133
13141
  }
@@ -13167,7 +13175,7 @@ const mainInit = () => {
13167
13175
  currentFrz.frzBarLength -= movY * currentFrz.dir;
13168
13176
  if (currentFrz.frzBarLength > 0) {
13169
13177
  currentFrz.y -= movY;
13170
- addTransform(frzName, `root`, `translateY(${wUnit(currentFrz.y)})`);
13178
+ movArrowY.get(g_workObj.movLockEnabled)(frzName, currentFrz.y);
13171
13179
  } else {
13172
13180
  judgeObjDelete[_name](_j, frzName);
13173
13181
  }
@@ -13432,6 +13440,28 @@ const mainInit = () => {
13432
13440
  g_timeoutEvtId = setTimeout(flowTimeline, 1000 / g_fps);
13433
13441
  };
13434
13442
 
13443
+ /**
13444
+ * 矢印・フリーズアローの初期位置
13445
+ * - movLock_manual: スクロールなし/初期位置マニュアル
13446
+ * - movLock_auto: スクロールなし/初期位置自動
13447
+ * - default_manual: スクロールあり/初期位置マニュアル(設定上ありえないがdefault_autoと同じにしておく)
13448
+ * - default_auto: スクロールあり/初期位置自動
13449
+ */
13450
+ const setArrowY = new Map([
13451
+ [`movLock_manual`, (_name, _startY, _stepY) => { }],
13452
+ [`movLock_auto`, (_name, _startY, _stepY) => addTransform(_name, `root`, `translateY(${wUnit(_stepY)})`)],
13453
+ [`default_manual`, (_name, _startY, _stepY) => addTransform(_name, `root`, `translateY(${wUnit(_startY)})`)],
13454
+ [`default_auto`, (_name, _startY, _stepY) => addTransform(_name, `root`, `translateY(${wUnit(_startY)})`)],
13455
+ ]);
13456
+
13457
+ /**
13458
+ * 矢印・フリーズアローの移動処理
13459
+ */
13460
+ const movArrowY = new Map([
13461
+ [`movLock`, (_name, _y) => { }],
13462
+ [`default`, (_name, _y) => addTransform(_name, `root`, `translateY(${wUnit(_y)})`)],
13463
+ ]);
13464
+
13435
13465
  /**
13436
13466
  * ステップゾーン、フリーズアローヒット部分の生成
13437
13467
  * @param {number} _j
@@ -13580,20 +13610,20 @@ const changeAppearanceFilter = (_num = 10) => {
13580
13610
  $id(`arrowSprite${topNum + j}`).clipPath = topShape;
13581
13611
  $id(`arrowSprite${bottomNum + j}`).clipPath = bottomShape;
13582
13612
 
13583
- addY(`filterBar${topNum + j}`, `appearance`, parseFloat($id(`arrowSprite${j}`).top) + topDist, { priority: g_transPriority.layer });
13584
- addY(`filterBar${bottomNum + j}`, `appearance`, parseFloat($id(`arrowSprite${j + 1}`).top) + bottomDist, { priority: g_transPriority.layer });
13613
+ addTransform(`filterBar${topNum + j}`, `appearance`, `translateY(${parseFloat($id(`arrowSprite${j}`).top) + topDist}px)`, g_transPriority.layer);
13614
+ addTransform(`filterBar${bottomNum + j}`, `appearance`, `translateY(${parseFloat($id(`arrowSprite${j + 1}`).top) + bottomDist}px)`, g_transPriority.layer);
13585
13615
 
13586
13616
  if (![`Default`, `Halfway`].includes(g_stateObj.stepArea)) {
13587
- addY(`filterBar${bottomNum + j}_HS`, `appearance`, parseFloat($id(`arrowSprite${j}`).top) + bottomDist, { priority: g_transPriority.layer });
13588
- addY(`filterBar${topNum + j}_HS`, `appearance`, parseFloat($id(`arrowSprite${j + 1}`).top) + topDist, { priority: g_transPriority.layer });
13617
+ addTransform(`filterBar${bottomNum + j}_HS`, `appearance`, `translateY(${parseFloat($id(`arrowSprite${j}`).top) + bottomDist}px)`, g_transPriority.layer);
13618
+ addTransform(`filterBar${topNum + j}_HS`, `appearance`, `translateY(${parseFloat($id(`arrowSprite${j + 1}`).top) + topDist}px)`, g_transPriority.layer);
13589
13619
  }
13590
13620
  }
13591
13621
 
13592
13622
  // フィルターバーのパーセント表示(フィルターバーが複数表示されるなど複雑なため、最初の階層グループの位置に追従)
13593
13623
  if (g_appearanceRanges.includes(g_stateObj.appearance)) {
13594
13624
  const currentBarNum = g_hidSudObj.std[g_stateObj.appearance][g_stateObj.reverse];
13595
- addY(`filterView`, `appearance`, parseFloat($id(`arrowSprite${currentBarNum % 2}`).top) +
13596
- (currentBarNum % 2 === 0 ? bottomDist : topDist), { priority: g_transPriority.layer });
13625
+ addTransform(`filterView`, `appearance`, `translateY(${parseFloat($id(`arrowSprite${currentBarNum % 2}`).top) +
13626
+ (currentBarNum % 2 === 0 ? bottomDist : topDist)}px)`, g_transPriority.layer);
13597
13627
  filterView.textContent = `${_num}%`;
13598
13628
  g_hidSudObj.filterPos = _num;
13599
13629
  }
@@ -13848,7 +13878,7 @@ const changeHitFrz = (_j, _k, _name, _difFrame = 0) => {
13848
13878
  currentFrz.btmY -= delFrzLength + delFrzMotionLength + hitPos;
13849
13879
  currentFrz.y += delFrzLength;
13850
13880
  currentFrz.isMoving = false;
13851
- addTransform(frzName, `root`, `translateY(${wUnit(currentFrz.y)})`);
13881
+ movArrowY.get(g_workObj.movLockEnabled)(frzName, currentFrz.y);
13852
13882
 
13853
13883
  /**
13854
13884
  * フリーズアロー(ヒット時)の色変更
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Source by tickle
7
7
  * Created : 2019/11/19
8
- * Revised : 2026/02/26 (v45.1.0)
8
+ * Revised : 2026/02/27 (v45.1.1)
9
9
  *
10
10
  * https://github.com/cwtickle/danoniplus
11
11
  */
@@ -1727,7 +1727,7 @@ const g_stepAreaFunc = new Map([
1727
1727
  ['Halfway', () => {
1728
1728
  g_arrowGroupSprite.forEach(sprite => {
1729
1729
  for (let j = 0; j < g_stateObj.layerNum; j++) {
1730
- addY(`${sprite}${j}`, `stepArea`, halfwayOffset(j));
1730
+ addTransform(`${sprite}${j}`, `stepArea`, `translateY(${halfwayOffset(j)}px)`, g_transPriority.stepArea);
1731
1731
  }
1732
1732
  });
1733
1733
  }],
@@ -1738,7 +1738,7 @@ const g_stepAreaFunc = new Map([
1738
1738
  if (g_workObj.orgFlatFlg) {
1739
1739
  g_arrowGroupSprite.forEach(sprite => {
1740
1740
  for (let j = g_stateObj.layerNumDf; j < g_stateObj.layerNum; j++) {
1741
- addY(`${sprite}${j}`, `stepArea`, halfwayOffset(j));
1741
+ addTransform(`${sprite}${j}`, `stepArea`, `translateY(${halfwayOffset(j)}px)`, g_transPriority.stepArea);
1742
1742
  }
1743
1743
  });
1744
1744
  }
@@ -1750,7 +1750,7 @@ const g_stepAreaFunc = new Map([
1750
1750
  if (g_workObj.orgFlatFlg) {
1751
1751
  g_arrowGroupSprite.forEach(sprite => {
1752
1752
  for (let j = 0; j < g_stateObj.layerNumDf; j++) {
1753
- addY(`${sprite}${j}`, `stepArea`, halfwayOffset(j));
1753
+ addTransform(`${sprite}${j}`, `stepArea`, `translateY(${halfwayOffset(j)}px)`, g_transPriority.stepArea);
1754
1754
  }
1755
1755
  });
1756
1756
  }
@@ -1758,7 +1758,7 @@ const g_stepAreaFunc = new Map([
1758
1758
  ['2Step', () => {
1759
1759
  g_arrowGroupSprite.forEach(sprite => {
1760
1760
  for (let j = g_stateObj.layerNumDf; j < g_stateObj.layerNum; j++) {
1761
- addY(`${sprite}${j}`, `stepArea`, halfwayOffset(j));
1761
+ addTransform(`${sprite}${j}`, `stepArea`, `translateY(${halfwayOffset(j)}px)`, g_transPriority.stepArea);
1762
1762
  }
1763
1763
  });
1764
1764
  }],
@@ -1781,36 +1781,37 @@ const g_stepAreaFunc = new Map([
1781
1781
  const getShakingDist = () => (Math.abs((g_scoreObj.baseFrame / 2) % 100 - 50) - 25);
1782
1782
  const g_shakingFunc = new Map([
1783
1783
  ['OFF', () => true],
1784
- ['Horizontal', () => addX(`mainSprite`, `shaking`, getShakingDist())],
1785
- ['Vertical', () => addY(`mainSprite`, `shaking`, getShakingDist() / 2)],
1784
+ ['Horizontal', () => addTransform(`mainSprite`, `shakingX`, `translateX(${getShakingDist()}px)`, g_transPriority.shaking)],
1785
+ ['Vertical', () => addTransform(`mainSprite`, `shakingY`, `translateY(${getShakingDist() / 2}px)`, g_transPriority.shaking)],
1786
1786
  ['X-Horizontal', () => {
1787
1787
  for (let j = 0; j < g_stateObj.layerNum; j++) {
1788
- addX(`mainSprite${j}`, `shaking`, getDirFromLayer(j) * (4 / 3) * getShakingDist());
1788
+ addTransform(`mainSprite${j}`, `shakingX`, `translateX(${getDirFromLayer(j) * (4 / 3) * getShakingDist()}px)`, g_transPriority.shaking);
1789
1789
  }
1790
1790
  }],
1791
1791
  ['X-Vertical', () => {
1792
1792
  for (let j = 0; j < g_stateObj.layerNum; j++) {
1793
- addY(`mainSprite${j}`, `shaking`, getDirFromLayer(j) * getShakingDist());
1793
+ addTransform(`mainSprite${j}`, `shakingY`, `translateY(${getDirFromLayer(j) * getShakingDist()}px)`, g_transPriority.shaking);
1794
1794
  }
1795
1795
  }],
1796
1796
  ['Drunk', () => {
1797
- const shakeX = g_posXs.mainSprite?.get(`shaking`) ?? 0;
1798
- const shakeY = g_posYs.mainSprite?.get(`shaking`) ?? 0;
1797
+ // Drunkは揺れの軸が途中で変わるため、基準位置取得のためにmainSpriteのみaddX, addYを使用
1798
+ const shakeX = g_posXs.mainSprite?.get(`shakingX`) ?? 0;
1799
+ const shakeY = g_posYs.mainSprite?.get(`shakingY`) ?? 0;
1799
1800
  if (shakeX === 0 && shakeY === 0) {
1800
1801
  g_workObj.drunkXFlg = Math.random() < 0.5;
1801
1802
  g_workObj.drunkYFlg = Math.random() < 0.5;
1802
1803
  }
1803
1804
  if (g_workObj.drunkXFlg) {
1804
1805
  const deltaX = getShakingDist();
1805
- addX(`mainSprite`, `shaking`, deltaX);
1806
- addX(`infoSprite`, `shaking`, deltaX);
1807
- addX(`judgeSprite`, `shaking`, deltaX);
1806
+ addX(`mainSprite`, `shakingX`, deltaX, { priority: g_transPriority.shaking });
1807
+ addTransform(`infoSprite`, `shakingX`, `translateX(${deltaX}px)`, g_transPriority.shaking);
1808
+ addTransform(`judgeSprite`, `shakingX`, `translateX(${deltaX}px)`, g_transPriority.shaking);
1808
1809
  }
1809
1810
  if (g_workObj.drunkYFlg) {
1810
1811
  const deltaY = getShakingDist() / 2;
1811
- addY(`mainSprite`, `shaking`, deltaY);
1812
- addY(`infoSprite`, `shaking`, deltaY);
1813
- addY(`judgeSprite`, `shaking`, deltaY);
1812
+ addY(`mainSprite`, `shakingY`, deltaY, { priority: g_transPriority.shaking });
1813
+ addTransform(`infoSprite`, `shakingY`, `translateY(${deltaY}px)`, g_transPriority.shaking);
1814
+ addTransform(`judgeSprite`, `shakingY`, `translateY(${deltaY}px)`, g_transPriority.shaking);
1814
1815
  }
1815
1816
  }],
1816
1817
  ['S-Drunk', () => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "45.1.0",
3
+ "version": "45.2.0",
4
4
  "description": "Dancing☆Onigiri (CW Edition) - Web-based Rhythm Game",
5
5
  "main": "./js/danoni_main.js",
6
6
  "scripts": {