danoniplus 34.4.0 → 34.4.2

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/10/29
7
+ * Revised : 2023/11/03
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 34.4.0`;
12
- const g_revisedDate = `2023/10/29`;
11
+ const g_version = `Ver 34.4.2`;
12
+ const g_revisedDate = `2023/11/03`;
13
13
 
14
14
  // カスタム用バージョン (danoni_custom.js 等で指定可)
15
15
  let g_localVersion = ``;
@@ -209,7 +209,7 @@ let g_canLoadDifInfoFlg = false;
209
209
  * div要素のstyleを取得
210
210
  * @param {string} _id
211
211
  */
212
- const $id = _id => document.getElementById(`${_id}`).style;
212
+ const $id = _id => document.getElementById(_id).style;
213
213
 
214
214
  /**
215
215
  * 複数のdiv子要素を親要素へ接続
@@ -360,7 +360,7 @@ const hasValInArray = (_val, _array, _pos = 0) =>
360
360
  * @param {array} _data
361
361
  * @param {integer} _length
362
362
  */
363
- const hasArrayList = (_data, _length = 1) => _data !== undefined && _data.length >= _length;
363
+ const hasArrayList = (_data, _length = 1) => _data?.length >= _length;
364
364
 
365
365
  /**
366
366
  * 改行コード区切りの配列展開
@@ -536,6 +536,21 @@ const blockCode = _setCode => !C_BLOCK_KEYS.includes(_setCode);
536
536
  /* ショートカット制御 */
537
537
  /*-----------------------------------------------------------*/
538
538
 
539
+ /**
540
+ * キーを押した状態を格納
541
+ * (KeyboardEvent.codeが空のときは、別キーとして扱う)
542
+ * @param {object} _evt
543
+ * @param {boolean} _keyHitFlg
544
+ */
545
+ const switchKeyHit = (_evt, _keyHitFlg = false) => {
546
+ if (_evt.code === ``) {
547
+ g_inputKeyBuffer[''] = false;
548
+ g_inputKeyBuffer[_evt.key === `Shift` ? g_kCdNameObj.shiftRKey : g_kCdNameObj.unknownKey] = _keyHitFlg;
549
+ } else {
550
+ g_inputKeyBuffer[_evt.code] = _keyHitFlg;
551
+ }
552
+ }
553
+
539
554
  /**
540
555
  * キーを押したときの動作(汎用)
541
556
  * @param {object} _evt
@@ -551,24 +566,15 @@ const commonKeyDown = (_evt, _displayName, _func = _code => { }, _dfEvtFlg) => {
551
566
  if (_evt.repeat && (g_unrepeatObj.page.includes(_displayName) || g_unrepeatObj.key.includes(setCode))) {
552
567
  return blockCode(setCode);
553
568
  }
554
- g_inputKeyBuffer[setCode] = true;
555
- if (_evt.key === `Shift` && setCode === ``) {
556
- g_inputKeyBuffer.ShiftRight = true;
557
- }
569
+ switchKeyHit(_evt, true);
558
570
 
559
571
  // 対象ボタンを検索
560
- const scLists = Object.keys(g_shortcutObj[_displayName]).filter(keys => {
561
- const keyset = keys.split(`_`);
562
- return (keyset.length > 2 ? keyIsDown(keyset[0]) && keyIsDown(keyset[1]) && keyIsDown(keyset[2]) :
563
- (keyset.length > 1 ? keyIsDown(keyset[0]) && keyIsDown(keyset[1]) : keyIsDown(keyset[0])));
564
- });
572
+ const scLists = Object.keys(g_shortcutObj[_displayName])
573
+ .filter(keys => keys.split(`_`).every(key => keyIsDown(key)));
565
574
  if (scLists.length > 0) {
566
575
  // リンク先にジャンプする場合はonkeyUpイベントが動かないため、事前にキー状態をリセット
567
576
  if (g_shortcutObj[_displayName][scLists[0]].reset) {
568
- g_inputKeyBuffer[setCode] = false;
569
- if (_evt.key === `Shift` && setCode === ``) {
570
- g_inputKeyBuffer.ShiftRight = false;
571
- }
577
+ switchKeyHit(_evt);
572
578
  }
573
579
  // 対象ボタン処理を実行
574
580
  const targetId = document.getElementById(g_shortcutObj[_displayName][scLists[0]].id);
@@ -588,7 +594,7 @@ const commonKeyDown = (_evt, _displayName, _func = _code => { }, _dfEvtFlg) => {
588
594
  const commonKeyUp = _evt => {
589
595
  g_inputKeyBuffer[g_kCdNameObj.metaLKey] = false;
590
596
  g_inputKeyBuffer[g_kCdNameObj.metaRKey] = false;
591
- g_inputKeyBuffer[_evt.code] = false;
597
+ switchKeyHit(_evt);
592
598
  };
593
599
 
594
600
  /**
@@ -603,7 +609,7 @@ const createScText = (_obj, _settingLabel, { displayName = `option`, dfLabel = `
603
609
  if (scKey.length > 0) {
604
610
  multiAppend(_obj,
605
611
  createDivCss2Label(`sc${_settingLabel}`,
606
- g_scViewObj.format.split(`{0}`).join(dfLabel !== `` ? `${dfLabel}` : `${g_kCd[g_kCdN.findIndex(kCd => kCd === scKey[0])] ?? ''}`), {
612
+ g_scViewObj.format.split(`{0}`).join(dfLabel || (`${g_kCd[g_kCdN.findIndex(kCd => kCd === scKey[0])] ?? ''}`)), {
607
613
  x, y, w, siz, fontWeight: `bold`, opacity: 0.75, pointerEvents: C_DIS_NONE,
608
614
  })
609
615
  );
@@ -685,11 +691,7 @@ const preloadFile = (_as, _href, _type = ``, _crossOrigin = `anonymous`) => {
685
691
 
686
692
  if (preloadFlg === undefined) {
687
693
  g_preloadFiles.all.push(_href);
688
-
689
- if (g_preloadFiles[_as] === undefined) {
690
- g_preloadFiles[_as] = [];
691
- }
692
- g_preloadFiles[_as].push(_href);
694
+ g_preloadFiles[_as]?.push(_href) || (g_preloadFiles[_as] = [_href]);
693
695
 
694
696
  if (g_userAgent.indexOf(`firefox`) !== -1 && _as === `image`) {
695
697
  // Firefoxの場合のみpreloadが効かないため、画像読込形式にする
@@ -886,7 +888,7 @@ const colorNameToCode = _color => {
886
888
  * 10進 -> 16進数変換 (カラーコード形式になるよう0埋め)
887
889
  * @param {number} _num
888
890
  */
889
- const byteToHex = _num => (`${_num.toString(16).padStart(2, '0')}`);
891
+ const byteToHex = _num => _num.toString(16).padStart(2, '0');
890
892
 
891
893
  /**
892
894
  * カラーコードかどうかを判定 (簡易版)
@@ -1154,13 +1156,11 @@ const createColorObject2 = (_id,
1154
1156
  const style = div.style;
1155
1157
 
1156
1158
  // 矢印・オブジェクト判定
1157
- let charaStyle;
1159
+ let charaStyle = `arrow${styleName}`;
1158
1160
  if (isNaN(parseFloat(rotate))) {
1159
1161
  const objData = rotate.split(`:`);
1160
1162
  rotate = setVal(objData[1], 0, C_TYP_FLOAT);
1161
1163
  charaStyle = `${objData[0]}${styleName}`;
1162
- } else {
1163
- charaStyle = `arrow${styleName}`;
1164
1164
  }
1165
1165
  if (g_stateObj.rotateEnabled) {
1166
1166
  style.transform = `rotate(${rotate}deg)`;
@@ -1205,7 +1205,7 @@ const createEmptySprite = (_parentObj, _newObjId, { x = 0, y = 0, w = g_sWidth,
1205
1205
  * @param {number} _num
1206
1206
  */
1207
1207
  const createMultipleSprite = (_baseName, _num, { x = 0 } = {}) => {
1208
- const sprite = createEmptySprite(divRoot, `${_baseName}`);
1208
+ const sprite = createEmptySprite(divRoot, _baseName);
1209
1209
  for (let j = 0; j <= _num; j++) {
1210
1210
  createEmptySprite(sprite, `${_baseName}${j}`, { x });
1211
1211
  }
@@ -1249,7 +1249,7 @@ const g_handler = (_ => {
1249
1249
  */
1250
1250
  const deleteChildspriteAll = _parentObjName => {
1251
1251
 
1252
- const parentsprite = document.querySelector(`#${_parentObjName}`);
1252
+ const parentsprite = document.getElementById(_parentObjName);
1253
1253
  while (parentsprite.hasChildNodes()) {
1254
1254
  g_handler.removeListener(parentsprite.firstChild.getAttribute(`lsnrkey`));
1255
1255
  g_handler.removeListener(parentsprite.firstChild.getAttribute(`lsnrkeyTS`));
@@ -1348,7 +1348,7 @@ const createCss2Button = (_id, _text, _func = _ => true, { x = 0, y = g_sHeight
1348
1348
  * @param {object} _obj (x, y, w, h, siz, align, title, ...rest)
1349
1349
  */
1350
1350
  const changeStyle = (_id, { x, y, w, h, siz, align, title, ...rest } = {}) => {
1351
- const div = document.querySelector(`#${_id}`);
1351
+ const div = document.getElementById(_id);
1352
1352
  const style = div.style;
1353
1353
 
1354
1354
  const obj = {
@@ -1427,12 +1427,12 @@ const clearWindow = (_redrawFlg = false, _customDisplayName = ``) => {
1427
1427
  return ctx;
1428
1428
  };
1429
1429
 
1430
- if (document.querySelector(`#layer0`) !== null) {
1430
+ if (document.getElementById(`layer0`) !== null) {
1431
1431
 
1432
1432
  // レイヤー情報取得
1433
1433
  const l0ctx = getLayerWithClear(`layer0`);
1434
1434
 
1435
- if (document.querySelector(`#layer1`) !== null) {
1435
+ if (document.getElementById(`layer1`) !== null) {
1436
1436
  const l1ctx = getLayerWithClear(`layer1`);
1437
1437
 
1438
1438
  // 線画 (title-line)
@@ -1448,7 +1448,7 @@ const clearWindow = (_redrawFlg = false, _customDisplayName = ``) => {
1448
1448
  l1ctx.lineTo(layer1.width, g_sHeight);
1449
1449
  l1ctx.stroke();
1450
1450
  }
1451
- if (document.querySelector(`#layer2`) !== null) {
1451
+ if (document.getElementById(`layer2`) !== null) {
1452
1452
  getLayerWithClear(`layer2`);
1453
1453
  }
1454
1454
 
@@ -1469,7 +1469,7 @@ const clearWindow = (_redrawFlg = false, _customDisplayName = ``) => {
1469
1469
  g_cxtAddFunc = {};
1470
1470
  g_cxtDeleteFlg = {};
1471
1471
 
1472
- if (document.querySelector(`#layer0`) === null ||
1472
+ if (document.getElementById(`layer0`) === null ||
1473
1473
  (!g_headerObj[`customBack${_customDisplayName}Use`] && !g_headerObj.defaultSkinFlg)) {
1474
1474
 
1475
1475
  $id(`canvas-frame`).width = wUnit(g_sWidth + diffX);
@@ -1492,11 +1492,9 @@ const clearWindow = (_redrawFlg = false, _customDisplayName = ``) => {
1492
1492
  * @param {string} _propData
1493
1493
  */
1494
1494
  const getCssCustomProperty = (_prop, _propData) =>
1495
- document.documentElement.style.getPropertyValue(_propData) !== `` ?
1496
- document.documentElement.style.getPropertyValue(_propData) :
1497
- g_cssBkProperties[_propData] !== undefined ?
1498
- g_cssBkProperties[_propData] :
1499
- _prop.endsWith(`-x`) ? _propData : reviseCssText(makeColorGradation(_propData, { _defaultColorgrd: false }));
1495
+ document.documentElement.style.getPropertyValue(_propData) || (g_cssBkProperties[_propData] ?? (
1496
+ _prop.endsWith(`-x`) ? _propData : reviseCssText(makeColorGradation(_propData, { _defaultColorgrd: false }))
1497
+ ));
1500
1498
 
1501
1499
  /**
1502
1500
  * CSSカスタムプロパティの値をオブジェクトへ退避
@@ -1729,11 +1727,11 @@ const getSpriteJumpFrame = _frames => {
1729
1727
  * @param {boolean} _condition
1730
1728
  */
1731
1729
  const drawBaseSpriteData = (_spriteData, _name, _condition = true) => {
1732
- const baseSprite = document.querySelector(`#${_name}Sprite${_spriteData.depth}`);
1730
+ const baseSprite = document.getElementById(`${_name}Sprite${_spriteData.depth}`);
1733
1731
  if (_spriteData.command === ``) {
1734
1732
  if (_spriteData.depth === C_FLG_ALL) {
1735
1733
  for (let j = 0; j <= g_scoreObj[`${_name}MaxDepth`]; j++) {
1736
- document.querySelector(`#${_name}Sprite${j}`).textContent = ``;
1734
+ document.getElementById(`${_name}Sprite${j}`).textContent = ``;
1737
1735
  }
1738
1736
  } else {
1739
1737
  baseSprite.textContent = ``;
@@ -1887,10 +1885,7 @@ class AudioPlayer {
1887
1885
  }
1888
1886
 
1889
1887
  addEventListener(_type, _listener) {
1890
- if (this._eventListeners[_type] === undefined) {
1891
- this._eventListeners[_type] = [];
1892
- }
1893
- this._eventListeners[_type].push(_listener);
1888
+ this._eventListeners[_type]?.push(_listener) || (this._eventListeners[_type] = [_listener]);
1894
1889
  }
1895
1890
 
1896
1891
  removeEventListener(_type, _listener) {
@@ -1987,12 +1982,12 @@ const transTimerToFrame = _str => {
1987
1982
 
1988
1983
  const initialControl = async () => {
1989
1984
 
1990
- const stage = document.querySelector(`#canvas-frame`);
1985
+ const stage = document.getElementById(`canvas-frame`);
1991
1986
  const divRoot = createEmptySprite(stage, `divRoot`, g_windowObj.divRoot);
1992
1987
 
1993
1988
  // 背景の表示
1994
- if (document.querySelector(`#layer0`) !== null) {
1995
- const layer0 = document.querySelector(`#layer0`);
1989
+ if (document.getElementById(`layer0`) !== null) {
1990
+ const layer0 = document.getElementById(`layer0`);
1996
1991
  makeBgCanvas(layer0.getContext(`2d`));
1997
1992
  } else {
1998
1993
  createEmptySprite(divRoot, `divBack`, g_windowObj.divBack);
@@ -2005,8 +2000,8 @@ const initialControl = async () => {
2005
2000
  g_canLoadDifInfoFlg = true;
2006
2001
 
2007
2002
  // 譜面データの読み込みオプション
2008
- g_enableAmpersandSplit = setBoolVal(document.querySelector(`#enableAmpersandSplit`)?.value, true);
2009
- g_enableDecodeURI = setBoolVal(document.querySelector(`#enableDecodeURI`)?.value);
2003
+ g_enableAmpersandSplit = setBoolVal(document.getElementById(`enableAmpersandSplit`)?.value, true);
2004
+ g_enableDecodeURI = setBoolVal(document.getElementById(`enableDecodeURI`)?.value);
2010
2005
 
2011
2006
  // 作品別ローカルストレージの読み込み
2012
2007
  loadLocalStorage();
@@ -2032,7 +2027,7 @@ const initialControl = async () => {
2032
2027
  Object.assign(g_headerObj, preheaderConvert(g_rootObj));
2033
2028
 
2034
2029
  // CSSファイル内のbackgroundを取得するために再描画
2035
- if (document.querySelector(`#layer0`) === null) {
2030
+ if (document.getElementById(`layer0`) === null) {
2036
2031
  deleteDiv(divRoot, `divBack`);
2037
2032
  createEmptySprite(divRoot, `divBack`);
2038
2033
  } else if (!g_headerObj.defaultSkinFlg && !g_headerObj.customBackUse) {
@@ -2139,8 +2134,8 @@ const initialControl = async () => {
2139
2134
  if (g_loadObj.main) {
2140
2135
 
2141
2136
  // 譜面分割、譜面番号固定かどうかをチェック
2142
- g_stateObj.dosDivideFlg = setBoolVal(document.querySelector(`#externalDosDivide`)?.value ?? getQueryParamVal(`dosDivide`));
2143
- g_stateObj.scoreLockFlg = setBoolVal(document.querySelector(`#externalDosLock`)?.value ?? getQueryParamVal(`dosLock`));
2137
+ g_stateObj.dosDivideFlg = setBoolVal(document.getElementById(`externalDosDivide`)?.value ?? getQueryParamVal(`dosDivide`));
2138
+ g_stateObj.scoreLockFlg = setBoolVal(document.getElementById(`externalDosLock`)?.value ?? getQueryParamVal(`dosLock`));
2144
2139
 
2145
2140
  for (let j = 1; j < g_headerObj.keyLabels.length; j++) {
2146
2141
 
@@ -2248,10 +2243,10 @@ const dosConvert = (_dos = ``) => {
2248
2243
  */
2249
2244
  const loadChartFile = async (_scoreId = g_stateObj.scoreId) => {
2250
2245
 
2251
- const dosInput = document.querySelector(`#dos`);
2252
- const divRoot = document.querySelector(`#divRoot`);
2246
+ const dosInput = document.getElementById(`dos`);
2247
+ const divRoot = document.getElementById(`divRoot`);
2253
2248
  const queryDos = getQueryParamVal(`dos`) !== null ?
2254
- `dos/${getQueryParamVal('dos')}.txt` : encodeURI(document.querySelector(`#externalDos`)?.value ?? ``);
2249
+ `dos/${getQueryParamVal('dos')}.txt` : encodeURI(document.getElementById(`externalDos`)?.value ?? ``);
2255
2250
 
2256
2251
  if (dosInput === null && queryDos === ``) {
2257
2252
  makeWarningWindow(g_msgInfoObj.E_0023);
@@ -2272,7 +2267,7 @@ const loadChartFile = async (_scoreId = g_stateObj.scoreId) => {
2272
2267
 
2273
2268
  // 外部dos読み込み
2274
2269
  if (queryDos !== ``) {
2275
- const charset = document.querySelector(`#externalDosCharset`)?.value ?? document.characterSet;
2270
+ const charset = document.getElementById(`externalDosCharset`)?.value ?? document.characterSet;
2276
2271
  const fileBase = queryDos.match(/.+\..*/)[0];
2277
2272
  const fileExtension = fileBase.split(`.`).pop();
2278
2273
  const fileCommon = fileBase.split(`.${fileExtension}`)[0];
@@ -3160,14 +3155,14 @@ const headerConvert = _dosObj => {
3160
3155
 
3161
3156
  // Display使用可否設定を分解 |displayUse=false,ON|
3162
3157
  const displayTempUse = _dosObj[`${option}Use`] ?? g_presetObj.settingUse?.[option] ?? `true`;
3163
- const displayUse = (displayTempUse !== undefined ? displayTempUse.split(`,`) : [true, C_FLG_ON]);
3158
+ const displayUse = displayTempUse?.split(`,`) ?? [true, C_FLG_ON];
3164
3159
 
3165
3160
  // displayUse -> ボタンの有効/無効, displaySet -> ボタンの初期値(ON/OFF)
3166
3161
  obj[`${option}Use`] = setBoolVal(displayUse[0], true);
3167
3162
  obj[`${option}Set`] = setVal(displayUse.length > 1 ? displayUse[1] :
3168
3163
  boolToSwitch(obj[`${option}Use`]), ``, C_TYP_SWITCH);
3169
3164
  g_stateObj[`d_${option.toLowerCase()}`] = setVal(obj[`${option}Set`], C_FLG_ON, C_TYP_SWITCH);
3170
- obj[`${option}ChainOFF`] = (_dosObj[`${option}ChainOFF`] !== undefined ? _dosObj[`${option}ChainOFF`].split(`,`) : []);
3165
+ obj[`${option}ChainOFF`] = _dosObj[`${option}ChainOFF`]?.split(`,`) ?? [];
3171
3166
 
3172
3167
  // Displayのデフォルト設定で、双方向に設定されている場合は設定をブロック
3173
3168
  g_displays.filter((option2, k) =>
@@ -3245,7 +3240,7 @@ const headerConvert = _dosObj => {
3245
3240
  obj.commentVal = tmpComment.split(`\n`).join(newlineTag);
3246
3241
 
3247
3242
  // クレジット表示
3248
- if (document.querySelector(`#webMusicTitle`) !== null) {
3243
+ if (document.getElementById(`webMusicTitle`) !== null) {
3249
3244
  webMusicTitle.innerHTML =
3250
3245
  `<span style="font-size:${wUnit(32)}">${obj.musicTitleForView.join(`<br>`)}</span><br>
3251
3246
  <span style="font-size:${wUnit(16)}">(Artist: <a href="${obj.artistUrl}" target="_blank">${obj.artistName}</a>)</span>`;
@@ -3408,7 +3403,7 @@ const resetBaseColorList = (_baseObj, _dosObj, { scoreId = `` } = {}) => {
3408
3403
 
3409
3404
  // フリーズアロー色
3410
3405
  const tmpFrzColors = (frzColorTxt !== undefined ? splitLF2(frzColorTxt) : []);
3411
- const firstFrzColors = (tmpFrzColors[0] !== undefined ? tmpFrzColors[0].split(`,`) : []);
3406
+ const firstFrzColors = tmpFrzColors[0]?.split(`,`) ?? [];
3412
3407
 
3413
3408
  for (let j = 0; j < _baseObj.setColorInit.length; j++) {
3414
3409
 
@@ -3735,8 +3730,7 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList?.split(`,`)
3735
3730
  // |keyCtrl9j=Tab,7_0,Enter| -> |keyCtrl9j=Tab,S,D,F,Space,J,K,L,Enter| のように補完
3736
3731
  g_keyObj[`${keyheader}_${k + dfPtn}`] =
3737
3732
  tmpArray[k].split(`,`).map(n =>
3738
- g_keyObj[`${_name}${getKeyPtnName(n)}`] !== undefined ?
3739
- structuredClone(g_keyObj[`${_name}${getKeyPtnName(n)}`]) : [_convFunc(n)]
3733
+ structuredClone(g_keyObj[`${_name}${getKeyPtnName(n)}`]) ?? [_convFunc(n)]
3740
3734
  ).flat();
3741
3735
  if (baseCopyFlg) {
3742
3736
  g_keyObj[`${keyheader}_${k + dfPtn}d`] = structuredClone(g_keyObj[`${keyheader}_${k + dfPtn}`]);
@@ -3787,9 +3781,8 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList?.split(`,`)
3787
3781
  // 部分的にキーパターン指定があった場合は既存パターンを展開 (例: |shuffle9j=2,7_0_0,2|)
3788
3782
  g_keyObj[`${keyheader}_${k + dfPtn}_${ptnCnt}`] =
3789
3783
  makeBaseArray(list.split(`,`).map(n =>
3790
- g_keyObj[`${_name}${getKeyPtnName(n)}`] !== undefined ?
3791
- structuredClone(g_keyObj[`${_name}${getKeyPtnName(n)}`]) :
3792
- [isNaN(parseInt(n)) ? n : parseInt(n, 10)]
3784
+ structuredClone(g_keyObj[`${_name}${getKeyPtnName(n)}`]) ??
3785
+ [isNaN(parseInt(n)) ? n : parseInt(n, 10)]
3793
3786
  ).flat(), g_keyObj[`${g_keyObj.defaultProp}${_key}_${k + dfPtn}`].length, 0);
3794
3787
  ptnCnt++;
3795
3788
  }
@@ -3864,9 +3857,8 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList?.split(`,`)
3864
3857
  const tmpParamPair = pairs.split(`::`);
3865
3858
  g_keyObj[pairName][tmpParamPair[0]] =
3866
3859
  makeBaseArray(tmpParamPair[1]?.split(`,`).map(n =>
3867
- g_keyObj[`${_pairName}${getKeyPtnName(n)}`] !== undefined ?
3868
- structuredClone(g_keyObj[`${_pairName}${getKeyPtnName(n)}`][tmpParamPair[0]]) :
3869
- [n === `-` ? -1 : parseInt(n, 10)]
3860
+ structuredClone(g_keyObj[`${_pairName}${getKeyPtnName(n)}`]?.[tmpParamPair[0]]) ??
3861
+ [n === `-` ? -1 : parseInt(n, 10)]
3870
3862
  ).flat(), g_keyObj[`${g_keyObj.defaultProp}${_key}_${k + dfPtn}`].length, _defaultVal);
3871
3863
  }
3872
3864
  });
@@ -3900,10 +3892,10 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList?.split(`,`)
3900
3892
  errCd: `E_0104`, baseCopyFlg: true,
3901
3893
  loopFunc: (k, keyheader) => {
3902
3894
  const addShiftRKey = (_pattern = ``) => {
3903
- const keyCtrls = g_keyObj[`${keyheader}_${k + g_keyObj.dfPtnNum}${_pattern}`];
3895
+ const keyCtrls = g_keyObj[`${keyheader}_${k + dfPtnNum}${_pattern}`];
3904
3896
  for (let j = 0; j < keyCtrls.length; j++) {
3905
- if (keyCtrls[j].includes(256) && !keyCtrls[j].includes(260)) {
3906
- keyCtrls[j].push(260);
3897
+ if (keyCtrls[j].includes(g_kCdObj.shiftRkey) && !keyCtrls[j].includes(g_kCdObj.shiftRAltKey)) {
3898
+ keyCtrls[j].push(g_kCdObj.shiftRAltKey);
3907
3899
  }
3908
3900
  }
3909
3901
  };
@@ -4037,7 +4029,7 @@ const titleInit = _ => {
4037
4029
  if (!g_stateObj.dataSaveFlg || hasVal(g_keyObj[`transKey${keyCtrlPtn}`])) {
4038
4030
  g_canLoadDifInfoFlg = false;
4039
4031
  }
4040
- const divRoot = document.querySelector(`#divRoot`);
4032
+ const divRoot = document.getElementById(`divRoot`);
4041
4033
 
4042
4034
  // 曲時間制御変数
4043
4035
  let thisTime;
@@ -4090,7 +4082,7 @@ const titleInit = _ => {
4090
4082
  }
4091
4083
 
4092
4084
  // 変数 titlesize の定義 (使用例: |titlesize=40$20|)
4093
- const titlefontsizes = (g_headerObj.titlesize !== `` ? g_headerObj.titlesize.split(`$`).join(`,`).split(`,`) : [titlefontsize, titlefontsize]);
4085
+ const titlefontsizes = (g_headerObj.titlesize?.split(`$`).join(`,`).split(`,`) || [titlefontsize, titlefontsize]);
4094
4086
  const titlefontsize1 = setIntVal(titlefontsizes[0], titlefontsize);
4095
4087
  const titlefontsize2 = setIntVal(titlefontsizes[1], titlefontsize1);
4096
4088
 
@@ -4242,7 +4234,7 @@ const titleInit = _ => {
4242
4234
  // コメント文の加工
4243
4235
  const convCommentVal = convertStrToVal(g_headerObj.commentVal);
4244
4236
  if (g_headerObj.commentExternal) {
4245
- if (document.querySelector(`#commentArea`) !== null) {
4237
+ if (document.getElementById(`commentArea`) !== null) {
4246
4238
  commentArea.innerHTML = convCommentVal;
4247
4239
  }
4248
4240
  } else {
@@ -4435,7 +4427,7 @@ const makePlayButton = _func => createCss2Button(`btnPlay`, g_lblNameObj.b_play,
4435
4427
  const optionInit = _ => {
4436
4428
 
4437
4429
  clearWindow(true);
4438
- const divRoot = document.querySelector(`#divRoot`);
4430
+ const divRoot = document.getElementById(`divRoot`);
4439
4431
  g_baseDisp = `Settings`;
4440
4432
  g_currentPage = `option`;
4441
4433
  g_stateObj.filterKeys = ``;
@@ -4490,7 +4482,7 @@ const inputSlider = (_slider, _link) => {
4490
4482
  * 譜面変更セレクターの削除
4491
4483
  */
4492
4484
  const resetDifWindow = _ => {
4493
- if (document.querySelector(`#difList`) !== null) {
4485
+ if (document.getElementById(`difList`) !== null) {
4494
4486
  deleteChildspriteAll(`difList`);
4495
4487
  [`difList`, `difCover`, `btnDifU`, `btnDifD`].forEach(obj => document.getElementById(obj).remove());
4496
4488
  g_currentPage = `option`;
@@ -4615,7 +4607,7 @@ const createDifWindow = (_key = ``) => {
4615
4607
  const changeDifficulty = (_num = 1) => {
4616
4608
  if (g_headerObj.difSelectorUse) {
4617
4609
  g_stateObj.filterKeys = ``;
4618
- if (document.querySelector(`#difList`) === null) {
4610
+ if (document.getElementById(`difList`) === null) {
4619
4611
  g_keyObj.prevKey = g_keyObj.currentKey;
4620
4612
  createDifWindow();
4621
4613
  } else {
@@ -4658,20 +4650,18 @@ const drawSpeedGraph = _scoreId => {
4658
4650
  const speed = speedObj[speedType].speed;
4659
4651
  const speedData = g_detailObj[`${speedType}Data`][_scoreId];
4660
4652
 
4661
- if (speedData !== undefined) {
4662
- for (let i = 0; i < speedData.length; i += 2) {
4663
- if (speedData[i] >= startFrame) {
4664
- frame.push(speedData[i] - startFrame);
4665
- speed.push(speedData[i + 1]);
4666
- }
4667
- speedObj[speedType].cnt++;
4653
+ for (let i = 0; i < speedData?.length; i += 2) {
4654
+ if (speedData[i] >= startFrame) {
4655
+ frame.push(speedData[i] - startFrame);
4656
+ speed.push(speedData[i + 1]);
4668
4657
  }
4669
- frame.push(playingFrame);
4670
- speed.push(speed.at(-1));
4658
+ speedObj[speedType].cnt++;
4671
4659
  }
4660
+ frame.push(playingFrame);
4661
+ speed.push(speed.at(-1));
4672
4662
  });
4673
4663
 
4674
- const canvas = document.querySelector(`#graphSpeed`);
4664
+ const canvas = document.getElementById(`graphSpeed`);
4675
4665
  const context = canvas.getContext(`2d`);
4676
4666
  drawBaseLine(context);
4677
4667
 
@@ -4725,7 +4715,7 @@ const drawSpeedGraph = _scoreId => {
4725
4715
  */
4726
4716
  const drawDensityGraph = _scoreId => {
4727
4717
 
4728
- const canvas = document.querySelector(`#graphDensity`);
4718
+ const canvas = document.getElementById(`graphDensity`);
4729
4719
  const context = canvas.getContext(`2d`);
4730
4720
  drawBaseLine(context);
4731
4721
  for (let j = 0; j < g_limitObj.densityDivision; j++) {
@@ -4771,16 +4761,16 @@ const drawDensityGraph = _scoreId => {
4771
4761
  */
4772
4762
  const updateScoreDetailLabel = (_name, _label, _value, _pos = 0, _labelname = _label) => {
4773
4763
  const baseLabel = (_bLabel, _bLabelname, _bAlign) =>
4774
- document.querySelector(`#detail${_name}`).appendChild(
4775
- createDivCss2Label(`${_bLabel}`, `${_bLabelname}`, {
4764
+ document.getElementById(`detail${_name}`).appendChild(
4765
+ createDivCss2Label(_bLabel, _bLabelname, {
4776
4766
  x: 10, y: 105 + _pos * 20, w: 100, h: 20, siz: g_limitObj.difSelectorSiz, align: _bAlign,
4777
4767
  })
4778
4768
  );
4779
- if (document.querySelector(`#data${_label}`) === null) {
4769
+ if (document.getElementById(`data${_label}`) === null) {
4780
4770
  baseLabel(`lbl${_label}`, `${_labelname}`, C_ALIGN_LEFT);
4781
4771
  baseLabel(`data${_label}`, `${_value}`, C_ALIGN_RIGHT);
4782
4772
  } else {
4783
- document.querySelector(`#data${_label}`).textContent = `${_value}`;
4773
+ document.getElementById(`data${_label}`).textContent = `${_value}`;
4784
4774
  }
4785
4775
  };
4786
4776
 
@@ -4815,7 +4805,7 @@ const drawLine = (_context, _y, _lineType, _fixed = 0) => {
4815
4805
  _context.lineWidth = 1;
4816
4806
 
4817
4807
  if (_lineType === `main`) {
4818
- const textBaseObj = document.querySelector(`#lnkDifficulty`);
4808
+ const textBaseObj = document.getElementById(`lnkDifficulty`);
4819
4809
  const textColor = window.getComputedStyle(textBaseObj, ``).color;
4820
4810
  _context.strokeStyle = textColor;
4821
4811
  _context.font = `${wUnit(12)} ${getBasicFont()}`;
@@ -4834,7 +4824,7 @@ const drawLine = (_context, _y, _lineType, _fixed = 0) => {
4834
4824
  const makeDifInfoLabels = _scoreId => {
4835
4825
 
4836
4826
  // ツール難易度
4837
- const detailToolDif = document.querySelector(`#detailToolDif`);
4827
+ const detailToolDif = document.getElementById(`detailToolDif`);
4838
4828
  /**
4839
4829
  * 譜面の難易度情報ラベルの作成
4840
4830
  * @param {string} _lbl
@@ -4898,7 +4888,7 @@ const makeDifInfo = _scoreId => {
4898
4888
  const frzCnts = sumData(g_detailObj.frzCnt[_scoreId]);
4899
4889
  const push3CntStr = (g_detailObj.toolDif[_scoreId].push3.length === 0 ? `None` : `(${g_detailObj.toolDif[_scoreId].push3})`);
4900
4890
 
4901
- if (document.querySelector(`#lblTooldif`) === null) {
4891
+ if (document.getElementById(`lblTooldif`) === null) {
4902
4892
  makeDifInfoLabels(_scoreId);
4903
4893
  }
4904
4894
  dataTooldif.textContent = g_detailObj.toolDif[_scoreId].tool;
@@ -5075,7 +5065,7 @@ const setDifficulty = (_initFlg) => {
5075
5065
  g_shortcutObj.option.KeyR.exId : g_shortcutObj.option.KeyR.dfId;
5076
5066
 
5077
5067
  if (g_settings.scrolls.length > 1) {
5078
- setReverseView(document.querySelector(`#btnReverse`));
5068
+ setReverseView(document.getElementById(`btnReverse`));
5079
5069
  }
5080
5070
  } else {
5081
5071
  g_settings.scrolls = structuredClone(g_keyObj.scrollName_def);
@@ -5148,7 +5138,7 @@ const createOptionWindow = _sprite => {
5148
5138
 
5149
5139
  if (_graphUseFlg) {
5150
5140
  const graphObj = document.createElement(`canvas`);
5151
- const textBaseObj = document.querySelector(`#lnkDifficulty`);
5141
+ const textBaseObj = document.getElementById(`lnkDifficulty`);
5152
5142
  const bkColor = window.getComputedStyle(textBaseObj, ``).backgroundColor;
5153
5143
 
5154
5144
  graphObj.id = `graph${_name}`;
@@ -5225,8 +5215,8 @@ const createOptionWindow = _sprite => {
5225
5215
  g_stateObj.scoreDetailViewFlg = false;
5226
5216
  g_shortcutObj.difSelector.KeyQ.id = g_settings.scoreDetailCursors[0];
5227
5217
  }
5228
- const scoreDetail = document.querySelector(`#scoreDetail`);
5229
- const detailObj = document.querySelector(`#detail${g_stateObj.scoreDetail}`);
5218
+ const scoreDetail = document.getElementById(`scoreDetail`);
5219
+ const detailObj = document.getElementById(`detail${g_stateObj.scoreDetail}`);
5230
5220
  const visibles = [`hidden`, `visible`];
5231
5221
 
5232
5222
  g_stateObj.scoreDetailViewFlg = !g_stateObj.scoreDetailViewFlg;
@@ -5346,7 +5336,7 @@ const createOptionWindow = _sprite => {
5346
5336
 
5347
5337
  );
5348
5338
 
5349
- const fadeinSlider = document.querySelector(`#fadeinSlider`);
5339
+ const fadeinSlider = document.getElementById(`fadeinSlider`);
5350
5340
  fadeinSlider.addEventListener(`input`, _ =>
5351
5341
  g_stateObj.fadein = inputSlider(fadeinSlider, lnkFadein), false);
5352
5342
 
@@ -5434,7 +5424,7 @@ const createGeneralSetting = (_obj, _settingName, { unitName = ``,
5434
5424
  createScText(_obj, settingUpper, { displayName: displayName, dfLabel: scLabel });
5435
5425
 
5436
5426
  } else {
5437
- document.querySelector(`#lbl${settingUpper}`).classList.add(g_cssObj.settings_Disabled);
5427
+ document.getElementById(`lbl${settingUpper}`).classList.add(g_cssObj.settings_Disabled);
5438
5428
  _obj.appendChild(makeDisabledLabel(linkId, 0, initName));
5439
5429
  }
5440
5430
  };
@@ -5488,7 +5478,7 @@ const setSetting = (_scrollNum, _settingName, _unitName = ``, _roundNum = 0) =>
5488
5478
  }
5489
5479
  g_stateObj[_settingName] = settingList[settingNum];
5490
5480
  g_settings[`${_settingName}Num`] = settingNum;
5491
- document.querySelector(`#lnk${toCapitalize(_settingName)}`).textContent =
5481
+ document.getElementById(`lnk${toCapitalize(_settingName)}`).textContent =
5492
5482
  `${getStgDetailName(g_stateObj[_settingName])}${_unitName}${g_localStorage[_settingName] === g_stateObj[_settingName] ? ' *' : ''}`;
5493
5483
  };
5494
5484
 
@@ -5498,11 +5488,10 @@ const setSetting = (_scrollNum, _settingName, _unitName = ``, _roundNum = 0) =>
5498
5488
  * @param {number} _heightPos
5499
5489
  * @param {string} _defaultStr
5500
5490
  */
5501
- const makeDisabledLabel = (_id, _heightPos, _defaultStr) => {
5502
- return createDivCss2Label(_id, _defaultStr, {
5491
+ const makeDisabledLabel = (_id, _heightPos, _defaultStr) =>
5492
+ createDivCss2Label(_id, _defaultStr, {
5503
5493
  x: g_limitObj.setLblLeft, y: g_limitObj.setLblHeight * _heightPos,
5504
5494
  }, g_cssObj.settings_Disabled);
5505
- };
5506
5495
 
5507
5496
  /**
5508
5497
  * 保存済みリバース取得処理
@@ -5760,7 +5749,7 @@ const getKeyCtrl = (_localStorage, _extraKeyName = ``) => {
5760
5749
  const basePtn = `${g_keyObj.currentKey}_${g_keyObj.storagePtn}`;
5761
5750
  const baseKeyNum = g_keyObj[`${g_keyObj.defaultProp}${basePtn}`].length;
5762
5751
 
5763
- if (_localStorage[`keyCtrl${_extraKeyName}`] !== undefined && _localStorage[`keyCtrl${_extraKeyName}`][0].length > 0) {
5752
+ if (_localStorage[`keyCtrl${_extraKeyName}`]?.[0].length > 0) {
5764
5753
  const prevPtn = g_keyObj.currentPtn;
5765
5754
  g_keyObj.currentPtn = -1;
5766
5755
  const copyPtn = `${g_keyObj.currentKey}_-1`;
@@ -5802,12 +5791,12 @@ const getKeyCtrl = (_localStorage, _extraKeyName = ``) => {
5802
5791
  */
5803
5792
  const makeSettingLblCssButton = (_id, _name, _heightPos, _func, { x, y, w, h, siz, cxtFunc = _ => true, ...rest } = {}, ..._classes) => {
5804
5793
  const tmpObj = {
5805
- x: x !== undefined ? x : g_limitObj.setLblLeft,
5806
- y: y !== undefined ? y : g_limitObj.setLblHeight * _heightPos,
5807
- w: w !== undefined ? w : g_limitObj.setLblWidth,
5808
- h: h !== undefined ? h : g_limitObj.setLblHeight,
5809
- siz: siz !== undefined ? siz : g_limitObj.setLblSiz,
5810
- cxtFunc: cxtFunc !== undefined ? cxtFunc : _ => true,
5794
+ x: x ?? g_limitObj.setLblLeft,
5795
+ y: y ?? g_limitObj.setLblHeight * _heightPos,
5796
+ w: w ?? g_limitObj.setLblWidth,
5797
+ h: h ?? g_limitObj.setLblHeight,
5798
+ siz: siz ?? g_limitObj.setLblSiz,
5799
+ cxtFunc: cxtFunc ?? (_ => true),
5811
5800
  };
5812
5801
  return createCss2Button(_id, _name, _func, { ...tmpObj, ...rest }, g_cssObj.button_Default, ..._classes);
5813
5802
  };
@@ -5819,14 +5808,13 @@ const makeSettingLblCssButton = (_id, _name, _heightPos, _func, { x, y, w, h, si
5819
5808
  * @param {number} _heightPos 上からの配置順
5820
5809
  * @param {function} _func
5821
5810
  */
5822
- const makeDifLblCssButton = (_id, _name, _heightPos, _func, { x = 0, w = g_limitObj.difSelectorWidth, btnStyle = `Default` } = {}) => {
5823
- return createCss2Button(_id, _name, _func, {
5824
- x: x, y: g_limitObj.setLblHeight * _heightPos,
5825
- w: w, h: g_limitObj.setLblHeight,
5811
+ const makeDifLblCssButton = (_id, _name, _heightPos, _func, { x = 0, w = g_limitObj.difSelectorWidth, btnStyle = `Default` } = {}) =>
5812
+ createCss2Button(_id, _name, _func, {
5813
+ x, y: g_limitObj.setLblHeight * _heightPos,
5814
+ w, h: g_limitObj.setLblHeight,
5826
5815
  siz: g_limitObj.difSelectorSiz,
5827
5816
  borderStyle: `solid`,
5828
5817
  }, g_cssObj[`button_${btnStyle}`], g_cssObj.button_ON);
5829
- };
5830
5818
 
5831
5819
  /**
5832
5820
  * 設定・オプション用の設定変更ミニボタン
@@ -5835,14 +5823,13 @@ const makeDifLblCssButton = (_id, _name, _heightPos, _func, { x = 0, w = g_limit
5835
5823
  * @param {number} _heightPos 上からの配置順
5836
5824
  * @param {function} _func
5837
5825
  */
5838
- const makeMiniCssButton = (_id, _directionFlg, _heightPos, _func, { dx = 0, dy = 0, dw = 0, dh = 0, dsiz = 0, visibility = `visible` } = {}) => {
5839
- return createCss2Button(`${_id}${_directionFlg}`, g_settingBtnObj.chara[_directionFlg], _func, {
5826
+ const makeMiniCssButton = (_id, _directionFlg, _heightPos, _func, { dx = 0, dy = 0, dw = 0, dh = 0, dsiz = 0, visibility = `visible` } = {}) =>
5827
+ createCss2Button(`${_id}${_directionFlg}`, g_settingBtnObj.chara[_directionFlg], _func, {
5840
5828
  x: g_settingBtnObj.pos[_directionFlg] + dx,
5841
5829
  y: g_limitObj.setLblHeight * _heightPos + dy,
5842
5830
  w: g_limitObj.setMiniWidth + dw, h: g_limitObj.setLblHeight + dh, siz: g_limitObj.setLblSiz + dsiz,
5843
5831
  visibility: visibility
5844
5832
  }, g_cssObj.button_Mini);
5845
- };
5846
5833
 
5847
5834
  /**
5848
5835
  * カラーグループ、シャッフルグループの再設定
@@ -5855,7 +5842,7 @@ const resetGroupList = (_type, _keyCtrlPtn) => {
5855
5842
  if (g_keyObj.currentPtn === -1) {
5856
5843
  g_keycons[`${_type}Groups`] = addValtoArray(g_keycons[`${_type}Groups`], -1);
5857
5844
  }
5858
- g_keycons[`${_type}GroupNum`] = (g_keyObj.currentPtn === -1 ? -1 : 0);
5845
+ g_keycons[`${_type}GroupNum`] = Math.min(g_keyObj.currentPtn, 0);
5859
5846
  while (g_keyObj[`${_type}${_keyCtrlPtn}_${k}`] !== undefined) {
5860
5847
  g_keycons[`${_type}Groups`].push(k);
5861
5848
  k++;
@@ -5869,7 +5856,7 @@ const resetGroupList = (_type, _keyCtrlPtn) => {
5869
5856
  const settingsDisplayInit = _ => {
5870
5857
 
5871
5858
  clearWindow(true);
5872
- const divRoot = document.querySelector(`#divRoot`);
5859
+ const divRoot = document.getElementById(`divRoot`);
5873
5860
  g_baseDisp = `Display`;
5874
5861
  g_currentPage = `settingsDisplay`;
5875
5862
 
@@ -5916,21 +5903,6 @@ const createSettingsDisplayWindow = _sprite => {
5916
5903
  const list = [C_FLG_OFF, C_FLG_ON];
5917
5904
  const linkId = `lnk${_name}`;
5918
5905
 
5919
- /**
5920
- * 無効化用ラベル作成
5921
- * @param {string} _id
5922
- * @param {number} _heightPos
5923
- * @param {number} _widthPos
5924
- * @param {string} _defaultStr
5925
- * @param {string} _flg
5926
- */
5927
- const makeDisabledDisplayLabel = (_id, _heightPos, _widthPos, _defaultStr, _flg) => {
5928
- return createDivCss2Label(_id, _defaultStr, {
5929
- x: 30 + 180 * _widthPos, y: 3 + g_limitObj.setLblHeight * _heightPos,
5930
- w: 170, siz: g_limitObj.difSelectorSiz,
5931
- }, g_cssObj[`button_Disabled${flg}`]);
5932
- };
5933
-
5934
5906
  if (g_headerObj[`${_name}Use`]) {
5935
5907
  const switchDisplay = evt => {
5936
5908
  const displayFlg = g_stateObj[`d_${_name.toLowerCase()}`];
@@ -5951,8 +5923,12 @@ const createSettingsDisplayWindow = _sprite => {
5951
5923
  createScText(document.getElementById(linkId), `${toCapitalize(_name)}`,
5952
5924
  { displayName: g_currentPage, targetLabel: linkId, x: -5 });
5953
5925
  } else {
5954
- displaySprite.appendChild(makeDisabledDisplayLabel(linkId, _heightPos, _widthPos,
5955
- g_lblNameObj[`d_${toCapitalize(_name)}`] + `:${g_headerObj[`${_name}Set`]}`, g_headerObj[`${_name}Set`]));
5926
+ displaySprite.appendChild(
5927
+ createDivCss2Label(linkId, g_lblNameObj[`d_${toCapitalize(_name)}`] + `:${g_headerObj[`${_name}Set`]}`, {
5928
+ x: 30 + 180 * _widthPos, y: 3 + g_limitObj.setLblHeight * _heightPos,
5929
+ w: 170, siz: g_limitObj.difSelectorSiz,
5930
+ }, g_cssObj[`button_Disabled${flg}`])
5931
+ );
5956
5932
  }
5957
5933
  };
5958
5934
 
@@ -5994,7 +5970,7 @@ const createSettingsDisplayWindow = _sprite => {
5994
5970
  g_cssObj[`button_Rev${g_stateObj.filterLock}`]);
5995
5971
  };
5996
5972
 
5997
- const appearanceSlider = document.querySelector(`#appearanceSlider`);
5973
+ const appearanceSlider = document.getElementById(`appearanceSlider`);
5998
5974
  appearanceSlider.addEventListener(`input`, _ =>
5999
5975
  g_hidSudObj.filterPos = inputSlider(appearanceSlider, lblAppearancePos), false);
6000
5976
 
@@ -6052,9 +6028,9 @@ const interlockingButton = (_headerObj, _name, _current, _next, _buttonFlg = fal
6052
6028
  let txtDisabled = ``;
6053
6029
  if (!g_headerObj[`${defaultOption}Use`]) {
6054
6030
  txtDisabled = `Disabled`;
6055
- document.querySelector(`#lnk${defaultOption}`).textContent = `${toCapitalize(defaultOption)}:${_next}`;
6031
+ document.getElementById(`lnk${defaultOption}`).textContent = `${toCapitalize(defaultOption)}:${_next}`;
6056
6032
  }
6057
- document.querySelector(`#lnk${defaultOption}`).classList.replace(g_cssObj[`button_${txtDisabled}${_current}`], g_cssObj[`button_Disabled${_next}`]);
6033
+ document.getElementById(`lnk${defaultOption}`).classList.replace(g_cssObj[`button_${txtDisabled}${_current}`], g_cssObj[`button_Disabled${_next}`]);
6058
6034
  }
6059
6035
  // さらに連動する場合は設定を反転
6060
6036
  interlockingButton(_headerObj, defaultOption, _next, _current, _buttonFlg);
@@ -6072,7 +6048,7 @@ const interlockingButton = (_headerObj, _name, _current, _next, _buttonFlg = fal
6072
6048
  const keyConfigInit = (_kcType = g_kcType) => {
6073
6049
 
6074
6050
  clearWindow(true);
6075
- const divRoot = document.querySelector(`#divRoot`);
6051
+ const divRoot = document.getElementById(`divRoot`);
6076
6052
  g_kcType = _kcType;
6077
6053
  g_currentPage = `keyConfig`;
6078
6054
 
@@ -6141,7 +6117,7 @@ const keyConfigInit = (_kcType = g_kcType) => {
6141
6117
  * @param {string} _cssName
6142
6118
  */
6143
6119
  const changeKeyConfigColor = (_j, _k, _cssName) =>
6144
- changeConfigColor(document.querySelector(`#keycon${_j}_${_k}`), _cssName);
6120
+ changeConfigColor(document.getElementById(`keycon${_j}_${_k}`), _cssName);
6145
6121
 
6146
6122
  /**
6147
6123
  * 一時的に矢印色・シャッフルグループを変更(共通処理)
@@ -6732,7 +6708,7 @@ const keyConfigInit = (_kcType = g_kcType) => {
6732
6708
  const j = g_keycons.cursorNumList[m];
6733
6709
  for (let k = 0; k < g_keyObj[`keyCtrl${keyCtrlPtn}`][j].length; k++) {
6734
6710
  g_keyObj[`keyCtrl${keyCtrlPtn}`][j][k] = setIntVal(g_keyObj[`keyCtrl${keyCtrlPtn}d`][j][k]);
6735
- document.querySelector(`#keycon${j}_${k}`).textContent = g_kCd[g_keyObj[`keyCtrl${keyCtrlPtn}`][j][k]];
6711
+ document.getElementById(`keycon${j}_${k}`).textContent = g_kCd[g_keyObj[`keyCtrl${keyCtrlPtn}`][j][k]];
6736
6712
  changeKeyConfigColor(j, k, g_keyObj.currentPtn === -1 ? g_cssObj.keyconfig_Defaultkey : g_cssObj.title_base);
6737
6713
  }
6738
6714
  }
@@ -6747,12 +6723,12 @@ const keyConfigInit = (_kcType = g_kcType) => {
6747
6723
 
6748
6724
  // キーボード押下時処理
6749
6725
  setShortcutEvent(g_currentPage, (kbCode, kbKey) => {
6750
- const keyCdObj = document.querySelector(`#keycon${g_currentj}_${g_currentk}`);
6726
+ const keyCdObj = document.getElementById(`keycon${g_currentj}_${g_currentk}`);
6751
6727
  let setKey = g_kCdN.findIndex(kCd => kCd === kbCode);
6752
6728
 
6753
6729
  // 右シフトキー対応
6754
- if (setKey === 1 && kbKey === `Shift`) {
6755
- setKey = 260;
6730
+ if (setKey === g_kCdObj.unknown && kbKey === `Shift`) {
6731
+ setKey = g_kCdObj.shiftRAltKey;
6756
6732
  }
6757
6733
 
6758
6734
  // 全角切替、BackSpace、Deleteキー、Escキーは割り当て禁止
@@ -6770,7 +6746,7 @@ const keyConfigInit = (_kcType = g_kcType) => {
6770
6746
  return;
6771
6747
  }
6772
6748
 
6773
- if (setKey === C_KEY_RETRY && (!g_isMac || (g_isMac && g_currentk === 0))) {
6749
+ if (setKey === C_KEY_RETRY && (!g_isMac || g_currentk === 0)) {
6774
6750
  // スキップ
6775
6751
  } else {
6776
6752
  // キー割り当て処理
@@ -6817,8 +6793,7 @@ const getShadowColor = (_colorPos, _arrowColor) => g_headerObj.setShadowColor[_c
6817
6793
  const getKeyInfo = _ => {
6818
6794
  const keyCtrlPtn = `${g_keyObj.currentKey}_${g_keyObj.currentPtn}`;
6819
6795
  const keyNum = g_keyObj[`${g_keyObj.defaultProp}${keyCtrlPtn}`].length;
6820
- const posMax = (g_keyObj[`divMax${keyCtrlPtn}`] !== undefined ?
6821
- g_keyObj[`divMax${keyCtrlPtn}`] : Math.max(...g_keyObj[`pos${keyCtrlPtn}`]) + 1);
6796
+ const posMax = g_keyObj[`divMax${keyCtrlPtn}`] ?? Math.max(...g_keyObj[`pos${keyCtrlPtn}`]) + 1;
6822
6797
  const divideCnt = g_keyObj[`div${keyCtrlPtn}`] - 1;
6823
6798
  const keyGroupMaps = setVal(g_keyObj[`keyGroup${keyCtrlPtn}`], [...Array(keyNum)].fill([`0`]), C_TYP_STRING);
6824
6799
  const keyGroupList = makeDedupliArray(keyGroupMaps.flat()).sort((a, b) => parseInt(a) - parseInt(b));
@@ -6944,7 +6919,7 @@ const loadMusic = _ => {
6944
6919
 
6945
6920
  // 進捗時
6946
6921
  request.addEventListener(`progress`, _event => {
6947
- const lblLoading = document.querySelector(`#lblLoading`);
6922
+ const lblLoading = document.getElementById(`lblLoading`);
6948
6923
 
6949
6924
  if (_event.lengthComputable) {
6950
6925
  const rate = _event.loaded / _event.total;
@@ -6958,8 +6933,8 @@ const loadMusic = _ => {
6958
6933
  });
6959
6934
 
6960
6935
  // エラー処理
6961
- request.addEventListener(`timeout`, _ => makeWarningWindow(`${g_msgInfoObj.E_0033}`, { backBtnUse: true }));
6962
- request.addEventListener(`error`, _ => makeWarningWindow(`${g_msgInfoObj.E_0034}`, { backBtnUse: true }));
6936
+ request.addEventListener(`timeout`, _ => makeWarningWindow(g_msgInfoObj.E_0033, { backBtnUse: true }));
6937
+ request.addEventListener(`error`, _ => makeWarningWindow(g_msgInfoObj.E_0034, { backBtnUse: true }));
6963
6938
 
6964
6939
  request.send();
6965
6940
  };
@@ -7138,12 +7113,8 @@ const loadingScoreInit = async () => {
7138
7113
  // シャッフルグループを扱いやすくする
7139
7114
  // [0, 0, 0, 1, 0, 0, 0] -> [[0, 1, 2, 4, 5, 6], [3]]
7140
7115
  const shuffleGroupMap = {};
7141
- g_keyObj[`shuffle${keyCtrlPtn}`].forEach((_val, _i) => {
7142
- if (shuffleGroupMap[_val] === undefined) {
7143
- shuffleGroupMap[_val] = [];
7144
- }
7145
- shuffleGroupMap[_val].push(_i);
7146
- });
7116
+ g_keyObj[`shuffle${keyCtrlPtn}`].forEach((_val, _i) =>
7117
+ shuffleGroupMap[_val]?.push(_i) || (shuffleGroupMap[_val] = [_i]));
7147
7118
 
7148
7119
  // Mirror,Random,S-Randomの適用
7149
7120
  g_shuffleFunc[g_stateObj.shuffle](keyNum, Object.values(shuffleGroupMap));
@@ -7898,7 +7869,7 @@ const setSpeedOnFrame = (_speedData, _lastFrame) => {
7898
7869
  let currentSpeed = g_stateObj.speed * 2;
7899
7870
 
7900
7871
  for (let frm = 0, s = 0; frm <= _lastFrame; frm++) {
7901
- while (_speedData !== undefined && frm >= _speedData[s]) {
7872
+ while (frm >= _speedData?.[s]) {
7902
7873
  currentSpeed = _speedData[s + 1] * g_stateObj.speed * 2;
7903
7874
  s += 2;
7904
7875
  }
@@ -7983,11 +7954,7 @@ const pushArrows = (_dataObj, _speedOnFrame, _motionOnFrame, _firstArrivalFrame)
7983
7954
 
7984
7955
  const setNotes = (_j, _k, _data, _startPoint, _header, _frzFlg = false) => {
7985
7956
  if (_startPoint >= 0) {
7986
- if (g_workObj[`mk${_header}Arrow`][_startPoint] === undefined) {
7987
- g_workObj[`mk${_header}Arrow`][_startPoint] = [];
7988
- }
7989
- g_workObj[`mk${_header}Arrow`][_startPoint].push(_j);
7990
-
7957
+ g_workObj[`mk${_header}Arrow`][_startPoint]?.push(_j) || (g_workObj[`mk${_header}Arrow`][_startPoint] = [_j]);
7991
7958
  if (_frzFlg) {
7992
7959
  g_workObj[`mk${_header}Length`][_j][_k] = getFrzLength(_speedOnFrame, _data[_k], _data[_k + 1]);
7993
7960
  }
@@ -8230,12 +8197,10 @@ const pushArrows = (_dataObj, _speedOnFrame, _motionOnFrame, _firstArrivalFrame)
8230
8197
  g_workObj.speedData.push(g_scoreObj.frameNum);
8231
8198
  g_workObj.speedData.push(_speedOnFrame[g_scoreObj.frameNum]);
8232
8199
 
8233
- if (_dataObj.speedData !== undefined) {
8234
- for (let k = 0; k < _dataObj.speedData.length; k += 2) {
8235
- if (_dataObj.speedData[k] >= g_scoreObj.frameNum) {
8236
- g_workObj.speedData.push(_dataObj.speedData[k]);
8237
- g_workObj.speedData.push(_speedOnFrame[_dataObj.speedData[k]]);
8238
- }
8200
+ for (let k = 0; k < _dataObj?.speedData.length; k += 2) {
8201
+ if (_dataObj.speedData[k] >= g_scoreObj.frameNum) {
8202
+ g_workObj.speedData.push(_dataObj.speedData[k]);
8203
+ g_workObj.speedData.push(_speedOnFrame[_dataObj.speedData[k]]);
8239
8204
  }
8240
8205
  }
8241
8206
  };
@@ -8325,17 +8290,6 @@ const pushColors = (_header, _frame, _val, _colorCd, _allFlg) => {
8325
8290
  const addAll = Number(_allFlg) * 1000;
8326
8291
  const allUseTypes = [];
8327
8292
 
8328
- /**
8329
- * 色変化用配列(フレーム別)の初期化
8330
- * @param {string} _baseStr
8331
- */
8332
- const initialize = (_baseStr) => {
8333
- if (g_workObj[_baseStr][_frame] === undefined) {
8334
- g_workObj[_baseStr][_frame] = [];
8335
- g_workObj[`${_baseStr}Cd`][_frame] = [];
8336
- }
8337
- };
8338
-
8339
8293
  /**
8340
8294
  * 全体色変化の有効化(フレーム別)
8341
8295
  * @param {...any} _types
@@ -8352,8 +8306,8 @@ const pushColors = (_header, _frame, _val, _colorCd, _allFlg) => {
8352
8306
  * @param {number} _cVal
8353
8307
  */
8354
8308
  const pushColor = (_baseStr, _cVal) => {
8355
- g_workObj[_baseStr][_frame].push(_cVal);
8356
- g_workObj[`${_baseStr}Cd`][_frame].push(colorCd);
8309
+ g_workObj[_baseStr][_frame]?.push(_cVal) || (g_workObj[_baseStr][_frame] = [_cVal]);
8310
+ g_workObj[`${_baseStr}Cd`][_frame]?.push(colorCd) || (g_workObj[`${_baseStr}Cd`][_frame] = [colorCd]);
8357
8311
  };
8358
8312
 
8359
8313
  if (_val < 30 || _val >= 1000) {
@@ -8369,8 +8323,6 @@ const pushColors = (_header, _frame, _val, _colorCd, _allFlg) => {
8369
8323
 
8370
8324
  // 矢印の色変化 (追随指定時はフリーズアローも色変化)
8371
8325
  baseHeaders.forEach(baseHeader => {
8372
- initialize(baseHeader);
8373
-
8374
8326
  if (_val < 20 || _val >= 1000) {
8375
8327
  pushColor(baseHeader, g_workObj.replaceNums[_val % 1000] + addAll);
8376
8328
  } else if (_val >= 20) {
@@ -8408,7 +8360,6 @@ const pushColors = (_header, _frame, _val, _colorCd, _allFlg) => {
8408
8360
 
8409
8361
  g_keyObj[`color${tkObj.keyCtrlPtn}`].forEach((cpattern, k) => {
8410
8362
  if (colorPos === cpattern) {
8411
- initialize(baseHeader + ctype);
8412
8363
  pushColor(baseHeader + ctype, k + addAll);
8413
8364
  }
8414
8365
  });
@@ -8465,30 +8416,24 @@ const pushScrollchs = (_header, _frameArrow, _val, _frameStep, _scrollDir) => {
8465
8416
 
8466
8417
  const frameArrow = Math.max(_frameArrow, g_scoreObj.frameNum);
8467
8418
  const frameStep = Math.max(_frameStep, g_scoreObj.frameNum);
8419
+ const pushData = (_pattern, _frame, _val) =>
8420
+ g_workObj[`mkScrollch${_pattern}`][_frame]?.push(_val) || (g_workObj[`mkScrollch${_pattern}`][_frame] = [_val]);
8468
8421
 
8469
- if (g_workObj.mkScrollchArrow[frameArrow] === undefined) {
8470
- g_workObj.mkScrollchArrow[frameArrow] = [];
8471
- g_workObj.mkScrollchArrowDir[frameArrow] = [];
8472
- }
8473
- if (g_workObj.mkScrollchStep[frameStep] === undefined) {
8474
- g_workObj.mkScrollchStep[frameStep] = [];
8475
- g_workObj.mkScrollchStepDir[frameStep] = [];
8476
- }
8477
8422
  if (_val < 20 || _val >= 1000) {
8478
8423
  const realVal = g_workObj.replaceNums[_val % 1000];
8479
- g_workObj.mkScrollchArrow[frameArrow].push(realVal);
8480
- g_workObj.mkScrollchArrowDir[frameArrow].push(_scrollDir);
8481
- g_workObj.mkScrollchStep[frameStep].push(realVal);
8482
- g_workObj.mkScrollchStepDir[frameStep].push(_scrollDir);
8424
+ pushData(`Arrow`, frameArrow, realVal);
8425
+ pushData(`ArrowDir`, frameArrow, _scrollDir);
8426
+ pushData(`Step`, frameStep, realVal);
8427
+ pushData(`StepDir`, frameStep, _scrollDir);
8483
8428
 
8484
8429
  } else {
8485
8430
  const colorNum = _val - 20;
8486
8431
  for (let j = 0; j < tkObj.keyNum; j++) {
8487
8432
  if (g_keyObj[`color${tkObj.keyCtrlPtn}`][j] === colorNum) {
8488
- g_workObj.mkScrollchArrow[frameArrow].push(j);
8489
- g_workObj.mkScrollchArrowDir[frameArrow].push(_scrollDir);
8490
- g_workObj.mkScrollchStep[frameStep].push(j);
8491
- g_workObj.mkScrollchStepDir[frameStep].push(_scrollDir);
8433
+ pushData(`Arrow`, frameArrow, j);
8434
+ pushData(`ArrowDir`, frameArrow, _scrollDir);
8435
+ pushData(`Step`, frameStep, j);
8436
+ pushData(`StepDir`, frameStep, _scrollDir);
8492
8437
  }
8493
8438
  }
8494
8439
  }
@@ -8527,6 +8472,13 @@ const getArrowSettings = _ => {
8527
8472
  for (let j = 0; j < g_workObj.keyCtrl.length; j++) {
8528
8473
  for (let k = 0; k < g_workObj.keyCtrl[j].length; k++) {
8529
8474
  g_workObj.keyCtrlN[j][k] = g_kCdN[g_workObj.keyCtrl[j][k]];
8475
+
8476
+ // 内部のキーコードにより、KeyboardEvent.codeの値を切り替え
8477
+ if (g_workObj.keyCtrl[j][k] === g_kCdObj.unknown) {
8478
+ g_workObj.keyCtrlN[j][k] = g_kCdNameObj.unknownKey;
8479
+ } else if (g_workObj.keyCtrl[j][k] === g_kCdObj.shiftRAltKey) {
8480
+ g_workObj.keyCtrlN[j][k] = g_kCdNameObj.shiftRKey;
8481
+ }
8530
8482
  g_workObj.keyHitFlg[j][k] = false;
8531
8483
  }
8532
8484
  }
@@ -8550,8 +8502,7 @@ const getArrowSettings = _ => {
8550
8502
  // モーション管理
8551
8503
  g_typeLists.arrow.forEach(type => g_workObj[`${type}CssMotions`] = [...Array(keyNum)].fill(``));
8552
8504
 
8553
- const scrollDirOptions = (g_keyObj[`scrollDir${keyCtrlPtn}`] !== undefined ?
8554
- g_keyObj[`scrollDir${keyCtrlPtn}`][g_stateObj.scroll] : [...Array(keyNum)].fill(1));
8505
+ const scrollDirOptions = g_keyObj[`scrollDir${keyCtrlPtn}`]?.[g_stateObj.scroll] ?? [...Array(keyNum)].fill(1);
8555
8506
 
8556
8507
  g_stateObj.autoAll = boolToSwitch(g_stateObj.autoPlay === C_FLG_ALL);
8557
8508
  g_workObj.hitPosition = (g_stateObj.autoAll === C_FLG_ON ? 0 : g_stateObj.hitPosition);
@@ -8697,7 +8648,7 @@ const setKeyCtrl = (_localStorage, _keyNum, _keyCtrlPtn) => {
8697
8648
  */
8698
8649
  const mainInit = _ => {
8699
8650
  clearWindow(true, `Main`);
8700
- const divRoot = document.querySelector(`#divRoot`);
8651
+ const divRoot = document.getElementById(`divRoot`);
8701
8652
  document.oncontextmenu = _ => false;
8702
8653
  g_currentPage = `main`;
8703
8654
 
@@ -8883,31 +8834,27 @@ const mainInit = _ => {
8883
8834
  g_scoreObj.fadeOutTerm = C_FRM_AFTERFADE;
8884
8835
 
8885
8836
  // フェードアウト時間指定の場合、その7秒(=420フレーム)後に終了する
8886
- if (g_headerObj.fadeFrame !== undefined) {
8887
- let fadeNo = -1;
8888
- if (g_headerObj.fadeFrame.length >= g_stateObj.scoreId + 1) {
8889
- fadeNo = (isNaN(parseInt(g_headerObj.fadeFrame[g_stateObj.scoreId][0])) ? -1 : g_stateObj.scoreId);
8890
- }
8891
- if (fadeNo !== -1) {
8892
- // フェードアウト指定の場合、曲長(フェードアウト開始まで) FadeFrame - (本来のblankFrame)
8893
- duration = parseInt(g_headerObj.fadeFrame[fadeNo][0]) - g_headerObj.blankFrameDef;
8894
- g_scoreObj.fadeOutFrame = Math.ceil(duration / g_headerObj.playbackRate + g_headerObj.blankFrame + g_stateObj.adjustment);
8837
+ let fadeNo = -1;
8838
+ if (g_headerObj.fadeFrame?.length >= g_stateObj.scoreId + 1) {
8839
+ fadeNo = (isNaN(parseInt(g_headerObj.fadeFrame[g_stateObj.scoreId][0])) ? -1 : g_stateObj.scoreId);
8840
+ }
8841
+ if (fadeNo !== -1) {
8842
+ // フェードアウト指定の場合、曲長(フェードアウト開始まで)は FadeFrame - (本来のblankFrame)
8843
+ duration = parseInt(g_headerObj.fadeFrame[fadeNo][0]) - g_headerObj.blankFrameDef;
8844
+ g_scoreObj.fadeOutFrame = Math.ceil(duration / g_headerObj.playbackRate + g_headerObj.blankFrame + g_stateObj.adjustment);
8895
8845
 
8896
- if (g_headerObj.fadeFrame[fadeNo].length > 1) {
8897
- g_scoreObj.fadeOutTerm = Number(g_headerObj.fadeFrame[fadeNo][1]);
8898
- }
8846
+ if (g_headerObj.fadeFrame[fadeNo].length > 1) {
8847
+ g_scoreObj.fadeOutTerm = Number(g_headerObj.fadeFrame[fadeNo][1]);
8899
8848
  }
8900
8849
  }
8901
8850
 
8902
8851
  // 終了時間指定の場合、その値を適用する
8903
8852
  let endFrameUseFlg = false;
8904
- if (g_headerObj.endFrame !== undefined) {
8905
- const tmpEndFrame = g_headerObj.endFrame[g_stateObj.scoreId] || g_headerObj.endFrame[0];
8906
- if (!isNaN(parseInt(tmpEndFrame))) {
8907
- // 終了時間指定の場合、曲長は EndFrame - (本来のblankFrame)
8908
- duration = parseInt(tmpEndFrame) - g_headerObj.blankFrameDef;
8909
- endFrameUseFlg = true;
8910
- }
8853
+ const tmpEndFrame = g_headerObj.endFrame?.[g_stateObj.scoreId] || g_headerObj.endFrame?.[0];
8854
+ if (!isNaN(parseInt(tmpEndFrame))) {
8855
+ // 終了時間指定の場合、曲長は EndFrame - (本来のblankFrame)
8856
+ duration = parseInt(tmpEndFrame) - g_headerObj.blankFrameDef;
8857
+ endFrameUseFlg = true;
8911
8858
  }
8912
8859
 
8913
8860
  let fullFrame = Math.ceil(duration / g_headerObj.playbackRate + g_headerObj.blankFrame + g_stateObj.adjustment);
@@ -9084,14 +9031,14 @@ const mainInit = _ => {
9084
9031
 
9085
9032
  // Ready?表示
9086
9033
  if (!g_headerObj.customReadyUse) {
9087
- const readyColor = (g_headerObj.readyColor !== `` ? g_headerObj.readyColor : g_headerObj.setColorOrg[0]);
9034
+ const readyColor = g_headerObj.readyColor || g_headerObj.setColorOrg[0];
9088
9035
  let readyDelayFrame = 0;
9089
9036
  if (g_stateObj.fadein === 0 && g_headerObj.readyDelayFrame > 0 &&
9090
9037
  g_headerObj.readyDelayFrame + g_stateObj.adjustment > 0) {
9091
9038
  readyDelayFrame = g_headerObj.readyDelayFrame + g_stateObj.adjustment;
9092
9039
  }
9093
- const readyHtml = (g_headerObj.readyHtml !== `` ? g_headerObj.readyHtml :
9094
- `<span style='color:${readyColor};font-size:${wUnit(60)};'>R</span>EADY<span style='font-size:${wUnit(50)};'>?</span>`);
9040
+ const readyHtml = g_headerObj.readyHtml ||
9041
+ `<span style='color:${readyColor};font-size:${wUnit(60)};'>R</span>EADY<span style='font-size:${wUnit(50)};'>?</span>`;
9095
9042
 
9096
9043
  divRoot.appendChild(
9097
9044
  createDivCss2Label(`lblReady`, readyHtml, {
@@ -9117,17 +9064,16 @@ const mainInit = _ => {
9117
9064
  */
9118
9065
  const mainKeyDownActFunc = {
9119
9066
 
9120
- OFF: (_keyCode) => {
9067
+ OFF: (_code, _key) => {
9068
+ const convCode = _code || (_key === `Shift` ? g_kCdNameObj.shiftRKey : g_kCdNameObj.unknownKey);
9121
9069
  const matchKeys = g_workObj.keyCtrlN;
9122
9070
 
9123
9071
  for (let j = 0; j < keyNum; j++) {
9124
- matchKeys[j].filter((key, k) => _keyCode === key && !g_workObj.keyHitFlg[j][k] && !g_judgObj.lockFlgs[j])
9072
+ matchKeys[j].filter((key, k) => convCode === key && !g_workObj.keyHitFlg[j][k] && !g_judgObj.lockFlgs[j])
9125
9073
  .forEach(() => {
9126
- if (_keyCode !== `` || (_keyCode === `` && g_inputKeyBuffer.ShiftRight)) {
9127
- g_judgObj.lockFlgs[j] = true;
9128
- judgeArrow(j);
9129
- g_judgObj.lockFlgs[j] = false;
9130
- }
9074
+ g_judgObj.lockFlgs[j] = true;
9075
+ judgeArrow(j);
9076
+ g_judgObj.lockFlgs[j] = false;
9131
9077
  });
9132
9078
  }
9133
9079
  },
@@ -9143,12 +9089,8 @@ const mainInit = _ => {
9143
9089
  if (evt.repeat && !g_mainRepeatObj.key.includes(setCode)) {
9144
9090
  return blockCode(setCode);
9145
9091
  }
9146
-
9147
- g_inputKeyBuffer[setCode] = true;
9148
- if (evt.key === `Shift` && setCode === ``) {
9149
- g_inputKeyBuffer.ShiftRight = true;
9150
- }
9151
- mainKeyDownActFunc[g_stateObj.autoAll](setCode);
9092
+ switchKeyHit(evt, true);
9093
+ mainKeyDownActFunc[g_stateObj.autoAll](setCode, evt.key);
9152
9094
 
9153
9095
  // 曲中リトライ、タイトルバック
9154
9096
  if (setCode === g_kCdN[g_headerObj.keyRetry]) {
@@ -9209,11 +9151,7 @@ const mainInit = _ => {
9209
9151
  };
9210
9152
 
9211
9153
  document.onkeyup = evt => {
9212
- const setCode = evt.code;
9213
- g_inputKeyBuffer[setCode] = false;
9214
- if (evt.key === `Shift` && setCode === ``) {
9215
- g_inputKeyBuffer.ShiftRight = false;
9216
- }
9154
+ switchKeyHit(evt);
9217
9155
  mainKeyUpActFunc[g_stateObj.autoAll]();
9218
9156
  };
9219
9157
 
@@ -9227,7 +9165,7 @@ const mainInit = _ => {
9227
9165
  if (g_workObj[`mk${toCapitalize(_name)}ColorChangeAll`][g_scoreObj.frameNum]) {
9228
9166
  const colorSelf = g_workObj[`${_name}Colors`][_j];
9229
9167
  const colorAll = g_workObj[`${_name}ColorsAll`][_j];
9230
- const arrowTop = document.querySelector(`#${_name}Top${_j}_${_k}`);
9168
+ const arrowTop = document.getElementById(`${_name}Top${_j}_${_k}`);
9231
9169
 
9232
9170
  if (arrowTop.getAttribute(`color`) !== colorSelf && colorAll === colorSelf) {
9233
9171
  arrowTop.style.background = colorAll;
@@ -9246,9 +9184,9 @@ const mainInit = _ => {
9246
9184
  const changeFrzColor = (_j, _k, _name, _state) => {
9247
9185
 
9248
9186
  if (g_workObj[`mk${toCapitalize(_name)}ColorChangeAll`][g_scoreObj.frameNum]) {
9249
- const frzTop = document.querySelector(`#${_name}Top${_j}_${_k}`);
9250
- const frzBar = document.querySelector(`#${_name}Bar${_j}_${_k}`);
9251
- const frzBtm = document.querySelector(`#${_name}Btm${_j}_${_k}`);
9187
+ const frzTop = document.getElementById(`${_name}Top${_j}_${_k}`);
9188
+ const frzBar = document.getElementById(`${_name}Bar${_j}_${_k}`);
9189
+ const frzBtm = document.getElementById(`${_name}Btm${_j}_${_k}`);
9252
9190
  const frzName = `${_name}${_state}`;
9253
9191
 
9254
9192
  // 矢印部分の色変化
@@ -9323,7 +9261,7 @@ const mainInit = _ => {
9323
9261
  // 矢印(オート、AutoPlay: ON)
9324
9262
  arrowON: (_j, _arrowName, _cnt) => {
9325
9263
  if (_cnt === 0) {
9326
- const stepDivHit = document.querySelector(`#stepHit${_j}`);
9264
+ const stepDivHit = document.getElementById(`stepHit${_j}`);
9327
9265
 
9328
9266
  judgeIi(_cnt);
9329
9267
  stepDivHit.style.opacity = 1;
@@ -9335,7 +9273,7 @@ const mainInit = _ => {
9335
9273
  // ダミー矢印(オート、AutoPlay: OFF)
9336
9274
  dummyArrowOFF: (_j, _arrowName, _cnt) => {
9337
9275
  if (_cnt === 0) {
9338
- const stepDivHit = document.querySelector(`#stepHit${_j}`);
9276
+ const stepDivHit = document.getElementById(`stepHit${_j}`);
9339
9277
 
9340
9278
  g_customJsObj.dummyArrow.forEach(func => func());
9341
9279
  stepDivHit.style.top = wUnit(-15);
@@ -9752,11 +9690,11 @@ const mainInit = _ => {
9752
9690
  g_customJsObj.mainEnterFrame.forEach(func => func());
9753
9691
 
9754
9692
  // 速度変化 (途中変速, 個別加速)
9755
- while (g_workObj.speedData !== undefined && currentFrame >= g_workObj.speedData[speedCnts]) {
9693
+ while (currentFrame >= g_workObj.speedData?.[speedCnts]) {
9756
9694
  g_workObj.currentSpeed = g_workObj.speedData[speedCnts + 1];
9757
9695
  speedCnts += 2;
9758
9696
  }
9759
- while (g_workObj.boostData !== undefined && currentFrame >= g_workObj.boostData[boostCnts]) {
9697
+ while (currentFrame >= g_workObj.boostData?.[boostCnts]) {
9760
9698
  g_workObj.boostSpd = g_workObj.boostData[boostCnts + 1];
9761
9699
  g_workObj.boostDir = (g_workObj.boostSpd > 0 ? 1 : -1);
9762
9700
  boostCnts += 2;
@@ -9812,7 +9750,7 @@ const mainInit = _ => {
9812
9750
 
9813
9751
  // 矢印・フリーズアロー移動&消去
9814
9752
  for (let j = 0; j < keyNum; j++) {
9815
- const stepDivHit = document.querySelector(`#stepHit${j}`);
9753
+ const stepDivHit = document.getElementById(`stepHit${j}`);
9816
9754
 
9817
9755
  // ダミー矢印
9818
9756
  for (let k = g_workObj.judgDummyArrowCnt[j]; k <= dummyArrowCnts[j]; k++) {
@@ -9848,7 +9786,7 @@ const mainInit = _ => {
9848
9786
  g_scoreObj.wordData[currentFrame]?.forEach(tmpObj => {
9849
9787
  g_wordObj.wordDir = tmpObj[0];
9850
9788
  g_wordObj.wordDat = tmpObj[1];
9851
- g_wordSprite = document.querySelector(`#lblword${g_wordObj.wordDir}`);
9789
+ g_wordSprite = document.getElementById(`lblword${g_wordObj.wordDir}`);
9852
9790
 
9853
9791
  const wordDepth = Number(g_wordObj.wordDir);
9854
9792
  if (g_wordObj.wordDat.substring(0, 5) === `[fade`) {
@@ -9894,13 +9832,13 @@ const mainInit = _ => {
9894
9832
 
9895
9833
  // 判定キャラクタ消去
9896
9834
  jdgGroups.forEach(jdg => {
9897
- let charaJCnt = document.querySelector(`#chara${jdg}`).getAttribute(`cnt`);
9835
+ let charaJCnt = document.getElementById(`chara${jdg}`).getAttribute(`cnt`);
9898
9836
  if (charaJCnt > 0) {
9899
- document.querySelector(`#chara${jdg}`).setAttribute(`cnt`, --charaJCnt);
9837
+ document.getElementById(`chara${jdg}`).setAttribute(`cnt`, --charaJCnt);
9900
9838
  if (charaJCnt === 0) {
9901
- document.querySelector(`#chara${jdg}`).textContent = ``;
9902
- document.querySelector(`#combo${jdg}`).textContent = ``;
9903
- document.querySelector(`#diff${jdg}`).textContent = ``;
9839
+ document.getElementById(`chara${jdg}`).textContent = ``;
9840
+ document.getElementById(`combo${jdg}`).textContent = ``;
9841
+ document.getElementById(`diff${jdg}`).textContent = ``;
9904
9842
  }
9905
9843
  }
9906
9844
  });
@@ -10202,7 +10140,7 @@ const judgeArrow = _j => {
10202
10140
  const judgeTargetArrow = _difFrame => {
10203
10141
  const _difCnt = Math.abs(_difFrame);
10204
10142
  const stepHitTargetArrow = _resultJdg => {
10205
- const stepDivHit = document.querySelector(`#stepHit${_j}`);
10143
+ const stepDivHit = document.getElementById(`stepHit${_j}`);
10206
10144
  stepDivHit.style.top = wUnit(currentArrow.prevY - parseFloat($id(`stepRoot${_j}`).top) - 15 + g_workObj.hitPosition * g_workObj.scrollDir[_j]);
10207
10145
  stepDivHit.style.opacity = 0.75;
10208
10146
  stepDivHit.classList.value = ``;
@@ -10299,8 +10237,8 @@ const displayDiff = (_difFrame, _fjdg = ``, _justFrames = g_headerObj.justFrames
10299
10237
  * @param {string} _state
10300
10238
  */
10301
10239
  const changeLifeColor = (_state = ``) => {
10302
- const lblLife = document.querySelector(`#lblLife`);
10303
- const lifeBar = document.querySelector(`#lifeBar`);
10240
+ const lblLife = document.getElementById(`lblLife`);
10241
+ const lifeBar = document.getElementById(`lifeBar`);
10304
10242
  if (_state !== ``) {
10305
10243
  const lifeCss = g_cssObj[`life_${_state}`];
10306
10244
  lblLife.classList.remove(g_cssObj.life_Max, g_cssObj.life_Cleared, g_cssObj.life_Failed);
@@ -10350,9 +10288,9 @@ const lifeDamage = (_excessive = false) => {
10350
10288
  const changeJudgeCharacter = (_name, _character, _fjdg = ``) => {
10351
10289
  g_resultObj[_name]++;
10352
10290
  g_currentArrows++;
10353
- document.querySelector(`#chara${_fjdg}J`).innerHTML = `<span class="common_${_name}">${_character}</span>`;
10354
- document.querySelector(`#chara${_fjdg}J`).setAttribute(`cnt`, C_FRM_JDGMOTION);
10355
- document.querySelector(`#lbl${toCapitalize(_name)}`).textContent = g_resultObj[_name];
10291
+ document.getElementById(`chara${_fjdg}J`).innerHTML = `<span class="common_${_name}">${_character}</span>`;
10292
+ document.getElementById(`chara${_fjdg}J`).setAttribute(`cnt`, C_FRM_JDGMOTION);
10293
+ document.getElementById(`lbl${toCapitalize(_name)}`).textContent = g_resultObj[_name];
10356
10294
  };
10357
10295
 
10358
10296
  /**
@@ -10482,7 +10420,7 @@ const makeFinishView = _text => {
10482
10420
  finishView.innerHTML = _text;
10483
10421
  finishView.style.opacity = 1;
10484
10422
  [`charaJ`, `comboJ`, `diffJ`, `charaFJ`, `comboFJ`, `diffFJ`].forEach(label =>
10485
- document.querySelector(`#${label}`).textContent = ``);
10423
+ document.getElementById(label).textContent = ``);
10486
10424
  };
10487
10425
 
10488
10426
  const finishViewing = _ => {
@@ -10521,7 +10459,7 @@ const resultInit = _ => {
10521
10459
  g_scoreObj[`${sprite}ResultLoopCount`] = 0;
10522
10460
  });
10523
10461
 
10524
- const divRoot = document.querySelector(`#divRoot`);
10462
+ const divRoot = document.getElementById(`divRoot`);
10525
10463
 
10526
10464
  // 曲時間制御変数
10527
10465
  let thisTime;
@@ -10782,7 +10720,7 @@ const resultInit = _ => {
10782
10720
 
10783
10721
  } else {
10784
10722
  resultWindow.appendChild(makeCssResultSymbol(`lblAutoView`, 215, g_cssObj.result_noRecord, 4, `(No Record)`));
10785
- const lblAutoView = document.querySelector(`#lblAutoView`);
10723
+ const lblAutoView = document.getElementById(`lblAutoView`);
10786
10724
  lblAutoView.style.fontSize = wUnit(20);
10787
10725
  }
10788
10726
 
@@ -10815,8 +10753,8 @@ const resultInit = _ => {
10815
10753
  jdgScore.pos, `)`),
10816
10754
  );
10817
10755
  } else {
10818
- document.querySelector(`#lbl${jdgScore.id}L1`).textContent = `(${highscoreDfObj[score] >= 0 ? "+" : "-"}`;
10819
- document.querySelector(`#lbl${jdgScore.id}LS`).textContent = Math.abs(highscoreDfObj[score]);
10756
+ document.getElementById(`lbl${jdgScore.id}L1`).textContent = `(${highscoreDfObj[score] >= 0 ? "+" : "-"}`;
10757
+ document.getElementById(`lbl${jdgScore.id}LS`).textContent = Math.abs(highscoreDfObj[score]);
10820
10758
  }
10821
10759
  });
10822
10760
 
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Source by tickle
7
7
  * Created : 2019/11/19
8
- * Revised : 2023/10/29 (v34.4.0)
8
+ * Revised : 2023/10/31 (v34.4.1)
9
9
  *
10
10
  * https://github.com/cwtickle/danoniplus
11
11
  */
@@ -1361,6 +1361,13 @@ const g_kCdNameObj = {
1361
1361
  shiftRKey: `ShiftRight`,
1362
1362
  metaLKey: `MetaLeft`,
1363
1363
  metaRKey: `MetaRight`,
1364
+ unknownKey: `Unknown`,
1365
+ };
1366
+
1367
+ const g_kCdObj = {
1368
+ unknown: 1,
1369
+ shiftRkey: 256,
1370
+ shiftRAltKey: 260,
1364
1371
  };
1365
1372
 
1366
1373
  // 画面別ショートカット
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "danoniplus",
3
- "version": "34.4.0",
3
+ "version": "34.4.2",
4
4
  "description": "Dancing☆Onigiri (CW Edition) - Web-based Rhythm Game",
5
5
  "main": "index.js",
6
6
  "scripts": {