danoniplus 31.2.0 → 31.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/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/04/01
7
+ * Revised : 2023/04/08
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 31.2.0`;
12
- const g_revisedDate = `2023/04/01`;
11
+ const g_version = `Ver 31.4.0`;
12
+ const g_revisedDate = `2023/04/08`;
13
13
  const g_alphaVersion = ``;
14
14
 
15
15
  // カスタム用バージョン (danoni_custom.js 等で指定可)
@@ -373,7 +373,7 @@ const splitLF2 = (_str, _delim = `$`) => splitLF(_str).filter(val => val !== ``)
373
373
  * @returns
374
374
  */
375
375
  const makeDedupliArray = (_array1, ..._arrays) =>
376
- Array.from((new Set([..._array1, ..._arrays.flat()])).values());
376
+ Array.from((new Set([..._array1, ..._arrays.flat()])).values()).filter(val => val !== undefined);
377
377
 
378
378
  /**
379
379
  * 二次元配列のコピー
@@ -396,10 +396,21 @@ const sumData = _array => _array.reduce((p, x) => p + x);
396
396
  * @param {number} _defaultVal
397
397
  * @returns
398
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;
399
+ const makeBaseArray = (_array = [], _minLength, _defaultVal) => padArray(_array, [...Array(_minLength)].fill(_defaultVal));
400
+
401
+ /**
402
+ * ベースとする配列に対して別の配列で上書き
403
+ * @param {array} _array
404
+ * @param {array} _baseArray ベースとする配列
405
+ * @returns
406
+ */
407
+ const padArray = (_array, _baseArray) => {
408
+ _array?.forEach((val, j) => {
409
+ if (hasVal(val)) {
410
+ _baseArray[j] = val;
411
+ }
412
+ });
413
+ return _baseArray;
403
414
  };
404
415
 
405
416
  /**
@@ -514,7 +525,7 @@ const transCode = _setCode => {
514
525
  * 特定キーをブロックする処理
515
526
  * @param {string} _setCode
516
527
  */
517
- const blockCode = _setCode => !C_BLOCK_KEYS.map(key => g_kCdN[key]).includes(_setCode);
528
+ const blockCode = _setCode => !C_BLOCK_KEYS.includes(_setCode);
518
529
 
519
530
 
520
531
  /*-----------------------------------------------------------*/
@@ -979,7 +990,7 @@ const getFontSize = (_str, _maxWidth, _font = getBasicFont(), _maxFontsize = 64,
979
990
  */
980
991
  const createDescDiv = (_id, _str, _altId = _id) =>
981
992
  createDivCss2Label(_id, _str, Object.assign(g_lblPosObj[_altId], {
982
- siz: getFontSize(_str, g_sWidth, getBasicFont(), C_SIZ_MAIN),
993
+ siz: getFontSize(_str, g_sWidth, getBasicFont(), g_limitObj.mainSiz),
983
994
  }));
984
995
 
985
996
  /*-----------------------------------------------------------*/
@@ -1031,8 +1042,8 @@ const setUserSelect = (_style, _value = C_DIS_NONE) => {
1031
1042
  * @param {object} _obj (x, y, w, h, siz, align, ...rest)
1032
1043
  * @param {...any} _classes
1033
1044
  */
1034
- const createDivCss2Label = (_id, _text, { x = 0, y = 0, w = C_LEN_SETLBL_WIDTH, h = C_LEN_SETLBL_HEIGHT,
1035
- siz = C_SIZ_SETLBL, align = C_ALIGN_CENTER, ...rest } = {}, ..._classes) => {
1045
+ const createDivCss2Label = (_id, _text, { x = 0, y = 0, w = g_limitObj.setLblWidth, h = g_limitObj.setLblHeight,
1046
+ siz = g_limitObj.setLblSiz, align = C_ALIGN_CENTER, ...rest } = {}, ..._classes) => {
1036
1047
  const div = createDiv(_id, x, y, w, h, [g_cssObj.title_base, ..._classes]);
1037
1048
 
1038
1049
  const style = div.style;
@@ -1218,8 +1229,8 @@ const deleteDiv = (_parentId, _idName) => {
1218
1229
  * @param {object} _obj (x, y, w, h, siz, align, title, groupName, initDisabledFlg, ...rest)
1219
1230
  * @param {...any} _classes
1220
1231
  */
1221
- const createCss2Button = (_id, _text, _func = _ => true, { x = 0, y = g_sHeight - 100, w = g_sWidth / 3, h = C_BTN_HEIGHT,
1222
- siz = C_LBL_BTNSIZE, align = C_ALIGN_CENTER, title = ``, groupName = g_currentPage, initDisabledFlg = true,
1232
+ const createCss2Button = (_id, _text, _func = _ => true, { x = 0, y = g_sHeight - 100, w = g_sWidth / 3, h = g_limitObj.btnHeight,
1233
+ siz = g_limitObj.btnSiz, align = C_ALIGN_CENTER, title = ``, groupName = g_currentPage, initDisabledFlg = true,
1223
1234
  resetFunc = _ => true, cxtFunc = _ => true, ...rest } = {}, ..._classes) => {
1224
1235
 
1225
1236
  const div = createDiv(_id, x, y, w, h, [`button_common`, ..._classes]);
@@ -1315,7 +1326,7 @@ const changeStyle = (_id, { x, y, w, h, siz, align, title, ...rest } = {}) => {
1315
1326
  * @param {number} _y
1316
1327
  */
1317
1328
  const getTitleDivLabel = (_id, _titlename, _x, _y, ..._classes) =>
1318
- createDivCss2Label(_id, _titlename, { x: _x, y: _y, w: g_sWidth, h: 50, siz: C_LBL_BTNSIZE }, ..._classes);
1329
+ createDivCss2Label(_id, _titlename, { x: _x, y: _y, w: g_sWidth, h: 50, siz: g_limitObj.btnSiz }, ..._classes);
1319
1330
 
1320
1331
  /**
1321
1332
  * キーコントロールの初期化
@@ -1803,8 +1814,8 @@ const getQueryParamVal = _name => {
1803
1814
  * ローディング文字用ラベルの作成
1804
1815
  */
1805
1816
  const getLoadingLabel = _ => createDivCss2Label(`lblLoading`, g_lblNameObj.nowLoading, {
1806
- x: 0, y: g_sHeight - 40, w: g_sWidth, h: C_LEN_SETLBL_HEIGHT,
1807
- siz: C_SIZ_SETLBL, align: C_ALIGN_RIGHT,
1817
+ x: 0, y: g_sHeight - 40, w: g_sWidth, h: g_limitObj.setLblHeight,
1818
+ siz: g_limitObj.setLblSiz, align: C_ALIGN_RIGHT,
1808
1819
  });
1809
1820
 
1810
1821
  /**
@@ -1910,15 +1921,14 @@ const initialControl = async () => {
1910
1921
  Object.assign(g_headerObj, headerConvert(g_rootObj));
1911
1922
  const importKeysData = _data => {
1912
1923
  keysConvert(dosConvert(_data));
1913
- g_headerObj.undefinedKeyLists = g_headerObj.undefinedKeyLists.filter(key => g_keyObj[`chara${key}_0`] === undefined);
1924
+ g_headerObj.undefinedKeyLists = g_headerObj.undefinedKeyLists.filter(key => g_keyObj[`${g_keyObj.defaultProp}${key}_0`] === undefined);
1914
1925
  };
1915
1926
  g_presetObj.keysDataLib.forEach(list => importKeysData(list));
1916
1927
  if (g_presetObj.keysData !== undefined) {
1917
1928
  importKeysData(g_presetObj.keysData);
1918
1929
  }
1919
1930
  g_headerObj.keyExtraList = keysConvert(g_rootObj, {
1920
- keyExtraList: (g_rootObj.keyExtraList !== undefined ?
1921
- makeDedupliArray(g_rootObj.keyExtraList.split(`,`), g_headerObj.undefinedKeyLists) : g_headerObj.undefinedKeyLists),
1931
+ keyExtraList: makeDedupliArray(g_headerObj.undefinedKeyLists, g_rootObj.keyExtraList?.split(`,`)),
1922
1932
  });
1923
1933
 
1924
1934
  // デフォルトのカラー・シャッフルグループ設定を退避
@@ -2089,7 +2099,7 @@ const loadLocalStorage = _ => {
2089
2099
  * 譜面データを分割して値を取得
2090
2100
  * @param {string} _dos 譜面データ
2091
2101
  */
2092
- const dosConvert = _dos => {
2102
+ const dosConvert = (_dos = ``) => {
2093
2103
 
2094
2104
  const obj = {};
2095
2105
  const paramsTmp = g_enableAmpersandSplit ? _dos.split(`&`).join(`|`) : _dos;
@@ -2228,7 +2238,7 @@ const storeBaseData = (_scoreId, _scoreObj, _keyCtrlPtn) => {
2228
2238
  const startFrame = getStartFrame(lastFrame, 0, _scoreId);
2229
2239
  const firstArrowFrame = getFirstArrowFrame(_scoreObj, _keyCtrlPtn);
2230
2240
  const playingFrame = lastFrame - firstArrowFrame;
2231
- const keyNum = g_keyObj[`chara${_keyCtrlPtn}`].length;
2241
+ const keyNum = g_keyObj[`${g_keyObj.defaultProp}${_keyCtrlPtn}`].length;
2232
2242
 
2233
2243
  // 譜面密度グラフ用のデータ作成
2234
2244
  const noteCnt = { arrow: [], frz: [] };
@@ -2658,9 +2668,9 @@ const headerConvert = _dosObj => {
2658
2668
  g_settings.speeds = [...Array((obj.maxSpeed - obj.minSpeed) * 20 + 1).keys()].map(i => obj.minSpeed + i / 20);
2659
2669
 
2660
2670
  // プレイ中のショートカットキー
2661
- obj.keyRetry = setIntVal(_dosObj.keyRetry, C_KEY_RETRY);
2671
+ obj.keyRetry = setIntVal(getKeyCtrlVal(_dosObj.keyRetry), C_KEY_RETRY);
2662
2672
  obj.keyRetryDef = obj.keyRetry;
2663
- obj.keyTitleBack = setIntVal(_dosObj.keyTitleBack, C_KEY_TITLEBACK);
2673
+ obj.keyTitleBack = setIntVal(getKeyCtrlVal(_dosObj.keyTitleBack), C_KEY_TITLEBACK);
2664
2674
  obj.keyTitleBackDef = obj.keyTitleBack;
2665
2675
 
2666
2676
  // フリーズアローの許容フレーム数設定
@@ -2735,7 +2745,7 @@ const headerConvert = _dosObj => {
2735
2745
  }
2736
2746
  const keyLists = makeDedupliArray(obj.keyLabels);
2737
2747
  obj.keyLists = keyLists.sort((a, b) => parseInt(a) - parseInt(b));
2738
- obj.undefinedKeyLists = obj.keyLists.filter(key => g_keyObj[`chara${key}_0`] === undefined);
2748
+ obj.undefinedKeyLists = obj.keyLists.filter(key => g_keyObj[`${g_keyObj.defaultProp}${key}_0`] === undefined);
2739
2749
 
2740
2750
  // 譜面変更セレクターの利用有無
2741
2751
  obj.difSelectorUse = (setBoolVal(_dosObj.difSelectorUse, obj.keyLabels.length > 5));
@@ -3489,22 +3499,40 @@ const getGaugeSetting = (_dosObj, _name, _difLength, { scoreId = 0 } = {}) => {
3489
3499
  */
3490
3500
  const getKeyName = _key => hasVal(g_keyObj[`keyName${_key}`]) ? g_keyObj[`keyName${_key}`] : _key;
3491
3501
 
3502
+ /**
3503
+ * KeyBoardEvent.code の値をCW Edition用のキーコードに変換
3504
+ * 簡略指定ができるように、以下の記述を許容
3505
+ * 例) KeyD -> D, ArrowDown -> Down, AltLeft -> Alt
3506
+ * @param {string} _kCdN
3507
+ * @returns
3508
+ */
3509
+ const getKeyCtrlVal = _kCdN => {
3510
+ const convVal = Object.keys(g_kCdN).findIndex(val =>
3511
+ [_kCdN, `Key${_kCdN}`, `Arrow${_kCdN}`].includes(g_kCdN[val]) || _kCdN === replaceStr(g_kCdN[val], g_escapeStr.keyCtrlName));
3512
+ return convVal !== -1 ? convVal : parseInt(_kCdN, 10);
3513
+ };
3514
+
3492
3515
  /**
3493
3516
  * 一時的な追加キーの設定
3494
3517
  * @param {object} _dosObj
3495
3518
  */
3496
- const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) } = {}) => {
3519
+ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList?.split(`,`) } = {}) => {
3497
3520
 
3498
3521
  if (keyExtraList === undefined) {
3499
- return [];
3522
+ keyExtraList = [];
3523
+ Object.keys(_dosObj).filter(val => val.startsWith(g_keyObj.defaultProp))
3524
+ .forEach(keyName => keyExtraList.push(keyName.slice(g_keyObj.defaultProp.length)));
3525
+
3526
+ if (keyExtraList.length === 0) {
3527
+ return [];
3528
+ }
3500
3529
  }
3501
3530
 
3502
3531
  const existParam = (_data, _paramName) => !hasVal(_data) && g_keyObj[_paramName] !== undefined;
3503
3532
  const toString = _str => _str;
3504
- const toNumber = _num => parseInt(_num, 10);
3505
3533
  const toFloat = _num => parseFloat(_num);
3506
- const toStringOrNumber = _str => isNaN(Number(_str)) ? _str : toNumber(_str);
3507
- const toKeyCtrlArray = _str => makeBaseArray(_str.split(`/`).map(n => toNumber(n)), g_keyObj.minKeyCtrlNum, 0);
3534
+ const toKeyCtrlArray = _str =>
3535
+ makeBaseArray(_str.split(`/`).map(n => getKeyCtrlVal(n)), g_keyObj.minKeyCtrlNum, 0);
3508
3536
  const toSplitArrayStr = _str => _str.split(`/`).map(n => n);
3509
3537
 
3510
3538
  /**
@@ -3580,7 +3608,7 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3580
3608
  const keyPtn = getKeyPtnName(list);
3581
3609
  if (list === ``) {
3582
3610
  // 空指定の場合は一律同じグループへ割り当て
3583
- g_keyObj[`${keyheader}_${k + dfPtn}_${ptnCnt}`] = [...Array(g_keyObj[`chara${_key}_${k + dfPtn}`].length)].fill(0);
3611
+ g_keyObj[`${keyheader}_${k + dfPtn}_${ptnCnt}`] = [...Array(g_keyObj[`${g_keyObj.defaultProp}${_key}_${k + dfPtn}`].length)].fill(0);
3584
3612
 
3585
3613
  } else if (g_keyObj[`${_name}${keyPtn}_0`] !== undefined) {
3586
3614
  // 他のキーパターン (例: |shuffle8i=8_0| ) を指定した場合、該当があれば既存パターンからコピー
@@ -3592,7 +3620,9 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3592
3620
  }
3593
3621
  } else {
3594
3622
  // 通常の指定方法 (例: |shuffle8i=1,1,1,2,0,0,0,0/1,1,1,1,0,0,0,0| )の場合の取り込み
3595
- g_keyObj[`${keyheader}_${k + dfPtn}_${ptnCnt}`] = list.split(`,`).map(n => isNaN(Number(n)) ? n : parseInt(n, 10));
3623
+ g_keyObj[`${keyheader}_${k + dfPtn}_${ptnCnt}`] =
3624
+ makeBaseArray(list.split(`,`).map(n => isNaN(parseInt(n)) ? n : parseInt(n, 10)),
3625
+ g_keyObj[`${g_keyObj.defaultProp}${_key}_${k + dfPtn}`].length, 0);
3596
3626
  ptnCnt++;
3597
3627
  }
3598
3628
  });
@@ -3600,10 +3630,10 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3600
3630
  }
3601
3631
 
3602
3632
  } else if (g_keyObj[`${keyheader}_${dfPtn}_0`] === undefined) {
3603
- // 特に指定が無い場合はcharaX_Yの配列長で決定
3633
+ // 特に指定が無い場合はkeyCtrlX_Yの配列長で決定
3604
3634
  for (let k = 0; k < g_keyObj.minPatterns; k++) {
3605
3635
  const ptnName = `${_key}_${k + dfPtn}`;
3606
- g_keyObj[`${_name}${ptnName}_0`] = [...Array(g_keyObj[`chara${ptnName}`].length)].fill(0);
3636
+ g_keyObj[`${_name}${ptnName}_0`] = [...Array(g_keyObj[`${g_keyObj.defaultProp}${ptnName}`].length)].fill(0);
3607
3637
  g_keyObj[`${_name}${ptnName}`] = structuredClone(g_keyObj[`${_name}${ptnName}_0`]);
3608
3638
  }
3609
3639
  }
@@ -3649,7 +3679,7 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3649
3679
 
3650
3680
  // デフォルト項目がある場合は先に定義
3651
3681
  if (_defaultName !== ``) {
3652
- g_keyObj[pairName][_defaultName] = [...Array(g_keyObj[`chara${_key}_${k + dfPtn}`].length)].fill(_defaultVal);
3682
+ g_keyObj[pairName][_defaultName] = [...Array(g_keyObj[`${g_keyObj.defaultProp}${_key}_${k + dfPtn}`].length)].fill(_defaultVal);
3653
3683
  }
3654
3684
  tmpParams[k].split(`/`).forEach(pairs => {
3655
3685
  const keyPtn = getKeyPtnName(pairs);
@@ -3660,7 +3690,9 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3660
3690
  } else {
3661
3691
  // 通常の指定方法(例:|scroll8i=Cross::1,1,1,-1,-1,-1,1,1/Split::1,1,1,1,-1,-1,-1,-1|)から取り込み
3662
3692
  const tmpParamPair = pairs.split(`::`);
3663
- g_keyObj[pairName][tmpParamPair[0]] = tmpParamPair[1].split(`,`).map(n => parseInt(n, 10));
3693
+ g_keyObj[pairName][tmpParamPair[0]] =
3694
+ makeBaseArray(tmpParamPair[1].split(`,`).map(n => parseInt(n, 10)),
3695
+ g_keyObj[`${g_keyObj.defaultProp}${_key}_${k + dfPtn}`].length, _defaultVal);
3664
3696
  }
3665
3697
  });
3666
3698
  }
@@ -3675,7 +3707,7 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3675
3707
  // キーパターンの追記 (appendX)
3676
3708
  if (setBoolVal(_dosObj[`append${newKey}`])) {
3677
3709
  for (let j = 0; ; j++) {
3678
- if (g_keyObj[`chara${newKey}_${j}`] === undefined) {
3710
+ if (g_keyObj[`${g_keyObj.defaultProp}${newKey}_${j}`] === undefined) {
3679
3711
  break;
3680
3712
  }
3681
3713
  g_keyObj.dfPtnNum++;
@@ -3689,8 +3721,11 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3689
3721
  // キーの最小横幅 (minWidthX)
3690
3722
  g_keyObj[`minWidth${newKey}`] = _dosObj[`minWidth${newKey}`] ?? g_keyObj[`minWidth${newKey}`] ?? g_keyObj.minWidthDefault;
3691
3723
 
3724
+ // キーコンフィグ (keyCtrlX_Y)
3725
+ g_keyObj.minPatterns = newKeyMultiParam(newKey, `keyCtrl`, toKeyCtrlArray, { errCd: `E_0104`, baseCopyFlg: true });
3726
+
3692
3727
  // 読込変数の接頭辞 (charaX_Y)
3693
- g_keyObj.minPatterns = newKeyMultiParam(newKey, `chara`, toString, { errCd: `E_0102` });
3728
+ newKeyMultiParam(newKey, `chara`, toString);
3694
3729
 
3695
3730
  // 矢印色パターン (colorX_Y)
3696
3731
  newKeyTripleParam(newKey, `color`);
@@ -3698,9 +3733,6 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3698
3733
  // 矢印の回転量指定、キャラクタパターン (stepRtnX_Y)
3699
3734
  newKeyTripleParam(newKey, `stepRtn`);
3700
3735
 
3701
- // キーコンフィグ (keyCtrlX_Y)
3702
- newKeyMultiParam(newKey, `keyCtrl`, toKeyCtrlArray, { errCd: `E_0104`, baseCopyFlg: true });
3703
-
3704
3736
  // ステップゾーン位置 (posX_Y)
3705
3737
  newKeyMultiParam(newKey, `pos`, toFloat);
3706
3738
 
@@ -3725,7 +3757,7 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3725
3757
  }
3726
3758
  }
3727
3759
  }
3728
- // posX_Y, divX_Y, divMaxX_Yが未指定の場合はcharaX_Yを元に適用
3760
+ // charaX_Y, posX_Y, keyGroupX_Y, divX_Y, divMaxX_Yが未指定の場合はkeyCtrlX_Yを元に適用
3729
3761
  for (let k = 0; k < g_keyObj.minPatterns; k++) {
3730
3762
  setKeyDfVal(`${newKey}_${k + dfPtnNum}`);
3731
3763
  }
@@ -3737,10 +3769,10 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3737
3769
  newKeySingleParam(newKey, `scale`, C_TYP_FLOAT);
3738
3770
 
3739
3771
  // プレイ中ショートカット:リトライ (keyRetryX_Y)
3740
- newKeySingleParam(newKey, `keyRetry`, C_TYP_NUMBER);
3772
+ newKeySingleParam(newKey, `keyRetry`, C_TYP_STRING);
3741
3773
 
3742
3774
  // プレイ中ショートカット:タイトルバック (keyTitleBackX_Y)
3743
- newKeySingleParam(newKey, `keyTitleBack`, C_TYP_NUMBER);
3775
+ newKeySingleParam(newKey, `keyTitleBack`, C_TYP_STRING);
3744
3776
 
3745
3777
  // 別キーフラグ (transKeyX_Y)
3746
3778
  newKeySingleParam(newKey, `transKey`, C_TYP_STRING);
@@ -3758,6 +3790,10 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3758
3790
  // アシストパターン (assistX_Y)
3759
3791
  // |assist(newKey)=Onigiri::0,0,0,0,0,1/AA::0,0,0,1,1,1$...|
3760
3792
  newKeyPairParam(newKey, `assist`, `assistPos`);
3793
+
3794
+ // keyRetry, keyTitleBackのキー名をキーコードに変換
3795
+ const keyTypePatterns = Object.keys(g_keyObj).filter(val => val.startsWith(`keyRetry${newKey}`) || val.startsWith(`keyTitleBack${newKey}`));
3796
+ keyTypePatterns.forEach(name => g_keyObj[name] = getKeyCtrlVal(g_keyObj[name]));
3761
3797
  });
3762
3798
 
3763
3799
  return keyExtraList;
@@ -3768,9 +3804,11 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3768
3804
  * @param {string} _ptnName
3769
3805
  */
3770
3806
  const setKeyDfVal = _ptnName => {
3771
- if (g_keyObj[`pos${_ptnName}`] === undefined) {
3772
- g_keyObj[`pos${_ptnName}`] = [...Array(g_keyObj[`chara${_ptnName}`].length).keys()].map(i => i);
3773
- }
3807
+ const baseLength = g_keyObj[`${g_keyObj.defaultProp}${_ptnName}`].length;
3808
+ g_keyObj[`chara${_ptnName}`] = padArray(g_keyObj[`chara${_ptnName}`], [...Array(baseLength).keys()].map(i => `${i + 1}a`));
3809
+ g_keyObj[`pos${_ptnName}`] = padArray(g_keyObj[`pos${_ptnName}`], [...Array(baseLength).keys()].map(i => i));
3810
+ g_keyObj[`keyGroup${_ptnName}`] = padArray(g_keyObj[`keyGroup${_ptnName}`], [...Array(baseLength)].fill([`0`]));
3811
+
3774
3812
  if (g_keyObj[`div${_ptnName}`] === undefined) {
3775
3813
  g_keyObj[`div${_ptnName}`] = Math.max(...g_keyObj[`pos${_ptnName}`]) + 1;
3776
3814
  }
@@ -3930,7 +3968,7 @@ const titleInit = _ => {
3930
3968
  const versionName = `&copy; 2018-${g_revisedDate.slice(0, 4)} ティックル, CW ${g_version}${g_alphaVersion}${customVersion}${releaseDate}`;
3931
3969
 
3932
3970
  let reloadFlg = false;
3933
- const getLinkSiz = _name => getFontSize(_name, g_sWidth / 2 - 20, getBasicFont(), C_LBL_LNKSIZE, 12);
3971
+ const getLinkSiz = _name => getFontSize(_name, g_sWidth / 2 - 20, getBasicFont(), g_limitObj.lnkSiz, 12);
3934
3972
 
3935
3973
  /**
3936
3974
  * クレジット用リンク作成
@@ -3948,7 +3986,7 @@ const titleInit = _ => {
3948
3986
 
3949
3987
  // Click Here
3950
3988
  createCss2Button(`btnStart`, g_lblNameObj.clickHere, _ => clearTimeout(g_timeoutEvtTitleId), {
3951
- w: g_sWidth, siz: C_LBL_TITLESIZE, resetFunc: _ => optionInit(),
3989
+ w: g_sWidth, siz: g_limitObj.titleSiz, resetFunc: _ => optionInit(),
3952
3990
  }, g_cssObj.button_Start),
3953
3991
 
3954
3992
  // Reset
@@ -4122,7 +4160,7 @@ const setWindowStyle = (_text, _bkColor, _textColor, _align = C_ALIGN_LEFT) => {
4122
4160
 
4123
4161
  // ウィンドウ枠の行を取得するために一時的な枠を作成
4124
4162
  const tmplbl = createDivCss2Label(`lblTmpWarning`, _text, {
4125
- x: 0, y: 70, w: g_sWidth, h: 20, siz: C_SIZ_MAIN, lineHeight: `15px`, fontFamily: getBasicFont(),
4163
+ x: 0, y: 70, w: g_sWidth, h: 20, siz: g_limitObj.mainSiz, lineHeight: `15px`, fontFamily: getBasicFont(),
4126
4164
  whiteSpace: `normal`,
4127
4165
  });
4128
4166
  divRoot.appendChild(tmplbl);
@@ -4133,7 +4171,7 @@ const setWindowStyle = (_text, _bkColor, _textColor, _align = C_ALIGN_LEFT) => {
4133
4171
  const warnHeight = Math.min(150, Math.max(range.getClientRects().length,
4134
4172
  _text.split(`<br>`).length + _text.split(`<p>`).length - 1) * 21);
4135
4173
  const lbl = createDivCss2Label(`lblWarning`, _text, {
4136
- x: 0, y: 70, w: g_sWidth, h: warnHeight, siz: C_SIZ_MAIN, backgroundColor: _bkColor,
4174
+ x: 0, y: 70, w: g_sWidth, h: warnHeight, siz: g_limitObj.mainSiz, backgroundColor: _bkColor,
4137
4175
  opacity: 0.9, lineHeight: `15px`, color: _textColor, align: _align, fontFamily: getBasicFont(),
4138
4176
  whiteSpace: `normal`,
4139
4177
  });
@@ -4239,10 +4277,10 @@ const optionInit = _ => {
4239
4277
  const setSpriteList = _settingList => {
4240
4278
  const optionWidth = (g_sWidth - 450) / 2;
4241
4279
  const spriteList = [];
4242
- _settingList.forEach(setting =>
4243
- spriteList[setting[0]] = createEmptySprite(optionsprite, `${setting[0]}Sprite`, {
4244
- x: 25, y: setting[1] * C_LEN_SETLBL_HEIGHT + setting[2] + 20,
4245
- w: optionWidth + setting[3], h: C_LEN_SETLBL_HEIGHT + setting[4],
4280
+ Object.keys(_settingList).forEach(setting =>
4281
+ spriteList[setting] = createEmptySprite(optionsprite, `${setting}Sprite`, {
4282
+ x: 25, y: _settingList[setting].heightPos * g_limitObj.setLblHeight + _settingList[setting].y + 20,
4283
+ w: optionWidth + _settingList[setting].dw, h: g_limitObj.setLblHeight + _settingList[setting].dh,
4246
4284
  }));
4247
4285
  return spriteList;
4248
4286
  };
@@ -4275,23 +4313,8 @@ const createOptionWindow = _sprite => {
4275
4313
  // 各ボタン用のスプライトを作成
4276
4314
  const optionsprite = createOptionSprite(_sprite);
4277
4315
 
4278
- // 設定名、縦位置、縦位置差分、幅差分、高さ差分
4279
- const settingList = [
4280
- [`difficulty`, 0, -5, 0, 10],
4281
- [`speed`, 2, 0, 0, 0],
4282
- [`motion`, 3, 0, 0, 0],
4283
- [`reverse`, 4, 0, 0, 0],
4284
- [`scroll`, 4, 0, 0, 0],
4285
- [`shuffle`, 5.5, 0, 0, 0],
4286
- [`autoPlay`, 6.5, 0, 0, 0],
4287
- [`gauge`, 7.5, 0, 0, 0],
4288
- [`adjustment`, 10.5, 0, 0, 0],
4289
- [`fadein`, 11.5, 0, 0, 0],
4290
- [`volume`, 12.5, 0, 0, 0],
4291
- ];
4292
-
4293
4316
  // 設定毎に個別のスプライトを作成し、その中にラベル・ボタン類を配置
4294
- const spriteList = setSpriteList(settingList);
4317
+ const spriteList = setSpriteList(g_settingPos.option);
4295
4318
 
4296
4319
  // ---------------------------------------------------
4297
4320
  // 難易度 (Difficulty)
@@ -4344,7 +4367,7 @@ const createOptionWindow = _sprite => {
4344
4367
  k++;
4345
4368
  }
4346
4369
  });
4347
- const overlength = pos * C_LEN_SETLBL_HEIGHT - parseInt(difList.style.height);
4370
+ const overlength = pos * g_limitObj.setLblHeight - parseInt(difList.style.height);
4348
4371
  difList.scrollTop = (overlength > 0 ? overlength : 0);
4349
4372
  };
4350
4373
 
@@ -4366,7 +4389,7 @@ const createOptionWindow = _sprite => {
4366
4389
  g_keyObj.prevKey = g_keyObj.currentKey;
4367
4390
  }
4368
4391
  }, {
4369
- x: 430 + _scrollNum * 10, y: 40, w: 20, h: 20, siz: C_SIZ_JDGCNTS,
4392
+ x: 430 + _scrollNum * 10, y: 40, w: 20, h: 20, siz: g_limitObj.jdgCntsSiz,
4370
4393
  }, g_cssObj.button_Mini);
4371
4394
  };
4372
4395
 
@@ -4387,7 +4410,7 @@ const createOptionWindow = _sprite => {
4387
4410
  difCover.appendChild(
4388
4411
  makeDifLblCssButton(`difRandom`, `RANDOM`, 0, _ => {
4389
4412
  nextDifficulty(Math.floor(Math.random() * g_headerObj.keyLabels.length));
4390
- }, { w: C_LEN_DIFCOVER_WIDTH })
4413
+ }, { w: g_limitObj.difCoverWidth })
4391
4414
  );
4392
4415
 
4393
4416
  // 全リスト
@@ -4396,7 +4419,7 @@ const createOptionWindow = _sprite => {
4396
4419
  resetDifWindow();
4397
4420
  g_stateObj.filterKeys = ``;
4398
4421
  createDifWindow();
4399
- }, { w: C_LEN_DIFCOVER_WIDTH, btnStyle: (g_stateObj.filterKeys === `` ? `Setting` : `Default`) })
4422
+ }, { w: g_limitObj.difCoverWidth, btnStyle: (g_stateObj.filterKeys === `` ? `Setting` : `Default`) })
4400
4423
  );
4401
4424
 
4402
4425
  // キー別フィルタボタン作成
@@ -4407,13 +4430,13 @@ const createOptionWindow = _sprite => {
4407
4430
  resetDifWindow();
4408
4431
  g_stateObj.filterKeys = targetKey;
4409
4432
  createDifWindow(targetKey);
4410
- }, { w: C_LEN_DIFCOVER_WIDTH, btnStyle: (g_stateObj.filterKeys === targetKey ? `Setting` : `Default`) })
4433
+ }, { w: g_limitObj.difCoverWidth, btnStyle: (g_stateObj.filterKeys === targetKey ? `Setting` : `Default`) })
4411
4434
  );
4412
4435
  if (g_stateObj.filterKeys === targetKey) {
4413
4436
  pos = m + 9;
4414
4437
  }
4415
4438
  });
4416
- const overlength = pos * C_LEN_SETLBL_HEIGHT - parseInt(difCover.style.height);
4439
+ const overlength = pos * g_limitObj.setLblHeight - parseInt(difCover.style.height);
4417
4440
  difCover.scrollTop = (overlength > 0 ? overlength : 0);
4418
4441
 
4419
4442
  multiAppend(optionsprite, makeDifBtn(-1), makeDifBtn());
@@ -4432,7 +4455,7 @@ const createOptionWindow = _sprite => {
4432
4455
  }
4433
4456
  };
4434
4457
  const lnkDifficulty = makeSettingLblCssButton(`lnkDifficulty`, ``, 0, _ => changeDifficulty(), {
4435
- y: -10, h: C_LEN_SETLBL_HEIGHT + 10, cxtFunc: _ => changeDifficulty(-1),
4458
+ y: -10, h: g_limitObj.setLblHeight + 10, cxtFunc: _ => changeDifficulty(-1),
4436
4459
  });
4437
4460
 
4438
4461
  // 譜面選択ボタン(メイン、右回し、左回し)
@@ -4472,8 +4495,8 @@ const createOptionWindow = _sprite => {
4472
4495
  const bkColor = window.getComputedStyle(textBaseObj, ``).backgroundColor;
4473
4496
 
4474
4497
  graphObj.id = `graph${_name}`;
4475
- graphObj.width = C_LEN_GRAPH_WIDTH;
4476
- graphObj.height = C_LEN_GRAPH_HEIGHT;
4498
+ graphObj.width = g_limitObj.graphWidth;
4499
+ graphObj.height = g_limitObj.graphHeight;
4477
4500
  graphObj.style.left = `125px`;
4478
4501
  graphObj.style.top = `0px`;
4479
4502
  graphObj.style.position = `absolute`;
@@ -4489,7 +4512,7 @@ const createOptionWindow = _sprite => {
4489
4512
  if (g_headerObj.scoreDetailUse) {
4490
4513
  spriteList.speed.appendChild(
4491
4514
  createCss2Button(`btnGraph`, `i`, _ => true, {
4492
- x: -25, y: -60, w: 30, h: 30, siz: C_SIZ_JDGCHARA, title: g_msgObj.graph,
4515
+ x: -25, y: -60, w: 30, h: 30, siz: g_limitObj.jdgCharaSiz, title: g_msgObj.graph,
4493
4516
  resetFunc: _ => setScoreDetail(), cxtFunc: _ => setScoreDetail(),
4494
4517
  }, g_cssObj.button_Mini)
4495
4518
  );
@@ -4527,7 +4550,7 @@ const createOptionWindow = _sprite => {
4527
4550
  );
4528
4551
  g_settings.scoreDetails.forEach((sd, j) => {
4529
4552
  scoreDetail.appendChild(
4530
- makeDifLblCssButton(`lnk${sd}G`, getStgDetailName(sd), j, _ => changeScoreDetail(j), { w: C_LEN_DIFCOVER_WIDTH, btnStyle: (g_stateObj.scoreDetail === sd ? `Setting` : `Default`) })
4553
+ makeDifLblCssButton(`lnk${sd}G`, getStgDetailName(sd), j, _ => changeScoreDetail(j), { w: g_limitObj.difCoverWidth, btnStyle: (g_stateObj.scoreDetail === sd ? `Setting` : `Default`) })
4531
4554
  );
4532
4555
  createScText(document.getElementById(`lnk${sd}G`), `${sd}G`, { targetLabel: `lnk${sd}G`, x: -10 });
4533
4556
  });
@@ -4577,8 +4600,8 @@ const createOptionWindow = _sprite => {
4577
4600
  const startFrame = g_detailObj.startFrame[_scoreId];
4578
4601
  const playingFrame = g_detailObj.playingFrameWithBlank[_scoreId];
4579
4602
  const speedObj = {
4580
- speed: { frame: [0], speed: [1], cnt: 0, strokeColor: C_CLR_SPEEDGRAPH_SPEED },
4581
- boost: { frame: [0], speed: [1], cnt: 0, strokeColor: C_CLR_SPEEDGRAPH_BOOST }
4603
+ speed: { frame: [0], speed: [1], cnt: 0, strokeColor: g_graphColorObj.speed },
4604
+ boost: { frame: [0], speed: [1], cnt: 0, strokeColor: g_graphColorObj.boost }
4582
4605
  };
4583
4606
 
4584
4607
  Object.keys(speedObj).forEach(speedType => {
@@ -4608,7 +4631,7 @@ const createOptionWindow = _sprite => {
4608
4631
  let preY;
4609
4632
 
4610
4633
  for (let i = 0; i < speedObj[speedType].frame.length; i++) {
4611
- const x = speedObj[speedType].frame[i] * (C_LEN_GRAPH_WIDTH - 30) / playingFrame + 30;
4634
+ const x = speedObj[speedType].frame[i] * (g_limitObj.graphWidth - 30) / playingFrame + 30;
4612
4635
  const y = (speedObj[speedType].speed[i] - 1) * -90 + 105;
4613
4636
 
4614
4637
  context.lineTo(x, preY);
@@ -4625,7 +4648,7 @@ const createOptionWindow = _sprite => {
4625
4648
  context.moveTo(lineX, 215);
4626
4649
  context.lineTo(lineX + 30, 215);
4627
4650
  context.stroke();
4628
- context.font = `${C_SIZ_DIFSELECTOR}px ${getBasicFont()}`;
4651
+ context.font = `${g_limitObj.difSelectorSiz}px ${getBasicFont()}`;
4629
4652
  context.fillText(speedType, lineX + 35, 218);
4630
4653
 
4631
4654
  updateScoreDetailLabel(`Speed`, `${speedType}S`, speedObj[speedType].cnt, j, g_lblNameObj[`s_${speedType}`]);
@@ -4663,7 +4686,7 @@ const createOptionWindow = _sprite => {
4663
4686
  context.moveTo(lineX, 215);
4664
4687
  context.lineTo(lineX + 20, 215);
4665
4688
  context.stroke();
4666
- context.font = `${C_SIZ_DIFSELECTOR}px ${getBasicFont()}`;
4689
+ context.font = `${g_limitObj.difSelectorSiz}px ${getBasicFont()}`;
4667
4690
  context.fillText(lineNames[j], lineX + 20, 218);
4668
4691
  });
4669
4692
 
@@ -4686,7 +4709,7 @@ const createOptionWindow = _sprite => {
4686
4709
  const baseLabel = (_bLabel, _bLabelname, _bAlign) =>
4687
4710
  document.querySelector(`#detail${_name}`).appendChild(
4688
4711
  createDivCss2Label(`${_bLabel}`, `${_bLabelname}`, {
4689
- x: 10, y: 105 + _pos * 20, w: 100, h: 20, siz: C_SIZ_DIFSELECTOR, align: _bAlign,
4712
+ x: 10, y: 105 + _pos * 20, w: 100, h: 20, siz: g_limitObj.difSelectorSiz, align: _bAlign,
4690
4713
  })
4691
4714
  );
4692
4715
  if (document.querySelector(`#data${_label}`) === null) {
@@ -4703,7 +4726,7 @@ const createOptionWindow = _sprite => {
4703
4726
  * @param {number} _resolution
4704
4727
  */
4705
4728
  const drawBaseLine = (_context, _resolution = 10) => {
4706
- _context.clearRect(0, 0, C_LEN_GRAPH_WIDTH, C_LEN_GRAPH_HEIGHT);
4729
+ _context.clearRect(0, 0, g_limitObj.graphWidth, g_limitObj.graphHeight);
4707
4730
 
4708
4731
  for (let j = 0; j <= 2 * _resolution; j += 5) {
4709
4732
  drawLine(_context, j / _resolution, `main`, 2);
@@ -4724,7 +4747,7 @@ const createOptionWindow = _sprite => {
4724
4747
  const lineY = (_y - 1) * -90 + 105;
4725
4748
  _context.beginPath();
4726
4749
  _context.moveTo(30, lineY);
4727
- _context.lineTo(C_LEN_GRAPH_WIDTH, lineY);
4750
+ _context.lineTo(g_limitObj.graphWidth, lineY);
4728
4751
  _context.lineWidth = 1;
4729
4752
 
4730
4753
  if (_lineType === `main`) {
@@ -4754,7 +4777,7 @@ const createOptionWindow = _sprite => {
4754
4777
  * @param {string} _data
4755
4778
  * @param {object} _obj
4756
4779
  */
4757
- const makeDifInfoLabel = (_lbl, _data, { x = 130, y = 25, w = 125, h = 35, siz = C_SIZ_DIFSELECTOR, ...rest } = {}) =>
4780
+ const makeDifInfoLabel = (_lbl, _data, { x = 130, y = 25, w = 125, h = 35, siz = g_limitObj.difSelectorSiz, ...rest } = {}) =>
4758
4781
  createDivCss2Label(_lbl, _data, { x, y, w, h, siz, align: C_ALIGN_LEFT, ...rest });
4759
4782
 
4760
4783
  let printData = ``;
@@ -4818,7 +4841,7 @@ const createOptionWindow = _sprite => {
4818
4841
  dataDouji.textContent = g_detailObj.toolDif[_scoreId].douji;
4819
4842
  dataTate.textContent = g_detailObj.toolDif[_scoreId].tate;
4820
4843
  lblArrowInfo2.innerHTML = g_lblNameObj.s_linecnts.split(`{0}`).join(g_detailObj.toolDif[_scoreId].push3cnt);
4821
- dataArrowInfo.innerHTML = `${arrowCnts + frzCnts} <span style="font-size:${C_SIZ_DIFSELECTOR}px;">(${arrowCnts} + ${frzCnts})</span>`;
4844
+ dataArrowInfo.innerHTML = `${arrowCnts + frzCnts} <span style="font-size:${g_limitObj.difSelectorSiz}px;">(${arrowCnts} + ${frzCnts})</span>`;
4822
4845
  dataArrowInfo2.innerHTML = `<br>(${g_detailObj.arrowCnt[_scoreId]})<br><br>
4823
4846
  (${g_detailObj.frzCnt[_scoreId]})<br><br>
4824
4847
  ${push3CntStr}`.split(`,`).join(`/`);
@@ -5207,10 +5230,10 @@ const createOptionWindow = _sprite => {
5207
5230
 
5208
5231
  const keyCtrlPtn = `${g_keyObj.currentKey}_${g_keyObj.currentPtn}`;
5209
5232
  if (g_headerObj.keyRetryDef === C_KEY_RETRY) {
5210
- g_headerObj.keyRetry = setIntVal(g_keyObj[`keyRetry${keyCtrlPtn}`], g_headerObj.keyRetryDef);
5233
+ g_headerObj.keyRetry = setIntVal(getKeyCtrlVal(g_keyObj[`keyRetry${keyCtrlPtn}`]), g_headerObj.keyRetryDef);
5211
5234
  }
5212
5235
  if (g_headerObj.keyTitleBackDef === C_KEY_TITLEBACK) {
5213
- g_headerObj.keyTitleBack = setIntVal(g_keyObj[`keyTitleBack${keyCtrlPtn}`], g_headerObj.keyTitleBackDef);
5236
+ g_headerObj.keyTitleBack = setIntVal(getKeyCtrlVal(g_keyObj[`keyTitleBack${keyCtrlPtn}`]), g_headerObj.keyTitleBackDef);
5214
5237
  }
5215
5238
  }
5216
5239
 
@@ -5240,7 +5263,7 @@ const createOptionWindow = _sprite => {
5240
5263
  // 譜面名設定 (Difficulty)
5241
5264
  const difWidth = parseFloat(lnkDifficulty.style.width);
5242
5265
  const difNames = [`${getKeyName(g_keyObj.currentKey)} ${getStgDetailName('key')} / ${g_headerObj.difLabels[g_stateObj.scoreId]}`];
5243
- lnkDifficulty.style.fontSize = `${getFontSize(difNames[0], difWidth, getBasicFont(), C_SIZ_SETLBL)}px`;
5266
+ lnkDifficulty.style.fontSize = `${getFontSize(difNames[0], difWidth, getBasicFont(), g_limitObj.setLblSiz)}px`;
5244
5267
 
5245
5268
  if (g_headerObj.makerView) {
5246
5269
  difNames.push(`(${g_headerObj.creatorNames[g_stateObj.scoreId]})`);
@@ -5354,8 +5377,8 @@ const createGeneralSetting = (_obj, _settingName, { unitName = ``,
5354
5377
  // 右回し・左回しボタン(最内側)
5355
5378
  if (skipTerms[2] > 1) {
5356
5379
  multiAppend(_obj,
5357
- makeMiniCssButton(linkId, `RRR`, 0, _ => setSetting(skipTerms[2], _settingName, unitName, roundNum), { dw: -C_LEN_SETMINI_WIDTH / 2 }),
5358
- makeMiniCssButton(linkId, `LLL`, 0, _ => setSetting(skipTerms[2] * (-1), _settingName, unitName, roundNum), { dw: -C_LEN_SETMINI_WIDTH / 2 }),
5380
+ makeMiniCssButton(linkId, `RRR`, 0, _ => setSetting(skipTerms[2], _settingName, unitName, roundNum), { dw: -g_limitObj.setMiniWidth / 2 }),
5381
+ makeMiniCssButton(linkId, `LLL`, 0, _ => setSetting(skipTerms[2] * (-1), _settingName, unitName, roundNum), { dw: -g_limitObj.setMiniWidth / 2 }),
5359
5382
  );
5360
5383
  }
5361
5384
 
@@ -5439,7 +5462,7 @@ const setSetting = (_scrollNum, _settingName, _unitName = ``, _roundNum = 0) =>
5439
5462
  */
5440
5463
  const makeDisabledLabel = (_id, _heightPos, _defaultStr) => {
5441
5464
  return createDivCss2Label(_id, _defaultStr, {
5442
- x: C_LEN_SETLBL_LEFT, y: C_LEN_SETLBL_HEIGHT * _heightPos,
5465
+ x: g_limitObj.setLblLeft, y: g_limitObj.setLblHeight * _heightPos,
5443
5466
  }, g_cssObj.settings_Disabled);
5444
5467
  };
5445
5468
 
@@ -5473,7 +5496,7 @@ const setReverseDefault = _ => {
5473
5496
  const getKeyCtrl = (_localStorage, _extraKeyName = ``) => {
5474
5497
  const baseKeyCtrlPtn = _localStorage[`keyCtrlPtn${_extraKeyName}`];
5475
5498
  const basePtn = `${g_keyObj.currentKey}_${baseKeyCtrlPtn}`;
5476
- const baseKeyNum = g_keyObj[`chara${basePtn}`].length;
5499
+ const baseKeyNum = g_keyObj[`${g_keyObj.defaultProp}${basePtn}`].length;
5477
5500
 
5478
5501
  if (_localStorage[`keyCtrl${_extraKeyName}`] !== undefined && _localStorage[`keyCtrl${_extraKeyName}`][0].length > 0) {
5479
5502
  const prevPtn = g_keyObj.currentPtn;
@@ -5522,11 +5545,11 @@ const getKeyCtrl = (_localStorage, _extraKeyName = ``) => {
5522
5545
  */
5523
5546
  const makeSettingLblCssButton = (_id, _name, _heightPos, _func, { x, y, w, h, siz, cxtFunc = _ => true, ...rest } = {}, ..._classes) => {
5524
5547
  const tmpObj = {
5525
- x: x !== undefined ? x : C_LEN_SETLBL_LEFT,
5526
- y: y !== undefined ? y : C_LEN_SETLBL_HEIGHT * _heightPos,
5527
- w: w !== undefined ? w : C_LEN_SETLBL_WIDTH,
5528
- h: h !== undefined ? h : C_LEN_SETLBL_HEIGHT,
5529
- siz: siz !== undefined ? siz : C_SIZ_SETLBL,
5548
+ x: x !== undefined ? x : g_limitObj.setLblLeft,
5549
+ y: y !== undefined ? y : g_limitObj.setLblHeight * _heightPos,
5550
+ w: w !== undefined ? w : g_limitObj.setLblWidth,
5551
+ h: h !== undefined ? h : g_limitObj.setLblHeight,
5552
+ siz: siz !== undefined ? siz : g_limitObj.setLblSiz,
5530
5553
  cxtFunc: cxtFunc !== undefined ? cxtFunc : _ => true,
5531
5554
  };
5532
5555
  return createCss2Button(_id, _name, _func, { ...tmpObj, ...rest }, g_cssObj.button_Default, ..._classes);
@@ -5539,11 +5562,11 @@ const makeSettingLblCssButton = (_id, _name, _heightPos, _func, { x, y, w, h, si
5539
5562
  * @param {number} _heightPos 上からの配置順
5540
5563
  * @param {function} _func
5541
5564
  */
5542
- const makeDifLblCssButton = (_id, _name, _heightPos, _func, { x = 0, w = C_LEN_DIFSELECTOR_WIDTH, btnStyle = `Default` } = {}) => {
5565
+ const makeDifLblCssButton = (_id, _name, _heightPos, _func, { x = 0, w = g_limitObj.difSelectorWidth, btnStyle = `Default` } = {}) => {
5543
5566
  return createCss2Button(_id, _name, _func, {
5544
- x: x, y: C_LEN_SETLBL_HEIGHT * _heightPos,
5545
- w: w, h: C_LEN_SETLBL_HEIGHT,
5546
- siz: C_SIZ_DIFSELECTOR,
5567
+ x: x, y: g_limitObj.setLblHeight * _heightPos,
5568
+ w: w, h: g_limitObj.setLblHeight,
5569
+ siz: g_limitObj.difSelectorSiz,
5547
5570
  borderStyle: `solid`,
5548
5571
  }, g_cssObj[`button_${btnStyle}`], g_cssObj.button_ON);
5549
5572
  };
@@ -5558,8 +5581,8 @@ const makeDifLblCssButton = (_id, _name, _heightPos, _func, { x = 0, w = C_LEN_D
5558
5581
  const makeMiniCssButton = (_id, _directionFlg, _heightPos, _func, { dx = 0, dy = 0, dw = 0, dh = 0, dsiz = 0, visibility = `visible` } = {}) => {
5559
5582
  return createCss2Button(`${_id}${_directionFlg}`, g_settingBtnObj.chara[_directionFlg], _func, {
5560
5583
  x: g_settingBtnObj.pos[_directionFlg] + dx,
5561
- y: C_LEN_SETLBL_HEIGHT * _heightPos + dy,
5562
- w: C_LEN_SETMINI_WIDTH + dw, h: C_LEN_SETLBL_HEIGHT + dh, siz: C_SIZ_SETLBL + dsiz,
5584
+ y: g_limitObj.setLblHeight * _heightPos + dy,
5585
+ w: g_limitObj.setMiniWidth + dw, h: g_limitObj.setLblHeight + dh, siz: g_limitObj.setLblSiz + dsiz,
5563
5586
  visibility: visibility
5564
5587
  }, g_cssObj.button_Mini);
5565
5588
  };
@@ -5646,8 +5669,8 @@ const createSettingsDisplayWindow = _sprite => {
5646
5669
  */
5647
5670
  const makeDisabledDisplayLabel = (_id, _heightPos, _widthPos, _defaultStr, _flg) => {
5648
5671
  return createDivCss2Label(_id, _defaultStr, {
5649
- x: 30 + 180 * _widthPos, y: 3 + C_LEN_SETLBL_HEIGHT * _heightPos,
5650
- w: 170, siz: C_SIZ_DIFSELECTOR,
5672
+ x: 30 + 180 * _widthPos, y: 3 + g_limitObj.setLblHeight * _heightPos,
5673
+ w: 170, siz: g_limitObj.difSelectorSiz,
5651
5674
  }, g_cssObj[`button_Disabled${flg}`]);
5652
5675
  };
5653
5676
 
@@ -5679,16 +5702,9 @@ const createSettingsDisplayWindow = _sprite => {
5679
5702
  // 各ボタン用のスプライトを作成
5680
5703
  createOptionSprite(_sprite);
5681
5704
 
5682
- // 設定名、縦位置、縦位置差分、幅差分、高さ差分
5683
- const settingList = [
5684
- [`appearance`, 7.4, 10, 0, 0],
5685
- [`opacity`, 9, 10, 0, 0],
5686
- [`hitPosition`, 10, 10, 0, 0],
5687
- ];
5688
-
5689
5705
  // 設定毎に個別のスプライトを作成し、その中にラベル・ボタン類を配置
5690
5706
  const displaySprite = createEmptySprite(optionsprite, `displaySprite`, g_windowObj.displaySprite);
5691
- const spriteList = setSpriteList(settingList);
5707
+ const spriteList = setSpriteList(g_settingPos.settingsDisplay);
5692
5708
 
5693
5709
  _sprite.appendChild(createDivCss2Label(`sdDesc`, g_lblNameObj.sdDesc, g_lblPosObj.sdDesc));
5694
5710
  g_displays.forEach((name, j) => makeDisplayButton(name, j % 7, Math.floor(j / 7)));
@@ -5970,7 +5986,7 @@ const keyConfigInit = (_kcType = g_kcType) => {
5970
5986
  setKeyConfigCursor();
5971
5987
  }, {
5972
5988
  x: keyconX, y: 50 + C_KYC_REPHEIGHT * k + keyconY,
5973
- w: C_ARW_WIDTH, h: C_KYC_REPHEIGHT, siz: C_SIZ_JDGCNTS,
5989
+ w: C_ARW_WIDTH, h: C_KYC_REPHEIGHT, siz: g_limitObj.jdgCntsSiz,
5974
5990
  }, g_cssObj.button_Default_NoColor, g_cssObj.title_base)
5975
5991
  );
5976
5992
 
@@ -6064,7 +6080,7 @@ const keyConfigInit = (_kcType = g_kcType) => {
6064
6080
  * @returns ボタン
6065
6081
  */
6066
6082
  const makeKCButton = (_id, _text, _func, { x = g_sWidth * 5 / 6 - 20, y = 15, w = g_sWidth / 6, h = 18,
6067
- siz = C_SIZ_JDGCNTS, borderStyle = `solid`, cxtFunc, ...rest } = {}, _mainClass = g_cssObj.button_RevOFF, ..._classes) => {
6083
+ siz = g_limitObj.jdgCntsSiz, borderStyle = `solid`, cxtFunc, ...rest } = {}, _mainClass = g_cssObj.button_RevOFF, ..._classes) => {
6068
6084
  return makeSettingLblCssButton(_id, getStgDetailName(_text), 0, _func, { x, y, w, h, siz, cxtFunc, borderStyle, ...rest }, _mainClass, ..._classes);
6069
6085
  };
6070
6086
 
@@ -6076,7 +6092,7 @@ const keyConfigInit = (_kcType = g_kcType) => {
6076
6092
  * @param {*} object (x, y, w, h, siz)
6077
6093
  * @returns
6078
6094
  */
6079
- const makeMiniKCButton = (_id, _directionFlg, _func, { x = g_sWidth * 5 / 6 - 30, y = 15, w = 15, h = 20, siz = C_SIZ_MAIN } = {}) => {
6095
+ const makeMiniKCButton = (_id, _directionFlg, _func, { x = g_sWidth * 5 / 6 - 30, y = 15, w = 15, h = 20, siz = g_limitObj.mainSiz } = {}) => {
6080
6096
  return createCss2Button(`${_id}${_directionFlg}`, g_settingBtnObj.chara[_directionFlg], _func,
6081
6097
  { x, y, w, h, siz }, g_cssObj.button_Mini);
6082
6098
  };
@@ -6553,7 +6569,7 @@ const getShadowColor = (_colorPos, _arrowColor) => g_headerObj.setShadowColor[_c
6553
6569
  */
6554
6570
  const getKeyInfo = _ => {
6555
6571
  const keyCtrlPtn = `${g_keyObj.currentKey}_${g_keyObj.currentPtn}`;
6556
- const keyNum = g_keyObj[`chara${keyCtrlPtn}`].length;
6572
+ const keyNum = g_keyObj[`${g_keyObj.defaultProp}${keyCtrlPtn}`].length;
6557
6573
  const posMax = (g_keyObj[`divMax${keyCtrlPtn}`] !== undefined ?
6558
6574
  g_keyObj[`divMax${keyCtrlPtn}`] : Math.max(...g_keyObj[`pos${keyCtrlPtn}`]) + 1);
6559
6575
  const divideCnt = g_keyObj[`div${keyCtrlPtn}`] - 1;
@@ -7104,7 +7120,7 @@ const scoreConvert = (_dosObj, _scoreId, _preblankFrame, _dummyNo = ``,
7104
7120
  const obj = {};
7105
7121
 
7106
7122
  const scoreIdHeader = setScoreIdHeader(_scoreId, g_stateObj.scoreLockFlg);
7107
- const keyNum = g_keyObj[`chara${_keyCtrlPtn}`].length;
7123
+ const keyNum = g_keyObj[`${g_keyObj.defaultProp}${_keyCtrlPtn}`].length;
7108
7124
  obj.arrowData = [];
7109
7125
  obj.frzData = [];
7110
7126
  obj.dummyArrowData = [];
@@ -7584,7 +7600,7 @@ const calcLifeVal = (_val, _allArrows) => Math.round(_val * g_headerObj.maxLifeV
7584
7600
  const getLastFrame = (_dataObj, _keyCtrlPtn = `${g_keyObj.currentKey}_${g_keyObj.currentPtn}`) => {
7585
7601
 
7586
7602
  let tmpLastNum = 0;
7587
- const keyNum = g_keyObj[`chara${_keyCtrlPtn}`].length;
7603
+ const keyNum = g_keyObj[`${g_keyObj.defaultProp}${_keyCtrlPtn}`].length;
7588
7604
 
7589
7605
  for (let j = 0; j < keyNum; j++) {
7590
7606
  const data = [
@@ -7611,7 +7627,7 @@ const getLastFrame = (_dataObj, _keyCtrlPtn = `${g_keyObj.currentKey}_${g_keyObj
7611
7627
  const getFirstArrowFrame = (_dataObj, _keyCtrlPtn = `${g_keyObj.currentKey}_${g_keyObj.currentPtn}`) => {
7612
7628
 
7613
7629
  let tmpFirstNum = Infinity;
7614
- const keyNum = g_keyObj[`chara${_keyCtrlPtn}`].length;
7630
+ const keyNum = g_keyObj[`${g_keyObj.defaultProp}${_keyCtrlPtn}`].length;
7615
7631
 
7616
7632
  for (let j = 0; j < keyNum; j++) {
7617
7633
  const data = [
@@ -8729,7 +8745,7 @@ const mainInit = _ => {
8729
8745
  const makerView = g_headerObj.makerView ? ` (${g_headerObj.creatorNames[g_stateObj.scoreId]})` : ``;
8730
8746
  let difName = `[${getKeyName(g_headerObj.keyLabels[g_stateObj.scoreId])} / ${g_headerObj.difLabels[g_stateObj.scoreId]}${assistFlg}${shuffleName}${makerView}]`;
8731
8747
  let creditName = `${musicTitle} / ${artistName}`;
8732
- if (checkMusicSiz(creditName, C_SIZ_MUSIC_TITLE) < 12) {
8748
+ if (checkMusicSiz(creditName, g_limitObj.musicTitleSiz) < 12) {
8733
8749
  creditName = `${musicTitle}`;
8734
8750
  difName = `/ ${artistName} ` + difName;
8735
8751
  }
@@ -8738,7 +8754,7 @@ const mainInit = _ => {
8738
8754
 
8739
8755
  // ライフ(数字)
8740
8756
  createDivCss2Label(`lblLife`, intLifeVal, {
8741
- x: 0, y: 30, w: 70, h: 20, siz: C_SIZ_JDGCNTS, display: g_workObj.lifegaugeDisp,
8757
+ x: 0, y: 30, w: 70, h: 20, siz: g_limitObj.jdgCntsSiz, display: g_workObj.lifegaugeDisp,
8742
8758
  }, lblInitColor),
8743
8759
 
8744
8760
  // ライフ背景
@@ -8762,7 +8778,7 @@ const mainInit = _ => {
8762
8778
  }, g_cssObj.life_Border, g_cssObj.life_BorderColor),
8763
8779
 
8764
8780
  // 曲名・アーティスト名表示
8765
- createDivCss2Label(`lblCredit`, creditName, Object.assign(g_lblPosObj.lblCredit, { siz: checkMusicSiz(creditName, C_SIZ_MUSIC_TITLE) })),
8781
+ createDivCss2Label(`lblCredit`, creditName, Object.assign(g_lblPosObj.lblCredit, { siz: checkMusicSiz(creditName, g_limitObj.musicTitleSiz) })),
8766
8782
 
8767
8783
  // 譜面名表示
8768
8784
  createDivCss2Label(`lblDifName`, difName, Object.assign(g_lblPosObj.lblDifName, { siz: checkMusicSiz(difName, 12) })),
@@ -8801,7 +8817,7 @@ const mainInit = _ => {
8801
8817
  // キャラクタ表示
8802
8818
  const charaJ = createDivCss2Label(`chara${jdg}`, ``, {
8803
8819
  x: jdgX[j], y: jdgY[j],
8804
- w: C_LEN_JDGCHARA_WIDTH, h: C_LEN_JDGCHARA_HEIGHT, siz: C_SIZ_JDGCHARA,
8820
+ w: g_limitObj.jdgCharaWidth, h: g_limitObj.jdgCharaHeight, siz: g_limitObj.jdgCharaSiz,
8805
8821
  opacity: g_stateObj.opacity / 100, display: g_workObj.judgmentDisp,
8806
8822
  }, g_cssObj.common_ii);
8807
8823
  charaJ.setAttribute(`cnt`, 0);
@@ -8814,14 +8830,14 @@ const mainInit = _ => {
8814
8830
  // コンボ表示
8815
8831
  createDivCss2Label(`combo${jdg}`, ``, {
8816
8832
  x: jdgX[j] + 170, y: jdgY[j],
8817
- w: C_LEN_JDGCHARA_WIDTH, h: C_LEN_JDGCHARA_HEIGHT, siz: C_SIZ_JDGCHARA,
8833
+ w: g_limitObj.jdgCharaWidth, h: g_limitObj.jdgCharaHeight, siz: g_limitObj.jdgCharaSiz,
8818
8834
  opacity: g_stateObj.opacity / 100, display: g_workObj.judgmentDisp,
8819
8835
  }, g_cssObj[`common_${jdgCombos[j]}`]),
8820
8836
 
8821
8837
  // Fast/Slow表示
8822
8838
  createDivCss2Label(`diff${jdg}`, ``, {
8823
8839
  x: jdgX[j] + 170, y: jdgY[j] + 25,
8824
- w: C_LEN_JDGCHARA_WIDTH, h: C_LEN_JDGCHARA_HEIGHT, siz: C_SIZ_MAIN,
8840
+ w: g_limitObj.jdgCharaWidth, h: g_limitObj.jdgCharaHeight, siz: g_limitObj.mainSiz,
8825
8841
  opacity: g_stateObj.opacity / 100, display: g_workObj.fastslowDisp,
8826
8842
  }, g_cssObj.common_combo),
8827
8843
 
@@ -9652,7 +9668,7 @@ const mainInit = _ => {
9652
9668
  } else if (/\[fontSize=\d+\]/.test(g_wordObj.wordDat)) {
9653
9669
 
9654
9670
  // フォントサイズ変更
9655
- const fontSize = setIntVal(g_wordObj.wordDat.match(/\d+/)[0], C_SIZ_MAIN);
9671
+ const fontSize = setIntVal(g_wordObj.wordDat.match(/\d+/)[0], g_limitObj.mainSiz);
9656
9672
  g_wordSprite.style.fontSize = `${fontSize}px`;
9657
9673
 
9658
9674
  } else {
@@ -9782,8 +9798,8 @@ const changeAppearanceFilter = (_appearance, _num = 10) => {
9782
9798
  */
9783
9799
  const makeCounterSymbol = (_id, _x, _class, _heightPos, _text, _display = C_DIS_INHERIT) => {
9784
9800
  return createDivCss2Label(_id, _text, {
9785
- x: _x, y: C_LEN_JDGCNTS_HEIGHT * _heightPos,
9786
- w: C_LEN_JDGCNTS_WIDTH, h: C_LEN_JDGCNTS_HEIGHT, siz: C_SIZ_JDGCNTS, align: C_ALIGN_RIGHT,
9801
+ x: _x, y: g_limitObj.jdgCntsHeight * _heightPos,
9802
+ w: g_limitObj.jdgCntsWidth, h: g_limitObj.jdgCntsHeight, siz: g_limitObj.jdgCntsSiz, align: C_ALIGN_RIGHT,
9787
9803
  display: _display,
9788
9804
  }, _class);
9789
9805
  };
@@ -10749,9 +10765,9 @@ const resultInit = _ => {
10749
10765
  * @param {string} _text
10750
10766
  * @param {string} _align
10751
10767
  */
10752
- const makeCssResultPlayData = (_id, _x, _class, _heightPos, _text, _align = C_ALIGN_CENTER, { w = 400, siz = C_SIZ_MAIN } = {}) =>
10768
+ const makeCssResultPlayData = (_id, _x, _class, _heightPos, _text, _align = C_ALIGN_CENTER, { w = 400, siz = g_limitObj.mainSiz } = {}) =>
10753
10769
  createDivCss2Label(_id, _text, {
10754
- x: _x, y: C_SIZ_SETMINI * _heightPos, w, h: C_SIZ_SETMINI, siz, align: _align,
10770
+ x: _x, y: g_limitObj.setMiniSiz * _heightPos, w, h: g_limitObj.setMiniSiz, siz, align: _align,
10755
10771
  }, _class);
10756
10772
 
10757
10773
  /**
@@ -10764,7 +10780,7 @@ const makeCssResultPlayData = (_id, _x, _class, _heightPos, _text, _align = C_AL
10764
10780
  * @param {string} _align
10765
10781
  */
10766
10782
  const makeCssResultSymbol = (_id, _x, _class, _heightPos, _text, _align = C_ALIGN_LEFT) =>
10767
- makeCssResultPlayData(_id, _x, _class, _heightPos, _text, _align, { w: 150, siz: C_SIZ_JDGCNTS });
10783
+ makeCssResultPlayData(_id, _x, _class, _heightPos, _text, _align, { w: 150, siz: g_limitObj.jdgCntsSiz });
10768
10784
 
10769
10785
  // ライセンス原文、以下は削除しないでください
10770
10786
  /*-----------------------------------------------------------*/