danoniplus 28.3.0 → 28.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.
@@ -4,7 +4,7 @@
4
4
  本体cssファイル
5
5
 
6
6
  Created : 2018/10/08
7
- Revised : 2022/10/05 (v28.2.1)
7
+ Revised : 2022/10/16 (v28.3.1)
8
8
 
9
9
  https://github.com/cwtickle/danoniplus
10
10
  ------------------------------------------ */
@@ -23,14 +23,14 @@
23
23
  }
24
24
 
25
25
  input[type="range"] {
26
- -webkit-appearance: none;
26
+ appearance: none;
27
27
  background: transparent;
28
28
  height: 20px;
29
29
  width: 205px;
30
30
  }
31
31
 
32
32
  input[type="range"]::-webkit-slider-thumb {
33
- -webkit-appearance: none;
33
+ appearance: none;
34
34
  background: #606060;
35
35
  height: 20px;
36
36
  width: 20px;
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/13
7
+ * Revised : 2022/10/20
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 28.3.0`;
12
- const g_revisedDate = `2022/10/13`;
11
+ const g_version = `Ver 28.4.0`;
12
+ const g_revisedDate = `2022/10/20`;
13
13
  const g_alphaVersion = ``;
14
14
 
15
15
  // カスタム用バージョン (danoni_custom.js 等で指定可)
@@ -949,8 +949,6 @@ const createDiv = (_id, _x, _y, _width, _height, _classes = []) => {
949
949
  const setUserSelect = (_style, _value = C_DIS_NONE) => {
950
950
  _style.userSelect = _value;
951
951
  _style.webkitUserSelect = _value;
952
- _style.msUserSelect = _value;
953
- _style.mozUserSelect = _value;
954
952
  _style.webkitTouchCallout = _value;
955
953
  };
956
954
 
@@ -1573,7 +1571,6 @@ const drawTitleResultMotion = _displayName => {
1573
1571
  // WebAudioAPIでAudio要素風に再生するクラス
1574
1572
  class AudioPlayer {
1575
1573
  constructor() {
1576
- const AudioContext = window.AudioContext ?? window.webkitAudioContext;
1577
1574
  this._context = new AudioContext();
1578
1575
  this._gain = this._context.createGain();
1579
1576
  this._gain.connect(this._context.destination);
@@ -3965,6 +3962,7 @@ const setWindowStyle = (_text, _bkColor, _textColor, _align = C_ALIGN_LEFT) => {
3965
3962
  // ウィンドウ枠の行を取得するために一時的な枠を作成
3966
3963
  const tmplbl = createDivCss2Label(`lblTmpWarning`, _text, {
3967
3964
  x: 0, y: 70, w: g_sWidth, h: 20, siz: C_SIZ_MAIN, lineHeight: `15px`, fontFamily: getBasicFont(),
3965
+ whiteSpace: `normal`,
3968
3966
  })
3969
3967
  divRoot.appendChild(tmplbl);
3970
3968
  const range = new Range();
@@ -3976,6 +3974,7 @@ const setWindowStyle = (_text, _bkColor, _textColor, _align = C_ALIGN_LEFT) => {
3976
3974
  const lbl = createDivCss2Label(`lblWarning`, _text, {
3977
3975
  x: 0, y: 70, w: g_sWidth, h: warnHeight, siz: C_SIZ_MAIN, backgroundColor: _bkColor,
3978
3976
  opacity: 0.9, lineHeight: `15px`, color: _textColor, align: _align, fontFamily: getBasicFont(),
3977
+ whiteSpace: `normal`,
3979
3978
  });
3980
3979
  if (warnHeight === 150) {
3981
3980
  lbl.style.overflow = `auto`;
@@ -5544,7 +5543,7 @@ const createSettingsDisplayWindow = _sprite => {
5544
5543
  g_hidSudObj.filterPos = inputSlider(appearanceSlider, lblAppearancePos), false);
5545
5544
 
5546
5545
  const dispAppearanceSlider = _ => {
5547
- [`lblAppearancePos`, `lblAppearanceBar`, `lnkLockBtn`].forEach(obj =>
5546
+ [`lblAppearancePos`, `lblAppearanceBar`, `lnkLockBtn`, `lnkfilterLine`].forEach(obj =>
5548
5547
  document.getElementById(obj).style.visibility =
5549
5548
  g_appearanceRanges.includes(g_stateObj.appearance) ? `Visible` : `Hidden`
5550
5549
  );
@@ -5554,7 +5553,13 @@ const createSettingsDisplayWindow = _sprite => {
5554
5553
  // ---------------------------------------------------
5555
5554
  // 判定表示系の不透明度 (Opacity)
5556
5555
  // 縦位置: 9
5557
- createGeneralSetting(spriteList.opacity, `opacity`, { unitName: g_lblNameObj.percent, displayName: g_currentPage });
5556
+ let opacityUse = false;
5557
+ [`judgment`, `fastSlow`, `filterLine`].forEach(display =>
5558
+ opacityUse ||= g_headerObj[`${display}Use`] || g_headerObj[`${display}Set`] === C_FLG_ON);
5559
+
5560
+ if (opacityUse) {
5561
+ createGeneralSetting(spriteList.opacity, `opacity`, { unitName: g_lblNameObj.percent, displayName: g_currentPage });
5562
+ }
5558
5563
  };
5559
5564
 
5560
5565
  /**
@@ -7340,34 +7345,39 @@ const setSpeedOnFrame = (_speedData, _lastFrame) => {
7340
7345
 
7341
7346
  /**
7342
7347
  * Motionオプション適用時の矢印別の速度設定
7343
- * - 配列の数字は小さいほどステップゾーンに近いことを示す。
7344
- * - 15がステップゾーン上、0~14は矢印の枠外管理用
7348
+ * - 矢印が表示される最大フレーム数を 縦ピクセル数×20 と定義。
7345
7349
  */
7346
- const setMotionOnFrame = _ => {
7347
-
7348
- // 矢印が表示される最大フレーム数
7349
- const motionLastFrame = g_sHeight * 20;
7350
- const brakeLastFrame = g_sHeight / 2;
7350
+ const setMotionOnFrame = _ => g_motionFunc[g_stateObj.motion]([...Array(g_sHeight * 20 + 1)].fill(0));
7351
7351
 
7352
- const motionOnFrame = [...Array(motionLastFrame + 1)].fill(0);
7353
-
7354
- if (g_stateObj.motion === C_FLG_OFF) {
7355
- } else if (g_stateObj.motion === `Boost`) {
7356
- // ステップゾーンに近づくにつれて加速量を大きくする (16 85)
7357
- for (let j = C_MOTION_STD_POS + 1; j < C_MOTION_STD_POS + 70; j++) {
7358
- motionOnFrame[j] = (C_MOTION_STD_POS + 70 - j) * 3 / 50;
7359
- }
7360
- } else if (g_stateObj.motion === `Brake`) {
7361
- // 初期は+2x、ステップゾーンに近づくにつれて加速量を下げる (20 34)
7362
- for (let j = C_MOTION_STD_POS + 5; j < C_MOTION_STD_POS + 19; j++) {
7363
- motionOnFrame[j] = (j - 15) * 4 / 14;
7364
- }
7365
- for (let j = C_MOTION_STD_POS + 19; j <= brakeLastFrame; j++) {
7366
- motionOnFrame[j] = 4;
7367
- }
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;
7368
7363
  }
7364
+ return _frms;
7365
+ };
7369
7366
 
7370
- 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;
7371
7381
  };
7372
7382
 
7373
7383
  /**
@@ -7385,7 +7395,6 @@ const getFirstArrivalFrame = (_startFrame, _speedOnFrame, _motionOnFrame) => {
7385
7395
  startY += _speedOnFrame[frm];
7386
7396
 
7387
7397
  if (_speedOnFrame[frm] !== 0) {
7388
- startY += _motionOnFrame[motionFrm];
7389
7398
  motionFrm++;
7390
7399
  }
7391
7400
  frm++;
@@ -7532,18 +7541,13 @@ const pushArrows = (_dataObj, _speedOnFrame, _motionOnFrame, _firstArrivalFrame)
7532
7541
  if (hasArrayList(_dataObj.boostData, 2)) {
7533
7542
  let delBoostIdx = 0;
7534
7543
  for (let k = _dataObj.boostData.length - 2; k >= 0; k -= 2) {
7535
- if (_dataObj.boostData[k] < g_scoreObj.frameNum) {
7536
- delBoostIdx = k + 2;
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;
7537
7548
  break;
7538
7549
  } else {
7539
- tmpObj = getArrowStartFrame(_dataObj.boostData[k], _speedOnFrame, _motionOnFrame);
7540
- if (tmpObj.frm < g_scoreObj.frameNum) {
7541
- _dataObj.boostData[k] = g_scoreObj.frameNum;
7542
- delBoostIdx = k;
7543
- break;
7544
- } else {
7545
- _dataObj.boostData[k] = tmpObj.frm;
7546
- }
7550
+ _dataObj.boostData[k] = tmpObj.frm;
7547
7551
  }
7548
7552
  }
7549
7553
  for (let k = 0; k < delBoostIdx; k++) {
@@ -7705,7 +7709,6 @@ const getArrowStartFrame = (_frame, _speedOnFrame, _motionOnFrame) => {
7705
7709
  obj.startY += _speedOnFrame[obj.frm];
7706
7710
 
7707
7711
  if (_speedOnFrame[obj.frm] !== 0) {
7708
- obj.startY += _motionOnFrame[obj.motionFrm];
7709
7712
  obj.motionFrm++;
7710
7713
  }
7711
7714
  obj.frm--;
@@ -8256,6 +8259,7 @@ const mainInit = _ => {
8256
8259
  // 現在の矢印・フリーズアローの速度、個別加算速度の初期化 (速度変化時に直す)
8257
8260
  g_workObj.currentSpeed = 2;
8258
8261
  g_workObj.boostSpd = 1;
8262
+ g_workObj.boostDir = 1;
8259
8263
 
8260
8264
  // 開始位置、楽曲再生位置の設定
8261
8265
  const firstFrame = g_scoreObj.frameNum;
@@ -8316,7 +8320,7 @@ const mainInit = _ => {
8316
8320
 
8317
8321
  // フレーム数
8318
8322
  divRoot.appendChild(
8319
- createDivCss2Label(`lblframe`, g_scoreObj.frameNum, { x: 0, y: 0, w: 100, h: 30, siz: 20, display: g_workObj.lifegaugeDisp, })
8323
+ createDivCss2Label(`lblframe`, g_scoreObj.nominalFrameNum, { x: 0, y: 0, w: 100, h: 30, siz: 20, display: g_workObj.lifegaugeDisp, })
8320
8324
  );
8321
8325
 
8322
8326
  // ライフ(数字)部作成
@@ -8842,12 +8846,13 @@ const mainInit = _ => {
8842
8846
  * @param {string} _color 矢印色
8843
8847
  */
8844
8848
  const makeArrow = (_j, _arrowCnt, _name, _color) => {
8845
- const boostSpdDir = g_workObj.boostSpd * g_workObj.scrollDir[_j];
8846
8849
  const dividePos = g_workObj.dividePos[_j];
8847
8850
  const colorPos = g_keyObj[`color${keyCtrlPtn}`][_j];
8848
8851
 
8849
8852
  const arrowName = `${_name}${_j}_${_arrowCnt}`;
8850
- const firstPosY = C_STEP_Y + g_posObj.reverseStepY * dividePos + g_workObj.initY[g_scoreObj.frameNum] * boostSpdDir;
8853
+ const firstPosY = C_STEP_Y + g_posObj.reverseStepY * dividePos +
8854
+ (g_workObj.initY[g_scoreObj.frameNum] * g_workObj.boostSpd +
8855
+ sumData(g_workObj.motionOnFrames.filter((val, j) => j < g_workObj.motionFrame[g_scoreObj.frameNum])) * g_workObj.boostDir) * g_workObj.scrollDir[_j];
8851
8856
 
8852
8857
  const stepRoot = createEmptySprite(arrowSprite[dividePos], arrowName, {
8853
8858
  x: g_workObj.stepX[_j], y: firstPosY, w: C_ARW_WIDTH, h: C_ARW_WIDTH,
@@ -8855,7 +8860,8 @@ const mainInit = _ => {
8855
8860
  g_attrObj[arrowName] = {
8856
8861
  cnt: g_workObj.arrivalFrame[g_scoreObj.frameNum] + 1,
8857
8862
  boostCnt: g_workObj.motionFrame[g_scoreObj.frameNum],
8858
- boostSpd: boostSpdDir, dividePos: dividePos,
8863
+ boostSpd: g_workObj.boostSpd, dividePos: dividePos,
8864
+ dir: g_workObj.scrollDir[_j], boostDir: g_workObj.boostDir,
8859
8865
  prevY: firstPosY, y: firstPosY,
8860
8866
  };
8861
8867
  arrowSprite[dividePos].appendChild(stepRoot);
@@ -8902,7 +8908,7 @@ const mainInit = _ => {
8902
8908
  if (g_workObj.currentSpeed !== 0) {
8903
8909
  const boostCnt = g_attrObj[arrowName].boostCnt;
8904
8910
  g_attrObj[arrowName].prevY = g_attrObj[arrowName].y;
8905
- g_attrObj[arrowName].y -= (g_workObj.currentSpeed + g_workObj.motionOnFrames[boostCnt]) * g_attrObj[arrowName].boostSpd;
8911
+ g_attrObj[arrowName].y -= (g_workObj.currentSpeed * g_attrObj[arrowName].boostSpd + g_workObj.motionOnFrames[boostCnt] * g_attrObj[arrowName].boostDir) * g_attrObj[arrowName].dir;
8906
8912
  document.getElementById(arrowName).style.top = `${g_attrObj[arrowName].y}px`;
8907
8913
  g_attrObj[arrowName].boostCnt--;
8908
8914
  }
@@ -8918,11 +8924,12 @@ const mainInit = _ => {
8918
8924
  * @param {string} _barColor
8919
8925
  */
8920
8926
  const makeFrzArrow = (_j, _arrowCnt, _name, _normalColor, _barColor) => {
8921
- const boostSpdDir = g_workObj.boostSpd * g_workObj.scrollDir[_j];
8922
8927
  const dividePos = g_workObj.dividePos[_j];
8923
8928
  const frzNo = `${_j}_${_arrowCnt}`;
8924
8929
  const frzName = `${_name}${frzNo}`;
8925
- const firstPosY = C_STEP_Y + g_posObj.reverseStepY * dividePos + g_workObj.initY[g_scoreObj.frameNum] * boostSpdDir;
8930
+ const firstPosY = C_STEP_Y + g_posObj.reverseStepY * dividePos +
8931
+ (g_workObj.initY[g_scoreObj.frameNum] * g_workObj.boostSpd +
8932
+ sumData(g_workObj.motionOnFrames.filter((val, j) => j < g_workObj.motionFrame[g_scoreObj.frameNum])) * g_workObj.boostDir) * g_workObj.scrollDir[_j];
8926
8933
  const firstBarLength = g_workObj[`mk${toCapitalize(_name)}Length`][_j][(_arrowCnt - 1) * 2] * g_workObj.boostSpd;
8927
8934
 
8928
8935
  const frzRoot = createEmptySprite(arrowSprite[dividePos], frzName, {
@@ -8932,10 +8939,8 @@ const mainInit = _ => {
8932
8939
  cnt: g_workObj.arrivalFrame[g_scoreObj.frameNum] + 1,
8933
8940
  boostCnt: g_workObj.motionFrame[g_scoreObj.frameNum],
8934
8941
  judgEndFlg: false, isMoving: true, frzBarLength: firstBarLength, keyUpFrame: 0,
8935
- boostSpd: boostSpdDir, dividePos: dividePos, dir: g_workObj.scrollDir[_j],
8936
- y: firstPosY,
8937
- barY: C_ARW_WIDTH / 2 - firstBarLength * dividePos,
8938
- btmY: firstBarLength * g_workObj.scrollDir[_j],
8942
+ boostSpd: g_workObj.boostSpd, dividePos: dividePos, dir: g_workObj.scrollDir[_j], boostDir: g_workObj.boostDir,
8943
+ y: firstPosY, barY: C_ARW_WIDTH / 2 - firstBarLength * dividePos, btmY: firstBarLength * g_workObj.scrollDir[_j],
8939
8944
  };
8940
8945
  arrowSprite[dividePos].appendChild(frzRoot);
8941
8946
 
@@ -8995,7 +9000,7 @@ const mainInit = _ => {
8995
9000
  const movFrzArrow = (_j, _k, _name) => {
8996
9001
  const frzNo = `${_j}_${_k}`;
8997
9002
  const frzName = `${_name}${frzNo}`;
8998
- const movY = g_workObj.currentSpeed * g_attrObj[frzName].boostSpd;
9003
+ const movY = g_workObj.currentSpeed * g_attrObj[frzName].boostSpd * g_attrObj[frzName].dir;
8999
9004
 
9000
9005
  if (!g_attrObj[frzName].judgEndFlg) {
9001
9006
  if (g_attrObj[frzName].isMoving) {
@@ -9005,7 +9010,7 @@ const mainInit = _ => {
9005
9010
 
9006
9011
  // 移動
9007
9012
  if (g_workObj.currentSpeed !== 0) {
9008
- g_attrObj[frzName].y -= movY + g_workObj.motionOnFrames[g_attrObj[frzName].boostCnt] * g_attrObj[frzName].boostSpd;
9013
+ g_attrObj[frzName].y -= movY + g_workObj.motionOnFrames[g_attrObj[frzName].boostCnt] * g_attrObj[frzName].dir * g_attrObj[frzName].boostDir;
9009
9014
  document.getElementById(frzName).style.top = `${g_attrObj[frzName].y}px`;
9010
9015
  g_attrObj[frzName].boostCnt--;
9011
9016
  }
@@ -9059,7 +9064,7 @@ const mainInit = _ => {
9059
9064
  const flowTimeline = _ => {
9060
9065
 
9061
9066
  const currentFrame = g_scoreObj.frameNum;
9062
- lblframe.textContent = currentFrame;
9067
+ lblframe.textContent = g_scoreObj.nominalFrameNum;
9063
9068
 
9064
9069
  // キーの押下状態を取得
9065
9070
  for (let j = 0; j < keyNum; j++) {
@@ -9112,6 +9117,7 @@ const mainInit = _ => {
9112
9117
  }
9113
9118
  while (g_workObj.boostData !== undefined && currentFrame >= g_workObj.boostData[boostCnts]) {
9114
9119
  g_workObj.boostSpd = g_workObj.boostData[boostCnts + 1];
9120
+ g_workObj.boostDir = (g_workObj.boostSpd > 0 ? 1 : -1);
9115
9121
  boostCnts += 2;
9116
9122
  }
9117
9123
 
@@ -9329,9 +9335,7 @@ const changeAppearanceFilter = (_appearance, _num = 10) => {
9329
9335
  const bottomShape = `inset(${numPlus}% 0% ${_num}% 0%)`;
9330
9336
 
9331
9337
  $id(`arrowSprite${topNum}`).clipPath = topShape;
9332
- $id(`arrowSprite${topNum}`).webkitClipPath = topShape;
9333
9338
  $id(`arrowSprite${bottomNum}`).clipPath = bottomShape;
9334
- $id(`arrowSprite${bottomNum}`).webkitClipPath = bottomShape;
9335
9339
 
9336
9340
  $id(`filterBar0`).top = `${g_posObj.arrowHeight * _num / 100}px`;
9337
9341
  $id(`filterBar1`).top = `${g_posObj.arrowHeight * (100 - _num) / 100}px`;
@@ -9436,7 +9440,7 @@ const changeHitFrz = (_j, _k, _name) => {
9436
9440
  // 早押ししたboostCnt分のフリーズアロー終端位置の修正
9437
9441
  let delFrzMotionLength = 0;
9438
9442
  for (let i = 0; i < g_attrObj[frzName].cnt; i++) {
9439
- delFrzMotionLength += g_workObj.motionOnFrames[g_attrObj[frzName].boostCnt - i] * g_attrObj[frzName].boostSpd;
9443
+ delFrzMotionLength += g_workObj.motionOnFrames[g_attrObj[frzName].boostCnt - i];
9440
9444
  }
9441
9445
 
9442
9446
  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/13 (v28.3.0)
8
+ * Revised : 2022/10/20 (v28.4.0)
9
9
  *
10
10
  * https://github.com/cwtickle/danoniplus
11
11
  */
@@ -135,6 +135,7 @@ const updateWindowSiz = _ => {
135
135
  lblComment: {
136
136
  x: 0, y: 70, w: g_sWidth, h: g_sHeight - 180, siz: C_SIZ_DIFSELECTOR, align: C_ALIGN_LEFT,
137
137
  overflow: `auto`, background: `#222222`, color: `#cccccc`, display: C_DIS_NONE,
138
+ whiteSpace: `normal`,
138
139
  },
139
140
  btnComment: {
140
141
  x: g_sWidth - 160, y: (g_sHeight / 2) + 150, w: 140, h: 50, siz: 20, border: `solid 1px #999999`,
@@ -745,7 +746,7 @@ const g_settings = {
745
746
  speedNum: 0,
746
747
  speedTerms: [20, 5, 1],
747
748
 
748
- motions: [C_FLG_OFF, `Boost`, `Brake`],
749
+ motions: [C_FLG_OFF, `Boost`, `Hi-Boost`, `Brake`],
749
750
  motionNum: 0,
750
751
 
751
752
  reverses: [C_FLG_OFF, C_FLG_ON],
@@ -814,6 +815,18 @@ const g_shuffleFunc = {
814
815
  },
815
816
  };
816
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
+
817
830
  const g_keycons = {
818
831
  configTypes: [`Main`, `Replaced`, `ALL`],
819
832
  configTypeNum: 0,
@@ -2967,6 +2980,7 @@ const g_lblNameObj = {
2967
2980
  'u_OFF': `OFF`,
2968
2981
  'u_ON': `ON`,
2969
2982
  'u_Boost': `Boost`,
2983
+ 'u_Hi-Boost': `Hi-Boost`,
2970
2984
  'u_Brake': `Brake`,
2971
2985
 
2972
2986
  'u_Cross': `Cross`,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "28.3.0",
3
+ "version": "28.4.0",
4
4
  "description": "Dancing☆Onigiri (CW Edition) - Web-based Rhythm Game",
5
5
  "main": "index.js",
6
6
  "scripts": {