danoniplus 47.3.2 → 47.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 +46 -51
  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/04/25
7
+ * Revised : 2026/04/26
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 47.3.2`;
12
- const g_revisedDate = `2026/04/25`;
11
+ const g_version = `Ver 47.4.0`;
12
+ const g_revisedDate = `2026/04/26`;
13
13
 
14
14
  // カスタム用バージョン (danoni_custom.js 等で指定可)
15
15
  let g_localVersion = ``;
@@ -11784,6 +11784,24 @@ const pushArrows = (_dataObj, _speedOnFrame, _firstArrivalFrame) => {
11784
11784
  /** Motionの適用フレーム数 */
11785
11785
  g_workObj.motionFrame = [];
11786
11786
 
11787
+ const boostData = [];
11788
+ if (hasArrayList(_dataObj.boostData, 2)) {
11789
+ const _data = _dataObj.boostData.concat();
11790
+ for (let k = 0; k < _data.length; k += 2) {
11791
+ boostData.push({ frame: _data[k], spd: getSpeedFactor(_data[k + 1]) });
11792
+ }
11793
+ if (boostData.length > 0 && boostData[0].frame > 0) {
11794
+ boostData.unshift({ frame: 0, spd: 1 });
11795
+ }
11796
+ }
11797
+ const getSpdByFrame = _targetFrame => {
11798
+ // targetFrame 以下の frame を持つ要素の中で、最後(最新)のものを見つける
11799
+ const result = boostData.findLast((item) => _targetFrame >= item.frame);
11800
+
11801
+ // 該当するものがない場合(frame: 0 未満など)のフォールバック
11802
+ return result ? result.spd : 1;
11803
+ };
11804
+
11787
11805
  /**
11788
11806
  * 矢印・フリーズアローのデータ格納処理
11789
11807
  * @param {number} _j
@@ -11797,9 +11815,14 @@ const pushArrows = (_dataObj, _speedOnFrame, _firstArrivalFrame) => {
11797
11815
  * @param {number} object.arrivalFrame
11798
11816
  * @param {number} object.motionFrame
11799
11817
  */
11800
- const setNotes = (_j, _k, _data, _startPoint, _header, _frzFlg = false, { initY, initBoostY, arrivalFrame, motionFrame } = {}) => {
11818
+ const setNotes = (_j, _k, _data, _startPoint, _header, _frzFlg = false, { initY, initBoostY, arrivalFrame, motionFrame, boostSpd } = {}) => {
11801
11819
  if (_startPoint >= 0) {
11802
- const arrowAttrs = { pos: _j, initY, initBoostY, arrivalFrame, motionFrame };
11820
+ const arrowAttrs = {
11821
+ pos: _j, initY, initBoostY, arrivalFrame, motionFrame, boostSpd,
11822
+ get boostDir() {
11823
+ return Math.sign(this.boostSpd);
11824
+ }
11825
+ };
11803
11826
  if (g_workObj[`mk${_header}Arrow`][_startPoint] === undefined) {
11804
11827
  g_workObj[`mk${_header}Arrow`][_startPoint] = [arrowAttrs];
11805
11828
  } else {
@@ -11863,8 +11886,10 @@ const pushArrows = (_dataObj, _speedOnFrame, _firstArrivalFrame) => {
11863
11886
  if (_frzFlg) {
11864
11887
  g_workObj[`mk${camelHeader}Length`][_j] = [];
11865
11888
  }
11866
- setNotes(_j, lastk, _data, startPoint[lastk], camelHeader, _frzFlg,
11867
- { initY: tmpObj.startY, initBoostY: g_workObj.initBoostY[frmPrev], arrivalFrame: tmpObj.arrivalFrm, motionFrame: tmpObj.motionFrm });
11889
+ setNotes(_j, lastk, _data, startPoint[lastk], camelHeader, _frzFlg, {
11890
+ initY: tmpObj.startY, initBoostY: g_workObj.initBoostY[frmPrev],
11891
+ arrivalFrame: tmpObj.arrivalFrm, motionFrame: tmpObj.motionFrm, boostSpd: getSpdByFrame(arrowArrivalFrm)
11892
+ });
11868
11893
 
11869
11894
  // 矢印は1つずつ、フリーズアローは2つで1セット
11870
11895
  for (let k = lastk - setcnt; k >= 0; k -= setcnt) {
@@ -11943,9 +11968,10 @@ const pushArrows = (_dataObj, _speedOnFrame, _firstArrivalFrame) => {
11943
11968
  }
11944
11969
 
11945
11970
  // 出現タイミングを保存
11946
- setNotes(_j, k, _data, startPoint[k], camelHeader, _frzFlg,
11947
- { initY: tmpObj.startY, initBoostY: g_workObj.initBoostY[frmPrev], arrivalFrame: tmpObj.arrivalFrm, motionFrame: tmpObj.motionFrm }
11948
- );
11971
+ setNotes(_j, k, _data, startPoint[k], camelHeader, _frzFlg, {
11972
+ initY: tmpObj.startY, initBoostY: g_workObj.initBoostY[frmPrev],
11973
+ arrivalFrame: tmpObj.arrivalFrm, motionFrame: tmpObj.motionFrm, boostSpd: getSpdByFrame(arrowArrivalFrm)
11974
+ });
11949
11975
  }
11950
11976
  };
11951
11977
 
@@ -11960,30 +11986,6 @@ const pushArrows = (_dataObj, _speedOnFrame, _firstArrivalFrame) => {
11960
11986
  calcNotes(j, _dataObj.dummyFrzData[j], `dummyFrz`, true);
11961
11987
  }
11962
11988
 
11963
- // 個別加速のタイミング更新
11964
- const calcBoostData = _data => {
11965
- if (hasArrayList(_data, 2)) {
11966
- let delIdx = 0;
11967
- for (let k = _data.length - 2; k >= 0; k -= 2) {
11968
- const tmpObj = getArrowStartFrame(_data[k], _speedOnFrame);
11969
- if (tmpObj.frm < g_scoreObj.frameNum) {
11970
- _data[k] = g_scoreObj.frameNum;
11971
- delIdx = k;
11972
- break;
11973
- } else {
11974
- _data[k] = tmpObj.frm;
11975
- }
11976
- _data[k + 1] = getSpeedFactor(_data[k + 1]);
11977
- }
11978
- for (let k = 0; k < delIdx; k++) {
11979
- _data.shift();
11980
- }
11981
- return _data;
11982
- }
11983
- return [];
11984
- };
11985
- g_workObj.boostData = calcBoostData(_dataObj.boostData);
11986
-
11987
11989
  /**
11988
11990
  * 色変化・モーションデータ・スクロール反転データのタイミング更新
11989
11991
  * - この関数を使用する場合、配列グループの先頭2つが「フレーム数、矢印番号」となっていないと動作しない
@@ -13044,10 +13046,8 @@ const mainInit = () => {
13044
13046
  // EffectのArrowEffect追加処理
13045
13047
  g_effectFunc.get(g_stateObj.effect)();
13046
13048
 
13047
- // 現在の矢印・フリーズアローの速度、個別加算速度の初期化 (速度変化時に直す)
13049
+ // 現在の矢印・フリーズアローの速度の初期化 (速度変化時に直す)
13048
13050
  g_workObj.currentSpeed = 2;
13049
- g_workObj.boostSpd = 1;
13050
- g_workObj.boostDir = 1;
13051
13051
 
13052
13052
  // 開始位置、楽曲再生位置の設定
13053
13053
  const firstFrame = g_scoreObj.frameNum;
@@ -13718,8 +13718,8 @@ const mainInit = () => {
13718
13718
 
13719
13719
  const arrowName = `${_name}${_j}_${_arrowCnt}`;
13720
13720
  const stepY = C_STEP_Y + g_posObj.reverseStepY * dividePos;
13721
- const firstPosY = stepY + (_attrs.initY * g_workObj.boostSpd +
13722
- _attrs.initBoostY * g_workObj.boostDir) * g_workObj.scrollDir[_j];
13721
+ const firstPosY = stepY + (_attrs.initY * _attrs.boostSpd +
13722
+ _attrs.initBoostY * _attrs.boostDir) * g_workObj.scrollDir[_j];
13723
13723
 
13724
13724
  const arrowRoot = createEmptySprite(arrowSprite[g_workObj.dividePos[_j]], arrowName, {
13725
13725
  x: 0, y: 0, w: C_ARW_WIDTH, h: C_ARW_WIDTH,
@@ -13733,13 +13733,13 @@ const mainInit = () => {
13733
13733
  // 生存フレーム数 (ストップ分除去、個別加速/Motionオプション用)
13734
13734
  boostCnt: _attrs.motionFrame,
13735
13735
  // 個別加速量
13736
- boostSpd: g_workObj.boostSpd,
13736
+ boostSpd: _attrs.boostSpd,
13737
13737
  // ステップゾーン位置 (0: デフォルト, 1: リバース)
13738
13738
  dividePos: dividePos,
13739
13739
  // スクロール方向 (1: デフォルト, -1: リバース)
13740
13740
  dir: g_workObj.scrollDir[_j],
13741
13741
  // 個別加速方向 (1: 順方向加速, -1: 逆方向加速)
13742
- boostDir: g_workObj.boostDir,
13742
+ boostDir: _attrs.boostDir,
13743
13743
  // 前フレーム時の位置 (判定で使用)
13744
13744
  prevY: firstPosY,
13745
13745
  // 現フレーム時の位置
@@ -13834,9 +13834,9 @@ const mainInit = () => {
13834
13834
  const frzNo = `${_j}_${_arrowCnt}`;
13835
13835
  const frzName = `${_name}${frzNo}`;
13836
13836
  const stepY = C_STEP_Y + g_posObj.reverseStepY * dividePos;
13837
- const firstPosY = stepY + (_attrs.initY * g_workObj.boostSpd +
13838
- _attrs.initBoostY * g_workObj.boostDir) * g_workObj.scrollDir[_j];
13839
- const firstBarLength = g_workObj[`mk${toCapitalize(_name)}Length`][_j][(_arrowCnt - 1) * 2] * g_workObj.boostSpd;
13837
+ const firstPosY = stepY + (_attrs.initY * _attrs.boostSpd +
13838
+ _attrs.initBoostY * _attrs.boostDir) * g_workObj.scrollDir[_j];
13839
+ const firstBarLength = g_workObj[`mk${toCapitalize(_name)}Length`][_j][(_arrowCnt - 1) * 2] * _attrs.boostSpd;
13840
13840
 
13841
13841
  const frzRoot = createEmptySprite(arrowSprite[g_workObj.dividePos[_j]], frzName, {
13842
13842
  x: 0, y: 0, w: C_ARW_WIDTH, h: C_ARW_WIDTH + firstBarLength,
@@ -13864,13 +13864,13 @@ const mainInit = () => {
13864
13864
  // キーを離していたフレーム数 (基準値超えでNG判定)
13865
13865
  keyUpFrame: 0,
13866
13866
  // 個別加速量
13867
- boostSpd: g_workObj.boostSpd,
13867
+ boostSpd: _attrs.boostSpd,
13868
13868
  // ステップゾーン位置 (0: デフォルト, 1: リバース)
13869
13869
  dividePos: dividePos,
13870
13870
  // スクロール方向 (1: デフォルト, -1: リバース)
13871
13871
  dir: g_workObj.scrollDir[_j],
13872
13872
  // 個別加速方向 (1: 順方向加速, -1: 逆方向加速)
13873
- boostDir: g_workObj.boostDir,
13873
+ boostDir: _attrs.boostDir,
13874
13874
  // 現フレーム時のフリーズアロー本体の位置
13875
13875
  y: firstPosY,
13876
13876
  // フリーズアロー(帯)の相対位置
@@ -14082,11 +14082,6 @@ const mainInit = () => {
14082
14082
  g_workObj.currentSpeed = g_workObj.speedData[speedCnts + 1];
14083
14083
  speedCnts += 2;
14084
14084
  }
14085
- while (currentFrame >= g_workObj.boostData?.[boostCnts]) {
14086
- g_workObj.boostSpd = g_workObj.boostData[boostCnts + 1];
14087
- g_workObj.boostDir = (g_workObj.boostSpd > 0 ? 1 : -1);
14088
- boostCnts += 2;
14089
- }
14090
14085
 
14091
14086
  objList.forEach(header => {
14092
14087
  const headerU = toCapitalize(header);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "47.3.2",
3
+ "version": "47.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",