danoniplus 30.1.2 → 30.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 : 2023/02/15
7
+ * Revised : 2023/02/17
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 30.1.2`;
12
- const g_revisedDate = `2023/02/15`;
11
+ const g_version = `Ver 30.2.0`;
12
+ const g_revisedDate = `2023/02/17`;
13
13
  const g_alphaVersion = ``;
14
14
 
15
15
  // カスタム用バージョン (danoni_custom.js 等で指定可)
@@ -7134,6 +7134,31 @@ const scoreConvert = (_dosObj, _scoreId, _preblankFrame, _dummyNo = ``,
7134
7134
  return [];
7135
7135
  };
7136
7136
 
7137
+ /**
7138
+ * スクロール変化データの分解
7139
+ * @param {number} _scoreNo
7140
+ */
7141
+ const setScrollchData = (_scoreNo) => {
7142
+ const dosScrollchData = _dosObj[`scrollch${_scoreNo}_data`] || _dosObj.scrollch_data;
7143
+ const scrollchData = [];
7144
+
7145
+ if (hasVal(dosScrollchData)) {
7146
+ splitLF(dosScrollchData).filter(data => hasVal(data)).forEach(tmpData => {
7147
+ const tmpScrollchData = tmpData.split(`,`);
7148
+ if (isNaN(parseInt(tmpScrollchData[0]))) {
7149
+ return;
7150
+ }
7151
+ const frame = calcFrame(tmpScrollchData[0]);
7152
+ const arrowNum = parseFloat(tmpScrollchData[1]);
7153
+ const scrollDir = parseFloat(tmpScrollchData[2] ?? `1`);
7154
+
7155
+ scrollchData.push([frame, frame, arrowNum, scrollDir]);
7156
+ });
7157
+ return scrollchData.sort((_a, _b) => _a[0] - _b[0]).flat();
7158
+ }
7159
+ return [];
7160
+ };
7161
+
7137
7162
  /**
7138
7163
  * 譜面データの優先順配列の取得
7139
7164
  * @param {string} _header
@@ -7155,24 +7180,23 @@ const scoreConvert = (_dosObj, _scoreId, _preblankFrame, _dummyNo = ``,
7155
7180
  const getPriorityHeader = _ => {
7156
7181
  const list = [];
7157
7182
  const anotherKeyFlg = hasVal(g_keyObj[`transKey${_keyCtrlPtn}`]);
7158
- const addPriorityList = (_type = ``) => {
7159
- if (anotherKeyFlg) {
7160
- list.push(`${_type}A`);
7161
- }
7162
- list.push(_type);
7163
- };
7164
7183
  let type = ``;
7165
7184
  if (g_stateObj.scroll !== `---`) {
7166
7185
  type = `Alt`;
7167
7186
  } else if (g_stateObj.reverse === C_FLG_ON) {
7168
7187
  type = `Rev`;
7169
7188
  }
7170
- if (type !== ``) {
7171
- addPriorityList(type);
7189
+
7190
+ if (anotherKeyFlg) {
7191
+ list.push(`${g_stateObj.scroll}A`);
7192
+ list.push(`${type}A`);
7193
+ list.push(`A`);
7172
7194
  }
7173
- addPriorityList();
7195
+ list.push(g_stateObj.scroll);
7196
+ list.push(type);
7197
+ list.push(``);
7174
7198
 
7175
- return list;
7199
+ return makeDedupliArray(list);
7176
7200
  };
7177
7201
 
7178
7202
  /**
@@ -7327,6 +7351,9 @@ const scoreConvert = (_dosObj, _scoreId, _preblankFrame, _dummyNo = ``,
7327
7351
  obj.dummyFrzCssMotionData = setCssMotionData(`frz`, _dummyNo);
7328
7352
  }
7329
7353
 
7354
+ // スクロール変化データの分解
7355
+ obj.scrollchData = setScrollchData(scoreIdHeader);
7356
+
7330
7357
  // 歌詞データの分解 (3つで1セット, セット毎の改行区切り可)
7331
7358
  obj.wordData = [];
7332
7359
  obj.wordMaxDepth = -1;
@@ -7368,7 +7395,7 @@ const scoreConvert = (_dosObj, _scoreId, _preblankFrame, _dummyNo = ``,
7368
7395
  // キー変化定義
7369
7396
  obj.keychFrames = [];
7370
7397
  if (hasVal(_dosObj[`keych${setScoreIdHeader(g_stateObj.scoreId, g_stateObj.scoreLockFlg)}_data`])) {
7371
- const keychdata = _dosObj[`keych${setScoreIdHeader(g_stateObj.scoreId, g_stateObj.scoreLockFlg)}_data`]?.split(`,`);
7398
+ const keychdata = splitLF2(_dosObj[`keych${setScoreIdHeader(g_stateObj.scoreId, g_stateObj.scoreLockFlg)}_data`], `,`);
7372
7399
  obj.keychFrames = keychdata.filter((val, j) => j % 2 === 0);
7373
7400
  obj.keychTarget = keychdata.filter((val, j) => j % 2 === 1);
7374
7401
  } else {
@@ -7688,26 +7715,27 @@ const pushArrows = (_dataObj, _speedOnFrame, _motionOnFrame, _firstArrivalFrame)
7688
7715
  }
7689
7716
 
7690
7717
  // 個別加速のタイミング更新
7691
- let tmpObj;
7692
- g_workObj.boostData = [];
7693
- g_workObj.boostData.length = 0;
7694
- if (hasArrayList(_dataObj.boostData, 2)) {
7695
- let delBoostIdx = 0;
7696
- for (let k = _dataObj.boostData.length - 2; k >= 0; k -= 2) {
7697
- tmpObj = getArrowStartFrame(_dataObj.boostData[k], _speedOnFrame, _motionOnFrame);
7698
- if (tmpObj.frm < g_scoreObj.frameNum) {
7699
- _dataObj.boostData[k] = g_scoreObj.frameNum;
7700
- delBoostIdx = k;
7701
- break;
7702
- } else {
7703
- _dataObj.boostData[k] = tmpObj.frm;
7718
+ const getTimingData = _data => {
7719
+ if (hasArrayList(_data, 2)) {
7720
+ let delIdx = 0;
7721
+ for (let k = _data.length - 2; k >= 0; k -= 2) {
7722
+ const tmpObj = getArrowStartFrame(_data[k], _speedOnFrame, _motionOnFrame);
7723
+ if (tmpObj.frm < g_scoreObj.frameNum) {
7724
+ _data[k] = g_scoreObj.frameNum;
7725
+ delIdx = k;
7726
+ break;
7727
+ } else {
7728
+ _data[k] = tmpObj.frm;
7729
+ }
7704
7730
  }
7731
+ for (let k = 0; k < delIdx; k++) {
7732
+ _data.shift();
7733
+ }
7734
+ return copyArray2d(_data);
7705
7735
  }
7706
- for (let k = 0; k < delBoostIdx; k++) {
7707
- _dataObj.boostData.shift();
7708
- }
7709
- g_workObj.boostData = copyArray2d(_dataObj.boostData);
7710
- }
7736
+ return [];
7737
+ };
7738
+ g_workObj.boostData = getTimingData(_dataObj.boostData);
7711
7739
 
7712
7740
  /**
7713
7741
  * 色変化・モーションデータのタイミング更新
@@ -7823,6 +7851,8 @@ const pushArrows = (_dataObj, _speedOnFrame, _motionOnFrame, _firstArrivalFrame)
7823
7851
  g_typeLists.arrow.forEach(header =>
7824
7852
  calcDataTiming(`cssMotion`, header, pushCssMotions, { _calcFrameFlg: true }));
7825
7853
 
7854
+ calcDataTiming(`scrollch`, ``, pushScrollchs, { _calcFrameFlg: true });
7855
+
7826
7856
  g_fadeinStockList.forEach(type =>
7827
7857
  _dataObj[`${type}Data`] = calcAnimationData(type, _dataObj[`${type}Data`]));
7828
7858
 
@@ -8056,6 +8086,48 @@ const pushCssMotions = (_header, _frame, _val, _styleName, _styleNameRev) => {
8056
8086
  }
8057
8087
  };
8058
8088
 
8089
+ /**
8090
+ * スクロール変化情報の格納
8091
+ * @param {string} _header
8092
+ * @param {number} _frameArrow
8093
+ * @param {number} _frameStep
8094
+ * @param {number} _val
8095
+ * @param {number} _scrollDir
8096
+ */
8097
+ const pushScrollchs = (_header, _frameArrow, _frameStep, _val, _scrollDir) => {
8098
+ const tkObj = getKeyInfo();
8099
+
8100
+ const frameArrow = Math.max(_frameArrow, g_scoreObj.frameNum);
8101
+ const frameStep = Math.max(_frameStep, g_scoreObj.frameNum);
8102
+
8103
+ if (g_workObj.mkScrollchArrow[frameArrow] === undefined) {
8104
+ g_workObj.mkScrollchArrow[frameArrow] = [];
8105
+ g_workObj.mkScrollchArrowDir[frameArrow] = [];
8106
+ }
8107
+ if (g_workObj.mkScrollchStep[frameStep] === undefined) {
8108
+ g_workObj.mkScrollchStep[frameStep] = [];
8109
+ g_workObj.mkScrollchStepDir[frameStep] = [];
8110
+ }
8111
+ if (_val < 20 || _val >= 1000) {
8112
+ const realVal = g_workObj.replaceNums[_val % 1000];
8113
+ g_workObj.mkScrollchArrow[frameArrow].push(realVal);
8114
+ g_workObj.mkScrollchArrowDir[frameArrow].push(_scrollDir);
8115
+ g_workObj.mkScrollchStep[frameStep].push(realVal);
8116
+ g_workObj.mkScrollchStepDir[frameStep].push(_scrollDir);
8117
+
8118
+ } else {
8119
+ const colorNum = _val - 20;
8120
+ for (let j = 0; j < tkObj.keyNum; j++) {
8121
+ if (g_keyObj[`color${tkObj.keyCtrlPtn}`][j] === colorNum) {
8122
+ g_workObj.mkScrollchArrow[frameArrow].push(j);
8123
+ g_workObj.mkScrollchArrowDir[frameArrow].push(_scrollDir);
8124
+ g_workObj.mkScrollchStep[frameStep].push(j);
8125
+ g_workObj.mkScrollchStepDir[frameStep].push(_scrollDir);
8126
+ }
8127
+ }
8128
+ }
8129
+ };
8130
+
8059
8131
  /**
8060
8132
  * メイン画面前の初期化処理
8061
8133
  */
@@ -8071,6 +8143,7 @@ const getArrowSettings = _ => {
8071
8143
 
8072
8144
  g_workObj.stepX = [];
8073
8145
  g_workObj.scrollDir = [];
8146
+ g_workObj.scrollDirDefault = [];
8074
8147
  g_workObj.dividePos = [];
8075
8148
  g_workObj.stepRtn = copyArray2d(g_keyObj[`stepRtn${keyCtrlPtn}`]);
8076
8149
  g_workObj.stepHitRtn = copyArray2d(g_keyObj[`stepRtn${keyCtrlPtn}`]);
@@ -8142,6 +8215,7 @@ const getArrowSettings = _ => {
8142
8215
  });
8143
8216
  });
8144
8217
  }
8218
+ g_workObj.scrollDirDefault = g_workObj.scrollDir.concat();
8145
8219
 
8146
8220
  Object.keys(g_resultObj).forEach(judgeCnt => g_resultObj[judgeCnt] = 0);
8147
8221
  g_resultObj.spState = ``;
@@ -9333,6 +9407,10 @@ const mainInit = _ => {
9333
9407
  keychCnts++;
9334
9408
  }
9335
9409
 
9410
+ // スクロール変化
9411
+ changeScrollArrowDirs(currentFrame);
9412
+ changeStepY(currentFrame);
9413
+
9336
9414
  // ダミー矢印生成(背面に表示するため先に処理)
9337
9415
  if (g_workObj.mkDummyArrow[currentFrame] !== undefined) {
9338
9416
  g_workObj.mkDummyArrow[currentFrame].forEach(data =>
@@ -9626,6 +9704,38 @@ const changeCssMotions = (_header, _name, _frameNum) => {
9626
9704
  }
9627
9705
  };
9628
9706
 
9707
+ /**
9708
+ * スクロール方向の変更(矢印・フリーズアロー)
9709
+ * @param {number} _frameNum
9710
+ */
9711
+ const changeScrollArrowDirs = (_frameNum) => {
9712
+ const frameData = g_workObj.mkScrollchArrow[_frameNum];
9713
+ if (frameData !== undefined) {
9714
+ for (let j = 0; j < frameData.length; j++) {
9715
+ const targetj = frameData[j];
9716
+ g_workObj.scrollDir[targetj] = g_workObj.scrollDirDefault[targetj] * g_workObj.mkScrollchArrowDir[_frameNum][j];
9717
+ g_workObj.dividePos[targetj] = (g_workObj.scrollDir[targetj] === 1 ? 0 : 1);
9718
+ }
9719
+ }
9720
+ };
9721
+
9722
+ /**
9723
+ * ステップゾーンの位置反転
9724
+ * @param {number} _frameNum
9725
+ */
9726
+ const changeStepY = (_frameNum) => {
9727
+ const frameData = g_workObj.mkScrollchStep[_frameNum];
9728
+ if (frameData !== undefined) {
9729
+ for (let j = 0; j < frameData.length; j++) {
9730
+ const targetj = frameData[j];
9731
+ const dividePos = (g_workObj.scrollDirDefault[targetj] * g_workObj.mkScrollchStepDir[_frameNum][j] === 1 ? 0 : 1);
9732
+ const baseY = C_STEP_Y + g_posObj.reverseStepY * dividePos;
9733
+ $id(`stepRoot${targetj}`).top = `${baseY}px`;
9734
+ $id(`frzHit${targetj}`).top = `${baseY}px`;
9735
+ }
9736
+ }
9737
+ };
9738
+
9629
9739
  /**
9630
9740
  * フリーズアローヒット時の描画変更
9631
9741
  * @param {number} _j
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Source by tickle
7
7
  * Created : 2019/11/19
8
- * Revised : 2023/02/14 (v30.1.1)
8
+ * Revised : 2023/02/17 (v30.2.0)
9
9
  *
10
10
  * https://github.com/cwtickle/danoniplus
11
11
  */
@@ -486,7 +486,7 @@ const g_typeLists = {
486
486
  frzColor: [`Normal`, `NormalBar`, `Hit`, `HitBar`],
487
487
  dataList: [
488
488
  `Arrow`, `FrzArrow`, `FrzLength`,
489
- `Color`, `ColorCd`,
489
+ `Color`, `ColorCd`, `ScrollchArrow`, `ScrollchStep`, `ScrollchArrowDir`, `ScrollchStepDir`,
490
490
  `FColorNormal`, `FColorNormalCd`, `FColorNormalBar`, `FColorNormalBarCd`,
491
491
  `FColorHit`, `FColorHitCd`, `FColorHitBar`, `FColorHitBarCd`,
492
492
  `ArrowCssMotion`, `ArrowCssMotionName`,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "30.1.2",
3
+ "version": "30.2.0",
4
4
  "description": "Dancing☆Onigiri (CW Edition) - Web-based Rhythm Game",
5
5
  "main": "index.js",
6
6
  "scripts": {