danoniplus 42.2.3 → 42.3.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 : 2025/06/20
7
+ * Revised : 2025/06/26
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 42.2.3`;
12
- const g_revisedDate = `2025/06/20`;
11
+ const g_version = `Ver 42.3.0`;
12
+ const g_revisedDate = `2025/06/26`;
13
13
 
14
14
  // カスタム用バージョン (danoni_custom.js 等で指定可)
15
15
  let g_localVersion = ``;
@@ -9989,6 +9989,7 @@ const scoreConvert = (_dosObj, _scoreId, _preblankFrame, _dummyNo = ``,
9989
9989
  const setScrollchData = (_scoreNo) => {
9990
9990
  const dosScrollchData = getRefData(`scrollch`, `${_scoreNo}_data`) || _dosObj.scrollch_data;
9991
9991
  const scrollchData = [];
9992
+ let maxLayerGroup = 0;
9992
9993
 
9993
9994
  if (hasVal(dosScrollchData)) {
9994
9995
  splitLF(dosScrollchData).filter(data => hasVal(data)).forEach(tmpData => {
@@ -10000,9 +10001,12 @@ const scoreConvert = (_dosObj, _scoreId, _preblankFrame, _dummyNo = ``,
10000
10001
  const arrowNum = parseFloat(tmpScrollchData[1]);
10001
10002
  const scrollDir = parseFloat(tmpScrollchData[2] ?? `1`);
10002
10003
  const layerGroup = parseFloat(tmpScrollchData[3] ?? `-1`);
10004
+ const layerTrans = tmpScrollchData[4] ?? ``;
10005
+ maxLayerGroup = Math.max(maxLayerGroup, layerGroup);
10003
10006
 
10004
- scrollchData.push([frame, arrowNum, frame, scrollDir, layerGroup]);
10007
+ scrollchData.push([frame, arrowNum, frame, scrollDir, layerGroup, layerTrans]);
10005
10008
  });
10009
+ g_stateObj.layerNumDf = Math.max((maxLayerGroup + 1) * 2, 2);
10006
10010
  return scrollchData.sort((_a, _b) => _a[0] - _b[0]).flat();
10007
10011
  }
10008
10012
  return [];
@@ -10218,6 +10222,9 @@ const scoreConvert = (_dosObj, _scoreId, _preblankFrame, _dummyNo = ``,
10218
10222
  obj.colorData = mergeColorData();
10219
10223
  obj.dummyColorData = mergeColorData(`Dummy`);
10220
10224
 
10225
+ // レイヤー数の初期値設定(譜面ごとに設定のため)
10226
+ g_stateObj.layerNumDf = 2;
10227
+
10221
10228
  // 矢印モーション(個別)データの分解(3~4つで1セット, セット毎の改行区切り)
10222
10229
  obj.arrowCssMotionData = setCssMotionData(`arrow`, scoreIdHeader);
10223
10230
  obj.frzCssMotionData = setCssMotionData(`frz`, scoreIdHeader);
@@ -10784,7 +10791,7 @@ const pushArrows = (_dataObj, _speedOnFrame, _firstArrivalFrame) => {
10784
10791
  g_typeLists.arrow.forEach(header =>
10785
10792
  calcDataTiming(`cssMotion`, header, pushCssMotions, { _calcFrameFlg: true }));
10786
10793
 
10787
- calcDataTiming(`scrollch`, ``, pushScrollchs, { _term: 5, _calcFrameFlg: true });
10794
+ calcDataTiming(`scrollch`, ``, pushScrollchs, { _term: 6, _calcFrameFlg: true });
10788
10795
 
10789
10796
  g_fadeinStockList.forEach(type =>
10790
10797
  _dataObj[`${type}Data`] = calcAnimationData(type, _dataObj[`${type}Data`]));
@@ -11048,8 +11055,10 @@ const pushCssMotions = (_header, _frame, _val, _styleName, _styleNameRev) => {
11048
11055
  * @param {number} _val
11049
11056
  * @param {number} _frameStep
11050
11057
  * @param {number} _scrollDir
11058
+ * @param {number} _layerGroup
11059
+ * @param {number} _layerTrans
11051
11060
  */
11052
- const pushScrollchs = (_header, _frameArrow, _val, _frameStep, _scrollDir, _layerGroup) => {
11061
+ const pushScrollchs = (_header, _frameArrow, _val, _frameStep, _scrollDir, _layerGroup, _layerTrans) => {
11053
11062
  const tkObj = getKeyInfo();
11054
11063
  g_stateObj.layerNum = Math.max(g_stateObj.layerNum, (_layerGroup + 1) * 2);
11055
11064
 
@@ -11060,10 +11069,12 @@ const pushScrollchs = (_header, _frameArrow, _val, _frameStep, _scrollDir, _laye
11060
11069
  const pushScrollData = _j => {
11061
11070
  pushData(`Arrow`, frameArrow, _j);
11062
11071
  pushData(`ArrowDir`, frameArrow, _scrollDir);
11063
- pushData(`ArrowLayer`, frameArrow, _layerGroup);
11072
+ pushData(`ArrowLayerGroup`, frameArrow, _layerGroup);
11073
+ pushData(`ArrowLayerTrans`, frameArrow, _layerTrans);
11064
11074
  pushData(`Step`, frameStep, _j);
11065
11075
  pushData(`StepDir`, frameStep, _scrollDir);
11066
- pushData(`StepLayer`, frameStep, _layerGroup);
11076
+ pushData(`StepLayerGroup`, frameStep, _layerGroup);
11077
+ pushData(`StepLayerTrans`, frameStep, _layerTrans);
11067
11078
  };
11068
11079
 
11069
11080
  if (_val < 20 || _val >= 1000) {
@@ -11108,7 +11119,6 @@ const getArrowSettings = () => {
11108
11119
  g_workObj.keyCtrl = structuredClone(g_keyObj[`keyCtrl${keyCtrlPtn}`]);
11109
11120
  g_workObj.diffList = [];
11110
11121
  g_workObj.mainEndTime = 0;
11111
- g_stateObj.layerNum = 2;
11112
11122
 
11113
11123
  g_workObj.keyGroupMaps = tkObj.keyGroupMaps;
11114
11124
  g_workObj.keyGroupList = tkObj.keyGroupList;
@@ -11175,9 +11185,14 @@ const getArrowSettings = () => {
11175
11185
  });
11176
11186
  }
11177
11187
  g_workObj.orgFlatFlg = g_workObj.dividePos.every(v => v === g_workObj.dividePos[0]);
11188
+ g_stateObj.layerNumDf = Math.max(g_stateObj.layerNumDf, Math.ceil((Math.max(...g_workObj.dividePos) + 1) / 2) * 2);
11189
+
11190
+ // StepArea(Default, Halfway以外)によるレイヤー移動
11191
+ // ずらした位置に表示するため、レイヤーを倍化して倍化した先に割り当てる
11178
11192
  if (g_stateObj.stepArea === `X-Flower` || (g_stateObj.stepArea.includes(`Mismatched`) && g_workObj.orgFlatFlg)) {
11179
11193
  for (let j = 0; j < keyNum; j++) {
11180
- g_workObj.dividePos[j] = (g_workObj.stepX[j] < (g_headerObj.playingWidth - C_ARW_WIDTH) / 2 ? 0 : 1) * 2 + g_workObj.dividePos[j] % 2;
11194
+ g_workObj.dividePos[j] = (g_workObj.stepX[j] < (g_headerObj.playingWidth - C_ARW_WIDTH) / 2 ? 0 : 1) *
11195
+ g_stateObj.layerNumDf + g_workObj.dividePos[j];
11181
11196
  }
11182
11197
  }
11183
11198
  if (g_stateObj.stepArea === `2Step`) {
@@ -11187,14 +11202,14 @@ const getArrowSettings = () => {
11187
11202
  g_workObj.scrollDir[j] *= -1;
11188
11203
  }
11189
11204
  if (g_workObj.dividePos[j] % 2 === (Number(g_stateObj.reverse === C_FLG_ON) + 1) % 2) {
11190
- g_workObj.dividePos[j] = g_stateObj.layerNum + g_workObj.dividePos[j] + Number(g_stateObj.reverse === C_FLG_ON ? 1 : -1);
11205
+ g_workObj.dividePos[j] = g_stateObj.layerNumDf + g_workObj.dividePos[j] + Number(g_stateObj.reverse === C_FLG_ON ? 1 : -1);
11191
11206
  g_workObj.scrollDir[j] *= -1;
11192
11207
  }
11193
11208
  }
11194
11209
  }
11195
11210
  g_workObj.scrollDirDefault = g_workObj.scrollDir.concat();
11196
11211
  g_workObj.dividePosDefault = g_workObj.dividePos.concat();
11197
- g_stateObj.layerNum = Math.max(g_stateObj.layerNum, Math.ceil((Math.max(...g_workObj.dividePos) + 1) / 2) * 2);
11212
+ g_stateObj.layerNum = g_stateObj.layerNumDf * (g_settings.stepAreaLayers.includes(g_stateObj.stepArea) ? 2 : 1);
11198
11213
 
11199
11214
  // g_workObjの不要なプロパティを削除
11200
11215
  if (g_stateObj.dummyId === `` && g_autoPlaysBase.includes(g_stateObj.autoPlay)) {
@@ -11213,7 +11228,7 @@ const getArrowSettings = () => {
11213
11228
  }
11214
11229
  });
11215
11230
  [`Arrow`, `Step`].forEach(type => {
11216
- [``, `Dir`, `Layer`].forEach(type2 => {
11231
+ [``, `Dir`, `LayerGroup`, `LayerTrans`].forEach(type2 => {
11217
11232
  if (g_workObj[`mkScrollch${type}${type2}`].length === 0) {
11218
11233
  delete g_workObj[`mkScrollch${type}${type2}`];
11219
11234
  }
@@ -11534,8 +11549,12 @@ const mainInit = () => {
11534
11549
  if (doubleFilterFlg) {
11535
11550
  mainSpriteJ.appendChild(createColorObject2(`filterBar${j % 2 == 0 ? j + 1 : j - 1}_HS`, g_lblPosObj.filterBar, filterCss));
11536
11551
  }
11552
+
11553
+ // レイヤーごとのTransition設定
11554
+ // StepAreaオプションにより、レイヤーが倍化される場合があるため基準レイヤー数ごとに設定
11555
+ const transj = j % g_stateObj.layerNumDf;
11537
11556
  addTransform(`mainSprite${j}`, `mainSprite${j}`,
11538
- g_keyObj[`layerTrans${keyCtrlPtn}`]?.[0]?.[Math.floor(j / 2) + (j + Number(g_stateObj.reverse === C_FLG_ON)) % 2]);
11557
+ g_keyObj[`layerTrans${keyCtrlPtn}`]?.[0]?.[Math.floor(transj / 2) * 2 + (transj + Number(g_stateObj.reverse === C_FLG_ON)) % 2]);
11539
11558
 
11540
11559
  stepSprite.push(createEmptySprite(mainSpriteJ, `stepSprite${j}`, mainCommonPos));
11541
11560
  arrowSprite.push(createEmptySprite(mainSpriteJ, `arrowSprite${j}`, Object.assign({ y: g_workObj.hitPosition * (j % 2 === 0 ? 1 : -1) }, mainCommonPos)));
@@ -13063,16 +13082,41 @@ const changeCssMotions = (_header, _name, _frameNum) => {
13063
13082
  };
13064
13083
 
13065
13084
  /**
13066
- * スクロール方向の変更(矢印・フリーズアロー)
13085
+ * 基準となる階層グループの取得
13086
+ * @param {number} _layerGroup
13087
+ * @param {number} _j
13088
+ * @returns {number}
13089
+ */
13090
+ const getBaseLayerGroup = (_layerGroup, _j) =>
13091
+ _layerGroup === -1
13092
+ ? Math.floor(g_workObj.dividePosDefault[_j] / 2)
13093
+ : _layerGroup + (g_workObj.dividePosDefault[_j] > g_stateObj.layerNumDf ? g_stateObj.layerNumDf / 2 : 0);
13094
+
13095
+ /**
13096
+ * スクロール方向、レイヤーの変更(矢印・フリーズアロー)
13097
+ * StepAreaがDefault/Halfway以外の場合はレイヤー数が倍化するため、その設定にも追従する
13067
13098
  * @param {number} _frameNum
13068
13099
  */
13069
- const changeScrollArrowDirs = (_frameNum) =>
13100
+ const changeScrollArrowDirs = (_frameNum) => {
13101
+ if (g_workObj.mkScrollchArrow?.[_frameNum] === undefined) {
13102
+ return;
13103
+ }
13104
+ const tmpObj = new Map();
13070
13105
  g_workObj.mkScrollchArrow?.[_frameNum]?.forEach((targetj, j) => {
13071
13106
  g_workObj.scrollDir[targetj] = g_workObj.scrollDirDefault[targetj] * g_workObj.mkScrollchArrowDir[_frameNum][j];
13072
- const baseLayer = g_workObj.mkScrollchArrowLayer[_frameNum][j] === -1 ?
13073
- Math.floor(g_workObj.dividePosDefault[targetj] / 2) : g_workObj.mkScrollchArrowLayer[_frameNum][j];
13107
+
13108
+ // レイヤー変更
13109
+ const baseLayer = getBaseLayerGroup(g_workObj.mkScrollchArrowLayerGroup[_frameNum][j], targetj);
13074
13110
  g_workObj.dividePos[targetj] = baseLayer * 2 + (g_workObj.scrollDir[targetj] === 1 ? 0 : 1);
13111
+
13112
+ // 対象の矢印が属するレイヤーに対するTransitionを設定
13113
+ // ステップゾーンの移動よりも矢印・フリーズアローの方が早く変わるため、この関数のみ適用
13114
+ if (g_workObj.mkScrollchArrowLayerTrans[_frameNum][j] !== ``) {
13115
+ tmpObj.set(g_workObj.dividePos[targetj], g_workObj.mkScrollchArrowLayerTrans[_frameNum][j]);
13116
+ }
13075
13117
  });
13118
+ tmpObj.forEach((val, key, map) => addTransform(`mainSprite${key}`, `scrollch`, val));
13119
+ };
13076
13120
 
13077
13121
  /**
13078
13122
  * ステップゾーンの位置反転
@@ -13091,8 +13135,7 @@ const changeStepY = (_frameNum) =>
13091
13135
  document.getElementById(`frzHit${targetj}`).remove();
13092
13136
 
13093
13137
  // レイヤーを変更しステップゾーンを再生成。移動元の不透明度、表示・非表示を反映
13094
- const baseLayer = g_workObj.mkScrollchStepLayer[_frameNum][j] === -1 ?
13095
- Math.floor(g_workObj.dividePosDefault[targetj] / 2) : g_workObj.mkScrollchStepLayer[_frameNum][j];
13138
+ const baseLayer = getBaseLayerGroup(g_workObj.mkScrollchStepLayerGroup[_frameNum][j], targetj);
13096
13139
  g_workObj.dividePos[targetj] = baseLayer * 2 + dividePos;
13097
13140
  makeStepZone(targetj, `${g_keyObj.currentKey}_${g_keyObj.currentPtn}`);
13098
13141
  appearStepZone(targetj, _stepDisplay, _stepOpacity);
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Source by tickle
7
7
  * Created : 2019/11/19
8
- * Revised : 2025/06/17 (v42.2.1)
8
+ * Revised : 2025/06/26 (v42.3.0)
9
9
  *
10
10
  * https://github.com/cwtickle/danoniplus
11
11
  */
@@ -771,7 +771,8 @@ const g_typeLists = {
771
771
  dataList: [
772
772
  `Arrow`, `FrzArrow`, `FrzLength`,
773
773
  `Color`, `ColorCd`, `ColorShadow`, `ColorShadowCd`,
774
- `ScrollchArrow`, `ScrollchStep`, `ScrollchArrowDir`, `ScrollchStepDir`, `ScrollchArrowLayer`, `ScrollchStepLayer`,
774
+ `ScrollchArrow`, `ScrollchStep`, `ScrollchArrowDir`, `ScrollchStepDir`,
775
+ `ScrollchArrowLayerGroup`, `ScrollchStepLayerGroup`, `ScrollchArrowLayerTrans`, `ScrollchStepLayerTrans`,
775
776
  `FColorNormal`, `FColorNormalCd`, `FColorNormalBar`, `FColorNormalBarCd`,
776
777
  `FColorNormalShadow`, `FColorNormalShadowCd`,
777
778
  `FColorHit`, `FColorHitCd`, `FColorHitBar`, `FColorHitBarCd`,
@@ -1099,7 +1100,8 @@ const g_stateObj = {
1099
1100
  dm_customKey: C_FLG_OFF,
1100
1101
  dm_others: C_FLG_OFF,
1101
1102
 
1102
- layerNum: 2,
1103
+ layerNum: 2, // オプションを加味した実際のレイヤー数
1104
+ layerNumDf: 2, // 基準レイヤー数
1103
1105
  };
1104
1106
 
1105
1107
  const C_VAL_MAXLIFE = 1000;
@@ -1243,6 +1245,7 @@ const g_settings = {
1243
1245
  playWindowNum: 0,
1244
1246
 
1245
1247
  stepAreas: [`Default`, `Halfway`, `2Step`, `Mismatched`, `R-Mismatched`, `X-Flower`],
1248
+ stepAreaLayers: [`2Step`, `Mismatched`, `R-Mismatched`, `X-Flower`],
1246
1249
  stepAreaNum: 0,
1247
1250
 
1248
1251
  frzReturns: [C_FLG_OFF, `X-Axis`, `Y-Axis`, `Z-Axis`, `Random`, `XY-Axis`, `XZ-Axis`, `YZ-Axis`, `Random+`],
@@ -1555,7 +1558,7 @@ const g_stepAreaFunc = new Map([
1555
1558
  }
1556
1559
  if (g_workObj.orgFlatFlg) {
1557
1560
  g_arrowGroupSprite.forEach(sprite => {
1558
- for (let j = 2; j < Math.min(g_stateObj.layerNum, 4); j++) {
1561
+ for (let j = g_stateObj.layerNumDf; j < g_stateObj.layerNum; j++) {
1559
1562
  addY(`${sprite}${j}`, `stepArea`, halfwayOffset(j));
1560
1563
  }
1561
1564
  });
@@ -1567,7 +1570,7 @@ const g_stepAreaFunc = new Map([
1567
1570
  }
1568
1571
  if (g_workObj.orgFlatFlg) {
1569
1572
  g_arrowGroupSprite.forEach(sprite => {
1570
- for (let j = 0; j < Math.min(g_stateObj.layerNum, 2); j++) {
1573
+ for (let j = 0; j < g_stateObj.layerNumDf; j++) {
1571
1574
  addY(`${sprite}${j}`, `stepArea`, halfwayOffset(j));
1572
1575
  }
1573
1576
  });
@@ -1575,14 +1578,14 @@ const g_stepAreaFunc = new Map([
1575
1578
  }],
1576
1579
  ['2Step', () => {
1577
1580
  g_arrowGroupSprite.forEach(sprite => {
1578
- for (let j = Math.min(g_stateObj.layerNum, 4) / 2; j < Math.min(g_stateObj.layerNum, 4); j++) {
1581
+ for (let j = g_stateObj.layerNumDf; j < g_stateObj.layerNum; j++) {
1579
1582
  addY(`${sprite}${j}`, `stepArea`, halfwayOffset(j));
1580
1583
  }
1581
1584
  });
1582
1585
  }],
1583
1586
  ['X-Flower', () => {
1584
- for (let j = 0; j < Math.min(g_stateObj.layerNum, 4); j++) {
1585
- addTransform(`mainSprite${j}`, `stepArea`, `rotate(${(j % 2 === 0 ? 1 : -1) * (j % 4 < 2 ? 1 : -1) * -15}deg)`);
1587
+ for (let j = 0; j < g_stateObj.layerNum; j++) {
1588
+ addTransform(`mainSprite${j}`, `stepArea`, `rotate(${(j % 2 === 0 ? 1 : -1) * (j < g_stateObj.layerNumDf ? 1 : -1) * -15}deg)`);
1586
1589
  }
1587
1590
  }],
1588
1591
  ]);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "42.2.3",
3
+ "version": "42.3.0",
4
4
  "description": "Dancing☆Onigiri (CW Edition) - Web-based Rhythm Game",
5
5
  "main": "./js/danoni_main.js",
6
6
  "scripts": {