danoniplus 30.6.0 → 31.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/js/danoni_main.js CHANGED
@@ -4,12 +4,12 @@
4
4
  *
5
5
  * Source by tickle
6
6
  * Created : 2018/10/08
7
- * Revised : 2023/03/18
7
+ * Revised : 2023/03/20
8
8
  *
9
9
  * https://github.com/cwtickle/danoniplus
10
10
  */
11
- const g_version = `Ver 30.6.0`;
12
- const g_revisedDate = `2023/03/18`;
11
+ const g_version = `Ver 31.0.0`;
12
+ const g_revisedDate = `2023/03/20`;
13
13
  const g_alphaVersion = ``;
14
14
 
15
15
  // カスタム用バージョン (danoni_custom.js 等で指定可)
@@ -2023,11 +2023,12 @@ const loadLocalStorage = _ => {
2023
2023
  if (checkStorage) {
2024
2024
  g_localStorage = JSON.parse(checkStorage);
2025
2025
 
2026
- // Adjustment, Volume, Appearance, Opacity初期値設定
2027
- checkLocalParam(`adjustment`, C_TYP_FLOAT, C_MAX_ADJUSTMENT);
2026
+ // Adjustment, Volume, Appearance, Opacity, hitPosition初期値設定
2027
+ checkLocalParam(`adjustment`, C_TYP_FLOAT, g_settings.adjustmentNum);
2028
2028
  checkLocalParam(`volume`, C_TYP_NUMBER, g_settings.volumes.length - 1);
2029
2029
  checkLocalParam(`appearance`);
2030
2030
  checkLocalParam(`opacity`, C_TYP_NUMBER, g_settings.opacitys.length - 1);
2031
+ checkLocalParam(`hitPosition`, C_TYP_FLOAT, g_settings.hitPositionNum);
2031
2032
 
2032
2033
  // ハイスコア取得準備
2033
2034
  if (g_localStorage.highscores === undefined) {
@@ -2044,6 +2045,7 @@ const loadLocalStorage = _ => {
2044
2045
  } else {
2045
2046
  g_localStorage = {
2046
2047
  adjustment: 0,
2048
+ hitPosition: 0,
2047
2049
  volume: 100,
2048
2050
  highscores: {},
2049
2051
  };
@@ -2459,6 +2461,7 @@ const preheaderConvert = _dosObj => {
2459
2461
  }
2460
2462
 
2461
2463
  obj.jsData = [];
2464
+ obj.stepRtnUse = true;
2462
2465
 
2463
2466
  const setJsFiles = (_files, _defaultDir, _type = `custom`) => {
2464
2467
  _files.forEach(file => {
@@ -3502,9 +3505,9 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3502
3505
  }
3503
3506
  const keyPtn = getKeyPtnName(tmpArray[k]);
3504
3507
  g_keyObj[`${keyheader}_${k + dfPtn}`] = g_keyObj[`${_name}${keyPtn}`] !== undefined ?
3505
- copyArray2d(g_keyObj[`${_name}${keyPtn}`]) : tmpArray[k].split(`,`).map(n => _convFunc(n));
3508
+ structuredClone(g_keyObj[`${_name}${keyPtn}`]) : tmpArray[k].split(`,`).map(n => _convFunc(n));
3506
3509
  if (baseCopyFlg) {
3507
- g_keyObj[`${keyheader}_${k + dfPtn}d`] = copyArray2d(g_keyObj[`${keyheader}_${k + dfPtn}`]);
3510
+ g_keyObj[`${keyheader}_${k + dfPtn}d`] = structuredClone(g_keyObj[`${keyheader}_${k + dfPtn}`]);
3508
3511
  }
3509
3512
  loopFunc(k, keyheader);
3510
3513
  }
@@ -3549,7 +3552,7 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3549
3552
  }
3550
3553
  } else {
3551
3554
  // 通常の指定方法 (例: |shuffle8i=1,1,1,2,0,0,0,0/1,1,1,1,0,0,0,0| )の場合の取り込み
3552
- g_keyObj[`${keyheader}_${k + dfPtn}_${ptnCnt}`] = list.split(`,`).map(n => parseInt(n, 10));
3555
+ g_keyObj[`${keyheader}_${k + dfPtn}_${ptnCnt}`] = list.split(`,`).map(n => isNaN(Number(n)) ? n : parseInt(n, 10));
3553
3556
  ptnCnt++;
3554
3557
  }
3555
3558
  });
@@ -3653,7 +3656,7 @@ const keysConvert = (_dosObj, { keyExtraList = _dosObj.keyExtraList.split(`,`) }
3653
3656
  newKeyTripleParam(newKey, `color`);
3654
3657
 
3655
3658
  // 矢印の回転量指定、キャラクタパターン (stepRtnX_Y)
3656
- newKeyMultiParam(newKey, `stepRtn`, toStringOrNumber, { errCd: `E_0103` });
3659
+ newKeyTripleParam(newKey, `stepRtn`);
3657
3660
 
3658
3661
  // キーコンフィグ (keyCtrlX_Y)
3659
3662
  newKeyMultiParam(newKey, `keyCtrl`, toKeyCtrlArray, { errCd: `E_0104`, baseCopyFlg: true });
@@ -4242,9 +4245,9 @@ const createOptionWindow = _sprite => {
4242
4245
  [`shuffle`, 5.5, 0, 0, 0],
4243
4246
  [`autoPlay`, 6.5, 0, 0, 0],
4244
4247
  [`gauge`, 7.5, 0, 0, 0],
4245
- [`adjustment`, 10, 0, 0, 0],
4246
- [`fadein`, 11, 0, 0, 0],
4247
- [`volume`, 12, 0, 0, 0],
4248
+ [`adjustment`, 10.5, 0, 0, 0],
4249
+ [`fadein`, 11.5, 0, 0, 0],
4250
+ [`volume`, 12.5, 0, 0, 0],
4248
4251
  ];
4249
4252
 
4250
4253
  // 設定毎に個別のスプライトを作成し、その中にラベル・ボタン類を配置
@@ -4918,7 +4921,7 @@ const createOptionWindow = _sprite => {
4918
4921
  g_gaugeType = (g_gaugeOptionObj.custom.length > 0 ? C_LFE_CUSTOM : g_stateObj.lifeMode);
4919
4922
 
4920
4923
  g_stateObj.lifeVariable = g_gaugeOptionObj[`var${g_gaugeType}`][_gaugeNum];
4921
- g_settings.gauges = copyArray2d(g_gaugeOptionObj[g_gaugeType.toLowerCase()]);
4924
+ g_settings.gauges = structuredClone(g_gaugeOptionObj[g_gaugeType.toLowerCase()]);
4922
4925
  g_stateObj.gauge = g_settings.gauges[g_settings.gaugeNum];
4923
4926
  }
4924
4927
  setLifeCategory(g_headerObj);
@@ -5020,7 +5023,7 @@ const createOptionWindow = _sprite => {
5020
5023
 
5021
5024
  // ---------------------------------------------------
5022
5025
  // タイミング調整 (Adjustment)
5023
- // 縦位置: 10 短縮ショートカットあり
5026
+ // 縦位置: 10.5 短縮ショートカットあり
5024
5027
  createGeneralSetting(spriteList.adjustment, `adjustment`, {
5025
5028
  skipTerms: g_settings.adjustmentTerms, hiddenBtn: true, scLabel: g_lblNameObj.sc_adjustment, roundNum: 5,
5026
5029
  unitName: g_lblNameObj.frame,
@@ -5028,7 +5031,7 @@ const createOptionWindow = _sprite => {
5028
5031
 
5029
5032
  // ---------------------------------------------------
5030
5033
  // フェードイン (Fadein)
5031
- // 縦位置: 11 スライダーあり
5034
+ // 縦位置: 11.5 スライダーあり
5032
5035
  spriteList.fadein.appendChild(createLblSetting(`Fadein`));
5033
5036
 
5034
5037
  const lnkFadein = createDivCss2Label(`lnkFadein`, `${g_stateObj.fadein}${g_lblNameObj.percent}`,
@@ -5059,7 +5062,7 @@ const createOptionWindow = _sprite => {
5059
5062
 
5060
5063
  // ---------------------------------------------------
5061
5064
  // ボリューム (Volume)
5062
- // 縦位置: 12
5065
+ // 縦位置: 12.5
5063
5066
  createGeneralSetting(spriteList.volume, `volume`, { unitName: g_lblNameObj.percent });
5064
5067
 
5065
5068
  /**
@@ -5169,7 +5172,7 @@ const createOptionWindow = _sprite => {
5169
5172
  }
5170
5173
 
5171
5174
  // スクロール設定用の配列を入れ替え
5172
- g_settings.scrolls = copyArray2d(
5175
+ g_settings.scrolls = structuredClone(
5173
5176
  typeof g_keyObj[`scrollDir${g_keyObj.currentKey}_${g_keyObj.currentPtn}`] === C_TYP_OBJECT ?
5174
5177
  Object.keys(g_keyObj[`scrollDir${g_keyObj.currentKey}_${g_keyObj.currentPtn}`]) : g_keyObj.scrollName_def
5175
5178
  );
@@ -5228,7 +5231,7 @@ const createOptionWindow = _sprite => {
5228
5231
  setReverseView(document.querySelector(`#btnReverse`));
5229
5232
  }
5230
5233
  } else {
5231
- g_settings.scrolls = copyArray2d(g_keyObj.scrollName_def);
5234
+ g_settings.scrolls = structuredClone(g_keyObj.scrollName_def);
5232
5235
  setSetting(0, `reverse`);
5233
5236
  }
5234
5237
 
@@ -5265,12 +5268,12 @@ const createOptionWindow = _sprite => {
5265
5268
  */
5266
5269
  const createGeneralSetting = (_obj, _settingName, { unitName = ``,
5267
5270
  skipTerms = [...Array(3)].fill(1), hiddenBtn = false, addRFunc = _ => { }, addLFunc = _ => { },
5268
- settingLabel = _settingName, displayName = `option`, scLabel = ``, roundNum = 0 } = {}) => {
5271
+ settingLabel = _settingName, displayName = g_currentPage, scLabel = ``, roundNum = 0, adjY = 0 } = {}) => {
5269
5272
 
5270
5273
  const settingUpper = toCapitalize(_settingName);
5271
5274
  const linkId = `lnk${settingUpper}`;
5272
5275
  const initName = `${getStgDetailName(g_stateObj[_settingName])}${unitName}`;
5273
- _obj.appendChild(createLblSetting(settingUpper, 0, toCapitalize(settingLabel)));
5276
+ _obj.appendChild(createLblSetting(settingUpper, adjY, toCapitalize(settingLabel)));
5274
5277
 
5275
5278
  if (g_headerObj[`${_settingName}Use`] === undefined || g_headerObj[`${_settingName}Use`]) {
5276
5279
 
@@ -5445,7 +5448,7 @@ const getKeyCtrl = (_localStorage, _extraKeyName = ``) => {
5445
5448
  const isUpdate = prevPtn !== -1 && g_keyObj.prevKey !== g_keyObj.currentKey;
5446
5449
  g_keyCopyLists.multiple.forEach(header => {
5447
5450
  if (g_keyObj[`${header}${basePtn}`] !== undefined && isUpdate) {
5448
- g_keyObj[`${header}${copyPtn}`] = copyArray2d(g_keyObj[`${header}${basePtn}`]);
5451
+ g_keyObj[`${header}${copyPtn}`] = structuredClone(g_keyObj[`${header}${basePtn}`]);
5449
5452
  }
5450
5453
  });
5451
5454
  g_keyCopyLists.simple.forEach(header => {
@@ -5458,7 +5461,7 @@ const getKeyCtrl = (_localStorage, _extraKeyName = ``) => {
5458
5461
  maxPtn++;
5459
5462
  }
5460
5463
  for (let j = 0; j < maxPtn; j++) {
5461
- g_keyObj[`${type}${copyPtn}_${j}`] = copyArray2d(g_keyObj[`${type}${basePtn}_${j}`]);
5464
+ g_keyObj[`${type}${copyPtn}_${j}`] = structuredClone(g_keyObj[`${type}${basePtn}_${j}`]);
5462
5465
  }
5463
5466
  g_keyObj[`${type}${copyPtn}_0d`] = structuredClone(g_keyObj[`${type}${copyPtn}_0`]);
5464
5467
  });
@@ -5637,6 +5640,7 @@ const createSettingsDisplayWindow = _sprite => {
5637
5640
  const settingList = [
5638
5641
  [`appearance`, 7.4, 10, 0, 0],
5639
5642
  [`opacity`, 9, 10, 0, 0],
5643
+ [`hitPosition`, 10, 10, 0, 0],
5640
5644
  ];
5641
5645
 
5642
5646
  // 設定毎に個別のスプライトを作成し、その中にラベル・ボタン類を配置
@@ -5650,7 +5654,6 @@ const createSettingsDisplayWindow = _sprite => {
5650
5654
  // 矢印の見え方 (Appearance)
5651
5655
  // 縦位置: 7.4
5652
5656
  createGeneralSetting(spriteList.appearance, `appearance`, {
5653
- displayName: g_currentPage,
5654
5657
  addRFunc: _ => dispAppearanceSlider(),
5655
5658
  addLFunc: _ => dispAppearanceSlider(),
5656
5659
  });
@@ -5694,8 +5697,16 @@ const createSettingsDisplayWindow = _sprite => {
5694
5697
  opacityUse ||= g_headerObj[`${display}Use`] || g_headerObj[`${display}Set`] === C_FLG_ON);
5695
5698
 
5696
5699
  if (opacityUse) {
5697
- createGeneralSetting(spriteList.opacity, `opacity`, { unitName: g_lblNameObj.percent, displayName: g_currentPage });
5700
+ createGeneralSetting(spriteList.opacity, `opacity`, { unitName: g_lblNameObj.percent });
5698
5701
  }
5702
+
5703
+ // ---------------------------------------------------
5704
+ // タイミング調整 (HitPosition)
5705
+ // 縦位置: 10
5706
+ createGeneralSetting(spriteList.hitPosition, `hitPosition`, {
5707
+ skipTerms: g_settings.hitPositionTerms, scLabel: g_lblNameObj.sc_hitPosition, roundNum: 5,
5708
+ unitName: g_lblNameObj.pixel,
5709
+ });
5699
5710
  };
5700
5711
 
5701
5712
  /**
@@ -5885,11 +5896,11 @@ const keyConfigInit = (_kcType = g_kcType) => {
5885
5896
  // 矢印の塗り部分
5886
5897
  createColorObject2(`arrowShadow${j}`, {
5887
5898
  x: keyconX, y: keyconY, background: hasVal(g_headerObj[`setShadowColor${g_colorType}`][colorPos]) ? getShadowColor(colorPos, arrowColor) : ``,
5888
- rotate: g_keyObj[`stepRtn${keyCtrlPtn}`][j], styleName: `Shadow`, pointerEvents: `none`,
5899
+ rotate: g_keyObj[`stepRtn${keyCtrlPtn}_${g_keycons.stepRtnGroupNum}`][j], styleName: `Shadow`, pointerEvents: `none`,
5889
5900
  }),
5890
5901
  // 矢印本体
5891
5902
  createColorObject2(`arrow${j}`, {
5892
- x: keyconX, y: keyconY, background: arrowColor, rotate: g_keyObj[`stepRtn${keyCtrlPtn}`][j], pointerEvents: `none`,
5903
+ x: keyconX, y: keyconY, background: arrowColor, rotate: g_keyObj[`stepRtn${keyCtrlPtn}_${g_keycons.stepRtnGroupNum}`][j], pointerEvents: `none`,
5893
5904
  }),
5894
5905
  );
5895
5906
  if (g_headerObj.shuffleUse && g_keyObj[`shuffle${keyCtrlPtn}`] !== undefined) {
@@ -5955,6 +5966,7 @@ const keyConfigInit = (_kcType = g_kcType) => {
5955
5966
  }
5956
5967
  }
5957
5968
  },
5969
+ stepRtn: (_type = ``) => { },
5958
5970
  };
5959
5971
 
5960
5972
  /**
@@ -5979,6 +5991,9 @@ const keyConfigInit = (_kcType = g_kcType) => {
5979
5991
  g_keycons[`${_type}GroupNum`] = g_keycons[`${_type}Groups`][getNextNum(_scrollNum, `${_type}Groups`, g_keycons[`${_type}GroupNum`])];
5980
5992
  g_keyObj[`${_type}${keyCtrlPtn}`] = structuredClone(g_keyObj[`${_type}${keyCtrlPtn}_${g_keycons[`${_type}GroupNum`]}`]);
5981
5993
  viewGroup(_type);
5994
+ if (_type === `stepRtn`) {
5995
+ keyConfigInit(g_kcType);
5996
+ }
5982
5997
  };
5983
5998
 
5984
5999
  /**
@@ -6028,16 +6043,16 @@ const keyConfigInit = (_kcType = g_kcType) => {
6028
6043
  * @param {string} _type
6029
6044
  * @param {object} obj (baseX)
6030
6045
  */
6031
- const makeGroupButton = (_type, { baseX = g_sWidth * 5 / 6 - 20, cssName } = {}) => {
6046
+ const makeGroupButton = (_type, { baseX = g_sWidth * 5 / 6 - 20, baseY = 0, cssName } = {}) => {
6032
6047
  if (g_headerObj[`${_type}Use`] && g_keycons[`${_type}Groups`].length > 1) {
6033
6048
  const typeName = toCapitalize(_type);
6034
6049
  multiAppend(divRoot,
6035
- makeKCButtonHeader(`lbl${_type}Group`, `${typeName}Group`, { x: baseX - 10, y: 37 }, cssName),
6050
+ makeKCButtonHeader(`lbl${_type}Group`, `${typeName}Group`, { x: baseX - 10, y: baseY }, cssName),
6036
6051
  makeKCButton(`lnk${typeName}Group`, ``, _ => setGroup(_type), {
6037
- x: baseX, y: 50, w: g_sWidth / 18, title: g_msgObj[`${_type}Group`], cxtFunc: _ => setGroup(_type, -1),
6052
+ x: baseX, y: baseY + 13, w: g_sWidth / 18, title: g_msgObj[`${_type}Group`], cxtFunc: _ => setGroup(_type, -1),
6038
6053
  }),
6039
- makeMiniKCButton(`lnk${typeName}Group`, `L`, _ => setGroup(_type, -1), { x: baseX - 10, y: 50 }),
6040
- makeMiniKCButton(`lnk${typeName}Group`, `R`, _ => setGroup(_type), { x: baseX + g_sWidth / 18, y: 50 }),
6054
+ makeMiniKCButton(`lnk${typeName}Group`, `L`, _ => setGroup(_type, -1), { x: baseX - 10, y: baseY + 13 }),
6055
+ makeMiniKCButton(`lnk${typeName}Group`, `R`, _ => setGroup(_type), { x: baseX + g_sWidth / 18, y: baseY + 13 }),
6041
6056
  );
6042
6057
  } else {
6043
6058
  g_keycons[`${_type}GroupNum`] = 0;
@@ -6058,19 +6073,13 @@ const keyConfigInit = (_kcType = g_kcType) => {
6058
6073
  g_lblPosObj.kcMsg, g_cssObj.keyconfig_warning
6059
6074
  ),
6060
6075
 
6061
- // キーコンフィグタイプ切替ボタン
6062
- makeKCButtonHeader(`lblKcType`, `ConfigType`, { x: 10 }, g_cssObj.keyconfig_ConfigType),
6063
- makeKCButton(`lnkKcType`, g_kcType, _ => setConfigType(), {
6064
- x: 20, title: g_msgObj.configType, cxtFunc: _ => setConfigType(-1),
6065
- }),
6066
-
6067
6076
  // キーカラータイプ切替ボタン
6068
- makeKCButtonHeader(`lblcolorType`, `ColorType`, {}, g_cssObj.keyconfig_ColorType),
6077
+ makeKCButtonHeader(`lblcolorType`, `ColorType`, { x: 10 }, g_cssObj.keyconfig_ColorType),
6069
6078
  makeKCButton(`lnkColorType`, g_colorType, _ => setColorType(), {
6070
- title: g_msgObj.colorType, cxtFunc: _ => setColorType(-1),
6079
+ x: 20, title: g_msgObj.colorType, cxtFunc: _ => setColorType(-1),
6071
6080
  }),
6072
- makeMiniKCButton(`lnkColorType`, `L`, _ => setColorType(-1)),
6073
- makeMiniKCButton(`lnkColorType`, `R`, _ => setColorType(), { x: g_sWidth - 20 }),
6081
+ makeMiniKCButton(`lnkColorType`, `L`, _ => setColorType(-1), { x: 10 }),
6082
+ makeMiniKCButton(`lnkColorType`, `R`, _ => setColorType(), { x: 20 + g_sWidth / 6 }),
6074
6083
  );
6075
6084
 
6076
6085
  if (g_headerObj.imgType.length > 1) {
@@ -6089,6 +6098,7 @@ const keyConfigInit = (_kcType = g_kcType) => {
6089
6098
  // カラー/シャッフルグループ切替ボタン(カラー/シャッフルパターンが複数ある場合のみ)
6090
6099
  makeGroupButton(`color`, { cssName: g_cssObj.keyconfig_ColorType });
6091
6100
  makeGroupButton(`shuffle`, { baseX: g_sWidth * 11 / 12 - 10, cssName: g_cssObj.settings_Shuffle });
6101
+ makeGroupButton(`stepRtn`, { baseY: 37, cssName: g_cssObj.settings_Adjustment });
6092
6102
 
6093
6103
  /**
6094
6104
  * カーソル位置の設定
@@ -6101,10 +6111,7 @@ const keyConfigInit = (_kcType = g_kcType) => {
6101
6111
  cursor.style.left = `${nextLeft}px`;
6102
6112
  const baseY = C_KYC_HEIGHT * Number(posj > divideCnt) + 57;
6103
6113
  cursor.style.top = `${baseY + C_KYC_REPHEIGHT * g_currentk}px`;
6104
- if (g_kcType !== C_FLG_ALL) {
6105
- g_kcType = (g_currentk === 0 ? `Main` : `Replaced`);
6106
- lnkKcType.textContent = getStgDetailName(g_kcType);
6107
- }
6114
+ g_kcType = (g_currentk === 0 ? `Main` : `Replaced`);
6108
6115
 
6109
6116
  // 次の位置が見えなくなったらkeyconSpriteの位置を調整する
6110
6117
  adjustScrollPoint(nextLeft);
@@ -6152,7 +6159,6 @@ const keyConfigInit = (_kcType = g_kcType) => {
6152
6159
  const setConfigType = (_scrollNum = 1) => {
6153
6160
  g_kcType = g_keycons.configTypes[getNextNum(_scrollNum, `configTypes`, g_kcType)];
6154
6161
  changeConfigCursor(g_keycons.cursorNum);
6155
- lnkKcType.textContent = getStgDetailName(g_kcType);
6156
6162
  };
6157
6163
 
6158
6164
  /**
@@ -6539,12 +6545,12 @@ const changeSetColor = _ => {
6539
6545
  'Shadow': (isDefault ? defaultType : `${scoreIdHeader}Default`),
6540
6546
  };
6541
6547
  Object.keys(currentTypes).forEach(pattern => {
6542
- g_headerObj[`set${pattern}Color`] = copyArray2d(g_headerObj[`set${pattern}Color${currentTypes[pattern]}`]);
6548
+ g_headerObj[`set${pattern}Color`] = structuredClone(g_headerObj[`set${pattern}Color${currentTypes[pattern]}`]);
6543
6549
  for (let j = 0; j < g_headerObj.setColorInit.length; j++) {
6544
- g_headerObj[`frz${pattern}Color`][j] = copyArray2d(g_headerObj[`frz${pattern}Color${currentTypes[pattern]}`][j]);
6550
+ g_headerObj[`frz${pattern}Color`][j] = structuredClone(g_headerObj[`frz${pattern}Color${currentTypes[pattern]}`][j]);
6545
6551
  }
6546
6552
  if (!isDefault) {
6547
- g_headerObj[`set${pattern}Color`] = copyArray2d(g_headerObj[`set${pattern}Color${g_colorType}`]);
6553
+ g_headerObj[`set${pattern}Color`] = structuredClone(g_headerObj[`set${pattern}Color${g_colorType}`]);
6548
6554
  }
6549
6555
  });
6550
6556
 
@@ -6787,7 +6793,7 @@ const loadingScoreInit = async () => {
6787
6793
 
6788
6794
  // Motionオプション適用時の矢印別の速度を取得(配列形式)
6789
6795
  const motionOnFrame = setMotionOnFrame();
6790
- g_workObj.motionOnFrames = copyArray2d(motionOnFrame);
6796
+ g_workObj.motionOnFrames = structuredClone(motionOnFrame);
6791
6797
 
6792
6798
  // 最初のフレームで出現する矢印が、ステップゾーンに到達するまでのフレーム数を取得
6793
6799
  const firstFrame = (g_scoreObj.frameNum === 0 ? 0 : g_scoreObj.frameNum + g_headerObj.blankFrame);
@@ -6803,8 +6809,8 @@ const loadingScoreInit = async () => {
6803
6809
  // フレーム・曲開始位置調整
6804
6810
  let preblankFrame = 0;
6805
6811
  if (g_scoreObj.frameNum === 0) {
6806
- if (firstArrowFrame - C_MAX_ADJUSTMENT < arrivalFrame) {
6807
- preblankFrame = arrivalFrame - firstArrowFrame + C_MAX_ADJUSTMENT;
6812
+ if (firstArrowFrame - g_limitObj.adjustment < arrivalFrame) {
6813
+ preblankFrame = arrivalFrame - firstArrowFrame + g_limitObj.adjustment;
6808
6814
 
6809
6815
  // 譜面データの再読み込み
6810
6816
  const noteExistObj = {
@@ -6817,7 +6823,7 @@ const loadingScoreInit = async () => {
6817
6823
  for (let j = 0; j < keyNum; j++) {
6818
6824
  Object.keys(noteExistObj).forEach(name => {
6819
6825
  if (tmpObj[`${name}Data`][j] !== undefined && noteExistObj[name]) {
6820
- g_scoreObj[`${name}Data`][j] = copyArray2d(tmpObj[`${name}Data`][j]);
6826
+ g_scoreObj[`${name}Data`][j] = structuredClone(tmpObj[`${name}Data`][j]);
6821
6827
  }
6822
6828
  });
6823
6829
  }
@@ -6936,7 +6942,7 @@ const applyShuffle = (_keyNum, _shuffleGroup, _style) => {
6936
6942
 
6937
6943
  // indexに従って並べ替え
6938
6944
  g_typeLists.arrow.forEach(type => {
6939
- const tmpData = copyArray2d(g_scoreObj[`${type}Data`]);
6945
+ const tmpData = structuredClone(g_scoreObj[`${type}Data`]);
6940
6946
  for (let i = 0; i < _keyNum; i++) {
6941
6947
  g_scoreObj[`${type}Data`][i] = tmpData[index[i]] || [];
6942
6948
  }
@@ -6950,7 +6956,7 @@ const applyShuffle = (_keyNum, _shuffleGroup, _style) => {
6950
6956
  */
6951
6957
  const applyMirror = (_keyNum, _shuffleGroup, _asymFlg = false) => {
6952
6958
  // シャッフルグループごとにミラー
6953
- const style = copyArray2d(_shuffleGroup).map(_group => _group.reverse());
6959
+ const style = structuredClone(_shuffleGroup).map(_group => _group.reverse());
6954
6960
  if (_asymFlg) {
6955
6961
  // グループが4の倍数のとき、4n+1, 4n+2のみ入れ替える
6956
6962
  style.forEach((group, i) => {
@@ -6971,7 +6977,7 @@ const applyMirror = (_keyNum, _shuffleGroup, _asymFlg = false) => {
6971
6977
  */
6972
6978
  const applyRandom = (_keyNum, _shuffleGroup) => {
6973
6979
  // シャッフルグループごとにシャッフル(Fisher-Yates)
6974
- const style = copyArray2d(_shuffleGroup).map(_group => {
6980
+ const style = structuredClone(_shuffleGroup).map(_group => {
6975
6981
  for (let i = _group.length - 1; i > 0; i--) {
6976
6982
  const random = Math.floor(Math.random() * (i + 1));
6977
6983
  const tmp = _group[i];
@@ -7559,7 +7565,7 @@ const getFirstArrowFrame = (_dataObj, _keyCtrlPtn = `${g_keyObj.currentKey}_${g_
7559
7565
 
7560
7566
  data.filter(data => hasVal(data)).forEach(_objData => {
7561
7567
  if (_objData[0] !== ``) {
7562
- if (_objData[0] < tmpFirstNum && _objData[0] + C_MAX_ADJUSTMENT > 0) {
7568
+ if (_objData[0] < tmpFirstNum && _objData[0] + g_limitObj.adjustment > 0) {
7563
7569
  tmpFirstNum = _objData[0];
7564
7570
  }
7565
7571
  }
@@ -7706,7 +7712,7 @@ const pushArrows = (_dataObj, _speedOnFrame, _motionOnFrame, _firstArrivalFrame)
7706
7712
  g_workObj[`mk${_header}Length`][_j][_k] = getFrzLength(_speedOnFrame, _data[_k], _data[_k + 1]);
7707
7713
  }
7708
7714
  } else if (_frzFlg && g_workObj[`mk${_header}Length`][_j] !== undefined) {
7709
- g_workObj[`mk${_header}Length`][_j] = copyArray2d(g_workObj[`mk${_header}Length`][_j].slice(_k + 2));
7715
+ g_workObj[`mk${_header}Length`][_j] = structuredClone(g_workObj[`mk${_header}Length`][_j].slice(_k + 2));
7710
7716
  }
7711
7717
  };
7712
7718
 
@@ -7747,7 +7753,7 @@ const pushArrows = (_dataObj, _speedOnFrame, _motionOnFrame, _firstArrivalFrame)
7747
7753
 
7748
7754
  // 出現位置が開始前の場合は除外
7749
7755
  if (_frzFlg && g_workObj[`mk${camelHeader}Length`][_j] !== undefined) {
7750
- g_workObj[`mk${camelHeader}Length`][_j] = copyArray2d(g_workObj[`mk${camelHeader}Length`][_j].slice(k + 2));
7756
+ g_workObj[`mk${camelHeader}Length`][_j] = structuredClone(g_workObj[`mk${camelHeader}Length`][_j].slice(k + 2));
7751
7757
  }
7752
7758
  break;
7753
7759
 
@@ -7813,7 +7819,7 @@ const pushArrows = (_dataObj, _speedOnFrame, _motionOnFrame, _firstArrivalFrame)
7813
7819
  for (let k = 0; k < delIdx; k++) {
7814
7820
  _data.shift();
7815
7821
  }
7816
- return copyArray2d(_data);
7822
+ return structuredClone(_data);
7817
7823
  }
7818
7824
  return [];
7819
7825
  };
@@ -8229,10 +8235,10 @@ const getArrowSettings = _ => {
8229
8235
  g_workObj.scrollDir = [];
8230
8236
  g_workObj.scrollDirDefault = [];
8231
8237
  g_workObj.dividePos = [];
8232
- g_workObj.stepRtn = copyArray2d(g_keyObj[`stepRtn${keyCtrlPtn}`]);
8233
- g_workObj.stepHitRtn = copyArray2d(g_keyObj[`stepRtn${keyCtrlPtn}`]);
8234
- g_workObj.arrowRtn = copyArray2d(g_keyObj[`stepRtn${keyCtrlPtn}`]);
8235
- g_workObj.keyCtrl = copyArray2d(g_keyObj[`keyCtrl${keyCtrlPtn}`]);
8238
+ g_workObj.stepRtn = structuredClone(g_keyObj[`stepRtn${keyCtrlPtn}`]);
8239
+ g_workObj.stepHitRtn = structuredClone(g_keyObj[`stepRtn${keyCtrlPtn}`]);
8240
+ g_workObj.arrowRtn = structuredClone(g_keyObj[`stepRtn${keyCtrlPtn}`]);
8241
+ g_workObj.keyCtrl = structuredClone(g_keyObj[`keyCtrl${keyCtrlPtn}`]);
8236
8242
  g_workObj.diffList = [];
8237
8243
  g_workObj.mainEndTime = 0;
8238
8244
 
@@ -8275,6 +8281,7 @@ const getArrowSettings = _ => {
8275
8281
  g_keyObj[`scrollDir${keyCtrlPtn}`][g_stateObj.scroll] : [...Array(keyNum)].fill(1));
8276
8282
 
8277
8283
  g_stateObj.autoAll = (g_stateObj.autoPlay === C_FLG_ALL ? C_FLG_ON : C_FLG_OFF);
8284
+ g_workObj.hitPosition = (g_stateObj.autoAll ? 0 : g_stateObj.hitPosition);
8278
8285
  changeSetColor();
8279
8286
 
8280
8287
  for (let j = 0; j < keyNum; j++) {
@@ -8319,8 +8326,9 @@ const getArrowSettings = _ => {
8319
8326
  // 次回キーコンフィグ画面へ戻ったとき、保存済みキーコンフィグ設定が表示されるようにする
8320
8327
  g_keyObj.prevKey = `Dummy`;
8321
8328
 
8322
- // ローカルストレージへAdjustment, Volume, Display関連設定を保存
8329
+ // ローカルストレージへAdjustment, hitPosition, Volume, colorType設定を保存
8323
8330
  g_localStorage.adjustment = g_stateObj.adjustment;
8331
+ g_localStorage.hitPosition = g_stateObj.hitPosition;
8324
8332
  g_localStorage.volume = g_stateObj.volume;
8325
8333
  g_localStorage.colorType = g_colorType;
8326
8334
 
@@ -8338,7 +8346,7 @@ const getArrowSettings = _ => {
8338
8346
  storageObj[`keyCtrl${addKey}`] = setKeyCtrl(g_localKeyStorage, keyNum, keyCtrlPtn);
8339
8347
  if (g_keyObj.currentPtn !== -1) {
8340
8348
  storageObj[`keyCtrlPtn${addKey}`] = g_keyObj.currentPtn;
8341
- g_keyObj[`keyCtrl${keyCtrlPtn}`] = copyArray2d(g_keyObj[`keyCtrl${keyCtrlPtn}d`]);
8349
+ g_keyObj[`keyCtrl${keyCtrlPtn}`] = structuredClone(g_keyObj[`keyCtrl${keyCtrlPtn}d`]);
8342
8350
  }
8343
8351
 
8344
8352
  // カラーセットの保存(キー別)
@@ -8543,8 +8551,8 @@ const mainInit = _ => {
8543
8551
 
8544
8552
  // 矢印・フリーズアロー描画スプライト(ステップゾーンの上に配置)
8545
8553
  const arrowSprite = [
8546
- createEmptySprite(mainSprite, `arrowSprite0`, { w: g_headerObj.playingWidth, h: g_posObj.arrowHeight }),
8547
- createEmptySprite(mainSprite, `arrowSprite1`, { w: g_headerObj.playingWidth, h: g_posObj.arrowHeight }),
8554
+ createEmptySprite(mainSprite, `arrowSprite0`, { y: g_workObj.hitPosition, w: g_headerObj.playingWidth, h: g_posObj.arrowHeight }),
8555
+ createEmptySprite(mainSprite, `arrowSprite1`, { y: -g_workObj.hitPosition, w: g_headerObj.playingWidth, h: g_posObj.arrowHeight }),
8548
8556
  ];
8549
8557
 
8550
8558
  // Appearanceのオプション適用時は一部描画を隠す
@@ -9836,6 +9844,7 @@ const changeHitFrz = (_j, _k, _name) => {
9836
9844
 
9837
9845
  const styfrzBar = $id(`${_name}Bar${frzNo}`);
9838
9846
  const styfrzBtm = $id(`${_name}Btm${frzNo}`);
9847
+ const styfrzTopShadow = $id(`${_name}TopShadow${frzNo}`);
9839
9848
  const styfrzBtmShadow = $id(`${_name}BtmShadow${frzNo}`);
9840
9849
  const colorPos = g_keyObj[`color${g_keyObj.currentKey}_${g_keyObj.currentPtn}`][_j];
9841
9850
 
@@ -9846,9 +9855,12 @@ const changeHitFrz = (_j, _k, _name) => {
9846
9855
  // 早押ししたboostCnt分のフリーズアロー終端位置の修正
9847
9856
  const delFrzMotionLength = sumData(g_workObj.motionOnFrames.slice(0, currentFrz.boostCnt + 1));
9848
9857
 
9858
+ // 判定位置調整分の補正
9859
+ const hitPos = g_workObj.hitPosition * g_workObj.scrollDir[_j];
9860
+
9849
9861
  currentFrz.frzBarLength -= (delFrzLength + delFrzMotionLength) * currentFrz.dir;
9850
- currentFrz.barY -= (delFrzLength + delFrzMotionLength) * currentFrz.dividePos;
9851
- currentFrz.btmY -= delFrzLength + delFrzMotionLength;
9862
+ currentFrz.barY -= (delFrzLength + delFrzMotionLength) * currentFrz.dividePos + hitPos;
9863
+ currentFrz.btmY -= delFrzLength + delFrzMotionLength + hitPos;
9852
9864
  currentFrz.y += delFrzLength;
9853
9865
  currentFrz.isMoving = false;
9854
9866
 
@@ -9857,6 +9869,7 @@ const changeHitFrz = (_j, _k, _name) => {
9857
9869
  styfrzBar.background = g_workObj[`${_name}HitBarColors`][_j];
9858
9870
  styfrzBtm.top = `${currentFrz.btmY}px`;
9859
9871
  styfrzBtm.background = g_workObj[`${_name}HitColors`][_j];
9872
+ styfrzTopShadow.opacity = 0;
9860
9873
  styfrzBtmShadow.top = styfrzBtm.top;
9861
9874
  if (_name === `frz`) {
9862
9875
  if (g_headerObj.frzShadowColor[colorPos][1] !== ``) {
@@ -9881,10 +9894,16 @@ const changeFailedFrz = (_j, _k) => {
9881
9894
  $id(`frzHit${_j}`).opacity = 0;
9882
9895
  $id(`frzTop${frzNo}`).display = C_DIS_INHERIT;
9883
9896
  $id(`frzTop${frzNo}`).background = `#cccccc`;
9897
+ $id(`frzTopShadow${frzNo}`).opacity = 1;
9884
9898
  $id(`frzBar${frzNo}`).background = `#999999`;
9885
9899
  $id(`frzBar${frzNo}`).opacity = 1;
9886
9900
  $id(`frzBtm${frzNo}`).background = `#cccccc`;
9887
9901
 
9902
+ // 判定位置調整分の補正
9903
+ const hitPos = g_workObj.hitPosition * g_workObj.scrollDir[_j];
9904
+ $id(`frzTop${frzNo}`).top = `${- hitPos}px`;
9905
+ $id(`frzTopShadow${frzNo}`).top = `${- hitPos}px`;
9906
+
9888
9907
  const colorPos = g_keyObj[`color${g_keyObj.currentKey}_${g_keyObj.currentPtn}`][_j];
9889
9908
  if (g_headerObj.frzShadowColor[colorPos][0] !== ``) {
9890
9909
  $id(`frzTopShadow${frzNo}`).background = `#333333`;
@@ -9922,7 +9941,7 @@ const judgeArrow = _j => {
9922
9941
  displayDiff(_difFrame);
9923
9942
 
9924
9943
  const stepDivHit = document.querySelector(`#stepHit${_j}`);
9925
- stepDivHit.style.top = `${currentArrow.prevY - parseFloat($id(`stepRoot${_j}`).top) - 15}px`;
9944
+ stepDivHit.style.top = `${currentArrow.prevY - parseFloat($id(`stepRoot${_j}`).top) - 15 + g_workObj.hitPosition * g_workObj.scrollDir[_j]}px`;
9926
9945
  stepDivHit.style.opacity = 0.75;
9927
9946
  stepDivHit.classList.value = ``;
9928
9947
  stepDivHit.classList.add(g_cssObj[`main_step${resultJdg}`]);