danoniplus 31.1.0 → 31.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/js/danoni_main.js CHANGED
@@ -4,12 +4,12 @@
4
4
  *
5
5
  * Source by tickle
6
6
  * Created : 2018/10/08
7
- * Revised : 2023/03/25
7
+ * Revised : 2023/04/05
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 31.1.0`;
12
- const g_revisedDate = `2023/03/25`;
11
+ const g_version = `Ver 31.3.1`;
12
+ const g_revisedDate = `2023/04/05`;
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
  /**
@@ -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: [] };
@@ -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));
@@ -3217,15 +3227,22 @@ const resetBaseColorList = (_baseObj, _dosObj, { scoreId = `` } = {}) => {
3217
3227
 
3218
3228
  const obj = {};
3219
3229
  const scoreIdHeader = setScoreIdHeader(scoreId);
3230
+ const getRefData = (_header, _dataName) => {
3231
+ const data = _dosObj[`${_header}${_dataName}`];
3232
+ return data?.startsWith(_header) ? _dosObj[data] : data;
3233
+ }
3220
3234
 
3221
3235
  [``, `Shadow`].forEach(pattern => {
3222
- const _name = `set${pattern}Color${scoreIdHeader}`;
3223
- const _frzName = `frz${pattern}Color${scoreIdHeader}`;
3224
- const _arrowInit = `set${pattern}ColorInit`;
3225
- const _frzInit = `frz${pattern}ColorInit`;
3236
+ const _arrowCommon = `set${pattern}Color`;
3237
+ const _frzCommon = `frz${pattern}Color`;
3226
3238
 
3227
- const arrowColorTxt = _dosObj[_name] || _dosObj[`set${pattern}Color`];
3228
- const frzColorTxt = _dosObj[_frzName] || _dosObj[`frz${pattern}Color`];
3239
+ const _name = `${_arrowCommon}${scoreIdHeader}`;
3240
+ const _frzName = `${_frzCommon}${scoreIdHeader}`;
3241
+ const _arrowInit = `${_arrowCommon}Init`;
3242
+ const _frzInit = `${_frzCommon}Init`;
3243
+
3244
+ const arrowColorTxt = getRefData(_arrowCommon, scoreIdHeader) || _dosObj[_arrowCommon];
3245
+ const frzColorTxt = getRefData(_frzCommon, scoreIdHeader) || _dosObj[_frzCommon];
3229
3246
 
3230
3247
  // 矢印色
3231
3248
  Object.keys(_baseObj.dfColorgrdSet).forEach(type => {
@@ -3486,17 +3503,22 @@ const getKeyName = _key => hasVal(g_keyObj[`keyName${_key}`]) ? g_keyObj[`keyNam
3486
3503
  * 一時的な追加キーの設定
3487
3504
  * @param {object} _dosObj
3488
3505
  */
3489
- const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) } = {}) => {
3506
+ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList?.split(`,`) } = {}) => {
3490
3507
 
3491
3508
  if (keyExtraList === undefined) {
3492
- return [];
3509
+ keyExtraList = [];
3510
+ Object.keys(_dosObj).filter(val => val.startsWith(g_keyObj.defaultProp))
3511
+ .forEach(keyName => keyExtraList.push(keyName.slice(g_keyObj.defaultProp.length)));
3512
+
3513
+ if (keyExtraList.length === 0) {
3514
+ return [];
3515
+ }
3493
3516
  }
3494
3517
 
3495
3518
  const existParam = (_data, _paramName) => !hasVal(_data) && g_keyObj[_paramName] !== undefined;
3496
3519
  const toString = _str => _str;
3497
3520
  const toNumber = _num => parseInt(_num, 10);
3498
3521
  const toFloat = _num => parseFloat(_num);
3499
- const toStringOrNumber = _str => isNaN(Number(_str)) ? _str : toNumber(_str);
3500
3522
  const toKeyCtrlArray = _str => makeBaseArray(_str.split(`/`).map(n => toNumber(n)), g_keyObj.minKeyCtrlNum, 0);
3501
3523
  const toSplitArrayStr = _str => _str.split(`/`).map(n => n);
3502
3524
 
@@ -3573,7 +3595,7 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3573
3595
  const keyPtn = getKeyPtnName(list);
3574
3596
  if (list === ``) {
3575
3597
  // 空指定の場合は一律同じグループへ割り当て
3576
- g_keyObj[`${keyheader}_${k + dfPtn}_${ptnCnt}`] = [...Array(g_keyObj[`chara${_key}_${k + dfPtn}`].length)].fill(0);
3598
+ g_keyObj[`${keyheader}_${k + dfPtn}_${ptnCnt}`] = [...Array(g_keyObj[`${g_keyObj.defaultProp}${_key}_${k + dfPtn}`].length)].fill(0);
3577
3599
 
3578
3600
  } else if (g_keyObj[`${_name}${keyPtn}_0`] !== undefined) {
3579
3601
  // 他のキーパターン (例: |shuffle8i=8_0| ) を指定した場合、該当があれば既存パターンからコピー
@@ -3585,7 +3607,9 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3585
3607
  }
3586
3608
  } else {
3587
3609
  // 通常の指定方法 (例: |shuffle8i=1,1,1,2,0,0,0,0/1,1,1,1,0,0,0,0| )の場合の取り込み
3588
- g_keyObj[`${keyheader}_${k + dfPtn}_${ptnCnt}`] = list.split(`,`).map(n => isNaN(Number(n)) ? n : parseInt(n, 10));
3610
+ g_keyObj[`${keyheader}_${k + dfPtn}_${ptnCnt}`] =
3611
+ makeBaseArray(list.split(`,`).map(n => isNaN(parseInt(n)) ? n : parseInt(n, 10)),
3612
+ g_keyObj[`${g_keyObj.defaultProp}${_key}_${k + dfPtn}`].length, 0);
3589
3613
  ptnCnt++;
3590
3614
  }
3591
3615
  });
@@ -3593,10 +3617,10 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3593
3617
  }
3594
3618
 
3595
3619
  } else if (g_keyObj[`${keyheader}_${dfPtn}_0`] === undefined) {
3596
- // 特に指定が無い場合はcharaX_Yの配列長で決定
3620
+ // 特に指定が無い場合はkeyCtrlX_Yの配列長で決定
3597
3621
  for (let k = 0; k < g_keyObj.minPatterns; k++) {
3598
3622
  const ptnName = `${_key}_${k + dfPtn}`;
3599
- g_keyObj[`${_name}${ptnName}_0`] = [...Array(g_keyObj[`chara${ptnName}`].length)].fill(0);
3623
+ g_keyObj[`${_name}${ptnName}_0`] = [...Array(g_keyObj[`${g_keyObj.defaultProp}${ptnName}`].length)].fill(0);
3600
3624
  g_keyObj[`${_name}${ptnName}`] = structuredClone(g_keyObj[`${_name}${ptnName}_0`]);
3601
3625
  }
3602
3626
  }
@@ -3642,7 +3666,7 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3642
3666
 
3643
3667
  // デフォルト項目がある場合は先に定義
3644
3668
  if (_defaultName !== ``) {
3645
- g_keyObj[pairName][_defaultName] = [...Array(g_keyObj[`chara${_key}_${k + dfPtn}`].length)].fill(_defaultVal);
3669
+ g_keyObj[pairName][_defaultName] = [...Array(g_keyObj[`${g_keyObj.defaultProp}${_key}_${k + dfPtn}`].length)].fill(_defaultVal);
3646
3670
  }
3647
3671
  tmpParams[k].split(`/`).forEach(pairs => {
3648
3672
  const keyPtn = getKeyPtnName(pairs);
@@ -3653,7 +3677,9 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3653
3677
  } else {
3654
3678
  // 通常の指定方法(例:|scroll8i=Cross::1,1,1,-1,-1,-1,1,1/Split::1,1,1,1,-1,-1,-1,-1|)から取り込み
3655
3679
  const tmpParamPair = pairs.split(`::`);
3656
- g_keyObj[pairName][tmpParamPair[0]] = tmpParamPair[1].split(`,`).map(n => parseInt(n, 10));
3680
+ g_keyObj[pairName][tmpParamPair[0]] =
3681
+ makeBaseArray(tmpParamPair[1].split(`,`).map(n => parseInt(n, 10)),
3682
+ g_keyObj[`${g_keyObj.defaultProp}${_key}_${k + dfPtn}`].length, _defaultVal);
3657
3683
  }
3658
3684
  });
3659
3685
  }
@@ -3668,7 +3694,7 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3668
3694
  // キーパターンの追記 (appendX)
3669
3695
  if (setBoolVal(_dosObj[`append${newKey}`])) {
3670
3696
  for (let j = 0; ; j++) {
3671
- if (g_keyObj[`chara${newKey}_${j}`] === undefined) {
3697
+ if (g_keyObj[`${g_keyObj.defaultProp}${newKey}_${j}`] === undefined) {
3672
3698
  break;
3673
3699
  }
3674
3700
  g_keyObj.dfPtnNum++;
@@ -3682,8 +3708,11 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3682
3708
  // キーの最小横幅 (minWidthX)
3683
3709
  g_keyObj[`minWidth${newKey}`] = _dosObj[`minWidth${newKey}`] ?? g_keyObj[`minWidth${newKey}`] ?? g_keyObj.minWidthDefault;
3684
3710
 
3711
+ // キーコンフィグ (keyCtrlX_Y)
3712
+ g_keyObj.minPatterns = newKeyMultiParam(newKey, `keyCtrl`, toKeyCtrlArray, { errCd: `E_0104`, baseCopyFlg: true });
3713
+
3685
3714
  // 読込変数の接頭辞 (charaX_Y)
3686
- g_keyObj.minPatterns = newKeyMultiParam(newKey, `chara`, toString, { errCd: `E_0102` });
3715
+ newKeyMultiParam(newKey, `chara`, toString);
3687
3716
 
3688
3717
  // 矢印色パターン (colorX_Y)
3689
3718
  newKeyTripleParam(newKey, `color`);
@@ -3691,9 +3720,6 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3691
3720
  // 矢印の回転量指定、キャラクタパターン (stepRtnX_Y)
3692
3721
  newKeyTripleParam(newKey, `stepRtn`);
3693
3722
 
3694
- // キーコンフィグ (keyCtrlX_Y)
3695
- newKeyMultiParam(newKey, `keyCtrl`, toKeyCtrlArray, { errCd: `E_0104`, baseCopyFlg: true });
3696
-
3697
3723
  // ステップゾーン位置 (posX_Y)
3698
3724
  newKeyMultiParam(newKey, `pos`, toFloat);
3699
3725
 
@@ -3718,7 +3744,7 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3718
3744
  }
3719
3745
  }
3720
3746
  }
3721
- // posX_Y, divX_Y, divMaxX_Yが未指定の場合はcharaX_Yを元に適用
3747
+ // charaX_Y, posX_Y, keyGroupX_Y, divX_Y, divMaxX_Yが未指定の場合はkeyCtrlX_Yを元に適用
3722
3748
  for (let k = 0; k < g_keyObj.minPatterns; k++) {
3723
3749
  setKeyDfVal(`${newKey}_${k + dfPtnNum}`);
3724
3750
  }
@@ -3761,9 +3787,11 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3761
3787
  * @param {string} _ptnName
3762
3788
  */
3763
3789
  const setKeyDfVal = _ptnName => {
3764
- if (g_keyObj[`pos${_ptnName}`] === undefined) {
3765
- g_keyObj[`pos${_ptnName}`] = [...Array(g_keyObj[`chara${_ptnName}`].length).keys()].map(i => i);
3766
- }
3790
+ const baseLength = g_keyObj[`${g_keyObj.defaultProp}${_ptnName}`].length;
3791
+ g_keyObj[`chara${_ptnName}`] = padArray(g_keyObj[`chara${_ptnName}`], [...Array(baseLength).keys()].map(i => `${i + 1}a`));
3792
+ g_keyObj[`pos${_ptnName}`] = padArray(g_keyObj[`pos${_ptnName}`], [...Array(baseLength).keys()].map(i => i));
3793
+ g_keyObj[`keyGroup${_ptnName}`] = padArray(g_keyObj[`keyGroup${_ptnName}`], [...Array(baseLength)].fill([`0`]));
3794
+
3767
3795
  if (g_keyObj[`div${_ptnName}`] === undefined) {
3768
3796
  g_keyObj[`div${_ptnName}`] = Math.max(...g_keyObj[`pos${_ptnName}`]) + 1;
3769
3797
  }
@@ -3923,7 +3951,7 @@ const titleInit = _ => {
3923
3951
  const versionName = `&copy; 2018-${g_revisedDate.slice(0, 4)} ティックル, CW ${g_version}${g_alphaVersion}${customVersion}${releaseDate}`;
3924
3952
 
3925
3953
  let reloadFlg = false;
3926
- const getLinkSiz = _name => getFontSize(_name, g_sWidth / 2 - 20, getBasicFont(), C_LBL_LNKSIZE, 12);
3954
+ const getLinkSiz = _name => getFontSize(_name, g_sWidth / 2 - 20, getBasicFont(), g_limitObj.lnkSiz, 12);
3927
3955
 
3928
3956
  /**
3929
3957
  * クレジット用リンク作成
@@ -3941,7 +3969,7 @@ const titleInit = _ => {
3941
3969
 
3942
3970
  // Click Here
3943
3971
  createCss2Button(`btnStart`, g_lblNameObj.clickHere, _ => clearTimeout(g_timeoutEvtTitleId), {
3944
- w: g_sWidth, siz: C_LBL_TITLESIZE, resetFunc: _ => optionInit(),
3972
+ w: g_sWidth, siz: g_limitObj.titleSiz, resetFunc: _ => optionInit(),
3945
3973
  }, g_cssObj.button_Start),
3946
3974
 
3947
3975
  // Reset
@@ -4115,7 +4143,7 @@ const setWindowStyle = (_text, _bkColor, _textColor, _align = C_ALIGN_LEFT) => {
4115
4143
 
4116
4144
  // ウィンドウ枠の行を取得するために一時的な枠を作成
4117
4145
  const tmplbl = createDivCss2Label(`lblTmpWarning`, _text, {
4118
- x: 0, y: 70, w: g_sWidth, h: 20, siz: C_SIZ_MAIN, lineHeight: `15px`, fontFamily: getBasicFont(),
4146
+ x: 0, y: 70, w: g_sWidth, h: 20, siz: g_limitObj.mainSiz, lineHeight: `15px`, fontFamily: getBasicFont(),
4119
4147
  whiteSpace: `normal`,
4120
4148
  });
4121
4149
  divRoot.appendChild(tmplbl);
@@ -4126,7 +4154,7 @@ const setWindowStyle = (_text, _bkColor, _textColor, _align = C_ALIGN_LEFT) => {
4126
4154
  const warnHeight = Math.min(150, Math.max(range.getClientRects().length,
4127
4155
  _text.split(`<br>`).length + _text.split(`<p>`).length - 1) * 21);
4128
4156
  const lbl = createDivCss2Label(`lblWarning`, _text, {
4129
- x: 0, y: 70, w: g_sWidth, h: warnHeight, siz: C_SIZ_MAIN, backgroundColor: _bkColor,
4157
+ x: 0, y: 70, w: g_sWidth, h: warnHeight, siz: g_limitObj.mainSiz, backgroundColor: _bkColor,
4130
4158
  opacity: 0.9, lineHeight: `15px`, color: _textColor, align: _align, fontFamily: getBasicFont(),
4131
4159
  whiteSpace: `normal`,
4132
4160
  });
@@ -4232,10 +4260,10 @@ const optionInit = _ => {
4232
4260
  const setSpriteList = _settingList => {
4233
4261
  const optionWidth = (g_sWidth - 450) / 2;
4234
4262
  const spriteList = [];
4235
- _settingList.forEach(setting =>
4236
- spriteList[setting[0]] = createEmptySprite(optionsprite, `${setting[0]}Sprite`, {
4237
- x: 25, y: setting[1] * C_LEN_SETLBL_HEIGHT + setting[2] + 20,
4238
- w: optionWidth + setting[3], h: C_LEN_SETLBL_HEIGHT + setting[4],
4263
+ Object.keys(_settingList).forEach(setting =>
4264
+ spriteList[setting] = createEmptySprite(optionsprite, `${setting}Sprite`, {
4265
+ x: 25, y: _settingList[setting].heightPos * g_limitObj.setLblHeight + _settingList[setting].y + 20,
4266
+ w: optionWidth + _settingList[setting].dw, h: g_limitObj.setLblHeight + _settingList[setting].dh,
4239
4267
  }));
4240
4268
  return spriteList;
4241
4269
  };
@@ -4268,23 +4296,8 @@ const createOptionWindow = _sprite => {
4268
4296
  // 各ボタン用のスプライトを作成
4269
4297
  const optionsprite = createOptionSprite(_sprite);
4270
4298
 
4271
- // 設定名、縦位置、縦位置差分、幅差分、高さ差分
4272
- const settingList = [
4273
- [`difficulty`, 0, -5, 0, 10],
4274
- [`speed`, 2, 0, 0, 0],
4275
- [`motion`, 3, 0, 0, 0],
4276
- [`reverse`, 4, 0, 0, 0],
4277
- [`scroll`, 4, 0, 0, 0],
4278
- [`shuffle`, 5.5, 0, 0, 0],
4279
- [`autoPlay`, 6.5, 0, 0, 0],
4280
- [`gauge`, 7.5, 0, 0, 0],
4281
- [`adjustment`, 10.5, 0, 0, 0],
4282
- [`fadein`, 11.5, 0, 0, 0],
4283
- [`volume`, 12.5, 0, 0, 0],
4284
- ];
4285
-
4286
4299
  // 設定毎に個別のスプライトを作成し、その中にラベル・ボタン類を配置
4287
- const spriteList = setSpriteList(settingList);
4300
+ const spriteList = setSpriteList(g_settingPos.option);
4288
4301
 
4289
4302
  // ---------------------------------------------------
4290
4303
  // 難易度 (Difficulty)
@@ -4337,7 +4350,7 @@ const createOptionWindow = _sprite => {
4337
4350
  k++;
4338
4351
  }
4339
4352
  });
4340
- const overlength = pos * C_LEN_SETLBL_HEIGHT - parseInt(difList.style.height);
4353
+ const overlength = pos * g_limitObj.setLblHeight - parseInt(difList.style.height);
4341
4354
  difList.scrollTop = (overlength > 0 ? overlength : 0);
4342
4355
  };
4343
4356
 
@@ -4359,7 +4372,7 @@ const createOptionWindow = _sprite => {
4359
4372
  g_keyObj.prevKey = g_keyObj.currentKey;
4360
4373
  }
4361
4374
  }, {
4362
- x: 430 + _scrollNum * 10, y: 40, w: 20, h: 20, siz: C_SIZ_JDGCNTS,
4375
+ x: 430 + _scrollNum * 10, y: 40, w: 20, h: 20, siz: g_limitObj.jdgCntsSiz,
4363
4376
  }, g_cssObj.button_Mini);
4364
4377
  };
4365
4378
 
@@ -4380,7 +4393,7 @@ const createOptionWindow = _sprite => {
4380
4393
  difCover.appendChild(
4381
4394
  makeDifLblCssButton(`difRandom`, `RANDOM`, 0, _ => {
4382
4395
  nextDifficulty(Math.floor(Math.random() * g_headerObj.keyLabels.length));
4383
- }, { w: C_LEN_DIFCOVER_WIDTH })
4396
+ }, { w: g_limitObj.difCoverWidth })
4384
4397
  );
4385
4398
 
4386
4399
  // 全リスト
@@ -4389,7 +4402,7 @@ const createOptionWindow = _sprite => {
4389
4402
  resetDifWindow();
4390
4403
  g_stateObj.filterKeys = ``;
4391
4404
  createDifWindow();
4392
- }, { w: C_LEN_DIFCOVER_WIDTH, btnStyle: (g_stateObj.filterKeys === `` ? `Setting` : `Default`) })
4405
+ }, { w: g_limitObj.difCoverWidth, btnStyle: (g_stateObj.filterKeys === `` ? `Setting` : `Default`) })
4393
4406
  );
4394
4407
 
4395
4408
  // キー別フィルタボタン作成
@@ -4400,13 +4413,13 @@ const createOptionWindow = _sprite => {
4400
4413
  resetDifWindow();
4401
4414
  g_stateObj.filterKeys = targetKey;
4402
4415
  createDifWindow(targetKey);
4403
- }, { w: C_LEN_DIFCOVER_WIDTH, btnStyle: (g_stateObj.filterKeys === targetKey ? `Setting` : `Default`) })
4416
+ }, { w: g_limitObj.difCoverWidth, btnStyle: (g_stateObj.filterKeys === targetKey ? `Setting` : `Default`) })
4404
4417
  );
4405
4418
  if (g_stateObj.filterKeys === targetKey) {
4406
4419
  pos = m + 9;
4407
4420
  }
4408
4421
  });
4409
- const overlength = pos * C_LEN_SETLBL_HEIGHT - parseInt(difCover.style.height);
4422
+ const overlength = pos * g_limitObj.setLblHeight - parseInt(difCover.style.height);
4410
4423
  difCover.scrollTop = (overlength > 0 ? overlength : 0);
4411
4424
 
4412
4425
  multiAppend(optionsprite, makeDifBtn(-1), makeDifBtn());
@@ -4425,7 +4438,7 @@ const createOptionWindow = _sprite => {
4425
4438
  }
4426
4439
  };
4427
4440
  const lnkDifficulty = makeSettingLblCssButton(`lnkDifficulty`, ``, 0, _ => changeDifficulty(), {
4428
- y: -10, h: C_LEN_SETLBL_HEIGHT + 10, cxtFunc: _ => changeDifficulty(-1),
4441
+ y: -10, h: g_limitObj.setLblHeight + 10, cxtFunc: _ => changeDifficulty(-1),
4429
4442
  });
4430
4443
 
4431
4444
  // 譜面選択ボタン(メイン、右回し、左回し)
@@ -4465,8 +4478,8 @@ const createOptionWindow = _sprite => {
4465
4478
  const bkColor = window.getComputedStyle(textBaseObj, ``).backgroundColor;
4466
4479
 
4467
4480
  graphObj.id = `graph${_name}`;
4468
- graphObj.width = C_LEN_GRAPH_WIDTH;
4469
- graphObj.height = C_LEN_GRAPH_HEIGHT;
4481
+ graphObj.width = g_limitObj.graphWidth;
4482
+ graphObj.height = g_limitObj.graphHeight;
4470
4483
  graphObj.style.left = `125px`;
4471
4484
  graphObj.style.top = `0px`;
4472
4485
  graphObj.style.position = `absolute`;
@@ -4482,7 +4495,7 @@ const createOptionWindow = _sprite => {
4482
4495
  if (g_headerObj.scoreDetailUse) {
4483
4496
  spriteList.speed.appendChild(
4484
4497
  createCss2Button(`btnGraph`, `i`, _ => true, {
4485
- x: -25, y: -60, w: 30, h: 30, siz: C_SIZ_JDGCHARA, title: g_msgObj.graph,
4498
+ x: -25, y: -60, w: 30, h: 30, siz: g_limitObj.jdgCharaSiz, title: g_msgObj.graph,
4486
4499
  resetFunc: _ => setScoreDetail(), cxtFunc: _ => setScoreDetail(),
4487
4500
  }, g_cssObj.button_Mini)
4488
4501
  );
@@ -4520,7 +4533,7 @@ const createOptionWindow = _sprite => {
4520
4533
  );
4521
4534
  g_settings.scoreDetails.forEach((sd, j) => {
4522
4535
  scoreDetail.appendChild(
4523
- makeDifLblCssButton(`lnk${sd}G`, getStgDetailName(sd), j, _ => changeScoreDetail(j), { w: C_LEN_DIFCOVER_WIDTH, btnStyle: (g_stateObj.scoreDetail === sd ? `Setting` : `Default`) })
4536
+ makeDifLblCssButton(`lnk${sd}G`, getStgDetailName(sd), j, _ => changeScoreDetail(j), { w: g_limitObj.difCoverWidth, btnStyle: (g_stateObj.scoreDetail === sd ? `Setting` : `Default`) })
4524
4537
  );
4525
4538
  createScText(document.getElementById(`lnk${sd}G`), `${sd}G`, { targetLabel: `lnk${sd}G`, x: -10 });
4526
4539
  });
@@ -4570,8 +4583,8 @@ const createOptionWindow = _sprite => {
4570
4583
  const startFrame = g_detailObj.startFrame[_scoreId];
4571
4584
  const playingFrame = g_detailObj.playingFrameWithBlank[_scoreId];
4572
4585
  const speedObj = {
4573
- speed: { frame: [0], speed: [1], cnt: 0, strokeColor: C_CLR_SPEEDGRAPH_SPEED },
4574
- boost: { frame: [0], speed: [1], cnt: 0, strokeColor: C_CLR_SPEEDGRAPH_BOOST }
4586
+ speed: { frame: [0], speed: [1], cnt: 0, strokeColor: g_graphColorObj.speed },
4587
+ boost: { frame: [0], speed: [1], cnt: 0, strokeColor: g_graphColorObj.boost }
4575
4588
  };
4576
4589
 
4577
4590
  Object.keys(speedObj).forEach(speedType => {
@@ -4601,7 +4614,7 @@ const createOptionWindow = _sprite => {
4601
4614
  let preY;
4602
4615
 
4603
4616
  for (let i = 0; i < speedObj[speedType].frame.length; i++) {
4604
- const x = speedObj[speedType].frame[i] * (C_LEN_GRAPH_WIDTH - 30) / playingFrame + 30;
4617
+ const x = speedObj[speedType].frame[i] * (g_limitObj.graphWidth - 30) / playingFrame + 30;
4605
4618
  const y = (speedObj[speedType].speed[i] - 1) * -90 + 105;
4606
4619
 
4607
4620
  context.lineTo(x, preY);
@@ -4618,7 +4631,7 @@ const createOptionWindow = _sprite => {
4618
4631
  context.moveTo(lineX, 215);
4619
4632
  context.lineTo(lineX + 30, 215);
4620
4633
  context.stroke();
4621
- context.font = `${C_SIZ_DIFSELECTOR}px ${getBasicFont()}`;
4634
+ context.font = `${g_limitObj.difSelectorSiz}px ${getBasicFont()}`;
4622
4635
  context.fillText(speedType, lineX + 35, 218);
4623
4636
 
4624
4637
  updateScoreDetailLabel(`Speed`, `${speedType}S`, speedObj[speedType].cnt, j, g_lblNameObj[`s_${speedType}`]);
@@ -4656,7 +4669,7 @@ const createOptionWindow = _sprite => {
4656
4669
  context.moveTo(lineX, 215);
4657
4670
  context.lineTo(lineX + 20, 215);
4658
4671
  context.stroke();
4659
- context.font = `${C_SIZ_DIFSELECTOR}px ${getBasicFont()}`;
4672
+ context.font = `${g_limitObj.difSelectorSiz}px ${getBasicFont()}`;
4660
4673
  context.fillText(lineNames[j], lineX + 20, 218);
4661
4674
  });
4662
4675
 
@@ -4679,7 +4692,7 @@ const createOptionWindow = _sprite => {
4679
4692
  const baseLabel = (_bLabel, _bLabelname, _bAlign) =>
4680
4693
  document.querySelector(`#detail${_name}`).appendChild(
4681
4694
  createDivCss2Label(`${_bLabel}`, `${_bLabelname}`, {
4682
- x: 10, y: 105 + _pos * 20, w: 100, h: 20, siz: C_SIZ_DIFSELECTOR, align: _bAlign,
4695
+ x: 10, y: 105 + _pos * 20, w: 100, h: 20, siz: g_limitObj.difSelectorSiz, align: _bAlign,
4683
4696
  })
4684
4697
  );
4685
4698
  if (document.querySelector(`#data${_label}`) === null) {
@@ -4696,7 +4709,7 @@ const createOptionWindow = _sprite => {
4696
4709
  * @param {number} _resolution
4697
4710
  */
4698
4711
  const drawBaseLine = (_context, _resolution = 10) => {
4699
- _context.clearRect(0, 0, C_LEN_GRAPH_WIDTH, C_LEN_GRAPH_HEIGHT);
4712
+ _context.clearRect(0, 0, g_limitObj.graphWidth, g_limitObj.graphHeight);
4700
4713
 
4701
4714
  for (let j = 0; j <= 2 * _resolution; j += 5) {
4702
4715
  drawLine(_context, j / _resolution, `main`, 2);
@@ -4717,7 +4730,7 @@ const createOptionWindow = _sprite => {
4717
4730
  const lineY = (_y - 1) * -90 + 105;
4718
4731
  _context.beginPath();
4719
4732
  _context.moveTo(30, lineY);
4720
- _context.lineTo(C_LEN_GRAPH_WIDTH, lineY);
4733
+ _context.lineTo(g_limitObj.graphWidth, lineY);
4721
4734
  _context.lineWidth = 1;
4722
4735
 
4723
4736
  if (_lineType === `main`) {
@@ -4747,7 +4760,7 @@ const createOptionWindow = _sprite => {
4747
4760
  * @param {string} _data
4748
4761
  * @param {object} _obj
4749
4762
  */
4750
- const makeDifInfoLabel = (_lbl, _data, { x = 130, y = 25, w = 125, h = 35, siz = C_SIZ_DIFSELECTOR, ...rest } = {}) =>
4763
+ const makeDifInfoLabel = (_lbl, _data, { x = 130, y = 25, w = 125, h = 35, siz = g_limitObj.difSelectorSiz, ...rest } = {}) =>
4751
4764
  createDivCss2Label(_lbl, _data, { x, y, w, h, siz, align: C_ALIGN_LEFT, ...rest });
4752
4765
 
4753
4766
  let printData = ``;
@@ -4811,7 +4824,7 @@ const createOptionWindow = _sprite => {
4811
4824
  dataDouji.textContent = g_detailObj.toolDif[_scoreId].douji;
4812
4825
  dataTate.textContent = g_detailObj.toolDif[_scoreId].tate;
4813
4826
  lblArrowInfo2.innerHTML = g_lblNameObj.s_linecnts.split(`{0}`).join(g_detailObj.toolDif[_scoreId].push3cnt);
4814
- dataArrowInfo.innerHTML = `${arrowCnts + frzCnts} <span style="font-size:${C_SIZ_DIFSELECTOR}px;">(${arrowCnts} + ${frzCnts})</span>`;
4827
+ dataArrowInfo.innerHTML = `${arrowCnts + frzCnts} <span style="font-size:${g_limitObj.difSelectorSiz}px;">(${arrowCnts} + ${frzCnts})</span>`;
4815
4828
  dataArrowInfo2.innerHTML = `<br>(${g_detailObj.arrowCnt[_scoreId]})<br><br>
4816
4829
  (${g_detailObj.frzCnt[_scoreId]})<br><br>
4817
4830
  ${push3CntStr}`.split(`,`).join(`/`);
@@ -5233,7 +5246,7 @@ const createOptionWindow = _sprite => {
5233
5246
  // 譜面名設定 (Difficulty)
5234
5247
  const difWidth = parseFloat(lnkDifficulty.style.width);
5235
5248
  const difNames = [`${getKeyName(g_keyObj.currentKey)} ${getStgDetailName('key')} / ${g_headerObj.difLabels[g_stateObj.scoreId]}`];
5236
- lnkDifficulty.style.fontSize = `${getFontSize(difNames[0], difWidth, getBasicFont(), C_SIZ_SETLBL)}px`;
5249
+ lnkDifficulty.style.fontSize = `${getFontSize(difNames[0], difWidth, getBasicFont(), g_limitObj.setLblSiz)}px`;
5237
5250
 
5238
5251
  if (g_headerObj.makerView) {
5239
5252
  difNames.push(`(${g_headerObj.creatorNames[g_stateObj.scoreId]})`);
@@ -5347,8 +5360,8 @@ const createGeneralSetting = (_obj, _settingName, { unitName = ``,
5347
5360
  // 右回し・左回しボタン(最内側)
5348
5361
  if (skipTerms[2] > 1) {
5349
5362
  multiAppend(_obj,
5350
- makeMiniCssButton(linkId, `RRR`, 0, _ => setSetting(skipTerms[2], _settingName, unitName, roundNum), { dw: -C_LEN_SETMINI_WIDTH / 2 }),
5351
- makeMiniCssButton(linkId, `LLL`, 0, _ => setSetting(skipTerms[2] * (-1), _settingName, unitName, roundNum), { dw: -C_LEN_SETMINI_WIDTH / 2 }),
5363
+ makeMiniCssButton(linkId, `RRR`, 0, _ => setSetting(skipTerms[2], _settingName, unitName, roundNum), { dw: -g_limitObj.setMiniWidth / 2 }),
5364
+ makeMiniCssButton(linkId, `LLL`, 0, _ => setSetting(skipTerms[2] * (-1), _settingName, unitName, roundNum), { dw: -g_limitObj.setMiniWidth / 2 }),
5352
5365
  );
5353
5366
  }
5354
5367
 
@@ -5432,7 +5445,7 @@ const setSetting = (_scrollNum, _settingName, _unitName = ``, _roundNum = 0) =>
5432
5445
  */
5433
5446
  const makeDisabledLabel = (_id, _heightPos, _defaultStr) => {
5434
5447
  return createDivCss2Label(_id, _defaultStr, {
5435
- x: C_LEN_SETLBL_LEFT, y: C_LEN_SETLBL_HEIGHT * _heightPos,
5448
+ x: g_limitObj.setLblLeft, y: g_limitObj.setLblHeight * _heightPos,
5436
5449
  }, g_cssObj.settings_Disabled);
5437
5450
  };
5438
5451
 
@@ -5466,7 +5479,7 @@ const setReverseDefault = _ => {
5466
5479
  const getKeyCtrl = (_localStorage, _extraKeyName = ``) => {
5467
5480
  const baseKeyCtrlPtn = _localStorage[`keyCtrlPtn${_extraKeyName}`];
5468
5481
  const basePtn = `${g_keyObj.currentKey}_${baseKeyCtrlPtn}`;
5469
- const baseKeyNum = g_keyObj[`chara${basePtn}`].length;
5482
+ const baseKeyNum = g_keyObj[`${g_keyObj.defaultProp}${basePtn}`].length;
5470
5483
 
5471
5484
  if (_localStorage[`keyCtrl${_extraKeyName}`] !== undefined && _localStorage[`keyCtrl${_extraKeyName}`][0].length > 0) {
5472
5485
  const prevPtn = g_keyObj.currentPtn;
@@ -5515,11 +5528,11 @@ const getKeyCtrl = (_localStorage, _extraKeyName = ``) => {
5515
5528
  */
5516
5529
  const makeSettingLblCssButton = (_id, _name, _heightPos, _func, { x, y, w, h, siz, cxtFunc = _ => true, ...rest } = {}, ..._classes) => {
5517
5530
  const tmpObj = {
5518
- x: x !== undefined ? x : C_LEN_SETLBL_LEFT,
5519
- y: y !== undefined ? y : C_LEN_SETLBL_HEIGHT * _heightPos,
5520
- w: w !== undefined ? w : C_LEN_SETLBL_WIDTH,
5521
- h: h !== undefined ? h : C_LEN_SETLBL_HEIGHT,
5522
- siz: siz !== undefined ? siz : C_SIZ_SETLBL,
5531
+ x: x !== undefined ? x : g_limitObj.setLblLeft,
5532
+ y: y !== undefined ? y : g_limitObj.setLblHeight * _heightPos,
5533
+ w: w !== undefined ? w : g_limitObj.setLblWidth,
5534
+ h: h !== undefined ? h : g_limitObj.setLblHeight,
5535
+ siz: siz !== undefined ? siz : g_limitObj.setLblSiz,
5523
5536
  cxtFunc: cxtFunc !== undefined ? cxtFunc : _ => true,
5524
5537
  };
5525
5538
  return createCss2Button(_id, _name, _func, { ...tmpObj, ...rest }, g_cssObj.button_Default, ..._classes);
@@ -5532,11 +5545,11 @@ const makeSettingLblCssButton = (_id, _name, _heightPos, _func, { x, y, w, h, si
5532
5545
  * @param {number} _heightPos 上からの配置順
5533
5546
  * @param {function} _func
5534
5547
  */
5535
- const makeDifLblCssButton = (_id, _name, _heightPos, _func, { x = 0, w = C_LEN_DIFSELECTOR_WIDTH, btnStyle = `Default` } = {}) => {
5548
+ const makeDifLblCssButton = (_id, _name, _heightPos, _func, { x = 0, w = g_limitObj.difSelectorWidth, btnStyle = `Default` } = {}) => {
5536
5549
  return createCss2Button(_id, _name, _func, {
5537
- x: x, y: C_LEN_SETLBL_HEIGHT * _heightPos,
5538
- w: w, h: C_LEN_SETLBL_HEIGHT,
5539
- siz: C_SIZ_DIFSELECTOR,
5550
+ x: x, y: g_limitObj.setLblHeight * _heightPos,
5551
+ w: w, h: g_limitObj.setLblHeight,
5552
+ siz: g_limitObj.difSelectorSiz,
5540
5553
  borderStyle: `solid`,
5541
5554
  }, g_cssObj[`button_${btnStyle}`], g_cssObj.button_ON);
5542
5555
  };
@@ -5551,8 +5564,8 @@ const makeDifLblCssButton = (_id, _name, _heightPos, _func, { x = 0, w = C_LEN_D
5551
5564
  const makeMiniCssButton = (_id, _directionFlg, _heightPos, _func, { dx = 0, dy = 0, dw = 0, dh = 0, dsiz = 0, visibility = `visible` } = {}) => {
5552
5565
  return createCss2Button(`${_id}${_directionFlg}`, g_settingBtnObj.chara[_directionFlg], _func, {
5553
5566
  x: g_settingBtnObj.pos[_directionFlg] + dx,
5554
- y: C_LEN_SETLBL_HEIGHT * _heightPos + dy,
5555
- w: C_LEN_SETMINI_WIDTH + dw, h: C_LEN_SETLBL_HEIGHT + dh, siz: C_SIZ_SETLBL + dsiz,
5567
+ y: g_limitObj.setLblHeight * _heightPos + dy,
5568
+ w: g_limitObj.setMiniWidth + dw, h: g_limitObj.setLblHeight + dh, siz: g_limitObj.setLblSiz + dsiz,
5556
5569
  visibility: visibility
5557
5570
  }, g_cssObj.button_Mini);
5558
5571
  };
@@ -5639,8 +5652,8 @@ const createSettingsDisplayWindow = _sprite => {
5639
5652
  */
5640
5653
  const makeDisabledDisplayLabel = (_id, _heightPos, _widthPos, _defaultStr, _flg) => {
5641
5654
  return createDivCss2Label(_id, _defaultStr, {
5642
- x: 30 + 180 * _widthPos, y: 3 + C_LEN_SETLBL_HEIGHT * _heightPos,
5643
- w: 170, siz: C_SIZ_DIFSELECTOR,
5655
+ x: 30 + 180 * _widthPos, y: 3 + g_limitObj.setLblHeight * _heightPos,
5656
+ w: 170, siz: g_limitObj.difSelectorSiz,
5644
5657
  }, g_cssObj[`button_Disabled${flg}`]);
5645
5658
  };
5646
5659
 
@@ -5672,16 +5685,9 @@ const createSettingsDisplayWindow = _sprite => {
5672
5685
  // 各ボタン用のスプライトを作成
5673
5686
  createOptionSprite(_sprite);
5674
5687
 
5675
- // 設定名、縦位置、縦位置差分、幅差分、高さ差分
5676
- const settingList = [
5677
- [`appearance`, 7.4, 10, 0, 0],
5678
- [`opacity`, 9, 10, 0, 0],
5679
- [`hitPosition`, 10, 10, 0, 0],
5680
- ];
5681
-
5682
5688
  // 設定毎に個別のスプライトを作成し、その中にラベル・ボタン類を配置
5683
5689
  const displaySprite = createEmptySprite(optionsprite, `displaySprite`, g_windowObj.displaySprite);
5684
- const spriteList = setSpriteList(settingList);
5690
+ const spriteList = setSpriteList(g_settingPos.settingsDisplay);
5685
5691
 
5686
5692
  _sprite.appendChild(createDivCss2Label(`sdDesc`, g_lblNameObj.sdDesc, g_lblPosObj.sdDesc));
5687
5693
  g_displays.forEach((name, j) => makeDisplayButton(name, j % 7, Math.floor(j / 7)));
@@ -5963,7 +5969,7 @@ const keyConfigInit = (_kcType = g_kcType) => {
5963
5969
  setKeyConfigCursor();
5964
5970
  }, {
5965
5971
  x: keyconX, y: 50 + C_KYC_REPHEIGHT * k + keyconY,
5966
- w: C_ARW_WIDTH, h: C_KYC_REPHEIGHT, siz: C_SIZ_JDGCNTS,
5972
+ w: C_ARW_WIDTH, h: C_KYC_REPHEIGHT, siz: g_limitObj.jdgCntsSiz,
5967
5973
  }, g_cssObj.button_Default_NoColor, g_cssObj.title_base)
5968
5974
  );
5969
5975
 
@@ -6057,7 +6063,7 @@ const keyConfigInit = (_kcType = g_kcType) => {
6057
6063
  * @returns ボタン
6058
6064
  */
6059
6065
  const makeKCButton = (_id, _text, _func, { x = g_sWidth * 5 / 6 - 20, y = 15, w = g_sWidth / 6, h = 18,
6060
- siz = C_SIZ_JDGCNTS, borderStyle = `solid`, cxtFunc, ...rest } = {}, _mainClass = g_cssObj.button_RevOFF, ..._classes) => {
6066
+ siz = g_limitObj.jdgCntsSiz, borderStyle = `solid`, cxtFunc, ...rest } = {}, _mainClass = g_cssObj.button_RevOFF, ..._classes) => {
6061
6067
  return makeSettingLblCssButton(_id, getStgDetailName(_text), 0, _func, { x, y, w, h, siz, cxtFunc, borderStyle, ...rest }, _mainClass, ..._classes);
6062
6068
  };
6063
6069
 
@@ -6069,7 +6075,7 @@ const keyConfigInit = (_kcType = g_kcType) => {
6069
6075
  * @param {*} object (x, y, w, h, siz)
6070
6076
  * @returns
6071
6077
  */
6072
- const makeMiniKCButton = (_id, _directionFlg, _func, { x = g_sWidth * 5 / 6 - 30, y = 15, w = 15, h = 20, siz = C_SIZ_MAIN } = {}) => {
6078
+ const makeMiniKCButton = (_id, _directionFlg, _func, { x = g_sWidth * 5 / 6 - 30, y = 15, w = 15, h = 20, siz = g_limitObj.mainSiz } = {}) => {
6073
6079
  return createCss2Button(`${_id}${_directionFlg}`, g_settingBtnObj.chara[_directionFlg], _func,
6074
6080
  { x, y, w, h, siz }, g_cssObj.button_Mini);
6075
6081
  };
@@ -6546,7 +6552,7 @@ const getShadowColor = (_colorPos, _arrowColor) => g_headerObj.setShadowColor[_c
6546
6552
  */
6547
6553
  const getKeyInfo = _ => {
6548
6554
  const keyCtrlPtn = `${g_keyObj.currentKey}_${g_keyObj.currentPtn}`;
6549
- const keyNum = g_keyObj[`chara${keyCtrlPtn}`].length;
6555
+ const keyNum = g_keyObj[`${g_keyObj.defaultProp}${keyCtrlPtn}`].length;
6550
6556
  const posMax = (g_keyObj[`divMax${keyCtrlPtn}`] !== undefined ?
6551
6557
  g_keyObj[`divMax${keyCtrlPtn}`] : Math.max(...g_keyObj[`pos${keyCtrlPtn}`]) + 1);
6552
6558
  const divideCnt = g_keyObj[`div${keyCtrlPtn}`] - 1;
@@ -7097,7 +7103,7 @@ const scoreConvert = (_dosObj, _scoreId, _preblankFrame, _dummyNo = ``,
7097
7103
  const obj = {};
7098
7104
 
7099
7105
  const scoreIdHeader = setScoreIdHeader(_scoreId, g_stateObj.scoreLockFlg);
7100
- const keyNum = g_keyObj[`chara${_keyCtrlPtn}`].length;
7106
+ const keyNum = g_keyObj[`${g_keyObj.defaultProp}${_keyCtrlPtn}`].length;
7101
7107
  obj.arrowData = [];
7102
7108
  obj.frzData = [];
7103
7109
  obj.dummyArrowData = [];
@@ -7164,10 +7170,11 @@ const scoreConvert = (_dosObj, _scoreId, _preblankFrame, _dummyNo = ``,
7164
7170
  * @param {string} _footer
7165
7171
  */
7166
7172
  const setSpeedData = (_header, _scoreNo, _footer = `_data`) => {
7173
+ const dosSpeedData = getRefData(_header, `${_scoreNo}${_footer}`);
7167
7174
  const speedData = [];
7168
7175
 
7169
- if (hasVal(_dosObj[`${_header}${_scoreNo}${_footer}`]) && g_stateObj.d_speed === C_FLG_ON) {
7170
- const tmpArrayData = splitLF(_dosObj[`${_header}${_scoreNo}${_footer}`]);
7176
+ if (hasVal(dosSpeedData) && g_stateObj.d_speed === C_FLG_ON) {
7177
+ const tmpArrayData = splitLF(dosSpeedData);
7171
7178
 
7172
7179
  tmpArrayData.filter(data => hasVal(data)).forEach(tmpData => {
7173
7180
  const tmpSpeedData = tmpData.split(`,`);
@@ -7206,11 +7213,12 @@ const scoreConvert = (_dosObj, _scoreId, _preblankFrame, _dummyNo = ``,
7206
7213
  * @param {number} _scoreNo
7207
7214
  */
7208
7215
  const setColorData = (_header, _scoreNo) => {
7216
+ const dosColorData = getRefData(_header, `${_scoreNo}_data`);
7209
7217
  const colorData = [];
7210
7218
  const allFlg = (_header.charAt(0) === `a`);
7211
7219
 
7212
- if (hasVal(_dosObj[`${_header}${_scoreNo}_data`]) && g_stateObj.d_color === C_FLG_ON) {
7213
- const tmpArrayData = splitLF(_dosObj[`${_header}${_scoreNo}_data`]);
7220
+ if (hasVal(dosColorData) && g_stateObj.d_color === C_FLG_ON) {
7221
+ const tmpArrayData = splitLF(dosColorData);
7214
7222
 
7215
7223
  tmpArrayData.filter(data => hasVal(data)).forEach(tmpData => {
7216
7224
  const tmpColorData = tmpData.split(`,`);
@@ -7239,7 +7247,7 @@ const scoreConvert = (_dosObj, _scoreId, _preblankFrame, _dummyNo = ``,
7239
7247
  * @param {number} _scoreNo
7240
7248
  */
7241
7249
  const setCssMotionData = (_header, _scoreNo) => {
7242
- const dosCssMotionData = _dosObj[`${_header}Motion${_scoreNo}_data`] || _dosObj[`${_header}Motion_data`];
7250
+ const dosCssMotionData = getRefData(`${_header}Motion`, `${_scoreNo}_data`) || _dosObj[`${_header}Motion_data`];
7243
7251
  const cssMotionData = [];
7244
7252
 
7245
7253
  if (hasVal(dosCssMotionData) && g_stateObj.d_arroweffect === C_FLG_ON) {
@@ -7265,7 +7273,7 @@ const scoreConvert = (_dosObj, _scoreId, _preblankFrame, _dummyNo = ``,
7265
7273
  * @param {number} _scoreNo
7266
7274
  */
7267
7275
  const setScrollchData = (_scoreNo) => {
7268
- const dosScrollchData = _dosObj[`scrollch${_scoreNo}_data`] || _dosObj.scrollch_data;
7276
+ const dosScrollchData = getRefData(`scrollch`, `${_scoreNo}_data`) || _dosObj.scrollch_data;
7269
7277
  const scrollchData = [];
7270
7278
 
7271
7279
  if (hasVal(dosScrollchData)) {
@@ -7285,6 +7293,18 @@ const scoreConvert = (_dosObj, _scoreId, _preblankFrame, _dummyNo = ``,
7285
7293
  return [];
7286
7294
  };
7287
7295
 
7296
+ /**
7297
+ * 譜面データに別の関連名が含まれていた場合、関連名の変数を返す
7298
+ * 例) |backA2_data=back_data| -> back_dataで定義された値を使用
7299
+ * @param {string} _header
7300
+ * @param {string} _dataName
7301
+ * @returns
7302
+ */
7303
+ const getRefData = (_header, _dataName) => {
7304
+ const data = _dosObj[`${_header}${_dataName}`];
7305
+ return data?.startsWith(_header) ? _dosObj[data] : data;
7306
+ }
7307
+
7288
7308
  /**
7289
7309
  * 譜面データの優先順配列の取得
7290
7310
  * @param {string} _header
@@ -7293,10 +7313,10 @@ const scoreConvert = (_dosObj, _scoreId, _preblankFrame, _dummyNo = ``,
7293
7313
  * @returns
7294
7314
  */
7295
7315
  const getPriorityList = (_header, _type, _scoreNo) => [
7296
- _dosObj[`${_header}${_type}${g_localeObj.val}${_scoreNo}_data`],
7297
- _dosObj[`${_header}${_type}${g_localeObj.val}_data`],
7298
- _dosObj[`${_header}${_type}${_scoreNo}_data`],
7299
- _dosObj[`${_header}${_type}_data`]
7316
+ getRefData(_header, `${_type}${g_localeObj.val}${_scoreNo}_data`),
7317
+ getRefData(_header, `${_type}${g_localeObj.val}_data`),
7318
+ getRefData(_header, `${_type}${_scoreNo}_data`),
7319
+ getRefData(_header, `${_type}_data`)
7300
7320
  ];
7301
7321
 
7302
7322
  /**
@@ -7425,16 +7445,17 @@ const scoreConvert = (_dosObj, _scoreId, _preblankFrame, _dummyNo = ``,
7425
7445
 
7426
7446
  /**
7427
7447
  * リザルトモーションデータ(結果画面用背景・マスクデータ)の分解
7428
- * @param {string} _header
7429
- * @param {string} _scoreNo
7430
- * @param {string} _defaultHeader
7448
+ * @param {string} _header 背景、マスク (back, mask)
7449
+ * @param {string} _resultType リザルトモーションの種類 (result, failedB, failedS)
7450
+ * @param {string} _scoreNo 譜面番号
7451
+ * @param {string} _defaultType _resultTypeが無いときの代替名
7431
7452
  */
7432
- const makeBackgroundResultData = (_header, _scoreNo, _defaultHeader = ``) => {
7453
+ const makeBackgroundResultData = (_header, _resultType, _scoreNo, _defaultType = ``) => {
7433
7454
  const dataList = [];
7434
- const addResultDataList = _headerType => dataList.push(...getPriorityList(``, _headerType, _scoreNo));
7435
- addResultDataList(_header);
7436
- if (_defaultHeader !== ``) {
7437
- addResultDataList(_defaultHeader);
7455
+ const addDataList = (_type = ``) => dataList.push(...getPriorityList(_header, _type, _scoreNo));
7456
+ addDataList(_resultType);
7457
+ if (_defaultType !== ``) {
7458
+ addDataList(_defaultType);
7438
7459
  }
7439
7460
 
7440
7461
  const data = dataList.find((v) => v !== undefined);
@@ -7512,17 +7533,17 @@ const scoreConvert = (_dosObj, _scoreId, _preblankFrame, _dummyNo = ``,
7512
7533
  } else {
7513
7534
  g_animationData.forEach(sprite => {
7514
7535
  [g_headerObj[`${sprite}ResultData`], g_headerObj[`${sprite}ResultMaxDepth`]] =
7515
- makeBackgroundResultData(`${sprite}result`, scoreIdHeader);
7536
+ makeBackgroundResultData(sprite, `result`, scoreIdHeader);
7516
7537
  [g_headerObj[`${sprite}FailedData`], g_headerObj[`${sprite}FailedMaxDepth`]] =
7517
- makeBackgroundResultData(`${sprite}failed${g_stateObj.lifeMode.slice(0, 1)}`, scoreIdHeader, `${sprite}result`);
7538
+ makeBackgroundResultData(sprite, `failed${g_stateObj.lifeMode.slice(0, 1)}`, scoreIdHeader, `result`);
7518
7539
  });
7519
7540
  }
7520
7541
 
7521
7542
  // キー変化定義
7522
7543
  obj.keychFrames = [0];
7523
7544
  obj.keychTarget = [`0`];
7524
- if (hasVal(_dosObj[`keych${setScoreIdHeader(g_stateObj.scoreId, g_stateObj.scoreLockFlg)}_data`])) {
7525
- const keychdata = splitLF2(_dosObj[`keych${setScoreIdHeader(g_stateObj.scoreId, g_stateObj.scoreLockFlg)}_data`], `,`);
7545
+ if (hasVal(getRefData(`keych`, `${scoreIdHeader}_data`))) {
7546
+ const keychdata = splitLF2(getRefData(`keych`, `${scoreIdHeader}_data`), `,`);
7526
7547
  obj.keychFrames.push(...keychdata.filter((val, j) => j % 2 === 0));
7527
7548
  obj.keychTarget.push(...keychdata.filter((val, j) => j % 2 === 1));
7528
7549
  }
@@ -7562,7 +7583,7 @@ const calcLifeVal = (_val, _allArrows) => Math.round(_val * g_headerObj.maxLifeV
7562
7583
  const getLastFrame = (_dataObj, _keyCtrlPtn = `${g_keyObj.currentKey}_${g_keyObj.currentPtn}`) => {
7563
7584
 
7564
7585
  let tmpLastNum = 0;
7565
- const keyNum = g_keyObj[`chara${_keyCtrlPtn}`].length;
7586
+ const keyNum = g_keyObj[`${g_keyObj.defaultProp}${_keyCtrlPtn}`].length;
7566
7587
 
7567
7588
  for (let j = 0; j < keyNum; j++) {
7568
7589
  const data = [
@@ -7589,7 +7610,7 @@ const getLastFrame = (_dataObj, _keyCtrlPtn = `${g_keyObj.currentKey}_${g_keyObj
7589
7610
  const getFirstArrowFrame = (_dataObj, _keyCtrlPtn = `${g_keyObj.currentKey}_${g_keyObj.currentPtn}`) => {
7590
7611
 
7591
7612
  let tmpFirstNum = Infinity;
7592
- const keyNum = g_keyObj[`chara${_keyCtrlPtn}`].length;
7613
+ const keyNum = g_keyObj[`${g_keyObj.defaultProp}${_keyCtrlPtn}`].length;
7593
7614
 
7594
7615
  for (let j = 0; j < keyNum; j++) {
7595
7616
  const data = [
@@ -8707,7 +8728,7 @@ const mainInit = _ => {
8707
8728
  const makerView = g_headerObj.makerView ? ` (${g_headerObj.creatorNames[g_stateObj.scoreId]})` : ``;
8708
8729
  let difName = `[${getKeyName(g_headerObj.keyLabels[g_stateObj.scoreId])} / ${g_headerObj.difLabels[g_stateObj.scoreId]}${assistFlg}${shuffleName}${makerView}]`;
8709
8730
  let creditName = `${musicTitle} / ${artistName}`;
8710
- if (checkMusicSiz(creditName, C_SIZ_MUSIC_TITLE) < 12) {
8731
+ if (checkMusicSiz(creditName, g_limitObj.musicTitleSiz) < 12) {
8711
8732
  creditName = `${musicTitle}`;
8712
8733
  difName = `/ ${artistName} ` + difName;
8713
8734
  }
@@ -8716,7 +8737,7 @@ const mainInit = _ => {
8716
8737
 
8717
8738
  // ライフ(数字)
8718
8739
  createDivCss2Label(`lblLife`, intLifeVal, {
8719
- x: 0, y: 30, w: 70, h: 20, siz: C_SIZ_JDGCNTS, display: g_workObj.lifegaugeDisp,
8740
+ x: 0, y: 30, w: 70, h: 20, siz: g_limitObj.jdgCntsSiz, display: g_workObj.lifegaugeDisp,
8720
8741
  }, lblInitColor),
8721
8742
 
8722
8743
  // ライフ背景
@@ -8740,7 +8761,7 @@ const mainInit = _ => {
8740
8761
  }, g_cssObj.life_Border, g_cssObj.life_BorderColor),
8741
8762
 
8742
8763
  // 曲名・アーティスト名表示
8743
- createDivCss2Label(`lblCredit`, creditName, Object.assign(g_lblPosObj.lblCredit, { siz: checkMusicSiz(creditName, C_SIZ_MUSIC_TITLE) })),
8764
+ createDivCss2Label(`lblCredit`, creditName, Object.assign(g_lblPosObj.lblCredit, { siz: checkMusicSiz(creditName, g_limitObj.musicTitleSiz) })),
8744
8765
 
8745
8766
  // 譜面名表示
8746
8767
  createDivCss2Label(`lblDifName`, difName, Object.assign(g_lblPosObj.lblDifName, { siz: checkMusicSiz(difName, 12) })),
@@ -8779,7 +8800,7 @@ const mainInit = _ => {
8779
8800
  // キャラクタ表示
8780
8801
  const charaJ = createDivCss2Label(`chara${jdg}`, ``, {
8781
8802
  x: jdgX[j], y: jdgY[j],
8782
- w: C_LEN_JDGCHARA_WIDTH, h: C_LEN_JDGCHARA_HEIGHT, siz: C_SIZ_JDGCHARA,
8803
+ w: g_limitObj.jdgCharaWidth, h: g_limitObj.jdgCharaHeight, siz: g_limitObj.jdgCharaSiz,
8783
8804
  opacity: g_stateObj.opacity / 100, display: g_workObj.judgmentDisp,
8784
8805
  }, g_cssObj.common_ii);
8785
8806
  charaJ.setAttribute(`cnt`, 0);
@@ -8792,14 +8813,14 @@ const mainInit = _ => {
8792
8813
  // コンボ表示
8793
8814
  createDivCss2Label(`combo${jdg}`, ``, {
8794
8815
  x: jdgX[j] + 170, y: jdgY[j],
8795
- w: C_LEN_JDGCHARA_WIDTH, h: C_LEN_JDGCHARA_HEIGHT, siz: C_SIZ_JDGCHARA,
8816
+ w: g_limitObj.jdgCharaWidth, h: g_limitObj.jdgCharaHeight, siz: g_limitObj.jdgCharaSiz,
8796
8817
  opacity: g_stateObj.opacity / 100, display: g_workObj.judgmentDisp,
8797
8818
  }, g_cssObj[`common_${jdgCombos[j]}`]),
8798
8819
 
8799
8820
  // Fast/Slow表示
8800
8821
  createDivCss2Label(`diff${jdg}`, ``, {
8801
8822
  x: jdgX[j] + 170, y: jdgY[j] + 25,
8802
- w: C_LEN_JDGCHARA_WIDTH, h: C_LEN_JDGCHARA_HEIGHT, siz: C_SIZ_MAIN,
8823
+ w: g_limitObj.jdgCharaWidth, h: g_limitObj.jdgCharaHeight, siz: g_limitObj.mainSiz,
8803
8824
  opacity: g_stateObj.opacity / 100, display: g_workObj.fastslowDisp,
8804
8825
  }, g_cssObj.common_combo),
8805
8826
 
@@ -9630,7 +9651,7 @@ const mainInit = _ => {
9630
9651
  } else if (/\[fontSize=\d+\]/.test(g_wordObj.wordDat)) {
9631
9652
 
9632
9653
  // フォントサイズ変更
9633
- const fontSize = setIntVal(g_wordObj.wordDat.match(/\d+/)[0], C_SIZ_MAIN);
9654
+ const fontSize = setIntVal(g_wordObj.wordDat.match(/\d+/)[0], g_limitObj.mainSiz);
9634
9655
  g_wordSprite.style.fontSize = `${fontSize}px`;
9635
9656
 
9636
9657
  } else {
@@ -9760,8 +9781,8 @@ const changeAppearanceFilter = (_appearance, _num = 10) => {
9760
9781
  */
9761
9782
  const makeCounterSymbol = (_id, _x, _class, _heightPos, _text, _display = C_DIS_INHERIT) => {
9762
9783
  return createDivCss2Label(_id, _text, {
9763
- x: _x, y: C_LEN_JDGCNTS_HEIGHT * _heightPos,
9764
- w: C_LEN_JDGCNTS_WIDTH, h: C_LEN_JDGCNTS_HEIGHT, siz: C_SIZ_JDGCNTS, align: C_ALIGN_RIGHT,
9784
+ x: _x, y: g_limitObj.jdgCntsHeight * _heightPos,
9785
+ w: g_limitObj.jdgCntsWidth, h: g_limitObj.jdgCntsHeight, siz: g_limitObj.jdgCntsSiz, align: C_ALIGN_RIGHT,
9765
9786
  display: _display,
9766
9787
  }, _class);
9767
9788
  };
@@ -10727,9 +10748,9 @@ const resultInit = _ => {
10727
10748
  * @param {string} _text
10728
10749
  * @param {string} _align
10729
10750
  */
10730
- const makeCssResultPlayData = (_id, _x, _class, _heightPos, _text, _align = C_ALIGN_CENTER, { w = 400, siz = C_SIZ_MAIN } = {}) =>
10751
+ const makeCssResultPlayData = (_id, _x, _class, _heightPos, _text, _align = C_ALIGN_CENTER, { w = 400, siz = g_limitObj.mainSiz } = {}) =>
10731
10752
  createDivCss2Label(_id, _text, {
10732
- x: _x, y: C_SIZ_SETMINI * _heightPos, w, h: C_SIZ_SETMINI, siz, align: _align,
10753
+ x: _x, y: g_limitObj.setMiniSiz * _heightPos, w, h: g_limitObj.setMiniSiz, siz, align: _align,
10733
10754
  }, _class);
10734
10755
 
10735
10756
  /**
@@ -10742,7 +10763,7 @@ const makeCssResultPlayData = (_id, _x, _class, _heightPos, _text, _align = C_AL
10742
10763
  * @param {string} _align
10743
10764
  */
10744
10765
  const makeCssResultSymbol = (_id, _x, _class, _heightPos, _text, _align = C_ALIGN_LEFT) =>
10745
- makeCssResultPlayData(_id, _x, _class, _heightPos, _text, _align, { w: 150, siz: C_SIZ_JDGCNTS });
10766
+ makeCssResultPlayData(_id, _x, _class, _heightPos, _text, _align, { w: 150, siz: g_limitObj.jdgCntsSiz });
10746
10767
 
10747
10768
  // ライセンス原文、以下は削除しないでください
10748
10769
  /*-----------------------------------------------------------*/