danoniplus 30.3.0 → 30.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.
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/01
7
+ * Revised : 2023/03/10
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 30.3.0`;
12
- const g_revisedDate = `2023/03/01`;
11
+ const g_version = `Ver 30.4.0`;
12
+ const g_revisedDate = `2023/03/10`;
13
13
  const g_alphaVersion = ``;
14
14
 
15
15
  // カスタム用バージョン (danoni_custom.js 等で指定可)
@@ -3483,43 +3483,50 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3483
3483
  * 新キー用複合パラメータ(特殊)
3484
3484
  * @param {string} _key キー数
3485
3485
  * @param {string} _name 名前
3486
- * @param {object} _obj errCd エラーコード
3487
- * @returns 最小パターン数
3488
3486
  */
3489
- const newKeyTripleParam = (_key, _name, { errCd = `` } = {}) => {
3490
- let tmpMinPatterns = 1;
3487
+ const newKeyTripleParam = (_key, _name) => {
3491
3488
  const keyheader = _name + _key;
3492
3489
  const dfPtn = setIntVal(g_keyObj.dfPtnNum);
3493
3490
 
3494
3491
  if (hasVal(_dosObj[keyheader])) {
3495
3492
  const tmpArray = splitLF2(_dosObj[keyheader]);
3496
- tmpMinPatterns = tmpArray.length;
3497
- for (let k = 0; k < tmpMinPatterns; k++) {
3493
+ for (let k = 0; k < tmpArray.length; k++) {
3498
3494
  if (existParam(tmpArray[k], `${keyheader}_${k + dfPtn}`)) {
3499
3495
  continue;
3500
3496
  }
3501
- if (g_keyObj[`${_name}${tmpArray[k]}_0`] !== undefined) {
3502
3497
 
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++;
3508
- }
3509
- } else {
3498
+ let ptnCnt = 0;
3499
+ tmpArray[k].split(`/`).forEach(list => {
3510
3500
 
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[`color${_key}_${k + dfPtn}`].length)].fill(0) : list.split(`,`).map(n => parseInt(n, 10))));
3515
- }
3501
+ if (list === ``) {
3502
+ // 空指定の場合は一律同じグループへ割り当て
3503
+ g_keyObj[`${keyheader}_${k + dfPtn}_${ptnCnt}`] = [...Array(g_keyObj[`chara${_key}_${k + dfPtn}`].length)].fill(0);
3504
+
3505
+ } else if (g_keyObj[`${_name}${list}_0`] !== undefined) {
3506
+ // 他のキーパターン (例: |shuffle8i=8_0| ) を指定した場合、該当があれば既存パターンからコピー
3507
+ let m = 0;
3508
+ while (g_keyObj[`${_name}${list}_${m}`] !== undefined) {
3509
+ g_keyObj[`${keyheader}_${k + dfPtn}_${ptnCnt}`] = structuredClone(g_keyObj[`${_name}${list}_${m}`]);
3510
+ m++;
3511
+ ptnCnt++;
3512
+ }
3513
+ } else {
3514
+ // 通常の指定方法 (例: |shuffle8i=1,1,1,2,0,0,0,0/1,1,1,1,0,0,0,0| )の場合の取り込み
3515
+ g_keyObj[`${keyheader}_${k + dfPtn}_${ptnCnt}`] = list.split(`,`).map(n => parseInt(n, 10));
3516
+ ptnCnt++;
3517
+ }
3518
+ });
3516
3519
  g_keyObj[`${keyheader}_${k + dfPtn}`] = structuredClone(g_keyObj[`${keyheader}_${k + dfPtn}_0`]);
3517
3520
  }
3518
3521
 
3519
- } else if (errCd !== `` && g_keyObj[`${keyheader}_0`] === undefined) {
3520
- makeWarningWindow(g_msgInfoObj[errCd].split(`{0}`).join(_key));
3522
+ } else if (g_keyObj[`${keyheader}_${dfPtn}_0`] === undefined) {
3523
+ // 特に指定が無い場合はcharaX_Yの配列長で決定
3524
+ for (let k = 0; k < g_keyObj.minPatterns; k++) {
3525
+ const ptnName = `${_key}_${k + dfPtn}`;
3526
+ g_keyObj[`${_name}${ptnName}_0`] = [...Array(g_keyObj[`chara${ptnName}`].length)].fill(0);
3527
+ g_keyObj[`${_name}${ptnName}`] = structuredClone(g_keyObj[`${_name}${ptnName}_0`]);
3528
+ }
3521
3529
  }
3522
- return tmpMinPatterns;
3523
3530
  };
3524
3531
 
3525
3532
  /**
@@ -3563,7 +3570,7 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3563
3570
  Object.assign(g_keyObj[pairName], g_keyObj[`${_pairName}${tmpParams[k]}`]);
3564
3571
  } else {
3565
3572
  if (_defaultName !== ``) {
3566
- g_keyObj[pairName][_defaultName] = [...Array(g_keyObj[`color${_key}_${k + dfPtn}`].length)].fill(_defaultVal);
3573
+ g_keyObj[pairName][_defaultName] = [...Array(g_keyObj[`chara${_key}_${k + dfPtn}`].length)].fill(_defaultVal);
3567
3574
  }
3568
3575
  tmpParams[k].split(`/`).forEach(pairs => {
3569
3576
  const tmpParamPair = pairs.split(`::`);
@@ -3576,13 +3583,13 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3576
3583
 
3577
3584
  // 対象キー毎に処理
3578
3585
  keyExtraList.forEach(newKey => {
3579
- let tmpMinPatterns = 1;
3586
+ g_keyObj.minPatterns = 1;
3580
3587
  g_keyObj.dfPtnNum = 0;
3581
3588
 
3582
3589
  // キーパターンの追記 (appendX)
3583
3590
  if (setBoolVal(_dosObj[`append${newKey}`])) {
3584
3591
  for (let j = 0; ; j++) {
3585
- if (g_keyObj[`color${newKey}_${j}`] === undefined) {
3592
+ if (g_keyObj[`chara${newKey}_${j}`] === undefined) {
3586
3593
  break;
3587
3594
  }
3588
3595
  g_keyObj.dfPtnNum++;
@@ -3596,28 +3603,20 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3596
3603
  // キーの最小横幅 (minWidthX)
3597
3604
  g_keyObj[`minWidth${newKey}`] = _dosObj[`minWidth${newKey}`] ?? g_keyObj[`minWidth${newKey}`] ?? g_keyObj.minWidthDefault;
3598
3605
 
3599
- // 矢印色パターン (colorX_Y)
3600
- tmpMinPatterns = newKeyTripleParam(newKey, `color`, { errCd: `E_0101` });
3601
-
3602
3606
  // 読込変数の接頭辞 (charaX_Y)
3603
- tmpMinPatterns = newKeyMultiParam(newKey, `chara`, toString, { errCd: `E_0102` });
3607
+ g_keyObj.minPatterns = newKeyMultiParam(newKey, `chara`, toString, { errCd: `E_0102` });
3608
+
3609
+ // 矢印色パターン (colorX_Y)
3610
+ newKeyTripleParam(newKey, `color`);
3604
3611
 
3605
3612
  // 矢印の回転量指定、キャラクタパターン (stepRtnX_Y)
3606
- tmpMinPatterns = newKeyMultiParam(newKey, `stepRtn`, toStringOrNumber, { errCd: `E_0103` });
3613
+ newKeyMultiParam(newKey, `stepRtn`, toStringOrNumber, { errCd: `E_0103` });
3607
3614
 
3608
3615
  // キーコンフィグ (keyCtrlX_Y)
3609
- tmpMinPatterns = newKeyMultiParam(newKey, `keyCtrl`, toSplitArray, { errCd: `E_0104`, baseCopyFlg: true });
3616
+ newKeyMultiParam(newKey, `keyCtrl`, toSplitArray, { errCd: `E_0104`, baseCopyFlg: true });
3610
3617
 
3611
3618
  // ステップゾーン位置 (posX_Y)
3612
3619
  newKeyMultiParam(newKey, `pos`, toFloat);
3613
- if (_dosObj[`pos${newKey}`] === undefined) {
3614
- for (let k = 0; k < tmpMinPatterns; k++) {
3615
- const ptnName = `${newKey}_${k + dfPtnNum}`;
3616
- if (g_keyObj[`color${ptnName}`] !== undefined) {
3617
- g_keyObj[`pos${ptnName}`] = [...Array(g_keyObj[`color${ptnName}`].length).keys()].map(i => i);
3618
- }
3619
- }
3620
- }
3621
3620
 
3622
3621
  // 各キーの区切り位置 (divX_Y)
3623
3622
  if (_dosObj[`div${newKey}`] !== undefined) {
@@ -3629,7 +3628,7 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3629
3628
  if (g_keyObj[`div${tmpDivPtn[0]}`] !== undefined) {
3630
3629
  // 既定キーパターンが指定された場合、存在すればその値を適用
3631
3630
  g_keyObj[`div${ptnName}`] = g_keyObj[`div${tmpDivPtn[0]}`];
3632
- g_keyObj[`divMax${ptnName}`] = setVal(g_keyObj[`divMax${tmpDivPtn[0]}`], Math.max(...g_keyObj[`pos${ptnName}`]) + 1, C_TYP_FLOAT);
3631
+ g_keyObj[`divMax${ptnName}`] = setVal(g_keyObj[`divMax${tmpDivPtn[0]}`], undefined, C_TYP_FLOAT);
3633
3632
  } else if (!hasVal(tmpDivPtn[0]) && setIntVal(g_keyObj[`div${ptnName}`], -1) !== -1) {
3634
3633
  // カスタムキー側のdivXが未定義だが、すでに初期設定で定義済みの場合はスキップ
3635
3634
  continue;
@@ -3640,13 +3639,9 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3640
3639
  }
3641
3640
  }
3642
3641
  }
3643
- // divX_Yが未指定の場合はposX_Yを元に適用
3644
- for (let k = 0; k < tmpMinPatterns; k++) {
3645
- const ptnName = `${newKey}_${k + dfPtnNum}`;
3646
- if (g_keyObj[`div${ptnName}`] === undefined) {
3647
- g_keyObj[`div${ptnName}`] = Math.max(...g_keyObj[`pos${ptnName}`]) + 1;
3648
- g_keyObj[`divMax${ptnName}`] = g_keyObj[`div${ptnName}`];
3649
- }
3642
+ // posX_Y, divX_Y, divMaxX_Yが未指定の場合はcharaX_Yを元に適用
3643
+ for (let k = 0; k < g_keyObj.minPatterns; k++) {
3644
+ setKeyDfVal(`${newKey}_${k + dfPtnNum}`);
3650
3645
  }
3651
3646
 
3652
3647
  // ステップゾーン間隔 (blankX_Y)
@@ -3666,14 +3661,6 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3666
3661
 
3667
3662
  // シャッフルグループ (shuffleX_Y)
3668
3663
  newKeyTripleParam(newKey, `shuffle`);
3669
- if (g_keyObj[`shuffle${newKey}_${dfPtnNum}_0`] === undefined) {
3670
- // 特に指定が無い場合はcolorX_Yの配列長で決定
3671
- for (let k = 0; k < tmpMinPatterns; k++) {
3672
- const ptnName = `${newKey}_${k + dfPtnNum}`;
3673
- g_keyObj[`shuffle${ptnName}_0`] = [...Array(g_keyObj[`color${ptnName}`].length)].fill(0);
3674
- g_keyObj[`shuffle${ptnName}`] = structuredClone(g_keyObj[`shuffle${ptnName}_0`]);
3675
- }
3676
- }
3677
3664
 
3678
3665
  // キーグループ (keyGroupX_Y)
3679
3666
  newKeyMultiParam(newKey, `keyGroup`, toSplitArrayStr);
@@ -3690,6 +3677,22 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3690
3677
  return keyExtraList;
3691
3678
  };
3692
3679
 
3680
+ /**
3681
+ * キーパターンのデフォルト値設定
3682
+ * @param {string} _ptnName
3683
+ */
3684
+ const setKeyDfVal = _ptnName => {
3685
+ if (g_keyObj[`pos${_ptnName}`] === undefined) {
3686
+ g_keyObj[`pos${_ptnName}`] = [...Array(g_keyObj[`chara${_ptnName}`].length).keys()].map(i => i);
3687
+ }
3688
+ if (g_keyObj[`div${_ptnName}`] === undefined) {
3689
+ g_keyObj[`div${_ptnName}`] = Math.max(...g_keyObj[`pos${_ptnName}`]) + 1;
3690
+ }
3691
+ if (g_keyObj[`divMax${_ptnName}`] === undefined) {
3692
+ g_keyObj[`divMax${_ptnName}`] = Math.max(...g_keyObj[`pos${_ptnName}`]) + 1;
3693
+ }
3694
+ };
3695
+
3693
3696
  /*-----------------------------------------------------------*/
3694
3697
  /* Scene : TITLE [melon] */
3695
3698
  /*-----------------------------------------------------------*/
@@ -10514,7 +10517,7 @@ const resultInit = _ => {
10514
10517
 
10515
10518
  // Gitterへのリンク
10516
10519
  createCss2Button(`btnGitter`, g_lblNameObj.b_gitter, _ => true, Object.assign(g_lblPosObj.btnRsGitter, {
10517
- resetFunc: _ => openLink(`https://gitter.im/danonicw/freeboard`),
10520
+ resetFunc: _ => openLink(`https://app.gitter.im/#/room/#danonicw_freeboard:gitter.im`),
10518
10521
  }), g_cssObj.button_Default),
10519
10522
 
10520
10523
  // リトライ
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Source by tickle
7
7
  * Created : 2019/11/19
8
- * Revised : 2023/03/01 (v30.3.0)
8
+ * Revised : 2023/03/10 (v30.4.0)
9
9
  *
10
10
  * https://github.com/cwtickle/danoniplus
11
11
  */
@@ -1583,7 +1583,6 @@ const g_keyObj = {
1583
1583
 
1584
1584
  // シャッフルグループ(パターン3)
1585
1585
  shuffle15A_0_2: [0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 3, 2, 2, 2],
1586
- shuffle15B_0_2: [0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 3, 2, 2, 2],
1587
1586
 
1588
1587
  // 基本パターン (矢印回転、AAキャラクタ)
1589
1588
  // - AAキャラクタの場合、キャラクタ名を指定
@@ -1622,63 +1621,32 @@ const g_keyObj = {
1622
1621
  stepRtn8_2: [`onigiri`, 0, 30, 60, 90, 120, 150, 180],
1623
1622
 
1624
1623
  // 各キーの区切り位置
1625
- div5_0: 5,
1626
- div7_0: 7,
1627
- div7i_0: 7,
1628
- div8_0: 8,
1629
- div9A_0: 9,
1630
- div9B_0: 9,
1631
1624
  div9i_0: 6,
1632
1625
  div11_0: 6,
1633
1626
  div11L_0: 6,
1634
1627
  div11W_0: 6,
1635
- div11i_0: 11,
1636
1628
  div12_0: 5,
1637
1629
  div13_0: 8,
1638
1630
  div14_0: 7,
1639
1631
  div14i_0: 8,
1640
1632
  div15A_0: 8,
1641
1633
  div16i_0: 8,
1642
- div17_0: 17,
1643
1634
  div23_0: 12,
1644
1635
 
1645
- div5_1: 5,
1646
- div8_1: 8,
1647
- div9i_1: 9,
1648
1636
  div17_1: 9,
1649
1637
 
1650
- div5_2: 5,
1651
- div8_2: 8,
1652
-
1653
1638
  // 各キーの位置関係
1654
- pos5_0: [0, 1, 2, 3, 4],
1655
- pos7_0: [0, 1, 2, 3, 4, 5, 6],
1656
- pos7i_0: [0, 1, 2, 3, 4, 5, 6],
1657
- pos8_0: [0, 1, 2, 3, 4, 5, 6, 7],
1658
- pos9A_0: [0, 1, 2, 3, 4, 5, 6, 7, 8],
1659
- pos9B_0: [0, 1, 2, 3, 4, 5, 6, 7, 8],
1660
1639
  pos9i_0: [2, 3, 4, 5, 6, 7, 8, 9, 10],
1661
1640
  pos11_0: [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
1662
1641
  pos11L_0: [0, 1, 2, 3, 6, 7, 8, 9, 10, 11, 12],
1663
1642
  pos11W_0: [0, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12],
1664
- pos11i_0: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
1665
1643
  pos12_0: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
1666
1644
  pos13_0: [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16],
1667
1645
  pos14_0: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14],
1668
- pos14i_0: [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15],
1669
- pos15A_0: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14],
1646
+ pos14i_0: [0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14],
1670
1647
  pos16i_0: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16],
1671
- pos17_0: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16],
1672
1648
  pos23_0: [0, 1, 2, 3, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26],
1673
1649
 
1674
- pos5_1: [0, 1, 2, 3, 4],
1675
- pos8_1: [0, 1, 2, 3, 4, 5, 6, 7],
1676
- pos9i_1: [0, 1, 2, 3, 4, 5, 6, 7, 8],
1677
- pos17_1: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16],
1678
-
1679
- pos5_2: [0, 1, 2, 3, 4],
1680
- pos8_2: [0, 1, 2, 3, 4, 5, 6, 7],
1681
-
1682
1650
  // 基本パターン (キーコンフィグ)
1683
1651
  // - 順番はchara, stepRtnと対応している。
1684
1652
  // - 多次元配列内はステップに対応するキーコードを示す。カンマ区切りで複数指定できる。
@@ -1885,6 +1853,7 @@ const g_keyObj = {
1885
1853
  scrollDir12_0: {
1886
1854
  '---': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
1887
1855
  'Flat': [1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1],
1856
+ 'Twist': [1, 1, 1, 1, -1, -1, 1, 1, 1, 1, 1, -1],
1888
1857
  },
1889
1858
  scrollDir13_0: {
1890
1859
  '---': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
@@ -1917,6 +1886,9 @@ const g_keyObj = {
1917
1886
  scrollDir23_0: {
1918
1887
  '---': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
1919
1888
  'Flat': [1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
1889
+ 'Cross': [-1, -1, -1, -1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1],
1890
+ 'Twist': [1, 1, 1, 1, 1, 1, 1, 1, -1, 1, 1, 1, 1, 1, -1, -1, -1, 1, 1, 1, 1, 1, -1],
1891
+ 'Asymmetry': [-1, -1, -1, -1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, 1, -1, -1, 1, 1, 1, 1, 1, -1],
1920
1892
  },
1921
1893
 
1922
1894
  // プレイアシスト設定
@@ -1968,6 +1940,11 @@ const g_keyObj = {
1968
1940
 
1969
1941
  };
1970
1942
 
1943
+ // posX_Y, divX_Y, divMaxX_Yが未定義のときに0からの連番で補完する処理 (charaX_Yが定義されていることが前提)
1944
+ Object.keys(g_keyObj).filter(val => val.startsWith(`chara`)).forEach(charaPtn => {
1945
+ setKeyDfVal(charaPtn.slice(`chara`.length));
1946
+ });
1947
+
1971
1948
  // キーパターンのコピーリスト
1972
1949
  // ・コピー先:コピー元の順に指定する
1973
1950
  // ・上から順に処理する
@@ -2049,6 +2026,7 @@ Object.keys(g_copyKeyPtn).forEach(keyPtnTo => {
2049
2026
  copyKeyPtn(`assistPos`);
2050
2027
 
2051
2028
  copyKeyPtnVal(`div`);
2029
+ copyKeyPtnVal(`divMax`);
2052
2030
  copyKeyPtnVal(`blank`);
2053
2031
  copyKeyPtnVal(`scale`);
2054
2032
  copyKeyPtnVal(`keyRetry`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "30.3.0",
3
+ "version": "30.4.0",
4
4
  "description": "Dancing☆Onigiri (CW Edition) - Web-based Rhythm Game",
5
5
  "main": "index.js",
6
6
  "scripts": {