danoniplus 31.7.1 → 32.1.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,13 +4,12 @@
4
4
  *
5
5
  * Source by tickle
6
6
  * Created : 2018/10/08
7
- * Revised : 2023/05/04
7
+ * Revised : 2023/05/07
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 31.7.1`;
12
- const g_revisedDate = `2023/05/04`;
13
- const g_alphaVersion = ``;
11
+ const g_version = `Ver 32.1.0`;
12
+ const g_revisedDate = `2023/05/13`;
14
13
 
15
14
  // カスタム用バージョン (danoni_custom.js 等で指定可)
16
15
  let g_localVersion = ``;
@@ -121,6 +120,10 @@ const g_presetObj = {
121
120
  let g_headerObj = {};
122
121
  let g_scoreObj = {};
123
122
  let g_attrObj = {};
123
+
124
+ const g_btnFunc = {
125
+ base: {}, reset: {}, cxt: {},
126
+ };
124
127
  let g_btnAddFunc = {};
125
128
  let g_btnDeleteFlg = {};
126
129
  let g_cxtAddFunc = {};
@@ -543,7 +546,7 @@ const commonKeyDown = (_evt, _displayName, _func = _code => { }, _dfEvtFlg) => {
543
546
  if (!_dfEvtFlg) {
544
547
  _evt.preventDefault();
545
548
  }
546
- const setCode = transCode(_evt.code);
549
+ const setCode = _evt.code;
547
550
  if (_evt.repeat && (g_unrepeatObj.page.includes(_displayName) || g_unrepeatObj.key.includes(setCode))) {
548
551
  return blockCode(setCode);
549
552
  }
@@ -576,8 +579,9 @@ const commonKeyDown = (_evt, _displayName, _func = _code => { }, _dfEvtFlg) => {
576
579
  * @param {object} _evt
577
580
  */
578
581
  const commonKeyUp = _evt => {
579
- g_inputKeyBuffer[g_kCdNameObj.metaKey] = false;
580
- g_inputKeyBuffer[transCode(_evt.code)] = false;
582
+ g_inputKeyBuffer[g_kCdNameObj.metaLKey] = false;
583
+ g_inputKeyBuffer[g_kCdNameObj.metaRKey] = false;
584
+ g_inputKeyBuffer[_evt.code] = false;
581
585
  };
582
586
 
583
587
  /**
@@ -1268,6 +1272,8 @@ const createCss2Button = (_id, _text, _func = _ => true, { x = 0, y = g_sHeight
1268
1272
  resetFunc(evt);
1269
1273
  }
1270
1274
  });
1275
+ g_btnFunc.base[_id] = _func;
1276
+ g_btnFunc.reset[_id] = resetFunc;
1271
1277
 
1272
1278
  // 右クリック時の処理
1273
1279
  div.oncontextmenu = evt => {
@@ -1278,6 +1284,8 @@ const createCss2Button = (_id, _text, _func = _ => true, { x = 0, y = g_sHeight
1278
1284
  if (typeof g_cxtAddFunc[_id] === C_TYP_FUNCTION) {
1279
1285
  g_cxtAddFunc[_id](evt, cxtFunc);
1280
1286
  }
1287
+ g_btnFunc.cxt[_id] = cxtFunc;
1288
+
1281
1289
  } else if (typeof g_cxtAddFunc[_id] === C_TYP_FUNCTION) {
1282
1290
  g_cxtAddFunc[_id](evt);
1283
1291
  }
@@ -1335,7 +1343,7 @@ const resetKeyControl = _ => {
1335
1343
  document.onkeyup = _ => { };
1336
1344
  document.onkeydown = evt => {
1337
1345
  evt.preventDefault();
1338
- return blockCode(transCode(evt.code));
1346
+ return blockCode(evt.code);
1339
1347
  };
1340
1348
  g_inputKeyBuffer = {};
1341
1349
  };
@@ -2848,10 +2856,12 @@ const headerConvert = _dosObj => {
2848
2856
  // 無音のフレーム数
2849
2857
  obj.blankFrame = 200;
2850
2858
  obj.blankFrameDef = 200;
2859
+ obj.blankFrameDefs = [];
2851
2860
  if (isNaN(parseFloat(_dosObj.blankFrame))) {
2852
2861
  } else {
2853
- obj.blankFrame = parseInt(_dosObj.blankFrame);
2854
- obj.blankFrameDef = parseInt(_dosObj.blankFrame);
2862
+ obj.blankFrameDefs = _dosObj.blankFrame.split(`$`).map(val => parseInt(val));
2863
+ obj.blankFrame = obj.blankFrameDefs[0];
2864
+ obj.blankFrameDef = obj.blankFrameDefs[0];
2855
2865
  }
2856
2866
 
2857
2867
  // 開始フレーム数(0以外の場合はフェードインスタート)、終了フレーム数
@@ -3578,9 +3588,12 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList?.split(`,`)
3578
3588
  if (existParam(tmpArray[k], `${keyheader}_${k + dfPtn}`)) {
3579
3589
  continue;
3580
3590
  }
3581
- const keyPtn = getKeyPtnName(tmpArray[k]);
3582
- g_keyObj[`${keyheader}_${k + dfPtn}`] = g_keyObj[`${_name}${keyPtn}`] !== undefined ?
3583
- structuredClone(g_keyObj[`${_name}${keyPtn}`]) : tmpArray[k].split(`,`).map(n => _convFunc(n));
3591
+ // |keyCtrl9j=Tab,7_0,Enter| -> |keyCtrl9j=Tab,S,D,F,Space,J,K,L,Enter| のように補完
3592
+ g_keyObj[`${keyheader}_${k + dfPtn}`] =
3593
+ tmpArray[k].split(`,`).map(n =>
3594
+ g_keyObj[`${_name}${getKeyPtnName(n)}`] !== undefined ?
3595
+ structuredClone(g_keyObj[`${_name}${getKeyPtnName(n)}`]) : [_convFunc(n)]
3596
+ ).flat();
3584
3597
  if (baseCopyFlg) {
3585
3598
  g_keyObj[`${keyheader}_${k + dfPtn}d`] = structuredClone(g_keyObj[`${keyheader}_${k + dfPtn}`]);
3586
3599
  }
@@ -3618,7 +3631,8 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList?.split(`,`)
3618
3631
  g_keyObj[`${keyheader}_${k + dfPtn}_${ptnCnt}`] = [...Array(g_keyObj[`${g_keyObj.defaultProp}${_key}_${k + dfPtn}`].length)].fill(0);
3619
3632
 
3620
3633
  } else if (g_keyObj[`${_name}${keyPtn}_0`] !== undefined) {
3621
- // 他のキーパターン (例: |shuffle8i=8_0| ) を指定した場合、該当があれば既存パターンからコピー
3634
+ // 他のキーパターン (例: |shuffle8i=8_0| ) を直接指定した場合、該当があれば既存パターンからコピー
3635
+ // 既存パターンが複数ある場合、全てコピーする
3622
3636
  let m = 0;
3623
3637
  while (g_keyObj[`${_name}${keyPtn}_${m}`] !== undefined) {
3624
3638
  g_keyObj[`${keyheader}_${k + dfPtn}_${ptnCnt}`] = structuredClone(g_keyObj[`${_name}${keyPtn}_${m}`]);
@@ -3627,9 +3641,13 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList?.split(`,`)
3627
3641
  }
3628
3642
  } else {
3629
3643
  // 通常の指定方法 (例: |shuffle8i=1,1,1,2,0,0,0,0/1,1,1,1,0,0,0,0| )の場合の取り込み
3644
+ // 部分的にキーパターン指定があった場合は既存パターンを展開 (例: |shuffle9j=2,7_0_0,2|)
3630
3645
  g_keyObj[`${keyheader}_${k + dfPtn}_${ptnCnt}`] =
3631
- makeBaseArray(list.split(`,`).map(n => isNaN(parseInt(n)) ? n : parseInt(n, 10)),
3632
- g_keyObj[`${g_keyObj.defaultProp}${_key}_${k + dfPtn}`].length, 0);
3646
+ makeBaseArray(list.split(`,`).map(n =>
3647
+ g_keyObj[`${_name}${getKeyPtnName(n)}`] !== undefined ?
3648
+ structuredClone(g_keyObj[`${_name}${getKeyPtnName(n)}`]) :
3649
+ [isNaN(parseInt(n)) ? n : parseInt(n, 10)]
3650
+ ).flat(), g_keyObj[`${g_keyObj.defaultProp}${_key}_${k + dfPtn}`].length, 0);
3633
3651
  ptnCnt++;
3634
3652
  }
3635
3653
  });
@@ -3651,14 +3669,19 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList?.split(`,`)
3651
3669
  * @param {string} _key キー数
3652
3670
  * @param {string} _name 名前
3653
3671
  * @param {string} _type float, number, string, boolean
3672
+ * @param {string} _defaultVal
3654
3673
  */
3655
- const newKeySingleParam = (_key, _name, _type) => {
3674
+ const newKeySingleParam = (_key, _name, _type, _defaultVal) => {
3656
3675
  const keyheader = _name + _key;
3657
3676
  const dfPtn = setIntVal(g_keyObj.dfPtnNum);
3658
3677
  if (_dosObj[keyheader] !== undefined) {
3659
3678
  const tmps = _dosObj[keyheader].split(`$`);
3660
3679
  for (let k = 0; k < tmps.length; k++) {
3661
- g_keyObj[`${keyheader}_${k + dfPtn}`] = setVal(g_keyObj[`${_name}${tmps[k]}`], setVal(tmps[k], ``, _type));
3680
+ g_keyObj[`${keyheader}_${k + dfPtn}`] = setVal(g_keyObj[`${_name}${getKeyPtnName(tmps[k])}`],
3681
+ tmps[k].indexOf(`_`) !== -1 ? _defaultVal : setVal(tmps[k], ``, _type));
3682
+ }
3683
+ for (let k = tmps.length; k < g_keyObj.minPatterns; k++) {
3684
+ g_keyObj[`${keyheader}_${k + dfPtn}`] = g_keyObj[`${keyheader}_0`];
3662
3685
  }
3663
3686
  }
3664
3687
  };
@@ -3695,11 +3718,15 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList?.split(`,`)
3695
3718
  // 他のキーパターン指定時、該当があればプロパティを全コピー
3696
3719
  Object.assign(g_keyObj[pairName], g_keyObj[`${_pairName}${keyPtn}`]);
3697
3720
  } else {
3698
- // 通常の指定方法(例:|scroll8i=Cross::1,1,1,-1,-1,-1,1,1/Split::1,1,1,1,-1,-1,-1,-1|)から取り込み
3721
+ // 通常の指定方法(例:|scroll8i=Cross::1,1,1,-,-,-,1,1/Split::1,1,1,1,-,-,-,-|)から取り込み
3722
+ // 部分的にキーパターン指定があった場合は既存パターンを展開 (例: |scroll9j=Cross::1,7_0,1|)
3699
3723
  const tmpParamPair = pairs.split(`::`);
3700
3724
  g_keyObj[pairName][tmpParamPair[0]] =
3701
- makeBaseArray(tmpParamPair[1].split(`,`).map(n => parseInt(n, 10)),
3702
- g_keyObj[`${g_keyObj.defaultProp}${_key}_${k + dfPtn}`].length, _defaultVal);
3725
+ makeBaseArray(tmpParamPair[1].split(`,`).map(n =>
3726
+ g_keyObj[`${_pairName}${getKeyPtnName(n)}`] !== undefined ?
3727
+ structuredClone(g_keyObj[`${_pairName}${getKeyPtnName(n)}`][tmpParamPair[0]]) :
3728
+ [n === `-` ? -1 : parseInt(n, 10)]
3729
+ ).flat(), g_keyObj[`${g_keyObj.defaultProp}${_key}_${k + dfPtn}`].length, _defaultVal);
3703
3730
  }
3704
3731
  });
3705
3732
  }
@@ -3770,19 +3797,19 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList?.split(`,`)
3770
3797
  }
3771
3798
 
3772
3799
  // ステップゾーン間隔 (blankX_Y)
3773
- newKeySingleParam(newKey, `blank`, C_TYP_FLOAT);
3800
+ newKeySingleParam(newKey, `blank`, C_TYP_FLOAT, g_keyObj.blank_def);
3774
3801
 
3775
3802
  // 矢印群の倍率 (scaleX_Y)
3776
- newKeySingleParam(newKey, `scale`, C_TYP_FLOAT);
3803
+ newKeySingleParam(newKey, `scale`, C_TYP_FLOAT, g_keyObj.scale_def);
3777
3804
 
3778
3805
  // プレイ中ショートカット:リトライ (keyRetryX_Y)
3779
- newKeySingleParam(newKey, `keyRetry`, C_TYP_STRING);
3806
+ newKeySingleParam(newKey, `keyRetry`, C_TYP_STRING, C_KEY_RETRY);
3780
3807
 
3781
3808
  // プレイ中ショートカット:タイトルバック (keyTitleBackX_Y)
3782
- newKeySingleParam(newKey, `keyTitleBack`, C_TYP_STRING);
3809
+ newKeySingleParam(newKey, `keyTitleBack`, C_TYP_STRING, C_KEY_TITLEBACK);
3783
3810
 
3784
3811
  // 別キーフラグ (transKeyX_Y)
3785
- newKeySingleParam(newKey, `transKey`, C_TYP_STRING);
3812
+ newKeySingleParam(newKey, `transKey`, C_TYP_STRING, ``);
3786
3813
 
3787
3814
  // シャッフルグループ (shuffleX_Y)
3788
3815
  newKeyTripleParam(newKey, `shuffle`);
@@ -3972,7 +3999,7 @@ const titleInit = _ => {
3972
3999
  customVersion += ` / ${g_localVersion2}`;
3973
4000
  }
3974
4001
  const releaseDate = (g_headerObj.releaseDate !== `` ? ` @${g_headerObj.releaseDate}` : ``);
3975
- const versionName = `&copy; 2018-${g_revisedDate.slice(0, 4)} ティックル, CW ${g_version}${g_alphaVersion}${customVersion}${releaseDate}`;
4002
+ const versionName = `&copy; 2018-${g_revisedDate.slice(0, 4)} ティックル, CW ${g_version}${customVersion}${releaseDate}`;
3976
4003
 
3977
4004
  let reloadFlg = false;
3978
4005
  const getLinkSiz = _name => getFontSize(_name, g_sWidth / 2 - 20, getBasicFont(), g_limitObj.lnkSiz, 12);
@@ -6008,7 +6035,7 @@ const keyConfigInit = (_kcType = g_kcType) => {
6008
6035
  setKeyConfigCursor();
6009
6036
  }, {
6010
6037
  x: keyconX, y: 50 + C_KYC_REPHEIGHT * k + keyconY,
6011
- w: C_ARW_WIDTH, h: C_KYC_REPHEIGHT, siz: g_limitObj.jdgCntsSiz,
6038
+ w: C_ARW_WIDTH, h: C_KYC_REPHEIGHT, siz: g_limitObj.keySetSiz,
6012
6039
  }, g_cssObj.button_Default_NoColor, g_cssObj.title_base)
6013
6040
  );
6014
6041
 
@@ -6534,12 +6561,13 @@ const keyConfigInit = (_kcType = g_kcType) => {
6534
6561
 
6535
6562
  // 全角切替、BackSpace、Deleteキー、Escキーは割り当て禁止
6536
6563
  // また、直前と同じキーを押した場合(BackSpaceを除く)はキー操作を無効にする
6537
- const disabledKeys = [229, 240, 242, 243, 244, 91, 29, 28, 27, g_prevKey];
6564
+ const disabledKeys = [229, 240, 242, 243, 244, 91, 29, 28, 27, 259, g_prevKey];
6538
6565
  if (disabledKeys.includes(setKey) || g_kCdN[setKey] === undefined) {
6539
6566
  makeInfoWindow(g_msgInfoObj.I_0002, `fadeOut0`);
6540
6567
  return;
6541
6568
  } else if ((setKey === C_KEY_TITLEBACK && g_currentk === 0) ||
6542
- (keyIsDown(g_kCdNameObj.metaKey) && keyIsDown(g_kCdNameObj.shiftKey))) {
6569
+ ((keyIsDown(g_kCdNameObj.metaLKey) || keyIsDown(g_kCdNameObj.metaRKey)) &&
6570
+ (keyIsDown(g_kCdNameObj.shiftLKey) || keyIsDown(g_kCdNameObj.shiftRKey)))) {
6543
6571
  return;
6544
6572
  }
6545
6573
 
@@ -6844,6 +6872,7 @@ const loadingScoreInit = async () => {
6844
6872
  await loadChartFile();
6845
6873
  const tkObj = getKeyInfo();
6846
6874
  const [keyCtrlPtn, keyNum] = [tkObj.keyCtrlPtn, tkObj.keyNum];
6875
+ g_headerObj.blankFrameDef = setVal(g_headerObj.blankFrameDefs[g_stateObj.scoreId], g_headerObj.blankFrameDefs[0]);
6847
6876
  g_headerObj.blankFrame = g_headerObj.blankFrameDef;
6848
6877
 
6849
6878
  // ユーザカスタムイベント
@@ -8957,7 +8986,7 @@ const mainInit = _ => {
8957
8986
  // キー操作イベント
8958
8987
  document.onkeydown = evt => {
8959
8988
  evt.preventDefault();
8960
- const setCode = transCode(evt.code);
8989
+ const setCode = evt.code;
8961
8990
 
8962
8991
  if (evt.repeat && !g_mainRepeatObj.key.includes(setCode)) {
8963
8992
  return blockCode(setCode);
@@ -8969,7 +8998,7 @@ const mainInit = _ => {
8969
8998
  // 曲中リトライ、タイトルバック
8970
8999
  if (setCode === g_kCdN[g_headerObj.keyRetry]) {
8971
9000
 
8972
- if (g_isMac && keyIsDown(g_kCdNameObj.shiftKey)) {
9001
+ if (g_isMac && (keyIsDown(g_kCdNameObj.shiftLKey) || keyIsDown(g_kCdNameObj.shiftRKey))) {
8973
9002
  // Mac OS、IPad OSはDeleteキーが無いためShift+BSで代用
8974
9003
  g_audio.pause();
8975
9004
  clearTimeout(g_timeoutEvtId);
@@ -8986,7 +9015,7 @@ const mainInit = _ => {
8986
9015
  } else if (setCode === g_kCdN[g_headerObj.keyTitleBack]) {
8987
9016
  g_audio.pause();
8988
9017
  clearTimeout(g_timeoutEvtId);
8989
- if (keyIsDown(g_kCdNameObj.shiftKey)) {
9018
+ if (keyIsDown(g_kCdNameObj.shiftLKey) || keyIsDown(g_kCdNameObj.shiftRKey)) {
8990
9019
  if (g_currentArrows !== g_fullArrows || g_stateObj.lifeMode === C_LFE_BORDER && g_workObj.lifeVal < g_workObj.lifeBorder) {
8991
9020
  g_gameOverFlg = true;
8992
9021
  g_finishFlg = false;
@@ -9025,7 +9054,7 @@ const mainInit = _ => {
9025
9054
  };
9026
9055
 
9027
9056
  document.onkeyup = evt => {
9028
- const setCode = transCode(evt.code);
9057
+ const setCode = evt.code;
9029
9058
  g_inputKeyBuffer[setCode] = false;
9030
9059
  mainKeyUpActFunc[g_stateObj.autoAll]();
9031
9060
  };
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Source by tickle
7
7
  * Created : 2019/11/19
8
- * Revised : 2023/05/03 (v31.7.0)
8
+ * Revised : 2023/05/07 (v32.0.0)
9
9
  *
10
10
  * https://github.com/cwtickle/danoniplus
11
11
  */
@@ -112,6 +112,7 @@ const g_limitObj = {
112
112
  titleSiz: 32,
113
113
  mainSiz: 14,
114
114
  musicTitleSiz: 13,
115
+ keySetSiz: 16,
115
116
  };
116
117
 
117
118
  /** 設定項目の位置 */
@@ -638,8 +639,11 @@ const g_escapeStr = {
638
639
  [`space`, `frzSpace`], [`iyo`, `frzIyo`], [`gor`, `frzGor`], [`oni`, `foni`],
639
640
  ],
640
641
  keyCtrlName: [
641
- [`Left`, ``], [`Digit`, `D`], [`Numpad`, `N`], [`Semicolon`, `;`],
642
+ [`ShiftLeft`, `Shift`], [`ControlLeft`, `Control`], [`AltLeft`, `Alt`],
643
+ [`Digit`, `D`], [`Numpad`, `N`], [`Semicolon`, `;`],
642
644
  [`Multiply`, `*`], [`Add`, `+`], [`Subtract`, `-`], [`Decimal`, `.`], [`Divide`, `Div`],
645
+ [`Quote`, `Ja-Colon`], [`BracketLeft`, `Ja-@`], [`BracketRight`, `Ja-[`],
646
+ [`Backslash`, `Ja-]`], [`Equal`, `Ja-^`],
643
647
  ],
644
648
  };
645
649
 
@@ -1056,7 +1060,7 @@ let g_prevKey = -1;
1056
1060
  // キーコード
1057
1061
  const g_kCd = [];
1058
1062
  const g_kCdN = [];
1059
- for (let j = 0; j < 255; j++) {
1063
+ for (let j = 0; j < 260; j++) {
1060
1064
  g_kCd[j] = ``;
1061
1065
  g_kCdN[j] = ``;
1062
1066
  }
@@ -1068,9 +1072,9 @@ g_kCd[8] = (g_isMac ? `Delete` : `BackSpace`);
1068
1072
  g_kCd[9] = `Tab`;
1069
1073
  g_kCd[12] = `Clear`;
1070
1074
  g_kCd[13] = `Enter`;
1071
- g_kCd[16] = `Shift`;
1072
- g_kCd[17] = `Ctrl`;
1073
- g_kCd[18] = `Alt`;
1075
+ g_kCd[16] = `L)Shift`;
1076
+ g_kCd[17] = `L)Ctrl`;
1077
+ g_kCd[18] = `L)Alt`;
1074
1078
  g_kCd[19] = `Pause`;
1075
1079
  g_kCd[27] = `Esc`;
1076
1080
  g_kCd[28] = `Conv`;
@@ -1174,6 +1178,9 @@ g_kCd[222] = `^ ~`;
1174
1178
  g_kCd[226] = `\\ _`;
1175
1179
  g_kCd[229] = `IME`;
1176
1180
  g_kCd[240] = `CapsLk`;
1181
+ g_kCd[256] = `R)Shift`;
1182
+ g_kCd[257] = `R)Ctrl`;
1183
+ g_kCd[258] = `R)Alt`;
1177
1184
 
1178
1185
  // 従来のキーコードとの変換用
1179
1186
  g_kCdN[0] = `- - -`; // 無効値
@@ -1288,10 +1295,16 @@ g_kCdN[222] = `Equal`;
1288
1295
  g_kCdN[226] = `IntlRo`;
1289
1296
  g_kCdN[229] = `Backquote`;
1290
1297
  g_kCdN[240] = `CapsLock`;
1298
+ g_kCdN[256] = `ShiftRight`;
1299
+ g_kCdN[257] = `ControlRight`;
1300
+ g_kCdN[258] = `AltRight`;
1301
+ g_kCdN[259] = `MetaRight`;
1291
1302
 
1292
1303
  const g_kCdNameObj = {
1293
- shiftKey: `ShiftLeft`,
1294
- metaKey: `MetaLeft`,
1304
+ shiftLKey: `ShiftLeft`,
1305
+ shiftRKey: `ShiftRight`,
1306
+ metaLKey: `MetaLeft`,
1307
+ metaRKey: `MetaRight`,
1295
1308
  };
1296
1309
 
1297
1310
  // 画面別ショートカット
@@ -1306,47 +1319,79 @@ const g_shortcutObj = {
1306
1319
  },
1307
1320
  option: {
1308
1321
  ShiftLeft_KeyD: { id: `lnkDifficultyL` },
1322
+ ShiftRight_KeyD: { id: `lnkDifficultyL` },
1309
1323
  KeyD: { id: `lnkDifficultyR` },
1324
+
1310
1325
  ShiftLeft_ArrowRight: { id: `lnkSpeedR` },
1326
+ ShiftRight_ArrowRight: { id: `lnkSpeedR` },
1311
1327
  AltLeft_ArrowRight: { id: `lnkSpeedHR` },
1328
+ AltRight_ArrowRight: { id: `lnkSpeedHR` },
1312
1329
  ArrowRight: { id: `lnkSpeedRR` },
1313
1330
  ShiftLeft_ArrowLeft: { id: `lnkSpeedL` },
1331
+ ShiftRight_ArrowLeft: { id: `lnkSpeedL` },
1314
1332
  AltLeft_ArrowLeft: { id: `lnkSpeedHL` },
1333
+ AltRight_ArrowLeft: { id: `lnkSpeedHL` },
1315
1334
  ArrowLeft: { id: `lnkSpeedLL` },
1335
+
1316
1336
  KeyL: { id: `lnkDifficulty` },
1317
1337
 
1318
1338
  ShiftLeft_KeyM: { id: `lnkMotionL` },
1339
+ ShiftRight_KeyM: { id: `lnkMotionL` },
1319
1340
  KeyM: { id: `lnkMotionR` },
1320
1341
  ArrowUp: { id: `lnkScrollL` },
1321
1342
  ArrowDown: { id: `lnkScrollR` },
1322
1343
  KeyR: { id: `lnkReverseR`, dfId: `lnkReverseR`, exId: `btnReverse` },
1323
1344
 
1324
1345
  ShiftLeft_KeyS: { id: `lnkShuffleL` },
1346
+ ShiftRight_KeyS: { id: `lnkShuffleL` },
1325
1347
  KeyS: { id: `lnkShuffleR` },
1326
1348
  ShiftLeft_KeyA: { id: `lnkAutoPlayL` },
1349
+ ShiftRight_KeyA: { id: `lnkAutoPlayL` },
1327
1350
  KeyA: { id: `lnkAutoPlayR` },
1328
1351
  ShiftLeft_KeyG: { id: `lnkGaugeL` },
1352
+ ShiftRight_KeyG: { id: `lnkGaugeL` },
1329
1353
  KeyG: { id: `lnkGaugeR` },
1330
1354
 
1331
1355
  AltLeft_ShiftLeft_Semicolon: { id: `lnkAdjustmentHR` },
1356
+ AltLeft_ShiftRight_Semicolon: { id: `lnkAdjustmentHR` },
1357
+ AltRight_ShiftLeft_Semicolon: { id: `lnkAdjustmentHR` },
1358
+ AltRight_ShiftRight_Semicolon: { id: `lnkAdjustmentHR` },
1332
1359
  ShiftLeft_Semicolon: { id: `lnkAdjustmentR` },
1360
+ ShiftRight_Semicolon: { id: `lnkAdjustmentR` },
1333
1361
  AltLeft_Semicolon: { id: `lnkAdjustmentRRR` },
1362
+ AltRight_Semicolon: { id: `lnkAdjustmentRRR` },
1334
1363
  Semicolon: { id: `lnkAdjustmentRR` },
1335
1364
  AltLeft_ShiftLeft_Minus: { id: `lnkAdjustmentHL` },
1365
+ AltLeft_ShiftRight_Minus: { id: `lnkAdjustmentHL` },
1366
+ AltRight_ShiftLeft_Minus: { id: `lnkAdjustmentHL` },
1367
+ AltRight_ShiftRight_Minus: { id: `lnkAdjustmentHL` },
1336
1368
  ShiftLeft_Minus: { id: `lnkAdjustmentL` },
1369
+ ShiftRight_Minus: { id: `lnkAdjustmentL` },
1337
1370
  AltLeft_Minus: { id: `lnkAdjustmentLLL` },
1371
+ AltRight_Minus: { id: `lnkAdjustmentLLL` },
1338
1372
  Minus: { id: `lnkAdjustmentLL` },
1339
1373
 
1340
1374
  AltLeft_ShiftLeft_NumpadAdd: { id: `lnkAdjustmentHR` },
1375
+ AltLeft_ShiftRight_NumpadAdd: { id: `lnkAdjustmentHR` },
1376
+ AltRight_ShiftLeft_NumpadAdd: { id: `lnkAdjustmentHR` },
1377
+ AltRight_ShiftRight_NumpadAdd: { id: `lnkAdjustmentHR` },
1341
1378
  ShiftLeft_NumpadAdd: { id: `lnkAdjustmentR` },
1379
+ ShiftRight_NumpadAdd: { id: `lnkAdjustmentR` },
1342
1380
  AltLeft_NumpadAdd: { id: `lnkAdjustmentRRR` },
1381
+ AltRight_NumpadAdd: { id: `lnkAdjustmentRRR` },
1343
1382
  NumpadAdd: { id: `lnkAdjustmentRR` },
1344
1383
  AltLeft_ShiftLeft_NumpadSubtract: { id: `lnkAdjustmentHL` },
1384
+ AltLeft_ShiftRight_NumpadSubtract: { id: `lnkAdjustmentHL` },
1385
+ AltRight_ShiftLeft_NumpadSubtract: { id: `lnkAdjustmentHL` },
1386
+ AltRight_ShiftRight_NumpadSubtract: { id: `lnkAdjustmentHL` },
1345
1387
  ShiftLeft_NumpadSubtract: { id: `lnkAdjustmentL` },
1388
+ ShiftRight_NumpadSubtract: { id: `lnkAdjustmentL` },
1346
1389
  AltLeft_NumpadSubtract: { id: `lnkAdjustmentLLL` },
1390
+ ShiftRight_NumpadSubtract: { id: `lnkAdjustmentL` },
1347
1391
  NumpadSubtract: { id: `lnkAdjustmentLL` },
1348
1392
 
1349
1393
  ShiftLeft_KeyV: { id: `lnkVolumeL` },
1394
+ ShiftRight_KeyV: { id: `lnkVolumeL` },
1350
1395
  KeyV: { id: `lnkVolumeR` },
1351
1396
 
1352
1397
  KeyI: { id: `btnGraph` },
@@ -1365,10 +1410,12 @@ const g_shortcutObj = {
1365
1410
  Enter: { id: `btnPlay` },
1366
1411
  NumpadEnter: { id: `btnPlay` },
1367
1412
  ShiftLeft_Tab: { id: `btnBack` },
1413
+ ShiftRight_Tab: { id: `btnBack` },
1368
1414
  Tab: { id: `btnDisplay` },
1369
1415
  },
1370
1416
  difSelector: {
1371
1417
  ShiftLeft_KeyD: { id: `lnkDifficultyL` },
1418
+ ShiftRight_KeyD: { id: `lnkDifficultyL` },
1372
1419
  KeyD: { id: `lnkDifficultyR` },
1373
1420
  KeyR: { id: `difRandom` },
1374
1421
  KeyL: { id: `lnkDifficulty` },
@@ -1390,17 +1437,22 @@ const g_shortcutObj = {
1390
1437
  Enter: { id: `lnkDifficulty` },
1391
1438
  NumpadEnter: { id: `lnkDifficulty` },
1392
1439
  ShiftLeft_Tab: { id: `btnBack` },
1440
+ ShiftRight_Tab: { id: `btnBack` },
1393
1441
  Tab: { id: `btnDisplay` },
1394
1442
  },
1395
1443
  settingsDisplay: {
1396
1444
  ShiftLeft_KeyA: { id: `lnkAppearanceL` },
1445
+ ShiftRight_KeyA: { id: `lnkAppearanceL` },
1397
1446
  KeyA: { id: `lnkAppearanceR` },
1398
1447
  ShiftLeft_KeyO: { id: `lnkOpacityL` },
1448
+ ShiftRight_KeyO: { id: `lnkOpacityL` },
1399
1449
  KeyO: { id: `lnkOpacityR` },
1400
1450
 
1401
1451
  ShiftLeft_KeyB: { id: `lnkHitPositionR` },
1452
+ ShiftRight_KeyB: { id: `lnkHitPositionR` },
1402
1453
  KeyB: { id: `lnkHitPositionRR` },
1403
1454
  ShiftLeft_KeyT: { id: `lnkHitPositionL` },
1455
+ ShiftRight_KeyT: { id: `lnkHitPositionL` },
1404
1456
  KeyT: { id: `lnkHitPositionLL` },
1405
1457
 
1406
1458
  Digit1: { id: `lnkstepZone` },
@@ -1437,6 +1489,7 @@ const g_shortcutObj = {
1437
1489
  Enter: { id: `btnPlay` },
1438
1490
  NumpadEnter: { id: `btnPlay` },
1439
1491
  ShiftLeft_Tab: { id: `btnBack` },
1492
+ ShiftRight_Tab: { id: `btnBack` },
1440
1493
  Tab: { id: `btnSettings` },
1441
1494
  },
1442
1495
  keyConfig: {
@@ -1451,7 +1504,9 @@ const g_shortcutObj = {
1451
1504
  result: {
1452
1505
  Escape: { id: `btnBack` },
1453
1506
  ShiftLeft_Tab: { id: `btnBack` },
1507
+ ShiftRight_Tab: { id: `btnBack` },
1454
1508
  ControlLeft_KeyC: { id: `` },
1509
+ ControlRight_KeyC: { id: `` },
1455
1510
  KeyC: { id: `btnCopy`, reset: true },
1456
1511
  KeyT: { id: `btnTweet`, reset: true },
1457
1512
  KeyG: { id: `btnGitter`, reset: true },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "31.7.1",
3
+ "version": "32.1.0",
4
4
  "description": "Dancing☆Onigiri (CW Edition) - Web-based Rhythm Game",
5
5
  "main": "index.js",
6
6
  "scripts": {