danoniplus 44.5.4 → 45.1.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
@@ -8,7 +8,7 @@
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 44.5.4`;
11
+ const g_version = `Ver 45.1.0`;
12
12
  const g_revisedDate = `2026/02/26`;
13
13
 
14
14
  // カスタム用バージョン (danoni_custom.js 等で指定可)
@@ -1687,12 +1687,12 @@ const createEmptySprite = (_parentObj, _newObjId, { x = 0, y = 0, w = g_sWidth,
1687
1687
  * @param {number} [object.x=0]
1688
1688
  * @returns {HTMLDivElement}
1689
1689
  */
1690
- const createMultipleSprite = (_baseName, _num, { x = 0 } = {}) => {
1690
+ const createMultipleSprite = (_baseName, _num, { x = 0, priority = g_transPriority.layer } = {}) => {
1691
1691
  const sprite = createEmptySprite(divRoot, _baseName);
1692
1692
  for (let j = 0; j <= _num; j++) {
1693
1693
  createEmptySprite(sprite, `${_baseName}${j}`);
1694
1694
  }
1695
- addX(_baseName, `root`, x);
1695
+ addX(_baseName, `root`, x, { priority });
1696
1696
  return sprite;
1697
1697
  };
1698
1698
 
@@ -7908,9 +7908,7 @@ const createGeneralSetting = (_obj, _settingName, { unitName = ``,
7908
7908
  const initName = `${getStgDetailName(g_stateObj[_settingName])}${unitName}`;
7909
7909
  _obj.appendChild(createLblSetting(settingUpper, adjY, toCapitalize(settingLabel)));
7910
7910
 
7911
- if (_settingName === `speed` || (
7912
- g_headerObj[`${_settingName}Use`] === undefined || g_headerObj[`${_settingName}Use`]
7913
- )) {
7911
+ if (g_headerObj[`${_settingName}Use`] === undefined || g_headerObj[`${_settingName}Use`]) {
7914
7912
 
7915
7913
  multiAppend(_obj,
7916
7914
  makeSettingLblCssButton(linkId, `${initName}${g_localStorage[_settingName] === g_stateObj[_settingName] ? ' *' : ''}`, 0,
@@ -8775,7 +8773,7 @@ const keyConfigInit = (_kcType = g_kcType) => {
8775
8773
  [tkObj.keyCtrlPtn, tkObj.keyNum, tkObj.posMax, tkObj.divideCnt];
8776
8774
 
8777
8775
  g_keyCopyLists.simpleDef.forEach(header => updateKeyInfo(header, keyCtrlPtn));
8778
- addTransform(`keyconSprite`, `root`, `scale(${g_keyObj.scale})`)
8776
+ addTransform(`keyconSprite`, `root`, `scale(${g_keyObj.scale})`, g_transPriority.scale);
8779
8777
  keyconSprite.style.height = `${parseFloat(keyconSprite.style.height) / ((1 + g_keyObj.scale) / 2)}px`;
8780
8778
  const kWidth = parseInt(keyconSprite.style.width);
8781
8779
  changeSetColor();
@@ -10337,7 +10335,7 @@ const scoreConvert = (_dosObj, _scoreId, _preblankFrame, _dummyNo = ``,
10337
10335
  const dosSpeedData = getRefData(_header, `${_scoreNo}${_footer}`);
10338
10336
  const speedData = [];
10339
10337
 
10340
- if (hasVal(dosSpeedData) && g_stateObj.d_speed !== C_FLG_OFF) {
10338
+ if (hasVal(dosSpeedData) && g_stateObj.d_velocity !== C_FLG_OFF) {
10341
10339
  const tmpArrayData = splitLF(dosSpeedData);
10342
10340
 
10343
10341
  tmpArrayData.filter(data => hasVal(data)).forEach(tmpData => {
@@ -10919,11 +10917,11 @@ const getSpeedFactor = _speed => {
10919
10917
  // ±1 はそのまま返して符号を保持
10920
10918
  return _speed;
10921
10919
  }
10922
- if (g_stateObj.d_speed === `Extreme`) {
10920
+ if (g_stateObj.d_velocity === `Extreme`) {
10923
10921
  // |speed|>1 を強めに、<1 を弱めに
10924
10922
  return _speed * (Math.abs(_speed) > 1 ? 1.5 : 0.75);
10925
10923
  }
10926
- if (g_stateObj.d_speed === `Soft`) {
10924
+ if (g_stateObj.d_velocity === `Soft`) {
10927
10925
  // 変化幅を緩和(符号は維持)
10928
10926
  return (1 + Math.abs(_speed)) / 2 * Math.sign(_speed);
10929
10927
  }
@@ -12086,17 +12084,16 @@ const mainInit = () => {
12086
12084
  mainSprite.style.transformOrigin = `center 55%`;
12087
12085
  }
12088
12086
 
12089
- addTransform(`mainSprite`, `root`, `scale(${g_workObj.scale})`);
12090
- addXY(`mainSprite`, `root`, g_workObj.playingX, g_posObj.stepY - C_STEP_Y + g_headerObj.playingY);
12087
+ 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 });
12091
12089
 
12092
12090
  // 曲情報・判定カウント用スプライトを作成(メインスプライトより上位)
12093
12091
  const infoSprite = createEmptySprite(divRoot, `infoSprite`, mainCommonPos);
12094
- addXY(`infoSprite`, `root`, g_workObj.playingX, g_headerObj.playingY);
12092
+ addXY(`infoSprite`, `root`, g_workObj.playingX, g_headerObj.playingY, { priority: g_transPriority.base });
12095
12093
 
12096
12094
  // 判定系スプライトを作成(メインスプライトより上位)
12097
12095
  const judgeSprite = createEmptySprite(divRoot, `judgeSprite`, mainCommonPos);
12098
- addXY(`judgeSprite`, `root`, g_workObj.playingX, g_headerObj.playingY);
12099
-
12096
+ addXY(`judgeSprite`, `root`, g_workObj.playingX, g_headerObj.playingY, { priority: g_transPriority.base });
12100
12097
  const tkObj = getKeyInfo();
12101
12098
  const [keyCtrlPtn, keyNum] = [tkObj.keyCtrlPtn, tkObj.keyNum];
12102
12099
 
@@ -12150,7 +12147,7 @@ const mainInit = () => {
12150
12147
  // StepAreaオプションにより、レイヤーが倍化される場合があるため基準レイヤー数ごとに設定
12151
12148
  const transj = j % g_stateObj.layerNumDf;
12152
12149
  addTransform(`mainSprite${j}`, `mainSprite${j}`,
12153
- g_keyObj[`layerTrans${keyCtrlPtn}`]?.[0]?.[Math.floor(transj / 2) * 2 + (transj + Number(g_stateObj.reverse === C_FLG_ON)) % 2]);
12150
+ g_keyObj[`layerTrans${keyCtrlPtn}`]?.[0]?.[Math.floor(transj / 2) * 2 + (transj + Number(g_stateObj.reverse === C_FLG_ON)) % 2], g_transPriority.layer);
12154
12151
 
12155
12152
  stepSprite.push(createEmptySprite(mainSpriteJ, `stepSprite${j}`, mainCommonPos));
12156
12153
  arrowSprite.push(createEmptySprite(mainSpriteJ, `arrowSprite${j}`, Object.assign({ y: g_workObj.hitPosition * (j % 2 === 0 ? 1 : -1) }, mainCommonPos)));
@@ -12202,7 +12199,7 @@ const mainInit = () => {
12202
12199
  g_stepAreaFunc.get(g_stateObj.stepArea)();
12203
12200
 
12204
12201
  // mainSpriteのtransform追加処理
12205
- addTransform(`mainSprite`, `playWindow`, g_playWindowFunc.get(g_stateObj.playWindow)());
12202
+ addTransform(`mainSprite`, `playWindow`, g_playWindowFunc.get(g_stateObj.playWindow)(), g_transPriority.playWindow);
12206
12203
 
12207
12204
  // EffectのArrowEffect追加処理
12208
12205
  g_effectFunc.get(g_stateObj.effect)();
@@ -12213,7 +12210,7 @@ const mainInit = () => {
12213
12210
 
12214
12211
  // Shaking初期化
12215
12212
  if (g_stateObj.shaking !== C_FLG_OFF) {
12216
- addXY(`mainSprite`, `shaking`, 0, 0);
12213
+ addXY(`mainSprite`, `shaking`, 0, 0, { priority: g_transPriority.shaking });
12217
12214
  }
12218
12215
 
12219
12216
  // 現在の矢印・フリーズアローの速度、個別加算速度の初期化 (速度変化時に直す)
@@ -12674,6 +12671,7 @@ const mainInit = () => {
12674
12671
  const judgeObjDelete = {};
12675
12672
  g_typeLists.arrow.forEach(type =>
12676
12673
  judgeObjDelete[type] = (_j, _deleteName) => {
12674
+ delTransform(_deleteName, `root`);
12677
12675
  g_workObj[`judg${toCapitalize(type)}Cnt`][_j]++;
12678
12676
  document.getElementById(_deleteName).remove();
12679
12677
  delete g_attrObj[_deleteName];
@@ -12892,8 +12890,8 @@ const mainInit = () => {
12892
12890
  (_attrs.initY * g_workObj.boostSpd +
12893
12891
  _attrs.initBoostY * g_workObj.boostDir) * g_workObj.scrollDir[_j];
12894
12892
 
12895
- const stepRoot = createEmptySprite(arrowSprite[g_workObj.dividePos[_j]], arrowName, {
12896
- x: g_workObj.stepX[_j], y: firstPosY, w: C_ARW_WIDTH, h: C_ARW_WIDTH,
12893
+ const arrowRoot = createEmptySprite(arrowSprite[g_workObj.dividePos[_j]], arrowName, {
12894
+ x: g_workObj.stepX[_j], y: 0, w: C_ARW_WIDTH, h: C_ARW_WIDTH,
12897
12895
  });
12898
12896
  /**
12899
12897
  * 矢印毎の属性情報
@@ -12916,14 +12914,17 @@ const mainInit = () => {
12916
12914
  // 現フレーム時の位置
12917
12915
  y: firstPosY,
12918
12916
  };
12917
+ addTransform(arrowName, `root`, `translateY(${wUnit(firstPosY)})`);
12918
+
12919
12919
  // 矢印色の設定
12920
12920
  // - 枠/塗りつぶし色: g_attrObj[arrowName].Arrow / ArrowShadow
12921
12921
  g_typeLists.arrowColor.forEach(val => g_attrObj[arrowName][`Arrow${val}`] = g_workObj[`${_name}${val}Colors`][_j]);
12922
- arrowSprite[g_workObj.dividePos[_j]].appendChild(stepRoot);
12922
+ arrowSprite[g_workObj.dividePos[_j]].appendChild(arrowRoot);
12923
+ const arrowSubRoot = createEmptySprite(arrowRoot, `sub${arrowName}`, { x: 0, y: 0, w: C_ARW_WIDTH, h: C_ARW_WIDTH });
12923
12924
 
12924
12925
  if (g_workObj[`${_name}CssMotions`][_j] !== ``) {
12925
- stepRoot.classList.add(g_workObj[`${_name}CssMotions`][_j]);
12926
- stepRoot.style.animationDuration = `${_attrs.arrivalFrame / g_fps}s`;
12926
+ arrowSubRoot.classList.add(g_workObj[`${_name}CssMotions`][_j]);
12927
+ arrowSubRoot.style.animationDuration = `${_attrs.arrivalFrame / g_fps}s`;
12927
12928
  }
12928
12929
 
12929
12930
  /**
@@ -12940,11 +12941,11 @@ const mainInit = () => {
12940
12941
  if (_shadowColor === `Default`) {
12941
12942
  arrShadow.style.opacity = 0.5;
12942
12943
  }
12943
- stepRoot.appendChild(arrShadow);
12944
+ arrowSubRoot.appendChild(arrShadow);
12944
12945
  }
12945
12946
 
12946
12947
  // 矢印 (枠)
12947
- stepRoot.appendChild(createColorObject2(`${_name}Top${_j}_${_arrowCnt}`, {
12948
+ arrowSubRoot.appendChild(createColorObject2(`${_name}Top${_j}_${_arrowCnt}`, {
12948
12949
  background: _color, rotate: g_workObj.arrowRtn[_j],
12949
12950
  }));
12950
12951
  g_customJsObj.makeArrow.forEach(func => func(_attrs, arrowName, _name, _arrowCnt));
@@ -12969,7 +12970,7 @@ const mainInit = () => {
12969
12970
  currentArrow.prevY = currentArrow.y;
12970
12971
  currentArrow.y -= (g_workObj.currentSpeed * currentArrow.boostSpd +
12971
12972
  (g_workObj.motionOnFrames[boostCnt] || 0) * currentArrow.boostDir) * currentArrow.dir;
12972
- $id(arrowName).top = wUnit(currentArrow.y);
12973
+ addTransform(arrowName, `root`, `translateY(${wUnit(currentArrow.y)})`);
12973
12974
  g_motionAlphaFunc.get(g_stateObj.motion)(arrowName, currentArrow);
12974
12975
  currentArrow.boostCnt--;
12975
12976
  }
@@ -12999,7 +13000,7 @@ const mainInit = () => {
12999
13000
  const firstBarLength = g_workObj[`mk${toCapitalize(_name)}Length`][_j][(_arrowCnt - 1) * 2] * g_workObj.boostSpd;
13000
13001
 
13001
13002
  const frzRoot = createEmptySprite(arrowSprite[g_workObj.dividePos[_j]], frzName, {
13002
- x: g_workObj.stepX[_j], y: firstPosY, w: C_ARW_WIDTH, h: C_ARW_WIDTH + firstBarLength,
13003
+ x: g_workObj.stepX[_j], y: 0, w: C_ARW_WIDTH, h: C_ARW_WIDTH + firstBarLength,
13003
13004
  });
13004
13005
  /**
13005
13006
  * フリーズアロー毎の属性情報
@@ -13032,6 +13033,8 @@ const mainInit = () => {
13032
13033
  // フリーズアロー(対矢印)の相対位置
13033
13034
  btmY: firstBarLength * g_workObj.scrollDir[_j],
13034
13035
  };
13036
+ addTransform(frzName, `root`, `translateY(${wUnit(firstPosY)})`);
13037
+
13035
13038
  // フリーズアロー色の設定
13036
13039
  // - 通常時 (矢印枠/矢印塗りつぶし/帯): g_attrObj[frzName].Normal / NormalShadow / NormalBar
13037
13040
  // - ヒット時 (矢印枠/矢印塗りつぶし/帯): g_attrObj[frzName].Hit / HitShadow / HitBar
@@ -13044,12 +13047,13 @@ const mainInit = () => {
13044
13047
  });
13045
13048
  arrowSprite[g_workObj.dividePos[_j]].appendChild(frzRoot);
13046
13049
  let shadowColor = _shadowColor === `Default` ? _normalColor : _shadowColor;
13050
+ const frzSubRoot = createEmptySprite(frzRoot, `sub${frzName}`, { x: 0, y: 0, w: C_ARW_WIDTH, h: C_ARW_WIDTH + firstBarLength });
13047
13051
 
13048
13052
  /**
13049
13053
  * フリーズアローオブジェクトの生成
13050
13054
  * - 後で生成されたものが手前に表示されるため、以下の順で作成
13051
13055
  */
13052
- multiAppend(frzRoot,
13056
+ multiAppend(frzSubRoot,
13053
13057
 
13054
13058
  // フリーズアロー帯(frzBar)
13055
13059
  createColorObject2(`${_name}Bar${frzNo}`, {
@@ -13057,9 +13061,9 @@ const mainInit = () => {
13057
13061
  opacity: 0.75,
13058
13062
  }),
13059
13063
  );
13060
- const frzTopRoot = createEmptySprite(frzRoot, `${_name}TopRoot${frzNo}`,
13064
+ const frzTopRoot = createEmptySprite(frzSubRoot, `${_name}TopRoot${frzNo}`,
13061
13065
  { x: 0, y: 0, w: C_ARW_WIDTH, h: C_ARW_WIDTH });
13062
- const frzBtmRoot = createEmptySprite(frzRoot, `${_name}BtmRoot${frzNo}`,
13066
+ const frzBtmRoot = createEmptySprite(frzSubRoot, `${_name}BtmRoot${frzNo}`,
13063
13067
  { x: 0, y: g_attrObj[frzName].btmY, w: C_ARW_WIDTH, h: C_ARW_WIDTH });
13064
13068
 
13065
13069
  multiAppend(frzTopRoot,
@@ -13089,8 +13093,8 @@ const mainInit = () => {
13089
13093
 
13090
13094
  );
13091
13095
  if (g_workObj[`${_name}CssMotions`][_j] !== ``) {
13092
- frzRoot.classList.add(g_workObj[`${_name}CssMotions`][_j]);
13093
- frzRoot.style.animationDuration = `${_attrs.arrivalFrame / g_fps}s`;
13096
+ frzSubRoot.classList.add(g_workObj[`${_name}CssMotions`][_j]);
13097
+ frzSubRoot.style.animationDuration = `${_attrs.arrivalFrame / g_fps}s`;
13094
13098
  }
13095
13099
  if (g_workObj[`${_name}ArrowCssMotions`][_j] !== ``) {
13096
13100
  [frzTopRoot, frzBtmRoot].forEach(obj => {
@@ -13123,7 +13127,7 @@ const mainInit = () => {
13123
13127
  if (g_workObj.currentSpeed !== 0) {
13124
13128
  currentFrz.prevY = currentFrz.y;
13125
13129
  currentFrz.y -= movY + (g_workObj.motionOnFrames[currentFrz.boostCnt] || 0) * currentFrz.dir * currentFrz.boostDir;
13126
- $id(frzName).top = wUnit(currentFrz.y);
13130
+ addTransform(frzName, `root`, `translateY(${wUnit(currentFrz.y)})`);
13127
13131
  g_motionAlphaFunc.get(g_stateObj.motion)(frzName, currentFrz);
13128
13132
  currentFrz.boostCnt--;
13129
13133
  }
@@ -13163,7 +13167,7 @@ const mainInit = () => {
13163
13167
  currentFrz.frzBarLength -= movY * currentFrz.dir;
13164
13168
  if (currentFrz.frzBarLength > 0) {
13165
13169
  currentFrz.y -= movY;
13166
- $id(frzName).top = wUnit(currentFrz.y);
13170
+ addTransform(frzName, `root`, `translateY(${wUnit(currentFrz.y)})`);
13167
13171
  } else {
13168
13172
  judgeObjDelete[_name](_j, frzName);
13169
13173
  }
@@ -13576,19 +13580,20 @@ const changeAppearanceFilter = (_num = 10) => {
13576
13580
  $id(`arrowSprite${topNum + j}`).clipPath = topShape;
13577
13581
  $id(`arrowSprite${bottomNum + j}`).clipPath = bottomShape;
13578
13582
 
13579
- addY(`filterBar${topNum + j}`, `appearance`, parseFloat($id(`arrowSprite${j}`).top) + topDist);
13580
- addY(`filterBar${bottomNum + j}`, `appearance`, parseFloat($id(`arrowSprite${j + 1}`).top) + bottomDist);
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 });
13581
13585
 
13582
13586
  if (![`Default`, `Halfway`].includes(g_stateObj.stepArea)) {
13583
- addY(`filterBar${bottomNum + j}_HS`, `appearance`, parseFloat($id(`arrowSprite${j}`).top) + bottomDist);
13584
- addY(`filterBar${topNum + j}_HS`, `appearance`, parseFloat($id(`arrowSprite${j + 1}`).top) + topDist);
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 });
13585
13589
  }
13586
13590
  }
13587
13591
 
13588
13592
  // フィルターバーのパーセント表示(フィルターバーが複数表示されるなど複雑なため、最初の階層グループの位置に追従)
13589
13593
  if (g_appearanceRanges.includes(g_stateObj.appearance)) {
13590
13594
  const currentBarNum = g_hidSudObj.std[g_stateObj.appearance][g_stateObj.reverse];
13591
- $id(`filterView`).top = $id(`filterBar${currentBarNum % 2}`).top;
13595
+ addY(`filterView`, `appearance`, parseFloat($id(`arrowSprite${currentBarNum % 2}`).top) +
13596
+ (currentBarNum % 2 === 0 ? bottomDist : topDist), { priority: g_transPriority.layer });
13592
13597
  filterView.textContent = `${_num}%`;
13593
13598
  g_hidSudObj.filterPos = _num;
13594
13599
  }
@@ -13678,12 +13683,12 @@ const changeReturn = (_rad, _axis) => {
13678
13683
  }
13679
13684
  sprite.style.opacity = isBack ? 0.7 : 1;
13680
13685
 
13681
- addTransform(`mainSprite`, `frzReturn`, _transform);
13686
+ addTransform(`mainSprite`, `frzReturn`, _transform, g_transPriority.frzReturn);
13682
13687
 
13683
13688
  if (_rad < 360 && g_workObj.frzReturnFlg) {
13684
13689
  setTimeout(() => changeReturn(_rad + 4, _axis), 20);
13685
13690
  } else {
13686
- addTransform(`mainSprite`, `frzReturn`, ``);
13691
+ delTransform(`mainSprite`, `frzReturn`);
13687
13692
  g_workObj.frzReturnFlg = false;
13688
13693
  }
13689
13694
  }
@@ -13781,7 +13786,7 @@ const changeScrollArrowDirs = (_frameNum) => {
13781
13786
  tmpObj.set(g_workObj.dividePos[targetj], g_workObj.mkScrollchArrowLayerTrans[_frameNum][j]);
13782
13787
  }
13783
13788
  });
13784
- tmpObj.forEach((val, key, map) => addTransform(`mainSprite${key}`, `scrollch`, val));
13789
+ tmpObj.forEach((val, key, map) => addTransform(`mainSprite${key}`, `scrollch`, val, g_transPriority.layer));
13785
13790
  };
13786
13791
 
13787
13792
  /**
@@ -13831,7 +13836,6 @@ const changeHitFrz = (_j, _k, _name, _difFrame = 0) => {
13831
13836
 
13832
13837
  // フリーズアロー位置の修正(ステップゾーン上に来るように)
13833
13838
  const delFrzLength = parseFloat($id(`stepRoot${_j}`).top) - currentFrz.y;
13834
- $id(frzName).top = $id(`stepRoot${_j}`).top;
13835
13839
 
13836
13840
  // 早押ししたboostCnt分のフリーズアロー終端位置の修正
13837
13841
  const delFrzMotionLength = sumData(g_workObj.motionOnFrames.slice(0, currentFrz.boostCnt + 1));
@@ -13844,6 +13848,7 @@ const changeHitFrz = (_j, _k, _name, _difFrame = 0) => {
13844
13848
  currentFrz.btmY -= delFrzLength + delFrzMotionLength + hitPos;
13845
13849
  currentFrz.y += delFrzLength;
13846
13850
  currentFrz.isMoving = false;
13851
+ addTransform(frzName, `root`, `translateY(${wUnit(currentFrz.y)})`);
13847
13852
 
13848
13853
  /**
13849
13854
  * フリーズアロー(ヒット時)の色変更
@@ -15132,7 +15137,7 @@ const getSelectedSettingList = (_shuffleName) => {
15132
15137
  }
15133
15138
 
15134
15139
  let display2Data = [
15135
- withDisplays(g_stateObj.d_speed, C_FLG_ON, g_lblNameObj.rd_Speed),
15140
+ withDisplays(g_stateObj.d_velocity, C_FLG_ON, g_lblNameObj.rd_Velocity),
15136
15141
  withDisplays(g_stateObj.d_color, C_FLG_ON, g_lblNameObj.rd_Color),
15137
15142
  withDisplays(g_stateObj.d_lyrics, C_FLG_ON, g_lblNameObj.rd_Lyrics),
15138
15143
  withDisplays(g_stateObj.d_background, C_FLG_ON, g_lblNameObj.rd_Background),
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Source by tickle
7
7
  * Created : 2019/11/19
8
- * Revised : 2026/02/23 (v44.5.2)
8
+ * Revised : 2026/02/26 (v45.1.0)
9
9
  *
10
10
  * https://github.com/cwtickle/danoniplus
11
11
  */
@@ -1154,7 +1154,7 @@ const g_stateObj = {
1154
1154
  d_filterline: C_FLG_ON,
1155
1155
 
1156
1156
  d_color: C_FLG_ON,
1157
- d_speed: C_FLG_ON,
1157
+ d_velocity: C_FLG_ON,
1158
1158
  d_arroweffect: C_FLG_ON,
1159
1159
  d_lyrics: C_FLG_ON,
1160
1160
  d_background: C_FLG_ON,
@@ -1313,7 +1313,7 @@ const g_settings = {
1313
1313
 
1314
1314
  // Display設定の拡張リスト
1315
1315
  d_stepZones: [`FlatBar`],
1316
- d_speeds: [`Extreme`, `Soft`],
1316
+ d_velocitys: [`Extreme`, `Soft`],
1317
1317
 
1318
1318
  displayNum: {
1319
1319
  stepZone: 0,
@@ -1322,7 +1322,7 @@ const g_settings = {
1322
1322
  lifeGauge: 0,
1323
1323
  score: 0,
1324
1324
  musicInfo: 0,
1325
- speed: 0,
1325
+ velocity: 0,
1326
1326
  color: 0,
1327
1327
  lyrics: 0,
1328
1328
  background: 0,
@@ -1388,6 +1388,15 @@ const g_moveSettingWindow = (_changePageFlg = true, _direction = 1) => {
1388
1388
  const g_transforms = {};
1389
1389
  const g_posXs = {};
1390
1390
  const g_posYs = {};
1391
+ const g_transPriority = {
1392
+ base: 0,
1393
+ layer: 10,
1394
+ playWindow: 100,
1395
+ stepArea: 110,
1396
+ frzReturn: 120,
1397
+ shaking: 130,
1398
+ scale: 200,
1399
+ };
1391
1400
 
1392
1401
  /**
1393
1402
  * idごとのtransformを追加・変更
@@ -1395,13 +1404,37 @@ const g_posYs = {};
1395
1404
  * @param {string} _id
1396
1405
  * @param {string} _transformId
1397
1406
  * @param {string} _transform
1407
+ * @param {number} [_priority=1000] transformの優先度(数値が小さいほど優先される。デフォルトは1000)
1398
1408
  */
1399
- const addTransform = (_id, _transformId, _transform) => {
1409
+ const addTransform = (_id, _transformId, _transform, _priority = 1000) => {
1400
1410
  if (g_transforms[_id] === undefined) {
1401
1411
  g_transforms[_id] = new Map();
1402
1412
  }
1403
- g_transforms[_id].set(_transformId, _transform);
1404
- $id(_id).transform = Array.from(g_transforms[_id].values()).join(` `);
1413
+ g_transforms[_id].set(_transformId, { transform: _transform, priority: _priority });
1414
+ $id(_id).transform = Array.from(g_transforms[_id].values())
1415
+ .sort((a, b) => b.priority - a.priority)
1416
+ .map(v => v.transform)
1417
+ .join(` `);
1418
+ };
1419
+
1420
+ /**
1421
+ * id, transformIdに合致するtransformの削除
1422
+ * @param {string} _id
1423
+ * @param {string} _transformId
1424
+ */
1425
+ const delTransform = (_id, _transformId) => {
1426
+ if (g_transforms[_id]) {
1427
+ g_transforms[_id].delete(_transformId);
1428
+ if (g_transforms[_id].size === 0) {
1429
+ delete g_transforms[_id];
1430
+ $id(_id).transform = ``;
1431
+ return;
1432
+ }
1433
+ $id(_id).transform = Array.from(g_transforms[_id].values())
1434
+ .sort((a, b) => b.priority - a.priority)
1435
+ .map(v => v.transform)
1436
+ .join(` `);
1437
+ }
1405
1438
  };
1406
1439
 
1407
1440
  /**
@@ -1427,7 +1460,7 @@ const resetTransform = () => {
1427
1460
  * @returns {string}
1428
1461
  */
1429
1462
  const getTransform = (_id, _transformId) => {
1430
- return g_transforms[_id]?.[_transformId] || ``;
1463
+ return g_transforms[_id]?.get(_transformId)?.transform || ``;
1431
1464
  };
1432
1465
 
1433
1466
  /**
@@ -1435,10 +1468,11 @@ const getTransform = (_id, _transformId) => {
1435
1468
  * @param {string} _id
1436
1469
  * @param {string} _typeId
1437
1470
  * @param {number} [_x=0]
1438
- * @param {boolean} [_overwrite=false]
1471
+ * @param {boolean} [overwrite=false]
1472
+ * @param {number} [priority=1000] transformの優先度(数値が小さいほど優先される。デフォルトは1000)
1439
1473
  */
1440
- const addX = (_id, _typeId, _x = 0, _overwrite = false) => {
1441
- if (_overwrite) {
1474
+ const addX = (_id, _typeId, _x = 0, { overwrite = false, priority = 1000 } = {}) => {
1475
+ if (overwrite) {
1442
1476
  delete g_posXs?.[_id];
1443
1477
  }
1444
1478
  if (g_posXs[_id] === undefined) {
@@ -1446,7 +1480,7 @@ const addX = (_id, _typeId, _x = 0, _overwrite = false) => {
1446
1480
  }
1447
1481
  if (g_posXs[_id].get(_typeId) !== _x) {
1448
1482
  g_posXs[_id].set(_typeId, _x);
1449
- $id(_id).left = `${sumData(Array.from(g_posXs[_id].values()))}px`;
1483
+ addTransform(_id, `posX`, `translateX(${sumData(Array.from(g_posXs[_id].values()))}px)`, priority);
1450
1484
  }
1451
1485
  };
1452
1486
 
@@ -1455,10 +1489,11 @@ const addX = (_id, _typeId, _x = 0, _overwrite = false) => {
1455
1489
  * @param {string} _id
1456
1490
  * @param {string} _typeId
1457
1491
  * @param {number} [_y=0]
1458
- * @param {boolean} [_overwrite=false]
1492
+ * @param {boolean} [overwrite=false]
1493
+ * @param {number} [priority=1000] transformの優先度(数値が小さいほど優先される。デフォルトは1000)
1459
1494
  */
1460
- const addY = (_id, _typeId, _y = 0, _overwrite = false) => {
1461
- if (_overwrite) {
1495
+ const addY = (_id, _typeId, _y = 0, { overwrite = false, priority = 1000 } = {}) => {
1496
+ if (overwrite) {
1462
1497
  delete g_posYs?.[_id];
1463
1498
  }
1464
1499
  if (g_posYs[_id] === undefined) {
@@ -1466,7 +1501,7 @@ const addY = (_id, _typeId, _y = 0, _overwrite = false) => {
1466
1501
  }
1467
1502
  if (g_posYs[_id].get(_typeId) !== _y) {
1468
1503
  g_posYs[_id].set(_typeId, _y);
1469
- $id(_id).top = `${sumData(Array.from(g_posYs[_id].values()))}px`;
1504
+ addTransform(_id, `posY`, `translateY(${sumData(Array.from(g_posYs[_id].values()))}px)`, priority);
1470
1505
  }
1471
1506
  };
1472
1507
 
@@ -1476,8 +1511,14 @@ const addY = (_id, _typeId, _y = 0, _overwrite = false) => {
1476
1511
  * @param {string} _typeId
1477
1512
  */
1478
1513
  const delX = (_id, _typeId) => {
1514
+ if (g_posXs[_id] === undefined) return;
1479
1515
  g_posXs[_id]?.delete(_typeId);
1480
- $id(_id).left = `${sumData(Array.from(g_posXs[_id].values()))}px`;
1516
+ if (g_posXs[_id].size === 0) {
1517
+ delTransform(_id, `posX`);
1518
+ return;
1519
+ }
1520
+ const priority = g_transforms[_id]?.get(`posX`)?.priority ?? 1000;
1521
+ addTransform(_id, `posX`, `translateX(${sumData(Array.from(g_posXs[_id].values()))}px)`, priority);
1481
1522
  };
1482
1523
 
1483
1524
  /**
@@ -1486,8 +1527,14 @@ const delX = (_id, _typeId) => {
1486
1527
  * @param {string} _typeId
1487
1528
  */
1488
1529
  const delY = (_id, _typeId) => {
1530
+ if (g_posYs[_id] === undefined) return;
1489
1531
  g_posYs[_id]?.delete(_typeId);
1490
- $id(_id).top = `${sumData(Array.from(g_posYs[_id].values()))}px`;
1532
+ if (g_posYs[_id].size === 0) {
1533
+ delTransform(_id, `posY`);
1534
+ return;
1535
+ }
1536
+ const priority = g_transforms[_id]?.get(`posY`)?.priority ?? 1000;
1537
+ addTransform(_id, `posY`, `translateY(${sumData(Array.from(g_posYs[_id].values()))}px)`, priority);
1491
1538
  };
1492
1539
 
1493
1540
  /**
@@ -1496,11 +1543,30 @@ const delY = (_id, _typeId) => {
1496
1543
  * @param {string} _typeId
1497
1544
  * @param {number} _x
1498
1545
  * @param {number} _y
1499
- * @param {boolean} [_overwrite=false]
1546
+ * @param {boolean} [overwrite=false]
1547
+ * @param {number} [priority=1000] transformの優先度(数値が小さいほど優先される。デフォルトは1000)
1500
1548
  */
1501
- const addXY = (_id, _typeId, _x = 0, _y = 0, _overwrite = false) => {
1502
- addX(_id, _typeId, _x, _overwrite);
1503
- addY(_id, _typeId, _y, _overwrite);
1549
+ const addXY = (_id, _typeId, _x = 0, _y = 0, { overwrite = false, priority = 1000 } = {}) => {
1550
+ addX(_id, _typeId, _x, { overwrite, priority });
1551
+ addY(_id, _typeId, _y, { overwrite, priority });
1552
+ };
1553
+
1554
+ /**
1555
+ * 座標を回転させた場合の変換処理
1556
+ * @param {number} _x
1557
+ * @param {number} _y
1558
+ * @param {number} _angleDeg
1559
+ * @returns {object} {x: number, y: number}
1560
+ */
1561
+ const rotateXY = (_x, _y, _angleDeg) => {
1562
+ const rad = _angleDeg * Math.PI / 180;
1563
+ const cos = Math.cos(rad);
1564
+ const sin = Math.sin(rad);
1565
+
1566
+ const rx = _x * cos - _y * sin;
1567
+ const ry = _x * sin + _y * cos;
1568
+
1569
+ return { x: rx, y: ry };
1504
1570
  };
1505
1571
 
1506
1572
  /**
@@ -1667,7 +1733,7 @@ const g_stepAreaFunc = new Map([
1667
1733
  }],
1668
1734
  ['Mismatched', () => {
1669
1735
  for (let j = 0; j < g_stateObj.layerNum; j++) {
1670
- addTransform(`mainSprite${j}`, `stepArea`, `rotate(${getDirFromLayer(j) * -15}deg)`);
1736
+ addTransform(`mainSprite${j}`, `stepArea`, `rotate(${getDirFromLayer(j) * -15}deg)`, g_transPriority.stepArea);
1671
1737
  }
1672
1738
  if (g_workObj.orgFlatFlg) {
1673
1739
  g_arrowGroupSprite.forEach(sprite => {
@@ -1679,7 +1745,7 @@ const g_stepAreaFunc = new Map([
1679
1745
  }],
1680
1746
  ['R-Mismatched', () => {
1681
1747
  for (let j = 0; j < g_stateObj.layerNum; j++) {
1682
- addTransform(`mainSprite${j}`, `stepArea`, `rotate(${getDirFromLayer(j) * 15}deg)`);
1748
+ addTransform(`mainSprite${j}`, `stepArea`, `rotate(${getDirFromLayer(j) * 15}deg)`, g_transPriority.stepArea);
1683
1749
  }
1684
1750
  if (g_workObj.orgFlatFlg) {
1685
1751
  g_arrowGroupSprite.forEach(sprite => {
@@ -1698,13 +1764,13 @@ const g_stepAreaFunc = new Map([
1698
1764
  }],
1699
1765
  ['X-Flower', () => {
1700
1766
  for (let j = 0; j < g_stateObj.layerNum; j++) {
1701
- addTransform(`mainSprite${j}`, `stepArea`, `rotate(${getDirFromLayer(j) * -15}deg)`);
1767
+ addTransform(`mainSprite${j}`, `stepArea`, `rotate(${getDirFromLayer(j) * -15}deg)`, g_transPriority.stepArea);
1702
1768
  }
1703
1769
  }],
1704
1770
  ['Alt-Crossing', () => {
1705
1771
  for (let j = 0; j < g_stateObj.layerNum; j++) {
1706
1772
  addTransform(`mainSprite${j}`, `stepArea`, `rotate(${getDirFromLayer(j) * -10}deg) ` +
1707
- `translateX(${getDirFromLayer(j) * 20}px)`);
1773
+ `translateX(${getDirFromLayer(j) * 20}px)`, g_transPriority.stepArea);
1708
1774
  }
1709
1775
  }],
1710
1776
  ]);
@@ -1861,7 +1927,7 @@ const g_keycons = {
1861
1927
  };
1862
1928
 
1863
1929
  let g_displays = [`stepZone`, `judgment`, `fastSlow`, `lifeGauge`, `score`, `musicInfo`, `filterLine`,
1864
- `speed`, `color`, `lyrics`, `background`, `arrowEffect`, `special`];
1930
+ `velocity`, `color`, `lyrics`, `background`, `arrowEffect`, `special`];
1865
1931
 
1866
1932
  // ローカルストレージ保存対象
1867
1933
  let g_storeSettings = [`adjustment`, `volume`, `appearance`, `opacity`, `hitPosition`];
@@ -1870,7 +1936,7 @@ let g_storeSettings = [`adjustment`, `volume`, `appearance`, `opacity`, `hitPosi
1870
1936
  let g_storeSettingsEx = [`d_stepzone`, `d_judgment`, `d_fastslow`, `d_lifegauge`,
1871
1937
  `d_score`, `d_musicinfo`, `d_filterline`];
1872
1938
 
1873
- let g_canDisabledSettings = [`motion`, `scroll`, `reverse`, `shuffle`, `autoPlay`, `gauge`,
1939
+ let g_canDisabledSettings = [`speed`, `motion`, `scroll`, `reverse`, `shuffle`, `autoPlay`, `gauge`,
1874
1940
  `excessive`, `appearance`, `playWindow`, `stepArea`, `frzReturn`, `shaking`, `effect`, `camoufrage`,
1875
1941
  `swapping`, `judgRange`, `autoRetry`];
1876
1942
 
@@ -2463,8 +2529,8 @@ const g_shortcutObj = {
2463
2529
  ShiftRight_Digit6: { id: `lnkmusicInfoR` },
2464
2530
  ShiftLeft_Digit7: { id: `lnkfilterLineR` },
2465
2531
  ShiftRight_Digit7: { id: `lnkfilterLineR` },
2466
- ShiftLeft_Digit8: { id: `lnkspeedR` },
2467
- ShiftRight_Digit8: { id: `lnkspeedR` },
2532
+ ShiftLeft_Digit8: { id: `lnkvelocityR` },
2533
+ ShiftRight_Digit8: { id: `lnkvelocityR` },
2468
2534
  ShiftLeft_Digit9: { id: `lnkcolorR` },
2469
2535
  ShiftRight_Digit9: { id: `lnkcolorR` },
2470
2536
  ShiftLeft_Digit0: { id: `lnklyricsR` },
@@ -2483,7 +2549,7 @@ const g_shortcutObj = {
2483
2549
  Digit5: { id: `lnkscore` },
2484
2550
  Digit6: { id: `lnkmusicInfo` },
2485
2551
  Digit7: { id: `lnkfilterLine` },
2486
- Digit8: { id: `lnkspeed` },
2552
+ Digit8: { id: `lnkvelocity` },
2487
2553
  Digit9: { id: `lnkcolor` },
2488
2554
  Digit0: { id: `lnklyrics` },
2489
2555
  Semicolon: { id: `lnkbackground` },
@@ -2504,8 +2570,8 @@ const g_shortcutObj = {
2504
2570
  ShiftRight_Numpad6: { id: `lnkmusicInfoR` },
2505
2571
  ShiftLeft_Numpad7: { id: `lnkfilterLineR` },
2506
2572
  ShiftRight_Numpad7: { id: `lnkfilterLineR` },
2507
- ShiftLeft_Numpad8: { id: `lnkspeedR` },
2508
- ShiftRight_Numpad8: { id: `lnkspeedR` },
2573
+ ShiftLeft_Numpad8: { id: `lnkvelocityR` },
2574
+ ShiftRight_Numpad8: { id: `lnkvelocityR` },
2509
2575
  ShiftLeft_Numpad9: { id: `lnkcolorR` },
2510
2576
  ShiftRight_Numpad9: { id: `lnkcolorR` },
2511
2577
  ShiftLeft_Numpad0: { id: `lnklyricsR` },
@@ -2524,7 +2590,7 @@ const g_shortcutObj = {
2524
2590
  Numpad5: { id: `lnkscore` },
2525
2591
  Numpad6: { id: `lnkmusicInfo` },
2526
2592
  Numpad7: { id: `lnkfilterLine` },
2527
- Numpad8: { id: `lnkspeed` },
2593
+ Numpad8: { id: `lnkvelocity` },
2528
2594
  Numpad9: { id: `lnkcolor` },
2529
2595
  Numpad0: { id: `lnklyrics` },
2530
2596
  NumpadAdd: { id: `lnkbackground` },
@@ -4091,7 +4157,7 @@ const g_lblNameObj = {
4091
4157
  d_Score: `Score`,
4092
4158
  d_MusicInfo: `MusicInfo`,
4093
4159
  d_FilterLine: `FilterLine`,
4094
- d_Speed: `Velocity`,
4160
+ d_Velocity: `Velocity`,
4095
4161
  d_Color: `Color`,
4096
4162
  d_Lyrics: `Lyrics`,
4097
4163
  d_Background: `Background`,
@@ -4218,7 +4284,7 @@ const g_lblNameObj = {
4218
4284
  'u_Shakin(Great)': `Shakin(Great)`,
4219
4285
  'u_Fast/Slow': `Fast/Slow`,
4220
4286
 
4221
- 'u_Speed': `Velocity`,
4287
+ 'u_Velocity': `Velocity`,
4222
4288
  'u_Density': `Density`,
4223
4289
  'u_ToolDif': `DifLevel`,
4224
4290
  'u_HighScore': `HighScore`,
@@ -4264,7 +4330,7 @@ const g_lblNameObj = {
4264
4330
  rd_Score: `Score`,
4265
4331
  rd_MusicInfo: `MusicInfo`,
4266
4332
  rd_FilterLine: `Filter`,
4267
- rd_Speed: `Speed`,
4333
+ rd_Velocity: `Velocity`,
4268
4334
  rd_Color: `Color`,
4269
4335
  rd_Lyrics: `Lyrics`,
4270
4336
  rd_Background: `Back`,
@@ -4432,7 +4498,7 @@ const g_lang_msgObj = {
4432
4498
  d_score: `現時点の判定数を表示`,
4433
4499
  d_musicinfo: `音楽情報(時間表示含む)`,
4434
4500
  d_filterline: `Hidden+, Sudden+使用時のフィルターの境界線表示`,
4435
- d_speed: `途中変速、個別加速の有効化設定`,
4501
+ d_velocity: `途中変速、個別加速の有効化設定`,
4436
4502
  d_color: `色変化の有効化設定`,
4437
4503
  d_lyrics: `歌詞表示の有効化設定`,
4438
4504
  d_background: `背景・マスクモーションの有効化設定`,
@@ -4525,7 +4591,7 @@ const g_lang_msgObj = {
4525
4591
  d_score: `Display the current number of judgments`,
4526
4592
  d_musicinfo: `Display the music credits and current time`,
4527
4593
  d_filterline: `Filter border display when using "Hidden+" or "Sudden+"`,
4528
- d_speed: `Enable speed change settings`,
4594
+ d_velocity: `Enable velocity change settings`,
4529
4595
  d_color: `Enable color change settings`,
4530
4596
  d_lyrics: `Enable lyrics display`,
4531
4597
  d_background: `Enable background images and animations`,
@@ -4548,7 +4614,7 @@ const g_lang_msgObj = {
4548
4614
  judgRange: `Set the allowable range of judgment.\n[Normal] Normal judgment, [Narrow/Hard] Hard judgment, [ExHard] Very hard judgment`,
4549
4615
  autoRetry: `Set the conditions for automatic retry.\n[Miss] When missed, [Matari] When good, [Shakin] When great, [FS] When Fast/Slow occurs`,
4550
4616
 
4551
- lnkSpeedG: `Displays the speed change status by progression of the chart.`,
4617
+ lnkSpeedG: `Displays the velocity change status by progression of the chart.`,
4552
4618
  lnkDensityG: `Displays the density status of the chart.`,
4553
4619
  lnkToolDifG: `Displays the difficulty level of the chart and the distribution of arrows and freeze arrows.`,
4554
4620
  lnkHighScoreG: `Displays the high score of the chart.`,
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
  /**
3
3
  * Dancing☆Onigiri 設定用jsファイル
4
- * Template Update: 2025/03/16 (v40.6.0)
4
+ * Template Update: 2026/02/26 (v45.0.0)
5
5
  *
6
6
  * このファイルでは、作品全体に対しての初期設定を行うことができます。
7
7
  * 譜面データ側で個別に同様の項目が設定されている場合は、譜面データ側の設定が優先されます。
@@ -185,7 +185,7 @@ g_presetObj.customDesignUse = {
185
185
  Flat時ステップ間隔:50(px) ※矢印サイズ
186
186
  リモート時のディレクトリ:`` (指定なし。自サーバーの画像を使用する)
187
187
  */
188
- //g_presetObj.imageSets = [``, `classic,png`, `classic-thin,png`, `note,svg,false,0`];
188
+ g_presetObj.imageSets = [``, `classic,png`, `classic-thin,png`, `note,svg,false,0`];
189
189
 
190
190
  /**
191
191
  デフォルト画像セット (C_IMG_XXXX, 厳密にはg_imgObj) に対して拡張子の上書きを行うか設定
@@ -226,6 +226,7 @@ g_presetObj.customDesignUse = {
226
226
  Display設定の場合は `true,OFF`(設定は有効だが初期値はOFF)といったことができる
227
227
  */
228
228
  g_presetObj.settingUse = {
229
+ // speed : `true`,
229
230
  motion: `true`,
230
231
  scroll: `true`,
231
232
  // reverse: `true`,
@@ -242,7 +243,7 @@ g_presetObj.settingUse = {
242
243
  // score: `true`,
243
244
  // musicInfo: `true`,
244
245
  // filterLine: `true`,
245
- // speed: `true`,
246
+ // velocity: `true`,
246
247
  // color: `true`,
247
248
  // lyrics: `true`,
248
249
  // background: `true`,
@@ -403,10 +404,17 @@ g_presetObj.msg = {
403
404
  * 設定名の上書き可否設定
404
405
  */
405
406
  g_presetObj.lblRenames = {
407
+ // title: true,
408
+ // dataMgt: true,
409
+ // precondition: true,
406
410
  option: true,
411
+ difSelector: true,
407
412
  settingsDisplay: true,
408
- main: true,
413
+ exSetting: true,
409
414
  keyConfig: true,
415
+ // loading: true,
416
+ // loadingIos: true,
417
+ main: true,
410
418
  result: true,
411
419
  };
412
420
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "44.5.4",
3
+ "version": "45.1.0",
4
4
  "description": "Dancing☆Onigiri (CW Edition) - Web-based Rhythm Game",
5
5
  "main": "./js/danoni_main.js",
6
6
  "scripts": {