danoniplus 30.3.1 → 30.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/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![Maintainability](https://api.codeclimate.com/v1/badges/9558f21e17a47a4dc987/maintainability)](https://codeclimate.com/github/cwtickle/danoniplus/maintainability)
4
4
  [![CodeQL](https://github.com/cwtickle/danoniplus/workflows/CodeQL/badge.svg)](https://github.com/cwtickle/danoniplus/actions?query=workflow%3ACodeQL)
5
- [![Join the chat at https://gitter.im/danonicw/community](https://badges.gitter.im/danonicw/community.svg)](https://gitter.im/danonicw/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
5
+ [![GitLab Community](https://img.shields.io/gitlab/issues/open/cwtickle/danonicw?gitlab_url=https%3A%2F%2Fgitlab.com%2F&label=Community&logo=gitlab)](https://gitlab.com/cwtickle/danonicw/-/issues)
6
6
  [![GitHub release (latest SemVer)](https://img.shields.io/github/v/release/cwtickle/danoniplus?sort=semver)](https://github.com/cwtickle/danoniplus/security/policy)
7
7
  [![GitHub All Releases](https://img.shields.io/github/downloads/cwtickle/danoniplus/total?color=%23ff3399&label=downloads%20%28recently%29)](https://github.com/cwtickle/danoniplus/releases)
8
8
  [![GitHub](https://img.shields.io/github/license/cwtickle/danoniplus)](https://github.com/cwtickle/danoniplus/blob/develop/LICENSE)
@@ -89,12 +89,12 @@ If you would like to cooperate with the development, please see below. Even if y
89
89
 
90
90
  開発にご協力いただける方は、下記をご覧ください。GitHubアカウントの無い方でも協力できます!
91
91
  - [How to Contribute / 貢献の仕方](https://github.com/cwtickle/danoniplus/blob/develop/.github/CONTRIBUTING.md)
92
- - [Gitter for requests and bug reports / 要望・不具合報告(Gitter)](https://gitter.im/danonicw/community)
92
+ - [GitLab community for requests and bug reports / 要望・不具合報告(GitLab Issues)](https://gitlab.com/cwtickle/danonicw/-/issues)
93
93
  - [Contributors / コントリビューター](https://github.com/cwtickle/danoniplus/blob/develop/CONTRIBUTORS.md)
94
94
 
95
95
  ## Community / コミュニティ
96
96
  - [Dancing☆Onigiri Discord server](https://discord.gg/TegbHFY7zg)
97
- - [Gitter for score reporting / 得点報告(Gitter)](https://gitter.im/danonicw/freeboard)
97
+ - [Gitter for score reporting / 得点報告(Gitter)](https://app.gitter.im/#/room/#danonicw_freeboard:gitter.im)
98
98
  - [Twitter #danoni](https://twitter.com/search?q=%23danoni&src=typed_query&f=live)
99
99
 
100
100
  ## Related Tools Repository / 関連リポジトリ・ツール
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/04
7
+ * Revised : 2023/03/12
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 30.3.1`;
12
- const g_revisedDate = `2023/03/04`;
11
+ const g_version = `Ver 30.5.0`;
12
+ const g_revisedDate = `2023/03/12`;
13
13
  const g_alphaVersion = ``;
14
14
 
15
15
  // カスタム用バージョン (danoni_custom.js 等で指定可)
@@ -387,6 +387,19 @@ const copyArray2d = _array2d => structuredClone(_array2d);
387
387
  */
388
388
  const sumData = _array => _array.reduce((p, x) => p + x);
389
389
 
390
+ /**
391
+ * 最小配列長の配列を作成
392
+ * @param {array} _array
393
+ * @param {number} _minLength
394
+ * @param {number} _defaultVal
395
+ * @returns
396
+ */
397
+ const makeBaseArray = (_array, _minLength, _defaultVal) => {
398
+ const baseArray = [...Array(_minLength)].fill(_defaultVal);
399
+ _array.forEach((val, j) => baseArray[j] = val);
400
+ return baseArray;
401
+ };
402
+
390
403
  /**
391
404
  * 部分一致検索(リストのいずれかに合致、大小文字問わず)
392
405
  * @param {string} _str 検索文字
@@ -3442,9 +3455,25 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3442
3455
  const toNumber = _num => parseInt(_num, 10);
3443
3456
  const toFloat = _num => parseFloat(_num);
3444
3457
  const toStringOrNumber = _str => isNaN(Number(_str)) ? _str : toNumber(_str);
3445
- const toSplitArray = _str => _str.split(`/`).map(n => toNumber(n));
3458
+ const toKeyCtrlArray = _str => makeBaseArray(_str.split(`/`).map(n => toNumber(n)), g_keyObj.minKeyCtrlNum, 0);
3446
3459
  const toSplitArrayStr = _str => _str.split(`/`).map(n => n);
3447
3460
 
3461
+ /**
3462
+ * キーパターン(相対パターン)をキーパターン(実際のパターン番号)に変換
3463
+ * 例) 12_(0) -> 12_4
3464
+ * それ以外の文字列が来た場合は、そのままの値を戻す
3465
+ * @param {string} _str
3466
+ * @returns
3467
+ */
3468
+ const getKeyPtnName = _str => {
3469
+ const regex = /\((\d+)\)/;
3470
+ const checkStr = _str.match(regex);
3471
+ if (checkStr !== null) {
3472
+ return _str.replace(regex, (match, p) => `${parseInt(p, 10) + setIntVal(g_keyObj.dfPtnNum)}`);
3473
+ }
3474
+ return _str;
3475
+ };
3476
+
3448
3477
  /**
3449
3478
  * 新キー用複合パラメータ
3450
3479
  * @param {string} _key キー数
@@ -3465,8 +3494,9 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3465
3494
  if (existParam(tmpArray[k], `${keyheader}_${k + dfPtn}`)) {
3466
3495
  continue;
3467
3496
  }
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));
3497
+ const keyPtn = getKeyPtnName(tmpArray[k]);
3498
+ g_keyObj[`${keyheader}_${k + dfPtn}`] = g_keyObj[`${_name}${keyPtn}`] !== undefined ?
3499
+ copyArray2d(g_keyObj[`${_name}${keyPtn}`]) : tmpArray[k].split(`,`).map(n => _convFunc(n));
3470
3500
  if (baseCopyFlg) {
3471
3501
  g_keyObj[`${keyheader}_${k + dfPtn}d`] = copyArray2d(g_keyObj[`${keyheader}_${k + dfPtn}`]);
3472
3502
  }
@@ -3483,43 +3513,51 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3483
3513
  * 新キー用複合パラメータ(特殊)
3484
3514
  * @param {string} _key キー数
3485
3515
  * @param {string} _name 名前
3486
- * @param {object} _obj errCd エラーコード
3487
- * @returns 最小パターン数
3488
3516
  */
3489
- const newKeyTripleParam = (_key, _name, { errCd = `` } = {}) => {
3490
- let tmpMinPatterns = 1;
3517
+ const newKeyTripleParam = (_key, _name) => {
3491
3518
  const keyheader = _name + _key;
3492
3519
  const dfPtn = setIntVal(g_keyObj.dfPtnNum);
3493
3520
 
3494
3521
  if (hasVal(_dosObj[keyheader])) {
3495
3522
  const tmpArray = splitLF2(_dosObj[keyheader]);
3496
- tmpMinPatterns = tmpArray.length;
3497
- for (let k = 0; k < tmpMinPatterns; k++) {
3523
+ for (let k = 0; k < tmpArray.length; k++) {
3498
3524
  if (existParam(tmpArray[k], `${keyheader}_${k + dfPtn}`)) {
3499
3525
  continue;
3500
3526
  }
3501
- if (g_keyObj[`${_name}${tmpArray[k]}_0`] !== undefined) {
3502
3527
 
3503
- // 他のキーパターン (例: |shuffle8i=8_0| ) を指定した場合、該当があれば既存パターンからコピー
3504
- let m = 0;
3505
- while (g_keyObj[`${_name}${tmpArray[k]}_${m}`] !== undefined) {
3506
- g_keyObj[`${keyheader}_${k + dfPtn}_${m}`] = structuredClone(g_keyObj[`${_name}${tmpArray[k]}_${m}`]);
3507
- m++;
3528
+ let ptnCnt = 0;
3529
+ tmpArray[k].split(`/`).forEach(list => {
3530
+
3531
+ const keyPtn = getKeyPtnName(list);
3532
+ if (list === ``) {
3533
+ // 空指定の場合は一律同じグループへ割り当て
3534
+ g_keyObj[`${keyheader}_${k + dfPtn}_${ptnCnt}`] = [...Array(g_keyObj[`chara${_key}_${k + dfPtn}`].length)].fill(0);
3535
+
3536
+ } else if (g_keyObj[`${_name}${keyPtn}_0`] !== undefined) {
3537
+ // 他のキーパターン (例: |shuffle8i=8_0| ) を指定した場合、該当があれば既存パターンからコピー
3538
+ let m = 0;
3539
+ while (g_keyObj[`${_name}${keyPtn}_${m}`] !== undefined) {
3540
+ g_keyObj[`${keyheader}_${k + dfPtn}_${ptnCnt}`] = structuredClone(g_keyObj[`${_name}${keyPtn}_${m}`]);
3541
+ m++;
3542
+ ptnCnt++;
3543
+ }
3544
+ } else {
3545
+ // 通常の指定方法 (例: |shuffle8i=1,1,1,2,0,0,0,0/1,1,1,1,0,0,0,0| )の場合の取り込み
3546
+ g_keyObj[`${keyheader}_${k + dfPtn}_${ptnCnt}`] = list.split(`,`).map(n => parseInt(n, 10));
3547
+ ptnCnt++;
3508
3548
  }
3509
- } else {
3510
-
3511
- // 通常の指定方法 (例: |shuffle8i=1,1,1,2,0,0,0,0/1,1,1,1,0,0,0,0| )の場合の取り込み
3512
- tmpArray[k].split(`/`).forEach((list, m) =>
3513
- g_keyObj[`${keyheader}_${k + dfPtn}_${m}`] = (list === `` ?
3514
- [...Array(g_keyObj[`chara${_key}_${k + dfPtn}`].length)].fill(0) : list.split(`,`).map(n => parseInt(n, 10))));
3515
- }
3549
+ });
3516
3550
  g_keyObj[`${keyheader}_${k + dfPtn}`] = structuredClone(g_keyObj[`${keyheader}_${k + dfPtn}_0`]);
3517
3551
  }
3518
3552
 
3519
- } else if (errCd !== `` && g_keyObj[`${keyheader}_0`] === undefined) {
3520
- makeWarningWindow(g_msgInfoObj[errCd].split(`{0}`).join(_key));
3553
+ } else if (g_keyObj[`${keyheader}_${dfPtn}_0`] === undefined) {
3554
+ // 特に指定が無い場合はcharaX_Yの配列長で決定
3555
+ for (let k = 0; k < g_keyObj.minPatterns; k++) {
3556
+ const ptnName = `${_key}_${k + dfPtn}`;
3557
+ g_keyObj[`${_name}${ptnName}_0`] = [...Array(g_keyObj[`chara${ptnName}`].length)].fill(0);
3558
+ g_keyObj[`${_name}${ptnName}`] = structuredClone(g_keyObj[`${_name}${ptnName}_0`]);
3559
+ }
3521
3560
  }
3522
- return tmpMinPatterns;
3523
3561
  };
3524
3562
 
3525
3563
  /**
@@ -3559,24 +3597,30 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3559
3597
  continue;
3560
3598
  }
3561
3599
  g_keyObj[pairName] = {}
3562
- if (g_keyObj[`${_pairName}${tmpParams[k]}`] !== undefined) {
3563
- Object.assign(g_keyObj[pairName], g_keyObj[`${_pairName}${tmpParams[k]}`]);
3564
- } else {
3565
- if (_defaultName !== ``) {
3566
- g_keyObj[pairName][_defaultName] = [...Array(g_keyObj[`chara${_key}_${k + dfPtn}`].length)].fill(_defaultVal);
3567
- }
3568
- tmpParams[k].split(`/`).forEach(pairs => {
3600
+
3601
+ // デフォルト項目がある場合は先に定義
3602
+ if (_defaultName !== ``) {
3603
+ g_keyObj[pairName][_defaultName] = [...Array(g_keyObj[`chara${_key}_${k + dfPtn}`].length)].fill(_defaultVal);
3604
+ }
3605
+ tmpParams[k].split(`/`).forEach(pairs => {
3606
+ const keyPtn = getKeyPtnName(pairs);
3607
+ if (pairs === ``) {
3608
+ } else if (g_keyObj[`${_pairName}${keyPtn}`] !== undefined) {
3609
+ // 他のキーパターン指定時、該当があればプロパティを全コピー
3610
+ Object.assign(g_keyObj[pairName], g_keyObj[`${_pairName}${keyPtn}`]);
3611
+ } else {
3612
+ // 通常の指定方法(例:|scroll8i=Cross::1,1,1,-1,-1,-1,1,1/Split::1,1,1,1,-1,-1,-1,-1|)から取り込み
3569
3613
  const tmpParamPair = pairs.split(`::`);
3570
3614
  g_keyObj[pairName][tmpParamPair[0]] = tmpParamPair[1].split(`,`).map(n => parseInt(n, 10));
3571
- });
3572
- }
3615
+ }
3616
+ });
3573
3617
  }
3574
3618
  }
3575
3619
  };
3576
3620
 
3577
3621
  // 対象キー毎に処理
3578
3622
  keyExtraList.forEach(newKey => {
3579
- let tmpMinPatterns = 1;
3623
+ g_keyObj.minPatterns = 1;
3580
3624
  g_keyObj.dfPtnNum = 0;
3581
3625
 
3582
3626
  // キーパターンの追記 (appendX)
@@ -3596,17 +3640,17 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3596
3640
  // キーの最小横幅 (minWidthX)
3597
3641
  g_keyObj[`minWidth${newKey}`] = _dosObj[`minWidth${newKey}`] ?? g_keyObj[`minWidth${newKey}`] ?? g_keyObj.minWidthDefault;
3598
3642
 
3599
- // 矢印色パターン (colorX_Y)
3600
- tmpMinPatterns = newKeyTripleParam(newKey, `color`, { errCd: `E_0101` });
3601
-
3602
3643
  // 読込変数の接頭辞 (charaX_Y)
3603
- tmpMinPatterns = newKeyMultiParam(newKey, `chara`, toString, { errCd: `E_0102` });
3644
+ g_keyObj.minPatterns = newKeyMultiParam(newKey, `chara`, toString, { errCd: `E_0102` });
3645
+
3646
+ // 矢印色パターン (colorX_Y)
3647
+ newKeyTripleParam(newKey, `color`);
3604
3648
 
3605
3649
  // 矢印の回転量指定、キャラクタパターン (stepRtnX_Y)
3606
- tmpMinPatterns = newKeyMultiParam(newKey, `stepRtn`, toStringOrNumber, { errCd: `E_0103` });
3650
+ newKeyMultiParam(newKey, `stepRtn`, toStringOrNumber, { errCd: `E_0103` });
3607
3651
 
3608
3652
  // キーコンフィグ (keyCtrlX_Y)
3609
- tmpMinPatterns = newKeyMultiParam(newKey, `keyCtrl`, toSplitArray, { errCd: `E_0104`, baseCopyFlg: true });
3653
+ newKeyMultiParam(newKey, `keyCtrl`, toKeyCtrlArray, { errCd: `E_0104`, baseCopyFlg: true });
3610
3654
 
3611
3655
  // ステップゾーン位置 (posX_Y)
3612
3656
  newKeyMultiParam(newKey, `pos`, toFloat);
@@ -3633,7 +3677,7 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3633
3677
  }
3634
3678
  }
3635
3679
  // posX_Y, divX_Y, divMaxX_Yが未指定の場合はcharaX_Yを元に適用
3636
- for (let k = 0; k < tmpMinPatterns; k++) {
3680
+ for (let k = 0; k < g_keyObj.minPatterns; k++) {
3637
3681
  setKeyDfVal(`${newKey}_${k + dfPtnNum}`);
3638
3682
  }
3639
3683
 
@@ -3654,14 +3698,6 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3654
3698
 
3655
3699
  // シャッフルグループ (shuffleX_Y)
3656
3700
  newKeyTripleParam(newKey, `shuffle`);
3657
- if (g_keyObj[`shuffle${newKey}_${dfPtnNum}_0`] === undefined) {
3658
- // 特に指定が無い場合はcolorX_Yの配列長で決定
3659
- for (let k = 0; k < tmpMinPatterns; k++) {
3660
- const ptnName = `${newKey}_${k + dfPtnNum}`;
3661
- g_keyObj[`shuffle${ptnName}_0`] = [...Array(g_keyObj[`chara${ptnName}`].length)].fill(0);
3662
- g_keyObj[`shuffle${ptnName}`] = structuredClone(g_keyObj[`shuffle${ptnName}_0`]);
3663
- }
3664
- }
3665
3701
 
3666
3702
  // キーグループ (keyGroupX_Y)
3667
3703
  newKeyMultiParam(newKey, `keyGroup`, toSplitArrayStr);
@@ -6248,28 +6284,38 @@ const keyConfigInit = (_kcType = g_kcType) => {
6248
6284
  * @param {boolean} _transKeyUse
6249
6285
  * @returns
6250
6286
  */
6251
- const searchPattern = (_tempPtn, _sign, _transKeyUse = false) => {
6287
+ const searchPattern = (_tempPtn, _sign, _transKeyUse = false, _skipFlg = false) => {
6252
6288
  let nextPtn = _tempPtn + _sign;
6289
+ const initialPtn = hasVal(g_keyObj[`keyCtrl${g_keyObj.currentKey}_-1`]) ? -1 : 0;
6253
6290
 
6254
6291
  const searchStart = _ => {
6255
- nextPtn = 0;
6256
- while (hasVal(g_keyObj[`keyCtrl${g_keyObj.currentKey}_${nextPtn}`])) {
6257
- nextPtn -= _sign;
6292
+ if (!hasVal(g_keyObj[`keyCtrl${g_keyObj.currentKey}_${nextPtn}`])) {
6293
+ nextPtn = 0;
6294
+ while (hasVal(g_keyObj[`keyCtrl${g_keyObj.currentKey}_${nextPtn}`])) {
6295
+ nextPtn -= _sign;
6296
+ }
6297
+ nextPtn += _sign;
6258
6298
  }
6259
- nextPtn += _sign;
6260
6299
  };
6261
6300
 
6262
- if (hasVal(g_keyObj[`keyCtrl${g_keyObj.currentKey}_${nextPtn}`])) {
6263
- } else {
6301
+ const searchNextGroup = _ => {
6302
+ while (nextPtn !== initialPtn &&
6303
+ g_keyObj[`transKey${g_keyObj.currentKey}_${_tempPtn}`] === g_keyObj[`transKey${g_keyObj.currentKey}_${nextPtn}`] &&
6304
+ hasVal(g_keyObj[`keyCtrl${g_keyObj.currentKey}_${nextPtn}`])) {
6305
+ nextPtn += _sign;
6306
+ }
6307
+ };
6308
+
6309
+ searchStart();
6310
+ if (_skipFlg) {
6311
+ searchNextGroup();
6264
6312
  searchStart();
6265
6313
  }
6266
6314
  if (!_transKeyUse) {
6267
6315
  while (hasVal(g_keyObj[`transKey${g_keyObj.currentKey}_${nextPtn}`])) {
6268
6316
  nextPtn += _sign;
6269
6317
  }
6270
- if (!hasVal(g_keyObj[`keyCtrl${g_keyObj.currentKey}_${nextPtn}`])) {
6271
- searchStart();
6272
- }
6318
+ searchStart();
6273
6319
  }
6274
6320
  return nextPtn;
6275
6321
  };
@@ -6277,11 +6323,12 @@ const keyConfigInit = (_kcType = g_kcType) => {
6277
6323
  /**
6278
6324
  * キーパターン変更時処理
6279
6325
  * @param {number} _sign
6326
+ * @param {boolean} _skipFlg
6280
6327
  */
6281
- const changePattern = (_sign = 1) => {
6328
+ const changePattern = (_sign = 1, _skipFlg = false) => {
6282
6329
 
6283
6330
  // キーパターンの変更
6284
- g_keyObj.currentPtn = searchPattern(g_keyObj.currentPtn, _sign, g_headerObj.transKeyUse);
6331
+ g_keyObj.currentPtn = searchPattern(g_keyObj.currentPtn, _sign, g_headerObj.transKeyUse, _skipFlg);
6285
6332
 
6286
6333
  // カラーグループ、シャッフルグループの再設定
6287
6334
  g_keycons.groups.forEach(type => resetGroupList(type, `${g_keyObj.currentKey}_${g_keyObj.currentPtn}`));
@@ -6331,13 +6378,23 @@ const keyConfigInit = (_kcType = g_kcType) => {
6331
6378
  'Self' : g_keyObj.currentPtn + 1}${lblTransKey}`, g_lblPosObj.lblPattern),
6332
6379
 
6333
6380
  // パターン変更ボタン描画(右回り)
6334
- createCss2Button(`btnPtnChangeR`, `>>`, _ => true, Object.assign(g_lblPosObj.btnPtnChangeR, {
6381
+ createCss2Button(`btnPtnChangeR`, `>`, _ => true, Object.assign(g_lblPosObj.btnPtnChangeR, {
6335
6382
  resetFunc: _ => changePattern(),
6336
- }), g_cssObj.button_Setting),
6383
+ }), g_cssObj.button_Mini),
6337
6384
 
6338
6385
  // パターン変更ボタン描画(左回り)
6339
- createCss2Button(`btnPtnChangeL`, `<<`, _ => true, Object.assign(g_lblPosObj.btnPtnChangeL, {
6386
+ createCss2Button(`btnPtnChangeL`, `<`, _ => true, Object.assign(g_lblPosObj.btnPtnChangeL, {
6340
6387
  resetFunc: _ => changePattern(-1),
6388
+ }), g_cssObj.button_Mini),
6389
+
6390
+ // パターン変更ボタン描画(右回り/別キーモード間スキップ)
6391
+ createCss2Button(`btnPtnChangeRR`, `|>`, _ => true, Object.assign(g_lblPosObj.btnPtnChangeRR, {
6392
+ resetFunc: _ => changePattern(1, true),
6393
+ }), g_cssObj.button_Setting),
6394
+
6395
+ // パターン変更ボタン描画(左回り/別キーモード間スキップ)
6396
+ createCss2Button(`btnPtnChangeLL`, `<|`, _ => true, Object.assign(g_lblPosObj.btnPtnChangeLL, {
6397
+ resetFunc: _ => changePattern(-1, true),
6341
6398
  }), g_cssObj.button_Setting),
6342
6399
 
6343
6400
  // キーコンフィグリセットボタン描画
@@ -10518,7 +10575,7 @@ const resultInit = _ => {
10518
10575
 
10519
10576
  // Gitterへのリンク
10520
10577
  createCss2Button(`btnGitter`, g_lblNameObj.b_gitter, _ => true, Object.assign(g_lblPosObj.btnRsGitter, {
10521
- resetFunc: _ => openLink(`https://gitter.im/danonicw/freeboard`),
10578
+ resetFunc: _ => openLink(`https://app.gitter.im/#/room/#danonicw_freeboard:gitter.im`),
10522
10579
  }), g_cssObj.button_Default),
10523
10580
 
10524
10581
  // リトライ
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Source by tickle
7
7
  * Created : 2019/11/19
8
- * Revised : 2023/03/04 (v30.3.1)
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,
@@ -1853,6 +1863,7 @@ const g_keyObj = {
1853
1863
  scrollDir12_0: {
1854
1864
  '---': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
1855
1865
  'Flat': [1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1],
1866
+ 'Twist': [1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, -1],
1856
1867
  },
1857
1868
  scrollDir13_0: {
1858
1869
  '---': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
@@ -1885,6 +1896,9 @@ const g_keyObj = {
1885
1896
  scrollDir23_0: {
1886
1897
  '---': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
1887
1898
  'Flat': [1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
1899
+ 'Cross': [-1, -1, -1, -1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1],
1900
+ 'Twist': [1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, 1, 1, -1],
1901
+ 'Asymmetry': [-1, -1, -1, -1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, 1, -1, -1, 1, 1, 1, 1, 1, -1],
1888
1902
  },
1889
1903
 
1890
1904
  // プレイアシスト設定
@@ -2036,9 +2050,14 @@ Object.keys(g_copyKeyPtn).forEach(keyPtnTo => {
2036
2050
  });
2037
2051
 
2038
2052
  // デフォルト配列のコピー (g_keyObj.aaa_X から g_keyObj.aaa_Xd を作成)
2053
+ // keyCtrlX_Yについて1キーにつき2キー割り当てできるように配列を補完
2039
2054
  const keyCtrlName = Object.keys(g_keyObj).filter(val => val.startsWith(`keyCtrl`));
2040
- 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
+ });
2041
2059
 
2060
+ // shuffleX_Y, colorX_Yについてデフォルト配列を作成
2042
2061
  g_keycons.groups.forEach(type => {
2043
2062
  const tmpName = Object.keys(g_keyObj).filter(val => val.startsWith(type) && val.endsWith(`_0`));
2044
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.3.1",
3
+ "version": "30.5.0",
4
4
  "description": "Dancing☆Onigiri (CW Edition) - Web-based Rhythm Game",
5
5
  "main": "index.js",
6
6
  "scripts": {