danoniplus 30.4.0 → 30.6.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/03/10
7
+ * Revised : 2023/03/18
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 30.4.0`;
12
- const g_revisedDate = `2023/03/10`;
11
+ const g_version = `Ver 30.6.0`;
12
+ const g_revisedDate = `2023/03/18`;
13
13
  const g_alphaVersion = ``;
14
14
 
15
15
  // カスタム用バージョン (danoni_custom.js 等で指定可)
@@ -115,7 +115,9 @@ let g_finishFlg = true;
115
115
  /** 共通オブジェクト */
116
116
  const g_loadObj = {};
117
117
  const g_rootObj = {};
118
- const g_presetObj = {};
118
+ const g_presetObj = {
119
+ keysDataLib: [],
120
+ };
119
121
  let g_headerObj = {};
120
122
  let g_scoreObj = {};
121
123
  let g_attrObj = {};
@@ -387,6 +389,19 @@ const copyArray2d = _array2d => structuredClone(_array2d);
387
389
  */
388
390
  const sumData = _array => _array.reduce((p, x) => p + x);
389
391
 
392
+ /**
393
+ * 最小配列長の配列を作成
394
+ * @param {array} _array
395
+ * @param {number} _minLength
396
+ * @param {number} _defaultVal
397
+ * @returns
398
+ */
399
+ const makeBaseArray = (_array, _minLength, _defaultVal) => {
400
+ const baseArray = [...Array(_minLength)].fill(_defaultVal);
401
+ _array.forEach((val, j) => baseArray[j] = val);
402
+ return baseArray;
403
+ };
404
+
390
405
  /**
391
406
  * 部分一致検索(リストのいずれかに合致、大小文字問わず)
392
407
  * @param {string} _str 検索文字
@@ -1860,9 +1875,13 @@ const initialControl = async () => {
1860
1875
 
1861
1876
  // 譜面ヘッダー、特殊キー情報の読込
1862
1877
  Object.assign(g_headerObj, headerConvert(g_rootObj));
1863
- if (g_presetObj.keysData !== undefined) {
1864
- keysConvert(dosConvert(g_presetObj.keysData));
1878
+ const importKeysData = _data => {
1879
+ keysConvert(dosConvert(_data));
1865
1880
  g_headerObj.undefinedKeyLists = g_headerObj.undefinedKeyLists.filter(key => g_keyObj[`chara${key}_0`] === undefined);
1881
+ };
1882
+ g_presetObj.keysDataLib.forEach(list => importKeysData(list));
1883
+ if (g_presetObj.keysData !== undefined) {
1884
+ importKeysData(g_presetObj.keysData);
1866
1885
  }
1867
1886
  g_headerObj.keyExtraList = keysConvert(g_rootObj, {
1868
1887
  keyExtraList: (g_rootObj.keyExtraList !== undefined ?
@@ -3442,9 +3461,25 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3442
3461
  const toNumber = _num => parseInt(_num, 10);
3443
3462
  const toFloat = _num => parseFloat(_num);
3444
3463
  const toStringOrNumber = _str => isNaN(Number(_str)) ? _str : toNumber(_str);
3445
- const toSplitArray = _str => _str.split(`/`).map(n => toNumber(n));
3464
+ const toKeyCtrlArray = _str => makeBaseArray(_str.split(`/`).map(n => toNumber(n)), g_keyObj.minKeyCtrlNum, 0);
3446
3465
  const toSplitArrayStr = _str => _str.split(`/`).map(n => n);
3447
3466
 
3467
+ /**
3468
+ * キーパターン(相対パターン)をキーパターン(実際のパターン番号)に変換
3469
+ * 例) 12_(0) -> 12_4
3470
+ * それ以外の文字列が来た場合は、そのままの値を戻す
3471
+ * @param {string} _str
3472
+ * @returns
3473
+ */
3474
+ const getKeyPtnName = _str => {
3475
+ const regex = /\((\d+)\)/;
3476
+ const checkStr = _str.match(regex);
3477
+ if (checkStr !== null) {
3478
+ return _str.replace(regex, (match, p) => `${parseInt(p, 10) + setIntVal(g_keyObj.dfPtnNum)}`);
3479
+ }
3480
+ return _str;
3481
+ };
3482
+
3448
3483
  /**
3449
3484
  * 新キー用複合パラメータ
3450
3485
  * @param {string} _key キー数
@@ -3465,8 +3500,9 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3465
3500
  if (existParam(tmpArray[k], `${keyheader}_${k + dfPtn}`)) {
3466
3501
  continue;
3467
3502
  }
3468
- g_keyObj[`${keyheader}_${k + dfPtn}`] = g_keyObj[`${_name}${tmpArray[k]}`] !== undefined ?
3469
- copyArray2d(g_keyObj[`${_name}${tmpArray[k]}`]) : tmpArray[k].split(`,`).map(n => _convFunc(n));
3503
+ const keyPtn = getKeyPtnName(tmpArray[k]);
3504
+ g_keyObj[`${keyheader}_${k + dfPtn}`] = g_keyObj[`${_name}${keyPtn}`] !== undefined ?
3505
+ copyArray2d(g_keyObj[`${_name}${keyPtn}`]) : tmpArray[k].split(`,`).map(n => _convFunc(n));
3470
3506
  if (baseCopyFlg) {
3471
3507
  g_keyObj[`${keyheader}_${k + dfPtn}d`] = copyArray2d(g_keyObj[`${keyheader}_${k + dfPtn}`]);
3472
3508
  }
@@ -3498,15 +3534,16 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3498
3534
  let ptnCnt = 0;
3499
3535
  tmpArray[k].split(`/`).forEach(list => {
3500
3536
 
3537
+ const keyPtn = getKeyPtnName(list);
3501
3538
  if (list === ``) {
3502
3539
  // 空指定の場合は一律同じグループへ割り当て
3503
3540
  g_keyObj[`${keyheader}_${k + dfPtn}_${ptnCnt}`] = [...Array(g_keyObj[`chara${_key}_${k + dfPtn}`].length)].fill(0);
3504
3541
 
3505
- } else if (g_keyObj[`${_name}${list}_0`] !== undefined) {
3542
+ } else if (g_keyObj[`${_name}${keyPtn}_0`] !== undefined) {
3506
3543
  // 他のキーパターン (例: |shuffle8i=8_0| ) を指定した場合、該当があれば既存パターンからコピー
3507
3544
  let m = 0;
3508
- while (g_keyObj[`${_name}${list}_${m}`] !== undefined) {
3509
- g_keyObj[`${keyheader}_${k + dfPtn}_${ptnCnt}`] = structuredClone(g_keyObj[`${_name}${list}_${m}`]);
3545
+ while (g_keyObj[`${_name}${keyPtn}_${m}`] !== undefined) {
3546
+ g_keyObj[`${keyheader}_${k + dfPtn}_${ptnCnt}`] = structuredClone(g_keyObj[`${_name}${keyPtn}_${m}`]);
3510
3547
  m++;
3511
3548
  ptnCnt++;
3512
3549
  }
@@ -3566,17 +3603,23 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3566
3603
  continue;
3567
3604
  }
3568
3605
  g_keyObj[pairName] = {}
3569
- if (g_keyObj[`${_pairName}${tmpParams[k]}`] !== undefined) {
3570
- Object.assign(g_keyObj[pairName], g_keyObj[`${_pairName}${tmpParams[k]}`]);
3571
- } else {
3572
- if (_defaultName !== ``) {
3573
- g_keyObj[pairName][_defaultName] = [...Array(g_keyObj[`chara${_key}_${k + dfPtn}`].length)].fill(_defaultVal);
3574
- }
3575
- tmpParams[k].split(`/`).forEach(pairs => {
3606
+
3607
+ // デフォルト項目がある場合は先に定義
3608
+ if (_defaultName !== ``) {
3609
+ g_keyObj[pairName][_defaultName] = [...Array(g_keyObj[`chara${_key}_${k + dfPtn}`].length)].fill(_defaultVal);
3610
+ }
3611
+ tmpParams[k].split(`/`).forEach(pairs => {
3612
+ const keyPtn = getKeyPtnName(pairs);
3613
+ if (pairs === ``) {
3614
+ } else if (g_keyObj[`${_pairName}${keyPtn}`] !== undefined) {
3615
+ // 他のキーパターン指定時、該当があればプロパティを全コピー
3616
+ Object.assign(g_keyObj[pairName], g_keyObj[`${_pairName}${keyPtn}`]);
3617
+ } else {
3618
+ // 通常の指定方法(例:|scroll8i=Cross::1,1,1,-1,-1,-1,1,1/Split::1,1,1,1,-1,-1,-1,-1|)から取り込み
3576
3619
  const tmpParamPair = pairs.split(`::`);
3577
3620
  g_keyObj[pairName][tmpParamPair[0]] = tmpParamPair[1].split(`,`).map(n => parseInt(n, 10));
3578
- });
3579
- }
3621
+ }
3622
+ });
3580
3623
  }
3581
3624
  }
3582
3625
  };
@@ -3613,7 +3656,7 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3613
3656
  newKeyMultiParam(newKey, `stepRtn`, toStringOrNumber, { errCd: `E_0103` });
3614
3657
 
3615
3658
  // キーコンフィグ (keyCtrlX_Y)
3616
- newKeyMultiParam(newKey, `keyCtrl`, toSplitArray, { errCd: `E_0104`, baseCopyFlg: true });
3659
+ newKeyMultiParam(newKey, `keyCtrl`, toKeyCtrlArray, { errCd: `E_0104`, baseCopyFlg: true });
3617
3660
 
3618
3661
  // ステップゾーン位置 (posX_Y)
3619
3662
  newKeyMultiParam(newKey, `pos`, toFloat);
@@ -5868,6 +5911,7 @@ const keyConfigInit = (_kcType = g_kcType) => {
5868
5911
  createCss2Button(`keycon${j}_${k}`, g_kCd[g_keyObj[`keyCtrl${keyCtrlPtn}`][j][k]], _ => {
5869
5912
  g_currentj = j;
5870
5913
  g_currentk = k;
5914
+ g_prevKey = -1;
5871
5915
  g_keycons.cursorNum = g_keycons.cursorNumList.findIndex(val => val === g_currentj);
5872
5916
  setKeyConfigCursor();
5873
5917
  }, {
@@ -6057,8 +6101,8 @@ const keyConfigInit = (_kcType = g_kcType) => {
6057
6101
  cursor.style.left = `${nextLeft}px`;
6058
6102
  const baseY = C_KYC_HEIGHT * Number(posj > divideCnt) + 57;
6059
6103
  cursor.style.top = `${baseY + C_KYC_REPHEIGHT * g_currentk}px`;
6060
- if (g_currentk === 0 && g_kcType === `Replaced`) {
6061
- g_kcType = C_FLG_ALL;
6104
+ if (g_kcType !== C_FLG_ALL) {
6105
+ g_kcType = (g_currentk === 0 ? `Main` : `Replaced`);
6062
6106
  lnkKcType.textContent = getStgDetailName(g_kcType);
6063
6107
  }
6064
6108
 
@@ -6075,9 +6119,23 @@ const keyConfigInit = (_kcType = g_kcType) => {
6075
6119
 
6076
6120
  g_currentj = g_keycons.cursorNumList[_nextj];
6077
6121
  g_currentk = 0;
6078
- if (g_kcType === `Replaced` && (g_keyObj[`keyCtrl${keyCtrlPtn}`][g_currentj][1] !== undefined)) {
6122
+ if (g_kcType === `Replaced`) {
6079
6123
  g_currentk = 1;
6124
+
6125
+ // 代替キー設定の場合は次の代替キーが見つかるまで移動
6126
+ while (g_keyObj[`keyCtrl${keyCtrlPtn}`][g_currentj][1] === undefined) {
6127
+ g_keycons.cursorNum = (g_keycons.cursorNum + 1) % g_keycons.cursorNumList.length;
6128
+ g_currentj = g_keycons.cursorNumList[g_keycons.cursorNum];
6129
+
6130
+ // 一周して対象が無い場合は代替キーが無いため処理を抜ける(無限ループ対策)
6131
+ if (g_keycons.cursorNum === _nextj) {
6132
+ g_kcType = `Main`;
6133
+ g_currentk = 0;
6134
+ break;
6135
+ }
6136
+ }
6080
6137
  }
6138
+
6081
6139
  setKeyConfigCursor();
6082
6140
  keyconSprite.scrollLeft = - maxLeftX;
6083
6141
  };
@@ -6247,28 +6305,38 @@ const keyConfigInit = (_kcType = g_kcType) => {
6247
6305
  * @param {boolean} _transKeyUse
6248
6306
  * @returns
6249
6307
  */
6250
- const searchPattern = (_tempPtn, _sign, _transKeyUse = false) => {
6308
+ const searchPattern = (_tempPtn, _sign, _transKeyUse = false, _skipFlg = false) => {
6251
6309
  let nextPtn = _tempPtn + _sign;
6310
+ const initialPtn = hasVal(g_keyObj[`keyCtrl${g_keyObj.currentKey}_-1`]) ? -1 : 0;
6252
6311
 
6253
6312
  const searchStart = _ => {
6254
- nextPtn = 0;
6255
- while (hasVal(g_keyObj[`keyCtrl${g_keyObj.currentKey}_${nextPtn}`])) {
6256
- nextPtn -= _sign;
6313
+ if (!hasVal(g_keyObj[`keyCtrl${g_keyObj.currentKey}_${nextPtn}`])) {
6314
+ nextPtn = 0;
6315
+ while (hasVal(g_keyObj[`keyCtrl${g_keyObj.currentKey}_${nextPtn}`])) {
6316
+ nextPtn -= _sign;
6317
+ }
6318
+ nextPtn += _sign;
6257
6319
  }
6258
- nextPtn += _sign;
6259
6320
  };
6260
6321
 
6261
- if (hasVal(g_keyObj[`keyCtrl${g_keyObj.currentKey}_${nextPtn}`])) {
6262
- } else {
6322
+ const searchNextGroup = _ => {
6323
+ while (nextPtn !== initialPtn &&
6324
+ g_keyObj[`transKey${g_keyObj.currentKey}_${_tempPtn}`] === g_keyObj[`transKey${g_keyObj.currentKey}_${nextPtn}`] &&
6325
+ hasVal(g_keyObj[`keyCtrl${g_keyObj.currentKey}_${nextPtn}`])) {
6326
+ nextPtn += _sign;
6327
+ }
6328
+ };
6329
+
6330
+ searchStart();
6331
+ if (_skipFlg) {
6332
+ searchNextGroup();
6263
6333
  searchStart();
6264
6334
  }
6265
6335
  if (!_transKeyUse) {
6266
6336
  while (hasVal(g_keyObj[`transKey${g_keyObj.currentKey}_${nextPtn}`])) {
6267
6337
  nextPtn += _sign;
6268
6338
  }
6269
- if (!hasVal(g_keyObj[`keyCtrl${g_keyObj.currentKey}_${nextPtn}`])) {
6270
- searchStart();
6271
- }
6339
+ searchStart();
6272
6340
  }
6273
6341
  return nextPtn;
6274
6342
  };
@@ -6276,11 +6344,12 @@ const keyConfigInit = (_kcType = g_kcType) => {
6276
6344
  /**
6277
6345
  * キーパターン変更時処理
6278
6346
  * @param {number} _sign
6347
+ * @param {boolean} _skipFlg
6279
6348
  */
6280
- const changePattern = (_sign = 1) => {
6349
+ const changePattern = (_sign = 1, _skipFlg = false) => {
6281
6350
 
6282
6351
  // キーパターンの変更
6283
- g_keyObj.currentPtn = searchPattern(g_keyObj.currentPtn, _sign, g_headerObj.transKeyUse);
6352
+ g_keyObj.currentPtn = searchPattern(g_keyObj.currentPtn, _sign, g_headerObj.transKeyUse, _skipFlg);
6284
6353
 
6285
6354
  // カラーグループ、シャッフルグループの再設定
6286
6355
  g_keycons.groups.forEach(type => resetGroupList(type, `${g_keyObj.currentKey}_${g_keyObj.currentPtn}`));
@@ -6330,13 +6399,23 @@ const keyConfigInit = (_kcType = g_kcType) => {
6330
6399
  'Self' : g_keyObj.currentPtn + 1}${lblTransKey}`, g_lblPosObj.lblPattern),
6331
6400
 
6332
6401
  // パターン変更ボタン描画(右回り)
6333
- createCss2Button(`btnPtnChangeR`, `>>`, _ => true, Object.assign(g_lblPosObj.btnPtnChangeR, {
6402
+ createCss2Button(`btnPtnChangeR`, `>`, _ => true, Object.assign(g_lblPosObj.btnPtnChangeR, {
6334
6403
  resetFunc: _ => changePattern(),
6335
- }), g_cssObj.button_Setting),
6404
+ }), g_cssObj.button_Mini),
6336
6405
 
6337
6406
  // パターン変更ボタン描画(左回り)
6338
- createCss2Button(`btnPtnChangeL`, `<<`, _ => true, Object.assign(g_lblPosObj.btnPtnChangeL, {
6407
+ createCss2Button(`btnPtnChangeL`, `<`, _ => true, Object.assign(g_lblPosObj.btnPtnChangeL, {
6339
6408
  resetFunc: _ => changePattern(-1),
6409
+ }), g_cssObj.button_Mini),
6410
+
6411
+ // パターン変更ボタン描画(右回り/別キーモード間スキップ)
6412
+ createCss2Button(`btnPtnChangeRR`, `|>`, _ => true, Object.assign(g_lblPosObj.btnPtnChangeRR, {
6413
+ resetFunc: _ => changePattern(1, true),
6414
+ }), g_cssObj.button_Setting),
6415
+
6416
+ // パターン変更ボタン描画(左回り/別キーモード間スキップ)
6417
+ createCss2Button(`btnPtnChangeLL`, `<|`, _ => true, Object.assign(g_lblPosObj.btnPtnChangeLL, {
6418
+ resetFunc: _ => changePattern(-1, true),
6340
6419
  }), g_cssObj.button_Setting),
6341
6420
 
6342
6421
  // キーコンフィグリセットボタン描画
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Source by tickle
7
7
  * Created : 2019/11/19
8
- * Revised : 2023/03/10 (v30.4.0)
8
+ * Revised : 2023/03/12 (v30.5.0)
9
9
  *
10
10
  * https://github.com/cwtickle/danoniplus
11
11
  */
@@ -251,11 +251,19 @@ const updateWindowSiz = _ => {
251
251
  },
252
252
  btnPtnChangeR: {
253
253
  x: g_sWidth / 2, y: g_sHeight - 100,
254
- w: g_sWidth / 6, h: C_BTN_HEIGHT / 2, siz: C_LBL_BTNSIZE * 2 / 3,
254
+ w: g_sWidth / 9, h: C_BTN_HEIGHT / 2, siz: C_LBL_BTNSIZE * 2 / 3,
255
255
  },
256
256
  btnPtnChangeL: {
257
+ x: g_sWidth / 18, y: g_sHeight - 100,
258
+ w: g_sWidth / 9, h: C_BTN_HEIGHT / 2, siz: C_LBL_BTNSIZE * 2 / 3,
259
+ },
260
+ btnPtnChangeRR: {
261
+ x: g_sWidth * 11 / 18, y: g_sHeight - 100,
262
+ w: g_sWidth / 18, h: C_BTN_HEIGHT / 2, siz: C_LBL_BTNSIZE * 2 / 3,
263
+ },
264
+ btnPtnChangeLL: {
257
265
  x: 0, y: g_sHeight - 100,
258
- w: g_sWidth / 6, h: C_BTN_HEIGHT / 2, siz: C_LBL_BTNSIZE * 2 / 3,
266
+ w: g_sWidth / 18, h: C_BTN_HEIGHT / 2, siz: C_LBL_BTNSIZE * 2 / 3,
259
267
  },
260
268
  btnKcReset: {
261
269
  x: 0, y: g_sHeight - 75,
@@ -1455,6 +1463,8 @@ const g_keyObj = {
1455
1463
  prevKey: `Dummy`,
1456
1464
  dfPtnNum: 0,
1457
1465
 
1466
+ minKeyCtrlNum: 2,
1467
+
1458
1468
  // キー別ヘッダー
1459
1469
  // - 譜面データ中に出てくる矢印(ノーツ)の種類と順番(ステップゾーン表示順)を管理する。
1460
1470
  // - ここで出てくる順番は、この後のstepRtn, keyCtrlとも対応している。
@@ -1650,51 +1660,51 @@ const g_keyObj = {
1650
1660
  // 基本パターン (キーコンフィグ)
1651
1661
  // - 順番はchara, stepRtnと対応している。
1652
1662
  // - 多次元配列内はステップに対応するキーコードを示す。カンマ区切りで複数指定できる。
1653
- keyCtrl5_0: [[37, 0], [40, 0], [38, 0], [39, 0], [32, 0]],
1654
- keyCtrl7_0: [[83, 0], [68, 0], [70, 0], [32, 0], [74, 0], [75, 0], [76, 0]],
1655
- keyCtrl7i_0: [[90, 0], [88, 0], [67, 0], [37, 0], [40, 0], [38, 0], [39, 0]],
1656
- keyCtrl8_0: [[83, 0], [68, 0], [70, 0], [32, 0], [74, 0], [75, 0], [76, 0], [13, 0]],
1657
- keyCtrl9A_0: [[83, 0], [68, 0], [69, 82], [70, 0], [32, 0], [74, 0], [75, 0], [73, 0], [76, 0]],
1658
- keyCtrl9B_0: [[65, 0], [83, 0], [68, 0], [70, 0], [32, 0], [74, 0], [75, 0], [76, 0], [187, 0]],
1659
- keyCtrl9i_0: [[37, 0], [40, 0], [38, 0], [39, 0], [65, 0], [83, 0], [68, 0], [70, 0], [32, 0]],
1660
- keyCtrl11_0: [[37, 0], [40, 0], [38, 0], [39, 0], [83, 0], [68, 0], [70, 0], [32, 0], [74, 0], [75, 0], [76, 0]],
1661
- keyCtrl11L_0: [[87, 0], [69, 0], [51, 52], [82, 0], [83, 0], [68, 0], [70, 0], [32, 0], [74, 0], [75, 0], [76, 0]],
1662
- keyCtrl11W_0: [[49, 50], [84, 0], [89, 0], [48, 189], [83, 0], [68, 0], [70, 0], [32, 0], [74, 0], [75, 0], [76, 0]],
1663
- keyCtrl11i_0: [[83, 0], [88, 67], [68, 0], [69, 82], [70, 0], [32, 0], [74, 0], [77, 188], [75, 0], [73, 79], [76, 0]],
1664
- keyCtrl12_0: [[85, 0], [73, 0], [56, 57], [79, 0], [32, 0], [78, 0], [74, 0], [77, 0], [75, 0], [188, 0], [76, 0], [190, 0]],
1665
- keyCtrl13_0: [[37, 0], [40, 0], [38, 0], [39, 0], [83, 0], [68, 0], [69, 82], [70, 0], [32, 0], [74, 0], [75, 0], [73, 0], [76, 0]],
1666
- keyCtrl14_0: [[84, 89], [85, 0], [73, 0], [56, 55, 57, 48], [79, 0], [192, 80], [32, 0], [78, 0], [74, 0], [77, 0], [75, 0], [188, 0], [76, 0], [190, 0]],
1667
- keyCtrl14i_0: [[90, 87], [88, 69], [67, 82], [37, 0], [40, 0], [38, 0], [39, 0], [83, 0], [68, 0], [70, 0], [32, 0], [74, 0], [75, 0], [76, 0]],
1668
- keyCtrl15A_0: [[87, 0], [69, 0], [51, 52], [82, 0], [37, 0], [40, 0], [38, 0], [39, 0], [83, 0], [68, 0], [70, 0], [32, 0], [74, 0], [75, 0], [76, 0]],
1669
- keyCtrl15B_0: [[87, 0], [69, 0], [51, 52], [82, 0], [85, 0], [73, 0], [56, 57], [79, 0], [83, 0], [68, 0], [70, 0], [32, 0], [74, 0], [75, 0], [76, 0]],
1670
- keyCtrl16i_0: [[90, 87], [88, 69], [67, 82], [37, 0], [40, 0], [38, 0], [39, 0], [65, 0], [83, 0], [68, 0], [70, 0], [32, 0], [74, 0], [75, 0], [76, 0], [187, 0]],
1671
- keyCtrl17_0: [[65, 0], [90, 0], [83, 0], [88, 0], [68, 0], [67, 0], [70, 0], [86, 0], [32, 0], [78, 0], [74, 0], [77, 0], [75, 0], [188, 0], [76, 0], [190, 0], [187, 0]],
1672
- keyCtrl23_0: [[87, 0], [69, 0], [51, 52], [82, 0], [85, 0], [73, 0], [56, 57], [79, 0],
1673
- [90, 0], [83, 0], [88, 0], [68, 0], [67, 0], [70, 0], [86, 0], [32, 0], [78, 0], [74, 0], [77, 0], [75, 0], [188, 0], [76, 0], [190, 0]],
1663
+ keyCtrl5_0: [[37], [40], [38], [39], [32]],
1664
+ keyCtrl7_0: [[83], [68], [70], [32], [74], [75], [76]],
1665
+ keyCtrl7i_0: [[90], [88], [67], [37], [40], [38], [39]],
1666
+ keyCtrl8_0: [[83], [68], [70], [32], [74], [75], [76], [13]],
1667
+ keyCtrl9A_0: [[83], [68], [69, 82], [70], [32], [74], [75], [73], [76]],
1668
+ keyCtrl9B_0: [[65], [83], [68], [70], [32], [74], [75], [76], [187]],
1669
+ keyCtrl9i_0: [[37], [40], [38], [39], [65], [83], [68], [70], [32]],
1670
+ keyCtrl11_0: [[37], [40], [38], [39], [83], [68], [70], [32], [74], [75], [76]],
1671
+ keyCtrl11L_0: [[87], [69], [51, 52], [82], [83], [68], [70], [32], [74], [75], [76]],
1672
+ keyCtrl11W_0: [[49, 50], [84], [89], [48, 189], [83], [68], [70], [32], [74], [75], [76]],
1673
+ keyCtrl11i_0: [[83], [88, 67], [68], [69, 82], [70], [32], [74], [77, 188], [75], [73, 79], [76]],
1674
+ keyCtrl12_0: [[85], [73], [56, 57], [79], [32], [78], [74], [77], [75], [188], [76], [190]],
1675
+ keyCtrl13_0: [[37], [40], [38], [39], [83], [68], [69, 82], [70], [32], [74], [75], [73], [76]],
1676
+ keyCtrl14_0: [[84, 89], [85], [73], [56, 55, 57, 48], [79], [192, 80], [32], [78], [74], [77], [75], [188], [76], [190]],
1677
+ keyCtrl14i_0: [[90, 87], [88, 69], [67, 82], [37], [40], [38], [39], [83], [68], [70], [32], [74], [75], [76]],
1678
+ keyCtrl15A_0: [[87], [69], [51, 52], [82], [37], [40], [38], [39], [83], [68], [70], [32], [74], [75], [76]],
1679
+ keyCtrl15B_0: [[87], [69], [51, 52], [82], [85], [73], [56, 57], [79], [83], [68], [70], [32], [74], [75], [76]],
1680
+ keyCtrl16i_0: [[90, 87], [88, 69], [67, 82], [37], [40], [38], [39], [65], [83], [68], [70], [32], [74], [75], [76], [187]],
1681
+ keyCtrl17_0: [[65], [90], [83], [88], [68], [67], [70], [86], [32], [78], [74], [77], [75], [188], [76], [190], [187]],
1682
+ keyCtrl23_0: [[87], [69], [51, 52], [82], [85], [73], [56, 57], [79],
1683
+ [90], [83], [88], [68], [67], [70], [86], [32], [78], [74], [77], [75], [188], [76], [190]],
1674
1684
 
1675
1685
  // 変則パターン (キーコンフィグ)
1676
1686
  // - _0 の数字部分をカウントアップすることで実現できる。
1677
- keyCtrl5_1: [[32, 0], [37, 0], [40, 0], [38, 0], [39, 0]],
1678
- keyCtrl7_1: [[83, 0], [69, 0], [70, 0], [32, 71, 72], [74, 0], [73, 0], [76, 0]],
1679
- keyCtrl8_1: [[13, 0], [83, 0], [68, 0], [70, 0], [32, 0], [74, 0], [75, 0], [76, 0]],
1680
- keyCtrl9A_1: [[83, 0], [68, 0], [69, 82], [70, 0], [32, 0], [37, 0], [40, 0], [38, 0], [39, 0]],
1681
- keyCtrl9i_1: [[65, 0], [83, 0], [68, 0], [70, 0], [32, 0], [37, 0], [40, 0], [38, 0], [39, 0]],
1682
- keyCtrl12_1: [[89, 0], [85, 73], [56, 55, 57], [79, 0], [32, 0], [66, 0], [72, 0], [78, 77], [74, 75], [188, 0], [76, 0], [190, 0]],
1683
- keyCtrl14_1: [[82, 84], [89, 0], [85, 73], [56, 54, 55, 57, 48], [79, 0], [192, 80], [32, 0], [66, 0], [72, 0], [78, 77], [74, 75], [188, 0], [76, 0], [190, 0]],
1684
- keyCtrl17_1: [[65, 0], [83, 0], [68, 0], [70, 0], [32, 0], [74, 0], [75, 0], [76, 0], [187, 0], [90, 0], [88, 0], [67, 0], [86, 0], [78, 0], [77, 0], [188, 0], [190, 0]],
1687
+ keyCtrl5_1: [[32], [37], [40], [38], [39]],
1688
+ keyCtrl7_1: [[83], [69], [70], [32, 71, 72], [74], [73], [76]],
1689
+ keyCtrl8_1: [[13], [83], [68], [70], [32], [74], [75], [76]],
1690
+ keyCtrl9A_1: [[83], [68], [69, 82], [70], [32], [37], [40], [38], [39]],
1691
+ keyCtrl9i_1: [[65], [83], [68], [70], [32], [37], [40], [38], [39]],
1692
+ keyCtrl12_1: [[89], [85, 73], [56, 55, 57], [79], [32], [66], [72], [78, 77], [74, 75], [188], [76], [190]],
1693
+ keyCtrl14_1: [[82, 84], [89], [85, 73], [56, 54, 55, 57, 48], [79], [192, 80], [32], [66], [72], [78, 77], [74, 75], [188], [76], [190]],
1694
+ keyCtrl17_1: [[65], [83], [68], [70], [32], [74], [75], [76], [187], [90], [88], [67], [86], [78], [77], [188], [190]],
1685
1695
 
1686
- keyCtrl5_2: [[68, 0], [70, 0], [32, 0], [74, 0], [75, 0]],
1687
- keyCtrl8_2: [[32, 0], [78, 0], [74, 0], [77, 0], [75, 0], [188, 0], [76, 0], [190, 0]],
1688
- keyCtrl12_2: [[87, 0], [69, 0], [51, 52], [82, 0], [16, 0], [90, 0], [83, 0], [88, 0], [68, 0], [67, 0], [70, 0], [86, 0]],
1689
- keyCtrl14_2: [[9, 81], [87, 0], [69, 0], [51, 50, 52, 53], [82, 0], [89, 84], [16, 0], [90, 0], [83, 0], [88, 0], [68, 0], [67, 0], [70, 0], [86, 0]],
1696
+ keyCtrl5_2: [[68], [70], [32], [74], [75]],
1697
+ keyCtrl8_2: [[32], [78], [74], [77], [75], [188], [76], [190]],
1698
+ keyCtrl12_2: [[87], [69], [51, 52], [82], [16], [90], [83], [88], [68], [67], [70], [86]],
1699
+ keyCtrl14_2: [[9, 81], [87], [69], [51, 50, 52, 53], [82], [89, 84], [16], [90], [83], [88], [68], [67], [70], [86]],
1690
1700
 
1691
- keyCtrl8_3: [[32, 0], [66, 0], [72, 0], [78, 77], [74, 75], [188, 0], [76, 0], [190, 0]],
1692
- keyCtrl12_3: [[87, 0], [69, 82], [51, 52, 53], [84, 0], [16, 0], [90, 0], [83, 0], [88, 67], [68, 70], [86, 0], [71, 0], [66, 0]],
1693
- keyCtrl14_3: [[9, 81], [87, 0], [69, 82], [51, 50, 52, 53, 54], [84, 0], [85, 89], [16, 0], [90, 0], [83, 0], [88, 67], [68, 70], [86, 0], [71, 0], [66, 0]],
1701
+ keyCtrl8_3: [[32], [66], [72], [78, 77], [74, 75], [188], [76], [190]],
1702
+ keyCtrl12_3: [[87], [69, 82], [51, 52, 53], [84], [16], [90], [83], [88, 67], [68, 70], [86], [71], [66]],
1703
+ keyCtrl14_3: [[9, 81], [87], [69, 82], [51, 50, 52, 53, 54], [84], [85, 89], [16], [90], [83], [88, 67], [68, 70], [86], [71], [66]],
1694
1704
 
1695
- keyCtrl8_4: [[16, 0], [90, 0], [83, 0], [88, 0], [68, 0], [67, 0], [70, 0], [86, 0]],
1705
+ keyCtrl8_4: [[16], [90], [83], [88], [68], [67], [70], [86]],
1696
1706
 
1697
- keyCtrl8_5: [[16, 0], [90, 0], [83, 0], [88, 67], [68, 70], [86, 0], [71, 0], [66, 0]],
1707
+ keyCtrl8_5: [[16], [90], [83], [88, 67], [68, 70], [86], [71], [66]],
1698
1708
 
1699
1709
  // 矢印間隔補正
1700
1710
  blank: 55,
@@ -2040,9 +2050,14 @@ Object.keys(g_copyKeyPtn).forEach(keyPtnTo => {
2040
2050
  });
2041
2051
 
2042
2052
  // デフォルト配列のコピー (g_keyObj.aaa_X から g_keyObj.aaa_Xd を作成)
2053
+ // keyCtrlX_Yについて1キーにつき2キー割り当てできるように配列を補完
2043
2054
  const keyCtrlName = Object.keys(g_keyObj).filter(val => val.startsWith(`keyCtrl`));
2044
- keyCtrlName.forEach(property => g_keyObj[`${property}d`] = copyArray2d(g_keyObj[property]));
2055
+ keyCtrlName.forEach(property => {
2056
+ g_keyObj[property].forEach((list, j) => g_keyObj[property][j] = makeBaseArray(g_keyObj[property][j], g_keyObj.minKeyCtrlNum, 0));
2057
+ g_keyObj[`${property}d`] = copyArray2d(g_keyObj[property]);
2058
+ });
2045
2059
 
2060
+ // shuffleX_Y, colorX_Yについてデフォルト配列を作成
2046
2061
  g_keycons.groups.forEach(type => {
2047
2062
  const tmpName = Object.keys(g_keyObj).filter(val => val.startsWith(type) && val.endsWith(`_0`));
2048
2063
  tmpName.forEach(property => g_keyObj[`${property.slice(0, -2)}`] = g_keyObj[property].concat());
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "30.4.0",
3
+ "version": "30.6.0",
4
4
  "description": "Dancing☆Onigiri (CW Edition) - Web-based Rhythm Game",
5
5
  "main": "index.js",
6
6
  "scripts": {