danoniplus 28.3.1 → 28.5.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 : 2022/10/16
7
+ * Revised : 2022/10/29
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 28.3.1`;
12
- const g_revisedDate = `2022/10/16`;
11
+ const g_version = `Ver 28.5.0`;
12
+ const g_revisedDate = `2022/10/29`;
13
13
  const g_alphaVersion = ``;
14
14
 
15
15
  // カスタム用バージョン (danoni_custom.js 等で指定可)
@@ -7345,34 +7345,39 @@ const setSpeedOnFrame = (_speedData, _lastFrame) => {
7345
7345
 
7346
7346
  /**
7347
7347
  * Motionオプション適用時の矢印別の速度設定
7348
- * - 配列の数字は小さいほどステップゾーンに近いことを示す。
7349
- * - 15がステップゾーン上、0~14は矢印の枠外管理用
7348
+ * - 矢印が表示される最大フレーム数を 縦ピクセル数×20 と定義。
7350
7349
  */
7351
- const setMotionOnFrame = _ => {
7350
+ const setMotionOnFrame = _ => g_motionFunc[g_stateObj.motion]([...Array(g_sHeight * 20 + 1)].fill(0));
7352
7351
 
7353
- // 矢印が表示される最大フレーム数
7354
- const motionLastFrame = g_sHeight * 20;
7355
- const brakeLastFrame = g_sHeight / 2;
7356
-
7357
- const motionOnFrame = [...Array(motionLastFrame + 1)].fill(0);
7358
-
7359
- if (g_stateObj.motion === C_FLG_OFF) {
7360
- } else if (g_stateObj.motion === `Boost`) {
7361
- // ステップゾーンに近づくにつれて加速量を大きくする (16 85)
7362
- for (let j = C_MOTION_STD_POS + 1; j < C_MOTION_STD_POS + 70; j++) {
7363
- motionOnFrame[j] = (C_MOTION_STD_POS + 70 - j) * 3 / 50;
7364
- }
7365
- } else if (g_stateObj.motion === `Brake`) {
7366
- // 初期は+2x、ステップゾーンに近づくにつれて加速量を下げる (20 → 34)
7367
- for (let j = C_MOTION_STD_POS + 5; j < C_MOTION_STD_POS + 19; j++) {
7368
- motionOnFrame[j] = (j - 15) * 4 / 14;
7369
- }
7370
- for (let j = C_MOTION_STD_POS + 19; j <= brakeLastFrame; j++) {
7371
- motionOnFrame[j] = 4;
7372
- }
7352
+ /**
7353
+ * Boost用の適用関数
7354
+ * - ステップゾーンに近づくにつれて加速量を大きく/小さくする (16 → 85)
7355
+ * @param {array} _frms
7356
+ * @param {number} _spd
7357
+ * @param {number} _pnFlg 正負(1 もしくは -1)
7358
+ * @returns
7359
+ */
7360
+ const getBoostTrace = (_frms, _spd, _pnFlg = 1) => {
7361
+ for (let j = C_MOTION_STD_POS + 1; j < C_MOTION_STD_POS + 70; j++) {
7362
+ _frms[j] = (C_MOTION_STD_POS + 70 - j) * _pnFlg * _spd / 50;
7373
7363
  }
7364
+ return _frms;
7365
+ };
7374
7366
 
7375
- return motionOnFrame;
7367
+ /**
7368
+ * Brake用の適用関数
7369
+ * - 初期は+2x、ステップゾーンに近づくにつれて加速量を下げる (20 → 34)
7370
+ * @param {array} _frms
7371
+ * @returns
7372
+ */
7373
+ const getBrakeTrace = _frms => {
7374
+ for (let j = C_MOTION_STD_POS + 5; j < C_MOTION_STD_POS + 19; j++) {
7375
+ _frms[j] = (j - 15) * 4 / 14;
7376
+ }
7377
+ for (let j = C_MOTION_STD_POS + 19; j <= g_sHeight / 2; j++) {
7378
+ _frms[j] = 4;
7379
+ }
7380
+ return _frms;
7376
7381
  };
7377
7382
 
7378
7383
  /**
@@ -7390,7 +7395,6 @@ const getFirstArrivalFrame = (_startFrame, _speedOnFrame, _motionOnFrame) => {
7390
7395
  startY += _speedOnFrame[frm];
7391
7396
 
7392
7397
  if (_speedOnFrame[frm] !== 0) {
7393
- startY += _motionOnFrame[motionFrm];
7394
7398
  motionFrm++;
7395
7399
  }
7396
7400
  frm++;
@@ -7416,6 +7420,8 @@ const pushArrows = (_dataObj, _speedOnFrame, _motionOnFrame, _firstArrivalFrame)
7416
7420
 
7417
7421
  /** 矢印の移動距離 */
7418
7422
  g_workObj.initY = [];
7423
+ /** 矢印の移動距離 (Motion加算分) */
7424
+ g_workObj.initBoostY = [];
7419
7425
  /** 矢印がステップゾーンに到達するまでのフレーム数 */
7420
7426
  g_workObj.arrivalFrame = [];
7421
7427
  /** Motionの適用フレーム数 */
@@ -7469,6 +7475,7 @@ const pushArrows = (_dataObj, _speedOnFrame, _motionOnFrame, _firstArrivalFrame)
7469
7475
  g_workObj.initY[frmPrev] = tmpObj.startY;
7470
7476
  g_workObj.arrivalFrame[frmPrev] = tmpObj.arrivalFrm;
7471
7477
  g_workObj.motionFrame[frmPrev] = tmpObj.motionFrm;
7478
+ g_workObj.initBoostY[frmPrev] = sumData(g_workObj.motionOnFrames.filter((val, j) => j < g_workObj.motionFrame[frmPrev]));
7472
7479
 
7473
7480
  if (_frzFlg) {
7474
7481
  g_workObj[`mk${camelHeader}Length`][_j] = [];
@@ -7496,6 +7503,7 @@ const pushArrows = (_dataObj, _speedOnFrame, _motionOnFrame, _firstArrivalFrame)
7496
7503
  g_workObj.initY[tmpFrame] = g_workObj.initY[frmPrev];
7497
7504
  g_workObj.arrivalFrame[tmpFrame] = g_workObj.arrivalFrame[frmPrev];
7498
7505
  g_workObj.motionFrame[tmpFrame] = g_workObj.motionFrame[frmPrev];
7506
+ g_workObj.initBoostY[tmpFrame] = sumData(g_workObj.motionOnFrames.filter((val, j) => j < g_workObj.motionFrame[frmPrev]));
7499
7507
 
7500
7508
  } else {
7501
7509
 
@@ -7512,6 +7520,7 @@ const pushArrows = (_dataObj, _speedOnFrame, _motionOnFrame, _firstArrivalFrame)
7512
7520
  g_workObj.initY[frmPrev] = tmpObj.startY;
7513
7521
  g_workObj.arrivalFrame[frmPrev] = tmpObj.arrivalFrm;
7514
7522
  g_workObj.motionFrame[frmPrev] = tmpObj.motionFrm;
7523
+ g_workObj.initBoostY[frmPrev] = sumData(g_workObj.motionOnFrames.filter((val, j) => j < g_workObj.motionFrame[frmPrev]));
7515
7524
  }
7516
7525
 
7517
7526
  // 出現タイミングを保存
@@ -7537,18 +7546,13 @@ const pushArrows = (_dataObj, _speedOnFrame, _motionOnFrame, _firstArrivalFrame)
7537
7546
  if (hasArrayList(_dataObj.boostData, 2)) {
7538
7547
  let delBoostIdx = 0;
7539
7548
  for (let k = _dataObj.boostData.length - 2; k >= 0; k -= 2) {
7540
- if (_dataObj.boostData[k] < g_scoreObj.frameNum) {
7541
- delBoostIdx = k + 2;
7549
+ tmpObj = getArrowStartFrame(_dataObj.boostData[k], _speedOnFrame, _motionOnFrame);
7550
+ if (tmpObj.frm < g_scoreObj.frameNum) {
7551
+ _dataObj.boostData[k] = g_scoreObj.frameNum;
7552
+ delBoostIdx = k;
7542
7553
  break;
7543
7554
  } else {
7544
- tmpObj = getArrowStartFrame(_dataObj.boostData[k], _speedOnFrame, _motionOnFrame);
7545
- if (tmpObj.frm < g_scoreObj.frameNum) {
7546
- _dataObj.boostData[k] = g_scoreObj.frameNum;
7547
- delBoostIdx = k;
7548
- break;
7549
- } else {
7550
- _dataObj.boostData[k] = tmpObj.frm;
7551
- }
7555
+ _dataObj.boostData[k] = tmpObj.frm;
7552
7556
  }
7553
7557
  }
7554
7558
  for (let k = 0; k < delBoostIdx; k++) {
@@ -7710,7 +7714,6 @@ const getArrowStartFrame = (_frame, _speedOnFrame, _motionOnFrame) => {
7710
7714
  obj.startY += _speedOnFrame[obj.frm];
7711
7715
 
7712
7716
  if (_speedOnFrame[obj.frm] !== 0) {
7713
- obj.startY += _motionOnFrame[obj.motionFrm];
7714
7717
  obj.motionFrm++;
7715
7718
  }
7716
7719
  obj.frm--;
@@ -8261,6 +8264,7 @@ const mainInit = _ => {
8261
8264
  // 現在の矢印・フリーズアローの速度、個別加算速度の初期化 (速度変化時に直す)
8262
8265
  g_workObj.currentSpeed = 2;
8263
8266
  g_workObj.boostSpd = 1;
8267
+ g_workObj.boostDir = 1;
8264
8268
 
8265
8269
  // 開始位置、楽曲再生位置の設定
8266
8270
  const firstFrame = g_scoreObj.frameNum;
@@ -8321,7 +8325,7 @@ const mainInit = _ => {
8321
8325
 
8322
8326
  // フレーム数
8323
8327
  divRoot.appendChild(
8324
- createDivCss2Label(`lblframe`, g_scoreObj.frameNum, { x: 0, y: 0, w: 100, h: 30, siz: 20, display: g_workObj.lifegaugeDisp, })
8328
+ createDivCss2Label(`lblframe`, g_scoreObj.nominalFrameNum, { x: 0, y: 0, w: 100, h: 30, siz: 20, display: g_workObj.lifegaugeDisp, })
8325
8329
  );
8326
8330
 
8327
8331
  // ライフ(数字)部作成
@@ -8774,7 +8778,12 @@ const mainInit = _ => {
8774
8778
  judgeMotionFunc.dummyArrowON = (_j, _arrowName, _cnt) => judgeMotionFunc.dummyArrowOFF(_j, _arrowName, _cnt);
8775
8779
 
8776
8780
  /**
8777
- * 次フリーズアローへ判定を移すかチェック
8781
+ * 次矢印・フリーズアローへ判定を移すかチェック
8782
+ *
8783
+ * - 判定対象の矢印/フリーズアローが未判定の状態で、現在の矢印/フリーズアローの判定領域が回復判定内に入った場合、
8784
+ * 自身より前の判定をNG判定とした上で、判定対象の矢印/フリーズアローを強制的に削除
8785
+ * - ただし、判定対象の矢印/フリーズアローがジャスト付近の場合は判定対象を優先する
8786
+ * (フリーズアローの場合、ヒット中の場合も判定対象が優先される)
8778
8787
  *
8779
8788
  * @param _j 矢印の位置
8780
8789
  * @param _k 矢印の表示順
@@ -8782,22 +8791,39 @@ const mainInit = _ => {
8782
8791
  */
8783
8792
  const judgeNextFunc = {
8784
8793
 
8794
+ arrowOFF: (_j, _k, _cnt) => {
8795
+
8796
+ if (g_workObj.judgArrowCnt[_j] === _k - 1 && _cnt <= g_judgObj.arrowJ[g_judgPosObj.shakin]) {
8797
+ const prevArrowName = `arrow${_j}_${g_workObj.judgArrowCnt[_j]}`;
8798
+
8799
+ if (g_attrObj[prevArrowName].cnt < (-1) * g_judgObj.arrowJ[g_judgPosObj.ii]) {
8800
+
8801
+ // 自身より前の矢印が未判定の場合、強制的に枠外判定を行い矢印を削除
8802
+ if (g_attrObj[prevArrowName].cnt >= (-1) * g_judgObj.arrowJ[g_judgPosObj.uwan]) {
8803
+ judgeUwan(g_attrObj[prevArrowName].cnt);
8804
+ judgeObjDelete.arrow(_j, prevArrowName);
8805
+ }
8806
+ }
8807
+ }
8808
+ },
8809
+
8810
+ arrowON: (_j, _k, _cnt) => true,
8811
+ dummyArrowOFF: (_j, _k, _cnt) => true,
8812
+ dummyArrowON: (_j, _k, _cnt) => true,
8813
+
8785
8814
  frzOFF: (_j, _k, _cnt) => {
8786
8815
 
8787
- // フリーズアローの判定領域に入った場合、前のフリーズアローを強制的に削除
8788
- // ただし、前のフリーズアローが押下中または判定領域がジャスト付近(キター領域)の場合は削除しない
8789
- // 削除する場合、前のフリーズアローの判定はイクナイ(&ウワァン)扱い
8790
- if (g_workObj.judgFrzCnt[_j] !== _k && _cnt <= g_judgObj.frzJ[g_judgPosObj.sfsf] + 1) {
8816
+ if (g_workObj.judgFrzCnt[_j] === _k - 1 && _cnt <= g_judgObj.frzJ[g_judgPosObj.sfsf]) {
8791
8817
  const prevFrzName = `frz${_j}_${g_workObj.judgFrzCnt[_j]}`;
8792
8818
 
8793
8819
  if (g_attrObj[prevFrzName].isMoving &&
8794
8820
  g_attrObj[prevFrzName].cnt < (-1) * g_judgObj.frzJ[g_judgPosObj.kita]) {
8795
8821
 
8796
- // 枠外判定前の場合、このタイミングで枠外判定を行う
8822
+ // 自身より前のフリーズアローが未判定の場合、強制的に枠外判定を行いフリーズアローを削除
8797
8823
  if (g_attrObj[prevFrzName].cnt >= (-1) * g_judgObj.frzJ[g_judgPosObj.iknai]) {
8798
- judgeIknai(_cnt);
8824
+ judgeIknai(g_attrObj[prevFrzName].cnt);
8799
8825
  if (g_headerObj.frzStartjdgUse) {
8800
- judgeUwan(_cnt);
8826
+ judgeUwan(g_attrObj[prevFrzName].cnt);
8801
8827
  }
8802
8828
  }
8803
8829
  judgeObjDelete.frz(_j, prevFrzName);
@@ -8847,12 +8873,13 @@ const mainInit = _ => {
8847
8873
  * @param {string} _color 矢印色
8848
8874
  */
8849
8875
  const makeArrow = (_j, _arrowCnt, _name, _color) => {
8850
- const boostSpdDir = g_workObj.boostSpd * g_workObj.scrollDir[_j];
8851
8876
  const dividePos = g_workObj.dividePos[_j];
8852
8877
  const colorPos = g_keyObj[`color${keyCtrlPtn}`][_j];
8853
8878
 
8854
8879
  const arrowName = `${_name}${_j}_${_arrowCnt}`;
8855
- const firstPosY = C_STEP_Y + g_posObj.reverseStepY * dividePos + g_workObj.initY[g_scoreObj.frameNum] * boostSpdDir;
8880
+ const firstPosY = C_STEP_Y + g_posObj.reverseStepY * dividePos +
8881
+ (g_workObj.initY[g_scoreObj.frameNum] * g_workObj.boostSpd +
8882
+ g_workObj.initBoostY[g_scoreObj.frameNum] * g_workObj.boostDir) * g_workObj.scrollDir[_j];
8856
8883
 
8857
8884
  const stepRoot = createEmptySprite(arrowSprite[dividePos], arrowName, {
8858
8885
  x: g_workObj.stepX[_j], y: firstPosY, w: C_ARW_WIDTH, h: C_ARW_WIDTH,
@@ -8860,7 +8887,8 @@ const mainInit = _ => {
8860
8887
  g_attrObj[arrowName] = {
8861
8888
  cnt: g_workObj.arrivalFrame[g_scoreObj.frameNum] + 1,
8862
8889
  boostCnt: g_workObj.motionFrame[g_scoreObj.frameNum],
8863
- boostSpd: boostSpdDir, dividePos: dividePos,
8890
+ boostSpd: g_workObj.boostSpd, dividePos: dividePos,
8891
+ dir: g_workObj.scrollDir[_j], boostDir: g_workObj.boostDir,
8864
8892
  prevY: firstPosY, y: firstPosY,
8865
8893
  };
8866
8894
  arrowSprite[dividePos].appendChild(stepRoot);
@@ -8907,11 +8935,12 @@ const mainInit = _ => {
8907
8935
  if (g_workObj.currentSpeed !== 0) {
8908
8936
  const boostCnt = g_attrObj[arrowName].boostCnt;
8909
8937
  g_attrObj[arrowName].prevY = g_attrObj[arrowName].y;
8910
- g_attrObj[arrowName].y -= (g_workObj.currentSpeed + g_workObj.motionOnFrames[boostCnt]) * g_attrObj[arrowName].boostSpd;
8938
+ g_attrObj[arrowName].y -= (g_workObj.currentSpeed * g_attrObj[arrowName].boostSpd + g_workObj.motionOnFrames[boostCnt] * g_attrObj[arrowName].boostDir) * g_attrObj[arrowName].dir;
8911
8939
  document.getElementById(arrowName).style.top = `${g_attrObj[arrowName].y}px`;
8912
8940
  g_attrObj[arrowName].boostCnt--;
8913
8941
  }
8914
8942
  judgeMotionFunc[`${_name}${g_stateObj.autoAll}`](_j, arrowName, --g_attrObj[arrowName].cnt);
8943
+ judgeNextFunc[`${_name}${g_stateObj.autoAll}`](_j, _k, g_attrObj[arrowName].cnt);
8915
8944
  };
8916
8945
 
8917
8946
  /**
@@ -8923,11 +8952,12 @@ const mainInit = _ => {
8923
8952
  * @param {string} _barColor
8924
8953
  */
8925
8954
  const makeFrzArrow = (_j, _arrowCnt, _name, _normalColor, _barColor) => {
8926
- const boostSpdDir = g_workObj.boostSpd * g_workObj.scrollDir[_j];
8927
8955
  const dividePos = g_workObj.dividePos[_j];
8928
8956
  const frzNo = `${_j}_${_arrowCnt}`;
8929
8957
  const frzName = `${_name}${frzNo}`;
8930
- const firstPosY = C_STEP_Y + g_posObj.reverseStepY * dividePos + g_workObj.initY[g_scoreObj.frameNum] * boostSpdDir;
8958
+ const firstPosY = C_STEP_Y + g_posObj.reverseStepY * dividePos +
8959
+ (g_workObj.initY[g_scoreObj.frameNum] * g_workObj.boostSpd +
8960
+ g_workObj.initBoostY[g_scoreObj.frameNum] * g_workObj.boostDir) * g_workObj.scrollDir[_j];
8931
8961
  const firstBarLength = g_workObj[`mk${toCapitalize(_name)}Length`][_j][(_arrowCnt - 1) * 2] * g_workObj.boostSpd;
8932
8962
 
8933
8963
  const frzRoot = createEmptySprite(arrowSprite[dividePos], frzName, {
@@ -8937,10 +8967,8 @@ const mainInit = _ => {
8937
8967
  cnt: g_workObj.arrivalFrame[g_scoreObj.frameNum] + 1,
8938
8968
  boostCnt: g_workObj.motionFrame[g_scoreObj.frameNum],
8939
8969
  judgEndFlg: false, isMoving: true, frzBarLength: firstBarLength, keyUpFrame: 0,
8940
- boostSpd: boostSpdDir, dividePos: dividePos, dir: g_workObj.scrollDir[_j],
8941
- y: firstPosY,
8942
- barY: C_ARW_WIDTH / 2 - firstBarLength * dividePos,
8943
- btmY: firstBarLength * g_workObj.scrollDir[_j],
8970
+ boostSpd: g_workObj.boostSpd, dividePos: dividePos, dir: g_workObj.scrollDir[_j], boostDir: g_workObj.boostDir,
8971
+ y: firstPosY, barY: C_ARW_WIDTH / 2 - firstBarLength * dividePos, btmY: firstBarLength * g_workObj.scrollDir[_j],
8944
8972
  };
8945
8973
  arrowSprite[dividePos].appendChild(frzRoot);
8946
8974
 
@@ -9000,7 +9028,7 @@ const mainInit = _ => {
9000
9028
  const movFrzArrow = (_j, _k, _name) => {
9001
9029
  const frzNo = `${_j}_${_k}`;
9002
9030
  const frzName = `${_name}${frzNo}`;
9003
- const movY = g_workObj.currentSpeed * g_attrObj[frzName].boostSpd;
9031
+ const movY = g_workObj.currentSpeed * g_attrObj[frzName].boostSpd * g_attrObj[frzName].dir;
9004
9032
 
9005
9033
  if (!g_attrObj[frzName].judgEndFlg) {
9006
9034
  if (g_attrObj[frzName].isMoving) {
@@ -9010,7 +9038,7 @@ const mainInit = _ => {
9010
9038
 
9011
9039
  // 移動
9012
9040
  if (g_workObj.currentSpeed !== 0) {
9013
- g_attrObj[frzName].y -= movY + g_workObj.motionOnFrames[g_attrObj[frzName].boostCnt] * g_attrObj[frzName].boostSpd;
9041
+ g_attrObj[frzName].y -= movY + g_workObj.motionOnFrames[g_attrObj[frzName].boostCnt] * g_attrObj[frzName].dir * g_attrObj[frzName].boostDir;
9014
9042
  document.getElementById(frzName).style.top = `${g_attrObj[frzName].y}px`;
9015
9043
  g_attrObj[frzName].boostCnt--;
9016
9044
  }
@@ -9064,7 +9092,7 @@ const mainInit = _ => {
9064
9092
  const flowTimeline = _ => {
9065
9093
 
9066
9094
  const currentFrame = g_scoreObj.frameNum;
9067
- lblframe.textContent = currentFrame;
9095
+ lblframe.textContent = g_scoreObj.nominalFrameNum;
9068
9096
 
9069
9097
  // キーの押下状態を取得
9070
9098
  for (let j = 0; j < keyNum; j++) {
@@ -9117,6 +9145,7 @@ const mainInit = _ => {
9117
9145
  }
9118
9146
  while (g_workObj.boostData !== undefined && currentFrame >= g_workObj.boostData[boostCnts]) {
9119
9147
  g_workObj.boostSpd = g_workObj.boostData[boostCnts + 1];
9148
+ g_workObj.boostDir = (g_workObj.boostSpd > 0 ? 1 : -1);
9120
9149
  boostCnts += 2;
9121
9150
  }
9122
9151
 
@@ -9439,7 +9468,7 @@ const changeHitFrz = (_j, _k, _name) => {
9439
9468
  // 早押ししたboostCnt分のフリーズアロー終端位置の修正
9440
9469
  let delFrzMotionLength = 0;
9441
9470
  for (let i = 0; i < g_attrObj[frzName].cnt; i++) {
9442
- delFrzMotionLength += g_workObj.motionOnFrames[g_attrObj[frzName].boostCnt - i] * g_attrObj[frzName].boostSpd;
9471
+ delFrzMotionLength += g_workObj.motionOnFrames[g_attrObj[frzName].boostCnt - i];
9443
9472
  }
9444
9473
 
9445
9474
  g_attrObj[frzName].frzBarLength -= (delFrzLength + delFrzMotionLength) * g_attrObj[frzName].dir;
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Source by tickle
7
7
  * Created : 2019/11/19
8
- * Revised : 2022/10/16 (v28.3.1)
8
+ * Revised : 2022/10/20 (v28.4.0)
9
9
  *
10
10
  * https://github.com/cwtickle/danoniplus
11
11
  */
@@ -746,7 +746,7 @@ const g_settings = {
746
746
  speedNum: 0,
747
747
  speedTerms: [20, 5, 1],
748
748
 
749
- motions: [C_FLG_OFF, `Boost`, `Brake`],
749
+ motions: [C_FLG_OFF, `Boost`, `Hi-Boost`, `Brake`],
750
750
  motionNum: 0,
751
751
 
752
752
  reverses: [C_FLG_OFF, C_FLG_ON],
@@ -815,6 +815,18 @@ const g_shuffleFunc = {
815
815
  },
816
816
  };
817
817
 
818
+ /**
819
+ * モーション適用関数
820
+ * - frmsはフレーム別の速度設定用配列。
821
+ * - 配列の15がステップゾーン上、0~14は矢印の枠外管理用
822
+ */
823
+ const g_motionFunc = {
824
+ 'OFF': _frms => _frms,
825
+ 'Boost': _frms => getBoostTrace(_frms, 3),
826
+ 'Hi-Boost': _frms => getBoostTrace(_frms, g_stateObj.speed * 2),
827
+ 'Brake': _frms => getBrakeTrace(_frms),
828
+ };
829
+
818
830
  const g_keycons = {
819
831
  configTypes: [`Main`, `Replaced`, `ALL`],
820
832
  configTypeNum: 0,
@@ -2968,6 +2980,7 @@ const g_lblNameObj = {
2968
2980
  'u_OFF': `OFF`,
2969
2981
  'u_ON': `ON`,
2970
2982
  'u_Boost': `Boost`,
2983
+ 'u_Hi-Boost': `Hi-Boost`,
2971
2984
  'u_Brake': `Brake`,
2972
2985
 
2973
2986
  'u_Cross': `Cross`,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "28.3.1",
3
+ "version": "28.5.0",
4
4
  "description": "Dancing☆Onigiri (CW Edition) - Web-based Rhythm Game",
5
5
  "main": "index.js",
6
6
  "scripts": {