danoniplus 50.3.1 → 50.4.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.
Files changed (2) hide show
  1. package/js/danoni_main.js +59 -81
  2. package/package.json +1 -1
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/09/10
7
+ * Revised : 2026/09/12
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 50.3.1`;
12
- const g_revisedDate = `2026/09/10`;
11
+ const g_version = `Ver 50.4.0`;
12
+ const g_revisedDate = `2026/09/12`;
13
13
 
14
14
  // カスタム用バージョン (danoni_custom.js 等で指定可)
15
15
  let g_localVersion = ``;
@@ -13893,15 +13893,6 @@ const pushArrows = (_dataObj, _speedOnFrame, _firstArrivalFrame) => {
13893
13893
  [``, `Dummy`].forEach(header =>
13894
13894
  g_typeLists.dataList.forEach(name => g_workObj[`mk${header}${name}`] = []));
13895
13895
 
13896
- /** 矢印の移動距離 */
13897
- g_workObj.initY = [];
13898
- /** 矢印の移動距離 (Motion加算分) */
13899
- g_workObj.initBoostY = [];
13900
- /** 矢印がステップゾーンに到達するまでのフレーム数 */
13901
- g_workObj.arrivalFrame = [];
13902
- /** Motionの適用フレーム数 */
13903
- g_workObj.motionFrame = [];
13904
-
13905
13896
  const boostData = [];
13906
13897
  if (hasArrayList(_dataObj.boostData, 2)) {
13907
13898
  const _data = _dataObj.boostData.concat();
@@ -13976,14 +13967,13 @@ const pushArrows = (_dataObj, _speedOnFrame, _firstArrivalFrame) => {
13976
13967
  return;
13977
13968
  }
13978
13969
 
13979
- const calcInitBoostY = _frm => sumData(g_workObj.motionOnFrames.filter((val, j) => j <= g_workObj.motionFrame[_frm]));
13970
+ const calcInitBoostY = _arrivalFrame => sumData(g_workObj.motionOnFrames.filter((val, j) => j <= _arrivalFrame));
13980
13971
  const camelHeader = toCapitalize(_header);
13981
13972
  const setcnt = (_frzFlg ? 2 : 1);
13982
13973
  if (_frzFlg && _data.length % 2 !== 0) {
13983
13974
  _data.pop();
13984
13975
  }
13985
13976
 
13986
- const startPoint = [];
13987
13977
  let spdNext = Infinity;
13988
13978
  let spdk = (_dataObj.speedData?.length ?? 0) - 2;
13989
13979
  let spdPrev = _dataObj.speedData?.[spdk] ?? 0;
@@ -13993,19 +13983,15 @@ const pushArrows = (_dataObj, _speedOnFrame, _firstArrivalFrame) => {
13993
13983
  let arrowArrivalFrm = _data[lastk];
13994
13984
  let tmpObj = getArrowStartFrame(arrowArrivalFrm, _speedOnFrame);
13995
13985
 
13996
- startPoint[lastk] = tmpObj.frm;
13997
- let frmPrev = tmpObj.frm;
13998
- g_workObj.initY[frmPrev] = tmpObj.startY;
13999
- g_workObj.arrivalFrame[frmPrev] = tmpObj.arrivalFrm;
14000
- g_workObj.motionFrame[frmPrev] = tmpObj.motionFrm;
14001
- g_workObj.initBoostY[frmPrev] = calcInitBoostY(frmPrev);
14002
- let minNotesFrame = startPoint[lastk];
13986
+ let startPoint = tmpObj.frm;
13987
+ let arrivalFrm = tmpObj.arrivalFrm;
13988
+ let minNotesFrame = startPoint;
14003
13989
 
14004
13990
  if (_frzFlg) {
14005
13991
  g_workObj[`mk${camelHeader}Length`][_j] = [];
14006
13992
  }
14007
- setNotes(_j, lastk, _data, startPoint[lastk], camelHeader, _frzFlg, {
14008
- initY: tmpObj.startY, initBoostY: g_workObj.initBoostY[frmPrev],
13993
+ setNotes(_j, lastk, _data, startPoint, camelHeader, _frzFlg, {
13994
+ initY: tmpObj.startY, initBoostY: calcInitBoostY(tmpObj.motionFrm),
14009
13995
  arrivalFrame: tmpObj.arrivalFrm, motionFrame: tmpObj.motionFrm, boostSpd: getSpdByFrame(arrowArrivalFrm)
14010
13996
  });
14011
13997
 
@@ -14021,16 +14007,11 @@ const pushArrows = (_dataObj, _speedOnFrame, _firstArrivalFrame) => {
14021
14007
  }
14022
14008
  break;
14023
14009
 
14024
- } else if ((arrowArrivalFrm - g_workObj.arrivalFrame[frmPrev] > spdPrev)
14010
+ } else if ((arrowArrivalFrm - arrivalFrm > spdPrev)
14025
14011
  && arrowArrivalFrm < spdNext) {
14026
14012
 
14027
- // 最初から最後まで同じスピードのときは前回のデータを流用
14028
- const tmpFrame = arrowArrivalFrm - g_workObj.arrivalFrame[frmPrev];
14029
- startPoint[k] = tmpFrame;
14030
- g_workObj.initY[tmpFrame] = g_workObj.initY[frmPrev];
14031
- g_workObj.arrivalFrame[tmpFrame] = g_workObj.arrivalFrame[frmPrev];
14032
- g_workObj.motionFrame[tmpFrame] = g_workObj.motionFrame[frmPrev];
14033
- g_workObj.initBoostY[tmpFrame] = calcInitBoostY(tmpFrame);
14013
+ // 最初から最後まで同じスピードのときは前回のデータを流用(ステップゾーン到達フレーム - 移動フレーム)
14014
+ startPoint = arrowArrivalFrm - arrivalFrm;
14034
14015
 
14035
14016
  } else {
14036
14017
 
@@ -14041,53 +14022,28 @@ const pushArrows = (_dataObj, _speedOnFrame, _firstArrivalFrame) => {
14041
14022
  spdPrev = _dataObj.speedData[spdk];
14042
14023
  }
14043
14024
  tmpObj = getArrowStartFrame(arrowArrivalFrm, _speedOnFrame);
14044
-
14045
- startPoint[k] = tmpObj.frm;
14046
- frmPrev = tmpObj.frm;
14047
- g_workObj.initY[frmPrev] = tmpObj.startY;
14048
- g_workObj.arrivalFrame[frmPrev] = tmpObj.arrivalFrm;
14049
- g_workObj.motionFrame[frmPrev] = tmpObj.motionFrm;
14050
- g_workObj.initBoostY[frmPrev] = calcInitBoostY(frmPrev);
14051
- }
14052
-
14053
- // --- 逆転検知ロジック ---
14054
- // 後ろからループしているため、minNotesFrameには「自分より譜面上後ろにあるノーツ」の
14055
- // 最小生成フレーム(最も早く出現するもの)が入っている。
14056
-
14057
- // 「自分より後ろのノーツ」の方が、「自分」よりも早く出現する場合、
14058
- // 配列の順序と出現時間の順序が入れ替わっている(逆転)とみなす。
14059
- // 逆転している場合は、最小生成フレームまでさらに遡って、出現フレームを再計算する。
14060
- if (minNotesFrame < startPoint[k]) {
14061
-
14062
- const getAdjArrowStartFrame = (_obj, _speedOnFrame, _targetFrame) => {
14063
- while (_obj.frm > _targetFrame) {
14064
- _obj.startY += _speedOnFrame[_obj.frm - 1];
14065
-
14066
- if (_speedOnFrame[_obj.frm - 1] !== 0) {
14067
- _obj.motionFrm++;
14068
- }
14069
- _obj.frm--;
14070
- _obj.arrivalFrm++;
14071
- }
14072
- return _obj;
14073
- };
14074
- tmpObj = getAdjArrowStartFrame(tmpObj, _speedOnFrame, minNotesFrame);
14075
- startPoint[k] = tmpObj.frm;
14076
- frmPrev = tmpObj.frm;
14077
- g_workObj.initY[frmPrev] = tmpObj.startY;
14078
- g_workObj.arrivalFrame[frmPrev] = tmpObj.arrivalFrm;
14079
- g_workObj.motionFrame[frmPrev] = tmpObj.motionFrm;
14080
- g_workObj.initBoostY[frmPrev] = calcInitBoostY(frmPrev);
14025
+ startPoint = tmpObj.frm;
14026
+ arrivalFrm = tmpObj.arrivalFrm;
14027
+
14028
+ // --- 逆転検知ロジック ---
14029
+ // 後ろからループしているため、minNotesFrameには「自分より譜面上後ろにあるノーツ」の
14030
+ // 最小生成フレーム(最も早く出現するもの)が入っている。
14031
+
14032
+ // 「自分より後ろのノーツ」の方が、「自分」よりも早く出現する場合、
14033
+ // 配列の順序と出現時間の順序が入れ替わっている(逆転)とみなす。
14034
+ // 逆転している場合は、最小生成フレームまでさらに遡って、出現フレームを再計算する。
14035
+ if (minNotesFrame < startPoint) {
14036
+ tmpObj = getAdjArrowStartFrame({ ...tmpObj, frm: startPoint }, _speedOnFrame, minNotesFrame);
14037
+ startPoint = tmpObj.frm;
14038
+ arrivalFrm = tmpObj.arrivalFrm;
14039
+ }
14081
14040
  }
14082
-
14083
14041
  // 最小値を更新
14084
- if (startPoint[k] < minNotesFrame) {
14085
- minNotesFrame = startPoint[k];
14086
- }
14042
+ minNotesFrame = Math.min(minNotesFrame, startPoint);
14087
14043
 
14088
14044
  // 出現タイミングを保存
14089
- setNotes(_j, k, _data, startPoint[k], camelHeader, _frzFlg, {
14090
- initY: tmpObj.startY, initBoostY: g_workObj.initBoostY[frmPrev],
14045
+ setNotes(_j, k, _data, startPoint, camelHeader, _frzFlg, {
14046
+ initY: tmpObj.startY, initBoostY: calcInitBoostY(tmpObj.motionFrm),
14091
14047
  arrivalFrame: tmpObj.arrivalFrm, motionFrame: tmpObj.motionFrm, boostSpd: getSpdByFrame(arrowArrivalFrm)
14092
14048
  });
14093
14049
  }
@@ -14125,6 +14081,7 @@ const pushArrows = (_dataObj, _speedOnFrame, _firstArrivalFrame) => {
14125
14081
  return;
14126
14082
  }
14127
14083
  const frontData = [];
14084
+ let minDataFrame = Infinity;
14128
14085
  for (let k = baseData.length - _term; k >= 0; k -= _term) {
14129
14086
  const calcFrameFlg = (_colorFlg && !baseData[k + 3]) || _calcFrameFlg;
14130
14087
 
@@ -14135,13 +14092,19 @@ const pushArrows = (_dataObj, _speedOnFrame, _firstArrivalFrame) => {
14135
14092
  }
14136
14093
  } else {
14137
14094
  if (calcFrameFlg) {
14138
- const tmpObj = getArrowStartFrame(baseData[k], _speedOnFrame);
14095
+ let tmpObj = getArrowStartFrame(baseData[k], _speedOnFrame);
14096
+
14097
+ // 到達フレームがより早い(=baseData[k]がより小さい)要素なのに、
14098
+ // より遅い要素より後ろで出現してしまう場合は矢印と同様に補正する
14099
+ if (minDataFrame < tmpObj.frm) {
14100
+ tmpObj = getAdjArrowStartFrame(tmpObj, _speedOnFrame, minDataFrame);
14101
+ }
14139
14102
  if (tmpObj.frm < g_scoreObj.frameNum) {
14140
14103
  const diff = g_scoreObj.frameNum - tmpObj.frm;
14141
14104
  tmpObj.frm = g_scoreObj.frameNum;
14142
14105
  tmpObj.arrivalFrm -= diff;
14143
14106
  }
14144
- g_workObj.arrivalFrame[tmpObj.frm] = tmpObj.arrivalFrm;
14107
+ minDataFrame = Math.min(minDataFrame, tmpObj.frm);
14145
14108
  baseData[k] = tmpObj.frm;
14146
14109
  }
14147
14110
  _setFunc(toCapitalize(_header), ...baseData.slice(k, k + _term));
@@ -14246,6 +14209,26 @@ const pushArrows = (_dataObj, _speedOnFrame, _firstArrivalFrame) => {
14246
14209
  }
14247
14210
  };
14248
14211
 
14212
+ /**
14213
+ * 出現フレームを指定フレームまで強制的に遡って再計算する(逆転補正用)
14214
+ * @param {object} _obj getArrowStartFrameの戻り値
14215
+ * @param {object} _speedOnFrame
14216
+ * @param {number} _targetFrame
14217
+ * @returns {{ frm: number, startY: number, arrivalFrm: number, motionFrm: number }}
14218
+ */
14219
+ const getAdjArrowStartFrame = (_obj, _speedOnFrame, _targetFrame) => {
14220
+ while (_obj.frm > _targetFrame) {
14221
+ _obj.startY += _speedOnFrame[_obj.frm - 1];
14222
+
14223
+ if (_speedOnFrame[_obj.frm - 1] !== 0) {
14224
+ _obj.motionFrm++;
14225
+ }
14226
+ _obj.frm--;
14227
+ _obj.arrivalFrm++;
14228
+ }
14229
+ return _obj;
14230
+ };
14231
+
14249
14232
  /**
14250
14233
  * ステップゾーン到達地点から逆算して開始フレームを取得
14251
14234
  * @param {number} _frame
@@ -14579,11 +14562,6 @@ const getArrowSettings = () => {
14579
14562
  g_keyCopyLists.simpleDef.forEach(header => updateKeyInfo(header, keyCtrlPtn));
14580
14563
  g_headerObj.tuning = g_headerObj.creatorNames[g_stateObj.scoreId];
14581
14564
 
14582
- delete g_workObj.initY;
14583
- delete g_workObj.initBoostY;
14584
- delete g_workObj.arrivalFrame;
14585
- delete g_workObj.motionFrame;
14586
-
14587
14565
  // 各種初期化
14588
14566
  // g_workObj.frzArrowInitRtnはフリーズアロー(初期表示)としての利用に限定
14589
14567
  g_workObj.stepX = [];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "50.3.1",
3
+ "version": "50.4.0",
4
4
  "description": "Dancing☆Onigiri (CW Edition) - Web-based Rhythm Game",
5
5
  "main": "./js/danoni_main.js",
6
6
  "jsdelivr": "./js/danoni_main.js",